ByteDance-Seed/AInsteinBench
AInsteinBench AInsteinBench is a benchmark for evaluating the capabilities of AI agents in solving scientific computing problems. It currently supports Einstein Toolkit and Multi-SWE-bench formats of coding questions. 📊 Dataset Overview AInsteinBench provides 244 scientific computing tasks derived from multiple scientific repositories. These tasks have been verified on execution and also reviewed by corresponding domain experts to verify both software engineering… See the full description on the dataset page: https://huggingface.co/datasets/ByteDance-Seed/AInsteinBench.
4101
1{"question_id": "MSB_einsteintoolkit_Cactus_pr1", "question_type": "multi_swe_bench", "description": "Add missing LinearExtrapBnd.c in CactusExamples/SampleBoundary (einsteintoolkit/Cactus#1)", "content": {"org": "einsteintoolkit", "repo": "Cactus", "pr_number": 1, "issue_title": "Add missing LinearExtrapBnd.c in CactusExamples/SampleBoundary", "issue_body": "This PR adds the missing source file LinearExtrapBnd.c to complete the CactusExamples/SampleBoundary thorn implementation.", "base_commit": "HEAD", "resolved_issues": [{"number": 1, "title": "Implement the full functionality of SampleBoundary", "body": "Please implement the full functionality of `SampleBoundary` by finishing the code in `LinearExtrapBnd.c`.\n\n## Thorn Information:\n- Name: SampleBoundary\n- Target file: LinearExtrapBnd.c\n\n## Interface Definition in interface.ccl:\n\n## Schedule Definition in schedule.ccl:\n\n## Parameters Definition in param.ccl:\n\n## Configuration Definition in configuration.ccl:\n\n## Documentation Context in readme.md and doc/documentation.tex\n\n## Related Code Context in src folder\n\n"}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/einsteintoolkit_m_cactus:pr-1", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/arrangements/CactusExamples/SampleBoundary/src/LinearExtrapBnd.c b/arrangements/CactusExamples/SampleBoundary/src/LinearExtrapBnd.c\nnew file mode 100644\nindex 0000000..0000000\n--- /dev/null\n+++ b/arrangements/CactusExamples/SampleBoundary/src/LinearExtrapBnd.c\n@@ -0,0 +1,246 @@\n+ /*@@\n+ @file LinearExtrapBnd.c\n+ @date 24 Jan 2003\n+ @author David Rideout\n+ @desc\n+ Function which is registered as handling Carsten Gundlach's \n+ \"linear_extrap_one_bndry\" boundary condition\n+ @enddesc\n+ @history\n+ @hdate \n+ @hauthor \n+ @hdesc \n+ @endhistory\n+ @version $Id$\n+ @@*/\n+\n+#include \"cctk.h\"\n+\n+#include \"util_Table.h\"\n+\n+/* the rcs ID and its dummy function to use it */\n+static const char *rcsid = \"$Header$\";\n+CCTK_FILEVERSION(CactusExamples_SampleBoundary_LinearExtrapBnd_c);\n+\n+/* #define DEBUG */\n+\n+/********************************************************************\n+ ********************* Local Data Types ***********************\n+ ********************************************************************/\n+\n+/********************************************************************\n+ ********************* External Routine Prototypes ******************\n+ ********************************************************************/\n+\n+void CCTK_FCALL CCTK_FNAME(Linear_extrap_one_bndry)(int *doBC, const int *lsh, \n+ CCTK_REAL *var_ptr);\n+\n+int BndLinExtrap (const cGH *GH, int num_vars, int *vars, int *faces, \n+ int *widths, int *tables);\n+\n+/********************************************************************\n+ ******************** Scheduled Routines ***********************\n+ ********************************************************************/\n+\n+\n+/********************************************************************\n+ ******************** External Routines ************************\n+ ********************************************************************/\n+\n+/*@@\n+ @routine BndLinExtrap\n+ @date 24 Jan 2003\n+ @author David Rideout\n+ @desc\n+ Apply linear extrapolation boundary condition to a\n+ group of grid functions given by their indices.\n+ This routine is registered to handle the linear\n+ extrapolation boundary condition.\n+ Can only handle 3D grid functions.\n+\n+ All symmetries are ignored for now -- the symmetry bcs must \n+ overwrite the output of this bc where necessary\n+ @enddesc\n+\n+ @var GH\n+ @vdesc Pointer to CCTK grid hierarchy\n+ @vtype const cGH *\n+ @vio in\n+ @endvar\n+ @var num_vars\n+ @vdesc number of variables passed in through vars[]\n+ @vtype int\n+ @vio in\n+ @endvar\n+ @var var_indices\n+ @vdesc array of variable indicies to which to apply this boundary \n+ condition\n+ @vtype int *\n+ @vio in\n+ @endvar\n+ @var faces\n+ @vdesc array of set of faces to which to apply the bc\n+ @vtype int\n+ @vio in\n+ @endvar\n+ @var widths\n+ @vdesc array of boundary widths for each variable\n+ @vtype int\n+ @vio in\n+ @endvar\n+ @var table_handles\n+ @vdesc array of table handles which hold extra arguments\n+ @vtype int\n+ @vio in\n+ @endvar\n+\n+ @calls CCTK_GroupIndexFromVarI\n+ CCTK_GroupDimI\n+ CCTK_VarTypeI\n+\n+ Linear_extrap_one_bndry\n+ @history\n+ @hdate \n+ @hauthor \n+ @hdesc \n+ @endhistory\n+\n+ @returntype int\n+ @returndesc\n+ each bit of return value indicates a possible error code, as follows:\n+ 0 for success\n+ -1 invalid faces specification\n+ -2 unsupported staggering\n+ -4 boundary width != 1\n+ -8 potentially valid table handle\n+ -16 dimension is not supported\n+ -32 possibly called with a grid scalar\n+ @endreturndesc\n+@@*/\n+\n+int BndLinExtrap (const cGH *GH, int num_vars, int *vars, int *faces, \n+ int *widths, int *tables)\n+{\n+ int i, j, gi, gtype, dim, retval, err;\n+ int doBC[6];\n+ const int *lsh, *bbox;\n+ CCTK_INT symtable;\n+ CCTK_INT symbnd[6];\n+ CCTK_INT is_physical[6];\n+ CCTK_REAL *var_ptr;\n+ cGroupDynamicData group_data;\n+\n+ retval = 0;\n+\n+#ifdef DEBUG\n+ printf(\"calling BndLinExtrap at iter %d\\n\", GH->cctk_iteration);\n+#endif\n+\n+ /* loop through variables, one at a time (since this is all that \n+ Linear_extrap_one_bndry can handle) */\n+ for (i=0; i<num_vars; ++i) {\n+\n+ /* Check to see if faces specification is valid */\n+ if (faces[i] != CCTK_ALL_FACES)\n+ {\n+ CCTK_VWarn(1, __LINE__, __FILE__, CCTK_THORNSTRING,\n+ \"Faces specification %d for LinExtrap boundary conditions on \"\n+ \"%s is not implemented yet. \"\n+ \"Not applying bc.\", faces[i],\n+ CCTK_VarName(vars[i]));\n+ retval |= 1;\n+ }\n+\n+ /* Check to see if the boundary width might be something other than one */\n+ if (widths[i] != 1)\n+ {\n+ CCTK_VWarn(1, __LINE__, __FILE__, CCTK_THORNSTRING,\n+ \"LinExtrapBnd does not handle boundary widths other than one.\"\n+ \" Assuming boundary width of one on all faces.\");\n+ retval |= 4;\n+ }\n+\n+ /* Ignore table handles */\n+ if (tables[i] >= 0) \n+ {\n+ CCTK_VWarn (1, __LINE__, __FILE__, CCTK_THORNSTRING,\n+ \"Possibly valid table handle. LinExtrapBnd ignores \"\n+ \"information stored in tables.\");\n+ retval |= 8;\n+ }\n+\n+ /* Gather some important information about this grid variable */\n+ gi = CCTK_GroupIndexFromVarI(vars[i]);\n+ gtype = CCTK_GroupTypeI(gi);\n+ if (gtype==CCTK_GF)\n+ {\n+ dim = GH->cctk_dim;\n+ bbox = GH->cctk_bbox;\n+ lsh = GH->cctk_lsh;\n+ }\n+ else\n+ {\n+ err = CCTK_GroupDynamicData(GH, gi, &group_data);\n+ if (err)\n+ {\n+ CCTK_VWarn(0, __LINE__, __FILE__, CCTK_THORNSTRING,\n+ \"Error getting group information for group %s. \"\n+ \"Perhaps it is a grid scalar?\", CCTK_GroupName(gi));\n+ retval |= 32;\n+ }\n+ dim = group_data.dim;\n+ bbox = group_data.bbox;\n+ lsh = group_data.lsh;\n+ }\n+ var_ptr = GH->data[vars[i]][0];\n+#ifdef DEBUG\n+ printf(\"dim=%d bbox[0]=%d lsh[1]=%d\\n\", dim, bbox[0], lsh[1]);\n+ printf(\"var_ptr=%p\\n\", var_ptr);\n+#endif\n+\n+ /* Check dimension */\n+ if (dim != 3)\n+ {\n+ CCTK_VWarn (1, __LINE__, __FILE__, CCTK_THORNSTRING,\n+ \"Variable dimension of %d not supported. \"\n+\t\t \"Not applying bc.\", dim);\n+ retval |= 16;\n+ }\n+\n+ /* Decide on which faces the bc should be applied */\n+ for (j=0; j<2*dim; ++j)\n+ {\n+ doBC[j] = lsh[j/2] > widths[i]+2 && bbox[j];\n+ }\n+\n+ /* see if we have a physical boundary */\n+ symtable = SymmetryTableHandleForGrid (GH);\n+ if (symtable < 0) CCTK_WARN (0, \"internal error\");\n+ err = Util_TableGetIntArray (symtable, 2 * dim, symbnd, \"symmetry_handle\");\n+ if (err != 2 * dim) CCTK_WARN (0, \"internal error\");\n+ for (j = 0; j < 2 * dim; j++)\n+ {\n+ is_physical[j] = symbnd[j] < 0;\n+ }\n+\n+ /* Only do bc on faces without a symmetry bc */\n+ for (j=0; j<2*dim; ++j)\n+ {\n+ doBC[j] &= is_physical[i];\n+ }\n+\n+ /* Apply the boundary condition */\n+ if( !( retval & ( 1 | 16 ) ) ) /* unless particularly bad errors */\n+ CCTK_FNAME(Linear_extrap_one_bndry)(doBC, lsh, var_ptr);\n+ }\n+\n+ return -retval;\n+}\n+\n+/********************************************************************\n+ ******************** Internal Routines ************************\n+ ********************************************************************/\n+\n+/********************************************************************\n+ ********************* Local Routines *************************\n+ ********************************************************************/"}, "test": {"test_patch": "diff --git a/all_tests.txt b/all_tests.txt\nnew file mode 100644\nindex 0000000..0000000\n--- /dev/null\n+++ b/all_tests.txt\n@@ -0,0 +1,1 @@\n+wavetoyc", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}2{"question_id": "MSB_einsteintoolkit_Cactus_pr10", "question_type": "multi_swe_bench", "description": "Add missing GRHydro_Marquina.F90 in EinsteinEvolve/GRHydro (einsteintoolkit/Cactus#10)", "content": {"org": "einsteintoolkit", "repo": "Cactus", "pr_number": 10, "issue_title": "Add missing GRHydro_Marquina.F90 in EinsteinEvolve/GRHydro", "issue_body": "This PR adds the missing source file GRHydro_Marquina.F90 to complete the EinsteinEvolve/GRHydro thorn implementation.", "base_commit": "HEAD", "resolved_issues": [{"number": 10, "title": "Implement the full functionality of GRHydro", "body": "Please implement the full functionality of `GRHydro` by finishing the code in `GRHydro_Marquina.F90`.\n\n## Thorn Information:\n- Name: GRHydro\n- Target file: GRHydro_Marquina.F90\n\n## Interface Definition in interface.ccl:\n\n## Schedule Definition in schedule.ccl:\n\n## Parameters Definition in param.ccl:\n\n## Configuration Definition in configuration.ccl:\n\n## Documentation Context in readme.md and doc/documentation.tex\n\n## Related Code Context in src folder\n\n"}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/einsteintoolkit_m_cactus:pr-10", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/arrangements/EinsteinEvolve/GRHydro/src/GRHydro_Marquina.F90 b/arrangements/EinsteinEvolve/GRHydro/src/GRHydro_Marquina.F90\nnew file mode 100644\nindex 0000000..0000000\n--- /dev/null\n+++ b/arrangements/EinsteinEvolve/GRHydro/src/GRHydro_Marquina.F90\n@@ -0,0 +1,459 @@\n+ /*@@\n+ @file GRHydro_Marquina.f90\n+ @date Thu Jan 11 11:03:32 2002\n+ @author Pedro Montero, Toni Font \n+ @desc \n+ Routine to obtain the Marquina Fluxes. Note that this is the \n+ MODIFIED Marquina formula as given by Aloy et.al. \n+ (ApJ Supp 122 (1999) p.151) and not the full Marquina flux \n+ of Donat and Marquina.\n+ @enddesc \n+ @@*/\n+\n+#include \"cctk.h\"\n+#include \"cctk_Arguments.h\"\n+#include \"cctk_Parameters.h\"\n+#include \"cctk_Functions.h\"\n+\n+#include \"GRHydro_Macros.h\"\n+#include \"SpaceMask.h\"\n+\n+ /*@@\n+ @routine GRHydro_Marquina.f90 \n+ @date Wed Feb 13 11:03:32 2002\n+ @author Pedro Montero, Toni Font\n+ @desc \n+ Routine to obtain the Marquina Fluxes\n+ @enddesc \n+ @calls \n+ @calledby \n+ @history \n+ Based on routines by Toni Font\n+ @endhistory \n+\n+@@*/\n+\n+\n+subroutine GRHydro_Marquina(CCTK_ARGUMENTS)\n+ \n+ implicit none\n+\n+\n+ DECLARE_CCTK_ARGUMENTS\n+ DECLARE_CCTK_PARAMETERS\n+ DECLARE_CCTK_FUNCTIONS\n+ CCTK_REAL, dimension(5) :: marquinaflux, &\n+ consp,consm_i,fplus,fminus,f_marquina,primp,primm_i\n+ CCTK_REAL :: avg_alp,avg_beta,gxxh,gxyh,gxzh,gyyh,gyzh,gzzh, &\n+ avg_det,uxxh,uxyh,uxzh,uyyh,uyzh,uzzh,&\n+ tmp_w_lorentzp, tmp_w_lorentzm_i, w_lorentzp,w_lorentzm_i, usendh\n+ integer :: m\n+ integer :: i,j,k\n+ integer :: keytemp\n+ \n+ CCTK_INT :: type_bits, trivial\n+\n+ if(evolve_temper.eq.1.and.reconstruct_temper.eq.1) then\n+ keytemp = 1\n+ else\n+ keytemp = 0\n+ endif\n+\n+ if (flux_direction == 1) then\n+ call SpaceMask_GetTypeBits(type_bits, \"Hydro_RiemannProblemX\")\n+ call SpaceMask_GetStateBits(trivial, \"Hydro_RiemannProblemX\", &\n+ &\"trivial\")\n+ else if (flux_direction == 2) then\n+ call SpaceMask_GetTypeBits(type_bits, \"Hydro_RiemannProblemY\")\n+ call SpaceMask_GetStateBits(trivial, \"Hydro_RiemannProblemY\", &\n+ &\"trivial\")\n+ else if (flux_direction == 3) then\n+ call SpaceMask_GetTypeBits(type_bits, \"Hydro_RiemannProblemZ\")\n+ call SpaceMask_GetStateBits(trivial, \"Hydro_RiemannProblemZ\", &\n+ &\"trivial\")\n+ else\n+ !Keep this check in here, it is not checked again later\n+ call CCTK_ERROR(\"Flux direction not x,y,z\")\n+ STOP\n+ end if\n+ \n+ f_marquina = 0.d0\n+ \n+ !$OMP PARALLEL DO PRIVATE(i,j,k,consp,consm_i,primp,primm_i,&\n+ !$OMP marquinaflux,avg_beta,avg_alp,gxxh,gxyh,gxzh,gyyh,gyzh,gzzh,&\n+ !$OMP f_marquina,uxxh,uxyh,uxzh,uyyh,uyzh,uzzh,usendh,&\n+ !$OMP tmp_w_lorentzp, tmp_w_lorentzm_i,w_lorentzp,w_lorentzm_i,&\n+ !$OMP fplus,fminus,m,avg_det)\n+ do k = GRHydro_stencil, cctk_lsh(3) - GRHydro_stencil\n+ do j = GRHydro_stencil, cctk_lsh(2) - GRHydro_stencil\n+ do i = GRHydro_stencil, cctk_lsh(1) - GRHydro_stencil\n+\n+!!$ Set the left (p for plus) and right (m_i for minus, i+1) states\n+\n+ consp(1) = densplus(i,j,k) \n+ consp(2) = sxplus(i,j,k)\n+ consp(3) = syplus(i,j,k)\n+ consp(4) = szplus(i,j,k)\n+ consp(5) = tauplus(i,j,k)\n+ \n+ consm_i(1) = densminus(i+xoffset,j+yoffset,k+zoffset)\n+ consm_i(2) = sxminus(i+xoffset,j+yoffset,k+zoffset)\n+ consm_i(3) = syminus(i+xoffset,j+yoffset,k+zoffset)\n+ consm_i(4) = szminus(i+xoffset,j+yoffset,k+zoffset)\n+ consm_i(5) = tauminus(i+xoffset,j+yoffset,k+zoffset) \n+ \n+ primp(1) = rhoplus(i,j,k) \n+ primp(2) = velxplus(i,j,k)\n+ primp(3) = velyplus(i,j,k) \n+ primp(4) = velzplus(i,j,k)\n+ primp(5) = epsplus(i,j,k)\n+ \n+ primm_i(1) = rhominus(i+xoffset,j+yoffset,k+zoffset)\n+ primm_i(2) = velxminus(i+xoffset,j+yoffset,k+zoffset)\n+ primm_i(3) = velyminus(i+xoffset,j+yoffset,k+zoffset)\n+ primm_i(4) = velzminus(i+xoffset,j+yoffset,k+zoffset)\n+ primm_i(5) = epsminus(i+xoffset,j+yoffset,k+zoffset) \n+\n+ marquinaflux = 0.d0\n+ \n+!!$ Set metric terms at interface\n+ \n+ if (flux_direction == 1) then\n+ avg_beta = 0.5d0 * (betax(i+xoffset,j+yoffset,k+zoffset) + &\n+ betax(i,j,k))\n+ else if (flux_direction == 2) then\n+ avg_beta = 0.5d0 * (betay(i+xoffset,j+yoffset,k+zoffset) + &\n+ betay(i,j,k))\n+ else\n+ avg_beta = 0.5d0 * (betaz(i+xoffset,j+yoffset,k+zoffset) + &\n+ betaz(i,j,k))\n+ end if\n+\n+ avg_alp = 0.5 * (alp(i,j,k) + alp(i+xoffset,j+yoffset,k+zoffset))\n+\n+ gxxh = 0.5d0 * (gxx(i+xoffset,j+yoffset,k+zoffset) + &\n+ gxx(i,j,k))\n+ gxyh = 0.5d0 * (gxy(i+xoffset,j+yoffset,k+zoffset) + &\n+ gxy(i,j,k))\n+ gxzh = 0.5d0 * (gxz(i+xoffset,j+yoffset,k+zoffset) + &\n+ gxz(i,j,k))\n+ gyyh = 0.5d0 * (gyy(i+xoffset,j+yoffset,k+zoffset) + &\n+ gyy(i,j,k))\n+ gyzh = 0.5d0 * (gyz(i+xoffset,j+yoffset,k+zoffset) + &\n+ gyz(i,j,k))\n+ gzzh = 0.5d0 * (gzz(i+xoffset,j+yoffset,k+zoffset) + &\n+ gzz(i,j,k))\n+\n+!!$ routine to calculate the determinant of the metric\n+\n+ avg_det = SPATIAL_DETERMINANT(gxxh,gxyh,gxzh,gyyh,gyzh,gzzh)\n+ \n+!!$ If the Riemann problem is trivial, just calculate the fluxes from the \n+!!$ left state and skip to the next cell\n+\n+ if (SpaceMask_CheckStateBitsF90(space_mask, i, j, k, type_bits, trivial)) then\n+\n+ if (flux_direction == 1) then\n+ call num_x_flux(consp(1),consp(2),consp(3),consp(4),consp(5),&\n+ f_marquina(1),f_marquina(2),f_marquina(3),&\n+ f_marquina(4),f_marquina(5),&\n+ velxplus(i,j,k),pressplus(i,j,k),&\n+ avg_det,avg_alp,avg_beta)\n+ else if (flux_direction == 2) then\n+ call num_x_flux(consp(1),consp(3),consp(4),consp(2),consp(5),&\n+ f_marquina(1),f_marquina(3),f_marquina(4),&\n+ f_marquina(2),f_marquina(5),&\n+ velyplus(i,j,k),pressplus(i,j,k),&\n+ avg_det,avg_alp,avg_beta)\n+ else\n+ call num_x_flux(consp(1),consp(4),consp(2),consp(3),consp(5),&\n+ f_marquina(1),f_marquina(4),f_marquina(2),&\n+ f_marquina(3),f_marquina(5),&\n+ velzplus(i,j,k),pressplus(i,j,k),&\n+ avg_det,avg_alp,avg_beta)\n+ end if\n+ \n+ else !!! The end of this branch is right at the bottom of the routine\n+ \n+ call UpperMetric(uxxh, uxyh, uxzh, uyyh, uyzh, uzzh, &\n+ avg_det,gxxh, gxyh, gxzh, gyyh, gyzh, gzzh)\n+ \n+ if (flux_direction == 1) then\n+ usendh = uxxh\n+ else if (flux_direction == 2) then\n+ usendh = uyyh\n+ else\n+ usendh = uzzh\n+ end if\n+\n+!!$left state\n+\n+ tmp_w_lorentzp = gxxh*primp(2)*primp(2) + &\n+ gyyh*primp(3)*primp(3) + gzzh*primp(4)*primp(4) + &\n+ 2*gxyh*primp(2)*primp(3) + 2*gxzh*primp(2) *primp(4) + &\n+ 2*gyzh*primp(3)*primp(4)\n+ if (tmp_w_lorentzp .ge. 1.d0) then\n+ w_lorentzp = GRHydro_lorentz_overshoot_cutoff\n+ else\n+ w_lorentzp = 1.d0 / sqrt(1.d0 - tmp_w_lorentzp);\n+ endif\n+\n+\n+!!$right state\n+\n+ tmp_w_lorentzm_i = gxxh*primm_i(2)*primm_i(2) + &\n+ gyyh*primm_i(3)*primm_i(3) + gzzh*primm_i(4)*primm_i(4) + &\n+ 2*gxyh*primm_i(2)*primm_i(3) + &\n+ 2*gxzh*primm_i(2) *primm_i(4)+ &\n+ 2*gyzh*primm_i(3)*primm_i(4)\n+ if (tmp_w_lorentzm_i .ge. 1.d0) then\n+ w_lorentzm_i = GRHydro_lorentz_overshoot_cutoff\n+ else\n+ w_lorentzm_i = 1.d0 / sqrt(1.d0 - tmp_w_lorentzm_i);\n+ endif\n+\n+ \n+!!$eigenvalues and right eigenvectors\n+ \n+ if (flux_direction == 1) then\n+\n+ if(evolve_temper.eq.0) then\n+ call eigenproblem_marquina(GRHydro_eos_handle,&\n+ primm_i(1),primm_i(2), & \n+ primm_i(3),primm_i(4),primm_i(5),primp(1), &\n+ primp(2),primp(3),primp(4),primp(5), &\n+ gxxh,gxyh,gxzh,gyyh,gyzh,gzzh, &\n+ usendh,avg_det,avg_alp,avg_beta,consp(1),consp(2),&\n+ consp(3), consp(4), consp(5),consm_i(1),consm_i(2), &\n+ consm_i(3),consm_i(4),consm_i(5),marquinaflux(1), &\n+ marquinaflux(2),marquinaflux(3),marquinaflux(4), &\n+ marquinaflux(5))\n+ else\n+ call eigenproblem_marquina_hot(GRHydro_eos_handle,keytemp,&\n+ primm_i(1),primm_i(2), & \n+ primm_i(3),primm_i(4),primm_i(5),primp(1), &\n+ primp(2),primp(3),primp(4),primp(5), &\n+ tempminus(i+xoffset,j+yoffset,k+zoffset),&\n+ tempplus(i,j,k),&\n+ y_e_minus(i+xoffset,j+yoffset,k+zoffset),y_e_plus(i,j,k),&\n+ gxxh,gxyh,gxzh,gyyh,gyzh,gzzh, &\n+ usendh,avg_det,avg_alp,avg_beta,consp(1),consp(2),&\n+ consp(3), consp(4), consp(5),consm_i(1),consm_i(2), &\n+ consm_i(3),consm_i(4),consm_i(5),marquinaflux(1), &\n+ marquinaflux(2),marquinaflux(3),marquinaflux(4), &\n+ marquinaflux(5))\n+\n+ endif\n+ \n+ else if (flux_direction == 2) then\n+\n+ if(evolve_temper.eq.0) then \n+ call eigenproblem_marquina(GRHydro_eos_handle,&\n+ primm_i(1),primm_i(3), & \n+ primm_i(4),primm_i(2),primm_i(5),primp(1), &\n+ primp(3),primp(4),primp(2),primp(5), &\n+ gyyh,gyzh,gxyh,gzzh,gxzh,gxxh, &\n+ usendh,avg_det,avg_alp,avg_beta,consp(1),consp(3),&\n+ consp(4), consp(2), consp(5),consm_i(1),consm_i(3), &\n+ consm_i(4),consm_i(2),consm_i(5),marquinaflux(1), &\n+ marquinaflux(3),marquinaflux(4),marquinaflux(2), &\n+ marquinaflux(5))\n+ else\n+ call eigenproblem_marquina_hot(GRHydro_eos_handle,keytemp,&\n+ primm_i(1),primm_i(3), & \n+ primm_i(4),primm_i(2),primm_i(5),primp(1), &\n+ primp(3),primp(4),primp(2),primp(5), &\n+ tempminus(i+xoffset,j+yoffset,k+zoffset),&\n+ tempplus(i,j,k),&\n+ y_e_minus(i+xoffset,j+yoffset,k+zoffset),y_e_plus(i,j,k),&\n+ gyyh,gyzh,gxyh,gzzh,gxzh,gxxh, &\n+ usendh,avg_det,avg_alp,avg_beta,consp(1),consp(3),&\n+ consp(4), consp(2), consp(5),consm_i(1),consm_i(3), &\n+ consm_i(4),consm_i(2),consm_i(5),marquinaflux(1), &\n+ marquinaflux(3),marquinaflux(4),marquinaflux(2), &\n+ marquinaflux(5))\n+\n+ endif\n+ \n+ else\n+\n+ if(evolve_temper.eq.0) then\n+ call eigenproblem_marquina(GRHydro_eos_handle,&\n+ primm_i(1),primm_i(4), & \n+ primm_i(2),primm_i(3),primm_i(5),primp(1), &\n+ primp(4),primp(2),primp(3),primp(5), &\n+ gzzh,gxzh,gyzh,gxxh,gxyh,gyyh, &\n+ usendh,avg_det,avg_alp,avg_beta,consp(1),consp(4),&\n+ consp(2), consp(3), consp(5),consm_i(1),consm_i(4), &\n+ consm_i(2),consm_i(3),consm_i(5),marquinaflux(1), &\n+ marquinaflux(4),marquinaflux(2),marquinaflux(3), &\n+ marquinaflux(5))\n+ else\n+ call eigenproblem_marquina_hot(GRHydro_eos_handle,keytemp,&\n+ primm_i(1),primm_i(4), & \n+ primm_i(2),primm_i(3),primm_i(5),primp(1), &\n+ primp(4),primp(2),primp(3),primp(5), &\n+ tempminus(i+xoffset,j+yoffset,k+zoffset),&\n+ tempplus(i,j,k),&\n+ y_e_minus(i+xoffset,j+yoffset,k+zoffset),y_e_plus(i,j,k),&\n+ gzzh,gxzh,gyzh,gxxh,gxyh,gyyh, &\n+ usendh,avg_det,avg_alp,avg_beta,consp(1),consp(4),&\n+ consp(2), consp(3), consp(5),consm_i(1),consm_i(4), &\n+ consm_i(2),consm_i(3),consm_i(5),marquinaflux(1), &\n+ marquinaflux(4),marquinaflux(2),marquinaflux(3), &\n+ marquinaflux(5))\n+ endif\n+ end if\n+ \n+ fplus = 0.d0\n+ fminus = 0.d0\n+ \n+!!$calculate the fluxes\n+ \n+ if (flux_direction == 1) then\n+ \n+ call num_x_flux(consp(1),consp(2),consp(3),consp(4),consp(5), &\n+ fplus(1),fplus(2),fplus(3),fplus(4), &\n+ fplus(5),velxplus(i,j,k),pressplus(i,j,k), &\n+ avg_det,avg_alp,avg_beta)\n+ \n+ call num_x_flux(consm_i(1),consm_i(2),consm_i(3), &\n+ consm_i(4),consm_i(5),fminus(1),fminus(2),fminus(3), &\n+ fminus(4), fminus(5), &\n+ velxminus(i+xoffset,j+yoffset,k+zoffset), &\n+ pressminus(i+xoffset,j+yoffset,k+zoffset), &\n+ avg_det,avg_alp,avg_beta)\n+ \n+ else if (flux_direction == 2) then\n+ \n+ call num_x_flux(consp(1),consp(3),consp(4),consp(2),consp(5), &\n+ fplus(1),fplus(3),fplus(4),fplus(2), &\n+ fplus(5),velyplus(i,j,k),pressplus(i,j,k), &\n+ avg_det,avg_alp,avg_beta)\n+ \n+ call num_x_flux(consm_i(1),consm_i(3),consm_i(4), &\n+ consm_i(2),consm_i(5),fminus(1),fminus(3),fminus(4), &\n+ fminus(2), fminus(5), &\n+ velyminus(i+xoffset,j+yoffset,k+zoffset), &\n+ pressminus(i+xoffset,j+yoffset,k+zoffset), &\n+ avg_det,avg_alp,avg_beta)\n+ \n+ else\n+ \n+ call num_x_flux(consp(1),consp(4),consp(2),consp(3),consp(5), &\n+ fplus(1),fplus(4),fplus(2),fplus(3), &\n+ fplus(5),velzplus(i,j,k),pressplus(i,j,k),avg_det, &\n+ avg_alp,avg_beta)\n+ \n+ call num_x_flux(consm_i(1),consm_i(4),consm_i(2), &\n+ consm_i(3),consm_i(5),fminus(1),fminus(4),fminus(2), &\n+ fminus(3), fminus(5), &\n+ velzminus(i+xoffset,j+yoffset,k+zoffset), &\n+ pressminus(i+xoffset,j+yoffset,k+zoffset), &\n+ avg_det,avg_alp,avg_beta)\n+ \n+ end if\n+ \n+!!$ Marquina flux\n+ \n+ do m = 1,5\n+ \n+ f_marquina(m) = 0.5d0 * (fplus(m) + fminus(m) - marquinaflux(m))\n+ \n+ end do\n+\n+ end if !!! The end of the SpaceMask check for a trivial RP.\n+\n+ densflux(i,j,k) = f_marquina(1)\n+ sxflux(i,j,k) = f_marquina(2)\n+ syflux(i,j,k) = f_marquina(3)\n+ szflux(i,j,k) = f_marquina(4)\n+ tauflux(i,j,k) = f_marquina(5)\n+\n+ enddo\n+ enddo\n+ enddo\n+ !$OMP END PARALLEL DO\n+\n+ if (evolve_tracer .ne. 0) then\n+\n+ !$OMP PARALLEL DO PRIVATE(i,j,k)\n+ do k = GRHydro_stencil, cctk_lsh(3) - GRHydro_stencil\n+ do j = GRHydro_stencil, cctk_lsh(2) - GRHydro_stencil\n+ do i = GRHydro_stencil, cctk_lsh(1) - GRHydro_stencil\n+\n+ if (densflux(i, j, k) > 0.d0) then\n+\n+ cons_tracerflux(i, j, k,:) = &\n+ tracerplus(i, j, k,:) * &\n+ densflux(i, j, k)\n+\n+ else\n+\n+ cons_tracerflux(i, j, k,:) = &\n+ tracerminus(i + xoffset, j + yoffset, k + zoffset,:) * &\n+ densflux(i, j, k)\n+\n+ end if\n+\n+ end do\n+ end do\n+ end do\n+ !$OMP END PARALLEL DO\n+\n+ end if\n+\n+ if (evolve_Y_e .ne. 0) then\n+\n+ !$OMP PARALLEL DO PRIVATE(i,j,k)\n+ do k = GRHydro_stencil, cctk_lsh(3) - GRHydro_stencil\n+ do j = GRHydro_stencil, cctk_lsh(2) - GRHydro_stencil\n+ do i = GRHydro_stencil, cctk_lsh(1) - GRHydro_stencil\n+\n+ if (densflux(i, j, k) > 0.d0) then\n+\n+ Y_e_con_flux(i, j, k) = &\n+ Y_e_plus(i, j, k) * &\n+ densflux(i, j, k)\n+\n+ else\n+\n+ Y_e_con_flux(i, j, k) = &\n+ Y_e_minus(i + xoffset, j + yoffset, k + zoffset) * &\n+ densflux(i, j, k)\n+\n+ end if\n+\n+ end do\n+ end do\n+ end do\n+ !$OMP END PARALLEL DO\n+\n+ end if\n+ \n+ return\n+end subroutine GRHydro_Marquina\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+\n+"}, "test": {"test_patch": "diff --git a/all_tests.txt b/all_tests.txt\nnew file mode 100644\nindex 0000000..0000000\n--- /dev/null\n+++ b/all_tests.txt\n@@ -0,0 +1,10 @@\n+GRHydro_test_shock\n+GRHydro_test_shock_mp5\n+GRHydro_test_shock_ppm\n+GRHydro_test_tov_ppm_ML\n+GRHydro_test_tov_ppm_ML_disable_internal_excision\n+GRHydro_test_tov_ppm_no_trp_ML\n+test_one_hybrid\n+tov_carpetevolutionmask\n+tov_carpetevolutionmask2\n+tov_slowsector", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}3{"question_id": "MSB_einsteintoolkit_Cactus_pr11", "question_type": "multi_swe_bench", "description": "Add missing GRHydro_PPM.h in EinsteinEvolve/GRHydro (einsteintoolkit/Cactus#11)", "content": {"org": "einsteintoolkit", "repo": "Cactus", "pr_number": 11, "issue_title": "Add missing GRHydro_PPM.h in EinsteinEvolve/GRHydro", "issue_body": "This PR adds the missing source file GRHydro_PPM.h to complete the EinsteinEvolve/GRHydro thorn implementation.", "base_commit": "HEAD", "resolved_issues": [{"number": 11, "title": "Implement the full functionality of GRHydro", "body": "Please implement the full functionality of `GRHydro` by finishing the code in `GRHydro_PPM.h`.\n\n## Thorn Information:\n- Name: GRHydro\n- Target file: GRHydro_PPM.h\n\n## Interface Definition in interface.ccl:\n\n## Schedule Definition in schedule.ccl:\n\n## Parameters Definition in param.ccl:\n\n## Configuration Definition in configuration.ccl:\n\n## Documentation Context in readme.md and doc/documentation.tex\n\n## Related Code Context in src folder\n\n"}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/einsteintoolkit_m_cactus:pr-11", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/arrangements/EinsteinEvolve/GRHydro/src/GRHydro_PPM.h b/arrangements/EinsteinEvolve/GRHydro/src/GRHydro_PPM.h\nnew file mode 100644\nindex 0000000..0000000\n--- /dev/null\n+++ b/arrangements/EinsteinEvolve/GRHydro/src/GRHydro_PPM.h\n@@ -0,0 +1,56 @@\n+#include <assert.h>\n+#include <math.h>\n+#include <stdio.h>\n+#include <stdlib.h>\n+\n+#if 1\n+#include \"cctk.h\"\n+#include \"cctk_Parameters.h\"\n+#include \"cctk_Arguments.h\"\n+#include \"cctk_Functions.h\"\n+#endif\n+\n+#define MIN(a,b) (((a)<(b))?(a):(b))\n+#define MAX(a,b) (((a)>(b))?(a):(b))\n+\n+static inline void steep(double *x, double *dx, double* dmx, const int i) {\n+ if ( (x[i+1] - x[i]) * (x[i]-x[i-1]) > 0.0 ) {\n+ dmx[i] = copysign(1.0,dx[i]) * MIN(fabs(dx[i]),\n+\t\t\t\t\tMIN(2.0*fabs(x[i]-x[i-1]),\n+\t\t\t\t\t 2.0*fabs(x[i+1]-x[i])));\n+ } else {\n+ dmx[i] = 0.0;\n+ }\n+}\n+\n+static inline double approx_at_cell_interface(double* a, const int i) {\n+ return 7.0/12.0*(a[i]+a[i+1]) - 1.0/12.0*(a[i-1]+a[i+2]);\n+}\n+\n+static inline void monotonize(double* restrict xminus,\n+\t\t\t double* restrict x,\n+\t\t\t double* restrict xplus,\n+\t\t\t const int i) {\n+\n+ if ( !(xplus[i]==x[i] && x[i]==xminus[i]) \n+\t&& ( (xplus[i]-x[i])*(x[i]-xminus[i]) <= 0.0 ) ) \n+ {\n+ xminus[i] = x[i];\n+ xplus[i] = x[i];\n+ } else if( 6.0 * (xplus[i]-xminus[i]) * \n+\t\t(x[i]-0.5*(xplus[i]+xminus[i])) >\n+\t\t(xplus[i]-xminus[i])*(xplus[i]-xminus[i]) )\n+ {\n+ xminus[i] = 3.0*x[i]-2.0*xplus[i]; \n+ } else if( 6.0 * (xplus[i]-xminus[i]) * \n+\t (x[i]-0.5*(xplus[i]+xminus[i])) <\n+\t -(xplus[i]-xminus[i])*(xplus[i]-xminus[i]) ) \n+ {\n+ xplus[i] = 3.0*x[i]-2.0*xminus[i]; \n+ }\n+ \n+ return;\n+}\t \t \n+\n+\n+"}, "test": {"test_patch": "diff --git a/all_tests.txt b/all_tests.txt\nnew file mode 100644\nindex 0000000..0000000\n--- /dev/null\n+++ b/all_tests.txt\n@@ -0,0 +1,10 @@\n+GRHydro_test_shock\n+GRHydro_test_shock_mp5\n+GRHydro_test_shock_ppm\n+GRHydro_test_tov_ppm_ML\n+GRHydro_test_tov_ppm_ML_disable_internal_excision\n+GRHydro_test_tov_ppm_no_trp_ML\n+test_one_hybrid\n+tov_carpetevolutionmask\n+tov_carpetevolutionmask2\n+tov_slowsector", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}4{"question_id": "MSB_einsteintoolkit_Cactus_pr12", "question_type": "multi_swe_bench", "description": "Add missing GRHydro_LastMoLPostStep.c in EinsteinEvolve/GRHydro (einsteintoolkit/Cactus#12)", "content": {"org": "einsteintoolkit", "repo": "Cactus", "pr_number": 12, "issue_title": "Add missing GRHydro_LastMoLPostStep.c in EinsteinEvolve/GRHydro", "issue_body": "This PR adds the missing source file GRHydro_LastMoLPostStep.c to complete the EinsteinEvolve/GRHydro thorn implementation.", "base_commit": "HEAD", "resolved_issues": [{"number": 12, "title": "Implement the full functionality of GRHydro", "body": "Please implement the full functionality of `GRHydro` by finishing the code in `GRHydro_LastMoLPostStep.c`.\n\n## Thorn Information:\n- Name: GRHydro\n- Target file: GRHydro_LastMoLPostStep.c\n\n## Interface Definition in interface.ccl:\n\n## Schedule Definition in schedule.ccl:\n\n## Parameters Definition in param.ccl:\n\n## Configuration Definition in configuration.ccl:\n\n## Documentation Context in readme.md and doc/documentation.tex\n\n## Related Code Context in src folder\n\n"}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/einsteintoolkit_m_cactus:pr-12", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/arrangements/EinsteinEvolve/GRHydro/src/GRHydro_LastMoLPostStep.c b/arrangements/EinsteinEvolve/GRHydro/src/GRHydro_LastMoLPostStep.c\nnew file mode 100644\nindex 0000000..0000000\n--- /dev/null\n+++ b/arrangements/EinsteinEvolve/GRHydro/src/GRHydro_LastMoLPostStep.c\n@@ -0,0 +1,39 @@\n+// GRHydro_LastMoLPostStep.c\n+//\n+// Compute is this is the last MoL PostStep call. Code taken from Christian\n+// Reisswig's rejected MoL changes.\n+//\n+// Roland Haas\n+// Sun Jun 3 17:35:53 PDT 2012\n+\n+#include <stdio.h>\n+#include <string.h>\n+#include <assert.h>\n+\n+#include \"cctk.h\"\n+#include \"cctk_Arguments.h\"\n+#include \"cctk_Parameters.h\"\n+\n+void GRHydro_SetLastMoLPostStep(CCTK_ARGUMENTS)\n+{\n+ DECLARE_CCTK_ARGUMENTS;\n+\n+ const CCTK_INT *MoL_Intermediate_Step = \n+ CCTK_VarDataPtr(cctkGH,0,\"MoL::MoL_Intermediate_Step\");\n+ if(NULL == MoL_Intermediate_Step)\n+ {\n+ CCTK_WARN(CCTK_WARN_ABORT,\n+ \"Could not get data pointer for MoL::MoL_Intermediate_Step\");\n+ }\n+\n+ // If counter becomes zero, the only thing left to do is to call PostStep!\n+ // NOTE: MoL's counter is uninitialised during initial data setup!\n+ *InLastMoLPostStep = cctk_iteration == 0 || *MoL_Intermediate_Step == 0;\n+}\n+\n+void GRHydro_ClearLastMoLPostStep(CCTK_ARGUMENTS)\n+{\n+ DECLARE_CCTK_ARGUMENTS;\n+\n+ *InLastMoLPostStep = 0;\n+}"}, "test": {"test_patch": "diff --git a/all_tests.txt b/all_tests.txt\nnew file mode 100644\nindex 0000000..0000000\n--- /dev/null\n+++ b/all_tests.txt\n@@ -0,0 +1,10 @@\n+GRHydro_test_shock\n+GRHydro_test_shock_mp5\n+GRHydro_test_shock_ppm\n+GRHydro_test_tov_ppm_ML\n+GRHydro_test_tov_ppm_ML_disable_internal_excision\n+GRHydro_test_tov_ppm_no_trp_ML\n+test_one_hybrid\n+tov_carpetevolutionmask\n+tov_carpetevolutionmask2\n+tov_slowsector", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}5{"question_id": "MSB_einsteintoolkit_Cactus_pr13", "question_type": "multi_swe_bench", "description": "Add missing GRHydro_FluxSplit.F90 in EinsteinEvolve/GRHydro (einsteintoolkit/Cactus#13)", "content": {"org": "einsteintoolkit", "repo": "Cactus", "pr_number": 13, "issue_title": "Add missing GRHydro_FluxSplit.F90 in EinsteinEvolve/GRHydro", "issue_body": "This PR adds the missing source file GRHydro_FluxSplit.F90 to complete the EinsteinEvolve/GRHydro thorn implementation.", "base_commit": "HEAD", "resolved_issues": [{"number": 13, "title": "Implement the full functionality of GRHydro", "body": "Please implement the full functionality of `GRHydro` by finishing the code in `GRHydro_FluxSplit.F90`.\n\n## Thorn Information:\n- Name: GRHydro\n- Target file: GRHydro_FluxSplit.F90\n\n## Interface Definition in interface.ccl:\n\n## Schedule Definition in schedule.ccl:\n\n## Parameters Definition in param.ccl:\n\n## Configuration Definition in configuration.ccl:\n\n## Documentation Context in readme.md and doc/documentation.tex\n\n## Related Code Context in src folder\n\n"}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/einsteintoolkit_m_cactus:pr-13", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/arrangements/EinsteinEvolve/GRHydro/src/GRHydro_FluxSplit.F90 b/arrangements/EinsteinEvolve/GRHydro/src/GRHydro_FluxSplit.F90\nnew file mode 100644\nindex 0000000..0000000\n--- /dev/null\n+++ b/arrangements/EinsteinEvolve/GRHydro/src/GRHydro_FluxSplit.F90\n@@ -0,0 +1,869 @@\n+ /*@@\n+ @file GRHydro_FluxSplit.F90\n+ @date Wed Mar 3 22:16:00 2004\n+ @author Ian Hawke\n+ @desc \n+ Flux split reconstruction using WENO5.\n+ @enddesc \n+ @@*/\n+\n+#include \"cctk.h\"\n+#include \"cctk_Arguments.h\"\n+#include \"cctk_Parameters.h\"\n+#include \"cctk_Functions.h\"\n+#include \"GRHydro_Macros.h\"\n+\n+ /*@@\n+ @routine GRHydro_FSAlpha\n+ @date Sun Jan 9 12:25:43 2005\n+ @author Ian Hawke\n+ @desc \n+ Compute the maximum characteristic speed over all space\n+ @enddesc \n+ @calls \n+ @calledby \n+ @history \n+ \n+ @endhistory \n+\n+@@*/\n+\n+\n+subroutine GRHydro_FSAlpha(CCTK_ARGUMENTS)\n+\n+ use GRHydro_Eigenproblem\n+\n+ implicit none\n+ \n+ DECLARE_CCTK_ARGUMENTS\n+ DECLARE_CCTK_PARAMETERS\n+ DECLARE_CCTK_FUNCTIONS\n+\n+ integer :: nx, ny, nz, i, j, k, ierr, max_handle\n+ CCTK_REAL :: uxx, uxy, uxz, uyy, uyz, uzz, sdet, beta\n+ CCTK_REAL, dimension(5) :: lambda\n+ CCTK_REAL :: alpha1_local, alpha2_local, alpha3_local, alpha4_local, &\n+ alpha5_local\n+\n+ nx = cctk_lsh(1)\n+ ny = cctk_lsh(2)\n+ nz = cctk_lsh(3)\n+\n+ fs_alpha1 = 0.d0\n+ fs_alpha2 = 0.d0\n+ fs_alpha3 = 0.d0\n+ fs_alpha4 = 0.d0\n+ fs_alpha5 = 0.d0\n+\n+ alpha1_local = 0.d0\n+ alpha2_local = 0.d0\n+ alpha3_local = 0.d0\n+ alpha4_local = 0.d0\n+ alpha5_local = 0.d0\n+\n+ if (flux_direction == 1) then\n+\n+ do k = 1, nz\n+ do j = 1, ny\n+ do i = 1, nx\n+\n+ sdet = sdetg(i,j,k)\n+ call UpperMetric(uxx,uxy,uxz,uyy,uyz,uzz,sdet*sdet,&\n+ gxx(i,j,k),gxy(i,j,k),gxz(i,j,k),gyy(i,j,k),&\n+ gyz(i,j,k),gzz(i,j,k)) \n+\n+ beta = betax(i,j,k)\n+ \n+ call eigenvalues(GRHydro_eos_handle, &\n+ rho (i,j,k), &\n+ vel (i,j,k,1), &\n+ vel (i,j,k,2), &\n+ vel (i,j,k,3), &\n+ eps (i,j,k), &\n+ w_lorentz(i,j,k), &\n+ lambda , &\n+ gxx (i,j,k), &\n+ gxy (i,j,k), &\n+ gxz (i,j,k), &\n+ gyy (i,j,k), &\n+ gyz (i,j,k), &\n+ gzz (i,j,k), &\n+ uxx , &\n+ alp (i,j,k), &\n+ beta ) \n+\n+ alpha1_local = max(abs(lambda(1)), alpha1_local)\n+ alpha2_local = max(abs(lambda(2)), alpha2_local)\n+ alpha3_local = max(abs(lambda(3)), alpha3_local)\n+ alpha4_local = max(abs(lambda(4)), alpha4_local)\n+ alpha5_local = max(abs(lambda(5)), alpha5_local)\n+\n+ end do\n+ end do\n+ end do\n+\n+ else if (flux_direction == 2) then\n+\n+ do k = 1, nz\n+ do j = 1, ny\n+ do i = 1, nx\n+\n+ sdet = sdetg(i,j,k)\n+ call UpperMetric(uxx,uxy,uxz,uyy,uyz,uzz,sdet*sdet,&\n+ gxx(i,j,k),gxy(i,j,k),gxz(i,j,k),gyy(i,j,k),&\n+ gyz(i,j,k),gzz(i,j,k)) \n+\n+ beta = betay(i,j,k)\n+ \n+ call eigenvalues(GRHydro_eos_handle, &\n+ rho (i,j,k), &\n+ vel (i,j,k,1), &\n+ vel (i,j,k,2), &\n+ vel (i,j,k,3), &\n+ eps (i,j,k), &\n+ w_lorentz(i,j,k), &\n+ lambda , &\n+ gyy (i,j,k), &\n+ gyz (i,j,k), &\n+ gxy (i,j,k), &\n+ gzz (i,j,k), &\n+ gxz (i,j,k), &\n+ gxx (i,j,k), &\n+ uyy , &\n+ alp (i,j,k), &\n+ beta ) \n+\n+ alpha1_local = max(abs(lambda(1)), alpha1_local)\n+ alpha2_local = max(abs(lambda(2)), alpha2_local)\n+ alpha3_local = max(abs(lambda(3)), alpha3_local)\n+ alpha4_local = max(abs(lambda(4)), alpha4_local)\n+ alpha5_local = max(abs(lambda(5)), alpha5_local)\n+\n+ end do\n+ end do\n+ end do\n+\n+ else if (flux_direction == 3) then\n+\n+ do k = 1, nz\n+ do j = 1, ny\n+ do i = 1, nx\n+\n+ sdet = sdetg(i,j,k)\n+ call UpperMetric(uxx,uxy,uxz,uyy,uyz,uzz,sdet*sdet,&\n+ gxx(i,j,k),gxy(i,j,k),gxz(i,j,k),gyy(i,j,k),&\n+ gyz(i,j,k),gzz(i,j,k)) \n+\n+ beta = betaz(i,j,k)\n+ \n+ call eigenvalues(GRHydro_eos_handle, &\n+ rho (i,j,k), &\n+ vel (i,j,k,1), &\n+ vel (i,j,k,2), &\n+ vel (i,j,k,3), &\n+ eps (i,j,k), &\n+ w_lorentz(i,j,k), &\n+ lambda , &\n+ gzz (i,j,k), &\n+ gxz (i,j,k), &\n+ gyz (i,j,k), &\n+ gxx (i,j,k), &\n+ gxy (i,j,k), &\n+ gyy (i,j,k), &\n+ uzz , &\n+ alp (i,j,k), &\n+ beta ) \n+\n+ alpha1_local = max(abs(lambda(1)), alpha1_local)\n+ alpha2_local = max(abs(lambda(2)), alpha2_local)\n+ alpha3_local = max(abs(lambda(3)), alpha3_local)\n+ alpha4_local = max(abs(lambda(4)), alpha4_local)\n+ alpha5_local = max(abs(lambda(5)), alpha5_local)\n+\n+ end do\n+ end do\n+ end do\n+\n+ else\n+\n+ call CCTK_ERROR(\"Flux direction not x,y,z\")\n+ STOP\n+\n+ end if\n+\n+!!$ write(*,*) 'fs_alpha: local',alpha1_local,alpha2_local,alpha3_local,alpha4_local,alpha5_local\n+ \n+ call CCTK_ReductionHandle(max_handle, \"maximum\")\n+\n+ call CCTK_ReduceLocScalar ( ierr, cctkGH, -1, max_handle, &\n+ alpha1_local, fs_alpha1, CCTK_VARIABLE_REAL )\n+ if ( ierr .ne. 0 ) then\n+ call CCTK_ERROR(\"Reduction of alpha1 failed\")\n+ STOP\n+ end if\n+ call CCTK_ReduceLocScalar ( ierr, cctkGH, -1, max_handle, &\n+ alpha2_local, fs_alpha2, CCTK_VARIABLE_REAL )\n+ if ( ierr .ne. 0 ) then\n+ call CCTK_ERROR(\"Reduction of alpha2 failed\")\n+ STOP\n+ end if\n+ call CCTK_ReduceLocScalar ( ierr, cctkGH, -1, max_handle, &\n+ alpha3_local, fs_alpha3, CCTK_VARIABLE_REAL )\n+ if ( ierr .ne. 0 ) then\n+ call CCTK_ERROR(\"Reduction of alpha3 failed\")\n+ STOP\n+ end if\n+ call CCTK_ReduceLocScalar ( ierr, cctkGH, -1, max_handle, &\n+ alpha4_local, fs_alpha4, CCTK_VARIABLE_REAL )\n+ if ( ierr .ne. 0 ) then\n+ call CCTK_ERROR(\"Reduction of alpha4 failed\")\n+ STOP\n+ end if\n+ call CCTK_ReduceLocScalar ( ierr, cctkGH, -1, max_handle, &\n+ alpha5_local, fs_alpha5, CCTK_VARIABLE_REAL )\n+ if ( ierr .ne. 0 ) then\n+ call CCTK_ERROR(\"Reduction of alpha5 failed\")\n+ STOP\n+ end if\n+\n+!!$ write(*,*) 'fs_alpha: global',fs_alpha1,fs_alpha2,fs_alpha3,fs_alpha4,fs_alpha5\n+\n+!!$ fs_alpha1 = max(abs(fs_alpha1), &\n+!!$ abs(fs_alpha2), &\n+!!$ abs(fs_alpha3), &\n+!!$ abs(fs_alpha4), &\n+!!$ abs(fs_alpha5) )\n+!!$\n+!!$ fs_alpha2 = max(abs(fs_alpha1), &\n+!!$ abs(fs_alpha2), &\n+!!$ abs(fs_alpha3), &\n+!!$ abs(fs_alpha4), &\n+!!$ abs(fs_alpha5) )\n+!!$\n+!!$ fs_alpha3 = max(abs(fs_alpha1), &\n+!!$ abs(fs_alpha2), &\n+!!$ abs(fs_alpha3), &\n+!!$ abs(fs_alpha4), &\n+!!$ abs(fs_alpha5) )\n+!!$\n+!!$ fs_alpha4 = max(abs(fs_alpha1), &\n+!!$ abs(fs_alpha2), &\n+!!$ abs(fs_alpha3), &\n+!!$ abs(fs_alpha4), &\n+!!$ abs(fs_alpha5) )\n+!!$\n+!!$ fs_alpha5 = max(abs(fs_alpha1), &\n+!!$ abs(fs_alpha2), &\n+!!$ abs(fs_alpha3), &\n+!!$ abs(fs_alpha4), &\n+!!$ abs(fs_alpha5) )\n+\n+!!$ write(*,*) 'fs_alpha: final',fs_alpha1,fs_alpha2,fs_alpha3,fs_alpha4,fs_alpha5\n+ \n+end subroutine GRHydro_FSAlpha\n+\n+ /*@@\n+ @routine GRHydro_SplitFlux\n+ @date Wed Mar 3 22:17:14 2004\n+ @author Ian Hawke\n+ @desc \n+ Wrapper routine to split the flux. Synchronization is \n+ unfortunately required afterwards.\n+ @enddesc \n+ @calls \n+ @calledby \n+ @history \n+ \n+ @endhistory \n+\n+@@*/\n+\n+\n+subroutine GRHydro_SplitFlux(CCTK_ARGUMENTS)\n+\n+ implicit none\n+ \n+ DECLARE_CCTK_ARGUMENTS\n+ DECLARE_CCTK_PARAMETERS\n+ DECLARE_CCTK_FUNCTIONS\n+\n+ CCTK_INT, parameter :: izero = 0\n+ integer, parameter :: ik = kind(izero)\n+\n+ integer :: nx, ny, nz, i, j, k\n+\n+ CCTK_REAL, dimension(:), allocatable :: upper, det, dummy\n+ CCTK_REAL :: uxx, uxy, uxz, uyy, uyz, uzz\n+\n+ nx = cctk_lsh(1)\n+ ny = cctk_lsh(2)\n+ nz = cctk_lsh(3)\n+\n+ if (flux_direction == 1) then\n+ allocate(upper(nx), det(nx), dummy(nx))\n+ do k = GRHydro_stencil, cctk_lsh(3) - GRHydro_stencil + 2\n+ do j = GRHydro_stencil, cctk_lsh(2) - GRHydro_stencil + 2\n+\n+ dummy = betax(:,j,k)\n+\n+ do i = 1, cctk_lsh(1)\n+ det(i) = sdetg(i,j,k)*sdetg(i,j,k)\n+ call UpperMetric(uxx,uxy,uxz,uyy,uyz,uzz,det(i),&\n+ gxx(i,j,k),gxy(i,j,k),gxz(i,j,k),gyy(i,j,k),&\n+ gyz(i,j,k),gzz(i,j,k)) \n+ upper(i) = uxx\n+ end do\n+\n+ call GRHydro_SplitFlux_1D(GRHydro_eos_handle, int(nx,ik),&\n+ fs_alpha1, fs_alpha2, fs_alpha3, fs_alpha4, fs_alpha5, &\n+ gxx(:,j,k),gxy(:,j,k),gxz(:,j,k),&\n+ gyy(:,j,k),gyz(:,j,k),gzz(:,j,k),&\n+ upper, det,&\n+ alp(:,j,k),dummy,&\n+ rho(:,j,k),vel(:,j,k,1),vel(:,j,k,2),vel(:,j,k,3),press(:,j,k),&\n+ w_lorentz(:,j,k),eps(:,j,k),&\n+ dens(:,j,k),scon(:,j,k,1),scon(:,j,k,2),scon(:,j,k,3),tau(:,j,k),&\n+ densfplus(:,j,k), sxfplus(:,j,k), syfplus(:,j,k), &\n+ szfplus(:,j,k), taufplus(:,j,k), &\n+ densfminus(:,j,k), sxfminus(:,j,k), syfminus(:,j,k), &\n+ szfminus(:,j,k), taufminus(:,j,k), &\n+ densflux(:,j,k), sxflux(:,j,k), syflux(:,j,k), &\n+ szflux(:,j,k), tauflux(:,j,k)) \n+ end do\n+ end do\n+ deallocate(upper, det, dummy)\n+ else if (flux_direction == 2) then\n+ allocate(upper(ny), det(ny), dummy(ny))\n+ do k = GRHydro_stencil, cctk_lsh(3) - GRHydro_stencil + 2\n+ do i = GRHydro_stencil, cctk_lsh(1) - GRHydro_stencil + 2\n+\n+ dummy = betay(i,:,k)\n+\n+ do j = 1, cctk_lsh(2)\n+ det(j) = sdetg(i,j,k)**2\n+ call UpperMetric(uxx,uxy,uxz,uyy,uyz,uzz,det(j),&\n+ gxx(i,j,k),gxy(i,j,k),gxz(i,j,k),gyy(i,j,k),&\n+ gyz(i,j,k),gzz(i,j,k)) \n+ upper(j) = uyy\n+ end do\n+\n+ call GRHydro_SplitFlux_1D(GRHydro_eos_handle, int(ny,ik),&\n+ fs_alpha1, fs_alpha2, fs_alpha3, fs_alpha4, fs_alpha5, &\n+ gyy(i,:,k),gyz(i,:,k),gxy(i,:,k),&\n+ gzz(i,:,k),gxz(i,:,k),gxx(i,:,k),&\n+ upper, det,&\n+ alp(i,:,k),dummy,&\n+ rho(i,:,k),vel(i,:,k,2),vel(i,:,k,3),vel(i,:,k,1),press(i,:,k),&\n+ w_lorentz(i,:,k),eps(i,:,k),&\n+ dens(i,:,k),scon(i,:,k,2),scon(i,:,k,3),scon(i,:,k,1),tau(i,:,k),&\n+ densfplus(i,:,k), syfplus(i,:,k), szfplus(i,:,k), &\n+ sxfplus(i,:,k), taufplus(i,:,k), &\n+ densfminus(i,:,k), syfminus(i,:,k), szfminus(i,:,k), &\n+ sxfminus(i,:,k), taufminus(i,:,k), &\n+ densflux(i,:,k), syflux(i,:,k), szflux(i,:,k), &\n+ sxflux(i,:,k), tauflux(i,:,k))\n+ end do\n+ end do\n+ deallocate(upper, det, dummy)\n+ else if (flux_direction == 3) then\n+ allocate(upper(nz), det(nz), dummy(nz))\n+ do j = GRHydro_stencil, cctk_lsh(2) - GRHydro_stencil + 2\n+ do i = GRHydro_stencil, cctk_lsh(1) - GRHydro_stencil + 2\n+\n+ dummy = betaz(i,j,:)\n+ \n+ do k = 1, cctk_lsh(3)\n+ det(k) = sdetg(i,j,k)*sdetg(i,j,k)\n+ call UpperMetric(uxx,uxy,uxz,uyy,uyz,uzz,det(k),&\n+ gxx(i,j,k),gxy(i,j,k),gxz(i,j,k),gyy(i,j,k),&\n+ gyz(i,j,k),gzz(i,j,k)) \n+ upper(k) = uzz\n+ end do\n+\n+ call GRHydro_SplitFlux_1D(GRHydro_eos_handle, int(nz,ik),&\n+ fs_alpha1, fs_alpha2, fs_alpha3, fs_alpha4, fs_alpha5, &\n+ gzz(i,j,:),gxz(i,j,:),gyz(i,j,:),&\n+ gxx(i,j,:),gxy(i,j,:),gyy(i,j,:),&\n+ upper, det,&\n+ alp(i,j,:),dummy,&\n+ rho(i,j,:),vel(i,j,:,3),vel(i,j,:,1),vel(i,j,:,2),press(i,j,:),&\n+ w_lorentz(i,j,:),eps(i,j,:),&\n+ dens(i,j,:),scon(i,j,:,3),scon(i,j,:,1),scon(i,j,:,2),tau(i,j,:),&\n+ densfplus(i,j,:), szfplus(i,j,:), sxfplus(i,j,:), &\n+ syfplus(i,j,:), taufplus(i,j,:), &\n+ densfminus(i,j,:), szfminus(i,j,:), sxfminus(i,j,:), &\n+ syfminus(i,j,:), taufminus(i,j,:), &\n+ densflux(i,j,:), szflux(i,j,:), sxflux(i,j,:), &\n+ syflux(i,j,:), tauflux(i,j,:))\n+ end do\n+ end do\n+ deallocate(upper, det, dummy)\n+ else\n+ call CCTK_ERROR(\"Flux direction not x,y,z\")\n+ STOP\n+ end if\n+\n+ return\n+\n+end subroutine GRHydro_SplitFlux\n+\n+ /*@@\n+ @routine GRHydro_SplitFlux_1D\n+ @date Wed Mar 3 22:55:36 2004\n+ @author Ian Hawke\n+ @desc \n+ Actually performs the flux splitting. \n+ We really should be doing it on a characteristic basis.\n+\n+ Note the direction rotations on the calling routine.\n+ @enddesc \n+ @calls \n+ @calledby \n+ @history \n+ \n+ @endhistory \n+\n+@@*/\n+\n+subroutine GRHydro_SplitFlux_1D(handle, nx, &\n+ alpha1, alpha2, alpha3, alpha4, alpha5, &\n+ gxx, gxy, gxz, gyy, gyz, gzz, u, det, alp, beta, &\n+ rho, velx1, vely1, velz1, press, w_lorentz, eps, &\n+ dens, sx, sy, sz, tau, &\n+ densfplus, sxfplus, syfplus, szfplus, taufplus, &\n+ densfminus, sxfminus, syfminus, szfminus, taufminus, &\n+ densflux, sxflux, syflux, szflux, tauflux)\n+\n+ use GRHydro_Eigenproblem\n+\n+ implicit none\n+\n+ DECLARE_CCTK_PARAMETERS\n+ DECLARE_CCTK_FUNCTIONS\n+\n+ CCTK_INT, parameter :: izero = 0\n+ integer, parameter :: ik = kind(izero)\n+\n+ CCTK_REAL, parameter :: half = 0.5d0\n+\n+ CCTK_INT :: i, nx, handle, ll\n+ CCTK_REAL, dimension(nx) :: gxx, gxy, gxz, gyy, gyz, gzz, &\n+ u, det, alp, beta, &\n+ rho, velx1, vely1, velz1, press, w_lorentz, eps, &\n+ dens, sx, sy, sz, tau, &\n+ densfplus, sxfplus, syfplus, szfplus, taufplus, &\n+ densfminus, sxfminus, syfminus, szfminus, taufminus, &\n+ densflux, sxflux, syflux, szflux, tauflux\n+\n+ CCTK_REAL :: alpha1, alpha2, alpha3, alpha4, alpha5\n+\n+ CCTK_REAL, dimension(:), allocatable :: tmp\n+\n+ CCTK_REAL, dimension(:,:), allocatable :: evals\n+ CCTK_REAL, dimension(:,:,:), allocatable :: levecs, revecs\n+\n+ CCTK_REAL, dimension(:), allocatable :: &\n+ char_v1, char_v2, char_v3, char_v4 ,char_v5, &\n+ char_f1_plus, char_f2_plus, char_f3_plus, &\n+ char_f4_plus ,char_f5_plus, &\n+ char_f1_minus, char_f2_minus, char_f3_minus, &\n+ char_f4_minus ,char_f5_minus, &\n+ char_f1, char_f2, char_f3, &\n+ char_f4 ,char_f5\n+\n+ CCTK_REAL, dimension(5) :: lambda, alpha\n+ CCTK_REAL, dimension(5, 5) :: levec, revec\n+\n+ densfplus = 0.d0\n+ sxfplus = 0.d0\n+ syfplus = 0.d0\n+ szfplus = 0.d0\n+ taufplus = 0.d0\n+ densfminus = 0.d0\n+ sxfminus = 0.d0\n+ syfminus = 0.d0\n+ szfminus = 0.d0\n+ taufminus = 0.d0\n+\n+ allocate(evals(nx, 5), levecs(nx,5,5), revecs(nx,5,5))\n+ allocate(tmp(nx))\n+ allocate(char_v1(nx), char_v2(nx), char_v3(nx), char_v4 (nx),char_v5(nx), &\n+ char_f1_plus(nx), char_f2_plus(nx), char_f3_plus(nx), &\n+ char_f4_plus (nx),char_f5_plus(nx), &\n+ char_f1_minus(nx), char_f2_minus(nx), char_f3_minus(nx), &\n+ char_f4_minus (nx),char_f5_minus(nx), &\n+ char_f1(nx), char_f2(nx), char_f3(nx), &\n+ char_f4 (nx),char_f5(nx))\n+\n+ do i = 1, nx-1\n+\n+!!$ Arithmetic mean\n+\n+!!$ Calculate the maximum eigenvalue and put it here\n+\n+ call eigenproblem_leftright(handle, &\n+ half * (rho (i) + rho (i+1)), &\n+ half * (velx1 (i) + velx1 (i+1)), &\n+ half * (vely1 (i) + vely1 (i+1)), &\n+ half * (velz1 (i) + velz1 (i+1)), &\n+ half * (eps (i) + eps (i+1)), &\n+ half * (w_lorentz(i) + w_lorentz(i+1)), &\n+ half * (gxx (i) + gxx (i+1)), &\n+ half * (gxy (i) + gxy (i+1)), &\n+ half * (gxz (i) + gxz (i+1)), &\n+ half * (gyy (i) + gyy (i+1)), &\n+ half * (gyz (i) + gyz (i+1)), &\n+ half * (gzz (i) + gzz (i+1)), &\n+ half * (u (i) + u (i+1)), &\n+ half * (alp (i) + alp (i+1)), &\n+ half * (beta (i) + beta (i+1)), &\n+ lambda,&\n+ levec,&\n+ revec)\n+\n+ evals(i,:) = lambda\n+ levecs(i,:,:) = levec\n+ revecs(i,:,:) = revec\n+ \n+ end do\n+ \n+ do i = 3, nx - 3\n+\n+ alpha(1) = alpha1\n+ alpha(2) = alpha2\n+ alpha(3) = alpha3\n+ alpha(4) = alpha4\n+ alpha(5) = alpha5\n+ \n+ do ll = i - 2, i + 3\n+\n+!!$ Initialize the pointwise fluxes temporarily into the minus\n+\n+ call num_x_flux(dens(ll), sx(ll), sy(ll), sz(ll), tau(ll), &\n+ densfminus(ll), sxfminus(ll), syfminus(ll), szfminus(ll), &\n+ taufminus(ll), &\n+ velx1(ll), press(ll), det(ll), alp(ll), beta(ll))\n+\n+ densfminus(ll) = densfminus(ll) * alp(ll)\n+ sxfminus(ll) = sxfminus(ll) * alp(ll)\n+ syfminus(ll) = syfminus(ll) * alp(ll)\n+ szfminus(ll) = szfminus(ll) * alp(ll)\n+ taufminus(ll) = taufminus(ll) * alp(ll)\n+\n+ char_v1(ll) = levecs(i,1,1) * dens(ll) + &\n+ levecs(i,1,2) * sx(ll) + &\n+ levecs(i,1,3) * sy(ll) + &\n+ levecs(i,1,4) * sz(ll) + &\n+ levecs(i,1,5) * tau(ll)\n+ char_v2(ll) = levecs(i,2,1) * dens(ll) + &\n+ levecs(i,2,2) * sx(ll) + &\n+ levecs(i,2,3) * sy(ll) + &\n+ levecs(i,2,4) * sz(ll) + &\n+ levecs(i,2,5) * tau(ll)\n+ char_v3(ll) = levecs(i,3,1) * dens(ll) + &\n+ levecs(i,3,2) * sx(ll) + &\n+ levecs(i,3,3) * sy(ll) + &\n+ levecs(i,3,4) * sz(ll) + &\n+ levecs(i,3,5) * tau(ll)\n+ char_v4(ll) = levecs(i,4,1) * dens(ll) + &\n+ levecs(i,4,2) * sx(ll) + &\n+ levecs(i,4,3) * sy(ll) + &\n+ levecs(i,4,4) * sz(ll) + &\n+ levecs(i,4,5) * tau(ll)\n+ char_v5(ll) = levecs(i,5,1) * dens(ll) + &\n+ levecs(i,5,2) * sx(ll) + &\n+ levecs(i,5,3) * sy(ll) + &\n+ levecs(i,5,4) * sz(ll) + &\n+ levecs(i,5,5) * tau(ll)\n+ \n+ char_f1(ll) = levecs(i,1,1) * densfminus(ll) + &\n+ levecs(i,1,2) * sxfminus(ll) + &\n+ levecs(i,1,3) * syfminus(ll) + &\n+ levecs(i,1,4) * szfminus(ll) + &\n+ levecs(i,1,5) * taufminus(ll)\n+ char_f2(ll) = levecs(i,2,1) * densfminus(ll) + &\n+ levecs(i,2,2) * sxfminus(ll) + &\n+ levecs(i,2,3) * syfminus(ll) + &\n+ levecs(i,2,4) * szfminus(ll) + &\n+ levecs(i,2,5) * taufminus(ll)\n+ char_f3(ll) = levecs(i,3,1) * densfminus(ll) + &\n+ levecs(i,3,2) * sxfminus(ll) + &\n+ levecs(i,3,3) * syfminus(ll) + &\n+ levecs(i,3,4) * szfminus(ll) + &\n+ levecs(i,3,5) * taufminus(ll)\n+ char_f4(ll) = levecs(i,4,1) * densfminus(ll) + &\n+ levecs(i,4,2) * sxfminus(ll) + &\n+ levecs(i,4,3) * syfminus(ll) + &\n+ levecs(i,4,4) * szfminus(ll) + &\n+ levecs(i,4,5) * taufminus(ll)\n+ char_f5(ll) = levecs(i,5,1) * densfminus(ll) + &\n+ levecs(i,5,2) * sxfminus(ll) + &\n+ levecs(i,5,3) * syfminus(ll) + &\n+ levecs(i,5,4) * szfminus(ll) + &\n+ levecs(i,5,5) * taufminus(ll) \n+\n+!!$ Calculate the split\n+\n+ char_f1_plus(ll) = 0.5d0 * (char_f1(ll) + alpha(1) * char_v1(ll))\n+ char_f1_minus(ll) = 0.5d0 * (char_f1(ll) - alpha(1) * char_v1(ll))\n+ char_f2_plus(ll) = 0.5d0 * (char_f2(ll) + alpha(2) * char_v2(ll))\n+ char_f2_minus(ll) = 0.5d0 * (char_f2(ll) - alpha(2) * char_v2(ll))\n+ char_f3_plus(ll) = 0.5d0 * (char_f3(ll) + alpha(3) * char_v3(ll))\n+ char_f3_minus(ll) = 0.5d0 * (char_f3(ll) - alpha(3) * char_v3(ll))\n+ char_f4_plus(ll) = 0.5d0 * (char_f4(ll) + alpha(4) * char_v4(ll))\n+ char_f4_minus(ll) = 0.5d0 * (char_f4(ll) - alpha(4) * char_v4(ll))\n+ char_f5_plus(ll) = 0.5d0 * (char_f5(ll) + alpha(5) * char_v5(ll))\n+ char_f5_minus(ll) = 0.5d0 * (char_f5(ll) - alpha(5) * char_v5(ll))\n+\n+ end do\n+\n+!!$ Reconstruct the characteristic split fluxes\n+!!$ After reconstruction, combine to get the characteristic flux\n+\n+ call GRHydro_WENO5_Left(5_ik, char_f1_plus(i-2:i+2), tmp(i-2:i+2))\n+ char_f1(i) = tmp(i)\n+ call GRHydro_WENO5_Right(5_ik, char_f1_minus(i-1:i+3), &\n+ tmp(i-1:i+3))\n+ char_f1(i) = char_f1(i) + tmp(i+1)\n+ \n+ call GRHydro_WENO5_Left(5_ik, char_f2_plus(i-2:i+2), tmp(i-2:i+2))\n+ char_f2(i) = tmp(i)\n+ call GRHydro_WENO5_Right(5_ik, char_f2_minus(i-1:i+3), &\n+ tmp(i-1:i+3))\n+ char_f2(i) = char_f2(i) + tmp(i+1)\n+ \n+ call GRHydro_WENO5_Left(5_ik, char_f3_plus(i-2:i+2), tmp(i-2:i+2))\n+ char_f3(i) = tmp(i)\n+ call GRHydro_WENO5_Right(5_ik, char_f3_minus(i-1:i+3), &\n+ tmp(i-1:i+3))\n+ char_f3(i) = char_f3(i) + tmp(i+1)\n+ \n+ call GRHydro_WENO5_Left(5_ik, char_f4_plus(i-2:i+2), tmp(i-2:i+2))\n+ char_f4(i) = tmp(i)\n+ call GRHydro_WENO5_Right(5_ik, char_f4_minus(i-1:i+3), &\n+ tmp(i-1:i+3))\n+ char_f4(i) = char_f4(i) + tmp(i+1)\n+ \n+ call GRHydro_WENO5_Left(5_ik, char_f5_plus(i-2:i+2), tmp(i-2:i+2))\n+ char_f5(i) = tmp(i)\n+ call GRHydro_WENO5_Right(5_ik, char_f5_minus(i-1:i+3), &\n+ tmp(i-1:i+3))\n+ char_f5(i) = char_f5(i) + tmp(i+1)\n+\n+!!$ Compute physical fluxes\n+ \n+ densflux(i) = &\n+ revecs(i,1,1) * char_f1(i) + revecs(i,2,1) * char_f2(i) + &\n+ revecs(i,3,1) * char_f3(i) + revecs(i,4,1) * char_f4(i) + &\n+ revecs(i,5,1) * char_f5(i)\n+ sxflux(i) = &\n+ revecs(i,1,2) * char_f1(i) + revecs(i,2,2) * char_f2(i) + &\n+ revecs(i,3,2) * char_f3(i) + revecs(i,4,2) * char_f4(i) + &\n+ revecs(i,5,2) * char_f5(i)\n+ syflux(i) = &\n+ revecs(i,1,3) * char_f1(i) + revecs(i,2,3) * char_f2(i) + &\n+ revecs(i,3,3) * char_f3(i) + revecs(i,4,3) * char_f4(i) + &\n+ revecs(i,5,3) * char_f5(i)\n+ szflux(i) = &\n+ revecs(i,1,4) * char_f1(i) + revecs(i,2,4) * char_f2(i) + &\n+ revecs(i,3,4) * char_f3(i) + revecs(i,4,4) * char_f4(i) + &\n+ revecs(i,5,4) * char_f5(i)\n+ tauflux(i) = &\n+ revecs(i,1,5) * char_f1(i) + revecs(i,2,5) * char_f2(i) + &\n+ revecs(i,3,5) * char_f3(i) + revecs(i,4,5) * char_f4(i) + &\n+ revecs(i,5,5) * char_f5(i)\n+\n+!!$ if (abs(i-200) < 5) then\n+!!$ write(*,*) i, 'alpha',alpha1,alpha2,alpha3,alpha4,alpha5\n+!!$ write(*,*) i, 'var',dens(i), sx(i), tau(i)\n+!!$ write(*,*) i, 'f',densflux(i),sxflux(i),tauflux(i)\n+!!$ end if\n+ \n+ end do\n+\n+ deallocate(evals, levecs, revecs, tmp)\n+\n+end subroutine GRHydro_SplitFlux_1D\n+\n+ /*@@\n+ @routine GRHydro_WENO5_Left\n+ @date Wed Mar 3 22:57:54 2004\n+ @author Ian Hawke\n+ @desc \n+ Upwind biased WENO5.\n+ @enddesc \n+ @calls \n+ @calledby \n+ @history \n+ \n+ @endhistory \n+\n+@@*/\n+\n+subroutine GRHydro_WENO5_Left(nx, v, vminus)\n+\n+ implicit none\n+\n+ CCTK_INT :: i, nx\n+ CCTK_REAL, dimension(nx) :: v, vminus\n+ CCTK_REAL :: one, two, three, four, five, six, seven, &\n+ ten, eleven, twelve, thirteen, &\n+ ThirteenByTwelve, Quarter\n+ parameter (one = 1)\n+ parameter (two = 2)\n+ parameter (three = 3)\n+ parameter (four = 4)\n+ parameter (five = 5)\n+ parameter (six = 6)\n+ parameter (seven = 7)\n+ parameter (ten = 10)\n+ parameter (eleven = 11)\n+ parameter (twelve = 12)\n+ parameter (thirteen = 13)\n+ parameter (ThirteenByTwelve = thirteen / twelve)\n+ parameter (Quarter = one / four)\n+ CCTK_REAL :: d0, d1, d2\n+ parameter (d0 = three / ten)\n+ parameter (d1 = six / ten)\n+ parameter (d2 = one / ten)\n+ CCTK_REAL :: c00,c01,c02,c10,c11,c12,c20,c21,c22\n+ parameter (c00 = two / six)\n+ parameter (c01 = five / six)\n+ parameter (c02 = -one / six)\n+ parameter (c10 = -one / six)\n+ parameter (c11 = five / six)\n+ parameter (c12 = two / six)\n+ parameter (c20 = two / six)\n+ parameter (c21 = -seven / six)\n+ parameter (c22 = eleven / six)\n+\n+ CCTK_REAL :: beta0, beta1, beta2\n+ CCTK_REAL :: epsilon\n+ CCTK_REAL :: alpha0, alpha1, alpha2, alphasum\n+ CCTK_REAL :: w0, w1, w2\n+ CCTK_REAL :: v0plushalf, v1plushalf, v2plushalf\n+\n+ epsilon = 1.d-6\n+\n+ do i = 3, nx-2\n+\n+ beta0 = ThirteenByTwelve * (v(i ) - two * v(i+1) + v(i+2))**2 + &\n+ Quarter * (three * v(i ) - four * v(i+1) + v(i+2))**2\n+ beta1 = ThirteenByTwelve * (v(i-1) - two * v(i ) + v(i+1))**2 + &\n+ Quarter * ( v(i-1) - v(i+1))**2\n+ beta2 = ThirteenByTwelve * (v(i-2) - two * v(i-1) + v(i ))**2 + &\n+ Quarter * ( v(i-2) - four * v(i-1) + three * v(i ))**2\n+ \n+ alpha0 = d0 / (epsilon + beta0)**2\n+ alpha1 = d1 / (epsilon + beta1)**2\n+ alpha2 = d2 / (epsilon + beta2)**2\n+ \n+ alphasum = alpha0 + alpha1 + alpha2\n+ \n+ w0 = alpha0 / alphasum\n+ w1 = alpha1 / alphasum\n+ w2 = alpha2 / alphasum\n+ \n+ v0plushalf = c00 * v(i ) + c01 * v(i+1) + c02 * v(i+2)\n+ v1plushalf = c10 * v(i-1) + c11 * v(i ) + c12 * v(i+1)\n+ v2plushalf = c20 * v(i-2) + c21 * v(i-1) + c22 * v(i )\n+ \n+ vminus(i) = w0 * v0plushalf + &\n+ w1 * v1plushalf + &\n+ w2 * v2plushalf\n+ \n+ end do\n+ \n+end subroutine GRHydro_WENO5_Left\n+\n+ /*@@\n+ @routine GRHydro_WENO5_Right\n+ @date Wed Mar 3 22:58:10 2004\n+ @author Ian Hawke\n+ @desc \n+ Downwind biased WENO5.\n+ @enddesc \n+ @calls \n+ @calledby \n+ @history \n+ \n+ @endhistory \n+\n+@@*/\n+\n+subroutine GRHydro_WENO5_Right(nx, v, vplus)\n+\n+ implicit none\n+\n+ CCTK_INT :: i, nx\n+ CCTK_REAL, dimension(nx) :: v, vplus\n+ CCTK_REAL :: one, two, three, four, five, six, seven, &\n+ ten, eleven, twelve, thirteen, &\n+ ThirteenByTwelve, Quarter\n+ parameter (one = 1)\n+ parameter (two = 2)\n+ parameter (three = 3)\n+ parameter (four = 4)\n+ parameter (five = 5)\n+ parameter (six = 6)\n+ parameter (seven = 7)\n+ parameter (ten = 10)\n+ parameter (eleven = 11)\n+ parameter (twelve = 12)\n+ parameter (thirteen = 13)\n+ parameter (ThirteenByTwelve = thirteen / twelve)\n+ parameter (Quarter = one / four)\n+ CCTK_REAL :: dtilde0, dtilde1, dtilde2\n+ parameter (dtilde0 = one / ten)\n+ parameter (dtilde1 = six / ten)\n+ parameter (dtilde2 = three / ten)\n+ CCTK_REAL :: ctilde00,ctilde01,ctilde02,ctilde10,ctilde11,&\n+ ctilde12,ctilde20,ctilde21,ctilde22\n+ parameter (ctilde00 = eleven / six)\n+ parameter (ctilde01 = -seven / six)\n+ parameter (ctilde02 = two / six)\n+ parameter (ctilde10 = two / six)\n+ parameter (ctilde11 = five / six)\n+ parameter (ctilde12 = -one / six)\n+ parameter (ctilde20 = -one / six)\n+ parameter (ctilde21 = five / six)\n+ parameter (ctilde22 = two / six)\n+\n+ CCTK_REAL :: betatilde0, betatilde1, betatilde2\n+ CCTK_REAL :: epsilon\n+ CCTK_REAL :: alphatilde0, alphatilde1, alphatilde2, alphatildesum\n+ CCTK_REAL :: wtilde0, wtilde1, wtilde2\n+ CCTK_REAL :: v0minushalf, v1minushalf, v2minushalf\n+\n+ epsilon = 1.d-6\n+\n+ do i = 3, nx-2\n+\n+ betatilde0 = ThirteenByTwelve * (v(i ) - two * v(i+1) + v(i+2))**2 + &\n+ Quarter * (three * v(i ) - four * v(i+1) + v(i+2))**2\n+ betatilde1 = ThirteenByTwelve * (v(i-1) - two * v(i ) + v(i+1))**2 + &\n+ Quarter * ( v(i-1) - v(i+1))**2\n+ betatilde2 = ThirteenByTwelve * (v(i-2) - two * v(i-1) + v(i ))**2 + &\n+ Quarter * ( v(i-2) - four * v(i-1) + three * v(i ))**2\n+ \n+ alphatilde0 = dtilde0 / (epsilon + betatilde0)**2\n+ alphatilde1 = dtilde1 / (epsilon + betatilde1)**2\n+ alphatilde2 = dtilde2 / (epsilon + betatilde2)**2\n+ \n+ alphatildesum = alphatilde0 + alphatilde1 + alphatilde2\n+ \n+ wtilde0 = alphatilde0 / alphatildesum\n+ wtilde1 = alphatilde1 / alphatildesum\n+ wtilde2 = alphatilde2 / alphatildesum\n+ \n+ v0minushalf = ctilde00 * v(i ) + ctilde01 * v(i+1) + ctilde02 * v(i+2)\n+ v1minushalf = ctilde10 * v(i-1) + ctilde11 * v(i ) + ctilde12 * v(i+1)\n+ v2minushalf = ctilde20 * v(i-2) + ctilde21 * v(i-1) + ctilde22 * v(i )\n+ \n+ vplus(i) = wtilde0 * v0minushalf + &\n+ wtilde1 * v1minushalf + &\n+ wtilde2 * v2minushalf\n+ \n+ end do\n+ \n+end subroutine GRHydro_WENO5_Right"}, "test": {"test_patch": "diff --git a/all_tests.txt b/all_tests.txt\nnew file mode 100644\nindex 0000000..0000000\n--- /dev/null\n+++ b/all_tests.txt\n@@ -0,0 +1,10 @@\n+GRHydro_test_shock\n+GRHydro_test_shock_mp5\n+GRHydro_test_shock_ppm\n+GRHydro_test_tov_ppm_ML\n+GRHydro_test_tov_ppm_ML_disable_internal_excision\n+GRHydro_test_tov_ppm_no_trp_ML\n+test_one_hybrid\n+tov_carpetevolutionmask\n+tov_carpetevolutionmask2\n+tov_slowsector", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}6{"question_id": "MSB_einsteintoolkit_Cactus_pr14", "question_type": "multi_swe_bench", "description": "Add missing GRHydro_HLLEM.F90 in EinsteinEvolve/GRHydro (einsteintoolkit/Cactus#14)", "content": {"org": "einsteintoolkit", "repo": "Cactus", "pr_number": 14, "issue_title": "Add missing GRHydro_HLLEM.F90 in EinsteinEvolve/GRHydro", "issue_body": "This PR adds the missing source file GRHydro_HLLEM.F90 to complete the EinsteinEvolve/GRHydro thorn implementation.", "base_commit": "HEAD", "resolved_issues": [{"number": 14, "title": "Implement the full functionality of GRHydro", "body": "Please implement the full functionality of `GRHydro` by finishing the code in `GRHydro_HLLEM.F90`.\n\n## Thorn Information:\n- Name: GRHydro\n- Target file: GRHydro_HLLEM.F90\n\n## Interface Definition in interface.ccl:\n\n## Schedule Definition in schedule.ccl:\n\n## Parameters Definition in param.ccl:\n\n## Configuration Definition in configuration.ccl:\n\n## Documentation Context in readme.md and doc/documentation.tex\n\n## Related Code Context in src folder\n\n"}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/einsteintoolkit_m_cactus:pr-14", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/arrangements/EinsteinEvolve/GRHydro/src/GRHydro_HLLEM.F90 b/arrangements/EinsteinEvolve/GRHydro/src/GRHydro_HLLEM.F90\nnew file mode 100644\nindex 0000000..0000000\n--- /dev/null\n+++ b/arrangements/EinsteinEvolve/GRHydro/src/GRHydro_HLLEM.F90\n@@ -0,0 +1,823 @@\n+ /*@@\n+ @file GRHydro_HLLEPolyM.F90\n+ @date Aug 30, 2010\n+ @author Joshua Faber, Scott Noble, Bruno Mundim, Ian Hawke, Pedro Montero, Toni Font\n+ @desc \n+ The HLLE solver. Called from the wrapper function, so works in \n+ all directions.\n+ @enddesc \n+ @@*/\n+ \n+#include \"cctk.h\"\n+#include \"cctk_Parameters.h\"\n+#include \"cctk_Arguments.h\"\n+#include \"cctk_Functions.h\"\n+\n+#include \"GRHydro_Macros.h\"\n+#include \"SpaceMask.h\"\n+\n+ /*@@\n+ @routine GRHydro_HLLEM\n+ @date Aug 30, 2010\n+ @author Joshua Faber, Scott Noble, Bruno Mundim, Ian Hawke, Pedro Montero, Toni Font\n+ @desc \n+ The HLLE solver. Sufficiently simple that its just one big routine.\n+ @enddesc \n+ @calls \n+ @calledby \n+ @history \n+ Altered from Cactus 3 routines originally written by Toni Font.\n+ @endhistory \n+\n+@@*/\n+\n+subroutine GRHydro_HLLEM(CCTK_ARGUMENTS)\n+ USE GRHydro_EigenproblemM\n+ USE GRHydro_Scalars\n+\n+ implicit none\n+\n+ DECLARE_CCTK_ARGUMENTS\n+ DECLARE_CCTK_PARAMETERS\n+ DECLARE_CCTK_FUNCTIONS\n+ \n+ CCTK_INT, parameter :: izero = 0\n+ integer, parameter :: ik = kind(izero)\n+\n+ integer :: i, j, k, m\n+ CCTK_REAL, dimension(8) :: cons_p,cons_m,fplus,fminus,f1,qdiff\n+ CCTK_REAL, dimension(10) :: prim_p, prim_m\n+ CCTK_REAL, dimension(5) :: lamminus,lamplus\n+ CCTK_REAL :: charmin, charmax, charpm,chartop,avg_alp,avg_det, sdet\n+ CCTK_REAL, dimension(3,3) :: gh, uh\n+ CCTK_REAL :: usendh\n+ CCTK_REAL :: rhoenth_p, rhoenth_m\n+ CCTK_REAL, dimension(3) :: avg_beta\n+ CCTK_REAL, dimension(3) :: vtp,vtm,blowp,blowm,Bveclowp,Bveclowm\n+ CCTK_REAL, dimension(3) :: vellowp,vellowm\n+ CCTK_REAL :: ab0p,ab0m,b2p,b2m,bdotvp,bdotvm\n+ CCTK_REAL :: wp,wm,v2p,v2m\n+ CCTK_REAL :: pressstarp,pressstarm\n+\n+ CCTK_REAL :: entropyconsp,entropyconsm,entropyp,entropym,entropyf,entropydiff,entropyfp,entropyfm\n+\n+ CCTK_REAL :: psidcp, psidcm, psidcf, psidcdiff, psidcfp, psidcfm\n+ CCTK_REAL :: charmax_dc, charmin_dc, charpm_dc \n+ \n+ CCTK_INT :: type_bits, trivial\n+ CCTK_REAL :: xtemp\n+\n+ integer :: ix,iy,iz\n+\n+ ! save memory when MP is not used\n+ CCTK_INT :: GRHydro_UseGeneralCoordinates\n+ CCTK_REAL, DIMENSION(cctk_ash1,cctk_ash2,cctk_ash3) :: g11, g12, g13, g22, g23, g33\n+ pointer (pg11,g11), (pg12,g12), (pg13,g13), (pg22,g22), (pg23,g23), (pg33,g33)\n+ CCTK_REAL, DIMENSION(cctk_ash1,cctk_ash2,cctk_ash3) :: beta1, beta2, beta3\n+ pointer (pbeta1,beta1), (pbeta2,beta2), (pbeta3,beta3)\n+\n+ if (GRHydro_UseGeneralCoordinates(cctkGH).ne.0) then\n+ pg11 = loc(gaa)\n+ pg12 = loc(gab)\n+ pg13 = loc(gac)\n+ pg22 = loc(gbb)\n+ pg23 = loc(gbc)\n+ pg33 = loc(gcc)\n+ pbeta1 = loc(betaa)\n+ pbeta2 = loc(betab)\n+ pbeta3 = loc(betac)\n+ else\n+ pg11 = loc(gxx)\n+ pg12 = loc(gxy)\n+ pg13 = loc(gxz)\n+ pg22 = loc(gyy)\n+ pg23 = loc(gyz)\n+ pg33 = loc(gzz)\n+ pbeta1 = loc(betax)\n+ pbeta2 = loc(betay)\n+ pbeta3 = loc(betaz)\n+ end if\n+#define gxx faulty_gxx\n+#define gxy faulty_gxy\n+#define gxz faulty_gxz\n+#define gyy faulty_gyy\n+#define gyz faulty_gyz\n+#define gzz faulty_gzz\n+#define betax faulty_betax\n+#define betay faulty_betay\n+#define betaz faulty_betaz\n+#define vel faulty_vel\n+#define Bvec faulty_Bvec\n+\n+ if (flux_direction == 1) then\n+ call SpaceMask_GetTypeBits(type_bits, \"Hydro_RiemannProblemX\")\n+ call SpaceMask_GetStateBits(trivial, \"Hydro_RiemannProblemX\", &\n+ &\"trivial\")\n+ ix = 1 ; iy = 2 ; iz = 3\n+ else if (flux_direction == 2) then\n+ call SpaceMask_GetTypeBits(type_bits, \"Hydro_RiemannProblemY\")\n+ call SpaceMask_GetStateBits(trivial, \"Hydro_RiemannProblemY\", &\n+ &\"trivial\")\n+ ix = 2 ; iy = 3 ; iz = 1\n+ else if (flux_direction == 3) then\n+ call SpaceMask_GetTypeBits(type_bits, \"Hydro_RiemannProblemZ\")\n+ call SpaceMask_GetStateBits(trivial, \"Hydro_RiemannProblemZ\", &\n+ &\"trivial\")\n+ ix = 3 ; iy = 1 ; iz = 2\n+ else\n+ call CCTK_ERROR(\"Flux direction not x,y,z\")\n+ STOP\n+ end if\n+\n+ ! constraint transport needs to be able to average fluxes in the directions\n+ ! other that flux_direction\n+\n+ !$OMP PARALLEL PRIVATE(k,j,i,f1,lamminus,lamplus,cons_p,cons_m,fplus,fminus,qdiff,psidcf,psidcp,psidcm,prim_p,prim_m,&\n+ !$OMP avg_beta,avg_alp,&\n+ !$OMP gh,avg_det,sdet,uh,&\n+ !$OMP vtp,vtm,vellowp,vellowm,Bveclowp,Bveclowm,&\n+ !$OMP bdotvp,bdotvm,b2p,b2m,v2p,v2m,wp,wm,&\n+ !$OMP blowp,blowm,&\n+ !$OMP rhoenth_p,rhoenth_m,ab0p,ab0m,pressstarp,pressstarm,&\n+ !$OMP usendh,psidcdiff,psidcfp,psidcfm,charmin,charmax,chartop,charpm,&\n+ !$OMP charmin_dc,charmax_dc,charpm_dc,m,xtemp,&\n+ !$OMP entropyconsp,entropyconsm,entropyp,entropym,entropyf,entropydiff,entropyfp,entropyfm)\n+ ! avoid compiler warnings\n+ psidcf = 0d0\n+ psidcp = 0.d0\n+ psidcm = 0d0\n+ psidcfp = 0d0\n+ psidcfm = 0d0\n+\n+ entropyf = 0d0\n+ entropyfp = 0d0\n+ entropyfm = 0d0\n+ entropyconsm = 0d0\n+ entropyconsp = 0d0\n+ !$OMP DO\n+ do k = GRHydro_stencil, cctk_lsh(3) - GRHydro_stencil + transport_constraints*(1-zoffset)\n+ do j = GRHydro_stencil, cctk_lsh(2) - GRHydro_stencil + transport_constraints*(1-yoffset)\n+ do i = GRHydro_stencil, cctk_lsh(1) - GRHydro_stencil + transport_constraints*(1-xoffset)\n+ \n+ f1 = 0.d0\n+ lamminus = 0.d0\n+ lamplus = 0.d0\n+ cons_p = 0.d0\n+ cons_m = 0.d0\n+ fplus = 0.d0\n+ fminus = 0.d0\n+ qdiff = 0.d0\n+\n+!!$ Set the left (p for plus) and right (m_i for minus, i+1) states\n+ \n+ cons_p(1) = densplus(i,j,k) \n+ cons_p(2) = sxplus(i,j,k)\n+ cons_p(3) = syplus(i,j,k)\n+ cons_p(4) = szplus(i,j,k)\n+ cons_p(5) = tauplus(i,j,k)\n+ cons_p(6) = Bconsxplus(i,j,k)\n+ cons_p(7) = Bconsyplus(i,j,k)\n+ cons_p(8) = Bconszplus(i,j,k)\n+ \n+ cons_m(1) = densminus(i+xoffset,j+yoffset,k+zoffset)\n+ cons_m(2) = sxminus(i+xoffset,j+yoffset,k+zoffset)\n+ cons_m(3) = syminus(i+xoffset,j+yoffset,k+zoffset)\n+ cons_m(4) = szminus(i+xoffset,j+yoffset,k+zoffset)\n+ cons_m(5) = tauminus(i+xoffset,j+yoffset,k+zoffset) \n+ cons_m(6) = Bconsxminus(i+xoffset,j+yoffset,k+zoffset) \n+ cons_m(7) = Bconsyminus(i+xoffset,j+yoffset,k+zoffset) \n+ cons_m(8) = Bconszminus(i+xoffset,j+yoffset,k+zoffset) \n+\n+ prim_p(1) = rhoplus(i,j,k) \n+ prim_p(2) = velxplus(i,j,k)\n+ prim_p(3) = velyplus(i,j,k) \n+ prim_p(4) = velzplus(i,j,k)\n+ prim_p(5) = epsplus(i,j,k)\n+ prim_p(6) = pressplus(i,j,k)\n+ prim_p(7) = w_lorentzplus(i,j,k)\n+ prim_p(8) = Bvecxplus(i,j,k)\n+ prim_p(9) = Bvecyplus(i,j,k) \n+ prim_p(10) = Bveczplus(i,j,k)\n+ \n+ prim_m(1) = rhominus(i+xoffset,j+yoffset,k+zoffset)\n+ prim_m(2) = velxminus(i+xoffset,j+yoffset,k+zoffset)\n+ prim_m(3) = velyminus(i+xoffset,j+yoffset,k+zoffset)\n+ prim_m(4) = velzminus(i+xoffset,j+yoffset,k+zoffset)\n+ prim_m(5) = epsminus(i+xoffset,j+yoffset,k+zoffset) \n+ prim_m(6) = pressminus(i+xoffset,j+yoffset,k+zoffset) \n+ prim_m(7) = w_lorentzminus(i+xoffset,j+yoffset,k+zoffset) \n+ prim_m(8) = Bvecxminus(i+xoffset,j+yoffset,k+zoffset) \n+ prim_m(9) = Bvecyminus(i+xoffset,j+yoffset,k+zoffset) \n+ prim_m(10)= Bveczminus(i+xoffset,j+yoffset,k+zoffset) \n+ \n+ if(clean_divergence.ne.0) then\n+ psidcp = psidcplus(i,j,k)\n+ psidcm = psidcminus(i+xoffset,j+yoffset,k+zoffset)\n+ endif\n+\n+ if(evolve_entropy.ne.0) then\n+ entropyp = entropyplus(i,j,k)\n+ entropym = entropyminus(i+xoffset,j+yoffset,k+zoffset)\n+ entropyconsp = entropyconsplus(i,j,k)\n+ entropyconsm = entropyconsminus(i+xoffset,j+yoffset,k+zoffset)\n+ endif\n+\n+!!$ Calculate various metric terms here.\n+!!$ Note also need the average of the lapse at the \n+!!$ left and right points.\n+!!$ \n+!!$ In MHD, we need all three shift components regardless of the flux direction\n+\n+ avg_beta(1) = 0.5d0 * (beta1(i+xoffset,j+yoffset,k+zoffset) + &\n+ beta1(i,j,k))\n+ avg_beta(2) = 0.5d0 * (beta2(i+xoffset,j+yoffset,k+zoffset) + &\n+ beta2(i,j,k))\n+ avg_beta(3) = 0.5d0 * (beta3(i+xoffset,j+yoffset,k+zoffset) + &\n+ beta3(i,j,k))\n+\n+ avg_alp = 0.5 * (alp(i,j,k) + alp(i+xoffset,j+yoffset,k+zoffset))\n+ \n+ gh(1,1) = 0.5d0 * (g11(i+xoffset,j+yoffset,k+zoffset) + g11(i,j,k))\n+ gh(1,2) = 0.5d0 * (g12(i+xoffset,j+yoffset,k+zoffset) + g12(i,j,k))\n+ gh(1,3) = 0.5d0 * (g13(i+xoffset,j+yoffset,k+zoffset) + g13(i,j,k))\n+ gh(2,2) = 0.5d0 * (g22(i+xoffset,j+yoffset,k+zoffset) + g22(i,j,k))\n+ gh(2,3) = 0.5d0 * (g23(i+xoffset,j+yoffset,k+zoffset) + g23(i,j,k))\n+ gh(3,3) = 0.5d0 * (g33(i+xoffset,j+yoffset,k+zoffset) + g33(i,j,k))\n+ gh(2,1) = gh(1,2) ; gh(3,1) = gh(1,3) ; gh(3,2) = gh(2,3)\n+\n+ avg_det = SPATIAL_DETERMINANT(gh(1,1),gh(1,2),gh(1,3),gh(2,2),gh(2,3),gh(3,3))\n+ sdet = sqrt(avg_det)\n+\n+ call UpperMetric(uh(1,1), uh(1,2), uh(1,3), uh(2,2), uh(2,3), uh(3,3), &\n+ avg_det,gh(1,1), gh(1,2), gh(1,3), &\n+ gh(2,2), gh(2,3), gh(3,3))\n+ uh(2,1) = uh(1,2) ; uh(3,1) = uh(1,3) ; uh(3,2) = uh(2,3)\n+ \n+\n+ vtp(1) = prim_p(2)-avg_beta(1)/avg_alp\n+ vtp(2) = prim_p(3)-avg_beta(2)/avg_alp\n+ vtp(3) = prim_p(4)-avg_beta(3)/avg_alp\n+ vtm(1) = prim_m(2)-avg_beta(1)/avg_alp\n+ vtm(2) = prim_m(3)-avg_beta(2)/avg_alp\n+ vtm(3) = prim_m(4)-avg_beta(3)/avg_alp\n+\n+ call calc_vlow_blow(gh(1,1),gh(1,2),gh(1,3),gh(2,2),gh(2,3),gh(3,3), &\n+ prim_p(2),prim_p(3),prim_p(4),prim_p(8),prim_p(9),prim_p(10), &\n+ vellowp(1),vellowp(2),vellowp(3),Bveclowp(1),Bveclowp(2),Bveclowp(3), &\n+ bdotvp,b2p,v2p,wp,blowp(1),blowp(2),blowp(3))\n+ call calc_vlow_blow(gh(1,1),gh(1,2),gh(1,3),gh(2,2),gh(2,3),gh(3,3), &\n+ prim_m(2),prim_m(3),prim_m(4),prim_m(8),prim_m(9),prim_m(10), &\n+ vellowm(1),vellowm(2),vellowm(3),Bveclowm(1),Bveclowm(2),Bveclowm(3), &\n+ bdotvm,b2m,v2m,wm,blowm(1),blowm(2),blowm(3))\n+\n+ rhoenth_p = prim_p(1)*(1.d0+prim_p(5))+prim_p(6)\n+ rhoenth_m = prim_m(1)*(1.d0+prim_m(5))+prim_m(6)\n+ \n+ ab0p = wp*bdotvp\n+ ab0m = wm*bdotvm\n+\n+!!$ p^* = p+b^2/2 in Anton et al.\n+ pressstarp = prim_p(6)+0.5d0*b2p\n+ pressstarm = prim_m(6)+0.5d0*b2m \n+\n+\n+!!$ If the Riemann problem is trivial, just calculate the fluxes from the \n+!!$ left state and skip to the next cell\n+ \n+ if (SpaceMask_CheckStateBitsF90(space_mask, i, j, k, type_bits, trivial)) then\n+ \n+!!$ we now pass in the B-field as conserved and flux, the vtilde's instead of v's,\n+!!$ pressstar instead of P, b_i, alp b^0, w, metric determinant, \n+!!$ alp, and beta in the flux dir\n+\n+ call num_x_fluxM(cons_p(1),cons_p(1+ix),cons_p(1+iy),cons_p(1+iz),&\n+ cons_p(5),cons_p(5+ix),cons_p(5+iy),cons_p(5+iz),&\n+ f1(1),f1(1+ix),f1(1+iy),f1(1+iz),f1(5),f1(5+ix),f1(5+iy),&\n+ f1(5+iz),&\n+ vtp(ix),vtp(iy),vtp(iz),pressstarp,blowp(ix),blowp(iy),&\n+ blowp(iz),ab0p,wp, &\n+ avg_det,avg_alp,avg_beta(flux_direction))\n+ if(clean_divergence.ne.0) then\n+ f1(6)=f1(6) + 1.0d0*sdet*uh(flux_direction,1)*psidcp - cons_p(5+flux_direction)*avg_beta(1)/avg_alp\n+ f1(7)=f1(7) + 1.0d0*sdet*uh(flux_direction,2)*psidcp - cons_p(5+flux_direction)*avg_beta(2)/avg_alp\n+ f1(8)=f1(8) + 1.0d0*sdet*uh(flux_direction,3)*psidcp - cons_p(5+flux_direction)*avg_beta(3)/avg_alp\n+ psidcf = cons_p(5+flux_direction)/sdet-psidcp*avg_beta(flux_direction)/avg_alp\n+ endif\n+ if(evolve_entropy.ne.0) then\n+ entropyf = entropyconsp*vtp(flux_direction)\n+ endif\n+ \n+ else !!! The end of this branch is right at the bottom of the routine\n+ \n+ usendh = uh(flux_direction,flux_direction)\n+ \n+!!$ Calculate the jumps in the conserved variables\n+ \n+ qdiff = cons_m - cons_p\n+\n+ if (clean_divergence.ne.0) then\n+ psidcdiff = psidcm - psidcp\n+ endif\n+ if(evolve_entropy.ne.0) then\n+ entropydiff = entropyconsm - entropyconsp\n+ endif\n+\n+!!$ Eigenvalues and fluxes either side of the cell interface\n+ \n+ if(evolve_temper.ne.1) then\n+ call eigenvaluesM(GRHydro_eos_handle,&\n+ prim_m(1),prim_m(1+ix),prim_m(1+iy),prim_m(1+iz),prim_m(5),prim_m(6),prim_m(7), &\n+ prim_m(7+ix),prim_m(7+iy),prim_m(7+iz),&\n+ lamminus,gh(1,1),gh(1,2),gh(1,3),gh(2,2),gh(2,3),gh(3,3),&\n+ usendh,avg_alp,avg_beta(flux_direction))\n+ call eigenvaluesM(GRHydro_eos_handle,&\n+ prim_p(1),prim_p(1+ix),prim_p(1+iy),prim_p(1+iz),prim_p(5),prim_p(6),prim_p(7), &\n+ prim_p(7+ix),prim_p(7+iy),prim_p(7+iz),&\n+ lamplus,gh(1,1),gh(1,2),gh(1,3),gh(2,2),gh(2,3),gh(3,3),&\n+ usendh,avg_alp,avg_beta(flux_direction))\n+ else\n+ xtemp = temperature(i,j,k)\n+ call eigenvaluesM_hot(GRHydro_eos_handle,&\n+ int(i,ik),int(j,ik),int(k,ik),&\n+ prim_m(1),prim_m(1+ix),prim_m(1+iy),prim_m(1+iz),prim_m(5),prim_m(6),prim_m(7), &\n+ prim_m(7+ix),prim_m(7+iy),prim_m(7+iz),&\n+ xtemp,y_e_minus(i+xoffset,j+yoffset,k+zoffset),&\n+ lamminus,gh(1,1),gh(1,2),gh(1,3),gh(2,2),gh(2,3),gh(3,3),&\n+ usendh,avg_alp,avg_beta(flux_direction))\n+ xtemp = temperature(i,j,k)\n+ call eigenvaluesM_hot(GRHydro_eos_handle,&\n+ int(i,ik),int(j,ik),int(k,ik),&\n+ prim_p(1),prim_p(1+ix),prim_p(1+iy),prim_p(1+iz),prim_p(5),prim_p(6),prim_p(7), &\n+ prim_p(7+ix),prim_p(7+iy),prim_p(7+iz),&\n+ xtemp,y_e_plus(i,j,k),&\n+ lamplus,gh(1,1),gh(1,2),gh(1,3),gh(2,2),gh(2,3),gh(3,3),&\n+ usendh,avg_alp,avg_beta(flux_direction))\n+ endif \n+\n+ call num_x_fluxM(cons_p(1),cons_p(1+ix),cons_p(1+iy),cons_p(1+iz),&\n+ cons_p(5),&\n+ cons_p(5+ix),cons_p(5+iy),cons_p(5+iz),&\n+ fplus(1),fplus(1+ix),fplus(1+iy),fplus(1+iz),fplus(5),&\n+ fplus(5+ix),fplus(5+iy),fplus(5+iz),&\n+ vtp(ix),vtp(iy),vtp(iz),pressstarp,blowp(ix),blowp(iy),&\n+ blowp(iz),ab0p,wp, &\n+ avg_det,avg_alp,avg_beta(flux_direction))\n+ call num_x_fluxM(cons_m(1),cons_m(1+ix),cons_m(1+iy),cons_m(1+iz),&\n+ cons_m(5),&\n+ cons_m(5+ix),cons_m(5+iy),cons_m(5+iz),&\n+ fminus(1),fminus(1+ix),fminus(1+iy),fminus(1+iz),fminus(5),&\n+ fminus(5+ix),fminus(5+iy),fminus(5+iz),&\n+ vtm(ix),vtm(iy),vtm(iz),pressstarm,blowm(ix),blowm(iy),&\n+ blowm(iz),ab0m,wm, &\n+ avg_det,avg_alp,avg_beta(flux_direction))\n+\n+ if(clean_divergence.ne.0) then\n+ fminus(6)=fminus(6) + 1.0d0*sdet*uh(flux_direction,1)*psidcm - cons_m(5+flux_direction)*avg_beta(1)/avg_alp\n+ fminus(7)=fminus(7) + 1.0d0*sdet*uh(flux_direction,2)*psidcm - cons_m(5+flux_direction)*avg_beta(2)/avg_alp\n+ fminus(8)=fminus(8) + 1.0d0*sdet*uh(flux_direction,3)*psidcm - cons_m(5+flux_direction)*avg_beta(3)/avg_alp\n+ fplus(6)=fplus(6) + 1.0d0*sdet*uh(flux_direction,1)*psidcp - cons_p(5+flux_direction)*avg_beta(1)/avg_alp\n+ fplus(7)=fplus(7) + 1.0d0*sdet*uh(flux_direction,2)*psidcp - cons_p(5+flux_direction)*avg_beta(2)/avg_alp\n+ fplus(8)=fplus(8) + 1.0d0*sdet*uh(flux_direction,3)*psidcp - cons_p(5+flux_direction)*avg_beta(3)/avg_alp\n+ psidcfp = cons_p(5+flux_direction)/sdet-avg_beta(flux_direction)*psidcp/avg_alp\n+ psidcfm = cons_m(5+flux_direction)/sdet-avg_beta(flux_direction)*psidcm/avg_alp\n+ endif\n+ if(evolve_entropy.ne.0) then\n+ entropyfp = entropyconsp*vtp(flux_direction)\n+ entropyfm = entropyconsm*vtm(flux_direction)\n+ endif\n+\n+!!$ Find minimum and maximum wavespeeds\n+ \n+ charmin = min(0.d0, lamplus(1), lamplus(2), lamplus(3), &\n+ lamplus(4),lamplus(5), lamminus(1),lamminus(2),lamminus(3),&\n+ lamminus(4),lamminus(5)) \n+ \n+ charmax = max(0.d0, lamplus(1), lamplus(2), lamplus(3), &\n+ lamplus(4),lamplus(5), lamminus(1),lamminus(2),lamminus(3),&\n+ lamminus(4),lamminus(5))\n+\n+ chartop = max(-charmin,charmax)\n+ \n+ charpm = charmax - charmin\n+\n+!!$ Calculate flux by standard formula\n+ \n+ do m = 1,8 \n+ \n+ qdiff(m) = cons_m(m) - cons_p(m)\n+ \n+ if (HLLE) then\n+ f1(m) = (charmax * fplus(m) - charmin * fminus(m) + &\n+ charmax * charmin * qdiff(m)) / charpm\n+ else if (LLF) then\n+ f1(m) = 0.5d0 * (fplus(m) + fminus(m) - chartop * qdiff(m)) \n+ end if \n+ \n+ end do\n+\n+ if(clean_divergence.ne.0) then\n+\n+ psidcdiff = psidcm - psidcp\n+ select case(whichpsidcspeed)\n+ case(0)\n+ if (HLLE) then\n+ psidcf = (charmax * psidcfp - charmin * psidcfm + &\n+ charmax * charmin * psidcdiff) / charpm\n+ else if (LLF) then\n+ psidcf = 0.5d0 * (psidcfp + psidcfm - chartop * psidcdiff)\n+ end if\n+ case(1)\n+ !!$ Wavespeeds for psidc are +/-c, not Fast Magnetosonic?\n+ !!$ psidcf = 0.5d0 * (1.d0 * psidcfp - (-1.d0) * psidcfm + &\n+ !!$ 1.d0 * (-1.d0) * psidcdiff) \n+\n+ !!$ The fastest speed for psidc comes from the condition\n+ !!$ that the normal vector to the characteristic hypersurface\n+ !!$ be spacelike (Eq. 60 of Anton et al.)\n+\n+ charmax_dc = sqrt(usendh) - avg_beta(flux_direction)/avg_alp\n+ charmin_dc = -1.d0*sqrt(usendh) - avg_beta(flux_direction)/avg_alp\n+ charpm_dc = charmax_dc - charmin_dc\n+\n+ psidcf = (charmax_dc * psidcfp - charmin_dc * psidcfm + &\n+ charmax_dc * charmin_dc * psidcdiff) / charpm_dc\n+\n+ if(decouple_normal_Bfield .ne. 0) then ! same expression for HLLE and LLF\n+ !!$ B^i field decouples from the others and has same propagation\n+ !!$ speed as divergence -null direction, \n+ !!$ \\pm sqrt(g^{xx}} - beta^x/alpha\n+ f1(5+flux_direction) = (charmax_dc * fplus(5+flux_direction) &\n+ - charmin_dc * fminus(5+flux_direction) + &\n+ charmax_dc * charmin_dc * qdiff(5+flux_direction)) / charpm_dc\n+ end if\n+ case(2)\n+ charmax = setcharmax\n+ charmin = setcharmin\n+ if (HLLE) then\n+ psidcf = (charmax * psidcfp - charmin * psidcfm + &\n+ charmax * charmin * psidcdiff) / charpm\n+ else if (LLF) then\n+ chartop = max(-charmin,charmax)\n+ psidcf = 0.5d0 * (psidcfp + psidcfm - chartop * psidcdiff)\n+ end if\n+ end select\n+ endif\n+ \n+ if(evolve_entropy.ne.0) then\n+ entropydiff = entropyconsm - entropyconsp\n+ if (HLLE) then\n+ entropyf = (charmax * entropyfp - charmin * entropyfm + &\n+ charmax * charmin * entropydiff) / charpm\n+ else if (LLF) then\n+ entropyf = 0.5d0 * (entropyfp + entropyfm - chartop * entropydiff) \n+ end if \n+ endif\n+ \n+ \n+\n+ end if !!! The end of the SpaceMask check for a trivial RP.\n+ \n+ densflux(i, j, k) = f1(1)\n+ sxflux(i, j, k) = f1(2)\n+ syflux(i, j, k) = f1(3)\n+ szflux(i, j, k) = f1(4)\n+ tauflux(i, j, k) = f1(5)\n+\n+ Bconsxflux(i, j, k) = f1(6)\n+ Bconsyflux(i, j, k) = f1(7)\n+ Bconszflux(i, j, k) = f1(8)\n+\n+ if(clean_divergence.ne.0) then\n+ psidcflux(i,j,k) = psidcf\n+ endif\n+\n+ if(evolve_entropy.ne.0) then\n+ entropyflux(i,j,k) = entropyf\n+ endif\n+\n+ if(evolve_Y_e.ne.0) then\n+ if (densflux(i, j, k) > 0.d0) then\n+ Y_e_con_flux(i, j, k) = &\n+ Y_e_plus(i, j, k) * &\n+ densflux(i, j, k)\n+ else\n+ Y_e_con_flux(i, j, k) = &\n+ Y_e_minus(i + xoffset, j + yoffset, k + zoffset) * &\n+ densflux(i, j, k)\n+ endif\n+ endif\n+\n+ end do\n+ end do\n+ end do\n+ !$OMP END DO\n+ !$OMP END PARALLEL\n+#undef faulty_gxx\n+#undef faulty_gxy\n+#undef faulty_gxz\n+#undef faulty_gyy\n+#undef faulty_gyz\n+#undef faulty_gzz\n+#undef faulty_betax\n+#undef faulty_betay\n+#undef faulty_betaz\n+#undef faulty_vel\n+#undef faulty_Bvec\n+ \n+end subroutine GRHydro_HLLEM\n+\n+ /*@@\n+ @routine GRHydro_HLLE_TracerM\n+ @date Aug 30, 2010\n+ @author Joshua Faber, Scott Noble, Bruno Mundim, Ian Hawke\n+ @desc \n+ HLLE just for the tracer.\n+ @enddesc \n+ @calls \n+ @calledby \n+ @history \n+ \n+ @endhistory \n+\n+@@*/\n+\n+subroutine GRHydro_HLLE_TracerM(CCTK_ARGUMENTS)\n+\n+ USE GRHydro_EigenproblemM\n+\n+ implicit none\n+ \n+ DECLARE_CCTK_ARGUMENTS\n+ DECLARE_CCTK_PARAMETERS\n+ DECLARE_CCTK_FUNCTIONS\n+ \n+ integer :: i, j, k, m\n+ CCTK_REAL, dimension(number_of_tracers) :: cons_p,cons_m,fplus,fminus,f1\n+ CCTK_REAL, dimension(5) :: lamminus,lamplus\n+ CCTK_REAL, dimension(number_of_tracers) :: qdiff\n+ CCTK_REAL, dimension(7) :: prim_p, prim_m\n+ CCTK_REAL, dimension(3) :: mag_p, mag_m\n+ CCTK_REAL :: charmin, charmax, charpm,avg_alp,avg_det\n+ CCTK_REAL :: gxxh, gxyh, gxzh, gyyh, gyzh, gzzh, uxxh, uxyh, &\n+ uxzh, uyyh, uyzh, uzzh, avg_beta, usendh\n+ CCTK_REAL :: b2p,b2m\n+ \n+ CCTK_INT :: type_bits, trivial\n+\n+ ! save memory when MP is not used\n+ CCTK_INT :: GRHydro_UseGeneralCoordinates\n+ CCTK_REAL, DIMENSION(cctk_ash1,cctk_ash2,cctk_ash3) :: g11, g12, g13, g22, g23, g33\n+ pointer (pg11,g11), (pg12,g12), (pg13,g13), (pg22,g22), (pg23,g23), (pg33,g33)\n+ CCTK_REAL, DIMENSION(cctk_ash1,cctk_ash2,cctk_ash3) :: beta1, beta2, beta3\n+ pointer (pbeta1,beta1), (pbeta2,beta2), (pbeta3,beta3)\n+\n+ if (GRHydro_UseGeneralCoordinates(cctkGH).ne.0) then\n+ pg11 = loc(gaa)\n+ pg12 = loc(gab)\n+ pg13 = loc(gac)\n+ pg22 = loc(gbb)\n+ pg23 = loc(gbc)\n+ pg33 = loc(gcc)\n+ pbeta1 = loc(betaa)\n+ pbeta2 = loc(betab)\n+ pbeta3 = loc(betac)\n+ else\n+ pg11 = loc(gxx)\n+ pg12 = loc(gxy)\n+ pg13 = loc(gxz)\n+ pg22 = loc(gyy)\n+ pg23 = loc(gyz)\n+ pg33 = loc(gzz)\n+ pbeta1 = loc(betax)\n+ pbeta2 = loc(betay)\n+ pbeta3 = loc(betaz)\n+ end if\n+#define gxx faulty_gxx\n+#define gxy faulty_gxy\n+#define gxz faulty_gxz\n+#define gyy faulty_gyy\n+#define gyz faulty_gyz\n+#define gzz faulty_gzz\n+#define betax faulty_betax\n+#define betay faulty_betay\n+#define betaz faulty_betaz\n+#define vel faulty_vel\n+#define Bvec faulty_Bvec\n+\n+ if (flux_direction == 1) then\n+ call SpaceMask_GetTypeBits(type_bits, \"Hydro_RiemannProblemX\")\n+ call SpaceMask_GetStateBits(trivial, \"Hydro_RiemannProblemX\", &\n+ &\"trivial\")\n+ else if (flux_direction == 2) then\n+ call SpaceMask_GetTypeBits(type_bits, \"Hydro_RiemannProblemY\")\n+ call SpaceMask_GetStateBits(trivial, \"Hydro_RiemannProblemY\", &\n+ &\"trivial\")\n+ else if (flux_direction == 3) then\n+ call SpaceMask_GetTypeBits(type_bits, \"Hydro_RiemannProblemZ\")\n+ call SpaceMask_GetStateBits(trivial, \"Hydro_RiemannProblemZ\", &\n+ &\"trivial\")\n+ else\n+ call CCTK_ERROR(\"Flux direction not x,y,z\")\n+ STOP\n+ end if\n+\n+ do k = GRHydro_stencil, cctk_lsh(3) - GRHydro_stencil\n+ do j = GRHydro_stencil, cctk_lsh(2) - GRHydro_stencil\n+ do i = GRHydro_stencil, cctk_lsh(1) - GRHydro_stencil\n+ \n+ f1 = 0.d0\n+ lamminus = 0.d0\n+ lamplus = 0.d0\n+ cons_p = 0.d0\n+ cons_m = 0.d0\n+ mag_p = 0.d0\n+ mag_m = 0.d0\n+ fplus = 0.d0\n+ fminus = 0.d0\n+ qdiff = 0.d0\n+ \n+!!$ Set the left (p for plus) and right (m_i for minus, i+1) states\n+ \n+ cons_p(:) = cons_tracerplus(i,j,k,:) \n+ cons_m(:) = cons_tracerminus(i+xoffset,j+yoffset,k+zoffset,:)\n+ \n+ mag_p(1) = Bvecxplus(i,j,k)\n+ mag_p(2) = Bvecyplus(i,j,k)\n+ mag_p(3) = Bveczplus(i,j,k)\n+\n+ mag_m(1) = Bvecxminus(i+xoffset,j+yoffset,k+zoffset)\n+ mag_m(2) = Bvecyminus(i+xoffset,j+yoffset,k+zoffset)\n+ mag_m(3) = Bveczminus(i+xoffset,j+yoffset,k+zoffset)\n+\n+ prim_p(1) = rhoplus(i,j,k) \n+ prim_p(2) = velxplus(i,j,k)\n+ prim_p(3) = velyplus(i,j,k) \n+ prim_p(4) = velzplus(i,j,k)\n+ prim_p(5) = epsplus(i,j,k)\n+ prim_p(6) = pressplus(i,j,k)\n+ prim_p(7) = w_lorentzplus(i,j,k)\n+ \n+ prim_m(1) = rhominus(i+xoffset,j+yoffset,k+zoffset)\n+ prim_m(2) = velxminus(i+xoffset,j+yoffset,k+zoffset)\n+ prim_m(3) = velyminus(i+xoffset,j+yoffset,k+zoffset)\n+ prim_m(4) = velzminus(i+xoffset,j+yoffset,k+zoffset)\n+ prim_m(5) = epsminus(i+xoffset,j+yoffset,k+zoffset) \n+ prim_m(6) = pressminus(i+xoffset,j+yoffset,k+zoffset) \n+ prim_m(7) = w_lorentzminus(i+xoffset,j+yoffset,k+zoffset) \n+ \n+!!$ Calculate various metric terms here.\n+!!$ Note also need the average of the lapse at the \n+!!$ left and right points.\n+\n+ if (flux_direction == 1) then\n+ avg_beta = 0.5d0 * (beta1(i+xoffset,j+yoffset,k+zoffset) + &\n+ beta1(i,j,k))\n+ else if (flux_direction == 2) then\n+ avg_beta = 0.5d0 * (beta2(i+xoffset,j+yoffset,k+zoffset) + &\n+ beta2(i,j,k))\n+ else if (flux_direction == 3) then\n+ avg_beta = 0.5d0 * (beta3(i+xoffset,j+yoffset,k+zoffset) + &\n+ beta3(i,j,k))\n+ else\n+ call CCTK_ERROR(\"Flux direction not x,y,z\")\n+ STOP\n+ end if\n+\n+ avg_alp = 0.5 * (alp(i,j,k) + alp(i+xoffset,j+yoffset,k+zoffset))\n+ \n+ gxxh = 0.5d0 * (g11(i+xoffset,j+yoffset,k+zoffset) + g11(i,j,k))\n+ gxyh = 0.5d0 * (g12(i+xoffset,j+yoffset,k+zoffset) + g12(i,j,k))\n+ gxzh = 0.5d0 * (g13(i+xoffset,j+yoffset,k+zoffset) + g13(i,j,k))\n+ gyyh = 0.5d0 * (g22(i+xoffset,j+yoffset,k+zoffset) + g22(i,j,k))\n+ gyzh = 0.5d0 * (g23(i+xoffset,j+yoffset,k+zoffset) + g23(i,j,k))\n+ gzzh = 0.5d0 * (g33(i+xoffset,j+yoffset,k+zoffset) + g33(i,j,k))\n+\n+ avg_det = SPATIAL_DETERMINANT(gxxh,gxyh,gxzh,gyyh,gyzh,gzzh)\n+\n+ call UpperMetric(uxxh, uxyh, uxzh, uyyh, uyzh, uzzh, &\n+ avg_det,gxxh, gxyh, gxzh, &\n+ gyyh, gyzh, gzzh)\n+ \n+ if (flux_direction == 1) then\n+ usendh = uxxh\n+ else if (flux_direction == 2) then\n+ usendh = uyyh\n+ else if (flux_direction == 3) then\n+ usendh = uzzh\n+ else\n+ call CCTK_ERROR(\"Flux direction not x,y,z\")\n+ STOP\n+ end if\n+\n+!!$ b^2 = (1-v^2)B^2+(B dot v)^2 \n+ b2p=DOTP2(gxxh,gxyh,gxzh,gyyh,gyzh,gzzh,mag_p(1),mag_p(2),mag_p(3))/prim_p(7)**2 + &\n+ (DOTP(gxxh,gxyh,gxzh,gyyh,gyzh,gzzh,prim_p(2),prim_p(3),prim_p(4),mag_p(1),mag_p(2),mag_p(3)))**2\n+ b2m=DOTP2(gxxh,gxyh,gxzh,gyyh,gyzh,gzzh,mag_m(1),mag_m(2),mag_m(3))/prim_m(7)**2 + &\n+ (DOTP(gxxh,gxyh,gxzh,gyyh,gyzh,gzzh,prim_m(2),prim_m(3),prim_m(4),mag_m(1),mag_m(2),mag_m(3)))**2\n+ \n+!!$ Calculate the jumps in the conserved variables\n+ \n+ qdiff = cons_m - cons_p\n+ \n+!!$ Eigenvalues and fluxes either side of the cell interface\n+ \n+ if (flux_direction == 1) then\n+ call eigenvaluesM(GRHydro_eos_handle,&\n+ prim_m(1),prim_m(2),prim_m(3),prim_m(4),prim_m(5),prim_m(6),prim_m(7), &\n+ mag_m(1),mag_m(2),mag_m(3),&\n+ lamminus,gxxh,gxyh,gxzh,gyyh,gyzh,gzzh,&\n+ usendh,avg_alp,avg_beta) \n+ call eigenvaluesM(GRHydro_eos_handle, &\n+ prim_p(1),prim_p(2),prim_p(3),prim_p(4),prim_p(5),prim_p(6),prim_p(7), &\n+ mag_p(1),mag_p(2),mag_p(3),&\n+ lamplus,gxxh,gxyh,gxzh,gyyh,gyzh,gzzh,&\n+ usendh,avg_alp,avg_beta)\n+ fplus(:) = (velxplus(i,j,k) - avg_beta / avg_alp) * &\n+ cons_tracerplus(i,j,k,:)\n+ fminus(:) = (velxminus(i+xoffset,j+yoffset,k+zoffset) - avg_beta / avg_alp) * &\n+ cons_tracerminus(i+xoffset,j+yoffset,k+zoffset,:)\n+ else if (flux_direction == 2) then\n+ call eigenvaluesM(GRHydro_eos_handle,&\n+ prim_m(1),prim_m(3),prim_m(4),prim_m(2),prim_m(5),prim_m(6),prim_m(7), &\n+ mag_m(2),mag_m(3),mag_m(1),&\n+ lamminus,gyyh,gyzh,gxyh,gzzh,gxzh,gxxh,&\n+ usendh,avg_alp,avg_beta) \n+ call eigenvaluesM(GRHydro_eos_handle, &\n+ prim_p(1),prim_p(3),prim_p(4),prim_p(2),prim_p(5),prim_p(6),prim_p(7), &\n+ mag_p(2),mag_p(3),mag_p(1),&\n+ lamplus,gyyh,gyzh,gxyh,gzzh,gxzh,gxxh,&\n+ usendh,avg_alp,avg_beta)\n+ fplus(:) = (velyplus(i,j,k) - avg_beta / avg_alp) * &\n+ cons_tracerplus(i,j,k,:)\n+ fminus(:) = (velyminus(i+xoffset,j+yoffset,k+zoffset) - avg_beta / avg_alp) * &\n+ cons_tracerminus(i+xoffset,j+yoffset,k+zoffset,:)\n+ else if (flux_direction == 3) then\n+ call eigenvaluesM(GRHydro_eos_handle,&\n+ prim_m(1),prim_m(4),prim_m(2),prim_m(3),prim_m(5),prim_m(6),prim_m(7), &\n+ mag_m(3),mag_m(1),mag_m(2),&\n+ lamminus,gzzh,gxzh,gyzh,gxxh,gxyh,gyyh,&\n+ usendh,avg_alp,avg_beta) \n+ call eigenvaluesM(GRHydro_eos_handle,&\n+ prim_p(1),prim_p(4),prim_p(2),prim_p(3),prim_p(5),prim_p(6),prim_p(7), &\n+ mag_p(3),mag_p(1),mag_p(2),&\n+ lamplus,gzzh,gxzh,gyzh,gxxh,gxyh,gyyh,&\n+ usendh,avg_alp,avg_beta)\n+ fplus(:) = (velzplus(i,j,k) - avg_beta / avg_alp) * &\n+ cons_tracerplus(i,j,k,:)\n+ fminus(:) = (velzminus(i+xoffset,j+yoffset,k+zoffset) - avg_beta / avg_alp) * &\n+ cons_tracerminus(i+xoffset,j+yoffset,k+zoffset,:)\n+ else\n+ call CCTK_ERROR(\"Flux direction not x,y,z\")\n+ STOP\n+ end if\n+ \n+!!$ Find minimum and maximum wavespeeds\n+ \n+ charmin = min(0.d0, lamplus(1), lamplus(2), lamplus(3), &\n+ lamplus(4),lamplus(5), lamminus(1),lamminus(2),lamminus(3),&\n+ lamminus(4),lamminus(5)) \n+ \n+ charmax = max(0.d0, lamplus(1), lamplus(2), lamplus(3), &\n+ lamplus(4),lamplus(5), lamminus(1),lamminus(2),lamminus(3),&\n+ lamminus(4),lamminus(5))\n+ \n+ charpm = charmax - charmin\n+ \n+!!$ Calculate flux by standard formula\n+ \n+ do m = 1,number_of_tracers\n+ \n+ qdiff(m) = cons_m(m) - cons_p(m)\n+ \n+ f1(m) = (charmax * fplus(m) - charmin * fminus(m) + &\n+ charmax * charmin * qdiff(m)) / charpm\n+ \n+ end do\n+ \n+ cons_tracerflux(i, j, k,:) = f1(:)\n+!!$\n+!!$ if ( ((flux_direction.eq.3).and.(i.eq.4).and.(j.eq.4)).or.&\n+!!$ ((flux_direction.eq.2).and.(i.eq.4).and.(k.eq.4)).or.&\n+!!$ ((flux_direction.eq.1).and.(j.eq.4).and.(k.eq.4))&\n+!!$ ) then\n+!!$ write(*,*) flux_direction, i, j, k, f1(1), cons_m(1), cons_p(1)\n+!!$ end if\n+ \n+ end do\n+ end do\n+end do\n+#undef faulty_gxx\n+#undef faulty_gxy\n+#undef faulty_gxz\n+#undef faulty_gyy\n+#undef faulty_gyz\n+#undef faulty_gzz\n+#undef faulty_betax\n+#undef faulty_betay\n+#undef faulty_betaz\n+#undef faulty_vel\n+#undef faulty_Bvec\n+\n+\n+end subroutine GRHydro_HLLE_TracerM\n+"}, "test": {"test_patch": "diff --git a/all_tests.txt b/all_tests.txt\nnew file mode 100644\nindex 0000000..0000000\n--- /dev/null\n+++ b/all_tests.txt\n@@ -0,0 +1,10 @@\n+GRHydro_test_shock\n+GRHydro_test_shock_mp5\n+GRHydro_test_shock_ppm\n+GRHydro_test_tov_ppm_ML\n+GRHydro_test_tov_ppm_ML_disable_internal_excision\n+GRHydro_test_tov_ppm_no_trp_ML\n+test_one_hybrid\n+tov_carpetevolutionmask\n+tov_carpetevolutionmask2\n+tov_slowsector", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}7{"question_id": "MSB_einsteintoolkit_Cactus_pr15", "question_type": "multi_swe_bench", "description": "Add missing GRHydro_Tmunu.F90 in EinsteinEvolve/GRHydro (einsteintoolkit/Cactus#15)", "content": {"org": "einsteintoolkit", "repo": "Cactus", "pr_number": 15, "issue_title": "Add missing GRHydro_Tmunu.F90 in EinsteinEvolve/GRHydro", "issue_body": "This PR adds the missing source file GRHydro_Tmunu.F90 to complete the EinsteinEvolve/GRHydro thorn implementation.", "base_commit": "HEAD", "resolved_issues": [{"number": 15, "title": "Implement the full functionality of GRHydro", "body": "Please implement the full functionality of `GRHydro` by finishing the code in `GRHydro_Tmunu.F90`.\n\n## Thorn Information:\n- Name: GRHydro\n- Target file: GRHydro_Tmunu.F90\n\n## Interface Definition in interface.ccl:\n\n## Schedule Definition in schedule.ccl:\n\n## Parameters Definition in param.ccl:\n\n## Configuration Definition in configuration.ccl:\n\n## Documentation Context in readme.md and doc/documentation.tex\n\n## Related Code Context in src folder\n\n"}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/einsteintoolkit_m_cactus:pr-15", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/arrangements/EinsteinEvolve/GRHydro/src/GRHydro_Tmunu.F90 b/arrangements/EinsteinEvolve/GRHydro/src/GRHydro_Tmunu.F90\nnew file mode 100644\nindex 0000000..0000000\n--- /dev/null\n+++ b/arrangements/EinsteinEvolve/GRHydro/src/GRHydro_Tmunu.F90\n@@ -0,0 +1,159 @@\n+ /*@@\n+ @file GRHydro_Tmunu.F90\n+ @date Thu Apr 16 19:38:40 2009\n+ @author Ian Hawke\n+ @histpry\n+ Apr. 2009: Luca Baiotti copied and adapted for the Tmunu-thorn mechanism the original include file\n+ @desc \n+ The calculation of the stress energy tensor.\n+ The version used here was worked out by Miguel Alcubierre. I\n+ think it was an extension of the routine from GR3D, written\n+ by Mark Miller.\n+ C version added by Ian Hawke.\n+\n+ Lower components of the stress-energy tensor obtained from\n+ the hydro variables. The components are given by:\n+\n+ T = rho h u u + P g\n+ mu nu mu nu mu nu\n+\n+ where rho is the energy density of the fluid, h the enthalpy\n+ and P the pressure. The enthalpy is given in terms of the\n+ basic variables as:\n+\n+ h = 1 + e + P/rho\n+\n+ with e the internal energy (eps here).\n+\n+ In the expresion for T_{mu,nu} we also have the four-velocity\n+ of the fluid given by (v_i is the 3-velocity field):\n+\n+ i\n+ u = W ( - alpha + v beta )\n+ 0 i\n+\n+ u = W v\n+ i i\n+ i -1/2\n+ with W the Lorentz factor: W = ( 1 - v v )\n+ i\n+\n+ and where alpha and beta are the lapse and shift vector.\n+\n+ Finally, the 4 metric is given by\n+\n+ 2 i\n+ g = - alpha + beta beta\n+ 00 i\n+\n+ g = beta\n+ 0i i\n+\n+\n+ g = gamma (the spatial metric)\n+ ij ij\n+\n+\n+ @enddesc \n+ @@*/\n+#include \"cctk.h\"\n+#include \"cctk_Arguments.h\"\n+#include \"cctk_Parameters.h\"\n+#include \"cctk_Functions.h\"\n+#include \"SpaceMask.h\"\n+\n+#define velx(i,j,k) vel(i,j,k,1)\n+#define vely(i,j,k) vel(i,j,k,2)\n+#define velz(i,j,k) vel(i,j,k,3)\n+\n+ subroutine GRHydro_Tmunu(CCTK_ARGUMENTS)\n+\n+ implicit none\n+\n+ DECLARE_CCTK_ARGUMENTS\n+ DECLARE_CCTK_PARAMETERS\n+ DECLARE_CCTK_FUNCTIONS\n+\n+ CCTK_REAL velxlow, velylow, velzlow\n+ CCTK_REAL betaxlow, betaylow, betazlow, beta2\n+ CCTK_REAL utlow, uxlow, uylow, uzlow\n+ CCTK_REAL rhoenthalpy\n+ CCTK_REAL ut,ux,uy,uz,bst,bsx,bsy,bsz,bs2\n+ CCTK_REAL dampfac\n+ CCTK_INT i,j,k\n+\n+!!$ Damping factor\n+ dampfac = 1.0\n+\n+ !$OMP PARALLEL DO PRIVATE(i,j,k,velxlow, velylow, velzlow,&\n+ !$OMP betaxlow, betaylow, betazlow, beta2, utlow, uxlow, uylow, uzlow,&\n+ !$OMP rhoenthalpy, ut,ux,uy,uz,bst,bsx,bsy,bsz,bs2,dampfac)\n+ do k = 1, cctk_lsh(3)\n+ do j = 1, cctk_lsh(2)\n+ do i = 1, cctk_lsh(1)\n+\n+ velxlow = gxx(i,j,k)*velx(i,j,k) + gxy(i,j,k)*vely(i,j,k) + gxz(i,j,k)*velz(i,j,k)\n+ velylow = gxy(i,j,k)*velx(i,j,k) + gyy(i,j,k)*vely(i,j,k) + gyz(i,j,k)*velz(i,j,k)\n+ velzlow = gxz(i,j,k)*velx(i,j,k) + gyz(i,j,k)*vely(i,j,k) + gzz(i,j,k)*velz(i,j,k)\n+\n+!!$ Calculate lower components and square of shift vector.\n+\n+ betaxlow = gxx(i,j,k)*betax(i,j,k) + gxy(i,j,k)*betay(i,j,k) + gxz(i,j,k)*betaz(i,j,k)\n+ betaylow = gxy(i,j,k)*betax(i,j,k) + gyy(i,j,k)*betay(i,j,k) + gyz(i,j,k)*betaz(i,j,k)\n+ betazlow = gxz(i,j,k)*betax(i,j,k) + gyz(i,j,k)*betay(i,j,k) + gzz(i,j,k)*betaz(i,j,k)\n+ \n+ beta2 = betax(i,j,k)*betaxlow + betay(i,j,k)*betaylow + betaz(i,j,k)*betazlow \n+ \n+!!$ Calculate the specific relativistic enthalpy times rho times the\n+!!$ square of the lorentz factor.\n+\n+ rhoenthalpy = w_lorentz(i,j,k)**2*(rho(i,j,k)*(1.0d0 + eps(i,j,k)) + press(i,j,k))\n+\n+!!$ Calculate lower components of 4-velocity (without the Lorent factor).\n+\n+ utlow = (-alp(i,j,k) + velx(i,j,k)*betaxlow + vely(i,j,k)*betaylow + velz(i,j,k)*betazlow)\n+\n+ uxlow = velxlow\n+ uylow = velylow\n+ uzlow = velzlow\n+\n+\n+!!$ Initialize damping factor\n+ dampfac = 1.0\n+!!$ Apply tanh blending for Tmunu.\n+ if ((Tmunu_damping_radius_min .gt. 0) .and. (r(i,j,k) .gt. Tmunu_damping_radius_min)) then\n+ ! 0.5 * (1.0 - tanh(4.0*(x-x0)/sigma0))\n+ if (r(i,j,k) .lt. Tmunu_damping_radius_max) then\n+ dampfac = 0.5d0 * (1.0d0 - tanh((8.0d0*r(i,j,k)-4.0d0*(Tmunu_damping_radius_max+Tmunu_damping_radius_min))/(Tmunu_damping_radius_max-Tmunu_damping_radius_min)))\n+ else\n+ dampfac = 0.0\n+ continue ! no need to add anything to Tmunu at the current point (it's zero anyway!)\n+ endif\n+ else\n+ dampfac = 1.0\n+ endif\n+ \n+!!$ Calculate Tmunu (the lower components!).\n+\n+ eTtt(i,j,k) = eTtt(i,j,k) + dampfac * (rhoenthalpy*utlow**2 + press(i,j,k)*(beta2 - alp(i,j,k)**2))\n+\n+ eTtx(i,j,k) = eTtx(i,j,k) + dampfac * (rhoenthalpy*utlow*uxlow + press(i,j,k)*betaxlow)\n+ eTty(i,j,k) = eTty(i,j,k) + dampfac * (rhoenthalpy*utlow*uylow + press(i,j,k)*betaylow)\n+ eTtz(i,j,k) = eTtz(i,j,k) + dampfac * (rhoenthalpy*utlow*uzlow + press(i,j,k)*betazlow)\n+\n+ eTxx(i,j,k) = eTxx(i,j,k) + dampfac * (rhoenthalpy*uxlow**2 + press(i,j,k)*gxx(i,j,k))\n+ eTyy(i,j,k) = eTyy(i,j,k) + dampfac * (rhoenthalpy*uylow**2 + press(i,j,k)*gyy(i,j,k))\n+ eTzz(i,j,k) = eTzz(i,j,k) + dampfac * (rhoenthalpy*uzlow**2 + press(i,j,k)*gzz(i,j,k))\n+ \n+ eTxy(i,j,k) = eTxy(i,j,k) + dampfac * (rhoenthalpy*uxlow*uylow + press(i,j,k)*gxy(i,j,k))\n+ eTxz(i,j,k) = eTxz(i,j,k) + dampfac * (rhoenthalpy*uxlow*uzlow + press(i,j,k)*gxz(i,j,k))\n+ eTyz(i,j,k) = eTyz(i,j,k) + dampfac * (rhoenthalpy*uylow*uzlow + press(i,j,k)*gyz(i,j,k))\n+\n+ end do\n+ end do\n+ end do\n+ !$OMP END PARALLEL DO\n+\n+ return\n+ \n+ end subroutine GRHydro_Tmunu"}, "test": {"test_patch": "diff --git a/all_tests.txt b/all_tests.txt\nnew file mode 100644\nindex 0000000..0000000\n--- /dev/null\n+++ b/all_tests.txt\n@@ -0,0 +1,10 @@\n+GRHydro_test_shock\n+GRHydro_test_shock_mp5\n+GRHydro_test_shock_ppm\n+GRHydro_test_tov_ppm_ML\n+GRHydro_test_tov_ppm_ML_disable_internal_excision\n+GRHydro_test_tov_ppm_no_trp_ML\n+test_one_hybrid\n+tov_carpetevolutionmask\n+tov_carpetevolutionmask2\n+tov_slowsector", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}8{"question_id": "MSB_einsteintoolkit_Cactus_pr16", "question_type": "multi_swe_bench", "description": "Add missing GRHydro_TmunuM.F90 in EinsteinEvolve/GRHydro (einsteintoolkit/Cactus#16)", "content": {"org": "einsteintoolkit", "repo": "Cactus", "pr_number": 16, "issue_title": "Add missing GRHydro_TmunuM.F90 in EinsteinEvolve/GRHydro", "issue_body": "This PR adds the missing source file GRHydro_TmunuM.F90 to complete the EinsteinEvolve/GRHydro thorn implementation.", "base_commit": "HEAD", "resolved_issues": [{"number": 16, "title": "Implement the full functionality of GRHydro", "body": "Please implement the full functionality of `GRHydro` by finishing the code in `GRHydro_TmunuM.F90`.\n\n## Thorn Information:\n- Name: GRHydro\n- Target file: GRHydro_TmunuM.F90\n\n## Interface Definition in interface.ccl:\n\n## Schedule Definition in schedule.ccl:\n\n## Parameters Definition in param.ccl:\n\n## Configuration Definition in configuration.ccl:\n\n## Documentation Context in readme.md and doc/documentation.tex\n\n## Related Code Context in src folder\n\n"}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/einsteintoolkit_m_cactus:pr-16", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/arrangements/EinsteinEvolve/GRHydro/src/GRHydro_TmunuM.F90 b/arrangements/EinsteinEvolve/GRHydro/src/GRHydro_TmunuM.F90\nnew file mode 100644\nindex 0000000..0000000\n--- /dev/null\n+++ b/arrangements/EinsteinEvolve/GRHydro/src/GRHydro_TmunuM.F90\n@@ -0,0 +1,167 @@\n+ /*@@\n+ @file GRHydro_Tmunu.F90\n+ @date Aug 30, 2010\n+ @author Joshua Faber, Scott Noble, Bruno Mundim, Ian Hawke\n+ @histpry\n+ Apr. 2009: Luca Baiotti copied and adapted for the Tmunu-thorn mechanism the original include file\n+ @desc \n+ The calculation of the stress energy tensor.\n+ The version used here was worked out by Miguel Alcubierre. I\n+ think it was an extension of the routine from GR3D, written\n+ by Mark Miller.\n+ C version added by Ian Hawke.\n+\n+ Lower components of the stress-energy tensor obtained from\n+ the hydro variables. The components are given by:\n+\n+ T = (rho h +b^2) u u + (P+b^2/2) g - b b\n+ mu nu mu nu mu nu mu nu \n+\n+ where rho is the energy density of the fluid, h the enthalpy\n+ and P the pressure. The enthalpy is given in terms of the\n+ basic variables as:\n+\n+ h = 1 + e + P/rho\n+\n+ with e the internal energy (eps here).\n+\n+ In the expresion for T_{mu,nu} we also have the four-velocity\n+ of the fluid given by (v_i is the 3-velocity field):\n+\n+ i\n+ u = W ( - alpha + v beta )\n+ 0 i\n+\n+ u = W v\n+ i i\n+ i -1/2\n+ with W the Lorentz factor: W = ( 1 - v v )\n+ i\n+\n+ and where alpha and beta are the lapse and shift vector.\n+\n+ Finally, the 4 metric is given by\n+\n+ 2 i\n+ g = - alpha + beta beta\n+ 00 i\n+\n+ g = beta\n+ 0i i\n+\n+\n+ g = gamma (the spatial metric)\n+ ij ij\n+\n+\n+ @enddesc \n+ @@*/\n+#include \"cctk.h\"\n+#include \"cctk_Arguments.h\"\n+#include \"cctk_Parameters.h\"\n+#include \"cctk_Functions.h\"\n+#include \"SpaceMask.h\"\n+\n+#define velx(i,j,k) vel(i,j,k,1)\n+#define vely(i,j,k) vel(i,j,k,2)\n+#define velz(i,j,k) vel(i,j,k,3)\n+#define Bvecx(i,j,k) Bvec(i,j,k,1)\n+#define Bvecy(i,j,k) Bvec(i,j,k,2)\n+#define Bvecz(i,j,k) Bvec(i,j,k,3)\n+#define bcomx(i,j,k) bcom(i,j,k,1)\n+#define bcomy(i,j,k) bcom(i,j,k,2)\n+#define bcomz(i,j,k) bcom(i,j,k,3)\n+\n+ subroutine GRHydro_TmunuM(CCTK_ARGUMENTS)\n+\n+ implicit none\n+\n+ DECLARE_CCTK_ARGUMENTS\n+ DECLARE_CCTK_PARAMETERS\n+ DECLARE_CCTK_FUNCTIONS\n+\n+ CCTK_REAL :: velxlow, velylow, velzlow\n+ CCTK_REAL :: betaxlow, betaylow, betazlow, beta2\n+ CCTK_REAL :: Bvecxlow,Bvecylow,Bveczlow\n+ CCTK_REAL :: bdotv,b2,bxlow,bylow,bzlow,btlow,dum1,dum2\n+ CCTK_REAL :: utlow,rhohstarw2,pstar\n+ CCTK_REAL :: bdotbeta,vdotbeta\n+ CCTK_INT :: i,j,k\n+\n+\n+ !$OMP PARALLEL DO PRIVATE(i,j,k,velxlow, velylow, velzlow,&\n+ !$OMP Bvecxlow,Bvecylow,Bveczlow, bdotv,dum1,dum2,b2,bxlow,bylow,bzlow,&\n+ !$OMP betaxlow, betaylow, betazlow, beta2, bdotbeta,vdotbeta,utlow, btlow,&\n+ !$OMP rhohstarw2,pstar)\n+\n+ do k = 1, cctk_lsh(3)\n+ do j = 1, cctk_lsh(2)\n+ do i = 1, cctk_lsh(1)\n+\n+ ! need separate dum1, dum2 b/c of Fortrans aliasing rules\n+ call calc_vlow_blow(gxx(i,j,k),gxy(i,j,k),gxz(i,j,k),&\n+ gyy(i,j,k),gyz(i,j,k),gzz(i,j,k), &\n+ velx(i,j,k),vely(i,j,k),velz(i,j,k),Bvecx(i,j,k),Bvecy(i,j,k),Bvecz(i,j,k), &\n+ velxlow,velylow,velzlow,Bvecxlow,Bvecylow,Bveczlow, &\n+ bdotv,b2,dum1,dum2,bxlow,bylow,bzlow)\n+ \n+!!$ Calculate lower components and square of shift vector.\n+ \n+ \n+ betaxlow = gxx(i,j,k)*betax(i,j,k) + gxy(i,j,k)*betay(i,j,k) + gxz(i,j,k)*betaz(i,j,k)\n+ betaylow = gxy(i,j,k)*betax(i,j,k) + gyy(i,j,k)*betay(i,j,k) + gyz(i,j,k)*betaz(i,j,k)\n+ betazlow = gxz(i,j,k)*betax(i,j,k) + gyz(i,j,k)*betay(i,j,k) + gzz(i,j,k)*betaz(i,j,k)\n+ beta2 = betax(i,j,k)*betaxlow + betay(i,j,k)*betaylow + betaz(i,j,k)*betazlow \n+ \n+ bdotbeta = betaxlow*Bvecx(i,j,k)+betaylow*Bvecy(i,j,k)+betazlow*Bvecz(i,j,k)\n+ vdotbeta = betaxlow*velx(i,j,k)+betaylow*vely(i,j,k)+betazlow*velz(i,j,k)\n+\n+!!$ u0 low is missing the w_lorentz factor (see below)!!\n+ utlow = -1.d0*alp(i,j,k) + vdotbeta\n+ \n+ btlow = -1.0d0*w_lorentz(i,j,k)*alp(i,j,k)*bdotv + &\n+ bdotbeta/w_lorentz(i,j,k) + w_lorentz(i,j,k)*bdotv*vdotbeta\n+\n+!!$ Calculate the specific relativistic enthalpy times rho + the mag. field contribution times the\n+!!$ square of the lorentz factor.\n+\n+ rhohstarw2 = w_lorentz(i,j,k)**2*(rho(i,j,k)*(1.0d0 + eps(i,j,k)) + press(i,j,k) + b2)\n+ pstar = press(i,j,k)+0.5d0*b2\n+\n+!!$ Calculate lower components of 4-velocity (without the Lorent factor).\n+!!$ uxlow = velxlow\n+!!$ uylow = velylow\n+!!$ uzlow = velzlow\n+\n+!!$ Calculate Tmunu (the lower components!).\n+\n+ eTtt(i,j,k) = eTtt(i,j,k) + rhohstarw2*utlow**2 + pstar*(beta2 - alp(i,j,k)**2) - btlow**2\n+\n+ eTtx(i,j,k) = eTtx(i,j,k) + rhohstarw2*utlow*velxlow + pstar*betaxlow - btlow*bxlow\n+ eTty(i,j,k) = eTty(i,j,k) + rhohstarw2*utlow*velylow + pstar*betaylow - btlow*bylow\n+ eTtz(i,j,k) = eTtz(i,j,k) + rhohstarw2*utlow*velzlow + pstar*betazlow - btlow*bzlow\n+\n+ eTxx(i,j,k) = eTxx(i,j,k) + rhohstarw2*velxlow**2 + pstar*gxx(i,j,k) - bxlow**2\n+ eTyy(i,j,k) = eTyy(i,j,k) + rhohstarw2*velylow**2 + pstar*gyy(i,j,k) - bylow**2\n+ eTzz(i,j,k) = eTzz(i,j,k) + rhohstarw2*velzlow**2 + pstar*gzz(i,j,k) - bzlow**2\n+ \n+ eTxy(i,j,k) = eTxy(i,j,k) + rhohstarw2*velxlow*velylow + pstar*gxy(i,j,k) - bxlow*bylow\n+ eTxz(i,j,k) = eTxz(i,j,k) + rhohstarw2*velxlow*velzlow + pstar*gxz(i,j,k) - bxlow*bzlow\n+ eTyz(i,j,k) = eTyz(i,j,k) + rhohstarw2*velylow*velzlow + pstar*gyz(i,j,k) - bylow*bzlow\n+\n+ if(calculate_bcom .ne. 0) then\n+ bcom_sq(i,j,k) = b2 \n+ bcom0(i,j,k) = w_lorentz(i,j,k)*bdotv/alp(i,j,k)\n+ bcomx(i,j,k) = Bvecx(i,j,k)/w_lorentz(i,j,k) + bcom0(i,j,k)*(alp(i,j,k)*velx(i,j,k)-betax(i,j,k))\n+ bcomy(i,j,k) = Bvecy(i,j,k)/w_lorentz(i,j,k) + bcom0(i,j,k)*(alp(i,j,k)*vely(i,j,k)-betay(i,j,k))\n+ bcomz(i,j,k) = Bvecz(i,j,k)/w_lorentz(i,j,k) + bcom0(i,j,k)*(alp(i,j,k)*velz(i,j,k)-betaz(i,j,k))\n+ endif \n+\n+ end do\n+ end do\n+ end do\n+ !$OMP END PARALLEL DO\n+\n+ return\n+ \n+ end subroutine GRHydro_TmunuM"}, "test": {"test_patch": "diff --git a/all_tests.txt b/all_tests.txt\nnew file mode 100644\nindex 0000000..0000000\n--- /dev/null\n+++ b/all_tests.txt\n@@ -0,0 +1,10 @@\n+GRHydro_test_shock\n+GRHydro_test_shock_mp5\n+GRHydro_test_shock_ppm\n+GRHydro_test_tov_ppm_ML\n+GRHydro_test_tov_ppm_ML_disable_internal_excision\n+GRHydro_test_tov_ppm_no_trp_ML\n+test_one_hybrid\n+tov_carpetevolutionmask\n+tov_carpetevolutionmask2\n+tov_slowsector", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}9{"question_id": "MSB_einsteintoolkit_Cactus_pr17", "question_type": "multi_swe_bench", "description": "Add missing GRHydro_Minima.cc in EinsteinEvolve/GRHydro (einsteintoolkit/Cactus#17)", "content": {"org": "einsteintoolkit", "repo": "Cactus", "pr_number": 17, "issue_title": "Add missing GRHydro_Minima.cc in EinsteinEvolve/GRHydro", "issue_body": "This PR adds the missing source file GRHydro_Minima.cc to complete the EinsteinEvolve/GRHydro thorn implementation.", "base_commit": "HEAD", "resolved_issues": [{"number": 17, "title": "Implement the full functionality of GRHydro", "body": "Please implement the full functionality of `GRHydro` by finishing the code in `GRHydro_Minima.cc`.\n\n## Thorn Information:\n- Name: GRHydro\n- Target file: GRHydro_Minima.cc\n\n## Interface Definition in interface.ccl:\n\n## Schedule Definition in schedule.ccl:\n\n## Parameters Definition in param.ccl:\n\n## Configuration Definition in configuration.ccl:\n\n## Documentation Context in readme.md and doc/documentation.tex\n\n## Related Code Context in src folder\n\n"}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/einsteintoolkit_m_cactus:pr-17", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/arrangements/EinsteinEvolve/GRHydro/src/GRHydro_Minima.cc b/arrangements/EinsteinEvolve/GRHydro/src/GRHydro_Minima.cc\nnew file mode 100644\nindex 0000000..0000000\n--- /dev/null\n+++ b/arrangements/EinsteinEvolve/GRHydro/src/GRHydro_Minima.cc\n@@ -0,0 +1,175 @@\n+ /*@@\n+ @file GRHydro_Minima.cc\n+ @date Tue Aug 29 18:52:10 2006\n+ @author \n+ @desc \n+ Sets up the scalars used for the atmosphere, after initial data.\n+ @enddesc \n+ @@*/\n+\n+#include \"cctk.h\"\n+#include \"cctk_Parameters.h\"\n+#include \"cctk_Arguments.h\"\n+\n+//#include \"Carpet/Carpet/src/carpet.hh\"\n+#include \"carpet.hh\"\n+\n+#ifdef HAVE_CARPET\n+using namespace Carpet;\n+#endif\n+\n+#ifdef __cplusplus\n+ extern \"C\" {\n+#endif\n+ \n+ /* Scheduled functions */\n+ void GRHydro_Rho_Minima_Setup_Final(CCTK_ARGUMENTS);\n+\n+ void GRHydro_Rho_Minima_Setup_Final_PUGH(CCTK_ARGUMENTS);\n+ \n+#ifdef __cplusplus\n+ } /* extern \"C\" */\n+#endif\n+\n+ /*@@\n+ @routine GRHydro_Rho_Minima_Setup_Final\n+ @date Tue Aug 29 18:54:05 2006\n+ @author Luca Baiotti\n+ @desc \n+ After initial data, set up the scalar GRHydro_rho_min used for checking the atmosphere.\n+ This is computed taking into account the actual maximum rest-mass density on the grid.\n+ Version for Carpet.\n+ @enddesc \n+ @calls \n+ @calledby \n+ @history \n+ \n+ @endhistory \n+@@*/\n+\n+void GRHydro_Rho_Minima_Setup_Final(CCTK_ARGUMENTS)\n+{\n+\n+#ifdef HAVE_CARPET\n+\n+ DECLARE_CCTK_ARGUMENTS;\n+ DECLARE_CCTK_PARAMETERS;\n+\n+ CCTK_REAL max_rho;\n+\n+ static int flag = true;\n+ \n+ if (flag) // Actually run this reduction only the first time the routine is called.\n+ {\n+ if (rho_abs_min > 0.0)\n+ {\n+ *GRHydro_rho_min = rho_abs_min;\n+ }\n+ else\n+ { \n+ // Go to global mode\n+\n+ BEGIN_GLOBAL_MODE (cctkGH) {\n+\n+ // Find the global maximum of rho\n+\n+ const int Reduction_Handle = CCTK_ReductionHandle (\"maximum\");\n+ \n+ const CCTK_INT input_array_variable_indices= {CCTK_VarIndex(\"HydroBase::rho\")};\n+ \n+ const int ierr = CCTK_Reduce(cctkGH,\n+ -1, // target processors; -1 -> all\n+ Reduction_Handle,\n+ 1, // number of output variables\n+ CCTK_VARIABLE_REAL,\n+ &max_rho,\n+ 1, // number of variables to be reduced\n+ input_array_variable_indices);\n+ \n+ if (ierr != 0)\n+ {\n+ CCTK_WARN(0, \"Failed to compute the global maximum of rho\");\n+ }\n+ \n+ *GRHydro_rho_min = max_rho * rho_rel_min;\n+ \n+ // Go back to local mode\n+ } END_GLOBAL_MODE;\n+ \n+ }\n+ // After this has run once, set the flag so that this does not run again\n+ flag = false;\n+ } // end if (flag)\n+ else\n+ {\n+ return;\n+ }\n+\n+#endif\n+\n+ //Debug stuff\n+ // char warnline;\n+\n+ //CCTK_VInfo (CCTK_THORNSTRING, \"STEP 2: compute rho max; rho min: %13.12e \\n\",*GRHydro_rho_min);\n+\n+ // printf(warnline,\"STEP 2: compute rho max; rho min: %13.12e \\n\",*GRHydro_rho_min);\n+ //CCTK_WARN(1,warnline);\n+\n+ // printf(warnline,\"STEP 3: recompute ID with new atmosphere; rho min: ', GRHydro_rho_min, 'reflev: ',%i), GRHydro_rho_min, GRHydro_reflevel);\n+\n+\n+\n+}\n+\n+\n+ /*@@\n+ @routine GRHydro_Rho_Minima_Setup_Final_PUGH\n+ @date Tue Aug 29 18:57:42 2006\n+ @author Luca Baiotti\n+ @desc \n+ As above, but for PUGH.\n+ @enddesc \n+ @calls \n+ @calledby \n+ @history \n+ \n+ @endhistory \n+@@*/\n+\n+void GRHydro_Rho_Minima_Setup_Final_PUGH(CCTK_ARGUMENTS)\n+{ \n+ DECLARE_CCTK_ARGUMENTS;\n+ DECLARE_CCTK_PARAMETERS;\n+ \n+ CCTK_REAL max_rho;\n+ \n+ if (rho_abs_min > 0.0)\n+ {\n+ *GRHydro_rho_min = rho_abs_min;\n+ }\n+ else\n+ { \n+ // Find the global maximum of rho\n+ \n+ const int Reduction_Handle = CCTK_ReductionHandle(\"maximum\");\n+ \n+ const CCTK_INT input_array_variable_indices={CCTK_VarIndex(\"HydroBase::rho\")};\n+ \n+ const int ierr = CCTK_Reduce(cctkGH,\n+ -1, // target processors; -1 -> all\n+ Reduction_Handle,\n+ 1, // number of output variables \n+ CCTK_VARIABLE_REAL,\n+ &max_rho,\n+ 1, // number of variables to be reduced\n+ input_array_variable_indices);\n+ \n+ if (ierr != 0)\n+ {\n+ CCTK_WARN(0, \"Failed to compute the global maximum of rho\");\n+ }\n+ \n+ *GRHydro_rho_min = max_rho * rho_rel_min; \n+ }\n+}\n+"}, "test": {"test_patch": "diff --git a/all_tests.txt b/all_tests.txt\nnew file mode 100644\nindex 0000000..0000000\n--- /dev/null\n+++ b/all_tests.txt\n@@ -0,0 +1,10 @@\n+GRHydro_test_shock\n+GRHydro_test_shock_mp5\n+GRHydro_test_shock_ppm\n+GRHydro_test_tov_ppm_ML\n+GRHydro_test_tov_ppm_ML_disable_internal_excision\n+GRHydro_test_tov_ppm_no_trp_ML\n+test_one_hybrid\n+tov_carpetevolutionmask\n+tov_carpetevolutionmask2\n+tov_slowsector", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}10{"question_id": "MSB_einsteintoolkit_Cactus_pr18", "question_type": "multi_swe_bench", "description": "Add missing GRHydro_Source.cc in EinsteinEvolve/GRHydro (einsteintoolkit/Cactus#18)", "content": {"org": "einsteintoolkit", "repo": "Cactus", "pr_number": 18, "issue_title": "Add missing GRHydro_Source.cc in EinsteinEvolve/GRHydro", "issue_body": "This PR adds the missing source file GRHydro_Source.cc to complete the EinsteinEvolve/GRHydro thorn implementation.", "base_commit": "HEAD", "resolved_issues": [{"number": 18, "title": "Implement the full functionality of GRHydro", "body": "Please implement the full functionality of `GRHydro` by finishing the code in `GRHydro_Source.cc`.\n\n## Thorn Information:\n- Name: GRHydro\n- Target file: GRHydro_Source.cc\n\n## Interface Definition in interface.ccl:\n\n## Schedule Definition in schedule.ccl:\n\n## Parameters Definition in param.ccl:\n\n## Configuration Definition in configuration.ccl:\n\n## Documentation Context in readme.md and doc/documentation.tex\n\n## Related Code Context in src folder\n\n"}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/einsteintoolkit_m_cactus:pr-18", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/arrangements/EinsteinEvolve/GRHydro/src/GRHydro_Source.cc b/arrangements/EinsteinEvolve/GRHydro/src/GRHydro_Source.cc\nnew file mode 100644\nindex 0000000..0000000\n--- /dev/null\n+++ b/arrangements/EinsteinEvolve/GRHydro/src/GRHydro_Source.cc\n@@ -0,0 +1,709 @@\n+ /*@@\n+ @file GRHydro_Source.cc\n+ @date Nov 29, 2013\n+ @author Christian Reisswig, Joshua Faber, Scott Noble, Bruno Mundim, Ian Hawke\n+ @desc \n+ The geometric source terms for the matter evolution\n+ @enddesc \n+ @@*/\n+\n+\n+\n+\n+#include \"cctk.h\"\n+#include \"cctk_Parameters.h\"\n+#include \"cctk_Arguments.h\"\n+#include \"cctk_Functions.h\"\n+\n+#include <cstring>\n+#include <cassert>\n+\n+#define velx vup\n+#define vely (&vup[N])\n+#define velz (&vup[2*N])\n+#define Bvecx Bprim\n+#define Bvecy (&Bprim[N])\n+#define Bvecz (&Bprim[2*N])\n+#define Avecx Avec\n+#define Avecy (&Avec[N])\n+#define Avecz (&Avec[2*N])\n+#define Avecrhsx Avecrhs\n+#define Avecrhsy (&Avecrhs[N])\n+#define Avecrhsz (&Avecrhs[2*N])\n+#define Bconsx Bcons\n+#define Bconsy (&Bcons[N])\n+#define Bconsz (&Bcons[2*N])\n+#define Bconsrhsx Bconsrhs\n+#define Bconsrhsy (&Bconsrhs[N])\n+#define Bconsrhsz (&Bconsrhs[2*N])\n+\n+\n+extern \"C\" CCTK_INT GRHydro_UseGeneralCoordinates(const cGH * cctkGH);\n+\n+template <typename T> static inline T SQR (T const & x) { return x*x; }\n+\n+\n+struct alldiff2 {\n+ static void apply(const cGH* const restrict cctkGH,\n+ CCTK_REAL dvars[][3],\n+ const CCTK_REAL* const restrict * const restrict vars, \n+ const int i, const int j, const int k,\n+ const CCTK_REAL* restrict const ih,\n+ const int nvars)\n+ {\n+ for (int n=0; n < nvars; ++n) {\n+ dvars[n][0] = (vars[n][CCTK_GFINDEX3D(cctkGH, i+1,j,k)] - vars[n][CCTK_GFINDEX3D(cctkGH, i-1,j,k)]) * 0.5 * ih[0];\n+ dvars[n][1] = (vars[n][CCTK_GFINDEX3D(cctkGH, i,j+1,k)] - vars[n][CCTK_GFINDEX3D(cctkGH, i,j-1,k)]) * 0.5 * ih[1];\n+ dvars[n][2] = (vars[n][CCTK_GFINDEX3D(cctkGH, i,j,k+1)] - vars[n][CCTK_GFINDEX3D(cctkGH, i,j,k-1)]) * 0.5 * ih[2];\n+ }\n+ }\n+};\n+\n+struct alldiff4 {\n+ static void apply(const cGH* const restrict cctkGH,\n+ CCTK_REAL dvars[][3],\n+ const CCTK_REAL* const restrict * const restrict vars, \n+ const int i, const int j, const int k,\n+ const CCTK_REAL* restrict const ih,\n+ const int nvars)\n+ {\n+ for (int n=0; n < nvars; ++n) {\n+ dvars[n][0] = ( vars[n][CCTK_GFINDEX3D(cctkGH, i-2,j,k)] - vars[n][CCTK_GFINDEX3D(cctkGH, i+2,j,k)]\n+ + 8.0 * (vars[n][CCTK_GFINDEX3D(cctkGH, i+1,j,k)] - vars[n][CCTK_GFINDEX3D(cctkGH, i-1,j,k)])) * (1.0 / 12.0) * ih[0];\n+ dvars[n][1] = ( vars[n][CCTK_GFINDEX3D(cctkGH, i,j-2,k)] - vars[n][CCTK_GFINDEX3D(cctkGH, i,j+2,k)]\n+ + 8.0 * (vars[n][CCTK_GFINDEX3D(cctkGH, i,j+1,k)] - vars[n][CCTK_GFINDEX3D(cctkGH, i,j-1,k)])) * (1.0 / 12.0) * ih[1];\n+ dvars[n][2] = ( vars[n][CCTK_GFINDEX3D(cctkGH, i,j,k-2)] - vars[n][CCTK_GFINDEX3D(cctkGH, i,j,k+2)]\n+ + 8.0 * (vars[n][CCTK_GFINDEX3D(cctkGH, i,j,k+1)] - vars[n][CCTK_GFINDEX3D(cctkGH, i,j,k-1)])) * (1.0 / 12.0) * ih[2];\n+ }\n+ }\n+};\n+\n+\n+static inline void UpperMetric(CCTK_REAL& restrict uxx,\n+ CCTK_REAL& restrict uxy,\n+ CCTK_REAL& restrict uxz,\n+ CCTK_REAL& restrict uyy,\n+ CCTK_REAL& restrict uyz,\n+ CCTK_REAL& restrict uzz,\n+ const CCTK_REAL det,\n+ const CCTK_REAL gxx,\n+ const CCTK_REAL gxy,\n+ const CCTK_REAL gxz,\n+ const CCTK_REAL gyy,\n+ const CCTK_REAL gyz,\n+ const CCTK_REAL gzz)\n+{\n+ const CCTK_REAL invdet = 1.0 / det;\n+ uxx = (-gyz*gyz + gyy*gzz)*invdet;\n+ uxy = (gxz*gyz - gxy*gzz)*invdet;\n+ uxz = (-gxz*gyy + gxy*gyz)*invdet;\n+ uyy = (-gxz*gxz + gxx*gzz)*invdet;\n+ uyz = (gxy*gxz - gxx*gyz)*invdet;\n+ uzz = (-gxy*gxy + gxx*gyy)*invdet;\n+\n+ return;\n+}\n+\n+\n+template <class alldiff,\n+ bool do_mhd,\n+ bool do_clean_divergence,\n+ bool do_Avec>\n+static void SourceTerms_LL(CCTK_ARGUMENTS)\n+{\n+ DECLARE_CCTK_ARGUMENTS;\n+ DECLARE_CCTK_PARAMETERS;\n+\n+ /*\n+ Set up multipatch stuff\n+ */\n+\n+ const CCTK_REAL * restrict vup;\n+ const CCTK_REAL * restrict Bprim;\n+ const CCTK_REAL * restrict g11;\n+ const CCTK_REAL * restrict g12;\n+ const CCTK_REAL * restrict g13;\n+ const CCTK_REAL * restrict g22;\n+ const CCTK_REAL * restrict g23;\n+ const CCTK_REAL * restrict g33;\n+ const CCTK_REAL * restrict k11;\n+ const CCTK_REAL * restrict k12;\n+ const CCTK_REAL * restrict k13;\n+ const CCTK_REAL * restrict k22;\n+ const CCTK_REAL * restrict k23;\n+ const CCTK_REAL * restrict k33;\n+ const CCTK_REAL * restrict beta1;\n+ const CCTK_REAL * restrict beta2;\n+ const CCTK_REAL * restrict beta3;\n+\n+ //Multipatch related pointers\n+ if(GRHydro_UseGeneralCoordinates(cctkGH)) {\n+ vup=lvel;\n+ g11=gaa; g12=gab; g13=gac;\n+ g22=gbb; g23=gbc;\n+ g33=gcc;\n+ k11=kaa; k12=kab; k13=kac;\n+ k22=kbb; k23=kbc;\n+ k33=kcc;\n+ Bprim=lBvec;\n+ beta1 = betaa;\n+ beta2 = betab;\n+ beta3 = betac;\n+ } else {\n+ vup=vel;\n+ g11=gxx; g12=gxy; g13=gxz;\n+ g22=gyy; g23=gyz;\n+ g33=gzz;\n+ k11=kxx; k12=kxy; k13=kxz;\n+ k22=kyy; k23=kyz;\n+ k33=kzz;\n+ Bprim=Bvec;\n+ beta1 = betax;\n+ beta2 = betay;\n+ beta3 = betaz;\n+ }\n+\n+ // TODO: for vectorization we might want to use cctk_ash (have to make sure\n+ // sensible values exist everywhere)\n+ const int nx=cctk_lsh[0];\n+ const int ny=cctk_lsh[1];\n+ const int nz=cctk_lsh[2];\n+\n+ const int N = cctk_ash[0]*cctk_ash[1]*cctk_ash[2];\n+\n+ const CCTK_REAL one = 1.00;\n+ const CCTK_REAL two = 2.00;\n+ const CCTK_REAL half = 0.50;\n+ const CCTK_REAL dx = CCTK_DELTA_SPACE(0);\n+ const CCTK_REAL dy = CCTK_DELTA_SPACE(1);\n+ const CCTK_REAL dz = CCTK_DELTA_SPACE(2);\n+ \n+ const CCTK_REAL ih[3] = { 1.0/dx, 1.0/dy, 1.0/dz };\n+\n+#pragma omp parallel for\n+ for (int k=GRHydro_stencil; k < nz-GRHydro_stencil; ++k) {\n+ for (int j=GRHydro_stencil; j < ny-GRHydro_stencil; ++j) {\n+ for (int i=GRHydro_stencil; i < nx-GRHydro_stencil; ++i) {\n+ \n+ const int ijk = CCTK_GFINDEX3D(cctkGH, i, j, k);\n+ \n+ // TODO: these are not needed.\n+ const CCTK_REAL localgxx = g11[ijk];\n+ const CCTK_REAL localgxy = g12[ijk];\n+ const CCTK_REAL localgxz = g13[ijk];\n+ const CCTK_REAL localgyy = g22[ijk];\n+ const CCTK_REAL localgyz = g23[ijk];\n+ const CCTK_REAL localgzz = g33[ijk];\n+\n+ const CCTK_REAL sqrtdet = sdetg[ijk];\n+ const CCTK_REAL invsqrtdet = 1./sqrtdet;\n+ \n+ CCTK_REAL uxx, uxy, uxz, uyy, uyz, uzz;\n+ UpperMetric(uxx, uxy, uxz, uyy, uyz, uzz, sqrtdet*sqrtdet, localgxx,\n+ localgxy, localgxz, localgyy, localgyz, localgzz);\n+ \n+ const CCTK_REAL shiftx = beta1[ijk];\n+ const CCTK_REAL shifty = beta2[ijk];\n+ const CCTK_REAL shiftz = beta3[ijk];\n+\n+ // Derivatives of the lapse, metric and shift\n+\n+ const int nvars = 10;\n+ const CCTK_REAL* const restrict vars[nvars] = { beta1, beta2, beta3, alp,\n+ g11, g12, g13,\n+ g22, g23,\n+ g33 };\n+ CCTK_REAL dvars[nvars][3];\n+ \n+ alldiff::apply(cctkGH, dvars, vars, i, j, k, ih, nvars);\n+ \n+ const CCTK_REAL dx_betax = dvars[0][0];\n+ const CCTK_REAL dx_betay = dvars[1][0];\n+ const CCTK_REAL dx_betaz = dvars[2][0];\n+ \n+ const CCTK_REAL dy_betax = dvars[0][1];\n+ const CCTK_REAL dy_betay = dvars[1][1];\n+ const CCTK_REAL dy_betaz = dvars[2][1];\n+ \n+ const CCTK_REAL dz_betax = dvars[0][2];\n+ const CCTK_REAL dz_betay = dvars[1][2];\n+ const CCTK_REAL dz_betaz = dvars[2][2];\n+ \n+ const CCTK_REAL dx_alp = dvars[3][0];\n+ const CCTK_REAL dy_alp = dvars[3][1];\n+ const CCTK_REAL dz_alp = dvars[3][2];\n+\n+ const CCTK_REAL dx_gxx = dvars[4][0];\n+ const CCTK_REAL dx_gxy = dvars[5][0];\n+ const CCTK_REAL dx_gxz = dvars[6][0];\n+ const CCTK_REAL dx_gyy = dvars[7][0];\n+ const CCTK_REAL dx_gyz = dvars[8][0];\n+ const CCTK_REAL dx_gzz = dvars[9][0];\n+ const CCTK_REAL dy_gxx = dvars[4][1];\n+ const CCTK_REAL dy_gxy = dvars[5][1];\n+ const CCTK_REAL dy_gxz = dvars[6][1];\n+ const CCTK_REAL dy_gyy = dvars[7][1];\n+ const CCTK_REAL dy_gyz = dvars[8][1];\n+ const CCTK_REAL dy_gzz = dvars[9][1];\n+ const CCTK_REAL dz_gxx = dvars[4][2];\n+ const CCTK_REAL dz_gxy = dvars[5][2];\n+ const CCTK_REAL dz_gxz = dvars[6][2];\n+ const CCTK_REAL dz_gyy = dvars[7][2];\n+ const CCTK_REAL dz_gyz = dvars[8][2];\n+ const CCTK_REAL dz_gzz = dvars[9][2];\n+\n+\n+ const CCTK_REAL invalp = 1.0 / alp[ijk];\n+ const CCTK_REAL invalp2 = SQR(invalp);\n+ const CCTK_REAL velxshift = velx[ijk] - shiftx*invalp;\n+ const CCTK_REAL velyshift = vely[ijk] - shifty*invalp;\n+ const CCTK_REAL velzshift = velz[ijk] - shiftz*invalp;\n+\n+ // vel_i = g_ij v^j\n+ // B_i = g_ij B^i\n+\n+ const CCTK_REAL vlowx = g11[ijk]*velx[ijk] + g12[ijk]*vely[ijk] + g13[ijk]*velz[ijk];\n+ const CCTK_REAL vlowy = g12[ijk]*velx[ijk] + g22[ijk]*vely[ijk] + g23[ijk]*velz[ijk];\n+ const CCTK_REAL vlowz = g13[ijk]*velx[ijk] + g23[ijk]*vely[ijk] + g33[ijk]*velz[ijk];\n+ const CCTK_REAL Bvecxlow = do_mhd ? g11[ijk]*Bvecx[ijk] + g12[ijk]*Bvecy[ijk] + g13[ijk]*Bvecz[ijk] : 0;\n+ const CCTK_REAL Bvecylow = do_mhd ? g12[ijk]*Bvecx[ijk] + g22[ijk]*Bvecy[ijk] + g23[ijk]*Bvecz[ijk] : 0;\n+ const CCTK_REAL Bveczlow = do_mhd ? g13[ijk]*Bvecx[ijk] + g23[ijk]*Bvecy[ijk] + g33[ijk]*Bvecz[ijk] : 0;\n+\n+ // B^i v_i (= b^0/u^0)\n+ const CCTK_REAL Bdotv = do_mhd ? vlowx*Bvecx[ijk]+vlowy*Bvecy[ijk]+vlowz*Bvecz[ijk] : 0;\n+\n+ // v^2 = v_i v^i; w=(1-v^2)^{-1/2}\n+\n+ const CCTK_REAL v2 = vlowx*velx[ijk] + vlowy*vely[ijk] + vlowz*velz[ijk];\n+ const CCTK_REAL invw = sqrt(1.0-v2);\n+ const CCTK_REAL w = 1./invw;\n+\n+ // b^2 = B^i B_i / w^2 + (b^0/u^0)^2\n+\n+ const CCTK_REAL b2 = do_mhd ? (Bvecx[ijk]*Bvecxlow+Bvecy[ijk]*Bvecylow+Bvecz[ijk]*Bveczlow)*SQR(invw)+SQR(Bdotv) : 0;\n+\n+ // b_i = B_i/w +w*(B dot v)*v_i\n+ const CCTK_REAL bxlow = do_mhd ? Bvecxlow*invw+w*Bdotv*vlowx : 0;\n+ const CCTK_REAL bylow = do_mhd ? Bvecylow*invw+w*Bdotv*vlowy : 0;\n+ const CCTK_REAL bzlow = do_mhd ? Bveczlow*invw+w*Bdotv*vlowz : 0;\n+\n+\n+ // These are the contravariant components\n+ const CCTK_REAL bt = do_mhd ? w*invalp*Bdotv : 0;\n+ const CCTK_REAL bx = do_mhd ? Bvecx[ijk]*invw+w*Bdotv*velxshift : 0;\n+ const CCTK_REAL by = do_mhd ? Bvecy[ijk]*invw+w*Bdotv*velyshift : 0;\n+ const CCTK_REAL bz = do_mhd ? Bvecz[ijk]*invw+w*Bdotv*velzshift : 0;\n+\n+ // TODO: all of these can be expressed much more easily in terms of the\n+ // conservatives\n+ const CCTK_REAL rhohstarW2 = (rho[ijk]*(one + eps[ijk]) + (press[ijk] + b2)) *\n+ SQR(w);\n+ const CCTK_REAL pstar = press[ijk]+0.50*b2;\n+\n+ // For a change, these are T^{ij}\n+\n+ // TODO: strict IEEE compliance does not let the compiler remove \"+ 0\"\n+ // terms, so we have to do something else here\n+ const CCTK_REAL t00 = (rhohstarW2 - pstar)*invalp2-SQR(bt);\n+ const CCTK_REAL t0x = rhohstarW2*velxshift*invalp +\n+ pstar*shiftx*invalp2-bt*bx;\n+ const CCTK_REAL t0y = rhohstarW2*velyshift*invalp +\n+ pstar*shifty*invalp2-bt*by;\n+ const CCTK_REAL t0z = rhohstarW2*velzshift*invalp +\n+ pstar*shiftz*invalp2-bt*bz;\n+ const CCTK_REAL txx = rhohstarW2*velxshift*velxshift +\n+ pstar*(uxx - shiftx*shiftx*invalp2)-SQR(bx);\n+ const CCTK_REAL txy = rhohstarW2*velxshift*velyshift +\n+ pstar*(uxy - shiftx*shifty*invalp2)-bx*by;\n+ const CCTK_REAL txz = rhohstarW2*velxshift*velzshift +\n+ pstar*(uxz - shiftx*shiftz*invalp2)-bx*bz;\n+ const CCTK_REAL tyy = rhohstarW2*velyshift*velyshift +\n+ pstar*(uyy - shifty*shifty*invalp2)-SQR(by);\n+ const CCTK_REAL tyz = rhohstarW2*velyshift*velzshift +\n+ pstar*(uyz - shifty*shiftz*invalp2)-by*bz;\n+ const CCTK_REAL tzz = rhohstarW2*velzshift*velzshift +\n+ pstar*(uzz - shiftz*shiftz*invalp2)-SQR(bz);\n+\n+// Contract the shift with the extrinsic curvature\n+\n+ const CCTK_REAL shiftshiftk = shiftx*shiftx*k11[ijk] +\n+ shifty*shifty*k22[ijk] +\n+ shiftz*shiftz*k33[ijk] +\n+ two*(shiftx*shifty*k12[ijk] +\n+ shiftx*shiftz*k13[ijk] +\n+ shifty*shiftz*k23[ijk]);\n+\n+ const CCTK_REAL shiftkx = shiftx*k11[ijk] + shifty*k12[ijk] + shiftz*k13[ijk];\n+ const CCTK_REAL shiftky = shiftx*k12[ijk] + shifty*k22[ijk] + shiftz*k23[ijk];\n+ const CCTK_REAL shiftkz = shiftx*k13[ijk] + shifty*k23[ijk] + shiftz*k33[ijk];\n+\n+// Contract the matter terms with the extrinsic curvature\n+\n+ const CCTK_REAL sumTK = txx*k11[ijk] + tyy*k22[ijk] + tzz*k33[ijk]\n+ + two*(txy*k12[ijk] + txz*k13[ijk] + tyz*k23[ijk]);\n+\n+// Update term for tau\n+ \n+ const CCTK_REAL tau_source = t00*\n+ (shiftshiftk - (shiftx*dx_alp + shifty*dy_alp + shiftz*dz_alp) )\n+ + t0x*(-dx_alp + two*shiftkx)\n+ + t0y*(-dy_alp + two*shiftky)\n+ + t0z*(-dz_alp + two*shiftkz)\n+ + sumTK;\n+\n+// The following looks very little like the terms in the\n+// standard papers. Take a look in the ThornGuide to see why\n+// it is really the same thing.\n+\n+// Contract the shift with derivatives of the metric\n+\n+ const CCTK_REAL halfshiftdgx = half*(shiftx*shiftx*dx_gxx +\n+ shifty*shifty*dx_gyy + shiftz*shiftz*dx_gzz) +\n+ shiftx*shifty*dx_gxy + shiftx*shiftz*dx_gxz +\n+ shifty*shiftz*dx_gyz;\n+ const CCTK_REAL halfshiftdgy = half*(shiftx*shiftx*dy_gxx +\n+ shifty*shifty*dy_gyy + shiftz*shiftz*dy_gzz) +\n+ shiftx*shifty*dy_gxy + shiftx*shiftz*dy_gxz +\n+ shifty*shiftz*dy_gyz;\n+ const CCTK_REAL halfshiftdgz = half*(shiftx*shiftx*dz_gxx +\n+ shifty*shifty*dz_gyy + shiftz*shiftz*dz_gzz) +\n+ shiftx*shifty*dz_gxy + shiftx*shiftz*dz_gxz +\n+ shifty*shiftz*dz_gyz;\n+\n+// Contract the matter with derivatives of the metric\n+\n+ const CCTK_REAL halfTdgx = half*(txx*dx_gxx + tyy*dx_gyy + tzz*dx_gzz) +\n+ txy*dx_gxy + txz*dx_gxz + tyz*dx_gyz;\n+ const CCTK_REAL halfTdgy = half*(txx*dy_gxx + tyy*dy_gyy + tzz*dy_gzz) +\n+ txy*dy_gxy + txz*dy_gxz + tyz*dy_gyz;\n+ const CCTK_REAL halfTdgz = half*(txx*dz_gxx + tyy*dz_gyy + tzz*dz_gzz) +\n+ txy*dz_gxy + txz*dz_gxz + tyz*dz_gyz;\n+\n+ \n+ const CCTK_REAL sx_source = t00*\n+ (halfshiftdgx - alp[ijk]*dx_alp) + halfTdgx +\n+ t0x*(shiftx*dx_gxx + shifty*dx_gxy + shiftz*dx_gxz) +\n+ t0y*(shiftx*dx_gxy + shifty*dx_gyy + shiftz*dx_gyz) +\n+ t0z*(shiftx*dx_gxz + shifty*dx_gyz + shiftz*dx_gzz) +\n+ rhohstarW2*invalp*(vlowx*dx_betax + vlowy*dx_betay + vlowz*dx_betaz) -\n+ bt*(bxlow*dx_betax + bylow*dx_betay + bzlow*dx_betaz);\n+ \n+ const CCTK_REAL sy_source = t00*\n+ (halfshiftdgy - alp[ijk]*dy_alp) + halfTdgy +\n+ t0x*(shiftx*dy_gxx + shifty*dy_gxy + shiftz*dy_gxz) +\n+ t0y*(shiftx*dy_gxy + shifty*dy_gyy + shiftz*dy_gyz) +\n+ t0z*(shiftx*dy_gxz + shifty*dy_gyz + shiftz*dy_gzz) +\n+ rhohstarW2*invalp*(vlowx*dy_betax + vlowy*dy_betay + vlowz*dy_betaz) -\n+ bt*(bxlow*dy_betax + bylow*dy_betay + bzlow*dy_betaz);\n+\n+ const CCTK_REAL sz_source = t00*\n+ (halfshiftdgz - alp[ijk]*dz_alp) + halfTdgz +\n+ t0x*(shiftx*dz_gxx + shifty*dz_gxy + shiftz*dz_gxz) +\n+ t0y*(shiftx*dz_gxy + shifty*dz_gyy + shiftz*dz_gyz) +\n+ t0z*(shiftx*dz_gxz + shifty*dz_gyz + shiftz*dz_gzz) +\n+ rhohstarW2*invalp*(vlowx*dz_betax + vlowy*dz_betay + vlowz*dz_betaz) -\n+ bt*(bxlow*dz_betax + bylow*dz_betay + bzlow*dz_betaz);\n+\n+ densrhs[ijk] = 0.0;\n+ srhs[ijk] = alp[ijk]*sqrtdet*sx_source;\n+ srhs[ijk + N] = alp[ijk]*sqrtdet*sy_source;\n+ srhs[ijk + 2*N] = alp[ijk]*sqrtdet*sz_source;\n+ taurhs[ijk] = alp[ijk]*sqrtdet*tau_source;\n+\n+ if (do_Avec) {\n+\n+ // B^i and A^i both live in cell centers currently\n+ const CCTK_REAL Avcx_source = alp[ijk]*sqrtdet*(velyshift*Bvecz[ijk] - velzshift*Bvecy[ijk]);\n+ const CCTK_REAL Avcy_source = alp[ijk]*sqrtdet*(velzshift*Bvecx[ijk] - velxshift*Bvecz[ijk]);\n+ const CCTK_REAL Avcz_source = alp[ijk]*sqrtdet*(velxshift*Bvecy[ijk] - velyshift*Bvecx[ijk]);\n+\n+ Avecrhsx[ijk] = Avcx_source;\n+ Avecrhsy[ijk] = Avcy_source;\n+ Avecrhsz[ijk] = Avcz_source;\n+\n+ }\n+\n+ if(do_clean_divergence) {\n+ \n+ // g^{jk} d_i g_{kj} = d_i (g) / det\n+ const CCTK_REAL dx_det_bydet = uxx*dx_gxx + uyy*dx_gyy + uzz*dx_gzz +\n+ two*(uxy*dx_gxy+uxz*dx_gxz+uyz*dx_gyz);\n+ const CCTK_REAL dy_det_bydet = uxx*dy_gxx + uyy*dy_gyy + uzz*dy_gzz +\n+ two*(uxy*dy_gxy+uxz*dy_gxz+uyz*dy_gyz);\n+ const CCTK_REAL dz_det_bydet = uxx*dz_gxx + uyy*dz_gyy + uzz*dz_gzz +\n+ two*(uxy*dz_gxy+uxz*dz_gxz+uyz*dz_gyz);\n+\n+ // g^{ik} d_k g_{li}\n+ const CCTK_REAL gdg_x = uxx*dx_gxx + uxy*dy_gxx + uxz*dz_gxx +\n+ uxy*dx_gxy + uyy*dy_gxy + uyz*dz_gxy +\n+ uxz*dx_gxz + uyz*dy_gxz + uzz*dz_gxz;\n+\n+ const CCTK_REAL gdg_y = uxx*dx_gxy + uxy*dy_gxy + uxz*dz_gxy +\n+ uxy*dx_gyy + uyy*dy_gyy + uyz*dz_gyy +\n+ uxz*dx_gyz + uyz*dy_gyz + uzz*dz_gyz;\n+\n+ const CCTK_REAL gdg_z = uxx*dx_gxz + uxy*dy_gxz + uxz*dz_gxz +\n+ uxy*dx_gyz + uyy*dy_gyz + uyz*dz_gyz +\n+ uxz*dx_gzz + uyz*dy_gzz + uzz*dz_gzz;\n+\n+ CCTK_REAL bvcx_source, bvcy_source, bvcz_source;\n+ psidcrhs[ijk] = -one * (kap_dc*alp[ijk] + \n+ dx_betax + dy_betay + dz_betaz ) * psidc[ijk] + \n+ Bconsx[ijk] * (dx_alp - half*alp[ijk] * \n+ ( uxx*dx_gxx + uyy*dx_gyy + uzz*dx_gzz + two*uxy*dx_gxy + \n+ two*uxz*dx_gxz + two*uyz*dx_gyz ) )*invsqrtdet + \n+ Bconsy[ijk] * (dy_alp - half*alp[ijk] * \n+ ( uxx*dy_gxx + uyy*dy_gyy + uzz*dy_gzz + two*uxy*dy_gxy + \n+ two*uxz*dy_gxz + two*uyz*dy_gyz ) )*invsqrtdet + \n+ Bconsz[ijk] * (dz_alp - half*alp[ijk] * \n+ ( uxx*dz_gxx + uyy*dz_gyy + uzz*dz_gzz + two*uxy*dz_gxy + \n+ two*uxz*dz_gxz + two*uyz*dz_gyz ) )*invsqrtdet;\n+\n+ bvcx_source = -one * ( Bconsx[ijk]*dx_betax + \n+ Bconsy[ijk]*dy_betax + Bconsz[ijk]*dz_betax ) + \n+ psidc[ijk]*sqrtdet*(( uxx*dx_alp+uxy*dy_alp+uxz*dz_alp ) + \n+ alp[ijk]*(half*( uxx*dx_det_bydet + \n+ uxy*dy_det_bydet + uxz*dz_det_bydet) - \n+ ( uxx*gdg_x + uxy*gdg_y + uxz*gdg_z )));\n+\n+ bvcy_source = -one * ( Bconsx[ijk]*dx_betay + \n+ Bconsy[ijk]*dy_betay + Bconsz[ijk]*dz_betay ) + \n+ psidc[ijk]*sqrtdet*(( uxy*dx_alp+uyy*dy_alp+uyz*dz_alp ) + \n+ alp[ijk]*(half*( uxy*dx_det_bydet + \n+ uyy*dy_det_bydet + uyz*dz_det_bydet ) - \n+ ( uxy*gdg_x + uyy*gdg_y + uyz*gdg_z )));\n+\n+ bvcz_source = -one * ( Bconsx[ijk]*dx_betaz + \n+ Bconsy[ijk]*dy_betaz + Bconsz[ijk]*dz_betaz ) + \n+ psidc[ijk]*sqrtdet*(( uxz*dx_alp+uyz*dy_alp+uzz*dz_alp ) + \n+ alp[ijk]*(half*( uxz*dx_det_bydet + \n+ uyz*dy_det_bydet + uzz*dz_det_bydet ) - \n+ ( uxz*gdg_x + uyz*gdg_y + uzz*gdg_z )));\n+\n+ Bconsrhsx[ijk] = bvcx_source;\n+ Bconsrhsy[ijk] = bvcy_source;\n+ Bconsrhsz[ijk] = bvcz_source;\n+ } // if(do_clean_divergence)\n+\n+ } // for(i\n+ } // for(j\n+ } // for(k\n+\n+#if(0) // poison edges of domain\n+ static int last_iteration_seen = -1;\n+ static int reflevel = -1;\n+ static int mol_substep;\n+ if(last_iteration_seen != cctk_iteration || reflevel != *GRHydro_reflevel) {\n+ last_iteration_seen = cctk_iteration;\n+ reflevel = *GRHydro_reflevel;\n+ mol_substep = 0;\n+ } else {\n+ mol_substep += 1;\n+ }\n+ for(k = 0 ; k < GRHydro_stencil*mol_substep ; ++k) {\n+ for(j = 0 ; j < cctk_ash[1] ; ++j) {\n+ for(i = 0 ; i < cctk_ash[0] ; ++i) {\n+ dens[CCTK_GFINDEX3D(i,j,k)] = -1e100\n+ Scon[CCTK_VECTGFINDEX3D(i,j,k,0)] = -1e100\n+ Scon[CCTK_VECTGFINDEX3D(i,j,k,1)] = -1e100\n+ Scon[CCTK_VECTGFINDEX3D(i,j,k,2)] = -1e100\n+ tau[CCTK_GFINDEX3D(i,j,k)] = -1e100\n+ if(do_mhd) {\n+ Bcons[CCTK_VECTGFINDEX3D(i,j,k,0)] = -1e100\n+ Bcons[CCTK_VECTGFINDEX3D(i,j,k,1)] = -1e100\n+ Bcons[CCTK_VECTGFINDEX3D(i,j,k,2)] = -1e100\n+ }\n+ if(do_clean_divergene)\n+ psidc[CCTK_GFINDEX3D(i,j,k)] = -1e100\n+ }\n+ }\n+ }\n+ for(k = cctk_ash[2]-GRHydro_stencil*mol_substep ; k < cctk_ash[2] ; ++k) {\n+ for(j = 0 ; j < cctk_ash[1] ; ++j) {\n+ for(i = 0 ; i < cctk_ash[0] ; ++i) {\n+ dens[CCTK_GFINDEX3D(i,j,k)] = -1e100\n+ Scon[CCTK_VECTGFINDEX3D(i,j,k,0)] = -1e100\n+ Scon[CCTK_VECTGFINDEX3D(i,j,k,1)] = -1e100\n+ Scon[CCTK_VECTGFINDEX3D(i,j,k,2)] = -1e100\n+ tau[CCTK_GFINDEX3D(i,j,k)] = -1e100\n+ if(do_mhd) {\n+ Bcons[CCTK_VECTGFINDEX3D(i,j,k,0)] = -1e100\n+ Bcons[CCTK_VECTGFINDEX3D(i,j,k,1)] = -1e100\n+ Bcons[CCTK_VECTGFINDEX3D(i,j,k,2)] = -1e100\n+ }\n+ if(do_clean_divergene)\n+ psidc[CCTK_GFINDEX3D(i,j,k)] = -1e100\n+ }\n+ }\n+ }\n+ for(i = 0 ; i < GRHydro_stencil*mol_substep ; ++i) {\n+ for(k = 0 ; k < cctk_ash[2] ; ++k) {\n+ for(j = 0 ; j < cctk_ash[1] ; ++j) {\n+ dens[CCTK_GFINDEX3D(i,j,k)] = -1e100\n+ Scon[CCTK_VECTGFINDEX3D(i,j,k,0)] = -1e100\n+ Scon[CCTK_VECTGFINDEX3D(i,j,k,1)] = -1e100\n+ Scon[CCTK_VECTGFINDEX3D(i,j,k,2)] = -1e100\n+ tau[CCTK_GFINDEX3D(i,j,k)] = -1e100\n+ if(do_mhd) {\n+ Bcons[CCTK_VECTGFINDEX3D(i,j,k,0)] = -1e100\n+ Bcons[CCTK_VECTGFINDEX3D(i,j,k,1)] = -1e100\n+ Bcons[CCTK_VECTGFINDEX3D(i,j,k,2)] = -1e100\n+ }\n+ if(do_clean_divergene)\n+ psidc[CCTK_GFINDEX3D(i,j,k)] = -1e100\n+ }\n+ }\n+ }\n+ for(i = cctk_ash[0]-GRHydro_stencil*mol_substep ; i < cctk_ash[0] ; ++i) {\n+ for(k = 0 ; k < cctk_ash[2] ; ++k) {\n+ for(j = 0 ; j < cctk_ash[1] ; ++j) {\n+ dens[CCTK_GFINDEX3D(i,j,k)] = -1e100\n+ Scon[CCTK_VECTGFINDEX3D(i,j,k,0)] = -1e100\n+ Scon[CCTK_VECTGFINDEX3D(i,j,k,1)] = -1e100\n+ Scon[CCTK_VECTGFINDEX3D(i,j,k,2)] = -1e100\n+ tau[CCTK_GFINDEX3D(i,j,k)] = -1e100\n+ if(do_mhd) {\n+ Bcons[CCTK_VECTGFINDEX3D(i,j,k,0)] = -1e100\n+ Bcons[CCTK_VECTGFINDEX3D(i,j,k,1)] = -1e100\n+ Bcons[CCTK_VECTGFINDEX3D(i,j,k,2)] = -1e100\n+ }\n+ if(do_clean_divergene)\n+ psidc[CCTK_GFINDEX3D(i,j,k)] = -1e100\n+ }\n+ }\n+ }\n+ for(j = 0 ; j < GRHydro_stencil*mol_substep ; ++j) {\n+ for(i = 0 ; i < cctk_ash[0] ; ++i) {\n+ for(k = 0 ; k < cctk_ash[2] ; ++k) {\n+ dens[CCTK_GFINDEX3D(i,j,k)] = -1e100\n+ Scon[CCTK_VECTGFINDEX3D(i,j,k,0)] = -1e100\n+ Scon[CCTK_VECTGFINDEX3D(i,j,k,1)] = -1e100\n+ Scon[CCTK_VECTGFINDEX3D(i,j,k,2)] = -1e100\n+ tau[CCTK_GFINDEX3D(i,j,k)] = -1e100\n+ if(do_mhd) {\n+ Bcons[CCTK_VECTGFINDEX3D(i,j,k,0)] = -1e100\n+ Bcons[CCTK_VECTGFINDEX3D(i,j,k,1)] = -1e100\n+ Bcons[CCTK_VECTGFINDEX3D(i,j,k,2)] = -1e100\n+ }\n+ if(do_clean_divergene)\n+ psidc[CCTK_GFINDEX3D(i,j,k)] = -1e100\n+ }\n+ }\n+ }\n+ for(j = cctk_ash[1]-GRHydro_stencil*mol_substep ; j < cctk_ash[1] ; ++j) {\n+ for(i = 0 ; i < cctk_ash[0] ; ++i) {\n+ for(k = 0 ; k < cctk_ash[2] ; ++k) {\n+ dens[CCTK_GFINDEX3D(i,j,k)] = -1e100\n+ Scon[CCTK_VECTGFINDEX3D(i,j,k,0)] = -1e100\n+ Scon[CCTK_VECTGFINDEX3D(i,j,k,1)] = -1e100\n+ Scon[CCTK_VECTGFINDEX3D(i,j,k,2)] = -1e100\n+ tau[CCTK_GFINDEX3D(i,j,k)] = -1e100\n+ if(do_mhd) {\n+ Bcons[CCTK_VECTGFINDEX3D(i,j,k,0)] = -1e100\n+ Bcons[CCTK_VECTGFINDEX3D(i,j,k,1)] = -1e100\n+ Bcons[CCTK_VECTGFINDEX3D(i,j,k,2)] = -1e100\n+ }\n+ if(do_clean_divergene)\n+ psidc[CCTK_GFINDEX3D(i,j,k)] = -1e100\n+ }\n+ }\n+ }\n+#endif\n+}\n+\n+extern \"C\" void SourceTerms(CCTK_ARGUMENTS)\n+{\n+ DECLARE_CCTK_ARGUMENTS;\n+ DECLARE_CCTK_PARAMETERS;\n+\n+ void (*sources)(CCTK_ARGUMENTS) = NULL;\n+ const bool do_Avec = CCTK_EQUALS(Bvec_evolution_method, \"GRHydro_Avec\");\n+#define T(e,t) (!!(e)==(t))\n+#define T3(t1,t2,t3) \\\n+ (T(*evolve_MHD,t1) && \\\n+ T(clean_divergence,t2) && \\\n+ T(do_Avec,t3))\n+#define SET_SOURCES(df,t1,t2,t3) \\\n+ if(T3(t1,t2,t3)) \\\n+ sources=SourceTerms_LL<df,t1,t2,t3>;\n+ enum do_t {noMHD=0,MHD=1,noDC=0,DC=1,noAVec=0,AVec=1};\n+\n+ // order of arguments:\n+ // do_MHD do_clean_divergence do_Avec\n+ if(sources_spatial_order == 4) {\n+ // no MHD\n+ SET_SOURCES(alldiff4,noMHD,noDC,noAVec)\n+\n+ // not all combinations make sense for MHD, we list the ones that do\n+ SET_SOURCES(alldiff4, MHD,noDC,noAVec)\n+ SET_SOURCES(alldiff4, MHD, DC,noAVec)\n+ SET_SOURCES(alldiff4, MHD, DC,noAVec)\n+ SET_SOURCES(alldiff4, MHD,noDC, AVec)\n+ } else if(sources_spatial_order == 2) {\n+ // no MHD\n+ SET_SOURCES(alldiff2,noMHD,noDC,noAVec)\n+\n+ // not all combinations make sense for MHD, we list the ones that do\n+ SET_SOURCES(alldiff2, MHD,noDC,noAVec)\n+ SET_SOURCES(alldiff2, MHD, DC,noAVec)\n+ SET_SOURCES(alldiff2, MHD, DC,noAVec)\n+ SET_SOURCES(alldiff2, MHD,noDC, AVec)\n+ }\n+\n+ if(sources == NULL) {\n+ CCTK_VError(__LINE__, __FILE__, CCTK_THORNSTRING, \n+ \"No source terms can be computed for combination \"\n+ \"do_mhd = %d \"\n+ \"do_clean_divergence = %d \"\n+ \"do_Avec = %d sources_spatial_order = %d\",\n+ int(*evolve_MHD),\n+ int(clean_divergence),\n+ int(do_Avec), int(sources_spatial_order));\n+ }\n+\n+ // do some non-time critial operations here to reduce the number of templates \n+ if(transport_constraints) {\n+ const int N = cctk_ash[0]*cctk_ash[1]*cctk_ash[2];\n+ // not much need to OpenMP parallelize this since it is pure memory access\n+ // and memset is highly optimized\n+ memset(Evec, 0, sizeof(Evec[0])*3*N);\n+ // I think IEEE requires an all zero byte double to be 0.\n+ assert(Evec[0] == 0.);\n+ }\n+ if(*evolve_Y_e) {\n+ const int N = cctk_ash[0]*cctk_ash[1]*cctk_ash[2];\n+ // not much need to OpenMP parallelize this since it is pure memory access\n+ // and memset is highly optimized\n+ memset(Y_e_con_rhs, 0, sizeof(Y_e_con_rhs[0])*N);\n+ // I think IEEE requires an all zero byte double to be 0.\n+ assert(Y_e_con_rhs[0] == 0.);\n+ }\n+ if(number_of_tracers>0) {\n+ const int N = cctk_ash[0]*cctk_ash[1]*cctk_ash[2];\n+ // not much need to OpenMP parallelize this since it is pure memory access\n+ // and memset is highly optimized\n+ memset(cons_tracerrhs, 0, sizeof(cons_tracerrhs[0])*number_of_tracers*N);\n+ // I think IEEE requires an all zero byte double to be 0.\n+ assert(cons_tracerrhs[0] == 0.);\n+ }\n+ if(*evolve_entropy) {\n+ const int N = cctk_ash[0]*cctk_ash[1]*cctk_ash[2];\n+ // not much need to OpenMP parallelize this since it is pure memory access\n+ // and memset is highly optimized\n+ memset(entropyrhs, 0, sizeof(entropyrhs[0])*N);\n+ // I think IEEE requires an all zero byte double to be 0.\n+ assert(entropyrhs[0] == 0.);\n+ }\n+ if(track_divB) {\n+ const int N = cctk_ash[0]*cctk_ash[1]*cctk_ash[2];\n+ // not much need to OpenMP parallelize this since it is pure memory access\n+ // and memset is highly optimized\n+ memset(divB, 0, sizeof(divB[0])*N);\n+ // I think IEEE requires an all zero byte double to be 0.\n+ assert(divB[0] == 0.);\n+ }\n+\n+ sources(CCTK_PASS_CTOC);\n+}\n+\n+"}, "test": {"test_patch": "diff --git a/all_tests.txt b/all_tests.txt\nnew file mode 100644\nindex 0000000..0000000\n--- /dev/null\n+++ b/all_tests.txt\n@@ -0,0 +1,10 @@\n+GRHydro_test_shock\n+GRHydro_test_shock_mp5\n+GRHydro_test_shock_ppm\n+GRHydro_test_tov_ppm_ML\n+GRHydro_test_tov_ppm_ML_disable_internal_excision\n+GRHydro_test_tov_ppm_no_trp_ML\n+test_one_hybrid\n+tov_carpetevolutionmask\n+tov_carpetevolutionmask2\n+tov_slowsector", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}11{"question_id": "MSB_einsteintoolkit_Cactus_pr19", "question_type": "multi_swe_bench", "description": "Add missing GRHydro_RiemannSolveAM.F90 in EinsteinEvolve/GRHydro (einsteintoolkit/Cactus#19)", "content": {"org": "einsteintoolkit", "repo": "Cactus", "pr_number": 19, "issue_title": "Add missing GRHydro_RiemannSolveAM.F90 in EinsteinEvolve/GRHydro", "issue_body": "This PR adds the missing source file GRHydro_RiemannSolveAM.F90 to complete the EinsteinEvolve/GRHydro thorn implementation.", "base_commit": "HEAD", "resolved_issues": [{"number": 19, "title": "Implement the full functionality of GRHydro", "body": "Please implement the full functionality of `GRHydro` by finishing the code in `GRHydro_RiemannSolveAM.F90`.\n\n## Thorn Information:\n- Name: GRHydro\n- Target file: GRHydro_RiemannSolveAM.F90\n\n## Interface Definition in interface.ccl:\n\n## Schedule Definition in schedule.ccl:\n\n## Parameters Definition in param.ccl:\n\n## Configuration Definition in configuration.ccl:\n\n## Documentation Context in readme.md and doc/documentation.tex\n\n## Related Code Context in src folder\n\n"}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/einsteintoolkit_m_cactus:pr-19", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/arrangements/EinsteinEvolve/GRHydro/src/GRHydro_RiemannSolveAM.F90 b/arrangements/EinsteinEvolve/GRHydro/src/GRHydro_RiemannSolveAM.F90\nnew file mode 100644\nindex 0000000..0000000\n--- /dev/null\n+++ b/arrangements/EinsteinEvolve/GRHydro/src/GRHydro_RiemannSolveAM.F90\n@@ -0,0 +1,142 @@\n+ /*@@\n+ @file GRHydro_RiemannSolveAM.F90\n+ @date Sep 1, 2010\n+ @author \n+ @desc \n+ A wrapper routine to call the correct Riemann solver\n+ @enddesc \n+ @@*/\n+\n+#include \"cctk.h\"\n+#include \"cctk_Parameters.h\"\n+#include \"cctk_Arguments.h\"\n+#include \"cctk_Functions.h\"\n+#include \"GRHydro_Macros.h\"\n+\n+ /*@@\n+ @routine RiemannSolveAM\n+ @date Sep 1, 2010\n+ @author Joshua Faber, Scott Noble, Bruno Mundim, Pedro Montero, Ian Hawke\n+ @desc \n+ A wrapper routine to switch between the different Riemann solvers.\n+ @enddesc \n+ @calls \n+ @calledby \n+ @history \n+ \n+ @endhistory \n+\n+@@*/\n+\n+subroutine RiemannSolveAM(CCTK_ARGUMENTS)\n+\n+ implicit none\n+ \n+ DECLARE_CCTK_ARGUMENTS\n+ DECLARE_CCTK_PARAMETERS\n+ DECLARE_CCTK_FUNCTIONS\n+\n+ if (CCTK_EQUALS(riemann_solver,\"HLLE\").or.CCTK_EQUALS(riemann_solver,\"LLF\")) then\n+ \n+ call GRHydro_HLLE_AM(CCTK_PASS_FTOF)\n+ \n+ if (evolve_tracer .ne. 0) then\n+ \n+!!$ There are no special calls for tracers, which care not one whit about B-fields! \n+!!$ Just call the standard version...\n+ \n+ call GRHydro_HLLE_Tracer(CCTK_PASS_FTOF)\n+ \n+ end if\n+ \n+!!$ else if (CCTK_EQUALS(riemann_solver,\"Roe\")) then \n+!!$ \n+!!$ call GRHydro_RoeSolveAM(CCTK_PASS_FTOF)\n+!!$\n+!!$ if (evolve_tracer .ne. 0) then\n+!!$ \n+!!$ call GRHydro_HLLE_Tracer(CCTK_PASS_FTOF)\n+!!$\n+!!$ end if\n+!!$ \n+!!$ else if (CCTK_EQUALS(riemann_solver,\"Marquina\")) then \n+!!$ \n+!!$ call GRHydro_MarquinaM(CCTK_PASS_FTOF)\n+ \n+!!$ Tracers are built directly in to the Marquina solver\n+ \n+ else\n+ \n+ call CCTK_ERROR(\"Roe and Marquina not implemented in MHD yet!!!\")\n+ STOP\n+ \n+ end if\n+ \n+end subroutine RiemannSolveAM\n+\n+ /*@@\n+ @routine RiemannSolvePolytypeAM\n+ @date Sep 1, 2010\n+ @author Joshua Faber, Scott Noble, Bruno Mundim, Ian Hawke\n+ @desc \n+ The same as above, just specializing to polytropic type EOS.\n+ Currently there is no point to this routine right now.\n+ @enddesc \n+ @calls \n+ @calledby \n+ @history \n+ \n+ @endhistory \n+\n+@@*/\n+\n+\n+subroutine RiemannSolvePolytypeAM(CCTK_ARGUMENTS)\n+\n+ implicit none\n+ \n+ DECLARE_CCTK_ARGUMENTS\n+ DECLARE_CCTK_PARAMETERS\n+ DECLARE_CCTK_FUNCTIONS\n+\n+ if (CCTK_EQUALS(riemann_solver,\"HLLE\")) then\n+ \n+ call GRHydro_HLLE_AM(CCTK_PASS_FTOF)\n+ \n+ if (evolve_tracer .ne. 0) then\n+ \n+!!$ Call the non-MHD version - see above\n+ \n+ call GRHydro_HLLE_Tracer(CCTK_PASS_FTOF)\n+ \n+ end if\n+ \n+!!$ else if (CCTK_EQUALS(riemann_solver,\"Roe\")) then \n+!!$ \n+!!$ call GRHydro_RoeSolve(CCTK_PASS_FTOF)\n+!!$\n+!!$ if (evolve_tracer .ne. 0) then\n+!!$ \n+!!$ call GRHydro_HLLE_Tracer(CCTK_PASS_FTOF)\n+!!$\n+!!$ end if\n+!!$ \n+!!$ else if (CCTK_EQUALS(riemann_solver,\"Marquina\")) then \n+!!$ \n+!!$ call GRHydro_Marquina(CCTK_PASS_FTOF)\n+ \n+!!$ Tracers are built directly in to the Marquina solver\n+ \n+ else\n+ \n+ call CCTK_ERROR(\"Roe and Marquina not implemented in MHD yet!!!\")\n+ STOP\n+\n+ end if\n+ \n+end subroutine RiemannSolvePolytypeAM\n+\n+\n+\n+\n+"}, "test": {"test_patch": "diff --git a/all_tests.txt b/all_tests.txt\nnew file mode 100644\nindex 0000000..0000000\n--- /dev/null\n+++ b/all_tests.txt\n@@ -0,0 +1,10 @@\n+GRHydro_test_shock\n+GRHydro_test_shock_mp5\n+GRHydro_test_shock_ppm\n+GRHydro_test_tov_ppm_ML\n+GRHydro_test_tov_ppm_ML_disable_internal_excision\n+GRHydro_test_tov_ppm_no_trp_ML\n+test_one_hybrid\n+tov_carpetevolutionmask\n+tov_carpetevolutionmask2\n+tov_slowsector", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}12{"question_id": "MSB_einsteintoolkit_Cactus_pr2", "question_type": "multi_swe_bench", "description": "Add missing WaveMoLRegister.c in CactusExamples/WaveMoL (einsteintoolkit/Cactus#2)", "content": {"org": "einsteintoolkit", "repo": "Cactus", "pr_number": 2, "issue_title": "Add missing WaveMoLRegister.c in CactusExamples/WaveMoL", "issue_body": "This PR adds the missing source file WaveMoLRegister.c to complete the CactusExamples/WaveMoL thorn implementation.", "base_commit": "HEAD", "resolved_issues": [{"number": 2, "title": "Implement the full functionality of WaveMoL", "body": "Please implement the full functionality of `WaveMoL` by finishing the code in `WaveMoLRegister.c`.\n\n## Thorn Information:\n- Name: WaveMoL\n- Target file: WaveMoLRegister.c\n\n## Interface Definition in interface.ccl:\n\n## Schedule Definition in schedule.ccl:\n\n## Parameters Definition in param.ccl:\n\n## Configuration Definition in configuration.ccl:\n\n## Documentation Context in readme.md and doc/documentation.tex\n\n## Related Code Context in src folder\n\n"}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/einsteintoolkit_m_cactus:pr-2", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/arrangements/CactusExamples/WaveMoL/src/WaveMoLRegister.c b/arrangements/CactusExamples/WaveMoL/src/WaveMoLRegister.c\nnew file mode 100644\nindex 0000000..0000000\n--- /dev/null\n+++ b/arrangements/CactusExamples/WaveMoL/src/WaveMoLRegister.c\n@@ -0,0 +1,93 @@\n+ /*@@\n+ @file WaveMoLRegister.c\n+ @date Fri Nov 9 13:47:07 2001\n+ @author Ian Hawke\n+ @desc \n+ Routine to register the variables with the MoL thorn.\n+ @enddesc \n+ @@*/\n+\n+#include \"cctk.h\"\n+#include \"cctk_Arguments.h\"\n+#include \"cctk_Parameters.h\"\n+\n+static const char *rcsid = \"$Header$\";\n+\n+CCTK_FILEVERSION(CactusExamples_WaveMoL_WaveMoLRegister_c)\n+\n+/*\n+#ifndef DEBUG_MOL\n+#define DEBUG_MOL\n+#endif\n+*/\n+\n+void WaveMoL_RegisterVars(CCTK_ARGUMENTS);\n+\n+ /*@@\n+ @routine WaveMoL_RegisterVars\n+ @date Fri Nov 9 13:47:41 2001\n+ @author Ian Hawke\n+ @desc \n+ The registration routine.\n+ @enddesc \n+ @calls \n+ @calledby \n+ @history \n+ \n+ @endhistory \n+\n+@@*/\n+\n+void WaveMoL_RegisterVars(CCTK_ARGUMENTS)\n+{\n+\n+ DECLARE_CCTK_ARGUMENTS;\n+ DECLARE_CCTK_PARAMETERS;\n+\n+ CCTK_INT ierr = 0, group, rhs, var;\n+\n+ group = CCTK_GroupIndex(\"wavemol::scalarevolvemol_scalar\");\n+ rhs = CCTK_GroupIndex(\"wavemol::scalarrhsmol_scalar\");\n+\n+ if (CCTK_IsFunctionAliased(\"MoLRegisterEvolvedGroup\"))\n+ {\n+ ierr += MoLRegisterEvolvedGroup(group, rhs);\n+ }\n+ else\n+ {\n+ CCTK_WARN(0, \"MoL function not aliased\");\n+ ierr++;\n+ }\n+\n+ group = CCTK_GroupIndex(\"wavemol::scalarevolvemol_vector\");\n+ rhs = CCTK_GroupIndex(\"wavemol::scalarrhsmol_vector\");\n+\n+ if (CCTK_IsFunctionAliased(\"MoLRegisterEvolvedGroup\"))\n+ {\n+ ierr += MoLRegisterEvolvedGroup(group, rhs);\n+ }\n+ else\n+ {\n+ CCTK_WARN(0, \"MoL function MoLRegisterEvolvedGroup not aliased\");\n+ ierr++;\n+ }\n+\n+ var = CCTK_VarIndex(\"wavemol::energy\");\n+\n+ if (CCTK_IsFunctionAliased(\"MoLRegisterConstrained\"))\n+ {\n+ ierr += MoLRegisterConstrained(var);\n+ }\n+ else\n+ {\n+ CCTK_WARN(0, \"MoL function MoLRegisterConstrained not aliased\");\n+ ierr++;\n+ } \n+ \n+ if (ierr) CCTK_WARN(0,\"Problems registering with MoL\");\n+\n+#ifdef DEBUG_MOL\n+ printf(\"If we've got this far, then we've done with wavetoy registration.\\n\");\n+#endif \n+\n+}"}, "test": {"test_patch": "diff --git a/all_tests.txt b/all_tests.txt\nnew file mode 100644\nindex 0000000..0000000\n--- /dev/null\n+++ b/all_tests.txt\n@@ -0,0 +1,1 @@\n+gaussian", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}13{"question_id": "MSB_einsteintoolkit_Cactus_pr20", "question_type": "multi_swe_bench", "description": "Add missing gauge.F in EinsteinInitialData/Exact (einsteintoolkit/Cactus#20)", "content": {"org": "einsteintoolkit", "repo": "Cactus", "pr_number": 20, "issue_title": "Add missing gauge.F in EinsteinInitialData/Exact", "issue_body": "This PR adds the missing source file gauge.F to complete the EinsteinInitialData/Exact thorn implementation.", "base_commit": "HEAD", "resolved_issues": [{"number": 20, "title": "Implement the full functionality of Exact", "body": "Please implement the full functionality of `Exact` by finishing the code in `gauge.F`.\n\n## Thorn Information:\n- Name: Exact\n- Target file: gauge.F\n\n## Interface Definition in interface.ccl:\n\n## Schedule Definition in schedule.ccl:\n\n## Parameters Definition in param.ccl:\n\n## Configuration Definition in configuration.ccl:\n\n## Documentation Context in readme.md and doc/documentation.tex\n\n## Related Code Context in src folder\n\n"}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/einsteintoolkit_m_cactus:pr-20", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/arrangements/EinsteinInitialData/Exact/src/gauge.F b/arrangements/EinsteinInitialData/Exact/src/gauge.F\nnew file mode 100644\nindex 0000000..0000000\n--- /dev/null\n+++ b/arrangements/EinsteinInitialData/Exact/src/gauge.F\n@@ -0,0 +1,187 @@\n+C This routine sets the lapse and/or shift by calling a routine\n+C that does it pointwise. Note that it could be easily modified\n+C to set the Bona-Masso variables B_xx etc. \n+C $Header$\n+\n+#include \"cctk.h\"\n+#include \"cctk_Parameters.h\"\n+#include \"cctk_Arguments.h\"\n+#include \"cctk_Functions.h\"\n+\n+ subroutine Exact__gauge(CCTK_ARGUMENTS)\n+\n+ implicit none\n+\n+ DECLARE_CCTK_ARGUMENTS\n+ DECLARE_CCTK_PARAMETERS\n+ DECLARE_CCTK_FUNCTIONS\n+\n+ integer i,j,k\n+ integer nx,ny,nz\n+ logical set_lapse, set_dtlapse, set_shift, set_dtshift\n+\n+ CCTK_REAL tt, xx, yy, zz\n+ CCTK_REAL gxxtmp, gyytmp, gzztmp, \n+ $ gxytmp, gyztmp, gxztmp,\n+ $ hxxtmp, hyytmp, hzztmp, \n+ $ hxytmp, hyztmp, hxztmp,\n+ $ dxgxxtmp, dxgyytmp, dxgzztmp, \n+ $ dxgxytmp, dxgyztmp, dxgxztmp,\n+ $ dygxxtmp, dygyytmp, dygzztmp, \n+ $ dygxytmp, dygyztmp, dygxztmp,\n+ $ dzgxxtmp, dzgyytmp, dzgzztmp, \n+ $ dzgxytmp, dzgyztmp, dzgxztmp,\n+ $ alptmp, dtalptmp, axtmp, aytmp, aztmp, \n+ $ betaxtmp, betaytmp, betaztmp,\n+ $ dtbetaxtmp, dtbetaytmp, dtbetaztmp,\n+ $ bxxtmp, bxytmp, bxztmp, \n+ $ byxtmp, byytmp, byztmp, \n+ $ bzxtmp, bzytmp, bzztmp\n+ CCTK_REAL\n+ $ exact_psi,\n+ $ exact_psix, exact_psiy, exact_psiz,\n+ $ exact_psixx, exact_psiyy, exact_psizz,\n+ $ exact_psixy, exact_psiyz, exact_psixz\n+ LOGICAL is_initial_slice, is_later_slice\n+\n+C are we on the initial slice or some later slice?\n+C n.b. the logical expressions later in this function involving\n+C these flags below would be *so* much nicer if Fortran\n+C grokked C-style conditional expressions... :) :)\n+ is_initial_slice = cctk_iteration .eq. 0\n+ is_later_slice = cctk_iteration .ne. 0\n+\n+C Grid parameters.\n+ nx = cctk_lsh(1)\n+ ny = cctk_lsh(2)\n+ nz = cctk_lsh(3)\n+\n+C This code used to set t = time + dt/2 to get 2nd order accuracy,\n+C but this leads to the initial data being set at the wrong time. :(\n+C In the context of MoL, we want to set variables at the standard Cactus\n+C time (cctk_time), because MoL takes care of calling us at each MoL\n+C iteration, and updating the field variables appropriately.\n+C\n+C Alas, setting at cctk_time probably gives O(dt) errors for non-MoL\n+C evoutions where Exact is used to set stuff at each time step.\n+C Fixing this [unless we just declare all non-MoL stuff obselete :) ]\n+C probably requires cleaning up our (++messy) schedule.ccl , which\n+C is why this remains a bug for now... :( :(\n+\n+CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC\n+\n+C\n+C Set lapse and/or shift?\n+C\n+ if ( is_initial_slice ) then\n+ set_lapse = CCTK_Equals(initial_lapse, \"exact\").ne.0\n+ set_shift = CCTK_Equals(initial_shift, \"exact\").ne.0\n+ set_dtlapse = CCTK_Equals(initial_dtlapse, \"exact\").ne.0\n+ set_dtshift = CCTK_Equals(initial_dtshift, \"exact\").ne.0\n+ end if\n+ if ( is_later_slice ) then\n+ set_lapse = CCTK_Equals(lapse_evolution_method, \"exact\").ne.0\n+ set_shift = CCTK_Equals(shift_evolution_method, \"exact\").ne.0\n+ set_dtlapse = CCTK_Equals(dtlapse_evolution_method, \"exact\").ne.0\n+ set_dtshift = CCTK_Equals(dtshift_evolution_method, \"exact\").ne.0\n+ end if\n+\n+ if ( set_lapse .or. set_shift .or. set_dtlapse .or. set_dtshift) then\n+\n+C$omp parallel do private (\n+C$omp$ i, j, k,\n+C$omp$ tt, xx, yy, zz,\n+C$omp$ alptmp, dtalptmp, axtmp, aytmp, aztmp, \n+C$omp$ betaxtmp, betaytmp, betaztmp,\n+C$omp$ dtbetaxtmp, dtbetaytmp, dtbetaztmp,\n+C$omp$ bxxtmp, bxytmp, bxztmp, \n+C$omp$ byxtmp, byytmp, byztmp, \n+C$omp$ bzxtmp, bzytmp, bzztmp,\n+C$omp$ dxgxxtmp, dxgyytmp, dxgzztmp, \n+C$omp$ dxgxytmp, dxgyztmp, dxgxztmp,\n+C$omp$ dygxxtmp, dygyytmp, dygzztmp, \n+C$omp$ dygxytmp, dygyztmp, dygxztmp,\n+C$omp$ dzgxxtmp, dzgyytmp, dzgzztmp, \n+C$omp$ dzgxytmp, dzgyztmp, dzgxztmp,\n+C$omp$ exact_psi,\n+C$omp$ exact_psix, exact_psiy, exact_psiz,\n+C$omp$ exact_psixx, exact_psiyy, exact_psizz,\n+C$omp$ exact_psixy, exact_psiyz, exact_psixz)\n+ do k=1,nz\n+ do j=1,ny\n+ do i=1,nx\n+\n+ tt = cctk_time\n+ xx = x(i,j,k) - cctk_time * shift_add_x\n+ yy = y(i,j,k) - cctk_time * shift_add_y\n+ zz = z(i,j,k) - cctk_time * shift_add_z\n+\n+C Initialize the psi of exact\n+C (also to tell the models about the conformal_state)\n+ if (conformal_state .ne. 0) then\n+ exact_psi = 1.0D0\n+ else\n+ exact_psi = 0.0D0\n+ end if\n+ exact_psix = 0.0D0\n+ exact_psiy = 0.0D0\n+ exact_psiz = 0.0D0\n+ exact_psixx = 0.0D0\n+ exact_psiyy = 0.0D0\n+ exact_psizz = 0.0D0\n+ exact_psixy = 0.0D0\n+ exact_psiyz = 0.0D0\n+ exact_psixz = 0.0D0\n+\n+ call Exact__Bona_Masso_data(\n+ $ decoded_exact_model,\n+ $ xx, yy, zz, tt,\n+ $ gxxtmp, gyytmp, gzztmp, \n+ $ gxytmp, gyztmp, gxztmp,\n+ $ hxxtmp, hyytmp, hzztmp, \n+ $ hxytmp, hyztmp, hxztmp,\n+ $ exact_psi,\n+ $ exact_psix, exact_psiy, exact_psiz,\n+ $ exact_psixx, exact_psiyy, exact_psizz,\n+ $ exact_psixy, exact_psiyz, exact_psixz,\n+ $ dxgxxtmp, dxgyytmp, dxgzztmp, \n+ $ dxgxytmp, dxgyztmp, dxgxztmp,\n+ $ dygxxtmp, dygyytmp, dygzztmp, \n+ $ dygxytmp, dygyztmp, dygxztmp,\n+ $ dzgxxtmp, dzgyytmp, dzgzztmp, \n+ $ dzgxytmp, dzgyztmp, dzgxztmp,\n+ $ alptmp, dtalptmp, axtmp, aytmp, aztmp, \n+ $ betaxtmp, betaytmp, betaztmp,\n+ $ dtbetaxtmp, dtbetaytmp, dtbetaztmp,\n+ $ bxxtmp, bxytmp, bxztmp, \n+ $ byxtmp, byytmp, byztmp, \n+ $ bzxtmp, bzytmp, bzztmp)\n+\n+ if ( set_lapse ) then\n+ alp(i,j,k) = alptmp\n+ end if\n+ if ( set_shift ) then\n+ betax(i,j,k) = betaxtmp + shift_add_x\n+ betay(i,j,k) = betaytmp + shift_add_y\n+ betaz(i,j,k) = betaztmp + shift_add_z\n+ end if\n+ if ( set_dtlapse ) then\n+ dtalp(i,j,k) = dtalptmp\n+ end if\n+ if ( set_dtshift ) then\n+ dtbetax(i,j,k) = dtbetaxtmp\n+ dtbetay(i,j,k) = dtbetaytmp\n+ dtbetaz(i,j,k) = dtbetaztmp\n+ end if\n+ end do\n+ end do\n+ end do\n+\n+CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC\n+\n+ else\n+ call CCTK_WARN(1,'Exact__gauge has been called without doing anything')\n+ end if\n+\n+ return\n+ end"}, "test": {"test_patch": "diff --git a/all_tests.txt b/all_tests.txt\nnew file mode 100644\nindex 0000000..0000000\n--- /dev/null\n+++ b/all_tests.txt\n@@ -0,0 +1,2 @@\n+Schwarzschild_EF\n+bowl-init", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}14{"question_id": "MSB_einsteintoolkit_Cactus_pr21", "question_type": "multi_swe_bench", "description": "Add missing metrics/de_Sitter.F in EinsteinInitialData/Exact (einsteintoolkit/Cactus#21)", "content": {"org": "einsteintoolkit", "repo": "Cactus", "pr_number": 21, "issue_title": "Add missing metrics/de_Sitter.F in EinsteinInitialData/Exact", "issue_body": "This PR adds the missing source file metrics/de_Sitter.F to complete the EinsteinInitialData/Exact thorn implementation.", "base_commit": "HEAD", "resolved_issues": [{"number": 21, "title": "Implement the full functionality of Exact", "body": "Please implement the full functionality of `Exact` by finishing the code in `metrics/de_Sitter.F`.\n\n## Thorn Information:\n- Name: Exact\n- Target file: metrics/de_Sitter.F\n\n## Interface Definition in interface.ccl:\n\n## Schedule Definition in schedule.ccl:\n\n## Parameters Definition in param.ccl:\n\n## Configuration Definition in configuration.ccl:\n\n## Documentation Context in readme.md and doc/documentation.tex\n\n## Related Code Context in src folder\n\n"}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/einsteintoolkit_m_cactus:pr-21", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/arrangements/EinsteinInitialData/Exact/src/metrics/de_Sitter.F b/arrangements/EinsteinInitialData/Exact/src/metrics/de_Sitter.F\nnew file mode 100644\nindex 0000000..0000000\n--- /dev/null\n+++ b/arrangements/EinsteinInitialData/Exact/src/metrics/de_Sitter.F\n@@ -0,0 +1,79 @@\n+C Einstein-DeSitter metric spacetime !!!!\n+C It emulates the Robertson-Walker universe\n+C near t=0, with zero pressure, and k=0\n+C See :J.N. Islam, An Introduction to \n+C Mathematical Cosmology, Cambridge, 1992 and \n+C S. Hawking, G.F.R. Ellis, The Large Scale\n+C Structure of space-time, Cambridge, 1973\n+C\n+C Author : D. Vulcanov (Timisoara, Romania)\n+C see ../../README for copyright & licensing info\n+C\n+C $Header$\n+\n+#include \"cctk.h\"\n+#include \"cctk_Parameters.h\"\n+\n+ subroutine Exact__de_Sitter(\n+ $ x, y, z, t,\n+ $ gdtt, gdtx, gdty, gdtz, \n+ $ gdxx, gdyy, gdzz, gdxy, gdyz, gdzx,\n+ $ gutt, gutx, guty, gutz, \n+ $ guxx, guyy, guzz, guxy, guyz, guzx,\n+ $ psi, Tmunu_flag)\n+\n+ implicit none\n+\n+ DECLARE_CCTK_PARAMETERS\n+\n+c input arguments\n+ CCTK_DECLARE(CCTK_REAL, x,)\n+ CCTK_DECLARE(CCTK_REAL, y,)\n+ CCTK_DECLARE(CCTK_REAL, z,)\n+ CCTK_REAL t\n+\n+c output arguments\n+ CCTK_REAL gdtt, gdtx, gdty, gdtz, \n+ $ gdxx, gdyy, gdzz, gdxy, gdyz, gdzx,\n+ $ gutt, gutx, guty, gutz, \n+ $ guxx, guyy, guzz, guxy, guyz, guzx\n+ CCTK_DECLARE(CCTK_REAL, psi,)\n+ LOGICAL Tmunu_flag\n+\n+c local variables\n+ CCTK_REAL arad\n+ CCTK_REAL am\n+\n+C This model has a cosmological constant\n+C ==> it sets the stress-energy tensor in the \"CalcTmunu\" code\n+ Tmunu_flag = .true.\n+\n+ arad = de_Sitter__scale\n+ \n+ am=arad*t**(4.0D0/3.0D0) \n+\n+ gdtt = -1.0D0 \n+ gdtx = 0.0D0 \n+ gdty = 0.0D0\n+ gdtz = 0.0D0\n+ gdxx = am\n+ gdyy = am\n+ gdzz = am\n+ gdxy = 0.d0\n+ gdyz = 0.d0\n+ gdzx = 0.d0\n+\n+ gutt = -1.d0\n+ gutx = 0.d0\n+ guty = 0.d0\n+ gutz = 0.d0\n+ guxx = 1.d0/am\n+ guyy = 1.d0/am\n+ guzz = 1.d0/am\n+ guxy = 0.d0\n+ guyz = 0.d0\n+ guzx = 0.d0\n+\n+\n+ return\n+ end"}, "test": {"test_patch": "diff --git a/all_tests.txt b/all_tests.txt\nnew file mode 100644\nindex 0000000..0000000\n--- /dev/null\n+++ b/all_tests.txt\n@@ -0,0 +1,2 @@\n+Schwarzschild_EF\n+bowl-init", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}15{"question_id": "MSB_einsteintoolkit_Cactus_pr22", "question_type": "multi_swe_bench", "description": "Add missing metrics/Schwarzschild_EF.F in EinsteinInitialData/Exact (einsteintoolkit/Cactus#22)", "content": {"org": "einsteintoolkit", "repo": "Cactus", "pr_number": 22, "issue_title": "Add missing metrics/Schwarzschild_EF.F in EinsteinInitialData/Exact", "issue_body": "This PR adds the missing source file metrics/Schwarzschild_EF.F to complete the EinsteinInitialData/Exact thorn implementation.", "base_commit": "HEAD", "resolved_issues": [{"number": 22, "title": "Implement the full functionality of Exact", "body": "Please implement the full functionality of `Exact` by finishing the code in `metrics/Schwarzschild_EF.F`.\n\n## Thorn Information:\n- Name: Exact\n- Target file: metrics/Schwarzschild_EF.F\n\n## Interface Definition in interface.ccl:\n\n## Schedule Definition in schedule.ccl:\n\n## Parameters Definition in param.ccl:\n\n## Configuration Definition in configuration.ccl:\n\n## Documentation Context in readme.md and doc/documentation.tex\n\n## Related Code Context in src folder\n\n"}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/einsteintoolkit_m_cactus:pr-22", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/arrangements/EinsteinInitialData/Exact/src/metrics/Schwarzschild_EF.F b/arrangements/EinsteinInitialData/Exact/src/metrics/Schwarzschild_EF.F\nnew file mode 100644\nindex 0000000..0000000\n--- /dev/null\n+++ b/arrangements/EinsteinInitialData/Exact/src/metrics/Schwarzschild_EF.F\n@@ -0,0 +1,75 @@\n+c Schwarzschild metric in Eddington-Finkelstein coordinates,\n+c as per MTW box 31.2\n+C\n+C Author: unknown\n+C Copyright/License: unknown\n+C\n+c $Header$\n+\n+#include \"cctk.h\"\n+#include \"cctk_Parameters.h\"\n+\n+ subroutine Exact__Schwarzschild_EF(\n+ $ x, y, z, t,\n+ $ gdtt, gdtx, gdty, gdtz, \n+ $ gdxx, gdyy, gdzz, gdxy, gdyz, gdzx,\n+ $ gutt, gutx, guty, gutz, \n+ $ guxx, guyy, guzz, guxy, guyz, guzx,\n+ $ psi, Tmunu_flag)\n+\n+ implicit none\n+\n+ DECLARE_CCTK_PARAMETERS\n+\n+c input arguments\n+ CCTK_REAL x, y, z\n+ CCTK_DECLARE(CCTK_REAL, t,)\n+\n+c output arguments\n+ CCTK_REAL gdtt, gdtx, gdty, gdtz, \n+ $ gdxx, gdyy, gdzz, gdxy, gdyz, gdzx,\n+ $ gutt, gutx, guty, gutz, \n+ $ guxx, guyy, guzz, guxy, guyz, guzx\n+ CCTK_DECLARE(CCTK_REAL, psi,)\n+ LOGICAL Tmunu_flag\n+\n+c local static variables\n+ CCTK_REAL eps, m\n+\n+c local variables\n+ CCTK_REAL r\n+\n+C This is a vacuum spacetime with no cosmological constant\n+ Tmunu_flag = .false.\n+\n+C Get parameters of the exact solution.\n+\n+ eps = Schwarzschild_EF__epsilon\n+ m = Schwarzschild_EF__mass\n+\n+ r = max(sqrt(x**2 + y**2 + z**2), eps)\n+\n+ gdtt = - (1.d0 - 2.d0 * m / r)\n+ gdtx = 2.d0 * m * x / r**2\n+ gdty = 2.d0 * m * y / r**2\n+ gdtz = 2.d0 * m * z / r**2\n+ gdxx = 1.d0 + 2.d0 * m * x**2 / r**3\n+ gdyy = 1.d0 + 2.d0 * m * y**2 / r**3\n+ gdzz = 1.d0 + 2.d0 * m * z**2 / r**3\n+ gdxy = 2.d0 * m * x * y / r**3\n+ gdyz = 2.d0 * m * y * z / r**3\n+ gdzx = 2.d0 * m * z * x / r**3\n+\n+ gutt = - (1.d0 + 2.d0 * m / r)\n+ gutx = 2.d0 * m * x / r**2\n+ guty = 2.d0 * m * y / r**2\n+ gutz = 2.d0 * m * z / r**2\n+ guxx = 1.d0 - 2.d0 * m * x**2 / r**3\n+ guyy = 1.d0 - 2.d0 * m * y**2 / r**3\n+ guzz = 1.d0 - 2.d0 * m * z**2 / r**3\n+ guxy = - 2.d0 * m * x * y / r**3\n+ guyz = - 2.d0 * m * y * z / r**3\n+ guzx = - 2.d0 * m * z * x / r**3\n+\n+ return\n+ end"}, "test": {"test_patch": "diff --git a/all_tests.txt b/all_tests.txt\nnew file mode 100644\nindex 0000000..0000000\n--- /dev/null\n+++ b/all_tests.txt\n@@ -0,0 +1,2 @@\n+Schwarzschild_EF\n+bowl-init", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}16{"question_id": "MSB_einsteintoolkit_Cactus_pr23", "question_type": "multi_swe_bench", "description": "Add missing Misner_standard.c in EinsteinInitialData/IDAnalyticBH (einsteintoolkit/Cactus#23)", "content": {"org": "einsteintoolkit", "repo": "Cactus", "pr_number": 23, "issue_title": "Add missing Misner_standard.c in EinsteinInitialData/IDAnalyticBH", "issue_body": "This PR adds the missing source file Misner_standard.c to complete the EinsteinInitialData/IDAnalyticBH thorn implementation.", "base_commit": "HEAD", "resolved_issues": [{"number": 23, "title": "Implement the full functionality of IDAnalyticBH", "body": "Please implement the full functionality of `IDAnalyticBH` by finishing the code in `Misner_standard.c`.\n\n## Thorn Information:\n- Name: IDAnalyticBH\n- Target file: Misner_standard.c\n\n## Interface Definition in interface.ccl:\n\n## Schedule Definition in schedule.ccl:\n\n## Parameters Definition in param.ccl:\n\n## Configuration Definition in configuration.ccl:\n\n## Documentation Context in readme.md and doc/documentation.tex\n\n## Related Code Context in src folder\n\n"}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/einsteintoolkit_m_cactus:pr-23", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/arrangements/EinsteinInitialData/IDAnalyticBH/src/Misner_standard.c b/arrangements/EinsteinInitialData/IDAnalyticBH/src/Misner_standard.c\nnew file mode 100644\nindex 0000000..0000000\n--- /dev/null\n+++ b/arrangements/EinsteinInitialData/IDAnalyticBH/src/Misner_standard.c\n@@ -0,0 +1,284 @@\n+ /*@@\n+ @file Misner_standard.c\n+ @date March 1997\n+ @author Joan Masso\n+ @desc\n+ Set up initial data for two Misner black holes\n+ @enddesc\n+ @history\n+ @hdate Sun Oct 17 11:05:48 1999 @hauthor Tom Goodale\n+ @hdesc Converted to C\n+ @endhistory\n+ @version $Header$\n+ @@*/\n+\n+#include <math.h>\n+#include <string.h>\n+#include <stdlib.h>\n+\n+#include \"cctk.h\"\n+#include \"cctk_Arguments.h\"\n+#include \"cctk_Parameters.h\"\n+\n+#include \"IDAnalyticBH.h\"\n+\n+static const char *rcsid = \"$Header$\";\n+\n+CCTK_FILEVERSION(CactusEinstein_IDAnalyticBH_Misner_standard_c)\n+\n+ /*@@\n+ @routine Misner_standard\n+ @date\n+ @author Joan Masso, Ed Seidel\n+ @desc\n+ Initialize the metric with a time symmetrical\n+ black hole spacetime containing\n+ two axially symmetric misner black holes with a\n+ mass/length parameter mu. The mass is computed.\n+ The spacetime line element has the form:\n+ $$ ds^2 = -dt^2 + \\Psi^4 (dx^2+dy^2+dz^2) $$\n+ and only $\\Psi$ differs.\n+ (Conformal factor from Karen Camarda)\n+ @enddesc\n+\n+ @par mu\n+ @pdesc Misner parameter.\n+ @ptype real\n+ @pcomment Values less than 1.8 do not really correspond to two\n+ black holes, as there is an initial single event horizon\n+ surrounding the throats. So, with low values of mu we also\n+ have distorted single black holes.\n+ @endpar\n+\n+ @par nmax\n+ @pdesc Summation limit for the misner series in the 'twobh' case.\n+ @ptype integer\n+ @endpar\n+ @history\n+ @hdate Fri Apr 26 10:04:05 2002 @hauthor Tom Goodale\n+ @hdesc Changed to use new StaticConformal stuff\n+ @endhistory \n+\n+@@*/\n+void Misner_standard(CCTK_ARGUMENTS)\n+{\n+ DECLARE_CCTK_ARGUMENTS\n+ DECLARE_CCTK_PARAMETERS\n+\n+ int i, n;\n+ int npoints;\n+ CCTK_REAL *csch, *coth, inv_r1, inv_r2;\n+ CCTK_REAL x_squared, y_squared, xy_squared;\n+ CCTK_REAL inv_r1_cubed, inv_r2_cubed;\n+ CCTK_REAL inv_r1_5, inv_r2_5;\n+ CCTK_REAL inv_psi;\n+ CCTK_INT powfac;\n+ CCTK_REAL adm_mass;\n+ const CCTK_REAL zero = 0.0, one = 1.0, three = 3.0;\n+ int make_conformal_derivs = 0;\n+\n+ CCTK_VInfo(CCTK_THORNSTRING,\n+ \"setting up Misner initial data\");\n+\n+ /* Check if we should create and store conformal factor stuff */\n+ if(CCTK_EQUALS(metric_type, \"static conformal\"))\n+ {\n+ if (CCTK_EQUALS(conformal_storage,\"factor\"))\n+ {\n+ *conformal_state = 1;\n+ make_conformal_derivs = 0;\n+ }\n+ else if (CCTK_EQUALS(conformal_storage,\"factor+derivs\"))\n+ {\n+ *conformal_state = 2;\n+ make_conformal_derivs = 1;\n+ }\n+ else if (CCTK_EQUALS(conformal_storage,\"factor+derivs+2nd derivs\"))\n+ {\n+ *conformal_state = 3;\n+ make_conformal_derivs = 1;\n+ }\n+ else\n+ {\n+ CCTK_VWarn(0, __LINE__, __FILE__, CCTK_THORNSTRING,\n+\"Misner_Standard(): impossible value for conformal_storage=\\\"%s\\\"!\",\n+ conformal_storage); /*NOTREACHED*/\n+ }\n+ } \n+\n+ /* total number of points on this processor */\n+ npoints = cctk_lsh[0] * cctk_lsh[1] * cctk_lsh[2];\n+\n+\n+ /* Initialize so we can accumulate\n+ * -------------------------------\n+ */\n+ if (make_conformal_derivs)\n+ {\n+ IDAnalyticBH_zero_CCTK_REAL_array(npoints, psix);\n+ IDAnalyticBH_zero_CCTK_REAL_array(npoints, psiy);\n+ IDAnalyticBH_zero_CCTK_REAL_array(npoints, psiz);\n+\n+ if(*conformal_state > 2)\n+ {\n+ IDAnalyticBH_zero_CCTK_REAL_array(npoints, psixx);\n+ IDAnalyticBH_zero_CCTK_REAL_array(npoints, psixy);\n+ IDAnalyticBH_zero_CCTK_REAL_array(npoints, psixz);\n+ IDAnalyticBH_zero_CCTK_REAL_array(npoints, psiyy);\n+ IDAnalyticBH_zero_CCTK_REAL_array(npoints, psiyz);\n+ IDAnalyticBH_zero_CCTK_REAL_array(npoints, psizz);\n+ }\n+ }\n+\n+ csch = (CCTK_REAL *) malloc (2 * (nmax + 1) * sizeof (CCTK_REAL));\n+ coth = csch + nmax + 1;\n+\n+ /* compute the ADM mass\n+ * --------------------\n+ */\n+ adm_mass = zero;\n+ for(n = 1; n <= nmax; n++)\n+ {\n+ csch[n] = one / sinh(mu*n);\n+ coth[n] = one / tanh(mu*n);\n+ adm_mass += 4.0 * csch[n];\n+ }\n+ CCTK_VInfo(CCTK_THORNSTRING, \"ADM mass is %f\", (double) adm_mass);\n+\n+\n+ for(i = 0; i < npoints; i++)\n+ {\n+ psi [i] = one;\n+\n+ x_squared = SQR(x[i]);\n+ y_squared = SQR(y[i]);\n+ xy_squared = x_squared + y_squared;\n+\n+ for(n = nmax; n >= 1; n--)\n+ {\n+ inv_r1 = one / sqrt(xy_squared+SQR(z[i]+coth[n]));\n+ inv_r2 = one / sqrt(xy_squared+SQR(z[i]-coth[n]));\n+\n+ psi[i] += csch[n]*(inv_r1 + inv_r2);\n+\n+ if (make_conformal_derivs)\n+ {\n+ inv_r1_cubed = inv_r1 * inv_r1 * inv_r1;\n+ inv_r2_cubed = inv_r2 * inv_r2 * inv_r2;\n+ inv_r1_5 = inv_r1 * inv_r1 * inv_r1_cubed;\n+ inv_r2_5 = inv_r2 * inv_r2 * inv_r2_cubed;\n+ psix[i] += -x[i] * (inv_r2_cubed + inv_r1_cubed) * csch[n];\n+ psiy[i] += -y[i] * (inv_r2_cubed + inv_r1_cubed) * csch[n];\n+ psiz[i] += (-(z[i]-coth[n])*inv_r2_cubed - (z[i]+coth[n])*inv_r1_cubed) * csch[n];\n+\n+\n+ if(*conformal_state > 2)\n+ {\n+ psixx[i] += (three*x_squared*(inv_r1_5 + inv_r2_5)\n+ - inv_r1_cubed - inv_r2_cubed) * csch[n];\n+ psixy[i] += three*x[i]*y[i]*(inv_r1_5 + inv_r2_5) * csch[n];\n+ psixz[i] += (three*x[i]*(z[i] - coth[n])*inv_r2_5\n+ + three*x[i]*(z[i] + coth[n])*inv_r1_5) * csch[n];\n+ psiyy[i] += (three*y_squared*(inv_r1_5 + inv_r2_5)\n+ - inv_r1_cubed - inv_r2_cubed) * csch[n];\n+ psiyz[i] += (three*y[i]*(z[i] - coth[n])*inv_r2_5\n+ + three*y[i]*(z[i] + coth[n])*inv_r1_5) * csch[n];\n+ psizz[i] += (-inv_r2_cubed+three*SQR(z[i] - coth[n])*inv_r2_5\n+ + three*SQR(z[i] + coth[n])*inv_r1_5 - inv_r1_cubed) * csch[n];\n+ }\n+ }\n+ }\n+\n+ /* Cactus convention\n+ * -----------------\n+ */\n+ if (make_conformal_derivs)\n+ {\n+ inv_psi = one / psi[i];\n+\n+ psix[i] *= inv_psi;\n+ psiy[i] *= inv_psi;\n+ psiz[i] *= inv_psi;\n+\n+ if(*conformal_state > 2)\n+ {\n+ psixx[i] *= inv_psi;\n+ psixy[i] *= inv_psi;\n+ psixz[i] *= inv_psi;\n+ psiyy[i] *= inv_psi;\n+ psiyz[i] *= inv_psi;\n+ psizz[i] *= inv_psi;\n+ }\n+ }\n+ }\n+\n+ /* Should initialize lapse to Cadez value if possible\n+ * --------------------------------------------------\n+ */\n+\n+ if (CCTK_Equals(initial_lapse,\"cadez\"))\n+ {\n+ CCTK_INFO(\"Initialise with cadez lapse\");\n+\n+ for(i = 0; i < npoints; i++)\n+ {\n+ xy_squared = SQR(x[i]) + SQR(y[i]);\n+\n+ alp[i] = one;\n+\n+ powfac = 1;\n+\n+ for(n = 1; n <= nmax; n++)\n+ {\n+ inv_r1 = one / sqrt(xy_squared+SQR(z[i]+coth[n]));\n+ inv_r2 = one / sqrt(xy_squared+SQR(z[i]-coth[n]));\n+ powfac = -powfac;\n+\n+ alp[i] += powfac * csch[n] * (inv_r1 + inv_r2);\n+ }\n+\n+ alp[i] /= psi[i];\n+ }\n+ }\n+\n+ /* Metric depends on conformal state\n+ * ---------------------------------\n+ */\n+\n+ if (CCTK_EQUALS(metric_type, \"static conformal\"))\n+ {\n+ for(i = 0; i < npoints; i++)\n+ {\n+ gxx[i] = one;\n+ gyy[i] = one;\n+ gzz[i] = one;\n+ }\n+ }\n+ else\n+ {\n+ for(i = 0; i < npoints; i++)\n+ {\n+ gxx[i] = psi[i] * psi[i] * psi[i] * psi[i];\n+ gyy[i] = gxx[i];\n+ gzz[i] = gxx[i];\n+ }\n+ }\n+ IDAnalyticBH_zero_CCTK_REAL_array(npoints, gxy);\n+ IDAnalyticBH_zero_CCTK_REAL_array(npoints, gxz);\n+ IDAnalyticBH_zero_CCTK_REAL_array(npoints, gyz);\n+\n+ /* Time-symmetric data\n+ * -------------------\n+ */\n+ IDAnalyticBH_zero_CCTK_REAL_array(npoints, kxx);\n+ IDAnalyticBH_zero_CCTK_REAL_array(npoints, kxy);\n+ IDAnalyticBH_zero_CCTK_REAL_array(npoints, kxz);\n+ IDAnalyticBH_zero_CCTK_REAL_array(npoints, kyy);\n+ IDAnalyticBH_zero_CCTK_REAL_array(npoints, kyz);\n+ IDAnalyticBH_zero_CCTK_REAL_array(npoints, kzz);\n+\n+ if (csch)\n+ {\n+ free (csch);\n+ }\n+}"}, "test": {"test_patch": "diff --git a/all_tests.txt b/all_tests.txt\nnew file mode 100644\nindex 0000000..0000000\n--- /dev/null\n+++ b/all_tests.txt\n@@ -0,0 +1,3 @@\n+kerr\n+test_bl\n+test_misner", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}17{"question_id": "MSB_einsteintoolkit_Cactus_pr24", "question_type": "multi_swe_bench", "description": "Add missing BrillLindquist.c in EinsteinInitialData/IDAnalyticBH (einsteintoolkit/Cactus#24)", "content": {"org": "einsteintoolkit", "repo": "Cactus", "pr_number": 24, "issue_title": "Add missing BrillLindquist.c in EinsteinInitialData/IDAnalyticBH", "issue_body": "This PR adds the missing source file BrillLindquist.c to complete the EinsteinInitialData/IDAnalyticBH thorn implementation.", "base_commit": "HEAD", "resolved_issues": [{"number": 24, "title": "Implement the full functionality of IDAnalyticBH", "body": "Please implement the full functionality of `IDAnalyticBH` by finishing the code in `BrillLindquist.c`.\n\n## Thorn Information:\n- Name: IDAnalyticBH\n- Target file: BrillLindquist.c\n\n## Interface Definition in interface.ccl:\n\n## Schedule Definition in schedule.ccl:\n\n## Parameters Definition in param.ccl:\n\n## Configuration Definition in configuration.ccl:\n\n## Documentation Context in readme.md and doc/documentation.tex\n\n## Related Code Context in src folder\n\n"}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/einsteintoolkit_m_cactus:pr-24", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/arrangements/EinsteinInitialData/IDAnalyticBH/src/BrillLindquist.c b/arrangements/EinsteinInitialData/IDAnalyticBH/src/BrillLindquist.c\nnew file mode 100644\nindex 0000000..0000000\n--- /dev/null\n+++ b/arrangements/EinsteinInitialData/IDAnalyticBH/src/BrillLindquist.c\n@@ -0,0 +1,241 @@\n+ /*@@\n+ @file BrillLindquist.F\n+ @date\n+ @author\n+ @desc\n+ Set up initial data for Brill Lindquist black holes\n+ @enddesc\n+ @version $Header$\n+ @@*/\n+\n+#include <math.h>\n+#include <string.h>\n+\n+#include \"cctk.h\"\n+#include \"cctk_Arguments.h\"\n+#include \"cctk_Parameters.h\"\n+\n+#include \"IDAnalyticBH.h\"\n+\n+static const char *rcsid = \"$Header$\";\n+CCTK_FILEVERSION(CactusEinstein_IDAnalyticBH_BrillLindquist_c)\n+\n+#define MAX_HOLES 4\n+\n+ /*@@\n+ @routine BrillLindquist\n+ @date\n+ @author\n+ @desc\n+ Set up initial data for Brill Lindquist black holes\n+ @enddesc\n+ @history\n+ @hdate Fri Apr 26 10:04:05 2002 @hauthor Tom Goodale\n+ @hdesc Changed to use new StaticConformal stuff\n+ @endhistory \n+@@*/\n+void BrillLindquist(CCTK_ARGUMENTS)\n+{\n+ DECLARE_CCTK_ARGUMENTS\n+ DECLARE_CCTK_PARAMETERS\n+\n+ int n;\n+ CCTK_REAL hole_mass[MAX_HOLES], hole_x0[MAX_HOLES];\n+ CCTK_REAL hole_y0[MAX_HOLES], hole_z0[MAX_HOLES];\n+ CCTK_REAL tmp1, tmp2, tmp3;\n+ CCTK_REAL xval, yval, zval;\n+ int i, npoints;\n+ int make_conformal_derivs = 0;\n+\n+ CCTK_VInfo(CCTK_THORNSTRING,\n+ \"setting up Brill-Lindquist initial data for %d black holes\",\n+ (int)bl_nbh);\n+\n+ /* Check if we should create and store conformal factor stuff */\n+ if(CCTK_EQUALS(metric_type, \"static conformal\"))\n+ {\n+ if (CCTK_EQUALS(conformal_storage,\"factor\"))\n+ {\n+ *conformal_state = 1;\n+ make_conformal_derivs = 0;\n+ }\n+ else if (CCTK_EQUALS(conformal_storage,\"factor+derivs\"))\n+ {\n+ *conformal_state = 2;\n+ make_conformal_derivs = 1;\n+ }\n+ else if (CCTK_EQUALS(conformal_storage,\"factor+derivs+2nd derivs\"))\n+ {\n+ *conformal_state = 3;\n+ make_conformal_derivs = 1;\n+ }\n+ else\n+ {\n+ CCTK_VWarn(0, __LINE__, __FILE__, CCTK_THORNSTRING,\n+\"BrillLindquist(): impossible value for conformal_storage=\\\"%s\\\"!\",\n+ conformal_storage); /*NOTREACHED*/\n+ }\n+ }\n+\n+\n+ npoints = cctk_lsh[0] * cctk_lsh[1] * cctk_lsh[2];\n+\n+ /* Put parameters into arrays for following calculations\n+ * -----------------------------------------------------\n+ */\n+ hole_x0[0] = -bl_x0_1;\n+ hole_y0[0] = -bl_y0_1;\n+ hole_z0[0] = -bl_z0_1;\n+ hole_mass[0] = bl_M_1;\n+\n+ hole_x0[1] = -bl_x0_2;\n+ hole_y0[1] = -bl_y0_2;\n+ hole_z0[1] = -bl_z0_2;\n+ hole_mass[1] = bl_M_2;\n+\n+ hole_x0[2] = -bl_x0_3;\n+ hole_y0[2] = -bl_y0_3;\n+ hole_z0[2] = -bl_z0_3;\n+ hole_mass[2] = bl_M_3;\n+\n+ hole_x0[3] = -bl_x0_4;\n+ hole_y0[3] = -bl_y0_4;\n+ hole_z0[3] = -bl_z0_4;\n+ hole_mass[3] = bl_M_4;\n+\n+ \n+ if (make_conformal_derivs == 1)\n+ {\n+ IDAnalyticBH_zero_CCTK_REAL_array(npoints, psix);\n+ IDAnalyticBH_zero_CCTK_REAL_array(npoints, psiy);\n+ IDAnalyticBH_zero_CCTK_REAL_array(npoints, psiz);\n+\n+ if(*conformal_state > 2)\n+ {\n+ IDAnalyticBH_zero_CCTK_REAL_array(npoints, psixx);\n+ IDAnalyticBH_zero_CCTK_REAL_array(npoints, psixy);\n+ IDAnalyticBH_zero_CCTK_REAL_array(npoints, psixz);\n+ IDAnalyticBH_zero_CCTK_REAL_array(npoints, psiyy);\n+ IDAnalyticBH_zero_CCTK_REAL_array(npoints, psiyz);\n+ IDAnalyticBH_zero_CCTK_REAL_array(npoints, psizz);\n+ }\n+ }\n+\n+ for (i = 0; i < npoints; i++)\n+ {\n+ /* Initialize to zero and then use +=\n+ * ----------------------------------\n+ */\n+\n+ psi[i] = 1.0;\n+\n+ xval = x[i];\n+ yval = y[i];\n+ zval = z[i];\n+\n+ for(n = 0; n < bl_nbh; n++)\n+ {\n+\n+ /* Maple Output\n+ * ------------\n+ */\n+\n+ tmp1 = sqrt(SQR(xval+hole_x0[n])\n+ +SQR(yval+hole_y0[n])\n+ +SQR(zval+hole_z0[n])\n+ +SQR(epsilon));\n+\n+ psi[i] += hole_mass[n]/tmp1*0.5;\n+\n+ if (make_conformal_derivs == 1)\n+ {\n+ tmp2 = 1 / (tmp1 * tmp1 * tmp1);\n+ tmp3 = 4 * (3.0 / 8.0) * hole_mass[n] * tmp2 / (tmp1 * tmp1);\n+ tmp2 *= -0.5 * hole_mass[n];\n+\n+ psix[i] += tmp2 * (xval+hole_x0[n]);\n+ psiy[i] += tmp2 * (yval+hole_y0[n]);\n+ psiz[i] += tmp2 * (zval+hole_z0[n]);\n+\n+ if(*conformal_state > 2)\n+ {\n+ psixx[i] += tmp3 * SQR(xval+hole_x0[n]) + tmp2;\n+ \n+ psixy[i] += tmp3 * (xval+hole_x0[n]) * (yval+hole_y0[n]);\n+ psixz[i] += tmp3 * (xval+hole_x0[n]) * (zval+hole_z0[n]);\n+ \n+ psiyy[i] += tmp3 * SQR(yval+hole_y0[n]) + tmp2;\n+ psiyz[i] += tmp3 * (yval+hole_y0[n]) * (zval+hole_z0[n]);\n+ \n+ psizz[i] += tmp3 * SQR(zval+hole_z0[n]) + tmp2;\n+ }\n+ }\n+ }\n+ }\n+\n+ /* Cactus conventions\n+ * ------------------\n+ */\n+\n+ if (make_conformal_derivs == 1)\n+ {\n+ for (i = 0; i < npoints; i++)\n+ {\n+ tmp1 = 1 / psi[i];\n+\n+ psix[i] *= tmp1;\n+ psiy[i] *= tmp1;\n+ psiz[i] *= tmp1;\n+\n+ if(*conformal_state > 2)\n+ {\n+ psixx[i] *= tmp1;\n+ psixy[i] *= tmp1;\n+ psixz[i] *= tmp1;\n+ psiyy[i] *= tmp1;\n+ psiyz[i] *= tmp1;\n+ psizz[i] *= tmp1;\n+ }\n+ }\n+ }\n+\n+ /* Metric depends on conformal state\n+ * ---------------------------------\n+ */\n+\n+ if (CCTK_EQUALS(metric_type, \"static conformal\"))\n+ {\n+ for (i = 0; i < npoints; i++)\n+ {\n+ gxx[i] = 1.0;\n+ gyy[i] = 1.0;\n+ gzz[i] = 1.0;\n+ gxy[i] = 0.0;\n+ gxz[i] = 0.0;\n+ gyz[i] = 0.0;\n+ }\n+ }\n+ else\n+ {\n+ for (i = 0; i < npoints; i++)\n+ {\n+ tmp1 = psi[i] * psi[i];\n+ gxx[i] = tmp1 * tmp1;\n+ gyy[i] = gxx[i];\n+ gzz[i] = gxx[i];\n+ gxy[i] = 0.0;\n+ gxz[i] = 0.0;\n+ gyz[i] = 0.0;\n+ }\n+ }\n+\n+ /* Time-symmetric data\n+ * -------------------\n+ */\n+ IDAnalyticBH_zero_CCTK_REAL_array(npoints, kxx);\n+ IDAnalyticBH_zero_CCTK_REAL_array(npoints, kxy);\n+ IDAnalyticBH_zero_CCTK_REAL_array(npoints, kxz);\n+ IDAnalyticBH_zero_CCTK_REAL_array(npoints, kyy);\n+ IDAnalyticBH_zero_CCTK_REAL_array(npoints, kyz);\n+ IDAnalyticBH_zero_CCTK_REAL_array(npoints, kzz);\n+}"}, "test": {"test_patch": "diff --git a/all_tests.txt b/all_tests.txt\nnew file mode 100644\nindex 0000000..0000000\n--- /dev/null\n+++ b/all_tests.txt\n@@ -0,0 +1,3 @@\n+kerr\n+test_bl\n+test_misner", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}18{"question_id": "MSB_einsteintoolkit_Cactus_pr25", "question_type": "multi_swe_bench", "description": "Add missing CarpetParamCheck.cc in Carpet/Carpet (einsteintoolkit/Cactus#25)", "content": {"org": "einsteintoolkit", "repo": "Cactus", "pr_number": 25, "issue_title": "Add missing CarpetParamCheck.cc in Carpet/Carpet", "issue_body": "This PR adds the missing source file CarpetParamCheck.cc to complete the Carpet/Carpet thorn implementation.", "base_commit": "HEAD", "resolved_issues": [{"number": 25, "title": "Implement the full functionality of Carpet", "body": "Please implement the full functionality of `Carpet` by finishing the code in `CarpetParamCheck.cc`.\n\n## Thorn Information:\n- Name: Carpet\n- Target file: CarpetParamCheck.cc\n\n## Interface Definition in interface.ccl:\n\n## Schedule Definition in schedule.ccl:\n\n## Parameters Definition in param.ccl:\n\n## Configuration Definition in configuration.ccl:\n\n## Documentation Context in readme.md and doc/documentation.tex\n\n## Related Code Context in src folder\n\n"}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/einsteintoolkit_m_cactus:pr-25", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/arrangements/Carpet/Carpet/src/CarpetParamCheck.cc b/arrangements/Carpet/Carpet/src/CarpetParamCheck.cc\nnew file mode 100644\nindex 0000000..0000000\n--- /dev/null\n+++ b/arrangements/Carpet/Carpet/src/CarpetParamCheck.cc\n@@ -0,0 +1,127 @@\n+#include <cassert>\n+#include <cstdlib>\n+\n+#include <cctk.h>\n+#include <cctk_Arguments.h>\n+#include <cctk_Parameters.h>\n+\n+#include <carpet.hh>\n+\n+namespace Carpet {\n+\n+using namespace std;\n+\n+/** Ensure that the parameters have legal values.\n+ *\n+ * Note that this checking happens only after most of Carpet has\n+ * already been set up.\n+ */\n+void CarpetParamCheck(CCTK_ARGUMENTS) {\n+ DECLARE_CCTK_ARGUMENTS;\n+ DECLARE_CCTK_PARAMETERS;\n+\n+ if ((CCTK_ParameterQueryTimesSet(\"periodic\", \"Carpet\") and periodic) or\n+ (CCTK_ParameterQueryTimesSet(\"periodic_x\", \"Carpet\") and periodic_x) or\n+ (CCTK_ParameterQueryTimesSet(\"periodic_y\", \"Carpet\") and periodic_y) or\n+ (CCTK_ParameterQueryTimesSet(\"periodic_z\", \"Carpet\") and periodic_z)) {\n+ CCTK_PARAMWARN(\"Some of the parameters \\\"Carpet::periodic*\\\" have been set \"\n+ \"to \\\"yes\\\". These parameters are there for compatibility \"\n+ \"reasons only and must not be used.\");\n+ }\n+\n+ if (adaptive_stepsize and max_refinement_levels > 1) {\n+ CCTK_PARAMWARN(\"Adaptive time step sizes do not work with mesh refinement \"\n+ \"yet. Please use only a single level, and set \"\n+ \"max_refinement_levels=1.\");\n+ }\n+\n+ if (max_refinement_levels > 1) {\n+\n+ // InitBase\n+\n+ enum setup_method_t {\n+ init_error,\n+ init_some_levels,\n+ init_single_level,\n+ init_two_levels,\n+ init_all_levels,\n+ };\n+ setup_method_t setup_method = init_error;\n+\n+ if (CCTK_EQUALS(initial_data_setup_method, \"init_some_levels\")) {\n+ setup_method = init_some_levels;\n+ } else if (CCTK_EQUALS(initial_data_setup_method, \"init_single_level\")) {\n+ setup_method = init_single_level;\n+ } else if (CCTK_EQUALS(initial_data_setup_method, \"init_two_levels\")) {\n+ setup_method = init_two_levels;\n+ } else if (CCTK_EQUALS(initial_data_setup_method, \"init_all_levels\")) {\n+ setup_method = init_all_levels;\n+ } else {\n+ CCTK_PARAMWARN(\n+ \"Unknown value of parameter InitBase::initial_data_setup_method\");\n+ }\n+\n+ // Carpet\n+\n+ enum init_method_t {\n+ error_timelevel,\n+ each_timelevel, // Initialise each time level\n+ fill_timelevels, // Copy the current to all past timelevels\n+ three_timelevels, // Carpet's 3 timelevel scheme\n+ all_timelevels, // Initial data thorn initialises all timelevels\n+ };\n+ init_method_t init_method = error_timelevel;\n+\n+ if (init_each_timelevel) {\n+ if (init_fill_timelevels) {\n+ CCTK_PARAMWARN(\"Cannot set parameters init_each_timelevel and \"\n+ \"init_fill_timelevels at the same time\");\n+ }\n+ if (init_3_timelevels) {\n+ CCTK_PARAMWARN(\"Cannot set parameters init_each_timelevel and \"\n+ \"init_3_timelevels at the same time\");\n+ }\n+ init_method = each_timelevel;\n+ } else if (init_fill_timelevels) {\n+ if (init_3_timelevels) {\n+ CCTK_PARAMWARN(\"Cannot set parameters init_fill_timelevels and \"\n+ \"init_3_timelevels at the same time\");\n+ }\n+ init_method = fill_timelevels;\n+ } else if (init_3_timelevels) {\n+ init_method = three_timelevels;\n+ } else {\n+ init_method = all_timelevels;\n+ }\n+\n+ switch (init_method) {\n+ case each_timelevel:\n+ if (setup_method != init_single_level) {\n+ CCTK_PARAMWARN(\n+ \"When you set Carpet::init_each_timelevel=yes, then you must also \"\n+ \"use InitBase::initial_data_setup_method=\\\"init_single_level\\\"\");\n+ }\n+ break;\n+ case fill_timelevels:\n+ // Everything is allowed\n+ break;\n+ case three_timelevels:\n+ // Everything is allowed\n+ break;\n+ case all_timelevels:\n+ if (setup_method != init_all_levels) {\n+ CCTK_PARAMWARN(\"When you set neither Carpet::init_each_timelevel=yes \"\n+ \"nor Carpet::init_fill_timelevels=yes nor \"\n+ \"Carpet::init_3_timelevels=yes, then you must also use \"\n+ \"InitBase::initial_data_setup_method=\\\"init_all_\"\n+ \"levels\\\"\");\n+ }\n+ break;\n+ default:\n+ assert(0);\n+ }\n+\n+ } // if max_refinement_levels > 0\n+}\n+\n+} // namespace Carpet"}, "test": {"test_patch": "diff --git a/all_tests.txt b/all_tests.txt\nnew file mode 100644\nindex 0000000..0000000\n--- /dev/null\n+++ b/all_tests.txt\n@@ -0,0 +1,2 @@\n+64k2\n+test_restrict_sync", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}19{"question_id": "MSB_einsteintoolkit_Cactus_pr26", "question_type": "multi_swe_bench", "description": "Add missing GaugeWave_error.cc in EinsteinExact/GaugeWave (einsteintoolkit/Cactus#26)", "content": {"org": "einsteintoolkit", "repo": "Cactus", "pr_number": 26, "issue_title": "Add missing GaugeWave_error.cc in EinsteinExact/GaugeWave", "issue_body": "This PR adds the missing source file GaugeWave_error.cc to complete the EinsteinExact/GaugeWave thorn implementation.", "base_commit": "HEAD", "resolved_issues": [{"number": 26, "title": "Implement the full functionality of GaugeWave", "body": "Please implement the full functionality of `GaugeWave` by finishing the code in `GaugeWave_error.cc`.\n\n## Thorn Information:\n- Name: GaugeWave\n- Target file: GaugeWave_error.cc\n\n## Interface Definition in interface.ccl:\n\n## Schedule Definition in schedule.ccl:\n\n## Parameters Definition in param.ccl:\n\n## Configuration Definition in configuration.ccl:\n\n## Documentation Context in readme.md and doc/documentation.tex\n\n## Related Code Context in src folder\n\n"}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/einsteintoolkit_m_cactus:pr-26", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/arrangements/EinsteinExact/GaugeWave/src/GaugeWave_error.cc b/arrangements/EinsteinExact/GaugeWave/src/GaugeWave_error.cc\nnew file mode 100644\nindex 0000000..0000000\n--- /dev/null\n+++ b/arrangements/EinsteinExact/GaugeWave/src/GaugeWave_error.cc\n@@ -0,0 +1,2080 @@\n+/* File produced by Kranc */\n+\n+#define KRANC_C\n+\n+#include <algorithm>\n+#include <assert.h>\n+#include <math.h>\n+#include <stdio.h>\n+#include <stdlib.h>\n+#include <string.h>\n+#include \"cctk.h\"\n+#include \"cctk_Arguments.h\"\n+#include \"cctk_Parameters.h\"\n+#include \"Kranc.hh\"\n+#include \"Differencing.h\"\n+#include \"loopcontrol.h\"\n+\n+/* Define macros used in calculations */\n+#define INITVALUE (42)\n+#define INV(x) ((CCTK_REAL)1.0 / (x))\n+#define SQR(x) ((x) * (x))\n+#define CUB(x) ((x) * SQR(x))\n+#define QAD(x) (SQR(SQR(x)))\n+\n+namespace GaugeWave {\n+\n+\n+static void GaugeWave_error_Body(const cGH* restrict const cctkGH, const int dir, const int face, const CCTK_REAL normal[3], const CCTK_REAL tangentA[3], const CCTK_REAL tangentB[3], const int imin[3], const int imax[3], const int n_subblock_gfs, CCTK_REAL* restrict const subblock_gfs[])\n+{\n+ DECLARE_CCTK_ARGUMENTS;\n+ DECLARE_CCTK_PARAMETERS;\n+ \n+ /* Include user-supplied include files */\n+ /* Initialise finite differencing variables */\n+ const ptrdiff_t di CCTK_ATTRIBUTE_UNUSED = 1;\n+ const ptrdiff_t dj CCTK_ATTRIBUTE_UNUSED = CCTK_GFINDEX3D(cctkGH,0,1,0) - CCTK_GFINDEX3D(cctkGH,0,0,0);\n+ const ptrdiff_t dk CCTK_ATTRIBUTE_UNUSED = CCTK_GFINDEX3D(cctkGH,0,0,1) - CCTK_GFINDEX3D(cctkGH,0,0,0);\n+ const ptrdiff_t cdi CCTK_ATTRIBUTE_UNUSED = sizeof(CCTK_REAL) * di;\n+ const ptrdiff_t cdj CCTK_ATTRIBUTE_UNUSED = sizeof(CCTK_REAL) * dj;\n+ const ptrdiff_t cdk CCTK_ATTRIBUTE_UNUSED = sizeof(CCTK_REAL) * dk;\n+ const ptrdiff_t cctkLbnd1 CCTK_ATTRIBUTE_UNUSED = cctk_lbnd[0];\n+ const ptrdiff_t cctkLbnd2 CCTK_ATTRIBUTE_UNUSED = cctk_lbnd[1];\n+ const ptrdiff_t cctkLbnd3 CCTK_ATTRIBUTE_UNUSED = cctk_lbnd[2];\n+ const CCTK_REAL t CCTK_ATTRIBUTE_UNUSED = ToReal(cctk_time);\n+ const CCTK_REAL cctkOriginSpace1 CCTK_ATTRIBUTE_UNUSED = ToReal(CCTK_ORIGIN_SPACE(0));\n+ const CCTK_REAL cctkOriginSpace2 CCTK_ATTRIBUTE_UNUSED = ToReal(CCTK_ORIGIN_SPACE(1));\n+ const CCTK_REAL cctkOriginSpace3 CCTK_ATTRIBUTE_UNUSED = ToReal(CCTK_ORIGIN_SPACE(2));\n+ const CCTK_REAL dt CCTK_ATTRIBUTE_UNUSED = ToReal(CCTK_DELTA_TIME);\n+ const CCTK_REAL dx CCTK_ATTRIBUTE_UNUSED = ToReal(CCTK_DELTA_SPACE(0));\n+ const CCTK_REAL dy CCTK_ATTRIBUTE_UNUSED = ToReal(CCTK_DELTA_SPACE(1));\n+ const CCTK_REAL dz CCTK_ATTRIBUTE_UNUSED = ToReal(CCTK_DELTA_SPACE(2));\n+ const CCTK_REAL dxi CCTK_ATTRIBUTE_UNUSED = INV(dx);\n+ const CCTK_REAL dyi CCTK_ATTRIBUTE_UNUSED = INV(dy);\n+ const CCTK_REAL dzi CCTK_ATTRIBUTE_UNUSED = INV(dz);\n+ const CCTK_REAL khalf CCTK_ATTRIBUTE_UNUSED = 0.5;\n+ const CCTK_REAL kthird CCTK_ATTRIBUTE_UNUSED = \n+ 0.333333333333333333333333333333;\n+ const CCTK_REAL ktwothird CCTK_ATTRIBUTE_UNUSED = \n+ 0.666666666666666666666666666667;\n+ const CCTK_REAL kfourthird CCTK_ATTRIBUTE_UNUSED = \n+ 1.33333333333333333333333333333;\n+ const CCTK_REAL hdxi CCTK_ATTRIBUTE_UNUSED = 0.5*dxi;\n+ const CCTK_REAL hdyi CCTK_ATTRIBUTE_UNUSED = 0.5*dyi;\n+ const CCTK_REAL hdzi CCTK_ATTRIBUTE_UNUSED = 0.5*dzi;\n+ /* Initialize predefined quantities */\n+ /* Assign local copies of arrays functions */\n+ \n+ \n+ /* Calculate temporaries and arrays functions */\n+ /* Copy local copies back to grid functions */\n+ /* Loop over the grid points */\n+ const int imin0=imin[0];\n+ const int imin1=imin[1];\n+ const int imin2=imin[2];\n+ const int imax0=imax[0];\n+ const int imax1=imax[1];\n+ const int imax2=imax[2];\n+ #pragma omp parallel\n+ CCTK_LOOP3(GaugeWave_error,\n+ i,j,k, imin0,imin1,imin2, imax0,imax1,imax2,\n+ cctk_ash[0],cctk_ash[1],cctk_ash[2])\n+ {\n+ const ptrdiff_t index CCTK_ATTRIBUTE_UNUSED = di*i + dj*j + dk*k;\n+ /* Assign local copies of grid functions */\n+ \n+ CCTK_REAL alpL CCTK_ATTRIBUTE_UNUSED = alp[index];\n+ CCTK_REAL betaxL CCTK_ATTRIBUTE_UNUSED = betax[index];\n+ CCTK_REAL betayL CCTK_ATTRIBUTE_UNUSED = betay[index];\n+ CCTK_REAL betazL CCTK_ATTRIBUTE_UNUSED = betaz[index];\n+ CCTK_REAL dtalpL CCTK_ATTRIBUTE_UNUSED = dtalp[index];\n+ CCTK_REAL dtbetaxL CCTK_ATTRIBUTE_UNUSED = dtbetax[index];\n+ CCTK_REAL dtbetayL CCTK_ATTRIBUTE_UNUSED = dtbetay[index];\n+ CCTK_REAL dtbetazL CCTK_ATTRIBUTE_UNUSED = dtbetaz[index];\n+ CCTK_REAL gxxL CCTK_ATTRIBUTE_UNUSED = gxx[index];\n+ CCTK_REAL gxyL CCTK_ATTRIBUTE_UNUSED = gxy[index];\n+ CCTK_REAL gxzL CCTK_ATTRIBUTE_UNUSED = gxz[index];\n+ CCTK_REAL gyyL CCTK_ATTRIBUTE_UNUSED = gyy[index];\n+ CCTK_REAL gyzL CCTK_ATTRIBUTE_UNUSED = gyz[index];\n+ CCTK_REAL gzzL CCTK_ATTRIBUTE_UNUSED = gzz[index];\n+ CCTK_REAL kxxL CCTK_ATTRIBUTE_UNUSED = kxx[index];\n+ CCTK_REAL kxyL CCTK_ATTRIBUTE_UNUSED = kxy[index];\n+ CCTK_REAL kxzL CCTK_ATTRIBUTE_UNUSED = kxz[index];\n+ CCTK_REAL kyyL CCTK_ATTRIBUTE_UNUSED = kyy[index];\n+ CCTK_REAL kyzL CCTK_ATTRIBUTE_UNUSED = kyz[index];\n+ CCTK_REAL kzzL CCTK_ATTRIBUTE_UNUSED = kzz[index];\n+ CCTK_REAL xL CCTK_ATTRIBUTE_UNUSED = x[index];\n+ CCTK_REAL yL CCTK_ATTRIBUTE_UNUSED = y[index];\n+ CCTK_REAL zL CCTK_ATTRIBUTE_UNUSED = z[index];\n+ \n+ /* Include user supplied include files */\n+ /* Precompute derivatives */\n+ /* Calculate temporaries and grid functions */\n+ CCTK_REAL xform1L00 CCTK_ATTRIBUTE_UNUSED = 1;\n+ \n+ CCTK_REAL xform1L01 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL xform1L02 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL xform1L03 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL xform1L10 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL csetemp0 CCTK_ATTRIBUTE_UNUSED = cos(ToReal(phi));\n+ \n+ CCTK_REAL csetemp1 CCTK_ATTRIBUTE_UNUSED = cos(ToReal(psi));\n+ \n+ CCTK_REAL csetemp2 CCTK_ATTRIBUTE_UNUSED = cos(ToReal(theta));\n+ \n+ CCTK_REAL csetemp3 CCTK_ATTRIBUTE_UNUSED = sin(ToReal(phi));\n+ \n+ CCTK_REAL csetemp4 CCTK_ATTRIBUTE_UNUSED = sin(ToReal(psi));\n+ \n+ CCTK_REAL xform1L11 CCTK_ATTRIBUTE_UNUSED = csetemp0*csetemp1 - \n+ csetemp2*csetemp3*csetemp4;\n+ \n+ CCTK_REAL xform1L12 CCTK_ATTRIBUTE_UNUSED = csetemp1*csetemp3 + \n+ csetemp0*csetemp2*csetemp4;\n+ \n+ CCTK_REAL csetemp5 CCTK_ATTRIBUTE_UNUSED = sin(ToReal(theta));\n+ \n+ CCTK_REAL xform1L13 CCTK_ATTRIBUTE_UNUSED = csetemp4*csetemp5;\n+ \n+ CCTK_REAL xform1L20 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL xform1L21 CCTK_ATTRIBUTE_UNUSED = \n+ -(csetemp1*csetemp2*csetemp3) - csetemp0*csetemp4;\n+ \n+ CCTK_REAL xform1L22 CCTK_ATTRIBUTE_UNUSED = csetemp0*csetemp1*csetemp2 \n+ - csetemp3*csetemp4;\n+ \n+ CCTK_REAL xform1L23 CCTK_ATTRIBUTE_UNUSED = csetemp1*csetemp5;\n+ \n+ CCTK_REAL xform1L30 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL xform1L31 CCTK_ATTRIBUTE_UNUSED = csetemp3*csetemp5;\n+ \n+ CCTK_REAL xform1L32 CCTK_ATTRIBUTE_UNUSED = -(csetemp0*csetemp5);\n+ \n+ CCTK_REAL xform1L33 CCTK_ATTRIBUTE_UNUSED = csetemp2;\n+ \n+ CCTK_REAL csetemp6 CCTK_ATTRIBUTE_UNUSED = SQR(ToReal(boostx));\n+ \n+ CCTK_REAL csetemp7 CCTK_ATTRIBUTE_UNUSED = SQR(ToReal(boosty));\n+ \n+ CCTK_REAL csetemp8 CCTK_ATTRIBUTE_UNUSED = SQR(ToReal(boostz));\n+ \n+ CCTK_REAL csetemp9 CCTK_ATTRIBUTE_UNUSED = INV(ToReal(lapsefactor));\n+ \n+ CCTK_REAL xform2L00 CCTK_ATTRIBUTE_UNUSED = csetemp9*INV((-1 + \n+ csetemp6 + csetemp7 + csetemp8)*(1 + sqrt(1 - csetemp6 - csetemp7 - \n+ csetemp8)))*(1 - csetemp6 - csetemp7 - csetemp8 + sqrt(1 - csetemp6 - \n+ csetemp7 - csetemp8))*(-1 + ToReal(boostx)*ToReal(shiftaddx) + \n+ ToReal(boosty)*ToReal(shiftaddy) + ToReal(boostz)*ToReal(shiftaddz));\n+ \n+ CCTK_REAL xform2L01 CCTK_ATTRIBUTE_UNUSED = csetemp9*INV((-1 + \n+ csetemp6 + csetemp7 + csetemp8)*(1 + sqrt(1 - csetemp6 - csetemp7 - \n+ csetemp8)))*(1 - csetemp6 - csetemp7 - csetemp8 + sqrt(1 - csetemp6 - \n+ csetemp7 - csetemp8))*ToReal(boostx);\n+ \n+ CCTK_REAL xform2L02 CCTK_ATTRIBUTE_UNUSED = csetemp9*INV((-1 + \n+ csetemp6 + csetemp7 + csetemp8)*(1 + sqrt(1 - csetemp6 - csetemp7 - \n+ csetemp8)))*(1 - csetemp6 - csetemp7 - csetemp8 + sqrt(1 - csetemp6 - \n+ csetemp7 - csetemp8))*ToReal(boosty);\n+ \n+ CCTK_REAL xform2L03 CCTK_ATTRIBUTE_UNUSED = csetemp9*INV((-1 + \n+ csetemp6 + csetemp7 + csetemp8)*(1 + sqrt(1 - csetemp6 - csetemp7 - \n+ csetemp8)))*(1 - csetemp6 - csetemp7 - csetemp8 + sqrt(1 - csetemp6 - \n+ csetemp7 - csetemp8))*ToReal(boostz);\n+ \n+ CCTK_REAL xform2L10 CCTK_ATTRIBUTE_UNUSED = INV((-1 + csetemp6 + \n+ csetemp7 + csetemp8)*(1 + sqrt(1 - csetemp6 - csetemp7 - \n+ csetemp8)))*((csetemp6 + (-1 + csetemp7 + csetemp8)*(1 + sqrt(1 - \n+ csetemp6 - csetemp7 - csetemp8)))*ToReal(shiftaddx) - \n+ ToReal(boostx)*(-1 + csetemp6 + csetemp7 + csetemp8 + sqrt(1 - csetemp6 \n+ - csetemp7 - csetemp8)*(-1 + ToReal(boosty)*ToReal(shiftaddy) + \n+ ToReal(boostz)*ToReal(shiftaddz))));\n+ \n+ CCTK_REAL xform2L11 CCTK_ATTRIBUTE_UNUSED = INV((-1 + csetemp6 + \n+ csetemp7 + csetemp8)*(1 + sqrt(1 - csetemp6 - csetemp7 - \n+ csetemp8)))*(csetemp6 + (-1 + csetemp7 + csetemp8)*(1 + sqrt(1 - \n+ csetemp6 - csetemp7 - csetemp8)));\n+ \n+ CCTK_REAL xform2L12 CCTK_ATTRIBUTE_UNUSED = -(INV(-1 + csetemp6 + \n+ csetemp7 + csetemp8 - sqrt(1 - csetemp6 - csetemp7 - \n+ csetemp8))*ToReal(boostx)*ToReal(boosty));\n+ \n+ CCTK_REAL xform2L13 CCTK_ATTRIBUTE_UNUSED = -(INV(-1 + csetemp6 + \n+ csetemp7 + csetemp8 - sqrt(1 - csetemp6 - csetemp7 - \n+ csetemp8))*ToReal(boostx)*ToReal(boostz));\n+ \n+ CCTK_REAL xform2L20 CCTK_ATTRIBUTE_UNUSED = INV((-1 + csetemp6 + \n+ csetemp7 + csetemp8)*(1 + sqrt(1 - csetemp6 - csetemp7 - \n+ csetemp8)))*((csetemp7 + (-1 + csetemp6 + csetemp8)*(1 + sqrt(1 - \n+ csetemp6 - csetemp7 - csetemp8)))*ToReal(shiftaddy) - \n+ ToReal(boosty)*(-1 + csetemp6 + csetemp7 + csetemp8 + sqrt(1 - csetemp6 \n+ - csetemp7 - csetemp8)*(-1 + ToReal(boostx)*ToReal(shiftaddx) + \n+ ToReal(boostz)*ToReal(shiftaddz))));\n+ \n+ CCTK_REAL xform2L21 CCTK_ATTRIBUTE_UNUSED = -(INV(-1 + csetemp6 + \n+ csetemp7 + csetemp8 - sqrt(1 - csetemp6 - csetemp7 - \n+ csetemp8))*ToReal(boostx)*ToReal(boosty));\n+ \n+ CCTK_REAL xform2L22 CCTK_ATTRIBUTE_UNUSED = INV((-1 + csetemp6 + \n+ csetemp7 + csetemp8)*(1 + sqrt(1 - csetemp6 - csetemp7 - \n+ csetemp8)))*(csetemp7 + (-1 + csetemp6 + csetemp8)*(1 + sqrt(1 - \n+ csetemp6 - csetemp7 - csetemp8)));\n+ \n+ CCTK_REAL xform2L23 CCTK_ATTRIBUTE_UNUSED = -(INV(-1 + csetemp6 + \n+ csetemp7 + csetemp8 - sqrt(1 - csetemp6 - csetemp7 - \n+ csetemp8))*ToReal(boosty)*ToReal(boostz));\n+ \n+ CCTK_REAL xform2L30 CCTK_ATTRIBUTE_UNUSED = INV((-1 + csetemp6 + \n+ csetemp7 + csetemp8)*(1 + sqrt(1 - csetemp6 - csetemp7 - \n+ csetemp8)))*(-(ToReal(boostz)*(-1 + csetemp6 + csetemp7 + csetemp8 + \n+ sqrt(1 - csetemp6 - csetemp7 - csetemp8)*(-1 + \n+ ToReal(boostx)*ToReal(shiftaddx) + ToReal(boosty)*ToReal(shiftaddy)))) \n+ + (-1 + csetemp6 + csetemp7 + csetemp8 + (-1 + csetemp6 + \n+ csetemp7)*sqrt(1 - csetemp6 - csetemp7 - csetemp8))*ToReal(shiftaddz));\n+ \n+ CCTK_REAL xform2L31 CCTK_ATTRIBUTE_UNUSED = -(INV(-1 + csetemp6 + \n+ csetemp7 + csetemp8 - sqrt(1 - csetemp6 - csetemp7 - \n+ csetemp8))*ToReal(boostx)*ToReal(boostz));\n+ \n+ CCTK_REAL xform2L32 CCTK_ATTRIBUTE_UNUSED = -(INV(-1 + csetemp6 + \n+ csetemp7 + csetemp8 - sqrt(1 - csetemp6 - csetemp7 - \n+ csetemp8))*ToReal(boosty)*ToReal(boostz));\n+ \n+ CCTK_REAL xform2L33 CCTK_ATTRIBUTE_UNUSED = INV((-1 + csetemp6 + \n+ csetemp7 + csetemp8)*(1 + sqrt(1 - csetemp6 - csetemp7 - \n+ csetemp8)))*(-1 + csetemp6 + csetemp7 + csetemp8 + (-1 + csetemp6 + \n+ csetemp7)*sqrt(1 - csetemp6 - csetemp7 - csetemp8));\n+ \n+ CCTK_REAL xformL00 CCTK_ATTRIBUTE_UNUSED = xform1L00*xform2L00 + \n+ xform1L01*xform2L10 + xform1L02*xform2L20 + xform1L03*xform2L30;\n+ \n+ CCTK_REAL xformL01 CCTK_ATTRIBUTE_UNUSED = xform1L00*xform2L01 + \n+ xform1L01*xform2L11 + xform1L02*xform2L21 + xform1L03*xform2L31;\n+ \n+ CCTK_REAL xformL02 CCTK_ATTRIBUTE_UNUSED = xform1L00*xform2L02 + \n+ xform1L01*xform2L12 + xform1L02*xform2L22 + xform1L03*xform2L32;\n+ \n+ CCTK_REAL xformL03 CCTK_ATTRIBUTE_UNUSED = xform1L00*xform2L03 + \n+ xform1L01*xform2L13 + xform1L02*xform2L23 + xform1L03*xform2L33;\n+ \n+ CCTK_REAL xformL10 CCTK_ATTRIBUTE_UNUSED = xform1L10*xform2L00 + \n+ xform1L11*xform2L10 + xform1L12*xform2L20 + xform1L13*xform2L30;\n+ \n+ CCTK_REAL xformL11 CCTK_ATTRIBUTE_UNUSED = xform1L10*xform2L01 + \n+ xform1L11*xform2L11 + xform1L12*xform2L21 + xform1L13*xform2L31;\n+ \n+ CCTK_REAL xformL12 CCTK_ATTRIBUTE_UNUSED = xform1L10*xform2L02 + \n+ xform1L11*xform2L12 + xform1L12*xform2L22 + xform1L13*xform2L32;\n+ \n+ CCTK_REAL xformL13 CCTK_ATTRIBUTE_UNUSED = xform1L10*xform2L03 + \n+ xform1L11*xform2L13 + xform1L12*xform2L23 + xform1L13*xform2L33;\n+ \n+ CCTK_REAL xformL20 CCTK_ATTRIBUTE_UNUSED = xform1L20*xform2L00 + \n+ xform1L21*xform2L10 + xform1L22*xform2L20 + xform1L23*xform2L30;\n+ \n+ CCTK_REAL xformL21 CCTK_ATTRIBUTE_UNUSED = xform1L20*xform2L01 + \n+ xform1L21*xform2L11 + xform1L22*xform2L21 + xform1L23*xform2L31;\n+ \n+ CCTK_REAL xformL22 CCTK_ATTRIBUTE_UNUSED = xform1L20*xform2L02 + \n+ xform1L21*xform2L12 + xform1L22*xform2L22 + xform1L23*xform2L32;\n+ \n+ CCTK_REAL xformL23 CCTK_ATTRIBUTE_UNUSED = xform1L20*xform2L03 + \n+ xform1L21*xform2L13 + xform1L22*xform2L23 + xform1L23*xform2L33;\n+ \n+ CCTK_REAL xformL30 CCTK_ATTRIBUTE_UNUSED = xform1L30*xform2L00 + \n+ xform1L31*xform2L10 + xform1L32*xform2L20 + xform1L33*xform2L30;\n+ \n+ CCTK_REAL xformL31 CCTK_ATTRIBUTE_UNUSED = xform1L30*xform2L01 + \n+ xform1L31*xform2L11 + xform1L32*xform2L21 + xform1L33*xform2L31;\n+ \n+ CCTK_REAL xformL32 CCTK_ATTRIBUTE_UNUSED = xform1L30*xform2L02 + \n+ xform1L31*xform2L12 + xform1L32*xform2L22 + xform1L33*xform2L32;\n+ \n+ CCTK_REAL xformL33 CCTK_ATTRIBUTE_UNUSED = xform1L30*xform2L03 + \n+ xform1L31*xform2L13 + xform1L32*xform2L23 + xform1L33*xform2L33;\n+ \n+ CCTK_REAL xx0 CCTK_ATTRIBUTE_UNUSED = t - ToReal(timeoffset);\n+ \n+ CCTK_REAL xx1 CCTK_ATTRIBUTE_UNUSED = xL - ToReal(positionx);\n+ \n+ CCTK_REAL xx2 CCTK_ATTRIBUTE_UNUSED = yL - ToReal(positiony);\n+ \n+ CCTK_REAL xx3 CCTK_ATTRIBUTE_UNUSED = zL - ToReal(positionz);\n+ \n+ CCTK_REAL txx0 CCTK_ATTRIBUTE_UNUSED = xformL00*xx0 + xformL01*xx1 + \n+ xformL02*xx2 + xformL03*xx3;\n+ \n+ CCTK_REAL txx1 CCTK_ATTRIBUTE_UNUSED = xformL10*xx0 + xformL11*xx1 + \n+ xformL12*xx2 + xformL13*xx3;\n+ \n+ CCTK_REAL T CCTK_ATTRIBUTE_UNUSED = txx0;\n+ \n+ CCTK_REAL X CCTK_ATTRIBUTE_UNUSED = txx1;\n+ \n+ CCTK_REAL csetemp10 CCTK_ATTRIBUTE_UNUSED = -T + X;\n+ \n+ CCTK_REAL csetemp11 CCTK_ATTRIBUTE_UNUSED = INV(ToReal(period));\n+ \n+ CCTK_REAL tg400 CCTK_ATTRIBUTE_UNUSED = -1 + \n+ sin(2*csetemp10*csetemp11*Pi)*ToReal(amp);\n+ \n+ CCTK_REAL tg401 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tg402 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tg403 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tg411 CCTK_ATTRIBUTE_UNUSED = 1 - \n+ sin(2*csetemp10*csetemp11*Pi)*ToReal(amp);\n+ \n+ CCTK_REAL tg412 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tg413 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tg422 CCTK_ATTRIBUTE_UNUSED = 1;\n+ \n+ CCTK_REAL tg423 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tg433 CCTK_ATTRIBUTE_UNUSED = 1;\n+ \n+ CCTK_REAL tdg4000 CCTK_ATTRIBUTE_UNUSED = \n+ -2*csetemp11*Pi*cos(2*csetemp10*csetemp11*Pi)*ToReal(amp);\n+ \n+ CCTK_REAL tdg4001 CCTK_ATTRIBUTE_UNUSED = \n+ 2*csetemp11*Pi*cos(2*csetemp10*csetemp11*Pi)*ToReal(amp);\n+ \n+ CCTK_REAL tdg4002 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tdg4003 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tdg4010 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tdg4011 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tdg4012 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tdg4013 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tdg4020 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tdg4021 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tdg4022 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tdg4023 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tdg4030 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tdg4031 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tdg4032 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tdg4033 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tdg4110 CCTK_ATTRIBUTE_UNUSED = \n+ 2*csetemp11*Pi*cos(2*csetemp10*csetemp11*Pi)*ToReal(amp);\n+ \n+ CCTK_REAL tdg4111 CCTK_ATTRIBUTE_UNUSED = \n+ -2*csetemp11*Pi*cos(2*csetemp10*csetemp11*Pi)*ToReal(amp);\n+ \n+ CCTK_REAL tdg4112 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tdg4113 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tdg4120 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tdg4121 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tdg4122 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tdg4123 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tdg4130 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tdg4131 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tdg4132 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tdg4133 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tdg4220 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tdg4221 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tdg4222 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tdg4223 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tdg4230 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tdg4231 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tdg4232 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tdg4233 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tdg4330 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tdg4331 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tdg4332 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tdg4333 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL g400 CCTK_ATTRIBUTE_UNUSED = 2*(tg423*xformL20*xformL30 + \n+ xformL00*(tg401*xformL10 + tg402*xformL20 + tg403*xformL30) + \n+ xformL10*(tg412*xformL20 + tg413*xformL30)) + tg400*SQR(xformL00) + \n+ tg411*SQR(xformL10) + tg422*SQR(xformL20) + tg433*SQR(xformL30);\n+ \n+ CCTK_REAL csetemp12 CCTK_ATTRIBUTE_UNUSED = tg400*xformL01;\n+ \n+ CCTK_REAL csetemp13 CCTK_ATTRIBUTE_UNUSED = tg401*xformL11;\n+ \n+ CCTK_REAL csetemp14 CCTK_ATTRIBUTE_UNUSED = tg402*xformL21;\n+ \n+ CCTK_REAL csetemp15 CCTK_ATTRIBUTE_UNUSED = tg403*xformL31;\n+ \n+ CCTK_REAL csetemp16 CCTK_ATTRIBUTE_UNUSED = tg401*xformL01;\n+ \n+ CCTK_REAL csetemp17 CCTK_ATTRIBUTE_UNUSED = tg411*xformL11;\n+ \n+ CCTK_REAL csetemp18 CCTK_ATTRIBUTE_UNUSED = tg412*xformL21;\n+ \n+ CCTK_REAL csetemp19 CCTK_ATTRIBUTE_UNUSED = tg413*xformL31;\n+ \n+ CCTK_REAL csetemp20 CCTK_ATTRIBUTE_UNUSED = tg402*xformL01;\n+ \n+ CCTK_REAL csetemp21 CCTK_ATTRIBUTE_UNUSED = tg412*xformL11;\n+ \n+ CCTK_REAL csetemp22 CCTK_ATTRIBUTE_UNUSED = tg422*xformL21;\n+ \n+ CCTK_REAL csetemp23 CCTK_ATTRIBUTE_UNUSED = tg423*xformL31;\n+ \n+ CCTK_REAL csetemp24 CCTK_ATTRIBUTE_UNUSED = tg403*xformL01;\n+ \n+ CCTK_REAL csetemp25 CCTK_ATTRIBUTE_UNUSED = tg413*xformL11;\n+ \n+ CCTK_REAL csetemp26 CCTK_ATTRIBUTE_UNUSED = tg423*xformL21;\n+ \n+ CCTK_REAL csetemp27 CCTK_ATTRIBUTE_UNUSED = tg433*xformL31;\n+ \n+ CCTK_REAL g401 CCTK_ATTRIBUTE_UNUSED = (csetemp12 + csetemp13 + \n+ csetemp14 + csetemp15)*xformL00 + (csetemp16 + csetemp17 + csetemp18 + \n+ csetemp19)*xformL10 + (csetemp20 + csetemp21 + csetemp22 + \n+ csetemp23)*xformL20 + (csetemp24 + csetemp25 + csetemp26 + \n+ csetemp27)*xformL30;\n+ \n+ CCTK_REAL csetemp28 CCTK_ATTRIBUTE_UNUSED = tg400*xformL02;\n+ \n+ CCTK_REAL csetemp29 CCTK_ATTRIBUTE_UNUSED = tg401*xformL12;\n+ \n+ CCTK_REAL csetemp30 CCTK_ATTRIBUTE_UNUSED = tg402*xformL22;\n+ \n+ CCTK_REAL csetemp31 CCTK_ATTRIBUTE_UNUSED = tg403*xformL32;\n+ \n+ CCTK_REAL csetemp32 CCTK_ATTRIBUTE_UNUSED = tg401*xformL02;\n+ \n+ CCTK_REAL csetemp33 CCTK_ATTRIBUTE_UNUSED = tg411*xformL12;\n+ \n+ CCTK_REAL csetemp34 CCTK_ATTRIBUTE_UNUSED = tg412*xformL22;\n+ \n+ CCTK_REAL csetemp35 CCTK_ATTRIBUTE_UNUSED = tg413*xformL32;\n+ \n+ CCTK_REAL csetemp36 CCTK_ATTRIBUTE_UNUSED = tg402*xformL02;\n+ \n+ CCTK_REAL csetemp37 CCTK_ATTRIBUTE_UNUSED = tg412*xformL12;\n+ \n+ CCTK_REAL csetemp38 CCTK_ATTRIBUTE_UNUSED = tg422*xformL22;\n+ \n+ CCTK_REAL csetemp39 CCTK_ATTRIBUTE_UNUSED = tg423*xformL32;\n+ \n+ CCTK_REAL csetemp40 CCTK_ATTRIBUTE_UNUSED = tg403*xformL02;\n+ \n+ CCTK_REAL csetemp41 CCTK_ATTRIBUTE_UNUSED = tg413*xformL12;\n+ \n+ CCTK_REAL csetemp42 CCTK_ATTRIBUTE_UNUSED = tg423*xformL22;\n+ \n+ CCTK_REAL csetemp43 CCTK_ATTRIBUTE_UNUSED = tg433*xformL32;\n+ \n+ CCTK_REAL g402 CCTK_ATTRIBUTE_UNUSED = (csetemp28 + csetemp29 + \n+ csetemp30 + csetemp31)*xformL00 + (csetemp32 + csetemp33 + csetemp34 + \n+ csetemp35)*xformL10 + (csetemp36 + csetemp37 + csetemp38 + \n+ csetemp39)*xformL20 + (csetemp40 + csetemp41 + csetemp42 + \n+ csetemp43)*xformL30;\n+ \n+ CCTK_REAL csetemp44 CCTK_ATTRIBUTE_UNUSED = tg400*xformL03;\n+ \n+ CCTK_REAL csetemp45 CCTK_ATTRIBUTE_UNUSED = tg401*xformL13;\n+ \n+ CCTK_REAL csetemp46 CCTK_ATTRIBUTE_UNUSED = tg402*xformL23;\n+ \n+ CCTK_REAL csetemp47 CCTK_ATTRIBUTE_UNUSED = tg403*xformL33;\n+ \n+ CCTK_REAL csetemp48 CCTK_ATTRIBUTE_UNUSED = tg401*xformL03;\n+ \n+ CCTK_REAL csetemp49 CCTK_ATTRIBUTE_UNUSED = tg411*xformL13;\n+ \n+ CCTK_REAL csetemp50 CCTK_ATTRIBUTE_UNUSED = tg412*xformL23;\n+ \n+ CCTK_REAL csetemp51 CCTK_ATTRIBUTE_UNUSED = tg413*xformL33;\n+ \n+ CCTK_REAL csetemp52 CCTK_ATTRIBUTE_UNUSED = tg402*xformL03;\n+ \n+ CCTK_REAL csetemp53 CCTK_ATTRIBUTE_UNUSED = tg412*xformL13;\n+ \n+ CCTK_REAL csetemp54 CCTK_ATTRIBUTE_UNUSED = tg422*xformL23;\n+ \n+ CCTK_REAL csetemp55 CCTK_ATTRIBUTE_UNUSED = tg423*xformL33;\n+ \n+ CCTK_REAL csetemp56 CCTK_ATTRIBUTE_UNUSED = tg403*xformL03;\n+ \n+ CCTK_REAL csetemp57 CCTK_ATTRIBUTE_UNUSED = tg413*xformL13;\n+ \n+ CCTK_REAL csetemp58 CCTK_ATTRIBUTE_UNUSED = tg423*xformL23;\n+ \n+ CCTK_REAL csetemp59 CCTK_ATTRIBUTE_UNUSED = tg433*xformL33;\n+ \n+ CCTK_REAL g403 CCTK_ATTRIBUTE_UNUSED = (csetemp44 + csetemp45 + \n+ csetemp46 + csetemp47)*xformL00 + (csetemp48 + csetemp49 + csetemp50 + \n+ csetemp51)*xformL10 + (csetemp52 + csetemp53 + csetemp54 + \n+ csetemp55)*xformL20 + (csetemp56 + csetemp57 + csetemp58 + \n+ csetemp59)*xformL30;\n+ \n+ CCTK_REAL g411 CCTK_ATTRIBUTE_UNUSED = (csetemp12 + csetemp13 + \n+ csetemp14 + csetemp15)*xformL01 + (csetemp16 + csetemp17 + csetemp18 + \n+ csetemp19)*xformL11 + (csetemp20 + csetemp21 + csetemp22 + \n+ csetemp23)*xformL21 + (csetemp24 + csetemp25 + csetemp26 + \n+ csetemp27)*xformL31;\n+ \n+ CCTK_REAL g412 CCTK_ATTRIBUTE_UNUSED = (csetemp28 + csetemp29 + \n+ csetemp30 + csetemp31)*xformL01 + (csetemp32 + csetemp33 + csetemp34 + \n+ csetemp35)*xformL11 + (csetemp36 + csetemp37 + csetemp38 + \n+ csetemp39)*xformL21 + (csetemp40 + csetemp41 + csetemp42 + \n+ csetemp43)*xformL31;\n+ \n+ CCTK_REAL g413 CCTK_ATTRIBUTE_UNUSED = (csetemp44 + csetemp45 + \n+ csetemp46 + csetemp47)*xformL01 + (csetemp48 + csetemp49 + csetemp50 + \n+ csetemp51)*xformL11 + (csetemp52 + csetemp53 + csetemp54 + \n+ csetemp55)*xformL21 + (csetemp56 + csetemp57 + csetemp58 + \n+ csetemp59)*xformL31;\n+ \n+ CCTK_REAL g422 CCTK_ATTRIBUTE_UNUSED = (csetemp28 + csetemp29 + \n+ csetemp30 + csetemp31)*xformL02 + (csetemp32 + csetemp33 + csetemp34 + \n+ csetemp35)*xformL12 + (csetemp36 + csetemp37 + csetemp38 + \n+ csetemp39)*xformL22 + (csetemp40 + csetemp41 + csetemp42 + \n+ csetemp43)*xformL32;\n+ \n+ CCTK_REAL g423 CCTK_ATTRIBUTE_UNUSED = (csetemp44 + csetemp45 + \n+ csetemp46 + csetemp47)*xformL02 + (csetemp48 + csetemp49 + csetemp50 + \n+ csetemp51)*xformL12 + (csetemp52 + csetemp53 + csetemp54 + \n+ csetemp55)*xformL22 + (csetemp56 + csetemp57 + csetemp58 + \n+ csetemp59)*xformL32;\n+ \n+ CCTK_REAL g433 CCTK_ATTRIBUTE_UNUSED = (csetemp44 + csetemp45 + \n+ csetemp46 + csetemp47)*xformL03 + (csetemp48 + csetemp49 + csetemp50 + \n+ csetemp51)*xformL13 + (csetemp52 + csetemp53 + csetemp54 + \n+ csetemp55)*xformL23 + (csetemp56 + csetemp57 + csetemp58 + \n+ csetemp59)*xformL33;\n+ \n+ CCTK_REAL csetemp60 CCTK_ATTRIBUTE_UNUSED = tdg4000*xformL00;\n+ \n+ CCTK_REAL csetemp61 CCTK_ATTRIBUTE_UNUSED = tdg4001*xformL10;\n+ \n+ CCTK_REAL csetemp62 CCTK_ATTRIBUTE_UNUSED = tdg4002*xformL20;\n+ \n+ CCTK_REAL csetemp63 CCTK_ATTRIBUTE_UNUSED = tdg4003*xformL30;\n+ \n+ CCTK_REAL csetemp64 CCTK_ATTRIBUTE_UNUSED = tdg4010*xformL00;\n+ \n+ CCTK_REAL csetemp65 CCTK_ATTRIBUTE_UNUSED = tdg4011*xformL10;\n+ \n+ CCTK_REAL csetemp66 CCTK_ATTRIBUTE_UNUSED = tdg4012*xformL20;\n+ \n+ CCTK_REAL csetemp67 CCTK_ATTRIBUTE_UNUSED = tdg4013*xformL30;\n+ \n+ CCTK_REAL csetemp68 CCTK_ATTRIBUTE_UNUSED = tdg4020*xformL00;\n+ \n+ CCTK_REAL csetemp69 CCTK_ATTRIBUTE_UNUSED = tdg4021*xformL10;\n+ \n+ CCTK_REAL csetemp70 CCTK_ATTRIBUTE_UNUSED = tdg4022*xformL20;\n+ \n+ CCTK_REAL csetemp71 CCTK_ATTRIBUTE_UNUSED = tdg4023*xformL30;\n+ \n+ CCTK_REAL csetemp72 CCTK_ATTRIBUTE_UNUSED = tdg4030*xformL00;\n+ \n+ CCTK_REAL csetemp73 CCTK_ATTRIBUTE_UNUSED = tdg4031*xformL10;\n+ \n+ CCTK_REAL csetemp74 CCTK_ATTRIBUTE_UNUSED = tdg4032*xformL20;\n+ \n+ CCTK_REAL csetemp75 CCTK_ATTRIBUTE_UNUSED = tdg4033*xformL30;\n+ \n+ CCTK_REAL csetemp76 CCTK_ATTRIBUTE_UNUSED = tdg4110*xformL00;\n+ \n+ CCTK_REAL csetemp77 CCTK_ATTRIBUTE_UNUSED = tdg4111*xformL10;\n+ \n+ CCTK_REAL csetemp78 CCTK_ATTRIBUTE_UNUSED = tdg4112*xformL20;\n+ \n+ CCTK_REAL csetemp79 CCTK_ATTRIBUTE_UNUSED = tdg4113*xformL30;\n+ \n+ CCTK_REAL csetemp80 CCTK_ATTRIBUTE_UNUSED = tdg4120*xformL00;\n+ \n+ CCTK_REAL csetemp81 CCTK_ATTRIBUTE_UNUSED = tdg4121*xformL10;\n+ \n+ CCTK_REAL csetemp82 CCTK_ATTRIBUTE_UNUSED = tdg4122*xformL20;\n+ \n+ CCTK_REAL csetemp83 CCTK_ATTRIBUTE_UNUSED = tdg4123*xformL30;\n+ \n+ CCTK_REAL csetemp84 CCTK_ATTRIBUTE_UNUSED = tdg4130*xformL00;\n+ \n+ CCTK_REAL csetemp85 CCTK_ATTRIBUTE_UNUSED = tdg4131*xformL10;\n+ \n+ CCTK_REAL csetemp86 CCTK_ATTRIBUTE_UNUSED = tdg4132*xformL20;\n+ \n+ CCTK_REAL csetemp87 CCTK_ATTRIBUTE_UNUSED = tdg4133*xformL30;\n+ \n+ CCTK_REAL csetemp88 CCTK_ATTRIBUTE_UNUSED = tdg4220*xformL00;\n+ \n+ CCTK_REAL csetemp89 CCTK_ATTRIBUTE_UNUSED = tdg4221*xformL10;\n+ \n+ CCTK_REAL csetemp90 CCTK_ATTRIBUTE_UNUSED = tdg4222*xformL20;\n+ \n+ CCTK_REAL csetemp91 CCTK_ATTRIBUTE_UNUSED = tdg4223*xformL30;\n+ \n+ CCTK_REAL csetemp92 CCTK_ATTRIBUTE_UNUSED = tdg4230*xformL00;\n+ \n+ CCTK_REAL csetemp93 CCTK_ATTRIBUTE_UNUSED = tdg4231*xformL10;\n+ \n+ CCTK_REAL csetemp94 CCTK_ATTRIBUTE_UNUSED = tdg4232*xformL20;\n+ \n+ CCTK_REAL csetemp95 CCTK_ATTRIBUTE_UNUSED = tdg4233*xformL30;\n+ \n+ CCTK_REAL csetemp96 CCTK_ATTRIBUTE_UNUSED = tdg4330*xformL00;\n+ \n+ CCTK_REAL csetemp97 CCTK_ATTRIBUTE_UNUSED = tdg4331*xformL10;\n+ \n+ CCTK_REAL csetemp98 CCTK_ATTRIBUTE_UNUSED = tdg4332*xformL20;\n+ \n+ CCTK_REAL csetemp99 CCTK_ATTRIBUTE_UNUSED = tdg4333*xformL30;\n+ \n+ CCTK_REAL dg4000 CCTK_ATTRIBUTE_UNUSED = xformL00*((csetemp60 + \n+ csetemp61 + csetemp62 + csetemp63)*xformL00 + (csetemp64 + csetemp65 + \n+ csetemp66 + csetemp67)*xformL10 + (csetemp68 + csetemp69 + csetemp70 + \n+ csetemp71)*xformL20 + (csetemp72 + csetemp73 + csetemp74 + \n+ csetemp75)*xformL30) + xformL10*((csetemp64 + csetemp65 + csetemp66 + \n+ csetemp67)*xformL00 + (csetemp76 + csetemp77 + csetemp78 + \n+ csetemp79)*xformL10 + (csetemp80 + csetemp81 + csetemp82 + \n+ csetemp83)*xformL20 + (csetemp84 + csetemp85 + csetemp86 + \n+ csetemp87)*xformL30) + xformL20*((csetemp68 + csetemp69 + csetemp70 + \n+ csetemp71)*xformL00 + (csetemp80 + csetemp81 + csetemp82 + \n+ csetemp83)*xformL10 + (csetemp88 + csetemp89 + csetemp90 + \n+ csetemp91)*xformL20 + (csetemp92 + csetemp93 + csetemp94 + \n+ csetemp95)*xformL30) + xformL30*((csetemp72 + csetemp73 + csetemp74 + \n+ csetemp75)*xformL00 + (csetemp84 + csetemp85 + csetemp86 + \n+ csetemp87)*xformL10 + (csetemp92 + csetemp93 + csetemp94 + \n+ csetemp95)*xformL20 + (csetemp96 + csetemp97 + csetemp98 + \n+ csetemp99)*xformL30);\n+ \n+ CCTK_REAL dg4010 CCTK_ATTRIBUTE_UNUSED = xformL00*((csetemp60 + \n+ csetemp61 + csetemp62 + csetemp63)*xformL01 + (csetemp64 + csetemp65 + \n+ csetemp66 + csetemp67)*xformL11 + (csetemp68 + csetemp69 + csetemp70 + \n+ csetemp71)*xformL21 + (csetemp72 + csetemp73 + csetemp74 + \n+ csetemp75)*xformL31) + xformL10*((csetemp64 + csetemp65 + csetemp66 + \n+ csetemp67)*xformL01 + (csetemp76 + csetemp77 + csetemp78 + \n+ csetemp79)*xformL11 + (csetemp80 + csetemp81 + csetemp82 + \n+ csetemp83)*xformL21 + (csetemp84 + csetemp85 + csetemp86 + \n+ csetemp87)*xformL31) + xformL20*((csetemp68 + csetemp69 + csetemp70 + \n+ csetemp71)*xformL01 + (csetemp80 + csetemp81 + csetemp82 + \n+ csetemp83)*xformL11 + (csetemp88 + csetemp89 + csetemp90 + \n+ csetemp91)*xformL21 + (csetemp92 + csetemp93 + csetemp94 + \n+ csetemp95)*xformL31) + xformL30*((csetemp72 + csetemp73 + csetemp74 + \n+ csetemp75)*xformL01 + (csetemp84 + csetemp85 + csetemp86 + \n+ csetemp87)*xformL11 + (csetemp92 + csetemp93 + csetemp94 + \n+ csetemp95)*xformL21 + (csetemp96 + csetemp97 + csetemp98 + \n+ csetemp99)*xformL31);\n+ \n+ CCTK_REAL csetemp100 CCTK_ATTRIBUTE_UNUSED = tdg4000*xformL01;\n+ \n+ CCTK_REAL csetemp101 CCTK_ATTRIBUTE_UNUSED = tdg4001*xformL11;\n+ \n+ CCTK_REAL csetemp102 CCTK_ATTRIBUTE_UNUSED = tdg4002*xformL21;\n+ \n+ CCTK_REAL csetemp103 CCTK_ATTRIBUTE_UNUSED = tdg4003*xformL31;\n+ \n+ CCTK_REAL csetemp104 CCTK_ATTRIBUTE_UNUSED = tdg4010*xformL01;\n+ \n+ CCTK_REAL csetemp105 CCTK_ATTRIBUTE_UNUSED = tdg4011*xformL11;\n+ \n+ CCTK_REAL csetemp106 CCTK_ATTRIBUTE_UNUSED = tdg4012*xformL21;\n+ \n+ CCTK_REAL csetemp107 CCTK_ATTRIBUTE_UNUSED = tdg4013*xformL31;\n+ \n+ CCTK_REAL csetemp108 CCTK_ATTRIBUTE_UNUSED = tdg4020*xformL01;\n+ \n+ CCTK_REAL csetemp109 CCTK_ATTRIBUTE_UNUSED = tdg4021*xformL11;\n+ \n+ CCTK_REAL csetemp110 CCTK_ATTRIBUTE_UNUSED = tdg4022*xformL21;\n+ \n+ CCTK_REAL csetemp111 CCTK_ATTRIBUTE_UNUSED = tdg4023*xformL31;\n+ \n+ CCTK_REAL csetemp112 CCTK_ATTRIBUTE_UNUSED = tdg4030*xformL01;\n+ \n+ CCTK_REAL csetemp113 CCTK_ATTRIBUTE_UNUSED = tdg4031*xformL11;\n+ \n+ CCTK_REAL csetemp114 CCTK_ATTRIBUTE_UNUSED = tdg4032*xformL21;\n+ \n+ CCTK_REAL csetemp115 CCTK_ATTRIBUTE_UNUSED = tdg4033*xformL31;\n+ \n+ CCTK_REAL csetemp116 CCTK_ATTRIBUTE_UNUSED = tdg4110*xformL01;\n+ \n+ CCTK_REAL csetemp117 CCTK_ATTRIBUTE_UNUSED = tdg4111*xformL11;\n+ \n+ CCTK_REAL csetemp118 CCTK_ATTRIBUTE_UNUSED = tdg4112*xformL21;\n+ \n+ CCTK_REAL csetemp119 CCTK_ATTRIBUTE_UNUSED = tdg4113*xformL31;\n+ \n+ CCTK_REAL csetemp120 CCTK_ATTRIBUTE_UNUSED = tdg4120*xformL01;\n+ \n+ CCTK_REAL csetemp121 CCTK_ATTRIBUTE_UNUSED = tdg4121*xformL11;\n+ \n+ CCTK_REAL csetemp122 CCTK_ATTRIBUTE_UNUSED = tdg4122*xformL21;\n+ \n+ CCTK_REAL csetemp123 CCTK_ATTRIBUTE_UNUSED = tdg4123*xformL31;\n+ \n+ CCTK_REAL csetemp124 CCTK_ATTRIBUTE_UNUSED = tdg4130*xformL01;\n+ \n+ CCTK_REAL csetemp125 CCTK_ATTRIBUTE_UNUSED = tdg4131*xformL11;\n+ \n+ CCTK_REAL csetemp126 CCTK_ATTRIBUTE_UNUSED = tdg4132*xformL21;\n+ \n+ CCTK_REAL csetemp127 CCTK_ATTRIBUTE_UNUSED = tdg4133*xformL31;\n+ \n+ CCTK_REAL csetemp128 CCTK_ATTRIBUTE_UNUSED = tdg4220*xformL01;\n+ \n+ CCTK_REAL csetemp129 CCTK_ATTRIBUTE_UNUSED = tdg4221*xformL11;\n+ \n+ CCTK_REAL csetemp130 CCTK_ATTRIBUTE_UNUSED = tdg4222*xformL21;\n+ \n+ CCTK_REAL csetemp131 CCTK_ATTRIBUTE_UNUSED = tdg4223*xformL31;\n+ \n+ CCTK_REAL csetemp132 CCTK_ATTRIBUTE_UNUSED = tdg4230*xformL01;\n+ \n+ CCTK_REAL csetemp133 CCTK_ATTRIBUTE_UNUSED = tdg4231*xformL11;\n+ \n+ CCTK_REAL csetemp134 CCTK_ATTRIBUTE_UNUSED = tdg4232*xformL21;\n+ \n+ CCTK_REAL csetemp135 CCTK_ATTRIBUTE_UNUSED = tdg4233*xformL31;\n+ \n+ CCTK_REAL csetemp136 CCTK_ATTRIBUTE_UNUSED = tdg4330*xformL01;\n+ \n+ CCTK_REAL csetemp137 CCTK_ATTRIBUTE_UNUSED = tdg4331*xformL11;\n+ \n+ CCTK_REAL csetemp138 CCTK_ATTRIBUTE_UNUSED = tdg4332*xformL21;\n+ \n+ CCTK_REAL csetemp139 CCTK_ATTRIBUTE_UNUSED = tdg4333*xformL31;\n+ \n+ CCTK_REAL dg4011 CCTK_ATTRIBUTE_UNUSED = xformL00*((csetemp100 + \n+ csetemp101 + csetemp102 + csetemp103)*xformL01 + (csetemp104 + \n+ csetemp105 + csetemp106 + csetemp107)*xformL11 + (csetemp108 + \n+ csetemp109 + csetemp110 + csetemp111)*xformL21 + (csetemp112 + \n+ csetemp113 + csetemp114 + csetemp115)*xformL31) + xformL10*((csetemp104 \n+ + csetemp105 + csetemp106 + csetemp107)*xformL01 + (csetemp116 + \n+ csetemp117 + csetemp118 + csetemp119)*xformL11 + (csetemp120 + \n+ csetemp121 + csetemp122 + csetemp123)*xformL21 + (csetemp124 + \n+ csetemp125 + csetemp126 + csetemp127)*xformL31) + xformL20*((csetemp108 \n+ + csetemp109 + csetemp110 + csetemp111)*xformL01 + (csetemp120 + \n+ csetemp121 + csetemp122 + csetemp123)*xformL11 + (csetemp128 + \n+ csetemp129 + csetemp130 + csetemp131)*xformL21 + (csetemp132 + \n+ csetemp133 + csetemp134 + csetemp135)*xformL31) + xformL30*((csetemp112 \n+ + csetemp113 + csetemp114 + csetemp115)*xformL01 + (csetemp124 + \n+ csetemp125 + csetemp126 + csetemp127)*xformL11 + (csetemp132 + \n+ csetemp133 + csetemp134 + csetemp135)*xformL21 + (csetemp136 + \n+ csetemp137 + csetemp138 + csetemp139)*xformL31);\n+ \n+ CCTK_REAL csetemp140 CCTK_ATTRIBUTE_UNUSED = tdg4000*xformL02;\n+ \n+ CCTK_REAL csetemp141 CCTK_ATTRIBUTE_UNUSED = tdg4001*xformL12;\n+ \n+ CCTK_REAL csetemp142 CCTK_ATTRIBUTE_UNUSED = tdg4002*xformL22;\n+ \n+ CCTK_REAL csetemp143 CCTK_ATTRIBUTE_UNUSED = tdg4003*xformL32;\n+ \n+ CCTK_REAL csetemp144 CCTK_ATTRIBUTE_UNUSED = tdg4010*xformL02;\n+ \n+ CCTK_REAL csetemp145 CCTK_ATTRIBUTE_UNUSED = tdg4011*xformL12;\n+ \n+ CCTK_REAL csetemp146 CCTK_ATTRIBUTE_UNUSED = tdg4012*xformL22;\n+ \n+ CCTK_REAL csetemp147 CCTK_ATTRIBUTE_UNUSED = tdg4013*xformL32;\n+ \n+ CCTK_REAL csetemp148 CCTK_ATTRIBUTE_UNUSED = tdg4020*xformL02;\n+ \n+ CCTK_REAL csetemp149 CCTK_ATTRIBUTE_UNUSED = tdg4021*xformL12;\n+ \n+ CCTK_REAL csetemp150 CCTK_ATTRIBUTE_UNUSED = tdg4022*xformL22;\n+ \n+ CCTK_REAL csetemp151 CCTK_ATTRIBUTE_UNUSED = tdg4023*xformL32;\n+ \n+ CCTK_REAL csetemp152 CCTK_ATTRIBUTE_UNUSED = tdg4030*xformL02;\n+ \n+ CCTK_REAL csetemp153 CCTK_ATTRIBUTE_UNUSED = tdg4031*xformL12;\n+ \n+ CCTK_REAL csetemp154 CCTK_ATTRIBUTE_UNUSED = tdg4032*xformL22;\n+ \n+ CCTK_REAL csetemp155 CCTK_ATTRIBUTE_UNUSED = tdg4033*xformL32;\n+ \n+ CCTK_REAL csetemp156 CCTK_ATTRIBUTE_UNUSED = tdg4110*xformL02;\n+ \n+ CCTK_REAL csetemp157 CCTK_ATTRIBUTE_UNUSED = tdg4111*xformL12;\n+ \n+ CCTK_REAL csetemp158 CCTK_ATTRIBUTE_UNUSED = tdg4112*xformL22;\n+ \n+ CCTK_REAL csetemp159 CCTK_ATTRIBUTE_UNUSED = tdg4113*xformL32;\n+ \n+ CCTK_REAL csetemp160 CCTK_ATTRIBUTE_UNUSED = tdg4120*xformL02;\n+ \n+ CCTK_REAL csetemp161 CCTK_ATTRIBUTE_UNUSED = tdg4121*xformL12;\n+ \n+ CCTK_REAL csetemp162 CCTK_ATTRIBUTE_UNUSED = tdg4122*xformL22;\n+ \n+ CCTK_REAL csetemp163 CCTK_ATTRIBUTE_UNUSED = tdg4123*xformL32;\n+ \n+ CCTK_REAL csetemp164 CCTK_ATTRIBUTE_UNUSED = tdg4130*xformL02;\n+ \n+ CCTK_REAL csetemp165 CCTK_ATTRIBUTE_UNUSED = tdg4131*xformL12;\n+ \n+ CCTK_REAL csetemp166 CCTK_ATTRIBUTE_UNUSED = tdg4132*xformL22;\n+ \n+ CCTK_REAL csetemp167 CCTK_ATTRIBUTE_UNUSED = tdg4133*xformL32;\n+ \n+ CCTK_REAL csetemp168 CCTK_ATTRIBUTE_UNUSED = tdg4220*xformL02;\n+ \n+ CCTK_REAL csetemp169 CCTK_ATTRIBUTE_UNUSED = tdg4221*xformL12;\n+ \n+ CCTK_REAL csetemp170 CCTK_ATTRIBUTE_UNUSED = tdg4222*xformL22;\n+ \n+ CCTK_REAL csetemp171 CCTK_ATTRIBUTE_UNUSED = tdg4223*xformL32;\n+ \n+ CCTK_REAL csetemp172 CCTK_ATTRIBUTE_UNUSED = tdg4230*xformL02;\n+ \n+ CCTK_REAL csetemp173 CCTK_ATTRIBUTE_UNUSED = tdg4231*xformL12;\n+ \n+ CCTK_REAL csetemp174 CCTK_ATTRIBUTE_UNUSED = tdg4232*xformL22;\n+ \n+ CCTK_REAL csetemp175 CCTK_ATTRIBUTE_UNUSED = tdg4233*xformL32;\n+ \n+ CCTK_REAL csetemp176 CCTK_ATTRIBUTE_UNUSED = tdg4330*xformL02;\n+ \n+ CCTK_REAL csetemp177 CCTK_ATTRIBUTE_UNUSED = tdg4331*xformL12;\n+ \n+ CCTK_REAL csetemp178 CCTK_ATTRIBUTE_UNUSED = tdg4332*xformL22;\n+ \n+ CCTK_REAL csetemp179 CCTK_ATTRIBUTE_UNUSED = tdg4333*xformL32;\n+ \n+ CCTK_REAL dg4012 CCTK_ATTRIBUTE_UNUSED = xformL00*((csetemp140 + \n+ csetemp141 + csetemp142 + csetemp143)*xformL01 + (csetemp144 + \n+ csetemp145 + csetemp146 + csetemp147)*xformL11 + (csetemp148 + \n+ csetemp149 + csetemp150 + csetemp151)*xformL21 + (csetemp152 + \n+ csetemp153 + csetemp154 + csetemp155)*xformL31) + xformL10*((csetemp144 \n+ + csetemp145 + csetemp146 + csetemp147)*xformL01 + (csetemp156 + \n+ csetemp157 + csetemp158 + csetemp159)*xformL11 + (csetemp160 + \n+ csetemp161 + csetemp162 + csetemp163)*xformL21 + (csetemp164 + \n+ csetemp165 + csetemp166 + csetemp167)*xformL31) + xformL20*((csetemp148 \n+ + csetemp149 + csetemp150 + csetemp151)*xformL01 + (csetemp160 + \n+ csetemp161 + csetemp162 + csetemp163)*xformL11 + (csetemp168 + \n+ csetemp169 + csetemp170 + csetemp171)*xformL21 + (csetemp172 + \n+ csetemp173 + csetemp174 + csetemp175)*xformL31) + xformL30*((csetemp152 \n+ + csetemp153 + csetemp154 + csetemp155)*xformL01 + (csetemp164 + \n+ csetemp165 + csetemp166 + csetemp167)*xformL11 + (csetemp172 + \n+ csetemp173 + csetemp174 + csetemp175)*xformL21 + (csetemp176 + \n+ csetemp177 + csetemp178 + csetemp179)*xformL31);\n+ \n+ CCTK_REAL csetemp180 CCTK_ATTRIBUTE_UNUSED = tdg4000*xformL03;\n+ \n+ CCTK_REAL csetemp181 CCTK_ATTRIBUTE_UNUSED = tdg4001*xformL13;\n+ \n+ CCTK_REAL csetemp182 CCTK_ATTRIBUTE_UNUSED = tdg4002*xformL23;\n+ \n+ CCTK_REAL csetemp183 CCTK_ATTRIBUTE_UNUSED = tdg4003*xformL33;\n+ \n+ CCTK_REAL csetemp184 CCTK_ATTRIBUTE_UNUSED = tdg4010*xformL03;\n+ \n+ CCTK_REAL csetemp185 CCTK_ATTRIBUTE_UNUSED = tdg4011*xformL13;\n+ \n+ CCTK_REAL csetemp186 CCTK_ATTRIBUTE_UNUSED = tdg4012*xformL23;\n+ \n+ CCTK_REAL csetemp187 CCTK_ATTRIBUTE_UNUSED = tdg4013*xformL33;\n+ \n+ CCTK_REAL csetemp188 CCTK_ATTRIBUTE_UNUSED = tdg4020*xformL03;\n+ \n+ CCTK_REAL csetemp189 CCTK_ATTRIBUTE_UNUSED = tdg4021*xformL13;\n+ \n+ CCTK_REAL csetemp190 CCTK_ATTRIBUTE_UNUSED = tdg4022*xformL23;\n+ \n+ CCTK_REAL csetemp191 CCTK_ATTRIBUTE_UNUSED = tdg4023*xformL33;\n+ \n+ CCTK_REAL csetemp192 CCTK_ATTRIBUTE_UNUSED = tdg4030*xformL03;\n+ \n+ CCTK_REAL csetemp193 CCTK_ATTRIBUTE_UNUSED = tdg4031*xformL13;\n+ \n+ CCTK_REAL csetemp194 CCTK_ATTRIBUTE_UNUSED = tdg4032*xformL23;\n+ \n+ CCTK_REAL csetemp195 CCTK_ATTRIBUTE_UNUSED = tdg4033*xformL33;\n+ \n+ CCTK_REAL csetemp196 CCTK_ATTRIBUTE_UNUSED = tdg4110*xformL03;\n+ \n+ CCTK_REAL csetemp197 CCTK_ATTRIBUTE_UNUSED = tdg4111*xformL13;\n+ \n+ CCTK_REAL csetemp198 CCTK_ATTRIBUTE_UNUSED = tdg4112*xformL23;\n+ \n+ CCTK_REAL csetemp199 CCTK_ATTRIBUTE_UNUSED = tdg4113*xformL33;\n+ \n+ CCTK_REAL csetemp200 CCTK_ATTRIBUTE_UNUSED = tdg4120*xformL03;\n+ \n+ CCTK_REAL csetemp201 CCTK_ATTRIBUTE_UNUSED = tdg4121*xformL13;\n+ \n+ CCTK_REAL csetemp202 CCTK_ATTRIBUTE_UNUSED = tdg4122*xformL23;\n+ \n+ CCTK_REAL csetemp203 CCTK_ATTRIBUTE_UNUSED = tdg4123*xformL33;\n+ \n+ CCTK_REAL csetemp204 CCTK_ATTRIBUTE_UNUSED = tdg4130*xformL03;\n+ \n+ CCTK_REAL csetemp205 CCTK_ATTRIBUTE_UNUSED = tdg4131*xformL13;\n+ \n+ CCTK_REAL csetemp206 CCTK_ATTRIBUTE_UNUSED = tdg4132*xformL23;\n+ \n+ CCTK_REAL csetemp207 CCTK_ATTRIBUTE_UNUSED = tdg4133*xformL33;\n+ \n+ CCTK_REAL csetemp208 CCTK_ATTRIBUTE_UNUSED = tdg4220*xformL03;\n+ \n+ CCTK_REAL csetemp209 CCTK_ATTRIBUTE_UNUSED = tdg4221*xformL13;\n+ \n+ CCTK_REAL csetemp210 CCTK_ATTRIBUTE_UNUSED = tdg4222*xformL23;\n+ \n+ CCTK_REAL csetemp211 CCTK_ATTRIBUTE_UNUSED = tdg4223*xformL33;\n+ \n+ CCTK_REAL csetemp212 CCTK_ATTRIBUTE_UNUSED = tdg4230*xformL03;\n+ \n+ CCTK_REAL csetemp213 CCTK_ATTRIBUTE_UNUSED = tdg4231*xformL13;\n+ \n+ CCTK_REAL csetemp214 CCTK_ATTRIBUTE_UNUSED = tdg4232*xformL23;\n+ \n+ CCTK_REAL csetemp215 CCTK_ATTRIBUTE_UNUSED = tdg4233*xformL33;\n+ \n+ CCTK_REAL csetemp216 CCTK_ATTRIBUTE_UNUSED = tdg4330*xformL03;\n+ \n+ CCTK_REAL csetemp217 CCTK_ATTRIBUTE_UNUSED = tdg4331*xformL13;\n+ \n+ CCTK_REAL csetemp218 CCTK_ATTRIBUTE_UNUSED = tdg4332*xformL23;\n+ \n+ CCTK_REAL csetemp219 CCTK_ATTRIBUTE_UNUSED = tdg4333*xformL33;\n+ \n+ CCTK_REAL dg4013 CCTK_ATTRIBUTE_UNUSED = xformL00*((csetemp180 + \n+ csetemp181 + csetemp182 + csetemp183)*xformL01 + (csetemp184 + \n+ csetemp185 + csetemp186 + csetemp187)*xformL11 + (csetemp188 + \n+ csetemp189 + csetemp190 + csetemp191)*xformL21 + (csetemp192 + \n+ csetemp193 + csetemp194 + csetemp195)*xformL31) + xformL10*((csetemp184 \n+ + csetemp185 + csetemp186 + csetemp187)*xformL01 + (csetemp196 + \n+ csetemp197 + csetemp198 + csetemp199)*xformL11 + (csetemp200 + \n+ csetemp201 + csetemp202 + csetemp203)*xformL21 + (csetemp204 + \n+ csetemp205 + csetemp206 + csetemp207)*xformL31) + xformL20*((csetemp188 \n+ + csetemp189 + csetemp190 + csetemp191)*xformL01 + (csetemp200 + \n+ csetemp201 + csetemp202 + csetemp203)*xformL11 + (csetemp208 + \n+ csetemp209 + csetemp210 + csetemp211)*xformL21 + (csetemp212 + \n+ csetemp213 + csetemp214 + csetemp215)*xformL31) + xformL30*((csetemp192 \n+ + csetemp193 + csetemp194 + csetemp195)*xformL01 + (csetemp204 + \n+ csetemp205 + csetemp206 + csetemp207)*xformL11 + (csetemp212 + \n+ csetemp213 + csetemp214 + csetemp215)*xformL21 + (csetemp216 + \n+ csetemp217 + csetemp218 + csetemp219)*xformL31);\n+ \n+ CCTK_REAL dg4020 CCTK_ATTRIBUTE_UNUSED = xformL00*((csetemp60 + \n+ csetemp61 + csetemp62 + csetemp63)*xformL02 + (csetemp64 + csetemp65 + \n+ csetemp66 + csetemp67)*xformL12 + (csetemp68 + csetemp69 + csetemp70 + \n+ csetemp71)*xformL22 + (csetemp72 + csetemp73 + csetemp74 + \n+ csetemp75)*xformL32) + xformL10*((csetemp64 + csetemp65 + csetemp66 + \n+ csetemp67)*xformL02 + (csetemp76 + csetemp77 + csetemp78 + \n+ csetemp79)*xformL12 + (csetemp80 + csetemp81 + csetemp82 + \n+ csetemp83)*xformL22 + (csetemp84 + csetemp85 + csetemp86 + \n+ csetemp87)*xformL32) + xformL20*((csetemp68 + csetemp69 + csetemp70 + \n+ csetemp71)*xformL02 + (csetemp80 + csetemp81 + csetemp82 + \n+ csetemp83)*xformL12 + (csetemp88 + csetemp89 + csetemp90 + \n+ csetemp91)*xformL22 + (csetemp92 + csetemp93 + csetemp94 + \n+ csetemp95)*xformL32) + xformL30*((csetemp72 + csetemp73 + csetemp74 + \n+ csetemp75)*xformL02 + (csetemp84 + csetemp85 + csetemp86 + \n+ csetemp87)*xformL12 + (csetemp92 + csetemp93 + csetemp94 + \n+ csetemp95)*xformL22 + (csetemp96 + csetemp97 + csetemp98 + \n+ csetemp99)*xformL32);\n+ \n+ CCTK_REAL dg4021 CCTK_ATTRIBUTE_UNUSED = xformL00*((csetemp100 + \n+ csetemp101 + csetemp102 + csetemp103)*xformL02 + (csetemp104 + \n+ csetemp105 + csetemp106 + csetemp107)*xformL12 + (csetemp108 + \n+ csetemp109 + csetemp110 + csetemp111)*xformL22 + (csetemp112 + \n+ csetemp113 + csetemp114 + csetemp115)*xformL32) + xformL10*((csetemp104 \n+ + csetemp105 + csetemp106 + csetemp107)*xformL02 + (csetemp116 + \n+ csetemp117 + csetemp118 + csetemp119)*xformL12 + (csetemp120 + \n+ csetemp121 + csetemp122 + csetemp123)*xformL22 + (csetemp124 + \n+ csetemp125 + csetemp126 + csetemp127)*xformL32) + xformL20*((csetemp108 \n+ + csetemp109 + csetemp110 + csetemp111)*xformL02 + (csetemp120 + \n+ csetemp121 + csetemp122 + csetemp123)*xformL12 + (csetemp128 + \n+ csetemp129 + csetemp130 + csetemp131)*xformL22 + (csetemp132 + \n+ csetemp133 + csetemp134 + csetemp135)*xformL32) + xformL30*((csetemp112 \n+ + csetemp113 + csetemp114 + csetemp115)*xformL02 + (csetemp124 + \n+ csetemp125 + csetemp126 + csetemp127)*xformL12 + (csetemp132 + \n+ csetemp133 + csetemp134 + csetemp135)*xformL22 + (csetemp136 + \n+ csetemp137 + csetemp138 + csetemp139)*xformL32);\n+ \n+ CCTK_REAL dg4022 CCTK_ATTRIBUTE_UNUSED = xformL00*((csetemp140 + \n+ csetemp141 + csetemp142 + csetemp143)*xformL02 + (csetemp144 + \n+ csetemp145 + csetemp146 + csetemp147)*xformL12 + (csetemp148 + \n+ csetemp149 + csetemp150 + csetemp151)*xformL22 + (csetemp152 + \n+ csetemp153 + csetemp154 + csetemp155)*xformL32) + xformL10*((csetemp144 \n+ + csetemp145 + csetemp146 + csetemp147)*xformL02 + (csetemp156 + \n+ csetemp157 + csetemp158 + csetemp159)*xformL12 + (csetemp160 + \n+ csetemp161 + csetemp162 + csetemp163)*xformL22 + (csetemp164 + \n+ csetemp165 + csetemp166 + csetemp167)*xformL32) + xformL20*((csetemp148 \n+ + csetemp149 + csetemp150 + csetemp151)*xformL02 + (csetemp160 + \n+ csetemp161 + csetemp162 + csetemp163)*xformL12 + (csetemp168 + \n+ csetemp169 + csetemp170 + csetemp171)*xformL22 + (csetemp172 + \n+ csetemp173 + csetemp174 + csetemp175)*xformL32) + xformL30*((csetemp152 \n+ + csetemp153 + csetemp154 + csetemp155)*xformL02 + (csetemp164 + \n+ csetemp165 + csetemp166 + csetemp167)*xformL12 + (csetemp172 + \n+ csetemp173 + csetemp174 + csetemp175)*xformL22 + (csetemp176 + \n+ csetemp177 + csetemp178 + csetemp179)*xformL32);\n+ \n+ CCTK_REAL dg4023 CCTK_ATTRIBUTE_UNUSED = xformL00*((csetemp180 + \n+ csetemp181 + csetemp182 + csetemp183)*xformL02 + (csetemp184 + \n+ csetemp185 + csetemp186 + csetemp187)*xformL12 + (csetemp188 + \n+ csetemp189 + csetemp190 + csetemp191)*xformL22 + (csetemp192 + \n+ csetemp193 + csetemp194 + csetemp195)*xformL32) + xformL10*((csetemp184 \n+ + csetemp185 + csetemp186 + csetemp187)*xformL02 + (csetemp196 + \n+ csetemp197 + csetemp198 + csetemp199)*xformL12 + (csetemp200 + \n+ csetemp201 + csetemp202 + csetemp203)*xformL22 + (csetemp204 + \n+ csetemp205 + csetemp206 + csetemp207)*xformL32) + xformL20*((csetemp188 \n+ + csetemp189 + csetemp190 + csetemp191)*xformL02 + (csetemp200 + \n+ csetemp201 + csetemp202 + csetemp203)*xformL12 + (csetemp208 + \n+ csetemp209 + csetemp210 + csetemp211)*xformL22 + (csetemp212 + \n+ csetemp213 + csetemp214 + csetemp215)*xformL32) + xformL30*((csetemp192 \n+ + csetemp193 + csetemp194 + csetemp195)*xformL02 + (csetemp204 + \n+ csetemp205 + csetemp206 + csetemp207)*xformL12 + (csetemp212 + \n+ csetemp213 + csetemp214 + csetemp215)*xformL22 + (csetemp216 + \n+ csetemp217 + csetemp218 + csetemp219)*xformL32);\n+ \n+ CCTK_REAL dg4030 CCTK_ATTRIBUTE_UNUSED = xformL00*((csetemp60 + \n+ csetemp61 + csetemp62 + csetemp63)*xformL03 + (csetemp64 + csetemp65 + \n+ csetemp66 + csetemp67)*xformL13 + (csetemp68 + csetemp69 + csetemp70 + \n+ csetemp71)*xformL23 + (csetemp72 + csetemp73 + csetemp74 + \n+ csetemp75)*xformL33) + xformL10*((csetemp64 + csetemp65 + csetemp66 + \n+ csetemp67)*xformL03 + (csetemp76 + csetemp77 + csetemp78 + \n+ csetemp79)*xformL13 + (csetemp80 + csetemp81 + csetemp82 + \n+ csetemp83)*xformL23 + (csetemp84 + csetemp85 + csetemp86 + \n+ csetemp87)*xformL33) + xformL20*((csetemp68 + csetemp69 + csetemp70 + \n+ csetemp71)*xformL03 + (csetemp80 + csetemp81 + csetemp82 + \n+ csetemp83)*xformL13 + (csetemp88 + csetemp89 + csetemp90 + \n+ csetemp91)*xformL23 + (csetemp92 + csetemp93 + csetemp94 + \n+ csetemp95)*xformL33) + xformL30*((csetemp72 + csetemp73 + csetemp74 + \n+ csetemp75)*xformL03 + (csetemp84 + csetemp85 + csetemp86 + \n+ csetemp87)*xformL13 + (csetemp92 + csetemp93 + csetemp94 + \n+ csetemp95)*xformL23 + (csetemp96 + csetemp97 + csetemp98 + \n+ csetemp99)*xformL33);\n+ \n+ CCTK_REAL dg4031 CCTK_ATTRIBUTE_UNUSED = xformL00*((csetemp100 + \n+ csetemp101 + csetemp102 + csetemp103)*xformL03 + (csetemp104 + \n+ csetemp105 + csetemp106 + csetemp107)*xformL13 + (csetemp108 + \n+ csetemp109 + csetemp110 + csetemp111)*xformL23 + (csetemp112 + \n+ csetemp113 + csetemp114 + csetemp115)*xformL33) + xformL10*((csetemp104 \n+ + csetemp105 + csetemp106 + csetemp107)*xformL03 + (csetemp116 + \n+ csetemp117 + csetemp118 + csetemp119)*xformL13 + (csetemp120 + \n+ csetemp121 + csetemp122 + csetemp123)*xformL23 + (csetemp124 + \n+ csetemp125 + csetemp126 + csetemp127)*xformL33) + xformL20*((csetemp108 \n+ + csetemp109 + csetemp110 + csetemp111)*xformL03 + (csetemp120 + \n+ csetemp121 + csetemp122 + csetemp123)*xformL13 + (csetemp128 + \n+ csetemp129 + csetemp130 + csetemp131)*xformL23 + (csetemp132 + \n+ csetemp133 + csetemp134 + csetemp135)*xformL33) + xformL30*((csetemp112 \n+ + csetemp113 + csetemp114 + csetemp115)*xformL03 + (csetemp124 + \n+ csetemp125 + csetemp126 + csetemp127)*xformL13 + (csetemp132 + \n+ csetemp133 + csetemp134 + csetemp135)*xformL23 + (csetemp136 + \n+ csetemp137 + csetemp138 + csetemp139)*xformL33);\n+ \n+ CCTK_REAL dg4032 CCTK_ATTRIBUTE_UNUSED = xformL00*((csetemp140 + \n+ csetemp141 + csetemp142 + csetemp143)*xformL03 + (csetemp144 + \n+ csetemp145 + csetemp146 + csetemp147)*xformL13 + (csetemp148 + \n+ csetemp149 + csetemp150 + csetemp151)*xformL23 + (csetemp152 + \n+ csetemp153 + csetemp154 + csetemp155)*xformL33) + xformL10*((csetemp144 \n+ + csetemp145 + csetemp146 + csetemp147)*xformL03 + (csetemp156 + \n+ csetemp157 + csetemp158 + csetemp159)*xformL13 + (csetemp160 + \n+ csetemp161 + csetemp162 + csetemp163)*xformL23 + (csetemp164 + \n+ csetemp165 + csetemp166 + csetemp167)*xformL33) + xformL20*((csetemp148 \n+ + csetemp149 + csetemp150 + csetemp151)*xformL03 + (csetemp160 + \n+ csetemp161 + csetemp162 + csetemp163)*xformL13 + (csetemp168 + \n+ csetemp169 + csetemp170 + csetemp171)*xformL23 + (csetemp172 + \n+ csetemp173 + csetemp174 + csetemp175)*xformL33) + xformL30*((csetemp152 \n+ + csetemp153 + csetemp154 + csetemp155)*xformL03 + (csetemp164 + \n+ csetemp165 + csetemp166 + csetemp167)*xformL13 + (csetemp172 + \n+ csetemp173 + csetemp174 + csetemp175)*xformL23 + (csetemp176 + \n+ csetemp177 + csetemp178 + csetemp179)*xformL33);\n+ \n+ CCTK_REAL dg4033 CCTK_ATTRIBUTE_UNUSED = xformL00*((csetemp180 + \n+ csetemp181 + csetemp182 + csetemp183)*xformL03 + (csetemp184 + \n+ csetemp185 + csetemp186 + csetemp187)*xformL13 + (csetemp188 + \n+ csetemp189 + csetemp190 + csetemp191)*xformL23 + (csetemp192 + \n+ csetemp193 + csetemp194 + csetemp195)*xformL33) + xformL10*((csetemp184 \n+ + csetemp185 + csetemp186 + csetemp187)*xformL03 + (csetemp196 + \n+ csetemp197 + csetemp198 + csetemp199)*xformL13 + (csetemp200 + \n+ csetemp201 + csetemp202 + csetemp203)*xformL23 + (csetemp204 + \n+ csetemp205 + csetemp206 + csetemp207)*xformL33) + xformL20*((csetemp188 \n+ + csetemp189 + csetemp190 + csetemp191)*xformL03 + (csetemp200 + \n+ csetemp201 + csetemp202 + csetemp203)*xformL13 + (csetemp208 + \n+ csetemp209 + csetemp210 + csetemp211)*xformL23 + (csetemp212 + \n+ csetemp213 + csetemp214 + csetemp215)*xformL33) + xformL30*((csetemp192 \n+ + csetemp193 + csetemp194 + csetemp195)*xformL03 + (csetemp204 + \n+ csetemp205 + csetemp206 + csetemp207)*xformL13 + (csetemp212 + \n+ csetemp213 + csetemp214 + csetemp215)*xformL23 + (csetemp216 + \n+ csetemp217 + csetemp218 + csetemp219)*xformL33);\n+ \n+ CCTK_REAL dg4110 CCTK_ATTRIBUTE_UNUSED = xformL01*((csetemp60 + \n+ csetemp61 + csetemp62 + csetemp63)*xformL01 + (csetemp64 + csetemp65 + \n+ csetemp66 + csetemp67)*xformL11 + (csetemp68 + csetemp69 + csetemp70 + \n+ csetemp71)*xformL21 + (csetemp72 + csetemp73 + csetemp74 + \n+ csetemp75)*xformL31) + xformL11*((csetemp64 + csetemp65 + csetemp66 + \n+ csetemp67)*xformL01 + (csetemp76 + csetemp77 + csetemp78 + \n+ csetemp79)*xformL11 + (csetemp80 + csetemp81 + csetemp82 + \n+ csetemp83)*xformL21 + (csetemp84 + csetemp85 + csetemp86 + \n+ csetemp87)*xformL31) + xformL21*((csetemp68 + csetemp69 + csetemp70 + \n+ csetemp71)*xformL01 + (csetemp80 + csetemp81 + csetemp82 + \n+ csetemp83)*xformL11 + (csetemp88 + csetemp89 + csetemp90 + \n+ csetemp91)*xformL21 + (csetemp92 + csetemp93 + csetemp94 + \n+ csetemp95)*xformL31) + xformL31*((csetemp72 + csetemp73 + csetemp74 + \n+ csetemp75)*xformL01 + (csetemp84 + csetemp85 + csetemp86 + \n+ csetemp87)*xformL11 + (csetemp92 + csetemp93 + csetemp94 + \n+ csetemp95)*xformL21 + (csetemp96 + csetemp97 + csetemp98 + \n+ csetemp99)*xformL31);\n+ \n+ CCTK_REAL dg4111 CCTK_ATTRIBUTE_UNUSED = xformL01*((csetemp100 + \n+ csetemp101 + csetemp102 + csetemp103)*xformL01 + (csetemp104 + \n+ csetemp105 + csetemp106 + csetemp107)*xformL11 + (csetemp108 + \n+ csetemp109 + csetemp110 + csetemp111)*xformL21 + (csetemp112 + \n+ csetemp113 + csetemp114 + csetemp115)*xformL31) + xformL11*((csetemp104 \n+ + csetemp105 + csetemp106 + csetemp107)*xformL01 + (csetemp116 + \n+ csetemp117 + csetemp118 + csetemp119)*xformL11 + (csetemp120 + \n+ csetemp121 + csetemp122 + csetemp123)*xformL21 + (csetemp124 + \n+ csetemp125 + csetemp126 + csetemp127)*xformL31) + xformL21*((csetemp108 \n+ + csetemp109 + csetemp110 + csetemp111)*xformL01 + (csetemp120 + \n+ csetemp121 + csetemp122 + csetemp123)*xformL11 + (csetemp128 + \n+ csetemp129 + csetemp130 + csetemp131)*xformL21 + (csetemp132 + \n+ csetemp133 + csetemp134 + csetemp135)*xformL31) + xformL31*((csetemp112 \n+ + csetemp113 + csetemp114 + csetemp115)*xformL01 + (csetemp124 + \n+ csetemp125 + csetemp126 + csetemp127)*xformL11 + (csetemp132 + \n+ csetemp133 + csetemp134 + csetemp135)*xformL21 + (csetemp136 + \n+ csetemp137 + csetemp138 + csetemp139)*xformL31);\n+ \n+ CCTK_REAL dg4112 CCTK_ATTRIBUTE_UNUSED = xformL01*((csetemp140 + \n+ csetemp141 + csetemp142 + csetemp143)*xformL01 + (csetemp144 + \n+ csetemp145 + csetemp146 + csetemp147)*xformL11 + (csetemp148 + \n+ csetemp149 + csetemp150 + csetemp151)*xformL21 + (csetemp152 + \n+ csetemp153 + csetemp154 + csetemp155)*xformL31) + xformL11*((csetemp144 \n+ + csetemp145 + csetemp146 + csetemp147)*xformL01 + (csetemp156 + \n+ csetemp157 + csetemp158 + csetemp159)*xformL11 + (csetemp160 + \n+ csetemp161 + csetemp162 + csetemp163)*xformL21 + (csetemp164 + \n+ csetemp165 + csetemp166 + csetemp167)*xformL31) + xformL21*((csetemp148 \n+ + csetemp149 + csetemp150 + csetemp151)*xformL01 + (csetemp160 + \n+ csetemp161 + csetemp162 + csetemp163)*xformL11 + (csetemp168 + \n+ csetemp169 + csetemp170 + csetemp171)*xformL21 + (csetemp172 + \n+ csetemp173 + csetemp174 + csetemp175)*xformL31) + xformL31*((csetemp152 \n+ + csetemp153 + csetemp154 + csetemp155)*xformL01 + (csetemp164 + \n+ csetemp165 + csetemp166 + csetemp167)*xformL11 + (csetemp172 + \n+ csetemp173 + csetemp174 + csetemp175)*xformL21 + (csetemp176 + \n+ csetemp177 + csetemp178 + csetemp179)*xformL31);\n+ \n+ CCTK_REAL dg4113 CCTK_ATTRIBUTE_UNUSED = xformL01*((csetemp180 + \n+ csetemp181 + csetemp182 + csetemp183)*xformL01 + (csetemp184 + \n+ csetemp185 + csetemp186 + csetemp187)*xformL11 + (csetemp188 + \n+ csetemp189 + csetemp190 + csetemp191)*xformL21 + (csetemp192 + \n+ csetemp193 + csetemp194 + csetemp195)*xformL31) + xformL11*((csetemp184 \n+ + csetemp185 + csetemp186 + csetemp187)*xformL01 + (csetemp196 + \n+ csetemp197 + csetemp198 + csetemp199)*xformL11 + (csetemp200 + \n+ csetemp201 + csetemp202 + csetemp203)*xformL21 + (csetemp204 + \n+ csetemp205 + csetemp206 + csetemp207)*xformL31) + xformL21*((csetemp188 \n+ + csetemp189 + csetemp190 + csetemp191)*xformL01 + (csetemp200 + \n+ csetemp201 + csetemp202 + csetemp203)*xformL11 + (csetemp208 + \n+ csetemp209 + csetemp210 + csetemp211)*xformL21 + (csetemp212 + \n+ csetemp213 + csetemp214 + csetemp215)*xformL31) + xformL31*((csetemp192 \n+ + csetemp193 + csetemp194 + csetemp195)*xformL01 + (csetemp204 + \n+ csetemp205 + csetemp206 + csetemp207)*xformL11 + (csetemp212 + \n+ csetemp213 + csetemp214 + csetemp215)*xformL21 + (csetemp216 + \n+ csetemp217 + csetemp218 + csetemp219)*xformL31);\n+ \n+ CCTK_REAL dg4120 CCTK_ATTRIBUTE_UNUSED = xformL01*((csetemp60 + \n+ csetemp61 + csetemp62 + csetemp63)*xformL02 + (csetemp64 + csetemp65 + \n+ csetemp66 + csetemp67)*xformL12 + (csetemp68 + csetemp69 + csetemp70 + \n+ csetemp71)*xformL22 + (csetemp72 + csetemp73 + csetemp74 + \n+ csetemp75)*xformL32) + xformL11*((csetemp64 + csetemp65 + csetemp66 + \n+ csetemp67)*xformL02 + (csetemp76 + csetemp77 + csetemp78 + \n+ csetemp79)*xformL12 + (csetemp80 + csetemp81 + csetemp82 + \n+ csetemp83)*xformL22 + (csetemp84 + csetemp85 + csetemp86 + \n+ csetemp87)*xformL32) + xformL21*((csetemp68 + csetemp69 + csetemp70 + \n+ csetemp71)*xformL02 + (csetemp80 + csetemp81 + csetemp82 + \n+ csetemp83)*xformL12 + (csetemp88 + csetemp89 + csetemp90 + \n+ csetemp91)*xformL22 + (csetemp92 + csetemp93 + csetemp94 + \n+ csetemp95)*xformL32) + xformL31*((csetemp72 + csetemp73 + csetemp74 + \n+ csetemp75)*xformL02 + (csetemp84 + csetemp85 + csetemp86 + \n+ csetemp87)*xformL12 + (csetemp92 + csetemp93 + csetemp94 + \n+ csetemp95)*xformL22 + (csetemp96 + csetemp97 + csetemp98 + \n+ csetemp99)*xformL32);\n+ \n+ CCTK_REAL dg4121 CCTK_ATTRIBUTE_UNUSED = xformL01*((csetemp100 + \n+ csetemp101 + csetemp102 + csetemp103)*xformL02 + (csetemp104 + \n+ csetemp105 + csetemp106 + csetemp107)*xformL12 + (csetemp108 + \n+ csetemp109 + csetemp110 + csetemp111)*xformL22 + (csetemp112 + \n+ csetemp113 + csetemp114 + csetemp115)*xformL32) + xformL11*((csetemp104 \n+ + csetemp105 + csetemp106 + csetemp107)*xformL02 + (csetemp116 + \n+ csetemp117 + csetemp118 + csetemp119)*xformL12 + (csetemp120 + \n+ csetemp121 + csetemp122 + csetemp123)*xformL22 + (csetemp124 + \n+ csetemp125 + csetemp126 + csetemp127)*xformL32) + xformL21*((csetemp108 \n+ + csetemp109 + csetemp110 + csetemp111)*xformL02 + (csetemp120 + \n+ csetemp121 + csetemp122 + csetemp123)*xformL12 + (csetemp128 + \n+ csetemp129 + csetemp130 + csetemp131)*xformL22 + (csetemp132 + \n+ csetemp133 + csetemp134 + csetemp135)*xformL32) + xformL31*((csetemp112 \n+ + csetemp113 + csetemp114 + csetemp115)*xformL02 + (csetemp124 + \n+ csetemp125 + csetemp126 + csetemp127)*xformL12 + (csetemp132 + \n+ csetemp133 + csetemp134 + csetemp135)*xformL22 + (csetemp136 + \n+ csetemp137 + csetemp138 + csetemp139)*xformL32);\n+ \n+ CCTK_REAL dg4122 CCTK_ATTRIBUTE_UNUSED = xformL01*((csetemp140 + \n+ csetemp141 + csetemp142 + csetemp143)*xformL02 + (csetemp144 + \n+ csetemp145 + csetemp146 + csetemp147)*xformL12 + (csetemp148 + \n+ csetemp149 + csetemp150 + csetemp151)*xformL22 + (csetemp152 + \n+ csetemp153 + csetemp154 + csetemp155)*xformL32) + xformL11*((csetemp144 \n+ + csetemp145 + csetemp146 + csetemp147)*xformL02 + (csetemp156 + \n+ csetemp157 + csetemp158 + csetemp159)*xformL12 + (csetemp160 + \n+ csetemp161 + csetemp162 + csetemp163)*xformL22 + (csetemp164 + \n+ csetemp165 + csetemp166 + csetemp167)*xformL32) + xformL21*((csetemp148 \n+ + csetemp149 + csetemp150 + csetemp151)*xformL02 + (csetemp160 + \n+ csetemp161 + csetemp162 + csetemp163)*xformL12 + (csetemp168 + \n+ csetemp169 + csetemp170 + csetemp171)*xformL22 + (csetemp172 + \n+ csetemp173 + csetemp174 + csetemp175)*xformL32) + xformL31*((csetemp152 \n+ + csetemp153 + csetemp154 + csetemp155)*xformL02 + (csetemp164 + \n+ csetemp165 + csetemp166 + csetemp167)*xformL12 + (csetemp172 + \n+ csetemp173 + csetemp174 + csetemp175)*xformL22 + (csetemp176 + \n+ csetemp177 + csetemp178 + csetemp179)*xformL32);\n+ \n+ CCTK_REAL dg4123 CCTK_ATTRIBUTE_UNUSED = xformL01*((csetemp180 + \n+ csetemp181 + csetemp182 + csetemp183)*xformL02 + (csetemp184 + \n+ csetemp185 + csetemp186 + csetemp187)*xformL12 + (csetemp188 + \n+ csetemp189 + csetemp190 + csetemp191)*xformL22 + (csetemp192 + \n+ csetemp193 + csetemp194 + csetemp195)*xformL32) + xformL11*((csetemp184 \n+ + csetemp185 + csetemp186 + csetemp187)*xformL02 + (csetemp196 + \n+ csetemp197 + csetemp198 + csetemp199)*xformL12 + (csetemp200 + \n+ csetemp201 + csetemp202 + csetemp203)*xformL22 + (csetemp204 + \n+ csetemp205 + csetemp206 + csetemp207)*xformL32) + xformL21*((csetemp188 \n+ + csetemp189 + csetemp190 + csetemp191)*xformL02 + (csetemp200 + \n+ csetemp201 + csetemp202 + csetemp203)*xformL12 + (csetemp208 + \n+ csetemp209 + csetemp210 + csetemp211)*xformL22 + (csetemp212 + \n+ csetemp213 + csetemp214 + csetemp215)*xformL32) + xformL31*((csetemp192 \n+ + csetemp193 + csetemp194 + csetemp195)*xformL02 + (csetemp204 + \n+ csetemp205 + csetemp206 + csetemp207)*xformL12 + (csetemp212 + \n+ csetemp213 + csetemp214 + csetemp215)*xformL22 + (csetemp216 + \n+ csetemp217 + csetemp218 + csetemp219)*xformL32);\n+ \n+ CCTK_REAL dg4130 CCTK_ATTRIBUTE_UNUSED = xformL01*((csetemp60 + \n+ csetemp61 + csetemp62 + csetemp63)*xformL03 + (csetemp64 + csetemp65 + \n+ csetemp66 + csetemp67)*xformL13 + (csetemp68 + csetemp69 + csetemp70 + \n+ csetemp71)*xformL23 + (csetemp72 + csetemp73 + csetemp74 + \n+ csetemp75)*xformL33) + xformL11*((csetemp64 + csetemp65 + csetemp66 + \n+ csetemp67)*xformL03 + (csetemp76 + csetemp77 + csetemp78 + \n+ csetemp79)*xformL13 + (csetemp80 + csetemp81 + csetemp82 + \n+ csetemp83)*xformL23 + (csetemp84 + csetemp85 + csetemp86 + \n+ csetemp87)*xformL33) + xformL21*((csetemp68 + csetemp69 + csetemp70 + \n+ csetemp71)*xformL03 + (csetemp80 + csetemp81 + csetemp82 + \n+ csetemp83)*xformL13 + (csetemp88 + csetemp89 + csetemp90 + \n+ csetemp91)*xformL23 + (csetemp92 + csetemp93 + csetemp94 + \n+ csetemp95)*xformL33) + xformL31*((csetemp72 + csetemp73 + csetemp74 + \n+ csetemp75)*xformL03 + (csetemp84 + csetemp85 + csetemp86 + \n+ csetemp87)*xformL13 + (csetemp92 + csetemp93 + csetemp94 + \n+ csetemp95)*xformL23 + (csetemp96 + csetemp97 + csetemp98 + \n+ csetemp99)*xformL33);\n+ \n+ CCTK_REAL dg4131 CCTK_ATTRIBUTE_UNUSED = xformL01*((csetemp100 + \n+ csetemp101 + csetemp102 + csetemp103)*xformL03 + (csetemp104 + \n+ csetemp105 + csetemp106 + csetemp107)*xformL13 + (csetemp108 + \n+ csetemp109 + csetemp110 + csetemp111)*xformL23 + (csetemp112 + \n+ csetemp113 + csetemp114 + csetemp115)*xformL33) + xformL11*((csetemp104 \n+ + csetemp105 + csetemp106 + csetemp107)*xformL03 + (csetemp116 + \n+ csetemp117 + csetemp118 + csetemp119)*xformL13 + (csetemp120 + \n+ csetemp121 + csetemp122 + csetemp123)*xformL23 + (csetemp124 + \n+ csetemp125 + csetemp126 + csetemp127)*xformL33) + xformL21*((csetemp108 \n+ + csetemp109 + csetemp110 + csetemp111)*xformL03 + (csetemp120 + \n+ csetemp121 + csetemp122 + csetemp123)*xformL13 + (csetemp128 + \n+ csetemp129 + csetemp130 + csetemp131)*xformL23 + (csetemp132 + \n+ csetemp133 + csetemp134 + csetemp135)*xformL33) + xformL31*((csetemp112 \n+ + csetemp113 + csetemp114 + csetemp115)*xformL03 + (csetemp124 + \n+ csetemp125 + csetemp126 + csetemp127)*xformL13 + (csetemp132 + \n+ csetemp133 + csetemp134 + csetemp135)*xformL23 + (csetemp136 + \n+ csetemp137 + csetemp138 + csetemp139)*xformL33);\n+ \n+ CCTK_REAL dg4132 CCTK_ATTRIBUTE_UNUSED = xformL01*((csetemp140 + \n+ csetemp141 + csetemp142 + csetemp143)*xformL03 + (csetemp144 + \n+ csetemp145 + csetemp146 + csetemp147)*xformL13 + (csetemp148 + \n+ csetemp149 + csetemp150 + csetemp151)*xformL23 + (csetemp152 + \n+ csetemp153 + csetemp154 + csetemp155)*xformL33) + xformL11*((csetemp144 \n+ + csetemp145 + csetemp146 + csetemp147)*xformL03 + (csetemp156 + \n+ csetemp157 + csetemp158 + csetemp159)*xformL13 + (csetemp160 + \n+ csetemp161 + csetemp162 + csetemp163)*xformL23 + (csetemp164 + \n+ csetemp165 + csetemp166 + csetemp167)*xformL33) + xformL21*((csetemp148 \n+ + csetemp149 + csetemp150 + csetemp151)*xformL03 + (csetemp160 + \n+ csetemp161 + csetemp162 + csetemp163)*xformL13 + (csetemp168 + \n+ csetemp169 + csetemp170 + csetemp171)*xformL23 + (csetemp172 + \n+ csetemp173 + csetemp174 + csetemp175)*xformL33) + xformL31*((csetemp152 \n+ + csetemp153 + csetemp154 + csetemp155)*xformL03 + (csetemp164 + \n+ csetemp165 + csetemp166 + csetemp167)*xformL13 + (csetemp172 + \n+ csetemp173 + csetemp174 + csetemp175)*xformL23 + (csetemp176 + \n+ csetemp177 + csetemp178 + csetemp179)*xformL33);\n+ \n+ CCTK_REAL dg4133 CCTK_ATTRIBUTE_UNUSED = xformL01*((csetemp180 + \n+ csetemp181 + csetemp182 + csetemp183)*xformL03 + (csetemp184 + \n+ csetemp185 + csetemp186 + csetemp187)*xformL13 + (csetemp188 + \n+ csetemp189 + csetemp190 + csetemp191)*xformL23 + (csetemp192 + \n+ csetemp193 + csetemp194 + csetemp195)*xformL33) + xformL11*((csetemp184 \n+ + csetemp185 + csetemp186 + csetemp187)*xformL03 + (csetemp196 + \n+ csetemp197 + csetemp198 + csetemp199)*xformL13 + (csetemp200 + \n+ csetemp201 + csetemp202 + csetemp203)*xformL23 + (csetemp204 + \n+ csetemp205 + csetemp206 + csetemp207)*xformL33) + xformL21*((csetemp188 \n+ + csetemp189 + csetemp190 + csetemp191)*xformL03 + (csetemp200 + \n+ csetemp201 + csetemp202 + csetemp203)*xformL13 + (csetemp208 + \n+ csetemp209 + csetemp210 + csetemp211)*xformL23 + (csetemp212 + \n+ csetemp213 + csetemp214 + csetemp215)*xformL33) + xformL31*((csetemp192 \n+ + csetemp193 + csetemp194 + csetemp195)*xformL03 + (csetemp204 + \n+ csetemp205 + csetemp206 + csetemp207)*xformL13 + (csetemp212 + \n+ csetemp213 + csetemp214 + csetemp215)*xformL23 + (csetemp216 + \n+ csetemp217 + csetemp218 + csetemp219)*xformL33);\n+ \n+ CCTK_REAL dg4220 CCTK_ATTRIBUTE_UNUSED = xformL02*((csetemp60 + \n+ csetemp61 + csetemp62 + csetemp63)*xformL02 + (csetemp64 + csetemp65 + \n+ csetemp66 + csetemp67)*xformL12 + (csetemp68 + csetemp69 + csetemp70 + \n+ csetemp71)*xformL22 + (csetemp72 + csetemp73 + csetemp74 + \n+ csetemp75)*xformL32) + xformL12*((csetemp64 + csetemp65 + csetemp66 + \n+ csetemp67)*xformL02 + (csetemp76 + csetemp77 + csetemp78 + \n+ csetemp79)*xformL12 + (csetemp80 + csetemp81 + csetemp82 + \n+ csetemp83)*xformL22 + (csetemp84 + csetemp85 + csetemp86 + \n+ csetemp87)*xformL32) + xformL22*((csetemp68 + csetemp69 + csetemp70 + \n+ csetemp71)*xformL02 + (csetemp80 + csetemp81 + csetemp82 + \n+ csetemp83)*xformL12 + (csetemp88 + csetemp89 + csetemp90 + \n+ csetemp91)*xformL22 + (csetemp92 + csetemp93 + csetemp94 + \n+ csetemp95)*xformL32) + xformL32*((csetemp72 + csetemp73 + csetemp74 + \n+ csetemp75)*xformL02 + (csetemp84 + csetemp85 + csetemp86 + \n+ csetemp87)*xformL12 + (csetemp92 + csetemp93 + csetemp94 + \n+ csetemp95)*xformL22 + (csetemp96 + csetemp97 + csetemp98 + \n+ csetemp99)*xformL32);\n+ \n+ CCTK_REAL dg4221 CCTK_ATTRIBUTE_UNUSED = xformL02*((csetemp100 + \n+ csetemp101 + csetemp102 + csetemp103)*xformL02 + (csetemp104 + \n+ csetemp105 + csetemp106 + csetemp107)*xformL12 + (csetemp108 + \n+ csetemp109 + csetemp110 + csetemp111)*xformL22 + (csetemp112 + \n+ csetemp113 + csetemp114 + csetemp115)*xformL32) + xformL12*((csetemp104 \n+ + csetemp105 + csetemp106 + csetemp107)*xformL02 + (csetemp116 + \n+ csetemp117 + csetemp118 + csetemp119)*xformL12 + (csetemp120 + \n+ csetemp121 + csetemp122 + csetemp123)*xformL22 + (csetemp124 + \n+ csetemp125 + csetemp126 + csetemp127)*xformL32) + xformL22*((csetemp108 \n+ + csetemp109 + csetemp110 + csetemp111)*xformL02 + (csetemp120 + \n+ csetemp121 + csetemp122 + csetemp123)*xformL12 + (csetemp128 + \n+ csetemp129 + csetemp130 + csetemp131)*xformL22 + (csetemp132 + \n+ csetemp133 + csetemp134 + csetemp135)*xformL32) + xformL32*((csetemp112 \n+ + csetemp113 + csetemp114 + csetemp115)*xformL02 + (csetemp124 + \n+ csetemp125 + csetemp126 + csetemp127)*xformL12 + (csetemp132 + \n+ csetemp133 + csetemp134 + csetemp135)*xformL22 + (csetemp136 + \n+ csetemp137 + csetemp138 + csetemp139)*xformL32);\n+ \n+ CCTK_REAL dg4222 CCTK_ATTRIBUTE_UNUSED = xformL02*((csetemp140 + \n+ csetemp141 + csetemp142 + csetemp143)*xformL02 + (csetemp144 + \n+ csetemp145 + csetemp146 + csetemp147)*xformL12 + (csetemp148 + \n+ csetemp149 + csetemp150 + csetemp151)*xformL22 + (csetemp152 + \n+ csetemp153 + csetemp154 + csetemp155)*xformL32) + xformL12*((csetemp144 \n+ + csetemp145 + csetemp146 + csetemp147)*xformL02 + (csetemp156 + \n+ csetemp157 + csetemp158 + csetemp159)*xformL12 + (csetemp160 + \n+ csetemp161 + csetemp162 + csetemp163)*xformL22 + (csetemp164 + \n+ csetemp165 + csetemp166 + csetemp167)*xformL32) + xformL22*((csetemp148 \n+ + csetemp149 + csetemp150 + csetemp151)*xformL02 + (csetemp160 + \n+ csetemp161 + csetemp162 + csetemp163)*xformL12 + (csetemp168 + \n+ csetemp169 + csetemp170 + csetemp171)*xformL22 + (csetemp172 + \n+ csetemp173 + csetemp174 + csetemp175)*xformL32) + xformL32*((csetemp152 \n+ + csetemp153 + csetemp154 + csetemp155)*xformL02 + (csetemp164 + \n+ csetemp165 + csetemp166 + csetemp167)*xformL12 + (csetemp172 + \n+ csetemp173 + csetemp174 + csetemp175)*xformL22 + (csetemp176 + \n+ csetemp177 + csetemp178 + csetemp179)*xformL32);\n+ \n+ CCTK_REAL dg4223 CCTK_ATTRIBUTE_UNUSED = xformL02*((csetemp180 + \n+ csetemp181 + csetemp182 + csetemp183)*xformL02 + (csetemp184 + \n+ csetemp185 + csetemp186 + csetemp187)*xformL12 + (csetemp188 + \n+ csetemp189 + csetemp190 + csetemp191)*xformL22 + (csetemp192 + \n+ csetemp193 + csetemp194 + csetemp195)*xformL32) + xformL12*((csetemp184 \n+ + csetemp185 + csetemp186 + csetemp187)*xformL02 + (csetemp196 + \n+ csetemp197 + csetemp198 + csetemp199)*xformL12 + (csetemp200 + \n+ csetemp201 + csetemp202 + csetemp203)*xformL22 + (csetemp204 + \n+ csetemp205 + csetemp206 + csetemp207)*xformL32) + xformL22*((csetemp188 \n+ + csetemp189 + csetemp190 + csetemp191)*xformL02 + (csetemp200 + \n+ csetemp201 + csetemp202 + csetemp203)*xformL12 + (csetemp208 + \n+ csetemp209 + csetemp210 + csetemp211)*xformL22 + (csetemp212 + \n+ csetemp213 + csetemp214 + csetemp215)*xformL32) + xformL32*((csetemp192 \n+ + csetemp193 + csetemp194 + csetemp195)*xformL02 + (csetemp204 + \n+ csetemp205 + csetemp206 + csetemp207)*xformL12 + (csetemp212 + \n+ csetemp213 + csetemp214 + csetemp215)*xformL22 + (csetemp216 + \n+ csetemp217 + csetemp218 + csetemp219)*xformL32);\n+ \n+ CCTK_REAL dg4230 CCTK_ATTRIBUTE_UNUSED = xformL02*((csetemp60 + \n+ csetemp61 + csetemp62 + csetemp63)*xformL03 + (csetemp64 + csetemp65 + \n+ csetemp66 + csetemp67)*xformL13 + (csetemp68 + csetemp69 + csetemp70 + \n+ csetemp71)*xformL23 + (csetemp72 + csetemp73 + csetemp74 + \n+ csetemp75)*xformL33) + xformL12*((csetemp64 + csetemp65 + csetemp66 + \n+ csetemp67)*xformL03 + (csetemp76 + csetemp77 + csetemp78 + \n+ csetemp79)*xformL13 + (csetemp80 + csetemp81 + csetemp82 + \n+ csetemp83)*xformL23 + (csetemp84 + csetemp85 + csetemp86 + \n+ csetemp87)*xformL33) + xformL22*((csetemp68 + csetemp69 + csetemp70 + \n+ csetemp71)*xformL03 + (csetemp80 + csetemp81 + csetemp82 + \n+ csetemp83)*xformL13 + (csetemp88 + csetemp89 + csetemp90 + \n+ csetemp91)*xformL23 + (csetemp92 + csetemp93 + csetemp94 + \n+ csetemp95)*xformL33) + xformL32*((csetemp72 + csetemp73 + csetemp74 + \n+ csetemp75)*xformL03 + (csetemp84 + csetemp85 + csetemp86 + \n+ csetemp87)*xformL13 + (csetemp92 + csetemp93 + csetemp94 + \n+ csetemp95)*xformL23 + (csetemp96 + csetemp97 + csetemp98 + \n+ csetemp99)*xformL33);\n+ \n+ CCTK_REAL dg4231 CCTK_ATTRIBUTE_UNUSED = xformL02*((csetemp100 + \n+ csetemp101 + csetemp102 + csetemp103)*xformL03 + (csetemp104 + \n+ csetemp105 + csetemp106 + csetemp107)*xformL13 + (csetemp108 + \n+ csetemp109 + csetemp110 + csetemp111)*xformL23 + (csetemp112 + \n+ csetemp113 + csetemp114 + csetemp115)*xformL33) + xformL12*((csetemp104 \n+ + csetemp105 + csetemp106 + csetemp107)*xformL03 + (csetemp116 + \n+ csetemp117 + csetemp118 + csetemp119)*xformL13 + (csetemp120 + \n+ csetemp121 + csetemp122 + csetemp123)*xformL23 + (csetemp124 + \n+ csetemp125 + csetemp126 + csetemp127)*xformL33) + xformL22*((csetemp108 \n+ + csetemp109 + csetemp110 + csetemp111)*xformL03 + (csetemp120 + \n+ csetemp121 + csetemp122 + csetemp123)*xformL13 + (csetemp128 + \n+ csetemp129 + csetemp130 + csetemp131)*xformL23 + (csetemp132 + \n+ csetemp133 + csetemp134 + csetemp135)*xformL33) + xformL32*((csetemp112 \n+ + csetemp113 + csetemp114 + csetemp115)*xformL03 + (csetemp124 + \n+ csetemp125 + csetemp126 + csetemp127)*xformL13 + (csetemp132 + \n+ csetemp133 + csetemp134 + csetemp135)*xformL23 + (csetemp136 + \n+ csetemp137 + csetemp138 + csetemp139)*xformL33);\n+ \n+ CCTK_REAL dg4232 CCTK_ATTRIBUTE_UNUSED = xformL02*((csetemp140 + \n+ csetemp141 + csetemp142 + csetemp143)*xformL03 + (csetemp144 + \n+ csetemp145 + csetemp146 + csetemp147)*xformL13 + (csetemp148 + \n+ csetemp149 + csetemp150 + csetemp151)*xformL23 + (csetemp152 + \n+ csetemp153 + csetemp154 + csetemp155)*xformL33) + xformL12*((csetemp144 \n+ + csetemp145 + csetemp146 + csetemp147)*xformL03 + (csetemp156 + \n+ csetemp157 + csetemp158 + csetemp159)*xformL13 + (csetemp160 + \n+ csetemp161 + csetemp162 + csetemp163)*xformL23 + (csetemp164 + \n+ csetemp165 + csetemp166 + csetemp167)*xformL33) + xformL22*((csetemp148 \n+ + csetemp149 + csetemp150 + csetemp151)*xformL03 + (csetemp160 + \n+ csetemp161 + csetemp162 + csetemp163)*xformL13 + (csetemp168 + \n+ csetemp169 + csetemp170 + csetemp171)*xformL23 + (csetemp172 + \n+ csetemp173 + csetemp174 + csetemp175)*xformL33) + xformL32*((csetemp152 \n+ + csetemp153 + csetemp154 + csetemp155)*xformL03 + (csetemp164 + \n+ csetemp165 + csetemp166 + csetemp167)*xformL13 + (csetemp172 + \n+ csetemp173 + csetemp174 + csetemp175)*xformL23 + (csetemp176 + \n+ csetemp177 + csetemp178 + csetemp179)*xformL33);\n+ \n+ CCTK_REAL dg4233 CCTK_ATTRIBUTE_UNUSED = xformL02*((csetemp180 + \n+ csetemp181 + csetemp182 + csetemp183)*xformL03 + (csetemp184 + \n+ csetemp185 + csetemp186 + csetemp187)*xformL13 + (csetemp188 + \n+ csetemp189 + csetemp190 + csetemp191)*xformL23 + (csetemp192 + \n+ csetemp193 + csetemp194 + csetemp195)*xformL33) + xformL12*((csetemp184 \n+ + csetemp185 + csetemp186 + csetemp187)*xformL03 + (csetemp196 + \n+ csetemp197 + csetemp198 + csetemp199)*xformL13 + (csetemp200 + \n+ csetemp201 + csetemp202 + csetemp203)*xformL23 + (csetemp204 + \n+ csetemp205 + csetemp206 + csetemp207)*xformL33) + xformL22*((csetemp188 \n+ + csetemp189 + csetemp190 + csetemp191)*xformL03 + (csetemp200 + \n+ csetemp201 + csetemp202 + csetemp203)*xformL13 + (csetemp208 + \n+ csetemp209 + csetemp210 + csetemp211)*xformL23 + (csetemp212 + \n+ csetemp213 + csetemp214 + csetemp215)*xformL33) + xformL32*((csetemp192 \n+ + csetemp193 + csetemp194 + csetemp195)*xformL03 + (csetemp204 + \n+ csetemp205 + csetemp206 + csetemp207)*xformL13 + (csetemp212 + \n+ csetemp213 + csetemp214 + csetemp215)*xformL23 + (csetemp216 + \n+ csetemp217 + csetemp218 + csetemp219)*xformL33);\n+ \n+ CCTK_REAL dg4330 CCTK_ATTRIBUTE_UNUSED = xformL03*((csetemp60 + \n+ csetemp61 + csetemp62 + csetemp63)*xformL03 + (csetemp64 + csetemp65 + \n+ csetemp66 + csetemp67)*xformL13 + (csetemp68 + csetemp69 + csetemp70 + \n+ csetemp71)*xformL23 + (csetemp72 + csetemp73 + csetemp74 + \n+ csetemp75)*xformL33) + xformL13*((csetemp64 + csetemp65 + csetemp66 + \n+ csetemp67)*xformL03 + (csetemp76 + csetemp77 + csetemp78 + \n+ csetemp79)*xformL13 + (csetemp80 + csetemp81 + csetemp82 + \n+ csetemp83)*xformL23 + (csetemp84 + csetemp85 + csetemp86 + \n+ csetemp87)*xformL33) + xformL23*((csetemp68 + csetemp69 + csetemp70 + \n+ csetemp71)*xformL03 + (csetemp80 + csetemp81 + csetemp82 + \n+ csetemp83)*xformL13 + (csetemp88 + csetemp89 + csetemp90 + \n+ csetemp91)*xformL23 + (csetemp92 + csetemp93 + csetemp94 + \n+ csetemp95)*xformL33) + xformL33*((csetemp72 + csetemp73 + csetemp74 + \n+ csetemp75)*xformL03 + (csetemp84 + csetemp85 + csetemp86 + \n+ csetemp87)*xformL13 + (csetemp92 + csetemp93 + csetemp94 + \n+ csetemp95)*xformL23 + (csetemp96 + csetemp97 + csetemp98 + \n+ csetemp99)*xformL33);\n+ \n+ CCTK_REAL dg4331 CCTK_ATTRIBUTE_UNUSED = xformL03*((csetemp100 + \n+ csetemp101 + csetemp102 + csetemp103)*xformL03 + (csetemp104 + \n+ csetemp105 + csetemp106 + csetemp107)*xformL13 + (csetemp108 + \n+ csetemp109 + csetemp110 + csetemp111)*xformL23 + (csetemp112 + \n+ csetemp113 + csetemp114 + csetemp115)*xformL33) + xformL13*((csetemp104 \n+ + csetemp105 + csetemp106 + csetemp107)*xformL03 + (csetemp116 + \n+ csetemp117 + csetemp118 + csetemp119)*xformL13 + (csetemp120 + \n+ csetemp121 + csetemp122 + csetemp123)*xformL23 + (csetemp124 + \n+ csetemp125 + csetemp126 + csetemp127)*xformL33) + xformL23*((csetemp108 \n+ + csetemp109 + csetemp110 + csetemp111)*xformL03 + (csetemp120 + \n+ csetemp121 + csetemp122 + csetemp123)*xformL13 + (csetemp128 + \n+ csetemp129 + csetemp130 + csetemp131)*xformL23 + (csetemp132 + \n+ csetemp133 + csetemp134 + csetemp135)*xformL33) + xformL33*((csetemp112 \n+ + csetemp113 + csetemp114 + csetemp115)*xformL03 + (csetemp124 + \n+ csetemp125 + csetemp126 + csetemp127)*xformL13 + (csetemp132 + \n+ csetemp133 + csetemp134 + csetemp135)*xformL23 + (csetemp136 + \n+ csetemp137 + csetemp138 + csetemp139)*xformL33);\n+ \n+ CCTK_REAL dg4332 CCTK_ATTRIBUTE_UNUSED = xformL03*((csetemp140 + \n+ csetemp141 + csetemp142 + csetemp143)*xformL03 + (csetemp144 + \n+ csetemp145 + csetemp146 + csetemp147)*xformL13 + (csetemp148 + \n+ csetemp149 + csetemp150 + csetemp151)*xformL23 + (csetemp152 + \n+ csetemp153 + csetemp154 + csetemp155)*xformL33) + xformL13*((csetemp144 \n+ + csetemp145 + csetemp146 + csetemp147)*xformL03 + (csetemp156 + \n+ csetemp157 + csetemp158 + csetemp159)*xformL13 + (csetemp160 + \n+ csetemp161 + csetemp162 + csetemp163)*xformL23 + (csetemp164 + \n+ csetemp165 + csetemp166 + csetemp167)*xformL33) + xformL23*((csetemp148 \n+ + csetemp149 + csetemp150 + csetemp151)*xformL03 + (csetemp160 + \n+ csetemp161 + csetemp162 + csetemp163)*xformL13 + (csetemp168 + \n+ csetemp169 + csetemp170 + csetemp171)*xformL23 + (csetemp172 + \n+ csetemp173 + csetemp174 + csetemp175)*xformL33) + xformL33*((csetemp152 \n+ + csetemp153 + csetemp154 + csetemp155)*xformL03 + (csetemp164 + \n+ csetemp165 + csetemp166 + csetemp167)*xformL13 + (csetemp172 + \n+ csetemp173 + csetemp174 + csetemp175)*xformL23 + (csetemp176 + \n+ csetemp177 + csetemp178 + csetemp179)*xformL33);\n+ \n+ CCTK_REAL dg4333 CCTK_ATTRIBUTE_UNUSED = xformL03*((csetemp180 + \n+ csetemp181 + csetemp182 + csetemp183)*xformL03 + (csetemp184 + \n+ csetemp185 + csetemp186 + csetemp187)*xformL13 + (csetemp188 + \n+ csetemp189 + csetemp190 + csetemp191)*xformL23 + (csetemp192 + \n+ csetemp193 + csetemp194 + csetemp195)*xformL33) + xformL13*((csetemp184 \n+ + csetemp185 + csetemp186 + csetemp187)*xformL03 + (csetemp196 + \n+ csetemp197 + csetemp198 + csetemp199)*xformL13 + (csetemp200 + \n+ csetemp201 + csetemp202 + csetemp203)*xformL23 + (csetemp204 + \n+ csetemp205 + csetemp206 + csetemp207)*xformL33) + xformL23*((csetemp188 \n+ + csetemp189 + csetemp190 + csetemp191)*xformL03 + (csetemp200 + \n+ csetemp201 + csetemp202 + csetemp203)*xformL13 + (csetemp208 + \n+ csetemp209 + csetemp210 + csetemp211)*xformL23 + (csetemp212 + \n+ csetemp213 + csetemp214 + csetemp215)*xformL33) + xformL33*((csetemp192 \n+ + csetemp193 + csetemp194 + csetemp195)*xformL03 + (csetemp204 + \n+ csetemp205 + csetemp206 + csetemp207)*xformL13 + (csetemp212 + \n+ csetemp213 + csetemp214 + csetemp215)*xformL23 + (csetemp216 + \n+ csetemp217 + csetemp218 + csetemp219)*xformL33);\n+ \n+ CCTK_REAL betal1 CCTK_ATTRIBUTE_UNUSED = g401;\n+ \n+ CCTK_REAL betal2 CCTK_ATTRIBUTE_UNUSED = g402;\n+ \n+ CCTK_REAL betal3 CCTK_ATTRIBUTE_UNUSED = g403;\n+ \n+ CCTK_REAL gerr11L CCTK_ATTRIBUTE_UNUSED = gxxL - g411;\n+ \n+ CCTK_REAL gerr12L CCTK_ATTRIBUTE_UNUSED = gxyL - g412;\n+ \n+ CCTK_REAL gerr13L CCTK_ATTRIBUTE_UNUSED = gxzL - g413;\n+ \n+ CCTK_REAL gerr22L CCTK_ATTRIBUTE_UNUSED = gyyL - g422;\n+ \n+ CCTK_REAL gerr23L CCTK_ATTRIBUTE_UNUSED = gyzL - g423;\n+ \n+ CCTK_REAL gerr33L CCTK_ATTRIBUTE_UNUSED = gzzL - g433;\n+ \n+ CCTK_REAL csetemp220 CCTK_ATTRIBUTE_UNUSED = SQR(gxzL);\n+ \n+ CCTK_REAL csetemp221 CCTK_ATTRIBUTE_UNUSED = SQR(gyzL);\n+ \n+ CCTK_REAL csetemp222 CCTK_ATTRIBUTE_UNUSED = SQR(gxyL);\n+ \n+ CCTK_REAL detg CCTK_ATTRIBUTE_UNUSED = 2*gxyL*gxzL*gyzL + \n+ gyyL*(gxxL*gzzL - csetemp220) - gxxL*csetemp221 - gzzL*csetemp222;\n+ \n+ CCTK_REAL csetemp223 CCTK_ATTRIBUTE_UNUSED = INV(detg);\n+ \n+ CCTK_REAL gu11 CCTK_ATTRIBUTE_UNUSED = (gyyL*gzzL - \n+ csetemp221)*csetemp223;\n+ \n+ CCTK_REAL gu12 CCTK_ATTRIBUTE_UNUSED = (gxzL*gyzL - \n+ gxyL*gzzL)*csetemp223;\n+ \n+ CCTK_REAL gu13 CCTK_ATTRIBUTE_UNUSED = (-(gxzL*gyyL) + \n+ gxyL*gyzL)*csetemp223;\n+ \n+ CCTK_REAL gu22 CCTK_ATTRIBUTE_UNUSED = (gxxL*gzzL - \n+ csetemp220)*csetemp223;\n+ \n+ CCTK_REAL gu23 CCTK_ATTRIBUTE_UNUSED = (gxyL*gxzL - \n+ gxxL*gyzL)*csetemp223;\n+ \n+ CCTK_REAL gu33 CCTK_ATTRIBUTE_UNUSED = (gxxL*gyyL - \n+ csetemp222)*csetemp223;\n+ \n+ CCTK_REAL betaerr1L CCTK_ATTRIBUTE_UNUSED = betaxL - betal1*gu11 - \n+ betal2*gu12 - betal3*gu13;\n+ \n+ CCTK_REAL betaerr2L CCTK_ATTRIBUTE_UNUSED = betayL - betal1*gu12 - \n+ betal2*gu22 - betal3*gu23;\n+ \n+ CCTK_REAL betaerr3L CCTK_ATTRIBUTE_UNUSED = betazL - betal1*gu13 - \n+ betal2*gu23 - betal3*gu33;\n+ \n+ CCTK_REAL betasq CCTK_ATTRIBUTE_UNUSED = betaxL*betal1 + betayL*betal2 \n+ + betazL*betal3;\n+ \n+ CCTK_REAL alperrL CCTK_ATTRIBUTE_UNUSED = alpL - sqrt(betasq - g400);\n+ \n+ CCTK_REAL dtg11 CCTK_ATTRIBUTE_UNUSED = dg4110;\n+ \n+ CCTK_REAL dtg12 CCTK_ATTRIBUTE_UNUSED = dg4120;\n+ \n+ CCTK_REAL dtg13 CCTK_ATTRIBUTE_UNUSED = dg4130;\n+ \n+ CCTK_REAL dtg22 CCTK_ATTRIBUTE_UNUSED = dg4220;\n+ \n+ CCTK_REAL dtg23 CCTK_ATTRIBUTE_UNUSED = dg4230;\n+ \n+ CCTK_REAL dtg33 CCTK_ATTRIBUTE_UNUSED = dg4330;\n+ \n+ CCTK_REAL dg111 CCTK_ATTRIBUTE_UNUSED = dg4111;\n+ \n+ CCTK_REAL dg112 CCTK_ATTRIBUTE_UNUSED = dg4112;\n+ \n+ CCTK_REAL dg113 CCTK_ATTRIBUTE_UNUSED = dg4113;\n+ \n+ CCTK_REAL dg121 CCTK_ATTRIBUTE_UNUSED = dg4121;\n+ \n+ CCTK_REAL dg122 CCTK_ATTRIBUTE_UNUSED = dg4122;\n+ \n+ CCTK_REAL dg123 CCTK_ATTRIBUTE_UNUSED = dg4123;\n+ \n+ CCTK_REAL dg131 CCTK_ATTRIBUTE_UNUSED = dg4131;\n+ \n+ CCTK_REAL dg132 CCTK_ATTRIBUTE_UNUSED = dg4132;\n+ \n+ CCTK_REAL dg133 CCTK_ATTRIBUTE_UNUSED = dg4133;\n+ \n+ CCTK_REAL dg221 CCTK_ATTRIBUTE_UNUSED = dg4221;\n+ \n+ CCTK_REAL dg222 CCTK_ATTRIBUTE_UNUSED = dg4222;\n+ \n+ CCTK_REAL dg223 CCTK_ATTRIBUTE_UNUSED = dg4223;\n+ \n+ CCTK_REAL dg231 CCTK_ATTRIBUTE_UNUSED = dg4231;\n+ \n+ CCTK_REAL dg232 CCTK_ATTRIBUTE_UNUSED = dg4232;\n+ \n+ CCTK_REAL dg233 CCTK_ATTRIBUTE_UNUSED = dg4233;\n+ \n+ CCTK_REAL dg331 CCTK_ATTRIBUTE_UNUSED = dg4331;\n+ \n+ CCTK_REAL dg332 CCTK_ATTRIBUTE_UNUSED = dg4332;\n+ \n+ CCTK_REAL dg333 CCTK_ATTRIBUTE_UNUSED = dg4333;\n+ \n+ CCTK_REAL csetemp224 CCTK_ATTRIBUTE_UNUSED = dtg11*gu11;\n+ \n+ CCTK_REAL csetemp225 CCTK_ATTRIBUTE_UNUSED = dtg12*gu12;\n+ \n+ CCTK_REAL csetemp226 CCTK_ATTRIBUTE_UNUSED = dtg13*gu13;\n+ \n+ CCTK_REAL csetemp227 CCTK_ATTRIBUTE_UNUSED = dtg12*gu11;\n+ \n+ CCTK_REAL csetemp228 CCTK_ATTRIBUTE_UNUSED = dtg22*gu12;\n+ \n+ CCTK_REAL csetemp229 CCTK_ATTRIBUTE_UNUSED = dtg23*gu13;\n+ \n+ CCTK_REAL csetemp230 CCTK_ATTRIBUTE_UNUSED = dtg13*gu11;\n+ \n+ CCTK_REAL csetemp231 CCTK_ATTRIBUTE_UNUSED = dtg23*gu12;\n+ \n+ CCTK_REAL csetemp232 CCTK_ATTRIBUTE_UNUSED = dtg33*gu13;\n+ \n+ CCTK_REAL dtgu11 CCTK_ATTRIBUTE_UNUSED = -((csetemp224 + csetemp225 + \n+ csetemp226)*gu11) - (csetemp227 + csetemp228 + csetemp229)*gu12 - \n+ (csetemp230 + csetemp231 + csetemp232)*gu13;\n+ \n+ CCTK_REAL dtgu12 CCTK_ATTRIBUTE_UNUSED = -((csetemp224 + csetemp225 + \n+ csetemp226)*gu12) - (csetemp227 + csetemp228 + csetemp229)*gu22 - \n+ (csetemp230 + csetemp231 + csetemp232)*gu23;\n+ \n+ CCTK_REAL dtgu13 CCTK_ATTRIBUTE_UNUSED = -((csetemp224 + csetemp225 + \n+ csetemp226)*gu13) - (csetemp227 + csetemp228 + csetemp229)*gu23 - \n+ (csetemp230 + csetemp231 + csetemp232)*gu33;\n+ \n+ CCTK_REAL csetemp233 CCTK_ATTRIBUTE_UNUSED = dtg11*gu12;\n+ \n+ CCTK_REAL csetemp234 CCTK_ATTRIBUTE_UNUSED = dtg12*gu22;\n+ \n+ CCTK_REAL csetemp235 CCTK_ATTRIBUTE_UNUSED = dtg13*gu23;\n+ \n+ CCTK_REAL csetemp236 CCTK_ATTRIBUTE_UNUSED = dtg22*gu22;\n+ \n+ CCTK_REAL csetemp237 CCTK_ATTRIBUTE_UNUSED = dtg23*gu23;\n+ \n+ CCTK_REAL csetemp238 CCTK_ATTRIBUTE_UNUSED = dtg13*gu12;\n+ \n+ CCTK_REAL csetemp239 CCTK_ATTRIBUTE_UNUSED = dtg23*gu22;\n+ \n+ CCTK_REAL csetemp240 CCTK_ATTRIBUTE_UNUSED = dtg33*gu23;\n+ \n+ CCTK_REAL dtgu22 CCTK_ATTRIBUTE_UNUSED = -((csetemp233 + csetemp234 + \n+ csetemp235)*gu12) - (csetemp225 + csetemp236 + csetemp237)*gu22 - \n+ (csetemp238 + csetemp239 + csetemp240)*gu23;\n+ \n+ CCTK_REAL dtgu23 CCTK_ATTRIBUTE_UNUSED = -((csetemp233 + csetemp234 + \n+ csetemp235)*gu13) - (csetemp225 + csetemp236 + csetemp237)*gu23 - \n+ (csetemp238 + csetemp239 + csetemp240)*gu33;\n+ \n+ CCTK_REAL dtgu33 CCTK_ATTRIBUTE_UNUSED = -(gu13*(dtg11*gu13 + \n+ dtg12*gu23 + dtg13*gu33)) - gu23*(dtg12*gu13 + dtg22*gu23 + dtg23*gu33) \n+ - gu33*(csetemp226 + csetemp237 + dtg33*gu33);\n+ \n+ CCTK_REAL csetemp241 CCTK_ATTRIBUTE_UNUSED = dg111*gu11;\n+ \n+ CCTK_REAL csetemp242 CCTK_ATTRIBUTE_UNUSED = dg121*gu12;\n+ \n+ CCTK_REAL csetemp243 CCTK_ATTRIBUTE_UNUSED = dg131*gu13;\n+ \n+ CCTK_REAL csetemp244 CCTK_ATTRIBUTE_UNUSED = dg121*gu11;\n+ \n+ CCTK_REAL csetemp245 CCTK_ATTRIBUTE_UNUSED = dg221*gu12;\n+ \n+ CCTK_REAL csetemp246 CCTK_ATTRIBUTE_UNUSED = dg231*gu13;\n+ \n+ CCTK_REAL csetemp247 CCTK_ATTRIBUTE_UNUSED = dg131*gu11;\n+ \n+ CCTK_REAL csetemp248 CCTK_ATTRIBUTE_UNUSED = dg231*gu12;\n+ \n+ CCTK_REAL csetemp249 CCTK_ATTRIBUTE_UNUSED = dg331*gu13;\n+ \n+ CCTK_REAL dgu111 CCTK_ATTRIBUTE_UNUSED = -((csetemp241 + csetemp242 + \n+ csetemp243)*gu11) - (csetemp244 + csetemp245 + csetemp246)*gu12 - \n+ (csetemp247 + csetemp248 + csetemp249)*gu13;\n+ \n+ CCTK_REAL dgu121 CCTK_ATTRIBUTE_UNUSED = -((csetemp241 + csetemp242 + \n+ csetemp243)*gu12) - (csetemp244 + csetemp245 + csetemp246)*gu22 - \n+ (csetemp247 + csetemp248 + csetemp249)*gu23;\n+ \n+ CCTK_REAL dgu131 CCTK_ATTRIBUTE_UNUSED = -((csetemp241 + csetemp242 + \n+ csetemp243)*gu13) - (csetemp244 + csetemp245 + csetemp246)*gu23 - \n+ (csetemp247 + csetemp248 + csetemp249)*gu33;\n+ \n+ CCTK_REAL csetemp250 CCTK_ATTRIBUTE_UNUSED = dg111*gu12;\n+ \n+ CCTK_REAL csetemp251 CCTK_ATTRIBUTE_UNUSED = dg121*gu22;\n+ \n+ CCTK_REAL csetemp252 CCTK_ATTRIBUTE_UNUSED = dg131*gu23;\n+ \n+ CCTK_REAL csetemp253 CCTK_ATTRIBUTE_UNUSED = dg221*gu22;\n+ \n+ CCTK_REAL csetemp254 CCTK_ATTRIBUTE_UNUSED = dg231*gu23;\n+ \n+ CCTK_REAL csetemp255 CCTK_ATTRIBUTE_UNUSED = dg131*gu12;\n+ \n+ CCTK_REAL csetemp256 CCTK_ATTRIBUTE_UNUSED = dg231*gu22;\n+ \n+ CCTK_REAL csetemp257 CCTK_ATTRIBUTE_UNUSED = dg331*gu23;\n+ \n+ CCTK_REAL dgu221 CCTK_ATTRIBUTE_UNUSED = -((csetemp250 + csetemp251 + \n+ csetemp252)*gu12) - (csetemp242 + csetemp253 + csetemp254)*gu22 - \n+ (csetemp255 + csetemp256 + csetemp257)*gu23;\n+ \n+ CCTK_REAL dgu231 CCTK_ATTRIBUTE_UNUSED = -((csetemp250 + csetemp251 + \n+ csetemp252)*gu13) - (csetemp242 + csetemp253 + csetemp254)*gu23 - \n+ (csetemp255 + csetemp256 + csetemp257)*gu33;\n+ \n+ CCTK_REAL dgu331 CCTK_ATTRIBUTE_UNUSED = -(gu13*(dg111*gu13 + \n+ dg121*gu23 + dg131*gu33)) - gu23*(dg121*gu13 + dg221*gu23 + dg231*gu33) \n+ - gu33*(csetemp243 + csetemp254 + dg331*gu33);\n+ \n+ CCTK_REAL csetemp258 CCTK_ATTRIBUTE_UNUSED = dg112*gu11;\n+ \n+ CCTK_REAL csetemp259 CCTK_ATTRIBUTE_UNUSED = dg122*gu12;\n+ \n+ CCTK_REAL csetemp260 CCTK_ATTRIBUTE_UNUSED = dg132*gu13;\n+ \n+ CCTK_REAL csetemp261 CCTK_ATTRIBUTE_UNUSED = dg122*gu11;\n+ \n+ CCTK_REAL csetemp262 CCTK_ATTRIBUTE_UNUSED = dg222*gu12;\n+ \n+ CCTK_REAL csetemp263 CCTK_ATTRIBUTE_UNUSED = dg232*gu13;\n+ \n+ CCTK_REAL csetemp264 CCTK_ATTRIBUTE_UNUSED = dg132*gu11;\n+ \n+ CCTK_REAL csetemp265 CCTK_ATTRIBUTE_UNUSED = dg232*gu12;\n+ \n+ CCTK_REAL csetemp266 CCTK_ATTRIBUTE_UNUSED = dg332*gu13;\n+ \n+ CCTK_REAL dgu112 CCTK_ATTRIBUTE_UNUSED = -((csetemp258 + csetemp259 + \n+ csetemp260)*gu11) - (csetemp261 + csetemp262 + csetemp263)*gu12 - \n+ (csetemp264 + csetemp265 + csetemp266)*gu13;\n+ \n+ CCTK_REAL dgu122 CCTK_ATTRIBUTE_UNUSED = -((csetemp258 + csetemp259 + \n+ csetemp260)*gu12) - (csetemp261 + csetemp262 + csetemp263)*gu22 - \n+ (csetemp264 + csetemp265 + csetemp266)*gu23;\n+ \n+ CCTK_REAL dgu132 CCTK_ATTRIBUTE_UNUSED = -((csetemp258 + csetemp259 + \n+ csetemp260)*gu13) - (csetemp261 + csetemp262 + csetemp263)*gu23 - \n+ (csetemp264 + csetemp265 + csetemp266)*gu33;\n+ \n+ CCTK_REAL csetemp267 CCTK_ATTRIBUTE_UNUSED = dg112*gu12;\n+ \n+ CCTK_REAL csetemp268 CCTK_ATTRIBUTE_UNUSED = dg122*gu22;\n+ \n+ CCTK_REAL csetemp269 CCTK_ATTRIBUTE_UNUSED = dg132*gu23;\n+ \n+ CCTK_REAL csetemp270 CCTK_ATTRIBUTE_UNUSED = dg222*gu22;\n+ \n+ CCTK_REAL csetemp271 CCTK_ATTRIBUTE_UNUSED = dg232*gu23;\n+ \n+ CCTK_REAL csetemp272 CCTK_ATTRIBUTE_UNUSED = dg132*gu12;\n+ \n+ CCTK_REAL csetemp273 CCTK_ATTRIBUTE_UNUSED = dg232*gu22;\n+ \n+ CCTK_REAL csetemp274 CCTK_ATTRIBUTE_UNUSED = dg332*gu23;\n+ \n+ CCTK_REAL dgu222 CCTK_ATTRIBUTE_UNUSED = -((csetemp267 + csetemp268 + \n+ csetemp269)*gu12) - (csetemp259 + csetemp270 + csetemp271)*gu22 - \n+ (csetemp272 + csetemp273 + csetemp274)*gu23;\n+ \n+ CCTK_REAL dgu232 CCTK_ATTRIBUTE_UNUSED = -((csetemp267 + csetemp268 + \n+ csetemp269)*gu13) - (csetemp259 + csetemp270 + csetemp271)*gu23 - \n+ (csetemp272 + csetemp273 + csetemp274)*gu33;\n+ \n+ CCTK_REAL dgu332 CCTK_ATTRIBUTE_UNUSED = -(gu13*(dg112*gu13 + \n+ dg122*gu23 + dg132*gu33)) - gu23*(dg122*gu13 + dg222*gu23 + dg232*gu33) \n+ - gu33*(csetemp260 + csetemp271 + dg332*gu33);\n+ \n+ CCTK_REAL csetemp275 CCTK_ATTRIBUTE_UNUSED = dg113*gu11;\n+ \n+ CCTK_REAL csetemp276 CCTK_ATTRIBUTE_UNUSED = dg123*gu12;\n+ \n+ CCTK_REAL csetemp277 CCTK_ATTRIBUTE_UNUSED = dg133*gu13;\n+ \n+ CCTK_REAL csetemp278 CCTK_ATTRIBUTE_UNUSED = dg123*gu11;\n+ \n+ CCTK_REAL csetemp279 CCTK_ATTRIBUTE_UNUSED = dg223*gu12;\n+ \n+ CCTK_REAL csetemp280 CCTK_ATTRIBUTE_UNUSED = dg233*gu13;\n+ \n+ CCTK_REAL csetemp281 CCTK_ATTRIBUTE_UNUSED = dg133*gu11;\n+ \n+ CCTK_REAL csetemp282 CCTK_ATTRIBUTE_UNUSED = dg233*gu12;\n+ \n+ CCTK_REAL csetemp283 CCTK_ATTRIBUTE_UNUSED = dg333*gu13;\n+ \n+ CCTK_REAL dgu113 CCTK_ATTRIBUTE_UNUSED = -((csetemp275 + csetemp276 + \n+ csetemp277)*gu11) - (csetemp278 + csetemp279 + csetemp280)*gu12 - \n+ (csetemp281 + csetemp282 + csetemp283)*gu13;\n+ \n+ CCTK_REAL dgu123 CCTK_ATTRIBUTE_UNUSED = -((csetemp275 + csetemp276 + \n+ csetemp277)*gu12) - (csetemp278 + csetemp279 + csetemp280)*gu22 - \n+ (csetemp281 + csetemp282 + csetemp283)*gu23;\n+ \n+ CCTK_REAL dgu133 CCTK_ATTRIBUTE_UNUSED = -((csetemp275 + csetemp276 + \n+ csetemp277)*gu13) - (csetemp278 + csetemp279 + csetemp280)*gu23 - \n+ (csetemp281 + csetemp282 + csetemp283)*gu33;\n+ \n+ CCTK_REAL csetemp284 CCTK_ATTRIBUTE_UNUSED = dg113*gu12;\n+ \n+ CCTK_REAL csetemp285 CCTK_ATTRIBUTE_UNUSED = dg123*gu22;\n+ \n+ CCTK_REAL csetemp286 CCTK_ATTRIBUTE_UNUSED = dg133*gu23;\n+ \n+ CCTK_REAL csetemp287 CCTK_ATTRIBUTE_UNUSED = dg223*gu22;\n+ \n+ CCTK_REAL csetemp288 CCTK_ATTRIBUTE_UNUSED = dg233*gu23;\n+ \n+ CCTK_REAL csetemp289 CCTK_ATTRIBUTE_UNUSED = dg133*gu12;\n+ \n+ CCTK_REAL csetemp290 CCTK_ATTRIBUTE_UNUSED = dg233*gu22;\n+ \n+ CCTK_REAL csetemp291 CCTK_ATTRIBUTE_UNUSED = dg333*gu23;\n+ \n+ CCTK_REAL dgu223 CCTK_ATTRIBUTE_UNUSED = -((csetemp284 + csetemp285 + \n+ csetemp286)*gu12) - (csetemp276 + csetemp287 + csetemp288)*gu22 - \n+ (csetemp289 + csetemp290 + csetemp291)*gu23;\n+ \n+ CCTK_REAL dgu233 CCTK_ATTRIBUTE_UNUSED = -((csetemp284 + csetemp285 + \n+ csetemp286)*gu13) - (csetemp276 + csetemp287 + csetemp288)*gu23 - \n+ (csetemp289 + csetemp290 + csetemp291)*gu33;\n+ \n+ CCTK_REAL dgu333 CCTK_ATTRIBUTE_UNUSED = -(gu13*(dg113*gu13 + \n+ dg123*gu23 + dg133*gu33)) - gu23*(dg123*gu13 + dg223*gu23 + dg233*gu33) \n+ - gu33*(csetemp277 + csetemp288 + dg333*gu33);\n+ \n+ CCTK_REAL dtbetal1 CCTK_ATTRIBUTE_UNUSED = dg4010;\n+ \n+ CCTK_REAL dtbetal2 CCTK_ATTRIBUTE_UNUSED = dg4020;\n+ \n+ CCTK_REAL dtbetal3 CCTK_ATTRIBUTE_UNUSED = dg4030;\n+ \n+ CCTK_REAL dbetal11 CCTK_ATTRIBUTE_UNUSED = dg4011;\n+ \n+ CCTK_REAL dbetal12 CCTK_ATTRIBUTE_UNUSED = dg4012;\n+ \n+ CCTK_REAL dbetal13 CCTK_ATTRIBUTE_UNUSED = dg4013;\n+ \n+ CCTK_REAL dbetal21 CCTK_ATTRIBUTE_UNUSED = dg4021;\n+ \n+ CCTK_REAL dbetal22 CCTK_ATTRIBUTE_UNUSED = dg4022;\n+ \n+ CCTK_REAL dbetal23 CCTK_ATTRIBUTE_UNUSED = dg4023;\n+ \n+ CCTK_REAL dbetal31 CCTK_ATTRIBUTE_UNUSED = dg4031;\n+ \n+ CCTK_REAL dbetal32 CCTK_ATTRIBUTE_UNUSED = dg4032;\n+ \n+ CCTK_REAL dbetal33 CCTK_ATTRIBUTE_UNUSED = dg4033;\n+ \n+ CCTK_REAL dtbetaerr1L CCTK_ATTRIBUTE_UNUSED = dtbetaxL - betal1*dtgu11 \n+ - betal2*dtgu12 - betal3*dtgu13 - dtbetal1*gu11 - dtbetal2*gu12 - \n+ dtbetal3*gu13;\n+ \n+ CCTK_REAL dtbetaerr2L CCTK_ATTRIBUTE_UNUSED = dtbetayL - betal1*dtgu12 \n+ - betal2*dtgu22 - betal3*dtgu23 - dtbetal1*gu12 - dtbetal2*gu22 - \n+ dtbetal3*gu23;\n+ \n+ CCTK_REAL dtbetaerr3L CCTK_ATTRIBUTE_UNUSED = dtbetazL - betal1*dtgu13 \n+ - betal2*dtgu23 - betal3*dtgu33 - dtbetal1*gu13 - dtbetal2*gu23 - \n+ dtbetal3*gu33;\n+ \n+ CCTK_REAL dbeta11 CCTK_ATTRIBUTE_UNUSED = betal1*dgu111 + \n+ betal2*dgu121 + betal3*dgu131 + dbetal11*gu11 + dbetal21*gu12 + \n+ dbetal31*gu13;\n+ \n+ CCTK_REAL dbeta21 CCTK_ATTRIBUTE_UNUSED = betal1*dgu121 + \n+ betal2*dgu221 + betal3*dgu231 + dbetal11*gu12 + dbetal21*gu22 + \n+ dbetal31*gu23;\n+ \n+ CCTK_REAL dbeta31 CCTK_ATTRIBUTE_UNUSED = betal1*dgu131 + \n+ betal2*dgu231 + betal3*dgu331 + dbetal11*gu13 + dbetal21*gu23 + \n+ dbetal31*gu33;\n+ \n+ CCTK_REAL dbeta12 CCTK_ATTRIBUTE_UNUSED = betal1*dgu112 + \n+ betal2*dgu122 + betal3*dgu132 + dbetal12*gu11 + dbetal22*gu12 + \n+ dbetal32*gu13;\n+ \n+ CCTK_REAL dbeta22 CCTK_ATTRIBUTE_UNUSED = betal1*dgu122 + \n+ betal2*dgu222 + betal3*dgu232 + dbetal12*gu12 + dbetal22*gu22 + \n+ dbetal32*gu23;\n+ \n+ CCTK_REAL dbeta32 CCTK_ATTRIBUTE_UNUSED = betal1*dgu132 + \n+ betal2*dgu232 + betal3*dgu332 + dbetal12*gu13 + dbetal22*gu23 + \n+ dbetal32*gu33;\n+ \n+ CCTK_REAL dbeta13 CCTK_ATTRIBUTE_UNUSED = betal1*dgu113 + \n+ betal2*dgu123 + betal3*dgu133 + dbetal13*gu11 + dbetal23*gu12 + \n+ dbetal33*gu13;\n+ \n+ CCTK_REAL dbeta23 CCTK_ATTRIBUTE_UNUSED = betal1*dgu123 + \n+ betal2*dgu223 + betal3*dgu233 + dbetal13*gu12 + dbetal23*gu22 + \n+ dbetal33*gu23;\n+ \n+ CCTK_REAL dbeta33 CCTK_ATTRIBUTE_UNUSED = betal1*dgu133 + \n+ betal2*dgu233 + betal3*dgu333 + dbetal13*gu13 + dbetal23*gu23 + \n+ dbetal33*gu33;\n+ \n+ CCTK_REAL dtbetasq CCTK_ATTRIBUTE_UNUSED = dtbetaxL*betal1 + \n+ dtbetayL*betal2 + dtbetazL*betal3 + betaxL*dtbetal1 + betayL*dtbetal2 + \n+ betazL*dtbetal3;\n+ \n+ CCTK_REAL csetemp292 CCTK_ATTRIBUTE_UNUSED = INV(alpL);\n+ \n+ CCTK_REAL dtalperrL CCTK_ATTRIBUTE_UNUSED = dtalpL + \n+ 0.5*csetemp292*(dg4000 - dtbetasq);\n+ \n+ CCTK_REAL kerr11L CCTK_ATTRIBUTE_UNUSED = kxxL - \n+ 0.5*csetemp292*(2*(gxxL*dbeta11 + gxyL*dbeta21 + gxzL*dbeta31) + \n+ betaxL*dg111 + betayL*dg112 + betazL*dg113 - dtg11);\n+ \n+ CCTK_REAL kerr12L CCTK_ATTRIBUTE_UNUSED = kxyL - \n+ 0.5*csetemp292*(gxxL*dbeta12 + gyyL*dbeta21 + gxyL*(dbeta11 + dbeta22) \n+ + gyzL*dbeta31 + gxzL*dbeta32 + betaxL*dg121 + betayL*dg122 + \n+ betazL*dg123 - dtg12);\n+ \n+ CCTK_REAL kerr13L CCTK_ATTRIBUTE_UNUSED = kxzL - \n+ 0.5*csetemp292*(gxxL*dbeta13 + gyzL*dbeta21 + gxyL*dbeta23 + \n+ gzzL*dbeta31 + gxzL*(dbeta11 + dbeta33) + betaxL*dg131 + betayL*dg132 + \n+ betazL*dg133 - dtg13);\n+ \n+ CCTK_REAL kerr22L CCTK_ATTRIBUTE_UNUSED = kyyL - \n+ 0.5*csetemp292*(2*(gxyL*dbeta12 + gyyL*dbeta22 + gyzL*dbeta32) + \n+ betaxL*dg221 + betayL*dg222 + betazL*dg223 - dtg22);\n+ \n+ CCTK_REAL kerr23L CCTK_ATTRIBUTE_UNUSED = kyzL - \n+ 0.5*csetemp292*(gxzL*dbeta12 + gxyL*dbeta13 + gyyL*dbeta23 + \n+ gzzL*dbeta32 + gyzL*(dbeta22 + dbeta33) + betaxL*dg231 + betayL*dg232 + \n+ betazL*dg233 - dtg23);\n+ \n+ CCTK_REAL kerr33L CCTK_ATTRIBUTE_UNUSED = kzzL - \n+ 0.5*csetemp292*(2*(gxzL*dbeta13 + gyzL*dbeta23 + gzzL*dbeta33) + \n+ betaxL*dg331 + betayL*dg332 + betazL*dg333 - dtg33);\n+ /* Copy local copies back to grid functions */\n+ alperr[index] = alperrL;\n+ betaerr1[index] = betaerr1L;\n+ betaerr2[index] = betaerr2L;\n+ betaerr3[index] = betaerr3L;\n+ dtalperr[index] = dtalperrL;\n+ dtbetaerr1[index] = dtbetaerr1L;\n+ dtbetaerr2[index] = dtbetaerr2L;\n+ dtbetaerr3[index] = dtbetaerr3L;\n+ gerr11[index] = gerr11L;\n+ gerr12[index] = gerr12L;\n+ gerr13[index] = gerr13L;\n+ gerr22[index] = gerr22L;\n+ gerr23[index] = gerr23L;\n+ gerr33[index] = gerr33L;\n+ kerr11[index] = kerr11L;\n+ kerr12[index] = kerr12L;\n+ kerr13[index] = kerr13L;\n+ kerr22[index] = kerr22L;\n+ kerr23[index] = kerr23L;\n+ kerr33[index] = kerr33L;\n+ }\n+ CCTK_ENDLOOP3(GaugeWave_error);\n+}\n+extern \"C\" void GaugeWave_error(CCTK_ARGUMENTS)\n+{\n+ DECLARE_CCTK_ARGUMENTS;\n+ DECLARE_CCTK_PARAMETERS;\n+ \n+ if (verbose > 1)\n+ {\n+ CCTK_VInfo(CCTK_THORNSTRING,\"Entering GaugeWave_error_Body\");\n+ }\n+ if (cctk_iteration % GaugeWave_error_calc_every != GaugeWave_error_calc_offset)\n+ {\n+ return;\n+ }\n+ \n+ const char* const groups[] = {\n+ \"admbase::curv\",\n+ \"admbase::dtlapse\",\n+ \"admbase::dtshift\",\n+ \"admbase::lapse\",\n+ \"admbase::metric\",\n+ \"admbase::shift\",\n+ \"GaugeWave::curv_error\",\n+ \"GaugeWave::dtlapse_error\",\n+ \"GaugeWave::dtshift_error\",\n+ \"grid::coordinates\",\n+ \"GaugeWave::lapse_error\",\n+ \"GaugeWave::metric_error\",\n+ \"GaugeWave::shift_error\"};\n+ AssertGroupStorage(cctkGH, \"GaugeWave_error\", 13, groups);\n+ \n+ \n+ LoopOverEverything(cctkGH, GaugeWave_error_Body);\n+ if (verbose > 1)\n+ {\n+ CCTK_VInfo(CCTK_THORNSTRING,\"Leaving GaugeWave_error_Body\");\n+ }\n+}\n+\n+} // namespace GaugeWave"}, "test": {"test_patch": "diff --git a/all_tests.txt b/all_tests.txt\nnew file mode 100644\nindex 0000000..0000000\n--- /dev/null\n+++ b/all_tests.txt\n@@ -0,0 +1,7 @@\n+GaugeWave\n+KS-tilted-EE\n+KerrSchild\n+Minkowski\n+ModifiedSchwarzschildBL\n+ShiftedGaugeWave\n+Vaidya2", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}20{"question_id": "MSB_einsteintoolkit_Cactus_pr27", "question_type": "multi_swe_bench", "description": "Add missing KerrSchild_error.cc in EinsteinExact/KerrSchild (einsteintoolkit/Cactus#27)", "content": {"org": "einsteintoolkit", "repo": "Cactus", "pr_number": 27, "issue_title": "Add missing KerrSchild_error.cc in EinsteinExact/KerrSchild", "issue_body": "This PR adds the missing source file KerrSchild_error.cc to complete the EinsteinExact/KerrSchild thorn implementation.", "base_commit": "HEAD", "resolved_issues": [{"number": 27, "title": "Implement the full functionality of KerrSchild", "body": "Please implement the full functionality of `KerrSchild` by finishing the code in `KerrSchild_error.cc`.\n\n## Thorn Information:\n- Name: KerrSchild\n- Target file: KerrSchild_error.cc\n\n## Interface Definition in interface.ccl:\n\n## Schedule Definition in schedule.ccl:\n\n## Parameters Definition in param.ccl:\n\n## Configuration Definition in configuration.ccl:\n\n## Documentation Context in readme.md and doc/documentation.tex\n\n## Related Code Context in src folder\n\n"}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/einsteintoolkit_m_cactus:pr-27", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/arrangements/EinsteinExact/KerrSchild/src/KerrSchild_error.cc b/arrangements/EinsteinExact/KerrSchild/src/KerrSchild_error.cc\nnew file mode 100644\nindex 0000000..0000000\n--- /dev/null\n+++ b/arrangements/EinsteinExact/KerrSchild/src/KerrSchild_error.cc\n@@ -0,0 +1,2379 @@\n+/* File produced by Kranc */\n+\n+#define KRANC_C\n+\n+#include <algorithm>\n+#include <assert.h>\n+#include <math.h>\n+#include <stdio.h>\n+#include <stdlib.h>\n+#include <string.h>\n+#include \"cctk.h\"\n+#include \"cctk_Arguments.h\"\n+#include \"cctk_Parameters.h\"\n+#include \"Kranc.hh\"\n+#include \"Differencing.h\"\n+#include \"loopcontrol.h\"\n+\n+/* Define macros used in calculations */\n+#define INITVALUE (42)\n+#define INV(x) ((CCTK_REAL)1.0 / (x))\n+#define SQR(x) ((x) * (x))\n+#define CUB(x) ((x) * SQR(x))\n+#define QAD(x) (SQR(SQR(x)))\n+\n+namespace KerrSchild {\n+\n+\n+static void KerrSchild_error_Body(const cGH* restrict const cctkGH, const int dir, const int face, const CCTK_REAL normal[3], const CCTK_REAL tangentA[3], const CCTK_REAL tangentB[3], const int imin[3], const int imax[3], const int n_subblock_gfs, CCTK_REAL* restrict const subblock_gfs[])\n+{\n+ DECLARE_CCTK_ARGUMENTS;\n+ DECLARE_CCTK_PARAMETERS;\n+ \n+ /* Include user-supplied include files */\n+ /* Initialise finite differencing variables */\n+ const ptrdiff_t di CCTK_ATTRIBUTE_UNUSED = 1;\n+ const ptrdiff_t dj CCTK_ATTRIBUTE_UNUSED = CCTK_GFINDEX3D(cctkGH,0,1,0) - CCTK_GFINDEX3D(cctkGH,0,0,0);\n+ const ptrdiff_t dk CCTK_ATTRIBUTE_UNUSED = CCTK_GFINDEX3D(cctkGH,0,0,1) - CCTK_GFINDEX3D(cctkGH,0,0,0);\n+ const ptrdiff_t cdi CCTK_ATTRIBUTE_UNUSED = sizeof(CCTK_REAL) * di;\n+ const ptrdiff_t cdj CCTK_ATTRIBUTE_UNUSED = sizeof(CCTK_REAL) * dj;\n+ const ptrdiff_t cdk CCTK_ATTRIBUTE_UNUSED = sizeof(CCTK_REAL) * dk;\n+ const ptrdiff_t cctkLbnd1 CCTK_ATTRIBUTE_UNUSED = cctk_lbnd[0];\n+ const ptrdiff_t cctkLbnd2 CCTK_ATTRIBUTE_UNUSED = cctk_lbnd[1];\n+ const ptrdiff_t cctkLbnd3 CCTK_ATTRIBUTE_UNUSED = cctk_lbnd[2];\n+ const CCTK_REAL t CCTK_ATTRIBUTE_UNUSED = ToReal(cctk_time);\n+ const CCTK_REAL cctkOriginSpace1 CCTK_ATTRIBUTE_UNUSED = ToReal(CCTK_ORIGIN_SPACE(0));\n+ const CCTK_REAL cctkOriginSpace2 CCTK_ATTRIBUTE_UNUSED = ToReal(CCTK_ORIGIN_SPACE(1));\n+ const CCTK_REAL cctkOriginSpace3 CCTK_ATTRIBUTE_UNUSED = ToReal(CCTK_ORIGIN_SPACE(2));\n+ const CCTK_REAL dt CCTK_ATTRIBUTE_UNUSED = ToReal(CCTK_DELTA_TIME);\n+ const CCTK_REAL dx CCTK_ATTRIBUTE_UNUSED = ToReal(CCTK_DELTA_SPACE(0));\n+ const CCTK_REAL dy CCTK_ATTRIBUTE_UNUSED = ToReal(CCTK_DELTA_SPACE(1));\n+ const CCTK_REAL dz CCTK_ATTRIBUTE_UNUSED = ToReal(CCTK_DELTA_SPACE(2));\n+ const CCTK_REAL dxi CCTK_ATTRIBUTE_UNUSED = INV(dx);\n+ const CCTK_REAL dyi CCTK_ATTRIBUTE_UNUSED = INV(dy);\n+ const CCTK_REAL dzi CCTK_ATTRIBUTE_UNUSED = INV(dz);\n+ const CCTK_REAL khalf CCTK_ATTRIBUTE_UNUSED = 0.5;\n+ const CCTK_REAL kthird CCTK_ATTRIBUTE_UNUSED = \n+ 0.333333333333333333333333333333;\n+ const CCTK_REAL ktwothird CCTK_ATTRIBUTE_UNUSED = \n+ 0.666666666666666666666666666667;\n+ const CCTK_REAL kfourthird CCTK_ATTRIBUTE_UNUSED = \n+ 1.33333333333333333333333333333;\n+ const CCTK_REAL hdxi CCTK_ATTRIBUTE_UNUSED = 0.5*dxi;\n+ const CCTK_REAL hdyi CCTK_ATTRIBUTE_UNUSED = 0.5*dyi;\n+ const CCTK_REAL hdzi CCTK_ATTRIBUTE_UNUSED = 0.5*dzi;\n+ /* Initialize predefined quantities */\n+ /* Assign local copies of arrays functions */\n+ \n+ \n+ /* Calculate temporaries and arrays functions */\n+ /* Copy local copies back to grid functions */\n+ /* Loop over the grid points */\n+ const int imin0=imin[0];\n+ const int imin1=imin[1];\n+ const int imin2=imin[2];\n+ const int imax0=imax[0];\n+ const int imax1=imax[1];\n+ const int imax2=imax[2];\n+ #pragma omp parallel\n+ CCTK_LOOP3(KerrSchild_error,\n+ i,j,k, imin0,imin1,imin2, imax0,imax1,imax2,\n+ cctk_ash[0],cctk_ash[1],cctk_ash[2])\n+ {\n+ const ptrdiff_t index CCTK_ATTRIBUTE_UNUSED = di*i + dj*j + dk*k;\n+ /* Assign local copies of grid functions */\n+ \n+ CCTK_REAL alpL CCTK_ATTRIBUTE_UNUSED = alp[index];\n+ CCTK_REAL betaxL CCTK_ATTRIBUTE_UNUSED = betax[index];\n+ CCTK_REAL betayL CCTK_ATTRIBUTE_UNUSED = betay[index];\n+ CCTK_REAL betazL CCTK_ATTRIBUTE_UNUSED = betaz[index];\n+ CCTK_REAL dtalpL CCTK_ATTRIBUTE_UNUSED = dtalp[index];\n+ CCTK_REAL dtbetaxL CCTK_ATTRIBUTE_UNUSED = dtbetax[index];\n+ CCTK_REAL dtbetayL CCTK_ATTRIBUTE_UNUSED = dtbetay[index];\n+ CCTK_REAL dtbetazL CCTK_ATTRIBUTE_UNUSED = dtbetaz[index];\n+ CCTK_REAL gxxL CCTK_ATTRIBUTE_UNUSED = gxx[index];\n+ CCTK_REAL gxyL CCTK_ATTRIBUTE_UNUSED = gxy[index];\n+ CCTK_REAL gxzL CCTK_ATTRIBUTE_UNUSED = gxz[index];\n+ CCTK_REAL gyyL CCTK_ATTRIBUTE_UNUSED = gyy[index];\n+ CCTK_REAL gyzL CCTK_ATTRIBUTE_UNUSED = gyz[index];\n+ CCTK_REAL gzzL CCTK_ATTRIBUTE_UNUSED = gzz[index];\n+ CCTK_REAL kxxL CCTK_ATTRIBUTE_UNUSED = kxx[index];\n+ CCTK_REAL kxyL CCTK_ATTRIBUTE_UNUSED = kxy[index];\n+ CCTK_REAL kxzL CCTK_ATTRIBUTE_UNUSED = kxz[index];\n+ CCTK_REAL kyyL CCTK_ATTRIBUTE_UNUSED = kyy[index];\n+ CCTK_REAL kyzL CCTK_ATTRIBUTE_UNUSED = kyz[index];\n+ CCTK_REAL kzzL CCTK_ATTRIBUTE_UNUSED = kzz[index];\n+ CCTK_REAL xL CCTK_ATTRIBUTE_UNUSED = x[index];\n+ CCTK_REAL yL CCTK_ATTRIBUTE_UNUSED = y[index];\n+ CCTK_REAL zL CCTK_ATTRIBUTE_UNUSED = z[index];\n+ \n+ /* Include user supplied include files */\n+ /* Precompute derivatives */\n+ /* Calculate temporaries and grid functions */\n+ CCTK_REAL xform1L00 CCTK_ATTRIBUTE_UNUSED = 1;\n+ \n+ CCTK_REAL xform1L01 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL xform1L02 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL xform1L03 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL xform1L10 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL csetemp0 CCTK_ATTRIBUTE_UNUSED = cos(ToReal(phi));\n+ \n+ CCTK_REAL csetemp1 CCTK_ATTRIBUTE_UNUSED = cos(ToReal(psi));\n+ \n+ CCTK_REAL csetemp2 CCTK_ATTRIBUTE_UNUSED = cos(ToReal(theta));\n+ \n+ CCTK_REAL csetemp3 CCTK_ATTRIBUTE_UNUSED = sin(ToReal(phi));\n+ \n+ CCTK_REAL csetemp4 CCTK_ATTRIBUTE_UNUSED = sin(ToReal(psi));\n+ \n+ CCTK_REAL xform1L11 CCTK_ATTRIBUTE_UNUSED = csetemp0*csetemp1 - \n+ csetemp2*csetemp3*csetemp4;\n+ \n+ CCTK_REAL xform1L12 CCTK_ATTRIBUTE_UNUSED = csetemp1*csetemp3 + \n+ csetemp0*csetemp2*csetemp4;\n+ \n+ CCTK_REAL csetemp5 CCTK_ATTRIBUTE_UNUSED = sin(ToReal(theta));\n+ \n+ CCTK_REAL xform1L13 CCTK_ATTRIBUTE_UNUSED = csetemp4*csetemp5;\n+ \n+ CCTK_REAL xform1L20 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL xform1L21 CCTK_ATTRIBUTE_UNUSED = \n+ -(csetemp1*csetemp2*csetemp3) - csetemp0*csetemp4;\n+ \n+ CCTK_REAL xform1L22 CCTK_ATTRIBUTE_UNUSED = csetemp0*csetemp1*csetemp2 \n+ - csetemp3*csetemp4;\n+ \n+ CCTK_REAL xform1L23 CCTK_ATTRIBUTE_UNUSED = csetemp1*csetemp5;\n+ \n+ CCTK_REAL xform1L30 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL xform1L31 CCTK_ATTRIBUTE_UNUSED = csetemp3*csetemp5;\n+ \n+ CCTK_REAL xform1L32 CCTK_ATTRIBUTE_UNUSED = -(csetemp0*csetemp5);\n+ \n+ CCTK_REAL xform1L33 CCTK_ATTRIBUTE_UNUSED = csetemp2;\n+ \n+ CCTK_REAL csetemp6 CCTK_ATTRIBUTE_UNUSED = SQR(ToReal(boostx));\n+ \n+ CCTK_REAL csetemp7 CCTK_ATTRIBUTE_UNUSED = SQR(ToReal(boosty));\n+ \n+ CCTK_REAL csetemp8 CCTK_ATTRIBUTE_UNUSED = SQR(ToReal(boostz));\n+ \n+ CCTK_REAL csetemp9 CCTK_ATTRIBUTE_UNUSED = INV(ToReal(lapsefactor));\n+ \n+ CCTK_REAL xform2L00 CCTK_ATTRIBUTE_UNUSED = csetemp9*INV((-1 + \n+ csetemp6 + csetemp7 + csetemp8)*(1 + sqrt(1 - csetemp6 - csetemp7 - \n+ csetemp8)))*(1 - csetemp6 - csetemp7 - csetemp8 + sqrt(1 - csetemp6 - \n+ csetemp7 - csetemp8))*(-1 + ToReal(boostx)*ToReal(shiftaddx) + \n+ ToReal(boosty)*ToReal(shiftaddy) + ToReal(boostz)*ToReal(shiftaddz));\n+ \n+ CCTK_REAL xform2L01 CCTK_ATTRIBUTE_UNUSED = csetemp9*INV((-1 + \n+ csetemp6 + csetemp7 + csetemp8)*(1 + sqrt(1 - csetemp6 - csetemp7 - \n+ csetemp8)))*(1 - csetemp6 - csetemp7 - csetemp8 + sqrt(1 - csetemp6 - \n+ csetemp7 - csetemp8))*ToReal(boostx);\n+ \n+ CCTK_REAL xform2L02 CCTK_ATTRIBUTE_UNUSED = csetemp9*INV((-1 + \n+ csetemp6 + csetemp7 + csetemp8)*(1 + sqrt(1 - csetemp6 - csetemp7 - \n+ csetemp8)))*(1 - csetemp6 - csetemp7 - csetemp8 + sqrt(1 - csetemp6 - \n+ csetemp7 - csetemp8))*ToReal(boosty);\n+ \n+ CCTK_REAL xform2L03 CCTK_ATTRIBUTE_UNUSED = csetemp9*INV((-1 + \n+ csetemp6 + csetemp7 + csetemp8)*(1 + sqrt(1 - csetemp6 - csetemp7 - \n+ csetemp8)))*(1 - csetemp6 - csetemp7 - csetemp8 + sqrt(1 - csetemp6 - \n+ csetemp7 - csetemp8))*ToReal(boostz);\n+ \n+ CCTK_REAL xform2L10 CCTK_ATTRIBUTE_UNUSED = INV((-1 + csetemp6 + \n+ csetemp7 + csetemp8)*(1 + sqrt(1 - csetemp6 - csetemp7 - \n+ csetemp8)))*((csetemp6 + (-1 + csetemp7 + csetemp8)*(1 + sqrt(1 - \n+ csetemp6 - csetemp7 - csetemp8)))*ToReal(shiftaddx) - \n+ ToReal(boostx)*(-1 + csetemp6 + csetemp7 + csetemp8 + sqrt(1 - csetemp6 \n+ - csetemp7 - csetemp8)*(-1 + ToReal(boosty)*ToReal(shiftaddy) + \n+ ToReal(boostz)*ToReal(shiftaddz))));\n+ \n+ CCTK_REAL xform2L11 CCTK_ATTRIBUTE_UNUSED = INV((-1 + csetemp6 + \n+ csetemp7 + csetemp8)*(1 + sqrt(1 - csetemp6 - csetemp7 - \n+ csetemp8)))*(csetemp6 + (-1 + csetemp7 + csetemp8)*(1 + sqrt(1 - \n+ csetemp6 - csetemp7 - csetemp8)));\n+ \n+ CCTK_REAL xform2L12 CCTK_ATTRIBUTE_UNUSED = -(INV(-1 + csetemp6 + \n+ csetemp7 + csetemp8 - sqrt(1 - csetemp6 - csetemp7 - \n+ csetemp8))*ToReal(boostx)*ToReal(boosty));\n+ \n+ CCTK_REAL xform2L13 CCTK_ATTRIBUTE_UNUSED = -(INV(-1 + csetemp6 + \n+ csetemp7 + csetemp8 - sqrt(1 - csetemp6 - csetemp7 - \n+ csetemp8))*ToReal(boostx)*ToReal(boostz));\n+ \n+ CCTK_REAL xform2L20 CCTK_ATTRIBUTE_UNUSED = INV((-1 + csetemp6 + \n+ csetemp7 + csetemp8)*(1 + sqrt(1 - csetemp6 - csetemp7 - \n+ csetemp8)))*((csetemp7 + (-1 + csetemp6 + csetemp8)*(1 + sqrt(1 - \n+ csetemp6 - csetemp7 - csetemp8)))*ToReal(shiftaddy) - \n+ ToReal(boosty)*(-1 + csetemp6 + csetemp7 + csetemp8 + sqrt(1 - csetemp6 \n+ - csetemp7 - csetemp8)*(-1 + ToReal(boostx)*ToReal(shiftaddx) + \n+ ToReal(boostz)*ToReal(shiftaddz))));\n+ \n+ CCTK_REAL xform2L21 CCTK_ATTRIBUTE_UNUSED = -(INV(-1 + csetemp6 + \n+ csetemp7 + csetemp8 - sqrt(1 - csetemp6 - csetemp7 - \n+ csetemp8))*ToReal(boostx)*ToReal(boosty));\n+ \n+ CCTK_REAL xform2L22 CCTK_ATTRIBUTE_UNUSED = INV((-1 + csetemp6 + \n+ csetemp7 + csetemp8)*(1 + sqrt(1 - csetemp6 - csetemp7 - \n+ csetemp8)))*(csetemp7 + (-1 + csetemp6 + csetemp8)*(1 + sqrt(1 - \n+ csetemp6 - csetemp7 - csetemp8)));\n+ \n+ CCTK_REAL xform2L23 CCTK_ATTRIBUTE_UNUSED = -(INV(-1 + csetemp6 + \n+ csetemp7 + csetemp8 - sqrt(1 - csetemp6 - csetemp7 - \n+ csetemp8))*ToReal(boosty)*ToReal(boostz));\n+ \n+ CCTK_REAL xform2L30 CCTK_ATTRIBUTE_UNUSED = INV((-1 + csetemp6 + \n+ csetemp7 + csetemp8)*(1 + sqrt(1 - csetemp6 - csetemp7 - \n+ csetemp8)))*(-(ToReal(boostz)*(-1 + csetemp6 + csetemp7 + csetemp8 + \n+ sqrt(1 - csetemp6 - csetemp7 - csetemp8)*(-1 + \n+ ToReal(boostx)*ToReal(shiftaddx) + ToReal(boosty)*ToReal(shiftaddy)))) \n+ + (-1 + csetemp6 + csetemp7 + csetemp8 + (-1 + csetemp6 + \n+ csetemp7)*sqrt(1 - csetemp6 - csetemp7 - csetemp8))*ToReal(shiftaddz));\n+ \n+ CCTK_REAL xform2L31 CCTK_ATTRIBUTE_UNUSED = -(INV(-1 + csetemp6 + \n+ csetemp7 + csetemp8 - sqrt(1 - csetemp6 - csetemp7 - \n+ csetemp8))*ToReal(boostx)*ToReal(boostz));\n+ \n+ CCTK_REAL xform2L32 CCTK_ATTRIBUTE_UNUSED = -(INV(-1 + csetemp6 + \n+ csetemp7 + csetemp8 - sqrt(1 - csetemp6 - csetemp7 - \n+ csetemp8))*ToReal(boosty)*ToReal(boostz));\n+ \n+ CCTK_REAL xform2L33 CCTK_ATTRIBUTE_UNUSED = INV((-1 + csetemp6 + \n+ csetemp7 + csetemp8)*(1 + sqrt(1 - csetemp6 - csetemp7 - \n+ csetemp8)))*(-1 + csetemp6 + csetemp7 + csetemp8 + (-1 + csetemp6 + \n+ csetemp7)*sqrt(1 - csetemp6 - csetemp7 - csetemp8));\n+ \n+ CCTK_REAL xformL00 CCTK_ATTRIBUTE_UNUSED = xform1L00*xform2L00 + \n+ xform1L01*xform2L10 + xform1L02*xform2L20 + xform1L03*xform2L30;\n+ \n+ CCTK_REAL xformL01 CCTK_ATTRIBUTE_UNUSED = xform1L00*xform2L01 + \n+ xform1L01*xform2L11 + xform1L02*xform2L21 + xform1L03*xform2L31;\n+ \n+ CCTK_REAL xformL02 CCTK_ATTRIBUTE_UNUSED = xform1L00*xform2L02 + \n+ xform1L01*xform2L12 + xform1L02*xform2L22 + xform1L03*xform2L32;\n+ \n+ CCTK_REAL xformL03 CCTK_ATTRIBUTE_UNUSED = xform1L00*xform2L03 + \n+ xform1L01*xform2L13 + xform1L02*xform2L23 + xform1L03*xform2L33;\n+ \n+ CCTK_REAL xformL10 CCTK_ATTRIBUTE_UNUSED = xform1L10*xform2L00 + \n+ xform1L11*xform2L10 + xform1L12*xform2L20 + xform1L13*xform2L30;\n+ \n+ CCTK_REAL xformL11 CCTK_ATTRIBUTE_UNUSED = xform1L10*xform2L01 + \n+ xform1L11*xform2L11 + xform1L12*xform2L21 + xform1L13*xform2L31;\n+ \n+ CCTK_REAL xformL12 CCTK_ATTRIBUTE_UNUSED = xform1L10*xform2L02 + \n+ xform1L11*xform2L12 + xform1L12*xform2L22 + xform1L13*xform2L32;\n+ \n+ CCTK_REAL xformL13 CCTK_ATTRIBUTE_UNUSED = xform1L10*xform2L03 + \n+ xform1L11*xform2L13 + xform1L12*xform2L23 + xform1L13*xform2L33;\n+ \n+ CCTK_REAL xformL20 CCTK_ATTRIBUTE_UNUSED = xform1L20*xform2L00 + \n+ xform1L21*xform2L10 + xform1L22*xform2L20 + xform1L23*xform2L30;\n+ \n+ CCTK_REAL xformL21 CCTK_ATTRIBUTE_UNUSED = xform1L20*xform2L01 + \n+ xform1L21*xform2L11 + xform1L22*xform2L21 + xform1L23*xform2L31;\n+ \n+ CCTK_REAL xformL22 CCTK_ATTRIBUTE_UNUSED = xform1L20*xform2L02 + \n+ xform1L21*xform2L12 + xform1L22*xform2L22 + xform1L23*xform2L32;\n+ \n+ CCTK_REAL xformL23 CCTK_ATTRIBUTE_UNUSED = xform1L20*xform2L03 + \n+ xform1L21*xform2L13 + xform1L22*xform2L23 + xform1L23*xform2L33;\n+ \n+ CCTK_REAL xformL30 CCTK_ATTRIBUTE_UNUSED = xform1L30*xform2L00 + \n+ xform1L31*xform2L10 + xform1L32*xform2L20 + xform1L33*xform2L30;\n+ \n+ CCTK_REAL xformL31 CCTK_ATTRIBUTE_UNUSED = xform1L30*xform2L01 + \n+ xform1L31*xform2L11 + xform1L32*xform2L21 + xform1L33*xform2L31;\n+ \n+ CCTK_REAL xformL32 CCTK_ATTRIBUTE_UNUSED = xform1L30*xform2L02 + \n+ xform1L31*xform2L12 + xform1L32*xform2L22 + xform1L33*xform2L32;\n+ \n+ CCTK_REAL xformL33 CCTK_ATTRIBUTE_UNUSED = xform1L30*xform2L03 + \n+ xform1L31*xform2L13 + xform1L32*xform2L23 + xform1L33*xform2L33;\n+ \n+ CCTK_REAL xx0 CCTK_ATTRIBUTE_UNUSED = t - ToReal(timeoffset);\n+ \n+ CCTK_REAL xx1 CCTK_ATTRIBUTE_UNUSED = xL - ToReal(positionx);\n+ \n+ CCTK_REAL xx2 CCTK_ATTRIBUTE_UNUSED = yL - ToReal(positiony);\n+ \n+ CCTK_REAL xx3 CCTK_ATTRIBUTE_UNUSED = zL - ToReal(positionz);\n+ \n+ CCTK_REAL txx1 CCTK_ATTRIBUTE_UNUSED = xformL10*xx0 + xformL11*xx1 + \n+ xformL12*xx2 + xformL13*xx3;\n+ \n+ CCTK_REAL txx2 CCTK_ATTRIBUTE_UNUSED = xformL20*xx0 + xformL21*xx1 + \n+ xformL22*xx2 + xformL23*xx3;\n+ \n+ CCTK_REAL txx3 CCTK_ATTRIBUTE_UNUSED = xformL30*xx0 + xformL31*xx1 + \n+ xformL32*xx2 + xformL33*xx3;\n+ \n+ CCTK_REAL X CCTK_ATTRIBUTE_UNUSED = txx1;\n+ \n+ CCTK_REAL Y CCTK_ATTRIBUTE_UNUSED = txx2;\n+ \n+ CCTK_REAL Z CCTK_ATTRIBUTE_UNUSED = txx3;\n+ \n+ CCTK_REAL csetemp10 CCTK_ATTRIBUTE_UNUSED = SQR(ToReal(a));\n+ \n+ CCTK_REAL csetemp11 CCTK_ATTRIBUTE_UNUSED = SQR(X);\n+ \n+ CCTK_REAL csetemp12 CCTK_ATTRIBUTE_UNUSED = SQR(Y);\n+ \n+ CCTK_REAL csetemp13 CCTK_ATTRIBUTE_UNUSED = SQR(Z);\n+ \n+ CCTK_REAL rXYZ CCTK_ATTRIBUTE_UNUSED = sqrt(INV(2)*(-csetemp10 + \n+ csetemp11 + csetemp12 + csetemp13 + sqrt(4*csetemp10*csetemp13 + \n+ SQR(-csetemp10 + csetemp11 + csetemp12 + csetemp13))));\n+ \n+ CCTK_REAL csetemp14 CCTK_ATTRIBUTE_UNUSED = CUB(rXYZ);\n+ \n+ CCTK_REAL csetemp15 CCTK_ATTRIBUTE_UNUSED = QAD(rXYZ);\n+ \n+ CCTK_REAL tg400 CCTK_ATTRIBUTE_UNUSED = -1 + \n+ 2*csetemp14*INV(csetemp10*csetemp13 + csetemp15)*ToReal(M);\n+ \n+ CCTK_REAL csetemp16 CCTK_ATTRIBUTE_UNUSED = SQR(rXYZ);\n+ \n+ CCTK_REAL csetemp17 CCTK_ATTRIBUTE_UNUSED = rXYZ*X;\n+ \n+ CCTK_REAL csetemp18 CCTK_ATTRIBUTE_UNUSED = Y*ToReal(a);\n+ \n+ CCTK_REAL tg401 CCTK_ATTRIBUTE_UNUSED = 2*csetemp14*(csetemp17 + \n+ csetemp18)*INV((csetemp10*csetemp13 + csetemp15)*(csetemp10 + \n+ csetemp16))*ToReal(M);\n+ \n+ CCTK_REAL csetemp19 CCTK_ATTRIBUTE_UNUSED = X*ToReal(a);\n+ \n+ CCTK_REAL csetemp20 CCTK_ATTRIBUTE_UNUSED = -csetemp19;\n+ \n+ CCTK_REAL csetemp21 CCTK_ATTRIBUTE_UNUSED = rXYZ*Y;\n+ \n+ CCTK_REAL tg402 CCTK_ATTRIBUTE_UNUSED = 2*csetemp14*(csetemp20 + \n+ csetemp21)*INV((csetemp10*csetemp13 + csetemp15)*(csetemp10 + \n+ csetemp16))*ToReal(M);\n+ \n+ CCTK_REAL tg403 CCTK_ATTRIBUTE_UNUSED = \n+ 2*csetemp16*Z*INV(csetemp10*csetemp13 + csetemp15)*ToReal(M);\n+ \n+ CCTK_REAL tg411 CCTK_ATTRIBUTE_UNUSED = 1 + \n+ 2*csetemp14*INV((csetemp10*csetemp13 + csetemp15)*SQR(csetemp10 + \n+ csetemp16))*SQR(csetemp17 + csetemp18)*ToReal(M);\n+ \n+ CCTK_REAL tg412 CCTK_ATTRIBUTE_UNUSED = 2*csetemp14*(csetemp17 + \n+ csetemp18)*(csetemp20 + csetemp21)*INV((csetemp10*csetemp13 + \n+ csetemp15)*SQR(csetemp10 + csetemp16))*ToReal(M);\n+ \n+ CCTK_REAL tg413 CCTK_ATTRIBUTE_UNUSED = 2*csetemp16*(csetemp17 + \n+ csetemp18)*Z*INV((csetemp10*csetemp13 + csetemp15)*(csetemp10 + \n+ csetemp16))*ToReal(M);\n+ \n+ CCTK_REAL tg422 CCTK_ATTRIBUTE_UNUSED = 1 + \n+ 2*csetemp14*INV((csetemp10*csetemp13 + csetemp15)*SQR(csetemp10 + \n+ csetemp16))*SQR(csetemp20 + csetemp21)*ToReal(M);\n+ \n+ CCTK_REAL tg423 CCTK_ATTRIBUTE_UNUSED = 2*csetemp16*(csetemp20 + \n+ csetemp21)*Z*INV((csetemp10*csetemp13 + csetemp15)*(csetemp10 + \n+ csetemp16))*ToReal(M);\n+ \n+ CCTK_REAL tg433 CCTK_ATTRIBUTE_UNUSED = 1 + \n+ 2*csetemp13*rXYZ*INV(csetemp10*csetemp13 + csetemp15)*ToReal(M);\n+ \n+ CCTK_REAL tdg4000 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL csetemp22 CCTK_ATTRIBUTE_UNUSED = pow(rXYZ,7);\n+ \n+ CCTK_REAL tdg4001 CCTK_ATTRIBUTE_UNUSED = \n+ 2*(3*csetemp10*csetemp13*csetemp14 - \n+ csetemp22)*X*INV(SQR(csetemp10*csetemp13 + \n+ csetemp15)*sqrt(4*csetemp10*csetemp13 + SQR(-csetemp10 + csetemp11 + \n+ csetemp12 + csetemp13)))*ToReal(M);\n+ \n+ CCTK_REAL tdg4002 CCTK_ATTRIBUTE_UNUSED = \n+ 2*(3*csetemp10*csetemp13*csetemp14 - \n+ csetemp22)*Y*INV(SQR(csetemp10*csetemp13 + \n+ csetemp15)*sqrt(4*csetemp10*csetemp13 + SQR(-csetemp10 + csetemp11 + \n+ csetemp12 + csetemp13)))*ToReal(M);\n+ \n+ CCTK_REAL csetemp23 CCTK_ATTRIBUTE_UNUSED = pow(rXYZ,6);\n+ \n+ CCTK_REAL csetemp24 CCTK_ATTRIBUTE_UNUSED = QAD(ToReal(a));\n+ \n+ CCTK_REAL tdg4003 CCTK_ATTRIBUTE_UNUSED = 2*(csetemp10*(-5*csetemp15 + \n+ (-2*csetemp10 + 2*(csetemp11 + csetemp12) + 5*csetemp13)*csetemp16) - \n+ csetemp23 + 3*csetemp13*csetemp24)*rXYZ*Z*INV(SQR(csetemp10*csetemp13 + \n+ csetemp15)*sqrt(4*csetemp10*csetemp13 + SQR(-csetemp10 + csetemp11 + \n+ csetemp12 + csetemp13)))*ToReal(M);\n+ \n+ CCTK_REAL tdg4010 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL csetemp25 CCTK_ATTRIBUTE_UNUSED = pow(rXYZ,9);\n+ \n+ CCTK_REAL csetemp26 CCTK_ATTRIBUTE_UNUSED = CUB(ToReal(a));\n+ \n+ CCTK_REAL csetemp27 CCTK_ATTRIBUTE_UNUSED = pow(ToReal(a),5);\n+ \n+ CCTK_REAL csetemp28 CCTK_ATTRIBUTE_UNUSED = pow(rXYZ,5);\n+ \n+ CCTK_REAL tdg4011 CCTK_ATTRIBUTE_UNUSED = \n+ 2*csetemp14*INV(SQR(csetemp10*csetemp13 + csetemp15)*SQR(csetemp10 + \n+ csetemp16)*sqrt(4*csetemp10*csetemp13 + SQR(-csetemp10 + csetemp11 + \n+ csetemp12 + csetemp13)))*((3*csetemp10 - 3*csetemp11 - csetemp12 - \n+ csetemp13)*csetemp22 + 2*csetemp25 + csetemp10*((3*csetemp10 + \n+ csetemp11 - csetemp12 - csetemp13)*csetemp13*csetemp14 + (csetemp10 - \n+ csetemp11 - csetemp12 + csetemp13)*csetemp28) + csetemp13*((csetemp10 + \n+ 3*csetemp11 - csetemp12 - csetemp13)*csetemp24*rXYZ + \n+ csetemp16*csetemp26*X*Y) + X*Y*(-(csetemp15*csetemp26) + \n+ 3*csetemp13*csetemp27 - 3*csetemp23*ToReal(a)))*ToReal(M);\n+ \n+ CCTK_REAL csetemp29 CCTK_ATTRIBUTE_UNUSED = pow(rXYZ,8);\n+ \n+ CCTK_REAL tdg4012 CCTK_ATTRIBUTE_UNUSED = \n+ 2*csetemp14*INV(SQR(csetemp10*csetemp13 + csetemp15)*SQR(csetemp10 + \n+ csetemp16)*sqrt(4*csetemp10*csetemp13 + SQR(-csetemp10 + csetemp11 + \n+ csetemp12 + csetemp13)))*(((csetemp10 - csetemp11 - 2*csetemp12 + \n+ csetemp13)*csetemp15 + (3*csetemp10 - csetemp11 - \n+ csetemp13)*csetemp13*csetemp16)*csetemp26 + (-2*csetemp22 + \n+ 4*csetemp13*csetemp24*rXYZ)*X*Y + csetemp13*((csetemp10 - csetemp11 + \n+ 2*csetemp12 - csetemp13)*csetemp27 + 2*csetemp10*csetemp14*X*Y) + \n+ ((3*csetemp10 - csetemp11 - 4*csetemp12 - csetemp13)*csetemp23 + \n+ 2*csetemp29)*ToReal(a))*ToReal(M);\n+ \n+ CCTK_REAL tdg4013 CCTK_ATTRIBUTE_UNUSED = 2*rXYZ*Z*INV((csetemp10 + \n+ csetemp16)*SQR(csetemp10*csetemp13 + \n+ csetemp15)*sqrt(4*csetemp10*csetemp13 + SQR(-csetemp10 + csetemp11 + \n+ csetemp12 + csetemp13)))*((-2*csetemp22 + csetemp10*(2*(-csetemp10 + \n+ csetemp11 + csetemp12 + 2*csetemp13)*csetemp14 - 4*csetemp28) + \n+ 4*csetemp13*csetemp24*rXYZ)*X + Y*((-5*csetemp15 + (-2*csetemp10 + \n+ 2*(csetemp11 + csetemp12) + 3*csetemp13)*csetemp16)*csetemp26 + \n+ 3*csetemp13*csetemp27 - 3*csetemp23*ToReal(a)))*ToReal(M);\n+ \n+ CCTK_REAL tdg4020 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tdg4021 CCTK_ATTRIBUTE_UNUSED = \n+ -2*csetemp14*INV(SQR(csetemp10*csetemp13 + csetemp15)*SQR(csetemp10 + \n+ csetemp16)*sqrt(4*csetemp10*csetemp13 + SQR(-csetemp10 + csetemp11 + \n+ csetemp12 + csetemp13)))*(((csetemp10 - 2*csetemp11 - csetemp12 + \n+ csetemp13)*csetemp15 + (3*csetemp10 - csetemp12 - \n+ csetemp13)*csetemp13*csetemp16)*csetemp26 + (2*csetemp22 - \n+ 4*csetemp13*csetemp24*rXYZ)*X*Y + csetemp13*((csetemp10 + 2*csetemp11 - \n+ csetemp12 - csetemp13)*csetemp27 - 2*csetemp10*csetemp14*X*Y) + \n+ ((3*csetemp10 - 4*csetemp11 - csetemp12 - csetemp13)*csetemp23 + \n+ 2*csetemp29)*ToReal(a))*ToReal(M);\n+ \n+ CCTK_REAL tdg4022 CCTK_ATTRIBUTE_UNUSED = \n+ 2*csetemp14*INV(SQR(csetemp10*csetemp13 + csetemp15)*SQR(csetemp10 + \n+ csetemp16)*sqrt(4*csetemp10*csetemp13 + SQR(-csetemp10 + csetemp11 + \n+ csetemp12 + csetemp13)))*((3*csetemp10 - csetemp11 - 3*csetemp12 - \n+ csetemp13)*csetemp22 + 2*csetemp25 + csetemp10*((3*csetemp10 - \n+ csetemp11 + csetemp12 - csetemp13)*csetemp13*csetemp14 + (csetemp10 - \n+ csetemp11 - csetemp12 + csetemp13)*csetemp28) + csetemp13*((csetemp10 - \n+ csetemp11 + 3*csetemp12 - csetemp13)*csetemp24*rXYZ - \n+ csetemp16*csetemp26*X*Y) + X*Y*(csetemp15*csetemp26 - \n+ 3*csetemp13*csetemp27 + 3*csetemp23*ToReal(a)))*ToReal(M);\n+ \n+ CCTK_REAL tdg4023 CCTK_ATTRIBUTE_UNUSED = 2*rXYZ*Z*INV((csetemp10 + \n+ csetemp16)*SQR(csetemp10*csetemp13 + \n+ csetemp15)*sqrt(4*csetemp10*csetemp13 + SQR(-csetemp10 + csetemp11 + \n+ csetemp12 + csetemp13)))*((-2*csetemp22 + csetemp10*(2*(-csetemp10 + \n+ csetemp11 + csetemp12 + 2*csetemp13)*csetemp14 - 4*csetemp28))*Y + \n+ csetemp13*(-3*csetemp27*X + 4*csetemp24*rXYZ*Y) + X*((5*csetemp15 + \n+ (2*csetemp10 - 2*(csetemp11 + csetemp12) - \n+ 3*csetemp13)*csetemp16)*csetemp26 + 3*csetemp23*ToReal(a)))*ToReal(M);\n+ \n+ CCTK_REAL tdg4030 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tdg4031 CCTK_ATTRIBUTE_UNUSED = \n+ 4*(csetemp10*csetemp13*csetemp16 - \n+ csetemp23)*X*Z*INV(SQR(csetemp10*csetemp13 + \n+ csetemp15)*sqrt(4*csetemp10*csetemp13 + SQR(-csetemp10 + csetemp11 + \n+ csetemp12 + csetemp13)))*ToReal(M);\n+ \n+ CCTK_REAL tdg4032 CCTK_ATTRIBUTE_UNUSED = \n+ 4*(csetemp10*csetemp13*csetemp16 - \n+ csetemp23)*Y*Z*INV(SQR(csetemp10*csetemp13 + \n+ csetemp15)*sqrt(4*csetemp10*csetemp13 + SQR(-csetemp10 + csetemp11 + \n+ csetemp12 + csetemp13)))*ToReal(M);\n+ \n+ CCTK_REAL tdg4033 CCTK_ATTRIBUTE_UNUSED = 2*(csetemp10*csetemp13 - \n+ csetemp15)*(2*csetemp10*csetemp13 - 2*csetemp15 + (-csetemp10 + \n+ csetemp11 + csetemp12 + \n+ 3*csetemp13)*csetemp16)*INV(SQR(csetemp10*csetemp13 + \n+ csetemp15)*sqrt(4*csetemp10*csetemp13 + SQR(-csetemp10 + csetemp11 + \n+ csetemp12 + csetemp13)))*ToReal(M);\n+ \n+ CCTK_REAL tdg4110 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tdg4111 CCTK_ATTRIBUTE_UNUSED = 2*csetemp14*(csetemp17 + \n+ csetemp18)*INV(CUB(csetemp10 + csetemp16)*SQR(csetemp10*csetemp13 + \n+ csetemp15)*sqrt(4*csetemp10*csetemp13 + SQR(-csetemp10 + csetemp11 + \n+ csetemp12 + csetemp13)))*((6*csetemp10 - 5*csetemp11 - 2*(csetemp12 + \n+ csetemp13))*csetemp22 + 4*csetemp25 + csetemp10*(csetemp13*(6*csetemp10 \n+ - csetemp11 - 2*(csetemp12 + csetemp13))*csetemp14 + (-csetemp11 - \n+ 2*csetemp12 + 2*(csetemp10 + csetemp13))*csetemp28) + \n+ csetemp13*((2*csetemp10 + 3*csetemp11 - 2*(csetemp12 + \n+ csetemp13))*csetemp24*rXYZ - csetemp16*csetemp26*X*Y) + \n+ X*Y*(-(csetemp15*csetemp26) + 3*csetemp13*csetemp27 - \n+ 5*csetemp23*ToReal(a)))*ToReal(M);\n+ \n+ CCTK_REAL tdg4112 CCTK_ATTRIBUTE_UNUSED = 2*csetemp14*(csetemp17 + \n+ csetemp18)*INV(CUB(csetemp10 + csetemp16)*SQR(csetemp10*csetemp13 + \n+ csetemp15)*sqrt(4*csetemp10*csetemp13 + SQR(-csetemp10 + csetemp11 + \n+ csetemp12 + csetemp13)))*(((-2*csetemp11 - 3*csetemp12 + 2*(csetemp10 + \n+ csetemp13))*csetemp15 + csetemp13*(6*csetemp10 - 3*csetemp12 - \n+ 2*(csetemp11 + csetemp13))*csetemp16)*csetemp26 + (-3*csetemp22 + \n+ csetemp10*csetemp28 + 5*csetemp13*csetemp24*rXYZ)*X*Y + \n+ csetemp13*((2*csetemp10 + csetemp12 - 2*(csetemp11 + \n+ csetemp13))*csetemp27 + csetemp10*csetemp14*X*Y) + ((6*csetemp10 - \n+ 7*csetemp12 - 2*(csetemp11 + csetemp13))*csetemp23 + \n+ 4*csetemp29)*ToReal(a))*ToReal(M);\n+ \n+ CCTK_REAL tdg4113 CCTK_ATTRIBUTE_UNUSED = 2*(csetemp17 + \n+ csetemp18)*rXYZ*Z*INV(SQR(csetemp10*csetemp13 + \n+ csetemp15)*SQR(csetemp10 + csetemp16)*sqrt(4*csetemp10*csetemp13 + \n+ SQR(-csetemp10 + csetemp11 + csetemp12 + csetemp13)))*((-3*csetemp22 + \n+ csetemp10*((-2*csetemp10 + 2*(csetemp11 + csetemp12) + \n+ 3*csetemp13)*csetemp14 - 3*csetemp28) + 5*csetemp13*csetemp24*rXYZ)*X + \n+ Y*((-5*csetemp15 + (-2*csetemp10 + 2*(csetemp11 + csetemp12) + \n+ csetemp13)*csetemp16)*csetemp26 + 3*csetemp13*csetemp27 - \n+ 5*csetemp23*ToReal(a)))*ToReal(M);\n+ \n+ CCTK_REAL tdg4120 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL csetemp30 CCTK_ATTRIBUTE_UNUSED = pow(rXYZ,10);\n+ \n+ CCTK_REAL csetemp31 CCTK_ATTRIBUTE_UNUSED = pow(ToReal(a),6);\n+ \n+ CCTK_REAL tdg4121 CCTK_ATTRIBUTE_UNUSED = \n+ 2*csetemp14*INV(CUB(csetemp10 + csetemp16)*SQR(csetemp10*csetemp13 + \n+ csetemp15)*sqrt(4*csetemp10*csetemp13 + SQR(-csetemp10 + csetemp11 + \n+ csetemp12 + csetemp13)))*((csetemp10*(2*(-csetemp10 + 3*csetemp11 + \n+ csetemp13)*csetemp23 - csetemp15*(csetemp13*(csetemp12 + csetemp13) - \n+ csetemp10*(csetemp12 + 2*(csetemp11 + csetemp13)) + csetemp24)) - \n+ (-csetemp10 + 4*csetemp11 + csetemp12 + csetemp13)*csetemp29 + \n+ 2*csetemp30 + csetemp13*(-csetemp10 - 2*csetemp11 + csetemp12 + \n+ csetemp13)*csetemp31)*Y - 2*csetemp13*((csetemp10 + csetemp11 - \n+ 3*csetemp12 - csetemp13)*csetemp27*rXYZ*X + (csetemp10 - \n+ 3*csetemp11)*csetemp16*csetemp24*Y) + \n+ X*(csetemp26*(2*csetemp13*(-3*csetemp10 + csetemp11 + csetemp12 + \n+ csetemp13)*csetemp14 - 2*(csetemp10 - csetemp11 - csetemp12 + \n+ csetemp13)*csetemp28) + (2*(-3*csetemp10 + 3*csetemp11 - csetemp12 + \n+ csetemp13)*csetemp22 - 4*csetemp25)*ToReal(a)))*ToReal(M);\n+ \n+ CCTK_REAL tdg4122 CCTK_ATTRIBUTE_UNUSED = \n+ -2*csetemp14*INV(CUB(csetemp10 + csetemp16)*SQR(csetemp10*csetemp13 + \n+ csetemp15)*sqrt(4*csetemp10*csetemp13 + SQR(-csetemp10 + csetemp11 + \n+ csetemp12 + csetemp13)))*((csetemp10*csetemp15*(csetemp13*(csetemp11 + \n+ csetemp13) - csetemp10*(csetemp11 + 2*(csetemp12 + csetemp13)) + \n+ csetemp24) + (-csetemp10 + csetemp11 + 4*csetemp12 + \n+ csetemp13)*csetemp29 - 2*csetemp30 + (csetemp10 - csetemp11 + \n+ 2*csetemp12 - csetemp13)*csetemp13*csetemp31)*X + Y*(-2*((csetemp10 - \n+ csetemp11 - csetemp12 + csetemp13)*csetemp26*csetemp28 + (csetemp10 - \n+ 3*csetemp11 + csetemp12 - csetemp13)*csetemp13*csetemp27*rXYZ) - \n+ 4*csetemp25*ToReal(a)) + 2*((csetemp10*(csetemp10 - 3*csetemp12 - \n+ csetemp13)*csetemp23 + (csetemp10 - \n+ 3*csetemp12)*csetemp13*csetemp16*csetemp24)*X + \n+ Y*(csetemp13*(-3*csetemp10 + csetemp11 + csetemp12 + \n+ csetemp13)*csetemp14*csetemp26 + (-3*csetemp10 - csetemp11 + \n+ 3*csetemp12 + csetemp13)*csetemp22*ToReal(a))))*ToReal(M);\n+ \n+ CCTK_REAL tdg4123 CCTK_ATTRIBUTE_UNUSED = \n+ 2*rXYZ*Z*INV(SQR(csetemp10*csetemp13 + csetemp15)*SQR(csetemp10 + \n+ csetemp16)*sqrt(4*csetemp10*csetemp13 + SQR(-csetemp10 + csetemp11 + \n+ csetemp12 + csetemp13)))*((csetemp10*((2*(csetemp11 + csetemp12) + \n+ 3*(csetemp10 + csetemp13))*csetemp15 + 2*csetemp23) + 2*(csetemp10 - \n+ csetemp11 - csetemp12 + 2*csetemp13)*csetemp16*csetemp24 - \n+ 3*csetemp29)*X*Y + csetemp13*(4*(-csetemp11 + csetemp12)*csetemp27*rXYZ \n+ - 3*csetemp31*X*Y) + (csetemp11 - csetemp12)*(csetemp26*(-2*(-csetemp10 \n+ + csetemp11 + csetemp12 + csetemp13)*csetemp14 + 4*csetemp28) + \n+ 4*csetemp22*ToReal(a)))*ToReal(M);\n+ \n+ CCTK_REAL tdg4130 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tdg4131 CCTK_ATTRIBUTE_UNUSED = \n+ -2*csetemp16*Z*INV(SQR(csetemp10*csetemp13 + csetemp15)*SQR(csetemp10 + \n+ csetemp16)*sqrt(4*csetemp10*csetemp13 + SQR(-csetemp10 + csetemp11 + \n+ csetemp12 + csetemp13)))*((-3*csetemp10 + 4*csetemp11 + csetemp12 + \n+ csetemp13)*csetemp22 + csetemp10*(csetemp13*(-3*csetemp10 + csetemp12 + \n+ csetemp13)*csetemp14 - (csetemp10 - 2*csetemp11 - csetemp12 + \n+ csetemp13)*csetemp28) + csetemp13*(-csetemp10 - 2*csetemp11 + csetemp12 \n+ + csetemp13)*csetemp24*rXYZ - 2*(csetemp25 + csetemp13*csetemp27*X*Y) + \n+ X*Y*(2*csetemp15*csetemp26 + 4*csetemp23*ToReal(a)))*ToReal(M);\n+ \n+ CCTK_REAL tdg4132 CCTK_ATTRIBUTE_UNUSED = \n+ -2*csetemp16*Z*INV(SQR(csetemp10*csetemp13 + csetemp15)*SQR(csetemp10 + \n+ csetemp16)*sqrt(4*csetemp10*csetemp13 + SQR(-csetemp10 + csetemp11 + \n+ csetemp12 + csetemp13)))*((-((csetemp10 - csetemp11 - 3*csetemp12 + \n+ csetemp13)*csetemp15) + csetemp13*(-3*csetemp10 + csetemp11 + csetemp12 \n+ + csetemp13)*csetemp16)*csetemp26 + (3*csetemp22 + csetemp10*csetemp28 \n+ - 3*csetemp13*csetemp24*rXYZ)*X*Y + csetemp13*((-csetemp10 + csetemp11 \n+ - csetemp12 + csetemp13)*csetemp27 - csetemp10*csetemp14*X*Y) + \n+ ((-3*csetemp10 + csetemp11 + 5*csetemp12 + csetemp13)*csetemp23 - \n+ 2*csetemp29)*ToReal(a))*ToReal(M);\n+ \n+ CCTK_REAL csetemp32 CCTK_ATTRIBUTE_UNUSED = QAD(Z);\n+ \n+ CCTK_REAL tdg4133 CCTK_ATTRIBUTE_UNUSED = 2*INV((csetemp10 + \n+ csetemp16)*SQR(csetemp10*csetemp13 + \n+ csetemp15)*sqrt(4*csetemp10*csetemp13 + SQR(-csetemp10 + csetemp11 + \n+ csetemp12 + csetemp13)))*((-((-csetemp10 + csetemp11 + csetemp12 + \n+ 4*csetemp13)*csetemp22) + 2*csetemp25 + \n+ csetemp10*csetemp13*((-csetemp10 + csetemp11 + csetemp12 + \n+ 2*csetemp13)*csetemp14 - 3*csetemp28) + 3*csetemp24*csetemp32*rXYZ)*X + \n+ Y*(csetemp13*(-4*csetemp15 + (-csetemp10 + csetemp11 + csetemp12 + \n+ csetemp13)*csetemp16)*csetemp26 + (csetemp10 - csetemp11 - csetemp12 - \n+ 5*csetemp13)*csetemp23*ToReal(a) + 2*(csetemp27*csetemp32 + \n+ csetemp29*ToReal(a))))*ToReal(M);\n+ \n+ CCTK_REAL tdg4220 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL csetemp33 CCTK_ATTRIBUTE_UNUSED = -csetemp21;\n+ \n+ CCTK_REAL tdg4221 CCTK_ATTRIBUTE_UNUSED = 2*csetemp14*(csetemp19 + \n+ csetemp33)*INV(CUB(csetemp10 + csetemp16)*SQR(csetemp10*csetemp13 + \n+ csetemp15)*sqrt(4*csetemp10*csetemp13 + SQR(-csetemp10 + csetemp11 + \n+ csetemp12 + csetemp13)))*(((-3*csetemp11 - 2*csetemp12 + 2*(csetemp10 + \n+ csetemp13))*csetemp15 + csetemp13*(6*csetemp10 - 3*csetemp11 - \n+ 2*(csetemp12 + csetemp13))*csetemp16)*csetemp26 + (3*csetemp22 - \n+ csetemp10*csetemp28 - 5*csetemp13*csetemp24*rXYZ)*X*Y + \n+ csetemp13*((2*csetemp10 + csetemp11 - 2*(csetemp12 + \n+ csetemp13))*csetemp27 - csetemp10*csetemp14*X*Y) + ((6*csetemp10 - \n+ 7*csetemp11 - 2*(csetemp12 + csetemp13))*csetemp23 + \n+ 4*csetemp29)*ToReal(a))*ToReal(M);\n+ \n+ CCTK_REAL tdg4222 CCTK_ATTRIBUTE_UNUSED = 2*csetemp14*(csetemp20 + \n+ csetemp21)*INV(CUB(csetemp10 + csetemp16)*SQR(csetemp10*csetemp13 + \n+ csetemp15)*sqrt(4*csetemp10*csetemp13 + SQR(-csetemp10 + csetemp11 + \n+ csetemp12 + csetemp13)))*((6*csetemp10 - 5*csetemp12 - 2*(csetemp11 + \n+ csetemp13))*csetemp22 + 4*csetemp25 + csetemp10*(csetemp13*(6*csetemp10 \n+ - csetemp12 - 2*(csetemp11 + csetemp13))*csetemp14 + (-2*csetemp11 - \n+ csetemp12 + 2*(csetemp10 + csetemp13))*csetemp28) + \n+ csetemp13*((2*csetemp10 + 3*csetemp12 - 2*(csetemp11 + \n+ csetemp13))*csetemp24*rXYZ + csetemp16*csetemp26*X*Y) + \n+ X*Y*(csetemp15*csetemp26 - 3*csetemp13*csetemp27 + \n+ 5*csetemp23*ToReal(a)))*ToReal(M);\n+ \n+ CCTK_REAL tdg4223 CCTK_ATTRIBUTE_UNUSED = 2*(csetemp19 + \n+ csetemp33)*rXYZ*Z*INV(SQR(csetemp10*csetemp13 + \n+ csetemp15)*SQR(csetemp10 + csetemp16)*sqrt(4*csetemp10*csetemp13 + \n+ SQR(-csetemp10 + csetemp11 + csetemp12 + csetemp13)))*((-5*csetemp15 + \n+ (-2*csetemp10 + 2*(csetemp11 + csetemp12) + \n+ csetemp13)*csetemp16)*csetemp26*X + csetemp10*((2*csetemp10 - \n+ 2*(csetemp11 + csetemp12) - 3*csetemp13)*csetemp14 + 3*csetemp28)*Y + \n+ 3*(csetemp13*csetemp27*X + csetemp22*Y) - 5*(csetemp13*csetemp24*rXYZ*Y \n+ + csetemp23*X*ToReal(a)))*ToReal(M);\n+ \n+ CCTK_REAL tdg4230 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tdg4231 CCTK_ATTRIBUTE_UNUSED = \n+ 2*csetemp16*Z*INV(SQR(csetemp10*csetemp13 + csetemp15)*SQR(csetemp10 + \n+ csetemp16)*sqrt(4*csetemp10*csetemp13 + SQR(-csetemp10 + csetemp11 + \n+ csetemp12 + csetemp13)))*((-((csetemp10 - 3*csetemp11 - csetemp12 + \n+ csetemp13)*csetemp15) + csetemp13*(-3*csetemp10 + csetemp11 + csetemp12 \n+ + csetemp13)*csetemp16)*csetemp26 + (-3*csetemp22 - csetemp10*csetemp28 \n+ + 3*csetemp13*csetemp24*rXYZ)*X*Y + csetemp13*((-csetemp10 - csetemp11 \n+ + csetemp12 + csetemp13)*csetemp27 + csetemp10*csetemp14*X*Y) + \n+ ((-3*csetemp10 + 5*csetemp11 + csetemp12 + csetemp13)*csetemp23 - \n+ 2*csetemp29)*ToReal(a))*ToReal(M);\n+ \n+ CCTK_REAL tdg4232 CCTK_ATTRIBUTE_UNUSED = \n+ -2*csetemp16*Z*INV(SQR(csetemp10*csetemp13 + csetemp15)*SQR(csetemp10 + \n+ csetemp16)*sqrt(4*csetemp10*csetemp13 + SQR(-csetemp10 + csetemp11 + \n+ csetemp12 + csetemp13)))*((-3*csetemp10 + csetemp11 + 4*csetemp12 + \n+ csetemp13)*csetemp22 + csetemp10*(csetemp13*(-3*csetemp10 + csetemp11 + \n+ csetemp13)*csetemp14 - (csetemp10 - csetemp11 - 2*csetemp12 + \n+ csetemp13)*csetemp28) - 2*(csetemp25 + csetemp15*csetemp26*X*Y) + \n+ csetemp13*((-csetemp10 + csetemp11 - 2*csetemp12 + \n+ csetemp13)*csetemp24*rXYZ + 2*csetemp27*X*Y) - \n+ 4*csetemp23*X*Y*ToReal(a))*ToReal(M);\n+ \n+ CCTK_REAL tdg4233 CCTK_ATTRIBUTE_UNUSED = -2*INV((csetemp10 + \n+ csetemp16)*SQR(csetemp10*csetemp13 + \n+ csetemp15)*sqrt(4*csetemp10*csetemp13 + SQR(-csetemp10 + csetemp11 + \n+ csetemp12 + csetemp13)))*(((-csetemp10 + csetemp11 + csetemp12 + \n+ 4*csetemp13)*csetemp22 - 2*csetemp25 + \n+ 3*csetemp10*csetemp13*csetemp28)*Y + csetemp13*((-4*csetemp15 + \n+ (-csetemp10 + csetemp11 + csetemp12 + csetemp13)*csetemp16)*csetemp26*X \n+ + csetemp10*(csetemp10 - csetemp11 - csetemp12 - \n+ 2*csetemp13)*csetemp14*Y) + csetemp32*(2*csetemp27*X - \n+ 3*csetemp24*rXYZ*Y) + ((csetemp10 - csetemp11 - csetemp12 - \n+ 5*csetemp13)*csetemp23 + 2*csetemp29)*X*ToReal(a))*ToReal(M);\n+ \n+ CCTK_REAL tdg4330 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tdg4331 CCTK_ATTRIBUTE_UNUSED = 2*csetemp13*(-3*csetemp28 + \n+ csetemp10*csetemp13*rXYZ)*X*INV(SQR(csetemp10*csetemp13 + \n+ csetemp15)*sqrt(4*csetemp10*csetemp13 + SQR(-csetemp10 + csetemp11 + \n+ csetemp12 + csetemp13)))*ToReal(M);\n+ \n+ CCTK_REAL tdg4332 CCTK_ATTRIBUTE_UNUSED = 2*csetemp13*(-3*csetemp28 + \n+ csetemp10*csetemp13*rXYZ)*Y*INV(SQR(csetemp10*csetemp13 + \n+ csetemp15)*sqrt(4*csetemp10*csetemp13 + SQR(-csetemp10 + csetemp11 + \n+ csetemp12 + csetemp13)))*ToReal(M);\n+ \n+ CCTK_REAL tdg4333 CCTK_ATTRIBUTE_UNUSED = 2*((2*csetemp10 - \n+ 2*(csetemp11 + csetemp12) - 5*csetemp13)*csetemp23 + 4*csetemp29 + \n+ csetemp24*csetemp32 + csetemp10*(-3*csetemp13*csetemp15 + \n+ csetemp16*csetemp32))*Z*INV(rXYZ*SQR(csetemp10*csetemp13 + \n+ csetemp15)*sqrt(4*csetemp10*csetemp13 + SQR(-csetemp10 + csetemp11 + \n+ csetemp12 + csetemp13)))*ToReal(M);\n+ \n+ CCTK_REAL g400 CCTK_ATTRIBUTE_UNUSED = 2*(tg423*xformL20*xformL30 + \n+ xformL00*(tg401*xformL10 + tg402*xformL20 + tg403*xformL30) + \n+ xformL10*(tg412*xformL20 + tg413*xformL30)) + tg400*SQR(xformL00) + \n+ tg411*SQR(xformL10) + tg422*SQR(xformL20) + tg433*SQR(xformL30);\n+ \n+ CCTK_REAL csetemp34 CCTK_ATTRIBUTE_UNUSED = tg400*xformL01;\n+ \n+ CCTK_REAL csetemp35 CCTK_ATTRIBUTE_UNUSED = tg401*xformL11;\n+ \n+ CCTK_REAL csetemp36 CCTK_ATTRIBUTE_UNUSED = tg402*xformL21;\n+ \n+ CCTK_REAL csetemp37 CCTK_ATTRIBUTE_UNUSED = tg403*xformL31;\n+ \n+ CCTK_REAL csetemp38 CCTK_ATTRIBUTE_UNUSED = tg401*xformL01;\n+ \n+ CCTK_REAL csetemp39 CCTK_ATTRIBUTE_UNUSED = tg411*xformL11;\n+ \n+ CCTK_REAL csetemp40 CCTK_ATTRIBUTE_UNUSED = tg412*xformL21;\n+ \n+ CCTK_REAL csetemp41 CCTK_ATTRIBUTE_UNUSED = tg413*xformL31;\n+ \n+ CCTK_REAL csetemp42 CCTK_ATTRIBUTE_UNUSED = tg402*xformL01;\n+ \n+ CCTK_REAL csetemp43 CCTK_ATTRIBUTE_UNUSED = tg412*xformL11;\n+ \n+ CCTK_REAL csetemp44 CCTK_ATTRIBUTE_UNUSED = tg422*xformL21;\n+ \n+ CCTK_REAL csetemp45 CCTK_ATTRIBUTE_UNUSED = tg423*xformL31;\n+ \n+ CCTK_REAL csetemp46 CCTK_ATTRIBUTE_UNUSED = tg403*xformL01;\n+ \n+ CCTK_REAL csetemp47 CCTK_ATTRIBUTE_UNUSED = tg413*xformL11;\n+ \n+ CCTK_REAL csetemp48 CCTK_ATTRIBUTE_UNUSED = tg423*xformL21;\n+ \n+ CCTK_REAL csetemp49 CCTK_ATTRIBUTE_UNUSED = tg433*xformL31;\n+ \n+ CCTK_REAL g401 CCTK_ATTRIBUTE_UNUSED = (csetemp34 + csetemp35 + \n+ csetemp36 + csetemp37)*xformL00 + (csetemp38 + csetemp39 + csetemp40 + \n+ csetemp41)*xformL10 + (csetemp42 + csetemp43 + csetemp44 + \n+ csetemp45)*xformL20 + (csetemp46 + csetemp47 + csetemp48 + \n+ csetemp49)*xformL30;\n+ \n+ CCTK_REAL csetemp50 CCTK_ATTRIBUTE_UNUSED = tg400*xformL02;\n+ \n+ CCTK_REAL csetemp51 CCTK_ATTRIBUTE_UNUSED = tg401*xformL12;\n+ \n+ CCTK_REAL csetemp52 CCTK_ATTRIBUTE_UNUSED = tg402*xformL22;\n+ \n+ CCTK_REAL csetemp53 CCTK_ATTRIBUTE_UNUSED = tg403*xformL32;\n+ \n+ CCTK_REAL csetemp54 CCTK_ATTRIBUTE_UNUSED = tg401*xformL02;\n+ \n+ CCTK_REAL csetemp55 CCTK_ATTRIBUTE_UNUSED = tg411*xformL12;\n+ \n+ CCTK_REAL csetemp56 CCTK_ATTRIBUTE_UNUSED = tg412*xformL22;\n+ \n+ CCTK_REAL csetemp57 CCTK_ATTRIBUTE_UNUSED = tg413*xformL32;\n+ \n+ CCTK_REAL csetemp58 CCTK_ATTRIBUTE_UNUSED = tg402*xformL02;\n+ \n+ CCTK_REAL csetemp59 CCTK_ATTRIBUTE_UNUSED = tg412*xformL12;\n+ \n+ CCTK_REAL csetemp60 CCTK_ATTRIBUTE_UNUSED = tg422*xformL22;\n+ \n+ CCTK_REAL csetemp61 CCTK_ATTRIBUTE_UNUSED = tg423*xformL32;\n+ \n+ CCTK_REAL csetemp62 CCTK_ATTRIBUTE_UNUSED = tg403*xformL02;\n+ \n+ CCTK_REAL csetemp63 CCTK_ATTRIBUTE_UNUSED = tg413*xformL12;\n+ \n+ CCTK_REAL csetemp64 CCTK_ATTRIBUTE_UNUSED = tg423*xformL22;\n+ \n+ CCTK_REAL csetemp65 CCTK_ATTRIBUTE_UNUSED = tg433*xformL32;\n+ \n+ CCTK_REAL g402 CCTK_ATTRIBUTE_UNUSED = (csetemp50 + csetemp51 + \n+ csetemp52 + csetemp53)*xformL00 + (csetemp54 + csetemp55 + csetemp56 + \n+ csetemp57)*xformL10 + (csetemp58 + csetemp59 + csetemp60 + \n+ csetemp61)*xformL20 + (csetemp62 + csetemp63 + csetemp64 + \n+ csetemp65)*xformL30;\n+ \n+ CCTK_REAL csetemp66 CCTK_ATTRIBUTE_UNUSED = tg400*xformL03;\n+ \n+ CCTK_REAL csetemp67 CCTK_ATTRIBUTE_UNUSED = tg401*xformL13;\n+ \n+ CCTK_REAL csetemp68 CCTK_ATTRIBUTE_UNUSED = tg402*xformL23;\n+ \n+ CCTK_REAL csetemp69 CCTK_ATTRIBUTE_UNUSED = tg403*xformL33;\n+ \n+ CCTK_REAL csetemp70 CCTK_ATTRIBUTE_UNUSED = tg401*xformL03;\n+ \n+ CCTK_REAL csetemp71 CCTK_ATTRIBUTE_UNUSED = tg411*xformL13;\n+ \n+ CCTK_REAL csetemp72 CCTK_ATTRIBUTE_UNUSED = tg412*xformL23;\n+ \n+ CCTK_REAL csetemp73 CCTK_ATTRIBUTE_UNUSED = tg413*xformL33;\n+ \n+ CCTK_REAL csetemp74 CCTK_ATTRIBUTE_UNUSED = tg402*xformL03;\n+ \n+ CCTK_REAL csetemp75 CCTK_ATTRIBUTE_UNUSED = tg412*xformL13;\n+ \n+ CCTK_REAL csetemp76 CCTK_ATTRIBUTE_UNUSED = tg422*xformL23;\n+ \n+ CCTK_REAL csetemp77 CCTK_ATTRIBUTE_UNUSED = tg423*xformL33;\n+ \n+ CCTK_REAL csetemp78 CCTK_ATTRIBUTE_UNUSED = tg403*xformL03;\n+ \n+ CCTK_REAL csetemp79 CCTK_ATTRIBUTE_UNUSED = tg413*xformL13;\n+ \n+ CCTK_REAL csetemp80 CCTK_ATTRIBUTE_UNUSED = tg423*xformL23;\n+ \n+ CCTK_REAL csetemp81 CCTK_ATTRIBUTE_UNUSED = tg433*xformL33;\n+ \n+ CCTK_REAL g403 CCTK_ATTRIBUTE_UNUSED = (csetemp66 + csetemp67 + \n+ csetemp68 + csetemp69)*xformL00 + (csetemp70 + csetemp71 + csetemp72 + \n+ csetemp73)*xformL10 + (csetemp74 + csetemp75 + csetemp76 + \n+ csetemp77)*xformL20 + (csetemp78 + csetemp79 + csetemp80 + \n+ csetemp81)*xformL30;\n+ \n+ CCTK_REAL g411 CCTK_ATTRIBUTE_UNUSED = (csetemp34 + csetemp35 + \n+ csetemp36 + csetemp37)*xformL01 + (csetemp38 + csetemp39 + csetemp40 + \n+ csetemp41)*xformL11 + (csetemp42 + csetemp43 + csetemp44 + \n+ csetemp45)*xformL21 + (csetemp46 + csetemp47 + csetemp48 + \n+ csetemp49)*xformL31;\n+ \n+ CCTK_REAL g412 CCTK_ATTRIBUTE_UNUSED = (csetemp50 + csetemp51 + \n+ csetemp52 + csetemp53)*xformL01 + (csetemp54 + csetemp55 + csetemp56 + \n+ csetemp57)*xformL11 + (csetemp58 + csetemp59 + csetemp60 + \n+ csetemp61)*xformL21 + (csetemp62 + csetemp63 + csetemp64 + \n+ csetemp65)*xformL31;\n+ \n+ CCTK_REAL g413 CCTK_ATTRIBUTE_UNUSED = (csetemp66 + csetemp67 + \n+ csetemp68 + csetemp69)*xformL01 + (csetemp70 + csetemp71 + csetemp72 + \n+ csetemp73)*xformL11 + (csetemp74 + csetemp75 + csetemp76 + \n+ csetemp77)*xformL21 + (csetemp78 + csetemp79 + csetemp80 + \n+ csetemp81)*xformL31;\n+ \n+ CCTK_REAL g422 CCTK_ATTRIBUTE_UNUSED = (csetemp50 + csetemp51 + \n+ csetemp52 + csetemp53)*xformL02 + (csetemp54 + csetemp55 + csetemp56 + \n+ csetemp57)*xformL12 + (csetemp58 + csetemp59 + csetemp60 + \n+ csetemp61)*xformL22 + (csetemp62 + csetemp63 + csetemp64 + \n+ csetemp65)*xformL32;\n+ \n+ CCTK_REAL g423 CCTK_ATTRIBUTE_UNUSED = (csetemp66 + csetemp67 + \n+ csetemp68 + csetemp69)*xformL02 + (csetemp70 + csetemp71 + csetemp72 + \n+ csetemp73)*xformL12 + (csetemp74 + csetemp75 + csetemp76 + \n+ csetemp77)*xformL22 + (csetemp78 + csetemp79 + csetemp80 + \n+ csetemp81)*xformL32;\n+ \n+ CCTK_REAL g433 CCTK_ATTRIBUTE_UNUSED = (csetemp66 + csetemp67 + \n+ csetemp68 + csetemp69)*xformL03 + (csetemp70 + csetemp71 + csetemp72 + \n+ csetemp73)*xformL13 + (csetemp74 + csetemp75 + csetemp76 + \n+ csetemp77)*xformL23 + (csetemp78 + csetemp79 + csetemp80 + \n+ csetemp81)*xformL33;\n+ \n+ CCTK_REAL csetemp82 CCTK_ATTRIBUTE_UNUSED = tdg4000*xformL00;\n+ \n+ CCTK_REAL csetemp83 CCTK_ATTRIBUTE_UNUSED = tdg4001*xformL10;\n+ \n+ CCTK_REAL csetemp84 CCTK_ATTRIBUTE_UNUSED = tdg4002*xformL20;\n+ \n+ CCTK_REAL csetemp85 CCTK_ATTRIBUTE_UNUSED = tdg4003*xformL30;\n+ \n+ CCTK_REAL csetemp86 CCTK_ATTRIBUTE_UNUSED = tdg4010*xformL00;\n+ \n+ CCTK_REAL csetemp87 CCTK_ATTRIBUTE_UNUSED = tdg4011*xformL10;\n+ \n+ CCTK_REAL csetemp88 CCTK_ATTRIBUTE_UNUSED = tdg4012*xformL20;\n+ \n+ CCTK_REAL csetemp89 CCTK_ATTRIBUTE_UNUSED = tdg4013*xformL30;\n+ \n+ CCTK_REAL csetemp90 CCTK_ATTRIBUTE_UNUSED = tdg4020*xformL00;\n+ \n+ CCTK_REAL csetemp91 CCTK_ATTRIBUTE_UNUSED = tdg4021*xformL10;\n+ \n+ CCTK_REAL csetemp92 CCTK_ATTRIBUTE_UNUSED = tdg4022*xformL20;\n+ \n+ CCTK_REAL csetemp93 CCTK_ATTRIBUTE_UNUSED = tdg4023*xformL30;\n+ \n+ CCTK_REAL csetemp94 CCTK_ATTRIBUTE_UNUSED = tdg4030*xformL00;\n+ \n+ CCTK_REAL csetemp95 CCTK_ATTRIBUTE_UNUSED = tdg4031*xformL10;\n+ \n+ CCTK_REAL csetemp96 CCTK_ATTRIBUTE_UNUSED = tdg4032*xformL20;\n+ \n+ CCTK_REAL csetemp97 CCTK_ATTRIBUTE_UNUSED = tdg4033*xformL30;\n+ \n+ CCTK_REAL csetemp98 CCTK_ATTRIBUTE_UNUSED = tdg4110*xformL00;\n+ \n+ CCTK_REAL csetemp99 CCTK_ATTRIBUTE_UNUSED = tdg4111*xformL10;\n+ \n+ CCTK_REAL csetemp100 CCTK_ATTRIBUTE_UNUSED = tdg4112*xformL20;\n+ \n+ CCTK_REAL csetemp101 CCTK_ATTRIBUTE_UNUSED = tdg4113*xformL30;\n+ \n+ CCTK_REAL csetemp102 CCTK_ATTRIBUTE_UNUSED = tdg4120*xformL00;\n+ \n+ CCTK_REAL csetemp103 CCTK_ATTRIBUTE_UNUSED = tdg4121*xformL10;\n+ \n+ CCTK_REAL csetemp104 CCTK_ATTRIBUTE_UNUSED = tdg4122*xformL20;\n+ \n+ CCTK_REAL csetemp105 CCTK_ATTRIBUTE_UNUSED = tdg4123*xformL30;\n+ \n+ CCTK_REAL csetemp106 CCTK_ATTRIBUTE_UNUSED = tdg4130*xformL00;\n+ \n+ CCTK_REAL csetemp107 CCTK_ATTRIBUTE_UNUSED = tdg4131*xformL10;\n+ \n+ CCTK_REAL csetemp108 CCTK_ATTRIBUTE_UNUSED = tdg4132*xformL20;\n+ \n+ CCTK_REAL csetemp109 CCTK_ATTRIBUTE_UNUSED = tdg4133*xformL30;\n+ \n+ CCTK_REAL csetemp110 CCTK_ATTRIBUTE_UNUSED = tdg4220*xformL00;\n+ \n+ CCTK_REAL csetemp111 CCTK_ATTRIBUTE_UNUSED = tdg4221*xformL10;\n+ \n+ CCTK_REAL csetemp112 CCTK_ATTRIBUTE_UNUSED = tdg4222*xformL20;\n+ \n+ CCTK_REAL csetemp113 CCTK_ATTRIBUTE_UNUSED = tdg4223*xformL30;\n+ \n+ CCTK_REAL csetemp114 CCTK_ATTRIBUTE_UNUSED = tdg4230*xformL00;\n+ \n+ CCTK_REAL csetemp115 CCTK_ATTRIBUTE_UNUSED = tdg4231*xformL10;\n+ \n+ CCTK_REAL csetemp116 CCTK_ATTRIBUTE_UNUSED = tdg4232*xformL20;\n+ \n+ CCTK_REAL csetemp117 CCTK_ATTRIBUTE_UNUSED = tdg4233*xformL30;\n+ \n+ CCTK_REAL csetemp118 CCTK_ATTRIBUTE_UNUSED = tdg4330*xformL00;\n+ \n+ CCTK_REAL csetemp119 CCTK_ATTRIBUTE_UNUSED = tdg4331*xformL10;\n+ \n+ CCTK_REAL csetemp120 CCTK_ATTRIBUTE_UNUSED = tdg4332*xformL20;\n+ \n+ CCTK_REAL csetemp121 CCTK_ATTRIBUTE_UNUSED = tdg4333*xformL30;\n+ \n+ CCTK_REAL dg4000 CCTK_ATTRIBUTE_UNUSED = xformL10*((csetemp86 + \n+ csetemp87 + csetemp88 + csetemp89)*xformL00 + (csetemp100 + csetemp101 \n+ + csetemp98 + csetemp99)*xformL10 + (csetemp102 + csetemp103 + \n+ csetemp104 + csetemp105)*xformL20 + (csetemp106 + csetemp107 + \n+ csetemp108 + csetemp109)*xformL30) + xformL20*((csetemp90 + csetemp91 + \n+ csetemp92 + csetemp93)*xformL00 + (csetemp102 + csetemp103 + csetemp104 \n+ + csetemp105)*xformL10 + (csetemp110 + csetemp111 + csetemp112 + \n+ csetemp113)*xformL20 + (csetemp114 + csetemp115 + csetemp116 + \n+ csetemp117)*xformL30) + xformL30*((csetemp94 + csetemp95 + csetemp96 + \n+ csetemp97)*xformL00 + (csetemp106 + csetemp107 + csetemp108 + \n+ csetemp109)*xformL10 + (csetemp114 + csetemp115 + csetemp116 + \n+ csetemp117)*xformL20 + (csetemp118 + csetemp119 + csetemp120 + \n+ csetemp121)*xformL30) + xformL00*((csetemp82 + csetemp83 + csetemp84 + \n+ csetemp85)*xformL00 + (csetemp86 + csetemp87 + csetemp88 + \n+ csetemp89)*xformL10 + (csetemp90 + csetemp91 + csetemp92 + \n+ csetemp93)*xformL20 + (csetemp94 + csetemp95 + csetemp96 + \n+ csetemp97)*xformL30);\n+ \n+ CCTK_REAL dg4010 CCTK_ATTRIBUTE_UNUSED = xformL10*((csetemp86 + \n+ csetemp87 + csetemp88 + csetemp89)*xformL01 + (csetemp100 + csetemp101 \n+ + csetemp98 + csetemp99)*xformL11 + (csetemp102 + csetemp103 + \n+ csetemp104 + csetemp105)*xformL21 + (csetemp106 + csetemp107 + \n+ csetemp108 + csetemp109)*xformL31) + xformL20*((csetemp90 + csetemp91 + \n+ csetemp92 + csetemp93)*xformL01 + (csetemp102 + csetemp103 + csetemp104 \n+ + csetemp105)*xformL11 + (csetemp110 + csetemp111 + csetemp112 + \n+ csetemp113)*xformL21 + (csetemp114 + csetemp115 + csetemp116 + \n+ csetemp117)*xformL31) + xformL30*((csetemp94 + csetemp95 + csetemp96 + \n+ csetemp97)*xformL01 + (csetemp106 + csetemp107 + csetemp108 + \n+ csetemp109)*xformL11 + (csetemp114 + csetemp115 + csetemp116 + \n+ csetemp117)*xformL21 + (csetemp118 + csetemp119 + csetemp120 + \n+ csetemp121)*xformL31) + xformL00*((csetemp82 + csetemp83 + csetemp84 + \n+ csetemp85)*xformL01 + (csetemp86 + csetemp87 + csetemp88 + \n+ csetemp89)*xformL11 + (csetemp90 + csetemp91 + csetemp92 + \n+ csetemp93)*xformL21 + (csetemp94 + csetemp95 + csetemp96 + \n+ csetemp97)*xformL31);\n+ \n+ CCTK_REAL csetemp122 CCTK_ATTRIBUTE_UNUSED = tdg4000*xformL01;\n+ \n+ CCTK_REAL csetemp123 CCTK_ATTRIBUTE_UNUSED = tdg4001*xformL11;\n+ \n+ CCTK_REAL csetemp124 CCTK_ATTRIBUTE_UNUSED = tdg4002*xformL21;\n+ \n+ CCTK_REAL csetemp125 CCTK_ATTRIBUTE_UNUSED = tdg4003*xformL31;\n+ \n+ CCTK_REAL csetemp126 CCTK_ATTRIBUTE_UNUSED = tdg4010*xformL01;\n+ \n+ CCTK_REAL csetemp127 CCTK_ATTRIBUTE_UNUSED = tdg4011*xformL11;\n+ \n+ CCTK_REAL csetemp128 CCTK_ATTRIBUTE_UNUSED = tdg4012*xformL21;\n+ \n+ CCTK_REAL csetemp129 CCTK_ATTRIBUTE_UNUSED = tdg4013*xformL31;\n+ \n+ CCTK_REAL csetemp130 CCTK_ATTRIBUTE_UNUSED = tdg4020*xformL01;\n+ \n+ CCTK_REAL csetemp131 CCTK_ATTRIBUTE_UNUSED = tdg4021*xformL11;\n+ \n+ CCTK_REAL csetemp132 CCTK_ATTRIBUTE_UNUSED = tdg4022*xformL21;\n+ \n+ CCTK_REAL csetemp133 CCTK_ATTRIBUTE_UNUSED = tdg4023*xformL31;\n+ \n+ CCTK_REAL csetemp134 CCTK_ATTRIBUTE_UNUSED = tdg4030*xformL01;\n+ \n+ CCTK_REAL csetemp135 CCTK_ATTRIBUTE_UNUSED = tdg4031*xformL11;\n+ \n+ CCTK_REAL csetemp136 CCTK_ATTRIBUTE_UNUSED = tdg4032*xformL21;\n+ \n+ CCTK_REAL csetemp137 CCTK_ATTRIBUTE_UNUSED = tdg4033*xformL31;\n+ \n+ CCTK_REAL csetemp138 CCTK_ATTRIBUTE_UNUSED = tdg4110*xformL01;\n+ \n+ CCTK_REAL csetemp139 CCTK_ATTRIBUTE_UNUSED = tdg4111*xformL11;\n+ \n+ CCTK_REAL csetemp140 CCTK_ATTRIBUTE_UNUSED = tdg4112*xformL21;\n+ \n+ CCTK_REAL csetemp141 CCTK_ATTRIBUTE_UNUSED = tdg4113*xformL31;\n+ \n+ CCTK_REAL csetemp142 CCTK_ATTRIBUTE_UNUSED = tdg4120*xformL01;\n+ \n+ CCTK_REAL csetemp143 CCTK_ATTRIBUTE_UNUSED = tdg4121*xformL11;\n+ \n+ CCTK_REAL csetemp144 CCTK_ATTRIBUTE_UNUSED = tdg4122*xformL21;\n+ \n+ CCTK_REAL csetemp145 CCTK_ATTRIBUTE_UNUSED = tdg4123*xformL31;\n+ \n+ CCTK_REAL csetemp146 CCTK_ATTRIBUTE_UNUSED = tdg4130*xformL01;\n+ \n+ CCTK_REAL csetemp147 CCTK_ATTRIBUTE_UNUSED = tdg4131*xformL11;\n+ \n+ CCTK_REAL csetemp148 CCTK_ATTRIBUTE_UNUSED = tdg4132*xformL21;\n+ \n+ CCTK_REAL csetemp149 CCTK_ATTRIBUTE_UNUSED = tdg4133*xformL31;\n+ \n+ CCTK_REAL csetemp150 CCTK_ATTRIBUTE_UNUSED = tdg4220*xformL01;\n+ \n+ CCTK_REAL csetemp151 CCTK_ATTRIBUTE_UNUSED = tdg4221*xformL11;\n+ \n+ CCTK_REAL csetemp152 CCTK_ATTRIBUTE_UNUSED = tdg4222*xformL21;\n+ \n+ CCTK_REAL csetemp153 CCTK_ATTRIBUTE_UNUSED = tdg4223*xformL31;\n+ \n+ CCTK_REAL csetemp154 CCTK_ATTRIBUTE_UNUSED = tdg4230*xformL01;\n+ \n+ CCTK_REAL csetemp155 CCTK_ATTRIBUTE_UNUSED = tdg4231*xformL11;\n+ \n+ CCTK_REAL csetemp156 CCTK_ATTRIBUTE_UNUSED = tdg4232*xformL21;\n+ \n+ CCTK_REAL csetemp157 CCTK_ATTRIBUTE_UNUSED = tdg4233*xformL31;\n+ \n+ CCTK_REAL csetemp158 CCTK_ATTRIBUTE_UNUSED = tdg4330*xformL01;\n+ \n+ CCTK_REAL csetemp159 CCTK_ATTRIBUTE_UNUSED = tdg4331*xformL11;\n+ \n+ CCTK_REAL csetemp160 CCTK_ATTRIBUTE_UNUSED = tdg4332*xformL21;\n+ \n+ CCTK_REAL csetemp161 CCTK_ATTRIBUTE_UNUSED = tdg4333*xformL31;\n+ \n+ CCTK_REAL dg4011 CCTK_ATTRIBUTE_UNUSED = xformL00*((csetemp122 + \n+ csetemp123 + csetemp124 + csetemp125)*xformL01 + (csetemp126 + \n+ csetemp127 + csetemp128 + csetemp129)*xformL11 + (csetemp130 + \n+ csetemp131 + csetemp132 + csetemp133)*xformL21 + (csetemp134 + \n+ csetemp135 + csetemp136 + csetemp137)*xformL31) + xformL10*((csetemp126 \n+ + csetemp127 + csetemp128 + csetemp129)*xformL01 + (csetemp138 + \n+ csetemp139 + csetemp140 + csetemp141)*xformL11 + (csetemp142 + \n+ csetemp143 + csetemp144 + csetemp145)*xformL21 + (csetemp146 + \n+ csetemp147 + csetemp148 + csetemp149)*xformL31) + xformL20*((csetemp130 \n+ + csetemp131 + csetemp132 + csetemp133)*xformL01 + (csetemp142 + \n+ csetemp143 + csetemp144 + csetemp145)*xformL11 + (csetemp150 + \n+ csetemp151 + csetemp152 + csetemp153)*xformL21 + (csetemp154 + \n+ csetemp155 + csetemp156 + csetemp157)*xformL31) + xformL30*((csetemp134 \n+ + csetemp135 + csetemp136 + csetemp137)*xformL01 + (csetemp146 + \n+ csetemp147 + csetemp148 + csetemp149)*xformL11 + (csetemp154 + \n+ csetemp155 + csetemp156 + csetemp157)*xformL21 + (csetemp158 + \n+ csetemp159 + csetemp160 + csetemp161)*xformL31);\n+ \n+ CCTK_REAL csetemp162 CCTK_ATTRIBUTE_UNUSED = tdg4000*xformL02;\n+ \n+ CCTK_REAL csetemp163 CCTK_ATTRIBUTE_UNUSED = tdg4001*xformL12;\n+ \n+ CCTK_REAL csetemp164 CCTK_ATTRIBUTE_UNUSED = tdg4002*xformL22;\n+ \n+ CCTK_REAL csetemp165 CCTK_ATTRIBUTE_UNUSED = tdg4003*xformL32;\n+ \n+ CCTK_REAL csetemp166 CCTK_ATTRIBUTE_UNUSED = tdg4010*xformL02;\n+ \n+ CCTK_REAL csetemp167 CCTK_ATTRIBUTE_UNUSED = tdg4011*xformL12;\n+ \n+ CCTK_REAL csetemp168 CCTK_ATTRIBUTE_UNUSED = tdg4012*xformL22;\n+ \n+ CCTK_REAL csetemp169 CCTK_ATTRIBUTE_UNUSED = tdg4013*xformL32;\n+ \n+ CCTK_REAL csetemp170 CCTK_ATTRIBUTE_UNUSED = tdg4020*xformL02;\n+ \n+ CCTK_REAL csetemp171 CCTK_ATTRIBUTE_UNUSED = tdg4021*xformL12;\n+ \n+ CCTK_REAL csetemp172 CCTK_ATTRIBUTE_UNUSED = tdg4022*xformL22;\n+ \n+ CCTK_REAL csetemp173 CCTK_ATTRIBUTE_UNUSED = tdg4023*xformL32;\n+ \n+ CCTK_REAL csetemp174 CCTK_ATTRIBUTE_UNUSED = tdg4030*xformL02;\n+ \n+ CCTK_REAL csetemp175 CCTK_ATTRIBUTE_UNUSED = tdg4031*xformL12;\n+ \n+ CCTK_REAL csetemp176 CCTK_ATTRIBUTE_UNUSED = tdg4032*xformL22;\n+ \n+ CCTK_REAL csetemp177 CCTK_ATTRIBUTE_UNUSED = tdg4033*xformL32;\n+ \n+ CCTK_REAL csetemp178 CCTK_ATTRIBUTE_UNUSED = tdg4110*xformL02;\n+ \n+ CCTK_REAL csetemp179 CCTK_ATTRIBUTE_UNUSED = tdg4111*xformL12;\n+ \n+ CCTK_REAL csetemp180 CCTK_ATTRIBUTE_UNUSED = tdg4112*xformL22;\n+ \n+ CCTK_REAL csetemp181 CCTK_ATTRIBUTE_UNUSED = tdg4113*xformL32;\n+ \n+ CCTK_REAL csetemp182 CCTK_ATTRIBUTE_UNUSED = tdg4120*xformL02;\n+ \n+ CCTK_REAL csetemp183 CCTK_ATTRIBUTE_UNUSED = tdg4121*xformL12;\n+ \n+ CCTK_REAL csetemp184 CCTK_ATTRIBUTE_UNUSED = tdg4122*xformL22;\n+ \n+ CCTK_REAL csetemp185 CCTK_ATTRIBUTE_UNUSED = tdg4123*xformL32;\n+ \n+ CCTK_REAL csetemp186 CCTK_ATTRIBUTE_UNUSED = tdg4130*xformL02;\n+ \n+ CCTK_REAL csetemp187 CCTK_ATTRIBUTE_UNUSED = tdg4131*xformL12;\n+ \n+ CCTK_REAL csetemp188 CCTK_ATTRIBUTE_UNUSED = tdg4132*xformL22;\n+ \n+ CCTK_REAL csetemp189 CCTK_ATTRIBUTE_UNUSED = tdg4133*xformL32;\n+ \n+ CCTK_REAL csetemp190 CCTK_ATTRIBUTE_UNUSED = tdg4220*xformL02;\n+ \n+ CCTK_REAL csetemp191 CCTK_ATTRIBUTE_UNUSED = tdg4221*xformL12;\n+ \n+ CCTK_REAL csetemp192 CCTK_ATTRIBUTE_UNUSED = tdg4222*xformL22;\n+ \n+ CCTK_REAL csetemp193 CCTK_ATTRIBUTE_UNUSED = tdg4223*xformL32;\n+ \n+ CCTK_REAL csetemp194 CCTK_ATTRIBUTE_UNUSED = tdg4230*xformL02;\n+ \n+ CCTK_REAL csetemp195 CCTK_ATTRIBUTE_UNUSED = tdg4231*xformL12;\n+ \n+ CCTK_REAL csetemp196 CCTK_ATTRIBUTE_UNUSED = tdg4232*xformL22;\n+ \n+ CCTK_REAL csetemp197 CCTK_ATTRIBUTE_UNUSED = tdg4233*xformL32;\n+ \n+ CCTK_REAL csetemp198 CCTK_ATTRIBUTE_UNUSED = tdg4330*xformL02;\n+ \n+ CCTK_REAL csetemp199 CCTK_ATTRIBUTE_UNUSED = tdg4331*xformL12;\n+ \n+ CCTK_REAL csetemp200 CCTK_ATTRIBUTE_UNUSED = tdg4332*xformL22;\n+ \n+ CCTK_REAL csetemp201 CCTK_ATTRIBUTE_UNUSED = tdg4333*xformL32;\n+ \n+ CCTK_REAL dg4012 CCTK_ATTRIBUTE_UNUSED = xformL00*((csetemp162 + \n+ csetemp163 + csetemp164 + csetemp165)*xformL01 + (csetemp166 + \n+ csetemp167 + csetemp168 + csetemp169)*xformL11 + (csetemp170 + \n+ csetemp171 + csetemp172 + csetemp173)*xformL21 + (csetemp174 + \n+ csetemp175 + csetemp176 + csetemp177)*xformL31) + xformL10*((csetemp166 \n+ + csetemp167 + csetemp168 + csetemp169)*xformL01 + (csetemp178 + \n+ csetemp179 + csetemp180 + csetemp181)*xformL11 + (csetemp182 + \n+ csetemp183 + csetemp184 + csetemp185)*xformL21 + (csetemp186 + \n+ csetemp187 + csetemp188 + csetemp189)*xformL31) + xformL20*((csetemp170 \n+ + csetemp171 + csetemp172 + csetemp173)*xformL01 + (csetemp182 + \n+ csetemp183 + csetemp184 + csetemp185)*xformL11 + (csetemp190 + \n+ csetemp191 + csetemp192 + csetemp193)*xformL21 + (csetemp194 + \n+ csetemp195 + csetemp196 + csetemp197)*xformL31) + xformL30*((csetemp174 \n+ + csetemp175 + csetemp176 + csetemp177)*xformL01 + (csetemp186 + \n+ csetemp187 + csetemp188 + csetemp189)*xformL11 + (csetemp194 + \n+ csetemp195 + csetemp196 + csetemp197)*xformL21 + (csetemp198 + \n+ csetemp199 + csetemp200 + csetemp201)*xformL31);\n+ \n+ CCTK_REAL csetemp202 CCTK_ATTRIBUTE_UNUSED = tdg4000*xformL03;\n+ \n+ CCTK_REAL csetemp203 CCTK_ATTRIBUTE_UNUSED = tdg4001*xformL13;\n+ \n+ CCTK_REAL csetemp204 CCTK_ATTRIBUTE_UNUSED = tdg4002*xformL23;\n+ \n+ CCTK_REAL csetemp205 CCTK_ATTRIBUTE_UNUSED = tdg4003*xformL33;\n+ \n+ CCTK_REAL csetemp206 CCTK_ATTRIBUTE_UNUSED = tdg4010*xformL03;\n+ \n+ CCTK_REAL csetemp207 CCTK_ATTRIBUTE_UNUSED = tdg4011*xformL13;\n+ \n+ CCTK_REAL csetemp208 CCTK_ATTRIBUTE_UNUSED = tdg4012*xformL23;\n+ \n+ CCTK_REAL csetemp209 CCTK_ATTRIBUTE_UNUSED = tdg4013*xformL33;\n+ \n+ CCTK_REAL csetemp210 CCTK_ATTRIBUTE_UNUSED = tdg4020*xformL03;\n+ \n+ CCTK_REAL csetemp211 CCTK_ATTRIBUTE_UNUSED = tdg4021*xformL13;\n+ \n+ CCTK_REAL csetemp212 CCTK_ATTRIBUTE_UNUSED = tdg4022*xformL23;\n+ \n+ CCTK_REAL csetemp213 CCTK_ATTRIBUTE_UNUSED = tdg4023*xformL33;\n+ \n+ CCTK_REAL csetemp214 CCTK_ATTRIBUTE_UNUSED = tdg4030*xformL03;\n+ \n+ CCTK_REAL csetemp215 CCTK_ATTRIBUTE_UNUSED = tdg4031*xformL13;\n+ \n+ CCTK_REAL csetemp216 CCTK_ATTRIBUTE_UNUSED = tdg4032*xformL23;\n+ \n+ CCTK_REAL csetemp217 CCTK_ATTRIBUTE_UNUSED = tdg4033*xformL33;\n+ \n+ CCTK_REAL csetemp218 CCTK_ATTRIBUTE_UNUSED = tdg4110*xformL03;\n+ \n+ CCTK_REAL csetemp219 CCTK_ATTRIBUTE_UNUSED = tdg4111*xformL13;\n+ \n+ CCTK_REAL csetemp220 CCTK_ATTRIBUTE_UNUSED = tdg4112*xformL23;\n+ \n+ CCTK_REAL csetemp221 CCTK_ATTRIBUTE_UNUSED = tdg4113*xformL33;\n+ \n+ CCTK_REAL csetemp222 CCTK_ATTRIBUTE_UNUSED = tdg4120*xformL03;\n+ \n+ CCTK_REAL csetemp223 CCTK_ATTRIBUTE_UNUSED = tdg4121*xformL13;\n+ \n+ CCTK_REAL csetemp224 CCTK_ATTRIBUTE_UNUSED = tdg4122*xformL23;\n+ \n+ CCTK_REAL csetemp225 CCTK_ATTRIBUTE_UNUSED = tdg4123*xformL33;\n+ \n+ CCTK_REAL csetemp226 CCTK_ATTRIBUTE_UNUSED = tdg4130*xformL03;\n+ \n+ CCTK_REAL csetemp227 CCTK_ATTRIBUTE_UNUSED = tdg4131*xformL13;\n+ \n+ CCTK_REAL csetemp228 CCTK_ATTRIBUTE_UNUSED = tdg4132*xformL23;\n+ \n+ CCTK_REAL csetemp229 CCTK_ATTRIBUTE_UNUSED = tdg4133*xformL33;\n+ \n+ CCTK_REAL csetemp230 CCTK_ATTRIBUTE_UNUSED = tdg4220*xformL03;\n+ \n+ CCTK_REAL csetemp231 CCTK_ATTRIBUTE_UNUSED = tdg4221*xformL13;\n+ \n+ CCTK_REAL csetemp232 CCTK_ATTRIBUTE_UNUSED = tdg4222*xformL23;\n+ \n+ CCTK_REAL csetemp233 CCTK_ATTRIBUTE_UNUSED = tdg4223*xformL33;\n+ \n+ CCTK_REAL csetemp234 CCTK_ATTRIBUTE_UNUSED = tdg4230*xformL03;\n+ \n+ CCTK_REAL csetemp235 CCTK_ATTRIBUTE_UNUSED = tdg4231*xformL13;\n+ \n+ CCTK_REAL csetemp236 CCTK_ATTRIBUTE_UNUSED = tdg4232*xformL23;\n+ \n+ CCTK_REAL csetemp237 CCTK_ATTRIBUTE_UNUSED = tdg4233*xformL33;\n+ \n+ CCTK_REAL csetemp238 CCTK_ATTRIBUTE_UNUSED = tdg4330*xformL03;\n+ \n+ CCTK_REAL csetemp239 CCTK_ATTRIBUTE_UNUSED = tdg4331*xformL13;\n+ \n+ CCTK_REAL csetemp240 CCTK_ATTRIBUTE_UNUSED = tdg4332*xformL23;\n+ \n+ CCTK_REAL csetemp241 CCTK_ATTRIBUTE_UNUSED = tdg4333*xformL33;\n+ \n+ CCTK_REAL dg4013 CCTK_ATTRIBUTE_UNUSED = xformL00*((csetemp202 + \n+ csetemp203 + csetemp204 + csetemp205)*xformL01 + (csetemp206 + \n+ csetemp207 + csetemp208 + csetemp209)*xformL11 + (csetemp210 + \n+ csetemp211 + csetemp212 + csetemp213)*xformL21 + (csetemp214 + \n+ csetemp215 + csetemp216 + csetemp217)*xformL31) + xformL10*((csetemp206 \n+ + csetemp207 + csetemp208 + csetemp209)*xformL01 + (csetemp218 + \n+ csetemp219 + csetemp220 + csetemp221)*xformL11 + (csetemp222 + \n+ csetemp223 + csetemp224 + csetemp225)*xformL21 + (csetemp226 + \n+ csetemp227 + csetemp228 + csetemp229)*xformL31) + xformL20*((csetemp210 \n+ + csetemp211 + csetemp212 + csetemp213)*xformL01 + (csetemp222 + \n+ csetemp223 + csetemp224 + csetemp225)*xformL11 + (csetemp230 + \n+ csetemp231 + csetemp232 + csetemp233)*xformL21 + (csetemp234 + \n+ csetemp235 + csetemp236 + csetemp237)*xformL31) + xformL30*((csetemp214 \n+ + csetemp215 + csetemp216 + csetemp217)*xformL01 + (csetemp226 + \n+ csetemp227 + csetemp228 + csetemp229)*xformL11 + (csetemp234 + \n+ csetemp235 + csetemp236 + csetemp237)*xformL21 + (csetemp238 + \n+ csetemp239 + csetemp240 + csetemp241)*xformL31);\n+ \n+ CCTK_REAL dg4020 CCTK_ATTRIBUTE_UNUSED = xformL10*((csetemp86 + \n+ csetemp87 + csetemp88 + csetemp89)*xformL02 + (csetemp100 + csetemp101 \n+ + csetemp98 + csetemp99)*xformL12 + (csetemp102 + csetemp103 + \n+ csetemp104 + csetemp105)*xformL22 + (csetemp106 + csetemp107 + \n+ csetemp108 + csetemp109)*xformL32) + xformL20*((csetemp90 + csetemp91 + \n+ csetemp92 + csetemp93)*xformL02 + (csetemp102 + csetemp103 + csetemp104 \n+ + csetemp105)*xformL12 + (csetemp110 + csetemp111 + csetemp112 + \n+ csetemp113)*xformL22 + (csetemp114 + csetemp115 + csetemp116 + \n+ csetemp117)*xformL32) + xformL30*((csetemp94 + csetemp95 + csetemp96 + \n+ csetemp97)*xformL02 + (csetemp106 + csetemp107 + csetemp108 + \n+ csetemp109)*xformL12 + (csetemp114 + csetemp115 + csetemp116 + \n+ csetemp117)*xformL22 + (csetemp118 + csetemp119 + csetemp120 + \n+ csetemp121)*xformL32) + xformL00*((csetemp82 + csetemp83 + csetemp84 + \n+ csetemp85)*xformL02 + (csetemp86 + csetemp87 + csetemp88 + \n+ csetemp89)*xformL12 + (csetemp90 + csetemp91 + csetemp92 + \n+ csetemp93)*xformL22 + (csetemp94 + csetemp95 + csetemp96 + \n+ csetemp97)*xformL32);\n+ \n+ CCTK_REAL dg4021 CCTK_ATTRIBUTE_UNUSED = xformL00*((csetemp122 + \n+ csetemp123 + csetemp124 + csetemp125)*xformL02 + (csetemp126 + \n+ csetemp127 + csetemp128 + csetemp129)*xformL12 + (csetemp130 + \n+ csetemp131 + csetemp132 + csetemp133)*xformL22 + (csetemp134 + \n+ csetemp135 + csetemp136 + csetemp137)*xformL32) + xformL10*((csetemp126 \n+ + csetemp127 + csetemp128 + csetemp129)*xformL02 + (csetemp138 + \n+ csetemp139 + csetemp140 + csetemp141)*xformL12 + (csetemp142 + \n+ csetemp143 + csetemp144 + csetemp145)*xformL22 + (csetemp146 + \n+ csetemp147 + csetemp148 + csetemp149)*xformL32) + xformL20*((csetemp130 \n+ + csetemp131 + csetemp132 + csetemp133)*xformL02 + (csetemp142 + \n+ csetemp143 + csetemp144 + csetemp145)*xformL12 + (csetemp150 + \n+ csetemp151 + csetemp152 + csetemp153)*xformL22 + (csetemp154 + \n+ csetemp155 + csetemp156 + csetemp157)*xformL32) + xformL30*((csetemp134 \n+ + csetemp135 + csetemp136 + csetemp137)*xformL02 + (csetemp146 + \n+ csetemp147 + csetemp148 + csetemp149)*xformL12 + (csetemp154 + \n+ csetemp155 + csetemp156 + csetemp157)*xformL22 + (csetemp158 + \n+ csetemp159 + csetemp160 + csetemp161)*xformL32);\n+ \n+ CCTK_REAL dg4022 CCTK_ATTRIBUTE_UNUSED = xformL00*((csetemp162 + \n+ csetemp163 + csetemp164 + csetemp165)*xformL02 + (csetemp166 + \n+ csetemp167 + csetemp168 + csetemp169)*xformL12 + (csetemp170 + \n+ csetemp171 + csetemp172 + csetemp173)*xformL22 + (csetemp174 + \n+ csetemp175 + csetemp176 + csetemp177)*xformL32) + xformL10*((csetemp166 \n+ + csetemp167 + csetemp168 + csetemp169)*xformL02 + (csetemp178 + \n+ csetemp179 + csetemp180 + csetemp181)*xformL12 + (csetemp182 + \n+ csetemp183 + csetemp184 + csetemp185)*xformL22 + (csetemp186 + \n+ csetemp187 + csetemp188 + csetemp189)*xformL32) + xformL20*((csetemp170 \n+ + csetemp171 + csetemp172 + csetemp173)*xformL02 + (csetemp182 + \n+ csetemp183 + csetemp184 + csetemp185)*xformL12 + (csetemp190 + \n+ csetemp191 + csetemp192 + csetemp193)*xformL22 + (csetemp194 + \n+ csetemp195 + csetemp196 + csetemp197)*xformL32) + xformL30*((csetemp174 \n+ + csetemp175 + csetemp176 + csetemp177)*xformL02 + (csetemp186 + \n+ csetemp187 + csetemp188 + csetemp189)*xformL12 + (csetemp194 + \n+ csetemp195 + csetemp196 + csetemp197)*xformL22 + (csetemp198 + \n+ csetemp199 + csetemp200 + csetemp201)*xformL32);\n+ \n+ CCTK_REAL dg4023 CCTK_ATTRIBUTE_UNUSED = xformL00*((csetemp202 + \n+ csetemp203 + csetemp204 + csetemp205)*xformL02 + (csetemp206 + \n+ csetemp207 + csetemp208 + csetemp209)*xformL12 + (csetemp210 + \n+ csetemp211 + csetemp212 + csetemp213)*xformL22 + (csetemp214 + \n+ csetemp215 + csetemp216 + csetemp217)*xformL32) + xformL10*((csetemp206 \n+ + csetemp207 + csetemp208 + csetemp209)*xformL02 + (csetemp218 + \n+ csetemp219 + csetemp220 + csetemp221)*xformL12 + (csetemp222 + \n+ csetemp223 + csetemp224 + csetemp225)*xformL22 + (csetemp226 + \n+ csetemp227 + csetemp228 + csetemp229)*xformL32) + xformL20*((csetemp210 \n+ + csetemp211 + csetemp212 + csetemp213)*xformL02 + (csetemp222 + \n+ csetemp223 + csetemp224 + csetemp225)*xformL12 + (csetemp230 + \n+ csetemp231 + csetemp232 + csetemp233)*xformL22 + (csetemp234 + \n+ csetemp235 + csetemp236 + csetemp237)*xformL32) + xformL30*((csetemp214 \n+ + csetemp215 + csetemp216 + csetemp217)*xformL02 + (csetemp226 + \n+ csetemp227 + csetemp228 + csetemp229)*xformL12 + (csetemp234 + \n+ csetemp235 + csetemp236 + csetemp237)*xformL22 + (csetemp238 + \n+ csetemp239 + csetemp240 + csetemp241)*xformL32);\n+ \n+ CCTK_REAL dg4030 CCTK_ATTRIBUTE_UNUSED = xformL10*((csetemp86 + \n+ csetemp87 + csetemp88 + csetemp89)*xformL03 + (csetemp100 + csetemp101 \n+ + csetemp98 + csetemp99)*xformL13 + (csetemp102 + csetemp103 + \n+ csetemp104 + csetemp105)*xformL23 + (csetemp106 + csetemp107 + \n+ csetemp108 + csetemp109)*xformL33) + xformL20*((csetemp90 + csetemp91 + \n+ csetemp92 + csetemp93)*xformL03 + (csetemp102 + csetemp103 + csetemp104 \n+ + csetemp105)*xformL13 + (csetemp110 + csetemp111 + csetemp112 + \n+ csetemp113)*xformL23 + (csetemp114 + csetemp115 + csetemp116 + \n+ csetemp117)*xformL33) + xformL30*((csetemp94 + csetemp95 + csetemp96 + \n+ csetemp97)*xformL03 + (csetemp106 + csetemp107 + csetemp108 + \n+ csetemp109)*xformL13 + (csetemp114 + csetemp115 + csetemp116 + \n+ csetemp117)*xformL23 + (csetemp118 + csetemp119 + csetemp120 + \n+ csetemp121)*xformL33) + xformL00*((csetemp82 + csetemp83 + csetemp84 + \n+ csetemp85)*xformL03 + (csetemp86 + csetemp87 + csetemp88 + \n+ csetemp89)*xformL13 + (csetemp90 + csetemp91 + csetemp92 + \n+ csetemp93)*xformL23 + (csetemp94 + csetemp95 + csetemp96 + \n+ csetemp97)*xformL33);\n+ \n+ CCTK_REAL dg4031 CCTK_ATTRIBUTE_UNUSED = xformL00*((csetemp122 + \n+ csetemp123 + csetemp124 + csetemp125)*xformL03 + (csetemp126 + \n+ csetemp127 + csetemp128 + csetemp129)*xformL13 + (csetemp130 + \n+ csetemp131 + csetemp132 + csetemp133)*xformL23 + (csetemp134 + \n+ csetemp135 + csetemp136 + csetemp137)*xformL33) + xformL10*((csetemp126 \n+ + csetemp127 + csetemp128 + csetemp129)*xformL03 + (csetemp138 + \n+ csetemp139 + csetemp140 + csetemp141)*xformL13 + (csetemp142 + \n+ csetemp143 + csetemp144 + csetemp145)*xformL23 + (csetemp146 + \n+ csetemp147 + csetemp148 + csetemp149)*xformL33) + xformL20*((csetemp130 \n+ + csetemp131 + csetemp132 + csetemp133)*xformL03 + (csetemp142 + \n+ csetemp143 + csetemp144 + csetemp145)*xformL13 + (csetemp150 + \n+ csetemp151 + csetemp152 + csetemp153)*xformL23 + (csetemp154 + \n+ csetemp155 + csetemp156 + csetemp157)*xformL33) + xformL30*((csetemp134 \n+ + csetemp135 + csetemp136 + csetemp137)*xformL03 + (csetemp146 + \n+ csetemp147 + csetemp148 + csetemp149)*xformL13 + (csetemp154 + \n+ csetemp155 + csetemp156 + csetemp157)*xformL23 + (csetemp158 + \n+ csetemp159 + csetemp160 + csetemp161)*xformL33);\n+ \n+ CCTK_REAL dg4032 CCTK_ATTRIBUTE_UNUSED = xformL00*((csetemp162 + \n+ csetemp163 + csetemp164 + csetemp165)*xformL03 + (csetemp166 + \n+ csetemp167 + csetemp168 + csetemp169)*xformL13 + (csetemp170 + \n+ csetemp171 + csetemp172 + csetemp173)*xformL23 + (csetemp174 + \n+ csetemp175 + csetemp176 + csetemp177)*xformL33) + xformL10*((csetemp166 \n+ + csetemp167 + csetemp168 + csetemp169)*xformL03 + (csetemp178 + \n+ csetemp179 + csetemp180 + csetemp181)*xformL13 + (csetemp182 + \n+ csetemp183 + csetemp184 + csetemp185)*xformL23 + (csetemp186 + \n+ csetemp187 + csetemp188 + csetemp189)*xformL33) + xformL20*((csetemp170 \n+ + csetemp171 + csetemp172 + csetemp173)*xformL03 + (csetemp182 + \n+ csetemp183 + csetemp184 + csetemp185)*xformL13 + (csetemp190 + \n+ csetemp191 + csetemp192 + csetemp193)*xformL23 + (csetemp194 + \n+ csetemp195 + csetemp196 + csetemp197)*xformL33) + xformL30*((csetemp174 \n+ + csetemp175 + csetemp176 + csetemp177)*xformL03 + (csetemp186 + \n+ csetemp187 + csetemp188 + csetemp189)*xformL13 + (csetemp194 + \n+ csetemp195 + csetemp196 + csetemp197)*xformL23 + (csetemp198 + \n+ csetemp199 + csetemp200 + csetemp201)*xformL33);\n+ \n+ CCTK_REAL dg4033 CCTK_ATTRIBUTE_UNUSED = xformL00*((csetemp202 + \n+ csetemp203 + csetemp204 + csetemp205)*xformL03 + (csetemp206 + \n+ csetemp207 + csetemp208 + csetemp209)*xformL13 + (csetemp210 + \n+ csetemp211 + csetemp212 + csetemp213)*xformL23 + (csetemp214 + \n+ csetemp215 + csetemp216 + csetemp217)*xformL33) + xformL10*((csetemp206 \n+ + csetemp207 + csetemp208 + csetemp209)*xformL03 + (csetemp218 + \n+ csetemp219 + csetemp220 + csetemp221)*xformL13 + (csetemp222 + \n+ csetemp223 + csetemp224 + csetemp225)*xformL23 + (csetemp226 + \n+ csetemp227 + csetemp228 + csetemp229)*xformL33) + xformL20*((csetemp210 \n+ + csetemp211 + csetemp212 + csetemp213)*xformL03 + (csetemp222 + \n+ csetemp223 + csetemp224 + csetemp225)*xformL13 + (csetemp230 + \n+ csetemp231 + csetemp232 + csetemp233)*xformL23 + (csetemp234 + \n+ csetemp235 + csetemp236 + csetemp237)*xformL33) + xformL30*((csetemp214 \n+ + csetemp215 + csetemp216 + csetemp217)*xformL03 + (csetemp226 + \n+ csetemp227 + csetemp228 + csetemp229)*xformL13 + (csetemp234 + \n+ csetemp235 + csetemp236 + csetemp237)*xformL23 + (csetemp238 + \n+ csetemp239 + csetemp240 + csetemp241)*xformL33);\n+ \n+ CCTK_REAL dg4110 CCTK_ATTRIBUTE_UNUSED = xformL11*((csetemp86 + \n+ csetemp87 + csetemp88 + csetemp89)*xformL01 + (csetemp100 + csetemp101 \n+ + csetemp98 + csetemp99)*xformL11 + (csetemp102 + csetemp103 + \n+ csetemp104 + csetemp105)*xformL21 + (csetemp106 + csetemp107 + \n+ csetemp108 + csetemp109)*xformL31) + xformL21*((csetemp90 + csetemp91 + \n+ csetemp92 + csetemp93)*xformL01 + (csetemp102 + csetemp103 + csetemp104 \n+ + csetemp105)*xformL11 + (csetemp110 + csetemp111 + csetemp112 + \n+ csetemp113)*xformL21 + (csetemp114 + csetemp115 + csetemp116 + \n+ csetemp117)*xformL31) + xformL31*((csetemp94 + csetemp95 + csetemp96 + \n+ csetemp97)*xformL01 + (csetemp106 + csetemp107 + csetemp108 + \n+ csetemp109)*xformL11 + (csetemp114 + csetemp115 + csetemp116 + \n+ csetemp117)*xformL21 + (csetemp118 + csetemp119 + csetemp120 + \n+ csetemp121)*xformL31) + xformL01*((csetemp82 + csetemp83 + csetemp84 + \n+ csetemp85)*xformL01 + (csetemp86 + csetemp87 + csetemp88 + \n+ csetemp89)*xformL11 + (csetemp90 + csetemp91 + csetemp92 + \n+ csetemp93)*xformL21 + (csetemp94 + csetemp95 + csetemp96 + \n+ csetemp97)*xformL31);\n+ \n+ CCTK_REAL dg4111 CCTK_ATTRIBUTE_UNUSED = xformL01*((csetemp122 + \n+ csetemp123 + csetemp124 + csetemp125)*xformL01 + (csetemp126 + \n+ csetemp127 + csetemp128 + csetemp129)*xformL11 + (csetemp130 + \n+ csetemp131 + csetemp132 + csetemp133)*xformL21 + (csetemp134 + \n+ csetemp135 + csetemp136 + csetemp137)*xformL31) + xformL11*((csetemp126 \n+ + csetemp127 + csetemp128 + csetemp129)*xformL01 + (csetemp138 + \n+ csetemp139 + csetemp140 + csetemp141)*xformL11 + (csetemp142 + \n+ csetemp143 + csetemp144 + csetemp145)*xformL21 + (csetemp146 + \n+ csetemp147 + csetemp148 + csetemp149)*xformL31) + xformL21*((csetemp130 \n+ + csetemp131 + csetemp132 + csetemp133)*xformL01 + (csetemp142 + \n+ csetemp143 + csetemp144 + csetemp145)*xformL11 + (csetemp150 + \n+ csetemp151 + csetemp152 + csetemp153)*xformL21 + (csetemp154 + \n+ csetemp155 + csetemp156 + csetemp157)*xformL31) + xformL31*((csetemp134 \n+ + csetemp135 + csetemp136 + csetemp137)*xformL01 + (csetemp146 + \n+ csetemp147 + csetemp148 + csetemp149)*xformL11 + (csetemp154 + \n+ csetemp155 + csetemp156 + csetemp157)*xformL21 + (csetemp158 + \n+ csetemp159 + csetemp160 + csetemp161)*xformL31);\n+ \n+ CCTK_REAL dg4112 CCTK_ATTRIBUTE_UNUSED = xformL01*((csetemp162 + \n+ csetemp163 + csetemp164 + csetemp165)*xformL01 + (csetemp166 + \n+ csetemp167 + csetemp168 + csetemp169)*xformL11 + (csetemp170 + \n+ csetemp171 + csetemp172 + csetemp173)*xformL21 + (csetemp174 + \n+ csetemp175 + csetemp176 + csetemp177)*xformL31) + xformL11*((csetemp166 \n+ + csetemp167 + csetemp168 + csetemp169)*xformL01 + (csetemp178 + \n+ csetemp179 + csetemp180 + csetemp181)*xformL11 + (csetemp182 + \n+ csetemp183 + csetemp184 + csetemp185)*xformL21 + (csetemp186 + \n+ csetemp187 + csetemp188 + csetemp189)*xformL31) + xformL21*((csetemp170 \n+ + csetemp171 + csetemp172 + csetemp173)*xformL01 + (csetemp182 + \n+ csetemp183 + csetemp184 + csetemp185)*xformL11 + (csetemp190 + \n+ csetemp191 + csetemp192 + csetemp193)*xformL21 + (csetemp194 + \n+ csetemp195 + csetemp196 + csetemp197)*xformL31) + xformL31*((csetemp174 \n+ + csetemp175 + csetemp176 + csetemp177)*xformL01 + (csetemp186 + \n+ csetemp187 + csetemp188 + csetemp189)*xformL11 + (csetemp194 + \n+ csetemp195 + csetemp196 + csetemp197)*xformL21 + (csetemp198 + \n+ csetemp199 + csetemp200 + csetemp201)*xformL31);\n+ \n+ CCTK_REAL dg4113 CCTK_ATTRIBUTE_UNUSED = xformL01*((csetemp202 + \n+ csetemp203 + csetemp204 + csetemp205)*xformL01 + (csetemp206 + \n+ csetemp207 + csetemp208 + csetemp209)*xformL11 + (csetemp210 + \n+ csetemp211 + csetemp212 + csetemp213)*xformL21 + (csetemp214 + \n+ csetemp215 + csetemp216 + csetemp217)*xformL31) + xformL11*((csetemp206 \n+ + csetemp207 + csetemp208 + csetemp209)*xformL01 + (csetemp218 + \n+ csetemp219 + csetemp220 + csetemp221)*xformL11 + (csetemp222 + \n+ csetemp223 + csetemp224 + csetemp225)*xformL21 + (csetemp226 + \n+ csetemp227 + csetemp228 + csetemp229)*xformL31) + xformL21*((csetemp210 \n+ + csetemp211 + csetemp212 + csetemp213)*xformL01 + (csetemp222 + \n+ csetemp223 + csetemp224 + csetemp225)*xformL11 + (csetemp230 + \n+ csetemp231 + csetemp232 + csetemp233)*xformL21 + (csetemp234 + \n+ csetemp235 + csetemp236 + csetemp237)*xformL31) + xformL31*((csetemp214 \n+ + csetemp215 + csetemp216 + csetemp217)*xformL01 + (csetemp226 + \n+ csetemp227 + csetemp228 + csetemp229)*xformL11 + (csetemp234 + \n+ csetemp235 + csetemp236 + csetemp237)*xformL21 + (csetemp238 + \n+ csetemp239 + csetemp240 + csetemp241)*xformL31);\n+ \n+ CCTK_REAL dg4120 CCTK_ATTRIBUTE_UNUSED = xformL11*((csetemp86 + \n+ csetemp87 + csetemp88 + csetemp89)*xformL02 + (csetemp100 + csetemp101 \n+ + csetemp98 + csetemp99)*xformL12 + (csetemp102 + csetemp103 + \n+ csetemp104 + csetemp105)*xformL22 + (csetemp106 + csetemp107 + \n+ csetemp108 + csetemp109)*xformL32) + xformL21*((csetemp90 + csetemp91 + \n+ csetemp92 + csetemp93)*xformL02 + (csetemp102 + csetemp103 + csetemp104 \n+ + csetemp105)*xformL12 + (csetemp110 + csetemp111 + csetemp112 + \n+ csetemp113)*xformL22 + (csetemp114 + csetemp115 + csetemp116 + \n+ csetemp117)*xformL32) + xformL31*((csetemp94 + csetemp95 + csetemp96 + \n+ csetemp97)*xformL02 + (csetemp106 + csetemp107 + csetemp108 + \n+ csetemp109)*xformL12 + (csetemp114 + csetemp115 + csetemp116 + \n+ csetemp117)*xformL22 + (csetemp118 + csetemp119 + csetemp120 + \n+ csetemp121)*xformL32) + xformL01*((csetemp82 + csetemp83 + csetemp84 + \n+ csetemp85)*xformL02 + (csetemp86 + csetemp87 + csetemp88 + \n+ csetemp89)*xformL12 + (csetemp90 + csetemp91 + csetemp92 + \n+ csetemp93)*xformL22 + (csetemp94 + csetemp95 + csetemp96 + \n+ csetemp97)*xformL32);\n+ \n+ CCTK_REAL dg4121 CCTK_ATTRIBUTE_UNUSED = xformL01*((csetemp122 + \n+ csetemp123 + csetemp124 + csetemp125)*xformL02 + (csetemp126 + \n+ csetemp127 + csetemp128 + csetemp129)*xformL12 + (csetemp130 + \n+ csetemp131 + csetemp132 + csetemp133)*xformL22 + (csetemp134 + \n+ csetemp135 + csetemp136 + csetemp137)*xformL32) + xformL11*((csetemp126 \n+ + csetemp127 + csetemp128 + csetemp129)*xformL02 + (csetemp138 + \n+ csetemp139 + csetemp140 + csetemp141)*xformL12 + (csetemp142 + \n+ csetemp143 + csetemp144 + csetemp145)*xformL22 + (csetemp146 + \n+ csetemp147 + csetemp148 + csetemp149)*xformL32) + xformL21*((csetemp130 \n+ + csetemp131 + csetemp132 + csetemp133)*xformL02 + (csetemp142 + \n+ csetemp143 + csetemp144 + csetemp145)*xformL12 + (csetemp150 + \n+ csetemp151 + csetemp152 + csetemp153)*xformL22 + (csetemp154 + \n+ csetemp155 + csetemp156 + csetemp157)*xformL32) + xformL31*((csetemp134 \n+ + csetemp135 + csetemp136 + csetemp137)*xformL02 + (csetemp146 + \n+ csetemp147 + csetemp148 + csetemp149)*xformL12 + (csetemp154 + \n+ csetemp155 + csetemp156 + csetemp157)*xformL22 + (csetemp158 + \n+ csetemp159 + csetemp160 + csetemp161)*xformL32);\n+ \n+ CCTK_REAL dg4122 CCTK_ATTRIBUTE_UNUSED = xformL01*((csetemp162 + \n+ csetemp163 + csetemp164 + csetemp165)*xformL02 + (csetemp166 + \n+ csetemp167 + csetemp168 + csetemp169)*xformL12 + (csetemp170 + \n+ csetemp171 + csetemp172 + csetemp173)*xformL22 + (csetemp174 + \n+ csetemp175 + csetemp176 + csetemp177)*xformL32) + xformL11*((csetemp166 \n+ + csetemp167 + csetemp168 + csetemp169)*xformL02 + (csetemp178 + \n+ csetemp179 + csetemp180 + csetemp181)*xformL12 + (csetemp182 + \n+ csetemp183 + csetemp184 + csetemp185)*xformL22 + (csetemp186 + \n+ csetemp187 + csetemp188 + csetemp189)*xformL32) + xformL21*((csetemp170 \n+ + csetemp171 + csetemp172 + csetemp173)*xformL02 + (csetemp182 + \n+ csetemp183 + csetemp184 + csetemp185)*xformL12 + (csetemp190 + \n+ csetemp191 + csetemp192 + csetemp193)*xformL22 + (csetemp194 + \n+ csetemp195 + csetemp196 + csetemp197)*xformL32) + xformL31*((csetemp174 \n+ + csetemp175 + csetemp176 + csetemp177)*xformL02 + (csetemp186 + \n+ csetemp187 + csetemp188 + csetemp189)*xformL12 + (csetemp194 + \n+ csetemp195 + csetemp196 + csetemp197)*xformL22 + (csetemp198 + \n+ csetemp199 + csetemp200 + csetemp201)*xformL32);\n+ \n+ CCTK_REAL dg4123 CCTK_ATTRIBUTE_UNUSED = xformL01*((csetemp202 + \n+ csetemp203 + csetemp204 + csetemp205)*xformL02 + (csetemp206 + \n+ csetemp207 + csetemp208 + csetemp209)*xformL12 + (csetemp210 + \n+ csetemp211 + csetemp212 + csetemp213)*xformL22 + (csetemp214 + \n+ csetemp215 + csetemp216 + csetemp217)*xformL32) + xformL11*((csetemp206 \n+ + csetemp207 + csetemp208 + csetemp209)*xformL02 + (csetemp218 + \n+ csetemp219 + csetemp220 + csetemp221)*xformL12 + (csetemp222 + \n+ csetemp223 + csetemp224 + csetemp225)*xformL22 + (csetemp226 + \n+ csetemp227 + csetemp228 + csetemp229)*xformL32) + xformL21*((csetemp210 \n+ + csetemp211 + csetemp212 + csetemp213)*xformL02 + (csetemp222 + \n+ csetemp223 + csetemp224 + csetemp225)*xformL12 + (csetemp230 + \n+ csetemp231 + csetemp232 + csetemp233)*xformL22 + (csetemp234 + \n+ csetemp235 + csetemp236 + csetemp237)*xformL32) + xformL31*((csetemp214 \n+ + csetemp215 + csetemp216 + csetemp217)*xformL02 + (csetemp226 + \n+ csetemp227 + csetemp228 + csetemp229)*xformL12 + (csetemp234 + \n+ csetemp235 + csetemp236 + csetemp237)*xformL22 + (csetemp238 + \n+ csetemp239 + csetemp240 + csetemp241)*xformL32);\n+ \n+ CCTK_REAL dg4130 CCTK_ATTRIBUTE_UNUSED = xformL11*((csetemp86 + \n+ csetemp87 + csetemp88 + csetemp89)*xformL03 + (csetemp100 + csetemp101 \n+ + csetemp98 + csetemp99)*xformL13 + (csetemp102 + csetemp103 + \n+ csetemp104 + csetemp105)*xformL23 + (csetemp106 + csetemp107 + \n+ csetemp108 + csetemp109)*xformL33) + xformL21*((csetemp90 + csetemp91 + \n+ csetemp92 + csetemp93)*xformL03 + (csetemp102 + csetemp103 + csetemp104 \n+ + csetemp105)*xformL13 + (csetemp110 + csetemp111 + csetemp112 + \n+ csetemp113)*xformL23 + (csetemp114 + csetemp115 + csetemp116 + \n+ csetemp117)*xformL33) + xformL31*((csetemp94 + csetemp95 + csetemp96 + \n+ csetemp97)*xformL03 + (csetemp106 + csetemp107 + csetemp108 + \n+ csetemp109)*xformL13 + (csetemp114 + csetemp115 + csetemp116 + \n+ csetemp117)*xformL23 + (csetemp118 + csetemp119 + csetemp120 + \n+ csetemp121)*xformL33) + xformL01*((csetemp82 + csetemp83 + csetemp84 + \n+ csetemp85)*xformL03 + (csetemp86 + csetemp87 + csetemp88 + \n+ csetemp89)*xformL13 + (csetemp90 + csetemp91 + csetemp92 + \n+ csetemp93)*xformL23 + (csetemp94 + csetemp95 + csetemp96 + \n+ csetemp97)*xformL33);\n+ \n+ CCTK_REAL dg4131 CCTK_ATTRIBUTE_UNUSED = xformL01*((csetemp122 + \n+ csetemp123 + csetemp124 + csetemp125)*xformL03 + (csetemp126 + \n+ csetemp127 + csetemp128 + csetemp129)*xformL13 + (csetemp130 + \n+ csetemp131 + csetemp132 + csetemp133)*xformL23 + (csetemp134 + \n+ csetemp135 + csetemp136 + csetemp137)*xformL33) + xformL11*((csetemp126 \n+ + csetemp127 + csetemp128 + csetemp129)*xformL03 + (csetemp138 + \n+ csetemp139 + csetemp140 + csetemp141)*xformL13 + (csetemp142 + \n+ csetemp143 + csetemp144 + csetemp145)*xformL23 + (csetemp146 + \n+ csetemp147 + csetemp148 + csetemp149)*xformL33) + xformL21*((csetemp130 \n+ + csetemp131 + csetemp132 + csetemp133)*xformL03 + (csetemp142 + \n+ csetemp143 + csetemp144 + csetemp145)*xformL13 + (csetemp150 + \n+ csetemp151 + csetemp152 + csetemp153)*xformL23 + (csetemp154 + \n+ csetemp155 + csetemp156 + csetemp157)*xformL33) + xformL31*((csetemp134 \n+ + csetemp135 + csetemp136 + csetemp137)*xformL03 + (csetemp146 + \n+ csetemp147 + csetemp148 + csetemp149)*xformL13 + (csetemp154 + \n+ csetemp155 + csetemp156 + csetemp157)*xformL23 + (csetemp158 + \n+ csetemp159 + csetemp160 + csetemp161)*xformL33);\n+ \n+ CCTK_REAL dg4132 CCTK_ATTRIBUTE_UNUSED = xformL01*((csetemp162 + \n+ csetemp163 + csetemp164 + csetemp165)*xformL03 + (csetemp166 + \n+ csetemp167 + csetemp168 + csetemp169)*xformL13 + (csetemp170 + \n+ csetemp171 + csetemp172 + csetemp173)*xformL23 + (csetemp174 + \n+ csetemp175 + csetemp176 + csetemp177)*xformL33) + xformL11*((csetemp166 \n+ + csetemp167 + csetemp168 + csetemp169)*xformL03 + (csetemp178 + \n+ csetemp179 + csetemp180 + csetemp181)*xformL13 + (csetemp182 + \n+ csetemp183 + csetemp184 + csetemp185)*xformL23 + (csetemp186 + \n+ csetemp187 + csetemp188 + csetemp189)*xformL33) + xformL21*((csetemp170 \n+ + csetemp171 + csetemp172 + csetemp173)*xformL03 + (csetemp182 + \n+ csetemp183 + csetemp184 + csetemp185)*xformL13 + (csetemp190 + \n+ csetemp191 + csetemp192 + csetemp193)*xformL23 + (csetemp194 + \n+ csetemp195 + csetemp196 + csetemp197)*xformL33) + xformL31*((csetemp174 \n+ + csetemp175 + csetemp176 + csetemp177)*xformL03 + (csetemp186 + \n+ csetemp187 + csetemp188 + csetemp189)*xformL13 + (csetemp194 + \n+ csetemp195 + csetemp196 + csetemp197)*xformL23 + (csetemp198 + \n+ csetemp199 + csetemp200 + csetemp201)*xformL33);\n+ \n+ CCTK_REAL dg4133 CCTK_ATTRIBUTE_UNUSED = xformL01*((csetemp202 + \n+ csetemp203 + csetemp204 + csetemp205)*xformL03 + (csetemp206 + \n+ csetemp207 + csetemp208 + csetemp209)*xformL13 + (csetemp210 + \n+ csetemp211 + csetemp212 + csetemp213)*xformL23 + (csetemp214 + \n+ csetemp215 + csetemp216 + csetemp217)*xformL33) + xformL11*((csetemp206 \n+ + csetemp207 + csetemp208 + csetemp209)*xformL03 + (csetemp218 + \n+ csetemp219 + csetemp220 + csetemp221)*xformL13 + (csetemp222 + \n+ csetemp223 + csetemp224 + csetemp225)*xformL23 + (csetemp226 + \n+ csetemp227 + csetemp228 + csetemp229)*xformL33) + xformL21*((csetemp210 \n+ + csetemp211 + csetemp212 + csetemp213)*xformL03 + (csetemp222 + \n+ csetemp223 + csetemp224 + csetemp225)*xformL13 + (csetemp230 + \n+ csetemp231 + csetemp232 + csetemp233)*xformL23 + (csetemp234 + \n+ csetemp235 + csetemp236 + csetemp237)*xformL33) + xformL31*((csetemp214 \n+ + csetemp215 + csetemp216 + csetemp217)*xformL03 + (csetemp226 + \n+ csetemp227 + csetemp228 + csetemp229)*xformL13 + (csetemp234 + \n+ csetemp235 + csetemp236 + csetemp237)*xformL23 + (csetemp238 + \n+ csetemp239 + csetemp240 + csetemp241)*xformL33);\n+ \n+ CCTK_REAL dg4220 CCTK_ATTRIBUTE_UNUSED = xformL12*((csetemp86 + \n+ csetemp87 + csetemp88 + csetemp89)*xformL02 + (csetemp100 + csetemp101 \n+ + csetemp98 + csetemp99)*xformL12 + (csetemp102 + csetemp103 + \n+ csetemp104 + csetemp105)*xformL22 + (csetemp106 + csetemp107 + \n+ csetemp108 + csetemp109)*xformL32) + xformL22*((csetemp90 + csetemp91 + \n+ csetemp92 + csetemp93)*xformL02 + (csetemp102 + csetemp103 + csetemp104 \n+ + csetemp105)*xformL12 + (csetemp110 + csetemp111 + csetemp112 + \n+ csetemp113)*xformL22 + (csetemp114 + csetemp115 + csetemp116 + \n+ csetemp117)*xformL32) + xformL32*((csetemp94 + csetemp95 + csetemp96 + \n+ csetemp97)*xformL02 + (csetemp106 + csetemp107 + csetemp108 + \n+ csetemp109)*xformL12 + (csetemp114 + csetemp115 + csetemp116 + \n+ csetemp117)*xformL22 + (csetemp118 + csetemp119 + csetemp120 + \n+ csetemp121)*xformL32) + xformL02*((csetemp82 + csetemp83 + csetemp84 + \n+ csetemp85)*xformL02 + (csetemp86 + csetemp87 + csetemp88 + \n+ csetemp89)*xformL12 + (csetemp90 + csetemp91 + csetemp92 + \n+ csetemp93)*xformL22 + (csetemp94 + csetemp95 + csetemp96 + \n+ csetemp97)*xformL32);\n+ \n+ CCTK_REAL dg4221 CCTK_ATTRIBUTE_UNUSED = xformL02*((csetemp122 + \n+ csetemp123 + csetemp124 + csetemp125)*xformL02 + (csetemp126 + \n+ csetemp127 + csetemp128 + csetemp129)*xformL12 + (csetemp130 + \n+ csetemp131 + csetemp132 + csetemp133)*xformL22 + (csetemp134 + \n+ csetemp135 + csetemp136 + csetemp137)*xformL32) + xformL12*((csetemp126 \n+ + csetemp127 + csetemp128 + csetemp129)*xformL02 + (csetemp138 + \n+ csetemp139 + csetemp140 + csetemp141)*xformL12 + (csetemp142 + \n+ csetemp143 + csetemp144 + csetemp145)*xformL22 + (csetemp146 + \n+ csetemp147 + csetemp148 + csetemp149)*xformL32) + xformL22*((csetemp130 \n+ + csetemp131 + csetemp132 + csetemp133)*xformL02 + (csetemp142 + \n+ csetemp143 + csetemp144 + csetemp145)*xformL12 + (csetemp150 + \n+ csetemp151 + csetemp152 + csetemp153)*xformL22 + (csetemp154 + \n+ csetemp155 + csetemp156 + csetemp157)*xformL32) + xformL32*((csetemp134 \n+ + csetemp135 + csetemp136 + csetemp137)*xformL02 + (csetemp146 + \n+ csetemp147 + csetemp148 + csetemp149)*xformL12 + (csetemp154 + \n+ csetemp155 + csetemp156 + csetemp157)*xformL22 + (csetemp158 + \n+ csetemp159 + csetemp160 + csetemp161)*xformL32);\n+ \n+ CCTK_REAL dg4222 CCTK_ATTRIBUTE_UNUSED = xformL02*((csetemp162 + \n+ csetemp163 + csetemp164 + csetemp165)*xformL02 + (csetemp166 + \n+ csetemp167 + csetemp168 + csetemp169)*xformL12 + (csetemp170 + \n+ csetemp171 + csetemp172 + csetemp173)*xformL22 + (csetemp174 + \n+ csetemp175 + csetemp176 + csetemp177)*xformL32) + xformL12*((csetemp166 \n+ + csetemp167 + csetemp168 + csetemp169)*xformL02 + (csetemp178 + \n+ csetemp179 + csetemp180 + csetemp181)*xformL12 + (csetemp182 + \n+ csetemp183 + csetemp184 + csetemp185)*xformL22 + (csetemp186 + \n+ csetemp187 + csetemp188 + csetemp189)*xformL32) + xformL22*((csetemp170 \n+ + csetemp171 + csetemp172 + csetemp173)*xformL02 + (csetemp182 + \n+ csetemp183 + csetemp184 + csetemp185)*xformL12 + (csetemp190 + \n+ csetemp191 + csetemp192 + csetemp193)*xformL22 + (csetemp194 + \n+ csetemp195 + csetemp196 + csetemp197)*xformL32) + xformL32*((csetemp174 \n+ + csetemp175 + csetemp176 + csetemp177)*xformL02 + (csetemp186 + \n+ csetemp187 + csetemp188 + csetemp189)*xformL12 + (csetemp194 + \n+ csetemp195 + csetemp196 + csetemp197)*xformL22 + (csetemp198 + \n+ csetemp199 + csetemp200 + csetemp201)*xformL32);\n+ \n+ CCTK_REAL dg4223 CCTK_ATTRIBUTE_UNUSED = xformL02*((csetemp202 + \n+ csetemp203 + csetemp204 + csetemp205)*xformL02 + (csetemp206 + \n+ csetemp207 + csetemp208 + csetemp209)*xformL12 + (csetemp210 + \n+ csetemp211 + csetemp212 + csetemp213)*xformL22 + (csetemp214 + \n+ csetemp215 + csetemp216 + csetemp217)*xformL32) + xformL12*((csetemp206 \n+ + csetemp207 + csetemp208 + csetemp209)*xformL02 + (csetemp218 + \n+ csetemp219 + csetemp220 + csetemp221)*xformL12 + (csetemp222 + \n+ csetemp223 + csetemp224 + csetemp225)*xformL22 + (csetemp226 + \n+ csetemp227 + csetemp228 + csetemp229)*xformL32) + xformL22*((csetemp210 \n+ + csetemp211 + csetemp212 + csetemp213)*xformL02 + (csetemp222 + \n+ csetemp223 + csetemp224 + csetemp225)*xformL12 + (csetemp230 + \n+ csetemp231 + csetemp232 + csetemp233)*xformL22 + (csetemp234 + \n+ csetemp235 + csetemp236 + csetemp237)*xformL32) + xformL32*((csetemp214 \n+ + csetemp215 + csetemp216 + csetemp217)*xformL02 + (csetemp226 + \n+ csetemp227 + csetemp228 + csetemp229)*xformL12 + (csetemp234 + \n+ csetemp235 + csetemp236 + csetemp237)*xformL22 + (csetemp238 + \n+ csetemp239 + csetemp240 + csetemp241)*xformL32);\n+ \n+ CCTK_REAL dg4230 CCTK_ATTRIBUTE_UNUSED = xformL12*((csetemp86 + \n+ csetemp87 + csetemp88 + csetemp89)*xformL03 + (csetemp100 + csetemp101 \n+ + csetemp98 + csetemp99)*xformL13 + (csetemp102 + csetemp103 + \n+ csetemp104 + csetemp105)*xformL23 + (csetemp106 + csetemp107 + \n+ csetemp108 + csetemp109)*xformL33) + xformL22*((csetemp90 + csetemp91 + \n+ csetemp92 + csetemp93)*xformL03 + (csetemp102 + csetemp103 + csetemp104 \n+ + csetemp105)*xformL13 + (csetemp110 + csetemp111 + csetemp112 + \n+ csetemp113)*xformL23 + (csetemp114 + csetemp115 + csetemp116 + \n+ csetemp117)*xformL33) + xformL32*((csetemp94 + csetemp95 + csetemp96 + \n+ csetemp97)*xformL03 + (csetemp106 + csetemp107 + csetemp108 + \n+ csetemp109)*xformL13 + (csetemp114 + csetemp115 + csetemp116 + \n+ csetemp117)*xformL23 + (csetemp118 + csetemp119 + csetemp120 + \n+ csetemp121)*xformL33) + xformL02*((csetemp82 + csetemp83 + csetemp84 + \n+ csetemp85)*xformL03 + (csetemp86 + csetemp87 + csetemp88 + \n+ csetemp89)*xformL13 + (csetemp90 + csetemp91 + csetemp92 + \n+ csetemp93)*xformL23 + (csetemp94 + csetemp95 + csetemp96 + \n+ csetemp97)*xformL33);\n+ \n+ CCTK_REAL dg4231 CCTK_ATTRIBUTE_UNUSED = xformL02*((csetemp122 + \n+ csetemp123 + csetemp124 + csetemp125)*xformL03 + (csetemp126 + \n+ csetemp127 + csetemp128 + csetemp129)*xformL13 + (csetemp130 + \n+ csetemp131 + csetemp132 + csetemp133)*xformL23 + (csetemp134 + \n+ csetemp135 + csetemp136 + csetemp137)*xformL33) + xformL12*((csetemp126 \n+ + csetemp127 + csetemp128 + csetemp129)*xformL03 + (csetemp138 + \n+ csetemp139 + csetemp140 + csetemp141)*xformL13 + (csetemp142 + \n+ csetemp143 + csetemp144 + csetemp145)*xformL23 + (csetemp146 + \n+ csetemp147 + csetemp148 + csetemp149)*xformL33) + xformL22*((csetemp130 \n+ + csetemp131 + csetemp132 + csetemp133)*xformL03 + (csetemp142 + \n+ csetemp143 + csetemp144 + csetemp145)*xformL13 + (csetemp150 + \n+ csetemp151 + csetemp152 + csetemp153)*xformL23 + (csetemp154 + \n+ csetemp155 + csetemp156 + csetemp157)*xformL33) + xformL32*((csetemp134 \n+ + csetemp135 + csetemp136 + csetemp137)*xformL03 + (csetemp146 + \n+ csetemp147 + csetemp148 + csetemp149)*xformL13 + (csetemp154 + \n+ csetemp155 + csetemp156 + csetemp157)*xformL23 + (csetemp158 + \n+ csetemp159 + csetemp160 + csetemp161)*xformL33);\n+ \n+ CCTK_REAL dg4232 CCTK_ATTRIBUTE_UNUSED = xformL02*((csetemp162 + \n+ csetemp163 + csetemp164 + csetemp165)*xformL03 + (csetemp166 + \n+ csetemp167 + csetemp168 + csetemp169)*xformL13 + (csetemp170 + \n+ csetemp171 + csetemp172 + csetemp173)*xformL23 + (csetemp174 + \n+ csetemp175 + csetemp176 + csetemp177)*xformL33) + xformL12*((csetemp166 \n+ + csetemp167 + csetemp168 + csetemp169)*xformL03 + (csetemp178 + \n+ csetemp179 + csetemp180 + csetemp181)*xformL13 + (csetemp182 + \n+ csetemp183 + csetemp184 + csetemp185)*xformL23 + (csetemp186 + \n+ csetemp187 + csetemp188 + csetemp189)*xformL33) + xformL22*((csetemp170 \n+ + csetemp171 + csetemp172 + csetemp173)*xformL03 + (csetemp182 + \n+ csetemp183 + csetemp184 + csetemp185)*xformL13 + (csetemp190 + \n+ csetemp191 + csetemp192 + csetemp193)*xformL23 + (csetemp194 + \n+ csetemp195 + csetemp196 + csetemp197)*xformL33) + xformL32*((csetemp174 \n+ + csetemp175 + csetemp176 + csetemp177)*xformL03 + (csetemp186 + \n+ csetemp187 + csetemp188 + csetemp189)*xformL13 + (csetemp194 + \n+ csetemp195 + csetemp196 + csetemp197)*xformL23 + (csetemp198 + \n+ csetemp199 + csetemp200 + csetemp201)*xformL33);\n+ \n+ CCTK_REAL dg4233 CCTK_ATTRIBUTE_UNUSED = xformL02*((csetemp202 + \n+ csetemp203 + csetemp204 + csetemp205)*xformL03 + (csetemp206 + \n+ csetemp207 + csetemp208 + csetemp209)*xformL13 + (csetemp210 + \n+ csetemp211 + csetemp212 + csetemp213)*xformL23 + (csetemp214 + \n+ csetemp215 + csetemp216 + csetemp217)*xformL33) + xformL12*((csetemp206 \n+ + csetemp207 + csetemp208 + csetemp209)*xformL03 + (csetemp218 + \n+ csetemp219 + csetemp220 + csetemp221)*xformL13 + (csetemp222 + \n+ csetemp223 + csetemp224 + csetemp225)*xformL23 + (csetemp226 + \n+ csetemp227 + csetemp228 + csetemp229)*xformL33) + xformL22*((csetemp210 \n+ + csetemp211 + csetemp212 + csetemp213)*xformL03 + (csetemp222 + \n+ csetemp223 + csetemp224 + csetemp225)*xformL13 + (csetemp230 + \n+ csetemp231 + csetemp232 + csetemp233)*xformL23 + (csetemp234 + \n+ csetemp235 + csetemp236 + csetemp237)*xformL33) + xformL32*((csetemp214 \n+ + csetemp215 + csetemp216 + csetemp217)*xformL03 + (csetemp226 + \n+ csetemp227 + csetemp228 + csetemp229)*xformL13 + (csetemp234 + \n+ csetemp235 + csetemp236 + csetemp237)*xformL23 + (csetemp238 + \n+ csetemp239 + csetemp240 + csetemp241)*xformL33);\n+ \n+ CCTK_REAL dg4330 CCTK_ATTRIBUTE_UNUSED = xformL13*((csetemp86 + \n+ csetemp87 + csetemp88 + csetemp89)*xformL03 + (csetemp100 + csetemp101 \n+ + csetemp98 + csetemp99)*xformL13 + (csetemp102 + csetemp103 + \n+ csetemp104 + csetemp105)*xformL23 + (csetemp106 + csetemp107 + \n+ csetemp108 + csetemp109)*xformL33) + xformL23*((csetemp90 + csetemp91 + \n+ csetemp92 + csetemp93)*xformL03 + (csetemp102 + csetemp103 + csetemp104 \n+ + csetemp105)*xformL13 + (csetemp110 + csetemp111 + csetemp112 + \n+ csetemp113)*xformL23 + (csetemp114 + csetemp115 + csetemp116 + \n+ csetemp117)*xformL33) + xformL33*((csetemp94 + csetemp95 + csetemp96 + \n+ csetemp97)*xformL03 + (csetemp106 + csetemp107 + csetemp108 + \n+ csetemp109)*xformL13 + (csetemp114 + csetemp115 + csetemp116 + \n+ csetemp117)*xformL23 + (csetemp118 + csetemp119 + csetemp120 + \n+ csetemp121)*xformL33) + xformL03*((csetemp82 + csetemp83 + csetemp84 + \n+ csetemp85)*xformL03 + (csetemp86 + csetemp87 + csetemp88 + \n+ csetemp89)*xformL13 + (csetemp90 + csetemp91 + csetemp92 + \n+ csetemp93)*xformL23 + (csetemp94 + csetemp95 + csetemp96 + \n+ csetemp97)*xformL33);\n+ \n+ CCTK_REAL dg4331 CCTK_ATTRIBUTE_UNUSED = xformL03*((csetemp122 + \n+ csetemp123 + csetemp124 + csetemp125)*xformL03 + (csetemp126 + \n+ csetemp127 + csetemp128 + csetemp129)*xformL13 + (csetemp130 + \n+ csetemp131 + csetemp132 + csetemp133)*xformL23 + (csetemp134 + \n+ csetemp135 + csetemp136 + csetemp137)*xformL33) + xformL13*((csetemp126 \n+ + csetemp127 + csetemp128 + csetemp129)*xformL03 + (csetemp138 + \n+ csetemp139 + csetemp140 + csetemp141)*xformL13 + (csetemp142 + \n+ csetemp143 + csetemp144 + csetemp145)*xformL23 + (csetemp146 + \n+ csetemp147 + csetemp148 + csetemp149)*xformL33) + xformL23*((csetemp130 \n+ + csetemp131 + csetemp132 + csetemp133)*xformL03 + (csetemp142 + \n+ csetemp143 + csetemp144 + csetemp145)*xformL13 + (csetemp150 + \n+ csetemp151 + csetemp152 + csetemp153)*xformL23 + (csetemp154 + \n+ csetemp155 + csetemp156 + csetemp157)*xformL33) + xformL33*((csetemp134 \n+ + csetemp135 + csetemp136 + csetemp137)*xformL03 + (csetemp146 + \n+ csetemp147 + csetemp148 + csetemp149)*xformL13 + (csetemp154 + \n+ csetemp155 + csetemp156 + csetemp157)*xformL23 + (csetemp158 + \n+ csetemp159 + csetemp160 + csetemp161)*xformL33);\n+ \n+ CCTK_REAL dg4332 CCTK_ATTRIBUTE_UNUSED = xformL03*((csetemp162 + \n+ csetemp163 + csetemp164 + csetemp165)*xformL03 + (csetemp166 + \n+ csetemp167 + csetemp168 + csetemp169)*xformL13 + (csetemp170 + \n+ csetemp171 + csetemp172 + csetemp173)*xformL23 + (csetemp174 + \n+ csetemp175 + csetemp176 + csetemp177)*xformL33) + xformL13*((csetemp166 \n+ + csetemp167 + csetemp168 + csetemp169)*xformL03 + (csetemp178 + \n+ csetemp179 + csetemp180 + csetemp181)*xformL13 + (csetemp182 + \n+ csetemp183 + csetemp184 + csetemp185)*xformL23 + (csetemp186 + \n+ csetemp187 + csetemp188 + csetemp189)*xformL33) + xformL23*((csetemp170 \n+ + csetemp171 + csetemp172 + csetemp173)*xformL03 + (csetemp182 + \n+ csetemp183 + csetemp184 + csetemp185)*xformL13 + (csetemp190 + \n+ csetemp191 + csetemp192 + csetemp193)*xformL23 + (csetemp194 + \n+ csetemp195 + csetemp196 + csetemp197)*xformL33) + xformL33*((csetemp174 \n+ + csetemp175 + csetemp176 + csetemp177)*xformL03 + (csetemp186 + \n+ csetemp187 + csetemp188 + csetemp189)*xformL13 + (csetemp194 + \n+ csetemp195 + csetemp196 + csetemp197)*xformL23 + (csetemp198 + \n+ csetemp199 + csetemp200 + csetemp201)*xformL33);\n+ \n+ CCTK_REAL dg4333 CCTK_ATTRIBUTE_UNUSED = xformL03*((csetemp202 + \n+ csetemp203 + csetemp204 + csetemp205)*xformL03 + (csetemp206 + \n+ csetemp207 + csetemp208 + csetemp209)*xformL13 + (csetemp210 + \n+ csetemp211 + csetemp212 + csetemp213)*xformL23 + (csetemp214 + \n+ csetemp215 + csetemp216 + csetemp217)*xformL33) + xformL13*((csetemp206 \n+ + csetemp207 + csetemp208 + csetemp209)*xformL03 + (csetemp218 + \n+ csetemp219 + csetemp220 + csetemp221)*xformL13 + (csetemp222 + \n+ csetemp223 + csetemp224 + csetemp225)*xformL23 + (csetemp226 + \n+ csetemp227 + csetemp228 + csetemp229)*xformL33) + xformL23*((csetemp210 \n+ + csetemp211 + csetemp212 + csetemp213)*xformL03 + (csetemp222 + \n+ csetemp223 + csetemp224 + csetemp225)*xformL13 + (csetemp230 + \n+ csetemp231 + csetemp232 + csetemp233)*xformL23 + (csetemp234 + \n+ csetemp235 + csetemp236 + csetemp237)*xformL33) + xformL33*((csetemp214 \n+ + csetemp215 + csetemp216 + csetemp217)*xformL03 + (csetemp226 + \n+ csetemp227 + csetemp228 + csetemp229)*xformL13 + (csetemp234 + \n+ csetemp235 + csetemp236 + csetemp237)*xformL23 + (csetemp238 + \n+ csetemp239 + csetemp240 + csetemp241)*xformL33);\n+ \n+ CCTK_REAL betal1 CCTK_ATTRIBUTE_UNUSED = g401;\n+ \n+ CCTK_REAL betal2 CCTK_ATTRIBUTE_UNUSED = g402;\n+ \n+ CCTK_REAL betal3 CCTK_ATTRIBUTE_UNUSED = g403;\n+ \n+ CCTK_REAL gerr11L CCTK_ATTRIBUTE_UNUSED = gxxL - g411;\n+ \n+ CCTK_REAL gerr12L CCTK_ATTRIBUTE_UNUSED = gxyL - g412;\n+ \n+ CCTK_REAL gerr13L CCTK_ATTRIBUTE_UNUSED = gxzL - g413;\n+ \n+ CCTK_REAL gerr22L CCTK_ATTRIBUTE_UNUSED = gyyL - g422;\n+ \n+ CCTK_REAL gerr23L CCTK_ATTRIBUTE_UNUSED = gyzL - g423;\n+ \n+ CCTK_REAL gerr33L CCTK_ATTRIBUTE_UNUSED = gzzL - g433;\n+ \n+ CCTK_REAL csetemp242 CCTK_ATTRIBUTE_UNUSED = SQR(gxzL);\n+ \n+ CCTK_REAL csetemp243 CCTK_ATTRIBUTE_UNUSED = SQR(gyzL);\n+ \n+ CCTK_REAL csetemp244 CCTK_ATTRIBUTE_UNUSED = SQR(gxyL);\n+ \n+ CCTK_REAL detg CCTK_ATTRIBUTE_UNUSED = 2*gxyL*gxzL*gyzL + \n+ gyyL*(gxxL*gzzL - csetemp242) - gxxL*csetemp243 - gzzL*csetemp244;\n+ \n+ CCTK_REAL csetemp245 CCTK_ATTRIBUTE_UNUSED = INV(detg);\n+ \n+ CCTK_REAL gu11 CCTK_ATTRIBUTE_UNUSED = (gyyL*gzzL - \n+ csetemp243)*csetemp245;\n+ \n+ CCTK_REAL gu12 CCTK_ATTRIBUTE_UNUSED = (gxzL*gyzL - \n+ gxyL*gzzL)*csetemp245;\n+ \n+ CCTK_REAL gu13 CCTK_ATTRIBUTE_UNUSED = (-(gxzL*gyyL) + \n+ gxyL*gyzL)*csetemp245;\n+ \n+ CCTK_REAL gu22 CCTK_ATTRIBUTE_UNUSED = (gxxL*gzzL - \n+ csetemp242)*csetemp245;\n+ \n+ CCTK_REAL gu23 CCTK_ATTRIBUTE_UNUSED = (gxyL*gxzL - \n+ gxxL*gyzL)*csetemp245;\n+ \n+ CCTK_REAL gu33 CCTK_ATTRIBUTE_UNUSED = (gxxL*gyyL - \n+ csetemp244)*csetemp245;\n+ \n+ CCTK_REAL betaerr1L CCTK_ATTRIBUTE_UNUSED = betaxL - betal1*gu11 - \n+ betal2*gu12 - betal3*gu13;\n+ \n+ CCTK_REAL betaerr2L CCTK_ATTRIBUTE_UNUSED = betayL - betal1*gu12 - \n+ betal2*gu22 - betal3*gu23;\n+ \n+ CCTK_REAL betaerr3L CCTK_ATTRIBUTE_UNUSED = betazL - betal1*gu13 - \n+ betal2*gu23 - betal3*gu33;\n+ \n+ CCTK_REAL betasq CCTK_ATTRIBUTE_UNUSED = betaxL*betal1 + betayL*betal2 \n+ + betazL*betal3;\n+ \n+ CCTK_REAL alperrL CCTK_ATTRIBUTE_UNUSED = alpL - sqrt(betasq - g400);\n+ \n+ CCTK_REAL dtg11 CCTK_ATTRIBUTE_UNUSED = dg4110;\n+ \n+ CCTK_REAL dtg12 CCTK_ATTRIBUTE_UNUSED = dg4120;\n+ \n+ CCTK_REAL dtg13 CCTK_ATTRIBUTE_UNUSED = dg4130;\n+ \n+ CCTK_REAL dtg22 CCTK_ATTRIBUTE_UNUSED = dg4220;\n+ \n+ CCTK_REAL dtg23 CCTK_ATTRIBUTE_UNUSED = dg4230;\n+ \n+ CCTK_REAL dtg33 CCTK_ATTRIBUTE_UNUSED = dg4330;\n+ \n+ CCTK_REAL dg111 CCTK_ATTRIBUTE_UNUSED = dg4111;\n+ \n+ CCTK_REAL dg112 CCTK_ATTRIBUTE_UNUSED = dg4112;\n+ \n+ CCTK_REAL dg113 CCTK_ATTRIBUTE_UNUSED = dg4113;\n+ \n+ CCTK_REAL dg121 CCTK_ATTRIBUTE_UNUSED = dg4121;\n+ \n+ CCTK_REAL dg122 CCTK_ATTRIBUTE_UNUSED = dg4122;\n+ \n+ CCTK_REAL dg123 CCTK_ATTRIBUTE_UNUSED = dg4123;\n+ \n+ CCTK_REAL dg131 CCTK_ATTRIBUTE_UNUSED = dg4131;\n+ \n+ CCTK_REAL dg132 CCTK_ATTRIBUTE_UNUSED = dg4132;\n+ \n+ CCTK_REAL dg133 CCTK_ATTRIBUTE_UNUSED = dg4133;\n+ \n+ CCTK_REAL dg221 CCTK_ATTRIBUTE_UNUSED = dg4221;\n+ \n+ CCTK_REAL dg222 CCTK_ATTRIBUTE_UNUSED = dg4222;\n+ \n+ CCTK_REAL dg223 CCTK_ATTRIBUTE_UNUSED = dg4223;\n+ \n+ CCTK_REAL dg231 CCTK_ATTRIBUTE_UNUSED = dg4231;\n+ \n+ CCTK_REAL dg232 CCTK_ATTRIBUTE_UNUSED = dg4232;\n+ \n+ CCTK_REAL dg233 CCTK_ATTRIBUTE_UNUSED = dg4233;\n+ \n+ CCTK_REAL dg331 CCTK_ATTRIBUTE_UNUSED = dg4331;\n+ \n+ CCTK_REAL dg332 CCTK_ATTRIBUTE_UNUSED = dg4332;\n+ \n+ CCTK_REAL dg333 CCTK_ATTRIBUTE_UNUSED = dg4333;\n+ \n+ CCTK_REAL csetemp246 CCTK_ATTRIBUTE_UNUSED = dtg11*gu11;\n+ \n+ CCTK_REAL csetemp247 CCTK_ATTRIBUTE_UNUSED = dtg12*gu12;\n+ \n+ CCTK_REAL csetemp248 CCTK_ATTRIBUTE_UNUSED = dtg13*gu13;\n+ \n+ CCTK_REAL csetemp249 CCTK_ATTRIBUTE_UNUSED = dtg12*gu11;\n+ \n+ CCTK_REAL csetemp250 CCTK_ATTRIBUTE_UNUSED = dtg22*gu12;\n+ \n+ CCTK_REAL csetemp251 CCTK_ATTRIBUTE_UNUSED = dtg23*gu13;\n+ \n+ CCTK_REAL csetemp252 CCTK_ATTRIBUTE_UNUSED = dtg13*gu11;\n+ \n+ CCTK_REAL csetemp253 CCTK_ATTRIBUTE_UNUSED = dtg23*gu12;\n+ \n+ CCTK_REAL csetemp254 CCTK_ATTRIBUTE_UNUSED = dtg33*gu13;\n+ \n+ CCTK_REAL dtgu11 CCTK_ATTRIBUTE_UNUSED = -((csetemp246 + csetemp247 + \n+ csetemp248)*gu11) - (csetemp249 + csetemp250 + csetemp251)*gu12 - \n+ (csetemp252 + csetemp253 + csetemp254)*gu13;\n+ \n+ CCTK_REAL dtgu12 CCTK_ATTRIBUTE_UNUSED = -((csetemp246 + csetemp247 + \n+ csetemp248)*gu12) - (csetemp249 + csetemp250 + csetemp251)*gu22 - \n+ (csetemp252 + csetemp253 + csetemp254)*gu23;\n+ \n+ CCTK_REAL dtgu13 CCTK_ATTRIBUTE_UNUSED = -((csetemp246 + csetemp247 + \n+ csetemp248)*gu13) - (csetemp249 + csetemp250 + csetemp251)*gu23 - \n+ (csetemp252 + csetemp253 + csetemp254)*gu33;\n+ \n+ CCTK_REAL csetemp255 CCTK_ATTRIBUTE_UNUSED = dtg11*gu12;\n+ \n+ CCTK_REAL csetemp256 CCTK_ATTRIBUTE_UNUSED = dtg12*gu22;\n+ \n+ CCTK_REAL csetemp257 CCTK_ATTRIBUTE_UNUSED = dtg13*gu23;\n+ \n+ CCTK_REAL csetemp258 CCTK_ATTRIBUTE_UNUSED = dtg22*gu22;\n+ \n+ CCTK_REAL csetemp259 CCTK_ATTRIBUTE_UNUSED = dtg23*gu23;\n+ \n+ CCTK_REAL csetemp260 CCTK_ATTRIBUTE_UNUSED = dtg13*gu12;\n+ \n+ CCTK_REAL csetemp261 CCTK_ATTRIBUTE_UNUSED = dtg23*gu22;\n+ \n+ CCTK_REAL csetemp262 CCTK_ATTRIBUTE_UNUSED = dtg33*gu23;\n+ \n+ CCTK_REAL dtgu22 CCTK_ATTRIBUTE_UNUSED = -((csetemp255 + csetemp256 + \n+ csetemp257)*gu12) - (csetemp247 + csetemp258 + csetemp259)*gu22 - \n+ (csetemp260 + csetemp261 + csetemp262)*gu23;\n+ \n+ CCTK_REAL dtgu23 CCTK_ATTRIBUTE_UNUSED = -((csetemp255 + csetemp256 + \n+ csetemp257)*gu13) - (csetemp247 + csetemp258 + csetemp259)*gu23 - \n+ (csetemp260 + csetemp261 + csetemp262)*gu33;\n+ \n+ CCTK_REAL dtgu33 CCTK_ATTRIBUTE_UNUSED = -(gu13*(dtg11*gu13 + \n+ dtg12*gu23 + dtg13*gu33)) - gu23*(dtg12*gu13 + dtg22*gu23 + dtg23*gu33) \n+ - gu33*(csetemp248 + csetemp259 + dtg33*gu33);\n+ \n+ CCTK_REAL csetemp263 CCTK_ATTRIBUTE_UNUSED = dg111*gu11;\n+ \n+ CCTK_REAL csetemp264 CCTK_ATTRIBUTE_UNUSED = dg121*gu12;\n+ \n+ CCTK_REAL csetemp265 CCTK_ATTRIBUTE_UNUSED = dg131*gu13;\n+ \n+ CCTK_REAL csetemp266 CCTK_ATTRIBUTE_UNUSED = dg121*gu11;\n+ \n+ CCTK_REAL csetemp267 CCTK_ATTRIBUTE_UNUSED = dg221*gu12;\n+ \n+ CCTK_REAL csetemp268 CCTK_ATTRIBUTE_UNUSED = dg231*gu13;\n+ \n+ CCTK_REAL csetemp269 CCTK_ATTRIBUTE_UNUSED = dg131*gu11;\n+ \n+ CCTK_REAL csetemp270 CCTK_ATTRIBUTE_UNUSED = dg231*gu12;\n+ \n+ CCTK_REAL csetemp271 CCTK_ATTRIBUTE_UNUSED = dg331*gu13;\n+ \n+ CCTK_REAL dgu111 CCTK_ATTRIBUTE_UNUSED = -((csetemp263 + csetemp264 + \n+ csetemp265)*gu11) - (csetemp266 + csetemp267 + csetemp268)*gu12 - \n+ (csetemp269 + csetemp270 + csetemp271)*gu13;\n+ \n+ CCTK_REAL dgu121 CCTK_ATTRIBUTE_UNUSED = -((csetemp263 + csetemp264 + \n+ csetemp265)*gu12) - (csetemp266 + csetemp267 + csetemp268)*gu22 - \n+ (csetemp269 + csetemp270 + csetemp271)*gu23;\n+ \n+ CCTK_REAL dgu131 CCTK_ATTRIBUTE_UNUSED = -((csetemp263 + csetemp264 + \n+ csetemp265)*gu13) - (csetemp266 + csetemp267 + csetemp268)*gu23 - \n+ (csetemp269 + csetemp270 + csetemp271)*gu33;\n+ \n+ CCTK_REAL csetemp272 CCTK_ATTRIBUTE_UNUSED = dg111*gu12;\n+ \n+ CCTK_REAL csetemp273 CCTK_ATTRIBUTE_UNUSED = dg121*gu22;\n+ \n+ CCTK_REAL csetemp274 CCTK_ATTRIBUTE_UNUSED = dg131*gu23;\n+ \n+ CCTK_REAL csetemp275 CCTK_ATTRIBUTE_UNUSED = dg221*gu22;\n+ \n+ CCTK_REAL csetemp276 CCTK_ATTRIBUTE_UNUSED = dg231*gu23;\n+ \n+ CCTK_REAL csetemp277 CCTK_ATTRIBUTE_UNUSED = dg131*gu12;\n+ \n+ CCTK_REAL csetemp278 CCTK_ATTRIBUTE_UNUSED = dg231*gu22;\n+ \n+ CCTK_REAL csetemp279 CCTK_ATTRIBUTE_UNUSED = dg331*gu23;\n+ \n+ CCTK_REAL dgu221 CCTK_ATTRIBUTE_UNUSED = -((csetemp272 + csetemp273 + \n+ csetemp274)*gu12) - (csetemp264 + csetemp275 + csetemp276)*gu22 - \n+ (csetemp277 + csetemp278 + csetemp279)*gu23;\n+ \n+ CCTK_REAL dgu231 CCTK_ATTRIBUTE_UNUSED = -((csetemp272 + csetemp273 + \n+ csetemp274)*gu13) - (csetemp264 + csetemp275 + csetemp276)*gu23 - \n+ (csetemp277 + csetemp278 + csetemp279)*gu33;\n+ \n+ CCTK_REAL dgu331 CCTK_ATTRIBUTE_UNUSED = -(gu13*(dg111*gu13 + \n+ dg121*gu23 + dg131*gu33)) - gu23*(dg121*gu13 + dg221*gu23 + dg231*gu33) \n+ - gu33*(csetemp265 + csetemp276 + dg331*gu33);\n+ \n+ CCTK_REAL csetemp280 CCTK_ATTRIBUTE_UNUSED = dg112*gu11;\n+ \n+ CCTK_REAL csetemp281 CCTK_ATTRIBUTE_UNUSED = dg122*gu12;\n+ \n+ CCTK_REAL csetemp282 CCTK_ATTRIBUTE_UNUSED = dg132*gu13;\n+ \n+ CCTK_REAL csetemp283 CCTK_ATTRIBUTE_UNUSED = dg122*gu11;\n+ \n+ CCTK_REAL csetemp284 CCTK_ATTRIBUTE_UNUSED = dg222*gu12;\n+ \n+ CCTK_REAL csetemp285 CCTK_ATTRIBUTE_UNUSED = dg232*gu13;\n+ \n+ CCTK_REAL csetemp286 CCTK_ATTRIBUTE_UNUSED = dg132*gu11;\n+ \n+ CCTK_REAL csetemp287 CCTK_ATTRIBUTE_UNUSED = dg232*gu12;\n+ \n+ CCTK_REAL csetemp288 CCTK_ATTRIBUTE_UNUSED = dg332*gu13;\n+ \n+ CCTK_REAL dgu112 CCTK_ATTRIBUTE_UNUSED = -((csetemp280 + csetemp281 + \n+ csetemp282)*gu11) - (csetemp283 + csetemp284 + csetemp285)*gu12 - \n+ (csetemp286 + csetemp287 + csetemp288)*gu13;\n+ \n+ CCTK_REAL dgu122 CCTK_ATTRIBUTE_UNUSED = -((csetemp280 + csetemp281 + \n+ csetemp282)*gu12) - (csetemp283 + csetemp284 + csetemp285)*gu22 - \n+ (csetemp286 + csetemp287 + csetemp288)*gu23;\n+ \n+ CCTK_REAL dgu132 CCTK_ATTRIBUTE_UNUSED = -((csetemp280 + csetemp281 + \n+ csetemp282)*gu13) - (csetemp283 + csetemp284 + csetemp285)*gu23 - \n+ (csetemp286 + csetemp287 + csetemp288)*gu33;\n+ \n+ CCTK_REAL csetemp289 CCTK_ATTRIBUTE_UNUSED = dg112*gu12;\n+ \n+ CCTK_REAL csetemp290 CCTK_ATTRIBUTE_UNUSED = dg122*gu22;\n+ \n+ CCTK_REAL csetemp291 CCTK_ATTRIBUTE_UNUSED = dg132*gu23;\n+ \n+ CCTK_REAL csetemp292 CCTK_ATTRIBUTE_UNUSED = dg222*gu22;\n+ \n+ CCTK_REAL csetemp293 CCTK_ATTRIBUTE_UNUSED = dg232*gu23;\n+ \n+ CCTK_REAL csetemp294 CCTK_ATTRIBUTE_UNUSED = dg132*gu12;\n+ \n+ CCTK_REAL csetemp295 CCTK_ATTRIBUTE_UNUSED = dg232*gu22;\n+ \n+ CCTK_REAL csetemp296 CCTK_ATTRIBUTE_UNUSED = dg332*gu23;\n+ \n+ CCTK_REAL dgu222 CCTK_ATTRIBUTE_UNUSED = -((csetemp289 + csetemp290 + \n+ csetemp291)*gu12) - (csetemp281 + csetemp292 + csetemp293)*gu22 - \n+ (csetemp294 + csetemp295 + csetemp296)*gu23;\n+ \n+ CCTK_REAL dgu232 CCTK_ATTRIBUTE_UNUSED = -((csetemp289 + csetemp290 + \n+ csetemp291)*gu13) - (csetemp281 + csetemp292 + csetemp293)*gu23 - \n+ (csetemp294 + csetemp295 + csetemp296)*gu33;\n+ \n+ CCTK_REAL dgu332 CCTK_ATTRIBUTE_UNUSED = -(gu13*(dg112*gu13 + \n+ dg122*gu23 + dg132*gu33)) - gu23*(dg122*gu13 + dg222*gu23 + dg232*gu33) \n+ - gu33*(csetemp282 + csetemp293 + dg332*gu33);\n+ \n+ CCTK_REAL csetemp297 CCTK_ATTRIBUTE_UNUSED = dg113*gu11;\n+ \n+ CCTK_REAL csetemp298 CCTK_ATTRIBUTE_UNUSED = dg123*gu12;\n+ \n+ CCTK_REAL csetemp299 CCTK_ATTRIBUTE_UNUSED = dg133*gu13;\n+ \n+ CCTK_REAL csetemp300 CCTK_ATTRIBUTE_UNUSED = dg123*gu11;\n+ \n+ CCTK_REAL csetemp301 CCTK_ATTRIBUTE_UNUSED = dg223*gu12;\n+ \n+ CCTK_REAL csetemp302 CCTK_ATTRIBUTE_UNUSED = dg233*gu13;\n+ \n+ CCTK_REAL csetemp303 CCTK_ATTRIBUTE_UNUSED = dg133*gu11;\n+ \n+ CCTK_REAL csetemp304 CCTK_ATTRIBUTE_UNUSED = dg233*gu12;\n+ \n+ CCTK_REAL csetemp305 CCTK_ATTRIBUTE_UNUSED = dg333*gu13;\n+ \n+ CCTK_REAL dgu113 CCTK_ATTRIBUTE_UNUSED = -((csetemp297 + csetemp298 + \n+ csetemp299)*gu11) - (csetemp300 + csetemp301 + csetemp302)*gu12 - \n+ (csetemp303 + csetemp304 + csetemp305)*gu13;\n+ \n+ CCTK_REAL dgu123 CCTK_ATTRIBUTE_UNUSED = -((csetemp297 + csetemp298 + \n+ csetemp299)*gu12) - (csetemp300 + csetemp301 + csetemp302)*gu22 - \n+ (csetemp303 + csetemp304 + csetemp305)*gu23;\n+ \n+ CCTK_REAL dgu133 CCTK_ATTRIBUTE_UNUSED = -((csetemp297 + csetemp298 + \n+ csetemp299)*gu13) - (csetemp300 + csetemp301 + csetemp302)*gu23 - \n+ (csetemp303 + csetemp304 + csetemp305)*gu33;\n+ \n+ CCTK_REAL csetemp306 CCTK_ATTRIBUTE_UNUSED = dg113*gu12;\n+ \n+ CCTK_REAL csetemp307 CCTK_ATTRIBUTE_UNUSED = dg123*gu22;\n+ \n+ CCTK_REAL csetemp308 CCTK_ATTRIBUTE_UNUSED = dg133*gu23;\n+ \n+ CCTK_REAL csetemp309 CCTK_ATTRIBUTE_UNUSED = dg223*gu22;\n+ \n+ CCTK_REAL csetemp310 CCTK_ATTRIBUTE_UNUSED = dg233*gu23;\n+ \n+ CCTK_REAL csetemp311 CCTK_ATTRIBUTE_UNUSED = dg133*gu12;\n+ \n+ CCTK_REAL csetemp312 CCTK_ATTRIBUTE_UNUSED = dg233*gu22;\n+ \n+ CCTK_REAL csetemp313 CCTK_ATTRIBUTE_UNUSED = dg333*gu23;\n+ \n+ CCTK_REAL dgu223 CCTK_ATTRIBUTE_UNUSED = -((csetemp306 + csetemp307 + \n+ csetemp308)*gu12) - (csetemp298 + csetemp309 + csetemp310)*gu22 - \n+ (csetemp311 + csetemp312 + csetemp313)*gu23;\n+ \n+ CCTK_REAL dgu233 CCTK_ATTRIBUTE_UNUSED = -((csetemp306 + csetemp307 + \n+ csetemp308)*gu13) - (csetemp298 + csetemp309 + csetemp310)*gu23 - \n+ (csetemp311 + csetemp312 + csetemp313)*gu33;\n+ \n+ CCTK_REAL dgu333 CCTK_ATTRIBUTE_UNUSED = -(gu13*(dg113*gu13 + \n+ dg123*gu23 + dg133*gu33)) - gu23*(dg123*gu13 + dg223*gu23 + dg233*gu33) \n+ - gu33*(csetemp299 + csetemp310 + dg333*gu33);\n+ \n+ CCTK_REAL dtbetal1 CCTK_ATTRIBUTE_UNUSED = dg4010;\n+ \n+ CCTK_REAL dtbetal2 CCTK_ATTRIBUTE_UNUSED = dg4020;\n+ \n+ CCTK_REAL dtbetal3 CCTK_ATTRIBUTE_UNUSED = dg4030;\n+ \n+ CCTK_REAL dbetal11 CCTK_ATTRIBUTE_UNUSED = dg4011;\n+ \n+ CCTK_REAL dbetal12 CCTK_ATTRIBUTE_UNUSED = dg4012;\n+ \n+ CCTK_REAL dbetal13 CCTK_ATTRIBUTE_UNUSED = dg4013;\n+ \n+ CCTK_REAL dbetal21 CCTK_ATTRIBUTE_UNUSED = dg4021;\n+ \n+ CCTK_REAL dbetal22 CCTK_ATTRIBUTE_UNUSED = dg4022;\n+ \n+ CCTK_REAL dbetal23 CCTK_ATTRIBUTE_UNUSED = dg4023;\n+ \n+ CCTK_REAL dbetal31 CCTK_ATTRIBUTE_UNUSED = dg4031;\n+ \n+ CCTK_REAL dbetal32 CCTK_ATTRIBUTE_UNUSED = dg4032;\n+ \n+ CCTK_REAL dbetal33 CCTK_ATTRIBUTE_UNUSED = dg4033;\n+ \n+ CCTK_REAL dtbetaerr1L CCTK_ATTRIBUTE_UNUSED = dtbetaxL - betal1*dtgu11 \n+ - betal2*dtgu12 - betal3*dtgu13 - dtbetal1*gu11 - dtbetal2*gu12 - \n+ dtbetal3*gu13;\n+ \n+ CCTK_REAL dtbetaerr2L CCTK_ATTRIBUTE_UNUSED = dtbetayL - betal1*dtgu12 \n+ - betal2*dtgu22 - betal3*dtgu23 - dtbetal1*gu12 - dtbetal2*gu22 - \n+ dtbetal3*gu23;\n+ \n+ CCTK_REAL dtbetaerr3L CCTK_ATTRIBUTE_UNUSED = dtbetazL - betal1*dtgu13 \n+ - betal2*dtgu23 - betal3*dtgu33 - dtbetal1*gu13 - dtbetal2*gu23 - \n+ dtbetal3*gu33;\n+ \n+ CCTK_REAL dbeta11 CCTK_ATTRIBUTE_UNUSED = betal1*dgu111 + \n+ betal2*dgu121 + betal3*dgu131 + dbetal11*gu11 + dbetal21*gu12 + \n+ dbetal31*gu13;\n+ \n+ CCTK_REAL dbeta21 CCTK_ATTRIBUTE_UNUSED = betal1*dgu121 + \n+ betal2*dgu221 + betal3*dgu231 + dbetal11*gu12 + dbetal21*gu22 + \n+ dbetal31*gu23;\n+ \n+ CCTK_REAL dbeta31 CCTK_ATTRIBUTE_UNUSED = betal1*dgu131 + \n+ betal2*dgu231 + betal3*dgu331 + dbetal11*gu13 + dbetal21*gu23 + \n+ dbetal31*gu33;\n+ \n+ CCTK_REAL dbeta12 CCTK_ATTRIBUTE_UNUSED = betal1*dgu112 + \n+ betal2*dgu122 + betal3*dgu132 + dbetal12*gu11 + dbetal22*gu12 + \n+ dbetal32*gu13;\n+ \n+ CCTK_REAL dbeta22 CCTK_ATTRIBUTE_UNUSED = betal1*dgu122 + \n+ betal2*dgu222 + betal3*dgu232 + dbetal12*gu12 + dbetal22*gu22 + \n+ dbetal32*gu23;\n+ \n+ CCTK_REAL dbeta32 CCTK_ATTRIBUTE_UNUSED = betal1*dgu132 + \n+ betal2*dgu232 + betal3*dgu332 + dbetal12*gu13 + dbetal22*gu23 + \n+ dbetal32*gu33;\n+ \n+ CCTK_REAL dbeta13 CCTK_ATTRIBUTE_UNUSED = betal1*dgu113 + \n+ betal2*dgu123 + betal3*dgu133 + dbetal13*gu11 + dbetal23*gu12 + \n+ dbetal33*gu13;\n+ \n+ CCTK_REAL dbeta23 CCTK_ATTRIBUTE_UNUSED = betal1*dgu123 + \n+ betal2*dgu223 + betal3*dgu233 + dbetal13*gu12 + dbetal23*gu22 + \n+ dbetal33*gu23;\n+ \n+ CCTK_REAL dbeta33 CCTK_ATTRIBUTE_UNUSED = betal1*dgu133 + \n+ betal2*dgu233 + betal3*dgu333 + dbetal13*gu13 + dbetal23*gu23 + \n+ dbetal33*gu33;\n+ \n+ CCTK_REAL dtbetasq CCTK_ATTRIBUTE_UNUSED = dtbetaxL*betal1 + \n+ dtbetayL*betal2 + dtbetazL*betal3 + betaxL*dtbetal1 + betayL*dtbetal2 + \n+ betazL*dtbetal3;\n+ \n+ CCTK_REAL csetemp314 CCTK_ATTRIBUTE_UNUSED = INV(alpL);\n+ \n+ CCTK_REAL dtalperrL CCTK_ATTRIBUTE_UNUSED = dtalpL + \n+ 0.5*csetemp314*(dg4000 - dtbetasq);\n+ \n+ CCTK_REAL kerr11L CCTK_ATTRIBUTE_UNUSED = kxxL - \n+ 0.5*csetemp314*(2*(gxxL*dbeta11 + gxyL*dbeta21 + gxzL*dbeta31) + \n+ betaxL*dg111 + betayL*dg112 + betazL*dg113 - dtg11);\n+ \n+ CCTK_REAL kerr12L CCTK_ATTRIBUTE_UNUSED = kxyL - \n+ 0.5*csetemp314*(gxxL*dbeta12 + gyyL*dbeta21 + gxyL*(dbeta11 + dbeta22) \n+ + gyzL*dbeta31 + gxzL*dbeta32 + betaxL*dg121 + betayL*dg122 + \n+ betazL*dg123 - dtg12);\n+ \n+ CCTK_REAL kerr13L CCTK_ATTRIBUTE_UNUSED = kxzL - \n+ 0.5*csetemp314*(gxxL*dbeta13 + gyzL*dbeta21 + gxyL*dbeta23 + \n+ gzzL*dbeta31 + gxzL*(dbeta11 + dbeta33) + betaxL*dg131 + betayL*dg132 + \n+ betazL*dg133 - dtg13);\n+ \n+ CCTK_REAL kerr22L CCTK_ATTRIBUTE_UNUSED = kyyL - \n+ 0.5*csetemp314*(2*(gxyL*dbeta12 + gyyL*dbeta22 + gyzL*dbeta32) + \n+ betaxL*dg221 + betayL*dg222 + betazL*dg223 - dtg22);\n+ \n+ CCTK_REAL kerr23L CCTK_ATTRIBUTE_UNUSED = kyzL - \n+ 0.5*csetemp314*(gxzL*dbeta12 + gxyL*dbeta13 + gyyL*dbeta23 + \n+ gzzL*dbeta32 + gyzL*(dbeta22 + dbeta33) + betaxL*dg231 + betayL*dg232 + \n+ betazL*dg233 - dtg23);\n+ \n+ CCTK_REAL kerr33L CCTK_ATTRIBUTE_UNUSED = kzzL - \n+ 0.5*csetemp314*(2*(gxzL*dbeta13 + gyzL*dbeta23 + gzzL*dbeta33) + \n+ betaxL*dg331 + betayL*dg332 + betazL*dg333 - dtg33);\n+ /* Copy local copies back to grid functions */\n+ alperr[index] = alperrL;\n+ betaerr1[index] = betaerr1L;\n+ betaerr2[index] = betaerr2L;\n+ betaerr3[index] = betaerr3L;\n+ dtalperr[index] = dtalperrL;\n+ dtbetaerr1[index] = dtbetaerr1L;\n+ dtbetaerr2[index] = dtbetaerr2L;\n+ dtbetaerr3[index] = dtbetaerr3L;\n+ gerr11[index] = gerr11L;\n+ gerr12[index] = gerr12L;\n+ gerr13[index] = gerr13L;\n+ gerr22[index] = gerr22L;\n+ gerr23[index] = gerr23L;\n+ gerr33[index] = gerr33L;\n+ kerr11[index] = kerr11L;\n+ kerr12[index] = kerr12L;\n+ kerr13[index] = kerr13L;\n+ kerr22[index] = kerr22L;\n+ kerr23[index] = kerr23L;\n+ kerr33[index] = kerr33L;\n+ }\n+ CCTK_ENDLOOP3(KerrSchild_error);\n+}\n+extern \"C\" void KerrSchild_error(CCTK_ARGUMENTS)\n+{\n+ DECLARE_CCTK_ARGUMENTS;\n+ DECLARE_CCTK_PARAMETERS;\n+ \n+ if (verbose > 1)\n+ {\n+ CCTK_VInfo(CCTK_THORNSTRING,\"Entering KerrSchild_error_Body\");\n+ }\n+ if (cctk_iteration % KerrSchild_error_calc_every != KerrSchild_error_calc_offset)\n+ {\n+ return;\n+ }\n+ \n+ const char* const groups[] = {\n+ \"admbase::curv\",\n+ \"admbase::dtlapse\",\n+ \"admbase::dtshift\",\n+ \"admbase::lapse\",\n+ \"admbase::metric\",\n+ \"admbase::shift\",\n+ \"KerrSchild::curv_error\",\n+ \"KerrSchild::dtlapse_error\",\n+ \"KerrSchild::dtshift_error\",\n+ \"grid::coordinates\",\n+ \"KerrSchild::lapse_error\",\n+ \"KerrSchild::metric_error\",\n+ \"KerrSchild::shift_error\"};\n+ AssertGroupStorage(cctkGH, \"KerrSchild_error\", 13, groups);\n+ \n+ \n+ LoopOverEverything(cctkGH, KerrSchild_error_Body);\n+ if (verbose > 1)\n+ {\n+ CCTK_VInfo(CCTK_THORNSTRING,\"Leaving KerrSchild_error_Body\");\n+ }\n+}\n+\n+} // namespace KerrSchild"}, "test": {"test_patch": "diff --git a/all_tests.txt b/all_tests.txt\nnew file mode 100644\nindex 0000000..0000000\n--- /dev/null\n+++ b/all_tests.txt\n@@ -0,0 +1,7 @@\n+GaugeWave\n+KS-tilted-EE\n+KerrSchild\n+Minkowski\n+ModifiedSchwarzschildBL\n+ShiftedGaugeWave\n+Vaidya2", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}21{"question_id": "MSB_einsteintoolkit_Cactus_pr28", "question_type": "multi_swe_bench", "description": "Add missing KerrSchild_initial.cc in EinsteinExact/KerrSchild (einsteintoolkit/Cactus#28)", "content": {"org": "einsteintoolkit", "repo": "Cactus", "pr_number": 28, "issue_title": "Add missing KerrSchild_initial.cc in EinsteinExact/KerrSchild", "issue_body": "This PR adds the missing source file KerrSchild_initial.cc to complete the EinsteinExact/KerrSchild thorn implementation.", "base_commit": "HEAD", "resolved_issues": [{"number": 28, "title": "Implement the full functionality of KerrSchild", "body": "Please implement the full functionality of `KerrSchild` by finishing the code in `KerrSchild_initial.cc`.\n\n## Thorn Information:\n- Name: KerrSchild\n- Target file: KerrSchild_initial.cc\n\n## Interface Definition in interface.ccl:\n\n## Schedule Definition in schedule.ccl:\n\n## Parameters Definition in param.ccl:\n\n## Configuration Definition in configuration.ccl:\n\n## Documentation Context in readme.md and doc/documentation.tex\n\n## Related Code Context in src folder\n\n"}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/einsteintoolkit_m_cactus:pr-28", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/arrangements/EinsteinExact/KerrSchild/src/KerrSchild_initial.cc b/arrangements/EinsteinExact/KerrSchild/src/KerrSchild_initial.cc\nnew file mode 100644\nindex 0000000..0000000\n--- /dev/null\n+++ b/arrangements/EinsteinExact/KerrSchild/src/KerrSchild_initial.cc\n@@ -0,0 +1,2349 @@\n+/* File produced by Kranc */\n+\n+#define KRANC_C\n+\n+#include <algorithm>\n+#include <assert.h>\n+#include <math.h>\n+#include <stdio.h>\n+#include <stdlib.h>\n+#include <string.h>\n+#include \"cctk.h\"\n+#include \"cctk_Arguments.h\"\n+#include \"cctk_Parameters.h\"\n+#include \"Kranc.hh\"\n+#include \"Differencing.h\"\n+#include \"loopcontrol.h\"\n+\n+namespace KerrSchild {\n+\n+\n+static void KerrSchild_initial_Body(const cGH* restrict const cctkGH, const int dir, const int face, const CCTK_REAL normal[3], const CCTK_REAL tangentA[3], const CCTK_REAL tangentB[3], const int imin[3], const int imax[3], const int n_subblock_gfs, CCTK_REAL* restrict const subblock_gfs[])\n+{\n+ DECLARE_CCTK_ARGUMENTS;\n+ DECLARE_CCTK_PARAMETERS;\n+ \n+ /* Include user-supplied include files */\n+ /* Initialise finite differencing variables */\n+ const ptrdiff_t di CCTK_ATTRIBUTE_UNUSED = 1;\n+ const ptrdiff_t dj CCTK_ATTRIBUTE_UNUSED = \n+ CCTK_GFINDEX3D(cctkGH,0,1,0) - CCTK_GFINDEX3D(cctkGH,0,0,0);\n+ const ptrdiff_t dk CCTK_ATTRIBUTE_UNUSED = \n+ CCTK_GFINDEX3D(cctkGH,0,0,1) - CCTK_GFINDEX3D(cctkGH,0,0,0);\n+ const ptrdiff_t cdi CCTK_ATTRIBUTE_UNUSED = sizeof(CCTK_REAL) * di;\n+ const ptrdiff_t cdj CCTK_ATTRIBUTE_UNUSED = sizeof(CCTK_REAL) * dj;\n+ const ptrdiff_t cdk CCTK_ATTRIBUTE_UNUSED = sizeof(CCTK_REAL) * dk;\n+ const ptrdiff_t cctkLbnd1 CCTK_ATTRIBUTE_UNUSED = cctk_lbnd[0];\n+ const ptrdiff_t cctkLbnd2 CCTK_ATTRIBUTE_UNUSED = cctk_lbnd[1];\n+ const ptrdiff_t cctkLbnd3 CCTK_ATTRIBUTE_UNUSED = cctk_lbnd[2];\n+ const CCTK_REAL t CCTK_ATTRIBUTE_UNUSED = cctk_time;\n+ const CCTK_REAL cctkOriginSpace1 CCTK_ATTRIBUTE_UNUSED = \n+ CCTK_ORIGIN_SPACE(0);\n+ const CCTK_REAL cctkOriginSpace2 CCTK_ATTRIBUTE_UNUSED = \n+ CCTK_ORIGIN_SPACE(1);\n+ const CCTK_REAL cctkOriginSpace3 CCTK_ATTRIBUTE_UNUSED = \n+ CCTK_ORIGIN_SPACE(2);\n+ const CCTK_REAL dt CCTK_ATTRIBUTE_UNUSED = CCTK_DELTA_TIME;\n+ const CCTK_REAL dx CCTK_ATTRIBUTE_UNUSED = CCTK_DELTA_SPACE(0);\n+ const CCTK_REAL dy CCTK_ATTRIBUTE_UNUSED = CCTK_DELTA_SPACE(1);\n+ const CCTK_REAL dz CCTK_ATTRIBUTE_UNUSED = CCTK_DELTA_SPACE(2);\n+ const CCTK_REAL dxi CCTK_ATTRIBUTE_UNUSED = pow(dx,-1);\n+ const CCTK_REAL dyi CCTK_ATTRIBUTE_UNUSED = pow(dy,-1);\n+ const CCTK_REAL dzi CCTK_ATTRIBUTE_UNUSED = pow(dz,-1);\n+ const CCTK_REAL khalf CCTK_ATTRIBUTE_UNUSED = 0.5;\n+ const CCTK_REAL kthird CCTK_ATTRIBUTE_UNUSED = \n+ 0.333333333333333333333333333333;\n+ const CCTK_REAL ktwothird CCTK_ATTRIBUTE_UNUSED = \n+ 0.666666666666666666666666666667;\n+ const CCTK_REAL kfourthird CCTK_ATTRIBUTE_UNUSED = \n+ 1.33333333333333333333333333333;\n+ const CCTK_REAL hdxi CCTK_ATTRIBUTE_UNUSED = 0.5*dxi;\n+ const CCTK_REAL hdyi CCTK_ATTRIBUTE_UNUSED = 0.5*dyi;\n+ const CCTK_REAL hdzi CCTK_ATTRIBUTE_UNUSED = 0.5*dzi;\n+ /* Initialize predefined quantities */\n+ /* Assign local copies of arrays functions */\n+ \n+ \n+ /* Calculate temporaries and arrays functions */\n+ /* Copy local copies back to grid functions */\n+ /* Loop over the grid points */\n+ const int imin0=imin[0];\n+ const int imin1=imin[1];\n+ const int imin2=imin[2];\n+ const int imax0=imax[0];\n+ const int imax1=imax[1];\n+ const int imax2=imax[2];\n+ #pragma omp parallel\n+ CCTK_LOOP3(KerrSchild_initial,\n+ i,j,k, imin0,imin1,imin2, imax0,imax1,imax2,\n+ cctk_ash[0],cctk_ash[1],cctk_ash[2])\n+ {\n+ const ptrdiff_t index CCTK_ATTRIBUTE_UNUSED = di*i + dj*j + dk*k;\n+ /* Assign local copies of grid functions */\n+ \n+ CCTK_REAL alpL CCTK_ATTRIBUTE_UNUSED = alp[index];\n+ CCTK_REAL betaxL CCTK_ATTRIBUTE_UNUSED = betax[index];\n+ CCTK_REAL betayL CCTK_ATTRIBUTE_UNUSED = betay[index];\n+ CCTK_REAL betazL CCTK_ATTRIBUTE_UNUSED = betaz[index];\n+ CCTK_REAL dtbetaxL CCTK_ATTRIBUTE_UNUSED = dtbetax[index];\n+ CCTK_REAL dtbetayL CCTK_ATTRIBUTE_UNUSED = dtbetay[index];\n+ CCTK_REAL dtbetazL CCTK_ATTRIBUTE_UNUSED = dtbetaz[index];\n+ CCTK_REAL gxxL CCTK_ATTRIBUTE_UNUSED = gxx[index];\n+ CCTK_REAL gxyL CCTK_ATTRIBUTE_UNUSED = gxy[index];\n+ CCTK_REAL gxzL CCTK_ATTRIBUTE_UNUSED = gxz[index];\n+ CCTK_REAL gyyL CCTK_ATTRIBUTE_UNUSED = gyy[index];\n+ CCTK_REAL gyzL CCTK_ATTRIBUTE_UNUSED = gyz[index];\n+ CCTK_REAL gzzL CCTK_ATTRIBUTE_UNUSED = gzz[index];\n+ CCTK_REAL xL CCTK_ATTRIBUTE_UNUSED = x[index];\n+ CCTK_REAL yL CCTK_ATTRIBUTE_UNUSED = y[index];\n+ CCTK_REAL zL CCTK_ATTRIBUTE_UNUSED = z[index];\n+ \n+ /* Include user supplied include files */\n+ /* Precompute derivatives */\n+ /* Calculate temporaries and grid functions */\n+ CCTK_REAL xform1L00 CCTK_ATTRIBUTE_UNUSED = 1;\n+ \n+ CCTK_REAL xform1L01 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL xform1L02 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL xform1L03 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL xform1L10 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL csetemp0 CCTK_ATTRIBUTE_UNUSED = cos(phi);\n+ \n+ CCTK_REAL csetemp1 CCTK_ATTRIBUTE_UNUSED = cos(psi);\n+ \n+ CCTK_REAL csetemp2 CCTK_ATTRIBUTE_UNUSED = cos(theta);\n+ \n+ CCTK_REAL csetemp3 CCTK_ATTRIBUTE_UNUSED = sin(phi);\n+ \n+ CCTK_REAL csetemp4 CCTK_ATTRIBUTE_UNUSED = sin(psi);\n+ \n+ CCTK_REAL xform1L11 CCTK_ATTRIBUTE_UNUSED = csetemp0*csetemp1 - \n+ csetemp2*csetemp3*csetemp4;\n+ \n+ CCTK_REAL xform1L12 CCTK_ATTRIBUTE_UNUSED = csetemp1*csetemp3 + \n+ csetemp0*csetemp2*csetemp4;\n+ \n+ CCTK_REAL csetemp5 CCTK_ATTRIBUTE_UNUSED = sin(theta);\n+ \n+ CCTK_REAL xform1L13 CCTK_ATTRIBUTE_UNUSED = csetemp4*csetemp5;\n+ \n+ CCTK_REAL xform1L20 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL xform1L21 CCTK_ATTRIBUTE_UNUSED = \n+ -(csetemp1*csetemp2*csetemp3) - csetemp0*csetemp4;\n+ \n+ CCTK_REAL xform1L22 CCTK_ATTRIBUTE_UNUSED = csetemp0*csetemp1*csetemp2 \n+ - csetemp3*csetemp4;\n+ \n+ CCTK_REAL xform1L23 CCTK_ATTRIBUTE_UNUSED = csetemp1*csetemp5;\n+ \n+ CCTK_REAL xform1L30 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL xform1L31 CCTK_ATTRIBUTE_UNUSED = csetemp3*csetemp5;\n+ \n+ CCTK_REAL xform1L32 CCTK_ATTRIBUTE_UNUSED = -(csetemp0*csetemp5);\n+ \n+ CCTK_REAL xform1L33 CCTK_ATTRIBUTE_UNUSED = csetemp2;\n+ \n+ CCTK_REAL csetemp6 CCTK_ATTRIBUTE_UNUSED = pow(boostx,2);\n+ \n+ CCTK_REAL csetemp7 CCTK_ATTRIBUTE_UNUSED = pow(boosty,2);\n+ \n+ CCTK_REAL csetemp8 CCTK_ATTRIBUTE_UNUSED = pow(boostz,2);\n+ \n+ CCTK_REAL csetemp9 CCTK_ATTRIBUTE_UNUSED = pow(lapsefactor,-1);\n+ \n+ CCTK_REAL xform2L00 CCTK_ATTRIBUTE_UNUSED = csetemp9*(-1 + \n+ boostx*shiftaddx + boosty*shiftaddy + boostz*shiftaddz)*(1 - csetemp6 - \n+ csetemp7 - csetemp8 + pow(1 - csetemp6 - csetemp7 - \n+ csetemp8,0.5))*pow(-1 + csetemp6 + csetemp7 + csetemp8,-1)*pow(1 + \n+ pow(1 - csetemp6 - csetemp7 - csetemp8,0.5),-1);\n+ \n+ CCTK_REAL xform2L01 CCTK_ATTRIBUTE_UNUSED = boostx*csetemp9*(1 - \n+ csetemp6 - csetemp7 - csetemp8 + pow(1 - csetemp6 - csetemp7 - \n+ csetemp8,0.5))*pow(-1 + csetemp6 + csetemp7 + csetemp8,-1)*pow(1 + \n+ pow(1 - csetemp6 - csetemp7 - csetemp8,0.5),-1);\n+ \n+ CCTK_REAL xform2L02 CCTK_ATTRIBUTE_UNUSED = boosty*csetemp9*(1 - \n+ csetemp6 - csetemp7 - csetemp8 + pow(1 - csetemp6 - csetemp7 - \n+ csetemp8,0.5))*pow(-1 + csetemp6 + csetemp7 + csetemp8,-1)*pow(1 + \n+ pow(1 - csetemp6 - csetemp7 - csetemp8,0.5),-1);\n+ \n+ CCTK_REAL xform2L03 CCTK_ATTRIBUTE_UNUSED = boostz*csetemp9*(1 - \n+ csetemp6 - csetemp7 - csetemp8 + pow(1 - csetemp6 - csetemp7 - \n+ csetemp8,0.5))*pow(-1 + csetemp6 + csetemp7 + csetemp8,-1)*pow(1 + \n+ pow(1 - csetemp6 - csetemp7 - csetemp8,0.5),-1);\n+ \n+ CCTK_REAL xform2L10 CCTK_ATTRIBUTE_UNUSED = (-(boostx*(-1 + csetemp6 + \n+ csetemp7 + csetemp8 + (-1 + boosty*shiftaddy + boostz*shiftaddz)*pow(1 \n+ - csetemp6 - csetemp7 - csetemp8,0.5))) + shiftaddx*(csetemp6 + (-1 + \n+ csetemp7 + csetemp8)*(1 + pow(1 - csetemp6 - csetemp7 - \n+ csetemp8,0.5))))*pow(-1 + csetemp6 + csetemp7 + csetemp8,-1)*pow(1 + \n+ pow(1 - csetemp6 - csetemp7 - csetemp8,0.5),-1);\n+ \n+ CCTK_REAL xform2L11 CCTK_ATTRIBUTE_UNUSED = (csetemp6 + (-1 + csetemp7 \n+ + csetemp8)*(1 + pow(1 - csetemp6 - csetemp7 - csetemp8,0.5)))*pow(-1 + \n+ csetemp6 + csetemp7 + csetemp8,-1)*pow(1 + pow(1 - csetemp6 - csetemp7 \n+ - csetemp8,0.5),-1);\n+ \n+ CCTK_REAL xform2L12 CCTK_ATTRIBUTE_UNUSED = -(boostx*boosty*pow(-1 + \n+ csetemp6 + csetemp7 + csetemp8 - pow(1 - csetemp6 - csetemp7 - \n+ csetemp8,0.5),-1));\n+ \n+ CCTK_REAL xform2L13 CCTK_ATTRIBUTE_UNUSED = -(boostx*boostz*pow(-1 + \n+ csetemp6 + csetemp7 + csetemp8 - pow(1 - csetemp6 - csetemp7 - \n+ csetemp8,0.5),-1));\n+ \n+ CCTK_REAL xform2L20 CCTK_ATTRIBUTE_UNUSED = (-(boosty*(-1 + csetemp6 + \n+ csetemp7 + csetemp8 + (-1 + boostx*shiftaddx + boostz*shiftaddz)*pow(1 \n+ - csetemp6 - csetemp7 - csetemp8,0.5))) + shiftaddy*(csetemp7 + (-1 + \n+ csetemp6 + csetemp8)*(1 + pow(1 - csetemp6 - csetemp7 - \n+ csetemp8,0.5))))*pow(-1 + csetemp6 + csetemp7 + csetemp8,-1)*pow(1 + \n+ pow(1 - csetemp6 - csetemp7 - csetemp8,0.5),-1);\n+ \n+ CCTK_REAL xform2L21 CCTK_ATTRIBUTE_UNUSED = -(boostx*boosty*pow(-1 + \n+ csetemp6 + csetemp7 + csetemp8 - pow(1 - csetemp6 - csetemp7 - \n+ csetemp8,0.5),-1));\n+ \n+ CCTK_REAL xform2L22 CCTK_ATTRIBUTE_UNUSED = (csetemp7 + (-1 + csetemp6 \n+ + csetemp8)*(1 + pow(1 - csetemp6 - csetemp7 - csetemp8,0.5)))*pow(-1 + \n+ csetemp6 + csetemp7 + csetemp8,-1)*pow(1 + pow(1 - csetemp6 - csetemp7 \n+ - csetemp8,0.5),-1);\n+ \n+ CCTK_REAL xform2L23 CCTK_ATTRIBUTE_UNUSED = -(boosty*boostz*pow(-1 + \n+ csetemp6 + csetemp7 + csetemp8 - pow(1 - csetemp6 - csetemp7 - \n+ csetemp8,0.5),-1));\n+ \n+ CCTK_REAL xform2L30 CCTK_ATTRIBUTE_UNUSED = (shiftaddz*(-1 + csetemp6 \n+ + csetemp7 + csetemp8 + (-1 + csetemp6 + csetemp7)*pow(1 - csetemp6 - \n+ csetemp7 - csetemp8,0.5)) - boostz*(-1 + csetemp6 + csetemp7 + csetemp8 \n+ + (-1 + boostx*shiftaddx + boosty*shiftaddy)*pow(1 - csetemp6 - \n+ csetemp7 - csetemp8,0.5)))*pow(-1 + csetemp6 + csetemp7 + \n+ csetemp8,-1)*pow(1 + pow(1 - csetemp6 - csetemp7 - csetemp8,0.5),-1);\n+ \n+ CCTK_REAL xform2L31 CCTK_ATTRIBUTE_UNUSED = -(boostx*boostz*pow(-1 + \n+ csetemp6 + csetemp7 + csetemp8 - pow(1 - csetemp6 - csetemp7 - \n+ csetemp8,0.5),-1));\n+ \n+ CCTK_REAL xform2L32 CCTK_ATTRIBUTE_UNUSED = -(boosty*boostz*pow(-1 + \n+ csetemp6 + csetemp7 + csetemp8 - pow(1 - csetemp6 - csetemp7 - \n+ csetemp8,0.5),-1));\n+ \n+ CCTK_REAL xform2L33 CCTK_ATTRIBUTE_UNUSED = (-1 + csetemp6 + csetemp7 \n+ + csetemp8 + (-1 + csetemp6 + csetemp7)*pow(1 - csetemp6 - csetemp7 - \n+ csetemp8,0.5))*pow(-1 + csetemp6 + csetemp7 + csetemp8,-1)*pow(1 + \n+ pow(1 - csetemp6 - csetemp7 - csetemp8,0.5),-1);\n+ \n+ CCTK_REAL xformL00 CCTK_ATTRIBUTE_UNUSED = xform1L00*xform2L00 + \n+ xform1L01*xform2L10 + xform1L02*xform2L20 + xform1L03*xform2L30;\n+ \n+ CCTK_REAL xformL01 CCTK_ATTRIBUTE_UNUSED = xform1L00*xform2L01 + \n+ xform1L01*xform2L11 + xform1L02*xform2L21 + xform1L03*xform2L31;\n+ \n+ CCTK_REAL xformL02 CCTK_ATTRIBUTE_UNUSED = xform1L00*xform2L02 + \n+ xform1L01*xform2L12 + xform1L02*xform2L22 + xform1L03*xform2L32;\n+ \n+ CCTK_REAL xformL03 CCTK_ATTRIBUTE_UNUSED = xform1L00*xform2L03 + \n+ xform1L01*xform2L13 + xform1L02*xform2L23 + xform1L03*xform2L33;\n+ \n+ CCTK_REAL xformL10 CCTK_ATTRIBUTE_UNUSED = xform1L10*xform2L00 + \n+ xform1L11*xform2L10 + xform1L12*xform2L20 + xform1L13*xform2L30;\n+ \n+ CCTK_REAL xformL11 CCTK_ATTRIBUTE_UNUSED = xform1L10*xform2L01 + \n+ xform1L11*xform2L11 + xform1L12*xform2L21 + xform1L13*xform2L31;\n+ \n+ CCTK_REAL xformL12 CCTK_ATTRIBUTE_UNUSED = xform1L10*xform2L02 + \n+ xform1L11*xform2L12 + xform1L12*xform2L22 + xform1L13*xform2L32;\n+ \n+ CCTK_REAL xformL13 CCTK_ATTRIBUTE_UNUSED = xform1L10*xform2L03 + \n+ xform1L11*xform2L13 + xform1L12*xform2L23 + xform1L13*xform2L33;\n+ \n+ CCTK_REAL xformL20 CCTK_ATTRIBUTE_UNUSED = xform1L20*xform2L00 + \n+ xform1L21*xform2L10 + xform1L22*xform2L20 + xform1L23*xform2L30;\n+ \n+ CCTK_REAL xformL21 CCTK_ATTRIBUTE_UNUSED = xform1L20*xform2L01 + \n+ xform1L21*xform2L11 + xform1L22*xform2L21 + xform1L23*xform2L31;\n+ \n+ CCTK_REAL xformL22 CCTK_ATTRIBUTE_UNUSED = xform1L20*xform2L02 + \n+ xform1L21*xform2L12 + xform1L22*xform2L22 + xform1L23*xform2L32;\n+ \n+ CCTK_REAL xformL23 CCTK_ATTRIBUTE_UNUSED = xform1L20*xform2L03 + \n+ xform1L21*xform2L13 + xform1L22*xform2L23 + xform1L23*xform2L33;\n+ \n+ CCTK_REAL xformL30 CCTK_ATTRIBUTE_UNUSED = xform1L30*xform2L00 + \n+ xform1L31*xform2L10 + xform1L32*xform2L20 + xform1L33*xform2L30;\n+ \n+ CCTK_REAL xformL31 CCTK_ATTRIBUTE_UNUSED = xform1L30*xform2L01 + \n+ xform1L31*xform2L11 + xform1L32*xform2L21 + xform1L33*xform2L31;\n+ \n+ CCTK_REAL xformL32 CCTK_ATTRIBUTE_UNUSED = xform1L30*xform2L02 + \n+ xform1L31*xform2L12 + xform1L32*xform2L22 + xform1L33*xform2L32;\n+ \n+ CCTK_REAL xformL33 CCTK_ATTRIBUTE_UNUSED = xform1L30*xform2L03 + \n+ xform1L31*xform2L13 + xform1L32*xform2L23 + xform1L33*xform2L33;\n+ \n+ CCTK_REAL xx0 CCTK_ATTRIBUTE_UNUSED = t - timeoffset;\n+ \n+ CCTK_REAL xx1 CCTK_ATTRIBUTE_UNUSED = xL - positionx;\n+ \n+ CCTK_REAL xx2 CCTK_ATTRIBUTE_UNUSED = yL - positiony;\n+ \n+ CCTK_REAL xx3 CCTK_ATTRIBUTE_UNUSED = zL - positionz;\n+ \n+ CCTK_REAL txx1 CCTK_ATTRIBUTE_UNUSED = xformL10*xx0 + xformL11*xx1 + \n+ xformL12*xx2 + xformL13*xx3;\n+ \n+ CCTK_REAL txx2 CCTK_ATTRIBUTE_UNUSED = xformL20*xx0 + xformL21*xx1 + \n+ xformL22*xx2 + xformL23*xx3;\n+ \n+ CCTK_REAL txx3 CCTK_ATTRIBUTE_UNUSED = xformL30*xx0 + xformL31*xx1 + \n+ xformL32*xx2 + xformL33*xx3;\n+ \n+ CCTK_REAL X CCTK_ATTRIBUTE_UNUSED = txx1;\n+ \n+ CCTK_REAL Y CCTK_ATTRIBUTE_UNUSED = txx2;\n+ \n+ CCTK_REAL Z CCTK_ATTRIBUTE_UNUSED = txx3;\n+ \n+ CCTK_REAL csetemp10 CCTK_ATTRIBUTE_UNUSED = pow(a,2);\n+ \n+ CCTK_REAL csetemp11 CCTK_ATTRIBUTE_UNUSED = pow(X,2);\n+ \n+ CCTK_REAL csetemp12 CCTK_ATTRIBUTE_UNUSED = pow(Y,2);\n+ \n+ CCTK_REAL csetemp13 CCTK_ATTRIBUTE_UNUSED = pow(Z,2);\n+ \n+ CCTK_REAL rXYZ CCTK_ATTRIBUTE_UNUSED = \n+ 0.707106781186547524400844362105*pow(-csetemp10 + csetemp11 + csetemp12 \n+ + csetemp13 + pow(4*csetemp10*csetemp13 + pow(-csetemp10 + csetemp11 + \n+ csetemp12 + csetemp13,2),0.5),0.5);\n+ \n+ CCTK_REAL csetemp14 CCTK_ATTRIBUTE_UNUSED = pow(rXYZ,3);\n+ \n+ CCTK_REAL csetemp15 CCTK_ATTRIBUTE_UNUSED = pow(rXYZ,4);\n+ \n+ CCTK_REAL tg400 CCTK_ATTRIBUTE_UNUSED = -1 + \n+ 2*csetemp14*M*pow(csetemp10*csetemp13 + csetemp15,-1);\n+ \n+ CCTK_REAL csetemp16 CCTK_ATTRIBUTE_UNUSED = pow(rXYZ,2);\n+ \n+ CCTK_REAL csetemp17 CCTK_ATTRIBUTE_UNUSED = rXYZ*X;\n+ \n+ CCTK_REAL csetemp18 CCTK_ATTRIBUTE_UNUSED = a*Y;\n+ \n+ CCTK_REAL tg401 CCTK_ATTRIBUTE_UNUSED = 2*csetemp14*(csetemp17 + \n+ csetemp18)*M*pow(csetemp10*csetemp13 + csetemp15,-1)*pow(csetemp10 + \n+ csetemp16,-1);\n+ \n+ CCTK_REAL csetemp19 CCTK_ATTRIBUTE_UNUSED = a*X;\n+ \n+ CCTK_REAL csetemp20 CCTK_ATTRIBUTE_UNUSED = -csetemp19;\n+ \n+ CCTK_REAL csetemp21 CCTK_ATTRIBUTE_UNUSED = rXYZ*Y;\n+ \n+ CCTK_REAL tg402 CCTK_ATTRIBUTE_UNUSED = 2*csetemp14*(csetemp20 + \n+ csetemp21)*M*pow(csetemp10*csetemp13 + csetemp15,-1)*pow(csetemp10 + \n+ csetemp16,-1);\n+ \n+ CCTK_REAL tg403 CCTK_ATTRIBUTE_UNUSED = \n+ 2*csetemp16*M*Z*pow(csetemp10*csetemp13 + csetemp15,-1);\n+ \n+ CCTK_REAL tg411 CCTK_ATTRIBUTE_UNUSED = 1 + \n+ 2*csetemp14*M*pow(csetemp10*csetemp13 + csetemp15,-1)*pow(csetemp10 + \n+ csetemp16,-2)*pow(csetemp17 + csetemp18,2);\n+ \n+ CCTK_REAL tg412 CCTK_ATTRIBUTE_UNUSED = 2*csetemp14*(csetemp17 + \n+ csetemp18)*(csetemp20 + csetemp21)*M*pow(csetemp10*csetemp13 + \n+ csetemp15,-1)*pow(csetemp10 + csetemp16,-2);\n+ \n+ CCTK_REAL tg413 CCTK_ATTRIBUTE_UNUSED = 2*csetemp16*(csetemp17 + \n+ csetemp18)*M*Z*pow(csetemp10*csetemp13 + csetemp15,-1)*pow(csetemp10 + \n+ csetemp16,-1);\n+ \n+ CCTK_REAL tg422 CCTK_ATTRIBUTE_UNUSED = 1 + \n+ 2*csetemp14*M*pow(csetemp10*csetemp13 + csetemp15,-1)*pow(csetemp10 + \n+ csetemp16,-2)*pow(csetemp20 + csetemp21,2);\n+ \n+ CCTK_REAL tg423 CCTK_ATTRIBUTE_UNUSED = 2*csetemp16*(csetemp20 + \n+ csetemp21)*M*Z*pow(csetemp10*csetemp13 + csetemp15,-1)*pow(csetemp10 + \n+ csetemp16,-1);\n+ \n+ CCTK_REAL tg433 CCTK_ATTRIBUTE_UNUSED = 1 + \n+ 2*csetemp13*M*rXYZ*pow(csetemp10*csetemp13 + csetemp15,-1);\n+ \n+ CCTK_REAL tdg4000 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL csetemp22 CCTK_ATTRIBUTE_UNUSED = pow(rXYZ,7);\n+ \n+ CCTK_REAL tdg4001 CCTK_ATTRIBUTE_UNUSED = \n+ 2*(3*csetemp10*csetemp13*csetemp14 - \n+ csetemp22)*M*X*pow(csetemp10*csetemp13 + \n+ csetemp15,-2)*pow(4*csetemp10*csetemp13 + pow(-csetemp10 + csetemp11 + \n+ csetemp12 + csetemp13,2),-0.5);\n+ \n+ CCTK_REAL tdg4002 CCTK_ATTRIBUTE_UNUSED = \n+ 2*(3*csetemp10*csetemp13*csetemp14 - \n+ csetemp22)*M*Y*pow(csetemp10*csetemp13 + \n+ csetemp15,-2)*pow(4*csetemp10*csetemp13 + pow(-csetemp10 + csetemp11 + \n+ csetemp12 + csetemp13,2),-0.5);\n+ \n+ CCTK_REAL csetemp23 CCTK_ATTRIBUTE_UNUSED = pow(rXYZ,6);\n+ \n+ CCTK_REAL csetemp24 CCTK_ATTRIBUTE_UNUSED = pow(a,4);\n+ \n+ CCTK_REAL tdg4003 CCTK_ATTRIBUTE_UNUSED = 2*(csetemp10*(-5*csetemp15 + \n+ (-2*csetemp10 + 2*(csetemp11 + csetemp12) + 5*csetemp13)*csetemp16) - \n+ csetemp23 + 3*csetemp13*csetemp24)*M*rXYZ*Z*pow(csetemp10*csetemp13 + \n+ csetemp15,-2)*pow(4*csetemp10*csetemp13 + pow(-csetemp10 + csetemp11 + \n+ csetemp12 + csetemp13,2),-0.5);\n+ \n+ CCTK_REAL tdg4010 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL csetemp25 CCTK_ATTRIBUTE_UNUSED = pow(rXYZ,9);\n+ \n+ CCTK_REAL csetemp26 CCTK_ATTRIBUTE_UNUSED = pow(a,3);\n+ \n+ CCTK_REAL csetemp27 CCTK_ATTRIBUTE_UNUSED = pow(a,5);\n+ \n+ CCTK_REAL csetemp28 CCTK_ATTRIBUTE_UNUSED = pow(rXYZ,5);\n+ \n+ CCTK_REAL tdg4011 CCTK_ATTRIBUTE_UNUSED = 2*csetemp14*M*((3*csetemp10 \n+ - 3*csetemp11 - csetemp12 - csetemp13)*csetemp22 + 2*csetemp25 + \n+ csetemp10*((3*csetemp10 + csetemp11 - csetemp12 - \n+ csetemp13)*csetemp13*csetemp14 + (csetemp10 - csetemp11 - csetemp12 + \n+ csetemp13)*csetemp28) + (-3*a*csetemp23 - csetemp15*csetemp26 + \n+ 3*csetemp13*csetemp27)*X*Y + csetemp13*((csetemp10 + 3*csetemp11 - \n+ csetemp12 - csetemp13)*csetemp24*rXYZ + \n+ csetemp16*csetemp26*X*Y))*pow(csetemp10*csetemp13 + \n+ csetemp15,-2)*pow(csetemp10 + csetemp16,-2)*pow(4*csetemp10*csetemp13 + \n+ pow(-csetemp10 + csetemp11 + csetemp12 + csetemp13,2),-0.5);\n+ \n+ CCTK_REAL csetemp29 CCTK_ATTRIBUTE_UNUSED = pow(rXYZ,8);\n+ \n+ CCTK_REAL tdg4012 CCTK_ATTRIBUTE_UNUSED = 2*csetemp14*M*(((csetemp10 - \n+ csetemp11 - 2*csetemp12 + csetemp13)*csetemp15 + (3*csetemp10 - \n+ csetemp11 - csetemp13)*csetemp13*csetemp16)*csetemp26 + a*((3*csetemp10 \n+ - csetemp11 - 4*csetemp12 - csetemp13)*csetemp23 + 2*csetemp29) + \n+ (-2*csetemp22 + 4*csetemp13*csetemp24*rXYZ)*X*Y + csetemp13*((csetemp10 \n+ - csetemp11 + 2*csetemp12 - csetemp13)*csetemp27 + \n+ 2*csetemp10*csetemp14*X*Y))*pow(csetemp10*csetemp13 + \n+ csetemp15,-2)*pow(csetemp10 + csetemp16,-2)*pow(4*csetemp10*csetemp13 + \n+ pow(-csetemp10 + csetemp11 + csetemp12 + csetemp13,2),-0.5);\n+ \n+ CCTK_REAL tdg4013 CCTK_ATTRIBUTE_UNUSED = 2*M*rXYZ*((-2*csetemp22 + \n+ csetemp10*(2*(-csetemp10 + csetemp11 + csetemp12 + \n+ 2*csetemp13)*csetemp14 - 4*csetemp28) + 4*csetemp13*csetemp24*rXYZ)*X + \n+ (-3*a*csetemp23 + (-5*csetemp15 + (-2*csetemp10 + 2*(csetemp11 + \n+ csetemp12) + 3*csetemp13)*csetemp16)*csetemp26 + \n+ 3*csetemp13*csetemp27)*Y)*Z*pow(csetemp10*csetemp13 + \n+ csetemp15,-2)*pow(csetemp10 + csetemp16,-1)*pow(4*csetemp10*csetemp13 + \n+ pow(-csetemp10 + csetemp11 + csetemp12 + csetemp13,2),-0.5);\n+ \n+ CCTK_REAL tdg4020 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tdg4021 CCTK_ATTRIBUTE_UNUSED = -2*csetemp14*M*(((csetemp10 \n+ - 2*csetemp11 - csetemp12 + csetemp13)*csetemp15 + (3*csetemp10 - \n+ csetemp12 - csetemp13)*csetemp13*csetemp16)*csetemp26 + a*((3*csetemp10 \n+ - 4*csetemp11 - csetemp12 - csetemp13)*csetemp23 + 2*csetemp29) + \n+ (2*csetemp22 - 4*csetemp13*csetemp24*rXYZ)*X*Y + csetemp13*((csetemp10 \n+ + 2*csetemp11 - csetemp12 - csetemp13)*csetemp27 - \n+ 2*csetemp10*csetemp14*X*Y))*pow(csetemp10*csetemp13 + \n+ csetemp15,-2)*pow(csetemp10 + csetemp16,-2)*pow(4*csetemp10*csetemp13 + \n+ pow(-csetemp10 + csetemp11 + csetemp12 + csetemp13,2),-0.5);\n+ \n+ CCTK_REAL tdg4022 CCTK_ATTRIBUTE_UNUSED = 2*csetemp14*M*((3*csetemp10 \n+ - csetemp11 - 3*csetemp12 - csetemp13)*csetemp22 + 2*csetemp25 + \n+ csetemp10*((3*csetemp10 - csetemp11 + csetemp12 - \n+ csetemp13)*csetemp13*csetemp14 + (csetemp10 - csetemp11 - csetemp12 + \n+ csetemp13)*csetemp28) + (3*a*csetemp23 + csetemp15*csetemp26 - \n+ 3*csetemp13*csetemp27)*X*Y + csetemp13*((csetemp10 - csetemp11 + \n+ 3*csetemp12 - csetemp13)*csetemp24*rXYZ - \n+ csetemp16*csetemp26*X*Y))*pow(csetemp10*csetemp13 + \n+ csetemp15,-2)*pow(csetemp10 + csetemp16,-2)*pow(4*csetemp10*csetemp13 + \n+ pow(-csetemp10 + csetemp11 + csetemp12 + csetemp13,2),-0.5);\n+ \n+ CCTK_REAL tdg4023 CCTK_ATTRIBUTE_UNUSED = 2*M*rXYZ*((3*a*csetemp23 + \n+ (5*csetemp15 + (2*csetemp10 - 2*(csetemp11 + csetemp12) - \n+ 3*csetemp13)*csetemp16)*csetemp26)*X + (-2*csetemp22 + \n+ csetemp10*(2*(-csetemp10 + csetemp11 + csetemp12 + \n+ 2*csetemp13)*csetemp14 - 4*csetemp28))*Y + csetemp13*(-3*csetemp27*X + \n+ 4*csetemp24*rXYZ*Y))*Z*pow(csetemp10*csetemp13 + \n+ csetemp15,-2)*pow(csetemp10 + csetemp16,-1)*pow(4*csetemp10*csetemp13 + \n+ pow(-csetemp10 + csetemp11 + csetemp12 + csetemp13,2),-0.5);\n+ \n+ CCTK_REAL tdg4030 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tdg4031 CCTK_ATTRIBUTE_UNUSED = \n+ 4*(csetemp10*csetemp13*csetemp16 - \n+ csetemp23)*M*X*Z*pow(csetemp10*csetemp13 + \n+ csetemp15,-2)*pow(4*csetemp10*csetemp13 + pow(-csetemp10 + csetemp11 + \n+ csetemp12 + csetemp13,2),-0.5);\n+ \n+ CCTK_REAL tdg4032 CCTK_ATTRIBUTE_UNUSED = \n+ 4*(csetemp10*csetemp13*csetemp16 - \n+ csetemp23)*M*Y*Z*pow(csetemp10*csetemp13 + \n+ csetemp15,-2)*pow(4*csetemp10*csetemp13 + pow(-csetemp10 + csetemp11 + \n+ csetemp12 + csetemp13,2),-0.5);\n+ \n+ CCTK_REAL tdg4033 CCTK_ATTRIBUTE_UNUSED = 2*(csetemp10*csetemp13 - \n+ csetemp15)*(2*csetemp10*csetemp13 - 2*csetemp15 + (-csetemp10 + \n+ csetemp11 + csetemp12 + \n+ 3*csetemp13)*csetemp16)*M*pow(csetemp10*csetemp13 + \n+ csetemp15,-2)*pow(4*csetemp10*csetemp13 + pow(-csetemp10 + csetemp11 + \n+ csetemp12 + csetemp13,2),-0.5);\n+ \n+ CCTK_REAL tdg4110 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tdg4111 CCTK_ATTRIBUTE_UNUSED = 2*csetemp14*(csetemp17 + \n+ csetemp18)*M*((6*csetemp10 - 5*csetemp11 - 2*(csetemp12 + \n+ csetemp13))*csetemp22 + 4*csetemp25 + csetemp10*(csetemp13*(6*csetemp10 \n+ - csetemp11 - 2*(csetemp12 + csetemp13))*csetemp14 + (-csetemp11 - \n+ 2*csetemp12 + 2*(csetemp10 + csetemp13))*csetemp28) + (-5*a*csetemp23 - \n+ csetemp15*csetemp26 + 3*csetemp13*csetemp27)*X*Y + \n+ csetemp13*((2*csetemp10 + 3*csetemp11 - 2*(csetemp12 + \n+ csetemp13))*csetemp24*rXYZ - \n+ csetemp16*csetemp26*X*Y))*pow(csetemp10*csetemp13 + \n+ csetemp15,-2)*pow(csetemp10 + csetemp16,-3)*pow(4*csetemp10*csetemp13 + \n+ pow(-csetemp10 + csetemp11 + csetemp12 + csetemp13,2),-0.5);\n+ \n+ CCTK_REAL tdg4112 CCTK_ATTRIBUTE_UNUSED = 2*csetemp14*(csetemp17 + \n+ csetemp18)*M*(((-2*csetemp11 - 3*csetemp12 + 2*(csetemp10 + \n+ csetemp13))*csetemp15 + csetemp13*(6*csetemp10 - 3*csetemp12 - \n+ 2*(csetemp11 + csetemp13))*csetemp16)*csetemp26 + a*((6*csetemp10 - \n+ 7*csetemp12 - 2*(csetemp11 + csetemp13))*csetemp23 + 4*csetemp29) + \n+ (-3*csetemp22 + csetemp10*csetemp28 + 5*csetemp13*csetemp24*rXYZ)*X*Y + \n+ csetemp13*((2*csetemp10 + csetemp12 - 2*(csetemp11 + \n+ csetemp13))*csetemp27 + \n+ csetemp10*csetemp14*X*Y))*pow(csetemp10*csetemp13 + \n+ csetemp15,-2)*pow(csetemp10 + csetemp16,-3)*pow(4*csetemp10*csetemp13 + \n+ pow(-csetemp10 + csetemp11 + csetemp12 + csetemp13,2),-0.5);\n+ \n+ CCTK_REAL tdg4113 CCTK_ATTRIBUTE_UNUSED = 2*(csetemp17 + \n+ csetemp18)*M*rXYZ*((-3*csetemp22 + csetemp10*((-2*csetemp10 + \n+ 2*(csetemp11 + csetemp12) + 3*csetemp13)*csetemp14 - 3*csetemp28) + \n+ 5*csetemp13*csetemp24*rXYZ)*X + (-5*a*csetemp23 + (-5*csetemp15 + \n+ (-2*csetemp10 + 2*(csetemp11 + csetemp12) + \n+ csetemp13)*csetemp16)*csetemp26 + \n+ 3*csetemp13*csetemp27)*Y)*Z*pow(csetemp10*csetemp13 + \n+ csetemp15,-2)*pow(csetemp10 + csetemp16,-2)*pow(4*csetemp10*csetemp13 + \n+ pow(-csetemp10 + csetemp11 + csetemp12 + csetemp13,2),-0.5);\n+ \n+ CCTK_REAL tdg4120 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL csetemp30 CCTK_ATTRIBUTE_UNUSED = pow(rXYZ,10);\n+ \n+ CCTK_REAL csetemp31 CCTK_ATTRIBUTE_UNUSED = pow(a,6);\n+ \n+ CCTK_REAL tdg4121 CCTK_ATTRIBUTE_UNUSED = \n+ 2*csetemp14*M*((a*(2*(-3*csetemp10 + 3*csetemp11 - csetemp12 + \n+ csetemp13)*csetemp22 - 4*csetemp25) + \n+ csetemp26*(2*csetemp13*(-3*csetemp10 + csetemp11 + csetemp12 + \n+ csetemp13)*csetemp14 - 2*(csetemp10 - csetemp11 - csetemp12 + \n+ csetemp13)*csetemp28))*X + (csetemp10*(2*(-csetemp10 + 3*csetemp11 + \n+ csetemp13)*csetemp23 - csetemp15*(csetemp13*(csetemp12 + csetemp13) - \n+ csetemp10*(csetemp12 + 2*(csetemp11 + csetemp13)) + csetemp24)) - \n+ (-csetemp10 + 4*csetemp11 + csetemp12 + csetemp13)*csetemp29 + \n+ 2*csetemp30 + csetemp13*(-csetemp10 - 2*csetemp11 + csetemp12 + \n+ csetemp13)*csetemp31)*Y - 2*csetemp13*((csetemp10 + csetemp11 - \n+ 3*csetemp12 - csetemp13)*csetemp27*rXYZ*X + (csetemp10 - \n+ 3*csetemp11)*csetemp16*csetemp24*Y))*pow(csetemp10*csetemp13 + \n+ csetemp15,-2)*pow(csetemp10 + csetemp16,-3)*pow(4*csetemp10*csetemp13 + \n+ pow(-csetemp10 + csetemp11 + csetemp12 + csetemp13,2),-0.5);\n+ \n+ CCTK_REAL tdg4122 CCTK_ATTRIBUTE_UNUSED = \n+ -2*csetemp14*M*((csetemp10*csetemp15*(csetemp13*(csetemp11 + csetemp13) \n+ - csetemp10*(csetemp11 + 2*(csetemp12 + csetemp13)) + csetemp24) + \n+ (-csetemp10 + csetemp11 + 4*csetemp12 + csetemp13)*csetemp29 - \n+ 2*csetemp30 + (csetemp10 - csetemp11 + 2*csetemp12 - \n+ csetemp13)*csetemp13*csetemp31)*X + (-4*a*csetemp25 - 2*((csetemp10 - \n+ csetemp11 - csetemp12 + csetemp13)*csetemp26*csetemp28 + (csetemp10 - \n+ 3*csetemp11 + csetemp12 - csetemp13)*csetemp13*csetemp27*rXYZ))*Y + \n+ 2*((csetemp10*(csetemp10 - 3*csetemp12 - csetemp13)*csetemp23 + \n+ (csetemp10 - 3*csetemp12)*csetemp13*csetemp16*csetemp24)*X + \n+ (a*(-3*csetemp10 - csetemp11 + 3*csetemp12 + csetemp13)*csetemp22 + \n+ csetemp13*(-3*csetemp10 + csetemp11 + csetemp12 + \n+ csetemp13)*csetemp14*csetemp26)*Y))*pow(csetemp10*csetemp13 + \n+ csetemp15,-2)*pow(csetemp10 + csetemp16,-3)*pow(4*csetemp10*csetemp13 + \n+ pow(-csetemp10 + csetemp11 + csetemp12 + csetemp13,2),-0.5);\n+ \n+ CCTK_REAL tdg4123 CCTK_ATTRIBUTE_UNUSED = 2*M*rXYZ*((csetemp11 - \n+ csetemp12)*(4*a*csetemp22 + csetemp26*(-2*(-csetemp10 + csetemp11 + \n+ csetemp12 + csetemp13)*csetemp14 + 4*csetemp28)) + \n+ (csetemp10*((2*(csetemp11 + csetemp12) + 3*(csetemp10 + \n+ csetemp13))*csetemp15 + 2*csetemp23) + 2*(csetemp10 - csetemp11 - \n+ csetemp12 + 2*csetemp13)*csetemp16*csetemp24 - 3*csetemp29)*X*Y + \n+ csetemp13*(4*(-csetemp11 + csetemp12)*csetemp27*rXYZ - \n+ 3*csetemp31*X*Y))*Z*pow(csetemp10*csetemp13 + \n+ csetemp15,-2)*pow(csetemp10 + csetemp16,-2)*pow(4*csetemp10*csetemp13 + \n+ pow(-csetemp10 + csetemp11 + csetemp12 + csetemp13,2),-0.5);\n+ \n+ CCTK_REAL tdg4130 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tdg4131 CCTK_ATTRIBUTE_UNUSED = \n+ -2*csetemp16*M*((-3*csetemp10 + 4*csetemp11 + csetemp12 + \n+ csetemp13)*csetemp22 + csetemp10*(csetemp13*(-3*csetemp10 + csetemp12 + \n+ csetemp13)*csetemp14 - (csetemp10 - 2*csetemp11 - csetemp12 + \n+ csetemp13)*csetemp28) + csetemp13*(-csetemp10 - 2*csetemp11 + csetemp12 \n+ + csetemp13)*csetemp24*rXYZ + (4*a*csetemp23 + \n+ 2*csetemp15*csetemp26)*X*Y - 2*(csetemp25 + \n+ csetemp13*csetemp27*X*Y))*Z*pow(csetemp10*csetemp13 + \n+ csetemp15,-2)*pow(csetemp10 + csetemp16,-2)*pow(4*csetemp10*csetemp13 + \n+ pow(-csetemp10 + csetemp11 + csetemp12 + csetemp13,2),-0.5);\n+ \n+ CCTK_REAL tdg4132 CCTK_ATTRIBUTE_UNUSED = \n+ -2*csetemp16*M*((-((csetemp10 - csetemp11 - 3*csetemp12 + \n+ csetemp13)*csetemp15) + csetemp13*(-3*csetemp10 + csetemp11 + csetemp12 \n+ + csetemp13)*csetemp16)*csetemp26 + a*((-3*csetemp10 + csetemp11 + \n+ 5*csetemp12 + csetemp13)*csetemp23 - 2*csetemp29) + (3*csetemp22 + \n+ csetemp10*csetemp28 - 3*csetemp13*csetemp24*rXYZ)*X*Y + \n+ csetemp13*((-csetemp10 + csetemp11 - csetemp12 + csetemp13)*csetemp27 - \n+ csetemp10*csetemp14*X*Y))*Z*pow(csetemp10*csetemp13 + \n+ csetemp15,-2)*pow(csetemp10 + csetemp16,-2)*pow(4*csetemp10*csetemp13 + \n+ pow(-csetemp10 + csetemp11 + csetemp12 + csetemp13,2),-0.5);\n+ \n+ CCTK_REAL csetemp32 CCTK_ATTRIBUTE_UNUSED = pow(Z,4);\n+ \n+ CCTK_REAL tdg4133 CCTK_ATTRIBUTE_UNUSED = 2*M*((-((-csetemp10 + \n+ csetemp11 + csetemp12 + 4*csetemp13)*csetemp22) + 2*csetemp25 + \n+ csetemp10*csetemp13*((-csetemp10 + csetemp11 + csetemp12 + \n+ 2*csetemp13)*csetemp14 - 3*csetemp28) + 3*csetemp24*csetemp32*rXYZ)*X + \n+ (a*(csetemp10 - csetemp11 - csetemp12 - 5*csetemp13)*csetemp23 + \n+ csetemp13*(-4*csetemp15 + (-csetemp10 + csetemp11 + csetemp12 + \n+ csetemp13)*csetemp16)*csetemp26 + 2*(a*csetemp29 + \n+ csetemp27*csetemp32))*Y)*pow(csetemp10*csetemp13 + \n+ csetemp15,-2)*pow(csetemp10 + csetemp16,-1)*pow(4*csetemp10*csetemp13 + \n+ pow(-csetemp10 + csetemp11 + csetemp12 + csetemp13,2),-0.5);\n+ \n+ CCTK_REAL tdg4220 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL csetemp33 CCTK_ATTRIBUTE_UNUSED = -csetemp21;\n+ \n+ CCTK_REAL tdg4221 CCTK_ATTRIBUTE_UNUSED = 2*csetemp14*(csetemp19 + \n+ csetemp33)*M*(((-3*csetemp11 - 2*csetemp12 + 2*(csetemp10 + \n+ csetemp13))*csetemp15 + csetemp13*(6*csetemp10 - 3*csetemp11 - \n+ 2*(csetemp12 + csetemp13))*csetemp16)*csetemp26 + a*((6*csetemp10 - \n+ 7*csetemp11 - 2*(csetemp12 + csetemp13))*csetemp23 + 4*csetemp29) + \n+ (3*csetemp22 - csetemp10*csetemp28 - 5*csetemp13*csetemp24*rXYZ)*X*Y + \n+ csetemp13*((2*csetemp10 + csetemp11 - 2*(csetemp12 + \n+ csetemp13))*csetemp27 - \n+ csetemp10*csetemp14*X*Y))*pow(csetemp10*csetemp13 + \n+ csetemp15,-2)*pow(csetemp10 + csetemp16,-3)*pow(4*csetemp10*csetemp13 + \n+ pow(-csetemp10 + csetemp11 + csetemp12 + csetemp13,2),-0.5);\n+ \n+ CCTK_REAL tdg4222 CCTK_ATTRIBUTE_UNUSED = 2*csetemp14*(csetemp20 + \n+ csetemp21)*M*((6*csetemp10 - 5*csetemp12 - 2*(csetemp11 + \n+ csetemp13))*csetemp22 + 4*csetemp25 + csetemp10*(csetemp13*(6*csetemp10 \n+ - csetemp12 - 2*(csetemp11 + csetemp13))*csetemp14 + (-2*csetemp11 - \n+ csetemp12 + 2*(csetemp10 + csetemp13))*csetemp28) + (5*a*csetemp23 + \n+ csetemp15*csetemp26 - 3*csetemp13*csetemp27)*X*Y + \n+ csetemp13*((2*csetemp10 + 3*csetemp12 - 2*(csetemp11 + \n+ csetemp13))*csetemp24*rXYZ + \n+ csetemp16*csetemp26*X*Y))*pow(csetemp10*csetemp13 + \n+ csetemp15,-2)*pow(csetemp10 + csetemp16,-3)*pow(4*csetemp10*csetemp13 + \n+ pow(-csetemp10 + csetemp11 + csetemp12 + csetemp13,2),-0.5);\n+ \n+ CCTK_REAL tdg4223 CCTK_ATTRIBUTE_UNUSED = 2*(csetemp19 + \n+ csetemp33)*M*rXYZ*((-5*csetemp15 + (-2*csetemp10 + 2*(csetemp11 + \n+ csetemp12) + csetemp13)*csetemp16)*csetemp26*X + \n+ csetemp10*((2*csetemp10 - 2*(csetemp11 + csetemp12) - \n+ 3*csetemp13)*csetemp14 + 3*csetemp28)*Y + 3*(csetemp13*csetemp27*X + \n+ csetemp22*Y) - 5*(a*csetemp23*X + \n+ csetemp13*csetemp24*rXYZ*Y))*Z*pow(csetemp10*csetemp13 + \n+ csetemp15,-2)*pow(csetemp10 + csetemp16,-2)*pow(4*csetemp10*csetemp13 + \n+ pow(-csetemp10 + csetemp11 + csetemp12 + csetemp13,2),-0.5);\n+ \n+ CCTK_REAL tdg4230 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tdg4231 CCTK_ATTRIBUTE_UNUSED = 2*csetemp16*M*((-((csetemp10 \n+ - 3*csetemp11 - csetemp12 + csetemp13)*csetemp15) + \n+ csetemp13*(-3*csetemp10 + csetemp11 + csetemp12 + \n+ csetemp13)*csetemp16)*csetemp26 + a*((-3*csetemp10 + 5*csetemp11 + \n+ csetemp12 + csetemp13)*csetemp23 - 2*csetemp29) + (-3*csetemp22 - \n+ csetemp10*csetemp28 + 3*csetemp13*csetemp24*rXYZ)*X*Y + \n+ csetemp13*((-csetemp10 - csetemp11 + csetemp12 + csetemp13)*csetemp27 + \n+ csetemp10*csetemp14*X*Y))*Z*pow(csetemp10*csetemp13 + \n+ csetemp15,-2)*pow(csetemp10 + csetemp16,-2)*pow(4*csetemp10*csetemp13 + \n+ pow(-csetemp10 + csetemp11 + csetemp12 + csetemp13,2),-0.5);\n+ \n+ CCTK_REAL tdg4232 CCTK_ATTRIBUTE_UNUSED = \n+ -2*csetemp16*M*((-3*csetemp10 + csetemp11 + 4*csetemp12 + \n+ csetemp13)*csetemp22 + csetemp10*(csetemp13*(-3*csetemp10 + csetemp11 + \n+ csetemp13)*csetemp14 - (csetemp10 - csetemp11 - 2*csetemp12 + \n+ csetemp13)*csetemp28) - 4*a*csetemp23*X*Y - 2*(csetemp25 + \n+ csetemp15*csetemp26*X*Y) + csetemp13*((-csetemp10 + csetemp11 - \n+ 2*csetemp12 + csetemp13)*csetemp24*rXYZ + \n+ 2*csetemp27*X*Y))*Z*pow(csetemp10*csetemp13 + \n+ csetemp15,-2)*pow(csetemp10 + csetemp16,-2)*pow(4*csetemp10*csetemp13 + \n+ pow(-csetemp10 + csetemp11 + csetemp12 + csetemp13,2),-0.5);\n+ \n+ CCTK_REAL tdg4233 CCTK_ATTRIBUTE_UNUSED = -2*M*(a*((csetemp10 - \n+ csetemp11 - csetemp12 - 5*csetemp13)*csetemp23 + 2*csetemp29)*X + \n+ ((-csetemp10 + csetemp11 + csetemp12 + 4*csetemp13)*csetemp22 - \n+ 2*csetemp25 + 3*csetemp10*csetemp13*csetemp28)*Y + \n+ csetemp13*((-4*csetemp15 + (-csetemp10 + csetemp11 + csetemp12 + \n+ csetemp13)*csetemp16)*csetemp26*X + csetemp10*(csetemp10 - csetemp11 - \n+ csetemp12 - 2*csetemp13)*csetemp14*Y) + csetemp32*(2*csetemp27*X - \n+ 3*csetemp24*rXYZ*Y))*pow(csetemp10*csetemp13 + \n+ csetemp15,-2)*pow(csetemp10 + csetemp16,-1)*pow(4*csetemp10*csetemp13 + \n+ pow(-csetemp10 + csetemp11 + csetemp12 + csetemp13,2),-0.5);\n+ \n+ CCTK_REAL tdg4330 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tdg4331 CCTK_ATTRIBUTE_UNUSED = 2*csetemp13*M*(-3*csetemp28 \n+ + csetemp10*csetemp13*rXYZ)*X*pow(csetemp10*csetemp13 + \n+ csetemp15,-2)*pow(4*csetemp10*csetemp13 + pow(-csetemp10 + csetemp11 + \n+ csetemp12 + csetemp13,2),-0.5);\n+ \n+ CCTK_REAL tdg4332 CCTK_ATTRIBUTE_UNUSED = 2*csetemp13*M*(-3*csetemp28 \n+ + csetemp10*csetemp13*rXYZ)*Y*pow(csetemp10*csetemp13 + \n+ csetemp15,-2)*pow(4*csetemp10*csetemp13 + pow(-csetemp10 + csetemp11 + \n+ csetemp12 + csetemp13,2),-0.5);\n+ \n+ CCTK_REAL tdg4333 CCTK_ATTRIBUTE_UNUSED = 2*((2*csetemp10 - \n+ 2*(csetemp11 + csetemp12) - 5*csetemp13)*csetemp23 + 4*csetemp29 + \n+ csetemp24*csetemp32 + csetemp10*(-3*csetemp13*csetemp15 + \n+ csetemp16*csetemp32))*M*Z*pow(csetemp10*csetemp13 + \n+ csetemp15,-2)*pow(rXYZ,-1)*pow(4*csetemp10*csetemp13 + pow(-csetemp10 + \n+ csetemp11 + csetemp12 + csetemp13,2),-0.5);\n+ \n+ CCTK_REAL g400 CCTK_ATTRIBUTE_UNUSED = 2*(tg423*xformL20*xformL30 + \n+ xformL00*(tg401*xformL10 + tg402*xformL20 + tg403*xformL30) + \n+ xformL10*(tg412*xformL20 + tg413*xformL30)) + tg400*pow(xformL00,2) + \n+ tg411*pow(xformL10,2) + tg422*pow(xformL20,2) + tg433*pow(xformL30,2);\n+ \n+ CCTK_REAL csetemp34 CCTK_ATTRIBUTE_UNUSED = tg400*xformL01;\n+ \n+ CCTK_REAL csetemp35 CCTK_ATTRIBUTE_UNUSED = tg401*xformL11;\n+ \n+ CCTK_REAL csetemp36 CCTK_ATTRIBUTE_UNUSED = tg402*xformL21;\n+ \n+ CCTK_REAL csetemp37 CCTK_ATTRIBUTE_UNUSED = tg403*xformL31;\n+ \n+ CCTK_REAL csetemp38 CCTK_ATTRIBUTE_UNUSED = tg401*xformL01;\n+ \n+ CCTK_REAL csetemp39 CCTK_ATTRIBUTE_UNUSED = tg411*xformL11;\n+ \n+ CCTK_REAL csetemp40 CCTK_ATTRIBUTE_UNUSED = tg412*xformL21;\n+ \n+ CCTK_REAL csetemp41 CCTK_ATTRIBUTE_UNUSED = tg413*xformL31;\n+ \n+ CCTK_REAL csetemp42 CCTK_ATTRIBUTE_UNUSED = tg402*xformL01;\n+ \n+ CCTK_REAL csetemp43 CCTK_ATTRIBUTE_UNUSED = tg412*xformL11;\n+ \n+ CCTK_REAL csetemp44 CCTK_ATTRIBUTE_UNUSED = tg422*xformL21;\n+ \n+ CCTK_REAL csetemp45 CCTK_ATTRIBUTE_UNUSED = tg423*xformL31;\n+ \n+ CCTK_REAL csetemp46 CCTK_ATTRIBUTE_UNUSED = tg403*xformL01;\n+ \n+ CCTK_REAL csetemp47 CCTK_ATTRIBUTE_UNUSED = tg413*xformL11;\n+ \n+ CCTK_REAL csetemp48 CCTK_ATTRIBUTE_UNUSED = tg423*xformL21;\n+ \n+ CCTK_REAL csetemp49 CCTK_ATTRIBUTE_UNUSED = tg433*xformL31;\n+ \n+ CCTK_REAL g401 CCTK_ATTRIBUTE_UNUSED = (csetemp34 + csetemp35 + \n+ csetemp36 + csetemp37)*xformL00 + (csetemp38 + csetemp39 + csetemp40 + \n+ csetemp41)*xformL10 + (csetemp42 + csetemp43 + csetemp44 + \n+ csetemp45)*xformL20 + (csetemp46 + csetemp47 + csetemp48 + \n+ csetemp49)*xformL30;\n+ \n+ CCTK_REAL csetemp50 CCTK_ATTRIBUTE_UNUSED = tg400*xformL02;\n+ \n+ CCTK_REAL csetemp51 CCTK_ATTRIBUTE_UNUSED = tg401*xformL12;\n+ \n+ CCTK_REAL csetemp52 CCTK_ATTRIBUTE_UNUSED = tg402*xformL22;\n+ \n+ CCTK_REAL csetemp53 CCTK_ATTRIBUTE_UNUSED = tg403*xformL32;\n+ \n+ CCTK_REAL csetemp54 CCTK_ATTRIBUTE_UNUSED = tg401*xformL02;\n+ \n+ CCTK_REAL csetemp55 CCTK_ATTRIBUTE_UNUSED = tg411*xformL12;\n+ \n+ CCTK_REAL csetemp56 CCTK_ATTRIBUTE_UNUSED = tg412*xformL22;\n+ \n+ CCTK_REAL csetemp57 CCTK_ATTRIBUTE_UNUSED = tg413*xformL32;\n+ \n+ CCTK_REAL csetemp58 CCTK_ATTRIBUTE_UNUSED = tg402*xformL02;\n+ \n+ CCTK_REAL csetemp59 CCTK_ATTRIBUTE_UNUSED = tg412*xformL12;\n+ \n+ CCTK_REAL csetemp60 CCTK_ATTRIBUTE_UNUSED = tg422*xformL22;\n+ \n+ CCTK_REAL csetemp61 CCTK_ATTRIBUTE_UNUSED = tg423*xformL32;\n+ \n+ CCTK_REAL csetemp62 CCTK_ATTRIBUTE_UNUSED = tg403*xformL02;\n+ \n+ CCTK_REAL csetemp63 CCTK_ATTRIBUTE_UNUSED = tg413*xformL12;\n+ \n+ CCTK_REAL csetemp64 CCTK_ATTRIBUTE_UNUSED = tg423*xformL22;\n+ \n+ CCTK_REAL csetemp65 CCTK_ATTRIBUTE_UNUSED = tg433*xformL32;\n+ \n+ CCTK_REAL g402 CCTK_ATTRIBUTE_UNUSED = (csetemp50 + csetemp51 + \n+ csetemp52 + csetemp53)*xformL00 + (csetemp54 + csetemp55 + csetemp56 + \n+ csetemp57)*xformL10 + (csetemp58 + csetemp59 + csetemp60 + \n+ csetemp61)*xformL20 + (csetemp62 + csetemp63 + csetemp64 + \n+ csetemp65)*xformL30;\n+ \n+ CCTK_REAL csetemp66 CCTK_ATTRIBUTE_UNUSED = tg400*xformL03;\n+ \n+ CCTK_REAL csetemp67 CCTK_ATTRIBUTE_UNUSED = tg401*xformL13;\n+ \n+ CCTK_REAL csetemp68 CCTK_ATTRIBUTE_UNUSED = tg402*xformL23;\n+ \n+ CCTK_REAL csetemp69 CCTK_ATTRIBUTE_UNUSED = tg403*xformL33;\n+ \n+ CCTK_REAL csetemp70 CCTK_ATTRIBUTE_UNUSED = tg401*xformL03;\n+ \n+ CCTK_REAL csetemp71 CCTK_ATTRIBUTE_UNUSED = tg411*xformL13;\n+ \n+ CCTK_REAL csetemp72 CCTK_ATTRIBUTE_UNUSED = tg412*xformL23;\n+ \n+ CCTK_REAL csetemp73 CCTK_ATTRIBUTE_UNUSED = tg413*xformL33;\n+ \n+ CCTK_REAL csetemp74 CCTK_ATTRIBUTE_UNUSED = tg402*xformL03;\n+ \n+ CCTK_REAL csetemp75 CCTK_ATTRIBUTE_UNUSED = tg412*xformL13;\n+ \n+ CCTK_REAL csetemp76 CCTK_ATTRIBUTE_UNUSED = tg422*xformL23;\n+ \n+ CCTK_REAL csetemp77 CCTK_ATTRIBUTE_UNUSED = tg423*xformL33;\n+ \n+ CCTK_REAL csetemp78 CCTK_ATTRIBUTE_UNUSED = tg403*xformL03;\n+ \n+ CCTK_REAL csetemp79 CCTK_ATTRIBUTE_UNUSED = tg413*xformL13;\n+ \n+ CCTK_REAL csetemp80 CCTK_ATTRIBUTE_UNUSED = tg423*xformL23;\n+ \n+ CCTK_REAL csetemp81 CCTK_ATTRIBUTE_UNUSED = tg433*xformL33;\n+ \n+ CCTK_REAL g403 CCTK_ATTRIBUTE_UNUSED = (csetemp66 + csetemp67 + \n+ csetemp68 + csetemp69)*xformL00 + (csetemp70 + csetemp71 + csetemp72 + \n+ csetemp73)*xformL10 + (csetemp74 + csetemp75 + csetemp76 + \n+ csetemp77)*xformL20 + (csetemp78 + csetemp79 + csetemp80 + \n+ csetemp81)*xformL30;\n+ \n+ CCTK_REAL g411 CCTK_ATTRIBUTE_UNUSED = (csetemp34 + csetemp35 + \n+ csetemp36 + csetemp37)*xformL01 + (csetemp38 + csetemp39 + csetemp40 + \n+ csetemp41)*xformL11 + (csetemp42 + csetemp43 + csetemp44 + \n+ csetemp45)*xformL21 + (csetemp46 + csetemp47 + csetemp48 + \n+ csetemp49)*xformL31;\n+ \n+ CCTK_REAL g412 CCTK_ATTRIBUTE_UNUSED = (csetemp50 + csetemp51 + \n+ csetemp52 + csetemp53)*xformL01 + (csetemp54 + csetemp55 + csetemp56 + \n+ csetemp57)*xformL11 + (csetemp58 + csetemp59 + csetemp60 + \n+ csetemp61)*xformL21 + (csetemp62 + csetemp63 + csetemp64 + \n+ csetemp65)*xformL31;\n+ \n+ CCTK_REAL g413 CCTK_ATTRIBUTE_UNUSED = (csetemp66 + csetemp67 + \n+ csetemp68 + csetemp69)*xformL01 + (csetemp70 + csetemp71 + csetemp72 + \n+ csetemp73)*xformL11 + (csetemp74 + csetemp75 + csetemp76 + \n+ csetemp77)*xformL21 + (csetemp78 + csetemp79 + csetemp80 + \n+ csetemp81)*xformL31;\n+ \n+ CCTK_REAL g422 CCTK_ATTRIBUTE_UNUSED = (csetemp50 + csetemp51 + \n+ csetemp52 + csetemp53)*xformL02 + (csetemp54 + csetemp55 + csetemp56 + \n+ csetemp57)*xformL12 + (csetemp58 + csetemp59 + csetemp60 + \n+ csetemp61)*xformL22 + (csetemp62 + csetemp63 + csetemp64 + \n+ csetemp65)*xformL32;\n+ \n+ CCTK_REAL g423 CCTK_ATTRIBUTE_UNUSED = (csetemp66 + csetemp67 + \n+ csetemp68 + csetemp69)*xformL02 + (csetemp70 + csetemp71 + csetemp72 + \n+ csetemp73)*xformL12 + (csetemp74 + csetemp75 + csetemp76 + \n+ csetemp77)*xformL22 + (csetemp78 + csetemp79 + csetemp80 + \n+ csetemp81)*xformL32;\n+ \n+ CCTK_REAL g433 CCTK_ATTRIBUTE_UNUSED = (csetemp66 + csetemp67 + \n+ csetemp68 + csetemp69)*xformL03 + (csetemp70 + csetemp71 + csetemp72 + \n+ csetemp73)*xformL13 + (csetemp74 + csetemp75 + csetemp76 + \n+ csetemp77)*xformL23 + (csetemp78 + csetemp79 + csetemp80 + \n+ csetemp81)*xformL33;\n+ \n+ CCTK_REAL csetemp82 CCTK_ATTRIBUTE_UNUSED = tdg4000*xformL00;\n+ \n+ CCTK_REAL csetemp83 CCTK_ATTRIBUTE_UNUSED = tdg4001*xformL10;\n+ \n+ CCTK_REAL csetemp84 CCTK_ATTRIBUTE_UNUSED = tdg4002*xformL20;\n+ \n+ CCTK_REAL csetemp85 CCTK_ATTRIBUTE_UNUSED = tdg4003*xformL30;\n+ \n+ CCTK_REAL csetemp86 CCTK_ATTRIBUTE_UNUSED = tdg4010*xformL00;\n+ \n+ CCTK_REAL csetemp87 CCTK_ATTRIBUTE_UNUSED = tdg4011*xformL10;\n+ \n+ CCTK_REAL csetemp88 CCTK_ATTRIBUTE_UNUSED = tdg4012*xformL20;\n+ \n+ CCTK_REAL csetemp89 CCTK_ATTRIBUTE_UNUSED = tdg4013*xformL30;\n+ \n+ CCTK_REAL csetemp90 CCTK_ATTRIBUTE_UNUSED = tdg4020*xformL00;\n+ \n+ CCTK_REAL csetemp91 CCTK_ATTRIBUTE_UNUSED = tdg4021*xformL10;\n+ \n+ CCTK_REAL csetemp92 CCTK_ATTRIBUTE_UNUSED = tdg4022*xformL20;\n+ \n+ CCTK_REAL csetemp93 CCTK_ATTRIBUTE_UNUSED = tdg4023*xformL30;\n+ \n+ CCTK_REAL csetemp94 CCTK_ATTRIBUTE_UNUSED = tdg4030*xformL00;\n+ \n+ CCTK_REAL csetemp95 CCTK_ATTRIBUTE_UNUSED = tdg4031*xformL10;\n+ \n+ CCTK_REAL csetemp96 CCTK_ATTRIBUTE_UNUSED = tdg4032*xformL20;\n+ \n+ CCTK_REAL csetemp97 CCTK_ATTRIBUTE_UNUSED = tdg4033*xformL30;\n+ \n+ CCTK_REAL csetemp98 CCTK_ATTRIBUTE_UNUSED = tdg4110*xformL00;\n+ \n+ CCTK_REAL csetemp99 CCTK_ATTRIBUTE_UNUSED = tdg4111*xformL10;\n+ \n+ CCTK_REAL csetemp100 CCTK_ATTRIBUTE_UNUSED = tdg4112*xformL20;\n+ \n+ CCTK_REAL csetemp101 CCTK_ATTRIBUTE_UNUSED = tdg4113*xformL30;\n+ \n+ CCTK_REAL csetemp102 CCTK_ATTRIBUTE_UNUSED = tdg4120*xformL00;\n+ \n+ CCTK_REAL csetemp103 CCTK_ATTRIBUTE_UNUSED = tdg4121*xformL10;\n+ \n+ CCTK_REAL csetemp104 CCTK_ATTRIBUTE_UNUSED = tdg4122*xformL20;\n+ \n+ CCTK_REAL csetemp105 CCTK_ATTRIBUTE_UNUSED = tdg4123*xformL30;\n+ \n+ CCTK_REAL csetemp106 CCTK_ATTRIBUTE_UNUSED = tdg4130*xformL00;\n+ \n+ CCTK_REAL csetemp107 CCTK_ATTRIBUTE_UNUSED = tdg4131*xformL10;\n+ \n+ CCTK_REAL csetemp108 CCTK_ATTRIBUTE_UNUSED = tdg4132*xformL20;\n+ \n+ CCTK_REAL csetemp109 CCTK_ATTRIBUTE_UNUSED = tdg4133*xformL30;\n+ \n+ CCTK_REAL csetemp110 CCTK_ATTRIBUTE_UNUSED = tdg4220*xformL00;\n+ \n+ CCTK_REAL csetemp111 CCTK_ATTRIBUTE_UNUSED = tdg4221*xformL10;\n+ \n+ CCTK_REAL csetemp112 CCTK_ATTRIBUTE_UNUSED = tdg4222*xformL20;\n+ \n+ CCTK_REAL csetemp113 CCTK_ATTRIBUTE_UNUSED = tdg4223*xformL30;\n+ \n+ CCTK_REAL csetemp114 CCTK_ATTRIBUTE_UNUSED = tdg4230*xformL00;\n+ \n+ CCTK_REAL csetemp115 CCTK_ATTRIBUTE_UNUSED = tdg4231*xformL10;\n+ \n+ CCTK_REAL csetemp116 CCTK_ATTRIBUTE_UNUSED = tdg4232*xformL20;\n+ \n+ CCTK_REAL csetemp117 CCTK_ATTRIBUTE_UNUSED = tdg4233*xformL30;\n+ \n+ CCTK_REAL csetemp118 CCTK_ATTRIBUTE_UNUSED = tdg4330*xformL00;\n+ \n+ CCTK_REAL csetemp119 CCTK_ATTRIBUTE_UNUSED = tdg4331*xformL10;\n+ \n+ CCTK_REAL csetemp120 CCTK_ATTRIBUTE_UNUSED = tdg4332*xformL20;\n+ \n+ CCTK_REAL csetemp121 CCTK_ATTRIBUTE_UNUSED = tdg4333*xformL30;\n+ \n+ CCTK_REAL dg4000 CCTK_ATTRIBUTE_UNUSED = xformL10*((csetemp86 + \n+ csetemp87 + csetemp88 + csetemp89)*xformL00 + (csetemp100 + csetemp101 \n+ + csetemp98 + csetemp99)*xformL10 + (csetemp102 + csetemp103 + \n+ csetemp104 + csetemp105)*xformL20 + (csetemp106 + csetemp107 + \n+ csetemp108 + csetemp109)*xformL30) + xformL20*((csetemp90 + csetemp91 + \n+ csetemp92 + csetemp93)*xformL00 + (csetemp102 + csetemp103 + csetemp104 \n+ + csetemp105)*xformL10 + (csetemp110 + csetemp111 + csetemp112 + \n+ csetemp113)*xformL20 + (csetemp114 + csetemp115 + csetemp116 + \n+ csetemp117)*xformL30) + xformL30*((csetemp94 + csetemp95 + csetemp96 + \n+ csetemp97)*xformL00 + (csetemp106 + csetemp107 + csetemp108 + \n+ csetemp109)*xformL10 + (csetemp114 + csetemp115 + csetemp116 + \n+ csetemp117)*xformL20 + (csetemp118 + csetemp119 + csetemp120 + \n+ csetemp121)*xformL30) + xformL00*((csetemp82 + csetemp83 + csetemp84 + \n+ csetemp85)*xformL00 + (csetemp86 + csetemp87 + csetemp88 + \n+ csetemp89)*xformL10 + (csetemp90 + csetemp91 + csetemp92 + \n+ csetemp93)*xformL20 + (csetemp94 + csetemp95 + csetemp96 + \n+ csetemp97)*xformL30);\n+ \n+ CCTK_REAL dg4010 CCTK_ATTRIBUTE_UNUSED = xformL10*((csetemp86 + \n+ csetemp87 + csetemp88 + csetemp89)*xformL01 + (csetemp100 + csetemp101 \n+ + csetemp98 + csetemp99)*xformL11 + (csetemp102 + csetemp103 + \n+ csetemp104 + csetemp105)*xformL21 + (csetemp106 + csetemp107 + \n+ csetemp108 + csetemp109)*xformL31) + xformL20*((csetemp90 + csetemp91 + \n+ csetemp92 + csetemp93)*xformL01 + (csetemp102 + csetemp103 + csetemp104 \n+ + csetemp105)*xformL11 + (csetemp110 + csetemp111 + csetemp112 + \n+ csetemp113)*xformL21 + (csetemp114 + csetemp115 + csetemp116 + \n+ csetemp117)*xformL31) + xformL30*((csetemp94 + csetemp95 + csetemp96 + \n+ csetemp97)*xformL01 + (csetemp106 + csetemp107 + csetemp108 + \n+ csetemp109)*xformL11 + (csetemp114 + csetemp115 + csetemp116 + \n+ csetemp117)*xformL21 + (csetemp118 + csetemp119 + csetemp120 + \n+ csetemp121)*xformL31) + xformL00*((csetemp82 + csetemp83 + csetemp84 + \n+ csetemp85)*xformL01 + (csetemp86 + csetemp87 + csetemp88 + \n+ csetemp89)*xformL11 + (csetemp90 + csetemp91 + csetemp92 + \n+ csetemp93)*xformL21 + (csetemp94 + csetemp95 + csetemp96 + \n+ csetemp97)*xformL31);\n+ \n+ CCTK_REAL csetemp122 CCTK_ATTRIBUTE_UNUSED = tdg4000*xformL01;\n+ \n+ CCTK_REAL csetemp123 CCTK_ATTRIBUTE_UNUSED = tdg4001*xformL11;\n+ \n+ CCTK_REAL csetemp124 CCTK_ATTRIBUTE_UNUSED = tdg4002*xformL21;\n+ \n+ CCTK_REAL csetemp125 CCTK_ATTRIBUTE_UNUSED = tdg4003*xformL31;\n+ \n+ CCTK_REAL csetemp126 CCTK_ATTRIBUTE_UNUSED = tdg4010*xformL01;\n+ \n+ CCTK_REAL csetemp127 CCTK_ATTRIBUTE_UNUSED = tdg4011*xformL11;\n+ \n+ CCTK_REAL csetemp128 CCTK_ATTRIBUTE_UNUSED = tdg4012*xformL21;\n+ \n+ CCTK_REAL csetemp129 CCTK_ATTRIBUTE_UNUSED = tdg4013*xformL31;\n+ \n+ CCTK_REAL csetemp130 CCTK_ATTRIBUTE_UNUSED = tdg4020*xformL01;\n+ \n+ CCTK_REAL csetemp131 CCTK_ATTRIBUTE_UNUSED = tdg4021*xformL11;\n+ \n+ CCTK_REAL csetemp132 CCTK_ATTRIBUTE_UNUSED = tdg4022*xformL21;\n+ \n+ CCTK_REAL csetemp133 CCTK_ATTRIBUTE_UNUSED = tdg4023*xformL31;\n+ \n+ CCTK_REAL csetemp134 CCTK_ATTRIBUTE_UNUSED = tdg4030*xformL01;\n+ \n+ CCTK_REAL csetemp135 CCTK_ATTRIBUTE_UNUSED = tdg4031*xformL11;\n+ \n+ CCTK_REAL csetemp136 CCTK_ATTRIBUTE_UNUSED = tdg4032*xformL21;\n+ \n+ CCTK_REAL csetemp137 CCTK_ATTRIBUTE_UNUSED = tdg4033*xformL31;\n+ \n+ CCTK_REAL csetemp138 CCTK_ATTRIBUTE_UNUSED = tdg4110*xformL01;\n+ \n+ CCTK_REAL csetemp139 CCTK_ATTRIBUTE_UNUSED = tdg4111*xformL11;\n+ \n+ CCTK_REAL csetemp140 CCTK_ATTRIBUTE_UNUSED = tdg4112*xformL21;\n+ \n+ CCTK_REAL csetemp141 CCTK_ATTRIBUTE_UNUSED = tdg4113*xformL31;\n+ \n+ CCTK_REAL csetemp142 CCTK_ATTRIBUTE_UNUSED = tdg4120*xformL01;\n+ \n+ CCTK_REAL csetemp143 CCTK_ATTRIBUTE_UNUSED = tdg4121*xformL11;\n+ \n+ CCTK_REAL csetemp144 CCTK_ATTRIBUTE_UNUSED = tdg4122*xformL21;\n+ \n+ CCTK_REAL csetemp145 CCTK_ATTRIBUTE_UNUSED = tdg4123*xformL31;\n+ \n+ CCTK_REAL csetemp146 CCTK_ATTRIBUTE_UNUSED = tdg4130*xformL01;\n+ \n+ CCTK_REAL csetemp147 CCTK_ATTRIBUTE_UNUSED = tdg4131*xformL11;\n+ \n+ CCTK_REAL csetemp148 CCTK_ATTRIBUTE_UNUSED = tdg4132*xformL21;\n+ \n+ CCTK_REAL csetemp149 CCTK_ATTRIBUTE_UNUSED = tdg4133*xformL31;\n+ \n+ CCTK_REAL csetemp150 CCTK_ATTRIBUTE_UNUSED = tdg4220*xformL01;\n+ \n+ CCTK_REAL csetemp151 CCTK_ATTRIBUTE_UNUSED = tdg4221*xformL11;\n+ \n+ CCTK_REAL csetemp152 CCTK_ATTRIBUTE_UNUSED = tdg4222*xformL21;\n+ \n+ CCTK_REAL csetemp153 CCTK_ATTRIBUTE_UNUSED = tdg4223*xformL31;\n+ \n+ CCTK_REAL csetemp154 CCTK_ATTRIBUTE_UNUSED = tdg4230*xformL01;\n+ \n+ CCTK_REAL csetemp155 CCTK_ATTRIBUTE_UNUSED = tdg4231*xformL11;\n+ \n+ CCTK_REAL csetemp156 CCTK_ATTRIBUTE_UNUSED = tdg4232*xformL21;\n+ \n+ CCTK_REAL csetemp157 CCTK_ATTRIBUTE_UNUSED = tdg4233*xformL31;\n+ \n+ CCTK_REAL csetemp158 CCTK_ATTRIBUTE_UNUSED = tdg4330*xformL01;\n+ \n+ CCTK_REAL csetemp159 CCTK_ATTRIBUTE_UNUSED = tdg4331*xformL11;\n+ \n+ CCTK_REAL csetemp160 CCTK_ATTRIBUTE_UNUSED = tdg4332*xformL21;\n+ \n+ CCTK_REAL csetemp161 CCTK_ATTRIBUTE_UNUSED = tdg4333*xformL31;\n+ \n+ CCTK_REAL dg4011 CCTK_ATTRIBUTE_UNUSED = xformL00*((csetemp122 + \n+ csetemp123 + csetemp124 + csetemp125)*xformL01 + (csetemp126 + \n+ csetemp127 + csetemp128 + csetemp129)*xformL11 + (csetemp130 + \n+ csetemp131 + csetemp132 + csetemp133)*xformL21 + (csetemp134 + \n+ csetemp135 + csetemp136 + csetemp137)*xformL31) + xformL10*((csetemp126 \n+ + csetemp127 + csetemp128 + csetemp129)*xformL01 + (csetemp138 + \n+ csetemp139 + csetemp140 + csetemp141)*xformL11 + (csetemp142 + \n+ csetemp143 + csetemp144 + csetemp145)*xformL21 + (csetemp146 + \n+ csetemp147 + csetemp148 + csetemp149)*xformL31) + xformL20*((csetemp130 \n+ + csetemp131 + csetemp132 + csetemp133)*xformL01 + (csetemp142 + \n+ csetemp143 + csetemp144 + csetemp145)*xformL11 + (csetemp150 + \n+ csetemp151 + csetemp152 + csetemp153)*xformL21 + (csetemp154 + \n+ csetemp155 + csetemp156 + csetemp157)*xformL31) + xformL30*((csetemp134 \n+ + csetemp135 + csetemp136 + csetemp137)*xformL01 + (csetemp146 + \n+ csetemp147 + csetemp148 + csetemp149)*xformL11 + (csetemp154 + \n+ csetemp155 + csetemp156 + csetemp157)*xformL21 + (csetemp158 + \n+ csetemp159 + csetemp160 + csetemp161)*xformL31);\n+ \n+ CCTK_REAL csetemp162 CCTK_ATTRIBUTE_UNUSED = tdg4000*xformL02;\n+ \n+ CCTK_REAL csetemp163 CCTK_ATTRIBUTE_UNUSED = tdg4001*xformL12;\n+ \n+ CCTK_REAL csetemp164 CCTK_ATTRIBUTE_UNUSED = tdg4002*xformL22;\n+ \n+ CCTK_REAL csetemp165 CCTK_ATTRIBUTE_UNUSED = tdg4003*xformL32;\n+ \n+ CCTK_REAL csetemp166 CCTK_ATTRIBUTE_UNUSED = tdg4010*xformL02;\n+ \n+ CCTK_REAL csetemp167 CCTK_ATTRIBUTE_UNUSED = tdg4011*xformL12;\n+ \n+ CCTK_REAL csetemp168 CCTK_ATTRIBUTE_UNUSED = tdg4012*xformL22;\n+ \n+ CCTK_REAL csetemp169 CCTK_ATTRIBUTE_UNUSED = tdg4013*xformL32;\n+ \n+ CCTK_REAL csetemp170 CCTK_ATTRIBUTE_UNUSED = tdg4020*xformL02;\n+ \n+ CCTK_REAL csetemp171 CCTK_ATTRIBUTE_UNUSED = tdg4021*xformL12;\n+ \n+ CCTK_REAL csetemp172 CCTK_ATTRIBUTE_UNUSED = tdg4022*xformL22;\n+ \n+ CCTK_REAL csetemp173 CCTK_ATTRIBUTE_UNUSED = tdg4023*xformL32;\n+ \n+ CCTK_REAL csetemp174 CCTK_ATTRIBUTE_UNUSED = tdg4030*xformL02;\n+ \n+ CCTK_REAL csetemp175 CCTK_ATTRIBUTE_UNUSED = tdg4031*xformL12;\n+ \n+ CCTK_REAL csetemp176 CCTK_ATTRIBUTE_UNUSED = tdg4032*xformL22;\n+ \n+ CCTK_REAL csetemp177 CCTK_ATTRIBUTE_UNUSED = tdg4033*xformL32;\n+ \n+ CCTK_REAL csetemp178 CCTK_ATTRIBUTE_UNUSED = tdg4110*xformL02;\n+ \n+ CCTK_REAL csetemp179 CCTK_ATTRIBUTE_UNUSED = tdg4111*xformL12;\n+ \n+ CCTK_REAL csetemp180 CCTK_ATTRIBUTE_UNUSED = tdg4112*xformL22;\n+ \n+ CCTK_REAL csetemp181 CCTK_ATTRIBUTE_UNUSED = tdg4113*xformL32;\n+ \n+ CCTK_REAL csetemp182 CCTK_ATTRIBUTE_UNUSED = tdg4120*xformL02;\n+ \n+ CCTK_REAL csetemp183 CCTK_ATTRIBUTE_UNUSED = tdg4121*xformL12;\n+ \n+ CCTK_REAL csetemp184 CCTK_ATTRIBUTE_UNUSED = tdg4122*xformL22;\n+ \n+ CCTK_REAL csetemp185 CCTK_ATTRIBUTE_UNUSED = tdg4123*xformL32;\n+ \n+ CCTK_REAL csetemp186 CCTK_ATTRIBUTE_UNUSED = tdg4130*xformL02;\n+ \n+ CCTK_REAL csetemp187 CCTK_ATTRIBUTE_UNUSED = tdg4131*xformL12;\n+ \n+ CCTK_REAL csetemp188 CCTK_ATTRIBUTE_UNUSED = tdg4132*xformL22;\n+ \n+ CCTK_REAL csetemp189 CCTK_ATTRIBUTE_UNUSED = tdg4133*xformL32;\n+ \n+ CCTK_REAL csetemp190 CCTK_ATTRIBUTE_UNUSED = tdg4220*xformL02;\n+ \n+ CCTK_REAL csetemp191 CCTK_ATTRIBUTE_UNUSED = tdg4221*xformL12;\n+ \n+ CCTK_REAL csetemp192 CCTK_ATTRIBUTE_UNUSED = tdg4222*xformL22;\n+ \n+ CCTK_REAL csetemp193 CCTK_ATTRIBUTE_UNUSED = tdg4223*xformL32;\n+ \n+ CCTK_REAL csetemp194 CCTK_ATTRIBUTE_UNUSED = tdg4230*xformL02;\n+ \n+ CCTK_REAL csetemp195 CCTK_ATTRIBUTE_UNUSED = tdg4231*xformL12;\n+ \n+ CCTK_REAL csetemp196 CCTK_ATTRIBUTE_UNUSED = tdg4232*xformL22;\n+ \n+ CCTK_REAL csetemp197 CCTK_ATTRIBUTE_UNUSED = tdg4233*xformL32;\n+ \n+ CCTK_REAL csetemp198 CCTK_ATTRIBUTE_UNUSED = tdg4330*xformL02;\n+ \n+ CCTK_REAL csetemp199 CCTK_ATTRIBUTE_UNUSED = tdg4331*xformL12;\n+ \n+ CCTK_REAL csetemp200 CCTK_ATTRIBUTE_UNUSED = tdg4332*xformL22;\n+ \n+ CCTK_REAL csetemp201 CCTK_ATTRIBUTE_UNUSED = tdg4333*xformL32;\n+ \n+ CCTK_REAL dg4012 CCTK_ATTRIBUTE_UNUSED = xformL00*((csetemp162 + \n+ csetemp163 + csetemp164 + csetemp165)*xformL01 + (csetemp166 + \n+ csetemp167 + csetemp168 + csetemp169)*xformL11 + (csetemp170 + \n+ csetemp171 + csetemp172 + csetemp173)*xformL21 + (csetemp174 + \n+ csetemp175 + csetemp176 + csetemp177)*xformL31) + xformL10*((csetemp166 \n+ + csetemp167 + csetemp168 + csetemp169)*xformL01 + (csetemp178 + \n+ csetemp179 + csetemp180 + csetemp181)*xformL11 + (csetemp182 + \n+ csetemp183 + csetemp184 + csetemp185)*xformL21 + (csetemp186 + \n+ csetemp187 + csetemp188 + csetemp189)*xformL31) + xformL20*((csetemp170 \n+ + csetemp171 + csetemp172 + csetemp173)*xformL01 + (csetemp182 + \n+ csetemp183 + csetemp184 + csetemp185)*xformL11 + (csetemp190 + \n+ csetemp191 + csetemp192 + csetemp193)*xformL21 + (csetemp194 + \n+ csetemp195 + csetemp196 + csetemp197)*xformL31) + xformL30*((csetemp174 \n+ + csetemp175 + csetemp176 + csetemp177)*xformL01 + (csetemp186 + \n+ csetemp187 + csetemp188 + csetemp189)*xformL11 + (csetemp194 + \n+ csetemp195 + csetemp196 + csetemp197)*xformL21 + (csetemp198 + \n+ csetemp199 + csetemp200 + csetemp201)*xformL31);\n+ \n+ CCTK_REAL csetemp202 CCTK_ATTRIBUTE_UNUSED = tdg4000*xformL03;\n+ \n+ CCTK_REAL csetemp203 CCTK_ATTRIBUTE_UNUSED = tdg4001*xformL13;\n+ \n+ CCTK_REAL csetemp204 CCTK_ATTRIBUTE_UNUSED = tdg4002*xformL23;\n+ \n+ CCTK_REAL csetemp205 CCTK_ATTRIBUTE_UNUSED = tdg4003*xformL33;\n+ \n+ CCTK_REAL csetemp206 CCTK_ATTRIBUTE_UNUSED = tdg4010*xformL03;\n+ \n+ CCTK_REAL csetemp207 CCTK_ATTRIBUTE_UNUSED = tdg4011*xformL13;\n+ \n+ CCTK_REAL csetemp208 CCTK_ATTRIBUTE_UNUSED = tdg4012*xformL23;\n+ \n+ CCTK_REAL csetemp209 CCTK_ATTRIBUTE_UNUSED = tdg4013*xformL33;\n+ \n+ CCTK_REAL csetemp210 CCTK_ATTRIBUTE_UNUSED = tdg4020*xformL03;\n+ \n+ CCTK_REAL csetemp211 CCTK_ATTRIBUTE_UNUSED = tdg4021*xformL13;\n+ \n+ CCTK_REAL csetemp212 CCTK_ATTRIBUTE_UNUSED = tdg4022*xformL23;\n+ \n+ CCTK_REAL csetemp213 CCTK_ATTRIBUTE_UNUSED = tdg4023*xformL33;\n+ \n+ CCTK_REAL csetemp214 CCTK_ATTRIBUTE_UNUSED = tdg4030*xformL03;\n+ \n+ CCTK_REAL csetemp215 CCTK_ATTRIBUTE_UNUSED = tdg4031*xformL13;\n+ \n+ CCTK_REAL csetemp216 CCTK_ATTRIBUTE_UNUSED = tdg4032*xformL23;\n+ \n+ CCTK_REAL csetemp217 CCTK_ATTRIBUTE_UNUSED = tdg4033*xformL33;\n+ \n+ CCTK_REAL csetemp218 CCTK_ATTRIBUTE_UNUSED = tdg4110*xformL03;\n+ \n+ CCTK_REAL csetemp219 CCTK_ATTRIBUTE_UNUSED = tdg4111*xformL13;\n+ \n+ CCTK_REAL csetemp220 CCTK_ATTRIBUTE_UNUSED = tdg4112*xformL23;\n+ \n+ CCTK_REAL csetemp221 CCTK_ATTRIBUTE_UNUSED = tdg4113*xformL33;\n+ \n+ CCTK_REAL csetemp222 CCTK_ATTRIBUTE_UNUSED = tdg4120*xformL03;\n+ \n+ CCTK_REAL csetemp223 CCTK_ATTRIBUTE_UNUSED = tdg4121*xformL13;\n+ \n+ CCTK_REAL csetemp224 CCTK_ATTRIBUTE_UNUSED = tdg4122*xformL23;\n+ \n+ CCTK_REAL csetemp225 CCTK_ATTRIBUTE_UNUSED = tdg4123*xformL33;\n+ \n+ CCTK_REAL csetemp226 CCTK_ATTRIBUTE_UNUSED = tdg4130*xformL03;\n+ \n+ CCTK_REAL csetemp227 CCTK_ATTRIBUTE_UNUSED = tdg4131*xformL13;\n+ \n+ CCTK_REAL csetemp228 CCTK_ATTRIBUTE_UNUSED = tdg4132*xformL23;\n+ \n+ CCTK_REAL csetemp229 CCTK_ATTRIBUTE_UNUSED = tdg4133*xformL33;\n+ \n+ CCTK_REAL csetemp230 CCTK_ATTRIBUTE_UNUSED = tdg4220*xformL03;\n+ \n+ CCTK_REAL csetemp231 CCTK_ATTRIBUTE_UNUSED = tdg4221*xformL13;\n+ \n+ CCTK_REAL csetemp232 CCTK_ATTRIBUTE_UNUSED = tdg4222*xformL23;\n+ \n+ CCTK_REAL csetemp233 CCTK_ATTRIBUTE_UNUSED = tdg4223*xformL33;\n+ \n+ CCTK_REAL csetemp234 CCTK_ATTRIBUTE_UNUSED = tdg4230*xformL03;\n+ \n+ CCTK_REAL csetemp235 CCTK_ATTRIBUTE_UNUSED = tdg4231*xformL13;\n+ \n+ CCTK_REAL csetemp236 CCTK_ATTRIBUTE_UNUSED = tdg4232*xformL23;\n+ \n+ CCTK_REAL csetemp237 CCTK_ATTRIBUTE_UNUSED = tdg4233*xformL33;\n+ \n+ CCTK_REAL csetemp238 CCTK_ATTRIBUTE_UNUSED = tdg4330*xformL03;\n+ \n+ CCTK_REAL csetemp239 CCTK_ATTRIBUTE_UNUSED = tdg4331*xformL13;\n+ \n+ CCTK_REAL csetemp240 CCTK_ATTRIBUTE_UNUSED = tdg4332*xformL23;\n+ \n+ CCTK_REAL csetemp241 CCTK_ATTRIBUTE_UNUSED = tdg4333*xformL33;\n+ \n+ CCTK_REAL dg4013 CCTK_ATTRIBUTE_UNUSED = xformL00*((csetemp202 + \n+ csetemp203 + csetemp204 + csetemp205)*xformL01 + (csetemp206 + \n+ csetemp207 + csetemp208 + csetemp209)*xformL11 + (csetemp210 + \n+ csetemp211 + csetemp212 + csetemp213)*xformL21 + (csetemp214 + \n+ csetemp215 + csetemp216 + csetemp217)*xformL31) + xformL10*((csetemp206 \n+ + csetemp207 + csetemp208 + csetemp209)*xformL01 + (csetemp218 + \n+ csetemp219 + csetemp220 + csetemp221)*xformL11 + (csetemp222 + \n+ csetemp223 + csetemp224 + csetemp225)*xformL21 + (csetemp226 + \n+ csetemp227 + csetemp228 + csetemp229)*xformL31) + xformL20*((csetemp210 \n+ + csetemp211 + csetemp212 + csetemp213)*xformL01 + (csetemp222 + \n+ csetemp223 + csetemp224 + csetemp225)*xformL11 + (csetemp230 + \n+ csetemp231 + csetemp232 + csetemp233)*xformL21 + (csetemp234 + \n+ csetemp235 + csetemp236 + csetemp237)*xformL31) + xformL30*((csetemp214 \n+ + csetemp215 + csetemp216 + csetemp217)*xformL01 + (csetemp226 + \n+ csetemp227 + csetemp228 + csetemp229)*xformL11 + (csetemp234 + \n+ csetemp235 + csetemp236 + csetemp237)*xformL21 + (csetemp238 + \n+ csetemp239 + csetemp240 + csetemp241)*xformL31);\n+ \n+ CCTK_REAL dg4020 CCTK_ATTRIBUTE_UNUSED = xformL10*((csetemp86 + \n+ csetemp87 + csetemp88 + csetemp89)*xformL02 + (csetemp100 + csetemp101 \n+ + csetemp98 + csetemp99)*xformL12 + (csetemp102 + csetemp103 + \n+ csetemp104 + csetemp105)*xformL22 + (csetemp106 + csetemp107 + \n+ csetemp108 + csetemp109)*xformL32) + xformL20*((csetemp90 + csetemp91 + \n+ csetemp92 + csetemp93)*xformL02 + (csetemp102 + csetemp103 + csetemp104 \n+ + csetemp105)*xformL12 + (csetemp110 + csetemp111 + csetemp112 + \n+ csetemp113)*xformL22 + (csetemp114 + csetemp115 + csetemp116 + \n+ csetemp117)*xformL32) + xformL30*((csetemp94 + csetemp95 + csetemp96 + \n+ csetemp97)*xformL02 + (csetemp106 + csetemp107 + csetemp108 + \n+ csetemp109)*xformL12 + (csetemp114 + csetemp115 + csetemp116 + \n+ csetemp117)*xformL22 + (csetemp118 + csetemp119 + csetemp120 + \n+ csetemp121)*xformL32) + xformL00*((csetemp82 + csetemp83 + csetemp84 + \n+ csetemp85)*xformL02 + (csetemp86 + csetemp87 + csetemp88 + \n+ csetemp89)*xformL12 + (csetemp90 + csetemp91 + csetemp92 + \n+ csetemp93)*xformL22 + (csetemp94 + csetemp95 + csetemp96 + \n+ csetemp97)*xformL32);\n+ \n+ CCTK_REAL dg4021 CCTK_ATTRIBUTE_UNUSED = xformL00*((csetemp122 + \n+ csetemp123 + csetemp124 + csetemp125)*xformL02 + (csetemp126 + \n+ csetemp127 + csetemp128 + csetemp129)*xformL12 + (csetemp130 + \n+ csetemp131 + csetemp132 + csetemp133)*xformL22 + (csetemp134 + \n+ csetemp135 + csetemp136 + csetemp137)*xformL32) + xformL10*((csetemp126 \n+ + csetemp127 + csetemp128 + csetemp129)*xformL02 + (csetemp138 + \n+ csetemp139 + csetemp140 + csetemp141)*xformL12 + (csetemp142 + \n+ csetemp143 + csetemp144 + csetemp145)*xformL22 + (csetemp146 + \n+ csetemp147 + csetemp148 + csetemp149)*xformL32) + xformL20*((csetemp130 \n+ + csetemp131 + csetemp132 + csetemp133)*xformL02 + (csetemp142 + \n+ csetemp143 + csetemp144 + csetemp145)*xformL12 + (csetemp150 + \n+ csetemp151 + csetemp152 + csetemp153)*xformL22 + (csetemp154 + \n+ csetemp155 + csetemp156 + csetemp157)*xformL32) + xformL30*((csetemp134 \n+ + csetemp135 + csetemp136 + csetemp137)*xformL02 + (csetemp146 + \n+ csetemp147 + csetemp148 + csetemp149)*xformL12 + (csetemp154 + \n+ csetemp155 + csetemp156 + csetemp157)*xformL22 + (csetemp158 + \n+ csetemp159 + csetemp160 + csetemp161)*xformL32);\n+ \n+ CCTK_REAL dg4022 CCTK_ATTRIBUTE_UNUSED = xformL00*((csetemp162 + \n+ csetemp163 + csetemp164 + csetemp165)*xformL02 + (csetemp166 + \n+ csetemp167 + csetemp168 + csetemp169)*xformL12 + (csetemp170 + \n+ csetemp171 + csetemp172 + csetemp173)*xformL22 + (csetemp174 + \n+ csetemp175 + csetemp176 + csetemp177)*xformL32) + xformL10*((csetemp166 \n+ + csetemp167 + csetemp168 + csetemp169)*xformL02 + (csetemp178 + \n+ csetemp179 + csetemp180 + csetemp181)*xformL12 + (csetemp182 + \n+ csetemp183 + csetemp184 + csetemp185)*xformL22 + (csetemp186 + \n+ csetemp187 + csetemp188 + csetemp189)*xformL32) + xformL20*((csetemp170 \n+ + csetemp171 + csetemp172 + csetemp173)*xformL02 + (csetemp182 + \n+ csetemp183 + csetemp184 + csetemp185)*xformL12 + (csetemp190 + \n+ csetemp191 + csetemp192 + csetemp193)*xformL22 + (csetemp194 + \n+ csetemp195 + csetemp196 + csetemp197)*xformL32) + xformL30*((csetemp174 \n+ + csetemp175 + csetemp176 + csetemp177)*xformL02 + (csetemp186 + \n+ csetemp187 + csetemp188 + csetemp189)*xformL12 + (csetemp194 + \n+ csetemp195 + csetemp196 + csetemp197)*xformL22 + (csetemp198 + \n+ csetemp199 + csetemp200 + csetemp201)*xformL32);\n+ \n+ CCTK_REAL dg4023 CCTK_ATTRIBUTE_UNUSED = xformL00*((csetemp202 + \n+ csetemp203 + csetemp204 + csetemp205)*xformL02 + (csetemp206 + \n+ csetemp207 + csetemp208 + csetemp209)*xformL12 + (csetemp210 + \n+ csetemp211 + csetemp212 + csetemp213)*xformL22 + (csetemp214 + \n+ csetemp215 + csetemp216 + csetemp217)*xformL32) + xformL10*((csetemp206 \n+ + csetemp207 + csetemp208 + csetemp209)*xformL02 + (csetemp218 + \n+ csetemp219 + csetemp220 + csetemp221)*xformL12 + (csetemp222 + \n+ csetemp223 + csetemp224 + csetemp225)*xformL22 + (csetemp226 + \n+ csetemp227 + csetemp228 + csetemp229)*xformL32) + xformL20*((csetemp210 \n+ + csetemp211 + csetemp212 + csetemp213)*xformL02 + (csetemp222 + \n+ csetemp223 + csetemp224 + csetemp225)*xformL12 + (csetemp230 + \n+ csetemp231 + csetemp232 + csetemp233)*xformL22 + (csetemp234 + \n+ csetemp235 + csetemp236 + csetemp237)*xformL32) + xformL30*((csetemp214 \n+ + csetemp215 + csetemp216 + csetemp217)*xformL02 + (csetemp226 + \n+ csetemp227 + csetemp228 + csetemp229)*xformL12 + (csetemp234 + \n+ csetemp235 + csetemp236 + csetemp237)*xformL22 + (csetemp238 + \n+ csetemp239 + csetemp240 + csetemp241)*xformL32);\n+ \n+ CCTK_REAL dg4030 CCTK_ATTRIBUTE_UNUSED = xformL10*((csetemp86 + \n+ csetemp87 + csetemp88 + csetemp89)*xformL03 + (csetemp100 + csetemp101 \n+ + csetemp98 + csetemp99)*xformL13 + (csetemp102 + csetemp103 + \n+ csetemp104 + csetemp105)*xformL23 + (csetemp106 + csetemp107 + \n+ csetemp108 + csetemp109)*xformL33) + xformL20*((csetemp90 + csetemp91 + \n+ csetemp92 + csetemp93)*xformL03 + (csetemp102 + csetemp103 + csetemp104 \n+ + csetemp105)*xformL13 + (csetemp110 + csetemp111 + csetemp112 + \n+ csetemp113)*xformL23 + (csetemp114 + csetemp115 + csetemp116 + \n+ csetemp117)*xformL33) + xformL30*((csetemp94 + csetemp95 + csetemp96 + \n+ csetemp97)*xformL03 + (csetemp106 + csetemp107 + csetemp108 + \n+ csetemp109)*xformL13 + (csetemp114 + csetemp115 + csetemp116 + \n+ csetemp117)*xformL23 + (csetemp118 + csetemp119 + csetemp120 + \n+ csetemp121)*xformL33) + xformL00*((csetemp82 + csetemp83 + csetemp84 + \n+ csetemp85)*xformL03 + (csetemp86 + csetemp87 + csetemp88 + \n+ csetemp89)*xformL13 + (csetemp90 + csetemp91 + csetemp92 + \n+ csetemp93)*xformL23 + (csetemp94 + csetemp95 + csetemp96 + \n+ csetemp97)*xformL33);\n+ \n+ CCTK_REAL dg4031 CCTK_ATTRIBUTE_UNUSED = xformL00*((csetemp122 + \n+ csetemp123 + csetemp124 + csetemp125)*xformL03 + (csetemp126 + \n+ csetemp127 + csetemp128 + csetemp129)*xformL13 + (csetemp130 + \n+ csetemp131 + csetemp132 + csetemp133)*xformL23 + (csetemp134 + \n+ csetemp135 + csetemp136 + csetemp137)*xformL33) + xformL10*((csetemp126 \n+ + csetemp127 + csetemp128 + csetemp129)*xformL03 + (csetemp138 + \n+ csetemp139 + csetemp140 + csetemp141)*xformL13 + (csetemp142 + \n+ csetemp143 + csetemp144 + csetemp145)*xformL23 + (csetemp146 + \n+ csetemp147 + csetemp148 + csetemp149)*xformL33) + xformL20*((csetemp130 \n+ + csetemp131 + csetemp132 + csetemp133)*xformL03 + (csetemp142 + \n+ csetemp143 + csetemp144 + csetemp145)*xformL13 + (csetemp150 + \n+ csetemp151 + csetemp152 + csetemp153)*xformL23 + (csetemp154 + \n+ csetemp155 + csetemp156 + csetemp157)*xformL33) + xformL30*((csetemp134 \n+ + csetemp135 + csetemp136 + csetemp137)*xformL03 + (csetemp146 + \n+ csetemp147 + csetemp148 + csetemp149)*xformL13 + (csetemp154 + \n+ csetemp155 + csetemp156 + csetemp157)*xformL23 + (csetemp158 + \n+ csetemp159 + csetemp160 + csetemp161)*xformL33);\n+ \n+ CCTK_REAL dg4032 CCTK_ATTRIBUTE_UNUSED = xformL00*((csetemp162 + \n+ csetemp163 + csetemp164 + csetemp165)*xformL03 + (csetemp166 + \n+ csetemp167 + csetemp168 + csetemp169)*xformL13 + (csetemp170 + \n+ csetemp171 + csetemp172 + csetemp173)*xformL23 + (csetemp174 + \n+ csetemp175 + csetemp176 + csetemp177)*xformL33) + xformL10*((csetemp166 \n+ + csetemp167 + csetemp168 + csetemp169)*xformL03 + (csetemp178 + \n+ csetemp179 + csetemp180 + csetemp181)*xformL13 + (csetemp182 + \n+ csetemp183 + csetemp184 + csetemp185)*xformL23 + (csetemp186 + \n+ csetemp187 + csetemp188 + csetemp189)*xformL33) + xformL20*((csetemp170 \n+ + csetemp171 + csetemp172 + csetemp173)*xformL03 + (csetemp182 + \n+ csetemp183 + csetemp184 + csetemp185)*xformL13 + (csetemp190 + \n+ csetemp191 + csetemp192 + csetemp193)*xformL23 + (csetemp194 + \n+ csetemp195 + csetemp196 + csetemp197)*xformL33) + xformL30*((csetemp174 \n+ + csetemp175 + csetemp176 + csetemp177)*xformL03 + (csetemp186 + \n+ csetemp187 + csetemp188 + csetemp189)*xformL13 + (csetemp194 + \n+ csetemp195 + csetemp196 + csetemp197)*xformL23 + (csetemp198 + \n+ csetemp199 + csetemp200 + csetemp201)*xformL33);\n+ \n+ CCTK_REAL dg4033 CCTK_ATTRIBUTE_UNUSED = xformL00*((csetemp202 + \n+ csetemp203 + csetemp204 + csetemp205)*xformL03 + (csetemp206 + \n+ csetemp207 + csetemp208 + csetemp209)*xformL13 + (csetemp210 + \n+ csetemp211 + csetemp212 + csetemp213)*xformL23 + (csetemp214 + \n+ csetemp215 + csetemp216 + csetemp217)*xformL33) + xformL10*((csetemp206 \n+ + csetemp207 + csetemp208 + csetemp209)*xformL03 + (csetemp218 + \n+ csetemp219 + csetemp220 + csetemp221)*xformL13 + (csetemp222 + \n+ csetemp223 + csetemp224 + csetemp225)*xformL23 + (csetemp226 + \n+ csetemp227 + csetemp228 + csetemp229)*xformL33) + xformL20*((csetemp210 \n+ + csetemp211 + csetemp212 + csetemp213)*xformL03 + (csetemp222 + \n+ csetemp223 + csetemp224 + csetemp225)*xformL13 + (csetemp230 + \n+ csetemp231 + csetemp232 + csetemp233)*xformL23 + (csetemp234 + \n+ csetemp235 + csetemp236 + csetemp237)*xformL33) + xformL30*((csetemp214 \n+ + csetemp215 + csetemp216 + csetemp217)*xformL03 + (csetemp226 + \n+ csetemp227 + csetemp228 + csetemp229)*xformL13 + (csetemp234 + \n+ csetemp235 + csetemp236 + csetemp237)*xformL23 + (csetemp238 + \n+ csetemp239 + csetemp240 + csetemp241)*xformL33);\n+ \n+ CCTK_REAL dg4110 CCTK_ATTRIBUTE_UNUSED = xformL11*((csetemp86 + \n+ csetemp87 + csetemp88 + csetemp89)*xformL01 + (csetemp100 + csetemp101 \n+ + csetemp98 + csetemp99)*xformL11 + (csetemp102 + csetemp103 + \n+ csetemp104 + csetemp105)*xformL21 + (csetemp106 + csetemp107 + \n+ csetemp108 + csetemp109)*xformL31) + xformL21*((csetemp90 + csetemp91 + \n+ csetemp92 + csetemp93)*xformL01 + (csetemp102 + csetemp103 + csetemp104 \n+ + csetemp105)*xformL11 + (csetemp110 + csetemp111 + csetemp112 + \n+ csetemp113)*xformL21 + (csetemp114 + csetemp115 + csetemp116 + \n+ csetemp117)*xformL31) + xformL31*((csetemp94 + csetemp95 + csetemp96 + \n+ csetemp97)*xformL01 + (csetemp106 + csetemp107 + csetemp108 + \n+ csetemp109)*xformL11 + (csetemp114 + csetemp115 + csetemp116 + \n+ csetemp117)*xformL21 + (csetemp118 + csetemp119 + csetemp120 + \n+ csetemp121)*xformL31) + xformL01*((csetemp82 + csetemp83 + csetemp84 + \n+ csetemp85)*xformL01 + (csetemp86 + csetemp87 + csetemp88 + \n+ csetemp89)*xformL11 + (csetemp90 + csetemp91 + csetemp92 + \n+ csetemp93)*xformL21 + (csetemp94 + csetemp95 + csetemp96 + \n+ csetemp97)*xformL31);\n+ \n+ CCTK_REAL dg4111 CCTK_ATTRIBUTE_UNUSED = xformL01*((csetemp122 + \n+ csetemp123 + csetemp124 + csetemp125)*xformL01 + (csetemp126 + \n+ csetemp127 + csetemp128 + csetemp129)*xformL11 + (csetemp130 + \n+ csetemp131 + csetemp132 + csetemp133)*xformL21 + (csetemp134 + \n+ csetemp135 + csetemp136 + csetemp137)*xformL31) + xformL11*((csetemp126 \n+ + csetemp127 + csetemp128 + csetemp129)*xformL01 + (csetemp138 + \n+ csetemp139 + csetemp140 + csetemp141)*xformL11 + (csetemp142 + \n+ csetemp143 + csetemp144 + csetemp145)*xformL21 + (csetemp146 + \n+ csetemp147 + csetemp148 + csetemp149)*xformL31) + xformL21*((csetemp130 \n+ + csetemp131 + csetemp132 + csetemp133)*xformL01 + (csetemp142 + \n+ csetemp143 + csetemp144 + csetemp145)*xformL11 + (csetemp150 + \n+ csetemp151 + csetemp152 + csetemp153)*xformL21 + (csetemp154 + \n+ csetemp155 + csetemp156 + csetemp157)*xformL31) + xformL31*((csetemp134 \n+ + csetemp135 + csetemp136 + csetemp137)*xformL01 + (csetemp146 + \n+ csetemp147 + csetemp148 + csetemp149)*xformL11 + (csetemp154 + \n+ csetemp155 + csetemp156 + csetemp157)*xformL21 + (csetemp158 + \n+ csetemp159 + csetemp160 + csetemp161)*xformL31);\n+ \n+ CCTK_REAL dg4112 CCTK_ATTRIBUTE_UNUSED = xformL01*((csetemp162 + \n+ csetemp163 + csetemp164 + csetemp165)*xformL01 + (csetemp166 + \n+ csetemp167 + csetemp168 + csetemp169)*xformL11 + (csetemp170 + \n+ csetemp171 + csetemp172 + csetemp173)*xformL21 + (csetemp174 + \n+ csetemp175 + csetemp176 + csetemp177)*xformL31) + xformL11*((csetemp166 \n+ + csetemp167 + csetemp168 + csetemp169)*xformL01 + (csetemp178 + \n+ csetemp179 + csetemp180 + csetemp181)*xformL11 + (csetemp182 + \n+ csetemp183 + csetemp184 + csetemp185)*xformL21 + (csetemp186 + \n+ csetemp187 + csetemp188 + csetemp189)*xformL31) + xformL21*((csetemp170 \n+ + csetemp171 + csetemp172 + csetemp173)*xformL01 + (csetemp182 + \n+ csetemp183 + csetemp184 + csetemp185)*xformL11 + (csetemp190 + \n+ csetemp191 + csetemp192 + csetemp193)*xformL21 + (csetemp194 + \n+ csetemp195 + csetemp196 + csetemp197)*xformL31) + xformL31*((csetemp174 \n+ + csetemp175 + csetemp176 + csetemp177)*xformL01 + (csetemp186 + \n+ csetemp187 + csetemp188 + csetemp189)*xformL11 + (csetemp194 + \n+ csetemp195 + csetemp196 + csetemp197)*xformL21 + (csetemp198 + \n+ csetemp199 + csetemp200 + csetemp201)*xformL31);\n+ \n+ CCTK_REAL dg4113 CCTK_ATTRIBUTE_UNUSED = xformL01*((csetemp202 + \n+ csetemp203 + csetemp204 + csetemp205)*xformL01 + (csetemp206 + \n+ csetemp207 + csetemp208 + csetemp209)*xformL11 + (csetemp210 + \n+ csetemp211 + csetemp212 + csetemp213)*xformL21 + (csetemp214 + \n+ csetemp215 + csetemp216 + csetemp217)*xformL31) + xformL11*((csetemp206 \n+ + csetemp207 + csetemp208 + csetemp209)*xformL01 + (csetemp218 + \n+ csetemp219 + csetemp220 + csetemp221)*xformL11 + (csetemp222 + \n+ csetemp223 + csetemp224 + csetemp225)*xformL21 + (csetemp226 + \n+ csetemp227 + csetemp228 + csetemp229)*xformL31) + xformL21*((csetemp210 \n+ + csetemp211 + csetemp212 + csetemp213)*xformL01 + (csetemp222 + \n+ csetemp223 + csetemp224 + csetemp225)*xformL11 + (csetemp230 + \n+ csetemp231 + csetemp232 + csetemp233)*xformL21 + (csetemp234 + \n+ csetemp235 + csetemp236 + csetemp237)*xformL31) + xformL31*((csetemp214 \n+ + csetemp215 + csetemp216 + csetemp217)*xformL01 + (csetemp226 + \n+ csetemp227 + csetemp228 + csetemp229)*xformL11 + (csetemp234 + \n+ csetemp235 + csetemp236 + csetemp237)*xformL21 + (csetemp238 + \n+ csetemp239 + csetemp240 + csetemp241)*xformL31);\n+ \n+ CCTK_REAL dg4120 CCTK_ATTRIBUTE_UNUSED = xformL11*((csetemp86 + \n+ csetemp87 + csetemp88 + csetemp89)*xformL02 + (csetemp100 + csetemp101 \n+ + csetemp98 + csetemp99)*xformL12 + (csetemp102 + csetemp103 + \n+ csetemp104 + csetemp105)*xformL22 + (csetemp106 + csetemp107 + \n+ csetemp108 + csetemp109)*xformL32) + xformL21*((csetemp90 + csetemp91 + \n+ csetemp92 + csetemp93)*xformL02 + (csetemp102 + csetemp103 + csetemp104 \n+ + csetemp105)*xformL12 + (csetemp110 + csetemp111 + csetemp112 + \n+ csetemp113)*xformL22 + (csetemp114 + csetemp115 + csetemp116 + \n+ csetemp117)*xformL32) + xformL31*((csetemp94 + csetemp95 + csetemp96 + \n+ csetemp97)*xformL02 + (csetemp106 + csetemp107 + csetemp108 + \n+ csetemp109)*xformL12 + (csetemp114 + csetemp115 + csetemp116 + \n+ csetemp117)*xformL22 + (csetemp118 + csetemp119 + csetemp120 + \n+ csetemp121)*xformL32) + xformL01*((csetemp82 + csetemp83 + csetemp84 + \n+ csetemp85)*xformL02 + (csetemp86 + csetemp87 + csetemp88 + \n+ csetemp89)*xformL12 + (csetemp90 + csetemp91 + csetemp92 + \n+ csetemp93)*xformL22 + (csetemp94 + csetemp95 + csetemp96 + \n+ csetemp97)*xformL32);\n+ \n+ CCTK_REAL dg4121 CCTK_ATTRIBUTE_UNUSED = xformL01*((csetemp122 + \n+ csetemp123 + csetemp124 + csetemp125)*xformL02 + (csetemp126 + \n+ csetemp127 + csetemp128 + csetemp129)*xformL12 + (csetemp130 + \n+ csetemp131 + csetemp132 + csetemp133)*xformL22 + (csetemp134 + \n+ csetemp135 + csetemp136 + csetemp137)*xformL32) + xformL11*((csetemp126 \n+ + csetemp127 + csetemp128 + csetemp129)*xformL02 + (csetemp138 + \n+ csetemp139 + csetemp140 + csetemp141)*xformL12 + (csetemp142 + \n+ csetemp143 + csetemp144 + csetemp145)*xformL22 + (csetemp146 + \n+ csetemp147 + csetemp148 + csetemp149)*xformL32) + xformL21*((csetemp130 \n+ + csetemp131 + csetemp132 + csetemp133)*xformL02 + (csetemp142 + \n+ csetemp143 + csetemp144 + csetemp145)*xformL12 + (csetemp150 + \n+ csetemp151 + csetemp152 + csetemp153)*xformL22 + (csetemp154 + \n+ csetemp155 + csetemp156 + csetemp157)*xformL32) + xformL31*((csetemp134 \n+ + csetemp135 + csetemp136 + csetemp137)*xformL02 + (csetemp146 + \n+ csetemp147 + csetemp148 + csetemp149)*xformL12 + (csetemp154 + \n+ csetemp155 + csetemp156 + csetemp157)*xformL22 + (csetemp158 + \n+ csetemp159 + csetemp160 + csetemp161)*xformL32);\n+ \n+ CCTK_REAL dg4122 CCTK_ATTRIBUTE_UNUSED = xformL01*((csetemp162 + \n+ csetemp163 + csetemp164 + csetemp165)*xformL02 + (csetemp166 + \n+ csetemp167 + csetemp168 + csetemp169)*xformL12 + (csetemp170 + \n+ csetemp171 + csetemp172 + csetemp173)*xformL22 + (csetemp174 + \n+ csetemp175 + csetemp176 + csetemp177)*xformL32) + xformL11*((csetemp166 \n+ + csetemp167 + csetemp168 + csetemp169)*xformL02 + (csetemp178 + \n+ csetemp179 + csetemp180 + csetemp181)*xformL12 + (csetemp182 + \n+ csetemp183 + csetemp184 + csetemp185)*xformL22 + (csetemp186 + \n+ csetemp187 + csetemp188 + csetemp189)*xformL32) + xformL21*((csetemp170 \n+ + csetemp171 + csetemp172 + csetemp173)*xformL02 + (csetemp182 + \n+ csetemp183 + csetemp184 + csetemp185)*xformL12 + (csetemp190 + \n+ csetemp191 + csetemp192 + csetemp193)*xformL22 + (csetemp194 + \n+ csetemp195 + csetemp196 + csetemp197)*xformL32) + xformL31*((csetemp174 \n+ + csetemp175 + csetemp176 + csetemp177)*xformL02 + (csetemp186 + \n+ csetemp187 + csetemp188 + csetemp189)*xformL12 + (csetemp194 + \n+ csetemp195 + csetemp196 + csetemp197)*xformL22 + (csetemp198 + \n+ csetemp199 + csetemp200 + csetemp201)*xformL32);\n+ \n+ CCTK_REAL dg4123 CCTK_ATTRIBUTE_UNUSED = xformL01*((csetemp202 + \n+ csetemp203 + csetemp204 + csetemp205)*xformL02 + (csetemp206 + \n+ csetemp207 + csetemp208 + csetemp209)*xformL12 + (csetemp210 + \n+ csetemp211 + csetemp212 + csetemp213)*xformL22 + (csetemp214 + \n+ csetemp215 + csetemp216 + csetemp217)*xformL32) + xformL11*((csetemp206 \n+ + csetemp207 + csetemp208 + csetemp209)*xformL02 + (csetemp218 + \n+ csetemp219 + csetemp220 + csetemp221)*xformL12 + (csetemp222 + \n+ csetemp223 + csetemp224 + csetemp225)*xformL22 + (csetemp226 + \n+ csetemp227 + csetemp228 + csetemp229)*xformL32) + xformL21*((csetemp210 \n+ + csetemp211 + csetemp212 + csetemp213)*xformL02 + (csetemp222 + \n+ csetemp223 + csetemp224 + csetemp225)*xformL12 + (csetemp230 + \n+ csetemp231 + csetemp232 + csetemp233)*xformL22 + (csetemp234 + \n+ csetemp235 + csetemp236 + csetemp237)*xformL32) + xformL31*((csetemp214 \n+ + csetemp215 + csetemp216 + csetemp217)*xformL02 + (csetemp226 + \n+ csetemp227 + csetemp228 + csetemp229)*xformL12 + (csetemp234 + \n+ csetemp235 + csetemp236 + csetemp237)*xformL22 + (csetemp238 + \n+ csetemp239 + csetemp240 + csetemp241)*xformL32);\n+ \n+ CCTK_REAL dg4130 CCTK_ATTRIBUTE_UNUSED = xformL11*((csetemp86 + \n+ csetemp87 + csetemp88 + csetemp89)*xformL03 + (csetemp100 + csetemp101 \n+ + csetemp98 + csetemp99)*xformL13 + (csetemp102 + csetemp103 + \n+ csetemp104 + csetemp105)*xformL23 + (csetemp106 + csetemp107 + \n+ csetemp108 + csetemp109)*xformL33) + xformL21*((csetemp90 + csetemp91 + \n+ csetemp92 + csetemp93)*xformL03 + (csetemp102 + csetemp103 + csetemp104 \n+ + csetemp105)*xformL13 + (csetemp110 + csetemp111 + csetemp112 + \n+ csetemp113)*xformL23 + (csetemp114 + csetemp115 + csetemp116 + \n+ csetemp117)*xformL33) + xformL31*((csetemp94 + csetemp95 + csetemp96 + \n+ csetemp97)*xformL03 + (csetemp106 + csetemp107 + csetemp108 + \n+ csetemp109)*xformL13 + (csetemp114 + csetemp115 + csetemp116 + \n+ csetemp117)*xformL23 + (csetemp118 + csetemp119 + csetemp120 + \n+ csetemp121)*xformL33) + xformL01*((csetemp82 + csetemp83 + csetemp84 + \n+ csetemp85)*xformL03 + (csetemp86 + csetemp87 + csetemp88 + \n+ csetemp89)*xformL13 + (csetemp90 + csetemp91 + csetemp92 + \n+ csetemp93)*xformL23 + (csetemp94 + csetemp95 + csetemp96 + \n+ csetemp97)*xformL33);\n+ \n+ CCTK_REAL dg4131 CCTK_ATTRIBUTE_UNUSED = xformL01*((csetemp122 + \n+ csetemp123 + csetemp124 + csetemp125)*xformL03 + (csetemp126 + \n+ csetemp127 + csetemp128 + csetemp129)*xformL13 + (csetemp130 + \n+ csetemp131 + csetemp132 + csetemp133)*xformL23 + (csetemp134 + \n+ csetemp135 + csetemp136 + csetemp137)*xformL33) + xformL11*((csetemp126 \n+ + csetemp127 + csetemp128 + csetemp129)*xformL03 + (csetemp138 + \n+ csetemp139 + csetemp140 + csetemp141)*xformL13 + (csetemp142 + \n+ csetemp143 + csetemp144 + csetemp145)*xformL23 + (csetemp146 + \n+ csetemp147 + csetemp148 + csetemp149)*xformL33) + xformL21*((csetemp130 \n+ + csetemp131 + csetemp132 + csetemp133)*xformL03 + (csetemp142 + \n+ csetemp143 + csetemp144 + csetemp145)*xformL13 + (csetemp150 + \n+ csetemp151 + csetemp152 + csetemp153)*xformL23 + (csetemp154 + \n+ csetemp155 + csetemp156 + csetemp157)*xformL33) + xformL31*((csetemp134 \n+ + csetemp135 + csetemp136 + csetemp137)*xformL03 + (csetemp146 + \n+ csetemp147 + csetemp148 + csetemp149)*xformL13 + (csetemp154 + \n+ csetemp155 + csetemp156 + csetemp157)*xformL23 + (csetemp158 + \n+ csetemp159 + csetemp160 + csetemp161)*xformL33);\n+ \n+ CCTK_REAL dg4132 CCTK_ATTRIBUTE_UNUSED = xformL01*((csetemp162 + \n+ csetemp163 + csetemp164 + csetemp165)*xformL03 + (csetemp166 + \n+ csetemp167 + csetemp168 + csetemp169)*xformL13 + (csetemp170 + \n+ csetemp171 + csetemp172 + csetemp173)*xformL23 + (csetemp174 + \n+ csetemp175 + csetemp176 + csetemp177)*xformL33) + xformL11*((csetemp166 \n+ + csetemp167 + csetemp168 + csetemp169)*xformL03 + (csetemp178 + \n+ csetemp179 + csetemp180 + csetemp181)*xformL13 + (csetemp182 + \n+ csetemp183 + csetemp184 + csetemp185)*xformL23 + (csetemp186 + \n+ csetemp187 + csetemp188 + csetemp189)*xformL33) + xformL21*((csetemp170 \n+ + csetemp171 + csetemp172 + csetemp173)*xformL03 + (csetemp182 + \n+ csetemp183 + csetemp184 + csetemp185)*xformL13 + (csetemp190 + \n+ csetemp191 + csetemp192 + csetemp193)*xformL23 + (csetemp194 + \n+ csetemp195 + csetemp196 + csetemp197)*xformL33) + xformL31*((csetemp174 \n+ + csetemp175 + csetemp176 + csetemp177)*xformL03 + (csetemp186 + \n+ csetemp187 + csetemp188 + csetemp189)*xformL13 + (csetemp194 + \n+ csetemp195 + csetemp196 + csetemp197)*xformL23 + (csetemp198 + \n+ csetemp199 + csetemp200 + csetemp201)*xformL33);\n+ \n+ CCTK_REAL dg4133 CCTK_ATTRIBUTE_UNUSED = xformL01*((csetemp202 + \n+ csetemp203 + csetemp204 + csetemp205)*xformL03 + (csetemp206 + \n+ csetemp207 + csetemp208 + csetemp209)*xformL13 + (csetemp210 + \n+ csetemp211 + csetemp212 + csetemp213)*xformL23 + (csetemp214 + \n+ csetemp215 + csetemp216 + csetemp217)*xformL33) + xformL11*((csetemp206 \n+ + csetemp207 + csetemp208 + csetemp209)*xformL03 + (csetemp218 + \n+ csetemp219 + csetemp220 + csetemp221)*xformL13 + (csetemp222 + \n+ csetemp223 + csetemp224 + csetemp225)*xformL23 + (csetemp226 + \n+ csetemp227 + csetemp228 + csetemp229)*xformL33) + xformL21*((csetemp210 \n+ + csetemp211 + csetemp212 + csetemp213)*xformL03 + (csetemp222 + \n+ csetemp223 + csetemp224 + csetemp225)*xformL13 + (csetemp230 + \n+ csetemp231 + csetemp232 + csetemp233)*xformL23 + (csetemp234 + \n+ csetemp235 + csetemp236 + csetemp237)*xformL33) + xformL31*((csetemp214 \n+ + csetemp215 + csetemp216 + csetemp217)*xformL03 + (csetemp226 + \n+ csetemp227 + csetemp228 + csetemp229)*xformL13 + (csetemp234 + \n+ csetemp235 + csetemp236 + csetemp237)*xformL23 + (csetemp238 + \n+ csetemp239 + csetemp240 + csetemp241)*xformL33);\n+ \n+ CCTK_REAL dg4220 CCTK_ATTRIBUTE_UNUSED = xformL12*((csetemp86 + \n+ csetemp87 + csetemp88 + csetemp89)*xformL02 + (csetemp100 + csetemp101 \n+ + csetemp98 + csetemp99)*xformL12 + (csetemp102 + csetemp103 + \n+ csetemp104 + csetemp105)*xformL22 + (csetemp106 + csetemp107 + \n+ csetemp108 + csetemp109)*xformL32) + xformL22*((csetemp90 + csetemp91 + \n+ csetemp92 + csetemp93)*xformL02 + (csetemp102 + csetemp103 + csetemp104 \n+ + csetemp105)*xformL12 + (csetemp110 + csetemp111 + csetemp112 + \n+ csetemp113)*xformL22 + (csetemp114 + csetemp115 + csetemp116 + \n+ csetemp117)*xformL32) + xformL32*((csetemp94 + csetemp95 + csetemp96 + \n+ csetemp97)*xformL02 + (csetemp106 + csetemp107 + csetemp108 + \n+ csetemp109)*xformL12 + (csetemp114 + csetemp115 + csetemp116 + \n+ csetemp117)*xformL22 + (csetemp118 + csetemp119 + csetemp120 + \n+ csetemp121)*xformL32) + xformL02*((csetemp82 + csetemp83 + csetemp84 + \n+ csetemp85)*xformL02 + (csetemp86 + csetemp87 + csetemp88 + \n+ csetemp89)*xformL12 + (csetemp90 + csetemp91 + csetemp92 + \n+ csetemp93)*xformL22 + (csetemp94 + csetemp95 + csetemp96 + \n+ csetemp97)*xformL32);\n+ \n+ CCTK_REAL dg4221 CCTK_ATTRIBUTE_UNUSED = xformL02*((csetemp122 + \n+ csetemp123 + csetemp124 + csetemp125)*xformL02 + (csetemp126 + \n+ csetemp127 + csetemp128 + csetemp129)*xformL12 + (csetemp130 + \n+ csetemp131 + csetemp132 + csetemp133)*xformL22 + (csetemp134 + \n+ csetemp135 + csetemp136 + csetemp137)*xformL32) + xformL12*((csetemp126 \n+ + csetemp127 + csetemp128 + csetemp129)*xformL02 + (csetemp138 + \n+ csetemp139 + csetemp140 + csetemp141)*xformL12 + (csetemp142 + \n+ csetemp143 + csetemp144 + csetemp145)*xformL22 + (csetemp146 + \n+ csetemp147 + csetemp148 + csetemp149)*xformL32) + xformL22*((csetemp130 \n+ + csetemp131 + csetemp132 + csetemp133)*xformL02 + (csetemp142 + \n+ csetemp143 + csetemp144 + csetemp145)*xformL12 + (csetemp150 + \n+ csetemp151 + csetemp152 + csetemp153)*xformL22 + (csetemp154 + \n+ csetemp155 + csetemp156 + csetemp157)*xformL32) + xformL32*((csetemp134 \n+ + csetemp135 + csetemp136 + csetemp137)*xformL02 + (csetemp146 + \n+ csetemp147 + csetemp148 + csetemp149)*xformL12 + (csetemp154 + \n+ csetemp155 + csetemp156 + csetemp157)*xformL22 + (csetemp158 + \n+ csetemp159 + csetemp160 + csetemp161)*xformL32);\n+ \n+ CCTK_REAL dg4222 CCTK_ATTRIBUTE_UNUSED = xformL02*((csetemp162 + \n+ csetemp163 + csetemp164 + csetemp165)*xformL02 + (csetemp166 + \n+ csetemp167 + csetemp168 + csetemp169)*xformL12 + (csetemp170 + \n+ csetemp171 + csetemp172 + csetemp173)*xformL22 + (csetemp174 + \n+ csetemp175 + csetemp176 + csetemp177)*xformL32) + xformL12*((csetemp166 \n+ + csetemp167 + csetemp168 + csetemp169)*xformL02 + (csetemp178 + \n+ csetemp179 + csetemp180 + csetemp181)*xformL12 + (csetemp182 + \n+ csetemp183 + csetemp184 + csetemp185)*xformL22 + (csetemp186 + \n+ csetemp187 + csetemp188 + csetemp189)*xformL32) + xformL22*((csetemp170 \n+ + csetemp171 + csetemp172 + csetemp173)*xformL02 + (csetemp182 + \n+ csetemp183 + csetemp184 + csetemp185)*xformL12 + (csetemp190 + \n+ csetemp191 + csetemp192 + csetemp193)*xformL22 + (csetemp194 + \n+ csetemp195 + csetemp196 + csetemp197)*xformL32) + xformL32*((csetemp174 \n+ + csetemp175 + csetemp176 + csetemp177)*xformL02 + (csetemp186 + \n+ csetemp187 + csetemp188 + csetemp189)*xformL12 + (csetemp194 + \n+ csetemp195 + csetemp196 + csetemp197)*xformL22 + (csetemp198 + \n+ csetemp199 + csetemp200 + csetemp201)*xformL32);\n+ \n+ CCTK_REAL dg4223 CCTK_ATTRIBUTE_UNUSED = xformL02*((csetemp202 + \n+ csetemp203 + csetemp204 + csetemp205)*xformL02 + (csetemp206 + \n+ csetemp207 + csetemp208 + csetemp209)*xformL12 + (csetemp210 + \n+ csetemp211 + csetemp212 + csetemp213)*xformL22 + (csetemp214 + \n+ csetemp215 + csetemp216 + csetemp217)*xformL32) + xformL12*((csetemp206 \n+ + csetemp207 + csetemp208 + csetemp209)*xformL02 + (csetemp218 + \n+ csetemp219 + csetemp220 + csetemp221)*xformL12 + (csetemp222 + \n+ csetemp223 + csetemp224 + csetemp225)*xformL22 + (csetemp226 + \n+ csetemp227 + csetemp228 + csetemp229)*xformL32) + xformL22*((csetemp210 \n+ + csetemp211 + csetemp212 + csetemp213)*xformL02 + (csetemp222 + \n+ csetemp223 + csetemp224 + csetemp225)*xformL12 + (csetemp230 + \n+ csetemp231 + csetemp232 + csetemp233)*xformL22 + (csetemp234 + \n+ csetemp235 + csetemp236 + csetemp237)*xformL32) + xformL32*((csetemp214 \n+ + csetemp215 + csetemp216 + csetemp217)*xformL02 + (csetemp226 + \n+ csetemp227 + csetemp228 + csetemp229)*xformL12 + (csetemp234 + \n+ csetemp235 + csetemp236 + csetemp237)*xformL22 + (csetemp238 + \n+ csetemp239 + csetemp240 + csetemp241)*xformL32);\n+ \n+ CCTK_REAL dg4230 CCTK_ATTRIBUTE_UNUSED = xformL12*((csetemp86 + \n+ csetemp87 + csetemp88 + csetemp89)*xformL03 + (csetemp100 + csetemp101 \n+ + csetemp98 + csetemp99)*xformL13 + (csetemp102 + csetemp103 + \n+ csetemp104 + csetemp105)*xformL23 + (csetemp106 + csetemp107 + \n+ csetemp108 + csetemp109)*xformL33) + xformL22*((csetemp90 + csetemp91 + \n+ csetemp92 + csetemp93)*xformL03 + (csetemp102 + csetemp103 + csetemp104 \n+ + csetemp105)*xformL13 + (csetemp110 + csetemp111 + csetemp112 + \n+ csetemp113)*xformL23 + (csetemp114 + csetemp115 + csetemp116 + \n+ csetemp117)*xformL33) + xformL32*((csetemp94 + csetemp95 + csetemp96 + \n+ csetemp97)*xformL03 + (csetemp106 + csetemp107 + csetemp108 + \n+ csetemp109)*xformL13 + (csetemp114 + csetemp115 + csetemp116 + \n+ csetemp117)*xformL23 + (csetemp118 + csetemp119 + csetemp120 + \n+ csetemp121)*xformL33) + xformL02*((csetemp82 + csetemp83 + csetemp84 + \n+ csetemp85)*xformL03 + (csetemp86 + csetemp87 + csetemp88 + \n+ csetemp89)*xformL13 + (csetemp90 + csetemp91 + csetemp92 + \n+ csetemp93)*xformL23 + (csetemp94 + csetemp95 + csetemp96 + \n+ csetemp97)*xformL33);\n+ \n+ CCTK_REAL dg4231 CCTK_ATTRIBUTE_UNUSED = xformL02*((csetemp122 + \n+ csetemp123 + csetemp124 + csetemp125)*xformL03 + (csetemp126 + \n+ csetemp127 + csetemp128 + csetemp129)*xformL13 + (csetemp130 + \n+ csetemp131 + csetemp132 + csetemp133)*xformL23 + (csetemp134 + \n+ csetemp135 + csetemp136 + csetemp137)*xformL33) + xformL12*((csetemp126 \n+ + csetemp127 + csetemp128 + csetemp129)*xformL03 + (csetemp138 + \n+ csetemp139 + csetemp140 + csetemp141)*xformL13 + (csetemp142 + \n+ csetemp143 + csetemp144 + csetemp145)*xformL23 + (csetemp146 + \n+ csetemp147 + csetemp148 + csetemp149)*xformL33) + xformL22*((csetemp130 \n+ + csetemp131 + csetemp132 + csetemp133)*xformL03 + (csetemp142 + \n+ csetemp143 + csetemp144 + csetemp145)*xformL13 + (csetemp150 + \n+ csetemp151 + csetemp152 + csetemp153)*xformL23 + (csetemp154 + \n+ csetemp155 + csetemp156 + csetemp157)*xformL33) + xformL32*((csetemp134 \n+ + csetemp135 + csetemp136 + csetemp137)*xformL03 + (csetemp146 + \n+ csetemp147 + csetemp148 + csetemp149)*xformL13 + (csetemp154 + \n+ csetemp155 + csetemp156 + csetemp157)*xformL23 + (csetemp158 + \n+ csetemp159 + csetemp160 + csetemp161)*xformL33);\n+ \n+ CCTK_REAL dg4232 CCTK_ATTRIBUTE_UNUSED = xformL02*((csetemp162 + \n+ csetemp163 + csetemp164 + csetemp165)*xformL03 + (csetemp166 + \n+ csetemp167 + csetemp168 + csetemp169)*xformL13 + (csetemp170 + \n+ csetemp171 + csetemp172 + csetemp173)*xformL23 + (csetemp174 + \n+ csetemp175 + csetemp176 + csetemp177)*xformL33) + xformL12*((csetemp166 \n+ + csetemp167 + csetemp168 + csetemp169)*xformL03 + (csetemp178 + \n+ csetemp179 + csetemp180 + csetemp181)*xformL13 + (csetemp182 + \n+ csetemp183 + csetemp184 + csetemp185)*xformL23 + (csetemp186 + \n+ csetemp187 + csetemp188 + csetemp189)*xformL33) + xformL22*((csetemp170 \n+ + csetemp171 + csetemp172 + csetemp173)*xformL03 + (csetemp182 + \n+ csetemp183 + csetemp184 + csetemp185)*xformL13 + (csetemp190 + \n+ csetemp191 + csetemp192 + csetemp193)*xformL23 + (csetemp194 + \n+ csetemp195 + csetemp196 + csetemp197)*xformL33) + xformL32*((csetemp174 \n+ + csetemp175 + csetemp176 + csetemp177)*xformL03 + (csetemp186 + \n+ csetemp187 + csetemp188 + csetemp189)*xformL13 + (csetemp194 + \n+ csetemp195 + csetemp196 + csetemp197)*xformL23 + (csetemp198 + \n+ csetemp199 + csetemp200 + csetemp201)*xformL33);\n+ \n+ CCTK_REAL dg4233 CCTK_ATTRIBUTE_UNUSED = xformL02*((csetemp202 + \n+ csetemp203 + csetemp204 + csetemp205)*xformL03 + (csetemp206 + \n+ csetemp207 + csetemp208 + csetemp209)*xformL13 + (csetemp210 + \n+ csetemp211 + csetemp212 + csetemp213)*xformL23 + (csetemp214 + \n+ csetemp215 + csetemp216 + csetemp217)*xformL33) + xformL12*((csetemp206 \n+ + csetemp207 + csetemp208 + csetemp209)*xformL03 + (csetemp218 + \n+ csetemp219 + csetemp220 + csetemp221)*xformL13 + (csetemp222 + \n+ csetemp223 + csetemp224 + csetemp225)*xformL23 + (csetemp226 + \n+ csetemp227 + csetemp228 + csetemp229)*xformL33) + xformL22*((csetemp210 \n+ + csetemp211 + csetemp212 + csetemp213)*xformL03 + (csetemp222 + \n+ csetemp223 + csetemp224 + csetemp225)*xformL13 + (csetemp230 + \n+ csetemp231 + csetemp232 + csetemp233)*xformL23 + (csetemp234 + \n+ csetemp235 + csetemp236 + csetemp237)*xformL33) + xformL32*((csetemp214 \n+ + csetemp215 + csetemp216 + csetemp217)*xformL03 + (csetemp226 + \n+ csetemp227 + csetemp228 + csetemp229)*xformL13 + (csetemp234 + \n+ csetemp235 + csetemp236 + csetemp237)*xformL23 + (csetemp238 + \n+ csetemp239 + csetemp240 + csetemp241)*xformL33);\n+ \n+ CCTK_REAL dg4330 CCTK_ATTRIBUTE_UNUSED = xformL13*((csetemp86 + \n+ csetemp87 + csetemp88 + csetemp89)*xformL03 + (csetemp100 + csetemp101 \n+ + csetemp98 + csetemp99)*xformL13 + (csetemp102 + csetemp103 + \n+ csetemp104 + csetemp105)*xformL23 + (csetemp106 + csetemp107 + \n+ csetemp108 + csetemp109)*xformL33) + xformL23*((csetemp90 + csetemp91 + \n+ csetemp92 + csetemp93)*xformL03 + (csetemp102 + csetemp103 + csetemp104 \n+ + csetemp105)*xformL13 + (csetemp110 + csetemp111 + csetemp112 + \n+ csetemp113)*xformL23 + (csetemp114 + csetemp115 + csetemp116 + \n+ csetemp117)*xformL33) + xformL33*((csetemp94 + csetemp95 + csetemp96 + \n+ csetemp97)*xformL03 + (csetemp106 + csetemp107 + csetemp108 + \n+ csetemp109)*xformL13 + (csetemp114 + csetemp115 + csetemp116 + \n+ csetemp117)*xformL23 + (csetemp118 + csetemp119 + csetemp120 + \n+ csetemp121)*xformL33) + xformL03*((csetemp82 + csetemp83 + csetemp84 + \n+ csetemp85)*xformL03 + (csetemp86 + csetemp87 + csetemp88 + \n+ csetemp89)*xformL13 + (csetemp90 + csetemp91 + csetemp92 + \n+ csetemp93)*xformL23 + (csetemp94 + csetemp95 + csetemp96 + \n+ csetemp97)*xformL33);\n+ \n+ CCTK_REAL dg4331 CCTK_ATTRIBUTE_UNUSED = xformL03*((csetemp122 + \n+ csetemp123 + csetemp124 + csetemp125)*xformL03 + (csetemp126 + \n+ csetemp127 + csetemp128 + csetemp129)*xformL13 + (csetemp130 + \n+ csetemp131 + csetemp132 + csetemp133)*xformL23 + (csetemp134 + \n+ csetemp135 + csetemp136 + csetemp137)*xformL33) + xformL13*((csetemp126 \n+ + csetemp127 + csetemp128 + csetemp129)*xformL03 + (csetemp138 + \n+ csetemp139 + csetemp140 + csetemp141)*xformL13 + (csetemp142 + \n+ csetemp143 + csetemp144 + csetemp145)*xformL23 + (csetemp146 + \n+ csetemp147 + csetemp148 + csetemp149)*xformL33) + xformL23*((csetemp130 \n+ + csetemp131 + csetemp132 + csetemp133)*xformL03 + (csetemp142 + \n+ csetemp143 + csetemp144 + csetemp145)*xformL13 + (csetemp150 + \n+ csetemp151 + csetemp152 + csetemp153)*xformL23 + (csetemp154 + \n+ csetemp155 + csetemp156 + csetemp157)*xformL33) + xformL33*((csetemp134 \n+ + csetemp135 + csetemp136 + csetemp137)*xformL03 + (csetemp146 + \n+ csetemp147 + csetemp148 + csetemp149)*xformL13 + (csetemp154 + \n+ csetemp155 + csetemp156 + csetemp157)*xformL23 + (csetemp158 + \n+ csetemp159 + csetemp160 + csetemp161)*xformL33);\n+ \n+ CCTK_REAL dg4332 CCTK_ATTRIBUTE_UNUSED = xformL03*((csetemp162 + \n+ csetemp163 + csetemp164 + csetemp165)*xformL03 + (csetemp166 + \n+ csetemp167 + csetemp168 + csetemp169)*xformL13 + (csetemp170 + \n+ csetemp171 + csetemp172 + csetemp173)*xformL23 + (csetemp174 + \n+ csetemp175 + csetemp176 + csetemp177)*xformL33) + xformL13*((csetemp166 \n+ + csetemp167 + csetemp168 + csetemp169)*xformL03 + (csetemp178 + \n+ csetemp179 + csetemp180 + csetemp181)*xformL13 + (csetemp182 + \n+ csetemp183 + csetemp184 + csetemp185)*xformL23 + (csetemp186 + \n+ csetemp187 + csetemp188 + csetemp189)*xformL33) + xformL23*((csetemp170 \n+ + csetemp171 + csetemp172 + csetemp173)*xformL03 + (csetemp182 + \n+ csetemp183 + csetemp184 + csetemp185)*xformL13 + (csetemp190 + \n+ csetemp191 + csetemp192 + csetemp193)*xformL23 + (csetemp194 + \n+ csetemp195 + csetemp196 + csetemp197)*xformL33) + xformL33*((csetemp174 \n+ + csetemp175 + csetemp176 + csetemp177)*xformL03 + (csetemp186 + \n+ csetemp187 + csetemp188 + csetemp189)*xformL13 + (csetemp194 + \n+ csetemp195 + csetemp196 + csetemp197)*xformL23 + (csetemp198 + \n+ csetemp199 + csetemp200 + csetemp201)*xformL33);\n+ \n+ CCTK_REAL dg4333 CCTK_ATTRIBUTE_UNUSED = xformL03*((csetemp202 + \n+ csetemp203 + csetemp204 + csetemp205)*xformL03 + (csetemp206 + \n+ csetemp207 + csetemp208 + csetemp209)*xformL13 + (csetemp210 + \n+ csetemp211 + csetemp212 + csetemp213)*xformL23 + (csetemp214 + \n+ csetemp215 + csetemp216 + csetemp217)*xformL33) + xformL13*((csetemp206 \n+ + csetemp207 + csetemp208 + csetemp209)*xformL03 + (csetemp218 + \n+ csetemp219 + csetemp220 + csetemp221)*xformL13 + (csetemp222 + \n+ csetemp223 + csetemp224 + csetemp225)*xformL23 + (csetemp226 + \n+ csetemp227 + csetemp228 + csetemp229)*xformL33) + xformL23*((csetemp210 \n+ + csetemp211 + csetemp212 + csetemp213)*xformL03 + (csetemp222 + \n+ csetemp223 + csetemp224 + csetemp225)*xformL13 + (csetemp230 + \n+ csetemp231 + csetemp232 + csetemp233)*xformL23 + (csetemp234 + \n+ csetemp235 + csetemp236 + csetemp237)*xformL33) + xformL33*((csetemp214 \n+ + csetemp215 + csetemp216 + csetemp217)*xformL03 + (csetemp226 + \n+ csetemp227 + csetemp228 + csetemp229)*xformL13 + (csetemp234 + \n+ csetemp235 + csetemp236 + csetemp237)*xformL23 + (csetemp238 + \n+ csetemp239 + csetemp240 + csetemp241)*xformL33);\n+ \n+ CCTK_REAL betal1 CCTK_ATTRIBUTE_UNUSED = g401;\n+ \n+ CCTK_REAL betal2 CCTK_ATTRIBUTE_UNUSED = g402;\n+ \n+ CCTK_REAL betal3 CCTK_ATTRIBUTE_UNUSED = g403;\n+ \n+ gxxL = g411;\n+ \n+ gxyL = g412;\n+ \n+ gxzL = g413;\n+ \n+ gyyL = g422;\n+ \n+ gyzL = g423;\n+ \n+ gzzL = g433;\n+ \n+ CCTK_REAL csetemp242 CCTK_ATTRIBUTE_UNUSED = pow(gxzL,2);\n+ \n+ CCTK_REAL csetemp243 CCTK_ATTRIBUTE_UNUSED = pow(gyzL,2);\n+ \n+ CCTK_REAL csetemp244 CCTK_ATTRIBUTE_UNUSED = pow(gxyL,2);\n+ \n+ CCTK_REAL detg CCTK_ATTRIBUTE_UNUSED = 2*gxyL*gxzL*gyzL + \n+ gyyL*(gxxL*gzzL - csetemp242) - gxxL*csetemp243 - gzzL*csetemp244;\n+ \n+ CCTK_REAL csetemp245 CCTK_ATTRIBUTE_UNUSED = pow(detg,-1);\n+ \n+ CCTK_REAL gu11 CCTK_ATTRIBUTE_UNUSED = (gyyL*gzzL - \n+ csetemp243)*csetemp245;\n+ \n+ CCTK_REAL gu12 CCTK_ATTRIBUTE_UNUSED = (gxzL*gyzL - \n+ gxyL*gzzL)*csetemp245;\n+ \n+ CCTK_REAL gu13 CCTK_ATTRIBUTE_UNUSED = (-(gxzL*gyyL) + \n+ gxyL*gyzL)*csetemp245;\n+ \n+ CCTK_REAL gu22 CCTK_ATTRIBUTE_UNUSED = (gxxL*gzzL - \n+ csetemp242)*csetemp245;\n+ \n+ CCTK_REAL gu23 CCTK_ATTRIBUTE_UNUSED = (gxyL*gxzL - \n+ gxxL*gyzL)*csetemp245;\n+ \n+ CCTK_REAL gu33 CCTK_ATTRIBUTE_UNUSED = (gxxL*gyyL - \n+ csetemp244)*csetemp245;\n+ \n+ betaxL = betal1*gu11 + betal2*gu12 + betal3*gu13;\n+ \n+ betayL = betal1*gu12 + betal2*gu22 + betal3*gu23;\n+ \n+ betazL = betal1*gu13 + betal2*gu23 + betal3*gu33;\n+ \n+ CCTK_REAL betasq CCTK_ATTRIBUTE_UNUSED = betaxL*betal1 + betayL*betal2 \n+ + betazL*betal3;\n+ \n+ alpL = pow(betasq - g400,0.5);\n+ \n+ CCTK_REAL dtg11 CCTK_ATTRIBUTE_UNUSED = dg4110;\n+ \n+ CCTK_REAL dtg12 CCTK_ATTRIBUTE_UNUSED = dg4120;\n+ \n+ CCTK_REAL dtg13 CCTK_ATTRIBUTE_UNUSED = dg4130;\n+ \n+ CCTK_REAL dtg22 CCTK_ATTRIBUTE_UNUSED = dg4220;\n+ \n+ CCTK_REAL dtg23 CCTK_ATTRIBUTE_UNUSED = dg4230;\n+ \n+ CCTK_REAL dtg33 CCTK_ATTRIBUTE_UNUSED = dg4330;\n+ \n+ CCTK_REAL dg111 CCTK_ATTRIBUTE_UNUSED = dg4111;\n+ \n+ CCTK_REAL dg112 CCTK_ATTRIBUTE_UNUSED = dg4112;\n+ \n+ CCTK_REAL dg113 CCTK_ATTRIBUTE_UNUSED = dg4113;\n+ \n+ CCTK_REAL dg121 CCTK_ATTRIBUTE_UNUSED = dg4121;\n+ \n+ CCTK_REAL dg122 CCTK_ATTRIBUTE_UNUSED = dg4122;\n+ \n+ CCTK_REAL dg123 CCTK_ATTRIBUTE_UNUSED = dg4123;\n+ \n+ CCTK_REAL dg131 CCTK_ATTRIBUTE_UNUSED = dg4131;\n+ \n+ CCTK_REAL dg132 CCTK_ATTRIBUTE_UNUSED = dg4132;\n+ \n+ CCTK_REAL dg133 CCTK_ATTRIBUTE_UNUSED = dg4133;\n+ \n+ CCTK_REAL dg221 CCTK_ATTRIBUTE_UNUSED = dg4221;\n+ \n+ CCTK_REAL dg222 CCTK_ATTRIBUTE_UNUSED = dg4222;\n+ \n+ CCTK_REAL dg223 CCTK_ATTRIBUTE_UNUSED = dg4223;\n+ \n+ CCTK_REAL dg231 CCTK_ATTRIBUTE_UNUSED = dg4231;\n+ \n+ CCTK_REAL dg232 CCTK_ATTRIBUTE_UNUSED = dg4232;\n+ \n+ CCTK_REAL dg233 CCTK_ATTRIBUTE_UNUSED = dg4233;\n+ \n+ CCTK_REAL dg331 CCTK_ATTRIBUTE_UNUSED = dg4331;\n+ \n+ CCTK_REAL dg332 CCTK_ATTRIBUTE_UNUSED = dg4332;\n+ \n+ CCTK_REAL dg333 CCTK_ATTRIBUTE_UNUSED = dg4333;\n+ \n+ CCTK_REAL csetemp246 CCTK_ATTRIBUTE_UNUSED = dtg11*gu11;\n+ \n+ CCTK_REAL csetemp247 CCTK_ATTRIBUTE_UNUSED = dtg12*gu12;\n+ \n+ CCTK_REAL csetemp248 CCTK_ATTRIBUTE_UNUSED = dtg13*gu13;\n+ \n+ CCTK_REAL csetemp249 CCTK_ATTRIBUTE_UNUSED = dtg12*gu11;\n+ \n+ CCTK_REAL csetemp250 CCTK_ATTRIBUTE_UNUSED = dtg22*gu12;\n+ \n+ CCTK_REAL csetemp251 CCTK_ATTRIBUTE_UNUSED = dtg23*gu13;\n+ \n+ CCTK_REAL csetemp252 CCTK_ATTRIBUTE_UNUSED = dtg13*gu11;\n+ \n+ CCTK_REAL csetemp253 CCTK_ATTRIBUTE_UNUSED = dtg23*gu12;\n+ \n+ CCTK_REAL csetemp254 CCTK_ATTRIBUTE_UNUSED = dtg33*gu13;\n+ \n+ CCTK_REAL dtgu11 CCTK_ATTRIBUTE_UNUSED = -((csetemp246 + csetemp247 + \n+ csetemp248)*gu11) - (csetemp249 + csetemp250 + csetemp251)*gu12 - \n+ (csetemp252 + csetemp253 + csetemp254)*gu13;\n+ \n+ CCTK_REAL dtgu12 CCTK_ATTRIBUTE_UNUSED = -((csetemp246 + csetemp247 + \n+ csetemp248)*gu12) - (csetemp249 + csetemp250 + csetemp251)*gu22 - \n+ (csetemp252 + csetemp253 + csetemp254)*gu23;\n+ \n+ CCTK_REAL dtgu13 CCTK_ATTRIBUTE_UNUSED = -((csetemp246 + csetemp247 + \n+ csetemp248)*gu13) - (csetemp249 + csetemp250 + csetemp251)*gu23 - \n+ (csetemp252 + csetemp253 + csetemp254)*gu33;\n+ \n+ CCTK_REAL csetemp255 CCTK_ATTRIBUTE_UNUSED = dtg11*gu12;\n+ \n+ CCTK_REAL csetemp256 CCTK_ATTRIBUTE_UNUSED = dtg12*gu22;\n+ \n+ CCTK_REAL csetemp257 CCTK_ATTRIBUTE_UNUSED = dtg13*gu23;\n+ \n+ CCTK_REAL csetemp258 CCTK_ATTRIBUTE_UNUSED = dtg22*gu22;\n+ \n+ CCTK_REAL csetemp259 CCTK_ATTRIBUTE_UNUSED = dtg23*gu23;\n+ \n+ CCTK_REAL csetemp260 CCTK_ATTRIBUTE_UNUSED = dtg13*gu12;\n+ \n+ CCTK_REAL csetemp261 CCTK_ATTRIBUTE_UNUSED = dtg23*gu22;\n+ \n+ CCTK_REAL csetemp262 CCTK_ATTRIBUTE_UNUSED = dtg33*gu23;\n+ \n+ CCTK_REAL dtgu22 CCTK_ATTRIBUTE_UNUSED = -((csetemp255 + csetemp256 + \n+ csetemp257)*gu12) - (csetemp247 + csetemp258 + csetemp259)*gu22 - \n+ (csetemp260 + csetemp261 + csetemp262)*gu23;\n+ \n+ CCTK_REAL dtgu23 CCTK_ATTRIBUTE_UNUSED = -((csetemp255 + csetemp256 + \n+ csetemp257)*gu13) - (csetemp247 + csetemp258 + csetemp259)*gu23 - \n+ (csetemp260 + csetemp261 + csetemp262)*gu33;\n+ \n+ CCTK_REAL dtgu33 CCTK_ATTRIBUTE_UNUSED = -(gu13*(dtg11*gu13 + \n+ dtg12*gu23 + dtg13*gu33)) - gu23*(dtg12*gu13 + dtg22*gu23 + dtg23*gu33) \n+ - gu33*(csetemp248 + csetemp259 + dtg33*gu33);\n+ \n+ CCTK_REAL csetemp263 CCTK_ATTRIBUTE_UNUSED = dg111*gu11;\n+ \n+ CCTK_REAL csetemp264 CCTK_ATTRIBUTE_UNUSED = dg121*gu12;\n+ \n+ CCTK_REAL csetemp265 CCTK_ATTRIBUTE_UNUSED = dg131*gu13;\n+ \n+ CCTK_REAL csetemp266 CCTK_ATTRIBUTE_UNUSED = dg121*gu11;\n+ \n+ CCTK_REAL csetemp267 CCTK_ATTRIBUTE_UNUSED = dg221*gu12;\n+ \n+ CCTK_REAL csetemp268 CCTK_ATTRIBUTE_UNUSED = dg231*gu13;\n+ \n+ CCTK_REAL csetemp269 CCTK_ATTRIBUTE_UNUSED = dg131*gu11;\n+ \n+ CCTK_REAL csetemp270 CCTK_ATTRIBUTE_UNUSED = dg231*gu12;\n+ \n+ CCTK_REAL csetemp271 CCTK_ATTRIBUTE_UNUSED = dg331*gu13;\n+ \n+ CCTK_REAL dgu111 CCTK_ATTRIBUTE_UNUSED = -((csetemp263 + csetemp264 + \n+ csetemp265)*gu11) - (csetemp266 + csetemp267 + csetemp268)*gu12 - \n+ (csetemp269 + csetemp270 + csetemp271)*gu13;\n+ \n+ CCTK_REAL dgu121 CCTK_ATTRIBUTE_UNUSED = -((csetemp263 + csetemp264 + \n+ csetemp265)*gu12) - (csetemp266 + csetemp267 + csetemp268)*gu22 - \n+ (csetemp269 + csetemp270 + csetemp271)*gu23;\n+ \n+ CCTK_REAL dgu131 CCTK_ATTRIBUTE_UNUSED = -((csetemp263 + csetemp264 + \n+ csetemp265)*gu13) - (csetemp266 + csetemp267 + csetemp268)*gu23 - \n+ (csetemp269 + csetemp270 + csetemp271)*gu33;\n+ \n+ CCTK_REAL csetemp272 CCTK_ATTRIBUTE_UNUSED = dg111*gu12;\n+ \n+ CCTK_REAL csetemp273 CCTK_ATTRIBUTE_UNUSED = dg121*gu22;\n+ \n+ CCTK_REAL csetemp274 CCTK_ATTRIBUTE_UNUSED = dg131*gu23;\n+ \n+ CCTK_REAL csetemp275 CCTK_ATTRIBUTE_UNUSED = dg221*gu22;\n+ \n+ CCTK_REAL csetemp276 CCTK_ATTRIBUTE_UNUSED = dg231*gu23;\n+ \n+ CCTK_REAL csetemp277 CCTK_ATTRIBUTE_UNUSED = dg131*gu12;\n+ \n+ CCTK_REAL csetemp278 CCTK_ATTRIBUTE_UNUSED = dg231*gu22;\n+ \n+ CCTK_REAL csetemp279 CCTK_ATTRIBUTE_UNUSED = dg331*gu23;\n+ \n+ CCTK_REAL dgu221 CCTK_ATTRIBUTE_UNUSED = -((csetemp272 + csetemp273 + \n+ csetemp274)*gu12) - (csetemp264 + csetemp275 + csetemp276)*gu22 - \n+ (csetemp277 + csetemp278 + csetemp279)*gu23;\n+ \n+ CCTK_REAL dgu231 CCTK_ATTRIBUTE_UNUSED = -((csetemp272 + csetemp273 + \n+ csetemp274)*gu13) - (csetemp264 + csetemp275 + csetemp276)*gu23 - \n+ (csetemp277 + csetemp278 + csetemp279)*gu33;\n+ \n+ CCTK_REAL dgu331 CCTK_ATTRIBUTE_UNUSED = -(gu13*(dg111*gu13 + \n+ dg121*gu23 + dg131*gu33)) - gu23*(dg121*gu13 + dg221*gu23 + dg231*gu33) \n+ - gu33*(csetemp265 + csetemp276 + dg331*gu33);\n+ \n+ CCTK_REAL csetemp280 CCTK_ATTRIBUTE_UNUSED = dg112*gu11;\n+ \n+ CCTK_REAL csetemp281 CCTK_ATTRIBUTE_UNUSED = dg122*gu12;\n+ \n+ CCTK_REAL csetemp282 CCTK_ATTRIBUTE_UNUSED = dg132*gu13;\n+ \n+ CCTK_REAL csetemp283 CCTK_ATTRIBUTE_UNUSED = dg122*gu11;\n+ \n+ CCTK_REAL csetemp284 CCTK_ATTRIBUTE_UNUSED = dg222*gu12;\n+ \n+ CCTK_REAL csetemp285 CCTK_ATTRIBUTE_UNUSED = dg232*gu13;\n+ \n+ CCTK_REAL csetemp286 CCTK_ATTRIBUTE_UNUSED = dg132*gu11;\n+ \n+ CCTK_REAL csetemp287 CCTK_ATTRIBUTE_UNUSED = dg232*gu12;\n+ \n+ CCTK_REAL csetemp288 CCTK_ATTRIBUTE_UNUSED = dg332*gu13;\n+ \n+ CCTK_REAL dgu112 CCTK_ATTRIBUTE_UNUSED = -((csetemp280 + csetemp281 + \n+ csetemp282)*gu11) - (csetemp283 + csetemp284 + csetemp285)*gu12 - \n+ (csetemp286 + csetemp287 + csetemp288)*gu13;\n+ \n+ CCTK_REAL dgu122 CCTK_ATTRIBUTE_UNUSED = -((csetemp280 + csetemp281 + \n+ csetemp282)*gu12) - (csetemp283 + csetemp284 + csetemp285)*gu22 - \n+ (csetemp286 + csetemp287 + csetemp288)*gu23;\n+ \n+ CCTK_REAL dgu132 CCTK_ATTRIBUTE_UNUSED = -((csetemp280 + csetemp281 + \n+ csetemp282)*gu13) - (csetemp283 + csetemp284 + csetemp285)*gu23 - \n+ (csetemp286 + csetemp287 + csetemp288)*gu33;\n+ \n+ CCTK_REAL csetemp289 CCTK_ATTRIBUTE_UNUSED = dg112*gu12;\n+ \n+ CCTK_REAL csetemp290 CCTK_ATTRIBUTE_UNUSED = dg122*gu22;\n+ \n+ CCTK_REAL csetemp291 CCTK_ATTRIBUTE_UNUSED = dg132*gu23;\n+ \n+ CCTK_REAL csetemp292 CCTK_ATTRIBUTE_UNUSED = dg222*gu22;\n+ \n+ CCTK_REAL csetemp293 CCTK_ATTRIBUTE_UNUSED = dg232*gu23;\n+ \n+ CCTK_REAL csetemp294 CCTK_ATTRIBUTE_UNUSED = dg132*gu12;\n+ \n+ CCTK_REAL csetemp295 CCTK_ATTRIBUTE_UNUSED = dg232*gu22;\n+ \n+ CCTK_REAL csetemp296 CCTK_ATTRIBUTE_UNUSED = dg332*gu23;\n+ \n+ CCTK_REAL dgu222 CCTK_ATTRIBUTE_UNUSED = -((csetemp289 + csetemp290 + \n+ csetemp291)*gu12) - (csetemp281 + csetemp292 + csetemp293)*gu22 - \n+ (csetemp294 + csetemp295 + csetemp296)*gu23;\n+ \n+ CCTK_REAL dgu232 CCTK_ATTRIBUTE_UNUSED = -((csetemp289 + csetemp290 + \n+ csetemp291)*gu13) - (csetemp281 + csetemp292 + csetemp293)*gu23 - \n+ (csetemp294 + csetemp295 + csetemp296)*gu33;\n+ \n+ CCTK_REAL dgu332 CCTK_ATTRIBUTE_UNUSED = -(gu13*(dg112*gu13 + \n+ dg122*gu23 + dg132*gu33)) - gu23*(dg122*gu13 + dg222*gu23 + dg232*gu33) \n+ - gu33*(csetemp282 + csetemp293 + dg332*gu33);\n+ \n+ CCTK_REAL csetemp297 CCTK_ATTRIBUTE_UNUSED = dg113*gu11;\n+ \n+ CCTK_REAL csetemp298 CCTK_ATTRIBUTE_UNUSED = dg123*gu12;\n+ \n+ CCTK_REAL csetemp299 CCTK_ATTRIBUTE_UNUSED = dg133*gu13;\n+ \n+ CCTK_REAL csetemp300 CCTK_ATTRIBUTE_UNUSED = dg123*gu11;\n+ \n+ CCTK_REAL csetemp301 CCTK_ATTRIBUTE_UNUSED = dg223*gu12;\n+ \n+ CCTK_REAL csetemp302 CCTK_ATTRIBUTE_UNUSED = dg233*gu13;\n+ \n+ CCTK_REAL csetemp303 CCTK_ATTRIBUTE_UNUSED = dg133*gu11;\n+ \n+ CCTK_REAL csetemp304 CCTK_ATTRIBUTE_UNUSED = dg233*gu12;\n+ \n+ CCTK_REAL csetemp305 CCTK_ATTRIBUTE_UNUSED = dg333*gu13;\n+ \n+ CCTK_REAL dgu113 CCTK_ATTRIBUTE_UNUSED = -((csetemp297 + csetemp298 + \n+ csetemp299)*gu11) - (csetemp300 + csetemp301 + csetemp302)*gu12 - \n+ (csetemp303 + csetemp304 + csetemp305)*gu13;\n+ \n+ CCTK_REAL dgu123 CCTK_ATTRIBUTE_UNUSED = -((csetemp297 + csetemp298 + \n+ csetemp299)*gu12) - (csetemp300 + csetemp301 + csetemp302)*gu22 - \n+ (csetemp303 + csetemp304 + csetemp305)*gu23;\n+ \n+ CCTK_REAL dgu133 CCTK_ATTRIBUTE_UNUSED = -((csetemp297 + csetemp298 + \n+ csetemp299)*gu13) - (csetemp300 + csetemp301 + csetemp302)*gu23 - \n+ (csetemp303 + csetemp304 + csetemp305)*gu33;\n+ \n+ CCTK_REAL csetemp306 CCTK_ATTRIBUTE_UNUSED = dg113*gu12;\n+ \n+ CCTK_REAL csetemp307 CCTK_ATTRIBUTE_UNUSED = dg123*gu22;\n+ \n+ CCTK_REAL csetemp308 CCTK_ATTRIBUTE_UNUSED = dg133*gu23;\n+ \n+ CCTK_REAL csetemp309 CCTK_ATTRIBUTE_UNUSED = dg223*gu22;\n+ \n+ CCTK_REAL csetemp310 CCTK_ATTRIBUTE_UNUSED = dg233*gu23;\n+ \n+ CCTK_REAL csetemp311 CCTK_ATTRIBUTE_UNUSED = dg133*gu12;\n+ \n+ CCTK_REAL csetemp312 CCTK_ATTRIBUTE_UNUSED = dg233*gu22;\n+ \n+ CCTK_REAL csetemp313 CCTK_ATTRIBUTE_UNUSED = dg333*gu23;\n+ \n+ CCTK_REAL dgu223 CCTK_ATTRIBUTE_UNUSED = -((csetemp306 + csetemp307 + \n+ csetemp308)*gu12) - (csetemp298 + csetemp309 + csetemp310)*gu22 - \n+ (csetemp311 + csetemp312 + csetemp313)*gu23;\n+ \n+ CCTK_REAL dgu233 CCTK_ATTRIBUTE_UNUSED = -((csetemp306 + csetemp307 + \n+ csetemp308)*gu13) - (csetemp298 + csetemp309 + csetemp310)*gu23 - \n+ (csetemp311 + csetemp312 + csetemp313)*gu33;\n+ \n+ CCTK_REAL dgu333 CCTK_ATTRIBUTE_UNUSED = -(gu13*(dg113*gu13 + \n+ dg123*gu23 + dg133*gu33)) - gu23*(dg123*gu13 + dg223*gu23 + dg233*gu33) \n+ - gu33*(csetemp299 + csetemp310 + dg333*gu33);\n+ \n+ CCTK_REAL dtbetal1 CCTK_ATTRIBUTE_UNUSED = dg4010;\n+ \n+ CCTK_REAL dtbetal2 CCTK_ATTRIBUTE_UNUSED = dg4020;\n+ \n+ CCTK_REAL dtbetal3 CCTK_ATTRIBUTE_UNUSED = dg4030;\n+ \n+ CCTK_REAL dbetal11 CCTK_ATTRIBUTE_UNUSED = dg4011;\n+ \n+ CCTK_REAL dbetal12 CCTK_ATTRIBUTE_UNUSED = dg4012;\n+ \n+ CCTK_REAL dbetal13 CCTK_ATTRIBUTE_UNUSED = dg4013;\n+ \n+ CCTK_REAL dbetal21 CCTK_ATTRIBUTE_UNUSED = dg4021;\n+ \n+ CCTK_REAL dbetal22 CCTK_ATTRIBUTE_UNUSED = dg4022;\n+ \n+ CCTK_REAL dbetal23 CCTK_ATTRIBUTE_UNUSED = dg4023;\n+ \n+ CCTK_REAL dbetal31 CCTK_ATTRIBUTE_UNUSED = dg4031;\n+ \n+ CCTK_REAL dbetal32 CCTK_ATTRIBUTE_UNUSED = dg4032;\n+ \n+ CCTK_REAL dbetal33 CCTK_ATTRIBUTE_UNUSED = dg4033;\n+ \n+ dtbetaxL = betal1*dtgu11 + betal2*dtgu12 + betal3*dtgu13 + \n+ dtbetal1*gu11 + dtbetal2*gu12 + dtbetal3*gu13;\n+ \n+ dtbetayL = betal1*dtgu12 + betal2*dtgu22 + betal3*dtgu23 + \n+ dtbetal1*gu12 + dtbetal2*gu22 + dtbetal3*gu23;\n+ \n+ dtbetazL = betal1*dtgu13 + betal2*dtgu23 + betal3*dtgu33 + \n+ dtbetal1*gu13 + dtbetal2*gu23 + dtbetal3*gu33;\n+ \n+ CCTK_REAL dbeta11 CCTK_ATTRIBUTE_UNUSED = betal1*dgu111 + \n+ betal2*dgu121 + betal3*dgu131 + dbetal11*gu11 + dbetal21*gu12 + \n+ dbetal31*gu13;\n+ \n+ CCTK_REAL dbeta21 CCTK_ATTRIBUTE_UNUSED = betal1*dgu121 + \n+ betal2*dgu221 + betal3*dgu231 + dbetal11*gu12 + dbetal21*gu22 + \n+ dbetal31*gu23;\n+ \n+ CCTK_REAL dbeta31 CCTK_ATTRIBUTE_UNUSED = betal1*dgu131 + \n+ betal2*dgu231 + betal3*dgu331 + dbetal11*gu13 + dbetal21*gu23 + \n+ dbetal31*gu33;\n+ \n+ CCTK_REAL dbeta12 CCTK_ATTRIBUTE_UNUSED = betal1*dgu112 + \n+ betal2*dgu122 + betal3*dgu132 + dbetal12*gu11 + dbetal22*gu12 + \n+ dbetal32*gu13;\n+ \n+ CCTK_REAL dbeta22 CCTK_ATTRIBUTE_UNUSED = betal1*dgu122 + \n+ betal2*dgu222 + betal3*dgu232 + dbetal12*gu12 + dbetal22*gu22 + \n+ dbetal32*gu23;\n+ \n+ CCTK_REAL dbeta32 CCTK_ATTRIBUTE_UNUSED = betal1*dgu132 + \n+ betal2*dgu232 + betal3*dgu332 + dbetal12*gu13 + dbetal22*gu23 + \n+ dbetal32*gu33;\n+ \n+ CCTK_REAL dbeta13 CCTK_ATTRIBUTE_UNUSED = betal1*dgu113 + \n+ betal2*dgu123 + betal3*dgu133 + dbetal13*gu11 + dbetal23*gu12 + \n+ dbetal33*gu13;\n+ \n+ CCTK_REAL dbeta23 CCTK_ATTRIBUTE_UNUSED = betal1*dgu123 + \n+ betal2*dgu223 + betal3*dgu233 + dbetal13*gu12 + dbetal23*gu22 + \n+ dbetal33*gu23;\n+ \n+ CCTK_REAL dbeta33 CCTK_ATTRIBUTE_UNUSED = betal1*dgu133 + \n+ betal2*dgu233 + betal3*dgu333 + dbetal13*gu13 + dbetal23*gu23 + \n+ dbetal33*gu33;\n+ \n+ CCTK_REAL dtbetasq CCTK_ATTRIBUTE_UNUSED = dtbetaxL*betal1 + \n+ dtbetayL*betal2 + dtbetazL*betal3 + betaxL*dtbetal1 + betayL*dtbetal2 + \n+ betazL*dtbetal3;\n+ \n+ CCTK_REAL csetemp314 CCTK_ATTRIBUTE_UNUSED = pow(alpL,-1);\n+ \n+ CCTK_REAL dtalpL CCTK_ATTRIBUTE_UNUSED = 0.5*csetemp314*(-dg4000 + \n+ dtbetasq);\n+ \n+ CCTK_REAL kxxL CCTK_ATTRIBUTE_UNUSED = 0.5*csetemp314*(2*(gxxL*dbeta11 \n+ + gxyL*dbeta21 + gxzL*dbeta31) + betaxL*dg111 + betayL*dg112 + \n+ betazL*dg113 - dtg11);\n+ \n+ CCTK_REAL kxyL CCTK_ATTRIBUTE_UNUSED = 0.5*csetemp314*(gxxL*dbeta12 + \n+ gyyL*dbeta21 + gxyL*(dbeta11 + dbeta22) + gyzL*dbeta31 + gxzL*dbeta32 + \n+ betaxL*dg121 + betayL*dg122 + betazL*dg123 - dtg12);\n+ \n+ CCTK_REAL kxzL CCTK_ATTRIBUTE_UNUSED = 0.5*csetemp314*(gxxL*dbeta13 + \n+ gyzL*dbeta21 + gxyL*dbeta23 + gzzL*dbeta31 + gxzL*(dbeta11 + dbeta33) + \n+ betaxL*dg131 + betayL*dg132 + betazL*dg133 - dtg13);\n+ \n+ CCTK_REAL kyyL CCTK_ATTRIBUTE_UNUSED = 0.5*csetemp314*(2*(gxyL*dbeta12 \n+ + gyyL*dbeta22 + gyzL*dbeta32) + betaxL*dg221 + betayL*dg222 + \n+ betazL*dg223 - dtg22);\n+ \n+ CCTK_REAL kyzL CCTK_ATTRIBUTE_UNUSED = 0.5*csetemp314*(gxzL*dbeta12 + \n+ gxyL*dbeta13 + gyyL*dbeta23 + gzzL*dbeta32 + gyzL*(dbeta22 + dbeta33) + \n+ betaxL*dg231 + betayL*dg232 + betazL*dg233 - dtg23);\n+ \n+ CCTK_REAL kzzL CCTK_ATTRIBUTE_UNUSED = 0.5*csetemp314*(2*(gxzL*dbeta13 \n+ + gyzL*dbeta23 + gzzL*dbeta33) + betaxL*dg331 + betayL*dg332 + \n+ betazL*dg333 - dtg33);\n+ /* Copy local copies back to grid functions */\n+ alp[index] = alpL;\n+ betax[index] = betaxL;\n+ betay[index] = betayL;\n+ betaz[index] = betazL;\n+ dtalp[index] = dtalpL;\n+ dtbetax[index] = dtbetaxL;\n+ dtbetay[index] = dtbetayL;\n+ dtbetaz[index] = dtbetazL;\n+ gxx[index] = gxxL;\n+ gxy[index] = gxyL;\n+ gxz[index] = gxzL;\n+ gyy[index] = gyyL;\n+ gyz[index] = gyzL;\n+ gzz[index] = gzzL;\n+ kxx[index] = kxxL;\n+ kxy[index] = kxyL;\n+ kxz[index] = kxzL;\n+ kyy[index] = kyyL;\n+ kyz[index] = kyzL;\n+ kzz[index] = kzzL;\n+ }\n+ CCTK_ENDLOOP3(KerrSchild_initial);\n+}\n+extern \"C\" void KerrSchild_initial(CCTK_ARGUMENTS)\n+{\n+ DECLARE_CCTK_ARGUMENTS;\n+ DECLARE_CCTK_PARAMETERS;\n+ \n+ if (verbose > 1)\n+ {\n+ CCTK_VInfo(CCTK_THORNSTRING,\"Entering KerrSchild_initial_Body\");\n+ }\n+ if (cctk_iteration % KerrSchild_initial_calc_every != KerrSchild_initial_calc_offset)\n+ {\n+ return;\n+ }\n+ \n+ const char* const groups[] = {\n+ \"admbase::curv\",\n+ \"admbase::dtlapse\",\n+ \"admbase::dtshift\",\n+ \"admbase::lapse\",\n+ \"admbase::metric\",\n+ \"admbase::shift\",\n+ \"grid::coordinates\"};\n+ AssertGroupStorage(cctkGH, \"KerrSchild_initial\", 7, groups);\n+ \n+ \n+ LoopOverEverything(cctkGH, KerrSchild_initial_Body);\n+ if (verbose > 1)\n+ {\n+ CCTK_VInfo(CCTK_THORNSTRING,\"Leaving KerrSchild_initial_Body\");\n+ }\n+}\n+\n+} // namespace KerrSchild"}, "test": {"test_patch": "diff --git a/all_tests.txt b/all_tests.txt\nnew file mode 100644\nindex 0000000..0000000\n--- /dev/null\n+++ b/all_tests.txt\n@@ -0,0 +1,7 @@\n+GaugeWave\n+KS-tilted-EE\n+KerrSchild\n+Minkowski\n+ModifiedSchwarzschildBL\n+ShiftedGaugeWave\n+Vaidya2", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}22{"question_id": "MSB_einsteintoolkit_Cactus_pr29", "question_type": "multi_swe_bench", "description": "Add missing KerrSchild_exact.cc in EinsteinExact/KerrSchild (einsteintoolkit/Cactus#29)", "content": {"org": "einsteintoolkit", "repo": "Cactus", "pr_number": 29, "issue_title": "Add missing KerrSchild_exact.cc in EinsteinExact/KerrSchild", "issue_body": "This PR adds the missing source file KerrSchild_exact.cc to complete the EinsteinExact/KerrSchild thorn implementation.", "base_commit": "HEAD", "resolved_issues": [{"number": 29, "title": "Implement the full functionality of KerrSchild", "body": "Please implement the full functionality of `KerrSchild` by finishing the code in `KerrSchild_exact.cc`.\n\n## Thorn Information:\n- Name: KerrSchild\n- Target file: KerrSchild_exact.cc\n\n## Interface Definition in interface.ccl:\n\n## Schedule Definition in schedule.ccl:\n\n## Parameters Definition in param.ccl:\n\n## Configuration Definition in configuration.ccl:\n\n## Documentation Context in readme.md and doc/documentation.tex\n\n## Related Code Context in src folder\n\n"}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/einsteintoolkit_m_cactus:pr-29", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/arrangements/EinsteinExact/KerrSchild/src/KerrSchild_exact.cc b/arrangements/EinsteinExact/KerrSchild/src/KerrSchild_exact.cc\nnew file mode 100644\nindex 0000000..0000000\n--- /dev/null\n+++ b/arrangements/EinsteinExact/KerrSchild/src/KerrSchild_exact.cc\n@@ -0,0 +1,2396 @@\n+/* File produced by Kranc */\n+\n+#define KRANC_C\n+\n+#include <algorithm>\n+#include <assert.h>\n+#include <math.h>\n+#include <stdio.h>\n+#include <stdlib.h>\n+#include <string.h>\n+#include \"cctk.h\"\n+#include \"cctk_Arguments.h\"\n+#include \"cctk_Parameters.h\"\n+#include \"Kranc.hh\"\n+#include \"Differencing.h\"\n+#include \"loopcontrol.h\"\n+\n+namespace KerrSchild {\n+\n+\n+static void KerrSchild_exact_Body(const cGH* restrict const cctkGH, const int dir, const int face, const CCTK_REAL normal[3], const CCTK_REAL tangentA[3], const CCTK_REAL tangentB[3], const int imin[3], const int imax[3], const int n_subblock_gfs, CCTK_REAL* restrict const subblock_gfs[])\n+{\n+ DECLARE_CCTK_ARGUMENTS;\n+ DECLARE_CCTK_PARAMETERS;\n+ \n+ /* Include user-supplied include files */\n+ /* Initialise finite differencing variables */\n+ const ptrdiff_t di CCTK_ATTRIBUTE_UNUSED = 1;\n+ const ptrdiff_t dj CCTK_ATTRIBUTE_UNUSED = \n+ CCTK_GFINDEX3D(cctkGH,0,1,0) - CCTK_GFINDEX3D(cctkGH,0,0,0);\n+ const ptrdiff_t dk CCTK_ATTRIBUTE_UNUSED = \n+ CCTK_GFINDEX3D(cctkGH,0,0,1) - CCTK_GFINDEX3D(cctkGH,0,0,0);\n+ const ptrdiff_t cdi CCTK_ATTRIBUTE_UNUSED = sizeof(CCTK_REAL) * di;\n+ const ptrdiff_t cdj CCTK_ATTRIBUTE_UNUSED = sizeof(CCTK_REAL) * dj;\n+ const ptrdiff_t cdk CCTK_ATTRIBUTE_UNUSED = sizeof(CCTK_REAL) * dk;\n+ const ptrdiff_t cctkLbnd1 CCTK_ATTRIBUTE_UNUSED = cctk_lbnd[0];\n+ const ptrdiff_t cctkLbnd2 CCTK_ATTRIBUTE_UNUSED = cctk_lbnd[1];\n+ const ptrdiff_t cctkLbnd3 CCTK_ATTRIBUTE_UNUSED = cctk_lbnd[2];\n+ const CCTK_REAL t CCTK_ATTRIBUTE_UNUSED = cctk_time;\n+ const CCTK_REAL cctkOriginSpace1 CCTK_ATTRIBUTE_UNUSED = \n+ CCTK_ORIGIN_SPACE(0);\n+ const CCTK_REAL cctkOriginSpace2 CCTK_ATTRIBUTE_UNUSED = \n+ CCTK_ORIGIN_SPACE(1);\n+ const CCTK_REAL cctkOriginSpace3 CCTK_ATTRIBUTE_UNUSED = \n+ CCTK_ORIGIN_SPACE(2);\n+ const CCTK_REAL dt CCTK_ATTRIBUTE_UNUSED = CCTK_DELTA_TIME;\n+ const CCTK_REAL dx CCTK_ATTRIBUTE_UNUSED = CCTK_DELTA_SPACE(0);\n+ const CCTK_REAL dy CCTK_ATTRIBUTE_UNUSED = CCTK_DELTA_SPACE(1);\n+ const CCTK_REAL dz CCTK_ATTRIBUTE_UNUSED = CCTK_DELTA_SPACE(2);\n+ const CCTK_REAL dxi CCTK_ATTRIBUTE_UNUSED = pow(dx,-1);\n+ const CCTK_REAL dyi CCTK_ATTRIBUTE_UNUSED = pow(dy,-1);\n+ const CCTK_REAL dzi CCTK_ATTRIBUTE_UNUSED = pow(dz,-1);\n+ const CCTK_REAL khalf CCTK_ATTRIBUTE_UNUSED = 0.5;\n+ const CCTK_REAL kthird CCTK_ATTRIBUTE_UNUSED = \n+ 0.333333333333333333333333333333;\n+ const CCTK_REAL ktwothird CCTK_ATTRIBUTE_UNUSED = \n+ 0.666666666666666666666666666667;\n+ const CCTK_REAL kfourthird CCTK_ATTRIBUTE_UNUSED = \n+ 1.33333333333333333333333333333;\n+ const CCTK_REAL hdxi CCTK_ATTRIBUTE_UNUSED = 0.5*dxi;\n+ const CCTK_REAL hdyi CCTK_ATTRIBUTE_UNUSED = 0.5*dyi;\n+ const CCTK_REAL hdzi CCTK_ATTRIBUTE_UNUSED = 0.5*dzi;\n+ /* Initialize predefined quantities */\n+ /* Assign local copies of arrays functions */\n+ \n+ \n+ /* Calculate temporaries and arrays functions */\n+ /* Copy local copies back to grid functions */\n+ /* Loop over the grid points */\n+ const int imin0=imin[0];\n+ const int imin1=imin[1];\n+ const int imin2=imin[2];\n+ const int imax0=imax[0];\n+ const int imax1=imax[1];\n+ const int imax2=imax[2];\n+ #pragma omp parallel\n+ CCTK_LOOP3(KerrSchild_exact,\n+ i,j,k, imin0,imin1,imin2, imax0,imax1,imax2,\n+ cctk_ash[0],cctk_ash[1],cctk_ash[2])\n+ {\n+ const ptrdiff_t index CCTK_ATTRIBUTE_UNUSED = di*i + dj*j + dk*k;\n+ /* Assign local copies of grid functions */\n+ \n+ CCTK_REAL alpExactL CCTK_ATTRIBUTE_UNUSED = alpExact[index];\n+ CCTK_REAL betaExact1L CCTK_ATTRIBUTE_UNUSED = betaExact1[index];\n+ CCTK_REAL betaExact2L CCTK_ATTRIBUTE_UNUSED = betaExact2[index];\n+ CCTK_REAL betaExact3L CCTK_ATTRIBUTE_UNUSED = betaExact3[index];\n+ CCTK_REAL dtbetaExact1L CCTK_ATTRIBUTE_UNUSED = dtbetaExact1[index];\n+ CCTK_REAL dtbetaExact2L CCTK_ATTRIBUTE_UNUSED = dtbetaExact2[index];\n+ CCTK_REAL dtbetaExact3L CCTK_ATTRIBUTE_UNUSED = dtbetaExact3[index];\n+ CCTK_REAL gExact11L CCTK_ATTRIBUTE_UNUSED = gExact11[index];\n+ CCTK_REAL gExact12L CCTK_ATTRIBUTE_UNUSED = gExact12[index];\n+ CCTK_REAL gExact13L CCTK_ATTRIBUTE_UNUSED = gExact13[index];\n+ CCTK_REAL gExact22L CCTK_ATTRIBUTE_UNUSED = gExact22[index];\n+ CCTK_REAL gExact23L CCTK_ATTRIBUTE_UNUSED = gExact23[index];\n+ CCTK_REAL gExact33L CCTK_ATTRIBUTE_UNUSED = gExact33[index];\n+ CCTK_REAL gxxL CCTK_ATTRIBUTE_UNUSED = gxx[index];\n+ CCTK_REAL gxyL CCTK_ATTRIBUTE_UNUSED = gxy[index];\n+ CCTK_REAL gxzL CCTK_ATTRIBUTE_UNUSED = gxz[index];\n+ CCTK_REAL gyyL CCTK_ATTRIBUTE_UNUSED = gyy[index];\n+ CCTK_REAL gyzL CCTK_ATTRIBUTE_UNUSED = gyz[index];\n+ CCTK_REAL gzzL CCTK_ATTRIBUTE_UNUSED = gzz[index];\n+ CCTK_REAL xL CCTK_ATTRIBUTE_UNUSED = x[index];\n+ CCTK_REAL yL CCTK_ATTRIBUTE_UNUSED = y[index];\n+ CCTK_REAL zL CCTK_ATTRIBUTE_UNUSED = z[index];\n+ \n+ /* Include user supplied include files */\n+ /* Precompute derivatives */\n+ /* Calculate temporaries and grid functions */\n+ CCTK_REAL xform1L00 CCTK_ATTRIBUTE_UNUSED = 1;\n+ \n+ CCTK_REAL xform1L01 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL xform1L02 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL xform1L03 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL xform1L10 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL csetemp0 CCTK_ATTRIBUTE_UNUSED = cos(phi);\n+ \n+ CCTK_REAL csetemp1 CCTK_ATTRIBUTE_UNUSED = cos(psi);\n+ \n+ CCTK_REAL csetemp2 CCTK_ATTRIBUTE_UNUSED = cos(theta);\n+ \n+ CCTK_REAL csetemp3 CCTK_ATTRIBUTE_UNUSED = sin(phi);\n+ \n+ CCTK_REAL csetemp4 CCTK_ATTRIBUTE_UNUSED = sin(psi);\n+ \n+ CCTK_REAL xform1L11 CCTK_ATTRIBUTE_UNUSED = csetemp0*csetemp1 - \n+ csetemp2*csetemp3*csetemp4;\n+ \n+ CCTK_REAL xform1L12 CCTK_ATTRIBUTE_UNUSED = csetemp1*csetemp3 + \n+ csetemp0*csetemp2*csetemp4;\n+ \n+ CCTK_REAL csetemp5 CCTK_ATTRIBUTE_UNUSED = sin(theta);\n+ \n+ CCTK_REAL xform1L13 CCTK_ATTRIBUTE_UNUSED = csetemp4*csetemp5;\n+ \n+ CCTK_REAL xform1L20 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL xform1L21 CCTK_ATTRIBUTE_UNUSED = \n+ -(csetemp1*csetemp2*csetemp3) - csetemp0*csetemp4;\n+ \n+ CCTK_REAL xform1L22 CCTK_ATTRIBUTE_UNUSED = csetemp0*csetemp1*csetemp2 \n+ - csetemp3*csetemp4;\n+ \n+ CCTK_REAL xform1L23 CCTK_ATTRIBUTE_UNUSED = csetemp1*csetemp5;\n+ \n+ CCTK_REAL xform1L30 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL xform1L31 CCTK_ATTRIBUTE_UNUSED = csetemp3*csetemp5;\n+ \n+ CCTK_REAL xform1L32 CCTK_ATTRIBUTE_UNUSED = -(csetemp0*csetemp5);\n+ \n+ CCTK_REAL xform1L33 CCTK_ATTRIBUTE_UNUSED = csetemp2;\n+ \n+ CCTK_REAL csetemp6 CCTK_ATTRIBUTE_UNUSED = pow(boostx,2);\n+ \n+ CCTK_REAL csetemp7 CCTK_ATTRIBUTE_UNUSED = pow(boosty,2);\n+ \n+ CCTK_REAL csetemp8 CCTK_ATTRIBUTE_UNUSED = pow(boostz,2);\n+ \n+ CCTK_REAL csetemp9 CCTK_ATTRIBUTE_UNUSED = pow(lapsefactor,-1);\n+ \n+ CCTK_REAL xform2L00 CCTK_ATTRIBUTE_UNUSED = csetemp9*(-1 + \n+ boostx*shiftaddx + boosty*shiftaddy + boostz*shiftaddz)*(1 - csetemp6 - \n+ csetemp7 - csetemp8 + pow(1 - csetemp6 - csetemp7 - \n+ csetemp8,0.5))*pow(-1 + csetemp6 + csetemp7 + csetemp8,-1)*pow(1 + \n+ pow(1 - csetemp6 - csetemp7 - csetemp8,0.5),-1);\n+ \n+ CCTK_REAL xform2L01 CCTK_ATTRIBUTE_UNUSED = boostx*csetemp9*(1 - \n+ csetemp6 - csetemp7 - csetemp8 + pow(1 - csetemp6 - csetemp7 - \n+ csetemp8,0.5))*pow(-1 + csetemp6 + csetemp7 + csetemp8,-1)*pow(1 + \n+ pow(1 - csetemp6 - csetemp7 - csetemp8,0.5),-1);\n+ \n+ CCTK_REAL xform2L02 CCTK_ATTRIBUTE_UNUSED = boosty*csetemp9*(1 - \n+ csetemp6 - csetemp7 - csetemp8 + pow(1 - csetemp6 - csetemp7 - \n+ csetemp8,0.5))*pow(-1 + csetemp6 + csetemp7 + csetemp8,-1)*pow(1 + \n+ pow(1 - csetemp6 - csetemp7 - csetemp8,0.5),-1);\n+ \n+ CCTK_REAL xform2L03 CCTK_ATTRIBUTE_UNUSED = boostz*csetemp9*(1 - \n+ csetemp6 - csetemp7 - csetemp8 + pow(1 - csetemp6 - csetemp7 - \n+ csetemp8,0.5))*pow(-1 + csetemp6 + csetemp7 + csetemp8,-1)*pow(1 + \n+ pow(1 - csetemp6 - csetemp7 - csetemp8,0.5),-1);\n+ \n+ CCTK_REAL xform2L10 CCTK_ATTRIBUTE_UNUSED = (-(boostx*(-1 + csetemp6 + \n+ csetemp7 + csetemp8 + (-1 + boosty*shiftaddy + boostz*shiftaddz)*pow(1 \n+ - csetemp6 - csetemp7 - csetemp8,0.5))) + shiftaddx*(csetemp6 + (-1 + \n+ csetemp7 + csetemp8)*(1 + pow(1 - csetemp6 - csetemp7 - \n+ csetemp8,0.5))))*pow(-1 + csetemp6 + csetemp7 + csetemp8,-1)*pow(1 + \n+ pow(1 - csetemp6 - csetemp7 - csetemp8,0.5),-1);\n+ \n+ CCTK_REAL xform2L11 CCTK_ATTRIBUTE_UNUSED = (csetemp6 + (-1 + csetemp7 \n+ + csetemp8)*(1 + pow(1 - csetemp6 - csetemp7 - csetemp8,0.5)))*pow(-1 + \n+ csetemp6 + csetemp7 + csetemp8,-1)*pow(1 + pow(1 - csetemp6 - csetemp7 \n+ - csetemp8,0.5),-1);\n+ \n+ CCTK_REAL xform2L12 CCTK_ATTRIBUTE_UNUSED = -(boostx*boosty*pow(-1 + \n+ csetemp6 + csetemp7 + csetemp8 - pow(1 - csetemp6 - csetemp7 - \n+ csetemp8,0.5),-1));\n+ \n+ CCTK_REAL xform2L13 CCTK_ATTRIBUTE_UNUSED = -(boostx*boostz*pow(-1 + \n+ csetemp6 + csetemp7 + csetemp8 - pow(1 - csetemp6 - csetemp7 - \n+ csetemp8,0.5),-1));\n+ \n+ CCTK_REAL xform2L20 CCTK_ATTRIBUTE_UNUSED = (-(boosty*(-1 + csetemp6 + \n+ csetemp7 + csetemp8 + (-1 + boostx*shiftaddx + boostz*shiftaddz)*pow(1 \n+ - csetemp6 - csetemp7 - csetemp8,0.5))) + shiftaddy*(csetemp7 + (-1 + \n+ csetemp6 + csetemp8)*(1 + pow(1 - csetemp6 - csetemp7 - \n+ csetemp8,0.5))))*pow(-1 + csetemp6 + csetemp7 + csetemp8,-1)*pow(1 + \n+ pow(1 - csetemp6 - csetemp7 - csetemp8,0.5),-1);\n+ \n+ CCTK_REAL xform2L21 CCTK_ATTRIBUTE_UNUSED = -(boostx*boosty*pow(-1 + \n+ csetemp6 + csetemp7 + csetemp8 - pow(1 - csetemp6 - csetemp7 - \n+ csetemp8,0.5),-1));\n+ \n+ CCTK_REAL xform2L22 CCTK_ATTRIBUTE_UNUSED = (csetemp7 + (-1 + csetemp6 \n+ + csetemp8)*(1 + pow(1 - csetemp6 - csetemp7 - csetemp8,0.5)))*pow(-1 + \n+ csetemp6 + csetemp7 + csetemp8,-1)*pow(1 + pow(1 - csetemp6 - csetemp7 \n+ - csetemp8,0.5),-1);\n+ \n+ CCTK_REAL xform2L23 CCTK_ATTRIBUTE_UNUSED = -(boosty*boostz*pow(-1 + \n+ csetemp6 + csetemp7 + csetemp8 - pow(1 - csetemp6 - csetemp7 - \n+ csetemp8,0.5),-1));\n+ \n+ CCTK_REAL xform2L30 CCTK_ATTRIBUTE_UNUSED = (shiftaddz*(-1 + csetemp6 \n+ + csetemp7 + csetemp8 + (-1 + csetemp6 + csetemp7)*pow(1 - csetemp6 - \n+ csetemp7 - csetemp8,0.5)) - boostz*(-1 + csetemp6 + csetemp7 + csetemp8 \n+ + (-1 + boostx*shiftaddx + boosty*shiftaddy)*pow(1 - csetemp6 - \n+ csetemp7 - csetemp8,0.5)))*pow(-1 + csetemp6 + csetemp7 + \n+ csetemp8,-1)*pow(1 + pow(1 - csetemp6 - csetemp7 - csetemp8,0.5),-1);\n+ \n+ CCTK_REAL xform2L31 CCTK_ATTRIBUTE_UNUSED = -(boostx*boostz*pow(-1 + \n+ csetemp6 + csetemp7 + csetemp8 - pow(1 - csetemp6 - csetemp7 - \n+ csetemp8,0.5),-1));\n+ \n+ CCTK_REAL xform2L32 CCTK_ATTRIBUTE_UNUSED = -(boosty*boostz*pow(-1 + \n+ csetemp6 + csetemp7 + csetemp8 - pow(1 - csetemp6 - csetemp7 - \n+ csetemp8,0.5),-1));\n+ \n+ CCTK_REAL xform2L33 CCTK_ATTRIBUTE_UNUSED = (-1 + csetemp6 + csetemp7 \n+ + csetemp8 + (-1 + csetemp6 + csetemp7)*pow(1 - csetemp6 - csetemp7 - \n+ csetemp8,0.5))*pow(-1 + csetemp6 + csetemp7 + csetemp8,-1)*pow(1 + \n+ pow(1 - csetemp6 - csetemp7 - csetemp8,0.5),-1);\n+ \n+ CCTK_REAL xformL00 CCTK_ATTRIBUTE_UNUSED = xform1L00*xform2L00 + \n+ xform1L01*xform2L10 + xform1L02*xform2L20 + xform1L03*xform2L30;\n+ \n+ CCTK_REAL xformL01 CCTK_ATTRIBUTE_UNUSED = xform1L00*xform2L01 + \n+ xform1L01*xform2L11 + xform1L02*xform2L21 + xform1L03*xform2L31;\n+ \n+ CCTK_REAL xformL02 CCTK_ATTRIBUTE_UNUSED = xform1L00*xform2L02 + \n+ xform1L01*xform2L12 + xform1L02*xform2L22 + xform1L03*xform2L32;\n+ \n+ CCTK_REAL xformL03 CCTK_ATTRIBUTE_UNUSED = xform1L00*xform2L03 + \n+ xform1L01*xform2L13 + xform1L02*xform2L23 + xform1L03*xform2L33;\n+ \n+ CCTK_REAL xformL10 CCTK_ATTRIBUTE_UNUSED = xform1L10*xform2L00 + \n+ xform1L11*xform2L10 + xform1L12*xform2L20 + xform1L13*xform2L30;\n+ \n+ CCTK_REAL xformL11 CCTK_ATTRIBUTE_UNUSED = xform1L10*xform2L01 + \n+ xform1L11*xform2L11 + xform1L12*xform2L21 + xform1L13*xform2L31;\n+ \n+ CCTK_REAL xformL12 CCTK_ATTRIBUTE_UNUSED = xform1L10*xform2L02 + \n+ xform1L11*xform2L12 + xform1L12*xform2L22 + xform1L13*xform2L32;\n+ \n+ CCTK_REAL xformL13 CCTK_ATTRIBUTE_UNUSED = xform1L10*xform2L03 + \n+ xform1L11*xform2L13 + xform1L12*xform2L23 + xform1L13*xform2L33;\n+ \n+ CCTK_REAL xformL20 CCTK_ATTRIBUTE_UNUSED = xform1L20*xform2L00 + \n+ xform1L21*xform2L10 + xform1L22*xform2L20 + xform1L23*xform2L30;\n+ \n+ CCTK_REAL xformL21 CCTK_ATTRIBUTE_UNUSED = xform1L20*xform2L01 + \n+ xform1L21*xform2L11 + xform1L22*xform2L21 + xform1L23*xform2L31;\n+ \n+ CCTK_REAL xformL22 CCTK_ATTRIBUTE_UNUSED = xform1L20*xform2L02 + \n+ xform1L21*xform2L12 + xform1L22*xform2L22 + xform1L23*xform2L32;\n+ \n+ CCTK_REAL xformL23 CCTK_ATTRIBUTE_UNUSED = xform1L20*xform2L03 + \n+ xform1L21*xform2L13 + xform1L22*xform2L23 + xform1L23*xform2L33;\n+ \n+ CCTK_REAL xformL30 CCTK_ATTRIBUTE_UNUSED = xform1L30*xform2L00 + \n+ xform1L31*xform2L10 + xform1L32*xform2L20 + xform1L33*xform2L30;\n+ \n+ CCTK_REAL xformL31 CCTK_ATTRIBUTE_UNUSED = xform1L30*xform2L01 + \n+ xform1L31*xform2L11 + xform1L32*xform2L21 + xform1L33*xform2L31;\n+ \n+ CCTK_REAL xformL32 CCTK_ATTRIBUTE_UNUSED = xform1L30*xform2L02 + \n+ xform1L31*xform2L12 + xform1L32*xform2L22 + xform1L33*xform2L32;\n+ \n+ CCTK_REAL xformL33 CCTK_ATTRIBUTE_UNUSED = xform1L30*xform2L03 + \n+ xform1L31*xform2L13 + xform1L32*xform2L23 + xform1L33*xform2L33;\n+ \n+ CCTK_REAL xx0 CCTK_ATTRIBUTE_UNUSED = t - timeoffset;\n+ \n+ CCTK_REAL xx1 CCTK_ATTRIBUTE_UNUSED = xL - positionx;\n+ \n+ CCTK_REAL xx2 CCTK_ATTRIBUTE_UNUSED = yL - positiony;\n+ \n+ CCTK_REAL xx3 CCTK_ATTRIBUTE_UNUSED = zL - positionz;\n+ \n+ CCTK_REAL txx1 CCTK_ATTRIBUTE_UNUSED = xformL10*xx0 + xformL11*xx1 + \n+ xformL12*xx2 + xformL13*xx3;\n+ \n+ CCTK_REAL txx2 CCTK_ATTRIBUTE_UNUSED = xformL20*xx0 + xformL21*xx1 + \n+ xformL22*xx2 + xformL23*xx3;\n+ \n+ CCTK_REAL txx3 CCTK_ATTRIBUTE_UNUSED = xformL30*xx0 + xformL31*xx1 + \n+ xformL32*xx2 + xformL33*xx3;\n+ \n+ CCTK_REAL X CCTK_ATTRIBUTE_UNUSED = txx1;\n+ \n+ CCTK_REAL Y CCTK_ATTRIBUTE_UNUSED = txx2;\n+ \n+ CCTK_REAL Z CCTK_ATTRIBUTE_UNUSED = txx3;\n+ \n+ CCTK_REAL csetemp10 CCTK_ATTRIBUTE_UNUSED = pow(a,2);\n+ \n+ CCTK_REAL csetemp11 CCTK_ATTRIBUTE_UNUSED = pow(X,2);\n+ \n+ CCTK_REAL csetemp12 CCTK_ATTRIBUTE_UNUSED = pow(Y,2);\n+ \n+ CCTK_REAL csetemp13 CCTK_ATTRIBUTE_UNUSED = pow(Z,2);\n+ \n+ CCTK_REAL rXYZ CCTK_ATTRIBUTE_UNUSED = \n+ 0.707106781186547524400844362105*pow(-csetemp10 + csetemp11 + csetemp12 \n+ + csetemp13 + pow(4*csetemp10*csetemp13 + pow(-csetemp10 + csetemp11 + \n+ csetemp12 + csetemp13,2),0.5),0.5);\n+ \n+ CCTK_REAL csetemp14 CCTK_ATTRIBUTE_UNUSED = pow(rXYZ,3);\n+ \n+ CCTK_REAL csetemp15 CCTK_ATTRIBUTE_UNUSED = pow(rXYZ,4);\n+ \n+ CCTK_REAL tg400 CCTK_ATTRIBUTE_UNUSED = -1 + \n+ 2*csetemp14*M*pow(csetemp10*csetemp13 + csetemp15,-1);\n+ \n+ CCTK_REAL csetemp16 CCTK_ATTRIBUTE_UNUSED = pow(rXYZ,2);\n+ \n+ CCTK_REAL csetemp17 CCTK_ATTRIBUTE_UNUSED = rXYZ*X;\n+ \n+ CCTK_REAL csetemp18 CCTK_ATTRIBUTE_UNUSED = a*Y;\n+ \n+ CCTK_REAL tg401 CCTK_ATTRIBUTE_UNUSED = 2*csetemp14*(csetemp17 + \n+ csetemp18)*M*pow(csetemp10*csetemp13 + csetemp15,-1)*pow(csetemp10 + \n+ csetemp16,-1);\n+ \n+ CCTK_REAL csetemp19 CCTK_ATTRIBUTE_UNUSED = a*X;\n+ \n+ CCTK_REAL csetemp20 CCTK_ATTRIBUTE_UNUSED = -csetemp19;\n+ \n+ CCTK_REAL csetemp21 CCTK_ATTRIBUTE_UNUSED = rXYZ*Y;\n+ \n+ CCTK_REAL tg402 CCTK_ATTRIBUTE_UNUSED = 2*csetemp14*(csetemp20 + \n+ csetemp21)*M*pow(csetemp10*csetemp13 + csetemp15,-1)*pow(csetemp10 + \n+ csetemp16,-1);\n+ \n+ CCTK_REAL tg403 CCTK_ATTRIBUTE_UNUSED = \n+ 2*csetemp16*M*Z*pow(csetemp10*csetemp13 + csetemp15,-1);\n+ \n+ CCTK_REAL tg411 CCTK_ATTRIBUTE_UNUSED = 1 + \n+ 2*csetemp14*M*pow(csetemp10*csetemp13 + csetemp15,-1)*pow(csetemp10 + \n+ csetemp16,-2)*pow(csetemp17 + csetemp18,2);\n+ \n+ CCTK_REAL tg412 CCTK_ATTRIBUTE_UNUSED = 2*csetemp14*(csetemp17 + \n+ csetemp18)*(csetemp20 + csetemp21)*M*pow(csetemp10*csetemp13 + \n+ csetemp15,-1)*pow(csetemp10 + csetemp16,-2);\n+ \n+ CCTK_REAL tg413 CCTK_ATTRIBUTE_UNUSED = 2*csetemp16*(csetemp17 + \n+ csetemp18)*M*Z*pow(csetemp10*csetemp13 + csetemp15,-1)*pow(csetemp10 + \n+ csetemp16,-1);\n+ \n+ CCTK_REAL tg422 CCTK_ATTRIBUTE_UNUSED = 1 + \n+ 2*csetemp14*M*pow(csetemp10*csetemp13 + csetemp15,-1)*pow(csetemp10 + \n+ csetemp16,-2)*pow(csetemp20 + csetemp21,2);\n+ \n+ CCTK_REAL tg423 CCTK_ATTRIBUTE_UNUSED = 2*csetemp16*(csetemp20 + \n+ csetemp21)*M*Z*pow(csetemp10*csetemp13 + csetemp15,-1)*pow(csetemp10 + \n+ csetemp16,-1);\n+ \n+ CCTK_REAL tg433 CCTK_ATTRIBUTE_UNUSED = 1 + \n+ 2*csetemp13*M*rXYZ*pow(csetemp10*csetemp13 + csetemp15,-1);\n+ \n+ CCTK_REAL tdg4000 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL csetemp22 CCTK_ATTRIBUTE_UNUSED = pow(rXYZ,7);\n+ \n+ CCTK_REAL tdg4001 CCTK_ATTRIBUTE_UNUSED = \n+ 2*(3*csetemp10*csetemp13*csetemp14 - \n+ csetemp22)*M*X*pow(csetemp10*csetemp13 + \n+ csetemp15,-2)*pow(4*csetemp10*csetemp13 + pow(-csetemp10 + csetemp11 + \n+ csetemp12 + csetemp13,2),-0.5);\n+ \n+ CCTK_REAL tdg4002 CCTK_ATTRIBUTE_UNUSED = \n+ 2*(3*csetemp10*csetemp13*csetemp14 - \n+ csetemp22)*M*Y*pow(csetemp10*csetemp13 + \n+ csetemp15,-2)*pow(4*csetemp10*csetemp13 + pow(-csetemp10 + csetemp11 + \n+ csetemp12 + csetemp13,2),-0.5);\n+ \n+ CCTK_REAL csetemp23 CCTK_ATTRIBUTE_UNUSED = pow(rXYZ,6);\n+ \n+ CCTK_REAL csetemp24 CCTK_ATTRIBUTE_UNUSED = pow(a,4);\n+ \n+ CCTK_REAL tdg4003 CCTK_ATTRIBUTE_UNUSED = 2*(csetemp10*(-5*csetemp15 + \n+ (-2*csetemp10 + 2*(csetemp11 + csetemp12) + 5*csetemp13)*csetemp16) - \n+ csetemp23 + 3*csetemp13*csetemp24)*M*rXYZ*Z*pow(csetemp10*csetemp13 + \n+ csetemp15,-2)*pow(4*csetemp10*csetemp13 + pow(-csetemp10 + csetemp11 + \n+ csetemp12 + csetemp13,2),-0.5);\n+ \n+ CCTK_REAL tdg4010 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL csetemp25 CCTK_ATTRIBUTE_UNUSED = pow(rXYZ,9);\n+ \n+ CCTK_REAL csetemp26 CCTK_ATTRIBUTE_UNUSED = pow(a,3);\n+ \n+ CCTK_REAL csetemp27 CCTK_ATTRIBUTE_UNUSED = pow(a,5);\n+ \n+ CCTK_REAL csetemp28 CCTK_ATTRIBUTE_UNUSED = pow(rXYZ,5);\n+ \n+ CCTK_REAL tdg4011 CCTK_ATTRIBUTE_UNUSED = 2*csetemp14*M*((3*csetemp10 \n+ - 3*csetemp11 - csetemp12 - csetemp13)*csetemp22 + 2*csetemp25 + \n+ csetemp10*((3*csetemp10 + csetemp11 - csetemp12 - \n+ csetemp13)*csetemp13*csetemp14 + (csetemp10 - csetemp11 - csetemp12 + \n+ csetemp13)*csetemp28) + (-3*a*csetemp23 - csetemp15*csetemp26 + \n+ 3*csetemp13*csetemp27)*X*Y + csetemp13*((csetemp10 + 3*csetemp11 - \n+ csetemp12 - csetemp13)*csetemp24*rXYZ + \n+ csetemp16*csetemp26*X*Y))*pow(csetemp10*csetemp13 + \n+ csetemp15,-2)*pow(csetemp10 + csetemp16,-2)*pow(4*csetemp10*csetemp13 + \n+ pow(-csetemp10 + csetemp11 + csetemp12 + csetemp13,2),-0.5);\n+ \n+ CCTK_REAL csetemp29 CCTK_ATTRIBUTE_UNUSED = pow(rXYZ,8);\n+ \n+ CCTK_REAL tdg4012 CCTK_ATTRIBUTE_UNUSED = 2*csetemp14*M*(((csetemp10 - \n+ csetemp11 - 2*csetemp12 + csetemp13)*csetemp15 + (3*csetemp10 - \n+ csetemp11 - csetemp13)*csetemp13*csetemp16)*csetemp26 + a*((3*csetemp10 \n+ - csetemp11 - 4*csetemp12 - csetemp13)*csetemp23 + 2*csetemp29) + \n+ (-2*csetemp22 + 4*csetemp13*csetemp24*rXYZ)*X*Y + csetemp13*((csetemp10 \n+ - csetemp11 + 2*csetemp12 - csetemp13)*csetemp27 + \n+ 2*csetemp10*csetemp14*X*Y))*pow(csetemp10*csetemp13 + \n+ csetemp15,-2)*pow(csetemp10 + csetemp16,-2)*pow(4*csetemp10*csetemp13 + \n+ pow(-csetemp10 + csetemp11 + csetemp12 + csetemp13,2),-0.5);\n+ \n+ CCTK_REAL tdg4013 CCTK_ATTRIBUTE_UNUSED = 2*M*rXYZ*((-2*csetemp22 + \n+ csetemp10*(2*(-csetemp10 + csetemp11 + csetemp12 + \n+ 2*csetemp13)*csetemp14 - 4*csetemp28) + 4*csetemp13*csetemp24*rXYZ)*X + \n+ (-3*a*csetemp23 + (-5*csetemp15 + (-2*csetemp10 + 2*(csetemp11 + \n+ csetemp12) + 3*csetemp13)*csetemp16)*csetemp26 + \n+ 3*csetemp13*csetemp27)*Y)*Z*pow(csetemp10*csetemp13 + \n+ csetemp15,-2)*pow(csetemp10 + csetemp16,-1)*pow(4*csetemp10*csetemp13 + \n+ pow(-csetemp10 + csetemp11 + csetemp12 + csetemp13,2),-0.5);\n+ \n+ CCTK_REAL tdg4020 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tdg4021 CCTK_ATTRIBUTE_UNUSED = -2*csetemp14*M*(((csetemp10 \n+ - 2*csetemp11 - csetemp12 + csetemp13)*csetemp15 + (3*csetemp10 - \n+ csetemp12 - csetemp13)*csetemp13*csetemp16)*csetemp26 + a*((3*csetemp10 \n+ - 4*csetemp11 - csetemp12 - csetemp13)*csetemp23 + 2*csetemp29) + \n+ (2*csetemp22 - 4*csetemp13*csetemp24*rXYZ)*X*Y + csetemp13*((csetemp10 \n+ + 2*csetemp11 - csetemp12 - csetemp13)*csetemp27 - \n+ 2*csetemp10*csetemp14*X*Y))*pow(csetemp10*csetemp13 + \n+ csetemp15,-2)*pow(csetemp10 + csetemp16,-2)*pow(4*csetemp10*csetemp13 + \n+ pow(-csetemp10 + csetemp11 + csetemp12 + csetemp13,2),-0.5);\n+ \n+ CCTK_REAL tdg4022 CCTK_ATTRIBUTE_UNUSED = 2*csetemp14*M*((3*csetemp10 \n+ - csetemp11 - 3*csetemp12 - csetemp13)*csetemp22 + 2*csetemp25 + \n+ csetemp10*((3*csetemp10 - csetemp11 + csetemp12 - \n+ csetemp13)*csetemp13*csetemp14 + (csetemp10 - csetemp11 - csetemp12 + \n+ csetemp13)*csetemp28) + (3*a*csetemp23 + csetemp15*csetemp26 - \n+ 3*csetemp13*csetemp27)*X*Y + csetemp13*((csetemp10 - csetemp11 + \n+ 3*csetemp12 - csetemp13)*csetemp24*rXYZ - \n+ csetemp16*csetemp26*X*Y))*pow(csetemp10*csetemp13 + \n+ csetemp15,-2)*pow(csetemp10 + csetemp16,-2)*pow(4*csetemp10*csetemp13 + \n+ pow(-csetemp10 + csetemp11 + csetemp12 + csetemp13,2),-0.5);\n+ \n+ CCTK_REAL tdg4023 CCTK_ATTRIBUTE_UNUSED = 2*M*rXYZ*((3*a*csetemp23 + \n+ (5*csetemp15 + (2*csetemp10 - 2*(csetemp11 + csetemp12) - \n+ 3*csetemp13)*csetemp16)*csetemp26)*X + (-2*csetemp22 + \n+ csetemp10*(2*(-csetemp10 + csetemp11 + csetemp12 + \n+ 2*csetemp13)*csetemp14 - 4*csetemp28))*Y + csetemp13*(-3*csetemp27*X + \n+ 4*csetemp24*rXYZ*Y))*Z*pow(csetemp10*csetemp13 + \n+ csetemp15,-2)*pow(csetemp10 + csetemp16,-1)*pow(4*csetemp10*csetemp13 + \n+ pow(-csetemp10 + csetemp11 + csetemp12 + csetemp13,2),-0.5);\n+ \n+ CCTK_REAL tdg4030 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tdg4031 CCTK_ATTRIBUTE_UNUSED = \n+ 4*(csetemp10*csetemp13*csetemp16 - \n+ csetemp23)*M*X*Z*pow(csetemp10*csetemp13 + \n+ csetemp15,-2)*pow(4*csetemp10*csetemp13 + pow(-csetemp10 + csetemp11 + \n+ csetemp12 + csetemp13,2),-0.5);\n+ \n+ CCTK_REAL tdg4032 CCTK_ATTRIBUTE_UNUSED = \n+ 4*(csetemp10*csetemp13*csetemp16 - \n+ csetemp23)*M*Y*Z*pow(csetemp10*csetemp13 + \n+ csetemp15,-2)*pow(4*csetemp10*csetemp13 + pow(-csetemp10 + csetemp11 + \n+ csetemp12 + csetemp13,2),-0.5);\n+ \n+ CCTK_REAL tdg4033 CCTK_ATTRIBUTE_UNUSED = 2*(csetemp10*csetemp13 - \n+ csetemp15)*(2*csetemp10*csetemp13 - 2*csetemp15 + (-csetemp10 + \n+ csetemp11 + csetemp12 + \n+ 3*csetemp13)*csetemp16)*M*pow(csetemp10*csetemp13 + \n+ csetemp15,-2)*pow(4*csetemp10*csetemp13 + pow(-csetemp10 + csetemp11 + \n+ csetemp12 + csetemp13,2),-0.5);\n+ \n+ CCTK_REAL tdg4110 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tdg4111 CCTK_ATTRIBUTE_UNUSED = 2*csetemp14*(csetemp17 + \n+ csetemp18)*M*((6*csetemp10 - 5*csetemp11 - 2*(csetemp12 + \n+ csetemp13))*csetemp22 + 4*csetemp25 + csetemp10*(csetemp13*(6*csetemp10 \n+ - csetemp11 - 2*(csetemp12 + csetemp13))*csetemp14 + (-csetemp11 - \n+ 2*csetemp12 + 2*(csetemp10 + csetemp13))*csetemp28) + (-5*a*csetemp23 - \n+ csetemp15*csetemp26 + 3*csetemp13*csetemp27)*X*Y + \n+ csetemp13*((2*csetemp10 + 3*csetemp11 - 2*(csetemp12 + \n+ csetemp13))*csetemp24*rXYZ - \n+ csetemp16*csetemp26*X*Y))*pow(csetemp10*csetemp13 + \n+ csetemp15,-2)*pow(csetemp10 + csetemp16,-3)*pow(4*csetemp10*csetemp13 + \n+ pow(-csetemp10 + csetemp11 + csetemp12 + csetemp13,2),-0.5);\n+ \n+ CCTK_REAL tdg4112 CCTK_ATTRIBUTE_UNUSED = 2*csetemp14*(csetemp17 + \n+ csetemp18)*M*(((-2*csetemp11 - 3*csetemp12 + 2*(csetemp10 + \n+ csetemp13))*csetemp15 + csetemp13*(6*csetemp10 - 3*csetemp12 - \n+ 2*(csetemp11 + csetemp13))*csetemp16)*csetemp26 + a*((6*csetemp10 - \n+ 7*csetemp12 - 2*(csetemp11 + csetemp13))*csetemp23 + 4*csetemp29) + \n+ (-3*csetemp22 + csetemp10*csetemp28 + 5*csetemp13*csetemp24*rXYZ)*X*Y + \n+ csetemp13*((2*csetemp10 + csetemp12 - 2*(csetemp11 + \n+ csetemp13))*csetemp27 + \n+ csetemp10*csetemp14*X*Y))*pow(csetemp10*csetemp13 + \n+ csetemp15,-2)*pow(csetemp10 + csetemp16,-3)*pow(4*csetemp10*csetemp13 + \n+ pow(-csetemp10 + csetemp11 + csetemp12 + csetemp13,2),-0.5);\n+ \n+ CCTK_REAL tdg4113 CCTK_ATTRIBUTE_UNUSED = 2*(csetemp17 + \n+ csetemp18)*M*rXYZ*((-3*csetemp22 + csetemp10*((-2*csetemp10 + \n+ 2*(csetemp11 + csetemp12) + 3*csetemp13)*csetemp14 - 3*csetemp28) + \n+ 5*csetemp13*csetemp24*rXYZ)*X + (-5*a*csetemp23 + (-5*csetemp15 + \n+ (-2*csetemp10 + 2*(csetemp11 + csetemp12) + \n+ csetemp13)*csetemp16)*csetemp26 + \n+ 3*csetemp13*csetemp27)*Y)*Z*pow(csetemp10*csetemp13 + \n+ csetemp15,-2)*pow(csetemp10 + csetemp16,-2)*pow(4*csetemp10*csetemp13 + \n+ pow(-csetemp10 + csetemp11 + csetemp12 + csetemp13,2),-0.5);\n+ \n+ CCTK_REAL tdg4120 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL csetemp30 CCTK_ATTRIBUTE_UNUSED = pow(rXYZ,10);\n+ \n+ CCTK_REAL csetemp31 CCTK_ATTRIBUTE_UNUSED = pow(a,6);\n+ \n+ CCTK_REAL tdg4121 CCTK_ATTRIBUTE_UNUSED = \n+ 2*csetemp14*M*((a*(2*(-3*csetemp10 + 3*csetemp11 - csetemp12 + \n+ csetemp13)*csetemp22 - 4*csetemp25) + \n+ csetemp26*(2*csetemp13*(-3*csetemp10 + csetemp11 + csetemp12 + \n+ csetemp13)*csetemp14 - 2*(csetemp10 - csetemp11 - csetemp12 + \n+ csetemp13)*csetemp28))*X + (csetemp10*(2*(-csetemp10 + 3*csetemp11 + \n+ csetemp13)*csetemp23 - csetemp15*(csetemp13*(csetemp12 + csetemp13) - \n+ csetemp10*(csetemp12 + 2*(csetemp11 + csetemp13)) + csetemp24)) - \n+ (-csetemp10 + 4*csetemp11 + csetemp12 + csetemp13)*csetemp29 + \n+ 2*csetemp30 + csetemp13*(-csetemp10 - 2*csetemp11 + csetemp12 + \n+ csetemp13)*csetemp31)*Y - 2*csetemp13*((csetemp10 + csetemp11 - \n+ 3*csetemp12 - csetemp13)*csetemp27*rXYZ*X + (csetemp10 - \n+ 3*csetemp11)*csetemp16*csetemp24*Y))*pow(csetemp10*csetemp13 + \n+ csetemp15,-2)*pow(csetemp10 + csetemp16,-3)*pow(4*csetemp10*csetemp13 + \n+ pow(-csetemp10 + csetemp11 + csetemp12 + csetemp13,2),-0.5);\n+ \n+ CCTK_REAL tdg4122 CCTK_ATTRIBUTE_UNUSED = \n+ -2*csetemp14*M*((csetemp10*csetemp15*(csetemp13*(csetemp11 + csetemp13) \n+ - csetemp10*(csetemp11 + 2*(csetemp12 + csetemp13)) + csetemp24) + \n+ (-csetemp10 + csetemp11 + 4*csetemp12 + csetemp13)*csetemp29 - \n+ 2*csetemp30 + (csetemp10 - csetemp11 + 2*csetemp12 - \n+ csetemp13)*csetemp13*csetemp31)*X + (-4*a*csetemp25 - 2*((csetemp10 - \n+ csetemp11 - csetemp12 + csetemp13)*csetemp26*csetemp28 + (csetemp10 - \n+ 3*csetemp11 + csetemp12 - csetemp13)*csetemp13*csetemp27*rXYZ))*Y + \n+ 2*((csetemp10*(csetemp10 - 3*csetemp12 - csetemp13)*csetemp23 + \n+ (csetemp10 - 3*csetemp12)*csetemp13*csetemp16*csetemp24)*X + \n+ (a*(-3*csetemp10 - csetemp11 + 3*csetemp12 + csetemp13)*csetemp22 + \n+ csetemp13*(-3*csetemp10 + csetemp11 + csetemp12 + \n+ csetemp13)*csetemp14*csetemp26)*Y))*pow(csetemp10*csetemp13 + \n+ csetemp15,-2)*pow(csetemp10 + csetemp16,-3)*pow(4*csetemp10*csetemp13 + \n+ pow(-csetemp10 + csetemp11 + csetemp12 + csetemp13,2),-0.5);\n+ \n+ CCTK_REAL tdg4123 CCTK_ATTRIBUTE_UNUSED = 2*M*rXYZ*((csetemp11 - \n+ csetemp12)*(4*a*csetemp22 + csetemp26*(-2*(-csetemp10 + csetemp11 + \n+ csetemp12 + csetemp13)*csetemp14 + 4*csetemp28)) + \n+ (csetemp10*((2*(csetemp11 + csetemp12) + 3*(csetemp10 + \n+ csetemp13))*csetemp15 + 2*csetemp23) + 2*(csetemp10 - csetemp11 - \n+ csetemp12 + 2*csetemp13)*csetemp16*csetemp24 - 3*csetemp29)*X*Y + \n+ csetemp13*(4*(-csetemp11 + csetemp12)*csetemp27*rXYZ - \n+ 3*csetemp31*X*Y))*Z*pow(csetemp10*csetemp13 + \n+ csetemp15,-2)*pow(csetemp10 + csetemp16,-2)*pow(4*csetemp10*csetemp13 + \n+ pow(-csetemp10 + csetemp11 + csetemp12 + csetemp13,2),-0.5);\n+ \n+ CCTK_REAL tdg4130 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tdg4131 CCTK_ATTRIBUTE_UNUSED = \n+ -2*csetemp16*M*((-3*csetemp10 + 4*csetemp11 + csetemp12 + \n+ csetemp13)*csetemp22 + csetemp10*(csetemp13*(-3*csetemp10 + csetemp12 + \n+ csetemp13)*csetemp14 - (csetemp10 - 2*csetemp11 - csetemp12 + \n+ csetemp13)*csetemp28) + csetemp13*(-csetemp10 - 2*csetemp11 + csetemp12 \n+ + csetemp13)*csetemp24*rXYZ + (4*a*csetemp23 + \n+ 2*csetemp15*csetemp26)*X*Y - 2*(csetemp25 + \n+ csetemp13*csetemp27*X*Y))*Z*pow(csetemp10*csetemp13 + \n+ csetemp15,-2)*pow(csetemp10 + csetemp16,-2)*pow(4*csetemp10*csetemp13 + \n+ pow(-csetemp10 + csetemp11 + csetemp12 + csetemp13,2),-0.5);\n+ \n+ CCTK_REAL tdg4132 CCTK_ATTRIBUTE_UNUSED = \n+ -2*csetemp16*M*((-((csetemp10 - csetemp11 - 3*csetemp12 + \n+ csetemp13)*csetemp15) + csetemp13*(-3*csetemp10 + csetemp11 + csetemp12 \n+ + csetemp13)*csetemp16)*csetemp26 + a*((-3*csetemp10 + csetemp11 + \n+ 5*csetemp12 + csetemp13)*csetemp23 - 2*csetemp29) + (3*csetemp22 + \n+ csetemp10*csetemp28 - 3*csetemp13*csetemp24*rXYZ)*X*Y + \n+ csetemp13*((-csetemp10 + csetemp11 - csetemp12 + csetemp13)*csetemp27 - \n+ csetemp10*csetemp14*X*Y))*Z*pow(csetemp10*csetemp13 + \n+ csetemp15,-2)*pow(csetemp10 + csetemp16,-2)*pow(4*csetemp10*csetemp13 + \n+ pow(-csetemp10 + csetemp11 + csetemp12 + csetemp13,2),-0.5);\n+ \n+ CCTK_REAL csetemp32 CCTK_ATTRIBUTE_UNUSED = pow(Z,4);\n+ \n+ CCTK_REAL tdg4133 CCTK_ATTRIBUTE_UNUSED = 2*M*((-((-csetemp10 + \n+ csetemp11 + csetemp12 + 4*csetemp13)*csetemp22) + 2*csetemp25 + \n+ csetemp10*csetemp13*((-csetemp10 + csetemp11 + csetemp12 + \n+ 2*csetemp13)*csetemp14 - 3*csetemp28) + 3*csetemp24*csetemp32*rXYZ)*X + \n+ (a*(csetemp10 - csetemp11 - csetemp12 - 5*csetemp13)*csetemp23 + \n+ csetemp13*(-4*csetemp15 + (-csetemp10 + csetemp11 + csetemp12 + \n+ csetemp13)*csetemp16)*csetemp26 + 2*(a*csetemp29 + \n+ csetemp27*csetemp32))*Y)*pow(csetemp10*csetemp13 + \n+ csetemp15,-2)*pow(csetemp10 + csetemp16,-1)*pow(4*csetemp10*csetemp13 + \n+ pow(-csetemp10 + csetemp11 + csetemp12 + csetemp13,2),-0.5);\n+ \n+ CCTK_REAL tdg4220 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL csetemp33 CCTK_ATTRIBUTE_UNUSED = -csetemp21;\n+ \n+ CCTK_REAL tdg4221 CCTK_ATTRIBUTE_UNUSED = 2*csetemp14*(csetemp19 + \n+ csetemp33)*M*(((-3*csetemp11 - 2*csetemp12 + 2*(csetemp10 + \n+ csetemp13))*csetemp15 + csetemp13*(6*csetemp10 - 3*csetemp11 - \n+ 2*(csetemp12 + csetemp13))*csetemp16)*csetemp26 + a*((6*csetemp10 - \n+ 7*csetemp11 - 2*(csetemp12 + csetemp13))*csetemp23 + 4*csetemp29) + \n+ (3*csetemp22 - csetemp10*csetemp28 - 5*csetemp13*csetemp24*rXYZ)*X*Y + \n+ csetemp13*((2*csetemp10 + csetemp11 - 2*(csetemp12 + \n+ csetemp13))*csetemp27 - \n+ csetemp10*csetemp14*X*Y))*pow(csetemp10*csetemp13 + \n+ csetemp15,-2)*pow(csetemp10 + csetemp16,-3)*pow(4*csetemp10*csetemp13 + \n+ pow(-csetemp10 + csetemp11 + csetemp12 + csetemp13,2),-0.5);\n+ \n+ CCTK_REAL tdg4222 CCTK_ATTRIBUTE_UNUSED = 2*csetemp14*(csetemp20 + \n+ csetemp21)*M*((6*csetemp10 - 5*csetemp12 - 2*(csetemp11 + \n+ csetemp13))*csetemp22 + 4*csetemp25 + csetemp10*(csetemp13*(6*csetemp10 \n+ - csetemp12 - 2*(csetemp11 + csetemp13))*csetemp14 + (-2*csetemp11 - \n+ csetemp12 + 2*(csetemp10 + csetemp13))*csetemp28) + (5*a*csetemp23 + \n+ csetemp15*csetemp26 - 3*csetemp13*csetemp27)*X*Y + \n+ csetemp13*((2*csetemp10 + 3*csetemp12 - 2*(csetemp11 + \n+ csetemp13))*csetemp24*rXYZ + \n+ csetemp16*csetemp26*X*Y))*pow(csetemp10*csetemp13 + \n+ csetemp15,-2)*pow(csetemp10 + csetemp16,-3)*pow(4*csetemp10*csetemp13 + \n+ pow(-csetemp10 + csetemp11 + csetemp12 + csetemp13,2),-0.5);\n+ \n+ CCTK_REAL tdg4223 CCTK_ATTRIBUTE_UNUSED = 2*(csetemp19 + \n+ csetemp33)*M*rXYZ*((-5*csetemp15 + (-2*csetemp10 + 2*(csetemp11 + \n+ csetemp12) + csetemp13)*csetemp16)*csetemp26*X + \n+ csetemp10*((2*csetemp10 - 2*(csetemp11 + csetemp12) - \n+ 3*csetemp13)*csetemp14 + 3*csetemp28)*Y + 3*(csetemp13*csetemp27*X + \n+ csetemp22*Y) - 5*(a*csetemp23*X + \n+ csetemp13*csetemp24*rXYZ*Y))*Z*pow(csetemp10*csetemp13 + \n+ csetemp15,-2)*pow(csetemp10 + csetemp16,-2)*pow(4*csetemp10*csetemp13 + \n+ pow(-csetemp10 + csetemp11 + csetemp12 + csetemp13,2),-0.5);\n+ \n+ CCTK_REAL tdg4230 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tdg4231 CCTK_ATTRIBUTE_UNUSED = 2*csetemp16*M*((-((csetemp10 \n+ - 3*csetemp11 - csetemp12 + csetemp13)*csetemp15) + \n+ csetemp13*(-3*csetemp10 + csetemp11 + csetemp12 + \n+ csetemp13)*csetemp16)*csetemp26 + a*((-3*csetemp10 + 5*csetemp11 + \n+ csetemp12 + csetemp13)*csetemp23 - 2*csetemp29) + (-3*csetemp22 - \n+ csetemp10*csetemp28 + 3*csetemp13*csetemp24*rXYZ)*X*Y + \n+ csetemp13*((-csetemp10 - csetemp11 + csetemp12 + csetemp13)*csetemp27 + \n+ csetemp10*csetemp14*X*Y))*Z*pow(csetemp10*csetemp13 + \n+ csetemp15,-2)*pow(csetemp10 + csetemp16,-2)*pow(4*csetemp10*csetemp13 + \n+ pow(-csetemp10 + csetemp11 + csetemp12 + csetemp13,2),-0.5);\n+ \n+ CCTK_REAL tdg4232 CCTK_ATTRIBUTE_UNUSED = \n+ -2*csetemp16*M*((-3*csetemp10 + csetemp11 + 4*csetemp12 + \n+ csetemp13)*csetemp22 + csetemp10*(csetemp13*(-3*csetemp10 + csetemp11 + \n+ csetemp13)*csetemp14 - (csetemp10 - csetemp11 - 2*csetemp12 + \n+ csetemp13)*csetemp28) - 4*a*csetemp23*X*Y - 2*(csetemp25 + \n+ csetemp15*csetemp26*X*Y) + csetemp13*((-csetemp10 + csetemp11 - \n+ 2*csetemp12 + csetemp13)*csetemp24*rXYZ + \n+ 2*csetemp27*X*Y))*Z*pow(csetemp10*csetemp13 + \n+ csetemp15,-2)*pow(csetemp10 + csetemp16,-2)*pow(4*csetemp10*csetemp13 + \n+ pow(-csetemp10 + csetemp11 + csetemp12 + csetemp13,2),-0.5);\n+ \n+ CCTK_REAL tdg4233 CCTK_ATTRIBUTE_UNUSED = -2*M*(a*((csetemp10 - \n+ csetemp11 - csetemp12 - 5*csetemp13)*csetemp23 + 2*csetemp29)*X + \n+ ((-csetemp10 + csetemp11 + csetemp12 + 4*csetemp13)*csetemp22 - \n+ 2*csetemp25 + 3*csetemp10*csetemp13*csetemp28)*Y + \n+ csetemp13*((-4*csetemp15 + (-csetemp10 + csetemp11 + csetemp12 + \n+ csetemp13)*csetemp16)*csetemp26*X + csetemp10*(csetemp10 - csetemp11 - \n+ csetemp12 - 2*csetemp13)*csetemp14*Y) + csetemp32*(2*csetemp27*X - \n+ 3*csetemp24*rXYZ*Y))*pow(csetemp10*csetemp13 + \n+ csetemp15,-2)*pow(csetemp10 + csetemp16,-1)*pow(4*csetemp10*csetemp13 + \n+ pow(-csetemp10 + csetemp11 + csetemp12 + csetemp13,2),-0.5);\n+ \n+ CCTK_REAL tdg4330 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tdg4331 CCTK_ATTRIBUTE_UNUSED = 2*csetemp13*M*(-3*csetemp28 \n+ + csetemp10*csetemp13*rXYZ)*X*pow(csetemp10*csetemp13 + \n+ csetemp15,-2)*pow(4*csetemp10*csetemp13 + pow(-csetemp10 + csetemp11 + \n+ csetemp12 + csetemp13,2),-0.5);\n+ \n+ CCTK_REAL tdg4332 CCTK_ATTRIBUTE_UNUSED = 2*csetemp13*M*(-3*csetemp28 \n+ + csetemp10*csetemp13*rXYZ)*Y*pow(csetemp10*csetemp13 + \n+ csetemp15,-2)*pow(4*csetemp10*csetemp13 + pow(-csetemp10 + csetemp11 + \n+ csetemp12 + csetemp13,2),-0.5);\n+ \n+ CCTK_REAL tdg4333 CCTK_ATTRIBUTE_UNUSED = 2*((2*csetemp10 - \n+ 2*(csetemp11 + csetemp12) - 5*csetemp13)*csetemp23 + 4*csetemp29 + \n+ csetemp24*csetemp32 + csetemp10*(-3*csetemp13*csetemp15 + \n+ csetemp16*csetemp32))*M*Z*pow(csetemp10*csetemp13 + \n+ csetemp15,-2)*pow(rXYZ,-1)*pow(4*csetemp10*csetemp13 + pow(-csetemp10 + \n+ csetemp11 + csetemp12 + csetemp13,2),-0.5);\n+ \n+ CCTK_REAL g400 CCTK_ATTRIBUTE_UNUSED = 2*(tg423*xformL20*xformL30 + \n+ xformL00*(tg401*xformL10 + tg402*xformL20 + tg403*xformL30) + \n+ xformL10*(tg412*xformL20 + tg413*xformL30)) + tg400*pow(xformL00,2) + \n+ tg411*pow(xformL10,2) + tg422*pow(xformL20,2) + tg433*pow(xformL30,2);\n+ \n+ CCTK_REAL csetemp34 CCTK_ATTRIBUTE_UNUSED = tg400*xformL01;\n+ \n+ CCTK_REAL csetemp35 CCTK_ATTRIBUTE_UNUSED = tg401*xformL11;\n+ \n+ CCTK_REAL csetemp36 CCTK_ATTRIBUTE_UNUSED = tg402*xformL21;\n+ \n+ CCTK_REAL csetemp37 CCTK_ATTRIBUTE_UNUSED = tg403*xformL31;\n+ \n+ CCTK_REAL csetemp38 CCTK_ATTRIBUTE_UNUSED = tg401*xformL01;\n+ \n+ CCTK_REAL csetemp39 CCTK_ATTRIBUTE_UNUSED = tg411*xformL11;\n+ \n+ CCTK_REAL csetemp40 CCTK_ATTRIBUTE_UNUSED = tg412*xformL21;\n+ \n+ CCTK_REAL csetemp41 CCTK_ATTRIBUTE_UNUSED = tg413*xformL31;\n+ \n+ CCTK_REAL csetemp42 CCTK_ATTRIBUTE_UNUSED = tg402*xformL01;\n+ \n+ CCTK_REAL csetemp43 CCTK_ATTRIBUTE_UNUSED = tg412*xformL11;\n+ \n+ CCTK_REAL csetemp44 CCTK_ATTRIBUTE_UNUSED = tg422*xformL21;\n+ \n+ CCTK_REAL csetemp45 CCTK_ATTRIBUTE_UNUSED = tg423*xformL31;\n+ \n+ CCTK_REAL csetemp46 CCTK_ATTRIBUTE_UNUSED = tg403*xformL01;\n+ \n+ CCTK_REAL csetemp47 CCTK_ATTRIBUTE_UNUSED = tg413*xformL11;\n+ \n+ CCTK_REAL csetemp48 CCTK_ATTRIBUTE_UNUSED = tg423*xformL21;\n+ \n+ CCTK_REAL csetemp49 CCTK_ATTRIBUTE_UNUSED = tg433*xformL31;\n+ \n+ CCTK_REAL g401 CCTK_ATTRIBUTE_UNUSED = (csetemp34 + csetemp35 + \n+ csetemp36 + csetemp37)*xformL00 + (csetemp38 + csetemp39 + csetemp40 + \n+ csetemp41)*xformL10 + (csetemp42 + csetemp43 + csetemp44 + \n+ csetemp45)*xformL20 + (csetemp46 + csetemp47 + csetemp48 + \n+ csetemp49)*xformL30;\n+ \n+ CCTK_REAL csetemp50 CCTK_ATTRIBUTE_UNUSED = tg400*xformL02;\n+ \n+ CCTK_REAL csetemp51 CCTK_ATTRIBUTE_UNUSED = tg401*xformL12;\n+ \n+ CCTK_REAL csetemp52 CCTK_ATTRIBUTE_UNUSED = tg402*xformL22;\n+ \n+ CCTK_REAL csetemp53 CCTK_ATTRIBUTE_UNUSED = tg403*xformL32;\n+ \n+ CCTK_REAL csetemp54 CCTK_ATTRIBUTE_UNUSED = tg401*xformL02;\n+ \n+ CCTK_REAL csetemp55 CCTK_ATTRIBUTE_UNUSED = tg411*xformL12;\n+ \n+ CCTK_REAL csetemp56 CCTK_ATTRIBUTE_UNUSED = tg412*xformL22;\n+ \n+ CCTK_REAL csetemp57 CCTK_ATTRIBUTE_UNUSED = tg413*xformL32;\n+ \n+ CCTK_REAL csetemp58 CCTK_ATTRIBUTE_UNUSED = tg402*xformL02;\n+ \n+ CCTK_REAL csetemp59 CCTK_ATTRIBUTE_UNUSED = tg412*xformL12;\n+ \n+ CCTK_REAL csetemp60 CCTK_ATTRIBUTE_UNUSED = tg422*xformL22;\n+ \n+ CCTK_REAL csetemp61 CCTK_ATTRIBUTE_UNUSED = tg423*xformL32;\n+ \n+ CCTK_REAL csetemp62 CCTK_ATTRIBUTE_UNUSED = tg403*xformL02;\n+ \n+ CCTK_REAL csetemp63 CCTK_ATTRIBUTE_UNUSED = tg413*xformL12;\n+ \n+ CCTK_REAL csetemp64 CCTK_ATTRIBUTE_UNUSED = tg423*xformL22;\n+ \n+ CCTK_REAL csetemp65 CCTK_ATTRIBUTE_UNUSED = tg433*xformL32;\n+ \n+ CCTK_REAL g402 CCTK_ATTRIBUTE_UNUSED = (csetemp50 + csetemp51 + \n+ csetemp52 + csetemp53)*xformL00 + (csetemp54 + csetemp55 + csetemp56 + \n+ csetemp57)*xformL10 + (csetemp58 + csetemp59 + csetemp60 + \n+ csetemp61)*xformL20 + (csetemp62 + csetemp63 + csetemp64 + \n+ csetemp65)*xformL30;\n+ \n+ CCTK_REAL csetemp66 CCTK_ATTRIBUTE_UNUSED = tg400*xformL03;\n+ \n+ CCTK_REAL csetemp67 CCTK_ATTRIBUTE_UNUSED = tg401*xformL13;\n+ \n+ CCTK_REAL csetemp68 CCTK_ATTRIBUTE_UNUSED = tg402*xformL23;\n+ \n+ CCTK_REAL csetemp69 CCTK_ATTRIBUTE_UNUSED = tg403*xformL33;\n+ \n+ CCTK_REAL csetemp70 CCTK_ATTRIBUTE_UNUSED = tg401*xformL03;\n+ \n+ CCTK_REAL csetemp71 CCTK_ATTRIBUTE_UNUSED = tg411*xformL13;\n+ \n+ CCTK_REAL csetemp72 CCTK_ATTRIBUTE_UNUSED = tg412*xformL23;\n+ \n+ CCTK_REAL csetemp73 CCTK_ATTRIBUTE_UNUSED = tg413*xformL33;\n+ \n+ CCTK_REAL csetemp74 CCTK_ATTRIBUTE_UNUSED = tg402*xformL03;\n+ \n+ CCTK_REAL csetemp75 CCTK_ATTRIBUTE_UNUSED = tg412*xformL13;\n+ \n+ CCTK_REAL csetemp76 CCTK_ATTRIBUTE_UNUSED = tg422*xformL23;\n+ \n+ CCTK_REAL csetemp77 CCTK_ATTRIBUTE_UNUSED = tg423*xformL33;\n+ \n+ CCTK_REAL csetemp78 CCTK_ATTRIBUTE_UNUSED = tg403*xformL03;\n+ \n+ CCTK_REAL csetemp79 CCTK_ATTRIBUTE_UNUSED = tg413*xformL13;\n+ \n+ CCTK_REAL csetemp80 CCTK_ATTRIBUTE_UNUSED = tg423*xformL23;\n+ \n+ CCTK_REAL csetemp81 CCTK_ATTRIBUTE_UNUSED = tg433*xformL33;\n+ \n+ CCTK_REAL g403 CCTK_ATTRIBUTE_UNUSED = (csetemp66 + csetemp67 + \n+ csetemp68 + csetemp69)*xformL00 + (csetemp70 + csetemp71 + csetemp72 + \n+ csetemp73)*xformL10 + (csetemp74 + csetemp75 + csetemp76 + \n+ csetemp77)*xformL20 + (csetemp78 + csetemp79 + csetemp80 + \n+ csetemp81)*xformL30;\n+ \n+ CCTK_REAL g411 CCTK_ATTRIBUTE_UNUSED = (csetemp34 + csetemp35 + \n+ csetemp36 + csetemp37)*xformL01 + (csetemp38 + csetemp39 + csetemp40 + \n+ csetemp41)*xformL11 + (csetemp42 + csetemp43 + csetemp44 + \n+ csetemp45)*xformL21 + (csetemp46 + csetemp47 + csetemp48 + \n+ csetemp49)*xformL31;\n+ \n+ CCTK_REAL g412 CCTK_ATTRIBUTE_UNUSED = (csetemp50 + csetemp51 + \n+ csetemp52 + csetemp53)*xformL01 + (csetemp54 + csetemp55 + csetemp56 + \n+ csetemp57)*xformL11 + (csetemp58 + csetemp59 + csetemp60 + \n+ csetemp61)*xformL21 + (csetemp62 + csetemp63 + csetemp64 + \n+ csetemp65)*xformL31;\n+ \n+ CCTK_REAL g413 CCTK_ATTRIBUTE_UNUSED = (csetemp66 + csetemp67 + \n+ csetemp68 + csetemp69)*xformL01 + (csetemp70 + csetemp71 + csetemp72 + \n+ csetemp73)*xformL11 + (csetemp74 + csetemp75 + csetemp76 + \n+ csetemp77)*xformL21 + (csetemp78 + csetemp79 + csetemp80 + \n+ csetemp81)*xformL31;\n+ \n+ CCTK_REAL g422 CCTK_ATTRIBUTE_UNUSED = (csetemp50 + csetemp51 + \n+ csetemp52 + csetemp53)*xformL02 + (csetemp54 + csetemp55 + csetemp56 + \n+ csetemp57)*xformL12 + (csetemp58 + csetemp59 + csetemp60 + \n+ csetemp61)*xformL22 + (csetemp62 + csetemp63 + csetemp64 + \n+ csetemp65)*xformL32;\n+ \n+ CCTK_REAL g423 CCTK_ATTRIBUTE_UNUSED = (csetemp66 + csetemp67 + \n+ csetemp68 + csetemp69)*xformL02 + (csetemp70 + csetemp71 + csetemp72 + \n+ csetemp73)*xformL12 + (csetemp74 + csetemp75 + csetemp76 + \n+ csetemp77)*xformL22 + (csetemp78 + csetemp79 + csetemp80 + \n+ csetemp81)*xformL32;\n+ \n+ CCTK_REAL g433 CCTK_ATTRIBUTE_UNUSED = (csetemp66 + csetemp67 + \n+ csetemp68 + csetemp69)*xformL03 + (csetemp70 + csetemp71 + csetemp72 + \n+ csetemp73)*xformL13 + (csetemp74 + csetemp75 + csetemp76 + \n+ csetemp77)*xformL23 + (csetemp78 + csetemp79 + csetemp80 + \n+ csetemp81)*xformL33;\n+ \n+ CCTK_REAL csetemp82 CCTK_ATTRIBUTE_UNUSED = tdg4000*xformL00;\n+ \n+ CCTK_REAL csetemp83 CCTK_ATTRIBUTE_UNUSED = tdg4001*xformL10;\n+ \n+ CCTK_REAL csetemp84 CCTK_ATTRIBUTE_UNUSED = tdg4002*xformL20;\n+ \n+ CCTK_REAL csetemp85 CCTK_ATTRIBUTE_UNUSED = tdg4003*xformL30;\n+ \n+ CCTK_REAL csetemp86 CCTK_ATTRIBUTE_UNUSED = tdg4010*xformL00;\n+ \n+ CCTK_REAL csetemp87 CCTK_ATTRIBUTE_UNUSED = tdg4011*xformL10;\n+ \n+ CCTK_REAL csetemp88 CCTK_ATTRIBUTE_UNUSED = tdg4012*xformL20;\n+ \n+ CCTK_REAL csetemp89 CCTK_ATTRIBUTE_UNUSED = tdg4013*xformL30;\n+ \n+ CCTK_REAL csetemp90 CCTK_ATTRIBUTE_UNUSED = tdg4020*xformL00;\n+ \n+ CCTK_REAL csetemp91 CCTK_ATTRIBUTE_UNUSED = tdg4021*xformL10;\n+ \n+ CCTK_REAL csetemp92 CCTK_ATTRIBUTE_UNUSED = tdg4022*xformL20;\n+ \n+ CCTK_REAL csetemp93 CCTK_ATTRIBUTE_UNUSED = tdg4023*xformL30;\n+ \n+ CCTK_REAL csetemp94 CCTK_ATTRIBUTE_UNUSED = tdg4030*xformL00;\n+ \n+ CCTK_REAL csetemp95 CCTK_ATTRIBUTE_UNUSED = tdg4031*xformL10;\n+ \n+ CCTK_REAL csetemp96 CCTK_ATTRIBUTE_UNUSED = tdg4032*xformL20;\n+ \n+ CCTK_REAL csetemp97 CCTK_ATTRIBUTE_UNUSED = tdg4033*xformL30;\n+ \n+ CCTK_REAL csetemp98 CCTK_ATTRIBUTE_UNUSED = tdg4110*xformL00;\n+ \n+ CCTK_REAL csetemp99 CCTK_ATTRIBUTE_UNUSED = tdg4111*xformL10;\n+ \n+ CCTK_REAL csetemp100 CCTK_ATTRIBUTE_UNUSED = tdg4112*xformL20;\n+ \n+ CCTK_REAL csetemp101 CCTK_ATTRIBUTE_UNUSED = tdg4113*xformL30;\n+ \n+ CCTK_REAL csetemp102 CCTK_ATTRIBUTE_UNUSED = tdg4120*xformL00;\n+ \n+ CCTK_REAL csetemp103 CCTK_ATTRIBUTE_UNUSED = tdg4121*xformL10;\n+ \n+ CCTK_REAL csetemp104 CCTK_ATTRIBUTE_UNUSED = tdg4122*xformL20;\n+ \n+ CCTK_REAL csetemp105 CCTK_ATTRIBUTE_UNUSED = tdg4123*xformL30;\n+ \n+ CCTK_REAL csetemp106 CCTK_ATTRIBUTE_UNUSED = tdg4130*xformL00;\n+ \n+ CCTK_REAL csetemp107 CCTK_ATTRIBUTE_UNUSED = tdg4131*xformL10;\n+ \n+ CCTK_REAL csetemp108 CCTK_ATTRIBUTE_UNUSED = tdg4132*xformL20;\n+ \n+ CCTK_REAL csetemp109 CCTK_ATTRIBUTE_UNUSED = tdg4133*xformL30;\n+ \n+ CCTK_REAL csetemp110 CCTK_ATTRIBUTE_UNUSED = tdg4220*xformL00;\n+ \n+ CCTK_REAL csetemp111 CCTK_ATTRIBUTE_UNUSED = tdg4221*xformL10;\n+ \n+ CCTK_REAL csetemp112 CCTK_ATTRIBUTE_UNUSED = tdg4222*xformL20;\n+ \n+ CCTK_REAL csetemp113 CCTK_ATTRIBUTE_UNUSED = tdg4223*xformL30;\n+ \n+ CCTK_REAL csetemp114 CCTK_ATTRIBUTE_UNUSED = tdg4230*xformL00;\n+ \n+ CCTK_REAL csetemp115 CCTK_ATTRIBUTE_UNUSED = tdg4231*xformL10;\n+ \n+ CCTK_REAL csetemp116 CCTK_ATTRIBUTE_UNUSED = tdg4232*xformL20;\n+ \n+ CCTK_REAL csetemp117 CCTK_ATTRIBUTE_UNUSED = tdg4233*xformL30;\n+ \n+ CCTK_REAL csetemp118 CCTK_ATTRIBUTE_UNUSED = tdg4330*xformL00;\n+ \n+ CCTK_REAL csetemp119 CCTK_ATTRIBUTE_UNUSED = tdg4331*xformL10;\n+ \n+ CCTK_REAL csetemp120 CCTK_ATTRIBUTE_UNUSED = tdg4332*xformL20;\n+ \n+ CCTK_REAL csetemp121 CCTK_ATTRIBUTE_UNUSED = tdg4333*xformL30;\n+ \n+ CCTK_REAL dg4000 CCTK_ATTRIBUTE_UNUSED = xformL10*((csetemp86 + \n+ csetemp87 + csetemp88 + csetemp89)*xformL00 + (csetemp100 + csetemp101 \n+ + csetemp98 + csetemp99)*xformL10 + (csetemp102 + csetemp103 + \n+ csetemp104 + csetemp105)*xformL20 + (csetemp106 + csetemp107 + \n+ csetemp108 + csetemp109)*xformL30) + xformL20*((csetemp90 + csetemp91 + \n+ csetemp92 + csetemp93)*xformL00 + (csetemp102 + csetemp103 + csetemp104 \n+ + csetemp105)*xformL10 + (csetemp110 + csetemp111 + csetemp112 + \n+ csetemp113)*xformL20 + (csetemp114 + csetemp115 + csetemp116 + \n+ csetemp117)*xformL30) + xformL30*((csetemp94 + csetemp95 + csetemp96 + \n+ csetemp97)*xformL00 + (csetemp106 + csetemp107 + csetemp108 + \n+ csetemp109)*xformL10 + (csetemp114 + csetemp115 + csetemp116 + \n+ csetemp117)*xformL20 + (csetemp118 + csetemp119 + csetemp120 + \n+ csetemp121)*xformL30) + xformL00*((csetemp82 + csetemp83 + csetemp84 + \n+ csetemp85)*xformL00 + (csetemp86 + csetemp87 + csetemp88 + \n+ csetemp89)*xformL10 + (csetemp90 + csetemp91 + csetemp92 + \n+ csetemp93)*xformL20 + (csetemp94 + csetemp95 + csetemp96 + \n+ csetemp97)*xformL30);\n+ \n+ CCTK_REAL dg4010 CCTK_ATTRIBUTE_UNUSED = xformL10*((csetemp86 + \n+ csetemp87 + csetemp88 + csetemp89)*xformL01 + (csetemp100 + csetemp101 \n+ + csetemp98 + csetemp99)*xformL11 + (csetemp102 + csetemp103 + \n+ csetemp104 + csetemp105)*xformL21 + (csetemp106 + csetemp107 + \n+ csetemp108 + csetemp109)*xformL31) + xformL20*((csetemp90 + csetemp91 + \n+ csetemp92 + csetemp93)*xformL01 + (csetemp102 + csetemp103 + csetemp104 \n+ + csetemp105)*xformL11 + (csetemp110 + csetemp111 + csetemp112 + \n+ csetemp113)*xformL21 + (csetemp114 + csetemp115 + csetemp116 + \n+ csetemp117)*xformL31) + xformL30*((csetemp94 + csetemp95 + csetemp96 + \n+ csetemp97)*xformL01 + (csetemp106 + csetemp107 + csetemp108 + \n+ csetemp109)*xformL11 + (csetemp114 + csetemp115 + csetemp116 + \n+ csetemp117)*xformL21 + (csetemp118 + csetemp119 + csetemp120 + \n+ csetemp121)*xformL31) + xformL00*((csetemp82 + csetemp83 + csetemp84 + \n+ csetemp85)*xformL01 + (csetemp86 + csetemp87 + csetemp88 + \n+ csetemp89)*xformL11 + (csetemp90 + csetemp91 + csetemp92 + \n+ csetemp93)*xformL21 + (csetemp94 + csetemp95 + csetemp96 + \n+ csetemp97)*xformL31);\n+ \n+ CCTK_REAL csetemp122 CCTK_ATTRIBUTE_UNUSED = tdg4000*xformL01;\n+ \n+ CCTK_REAL csetemp123 CCTK_ATTRIBUTE_UNUSED = tdg4001*xformL11;\n+ \n+ CCTK_REAL csetemp124 CCTK_ATTRIBUTE_UNUSED = tdg4002*xformL21;\n+ \n+ CCTK_REAL csetemp125 CCTK_ATTRIBUTE_UNUSED = tdg4003*xformL31;\n+ \n+ CCTK_REAL csetemp126 CCTK_ATTRIBUTE_UNUSED = tdg4010*xformL01;\n+ \n+ CCTK_REAL csetemp127 CCTK_ATTRIBUTE_UNUSED = tdg4011*xformL11;\n+ \n+ CCTK_REAL csetemp128 CCTK_ATTRIBUTE_UNUSED = tdg4012*xformL21;\n+ \n+ CCTK_REAL csetemp129 CCTK_ATTRIBUTE_UNUSED = tdg4013*xformL31;\n+ \n+ CCTK_REAL csetemp130 CCTK_ATTRIBUTE_UNUSED = tdg4020*xformL01;\n+ \n+ CCTK_REAL csetemp131 CCTK_ATTRIBUTE_UNUSED = tdg4021*xformL11;\n+ \n+ CCTK_REAL csetemp132 CCTK_ATTRIBUTE_UNUSED = tdg4022*xformL21;\n+ \n+ CCTK_REAL csetemp133 CCTK_ATTRIBUTE_UNUSED = tdg4023*xformL31;\n+ \n+ CCTK_REAL csetemp134 CCTK_ATTRIBUTE_UNUSED = tdg4030*xformL01;\n+ \n+ CCTK_REAL csetemp135 CCTK_ATTRIBUTE_UNUSED = tdg4031*xformL11;\n+ \n+ CCTK_REAL csetemp136 CCTK_ATTRIBUTE_UNUSED = tdg4032*xformL21;\n+ \n+ CCTK_REAL csetemp137 CCTK_ATTRIBUTE_UNUSED = tdg4033*xformL31;\n+ \n+ CCTK_REAL csetemp138 CCTK_ATTRIBUTE_UNUSED = tdg4110*xformL01;\n+ \n+ CCTK_REAL csetemp139 CCTK_ATTRIBUTE_UNUSED = tdg4111*xformL11;\n+ \n+ CCTK_REAL csetemp140 CCTK_ATTRIBUTE_UNUSED = tdg4112*xformL21;\n+ \n+ CCTK_REAL csetemp141 CCTK_ATTRIBUTE_UNUSED = tdg4113*xformL31;\n+ \n+ CCTK_REAL csetemp142 CCTK_ATTRIBUTE_UNUSED = tdg4120*xformL01;\n+ \n+ CCTK_REAL csetemp143 CCTK_ATTRIBUTE_UNUSED = tdg4121*xformL11;\n+ \n+ CCTK_REAL csetemp144 CCTK_ATTRIBUTE_UNUSED = tdg4122*xformL21;\n+ \n+ CCTK_REAL csetemp145 CCTK_ATTRIBUTE_UNUSED = tdg4123*xformL31;\n+ \n+ CCTK_REAL csetemp146 CCTK_ATTRIBUTE_UNUSED = tdg4130*xformL01;\n+ \n+ CCTK_REAL csetemp147 CCTK_ATTRIBUTE_UNUSED = tdg4131*xformL11;\n+ \n+ CCTK_REAL csetemp148 CCTK_ATTRIBUTE_UNUSED = tdg4132*xformL21;\n+ \n+ CCTK_REAL csetemp149 CCTK_ATTRIBUTE_UNUSED = tdg4133*xformL31;\n+ \n+ CCTK_REAL csetemp150 CCTK_ATTRIBUTE_UNUSED = tdg4220*xformL01;\n+ \n+ CCTK_REAL csetemp151 CCTK_ATTRIBUTE_UNUSED = tdg4221*xformL11;\n+ \n+ CCTK_REAL csetemp152 CCTK_ATTRIBUTE_UNUSED = tdg4222*xformL21;\n+ \n+ CCTK_REAL csetemp153 CCTK_ATTRIBUTE_UNUSED = tdg4223*xformL31;\n+ \n+ CCTK_REAL csetemp154 CCTK_ATTRIBUTE_UNUSED = tdg4230*xformL01;\n+ \n+ CCTK_REAL csetemp155 CCTK_ATTRIBUTE_UNUSED = tdg4231*xformL11;\n+ \n+ CCTK_REAL csetemp156 CCTK_ATTRIBUTE_UNUSED = tdg4232*xformL21;\n+ \n+ CCTK_REAL csetemp157 CCTK_ATTRIBUTE_UNUSED = tdg4233*xformL31;\n+ \n+ CCTK_REAL csetemp158 CCTK_ATTRIBUTE_UNUSED = tdg4330*xformL01;\n+ \n+ CCTK_REAL csetemp159 CCTK_ATTRIBUTE_UNUSED = tdg4331*xformL11;\n+ \n+ CCTK_REAL csetemp160 CCTK_ATTRIBUTE_UNUSED = tdg4332*xformL21;\n+ \n+ CCTK_REAL csetemp161 CCTK_ATTRIBUTE_UNUSED = tdg4333*xformL31;\n+ \n+ CCTK_REAL dg4011 CCTK_ATTRIBUTE_UNUSED = xformL00*((csetemp122 + \n+ csetemp123 + csetemp124 + csetemp125)*xformL01 + (csetemp126 + \n+ csetemp127 + csetemp128 + csetemp129)*xformL11 + (csetemp130 + \n+ csetemp131 + csetemp132 + csetemp133)*xformL21 + (csetemp134 + \n+ csetemp135 + csetemp136 + csetemp137)*xformL31) + xformL10*((csetemp126 \n+ + csetemp127 + csetemp128 + csetemp129)*xformL01 + (csetemp138 + \n+ csetemp139 + csetemp140 + csetemp141)*xformL11 + (csetemp142 + \n+ csetemp143 + csetemp144 + csetemp145)*xformL21 + (csetemp146 + \n+ csetemp147 + csetemp148 + csetemp149)*xformL31) + xformL20*((csetemp130 \n+ + csetemp131 + csetemp132 + csetemp133)*xformL01 + (csetemp142 + \n+ csetemp143 + csetemp144 + csetemp145)*xformL11 + (csetemp150 + \n+ csetemp151 + csetemp152 + csetemp153)*xformL21 + (csetemp154 + \n+ csetemp155 + csetemp156 + csetemp157)*xformL31) + xformL30*((csetemp134 \n+ + csetemp135 + csetemp136 + csetemp137)*xformL01 + (csetemp146 + \n+ csetemp147 + csetemp148 + csetemp149)*xformL11 + (csetemp154 + \n+ csetemp155 + csetemp156 + csetemp157)*xformL21 + (csetemp158 + \n+ csetemp159 + csetemp160 + csetemp161)*xformL31);\n+ \n+ CCTK_REAL csetemp162 CCTK_ATTRIBUTE_UNUSED = tdg4000*xformL02;\n+ \n+ CCTK_REAL csetemp163 CCTK_ATTRIBUTE_UNUSED = tdg4001*xformL12;\n+ \n+ CCTK_REAL csetemp164 CCTK_ATTRIBUTE_UNUSED = tdg4002*xformL22;\n+ \n+ CCTK_REAL csetemp165 CCTK_ATTRIBUTE_UNUSED = tdg4003*xformL32;\n+ \n+ CCTK_REAL csetemp166 CCTK_ATTRIBUTE_UNUSED = tdg4010*xformL02;\n+ \n+ CCTK_REAL csetemp167 CCTK_ATTRIBUTE_UNUSED = tdg4011*xformL12;\n+ \n+ CCTK_REAL csetemp168 CCTK_ATTRIBUTE_UNUSED = tdg4012*xformL22;\n+ \n+ CCTK_REAL csetemp169 CCTK_ATTRIBUTE_UNUSED = tdg4013*xformL32;\n+ \n+ CCTK_REAL csetemp170 CCTK_ATTRIBUTE_UNUSED = tdg4020*xformL02;\n+ \n+ CCTK_REAL csetemp171 CCTK_ATTRIBUTE_UNUSED = tdg4021*xformL12;\n+ \n+ CCTK_REAL csetemp172 CCTK_ATTRIBUTE_UNUSED = tdg4022*xformL22;\n+ \n+ CCTK_REAL csetemp173 CCTK_ATTRIBUTE_UNUSED = tdg4023*xformL32;\n+ \n+ CCTK_REAL csetemp174 CCTK_ATTRIBUTE_UNUSED = tdg4030*xformL02;\n+ \n+ CCTK_REAL csetemp175 CCTK_ATTRIBUTE_UNUSED = tdg4031*xformL12;\n+ \n+ CCTK_REAL csetemp176 CCTK_ATTRIBUTE_UNUSED = tdg4032*xformL22;\n+ \n+ CCTK_REAL csetemp177 CCTK_ATTRIBUTE_UNUSED = tdg4033*xformL32;\n+ \n+ CCTK_REAL csetemp178 CCTK_ATTRIBUTE_UNUSED = tdg4110*xformL02;\n+ \n+ CCTK_REAL csetemp179 CCTK_ATTRIBUTE_UNUSED = tdg4111*xformL12;\n+ \n+ CCTK_REAL csetemp180 CCTK_ATTRIBUTE_UNUSED = tdg4112*xformL22;\n+ \n+ CCTK_REAL csetemp181 CCTK_ATTRIBUTE_UNUSED = tdg4113*xformL32;\n+ \n+ CCTK_REAL csetemp182 CCTK_ATTRIBUTE_UNUSED = tdg4120*xformL02;\n+ \n+ CCTK_REAL csetemp183 CCTK_ATTRIBUTE_UNUSED = tdg4121*xformL12;\n+ \n+ CCTK_REAL csetemp184 CCTK_ATTRIBUTE_UNUSED = tdg4122*xformL22;\n+ \n+ CCTK_REAL csetemp185 CCTK_ATTRIBUTE_UNUSED = tdg4123*xformL32;\n+ \n+ CCTK_REAL csetemp186 CCTK_ATTRIBUTE_UNUSED = tdg4130*xformL02;\n+ \n+ CCTK_REAL csetemp187 CCTK_ATTRIBUTE_UNUSED = tdg4131*xformL12;\n+ \n+ CCTK_REAL csetemp188 CCTK_ATTRIBUTE_UNUSED = tdg4132*xformL22;\n+ \n+ CCTK_REAL csetemp189 CCTK_ATTRIBUTE_UNUSED = tdg4133*xformL32;\n+ \n+ CCTK_REAL csetemp190 CCTK_ATTRIBUTE_UNUSED = tdg4220*xformL02;\n+ \n+ CCTK_REAL csetemp191 CCTK_ATTRIBUTE_UNUSED = tdg4221*xformL12;\n+ \n+ CCTK_REAL csetemp192 CCTK_ATTRIBUTE_UNUSED = tdg4222*xformL22;\n+ \n+ CCTK_REAL csetemp193 CCTK_ATTRIBUTE_UNUSED = tdg4223*xformL32;\n+ \n+ CCTK_REAL csetemp194 CCTK_ATTRIBUTE_UNUSED = tdg4230*xformL02;\n+ \n+ CCTK_REAL csetemp195 CCTK_ATTRIBUTE_UNUSED = tdg4231*xformL12;\n+ \n+ CCTK_REAL csetemp196 CCTK_ATTRIBUTE_UNUSED = tdg4232*xformL22;\n+ \n+ CCTK_REAL csetemp197 CCTK_ATTRIBUTE_UNUSED = tdg4233*xformL32;\n+ \n+ CCTK_REAL csetemp198 CCTK_ATTRIBUTE_UNUSED = tdg4330*xformL02;\n+ \n+ CCTK_REAL csetemp199 CCTK_ATTRIBUTE_UNUSED = tdg4331*xformL12;\n+ \n+ CCTK_REAL csetemp200 CCTK_ATTRIBUTE_UNUSED = tdg4332*xformL22;\n+ \n+ CCTK_REAL csetemp201 CCTK_ATTRIBUTE_UNUSED = tdg4333*xformL32;\n+ \n+ CCTK_REAL dg4012 CCTK_ATTRIBUTE_UNUSED = xformL00*((csetemp162 + \n+ csetemp163 + csetemp164 + csetemp165)*xformL01 + (csetemp166 + \n+ csetemp167 + csetemp168 + csetemp169)*xformL11 + (csetemp170 + \n+ csetemp171 + csetemp172 + csetemp173)*xformL21 + (csetemp174 + \n+ csetemp175 + csetemp176 + csetemp177)*xformL31) + xformL10*((csetemp166 \n+ + csetemp167 + csetemp168 + csetemp169)*xformL01 + (csetemp178 + \n+ csetemp179 + csetemp180 + csetemp181)*xformL11 + (csetemp182 + \n+ csetemp183 + csetemp184 + csetemp185)*xformL21 + (csetemp186 + \n+ csetemp187 + csetemp188 + csetemp189)*xformL31) + xformL20*((csetemp170 \n+ + csetemp171 + csetemp172 + csetemp173)*xformL01 + (csetemp182 + \n+ csetemp183 + csetemp184 + csetemp185)*xformL11 + (csetemp190 + \n+ csetemp191 + csetemp192 + csetemp193)*xformL21 + (csetemp194 + \n+ csetemp195 + csetemp196 + csetemp197)*xformL31) + xformL30*((csetemp174 \n+ + csetemp175 + csetemp176 + csetemp177)*xformL01 + (csetemp186 + \n+ csetemp187 + csetemp188 + csetemp189)*xformL11 + (csetemp194 + \n+ csetemp195 + csetemp196 + csetemp197)*xformL21 + (csetemp198 + \n+ csetemp199 + csetemp200 + csetemp201)*xformL31);\n+ \n+ CCTK_REAL csetemp202 CCTK_ATTRIBUTE_UNUSED = tdg4000*xformL03;\n+ \n+ CCTK_REAL csetemp203 CCTK_ATTRIBUTE_UNUSED = tdg4001*xformL13;\n+ \n+ CCTK_REAL csetemp204 CCTK_ATTRIBUTE_UNUSED = tdg4002*xformL23;\n+ \n+ CCTK_REAL csetemp205 CCTK_ATTRIBUTE_UNUSED = tdg4003*xformL33;\n+ \n+ CCTK_REAL csetemp206 CCTK_ATTRIBUTE_UNUSED = tdg4010*xformL03;\n+ \n+ CCTK_REAL csetemp207 CCTK_ATTRIBUTE_UNUSED = tdg4011*xformL13;\n+ \n+ CCTK_REAL csetemp208 CCTK_ATTRIBUTE_UNUSED = tdg4012*xformL23;\n+ \n+ CCTK_REAL csetemp209 CCTK_ATTRIBUTE_UNUSED = tdg4013*xformL33;\n+ \n+ CCTK_REAL csetemp210 CCTK_ATTRIBUTE_UNUSED = tdg4020*xformL03;\n+ \n+ CCTK_REAL csetemp211 CCTK_ATTRIBUTE_UNUSED = tdg4021*xformL13;\n+ \n+ CCTK_REAL csetemp212 CCTK_ATTRIBUTE_UNUSED = tdg4022*xformL23;\n+ \n+ CCTK_REAL csetemp213 CCTK_ATTRIBUTE_UNUSED = tdg4023*xformL33;\n+ \n+ CCTK_REAL csetemp214 CCTK_ATTRIBUTE_UNUSED = tdg4030*xformL03;\n+ \n+ CCTK_REAL csetemp215 CCTK_ATTRIBUTE_UNUSED = tdg4031*xformL13;\n+ \n+ CCTK_REAL csetemp216 CCTK_ATTRIBUTE_UNUSED = tdg4032*xformL23;\n+ \n+ CCTK_REAL csetemp217 CCTK_ATTRIBUTE_UNUSED = tdg4033*xformL33;\n+ \n+ CCTK_REAL csetemp218 CCTK_ATTRIBUTE_UNUSED = tdg4110*xformL03;\n+ \n+ CCTK_REAL csetemp219 CCTK_ATTRIBUTE_UNUSED = tdg4111*xformL13;\n+ \n+ CCTK_REAL csetemp220 CCTK_ATTRIBUTE_UNUSED = tdg4112*xformL23;\n+ \n+ CCTK_REAL csetemp221 CCTK_ATTRIBUTE_UNUSED = tdg4113*xformL33;\n+ \n+ CCTK_REAL csetemp222 CCTK_ATTRIBUTE_UNUSED = tdg4120*xformL03;\n+ \n+ CCTK_REAL csetemp223 CCTK_ATTRIBUTE_UNUSED = tdg4121*xformL13;\n+ \n+ CCTK_REAL csetemp224 CCTK_ATTRIBUTE_UNUSED = tdg4122*xformL23;\n+ \n+ CCTK_REAL csetemp225 CCTK_ATTRIBUTE_UNUSED = tdg4123*xformL33;\n+ \n+ CCTK_REAL csetemp226 CCTK_ATTRIBUTE_UNUSED = tdg4130*xformL03;\n+ \n+ CCTK_REAL csetemp227 CCTK_ATTRIBUTE_UNUSED = tdg4131*xformL13;\n+ \n+ CCTK_REAL csetemp228 CCTK_ATTRIBUTE_UNUSED = tdg4132*xformL23;\n+ \n+ CCTK_REAL csetemp229 CCTK_ATTRIBUTE_UNUSED = tdg4133*xformL33;\n+ \n+ CCTK_REAL csetemp230 CCTK_ATTRIBUTE_UNUSED = tdg4220*xformL03;\n+ \n+ CCTK_REAL csetemp231 CCTK_ATTRIBUTE_UNUSED = tdg4221*xformL13;\n+ \n+ CCTK_REAL csetemp232 CCTK_ATTRIBUTE_UNUSED = tdg4222*xformL23;\n+ \n+ CCTK_REAL csetemp233 CCTK_ATTRIBUTE_UNUSED = tdg4223*xformL33;\n+ \n+ CCTK_REAL csetemp234 CCTK_ATTRIBUTE_UNUSED = tdg4230*xformL03;\n+ \n+ CCTK_REAL csetemp235 CCTK_ATTRIBUTE_UNUSED = tdg4231*xformL13;\n+ \n+ CCTK_REAL csetemp236 CCTK_ATTRIBUTE_UNUSED = tdg4232*xformL23;\n+ \n+ CCTK_REAL csetemp237 CCTK_ATTRIBUTE_UNUSED = tdg4233*xformL33;\n+ \n+ CCTK_REAL csetemp238 CCTK_ATTRIBUTE_UNUSED = tdg4330*xformL03;\n+ \n+ CCTK_REAL csetemp239 CCTK_ATTRIBUTE_UNUSED = tdg4331*xformL13;\n+ \n+ CCTK_REAL csetemp240 CCTK_ATTRIBUTE_UNUSED = tdg4332*xformL23;\n+ \n+ CCTK_REAL csetemp241 CCTK_ATTRIBUTE_UNUSED = tdg4333*xformL33;\n+ \n+ CCTK_REAL dg4013 CCTK_ATTRIBUTE_UNUSED = xformL00*((csetemp202 + \n+ csetemp203 + csetemp204 + csetemp205)*xformL01 + (csetemp206 + \n+ csetemp207 + csetemp208 + csetemp209)*xformL11 + (csetemp210 + \n+ csetemp211 + csetemp212 + csetemp213)*xformL21 + (csetemp214 + \n+ csetemp215 + csetemp216 + csetemp217)*xformL31) + xformL10*((csetemp206 \n+ + csetemp207 + csetemp208 + csetemp209)*xformL01 + (csetemp218 + \n+ csetemp219 + csetemp220 + csetemp221)*xformL11 + (csetemp222 + \n+ csetemp223 + csetemp224 + csetemp225)*xformL21 + (csetemp226 + \n+ csetemp227 + csetemp228 + csetemp229)*xformL31) + xformL20*((csetemp210 \n+ + csetemp211 + csetemp212 + csetemp213)*xformL01 + (csetemp222 + \n+ csetemp223 + csetemp224 + csetemp225)*xformL11 + (csetemp230 + \n+ csetemp231 + csetemp232 + csetemp233)*xformL21 + (csetemp234 + \n+ csetemp235 + csetemp236 + csetemp237)*xformL31) + xformL30*((csetemp214 \n+ + csetemp215 + csetemp216 + csetemp217)*xformL01 + (csetemp226 + \n+ csetemp227 + csetemp228 + csetemp229)*xformL11 + (csetemp234 + \n+ csetemp235 + csetemp236 + csetemp237)*xformL21 + (csetemp238 + \n+ csetemp239 + csetemp240 + csetemp241)*xformL31);\n+ \n+ CCTK_REAL dg4020 CCTK_ATTRIBUTE_UNUSED = xformL10*((csetemp86 + \n+ csetemp87 + csetemp88 + csetemp89)*xformL02 + (csetemp100 + csetemp101 \n+ + csetemp98 + csetemp99)*xformL12 + (csetemp102 + csetemp103 + \n+ csetemp104 + csetemp105)*xformL22 + (csetemp106 + csetemp107 + \n+ csetemp108 + csetemp109)*xformL32) + xformL20*((csetemp90 + csetemp91 + \n+ csetemp92 + csetemp93)*xformL02 + (csetemp102 + csetemp103 + csetemp104 \n+ + csetemp105)*xformL12 + (csetemp110 + csetemp111 + csetemp112 + \n+ csetemp113)*xformL22 + (csetemp114 + csetemp115 + csetemp116 + \n+ csetemp117)*xformL32) + xformL30*((csetemp94 + csetemp95 + csetemp96 + \n+ csetemp97)*xformL02 + (csetemp106 + csetemp107 + csetemp108 + \n+ csetemp109)*xformL12 + (csetemp114 + csetemp115 + csetemp116 + \n+ csetemp117)*xformL22 + (csetemp118 + csetemp119 + csetemp120 + \n+ csetemp121)*xformL32) + xformL00*((csetemp82 + csetemp83 + csetemp84 + \n+ csetemp85)*xformL02 + (csetemp86 + csetemp87 + csetemp88 + \n+ csetemp89)*xformL12 + (csetemp90 + csetemp91 + csetemp92 + \n+ csetemp93)*xformL22 + (csetemp94 + csetemp95 + csetemp96 + \n+ csetemp97)*xformL32);\n+ \n+ CCTK_REAL dg4021 CCTK_ATTRIBUTE_UNUSED = xformL00*((csetemp122 + \n+ csetemp123 + csetemp124 + csetemp125)*xformL02 + (csetemp126 + \n+ csetemp127 + csetemp128 + csetemp129)*xformL12 + (csetemp130 + \n+ csetemp131 + csetemp132 + csetemp133)*xformL22 + (csetemp134 + \n+ csetemp135 + csetemp136 + csetemp137)*xformL32) + xformL10*((csetemp126 \n+ + csetemp127 + csetemp128 + csetemp129)*xformL02 + (csetemp138 + \n+ csetemp139 + csetemp140 + csetemp141)*xformL12 + (csetemp142 + \n+ csetemp143 + csetemp144 + csetemp145)*xformL22 + (csetemp146 + \n+ csetemp147 + csetemp148 + csetemp149)*xformL32) + xformL20*((csetemp130 \n+ + csetemp131 + csetemp132 + csetemp133)*xformL02 + (csetemp142 + \n+ csetemp143 + csetemp144 + csetemp145)*xformL12 + (csetemp150 + \n+ csetemp151 + csetemp152 + csetemp153)*xformL22 + (csetemp154 + \n+ csetemp155 + csetemp156 + csetemp157)*xformL32) + xformL30*((csetemp134 \n+ + csetemp135 + csetemp136 + csetemp137)*xformL02 + (csetemp146 + \n+ csetemp147 + csetemp148 + csetemp149)*xformL12 + (csetemp154 + \n+ csetemp155 + csetemp156 + csetemp157)*xformL22 + (csetemp158 + \n+ csetemp159 + csetemp160 + csetemp161)*xformL32);\n+ \n+ CCTK_REAL dg4022 CCTK_ATTRIBUTE_UNUSED = xformL00*((csetemp162 + \n+ csetemp163 + csetemp164 + csetemp165)*xformL02 + (csetemp166 + \n+ csetemp167 + csetemp168 + csetemp169)*xformL12 + (csetemp170 + \n+ csetemp171 + csetemp172 + csetemp173)*xformL22 + (csetemp174 + \n+ csetemp175 + csetemp176 + csetemp177)*xformL32) + xformL10*((csetemp166 \n+ + csetemp167 + csetemp168 + csetemp169)*xformL02 + (csetemp178 + \n+ csetemp179 + csetemp180 + csetemp181)*xformL12 + (csetemp182 + \n+ csetemp183 + csetemp184 + csetemp185)*xformL22 + (csetemp186 + \n+ csetemp187 + csetemp188 + csetemp189)*xformL32) + xformL20*((csetemp170 \n+ + csetemp171 + csetemp172 + csetemp173)*xformL02 + (csetemp182 + \n+ csetemp183 + csetemp184 + csetemp185)*xformL12 + (csetemp190 + \n+ csetemp191 + csetemp192 + csetemp193)*xformL22 + (csetemp194 + \n+ csetemp195 + csetemp196 + csetemp197)*xformL32) + xformL30*((csetemp174 \n+ + csetemp175 + csetemp176 + csetemp177)*xformL02 + (csetemp186 + \n+ csetemp187 + csetemp188 + csetemp189)*xformL12 + (csetemp194 + \n+ csetemp195 + csetemp196 + csetemp197)*xformL22 + (csetemp198 + \n+ csetemp199 + csetemp200 + csetemp201)*xformL32);\n+ \n+ CCTK_REAL dg4023 CCTK_ATTRIBUTE_UNUSED = xformL00*((csetemp202 + \n+ csetemp203 + csetemp204 + csetemp205)*xformL02 + (csetemp206 + \n+ csetemp207 + csetemp208 + csetemp209)*xformL12 + (csetemp210 + \n+ csetemp211 + csetemp212 + csetemp213)*xformL22 + (csetemp214 + \n+ csetemp215 + csetemp216 + csetemp217)*xformL32) + xformL10*((csetemp206 \n+ + csetemp207 + csetemp208 + csetemp209)*xformL02 + (csetemp218 + \n+ csetemp219 + csetemp220 + csetemp221)*xformL12 + (csetemp222 + \n+ csetemp223 + csetemp224 + csetemp225)*xformL22 + (csetemp226 + \n+ csetemp227 + csetemp228 + csetemp229)*xformL32) + xformL20*((csetemp210 \n+ + csetemp211 + csetemp212 + csetemp213)*xformL02 + (csetemp222 + \n+ csetemp223 + csetemp224 + csetemp225)*xformL12 + (csetemp230 + \n+ csetemp231 + csetemp232 + csetemp233)*xformL22 + (csetemp234 + \n+ csetemp235 + csetemp236 + csetemp237)*xformL32) + xformL30*((csetemp214 \n+ + csetemp215 + csetemp216 + csetemp217)*xformL02 + (csetemp226 + \n+ csetemp227 + csetemp228 + csetemp229)*xformL12 + (csetemp234 + \n+ csetemp235 + csetemp236 + csetemp237)*xformL22 + (csetemp238 + \n+ csetemp239 + csetemp240 + csetemp241)*xformL32);\n+ \n+ CCTK_REAL dg4030 CCTK_ATTRIBUTE_UNUSED = xformL10*((csetemp86 + \n+ csetemp87 + csetemp88 + csetemp89)*xformL03 + (csetemp100 + csetemp101 \n+ + csetemp98 + csetemp99)*xformL13 + (csetemp102 + csetemp103 + \n+ csetemp104 + csetemp105)*xformL23 + (csetemp106 + csetemp107 + \n+ csetemp108 + csetemp109)*xformL33) + xformL20*((csetemp90 + csetemp91 + \n+ csetemp92 + csetemp93)*xformL03 + (csetemp102 + csetemp103 + csetemp104 \n+ + csetemp105)*xformL13 + (csetemp110 + csetemp111 + csetemp112 + \n+ csetemp113)*xformL23 + (csetemp114 + csetemp115 + csetemp116 + \n+ csetemp117)*xformL33) + xformL30*((csetemp94 + csetemp95 + csetemp96 + \n+ csetemp97)*xformL03 + (csetemp106 + csetemp107 + csetemp108 + \n+ csetemp109)*xformL13 + (csetemp114 + csetemp115 + csetemp116 + \n+ csetemp117)*xformL23 + (csetemp118 + csetemp119 + csetemp120 + \n+ csetemp121)*xformL33) + xformL00*((csetemp82 + csetemp83 + csetemp84 + \n+ csetemp85)*xformL03 + (csetemp86 + csetemp87 + csetemp88 + \n+ csetemp89)*xformL13 + (csetemp90 + csetemp91 + csetemp92 + \n+ csetemp93)*xformL23 + (csetemp94 + csetemp95 + csetemp96 + \n+ csetemp97)*xformL33);\n+ \n+ CCTK_REAL dg4031 CCTK_ATTRIBUTE_UNUSED = xformL00*((csetemp122 + \n+ csetemp123 + csetemp124 + csetemp125)*xformL03 + (csetemp126 + \n+ csetemp127 + csetemp128 + csetemp129)*xformL13 + (csetemp130 + \n+ csetemp131 + csetemp132 + csetemp133)*xformL23 + (csetemp134 + \n+ csetemp135 + csetemp136 + csetemp137)*xformL33) + xformL10*((csetemp126 \n+ + csetemp127 + csetemp128 + csetemp129)*xformL03 + (csetemp138 + \n+ csetemp139 + csetemp140 + csetemp141)*xformL13 + (csetemp142 + \n+ csetemp143 + csetemp144 + csetemp145)*xformL23 + (csetemp146 + \n+ csetemp147 + csetemp148 + csetemp149)*xformL33) + xformL20*((csetemp130 \n+ + csetemp131 + csetemp132 + csetemp133)*xformL03 + (csetemp142 + \n+ csetemp143 + csetemp144 + csetemp145)*xformL13 + (csetemp150 + \n+ csetemp151 + csetemp152 + csetemp153)*xformL23 + (csetemp154 + \n+ csetemp155 + csetemp156 + csetemp157)*xformL33) + xformL30*((csetemp134 \n+ + csetemp135 + csetemp136 + csetemp137)*xformL03 + (csetemp146 + \n+ csetemp147 + csetemp148 + csetemp149)*xformL13 + (csetemp154 + \n+ csetemp155 + csetemp156 + csetemp157)*xformL23 + (csetemp158 + \n+ csetemp159 + csetemp160 + csetemp161)*xformL33);\n+ \n+ CCTK_REAL dg4032 CCTK_ATTRIBUTE_UNUSED = xformL00*((csetemp162 + \n+ csetemp163 + csetemp164 + csetemp165)*xformL03 + (csetemp166 + \n+ csetemp167 + csetemp168 + csetemp169)*xformL13 + (csetemp170 + \n+ csetemp171 + csetemp172 + csetemp173)*xformL23 + (csetemp174 + \n+ csetemp175 + csetemp176 + csetemp177)*xformL33) + xformL10*((csetemp166 \n+ + csetemp167 + csetemp168 + csetemp169)*xformL03 + (csetemp178 + \n+ csetemp179 + csetemp180 + csetemp181)*xformL13 + (csetemp182 + \n+ csetemp183 + csetemp184 + csetemp185)*xformL23 + (csetemp186 + \n+ csetemp187 + csetemp188 + csetemp189)*xformL33) + xformL20*((csetemp170 \n+ + csetemp171 + csetemp172 + csetemp173)*xformL03 + (csetemp182 + \n+ csetemp183 + csetemp184 + csetemp185)*xformL13 + (csetemp190 + \n+ csetemp191 + csetemp192 + csetemp193)*xformL23 + (csetemp194 + \n+ csetemp195 + csetemp196 + csetemp197)*xformL33) + xformL30*((csetemp174 \n+ + csetemp175 + csetemp176 + csetemp177)*xformL03 + (csetemp186 + \n+ csetemp187 + csetemp188 + csetemp189)*xformL13 + (csetemp194 + \n+ csetemp195 + csetemp196 + csetemp197)*xformL23 + (csetemp198 + \n+ csetemp199 + csetemp200 + csetemp201)*xformL33);\n+ \n+ CCTK_REAL dg4033 CCTK_ATTRIBUTE_UNUSED = xformL00*((csetemp202 + \n+ csetemp203 + csetemp204 + csetemp205)*xformL03 + (csetemp206 + \n+ csetemp207 + csetemp208 + csetemp209)*xformL13 + (csetemp210 + \n+ csetemp211 + csetemp212 + csetemp213)*xformL23 + (csetemp214 + \n+ csetemp215 + csetemp216 + csetemp217)*xformL33) + xformL10*((csetemp206 \n+ + csetemp207 + csetemp208 + csetemp209)*xformL03 + (csetemp218 + \n+ csetemp219 + csetemp220 + csetemp221)*xformL13 + (csetemp222 + \n+ csetemp223 + csetemp224 + csetemp225)*xformL23 + (csetemp226 + \n+ csetemp227 + csetemp228 + csetemp229)*xformL33) + xformL20*((csetemp210 \n+ + csetemp211 + csetemp212 + csetemp213)*xformL03 + (csetemp222 + \n+ csetemp223 + csetemp224 + csetemp225)*xformL13 + (csetemp230 + \n+ csetemp231 + csetemp232 + csetemp233)*xformL23 + (csetemp234 + \n+ csetemp235 + csetemp236 + csetemp237)*xformL33) + xformL30*((csetemp214 \n+ + csetemp215 + csetemp216 + csetemp217)*xformL03 + (csetemp226 + \n+ csetemp227 + csetemp228 + csetemp229)*xformL13 + (csetemp234 + \n+ csetemp235 + csetemp236 + csetemp237)*xformL23 + (csetemp238 + \n+ csetemp239 + csetemp240 + csetemp241)*xformL33);\n+ \n+ CCTK_REAL dg4110 CCTK_ATTRIBUTE_UNUSED = xformL11*((csetemp86 + \n+ csetemp87 + csetemp88 + csetemp89)*xformL01 + (csetemp100 + csetemp101 \n+ + csetemp98 + csetemp99)*xformL11 + (csetemp102 + csetemp103 + \n+ csetemp104 + csetemp105)*xformL21 + (csetemp106 + csetemp107 + \n+ csetemp108 + csetemp109)*xformL31) + xformL21*((csetemp90 + csetemp91 + \n+ csetemp92 + csetemp93)*xformL01 + (csetemp102 + csetemp103 + csetemp104 \n+ + csetemp105)*xformL11 + (csetemp110 + csetemp111 + csetemp112 + \n+ csetemp113)*xformL21 + (csetemp114 + csetemp115 + csetemp116 + \n+ csetemp117)*xformL31) + xformL31*((csetemp94 + csetemp95 + csetemp96 + \n+ csetemp97)*xformL01 + (csetemp106 + csetemp107 + csetemp108 + \n+ csetemp109)*xformL11 + (csetemp114 + csetemp115 + csetemp116 + \n+ csetemp117)*xformL21 + (csetemp118 + csetemp119 + csetemp120 + \n+ csetemp121)*xformL31) + xformL01*((csetemp82 + csetemp83 + csetemp84 + \n+ csetemp85)*xformL01 + (csetemp86 + csetemp87 + csetemp88 + \n+ csetemp89)*xformL11 + (csetemp90 + csetemp91 + csetemp92 + \n+ csetemp93)*xformL21 + (csetemp94 + csetemp95 + csetemp96 + \n+ csetemp97)*xformL31);\n+ \n+ CCTK_REAL dg4111 CCTK_ATTRIBUTE_UNUSED = xformL01*((csetemp122 + \n+ csetemp123 + csetemp124 + csetemp125)*xformL01 + (csetemp126 + \n+ csetemp127 + csetemp128 + csetemp129)*xformL11 + (csetemp130 + \n+ csetemp131 + csetemp132 + csetemp133)*xformL21 + (csetemp134 + \n+ csetemp135 + csetemp136 + csetemp137)*xformL31) + xformL11*((csetemp126 \n+ + csetemp127 + csetemp128 + csetemp129)*xformL01 + (csetemp138 + \n+ csetemp139 + csetemp140 + csetemp141)*xformL11 + (csetemp142 + \n+ csetemp143 + csetemp144 + csetemp145)*xformL21 + (csetemp146 + \n+ csetemp147 + csetemp148 + csetemp149)*xformL31) + xformL21*((csetemp130 \n+ + csetemp131 + csetemp132 + csetemp133)*xformL01 + (csetemp142 + \n+ csetemp143 + csetemp144 + csetemp145)*xformL11 + (csetemp150 + \n+ csetemp151 + csetemp152 + csetemp153)*xformL21 + (csetemp154 + \n+ csetemp155 + csetemp156 + csetemp157)*xformL31) + xformL31*((csetemp134 \n+ + csetemp135 + csetemp136 + csetemp137)*xformL01 + (csetemp146 + \n+ csetemp147 + csetemp148 + csetemp149)*xformL11 + (csetemp154 + \n+ csetemp155 + csetemp156 + csetemp157)*xformL21 + (csetemp158 + \n+ csetemp159 + csetemp160 + csetemp161)*xformL31);\n+ \n+ CCTK_REAL dg4112 CCTK_ATTRIBUTE_UNUSED = xformL01*((csetemp162 + \n+ csetemp163 + csetemp164 + csetemp165)*xformL01 + (csetemp166 + \n+ csetemp167 + csetemp168 + csetemp169)*xformL11 + (csetemp170 + \n+ csetemp171 + csetemp172 + csetemp173)*xformL21 + (csetemp174 + \n+ csetemp175 + csetemp176 + csetemp177)*xformL31) + xformL11*((csetemp166 \n+ + csetemp167 + csetemp168 + csetemp169)*xformL01 + (csetemp178 + \n+ csetemp179 + csetemp180 + csetemp181)*xformL11 + (csetemp182 + \n+ csetemp183 + csetemp184 + csetemp185)*xformL21 + (csetemp186 + \n+ csetemp187 + csetemp188 + csetemp189)*xformL31) + xformL21*((csetemp170 \n+ + csetemp171 + csetemp172 + csetemp173)*xformL01 + (csetemp182 + \n+ csetemp183 + csetemp184 + csetemp185)*xformL11 + (csetemp190 + \n+ csetemp191 + csetemp192 + csetemp193)*xformL21 + (csetemp194 + \n+ csetemp195 + csetemp196 + csetemp197)*xformL31) + xformL31*((csetemp174 \n+ + csetemp175 + csetemp176 + csetemp177)*xformL01 + (csetemp186 + \n+ csetemp187 + csetemp188 + csetemp189)*xformL11 + (csetemp194 + \n+ csetemp195 + csetemp196 + csetemp197)*xformL21 + (csetemp198 + \n+ csetemp199 + csetemp200 + csetemp201)*xformL31);\n+ \n+ CCTK_REAL dg4113 CCTK_ATTRIBUTE_UNUSED = xformL01*((csetemp202 + \n+ csetemp203 + csetemp204 + csetemp205)*xformL01 + (csetemp206 + \n+ csetemp207 + csetemp208 + csetemp209)*xformL11 + (csetemp210 + \n+ csetemp211 + csetemp212 + csetemp213)*xformL21 + (csetemp214 + \n+ csetemp215 + csetemp216 + csetemp217)*xformL31) + xformL11*((csetemp206 \n+ + csetemp207 + csetemp208 + csetemp209)*xformL01 + (csetemp218 + \n+ csetemp219 + csetemp220 + csetemp221)*xformL11 + (csetemp222 + \n+ csetemp223 + csetemp224 + csetemp225)*xformL21 + (csetemp226 + \n+ csetemp227 + csetemp228 + csetemp229)*xformL31) + xformL21*((csetemp210 \n+ + csetemp211 + csetemp212 + csetemp213)*xformL01 + (csetemp222 + \n+ csetemp223 + csetemp224 + csetemp225)*xformL11 + (csetemp230 + \n+ csetemp231 + csetemp232 + csetemp233)*xformL21 + (csetemp234 + \n+ csetemp235 + csetemp236 + csetemp237)*xformL31) + xformL31*((csetemp214 \n+ + csetemp215 + csetemp216 + csetemp217)*xformL01 + (csetemp226 + \n+ csetemp227 + csetemp228 + csetemp229)*xformL11 + (csetemp234 + \n+ csetemp235 + csetemp236 + csetemp237)*xformL21 + (csetemp238 + \n+ csetemp239 + csetemp240 + csetemp241)*xformL31);\n+ \n+ CCTK_REAL dg4120 CCTK_ATTRIBUTE_UNUSED = xformL11*((csetemp86 + \n+ csetemp87 + csetemp88 + csetemp89)*xformL02 + (csetemp100 + csetemp101 \n+ + csetemp98 + csetemp99)*xformL12 + (csetemp102 + csetemp103 + \n+ csetemp104 + csetemp105)*xformL22 + (csetemp106 + csetemp107 + \n+ csetemp108 + csetemp109)*xformL32) + xformL21*((csetemp90 + csetemp91 + \n+ csetemp92 + csetemp93)*xformL02 + (csetemp102 + csetemp103 + csetemp104 \n+ + csetemp105)*xformL12 + (csetemp110 + csetemp111 + csetemp112 + \n+ csetemp113)*xformL22 + (csetemp114 + csetemp115 + csetemp116 + \n+ csetemp117)*xformL32) + xformL31*((csetemp94 + csetemp95 + csetemp96 + \n+ csetemp97)*xformL02 + (csetemp106 + csetemp107 + csetemp108 + \n+ csetemp109)*xformL12 + (csetemp114 + csetemp115 + csetemp116 + \n+ csetemp117)*xformL22 + (csetemp118 + csetemp119 + csetemp120 + \n+ csetemp121)*xformL32) + xformL01*((csetemp82 + csetemp83 + csetemp84 + \n+ csetemp85)*xformL02 + (csetemp86 + csetemp87 + csetemp88 + \n+ csetemp89)*xformL12 + (csetemp90 + csetemp91 + csetemp92 + \n+ csetemp93)*xformL22 + (csetemp94 + csetemp95 + csetemp96 + \n+ csetemp97)*xformL32);\n+ \n+ CCTK_REAL dg4121 CCTK_ATTRIBUTE_UNUSED = xformL01*((csetemp122 + \n+ csetemp123 + csetemp124 + csetemp125)*xformL02 + (csetemp126 + \n+ csetemp127 + csetemp128 + csetemp129)*xformL12 + (csetemp130 + \n+ csetemp131 + csetemp132 + csetemp133)*xformL22 + (csetemp134 + \n+ csetemp135 + csetemp136 + csetemp137)*xformL32) + xformL11*((csetemp126 \n+ + csetemp127 + csetemp128 + csetemp129)*xformL02 + (csetemp138 + \n+ csetemp139 + csetemp140 + csetemp141)*xformL12 + (csetemp142 + \n+ csetemp143 + csetemp144 + csetemp145)*xformL22 + (csetemp146 + \n+ csetemp147 + csetemp148 + csetemp149)*xformL32) + xformL21*((csetemp130 \n+ + csetemp131 + csetemp132 + csetemp133)*xformL02 + (csetemp142 + \n+ csetemp143 + csetemp144 + csetemp145)*xformL12 + (csetemp150 + \n+ csetemp151 + csetemp152 + csetemp153)*xformL22 + (csetemp154 + \n+ csetemp155 + csetemp156 + csetemp157)*xformL32) + xformL31*((csetemp134 \n+ + csetemp135 + csetemp136 + csetemp137)*xformL02 + (csetemp146 + \n+ csetemp147 + csetemp148 + csetemp149)*xformL12 + (csetemp154 + \n+ csetemp155 + csetemp156 + csetemp157)*xformL22 + (csetemp158 + \n+ csetemp159 + csetemp160 + csetemp161)*xformL32);\n+ \n+ CCTK_REAL dg4122 CCTK_ATTRIBUTE_UNUSED = xformL01*((csetemp162 + \n+ csetemp163 + csetemp164 + csetemp165)*xformL02 + (csetemp166 + \n+ csetemp167 + csetemp168 + csetemp169)*xformL12 + (csetemp170 + \n+ csetemp171 + csetemp172 + csetemp173)*xformL22 + (csetemp174 + \n+ csetemp175 + csetemp176 + csetemp177)*xformL32) + xformL11*((csetemp166 \n+ + csetemp167 + csetemp168 + csetemp169)*xformL02 + (csetemp178 + \n+ csetemp179 + csetemp180 + csetemp181)*xformL12 + (csetemp182 + \n+ csetemp183 + csetemp184 + csetemp185)*xformL22 + (csetemp186 + \n+ csetemp187 + csetemp188 + csetemp189)*xformL32) + xformL21*((csetemp170 \n+ + csetemp171 + csetemp172 + csetemp173)*xformL02 + (csetemp182 + \n+ csetemp183 + csetemp184 + csetemp185)*xformL12 + (csetemp190 + \n+ csetemp191 + csetemp192 + csetemp193)*xformL22 + (csetemp194 + \n+ csetemp195 + csetemp196 + csetemp197)*xformL32) + xformL31*((csetemp174 \n+ + csetemp175 + csetemp176 + csetemp177)*xformL02 + (csetemp186 + \n+ csetemp187 + csetemp188 + csetemp189)*xformL12 + (csetemp194 + \n+ csetemp195 + csetemp196 + csetemp197)*xformL22 + (csetemp198 + \n+ csetemp199 + csetemp200 + csetemp201)*xformL32);\n+ \n+ CCTK_REAL dg4123 CCTK_ATTRIBUTE_UNUSED = xformL01*((csetemp202 + \n+ csetemp203 + csetemp204 + csetemp205)*xformL02 + (csetemp206 + \n+ csetemp207 + csetemp208 + csetemp209)*xformL12 + (csetemp210 + \n+ csetemp211 + csetemp212 + csetemp213)*xformL22 + (csetemp214 + \n+ csetemp215 + csetemp216 + csetemp217)*xformL32) + xformL11*((csetemp206 \n+ + csetemp207 + csetemp208 + csetemp209)*xformL02 + (csetemp218 + \n+ csetemp219 + csetemp220 + csetemp221)*xformL12 + (csetemp222 + \n+ csetemp223 + csetemp224 + csetemp225)*xformL22 + (csetemp226 + \n+ csetemp227 + csetemp228 + csetemp229)*xformL32) + xformL21*((csetemp210 \n+ + csetemp211 + csetemp212 + csetemp213)*xformL02 + (csetemp222 + \n+ csetemp223 + csetemp224 + csetemp225)*xformL12 + (csetemp230 + \n+ csetemp231 + csetemp232 + csetemp233)*xformL22 + (csetemp234 + \n+ csetemp235 + csetemp236 + csetemp237)*xformL32) + xformL31*((csetemp214 \n+ + csetemp215 + csetemp216 + csetemp217)*xformL02 + (csetemp226 + \n+ csetemp227 + csetemp228 + csetemp229)*xformL12 + (csetemp234 + \n+ csetemp235 + csetemp236 + csetemp237)*xformL22 + (csetemp238 + \n+ csetemp239 + csetemp240 + csetemp241)*xformL32);\n+ \n+ CCTK_REAL dg4130 CCTK_ATTRIBUTE_UNUSED = xformL11*((csetemp86 + \n+ csetemp87 + csetemp88 + csetemp89)*xformL03 + (csetemp100 + csetemp101 \n+ + csetemp98 + csetemp99)*xformL13 + (csetemp102 + csetemp103 + \n+ csetemp104 + csetemp105)*xformL23 + (csetemp106 + csetemp107 + \n+ csetemp108 + csetemp109)*xformL33) + xformL21*((csetemp90 + csetemp91 + \n+ csetemp92 + csetemp93)*xformL03 + (csetemp102 + csetemp103 + csetemp104 \n+ + csetemp105)*xformL13 + (csetemp110 + csetemp111 + csetemp112 + \n+ csetemp113)*xformL23 + (csetemp114 + csetemp115 + csetemp116 + \n+ csetemp117)*xformL33) + xformL31*((csetemp94 + csetemp95 + csetemp96 + \n+ csetemp97)*xformL03 + (csetemp106 + csetemp107 + csetemp108 + \n+ csetemp109)*xformL13 + (csetemp114 + csetemp115 + csetemp116 + \n+ csetemp117)*xformL23 + (csetemp118 + csetemp119 + csetemp120 + \n+ csetemp121)*xformL33) + xformL01*((csetemp82 + csetemp83 + csetemp84 + \n+ csetemp85)*xformL03 + (csetemp86 + csetemp87 + csetemp88 + \n+ csetemp89)*xformL13 + (csetemp90 + csetemp91 + csetemp92 + \n+ csetemp93)*xformL23 + (csetemp94 + csetemp95 + csetemp96 + \n+ csetemp97)*xformL33);\n+ \n+ CCTK_REAL dg4131 CCTK_ATTRIBUTE_UNUSED = xformL01*((csetemp122 + \n+ csetemp123 + csetemp124 + csetemp125)*xformL03 + (csetemp126 + \n+ csetemp127 + csetemp128 + csetemp129)*xformL13 + (csetemp130 + \n+ csetemp131 + csetemp132 + csetemp133)*xformL23 + (csetemp134 + \n+ csetemp135 + csetemp136 + csetemp137)*xformL33) + xformL11*((csetemp126 \n+ + csetemp127 + csetemp128 + csetemp129)*xformL03 + (csetemp138 + \n+ csetemp139 + csetemp140 + csetemp141)*xformL13 + (csetemp142 + \n+ csetemp143 + csetemp144 + csetemp145)*xformL23 + (csetemp146 + \n+ csetemp147 + csetemp148 + csetemp149)*xformL33) + xformL21*((csetemp130 \n+ + csetemp131 + csetemp132 + csetemp133)*xformL03 + (csetemp142 + \n+ csetemp143 + csetemp144 + csetemp145)*xformL13 + (csetemp150 + \n+ csetemp151 + csetemp152 + csetemp153)*xformL23 + (csetemp154 + \n+ csetemp155 + csetemp156 + csetemp157)*xformL33) + xformL31*((csetemp134 \n+ + csetemp135 + csetemp136 + csetemp137)*xformL03 + (csetemp146 + \n+ csetemp147 + csetemp148 + csetemp149)*xformL13 + (csetemp154 + \n+ csetemp155 + csetemp156 + csetemp157)*xformL23 + (csetemp158 + \n+ csetemp159 + csetemp160 + csetemp161)*xformL33);\n+ \n+ CCTK_REAL dg4132 CCTK_ATTRIBUTE_UNUSED = xformL01*((csetemp162 + \n+ csetemp163 + csetemp164 + csetemp165)*xformL03 + (csetemp166 + \n+ csetemp167 + csetemp168 + csetemp169)*xformL13 + (csetemp170 + \n+ csetemp171 + csetemp172 + csetemp173)*xformL23 + (csetemp174 + \n+ csetemp175 + csetemp176 + csetemp177)*xformL33) + xformL11*((csetemp166 \n+ + csetemp167 + csetemp168 + csetemp169)*xformL03 + (csetemp178 + \n+ csetemp179 + csetemp180 + csetemp181)*xformL13 + (csetemp182 + \n+ csetemp183 + csetemp184 + csetemp185)*xformL23 + (csetemp186 + \n+ csetemp187 + csetemp188 + csetemp189)*xformL33) + xformL21*((csetemp170 \n+ + csetemp171 + csetemp172 + csetemp173)*xformL03 + (csetemp182 + \n+ csetemp183 + csetemp184 + csetemp185)*xformL13 + (csetemp190 + \n+ csetemp191 + csetemp192 + csetemp193)*xformL23 + (csetemp194 + \n+ csetemp195 + csetemp196 + csetemp197)*xformL33) + xformL31*((csetemp174 \n+ + csetemp175 + csetemp176 + csetemp177)*xformL03 + (csetemp186 + \n+ csetemp187 + csetemp188 + csetemp189)*xformL13 + (csetemp194 + \n+ csetemp195 + csetemp196 + csetemp197)*xformL23 + (csetemp198 + \n+ csetemp199 + csetemp200 + csetemp201)*xformL33);\n+ \n+ CCTK_REAL dg4133 CCTK_ATTRIBUTE_UNUSED = xformL01*((csetemp202 + \n+ csetemp203 + csetemp204 + csetemp205)*xformL03 + (csetemp206 + \n+ csetemp207 + csetemp208 + csetemp209)*xformL13 + (csetemp210 + \n+ csetemp211 + csetemp212 + csetemp213)*xformL23 + (csetemp214 + \n+ csetemp215 + csetemp216 + csetemp217)*xformL33) + xformL11*((csetemp206 \n+ + csetemp207 + csetemp208 + csetemp209)*xformL03 + (csetemp218 + \n+ csetemp219 + csetemp220 + csetemp221)*xformL13 + (csetemp222 + \n+ csetemp223 + csetemp224 + csetemp225)*xformL23 + (csetemp226 + \n+ csetemp227 + csetemp228 + csetemp229)*xformL33) + xformL21*((csetemp210 \n+ + csetemp211 + csetemp212 + csetemp213)*xformL03 + (csetemp222 + \n+ csetemp223 + csetemp224 + csetemp225)*xformL13 + (csetemp230 + \n+ csetemp231 + csetemp232 + csetemp233)*xformL23 + (csetemp234 + \n+ csetemp235 + csetemp236 + csetemp237)*xformL33) + xformL31*((csetemp214 \n+ + csetemp215 + csetemp216 + csetemp217)*xformL03 + (csetemp226 + \n+ csetemp227 + csetemp228 + csetemp229)*xformL13 + (csetemp234 + \n+ csetemp235 + csetemp236 + csetemp237)*xformL23 + (csetemp238 + \n+ csetemp239 + csetemp240 + csetemp241)*xformL33);\n+ \n+ CCTK_REAL dg4220 CCTK_ATTRIBUTE_UNUSED = xformL12*((csetemp86 + \n+ csetemp87 + csetemp88 + csetemp89)*xformL02 + (csetemp100 + csetemp101 \n+ + csetemp98 + csetemp99)*xformL12 + (csetemp102 + csetemp103 + \n+ csetemp104 + csetemp105)*xformL22 + (csetemp106 + csetemp107 + \n+ csetemp108 + csetemp109)*xformL32) + xformL22*((csetemp90 + csetemp91 + \n+ csetemp92 + csetemp93)*xformL02 + (csetemp102 + csetemp103 + csetemp104 \n+ + csetemp105)*xformL12 + (csetemp110 + csetemp111 + csetemp112 + \n+ csetemp113)*xformL22 + (csetemp114 + csetemp115 + csetemp116 + \n+ csetemp117)*xformL32) + xformL32*((csetemp94 + csetemp95 + csetemp96 + \n+ csetemp97)*xformL02 + (csetemp106 + csetemp107 + csetemp108 + \n+ csetemp109)*xformL12 + (csetemp114 + csetemp115 + csetemp116 + \n+ csetemp117)*xformL22 + (csetemp118 + csetemp119 + csetemp120 + \n+ csetemp121)*xformL32) + xformL02*((csetemp82 + csetemp83 + csetemp84 + \n+ csetemp85)*xformL02 + (csetemp86 + csetemp87 + csetemp88 + \n+ csetemp89)*xformL12 + (csetemp90 + csetemp91 + csetemp92 + \n+ csetemp93)*xformL22 + (csetemp94 + csetemp95 + csetemp96 + \n+ csetemp97)*xformL32);\n+ \n+ CCTK_REAL dg4221 CCTK_ATTRIBUTE_UNUSED = xformL02*((csetemp122 + \n+ csetemp123 + csetemp124 + csetemp125)*xformL02 + (csetemp126 + \n+ csetemp127 + csetemp128 + csetemp129)*xformL12 + (csetemp130 + \n+ csetemp131 + csetemp132 + csetemp133)*xformL22 + (csetemp134 + \n+ csetemp135 + csetemp136 + csetemp137)*xformL32) + xformL12*((csetemp126 \n+ + csetemp127 + csetemp128 + csetemp129)*xformL02 + (csetemp138 + \n+ csetemp139 + csetemp140 + csetemp141)*xformL12 + (csetemp142 + \n+ csetemp143 + csetemp144 + csetemp145)*xformL22 + (csetemp146 + \n+ csetemp147 + csetemp148 + csetemp149)*xformL32) + xformL22*((csetemp130 \n+ + csetemp131 + csetemp132 + csetemp133)*xformL02 + (csetemp142 + \n+ csetemp143 + csetemp144 + csetemp145)*xformL12 + (csetemp150 + \n+ csetemp151 + csetemp152 + csetemp153)*xformL22 + (csetemp154 + \n+ csetemp155 + csetemp156 + csetemp157)*xformL32) + xformL32*((csetemp134 \n+ + csetemp135 + csetemp136 + csetemp137)*xformL02 + (csetemp146 + \n+ csetemp147 + csetemp148 + csetemp149)*xformL12 + (csetemp154 + \n+ csetemp155 + csetemp156 + csetemp157)*xformL22 + (csetemp158 + \n+ csetemp159 + csetemp160 + csetemp161)*xformL32);\n+ \n+ CCTK_REAL dg4222 CCTK_ATTRIBUTE_UNUSED = xformL02*((csetemp162 + \n+ csetemp163 + csetemp164 + csetemp165)*xformL02 + (csetemp166 + \n+ csetemp167 + csetemp168 + csetemp169)*xformL12 + (csetemp170 + \n+ csetemp171 + csetemp172 + csetemp173)*xformL22 + (csetemp174 + \n+ csetemp175 + csetemp176 + csetemp177)*xformL32) + xformL12*((csetemp166 \n+ + csetemp167 + csetemp168 + csetemp169)*xformL02 + (csetemp178 + \n+ csetemp179 + csetemp180 + csetemp181)*xformL12 + (csetemp182 + \n+ csetemp183 + csetemp184 + csetemp185)*xformL22 + (csetemp186 + \n+ csetemp187 + csetemp188 + csetemp189)*xformL32) + xformL22*((csetemp170 \n+ + csetemp171 + csetemp172 + csetemp173)*xformL02 + (csetemp182 + \n+ csetemp183 + csetemp184 + csetemp185)*xformL12 + (csetemp190 + \n+ csetemp191 + csetemp192 + csetemp193)*xformL22 + (csetemp194 + \n+ csetemp195 + csetemp196 + csetemp197)*xformL32) + xformL32*((csetemp174 \n+ + csetemp175 + csetemp176 + csetemp177)*xformL02 + (csetemp186 + \n+ csetemp187 + csetemp188 + csetemp189)*xformL12 + (csetemp194 + \n+ csetemp195 + csetemp196 + csetemp197)*xformL22 + (csetemp198 + \n+ csetemp199 + csetemp200 + csetemp201)*xformL32);\n+ \n+ CCTK_REAL dg4223 CCTK_ATTRIBUTE_UNUSED = xformL02*((csetemp202 + \n+ csetemp203 + csetemp204 + csetemp205)*xformL02 + (csetemp206 + \n+ csetemp207 + csetemp208 + csetemp209)*xformL12 + (csetemp210 + \n+ csetemp211 + csetemp212 + csetemp213)*xformL22 + (csetemp214 + \n+ csetemp215 + csetemp216 + csetemp217)*xformL32) + xformL12*((csetemp206 \n+ + csetemp207 + csetemp208 + csetemp209)*xformL02 + (csetemp218 + \n+ csetemp219 + csetemp220 + csetemp221)*xformL12 + (csetemp222 + \n+ csetemp223 + csetemp224 + csetemp225)*xformL22 + (csetemp226 + \n+ csetemp227 + csetemp228 + csetemp229)*xformL32) + xformL22*((csetemp210 \n+ + csetemp211 + csetemp212 + csetemp213)*xformL02 + (csetemp222 + \n+ csetemp223 + csetemp224 + csetemp225)*xformL12 + (csetemp230 + \n+ csetemp231 + csetemp232 + csetemp233)*xformL22 + (csetemp234 + \n+ csetemp235 + csetemp236 + csetemp237)*xformL32) + xformL32*((csetemp214 \n+ + csetemp215 + csetemp216 + csetemp217)*xformL02 + (csetemp226 + \n+ csetemp227 + csetemp228 + csetemp229)*xformL12 + (csetemp234 + \n+ csetemp235 + csetemp236 + csetemp237)*xformL22 + (csetemp238 + \n+ csetemp239 + csetemp240 + csetemp241)*xformL32);\n+ \n+ CCTK_REAL dg4230 CCTK_ATTRIBUTE_UNUSED = xformL12*((csetemp86 + \n+ csetemp87 + csetemp88 + csetemp89)*xformL03 + (csetemp100 + csetemp101 \n+ + csetemp98 + csetemp99)*xformL13 + (csetemp102 + csetemp103 + \n+ csetemp104 + csetemp105)*xformL23 + (csetemp106 + csetemp107 + \n+ csetemp108 + csetemp109)*xformL33) + xformL22*((csetemp90 + csetemp91 + \n+ csetemp92 + csetemp93)*xformL03 + (csetemp102 + csetemp103 + csetemp104 \n+ + csetemp105)*xformL13 + (csetemp110 + csetemp111 + csetemp112 + \n+ csetemp113)*xformL23 + (csetemp114 + csetemp115 + csetemp116 + \n+ csetemp117)*xformL33) + xformL32*((csetemp94 + csetemp95 + csetemp96 + \n+ csetemp97)*xformL03 + (csetemp106 + csetemp107 + csetemp108 + \n+ csetemp109)*xformL13 + (csetemp114 + csetemp115 + csetemp116 + \n+ csetemp117)*xformL23 + (csetemp118 + csetemp119 + csetemp120 + \n+ csetemp121)*xformL33) + xformL02*((csetemp82 + csetemp83 + csetemp84 + \n+ csetemp85)*xformL03 + (csetemp86 + csetemp87 + csetemp88 + \n+ csetemp89)*xformL13 + (csetemp90 + csetemp91 + csetemp92 + \n+ csetemp93)*xformL23 + (csetemp94 + csetemp95 + csetemp96 + \n+ csetemp97)*xformL33);\n+ \n+ CCTK_REAL dg4231 CCTK_ATTRIBUTE_UNUSED = xformL02*((csetemp122 + \n+ csetemp123 + csetemp124 + csetemp125)*xformL03 + (csetemp126 + \n+ csetemp127 + csetemp128 + csetemp129)*xformL13 + (csetemp130 + \n+ csetemp131 + csetemp132 + csetemp133)*xformL23 + (csetemp134 + \n+ csetemp135 + csetemp136 + csetemp137)*xformL33) + xformL12*((csetemp126 \n+ + csetemp127 + csetemp128 + csetemp129)*xformL03 + (csetemp138 + \n+ csetemp139 + csetemp140 + csetemp141)*xformL13 + (csetemp142 + \n+ csetemp143 + csetemp144 + csetemp145)*xformL23 + (csetemp146 + \n+ csetemp147 + csetemp148 + csetemp149)*xformL33) + xformL22*((csetemp130 \n+ + csetemp131 + csetemp132 + csetemp133)*xformL03 + (csetemp142 + \n+ csetemp143 + csetemp144 + csetemp145)*xformL13 + (csetemp150 + \n+ csetemp151 + csetemp152 + csetemp153)*xformL23 + (csetemp154 + \n+ csetemp155 + csetemp156 + csetemp157)*xformL33) + xformL32*((csetemp134 \n+ + csetemp135 + csetemp136 + csetemp137)*xformL03 + (csetemp146 + \n+ csetemp147 + csetemp148 + csetemp149)*xformL13 + (csetemp154 + \n+ csetemp155 + csetemp156 + csetemp157)*xformL23 + (csetemp158 + \n+ csetemp159 + csetemp160 + csetemp161)*xformL33);\n+ \n+ CCTK_REAL dg4232 CCTK_ATTRIBUTE_UNUSED = xformL02*((csetemp162 + \n+ csetemp163 + csetemp164 + csetemp165)*xformL03 + (csetemp166 + \n+ csetemp167 + csetemp168 + csetemp169)*xformL13 + (csetemp170 + \n+ csetemp171 + csetemp172 + csetemp173)*xformL23 + (csetemp174 + \n+ csetemp175 + csetemp176 + csetemp177)*xformL33) + xformL12*((csetemp166 \n+ + csetemp167 + csetemp168 + csetemp169)*xformL03 + (csetemp178 + \n+ csetemp179 + csetemp180 + csetemp181)*xformL13 + (csetemp182 + \n+ csetemp183 + csetemp184 + csetemp185)*xformL23 + (csetemp186 + \n+ csetemp187 + csetemp188 + csetemp189)*xformL33) + xformL22*((csetemp170 \n+ + csetemp171 + csetemp172 + csetemp173)*xformL03 + (csetemp182 + \n+ csetemp183 + csetemp184 + csetemp185)*xformL13 + (csetemp190 + \n+ csetemp191 + csetemp192 + csetemp193)*xformL23 + (csetemp194 + \n+ csetemp195 + csetemp196 + csetemp197)*xformL33) + xformL32*((csetemp174 \n+ + csetemp175 + csetemp176 + csetemp177)*xformL03 + (csetemp186 + \n+ csetemp187 + csetemp188 + csetemp189)*xformL13 + (csetemp194 + \n+ csetemp195 + csetemp196 + csetemp197)*xformL23 + (csetemp198 + \n+ csetemp199 + csetemp200 + csetemp201)*xformL33);\n+ \n+ CCTK_REAL dg4233 CCTK_ATTRIBUTE_UNUSED = xformL02*((csetemp202 + \n+ csetemp203 + csetemp204 + csetemp205)*xformL03 + (csetemp206 + \n+ csetemp207 + csetemp208 + csetemp209)*xformL13 + (csetemp210 + \n+ csetemp211 + csetemp212 + csetemp213)*xformL23 + (csetemp214 + \n+ csetemp215 + csetemp216 + csetemp217)*xformL33) + xformL12*((csetemp206 \n+ + csetemp207 + csetemp208 + csetemp209)*xformL03 + (csetemp218 + \n+ csetemp219 + csetemp220 + csetemp221)*xformL13 + (csetemp222 + \n+ csetemp223 + csetemp224 + csetemp225)*xformL23 + (csetemp226 + \n+ csetemp227 + csetemp228 + csetemp229)*xformL33) + xformL22*((csetemp210 \n+ + csetemp211 + csetemp212 + csetemp213)*xformL03 + (csetemp222 + \n+ csetemp223 + csetemp224 + csetemp225)*xformL13 + (csetemp230 + \n+ csetemp231 + csetemp232 + csetemp233)*xformL23 + (csetemp234 + \n+ csetemp235 + csetemp236 + csetemp237)*xformL33) + xformL32*((csetemp214 \n+ + csetemp215 + csetemp216 + csetemp217)*xformL03 + (csetemp226 + \n+ csetemp227 + csetemp228 + csetemp229)*xformL13 + (csetemp234 + \n+ csetemp235 + csetemp236 + csetemp237)*xformL23 + (csetemp238 + \n+ csetemp239 + csetemp240 + csetemp241)*xformL33);\n+ \n+ CCTK_REAL dg4330 CCTK_ATTRIBUTE_UNUSED = xformL13*((csetemp86 + \n+ csetemp87 + csetemp88 + csetemp89)*xformL03 + (csetemp100 + csetemp101 \n+ + csetemp98 + csetemp99)*xformL13 + (csetemp102 + csetemp103 + \n+ csetemp104 + csetemp105)*xformL23 + (csetemp106 + csetemp107 + \n+ csetemp108 + csetemp109)*xformL33) + xformL23*((csetemp90 + csetemp91 + \n+ csetemp92 + csetemp93)*xformL03 + (csetemp102 + csetemp103 + csetemp104 \n+ + csetemp105)*xformL13 + (csetemp110 + csetemp111 + csetemp112 + \n+ csetemp113)*xformL23 + (csetemp114 + csetemp115 + csetemp116 + \n+ csetemp117)*xformL33) + xformL33*((csetemp94 + csetemp95 + csetemp96 + \n+ csetemp97)*xformL03 + (csetemp106 + csetemp107 + csetemp108 + \n+ csetemp109)*xformL13 + (csetemp114 + csetemp115 + csetemp116 + \n+ csetemp117)*xformL23 + (csetemp118 + csetemp119 + csetemp120 + \n+ csetemp121)*xformL33) + xformL03*((csetemp82 + csetemp83 + csetemp84 + \n+ csetemp85)*xformL03 + (csetemp86 + csetemp87 + csetemp88 + \n+ csetemp89)*xformL13 + (csetemp90 + csetemp91 + csetemp92 + \n+ csetemp93)*xformL23 + (csetemp94 + csetemp95 + csetemp96 + \n+ csetemp97)*xformL33);\n+ \n+ CCTK_REAL dg4331 CCTK_ATTRIBUTE_UNUSED = xformL03*((csetemp122 + \n+ csetemp123 + csetemp124 + csetemp125)*xformL03 + (csetemp126 + \n+ csetemp127 + csetemp128 + csetemp129)*xformL13 + (csetemp130 + \n+ csetemp131 + csetemp132 + csetemp133)*xformL23 + (csetemp134 + \n+ csetemp135 + csetemp136 + csetemp137)*xformL33) + xformL13*((csetemp126 \n+ + csetemp127 + csetemp128 + csetemp129)*xformL03 + (csetemp138 + \n+ csetemp139 + csetemp140 + csetemp141)*xformL13 + (csetemp142 + \n+ csetemp143 + csetemp144 + csetemp145)*xformL23 + (csetemp146 + \n+ csetemp147 + csetemp148 + csetemp149)*xformL33) + xformL23*((csetemp130 \n+ + csetemp131 + csetemp132 + csetemp133)*xformL03 + (csetemp142 + \n+ csetemp143 + csetemp144 + csetemp145)*xformL13 + (csetemp150 + \n+ csetemp151 + csetemp152 + csetemp153)*xformL23 + (csetemp154 + \n+ csetemp155 + csetemp156 + csetemp157)*xformL33) + xformL33*((csetemp134 \n+ + csetemp135 + csetemp136 + csetemp137)*xformL03 + (csetemp146 + \n+ csetemp147 + csetemp148 + csetemp149)*xformL13 + (csetemp154 + \n+ csetemp155 + csetemp156 + csetemp157)*xformL23 + (csetemp158 + \n+ csetemp159 + csetemp160 + csetemp161)*xformL33);\n+ \n+ CCTK_REAL dg4332 CCTK_ATTRIBUTE_UNUSED = xformL03*((csetemp162 + \n+ csetemp163 + csetemp164 + csetemp165)*xformL03 + (csetemp166 + \n+ csetemp167 + csetemp168 + csetemp169)*xformL13 + (csetemp170 + \n+ csetemp171 + csetemp172 + csetemp173)*xformL23 + (csetemp174 + \n+ csetemp175 + csetemp176 + csetemp177)*xformL33) + xformL13*((csetemp166 \n+ + csetemp167 + csetemp168 + csetemp169)*xformL03 + (csetemp178 + \n+ csetemp179 + csetemp180 + csetemp181)*xformL13 + (csetemp182 + \n+ csetemp183 + csetemp184 + csetemp185)*xformL23 + (csetemp186 + \n+ csetemp187 + csetemp188 + csetemp189)*xformL33) + xformL23*((csetemp170 \n+ + csetemp171 + csetemp172 + csetemp173)*xformL03 + (csetemp182 + \n+ csetemp183 + csetemp184 + csetemp185)*xformL13 + (csetemp190 + \n+ csetemp191 + csetemp192 + csetemp193)*xformL23 + (csetemp194 + \n+ csetemp195 + csetemp196 + csetemp197)*xformL33) + xformL33*((csetemp174 \n+ + csetemp175 + csetemp176 + csetemp177)*xformL03 + (csetemp186 + \n+ csetemp187 + csetemp188 + csetemp189)*xformL13 + (csetemp194 + \n+ csetemp195 + csetemp196 + csetemp197)*xformL23 + (csetemp198 + \n+ csetemp199 + csetemp200 + csetemp201)*xformL33);\n+ \n+ CCTK_REAL dg4333 CCTK_ATTRIBUTE_UNUSED = xformL03*((csetemp202 + \n+ csetemp203 + csetemp204 + csetemp205)*xformL03 + (csetemp206 + \n+ csetemp207 + csetemp208 + csetemp209)*xformL13 + (csetemp210 + \n+ csetemp211 + csetemp212 + csetemp213)*xformL23 + (csetemp214 + \n+ csetemp215 + csetemp216 + csetemp217)*xformL33) + xformL13*((csetemp206 \n+ + csetemp207 + csetemp208 + csetemp209)*xformL03 + (csetemp218 + \n+ csetemp219 + csetemp220 + csetemp221)*xformL13 + (csetemp222 + \n+ csetemp223 + csetemp224 + csetemp225)*xformL23 + (csetemp226 + \n+ csetemp227 + csetemp228 + csetemp229)*xformL33) + xformL23*((csetemp210 \n+ + csetemp211 + csetemp212 + csetemp213)*xformL03 + (csetemp222 + \n+ csetemp223 + csetemp224 + csetemp225)*xformL13 + (csetemp230 + \n+ csetemp231 + csetemp232 + csetemp233)*xformL23 + (csetemp234 + \n+ csetemp235 + csetemp236 + csetemp237)*xformL33) + xformL33*((csetemp214 \n+ + csetemp215 + csetemp216 + csetemp217)*xformL03 + (csetemp226 + \n+ csetemp227 + csetemp228 + csetemp229)*xformL13 + (csetemp234 + \n+ csetemp235 + csetemp236 + csetemp237)*xformL23 + (csetemp238 + \n+ csetemp239 + csetemp240 + csetemp241)*xformL33);\n+ \n+ CCTK_REAL betal1 CCTK_ATTRIBUTE_UNUSED = g401;\n+ \n+ CCTK_REAL betal2 CCTK_ATTRIBUTE_UNUSED = g402;\n+ \n+ CCTK_REAL betal3 CCTK_ATTRIBUTE_UNUSED = g403;\n+ \n+ gExact11L = g411;\n+ \n+ gExact12L = g412;\n+ \n+ gExact13L = g413;\n+ \n+ gExact22L = g422;\n+ \n+ gExact23L = g423;\n+ \n+ gExact33L = g433;\n+ \n+ CCTK_REAL csetemp242 CCTK_ATTRIBUTE_UNUSED = 2*gxyL*gxzL*gyzL;\n+ \n+ CCTK_REAL csetemp243 CCTK_ATTRIBUTE_UNUSED = gxxL*gyyL*gzzL;\n+ \n+ CCTK_REAL csetemp244 CCTK_ATTRIBUTE_UNUSED = pow(gxzL,2);\n+ \n+ CCTK_REAL csetemp245 CCTK_ATTRIBUTE_UNUSED = pow(gyzL,2);\n+ \n+ CCTK_REAL csetemp246 CCTK_ATTRIBUTE_UNUSED = pow(gxyL,2);\n+ \n+ CCTK_REAL detg CCTK_ATTRIBUTE_UNUSED = csetemp242 + csetemp243 - \n+ gyyL*csetemp244 - gxxL*csetemp245 - gzzL*csetemp246;\n+ \n+ CCTK_REAL csetemp247 CCTK_ATTRIBUTE_UNUSED = \n+ 2*gExact12L*gExact13L*gExact23L;\n+ \n+ CCTK_REAL csetemp248 CCTK_ATTRIBUTE_UNUSED = \n+ gExact11L*gExact22L*gExact33L;\n+ \n+ CCTK_REAL csetemp249 CCTK_ATTRIBUTE_UNUSED = pow(detg,-1);\n+ \n+ CCTK_REAL csetemp250 CCTK_ATTRIBUTE_UNUSED = pow(gExact23L,2);\n+ \n+ CCTK_REAL csetemp251 CCTK_ATTRIBUTE_UNUSED = pow(gExact13L,2);\n+ \n+ CCTK_REAL csetemp252 CCTK_ATTRIBUTE_UNUSED = pow(gExact12L,2);\n+ \n+ CCTK_REAL gu11 CCTK_ATTRIBUTE_UNUSED = (csetemp242 + csetemp243 - \n+ gyyL*csetemp244 - gxxL*csetemp245 - \n+ gzzL*csetemp246)*csetemp249*(-(gExact22L*gExact33L) + \n+ csetemp250)*pow(-csetemp247 - csetemp248 + gExact11L*csetemp250 + \n+ gExact22L*csetemp251 + gExact33L*csetemp252,-1);\n+ \n+ CCTK_REAL gu12 CCTK_ATTRIBUTE_UNUSED = (gExact13L*gExact23L - \n+ gExact12L*gExact33L)*(csetemp242 + csetemp243 - gyyL*csetemp244 - \n+ gxxL*csetemp245 - gzzL*csetemp246)*csetemp249*pow(csetemp247 + \n+ csetemp248 - gExact11L*csetemp250 - gExact22L*csetemp251 - \n+ gExact33L*csetemp252,-1);\n+ \n+ CCTK_REAL gu13 CCTK_ATTRIBUTE_UNUSED = (gExact13L*gExact22L - \n+ gExact12L*gExact23L)*(csetemp242 + csetemp243 - gyyL*csetemp244 - \n+ gxxL*csetemp245 - gzzL*csetemp246)*csetemp249*pow(-csetemp247 - \n+ csetemp248 + gExact11L*csetemp250 + gExact22L*csetemp251 + \n+ gExact33L*csetemp252,-1);\n+ \n+ CCTK_REAL gu22 CCTK_ATTRIBUTE_UNUSED = (csetemp242 + csetemp243 - \n+ gyyL*csetemp244 - gxxL*csetemp245 - \n+ gzzL*csetemp246)*csetemp249*(-(gExact11L*gExact33L) + \n+ csetemp251)*pow(-csetemp247 - csetemp248 + gExact11L*csetemp250 + \n+ gExact22L*csetemp251 + gExact33L*csetemp252,-1);\n+ \n+ CCTK_REAL gu23 CCTK_ATTRIBUTE_UNUSED = (gExact12L*gExact13L - \n+ gExact11L*gExact23L)*(csetemp242 + csetemp243 - gyyL*csetemp244 - \n+ gxxL*csetemp245 - gzzL*csetemp246)*csetemp249*pow(csetemp247 + \n+ csetemp248 - gExact11L*csetemp250 - gExact22L*csetemp251 - \n+ gExact33L*csetemp252,-1);\n+ \n+ CCTK_REAL gu33 CCTK_ATTRIBUTE_UNUSED = (csetemp242 + csetemp243 - \n+ gyyL*csetemp244 - gxxL*csetemp245 - \n+ gzzL*csetemp246)*csetemp249*(-(gExact11L*gExact22L) + \n+ csetemp252)*pow(-csetemp247 - csetemp248 + gExact11L*csetemp250 + \n+ gExact22L*csetemp251 + gExact33L*csetemp252,-1);\n+ \n+ betaExact1L = betal1*gu11 + betal2*gu12 + betal3*gu13;\n+ \n+ betaExact2L = betal1*gu12 + betal2*gu22 + betal3*gu23;\n+ \n+ betaExact3L = betal1*gu13 + betal2*gu23 + betal3*gu33;\n+ \n+ CCTK_REAL betasq CCTK_ATTRIBUTE_UNUSED = betaExact1L*betal1 + \n+ betaExact2L*betal2 + betaExact3L*betal3;\n+ \n+ alpExactL = pow(betasq - g400,0.5);\n+ \n+ CCTK_REAL dtg11 CCTK_ATTRIBUTE_UNUSED = dg4110;\n+ \n+ CCTK_REAL dtg12 CCTK_ATTRIBUTE_UNUSED = dg4120;\n+ \n+ CCTK_REAL dtg13 CCTK_ATTRIBUTE_UNUSED = dg4130;\n+ \n+ CCTK_REAL dtg22 CCTK_ATTRIBUTE_UNUSED = dg4220;\n+ \n+ CCTK_REAL dtg23 CCTK_ATTRIBUTE_UNUSED = dg4230;\n+ \n+ CCTK_REAL dtg33 CCTK_ATTRIBUTE_UNUSED = dg4330;\n+ \n+ CCTK_REAL dg111 CCTK_ATTRIBUTE_UNUSED = dg4111;\n+ \n+ CCTK_REAL dg112 CCTK_ATTRIBUTE_UNUSED = dg4112;\n+ \n+ CCTK_REAL dg113 CCTK_ATTRIBUTE_UNUSED = dg4113;\n+ \n+ CCTK_REAL dg121 CCTK_ATTRIBUTE_UNUSED = dg4121;\n+ \n+ CCTK_REAL dg122 CCTK_ATTRIBUTE_UNUSED = dg4122;\n+ \n+ CCTK_REAL dg123 CCTK_ATTRIBUTE_UNUSED = dg4123;\n+ \n+ CCTK_REAL dg131 CCTK_ATTRIBUTE_UNUSED = dg4131;\n+ \n+ CCTK_REAL dg132 CCTK_ATTRIBUTE_UNUSED = dg4132;\n+ \n+ CCTK_REAL dg133 CCTK_ATTRIBUTE_UNUSED = dg4133;\n+ \n+ CCTK_REAL dg221 CCTK_ATTRIBUTE_UNUSED = dg4221;\n+ \n+ CCTK_REAL dg222 CCTK_ATTRIBUTE_UNUSED = dg4222;\n+ \n+ CCTK_REAL dg223 CCTK_ATTRIBUTE_UNUSED = dg4223;\n+ \n+ CCTK_REAL dg231 CCTK_ATTRIBUTE_UNUSED = dg4231;\n+ \n+ CCTK_REAL dg232 CCTK_ATTRIBUTE_UNUSED = dg4232;\n+ \n+ CCTK_REAL dg233 CCTK_ATTRIBUTE_UNUSED = dg4233;\n+ \n+ CCTK_REAL dg331 CCTK_ATTRIBUTE_UNUSED = dg4331;\n+ \n+ CCTK_REAL dg332 CCTK_ATTRIBUTE_UNUSED = dg4332;\n+ \n+ CCTK_REAL dg333 CCTK_ATTRIBUTE_UNUSED = dg4333;\n+ \n+ CCTK_REAL csetemp253 CCTK_ATTRIBUTE_UNUSED = dtg11*gu11;\n+ \n+ CCTK_REAL csetemp254 CCTK_ATTRIBUTE_UNUSED = dtg12*gu12;\n+ \n+ CCTK_REAL csetemp255 CCTK_ATTRIBUTE_UNUSED = dtg13*gu13;\n+ \n+ CCTK_REAL csetemp256 CCTK_ATTRIBUTE_UNUSED = dtg12*gu11;\n+ \n+ CCTK_REAL csetemp257 CCTK_ATTRIBUTE_UNUSED = dtg22*gu12;\n+ \n+ CCTK_REAL csetemp258 CCTK_ATTRIBUTE_UNUSED = dtg23*gu13;\n+ \n+ CCTK_REAL csetemp259 CCTK_ATTRIBUTE_UNUSED = dtg13*gu11;\n+ \n+ CCTK_REAL csetemp260 CCTK_ATTRIBUTE_UNUSED = dtg23*gu12;\n+ \n+ CCTK_REAL csetemp261 CCTK_ATTRIBUTE_UNUSED = dtg33*gu13;\n+ \n+ CCTK_REAL dtgu11 CCTK_ATTRIBUTE_UNUSED = -((csetemp253 + csetemp254 + \n+ csetemp255)*gu11) - (csetemp256 + csetemp257 + csetemp258)*gu12 - \n+ (csetemp259 + csetemp260 + csetemp261)*gu13;\n+ \n+ CCTK_REAL dtgu12 CCTK_ATTRIBUTE_UNUSED = -((csetemp253 + csetemp254 + \n+ csetemp255)*gu12) - (csetemp256 + csetemp257 + csetemp258)*gu22 - \n+ (csetemp259 + csetemp260 + csetemp261)*gu23;\n+ \n+ CCTK_REAL dtgu13 CCTK_ATTRIBUTE_UNUSED = -((csetemp253 + csetemp254 + \n+ csetemp255)*gu13) - (csetemp256 + csetemp257 + csetemp258)*gu23 - \n+ (csetemp259 + csetemp260 + csetemp261)*gu33;\n+ \n+ CCTK_REAL csetemp262 CCTK_ATTRIBUTE_UNUSED = dtg11*gu12;\n+ \n+ CCTK_REAL csetemp263 CCTK_ATTRIBUTE_UNUSED = dtg12*gu22;\n+ \n+ CCTK_REAL csetemp264 CCTK_ATTRIBUTE_UNUSED = dtg13*gu23;\n+ \n+ CCTK_REAL csetemp265 CCTK_ATTRIBUTE_UNUSED = dtg22*gu22;\n+ \n+ CCTK_REAL csetemp266 CCTK_ATTRIBUTE_UNUSED = dtg23*gu23;\n+ \n+ CCTK_REAL csetemp267 CCTK_ATTRIBUTE_UNUSED = dtg13*gu12;\n+ \n+ CCTK_REAL csetemp268 CCTK_ATTRIBUTE_UNUSED = dtg23*gu22;\n+ \n+ CCTK_REAL csetemp269 CCTK_ATTRIBUTE_UNUSED = dtg33*gu23;\n+ \n+ CCTK_REAL dtgu22 CCTK_ATTRIBUTE_UNUSED = -((csetemp262 + csetemp263 + \n+ csetemp264)*gu12) - (csetemp254 + csetemp265 + csetemp266)*gu22 - \n+ (csetemp267 + csetemp268 + csetemp269)*gu23;\n+ \n+ CCTK_REAL dtgu23 CCTK_ATTRIBUTE_UNUSED = -((csetemp262 + csetemp263 + \n+ csetemp264)*gu13) - (csetemp254 + csetemp265 + csetemp266)*gu23 - \n+ (csetemp267 + csetemp268 + csetemp269)*gu33;\n+ \n+ CCTK_REAL dtgu33 CCTK_ATTRIBUTE_UNUSED = -(gu13*(dtg11*gu13 + \n+ dtg12*gu23 + dtg13*gu33)) - gu23*(dtg12*gu13 + dtg22*gu23 + dtg23*gu33) \n+ - gu33*(csetemp255 + csetemp266 + dtg33*gu33);\n+ \n+ CCTK_REAL csetemp270 CCTK_ATTRIBUTE_UNUSED = dg111*gu11;\n+ \n+ CCTK_REAL csetemp271 CCTK_ATTRIBUTE_UNUSED = dg121*gu12;\n+ \n+ CCTK_REAL csetemp272 CCTK_ATTRIBUTE_UNUSED = dg131*gu13;\n+ \n+ CCTK_REAL csetemp273 CCTK_ATTRIBUTE_UNUSED = dg121*gu11;\n+ \n+ CCTK_REAL csetemp274 CCTK_ATTRIBUTE_UNUSED = dg221*gu12;\n+ \n+ CCTK_REAL csetemp275 CCTK_ATTRIBUTE_UNUSED = dg231*gu13;\n+ \n+ CCTK_REAL csetemp276 CCTK_ATTRIBUTE_UNUSED = dg131*gu11;\n+ \n+ CCTK_REAL csetemp277 CCTK_ATTRIBUTE_UNUSED = dg231*gu12;\n+ \n+ CCTK_REAL csetemp278 CCTK_ATTRIBUTE_UNUSED = dg331*gu13;\n+ \n+ CCTK_REAL dgu111 CCTK_ATTRIBUTE_UNUSED = -((csetemp270 + csetemp271 + \n+ csetemp272)*gu11) - (csetemp273 + csetemp274 + csetemp275)*gu12 - \n+ (csetemp276 + csetemp277 + csetemp278)*gu13;\n+ \n+ CCTK_REAL dgu121 CCTK_ATTRIBUTE_UNUSED = -((csetemp270 + csetemp271 + \n+ csetemp272)*gu12) - (csetemp273 + csetemp274 + csetemp275)*gu22 - \n+ (csetemp276 + csetemp277 + csetemp278)*gu23;\n+ \n+ CCTK_REAL dgu131 CCTK_ATTRIBUTE_UNUSED = -((csetemp270 + csetemp271 + \n+ csetemp272)*gu13) - (csetemp273 + csetemp274 + csetemp275)*gu23 - \n+ (csetemp276 + csetemp277 + csetemp278)*gu33;\n+ \n+ CCTK_REAL csetemp279 CCTK_ATTRIBUTE_UNUSED = dg111*gu12;\n+ \n+ CCTK_REAL csetemp280 CCTK_ATTRIBUTE_UNUSED = dg121*gu22;\n+ \n+ CCTK_REAL csetemp281 CCTK_ATTRIBUTE_UNUSED = dg131*gu23;\n+ \n+ CCTK_REAL csetemp282 CCTK_ATTRIBUTE_UNUSED = dg221*gu22;\n+ \n+ CCTK_REAL csetemp283 CCTK_ATTRIBUTE_UNUSED = dg231*gu23;\n+ \n+ CCTK_REAL csetemp284 CCTK_ATTRIBUTE_UNUSED = dg131*gu12;\n+ \n+ CCTK_REAL csetemp285 CCTK_ATTRIBUTE_UNUSED = dg231*gu22;\n+ \n+ CCTK_REAL csetemp286 CCTK_ATTRIBUTE_UNUSED = dg331*gu23;\n+ \n+ CCTK_REAL dgu221 CCTK_ATTRIBUTE_UNUSED = -((csetemp279 + csetemp280 + \n+ csetemp281)*gu12) - (csetemp271 + csetemp282 + csetemp283)*gu22 - \n+ (csetemp284 + csetemp285 + csetemp286)*gu23;\n+ \n+ CCTK_REAL dgu231 CCTK_ATTRIBUTE_UNUSED = -((csetemp279 + csetemp280 + \n+ csetemp281)*gu13) - (csetemp271 + csetemp282 + csetemp283)*gu23 - \n+ (csetemp284 + csetemp285 + csetemp286)*gu33;\n+ \n+ CCTK_REAL dgu331 CCTK_ATTRIBUTE_UNUSED = -(gu13*(dg111*gu13 + \n+ dg121*gu23 + dg131*gu33)) - gu23*(dg121*gu13 + dg221*gu23 + dg231*gu33) \n+ - gu33*(csetemp272 + csetemp283 + dg331*gu33);\n+ \n+ CCTK_REAL csetemp287 CCTK_ATTRIBUTE_UNUSED = dg112*gu11;\n+ \n+ CCTK_REAL csetemp288 CCTK_ATTRIBUTE_UNUSED = dg122*gu12;\n+ \n+ CCTK_REAL csetemp289 CCTK_ATTRIBUTE_UNUSED = dg132*gu13;\n+ \n+ CCTK_REAL csetemp290 CCTK_ATTRIBUTE_UNUSED = dg122*gu11;\n+ \n+ CCTK_REAL csetemp291 CCTK_ATTRIBUTE_UNUSED = dg222*gu12;\n+ \n+ CCTK_REAL csetemp292 CCTK_ATTRIBUTE_UNUSED = dg232*gu13;\n+ \n+ CCTK_REAL csetemp293 CCTK_ATTRIBUTE_UNUSED = dg132*gu11;\n+ \n+ CCTK_REAL csetemp294 CCTK_ATTRIBUTE_UNUSED = dg232*gu12;\n+ \n+ CCTK_REAL csetemp295 CCTK_ATTRIBUTE_UNUSED = dg332*gu13;\n+ \n+ CCTK_REAL dgu112 CCTK_ATTRIBUTE_UNUSED = -((csetemp287 + csetemp288 + \n+ csetemp289)*gu11) - (csetemp290 + csetemp291 + csetemp292)*gu12 - \n+ (csetemp293 + csetemp294 + csetemp295)*gu13;\n+ \n+ CCTK_REAL dgu122 CCTK_ATTRIBUTE_UNUSED = -((csetemp287 + csetemp288 + \n+ csetemp289)*gu12) - (csetemp290 + csetemp291 + csetemp292)*gu22 - \n+ (csetemp293 + csetemp294 + csetemp295)*gu23;\n+ \n+ CCTK_REAL dgu132 CCTK_ATTRIBUTE_UNUSED = -((csetemp287 + csetemp288 + \n+ csetemp289)*gu13) - (csetemp290 + csetemp291 + csetemp292)*gu23 - \n+ (csetemp293 + csetemp294 + csetemp295)*gu33;\n+ \n+ CCTK_REAL csetemp296 CCTK_ATTRIBUTE_UNUSED = dg112*gu12;\n+ \n+ CCTK_REAL csetemp297 CCTK_ATTRIBUTE_UNUSED = dg122*gu22;\n+ \n+ CCTK_REAL csetemp298 CCTK_ATTRIBUTE_UNUSED = dg132*gu23;\n+ \n+ CCTK_REAL csetemp299 CCTK_ATTRIBUTE_UNUSED = dg222*gu22;\n+ \n+ CCTK_REAL csetemp300 CCTK_ATTRIBUTE_UNUSED = dg232*gu23;\n+ \n+ CCTK_REAL csetemp301 CCTK_ATTRIBUTE_UNUSED = dg132*gu12;\n+ \n+ CCTK_REAL csetemp302 CCTK_ATTRIBUTE_UNUSED = dg232*gu22;\n+ \n+ CCTK_REAL csetemp303 CCTK_ATTRIBUTE_UNUSED = dg332*gu23;\n+ \n+ CCTK_REAL dgu222 CCTK_ATTRIBUTE_UNUSED = -((csetemp296 + csetemp297 + \n+ csetemp298)*gu12) - (csetemp288 + csetemp299 + csetemp300)*gu22 - \n+ (csetemp301 + csetemp302 + csetemp303)*gu23;\n+ \n+ CCTK_REAL dgu232 CCTK_ATTRIBUTE_UNUSED = -((csetemp296 + csetemp297 + \n+ csetemp298)*gu13) - (csetemp288 + csetemp299 + csetemp300)*gu23 - \n+ (csetemp301 + csetemp302 + csetemp303)*gu33;\n+ \n+ CCTK_REAL dgu332 CCTK_ATTRIBUTE_UNUSED = -(gu13*(dg112*gu13 + \n+ dg122*gu23 + dg132*gu33)) - gu23*(dg122*gu13 + dg222*gu23 + dg232*gu33) \n+ - gu33*(csetemp289 + csetemp300 + dg332*gu33);\n+ \n+ CCTK_REAL csetemp304 CCTK_ATTRIBUTE_UNUSED = dg113*gu11;\n+ \n+ CCTK_REAL csetemp305 CCTK_ATTRIBUTE_UNUSED = dg123*gu12;\n+ \n+ CCTK_REAL csetemp306 CCTK_ATTRIBUTE_UNUSED = dg133*gu13;\n+ \n+ CCTK_REAL csetemp307 CCTK_ATTRIBUTE_UNUSED = dg123*gu11;\n+ \n+ CCTK_REAL csetemp308 CCTK_ATTRIBUTE_UNUSED = dg223*gu12;\n+ \n+ CCTK_REAL csetemp309 CCTK_ATTRIBUTE_UNUSED = dg233*gu13;\n+ \n+ CCTK_REAL csetemp310 CCTK_ATTRIBUTE_UNUSED = dg133*gu11;\n+ \n+ CCTK_REAL csetemp311 CCTK_ATTRIBUTE_UNUSED = dg233*gu12;\n+ \n+ CCTK_REAL csetemp312 CCTK_ATTRIBUTE_UNUSED = dg333*gu13;\n+ \n+ CCTK_REAL dgu113 CCTK_ATTRIBUTE_UNUSED = -((csetemp304 + csetemp305 + \n+ csetemp306)*gu11) - (csetemp307 + csetemp308 + csetemp309)*gu12 - \n+ (csetemp310 + csetemp311 + csetemp312)*gu13;\n+ \n+ CCTK_REAL dgu123 CCTK_ATTRIBUTE_UNUSED = -((csetemp304 + csetemp305 + \n+ csetemp306)*gu12) - (csetemp307 + csetemp308 + csetemp309)*gu22 - \n+ (csetemp310 + csetemp311 + csetemp312)*gu23;\n+ \n+ CCTK_REAL dgu133 CCTK_ATTRIBUTE_UNUSED = -((csetemp304 + csetemp305 + \n+ csetemp306)*gu13) - (csetemp307 + csetemp308 + csetemp309)*gu23 - \n+ (csetemp310 + csetemp311 + csetemp312)*gu33;\n+ \n+ CCTK_REAL csetemp313 CCTK_ATTRIBUTE_UNUSED = dg113*gu12;\n+ \n+ CCTK_REAL csetemp314 CCTK_ATTRIBUTE_UNUSED = dg123*gu22;\n+ \n+ CCTK_REAL csetemp315 CCTK_ATTRIBUTE_UNUSED = dg133*gu23;\n+ \n+ CCTK_REAL csetemp316 CCTK_ATTRIBUTE_UNUSED = dg223*gu22;\n+ \n+ CCTK_REAL csetemp317 CCTK_ATTRIBUTE_UNUSED = dg233*gu23;\n+ \n+ CCTK_REAL csetemp318 CCTK_ATTRIBUTE_UNUSED = dg133*gu12;\n+ \n+ CCTK_REAL csetemp319 CCTK_ATTRIBUTE_UNUSED = dg233*gu22;\n+ \n+ CCTK_REAL csetemp320 CCTK_ATTRIBUTE_UNUSED = dg333*gu23;\n+ \n+ CCTK_REAL dgu223 CCTK_ATTRIBUTE_UNUSED = -((csetemp313 + csetemp314 + \n+ csetemp315)*gu12) - (csetemp305 + csetemp316 + csetemp317)*gu22 - \n+ (csetemp318 + csetemp319 + csetemp320)*gu23;\n+ \n+ CCTK_REAL dgu233 CCTK_ATTRIBUTE_UNUSED = -((csetemp313 + csetemp314 + \n+ csetemp315)*gu13) - (csetemp305 + csetemp316 + csetemp317)*gu23 - \n+ (csetemp318 + csetemp319 + csetemp320)*gu33;\n+ \n+ CCTK_REAL dgu333 CCTK_ATTRIBUTE_UNUSED = -(gu13*(dg113*gu13 + \n+ dg123*gu23 + dg133*gu33)) - gu23*(dg123*gu13 + dg223*gu23 + dg233*gu33) \n+ - gu33*(csetemp306 + csetemp317 + dg333*gu33);\n+ \n+ CCTK_REAL dtbetal1 CCTK_ATTRIBUTE_UNUSED = dg4010;\n+ \n+ CCTK_REAL dtbetal2 CCTK_ATTRIBUTE_UNUSED = dg4020;\n+ \n+ CCTK_REAL dtbetal3 CCTK_ATTRIBUTE_UNUSED = dg4030;\n+ \n+ CCTK_REAL dbetal11 CCTK_ATTRIBUTE_UNUSED = dg4011;\n+ \n+ CCTK_REAL dbetal12 CCTK_ATTRIBUTE_UNUSED = dg4012;\n+ \n+ CCTK_REAL dbetal13 CCTK_ATTRIBUTE_UNUSED = dg4013;\n+ \n+ CCTK_REAL dbetal21 CCTK_ATTRIBUTE_UNUSED = dg4021;\n+ \n+ CCTK_REAL dbetal22 CCTK_ATTRIBUTE_UNUSED = dg4022;\n+ \n+ CCTK_REAL dbetal23 CCTK_ATTRIBUTE_UNUSED = dg4023;\n+ \n+ CCTK_REAL dbetal31 CCTK_ATTRIBUTE_UNUSED = dg4031;\n+ \n+ CCTK_REAL dbetal32 CCTK_ATTRIBUTE_UNUSED = dg4032;\n+ \n+ CCTK_REAL dbetal33 CCTK_ATTRIBUTE_UNUSED = dg4033;\n+ \n+ dtbetaExact1L = betal1*dtgu11 + betal2*dtgu12 + betal3*dtgu13 + \n+ dtbetal1*gu11 + dtbetal2*gu12 + dtbetal3*gu13;\n+ \n+ dtbetaExact2L = betal1*dtgu12 + betal2*dtgu22 + betal3*dtgu23 + \n+ dtbetal1*gu12 + dtbetal2*gu22 + dtbetal3*gu23;\n+ \n+ dtbetaExact3L = betal1*dtgu13 + betal2*dtgu23 + betal3*dtgu33 + \n+ dtbetal1*gu13 + dtbetal2*gu23 + dtbetal3*gu33;\n+ \n+ CCTK_REAL dbeta11 CCTK_ATTRIBUTE_UNUSED = betal1*dgu111 + \n+ betal2*dgu121 + betal3*dgu131 + dbetal11*gu11 + dbetal21*gu12 + \n+ dbetal31*gu13;\n+ \n+ CCTK_REAL dbeta21 CCTK_ATTRIBUTE_UNUSED = betal1*dgu121 + \n+ betal2*dgu221 + betal3*dgu231 + dbetal11*gu12 + dbetal21*gu22 + \n+ dbetal31*gu23;\n+ \n+ CCTK_REAL dbeta31 CCTK_ATTRIBUTE_UNUSED = betal1*dgu131 + \n+ betal2*dgu231 + betal3*dgu331 + dbetal11*gu13 + dbetal21*gu23 + \n+ dbetal31*gu33;\n+ \n+ CCTK_REAL dbeta12 CCTK_ATTRIBUTE_UNUSED = betal1*dgu112 + \n+ betal2*dgu122 + betal3*dgu132 + dbetal12*gu11 + dbetal22*gu12 + \n+ dbetal32*gu13;\n+ \n+ CCTK_REAL dbeta22 CCTK_ATTRIBUTE_UNUSED = betal1*dgu122 + \n+ betal2*dgu222 + betal3*dgu232 + dbetal12*gu12 + dbetal22*gu22 + \n+ dbetal32*gu23;\n+ \n+ CCTK_REAL dbeta32 CCTK_ATTRIBUTE_UNUSED = betal1*dgu132 + \n+ betal2*dgu232 + betal3*dgu332 + dbetal12*gu13 + dbetal22*gu23 + \n+ dbetal32*gu33;\n+ \n+ CCTK_REAL dbeta13 CCTK_ATTRIBUTE_UNUSED = betal1*dgu113 + \n+ betal2*dgu123 + betal3*dgu133 + dbetal13*gu11 + dbetal23*gu12 + \n+ dbetal33*gu13;\n+ \n+ CCTK_REAL dbeta23 CCTK_ATTRIBUTE_UNUSED = betal1*dgu123 + \n+ betal2*dgu223 + betal3*dgu233 + dbetal13*gu12 + dbetal23*gu22 + \n+ dbetal33*gu23;\n+ \n+ CCTK_REAL dbeta33 CCTK_ATTRIBUTE_UNUSED = betal1*dgu133 + \n+ betal2*dgu233 + betal3*dgu333 + dbetal13*gu13 + dbetal23*gu23 + \n+ dbetal33*gu33;\n+ \n+ CCTK_REAL dtbetasq CCTK_ATTRIBUTE_UNUSED = dtbetaExact1L*betal1 + \n+ dtbetaExact2L*betal2 + dtbetaExact3L*betal3 + betaExact1L*dtbetal1 + \n+ betaExact2L*dtbetal2 + betaExact3L*dtbetal3;\n+ \n+ CCTK_REAL csetemp321 CCTK_ATTRIBUTE_UNUSED = pow(alpExactL,-1);\n+ \n+ CCTK_REAL dtalpExactL CCTK_ATTRIBUTE_UNUSED = 0.5*csetemp321*(-dg4000 \n+ + dtbetasq);\n+ \n+ CCTK_REAL kExact11L CCTK_ATTRIBUTE_UNUSED = \n+ 0.5*csetemp321*(2*(gExact11L*dbeta11 + gExact12L*dbeta21 + \n+ gExact13L*dbeta31) + betaExact1L*dg111 + betaExact2L*dg112 + \n+ betaExact3L*dg113 - dtg11);\n+ \n+ CCTK_REAL kExact12L CCTK_ATTRIBUTE_UNUSED = \n+ 0.5*csetemp321*(gExact11L*dbeta12 + gExact22L*dbeta21 + \n+ gExact12L*(dbeta11 + dbeta22) + gExact23L*dbeta31 + gExact13L*dbeta32 + \n+ betaExact1L*dg121 + betaExact2L*dg122 + betaExact3L*dg123 - dtg12);\n+ \n+ CCTK_REAL kExact13L CCTK_ATTRIBUTE_UNUSED = \n+ 0.5*csetemp321*(gExact11L*dbeta13 + gExact23L*dbeta21 + \n+ gExact12L*dbeta23 + gExact33L*dbeta31 + gExact13L*(dbeta11 + dbeta33) + \n+ betaExact1L*dg131 + betaExact2L*dg132 + betaExact3L*dg133 - dtg13);\n+ \n+ CCTK_REAL kExact22L CCTK_ATTRIBUTE_UNUSED = \n+ 0.5*csetemp321*(2*(gExact12L*dbeta12 + gExact22L*dbeta22 + \n+ gExact23L*dbeta32) + betaExact1L*dg221 + betaExact2L*dg222 + \n+ betaExact3L*dg223 - dtg22);\n+ \n+ CCTK_REAL kExact23L CCTK_ATTRIBUTE_UNUSED = \n+ 0.5*csetemp321*(gExact13L*dbeta12 + gExact12L*dbeta13 + \n+ gExact22L*dbeta23 + gExact33L*dbeta32 + gExact23L*(dbeta22 + dbeta33) + \n+ betaExact1L*dg231 + betaExact2L*dg232 + betaExact3L*dg233 - dtg23);\n+ \n+ CCTK_REAL kExact33L CCTK_ATTRIBUTE_UNUSED = \n+ 0.5*csetemp321*(2*(gExact13L*dbeta13 + gExact23L*dbeta23 + \n+ gExact33L*dbeta33) + betaExact1L*dg331 + betaExact2L*dg332 + \n+ betaExact3L*dg333 - dtg33);\n+ /* Copy local copies back to grid functions */\n+ alpExact[index] = alpExactL;\n+ betaExact1[index] = betaExact1L;\n+ betaExact2[index] = betaExact2L;\n+ betaExact3[index] = betaExact3L;\n+ dtalpExact[index] = dtalpExactL;\n+ dtbetaExact1[index] = dtbetaExact1L;\n+ dtbetaExact2[index] = dtbetaExact2L;\n+ dtbetaExact3[index] = dtbetaExact3L;\n+ gExact11[index] = gExact11L;\n+ gExact12[index] = gExact12L;\n+ gExact13[index] = gExact13L;\n+ gExact22[index] = gExact22L;\n+ gExact23[index] = gExact23L;\n+ gExact33[index] = gExact33L;\n+ kExact11[index] = kExact11L;\n+ kExact12[index] = kExact12L;\n+ kExact13[index] = kExact13L;\n+ kExact22[index] = kExact22L;\n+ kExact23[index] = kExact23L;\n+ kExact33[index] = kExact33L;\n+ }\n+ CCTK_ENDLOOP3(KerrSchild_exact);\n+}\n+extern \"C\" void KerrSchild_exact(CCTK_ARGUMENTS)\n+{\n+ DECLARE_CCTK_ARGUMENTS;\n+ DECLARE_CCTK_PARAMETERS;\n+ \n+ if (verbose > 1)\n+ {\n+ CCTK_VInfo(CCTK_THORNSTRING,\"Entering KerrSchild_exact_Body\");\n+ }\n+ if (cctk_iteration % KerrSchild_exact_calc_every != KerrSchild_exact_calc_offset)\n+ {\n+ return;\n+ }\n+ \n+ const char* const groups[] = {\n+ \"admbase::metric\",\n+ \"KerrSchild::curv_exact\",\n+ \"KerrSchild::dtlapse_exact\",\n+ \"KerrSchild::dtshift_exact\",\n+ \"grid::coordinates\",\n+ \"KerrSchild::lapse_exact\",\n+ \"KerrSchild::metric_exact\",\n+ \"KerrSchild::shift_exact\"};\n+ AssertGroupStorage(cctkGH, \"KerrSchild_exact\", 8, groups);\n+ \n+ \n+ LoopOverEverything(cctkGH, KerrSchild_exact_Body);\n+ if (verbose > 1)\n+ {\n+ CCTK_VInfo(CCTK_THORNSTRING,\"Leaving KerrSchild_exact_Body\");\n+ }\n+}\n+\n+} // namespace KerrSchild"}, "test": {"test_patch": "diff --git a/all_tests.txt b/all_tests.txt\nnew file mode 100644\nindex 0000000..0000000\n--- /dev/null\n+++ b/all_tests.txt\n@@ -0,0 +1,7 @@\n+GaugeWave\n+KS-tilted-EE\n+KerrSchild\n+Minkowski\n+ModifiedSchwarzschildBL\n+ShiftedGaugeWave\n+Vaidya2", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}23{"question_id": "MSB_einsteintoolkit_Cactus_pr3", "question_type": "multi_swe_bench", "description": "Add missing Boundary.c in CactusWave/WaveToyExtra (einsteintoolkit/Cactus#3)", "content": {"org": "einsteintoolkit", "repo": "Cactus", "pr_number": 3, "issue_title": "Add missing Boundary.c in CactusWave/WaveToyExtra", "issue_body": "This PR adds the missing source file Boundary.c to complete the CactusWave/WaveToyExtra thorn implementation.", "base_commit": "HEAD", "resolved_issues": [{"number": 3, "title": "Implement the full functionality of WaveToyExtra", "body": "Please implement the full functionality of `WaveToyExtra` by finishing the code in `Boundary.c`.\n\n## Thorn Information:\n- Name: WaveToyExtra\n- Target file: Boundary.c\n\n## Interface Definition in interface.ccl:\n\n## Schedule Definition in schedule.ccl:\n\n## Parameters Definition in param.ccl:\n\n## Configuration Definition in configuration.ccl:\n\n## Documentation Context in readme.md and doc/documentation.tex\n\n## Related Code Context in src folder\n\n"}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/einsteintoolkit_m_cactus:pr-3", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/arrangements/CactusWave/WaveToyExtra/src/Boundary.c b/arrangements/CactusWave/WaveToyExtra/src/Boundary.c\nnew file mode 100644\nindex 0000000..0000000\n--- /dev/null\n+++ b/arrangements/CactusWave/WaveToyExtra/src/Boundary.c\n@@ -0,0 +1,106 @@\n+/*@@\n+ @file Boundary.c\n+ @date Friday 18th July 2003\n+ @author Gabrielle Allen\n+ @desc\n+ Use any provided boundary condition with WaveToy\n+ @enddesc\n+ @version $Id$\n+ @@*/\n+\n+#include \"cctk.h\"\n+#include \"cctk_Arguments.h\"\n+#include \"cctk_Parameters.h\"\n+\n+#include \"util_Table.h\"\n+\n+static const char *rcsid = \"$Header$\";\n+\n+CCTK_FILEVERSION(CactusWave_WaveToyExtra_Boundary_c);\n+\n+/********************************************************************\n+ ********************* Local Data Types ***********************\n+ ********************************************************************/\n+\n+/********************************************************************\n+ ********************* Local Routine Prototypes *********************\n+ ********************************************************************/\n+\n+/********************************************************************\n+ ********************* Other Routine Prototypes *********************\n+ ********************************************************************/\n+\n+void WaveToyExtra_Boundary(CCTK_ARGUMENTS);\n+\n+/********************************************************************\n+ ********************* Local Data *****************************\n+ ********************************************************************/\n+\n+static int handle=-1;\n+\n+/********************************************************************\n+ ********************* External Routines **********************\n+ ********************************************************************/\n+\n+ /*@@\n+ @routine WaveToyC_Boundary\n+ @date Friday 18th July 2003\n+ @author Gabrielle Allen\n+ @desc \n+ Mark wavetoy variables for custom boundary condition\n+ @enddesc \n+ @history \n+ @endhistory \n+@@*/\n+\n+void WaveToyExtra_Boundary(CCTK_ARGUMENTS)\n+{\n+ DECLARE_CCTK_ARGUMENTS;\n+ DECLARE_CCTK_PARAMETERS;\n+\n+ CCTK_INT ierr=0;\n+\n+ if (CCTK_EQUALS(bound,\"custom\"))\n+ {\n+ if (!CCTK_EQUALS(custom_options,\"\"))\n+ {\n+ if (handle == -1)\n+ {\n+ handle = Util_TableCreateFromString(custom_options);\n+ if (handle < 0)\n+ {\n+ CCTK_VWarn(0,__LINE__,__FILE__,CCTK_THORNSTRING,\n+ \"WaveToyC_Boundaries: Error creating table for \"\n+ \"boundary condition %s\",custom_bound);\n+ }\n+ }\n+ }\n+ ierr = Boundary_SelectVarForBC(cctkGH, CCTK_ALL_FACES, 1, handle, \n+ \"wavetoy::phi\",custom_bound); \n+ } \n+\n+ if (ierr < 0) \n+ {\n+ CCTK_VWarn(0,__LINE__,__FILE__,CCTK_THORNSTRING,\n+ \"WaveToyC_Boundaries: Error selecting boundary \"\n+ \"condition %s\",bound);\n+ }\n+\n+ return;\n+}\n+\n+\n+ /*@@\n+ @routine WaveToyC_Terminate\n+ @date Friday 18th July 2003\n+ @author Gabrielle Allen\n+ @desc \n+ Tidy up wavetoy\n+ @enddesc \n+ @history \n+ @endhistory \n+@@*/\n+void WaveToyC_Terminate(CCTK_ARGUMENTS)\n+{\n+ Util_TableDestroy(handle);\n+}"}, "test": {"test_patch": "diff --git a/all_tests.txt b/all_tests.txt\nnew file mode 100644\nindex 0000000..0000000\n--- /dev/null\n+++ b/all_tests.txt\n@@ -0,0 +1,1 @@\n+test_custom", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}24{"question_id": "MSB_einsteintoolkit_Cactus_pr30", "question_type": "multi_swe_bench", "description": "Add missing KerrSchild_always.cc in EinsteinExact/KerrSchild (einsteintoolkit/Cactus#30)", "content": {"org": "einsteintoolkit", "repo": "Cactus", "pr_number": 30, "issue_title": "Add missing KerrSchild_always.cc in EinsteinExact/KerrSchild", "issue_body": "This PR adds the missing source file KerrSchild_always.cc to complete the EinsteinExact/KerrSchild thorn implementation.", "base_commit": "HEAD", "resolved_issues": [{"number": 30, "title": "Implement the full functionality of KerrSchild", "body": "Please implement the full functionality of `KerrSchild` by finishing the code in `KerrSchild_always.cc`.\n\n## Thorn Information:\n- Name: KerrSchild\n- Target file: KerrSchild_always.cc\n\n## Interface Definition in interface.ccl:\n\n## Schedule Definition in schedule.ccl:\n\n## Parameters Definition in param.ccl:\n\n## Configuration Definition in configuration.ccl:\n\n## Documentation Context in readme.md and doc/documentation.tex\n\n## Related Code Context in src folder\n\n"}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/einsteintoolkit_m_cactus:pr-30", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/arrangements/EinsteinExact/KerrSchild/src/KerrSchild_always.cc b/arrangements/EinsteinExact/KerrSchild/src/KerrSchild_always.cc\nnew file mode 100644\nindex 0000000..0000000\n--- /dev/null\n+++ b/arrangements/EinsteinExact/KerrSchild/src/KerrSchild_always.cc\n@@ -0,0 +1,2349 @@\n+/* File produced by Kranc */\n+\n+#define KRANC_C\n+\n+#include <algorithm>\n+#include <assert.h>\n+#include <math.h>\n+#include <stdio.h>\n+#include <stdlib.h>\n+#include <string.h>\n+#include \"cctk.h\"\n+#include \"cctk_Arguments.h\"\n+#include \"cctk_Parameters.h\"\n+#include \"Kranc.hh\"\n+#include \"Differencing.h\"\n+#include \"loopcontrol.h\"\n+\n+namespace KerrSchild {\n+\n+\n+static void KerrSchild_always_Body(const cGH* restrict const cctkGH, const int dir, const int face, const CCTK_REAL normal[3], const CCTK_REAL tangentA[3], const CCTK_REAL tangentB[3], const int imin[3], const int imax[3], const int n_subblock_gfs, CCTK_REAL* restrict const subblock_gfs[])\n+{\n+ DECLARE_CCTK_ARGUMENTS;\n+ DECLARE_CCTK_PARAMETERS;\n+ \n+ /* Include user-supplied include files */\n+ /* Initialise finite differencing variables */\n+ const ptrdiff_t di CCTK_ATTRIBUTE_UNUSED = 1;\n+ const ptrdiff_t dj CCTK_ATTRIBUTE_UNUSED = \n+ CCTK_GFINDEX3D(cctkGH,0,1,0) - CCTK_GFINDEX3D(cctkGH,0,0,0);\n+ const ptrdiff_t dk CCTK_ATTRIBUTE_UNUSED = \n+ CCTK_GFINDEX3D(cctkGH,0,0,1) - CCTK_GFINDEX3D(cctkGH,0,0,0);\n+ const ptrdiff_t cdi CCTK_ATTRIBUTE_UNUSED = sizeof(CCTK_REAL) * di;\n+ const ptrdiff_t cdj CCTK_ATTRIBUTE_UNUSED = sizeof(CCTK_REAL) * dj;\n+ const ptrdiff_t cdk CCTK_ATTRIBUTE_UNUSED = sizeof(CCTK_REAL) * dk;\n+ const ptrdiff_t cctkLbnd1 CCTK_ATTRIBUTE_UNUSED = cctk_lbnd[0];\n+ const ptrdiff_t cctkLbnd2 CCTK_ATTRIBUTE_UNUSED = cctk_lbnd[1];\n+ const ptrdiff_t cctkLbnd3 CCTK_ATTRIBUTE_UNUSED = cctk_lbnd[2];\n+ const CCTK_REAL t CCTK_ATTRIBUTE_UNUSED = cctk_time;\n+ const CCTK_REAL cctkOriginSpace1 CCTK_ATTRIBUTE_UNUSED = \n+ CCTK_ORIGIN_SPACE(0);\n+ const CCTK_REAL cctkOriginSpace2 CCTK_ATTRIBUTE_UNUSED = \n+ CCTK_ORIGIN_SPACE(1);\n+ const CCTK_REAL cctkOriginSpace3 CCTK_ATTRIBUTE_UNUSED = \n+ CCTK_ORIGIN_SPACE(2);\n+ const CCTK_REAL dt CCTK_ATTRIBUTE_UNUSED = CCTK_DELTA_TIME;\n+ const CCTK_REAL dx CCTK_ATTRIBUTE_UNUSED = CCTK_DELTA_SPACE(0);\n+ const CCTK_REAL dy CCTK_ATTRIBUTE_UNUSED = CCTK_DELTA_SPACE(1);\n+ const CCTK_REAL dz CCTK_ATTRIBUTE_UNUSED = CCTK_DELTA_SPACE(2);\n+ const CCTK_REAL dxi CCTK_ATTRIBUTE_UNUSED = pow(dx,-1);\n+ const CCTK_REAL dyi CCTK_ATTRIBUTE_UNUSED = pow(dy,-1);\n+ const CCTK_REAL dzi CCTK_ATTRIBUTE_UNUSED = pow(dz,-1);\n+ const CCTK_REAL khalf CCTK_ATTRIBUTE_UNUSED = 0.5;\n+ const CCTK_REAL kthird CCTK_ATTRIBUTE_UNUSED = \n+ 0.333333333333333333333333333333;\n+ const CCTK_REAL ktwothird CCTK_ATTRIBUTE_UNUSED = \n+ 0.666666666666666666666666666667;\n+ const CCTK_REAL kfourthird CCTK_ATTRIBUTE_UNUSED = \n+ 1.33333333333333333333333333333;\n+ const CCTK_REAL hdxi CCTK_ATTRIBUTE_UNUSED = 0.5*dxi;\n+ const CCTK_REAL hdyi CCTK_ATTRIBUTE_UNUSED = 0.5*dyi;\n+ const CCTK_REAL hdzi CCTK_ATTRIBUTE_UNUSED = 0.5*dzi;\n+ /* Initialize predefined quantities */\n+ /* Assign local copies of arrays functions */\n+ \n+ \n+ /* Calculate temporaries and arrays functions */\n+ /* Copy local copies back to grid functions */\n+ /* Loop over the grid points */\n+ const int imin0=imin[0];\n+ const int imin1=imin[1];\n+ const int imin2=imin[2];\n+ const int imax0=imax[0];\n+ const int imax1=imax[1];\n+ const int imax2=imax[2];\n+ #pragma omp parallel\n+ CCTK_LOOP3(KerrSchild_always,\n+ i,j,k, imin0,imin1,imin2, imax0,imax1,imax2,\n+ cctk_ash[0],cctk_ash[1],cctk_ash[2])\n+ {\n+ const ptrdiff_t index CCTK_ATTRIBUTE_UNUSED = di*i + dj*j + dk*k;\n+ /* Assign local copies of grid functions */\n+ \n+ CCTK_REAL alpL CCTK_ATTRIBUTE_UNUSED = alp[index];\n+ CCTK_REAL betaxL CCTK_ATTRIBUTE_UNUSED = betax[index];\n+ CCTK_REAL betayL CCTK_ATTRIBUTE_UNUSED = betay[index];\n+ CCTK_REAL betazL CCTK_ATTRIBUTE_UNUSED = betaz[index];\n+ CCTK_REAL dtbetaxL CCTK_ATTRIBUTE_UNUSED = dtbetax[index];\n+ CCTK_REAL dtbetayL CCTK_ATTRIBUTE_UNUSED = dtbetay[index];\n+ CCTK_REAL dtbetazL CCTK_ATTRIBUTE_UNUSED = dtbetaz[index];\n+ CCTK_REAL gxxL CCTK_ATTRIBUTE_UNUSED = gxx[index];\n+ CCTK_REAL gxyL CCTK_ATTRIBUTE_UNUSED = gxy[index];\n+ CCTK_REAL gxzL CCTK_ATTRIBUTE_UNUSED = gxz[index];\n+ CCTK_REAL gyyL CCTK_ATTRIBUTE_UNUSED = gyy[index];\n+ CCTK_REAL gyzL CCTK_ATTRIBUTE_UNUSED = gyz[index];\n+ CCTK_REAL gzzL CCTK_ATTRIBUTE_UNUSED = gzz[index];\n+ CCTK_REAL xL CCTK_ATTRIBUTE_UNUSED = x[index];\n+ CCTK_REAL yL CCTK_ATTRIBUTE_UNUSED = y[index];\n+ CCTK_REAL zL CCTK_ATTRIBUTE_UNUSED = z[index];\n+ \n+ /* Include user supplied include files */\n+ /* Precompute derivatives */\n+ /* Calculate temporaries and grid functions */\n+ CCTK_REAL xform1L00 CCTK_ATTRIBUTE_UNUSED = 1;\n+ \n+ CCTK_REAL xform1L01 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL xform1L02 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL xform1L03 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL xform1L10 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL csetemp0 CCTK_ATTRIBUTE_UNUSED = cos(phi);\n+ \n+ CCTK_REAL csetemp1 CCTK_ATTRIBUTE_UNUSED = cos(psi);\n+ \n+ CCTK_REAL csetemp2 CCTK_ATTRIBUTE_UNUSED = cos(theta);\n+ \n+ CCTK_REAL csetemp3 CCTK_ATTRIBUTE_UNUSED = sin(phi);\n+ \n+ CCTK_REAL csetemp4 CCTK_ATTRIBUTE_UNUSED = sin(psi);\n+ \n+ CCTK_REAL xform1L11 CCTK_ATTRIBUTE_UNUSED = csetemp0*csetemp1 - \n+ csetemp2*csetemp3*csetemp4;\n+ \n+ CCTK_REAL xform1L12 CCTK_ATTRIBUTE_UNUSED = csetemp1*csetemp3 + \n+ csetemp0*csetemp2*csetemp4;\n+ \n+ CCTK_REAL csetemp5 CCTK_ATTRIBUTE_UNUSED = sin(theta);\n+ \n+ CCTK_REAL xform1L13 CCTK_ATTRIBUTE_UNUSED = csetemp4*csetemp5;\n+ \n+ CCTK_REAL xform1L20 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL xform1L21 CCTK_ATTRIBUTE_UNUSED = \n+ -(csetemp1*csetemp2*csetemp3) - csetemp0*csetemp4;\n+ \n+ CCTK_REAL xform1L22 CCTK_ATTRIBUTE_UNUSED = csetemp0*csetemp1*csetemp2 \n+ - csetemp3*csetemp4;\n+ \n+ CCTK_REAL xform1L23 CCTK_ATTRIBUTE_UNUSED = csetemp1*csetemp5;\n+ \n+ CCTK_REAL xform1L30 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL xform1L31 CCTK_ATTRIBUTE_UNUSED = csetemp3*csetemp5;\n+ \n+ CCTK_REAL xform1L32 CCTK_ATTRIBUTE_UNUSED = -(csetemp0*csetemp5);\n+ \n+ CCTK_REAL xform1L33 CCTK_ATTRIBUTE_UNUSED = csetemp2;\n+ \n+ CCTK_REAL csetemp6 CCTK_ATTRIBUTE_UNUSED = pow(boostx,2);\n+ \n+ CCTK_REAL csetemp7 CCTK_ATTRIBUTE_UNUSED = pow(boosty,2);\n+ \n+ CCTK_REAL csetemp8 CCTK_ATTRIBUTE_UNUSED = pow(boostz,2);\n+ \n+ CCTK_REAL csetemp9 CCTK_ATTRIBUTE_UNUSED = pow(lapsefactor,-1);\n+ \n+ CCTK_REAL xform2L00 CCTK_ATTRIBUTE_UNUSED = csetemp9*(-1 + \n+ boostx*shiftaddx + boosty*shiftaddy + boostz*shiftaddz)*(1 - csetemp6 - \n+ csetemp7 - csetemp8 + pow(1 - csetemp6 - csetemp7 - \n+ csetemp8,0.5))*pow(-1 + csetemp6 + csetemp7 + csetemp8,-1)*pow(1 + \n+ pow(1 - csetemp6 - csetemp7 - csetemp8,0.5),-1);\n+ \n+ CCTK_REAL xform2L01 CCTK_ATTRIBUTE_UNUSED = boostx*csetemp9*(1 - \n+ csetemp6 - csetemp7 - csetemp8 + pow(1 - csetemp6 - csetemp7 - \n+ csetemp8,0.5))*pow(-1 + csetemp6 + csetemp7 + csetemp8,-1)*pow(1 + \n+ pow(1 - csetemp6 - csetemp7 - csetemp8,0.5),-1);\n+ \n+ CCTK_REAL xform2L02 CCTK_ATTRIBUTE_UNUSED = boosty*csetemp9*(1 - \n+ csetemp6 - csetemp7 - csetemp8 + pow(1 - csetemp6 - csetemp7 - \n+ csetemp8,0.5))*pow(-1 + csetemp6 + csetemp7 + csetemp8,-1)*pow(1 + \n+ pow(1 - csetemp6 - csetemp7 - csetemp8,0.5),-1);\n+ \n+ CCTK_REAL xform2L03 CCTK_ATTRIBUTE_UNUSED = boostz*csetemp9*(1 - \n+ csetemp6 - csetemp7 - csetemp8 + pow(1 - csetemp6 - csetemp7 - \n+ csetemp8,0.5))*pow(-1 + csetemp6 + csetemp7 + csetemp8,-1)*pow(1 + \n+ pow(1 - csetemp6 - csetemp7 - csetemp8,0.5),-1);\n+ \n+ CCTK_REAL xform2L10 CCTK_ATTRIBUTE_UNUSED = (-(boostx*(-1 + csetemp6 + \n+ csetemp7 + csetemp8 + (-1 + boosty*shiftaddy + boostz*shiftaddz)*pow(1 \n+ - csetemp6 - csetemp7 - csetemp8,0.5))) + shiftaddx*(csetemp6 + (-1 + \n+ csetemp7 + csetemp8)*(1 + pow(1 - csetemp6 - csetemp7 - \n+ csetemp8,0.5))))*pow(-1 + csetemp6 + csetemp7 + csetemp8,-1)*pow(1 + \n+ pow(1 - csetemp6 - csetemp7 - csetemp8,0.5),-1);\n+ \n+ CCTK_REAL xform2L11 CCTK_ATTRIBUTE_UNUSED = (csetemp6 + (-1 + csetemp7 \n+ + csetemp8)*(1 + pow(1 - csetemp6 - csetemp7 - csetemp8,0.5)))*pow(-1 + \n+ csetemp6 + csetemp7 + csetemp8,-1)*pow(1 + pow(1 - csetemp6 - csetemp7 \n+ - csetemp8,0.5),-1);\n+ \n+ CCTK_REAL xform2L12 CCTK_ATTRIBUTE_UNUSED = -(boostx*boosty*pow(-1 + \n+ csetemp6 + csetemp7 + csetemp8 - pow(1 - csetemp6 - csetemp7 - \n+ csetemp8,0.5),-1));\n+ \n+ CCTK_REAL xform2L13 CCTK_ATTRIBUTE_UNUSED = -(boostx*boostz*pow(-1 + \n+ csetemp6 + csetemp7 + csetemp8 - pow(1 - csetemp6 - csetemp7 - \n+ csetemp8,0.5),-1));\n+ \n+ CCTK_REAL xform2L20 CCTK_ATTRIBUTE_UNUSED = (-(boosty*(-1 + csetemp6 + \n+ csetemp7 + csetemp8 + (-1 + boostx*shiftaddx + boostz*shiftaddz)*pow(1 \n+ - csetemp6 - csetemp7 - csetemp8,0.5))) + shiftaddy*(csetemp7 + (-1 + \n+ csetemp6 + csetemp8)*(1 + pow(1 - csetemp6 - csetemp7 - \n+ csetemp8,0.5))))*pow(-1 + csetemp6 + csetemp7 + csetemp8,-1)*pow(1 + \n+ pow(1 - csetemp6 - csetemp7 - csetemp8,0.5),-1);\n+ \n+ CCTK_REAL xform2L21 CCTK_ATTRIBUTE_UNUSED = -(boostx*boosty*pow(-1 + \n+ csetemp6 + csetemp7 + csetemp8 - pow(1 - csetemp6 - csetemp7 - \n+ csetemp8,0.5),-1));\n+ \n+ CCTK_REAL xform2L22 CCTK_ATTRIBUTE_UNUSED = (csetemp7 + (-1 + csetemp6 \n+ + csetemp8)*(1 + pow(1 - csetemp6 - csetemp7 - csetemp8,0.5)))*pow(-1 + \n+ csetemp6 + csetemp7 + csetemp8,-1)*pow(1 + pow(1 - csetemp6 - csetemp7 \n+ - csetemp8,0.5),-1);\n+ \n+ CCTK_REAL xform2L23 CCTK_ATTRIBUTE_UNUSED = -(boosty*boostz*pow(-1 + \n+ csetemp6 + csetemp7 + csetemp8 - pow(1 - csetemp6 - csetemp7 - \n+ csetemp8,0.5),-1));\n+ \n+ CCTK_REAL xform2L30 CCTK_ATTRIBUTE_UNUSED = (shiftaddz*(-1 + csetemp6 \n+ + csetemp7 + csetemp8 + (-1 + csetemp6 + csetemp7)*pow(1 - csetemp6 - \n+ csetemp7 - csetemp8,0.5)) - boostz*(-1 + csetemp6 + csetemp7 + csetemp8 \n+ + (-1 + boostx*shiftaddx + boosty*shiftaddy)*pow(1 - csetemp6 - \n+ csetemp7 - csetemp8,0.5)))*pow(-1 + csetemp6 + csetemp7 + \n+ csetemp8,-1)*pow(1 + pow(1 - csetemp6 - csetemp7 - csetemp8,0.5),-1);\n+ \n+ CCTK_REAL xform2L31 CCTK_ATTRIBUTE_UNUSED = -(boostx*boostz*pow(-1 + \n+ csetemp6 + csetemp7 + csetemp8 - pow(1 - csetemp6 - csetemp7 - \n+ csetemp8,0.5),-1));\n+ \n+ CCTK_REAL xform2L32 CCTK_ATTRIBUTE_UNUSED = -(boosty*boostz*pow(-1 + \n+ csetemp6 + csetemp7 + csetemp8 - pow(1 - csetemp6 - csetemp7 - \n+ csetemp8,0.5),-1));\n+ \n+ CCTK_REAL xform2L33 CCTK_ATTRIBUTE_UNUSED = (-1 + csetemp6 + csetemp7 \n+ + csetemp8 + (-1 + csetemp6 + csetemp7)*pow(1 - csetemp6 - csetemp7 - \n+ csetemp8,0.5))*pow(-1 + csetemp6 + csetemp7 + csetemp8,-1)*pow(1 + \n+ pow(1 - csetemp6 - csetemp7 - csetemp8,0.5),-1);\n+ \n+ CCTK_REAL xformL00 CCTK_ATTRIBUTE_UNUSED = xform1L00*xform2L00 + \n+ xform1L01*xform2L10 + xform1L02*xform2L20 + xform1L03*xform2L30;\n+ \n+ CCTK_REAL xformL01 CCTK_ATTRIBUTE_UNUSED = xform1L00*xform2L01 + \n+ xform1L01*xform2L11 + xform1L02*xform2L21 + xform1L03*xform2L31;\n+ \n+ CCTK_REAL xformL02 CCTK_ATTRIBUTE_UNUSED = xform1L00*xform2L02 + \n+ xform1L01*xform2L12 + xform1L02*xform2L22 + xform1L03*xform2L32;\n+ \n+ CCTK_REAL xformL03 CCTK_ATTRIBUTE_UNUSED = xform1L00*xform2L03 + \n+ xform1L01*xform2L13 + xform1L02*xform2L23 + xform1L03*xform2L33;\n+ \n+ CCTK_REAL xformL10 CCTK_ATTRIBUTE_UNUSED = xform1L10*xform2L00 + \n+ xform1L11*xform2L10 + xform1L12*xform2L20 + xform1L13*xform2L30;\n+ \n+ CCTK_REAL xformL11 CCTK_ATTRIBUTE_UNUSED = xform1L10*xform2L01 + \n+ xform1L11*xform2L11 + xform1L12*xform2L21 + xform1L13*xform2L31;\n+ \n+ CCTK_REAL xformL12 CCTK_ATTRIBUTE_UNUSED = xform1L10*xform2L02 + \n+ xform1L11*xform2L12 + xform1L12*xform2L22 + xform1L13*xform2L32;\n+ \n+ CCTK_REAL xformL13 CCTK_ATTRIBUTE_UNUSED = xform1L10*xform2L03 + \n+ xform1L11*xform2L13 + xform1L12*xform2L23 + xform1L13*xform2L33;\n+ \n+ CCTK_REAL xformL20 CCTK_ATTRIBUTE_UNUSED = xform1L20*xform2L00 + \n+ xform1L21*xform2L10 + xform1L22*xform2L20 + xform1L23*xform2L30;\n+ \n+ CCTK_REAL xformL21 CCTK_ATTRIBUTE_UNUSED = xform1L20*xform2L01 + \n+ xform1L21*xform2L11 + xform1L22*xform2L21 + xform1L23*xform2L31;\n+ \n+ CCTK_REAL xformL22 CCTK_ATTRIBUTE_UNUSED = xform1L20*xform2L02 + \n+ xform1L21*xform2L12 + xform1L22*xform2L22 + xform1L23*xform2L32;\n+ \n+ CCTK_REAL xformL23 CCTK_ATTRIBUTE_UNUSED = xform1L20*xform2L03 + \n+ xform1L21*xform2L13 + xform1L22*xform2L23 + xform1L23*xform2L33;\n+ \n+ CCTK_REAL xformL30 CCTK_ATTRIBUTE_UNUSED = xform1L30*xform2L00 + \n+ xform1L31*xform2L10 + xform1L32*xform2L20 + xform1L33*xform2L30;\n+ \n+ CCTK_REAL xformL31 CCTK_ATTRIBUTE_UNUSED = xform1L30*xform2L01 + \n+ xform1L31*xform2L11 + xform1L32*xform2L21 + xform1L33*xform2L31;\n+ \n+ CCTK_REAL xformL32 CCTK_ATTRIBUTE_UNUSED = xform1L30*xform2L02 + \n+ xform1L31*xform2L12 + xform1L32*xform2L22 + xform1L33*xform2L32;\n+ \n+ CCTK_REAL xformL33 CCTK_ATTRIBUTE_UNUSED = xform1L30*xform2L03 + \n+ xform1L31*xform2L13 + xform1L32*xform2L23 + xform1L33*xform2L33;\n+ \n+ CCTK_REAL xx0 CCTK_ATTRIBUTE_UNUSED = t - timeoffset;\n+ \n+ CCTK_REAL xx1 CCTK_ATTRIBUTE_UNUSED = xL - positionx;\n+ \n+ CCTK_REAL xx2 CCTK_ATTRIBUTE_UNUSED = yL - positiony;\n+ \n+ CCTK_REAL xx3 CCTK_ATTRIBUTE_UNUSED = zL - positionz;\n+ \n+ CCTK_REAL txx1 CCTK_ATTRIBUTE_UNUSED = xformL10*xx0 + xformL11*xx1 + \n+ xformL12*xx2 + xformL13*xx3;\n+ \n+ CCTK_REAL txx2 CCTK_ATTRIBUTE_UNUSED = xformL20*xx0 + xformL21*xx1 + \n+ xformL22*xx2 + xformL23*xx3;\n+ \n+ CCTK_REAL txx3 CCTK_ATTRIBUTE_UNUSED = xformL30*xx0 + xformL31*xx1 + \n+ xformL32*xx2 + xformL33*xx3;\n+ \n+ CCTK_REAL X CCTK_ATTRIBUTE_UNUSED = txx1;\n+ \n+ CCTK_REAL Y CCTK_ATTRIBUTE_UNUSED = txx2;\n+ \n+ CCTK_REAL Z CCTK_ATTRIBUTE_UNUSED = txx3;\n+ \n+ CCTK_REAL csetemp10 CCTK_ATTRIBUTE_UNUSED = pow(a,2);\n+ \n+ CCTK_REAL csetemp11 CCTK_ATTRIBUTE_UNUSED = pow(X,2);\n+ \n+ CCTK_REAL csetemp12 CCTK_ATTRIBUTE_UNUSED = pow(Y,2);\n+ \n+ CCTK_REAL csetemp13 CCTK_ATTRIBUTE_UNUSED = pow(Z,2);\n+ \n+ CCTK_REAL rXYZ CCTK_ATTRIBUTE_UNUSED = \n+ 0.707106781186547524400844362105*pow(-csetemp10 + csetemp11 + csetemp12 \n+ + csetemp13 + pow(4*csetemp10*csetemp13 + pow(-csetemp10 + csetemp11 + \n+ csetemp12 + csetemp13,2),0.5),0.5);\n+ \n+ CCTK_REAL csetemp14 CCTK_ATTRIBUTE_UNUSED = pow(rXYZ,3);\n+ \n+ CCTK_REAL csetemp15 CCTK_ATTRIBUTE_UNUSED = pow(rXYZ,4);\n+ \n+ CCTK_REAL tg400 CCTK_ATTRIBUTE_UNUSED = -1 + \n+ 2*csetemp14*M*pow(csetemp10*csetemp13 + csetemp15,-1);\n+ \n+ CCTK_REAL csetemp16 CCTK_ATTRIBUTE_UNUSED = pow(rXYZ,2);\n+ \n+ CCTK_REAL csetemp17 CCTK_ATTRIBUTE_UNUSED = rXYZ*X;\n+ \n+ CCTK_REAL csetemp18 CCTK_ATTRIBUTE_UNUSED = a*Y;\n+ \n+ CCTK_REAL tg401 CCTK_ATTRIBUTE_UNUSED = 2*csetemp14*(csetemp17 + \n+ csetemp18)*M*pow(csetemp10*csetemp13 + csetemp15,-1)*pow(csetemp10 + \n+ csetemp16,-1);\n+ \n+ CCTK_REAL csetemp19 CCTK_ATTRIBUTE_UNUSED = a*X;\n+ \n+ CCTK_REAL csetemp20 CCTK_ATTRIBUTE_UNUSED = -csetemp19;\n+ \n+ CCTK_REAL csetemp21 CCTK_ATTRIBUTE_UNUSED = rXYZ*Y;\n+ \n+ CCTK_REAL tg402 CCTK_ATTRIBUTE_UNUSED = 2*csetemp14*(csetemp20 + \n+ csetemp21)*M*pow(csetemp10*csetemp13 + csetemp15,-1)*pow(csetemp10 + \n+ csetemp16,-1);\n+ \n+ CCTK_REAL tg403 CCTK_ATTRIBUTE_UNUSED = \n+ 2*csetemp16*M*Z*pow(csetemp10*csetemp13 + csetemp15,-1);\n+ \n+ CCTK_REAL tg411 CCTK_ATTRIBUTE_UNUSED = 1 + \n+ 2*csetemp14*M*pow(csetemp10*csetemp13 + csetemp15,-1)*pow(csetemp10 + \n+ csetemp16,-2)*pow(csetemp17 + csetemp18,2);\n+ \n+ CCTK_REAL tg412 CCTK_ATTRIBUTE_UNUSED = 2*csetemp14*(csetemp17 + \n+ csetemp18)*(csetemp20 + csetemp21)*M*pow(csetemp10*csetemp13 + \n+ csetemp15,-1)*pow(csetemp10 + csetemp16,-2);\n+ \n+ CCTK_REAL tg413 CCTK_ATTRIBUTE_UNUSED = 2*csetemp16*(csetemp17 + \n+ csetemp18)*M*Z*pow(csetemp10*csetemp13 + csetemp15,-1)*pow(csetemp10 + \n+ csetemp16,-1);\n+ \n+ CCTK_REAL tg422 CCTK_ATTRIBUTE_UNUSED = 1 + \n+ 2*csetemp14*M*pow(csetemp10*csetemp13 + csetemp15,-1)*pow(csetemp10 + \n+ csetemp16,-2)*pow(csetemp20 + csetemp21,2);\n+ \n+ CCTK_REAL tg423 CCTK_ATTRIBUTE_UNUSED = 2*csetemp16*(csetemp20 + \n+ csetemp21)*M*Z*pow(csetemp10*csetemp13 + csetemp15,-1)*pow(csetemp10 + \n+ csetemp16,-1);\n+ \n+ CCTK_REAL tg433 CCTK_ATTRIBUTE_UNUSED = 1 + \n+ 2*csetemp13*M*rXYZ*pow(csetemp10*csetemp13 + csetemp15,-1);\n+ \n+ CCTK_REAL tdg4000 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL csetemp22 CCTK_ATTRIBUTE_UNUSED = pow(rXYZ,7);\n+ \n+ CCTK_REAL tdg4001 CCTK_ATTRIBUTE_UNUSED = \n+ 2*(3*csetemp10*csetemp13*csetemp14 - \n+ csetemp22)*M*X*pow(csetemp10*csetemp13 + \n+ csetemp15,-2)*pow(4*csetemp10*csetemp13 + pow(-csetemp10 + csetemp11 + \n+ csetemp12 + csetemp13,2),-0.5);\n+ \n+ CCTK_REAL tdg4002 CCTK_ATTRIBUTE_UNUSED = \n+ 2*(3*csetemp10*csetemp13*csetemp14 - \n+ csetemp22)*M*Y*pow(csetemp10*csetemp13 + \n+ csetemp15,-2)*pow(4*csetemp10*csetemp13 + pow(-csetemp10 + csetemp11 + \n+ csetemp12 + csetemp13,2),-0.5);\n+ \n+ CCTK_REAL csetemp23 CCTK_ATTRIBUTE_UNUSED = pow(rXYZ,6);\n+ \n+ CCTK_REAL csetemp24 CCTK_ATTRIBUTE_UNUSED = pow(a,4);\n+ \n+ CCTK_REAL tdg4003 CCTK_ATTRIBUTE_UNUSED = 2*(csetemp10*(-5*csetemp15 + \n+ (-2*csetemp10 + 2*(csetemp11 + csetemp12) + 5*csetemp13)*csetemp16) - \n+ csetemp23 + 3*csetemp13*csetemp24)*M*rXYZ*Z*pow(csetemp10*csetemp13 + \n+ csetemp15,-2)*pow(4*csetemp10*csetemp13 + pow(-csetemp10 + csetemp11 + \n+ csetemp12 + csetemp13,2),-0.5);\n+ \n+ CCTK_REAL tdg4010 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL csetemp25 CCTK_ATTRIBUTE_UNUSED = pow(rXYZ,9);\n+ \n+ CCTK_REAL csetemp26 CCTK_ATTRIBUTE_UNUSED = pow(a,3);\n+ \n+ CCTK_REAL csetemp27 CCTK_ATTRIBUTE_UNUSED = pow(a,5);\n+ \n+ CCTK_REAL csetemp28 CCTK_ATTRIBUTE_UNUSED = pow(rXYZ,5);\n+ \n+ CCTK_REAL tdg4011 CCTK_ATTRIBUTE_UNUSED = 2*csetemp14*M*((3*csetemp10 \n+ - 3*csetemp11 - csetemp12 - csetemp13)*csetemp22 + 2*csetemp25 + \n+ csetemp10*((3*csetemp10 + csetemp11 - csetemp12 - \n+ csetemp13)*csetemp13*csetemp14 + (csetemp10 - csetemp11 - csetemp12 + \n+ csetemp13)*csetemp28) + (-3*a*csetemp23 - csetemp15*csetemp26 + \n+ 3*csetemp13*csetemp27)*X*Y + csetemp13*((csetemp10 + 3*csetemp11 - \n+ csetemp12 - csetemp13)*csetemp24*rXYZ + \n+ csetemp16*csetemp26*X*Y))*pow(csetemp10*csetemp13 + \n+ csetemp15,-2)*pow(csetemp10 + csetemp16,-2)*pow(4*csetemp10*csetemp13 + \n+ pow(-csetemp10 + csetemp11 + csetemp12 + csetemp13,2),-0.5);\n+ \n+ CCTK_REAL csetemp29 CCTK_ATTRIBUTE_UNUSED = pow(rXYZ,8);\n+ \n+ CCTK_REAL tdg4012 CCTK_ATTRIBUTE_UNUSED = 2*csetemp14*M*(((csetemp10 - \n+ csetemp11 - 2*csetemp12 + csetemp13)*csetemp15 + (3*csetemp10 - \n+ csetemp11 - csetemp13)*csetemp13*csetemp16)*csetemp26 + a*((3*csetemp10 \n+ - csetemp11 - 4*csetemp12 - csetemp13)*csetemp23 + 2*csetemp29) + \n+ (-2*csetemp22 + 4*csetemp13*csetemp24*rXYZ)*X*Y + csetemp13*((csetemp10 \n+ - csetemp11 + 2*csetemp12 - csetemp13)*csetemp27 + \n+ 2*csetemp10*csetemp14*X*Y))*pow(csetemp10*csetemp13 + \n+ csetemp15,-2)*pow(csetemp10 + csetemp16,-2)*pow(4*csetemp10*csetemp13 + \n+ pow(-csetemp10 + csetemp11 + csetemp12 + csetemp13,2),-0.5);\n+ \n+ CCTK_REAL tdg4013 CCTK_ATTRIBUTE_UNUSED = 2*M*rXYZ*((-2*csetemp22 + \n+ csetemp10*(2*(-csetemp10 + csetemp11 + csetemp12 + \n+ 2*csetemp13)*csetemp14 - 4*csetemp28) + 4*csetemp13*csetemp24*rXYZ)*X + \n+ (-3*a*csetemp23 + (-5*csetemp15 + (-2*csetemp10 + 2*(csetemp11 + \n+ csetemp12) + 3*csetemp13)*csetemp16)*csetemp26 + \n+ 3*csetemp13*csetemp27)*Y)*Z*pow(csetemp10*csetemp13 + \n+ csetemp15,-2)*pow(csetemp10 + csetemp16,-1)*pow(4*csetemp10*csetemp13 + \n+ pow(-csetemp10 + csetemp11 + csetemp12 + csetemp13,2),-0.5);\n+ \n+ CCTK_REAL tdg4020 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tdg4021 CCTK_ATTRIBUTE_UNUSED = -2*csetemp14*M*(((csetemp10 \n+ - 2*csetemp11 - csetemp12 + csetemp13)*csetemp15 + (3*csetemp10 - \n+ csetemp12 - csetemp13)*csetemp13*csetemp16)*csetemp26 + a*((3*csetemp10 \n+ - 4*csetemp11 - csetemp12 - csetemp13)*csetemp23 + 2*csetemp29) + \n+ (2*csetemp22 - 4*csetemp13*csetemp24*rXYZ)*X*Y + csetemp13*((csetemp10 \n+ + 2*csetemp11 - csetemp12 - csetemp13)*csetemp27 - \n+ 2*csetemp10*csetemp14*X*Y))*pow(csetemp10*csetemp13 + \n+ csetemp15,-2)*pow(csetemp10 + csetemp16,-2)*pow(4*csetemp10*csetemp13 + \n+ pow(-csetemp10 + csetemp11 + csetemp12 + csetemp13,2),-0.5);\n+ \n+ CCTK_REAL tdg4022 CCTK_ATTRIBUTE_UNUSED = 2*csetemp14*M*((3*csetemp10 \n+ - csetemp11 - 3*csetemp12 - csetemp13)*csetemp22 + 2*csetemp25 + \n+ csetemp10*((3*csetemp10 - csetemp11 + csetemp12 - \n+ csetemp13)*csetemp13*csetemp14 + (csetemp10 - csetemp11 - csetemp12 + \n+ csetemp13)*csetemp28) + (3*a*csetemp23 + csetemp15*csetemp26 - \n+ 3*csetemp13*csetemp27)*X*Y + csetemp13*((csetemp10 - csetemp11 + \n+ 3*csetemp12 - csetemp13)*csetemp24*rXYZ - \n+ csetemp16*csetemp26*X*Y))*pow(csetemp10*csetemp13 + \n+ csetemp15,-2)*pow(csetemp10 + csetemp16,-2)*pow(4*csetemp10*csetemp13 + \n+ pow(-csetemp10 + csetemp11 + csetemp12 + csetemp13,2),-0.5);\n+ \n+ CCTK_REAL tdg4023 CCTK_ATTRIBUTE_UNUSED = 2*M*rXYZ*((3*a*csetemp23 + \n+ (5*csetemp15 + (2*csetemp10 - 2*(csetemp11 + csetemp12) - \n+ 3*csetemp13)*csetemp16)*csetemp26)*X + (-2*csetemp22 + \n+ csetemp10*(2*(-csetemp10 + csetemp11 + csetemp12 + \n+ 2*csetemp13)*csetemp14 - 4*csetemp28))*Y + csetemp13*(-3*csetemp27*X + \n+ 4*csetemp24*rXYZ*Y))*Z*pow(csetemp10*csetemp13 + \n+ csetemp15,-2)*pow(csetemp10 + csetemp16,-1)*pow(4*csetemp10*csetemp13 + \n+ pow(-csetemp10 + csetemp11 + csetemp12 + csetemp13,2),-0.5);\n+ \n+ CCTK_REAL tdg4030 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tdg4031 CCTK_ATTRIBUTE_UNUSED = \n+ 4*(csetemp10*csetemp13*csetemp16 - \n+ csetemp23)*M*X*Z*pow(csetemp10*csetemp13 + \n+ csetemp15,-2)*pow(4*csetemp10*csetemp13 + pow(-csetemp10 + csetemp11 + \n+ csetemp12 + csetemp13,2),-0.5);\n+ \n+ CCTK_REAL tdg4032 CCTK_ATTRIBUTE_UNUSED = \n+ 4*(csetemp10*csetemp13*csetemp16 - \n+ csetemp23)*M*Y*Z*pow(csetemp10*csetemp13 + \n+ csetemp15,-2)*pow(4*csetemp10*csetemp13 + pow(-csetemp10 + csetemp11 + \n+ csetemp12 + csetemp13,2),-0.5);\n+ \n+ CCTK_REAL tdg4033 CCTK_ATTRIBUTE_UNUSED = 2*(csetemp10*csetemp13 - \n+ csetemp15)*(2*csetemp10*csetemp13 - 2*csetemp15 + (-csetemp10 + \n+ csetemp11 + csetemp12 + \n+ 3*csetemp13)*csetemp16)*M*pow(csetemp10*csetemp13 + \n+ csetemp15,-2)*pow(4*csetemp10*csetemp13 + pow(-csetemp10 + csetemp11 + \n+ csetemp12 + csetemp13,2),-0.5);\n+ \n+ CCTK_REAL tdg4110 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tdg4111 CCTK_ATTRIBUTE_UNUSED = 2*csetemp14*(csetemp17 + \n+ csetemp18)*M*((6*csetemp10 - 5*csetemp11 - 2*(csetemp12 + \n+ csetemp13))*csetemp22 + 4*csetemp25 + csetemp10*(csetemp13*(6*csetemp10 \n+ - csetemp11 - 2*(csetemp12 + csetemp13))*csetemp14 + (-csetemp11 - \n+ 2*csetemp12 + 2*(csetemp10 + csetemp13))*csetemp28) + (-5*a*csetemp23 - \n+ csetemp15*csetemp26 + 3*csetemp13*csetemp27)*X*Y + \n+ csetemp13*((2*csetemp10 + 3*csetemp11 - 2*(csetemp12 + \n+ csetemp13))*csetemp24*rXYZ - \n+ csetemp16*csetemp26*X*Y))*pow(csetemp10*csetemp13 + \n+ csetemp15,-2)*pow(csetemp10 + csetemp16,-3)*pow(4*csetemp10*csetemp13 + \n+ pow(-csetemp10 + csetemp11 + csetemp12 + csetemp13,2),-0.5);\n+ \n+ CCTK_REAL tdg4112 CCTK_ATTRIBUTE_UNUSED = 2*csetemp14*(csetemp17 + \n+ csetemp18)*M*(((-2*csetemp11 - 3*csetemp12 + 2*(csetemp10 + \n+ csetemp13))*csetemp15 + csetemp13*(6*csetemp10 - 3*csetemp12 - \n+ 2*(csetemp11 + csetemp13))*csetemp16)*csetemp26 + a*((6*csetemp10 - \n+ 7*csetemp12 - 2*(csetemp11 + csetemp13))*csetemp23 + 4*csetemp29) + \n+ (-3*csetemp22 + csetemp10*csetemp28 + 5*csetemp13*csetemp24*rXYZ)*X*Y + \n+ csetemp13*((2*csetemp10 + csetemp12 - 2*(csetemp11 + \n+ csetemp13))*csetemp27 + \n+ csetemp10*csetemp14*X*Y))*pow(csetemp10*csetemp13 + \n+ csetemp15,-2)*pow(csetemp10 + csetemp16,-3)*pow(4*csetemp10*csetemp13 + \n+ pow(-csetemp10 + csetemp11 + csetemp12 + csetemp13,2),-0.5);\n+ \n+ CCTK_REAL tdg4113 CCTK_ATTRIBUTE_UNUSED = 2*(csetemp17 + \n+ csetemp18)*M*rXYZ*((-3*csetemp22 + csetemp10*((-2*csetemp10 + \n+ 2*(csetemp11 + csetemp12) + 3*csetemp13)*csetemp14 - 3*csetemp28) + \n+ 5*csetemp13*csetemp24*rXYZ)*X + (-5*a*csetemp23 + (-5*csetemp15 + \n+ (-2*csetemp10 + 2*(csetemp11 + csetemp12) + \n+ csetemp13)*csetemp16)*csetemp26 + \n+ 3*csetemp13*csetemp27)*Y)*Z*pow(csetemp10*csetemp13 + \n+ csetemp15,-2)*pow(csetemp10 + csetemp16,-2)*pow(4*csetemp10*csetemp13 + \n+ pow(-csetemp10 + csetemp11 + csetemp12 + csetemp13,2),-0.5);\n+ \n+ CCTK_REAL tdg4120 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL csetemp30 CCTK_ATTRIBUTE_UNUSED = pow(rXYZ,10);\n+ \n+ CCTK_REAL csetemp31 CCTK_ATTRIBUTE_UNUSED = pow(a,6);\n+ \n+ CCTK_REAL tdg4121 CCTK_ATTRIBUTE_UNUSED = \n+ 2*csetemp14*M*((a*(2*(-3*csetemp10 + 3*csetemp11 - csetemp12 + \n+ csetemp13)*csetemp22 - 4*csetemp25) + \n+ csetemp26*(2*csetemp13*(-3*csetemp10 + csetemp11 + csetemp12 + \n+ csetemp13)*csetemp14 - 2*(csetemp10 - csetemp11 - csetemp12 + \n+ csetemp13)*csetemp28))*X + (csetemp10*(2*(-csetemp10 + 3*csetemp11 + \n+ csetemp13)*csetemp23 - csetemp15*(csetemp13*(csetemp12 + csetemp13) - \n+ csetemp10*(csetemp12 + 2*(csetemp11 + csetemp13)) + csetemp24)) - \n+ (-csetemp10 + 4*csetemp11 + csetemp12 + csetemp13)*csetemp29 + \n+ 2*csetemp30 + csetemp13*(-csetemp10 - 2*csetemp11 + csetemp12 + \n+ csetemp13)*csetemp31)*Y - 2*csetemp13*((csetemp10 + csetemp11 - \n+ 3*csetemp12 - csetemp13)*csetemp27*rXYZ*X + (csetemp10 - \n+ 3*csetemp11)*csetemp16*csetemp24*Y))*pow(csetemp10*csetemp13 + \n+ csetemp15,-2)*pow(csetemp10 + csetemp16,-3)*pow(4*csetemp10*csetemp13 + \n+ pow(-csetemp10 + csetemp11 + csetemp12 + csetemp13,2),-0.5);\n+ \n+ CCTK_REAL tdg4122 CCTK_ATTRIBUTE_UNUSED = \n+ -2*csetemp14*M*((csetemp10*csetemp15*(csetemp13*(csetemp11 + csetemp13) \n+ - csetemp10*(csetemp11 + 2*(csetemp12 + csetemp13)) + csetemp24) + \n+ (-csetemp10 + csetemp11 + 4*csetemp12 + csetemp13)*csetemp29 - \n+ 2*csetemp30 + (csetemp10 - csetemp11 + 2*csetemp12 - \n+ csetemp13)*csetemp13*csetemp31)*X + (-4*a*csetemp25 - 2*((csetemp10 - \n+ csetemp11 - csetemp12 + csetemp13)*csetemp26*csetemp28 + (csetemp10 - \n+ 3*csetemp11 + csetemp12 - csetemp13)*csetemp13*csetemp27*rXYZ))*Y + \n+ 2*((csetemp10*(csetemp10 - 3*csetemp12 - csetemp13)*csetemp23 + \n+ (csetemp10 - 3*csetemp12)*csetemp13*csetemp16*csetemp24)*X + \n+ (a*(-3*csetemp10 - csetemp11 + 3*csetemp12 + csetemp13)*csetemp22 + \n+ csetemp13*(-3*csetemp10 + csetemp11 + csetemp12 + \n+ csetemp13)*csetemp14*csetemp26)*Y))*pow(csetemp10*csetemp13 + \n+ csetemp15,-2)*pow(csetemp10 + csetemp16,-3)*pow(4*csetemp10*csetemp13 + \n+ pow(-csetemp10 + csetemp11 + csetemp12 + csetemp13,2),-0.5);\n+ \n+ CCTK_REAL tdg4123 CCTK_ATTRIBUTE_UNUSED = 2*M*rXYZ*((csetemp11 - \n+ csetemp12)*(4*a*csetemp22 + csetemp26*(-2*(-csetemp10 + csetemp11 + \n+ csetemp12 + csetemp13)*csetemp14 + 4*csetemp28)) + \n+ (csetemp10*((2*(csetemp11 + csetemp12) + 3*(csetemp10 + \n+ csetemp13))*csetemp15 + 2*csetemp23) + 2*(csetemp10 - csetemp11 - \n+ csetemp12 + 2*csetemp13)*csetemp16*csetemp24 - 3*csetemp29)*X*Y + \n+ csetemp13*(4*(-csetemp11 + csetemp12)*csetemp27*rXYZ - \n+ 3*csetemp31*X*Y))*Z*pow(csetemp10*csetemp13 + \n+ csetemp15,-2)*pow(csetemp10 + csetemp16,-2)*pow(4*csetemp10*csetemp13 + \n+ pow(-csetemp10 + csetemp11 + csetemp12 + csetemp13,2),-0.5);\n+ \n+ CCTK_REAL tdg4130 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tdg4131 CCTK_ATTRIBUTE_UNUSED = \n+ -2*csetemp16*M*((-3*csetemp10 + 4*csetemp11 + csetemp12 + \n+ csetemp13)*csetemp22 + csetemp10*(csetemp13*(-3*csetemp10 + csetemp12 + \n+ csetemp13)*csetemp14 - (csetemp10 - 2*csetemp11 - csetemp12 + \n+ csetemp13)*csetemp28) + csetemp13*(-csetemp10 - 2*csetemp11 + csetemp12 \n+ + csetemp13)*csetemp24*rXYZ + (4*a*csetemp23 + \n+ 2*csetemp15*csetemp26)*X*Y - 2*(csetemp25 + \n+ csetemp13*csetemp27*X*Y))*Z*pow(csetemp10*csetemp13 + \n+ csetemp15,-2)*pow(csetemp10 + csetemp16,-2)*pow(4*csetemp10*csetemp13 + \n+ pow(-csetemp10 + csetemp11 + csetemp12 + csetemp13,2),-0.5);\n+ \n+ CCTK_REAL tdg4132 CCTK_ATTRIBUTE_UNUSED = \n+ -2*csetemp16*M*((-((csetemp10 - csetemp11 - 3*csetemp12 + \n+ csetemp13)*csetemp15) + csetemp13*(-3*csetemp10 + csetemp11 + csetemp12 \n+ + csetemp13)*csetemp16)*csetemp26 + a*((-3*csetemp10 + csetemp11 + \n+ 5*csetemp12 + csetemp13)*csetemp23 - 2*csetemp29) + (3*csetemp22 + \n+ csetemp10*csetemp28 - 3*csetemp13*csetemp24*rXYZ)*X*Y + \n+ csetemp13*((-csetemp10 + csetemp11 - csetemp12 + csetemp13)*csetemp27 - \n+ csetemp10*csetemp14*X*Y))*Z*pow(csetemp10*csetemp13 + \n+ csetemp15,-2)*pow(csetemp10 + csetemp16,-2)*pow(4*csetemp10*csetemp13 + \n+ pow(-csetemp10 + csetemp11 + csetemp12 + csetemp13,2),-0.5);\n+ \n+ CCTK_REAL csetemp32 CCTK_ATTRIBUTE_UNUSED = pow(Z,4);\n+ \n+ CCTK_REAL tdg4133 CCTK_ATTRIBUTE_UNUSED = 2*M*((-((-csetemp10 + \n+ csetemp11 + csetemp12 + 4*csetemp13)*csetemp22) + 2*csetemp25 + \n+ csetemp10*csetemp13*((-csetemp10 + csetemp11 + csetemp12 + \n+ 2*csetemp13)*csetemp14 - 3*csetemp28) + 3*csetemp24*csetemp32*rXYZ)*X + \n+ (a*(csetemp10 - csetemp11 - csetemp12 - 5*csetemp13)*csetemp23 + \n+ csetemp13*(-4*csetemp15 + (-csetemp10 + csetemp11 + csetemp12 + \n+ csetemp13)*csetemp16)*csetemp26 + 2*(a*csetemp29 + \n+ csetemp27*csetemp32))*Y)*pow(csetemp10*csetemp13 + \n+ csetemp15,-2)*pow(csetemp10 + csetemp16,-1)*pow(4*csetemp10*csetemp13 + \n+ pow(-csetemp10 + csetemp11 + csetemp12 + csetemp13,2),-0.5);\n+ \n+ CCTK_REAL tdg4220 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL csetemp33 CCTK_ATTRIBUTE_UNUSED = -csetemp21;\n+ \n+ CCTK_REAL tdg4221 CCTK_ATTRIBUTE_UNUSED = 2*csetemp14*(csetemp19 + \n+ csetemp33)*M*(((-3*csetemp11 - 2*csetemp12 + 2*(csetemp10 + \n+ csetemp13))*csetemp15 + csetemp13*(6*csetemp10 - 3*csetemp11 - \n+ 2*(csetemp12 + csetemp13))*csetemp16)*csetemp26 + a*((6*csetemp10 - \n+ 7*csetemp11 - 2*(csetemp12 + csetemp13))*csetemp23 + 4*csetemp29) + \n+ (3*csetemp22 - csetemp10*csetemp28 - 5*csetemp13*csetemp24*rXYZ)*X*Y + \n+ csetemp13*((2*csetemp10 + csetemp11 - 2*(csetemp12 + \n+ csetemp13))*csetemp27 - \n+ csetemp10*csetemp14*X*Y))*pow(csetemp10*csetemp13 + \n+ csetemp15,-2)*pow(csetemp10 + csetemp16,-3)*pow(4*csetemp10*csetemp13 + \n+ pow(-csetemp10 + csetemp11 + csetemp12 + csetemp13,2),-0.5);\n+ \n+ CCTK_REAL tdg4222 CCTK_ATTRIBUTE_UNUSED = 2*csetemp14*(csetemp20 + \n+ csetemp21)*M*((6*csetemp10 - 5*csetemp12 - 2*(csetemp11 + \n+ csetemp13))*csetemp22 + 4*csetemp25 + csetemp10*(csetemp13*(6*csetemp10 \n+ - csetemp12 - 2*(csetemp11 + csetemp13))*csetemp14 + (-2*csetemp11 - \n+ csetemp12 + 2*(csetemp10 + csetemp13))*csetemp28) + (5*a*csetemp23 + \n+ csetemp15*csetemp26 - 3*csetemp13*csetemp27)*X*Y + \n+ csetemp13*((2*csetemp10 + 3*csetemp12 - 2*(csetemp11 + \n+ csetemp13))*csetemp24*rXYZ + \n+ csetemp16*csetemp26*X*Y))*pow(csetemp10*csetemp13 + \n+ csetemp15,-2)*pow(csetemp10 + csetemp16,-3)*pow(4*csetemp10*csetemp13 + \n+ pow(-csetemp10 + csetemp11 + csetemp12 + csetemp13,2),-0.5);\n+ \n+ CCTK_REAL tdg4223 CCTK_ATTRIBUTE_UNUSED = 2*(csetemp19 + \n+ csetemp33)*M*rXYZ*((-5*csetemp15 + (-2*csetemp10 + 2*(csetemp11 + \n+ csetemp12) + csetemp13)*csetemp16)*csetemp26*X + \n+ csetemp10*((2*csetemp10 - 2*(csetemp11 + csetemp12) - \n+ 3*csetemp13)*csetemp14 + 3*csetemp28)*Y + 3*(csetemp13*csetemp27*X + \n+ csetemp22*Y) - 5*(a*csetemp23*X + \n+ csetemp13*csetemp24*rXYZ*Y))*Z*pow(csetemp10*csetemp13 + \n+ csetemp15,-2)*pow(csetemp10 + csetemp16,-2)*pow(4*csetemp10*csetemp13 + \n+ pow(-csetemp10 + csetemp11 + csetemp12 + csetemp13,2),-0.5);\n+ \n+ CCTK_REAL tdg4230 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tdg4231 CCTK_ATTRIBUTE_UNUSED = 2*csetemp16*M*((-((csetemp10 \n+ - 3*csetemp11 - csetemp12 + csetemp13)*csetemp15) + \n+ csetemp13*(-3*csetemp10 + csetemp11 + csetemp12 + \n+ csetemp13)*csetemp16)*csetemp26 + a*((-3*csetemp10 + 5*csetemp11 + \n+ csetemp12 + csetemp13)*csetemp23 - 2*csetemp29) + (-3*csetemp22 - \n+ csetemp10*csetemp28 + 3*csetemp13*csetemp24*rXYZ)*X*Y + \n+ csetemp13*((-csetemp10 - csetemp11 + csetemp12 + csetemp13)*csetemp27 + \n+ csetemp10*csetemp14*X*Y))*Z*pow(csetemp10*csetemp13 + \n+ csetemp15,-2)*pow(csetemp10 + csetemp16,-2)*pow(4*csetemp10*csetemp13 + \n+ pow(-csetemp10 + csetemp11 + csetemp12 + csetemp13,2),-0.5);\n+ \n+ CCTK_REAL tdg4232 CCTK_ATTRIBUTE_UNUSED = \n+ -2*csetemp16*M*((-3*csetemp10 + csetemp11 + 4*csetemp12 + \n+ csetemp13)*csetemp22 + csetemp10*(csetemp13*(-3*csetemp10 + csetemp11 + \n+ csetemp13)*csetemp14 - (csetemp10 - csetemp11 - 2*csetemp12 + \n+ csetemp13)*csetemp28) - 4*a*csetemp23*X*Y - 2*(csetemp25 + \n+ csetemp15*csetemp26*X*Y) + csetemp13*((-csetemp10 + csetemp11 - \n+ 2*csetemp12 + csetemp13)*csetemp24*rXYZ + \n+ 2*csetemp27*X*Y))*Z*pow(csetemp10*csetemp13 + \n+ csetemp15,-2)*pow(csetemp10 + csetemp16,-2)*pow(4*csetemp10*csetemp13 + \n+ pow(-csetemp10 + csetemp11 + csetemp12 + csetemp13,2),-0.5);\n+ \n+ CCTK_REAL tdg4233 CCTK_ATTRIBUTE_UNUSED = -2*M*(a*((csetemp10 - \n+ csetemp11 - csetemp12 - 5*csetemp13)*csetemp23 + 2*csetemp29)*X + \n+ ((-csetemp10 + csetemp11 + csetemp12 + 4*csetemp13)*csetemp22 - \n+ 2*csetemp25 + 3*csetemp10*csetemp13*csetemp28)*Y + \n+ csetemp13*((-4*csetemp15 + (-csetemp10 + csetemp11 + csetemp12 + \n+ csetemp13)*csetemp16)*csetemp26*X + csetemp10*(csetemp10 - csetemp11 - \n+ csetemp12 - 2*csetemp13)*csetemp14*Y) + csetemp32*(2*csetemp27*X - \n+ 3*csetemp24*rXYZ*Y))*pow(csetemp10*csetemp13 + \n+ csetemp15,-2)*pow(csetemp10 + csetemp16,-1)*pow(4*csetemp10*csetemp13 + \n+ pow(-csetemp10 + csetemp11 + csetemp12 + csetemp13,2),-0.5);\n+ \n+ CCTK_REAL tdg4330 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tdg4331 CCTK_ATTRIBUTE_UNUSED = 2*csetemp13*M*(-3*csetemp28 \n+ + csetemp10*csetemp13*rXYZ)*X*pow(csetemp10*csetemp13 + \n+ csetemp15,-2)*pow(4*csetemp10*csetemp13 + pow(-csetemp10 + csetemp11 + \n+ csetemp12 + csetemp13,2),-0.5);\n+ \n+ CCTK_REAL tdg4332 CCTK_ATTRIBUTE_UNUSED = 2*csetemp13*M*(-3*csetemp28 \n+ + csetemp10*csetemp13*rXYZ)*Y*pow(csetemp10*csetemp13 + \n+ csetemp15,-2)*pow(4*csetemp10*csetemp13 + pow(-csetemp10 + csetemp11 + \n+ csetemp12 + csetemp13,2),-0.5);\n+ \n+ CCTK_REAL tdg4333 CCTK_ATTRIBUTE_UNUSED = 2*((2*csetemp10 - \n+ 2*(csetemp11 + csetemp12) - 5*csetemp13)*csetemp23 + 4*csetemp29 + \n+ csetemp24*csetemp32 + csetemp10*(-3*csetemp13*csetemp15 + \n+ csetemp16*csetemp32))*M*Z*pow(csetemp10*csetemp13 + \n+ csetemp15,-2)*pow(rXYZ,-1)*pow(4*csetemp10*csetemp13 + pow(-csetemp10 + \n+ csetemp11 + csetemp12 + csetemp13,2),-0.5);\n+ \n+ CCTK_REAL g400 CCTK_ATTRIBUTE_UNUSED = 2*(tg423*xformL20*xformL30 + \n+ xformL00*(tg401*xformL10 + tg402*xformL20 + tg403*xformL30) + \n+ xformL10*(tg412*xformL20 + tg413*xformL30)) + tg400*pow(xformL00,2) + \n+ tg411*pow(xformL10,2) + tg422*pow(xformL20,2) + tg433*pow(xformL30,2);\n+ \n+ CCTK_REAL csetemp34 CCTK_ATTRIBUTE_UNUSED = tg400*xformL01;\n+ \n+ CCTK_REAL csetemp35 CCTK_ATTRIBUTE_UNUSED = tg401*xformL11;\n+ \n+ CCTK_REAL csetemp36 CCTK_ATTRIBUTE_UNUSED = tg402*xformL21;\n+ \n+ CCTK_REAL csetemp37 CCTK_ATTRIBUTE_UNUSED = tg403*xformL31;\n+ \n+ CCTK_REAL csetemp38 CCTK_ATTRIBUTE_UNUSED = tg401*xformL01;\n+ \n+ CCTK_REAL csetemp39 CCTK_ATTRIBUTE_UNUSED = tg411*xformL11;\n+ \n+ CCTK_REAL csetemp40 CCTK_ATTRIBUTE_UNUSED = tg412*xformL21;\n+ \n+ CCTK_REAL csetemp41 CCTK_ATTRIBUTE_UNUSED = tg413*xformL31;\n+ \n+ CCTK_REAL csetemp42 CCTK_ATTRIBUTE_UNUSED = tg402*xformL01;\n+ \n+ CCTK_REAL csetemp43 CCTK_ATTRIBUTE_UNUSED = tg412*xformL11;\n+ \n+ CCTK_REAL csetemp44 CCTK_ATTRIBUTE_UNUSED = tg422*xformL21;\n+ \n+ CCTK_REAL csetemp45 CCTK_ATTRIBUTE_UNUSED = tg423*xformL31;\n+ \n+ CCTK_REAL csetemp46 CCTK_ATTRIBUTE_UNUSED = tg403*xformL01;\n+ \n+ CCTK_REAL csetemp47 CCTK_ATTRIBUTE_UNUSED = tg413*xformL11;\n+ \n+ CCTK_REAL csetemp48 CCTK_ATTRIBUTE_UNUSED = tg423*xformL21;\n+ \n+ CCTK_REAL csetemp49 CCTK_ATTRIBUTE_UNUSED = tg433*xformL31;\n+ \n+ CCTK_REAL g401 CCTK_ATTRIBUTE_UNUSED = (csetemp34 + csetemp35 + \n+ csetemp36 + csetemp37)*xformL00 + (csetemp38 + csetemp39 + csetemp40 + \n+ csetemp41)*xformL10 + (csetemp42 + csetemp43 + csetemp44 + \n+ csetemp45)*xformL20 + (csetemp46 + csetemp47 + csetemp48 + \n+ csetemp49)*xformL30;\n+ \n+ CCTK_REAL csetemp50 CCTK_ATTRIBUTE_UNUSED = tg400*xformL02;\n+ \n+ CCTK_REAL csetemp51 CCTK_ATTRIBUTE_UNUSED = tg401*xformL12;\n+ \n+ CCTK_REAL csetemp52 CCTK_ATTRIBUTE_UNUSED = tg402*xformL22;\n+ \n+ CCTK_REAL csetemp53 CCTK_ATTRIBUTE_UNUSED = tg403*xformL32;\n+ \n+ CCTK_REAL csetemp54 CCTK_ATTRIBUTE_UNUSED = tg401*xformL02;\n+ \n+ CCTK_REAL csetemp55 CCTK_ATTRIBUTE_UNUSED = tg411*xformL12;\n+ \n+ CCTK_REAL csetemp56 CCTK_ATTRIBUTE_UNUSED = tg412*xformL22;\n+ \n+ CCTK_REAL csetemp57 CCTK_ATTRIBUTE_UNUSED = tg413*xformL32;\n+ \n+ CCTK_REAL csetemp58 CCTK_ATTRIBUTE_UNUSED = tg402*xformL02;\n+ \n+ CCTK_REAL csetemp59 CCTK_ATTRIBUTE_UNUSED = tg412*xformL12;\n+ \n+ CCTK_REAL csetemp60 CCTK_ATTRIBUTE_UNUSED = tg422*xformL22;\n+ \n+ CCTK_REAL csetemp61 CCTK_ATTRIBUTE_UNUSED = tg423*xformL32;\n+ \n+ CCTK_REAL csetemp62 CCTK_ATTRIBUTE_UNUSED = tg403*xformL02;\n+ \n+ CCTK_REAL csetemp63 CCTK_ATTRIBUTE_UNUSED = tg413*xformL12;\n+ \n+ CCTK_REAL csetemp64 CCTK_ATTRIBUTE_UNUSED = tg423*xformL22;\n+ \n+ CCTK_REAL csetemp65 CCTK_ATTRIBUTE_UNUSED = tg433*xformL32;\n+ \n+ CCTK_REAL g402 CCTK_ATTRIBUTE_UNUSED = (csetemp50 + csetemp51 + \n+ csetemp52 + csetemp53)*xformL00 + (csetemp54 + csetemp55 + csetemp56 + \n+ csetemp57)*xformL10 + (csetemp58 + csetemp59 + csetemp60 + \n+ csetemp61)*xformL20 + (csetemp62 + csetemp63 + csetemp64 + \n+ csetemp65)*xformL30;\n+ \n+ CCTK_REAL csetemp66 CCTK_ATTRIBUTE_UNUSED = tg400*xformL03;\n+ \n+ CCTK_REAL csetemp67 CCTK_ATTRIBUTE_UNUSED = tg401*xformL13;\n+ \n+ CCTK_REAL csetemp68 CCTK_ATTRIBUTE_UNUSED = tg402*xformL23;\n+ \n+ CCTK_REAL csetemp69 CCTK_ATTRIBUTE_UNUSED = tg403*xformL33;\n+ \n+ CCTK_REAL csetemp70 CCTK_ATTRIBUTE_UNUSED = tg401*xformL03;\n+ \n+ CCTK_REAL csetemp71 CCTK_ATTRIBUTE_UNUSED = tg411*xformL13;\n+ \n+ CCTK_REAL csetemp72 CCTK_ATTRIBUTE_UNUSED = tg412*xformL23;\n+ \n+ CCTK_REAL csetemp73 CCTK_ATTRIBUTE_UNUSED = tg413*xformL33;\n+ \n+ CCTK_REAL csetemp74 CCTK_ATTRIBUTE_UNUSED = tg402*xformL03;\n+ \n+ CCTK_REAL csetemp75 CCTK_ATTRIBUTE_UNUSED = tg412*xformL13;\n+ \n+ CCTK_REAL csetemp76 CCTK_ATTRIBUTE_UNUSED = tg422*xformL23;\n+ \n+ CCTK_REAL csetemp77 CCTK_ATTRIBUTE_UNUSED = tg423*xformL33;\n+ \n+ CCTK_REAL csetemp78 CCTK_ATTRIBUTE_UNUSED = tg403*xformL03;\n+ \n+ CCTK_REAL csetemp79 CCTK_ATTRIBUTE_UNUSED = tg413*xformL13;\n+ \n+ CCTK_REAL csetemp80 CCTK_ATTRIBUTE_UNUSED = tg423*xformL23;\n+ \n+ CCTK_REAL csetemp81 CCTK_ATTRIBUTE_UNUSED = tg433*xformL33;\n+ \n+ CCTK_REAL g403 CCTK_ATTRIBUTE_UNUSED = (csetemp66 + csetemp67 + \n+ csetemp68 + csetemp69)*xformL00 + (csetemp70 + csetemp71 + csetemp72 + \n+ csetemp73)*xformL10 + (csetemp74 + csetemp75 + csetemp76 + \n+ csetemp77)*xformL20 + (csetemp78 + csetemp79 + csetemp80 + \n+ csetemp81)*xformL30;\n+ \n+ CCTK_REAL g411 CCTK_ATTRIBUTE_UNUSED = (csetemp34 + csetemp35 + \n+ csetemp36 + csetemp37)*xformL01 + (csetemp38 + csetemp39 + csetemp40 + \n+ csetemp41)*xformL11 + (csetemp42 + csetemp43 + csetemp44 + \n+ csetemp45)*xformL21 + (csetemp46 + csetemp47 + csetemp48 + \n+ csetemp49)*xformL31;\n+ \n+ CCTK_REAL g412 CCTK_ATTRIBUTE_UNUSED = (csetemp50 + csetemp51 + \n+ csetemp52 + csetemp53)*xformL01 + (csetemp54 + csetemp55 + csetemp56 + \n+ csetemp57)*xformL11 + (csetemp58 + csetemp59 + csetemp60 + \n+ csetemp61)*xformL21 + (csetemp62 + csetemp63 + csetemp64 + \n+ csetemp65)*xformL31;\n+ \n+ CCTK_REAL g413 CCTK_ATTRIBUTE_UNUSED = (csetemp66 + csetemp67 + \n+ csetemp68 + csetemp69)*xformL01 + (csetemp70 + csetemp71 + csetemp72 + \n+ csetemp73)*xformL11 + (csetemp74 + csetemp75 + csetemp76 + \n+ csetemp77)*xformL21 + (csetemp78 + csetemp79 + csetemp80 + \n+ csetemp81)*xformL31;\n+ \n+ CCTK_REAL g422 CCTK_ATTRIBUTE_UNUSED = (csetemp50 + csetemp51 + \n+ csetemp52 + csetemp53)*xformL02 + (csetemp54 + csetemp55 + csetemp56 + \n+ csetemp57)*xformL12 + (csetemp58 + csetemp59 + csetemp60 + \n+ csetemp61)*xformL22 + (csetemp62 + csetemp63 + csetemp64 + \n+ csetemp65)*xformL32;\n+ \n+ CCTK_REAL g423 CCTK_ATTRIBUTE_UNUSED = (csetemp66 + csetemp67 + \n+ csetemp68 + csetemp69)*xformL02 + (csetemp70 + csetemp71 + csetemp72 + \n+ csetemp73)*xformL12 + (csetemp74 + csetemp75 + csetemp76 + \n+ csetemp77)*xformL22 + (csetemp78 + csetemp79 + csetemp80 + \n+ csetemp81)*xformL32;\n+ \n+ CCTK_REAL g433 CCTK_ATTRIBUTE_UNUSED = (csetemp66 + csetemp67 + \n+ csetemp68 + csetemp69)*xformL03 + (csetemp70 + csetemp71 + csetemp72 + \n+ csetemp73)*xformL13 + (csetemp74 + csetemp75 + csetemp76 + \n+ csetemp77)*xformL23 + (csetemp78 + csetemp79 + csetemp80 + \n+ csetemp81)*xformL33;\n+ \n+ CCTK_REAL csetemp82 CCTK_ATTRIBUTE_UNUSED = tdg4000*xformL00;\n+ \n+ CCTK_REAL csetemp83 CCTK_ATTRIBUTE_UNUSED = tdg4001*xformL10;\n+ \n+ CCTK_REAL csetemp84 CCTK_ATTRIBUTE_UNUSED = tdg4002*xformL20;\n+ \n+ CCTK_REAL csetemp85 CCTK_ATTRIBUTE_UNUSED = tdg4003*xformL30;\n+ \n+ CCTK_REAL csetemp86 CCTK_ATTRIBUTE_UNUSED = tdg4010*xformL00;\n+ \n+ CCTK_REAL csetemp87 CCTK_ATTRIBUTE_UNUSED = tdg4011*xformL10;\n+ \n+ CCTK_REAL csetemp88 CCTK_ATTRIBUTE_UNUSED = tdg4012*xformL20;\n+ \n+ CCTK_REAL csetemp89 CCTK_ATTRIBUTE_UNUSED = tdg4013*xformL30;\n+ \n+ CCTK_REAL csetemp90 CCTK_ATTRIBUTE_UNUSED = tdg4020*xformL00;\n+ \n+ CCTK_REAL csetemp91 CCTK_ATTRIBUTE_UNUSED = tdg4021*xformL10;\n+ \n+ CCTK_REAL csetemp92 CCTK_ATTRIBUTE_UNUSED = tdg4022*xformL20;\n+ \n+ CCTK_REAL csetemp93 CCTK_ATTRIBUTE_UNUSED = tdg4023*xformL30;\n+ \n+ CCTK_REAL csetemp94 CCTK_ATTRIBUTE_UNUSED = tdg4030*xformL00;\n+ \n+ CCTK_REAL csetemp95 CCTK_ATTRIBUTE_UNUSED = tdg4031*xformL10;\n+ \n+ CCTK_REAL csetemp96 CCTK_ATTRIBUTE_UNUSED = tdg4032*xformL20;\n+ \n+ CCTK_REAL csetemp97 CCTK_ATTRIBUTE_UNUSED = tdg4033*xformL30;\n+ \n+ CCTK_REAL csetemp98 CCTK_ATTRIBUTE_UNUSED = tdg4110*xformL00;\n+ \n+ CCTK_REAL csetemp99 CCTK_ATTRIBUTE_UNUSED = tdg4111*xformL10;\n+ \n+ CCTK_REAL csetemp100 CCTK_ATTRIBUTE_UNUSED = tdg4112*xformL20;\n+ \n+ CCTK_REAL csetemp101 CCTK_ATTRIBUTE_UNUSED = tdg4113*xformL30;\n+ \n+ CCTK_REAL csetemp102 CCTK_ATTRIBUTE_UNUSED = tdg4120*xformL00;\n+ \n+ CCTK_REAL csetemp103 CCTK_ATTRIBUTE_UNUSED = tdg4121*xformL10;\n+ \n+ CCTK_REAL csetemp104 CCTK_ATTRIBUTE_UNUSED = tdg4122*xformL20;\n+ \n+ CCTK_REAL csetemp105 CCTK_ATTRIBUTE_UNUSED = tdg4123*xformL30;\n+ \n+ CCTK_REAL csetemp106 CCTK_ATTRIBUTE_UNUSED = tdg4130*xformL00;\n+ \n+ CCTK_REAL csetemp107 CCTK_ATTRIBUTE_UNUSED = tdg4131*xformL10;\n+ \n+ CCTK_REAL csetemp108 CCTK_ATTRIBUTE_UNUSED = tdg4132*xformL20;\n+ \n+ CCTK_REAL csetemp109 CCTK_ATTRIBUTE_UNUSED = tdg4133*xformL30;\n+ \n+ CCTK_REAL csetemp110 CCTK_ATTRIBUTE_UNUSED = tdg4220*xformL00;\n+ \n+ CCTK_REAL csetemp111 CCTK_ATTRIBUTE_UNUSED = tdg4221*xformL10;\n+ \n+ CCTK_REAL csetemp112 CCTK_ATTRIBUTE_UNUSED = tdg4222*xformL20;\n+ \n+ CCTK_REAL csetemp113 CCTK_ATTRIBUTE_UNUSED = tdg4223*xformL30;\n+ \n+ CCTK_REAL csetemp114 CCTK_ATTRIBUTE_UNUSED = tdg4230*xformL00;\n+ \n+ CCTK_REAL csetemp115 CCTK_ATTRIBUTE_UNUSED = tdg4231*xformL10;\n+ \n+ CCTK_REAL csetemp116 CCTK_ATTRIBUTE_UNUSED = tdg4232*xformL20;\n+ \n+ CCTK_REAL csetemp117 CCTK_ATTRIBUTE_UNUSED = tdg4233*xformL30;\n+ \n+ CCTK_REAL csetemp118 CCTK_ATTRIBUTE_UNUSED = tdg4330*xformL00;\n+ \n+ CCTK_REAL csetemp119 CCTK_ATTRIBUTE_UNUSED = tdg4331*xformL10;\n+ \n+ CCTK_REAL csetemp120 CCTK_ATTRIBUTE_UNUSED = tdg4332*xformL20;\n+ \n+ CCTK_REAL csetemp121 CCTK_ATTRIBUTE_UNUSED = tdg4333*xformL30;\n+ \n+ CCTK_REAL dg4000 CCTK_ATTRIBUTE_UNUSED = xformL10*((csetemp86 + \n+ csetemp87 + csetemp88 + csetemp89)*xformL00 + (csetemp100 + csetemp101 \n+ + csetemp98 + csetemp99)*xformL10 + (csetemp102 + csetemp103 + \n+ csetemp104 + csetemp105)*xformL20 + (csetemp106 + csetemp107 + \n+ csetemp108 + csetemp109)*xformL30) + xformL20*((csetemp90 + csetemp91 + \n+ csetemp92 + csetemp93)*xformL00 + (csetemp102 + csetemp103 + csetemp104 \n+ + csetemp105)*xformL10 + (csetemp110 + csetemp111 + csetemp112 + \n+ csetemp113)*xformL20 + (csetemp114 + csetemp115 + csetemp116 + \n+ csetemp117)*xformL30) + xformL30*((csetemp94 + csetemp95 + csetemp96 + \n+ csetemp97)*xformL00 + (csetemp106 + csetemp107 + csetemp108 + \n+ csetemp109)*xformL10 + (csetemp114 + csetemp115 + csetemp116 + \n+ csetemp117)*xformL20 + (csetemp118 + csetemp119 + csetemp120 + \n+ csetemp121)*xformL30) + xformL00*((csetemp82 + csetemp83 + csetemp84 + \n+ csetemp85)*xformL00 + (csetemp86 + csetemp87 + csetemp88 + \n+ csetemp89)*xformL10 + (csetemp90 + csetemp91 + csetemp92 + \n+ csetemp93)*xformL20 + (csetemp94 + csetemp95 + csetemp96 + \n+ csetemp97)*xformL30);\n+ \n+ CCTK_REAL dg4010 CCTK_ATTRIBUTE_UNUSED = xformL10*((csetemp86 + \n+ csetemp87 + csetemp88 + csetemp89)*xformL01 + (csetemp100 + csetemp101 \n+ + csetemp98 + csetemp99)*xformL11 + (csetemp102 + csetemp103 + \n+ csetemp104 + csetemp105)*xformL21 + (csetemp106 + csetemp107 + \n+ csetemp108 + csetemp109)*xformL31) + xformL20*((csetemp90 + csetemp91 + \n+ csetemp92 + csetemp93)*xformL01 + (csetemp102 + csetemp103 + csetemp104 \n+ + csetemp105)*xformL11 + (csetemp110 + csetemp111 + csetemp112 + \n+ csetemp113)*xformL21 + (csetemp114 + csetemp115 + csetemp116 + \n+ csetemp117)*xformL31) + xformL30*((csetemp94 + csetemp95 + csetemp96 + \n+ csetemp97)*xformL01 + (csetemp106 + csetemp107 + csetemp108 + \n+ csetemp109)*xformL11 + (csetemp114 + csetemp115 + csetemp116 + \n+ csetemp117)*xformL21 + (csetemp118 + csetemp119 + csetemp120 + \n+ csetemp121)*xformL31) + xformL00*((csetemp82 + csetemp83 + csetemp84 + \n+ csetemp85)*xformL01 + (csetemp86 + csetemp87 + csetemp88 + \n+ csetemp89)*xformL11 + (csetemp90 + csetemp91 + csetemp92 + \n+ csetemp93)*xformL21 + (csetemp94 + csetemp95 + csetemp96 + \n+ csetemp97)*xformL31);\n+ \n+ CCTK_REAL csetemp122 CCTK_ATTRIBUTE_UNUSED = tdg4000*xformL01;\n+ \n+ CCTK_REAL csetemp123 CCTK_ATTRIBUTE_UNUSED = tdg4001*xformL11;\n+ \n+ CCTK_REAL csetemp124 CCTK_ATTRIBUTE_UNUSED = tdg4002*xformL21;\n+ \n+ CCTK_REAL csetemp125 CCTK_ATTRIBUTE_UNUSED = tdg4003*xformL31;\n+ \n+ CCTK_REAL csetemp126 CCTK_ATTRIBUTE_UNUSED = tdg4010*xformL01;\n+ \n+ CCTK_REAL csetemp127 CCTK_ATTRIBUTE_UNUSED = tdg4011*xformL11;\n+ \n+ CCTK_REAL csetemp128 CCTK_ATTRIBUTE_UNUSED = tdg4012*xformL21;\n+ \n+ CCTK_REAL csetemp129 CCTK_ATTRIBUTE_UNUSED = tdg4013*xformL31;\n+ \n+ CCTK_REAL csetemp130 CCTK_ATTRIBUTE_UNUSED = tdg4020*xformL01;\n+ \n+ CCTK_REAL csetemp131 CCTK_ATTRIBUTE_UNUSED = tdg4021*xformL11;\n+ \n+ CCTK_REAL csetemp132 CCTK_ATTRIBUTE_UNUSED = tdg4022*xformL21;\n+ \n+ CCTK_REAL csetemp133 CCTK_ATTRIBUTE_UNUSED = tdg4023*xformL31;\n+ \n+ CCTK_REAL csetemp134 CCTK_ATTRIBUTE_UNUSED = tdg4030*xformL01;\n+ \n+ CCTK_REAL csetemp135 CCTK_ATTRIBUTE_UNUSED = tdg4031*xformL11;\n+ \n+ CCTK_REAL csetemp136 CCTK_ATTRIBUTE_UNUSED = tdg4032*xformL21;\n+ \n+ CCTK_REAL csetemp137 CCTK_ATTRIBUTE_UNUSED = tdg4033*xformL31;\n+ \n+ CCTK_REAL csetemp138 CCTK_ATTRIBUTE_UNUSED = tdg4110*xformL01;\n+ \n+ CCTK_REAL csetemp139 CCTK_ATTRIBUTE_UNUSED = tdg4111*xformL11;\n+ \n+ CCTK_REAL csetemp140 CCTK_ATTRIBUTE_UNUSED = tdg4112*xformL21;\n+ \n+ CCTK_REAL csetemp141 CCTK_ATTRIBUTE_UNUSED = tdg4113*xformL31;\n+ \n+ CCTK_REAL csetemp142 CCTK_ATTRIBUTE_UNUSED = tdg4120*xformL01;\n+ \n+ CCTK_REAL csetemp143 CCTK_ATTRIBUTE_UNUSED = tdg4121*xformL11;\n+ \n+ CCTK_REAL csetemp144 CCTK_ATTRIBUTE_UNUSED = tdg4122*xformL21;\n+ \n+ CCTK_REAL csetemp145 CCTK_ATTRIBUTE_UNUSED = tdg4123*xformL31;\n+ \n+ CCTK_REAL csetemp146 CCTK_ATTRIBUTE_UNUSED = tdg4130*xformL01;\n+ \n+ CCTK_REAL csetemp147 CCTK_ATTRIBUTE_UNUSED = tdg4131*xformL11;\n+ \n+ CCTK_REAL csetemp148 CCTK_ATTRIBUTE_UNUSED = tdg4132*xformL21;\n+ \n+ CCTK_REAL csetemp149 CCTK_ATTRIBUTE_UNUSED = tdg4133*xformL31;\n+ \n+ CCTK_REAL csetemp150 CCTK_ATTRIBUTE_UNUSED = tdg4220*xformL01;\n+ \n+ CCTK_REAL csetemp151 CCTK_ATTRIBUTE_UNUSED = tdg4221*xformL11;\n+ \n+ CCTK_REAL csetemp152 CCTK_ATTRIBUTE_UNUSED = tdg4222*xformL21;\n+ \n+ CCTK_REAL csetemp153 CCTK_ATTRIBUTE_UNUSED = tdg4223*xformL31;\n+ \n+ CCTK_REAL csetemp154 CCTK_ATTRIBUTE_UNUSED = tdg4230*xformL01;\n+ \n+ CCTK_REAL csetemp155 CCTK_ATTRIBUTE_UNUSED = tdg4231*xformL11;\n+ \n+ CCTK_REAL csetemp156 CCTK_ATTRIBUTE_UNUSED = tdg4232*xformL21;\n+ \n+ CCTK_REAL csetemp157 CCTK_ATTRIBUTE_UNUSED = tdg4233*xformL31;\n+ \n+ CCTK_REAL csetemp158 CCTK_ATTRIBUTE_UNUSED = tdg4330*xformL01;\n+ \n+ CCTK_REAL csetemp159 CCTK_ATTRIBUTE_UNUSED = tdg4331*xformL11;\n+ \n+ CCTK_REAL csetemp160 CCTK_ATTRIBUTE_UNUSED = tdg4332*xformL21;\n+ \n+ CCTK_REAL csetemp161 CCTK_ATTRIBUTE_UNUSED = tdg4333*xformL31;\n+ \n+ CCTK_REAL dg4011 CCTK_ATTRIBUTE_UNUSED = xformL00*((csetemp122 + \n+ csetemp123 + csetemp124 + csetemp125)*xformL01 + (csetemp126 + \n+ csetemp127 + csetemp128 + csetemp129)*xformL11 + (csetemp130 + \n+ csetemp131 + csetemp132 + csetemp133)*xformL21 + (csetemp134 + \n+ csetemp135 + csetemp136 + csetemp137)*xformL31) + xformL10*((csetemp126 \n+ + csetemp127 + csetemp128 + csetemp129)*xformL01 + (csetemp138 + \n+ csetemp139 + csetemp140 + csetemp141)*xformL11 + (csetemp142 + \n+ csetemp143 + csetemp144 + csetemp145)*xformL21 + (csetemp146 + \n+ csetemp147 + csetemp148 + csetemp149)*xformL31) + xformL20*((csetemp130 \n+ + csetemp131 + csetemp132 + csetemp133)*xformL01 + (csetemp142 + \n+ csetemp143 + csetemp144 + csetemp145)*xformL11 + (csetemp150 + \n+ csetemp151 + csetemp152 + csetemp153)*xformL21 + (csetemp154 + \n+ csetemp155 + csetemp156 + csetemp157)*xformL31) + xformL30*((csetemp134 \n+ + csetemp135 + csetemp136 + csetemp137)*xformL01 + (csetemp146 + \n+ csetemp147 + csetemp148 + csetemp149)*xformL11 + (csetemp154 + \n+ csetemp155 + csetemp156 + csetemp157)*xformL21 + (csetemp158 + \n+ csetemp159 + csetemp160 + csetemp161)*xformL31);\n+ \n+ CCTK_REAL csetemp162 CCTK_ATTRIBUTE_UNUSED = tdg4000*xformL02;\n+ \n+ CCTK_REAL csetemp163 CCTK_ATTRIBUTE_UNUSED = tdg4001*xformL12;\n+ \n+ CCTK_REAL csetemp164 CCTK_ATTRIBUTE_UNUSED = tdg4002*xformL22;\n+ \n+ CCTK_REAL csetemp165 CCTK_ATTRIBUTE_UNUSED = tdg4003*xformL32;\n+ \n+ CCTK_REAL csetemp166 CCTK_ATTRIBUTE_UNUSED = tdg4010*xformL02;\n+ \n+ CCTK_REAL csetemp167 CCTK_ATTRIBUTE_UNUSED = tdg4011*xformL12;\n+ \n+ CCTK_REAL csetemp168 CCTK_ATTRIBUTE_UNUSED = tdg4012*xformL22;\n+ \n+ CCTK_REAL csetemp169 CCTK_ATTRIBUTE_UNUSED = tdg4013*xformL32;\n+ \n+ CCTK_REAL csetemp170 CCTK_ATTRIBUTE_UNUSED = tdg4020*xformL02;\n+ \n+ CCTK_REAL csetemp171 CCTK_ATTRIBUTE_UNUSED = tdg4021*xformL12;\n+ \n+ CCTK_REAL csetemp172 CCTK_ATTRIBUTE_UNUSED = tdg4022*xformL22;\n+ \n+ CCTK_REAL csetemp173 CCTK_ATTRIBUTE_UNUSED = tdg4023*xformL32;\n+ \n+ CCTK_REAL csetemp174 CCTK_ATTRIBUTE_UNUSED = tdg4030*xformL02;\n+ \n+ CCTK_REAL csetemp175 CCTK_ATTRIBUTE_UNUSED = tdg4031*xformL12;\n+ \n+ CCTK_REAL csetemp176 CCTK_ATTRIBUTE_UNUSED = tdg4032*xformL22;\n+ \n+ CCTK_REAL csetemp177 CCTK_ATTRIBUTE_UNUSED = tdg4033*xformL32;\n+ \n+ CCTK_REAL csetemp178 CCTK_ATTRIBUTE_UNUSED = tdg4110*xformL02;\n+ \n+ CCTK_REAL csetemp179 CCTK_ATTRIBUTE_UNUSED = tdg4111*xformL12;\n+ \n+ CCTK_REAL csetemp180 CCTK_ATTRIBUTE_UNUSED = tdg4112*xformL22;\n+ \n+ CCTK_REAL csetemp181 CCTK_ATTRIBUTE_UNUSED = tdg4113*xformL32;\n+ \n+ CCTK_REAL csetemp182 CCTK_ATTRIBUTE_UNUSED = tdg4120*xformL02;\n+ \n+ CCTK_REAL csetemp183 CCTK_ATTRIBUTE_UNUSED = tdg4121*xformL12;\n+ \n+ CCTK_REAL csetemp184 CCTK_ATTRIBUTE_UNUSED = tdg4122*xformL22;\n+ \n+ CCTK_REAL csetemp185 CCTK_ATTRIBUTE_UNUSED = tdg4123*xformL32;\n+ \n+ CCTK_REAL csetemp186 CCTK_ATTRIBUTE_UNUSED = tdg4130*xformL02;\n+ \n+ CCTK_REAL csetemp187 CCTK_ATTRIBUTE_UNUSED = tdg4131*xformL12;\n+ \n+ CCTK_REAL csetemp188 CCTK_ATTRIBUTE_UNUSED = tdg4132*xformL22;\n+ \n+ CCTK_REAL csetemp189 CCTK_ATTRIBUTE_UNUSED = tdg4133*xformL32;\n+ \n+ CCTK_REAL csetemp190 CCTK_ATTRIBUTE_UNUSED = tdg4220*xformL02;\n+ \n+ CCTK_REAL csetemp191 CCTK_ATTRIBUTE_UNUSED = tdg4221*xformL12;\n+ \n+ CCTK_REAL csetemp192 CCTK_ATTRIBUTE_UNUSED = tdg4222*xformL22;\n+ \n+ CCTK_REAL csetemp193 CCTK_ATTRIBUTE_UNUSED = tdg4223*xformL32;\n+ \n+ CCTK_REAL csetemp194 CCTK_ATTRIBUTE_UNUSED = tdg4230*xformL02;\n+ \n+ CCTK_REAL csetemp195 CCTK_ATTRIBUTE_UNUSED = tdg4231*xformL12;\n+ \n+ CCTK_REAL csetemp196 CCTK_ATTRIBUTE_UNUSED = tdg4232*xformL22;\n+ \n+ CCTK_REAL csetemp197 CCTK_ATTRIBUTE_UNUSED = tdg4233*xformL32;\n+ \n+ CCTK_REAL csetemp198 CCTK_ATTRIBUTE_UNUSED = tdg4330*xformL02;\n+ \n+ CCTK_REAL csetemp199 CCTK_ATTRIBUTE_UNUSED = tdg4331*xformL12;\n+ \n+ CCTK_REAL csetemp200 CCTK_ATTRIBUTE_UNUSED = tdg4332*xformL22;\n+ \n+ CCTK_REAL csetemp201 CCTK_ATTRIBUTE_UNUSED = tdg4333*xformL32;\n+ \n+ CCTK_REAL dg4012 CCTK_ATTRIBUTE_UNUSED = xformL00*((csetemp162 + \n+ csetemp163 + csetemp164 + csetemp165)*xformL01 + (csetemp166 + \n+ csetemp167 + csetemp168 + csetemp169)*xformL11 + (csetemp170 + \n+ csetemp171 + csetemp172 + csetemp173)*xformL21 + (csetemp174 + \n+ csetemp175 + csetemp176 + csetemp177)*xformL31) + xformL10*((csetemp166 \n+ + csetemp167 + csetemp168 + csetemp169)*xformL01 + (csetemp178 + \n+ csetemp179 + csetemp180 + csetemp181)*xformL11 + (csetemp182 + \n+ csetemp183 + csetemp184 + csetemp185)*xformL21 + (csetemp186 + \n+ csetemp187 + csetemp188 + csetemp189)*xformL31) + xformL20*((csetemp170 \n+ + csetemp171 + csetemp172 + csetemp173)*xformL01 + (csetemp182 + \n+ csetemp183 + csetemp184 + csetemp185)*xformL11 + (csetemp190 + \n+ csetemp191 + csetemp192 + csetemp193)*xformL21 + (csetemp194 + \n+ csetemp195 + csetemp196 + csetemp197)*xformL31) + xformL30*((csetemp174 \n+ + csetemp175 + csetemp176 + csetemp177)*xformL01 + (csetemp186 + \n+ csetemp187 + csetemp188 + csetemp189)*xformL11 + (csetemp194 + \n+ csetemp195 + csetemp196 + csetemp197)*xformL21 + (csetemp198 + \n+ csetemp199 + csetemp200 + csetemp201)*xformL31);\n+ \n+ CCTK_REAL csetemp202 CCTK_ATTRIBUTE_UNUSED = tdg4000*xformL03;\n+ \n+ CCTK_REAL csetemp203 CCTK_ATTRIBUTE_UNUSED = tdg4001*xformL13;\n+ \n+ CCTK_REAL csetemp204 CCTK_ATTRIBUTE_UNUSED = tdg4002*xformL23;\n+ \n+ CCTK_REAL csetemp205 CCTK_ATTRIBUTE_UNUSED = tdg4003*xformL33;\n+ \n+ CCTK_REAL csetemp206 CCTK_ATTRIBUTE_UNUSED = tdg4010*xformL03;\n+ \n+ CCTK_REAL csetemp207 CCTK_ATTRIBUTE_UNUSED = tdg4011*xformL13;\n+ \n+ CCTK_REAL csetemp208 CCTK_ATTRIBUTE_UNUSED = tdg4012*xformL23;\n+ \n+ CCTK_REAL csetemp209 CCTK_ATTRIBUTE_UNUSED = tdg4013*xformL33;\n+ \n+ CCTK_REAL csetemp210 CCTK_ATTRIBUTE_UNUSED = tdg4020*xformL03;\n+ \n+ CCTK_REAL csetemp211 CCTK_ATTRIBUTE_UNUSED = tdg4021*xformL13;\n+ \n+ CCTK_REAL csetemp212 CCTK_ATTRIBUTE_UNUSED = tdg4022*xformL23;\n+ \n+ CCTK_REAL csetemp213 CCTK_ATTRIBUTE_UNUSED = tdg4023*xformL33;\n+ \n+ CCTK_REAL csetemp214 CCTK_ATTRIBUTE_UNUSED = tdg4030*xformL03;\n+ \n+ CCTK_REAL csetemp215 CCTK_ATTRIBUTE_UNUSED = tdg4031*xformL13;\n+ \n+ CCTK_REAL csetemp216 CCTK_ATTRIBUTE_UNUSED = tdg4032*xformL23;\n+ \n+ CCTK_REAL csetemp217 CCTK_ATTRIBUTE_UNUSED = tdg4033*xformL33;\n+ \n+ CCTK_REAL csetemp218 CCTK_ATTRIBUTE_UNUSED = tdg4110*xformL03;\n+ \n+ CCTK_REAL csetemp219 CCTK_ATTRIBUTE_UNUSED = tdg4111*xformL13;\n+ \n+ CCTK_REAL csetemp220 CCTK_ATTRIBUTE_UNUSED = tdg4112*xformL23;\n+ \n+ CCTK_REAL csetemp221 CCTK_ATTRIBUTE_UNUSED = tdg4113*xformL33;\n+ \n+ CCTK_REAL csetemp222 CCTK_ATTRIBUTE_UNUSED = tdg4120*xformL03;\n+ \n+ CCTK_REAL csetemp223 CCTK_ATTRIBUTE_UNUSED = tdg4121*xformL13;\n+ \n+ CCTK_REAL csetemp224 CCTK_ATTRIBUTE_UNUSED = tdg4122*xformL23;\n+ \n+ CCTK_REAL csetemp225 CCTK_ATTRIBUTE_UNUSED = tdg4123*xformL33;\n+ \n+ CCTK_REAL csetemp226 CCTK_ATTRIBUTE_UNUSED = tdg4130*xformL03;\n+ \n+ CCTK_REAL csetemp227 CCTK_ATTRIBUTE_UNUSED = tdg4131*xformL13;\n+ \n+ CCTK_REAL csetemp228 CCTK_ATTRIBUTE_UNUSED = tdg4132*xformL23;\n+ \n+ CCTK_REAL csetemp229 CCTK_ATTRIBUTE_UNUSED = tdg4133*xformL33;\n+ \n+ CCTK_REAL csetemp230 CCTK_ATTRIBUTE_UNUSED = tdg4220*xformL03;\n+ \n+ CCTK_REAL csetemp231 CCTK_ATTRIBUTE_UNUSED = tdg4221*xformL13;\n+ \n+ CCTK_REAL csetemp232 CCTK_ATTRIBUTE_UNUSED = tdg4222*xformL23;\n+ \n+ CCTK_REAL csetemp233 CCTK_ATTRIBUTE_UNUSED = tdg4223*xformL33;\n+ \n+ CCTK_REAL csetemp234 CCTK_ATTRIBUTE_UNUSED = tdg4230*xformL03;\n+ \n+ CCTK_REAL csetemp235 CCTK_ATTRIBUTE_UNUSED = tdg4231*xformL13;\n+ \n+ CCTK_REAL csetemp236 CCTK_ATTRIBUTE_UNUSED = tdg4232*xformL23;\n+ \n+ CCTK_REAL csetemp237 CCTK_ATTRIBUTE_UNUSED = tdg4233*xformL33;\n+ \n+ CCTK_REAL csetemp238 CCTK_ATTRIBUTE_UNUSED = tdg4330*xformL03;\n+ \n+ CCTK_REAL csetemp239 CCTK_ATTRIBUTE_UNUSED = tdg4331*xformL13;\n+ \n+ CCTK_REAL csetemp240 CCTK_ATTRIBUTE_UNUSED = tdg4332*xformL23;\n+ \n+ CCTK_REAL csetemp241 CCTK_ATTRIBUTE_UNUSED = tdg4333*xformL33;\n+ \n+ CCTK_REAL dg4013 CCTK_ATTRIBUTE_UNUSED = xformL00*((csetemp202 + \n+ csetemp203 + csetemp204 + csetemp205)*xformL01 + (csetemp206 + \n+ csetemp207 + csetemp208 + csetemp209)*xformL11 + (csetemp210 + \n+ csetemp211 + csetemp212 + csetemp213)*xformL21 + (csetemp214 + \n+ csetemp215 + csetemp216 + csetemp217)*xformL31) + xformL10*((csetemp206 \n+ + csetemp207 + csetemp208 + csetemp209)*xformL01 + (csetemp218 + \n+ csetemp219 + csetemp220 + csetemp221)*xformL11 + (csetemp222 + \n+ csetemp223 + csetemp224 + csetemp225)*xformL21 + (csetemp226 + \n+ csetemp227 + csetemp228 + csetemp229)*xformL31) + xformL20*((csetemp210 \n+ + csetemp211 + csetemp212 + csetemp213)*xformL01 + (csetemp222 + \n+ csetemp223 + csetemp224 + csetemp225)*xformL11 + (csetemp230 + \n+ csetemp231 + csetemp232 + csetemp233)*xformL21 + (csetemp234 + \n+ csetemp235 + csetemp236 + csetemp237)*xformL31) + xformL30*((csetemp214 \n+ + csetemp215 + csetemp216 + csetemp217)*xformL01 + (csetemp226 + \n+ csetemp227 + csetemp228 + csetemp229)*xformL11 + (csetemp234 + \n+ csetemp235 + csetemp236 + csetemp237)*xformL21 + (csetemp238 + \n+ csetemp239 + csetemp240 + csetemp241)*xformL31);\n+ \n+ CCTK_REAL dg4020 CCTK_ATTRIBUTE_UNUSED = xformL10*((csetemp86 + \n+ csetemp87 + csetemp88 + csetemp89)*xformL02 + (csetemp100 + csetemp101 \n+ + csetemp98 + csetemp99)*xformL12 + (csetemp102 + csetemp103 + \n+ csetemp104 + csetemp105)*xformL22 + (csetemp106 + csetemp107 + \n+ csetemp108 + csetemp109)*xformL32) + xformL20*((csetemp90 + csetemp91 + \n+ csetemp92 + csetemp93)*xformL02 + (csetemp102 + csetemp103 + csetemp104 \n+ + csetemp105)*xformL12 + (csetemp110 + csetemp111 + csetemp112 + \n+ csetemp113)*xformL22 + (csetemp114 + csetemp115 + csetemp116 + \n+ csetemp117)*xformL32) + xformL30*((csetemp94 + csetemp95 + csetemp96 + \n+ csetemp97)*xformL02 + (csetemp106 + csetemp107 + csetemp108 + \n+ csetemp109)*xformL12 + (csetemp114 + csetemp115 + csetemp116 + \n+ csetemp117)*xformL22 + (csetemp118 + csetemp119 + csetemp120 + \n+ csetemp121)*xformL32) + xformL00*((csetemp82 + csetemp83 + csetemp84 + \n+ csetemp85)*xformL02 + (csetemp86 + csetemp87 + csetemp88 + \n+ csetemp89)*xformL12 + (csetemp90 + csetemp91 + csetemp92 + \n+ csetemp93)*xformL22 + (csetemp94 + csetemp95 + csetemp96 + \n+ csetemp97)*xformL32);\n+ \n+ CCTK_REAL dg4021 CCTK_ATTRIBUTE_UNUSED = xformL00*((csetemp122 + \n+ csetemp123 + csetemp124 + csetemp125)*xformL02 + (csetemp126 + \n+ csetemp127 + csetemp128 + csetemp129)*xformL12 + (csetemp130 + \n+ csetemp131 + csetemp132 + csetemp133)*xformL22 + (csetemp134 + \n+ csetemp135 + csetemp136 + csetemp137)*xformL32) + xformL10*((csetemp126 \n+ + csetemp127 + csetemp128 + csetemp129)*xformL02 + (csetemp138 + \n+ csetemp139 + csetemp140 + csetemp141)*xformL12 + (csetemp142 + \n+ csetemp143 + csetemp144 + csetemp145)*xformL22 + (csetemp146 + \n+ csetemp147 + csetemp148 + csetemp149)*xformL32) + xformL20*((csetemp130 \n+ + csetemp131 + csetemp132 + csetemp133)*xformL02 + (csetemp142 + \n+ csetemp143 + csetemp144 + csetemp145)*xformL12 + (csetemp150 + \n+ csetemp151 + csetemp152 + csetemp153)*xformL22 + (csetemp154 + \n+ csetemp155 + csetemp156 + csetemp157)*xformL32) + xformL30*((csetemp134 \n+ + csetemp135 + csetemp136 + csetemp137)*xformL02 + (csetemp146 + \n+ csetemp147 + csetemp148 + csetemp149)*xformL12 + (csetemp154 + \n+ csetemp155 + csetemp156 + csetemp157)*xformL22 + (csetemp158 + \n+ csetemp159 + csetemp160 + csetemp161)*xformL32);\n+ \n+ CCTK_REAL dg4022 CCTK_ATTRIBUTE_UNUSED = xformL00*((csetemp162 + \n+ csetemp163 + csetemp164 + csetemp165)*xformL02 + (csetemp166 + \n+ csetemp167 + csetemp168 + csetemp169)*xformL12 + (csetemp170 + \n+ csetemp171 + csetemp172 + csetemp173)*xformL22 + (csetemp174 + \n+ csetemp175 + csetemp176 + csetemp177)*xformL32) + xformL10*((csetemp166 \n+ + csetemp167 + csetemp168 + csetemp169)*xformL02 + (csetemp178 + \n+ csetemp179 + csetemp180 + csetemp181)*xformL12 + (csetemp182 + \n+ csetemp183 + csetemp184 + csetemp185)*xformL22 + (csetemp186 + \n+ csetemp187 + csetemp188 + csetemp189)*xformL32) + xformL20*((csetemp170 \n+ + csetemp171 + csetemp172 + csetemp173)*xformL02 + (csetemp182 + \n+ csetemp183 + csetemp184 + csetemp185)*xformL12 + (csetemp190 + \n+ csetemp191 + csetemp192 + csetemp193)*xformL22 + (csetemp194 + \n+ csetemp195 + csetemp196 + csetemp197)*xformL32) + xformL30*((csetemp174 \n+ + csetemp175 + csetemp176 + csetemp177)*xformL02 + (csetemp186 + \n+ csetemp187 + csetemp188 + csetemp189)*xformL12 + (csetemp194 + \n+ csetemp195 + csetemp196 + csetemp197)*xformL22 + (csetemp198 + \n+ csetemp199 + csetemp200 + csetemp201)*xformL32);\n+ \n+ CCTK_REAL dg4023 CCTK_ATTRIBUTE_UNUSED = xformL00*((csetemp202 + \n+ csetemp203 + csetemp204 + csetemp205)*xformL02 + (csetemp206 + \n+ csetemp207 + csetemp208 + csetemp209)*xformL12 + (csetemp210 + \n+ csetemp211 + csetemp212 + csetemp213)*xformL22 + (csetemp214 + \n+ csetemp215 + csetemp216 + csetemp217)*xformL32) + xformL10*((csetemp206 \n+ + csetemp207 + csetemp208 + csetemp209)*xformL02 + (csetemp218 + \n+ csetemp219 + csetemp220 + csetemp221)*xformL12 + (csetemp222 + \n+ csetemp223 + csetemp224 + csetemp225)*xformL22 + (csetemp226 + \n+ csetemp227 + csetemp228 + csetemp229)*xformL32) + xformL20*((csetemp210 \n+ + csetemp211 + csetemp212 + csetemp213)*xformL02 + (csetemp222 + \n+ csetemp223 + csetemp224 + csetemp225)*xformL12 + (csetemp230 + \n+ csetemp231 + csetemp232 + csetemp233)*xformL22 + (csetemp234 + \n+ csetemp235 + csetemp236 + csetemp237)*xformL32) + xformL30*((csetemp214 \n+ + csetemp215 + csetemp216 + csetemp217)*xformL02 + (csetemp226 + \n+ csetemp227 + csetemp228 + csetemp229)*xformL12 + (csetemp234 + \n+ csetemp235 + csetemp236 + csetemp237)*xformL22 + (csetemp238 + \n+ csetemp239 + csetemp240 + csetemp241)*xformL32);\n+ \n+ CCTK_REAL dg4030 CCTK_ATTRIBUTE_UNUSED = xformL10*((csetemp86 + \n+ csetemp87 + csetemp88 + csetemp89)*xformL03 + (csetemp100 + csetemp101 \n+ + csetemp98 + csetemp99)*xformL13 + (csetemp102 + csetemp103 + \n+ csetemp104 + csetemp105)*xformL23 + (csetemp106 + csetemp107 + \n+ csetemp108 + csetemp109)*xformL33) + xformL20*((csetemp90 + csetemp91 + \n+ csetemp92 + csetemp93)*xformL03 + (csetemp102 + csetemp103 + csetemp104 \n+ + csetemp105)*xformL13 + (csetemp110 + csetemp111 + csetemp112 + \n+ csetemp113)*xformL23 + (csetemp114 + csetemp115 + csetemp116 + \n+ csetemp117)*xformL33) + xformL30*((csetemp94 + csetemp95 + csetemp96 + \n+ csetemp97)*xformL03 + (csetemp106 + csetemp107 + csetemp108 + \n+ csetemp109)*xformL13 + (csetemp114 + csetemp115 + csetemp116 + \n+ csetemp117)*xformL23 + (csetemp118 + csetemp119 + csetemp120 + \n+ csetemp121)*xformL33) + xformL00*((csetemp82 + csetemp83 + csetemp84 + \n+ csetemp85)*xformL03 + (csetemp86 + csetemp87 + csetemp88 + \n+ csetemp89)*xformL13 + (csetemp90 + csetemp91 + csetemp92 + \n+ csetemp93)*xformL23 + (csetemp94 + csetemp95 + csetemp96 + \n+ csetemp97)*xformL33);\n+ \n+ CCTK_REAL dg4031 CCTK_ATTRIBUTE_UNUSED = xformL00*((csetemp122 + \n+ csetemp123 + csetemp124 + csetemp125)*xformL03 + (csetemp126 + \n+ csetemp127 + csetemp128 + csetemp129)*xformL13 + (csetemp130 + \n+ csetemp131 + csetemp132 + csetemp133)*xformL23 + (csetemp134 + \n+ csetemp135 + csetemp136 + csetemp137)*xformL33) + xformL10*((csetemp126 \n+ + csetemp127 + csetemp128 + csetemp129)*xformL03 + (csetemp138 + \n+ csetemp139 + csetemp140 + csetemp141)*xformL13 + (csetemp142 + \n+ csetemp143 + csetemp144 + csetemp145)*xformL23 + (csetemp146 + \n+ csetemp147 + csetemp148 + csetemp149)*xformL33) + xformL20*((csetemp130 \n+ + csetemp131 + csetemp132 + csetemp133)*xformL03 + (csetemp142 + \n+ csetemp143 + csetemp144 + csetemp145)*xformL13 + (csetemp150 + \n+ csetemp151 + csetemp152 + csetemp153)*xformL23 + (csetemp154 + \n+ csetemp155 + csetemp156 + csetemp157)*xformL33) + xformL30*((csetemp134 \n+ + csetemp135 + csetemp136 + csetemp137)*xformL03 + (csetemp146 + \n+ csetemp147 + csetemp148 + csetemp149)*xformL13 + (csetemp154 + \n+ csetemp155 + csetemp156 + csetemp157)*xformL23 + (csetemp158 + \n+ csetemp159 + csetemp160 + csetemp161)*xformL33);\n+ \n+ CCTK_REAL dg4032 CCTK_ATTRIBUTE_UNUSED = xformL00*((csetemp162 + \n+ csetemp163 + csetemp164 + csetemp165)*xformL03 + (csetemp166 + \n+ csetemp167 + csetemp168 + csetemp169)*xformL13 + (csetemp170 + \n+ csetemp171 + csetemp172 + csetemp173)*xformL23 + (csetemp174 + \n+ csetemp175 + csetemp176 + csetemp177)*xformL33) + xformL10*((csetemp166 \n+ + csetemp167 + csetemp168 + csetemp169)*xformL03 + (csetemp178 + \n+ csetemp179 + csetemp180 + csetemp181)*xformL13 + (csetemp182 + \n+ csetemp183 + csetemp184 + csetemp185)*xformL23 + (csetemp186 + \n+ csetemp187 + csetemp188 + csetemp189)*xformL33) + xformL20*((csetemp170 \n+ + csetemp171 + csetemp172 + csetemp173)*xformL03 + (csetemp182 + \n+ csetemp183 + csetemp184 + csetemp185)*xformL13 + (csetemp190 + \n+ csetemp191 + csetemp192 + csetemp193)*xformL23 + (csetemp194 + \n+ csetemp195 + csetemp196 + csetemp197)*xformL33) + xformL30*((csetemp174 \n+ + csetemp175 + csetemp176 + csetemp177)*xformL03 + (csetemp186 + \n+ csetemp187 + csetemp188 + csetemp189)*xformL13 + (csetemp194 + \n+ csetemp195 + csetemp196 + csetemp197)*xformL23 + (csetemp198 + \n+ csetemp199 + csetemp200 + csetemp201)*xformL33);\n+ \n+ CCTK_REAL dg4033 CCTK_ATTRIBUTE_UNUSED = xformL00*((csetemp202 + \n+ csetemp203 + csetemp204 + csetemp205)*xformL03 + (csetemp206 + \n+ csetemp207 + csetemp208 + csetemp209)*xformL13 + (csetemp210 + \n+ csetemp211 + csetemp212 + csetemp213)*xformL23 + (csetemp214 + \n+ csetemp215 + csetemp216 + csetemp217)*xformL33) + xformL10*((csetemp206 \n+ + csetemp207 + csetemp208 + csetemp209)*xformL03 + (csetemp218 + \n+ csetemp219 + csetemp220 + csetemp221)*xformL13 + (csetemp222 + \n+ csetemp223 + csetemp224 + csetemp225)*xformL23 + (csetemp226 + \n+ csetemp227 + csetemp228 + csetemp229)*xformL33) + xformL20*((csetemp210 \n+ + csetemp211 + csetemp212 + csetemp213)*xformL03 + (csetemp222 + \n+ csetemp223 + csetemp224 + csetemp225)*xformL13 + (csetemp230 + \n+ csetemp231 + csetemp232 + csetemp233)*xformL23 + (csetemp234 + \n+ csetemp235 + csetemp236 + csetemp237)*xformL33) + xformL30*((csetemp214 \n+ + csetemp215 + csetemp216 + csetemp217)*xformL03 + (csetemp226 + \n+ csetemp227 + csetemp228 + csetemp229)*xformL13 + (csetemp234 + \n+ csetemp235 + csetemp236 + csetemp237)*xformL23 + (csetemp238 + \n+ csetemp239 + csetemp240 + csetemp241)*xformL33);\n+ \n+ CCTK_REAL dg4110 CCTK_ATTRIBUTE_UNUSED = xformL11*((csetemp86 + \n+ csetemp87 + csetemp88 + csetemp89)*xformL01 + (csetemp100 + csetemp101 \n+ + csetemp98 + csetemp99)*xformL11 + (csetemp102 + csetemp103 + \n+ csetemp104 + csetemp105)*xformL21 + (csetemp106 + csetemp107 + \n+ csetemp108 + csetemp109)*xformL31) + xformL21*((csetemp90 + csetemp91 + \n+ csetemp92 + csetemp93)*xformL01 + (csetemp102 + csetemp103 + csetemp104 \n+ + csetemp105)*xformL11 + (csetemp110 + csetemp111 + csetemp112 + \n+ csetemp113)*xformL21 + (csetemp114 + csetemp115 + csetemp116 + \n+ csetemp117)*xformL31) + xformL31*((csetemp94 + csetemp95 + csetemp96 + \n+ csetemp97)*xformL01 + (csetemp106 + csetemp107 + csetemp108 + \n+ csetemp109)*xformL11 + (csetemp114 + csetemp115 + csetemp116 + \n+ csetemp117)*xformL21 + (csetemp118 + csetemp119 + csetemp120 + \n+ csetemp121)*xformL31) + xformL01*((csetemp82 + csetemp83 + csetemp84 + \n+ csetemp85)*xformL01 + (csetemp86 + csetemp87 + csetemp88 + \n+ csetemp89)*xformL11 + (csetemp90 + csetemp91 + csetemp92 + \n+ csetemp93)*xformL21 + (csetemp94 + csetemp95 + csetemp96 + \n+ csetemp97)*xformL31);\n+ \n+ CCTK_REAL dg4111 CCTK_ATTRIBUTE_UNUSED = xformL01*((csetemp122 + \n+ csetemp123 + csetemp124 + csetemp125)*xformL01 + (csetemp126 + \n+ csetemp127 + csetemp128 + csetemp129)*xformL11 + (csetemp130 + \n+ csetemp131 + csetemp132 + csetemp133)*xformL21 + (csetemp134 + \n+ csetemp135 + csetemp136 + csetemp137)*xformL31) + xformL11*((csetemp126 \n+ + csetemp127 + csetemp128 + csetemp129)*xformL01 + (csetemp138 + \n+ csetemp139 + csetemp140 + csetemp141)*xformL11 + (csetemp142 + \n+ csetemp143 + csetemp144 + csetemp145)*xformL21 + (csetemp146 + \n+ csetemp147 + csetemp148 + csetemp149)*xformL31) + xformL21*((csetemp130 \n+ + csetemp131 + csetemp132 + csetemp133)*xformL01 + (csetemp142 + \n+ csetemp143 + csetemp144 + csetemp145)*xformL11 + (csetemp150 + \n+ csetemp151 + csetemp152 + csetemp153)*xformL21 + (csetemp154 + \n+ csetemp155 + csetemp156 + csetemp157)*xformL31) + xformL31*((csetemp134 \n+ + csetemp135 + csetemp136 + csetemp137)*xformL01 + (csetemp146 + \n+ csetemp147 + csetemp148 + csetemp149)*xformL11 + (csetemp154 + \n+ csetemp155 + csetemp156 + csetemp157)*xformL21 + (csetemp158 + \n+ csetemp159 + csetemp160 + csetemp161)*xformL31);\n+ \n+ CCTK_REAL dg4112 CCTK_ATTRIBUTE_UNUSED = xformL01*((csetemp162 + \n+ csetemp163 + csetemp164 + csetemp165)*xformL01 + (csetemp166 + \n+ csetemp167 + csetemp168 + csetemp169)*xformL11 + (csetemp170 + \n+ csetemp171 + csetemp172 + csetemp173)*xformL21 + (csetemp174 + \n+ csetemp175 + csetemp176 + csetemp177)*xformL31) + xformL11*((csetemp166 \n+ + csetemp167 + csetemp168 + csetemp169)*xformL01 + (csetemp178 + \n+ csetemp179 + csetemp180 + csetemp181)*xformL11 + (csetemp182 + \n+ csetemp183 + csetemp184 + csetemp185)*xformL21 + (csetemp186 + \n+ csetemp187 + csetemp188 + csetemp189)*xformL31) + xformL21*((csetemp170 \n+ + csetemp171 + csetemp172 + csetemp173)*xformL01 + (csetemp182 + \n+ csetemp183 + csetemp184 + csetemp185)*xformL11 + (csetemp190 + \n+ csetemp191 + csetemp192 + csetemp193)*xformL21 + (csetemp194 + \n+ csetemp195 + csetemp196 + csetemp197)*xformL31) + xformL31*((csetemp174 \n+ + csetemp175 + csetemp176 + csetemp177)*xformL01 + (csetemp186 + \n+ csetemp187 + csetemp188 + csetemp189)*xformL11 + (csetemp194 + \n+ csetemp195 + csetemp196 + csetemp197)*xformL21 + (csetemp198 + \n+ csetemp199 + csetemp200 + csetemp201)*xformL31);\n+ \n+ CCTK_REAL dg4113 CCTK_ATTRIBUTE_UNUSED = xformL01*((csetemp202 + \n+ csetemp203 + csetemp204 + csetemp205)*xformL01 + (csetemp206 + \n+ csetemp207 + csetemp208 + csetemp209)*xformL11 + (csetemp210 + \n+ csetemp211 + csetemp212 + csetemp213)*xformL21 + (csetemp214 + \n+ csetemp215 + csetemp216 + csetemp217)*xformL31) + xformL11*((csetemp206 \n+ + csetemp207 + csetemp208 + csetemp209)*xformL01 + (csetemp218 + \n+ csetemp219 + csetemp220 + csetemp221)*xformL11 + (csetemp222 + \n+ csetemp223 + csetemp224 + csetemp225)*xformL21 + (csetemp226 + \n+ csetemp227 + csetemp228 + csetemp229)*xformL31) + xformL21*((csetemp210 \n+ + csetemp211 + csetemp212 + csetemp213)*xformL01 + (csetemp222 + \n+ csetemp223 + csetemp224 + csetemp225)*xformL11 + (csetemp230 + \n+ csetemp231 + csetemp232 + csetemp233)*xformL21 + (csetemp234 + \n+ csetemp235 + csetemp236 + csetemp237)*xformL31) + xformL31*((csetemp214 \n+ + csetemp215 + csetemp216 + csetemp217)*xformL01 + (csetemp226 + \n+ csetemp227 + csetemp228 + csetemp229)*xformL11 + (csetemp234 + \n+ csetemp235 + csetemp236 + csetemp237)*xformL21 + (csetemp238 + \n+ csetemp239 + csetemp240 + csetemp241)*xformL31);\n+ \n+ CCTK_REAL dg4120 CCTK_ATTRIBUTE_UNUSED = xformL11*((csetemp86 + \n+ csetemp87 + csetemp88 + csetemp89)*xformL02 + (csetemp100 + csetemp101 \n+ + csetemp98 + csetemp99)*xformL12 + (csetemp102 + csetemp103 + \n+ csetemp104 + csetemp105)*xformL22 + (csetemp106 + csetemp107 + \n+ csetemp108 + csetemp109)*xformL32) + xformL21*((csetemp90 + csetemp91 + \n+ csetemp92 + csetemp93)*xformL02 + (csetemp102 + csetemp103 + csetemp104 \n+ + csetemp105)*xformL12 + (csetemp110 + csetemp111 + csetemp112 + \n+ csetemp113)*xformL22 + (csetemp114 + csetemp115 + csetemp116 + \n+ csetemp117)*xformL32) + xformL31*((csetemp94 + csetemp95 + csetemp96 + \n+ csetemp97)*xformL02 + (csetemp106 + csetemp107 + csetemp108 + \n+ csetemp109)*xformL12 + (csetemp114 + csetemp115 + csetemp116 + \n+ csetemp117)*xformL22 + (csetemp118 + csetemp119 + csetemp120 + \n+ csetemp121)*xformL32) + xformL01*((csetemp82 + csetemp83 + csetemp84 + \n+ csetemp85)*xformL02 + (csetemp86 + csetemp87 + csetemp88 + \n+ csetemp89)*xformL12 + (csetemp90 + csetemp91 + csetemp92 + \n+ csetemp93)*xformL22 + (csetemp94 + csetemp95 + csetemp96 + \n+ csetemp97)*xformL32);\n+ \n+ CCTK_REAL dg4121 CCTK_ATTRIBUTE_UNUSED = xformL01*((csetemp122 + \n+ csetemp123 + csetemp124 + csetemp125)*xformL02 + (csetemp126 + \n+ csetemp127 + csetemp128 + csetemp129)*xformL12 + (csetemp130 + \n+ csetemp131 + csetemp132 + csetemp133)*xformL22 + (csetemp134 + \n+ csetemp135 + csetemp136 + csetemp137)*xformL32) + xformL11*((csetemp126 \n+ + csetemp127 + csetemp128 + csetemp129)*xformL02 + (csetemp138 + \n+ csetemp139 + csetemp140 + csetemp141)*xformL12 + (csetemp142 + \n+ csetemp143 + csetemp144 + csetemp145)*xformL22 + (csetemp146 + \n+ csetemp147 + csetemp148 + csetemp149)*xformL32) + xformL21*((csetemp130 \n+ + csetemp131 + csetemp132 + csetemp133)*xformL02 + (csetemp142 + \n+ csetemp143 + csetemp144 + csetemp145)*xformL12 + (csetemp150 + \n+ csetemp151 + csetemp152 + csetemp153)*xformL22 + (csetemp154 + \n+ csetemp155 + csetemp156 + csetemp157)*xformL32) + xformL31*((csetemp134 \n+ + csetemp135 + csetemp136 + csetemp137)*xformL02 + (csetemp146 + \n+ csetemp147 + csetemp148 + csetemp149)*xformL12 + (csetemp154 + \n+ csetemp155 + csetemp156 + csetemp157)*xformL22 + (csetemp158 + \n+ csetemp159 + csetemp160 + csetemp161)*xformL32);\n+ \n+ CCTK_REAL dg4122 CCTK_ATTRIBUTE_UNUSED = xformL01*((csetemp162 + \n+ csetemp163 + csetemp164 + csetemp165)*xformL02 + (csetemp166 + \n+ csetemp167 + csetemp168 + csetemp169)*xformL12 + (csetemp170 + \n+ csetemp171 + csetemp172 + csetemp173)*xformL22 + (csetemp174 + \n+ csetemp175 + csetemp176 + csetemp177)*xformL32) + xformL11*((csetemp166 \n+ + csetemp167 + csetemp168 + csetemp169)*xformL02 + (csetemp178 + \n+ csetemp179 + csetemp180 + csetemp181)*xformL12 + (csetemp182 + \n+ csetemp183 + csetemp184 + csetemp185)*xformL22 + (csetemp186 + \n+ csetemp187 + csetemp188 + csetemp189)*xformL32) + xformL21*((csetemp170 \n+ + csetemp171 + csetemp172 + csetemp173)*xformL02 + (csetemp182 + \n+ csetemp183 + csetemp184 + csetemp185)*xformL12 + (csetemp190 + \n+ csetemp191 + csetemp192 + csetemp193)*xformL22 + (csetemp194 + \n+ csetemp195 + csetemp196 + csetemp197)*xformL32) + xformL31*((csetemp174 \n+ + csetemp175 + csetemp176 + csetemp177)*xformL02 + (csetemp186 + \n+ csetemp187 + csetemp188 + csetemp189)*xformL12 + (csetemp194 + \n+ csetemp195 + csetemp196 + csetemp197)*xformL22 + (csetemp198 + \n+ csetemp199 + csetemp200 + csetemp201)*xformL32);\n+ \n+ CCTK_REAL dg4123 CCTK_ATTRIBUTE_UNUSED = xformL01*((csetemp202 + \n+ csetemp203 + csetemp204 + csetemp205)*xformL02 + (csetemp206 + \n+ csetemp207 + csetemp208 + csetemp209)*xformL12 + (csetemp210 + \n+ csetemp211 + csetemp212 + csetemp213)*xformL22 + (csetemp214 + \n+ csetemp215 + csetemp216 + csetemp217)*xformL32) + xformL11*((csetemp206 \n+ + csetemp207 + csetemp208 + csetemp209)*xformL02 + (csetemp218 + \n+ csetemp219 + csetemp220 + csetemp221)*xformL12 + (csetemp222 + \n+ csetemp223 + csetemp224 + csetemp225)*xformL22 + (csetemp226 + \n+ csetemp227 + csetemp228 + csetemp229)*xformL32) + xformL21*((csetemp210 \n+ + csetemp211 + csetemp212 + csetemp213)*xformL02 + (csetemp222 + \n+ csetemp223 + csetemp224 + csetemp225)*xformL12 + (csetemp230 + \n+ csetemp231 + csetemp232 + csetemp233)*xformL22 + (csetemp234 + \n+ csetemp235 + csetemp236 + csetemp237)*xformL32) + xformL31*((csetemp214 \n+ + csetemp215 + csetemp216 + csetemp217)*xformL02 + (csetemp226 + \n+ csetemp227 + csetemp228 + csetemp229)*xformL12 + (csetemp234 + \n+ csetemp235 + csetemp236 + csetemp237)*xformL22 + (csetemp238 + \n+ csetemp239 + csetemp240 + csetemp241)*xformL32);\n+ \n+ CCTK_REAL dg4130 CCTK_ATTRIBUTE_UNUSED = xformL11*((csetemp86 + \n+ csetemp87 + csetemp88 + csetemp89)*xformL03 + (csetemp100 + csetemp101 \n+ + csetemp98 + csetemp99)*xformL13 + (csetemp102 + csetemp103 + \n+ csetemp104 + csetemp105)*xformL23 + (csetemp106 + csetemp107 + \n+ csetemp108 + csetemp109)*xformL33) + xformL21*((csetemp90 + csetemp91 + \n+ csetemp92 + csetemp93)*xformL03 + (csetemp102 + csetemp103 + csetemp104 \n+ + csetemp105)*xformL13 + (csetemp110 + csetemp111 + csetemp112 + \n+ csetemp113)*xformL23 + (csetemp114 + csetemp115 + csetemp116 + \n+ csetemp117)*xformL33) + xformL31*((csetemp94 + csetemp95 + csetemp96 + \n+ csetemp97)*xformL03 + (csetemp106 + csetemp107 + csetemp108 + \n+ csetemp109)*xformL13 + (csetemp114 + csetemp115 + csetemp116 + \n+ csetemp117)*xformL23 + (csetemp118 + csetemp119 + csetemp120 + \n+ csetemp121)*xformL33) + xformL01*((csetemp82 + csetemp83 + csetemp84 + \n+ csetemp85)*xformL03 + (csetemp86 + csetemp87 + csetemp88 + \n+ csetemp89)*xformL13 + (csetemp90 + csetemp91 + csetemp92 + \n+ csetemp93)*xformL23 + (csetemp94 + csetemp95 + csetemp96 + \n+ csetemp97)*xformL33);\n+ \n+ CCTK_REAL dg4131 CCTK_ATTRIBUTE_UNUSED = xformL01*((csetemp122 + \n+ csetemp123 + csetemp124 + csetemp125)*xformL03 + (csetemp126 + \n+ csetemp127 + csetemp128 + csetemp129)*xformL13 + (csetemp130 + \n+ csetemp131 + csetemp132 + csetemp133)*xformL23 + (csetemp134 + \n+ csetemp135 + csetemp136 + csetemp137)*xformL33) + xformL11*((csetemp126 \n+ + csetemp127 + csetemp128 + csetemp129)*xformL03 + (csetemp138 + \n+ csetemp139 + csetemp140 + csetemp141)*xformL13 + (csetemp142 + \n+ csetemp143 + csetemp144 + csetemp145)*xformL23 + (csetemp146 + \n+ csetemp147 + csetemp148 + csetemp149)*xformL33) + xformL21*((csetemp130 \n+ + csetemp131 + csetemp132 + csetemp133)*xformL03 + (csetemp142 + \n+ csetemp143 + csetemp144 + csetemp145)*xformL13 + (csetemp150 + \n+ csetemp151 + csetemp152 + csetemp153)*xformL23 + (csetemp154 + \n+ csetemp155 + csetemp156 + csetemp157)*xformL33) + xformL31*((csetemp134 \n+ + csetemp135 + csetemp136 + csetemp137)*xformL03 + (csetemp146 + \n+ csetemp147 + csetemp148 + csetemp149)*xformL13 + (csetemp154 + \n+ csetemp155 + csetemp156 + csetemp157)*xformL23 + (csetemp158 + \n+ csetemp159 + csetemp160 + csetemp161)*xformL33);\n+ \n+ CCTK_REAL dg4132 CCTK_ATTRIBUTE_UNUSED = xformL01*((csetemp162 + \n+ csetemp163 + csetemp164 + csetemp165)*xformL03 + (csetemp166 + \n+ csetemp167 + csetemp168 + csetemp169)*xformL13 + (csetemp170 + \n+ csetemp171 + csetemp172 + csetemp173)*xformL23 + (csetemp174 + \n+ csetemp175 + csetemp176 + csetemp177)*xformL33) + xformL11*((csetemp166 \n+ + csetemp167 + csetemp168 + csetemp169)*xformL03 + (csetemp178 + \n+ csetemp179 + csetemp180 + csetemp181)*xformL13 + (csetemp182 + \n+ csetemp183 + csetemp184 + csetemp185)*xformL23 + (csetemp186 + \n+ csetemp187 + csetemp188 + csetemp189)*xformL33) + xformL21*((csetemp170 \n+ + csetemp171 + csetemp172 + csetemp173)*xformL03 + (csetemp182 + \n+ csetemp183 + csetemp184 + csetemp185)*xformL13 + (csetemp190 + \n+ csetemp191 + csetemp192 + csetemp193)*xformL23 + (csetemp194 + \n+ csetemp195 + csetemp196 + csetemp197)*xformL33) + xformL31*((csetemp174 \n+ + csetemp175 + csetemp176 + csetemp177)*xformL03 + (csetemp186 + \n+ csetemp187 + csetemp188 + csetemp189)*xformL13 + (csetemp194 + \n+ csetemp195 + csetemp196 + csetemp197)*xformL23 + (csetemp198 + \n+ csetemp199 + csetemp200 + csetemp201)*xformL33);\n+ \n+ CCTK_REAL dg4133 CCTK_ATTRIBUTE_UNUSED = xformL01*((csetemp202 + \n+ csetemp203 + csetemp204 + csetemp205)*xformL03 + (csetemp206 + \n+ csetemp207 + csetemp208 + csetemp209)*xformL13 + (csetemp210 + \n+ csetemp211 + csetemp212 + csetemp213)*xformL23 + (csetemp214 + \n+ csetemp215 + csetemp216 + csetemp217)*xformL33) + xformL11*((csetemp206 \n+ + csetemp207 + csetemp208 + csetemp209)*xformL03 + (csetemp218 + \n+ csetemp219 + csetemp220 + csetemp221)*xformL13 + (csetemp222 + \n+ csetemp223 + csetemp224 + csetemp225)*xformL23 + (csetemp226 + \n+ csetemp227 + csetemp228 + csetemp229)*xformL33) + xformL21*((csetemp210 \n+ + csetemp211 + csetemp212 + csetemp213)*xformL03 + (csetemp222 + \n+ csetemp223 + csetemp224 + csetemp225)*xformL13 + (csetemp230 + \n+ csetemp231 + csetemp232 + csetemp233)*xformL23 + (csetemp234 + \n+ csetemp235 + csetemp236 + csetemp237)*xformL33) + xformL31*((csetemp214 \n+ + csetemp215 + csetemp216 + csetemp217)*xformL03 + (csetemp226 + \n+ csetemp227 + csetemp228 + csetemp229)*xformL13 + (csetemp234 + \n+ csetemp235 + csetemp236 + csetemp237)*xformL23 + (csetemp238 + \n+ csetemp239 + csetemp240 + csetemp241)*xformL33);\n+ \n+ CCTK_REAL dg4220 CCTK_ATTRIBUTE_UNUSED = xformL12*((csetemp86 + \n+ csetemp87 + csetemp88 + csetemp89)*xformL02 + (csetemp100 + csetemp101 \n+ + csetemp98 + csetemp99)*xformL12 + (csetemp102 + csetemp103 + \n+ csetemp104 + csetemp105)*xformL22 + (csetemp106 + csetemp107 + \n+ csetemp108 + csetemp109)*xformL32) + xformL22*((csetemp90 + csetemp91 + \n+ csetemp92 + csetemp93)*xformL02 + (csetemp102 + csetemp103 + csetemp104 \n+ + csetemp105)*xformL12 + (csetemp110 + csetemp111 + csetemp112 + \n+ csetemp113)*xformL22 + (csetemp114 + csetemp115 + csetemp116 + \n+ csetemp117)*xformL32) + xformL32*((csetemp94 + csetemp95 + csetemp96 + \n+ csetemp97)*xformL02 + (csetemp106 + csetemp107 + csetemp108 + \n+ csetemp109)*xformL12 + (csetemp114 + csetemp115 + csetemp116 + \n+ csetemp117)*xformL22 + (csetemp118 + csetemp119 + csetemp120 + \n+ csetemp121)*xformL32) + xformL02*((csetemp82 + csetemp83 + csetemp84 + \n+ csetemp85)*xformL02 + (csetemp86 + csetemp87 + csetemp88 + \n+ csetemp89)*xformL12 + (csetemp90 + csetemp91 + csetemp92 + \n+ csetemp93)*xformL22 + (csetemp94 + csetemp95 + csetemp96 + \n+ csetemp97)*xformL32);\n+ \n+ CCTK_REAL dg4221 CCTK_ATTRIBUTE_UNUSED = xformL02*((csetemp122 + \n+ csetemp123 + csetemp124 + csetemp125)*xformL02 + (csetemp126 + \n+ csetemp127 + csetemp128 + csetemp129)*xformL12 + (csetemp130 + \n+ csetemp131 + csetemp132 + csetemp133)*xformL22 + (csetemp134 + \n+ csetemp135 + csetemp136 + csetemp137)*xformL32) + xformL12*((csetemp126 \n+ + csetemp127 + csetemp128 + csetemp129)*xformL02 + (csetemp138 + \n+ csetemp139 + csetemp140 + csetemp141)*xformL12 + (csetemp142 + \n+ csetemp143 + csetemp144 + csetemp145)*xformL22 + (csetemp146 + \n+ csetemp147 + csetemp148 + csetemp149)*xformL32) + xformL22*((csetemp130 \n+ + csetemp131 + csetemp132 + csetemp133)*xformL02 + (csetemp142 + \n+ csetemp143 + csetemp144 + csetemp145)*xformL12 + (csetemp150 + \n+ csetemp151 + csetemp152 + csetemp153)*xformL22 + (csetemp154 + \n+ csetemp155 + csetemp156 + csetemp157)*xformL32) + xformL32*((csetemp134 \n+ + csetemp135 + csetemp136 + csetemp137)*xformL02 + (csetemp146 + \n+ csetemp147 + csetemp148 + csetemp149)*xformL12 + (csetemp154 + \n+ csetemp155 + csetemp156 + csetemp157)*xformL22 + (csetemp158 + \n+ csetemp159 + csetemp160 + csetemp161)*xformL32);\n+ \n+ CCTK_REAL dg4222 CCTK_ATTRIBUTE_UNUSED = xformL02*((csetemp162 + \n+ csetemp163 + csetemp164 + csetemp165)*xformL02 + (csetemp166 + \n+ csetemp167 + csetemp168 + csetemp169)*xformL12 + (csetemp170 + \n+ csetemp171 + csetemp172 + csetemp173)*xformL22 + (csetemp174 + \n+ csetemp175 + csetemp176 + csetemp177)*xformL32) + xformL12*((csetemp166 \n+ + csetemp167 + csetemp168 + csetemp169)*xformL02 + (csetemp178 + \n+ csetemp179 + csetemp180 + csetemp181)*xformL12 + (csetemp182 + \n+ csetemp183 + csetemp184 + csetemp185)*xformL22 + (csetemp186 + \n+ csetemp187 + csetemp188 + csetemp189)*xformL32) + xformL22*((csetemp170 \n+ + csetemp171 + csetemp172 + csetemp173)*xformL02 + (csetemp182 + \n+ csetemp183 + csetemp184 + csetemp185)*xformL12 + (csetemp190 + \n+ csetemp191 + csetemp192 + csetemp193)*xformL22 + (csetemp194 + \n+ csetemp195 + csetemp196 + csetemp197)*xformL32) + xformL32*((csetemp174 \n+ + csetemp175 + csetemp176 + csetemp177)*xformL02 + (csetemp186 + \n+ csetemp187 + csetemp188 + csetemp189)*xformL12 + (csetemp194 + \n+ csetemp195 + csetemp196 + csetemp197)*xformL22 + (csetemp198 + \n+ csetemp199 + csetemp200 + csetemp201)*xformL32);\n+ \n+ CCTK_REAL dg4223 CCTK_ATTRIBUTE_UNUSED = xformL02*((csetemp202 + \n+ csetemp203 + csetemp204 + csetemp205)*xformL02 + (csetemp206 + \n+ csetemp207 + csetemp208 + csetemp209)*xformL12 + (csetemp210 + \n+ csetemp211 + csetemp212 + csetemp213)*xformL22 + (csetemp214 + \n+ csetemp215 + csetemp216 + csetemp217)*xformL32) + xformL12*((csetemp206 \n+ + csetemp207 + csetemp208 + csetemp209)*xformL02 + (csetemp218 + \n+ csetemp219 + csetemp220 + csetemp221)*xformL12 + (csetemp222 + \n+ csetemp223 + csetemp224 + csetemp225)*xformL22 + (csetemp226 + \n+ csetemp227 + csetemp228 + csetemp229)*xformL32) + xformL22*((csetemp210 \n+ + csetemp211 + csetemp212 + csetemp213)*xformL02 + (csetemp222 + \n+ csetemp223 + csetemp224 + csetemp225)*xformL12 + (csetemp230 + \n+ csetemp231 + csetemp232 + csetemp233)*xformL22 + (csetemp234 + \n+ csetemp235 + csetemp236 + csetemp237)*xformL32) + xformL32*((csetemp214 \n+ + csetemp215 + csetemp216 + csetemp217)*xformL02 + (csetemp226 + \n+ csetemp227 + csetemp228 + csetemp229)*xformL12 + (csetemp234 + \n+ csetemp235 + csetemp236 + csetemp237)*xformL22 + (csetemp238 + \n+ csetemp239 + csetemp240 + csetemp241)*xformL32);\n+ \n+ CCTK_REAL dg4230 CCTK_ATTRIBUTE_UNUSED = xformL12*((csetemp86 + \n+ csetemp87 + csetemp88 + csetemp89)*xformL03 + (csetemp100 + csetemp101 \n+ + csetemp98 + csetemp99)*xformL13 + (csetemp102 + csetemp103 + \n+ csetemp104 + csetemp105)*xformL23 + (csetemp106 + csetemp107 + \n+ csetemp108 + csetemp109)*xformL33) + xformL22*((csetemp90 + csetemp91 + \n+ csetemp92 + csetemp93)*xformL03 + (csetemp102 + csetemp103 + csetemp104 \n+ + csetemp105)*xformL13 + (csetemp110 + csetemp111 + csetemp112 + \n+ csetemp113)*xformL23 + (csetemp114 + csetemp115 + csetemp116 + \n+ csetemp117)*xformL33) + xformL32*((csetemp94 + csetemp95 + csetemp96 + \n+ csetemp97)*xformL03 + (csetemp106 + csetemp107 + csetemp108 + \n+ csetemp109)*xformL13 + (csetemp114 + csetemp115 + csetemp116 + \n+ csetemp117)*xformL23 + (csetemp118 + csetemp119 + csetemp120 + \n+ csetemp121)*xformL33) + xformL02*((csetemp82 + csetemp83 + csetemp84 + \n+ csetemp85)*xformL03 + (csetemp86 + csetemp87 + csetemp88 + \n+ csetemp89)*xformL13 + (csetemp90 + csetemp91 + csetemp92 + \n+ csetemp93)*xformL23 + (csetemp94 + csetemp95 + csetemp96 + \n+ csetemp97)*xformL33);\n+ \n+ CCTK_REAL dg4231 CCTK_ATTRIBUTE_UNUSED = xformL02*((csetemp122 + \n+ csetemp123 + csetemp124 + csetemp125)*xformL03 + (csetemp126 + \n+ csetemp127 + csetemp128 + csetemp129)*xformL13 + (csetemp130 + \n+ csetemp131 + csetemp132 + csetemp133)*xformL23 + (csetemp134 + \n+ csetemp135 + csetemp136 + csetemp137)*xformL33) + xformL12*((csetemp126 \n+ + csetemp127 + csetemp128 + csetemp129)*xformL03 + (csetemp138 + \n+ csetemp139 + csetemp140 + csetemp141)*xformL13 + (csetemp142 + \n+ csetemp143 + csetemp144 + csetemp145)*xformL23 + (csetemp146 + \n+ csetemp147 + csetemp148 + csetemp149)*xformL33) + xformL22*((csetemp130 \n+ + csetemp131 + csetemp132 + csetemp133)*xformL03 + (csetemp142 + \n+ csetemp143 + csetemp144 + csetemp145)*xformL13 + (csetemp150 + \n+ csetemp151 + csetemp152 + csetemp153)*xformL23 + (csetemp154 + \n+ csetemp155 + csetemp156 + csetemp157)*xformL33) + xformL32*((csetemp134 \n+ + csetemp135 + csetemp136 + csetemp137)*xformL03 + (csetemp146 + \n+ csetemp147 + csetemp148 + csetemp149)*xformL13 + (csetemp154 + \n+ csetemp155 + csetemp156 + csetemp157)*xformL23 + (csetemp158 + \n+ csetemp159 + csetemp160 + csetemp161)*xformL33);\n+ \n+ CCTK_REAL dg4232 CCTK_ATTRIBUTE_UNUSED = xformL02*((csetemp162 + \n+ csetemp163 + csetemp164 + csetemp165)*xformL03 + (csetemp166 + \n+ csetemp167 + csetemp168 + csetemp169)*xformL13 + (csetemp170 + \n+ csetemp171 + csetemp172 + csetemp173)*xformL23 + (csetemp174 + \n+ csetemp175 + csetemp176 + csetemp177)*xformL33) + xformL12*((csetemp166 \n+ + csetemp167 + csetemp168 + csetemp169)*xformL03 + (csetemp178 + \n+ csetemp179 + csetemp180 + csetemp181)*xformL13 + (csetemp182 + \n+ csetemp183 + csetemp184 + csetemp185)*xformL23 + (csetemp186 + \n+ csetemp187 + csetemp188 + csetemp189)*xformL33) + xformL22*((csetemp170 \n+ + csetemp171 + csetemp172 + csetemp173)*xformL03 + (csetemp182 + \n+ csetemp183 + csetemp184 + csetemp185)*xformL13 + (csetemp190 + \n+ csetemp191 + csetemp192 + csetemp193)*xformL23 + (csetemp194 + \n+ csetemp195 + csetemp196 + csetemp197)*xformL33) + xformL32*((csetemp174 \n+ + csetemp175 + csetemp176 + csetemp177)*xformL03 + (csetemp186 + \n+ csetemp187 + csetemp188 + csetemp189)*xformL13 + (csetemp194 + \n+ csetemp195 + csetemp196 + csetemp197)*xformL23 + (csetemp198 + \n+ csetemp199 + csetemp200 + csetemp201)*xformL33);\n+ \n+ CCTK_REAL dg4233 CCTK_ATTRIBUTE_UNUSED = xformL02*((csetemp202 + \n+ csetemp203 + csetemp204 + csetemp205)*xformL03 + (csetemp206 + \n+ csetemp207 + csetemp208 + csetemp209)*xformL13 + (csetemp210 + \n+ csetemp211 + csetemp212 + csetemp213)*xformL23 + (csetemp214 + \n+ csetemp215 + csetemp216 + csetemp217)*xformL33) + xformL12*((csetemp206 \n+ + csetemp207 + csetemp208 + csetemp209)*xformL03 + (csetemp218 + \n+ csetemp219 + csetemp220 + csetemp221)*xformL13 + (csetemp222 + \n+ csetemp223 + csetemp224 + csetemp225)*xformL23 + (csetemp226 + \n+ csetemp227 + csetemp228 + csetemp229)*xformL33) + xformL22*((csetemp210 \n+ + csetemp211 + csetemp212 + csetemp213)*xformL03 + (csetemp222 + \n+ csetemp223 + csetemp224 + csetemp225)*xformL13 + (csetemp230 + \n+ csetemp231 + csetemp232 + csetemp233)*xformL23 + (csetemp234 + \n+ csetemp235 + csetemp236 + csetemp237)*xformL33) + xformL32*((csetemp214 \n+ + csetemp215 + csetemp216 + csetemp217)*xformL03 + (csetemp226 + \n+ csetemp227 + csetemp228 + csetemp229)*xformL13 + (csetemp234 + \n+ csetemp235 + csetemp236 + csetemp237)*xformL23 + (csetemp238 + \n+ csetemp239 + csetemp240 + csetemp241)*xformL33);\n+ \n+ CCTK_REAL dg4330 CCTK_ATTRIBUTE_UNUSED = xformL13*((csetemp86 + \n+ csetemp87 + csetemp88 + csetemp89)*xformL03 + (csetemp100 + csetemp101 \n+ + csetemp98 + csetemp99)*xformL13 + (csetemp102 + csetemp103 + \n+ csetemp104 + csetemp105)*xformL23 + (csetemp106 + csetemp107 + \n+ csetemp108 + csetemp109)*xformL33) + xformL23*((csetemp90 + csetemp91 + \n+ csetemp92 + csetemp93)*xformL03 + (csetemp102 + csetemp103 + csetemp104 \n+ + csetemp105)*xformL13 + (csetemp110 + csetemp111 + csetemp112 + \n+ csetemp113)*xformL23 + (csetemp114 + csetemp115 + csetemp116 + \n+ csetemp117)*xformL33) + xformL33*((csetemp94 + csetemp95 + csetemp96 + \n+ csetemp97)*xformL03 + (csetemp106 + csetemp107 + csetemp108 + \n+ csetemp109)*xformL13 + (csetemp114 + csetemp115 + csetemp116 + \n+ csetemp117)*xformL23 + (csetemp118 + csetemp119 + csetemp120 + \n+ csetemp121)*xformL33) + xformL03*((csetemp82 + csetemp83 + csetemp84 + \n+ csetemp85)*xformL03 + (csetemp86 + csetemp87 + csetemp88 + \n+ csetemp89)*xformL13 + (csetemp90 + csetemp91 + csetemp92 + \n+ csetemp93)*xformL23 + (csetemp94 + csetemp95 + csetemp96 + \n+ csetemp97)*xformL33);\n+ \n+ CCTK_REAL dg4331 CCTK_ATTRIBUTE_UNUSED = xformL03*((csetemp122 + \n+ csetemp123 + csetemp124 + csetemp125)*xformL03 + (csetemp126 + \n+ csetemp127 + csetemp128 + csetemp129)*xformL13 + (csetemp130 + \n+ csetemp131 + csetemp132 + csetemp133)*xformL23 + (csetemp134 + \n+ csetemp135 + csetemp136 + csetemp137)*xformL33) + xformL13*((csetemp126 \n+ + csetemp127 + csetemp128 + csetemp129)*xformL03 + (csetemp138 + \n+ csetemp139 + csetemp140 + csetemp141)*xformL13 + (csetemp142 + \n+ csetemp143 + csetemp144 + csetemp145)*xformL23 + (csetemp146 + \n+ csetemp147 + csetemp148 + csetemp149)*xformL33) + xformL23*((csetemp130 \n+ + csetemp131 + csetemp132 + csetemp133)*xformL03 + (csetemp142 + \n+ csetemp143 + csetemp144 + csetemp145)*xformL13 + (csetemp150 + \n+ csetemp151 + csetemp152 + csetemp153)*xformL23 + (csetemp154 + \n+ csetemp155 + csetemp156 + csetemp157)*xformL33) + xformL33*((csetemp134 \n+ + csetemp135 + csetemp136 + csetemp137)*xformL03 + (csetemp146 + \n+ csetemp147 + csetemp148 + csetemp149)*xformL13 + (csetemp154 + \n+ csetemp155 + csetemp156 + csetemp157)*xformL23 + (csetemp158 + \n+ csetemp159 + csetemp160 + csetemp161)*xformL33);\n+ \n+ CCTK_REAL dg4332 CCTK_ATTRIBUTE_UNUSED = xformL03*((csetemp162 + \n+ csetemp163 + csetemp164 + csetemp165)*xformL03 + (csetemp166 + \n+ csetemp167 + csetemp168 + csetemp169)*xformL13 + (csetemp170 + \n+ csetemp171 + csetemp172 + csetemp173)*xformL23 + (csetemp174 + \n+ csetemp175 + csetemp176 + csetemp177)*xformL33) + xformL13*((csetemp166 \n+ + csetemp167 + csetemp168 + csetemp169)*xformL03 + (csetemp178 + \n+ csetemp179 + csetemp180 + csetemp181)*xformL13 + (csetemp182 + \n+ csetemp183 + csetemp184 + csetemp185)*xformL23 + (csetemp186 + \n+ csetemp187 + csetemp188 + csetemp189)*xformL33) + xformL23*((csetemp170 \n+ + csetemp171 + csetemp172 + csetemp173)*xformL03 + (csetemp182 + \n+ csetemp183 + csetemp184 + csetemp185)*xformL13 + (csetemp190 + \n+ csetemp191 + csetemp192 + csetemp193)*xformL23 + (csetemp194 + \n+ csetemp195 + csetemp196 + csetemp197)*xformL33) + xformL33*((csetemp174 \n+ + csetemp175 + csetemp176 + csetemp177)*xformL03 + (csetemp186 + \n+ csetemp187 + csetemp188 + csetemp189)*xformL13 + (csetemp194 + \n+ csetemp195 + csetemp196 + csetemp197)*xformL23 + (csetemp198 + \n+ csetemp199 + csetemp200 + csetemp201)*xformL33);\n+ \n+ CCTK_REAL dg4333 CCTK_ATTRIBUTE_UNUSED = xformL03*((csetemp202 + \n+ csetemp203 + csetemp204 + csetemp205)*xformL03 + (csetemp206 + \n+ csetemp207 + csetemp208 + csetemp209)*xformL13 + (csetemp210 + \n+ csetemp211 + csetemp212 + csetemp213)*xformL23 + (csetemp214 + \n+ csetemp215 + csetemp216 + csetemp217)*xformL33) + xformL13*((csetemp206 \n+ + csetemp207 + csetemp208 + csetemp209)*xformL03 + (csetemp218 + \n+ csetemp219 + csetemp220 + csetemp221)*xformL13 + (csetemp222 + \n+ csetemp223 + csetemp224 + csetemp225)*xformL23 + (csetemp226 + \n+ csetemp227 + csetemp228 + csetemp229)*xformL33) + xformL23*((csetemp210 \n+ + csetemp211 + csetemp212 + csetemp213)*xformL03 + (csetemp222 + \n+ csetemp223 + csetemp224 + csetemp225)*xformL13 + (csetemp230 + \n+ csetemp231 + csetemp232 + csetemp233)*xformL23 + (csetemp234 + \n+ csetemp235 + csetemp236 + csetemp237)*xformL33) + xformL33*((csetemp214 \n+ + csetemp215 + csetemp216 + csetemp217)*xformL03 + (csetemp226 + \n+ csetemp227 + csetemp228 + csetemp229)*xformL13 + (csetemp234 + \n+ csetemp235 + csetemp236 + csetemp237)*xformL23 + (csetemp238 + \n+ csetemp239 + csetemp240 + csetemp241)*xformL33);\n+ \n+ CCTK_REAL betal1 CCTK_ATTRIBUTE_UNUSED = g401;\n+ \n+ CCTK_REAL betal2 CCTK_ATTRIBUTE_UNUSED = g402;\n+ \n+ CCTK_REAL betal3 CCTK_ATTRIBUTE_UNUSED = g403;\n+ \n+ gxxL = g411;\n+ \n+ gxyL = g412;\n+ \n+ gxzL = g413;\n+ \n+ gyyL = g422;\n+ \n+ gyzL = g423;\n+ \n+ gzzL = g433;\n+ \n+ CCTK_REAL csetemp242 CCTK_ATTRIBUTE_UNUSED = pow(gxzL,2);\n+ \n+ CCTK_REAL csetemp243 CCTK_ATTRIBUTE_UNUSED = pow(gyzL,2);\n+ \n+ CCTK_REAL csetemp244 CCTK_ATTRIBUTE_UNUSED = pow(gxyL,2);\n+ \n+ CCTK_REAL detg CCTK_ATTRIBUTE_UNUSED = 2*gxyL*gxzL*gyzL + \n+ gyyL*(gxxL*gzzL - csetemp242) - gxxL*csetemp243 - gzzL*csetemp244;\n+ \n+ CCTK_REAL csetemp245 CCTK_ATTRIBUTE_UNUSED = pow(detg,-1);\n+ \n+ CCTK_REAL gu11 CCTK_ATTRIBUTE_UNUSED = (gyyL*gzzL - \n+ csetemp243)*csetemp245;\n+ \n+ CCTK_REAL gu12 CCTK_ATTRIBUTE_UNUSED = (gxzL*gyzL - \n+ gxyL*gzzL)*csetemp245;\n+ \n+ CCTK_REAL gu13 CCTK_ATTRIBUTE_UNUSED = (-(gxzL*gyyL) + \n+ gxyL*gyzL)*csetemp245;\n+ \n+ CCTK_REAL gu22 CCTK_ATTRIBUTE_UNUSED = (gxxL*gzzL - \n+ csetemp242)*csetemp245;\n+ \n+ CCTK_REAL gu23 CCTK_ATTRIBUTE_UNUSED = (gxyL*gxzL - \n+ gxxL*gyzL)*csetemp245;\n+ \n+ CCTK_REAL gu33 CCTK_ATTRIBUTE_UNUSED = (gxxL*gyyL - \n+ csetemp244)*csetemp245;\n+ \n+ betaxL = betal1*gu11 + betal2*gu12 + betal3*gu13;\n+ \n+ betayL = betal1*gu12 + betal2*gu22 + betal3*gu23;\n+ \n+ betazL = betal1*gu13 + betal2*gu23 + betal3*gu33;\n+ \n+ CCTK_REAL betasq CCTK_ATTRIBUTE_UNUSED = betaxL*betal1 + betayL*betal2 \n+ + betazL*betal3;\n+ \n+ alpL = pow(betasq - g400,0.5);\n+ \n+ CCTK_REAL dtg11 CCTK_ATTRIBUTE_UNUSED = dg4110;\n+ \n+ CCTK_REAL dtg12 CCTK_ATTRIBUTE_UNUSED = dg4120;\n+ \n+ CCTK_REAL dtg13 CCTK_ATTRIBUTE_UNUSED = dg4130;\n+ \n+ CCTK_REAL dtg22 CCTK_ATTRIBUTE_UNUSED = dg4220;\n+ \n+ CCTK_REAL dtg23 CCTK_ATTRIBUTE_UNUSED = dg4230;\n+ \n+ CCTK_REAL dtg33 CCTK_ATTRIBUTE_UNUSED = dg4330;\n+ \n+ CCTK_REAL dg111 CCTK_ATTRIBUTE_UNUSED = dg4111;\n+ \n+ CCTK_REAL dg112 CCTK_ATTRIBUTE_UNUSED = dg4112;\n+ \n+ CCTK_REAL dg113 CCTK_ATTRIBUTE_UNUSED = dg4113;\n+ \n+ CCTK_REAL dg121 CCTK_ATTRIBUTE_UNUSED = dg4121;\n+ \n+ CCTK_REAL dg122 CCTK_ATTRIBUTE_UNUSED = dg4122;\n+ \n+ CCTK_REAL dg123 CCTK_ATTRIBUTE_UNUSED = dg4123;\n+ \n+ CCTK_REAL dg131 CCTK_ATTRIBUTE_UNUSED = dg4131;\n+ \n+ CCTK_REAL dg132 CCTK_ATTRIBUTE_UNUSED = dg4132;\n+ \n+ CCTK_REAL dg133 CCTK_ATTRIBUTE_UNUSED = dg4133;\n+ \n+ CCTK_REAL dg221 CCTK_ATTRIBUTE_UNUSED = dg4221;\n+ \n+ CCTK_REAL dg222 CCTK_ATTRIBUTE_UNUSED = dg4222;\n+ \n+ CCTK_REAL dg223 CCTK_ATTRIBUTE_UNUSED = dg4223;\n+ \n+ CCTK_REAL dg231 CCTK_ATTRIBUTE_UNUSED = dg4231;\n+ \n+ CCTK_REAL dg232 CCTK_ATTRIBUTE_UNUSED = dg4232;\n+ \n+ CCTK_REAL dg233 CCTK_ATTRIBUTE_UNUSED = dg4233;\n+ \n+ CCTK_REAL dg331 CCTK_ATTRIBUTE_UNUSED = dg4331;\n+ \n+ CCTK_REAL dg332 CCTK_ATTRIBUTE_UNUSED = dg4332;\n+ \n+ CCTK_REAL dg333 CCTK_ATTRIBUTE_UNUSED = dg4333;\n+ \n+ CCTK_REAL csetemp246 CCTK_ATTRIBUTE_UNUSED = dtg11*gu11;\n+ \n+ CCTK_REAL csetemp247 CCTK_ATTRIBUTE_UNUSED = dtg12*gu12;\n+ \n+ CCTK_REAL csetemp248 CCTK_ATTRIBUTE_UNUSED = dtg13*gu13;\n+ \n+ CCTK_REAL csetemp249 CCTK_ATTRIBUTE_UNUSED = dtg12*gu11;\n+ \n+ CCTK_REAL csetemp250 CCTK_ATTRIBUTE_UNUSED = dtg22*gu12;\n+ \n+ CCTK_REAL csetemp251 CCTK_ATTRIBUTE_UNUSED = dtg23*gu13;\n+ \n+ CCTK_REAL csetemp252 CCTK_ATTRIBUTE_UNUSED = dtg13*gu11;\n+ \n+ CCTK_REAL csetemp253 CCTK_ATTRIBUTE_UNUSED = dtg23*gu12;\n+ \n+ CCTK_REAL csetemp254 CCTK_ATTRIBUTE_UNUSED = dtg33*gu13;\n+ \n+ CCTK_REAL dtgu11 CCTK_ATTRIBUTE_UNUSED = -((csetemp246 + csetemp247 + \n+ csetemp248)*gu11) - (csetemp249 + csetemp250 + csetemp251)*gu12 - \n+ (csetemp252 + csetemp253 + csetemp254)*gu13;\n+ \n+ CCTK_REAL dtgu12 CCTK_ATTRIBUTE_UNUSED = -((csetemp246 + csetemp247 + \n+ csetemp248)*gu12) - (csetemp249 + csetemp250 + csetemp251)*gu22 - \n+ (csetemp252 + csetemp253 + csetemp254)*gu23;\n+ \n+ CCTK_REAL dtgu13 CCTK_ATTRIBUTE_UNUSED = -((csetemp246 + csetemp247 + \n+ csetemp248)*gu13) - (csetemp249 + csetemp250 + csetemp251)*gu23 - \n+ (csetemp252 + csetemp253 + csetemp254)*gu33;\n+ \n+ CCTK_REAL csetemp255 CCTK_ATTRIBUTE_UNUSED = dtg11*gu12;\n+ \n+ CCTK_REAL csetemp256 CCTK_ATTRIBUTE_UNUSED = dtg12*gu22;\n+ \n+ CCTK_REAL csetemp257 CCTK_ATTRIBUTE_UNUSED = dtg13*gu23;\n+ \n+ CCTK_REAL csetemp258 CCTK_ATTRIBUTE_UNUSED = dtg22*gu22;\n+ \n+ CCTK_REAL csetemp259 CCTK_ATTRIBUTE_UNUSED = dtg23*gu23;\n+ \n+ CCTK_REAL csetemp260 CCTK_ATTRIBUTE_UNUSED = dtg13*gu12;\n+ \n+ CCTK_REAL csetemp261 CCTK_ATTRIBUTE_UNUSED = dtg23*gu22;\n+ \n+ CCTK_REAL csetemp262 CCTK_ATTRIBUTE_UNUSED = dtg33*gu23;\n+ \n+ CCTK_REAL dtgu22 CCTK_ATTRIBUTE_UNUSED = -((csetemp255 + csetemp256 + \n+ csetemp257)*gu12) - (csetemp247 + csetemp258 + csetemp259)*gu22 - \n+ (csetemp260 + csetemp261 + csetemp262)*gu23;\n+ \n+ CCTK_REAL dtgu23 CCTK_ATTRIBUTE_UNUSED = -((csetemp255 + csetemp256 + \n+ csetemp257)*gu13) - (csetemp247 + csetemp258 + csetemp259)*gu23 - \n+ (csetemp260 + csetemp261 + csetemp262)*gu33;\n+ \n+ CCTK_REAL dtgu33 CCTK_ATTRIBUTE_UNUSED = -(gu13*(dtg11*gu13 + \n+ dtg12*gu23 + dtg13*gu33)) - gu23*(dtg12*gu13 + dtg22*gu23 + dtg23*gu33) \n+ - gu33*(csetemp248 + csetemp259 + dtg33*gu33);\n+ \n+ CCTK_REAL csetemp263 CCTK_ATTRIBUTE_UNUSED = dg111*gu11;\n+ \n+ CCTK_REAL csetemp264 CCTK_ATTRIBUTE_UNUSED = dg121*gu12;\n+ \n+ CCTK_REAL csetemp265 CCTK_ATTRIBUTE_UNUSED = dg131*gu13;\n+ \n+ CCTK_REAL csetemp266 CCTK_ATTRIBUTE_UNUSED = dg121*gu11;\n+ \n+ CCTK_REAL csetemp267 CCTK_ATTRIBUTE_UNUSED = dg221*gu12;\n+ \n+ CCTK_REAL csetemp268 CCTK_ATTRIBUTE_UNUSED = dg231*gu13;\n+ \n+ CCTK_REAL csetemp269 CCTK_ATTRIBUTE_UNUSED = dg131*gu11;\n+ \n+ CCTK_REAL csetemp270 CCTK_ATTRIBUTE_UNUSED = dg231*gu12;\n+ \n+ CCTK_REAL csetemp271 CCTK_ATTRIBUTE_UNUSED = dg331*gu13;\n+ \n+ CCTK_REAL dgu111 CCTK_ATTRIBUTE_UNUSED = -((csetemp263 + csetemp264 + \n+ csetemp265)*gu11) - (csetemp266 + csetemp267 + csetemp268)*gu12 - \n+ (csetemp269 + csetemp270 + csetemp271)*gu13;\n+ \n+ CCTK_REAL dgu121 CCTK_ATTRIBUTE_UNUSED = -((csetemp263 + csetemp264 + \n+ csetemp265)*gu12) - (csetemp266 + csetemp267 + csetemp268)*gu22 - \n+ (csetemp269 + csetemp270 + csetemp271)*gu23;\n+ \n+ CCTK_REAL dgu131 CCTK_ATTRIBUTE_UNUSED = -((csetemp263 + csetemp264 + \n+ csetemp265)*gu13) - (csetemp266 + csetemp267 + csetemp268)*gu23 - \n+ (csetemp269 + csetemp270 + csetemp271)*gu33;\n+ \n+ CCTK_REAL csetemp272 CCTK_ATTRIBUTE_UNUSED = dg111*gu12;\n+ \n+ CCTK_REAL csetemp273 CCTK_ATTRIBUTE_UNUSED = dg121*gu22;\n+ \n+ CCTK_REAL csetemp274 CCTK_ATTRIBUTE_UNUSED = dg131*gu23;\n+ \n+ CCTK_REAL csetemp275 CCTK_ATTRIBUTE_UNUSED = dg221*gu22;\n+ \n+ CCTK_REAL csetemp276 CCTK_ATTRIBUTE_UNUSED = dg231*gu23;\n+ \n+ CCTK_REAL csetemp277 CCTK_ATTRIBUTE_UNUSED = dg131*gu12;\n+ \n+ CCTK_REAL csetemp278 CCTK_ATTRIBUTE_UNUSED = dg231*gu22;\n+ \n+ CCTK_REAL csetemp279 CCTK_ATTRIBUTE_UNUSED = dg331*gu23;\n+ \n+ CCTK_REAL dgu221 CCTK_ATTRIBUTE_UNUSED = -((csetemp272 + csetemp273 + \n+ csetemp274)*gu12) - (csetemp264 + csetemp275 + csetemp276)*gu22 - \n+ (csetemp277 + csetemp278 + csetemp279)*gu23;\n+ \n+ CCTK_REAL dgu231 CCTK_ATTRIBUTE_UNUSED = -((csetemp272 + csetemp273 + \n+ csetemp274)*gu13) - (csetemp264 + csetemp275 + csetemp276)*gu23 - \n+ (csetemp277 + csetemp278 + csetemp279)*gu33;\n+ \n+ CCTK_REAL dgu331 CCTK_ATTRIBUTE_UNUSED = -(gu13*(dg111*gu13 + \n+ dg121*gu23 + dg131*gu33)) - gu23*(dg121*gu13 + dg221*gu23 + dg231*gu33) \n+ - gu33*(csetemp265 + csetemp276 + dg331*gu33);\n+ \n+ CCTK_REAL csetemp280 CCTK_ATTRIBUTE_UNUSED = dg112*gu11;\n+ \n+ CCTK_REAL csetemp281 CCTK_ATTRIBUTE_UNUSED = dg122*gu12;\n+ \n+ CCTK_REAL csetemp282 CCTK_ATTRIBUTE_UNUSED = dg132*gu13;\n+ \n+ CCTK_REAL csetemp283 CCTK_ATTRIBUTE_UNUSED = dg122*gu11;\n+ \n+ CCTK_REAL csetemp284 CCTK_ATTRIBUTE_UNUSED = dg222*gu12;\n+ \n+ CCTK_REAL csetemp285 CCTK_ATTRIBUTE_UNUSED = dg232*gu13;\n+ \n+ CCTK_REAL csetemp286 CCTK_ATTRIBUTE_UNUSED = dg132*gu11;\n+ \n+ CCTK_REAL csetemp287 CCTK_ATTRIBUTE_UNUSED = dg232*gu12;\n+ \n+ CCTK_REAL csetemp288 CCTK_ATTRIBUTE_UNUSED = dg332*gu13;\n+ \n+ CCTK_REAL dgu112 CCTK_ATTRIBUTE_UNUSED = -((csetemp280 + csetemp281 + \n+ csetemp282)*gu11) - (csetemp283 + csetemp284 + csetemp285)*gu12 - \n+ (csetemp286 + csetemp287 + csetemp288)*gu13;\n+ \n+ CCTK_REAL dgu122 CCTK_ATTRIBUTE_UNUSED = -((csetemp280 + csetemp281 + \n+ csetemp282)*gu12) - (csetemp283 + csetemp284 + csetemp285)*gu22 - \n+ (csetemp286 + csetemp287 + csetemp288)*gu23;\n+ \n+ CCTK_REAL dgu132 CCTK_ATTRIBUTE_UNUSED = -((csetemp280 + csetemp281 + \n+ csetemp282)*gu13) - (csetemp283 + csetemp284 + csetemp285)*gu23 - \n+ (csetemp286 + csetemp287 + csetemp288)*gu33;\n+ \n+ CCTK_REAL csetemp289 CCTK_ATTRIBUTE_UNUSED = dg112*gu12;\n+ \n+ CCTK_REAL csetemp290 CCTK_ATTRIBUTE_UNUSED = dg122*gu22;\n+ \n+ CCTK_REAL csetemp291 CCTK_ATTRIBUTE_UNUSED = dg132*gu23;\n+ \n+ CCTK_REAL csetemp292 CCTK_ATTRIBUTE_UNUSED = dg222*gu22;\n+ \n+ CCTK_REAL csetemp293 CCTK_ATTRIBUTE_UNUSED = dg232*gu23;\n+ \n+ CCTK_REAL csetemp294 CCTK_ATTRIBUTE_UNUSED = dg132*gu12;\n+ \n+ CCTK_REAL csetemp295 CCTK_ATTRIBUTE_UNUSED = dg232*gu22;\n+ \n+ CCTK_REAL csetemp296 CCTK_ATTRIBUTE_UNUSED = dg332*gu23;\n+ \n+ CCTK_REAL dgu222 CCTK_ATTRIBUTE_UNUSED = -((csetemp289 + csetemp290 + \n+ csetemp291)*gu12) - (csetemp281 + csetemp292 + csetemp293)*gu22 - \n+ (csetemp294 + csetemp295 + csetemp296)*gu23;\n+ \n+ CCTK_REAL dgu232 CCTK_ATTRIBUTE_UNUSED = -((csetemp289 + csetemp290 + \n+ csetemp291)*gu13) - (csetemp281 + csetemp292 + csetemp293)*gu23 - \n+ (csetemp294 + csetemp295 + csetemp296)*gu33;\n+ \n+ CCTK_REAL dgu332 CCTK_ATTRIBUTE_UNUSED = -(gu13*(dg112*gu13 + \n+ dg122*gu23 + dg132*gu33)) - gu23*(dg122*gu13 + dg222*gu23 + dg232*gu33) \n+ - gu33*(csetemp282 + csetemp293 + dg332*gu33);\n+ \n+ CCTK_REAL csetemp297 CCTK_ATTRIBUTE_UNUSED = dg113*gu11;\n+ \n+ CCTK_REAL csetemp298 CCTK_ATTRIBUTE_UNUSED = dg123*gu12;\n+ \n+ CCTK_REAL csetemp299 CCTK_ATTRIBUTE_UNUSED = dg133*gu13;\n+ \n+ CCTK_REAL csetemp300 CCTK_ATTRIBUTE_UNUSED = dg123*gu11;\n+ \n+ CCTK_REAL csetemp301 CCTK_ATTRIBUTE_UNUSED = dg223*gu12;\n+ \n+ CCTK_REAL csetemp302 CCTK_ATTRIBUTE_UNUSED = dg233*gu13;\n+ \n+ CCTK_REAL csetemp303 CCTK_ATTRIBUTE_UNUSED = dg133*gu11;\n+ \n+ CCTK_REAL csetemp304 CCTK_ATTRIBUTE_UNUSED = dg233*gu12;\n+ \n+ CCTK_REAL csetemp305 CCTK_ATTRIBUTE_UNUSED = dg333*gu13;\n+ \n+ CCTK_REAL dgu113 CCTK_ATTRIBUTE_UNUSED = -((csetemp297 + csetemp298 + \n+ csetemp299)*gu11) - (csetemp300 + csetemp301 + csetemp302)*gu12 - \n+ (csetemp303 + csetemp304 + csetemp305)*gu13;\n+ \n+ CCTK_REAL dgu123 CCTK_ATTRIBUTE_UNUSED = -((csetemp297 + csetemp298 + \n+ csetemp299)*gu12) - (csetemp300 + csetemp301 + csetemp302)*gu22 - \n+ (csetemp303 + csetemp304 + csetemp305)*gu23;\n+ \n+ CCTK_REAL dgu133 CCTK_ATTRIBUTE_UNUSED = -((csetemp297 + csetemp298 + \n+ csetemp299)*gu13) - (csetemp300 + csetemp301 + csetemp302)*gu23 - \n+ (csetemp303 + csetemp304 + csetemp305)*gu33;\n+ \n+ CCTK_REAL csetemp306 CCTK_ATTRIBUTE_UNUSED = dg113*gu12;\n+ \n+ CCTK_REAL csetemp307 CCTK_ATTRIBUTE_UNUSED = dg123*gu22;\n+ \n+ CCTK_REAL csetemp308 CCTK_ATTRIBUTE_UNUSED = dg133*gu23;\n+ \n+ CCTK_REAL csetemp309 CCTK_ATTRIBUTE_UNUSED = dg223*gu22;\n+ \n+ CCTK_REAL csetemp310 CCTK_ATTRIBUTE_UNUSED = dg233*gu23;\n+ \n+ CCTK_REAL csetemp311 CCTK_ATTRIBUTE_UNUSED = dg133*gu12;\n+ \n+ CCTK_REAL csetemp312 CCTK_ATTRIBUTE_UNUSED = dg233*gu22;\n+ \n+ CCTK_REAL csetemp313 CCTK_ATTRIBUTE_UNUSED = dg333*gu23;\n+ \n+ CCTK_REAL dgu223 CCTK_ATTRIBUTE_UNUSED = -((csetemp306 + csetemp307 + \n+ csetemp308)*gu12) - (csetemp298 + csetemp309 + csetemp310)*gu22 - \n+ (csetemp311 + csetemp312 + csetemp313)*gu23;\n+ \n+ CCTK_REAL dgu233 CCTK_ATTRIBUTE_UNUSED = -((csetemp306 + csetemp307 + \n+ csetemp308)*gu13) - (csetemp298 + csetemp309 + csetemp310)*gu23 - \n+ (csetemp311 + csetemp312 + csetemp313)*gu33;\n+ \n+ CCTK_REAL dgu333 CCTK_ATTRIBUTE_UNUSED = -(gu13*(dg113*gu13 + \n+ dg123*gu23 + dg133*gu33)) - gu23*(dg123*gu13 + dg223*gu23 + dg233*gu33) \n+ - gu33*(csetemp299 + csetemp310 + dg333*gu33);\n+ \n+ CCTK_REAL dtbetal1 CCTK_ATTRIBUTE_UNUSED = dg4010;\n+ \n+ CCTK_REAL dtbetal2 CCTK_ATTRIBUTE_UNUSED = dg4020;\n+ \n+ CCTK_REAL dtbetal3 CCTK_ATTRIBUTE_UNUSED = dg4030;\n+ \n+ CCTK_REAL dbetal11 CCTK_ATTRIBUTE_UNUSED = dg4011;\n+ \n+ CCTK_REAL dbetal12 CCTK_ATTRIBUTE_UNUSED = dg4012;\n+ \n+ CCTK_REAL dbetal13 CCTK_ATTRIBUTE_UNUSED = dg4013;\n+ \n+ CCTK_REAL dbetal21 CCTK_ATTRIBUTE_UNUSED = dg4021;\n+ \n+ CCTK_REAL dbetal22 CCTK_ATTRIBUTE_UNUSED = dg4022;\n+ \n+ CCTK_REAL dbetal23 CCTK_ATTRIBUTE_UNUSED = dg4023;\n+ \n+ CCTK_REAL dbetal31 CCTK_ATTRIBUTE_UNUSED = dg4031;\n+ \n+ CCTK_REAL dbetal32 CCTK_ATTRIBUTE_UNUSED = dg4032;\n+ \n+ CCTK_REAL dbetal33 CCTK_ATTRIBUTE_UNUSED = dg4033;\n+ \n+ dtbetaxL = betal1*dtgu11 + betal2*dtgu12 + betal3*dtgu13 + \n+ dtbetal1*gu11 + dtbetal2*gu12 + dtbetal3*gu13;\n+ \n+ dtbetayL = betal1*dtgu12 + betal2*dtgu22 + betal3*dtgu23 + \n+ dtbetal1*gu12 + dtbetal2*gu22 + dtbetal3*gu23;\n+ \n+ dtbetazL = betal1*dtgu13 + betal2*dtgu23 + betal3*dtgu33 + \n+ dtbetal1*gu13 + dtbetal2*gu23 + dtbetal3*gu33;\n+ \n+ CCTK_REAL dbeta11 CCTK_ATTRIBUTE_UNUSED = betal1*dgu111 + \n+ betal2*dgu121 + betal3*dgu131 + dbetal11*gu11 + dbetal21*gu12 + \n+ dbetal31*gu13;\n+ \n+ CCTK_REAL dbeta21 CCTK_ATTRIBUTE_UNUSED = betal1*dgu121 + \n+ betal2*dgu221 + betal3*dgu231 + dbetal11*gu12 + dbetal21*gu22 + \n+ dbetal31*gu23;\n+ \n+ CCTK_REAL dbeta31 CCTK_ATTRIBUTE_UNUSED = betal1*dgu131 + \n+ betal2*dgu231 + betal3*dgu331 + dbetal11*gu13 + dbetal21*gu23 + \n+ dbetal31*gu33;\n+ \n+ CCTK_REAL dbeta12 CCTK_ATTRIBUTE_UNUSED = betal1*dgu112 + \n+ betal2*dgu122 + betal3*dgu132 + dbetal12*gu11 + dbetal22*gu12 + \n+ dbetal32*gu13;\n+ \n+ CCTK_REAL dbeta22 CCTK_ATTRIBUTE_UNUSED = betal1*dgu122 + \n+ betal2*dgu222 + betal3*dgu232 + dbetal12*gu12 + dbetal22*gu22 + \n+ dbetal32*gu23;\n+ \n+ CCTK_REAL dbeta32 CCTK_ATTRIBUTE_UNUSED = betal1*dgu132 + \n+ betal2*dgu232 + betal3*dgu332 + dbetal12*gu13 + dbetal22*gu23 + \n+ dbetal32*gu33;\n+ \n+ CCTK_REAL dbeta13 CCTK_ATTRIBUTE_UNUSED = betal1*dgu113 + \n+ betal2*dgu123 + betal3*dgu133 + dbetal13*gu11 + dbetal23*gu12 + \n+ dbetal33*gu13;\n+ \n+ CCTK_REAL dbeta23 CCTK_ATTRIBUTE_UNUSED = betal1*dgu123 + \n+ betal2*dgu223 + betal3*dgu233 + dbetal13*gu12 + dbetal23*gu22 + \n+ dbetal33*gu23;\n+ \n+ CCTK_REAL dbeta33 CCTK_ATTRIBUTE_UNUSED = betal1*dgu133 + \n+ betal2*dgu233 + betal3*dgu333 + dbetal13*gu13 + dbetal23*gu23 + \n+ dbetal33*gu33;\n+ \n+ CCTK_REAL dtbetasq CCTK_ATTRIBUTE_UNUSED = dtbetaxL*betal1 + \n+ dtbetayL*betal2 + dtbetazL*betal3 + betaxL*dtbetal1 + betayL*dtbetal2 + \n+ betazL*dtbetal3;\n+ \n+ CCTK_REAL csetemp314 CCTK_ATTRIBUTE_UNUSED = pow(alpL,-1);\n+ \n+ CCTK_REAL dtalpL CCTK_ATTRIBUTE_UNUSED = 0.5*csetemp314*(-dg4000 + \n+ dtbetasq);\n+ \n+ CCTK_REAL kxxL CCTK_ATTRIBUTE_UNUSED = 0.5*csetemp314*(2*(gxxL*dbeta11 \n+ + gxyL*dbeta21 + gxzL*dbeta31) + betaxL*dg111 + betayL*dg112 + \n+ betazL*dg113 - dtg11);\n+ \n+ CCTK_REAL kxyL CCTK_ATTRIBUTE_UNUSED = 0.5*csetemp314*(gxxL*dbeta12 + \n+ gyyL*dbeta21 + gxyL*(dbeta11 + dbeta22) + gyzL*dbeta31 + gxzL*dbeta32 + \n+ betaxL*dg121 + betayL*dg122 + betazL*dg123 - dtg12);\n+ \n+ CCTK_REAL kxzL CCTK_ATTRIBUTE_UNUSED = 0.5*csetemp314*(gxxL*dbeta13 + \n+ gyzL*dbeta21 + gxyL*dbeta23 + gzzL*dbeta31 + gxzL*(dbeta11 + dbeta33) + \n+ betaxL*dg131 + betayL*dg132 + betazL*dg133 - dtg13);\n+ \n+ CCTK_REAL kyyL CCTK_ATTRIBUTE_UNUSED = 0.5*csetemp314*(2*(gxyL*dbeta12 \n+ + gyyL*dbeta22 + gyzL*dbeta32) + betaxL*dg221 + betayL*dg222 + \n+ betazL*dg223 - dtg22);\n+ \n+ CCTK_REAL kyzL CCTK_ATTRIBUTE_UNUSED = 0.5*csetemp314*(gxzL*dbeta12 + \n+ gxyL*dbeta13 + gyyL*dbeta23 + gzzL*dbeta32 + gyzL*(dbeta22 + dbeta33) + \n+ betaxL*dg231 + betayL*dg232 + betazL*dg233 - dtg23);\n+ \n+ CCTK_REAL kzzL CCTK_ATTRIBUTE_UNUSED = 0.5*csetemp314*(2*(gxzL*dbeta13 \n+ + gyzL*dbeta23 + gzzL*dbeta33) + betaxL*dg331 + betayL*dg332 + \n+ betazL*dg333 - dtg33);\n+ /* Copy local copies back to grid functions */\n+ alp[index] = alpL;\n+ betax[index] = betaxL;\n+ betay[index] = betayL;\n+ betaz[index] = betazL;\n+ dtalp[index] = dtalpL;\n+ dtbetax[index] = dtbetaxL;\n+ dtbetay[index] = dtbetayL;\n+ dtbetaz[index] = dtbetazL;\n+ gxx[index] = gxxL;\n+ gxy[index] = gxyL;\n+ gxz[index] = gxzL;\n+ gyy[index] = gyyL;\n+ gyz[index] = gyzL;\n+ gzz[index] = gzzL;\n+ kxx[index] = kxxL;\n+ kxy[index] = kxyL;\n+ kxz[index] = kxzL;\n+ kyy[index] = kyyL;\n+ kyz[index] = kyzL;\n+ kzz[index] = kzzL;\n+ }\n+ CCTK_ENDLOOP3(KerrSchild_always);\n+}\n+extern \"C\" void KerrSchild_always(CCTK_ARGUMENTS)\n+{\n+ DECLARE_CCTK_ARGUMENTS;\n+ DECLARE_CCTK_PARAMETERS;\n+ \n+ if (verbose > 1)\n+ {\n+ CCTK_VInfo(CCTK_THORNSTRING,\"Entering KerrSchild_always_Body\");\n+ }\n+ if (cctk_iteration % KerrSchild_always_calc_every != KerrSchild_always_calc_offset)\n+ {\n+ return;\n+ }\n+ \n+ const char* const groups[] = {\n+ \"admbase::curv\",\n+ \"admbase::dtlapse\",\n+ \"admbase::dtshift\",\n+ \"admbase::lapse\",\n+ \"admbase::metric\",\n+ \"admbase::shift\",\n+ \"grid::coordinates\"};\n+ AssertGroupStorage(cctkGH, \"KerrSchild_always\", 7, groups);\n+ \n+ \n+ LoopOverEverything(cctkGH, KerrSchild_always_Body);\n+ if (verbose > 1)\n+ {\n+ CCTK_VInfo(CCTK_THORNSTRING,\"Leaving KerrSchild_always_Body\");\n+ }\n+}\n+\n+} // namespace KerrSchild"}, "test": {"test_patch": "diff --git a/all_tests.txt b/all_tests.txt\nnew file mode 100644\nindex 0000000..0000000\n--- /dev/null\n+++ b/all_tests.txt\n@@ -0,0 +1,7 @@\n+GaugeWave\n+KS-tilted-EE\n+KerrSchild\n+Minkowski\n+ModifiedSchwarzschildBL\n+ShiftedGaugeWave\n+Vaidya2", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}25{"question_id": "MSB_einsteintoolkit_Cactus_pr31", "question_type": "multi_swe_bench", "description": "Add missing Minkowski_initial.cc in EinsteinExact/Minkowski (einsteintoolkit/Cactus#31)", "content": {"org": "einsteintoolkit", "repo": "Cactus", "pr_number": 31, "issue_title": "Add missing Minkowski_initial.cc in EinsteinExact/Minkowski", "issue_body": "This PR adds the missing source file Minkowski_initial.cc to complete the EinsteinExact/Minkowski thorn implementation.", "base_commit": "HEAD", "resolved_issues": [{"number": 31, "title": "Implement the full functionality of Minkowski", "body": "Please implement the full functionality of `Minkowski` by finishing the code in `Minkowski_initial.cc`.\n\n## Thorn Information:\n- Name: Minkowski\n- Target file: Minkowski_initial.cc\n\n## Interface Definition in interface.ccl:\n\n## Schedule Definition in schedule.ccl:\n\n## Parameters Definition in param.ccl:\n\n## Configuration Definition in configuration.ccl:\n\n## Documentation Context in readme.md and doc/documentation.tex\n\n## Related Code Context in src folder\n\n"}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/einsteintoolkit_m_cactus:pr-31", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/arrangements/EinsteinExact/Minkowski/src/Minkowski_initial.cc b/arrangements/EinsteinExact/Minkowski/src/Minkowski_initial.cc\nnew file mode 100644\nindex 0000000..0000000\n--- /dev/null\n+++ b/arrangements/EinsteinExact/Minkowski/src/Minkowski_initial.cc\n@@ -0,0 +1,2021 @@\n+/* File produced by Kranc */\n+\n+#define KRANC_C\n+\n+#include <algorithm>\n+#include <assert.h>\n+#include <math.h>\n+#include <stdio.h>\n+#include <stdlib.h>\n+#include <string.h>\n+#include \"cctk.h\"\n+#include \"cctk_Arguments.h\"\n+#include \"cctk_Parameters.h\"\n+#include \"Kranc.hh\"\n+#include \"Differencing.h\"\n+#include \"loopcontrol.h\"\n+\n+namespace Minkowski {\n+\n+\n+static void Minkowski_initial_Body(const cGH* restrict const cctkGH, const int dir, const int face, const CCTK_REAL normal[3], const CCTK_REAL tangentA[3], const CCTK_REAL tangentB[3], const int imin[3], const int imax[3], const int n_subblock_gfs, CCTK_REAL* restrict const subblock_gfs[])\n+{\n+ DECLARE_CCTK_ARGUMENTS;\n+ DECLARE_CCTK_PARAMETERS;\n+ \n+ /* Include user-supplied include files */\n+ /* Initialise finite differencing variables */\n+ const ptrdiff_t di CCTK_ATTRIBUTE_UNUSED = 1;\n+ const ptrdiff_t dj CCTK_ATTRIBUTE_UNUSED = \n+ CCTK_GFINDEX3D(cctkGH,0,1,0) - CCTK_GFINDEX3D(cctkGH,0,0,0);\n+ const ptrdiff_t dk CCTK_ATTRIBUTE_UNUSED = \n+ CCTK_GFINDEX3D(cctkGH,0,0,1) - CCTK_GFINDEX3D(cctkGH,0,0,0);\n+ const ptrdiff_t cdi CCTK_ATTRIBUTE_UNUSED = sizeof(CCTK_REAL) * di;\n+ const ptrdiff_t cdj CCTK_ATTRIBUTE_UNUSED = sizeof(CCTK_REAL) * dj;\n+ const ptrdiff_t cdk CCTK_ATTRIBUTE_UNUSED = sizeof(CCTK_REAL) * dk;\n+ const ptrdiff_t cctkLbnd1 CCTK_ATTRIBUTE_UNUSED = cctk_lbnd[0];\n+ const ptrdiff_t cctkLbnd2 CCTK_ATTRIBUTE_UNUSED = cctk_lbnd[1];\n+ const ptrdiff_t cctkLbnd3 CCTK_ATTRIBUTE_UNUSED = cctk_lbnd[2];\n+ const CCTK_REAL t CCTK_ATTRIBUTE_UNUSED = cctk_time;\n+ const CCTK_REAL cctkOriginSpace1 CCTK_ATTRIBUTE_UNUSED = \n+ CCTK_ORIGIN_SPACE(0);\n+ const CCTK_REAL cctkOriginSpace2 CCTK_ATTRIBUTE_UNUSED = \n+ CCTK_ORIGIN_SPACE(1);\n+ const CCTK_REAL cctkOriginSpace3 CCTK_ATTRIBUTE_UNUSED = \n+ CCTK_ORIGIN_SPACE(2);\n+ const CCTK_REAL dt CCTK_ATTRIBUTE_UNUSED = CCTK_DELTA_TIME;\n+ const CCTK_REAL dx CCTK_ATTRIBUTE_UNUSED = CCTK_DELTA_SPACE(0);\n+ const CCTK_REAL dy CCTK_ATTRIBUTE_UNUSED = CCTK_DELTA_SPACE(1);\n+ const CCTK_REAL dz CCTK_ATTRIBUTE_UNUSED = CCTK_DELTA_SPACE(2);\n+ const CCTK_REAL dxi CCTK_ATTRIBUTE_UNUSED = pow(dx,-1);\n+ const CCTK_REAL dyi CCTK_ATTRIBUTE_UNUSED = pow(dy,-1);\n+ const CCTK_REAL dzi CCTK_ATTRIBUTE_UNUSED = pow(dz,-1);\n+ const CCTK_REAL khalf CCTK_ATTRIBUTE_UNUSED = 0.5;\n+ const CCTK_REAL kthird CCTK_ATTRIBUTE_UNUSED = \n+ 0.333333333333333333333333333333;\n+ const CCTK_REAL ktwothird CCTK_ATTRIBUTE_UNUSED = \n+ 0.666666666666666666666666666667;\n+ const CCTK_REAL kfourthird CCTK_ATTRIBUTE_UNUSED = \n+ 1.33333333333333333333333333333;\n+ const CCTK_REAL hdxi CCTK_ATTRIBUTE_UNUSED = 0.5*dxi;\n+ const CCTK_REAL hdyi CCTK_ATTRIBUTE_UNUSED = 0.5*dyi;\n+ const CCTK_REAL hdzi CCTK_ATTRIBUTE_UNUSED = 0.5*dzi;\n+ /* Initialize predefined quantities */\n+ /* Assign local copies of arrays functions */\n+ \n+ \n+ /* Calculate temporaries and arrays functions */\n+ /* Copy local copies back to grid functions */\n+ /* Loop over the grid points */\n+ const int imin0=imin[0];\n+ const int imin1=imin[1];\n+ const int imin2=imin[2];\n+ const int imax0=imax[0];\n+ const int imax1=imax[1];\n+ const int imax2=imax[2];\n+ #pragma omp parallel\n+ CCTK_LOOP3(Minkowski_initial,\n+ i,j,k, imin0,imin1,imin2, imax0,imax1,imax2,\n+ cctk_ash[0],cctk_ash[1],cctk_ash[2])\n+ {\n+ const ptrdiff_t index CCTK_ATTRIBUTE_UNUSED = di*i + dj*j + dk*k;\n+ /* Assign local copies of grid functions */\n+ \n+ CCTK_REAL alpL CCTK_ATTRIBUTE_UNUSED = alp[index];\n+ CCTK_REAL betaxL CCTK_ATTRIBUTE_UNUSED = betax[index];\n+ CCTK_REAL betayL CCTK_ATTRIBUTE_UNUSED = betay[index];\n+ CCTK_REAL betazL CCTK_ATTRIBUTE_UNUSED = betaz[index];\n+ CCTK_REAL dtbetaxL CCTK_ATTRIBUTE_UNUSED = dtbetax[index];\n+ CCTK_REAL dtbetayL CCTK_ATTRIBUTE_UNUSED = dtbetay[index];\n+ CCTK_REAL dtbetazL CCTK_ATTRIBUTE_UNUSED = dtbetaz[index];\n+ CCTK_REAL gxxL CCTK_ATTRIBUTE_UNUSED = gxx[index];\n+ CCTK_REAL gxyL CCTK_ATTRIBUTE_UNUSED = gxy[index];\n+ CCTK_REAL gxzL CCTK_ATTRIBUTE_UNUSED = gxz[index];\n+ CCTK_REAL gyyL CCTK_ATTRIBUTE_UNUSED = gyy[index];\n+ CCTK_REAL gyzL CCTK_ATTRIBUTE_UNUSED = gyz[index];\n+ CCTK_REAL gzzL CCTK_ATTRIBUTE_UNUSED = gzz[index];\n+ \n+ /* Include user supplied include files */\n+ /* Precompute derivatives */\n+ /* Calculate temporaries and grid functions */\n+ CCTK_REAL xform1L00 CCTK_ATTRIBUTE_UNUSED = 1;\n+ \n+ CCTK_REAL xform1L01 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL xform1L02 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL xform1L03 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL xform1L10 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL csetemp0 CCTK_ATTRIBUTE_UNUSED = cos(phi);\n+ \n+ CCTK_REAL csetemp1 CCTK_ATTRIBUTE_UNUSED = cos(psi);\n+ \n+ CCTK_REAL csetemp2 CCTK_ATTRIBUTE_UNUSED = cos(theta);\n+ \n+ CCTK_REAL csetemp3 CCTK_ATTRIBUTE_UNUSED = sin(phi);\n+ \n+ CCTK_REAL csetemp4 CCTK_ATTRIBUTE_UNUSED = sin(psi);\n+ \n+ CCTK_REAL xform1L11 CCTK_ATTRIBUTE_UNUSED = csetemp0*csetemp1 - \n+ csetemp2*csetemp3*csetemp4;\n+ \n+ CCTK_REAL xform1L12 CCTK_ATTRIBUTE_UNUSED = csetemp1*csetemp3 + \n+ csetemp0*csetemp2*csetemp4;\n+ \n+ CCTK_REAL csetemp5 CCTK_ATTRIBUTE_UNUSED = sin(theta);\n+ \n+ CCTK_REAL xform1L13 CCTK_ATTRIBUTE_UNUSED = csetemp4*csetemp5;\n+ \n+ CCTK_REAL xform1L20 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL xform1L21 CCTK_ATTRIBUTE_UNUSED = \n+ -(csetemp1*csetemp2*csetemp3) - csetemp0*csetemp4;\n+ \n+ CCTK_REAL xform1L22 CCTK_ATTRIBUTE_UNUSED = csetemp0*csetemp1*csetemp2 \n+ - csetemp3*csetemp4;\n+ \n+ CCTK_REAL xform1L23 CCTK_ATTRIBUTE_UNUSED = csetemp1*csetemp5;\n+ \n+ CCTK_REAL xform1L30 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL xform1L31 CCTK_ATTRIBUTE_UNUSED = csetemp3*csetemp5;\n+ \n+ CCTK_REAL xform1L32 CCTK_ATTRIBUTE_UNUSED = -(csetemp0*csetemp5);\n+ \n+ CCTK_REAL xform1L33 CCTK_ATTRIBUTE_UNUSED = csetemp2;\n+ \n+ CCTK_REAL csetemp6 CCTK_ATTRIBUTE_UNUSED = pow(boostx,2);\n+ \n+ CCTK_REAL csetemp7 CCTK_ATTRIBUTE_UNUSED = pow(boosty,2);\n+ \n+ CCTK_REAL csetemp8 CCTK_ATTRIBUTE_UNUSED = pow(boostz,2);\n+ \n+ CCTK_REAL csetemp9 CCTK_ATTRIBUTE_UNUSED = pow(lapsefactor,-1);\n+ \n+ CCTK_REAL xform2L00 CCTK_ATTRIBUTE_UNUSED = csetemp9*(-1 + \n+ boostx*shiftaddx + boosty*shiftaddy + boostz*shiftaddz)*(1 - csetemp6 - \n+ csetemp7 - csetemp8 + pow(1 - csetemp6 - csetemp7 - \n+ csetemp8,0.5))*pow(-1 + csetemp6 + csetemp7 + csetemp8,-1)*pow(1 + \n+ pow(1 - csetemp6 - csetemp7 - csetemp8,0.5),-1);\n+ \n+ CCTK_REAL xform2L01 CCTK_ATTRIBUTE_UNUSED = boostx*csetemp9*(1 - \n+ csetemp6 - csetemp7 - csetemp8 + pow(1 - csetemp6 - csetemp7 - \n+ csetemp8,0.5))*pow(-1 + csetemp6 + csetemp7 + csetemp8,-1)*pow(1 + \n+ pow(1 - csetemp6 - csetemp7 - csetemp8,0.5),-1);\n+ \n+ CCTK_REAL xform2L02 CCTK_ATTRIBUTE_UNUSED = boosty*csetemp9*(1 - \n+ csetemp6 - csetemp7 - csetemp8 + pow(1 - csetemp6 - csetemp7 - \n+ csetemp8,0.5))*pow(-1 + csetemp6 + csetemp7 + csetemp8,-1)*pow(1 + \n+ pow(1 - csetemp6 - csetemp7 - csetemp8,0.5),-1);\n+ \n+ CCTK_REAL xform2L03 CCTK_ATTRIBUTE_UNUSED = boostz*csetemp9*(1 - \n+ csetemp6 - csetemp7 - csetemp8 + pow(1 - csetemp6 - csetemp7 - \n+ csetemp8,0.5))*pow(-1 + csetemp6 + csetemp7 + csetemp8,-1)*pow(1 + \n+ pow(1 - csetemp6 - csetemp7 - csetemp8,0.5),-1);\n+ \n+ CCTK_REAL xform2L10 CCTK_ATTRIBUTE_UNUSED = (-(boostx*(-1 + csetemp6 + \n+ csetemp7 + csetemp8 + (-1 + boosty*shiftaddy + boostz*shiftaddz)*pow(1 \n+ - csetemp6 - csetemp7 - csetemp8,0.5))) + shiftaddx*(csetemp6 + (-1 + \n+ csetemp7 + csetemp8)*(1 + pow(1 - csetemp6 - csetemp7 - \n+ csetemp8,0.5))))*pow(-1 + csetemp6 + csetemp7 + csetemp8,-1)*pow(1 + \n+ pow(1 - csetemp6 - csetemp7 - csetemp8,0.5),-1);\n+ \n+ CCTK_REAL xform2L11 CCTK_ATTRIBUTE_UNUSED = (csetemp6 + (-1 + csetemp7 \n+ + csetemp8)*(1 + pow(1 - csetemp6 - csetemp7 - csetemp8,0.5)))*pow(-1 + \n+ csetemp6 + csetemp7 + csetemp8,-1)*pow(1 + pow(1 - csetemp6 - csetemp7 \n+ - csetemp8,0.5),-1);\n+ \n+ CCTK_REAL xform2L12 CCTK_ATTRIBUTE_UNUSED = -(boostx*boosty*pow(-1 + \n+ csetemp6 + csetemp7 + csetemp8 - pow(1 - csetemp6 - csetemp7 - \n+ csetemp8,0.5),-1));\n+ \n+ CCTK_REAL xform2L13 CCTK_ATTRIBUTE_UNUSED = -(boostx*boostz*pow(-1 + \n+ csetemp6 + csetemp7 + csetemp8 - pow(1 - csetemp6 - csetemp7 - \n+ csetemp8,0.5),-1));\n+ \n+ CCTK_REAL xform2L20 CCTK_ATTRIBUTE_UNUSED = (-(boosty*(-1 + csetemp6 + \n+ csetemp7 + csetemp8 + (-1 + boostx*shiftaddx + boostz*shiftaddz)*pow(1 \n+ - csetemp6 - csetemp7 - csetemp8,0.5))) + shiftaddy*(csetemp7 + (-1 + \n+ csetemp6 + csetemp8)*(1 + pow(1 - csetemp6 - csetemp7 - \n+ csetemp8,0.5))))*pow(-1 + csetemp6 + csetemp7 + csetemp8,-1)*pow(1 + \n+ pow(1 - csetemp6 - csetemp7 - csetemp8,0.5),-1);\n+ \n+ CCTK_REAL xform2L21 CCTK_ATTRIBUTE_UNUSED = -(boostx*boosty*pow(-1 + \n+ csetemp6 + csetemp7 + csetemp8 - pow(1 - csetemp6 - csetemp7 - \n+ csetemp8,0.5),-1));\n+ \n+ CCTK_REAL xform2L22 CCTK_ATTRIBUTE_UNUSED = (csetemp7 + (-1 + csetemp6 \n+ + csetemp8)*(1 + pow(1 - csetemp6 - csetemp7 - csetemp8,0.5)))*pow(-1 + \n+ csetemp6 + csetemp7 + csetemp8,-1)*pow(1 + pow(1 - csetemp6 - csetemp7 \n+ - csetemp8,0.5),-1);\n+ \n+ CCTK_REAL xform2L23 CCTK_ATTRIBUTE_UNUSED = -(boosty*boostz*pow(-1 + \n+ csetemp6 + csetemp7 + csetemp8 - pow(1 - csetemp6 - csetemp7 - \n+ csetemp8,0.5),-1));\n+ \n+ CCTK_REAL xform2L30 CCTK_ATTRIBUTE_UNUSED = (shiftaddz*(-1 + csetemp6 \n+ + csetemp7 + csetemp8 + (-1 + csetemp6 + csetemp7)*pow(1 - csetemp6 - \n+ csetemp7 - csetemp8,0.5)) - boostz*(-1 + csetemp6 + csetemp7 + csetemp8 \n+ + (-1 + boostx*shiftaddx + boosty*shiftaddy)*pow(1 - csetemp6 - \n+ csetemp7 - csetemp8,0.5)))*pow(-1 + csetemp6 + csetemp7 + \n+ csetemp8,-1)*pow(1 + pow(1 - csetemp6 - csetemp7 - csetemp8,0.5),-1);\n+ \n+ CCTK_REAL xform2L31 CCTK_ATTRIBUTE_UNUSED = -(boostx*boostz*pow(-1 + \n+ csetemp6 + csetemp7 + csetemp8 - pow(1 - csetemp6 - csetemp7 - \n+ csetemp8,0.5),-1));\n+ \n+ CCTK_REAL xform2L32 CCTK_ATTRIBUTE_UNUSED = -(boosty*boostz*pow(-1 + \n+ csetemp6 + csetemp7 + csetemp8 - pow(1 - csetemp6 - csetemp7 - \n+ csetemp8,0.5),-1));\n+ \n+ CCTK_REAL xform2L33 CCTK_ATTRIBUTE_UNUSED = (-1 + csetemp6 + csetemp7 \n+ + csetemp8 + (-1 + csetemp6 + csetemp7)*pow(1 - csetemp6 - csetemp7 - \n+ csetemp8,0.5))*pow(-1 + csetemp6 + csetemp7 + csetemp8,-1)*pow(1 + \n+ pow(1 - csetemp6 - csetemp7 - csetemp8,0.5),-1);\n+ \n+ CCTK_REAL xformL00 CCTK_ATTRIBUTE_UNUSED = xform1L00*xform2L00 + \n+ xform1L01*xform2L10 + xform1L02*xform2L20 + xform1L03*xform2L30;\n+ \n+ CCTK_REAL xformL01 CCTK_ATTRIBUTE_UNUSED = xform1L00*xform2L01 + \n+ xform1L01*xform2L11 + xform1L02*xform2L21 + xform1L03*xform2L31;\n+ \n+ CCTK_REAL xformL02 CCTK_ATTRIBUTE_UNUSED = xform1L00*xform2L02 + \n+ xform1L01*xform2L12 + xform1L02*xform2L22 + xform1L03*xform2L32;\n+ \n+ CCTK_REAL xformL03 CCTK_ATTRIBUTE_UNUSED = xform1L00*xform2L03 + \n+ xform1L01*xform2L13 + xform1L02*xform2L23 + xform1L03*xform2L33;\n+ \n+ CCTK_REAL xformL10 CCTK_ATTRIBUTE_UNUSED = xform1L10*xform2L00 + \n+ xform1L11*xform2L10 + xform1L12*xform2L20 + xform1L13*xform2L30;\n+ \n+ CCTK_REAL xformL11 CCTK_ATTRIBUTE_UNUSED = xform1L10*xform2L01 + \n+ xform1L11*xform2L11 + xform1L12*xform2L21 + xform1L13*xform2L31;\n+ \n+ CCTK_REAL xformL12 CCTK_ATTRIBUTE_UNUSED = xform1L10*xform2L02 + \n+ xform1L11*xform2L12 + xform1L12*xform2L22 + xform1L13*xform2L32;\n+ \n+ CCTK_REAL xformL13 CCTK_ATTRIBUTE_UNUSED = xform1L10*xform2L03 + \n+ xform1L11*xform2L13 + xform1L12*xform2L23 + xform1L13*xform2L33;\n+ \n+ CCTK_REAL xformL20 CCTK_ATTRIBUTE_UNUSED = xform1L20*xform2L00 + \n+ xform1L21*xform2L10 + xform1L22*xform2L20 + xform1L23*xform2L30;\n+ \n+ CCTK_REAL xformL21 CCTK_ATTRIBUTE_UNUSED = xform1L20*xform2L01 + \n+ xform1L21*xform2L11 + xform1L22*xform2L21 + xform1L23*xform2L31;\n+ \n+ CCTK_REAL xformL22 CCTK_ATTRIBUTE_UNUSED = xform1L20*xform2L02 + \n+ xform1L21*xform2L12 + xform1L22*xform2L22 + xform1L23*xform2L32;\n+ \n+ CCTK_REAL xformL23 CCTK_ATTRIBUTE_UNUSED = xform1L20*xform2L03 + \n+ xform1L21*xform2L13 + xform1L22*xform2L23 + xform1L23*xform2L33;\n+ \n+ CCTK_REAL xformL30 CCTK_ATTRIBUTE_UNUSED = xform1L30*xform2L00 + \n+ xform1L31*xform2L10 + xform1L32*xform2L20 + xform1L33*xform2L30;\n+ \n+ CCTK_REAL xformL31 CCTK_ATTRIBUTE_UNUSED = xform1L30*xform2L01 + \n+ xform1L31*xform2L11 + xform1L32*xform2L21 + xform1L33*xform2L31;\n+ \n+ CCTK_REAL xformL32 CCTK_ATTRIBUTE_UNUSED = xform1L30*xform2L02 + \n+ xform1L31*xform2L12 + xform1L32*xform2L22 + xform1L33*xform2L32;\n+ \n+ CCTK_REAL xformL33 CCTK_ATTRIBUTE_UNUSED = xform1L30*xform2L03 + \n+ xform1L31*xform2L13 + xform1L32*xform2L23 + xform1L33*xform2L33;\n+ \n+ CCTK_REAL tg400 CCTK_ATTRIBUTE_UNUSED = -1;\n+ \n+ CCTK_REAL tg401 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tg402 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tg403 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tg411 CCTK_ATTRIBUTE_UNUSED = 1;\n+ \n+ CCTK_REAL tg412 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tg413 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tg422 CCTK_ATTRIBUTE_UNUSED = 1;\n+ \n+ CCTK_REAL tg423 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tg433 CCTK_ATTRIBUTE_UNUSED = 1;\n+ \n+ CCTK_REAL tdg4000 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tdg4001 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tdg4002 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tdg4003 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tdg4010 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tdg4011 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tdg4012 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tdg4013 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tdg4020 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tdg4021 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tdg4022 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tdg4023 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tdg4030 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tdg4031 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tdg4032 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tdg4033 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tdg4110 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tdg4111 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tdg4112 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tdg4113 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tdg4120 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tdg4121 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tdg4122 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tdg4123 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tdg4130 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tdg4131 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tdg4132 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tdg4133 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tdg4220 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tdg4221 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tdg4222 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tdg4223 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tdg4230 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tdg4231 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tdg4232 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tdg4233 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tdg4330 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tdg4331 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tdg4332 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tdg4333 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL g400 CCTK_ATTRIBUTE_UNUSED = 2*(tg423*xformL20*xformL30 + \n+ xformL00*(tg401*xformL10 + tg402*xformL20 + tg403*xformL30) + \n+ xformL10*(tg412*xformL20 + tg413*xformL30)) + tg400*pow(xformL00,2) + \n+ tg411*pow(xformL10,2) + tg422*pow(xformL20,2) + tg433*pow(xformL30,2);\n+ \n+ CCTK_REAL csetemp10 CCTK_ATTRIBUTE_UNUSED = tg400*xformL01;\n+ \n+ CCTK_REAL csetemp11 CCTK_ATTRIBUTE_UNUSED = tg401*xformL11;\n+ \n+ CCTK_REAL csetemp12 CCTK_ATTRIBUTE_UNUSED = tg402*xformL21;\n+ \n+ CCTK_REAL csetemp13 CCTK_ATTRIBUTE_UNUSED = tg403*xformL31;\n+ \n+ CCTK_REAL csetemp14 CCTK_ATTRIBUTE_UNUSED = tg401*xformL01;\n+ \n+ CCTK_REAL csetemp15 CCTK_ATTRIBUTE_UNUSED = tg411*xformL11;\n+ \n+ CCTK_REAL csetemp16 CCTK_ATTRIBUTE_UNUSED = tg412*xformL21;\n+ \n+ CCTK_REAL csetemp17 CCTK_ATTRIBUTE_UNUSED = tg413*xformL31;\n+ \n+ CCTK_REAL csetemp18 CCTK_ATTRIBUTE_UNUSED = tg402*xformL01;\n+ \n+ CCTK_REAL csetemp19 CCTK_ATTRIBUTE_UNUSED = tg412*xformL11;\n+ \n+ CCTK_REAL csetemp20 CCTK_ATTRIBUTE_UNUSED = tg422*xformL21;\n+ \n+ CCTK_REAL csetemp21 CCTK_ATTRIBUTE_UNUSED = tg423*xformL31;\n+ \n+ CCTK_REAL csetemp22 CCTK_ATTRIBUTE_UNUSED = tg403*xformL01;\n+ \n+ CCTK_REAL csetemp23 CCTK_ATTRIBUTE_UNUSED = tg413*xformL11;\n+ \n+ CCTK_REAL csetemp24 CCTK_ATTRIBUTE_UNUSED = tg423*xformL21;\n+ \n+ CCTK_REAL csetemp25 CCTK_ATTRIBUTE_UNUSED = tg433*xformL31;\n+ \n+ CCTK_REAL g401 CCTK_ATTRIBUTE_UNUSED = (csetemp10 + csetemp11 + \n+ csetemp12 + csetemp13)*xformL00 + (csetemp14 + csetemp15 + csetemp16 + \n+ csetemp17)*xformL10 + (csetemp18 + csetemp19 + csetemp20 + \n+ csetemp21)*xformL20 + (csetemp22 + csetemp23 + csetemp24 + \n+ csetemp25)*xformL30;\n+ \n+ CCTK_REAL csetemp26 CCTK_ATTRIBUTE_UNUSED = tg400*xformL02;\n+ \n+ CCTK_REAL csetemp27 CCTK_ATTRIBUTE_UNUSED = tg401*xformL12;\n+ \n+ CCTK_REAL csetemp28 CCTK_ATTRIBUTE_UNUSED = tg402*xformL22;\n+ \n+ CCTK_REAL csetemp29 CCTK_ATTRIBUTE_UNUSED = tg403*xformL32;\n+ \n+ CCTK_REAL csetemp30 CCTK_ATTRIBUTE_UNUSED = tg401*xformL02;\n+ \n+ CCTK_REAL csetemp31 CCTK_ATTRIBUTE_UNUSED = tg411*xformL12;\n+ \n+ CCTK_REAL csetemp32 CCTK_ATTRIBUTE_UNUSED = tg412*xformL22;\n+ \n+ CCTK_REAL csetemp33 CCTK_ATTRIBUTE_UNUSED = tg413*xformL32;\n+ \n+ CCTK_REAL csetemp34 CCTK_ATTRIBUTE_UNUSED = tg402*xformL02;\n+ \n+ CCTK_REAL csetemp35 CCTK_ATTRIBUTE_UNUSED = tg412*xformL12;\n+ \n+ CCTK_REAL csetemp36 CCTK_ATTRIBUTE_UNUSED = tg422*xformL22;\n+ \n+ CCTK_REAL csetemp37 CCTK_ATTRIBUTE_UNUSED = tg423*xformL32;\n+ \n+ CCTK_REAL csetemp38 CCTK_ATTRIBUTE_UNUSED = tg403*xformL02;\n+ \n+ CCTK_REAL csetemp39 CCTK_ATTRIBUTE_UNUSED = tg413*xformL12;\n+ \n+ CCTK_REAL csetemp40 CCTK_ATTRIBUTE_UNUSED = tg423*xformL22;\n+ \n+ CCTK_REAL csetemp41 CCTK_ATTRIBUTE_UNUSED = tg433*xformL32;\n+ \n+ CCTK_REAL g402 CCTK_ATTRIBUTE_UNUSED = (csetemp26 + csetemp27 + \n+ csetemp28 + csetemp29)*xformL00 + (csetemp30 + csetemp31 + csetemp32 + \n+ csetemp33)*xformL10 + (csetemp34 + csetemp35 + csetemp36 + \n+ csetemp37)*xformL20 + (csetemp38 + csetemp39 + csetemp40 + \n+ csetemp41)*xformL30;\n+ \n+ CCTK_REAL csetemp42 CCTK_ATTRIBUTE_UNUSED = tg400*xformL03;\n+ \n+ CCTK_REAL csetemp43 CCTK_ATTRIBUTE_UNUSED = tg401*xformL13;\n+ \n+ CCTK_REAL csetemp44 CCTK_ATTRIBUTE_UNUSED = tg402*xformL23;\n+ \n+ CCTK_REAL csetemp45 CCTK_ATTRIBUTE_UNUSED = tg403*xformL33;\n+ \n+ CCTK_REAL csetemp46 CCTK_ATTRIBUTE_UNUSED = tg401*xformL03;\n+ \n+ CCTK_REAL csetemp47 CCTK_ATTRIBUTE_UNUSED = tg411*xformL13;\n+ \n+ CCTK_REAL csetemp48 CCTK_ATTRIBUTE_UNUSED = tg412*xformL23;\n+ \n+ CCTK_REAL csetemp49 CCTK_ATTRIBUTE_UNUSED = tg413*xformL33;\n+ \n+ CCTK_REAL csetemp50 CCTK_ATTRIBUTE_UNUSED = tg402*xformL03;\n+ \n+ CCTK_REAL csetemp51 CCTK_ATTRIBUTE_UNUSED = tg412*xformL13;\n+ \n+ CCTK_REAL csetemp52 CCTK_ATTRIBUTE_UNUSED = tg422*xformL23;\n+ \n+ CCTK_REAL csetemp53 CCTK_ATTRIBUTE_UNUSED = tg423*xformL33;\n+ \n+ CCTK_REAL csetemp54 CCTK_ATTRIBUTE_UNUSED = tg403*xformL03;\n+ \n+ CCTK_REAL csetemp55 CCTK_ATTRIBUTE_UNUSED = tg413*xformL13;\n+ \n+ CCTK_REAL csetemp56 CCTK_ATTRIBUTE_UNUSED = tg423*xformL23;\n+ \n+ CCTK_REAL csetemp57 CCTK_ATTRIBUTE_UNUSED = tg433*xformL33;\n+ \n+ CCTK_REAL g403 CCTK_ATTRIBUTE_UNUSED = (csetemp42 + csetemp43 + \n+ csetemp44 + csetemp45)*xformL00 + (csetemp46 + csetemp47 + csetemp48 + \n+ csetemp49)*xformL10 + (csetemp50 + csetemp51 + csetemp52 + \n+ csetemp53)*xformL20 + (csetemp54 + csetemp55 + csetemp56 + \n+ csetemp57)*xformL30;\n+ \n+ CCTK_REAL g411 CCTK_ATTRIBUTE_UNUSED = (csetemp10 + csetemp11 + \n+ csetemp12 + csetemp13)*xformL01 + (csetemp14 + csetemp15 + csetemp16 + \n+ csetemp17)*xformL11 + (csetemp18 + csetemp19 + csetemp20 + \n+ csetemp21)*xformL21 + (csetemp22 + csetemp23 + csetemp24 + \n+ csetemp25)*xformL31;\n+ \n+ CCTK_REAL g412 CCTK_ATTRIBUTE_UNUSED = (csetemp26 + csetemp27 + \n+ csetemp28 + csetemp29)*xformL01 + (csetemp30 + csetemp31 + csetemp32 + \n+ csetemp33)*xformL11 + (csetemp34 + csetemp35 + csetemp36 + \n+ csetemp37)*xformL21 + (csetemp38 + csetemp39 + csetemp40 + \n+ csetemp41)*xformL31;\n+ \n+ CCTK_REAL g413 CCTK_ATTRIBUTE_UNUSED = (csetemp42 + csetemp43 + \n+ csetemp44 + csetemp45)*xformL01 + (csetemp46 + csetemp47 + csetemp48 + \n+ csetemp49)*xformL11 + (csetemp50 + csetemp51 + csetemp52 + \n+ csetemp53)*xformL21 + (csetemp54 + csetemp55 + csetemp56 + \n+ csetemp57)*xformL31;\n+ \n+ CCTK_REAL g422 CCTK_ATTRIBUTE_UNUSED = (csetemp26 + csetemp27 + \n+ csetemp28 + csetemp29)*xformL02 + (csetemp30 + csetemp31 + csetemp32 + \n+ csetemp33)*xformL12 + (csetemp34 + csetemp35 + csetemp36 + \n+ csetemp37)*xformL22 + (csetemp38 + csetemp39 + csetemp40 + \n+ csetemp41)*xformL32;\n+ \n+ CCTK_REAL g423 CCTK_ATTRIBUTE_UNUSED = (csetemp42 + csetemp43 + \n+ csetemp44 + csetemp45)*xformL02 + (csetemp46 + csetemp47 + csetemp48 + \n+ csetemp49)*xformL12 + (csetemp50 + csetemp51 + csetemp52 + \n+ csetemp53)*xformL22 + (csetemp54 + csetemp55 + csetemp56 + \n+ csetemp57)*xformL32;\n+ \n+ CCTK_REAL g433 CCTK_ATTRIBUTE_UNUSED = (csetemp42 + csetemp43 + \n+ csetemp44 + csetemp45)*xformL03 + (csetemp46 + csetemp47 + csetemp48 + \n+ csetemp49)*xformL13 + (csetemp50 + csetemp51 + csetemp52 + \n+ csetemp53)*xformL23 + (csetemp54 + csetemp55 + csetemp56 + \n+ csetemp57)*xformL33;\n+ \n+ CCTK_REAL csetemp58 CCTK_ATTRIBUTE_UNUSED = tdg4000*xformL00;\n+ \n+ CCTK_REAL csetemp59 CCTK_ATTRIBUTE_UNUSED = tdg4001*xformL10;\n+ \n+ CCTK_REAL csetemp60 CCTK_ATTRIBUTE_UNUSED = tdg4002*xformL20;\n+ \n+ CCTK_REAL csetemp61 CCTK_ATTRIBUTE_UNUSED = tdg4003*xformL30;\n+ \n+ CCTK_REAL csetemp62 CCTK_ATTRIBUTE_UNUSED = tdg4010*xformL00;\n+ \n+ CCTK_REAL csetemp63 CCTK_ATTRIBUTE_UNUSED = tdg4011*xformL10;\n+ \n+ CCTK_REAL csetemp64 CCTK_ATTRIBUTE_UNUSED = tdg4012*xformL20;\n+ \n+ CCTK_REAL csetemp65 CCTK_ATTRIBUTE_UNUSED = tdg4013*xformL30;\n+ \n+ CCTK_REAL csetemp66 CCTK_ATTRIBUTE_UNUSED = tdg4020*xformL00;\n+ \n+ CCTK_REAL csetemp67 CCTK_ATTRIBUTE_UNUSED = tdg4021*xformL10;\n+ \n+ CCTK_REAL csetemp68 CCTK_ATTRIBUTE_UNUSED = tdg4022*xformL20;\n+ \n+ CCTK_REAL csetemp69 CCTK_ATTRIBUTE_UNUSED = tdg4023*xformL30;\n+ \n+ CCTK_REAL csetemp70 CCTK_ATTRIBUTE_UNUSED = tdg4030*xformL00;\n+ \n+ CCTK_REAL csetemp71 CCTK_ATTRIBUTE_UNUSED = tdg4031*xformL10;\n+ \n+ CCTK_REAL csetemp72 CCTK_ATTRIBUTE_UNUSED = tdg4032*xformL20;\n+ \n+ CCTK_REAL csetemp73 CCTK_ATTRIBUTE_UNUSED = tdg4033*xformL30;\n+ \n+ CCTK_REAL csetemp74 CCTK_ATTRIBUTE_UNUSED = tdg4110*xformL00;\n+ \n+ CCTK_REAL csetemp75 CCTK_ATTRIBUTE_UNUSED = tdg4111*xformL10;\n+ \n+ CCTK_REAL csetemp76 CCTK_ATTRIBUTE_UNUSED = tdg4112*xformL20;\n+ \n+ CCTK_REAL csetemp77 CCTK_ATTRIBUTE_UNUSED = tdg4113*xformL30;\n+ \n+ CCTK_REAL csetemp78 CCTK_ATTRIBUTE_UNUSED = tdg4120*xformL00;\n+ \n+ CCTK_REAL csetemp79 CCTK_ATTRIBUTE_UNUSED = tdg4121*xformL10;\n+ \n+ CCTK_REAL csetemp80 CCTK_ATTRIBUTE_UNUSED = tdg4122*xformL20;\n+ \n+ CCTK_REAL csetemp81 CCTK_ATTRIBUTE_UNUSED = tdg4123*xformL30;\n+ \n+ CCTK_REAL csetemp82 CCTK_ATTRIBUTE_UNUSED = tdg4130*xformL00;\n+ \n+ CCTK_REAL csetemp83 CCTK_ATTRIBUTE_UNUSED = tdg4131*xformL10;\n+ \n+ CCTK_REAL csetemp84 CCTK_ATTRIBUTE_UNUSED = tdg4132*xformL20;\n+ \n+ CCTK_REAL csetemp85 CCTK_ATTRIBUTE_UNUSED = tdg4133*xformL30;\n+ \n+ CCTK_REAL csetemp86 CCTK_ATTRIBUTE_UNUSED = tdg4220*xformL00;\n+ \n+ CCTK_REAL csetemp87 CCTK_ATTRIBUTE_UNUSED = tdg4221*xformL10;\n+ \n+ CCTK_REAL csetemp88 CCTK_ATTRIBUTE_UNUSED = tdg4222*xformL20;\n+ \n+ CCTK_REAL csetemp89 CCTK_ATTRIBUTE_UNUSED = tdg4223*xformL30;\n+ \n+ CCTK_REAL csetemp90 CCTK_ATTRIBUTE_UNUSED = tdg4230*xformL00;\n+ \n+ CCTK_REAL csetemp91 CCTK_ATTRIBUTE_UNUSED = tdg4231*xformL10;\n+ \n+ CCTK_REAL csetemp92 CCTK_ATTRIBUTE_UNUSED = tdg4232*xformL20;\n+ \n+ CCTK_REAL csetemp93 CCTK_ATTRIBUTE_UNUSED = tdg4233*xformL30;\n+ \n+ CCTK_REAL csetemp94 CCTK_ATTRIBUTE_UNUSED = tdg4330*xformL00;\n+ \n+ CCTK_REAL csetemp95 CCTK_ATTRIBUTE_UNUSED = tdg4331*xformL10;\n+ \n+ CCTK_REAL csetemp96 CCTK_ATTRIBUTE_UNUSED = tdg4332*xformL20;\n+ \n+ CCTK_REAL csetemp97 CCTK_ATTRIBUTE_UNUSED = tdg4333*xformL30;\n+ \n+ CCTK_REAL dg4000 CCTK_ATTRIBUTE_UNUSED = xformL00*((csetemp58 + \n+ csetemp59 + csetemp60 + csetemp61)*xformL00 + (csetemp62 + csetemp63 + \n+ csetemp64 + csetemp65)*xformL10 + (csetemp66 + csetemp67 + csetemp68 + \n+ csetemp69)*xformL20 + (csetemp70 + csetemp71 + csetemp72 + \n+ csetemp73)*xformL30) + xformL10*((csetemp62 + csetemp63 + csetemp64 + \n+ csetemp65)*xformL00 + (csetemp74 + csetemp75 + csetemp76 + \n+ csetemp77)*xformL10 + (csetemp78 + csetemp79 + csetemp80 + \n+ csetemp81)*xformL20 + (csetemp82 + csetemp83 + csetemp84 + \n+ csetemp85)*xformL30) + xformL20*((csetemp66 + csetemp67 + csetemp68 + \n+ csetemp69)*xformL00 + (csetemp78 + csetemp79 + csetemp80 + \n+ csetemp81)*xformL10 + (csetemp86 + csetemp87 + csetemp88 + \n+ csetemp89)*xformL20 + (csetemp90 + csetemp91 + csetemp92 + \n+ csetemp93)*xformL30) + xformL30*((csetemp70 + csetemp71 + csetemp72 + \n+ csetemp73)*xformL00 + (csetemp82 + csetemp83 + csetemp84 + \n+ csetemp85)*xformL10 + (csetemp90 + csetemp91 + csetemp92 + \n+ csetemp93)*xformL20 + (csetemp94 + csetemp95 + csetemp96 + \n+ csetemp97)*xformL30);\n+ \n+ CCTK_REAL dg4010 CCTK_ATTRIBUTE_UNUSED = xformL00*((csetemp58 + \n+ csetemp59 + csetemp60 + csetemp61)*xformL01 + (csetemp62 + csetemp63 + \n+ csetemp64 + csetemp65)*xformL11 + (csetemp66 + csetemp67 + csetemp68 + \n+ csetemp69)*xformL21 + (csetemp70 + csetemp71 + csetemp72 + \n+ csetemp73)*xformL31) + xformL10*((csetemp62 + csetemp63 + csetemp64 + \n+ csetemp65)*xformL01 + (csetemp74 + csetemp75 + csetemp76 + \n+ csetemp77)*xformL11 + (csetemp78 + csetemp79 + csetemp80 + \n+ csetemp81)*xformL21 + (csetemp82 + csetemp83 + csetemp84 + \n+ csetemp85)*xformL31) + xformL20*((csetemp66 + csetemp67 + csetemp68 + \n+ csetemp69)*xformL01 + (csetemp78 + csetemp79 + csetemp80 + \n+ csetemp81)*xformL11 + (csetemp86 + csetemp87 + csetemp88 + \n+ csetemp89)*xformL21 + (csetemp90 + csetemp91 + csetemp92 + \n+ csetemp93)*xformL31) + xformL30*((csetemp70 + csetemp71 + csetemp72 + \n+ csetemp73)*xformL01 + (csetemp82 + csetemp83 + csetemp84 + \n+ csetemp85)*xformL11 + (csetemp90 + csetemp91 + csetemp92 + \n+ csetemp93)*xformL21 + (csetemp94 + csetemp95 + csetemp96 + \n+ csetemp97)*xformL31);\n+ \n+ CCTK_REAL csetemp98 CCTK_ATTRIBUTE_UNUSED = tdg4000*xformL01;\n+ \n+ CCTK_REAL csetemp99 CCTK_ATTRIBUTE_UNUSED = tdg4001*xformL11;\n+ \n+ CCTK_REAL csetemp100 CCTK_ATTRIBUTE_UNUSED = tdg4002*xformL21;\n+ \n+ CCTK_REAL csetemp101 CCTK_ATTRIBUTE_UNUSED = tdg4003*xformL31;\n+ \n+ CCTK_REAL csetemp102 CCTK_ATTRIBUTE_UNUSED = tdg4010*xformL01;\n+ \n+ CCTK_REAL csetemp103 CCTK_ATTRIBUTE_UNUSED = tdg4011*xformL11;\n+ \n+ CCTK_REAL csetemp104 CCTK_ATTRIBUTE_UNUSED = tdg4012*xformL21;\n+ \n+ CCTK_REAL csetemp105 CCTK_ATTRIBUTE_UNUSED = tdg4013*xformL31;\n+ \n+ CCTK_REAL csetemp106 CCTK_ATTRIBUTE_UNUSED = tdg4020*xformL01;\n+ \n+ CCTK_REAL csetemp107 CCTK_ATTRIBUTE_UNUSED = tdg4021*xformL11;\n+ \n+ CCTK_REAL csetemp108 CCTK_ATTRIBUTE_UNUSED = tdg4022*xformL21;\n+ \n+ CCTK_REAL csetemp109 CCTK_ATTRIBUTE_UNUSED = tdg4023*xformL31;\n+ \n+ CCTK_REAL csetemp110 CCTK_ATTRIBUTE_UNUSED = tdg4030*xformL01;\n+ \n+ CCTK_REAL csetemp111 CCTK_ATTRIBUTE_UNUSED = tdg4031*xformL11;\n+ \n+ CCTK_REAL csetemp112 CCTK_ATTRIBUTE_UNUSED = tdg4032*xformL21;\n+ \n+ CCTK_REAL csetemp113 CCTK_ATTRIBUTE_UNUSED = tdg4033*xformL31;\n+ \n+ CCTK_REAL csetemp114 CCTK_ATTRIBUTE_UNUSED = tdg4110*xformL01;\n+ \n+ CCTK_REAL csetemp115 CCTK_ATTRIBUTE_UNUSED = tdg4111*xformL11;\n+ \n+ CCTK_REAL csetemp116 CCTK_ATTRIBUTE_UNUSED = tdg4112*xformL21;\n+ \n+ CCTK_REAL csetemp117 CCTK_ATTRIBUTE_UNUSED = tdg4113*xformL31;\n+ \n+ CCTK_REAL csetemp118 CCTK_ATTRIBUTE_UNUSED = tdg4120*xformL01;\n+ \n+ CCTK_REAL csetemp119 CCTK_ATTRIBUTE_UNUSED = tdg4121*xformL11;\n+ \n+ CCTK_REAL csetemp120 CCTK_ATTRIBUTE_UNUSED = tdg4122*xformL21;\n+ \n+ CCTK_REAL csetemp121 CCTK_ATTRIBUTE_UNUSED = tdg4123*xformL31;\n+ \n+ CCTK_REAL csetemp122 CCTK_ATTRIBUTE_UNUSED = tdg4130*xformL01;\n+ \n+ CCTK_REAL csetemp123 CCTK_ATTRIBUTE_UNUSED = tdg4131*xformL11;\n+ \n+ CCTK_REAL csetemp124 CCTK_ATTRIBUTE_UNUSED = tdg4132*xformL21;\n+ \n+ CCTK_REAL csetemp125 CCTK_ATTRIBUTE_UNUSED = tdg4133*xformL31;\n+ \n+ CCTK_REAL csetemp126 CCTK_ATTRIBUTE_UNUSED = tdg4220*xformL01;\n+ \n+ CCTK_REAL csetemp127 CCTK_ATTRIBUTE_UNUSED = tdg4221*xformL11;\n+ \n+ CCTK_REAL csetemp128 CCTK_ATTRIBUTE_UNUSED = tdg4222*xformL21;\n+ \n+ CCTK_REAL csetemp129 CCTK_ATTRIBUTE_UNUSED = tdg4223*xformL31;\n+ \n+ CCTK_REAL csetemp130 CCTK_ATTRIBUTE_UNUSED = tdg4230*xformL01;\n+ \n+ CCTK_REAL csetemp131 CCTK_ATTRIBUTE_UNUSED = tdg4231*xformL11;\n+ \n+ CCTK_REAL csetemp132 CCTK_ATTRIBUTE_UNUSED = tdg4232*xformL21;\n+ \n+ CCTK_REAL csetemp133 CCTK_ATTRIBUTE_UNUSED = tdg4233*xformL31;\n+ \n+ CCTK_REAL csetemp134 CCTK_ATTRIBUTE_UNUSED = tdg4330*xformL01;\n+ \n+ CCTK_REAL csetemp135 CCTK_ATTRIBUTE_UNUSED = tdg4331*xformL11;\n+ \n+ CCTK_REAL csetemp136 CCTK_ATTRIBUTE_UNUSED = tdg4332*xformL21;\n+ \n+ CCTK_REAL csetemp137 CCTK_ATTRIBUTE_UNUSED = tdg4333*xformL31;\n+ \n+ CCTK_REAL dg4011 CCTK_ATTRIBUTE_UNUSED = xformL00*((csetemp100 + \n+ csetemp101 + csetemp98 + csetemp99)*xformL01 + (csetemp102 + csetemp103 \n+ + csetemp104 + csetemp105)*xformL11 + (csetemp106 + csetemp107 + \n+ csetemp108 + csetemp109)*xformL21 + (csetemp110 + csetemp111 + \n+ csetemp112 + csetemp113)*xformL31) + xformL10*((csetemp102 + csetemp103 \n+ + csetemp104 + csetemp105)*xformL01 + (csetemp114 + csetemp115 + \n+ csetemp116 + csetemp117)*xformL11 + (csetemp118 + csetemp119 + \n+ csetemp120 + csetemp121)*xformL21 + (csetemp122 + csetemp123 + \n+ csetemp124 + csetemp125)*xformL31) + xformL20*((csetemp106 + csetemp107 \n+ + csetemp108 + csetemp109)*xformL01 + (csetemp118 + csetemp119 + \n+ csetemp120 + csetemp121)*xformL11 + (csetemp126 + csetemp127 + \n+ csetemp128 + csetemp129)*xformL21 + (csetemp130 + csetemp131 + \n+ csetemp132 + csetemp133)*xformL31) + xformL30*((csetemp110 + csetemp111 \n+ + csetemp112 + csetemp113)*xformL01 + (csetemp122 + csetemp123 + \n+ csetemp124 + csetemp125)*xformL11 + (csetemp130 + csetemp131 + \n+ csetemp132 + csetemp133)*xformL21 + (csetemp134 + csetemp135 + \n+ csetemp136 + csetemp137)*xformL31);\n+ \n+ CCTK_REAL csetemp138 CCTK_ATTRIBUTE_UNUSED = tdg4000*xformL02;\n+ \n+ CCTK_REAL csetemp139 CCTK_ATTRIBUTE_UNUSED = tdg4001*xformL12;\n+ \n+ CCTK_REAL csetemp140 CCTK_ATTRIBUTE_UNUSED = tdg4002*xformL22;\n+ \n+ CCTK_REAL csetemp141 CCTK_ATTRIBUTE_UNUSED = tdg4003*xformL32;\n+ \n+ CCTK_REAL csetemp142 CCTK_ATTRIBUTE_UNUSED = tdg4010*xformL02;\n+ \n+ CCTK_REAL csetemp143 CCTK_ATTRIBUTE_UNUSED = tdg4011*xformL12;\n+ \n+ CCTK_REAL csetemp144 CCTK_ATTRIBUTE_UNUSED = tdg4012*xformL22;\n+ \n+ CCTK_REAL csetemp145 CCTK_ATTRIBUTE_UNUSED = tdg4013*xformL32;\n+ \n+ CCTK_REAL csetemp146 CCTK_ATTRIBUTE_UNUSED = tdg4020*xformL02;\n+ \n+ CCTK_REAL csetemp147 CCTK_ATTRIBUTE_UNUSED = tdg4021*xformL12;\n+ \n+ CCTK_REAL csetemp148 CCTK_ATTRIBUTE_UNUSED = tdg4022*xformL22;\n+ \n+ CCTK_REAL csetemp149 CCTK_ATTRIBUTE_UNUSED = tdg4023*xformL32;\n+ \n+ CCTK_REAL csetemp150 CCTK_ATTRIBUTE_UNUSED = tdg4030*xformL02;\n+ \n+ CCTK_REAL csetemp151 CCTK_ATTRIBUTE_UNUSED = tdg4031*xformL12;\n+ \n+ CCTK_REAL csetemp152 CCTK_ATTRIBUTE_UNUSED = tdg4032*xformL22;\n+ \n+ CCTK_REAL csetemp153 CCTK_ATTRIBUTE_UNUSED = tdg4033*xformL32;\n+ \n+ CCTK_REAL csetemp154 CCTK_ATTRIBUTE_UNUSED = tdg4110*xformL02;\n+ \n+ CCTK_REAL csetemp155 CCTK_ATTRIBUTE_UNUSED = tdg4111*xformL12;\n+ \n+ CCTK_REAL csetemp156 CCTK_ATTRIBUTE_UNUSED = tdg4112*xformL22;\n+ \n+ CCTK_REAL csetemp157 CCTK_ATTRIBUTE_UNUSED = tdg4113*xformL32;\n+ \n+ CCTK_REAL csetemp158 CCTK_ATTRIBUTE_UNUSED = tdg4120*xformL02;\n+ \n+ CCTK_REAL csetemp159 CCTK_ATTRIBUTE_UNUSED = tdg4121*xformL12;\n+ \n+ CCTK_REAL csetemp160 CCTK_ATTRIBUTE_UNUSED = tdg4122*xformL22;\n+ \n+ CCTK_REAL csetemp161 CCTK_ATTRIBUTE_UNUSED = tdg4123*xformL32;\n+ \n+ CCTK_REAL csetemp162 CCTK_ATTRIBUTE_UNUSED = tdg4130*xformL02;\n+ \n+ CCTK_REAL csetemp163 CCTK_ATTRIBUTE_UNUSED = tdg4131*xformL12;\n+ \n+ CCTK_REAL csetemp164 CCTK_ATTRIBUTE_UNUSED = tdg4132*xformL22;\n+ \n+ CCTK_REAL csetemp165 CCTK_ATTRIBUTE_UNUSED = tdg4133*xformL32;\n+ \n+ CCTK_REAL csetemp166 CCTK_ATTRIBUTE_UNUSED = tdg4220*xformL02;\n+ \n+ CCTK_REAL csetemp167 CCTK_ATTRIBUTE_UNUSED = tdg4221*xformL12;\n+ \n+ CCTK_REAL csetemp168 CCTK_ATTRIBUTE_UNUSED = tdg4222*xformL22;\n+ \n+ CCTK_REAL csetemp169 CCTK_ATTRIBUTE_UNUSED = tdg4223*xformL32;\n+ \n+ CCTK_REAL csetemp170 CCTK_ATTRIBUTE_UNUSED = tdg4230*xformL02;\n+ \n+ CCTK_REAL csetemp171 CCTK_ATTRIBUTE_UNUSED = tdg4231*xformL12;\n+ \n+ CCTK_REAL csetemp172 CCTK_ATTRIBUTE_UNUSED = tdg4232*xformL22;\n+ \n+ CCTK_REAL csetemp173 CCTK_ATTRIBUTE_UNUSED = tdg4233*xformL32;\n+ \n+ CCTK_REAL csetemp174 CCTK_ATTRIBUTE_UNUSED = tdg4330*xformL02;\n+ \n+ CCTK_REAL csetemp175 CCTK_ATTRIBUTE_UNUSED = tdg4331*xformL12;\n+ \n+ CCTK_REAL csetemp176 CCTK_ATTRIBUTE_UNUSED = tdg4332*xformL22;\n+ \n+ CCTK_REAL csetemp177 CCTK_ATTRIBUTE_UNUSED = tdg4333*xformL32;\n+ \n+ CCTK_REAL dg4012 CCTK_ATTRIBUTE_UNUSED = xformL00*((csetemp138 + \n+ csetemp139 + csetemp140 + csetemp141)*xformL01 + (csetemp142 + \n+ csetemp143 + csetemp144 + csetemp145)*xformL11 + (csetemp146 + \n+ csetemp147 + csetemp148 + csetemp149)*xformL21 + (csetemp150 + \n+ csetemp151 + csetemp152 + csetemp153)*xformL31) + xformL10*((csetemp142 \n+ + csetemp143 + csetemp144 + csetemp145)*xformL01 + (csetemp154 + \n+ csetemp155 + csetemp156 + csetemp157)*xformL11 + (csetemp158 + \n+ csetemp159 + csetemp160 + csetemp161)*xformL21 + (csetemp162 + \n+ csetemp163 + csetemp164 + csetemp165)*xformL31) + xformL20*((csetemp146 \n+ + csetemp147 + csetemp148 + csetemp149)*xformL01 + (csetemp158 + \n+ csetemp159 + csetemp160 + csetemp161)*xformL11 + (csetemp166 + \n+ csetemp167 + csetemp168 + csetemp169)*xformL21 + (csetemp170 + \n+ csetemp171 + csetemp172 + csetemp173)*xformL31) + xformL30*((csetemp150 \n+ + csetemp151 + csetemp152 + csetemp153)*xformL01 + (csetemp162 + \n+ csetemp163 + csetemp164 + csetemp165)*xformL11 + (csetemp170 + \n+ csetemp171 + csetemp172 + csetemp173)*xformL21 + (csetemp174 + \n+ csetemp175 + csetemp176 + csetemp177)*xformL31);\n+ \n+ CCTK_REAL csetemp178 CCTK_ATTRIBUTE_UNUSED = tdg4000*xformL03;\n+ \n+ CCTK_REAL csetemp179 CCTK_ATTRIBUTE_UNUSED = tdg4001*xformL13;\n+ \n+ CCTK_REAL csetemp180 CCTK_ATTRIBUTE_UNUSED = tdg4002*xformL23;\n+ \n+ CCTK_REAL csetemp181 CCTK_ATTRIBUTE_UNUSED = tdg4003*xformL33;\n+ \n+ CCTK_REAL csetemp182 CCTK_ATTRIBUTE_UNUSED = tdg4010*xformL03;\n+ \n+ CCTK_REAL csetemp183 CCTK_ATTRIBUTE_UNUSED = tdg4011*xformL13;\n+ \n+ CCTK_REAL csetemp184 CCTK_ATTRIBUTE_UNUSED = tdg4012*xformL23;\n+ \n+ CCTK_REAL csetemp185 CCTK_ATTRIBUTE_UNUSED = tdg4013*xformL33;\n+ \n+ CCTK_REAL csetemp186 CCTK_ATTRIBUTE_UNUSED = tdg4020*xformL03;\n+ \n+ CCTK_REAL csetemp187 CCTK_ATTRIBUTE_UNUSED = tdg4021*xformL13;\n+ \n+ CCTK_REAL csetemp188 CCTK_ATTRIBUTE_UNUSED = tdg4022*xformL23;\n+ \n+ CCTK_REAL csetemp189 CCTK_ATTRIBUTE_UNUSED = tdg4023*xformL33;\n+ \n+ CCTK_REAL csetemp190 CCTK_ATTRIBUTE_UNUSED = tdg4030*xformL03;\n+ \n+ CCTK_REAL csetemp191 CCTK_ATTRIBUTE_UNUSED = tdg4031*xformL13;\n+ \n+ CCTK_REAL csetemp192 CCTK_ATTRIBUTE_UNUSED = tdg4032*xformL23;\n+ \n+ CCTK_REAL csetemp193 CCTK_ATTRIBUTE_UNUSED = tdg4033*xformL33;\n+ \n+ CCTK_REAL csetemp194 CCTK_ATTRIBUTE_UNUSED = tdg4110*xformL03;\n+ \n+ CCTK_REAL csetemp195 CCTK_ATTRIBUTE_UNUSED = tdg4111*xformL13;\n+ \n+ CCTK_REAL csetemp196 CCTK_ATTRIBUTE_UNUSED = tdg4112*xformL23;\n+ \n+ CCTK_REAL csetemp197 CCTK_ATTRIBUTE_UNUSED = tdg4113*xformL33;\n+ \n+ CCTK_REAL csetemp198 CCTK_ATTRIBUTE_UNUSED = tdg4120*xformL03;\n+ \n+ CCTK_REAL csetemp199 CCTK_ATTRIBUTE_UNUSED = tdg4121*xformL13;\n+ \n+ CCTK_REAL csetemp200 CCTK_ATTRIBUTE_UNUSED = tdg4122*xformL23;\n+ \n+ CCTK_REAL csetemp201 CCTK_ATTRIBUTE_UNUSED = tdg4123*xformL33;\n+ \n+ CCTK_REAL csetemp202 CCTK_ATTRIBUTE_UNUSED = tdg4130*xformL03;\n+ \n+ CCTK_REAL csetemp203 CCTK_ATTRIBUTE_UNUSED = tdg4131*xformL13;\n+ \n+ CCTK_REAL csetemp204 CCTK_ATTRIBUTE_UNUSED = tdg4132*xformL23;\n+ \n+ CCTK_REAL csetemp205 CCTK_ATTRIBUTE_UNUSED = tdg4133*xformL33;\n+ \n+ CCTK_REAL csetemp206 CCTK_ATTRIBUTE_UNUSED = tdg4220*xformL03;\n+ \n+ CCTK_REAL csetemp207 CCTK_ATTRIBUTE_UNUSED = tdg4221*xformL13;\n+ \n+ CCTK_REAL csetemp208 CCTK_ATTRIBUTE_UNUSED = tdg4222*xformL23;\n+ \n+ CCTK_REAL csetemp209 CCTK_ATTRIBUTE_UNUSED = tdg4223*xformL33;\n+ \n+ CCTK_REAL csetemp210 CCTK_ATTRIBUTE_UNUSED = tdg4230*xformL03;\n+ \n+ CCTK_REAL csetemp211 CCTK_ATTRIBUTE_UNUSED = tdg4231*xformL13;\n+ \n+ CCTK_REAL csetemp212 CCTK_ATTRIBUTE_UNUSED = tdg4232*xformL23;\n+ \n+ CCTK_REAL csetemp213 CCTK_ATTRIBUTE_UNUSED = tdg4233*xformL33;\n+ \n+ CCTK_REAL csetemp214 CCTK_ATTRIBUTE_UNUSED = tdg4330*xformL03;\n+ \n+ CCTK_REAL csetemp215 CCTK_ATTRIBUTE_UNUSED = tdg4331*xformL13;\n+ \n+ CCTK_REAL csetemp216 CCTK_ATTRIBUTE_UNUSED = tdg4332*xformL23;\n+ \n+ CCTK_REAL csetemp217 CCTK_ATTRIBUTE_UNUSED = tdg4333*xformL33;\n+ \n+ CCTK_REAL dg4013 CCTK_ATTRIBUTE_UNUSED = xformL00*((csetemp178 + \n+ csetemp179 + csetemp180 + csetemp181)*xformL01 + (csetemp182 + \n+ csetemp183 + csetemp184 + csetemp185)*xformL11 + (csetemp186 + \n+ csetemp187 + csetemp188 + csetemp189)*xformL21 + (csetemp190 + \n+ csetemp191 + csetemp192 + csetemp193)*xformL31) + xformL10*((csetemp182 \n+ + csetemp183 + csetemp184 + csetemp185)*xformL01 + (csetemp194 + \n+ csetemp195 + csetemp196 + csetemp197)*xformL11 + (csetemp198 + \n+ csetemp199 + csetemp200 + csetemp201)*xformL21 + (csetemp202 + \n+ csetemp203 + csetemp204 + csetemp205)*xformL31) + xformL20*((csetemp186 \n+ + csetemp187 + csetemp188 + csetemp189)*xformL01 + (csetemp198 + \n+ csetemp199 + csetemp200 + csetemp201)*xformL11 + (csetemp206 + \n+ csetemp207 + csetemp208 + csetemp209)*xformL21 + (csetemp210 + \n+ csetemp211 + csetemp212 + csetemp213)*xformL31) + xformL30*((csetemp190 \n+ + csetemp191 + csetemp192 + csetemp193)*xformL01 + (csetemp202 + \n+ csetemp203 + csetemp204 + csetemp205)*xformL11 + (csetemp210 + \n+ csetemp211 + csetemp212 + csetemp213)*xformL21 + (csetemp214 + \n+ csetemp215 + csetemp216 + csetemp217)*xformL31);\n+ \n+ CCTK_REAL dg4020 CCTK_ATTRIBUTE_UNUSED = xformL00*((csetemp58 + \n+ csetemp59 + csetemp60 + csetemp61)*xformL02 + (csetemp62 + csetemp63 + \n+ csetemp64 + csetemp65)*xformL12 + (csetemp66 + csetemp67 + csetemp68 + \n+ csetemp69)*xformL22 + (csetemp70 + csetemp71 + csetemp72 + \n+ csetemp73)*xformL32) + xformL10*((csetemp62 + csetemp63 + csetemp64 + \n+ csetemp65)*xformL02 + (csetemp74 + csetemp75 + csetemp76 + \n+ csetemp77)*xformL12 + (csetemp78 + csetemp79 + csetemp80 + \n+ csetemp81)*xformL22 + (csetemp82 + csetemp83 + csetemp84 + \n+ csetemp85)*xformL32) + xformL20*((csetemp66 + csetemp67 + csetemp68 + \n+ csetemp69)*xformL02 + (csetemp78 + csetemp79 + csetemp80 + \n+ csetemp81)*xformL12 + (csetemp86 + csetemp87 + csetemp88 + \n+ csetemp89)*xformL22 + (csetemp90 + csetemp91 + csetemp92 + \n+ csetemp93)*xformL32) + xformL30*((csetemp70 + csetemp71 + csetemp72 + \n+ csetemp73)*xformL02 + (csetemp82 + csetemp83 + csetemp84 + \n+ csetemp85)*xformL12 + (csetemp90 + csetemp91 + csetemp92 + \n+ csetemp93)*xformL22 + (csetemp94 + csetemp95 + csetemp96 + \n+ csetemp97)*xformL32);\n+ \n+ CCTK_REAL dg4021 CCTK_ATTRIBUTE_UNUSED = xformL00*((csetemp100 + \n+ csetemp101 + csetemp98 + csetemp99)*xformL02 + (csetemp102 + csetemp103 \n+ + csetemp104 + csetemp105)*xformL12 + (csetemp106 + csetemp107 + \n+ csetemp108 + csetemp109)*xformL22 + (csetemp110 + csetemp111 + \n+ csetemp112 + csetemp113)*xformL32) + xformL10*((csetemp102 + csetemp103 \n+ + csetemp104 + csetemp105)*xformL02 + (csetemp114 + csetemp115 + \n+ csetemp116 + csetemp117)*xformL12 + (csetemp118 + csetemp119 + \n+ csetemp120 + csetemp121)*xformL22 + (csetemp122 + csetemp123 + \n+ csetemp124 + csetemp125)*xformL32) + xformL20*((csetemp106 + csetemp107 \n+ + csetemp108 + csetemp109)*xformL02 + (csetemp118 + csetemp119 + \n+ csetemp120 + csetemp121)*xformL12 + (csetemp126 + csetemp127 + \n+ csetemp128 + csetemp129)*xformL22 + (csetemp130 + csetemp131 + \n+ csetemp132 + csetemp133)*xformL32) + xformL30*((csetemp110 + csetemp111 \n+ + csetemp112 + csetemp113)*xformL02 + (csetemp122 + csetemp123 + \n+ csetemp124 + csetemp125)*xformL12 + (csetemp130 + csetemp131 + \n+ csetemp132 + csetemp133)*xformL22 + (csetemp134 + csetemp135 + \n+ csetemp136 + csetemp137)*xformL32);\n+ \n+ CCTK_REAL dg4022 CCTK_ATTRIBUTE_UNUSED = xformL00*((csetemp138 + \n+ csetemp139 + csetemp140 + csetemp141)*xformL02 + (csetemp142 + \n+ csetemp143 + csetemp144 + csetemp145)*xformL12 + (csetemp146 + \n+ csetemp147 + csetemp148 + csetemp149)*xformL22 + (csetemp150 + \n+ csetemp151 + csetemp152 + csetemp153)*xformL32) + xformL10*((csetemp142 \n+ + csetemp143 + csetemp144 + csetemp145)*xformL02 + (csetemp154 + \n+ csetemp155 + csetemp156 + csetemp157)*xformL12 + (csetemp158 + \n+ csetemp159 + csetemp160 + csetemp161)*xformL22 + (csetemp162 + \n+ csetemp163 + csetemp164 + csetemp165)*xformL32) + xformL20*((csetemp146 \n+ + csetemp147 + csetemp148 + csetemp149)*xformL02 + (csetemp158 + \n+ csetemp159 + csetemp160 + csetemp161)*xformL12 + (csetemp166 + \n+ csetemp167 + csetemp168 + csetemp169)*xformL22 + (csetemp170 + \n+ csetemp171 + csetemp172 + csetemp173)*xformL32) + xformL30*((csetemp150 \n+ + csetemp151 + csetemp152 + csetemp153)*xformL02 + (csetemp162 + \n+ csetemp163 + csetemp164 + csetemp165)*xformL12 + (csetemp170 + \n+ csetemp171 + csetemp172 + csetemp173)*xformL22 + (csetemp174 + \n+ csetemp175 + csetemp176 + csetemp177)*xformL32);\n+ \n+ CCTK_REAL dg4023 CCTK_ATTRIBUTE_UNUSED = xformL00*((csetemp178 + \n+ csetemp179 + csetemp180 + csetemp181)*xformL02 + (csetemp182 + \n+ csetemp183 + csetemp184 + csetemp185)*xformL12 + (csetemp186 + \n+ csetemp187 + csetemp188 + csetemp189)*xformL22 + (csetemp190 + \n+ csetemp191 + csetemp192 + csetemp193)*xformL32) + xformL10*((csetemp182 \n+ + csetemp183 + csetemp184 + csetemp185)*xformL02 + (csetemp194 + \n+ csetemp195 + csetemp196 + csetemp197)*xformL12 + (csetemp198 + \n+ csetemp199 + csetemp200 + csetemp201)*xformL22 + (csetemp202 + \n+ csetemp203 + csetemp204 + csetemp205)*xformL32) + xformL20*((csetemp186 \n+ + csetemp187 + csetemp188 + csetemp189)*xformL02 + (csetemp198 + \n+ csetemp199 + csetemp200 + csetemp201)*xformL12 + (csetemp206 + \n+ csetemp207 + csetemp208 + csetemp209)*xformL22 + (csetemp210 + \n+ csetemp211 + csetemp212 + csetemp213)*xformL32) + xformL30*((csetemp190 \n+ + csetemp191 + csetemp192 + csetemp193)*xformL02 + (csetemp202 + \n+ csetemp203 + csetemp204 + csetemp205)*xformL12 + (csetemp210 + \n+ csetemp211 + csetemp212 + csetemp213)*xformL22 + (csetemp214 + \n+ csetemp215 + csetemp216 + csetemp217)*xformL32);\n+ \n+ CCTK_REAL dg4030 CCTK_ATTRIBUTE_UNUSED = xformL00*((csetemp58 + \n+ csetemp59 + csetemp60 + csetemp61)*xformL03 + (csetemp62 + csetemp63 + \n+ csetemp64 + csetemp65)*xformL13 + (csetemp66 + csetemp67 + csetemp68 + \n+ csetemp69)*xformL23 + (csetemp70 + csetemp71 + csetemp72 + \n+ csetemp73)*xformL33) + xformL10*((csetemp62 + csetemp63 + csetemp64 + \n+ csetemp65)*xformL03 + (csetemp74 + csetemp75 + csetemp76 + \n+ csetemp77)*xformL13 + (csetemp78 + csetemp79 + csetemp80 + \n+ csetemp81)*xformL23 + (csetemp82 + csetemp83 + csetemp84 + \n+ csetemp85)*xformL33) + xformL20*((csetemp66 + csetemp67 + csetemp68 + \n+ csetemp69)*xformL03 + (csetemp78 + csetemp79 + csetemp80 + \n+ csetemp81)*xformL13 + (csetemp86 + csetemp87 + csetemp88 + \n+ csetemp89)*xformL23 + (csetemp90 + csetemp91 + csetemp92 + \n+ csetemp93)*xformL33) + xformL30*((csetemp70 + csetemp71 + csetemp72 + \n+ csetemp73)*xformL03 + (csetemp82 + csetemp83 + csetemp84 + \n+ csetemp85)*xformL13 + (csetemp90 + csetemp91 + csetemp92 + \n+ csetemp93)*xformL23 + (csetemp94 + csetemp95 + csetemp96 + \n+ csetemp97)*xformL33);\n+ \n+ CCTK_REAL dg4031 CCTK_ATTRIBUTE_UNUSED = xformL00*((csetemp100 + \n+ csetemp101 + csetemp98 + csetemp99)*xformL03 + (csetemp102 + csetemp103 \n+ + csetemp104 + csetemp105)*xformL13 + (csetemp106 + csetemp107 + \n+ csetemp108 + csetemp109)*xformL23 + (csetemp110 + csetemp111 + \n+ csetemp112 + csetemp113)*xformL33) + xformL10*((csetemp102 + csetemp103 \n+ + csetemp104 + csetemp105)*xformL03 + (csetemp114 + csetemp115 + \n+ csetemp116 + csetemp117)*xformL13 + (csetemp118 + csetemp119 + \n+ csetemp120 + csetemp121)*xformL23 + (csetemp122 + csetemp123 + \n+ csetemp124 + csetemp125)*xformL33) + xformL20*((csetemp106 + csetemp107 \n+ + csetemp108 + csetemp109)*xformL03 + (csetemp118 + csetemp119 + \n+ csetemp120 + csetemp121)*xformL13 + (csetemp126 + csetemp127 + \n+ csetemp128 + csetemp129)*xformL23 + (csetemp130 + csetemp131 + \n+ csetemp132 + csetemp133)*xformL33) + xformL30*((csetemp110 + csetemp111 \n+ + csetemp112 + csetemp113)*xformL03 + (csetemp122 + csetemp123 + \n+ csetemp124 + csetemp125)*xformL13 + (csetemp130 + csetemp131 + \n+ csetemp132 + csetemp133)*xformL23 + (csetemp134 + csetemp135 + \n+ csetemp136 + csetemp137)*xformL33);\n+ \n+ CCTK_REAL dg4032 CCTK_ATTRIBUTE_UNUSED = xformL00*((csetemp138 + \n+ csetemp139 + csetemp140 + csetemp141)*xformL03 + (csetemp142 + \n+ csetemp143 + csetemp144 + csetemp145)*xformL13 + (csetemp146 + \n+ csetemp147 + csetemp148 + csetemp149)*xformL23 + (csetemp150 + \n+ csetemp151 + csetemp152 + csetemp153)*xformL33) + xformL10*((csetemp142 \n+ + csetemp143 + csetemp144 + csetemp145)*xformL03 + (csetemp154 + \n+ csetemp155 + csetemp156 + csetemp157)*xformL13 + (csetemp158 + \n+ csetemp159 + csetemp160 + csetemp161)*xformL23 + (csetemp162 + \n+ csetemp163 + csetemp164 + csetemp165)*xformL33) + xformL20*((csetemp146 \n+ + csetemp147 + csetemp148 + csetemp149)*xformL03 + (csetemp158 + \n+ csetemp159 + csetemp160 + csetemp161)*xformL13 + (csetemp166 + \n+ csetemp167 + csetemp168 + csetemp169)*xformL23 + (csetemp170 + \n+ csetemp171 + csetemp172 + csetemp173)*xformL33) + xformL30*((csetemp150 \n+ + csetemp151 + csetemp152 + csetemp153)*xformL03 + (csetemp162 + \n+ csetemp163 + csetemp164 + csetemp165)*xformL13 + (csetemp170 + \n+ csetemp171 + csetemp172 + csetemp173)*xformL23 + (csetemp174 + \n+ csetemp175 + csetemp176 + csetemp177)*xformL33);\n+ \n+ CCTK_REAL dg4033 CCTK_ATTRIBUTE_UNUSED = xformL00*((csetemp178 + \n+ csetemp179 + csetemp180 + csetemp181)*xformL03 + (csetemp182 + \n+ csetemp183 + csetemp184 + csetemp185)*xformL13 + (csetemp186 + \n+ csetemp187 + csetemp188 + csetemp189)*xformL23 + (csetemp190 + \n+ csetemp191 + csetemp192 + csetemp193)*xformL33) + xformL10*((csetemp182 \n+ + csetemp183 + csetemp184 + csetemp185)*xformL03 + (csetemp194 + \n+ csetemp195 + csetemp196 + csetemp197)*xformL13 + (csetemp198 + \n+ csetemp199 + csetemp200 + csetemp201)*xformL23 + (csetemp202 + \n+ csetemp203 + csetemp204 + csetemp205)*xformL33) + xformL20*((csetemp186 \n+ + csetemp187 + csetemp188 + csetemp189)*xformL03 + (csetemp198 + \n+ csetemp199 + csetemp200 + csetemp201)*xformL13 + (csetemp206 + \n+ csetemp207 + csetemp208 + csetemp209)*xformL23 + (csetemp210 + \n+ csetemp211 + csetemp212 + csetemp213)*xformL33) + xformL30*((csetemp190 \n+ + csetemp191 + csetemp192 + csetemp193)*xformL03 + (csetemp202 + \n+ csetemp203 + csetemp204 + csetemp205)*xformL13 + (csetemp210 + \n+ csetemp211 + csetemp212 + csetemp213)*xformL23 + (csetemp214 + \n+ csetemp215 + csetemp216 + csetemp217)*xformL33);\n+ \n+ CCTK_REAL dg4110 CCTK_ATTRIBUTE_UNUSED = xformL01*((csetemp58 + \n+ csetemp59 + csetemp60 + csetemp61)*xformL01 + (csetemp62 + csetemp63 + \n+ csetemp64 + csetemp65)*xformL11 + (csetemp66 + csetemp67 + csetemp68 + \n+ csetemp69)*xformL21 + (csetemp70 + csetemp71 + csetemp72 + \n+ csetemp73)*xformL31) + xformL11*((csetemp62 + csetemp63 + csetemp64 + \n+ csetemp65)*xformL01 + (csetemp74 + csetemp75 + csetemp76 + \n+ csetemp77)*xformL11 + (csetemp78 + csetemp79 + csetemp80 + \n+ csetemp81)*xformL21 + (csetemp82 + csetemp83 + csetemp84 + \n+ csetemp85)*xformL31) + xformL21*((csetemp66 + csetemp67 + csetemp68 + \n+ csetemp69)*xformL01 + (csetemp78 + csetemp79 + csetemp80 + \n+ csetemp81)*xformL11 + (csetemp86 + csetemp87 + csetemp88 + \n+ csetemp89)*xformL21 + (csetemp90 + csetemp91 + csetemp92 + \n+ csetemp93)*xformL31) + xformL31*((csetemp70 + csetemp71 + csetemp72 + \n+ csetemp73)*xformL01 + (csetemp82 + csetemp83 + csetemp84 + \n+ csetemp85)*xformL11 + (csetemp90 + csetemp91 + csetemp92 + \n+ csetemp93)*xformL21 + (csetemp94 + csetemp95 + csetemp96 + \n+ csetemp97)*xformL31);\n+ \n+ CCTK_REAL dg4111 CCTK_ATTRIBUTE_UNUSED = xformL01*((csetemp100 + \n+ csetemp101 + csetemp98 + csetemp99)*xformL01 + (csetemp102 + csetemp103 \n+ + csetemp104 + csetemp105)*xformL11 + (csetemp106 + csetemp107 + \n+ csetemp108 + csetemp109)*xformL21 + (csetemp110 + csetemp111 + \n+ csetemp112 + csetemp113)*xformL31) + xformL11*((csetemp102 + csetemp103 \n+ + csetemp104 + csetemp105)*xformL01 + (csetemp114 + csetemp115 + \n+ csetemp116 + csetemp117)*xformL11 + (csetemp118 + csetemp119 + \n+ csetemp120 + csetemp121)*xformL21 + (csetemp122 + csetemp123 + \n+ csetemp124 + csetemp125)*xformL31) + xformL21*((csetemp106 + csetemp107 \n+ + csetemp108 + csetemp109)*xformL01 + (csetemp118 + csetemp119 + \n+ csetemp120 + csetemp121)*xformL11 + (csetemp126 + csetemp127 + \n+ csetemp128 + csetemp129)*xformL21 + (csetemp130 + csetemp131 + \n+ csetemp132 + csetemp133)*xformL31) + xformL31*((csetemp110 + csetemp111 \n+ + csetemp112 + csetemp113)*xformL01 + (csetemp122 + csetemp123 + \n+ csetemp124 + csetemp125)*xformL11 + (csetemp130 + csetemp131 + \n+ csetemp132 + csetemp133)*xformL21 + (csetemp134 + csetemp135 + \n+ csetemp136 + csetemp137)*xformL31);\n+ \n+ CCTK_REAL dg4112 CCTK_ATTRIBUTE_UNUSED = xformL01*((csetemp138 + \n+ csetemp139 + csetemp140 + csetemp141)*xformL01 + (csetemp142 + \n+ csetemp143 + csetemp144 + csetemp145)*xformL11 + (csetemp146 + \n+ csetemp147 + csetemp148 + csetemp149)*xformL21 + (csetemp150 + \n+ csetemp151 + csetemp152 + csetemp153)*xformL31) + xformL11*((csetemp142 \n+ + csetemp143 + csetemp144 + csetemp145)*xformL01 + (csetemp154 + \n+ csetemp155 + csetemp156 + csetemp157)*xformL11 + (csetemp158 + \n+ csetemp159 + csetemp160 + csetemp161)*xformL21 + (csetemp162 + \n+ csetemp163 + csetemp164 + csetemp165)*xformL31) + xformL21*((csetemp146 \n+ + csetemp147 + csetemp148 + csetemp149)*xformL01 + (csetemp158 + \n+ csetemp159 + csetemp160 + csetemp161)*xformL11 + (csetemp166 + \n+ csetemp167 + csetemp168 + csetemp169)*xformL21 + (csetemp170 + \n+ csetemp171 + csetemp172 + csetemp173)*xformL31) + xformL31*((csetemp150 \n+ + csetemp151 + csetemp152 + csetemp153)*xformL01 + (csetemp162 + \n+ csetemp163 + csetemp164 + csetemp165)*xformL11 + (csetemp170 + \n+ csetemp171 + csetemp172 + csetemp173)*xformL21 + (csetemp174 + \n+ csetemp175 + csetemp176 + csetemp177)*xformL31);\n+ \n+ CCTK_REAL dg4113 CCTK_ATTRIBUTE_UNUSED = xformL01*((csetemp178 + \n+ csetemp179 + csetemp180 + csetemp181)*xformL01 + (csetemp182 + \n+ csetemp183 + csetemp184 + csetemp185)*xformL11 + (csetemp186 + \n+ csetemp187 + csetemp188 + csetemp189)*xformL21 + (csetemp190 + \n+ csetemp191 + csetemp192 + csetemp193)*xformL31) + xformL11*((csetemp182 \n+ + csetemp183 + csetemp184 + csetemp185)*xformL01 + (csetemp194 + \n+ csetemp195 + csetemp196 + csetemp197)*xformL11 + (csetemp198 + \n+ csetemp199 + csetemp200 + csetemp201)*xformL21 + (csetemp202 + \n+ csetemp203 + csetemp204 + csetemp205)*xformL31) + xformL21*((csetemp186 \n+ + csetemp187 + csetemp188 + csetemp189)*xformL01 + (csetemp198 + \n+ csetemp199 + csetemp200 + csetemp201)*xformL11 + (csetemp206 + \n+ csetemp207 + csetemp208 + csetemp209)*xformL21 + (csetemp210 + \n+ csetemp211 + csetemp212 + csetemp213)*xformL31) + xformL31*((csetemp190 \n+ + csetemp191 + csetemp192 + csetemp193)*xformL01 + (csetemp202 + \n+ csetemp203 + csetemp204 + csetemp205)*xformL11 + (csetemp210 + \n+ csetemp211 + csetemp212 + csetemp213)*xformL21 + (csetemp214 + \n+ csetemp215 + csetemp216 + csetemp217)*xformL31);\n+ \n+ CCTK_REAL dg4120 CCTK_ATTRIBUTE_UNUSED = xformL01*((csetemp58 + \n+ csetemp59 + csetemp60 + csetemp61)*xformL02 + (csetemp62 + csetemp63 + \n+ csetemp64 + csetemp65)*xformL12 + (csetemp66 + csetemp67 + csetemp68 + \n+ csetemp69)*xformL22 + (csetemp70 + csetemp71 + csetemp72 + \n+ csetemp73)*xformL32) + xformL11*((csetemp62 + csetemp63 + csetemp64 + \n+ csetemp65)*xformL02 + (csetemp74 + csetemp75 + csetemp76 + \n+ csetemp77)*xformL12 + (csetemp78 + csetemp79 + csetemp80 + \n+ csetemp81)*xformL22 + (csetemp82 + csetemp83 + csetemp84 + \n+ csetemp85)*xformL32) + xformL21*((csetemp66 + csetemp67 + csetemp68 + \n+ csetemp69)*xformL02 + (csetemp78 + csetemp79 + csetemp80 + \n+ csetemp81)*xformL12 + (csetemp86 + csetemp87 + csetemp88 + \n+ csetemp89)*xformL22 + (csetemp90 + csetemp91 + csetemp92 + \n+ csetemp93)*xformL32) + xformL31*((csetemp70 + csetemp71 + csetemp72 + \n+ csetemp73)*xformL02 + (csetemp82 + csetemp83 + csetemp84 + \n+ csetemp85)*xformL12 + (csetemp90 + csetemp91 + csetemp92 + \n+ csetemp93)*xformL22 + (csetemp94 + csetemp95 + csetemp96 + \n+ csetemp97)*xformL32);\n+ \n+ CCTK_REAL dg4121 CCTK_ATTRIBUTE_UNUSED = xformL01*((csetemp100 + \n+ csetemp101 + csetemp98 + csetemp99)*xformL02 + (csetemp102 + csetemp103 \n+ + csetemp104 + csetemp105)*xformL12 + (csetemp106 + csetemp107 + \n+ csetemp108 + csetemp109)*xformL22 + (csetemp110 + csetemp111 + \n+ csetemp112 + csetemp113)*xformL32) + xformL11*((csetemp102 + csetemp103 \n+ + csetemp104 + csetemp105)*xformL02 + (csetemp114 + csetemp115 + \n+ csetemp116 + csetemp117)*xformL12 + (csetemp118 + csetemp119 + \n+ csetemp120 + csetemp121)*xformL22 + (csetemp122 + csetemp123 + \n+ csetemp124 + csetemp125)*xformL32) + xformL21*((csetemp106 + csetemp107 \n+ + csetemp108 + csetemp109)*xformL02 + (csetemp118 + csetemp119 + \n+ csetemp120 + csetemp121)*xformL12 + (csetemp126 + csetemp127 + \n+ csetemp128 + csetemp129)*xformL22 + (csetemp130 + csetemp131 + \n+ csetemp132 + csetemp133)*xformL32) + xformL31*((csetemp110 + csetemp111 \n+ + csetemp112 + csetemp113)*xformL02 + (csetemp122 + csetemp123 + \n+ csetemp124 + csetemp125)*xformL12 + (csetemp130 + csetemp131 + \n+ csetemp132 + csetemp133)*xformL22 + (csetemp134 + csetemp135 + \n+ csetemp136 + csetemp137)*xformL32);\n+ \n+ CCTK_REAL dg4122 CCTK_ATTRIBUTE_UNUSED = xformL01*((csetemp138 + \n+ csetemp139 + csetemp140 + csetemp141)*xformL02 + (csetemp142 + \n+ csetemp143 + csetemp144 + csetemp145)*xformL12 + (csetemp146 + \n+ csetemp147 + csetemp148 + csetemp149)*xformL22 + (csetemp150 + \n+ csetemp151 + csetemp152 + csetemp153)*xformL32) + xformL11*((csetemp142 \n+ + csetemp143 + csetemp144 + csetemp145)*xformL02 + (csetemp154 + \n+ csetemp155 + csetemp156 + csetemp157)*xformL12 + (csetemp158 + \n+ csetemp159 + csetemp160 + csetemp161)*xformL22 + (csetemp162 + \n+ csetemp163 + csetemp164 + csetemp165)*xformL32) + xformL21*((csetemp146 \n+ + csetemp147 + csetemp148 + csetemp149)*xformL02 + (csetemp158 + \n+ csetemp159 + csetemp160 + csetemp161)*xformL12 + (csetemp166 + \n+ csetemp167 + csetemp168 + csetemp169)*xformL22 + (csetemp170 + \n+ csetemp171 + csetemp172 + csetemp173)*xformL32) + xformL31*((csetemp150 \n+ + csetemp151 + csetemp152 + csetemp153)*xformL02 + (csetemp162 + \n+ csetemp163 + csetemp164 + csetemp165)*xformL12 + (csetemp170 + \n+ csetemp171 + csetemp172 + csetemp173)*xformL22 + (csetemp174 + \n+ csetemp175 + csetemp176 + csetemp177)*xformL32);\n+ \n+ CCTK_REAL dg4123 CCTK_ATTRIBUTE_UNUSED = xformL01*((csetemp178 + \n+ csetemp179 + csetemp180 + csetemp181)*xformL02 + (csetemp182 + \n+ csetemp183 + csetemp184 + csetemp185)*xformL12 + (csetemp186 + \n+ csetemp187 + csetemp188 + csetemp189)*xformL22 + (csetemp190 + \n+ csetemp191 + csetemp192 + csetemp193)*xformL32) + xformL11*((csetemp182 \n+ + csetemp183 + csetemp184 + csetemp185)*xformL02 + (csetemp194 + \n+ csetemp195 + csetemp196 + csetemp197)*xformL12 + (csetemp198 + \n+ csetemp199 + csetemp200 + csetemp201)*xformL22 + (csetemp202 + \n+ csetemp203 + csetemp204 + csetemp205)*xformL32) + xformL21*((csetemp186 \n+ + csetemp187 + csetemp188 + csetemp189)*xformL02 + (csetemp198 + \n+ csetemp199 + csetemp200 + csetemp201)*xformL12 + (csetemp206 + \n+ csetemp207 + csetemp208 + csetemp209)*xformL22 + (csetemp210 + \n+ csetemp211 + csetemp212 + csetemp213)*xformL32) + xformL31*((csetemp190 \n+ + csetemp191 + csetemp192 + csetemp193)*xformL02 + (csetemp202 + \n+ csetemp203 + csetemp204 + csetemp205)*xformL12 + (csetemp210 + \n+ csetemp211 + csetemp212 + csetemp213)*xformL22 + (csetemp214 + \n+ csetemp215 + csetemp216 + csetemp217)*xformL32);\n+ \n+ CCTK_REAL dg4130 CCTK_ATTRIBUTE_UNUSED = xformL01*((csetemp58 + \n+ csetemp59 + csetemp60 + csetemp61)*xformL03 + (csetemp62 + csetemp63 + \n+ csetemp64 + csetemp65)*xformL13 + (csetemp66 + csetemp67 + csetemp68 + \n+ csetemp69)*xformL23 + (csetemp70 + csetemp71 + csetemp72 + \n+ csetemp73)*xformL33) + xformL11*((csetemp62 + csetemp63 + csetemp64 + \n+ csetemp65)*xformL03 + (csetemp74 + csetemp75 + csetemp76 + \n+ csetemp77)*xformL13 + (csetemp78 + csetemp79 + csetemp80 + \n+ csetemp81)*xformL23 + (csetemp82 + csetemp83 + csetemp84 + \n+ csetemp85)*xformL33) + xformL21*((csetemp66 + csetemp67 + csetemp68 + \n+ csetemp69)*xformL03 + (csetemp78 + csetemp79 + csetemp80 + \n+ csetemp81)*xformL13 + (csetemp86 + csetemp87 + csetemp88 + \n+ csetemp89)*xformL23 + (csetemp90 + csetemp91 + csetemp92 + \n+ csetemp93)*xformL33) + xformL31*((csetemp70 + csetemp71 + csetemp72 + \n+ csetemp73)*xformL03 + (csetemp82 + csetemp83 + csetemp84 + \n+ csetemp85)*xformL13 + (csetemp90 + csetemp91 + csetemp92 + \n+ csetemp93)*xformL23 + (csetemp94 + csetemp95 + csetemp96 + \n+ csetemp97)*xformL33);\n+ \n+ CCTK_REAL dg4131 CCTK_ATTRIBUTE_UNUSED = xformL01*((csetemp100 + \n+ csetemp101 + csetemp98 + csetemp99)*xformL03 + (csetemp102 + csetemp103 \n+ + csetemp104 + csetemp105)*xformL13 + (csetemp106 + csetemp107 + \n+ csetemp108 + csetemp109)*xformL23 + (csetemp110 + csetemp111 + \n+ csetemp112 + csetemp113)*xformL33) + xformL11*((csetemp102 + csetemp103 \n+ + csetemp104 + csetemp105)*xformL03 + (csetemp114 + csetemp115 + \n+ csetemp116 + csetemp117)*xformL13 + (csetemp118 + csetemp119 + \n+ csetemp120 + csetemp121)*xformL23 + (csetemp122 + csetemp123 + \n+ csetemp124 + csetemp125)*xformL33) + xformL21*((csetemp106 + csetemp107 \n+ + csetemp108 + csetemp109)*xformL03 + (csetemp118 + csetemp119 + \n+ csetemp120 + csetemp121)*xformL13 + (csetemp126 + csetemp127 + \n+ csetemp128 + csetemp129)*xformL23 + (csetemp130 + csetemp131 + \n+ csetemp132 + csetemp133)*xformL33) + xformL31*((csetemp110 + csetemp111 \n+ + csetemp112 + csetemp113)*xformL03 + (csetemp122 + csetemp123 + \n+ csetemp124 + csetemp125)*xformL13 + (csetemp130 + csetemp131 + \n+ csetemp132 + csetemp133)*xformL23 + (csetemp134 + csetemp135 + \n+ csetemp136 + csetemp137)*xformL33);\n+ \n+ CCTK_REAL dg4132 CCTK_ATTRIBUTE_UNUSED = xformL01*((csetemp138 + \n+ csetemp139 + csetemp140 + csetemp141)*xformL03 + (csetemp142 + \n+ csetemp143 + csetemp144 + csetemp145)*xformL13 + (csetemp146 + \n+ csetemp147 + csetemp148 + csetemp149)*xformL23 + (csetemp150 + \n+ csetemp151 + csetemp152 + csetemp153)*xformL33) + xformL11*((csetemp142 \n+ + csetemp143 + csetemp144 + csetemp145)*xformL03 + (csetemp154 + \n+ csetemp155 + csetemp156 + csetemp157)*xformL13 + (csetemp158 + \n+ csetemp159 + csetemp160 + csetemp161)*xformL23 + (csetemp162 + \n+ csetemp163 + csetemp164 + csetemp165)*xformL33) + xformL21*((csetemp146 \n+ + csetemp147 + csetemp148 + csetemp149)*xformL03 + (csetemp158 + \n+ csetemp159 + csetemp160 + csetemp161)*xformL13 + (csetemp166 + \n+ csetemp167 + csetemp168 + csetemp169)*xformL23 + (csetemp170 + \n+ csetemp171 + csetemp172 + csetemp173)*xformL33) + xformL31*((csetemp150 \n+ + csetemp151 + csetemp152 + csetemp153)*xformL03 + (csetemp162 + \n+ csetemp163 + csetemp164 + csetemp165)*xformL13 + (csetemp170 + \n+ csetemp171 + csetemp172 + csetemp173)*xformL23 + (csetemp174 + \n+ csetemp175 + csetemp176 + csetemp177)*xformL33);\n+ \n+ CCTK_REAL dg4133 CCTK_ATTRIBUTE_UNUSED = xformL01*((csetemp178 + \n+ csetemp179 + csetemp180 + csetemp181)*xformL03 + (csetemp182 + \n+ csetemp183 + csetemp184 + csetemp185)*xformL13 + (csetemp186 + \n+ csetemp187 + csetemp188 + csetemp189)*xformL23 + (csetemp190 + \n+ csetemp191 + csetemp192 + csetemp193)*xformL33) + xformL11*((csetemp182 \n+ + csetemp183 + csetemp184 + csetemp185)*xformL03 + (csetemp194 + \n+ csetemp195 + csetemp196 + csetemp197)*xformL13 + (csetemp198 + \n+ csetemp199 + csetemp200 + csetemp201)*xformL23 + (csetemp202 + \n+ csetemp203 + csetemp204 + csetemp205)*xformL33) + xformL21*((csetemp186 \n+ + csetemp187 + csetemp188 + csetemp189)*xformL03 + (csetemp198 + \n+ csetemp199 + csetemp200 + csetemp201)*xformL13 + (csetemp206 + \n+ csetemp207 + csetemp208 + csetemp209)*xformL23 + (csetemp210 + \n+ csetemp211 + csetemp212 + csetemp213)*xformL33) + xformL31*((csetemp190 \n+ + csetemp191 + csetemp192 + csetemp193)*xformL03 + (csetemp202 + \n+ csetemp203 + csetemp204 + csetemp205)*xformL13 + (csetemp210 + \n+ csetemp211 + csetemp212 + csetemp213)*xformL23 + (csetemp214 + \n+ csetemp215 + csetemp216 + csetemp217)*xformL33);\n+ \n+ CCTK_REAL dg4220 CCTK_ATTRIBUTE_UNUSED = xformL02*((csetemp58 + \n+ csetemp59 + csetemp60 + csetemp61)*xformL02 + (csetemp62 + csetemp63 + \n+ csetemp64 + csetemp65)*xformL12 + (csetemp66 + csetemp67 + csetemp68 + \n+ csetemp69)*xformL22 + (csetemp70 + csetemp71 + csetemp72 + \n+ csetemp73)*xformL32) + xformL12*((csetemp62 + csetemp63 + csetemp64 + \n+ csetemp65)*xformL02 + (csetemp74 + csetemp75 + csetemp76 + \n+ csetemp77)*xformL12 + (csetemp78 + csetemp79 + csetemp80 + \n+ csetemp81)*xformL22 + (csetemp82 + csetemp83 + csetemp84 + \n+ csetemp85)*xformL32) + xformL22*((csetemp66 + csetemp67 + csetemp68 + \n+ csetemp69)*xformL02 + (csetemp78 + csetemp79 + csetemp80 + \n+ csetemp81)*xformL12 + (csetemp86 + csetemp87 + csetemp88 + \n+ csetemp89)*xformL22 + (csetemp90 + csetemp91 + csetemp92 + \n+ csetemp93)*xformL32) + xformL32*((csetemp70 + csetemp71 + csetemp72 + \n+ csetemp73)*xformL02 + (csetemp82 + csetemp83 + csetemp84 + \n+ csetemp85)*xformL12 + (csetemp90 + csetemp91 + csetemp92 + \n+ csetemp93)*xformL22 + (csetemp94 + csetemp95 + csetemp96 + \n+ csetemp97)*xformL32);\n+ \n+ CCTK_REAL dg4221 CCTK_ATTRIBUTE_UNUSED = xformL02*((csetemp100 + \n+ csetemp101 + csetemp98 + csetemp99)*xformL02 + (csetemp102 + csetemp103 \n+ + csetemp104 + csetemp105)*xformL12 + (csetemp106 + csetemp107 + \n+ csetemp108 + csetemp109)*xformL22 + (csetemp110 + csetemp111 + \n+ csetemp112 + csetemp113)*xformL32) + xformL12*((csetemp102 + csetemp103 \n+ + csetemp104 + csetemp105)*xformL02 + (csetemp114 + csetemp115 + \n+ csetemp116 + csetemp117)*xformL12 + (csetemp118 + csetemp119 + \n+ csetemp120 + csetemp121)*xformL22 + (csetemp122 + csetemp123 + \n+ csetemp124 + csetemp125)*xformL32) + xformL22*((csetemp106 + csetemp107 \n+ + csetemp108 + csetemp109)*xformL02 + (csetemp118 + csetemp119 + \n+ csetemp120 + csetemp121)*xformL12 + (csetemp126 + csetemp127 + \n+ csetemp128 + csetemp129)*xformL22 + (csetemp130 + csetemp131 + \n+ csetemp132 + csetemp133)*xformL32) + xformL32*((csetemp110 + csetemp111 \n+ + csetemp112 + csetemp113)*xformL02 + (csetemp122 + csetemp123 + \n+ csetemp124 + csetemp125)*xformL12 + (csetemp130 + csetemp131 + \n+ csetemp132 + csetemp133)*xformL22 + (csetemp134 + csetemp135 + \n+ csetemp136 + csetemp137)*xformL32);\n+ \n+ CCTK_REAL dg4222 CCTK_ATTRIBUTE_UNUSED = xformL02*((csetemp138 + \n+ csetemp139 + csetemp140 + csetemp141)*xformL02 + (csetemp142 + \n+ csetemp143 + csetemp144 + csetemp145)*xformL12 + (csetemp146 + \n+ csetemp147 + csetemp148 + csetemp149)*xformL22 + (csetemp150 + \n+ csetemp151 + csetemp152 + csetemp153)*xformL32) + xformL12*((csetemp142 \n+ + csetemp143 + csetemp144 + csetemp145)*xformL02 + (csetemp154 + \n+ csetemp155 + csetemp156 + csetemp157)*xformL12 + (csetemp158 + \n+ csetemp159 + csetemp160 + csetemp161)*xformL22 + (csetemp162 + \n+ csetemp163 + csetemp164 + csetemp165)*xformL32) + xformL22*((csetemp146 \n+ + csetemp147 + csetemp148 + csetemp149)*xformL02 + (csetemp158 + \n+ csetemp159 + csetemp160 + csetemp161)*xformL12 + (csetemp166 + \n+ csetemp167 + csetemp168 + csetemp169)*xformL22 + (csetemp170 + \n+ csetemp171 + csetemp172 + csetemp173)*xformL32) + xformL32*((csetemp150 \n+ + csetemp151 + csetemp152 + csetemp153)*xformL02 + (csetemp162 + \n+ csetemp163 + csetemp164 + csetemp165)*xformL12 + (csetemp170 + \n+ csetemp171 + csetemp172 + csetemp173)*xformL22 + (csetemp174 + \n+ csetemp175 + csetemp176 + csetemp177)*xformL32);\n+ \n+ CCTK_REAL dg4223 CCTK_ATTRIBUTE_UNUSED = xformL02*((csetemp178 + \n+ csetemp179 + csetemp180 + csetemp181)*xformL02 + (csetemp182 + \n+ csetemp183 + csetemp184 + csetemp185)*xformL12 + (csetemp186 + \n+ csetemp187 + csetemp188 + csetemp189)*xformL22 + (csetemp190 + \n+ csetemp191 + csetemp192 + csetemp193)*xformL32) + xformL12*((csetemp182 \n+ + csetemp183 + csetemp184 + csetemp185)*xformL02 + (csetemp194 + \n+ csetemp195 + csetemp196 + csetemp197)*xformL12 + (csetemp198 + \n+ csetemp199 + csetemp200 + csetemp201)*xformL22 + (csetemp202 + \n+ csetemp203 + csetemp204 + csetemp205)*xformL32) + xformL22*((csetemp186 \n+ + csetemp187 + csetemp188 + csetemp189)*xformL02 + (csetemp198 + \n+ csetemp199 + csetemp200 + csetemp201)*xformL12 + (csetemp206 + \n+ csetemp207 + csetemp208 + csetemp209)*xformL22 + (csetemp210 + \n+ csetemp211 + csetemp212 + csetemp213)*xformL32) + xformL32*((csetemp190 \n+ + csetemp191 + csetemp192 + csetemp193)*xformL02 + (csetemp202 + \n+ csetemp203 + csetemp204 + csetemp205)*xformL12 + (csetemp210 + \n+ csetemp211 + csetemp212 + csetemp213)*xformL22 + (csetemp214 + \n+ csetemp215 + csetemp216 + csetemp217)*xformL32);\n+ \n+ CCTK_REAL dg4230 CCTK_ATTRIBUTE_UNUSED = xformL02*((csetemp58 + \n+ csetemp59 + csetemp60 + csetemp61)*xformL03 + (csetemp62 + csetemp63 + \n+ csetemp64 + csetemp65)*xformL13 + (csetemp66 + csetemp67 + csetemp68 + \n+ csetemp69)*xformL23 + (csetemp70 + csetemp71 + csetemp72 + \n+ csetemp73)*xformL33) + xformL12*((csetemp62 + csetemp63 + csetemp64 + \n+ csetemp65)*xformL03 + (csetemp74 + csetemp75 + csetemp76 + \n+ csetemp77)*xformL13 + (csetemp78 + csetemp79 + csetemp80 + \n+ csetemp81)*xformL23 + (csetemp82 + csetemp83 + csetemp84 + \n+ csetemp85)*xformL33) + xformL22*((csetemp66 + csetemp67 + csetemp68 + \n+ csetemp69)*xformL03 + (csetemp78 + csetemp79 + csetemp80 + \n+ csetemp81)*xformL13 + (csetemp86 + csetemp87 + csetemp88 + \n+ csetemp89)*xformL23 + (csetemp90 + csetemp91 + csetemp92 + \n+ csetemp93)*xformL33) + xformL32*((csetemp70 + csetemp71 + csetemp72 + \n+ csetemp73)*xformL03 + (csetemp82 + csetemp83 + csetemp84 + \n+ csetemp85)*xformL13 + (csetemp90 + csetemp91 + csetemp92 + \n+ csetemp93)*xformL23 + (csetemp94 + csetemp95 + csetemp96 + \n+ csetemp97)*xformL33);\n+ \n+ CCTK_REAL dg4231 CCTK_ATTRIBUTE_UNUSED = xformL02*((csetemp100 + \n+ csetemp101 + csetemp98 + csetemp99)*xformL03 + (csetemp102 + csetemp103 \n+ + csetemp104 + csetemp105)*xformL13 + (csetemp106 + csetemp107 + \n+ csetemp108 + csetemp109)*xformL23 + (csetemp110 + csetemp111 + \n+ csetemp112 + csetemp113)*xformL33) + xformL12*((csetemp102 + csetemp103 \n+ + csetemp104 + csetemp105)*xformL03 + (csetemp114 + csetemp115 + \n+ csetemp116 + csetemp117)*xformL13 + (csetemp118 + csetemp119 + \n+ csetemp120 + csetemp121)*xformL23 + (csetemp122 + csetemp123 + \n+ csetemp124 + csetemp125)*xformL33) + xformL22*((csetemp106 + csetemp107 \n+ + csetemp108 + csetemp109)*xformL03 + (csetemp118 + csetemp119 + \n+ csetemp120 + csetemp121)*xformL13 + (csetemp126 + csetemp127 + \n+ csetemp128 + csetemp129)*xformL23 + (csetemp130 + csetemp131 + \n+ csetemp132 + csetemp133)*xformL33) + xformL32*((csetemp110 + csetemp111 \n+ + csetemp112 + csetemp113)*xformL03 + (csetemp122 + csetemp123 + \n+ csetemp124 + csetemp125)*xformL13 + (csetemp130 + csetemp131 + \n+ csetemp132 + csetemp133)*xformL23 + (csetemp134 + csetemp135 + \n+ csetemp136 + csetemp137)*xformL33);\n+ \n+ CCTK_REAL dg4232 CCTK_ATTRIBUTE_UNUSED = xformL02*((csetemp138 + \n+ csetemp139 + csetemp140 + csetemp141)*xformL03 + (csetemp142 + \n+ csetemp143 + csetemp144 + csetemp145)*xformL13 + (csetemp146 + \n+ csetemp147 + csetemp148 + csetemp149)*xformL23 + (csetemp150 + \n+ csetemp151 + csetemp152 + csetemp153)*xformL33) + xformL12*((csetemp142 \n+ + csetemp143 + csetemp144 + csetemp145)*xformL03 + (csetemp154 + \n+ csetemp155 + csetemp156 + csetemp157)*xformL13 + (csetemp158 + \n+ csetemp159 + csetemp160 + csetemp161)*xformL23 + (csetemp162 + \n+ csetemp163 + csetemp164 + csetemp165)*xformL33) + xformL22*((csetemp146 \n+ + csetemp147 + csetemp148 + csetemp149)*xformL03 + (csetemp158 + \n+ csetemp159 + csetemp160 + csetemp161)*xformL13 + (csetemp166 + \n+ csetemp167 + csetemp168 + csetemp169)*xformL23 + (csetemp170 + \n+ csetemp171 + csetemp172 + csetemp173)*xformL33) + xformL32*((csetemp150 \n+ + csetemp151 + csetemp152 + csetemp153)*xformL03 + (csetemp162 + \n+ csetemp163 + csetemp164 + csetemp165)*xformL13 + (csetemp170 + \n+ csetemp171 + csetemp172 + csetemp173)*xformL23 + (csetemp174 + \n+ csetemp175 + csetemp176 + csetemp177)*xformL33);\n+ \n+ CCTK_REAL dg4233 CCTK_ATTRIBUTE_UNUSED = xformL02*((csetemp178 + \n+ csetemp179 + csetemp180 + csetemp181)*xformL03 + (csetemp182 + \n+ csetemp183 + csetemp184 + csetemp185)*xformL13 + (csetemp186 + \n+ csetemp187 + csetemp188 + csetemp189)*xformL23 + (csetemp190 + \n+ csetemp191 + csetemp192 + csetemp193)*xformL33) + xformL12*((csetemp182 \n+ + csetemp183 + csetemp184 + csetemp185)*xformL03 + (csetemp194 + \n+ csetemp195 + csetemp196 + csetemp197)*xformL13 + (csetemp198 + \n+ csetemp199 + csetemp200 + csetemp201)*xformL23 + (csetemp202 + \n+ csetemp203 + csetemp204 + csetemp205)*xformL33) + xformL22*((csetemp186 \n+ + csetemp187 + csetemp188 + csetemp189)*xformL03 + (csetemp198 + \n+ csetemp199 + csetemp200 + csetemp201)*xformL13 + (csetemp206 + \n+ csetemp207 + csetemp208 + csetemp209)*xformL23 + (csetemp210 + \n+ csetemp211 + csetemp212 + csetemp213)*xformL33) + xformL32*((csetemp190 \n+ + csetemp191 + csetemp192 + csetemp193)*xformL03 + (csetemp202 + \n+ csetemp203 + csetemp204 + csetemp205)*xformL13 + (csetemp210 + \n+ csetemp211 + csetemp212 + csetemp213)*xformL23 + (csetemp214 + \n+ csetemp215 + csetemp216 + csetemp217)*xformL33);\n+ \n+ CCTK_REAL dg4330 CCTK_ATTRIBUTE_UNUSED = xformL03*((csetemp58 + \n+ csetemp59 + csetemp60 + csetemp61)*xformL03 + (csetemp62 + csetemp63 + \n+ csetemp64 + csetemp65)*xformL13 + (csetemp66 + csetemp67 + csetemp68 + \n+ csetemp69)*xformL23 + (csetemp70 + csetemp71 + csetemp72 + \n+ csetemp73)*xformL33) + xformL13*((csetemp62 + csetemp63 + csetemp64 + \n+ csetemp65)*xformL03 + (csetemp74 + csetemp75 + csetemp76 + \n+ csetemp77)*xformL13 + (csetemp78 + csetemp79 + csetemp80 + \n+ csetemp81)*xformL23 + (csetemp82 + csetemp83 + csetemp84 + \n+ csetemp85)*xformL33) + xformL23*((csetemp66 + csetemp67 + csetemp68 + \n+ csetemp69)*xformL03 + (csetemp78 + csetemp79 + csetemp80 + \n+ csetemp81)*xformL13 + (csetemp86 + csetemp87 + csetemp88 + \n+ csetemp89)*xformL23 + (csetemp90 + csetemp91 + csetemp92 + \n+ csetemp93)*xformL33) + xformL33*((csetemp70 + csetemp71 + csetemp72 + \n+ csetemp73)*xformL03 + (csetemp82 + csetemp83 + csetemp84 + \n+ csetemp85)*xformL13 + (csetemp90 + csetemp91 + csetemp92 + \n+ csetemp93)*xformL23 + (csetemp94 + csetemp95 + csetemp96 + \n+ csetemp97)*xformL33);\n+ \n+ CCTK_REAL dg4331 CCTK_ATTRIBUTE_UNUSED = xformL03*((csetemp100 + \n+ csetemp101 + csetemp98 + csetemp99)*xformL03 + (csetemp102 + csetemp103 \n+ + csetemp104 + csetemp105)*xformL13 + (csetemp106 + csetemp107 + \n+ csetemp108 + csetemp109)*xformL23 + (csetemp110 + csetemp111 + \n+ csetemp112 + csetemp113)*xformL33) + xformL13*((csetemp102 + csetemp103 \n+ + csetemp104 + csetemp105)*xformL03 + (csetemp114 + csetemp115 + \n+ csetemp116 + csetemp117)*xformL13 + (csetemp118 + csetemp119 + \n+ csetemp120 + csetemp121)*xformL23 + (csetemp122 + csetemp123 + \n+ csetemp124 + csetemp125)*xformL33) + xformL23*((csetemp106 + csetemp107 \n+ + csetemp108 + csetemp109)*xformL03 + (csetemp118 + csetemp119 + \n+ csetemp120 + csetemp121)*xformL13 + (csetemp126 + csetemp127 + \n+ csetemp128 + csetemp129)*xformL23 + (csetemp130 + csetemp131 + \n+ csetemp132 + csetemp133)*xformL33) + xformL33*((csetemp110 + csetemp111 \n+ + csetemp112 + csetemp113)*xformL03 + (csetemp122 + csetemp123 + \n+ csetemp124 + csetemp125)*xformL13 + (csetemp130 + csetemp131 + \n+ csetemp132 + csetemp133)*xformL23 + (csetemp134 + csetemp135 + \n+ csetemp136 + csetemp137)*xformL33);\n+ \n+ CCTK_REAL dg4332 CCTK_ATTRIBUTE_UNUSED = xformL03*((csetemp138 + \n+ csetemp139 + csetemp140 + csetemp141)*xformL03 + (csetemp142 + \n+ csetemp143 + csetemp144 + csetemp145)*xformL13 + (csetemp146 + \n+ csetemp147 + csetemp148 + csetemp149)*xformL23 + (csetemp150 + \n+ csetemp151 + csetemp152 + csetemp153)*xformL33) + xformL13*((csetemp142 \n+ + csetemp143 + csetemp144 + csetemp145)*xformL03 + (csetemp154 + \n+ csetemp155 + csetemp156 + csetemp157)*xformL13 + (csetemp158 + \n+ csetemp159 + csetemp160 + csetemp161)*xformL23 + (csetemp162 + \n+ csetemp163 + csetemp164 + csetemp165)*xformL33) + xformL23*((csetemp146 \n+ + csetemp147 + csetemp148 + csetemp149)*xformL03 + (csetemp158 + \n+ csetemp159 + csetemp160 + csetemp161)*xformL13 + (csetemp166 + \n+ csetemp167 + csetemp168 + csetemp169)*xformL23 + (csetemp170 + \n+ csetemp171 + csetemp172 + csetemp173)*xformL33) + xformL33*((csetemp150 \n+ + csetemp151 + csetemp152 + csetemp153)*xformL03 + (csetemp162 + \n+ csetemp163 + csetemp164 + csetemp165)*xformL13 + (csetemp170 + \n+ csetemp171 + csetemp172 + csetemp173)*xformL23 + (csetemp174 + \n+ csetemp175 + csetemp176 + csetemp177)*xformL33);\n+ \n+ CCTK_REAL dg4333 CCTK_ATTRIBUTE_UNUSED = xformL03*((csetemp178 + \n+ csetemp179 + csetemp180 + csetemp181)*xformL03 + (csetemp182 + \n+ csetemp183 + csetemp184 + csetemp185)*xformL13 + (csetemp186 + \n+ csetemp187 + csetemp188 + csetemp189)*xformL23 + (csetemp190 + \n+ csetemp191 + csetemp192 + csetemp193)*xformL33) + xformL13*((csetemp182 \n+ + csetemp183 + csetemp184 + csetemp185)*xformL03 + (csetemp194 + \n+ csetemp195 + csetemp196 + csetemp197)*xformL13 + (csetemp198 + \n+ csetemp199 + csetemp200 + csetemp201)*xformL23 + (csetemp202 + \n+ csetemp203 + csetemp204 + csetemp205)*xformL33) + xformL23*((csetemp186 \n+ + csetemp187 + csetemp188 + csetemp189)*xformL03 + (csetemp198 + \n+ csetemp199 + csetemp200 + csetemp201)*xformL13 + (csetemp206 + \n+ csetemp207 + csetemp208 + csetemp209)*xformL23 + (csetemp210 + \n+ csetemp211 + csetemp212 + csetemp213)*xformL33) + xformL33*((csetemp190 \n+ + csetemp191 + csetemp192 + csetemp193)*xformL03 + (csetemp202 + \n+ csetemp203 + csetemp204 + csetemp205)*xformL13 + (csetemp210 + \n+ csetemp211 + csetemp212 + csetemp213)*xformL23 + (csetemp214 + \n+ csetemp215 + csetemp216 + csetemp217)*xformL33);\n+ \n+ CCTK_REAL betal1 CCTK_ATTRIBUTE_UNUSED = g401;\n+ \n+ CCTK_REAL betal2 CCTK_ATTRIBUTE_UNUSED = g402;\n+ \n+ CCTK_REAL betal3 CCTK_ATTRIBUTE_UNUSED = g403;\n+ \n+ gxxL = g411;\n+ \n+ gxyL = g412;\n+ \n+ gxzL = g413;\n+ \n+ gyyL = g422;\n+ \n+ gyzL = g423;\n+ \n+ gzzL = g433;\n+ \n+ CCTK_REAL csetemp218 CCTK_ATTRIBUTE_UNUSED = pow(gxzL,2);\n+ \n+ CCTK_REAL csetemp219 CCTK_ATTRIBUTE_UNUSED = pow(gyzL,2);\n+ \n+ CCTK_REAL csetemp220 CCTK_ATTRIBUTE_UNUSED = pow(gxyL,2);\n+ \n+ CCTK_REAL detg CCTK_ATTRIBUTE_UNUSED = 2*gxyL*gxzL*gyzL + \n+ gyyL*(gxxL*gzzL - csetemp218) - gxxL*csetemp219 - gzzL*csetemp220;\n+ \n+ CCTK_REAL csetemp221 CCTK_ATTRIBUTE_UNUSED = pow(detg,-1);\n+ \n+ CCTK_REAL gu11 CCTK_ATTRIBUTE_UNUSED = (gyyL*gzzL - \n+ csetemp219)*csetemp221;\n+ \n+ CCTK_REAL gu12 CCTK_ATTRIBUTE_UNUSED = (gxzL*gyzL - \n+ gxyL*gzzL)*csetemp221;\n+ \n+ CCTK_REAL gu13 CCTK_ATTRIBUTE_UNUSED = (-(gxzL*gyyL) + \n+ gxyL*gyzL)*csetemp221;\n+ \n+ CCTK_REAL gu22 CCTK_ATTRIBUTE_UNUSED = (gxxL*gzzL - \n+ csetemp218)*csetemp221;\n+ \n+ CCTK_REAL gu23 CCTK_ATTRIBUTE_UNUSED = (gxyL*gxzL - \n+ gxxL*gyzL)*csetemp221;\n+ \n+ CCTK_REAL gu33 CCTK_ATTRIBUTE_UNUSED = (gxxL*gyyL - \n+ csetemp220)*csetemp221;\n+ \n+ betaxL = betal1*gu11 + betal2*gu12 + betal3*gu13;\n+ \n+ betayL = betal1*gu12 + betal2*gu22 + betal3*gu23;\n+ \n+ betazL = betal1*gu13 + betal2*gu23 + betal3*gu33;\n+ \n+ CCTK_REAL betasq CCTK_ATTRIBUTE_UNUSED = betaxL*betal1 + betayL*betal2 \n+ + betazL*betal3;\n+ \n+ alpL = pow(betasq - g400,0.5);\n+ \n+ CCTK_REAL dtg11 CCTK_ATTRIBUTE_UNUSED = dg4110;\n+ \n+ CCTK_REAL dtg12 CCTK_ATTRIBUTE_UNUSED = dg4120;\n+ \n+ CCTK_REAL dtg13 CCTK_ATTRIBUTE_UNUSED = dg4130;\n+ \n+ CCTK_REAL dtg22 CCTK_ATTRIBUTE_UNUSED = dg4220;\n+ \n+ CCTK_REAL dtg23 CCTK_ATTRIBUTE_UNUSED = dg4230;\n+ \n+ CCTK_REAL dtg33 CCTK_ATTRIBUTE_UNUSED = dg4330;\n+ \n+ CCTK_REAL dg111 CCTK_ATTRIBUTE_UNUSED = dg4111;\n+ \n+ CCTK_REAL dg112 CCTK_ATTRIBUTE_UNUSED = dg4112;\n+ \n+ CCTK_REAL dg113 CCTK_ATTRIBUTE_UNUSED = dg4113;\n+ \n+ CCTK_REAL dg121 CCTK_ATTRIBUTE_UNUSED = dg4121;\n+ \n+ CCTK_REAL dg122 CCTK_ATTRIBUTE_UNUSED = dg4122;\n+ \n+ CCTK_REAL dg123 CCTK_ATTRIBUTE_UNUSED = dg4123;\n+ \n+ CCTK_REAL dg131 CCTK_ATTRIBUTE_UNUSED = dg4131;\n+ \n+ CCTK_REAL dg132 CCTK_ATTRIBUTE_UNUSED = dg4132;\n+ \n+ CCTK_REAL dg133 CCTK_ATTRIBUTE_UNUSED = dg4133;\n+ \n+ CCTK_REAL dg221 CCTK_ATTRIBUTE_UNUSED = dg4221;\n+ \n+ CCTK_REAL dg222 CCTK_ATTRIBUTE_UNUSED = dg4222;\n+ \n+ CCTK_REAL dg223 CCTK_ATTRIBUTE_UNUSED = dg4223;\n+ \n+ CCTK_REAL dg231 CCTK_ATTRIBUTE_UNUSED = dg4231;\n+ \n+ CCTK_REAL dg232 CCTK_ATTRIBUTE_UNUSED = dg4232;\n+ \n+ CCTK_REAL dg233 CCTK_ATTRIBUTE_UNUSED = dg4233;\n+ \n+ CCTK_REAL dg331 CCTK_ATTRIBUTE_UNUSED = dg4331;\n+ \n+ CCTK_REAL dg332 CCTK_ATTRIBUTE_UNUSED = dg4332;\n+ \n+ CCTK_REAL dg333 CCTK_ATTRIBUTE_UNUSED = dg4333;\n+ \n+ CCTK_REAL csetemp222 CCTK_ATTRIBUTE_UNUSED = dtg11*gu11;\n+ \n+ CCTK_REAL csetemp223 CCTK_ATTRIBUTE_UNUSED = dtg12*gu12;\n+ \n+ CCTK_REAL csetemp224 CCTK_ATTRIBUTE_UNUSED = dtg13*gu13;\n+ \n+ CCTK_REAL csetemp225 CCTK_ATTRIBUTE_UNUSED = dtg12*gu11;\n+ \n+ CCTK_REAL csetemp226 CCTK_ATTRIBUTE_UNUSED = dtg22*gu12;\n+ \n+ CCTK_REAL csetemp227 CCTK_ATTRIBUTE_UNUSED = dtg23*gu13;\n+ \n+ CCTK_REAL csetemp228 CCTK_ATTRIBUTE_UNUSED = dtg13*gu11;\n+ \n+ CCTK_REAL csetemp229 CCTK_ATTRIBUTE_UNUSED = dtg23*gu12;\n+ \n+ CCTK_REAL csetemp230 CCTK_ATTRIBUTE_UNUSED = dtg33*gu13;\n+ \n+ CCTK_REAL dtgu11 CCTK_ATTRIBUTE_UNUSED = -((csetemp222 + csetemp223 + \n+ csetemp224)*gu11) - (csetemp225 + csetemp226 + csetemp227)*gu12 - \n+ (csetemp228 + csetemp229 + csetemp230)*gu13;\n+ \n+ CCTK_REAL dtgu12 CCTK_ATTRIBUTE_UNUSED = -((csetemp222 + csetemp223 + \n+ csetemp224)*gu12) - (csetemp225 + csetemp226 + csetemp227)*gu22 - \n+ (csetemp228 + csetemp229 + csetemp230)*gu23;\n+ \n+ CCTK_REAL dtgu13 CCTK_ATTRIBUTE_UNUSED = -((csetemp222 + csetemp223 + \n+ csetemp224)*gu13) - (csetemp225 + csetemp226 + csetemp227)*gu23 - \n+ (csetemp228 + csetemp229 + csetemp230)*gu33;\n+ \n+ CCTK_REAL csetemp231 CCTK_ATTRIBUTE_UNUSED = dtg11*gu12;\n+ \n+ CCTK_REAL csetemp232 CCTK_ATTRIBUTE_UNUSED = dtg12*gu22;\n+ \n+ CCTK_REAL csetemp233 CCTK_ATTRIBUTE_UNUSED = dtg13*gu23;\n+ \n+ CCTK_REAL csetemp234 CCTK_ATTRIBUTE_UNUSED = dtg22*gu22;\n+ \n+ CCTK_REAL csetemp235 CCTK_ATTRIBUTE_UNUSED = dtg23*gu23;\n+ \n+ CCTK_REAL csetemp236 CCTK_ATTRIBUTE_UNUSED = dtg13*gu12;\n+ \n+ CCTK_REAL csetemp237 CCTK_ATTRIBUTE_UNUSED = dtg23*gu22;\n+ \n+ CCTK_REAL csetemp238 CCTK_ATTRIBUTE_UNUSED = dtg33*gu23;\n+ \n+ CCTK_REAL dtgu22 CCTK_ATTRIBUTE_UNUSED = -((csetemp231 + csetemp232 + \n+ csetemp233)*gu12) - (csetemp223 + csetemp234 + csetemp235)*gu22 - \n+ (csetemp236 + csetemp237 + csetemp238)*gu23;\n+ \n+ CCTK_REAL dtgu23 CCTK_ATTRIBUTE_UNUSED = -((csetemp231 + csetemp232 + \n+ csetemp233)*gu13) - (csetemp223 + csetemp234 + csetemp235)*gu23 - \n+ (csetemp236 + csetemp237 + csetemp238)*gu33;\n+ \n+ CCTK_REAL dtgu33 CCTK_ATTRIBUTE_UNUSED = -(gu13*(dtg11*gu13 + \n+ dtg12*gu23 + dtg13*gu33)) - gu23*(dtg12*gu13 + dtg22*gu23 + dtg23*gu33) \n+ - gu33*(csetemp224 + csetemp235 + dtg33*gu33);\n+ \n+ CCTK_REAL csetemp239 CCTK_ATTRIBUTE_UNUSED = dg111*gu11;\n+ \n+ CCTK_REAL csetemp240 CCTK_ATTRIBUTE_UNUSED = dg121*gu12;\n+ \n+ CCTK_REAL csetemp241 CCTK_ATTRIBUTE_UNUSED = dg131*gu13;\n+ \n+ CCTK_REAL csetemp242 CCTK_ATTRIBUTE_UNUSED = dg121*gu11;\n+ \n+ CCTK_REAL csetemp243 CCTK_ATTRIBUTE_UNUSED = dg221*gu12;\n+ \n+ CCTK_REAL csetemp244 CCTK_ATTRIBUTE_UNUSED = dg231*gu13;\n+ \n+ CCTK_REAL csetemp245 CCTK_ATTRIBUTE_UNUSED = dg131*gu11;\n+ \n+ CCTK_REAL csetemp246 CCTK_ATTRIBUTE_UNUSED = dg231*gu12;\n+ \n+ CCTK_REAL csetemp247 CCTK_ATTRIBUTE_UNUSED = dg331*gu13;\n+ \n+ CCTK_REAL dgu111 CCTK_ATTRIBUTE_UNUSED = -((csetemp239 + csetemp240 + \n+ csetemp241)*gu11) - (csetemp242 + csetemp243 + csetemp244)*gu12 - \n+ (csetemp245 + csetemp246 + csetemp247)*gu13;\n+ \n+ CCTK_REAL dgu121 CCTK_ATTRIBUTE_UNUSED = -((csetemp239 + csetemp240 + \n+ csetemp241)*gu12) - (csetemp242 + csetemp243 + csetemp244)*gu22 - \n+ (csetemp245 + csetemp246 + csetemp247)*gu23;\n+ \n+ CCTK_REAL dgu131 CCTK_ATTRIBUTE_UNUSED = -((csetemp239 + csetemp240 + \n+ csetemp241)*gu13) - (csetemp242 + csetemp243 + csetemp244)*gu23 - \n+ (csetemp245 + csetemp246 + csetemp247)*gu33;\n+ \n+ CCTK_REAL csetemp248 CCTK_ATTRIBUTE_UNUSED = dg111*gu12;\n+ \n+ CCTK_REAL csetemp249 CCTK_ATTRIBUTE_UNUSED = dg121*gu22;\n+ \n+ CCTK_REAL csetemp250 CCTK_ATTRIBUTE_UNUSED = dg131*gu23;\n+ \n+ CCTK_REAL csetemp251 CCTK_ATTRIBUTE_UNUSED = dg221*gu22;\n+ \n+ CCTK_REAL csetemp252 CCTK_ATTRIBUTE_UNUSED = dg231*gu23;\n+ \n+ CCTK_REAL csetemp253 CCTK_ATTRIBUTE_UNUSED = dg131*gu12;\n+ \n+ CCTK_REAL csetemp254 CCTK_ATTRIBUTE_UNUSED = dg231*gu22;\n+ \n+ CCTK_REAL csetemp255 CCTK_ATTRIBUTE_UNUSED = dg331*gu23;\n+ \n+ CCTK_REAL dgu221 CCTK_ATTRIBUTE_UNUSED = -((csetemp248 + csetemp249 + \n+ csetemp250)*gu12) - (csetemp240 + csetemp251 + csetemp252)*gu22 - \n+ (csetemp253 + csetemp254 + csetemp255)*gu23;\n+ \n+ CCTK_REAL dgu231 CCTK_ATTRIBUTE_UNUSED = -((csetemp248 + csetemp249 + \n+ csetemp250)*gu13) - (csetemp240 + csetemp251 + csetemp252)*gu23 - \n+ (csetemp253 + csetemp254 + csetemp255)*gu33;\n+ \n+ CCTK_REAL dgu331 CCTK_ATTRIBUTE_UNUSED = -(gu13*(dg111*gu13 + \n+ dg121*gu23 + dg131*gu33)) - gu23*(dg121*gu13 + dg221*gu23 + dg231*gu33) \n+ - gu33*(csetemp241 + csetemp252 + dg331*gu33);\n+ \n+ CCTK_REAL csetemp256 CCTK_ATTRIBUTE_UNUSED = dg112*gu11;\n+ \n+ CCTK_REAL csetemp257 CCTK_ATTRIBUTE_UNUSED = dg122*gu12;\n+ \n+ CCTK_REAL csetemp258 CCTK_ATTRIBUTE_UNUSED = dg132*gu13;\n+ \n+ CCTK_REAL csetemp259 CCTK_ATTRIBUTE_UNUSED = dg122*gu11;\n+ \n+ CCTK_REAL csetemp260 CCTK_ATTRIBUTE_UNUSED = dg222*gu12;\n+ \n+ CCTK_REAL csetemp261 CCTK_ATTRIBUTE_UNUSED = dg232*gu13;\n+ \n+ CCTK_REAL csetemp262 CCTK_ATTRIBUTE_UNUSED = dg132*gu11;\n+ \n+ CCTK_REAL csetemp263 CCTK_ATTRIBUTE_UNUSED = dg232*gu12;\n+ \n+ CCTK_REAL csetemp264 CCTK_ATTRIBUTE_UNUSED = dg332*gu13;\n+ \n+ CCTK_REAL dgu112 CCTK_ATTRIBUTE_UNUSED = -((csetemp256 + csetemp257 + \n+ csetemp258)*gu11) - (csetemp259 + csetemp260 + csetemp261)*gu12 - \n+ (csetemp262 + csetemp263 + csetemp264)*gu13;\n+ \n+ CCTK_REAL dgu122 CCTK_ATTRIBUTE_UNUSED = -((csetemp256 + csetemp257 + \n+ csetemp258)*gu12) - (csetemp259 + csetemp260 + csetemp261)*gu22 - \n+ (csetemp262 + csetemp263 + csetemp264)*gu23;\n+ \n+ CCTK_REAL dgu132 CCTK_ATTRIBUTE_UNUSED = -((csetemp256 + csetemp257 + \n+ csetemp258)*gu13) - (csetemp259 + csetemp260 + csetemp261)*gu23 - \n+ (csetemp262 + csetemp263 + csetemp264)*gu33;\n+ \n+ CCTK_REAL csetemp265 CCTK_ATTRIBUTE_UNUSED = dg112*gu12;\n+ \n+ CCTK_REAL csetemp266 CCTK_ATTRIBUTE_UNUSED = dg122*gu22;\n+ \n+ CCTK_REAL csetemp267 CCTK_ATTRIBUTE_UNUSED = dg132*gu23;\n+ \n+ CCTK_REAL csetemp268 CCTK_ATTRIBUTE_UNUSED = dg222*gu22;\n+ \n+ CCTK_REAL csetemp269 CCTK_ATTRIBUTE_UNUSED = dg232*gu23;\n+ \n+ CCTK_REAL csetemp270 CCTK_ATTRIBUTE_UNUSED = dg132*gu12;\n+ \n+ CCTK_REAL csetemp271 CCTK_ATTRIBUTE_UNUSED = dg232*gu22;\n+ \n+ CCTK_REAL csetemp272 CCTK_ATTRIBUTE_UNUSED = dg332*gu23;\n+ \n+ CCTK_REAL dgu222 CCTK_ATTRIBUTE_UNUSED = -((csetemp265 + csetemp266 + \n+ csetemp267)*gu12) - (csetemp257 + csetemp268 + csetemp269)*gu22 - \n+ (csetemp270 + csetemp271 + csetemp272)*gu23;\n+ \n+ CCTK_REAL dgu232 CCTK_ATTRIBUTE_UNUSED = -((csetemp265 + csetemp266 + \n+ csetemp267)*gu13) - (csetemp257 + csetemp268 + csetemp269)*gu23 - \n+ (csetemp270 + csetemp271 + csetemp272)*gu33;\n+ \n+ CCTK_REAL dgu332 CCTK_ATTRIBUTE_UNUSED = -(gu13*(dg112*gu13 + \n+ dg122*gu23 + dg132*gu33)) - gu23*(dg122*gu13 + dg222*gu23 + dg232*gu33) \n+ - gu33*(csetemp258 + csetemp269 + dg332*gu33);\n+ \n+ CCTK_REAL csetemp273 CCTK_ATTRIBUTE_UNUSED = dg113*gu11;\n+ \n+ CCTK_REAL csetemp274 CCTK_ATTRIBUTE_UNUSED = dg123*gu12;\n+ \n+ CCTK_REAL csetemp275 CCTK_ATTRIBUTE_UNUSED = dg133*gu13;\n+ \n+ CCTK_REAL csetemp276 CCTK_ATTRIBUTE_UNUSED = dg123*gu11;\n+ \n+ CCTK_REAL csetemp277 CCTK_ATTRIBUTE_UNUSED = dg223*gu12;\n+ \n+ CCTK_REAL csetemp278 CCTK_ATTRIBUTE_UNUSED = dg233*gu13;\n+ \n+ CCTK_REAL csetemp279 CCTK_ATTRIBUTE_UNUSED = dg133*gu11;\n+ \n+ CCTK_REAL csetemp280 CCTK_ATTRIBUTE_UNUSED = dg233*gu12;\n+ \n+ CCTK_REAL csetemp281 CCTK_ATTRIBUTE_UNUSED = dg333*gu13;\n+ \n+ CCTK_REAL dgu113 CCTK_ATTRIBUTE_UNUSED = -((csetemp273 + csetemp274 + \n+ csetemp275)*gu11) - (csetemp276 + csetemp277 + csetemp278)*gu12 - \n+ (csetemp279 + csetemp280 + csetemp281)*gu13;\n+ \n+ CCTK_REAL dgu123 CCTK_ATTRIBUTE_UNUSED = -((csetemp273 + csetemp274 + \n+ csetemp275)*gu12) - (csetemp276 + csetemp277 + csetemp278)*gu22 - \n+ (csetemp279 + csetemp280 + csetemp281)*gu23;\n+ \n+ CCTK_REAL dgu133 CCTK_ATTRIBUTE_UNUSED = -((csetemp273 + csetemp274 + \n+ csetemp275)*gu13) - (csetemp276 + csetemp277 + csetemp278)*gu23 - \n+ (csetemp279 + csetemp280 + csetemp281)*gu33;\n+ \n+ CCTK_REAL csetemp282 CCTK_ATTRIBUTE_UNUSED = dg113*gu12;\n+ \n+ CCTK_REAL csetemp283 CCTK_ATTRIBUTE_UNUSED = dg123*gu22;\n+ \n+ CCTK_REAL csetemp284 CCTK_ATTRIBUTE_UNUSED = dg133*gu23;\n+ \n+ CCTK_REAL csetemp285 CCTK_ATTRIBUTE_UNUSED = dg223*gu22;\n+ \n+ CCTK_REAL csetemp286 CCTK_ATTRIBUTE_UNUSED = dg233*gu23;\n+ \n+ CCTK_REAL csetemp287 CCTK_ATTRIBUTE_UNUSED = dg133*gu12;\n+ \n+ CCTK_REAL csetemp288 CCTK_ATTRIBUTE_UNUSED = dg233*gu22;\n+ \n+ CCTK_REAL csetemp289 CCTK_ATTRIBUTE_UNUSED = dg333*gu23;\n+ \n+ CCTK_REAL dgu223 CCTK_ATTRIBUTE_UNUSED = -((csetemp282 + csetemp283 + \n+ csetemp284)*gu12) - (csetemp274 + csetemp285 + csetemp286)*gu22 - \n+ (csetemp287 + csetemp288 + csetemp289)*gu23;\n+ \n+ CCTK_REAL dgu233 CCTK_ATTRIBUTE_UNUSED = -((csetemp282 + csetemp283 + \n+ csetemp284)*gu13) - (csetemp274 + csetemp285 + csetemp286)*gu23 - \n+ (csetemp287 + csetemp288 + csetemp289)*gu33;\n+ \n+ CCTK_REAL dgu333 CCTK_ATTRIBUTE_UNUSED = -(gu13*(dg113*gu13 + \n+ dg123*gu23 + dg133*gu33)) - gu23*(dg123*gu13 + dg223*gu23 + dg233*gu33) \n+ - gu33*(csetemp275 + csetemp286 + dg333*gu33);\n+ \n+ CCTK_REAL dtbetal1 CCTK_ATTRIBUTE_UNUSED = dg4010;\n+ \n+ CCTK_REAL dtbetal2 CCTK_ATTRIBUTE_UNUSED = dg4020;\n+ \n+ CCTK_REAL dtbetal3 CCTK_ATTRIBUTE_UNUSED = dg4030;\n+ \n+ CCTK_REAL dbetal11 CCTK_ATTRIBUTE_UNUSED = dg4011;\n+ \n+ CCTK_REAL dbetal12 CCTK_ATTRIBUTE_UNUSED = dg4012;\n+ \n+ CCTK_REAL dbetal13 CCTK_ATTRIBUTE_UNUSED = dg4013;\n+ \n+ CCTK_REAL dbetal21 CCTK_ATTRIBUTE_UNUSED = dg4021;\n+ \n+ CCTK_REAL dbetal22 CCTK_ATTRIBUTE_UNUSED = dg4022;\n+ \n+ CCTK_REAL dbetal23 CCTK_ATTRIBUTE_UNUSED = dg4023;\n+ \n+ CCTK_REAL dbetal31 CCTK_ATTRIBUTE_UNUSED = dg4031;\n+ \n+ CCTK_REAL dbetal32 CCTK_ATTRIBUTE_UNUSED = dg4032;\n+ \n+ CCTK_REAL dbetal33 CCTK_ATTRIBUTE_UNUSED = dg4033;\n+ \n+ dtbetaxL = betal1*dtgu11 + betal2*dtgu12 + betal3*dtgu13 + \n+ dtbetal1*gu11 + dtbetal2*gu12 + dtbetal3*gu13;\n+ \n+ dtbetayL = betal1*dtgu12 + betal2*dtgu22 + betal3*dtgu23 + \n+ dtbetal1*gu12 + dtbetal2*gu22 + dtbetal3*gu23;\n+ \n+ dtbetazL = betal1*dtgu13 + betal2*dtgu23 + betal3*dtgu33 + \n+ dtbetal1*gu13 + dtbetal2*gu23 + dtbetal3*gu33;\n+ \n+ CCTK_REAL dbeta11 CCTK_ATTRIBUTE_UNUSED = betal1*dgu111 + \n+ betal2*dgu121 + betal3*dgu131 + dbetal11*gu11 + dbetal21*gu12 + \n+ dbetal31*gu13;\n+ \n+ CCTK_REAL dbeta21 CCTK_ATTRIBUTE_UNUSED = betal1*dgu121 + \n+ betal2*dgu221 + betal3*dgu231 + dbetal11*gu12 + dbetal21*gu22 + \n+ dbetal31*gu23;\n+ \n+ CCTK_REAL dbeta31 CCTK_ATTRIBUTE_UNUSED = betal1*dgu131 + \n+ betal2*dgu231 + betal3*dgu331 + dbetal11*gu13 + dbetal21*gu23 + \n+ dbetal31*gu33;\n+ \n+ CCTK_REAL dbeta12 CCTK_ATTRIBUTE_UNUSED = betal1*dgu112 + \n+ betal2*dgu122 + betal3*dgu132 + dbetal12*gu11 + dbetal22*gu12 + \n+ dbetal32*gu13;\n+ \n+ CCTK_REAL dbeta22 CCTK_ATTRIBUTE_UNUSED = betal1*dgu122 + \n+ betal2*dgu222 + betal3*dgu232 + dbetal12*gu12 + dbetal22*gu22 + \n+ dbetal32*gu23;\n+ \n+ CCTK_REAL dbeta32 CCTK_ATTRIBUTE_UNUSED = betal1*dgu132 + \n+ betal2*dgu232 + betal3*dgu332 + dbetal12*gu13 + dbetal22*gu23 + \n+ dbetal32*gu33;\n+ \n+ CCTK_REAL dbeta13 CCTK_ATTRIBUTE_UNUSED = betal1*dgu113 + \n+ betal2*dgu123 + betal3*dgu133 + dbetal13*gu11 + dbetal23*gu12 + \n+ dbetal33*gu13;\n+ \n+ CCTK_REAL dbeta23 CCTK_ATTRIBUTE_UNUSED = betal1*dgu123 + \n+ betal2*dgu223 + betal3*dgu233 + dbetal13*gu12 + dbetal23*gu22 + \n+ dbetal33*gu23;\n+ \n+ CCTK_REAL dbeta33 CCTK_ATTRIBUTE_UNUSED = betal1*dgu133 + \n+ betal2*dgu233 + betal3*dgu333 + dbetal13*gu13 + dbetal23*gu23 + \n+ dbetal33*gu33;\n+ \n+ CCTK_REAL dtbetasq CCTK_ATTRIBUTE_UNUSED = dtbetaxL*betal1 + \n+ dtbetayL*betal2 + dtbetazL*betal3 + betaxL*dtbetal1 + betayL*dtbetal2 + \n+ betazL*dtbetal3;\n+ \n+ CCTK_REAL csetemp290 CCTK_ATTRIBUTE_UNUSED = pow(alpL,-1);\n+ \n+ CCTK_REAL dtalpL CCTK_ATTRIBUTE_UNUSED = 0.5*csetemp290*(-dg4000 + \n+ dtbetasq);\n+ \n+ CCTK_REAL kxxL CCTK_ATTRIBUTE_UNUSED = 0.5*csetemp290*(2*(gxxL*dbeta11 \n+ + gxyL*dbeta21 + gxzL*dbeta31) + betaxL*dg111 + betayL*dg112 + \n+ betazL*dg113 - dtg11);\n+ \n+ CCTK_REAL kxyL CCTK_ATTRIBUTE_UNUSED = 0.5*csetemp290*(gxxL*dbeta12 + \n+ gyyL*dbeta21 + gxyL*(dbeta11 + dbeta22) + gyzL*dbeta31 + gxzL*dbeta32 + \n+ betaxL*dg121 + betayL*dg122 + betazL*dg123 - dtg12);\n+ \n+ CCTK_REAL kxzL CCTK_ATTRIBUTE_UNUSED = 0.5*csetemp290*(gxxL*dbeta13 + \n+ gyzL*dbeta21 + gxyL*dbeta23 + gzzL*dbeta31 + gxzL*(dbeta11 + dbeta33) + \n+ betaxL*dg131 + betayL*dg132 + betazL*dg133 - dtg13);\n+ \n+ CCTK_REAL kyyL CCTK_ATTRIBUTE_UNUSED = 0.5*csetemp290*(2*(gxyL*dbeta12 \n+ + gyyL*dbeta22 + gyzL*dbeta32) + betaxL*dg221 + betayL*dg222 + \n+ betazL*dg223 - dtg22);\n+ \n+ CCTK_REAL kyzL CCTK_ATTRIBUTE_UNUSED = 0.5*csetemp290*(gxzL*dbeta12 + \n+ gxyL*dbeta13 + gyyL*dbeta23 + gzzL*dbeta32 + gyzL*(dbeta22 + dbeta33) + \n+ betaxL*dg231 + betayL*dg232 + betazL*dg233 - dtg23);\n+ \n+ CCTK_REAL kzzL CCTK_ATTRIBUTE_UNUSED = 0.5*csetemp290*(2*(gxzL*dbeta13 \n+ + gyzL*dbeta23 + gzzL*dbeta33) + betaxL*dg331 + betayL*dg332 + \n+ betazL*dg333 - dtg33);\n+ /* Copy local copies back to grid functions */\n+ alp[index] = alpL;\n+ betax[index] = betaxL;\n+ betay[index] = betayL;\n+ betaz[index] = betazL;\n+ dtalp[index] = dtalpL;\n+ dtbetax[index] = dtbetaxL;\n+ dtbetay[index] = dtbetayL;\n+ dtbetaz[index] = dtbetazL;\n+ gxx[index] = gxxL;\n+ gxy[index] = gxyL;\n+ gxz[index] = gxzL;\n+ gyy[index] = gyyL;\n+ gyz[index] = gyzL;\n+ gzz[index] = gzzL;\n+ kxx[index] = kxxL;\n+ kxy[index] = kxyL;\n+ kxz[index] = kxzL;\n+ kyy[index] = kyyL;\n+ kyz[index] = kyzL;\n+ kzz[index] = kzzL;\n+ }\n+ CCTK_ENDLOOP3(Minkowski_initial);\n+}\n+extern \"C\" void Minkowski_initial(CCTK_ARGUMENTS)\n+{\n+ DECLARE_CCTK_ARGUMENTS;\n+ DECLARE_CCTK_PARAMETERS;\n+ \n+ if (verbose > 1)\n+ {\n+ CCTK_VInfo(CCTK_THORNSTRING,\"Entering Minkowski_initial_Body\");\n+ }\n+ if (cctk_iteration % Minkowski_initial_calc_every != Minkowski_initial_calc_offset)\n+ {\n+ return;\n+ }\n+ \n+ const char* const groups[] = {\n+ \"admbase::curv\",\n+ \"admbase::dtlapse\",\n+ \"admbase::dtshift\",\n+ \"admbase::lapse\",\n+ \"admbase::metric\",\n+ \"admbase::shift\"};\n+ AssertGroupStorage(cctkGH, \"Minkowski_initial\", 6, groups);\n+ \n+ \n+ LoopOverEverything(cctkGH, Minkowski_initial_Body);\n+ if (verbose > 1)\n+ {\n+ CCTK_VInfo(CCTK_THORNSTRING,\"Leaving Minkowski_initial_Body\");\n+ }\n+}\n+\n+} // namespace Minkowski"}, "test": {"test_patch": "diff --git a/all_tests.txt b/all_tests.txt\nnew file mode 100644\nindex 0000000..0000000\n--- /dev/null\n+++ b/all_tests.txt\n@@ -0,0 +1,7 @@\n+GaugeWave\n+KS-tilted-EE\n+KerrSchild\n+Minkowski\n+ModifiedSchwarzschildBL\n+ShiftedGaugeWave\n+Vaidya2", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}26{"question_id": "MSB_einsteintoolkit_Cactus_pr32", "question_type": "multi_swe_bench", "description": "Add missing Minkowski_always.cc in EinsteinExact/Minkowski (einsteintoolkit/Cactus#32)", "content": {"org": "einsteintoolkit", "repo": "Cactus", "pr_number": 32, "issue_title": "Add missing Minkowski_always.cc in EinsteinExact/Minkowski", "issue_body": "This PR adds the missing source file Minkowski_always.cc to complete the EinsteinExact/Minkowski thorn implementation.", "base_commit": "HEAD", "resolved_issues": [{"number": 32, "title": "Implement the full functionality of Minkowski", "body": "Please implement the full functionality of `Minkowski` by finishing the code in `Minkowski_always.cc`.\n\n## Thorn Information:\n- Name: Minkowski\n- Target file: Minkowski_always.cc\n\n## Interface Definition in interface.ccl:\n\n## Schedule Definition in schedule.ccl:\n\n## Parameters Definition in param.ccl:\n\n## Configuration Definition in configuration.ccl:\n\n## Documentation Context in readme.md and doc/documentation.tex\n\n## Related Code Context in src folder\n\n"}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/einsteintoolkit_m_cactus:pr-32", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/arrangements/EinsteinExact/Minkowski/src/Minkowski_always.cc b/arrangements/EinsteinExact/Minkowski/src/Minkowski_always.cc\nnew file mode 100644\nindex 0000000..0000000\n--- /dev/null\n+++ b/arrangements/EinsteinExact/Minkowski/src/Minkowski_always.cc\n@@ -0,0 +1,2021 @@\n+/* File produced by Kranc */\n+\n+#define KRANC_C\n+\n+#include <algorithm>\n+#include <assert.h>\n+#include <math.h>\n+#include <stdio.h>\n+#include <stdlib.h>\n+#include <string.h>\n+#include \"cctk.h\"\n+#include \"cctk_Arguments.h\"\n+#include \"cctk_Parameters.h\"\n+#include \"Kranc.hh\"\n+#include \"Differencing.h\"\n+#include \"loopcontrol.h\"\n+\n+namespace Minkowski {\n+\n+\n+static void Minkowski_always_Body(const cGH* restrict const cctkGH, const int dir, const int face, const CCTK_REAL normal[3], const CCTK_REAL tangentA[3], const CCTK_REAL tangentB[3], const int imin[3], const int imax[3], const int n_subblock_gfs, CCTK_REAL* restrict const subblock_gfs[])\n+{\n+ DECLARE_CCTK_ARGUMENTS;\n+ DECLARE_CCTK_PARAMETERS;\n+ \n+ /* Include user-supplied include files */\n+ /* Initialise finite differencing variables */\n+ const ptrdiff_t di CCTK_ATTRIBUTE_UNUSED = 1;\n+ const ptrdiff_t dj CCTK_ATTRIBUTE_UNUSED = \n+ CCTK_GFINDEX3D(cctkGH,0,1,0) - CCTK_GFINDEX3D(cctkGH,0,0,0);\n+ const ptrdiff_t dk CCTK_ATTRIBUTE_UNUSED = \n+ CCTK_GFINDEX3D(cctkGH,0,0,1) - CCTK_GFINDEX3D(cctkGH,0,0,0);\n+ const ptrdiff_t cdi CCTK_ATTRIBUTE_UNUSED = sizeof(CCTK_REAL) * di;\n+ const ptrdiff_t cdj CCTK_ATTRIBUTE_UNUSED = sizeof(CCTK_REAL) * dj;\n+ const ptrdiff_t cdk CCTK_ATTRIBUTE_UNUSED = sizeof(CCTK_REAL) * dk;\n+ const ptrdiff_t cctkLbnd1 CCTK_ATTRIBUTE_UNUSED = cctk_lbnd[0];\n+ const ptrdiff_t cctkLbnd2 CCTK_ATTRIBUTE_UNUSED = cctk_lbnd[1];\n+ const ptrdiff_t cctkLbnd3 CCTK_ATTRIBUTE_UNUSED = cctk_lbnd[2];\n+ const CCTK_REAL t CCTK_ATTRIBUTE_UNUSED = cctk_time;\n+ const CCTK_REAL cctkOriginSpace1 CCTK_ATTRIBUTE_UNUSED = \n+ CCTK_ORIGIN_SPACE(0);\n+ const CCTK_REAL cctkOriginSpace2 CCTK_ATTRIBUTE_UNUSED = \n+ CCTK_ORIGIN_SPACE(1);\n+ const CCTK_REAL cctkOriginSpace3 CCTK_ATTRIBUTE_UNUSED = \n+ CCTK_ORIGIN_SPACE(2);\n+ const CCTK_REAL dt CCTK_ATTRIBUTE_UNUSED = CCTK_DELTA_TIME;\n+ const CCTK_REAL dx CCTK_ATTRIBUTE_UNUSED = CCTK_DELTA_SPACE(0);\n+ const CCTK_REAL dy CCTK_ATTRIBUTE_UNUSED = CCTK_DELTA_SPACE(1);\n+ const CCTK_REAL dz CCTK_ATTRIBUTE_UNUSED = CCTK_DELTA_SPACE(2);\n+ const CCTK_REAL dxi CCTK_ATTRIBUTE_UNUSED = pow(dx,-1);\n+ const CCTK_REAL dyi CCTK_ATTRIBUTE_UNUSED = pow(dy,-1);\n+ const CCTK_REAL dzi CCTK_ATTRIBUTE_UNUSED = pow(dz,-1);\n+ const CCTK_REAL khalf CCTK_ATTRIBUTE_UNUSED = 0.5;\n+ const CCTK_REAL kthird CCTK_ATTRIBUTE_UNUSED = \n+ 0.333333333333333333333333333333;\n+ const CCTK_REAL ktwothird CCTK_ATTRIBUTE_UNUSED = \n+ 0.666666666666666666666666666667;\n+ const CCTK_REAL kfourthird CCTK_ATTRIBUTE_UNUSED = \n+ 1.33333333333333333333333333333;\n+ const CCTK_REAL hdxi CCTK_ATTRIBUTE_UNUSED = 0.5*dxi;\n+ const CCTK_REAL hdyi CCTK_ATTRIBUTE_UNUSED = 0.5*dyi;\n+ const CCTK_REAL hdzi CCTK_ATTRIBUTE_UNUSED = 0.5*dzi;\n+ /* Initialize predefined quantities */\n+ /* Assign local copies of arrays functions */\n+ \n+ \n+ /* Calculate temporaries and arrays functions */\n+ /* Copy local copies back to grid functions */\n+ /* Loop over the grid points */\n+ const int imin0=imin[0];\n+ const int imin1=imin[1];\n+ const int imin2=imin[2];\n+ const int imax0=imax[0];\n+ const int imax1=imax[1];\n+ const int imax2=imax[2];\n+ #pragma omp parallel\n+ CCTK_LOOP3(Minkowski_always,\n+ i,j,k, imin0,imin1,imin2, imax0,imax1,imax2,\n+ cctk_ash[0],cctk_ash[1],cctk_ash[2])\n+ {\n+ const ptrdiff_t index CCTK_ATTRIBUTE_UNUSED = di*i + dj*j + dk*k;\n+ /* Assign local copies of grid functions */\n+ \n+ CCTK_REAL alpL CCTK_ATTRIBUTE_UNUSED = alp[index];\n+ CCTK_REAL betaxL CCTK_ATTRIBUTE_UNUSED = betax[index];\n+ CCTK_REAL betayL CCTK_ATTRIBUTE_UNUSED = betay[index];\n+ CCTK_REAL betazL CCTK_ATTRIBUTE_UNUSED = betaz[index];\n+ CCTK_REAL dtbetaxL CCTK_ATTRIBUTE_UNUSED = dtbetax[index];\n+ CCTK_REAL dtbetayL CCTK_ATTRIBUTE_UNUSED = dtbetay[index];\n+ CCTK_REAL dtbetazL CCTK_ATTRIBUTE_UNUSED = dtbetaz[index];\n+ CCTK_REAL gxxL CCTK_ATTRIBUTE_UNUSED = gxx[index];\n+ CCTK_REAL gxyL CCTK_ATTRIBUTE_UNUSED = gxy[index];\n+ CCTK_REAL gxzL CCTK_ATTRIBUTE_UNUSED = gxz[index];\n+ CCTK_REAL gyyL CCTK_ATTRIBUTE_UNUSED = gyy[index];\n+ CCTK_REAL gyzL CCTK_ATTRIBUTE_UNUSED = gyz[index];\n+ CCTK_REAL gzzL CCTK_ATTRIBUTE_UNUSED = gzz[index];\n+ \n+ /* Include user supplied include files */\n+ /* Precompute derivatives */\n+ /* Calculate temporaries and grid functions */\n+ CCTK_REAL xform1L00 CCTK_ATTRIBUTE_UNUSED = 1;\n+ \n+ CCTK_REAL xform1L01 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL xform1L02 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL xform1L03 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL xform1L10 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL csetemp0 CCTK_ATTRIBUTE_UNUSED = cos(phi);\n+ \n+ CCTK_REAL csetemp1 CCTK_ATTRIBUTE_UNUSED = cos(psi);\n+ \n+ CCTK_REAL csetemp2 CCTK_ATTRIBUTE_UNUSED = cos(theta);\n+ \n+ CCTK_REAL csetemp3 CCTK_ATTRIBUTE_UNUSED = sin(phi);\n+ \n+ CCTK_REAL csetemp4 CCTK_ATTRIBUTE_UNUSED = sin(psi);\n+ \n+ CCTK_REAL xform1L11 CCTK_ATTRIBUTE_UNUSED = csetemp0*csetemp1 - \n+ csetemp2*csetemp3*csetemp4;\n+ \n+ CCTK_REAL xform1L12 CCTK_ATTRIBUTE_UNUSED = csetemp1*csetemp3 + \n+ csetemp0*csetemp2*csetemp4;\n+ \n+ CCTK_REAL csetemp5 CCTK_ATTRIBUTE_UNUSED = sin(theta);\n+ \n+ CCTK_REAL xform1L13 CCTK_ATTRIBUTE_UNUSED = csetemp4*csetemp5;\n+ \n+ CCTK_REAL xform1L20 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL xform1L21 CCTK_ATTRIBUTE_UNUSED = \n+ -(csetemp1*csetemp2*csetemp3) - csetemp0*csetemp4;\n+ \n+ CCTK_REAL xform1L22 CCTK_ATTRIBUTE_UNUSED = csetemp0*csetemp1*csetemp2 \n+ - csetemp3*csetemp4;\n+ \n+ CCTK_REAL xform1L23 CCTK_ATTRIBUTE_UNUSED = csetemp1*csetemp5;\n+ \n+ CCTK_REAL xform1L30 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL xform1L31 CCTK_ATTRIBUTE_UNUSED = csetemp3*csetemp5;\n+ \n+ CCTK_REAL xform1L32 CCTK_ATTRIBUTE_UNUSED = -(csetemp0*csetemp5);\n+ \n+ CCTK_REAL xform1L33 CCTK_ATTRIBUTE_UNUSED = csetemp2;\n+ \n+ CCTK_REAL csetemp6 CCTK_ATTRIBUTE_UNUSED = pow(boostx,2);\n+ \n+ CCTK_REAL csetemp7 CCTK_ATTRIBUTE_UNUSED = pow(boosty,2);\n+ \n+ CCTK_REAL csetemp8 CCTK_ATTRIBUTE_UNUSED = pow(boostz,2);\n+ \n+ CCTK_REAL csetemp9 CCTK_ATTRIBUTE_UNUSED = pow(lapsefactor,-1);\n+ \n+ CCTK_REAL xform2L00 CCTK_ATTRIBUTE_UNUSED = csetemp9*(-1 + \n+ boostx*shiftaddx + boosty*shiftaddy + boostz*shiftaddz)*(1 - csetemp6 - \n+ csetemp7 - csetemp8 + pow(1 - csetemp6 - csetemp7 - \n+ csetemp8,0.5))*pow(-1 + csetemp6 + csetemp7 + csetemp8,-1)*pow(1 + \n+ pow(1 - csetemp6 - csetemp7 - csetemp8,0.5),-1);\n+ \n+ CCTK_REAL xform2L01 CCTK_ATTRIBUTE_UNUSED = boostx*csetemp9*(1 - \n+ csetemp6 - csetemp7 - csetemp8 + pow(1 - csetemp6 - csetemp7 - \n+ csetemp8,0.5))*pow(-1 + csetemp6 + csetemp7 + csetemp8,-1)*pow(1 + \n+ pow(1 - csetemp6 - csetemp7 - csetemp8,0.5),-1);\n+ \n+ CCTK_REAL xform2L02 CCTK_ATTRIBUTE_UNUSED = boosty*csetemp9*(1 - \n+ csetemp6 - csetemp7 - csetemp8 + pow(1 - csetemp6 - csetemp7 - \n+ csetemp8,0.5))*pow(-1 + csetemp6 + csetemp7 + csetemp8,-1)*pow(1 + \n+ pow(1 - csetemp6 - csetemp7 - csetemp8,0.5),-1);\n+ \n+ CCTK_REAL xform2L03 CCTK_ATTRIBUTE_UNUSED = boostz*csetemp9*(1 - \n+ csetemp6 - csetemp7 - csetemp8 + pow(1 - csetemp6 - csetemp7 - \n+ csetemp8,0.5))*pow(-1 + csetemp6 + csetemp7 + csetemp8,-1)*pow(1 + \n+ pow(1 - csetemp6 - csetemp7 - csetemp8,0.5),-1);\n+ \n+ CCTK_REAL xform2L10 CCTK_ATTRIBUTE_UNUSED = (-(boostx*(-1 + csetemp6 + \n+ csetemp7 + csetemp8 + (-1 + boosty*shiftaddy + boostz*shiftaddz)*pow(1 \n+ - csetemp6 - csetemp7 - csetemp8,0.5))) + shiftaddx*(csetemp6 + (-1 + \n+ csetemp7 + csetemp8)*(1 + pow(1 - csetemp6 - csetemp7 - \n+ csetemp8,0.5))))*pow(-1 + csetemp6 + csetemp7 + csetemp8,-1)*pow(1 + \n+ pow(1 - csetemp6 - csetemp7 - csetemp8,0.5),-1);\n+ \n+ CCTK_REAL xform2L11 CCTK_ATTRIBUTE_UNUSED = (csetemp6 + (-1 + csetemp7 \n+ + csetemp8)*(1 + pow(1 - csetemp6 - csetemp7 - csetemp8,0.5)))*pow(-1 + \n+ csetemp6 + csetemp7 + csetemp8,-1)*pow(1 + pow(1 - csetemp6 - csetemp7 \n+ - csetemp8,0.5),-1);\n+ \n+ CCTK_REAL xform2L12 CCTK_ATTRIBUTE_UNUSED = -(boostx*boosty*pow(-1 + \n+ csetemp6 + csetemp7 + csetemp8 - pow(1 - csetemp6 - csetemp7 - \n+ csetemp8,0.5),-1));\n+ \n+ CCTK_REAL xform2L13 CCTK_ATTRIBUTE_UNUSED = -(boostx*boostz*pow(-1 + \n+ csetemp6 + csetemp7 + csetemp8 - pow(1 - csetemp6 - csetemp7 - \n+ csetemp8,0.5),-1));\n+ \n+ CCTK_REAL xform2L20 CCTK_ATTRIBUTE_UNUSED = (-(boosty*(-1 + csetemp6 + \n+ csetemp7 + csetemp8 + (-1 + boostx*shiftaddx + boostz*shiftaddz)*pow(1 \n+ - csetemp6 - csetemp7 - csetemp8,0.5))) + shiftaddy*(csetemp7 + (-1 + \n+ csetemp6 + csetemp8)*(1 + pow(1 - csetemp6 - csetemp7 - \n+ csetemp8,0.5))))*pow(-1 + csetemp6 + csetemp7 + csetemp8,-1)*pow(1 + \n+ pow(1 - csetemp6 - csetemp7 - csetemp8,0.5),-1);\n+ \n+ CCTK_REAL xform2L21 CCTK_ATTRIBUTE_UNUSED = -(boostx*boosty*pow(-1 + \n+ csetemp6 + csetemp7 + csetemp8 - pow(1 - csetemp6 - csetemp7 - \n+ csetemp8,0.5),-1));\n+ \n+ CCTK_REAL xform2L22 CCTK_ATTRIBUTE_UNUSED = (csetemp7 + (-1 + csetemp6 \n+ + csetemp8)*(1 + pow(1 - csetemp6 - csetemp7 - csetemp8,0.5)))*pow(-1 + \n+ csetemp6 + csetemp7 + csetemp8,-1)*pow(1 + pow(1 - csetemp6 - csetemp7 \n+ - csetemp8,0.5),-1);\n+ \n+ CCTK_REAL xform2L23 CCTK_ATTRIBUTE_UNUSED = -(boosty*boostz*pow(-1 + \n+ csetemp6 + csetemp7 + csetemp8 - pow(1 - csetemp6 - csetemp7 - \n+ csetemp8,0.5),-1));\n+ \n+ CCTK_REAL xform2L30 CCTK_ATTRIBUTE_UNUSED = (shiftaddz*(-1 + csetemp6 \n+ + csetemp7 + csetemp8 + (-1 + csetemp6 + csetemp7)*pow(1 - csetemp6 - \n+ csetemp7 - csetemp8,0.5)) - boostz*(-1 + csetemp6 + csetemp7 + csetemp8 \n+ + (-1 + boostx*shiftaddx + boosty*shiftaddy)*pow(1 - csetemp6 - \n+ csetemp7 - csetemp8,0.5)))*pow(-1 + csetemp6 + csetemp7 + \n+ csetemp8,-1)*pow(1 + pow(1 - csetemp6 - csetemp7 - csetemp8,0.5),-1);\n+ \n+ CCTK_REAL xform2L31 CCTK_ATTRIBUTE_UNUSED = -(boostx*boostz*pow(-1 + \n+ csetemp6 + csetemp7 + csetemp8 - pow(1 - csetemp6 - csetemp7 - \n+ csetemp8,0.5),-1));\n+ \n+ CCTK_REAL xform2L32 CCTK_ATTRIBUTE_UNUSED = -(boosty*boostz*pow(-1 + \n+ csetemp6 + csetemp7 + csetemp8 - pow(1 - csetemp6 - csetemp7 - \n+ csetemp8,0.5),-1));\n+ \n+ CCTK_REAL xform2L33 CCTK_ATTRIBUTE_UNUSED = (-1 + csetemp6 + csetemp7 \n+ + csetemp8 + (-1 + csetemp6 + csetemp7)*pow(1 - csetemp6 - csetemp7 - \n+ csetemp8,0.5))*pow(-1 + csetemp6 + csetemp7 + csetemp8,-1)*pow(1 + \n+ pow(1 - csetemp6 - csetemp7 - csetemp8,0.5),-1);\n+ \n+ CCTK_REAL xformL00 CCTK_ATTRIBUTE_UNUSED = xform1L00*xform2L00 + \n+ xform1L01*xform2L10 + xform1L02*xform2L20 + xform1L03*xform2L30;\n+ \n+ CCTK_REAL xformL01 CCTK_ATTRIBUTE_UNUSED = xform1L00*xform2L01 + \n+ xform1L01*xform2L11 + xform1L02*xform2L21 + xform1L03*xform2L31;\n+ \n+ CCTK_REAL xformL02 CCTK_ATTRIBUTE_UNUSED = xform1L00*xform2L02 + \n+ xform1L01*xform2L12 + xform1L02*xform2L22 + xform1L03*xform2L32;\n+ \n+ CCTK_REAL xformL03 CCTK_ATTRIBUTE_UNUSED = xform1L00*xform2L03 + \n+ xform1L01*xform2L13 + xform1L02*xform2L23 + xform1L03*xform2L33;\n+ \n+ CCTK_REAL xformL10 CCTK_ATTRIBUTE_UNUSED = xform1L10*xform2L00 + \n+ xform1L11*xform2L10 + xform1L12*xform2L20 + xform1L13*xform2L30;\n+ \n+ CCTK_REAL xformL11 CCTK_ATTRIBUTE_UNUSED = xform1L10*xform2L01 + \n+ xform1L11*xform2L11 + xform1L12*xform2L21 + xform1L13*xform2L31;\n+ \n+ CCTK_REAL xformL12 CCTK_ATTRIBUTE_UNUSED = xform1L10*xform2L02 + \n+ xform1L11*xform2L12 + xform1L12*xform2L22 + xform1L13*xform2L32;\n+ \n+ CCTK_REAL xformL13 CCTK_ATTRIBUTE_UNUSED = xform1L10*xform2L03 + \n+ xform1L11*xform2L13 + xform1L12*xform2L23 + xform1L13*xform2L33;\n+ \n+ CCTK_REAL xformL20 CCTK_ATTRIBUTE_UNUSED = xform1L20*xform2L00 + \n+ xform1L21*xform2L10 + xform1L22*xform2L20 + xform1L23*xform2L30;\n+ \n+ CCTK_REAL xformL21 CCTK_ATTRIBUTE_UNUSED = xform1L20*xform2L01 + \n+ xform1L21*xform2L11 + xform1L22*xform2L21 + xform1L23*xform2L31;\n+ \n+ CCTK_REAL xformL22 CCTK_ATTRIBUTE_UNUSED = xform1L20*xform2L02 + \n+ xform1L21*xform2L12 + xform1L22*xform2L22 + xform1L23*xform2L32;\n+ \n+ CCTK_REAL xformL23 CCTK_ATTRIBUTE_UNUSED = xform1L20*xform2L03 + \n+ xform1L21*xform2L13 + xform1L22*xform2L23 + xform1L23*xform2L33;\n+ \n+ CCTK_REAL xformL30 CCTK_ATTRIBUTE_UNUSED = xform1L30*xform2L00 + \n+ xform1L31*xform2L10 + xform1L32*xform2L20 + xform1L33*xform2L30;\n+ \n+ CCTK_REAL xformL31 CCTK_ATTRIBUTE_UNUSED = xform1L30*xform2L01 + \n+ xform1L31*xform2L11 + xform1L32*xform2L21 + xform1L33*xform2L31;\n+ \n+ CCTK_REAL xformL32 CCTK_ATTRIBUTE_UNUSED = xform1L30*xform2L02 + \n+ xform1L31*xform2L12 + xform1L32*xform2L22 + xform1L33*xform2L32;\n+ \n+ CCTK_REAL xformL33 CCTK_ATTRIBUTE_UNUSED = xform1L30*xform2L03 + \n+ xform1L31*xform2L13 + xform1L32*xform2L23 + xform1L33*xform2L33;\n+ \n+ CCTK_REAL tg400 CCTK_ATTRIBUTE_UNUSED = -1;\n+ \n+ CCTK_REAL tg401 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tg402 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tg403 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tg411 CCTK_ATTRIBUTE_UNUSED = 1;\n+ \n+ CCTK_REAL tg412 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tg413 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tg422 CCTK_ATTRIBUTE_UNUSED = 1;\n+ \n+ CCTK_REAL tg423 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tg433 CCTK_ATTRIBUTE_UNUSED = 1;\n+ \n+ CCTK_REAL tdg4000 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tdg4001 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tdg4002 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tdg4003 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tdg4010 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tdg4011 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tdg4012 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tdg4013 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tdg4020 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tdg4021 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tdg4022 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tdg4023 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tdg4030 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tdg4031 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tdg4032 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tdg4033 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tdg4110 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tdg4111 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tdg4112 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tdg4113 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tdg4120 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tdg4121 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tdg4122 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tdg4123 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tdg4130 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tdg4131 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tdg4132 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tdg4133 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tdg4220 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tdg4221 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tdg4222 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tdg4223 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tdg4230 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tdg4231 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tdg4232 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tdg4233 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tdg4330 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tdg4331 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tdg4332 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tdg4333 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL g400 CCTK_ATTRIBUTE_UNUSED = 2*(tg423*xformL20*xformL30 + \n+ xformL00*(tg401*xformL10 + tg402*xformL20 + tg403*xformL30) + \n+ xformL10*(tg412*xformL20 + tg413*xformL30)) + tg400*pow(xformL00,2) + \n+ tg411*pow(xformL10,2) + tg422*pow(xformL20,2) + tg433*pow(xformL30,2);\n+ \n+ CCTK_REAL csetemp10 CCTK_ATTRIBUTE_UNUSED = tg400*xformL01;\n+ \n+ CCTK_REAL csetemp11 CCTK_ATTRIBUTE_UNUSED = tg401*xformL11;\n+ \n+ CCTK_REAL csetemp12 CCTK_ATTRIBUTE_UNUSED = tg402*xformL21;\n+ \n+ CCTK_REAL csetemp13 CCTK_ATTRIBUTE_UNUSED = tg403*xformL31;\n+ \n+ CCTK_REAL csetemp14 CCTK_ATTRIBUTE_UNUSED = tg401*xformL01;\n+ \n+ CCTK_REAL csetemp15 CCTK_ATTRIBUTE_UNUSED = tg411*xformL11;\n+ \n+ CCTK_REAL csetemp16 CCTK_ATTRIBUTE_UNUSED = tg412*xformL21;\n+ \n+ CCTK_REAL csetemp17 CCTK_ATTRIBUTE_UNUSED = tg413*xformL31;\n+ \n+ CCTK_REAL csetemp18 CCTK_ATTRIBUTE_UNUSED = tg402*xformL01;\n+ \n+ CCTK_REAL csetemp19 CCTK_ATTRIBUTE_UNUSED = tg412*xformL11;\n+ \n+ CCTK_REAL csetemp20 CCTK_ATTRIBUTE_UNUSED = tg422*xformL21;\n+ \n+ CCTK_REAL csetemp21 CCTK_ATTRIBUTE_UNUSED = tg423*xformL31;\n+ \n+ CCTK_REAL csetemp22 CCTK_ATTRIBUTE_UNUSED = tg403*xformL01;\n+ \n+ CCTK_REAL csetemp23 CCTK_ATTRIBUTE_UNUSED = tg413*xformL11;\n+ \n+ CCTK_REAL csetemp24 CCTK_ATTRIBUTE_UNUSED = tg423*xformL21;\n+ \n+ CCTK_REAL csetemp25 CCTK_ATTRIBUTE_UNUSED = tg433*xformL31;\n+ \n+ CCTK_REAL g401 CCTK_ATTRIBUTE_UNUSED = (csetemp10 + csetemp11 + \n+ csetemp12 + csetemp13)*xformL00 + (csetemp14 + csetemp15 + csetemp16 + \n+ csetemp17)*xformL10 + (csetemp18 + csetemp19 + csetemp20 + \n+ csetemp21)*xformL20 + (csetemp22 + csetemp23 + csetemp24 + \n+ csetemp25)*xformL30;\n+ \n+ CCTK_REAL csetemp26 CCTK_ATTRIBUTE_UNUSED = tg400*xformL02;\n+ \n+ CCTK_REAL csetemp27 CCTK_ATTRIBUTE_UNUSED = tg401*xformL12;\n+ \n+ CCTK_REAL csetemp28 CCTK_ATTRIBUTE_UNUSED = tg402*xformL22;\n+ \n+ CCTK_REAL csetemp29 CCTK_ATTRIBUTE_UNUSED = tg403*xformL32;\n+ \n+ CCTK_REAL csetemp30 CCTK_ATTRIBUTE_UNUSED = tg401*xformL02;\n+ \n+ CCTK_REAL csetemp31 CCTK_ATTRIBUTE_UNUSED = tg411*xformL12;\n+ \n+ CCTK_REAL csetemp32 CCTK_ATTRIBUTE_UNUSED = tg412*xformL22;\n+ \n+ CCTK_REAL csetemp33 CCTK_ATTRIBUTE_UNUSED = tg413*xformL32;\n+ \n+ CCTK_REAL csetemp34 CCTK_ATTRIBUTE_UNUSED = tg402*xformL02;\n+ \n+ CCTK_REAL csetemp35 CCTK_ATTRIBUTE_UNUSED = tg412*xformL12;\n+ \n+ CCTK_REAL csetemp36 CCTK_ATTRIBUTE_UNUSED = tg422*xformL22;\n+ \n+ CCTK_REAL csetemp37 CCTK_ATTRIBUTE_UNUSED = tg423*xformL32;\n+ \n+ CCTK_REAL csetemp38 CCTK_ATTRIBUTE_UNUSED = tg403*xformL02;\n+ \n+ CCTK_REAL csetemp39 CCTK_ATTRIBUTE_UNUSED = tg413*xformL12;\n+ \n+ CCTK_REAL csetemp40 CCTK_ATTRIBUTE_UNUSED = tg423*xformL22;\n+ \n+ CCTK_REAL csetemp41 CCTK_ATTRIBUTE_UNUSED = tg433*xformL32;\n+ \n+ CCTK_REAL g402 CCTK_ATTRIBUTE_UNUSED = (csetemp26 + csetemp27 + \n+ csetemp28 + csetemp29)*xformL00 + (csetemp30 + csetemp31 + csetemp32 + \n+ csetemp33)*xformL10 + (csetemp34 + csetemp35 + csetemp36 + \n+ csetemp37)*xformL20 + (csetemp38 + csetemp39 + csetemp40 + \n+ csetemp41)*xformL30;\n+ \n+ CCTK_REAL csetemp42 CCTK_ATTRIBUTE_UNUSED = tg400*xformL03;\n+ \n+ CCTK_REAL csetemp43 CCTK_ATTRIBUTE_UNUSED = tg401*xformL13;\n+ \n+ CCTK_REAL csetemp44 CCTK_ATTRIBUTE_UNUSED = tg402*xformL23;\n+ \n+ CCTK_REAL csetemp45 CCTK_ATTRIBUTE_UNUSED = tg403*xformL33;\n+ \n+ CCTK_REAL csetemp46 CCTK_ATTRIBUTE_UNUSED = tg401*xformL03;\n+ \n+ CCTK_REAL csetemp47 CCTK_ATTRIBUTE_UNUSED = tg411*xformL13;\n+ \n+ CCTK_REAL csetemp48 CCTK_ATTRIBUTE_UNUSED = tg412*xformL23;\n+ \n+ CCTK_REAL csetemp49 CCTK_ATTRIBUTE_UNUSED = tg413*xformL33;\n+ \n+ CCTK_REAL csetemp50 CCTK_ATTRIBUTE_UNUSED = tg402*xformL03;\n+ \n+ CCTK_REAL csetemp51 CCTK_ATTRIBUTE_UNUSED = tg412*xformL13;\n+ \n+ CCTK_REAL csetemp52 CCTK_ATTRIBUTE_UNUSED = tg422*xformL23;\n+ \n+ CCTK_REAL csetemp53 CCTK_ATTRIBUTE_UNUSED = tg423*xformL33;\n+ \n+ CCTK_REAL csetemp54 CCTK_ATTRIBUTE_UNUSED = tg403*xformL03;\n+ \n+ CCTK_REAL csetemp55 CCTK_ATTRIBUTE_UNUSED = tg413*xformL13;\n+ \n+ CCTK_REAL csetemp56 CCTK_ATTRIBUTE_UNUSED = tg423*xformL23;\n+ \n+ CCTK_REAL csetemp57 CCTK_ATTRIBUTE_UNUSED = tg433*xformL33;\n+ \n+ CCTK_REAL g403 CCTK_ATTRIBUTE_UNUSED = (csetemp42 + csetemp43 + \n+ csetemp44 + csetemp45)*xformL00 + (csetemp46 + csetemp47 + csetemp48 + \n+ csetemp49)*xformL10 + (csetemp50 + csetemp51 + csetemp52 + \n+ csetemp53)*xformL20 + (csetemp54 + csetemp55 + csetemp56 + \n+ csetemp57)*xformL30;\n+ \n+ CCTK_REAL g411 CCTK_ATTRIBUTE_UNUSED = (csetemp10 + csetemp11 + \n+ csetemp12 + csetemp13)*xformL01 + (csetemp14 + csetemp15 + csetemp16 + \n+ csetemp17)*xformL11 + (csetemp18 + csetemp19 + csetemp20 + \n+ csetemp21)*xformL21 + (csetemp22 + csetemp23 + csetemp24 + \n+ csetemp25)*xformL31;\n+ \n+ CCTK_REAL g412 CCTK_ATTRIBUTE_UNUSED = (csetemp26 + csetemp27 + \n+ csetemp28 + csetemp29)*xformL01 + (csetemp30 + csetemp31 + csetemp32 + \n+ csetemp33)*xformL11 + (csetemp34 + csetemp35 + csetemp36 + \n+ csetemp37)*xformL21 + (csetemp38 + csetemp39 + csetemp40 + \n+ csetemp41)*xformL31;\n+ \n+ CCTK_REAL g413 CCTK_ATTRIBUTE_UNUSED = (csetemp42 + csetemp43 + \n+ csetemp44 + csetemp45)*xformL01 + (csetemp46 + csetemp47 + csetemp48 + \n+ csetemp49)*xformL11 + (csetemp50 + csetemp51 + csetemp52 + \n+ csetemp53)*xformL21 + (csetemp54 + csetemp55 + csetemp56 + \n+ csetemp57)*xformL31;\n+ \n+ CCTK_REAL g422 CCTK_ATTRIBUTE_UNUSED = (csetemp26 + csetemp27 + \n+ csetemp28 + csetemp29)*xformL02 + (csetemp30 + csetemp31 + csetemp32 + \n+ csetemp33)*xformL12 + (csetemp34 + csetemp35 + csetemp36 + \n+ csetemp37)*xformL22 + (csetemp38 + csetemp39 + csetemp40 + \n+ csetemp41)*xformL32;\n+ \n+ CCTK_REAL g423 CCTK_ATTRIBUTE_UNUSED = (csetemp42 + csetemp43 + \n+ csetemp44 + csetemp45)*xformL02 + (csetemp46 + csetemp47 + csetemp48 + \n+ csetemp49)*xformL12 + (csetemp50 + csetemp51 + csetemp52 + \n+ csetemp53)*xformL22 + (csetemp54 + csetemp55 + csetemp56 + \n+ csetemp57)*xformL32;\n+ \n+ CCTK_REAL g433 CCTK_ATTRIBUTE_UNUSED = (csetemp42 + csetemp43 + \n+ csetemp44 + csetemp45)*xformL03 + (csetemp46 + csetemp47 + csetemp48 + \n+ csetemp49)*xformL13 + (csetemp50 + csetemp51 + csetemp52 + \n+ csetemp53)*xformL23 + (csetemp54 + csetemp55 + csetemp56 + \n+ csetemp57)*xformL33;\n+ \n+ CCTK_REAL csetemp58 CCTK_ATTRIBUTE_UNUSED = tdg4000*xformL00;\n+ \n+ CCTK_REAL csetemp59 CCTK_ATTRIBUTE_UNUSED = tdg4001*xformL10;\n+ \n+ CCTK_REAL csetemp60 CCTK_ATTRIBUTE_UNUSED = tdg4002*xformL20;\n+ \n+ CCTK_REAL csetemp61 CCTK_ATTRIBUTE_UNUSED = tdg4003*xformL30;\n+ \n+ CCTK_REAL csetemp62 CCTK_ATTRIBUTE_UNUSED = tdg4010*xformL00;\n+ \n+ CCTK_REAL csetemp63 CCTK_ATTRIBUTE_UNUSED = tdg4011*xformL10;\n+ \n+ CCTK_REAL csetemp64 CCTK_ATTRIBUTE_UNUSED = tdg4012*xformL20;\n+ \n+ CCTK_REAL csetemp65 CCTK_ATTRIBUTE_UNUSED = tdg4013*xformL30;\n+ \n+ CCTK_REAL csetemp66 CCTK_ATTRIBUTE_UNUSED = tdg4020*xformL00;\n+ \n+ CCTK_REAL csetemp67 CCTK_ATTRIBUTE_UNUSED = tdg4021*xformL10;\n+ \n+ CCTK_REAL csetemp68 CCTK_ATTRIBUTE_UNUSED = tdg4022*xformL20;\n+ \n+ CCTK_REAL csetemp69 CCTK_ATTRIBUTE_UNUSED = tdg4023*xformL30;\n+ \n+ CCTK_REAL csetemp70 CCTK_ATTRIBUTE_UNUSED = tdg4030*xformL00;\n+ \n+ CCTK_REAL csetemp71 CCTK_ATTRIBUTE_UNUSED = tdg4031*xformL10;\n+ \n+ CCTK_REAL csetemp72 CCTK_ATTRIBUTE_UNUSED = tdg4032*xformL20;\n+ \n+ CCTK_REAL csetemp73 CCTK_ATTRIBUTE_UNUSED = tdg4033*xformL30;\n+ \n+ CCTK_REAL csetemp74 CCTK_ATTRIBUTE_UNUSED = tdg4110*xformL00;\n+ \n+ CCTK_REAL csetemp75 CCTK_ATTRIBUTE_UNUSED = tdg4111*xformL10;\n+ \n+ CCTK_REAL csetemp76 CCTK_ATTRIBUTE_UNUSED = tdg4112*xformL20;\n+ \n+ CCTK_REAL csetemp77 CCTK_ATTRIBUTE_UNUSED = tdg4113*xformL30;\n+ \n+ CCTK_REAL csetemp78 CCTK_ATTRIBUTE_UNUSED = tdg4120*xformL00;\n+ \n+ CCTK_REAL csetemp79 CCTK_ATTRIBUTE_UNUSED = tdg4121*xformL10;\n+ \n+ CCTK_REAL csetemp80 CCTK_ATTRIBUTE_UNUSED = tdg4122*xformL20;\n+ \n+ CCTK_REAL csetemp81 CCTK_ATTRIBUTE_UNUSED = tdg4123*xformL30;\n+ \n+ CCTK_REAL csetemp82 CCTK_ATTRIBUTE_UNUSED = tdg4130*xformL00;\n+ \n+ CCTK_REAL csetemp83 CCTK_ATTRIBUTE_UNUSED = tdg4131*xformL10;\n+ \n+ CCTK_REAL csetemp84 CCTK_ATTRIBUTE_UNUSED = tdg4132*xformL20;\n+ \n+ CCTK_REAL csetemp85 CCTK_ATTRIBUTE_UNUSED = tdg4133*xformL30;\n+ \n+ CCTK_REAL csetemp86 CCTK_ATTRIBUTE_UNUSED = tdg4220*xformL00;\n+ \n+ CCTK_REAL csetemp87 CCTK_ATTRIBUTE_UNUSED = tdg4221*xformL10;\n+ \n+ CCTK_REAL csetemp88 CCTK_ATTRIBUTE_UNUSED = tdg4222*xformL20;\n+ \n+ CCTK_REAL csetemp89 CCTK_ATTRIBUTE_UNUSED = tdg4223*xformL30;\n+ \n+ CCTK_REAL csetemp90 CCTK_ATTRIBUTE_UNUSED = tdg4230*xformL00;\n+ \n+ CCTK_REAL csetemp91 CCTK_ATTRIBUTE_UNUSED = tdg4231*xformL10;\n+ \n+ CCTK_REAL csetemp92 CCTK_ATTRIBUTE_UNUSED = tdg4232*xformL20;\n+ \n+ CCTK_REAL csetemp93 CCTK_ATTRIBUTE_UNUSED = tdg4233*xformL30;\n+ \n+ CCTK_REAL csetemp94 CCTK_ATTRIBUTE_UNUSED = tdg4330*xformL00;\n+ \n+ CCTK_REAL csetemp95 CCTK_ATTRIBUTE_UNUSED = tdg4331*xformL10;\n+ \n+ CCTK_REAL csetemp96 CCTK_ATTRIBUTE_UNUSED = tdg4332*xformL20;\n+ \n+ CCTK_REAL csetemp97 CCTK_ATTRIBUTE_UNUSED = tdg4333*xformL30;\n+ \n+ CCTK_REAL dg4000 CCTK_ATTRIBUTE_UNUSED = xformL00*((csetemp58 + \n+ csetemp59 + csetemp60 + csetemp61)*xformL00 + (csetemp62 + csetemp63 + \n+ csetemp64 + csetemp65)*xformL10 + (csetemp66 + csetemp67 + csetemp68 + \n+ csetemp69)*xformL20 + (csetemp70 + csetemp71 + csetemp72 + \n+ csetemp73)*xformL30) + xformL10*((csetemp62 + csetemp63 + csetemp64 + \n+ csetemp65)*xformL00 + (csetemp74 + csetemp75 + csetemp76 + \n+ csetemp77)*xformL10 + (csetemp78 + csetemp79 + csetemp80 + \n+ csetemp81)*xformL20 + (csetemp82 + csetemp83 + csetemp84 + \n+ csetemp85)*xformL30) + xformL20*((csetemp66 + csetemp67 + csetemp68 + \n+ csetemp69)*xformL00 + (csetemp78 + csetemp79 + csetemp80 + \n+ csetemp81)*xformL10 + (csetemp86 + csetemp87 + csetemp88 + \n+ csetemp89)*xformL20 + (csetemp90 + csetemp91 + csetemp92 + \n+ csetemp93)*xformL30) + xformL30*((csetemp70 + csetemp71 + csetemp72 + \n+ csetemp73)*xformL00 + (csetemp82 + csetemp83 + csetemp84 + \n+ csetemp85)*xformL10 + (csetemp90 + csetemp91 + csetemp92 + \n+ csetemp93)*xformL20 + (csetemp94 + csetemp95 + csetemp96 + \n+ csetemp97)*xformL30);\n+ \n+ CCTK_REAL dg4010 CCTK_ATTRIBUTE_UNUSED = xformL00*((csetemp58 + \n+ csetemp59 + csetemp60 + csetemp61)*xformL01 + (csetemp62 + csetemp63 + \n+ csetemp64 + csetemp65)*xformL11 + (csetemp66 + csetemp67 + csetemp68 + \n+ csetemp69)*xformL21 + (csetemp70 + csetemp71 + csetemp72 + \n+ csetemp73)*xformL31) + xformL10*((csetemp62 + csetemp63 + csetemp64 + \n+ csetemp65)*xformL01 + (csetemp74 + csetemp75 + csetemp76 + \n+ csetemp77)*xformL11 + (csetemp78 + csetemp79 + csetemp80 + \n+ csetemp81)*xformL21 + (csetemp82 + csetemp83 + csetemp84 + \n+ csetemp85)*xformL31) + xformL20*((csetemp66 + csetemp67 + csetemp68 + \n+ csetemp69)*xformL01 + (csetemp78 + csetemp79 + csetemp80 + \n+ csetemp81)*xformL11 + (csetemp86 + csetemp87 + csetemp88 + \n+ csetemp89)*xformL21 + (csetemp90 + csetemp91 + csetemp92 + \n+ csetemp93)*xformL31) + xformL30*((csetemp70 + csetemp71 + csetemp72 + \n+ csetemp73)*xformL01 + (csetemp82 + csetemp83 + csetemp84 + \n+ csetemp85)*xformL11 + (csetemp90 + csetemp91 + csetemp92 + \n+ csetemp93)*xformL21 + (csetemp94 + csetemp95 + csetemp96 + \n+ csetemp97)*xformL31);\n+ \n+ CCTK_REAL csetemp98 CCTK_ATTRIBUTE_UNUSED = tdg4000*xformL01;\n+ \n+ CCTK_REAL csetemp99 CCTK_ATTRIBUTE_UNUSED = tdg4001*xformL11;\n+ \n+ CCTK_REAL csetemp100 CCTK_ATTRIBUTE_UNUSED = tdg4002*xformL21;\n+ \n+ CCTK_REAL csetemp101 CCTK_ATTRIBUTE_UNUSED = tdg4003*xformL31;\n+ \n+ CCTK_REAL csetemp102 CCTK_ATTRIBUTE_UNUSED = tdg4010*xformL01;\n+ \n+ CCTK_REAL csetemp103 CCTK_ATTRIBUTE_UNUSED = tdg4011*xformL11;\n+ \n+ CCTK_REAL csetemp104 CCTK_ATTRIBUTE_UNUSED = tdg4012*xformL21;\n+ \n+ CCTK_REAL csetemp105 CCTK_ATTRIBUTE_UNUSED = tdg4013*xformL31;\n+ \n+ CCTK_REAL csetemp106 CCTK_ATTRIBUTE_UNUSED = tdg4020*xformL01;\n+ \n+ CCTK_REAL csetemp107 CCTK_ATTRIBUTE_UNUSED = tdg4021*xformL11;\n+ \n+ CCTK_REAL csetemp108 CCTK_ATTRIBUTE_UNUSED = tdg4022*xformL21;\n+ \n+ CCTK_REAL csetemp109 CCTK_ATTRIBUTE_UNUSED = tdg4023*xformL31;\n+ \n+ CCTK_REAL csetemp110 CCTK_ATTRIBUTE_UNUSED = tdg4030*xformL01;\n+ \n+ CCTK_REAL csetemp111 CCTK_ATTRIBUTE_UNUSED = tdg4031*xformL11;\n+ \n+ CCTK_REAL csetemp112 CCTK_ATTRIBUTE_UNUSED = tdg4032*xformL21;\n+ \n+ CCTK_REAL csetemp113 CCTK_ATTRIBUTE_UNUSED = tdg4033*xformL31;\n+ \n+ CCTK_REAL csetemp114 CCTK_ATTRIBUTE_UNUSED = tdg4110*xformL01;\n+ \n+ CCTK_REAL csetemp115 CCTK_ATTRIBUTE_UNUSED = tdg4111*xformL11;\n+ \n+ CCTK_REAL csetemp116 CCTK_ATTRIBUTE_UNUSED = tdg4112*xformL21;\n+ \n+ CCTK_REAL csetemp117 CCTK_ATTRIBUTE_UNUSED = tdg4113*xformL31;\n+ \n+ CCTK_REAL csetemp118 CCTK_ATTRIBUTE_UNUSED = tdg4120*xformL01;\n+ \n+ CCTK_REAL csetemp119 CCTK_ATTRIBUTE_UNUSED = tdg4121*xformL11;\n+ \n+ CCTK_REAL csetemp120 CCTK_ATTRIBUTE_UNUSED = tdg4122*xformL21;\n+ \n+ CCTK_REAL csetemp121 CCTK_ATTRIBUTE_UNUSED = tdg4123*xformL31;\n+ \n+ CCTK_REAL csetemp122 CCTK_ATTRIBUTE_UNUSED = tdg4130*xformL01;\n+ \n+ CCTK_REAL csetemp123 CCTK_ATTRIBUTE_UNUSED = tdg4131*xformL11;\n+ \n+ CCTK_REAL csetemp124 CCTK_ATTRIBUTE_UNUSED = tdg4132*xformL21;\n+ \n+ CCTK_REAL csetemp125 CCTK_ATTRIBUTE_UNUSED = tdg4133*xformL31;\n+ \n+ CCTK_REAL csetemp126 CCTK_ATTRIBUTE_UNUSED = tdg4220*xformL01;\n+ \n+ CCTK_REAL csetemp127 CCTK_ATTRIBUTE_UNUSED = tdg4221*xformL11;\n+ \n+ CCTK_REAL csetemp128 CCTK_ATTRIBUTE_UNUSED = tdg4222*xformL21;\n+ \n+ CCTK_REAL csetemp129 CCTK_ATTRIBUTE_UNUSED = tdg4223*xformL31;\n+ \n+ CCTK_REAL csetemp130 CCTK_ATTRIBUTE_UNUSED = tdg4230*xformL01;\n+ \n+ CCTK_REAL csetemp131 CCTK_ATTRIBUTE_UNUSED = tdg4231*xformL11;\n+ \n+ CCTK_REAL csetemp132 CCTK_ATTRIBUTE_UNUSED = tdg4232*xformL21;\n+ \n+ CCTK_REAL csetemp133 CCTK_ATTRIBUTE_UNUSED = tdg4233*xformL31;\n+ \n+ CCTK_REAL csetemp134 CCTK_ATTRIBUTE_UNUSED = tdg4330*xformL01;\n+ \n+ CCTK_REAL csetemp135 CCTK_ATTRIBUTE_UNUSED = tdg4331*xformL11;\n+ \n+ CCTK_REAL csetemp136 CCTK_ATTRIBUTE_UNUSED = tdg4332*xformL21;\n+ \n+ CCTK_REAL csetemp137 CCTK_ATTRIBUTE_UNUSED = tdg4333*xformL31;\n+ \n+ CCTK_REAL dg4011 CCTK_ATTRIBUTE_UNUSED = xformL00*((csetemp100 + \n+ csetemp101 + csetemp98 + csetemp99)*xformL01 + (csetemp102 + csetemp103 \n+ + csetemp104 + csetemp105)*xformL11 + (csetemp106 + csetemp107 + \n+ csetemp108 + csetemp109)*xformL21 + (csetemp110 + csetemp111 + \n+ csetemp112 + csetemp113)*xformL31) + xformL10*((csetemp102 + csetemp103 \n+ + csetemp104 + csetemp105)*xformL01 + (csetemp114 + csetemp115 + \n+ csetemp116 + csetemp117)*xformL11 + (csetemp118 + csetemp119 + \n+ csetemp120 + csetemp121)*xformL21 + (csetemp122 + csetemp123 + \n+ csetemp124 + csetemp125)*xformL31) + xformL20*((csetemp106 + csetemp107 \n+ + csetemp108 + csetemp109)*xformL01 + (csetemp118 + csetemp119 + \n+ csetemp120 + csetemp121)*xformL11 + (csetemp126 + csetemp127 + \n+ csetemp128 + csetemp129)*xformL21 + (csetemp130 + csetemp131 + \n+ csetemp132 + csetemp133)*xformL31) + xformL30*((csetemp110 + csetemp111 \n+ + csetemp112 + csetemp113)*xformL01 + (csetemp122 + csetemp123 + \n+ csetemp124 + csetemp125)*xformL11 + (csetemp130 + csetemp131 + \n+ csetemp132 + csetemp133)*xformL21 + (csetemp134 + csetemp135 + \n+ csetemp136 + csetemp137)*xformL31);\n+ \n+ CCTK_REAL csetemp138 CCTK_ATTRIBUTE_UNUSED = tdg4000*xformL02;\n+ \n+ CCTK_REAL csetemp139 CCTK_ATTRIBUTE_UNUSED = tdg4001*xformL12;\n+ \n+ CCTK_REAL csetemp140 CCTK_ATTRIBUTE_UNUSED = tdg4002*xformL22;\n+ \n+ CCTK_REAL csetemp141 CCTK_ATTRIBUTE_UNUSED = tdg4003*xformL32;\n+ \n+ CCTK_REAL csetemp142 CCTK_ATTRIBUTE_UNUSED = tdg4010*xformL02;\n+ \n+ CCTK_REAL csetemp143 CCTK_ATTRIBUTE_UNUSED = tdg4011*xformL12;\n+ \n+ CCTK_REAL csetemp144 CCTK_ATTRIBUTE_UNUSED = tdg4012*xformL22;\n+ \n+ CCTK_REAL csetemp145 CCTK_ATTRIBUTE_UNUSED = tdg4013*xformL32;\n+ \n+ CCTK_REAL csetemp146 CCTK_ATTRIBUTE_UNUSED = tdg4020*xformL02;\n+ \n+ CCTK_REAL csetemp147 CCTK_ATTRIBUTE_UNUSED = tdg4021*xformL12;\n+ \n+ CCTK_REAL csetemp148 CCTK_ATTRIBUTE_UNUSED = tdg4022*xformL22;\n+ \n+ CCTK_REAL csetemp149 CCTK_ATTRIBUTE_UNUSED = tdg4023*xformL32;\n+ \n+ CCTK_REAL csetemp150 CCTK_ATTRIBUTE_UNUSED = tdg4030*xformL02;\n+ \n+ CCTK_REAL csetemp151 CCTK_ATTRIBUTE_UNUSED = tdg4031*xformL12;\n+ \n+ CCTK_REAL csetemp152 CCTK_ATTRIBUTE_UNUSED = tdg4032*xformL22;\n+ \n+ CCTK_REAL csetemp153 CCTK_ATTRIBUTE_UNUSED = tdg4033*xformL32;\n+ \n+ CCTK_REAL csetemp154 CCTK_ATTRIBUTE_UNUSED = tdg4110*xformL02;\n+ \n+ CCTK_REAL csetemp155 CCTK_ATTRIBUTE_UNUSED = tdg4111*xformL12;\n+ \n+ CCTK_REAL csetemp156 CCTK_ATTRIBUTE_UNUSED = tdg4112*xformL22;\n+ \n+ CCTK_REAL csetemp157 CCTK_ATTRIBUTE_UNUSED = tdg4113*xformL32;\n+ \n+ CCTK_REAL csetemp158 CCTK_ATTRIBUTE_UNUSED = tdg4120*xformL02;\n+ \n+ CCTK_REAL csetemp159 CCTK_ATTRIBUTE_UNUSED = tdg4121*xformL12;\n+ \n+ CCTK_REAL csetemp160 CCTK_ATTRIBUTE_UNUSED = tdg4122*xformL22;\n+ \n+ CCTK_REAL csetemp161 CCTK_ATTRIBUTE_UNUSED = tdg4123*xformL32;\n+ \n+ CCTK_REAL csetemp162 CCTK_ATTRIBUTE_UNUSED = tdg4130*xformL02;\n+ \n+ CCTK_REAL csetemp163 CCTK_ATTRIBUTE_UNUSED = tdg4131*xformL12;\n+ \n+ CCTK_REAL csetemp164 CCTK_ATTRIBUTE_UNUSED = tdg4132*xformL22;\n+ \n+ CCTK_REAL csetemp165 CCTK_ATTRIBUTE_UNUSED = tdg4133*xformL32;\n+ \n+ CCTK_REAL csetemp166 CCTK_ATTRIBUTE_UNUSED = tdg4220*xformL02;\n+ \n+ CCTK_REAL csetemp167 CCTK_ATTRIBUTE_UNUSED = tdg4221*xformL12;\n+ \n+ CCTK_REAL csetemp168 CCTK_ATTRIBUTE_UNUSED = tdg4222*xformL22;\n+ \n+ CCTK_REAL csetemp169 CCTK_ATTRIBUTE_UNUSED = tdg4223*xformL32;\n+ \n+ CCTK_REAL csetemp170 CCTK_ATTRIBUTE_UNUSED = tdg4230*xformL02;\n+ \n+ CCTK_REAL csetemp171 CCTK_ATTRIBUTE_UNUSED = tdg4231*xformL12;\n+ \n+ CCTK_REAL csetemp172 CCTK_ATTRIBUTE_UNUSED = tdg4232*xformL22;\n+ \n+ CCTK_REAL csetemp173 CCTK_ATTRIBUTE_UNUSED = tdg4233*xformL32;\n+ \n+ CCTK_REAL csetemp174 CCTK_ATTRIBUTE_UNUSED = tdg4330*xformL02;\n+ \n+ CCTK_REAL csetemp175 CCTK_ATTRIBUTE_UNUSED = tdg4331*xformL12;\n+ \n+ CCTK_REAL csetemp176 CCTK_ATTRIBUTE_UNUSED = tdg4332*xformL22;\n+ \n+ CCTK_REAL csetemp177 CCTK_ATTRIBUTE_UNUSED = tdg4333*xformL32;\n+ \n+ CCTK_REAL dg4012 CCTK_ATTRIBUTE_UNUSED = xformL00*((csetemp138 + \n+ csetemp139 + csetemp140 + csetemp141)*xformL01 + (csetemp142 + \n+ csetemp143 + csetemp144 + csetemp145)*xformL11 + (csetemp146 + \n+ csetemp147 + csetemp148 + csetemp149)*xformL21 + (csetemp150 + \n+ csetemp151 + csetemp152 + csetemp153)*xformL31) + xformL10*((csetemp142 \n+ + csetemp143 + csetemp144 + csetemp145)*xformL01 + (csetemp154 + \n+ csetemp155 + csetemp156 + csetemp157)*xformL11 + (csetemp158 + \n+ csetemp159 + csetemp160 + csetemp161)*xformL21 + (csetemp162 + \n+ csetemp163 + csetemp164 + csetemp165)*xformL31) + xformL20*((csetemp146 \n+ + csetemp147 + csetemp148 + csetemp149)*xformL01 + (csetemp158 + \n+ csetemp159 + csetemp160 + csetemp161)*xformL11 + (csetemp166 + \n+ csetemp167 + csetemp168 + csetemp169)*xformL21 + (csetemp170 + \n+ csetemp171 + csetemp172 + csetemp173)*xformL31) + xformL30*((csetemp150 \n+ + csetemp151 + csetemp152 + csetemp153)*xformL01 + (csetemp162 + \n+ csetemp163 + csetemp164 + csetemp165)*xformL11 + (csetemp170 + \n+ csetemp171 + csetemp172 + csetemp173)*xformL21 + (csetemp174 + \n+ csetemp175 + csetemp176 + csetemp177)*xformL31);\n+ \n+ CCTK_REAL csetemp178 CCTK_ATTRIBUTE_UNUSED = tdg4000*xformL03;\n+ \n+ CCTK_REAL csetemp179 CCTK_ATTRIBUTE_UNUSED = tdg4001*xformL13;\n+ \n+ CCTK_REAL csetemp180 CCTK_ATTRIBUTE_UNUSED = tdg4002*xformL23;\n+ \n+ CCTK_REAL csetemp181 CCTK_ATTRIBUTE_UNUSED = tdg4003*xformL33;\n+ \n+ CCTK_REAL csetemp182 CCTK_ATTRIBUTE_UNUSED = tdg4010*xformL03;\n+ \n+ CCTK_REAL csetemp183 CCTK_ATTRIBUTE_UNUSED = tdg4011*xformL13;\n+ \n+ CCTK_REAL csetemp184 CCTK_ATTRIBUTE_UNUSED = tdg4012*xformL23;\n+ \n+ CCTK_REAL csetemp185 CCTK_ATTRIBUTE_UNUSED = tdg4013*xformL33;\n+ \n+ CCTK_REAL csetemp186 CCTK_ATTRIBUTE_UNUSED = tdg4020*xformL03;\n+ \n+ CCTK_REAL csetemp187 CCTK_ATTRIBUTE_UNUSED = tdg4021*xformL13;\n+ \n+ CCTK_REAL csetemp188 CCTK_ATTRIBUTE_UNUSED = tdg4022*xformL23;\n+ \n+ CCTK_REAL csetemp189 CCTK_ATTRIBUTE_UNUSED = tdg4023*xformL33;\n+ \n+ CCTK_REAL csetemp190 CCTK_ATTRIBUTE_UNUSED = tdg4030*xformL03;\n+ \n+ CCTK_REAL csetemp191 CCTK_ATTRIBUTE_UNUSED = tdg4031*xformL13;\n+ \n+ CCTK_REAL csetemp192 CCTK_ATTRIBUTE_UNUSED = tdg4032*xformL23;\n+ \n+ CCTK_REAL csetemp193 CCTK_ATTRIBUTE_UNUSED = tdg4033*xformL33;\n+ \n+ CCTK_REAL csetemp194 CCTK_ATTRIBUTE_UNUSED = tdg4110*xformL03;\n+ \n+ CCTK_REAL csetemp195 CCTK_ATTRIBUTE_UNUSED = tdg4111*xformL13;\n+ \n+ CCTK_REAL csetemp196 CCTK_ATTRIBUTE_UNUSED = tdg4112*xformL23;\n+ \n+ CCTK_REAL csetemp197 CCTK_ATTRIBUTE_UNUSED = tdg4113*xformL33;\n+ \n+ CCTK_REAL csetemp198 CCTK_ATTRIBUTE_UNUSED = tdg4120*xformL03;\n+ \n+ CCTK_REAL csetemp199 CCTK_ATTRIBUTE_UNUSED = tdg4121*xformL13;\n+ \n+ CCTK_REAL csetemp200 CCTK_ATTRIBUTE_UNUSED = tdg4122*xformL23;\n+ \n+ CCTK_REAL csetemp201 CCTK_ATTRIBUTE_UNUSED = tdg4123*xformL33;\n+ \n+ CCTK_REAL csetemp202 CCTK_ATTRIBUTE_UNUSED = tdg4130*xformL03;\n+ \n+ CCTK_REAL csetemp203 CCTK_ATTRIBUTE_UNUSED = tdg4131*xformL13;\n+ \n+ CCTK_REAL csetemp204 CCTK_ATTRIBUTE_UNUSED = tdg4132*xformL23;\n+ \n+ CCTK_REAL csetemp205 CCTK_ATTRIBUTE_UNUSED = tdg4133*xformL33;\n+ \n+ CCTK_REAL csetemp206 CCTK_ATTRIBUTE_UNUSED = tdg4220*xformL03;\n+ \n+ CCTK_REAL csetemp207 CCTK_ATTRIBUTE_UNUSED = tdg4221*xformL13;\n+ \n+ CCTK_REAL csetemp208 CCTK_ATTRIBUTE_UNUSED = tdg4222*xformL23;\n+ \n+ CCTK_REAL csetemp209 CCTK_ATTRIBUTE_UNUSED = tdg4223*xformL33;\n+ \n+ CCTK_REAL csetemp210 CCTK_ATTRIBUTE_UNUSED = tdg4230*xformL03;\n+ \n+ CCTK_REAL csetemp211 CCTK_ATTRIBUTE_UNUSED = tdg4231*xformL13;\n+ \n+ CCTK_REAL csetemp212 CCTK_ATTRIBUTE_UNUSED = tdg4232*xformL23;\n+ \n+ CCTK_REAL csetemp213 CCTK_ATTRIBUTE_UNUSED = tdg4233*xformL33;\n+ \n+ CCTK_REAL csetemp214 CCTK_ATTRIBUTE_UNUSED = tdg4330*xformL03;\n+ \n+ CCTK_REAL csetemp215 CCTK_ATTRIBUTE_UNUSED = tdg4331*xformL13;\n+ \n+ CCTK_REAL csetemp216 CCTK_ATTRIBUTE_UNUSED = tdg4332*xformL23;\n+ \n+ CCTK_REAL csetemp217 CCTK_ATTRIBUTE_UNUSED = tdg4333*xformL33;\n+ \n+ CCTK_REAL dg4013 CCTK_ATTRIBUTE_UNUSED = xformL00*((csetemp178 + \n+ csetemp179 + csetemp180 + csetemp181)*xformL01 + (csetemp182 + \n+ csetemp183 + csetemp184 + csetemp185)*xformL11 + (csetemp186 + \n+ csetemp187 + csetemp188 + csetemp189)*xformL21 + (csetemp190 + \n+ csetemp191 + csetemp192 + csetemp193)*xformL31) + xformL10*((csetemp182 \n+ + csetemp183 + csetemp184 + csetemp185)*xformL01 + (csetemp194 + \n+ csetemp195 + csetemp196 + csetemp197)*xformL11 + (csetemp198 + \n+ csetemp199 + csetemp200 + csetemp201)*xformL21 + (csetemp202 + \n+ csetemp203 + csetemp204 + csetemp205)*xformL31) + xformL20*((csetemp186 \n+ + csetemp187 + csetemp188 + csetemp189)*xformL01 + (csetemp198 + \n+ csetemp199 + csetemp200 + csetemp201)*xformL11 + (csetemp206 + \n+ csetemp207 + csetemp208 + csetemp209)*xformL21 + (csetemp210 + \n+ csetemp211 + csetemp212 + csetemp213)*xformL31) + xformL30*((csetemp190 \n+ + csetemp191 + csetemp192 + csetemp193)*xformL01 + (csetemp202 + \n+ csetemp203 + csetemp204 + csetemp205)*xformL11 + (csetemp210 + \n+ csetemp211 + csetemp212 + csetemp213)*xformL21 + (csetemp214 + \n+ csetemp215 + csetemp216 + csetemp217)*xformL31);\n+ \n+ CCTK_REAL dg4020 CCTK_ATTRIBUTE_UNUSED = xformL00*((csetemp58 + \n+ csetemp59 + csetemp60 + csetemp61)*xformL02 + (csetemp62 + csetemp63 + \n+ csetemp64 + csetemp65)*xformL12 + (csetemp66 + csetemp67 + csetemp68 + \n+ csetemp69)*xformL22 + (csetemp70 + csetemp71 + csetemp72 + \n+ csetemp73)*xformL32) + xformL10*((csetemp62 + csetemp63 + csetemp64 + \n+ csetemp65)*xformL02 + (csetemp74 + csetemp75 + csetemp76 + \n+ csetemp77)*xformL12 + (csetemp78 + csetemp79 + csetemp80 + \n+ csetemp81)*xformL22 + (csetemp82 + csetemp83 + csetemp84 + \n+ csetemp85)*xformL32) + xformL20*((csetemp66 + csetemp67 + csetemp68 + \n+ csetemp69)*xformL02 + (csetemp78 + csetemp79 + csetemp80 + \n+ csetemp81)*xformL12 + (csetemp86 + csetemp87 + csetemp88 + \n+ csetemp89)*xformL22 + (csetemp90 + csetemp91 + csetemp92 + \n+ csetemp93)*xformL32) + xformL30*((csetemp70 + csetemp71 + csetemp72 + \n+ csetemp73)*xformL02 + (csetemp82 + csetemp83 + csetemp84 + \n+ csetemp85)*xformL12 + (csetemp90 + csetemp91 + csetemp92 + \n+ csetemp93)*xformL22 + (csetemp94 + csetemp95 + csetemp96 + \n+ csetemp97)*xformL32);\n+ \n+ CCTK_REAL dg4021 CCTK_ATTRIBUTE_UNUSED = xformL00*((csetemp100 + \n+ csetemp101 + csetemp98 + csetemp99)*xformL02 + (csetemp102 + csetemp103 \n+ + csetemp104 + csetemp105)*xformL12 + (csetemp106 + csetemp107 + \n+ csetemp108 + csetemp109)*xformL22 + (csetemp110 + csetemp111 + \n+ csetemp112 + csetemp113)*xformL32) + xformL10*((csetemp102 + csetemp103 \n+ + csetemp104 + csetemp105)*xformL02 + (csetemp114 + csetemp115 + \n+ csetemp116 + csetemp117)*xformL12 + (csetemp118 + csetemp119 + \n+ csetemp120 + csetemp121)*xformL22 + (csetemp122 + csetemp123 + \n+ csetemp124 + csetemp125)*xformL32) + xformL20*((csetemp106 + csetemp107 \n+ + csetemp108 + csetemp109)*xformL02 + (csetemp118 + csetemp119 + \n+ csetemp120 + csetemp121)*xformL12 + (csetemp126 + csetemp127 + \n+ csetemp128 + csetemp129)*xformL22 + (csetemp130 + csetemp131 + \n+ csetemp132 + csetemp133)*xformL32) + xformL30*((csetemp110 + csetemp111 \n+ + csetemp112 + csetemp113)*xformL02 + (csetemp122 + csetemp123 + \n+ csetemp124 + csetemp125)*xformL12 + (csetemp130 + csetemp131 + \n+ csetemp132 + csetemp133)*xformL22 + (csetemp134 + csetemp135 + \n+ csetemp136 + csetemp137)*xformL32);\n+ \n+ CCTK_REAL dg4022 CCTK_ATTRIBUTE_UNUSED = xformL00*((csetemp138 + \n+ csetemp139 + csetemp140 + csetemp141)*xformL02 + (csetemp142 + \n+ csetemp143 + csetemp144 + csetemp145)*xformL12 + (csetemp146 + \n+ csetemp147 + csetemp148 + csetemp149)*xformL22 + (csetemp150 + \n+ csetemp151 + csetemp152 + csetemp153)*xformL32) + xformL10*((csetemp142 \n+ + csetemp143 + csetemp144 + csetemp145)*xformL02 + (csetemp154 + \n+ csetemp155 + csetemp156 + csetemp157)*xformL12 + (csetemp158 + \n+ csetemp159 + csetemp160 + csetemp161)*xformL22 + (csetemp162 + \n+ csetemp163 + csetemp164 + csetemp165)*xformL32) + xformL20*((csetemp146 \n+ + csetemp147 + csetemp148 + csetemp149)*xformL02 + (csetemp158 + \n+ csetemp159 + csetemp160 + csetemp161)*xformL12 + (csetemp166 + \n+ csetemp167 + csetemp168 + csetemp169)*xformL22 + (csetemp170 + \n+ csetemp171 + csetemp172 + csetemp173)*xformL32) + xformL30*((csetemp150 \n+ + csetemp151 + csetemp152 + csetemp153)*xformL02 + (csetemp162 + \n+ csetemp163 + csetemp164 + csetemp165)*xformL12 + (csetemp170 + \n+ csetemp171 + csetemp172 + csetemp173)*xformL22 + (csetemp174 + \n+ csetemp175 + csetemp176 + csetemp177)*xformL32);\n+ \n+ CCTK_REAL dg4023 CCTK_ATTRIBUTE_UNUSED = xformL00*((csetemp178 + \n+ csetemp179 + csetemp180 + csetemp181)*xformL02 + (csetemp182 + \n+ csetemp183 + csetemp184 + csetemp185)*xformL12 + (csetemp186 + \n+ csetemp187 + csetemp188 + csetemp189)*xformL22 + (csetemp190 + \n+ csetemp191 + csetemp192 + csetemp193)*xformL32) + xformL10*((csetemp182 \n+ + csetemp183 + csetemp184 + csetemp185)*xformL02 + (csetemp194 + \n+ csetemp195 + csetemp196 + csetemp197)*xformL12 + (csetemp198 + \n+ csetemp199 + csetemp200 + csetemp201)*xformL22 + (csetemp202 + \n+ csetemp203 + csetemp204 + csetemp205)*xformL32) + xformL20*((csetemp186 \n+ + csetemp187 + csetemp188 + csetemp189)*xformL02 + (csetemp198 + \n+ csetemp199 + csetemp200 + csetemp201)*xformL12 + (csetemp206 + \n+ csetemp207 + csetemp208 + csetemp209)*xformL22 + (csetemp210 + \n+ csetemp211 + csetemp212 + csetemp213)*xformL32) + xformL30*((csetemp190 \n+ + csetemp191 + csetemp192 + csetemp193)*xformL02 + (csetemp202 + \n+ csetemp203 + csetemp204 + csetemp205)*xformL12 + (csetemp210 + \n+ csetemp211 + csetemp212 + csetemp213)*xformL22 + (csetemp214 + \n+ csetemp215 + csetemp216 + csetemp217)*xformL32);\n+ \n+ CCTK_REAL dg4030 CCTK_ATTRIBUTE_UNUSED = xformL00*((csetemp58 + \n+ csetemp59 + csetemp60 + csetemp61)*xformL03 + (csetemp62 + csetemp63 + \n+ csetemp64 + csetemp65)*xformL13 + (csetemp66 + csetemp67 + csetemp68 + \n+ csetemp69)*xformL23 + (csetemp70 + csetemp71 + csetemp72 + \n+ csetemp73)*xformL33) + xformL10*((csetemp62 + csetemp63 + csetemp64 + \n+ csetemp65)*xformL03 + (csetemp74 + csetemp75 + csetemp76 + \n+ csetemp77)*xformL13 + (csetemp78 + csetemp79 + csetemp80 + \n+ csetemp81)*xformL23 + (csetemp82 + csetemp83 + csetemp84 + \n+ csetemp85)*xformL33) + xformL20*((csetemp66 + csetemp67 + csetemp68 + \n+ csetemp69)*xformL03 + (csetemp78 + csetemp79 + csetemp80 + \n+ csetemp81)*xformL13 + (csetemp86 + csetemp87 + csetemp88 + \n+ csetemp89)*xformL23 + (csetemp90 + csetemp91 + csetemp92 + \n+ csetemp93)*xformL33) + xformL30*((csetemp70 + csetemp71 + csetemp72 + \n+ csetemp73)*xformL03 + (csetemp82 + csetemp83 + csetemp84 + \n+ csetemp85)*xformL13 + (csetemp90 + csetemp91 + csetemp92 + \n+ csetemp93)*xformL23 + (csetemp94 + csetemp95 + csetemp96 + \n+ csetemp97)*xformL33);\n+ \n+ CCTK_REAL dg4031 CCTK_ATTRIBUTE_UNUSED = xformL00*((csetemp100 + \n+ csetemp101 + csetemp98 + csetemp99)*xformL03 + (csetemp102 + csetemp103 \n+ + csetemp104 + csetemp105)*xformL13 + (csetemp106 + csetemp107 + \n+ csetemp108 + csetemp109)*xformL23 + (csetemp110 + csetemp111 + \n+ csetemp112 + csetemp113)*xformL33) + xformL10*((csetemp102 + csetemp103 \n+ + csetemp104 + csetemp105)*xformL03 + (csetemp114 + csetemp115 + \n+ csetemp116 + csetemp117)*xformL13 + (csetemp118 + csetemp119 + \n+ csetemp120 + csetemp121)*xformL23 + (csetemp122 + csetemp123 + \n+ csetemp124 + csetemp125)*xformL33) + xformL20*((csetemp106 + csetemp107 \n+ + csetemp108 + csetemp109)*xformL03 + (csetemp118 + csetemp119 + \n+ csetemp120 + csetemp121)*xformL13 + (csetemp126 + csetemp127 + \n+ csetemp128 + csetemp129)*xformL23 + (csetemp130 + csetemp131 + \n+ csetemp132 + csetemp133)*xformL33) + xformL30*((csetemp110 + csetemp111 \n+ + csetemp112 + csetemp113)*xformL03 + (csetemp122 + csetemp123 + \n+ csetemp124 + csetemp125)*xformL13 + (csetemp130 + csetemp131 + \n+ csetemp132 + csetemp133)*xformL23 + (csetemp134 + csetemp135 + \n+ csetemp136 + csetemp137)*xformL33);\n+ \n+ CCTK_REAL dg4032 CCTK_ATTRIBUTE_UNUSED = xformL00*((csetemp138 + \n+ csetemp139 + csetemp140 + csetemp141)*xformL03 + (csetemp142 + \n+ csetemp143 + csetemp144 + csetemp145)*xformL13 + (csetemp146 + \n+ csetemp147 + csetemp148 + csetemp149)*xformL23 + (csetemp150 + \n+ csetemp151 + csetemp152 + csetemp153)*xformL33) + xformL10*((csetemp142 \n+ + csetemp143 + csetemp144 + csetemp145)*xformL03 + (csetemp154 + \n+ csetemp155 + csetemp156 + csetemp157)*xformL13 + (csetemp158 + \n+ csetemp159 + csetemp160 + csetemp161)*xformL23 + (csetemp162 + \n+ csetemp163 + csetemp164 + csetemp165)*xformL33) + xformL20*((csetemp146 \n+ + csetemp147 + csetemp148 + csetemp149)*xformL03 + (csetemp158 + \n+ csetemp159 + csetemp160 + csetemp161)*xformL13 + (csetemp166 + \n+ csetemp167 + csetemp168 + csetemp169)*xformL23 + (csetemp170 + \n+ csetemp171 + csetemp172 + csetemp173)*xformL33) + xformL30*((csetemp150 \n+ + csetemp151 + csetemp152 + csetemp153)*xformL03 + (csetemp162 + \n+ csetemp163 + csetemp164 + csetemp165)*xformL13 + (csetemp170 + \n+ csetemp171 + csetemp172 + csetemp173)*xformL23 + (csetemp174 + \n+ csetemp175 + csetemp176 + csetemp177)*xformL33);\n+ \n+ CCTK_REAL dg4033 CCTK_ATTRIBUTE_UNUSED = xformL00*((csetemp178 + \n+ csetemp179 + csetemp180 + csetemp181)*xformL03 + (csetemp182 + \n+ csetemp183 + csetemp184 + csetemp185)*xformL13 + (csetemp186 + \n+ csetemp187 + csetemp188 + csetemp189)*xformL23 + (csetemp190 + \n+ csetemp191 + csetemp192 + csetemp193)*xformL33) + xformL10*((csetemp182 \n+ + csetemp183 + csetemp184 + csetemp185)*xformL03 + (csetemp194 + \n+ csetemp195 + csetemp196 + csetemp197)*xformL13 + (csetemp198 + \n+ csetemp199 + csetemp200 + csetemp201)*xformL23 + (csetemp202 + \n+ csetemp203 + csetemp204 + csetemp205)*xformL33) + xformL20*((csetemp186 \n+ + csetemp187 + csetemp188 + csetemp189)*xformL03 + (csetemp198 + \n+ csetemp199 + csetemp200 + csetemp201)*xformL13 + (csetemp206 + \n+ csetemp207 + csetemp208 + csetemp209)*xformL23 + (csetemp210 + \n+ csetemp211 + csetemp212 + csetemp213)*xformL33) + xformL30*((csetemp190 \n+ + csetemp191 + csetemp192 + csetemp193)*xformL03 + (csetemp202 + \n+ csetemp203 + csetemp204 + csetemp205)*xformL13 + (csetemp210 + \n+ csetemp211 + csetemp212 + csetemp213)*xformL23 + (csetemp214 + \n+ csetemp215 + csetemp216 + csetemp217)*xformL33);\n+ \n+ CCTK_REAL dg4110 CCTK_ATTRIBUTE_UNUSED = xformL01*((csetemp58 + \n+ csetemp59 + csetemp60 + csetemp61)*xformL01 + (csetemp62 + csetemp63 + \n+ csetemp64 + csetemp65)*xformL11 + (csetemp66 + csetemp67 + csetemp68 + \n+ csetemp69)*xformL21 + (csetemp70 + csetemp71 + csetemp72 + \n+ csetemp73)*xformL31) + xformL11*((csetemp62 + csetemp63 + csetemp64 + \n+ csetemp65)*xformL01 + (csetemp74 + csetemp75 + csetemp76 + \n+ csetemp77)*xformL11 + (csetemp78 + csetemp79 + csetemp80 + \n+ csetemp81)*xformL21 + (csetemp82 + csetemp83 + csetemp84 + \n+ csetemp85)*xformL31) + xformL21*((csetemp66 + csetemp67 + csetemp68 + \n+ csetemp69)*xformL01 + (csetemp78 + csetemp79 + csetemp80 + \n+ csetemp81)*xformL11 + (csetemp86 + csetemp87 + csetemp88 + \n+ csetemp89)*xformL21 + (csetemp90 + csetemp91 + csetemp92 + \n+ csetemp93)*xformL31) + xformL31*((csetemp70 + csetemp71 + csetemp72 + \n+ csetemp73)*xformL01 + (csetemp82 + csetemp83 + csetemp84 + \n+ csetemp85)*xformL11 + (csetemp90 + csetemp91 + csetemp92 + \n+ csetemp93)*xformL21 + (csetemp94 + csetemp95 + csetemp96 + \n+ csetemp97)*xformL31);\n+ \n+ CCTK_REAL dg4111 CCTK_ATTRIBUTE_UNUSED = xformL01*((csetemp100 + \n+ csetemp101 + csetemp98 + csetemp99)*xformL01 + (csetemp102 + csetemp103 \n+ + csetemp104 + csetemp105)*xformL11 + (csetemp106 + csetemp107 + \n+ csetemp108 + csetemp109)*xformL21 + (csetemp110 + csetemp111 + \n+ csetemp112 + csetemp113)*xformL31) + xformL11*((csetemp102 + csetemp103 \n+ + csetemp104 + csetemp105)*xformL01 + (csetemp114 + csetemp115 + \n+ csetemp116 + csetemp117)*xformL11 + (csetemp118 + csetemp119 + \n+ csetemp120 + csetemp121)*xformL21 + (csetemp122 + csetemp123 + \n+ csetemp124 + csetemp125)*xformL31) + xformL21*((csetemp106 + csetemp107 \n+ + csetemp108 + csetemp109)*xformL01 + (csetemp118 + csetemp119 + \n+ csetemp120 + csetemp121)*xformL11 + (csetemp126 + csetemp127 + \n+ csetemp128 + csetemp129)*xformL21 + (csetemp130 + csetemp131 + \n+ csetemp132 + csetemp133)*xformL31) + xformL31*((csetemp110 + csetemp111 \n+ + csetemp112 + csetemp113)*xformL01 + (csetemp122 + csetemp123 + \n+ csetemp124 + csetemp125)*xformL11 + (csetemp130 + csetemp131 + \n+ csetemp132 + csetemp133)*xformL21 + (csetemp134 + csetemp135 + \n+ csetemp136 + csetemp137)*xformL31);\n+ \n+ CCTK_REAL dg4112 CCTK_ATTRIBUTE_UNUSED = xformL01*((csetemp138 + \n+ csetemp139 + csetemp140 + csetemp141)*xformL01 + (csetemp142 + \n+ csetemp143 + csetemp144 + csetemp145)*xformL11 + (csetemp146 + \n+ csetemp147 + csetemp148 + csetemp149)*xformL21 + (csetemp150 + \n+ csetemp151 + csetemp152 + csetemp153)*xformL31) + xformL11*((csetemp142 \n+ + csetemp143 + csetemp144 + csetemp145)*xformL01 + (csetemp154 + \n+ csetemp155 + csetemp156 + csetemp157)*xformL11 + (csetemp158 + \n+ csetemp159 + csetemp160 + csetemp161)*xformL21 + (csetemp162 + \n+ csetemp163 + csetemp164 + csetemp165)*xformL31) + xformL21*((csetemp146 \n+ + csetemp147 + csetemp148 + csetemp149)*xformL01 + (csetemp158 + \n+ csetemp159 + csetemp160 + csetemp161)*xformL11 + (csetemp166 + \n+ csetemp167 + csetemp168 + csetemp169)*xformL21 + (csetemp170 + \n+ csetemp171 + csetemp172 + csetemp173)*xformL31) + xformL31*((csetemp150 \n+ + csetemp151 + csetemp152 + csetemp153)*xformL01 + (csetemp162 + \n+ csetemp163 + csetemp164 + csetemp165)*xformL11 + (csetemp170 + \n+ csetemp171 + csetemp172 + csetemp173)*xformL21 + (csetemp174 + \n+ csetemp175 + csetemp176 + csetemp177)*xformL31);\n+ \n+ CCTK_REAL dg4113 CCTK_ATTRIBUTE_UNUSED = xformL01*((csetemp178 + \n+ csetemp179 + csetemp180 + csetemp181)*xformL01 + (csetemp182 + \n+ csetemp183 + csetemp184 + csetemp185)*xformL11 + (csetemp186 + \n+ csetemp187 + csetemp188 + csetemp189)*xformL21 + (csetemp190 + \n+ csetemp191 + csetemp192 + csetemp193)*xformL31) + xformL11*((csetemp182 \n+ + csetemp183 + csetemp184 + csetemp185)*xformL01 + (csetemp194 + \n+ csetemp195 + csetemp196 + csetemp197)*xformL11 + (csetemp198 + \n+ csetemp199 + csetemp200 + csetemp201)*xformL21 + (csetemp202 + \n+ csetemp203 + csetemp204 + csetemp205)*xformL31) + xformL21*((csetemp186 \n+ + csetemp187 + csetemp188 + csetemp189)*xformL01 + (csetemp198 + \n+ csetemp199 + csetemp200 + csetemp201)*xformL11 + (csetemp206 + \n+ csetemp207 + csetemp208 + csetemp209)*xformL21 + (csetemp210 + \n+ csetemp211 + csetemp212 + csetemp213)*xformL31) + xformL31*((csetemp190 \n+ + csetemp191 + csetemp192 + csetemp193)*xformL01 + (csetemp202 + \n+ csetemp203 + csetemp204 + csetemp205)*xformL11 + (csetemp210 + \n+ csetemp211 + csetemp212 + csetemp213)*xformL21 + (csetemp214 + \n+ csetemp215 + csetemp216 + csetemp217)*xformL31);\n+ \n+ CCTK_REAL dg4120 CCTK_ATTRIBUTE_UNUSED = xformL01*((csetemp58 + \n+ csetemp59 + csetemp60 + csetemp61)*xformL02 + (csetemp62 + csetemp63 + \n+ csetemp64 + csetemp65)*xformL12 + (csetemp66 + csetemp67 + csetemp68 + \n+ csetemp69)*xformL22 + (csetemp70 + csetemp71 + csetemp72 + \n+ csetemp73)*xformL32) + xformL11*((csetemp62 + csetemp63 + csetemp64 + \n+ csetemp65)*xformL02 + (csetemp74 + csetemp75 + csetemp76 + \n+ csetemp77)*xformL12 + (csetemp78 + csetemp79 + csetemp80 + \n+ csetemp81)*xformL22 + (csetemp82 + csetemp83 + csetemp84 + \n+ csetemp85)*xformL32) + xformL21*((csetemp66 + csetemp67 + csetemp68 + \n+ csetemp69)*xformL02 + (csetemp78 + csetemp79 + csetemp80 + \n+ csetemp81)*xformL12 + (csetemp86 + csetemp87 + csetemp88 + \n+ csetemp89)*xformL22 + (csetemp90 + csetemp91 + csetemp92 + \n+ csetemp93)*xformL32) + xformL31*((csetemp70 + csetemp71 + csetemp72 + \n+ csetemp73)*xformL02 + (csetemp82 + csetemp83 + csetemp84 + \n+ csetemp85)*xformL12 + (csetemp90 + csetemp91 + csetemp92 + \n+ csetemp93)*xformL22 + (csetemp94 + csetemp95 + csetemp96 + \n+ csetemp97)*xformL32);\n+ \n+ CCTK_REAL dg4121 CCTK_ATTRIBUTE_UNUSED = xformL01*((csetemp100 + \n+ csetemp101 + csetemp98 + csetemp99)*xformL02 + (csetemp102 + csetemp103 \n+ + csetemp104 + csetemp105)*xformL12 + (csetemp106 + csetemp107 + \n+ csetemp108 + csetemp109)*xformL22 + (csetemp110 + csetemp111 + \n+ csetemp112 + csetemp113)*xformL32) + xformL11*((csetemp102 + csetemp103 \n+ + csetemp104 + csetemp105)*xformL02 + (csetemp114 + csetemp115 + \n+ csetemp116 + csetemp117)*xformL12 + (csetemp118 + csetemp119 + \n+ csetemp120 + csetemp121)*xformL22 + (csetemp122 + csetemp123 + \n+ csetemp124 + csetemp125)*xformL32) + xformL21*((csetemp106 + csetemp107 \n+ + csetemp108 + csetemp109)*xformL02 + (csetemp118 + csetemp119 + \n+ csetemp120 + csetemp121)*xformL12 + (csetemp126 + csetemp127 + \n+ csetemp128 + csetemp129)*xformL22 + (csetemp130 + csetemp131 + \n+ csetemp132 + csetemp133)*xformL32) + xformL31*((csetemp110 + csetemp111 \n+ + csetemp112 + csetemp113)*xformL02 + (csetemp122 + csetemp123 + \n+ csetemp124 + csetemp125)*xformL12 + (csetemp130 + csetemp131 + \n+ csetemp132 + csetemp133)*xformL22 + (csetemp134 + csetemp135 + \n+ csetemp136 + csetemp137)*xformL32);\n+ \n+ CCTK_REAL dg4122 CCTK_ATTRIBUTE_UNUSED = xformL01*((csetemp138 + \n+ csetemp139 + csetemp140 + csetemp141)*xformL02 + (csetemp142 + \n+ csetemp143 + csetemp144 + csetemp145)*xformL12 + (csetemp146 + \n+ csetemp147 + csetemp148 + csetemp149)*xformL22 + (csetemp150 + \n+ csetemp151 + csetemp152 + csetemp153)*xformL32) + xformL11*((csetemp142 \n+ + csetemp143 + csetemp144 + csetemp145)*xformL02 + (csetemp154 + \n+ csetemp155 + csetemp156 + csetemp157)*xformL12 + (csetemp158 + \n+ csetemp159 + csetemp160 + csetemp161)*xformL22 + (csetemp162 + \n+ csetemp163 + csetemp164 + csetemp165)*xformL32) + xformL21*((csetemp146 \n+ + csetemp147 + csetemp148 + csetemp149)*xformL02 + (csetemp158 + \n+ csetemp159 + csetemp160 + csetemp161)*xformL12 + (csetemp166 + \n+ csetemp167 + csetemp168 + csetemp169)*xformL22 + (csetemp170 + \n+ csetemp171 + csetemp172 + csetemp173)*xformL32) + xformL31*((csetemp150 \n+ + csetemp151 + csetemp152 + csetemp153)*xformL02 + (csetemp162 + \n+ csetemp163 + csetemp164 + csetemp165)*xformL12 + (csetemp170 + \n+ csetemp171 + csetemp172 + csetemp173)*xformL22 + (csetemp174 + \n+ csetemp175 + csetemp176 + csetemp177)*xformL32);\n+ \n+ CCTK_REAL dg4123 CCTK_ATTRIBUTE_UNUSED = xformL01*((csetemp178 + \n+ csetemp179 + csetemp180 + csetemp181)*xformL02 + (csetemp182 + \n+ csetemp183 + csetemp184 + csetemp185)*xformL12 + (csetemp186 + \n+ csetemp187 + csetemp188 + csetemp189)*xformL22 + (csetemp190 + \n+ csetemp191 + csetemp192 + csetemp193)*xformL32) + xformL11*((csetemp182 \n+ + csetemp183 + csetemp184 + csetemp185)*xformL02 + (csetemp194 + \n+ csetemp195 + csetemp196 + csetemp197)*xformL12 + (csetemp198 + \n+ csetemp199 + csetemp200 + csetemp201)*xformL22 + (csetemp202 + \n+ csetemp203 + csetemp204 + csetemp205)*xformL32) + xformL21*((csetemp186 \n+ + csetemp187 + csetemp188 + csetemp189)*xformL02 + (csetemp198 + \n+ csetemp199 + csetemp200 + csetemp201)*xformL12 + (csetemp206 + \n+ csetemp207 + csetemp208 + csetemp209)*xformL22 + (csetemp210 + \n+ csetemp211 + csetemp212 + csetemp213)*xformL32) + xformL31*((csetemp190 \n+ + csetemp191 + csetemp192 + csetemp193)*xformL02 + (csetemp202 + \n+ csetemp203 + csetemp204 + csetemp205)*xformL12 + (csetemp210 + \n+ csetemp211 + csetemp212 + csetemp213)*xformL22 + (csetemp214 + \n+ csetemp215 + csetemp216 + csetemp217)*xformL32);\n+ \n+ CCTK_REAL dg4130 CCTK_ATTRIBUTE_UNUSED = xformL01*((csetemp58 + \n+ csetemp59 + csetemp60 + csetemp61)*xformL03 + (csetemp62 + csetemp63 + \n+ csetemp64 + csetemp65)*xformL13 + (csetemp66 + csetemp67 + csetemp68 + \n+ csetemp69)*xformL23 + (csetemp70 + csetemp71 + csetemp72 + \n+ csetemp73)*xformL33) + xformL11*((csetemp62 + csetemp63 + csetemp64 + \n+ csetemp65)*xformL03 + (csetemp74 + csetemp75 + csetemp76 + \n+ csetemp77)*xformL13 + (csetemp78 + csetemp79 + csetemp80 + \n+ csetemp81)*xformL23 + (csetemp82 + csetemp83 + csetemp84 + \n+ csetemp85)*xformL33) + xformL21*((csetemp66 + csetemp67 + csetemp68 + \n+ csetemp69)*xformL03 + (csetemp78 + csetemp79 + csetemp80 + \n+ csetemp81)*xformL13 + (csetemp86 + csetemp87 + csetemp88 + \n+ csetemp89)*xformL23 + (csetemp90 + csetemp91 + csetemp92 + \n+ csetemp93)*xformL33) + xformL31*((csetemp70 + csetemp71 + csetemp72 + \n+ csetemp73)*xformL03 + (csetemp82 + csetemp83 + csetemp84 + \n+ csetemp85)*xformL13 + (csetemp90 + csetemp91 + csetemp92 + \n+ csetemp93)*xformL23 + (csetemp94 + csetemp95 + csetemp96 + \n+ csetemp97)*xformL33);\n+ \n+ CCTK_REAL dg4131 CCTK_ATTRIBUTE_UNUSED = xformL01*((csetemp100 + \n+ csetemp101 + csetemp98 + csetemp99)*xformL03 + (csetemp102 + csetemp103 \n+ + csetemp104 + csetemp105)*xformL13 + (csetemp106 + csetemp107 + \n+ csetemp108 + csetemp109)*xformL23 + (csetemp110 + csetemp111 + \n+ csetemp112 + csetemp113)*xformL33) + xformL11*((csetemp102 + csetemp103 \n+ + csetemp104 + csetemp105)*xformL03 + (csetemp114 + csetemp115 + \n+ csetemp116 + csetemp117)*xformL13 + (csetemp118 + csetemp119 + \n+ csetemp120 + csetemp121)*xformL23 + (csetemp122 + csetemp123 + \n+ csetemp124 + csetemp125)*xformL33) + xformL21*((csetemp106 + csetemp107 \n+ + csetemp108 + csetemp109)*xformL03 + (csetemp118 + csetemp119 + \n+ csetemp120 + csetemp121)*xformL13 + (csetemp126 + csetemp127 + \n+ csetemp128 + csetemp129)*xformL23 + (csetemp130 + csetemp131 + \n+ csetemp132 + csetemp133)*xformL33) + xformL31*((csetemp110 + csetemp111 \n+ + csetemp112 + csetemp113)*xformL03 + (csetemp122 + csetemp123 + \n+ csetemp124 + csetemp125)*xformL13 + (csetemp130 + csetemp131 + \n+ csetemp132 + csetemp133)*xformL23 + (csetemp134 + csetemp135 + \n+ csetemp136 + csetemp137)*xformL33);\n+ \n+ CCTK_REAL dg4132 CCTK_ATTRIBUTE_UNUSED = xformL01*((csetemp138 + \n+ csetemp139 + csetemp140 + csetemp141)*xformL03 + (csetemp142 + \n+ csetemp143 + csetemp144 + csetemp145)*xformL13 + (csetemp146 + \n+ csetemp147 + csetemp148 + csetemp149)*xformL23 + (csetemp150 + \n+ csetemp151 + csetemp152 + csetemp153)*xformL33) + xformL11*((csetemp142 \n+ + csetemp143 + csetemp144 + csetemp145)*xformL03 + (csetemp154 + \n+ csetemp155 + csetemp156 + csetemp157)*xformL13 + (csetemp158 + \n+ csetemp159 + csetemp160 + csetemp161)*xformL23 + (csetemp162 + \n+ csetemp163 + csetemp164 + csetemp165)*xformL33) + xformL21*((csetemp146 \n+ + csetemp147 + csetemp148 + csetemp149)*xformL03 + (csetemp158 + \n+ csetemp159 + csetemp160 + csetemp161)*xformL13 + (csetemp166 + \n+ csetemp167 + csetemp168 + csetemp169)*xformL23 + (csetemp170 + \n+ csetemp171 + csetemp172 + csetemp173)*xformL33) + xformL31*((csetemp150 \n+ + csetemp151 + csetemp152 + csetemp153)*xformL03 + (csetemp162 + \n+ csetemp163 + csetemp164 + csetemp165)*xformL13 + (csetemp170 + \n+ csetemp171 + csetemp172 + csetemp173)*xformL23 + (csetemp174 + \n+ csetemp175 + csetemp176 + csetemp177)*xformL33);\n+ \n+ CCTK_REAL dg4133 CCTK_ATTRIBUTE_UNUSED = xformL01*((csetemp178 + \n+ csetemp179 + csetemp180 + csetemp181)*xformL03 + (csetemp182 + \n+ csetemp183 + csetemp184 + csetemp185)*xformL13 + (csetemp186 + \n+ csetemp187 + csetemp188 + csetemp189)*xformL23 + (csetemp190 + \n+ csetemp191 + csetemp192 + csetemp193)*xformL33) + xformL11*((csetemp182 \n+ + csetemp183 + csetemp184 + csetemp185)*xformL03 + (csetemp194 + \n+ csetemp195 + csetemp196 + csetemp197)*xformL13 + (csetemp198 + \n+ csetemp199 + csetemp200 + csetemp201)*xformL23 + (csetemp202 + \n+ csetemp203 + csetemp204 + csetemp205)*xformL33) + xformL21*((csetemp186 \n+ + csetemp187 + csetemp188 + csetemp189)*xformL03 + (csetemp198 + \n+ csetemp199 + csetemp200 + csetemp201)*xformL13 + (csetemp206 + \n+ csetemp207 + csetemp208 + csetemp209)*xformL23 + (csetemp210 + \n+ csetemp211 + csetemp212 + csetemp213)*xformL33) + xformL31*((csetemp190 \n+ + csetemp191 + csetemp192 + csetemp193)*xformL03 + (csetemp202 + \n+ csetemp203 + csetemp204 + csetemp205)*xformL13 + (csetemp210 + \n+ csetemp211 + csetemp212 + csetemp213)*xformL23 + (csetemp214 + \n+ csetemp215 + csetemp216 + csetemp217)*xformL33);\n+ \n+ CCTK_REAL dg4220 CCTK_ATTRIBUTE_UNUSED = xformL02*((csetemp58 + \n+ csetemp59 + csetemp60 + csetemp61)*xformL02 + (csetemp62 + csetemp63 + \n+ csetemp64 + csetemp65)*xformL12 + (csetemp66 + csetemp67 + csetemp68 + \n+ csetemp69)*xformL22 + (csetemp70 + csetemp71 + csetemp72 + \n+ csetemp73)*xformL32) + xformL12*((csetemp62 + csetemp63 + csetemp64 + \n+ csetemp65)*xformL02 + (csetemp74 + csetemp75 + csetemp76 + \n+ csetemp77)*xformL12 + (csetemp78 + csetemp79 + csetemp80 + \n+ csetemp81)*xformL22 + (csetemp82 + csetemp83 + csetemp84 + \n+ csetemp85)*xformL32) + xformL22*((csetemp66 + csetemp67 + csetemp68 + \n+ csetemp69)*xformL02 + (csetemp78 + csetemp79 + csetemp80 + \n+ csetemp81)*xformL12 + (csetemp86 + csetemp87 + csetemp88 + \n+ csetemp89)*xformL22 + (csetemp90 + csetemp91 + csetemp92 + \n+ csetemp93)*xformL32) + xformL32*((csetemp70 + csetemp71 + csetemp72 + \n+ csetemp73)*xformL02 + (csetemp82 + csetemp83 + csetemp84 + \n+ csetemp85)*xformL12 + (csetemp90 + csetemp91 + csetemp92 + \n+ csetemp93)*xformL22 + (csetemp94 + csetemp95 + csetemp96 + \n+ csetemp97)*xformL32);\n+ \n+ CCTK_REAL dg4221 CCTK_ATTRIBUTE_UNUSED = xformL02*((csetemp100 + \n+ csetemp101 + csetemp98 + csetemp99)*xformL02 + (csetemp102 + csetemp103 \n+ + csetemp104 + csetemp105)*xformL12 + (csetemp106 + csetemp107 + \n+ csetemp108 + csetemp109)*xformL22 + (csetemp110 + csetemp111 + \n+ csetemp112 + csetemp113)*xformL32) + xformL12*((csetemp102 + csetemp103 \n+ + csetemp104 + csetemp105)*xformL02 + (csetemp114 + csetemp115 + \n+ csetemp116 + csetemp117)*xformL12 + (csetemp118 + csetemp119 + \n+ csetemp120 + csetemp121)*xformL22 + (csetemp122 + csetemp123 + \n+ csetemp124 + csetemp125)*xformL32) + xformL22*((csetemp106 + csetemp107 \n+ + csetemp108 + csetemp109)*xformL02 + (csetemp118 + csetemp119 + \n+ csetemp120 + csetemp121)*xformL12 + (csetemp126 + csetemp127 + \n+ csetemp128 + csetemp129)*xformL22 + (csetemp130 + csetemp131 + \n+ csetemp132 + csetemp133)*xformL32) + xformL32*((csetemp110 + csetemp111 \n+ + csetemp112 + csetemp113)*xformL02 + (csetemp122 + csetemp123 + \n+ csetemp124 + csetemp125)*xformL12 + (csetemp130 + csetemp131 + \n+ csetemp132 + csetemp133)*xformL22 + (csetemp134 + csetemp135 + \n+ csetemp136 + csetemp137)*xformL32);\n+ \n+ CCTK_REAL dg4222 CCTK_ATTRIBUTE_UNUSED = xformL02*((csetemp138 + \n+ csetemp139 + csetemp140 + csetemp141)*xformL02 + (csetemp142 + \n+ csetemp143 + csetemp144 + csetemp145)*xformL12 + (csetemp146 + \n+ csetemp147 + csetemp148 + csetemp149)*xformL22 + (csetemp150 + \n+ csetemp151 + csetemp152 + csetemp153)*xformL32) + xformL12*((csetemp142 \n+ + csetemp143 + csetemp144 + csetemp145)*xformL02 + (csetemp154 + \n+ csetemp155 + csetemp156 + csetemp157)*xformL12 + (csetemp158 + \n+ csetemp159 + csetemp160 + csetemp161)*xformL22 + (csetemp162 + \n+ csetemp163 + csetemp164 + csetemp165)*xformL32) + xformL22*((csetemp146 \n+ + csetemp147 + csetemp148 + csetemp149)*xformL02 + (csetemp158 + \n+ csetemp159 + csetemp160 + csetemp161)*xformL12 + (csetemp166 + \n+ csetemp167 + csetemp168 + csetemp169)*xformL22 + (csetemp170 + \n+ csetemp171 + csetemp172 + csetemp173)*xformL32) + xformL32*((csetemp150 \n+ + csetemp151 + csetemp152 + csetemp153)*xformL02 + (csetemp162 + \n+ csetemp163 + csetemp164 + csetemp165)*xformL12 + (csetemp170 + \n+ csetemp171 + csetemp172 + csetemp173)*xformL22 + (csetemp174 + \n+ csetemp175 + csetemp176 + csetemp177)*xformL32);\n+ \n+ CCTK_REAL dg4223 CCTK_ATTRIBUTE_UNUSED = xformL02*((csetemp178 + \n+ csetemp179 + csetemp180 + csetemp181)*xformL02 + (csetemp182 + \n+ csetemp183 + csetemp184 + csetemp185)*xformL12 + (csetemp186 + \n+ csetemp187 + csetemp188 + csetemp189)*xformL22 + (csetemp190 + \n+ csetemp191 + csetemp192 + csetemp193)*xformL32) + xformL12*((csetemp182 \n+ + csetemp183 + csetemp184 + csetemp185)*xformL02 + (csetemp194 + \n+ csetemp195 + csetemp196 + csetemp197)*xformL12 + (csetemp198 + \n+ csetemp199 + csetemp200 + csetemp201)*xformL22 + (csetemp202 + \n+ csetemp203 + csetemp204 + csetemp205)*xformL32) + xformL22*((csetemp186 \n+ + csetemp187 + csetemp188 + csetemp189)*xformL02 + (csetemp198 + \n+ csetemp199 + csetemp200 + csetemp201)*xformL12 + (csetemp206 + \n+ csetemp207 + csetemp208 + csetemp209)*xformL22 + (csetemp210 + \n+ csetemp211 + csetemp212 + csetemp213)*xformL32) + xformL32*((csetemp190 \n+ + csetemp191 + csetemp192 + csetemp193)*xformL02 + (csetemp202 + \n+ csetemp203 + csetemp204 + csetemp205)*xformL12 + (csetemp210 + \n+ csetemp211 + csetemp212 + csetemp213)*xformL22 + (csetemp214 + \n+ csetemp215 + csetemp216 + csetemp217)*xformL32);\n+ \n+ CCTK_REAL dg4230 CCTK_ATTRIBUTE_UNUSED = xformL02*((csetemp58 + \n+ csetemp59 + csetemp60 + csetemp61)*xformL03 + (csetemp62 + csetemp63 + \n+ csetemp64 + csetemp65)*xformL13 + (csetemp66 + csetemp67 + csetemp68 + \n+ csetemp69)*xformL23 + (csetemp70 + csetemp71 + csetemp72 + \n+ csetemp73)*xformL33) + xformL12*((csetemp62 + csetemp63 + csetemp64 + \n+ csetemp65)*xformL03 + (csetemp74 + csetemp75 + csetemp76 + \n+ csetemp77)*xformL13 + (csetemp78 + csetemp79 + csetemp80 + \n+ csetemp81)*xformL23 + (csetemp82 + csetemp83 + csetemp84 + \n+ csetemp85)*xformL33) + xformL22*((csetemp66 + csetemp67 + csetemp68 + \n+ csetemp69)*xformL03 + (csetemp78 + csetemp79 + csetemp80 + \n+ csetemp81)*xformL13 + (csetemp86 + csetemp87 + csetemp88 + \n+ csetemp89)*xformL23 + (csetemp90 + csetemp91 + csetemp92 + \n+ csetemp93)*xformL33) + xformL32*((csetemp70 + csetemp71 + csetemp72 + \n+ csetemp73)*xformL03 + (csetemp82 + csetemp83 + csetemp84 + \n+ csetemp85)*xformL13 + (csetemp90 + csetemp91 + csetemp92 + \n+ csetemp93)*xformL23 + (csetemp94 + csetemp95 + csetemp96 + \n+ csetemp97)*xformL33);\n+ \n+ CCTK_REAL dg4231 CCTK_ATTRIBUTE_UNUSED = xformL02*((csetemp100 + \n+ csetemp101 + csetemp98 + csetemp99)*xformL03 + (csetemp102 + csetemp103 \n+ + csetemp104 + csetemp105)*xformL13 + (csetemp106 + csetemp107 + \n+ csetemp108 + csetemp109)*xformL23 + (csetemp110 + csetemp111 + \n+ csetemp112 + csetemp113)*xformL33) + xformL12*((csetemp102 + csetemp103 \n+ + csetemp104 + csetemp105)*xformL03 + (csetemp114 + csetemp115 + \n+ csetemp116 + csetemp117)*xformL13 + (csetemp118 + csetemp119 + \n+ csetemp120 + csetemp121)*xformL23 + (csetemp122 + csetemp123 + \n+ csetemp124 + csetemp125)*xformL33) + xformL22*((csetemp106 + csetemp107 \n+ + csetemp108 + csetemp109)*xformL03 + (csetemp118 + csetemp119 + \n+ csetemp120 + csetemp121)*xformL13 + (csetemp126 + csetemp127 + \n+ csetemp128 + csetemp129)*xformL23 + (csetemp130 + csetemp131 + \n+ csetemp132 + csetemp133)*xformL33) + xformL32*((csetemp110 + csetemp111 \n+ + csetemp112 + csetemp113)*xformL03 + (csetemp122 + csetemp123 + \n+ csetemp124 + csetemp125)*xformL13 + (csetemp130 + csetemp131 + \n+ csetemp132 + csetemp133)*xformL23 + (csetemp134 + csetemp135 + \n+ csetemp136 + csetemp137)*xformL33);\n+ \n+ CCTK_REAL dg4232 CCTK_ATTRIBUTE_UNUSED = xformL02*((csetemp138 + \n+ csetemp139 + csetemp140 + csetemp141)*xformL03 + (csetemp142 + \n+ csetemp143 + csetemp144 + csetemp145)*xformL13 + (csetemp146 + \n+ csetemp147 + csetemp148 + csetemp149)*xformL23 + (csetemp150 + \n+ csetemp151 + csetemp152 + csetemp153)*xformL33) + xformL12*((csetemp142 \n+ + csetemp143 + csetemp144 + csetemp145)*xformL03 + (csetemp154 + \n+ csetemp155 + csetemp156 + csetemp157)*xformL13 + (csetemp158 + \n+ csetemp159 + csetemp160 + csetemp161)*xformL23 + (csetemp162 + \n+ csetemp163 + csetemp164 + csetemp165)*xformL33) + xformL22*((csetemp146 \n+ + csetemp147 + csetemp148 + csetemp149)*xformL03 + (csetemp158 + \n+ csetemp159 + csetemp160 + csetemp161)*xformL13 + (csetemp166 + \n+ csetemp167 + csetemp168 + csetemp169)*xformL23 + (csetemp170 + \n+ csetemp171 + csetemp172 + csetemp173)*xformL33) + xformL32*((csetemp150 \n+ + csetemp151 + csetemp152 + csetemp153)*xformL03 + (csetemp162 + \n+ csetemp163 + csetemp164 + csetemp165)*xformL13 + (csetemp170 + \n+ csetemp171 + csetemp172 + csetemp173)*xformL23 + (csetemp174 + \n+ csetemp175 + csetemp176 + csetemp177)*xformL33);\n+ \n+ CCTK_REAL dg4233 CCTK_ATTRIBUTE_UNUSED = xformL02*((csetemp178 + \n+ csetemp179 + csetemp180 + csetemp181)*xformL03 + (csetemp182 + \n+ csetemp183 + csetemp184 + csetemp185)*xformL13 + (csetemp186 + \n+ csetemp187 + csetemp188 + csetemp189)*xformL23 + (csetemp190 + \n+ csetemp191 + csetemp192 + csetemp193)*xformL33) + xformL12*((csetemp182 \n+ + csetemp183 + csetemp184 + csetemp185)*xformL03 + (csetemp194 + \n+ csetemp195 + csetemp196 + csetemp197)*xformL13 + (csetemp198 + \n+ csetemp199 + csetemp200 + csetemp201)*xformL23 + (csetemp202 + \n+ csetemp203 + csetemp204 + csetemp205)*xformL33) + xformL22*((csetemp186 \n+ + csetemp187 + csetemp188 + csetemp189)*xformL03 + (csetemp198 + \n+ csetemp199 + csetemp200 + csetemp201)*xformL13 + (csetemp206 + \n+ csetemp207 + csetemp208 + csetemp209)*xformL23 + (csetemp210 + \n+ csetemp211 + csetemp212 + csetemp213)*xformL33) + xformL32*((csetemp190 \n+ + csetemp191 + csetemp192 + csetemp193)*xformL03 + (csetemp202 + \n+ csetemp203 + csetemp204 + csetemp205)*xformL13 + (csetemp210 + \n+ csetemp211 + csetemp212 + csetemp213)*xformL23 + (csetemp214 + \n+ csetemp215 + csetemp216 + csetemp217)*xformL33);\n+ \n+ CCTK_REAL dg4330 CCTK_ATTRIBUTE_UNUSED = xformL03*((csetemp58 + \n+ csetemp59 + csetemp60 + csetemp61)*xformL03 + (csetemp62 + csetemp63 + \n+ csetemp64 + csetemp65)*xformL13 + (csetemp66 + csetemp67 + csetemp68 + \n+ csetemp69)*xformL23 + (csetemp70 + csetemp71 + csetemp72 + \n+ csetemp73)*xformL33) + xformL13*((csetemp62 + csetemp63 + csetemp64 + \n+ csetemp65)*xformL03 + (csetemp74 + csetemp75 + csetemp76 + \n+ csetemp77)*xformL13 + (csetemp78 + csetemp79 + csetemp80 + \n+ csetemp81)*xformL23 + (csetemp82 + csetemp83 + csetemp84 + \n+ csetemp85)*xformL33) + xformL23*((csetemp66 + csetemp67 + csetemp68 + \n+ csetemp69)*xformL03 + (csetemp78 + csetemp79 + csetemp80 + \n+ csetemp81)*xformL13 + (csetemp86 + csetemp87 + csetemp88 + \n+ csetemp89)*xformL23 + (csetemp90 + csetemp91 + csetemp92 + \n+ csetemp93)*xformL33) + xformL33*((csetemp70 + csetemp71 + csetemp72 + \n+ csetemp73)*xformL03 + (csetemp82 + csetemp83 + csetemp84 + \n+ csetemp85)*xformL13 + (csetemp90 + csetemp91 + csetemp92 + \n+ csetemp93)*xformL23 + (csetemp94 + csetemp95 + csetemp96 + \n+ csetemp97)*xformL33);\n+ \n+ CCTK_REAL dg4331 CCTK_ATTRIBUTE_UNUSED = xformL03*((csetemp100 + \n+ csetemp101 + csetemp98 + csetemp99)*xformL03 + (csetemp102 + csetemp103 \n+ + csetemp104 + csetemp105)*xformL13 + (csetemp106 + csetemp107 + \n+ csetemp108 + csetemp109)*xformL23 + (csetemp110 + csetemp111 + \n+ csetemp112 + csetemp113)*xformL33) + xformL13*((csetemp102 + csetemp103 \n+ + csetemp104 + csetemp105)*xformL03 + (csetemp114 + csetemp115 + \n+ csetemp116 + csetemp117)*xformL13 + (csetemp118 + csetemp119 + \n+ csetemp120 + csetemp121)*xformL23 + (csetemp122 + csetemp123 + \n+ csetemp124 + csetemp125)*xformL33) + xformL23*((csetemp106 + csetemp107 \n+ + csetemp108 + csetemp109)*xformL03 + (csetemp118 + csetemp119 + \n+ csetemp120 + csetemp121)*xformL13 + (csetemp126 + csetemp127 + \n+ csetemp128 + csetemp129)*xformL23 + (csetemp130 + csetemp131 + \n+ csetemp132 + csetemp133)*xformL33) + xformL33*((csetemp110 + csetemp111 \n+ + csetemp112 + csetemp113)*xformL03 + (csetemp122 + csetemp123 + \n+ csetemp124 + csetemp125)*xformL13 + (csetemp130 + csetemp131 + \n+ csetemp132 + csetemp133)*xformL23 + (csetemp134 + csetemp135 + \n+ csetemp136 + csetemp137)*xformL33);\n+ \n+ CCTK_REAL dg4332 CCTK_ATTRIBUTE_UNUSED = xformL03*((csetemp138 + \n+ csetemp139 + csetemp140 + csetemp141)*xformL03 + (csetemp142 + \n+ csetemp143 + csetemp144 + csetemp145)*xformL13 + (csetemp146 + \n+ csetemp147 + csetemp148 + csetemp149)*xformL23 + (csetemp150 + \n+ csetemp151 + csetemp152 + csetemp153)*xformL33) + xformL13*((csetemp142 \n+ + csetemp143 + csetemp144 + csetemp145)*xformL03 + (csetemp154 + \n+ csetemp155 + csetemp156 + csetemp157)*xformL13 + (csetemp158 + \n+ csetemp159 + csetemp160 + csetemp161)*xformL23 + (csetemp162 + \n+ csetemp163 + csetemp164 + csetemp165)*xformL33) + xformL23*((csetemp146 \n+ + csetemp147 + csetemp148 + csetemp149)*xformL03 + (csetemp158 + \n+ csetemp159 + csetemp160 + csetemp161)*xformL13 + (csetemp166 + \n+ csetemp167 + csetemp168 + csetemp169)*xformL23 + (csetemp170 + \n+ csetemp171 + csetemp172 + csetemp173)*xformL33) + xformL33*((csetemp150 \n+ + csetemp151 + csetemp152 + csetemp153)*xformL03 + (csetemp162 + \n+ csetemp163 + csetemp164 + csetemp165)*xformL13 + (csetemp170 + \n+ csetemp171 + csetemp172 + csetemp173)*xformL23 + (csetemp174 + \n+ csetemp175 + csetemp176 + csetemp177)*xformL33);\n+ \n+ CCTK_REAL dg4333 CCTK_ATTRIBUTE_UNUSED = xformL03*((csetemp178 + \n+ csetemp179 + csetemp180 + csetemp181)*xformL03 + (csetemp182 + \n+ csetemp183 + csetemp184 + csetemp185)*xformL13 + (csetemp186 + \n+ csetemp187 + csetemp188 + csetemp189)*xformL23 + (csetemp190 + \n+ csetemp191 + csetemp192 + csetemp193)*xformL33) + xformL13*((csetemp182 \n+ + csetemp183 + csetemp184 + csetemp185)*xformL03 + (csetemp194 + \n+ csetemp195 + csetemp196 + csetemp197)*xformL13 + (csetemp198 + \n+ csetemp199 + csetemp200 + csetemp201)*xformL23 + (csetemp202 + \n+ csetemp203 + csetemp204 + csetemp205)*xformL33) + xformL23*((csetemp186 \n+ + csetemp187 + csetemp188 + csetemp189)*xformL03 + (csetemp198 + \n+ csetemp199 + csetemp200 + csetemp201)*xformL13 + (csetemp206 + \n+ csetemp207 + csetemp208 + csetemp209)*xformL23 + (csetemp210 + \n+ csetemp211 + csetemp212 + csetemp213)*xformL33) + xformL33*((csetemp190 \n+ + csetemp191 + csetemp192 + csetemp193)*xformL03 + (csetemp202 + \n+ csetemp203 + csetemp204 + csetemp205)*xformL13 + (csetemp210 + \n+ csetemp211 + csetemp212 + csetemp213)*xformL23 + (csetemp214 + \n+ csetemp215 + csetemp216 + csetemp217)*xformL33);\n+ \n+ CCTK_REAL betal1 CCTK_ATTRIBUTE_UNUSED = g401;\n+ \n+ CCTK_REAL betal2 CCTK_ATTRIBUTE_UNUSED = g402;\n+ \n+ CCTK_REAL betal3 CCTK_ATTRIBUTE_UNUSED = g403;\n+ \n+ gxxL = g411;\n+ \n+ gxyL = g412;\n+ \n+ gxzL = g413;\n+ \n+ gyyL = g422;\n+ \n+ gyzL = g423;\n+ \n+ gzzL = g433;\n+ \n+ CCTK_REAL csetemp218 CCTK_ATTRIBUTE_UNUSED = pow(gxzL,2);\n+ \n+ CCTK_REAL csetemp219 CCTK_ATTRIBUTE_UNUSED = pow(gyzL,2);\n+ \n+ CCTK_REAL csetemp220 CCTK_ATTRIBUTE_UNUSED = pow(gxyL,2);\n+ \n+ CCTK_REAL detg CCTK_ATTRIBUTE_UNUSED = 2*gxyL*gxzL*gyzL + \n+ gyyL*(gxxL*gzzL - csetemp218) - gxxL*csetemp219 - gzzL*csetemp220;\n+ \n+ CCTK_REAL csetemp221 CCTK_ATTRIBUTE_UNUSED = pow(detg,-1);\n+ \n+ CCTK_REAL gu11 CCTK_ATTRIBUTE_UNUSED = (gyyL*gzzL - \n+ csetemp219)*csetemp221;\n+ \n+ CCTK_REAL gu12 CCTK_ATTRIBUTE_UNUSED = (gxzL*gyzL - \n+ gxyL*gzzL)*csetemp221;\n+ \n+ CCTK_REAL gu13 CCTK_ATTRIBUTE_UNUSED = (-(gxzL*gyyL) + \n+ gxyL*gyzL)*csetemp221;\n+ \n+ CCTK_REAL gu22 CCTK_ATTRIBUTE_UNUSED = (gxxL*gzzL - \n+ csetemp218)*csetemp221;\n+ \n+ CCTK_REAL gu23 CCTK_ATTRIBUTE_UNUSED = (gxyL*gxzL - \n+ gxxL*gyzL)*csetemp221;\n+ \n+ CCTK_REAL gu33 CCTK_ATTRIBUTE_UNUSED = (gxxL*gyyL - \n+ csetemp220)*csetemp221;\n+ \n+ betaxL = betal1*gu11 + betal2*gu12 + betal3*gu13;\n+ \n+ betayL = betal1*gu12 + betal2*gu22 + betal3*gu23;\n+ \n+ betazL = betal1*gu13 + betal2*gu23 + betal3*gu33;\n+ \n+ CCTK_REAL betasq CCTK_ATTRIBUTE_UNUSED = betaxL*betal1 + betayL*betal2 \n+ + betazL*betal3;\n+ \n+ alpL = pow(betasq - g400,0.5);\n+ \n+ CCTK_REAL dtg11 CCTK_ATTRIBUTE_UNUSED = dg4110;\n+ \n+ CCTK_REAL dtg12 CCTK_ATTRIBUTE_UNUSED = dg4120;\n+ \n+ CCTK_REAL dtg13 CCTK_ATTRIBUTE_UNUSED = dg4130;\n+ \n+ CCTK_REAL dtg22 CCTK_ATTRIBUTE_UNUSED = dg4220;\n+ \n+ CCTK_REAL dtg23 CCTK_ATTRIBUTE_UNUSED = dg4230;\n+ \n+ CCTK_REAL dtg33 CCTK_ATTRIBUTE_UNUSED = dg4330;\n+ \n+ CCTK_REAL dg111 CCTK_ATTRIBUTE_UNUSED = dg4111;\n+ \n+ CCTK_REAL dg112 CCTK_ATTRIBUTE_UNUSED = dg4112;\n+ \n+ CCTK_REAL dg113 CCTK_ATTRIBUTE_UNUSED = dg4113;\n+ \n+ CCTK_REAL dg121 CCTK_ATTRIBUTE_UNUSED = dg4121;\n+ \n+ CCTK_REAL dg122 CCTK_ATTRIBUTE_UNUSED = dg4122;\n+ \n+ CCTK_REAL dg123 CCTK_ATTRIBUTE_UNUSED = dg4123;\n+ \n+ CCTK_REAL dg131 CCTK_ATTRIBUTE_UNUSED = dg4131;\n+ \n+ CCTK_REAL dg132 CCTK_ATTRIBUTE_UNUSED = dg4132;\n+ \n+ CCTK_REAL dg133 CCTK_ATTRIBUTE_UNUSED = dg4133;\n+ \n+ CCTK_REAL dg221 CCTK_ATTRIBUTE_UNUSED = dg4221;\n+ \n+ CCTK_REAL dg222 CCTK_ATTRIBUTE_UNUSED = dg4222;\n+ \n+ CCTK_REAL dg223 CCTK_ATTRIBUTE_UNUSED = dg4223;\n+ \n+ CCTK_REAL dg231 CCTK_ATTRIBUTE_UNUSED = dg4231;\n+ \n+ CCTK_REAL dg232 CCTK_ATTRIBUTE_UNUSED = dg4232;\n+ \n+ CCTK_REAL dg233 CCTK_ATTRIBUTE_UNUSED = dg4233;\n+ \n+ CCTK_REAL dg331 CCTK_ATTRIBUTE_UNUSED = dg4331;\n+ \n+ CCTK_REAL dg332 CCTK_ATTRIBUTE_UNUSED = dg4332;\n+ \n+ CCTK_REAL dg333 CCTK_ATTRIBUTE_UNUSED = dg4333;\n+ \n+ CCTK_REAL csetemp222 CCTK_ATTRIBUTE_UNUSED = dtg11*gu11;\n+ \n+ CCTK_REAL csetemp223 CCTK_ATTRIBUTE_UNUSED = dtg12*gu12;\n+ \n+ CCTK_REAL csetemp224 CCTK_ATTRIBUTE_UNUSED = dtg13*gu13;\n+ \n+ CCTK_REAL csetemp225 CCTK_ATTRIBUTE_UNUSED = dtg12*gu11;\n+ \n+ CCTK_REAL csetemp226 CCTK_ATTRIBUTE_UNUSED = dtg22*gu12;\n+ \n+ CCTK_REAL csetemp227 CCTK_ATTRIBUTE_UNUSED = dtg23*gu13;\n+ \n+ CCTK_REAL csetemp228 CCTK_ATTRIBUTE_UNUSED = dtg13*gu11;\n+ \n+ CCTK_REAL csetemp229 CCTK_ATTRIBUTE_UNUSED = dtg23*gu12;\n+ \n+ CCTK_REAL csetemp230 CCTK_ATTRIBUTE_UNUSED = dtg33*gu13;\n+ \n+ CCTK_REAL dtgu11 CCTK_ATTRIBUTE_UNUSED = -((csetemp222 + csetemp223 + \n+ csetemp224)*gu11) - (csetemp225 + csetemp226 + csetemp227)*gu12 - \n+ (csetemp228 + csetemp229 + csetemp230)*gu13;\n+ \n+ CCTK_REAL dtgu12 CCTK_ATTRIBUTE_UNUSED = -((csetemp222 + csetemp223 + \n+ csetemp224)*gu12) - (csetemp225 + csetemp226 + csetemp227)*gu22 - \n+ (csetemp228 + csetemp229 + csetemp230)*gu23;\n+ \n+ CCTK_REAL dtgu13 CCTK_ATTRIBUTE_UNUSED = -((csetemp222 + csetemp223 + \n+ csetemp224)*gu13) - (csetemp225 + csetemp226 + csetemp227)*gu23 - \n+ (csetemp228 + csetemp229 + csetemp230)*gu33;\n+ \n+ CCTK_REAL csetemp231 CCTK_ATTRIBUTE_UNUSED = dtg11*gu12;\n+ \n+ CCTK_REAL csetemp232 CCTK_ATTRIBUTE_UNUSED = dtg12*gu22;\n+ \n+ CCTK_REAL csetemp233 CCTK_ATTRIBUTE_UNUSED = dtg13*gu23;\n+ \n+ CCTK_REAL csetemp234 CCTK_ATTRIBUTE_UNUSED = dtg22*gu22;\n+ \n+ CCTK_REAL csetemp235 CCTK_ATTRIBUTE_UNUSED = dtg23*gu23;\n+ \n+ CCTK_REAL csetemp236 CCTK_ATTRIBUTE_UNUSED = dtg13*gu12;\n+ \n+ CCTK_REAL csetemp237 CCTK_ATTRIBUTE_UNUSED = dtg23*gu22;\n+ \n+ CCTK_REAL csetemp238 CCTK_ATTRIBUTE_UNUSED = dtg33*gu23;\n+ \n+ CCTK_REAL dtgu22 CCTK_ATTRIBUTE_UNUSED = -((csetemp231 + csetemp232 + \n+ csetemp233)*gu12) - (csetemp223 + csetemp234 + csetemp235)*gu22 - \n+ (csetemp236 + csetemp237 + csetemp238)*gu23;\n+ \n+ CCTK_REAL dtgu23 CCTK_ATTRIBUTE_UNUSED = -((csetemp231 + csetemp232 + \n+ csetemp233)*gu13) - (csetemp223 + csetemp234 + csetemp235)*gu23 - \n+ (csetemp236 + csetemp237 + csetemp238)*gu33;\n+ \n+ CCTK_REAL dtgu33 CCTK_ATTRIBUTE_UNUSED = -(gu13*(dtg11*gu13 + \n+ dtg12*gu23 + dtg13*gu33)) - gu23*(dtg12*gu13 + dtg22*gu23 + dtg23*gu33) \n+ - gu33*(csetemp224 + csetemp235 + dtg33*gu33);\n+ \n+ CCTK_REAL csetemp239 CCTK_ATTRIBUTE_UNUSED = dg111*gu11;\n+ \n+ CCTK_REAL csetemp240 CCTK_ATTRIBUTE_UNUSED = dg121*gu12;\n+ \n+ CCTK_REAL csetemp241 CCTK_ATTRIBUTE_UNUSED = dg131*gu13;\n+ \n+ CCTK_REAL csetemp242 CCTK_ATTRIBUTE_UNUSED = dg121*gu11;\n+ \n+ CCTK_REAL csetemp243 CCTK_ATTRIBUTE_UNUSED = dg221*gu12;\n+ \n+ CCTK_REAL csetemp244 CCTK_ATTRIBUTE_UNUSED = dg231*gu13;\n+ \n+ CCTK_REAL csetemp245 CCTK_ATTRIBUTE_UNUSED = dg131*gu11;\n+ \n+ CCTK_REAL csetemp246 CCTK_ATTRIBUTE_UNUSED = dg231*gu12;\n+ \n+ CCTK_REAL csetemp247 CCTK_ATTRIBUTE_UNUSED = dg331*gu13;\n+ \n+ CCTK_REAL dgu111 CCTK_ATTRIBUTE_UNUSED = -((csetemp239 + csetemp240 + \n+ csetemp241)*gu11) - (csetemp242 + csetemp243 + csetemp244)*gu12 - \n+ (csetemp245 + csetemp246 + csetemp247)*gu13;\n+ \n+ CCTK_REAL dgu121 CCTK_ATTRIBUTE_UNUSED = -((csetemp239 + csetemp240 + \n+ csetemp241)*gu12) - (csetemp242 + csetemp243 + csetemp244)*gu22 - \n+ (csetemp245 + csetemp246 + csetemp247)*gu23;\n+ \n+ CCTK_REAL dgu131 CCTK_ATTRIBUTE_UNUSED = -((csetemp239 + csetemp240 + \n+ csetemp241)*gu13) - (csetemp242 + csetemp243 + csetemp244)*gu23 - \n+ (csetemp245 + csetemp246 + csetemp247)*gu33;\n+ \n+ CCTK_REAL csetemp248 CCTK_ATTRIBUTE_UNUSED = dg111*gu12;\n+ \n+ CCTK_REAL csetemp249 CCTK_ATTRIBUTE_UNUSED = dg121*gu22;\n+ \n+ CCTK_REAL csetemp250 CCTK_ATTRIBUTE_UNUSED = dg131*gu23;\n+ \n+ CCTK_REAL csetemp251 CCTK_ATTRIBUTE_UNUSED = dg221*gu22;\n+ \n+ CCTK_REAL csetemp252 CCTK_ATTRIBUTE_UNUSED = dg231*gu23;\n+ \n+ CCTK_REAL csetemp253 CCTK_ATTRIBUTE_UNUSED = dg131*gu12;\n+ \n+ CCTK_REAL csetemp254 CCTK_ATTRIBUTE_UNUSED = dg231*gu22;\n+ \n+ CCTK_REAL csetemp255 CCTK_ATTRIBUTE_UNUSED = dg331*gu23;\n+ \n+ CCTK_REAL dgu221 CCTK_ATTRIBUTE_UNUSED = -((csetemp248 + csetemp249 + \n+ csetemp250)*gu12) - (csetemp240 + csetemp251 + csetemp252)*gu22 - \n+ (csetemp253 + csetemp254 + csetemp255)*gu23;\n+ \n+ CCTK_REAL dgu231 CCTK_ATTRIBUTE_UNUSED = -((csetemp248 + csetemp249 + \n+ csetemp250)*gu13) - (csetemp240 + csetemp251 + csetemp252)*gu23 - \n+ (csetemp253 + csetemp254 + csetemp255)*gu33;\n+ \n+ CCTK_REAL dgu331 CCTK_ATTRIBUTE_UNUSED = -(gu13*(dg111*gu13 + \n+ dg121*gu23 + dg131*gu33)) - gu23*(dg121*gu13 + dg221*gu23 + dg231*gu33) \n+ - gu33*(csetemp241 + csetemp252 + dg331*gu33);\n+ \n+ CCTK_REAL csetemp256 CCTK_ATTRIBUTE_UNUSED = dg112*gu11;\n+ \n+ CCTK_REAL csetemp257 CCTK_ATTRIBUTE_UNUSED = dg122*gu12;\n+ \n+ CCTK_REAL csetemp258 CCTK_ATTRIBUTE_UNUSED = dg132*gu13;\n+ \n+ CCTK_REAL csetemp259 CCTK_ATTRIBUTE_UNUSED = dg122*gu11;\n+ \n+ CCTK_REAL csetemp260 CCTK_ATTRIBUTE_UNUSED = dg222*gu12;\n+ \n+ CCTK_REAL csetemp261 CCTK_ATTRIBUTE_UNUSED = dg232*gu13;\n+ \n+ CCTK_REAL csetemp262 CCTK_ATTRIBUTE_UNUSED = dg132*gu11;\n+ \n+ CCTK_REAL csetemp263 CCTK_ATTRIBUTE_UNUSED = dg232*gu12;\n+ \n+ CCTK_REAL csetemp264 CCTK_ATTRIBUTE_UNUSED = dg332*gu13;\n+ \n+ CCTK_REAL dgu112 CCTK_ATTRIBUTE_UNUSED = -((csetemp256 + csetemp257 + \n+ csetemp258)*gu11) - (csetemp259 + csetemp260 + csetemp261)*gu12 - \n+ (csetemp262 + csetemp263 + csetemp264)*gu13;\n+ \n+ CCTK_REAL dgu122 CCTK_ATTRIBUTE_UNUSED = -((csetemp256 + csetemp257 + \n+ csetemp258)*gu12) - (csetemp259 + csetemp260 + csetemp261)*gu22 - \n+ (csetemp262 + csetemp263 + csetemp264)*gu23;\n+ \n+ CCTK_REAL dgu132 CCTK_ATTRIBUTE_UNUSED = -((csetemp256 + csetemp257 + \n+ csetemp258)*gu13) - (csetemp259 + csetemp260 + csetemp261)*gu23 - \n+ (csetemp262 + csetemp263 + csetemp264)*gu33;\n+ \n+ CCTK_REAL csetemp265 CCTK_ATTRIBUTE_UNUSED = dg112*gu12;\n+ \n+ CCTK_REAL csetemp266 CCTK_ATTRIBUTE_UNUSED = dg122*gu22;\n+ \n+ CCTK_REAL csetemp267 CCTK_ATTRIBUTE_UNUSED = dg132*gu23;\n+ \n+ CCTK_REAL csetemp268 CCTK_ATTRIBUTE_UNUSED = dg222*gu22;\n+ \n+ CCTK_REAL csetemp269 CCTK_ATTRIBUTE_UNUSED = dg232*gu23;\n+ \n+ CCTK_REAL csetemp270 CCTK_ATTRIBUTE_UNUSED = dg132*gu12;\n+ \n+ CCTK_REAL csetemp271 CCTK_ATTRIBUTE_UNUSED = dg232*gu22;\n+ \n+ CCTK_REAL csetemp272 CCTK_ATTRIBUTE_UNUSED = dg332*gu23;\n+ \n+ CCTK_REAL dgu222 CCTK_ATTRIBUTE_UNUSED = -((csetemp265 + csetemp266 + \n+ csetemp267)*gu12) - (csetemp257 + csetemp268 + csetemp269)*gu22 - \n+ (csetemp270 + csetemp271 + csetemp272)*gu23;\n+ \n+ CCTK_REAL dgu232 CCTK_ATTRIBUTE_UNUSED = -((csetemp265 + csetemp266 + \n+ csetemp267)*gu13) - (csetemp257 + csetemp268 + csetemp269)*gu23 - \n+ (csetemp270 + csetemp271 + csetemp272)*gu33;\n+ \n+ CCTK_REAL dgu332 CCTK_ATTRIBUTE_UNUSED = -(gu13*(dg112*gu13 + \n+ dg122*gu23 + dg132*gu33)) - gu23*(dg122*gu13 + dg222*gu23 + dg232*gu33) \n+ - gu33*(csetemp258 + csetemp269 + dg332*gu33);\n+ \n+ CCTK_REAL csetemp273 CCTK_ATTRIBUTE_UNUSED = dg113*gu11;\n+ \n+ CCTK_REAL csetemp274 CCTK_ATTRIBUTE_UNUSED = dg123*gu12;\n+ \n+ CCTK_REAL csetemp275 CCTK_ATTRIBUTE_UNUSED = dg133*gu13;\n+ \n+ CCTK_REAL csetemp276 CCTK_ATTRIBUTE_UNUSED = dg123*gu11;\n+ \n+ CCTK_REAL csetemp277 CCTK_ATTRIBUTE_UNUSED = dg223*gu12;\n+ \n+ CCTK_REAL csetemp278 CCTK_ATTRIBUTE_UNUSED = dg233*gu13;\n+ \n+ CCTK_REAL csetemp279 CCTK_ATTRIBUTE_UNUSED = dg133*gu11;\n+ \n+ CCTK_REAL csetemp280 CCTK_ATTRIBUTE_UNUSED = dg233*gu12;\n+ \n+ CCTK_REAL csetemp281 CCTK_ATTRIBUTE_UNUSED = dg333*gu13;\n+ \n+ CCTK_REAL dgu113 CCTK_ATTRIBUTE_UNUSED = -((csetemp273 + csetemp274 + \n+ csetemp275)*gu11) - (csetemp276 + csetemp277 + csetemp278)*gu12 - \n+ (csetemp279 + csetemp280 + csetemp281)*gu13;\n+ \n+ CCTK_REAL dgu123 CCTK_ATTRIBUTE_UNUSED = -((csetemp273 + csetemp274 + \n+ csetemp275)*gu12) - (csetemp276 + csetemp277 + csetemp278)*gu22 - \n+ (csetemp279 + csetemp280 + csetemp281)*gu23;\n+ \n+ CCTK_REAL dgu133 CCTK_ATTRIBUTE_UNUSED = -((csetemp273 + csetemp274 + \n+ csetemp275)*gu13) - (csetemp276 + csetemp277 + csetemp278)*gu23 - \n+ (csetemp279 + csetemp280 + csetemp281)*gu33;\n+ \n+ CCTK_REAL csetemp282 CCTK_ATTRIBUTE_UNUSED = dg113*gu12;\n+ \n+ CCTK_REAL csetemp283 CCTK_ATTRIBUTE_UNUSED = dg123*gu22;\n+ \n+ CCTK_REAL csetemp284 CCTK_ATTRIBUTE_UNUSED = dg133*gu23;\n+ \n+ CCTK_REAL csetemp285 CCTK_ATTRIBUTE_UNUSED = dg223*gu22;\n+ \n+ CCTK_REAL csetemp286 CCTK_ATTRIBUTE_UNUSED = dg233*gu23;\n+ \n+ CCTK_REAL csetemp287 CCTK_ATTRIBUTE_UNUSED = dg133*gu12;\n+ \n+ CCTK_REAL csetemp288 CCTK_ATTRIBUTE_UNUSED = dg233*gu22;\n+ \n+ CCTK_REAL csetemp289 CCTK_ATTRIBUTE_UNUSED = dg333*gu23;\n+ \n+ CCTK_REAL dgu223 CCTK_ATTRIBUTE_UNUSED = -((csetemp282 + csetemp283 + \n+ csetemp284)*gu12) - (csetemp274 + csetemp285 + csetemp286)*gu22 - \n+ (csetemp287 + csetemp288 + csetemp289)*gu23;\n+ \n+ CCTK_REAL dgu233 CCTK_ATTRIBUTE_UNUSED = -((csetemp282 + csetemp283 + \n+ csetemp284)*gu13) - (csetemp274 + csetemp285 + csetemp286)*gu23 - \n+ (csetemp287 + csetemp288 + csetemp289)*gu33;\n+ \n+ CCTK_REAL dgu333 CCTK_ATTRIBUTE_UNUSED = -(gu13*(dg113*gu13 + \n+ dg123*gu23 + dg133*gu33)) - gu23*(dg123*gu13 + dg223*gu23 + dg233*gu33) \n+ - gu33*(csetemp275 + csetemp286 + dg333*gu33);\n+ \n+ CCTK_REAL dtbetal1 CCTK_ATTRIBUTE_UNUSED = dg4010;\n+ \n+ CCTK_REAL dtbetal2 CCTK_ATTRIBUTE_UNUSED = dg4020;\n+ \n+ CCTK_REAL dtbetal3 CCTK_ATTRIBUTE_UNUSED = dg4030;\n+ \n+ CCTK_REAL dbetal11 CCTK_ATTRIBUTE_UNUSED = dg4011;\n+ \n+ CCTK_REAL dbetal12 CCTK_ATTRIBUTE_UNUSED = dg4012;\n+ \n+ CCTK_REAL dbetal13 CCTK_ATTRIBUTE_UNUSED = dg4013;\n+ \n+ CCTK_REAL dbetal21 CCTK_ATTRIBUTE_UNUSED = dg4021;\n+ \n+ CCTK_REAL dbetal22 CCTK_ATTRIBUTE_UNUSED = dg4022;\n+ \n+ CCTK_REAL dbetal23 CCTK_ATTRIBUTE_UNUSED = dg4023;\n+ \n+ CCTK_REAL dbetal31 CCTK_ATTRIBUTE_UNUSED = dg4031;\n+ \n+ CCTK_REAL dbetal32 CCTK_ATTRIBUTE_UNUSED = dg4032;\n+ \n+ CCTK_REAL dbetal33 CCTK_ATTRIBUTE_UNUSED = dg4033;\n+ \n+ dtbetaxL = betal1*dtgu11 + betal2*dtgu12 + betal3*dtgu13 + \n+ dtbetal1*gu11 + dtbetal2*gu12 + dtbetal3*gu13;\n+ \n+ dtbetayL = betal1*dtgu12 + betal2*dtgu22 + betal3*dtgu23 + \n+ dtbetal1*gu12 + dtbetal2*gu22 + dtbetal3*gu23;\n+ \n+ dtbetazL = betal1*dtgu13 + betal2*dtgu23 + betal3*dtgu33 + \n+ dtbetal1*gu13 + dtbetal2*gu23 + dtbetal3*gu33;\n+ \n+ CCTK_REAL dbeta11 CCTK_ATTRIBUTE_UNUSED = betal1*dgu111 + \n+ betal2*dgu121 + betal3*dgu131 + dbetal11*gu11 + dbetal21*gu12 + \n+ dbetal31*gu13;\n+ \n+ CCTK_REAL dbeta21 CCTK_ATTRIBUTE_UNUSED = betal1*dgu121 + \n+ betal2*dgu221 + betal3*dgu231 + dbetal11*gu12 + dbetal21*gu22 + \n+ dbetal31*gu23;\n+ \n+ CCTK_REAL dbeta31 CCTK_ATTRIBUTE_UNUSED = betal1*dgu131 + \n+ betal2*dgu231 + betal3*dgu331 + dbetal11*gu13 + dbetal21*gu23 + \n+ dbetal31*gu33;\n+ \n+ CCTK_REAL dbeta12 CCTK_ATTRIBUTE_UNUSED = betal1*dgu112 + \n+ betal2*dgu122 + betal3*dgu132 + dbetal12*gu11 + dbetal22*gu12 + \n+ dbetal32*gu13;\n+ \n+ CCTK_REAL dbeta22 CCTK_ATTRIBUTE_UNUSED = betal1*dgu122 + \n+ betal2*dgu222 + betal3*dgu232 + dbetal12*gu12 + dbetal22*gu22 + \n+ dbetal32*gu23;\n+ \n+ CCTK_REAL dbeta32 CCTK_ATTRIBUTE_UNUSED = betal1*dgu132 + \n+ betal2*dgu232 + betal3*dgu332 + dbetal12*gu13 + dbetal22*gu23 + \n+ dbetal32*gu33;\n+ \n+ CCTK_REAL dbeta13 CCTK_ATTRIBUTE_UNUSED = betal1*dgu113 + \n+ betal2*dgu123 + betal3*dgu133 + dbetal13*gu11 + dbetal23*gu12 + \n+ dbetal33*gu13;\n+ \n+ CCTK_REAL dbeta23 CCTK_ATTRIBUTE_UNUSED = betal1*dgu123 + \n+ betal2*dgu223 + betal3*dgu233 + dbetal13*gu12 + dbetal23*gu22 + \n+ dbetal33*gu23;\n+ \n+ CCTK_REAL dbeta33 CCTK_ATTRIBUTE_UNUSED = betal1*dgu133 + \n+ betal2*dgu233 + betal3*dgu333 + dbetal13*gu13 + dbetal23*gu23 + \n+ dbetal33*gu33;\n+ \n+ CCTK_REAL dtbetasq CCTK_ATTRIBUTE_UNUSED = dtbetaxL*betal1 + \n+ dtbetayL*betal2 + dtbetazL*betal3 + betaxL*dtbetal1 + betayL*dtbetal2 + \n+ betazL*dtbetal3;\n+ \n+ CCTK_REAL csetemp290 CCTK_ATTRIBUTE_UNUSED = pow(alpL,-1);\n+ \n+ CCTK_REAL dtalpL CCTK_ATTRIBUTE_UNUSED = 0.5*csetemp290*(-dg4000 + \n+ dtbetasq);\n+ \n+ CCTK_REAL kxxL CCTK_ATTRIBUTE_UNUSED = 0.5*csetemp290*(2*(gxxL*dbeta11 \n+ + gxyL*dbeta21 + gxzL*dbeta31) + betaxL*dg111 + betayL*dg112 + \n+ betazL*dg113 - dtg11);\n+ \n+ CCTK_REAL kxyL CCTK_ATTRIBUTE_UNUSED = 0.5*csetemp290*(gxxL*dbeta12 + \n+ gyyL*dbeta21 + gxyL*(dbeta11 + dbeta22) + gyzL*dbeta31 + gxzL*dbeta32 + \n+ betaxL*dg121 + betayL*dg122 + betazL*dg123 - dtg12);\n+ \n+ CCTK_REAL kxzL CCTK_ATTRIBUTE_UNUSED = 0.5*csetemp290*(gxxL*dbeta13 + \n+ gyzL*dbeta21 + gxyL*dbeta23 + gzzL*dbeta31 + gxzL*(dbeta11 + dbeta33) + \n+ betaxL*dg131 + betayL*dg132 + betazL*dg133 - dtg13);\n+ \n+ CCTK_REAL kyyL CCTK_ATTRIBUTE_UNUSED = 0.5*csetemp290*(2*(gxyL*dbeta12 \n+ + gyyL*dbeta22 + gyzL*dbeta32) + betaxL*dg221 + betayL*dg222 + \n+ betazL*dg223 - dtg22);\n+ \n+ CCTK_REAL kyzL CCTK_ATTRIBUTE_UNUSED = 0.5*csetemp290*(gxzL*dbeta12 + \n+ gxyL*dbeta13 + gyyL*dbeta23 + gzzL*dbeta32 + gyzL*(dbeta22 + dbeta33) + \n+ betaxL*dg231 + betayL*dg232 + betazL*dg233 - dtg23);\n+ \n+ CCTK_REAL kzzL CCTK_ATTRIBUTE_UNUSED = 0.5*csetemp290*(2*(gxzL*dbeta13 \n+ + gyzL*dbeta23 + gzzL*dbeta33) + betaxL*dg331 + betayL*dg332 + \n+ betazL*dg333 - dtg33);\n+ /* Copy local copies back to grid functions */\n+ alp[index] = alpL;\n+ betax[index] = betaxL;\n+ betay[index] = betayL;\n+ betaz[index] = betazL;\n+ dtalp[index] = dtalpL;\n+ dtbetax[index] = dtbetaxL;\n+ dtbetay[index] = dtbetayL;\n+ dtbetaz[index] = dtbetazL;\n+ gxx[index] = gxxL;\n+ gxy[index] = gxyL;\n+ gxz[index] = gxzL;\n+ gyy[index] = gyyL;\n+ gyz[index] = gyzL;\n+ gzz[index] = gzzL;\n+ kxx[index] = kxxL;\n+ kxy[index] = kxyL;\n+ kxz[index] = kxzL;\n+ kyy[index] = kyyL;\n+ kyz[index] = kyzL;\n+ kzz[index] = kzzL;\n+ }\n+ CCTK_ENDLOOP3(Minkowski_always);\n+}\n+extern \"C\" void Minkowski_always(CCTK_ARGUMENTS)\n+{\n+ DECLARE_CCTK_ARGUMENTS;\n+ DECLARE_CCTK_PARAMETERS;\n+ \n+ if (verbose > 1)\n+ {\n+ CCTK_VInfo(CCTK_THORNSTRING,\"Entering Minkowski_always_Body\");\n+ }\n+ if (cctk_iteration % Minkowski_always_calc_every != Minkowski_always_calc_offset)\n+ {\n+ return;\n+ }\n+ \n+ const char* const groups[] = {\n+ \"admbase::curv\",\n+ \"admbase::dtlapse\",\n+ \"admbase::dtshift\",\n+ \"admbase::lapse\",\n+ \"admbase::metric\",\n+ \"admbase::shift\"};\n+ AssertGroupStorage(cctkGH, \"Minkowski_always\", 6, groups);\n+ \n+ \n+ LoopOverEverything(cctkGH, Minkowski_always_Body);\n+ if (verbose > 1)\n+ {\n+ CCTK_VInfo(CCTK_THORNSTRING,\"Leaving Minkowski_always_Body\");\n+ }\n+}\n+\n+} // namespace Minkowski"}, "test": {"test_patch": "diff --git a/all_tests.txt b/all_tests.txt\nnew file mode 100644\nindex 0000000..0000000\n--- /dev/null\n+++ b/all_tests.txt\n@@ -0,0 +1,7 @@\n+GaugeWave\n+KS-tilted-EE\n+KerrSchild\n+Minkowski\n+ModifiedSchwarzschildBL\n+ShiftedGaugeWave\n+Vaidya2", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}27{"question_id": "MSB_einsteintoolkit_Cactus_pr33", "question_type": "multi_swe_bench", "description": "Add missing Minkowski_error.cc in EinsteinExact/Minkowski (einsteintoolkit/Cactus#33)", "content": {"org": "einsteintoolkit", "repo": "Cactus", "pr_number": 33, "issue_title": "Add missing Minkowski_error.cc in EinsteinExact/Minkowski", "issue_body": "This PR adds the missing source file Minkowski_error.cc to complete the EinsteinExact/Minkowski thorn implementation.", "base_commit": "HEAD", "resolved_issues": [{"number": 33, "title": "Implement the full functionality of Minkowski", "body": "Please implement the full functionality of `Minkowski` by finishing the code in `Minkowski_error.cc`.\n\n## Thorn Information:\n- Name: Minkowski\n- Target file: Minkowski_error.cc\n\n## Interface Definition in interface.ccl:\n\n## Schedule Definition in schedule.ccl:\n\n## Parameters Definition in param.ccl:\n\n## Configuration Definition in configuration.ccl:\n\n## Documentation Context in readme.md and doc/documentation.tex\n\n## Related Code Context in src folder\n\n"}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/einsteintoolkit_m_cactus:pr-33", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/arrangements/EinsteinExact/Minkowski/src/Minkowski_error.cc b/arrangements/EinsteinExact/Minkowski/src/Minkowski_error.cc\nnew file mode 100644\nindex 0000000..0000000\n--- /dev/null\n+++ b/arrangements/EinsteinExact/Minkowski/src/Minkowski_error.cc\n@@ -0,0 +1,2048 @@\n+/* File produced by Kranc */\n+\n+#define KRANC_C\n+\n+#include <algorithm>\n+#include <assert.h>\n+#include <math.h>\n+#include <stdio.h>\n+#include <stdlib.h>\n+#include <string.h>\n+#include \"cctk.h\"\n+#include \"cctk_Arguments.h\"\n+#include \"cctk_Parameters.h\"\n+#include \"Kranc.hh\"\n+#include \"Differencing.h\"\n+#include \"loopcontrol.h\"\n+\n+/* Define macros used in calculations */\n+#define INITVALUE (42)\n+#define INV(x) ((CCTK_REAL)1.0 / (x))\n+#define SQR(x) ((x) * (x))\n+#define CUB(x) ((x) * SQR(x))\n+#define QAD(x) (SQR(SQR(x)))\n+\n+namespace Minkowski {\n+\n+\n+static void Minkowski_error_Body(const cGH* restrict const cctkGH, const int dir, const int face, const CCTK_REAL normal[3], const CCTK_REAL tangentA[3], const CCTK_REAL tangentB[3], const int imin[3], const int imax[3], const int n_subblock_gfs, CCTK_REAL* restrict const subblock_gfs[])\n+{\n+ DECLARE_CCTK_ARGUMENTS;\n+ DECLARE_CCTK_PARAMETERS;\n+ \n+ /* Include user-supplied include files */\n+ /* Initialise finite differencing variables */\n+ const ptrdiff_t di CCTK_ATTRIBUTE_UNUSED = 1;\n+ const ptrdiff_t dj CCTK_ATTRIBUTE_UNUSED = CCTK_GFINDEX3D(cctkGH,0,1,0) - CCTK_GFINDEX3D(cctkGH,0,0,0);\n+ const ptrdiff_t dk CCTK_ATTRIBUTE_UNUSED = CCTK_GFINDEX3D(cctkGH,0,0,1) - CCTK_GFINDEX3D(cctkGH,0,0,0);\n+ const ptrdiff_t cdi CCTK_ATTRIBUTE_UNUSED = sizeof(CCTK_REAL) * di;\n+ const ptrdiff_t cdj CCTK_ATTRIBUTE_UNUSED = sizeof(CCTK_REAL) * dj;\n+ const ptrdiff_t cdk CCTK_ATTRIBUTE_UNUSED = sizeof(CCTK_REAL) * dk;\n+ const ptrdiff_t cctkLbnd1 CCTK_ATTRIBUTE_UNUSED = cctk_lbnd[0];\n+ const ptrdiff_t cctkLbnd2 CCTK_ATTRIBUTE_UNUSED = cctk_lbnd[1];\n+ const ptrdiff_t cctkLbnd3 CCTK_ATTRIBUTE_UNUSED = cctk_lbnd[2];\n+ const CCTK_REAL t CCTK_ATTRIBUTE_UNUSED = ToReal(cctk_time);\n+ const CCTK_REAL cctkOriginSpace1 CCTK_ATTRIBUTE_UNUSED = ToReal(CCTK_ORIGIN_SPACE(0));\n+ const CCTK_REAL cctkOriginSpace2 CCTK_ATTRIBUTE_UNUSED = ToReal(CCTK_ORIGIN_SPACE(1));\n+ const CCTK_REAL cctkOriginSpace3 CCTK_ATTRIBUTE_UNUSED = ToReal(CCTK_ORIGIN_SPACE(2));\n+ const CCTK_REAL dt CCTK_ATTRIBUTE_UNUSED = ToReal(CCTK_DELTA_TIME);\n+ const CCTK_REAL dx CCTK_ATTRIBUTE_UNUSED = ToReal(CCTK_DELTA_SPACE(0));\n+ const CCTK_REAL dy CCTK_ATTRIBUTE_UNUSED = ToReal(CCTK_DELTA_SPACE(1));\n+ const CCTK_REAL dz CCTK_ATTRIBUTE_UNUSED = ToReal(CCTK_DELTA_SPACE(2));\n+ const CCTK_REAL dxi CCTK_ATTRIBUTE_UNUSED = INV(dx);\n+ const CCTK_REAL dyi CCTK_ATTRIBUTE_UNUSED = INV(dy);\n+ const CCTK_REAL dzi CCTK_ATTRIBUTE_UNUSED = INV(dz);\n+ const CCTK_REAL khalf CCTK_ATTRIBUTE_UNUSED = 0.5;\n+ const CCTK_REAL kthird CCTK_ATTRIBUTE_UNUSED = \n+ 0.333333333333333333333333333333;\n+ const CCTK_REAL ktwothird CCTK_ATTRIBUTE_UNUSED = \n+ 0.666666666666666666666666666667;\n+ const CCTK_REAL kfourthird CCTK_ATTRIBUTE_UNUSED = \n+ 1.33333333333333333333333333333;\n+ const CCTK_REAL hdxi CCTK_ATTRIBUTE_UNUSED = 0.5*dxi;\n+ const CCTK_REAL hdyi CCTK_ATTRIBUTE_UNUSED = 0.5*dyi;\n+ const CCTK_REAL hdzi CCTK_ATTRIBUTE_UNUSED = 0.5*dzi;\n+ /* Initialize predefined quantities */\n+ /* Assign local copies of arrays functions */\n+ \n+ \n+ /* Calculate temporaries and arrays functions */\n+ /* Copy local copies back to grid functions */\n+ /* Loop over the grid points */\n+ const int imin0=imin[0];\n+ const int imin1=imin[1];\n+ const int imin2=imin[2];\n+ const int imax0=imax[0];\n+ const int imax1=imax[1];\n+ const int imax2=imax[2];\n+ #pragma omp parallel\n+ CCTK_LOOP3(Minkowski_error,\n+ i,j,k, imin0,imin1,imin2, imax0,imax1,imax2,\n+ cctk_ash[0],cctk_ash[1],cctk_ash[2])\n+ {\n+ const ptrdiff_t index CCTK_ATTRIBUTE_UNUSED = di*i + dj*j + dk*k;\n+ /* Assign local copies of grid functions */\n+ \n+ CCTK_REAL alpL CCTK_ATTRIBUTE_UNUSED = alp[index];\n+ CCTK_REAL betaxL CCTK_ATTRIBUTE_UNUSED = betax[index];\n+ CCTK_REAL betayL CCTK_ATTRIBUTE_UNUSED = betay[index];\n+ CCTK_REAL betazL CCTK_ATTRIBUTE_UNUSED = betaz[index];\n+ CCTK_REAL dtalpL CCTK_ATTRIBUTE_UNUSED = dtalp[index];\n+ CCTK_REAL dtbetaxL CCTK_ATTRIBUTE_UNUSED = dtbetax[index];\n+ CCTK_REAL dtbetayL CCTK_ATTRIBUTE_UNUSED = dtbetay[index];\n+ CCTK_REAL dtbetazL CCTK_ATTRIBUTE_UNUSED = dtbetaz[index];\n+ CCTK_REAL gxxL CCTK_ATTRIBUTE_UNUSED = gxx[index];\n+ CCTK_REAL gxyL CCTK_ATTRIBUTE_UNUSED = gxy[index];\n+ CCTK_REAL gxzL CCTK_ATTRIBUTE_UNUSED = gxz[index];\n+ CCTK_REAL gyyL CCTK_ATTRIBUTE_UNUSED = gyy[index];\n+ CCTK_REAL gyzL CCTK_ATTRIBUTE_UNUSED = gyz[index];\n+ CCTK_REAL gzzL CCTK_ATTRIBUTE_UNUSED = gzz[index];\n+ CCTK_REAL kxxL CCTK_ATTRIBUTE_UNUSED = kxx[index];\n+ CCTK_REAL kxyL CCTK_ATTRIBUTE_UNUSED = kxy[index];\n+ CCTK_REAL kxzL CCTK_ATTRIBUTE_UNUSED = kxz[index];\n+ CCTK_REAL kyyL CCTK_ATTRIBUTE_UNUSED = kyy[index];\n+ CCTK_REAL kyzL CCTK_ATTRIBUTE_UNUSED = kyz[index];\n+ CCTK_REAL kzzL CCTK_ATTRIBUTE_UNUSED = kzz[index];\n+ \n+ /* Include user supplied include files */\n+ /* Precompute derivatives */\n+ /* Calculate temporaries and grid functions */\n+ CCTK_REAL xform1L00 CCTK_ATTRIBUTE_UNUSED = 1;\n+ \n+ CCTK_REAL xform1L01 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL xform1L02 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL xform1L03 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL xform1L10 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL csetemp0 CCTK_ATTRIBUTE_UNUSED = cos(ToReal(phi));\n+ \n+ CCTK_REAL csetemp1 CCTK_ATTRIBUTE_UNUSED = cos(ToReal(psi));\n+ \n+ CCTK_REAL csetemp2 CCTK_ATTRIBUTE_UNUSED = cos(ToReal(theta));\n+ \n+ CCTK_REAL csetemp3 CCTK_ATTRIBUTE_UNUSED = sin(ToReal(phi));\n+ \n+ CCTK_REAL csetemp4 CCTK_ATTRIBUTE_UNUSED = sin(ToReal(psi));\n+ \n+ CCTK_REAL xform1L11 CCTK_ATTRIBUTE_UNUSED = csetemp0*csetemp1 - \n+ csetemp2*csetemp3*csetemp4;\n+ \n+ CCTK_REAL xform1L12 CCTK_ATTRIBUTE_UNUSED = csetemp1*csetemp3 + \n+ csetemp0*csetemp2*csetemp4;\n+ \n+ CCTK_REAL csetemp5 CCTK_ATTRIBUTE_UNUSED = sin(ToReal(theta));\n+ \n+ CCTK_REAL xform1L13 CCTK_ATTRIBUTE_UNUSED = csetemp4*csetemp5;\n+ \n+ CCTK_REAL xform1L20 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL xform1L21 CCTK_ATTRIBUTE_UNUSED = \n+ -(csetemp1*csetemp2*csetemp3) - csetemp0*csetemp4;\n+ \n+ CCTK_REAL xform1L22 CCTK_ATTRIBUTE_UNUSED = csetemp0*csetemp1*csetemp2 \n+ - csetemp3*csetemp4;\n+ \n+ CCTK_REAL xform1L23 CCTK_ATTRIBUTE_UNUSED = csetemp1*csetemp5;\n+ \n+ CCTK_REAL xform1L30 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL xform1L31 CCTK_ATTRIBUTE_UNUSED = csetemp3*csetemp5;\n+ \n+ CCTK_REAL xform1L32 CCTK_ATTRIBUTE_UNUSED = -(csetemp0*csetemp5);\n+ \n+ CCTK_REAL xform1L33 CCTK_ATTRIBUTE_UNUSED = csetemp2;\n+ \n+ CCTK_REAL csetemp6 CCTK_ATTRIBUTE_UNUSED = SQR(ToReal(boostx));\n+ \n+ CCTK_REAL csetemp7 CCTK_ATTRIBUTE_UNUSED = SQR(ToReal(boosty));\n+ \n+ CCTK_REAL csetemp8 CCTK_ATTRIBUTE_UNUSED = SQR(ToReal(boostz));\n+ \n+ CCTK_REAL csetemp9 CCTK_ATTRIBUTE_UNUSED = INV(ToReal(lapsefactor));\n+ \n+ CCTK_REAL xform2L00 CCTK_ATTRIBUTE_UNUSED = csetemp9*INV((-1 + \n+ csetemp6 + csetemp7 + csetemp8)*(1 + sqrt(1 - csetemp6 - csetemp7 - \n+ csetemp8)))*(1 - csetemp6 - csetemp7 - csetemp8 + sqrt(1 - csetemp6 - \n+ csetemp7 - csetemp8))*(-1 + ToReal(boostx)*ToReal(shiftaddx) + \n+ ToReal(boosty)*ToReal(shiftaddy) + ToReal(boostz)*ToReal(shiftaddz));\n+ \n+ CCTK_REAL xform2L01 CCTK_ATTRIBUTE_UNUSED = csetemp9*INV((-1 + \n+ csetemp6 + csetemp7 + csetemp8)*(1 + sqrt(1 - csetemp6 - csetemp7 - \n+ csetemp8)))*(1 - csetemp6 - csetemp7 - csetemp8 + sqrt(1 - csetemp6 - \n+ csetemp7 - csetemp8))*ToReal(boostx);\n+ \n+ CCTK_REAL xform2L02 CCTK_ATTRIBUTE_UNUSED = csetemp9*INV((-1 + \n+ csetemp6 + csetemp7 + csetemp8)*(1 + sqrt(1 - csetemp6 - csetemp7 - \n+ csetemp8)))*(1 - csetemp6 - csetemp7 - csetemp8 + sqrt(1 - csetemp6 - \n+ csetemp7 - csetemp8))*ToReal(boosty);\n+ \n+ CCTK_REAL xform2L03 CCTK_ATTRIBUTE_UNUSED = csetemp9*INV((-1 + \n+ csetemp6 + csetemp7 + csetemp8)*(1 + sqrt(1 - csetemp6 - csetemp7 - \n+ csetemp8)))*(1 - csetemp6 - csetemp7 - csetemp8 + sqrt(1 - csetemp6 - \n+ csetemp7 - csetemp8))*ToReal(boostz);\n+ \n+ CCTK_REAL xform2L10 CCTK_ATTRIBUTE_UNUSED = INV((-1 + csetemp6 + \n+ csetemp7 + csetemp8)*(1 + sqrt(1 - csetemp6 - csetemp7 - \n+ csetemp8)))*((csetemp6 + (-1 + csetemp7 + csetemp8)*(1 + sqrt(1 - \n+ csetemp6 - csetemp7 - csetemp8)))*ToReal(shiftaddx) - \n+ ToReal(boostx)*(-1 + csetemp6 + csetemp7 + csetemp8 + sqrt(1 - csetemp6 \n+ - csetemp7 - csetemp8)*(-1 + ToReal(boosty)*ToReal(shiftaddy) + \n+ ToReal(boostz)*ToReal(shiftaddz))));\n+ \n+ CCTK_REAL xform2L11 CCTK_ATTRIBUTE_UNUSED = INV((-1 + csetemp6 + \n+ csetemp7 + csetemp8)*(1 + sqrt(1 - csetemp6 - csetemp7 - \n+ csetemp8)))*(csetemp6 + (-1 + csetemp7 + csetemp8)*(1 + sqrt(1 - \n+ csetemp6 - csetemp7 - csetemp8)));\n+ \n+ CCTK_REAL xform2L12 CCTK_ATTRIBUTE_UNUSED = -(INV(-1 + csetemp6 + \n+ csetemp7 + csetemp8 - sqrt(1 - csetemp6 - csetemp7 - \n+ csetemp8))*ToReal(boostx)*ToReal(boosty));\n+ \n+ CCTK_REAL xform2L13 CCTK_ATTRIBUTE_UNUSED = -(INV(-1 + csetemp6 + \n+ csetemp7 + csetemp8 - sqrt(1 - csetemp6 - csetemp7 - \n+ csetemp8))*ToReal(boostx)*ToReal(boostz));\n+ \n+ CCTK_REAL xform2L20 CCTK_ATTRIBUTE_UNUSED = INV((-1 + csetemp6 + \n+ csetemp7 + csetemp8)*(1 + sqrt(1 - csetemp6 - csetemp7 - \n+ csetemp8)))*((csetemp7 + (-1 + csetemp6 + csetemp8)*(1 + sqrt(1 - \n+ csetemp6 - csetemp7 - csetemp8)))*ToReal(shiftaddy) - \n+ ToReal(boosty)*(-1 + csetemp6 + csetemp7 + csetemp8 + sqrt(1 - csetemp6 \n+ - csetemp7 - csetemp8)*(-1 + ToReal(boostx)*ToReal(shiftaddx) + \n+ ToReal(boostz)*ToReal(shiftaddz))));\n+ \n+ CCTK_REAL xform2L21 CCTK_ATTRIBUTE_UNUSED = -(INV(-1 + csetemp6 + \n+ csetemp7 + csetemp8 - sqrt(1 - csetemp6 - csetemp7 - \n+ csetemp8))*ToReal(boostx)*ToReal(boosty));\n+ \n+ CCTK_REAL xform2L22 CCTK_ATTRIBUTE_UNUSED = INV((-1 + csetemp6 + \n+ csetemp7 + csetemp8)*(1 + sqrt(1 - csetemp6 - csetemp7 - \n+ csetemp8)))*(csetemp7 + (-1 + csetemp6 + csetemp8)*(1 + sqrt(1 - \n+ csetemp6 - csetemp7 - csetemp8)));\n+ \n+ CCTK_REAL xform2L23 CCTK_ATTRIBUTE_UNUSED = -(INV(-1 + csetemp6 + \n+ csetemp7 + csetemp8 - sqrt(1 - csetemp6 - csetemp7 - \n+ csetemp8))*ToReal(boosty)*ToReal(boostz));\n+ \n+ CCTK_REAL xform2L30 CCTK_ATTRIBUTE_UNUSED = INV((-1 + csetemp6 + \n+ csetemp7 + csetemp8)*(1 + sqrt(1 - csetemp6 - csetemp7 - \n+ csetemp8)))*(-(ToReal(boostz)*(-1 + csetemp6 + csetemp7 + csetemp8 + \n+ sqrt(1 - csetemp6 - csetemp7 - csetemp8)*(-1 + \n+ ToReal(boostx)*ToReal(shiftaddx) + ToReal(boosty)*ToReal(shiftaddy)))) \n+ + (-1 + csetemp6 + csetemp7 + csetemp8 + (-1 + csetemp6 + \n+ csetemp7)*sqrt(1 - csetemp6 - csetemp7 - csetemp8))*ToReal(shiftaddz));\n+ \n+ CCTK_REAL xform2L31 CCTK_ATTRIBUTE_UNUSED = -(INV(-1 + csetemp6 + \n+ csetemp7 + csetemp8 - sqrt(1 - csetemp6 - csetemp7 - \n+ csetemp8))*ToReal(boostx)*ToReal(boostz));\n+ \n+ CCTK_REAL xform2L32 CCTK_ATTRIBUTE_UNUSED = -(INV(-1 + csetemp6 + \n+ csetemp7 + csetemp8 - sqrt(1 - csetemp6 - csetemp7 - \n+ csetemp8))*ToReal(boosty)*ToReal(boostz));\n+ \n+ CCTK_REAL xform2L33 CCTK_ATTRIBUTE_UNUSED = INV((-1 + csetemp6 + \n+ csetemp7 + csetemp8)*(1 + sqrt(1 - csetemp6 - csetemp7 - \n+ csetemp8)))*(-1 + csetemp6 + csetemp7 + csetemp8 + (-1 + csetemp6 + \n+ csetemp7)*sqrt(1 - csetemp6 - csetemp7 - csetemp8));\n+ \n+ CCTK_REAL xformL00 CCTK_ATTRIBUTE_UNUSED = xform1L00*xform2L00 + \n+ xform1L01*xform2L10 + xform1L02*xform2L20 + xform1L03*xform2L30;\n+ \n+ CCTK_REAL xformL01 CCTK_ATTRIBUTE_UNUSED = xform1L00*xform2L01 + \n+ xform1L01*xform2L11 + xform1L02*xform2L21 + xform1L03*xform2L31;\n+ \n+ CCTK_REAL xformL02 CCTK_ATTRIBUTE_UNUSED = xform1L00*xform2L02 + \n+ xform1L01*xform2L12 + xform1L02*xform2L22 + xform1L03*xform2L32;\n+ \n+ CCTK_REAL xformL03 CCTK_ATTRIBUTE_UNUSED = xform1L00*xform2L03 + \n+ xform1L01*xform2L13 + xform1L02*xform2L23 + xform1L03*xform2L33;\n+ \n+ CCTK_REAL xformL10 CCTK_ATTRIBUTE_UNUSED = xform1L10*xform2L00 + \n+ xform1L11*xform2L10 + xform1L12*xform2L20 + xform1L13*xform2L30;\n+ \n+ CCTK_REAL xformL11 CCTK_ATTRIBUTE_UNUSED = xform1L10*xform2L01 + \n+ xform1L11*xform2L11 + xform1L12*xform2L21 + xform1L13*xform2L31;\n+ \n+ CCTK_REAL xformL12 CCTK_ATTRIBUTE_UNUSED = xform1L10*xform2L02 + \n+ xform1L11*xform2L12 + xform1L12*xform2L22 + xform1L13*xform2L32;\n+ \n+ CCTK_REAL xformL13 CCTK_ATTRIBUTE_UNUSED = xform1L10*xform2L03 + \n+ xform1L11*xform2L13 + xform1L12*xform2L23 + xform1L13*xform2L33;\n+ \n+ CCTK_REAL xformL20 CCTK_ATTRIBUTE_UNUSED = xform1L20*xform2L00 + \n+ xform1L21*xform2L10 + xform1L22*xform2L20 + xform1L23*xform2L30;\n+ \n+ CCTK_REAL xformL21 CCTK_ATTRIBUTE_UNUSED = xform1L20*xform2L01 + \n+ xform1L21*xform2L11 + xform1L22*xform2L21 + xform1L23*xform2L31;\n+ \n+ CCTK_REAL xformL22 CCTK_ATTRIBUTE_UNUSED = xform1L20*xform2L02 + \n+ xform1L21*xform2L12 + xform1L22*xform2L22 + xform1L23*xform2L32;\n+ \n+ CCTK_REAL xformL23 CCTK_ATTRIBUTE_UNUSED = xform1L20*xform2L03 + \n+ xform1L21*xform2L13 + xform1L22*xform2L23 + xform1L23*xform2L33;\n+ \n+ CCTK_REAL xformL30 CCTK_ATTRIBUTE_UNUSED = xform1L30*xform2L00 + \n+ xform1L31*xform2L10 + xform1L32*xform2L20 + xform1L33*xform2L30;\n+ \n+ CCTK_REAL xformL31 CCTK_ATTRIBUTE_UNUSED = xform1L30*xform2L01 + \n+ xform1L31*xform2L11 + xform1L32*xform2L21 + xform1L33*xform2L31;\n+ \n+ CCTK_REAL xformL32 CCTK_ATTRIBUTE_UNUSED = xform1L30*xform2L02 + \n+ xform1L31*xform2L12 + xform1L32*xform2L22 + xform1L33*xform2L32;\n+ \n+ CCTK_REAL xformL33 CCTK_ATTRIBUTE_UNUSED = xform1L30*xform2L03 + \n+ xform1L31*xform2L13 + xform1L32*xform2L23 + xform1L33*xform2L33;\n+ \n+ CCTK_REAL tg400 CCTK_ATTRIBUTE_UNUSED = -1;\n+ \n+ CCTK_REAL tg401 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tg402 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tg403 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tg411 CCTK_ATTRIBUTE_UNUSED = 1;\n+ \n+ CCTK_REAL tg412 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tg413 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tg422 CCTK_ATTRIBUTE_UNUSED = 1;\n+ \n+ CCTK_REAL tg423 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tg433 CCTK_ATTRIBUTE_UNUSED = 1;\n+ \n+ CCTK_REAL tdg4000 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tdg4001 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tdg4002 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tdg4003 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tdg4010 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tdg4011 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tdg4012 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tdg4013 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tdg4020 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tdg4021 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tdg4022 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tdg4023 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tdg4030 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tdg4031 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tdg4032 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tdg4033 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tdg4110 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tdg4111 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tdg4112 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tdg4113 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tdg4120 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tdg4121 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tdg4122 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tdg4123 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tdg4130 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tdg4131 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tdg4132 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tdg4133 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tdg4220 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tdg4221 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tdg4222 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tdg4223 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tdg4230 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tdg4231 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tdg4232 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tdg4233 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tdg4330 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tdg4331 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tdg4332 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tdg4333 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL g400 CCTK_ATTRIBUTE_UNUSED = 2*(tg423*xformL20*xformL30 + \n+ xformL00*(tg401*xformL10 + tg402*xformL20 + tg403*xformL30) + \n+ xformL10*(tg412*xformL20 + tg413*xformL30)) + tg400*SQR(xformL00) + \n+ tg411*SQR(xformL10) + tg422*SQR(xformL20) + tg433*SQR(xformL30);\n+ \n+ CCTK_REAL csetemp10 CCTK_ATTRIBUTE_UNUSED = tg400*xformL01;\n+ \n+ CCTK_REAL csetemp11 CCTK_ATTRIBUTE_UNUSED = tg401*xformL11;\n+ \n+ CCTK_REAL csetemp12 CCTK_ATTRIBUTE_UNUSED = tg402*xformL21;\n+ \n+ CCTK_REAL csetemp13 CCTK_ATTRIBUTE_UNUSED = tg403*xformL31;\n+ \n+ CCTK_REAL csetemp14 CCTK_ATTRIBUTE_UNUSED = tg401*xformL01;\n+ \n+ CCTK_REAL csetemp15 CCTK_ATTRIBUTE_UNUSED = tg411*xformL11;\n+ \n+ CCTK_REAL csetemp16 CCTK_ATTRIBUTE_UNUSED = tg412*xformL21;\n+ \n+ CCTK_REAL csetemp17 CCTK_ATTRIBUTE_UNUSED = tg413*xformL31;\n+ \n+ CCTK_REAL csetemp18 CCTK_ATTRIBUTE_UNUSED = tg402*xformL01;\n+ \n+ CCTK_REAL csetemp19 CCTK_ATTRIBUTE_UNUSED = tg412*xformL11;\n+ \n+ CCTK_REAL csetemp20 CCTK_ATTRIBUTE_UNUSED = tg422*xformL21;\n+ \n+ CCTK_REAL csetemp21 CCTK_ATTRIBUTE_UNUSED = tg423*xformL31;\n+ \n+ CCTK_REAL csetemp22 CCTK_ATTRIBUTE_UNUSED = tg403*xformL01;\n+ \n+ CCTK_REAL csetemp23 CCTK_ATTRIBUTE_UNUSED = tg413*xformL11;\n+ \n+ CCTK_REAL csetemp24 CCTK_ATTRIBUTE_UNUSED = tg423*xformL21;\n+ \n+ CCTK_REAL csetemp25 CCTK_ATTRIBUTE_UNUSED = tg433*xformL31;\n+ \n+ CCTK_REAL g401 CCTK_ATTRIBUTE_UNUSED = (csetemp10 + csetemp11 + \n+ csetemp12 + csetemp13)*xformL00 + (csetemp14 + csetemp15 + csetemp16 + \n+ csetemp17)*xformL10 + (csetemp18 + csetemp19 + csetemp20 + \n+ csetemp21)*xformL20 + (csetemp22 + csetemp23 + csetemp24 + \n+ csetemp25)*xformL30;\n+ \n+ CCTK_REAL csetemp26 CCTK_ATTRIBUTE_UNUSED = tg400*xformL02;\n+ \n+ CCTK_REAL csetemp27 CCTK_ATTRIBUTE_UNUSED = tg401*xformL12;\n+ \n+ CCTK_REAL csetemp28 CCTK_ATTRIBUTE_UNUSED = tg402*xformL22;\n+ \n+ CCTK_REAL csetemp29 CCTK_ATTRIBUTE_UNUSED = tg403*xformL32;\n+ \n+ CCTK_REAL csetemp30 CCTK_ATTRIBUTE_UNUSED = tg401*xformL02;\n+ \n+ CCTK_REAL csetemp31 CCTK_ATTRIBUTE_UNUSED = tg411*xformL12;\n+ \n+ CCTK_REAL csetemp32 CCTK_ATTRIBUTE_UNUSED = tg412*xformL22;\n+ \n+ CCTK_REAL csetemp33 CCTK_ATTRIBUTE_UNUSED = tg413*xformL32;\n+ \n+ CCTK_REAL csetemp34 CCTK_ATTRIBUTE_UNUSED = tg402*xformL02;\n+ \n+ CCTK_REAL csetemp35 CCTK_ATTRIBUTE_UNUSED = tg412*xformL12;\n+ \n+ CCTK_REAL csetemp36 CCTK_ATTRIBUTE_UNUSED = tg422*xformL22;\n+ \n+ CCTK_REAL csetemp37 CCTK_ATTRIBUTE_UNUSED = tg423*xformL32;\n+ \n+ CCTK_REAL csetemp38 CCTK_ATTRIBUTE_UNUSED = tg403*xformL02;\n+ \n+ CCTK_REAL csetemp39 CCTK_ATTRIBUTE_UNUSED = tg413*xformL12;\n+ \n+ CCTK_REAL csetemp40 CCTK_ATTRIBUTE_UNUSED = tg423*xformL22;\n+ \n+ CCTK_REAL csetemp41 CCTK_ATTRIBUTE_UNUSED = tg433*xformL32;\n+ \n+ CCTK_REAL g402 CCTK_ATTRIBUTE_UNUSED = (csetemp26 + csetemp27 + \n+ csetemp28 + csetemp29)*xformL00 + (csetemp30 + csetemp31 + csetemp32 + \n+ csetemp33)*xformL10 + (csetemp34 + csetemp35 + csetemp36 + \n+ csetemp37)*xformL20 + (csetemp38 + csetemp39 + csetemp40 + \n+ csetemp41)*xformL30;\n+ \n+ CCTK_REAL csetemp42 CCTK_ATTRIBUTE_UNUSED = tg400*xformL03;\n+ \n+ CCTK_REAL csetemp43 CCTK_ATTRIBUTE_UNUSED = tg401*xformL13;\n+ \n+ CCTK_REAL csetemp44 CCTK_ATTRIBUTE_UNUSED = tg402*xformL23;\n+ \n+ CCTK_REAL csetemp45 CCTK_ATTRIBUTE_UNUSED = tg403*xformL33;\n+ \n+ CCTK_REAL csetemp46 CCTK_ATTRIBUTE_UNUSED = tg401*xformL03;\n+ \n+ CCTK_REAL csetemp47 CCTK_ATTRIBUTE_UNUSED = tg411*xformL13;\n+ \n+ CCTK_REAL csetemp48 CCTK_ATTRIBUTE_UNUSED = tg412*xformL23;\n+ \n+ CCTK_REAL csetemp49 CCTK_ATTRIBUTE_UNUSED = tg413*xformL33;\n+ \n+ CCTK_REAL csetemp50 CCTK_ATTRIBUTE_UNUSED = tg402*xformL03;\n+ \n+ CCTK_REAL csetemp51 CCTK_ATTRIBUTE_UNUSED = tg412*xformL13;\n+ \n+ CCTK_REAL csetemp52 CCTK_ATTRIBUTE_UNUSED = tg422*xformL23;\n+ \n+ CCTK_REAL csetemp53 CCTK_ATTRIBUTE_UNUSED = tg423*xformL33;\n+ \n+ CCTK_REAL csetemp54 CCTK_ATTRIBUTE_UNUSED = tg403*xformL03;\n+ \n+ CCTK_REAL csetemp55 CCTK_ATTRIBUTE_UNUSED = tg413*xformL13;\n+ \n+ CCTK_REAL csetemp56 CCTK_ATTRIBUTE_UNUSED = tg423*xformL23;\n+ \n+ CCTK_REAL csetemp57 CCTK_ATTRIBUTE_UNUSED = tg433*xformL33;\n+ \n+ CCTK_REAL g403 CCTK_ATTRIBUTE_UNUSED = (csetemp42 + csetemp43 + \n+ csetemp44 + csetemp45)*xformL00 + (csetemp46 + csetemp47 + csetemp48 + \n+ csetemp49)*xformL10 + (csetemp50 + csetemp51 + csetemp52 + \n+ csetemp53)*xformL20 + (csetemp54 + csetemp55 + csetemp56 + \n+ csetemp57)*xformL30;\n+ \n+ CCTK_REAL g411 CCTK_ATTRIBUTE_UNUSED = (csetemp10 + csetemp11 + \n+ csetemp12 + csetemp13)*xformL01 + (csetemp14 + csetemp15 + csetemp16 + \n+ csetemp17)*xformL11 + (csetemp18 + csetemp19 + csetemp20 + \n+ csetemp21)*xformL21 + (csetemp22 + csetemp23 + csetemp24 + \n+ csetemp25)*xformL31;\n+ \n+ CCTK_REAL g412 CCTK_ATTRIBUTE_UNUSED = (csetemp26 + csetemp27 + \n+ csetemp28 + csetemp29)*xformL01 + (csetemp30 + csetemp31 + csetemp32 + \n+ csetemp33)*xformL11 + (csetemp34 + csetemp35 + csetemp36 + \n+ csetemp37)*xformL21 + (csetemp38 + csetemp39 + csetemp40 + \n+ csetemp41)*xformL31;\n+ \n+ CCTK_REAL g413 CCTK_ATTRIBUTE_UNUSED = (csetemp42 + csetemp43 + \n+ csetemp44 + csetemp45)*xformL01 + (csetemp46 + csetemp47 + csetemp48 + \n+ csetemp49)*xformL11 + (csetemp50 + csetemp51 + csetemp52 + \n+ csetemp53)*xformL21 + (csetemp54 + csetemp55 + csetemp56 + \n+ csetemp57)*xformL31;\n+ \n+ CCTK_REAL g422 CCTK_ATTRIBUTE_UNUSED = (csetemp26 + csetemp27 + \n+ csetemp28 + csetemp29)*xformL02 + (csetemp30 + csetemp31 + csetemp32 + \n+ csetemp33)*xformL12 + (csetemp34 + csetemp35 + csetemp36 + \n+ csetemp37)*xformL22 + (csetemp38 + csetemp39 + csetemp40 + \n+ csetemp41)*xformL32;\n+ \n+ CCTK_REAL g423 CCTK_ATTRIBUTE_UNUSED = (csetemp42 + csetemp43 + \n+ csetemp44 + csetemp45)*xformL02 + (csetemp46 + csetemp47 + csetemp48 + \n+ csetemp49)*xformL12 + (csetemp50 + csetemp51 + csetemp52 + \n+ csetemp53)*xformL22 + (csetemp54 + csetemp55 + csetemp56 + \n+ csetemp57)*xformL32;\n+ \n+ CCTK_REAL g433 CCTK_ATTRIBUTE_UNUSED = (csetemp42 + csetemp43 + \n+ csetemp44 + csetemp45)*xformL03 + (csetemp46 + csetemp47 + csetemp48 + \n+ csetemp49)*xformL13 + (csetemp50 + csetemp51 + csetemp52 + \n+ csetemp53)*xformL23 + (csetemp54 + csetemp55 + csetemp56 + \n+ csetemp57)*xformL33;\n+ \n+ CCTK_REAL csetemp58 CCTK_ATTRIBUTE_UNUSED = tdg4000*xformL00;\n+ \n+ CCTK_REAL csetemp59 CCTK_ATTRIBUTE_UNUSED = tdg4001*xformL10;\n+ \n+ CCTK_REAL csetemp60 CCTK_ATTRIBUTE_UNUSED = tdg4002*xformL20;\n+ \n+ CCTK_REAL csetemp61 CCTK_ATTRIBUTE_UNUSED = tdg4003*xformL30;\n+ \n+ CCTK_REAL csetemp62 CCTK_ATTRIBUTE_UNUSED = tdg4010*xformL00;\n+ \n+ CCTK_REAL csetemp63 CCTK_ATTRIBUTE_UNUSED = tdg4011*xformL10;\n+ \n+ CCTK_REAL csetemp64 CCTK_ATTRIBUTE_UNUSED = tdg4012*xformL20;\n+ \n+ CCTK_REAL csetemp65 CCTK_ATTRIBUTE_UNUSED = tdg4013*xformL30;\n+ \n+ CCTK_REAL csetemp66 CCTK_ATTRIBUTE_UNUSED = tdg4020*xformL00;\n+ \n+ CCTK_REAL csetemp67 CCTK_ATTRIBUTE_UNUSED = tdg4021*xformL10;\n+ \n+ CCTK_REAL csetemp68 CCTK_ATTRIBUTE_UNUSED = tdg4022*xformL20;\n+ \n+ CCTK_REAL csetemp69 CCTK_ATTRIBUTE_UNUSED = tdg4023*xformL30;\n+ \n+ CCTK_REAL csetemp70 CCTK_ATTRIBUTE_UNUSED = tdg4030*xformL00;\n+ \n+ CCTK_REAL csetemp71 CCTK_ATTRIBUTE_UNUSED = tdg4031*xformL10;\n+ \n+ CCTK_REAL csetemp72 CCTK_ATTRIBUTE_UNUSED = tdg4032*xformL20;\n+ \n+ CCTK_REAL csetemp73 CCTK_ATTRIBUTE_UNUSED = tdg4033*xformL30;\n+ \n+ CCTK_REAL csetemp74 CCTK_ATTRIBUTE_UNUSED = tdg4110*xformL00;\n+ \n+ CCTK_REAL csetemp75 CCTK_ATTRIBUTE_UNUSED = tdg4111*xformL10;\n+ \n+ CCTK_REAL csetemp76 CCTK_ATTRIBUTE_UNUSED = tdg4112*xformL20;\n+ \n+ CCTK_REAL csetemp77 CCTK_ATTRIBUTE_UNUSED = tdg4113*xformL30;\n+ \n+ CCTK_REAL csetemp78 CCTK_ATTRIBUTE_UNUSED = tdg4120*xformL00;\n+ \n+ CCTK_REAL csetemp79 CCTK_ATTRIBUTE_UNUSED = tdg4121*xformL10;\n+ \n+ CCTK_REAL csetemp80 CCTK_ATTRIBUTE_UNUSED = tdg4122*xformL20;\n+ \n+ CCTK_REAL csetemp81 CCTK_ATTRIBUTE_UNUSED = tdg4123*xformL30;\n+ \n+ CCTK_REAL csetemp82 CCTK_ATTRIBUTE_UNUSED = tdg4130*xformL00;\n+ \n+ CCTK_REAL csetemp83 CCTK_ATTRIBUTE_UNUSED = tdg4131*xformL10;\n+ \n+ CCTK_REAL csetemp84 CCTK_ATTRIBUTE_UNUSED = tdg4132*xformL20;\n+ \n+ CCTK_REAL csetemp85 CCTK_ATTRIBUTE_UNUSED = tdg4133*xformL30;\n+ \n+ CCTK_REAL csetemp86 CCTK_ATTRIBUTE_UNUSED = tdg4220*xformL00;\n+ \n+ CCTK_REAL csetemp87 CCTK_ATTRIBUTE_UNUSED = tdg4221*xformL10;\n+ \n+ CCTK_REAL csetemp88 CCTK_ATTRIBUTE_UNUSED = tdg4222*xformL20;\n+ \n+ CCTK_REAL csetemp89 CCTK_ATTRIBUTE_UNUSED = tdg4223*xformL30;\n+ \n+ CCTK_REAL csetemp90 CCTK_ATTRIBUTE_UNUSED = tdg4230*xformL00;\n+ \n+ CCTK_REAL csetemp91 CCTK_ATTRIBUTE_UNUSED = tdg4231*xformL10;\n+ \n+ CCTK_REAL csetemp92 CCTK_ATTRIBUTE_UNUSED = tdg4232*xformL20;\n+ \n+ CCTK_REAL csetemp93 CCTK_ATTRIBUTE_UNUSED = tdg4233*xformL30;\n+ \n+ CCTK_REAL csetemp94 CCTK_ATTRIBUTE_UNUSED = tdg4330*xformL00;\n+ \n+ CCTK_REAL csetemp95 CCTK_ATTRIBUTE_UNUSED = tdg4331*xformL10;\n+ \n+ CCTK_REAL csetemp96 CCTK_ATTRIBUTE_UNUSED = tdg4332*xformL20;\n+ \n+ CCTK_REAL csetemp97 CCTK_ATTRIBUTE_UNUSED = tdg4333*xformL30;\n+ \n+ CCTK_REAL dg4000 CCTK_ATTRIBUTE_UNUSED = xformL00*((csetemp58 + \n+ csetemp59 + csetemp60 + csetemp61)*xformL00 + (csetemp62 + csetemp63 + \n+ csetemp64 + csetemp65)*xformL10 + (csetemp66 + csetemp67 + csetemp68 + \n+ csetemp69)*xformL20 + (csetemp70 + csetemp71 + csetemp72 + \n+ csetemp73)*xformL30) + xformL10*((csetemp62 + csetemp63 + csetemp64 + \n+ csetemp65)*xformL00 + (csetemp74 + csetemp75 + csetemp76 + \n+ csetemp77)*xformL10 + (csetemp78 + csetemp79 + csetemp80 + \n+ csetemp81)*xformL20 + (csetemp82 + csetemp83 + csetemp84 + \n+ csetemp85)*xformL30) + xformL20*((csetemp66 + csetemp67 + csetemp68 + \n+ csetemp69)*xformL00 + (csetemp78 + csetemp79 + csetemp80 + \n+ csetemp81)*xformL10 + (csetemp86 + csetemp87 + csetemp88 + \n+ csetemp89)*xformL20 + (csetemp90 + csetemp91 + csetemp92 + \n+ csetemp93)*xformL30) + xformL30*((csetemp70 + csetemp71 + csetemp72 + \n+ csetemp73)*xformL00 + (csetemp82 + csetemp83 + csetemp84 + \n+ csetemp85)*xformL10 + (csetemp90 + csetemp91 + csetemp92 + \n+ csetemp93)*xformL20 + (csetemp94 + csetemp95 + csetemp96 + \n+ csetemp97)*xformL30);\n+ \n+ CCTK_REAL dg4010 CCTK_ATTRIBUTE_UNUSED = xformL00*((csetemp58 + \n+ csetemp59 + csetemp60 + csetemp61)*xformL01 + (csetemp62 + csetemp63 + \n+ csetemp64 + csetemp65)*xformL11 + (csetemp66 + csetemp67 + csetemp68 + \n+ csetemp69)*xformL21 + (csetemp70 + csetemp71 + csetemp72 + \n+ csetemp73)*xformL31) + xformL10*((csetemp62 + csetemp63 + csetemp64 + \n+ csetemp65)*xformL01 + (csetemp74 + csetemp75 + csetemp76 + \n+ csetemp77)*xformL11 + (csetemp78 + csetemp79 + csetemp80 + \n+ csetemp81)*xformL21 + (csetemp82 + csetemp83 + csetemp84 + \n+ csetemp85)*xformL31) + xformL20*((csetemp66 + csetemp67 + csetemp68 + \n+ csetemp69)*xformL01 + (csetemp78 + csetemp79 + csetemp80 + \n+ csetemp81)*xformL11 + (csetemp86 + csetemp87 + csetemp88 + \n+ csetemp89)*xformL21 + (csetemp90 + csetemp91 + csetemp92 + \n+ csetemp93)*xformL31) + xformL30*((csetemp70 + csetemp71 + csetemp72 + \n+ csetemp73)*xformL01 + (csetemp82 + csetemp83 + csetemp84 + \n+ csetemp85)*xformL11 + (csetemp90 + csetemp91 + csetemp92 + \n+ csetemp93)*xformL21 + (csetemp94 + csetemp95 + csetemp96 + \n+ csetemp97)*xformL31);\n+ \n+ CCTK_REAL csetemp98 CCTK_ATTRIBUTE_UNUSED = tdg4000*xformL01;\n+ \n+ CCTK_REAL csetemp99 CCTK_ATTRIBUTE_UNUSED = tdg4001*xformL11;\n+ \n+ CCTK_REAL csetemp100 CCTK_ATTRIBUTE_UNUSED = tdg4002*xformL21;\n+ \n+ CCTK_REAL csetemp101 CCTK_ATTRIBUTE_UNUSED = tdg4003*xformL31;\n+ \n+ CCTK_REAL csetemp102 CCTK_ATTRIBUTE_UNUSED = tdg4010*xformL01;\n+ \n+ CCTK_REAL csetemp103 CCTK_ATTRIBUTE_UNUSED = tdg4011*xformL11;\n+ \n+ CCTK_REAL csetemp104 CCTK_ATTRIBUTE_UNUSED = tdg4012*xformL21;\n+ \n+ CCTK_REAL csetemp105 CCTK_ATTRIBUTE_UNUSED = tdg4013*xformL31;\n+ \n+ CCTK_REAL csetemp106 CCTK_ATTRIBUTE_UNUSED = tdg4020*xformL01;\n+ \n+ CCTK_REAL csetemp107 CCTK_ATTRIBUTE_UNUSED = tdg4021*xformL11;\n+ \n+ CCTK_REAL csetemp108 CCTK_ATTRIBUTE_UNUSED = tdg4022*xformL21;\n+ \n+ CCTK_REAL csetemp109 CCTK_ATTRIBUTE_UNUSED = tdg4023*xformL31;\n+ \n+ CCTK_REAL csetemp110 CCTK_ATTRIBUTE_UNUSED = tdg4030*xformL01;\n+ \n+ CCTK_REAL csetemp111 CCTK_ATTRIBUTE_UNUSED = tdg4031*xformL11;\n+ \n+ CCTK_REAL csetemp112 CCTK_ATTRIBUTE_UNUSED = tdg4032*xformL21;\n+ \n+ CCTK_REAL csetemp113 CCTK_ATTRIBUTE_UNUSED = tdg4033*xformL31;\n+ \n+ CCTK_REAL csetemp114 CCTK_ATTRIBUTE_UNUSED = tdg4110*xformL01;\n+ \n+ CCTK_REAL csetemp115 CCTK_ATTRIBUTE_UNUSED = tdg4111*xformL11;\n+ \n+ CCTK_REAL csetemp116 CCTK_ATTRIBUTE_UNUSED = tdg4112*xformL21;\n+ \n+ CCTK_REAL csetemp117 CCTK_ATTRIBUTE_UNUSED = tdg4113*xformL31;\n+ \n+ CCTK_REAL csetemp118 CCTK_ATTRIBUTE_UNUSED = tdg4120*xformL01;\n+ \n+ CCTK_REAL csetemp119 CCTK_ATTRIBUTE_UNUSED = tdg4121*xformL11;\n+ \n+ CCTK_REAL csetemp120 CCTK_ATTRIBUTE_UNUSED = tdg4122*xformL21;\n+ \n+ CCTK_REAL csetemp121 CCTK_ATTRIBUTE_UNUSED = tdg4123*xformL31;\n+ \n+ CCTK_REAL csetemp122 CCTK_ATTRIBUTE_UNUSED = tdg4130*xformL01;\n+ \n+ CCTK_REAL csetemp123 CCTK_ATTRIBUTE_UNUSED = tdg4131*xformL11;\n+ \n+ CCTK_REAL csetemp124 CCTK_ATTRIBUTE_UNUSED = tdg4132*xformL21;\n+ \n+ CCTK_REAL csetemp125 CCTK_ATTRIBUTE_UNUSED = tdg4133*xformL31;\n+ \n+ CCTK_REAL csetemp126 CCTK_ATTRIBUTE_UNUSED = tdg4220*xformL01;\n+ \n+ CCTK_REAL csetemp127 CCTK_ATTRIBUTE_UNUSED = tdg4221*xformL11;\n+ \n+ CCTK_REAL csetemp128 CCTK_ATTRIBUTE_UNUSED = tdg4222*xformL21;\n+ \n+ CCTK_REAL csetemp129 CCTK_ATTRIBUTE_UNUSED = tdg4223*xformL31;\n+ \n+ CCTK_REAL csetemp130 CCTK_ATTRIBUTE_UNUSED = tdg4230*xformL01;\n+ \n+ CCTK_REAL csetemp131 CCTK_ATTRIBUTE_UNUSED = tdg4231*xformL11;\n+ \n+ CCTK_REAL csetemp132 CCTK_ATTRIBUTE_UNUSED = tdg4232*xformL21;\n+ \n+ CCTK_REAL csetemp133 CCTK_ATTRIBUTE_UNUSED = tdg4233*xformL31;\n+ \n+ CCTK_REAL csetemp134 CCTK_ATTRIBUTE_UNUSED = tdg4330*xformL01;\n+ \n+ CCTK_REAL csetemp135 CCTK_ATTRIBUTE_UNUSED = tdg4331*xformL11;\n+ \n+ CCTK_REAL csetemp136 CCTK_ATTRIBUTE_UNUSED = tdg4332*xformL21;\n+ \n+ CCTK_REAL csetemp137 CCTK_ATTRIBUTE_UNUSED = tdg4333*xformL31;\n+ \n+ CCTK_REAL dg4011 CCTK_ATTRIBUTE_UNUSED = xformL00*((csetemp100 + \n+ csetemp101 + csetemp98 + csetemp99)*xformL01 + (csetemp102 + csetemp103 \n+ + csetemp104 + csetemp105)*xformL11 + (csetemp106 + csetemp107 + \n+ csetemp108 + csetemp109)*xformL21 + (csetemp110 + csetemp111 + \n+ csetemp112 + csetemp113)*xformL31) + xformL10*((csetemp102 + csetemp103 \n+ + csetemp104 + csetemp105)*xformL01 + (csetemp114 + csetemp115 + \n+ csetemp116 + csetemp117)*xformL11 + (csetemp118 + csetemp119 + \n+ csetemp120 + csetemp121)*xformL21 + (csetemp122 + csetemp123 + \n+ csetemp124 + csetemp125)*xformL31) + xformL20*((csetemp106 + csetemp107 \n+ + csetemp108 + csetemp109)*xformL01 + (csetemp118 + csetemp119 + \n+ csetemp120 + csetemp121)*xformL11 + (csetemp126 + csetemp127 + \n+ csetemp128 + csetemp129)*xformL21 + (csetemp130 + csetemp131 + \n+ csetemp132 + csetemp133)*xformL31) + xformL30*((csetemp110 + csetemp111 \n+ + csetemp112 + csetemp113)*xformL01 + (csetemp122 + csetemp123 + \n+ csetemp124 + csetemp125)*xformL11 + (csetemp130 + csetemp131 + \n+ csetemp132 + csetemp133)*xformL21 + (csetemp134 + csetemp135 + \n+ csetemp136 + csetemp137)*xformL31);\n+ \n+ CCTK_REAL csetemp138 CCTK_ATTRIBUTE_UNUSED = tdg4000*xformL02;\n+ \n+ CCTK_REAL csetemp139 CCTK_ATTRIBUTE_UNUSED = tdg4001*xformL12;\n+ \n+ CCTK_REAL csetemp140 CCTK_ATTRIBUTE_UNUSED = tdg4002*xformL22;\n+ \n+ CCTK_REAL csetemp141 CCTK_ATTRIBUTE_UNUSED = tdg4003*xformL32;\n+ \n+ CCTK_REAL csetemp142 CCTK_ATTRIBUTE_UNUSED = tdg4010*xformL02;\n+ \n+ CCTK_REAL csetemp143 CCTK_ATTRIBUTE_UNUSED = tdg4011*xformL12;\n+ \n+ CCTK_REAL csetemp144 CCTK_ATTRIBUTE_UNUSED = tdg4012*xformL22;\n+ \n+ CCTK_REAL csetemp145 CCTK_ATTRIBUTE_UNUSED = tdg4013*xformL32;\n+ \n+ CCTK_REAL csetemp146 CCTK_ATTRIBUTE_UNUSED = tdg4020*xformL02;\n+ \n+ CCTK_REAL csetemp147 CCTK_ATTRIBUTE_UNUSED = tdg4021*xformL12;\n+ \n+ CCTK_REAL csetemp148 CCTK_ATTRIBUTE_UNUSED = tdg4022*xformL22;\n+ \n+ CCTK_REAL csetemp149 CCTK_ATTRIBUTE_UNUSED = tdg4023*xformL32;\n+ \n+ CCTK_REAL csetemp150 CCTK_ATTRIBUTE_UNUSED = tdg4030*xformL02;\n+ \n+ CCTK_REAL csetemp151 CCTK_ATTRIBUTE_UNUSED = tdg4031*xformL12;\n+ \n+ CCTK_REAL csetemp152 CCTK_ATTRIBUTE_UNUSED = tdg4032*xformL22;\n+ \n+ CCTK_REAL csetemp153 CCTK_ATTRIBUTE_UNUSED = tdg4033*xformL32;\n+ \n+ CCTK_REAL csetemp154 CCTK_ATTRIBUTE_UNUSED = tdg4110*xformL02;\n+ \n+ CCTK_REAL csetemp155 CCTK_ATTRIBUTE_UNUSED = tdg4111*xformL12;\n+ \n+ CCTK_REAL csetemp156 CCTK_ATTRIBUTE_UNUSED = tdg4112*xformL22;\n+ \n+ CCTK_REAL csetemp157 CCTK_ATTRIBUTE_UNUSED = tdg4113*xformL32;\n+ \n+ CCTK_REAL csetemp158 CCTK_ATTRIBUTE_UNUSED = tdg4120*xformL02;\n+ \n+ CCTK_REAL csetemp159 CCTK_ATTRIBUTE_UNUSED = tdg4121*xformL12;\n+ \n+ CCTK_REAL csetemp160 CCTK_ATTRIBUTE_UNUSED = tdg4122*xformL22;\n+ \n+ CCTK_REAL csetemp161 CCTK_ATTRIBUTE_UNUSED = tdg4123*xformL32;\n+ \n+ CCTK_REAL csetemp162 CCTK_ATTRIBUTE_UNUSED = tdg4130*xformL02;\n+ \n+ CCTK_REAL csetemp163 CCTK_ATTRIBUTE_UNUSED = tdg4131*xformL12;\n+ \n+ CCTK_REAL csetemp164 CCTK_ATTRIBUTE_UNUSED = tdg4132*xformL22;\n+ \n+ CCTK_REAL csetemp165 CCTK_ATTRIBUTE_UNUSED = tdg4133*xformL32;\n+ \n+ CCTK_REAL csetemp166 CCTK_ATTRIBUTE_UNUSED = tdg4220*xformL02;\n+ \n+ CCTK_REAL csetemp167 CCTK_ATTRIBUTE_UNUSED = tdg4221*xformL12;\n+ \n+ CCTK_REAL csetemp168 CCTK_ATTRIBUTE_UNUSED = tdg4222*xformL22;\n+ \n+ CCTK_REAL csetemp169 CCTK_ATTRIBUTE_UNUSED = tdg4223*xformL32;\n+ \n+ CCTK_REAL csetemp170 CCTK_ATTRIBUTE_UNUSED = tdg4230*xformL02;\n+ \n+ CCTK_REAL csetemp171 CCTK_ATTRIBUTE_UNUSED = tdg4231*xformL12;\n+ \n+ CCTK_REAL csetemp172 CCTK_ATTRIBUTE_UNUSED = tdg4232*xformL22;\n+ \n+ CCTK_REAL csetemp173 CCTK_ATTRIBUTE_UNUSED = tdg4233*xformL32;\n+ \n+ CCTK_REAL csetemp174 CCTK_ATTRIBUTE_UNUSED = tdg4330*xformL02;\n+ \n+ CCTK_REAL csetemp175 CCTK_ATTRIBUTE_UNUSED = tdg4331*xformL12;\n+ \n+ CCTK_REAL csetemp176 CCTK_ATTRIBUTE_UNUSED = tdg4332*xformL22;\n+ \n+ CCTK_REAL csetemp177 CCTK_ATTRIBUTE_UNUSED = tdg4333*xformL32;\n+ \n+ CCTK_REAL dg4012 CCTK_ATTRIBUTE_UNUSED = xformL00*((csetemp138 + \n+ csetemp139 + csetemp140 + csetemp141)*xformL01 + (csetemp142 + \n+ csetemp143 + csetemp144 + csetemp145)*xformL11 + (csetemp146 + \n+ csetemp147 + csetemp148 + csetemp149)*xformL21 + (csetemp150 + \n+ csetemp151 + csetemp152 + csetemp153)*xformL31) + xformL10*((csetemp142 \n+ + csetemp143 + csetemp144 + csetemp145)*xformL01 + (csetemp154 + \n+ csetemp155 + csetemp156 + csetemp157)*xformL11 + (csetemp158 + \n+ csetemp159 + csetemp160 + csetemp161)*xformL21 + (csetemp162 + \n+ csetemp163 + csetemp164 + csetemp165)*xformL31) + xformL20*((csetemp146 \n+ + csetemp147 + csetemp148 + csetemp149)*xformL01 + (csetemp158 + \n+ csetemp159 + csetemp160 + csetemp161)*xformL11 + (csetemp166 + \n+ csetemp167 + csetemp168 + csetemp169)*xformL21 + (csetemp170 + \n+ csetemp171 + csetemp172 + csetemp173)*xformL31) + xformL30*((csetemp150 \n+ + csetemp151 + csetemp152 + csetemp153)*xformL01 + (csetemp162 + \n+ csetemp163 + csetemp164 + csetemp165)*xformL11 + (csetemp170 + \n+ csetemp171 + csetemp172 + csetemp173)*xformL21 + (csetemp174 + \n+ csetemp175 + csetemp176 + csetemp177)*xformL31);\n+ \n+ CCTK_REAL csetemp178 CCTK_ATTRIBUTE_UNUSED = tdg4000*xformL03;\n+ \n+ CCTK_REAL csetemp179 CCTK_ATTRIBUTE_UNUSED = tdg4001*xformL13;\n+ \n+ CCTK_REAL csetemp180 CCTK_ATTRIBUTE_UNUSED = tdg4002*xformL23;\n+ \n+ CCTK_REAL csetemp181 CCTK_ATTRIBUTE_UNUSED = tdg4003*xformL33;\n+ \n+ CCTK_REAL csetemp182 CCTK_ATTRIBUTE_UNUSED = tdg4010*xformL03;\n+ \n+ CCTK_REAL csetemp183 CCTK_ATTRIBUTE_UNUSED = tdg4011*xformL13;\n+ \n+ CCTK_REAL csetemp184 CCTK_ATTRIBUTE_UNUSED = tdg4012*xformL23;\n+ \n+ CCTK_REAL csetemp185 CCTK_ATTRIBUTE_UNUSED = tdg4013*xformL33;\n+ \n+ CCTK_REAL csetemp186 CCTK_ATTRIBUTE_UNUSED = tdg4020*xformL03;\n+ \n+ CCTK_REAL csetemp187 CCTK_ATTRIBUTE_UNUSED = tdg4021*xformL13;\n+ \n+ CCTK_REAL csetemp188 CCTK_ATTRIBUTE_UNUSED = tdg4022*xformL23;\n+ \n+ CCTK_REAL csetemp189 CCTK_ATTRIBUTE_UNUSED = tdg4023*xformL33;\n+ \n+ CCTK_REAL csetemp190 CCTK_ATTRIBUTE_UNUSED = tdg4030*xformL03;\n+ \n+ CCTK_REAL csetemp191 CCTK_ATTRIBUTE_UNUSED = tdg4031*xformL13;\n+ \n+ CCTK_REAL csetemp192 CCTK_ATTRIBUTE_UNUSED = tdg4032*xformL23;\n+ \n+ CCTK_REAL csetemp193 CCTK_ATTRIBUTE_UNUSED = tdg4033*xformL33;\n+ \n+ CCTK_REAL csetemp194 CCTK_ATTRIBUTE_UNUSED = tdg4110*xformL03;\n+ \n+ CCTK_REAL csetemp195 CCTK_ATTRIBUTE_UNUSED = tdg4111*xformL13;\n+ \n+ CCTK_REAL csetemp196 CCTK_ATTRIBUTE_UNUSED = tdg4112*xformL23;\n+ \n+ CCTK_REAL csetemp197 CCTK_ATTRIBUTE_UNUSED = tdg4113*xformL33;\n+ \n+ CCTK_REAL csetemp198 CCTK_ATTRIBUTE_UNUSED = tdg4120*xformL03;\n+ \n+ CCTK_REAL csetemp199 CCTK_ATTRIBUTE_UNUSED = tdg4121*xformL13;\n+ \n+ CCTK_REAL csetemp200 CCTK_ATTRIBUTE_UNUSED = tdg4122*xformL23;\n+ \n+ CCTK_REAL csetemp201 CCTK_ATTRIBUTE_UNUSED = tdg4123*xformL33;\n+ \n+ CCTK_REAL csetemp202 CCTK_ATTRIBUTE_UNUSED = tdg4130*xformL03;\n+ \n+ CCTK_REAL csetemp203 CCTK_ATTRIBUTE_UNUSED = tdg4131*xformL13;\n+ \n+ CCTK_REAL csetemp204 CCTK_ATTRIBUTE_UNUSED = tdg4132*xformL23;\n+ \n+ CCTK_REAL csetemp205 CCTK_ATTRIBUTE_UNUSED = tdg4133*xformL33;\n+ \n+ CCTK_REAL csetemp206 CCTK_ATTRIBUTE_UNUSED = tdg4220*xformL03;\n+ \n+ CCTK_REAL csetemp207 CCTK_ATTRIBUTE_UNUSED = tdg4221*xformL13;\n+ \n+ CCTK_REAL csetemp208 CCTK_ATTRIBUTE_UNUSED = tdg4222*xformL23;\n+ \n+ CCTK_REAL csetemp209 CCTK_ATTRIBUTE_UNUSED = tdg4223*xformL33;\n+ \n+ CCTK_REAL csetemp210 CCTK_ATTRIBUTE_UNUSED = tdg4230*xformL03;\n+ \n+ CCTK_REAL csetemp211 CCTK_ATTRIBUTE_UNUSED = tdg4231*xformL13;\n+ \n+ CCTK_REAL csetemp212 CCTK_ATTRIBUTE_UNUSED = tdg4232*xformL23;\n+ \n+ CCTK_REAL csetemp213 CCTK_ATTRIBUTE_UNUSED = tdg4233*xformL33;\n+ \n+ CCTK_REAL csetemp214 CCTK_ATTRIBUTE_UNUSED = tdg4330*xformL03;\n+ \n+ CCTK_REAL csetemp215 CCTK_ATTRIBUTE_UNUSED = tdg4331*xformL13;\n+ \n+ CCTK_REAL csetemp216 CCTK_ATTRIBUTE_UNUSED = tdg4332*xformL23;\n+ \n+ CCTK_REAL csetemp217 CCTK_ATTRIBUTE_UNUSED = tdg4333*xformL33;\n+ \n+ CCTK_REAL dg4013 CCTK_ATTRIBUTE_UNUSED = xformL00*((csetemp178 + \n+ csetemp179 + csetemp180 + csetemp181)*xformL01 + (csetemp182 + \n+ csetemp183 + csetemp184 + csetemp185)*xformL11 + (csetemp186 + \n+ csetemp187 + csetemp188 + csetemp189)*xformL21 + (csetemp190 + \n+ csetemp191 + csetemp192 + csetemp193)*xformL31) + xformL10*((csetemp182 \n+ + csetemp183 + csetemp184 + csetemp185)*xformL01 + (csetemp194 + \n+ csetemp195 + csetemp196 + csetemp197)*xformL11 + (csetemp198 + \n+ csetemp199 + csetemp200 + csetemp201)*xformL21 + (csetemp202 + \n+ csetemp203 + csetemp204 + csetemp205)*xformL31) + xformL20*((csetemp186 \n+ + csetemp187 + csetemp188 + csetemp189)*xformL01 + (csetemp198 + \n+ csetemp199 + csetemp200 + csetemp201)*xformL11 + (csetemp206 + \n+ csetemp207 + csetemp208 + csetemp209)*xformL21 + (csetemp210 + \n+ csetemp211 + csetemp212 + csetemp213)*xformL31) + xformL30*((csetemp190 \n+ + csetemp191 + csetemp192 + csetemp193)*xformL01 + (csetemp202 + \n+ csetemp203 + csetemp204 + csetemp205)*xformL11 + (csetemp210 + \n+ csetemp211 + csetemp212 + csetemp213)*xformL21 + (csetemp214 + \n+ csetemp215 + csetemp216 + csetemp217)*xformL31);\n+ \n+ CCTK_REAL dg4020 CCTK_ATTRIBUTE_UNUSED = xformL00*((csetemp58 + \n+ csetemp59 + csetemp60 + csetemp61)*xformL02 + (csetemp62 + csetemp63 + \n+ csetemp64 + csetemp65)*xformL12 + (csetemp66 + csetemp67 + csetemp68 + \n+ csetemp69)*xformL22 + (csetemp70 + csetemp71 + csetemp72 + \n+ csetemp73)*xformL32) + xformL10*((csetemp62 + csetemp63 + csetemp64 + \n+ csetemp65)*xformL02 + (csetemp74 + csetemp75 + csetemp76 + \n+ csetemp77)*xformL12 + (csetemp78 + csetemp79 + csetemp80 + \n+ csetemp81)*xformL22 + (csetemp82 + csetemp83 + csetemp84 + \n+ csetemp85)*xformL32) + xformL20*((csetemp66 + csetemp67 + csetemp68 + \n+ csetemp69)*xformL02 + (csetemp78 + csetemp79 + csetemp80 + \n+ csetemp81)*xformL12 + (csetemp86 + csetemp87 + csetemp88 + \n+ csetemp89)*xformL22 + (csetemp90 + csetemp91 + csetemp92 + \n+ csetemp93)*xformL32) + xformL30*((csetemp70 + csetemp71 + csetemp72 + \n+ csetemp73)*xformL02 + (csetemp82 + csetemp83 + csetemp84 + \n+ csetemp85)*xformL12 + (csetemp90 + csetemp91 + csetemp92 + \n+ csetemp93)*xformL22 + (csetemp94 + csetemp95 + csetemp96 + \n+ csetemp97)*xformL32);\n+ \n+ CCTK_REAL dg4021 CCTK_ATTRIBUTE_UNUSED = xformL00*((csetemp100 + \n+ csetemp101 + csetemp98 + csetemp99)*xformL02 + (csetemp102 + csetemp103 \n+ + csetemp104 + csetemp105)*xformL12 + (csetemp106 + csetemp107 + \n+ csetemp108 + csetemp109)*xformL22 + (csetemp110 + csetemp111 + \n+ csetemp112 + csetemp113)*xformL32) + xformL10*((csetemp102 + csetemp103 \n+ + csetemp104 + csetemp105)*xformL02 + (csetemp114 + csetemp115 + \n+ csetemp116 + csetemp117)*xformL12 + (csetemp118 + csetemp119 + \n+ csetemp120 + csetemp121)*xformL22 + (csetemp122 + csetemp123 + \n+ csetemp124 + csetemp125)*xformL32) + xformL20*((csetemp106 + csetemp107 \n+ + csetemp108 + csetemp109)*xformL02 + (csetemp118 + csetemp119 + \n+ csetemp120 + csetemp121)*xformL12 + (csetemp126 + csetemp127 + \n+ csetemp128 + csetemp129)*xformL22 + (csetemp130 + csetemp131 + \n+ csetemp132 + csetemp133)*xformL32) + xformL30*((csetemp110 + csetemp111 \n+ + csetemp112 + csetemp113)*xformL02 + (csetemp122 + csetemp123 + \n+ csetemp124 + csetemp125)*xformL12 + (csetemp130 + csetemp131 + \n+ csetemp132 + csetemp133)*xformL22 + (csetemp134 + csetemp135 + \n+ csetemp136 + csetemp137)*xformL32);\n+ \n+ CCTK_REAL dg4022 CCTK_ATTRIBUTE_UNUSED = xformL00*((csetemp138 + \n+ csetemp139 + csetemp140 + csetemp141)*xformL02 + (csetemp142 + \n+ csetemp143 + csetemp144 + csetemp145)*xformL12 + (csetemp146 + \n+ csetemp147 + csetemp148 + csetemp149)*xformL22 + (csetemp150 + \n+ csetemp151 + csetemp152 + csetemp153)*xformL32) + xformL10*((csetemp142 \n+ + csetemp143 + csetemp144 + csetemp145)*xformL02 + (csetemp154 + \n+ csetemp155 + csetemp156 + csetemp157)*xformL12 + (csetemp158 + \n+ csetemp159 + csetemp160 + csetemp161)*xformL22 + (csetemp162 + \n+ csetemp163 + csetemp164 + csetemp165)*xformL32) + xformL20*((csetemp146 \n+ + csetemp147 + csetemp148 + csetemp149)*xformL02 + (csetemp158 + \n+ csetemp159 + csetemp160 + csetemp161)*xformL12 + (csetemp166 + \n+ csetemp167 + csetemp168 + csetemp169)*xformL22 + (csetemp170 + \n+ csetemp171 + csetemp172 + csetemp173)*xformL32) + xformL30*((csetemp150 \n+ + csetemp151 + csetemp152 + csetemp153)*xformL02 + (csetemp162 + \n+ csetemp163 + csetemp164 + csetemp165)*xformL12 + (csetemp170 + \n+ csetemp171 + csetemp172 + csetemp173)*xformL22 + (csetemp174 + \n+ csetemp175 + csetemp176 + csetemp177)*xformL32);\n+ \n+ CCTK_REAL dg4023 CCTK_ATTRIBUTE_UNUSED = xformL00*((csetemp178 + \n+ csetemp179 + csetemp180 + csetemp181)*xformL02 + (csetemp182 + \n+ csetemp183 + csetemp184 + csetemp185)*xformL12 + (csetemp186 + \n+ csetemp187 + csetemp188 + csetemp189)*xformL22 + (csetemp190 + \n+ csetemp191 + csetemp192 + csetemp193)*xformL32) + xformL10*((csetemp182 \n+ + csetemp183 + csetemp184 + csetemp185)*xformL02 + (csetemp194 + \n+ csetemp195 + csetemp196 + csetemp197)*xformL12 + (csetemp198 + \n+ csetemp199 + csetemp200 + csetemp201)*xformL22 + (csetemp202 + \n+ csetemp203 + csetemp204 + csetemp205)*xformL32) + xformL20*((csetemp186 \n+ + csetemp187 + csetemp188 + csetemp189)*xformL02 + (csetemp198 + \n+ csetemp199 + csetemp200 + csetemp201)*xformL12 + (csetemp206 + \n+ csetemp207 + csetemp208 + csetemp209)*xformL22 + (csetemp210 + \n+ csetemp211 + csetemp212 + csetemp213)*xformL32) + xformL30*((csetemp190 \n+ + csetemp191 + csetemp192 + csetemp193)*xformL02 + (csetemp202 + \n+ csetemp203 + csetemp204 + csetemp205)*xformL12 + (csetemp210 + \n+ csetemp211 + csetemp212 + csetemp213)*xformL22 + (csetemp214 + \n+ csetemp215 + csetemp216 + csetemp217)*xformL32);\n+ \n+ CCTK_REAL dg4030 CCTK_ATTRIBUTE_UNUSED = xformL00*((csetemp58 + \n+ csetemp59 + csetemp60 + csetemp61)*xformL03 + (csetemp62 + csetemp63 + \n+ csetemp64 + csetemp65)*xformL13 + (csetemp66 + csetemp67 + csetemp68 + \n+ csetemp69)*xformL23 + (csetemp70 + csetemp71 + csetemp72 + \n+ csetemp73)*xformL33) + xformL10*((csetemp62 + csetemp63 + csetemp64 + \n+ csetemp65)*xformL03 + (csetemp74 + csetemp75 + csetemp76 + \n+ csetemp77)*xformL13 + (csetemp78 + csetemp79 + csetemp80 + \n+ csetemp81)*xformL23 + (csetemp82 + csetemp83 + csetemp84 + \n+ csetemp85)*xformL33) + xformL20*((csetemp66 + csetemp67 + csetemp68 + \n+ csetemp69)*xformL03 + (csetemp78 + csetemp79 + csetemp80 + \n+ csetemp81)*xformL13 + (csetemp86 + csetemp87 + csetemp88 + \n+ csetemp89)*xformL23 + (csetemp90 + csetemp91 + csetemp92 + \n+ csetemp93)*xformL33) + xformL30*((csetemp70 + csetemp71 + csetemp72 + \n+ csetemp73)*xformL03 + (csetemp82 + csetemp83 + csetemp84 + \n+ csetemp85)*xformL13 + (csetemp90 + csetemp91 + csetemp92 + \n+ csetemp93)*xformL23 + (csetemp94 + csetemp95 + csetemp96 + \n+ csetemp97)*xformL33);\n+ \n+ CCTK_REAL dg4031 CCTK_ATTRIBUTE_UNUSED = xformL00*((csetemp100 + \n+ csetemp101 + csetemp98 + csetemp99)*xformL03 + (csetemp102 + csetemp103 \n+ + csetemp104 + csetemp105)*xformL13 + (csetemp106 + csetemp107 + \n+ csetemp108 + csetemp109)*xformL23 + (csetemp110 + csetemp111 + \n+ csetemp112 + csetemp113)*xformL33) + xformL10*((csetemp102 + csetemp103 \n+ + csetemp104 + csetemp105)*xformL03 + (csetemp114 + csetemp115 + \n+ csetemp116 + csetemp117)*xformL13 + (csetemp118 + csetemp119 + \n+ csetemp120 + csetemp121)*xformL23 + (csetemp122 + csetemp123 + \n+ csetemp124 + csetemp125)*xformL33) + xformL20*((csetemp106 + csetemp107 \n+ + csetemp108 + csetemp109)*xformL03 + (csetemp118 + csetemp119 + \n+ csetemp120 + csetemp121)*xformL13 + (csetemp126 + csetemp127 + \n+ csetemp128 + csetemp129)*xformL23 + (csetemp130 + csetemp131 + \n+ csetemp132 + csetemp133)*xformL33) + xformL30*((csetemp110 + csetemp111 \n+ + csetemp112 + csetemp113)*xformL03 + (csetemp122 + csetemp123 + \n+ csetemp124 + csetemp125)*xformL13 + (csetemp130 + csetemp131 + \n+ csetemp132 + csetemp133)*xformL23 + (csetemp134 + csetemp135 + \n+ csetemp136 + csetemp137)*xformL33);\n+ \n+ CCTK_REAL dg4032 CCTK_ATTRIBUTE_UNUSED = xformL00*((csetemp138 + \n+ csetemp139 + csetemp140 + csetemp141)*xformL03 + (csetemp142 + \n+ csetemp143 + csetemp144 + csetemp145)*xformL13 + (csetemp146 + \n+ csetemp147 + csetemp148 + csetemp149)*xformL23 + (csetemp150 + \n+ csetemp151 + csetemp152 + csetemp153)*xformL33) + xformL10*((csetemp142 \n+ + csetemp143 + csetemp144 + csetemp145)*xformL03 + (csetemp154 + \n+ csetemp155 + csetemp156 + csetemp157)*xformL13 + (csetemp158 + \n+ csetemp159 + csetemp160 + csetemp161)*xformL23 + (csetemp162 + \n+ csetemp163 + csetemp164 + csetemp165)*xformL33) + xformL20*((csetemp146 \n+ + csetemp147 + csetemp148 + csetemp149)*xformL03 + (csetemp158 + \n+ csetemp159 + csetemp160 + csetemp161)*xformL13 + (csetemp166 + \n+ csetemp167 + csetemp168 + csetemp169)*xformL23 + (csetemp170 + \n+ csetemp171 + csetemp172 + csetemp173)*xformL33) + xformL30*((csetemp150 \n+ + csetemp151 + csetemp152 + csetemp153)*xformL03 + (csetemp162 + \n+ csetemp163 + csetemp164 + csetemp165)*xformL13 + (csetemp170 + \n+ csetemp171 + csetemp172 + csetemp173)*xformL23 + (csetemp174 + \n+ csetemp175 + csetemp176 + csetemp177)*xformL33);\n+ \n+ CCTK_REAL dg4033 CCTK_ATTRIBUTE_UNUSED = xformL00*((csetemp178 + \n+ csetemp179 + csetemp180 + csetemp181)*xformL03 + (csetemp182 + \n+ csetemp183 + csetemp184 + csetemp185)*xformL13 + (csetemp186 + \n+ csetemp187 + csetemp188 + csetemp189)*xformL23 + (csetemp190 + \n+ csetemp191 + csetemp192 + csetemp193)*xformL33) + xformL10*((csetemp182 \n+ + csetemp183 + csetemp184 + csetemp185)*xformL03 + (csetemp194 + \n+ csetemp195 + csetemp196 + csetemp197)*xformL13 + (csetemp198 + \n+ csetemp199 + csetemp200 + csetemp201)*xformL23 + (csetemp202 + \n+ csetemp203 + csetemp204 + csetemp205)*xformL33) + xformL20*((csetemp186 \n+ + csetemp187 + csetemp188 + csetemp189)*xformL03 + (csetemp198 + \n+ csetemp199 + csetemp200 + csetemp201)*xformL13 + (csetemp206 + \n+ csetemp207 + csetemp208 + csetemp209)*xformL23 + (csetemp210 + \n+ csetemp211 + csetemp212 + csetemp213)*xformL33) + xformL30*((csetemp190 \n+ + csetemp191 + csetemp192 + csetemp193)*xformL03 + (csetemp202 + \n+ csetemp203 + csetemp204 + csetemp205)*xformL13 + (csetemp210 + \n+ csetemp211 + csetemp212 + csetemp213)*xformL23 + (csetemp214 + \n+ csetemp215 + csetemp216 + csetemp217)*xformL33);\n+ \n+ CCTK_REAL dg4110 CCTK_ATTRIBUTE_UNUSED = xformL01*((csetemp58 + \n+ csetemp59 + csetemp60 + csetemp61)*xformL01 + (csetemp62 + csetemp63 + \n+ csetemp64 + csetemp65)*xformL11 + (csetemp66 + csetemp67 + csetemp68 + \n+ csetemp69)*xformL21 + (csetemp70 + csetemp71 + csetemp72 + \n+ csetemp73)*xformL31) + xformL11*((csetemp62 + csetemp63 + csetemp64 + \n+ csetemp65)*xformL01 + (csetemp74 + csetemp75 + csetemp76 + \n+ csetemp77)*xformL11 + (csetemp78 + csetemp79 + csetemp80 + \n+ csetemp81)*xformL21 + (csetemp82 + csetemp83 + csetemp84 + \n+ csetemp85)*xformL31) + xformL21*((csetemp66 + csetemp67 + csetemp68 + \n+ csetemp69)*xformL01 + (csetemp78 + csetemp79 + csetemp80 + \n+ csetemp81)*xformL11 + (csetemp86 + csetemp87 + csetemp88 + \n+ csetemp89)*xformL21 + (csetemp90 + csetemp91 + csetemp92 + \n+ csetemp93)*xformL31) + xformL31*((csetemp70 + csetemp71 + csetemp72 + \n+ csetemp73)*xformL01 + (csetemp82 + csetemp83 + csetemp84 + \n+ csetemp85)*xformL11 + (csetemp90 + csetemp91 + csetemp92 + \n+ csetemp93)*xformL21 + (csetemp94 + csetemp95 + csetemp96 + \n+ csetemp97)*xformL31);\n+ \n+ CCTK_REAL dg4111 CCTK_ATTRIBUTE_UNUSED = xformL01*((csetemp100 + \n+ csetemp101 + csetemp98 + csetemp99)*xformL01 + (csetemp102 + csetemp103 \n+ + csetemp104 + csetemp105)*xformL11 + (csetemp106 + csetemp107 + \n+ csetemp108 + csetemp109)*xformL21 + (csetemp110 + csetemp111 + \n+ csetemp112 + csetemp113)*xformL31) + xformL11*((csetemp102 + csetemp103 \n+ + csetemp104 + csetemp105)*xformL01 + (csetemp114 + csetemp115 + \n+ csetemp116 + csetemp117)*xformL11 + (csetemp118 + csetemp119 + \n+ csetemp120 + csetemp121)*xformL21 + (csetemp122 + csetemp123 + \n+ csetemp124 + csetemp125)*xformL31) + xformL21*((csetemp106 + csetemp107 \n+ + csetemp108 + csetemp109)*xformL01 + (csetemp118 + csetemp119 + \n+ csetemp120 + csetemp121)*xformL11 + (csetemp126 + csetemp127 + \n+ csetemp128 + csetemp129)*xformL21 + (csetemp130 + csetemp131 + \n+ csetemp132 + csetemp133)*xformL31) + xformL31*((csetemp110 + csetemp111 \n+ + csetemp112 + csetemp113)*xformL01 + (csetemp122 + csetemp123 + \n+ csetemp124 + csetemp125)*xformL11 + (csetemp130 + csetemp131 + \n+ csetemp132 + csetemp133)*xformL21 + (csetemp134 + csetemp135 + \n+ csetemp136 + csetemp137)*xformL31);\n+ \n+ CCTK_REAL dg4112 CCTK_ATTRIBUTE_UNUSED = xformL01*((csetemp138 + \n+ csetemp139 + csetemp140 + csetemp141)*xformL01 + (csetemp142 + \n+ csetemp143 + csetemp144 + csetemp145)*xformL11 + (csetemp146 + \n+ csetemp147 + csetemp148 + csetemp149)*xformL21 + (csetemp150 + \n+ csetemp151 + csetemp152 + csetemp153)*xformL31) + xformL11*((csetemp142 \n+ + csetemp143 + csetemp144 + csetemp145)*xformL01 + (csetemp154 + \n+ csetemp155 + csetemp156 + csetemp157)*xformL11 + (csetemp158 + \n+ csetemp159 + csetemp160 + csetemp161)*xformL21 + (csetemp162 + \n+ csetemp163 + csetemp164 + csetemp165)*xformL31) + xformL21*((csetemp146 \n+ + csetemp147 + csetemp148 + csetemp149)*xformL01 + (csetemp158 + \n+ csetemp159 + csetemp160 + csetemp161)*xformL11 + (csetemp166 + \n+ csetemp167 + csetemp168 + csetemp169)*xformL21 + (csetemp170 + \n+ csetemp171 + csetemp172 + csetemp173)*xformL31) + xformL31*((csetemp150 \n+ + csetemp151 + csetemp152 + csetemp153)*xformL01 + (csetemp162 + \n+ csetemp163 + csetemp164 + csetemp165)*xformL11 + (csetemp170 + \n+ csetemp171 + csetemp172 + csetemp173)*xformL21 + (csetemp174 + \n+ csetemp175 + csetemp176 + csetemp177)*xformL31);\n+ \n+ CCTK_REAL dg4113 CCTK_ATTRIBUTE_UNUSED = xformL01*((csetemp178 + \n+ csetemp179 + csetemp180 + csetemp181)*xformL01 + (csetemp182 + \n+ csetemp183 + csetemp184 + csetemp185)*xformL11 + (csetemp186 + \n+ csetemp187 + csetemp188 + csetemp189)*xformL21 + (csetemp190 + \n+ csetemp191 + csetemp192 + csetemp193)*xformL31) + xformL11*((csetemp182 \n+ + csetemp183 + csetemp184 + csetemp185)*xformL01 + (csetemp194 + \n+ csetemp195 + csetemp196 + csetemp197)*xformL11 + (csetemp198 + \n+ csetemp199 + csetemp200 + csetemp201)*xformL21 + (csetemp202 + \n+ csetemp203 + csetemp204 + csetemp205)*xformL31) + xformL21*((csetemp186 \n+ + csetemp187 + csetemp188 + csetemp189)*xformL01 + (csetemp198 + \n+ csetemp199 + csetemp200 + csetemp201)*xformL11 + (csetemp206 + \n+ csetemp207 + csetemp208 + csetemp209)*xformL21 + (csetemp210 + \n+ csetemp211 + csetemp212 + csetemp213)*xformL31) + xformL31*((csetemp190 \n+ + csetemp191 + csetemp192 + csetemp193)*xformL01 + (csetemp202 + \n+ csetemp203 + csetemp204 + csetemp205)*xformL11 + (csetemp210 + \n+ csetemp211 + csetemp212 + csetemp213)*xformL21 + (csetemp214 + \n+ csetemp215 + csetemp216 + csetemp217)*xformL31);\n+ \n+ CCTK_REAL dg4120 CCTK_ATTRIBUTE_UNUSED = xformL01*((csetemp58 + \n+ csetemp59 + csetemp60 + csetemp61)*xformL02 + (csetemp62 + csetemp63 + \n+ csetemp64 + csetemp65)*xformL12 + (csetemp66 + csetemp67 + csetemp68 + \n+ csetemp69)*xformL22 + (csetemp70 + csetemp71 + csetemp72 + \n+ csetemp73)*xformL32) + xformL11*((csetemp62 + csetemp63 + csetemp64 + \n+ csetemp65)*xformL02 + (csetemp74 + csetemp75 + csetemp76 + \n+ csetemp77)*xformL12 + (csetemp78 + csetemp79 + csetemp80 + \n+ csetemp81)*xformL22 + (csetemp82 + csetemp83 + csetemp84 + \n+ csetemp85)*xformL32) + xformL21*((csetemp66 + csetemp67 + csetemp68 + \n+ csetemp69)*xformL02 + (csetemp78 + csetemp79 + csetemp80 + \n+ csetemp81)*xformL12 + (csetemp86 + csetemp87 + csetemp88 + \n+ csetemp89)*xformL22 + (csetemp90 + csetemp91 + csetemp92 + \n+ csetemp93)*xformL32) + xformL31*((csetemp70 + csetemp71 + csetemp72 + \n+ csetemp73)*xformL02 + (csetemp82 + csetemp83 + csetemp84 + \n+ csetemp85)*xformL12 + (csetemp90 + csetemp91 + csetemp92 + \n+ csetemp93)*xformL22 + (csetemp94 + csetemp95 + csetemp96 + \n+ csetemp97)*xformL32);\n+ \n+ CCTK_REAL dg4121 CCTK_ATTRIBUTE_UNUSED = xformL01*((csetemp100 + \n+ csetemp101 + csetemp98 + csetemp99)*xformL02 + (csetemp102 + csetemp103 \n+ + csetemp104 + csetemp105)*xformL12 + (csetemp106 + csetemp107 + \n+ csetemp108 + csetemp109)*xformL22 + (csetemp110 + csetemp111 + \n+ csetemp112 + csetemp113)*xformL32) + xformL11*((csetemp102 + csetemp103 \n+ + csetemp104 + csetemp105)*xformL02 + (csetemp114 + csetemp115 + \n+ csetemp116 + csetemp117)*xformL12 + (csetemp118 + csetemp119 + \n+ csetemp120 + csetemp121)*xformL22 + (csetemp122 + csetemp123 + \n+ csetemp124 + csetemp125)*xformL32) + xformL21*((csetemp106 + csetemp107 \n+ + csetemp108 + csetemp109)*xformL02 + (csetemp118 + csetemp119 + \n+ csetemp120 + csetemp121)*xformL12 + (csetemp126 + csetemp127 + \n+ csetemp128 + csetemp129)*xformL22 + (csetemp130 + csetemp131 + \n+ csetemp132 + csetemp133)*xformL32) + xformL31*((csetemp110 + csetemp111 \n+ + csetemp112 + csetemp113)*xformL02 + (csetemp122 + csetemp123 + \n+ csetemp124 + csetemp125)*xformL12 + (csetemp130 + csetemp131 + \n+ csetemp132 + csetemp133)*xformL22 + (csetemp134 + csetemp135 + \n+ csetemp136 + csetemp137)*xformL32);\n+ \n+ CCTK_REAL dg4122 CCTK_ATTRIBUTE_UNUSED = xformL01*((csetemp138 + \n+ csetemp139 + csetemp140 + csetemp141)*xformL02 + (csetemp142 + \n+ csetemp143 + csetemp144 + csetemp145)*xformL12 + (csetemp146 + \n+ csetemp147 + csetemp148 + csetemp149)*xformL22 + (csetemp150 + \n+ csetemp151 + csetemp152 + csetemp153)*xformL32) + xformL11*((csetemp142 \n+ + csetemp143 + csetemp144 + csetemp145)*xformL02 + (csetemp154 + \n+ csetemp155 + csetemp156 + csetemp157)*xformL12 + (csetemp158 + \n+ csetemp159 + csetemp160 + csetemp161)*xformL22 + (csetemp162 + \n+ csetemp163 + csetemp164 + csetemp165)*xformL32) + xformL21*((csetemp146 \n+ + csetemp147 + csetemp148 + csetemp149)*xformL02 + (csetemp158 + \n+ csetemp159 + csetemp160 + csetemp161)*xformL12 + (csetemp166 + \n+ csetemp167 + csetemp168 + csetemp169)*xformL22 + (csetemp170 + \n+ csetemp171 + csetemp172 + csetemp173)*xformL32) + xformL31*((csetemp150 \n+ + csetemp151 + csetemp152 + csetemp153)*xformL02 + (csetemp162 + \n+ csetemp163 + csetemp164 + csetemp165)*xformL12 + (csetemp170 + \n+ csetemp171 + csetemp172 + csetemp173)*xformL22 + (csetemp174 + \n+ csetemp175 + csetemp176 + csetemp177)*xformL32);\n+ \n+ CCTK_REAL dg4123 CCTK_ATTRIBUTE_UNUSED = xformL01*((csetemp178 + \n+ csetemp179 + csetemp180 + csetemp181)*xformL02 + (csetemp182 + \n+ csetemp183 + csetemp184 + csetemp185)*xformL12 + (csetemp186 + \n+ csetemp187 + csetemp188 + csetemp189)*xformL22 + (csetemp190 + \n+ csetemp191 + csetemp192 + csetemp193)*xformL32) + xformL11*((csetemp182 \n+ + csetemp183 + csetemp184 + csetemp185)*xformL02 + (csetemp194 + \n+ csetemp195 + csetemp196 + csetemp197)*xformL12 + (csetemp198 + \n+ csetemp199 + csetemp200 + csetemp201)*xformL22 + (csetemp202 + \n+ csetemp203 + csetemp204 + csetemp205)*xformL32) + xformL21*((csetemp186 \n+ + csetemp187 + csetemp188 + csetemp189)*xformL02 + (csetemp198 + \n+ csetemp199 + csetemp200 + csetemp201)*xformL12 + (csetemp206 + \n+ csetemp207 + csetemp208 + csetemp209)*xformL22 + (csetemp210 + \n+ csetemp211 + csetemp212 + csetemp213)*xformL32) + xformL31*((csetemp190 \n+ + csetemp191 + csetemp192 + csetemp193)*xformL02 + (csetemp202 + \n+ csetemp203 + csetemp204 + csetemp205)*xformL12 + (csetemp210 + \n+ csetemp211 + csetemp212 + csetemp213)*xformL22 + (csetemp214 + \n+ csetemp215 + csetemp216 + csetemp217)*xformL32);\n+ \n+ CCTK_REAL dg4130 CCTK_ATTRIBUTE_UNUSED = xformL01*((csetemp58 + \n+ csetemp59 + csetemp60 + csetemp61)*xformL03 + (csetemp62 + csetemp63 + \n+ csetemp64 + csetemp65)*xformL13 + (csetemp66 + csetemp67 + csetemp68 + \n+ csetemp69)*xformL23 + (csetemp70 + csetemp71 + csetemp72 + \n+ csetemp73)*xformL33) + xformL11*((csetemp62 + csetemp63 + csetemp64 + \n+ csetemp65)*xformL03 + (csetemp74 + csetemp75 + csetemp76 + \n+ csetemp77)*xformL13 + (csetemp78 + csetemp79 + csetemp80 + \n+ csetemp81)*xformL23 + (csetemp82 + csetemp83 + csetemp84 + \n+ csetemp85)*xformL33) + xformL21*((csetemp66 + csetemp67 + csetemp68 + \n+ csetemp69)*xformL03 + (csetemp78 + csetemp79 + csetemp80 + \n+ csetemp81)*xformL13 + (csetemp86 + csetemp87 + csetemp88 + \n+ csetemp89)*xformL23 + (csetemp90 + csetemp91 + csetemp92 + \n+ csetemp93)*xformL33) + xformL31*((csetemp70 + csetemp71 + csetemp72 + \n+ csetemp73)*xformL03 + (csetemp82 + csetemp83 + csetemp84 + \n+ csetemp85)*xformL13 + (csetemp90 + csetemp91 + csetemp92 + \n+ csetemp93)*xformL23 + (csetemp94 + csetemp95 + csetemp96 + \n+ csetemp97)*xformL33);\n+ \n+ CCTK_REAL dg4131 CCTK_ATTRIBUTE_UNUSED = xformL01*((csetemp100 + \n+ csetemp101 + csetemp98 + csetemp99)*xformL03 + (csetemp102 + csetemp103 \n+ + csetemp104 + csetemp105)*xformL13 + (csetemp106 + csetemp107 + \n+ csetemp108 + csetemp109)*xformL23 + (csetemp110 + csetemp111 + \n+ csetemp112 + csetemp113)*xformL33) + xformL11*((csetemp102 + csetemp103 \n+ + csetemp104 + csetemp105)*xformL03 + (csetemp114 + csetemp115 + \n+ csetemp116 + csetemp117)*xformL13 + (csetemp118 + csetemp119 + \n+ csetemp120 + csetemp121)*xformL23 + (csetemp122 + csetemp123 + \n+ csetemp124 + csetemp125)*xformL33) + xformL21*((csetemp106 + csetemp107 \n+ + csetemp108 + csetemp109)*xformL03 + (csetemp118 + csetemp119 + \n+ csetemp120 + csetemp121)*xformL13 + (csetemp126 + csetemp127 + \n+ csetemp128 + csetemp129)*xformL23 + (csetemp130 + csetemp131 + \n+ csetemp132 + csetemp133)*xformL33) + xformL31*((csetemp110 + csetemp111 \n+ + csetemp112 + csetemp113)*xformL03 + (csetemp122 + csetemp123 + \n+ csetemp124 + csetemp125)*xformL13 + (csetemp130 + csetemp131 + \n+ csetemp132 + csetemp133)*xformL23 + (csetemp134 + csetemp135 + \n+ csetemp136 + csetemp137)*xformL33);\n+ \n+ CCTK_REAL dg4132 CCTK_ATTRIBUTE_UNUSED = xformL01*((csetemp138 + \n+ csetemp139 + csetemp140 + csetemp141)*xformL03 + (csetemp142 + \n+ csetemp143 + csetemp144 + csetemp145)*xformL13 + (csetemp146 + \n+ csetemp147 + csetemp148 + csetemp149)*xformL23 + (csetemp150 + \n+ csetemp151 + csetemp152 + csetemp153)*xformL33) + xformL11*((csetemp142 \n+ + csetemp143 + csetemp144 + csetemp145)*xformL03 + (csetemp154 + \n+ csetemp155 + csetemp156 + csetemp157)*xformL13 + (csetemp158 + \n+ csetemp159 + csetemp160 + csetemp161)*xformL23 + (csetemp162 + \n+ csetemp163 + csetemp164 + csetemp165)*xformL33) + xformL21*((csetemp146 \n+ + csetemp147 + csetemp148 + csetemp149)*xformL03 + (csetemp158 + \n+ csetemp159 + csetemp160 + csetemp161)*xformL13 + (csetemp166 + \n+ csetemp167 + csetemp168 + csetemp169)*xformL23 + (csetemp170 + \n+ csetemp171 + csetemp172 + csetemp173)*xformL33) + xformL31*((csetemp150 \n+ + csetemp151 + csetemp152 + csetemp153)*xformL03 + (csetemp162 + \n+ csetemp163 + csetemp164 + csetemp165)*xformL13 + (csetemp170 + \n+ csetemp171 + csetemp172 + csetemp173)*xformL23 + (csetemp174 + \n+ csetemp175 + csetemp176 + csetemp177)*xformL33);\n+ \n+ CCTK_REAL dg4133 CCTK_ATTRIBUTE_UNUSED = xformL01*((csetemp178 + \n+ csetemp179 + csetemp180 + csetemp181)*xformL03 + (csetemp182 + \n+ csetemp183 + csetemp184 + csetemp185)*xformL13 + (csetemp186 + \n+ csetemp187 + csetemp188 + csetemp189)*xformL23 + (csetemp190 + \n+ csetemp191 + csetemp192 + csetemp193)*xformL33) + xformL11*((csetemp182 \n+ + csetemp183 + csetemp184 + csetemp185)*xformL03 + (csetemp194 + \n+ csetemp195 + csetemp196 + csetemp197)*xformL13 + (csetemp198 + \n+ csetemp199 + csetemp200 + csetemp201)*xformL23 + (csetemp202 + \n+ csetemp203 + csetemp204 + csetemp205)*xformL33) + xformL21*((csetemp186 \n+ + csetemp187 + csetemp188 + csetemp189)*xformL03 + (csetemp198 + \n+ csetemp199 + csetemp200 + csetemp201)*xformL13 + (csetemp206 + \n+ csetemp207 + csetemp208 + csetemp209)*xformL23 + (csetemp210 + \n+ csetemp211 + csetemp212 + csetemp213)*xformL33) + xformL31*((csetemp190 \n+ + csetemp191 + csetemp192 + csetemp193)*xformL03 + (csetemp202 + \n+ csetemp203 + csetemp204 + csetemp205)*xformL13 + (csetemp210 + \n+ csetemp211 + csetemp212 + csetemp213)*xformL23 + (csetemp214 + \n+ csetemp215 + csetemp216 + csetemp217)*xformL33);\n+ \n+ CCTK_REAL dg4220 CCTK_ATTRIBUTE_UNUSED = xformL02*((csetemp58 + \n+ csetemp59 + csetemp60 + csetemp61)*xformL02 + (csetemp62 + csetemp63 + \n+ csetemp64 + csetemp65)*xformL12 + (csetemp66 + csetemp67 + csetemp68 + \n+ csetemp69)*xformL22 + (csetemp70 + csetemp71 + csetemp72 + \n+ csetemp73)*xformL32) + xformL12*((csetemp62 + csetemp63 + csetemp64 + \n+ csetemp65)*xformL02 + (csetemp74 + csetemp75 + csetemp76 + \n+ csetemp77)*xformL12 + (csetemp78 + csetemp79 + csetemp80 + \n+ csetemp81)*xformL22 + (csetemp82 + csetemp83 + csetemp84 + \n+ csetemp85)*xformL32) + xformL22*((csetemp66 + csetemp67 + csetemp68 + \n+ csetemp69)*xformL02 + (csetemp78 + csetemp79 + csetemp80 + \n+ csetemp81)*xformL12 + (csetemp86 + csetemp87 + csetemp88 + \n+ csetemp89)*xformL22 + (csetemp90 + csetemp91 + csetemp92 + \n+ csetemp93)*xformL32) + xformL32*((csetemp70 + csetemp71 + csetemp72 + \n+ csetemp73)*xformL02 + (csetemp82 + csetemp83 + csetemp84 + \n+ csetemp85)*xformL12 + (csetemp90 + csetemp91 + csetemp92 + \n+ csetemp93)*xformL22 + (csetemp94 + csetemp95 + csetemp96 + \n+ csetemp97)*xformL32);\n+ \n+ CCTK_REAL dg4221 CCTK_ATTRIBUTE_UNUSED = xformL02*((csetemp100 + \n+ csetemp101 + csetemp98 + csetemp99)*xformL02 + (csetemp102 + csetemp103 \n+ + csetemp104 + csetemp105)*xformL12 + (csetemp106 + csetemp107 + \n+ csetemp108 + csetemp109)*xformL22 + (csetemp110 + csetemp111 + \n+ csetemp112 + csetemp113)*xformL32) + xformL12*((csetemp102 + csetemp103 \n+ + csetemp104 + csetemp105)*xformL02 + (csetemp114 + csetemp115 + \n+ csetemp116 + csetemp117)*xformL12 + (csetemp118 + csetemp119 + \n+ csetemp120 + csetemp121)*xformL22 + (csetemp122 + csetemp123 + \n+ csetemp124 + csetemp125)*xformL32) + xformL22*((csetemp106 + csetemp107 \n+ + csetemp108 + csetemp109)*xformL02 + (csetemp118 + csetemp119 + \n+ csetemp120 + csetemp121)*xformL12 + (csetemp126 + csetemp127 + \n+ csetemp128 + csetemp129)*xformL22 + (csetemp130 + csetemp131 + \n+ csetemp132 + csetemp133)*xformL32) + xformL32*((csetemp110 + csetemp111 \n+ + csetemp112 + csetemp113)*xformL02 + (csetemp122 + csetemp123 + \n+ csetemp124 + csetemp125)*xformL12 + (csetemp130 + csetemp131 + \n+ csetemp132 + csetemp133)*xformL22 + (csetemp134 + csetemp135 + \n+ csetemp136 + csetemp137)*xformL32);\n+ \n+ CCTK_REAL dg4222 CCTK_ATTRIBUTE_UNUSED = xformL02*((csetemp138 + \n+ csetemp139 + csetemp140 + csetemp141)*xformL02 + (csetemp142 + \n+ csetemp143 + csetemp144 + csetemp145)*xformL12 + (csetemp146 + \n+ csetemp147 + csetemp148 + csetemp149)*xformL22 + (csetemp150 + \n+ csetemp151 + csetemp152 + csetemp153)*xformL32) + xformL12*((csetemp142 \n+ + csetemp143 + csetemp144 + csetemp145)*xformL02 + (csetemp154 + \n+ csetemp155 + csetemp156 + csetemp157)*xformL12 + (csetemp158 + \n+ csetemp159 + csetemp160 + csetemp161)*xformL22 + (csetemp162 + \n+ csetemp163 + csetemp164 + csetemp165)*xformL32) + xformL22*((csetemp146 \n+ + csetemp147 + csetemp148 + csetemp149)*xformL02 + (csetemp158 + \n+ csetemp159 + csetemp160 + csetemp161)*xformL12 + (csetemp166 + \n+ csetemp167 + csetemp168 + csetemp169)*xformL22 + (csetemp170 + \n+ csetemp171 + csetemp172 + csetemp173)*xformL32) + xformL32*((csetemp150 \n+ + csetemp151 + csetemp152 + csetemp153)*xformL02 + (csetemp162 + \n+ csetemp163 + csetemp164 + csetemp165)*xformL12 + (csetemp170 + \n+ csetemp171 + csetemp172 + csetemp173)*xformL22 + (csetemp174 + \n+ csetemp175 + csetemp176 + csetemp177)*xformL32);\n+ \n+ CCTK_REAL dg4223 CCTK_ATTRIBUTE_UNUSED = xformL02*((csetemp178 + \n+ csetemp179 + csetemp180 + csetemp181)*xformL02 + (csetemp182 + \n+ csetemp183 + csetemp184 + csetemp185)*xformL12 + (csetemp186 + \n+ csetemp187 + csetemp188 + csetemp189)*xformL22 + (csetemp190 + \n+ csetemp191 + csetemp192 + csetemp193)*xformL32) + xformL12*((csetemp182 \n+ + csetemp183 + csetemp184 + csetemp185)*xformL02 + (csetemp194 + \n+ csetemp195 + csetemp196 + csetemp197)*xformL12 + (csetemp198 + \n+ csetemp199 + csetemp200 + csetemp201)*xformL22 + (csetemp202 + \n+ csetemp203 + csetemp204 + csetemp205)*xformL32) + xformL22*((csetemp186 \n+ + csetemp187 + csetemp188 + csetemp189)*xformL02 + (csetemp198 + \n+ csetemp199 + csetemp200 + csetemp201)*xformL12 + (csetemp206 + \n+ csetemp207 + csetemp208 + csetemp209)*xformL22 + (csetemp210 + \n+ csetemp211 + csetemp212 + csetemp213)*xformL32) + xformL32*((csetemp190 \n+ + csetemp191 + csetemp192 + csetemp193)*xformL02 + (csetemp202 + \n+ csetemp203 + csetemp204 + csetemp205)*xformL12 + (csetemp210 + \n+ csetemp211 + csetemp212 + csetemp213)*xformL22 + (csetemp214 + \n+ csetemp215 + csetemp216 + csetemp217)*xformL32);\n+ \n+ CCTK_REAL dg4230 CCTK_ATTRIBUTE_UNUSED = xformL02*((csetemp58 + \n+ csetemp59 + csetemp60 + csetemp61)*xformL03 + (csetemp62 + csetemp63 + \n+ csetemp64 + csetemp65)*xformL13 + (csetemp66 + csetemp67 + csetemp68 + \n+ csetemp69)*xformL23 + (csetemp70 + csetemp71 + csetemp72 + \n+ csetemp73)*xformL33) + xformL12*((csetemp62 + csetemp63 + csetemp64 + \n+ csetemp65)*xformL03 + (csetemp74 + csetemp75 + csetemp76 + \n+ csetemp77)*xformL13 + (csetemp78 + csetemp79 + csetemp80 + \n+ csetemp81)*xformL23 + (csetemp82 + csetemp83 + csetemp84 + \n+ csetemp85)*xformL33) + xformL22*((csetemp66 + csetemp67 + csetemp68 + \n+ csetemp69)*xformL03 + (csetemp78 + csetemp79 + csetemp80 + \n+ csetemp81)*xformL13 + (csetemp86 + csetemp87 + csetemp88 + \n+ csetemp89)*xformL23 + (csetemp90 + csetemp91 + csetemp92 + \n+ csetemp93)*xformL33) + xformL32*((csetemp70 + csetemp71 + csetemp72 + \n+ csetemp73)*xformL03 + (csetemp82 + csetemp83 + csetemp84 + \n+ csetemp85)*xformL13 + (csetemp90 + csetemp91 + csetemp92 + \n+ csetemp93)*xformL23 + (csetemp94 + csetemp95 + csetemp96 + \n+ csetemp97)*xformL33);\n+ \n+ CCTK_REAL dg4231 CCTK_ATTRIBUTE_UNUSED = xformL02*((csetemp100 + \n+ csetemp101 + csetemp98 + csetemp99)*xformL03 + (csetemp102 + csetemp103 \n+ + csetemp104 + csetemp105)*xformL13 + (csetemp106 + csetemp107 + \n+ csetemp108 + csetemp109)*xformL23 + (csetemp110 + csetemp111 + \n+ csetemp112 + csetemp113)*xformL33) + xformL12*((csetemp102 + csetemp103 \n+ + csetemp104 + csetemp105)*xformL03 + (csetemp114 + csetemp115 + \n+ csetemp116 + csetemp117)*xformL13 + (csetemp118 + csetemp119 + \n+ csetemp120 + csetemp121)*xformL23 + (csetemp122 + csetemp123 + \n+ csetemp124 + csetemp125)*xformL33) + xformL22*((csetemp106 + csetemp107 \n+ + csetemp108 + csetemp109)*xformL03 + (csetemp118 + csetemp119 + \n+ csetemp120 + csetemp121)*xformL13 + (csetemp126 + csetemp127 + \n+ csetemp128 + csetemp129)*xformL23 + (csetemp130 + csetemp131 + \n+ csetemp132 + csetemp133)*xformL33) + xformL32*((csetemp110 + csetemp111 \n+ + csetemp112 + csetemp113)*xformL03 + (csetemp122 + csetemp123 + \n+ csetemp124 + csetemp125)*xformL13 + (csetemp130 + csetemp131 + \n+ csetemp132 + csetemp133)*xformL23 + (csetemp134 + csetemp135 + \n+ csetemp136 + csetemp137)*xformL33);\n+ \n+ CCTK_REAL dg4232 CCTK_ATTRIBUTE_UNUSED = xformL02*((csetemp138 + \n+ csetemp139 + csetemp140 + csetemp141)*xformL03 + (csetemp142 + \n+ csetemp143 + csetemp144 + csetemp145)*xformL13 + (csetemp146 + \n+ csetemp147 + csetemp148 + csetemp149)*xformL23 + (csetemp150 + \n+ csetemp151 + csetemp152 + csetemp153)*xformL33) + xformL12*((csetemp142 \n+ + csetemp143 + csetemp144 + csetemp145)*xformL03 + (csetemp154 + \n+ csetemp155 + csetemp156 + csetemp157)*xformL13 + (csetemp158 + \n+ csetemp159 + csetemp160 + csetemp161)*xformL23 + (csetemp162 + \n+ csetemp163 + csetemp164 + csetemp165)*xformL33) + xformL22*((csetemp146 \n+ + csetemp147 + csetemp148 + csetemp149)*xformL03 + (csetemp158 + \n+ csetemp159 + csetemp160 + csetemp161)*xformL13 + (csetemp166 + \n+ csetemp167 + csetemp168 + csetemp169)*xformL23 + (csetemp170 + \n+ csetemp171 + csetemp172 + csetemp173)*xformL33) + xformL32*((csetemp150 \n+ + csetemp151 + csetemp152 + csetemp153)*xformL03 + (csetemp162 + \n+ csetemp163 + csetemp164 + csetemp165)*xformL13 + (csetemp170 + \n+ csetemp171 + csetemp172 + csetemp173)*xformL23 + (csetemp174 + \n+ csetemp175 + csetemp176 + csetemp177)*xformL33);\n+ \n+ CCTK_REAL dg4233 CCTK_ATTRIBUTE_UNUSED = xformL02*((csetemp178 + \n+ csetemp179 + csetemp180 + csetemp181)*xformL03 + (csetemp182 + \n+ csetemp183 + csetemp184 + csetemp185)*xformL13 + (csetemp186 + \n+ csetemp187 + csetemp188 + csetemp189)*xformL23 + (csetemp190 + \n+ csetemp191 + csetemp192 + csetemp193)*xformL33) + xformL12*((csetemp182 \n+ + csetemp183 + csetemp184 + csetemp185)*xformL03 + (csetemp194 + \n+ csetemp195 + csetemp196 + csetemp197)*xformL13 + (csetemp198 + \n+ csetemp199 + csetemp200 + csetemp201)*xformL23 + (csetemp202 + \n+ csetemp203 + csetemp204 + csetemp205)*xformL33) + xformL22*((csetemp186 \n+ + csetemp187 + csetemp188 + csetemp189)*xformL03 + (csetemp198 + \n+ csetemp199 + csetemp200 + csetemp201)*xformL13 + (csetemp206 + \n+ csetemp207 + csetemp208 + csetemp209)*xformL23 + (csetemp210 + \n+ csetemp211 + csetemp212 + csetemp213)*xformL33) + xformL32*((csetemp190 \n+ + csetemp191 + csetemp192 + csetemp193)*xformL03 + (csetemp202 + \n+ csetemp203 + csetemp204 + csetemp205)*xformL13 + (csetemp210 + \n+ csetemp211 + csetemp212 + csetemp213)*xformL23 + (csetemp214 + \n+ csetemp215 + csetemp216 + csetemp217)*xformL33);\n+ \n+ CCTK_REAL dg4330 CCTK_ATTRIBUTE_UNUSED = xformL03*((csetemp58 + \n+ csetemp59 + csetemp60 + csetemp61)*xformL03 + (csetemp62 + csetemp63 + \n+ csetemp64 + csetemp65)*xformL13 + (csetemp66 + csetemp67 + csetemp68 + \n+ csetemp69)*xformL23 + (csetemp70 + csetemp71 + csetemp72 + \n+ csetemp73)*xformL33) + xformL13*((csetemp62 + csetemp63 + csetemp64 + \n+ csetemp65)*xformL03 + (csetemp74 + csetemp75 + csetemp76 + \n+ csetemp77)*xformL13 + (csetemp78 + csetemp79 + csetemp80 + \n+ csetemp81)*xformL23 + (csetemp82 + csetemp83 + csetemp84 + \n+ csetemp85)*xformL33) + xformL23*((csetemp66 + csetemp67 + csetemp68 + \n+ csetemp69)*xformL03 + (csetemp78 + csetemp79 + csetemp80 + \n+ csetemp81)*xformL13 + (csetemp86 + csetemp87 + csetemp88 + \n+ csetemp89)*xformL23 + (csetemp90 + csetemp91 + csetemp92 + \n+ csetemp93)*xformL33) + xformL33*((csetemp70 + csetemp71 + csetemp72 + \n+ csetemp73)*xformL03 + (csetemp82 + csetemp83 + csetemp84 + \n+ csetemp85)*xformL13 + (csetemp90 + csetemp91 + csetemp92 + \n+ csetemp93)*xformL23 + (csetemp94 + csetemp95 + csetemp96 + \n+ csetemp97)*xformL33);\n+ \n+ CCTK_REAL dg4331 CCTK_ATTRIBUTE_UNUSED = xformL03*((csetemp100 + \n+ csetemp101 + csetemp98 + csetemp99)*xformL03 + (csetemp102 + csetemp103 \n+ + csetemp104 + csetemp105)*xformL13 + (csetemp106 + csetemp107 + \n+ csetemp108 + csetemp109)*xformL23 + (csetemp110 + csetemp111 + \n+ csetemp112 + csetemp113)*xformL33) + xformL13*((csetemp102 + csetemp103 \n+ + csetemp104 + csetemp105)*xformL03 + (csetemp114 + csetemp115 + \n+ csetemp116 + csetemp117)*xformL13 + (csetemp118 + csetemp119 + \n+ csetemp120 + csetemp121)*xformL23 + (csetemp122 + csetemp123 + \n+ csetemp124 + csetemp125)*xformL33) + xformL23*((csetemp106 + csetemp107 \n+ + csetemp108 + csetemp109)*xformL03 + (csetemp118 + csetemp119 + \n+ csetemp120 + csetemp121)*xformL13 + (csetemp126 + csetemp127 + \n+ csetemp128 + csetemp129)*xformL23 + (csetemp130 + csetemp131 + \n+ csetemp132 + csetemp133)*xformL33) + xformL33*((csetemp110 + csetemp111 \n+ + csetemp112 + csetemp113)*xformL03 + (csetemp122 + csetemp123 + \n+ csetemp124 + csetemp125)*xformL13 + (csetemp130 + csetemp131 + \n+ csetemp132 + csetemp133)*xformL23 + (csetemp134 + csetemp135 + \n+ csetemp136 + csetemp137)*xformL33);\n+ \n+ CCTK_REAL dg4332 CCTK_ATTRIBUTE_UNUSED = xformL03*((csetemp138 + \n+ csetemp139 + csetemp140 + csetemp141)*xformL03 + (csetemp142 + \n+ csetemp143 + csetemp144 + csetemp145)*xformL13 + (csetemp146 + \n+ csetemp147 + csetemp148 + csetemp149)*xformL23 + (csetemp150 + \n+ csetemp151 + csetemp152 + csetemp153)*xformL33) + xformL13*((csetemp142 \n+ + csetemp143 + csetemp144 + csetemp145)*xformL03 + (csetemp154 + \n+ csetemp155 + csetemp156 + csetemp157)*xformL13 + (csetemp158 + \n+ csetemp159 + csetemp160 + csetemp161)*xformL23 + (csetemp162 + \n+ csetemp163 + csetemp164 + csetemp165)*xformL33) + xformL23*((csetemp146 \n+ + csetemp147 + csetemp148 + csetemp149)*xformL03 + (csetemp158 + \n+ csetemp159 + csetemp160 + csetemp161)*xformL13 + (csetemp166 + \n+ csetemp167 + csetemp168 + csetemp169)*xformL23 + (csetemp170 + \n+ csetemp171 + csetemp172 + csetemp173)*xformL33) + xformL33*((csetemp150 \n+ + csetemp151 + csetemp152 + csetemp153)*xformL03 + (csetemp162 + \n+ csetemp163 + csetemp164 + csetemp165)*xformL13 + (csetemp170 + \n+ csetemp171 + csetemp172 + csetemp173)*xformL23 + (csetemp174 + \n+ csetemp175 + csetemp176 + csetemp177)*xformL33);\n+ \n+ CCTK_REAL dg4333 CCTK_ATTRIBUTE_UNUSED = xformL03*((csetemp178 + \n+ csetemp179 + csetemp180 + csetemp181)*xformL03 + (csetemp182 + \n+ csetemp183 + csetemp184 + csetemp185)*xformL13 + (csetemp186 + \n+ csetemp187 + csetemp188 + csetemp189)*xformL23 + (csetemp190 + \n+ csetemp191 + csetemp192 + csetemp193)*xformL33) + xformL13*((csetemp182 \n+ + csetemp183 + csetemp184 + csetemp185)*xformL03 + (csetemp194 + \n+ csetemp195 + csetemp196 + csetemp197)*xformL13 + (csetemp198 + \n+ csetemp199 + csetemp200 + csetemp201)*xformL23 + (csetemp202 + \n+ csetemp203 + csetemp204 + csetemp205)*xformL33) + xformL23*((csetemp186 \n+ + csetemp187 + csetemp188 + csetemp189)*xformL03 + (csetemp198 + \n+ csetemp199 + csetemp200 + csetemp201)*xformL13 + (csetemp206 + \n+ csetemp207 + csetemp208 + csetemp209)*xformL23 + (csetemp210 + \n+ csetemp211 + csetemp212 + csetemp213)*xformL33) + xformL33*((csetemp190 \n+ + csetemp191 + csetemp192 + csetemp193)*xformL03 + (csetemp202 + \n+ csetemp203 + csetemp204 + csetemp205)*xformL13 + (csetemp210 + \n+ csetemp211 + csetemp212 + csetemp213)*xformL23 + (csetemp214 + \n+ csetemp215 + csetemp216 + csetemp217)*xformL33);\n+ \n+ CCTK_REAL betal1 CCTK_ATTRIBUTE_UNUSED = g401;\n+ \n+ CCTK_REAL betal2 CCTK_ATTRIBUTE_UNUSED = g402;\n+ \n+ CCTK_REAL betal3 CCTK_ATTRIBUTE_UNUSED = g403;\n+ \n+ CCTK_REAL gerr11L CCTK_ATTRIBUTE_UNUSED = gxxL - g411;\n+ \n+ CCTK_REAL gerr12L CCTK_ATTRIBUTE_UNUSED = gxyL - g412;\n+ \n+ CCTK_REAL gerr13L CCTK_ATTRIBUTE_UNUSED = gxzL - g413;\n+ \n+ CCTK_REAL gerr22L CCTK_ATTRIBUTE_UNUSED = gyyL - g422;\n+ \n+ CCTK_REAL gerr23L CCTK_ATTRIBUTE_UNUSED = gyzL - g423;\n+ \n+ CCTK_REAL gerr33L CCTK_ATTRIBUTE_UNUSED = gzzL - g433;\n+ \n+ CCTK_REAL csetemp218 CCTK_ATTRIBUTE_UNUSED = SQR(gxzL);\n+ \n+ CCTK_REAL csetemp219 CCTK_ATTRIBUTE_UNUSED = SQR(gyzL);\n+ \n+ CCTK_REAL csetemp220 CCTK_ATTRIBUTE_UNUSED = SQR(gxyL);\n+ \n+ CCTK_REAL detg CCTK_ATTRIBUTE_UNUSED = 2*gxyL*gxzL*gyzL + \n+ gyyL*(gxxL*gzzL - csetemp218) - gxxL*csetemp219 - gzzL*csetemp220;\n+ \n+ CCTK_REAL csetemp221 CCTK_ATTRIBUTE_UNUSED = INV(detg);\n+ \n+ CCTK_REAL gu11 CCTK_ATTRIBUTE_UNUSED = (gyyL*gzzL - \n+ csetemp219)*csetemp221;\n+ \n+ CCTK_REAL gu12 CCTK_ATTRIBUTE_UNUSED = (gxzL*gyzL - \n+ gxyL*gzzL)*csetemp221;\n+ \n+ CCTK_REAL gu13 CCTK_ATTRIBUTE_UNUSED = (-(gxzL*gyyL) + \n+ gxyL*gyzL)*csetemp221;\n+ \n+ CCTK_REAL gu22 CCTK_ATTRIBUTE_UNUSED = (gxxL*gzzL - \n+ csetemp218)*csetemp221;\n+ \n+ CCTK_REAL gu23 CCTK_ATTRIBUTE_UNUSED = (gxyL*gxzL - \n+ gxxL*gyzL)*csetemp221;\n+ \n+ CCTK_REAL gu33 CCTK_ATTRIBUTE_UNUSED = (gxxL*gyyL - \n+ csetemp220)*csetemp221;\n+ \n+ CCTK_REAL betaerr1L CCTK_ATTRIBUTE_UNUSED = betaxL - betal1*gu11 - \n+ betal2*gu12 - betal3*gu13;\n+ \n+ CCTK_REAL betaerr2L CCTK_ATTRIBUTE_UNUSED = betayL - betal1*gu12 - \n+ betal2*gu22 - betal3*gu23;\n+ \n+ CCTK_REAL betaerr3L CCTK_ATTRIBUTE_UNUSED = betazL - betal1*gu13 - \n+ betal2*gu23 - betal3*gu33;\n+ \n+ CCTK_REAL betasq CCTK_ATTRIBUTE_UNUSED = betaxL*betal1 + betayL*betal2 \n+ + betazL*betal3;\n+ \n+ CCTK_REAL alperrL CCTK_ATTRIBUTE_UNUSED = alpL - sqrt(betasq - g400);\n+ \n+ CCTK_REAL dtg11 CCTK_ATTRIBUTE_UNUSED = dg4110;\n+ \n+ CCTK_REAL dtg12 CCTK_ATTRIBUTE_UNUSED = dg4120;\n+ \n+ CCTK_REAL dtg13 CCTK_ATTRIBUTE_UNUSED = dg4130;\n+ \n+ CCTK_REAL dtg22 CCTK_ATTRIBUTE_UNUSED = dg4220;\n+ \n+ CCTK_REAL dtg23 CCTK_ATTRIBUTE_UNUSED = dg4230;\n+ \n+ CCTK_REAL dtg33 CCTK_ATTRIBUTE_UNUSED = dg4330;\n+ \n+ CCTK_REAL dg111 CCTK_ATTRIBUTE_UNUSED = dg4111;\n+ \n+ CCTK_REAL dg112 CCTK_ATTRIBUTE_UNUSED = dg4112;\n+ \n+ CCTK_REAL dg113 CCTK_ATTRIBUTE_UNUSED = dg4113;\n+ \n+ CCTK_REAL dg121 CCTK_ATTRIBUTE_UNUSED = dg4121;\n+ \n+ CCTK_REAL dg122 CCTK_ATTRIBUTE_UNUSED = dg4122;\n+ \n+ CCTK_REAL dg123 CCTK_ATTRIBUTE_UNUSED = dg4123;\n+ \n+ CCTK_REAL dg131 CCTK_ATTRIBUTE_UNUSED = dg4131;\n+ \n+ CCTK_REAL dg132 CCTK_ATTRIBUTE_UNUSED = dg4132;\n+ \n+ CCTK_REAL dg133 CCTK_ATTRIBUTE_UNUSED = dg4133;\n+ \n+ CCTK_REAL dg221 CCTK_ATTRIBUTE_UNUSED = dg4221;\n+ \n+ CCTK_REAL dg222 CCTK_ATTRIBUTE_UNUSED = dg4222;\n+ \n+ CCTK_REAL dg223 CCTK_ATTRIBUTE_UNUSED = dg4223;\n+ \n+ CCTK_REAL dg231 CCTK_ATTRIBUTE_UNUSED = dg4231;\n+ \n+ CCTK_REAL dg232 CCTK_ATTRIBUTE_UNUSED = dg4232;\n+ \n+ CCTK_REAL dg233 CCTK_ATTRIBUTE_UNUSED = dg4233;\n+ \n+ CCTK_REAL dg331 CCTK_ATTRIBUTE_UNUSED = dg4331;\n+ \n+ CCTK_REAL dg332 CCTK_ATTRIBUTE_UNUSED = dg4332;\n+ \n+ CCTK_REAL dg333 CCTK_ATTRIBUTE_UNUSED = dg4333;\n+ \n+ CCTK_REAL csetemp222 CCTK_ATTRIBUTE_UNUSED = dtg11*gu11;\n+ \n+ CCTK_REAL csetemp223 CCTK_ATTRIBUTE_UNUSED = dtg12*gu12;\n+ \n+ CCTK_REAL csetemp224 CCTK_ATTRIBUTE_UNUSED = dtg13*gu13;\n+ \n+ CCTK_REAL csetemp225 CCTK_ATTRIBUTE_UNUSED = dtg12*gu11;\n+ \n+ CCTK_REAL csetemp226 CCTK_ATTRIBUTE_UNUSED = dtg22*gu12;\n+ \n+ CCTK_REAL csetemp227 CCTK_ATTRIBUTE_UNUSED = dtg23*gu13;\n+ \n+ CCTK_REAL csetemp228 CCTK_ATTRIBUTE_UNUSED = dtg13*gu11;\n+ \n+ CCTK_REAL csetemp229 CCTK_ATTRIBUTE_UNUSED = dtg23*gu12;\n+ \n+ CCTK_REAL csetemp230 CCTK_ATTRIBUTE_UNUSED = dtg33*gu13;\n+ \n+ CCTK_REAL dtgu11 CCTK_ATTRIBUTE_UNUSED = -((csetemp222 + csetemp223 + \n+ csetemp224)*gu11) - (csetemp225 + csetemp226 + csetemp227)*gu12 - \n+ (csetemp228 + csetemp229 + csetemp230)*gu13;\n+ \n+ CCTK_REAL dtgu12 CCTK_ATTRIBUTE_UNUSED = -((csetemp222 + csetemp223 + \n+ csetemp224)*gu12) - (csetemp225 + csetemp226 + csetemp227)*gu22 - \n+ (csetemp228 + csetemp229 + csetemp230)*gu23;\n+ \n+ CCTK_REAL dtgu13 CCTK_ATTRIBUTE_UNUSED = -((csetemp222 + csetemp223 + \n+ csetemp224)*gu13) - (csetemp225 + csetemp226 + csetemp227)*gu23 - \n+ (csetemp228 + csetemp229 + csetemp230)*gu33;\n+ \n+ CCTK_REAL csetemp231 CCTK_ATTRIBUTE_UNUSED = dtg11*gu12;\n+ \n+ CCTK_REAL csetemp232 CCTK_ATTRIBUTE_UNUSED = dtg12*gu22;\n+ \n+ CCTK_REAL csetemp233 CCTK_ATTRIBUTE_UNUSED = dtg13*gu23;\n+ \n+ CCTK_REAL csetemp234 CCTK_ATTRIBUTE_UNUSED = dtg22*gu22;\n+ \n+ CCTK_REAL csetemp235 CCTK_ATTRIBUTE_UNUSED = dtg23*gu23;\n+ \n+ CCTK_REAL csetemp236 CCTK_ATTRIBUTE_UNUSED = dtg13*gu12;\n+ \n+ CCTK_REAL csetemp237 CCTK_ATTRIBUTE_UNUSED = dtg23*gu22;\n+ \n+ CCTK_REAL csetemp238 CCTK_ATTRIBUTE_UNUSED = dtg33*gu23;\n+ \n+ CCTK_REAL dtgu22 CCTK_ATTRIBUTE_UNUSED = -((csetemp231 + csetemp232 + \n+ csetemp233)*gu12) - (csetemp223 + csetemp234 + csetemp235)*gu22 - \n+ (csetemp236 + csetemp237 + csetemp238)*gu23;\n+ \n+ CCTK_REAL dtgu23 CCTK_ATTRIBUTE_UNUSED = -((csetemp231 + csetemp232 + \n+ csetemp233)*gu13) - (csetemp223 + csetemp234 + csetemp235)*gu23 - \n+ (csetemp236 + csetemp237 + csetemp238)*gu33;\n+ \n+ CCTK_REAL dtgu33 CCTK_ATTRIBUTE_UNUSED = -(gu13*(dtg11*gu13 + \n+ dtg12*gu23 + dtg13*gu33)) - gu23*(dtg12*gu13 + dtg22*gu23 + dtg23*gu33) \n+ - gu33*(csetemp224 + csetemp235 + dtg33*gu33);\n+ \n+ CCTK_REAL csetemp239 CCTK_ATTRIBUTE_UNUSED = dg111*gu11;\n+ \n+ CCTK_REAL csetemp240 CCTK_ATTRIBUTE_UNUSED = dg121*gu12;\n+ \n+ CCTK_REAL csetemp241 CCTK_ATTRIBUTE_UNUSED = dg131*gu13;\n+ \n+ CCTK_REAL csetemp242 CCTK_ATTRIBUTE_UNUSED = dg121*gu11;\n+ \n+ CCTK_REAL csetemp243 CCTK_ATTRIBUTE_UNUSED = dg221*gu12;\n+ \n+ CCTK_REAL csetemp244 CCTK_ATTRIBUTE_UNUSED = dg231*gu13;\n+ \n+ CCTK_REAL csetemp245 CCTK_ATTRIBUTE_UNUSED = dg131*gu11;\n+ \n+ CCTK_REAL csetemp246 CCTK_ATTRIBUTE_UNUSED = dg231*gu12;\n+ \n+ CCTK_REAL csetemp247 CCTK_ATTRIBUTE_UNUSED = dg331*gu13;\n+ \n+ CCTK_REAL dgu111 CCTK_ATTRIBUTE_UNUSED = -((csetemp239 + csetemp240 + \n+ csetemp241)*gu11) - (csetemp242 + csetemp243 + csetemp244)*gu12 - \n+ (csetemp245 + csetemp246 + csetemp247)*gu13;\n+ \n+ CCTK_REAL dgu121 CCTK_ATTRIBUTE_UNUSED = -((csetemp239 + csetemp240 + \n+ csetemp241)*gu12) - (csetemp242 + csetemp243 + csetemp244)*gu22 - \n+ (csetemp245 + csetemp246 + csetemp247)*gu23;\n+ \n+ CCTK_REAL dgu131 CCTK_ATTRIBUTE_UNUSED = -((csetemp239 + csetemp240 + \n+ csetemp241)*gu13) - (csetemp242 + csetemp243 + csetemp244)*gu23 - \n+ (csetemp245 + csetemp246 + csetemp247)*gu33;\n+ \n+ CCTK_REAL csetemp248 CCTK_ATTRIBUTE_UNUSED = dg111*gu12;\n+ \n+ CCTK_REAL csetemp249 CCTK_ATTRIBUTE_UNUSED = dg121*gu22;\n+ \n+ CCTK_REAL csetemp250 CCTK_ATTRIBUTE_UNUSED = dg131*gu23;\n+ \n+ CCTK_REAL csetemp251 CCTK_ATTRIBUTE_UNUSED = dg221*gu22;\n+ \n+ CCTK_REAL csetemp252 CCTK_ATTRIBUTE_UNUSED = dg231*gu23;\n+ \n+ CCTK_REAL csetemp253 CCTK_ATTRIBUTE_UNUSED = dg131*gu12;\n+ \n+ CCTK_REAL csetemp254 CCTK_ATTRIBUTE_UNUSED = dg231*gu22;\n+ \n+ CCTK_REAL csetemp255 CCTK_ATTRIBUTE_UNUSED = dg331*gu23;\n+ \n+ CCTK_REAL dgu221 CCTK_ATTRIBUTE_UNUSED = -((csetemp248 + csetemp249 + \n+ csetemp250)*gu12) - (csetemp240 + csetemp251 + csetemp252)*gu22 - \n+ (csetemp253 + csetemp254 + csetemp255)*gu23;\n+ \n+ CCTK_REAL dgu231 CCTK_ATTRIBUTE_UNUSED = -((csetemp248 + csetemp249 + \n+ csetemp250)*gu13) - (csetemp240 + csetemp251 + csetemp252)*gu23 - \n+ (csetemp253 + csetemp254 + csetemp255)*gu33;\n+ \n+ CCTK_REAL dgu331 CCTK_ATTRIBUTE_UNUSED = -(gu13*(dg111*gu13 + \n+ dg121*gu23 + dg131*gu33)) - gu23*(dg121*gu13 + dg221*gu23 + dg231*gu33) \n+ - gu33*(csetemp241 + csetemp252 + dg331*gu33);\n+ \n+ CCTK_REAL csetemp256 CCTK_ATTRIBUTE_UNUSED = dg112*gu11;\n+ \n+ CCTK_REAL csetemp257 CCTK_ATTRIBUTE_UNUSED = dg122*gu12;\n+ \n+ CCTK_REAL csetemp258 CCTK_ATTRIBUTE_UNUSED = dg132*gu13;\n+ \n+ CCTK_REAL csetemp259 CCTK_ATTRIBUTE_UNUSED = dg122*gu11;\n+ \n+ CCTK_REAL csetemp260 CCTK_ATTRIBUTE_UNUSED = dg222*gu12;\n+ \n+ CCTK_REAL csetemp261 CCTK_ATTRIBUTE_UNUSED = dg232*gu13;\n+ \n+ CCTK_REAL csetemp262 CCTK_ATTRIBUTE_UNUSED = dg132*gu11;\n+ \n+ CCTK_REAL csetemp263 CCTK_ATTRIBUTE_UNUSED = dg232*gu12;\n+ \n+ CCTK_REAL csetemp264 CCTK_ATTRIBUTE_UNUSED = dg332*gu13;\n+ \n+ CCTK_REAL dgu112 CCTK_ATTRIBUTE_UNUSED = -((csetemp256 + csetemp257 + \n+ csetemp258)*gu11) - (csetemp259 + csetemp260 + csetemp261)*gu12 - \n+ (csetemp262 + csetemp263 + csetemp264)*gu13;\n+ \n+ CCTK_REAL dgu122 CCTK_ATTRIBUTE_UNUSED = -((csetemp256 + csetemp257 + \n+ csetemp258)*gu12) - (csetemp259 + csetemp260 + csetemp261)*gu22 - \n+ (csetemp262 + csetemp263 + csetemp264)*gu23;\n+ \n+ CCTK_REAL dgu132 CCTK_ATTRIBUTE_UNUSED = -((csetemp256 + csetemp257 + \n+ csetemp258)*gu13) - (csetemp259 + csetemp260 + csetemp261)*gu23 - \n+ (csetemp262 + csetemp263 + csetemp264)*gu33;\n+ \n+ CCTK_REAL csetemp265 CCTK_ATTRIBUTE_UNUSED = dg112*gu12;\n+ \n+ CCTK_REAL csetemp266 CCTK_ATTRIBUTE_UNUSED = dg122*gu22;\n+ \n+ CCTK_REAL csetemp267 CCTK_ATTRIBUTE_UNUSED = dg132*gu23;\n+ \n+ CCTK_REAL csetemp268 CCTK_ATTRIBUTE_UNUSED = dg222*gu22;\n+ \n+ CCTK_REAL csetemp269 CCTK_ATTRIBUTE_UNUSED = dg232*gu23;\n+ \n+ CCTK_REAL csetemp270 CCTK_ATTRIBUTE_UNUSED = dg132*gu12;\n+ \n+ CCTK_REAL csetemp271 CCTK_ATTRIBUTE_UNUSED = dg232*gu22;\n+ \n+ CCTK_REAL csetemp272 CCTK_ATTRIBUTE_UNUSED = dg332*gu23;\n+ \n+ CCTK_REAL dgu222 CCTK_ATTRIBUTE_UNUSED = -((csetemp265 + csetemp266 + \n+ csetemp267)*gu12) - (csetemp257 + csetemp268 + csetemp269)*gu22 - \n+ (csetemp270 + csetemp271 + csetemp272)*gu23;\n+ \n+ CCTK_REAL dgu232 CCTK_ATTRIBUTE_UNUSED = -((csetemp265 + csetemp266 + \n+ csetemp267)*gu13) - (csetemp257 + csetemp268 + csetemp269)*gu23 - \n+ (csetemp270 + csetemp271 + csetemp272)*gu33;\n+ \n+ CCTK_REAL dgu332 CCTK_ATTRIBUTE_UNUSED = -(gu13*(dg112*gu13 + \n+ dg122*gu23 + dg132*gu33)) - gu23*(dg122*gu13 + dg222*gu23 + dg232*gu33) \n+ - gu33*(csetemp258 + csetemp269 + dg332*gu33);\n+ \n+ CCTK_REAL csetemp273 CCTK_ATTRIBUTE_UNUSED = dg113*gu11;\n+ \n+ CCTK_REAL csetemp274 CCTK_ATTRIBUTE_UNUSED = dg123*gu12;\n+ \n+ CCTK_REAL csetemp275 CCTK_ATTRIBUTE_UNUSED = dg133*gu13;\n+ \n+ CCTK_REAL csetemp276 CCTK_ATTRIBUTE_UNUSED = dg123*gu11;\n+ \n+ CCTK_REAL csetemp277 CCTK_ATTRIBUTE_UNUSED = dg223*gu12;\n+ \n+ CCTK_REAL csetemp278 CCTK_ATTRIBUTE_UNUSED = dg233*gu13;\n+ \n+ CCTK_REAL csetemp279 CCTK_ATTRIBUTE_UNUSED = dg133*gu11;\n+ \n+ CCTK_REAL csetemp280 CCTK_ATTRIBUTE_UNUSED = dg233*gu12;\n+ \n+ CCTK_REAL csetemp281 CCTK_ATTRIBUTE_UNUSED = dg333*gu13;\n+ \n+ CCTK_REAL dgu113 CCTK_ATTRIBUTE_UNUSED = -((csetemp273 + csetemp274 + \n+ csetemp275)*gu11) - (csetemp276 + csetemp277 + csetemp278)*gu12 - \n+ (csetemp279 + csetemp280 + csetemp281)*gu13;\n+ \n+ CCTK_REAL dgu123 CCTK_ATTRIBUTE_UNUSED = -((csetemp273 + csetemp274 + \n+ csetemp275)*gu12) - (csetemp276 + csetemp277 + csetemp278)*gu22 - \n+ (csetemp279 + csetemp280 + csetemp281)*gu23;\n+ \n+ CCTK_REAL dgu133 CCTK_ATTRIBUTE_UNUSED = -((csetemp273 + csetemp274 + \n+ csetemp275)*gu13) - (csetemp276 + csetemp277 + csetemp278)*gu23 - \n+ (csetemp279 + csetemp280 + csetemp281)*gu33;\n+ \n+ CCTK_REAL csetemp282 CCTK_ATTRIBUTE_UNUSED = dg113*gu12;\n+ \n+ CCTK_REAL csetemp283 CCTK_ATTRIBUTE_UNUSED = dg123*gu22;\n+ \n+ CCTK_REAL csetemp284 CCTK_ATTRIBUTE_UNUSED = dg133*gu23;\n+ \n+ CCTK_REAL csetemp285 CCTK_ATTRIBUTE_UNUSED = dg223*gu22;\n+ \n+ CCTK_REAL csetemp286 CCTK_ATTRIBUTE_UNUSED = dg233*gu23;\n+ \n+ CCTK_REAL csetemp287 CCTK_ATTRIBUTE_UNUSED = dg133*gu12;\n+ \n+ CCTK_REAL csetemp288 CCTK_ATTRIBUTE_UNUSED = dg233*gu22;\n+ \n+ CCTK_REAL csetemp289 CCTK_ATTRIBUTE_UNUSED = dg333*gu23;\n+ \n+ CCTK_REAL dgu223 CCTK_ATTRIBUTE_UNUSED = -((csetemp282 + csetemp283 + \n+ csetemp284)*gu12) - (csetemp274 + csetemp285 + csetemp286)*gu22 - \n+ (csetemp287 + csetemp288 + csetemp289)*gu23;\n+ \n+ CCTK_REAL dgu233 CCTK_ATTRIBUTE_UNUSED = -((csetemp282 + csetemp283 + \n+ csetemp284)*gu13) - (csetemp274 + csetemp285 + csetemp286)*gu23 - \n+ (csetemp287 + csetemp288 + csetemp289)*gu33;\n+ \n+ CCTK_REAL dgu333 CCTK_ATTRIBUTE_UNUSED = -(gu13*(dg113*gu13 + \n+ dg123*gu23 + dg133*gu33)) - gu23*(dg123*gu13 + dg223*gu23 + dg233*gu33) \n+ - gu33*(csetemp275 + csetemp286 + dg333*gu33);\n+ \n+ CCTK_REAL dtbetal1 CCTK_ATTRIBUTE_UNUSED = dg4010;\n+ \n+ CCTK_REAL dtbetal2 CCTK_ATTRIBUTE_UNUSED = dg4020;\n+ \n+ CCTK_REAL dtbetal3 CCTK_ATTRIBUTE_UNUSED = dg4030;\n+ \n+ CCTK_REAL dbetal11 CCTK_ATTRIBUTE_UNUSED = dg4011;\n+ \n+ CCTK_REAL dbetal12 CCTK_ATTRIBUTE_UNUSED = dg4012;\n+ \n+ CCTK_REAL dbetal13 CCTK_ATTRIBUTE_UNUSED = dg4013;\n+ \n+ CCTK_REAL dbetal21 CCTK_ATTRIBUTE_UNUSED = dg4021;\n+ \n+ CCTK_REAL dbetal22 CCTK_ATTRIBUTE_UNUSED = dg4022;\n+ \n+ CCTK_REAL dbetal23 CCTK_ATTRIBUTE_UNUSED = dg4023;\n+ \n+ CCTK_REAL dbetal31 CCTK_ATTRIBUTE_UNUSED = dg4031;\n+ \n+ CCTK_REAL dbetal32 CCTK_ATTRIBUTE_UNUSED = dg4032;\n+ \n+ CCTK_REAL dbetal33 CCTK_ATTRIBUTE_UNUSED = dg4033;\n+ \n+ CCTK_REAL dtbetaerr1L CCTK_ATTRIBUTE_UNUSED = dtbetaxL - betal1*dtgu11 \n+ - betal2*dtgu12 - betal3*dtgu13 - dtbetal1*gu11 - dtbetal2*gu12 - \n+ dtbetal3*gu13;\n+ \n+ CCTK_REAL dtbetaerr2L CCTK_ATTRIBUTE_UNUSED = dtbetayL - betal1*dtgu12 \n+ - betal2*dtgu22 - betal3*dtgu23 - dtbetal1*gu12 - dtbetal2*gu22 - \n+ dtbetal3*gu23;\n+ \n+ CCTK_REAL dtbetaerr3L CCTK_ATTRIBUTE_UNUSED = dtbetazL - betal1*dtgu13 \n+ - betal2*dtgu23 - betal3*dtgu33 - dtbetal1*gu13 - dtbetal2*gu23 - \n+ dtbetal3*gu33;\n+ \n+ CCTK_REAL dbeta11 CCTK_ATTRIBUTE_UNUSED = betal1*dgu111 + \n+ betal2*dgu121 + betal3*dgu131 + dbetal11*gu11 + dbetal21*gu12 + \n+ dbetal31*gu13;\n+ \n+ CCTK_REAL dbeta21 CCTK_ATTRIBUTE_UNUSED = betal1*dgu121 + \n+ betal2*dgu221 + betal3*dgu231 + dbetal11*gu12 + dbetal21*gu22 + \n+ dbetal31*gu23;\n+ \n+ CCTK_REAL dbeta31 CCTK_ATTRIBUTE_UNUSED = betal1*dgu131 + \n+ betal2*dgu231 + betal3*dgu331 + dbetal11*gu13 + dbetal21*gu23 + \n+ dbetal31*gu33;\n+ \n+ CCTK_REAL dbeta12 CCTK_ATTRIBUTE_UNUSED = betal1*dgu112 + \n+ betal2*dgu122 + betal3*dgu132 + dbetal12*gu11 + dbetal22*gu12 + \n+ dbetal32*gu13;\n+ \n+ CCTK_REAL dbeta22 CCTK_ATTRIBUTE_UNUSED = betal1*dgu122 + \n+ betal2*dgu222 + betal3*dgu232 + dbetal12*gu12 + dbetal22*gu22 + \n+ dbetal32*gu23;\n+ \n+ CCTK_REAL dbeta32 CCTK_ATTRIBUTE_UNUSED = betal1*dgu132 + \n+ betal2*dgu232 + betal3*dgu332 + dbetal12*gu13 + dbetal22*gu23 + \n+ dbetal32*gu33;\n+ \n+ CCTK_REAL dbeta13 CCTK_ATTRIBUTE_UNUSED = betal1*dgu113 + \n+ betal2*dgu123 + betal3*dgu133 + dbetal13*gu11 + dbetal23*gu12 + \n+ dbetal33*gu13;\n+ \n+ CCTK_REAL dbeta23 CCTK_ATTRIBUTE_UNUSED = betal1*dgu123 + \n+ betal2*dgu223 + betal3*dgu233 + dbetal13*gu12 + dbetal23*gu22 + \n+ dbetal33*gu23;\n+ \n+ CCTK_REAL dbeta33 CCTK_ATTRIBUTE_UNUSED = betal1*dgu133 + \n+ betal2*dgu233 + betal3*dgu333 + dbetal13*gu13 + dbetal23*gu23 + \n+ dbetal33*gu33;\n+ \n+ CCTK_REAL dtbetasq CCTK_ATTRIBUTE_UNUSED = dtbetaxL*betal1 + \n+ dtbetayL*betal2 + dtbetazL*betal3 + betaxL*dtbetal1 + betayL*dtbetal2 + \n+ betazL*dtbetal3;\n+ \n+ CCTK_REAL csetemp290 CCTK_ATTRIBUTE_UNUSED = INV(alpL);\n+ \n+ CCTK_REAL dtalperrL CCTK_ATTRIBUTE_UNUSED = dtalpL + \n+ 0.5*csetemp290*(dg4000 - dtbetasq);\n+ \n+ CCTK_REAL kerr11L CCTK_ATTRIBUTE_UNUSED = kxxL - \n+ 0.5*csetemp290*(2*(gxxL*dbeta11 + gxyL*dbeta21 + gxzL*dbeta31) + \n+ betaxL*dg111 + betayL*dg112 + betazL*dg113 - dtg11);\n+ \n+ CCTK_REAL kerr12L CCTK_ATTRIBUTE_UNUSED = kxyL - \n+ 0.5*csetemp290*(gxxL*dbeta12 + gyyL*dbeta21 + gxyL*(dbeta11 + dbeta22) \n+ + gyzL*dbeta31 + gxzL*dbeta32 + betaxL*dg121 + betayL*dg122 + \n+ betazL*dg123 - dtg12);\n+ \n+ CCTK_REAL kerr13L CCTK_ATTRIBUTE_UNUSED = kxzL - \n+ 0.5*csetemp290*(gxxL*dbeta13 + gyzL*dbeta21 + gxyL*dbeta23 + \n+ gzzL*dbeta31 + gxzL*(dbeta11 + dbeta33) + betaxL*dg131 + betayL*dg132 + \n+ betazL*dg133 - dtg13);\n+ \n+ CCTK_REAL kerr22L CCTK_ATTRIBUTE_UNUSED = kyyL - \n+ 0.5*csetemp290*(2*(gxyL*dbeta12 + gyyL*dbeta22 + gyzL*dbeta32) + \n+ betaxL*dg221 + betayL*dg222 + betazL*dg223 - dtg22);\n+ \n+ CCTK_REAL kerr23L CCTK_ATTRIBUTE_UNUSED = kyzL - \n+ 0.5*csetemp290*(gxzL*dbeta12 + gxyL*dbeta13 + gyyL*dbeta23 + \n+ gzzL*dbeta32 + gyzL*(dbeta22 + dbeta33) + betaxL*dg231 + betayL*dg232 + \n+ betazL*dg233 - dtg23);\n+ \n+ CCTK_REAL kerr33L CCTK_ATTRIBUTE_UNUSED = kzzL - \n+ 0.5*csetemp290*(2*(gxzL*dbeta13 + gyzL*dbeta23 + gzzL*dbeta33) + \n+ betaxL*dg331 + betayL*dg332 + betazL*dg333 - dtg33);\n+ /* Copy local copies back to grid functions */\n+ alperr[index] = alperrL;\n+ betaerr1[index] = betaerr1L;\n+ betaerr2[index] = betaerr2L;\n+ betaerr3[index] = betaerr3L;\n+ dtalperr[index] = dtalperrL;\n+ dtbetaerr1[index] = dtbetaerr1L;\n+ dtbetaerr2[index] = dtbetaerr2L;\n+ dtbetaerr3[index] = dtbetaerr3L;\n+ gerr11[index] = gerr11L;\n+ gerr12[index] = gerr12L;\n+ gerr13[index] = gerr13L;\n+ gerr22[index] = gerr22L;\n+ gerr23[index] = gerr23L;\n+ gerr33[index] = gerr33L;\n+ kerr11[index] = kerr11L;\n+ kerr12[index] = kerr12L;\n+ kerr13[index] = kerr13L;\n+ kerr22[index] = kerr22L;\n+ kerr23[index] = kerr23L;\n+ kerr33[index] = kerr33L;\n+ }\n+ CCTK_ENDLOOP3(Minkowski_error);\n+}\n+extern \"C\" void Minkowski_error(CCTK_ARGUMENTS)\n+{\n+ DECLARE_CCTK_ARGUMENTS;\n+ DECLARE_CCTK_PARAMETERS;\n+ \n+ if (verbose > 1)\n+ {\n+ CCTK_VInfo(CCTK_THORNSTRING,\"Entering Minkowski_error_Body\");\n+ }\n+ if (cctk_iteration % Minkowski_error_calc_every != Minkowski_error_calc_offset)\n+ {\n+ return;\n+ }\n+ \n+ const char* const groups[] = {\n+ \"admbase::curv\",\n+ \"admbase::dtlapse\",\n+ \"admbase::dtshift\",\n+ \"admbase::lapse\",\n+ \"admbase::metric\",\n+ \"admbase::shift\",\n+ \"Minkowski::curv_error\",\n+ \"Minkowski::dtlapse_error\",\n+ \"Minkowski::dtshift_error\",\n+ \"Minkowski::lapse_error\",\n+ \"Minkowski::metric_error\",\n+ \"Minkowski::shift_error\"};\n+ AssertGroupStorage(cctkGH, \"Minkowski_error\", 12, groups);\n+ \n+ \n+ LoopOverEverything(cctkGH, Minkowski_error_Body);\n+ if (verbose > 1)\n+ {\n+ CCTK_VInfo(CCTK_THORNSTRING,\"Leaving Minkowski_error_Body\");\n+ }\n+}\n+\n+} // namespace Minkowski"}, "test": {"test_patch": "diff --git a/all_tests.txt b/all_tests.txt\nnew file mode 100644\nindex 0000000..0000000\n--- /dev/null\n+++ b/all_tests.txt\n@@ -0,0 +1,7 @@\n+GaugeWave\n+KS-tilted-EE\n+KerrSchild\n+Minkowski\n+ModifiedSchwarzschildBL\n+ShiftedGaugeWave\n+Vaidya2", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}28{"question_id": "MSB_einsteintoolkit_Cactus_pr34", "question_type": "multi_swe_bench", "description": "Add missing ModifiedSchwarzschildBL_error.cc in EinsteinExact/ModifiedSchwarzschildBL (einsteintoolkit/Cactus#34)", "content": {"org": "einsteintoolkit", "repo": "Cactus", "pr_number": 34, "issue_title": "Add missing ModifiedSchwarzschildBL_error.cc in EinsteinExact/ModifiedSchwarzschildBL", "issue_body": "This PR adds the missing source file ModifiedSchwarzschildBL_error.cc to complete the EinsteinExact/ModifiedSchwarzschildBL thorn implementation.", "base_commit": "HEAD", "resolved_issues": [{"number": 34, "title": "Implement the full functionality of ModifiedSchwarzschildBL", "body": "Please implement the full functionality of `ModifiedSchwarzschildBL` by finishing the code in `ModifiedSchwarzschildBL_error.cc`.\n\n## Thorn Information:\n- Name: ModifiedSchwarzschildBL\n- Target file: ModifiedSchwarzschildBL_error.cc\n\n## Interface Definition in interface.ccl:\n\n## Schedule Definition in schedule.ccl:\n\n## Parameters Definition in param.ccl:\n\n## Configuration Definition in configuration.ccl:\n\n## Documentation Context in readme.md and doc/documentation.tex\n\n## Related Code Context in src folder\n\n"}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/einsteintoolkit_m_cactus:pr-34", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/arrangements/EinsteinExact/ModifiedSchwarzschildBL/src/ModifiedSchwarzschildBL_error.cc b/arrangements/EinsteinExact/ModifiedSchwarzschildBL/src/ModifiedSchwarzschildBL_error.cc\nnew file mode 100644\nindex 0000000..0000000\n--- /dev/null\n+++ b/arrangements/EinsteinExact/ModifiedSchwarzschildBL/src/ModifiedSchwarzschildBL_error.cc\n@@ -0,0 +1,2153 @@\n+/* File produced by Kranc */\n+\n+#define KRANC_C\n+\n+#include <algorithm>\n+#include <assert.h>\n+#include <math.h>\n+#include <stdio.h>\n+#include <stdlib.h>\n+#include <string.h>\n+#include \"cctk.h\"\n+#include \"cctk_Arguments.h\"\n+#include \"cctk_Parameters.h\"\n+#include \"Kranc.hh\"\n+#include \"Differencing.h\"\n+#include \"loopcontrol.h\"\n+\n+/* Define macros used in calculations */\n+#define INITVALUE (42)\n+#define INV(x) ((CCTK_REAL)1.0 / (x))\n+#define SQR(x) ((x) * (x))\n+#define CUB(x) ((x) * SQR(x))\n+#define QAD(x) (SQR(SQR(x)))\n+\n+namespace ModifiedSchwarzschildBL {\n+\n+\n+static void ModifiedSchwarzschildBL_error_Body(const cGH* restrict const cctkGH, const int dir, const int face, const CCTK_REAL normal[3], const CCTK_REAL tangentA[3], const CCTK_REAL tangentB[3], const int imin[3], const int imax[3], const int n_subblock_gfs, CCTK_REAL* restrict const subblock_gfs[])\n+{\n+ DECLARE_CCTK_ARGUMENTS;\n+ DECLARE_CCTK_PARAMETERS;\n+ \n+ /* Include user-supplied include files */\n+ /* Initialise finite differencing variables */\n+ const ptrdiff_t di CCTK_ATTRIBUTE_UNUSED = 1;\n+ const ptrdiff_t dj CCTK_ATTRIBUTE_UNUSED = CCTK_GFINDEX3D(cctkGH,0,1,0) - CCTK_GFINDEX3D(cctkGH,0,0,0);\n+ const ptrdiff_t dk CCTK_ATTRIBUTE_UNUSED = CCTK_GFINDEX3D(cctkGH,0,0,1) - CCTK_GFINDEX3D(cctkGH,0,0,0);\n+ const ptrdiff_t cdi CCTK_ATTRIBUTE_UNUSED = sizeof(CCTK_REAL) * di;\n+ const ptrdiff_t cdj CCTK_ATTRIBUTE_UNUSED = sizeof(CCTK_REAL) * dj;\n+ const ptrdiff_t cdk CCTK_ATTRIBUTE_UNUSED = sizeof(CCTK_REAL) * dk;\n+ const ptrdiff_t cctkLbnd1 CCTK_ATTRIBUTE_UNUSED = cctk_lbnd[0];\n+ const ptrdiff_t cctkLbnd2 CCTK_ATTRIBUTE_UNUSED = cctk_lbnd[1];\n+ const ptrdiff_t cctkLbnd3 CCTK_ATTRIBUTE_UNUSED = cctk_lbnd[2];\n+ const CCTK_REAL t CCTK_ATTRIBUTE_UNUSED = ToReal(cctk_time);\n+ const CCTK_REAL cctkOriginSpace1 CCTK_ATTRIBUTE_UNUSED = ToReal(CCTK_ORIGIN_SPACE(0));\n+ const CCTK_REAL cctkOriginSpace2 CCTK_ATTRIBUTE_UNUSED = ToReal(CCTK_ORIGIN_SPACE(1));\n+ const CCTK_REAL cctkOriginSpace3 CCTK_ATTRIBUTE_UNUSED = ToReal(CCTK_ORIGIN_SPACE(2));\n+ const CCTK_REAL dt CCTK_ATTRIBUTE_UNUSED = ToReal(CCTK_DELTA_TIME);\n+ const CCTK_REAL dx CCTK_ATTRIBUTE_UNUSED = ToReal(CCTK_DELTA_SPACE(0));\n+ const CCTK_REAL dy CCTK_ATTRIBUTE_UNUSED = ToReal(CCTK_DELTA_SPACE(1));\n+ const CCTK_REAL dz CCTK_ATTRIBUTE_UNUSED = ToReal(CCTK_DELTA_SPACE(2));\n+ const CCTK_REAL dxi CCTK_ATTRIBUTE_UNUSED = INV(dx);\n+ const CCTK_REAL dyi CCTK_ATTRIBUTE_UNUSED = INV(dy);\n+ const CCTK_REAL dzi CCTK_ATTRIBUTE_UNUSED = INV(dz);\n+ const CCTK_REAL khalf CCTK_ATTRIBUTE_UNUSED = 0.5;\n+ const CCTK_REAL kthird CCTK_ATTRIBUTE_UNUSED = \n+ 0.333333333333333333333333333333;\n+ const CCTK_REAL ktwothird CCTK_ATTRIBUTE_UNUSED = \n+ 0.666666666666666666666666666667;\n+ const CCTK_REAL kfourthird CCTK_ATTRIBUTE_UNUSED = \n+ 1.33333333333333333333333333333;\n+ const CCTK_REAL hdxi CCTK_ATTRIBUTE_UNUSED = 0.5*dxi;\n+ const CCTK_REAL hdyi CCTK_ATTRIBUTE_UNUSED = 0.5*dyi;\n+ const CCTK_REAL hdzi CCTK_ATTRIBUTE_UNUSED = 0.5*dzi;\n+ /* Initialize predefined quantities */\n+ /* Assign local copies of arrays functions */\n+ \n+ \n+ /* Calculate temporaries and arrays functions */\n+ /* Copy local copies back to grid functions */\n+ /* Loop over the grid points */\n+ const int imin0=imin[0];\n+ const int imin1=imin[1];\n+ const int imin2=imin[2];\n+ const int imax0=imax[0];\n+ const int imax1=imax[1];\n+ const int imax2=imax[2];\n+ #pragma omp parallel\n+ CCTK_LOOP3(ModifiedSchwarzschildBL_error,\n+ i,j,k, imin0,imin1,imin2, imax0,imax1,imax2,\n+ cctk_ash[0],cctk_ash[1],cctk_ash[2])\n+ {\n+ const ptrdiff_t index CCTK_ATTRIBUTE_UNUSED = di*i + dj*j + dk*k;\n+ /* Assign local copies of grid functions */\n+ \n+ CCTK_REAL alpL CCTK_ATTRIBUTE_UNUSED = alp[index];\n+ CCTK_REAL betaxL CCTK_ATTRIBUTE_UNUSED = betax[index];\n+ CCTK_REAL betayL CCTK_ATTRIBUTE_UNUSED = betay[index];\n+ CCTK_REAL betazL CCTK_ATTRIBUTE_UNUSED = betaz[index];\n+ CCTK_REAL dtalpL CCTK_ATTRIBUTE_UNUSED = dtalp[index];\n+ CCTK_REAL dtbetaxL CCTK_ATTRIBUTE_UNUSED = dtbetax[index];\n+ CCTK_REAL dtbetayL CCTK_ATTRIBUTE_UNUSED = dtbetay[index];\n+ CCTK_REAL dtbetazL CCTK_ATTRIBUTE_UNUSED = dtbetaz[index];\n+ CCTK_REAL gxxL CCTK_ATTRIBUTE_UNUSED = gxx[index];\n+ CCTK_REAL gxyL CCTK_ATTRIBUTE_UNUSED = gxy[index];\n+ CCTK_REAL gxzL CCTK_ATTRIBUTE_UNUSED = gxz[index];\n+ CCTK_REAL gyyL CCTK_ATTRIBUTE_UNUSED = gyy[index];\n+ CCTK_REAL gyzL CCTK_ATTRIBUTE_UNUSED = gyz[index];\n+ CCTK_REAL gzzL CCTK_ATTRIBUTE_UNUSED = gzz[index];\n+ CCTK_REAL kxxL CCTK_ATTRIBUTE_UNUSED = kxx[index];\n+ CCTK_REAL kxyL CCTK_ATTRIBUTE_UNUSED = kxy[index];\n+ CCTK_REAL kxzL CCTK_ATTRIBUTE_UNUSED = kxz[index];\n+ CCTK_REAL kyyL CCTK_ATTRIBUTE_UNUSED = kyy[index];\n+ CCTK_REAL kyzL CCTK_ATTRIBUTE_UNUSED = kyz[index];\n+ CCTK_REAL kzzL CCTK_ATTRIBUTE_UNUSED = kzz[index];\n+ CCTK_REAL xL CCTK_ATTRIBUTE_UNUSED = x[index];\n+ CCTK_REAL yL CCTK_ATTRIBUTE_UNUSED = y[index];\n+ CCTK_REAL zL CCTK_ATTRIBUTE_UNUSED = z[index];\n+ \n+ /* Include user supplied include files */\n+ /* Precompute derivatives */\n+ /* Calculate temporaries and grid functions */\n+ CCTK_REAL xform1L00 CCTK_ATTRIBUTE_UNUSED = 1;\n+ \n+ CCTK_REAL xform1L01 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL xform1L02 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL xform1L03 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL xform1L10 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL csetemp0 CCTK_ATTRIBUTE_UNUSED = cos(ToReal(phi));\n+ \n+ CCTK_REAL csetemp1 CCTK_ATTRIBUTE_UNUSED = cos(ToReal(psi));\n+ \n+ CCTK_REAL csetemp2 CCTK_ATTRIBUTE_UNUSED = cos(ToReal(theta));\n+ \n+ CCTK_REAL csetemp3 CCTK_ATTRIBUTE_UNUSED = sin(ToReal(phi));\n+ \n+ CCTK_REAL csetemp4 CCTK_ATTRIBUTE_UNUSED = sin(ToReal(psi));\n+ \n+ CCTK_REAL xform1L11 CCTK_ATTRIBUTE_UNUSED = csetemp0*csetemp1 - \n+ csetemp2*csetemp3*csetemp4;\n+ \n+ CCTK_REAL xform1L12 CCTK_ATTRIBUTE_UNUSED = csetemp1*csetemp3 + \n+ csetemp0*csetemp2*csetemp4;\n+ \n+ CCTK_REAL csetemp5 CCTK_ATTRIBUTE_UNUSED = sin(ToReal(theta));\n+ \n+ CCTK_REAL xform1L13 CCTK_ATTRIBUTE_UNUSED = csetemp4*csetemp5;\n+ \n+ CCTK_REAL xform1L20 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL xform1L21 CCTK_ATTRIBUTE_UNUSED = \n+ -(csetemp1*csetemp2*csetemp3) - csetemp0*csetemp4;\n+ \n+ CCTK_REAL xform1L22 CCTK_ATTRIBUTE_UNUSED = csetemp0*csetemp1*csetemp2 \n+ - csetemp3*csetemp4;\n+ \n+ CCTK_REAL xform1L23 CCTK_ATTRIBUTE_UNUSED = csetemp1*csetemp5;\n+ \n+ CCTK_REAL xform1L30 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL xform1L31 CCTK_ATTRIBUTE_UNUSED = csetemp3*csetemp5;\n+ \n+ CCTK_REAL xform1L32 CCTK_ATTRIBUTE_UNUSED = -(csetemp0*csetemp5);\n+ \n+ CCTK_REAL xform1L33 CCTK_ATTRIBUTE_UNUSED = csetemp2;\n+ \n+ CCTK_REAL csetemp6 CCTK_ATTRIBUTE_UNUSED = SQR(ToReal(boostx));\n+ \n+ CCTK_REAL csetemp7 CCTK_ATTRIBUTE_UNUSED = SQR(ToReal(boosty));\n+ \n+ CCTK_REAL csetemp8 CCTK_ATTRIBUTE_UNUSED = SQR(ToReal(boostz));\n+ \n+ CCTK_REAL csetemp9 CCTK_ATTRIBUTE_UNUSED = INV(ToReal(lapsefactor));\n+ \n+ CCTK_REAL xform2L00 CCTK_ATTRIBUTE_UNUSED = csetemp9*INV((-1 + \n+ csetemp6 + csetemp7 + csetemp8)*(1 + sqrt(1 - csetemp6 - csetemp7 - \n+ csetemp8)))*(1 - csetemp6 - csetemp7 - csetemp8 + sqrt(1 - csetemp6 - \n+ csetemp7 - csetemp8))*(-1 + ToReal(boostx)*ToReal(shiftaddx) + \n+ ToReal(boosty)*ToReal(shiftaddy) + ToReal(boostz)*ToReal(shiftaddz));\n+ \n+ CCTK_REAL xform2L01 CCTK_ATTRIBUTE_UNUSED = csetemp9*INV((-1 + \n+ csetemp6 + csetemp7 + csetemp8)*(1 + sqrt(1 - csetemp6 - csetemp7 - \n+ csetemp8)))*(1 - csetemp6 - csetemp7 - csetemp8 + sqrt(1 - csetemp6 - \n+ csetemp7 - csetemp8))*ToReal(boostx);\n+ \n+ CCTK_REAL xform2L02 CCTK_ATTRIBUTE_UNUSED = csetemp9*INV((-1 + \n+ csetemp6 + csetemp7 + csetemp8)*(1 + sqrt(1 - csetemp6 - csetemp7 - \n+ csetemp8)))*(1 - csetemp6 - csetemp7 - csetemp8 + sqrt(1 - csetemp6 - \n+ csetemp7 - csetemp8))*ToReal(boosty);\n+ \n+ CCTK_REAL xform2L03 CCTK_ATTRIBUTE_UNUSED = csetemp9*INV((-1 + \n+ csetemp6 + csetemp7 + csetemp8)*(1 + sqrt(1 - csetemp6 - csetemp7 - \n+ csetemp8)))*(1 - csetemp6 - csetemp7 - csetemp8 + sqrt(1 - csetemp6 - \n+ csetemp7 - csetemp8))*ToReal(boostz);\n+ \n+ CCTK_REAL xform2L10 CCTK_ATTRIBUTE_UNUSED = INV((-1 + csetemp6 + \n+ csetemp7 + csetemp8)*(1 + sqrt(1 - csetemp6 - csetemp7 - \n+ csetemp8)))*((csetemp6 + (-1 + csetemp7 + csetemp8)*(1 + sqrt(1 - \n+ csetemp6 - csetemp7 - csetemp8)))*ToReal(shiftaddx) - \n+ ToReal(boostx)*(-1 + csetemp6 + csetemp7 + csetemp8 + sqrt(1 - csetemp6 \n+ - csetemp7 - csetemp8)*(-1 + ToReal(boosty)*ToReal(shiftaddy) + \n+ ToReal(boostz)*ToReal(shiftaddz))));\n+ \n+ CCTK_REAL xform2L11 CCTK_ATTRIBUTE_UNUSED = INV((-1 + csetemp6 + \n+ csetemp7 + csetemp8)*(1 + sqrt(1 - csetemp6 - csetemp7 - \n+ csetemp8)))*(csetemp6 + (-1 + csetemp7 + csetemp8)*(1 + sqrt(1 - \n+ csetemp6 - csetemp7 - csetemp8)));\n+ \n+ CCTK_REAL xform2L12 CCTK_ATTRIBUTE_UNUSED = -(INV(-1 + csetemp6 + \n+ csetemp7 + csetemp8 - sqrt(1 - csetemp6 - csetemp7 - \n+ csetemp8))*ToReal(boostx)*ToReal(boosty));\n+ \n+ CCTK_REAL xform2L13 CCTK_ATTRIBUTE_UNUSED = -(INV(-1 + csetemp6 + \n+ csetemp7 + csetemp8 - sqrt(1 - csetemp6 - csetemp7 - \n+ csetemp8))*ToReal(boostx)*ToReal(boostz));\n+ \n+ CCTK_REAL xform2L20 CCTK_ATTRIBUTE_UNUSED = INV((-1 + csetemp6 + \n+ csetemp7 + csetemp8)*(1 + sqrt(1 - csetemp6 - csetemp7 - \n+ csetemp8)))*((csetemp7 + (-1 + csetemp6 + csetemp8)*(1 + sqrt(1 - \n+ csetemp6 - csetemp7 - csetemp8)))*ToReal(shiftaddy) - \n+ ToReal(boosty)*(-1 + csetemp6 + csetemp7 + csetemp8 + sqrt(1 - csetemp6 \n+ - csetemp7 - csetemp8)*(-1 + ToReal(boostx)*ToReal(shiftaddx) + \n+ ToReal(boostz)*ToReal(shiftaddz))));\n+ \n+ CCTK_REAL xform2L21 CCTK_ATTRIBUTE_UNUSED = -(INV(-1 + csetemp6 + \n+ csetemp7 + csetemp8 - sqrt(1 - csetemp6 - csetemp7 - \n+ csetemp8))*ToReal(boostx)*ToReal(boosty));\n+ \n+ CCTK_REAL xform2L22 CCTK_ATTRIBUTE_UNUSED = INV((-1 + csetemp6 + \n+ csetemp7 + csetemp8)*(1 + sqrt(1 - csetemp6 - csetemp7 - \n+ csetemp8)))*(csetemp7 + (-1 + csetemp6 + csetemp8)*(1 + sqrt(1 - \n+ csetemp6 - csetemp7 - csetemp8)));\n+ \n+ CCTK_REAL xform2L23 CCTK_ATTRIBUTE_UNUSED = -(INV(-1 + csetemp6 + \n+ csetemp7 + csetemp8 - sqrt(1 - csetemp6 - csetemp7 - \n+ csetemp8))*ToReal(boosty)*ToReal(boostz));\n+ \n+ CCTK_REAL xform2L30 CCTK_ATTRIBUTE_UNUSED = INV((-1 + csetemp6 + \n+ csetemp7 + csetemp8)*(1 + sqrt(1 - csetemp6 - csetemp7 - \n+ csetemp8)))*(-(ToReal(boostz)*(-1 + csetemp6 + csetemp7 + csetemp8 + \n+ sqrt(1 - csetemp6 - csetemp7 - csetemp8)*(-1 + \n+ ToReal(boostx)*ToReal(shiftaddx) + ToReal(boosty)*ToReal(shiftaddy)))) \n+ + (-1 + csetemp6 + csetemp7 + csetemp8 + (-1 + csetemp6 + \n+ csetemp7)*sqrt(1 - csetemp6 - csetemp7 - csetemp8))*ToReal(shiftaddz));\n+ \n+ CCTK_REAL xform2L31 CCTK_ATTRIBUTE_UNUSED = -(INV(-1 + csetemp6 + \n+ csetemp7 + csetemp8 - sqrt(1 - csetemp6 - csetemp7 - \n+ csetemp8))*ToReal(boostx)*ToReal(boostz));\n+ \n+ CCTK_REAL xform2L32 CCTK_ATTRIBUTE_UNUSED = -(INV(-1 + csetemp6 + \n+ csetemp7 + csetemp8 - sqrt(1 - csetemp6 - csetemp7 - \n+ csetemp8))*ToReal(boosty)*ToReal(boostz));\n+ \n+ CCTK_REAL xform2L33 CCTK_ATTRIBUTE_UNUSED = INV((-1 + csetemp6 + \n+ csetemp7 + csetemp8)*(1 + sqrt(1 - csetemp6 - csetemp7 - \n+ csetemp8)))*(-1 + csetemp6 + csetemp7 + csetemp8 + (-1 + csetemp6 + \n+ csetemp7)*sqrt(1 - csetemp6 - csetemp7 - csetemp8));\n+ \n+ CCTK_REAL xformL00 CCTK_ATTRIBUTE_UNUSED = xform1L00*xform2L00 + \n+ xform1L01*xform2L10 + xform1L02*xform2L20 + xform1L03*xform2L30;\n+ \n+ CCTK_REAL xformL01 CCTK_ATTRIBUTE_UNUSED = xform1L00*xform2L01 + \n+ xform1L01*xform2L11 + xform1L02*xform2L21 + xform1L03*xform2L31;\n+ \n+ CCTK_REAL xformL02 CCTK_ATTRIBUTE_UNUSED = xform1L00*xform2L02 + \n+ xform1L01*xform2L12 + xform1L02*xform2L22 + xform1L03*xform2L32;\n+ \n+ CCTK_REAL xformL03 CCTK_ATTRIBUTE_UNUSED = xform1L00*xform2L03 + \n+ xform1L01*xform2L13 + xform1L02*xform2L23 + xform1L03*xform2L33;\n+ \n+ CCTK_REAL xformL10 CCTK_ATTRIBUTE_UNUSED = xform1L10*xform2L00 + \n+ xform1L11*xform2L10 + xform1L12*xform2L20 + xform1L13*xform2L30;\n+ \n+ CCTK_REAL xformL11 CCTK_ATTRIBUTE_UNUSED = xform1L10*xform2L01 + \n+ xform1L11*xform2L11 + xform1L12*xform2L21 + xform1L13*xform2L31;\n+ \n+ CCTK_REAL xformL12 CCTK_ATTRIBUTE_UNUSED = xform1L10*xform2L02 + \n+ xform1L11*xform2L12 + xform1L12*xform2L22 + xform1L13*xform2L32;\n+ \n+ CCTK_REAL xformL13 CCTK_ATTRIBUTE_UNUSED = xform1L10*xform2L03 + \n+ xform1L11*xform2L13 + xform1L12*xform2L23 + xform1L13*xform2L33;\n+ \n+ CCTK_REAL xformL20 CCTK_ATTRIBUTE_UNUSED = xform1L20*xform2L00 + \n+ xform1L21*xform2L10 + xform1L22*xform2L20 + xform1L23*xform2L30;\n+ \n+ CCTK_REAL xformL21 CCTK_ATTRIBUTE_UNUSED = xform1L20*xform2L01 + \n+ xform1L21*xform2L11 + xform1L22*xform2L21 + xform1L23*xform2L31;\n+ \n+ CCTK_REAL xformL22 CCTK_ATTRIBUTE_UNUSED = xform1L20*xform2L02 + \n+ xform1L21*xform2L12 + xform1L22*xform2L22 + xform1L23*xform2L32;\n+ \n+ CCTK_REAL xformL23 CCTK_ATTRIBUTE_UNUSED = xform1L20*xform2L03 + \n+ xform1L21*xform2L13 + xform1L22*xform2L23 + xform1L23*xform2L33;\n+ \n+ CCTK_REAL xformL30 CCTK_ATTRIBUTE_UNUSED = xform1L30*xform2L00 + \n+ xform1L31*xform2L10 + xform1L32*xform2L20 + xform1L33*xform2L30;\n+ \n+ CCTK_REAL xformL31 CCTK_ATTRIBUTE_UNUSED = xform1L30*xform2L01 + \n+ xform1L31*xform2L11 + xform1L32*xform2L21 + xform1L33*xform2L31;\n+ \n+ CCTK_REAL xformL32 CCTK_ATTRIBUTE_UNUSED = xform1L30*xform2L02 + \n+ xform1L31*xform2L12 + xform1L32*xform2L22 + xform1L33*xform2L32;\n+ \n+ CCTK_REAL xformL33 CCTK_ATTRIBUTE_UNUSED = xform1L30*xform2L03 + \n+ xform1L31*xform2L13 + xform1L32*xform2L23 + xform1L33*xform2L33;\n+ \n+ CCTK_REAL xx0 CCTK_ATTRIBUTE_UNUSED = t - ToReal(timeoffset);\n+ \n+ CCTK_REAL xx1 CCTK_ATTRIBUTE_UNUSED = xL - ToReal(positionx);\n+ \n+ CCTK_REAL xx2 CCTK_ATTRIBUTE_UNUSED = yL - ToReal(positiony);\n+ \n+ CCTK_REAL xx3 CCTK_ATTRIBUTE_UNUSED = zL - ToReal(positionz);\n+ \n+ CCTK_REAL txx1 CCTK_ATTRIBUTE_UNUSED = xformL10*xx0 + xformL11*xx1 + \n+ xformL12*xx2 + xformL13*xx3;\n+ \n+ CCTK_REAL txx2 CCTK_ATTRIBUTE_UNUSED = xformL20*xx0 + xformL21*xx1 + \n+ xformL22*xx2 + xformL23*xx3;\n+ \n+ CCTK_REAL txx3 CCTK_ATTRIBUTE_UNUSED = xformL30*xx0 + xformL31*xx1 + \n+ xformL32*xx2 + xformL33*xx3;\n+ \n+ CCTK_REAL X CCTK_ATTRIBUTE_UNUSED = txx1;\n+ \n+ CCTK_REAL Y CCTK_ATTRIBUTE_UNUSED = txx2;\n+ \n+ CCTK_REAL Z CCTK_ATTRIBUTE_UNUSED = txx3;\n+ \n+ CCTK_REAL rXYZ CCTK_ATTRIBUTE_UNUSED = sqrt(SQR(X) + SQR(Y) + SQR(Z));\n+ \n+ CCTK_REAL tg400 CCTK_ATTRIBUTE_UNUSED = -1;\n+ \n+ CCTK_REAL tg401 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tg402 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tg403 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL csetemp10 CCTK_ATTRIBUTE_UNUSED = 0.5*ToReal(M);\n+ \n+ CCTK_REAL csetemp11 CCTK_ATTRIBUTE_UNUSED = INV(rXYZ);\n+ \n+ CCTK_REAL csetemp12 CCTK_ATTRIBUTE_UNUSED = INV(ToReal(M));\n+ \n+ CCTK_REAL csetemp13 CCTK_ATTRIBUTE_UNUSED = SQR(ToReal(M));\n+ \n+ CCTK_REAL csetemp14 CCTK_ATTRIBUTE_UNUSED = INV(SQR(Pi));\n+ \n+ CCTK_REAL tg411 CCTK_ATTRIBUTE_UNUSED = 0.00390625*QAD(4 + \n+ csetemp11*(8*fmin(csetemp10,rXYZ) + csetemp12*(csetemp13*(csetemp14 - \n+ csetemp14*cos(4*csetemp12*Pi*fmin(csetemp10,rXYZ))) - \n+ 8*SQR(fmin(csetemp10,rXYZ)))));\n+ \n+ CCTK_REAL tg412 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tg413 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tg422 CCTK_ATTRIBUTE_UNUSED = 0.00390625*QAD(4 + \n+ csetemp11*(8*fmin(csetemp10,rXYZ) + csetemp12*(csetemp13*(csetemp14 - \n+ csetemp14*cos(4*csetemp12*Pi*fmin(csetemp10,rXYZ))) - \n+ 8*SQR(fmin(csetemp10,rXYZ)))));\n+ \n+ CCTK_REAL tg423 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tg433 CCTK_ATTRIBUTE_UNUSED = 0.00390625*QAD(4 + \n+ csetemp11*(8*fmin(csetemp10,rXYZ) + csetemp12*(csetemp13*(csetemp14 - \n+ csetemp14*cos(4*csetemp12*Pi*fmin(csetemp10,rXYZ))) - \n+ 8*SQR(fmin(csetemp10,rXYZ)))));\n+ \n+ CCTK_REAL tdg4000 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tdg4001 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tdg4002 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tdg4003 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tdg4010 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tdg4011 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tdg4012 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tdg4013 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tdg4020 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tdg4021 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tdg4022 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tdg4023 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tdg4030 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tdg4031 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tdg4032 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tdg4033 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tdg4110 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL csetemp15 CCTK_ATTRIBUTE_UNUSED = pow(rXYZ,-6);\n+ \n+ CCTK_REAL csetemp16 CCTK_ATTRIBUTE_UNUSED = 2*rXYZ;\n+ \n+ CCTK_REAL csetemp17 CCTK_ATTRIBUTE_UNUSED = INV(QAD(ToReal(M)));\n+ \n+ CCTK_REAL csetemp18 CCTK_ATTRIBUTE_UNUSED = pow(Pi,-8);\n+ \n+ CCTK_REAL csetemp19 CCTK_ATTRIBUTE_UNUSED = SQR(Pi);\n+ \n+ CCTK_REAL csetemp20 CCTK_ATTRIBUTE_UNUSED = SQR(rXYZ);\n+ \n+ CCTK_REAL tdg4111 CCTK_ATTRIBUTE_UNUSED = IfThen(ToReal(M) <= \n+ csetemp16,-0.25*csetemp15*X*CUB(csetemp16 + \n+ ToReal(M))*ToReal(M),-0.25*csetemp15*csetemp17*csetemp18*X*CUB(csetemp13*SQR(sin(2*csetemp12*Pi*rXYZ)) \n+ + csetemp19*(-4*csetemp20 + 6*rXYZ*ToReal(M)))*(4*csetemp19*csetemp20 + \n+ csetemp13*SQR(sin(2*csetemp12*Pi*rXYZ)) - \n+ 2*Pi*rXYZ*sin(4*csetemp12*Pi*rXYZ)*ToReal(M)));\n+ \n+ CCTK_REAL tdg4112 CCTK_ATTRIBUTE_UNUSED = IfThen(ToReal(M) <= \n+ csetemp16,-0.25*csetemp15*Y*CUB(csetemp16 + \n+ ToReal(M))*ToReal(M),-0.25*csetemp15*csetemp17*csetemp18*Y*CUB(csetemp13*SQR(sin(2*csetemp12*Pi*rXYZ)) \n+ + csetemp19*(-4*csetemp20 + 6*rXYZ*ToReal(M)))*(4*csetemp19*csetemp20 + \n+ csetemp13*SQR(sin(2*csetemp12*Pi*rXYZ)) - \n+ 2*Pi*rXYZ*sin(4*csetemp12*Pi*rXYZ)*ToReal(M)));\n+ \n+ CCTK_REAL tdg4113 CCTK_ATTRIBUTE_UNUSED = IfThen(ToReal(M) <= \n+ csetemp16,-0.25*csetemp15*Z*CUB(csetemp16 + \n+ ToReal(M))*ToReal(M),-0.25*csetemp15*csetemp17*csetemp18*Z*CUB(csetemp13*SQR(sin(2*csetemp12*Pi*rXYZ)) \n+ + csetemp19*(-4*csetemp20 + 6*rXYZ*ToReal(M)))*(4*csetemp19*csetemp20 + \n+ csetemp13*SQR(sin(2*csetemp12*Pi*rXYZ)) - \n+ 2*Pi*rXYZ*sin(4*csetemp12*Pi*rXYZ)*ToReal(M)));\n+ \n+ CCTK_REAL tdg4120 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tdg4121 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tdg4122 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tdg4123 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tdg4130 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tdg4131 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tdg4132 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tdg4133 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tdg4220 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tdg4221 CCTK_ATTRIBUTE_UNUSED = IfThen(ToReal(M) <= \n+ csetemp16,-0.25*csetemp15*X*CUB(csetemp16 + \n+ ToReal(M))*ToReal(M),-0.25*csetemp15*csetemp17*csetemp18*X*CUB(csetemp13*SQR(sin(2*csetemp12*Pi*rXYZ)) \n+ + csetemp19*(-4*csetemp20 + 6*rXYZ*ToReal(M)))*(4*csetemp19*csetemp20 + \n+ csetemp13*SQR(sin(2*csetemp12*Pi*rXYZ)) - \n+ 2*Pi*rXYZ*sin(4*csetemp12*Pi*rXYZ)*ToReal(M)));\n+ \n+ CCTK_REAL tdg4222 CCTK_ATTRIBUTE_UNUSED = IfThen(ToReal(M) <= \n+ csetemp16,-0.25*csetemp15*Y*CUB(csetemp16 + \n+ ToReal(M))*ToReal(M),-0.25*csetemp15*csetemp17*csetemp18*Y*CUB(csetemp13*SQR(sin(2*csetemp12*Pi*rXYZ)) \n+ + csetemp19*(-4*csetemp20 + 6*rXYZ*ToReal(M)))*(4*csetemp19*csetemp20 + \n+ csetemp13*SQR(sin(2*csetemp12*Pi*rXYZ)) - \n+ 2*Pi*rXYZ*sin(4*csetemp12*Pi*rXYZ)*ToReal(M)));\n+ \n+ CCTK_REAL tdg4223 CCTK_ATTRIBUTE_UNUSED = IfThen(ToReal(M) <= \n+ csetemp16,-0.25*csetemp15*Z*CUB(csetemp16 + \n+ ToReal(M))*ToReal(M),-0.25*csetemp15*csetemp17*csetemp18*Z*CUB(csetemp13*SQR(sin(2*csetemp12*Pi*rXYZ)) \n+ + csetemp19*(-4*csetemp20 + 6*rXYZ*ToReal(M)))*(4*csetemp19*csetemp20 + \n+ csetemp13*SQR(sin(2*csetemp12*Pi*rXYZ)) - \n+ 2*Pi*rXYZ*sin(4*csetemp12*Pi*rXYZ)*ToReal(M)));\n+ \n+ CCTK_REAL tdg4230 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tdg4231 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tdg4232 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tdg4233 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tdg4330 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tdg4331 CCTK_ATTRIBUTE_UNUSED = IfThen(ToReal(M) <= \n+ csetemp16,-0.25*csetemp15*X*CUB(csetemp16 + \n+ ToReal(M))*ToReal(M),-0.25*csetemp15*csetemp17*csetemp18*X*CUB(csetemp13*SQR(sin(2*csetemp12*Pi*rXYZ)) \n+ + csetemp19*(-4*csetemp20 + 6*rXYZ*ToReal(M)))*(4*csetemp19*csetemp20 + \n+ csetemp13*SQR(sin(2*csetemp12*Pi*rXYZ)) - \n+ 2*Pi*rXYZ*sin(4*csetemp12*Pi*rXYZ)*ToReal(M)));\n+ \n+ CCTK_REAL tdg4332 CCTK_ATTRIBUTE_UNUSED = IfThen(ToReal(M) <= \n+ csetemp16,-0.25*csetemp15*Y*CUB(csetemp16 + \n+ ToReal(M))*ToReal(M),-0.25*csetemp15*csetemp17*csetemp18*Y*CUB(csetemp13*SQR(sin(2*csetemp12*Pi*rXYZ)) \n+ + csetemp19*(-4*csetemp20 + 6*rXYZ*ToReal(M)))*(4*csetemp19*csetemp20 + \n+ csetemp13*SQR(sin(2*csetemp12*Pi*rXYZ)) - \n+ 2*Pi*rXYZ*sin(4*csetemp12*Pi*rXYZ)*ToReal(M)));\n+ \n+ CCTK_REAL tdg4333 CCTK_ATTRIBUTE_UNUSED = IfThen(ToReal(M) <= \n+ csetemp16,-0.25*csetemp15*Z*CUB(csetemp16 + \n+ ToReal(M))*ToReal(M),-0.25*csetemp15*csetemp17*csetemp18*Z*CUB(csetemp13*SQR(sin(2*csetemp12*Pi*rXYZ)) \n+ + csetemp19*(-4*csetemp20 + 6*rXYZ*ToReal(M)))*(4*csetemp19*csetemp20 + \n+ csetemp13*SQR(sin(2*csetemp12*Pi*rXYZ)) - \n+ 2*Pi*rXYZ*sin(4*csetemp12*Pi*rXYZ)*ToReal(M)));\n+ \n+ CCTK_REAL g400 CCTK_ATTRIBUTE_UNUSED = 2*(tg423*xformL20*xformL30 + \n+ xformL00*(tg401*xformL10 + tg402*xformL20 + tg403*xformL30) + \n+ xformL10*(tg412*xformL20 + tg413*xformL30)) + tg400*SQR(xformL00) + \n+ tg411*SQR(xformL10) + tg422*SQR(xformL20) + tg433*SQR(xformL30);\n+ \n+ CCTK_REAL csetemp21 CCTK_ATTRIBUTE_UNUSED = tg400*xformL01;\n+ \n+ CCTK_REAL csetemp22 CCTK_ATTRIBUTE_UNUSED = tg401*xformL11;\n+ \n+ CCTK_REAL csetemp23 CCTK_ATTRIBUTE_UNUSED = tg402*xformL21;\n+ \n+ CCTK_REAL csetemp24 CCTK_ATTRIBUTE_UNUSED = tg403*xformL31;\n+ \n+ CCTK_REAL csetemp25 CCTK_ATTRIBUTE_UNUSED = tg401*xformL01;\n+ \n+ CCTK_REAL csetemp26 CCTK_ATTRIBUTE_UNUSED = tg411*xformL11;\n+ \n+ CCTK_REAL csetemp27 CCTK_ATTRIBUTE_UNUSED = tg412*xformL21;\n+ \n+ CCTK_REAL csetemp28 CCTK_ATTRIBUTE_UNUSED = tg413*xformL31;\n+ \n+ CCTK_REAL csetemp29 CCTK_ATTRIBUTE_UNUSED = tg402*xformL01;\n+ \n+ CCTK_REAL csetemp30 CCTK_ATTRIBUTE_UNUSED = tg412*xformL11;\n+ \n+ CCTK_REAL csetemp31 CCTK_ATTRIBUTE_UNUSED = tg422*xformL21;\n+ \n+ CCTK_REAL csetemp32 CCTK_ATTRIBUTE_UNUSED = tg423*xformL31;\n+ \n+ CCTK_REAL csetemp33 CCTK_ATTRIBUTE_UNUSED = tg403*xformL01;\n+ \n+ CCTK_REAL csetemp34 CCTK_ATTRIBUTE_UNUSED = tg413*xformL11;\n+ \n+ CCTK_REAL csetemp35 CCTK_ATTRIBUTE_UNUSED = tg423*xformL21;\n+ \n+ CCTK_REAL csetemp36 CCTK_ATTRIBUTE_UNUSED = tg433*xformL31;\n+ \n+ CCTK_REAL g401 CCTK_ATTRIBUTE_UNUSED = (csetemp21 + csetemp22 + \n+ csetemp23 + csetemp24)*xformL00 + (csetemp25 + csetemp26 + csetemp27 + \n+ csetemp28)*xformL10 + (csetemp29 + csetemp30 + csetemp31 + \n+ csetemp32)*xformL20 + (csetemp33 + csetemp34 + csetemp35 + \n+ csetemp36)*xformL30;\n+ \n+ CCTK_REAL csetemp37 CCTK_ATTRIBUTE_UNUSED = tg400*xformL02;\n+ \n+ CCTK_REAL csetemp38 CCTK_ATTRIBUTE_UNUSED = tg401*xformL12;\n+ \n+ CCTK_REAL csetemp39 CCTK_ATTRIBUTE_UNUSED = tg402*xformL22;\n+ \n+ CCTK_REAL csetemp40 CCTK_ATTRIBUTE_UNUSED = tg403*xformL32;\n+ \n+ CCTK_REAL csetemp41 CCTK_ATTRIBUTE_UNUSED = tg401*xformL02;\n+ \n+ CCTK_REAL csetemp42 CCTK_ATTRIBUTE_UNUSED = tg411*xformL12;\n+ \n+ CCTK_REAL csetemp43 CCTK_ATTRIBUTE_UNUSED = tg412*xformL22;\n+ \n+ CCTK_REAL csetemp44 CCTK_ATTRIBUTE_UNUSED = tg413*xformL32;\n+ \n+ CCTK_REAL csetemp45 CCTK_ATTRIBUTE_UNUSED = tg402*xformL02;\n+ \n+ CCTK_REAL csetemp46 CCTK_ATTRIBUTE_UNUSED = tg412*xformL12;\n+ \n+ CCTK_REAL csetemp47 CCTK_ATTRIBUTE_UNUSED = tg422*xformL22;\n+ \n+ CCTK_REAL csetemp48 CCTK_ATTRIBUTE_UNUSED = tg423*xformL32;\n+ \n+ CCTK_REAL csetemp49 CCTK_ATTRIBUTE_UNUSED = tg403*xformL02;\n+ \n+ CCTK_REAL csetemp50 CCTK_ATTRIBUTE_UNUSED = tg413*xformL12;\n+ \n+ CCTK_REAL csetemp51 CCTK_ATTRIBUTE_UNUSED = tg423*xformL22;\n+ \n+ CCTK_REAL csetemp52 CCTK_ATTRIBUTE_UNUSED = tg433*xformL32;\n+ \n+ CCTK_REAL g402 CCTK_ATTRIBUTE_UNUSED = (csetemp37 + csetemp38 + \n+ csetemp39 + csetemp40)*xformL00 + (csetemp41 + csetemp42 + csetemp43 + \n+ csetemp44)*xformL10 + (csetemp45 + csetemp46 + csetemp47 + \n+ csetemp48)*xformL20 + (csetemp49 + csetemp50 + csetemp51 + \n+ csetemp52)*xformL30;\n+ \n+ CCTK_REAL csetemp53 CCTK_ATTRIBUTE_UNUSED = tg400*xformL03;\n+ \n+ CCTK_REAL csetemp54 CCTK_ATTRIBUTE_UNUSED = tg401*xformL13;\n+ \n+ CCTK_REAL csetemp55 CCTK_ATTRIBUTE_UNUSED = tg402*xformL23;\n+ \n+ CCTK_REAL csetemp56 CCTK_ATTRIBUTE_UNUSED = tg403*xformL33;\n+ \n+ CCTK_REAL csetemp57 CCTK_ATTRIBUTE_UNUSED = tg401*xformL03;\n+ \n+ CCTK_REAL csetemp58 CCTK_ATTRIBUTE_UNUSED = tg411*xformL13;\n+ \n+ CCTK_REAL csetemp59 CCTK_ATTRIBUTE_UNUSED = tg412*xformL23;\n+ \n+ CCTK_REAL csetemp60 CCTK_ATTRIBUTE_UNUSED = tg413*xformL33;\n+ \n+ CCTK_REAL csetemp61 CCTK_ATTRIBUTE_UNUSED = tg402*xformL03;\n+ \n+ CCTK_REAL csetemp62 CCTK_ATTRIBUTE_UNUSED = tg412*xformL13;\n+ \n+ CCTK_REAL csetemp63 CCTK_ATTRIBUTE_UNUSED = tg422*xformL23;\n+ \n+ CCTK_REAL csetemp64 CCTK_ATTRIBUTE_UNUSED = tg423*xformL33;\n+ \n+ CCTK_REAL csetemp65 CCTK_ATTRIBUTE_UNUSED = tg403*xformL03;\n+ \n+ CCTK_REAL csetemp66 CCTK_ATTRIBUTE_UNUSED = tg413*xformL13;\n+ \n+ CCTK_REAL csetemp67 CCTK_ATTRIBUTE_UNUSED = tg423*xformL23;\n+ \n+ CCTK_REAL csetemp68 CCTK_ATTRIBUTE_UNUSED = tg433*xformL33;\n+ \n+ CCTK_REAL g403 CCTK_ATTRIBUTE_UNUSED = (csetemp53 + csetemp54 + \n+ csetemp55 + csetemp56)*xformL00 + (csetemp57 + csetemp58 + csetemp59 + \n+ csetemp60)*xformL10 + (csetemp61 + csetemp62 + csetemp63 + \n+ csetemp64)*xformL20 + (csetemp65 + csetemp66 + csetemp67 + \n+ csetemp68)*xformL30;\n+ \n+ CCTK_REAL g411 CCTK_ATTRIBUTE_UNUSED = (csetemp21 + csetemp22 + \n+ csetemp23 + csetemp24)*xformL01 + (csetemp25 + csetemp26 + csetemp27 + \n+ csetemp28)*xformL11 + (csetemp29 + csetemp30 + csetemp31 + \n+ csetemp32)*xformL21 + (csetemp33 + csetemp34 + csetemp35 + \n+ csetemp36)*xformL31;\n+ \n+ CCTK_REAL g412 CCTK_ATTRIBUTE_UNUSED = (csetemp37 + csetemp38 + \n+ csetemp39 + csetemp40)*xformL01 + (csetemp41 + csetemp42 + csetemp43 + \n+ csetemp44)*xformL11 + (csetemp45 + csetemp46 + csetemp47 + \n+ csetemp48)*xformL21 + (csetemp49 + csetemp50 + csetemp51 + \n+ csetemp52)*xformL31;\n+ \n+ CCTK_REAL g413 CCTK_ATTRIBUTE_UNUSED = (csetemp53 + csetemp54 + \n+ csetemp55 + csetemp56)*xformL01 + (csetemp57 + csetemp58 + csetemp59 + \n+ csetemp60)*xformL11 + (csetemp61 + csetemp62 + csetemp63 + \n+ csetemp64)*xformL21 + (csetemp65 + csetemp66 + csetemp67 + \n+ csetemp68)*xformL31;\n+ \n+ CCTK_REAL g422 CCTK_ATTRIBUTE_UNUSED = (csetemp37 + csetemp38 + \n+ csetemp39 + csetemp40)*xformL02 + (csetemp41 + csetemp42 + csetemp43 + \n+ csetemp44)*xformL12 + (csetemp45 + csetemp46 + csetemp47 + \n+ csetemp48)*xformL22 + (csetemp49 + csetemp50 + csetemp51 + \n+ csetemp52)*xformL32;\n+ \n+ CCTK_REAL g423 CCTK_ATTRIBUTE_UNUSED = (csetemp53 + csetemp54 + \n+ csetemp55 + csetemp56)*xformL02 + (csetemp57 + csetemp58 + csetemp59 + \n+ csetemp60)*xformL12 + (csetemp61 + csetemp62 + csetemp63 + \n+ csetemp64)*xformL22 + (csetemp65 + csetemp66 + csetemp67 + \n+ csetemp68)*xformL32;\n+ \n+ CCTK_REAL g433 CCTK_ATTRIBUTE_UNUSED = (csetemp53 + csetemp54 + \n+ csetemp55 + csetemp56)*xformL03 + (csetemp57 + csetemp58 + csetemp59 + \n+ csetemp60)*xformL13 + (csetemp61 + csetemp62 + csetemp63 + \n+ csetemp64)*xformL23 + (csetemp65 + csetemp66 + csetemp67 + \n+ csetemp68)*xformL33;\n+ \n+ CCTK_REAL csetemp69 CCTK_ATTRIBUTE_UNUSED = tdg4000*xformL00;\n+ \n+ CCTK_REAL csetemp70 CCTK_ATTRIBUTE_UNUSED = tdg4001*xformL10;\n+ \n+ CCTK_REAL csetemp71 CCTK_ATTRIBUTE_UNUSED = tdg4002*xformL20;\n+ \n+ CCTK_REAL csetemp72 CCTK_ATTRIBUTE_UNUSED = tdg4003*xformL30;\n+ \n+ CCTK_REAL csetemp73 CCTK_ATTRIBUTE_UNUSED = tdg4010*xformL00;\n+ \n+ CCTK_REAL csetemp74 CCTK_ATTRIBUTE_UNUSED = tdg4011*xformL10;\n+ \n+ CCTK_REAL csetemp75 CCTK_ATTRIBUTE_UNUSED = tdg4012*xformL20;\n+ \n+ CCTK_REAL csetemp76 CCTK_ATTRIBUTE_UNUSED = tdg4013*xformL30;\n+ \n+ CCTK_REAL csetemp77 CCTK_ATTRIBUTE_UNUSED = tdg4020*xformL00;\n+ \n+ CCTK_REAL csetemp78 CCTK_ATTRIBUTE_UNUSED = tdg4021*xformL10;\n+ \n+ CCTK_REAL csetemp79 CCTK_ATTRIBUTE_UNUSED = tdg4022*xformL20;\n+ \n+ CCTK_REAL csetemp80 CCTK_ATTRIBUTE_UNUSED = tdg4023*xformL30;\n+ \n+ CCTK_REAL csetemp81 CCTK_ATTRIBUTE_UNUSED = tdg4030*xformL00;\n+ \n+ CCTK_REAL csetemp82 CCTK_ATTRIBUTE_UNUSED = tdg4031*xformL10;\n+ \n+ CCTK_REAL csetemp83 CCTK_ATTRIBUTE_UNUSED = tdg4032*xformL20;\n+ \n+ CCTK_REAL csetemp84 CCTK_ATTRIBUTE_UNUSED = tdg4033*xformL30;\n+ \n+ CCTK_REAL csetemp85 CCTK_ATTRIBUTE_UNUSED = tdg4110*xformL00;\n+ \n+ CCTK_REAL csetemp86 CCTK_ATTRIBUTE_UNUSED = tdg4111*xformL10;\n+ \n+ CCTK_REAL csetemp87 CCTK_ATTRIBUTE_UNUSED = tdg4112*xformL20;\n+ \n+ CCTK_REAL csetemp88 CCTK_ATTRIBUTE_UNUSED = tdg4113*xformL30;\n+ \n+ CCTK_REAL csetemp89 CCTK_ATTRIBUTE_UNUSED = tdg4120*xformL00;\n+ \n+ CCTK_REAL csetemp90 CCTK_ATTRIBUTE_UNUSED = tdg4121*xformL10;\n+ \n+ CCTK_REAL csetemp91 CCTK_ATTRIBUTE_UNUSED = tdg4122*xformL20;\n+ \n+ CCTK_REAL csetemp92 CCTK_ATTRIBUTE_UNUSED = tdg4123*xformL30;\n+ \n+ CCTK_REAL csetemp93 CCTK_ATTRIBUTE_UNUSED = tdg4130*xformL00;\n+ \n+ CCTK_REAL csetemp94 CCTK_ATTRIBUTE_UNUSED = tdg4131*xformL10;\n+ \n+ CCTK_REAL csetemp95 CCTK_ATTRIBUTE_UNUSED = tdg4132*xformL20;\n+ \n+ CCTK_REAL csetemp96 CCTK_ATTRIBUTE_UNUSED = tdg4133*xformL30;\n+ \n+ CCTK_REAL csetemp97 CCTK_ATTRIBUTE_UNUSED = tdg4220*xformL00;\n+ \n+ CCTK_REAL csetemp98 CCTK_ATTRIBUTE_UNUSED = tdg4221*xformL10;\n+ \n+ CCTK_REAL csetemp99 CCTK_ATTRIBUTE_UNUSED = tdg4222*xformL20;\n+ \n+ CCTK_REAL csetemp100 CCTK_ATTRIBUTE_UNUSED = tdg4223*xformL30;\n+ \n+ CCTK_REAL csetemp101 CCTK_ATTRIBUTE_UNUSED = tdg4230*xformL00;\n+ \n+ CCTK_REAL csetemp102 CCTK_ATTRIBUTE_UNUSED = tdg4231*xformL10;\n+ \n+ CCTK_REAL csetemp103 CCTK_ATTRIBUTE_UNUSED = tdg4232*xformL20;\n+ \n+ CCTK_REAL csetemp104 CCTK_ATTRIBUTE_UNUSED = tdg4233*xformL30;\n+ \n+ CCTK_REAL csetemp105 CCTK_ATTRIBUTE_UNUSED = tdg4330*xformL00;\n+ \n+ CCTK_REAL csetemp106 CCTK_ATTRIBUTE_UNUSED = tdg4331*xformL10;\n+ \n+ CCTK_REAL csetemp107 CCTK_ATTRIBUTE_UNUSED = tdg4332*xformL20;\n+ \n+ CCTK_REAL csetemp108 CCTK_ATTRIBUTE_UNUSED = tdg4333*xformL30;\n+ \n+ CCTK_REAL dg4000 CCTK_ATTRIBUTE_UNUSED = xformL20*((csetemp77 + \n+ csetemp78 + csetemp79 + csetemp80)*xformL00 + (csetemp89 + csetemp90 + \n+ csetemp91 + csetemp92)*xformL10 + (csetemp100 + csetemp97 + csetemp98 + \n+ csetemp99)*xformL20 + (csetemp101 + csetemp102 + csetemp103 + \n+ csetemp104)*xformL30) + xformL30*((csetemp81 + csetemp82 + csetemp83 + \n+ csetemp84)*xformL00 + (csetemp93 + csetemp94 + csetemp95 + \n+ csetemp96)*xformL10 + (csetemp101 + csetemp102 + csetemp103 + \n+ csetemp104)*xformL20 + (csetemp105 + csetemp106 + csetemp107 + \n+ csetemp108)*xformL30) + xformL00*((csetemp69 + csetemp70 + csetemp71 + \n+ csetemp72)*xformL00 + (csetemp73 + csetemp74 + csetemp75 + \n+ csetemp76)*xformL10 + (csetemp77 + csetemp78 + csetemp79 + \n+ csetemp80)*xformL20 + (csetemp81 + csetemp82 + csetemp83 + \n+ csetemp84)*xformL30) + xformL10*((csetemp73 + csetemp74 + csetemp75 + \n+ csetemp76)*xformL00 + (csetemp85 + csetemp86 + csetemp87 + \n+ csetemp88)*xformL10 + (csetemp89 + csetemp90 + csetemp91 + \n+ csetemp92)*xformL20 + (csetemp93 + csetemp94 + csetemp95 + \n+ csetemp96)*xformL30);\n+ \n+ CCTK_REAL dg4010 CCTK_ATTRIBUTE_UNUSED = xformL20*((csetemp77 + \n+ csetemp78 + csetemp79 + csetemp80)*xformL01 + (csetemp89 + csetemp90 + \n+ csetemp91 + csetemp92)*xformL11 + (csetemp100 + csetemp97 + csetemp98 + \n+ csetemp99)*xformL21 + (csetemp101 + csetemp102 + csetemp103 + \n+ csetemp104)*xformL31) + xformL30*((csetemp81 + csetemp82 + csetemp83 + \n+ csetemp84)*xformL01 + (csetemp93 + csetemp94 + csetemp95 + \n+ csetemp96)*xformL11 + (csetemp101 + csetemp102 + csetemp103 + \n+ csetemp104)*xformL21 + (csetemp105 + csetemp106 + csetemp107 + \n+ csetemp108)*xformL31) + xformL00*((csetemp69 + csetemp70 + csetemp71 + \n+ csetemp72)*xformL01 + (csetemp73 + csetemp74 + csetemp75 + \n+ csetemp76)*xformL11 + (csetemp77 + csetemp78 + csetemp79 + \n+ csetemp80)*xformL21 + (csetemp81 + csetemp82 + csetemp83 + \n+ csetemp84)*xformL31) + xformL10*((csetemp73 + csetemp74 + csetemp75 + \n+ csetemp76)*xformL01 + (csetemp85 + csetemp86 + csetemp87 + \n+ csetemp88)*xformL11 + (csetemp89 + csetemp90 + csetemp91 + \n+ csetemp92)*xformL21 + (csetemp93 + csetemp94 + csetemp95 + \n+ csetemp96)*xformL31);\n+ \n+ CCTK_REAL csetemp109 CCTK_ATTRIBUTE_UNUSED = tdg4000*xformL01;\n+ \n+ CCTK_REAL csetemp110 CCTK_ATTRIBUTE_UNUSED = tdg4001*xformL11;\n+ \n+ CCTK_REAL csetemp111 CCTK_ATTRIBUTE_UNUSED = tdg4002*xformL21;\n+ \n+ CCTK_REAL csetemp112 CCTK_ATTRIBUTE_UNUSED = tdg4003*xformL31;\n+ \n+ CCTK_REAL csetemp113 CCTK_ATTRIBUTE_UNUSED = tdg4010*xformL01;\n+ \n+ CCTK_REAL csetemp114 CCTK_ATTRIBUTE_UNUSED = tdg4011*xformL11;\n+ \n+ CCTK_REAL csetemp115 CCTK_ATTRIBUTE_UNUSED = tdg4012*xformL21;\n+ \n+ CCTK_REAL csetemp116 CCTK_ATTRIBUTE_UNUSED = tdg4013*xformL31;\n+ \n+ CCTK_REAL csetemp117 CCTK_ATTRIBUTE_UNUSED = tdg4020*xformL01;\n+ \n+ CCTK_REAL csetemp118 CCTK_ATTRIBUTE_UNUSED = tdg4021*xformL11;\n+ \n+ CCTK_REAL csetemp119 CCTK_ATTRIBUTE_UNUSED = tdg4022*xformL21;\n+ \n+ CCTK_REAL csetemp120 CCTK_ATTRIBUTE_UNUSED = tdg4023*xformL31;\n+ \n+ CCTK_REAL csetemp121 CCTK_ATTRIBUTE_UNUSED = tdg4030*xformL01;\n+ \n+ CCTK_REAL csetemp122 CCTK_ATTRIBUTE_UNUSED = tdg4031*xformL11;\n+ \n+ CCTK_REAL csetemp123 CCTK_ATTRIBUTE_UNUSED = tdg4032*xformL21;\n+ \n+ CCTK_REAL csetemp124 CCTK_ATTRIBUTE_UNUSED = tdg4033*xformL31;\n+ \n+ CCTK_REAL csetemp125 CCTK_ATTRIBUTE_UNUSED = tdg4110*xformL01;\n+ \n+ CCTK_REAL csetemp126 CCTK_ATTRIBUTE_UNUSED = tdg4111*xformL11;\n+ \n+ CCTK_REAL csetemp127 CCTK_ATTRIBUTE_UNUSED = tdg4112*xformL21;\n+ \n+ CCTK_REAL csetemp128 CCTK_ATTRIBUTE_UNUSED = tdg4113*xformL31;\n+ \n+ CCTK_REAL csetemp129 CCTK_ATTRIBUTE_UNUSED = tdg4120*xformL01;\n+ \n+ CCTK_REAL csetemp130 CCTK_ATTRIBUTE_UNUSED = tdg4121*xformL11;\n+ \n+ CCTK_REAL csetemp131 CCTK_ATTRIBUTE_UNUSED = tdg4122*xformL21;\n+ \n+ CCTK_REAL csetemp132 CCTK_ATTRIBUTE_UNUSED = tdg4123*xformL31;\n+ \n+ CCTK_REAL csetemp133 CCTK_ATTRIBUTE_UNUSED = tdg4130*xformL01;\n+ \n+ CCTK_REAL csetemp134 CCTK_ATTRIBUTE_UNUSED = tdg4131*xformL11;\n+ \n+ CCTK_REAL csetemp135 CCTK_ATTRIBUTE_UNUSED = tdg4132*xformL21;\n+ \n+ CCTK_REAL csetemp136 CCTK_ATTRIBUTE_UNUSED = tdg4133*xformL31;\n+ \n+ CCTK_REAL csetemp137 CCTK_ATTRIBUTE_UNUSED = tdg4220*xformL01;\n+ \n+ CCTK_REAL csetemp138 CCTK_ATTRIBUTE_UNUSED = tdg4221*xformL11;\n+ \n+ CCTK_REAL csetemp139 CCTK_ATTRIBUTE_UNUSED = tdg4222*xformL21;\n+ \n+ CCTK_REAL csetemp140 CCTK_ATTRIBUTE_UNUSED = tdg4223*xformL31;\n+ \n+ CCTK_REAL csetemp141 CCTK_ATTRIBUTE_UNUSED = tdg4230*xformL01;\n+ \n+ CCTK_REAL csetemp142 CCTK_ATTRIBUTE_UNUSED = tdg4231*xformL11;\n+ \n+ CCTK_REAL csetemp143 CCTK_ATTRIBUTE_UNUSED = tdg4232*xformL21;\n+ \n+ CCTK_REAL csetemp144 CCTK_ATTRIBUTE_UNUSED = tdg4233*xformL31;\n+ \n+ CCTK_REAL csetemp145 CCTK_ATTRIBUTE_UNUSED = tdg4330*xformL01;\n+ \n+ CCTK_REAL csetemp146 CCTK_ATTRIBUTE_UNUSED = tdg4331*xformL11;\n+ \n+ CCTK_REAL csetemp147 CCTK_ATTRIBUTE_UNUSED = tdg4332*xformL21;\n+ \n+ CCTK_REAL csetemp148 CCTK_ATTRIBUTE_UNUSED = tdg4333*xformL31;\n+ \n+ CCTK_REAL dg4011 CCTK_ATTRIBUTE_UNUSED = xformL00*((csetemp109 + \n+ csetemp110 + csetemp111 + csetemp112)*xformL01 + (csetemp113 + \n+ csetemp114 + csetemp115 + csetemp116)*xformL11 + (csetemp117 + \n+ csetemp118 + csetemp119 + csetemp120)*xformL21 + (csetemp121 + \n+ csetemp122 + csetemp123 + csetemp124)*xformL31) + xformL10*((csetemp113 \n+ + csetemp114 + csetemp115 + csetemp116)*xformL01 + (csetemp125 + \n+ csetemp126 + csetemp127 + csetemp128)*xformL11 + (csetemp129 + \n+ csetemp130 + csetemp131 + csetemp132)*xformL21 + (csetemp133 + \n+ csetemp134 + csetemp135 + csetemp136)*xformL31) + xformL20*((csetemp117 \n+ + csetemp118 + csetemp119 + csetemp120)*xformL01 + (csetemp129 + \n+ csetemp130 + csetemp131 + csetemp132)*xformL11 + (csetemp137 + \n+ csetemp138 + csetemp139 + csetemp140)*xformL21 + (csetemp141 + \n+ csetemp142 + csetemp143 + csetemp144)*xformL31) + xformL30*((csetemp121 \n+ + csetemp122 + csetemp123 + csetemp124)*xformL01 + (csetemp133 + \n+ csetemp134 + csetemp135 + csetemp136)*xformL11 + (csetemp141 + \n+ csetemp142 + csetemp143 + csetemp144)*xformL21 + (csetemp145 + \n+ csetemp146 + csetemp147 + csetemp148)*xformL31);\n+ \n+ CCTK_REAL csetemp149 CCTK_ATTRIBUTE_UNUSED = tdg4000*xformL02;\n+ \n+ CCTK_REAL csetemp150 CCTK_ATTRIBUTE_UNUSED = tdg4001*xformL12;\n+ \n+ CCTK_REAL csetemp151 CCTK_ATTRIBUTE_UNUSED = tdg4002*xformL22;\n+ \n+ CCTK_REAL csetemp152 CCTK_ATTRIBUTE_UNUSED = tdg4003*xformL32;\n+ \n+ CCTK_REAL csetemp153 CCTK_ATTRIBUTE_UNUSED = tdg4010*xformL02;\n+ \n+ CCTK_REAL csetemp154 CCTK_ATTRIBUTE_UNUSED = tdg4011*xformL12;\n+ \n+ CCTK_REAL csetemp155 CCTK_ATTRIBUTE_UNUSED = tdg4012*xformL22;\n+ \n+ CCTK_REAL csetemp156 CCTK_ATTRIBUTE_UNUSED = tdg4013*xformL32;\n+ \n+ CCTK_REAL csetemp157 CCTK_ATTRIBUTE_UNUSED = tdg4020*xformL02;\n+ \n+ CCTK_REAL csetemp158 CCTK_ATTRIBUTE_UNUSED = tdg4021*xformL12;\n+ \n+ CCTK_REAL csetemp159 CCTK_ATTRIBUTE_UNUSED = tdg4022*xformL22;\n+ \n+ CCTK_REAL csetemp160 CCTK_ATTRIBUTE_UNUSED = tdg4023*xformL32;\n+ \n+ CCTK_REAL csetemp161 CCTK_ATTRIBUTE_UNUSED = tdg4030*xformL02;\n+ \n+ CCTK_REAL csetemp162 CCTK_ATTRIBUTE_UNUSED = tdg4031*xformL12;\n+ \n+ CCTK_REAL csetemp163 CCTK_ATTRIBUTE_UNUSED = tdg4032*xformL22;\n+ \n+ CCTK_REAL csetemp164 CCTK_ATTRIBUTE_UNUSED = tdg4033*xformL32;\n+ \n+ CCTK_REAL csetemp165 CCTK_ATTRIBUTE_UNUSED = tdg4110*xformL02;\n+ \n+ CCTK_REAL csetemp166 CCTK_ATTRIBUTE_UNUSED = tdg4111*xformL12;\n+ \n+ CCTK_REAL csetemp167 CCTK_ATTRIBUTE_UNUSED = tdg4112*xformL22;\n+ \n+ CCTK_REAL csetemp168 CCTK_ATTRIBUTE_UNUSED = tdg4113*xformL32;\n+ \n+ CCTK_REAL csetemp169 CCTK_ATTRIBUTE_UNUSED = tdg4120*xformL02;\n+ \n+ CCTK_REAL csetemp170 CCTK_ATTRIBUTE_UNUSED = tdg4121*xformL12;\n+ \n+ CCTK_REAL csetemp171 CCTK_ATTRIBUTE_UNUSED = tdg4122*xformL22;\n+ \n+ CCTK_REAL csetemp172 CCTK_ATTRIBUTE_UNUSED = tdg4123*xformL32;\n+ \n+ CCTK_REAL csetemp173 CCTK_ATTRIBUTE_UNUSED = tdg4130*xformL02;\n+ \n+ CCTK_REAL csetemp174 CCTK_ATTRIBUTE_UNUSED = tdg4131*xformL12;\n+ \n+ CCTK_REAL csetemp175 CCTK_ATTRIBUTE_UNUSED = tdg4132*xformL22;\n+ \n+ CCTK_REAL csetemp176 CCTK_ATTRIBUTE_UNUSED = tdg4133*xformL32;\n+ \n+ CCTK_REAL csetemp177 CCTK_ATTRIBUTE_UNUSED = tdg4220*xformL02;\n+ \n+ CCTK_REAL csetemp178 CCTK_ATTRIBUTE_UNUSED = tdg4221*xformL12;\n+ \n+ CCTK_REAL csetemp179 CCTK_ATTRIBUTE_UNUSED = tdg4222*xformL22;\n+ \n+ CCTK_REAL csetemp180 CCTK_ATTRIBUTE_UNUSED = tdg4223*xformL32;\n+ \n+ CCTK_REAL csetemp181 CCTK_ATTRIBUTE_UNUSED = tdg4230*xformL02;\n+ \n+ CCTK_REAL csetemp182 CCTK_ATTRIBUTE_UNUSED = tdg4231*xformL12;\n+ \n+ CCTK_REAL csetemp183 CCTK_ATTRIBUTE_UNUSED = tdg4232*xformL22;\n+ \n+ CCTK_REAL csetemp184 CCTK_ATTRIBUTE_UNUSED = tdg4233*xformL32;\n+ \n+ CCTK_REAL csetemp185 CCTK_ATTRIBUTE_UNUSED = tdg4330*xformL02;\n+ \n+ CCTK_REAL csetemp186 CCTK_ATTRIBUTE_UNUSED = tdg4331*xformL12;\n+ \n+ CCTK_REAL csetemp187 CCTK_ATTRIBUTE_UNUSED = tdg4332*xformL22;\n+ \n+ CCTK_REAL csetemp188 CCTK_ATTRIBUTE_UNUSED = tdg4333*xformL32;\n+ \n+ CCTK_REAL dg4012 CCTK_ATTRIBUTE_UNUSED = xformL00*((csetemp149 + \n+ csetemp150 + csetemp151 + csetemp152)*xformL01 + (csetemp153 + \n+ csetemp154 + csetemp155 + csetemp156)*xformL11 + (csetemp157 + \n+ csetemp158 + csetemp159 + csetemp160)*xformL21 + (csetemp161 + \n+ csetemp162 + csetemp163 + csetemp164)*xformL31) + xformL10*((csetemp153 \n+ + csetemp154 + csetemp155 + csetemp156)*xformL01 + (csetemp165 + \n+ csetemp166 + csetemp167 + csetemp168)*xformL11 + (csetemp169 + \n+ csetemp170 + csetemp171 + csetemp172)*xformL21 + (csetemp173 + \n+ csetemp174 + csetemp175 + csetemp176)*xformL31) + xformL20*((csetemp157 \n+ + csetemp158 + csetemp159 + csetemp160)*xformL01 + (csetemp169 + \n+ csetemp170 + csetemp171 + csetemp172)*xformL11 + (csetemp177 + \n+ csetemp178 + csetemp179 + csetemp180)*xformL21 + (csetemp181 + \n+ csetemp182 + csetemp183 + csetemp184)*xformL31) + xformL30*((csetemp161 \n+ + csetemp162 + csetemp163 + csetemp164)*xformL01 + (csetemp173 + \n+ csetemp174 + csetemp175 + csetemp176)*xformL11 + (csetemp181 + \n+ csetemp182 + csetemp183 + csetemp184)*xformL21 + (csetemp185 + \n+ csetemp186 + csetemp187 + csetemp188)*xformL31);\n+ \n+ CCTK_REAL csetemp189 CCTK_ATTRIBUTE_UNUSED = tdg4000*xformL03;\n+ \n+ CCTK_REAL csetemp190 CCTK_ATTRIBUTE_UNUSED = tdg4001*xformL13;\n+ \n+ CCTK_REAL csetemp191 CCTK_ATTRIBUTE_UNUSED = tdg4002*xformL23;\n+ \n+ CCTK_REAL csetemp192 CCTK_ATTRIBUTE_UNUSED = tdg4003*xformL33;\n+ \n+ CCTK_REAL csetemp193 CCTK_ATTRIBUTE_UNUSED = tdg4010*xformL03;\n+ \n+ CCTK_REAL csetemp194 CCTK_ATTRIBUTE_UNUSED = tdg4011*xformL13;\n+ \n+ CCTK_REAL csetemp195 CCTK_ATTRIBUTE_UNUSED = tdg4012*xformL23;\n+ \n+ CCTK_REAL csetemp196 CCTK_ATTRIBUTE_UNUSED = tdg4013*xformL33;\n+ \n+ CCTK_REAL csetemp197 CCTK_ATTRIBUTE_UNUSED = tdg4020*xformL03;\n+ \n+ CCTK_REAL csetemp198 CCTK_ATTRIBUTE_UNUSED = tdg4021*xformL13;\n+ \n+ CCTK_REAL csetemp199 CCTK_ATTRIBUTE_UNUSED = tdg4022*xformL23;\n+ \n+ CCTK_REAL csetemp200 CCTK_ATTRIBUTE_UNUSED = tdg4023*xformL33;\n+ \n+ CCTK_REAL csetemp201 CCTK_ATTRIBUTE_UNUSED = tdg4030*xformL03;\n+ \n+ CCTK_REAL csetemp202 CCTK_ATTRIBUTE_UNUSED = tdg4031*xformL13;\n+ \n+ CCTK_REAL csetemp203 CCTK_ATTRIBUTE_UNUSED = tdg4032*xformL23;\n+ \n+ CCTK_REAL csetemp204 CCTK_ATTRIBUTE_UNUSED = tdg4033*xformL33;\n+ \n+ CCTK_REAL csetemp205 CCTK_ATTRIBUTE_UNUSED = tdg4110*xformL03;\n+ \n+ CCTK_REAL csetemp206 CCTK_ATTRIBUTE_UNUSED = tdg4111*xformL13;\n+ \n+ CCTK_REAL csetemp207 CCTK_ATTRIBUTE_UNUSED = tdg4112*xformL23;\n+ \n+ CCTK_REAL csetemp208 CCTK_ATTRIBUTE_UNUSED = tdg4113*xformL33;\n+ \n+ CCTK_REAL csetemp209 CCTK_ATTRIBUTE_UNUSED = tdg4120*xformL03;\n+ \n+ CCTK_REAL csetemp210 CCTK_ATTRIBUTE_UNUSED = tdg4121*xformL13;\n+ \n+ CCTK_REAL csetemp211 CCTK_ATTRIBUTE_UNUSED = tdg4122*xformL23;\n+ \n+ CCTK_REAL csetemp212 CCTK_ATTRIBUTE_UNUSED = tdg4123*xformL33;\n+ \n+ CCTK_REAL csetemp213 CCTK_ATTRIBUTE_UNUSED = tdg4130*xformL03;\n+ \n+ CCTK_REAL csetemp214 CCTK_ATTRIBUTE_UNUSED = tdg4131*xformL13;\n+ \n+ CCTK_REAL csetemp215 CCTK_ATTRIBUTE_UNUSED = tdg4132*xformL23;\n+ \n+ CCTK_REAL csetemp216 CCTK_ATTRIBUTE_UNUSED = tdg4133*xformL33;\n+ \n+ CCTK_REAL csetemp217 CCTK_ATTRIBUTE_UNUSED = tdg4220*xformL03;\n+ \n+ CCTK_REAL csetemp218 CCTK_ATTRIBUTE_UNUSED = tdg4221*xformL13;\n+ \n+ CCTK_REAL csetemp219 CCTK_ATTRIBUTE_UNUSED = tdg4222*xformL23;\n+ \n+ CCTK_REAL csetemp220 CCTK_ATTRIBUTE_UNUSED = tdg4223*xformL33;\n+ \n+ CCTK_REAL csetemp221 CCTK_ATTRIBUTE_UNUSED = tdg4230*xformL03;\n+ \n+ CCTK_REAL csetemp222 CCTK_ATTRIBUTE_UNUSED = tdg4231*xformL13;\n+ \n+ CCTK_REAL csetemp223 CCTK_ATTRIBUTE_UNUSED = tdg4232*xformL23;\n+ \n+ CCTK_REAL csetemp224 CCTK_ATTRIBUTE_UNUSED = tdg4233*xformL33;\n+ \n+ CCTK_REAL csetemp225 CCTK_ATTRIBUTE_UNUSED = tdg4330*xformL03;\n+ \n+ CCTK_REAL csetemp226 CCTK_ATTRIBUTE_UNUSED = tdg4331*xformL13;\n+ \n+ CCTK_REAL csetemp227 CCTK_ATTRIBUTE_UNUSED = tdg4332*xformL23;\n+ \n+ CCTK_REAL csetemp228 CCTK_ATTRIBUTE_UNUSED = tdg4333*xformL33;\n+ \n+ CCTK_REAL dg4013 CCTK_ATTRIBUTE_UNUSED = xformL00*((csetemp189 + \n+ csetemp190 + csetemp191 + csetemp192)*xformL01 + (csetemp193 + \n+ csetemp194 + csetemp195 + csetemp196)*xformL11 + (csetemp197 + \n+ csetemp198 + csetemp199 + csetemp200)*xformL21 + (csetemp201 + \n+ csetemp202 + csetemp203 + csetemp204)*xformL31) + xformL10*((csetemp193 \n+ + csetemp194 + csetemp195 + csetemp196)*xformL01 + (csetemp205 + \n+ csetemp206 + csetemp207 + csetemp208)*xformL11 + (csetemp209 + \n+ csetemp210 + csetemp211 + csetemp212)*xformL21 + (csetemp213 + \n+ csetemp214 + csetemp215 + csetemp216)*xformL31) + xformL20*((csetemp197 \n+ + csetemp198 + csetemp199 + csetemp200)*xformL01 + (csetemp209 + \n+ csetemp210 + csetemp211 + csetemp212)*xformL11 + (csetemp217 + \n+ csetemp218 + csetemp219 + csetemp220)*xformL21 + (csetemp221 + \n+ csetemp222 + csetemp223 + csetemp224)*xformL31) + xformL30*((csetemp201 \n+ + csetemp202 + csetemp203 + csetemp204)*xformL01 + (csetemp213 + \n+ csetemp214 + csetemp215 + csetemp216)*xformL11 + (csetemp221 + \n+ csetemp222 + csetemp223 + csetemp224)*xformL21 + (csetemp225 + \n+ csetemp226 + csetemp227 + csetemp228)*xformL31);\n+ \n+ CCTK_REAL dg4020 CCTK_ATTRIBUTE_UNUSED = xformL20*((csetemp77 + \n+ csetemp78 + csetemp79 + csetemp80)*xformL02 + (csetemp89 + csetemp90 + \n+ csetemp91 + csetemp92)*xformL12 + (csetemp100 + csetemp97 + csetemp98 + \n+ csetemp99)*xformL22 + (csetemp101 + csetemp102 + csetemp103 + \n+ csetemp104)*xformL32) + xformL30*((csetemp81 + csetemp82 + csetemp83 + \n+ csetemp84)*xformL02 + (csetemp93 + csetemp94 + csetemp95 + \n+ csetemp96)*xformL12 + (csetemp101 + csetemp102 + csetemp103 + \n+ csetemp104)*xformL22 + (csetemp105 + csetemp106 + csetemp107 + \n+ csetemp108)*xformL32) + xformL00*((csetemp69 + csetemp70 + csetemp71 + \n+ csetemp72)*xformL02 + (csetemp73 + csetemp74 + csetemp75 + \n+ csetemp76)*xformL12 + (csetemp77 + csetemp78 + csetemp79 + \n+ csetemp80)*xformL22 + (csetemp81 + csetemp82 + csetemp83 + \n+ csetemp84)*xformL32) + xformL10*((csetemp73 + csetemp74 + csetemp75 + \n+ csetemp76)*xformL02 + (csetemp85 + csetemp86 + csetemp87 + \n+ csetemp88)*xformL12 + (csetemp89 + csetemp90 + csetemp91 + \n+ csetemp92)*xformL22 + (csetemp93 + csetemp94 + csetemp95 + \n+ csetemp96)*xformL32);\n+ \n+ CCTK_REAL dg4021 CCTK_ATTRIBUTE_UNUSED = xformL00*((csetemp109 + \n+ csetemp110 + csetemp111 + csetemp112)*xformL02 + (csetemp113 + \n+ csetemp114 + csetemp115 + csetemp116)*xformL12 + (csetemp117 + \n+ csetemp118 + csetemp119 + csetemp120)*xformL22 + (csetemp121 + \n+ csetemp122 + csetemp123 + csetemp124)*xformL32) + xformL10*((csetemp113 \n+ + csetemp114 + csetemp115 + csetemp116)*xformL02 + (csetemp125 + \n+ csetemp126 + csetemp127 + csetemp128)*xformL12 + (csetemp129 + \n+ csetemp130 + csetemp131 + csetemp132)*xformL22 + (csetemp133 + \n+ csetemp134 + csetemp135 + csetemp136)*xformL32) + xformL20*((csetemp117 \n+ + csetemp118 + csetemp119 + csetemp120)*xformL02 + (csetemp129 + \n+ csetemp130 + csetemp131 + csetemp132)*xformL12 + (csetemp137 + \n+ csetemp138 + csetemp139 + csetemp140)*xformL22 + (csetemp141 + \n+ csetemp142 + csetemp143 + csetemp144)*xformL32) + xformL30*((csetemp121 \n+ + csetemp122 + csetemp123 + csetemp124)*xformL02 + (csetemp133 + \n+ csetemp134 + csetemp135 + csetemp136)*xformL12 + (csetemp141 + \n+ csetemp142 + csetemp143 + csetemp144)*xformL22 + (csetemp145 + \n+ csetemp146 + csetemp147 + csetemp148)*xformL32);\n+ \n+ CCTK_REAL dg4022 CCTK_ATTRIBUTE_UNUSED = xformL00*((csetemp149 + \n+ csetemp150 + csetemp151 + csetemp152)*xformL02 + (csetemp153 + \n+ csetemp154 + csetemp155 + csetemp156)*xformL12 + (csetemp157 + \n+ csetemp158 + csetemp159 + csetemp160)*xformL22 + (csetemp161 + \n+ csetemp162 + csetemp163 + csetemp164)*xformL32) + xformL10*((csetemp153 \n+ + csetemp154 + csetemp155 + csetemp156)*xformL02 + (csetemp165 + \n+ csetemp166 + csetemp167 + csetemp168)*xformL12 + (csetemp169 + \n+ csetemp170 + csetemp171 + csetemp172)*xformL22 + (csetemp173 + \n+ csetemp174 + csetemp175 + csetemp176)*xformL32) + xformL20*((csetemp157 \n+ + csetemp158 + csetemp159 + csetemp160)*xformL02 + (csetemp169 + \n+ csetemp170 + csetemp171 + csetemp172)*xformL12 + (csetemp177 + \n+ csetemp178 + csetemp179 + csetemp180)*xformL22 + (csetemp181 + \n+ csetemp182 + csetemp183 + csetemp184)*xformL32) + xformL30*((csetemp161 \n+ + csetemp162 + csetemp163 + csetemp164)*xformL02 + (csetemp173 + \n+ csetemp174 + csetemp175 + csetemp176)*xformL12 + (csetemp181 + \n+ csetemp182 + csetemp183 + csetemp184)*xformL22 + (csetemp185 + \n+ csetemp186 + csetemp187 + csetemp188)*xformL32);\n+ \n+ CCTK_REAL dg4023 CCTK_ATTRIBUTE_UNUSED = xformL00*((csetemp189 + \n+ csetemp190 + csetemp191 + csetemp192)*xformL02 + (csetemp193 + \n+ csetemp194 + csetemp195 + csetemp196)*xformL12 + (csetemp197 + \n+ csetemp198 + csetemp199 + csetemp200)*xformL22 + (csetemp201 + \n+ csetemp202 + csetemp203 + csetemp204)*xformL32) + xformL10*((csetemp193 \n+ + csetemp194 + csetemp195 + csetemp196)*xformL02 + (csetemp205 + \n+ csetemp206 + csetemp207 + csetemp208)*xformL12 + (csetemp209 + \n+ csetemp210 + csetemp211 + csetemp212)*xformL22 + (csetemp213 + \n+ csetemp214 + csetemp215 + csetemp216)*xformL32) + xformL20*((csetemp197 \n+ + csetemp198 + csetemp199 + csetemp200)*xformL02 + (csetemp209 + \n+ csetemp210 + csetemp211 + csetemp212)*xformL12 + (csetemp217 + \n+ csetemp218 + csetemp219 + csetemp220)*xformL22 + (csetemp221 + \n+ csetemp222 + csetemp223 + csetemp224)*xformL32) + xformL30*((csetemp201 \n+ + csetemp202 + csetemp203 + csetemp204)*xformL02 + (csetemp213 + \n+ csetemp214 + csetemp215 + csetemp216)*xformL12 + (csetemp221 + \n+ csetemp222 + csetemp223 + csetemp224)*xformL22 + (csetemp225 + \n+ csetemp226 + csetemp227 + csetemp228)*xformL32);\n+ \n+ CCTK_REAL dg4030 CCTK_ATTRIBUTE_UNUSED = xformL20*((csetemp77 + \n+ csetemp78 + csetemp79 + csetemp80)*xformL03 + (csetemp89 + csetemp90 + \n+ csetemp91 + csetemp92)*xformL13 + (csetemp100 + csetemp97 + csetemp98 + \n+ csetemp99)*xformL23 + (csetemp101 + csetemp102 + csetemp103 + \n+ csetemp104)*xformL33) + xformL30*((csetemp81 + csetemp82 + csetemp83 + \n+ csetemp84)*xformL03 + (csetemp93 + csetemp94 + csetemp95 + \n+ csetemp96)*xformL13 + (csetemp101 + csetemp102 + csetemp103 + \n+ csetemp104)*xformL23 + (csetemp105 + csetemp106 + csetemp107 + \n+ csetemp108)*xformL33) + xformL00*((csetemp69 + csetemp70 + csetemp71 + \n+ csetemp72)*xformL03 + (csetemp73 + csetemp74 + csetemp75 + \n+ csetemp76)*xformL13 + (csetemp77 + csetemp78 + csetemp79 + \n+ csetemp80)*xformL23 + (csetemp81 + csetemp82 + csetemp83 + \n+ csetemp84)*xformL33) + xformL10*((csetemp73 + csetemp74 + csetemp75 + \n+ csetemp76)*xformL03 + (csetemp85 + csetemp86 + csetemp87 + \n+ csetemp88)*xformL13 + (csetemp89 + csetemp90 + csetemp91 + \n+ csetemp92)*xformL23 + (csetemp93 + csetemp94 + csetemp95 + \n+ csetemp96)*xformL33);\n+ \n+ CCTK_REAL dg4031 CCTK_ATTRIBUTE_UNUSED = xformL00*((csetemp109 + \n+ csetemp110 + csetemp111 + csetemp112)*xformL03 + (csetemp113 + \n+ csetemp114 + csetemp115 + csetemp116)*xformL13 + (csetemp117 + \n+ csetemp118 + csetemp119 + csetemp120)*xformL23 + (csetemp121 + \n+ csetemp122 + csetemp123 + csetemp124)*xformL33) + xformL10*((csetemp113 \n+ + csetemp114 + csetemp115 + csetemp116)*xformL03 + (csetemp125 + \n+ csetemp126 + csetemp127 + csetemp128)*xformL13 + (csetemp129 + \n+ csetemp130 + csetemp131 + csetemp132)*xformL23 + (csetemp133 + \n+ csetemp134 + csetemp135 + csetemp136)*xformL33) + xformL20*((csetemp117 \n+ + csetemp118 + csetemp119 + csetemp120)*xformL03 + (csetemp129 + \n+ csetemp130 + csetemp131 + csetemp132)*xformL13 + (csetemp137 + \n+ csetemp138 + csetemp139 + csetemp140)*xformL23 + (csetemp141 + \n+ csetemp142 + csetemp143 + csetemp144)*xformL33) + xformL30*((csetemp121 \n+ + csetemp122 + csetemp123 + csetemp124)*xformL03 + (csetemp133 + \n+ csetemp134 + csetemp135 + csetemp136)*xformL13 + (csetemp141 + \n+ csetemp142 + csetemp143 + csetemp144)*xformL23 + (csetemp145 + \n+ csetemp146 + csetemp147 + csetemp148)*xformL33);\n+ \n+ CCTK_REAL dg4032 CCTK_ATTRIBUTE_UNUSED = xformL00*((csetemp149 + \n+ csetemp150 + csetemp151 + csetemp152)*xformL03 + (csetemp153 + \n+ csetemp154 + csetemp155 + csetemp156)*xformL13 + (csetemp157 + \n+ csetemp158 + csetemp159 + csetemp160)*xformL23 + (csetemp161 + \n+ csetemp162 + csetemp163 + csetemp164)*xformL33) + xformL10*((csetemp153 \n+ + csetemp154 + csetemp155 + csetemp156)*xformL03 + (csetemp165 + \n+ csetemp166 + csetemp167 + csetemp168)*xformL13 + (csetemp169 + \n+ csetemp170 + csetemp171 + csetemp172)*xformL23 + (csetemp173 + \n+ csetemp174 + csetemp175 + csetemp176)*xformL33) + xformL20*((csetemp157 \n+ + csetemp158 + csetemp159 + csetemp160)*xformL03 + (csetemp169 + \n+ csetemp170 + csetemp171 + csetemp172)*xformL13 + (csetemp177 + \n+ csetemp178 + csetemp179 + csetemp180)*xformL23 + (csetemp181 + \n+ csetemp182 + csetemp183 + csetemp184)*xformL33) + xformL30*((csetemp161 \n+ + csetemp162 + csetemp163 + csetemp164)*xformL03 + (csetemp173 + \n+ csetemp174 + csetemp175 + csetemp176)*xformL13 + (csetemp181 + \n+ csetemp182 + csetemp183 + csetemp184)*xformL23 + (csetemp185 + \n+ csetemp186 + csetemp187 + csetemp188)*xformL33);\n+ \n+ CCTK_REAL dg4033 CCTK_ATTRIBUTE_UNUSED = xformL00*((csetemp189 + \n+ csetemp190 + csetemp191 + csetemp192)*xformL03 + (csetemp193 + \n+ csetemp194 + csetemp195 + csetemp196)*xformL13 + (csetemp197 + \n+ csetemp198 + csetemp199 + csetemp200)*xformL23 + (csetemp201 + \n+ csetemp202 + csetemp203 + csetemp204)*xformL33) + xformL10*((csetemp193 \n+ + csetemp194 + csetemp195 + csetemp196)*xformL03 + (csetemp205 + \n+ csetemp206 + csetemp207 + csetemp208)*xformL13 + (csetemp209 + \n+ csetemp210 + csetemp211 + csetemp212)*xformL23 + (csetemp213 + \n+ csetemp214 + csetemp215 + csetemp216)*xformL33) + xformL20*((csetemp197 \n+ + csetemp198 + csetemp199 + csetemp200)*xformL03 + (csetemp209 + \n+ csetemp210 + csetemp211 + csetemp212)*xformL13 + (csetemp217 + \n+ csetemp218 + csetemp219 + csetemp220)*xformL23 + (csetemp221 + \n+ csetemp222 + csetemp223 + csetemp224)*xformL33) + xformL30*((csetemp201 \n+ + csetemp202 + csetemp203 + csetemp204)*xformL03 + (csetemp213 + \n+ csetemp214 + csetemp215 + csetemp216)*xformL13 + (csetemp221 + \n+ csetemp222 + csetemp223 + csetemp224)*xformL23 + (csetemp225 + \n+ csetemp226 + csetemp227 + csetemp228)*xformL33);\n+ \n+ CCTK_REAL dg4110 CCTK_ATTRIBUTE_UNUSED = xformL21*((csetemp77 + \n+ csetemp78 + csetemp79 + csetemp80)*xformL01 + (csetemp89 + csetemp90 + \n+ csetemp91 + csetemp92)*xformL11 + (csetemp100 + csetemp97 + csetemp98 + \n+ csetemp99)*xformL21 + (csetemp101 + csetemp102 + csetemp103 + \n+ csetemp104)*xformL31) + xformL31*((csetemp81 + csetemp82 + csetemp83 + \n+ csetemp84)*xformL01 + (csetemp93 + csetemp94 + csetemp95 + \n+ csetemp96)*xformL11 + (csetemp101 + csetemp102 + csetemp103 + \n+ csetemp104)*xformL21 + (csetemp105 + csetemp106 + csetemp107 + \n+ csetemp108)*xformL31) + xformL01*((csetemp69 + csetemp70 + csetemp71 + \n+ csetemp72)*xformL01 + (csetemp73 + csetemp74 + csetemp75 + \n+ csetemp76)*xformL11 + (csetemp77 + csetemp78 + csetemp79 + \n+ csetemp80)*xformL21 + (csetemp81 + csetemp82 + csetemp83 + \n+ csetemp84)*xformL31) + xformL11*((csetemp73 + csetemp74 + csetemp75 + \n+ csetemp76)*xformL01 + (csetemp85 + csetemp86 + csetemp87 + \n+ csetemp88)*xformL11 + (csetemp89 + csetemp90 + csetemp91 + \n+ csetemp92)*xformL21 + (csetemp93 + csetemp94 + csetemp95 + \n+ csetemp96)*xformL31);\n+ \n+ CCTK_REAL dg4111 CCTK_ATTRIBUTE_UNUSED = xformL01*((csetemp109 + \n+ csetemp110 + csetemp111 + csetemp112)*xformL01 + (csetemp113 + \n+ csetemp114 + csetemp115 + csetemp116)*xformL11 + (csetemp117 + \n+ csetemp118 + csetemp119 + csetemp120)*xformL21 + (csetemp121 + \n+ csetemp122 + csetemp123 + csetemp124)*xformL31) + xformL11*((csetemp113 \n+ + csetemp114 + csetemp115 + csetemp116)*xformL01 + (csetemp125 + \n+ csetemp126 + csetemp127 + csetemp128)*xformL11 + (csetemp129 + \n+ csetemp130 + csetemp131 + csetemp132)*xformL21 + (csetemp133 + \n+ csetemp134 + csetemp135 + csetemp136)*xformL31) + xformL21*((csetemp117 \n+ + csetemp118 + csetemp119 + csetemp120)*xformL01 + (csetemp129 + \n+ csetemp130 + csetemp131 + csetemp132)*xformL11 + (csetemp137 + \n+ csetemp138 + csetemp139 + csetemp140)*xformL21 + (csetemp141 + \n+ csetemp142 + csetemp143 + csetemp144)*xformL31) + xformL31*((csetemp121 \n+ + csetemp122 + csetemp123 + csetemp124)*xformL01 + (csetemp133 + \n+ csetemp134 + csetemp135 + csetemp136)*xformL11 + (csetemp141 + \n+ csetemp142 + csetemp143 + csetemp144)*xformL21 + (csetemp145 + \n+ csetemp146 + csetemp147 + csetemp148)*xformL31);\n+ \n+ CCTK_REAL dg4112 CCTK_ATTRIBUTE_UNUSED = xformL01*((csetemp149 + \n+ csetemp150 + csetemp151 + csetemp152)*xformL01 + (csetemp153 + \n+ csetemp154 + csetemp155 + csetemp156)*xformL11 + (csetemp157 + \n+ csetemp158 + csetemp159 + csetemp160)*xformL21 + (csetemp161 + \n+ csetemp162 + csetemp163 + csetemp164)*xformL31) + xformL11*((csetemp153 \n+ + csetemp154 + csetemp155 + csetemp156)*xformL01 + (csetemp165 + \n+ csetemp166 + csetemp167 + csetemp168)*xformL11 + (csetemp169 + \n+ csetemp170 + csetemp171 + csetemp172)*xformL21 + (csetemp173 + \n+ csetemp174 + csetemp175 + csetemp176)*xformL31) + xformL21*((csetemp157 \n+ + csetemp158 + csetemp159 + csetemp160)*xformL01 + (csetemp169 + \n+ csetemp170 + csetemp171 + csetemp172)*xformL11 + (csetemp177 + \n+ csetemp178 + csetemp179 + csetemp180)*xformL21 + (csetemp181 + \n+ csetemp182 + csetemp183 + csetemp184)*xformL31) + xformL31*((csetemp161 \n+ + csetemp162 + csetemp163 + csetemp164)*xformL01 + (csetemp173 + \n+ csetemp174 + csetemp175 + csetemp176)*xformL11 + (csetemp181 + \n+ csetemp182 + csetemp183 + csetemp184)*xformL21 + (csetemp185 + \n+ csetemp186 + csetemp187 + csetemp188)*xformL31);\n+ \n+ CCTK_REAL dg4113 CCTK_ATTRIBUTE_UNUSED = xformL01*((csetemp189 + \n+ csetemp190 + csetemp191 + csetemp192)*xformL01 + (csetemp193 + \n+ csetemp194 + csetemp195 + csetemp196)*xformL11 + (csetemp197 + \n+ csetemp198 + csetemp199 + csetemp200)*xformL21 + (csetemp201 + \n+ csetemp202 + csetemp203 + csetemp204)*xformL31) + xformL11*((csetemp193 \n+ + csetemp194 + csetemp195 + csetemp196)*xformL01 + (csetemp205 + \n+ csetemp206 + csetemp207 + csetemp208)*xformL11 + (csetemp209 + \n+ csetemp210 + csetemp211 + csetemp212)*xformL21 + (csetemp213 + \n+ csetemp214 + csetemp215 + csetemp216)*xformL31) + xformL21*((csetemp197 \n+ + csetemp198 + csetemp199 + csetemp200)*xformL01 + (csetemp209 + \n+ csetemp210 + csetemp211 + csetemp212)*xformL11 + (csetemp217 + \n+ csetemp218 + csetemp219 + csetemp220)*xformL21 + (csetemp221 + \n+ csetemp222 + csetemp223 + csetemp224)*xformL31) + xformL31*((csetemp201 \n+ + csetemp202 + csetemp203 + csetemp204)*xformL01 + (csetemp213 + \n+ csetemp214 + csetemp215 + csetemp216)*xformL11 + (csetemp221 + \n+ csetemp222 + csetemp223 + csetemp224)*xformL21 + (csetemp225 + \n+ csetemp226 + csetemp227 + csetemp228)*xformL31);\n+ \n+ CCTK_REAL dg4120 CCTK_ATTRIBUTE_UNUSED = xformL21*((csetemp77 + \n+ csetemp78 + csetemp79 + csetemp80)*xformL02 + (csetemp89 + csetemp90 + \n+ csetemp91 + csetemp92)*xformL12 + (csetemp100 + csetemp97 + csetemp98 + \n+ csetemp99)*xformL22 + (csetemp101 + csetemp102 + csetemp103 + \n+ csetemp104)*xformL32) + xformL31*((csetemp81 + csetemp82 + csetemp83 + \n+ csetemp84)*xformL02 + (csetemp93 + csetemp94 + csetemp95 + \n+ csetemp96)*xformL12 + (csetemp101 + csetemp102 + csetemp103 + \n+ csetemp104)*xformL22 + (csetemp105 + csetemp106 + csetemp107 + \n+ csetemp108)*xformL32) + xformL01*((csetemp69 + csetemp70 + csetemp71 + \n+ csetemp72)*xformL02 + (csetemp73 + csetemp74 + csetemp75 + \n+ csetemp76)*xformL12 + (csetemp77 + csetemp78 + csetemp79 + \n+ csetemp80)*xformL22 + (csetemp81 + csetemp82 + csetemp83 + \n+ csetemp84)*xformL32) + xformL11*((csetemp73 + csetemp74 + csetemp75 + \n+ csetemp76)*xformL02 + (csetemp85 + csetemp86 + csetemp87 + \n+ csetemp88)*xformL12 + (csetemp89 + csetemp90 + csetemp91 + \n+ csetemp92)*xformL22 + (csetemp93 + csetemp94 + csetemp95 + \n+ csetemp96)*xformL32);\n+ \n+ CCTK_REAL dg4121 CCTK_ATTRIBUTE_UNUSED = xformL01*((csetemp109 + \n+ csetemp110 + csetemp111 + csetemp112)*xformL02 + (csetemp113 + \n+ csetemp114 + csetemp115 + csetemp116)*xformL12 + (csetemp117 + \n+ csetemp118 + csetemp119 + csetemp120)*xformL22 + (csetemp121 + \n+ csetemp122 + csetemp123 + csetemp124)*xformL32) + xformL11*((csetemp113 \n+ + csetemp114 + csetemp115 + csetemp116)*xformL02 + (csetemp125 + \n+ csetemp126 + csetemp127 + csetemp128)*xformL12 + (csetemp129 + \n+ csetemp130 + csetemp131 + csetemp132)*xformL22 + (csetemp133 + \n+ csetemp134 + csetemp135 + csetemp136)*xformL32) + xformL21*((csetemp117 \n+ + csetemp118 + csetemp119 + csetemp120)*xformL02 + (csetemp129 + \n+ csetemp130 + csetemp131 + csetemp132)*xformL12 + (csetemp137 + \n+ csetemp138 + csetemp139 + csetemp140)*xformL22 + (csetemp141 + \n+ csetemp142 + csetemp143 + csetemp144)*xformL32) + xformL31*((csetemp121 \n+ + csetemp122 + csetemp123 + csetemp124)*xformL02 + (csetemp133 + \n+ csetemp134 + csetemp135 + csetemp136)*xformL12 + (csetemp141 + \n+ csetemp142 + csetemp143 + csetemp144)*xformL22 + (csetemp145 + \n+ csetemp146 + csetemp147 + csetemp148)*xformL32);\n+ \n+ CCTK_REAL dg4122 CCTK_ATTRIBUTE_UNUSED = xformL01*((csetemp149 + \n+ csetemp150 + csetemp151 + csetemp152)*xformL02 + (csetemp153 + \n+ csetemp154 + csetemp155 + csetemp156)*xformL12 + (csetemp157 + \n+ csetemp158 + csetemp159 + csetemp160)*xformL22 + (csetemp161 + \n+ csetemp162 + csetemp163 + csetemp164)*xformL32) + xformL11*((csetemp153 \n+ + csetemp154 + csetemp155 + csetemp156)*xformL02 + (csetemp165 + \n+ csetemp166 + csetemp167 + csetemp168)*xformL12 + (csetemp169 + \n+ csetemp170 + csetemp171 + csetemp172)*xformL22 + (csetemp173 + \n+ csetemp174 + csetemp175 + csetemp176)*xformL32) + xformL21*((csetemp157 \n+ + csetemp158 + csetemp159 + csetemp160)*xformL02 + (csetemp169 + \n+ csetemp170 + csetemp171 + csetemp172)*xformL12 + (csetemp177 + \n+ csetemp178 + csetemp179 + csetemp180)*xformL22 + (csetemp181 + \n+ csetemp182 + csetemp183 + csetemp184)*xformL32) + xformL31*((csetemp161 \n+ + csetemp162 + csetemp163 + csetemp164)*xformL02 + (csetemp173 + \n+ csetemp174 + csetemp175 + csetemp176)*xformL12 + (csetemp181 + \n+ csetemp182 + csetemp183 + csetemp184)*xformL22 + (csetemp185 + \n+ csetemp186 + csetemp187 + csetemp188)*xformL32);\n+ \n+ CCTK_REAL dg4123 CCTK_ATTRIBUTE_UNUSED = xformL01*((csetemp189 + \n+ csetemp190 + csetemp191 + csetemp192)*xformL02 + (csetemp193 + \n+ csetemp194 + csetemp195 + csetemp196)*xformL12 + (csetemp197 + \n+ csetemp198 + csetemp199 + csetemp200)*xformL22 + (csetemp201 + \n+ csetemp202 + csetemp203 + csetemp204)*xformL32) + xformL11*((csetemp193 \n+ + csetemp194 + csetemp195 + csetemp196)*xformL02 + (csetemp205 + \n+ csetemp206 + csetemp207 + csetemp208)*xformL12 + (csetemp209 + \n+ csetemp210 + csetemp211 + csetemp212)*xformL22 + (csetemp213 + \n+ csetemp214 + csetemp215 + csetemp216)*xformL32) + xformL21*((csetemp197 \n+ + csetemp198 + csetemp199 + csetemp200)*xformL02 + (csetemp209 + \n+ csetemp210 + csetemp211 + csetemp212)*xformL12 + (csetemp217 + \n+ csetemp218 + csetemp219 + csetemp220)*xformL22 + (csetemp221 + \n+ csetemp222 + csetemp223 + csetemp224)*xformL32) + xformL31*((csetemp201 \n+ + csetemp202 + csetemp203 + csetemp204)*xformL02 + (csetemp213 + \n+ csetemp214 + csetemp215 + csetemp216)*xformL12 + (csetemp221 + \n+ csetemp222 + csetemp223 + csetemp224)*xformL22 + (csetemp225 + \n+ csetemp226 + csetemp227 + csetemp228)*xformL32);\n+ \n+ CCTK_REAL dg4130 CCTK_ATTRIBUTE_UNUSED = xformL21*((csetemp77 + \n+ csetemp78 + csetemp79 + csetemp80)*xformL03 + (csetemp89 + csetemp90 + \n+ csetemp91 + csetemp92)*xformL13 + (csetemp100 + csetemp97 + csetemp98 + \n+ csetemp99)*xformL23 + (csetemp101 + csetemp102 + csetemp103 + \n+ csetemp104)*xformL33) + xformL31*((csetemp81 + csetemp82 + csetemp83 + \n+ csetemp84)*xformL03 + (csetemp93 + csetemp94 + csetemp95 + \n+ csetemp96)*xformL13 + (csetemp101 + csetemp102 + csetemp103 + \n+ csetemp104)*xformL23 + (csetemp105 + csetemp106 + csetemp107 + \n+ csetemp108)*xformL33) + xformL01*((csetemp69 + csetemp70 + csetemp71 + \n+ csetemp72)*xformL03 + (csetemp73 + csetemp74 + csetemp75 + \n+ csetemp76)*xformL13 + (csetemp77 + csetemp78 + csetemp79 + \n+ csetemp80)*xformL23 + (csetemp81 + csetemp82 + csetemp83 + \n+ csetemp84)*xformL33) + xformL11*((csetemp73 + csetemp74 + csetemp75 + \n+ csetemp76)*xformL03 + (csetemp85 + csetemp86 + csetemp87 + \n+ csetemp88)*xformL13 + (csetemp89 + csetemp90 + csetemp91 + \n+ csetemp92)*xformL23 + (csetemp93 + csetemp94 + csetemp95 + \n+ csetemp96)*xformL33);\n+ \n+ CCTK_REAL dg4131 CCTK_ATTRIBUTE_UNUSED = xformL01*((csetemp109 + \n+ csetemp110 + csetemp111 + csetemp112)*xformL03 + (csetemp113 + \n+ csetemp114 + csetemp115 + csetemp116)*xformL13 + (csetemp117 + \n+ csetemp118 + csetemp119 + csetemp120)*xformL23 + (csetemp121 + \n+ csetemp122 + csetemp123 + csetemp124)*xformL33) + xformL11*((csetemp113 \n+ + csetemp114 + csetemp115 + csetemp116)*xformL03 + (csetemp125 + \n+ csetemp126 + csetemp127 + csetemp128)*xformL13 + (csetemp129 + \n+ csetemp130 + csetemp131 + csetemp132)*xformL23 + (csetemp133 + \n+ csetemp134 + csetemp135 + csetemp136)*xformL33) + xformL21*((csetemp117 \n+ + csetemp118 + csetemp119 + csetemp120)*xformL03 + (csetemp129 + \n+ csetemp130 + csetemp131 + csetemp132)*xformL13 + (csetemp137 + \n+ csetemp138 + csetemp139 + csetemp140)*xformL23 + (csetemp141 + \n+ csetemp142 + csetemp143 + csetemp144)*xformL33) + xformL31*((csetemp121 \n+ + csetemp122 + csetemp123 + csetemp124)*xformL03 + (csetemp133 + \n+ csetemp134 + csetemp135 + csetemp136)*xformL13 + (csetemp141 + \n+ csetemp142 + csetemp143 + csetemp144)*xformL23 + (csetemp145 + \n+ csetemp146 + csetemp147 + csetemp148)*xformL33);\n+ \n+ CCTK_REAL dg4132 CCTK_ATTRIBUTE_UNUSED = xformL01*((csetemp149 + \n+ csetemp150 + csetemp151 + csetemp152)*xformL03 + (csetemp153 + \n+ csetemp154 + csetemp155 + csetemp156)*xformL13 + (csetemp157 + \n+ csetemp158 + csetemp159 + csetemp160)*xformL23 + (csetemp161 + \n+ csetemp162 + csetemp163 + csetemp164)*xformL33) + xformL11*((csetemp153 \n+ + csetemp154 + csetemp155 + csetemp156)*xformL03 + (csetemp165 + \n+ csetemp166 + csetemp167 + csetemp168)*xformL13 + (csetemp169 + \n+ csetemp170 + csetemp171 + csetemp172)*xformL23 + (csetemp173 + \n+ csetemp174 + csetemp175 + csetemp176)*xformL33) + xformL21*((csetemp157 \n+ + csetemp158 + csetemp159 + csetemp160)*xformL03 + (csetemp169 + \n+ csetemp170 + csetemp171 + csetemp172)*xformL13 + (csetemp177 + \n+ csetemp178 + csetemp179 + csetemp180)*xformL23 + (csetemp181 + \n+ csetemp182 + csetemp183 + csetemp184)*xformL33) + xformL31*((csetemp161 \n+ + csetemp162 + csetemp163 + csetemp164)*xformL03 + (csetemp173 + \n+ csetemp174 + csetemp175 + csetemp176)*xformL13 + (csetemp181 + \n+ csetemp182 + csetemp183 + csetemp184)*xformL23 + (csetemp185 + \n+ csetemp186 + csetemp187 + csetemp188)*xformL33);\n+ \n+ CCTK_REAL dg4133 CCTK_ATTRIBUTE_UNUSED = xformL01*((csetemp189 + \n+ csetemp190 + csetemp191 + csetemp192)*xformL03 + (csetemp193 + \n+ csetemp194 + csetemp195 + csetemp196)*xformL13 + (csetemp197 + \n+ csetemp198 + csetemp199 + csetemp200)*xformL23 + (csetemp201 + \n+ csetemp202 + csetemp203 + csetemp204)*xformL33) + xformL11*((csetemp193 \n+ + csetemp194 + csetemp195 + csetemp196)*xformL03 + (csetemp205 + \n+ csetemp206 + csetemp207 + csetemp208)*xformL13 + (csetemp209 + \n+ csetemp210 + csetemp211 + csetemp212)*xformL23 + (csetemp213 + \n+ csetemp214 + csetemp215 + csetemp216)*xformL33) + xformL21*((csetemp197 \n+ + csetemp198 + csetemp199 + csetemp200)*xformL03 + (csetemp209 + \n+ csetemp210 + csetemp211 + csetemp212)*xformL13 + (csetemp217 + \n+ csetemp218 + csetemp219 + csetemp220)*xformL23 + (csetemp221 + \n+ csetemp222 + csetemp223 + csetemp224)*xformL33) + xformL31*((csetemp201 \n+ + csetemp202 + csetemp203 + csetemp204)*xformL03 + (csetemp213 + \n+ csetemp214 + csetemp215 + csetemp216)*xformL13 + (csetemp221 + \n+ csetemp222 + csetemp223 + csetemp224)*xformL23 + (csetemp225 + \n+ csetemp226 + csetemp227 + csetemp228)*xformL33);\n+ \n+ CCTK_REAL dg4220 CCTK_ATTRIBUTE_UNUSED = xformL22*((csetemp77 + \n+ csetemp78 + csetemp79 + csetemp80)*xformL02 + (csetemp89 + csetemp90 + \n+ csetemp91 + csetemp92)*xformL12 + (csetemp100 + csetemp97 + csetemp98 + \n+ csetemp99)*xformL22 + (csetemp101 + csetemp102 + csetemp103 + \n+ csetemp104)*xformL32) + xformL32*((csetemp81 + csetemp82 + csetemp83 + \n+ csetemp84)*xformL02 + (csetemp93 + csetemp94 + csetemp95 + \n+ csetemp96)*xformL12 + (csetemp101 + csetemp102 + csetemp103 + \n+ csetemp104)*xformL22 + (csetemp105 + csetemp106 + csetemp107 + \n+ csetemp108)*xformL32) + xformL02*((csetemp69 + csetemp70 + csetemp71 + \n+ csetemp72)*xformL02 + (csetemp73 + csetemp74 + csetemp75 + \n+ csetemp76)*xformL12 + (csetemp77 + csetemp78 + csetemp79 + \n+ csetemp80)*xformL22 + (csetemp81 + csetemp82 + csetemp83 + \n+ csetemp84)*xformL32) + xformL12*((csetemp73 + csetemp74 + csetemp75 + \n+ csetemp76)*xformL02 + (csetemp85 + csetemp86 + csetemp87 + \n+ csetemp88)*xformL12 + (csetemp89 + csetemp90 + csetemp91 + \n+ csetemp92)*xformL22 + (csetemp93 + csetemp94 + csetemp95 + \n+ csetemp96)*xformL32);\n+ \n+ CCTK_REAL dg4221 CCTK_ATTRIBUTE_UNUSED = xformL02*((csetemp109 + \n+ csetemp110 + csetemp111 + csetemp112)*xformL02 + (csetemp113 + \n+ csetemp114 + csetemp115 + csetemp116)*xformL12 + (csetemp117 + \n+ csetemp118 + csetemp119 + csetemp120)*xformL22 + (csetemp121 + \n+ csetemp122 + csetemp123 + csetemp124)*xformL32) + xformL12*((csetemp113 \n+ + csetemp114 + csetemp115 + csetemp116)*xformL02 + (csetemp125 + \n+ csetemp126 + csetemp127 + csetemp128)*xformL12 + (csetemp129 + \n+ csetemp130 + csetemp131 + csetemp132)*xformL22 + (csetemp133 + \n+ csetemp134 + csetemp135 + csetemp136)*xformL32) + xformL22*((csetemp117 \n+ + csetemp118 + csetemp119 + csetemp120)*xformL02 + (csetemp129 + \n+ csetemp130 + csetemp131 + csetemp132)*xformL12 + (csetemp137 + \n+ csetemp138 + csetemp139 + csetemp140)*xformL22 + (csetemp141 + \n+ csetemp142 + csetemp143 + csetemp144)*xformL32) + xformL32*((csetemp121 \n+ + csetemp122 + csetemp123 + csetemp124)*xformL02 + (csetemp133 + \n+ csetemp134 + csetemp135 + csetemp136)*xformL12 + (csetemp141 + \n+ csetemp142 + csetemp143 + csetemp144)*xformL22 + (csetemp145 + \n+ csetemp146 + csetemp147 + csetemp148)*xformL32);\n+ \n+ CCTK_REAL dg4222 CCTK_ATTRIBUTE_UNUSED = xformL02*((csetemp149 + \n+ csetemp150 + csetemp151 + csetemp152)*xformL02 + (csetemp153 + \n+ csetemp154 + csetemp155 + csetemp156)*xformL12 + (csetemp157 + \n+ csetemp158 + csetemp159 + csetemp160)*xformL22 + (csetemp161 + \n+ csetemp162 + csetemp163 + csetemp164)*xformL32) + xformL12*((csetemp153 \n+ + csetemp154 + csetemp155 + csetemp156)*xformL02 + (csetemp165 + \n+ csetemp166 + csetemp167 + csetemp168)*xformL12 + (csetemp169 + \n+ csetemp170 + csetemp171 + csetemp172)*xformL22 + (csetemp173 + \n+ csetemp174 + csetemp175 + csetemp176)*xformL32) + xformL22*((csetemp157 \n+ + csetemp158 + csetemp159 + csetemp160)*xformL02 + (csetemp169 + \n+ csetemp170 + csetemp171 + csetemp172)*xformL12 + (csetemp177 + \n+ csetemp178 + csetemp179 + csetemp180)*xformL22 + (csetemp181 + \n+ csetemp182 + csetemp183 + csetemp184)*xformL32) + xformL32*((csetemp161 \n+ + csetemp162 + csetemp163 + csetemp164)*xformL02 + (csetemp173 + \n+ csetemp174 + csetemp175 + csetemp176)*xformL12 + (csetemp181 + \n+ csetemp182 + csetemp183 + csetemp184)*xformL22 + (csetemp185 + \n+ csetemp186 + csetemp187 + csetemp188)*xformL32);\n+ \n+ CCTK_REAL dg4223 CCTK_ATTRIBUTE_UNUSED = xformL02*((csetemp189 + \n+ csetemp190 + csetemp191 + csetemp192)*xformL02 + (csetemp193 + \n+ csetemp194 + csetemp195 + csetemp196)*xformL12 + (csetemp197 + \n+ csetemp198 + csetemp199 + csetemp200)*xformL22 + (csetemp201 + \n+ csetemp202 + csetemp203 + csetemp204)*xformL32) + xformL12*((csetemp193 \n+ + csetemp194 + csetemp195 + csetemp196)*xformL02 + (csetemp205 + \n+ csetemp206 + csetemp207 + csetemp208)*xformL12 + (csetemp209 + \n+ csetemp210 + csetemp211 + csetemp212)*xformL22 + (csetemp213 + \n+ csetemp214 + csetemp215 + csetemp216)*xformL32) + xformL22*((csetemp197 \n+ + csetemp198 + csetemp199 + csetemp200)*xformL02 + (csetemp209 + \n+ csetemp210 + csetemp211 + csetemp212)*xformL12 + (csetemp217 + \n+ csetemp218 + csetemp219 + csetemp220)*xformL22 + (csetemp221 + \n+ csetemp222 + csetemp223 + csetemp224)*xformL32) + xformL32*((csetemp201 \n+ + csetemp202 + csetemp203 + csetemp204)*xformL02 + (csetemp213 + \n+ csetemp214 + csetemp215 + csetemp216)*xformL12 + (csetemp221 + \n+ csetemp222 + csetemp223 + csetemp224)*xformL22 + (csetemp225 + \n+ csetemp226 + csetemp227 + csetemp228)*xformL32);\n+ \n+ CCTK_REAL dg4230 CCTK_ATTRIBUTE_UNUSED = xformL22*((csetemp77 + \n+ csetemp78 + csetemp79 + csetemp80)*xformL03 + (csetemp89 + csetemp90 + \n+ csetemp91 + csetemp92)*xformL13 + (csetemp100 + csetemp97 + csetemp98 + \n+ csetemp99)*xformL23 + (csetemp101 + csetemp102 + csetemp103 + \n+ csetemp104)*xformL33) + xformL32*((csetemp81 + csetemp82 + csetemp83 + \n+ csetemp84)*xformL03 + (csetemp93 + csetemp94 + csetemp95 + \n+ csetemp96)*xformL13 + (csetemp101 + csetemp102 + csetemp103 + \n+ csetemp104)*xformL23 + (csetemp105 + csetemp106 + csetemp107 + \n+ csetemp108)*xformL33) + xformL02*((csetemp69 + csetemp70 + csetemp71 + \n+ csetemp72)*xformL03 + (csetemp73 + csetemp74 + csetemp75 + \n+ csetemp76)*xformL13 + (csetemp77 + csetemp78 + csetemp79 + \n+ csetemp80)*xformL23 + (csetemp81 + csetemp82 + csetemp83 + \n+ csetemp84)*xformL33) + xformL12*((csetemp73 + csetemp74 + csetemp75 + \n+ csetemp76)*xformL03 + (csetemp85 + csetemp86 + csetemp87 + \n+ csetemp88)*xformL13 + (csetemp89 + csetemp90 + csetemp91 + \n+ csetemp92)*xformL23 + (csetemp93 + csetemp94 + csetemp95 + \n+ csetemp96)*xformL33);\n+ \n+ CCTK_REAL dg4231 CCTK_ATTRIBUTE_UNUSED = xformL02*((csetemp109 + \n+ csetemp110 + csetemp111 + csetemp112)*xformL03 + (csetemp113 + \n+ csetemp114 + csetemp115 + csetemp116)*xformL13 + (csetemp117 + \n+ csetemp118 + csetemp119 + csetemp120)*xformL23 + (csetemp121 + \n+ csetemp122 + csetemp123 + csetemp124)*xformL33) + xformL12*((csetemp113 \n+ + csetemp114 + csetemp115 + csetemp116)*xformL03 + (csetemp125 + \n+ csetemp126 + csetemp127 + csetemp128)*xformL13 + (csetemp129 + \n+ csetemp130 + csetemp131 + csetemp132)*xformL23 + (csetemp133 + \n+ csetemp134 + csetemp135 + csetemp136)*xformL33) + xformL22*((csetemp117 \n+ + csetemp118 + csetemp119 + csetemp120)*xformL03 + (csetemp129 + \n+ csetemp130 + csetemp131 + csetemp132)*xformL13 + (csetemp137 + \n+ csetemp138 + csetemp139 + csetemp140)*xformL23 + (csetemp141 + \n+ csetemp142 + csetemp143 + csetemp144)*xformL33) + xformL32*((csetemp121 \n+ + csetemp122 + csetemp123 + csetemp124)*xformL03 + (csetemp133 + \n+ csetemp134 + csetemp135 + csetemp136)*xformL13 + (csetemp141 + \n+ csetemp142 + csetemp143 + csetemp144)*xformL23 + (csetemp145 + \n+ csetemp146 + csetemp147 + csetemp148)*xformL33);\n+ \n+ CCTK_REAL dg4232 CCTK_ATTRIBUTE_UNUSED = xformL02*((csetemp149 + \n+ csetemp150 + csetemp151 + csetemp152)*xformL03 + (csetemp153 + \n+ csetemp154 + csetemp155 + csetemp156)*xformL13 + (csetemp157 + \n+ csetemp158 + csetemp159 + csetemp160)*xformL23 + (csetemp161 + \n+ csetemp162 + csetemp163 + csetemp164)*xformL33) + xformL12*((csetemp153 \n+ + csetemp154 + csetemp155 + csetemp156)*xformL03 + (csetemp165 + \n+ csetemp166 + csetemp167 + csetemp168)*xformL13 + (csetemp169 + \n+ csetemp170 + csetemp171 + csetemp172)*xformL23 + (csetemp173 + \n+ csetemp174 + csetemp175 + csetemp176)*xformL33) + xformL22*((csetemp157 \n+ + csetemp158 + csetemp159 + csetemp160)*xformL03 + (csetemp169 + \n+ csetemp170 + csetemp171 + csetemp172)*xformL13 + (csetemp177 + \n+ csetemp178 + csetemp179 + csetemp180)*xformL23 + (csetemp181 + \n+ csetemp182 + csetemp183 + csetemp184)*xformL33) + xformL32*((csetemp161 \n+ + csetemp162 + csetemp163 + csetemp164)*xformL03 + (csetemp173 + \n+ csetemp174 + csetemp175 + csetemp176)*xformL13 + (csetemp181 + \n+ csetemp182 + csetemp183 + csetemp184)*xformL23 + (csetemp185 + \n+ csetemp186 + csetemp187 + csetemp188)*xformL33);\n+ \n+ CCTK_REAL dg4233 CCTK_ATTRIBUTE_UNUSED = xformL02*((csetemp189 + \n+ csetemp190 + csetemp191 + csetemp192)*xformL03 + (csetemp193 + \n+ csetemp194 + csetemp195 + csetemp196)*xformL13 + (csetemp197 + \n+ csetemp198 + csetemp199 + csetemp200)*xformL23 + (csetemp201 + \n+ csetemp202 + csetemp203 + csetemp204)*xformL33) + xformL12*((csetemp193 \n+ + csetemp194 + csetemp195 + csetemp196)*xformL03 + (csetemp205 + \n+ csetemp206 + csetemp207 + csetemp208)*xformL13 + (csetemp209 + \n+ csetemp210 + csetemp211 + csetemp212)*xformL23 + (csetemp213 + \n+ csetemp214 + csetemp215 + csetemp216)*xformL33) + xformL22*((csetemp197 \n+ + csetemp198 + csetemp199 + csetemp200)*xformL03 + (csetemp209 + \n+ csetemp210 + csetemp211 + csetemp212)*xformL13 + (csetemp217 + \n+ csetemp218 + csetemp219 + csetemp220)*xformL23 + (csetemp221 + \n+ csetemp222 + csetemp223 + csetemp224)*xformL33) + xformL32*((csetemp201 \n+ + csetemp202 + csetemp203 + csetemp204)*xformL03 + (csetemp213 + \n+ csetemp214 + csetemp215 + csetemp216)*xformL13 + (csetemp221 + \n+ csetemp222 + csetemp223 + csetemp224)*xformL23 + (csetemp225 + \n+ csetemp226 + csetemp227 + csetemp228)*xformL33);\n+ \n+ CCTK_REAL dg4330 CCTK_ATTRIBUTE_UNUSED = xformL23*((csetemp77 + \n+ csetemp78 + csetemp79 + csetemp80)*xformL03 + (csetemp89 + csetemp90 + \n+ csetemp91 + csetemp92)*xformL13 + (csetemp100 + csetemp97 + csetemp98 + \n+ csetemp99)*xformL23 + (csetemp101 + csetemp102 + csetemp103 + \n+ csetemp104)*xformL33) + xformL33*((csetemp81 + csetemp82 + csetemp83 + \n+ csetemp84)*xformL03 + (csetemp93 + csetemp94 + csetemp95 + \n+ csetemp96)*xformL13 + (csetemp101 + csetemp102 + csetemp103 + \n+ csetemp104)*xformL23 + (csetemp105 + csetemp106 + csetemp107 + \n+ csetemp108)*xformL33) + xformL03*((csetemp69 + csetemp70 + csetemp71 + \n+ csetemp72)*xformL03 + (csetemp73 + csetemp74 + csetemp75 + \n+ csetemp76)*xformL13 + (csetemp77 + csetemp78 + csetemp79 + \n+ csetemp80)*xformL23 + (csetemp81 + csetemp82 + csetemp83 + \n+ csetemp84)*xformL33) + xformL13*((csetemp73 + csetemp74 + csetemp75 + \n+ csetemp76)*xformL03 + (csetemp85 + csetemp86 + csetemp87 + \n+ csetemp88)*xformL13 + (csetemp89 + csetemp90 + csetemp91 + \n+ csetemp92)*xformL23 + (csetemp93 + csetemp94 + csetemp95 + \n+ csetemp96)*xformL33);\n+ \n+ CCTK_REAL dg4331 CCTK_ATTRIBUTE_UNUSED = xformL03*((csetemp109 + \n+ csetemp110 + csetemp111 + csetemp112)*xformL03 + (csetemp113 + \n+ csetemp114 + csetemp115 + csetemp116)*xformL13 + (csetemp117 + \n+ csetemp118 + csetemp119 + csetemp120)*xformL23 + (csetemp121 + \n+ csetemp122 + csetemp123 + csetemp124)*xformL33) + xformL13*((csetemp113 \n+ + csetemp114 + csetemp115 + csetemp116)*xformL03 + (csetemp125 + \n+ csetemp126 + csetemp127 + csetemp128)*xformL13 + (csetemp129 + \n+ csetemp130 + csetemp131 + csetemp132)*xformL23 + (csetemp133 + \n+ csetemp134 + csetemp135 + csetemp136)*xformL33) + xformL23*((csetemp117 \n+ + csetemp118 + csetemp119 + csetemp120)*xformL03 + (csetemp129 + \n+ csetemp130 + csetemp131 + csetemp132)*xformL13 + (csetemp137 + \n+ csetemp138 + csetemp139 + csetemp140)*xformL23 + (csetemp141 + \n+ csetemp142 + csetemp143 + csetemp144)*xformL33) + xformL33*((csetemp121 \n+ + csetemp122 + csetemp123 + csetemp124)*xformL03 + (csetemp133 + \n+ csetemp134 + csetemp135 + csetemp136)*xformL13 + (csetemp141 + \n+ csetemp142 + csetemp143 + csetemp144)*xformL23 + (csetemp145 + \n+ csetemp146 + csetemp147 + csetemp148)*xformL33);\n+ \n+ CCTK_REAL dg4332 CCTK_ATTRIBUTE_UNUSED = xformL03*((csetemp149 + \n+ csetemp150 + csetemp151 + csetemp152)*xformL03 + (csetemp153 + \n+ csetemp154 + csetemp155 + csetemp156)*xformL13 + (csetemp157 + \n+ csetemp158 + csetemp159 + csetemp160)*xformL23 + (csetemp161 + \n+ csetemp162 + csetemp163 + csetemp164)*xformL33) + xformL13*((csetemp153 \n+ + csetemp154 + csetemp155 + csetemp156)*xformL03 + (csetemp165 + \n+ csetemp166 + csetemp167 + csetemp168)*xformL13 + (csetemp169 + \n+ csetemp170 + csetemp171 + csetemp172)*xformL23 + (csetemp173 + \n+ csetemp174 + csetemp175 + csetemp176)*xformL33) + xformL23*((csetemp157 \n+ + csetemp158 + csetemp159 + csetemp160)*xformL03 + (csetemp169 + \n+ csetemp170 + csetemp171 + csetemp172)*xformL13 + (csetemp177 + \n+ csetemp178 + csetemp179 + csetemp180)*xformL23 + (csetemp181 + \n+ csetemp182 + csetemp183 + csetemp184)*xformL33) + xformL33*((csetemp161 \n+ + csetemp162 + csetemp163 + csetemp164)*xformL03 + (csetemp173 + \n+ csetemp174 + csetemp175 + csetemp176)*xformL13 + (csetemp181 + \n+ csetemp182 + csetemp183 + csetemp184)*xformL23 + (csetemp185 + \n+ csetemp186 + csetemp187 + csetemp188)*xformL33);\n+ \n+ CCTK_REAL dg4333 CCTK_ATTRIBUTE_UNUSED = xformL03*((csetemp189 + \n+ csetemp190 + csetemp191 + csetemp192)*xformL03 + (csetemp193 + \n+ csetemp194 + csetemp195 + csetemp196)*xformL13 + (csetemp197 + \n+ csetemp198 + csetemp199 + csetemp200)*xformL23 + (csetemp201 + \n+ csetemp202 + csetemp203 + csetemp204)*xformL33) + xformL13*((csetemp193 \n+ + csetemp194 + csetemp195 + csetemp196)*xformL03 + (csetemp205 + \n+ csetemp206 + csetemp207 + csetemp208)*xformL13 + (csetemp209 + \n+ csetemp210 + csetemp211 + csetemp212)*xformL23 + (csetemp213 + \n+ csetemp214 + csetemp215 + csetemp216)*xformL33) + xformL23*((csetemp197 \n+ + csetemp198 + csetemp199 + csetemp200)*xformL03 + (csetemp209 + \n+ csetemp210 + csetemp211 + csetemp212)*xformL13 + (csetemp217 + \n+ csetemp218 + csetemp219 + csetemp220)*xformL23 + (csetemp221 + \n+ csetemp222 + csetemp223 + csetemp224)*xformL33) + xformL33*((csetemp201 \n+ + csetemp202 + csetemp203 + csetemp204)*xformL03 + (csetemp213 + \n+ csetemp214 + csetemp215 + csetemp216)*xformL13 + (csetemp221 + \n+ csetemp222 + csetemp223 + csetemp224)*xformL23 + (csetemp225 + \n+ csetemp226 + csetemp227 + csetemp228)*xformL33);\n+ \n+ CCTK_REAL betal1 CCTK_ATTRIBUTE_UNUSED = g401;\n+ \n+ CCTK_REAL betal2 CCTK_ATTRIBUTE_UNUSED = g402;\n+ \n+ CCTK_REAL betal3 CCTK_ATTRIBUTE_UNUSED = g403;\n+ \n+ CCTK_REAL gerr11L CCTK_ATTRIBUTE_UNUSED = gxxL - g411;\n+ \n+ CCTK_REAL gerr12L CCTK_ATTRIBUTE_UNUSED = gxyL - g412;\n+ \n+ CCTK_REAL gerr13L CCTK_ATTRIBUTE_UNUSED = gxzL - g413;\n+ \n+ CCTK_REAL gerr22L CCTK_ATTRIBUTE_UNUSED = gyyL - g422;\n+ \n+ CCTK_REAL gerr23L CCTK_ATTRIBUTE_UNUSED = gyzL - g423;\n+ \n+ CCTK_REAL gerr33L CCTK_ATTRIBUTE_UNUSED = gzzL - g433;\n+ \n+ CCTK_REAL csetemp229 CCTK_ATTRIBUTE_UNUSED = SQR(gxzL);\n+ \n+ CCTK_REAL csetemp230 CCTK_ATTRIBUTE_UNUSED = SQR(gyzL);\n+ \n+ CCTK_REAL csetemp231 CCTK_ATTRIBUTE_UNUSED = SQR(gxyL);\n+ \n+ CCTK_REAL detg CCTK_ATTRIBUTE_UNUSED = 2*gxyL*gxzL*gyzL + \n+ gyyL*(gxxL*gzzL - csetemp229) - gxxL*csetemp230 - gzzL*csetemp231;\n+ \n+ CCTK_REAL csetemp232 CCTK_ATTRIBUTE_UNUSED = INV(detg);\n+ \n+ CCTK_REAL gu11 CCTK_ATTRIBUTE_UNUSED = (gyyL*gzzL - \n+ csetemp230)*csetemp232;\n+ \n+ CCTK_REAL gu12 CCTK_ATTRIBUTE_UNUSED = (gxzL*gyzL - \n+ gxyL*gzzL)*csetemp232;\n+ \n+ CCTK_REAL gu13 CCTK_ATTRIBUTE_UNUSED = (-(gxzL*gyyL) + \n+ gxyL*gyzL)*csetemp232;\n+ \n+ CCTK_REAL gu22 CCTK_ATTRIBUTE_UNUSED = (gxxL*gzzL - \n+ csetemp229)*csetemp232;\n+ \n+ CCTK_REAL gu23 CCTK_ATTRIBUTE_UNUSED = (gxyL*gxzL - \n+ gxxL*gyzL)*csetemp232;\n+ \n+ CCTK_REAL gu33 CCTK_ATTRIBUTE_UNUSED = (gxxL*gyyL - \n+ csetemp231)*csetemp232;\n+ \n+ CCTK_REAL betaerr1L CCTK_ATTRIBUTE_UNUSED = betaxL - betal1*gu11 - \n+ betal2*gu12 - betal3*gu13;\n+ \n+ CCTK_REAL betaerr2L CCTK_ATTRIBUTE_UNUSED = betayL - betal1*gu12 - \n+ betal2*gu22 - betal3*gu23;\n+ \n+ CCTK_REAL betaerr3L CCTK_ATTRIBUTE_UNUSED = betazL - betal1*gu13 - \n+ betal2*gu23 - betal3*gu33;\n+ \n+ CCTK_REAL betasq CCTK_ATTRIBUTE_UNUSED = betaxL*betal1 + betayL*betal2 \n+ + betazL*betal3;\n+ \n+ CCTK_REAL alperrL CCTK_ATTRIBUTE_UNUSED = alpL - sqrt(betasq - g400);\n+ \n+ CCTK_REAL dtg11 CCTK_ATTRIBUTE_UNUSED = dg4110;\n+ \n+ CCTK_REAL dtg12 CCTK_ATTRIBUTE_UNUSED = dg4120;\n+ \n+ CCTK_REAL dtg13 CCTK_ATTRIBUTE_UNUSED = dg4130;\n+ \n+ CCTK_REAL dtg22 CCTK_ATTRIBUTE_UNUSED = dg4220;\n+ \n+ CCTK_REAL dtg23 CCTK_ATTRIBUTE_UNUSED = dg4230;\n+ \n+ CCTK_REAL dtg33 CCTK_ATTRIBUTE_UNUSED = dg4330;\n+ \n+ CCTK_REAL dg111 CCTK_ATTRIBUTE_UNUSED = dg4111;\n+ \n+ CCTK_REAL dg112 CCTK_ATTRIBUTE_UNUSED = dg4112;\n+ \n+ CCTK_REAL dg113 CCTK_ATTRIBUTE_UNUSED = dg4113;\n+ \n+ CCTK_REAL dg121 CCTK_ATTRIBUTE_UNUSED = dg4121;\n+ \n+ CCTK_REAL dg122 CCTK_ATTRIBUTE_UNUSED = dg4122;\n+ \n+ CCTK_REAL dg123 CCTK_ATTRIBUTE_UNUSED = dg4123;\n+ \n+ CCTK_REAL dg131 CCTK_ATTRIBUTE_UNUSED = dg4131;\n+ \n+ CCTK_REAL dg132 CCTK_ATTRIBUTE_UNUSED = dg4132;\n+ \n+ CCTK_REAL dg133 CCTK_ATTRIBUTE_UNUSED = dg4133;\n+ \n+ CCTK_REAL dg221 CCTK_ATTRIBUTE_UNUSED = dg4221;\n+ \n+ CCTK_REAL dg222 CCTK_ATTRIBUTE_UNUSED = dg4222;\n+ \n+ CCTK_REAL dg223 CCTK_ATTRIBUTE_UNUSED = dg4223;\n+ \n+ CCTK_REAL dg231 CCTK_ATTRIBUTE_UNUSED = dg4231;\n+ \n+ CCTK_REAL dg232 CCTK_ATTRIBUTE_UNUSED = dg4232;\n+ \n+ CCTK_REAL dg233 CCTK_ATTRIBUTE_UNUSED = dg4233;\n+ \n+ CCTK_REAL dg331 CCTK_ATTRIBUTE_UNUSED = dg4331;\n+ \n+ CCTK_REAL dg332 CCTK_ATTRIBUTE_UNUSED = dg4332;\n+ \n+ CCTK_REAL dg333 CCTK_ATTRIBUTE_UNUSED = dg4333;\n+ \n+ CCTK_REAL csetemp233 CCTK_ATTRIBUTE_UNUSED = dtg11*gu11;\n+ \n+ CCTK_REAL csetemp234 CCTK_ATTRIBUTE_UNUSED = dtg12*gu12;\n+ \n+ CCTK_REAL csetemp235 CCTK_ATTRIBUTE_UNUSED = dtg13*gu13;\n+ \n+ CCTK_REAL csetemp236 CCTK_ATTRIBUTE_UNUSED = dtg12*gu11;\n+ \n+ CCTK_REAL csetemp237 CCTK_ATTRIBUTE_UNUSED = dtg22*gu12;\n+ \n+ CCTK_REAL csetemp238 CCTK_ATTRIBUTE_UNUSED = dtg23*gu13;\n+ \n+ CCTK_REAL csetemp239 CCTK_ATTRIBUTE_UNUSED = dtg13*gu11;\n+ \n+ CCTK_REAL csetemp240 CCTK_ATTRIBUTE_UNUSED = dtg23*gu12;\n+ \n+ CCTK_REAL csetemp241 CCTK_ATTRIBUTE_UNUSED = dtg33*gu13;\n+ \n+ CCTK_REAL dtgu11 CCTK_ATTRIBUTE_UNUSED = -((csetemp233 + csetemp234 + \n+ csetemp235)*gu11) - (csetemp236 + csetemp237 + csetemp238)*gu12 - \n+ (csetemp239 + csetemp240 + csetemp241)*gu13;\n+ \n+ CCTK_REAL dtgu12 CCTK_ATTRIBUTE_UNUSED = -((csetemp233 + csetemp234 + \n+ csetemp235)*gu12) - (csetemp236 + csetemp237 + csetemp238)*gu22 - \n+ (csetemp239 + csetemp240 + csetemp241)*gu23;\n+ \n+ CCTK_REAL dtgu13 CCTK_ATTRIBUTE_UNUSED = -((csetemp233 + csetemp234 + \n+ csetemp235)*gu13) - (csetemp236 + csetemp237 + csetemp238)*gu23 - \n+ (csetemp239 + csetemp240 + csetemp241)*gu33;\n+ \n+ CCTK_REAL csetemp242 CCTK_ATTRIBUTE_UNUSED = dtg11*gu12;\n+ \n+ CCTK_REAL csetemp243 CCTK_ATTRIBUTE_UNUSED = dtg12*gu22;\n+ \n+ CCTK_REAL csetemp244 CCTK_ATTRIBUTE_UNUSED = dtg13*gu23;\n+ \n+ CCTK_REAL csetemp245 CCTK_ATTRIBUTE_UNUSED = dtg22*gu22;\n+ \n+ CCTK_REAL csetemp246 CCTK_ATTRIBUTE_UNUSED = dtg23*gu23;\n+ \n+ CCTK_REAL csetemp247 CCTK_ATTRIBUTE_UNUSED = dtg13*gu12;\n+ \n+ CCTK_REAL csetemp248 CCTK_ATTRIBUTE_UNUSED = dtg23*gu22;\n+ \n+ CCTK_REAL csetemp249 CCTK_ATTRIBUTE_UNUSED = dtg33*gu23;\n+ \n+ CCTK_REAL dtgu22 CCTK_ATTRIBUTE_UNUSED = -((csetemp242 + csetemp243 + \n+ csetemp244)*gu12) - (csetemp234 + csetemp245 + csetemp246)*gu22 - \n+ (csetemp247 + csetemp248 + csetemp249)*gu23;\n+ \n+ CCTK_REAL dtgu23 CCTK_ATTRIBUTE_UNUSED = -((csetemp242 + csetemp243 + \n+ csetemp244)*gu13) - (csetemp234 + csetemp245 + csetemp246)*gu23 - \n+ (csetemp247 + csetemp248 + csetemp249)*gu33;\n+ \n+ CCTK_REAL dtgu33 CCTK_ATTRIBUTE_UNUSED = -(gu13*(dtg11*gu13 + \n+ dtg12*gu23 + dtg13*gu33)) - gu23*(dtg12*gu13 + dtg22*gu23 + dtg23*gu33) \n+ - gu33*(csetemp235 + csetemp246 + dtg33*gu33);\n+ \n+ CCTK_REAL csetemp250 CCTK_ATTRIBUTE_UNUSED = dg111*gu11;\n+ \n+ CCTK_REAL csetemp251 CCTK_ATTRIBUTE_UNUSED = dg121*gu12;\n+ \n+ CCTK_REAL csetemp252 CCTK_ATTRIBUTE_UNUSED = dg131*gu13;\n+ \n+ CCTK_REAL csetemp253 CCTK_ATTRIBUTE_UNUSED = dg121*gu11;\n+ \n+ CCTK_REAL csetemp254 CCTK_ATTRIBUTE_UNUSED = dg221*gu12;\n+ \n+ CCTK_REAL csetemp255 CCTK_ATTRIBUTE_UNUSED = dg231*gu13;\n+ \n+ CCTK_REAL csetemp256 CCTK_ATTRIBUTE_UNUSED = dg131*gu11;\n+ \n+ CCTK_REAL csetemp257 CCTK_ATTRIBUTE_UNUSED = dg231*gu12;\n+ \n+ CCTK_REAL csetemp258 CCTK_ATTRIBUTE_UNUSED = dg331*gu13;\n+ \n+ CCTK_REAL dgu111 CCTK_ATTRIBUTE_UNUSED = -((csetemp250 + csetemp251 + \n+ csetemp252)*gu11) - (csetemp253 + csetemp254 + csetemp255)*gu12 - \n+ (csetemp256 + csetemp257 + csetemp258)*gu13;\n+ \n+ CCTK_REAL dgu121 CCTK_ATTRIBUTE_UNUSED = -((csetemp250 + csetemp251 + \n+ csetemp252)*gu12) - (csetemp253 + csetemp254 + csetemp255)*gu22 - \n+ (csetemp256 + csetemp257 + csetemp258)*gu23;\n+ \n+ CCTK_REAL dgu131 CCTK_ATTRIBUTE_UNUSED = -((csetemp250 + csetemp251 + \n+ csetemp252)*gu13) - (csetemp253 + csetemp254 + csetemp255)*gu23 - \n+ (csetemp256 + csetemp257 + csetemp258)*gu33;\n+ \n+ CCTK_REAL csetemp259 CCTK_ATTRIBUTE_UNUSED = dg111*gu12;\n+ \n+ CCTK_REAL csetemp260 CCTK_ATTRIBUTE_UNUSED = dg121*gu22;\n+ \n+ CCTK_REAL csetemp261 CCTK_ATTRIBUTE_UNUSED = dg131*gu23;\n+ \n+ CCTK_REAL csetemp262 CCTK_ATTRIBUTE_UNUSED = dg221*gu22;\n+ \n+ CCTK_REAL csetemp263 CCTK_ATTRIBUTE_UNUSED = dg231*gu23;\n+ \n+ CCTK_REAL csetemp264 CCTK_ATTRIBUTE_UNUSED = dg131*gu12;\n+ \n+ CCTK_REAL csetemp265 CCTK_ATTRIBUTE_UNUSED = dg231*gu22;\n+ \n+ CCTK_REAL csetemp266 CCTK_ATTRIBUTE_UNUSED = dg331*gu23;\n+ \n+ CCTK_REAL dgu221 CCTK_ATTRIBUTE_UNUSED = -((csetemp259 + csetemp260 + \n+ csetemp261)*gu12) - (csetemp251 + csetemp262 + csetemp263)*gu22 - \n+ (csetemp264 + csetemp265 + csetemp266)*gu23;\n+ \n+ CCTK_REAL dgu231 CCTK_ATTRIBUTE_UNUSED = -((csetemp259 + csetemp260 + \n+ csetemp261)*gu13) - (csetemp251 + csetemp262 + csetemp263)*gu23 - \n+ (csetemp264 + csetemp265 + csetemp266)*gu33;\n+ \n+ CCTK_REAL dgu331 CCTK_ATTRIBUTE_UNUSED = -(gu13*(dg111*gu13 + \n+ dg121*gu23 + dg131*gu33)) - gu23*(dg121*gu13 + dg221*gu23 + dg231*gu33) \n+ - gu33*(csetemp252 + csetemp263 + dg331*gu33);\n+ \n+ CCTK_REAL csetemp267 CCTK_ATTRIBUTE_UNUSED = dg112*gu11;\n+ \n+ CCTK_REAL csetemp268 CCTK_ATTRIBUTE_UNUSED = dg122*gu12;\n+ \n+ CCTK_REAL csetemp269 CCTK_ATTRIBUTE_UNUSED = dg132*gu13;\n+ \n+ CCTK_REAL csetemp270 CCTK_ATTRIBUTE_UNUSED = dg122*gu11;\n+ \n+ CCTK_REAL csetemp271 CCTK_ATTRIBUTE_UNUSED = dg222*gu12;\n+ \n+ CCTK_REAL csetemp272 CCTK_ATTRIBUTE_UNUSED = dg232*gu13;\n+ \n+ CCTK_REAL csetemp273 CCTK_ATTRIBUTE_UNUSED = dg132*gu11;\n+ \n+ CCTK_REAL csetemp274 CCTK_ATTRIBUTE_UNUSED = dg232*gu12;\n+ \n+ CCTK_REAL csetemp275 CCTK_ATTRIBUTE_UNUSED = dg332*gu13;\n+ \n+ CCTK_REAL dgu112 CCTK_ATTRIBUTE_UNUSED = -((csetemp267 + csetemp268 + \n+ csetemp269)*gu11) - (csetemp270 + csetemp271 + csetemp272)*gu12 - \n+ (csetemp273 + csetemp274 + csetemp275)*gu13;\n+ \n+ CCTK_REAL dgu122 CCTK_ATTRIBUTE_UNUSED = -((csetemp267 + csetemp268 + \n+ csetemp269)*gu12) - (csetemp270 + csetemp271 + csetemp272)*gu22 - \n+ (csetemp273 + csetemp274 + csetemp275)*gu23;\n+ \n+ CCTK_REAL dgu132 CCTK_ATTRIBUTE_UNUSED = -((csetemp267 + csetemp268 + \n+ csetemp269)*gu13) - (csetemp270 + csetemp271 + csetemp272)*gu23 - \n+ (csetemp273 + csetemp274 + csetemp275)*gu33;\n+ \n+ CCTK_REAL csetemp276 CCTK_ATTRIBUTE_UNUSED = dg112*gu12;\n+ \n+ CCTK_REAL csetemp277 CCTK_ATTRIBUTE_UNUSED = dg122*gu22;\n+ \n+ CCTK_REAL csetemp278 CCTK_ATTRIBUTE_UNUSED = dg132*gu23;\n+ \n+ CCTK_REAL csetemp279 CCTK_ATTRIBUTE_UNUSED = dg222*gu22;\n+ \n+ CCTK_REAL csetemp280 CCTK_ATTRIBUTE_UNUSED = dg232*gu23;\n+ \n+ CCTK_REAL csetemp281 CCTK_ATTRIBUTE_UNUSED = dg132*gu12;\n+ \n+ CCTK_REAL csetemp282 CCTK_ATTRIBUTE_UNUSED = dg232*gu22;\n+ \n+ CCTK_REAL csetemp283 CCTK_ATTRIBUTE_UNUSED = dg332*gu23;\n+ \n+ CCTK_REAL dgu222 CCTK_ATTRIBUTE_UNUSED = -((csetemp276 + csetemp277 + \n+ csetemp278)*gu12) - (csetemp268 + csetemp279 + csetemp280)*gu22 - \n+ (csetemp281 + csetemp282 + csetemp283)*gu23;\n+ \n+ CCTK_REAL dgu232 CCTK_ATTRIBUTE_UNUSED = -((csetemp276 + csetemp277 + \n+ csetemp278)*gu13) - (csetemp268 + csetemp279 + csetemp280)*gu23 - \n+ (csetemp281 + csetemp282 + csetemp283)*gu33;\n+ \n+ CCTK_REAL dgu332 CCTK_ATTRIBUTE_UNUSED = -(gu13*(dg112*gu13 + \n+ dg122*gu23 + dg132*gu33)) - gu23*(dg122*gu13 + dg222*gu23 + dg232*gu33) \n+ - gu33*(csetemp269 + csetemp280 + dg332*gu33);\n+ \n+ CCTK_REAL csetemp284 CCTK_ATTRIBUTE_UNUSED = dg113*gu11;\n+ \n+ CCTK_REAL csetemp285 CCTK_ATTRIBUTE_UNUSED = dg123*gu12;\n+ \n+ CCTK_REAL csetemp286 CCTK_ATTRIBUTE_UNUSED = dg133*gu13;\n+ \n+ CCTK_REAL csetemp287 CCTK_ATTRIBUTE_UNUSED = dg123*gu11;\n+ \n+ CCTK_REAL csetemp288 CCTK_ATTRIBUTE_UNUSED = dg223*gu12;\n+ \n+ CCTK_REAL csetemp289 CCTK_ATTRIBUTE_UNUSED = dg233*gu13;\n+ \n+ CCTK_REAL csetemp290 CCTK_ATTRIBUTE_UNUSED = dg133*gu11;\n+ \n+ CCTK_REAL csetemp291 CCTK_ATTRIBUTE_UNUSED = dg233*gu12;\n+ \n+ CCTK_REAL csetemp292 CCTK_ATTRIBUTE_UNUSED = dg333*gu13;\n+ \n+ CCTK_REAL dgu113 CCTK_ATTRIBUTE_UNUSED = -((csetemp284 + csetemp285 + \n+ csetemp286)*gu11) - (csetemp287 + csetemp288 + csetemp289)*gu12 - \n+ (csetemp290 + csetemp291 + csetemp292)*gu13;\n+ \n+ CCTK_REAL dgu123 CCTK_ATTRIBUTE_UNUSED = -((csetemp284 + csetemp285 + \n+ csetemp286)*gu12) - (csetemp287 + csetemp288 + csetemp289)*gu22 - \n+ (csetemp290 + csetemp291 + csetemp292)*gu23;\n+ \n+ CCTK_REAL dgu133 CCTK_ATTRIBUTE_UNUSED = -((csetemp284 + csetemp285 + \n+ csetemp286)*gu13) - (csetemp287 + csetemp288 + csetemp289)*gu23 - \n+ (csetemp290 + csetemp291 + csetemp292)*gu33;\n+ \n+ CCTK_REAL csetemp293 CCTK_ATTRIBUTE_UNUSED = dg113*gu12;\n+ \n+ CCTK_REAL csetemp294 CCTK_ATTRIBUTE_UNUSED = dg123*gu22;\n+ \n+ CCTK_REAL csetemp295 CCTK_ATTRIBUTE_UNUSED = dg133*gu23;\n+ \n+ CCTK_REAL csetemp296 CCTK_ATTRIBUTE_UNUSED = dg223*gu22;\n+ \n+ CCTK_REAL csetemp297 CCTK_ATTRIBUTE_UNUSED = dg233*gu23;\n+ \n+ CCTK_REAL csetemp298 CCTK_ATTRIBUTE_UNUSED = dg133*gu12;\n+ \n+ CCTK_REAL csetemp299 CCTK_ATTRIBUTE_UNUSED = dg233*gu22;\n+ \n+ CCTK_REAL csetemp300 CCTK_ATTRIBUTE_UNUSED = dg333*gu23;\n+ \n+ CCTK_REAL dgu223 CCTK_ATTRIBUTE_UNUSED = -((csetemp293 + csetemp294 + \n+ csetemp295)*gu12) - (csetemp285 + csetemp296 + csetemp297)*gu22 - \n+ (csetemp298 + csetemp299 + csetemp300)*gu23;\n+ \n+ CCTK_REAL dgu233 CCTK_ATTRIBUTE_UNUSED = -((csetemp293 + csetemp294 + \n+ csetemp295)*gu13) - (csetemp285 + csetemp296 + csetemp297)*gu23 - \n+ (csetemp298 + csetemp299 + csetemp300)*gu33;\n+ \n+ CCTK_REAL dgu333 CCTK_ATTRIBUTE_UNUSED = -(gu13*(dg113*gu13 + \n+ dg123*gu23 + dg133*gu33)) - gu23*(dg123*gu13 + dg223*gu23 + dg233*gu33) \n+ - gu33*(csetemp286 + csetemp297 + dg333*gu33);\n+ \n+ CCTK_REAL dtbetal1 CCTK_ATTRIBUTE_UNUSED = dg4010;\n+ \n+ CCTK_REAL dtbetal2 CCTK_ATTRIBUTE_UNUSED = dg4020;\n+ \n+ CCTK_REAL dtbetal3 CCTK_ATTRIBUTE_UNUSED = dg4030;\n+ \n+ CCTK_REAL dbetal11 CCTK_ATTRIBUTE_UNUSED = dg4011;\n+ \n+ CCTK_REAL dbetal12 CCTK_ATTRIBUTE_UNUSED = dg4012;\n+ \n+ CCTK_REAL dbetal13 CCTK_ATTRIBUTE_UNUSED = dg4013;\n+ \n+ CCTK_REAL dbetal21 CCTK_ATTRIBUTE_UNUSED = dg4021;\n+ \n+ CCTK_REAL dbetal22 CCTK_ATTRIBUTE_UNUSED = dg4022;\n+ \n+ CCTK_REAL dbetal23 CCTK_ATTRIBUTE_UNUSED = dg4023;\n+ \n+ CCTK_REAL dbetal31 CCTK_ATTRIBUTE_UNUSED = dg4031;\n+ \n+ CCTK_REAL dbetal32 CCTK_ATTRIBUTE_UNUSED = dg4032;\n+ \n+ CCTK_REAL dbetal33 CCTK_ATTRIBUTE_UNUSED = dg4033;\n+ \n+ CCTK_REAL dtbetaerr1L CCTK_ATTRIBUTE_UNUSED = dtbetaxL - betal1*dtgu11 \n+ - betal2*dtgu12 - betal3*dtgu13 - dtbetal1*gu11 - dtbetal2*gu12 - \n+ dtbetal3*gu13;\n+ \n+ CCTK_REAL dtbetaerr2L CCTK_ATTRIBUTE_UNUSED = dtbetayL - betal1*dtgu12 \n+ - betal2*dtgu22 - betal3*dtgu23 - dtbetal1*gu12 - dtbetal2*gu22 - \n+ dtbetal3*gu23;\n+ \n+ CCTK_REAL dtbetaerr3L CCTK_ATTRIBUTE_UNUSED = dtbetazL - betal1*dtgu13 \n+ - betal2*dtgu23 - betal3*dtgu33 - dtbetal1*gu13 - dtbetal2*gu23 - \n+ dtbetal3*gu33;\n+ \n+ CCTK_REAL dbeta11 CCTK_ATTRIBUTE_UNUSED = betal1*dgu111 + \n+ betal2*dgu121 + betal3*dgu131 + dbetal11*gu11 + dbetal21*gu12 + \n+ dbetal31*gu13;\n+ \n+ CCTK_REAL dbeta21 CCTK_ATTRIBUTE_UNUSED = betal1*dgu121 + \n+ betal2*dgu221 + betal3*dgu231 + dbetal11*gu12 + dbetal21*gu22 + \n+ dbetal31*gu23;\n+ \n+ CCTK_REAL dbeta31 CCTK_ATTRIBUTE_UNUSED = betal1*dgu131 + \n+ betal2*dgu231 + betal3*dgu331 + dbetal11*gu13 + dbetal21*gu23 + \n+ dbetal31*gu33;\n+ \n+ CCTK_REAL dbeta12 CCTK_ATTRIBUTE_UNUSED = betal1*dgu112 + \n+ betal2*dgu122 + betal3*dgu132 + dbetal12*gu11 + dbetal22*gu12 + \n+ dbetal32*gu13;\n+ \n+ CCTK_REAL dbeta22 CCTK_ATTRIBUTE_UNUSED = betal1*dgu122 + \n+ betal2*dgu222 + betal3*dgu232 + dbetal12*gu12 + dbetal22*gu22 + \n+ dbetal32*gu23;\n+ \n+ CCTK_REAL dbeta32 CCTK_ATTRIBUTE_UNUSED = betal1*dgu132 + \n+ betal2*dgu232 + betal3*dgu332 + dbetal12*gu13 + dbetal22*gu23 + \n+ dbetal32*gu33;\n+ \n+ CCTK_REAL dbeta13 CCTK_ATTRIBUTE_UNUSED = betal1*dgu113 + \n+ betal2*dgu123 + betal3*dgu133 + dbetal13*gu11 + dbetal23*gu12 + \n+ dbetal33*gu13;\n+ \n+ CCTK_REAL dbeta23 CCTK_ATTRIBUTE_UNUSED = betal1*dgu123 + \n+ betal2*dgu223 + betal3*dgu233 + dbetal13*gu12 + dbetal23*gu22 + \n+ dbetal33*gu23;\n+ \n+ CCTK_REAL dbeta33 CCTK_ATTRIBUTE_UNUSED = betal1*dgu133 + \n+ betal2*dgu233 + betal3*dgu333 + dbetal13*gu13 + dbetal23*gu23 + \n+ dbetal33*gu33;\n+ \n+ CCTK_REAL dtbetasq CCTK_ATTRIBUTE_UNUSED = dtbetaxL*betal1 + \n+ dtbetayL*betal2 + dtbetazL*betal3 + betaxL*dtbetal1 + betayL*dtbetal2 + \n+ betazL*dtbetal3;\n+ \n+ CCTK_REAL csetemp301 CCTK_ATTRIBUTE_UNUSED = INV(alpL);\n+ \n+ CCTK_REAL dtalperrL CCTK_ATTRIBUTE_UNUSED = dtalpL + \n+ 0.5*csetemp301*(dg4000 - dtbetasq);\n+ \n+ CCTK_REAL kerr11L CCTK_ATTRIBUTE_UNUSED = kxxL - \n+ 0.5*csetemp301*(2*(gxxL*dbeta11 + gxyL*dbeta21 + gxzL*dbeta31) + \n+ betaxL*dg111 + betayL*dg112 + betazL*dg113 - dtg11);\n+ \n+ CCTK_REAL kerr12L CCTK_ATTRIBUTE_UNUSED = kxyL - \n+ 0.5*csetemp301*(gxxL*dbeta12 + gyyL*dbeta21 + gxyL*(dbeta11 + dbeta22) \n+ + gyzL*dbeta31 + gxzL*dbeta32 + betaxL*dg121 + betayL*dg122 + \n+ betazL*dg123 - dtg12);\n+ \n+ CCTK_REAL kerr13L CCTK_ATTRIBUTE_UNUSED = kxzL - \n+ 0.5*csetemp301*(gxxL*dbeta13 + gyzL*dbeta21 + gxyL*dbeta23 + \n+ gzzL*dbeta31 + gxzL*(dbeta11 + dbeta33) + betaxL*dg131 + betayL*dg132 + \n+ betazL*dg133 - dtg13);\n+ \n+ CCTK_REAL kerr22L CCTK_ATTRIBUTE_UNUSED = kyyL - \n+ 0.5*csetemp301*(2*(gxyL*dbeta12 + gyyL*dbeta22 + gyzL*dbeta32) + \n+ betaxL*dg221 + betayL*dg222 + betazL*dg223 - dtg22);\n+ \n+ CCTK_REAL kerr23L CCTK_ATTRIBUTE_UNUSED = kyzL - \n+ 0.5*csetemp301*(gxzL*dbeta12 + gxyL*dbeta13 + gyyL*dbeta23 + \n+ gzzL*dbeta32 + gyzL*(dbeta22 + dbeta33) + betaxL*dg231 + betayL*dg232 + \n+ betazL*dg233 - dtg23);\n+ \n+ CCTK_REAL kerr33L CCTK_ATTRIBUTE_UNUSED = kzzL - \n+ 0.5*csetemp301*(2*(gxzL*dbeta13 + gyzL*dbeta23 + gzzL*dbeta33) + \n+ betaxL*dg331 + betayL*dg332 + betazL*dg333 - dtg33);\n+ /* Copy local copies back to grid functions */\n+ alperr[index] = alperrL;\n+ betaerr1[index] = betaerr1L;\n+ betaerr2[index] = betaerr2L;\n+ betaerr3[index] = betaerr3L;\n+ dtalperr[index] = dtalperrL;\n+ dtbetaerr1[index] = dtbetaerr1L;\n+ dtbetaerr2[index] = dtbetaerr2L;\n+ dtbetaerr3[index] = dtbetaerr3L;\n+ gerr11[index] = gerr11L;\n+ gerr12[index] = gerr12L;\n+ gerr13[index] = gerr13L;\n+ gerr22[index] = gerr22L;\n+ gerr23[index] = gerr23L;\n+ gerr33[index] = gerr33L;\n+ kerr11[index] = kerr11L;\n+ kerr12[index] = kerr12L;\n+ kerr13[index] = kerr13L;\n+ kerr22[index] = kerr22L;\n+ kerr23[index] = kerr23L;\n+ kerr33[index] = kerr33L;\n+ }\n+ CCTK_ENDLOOP3(ModifiedSchwarzschildBL_error);\n+}\n+extern \"C\" void ModifiedSchwarzschildBL_error(CCTK_ARGUMENTS)\n+{\n+ DECLARE_CCTK_ARGUMENTS;\n+ DECLARE_CCTK_PARAMETERS;\n+ \n+ if (verbose > 1)\n+ {\n+ CCTK_VInfo(CCTK_THORNSTRING,\"Entering ModifiedSchwarzschildBL_error_Body\");\n+ }\n+ if (cctk_iteration % ModifiedSchwarzschildBL_error_calc_every != ModifiedSchwarzschildBL_error_calc_offset)\n+ {\n+ return;\n+ }\n+ \n+ const char* const groups[] = {\n+ \"admbase::curv\",\n+ \"admbase::dtlapse\",\n+ \"admbase::dtshift\",\n+ \"admbase::lapse\",\n+ \"admbase::metric\",\n+ \"admbase::shift\",\n+ \"ModifiedSchwarzschildBL::curv_error\",\n+ \"ModifiedSchwarzschildBL::dtlapse_error\",\n+ \"ModifiedSchwarzschildBL::dtshift_error\",\n+ \"grid::coordinates\",\n+ \"ModifiedSchwarzschildBL::lapse_error\",\n+ \"ModifiedSchwarzschildBL::metric_error\",\n+ \"ModifiedSchwarzschildBL::shift_error\"};\n+ AssertGroupStorage(cctkGH, \"ModifiedSchwarzschildBL_error\", 13, groups);\n+ \n+ \n+ LoopOverEverything(cctkGH, ModifiedSchwarzschildBL_error_Body);\n+ if (verbose > 1)\n+ {\n+ CCTK_VInfo(CCTK_THORNSTRING,\"Leaving ModifiedSchwarzschildBL_error_Body\");\n+ }\n+}\n+\n+} // namespace ModifiedSchwarzschildBL"}, "test": {"test_patch": "diff --git a/all_tests.txt b/all_tests.txt\nnew file mode 100644\nindex 0000000..0000000\n--- /dev/null\n+++ b/all_tests.txt\n@@ -0,0 +1,7 @@\n+GaugeWave\n+KS-tilted-EE\n+KerrSchild\n+Minkowski\n+ModifiedSchwarzschildBL\n+ShiftedGaugeWave\n+Vaidya2", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}29{"question_id": "MSB_einsteintoolkit_Cactus_pr35", "question_type": "multi_swe_bench", "description": "Add missing ShiftedGaugeWave_error.cc in EinsteinExact/ShiftedGaugeWave (einsteintoolkit/Cactus#35)", "content": {"org": "einsteintoolkit", "repo": "Cactus", "pr_number": 35, "issue_title": "Add missing ShiftedGaugeWave_error.cc in EinsteinExact/ShiftedGaugeWave", "issue_body": "This PR adds the missing source file ShiftedGaugeWave_error.cc to complete the EinsteinExact/ShiftedGaugeWave thorn implementation.", "base_commit": "HEAD", "resolved_issues": [{"number": 35, "title": "Implement the full functionality of ShiftedGaugeWave", "body": "Please implement the full functionality of `ShiftedGaugeWave` by finishing the code in `ShiftedGaugeWave_error.cc`.\n\n## Thorn Information:\n- Name: ShiftedGaugeWave\n- Target file: ShiftedGaugeWave_error.cc\n\n## Interface Definition in interface.ccl:\n\n## Schedule Definition in schedule.ccl:\n\n## Parameters Definition in param.ccl:\n\n## Configuration Definition in configuration.ccl:\n\n## Documentation Context in readme.md and doc/documentation.tex\n\n## Related Code Context in src folder\n\n"}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/einsteintoolkit_m_cactus:pr-35", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/arrangements/EinsteinExact/ShiftedGaugeWave/src/ShiftedGaugeWave_error.cc b/arrangements/EinsteinExact/ShiftedGaugeWave/src/ShiftedGaugeWave_error.cc\nnew file mode 100644\nindex 0000000..0000000\n--- /dev/null\n+++ b/arrangements/EinsteinExact/ShiftedGaugeWave/src/ShiftedGaugeWave_error.cc\n@@ -0,0 +1,2083 @@\n+/* File produced by Kranc */\n+\n+#define KRANC_C\n+\n+#include <algorithm>\n+#include <assert.h>\n+#include <math.h>\n+#include <stdio.h>\n+#include <stdlib.h>\n+#include <string.h>\n+#include \"cctk.h\"\n+#include \"cctk_Arguments.h\"\n+#include \"cctk_Parameters.h\"\n+#include \"Kranc.hh\"\n+#include \"Differencing.h\"\n+#include \"loopcontrol.h\"\n+\n+/* Define macros used in calculations */\n+#define INITVALUE (42)\n+#define INV(x) ((CCTK_REAL)1.0 / (x))\n+#define SQR(x) ((x) * (x))\n+#define CUB(x) ((x) * SQR(x))\n+#define QAD(x) (SQR(SQR(x)))\n+\n+namespace ShiftedGaugeWave {\n+\n+\n+static void ShiftedGaugeWave_error_Body(const cGH* restrict const cctkGH, const int dir, const int face, const CCTK_REAL normal[3], const CCTK_REAL tangentA[3], const CCTK_REAL tangentB[3], const int imin[3], const int imax[3], const int n_subblock_gfs, CCTK_REAL* restrict const subblock_gfs[])\n+{\n+ DECLARE_CCTK_ARGUMENTS;\n+ DECLARE_CCTK_PARAMETERS;\n+ \n+ /* Include user-supplied include files */\n+ /* Initialise finite differencing variables */\n+ const ptrdiff_t di CCTK_ATTRIBUTE_UNUSED = 1;\n+ const ptrdiff_t dj CCTK_ATTRIBUTE_UNUSED = CCTK_GFINDEX3D(cctkGH,0,1,0) - CCTK_GFINDEX3D(cctkGH,0,0,0);\n+ const ptrdiff_t dk CCTK_ATTRIBUTE_UNUSED = CCTK_GFINDEX3D(cctkGH,0,0,1) - CCTK_GFINDEX3D(cctkGH,0,0,0);\n+ const ptrdiff_t cdi CCTK_ATTRIBUTE_UNUSED = sizeof(CCTK_REAL) * di;\n+ const ptrdiff_t cdj CCTK_ATTRIBUTE_UNUSED = sizeof(CCTK_REAL) * dj;\n+ const ptrdiff_t cdk CCTK_ATTRIBUTE_UNUSED = sizeof(CCTK_REAL) * dk;\n+ const ptrdiff_t cctkLbnd1 CCTK_ATTRIBUTE_UNUSED = cctk_lbnd[0];\n+ const ptrdiff_t cctkLbnd2 CCTK_ATTRIBUTE_UNUSED = cctk_lbnd[1];\n+ const ptrdiff_t cctkLbnd3 CCTK_ATTRIBUTE_UNUSED = cctk_lbnd[2];\n+ const CCTK_REAL t CCTK_ATTRIBUTE_UNUSED = ToReal(cctk_time);\n+ const CCTK_REAL cctkOriginSpace1 CCTK_ATTRIBUTE_UNUSED = ToReal(CCTK_ORIGIN_SPACE(0));\n+ const CCTK_REAL cctkOriginSpace2 CCTK_ATTRIBUTE_UNUSED = ToReal(CCTK_ORIGIN_SPACE(1));\n+ const CCTK_REAL cctkOriginSpace3 CCTK_ATTRIBUTE_UNUSED = ToReal(CCTK_ORIGIN_SPACE(2));\n+ const CCTK_REAL dt CCTK_ATTRIBUTE_UNUSED = ToReal(CCTK_DELTA_TIME);\n+ const CCTK_REAL dx CCTK_ATTRIBUTE_UNUSED = ToReal(CCTK_DELTA_SPACE(0));\n+ const CCTK_REAL dy CCTK_ATTRIBUTE_UNUSED = ToReal(CCTK_DELTA_SPACE(1));\n+ const CCTK_REAL dz CCTK_ATTRIBUTE_UNUSED = ToReal(CCTK_DELTA_SPACE(2));\n+ const CCTK_REAL dxi CCTK_ATTRIBUTE_UNUSED = INV(dx);\n+ const CCTK_REAL dyi CCTK_ATTRIBUTE_UNUSED = INV(dy);\n+ const CCTK_REAL dzi CCTK_ATTRIBUTE_UNUSED = INV(dz);\n+ const CCTK_REAL khalf CCTK_ATTRIBUTE_UNUSED = 0.5;\n+ const CCTK_REAL kthird CCTK_ATTRIBUTE_UNUSED = \n+ 0.333333333333333333333333333333;\n+ const CCTK_REAL ktwothird CCTK_ATTRIBUTE_UNUSED = \n+ 0.666666666666666666666666666667;\n+ const CCTK_REAL kfourthird CCTK_ATTRIBUTE_UNUSED = \n+ 1.33333333333333333333333333333;\n+ const CCTK_REAL hdxi CCTK_ATTRIBUTE_UNUSED = 0.5*dxi;\n+ const CCTK_REAL hdyi CCTK_ATTRIBUTE_UNUSED = 0.5*dyi;\n+ const CCTK_REAL hdzi CCTK_ATTRIBUTE_UNUSED = 0.5*dzi;\n+ /* Initialize predefined quantities */\n+ /* Assign local copies of arrays functions */\n+ \n+ \n+ /* Calculate temporaries and arrays functions */\n+ /* Copy local copies back to grid functions */\n+ /* Loop over the grid points */\n+ const int imin0=imin[0];\n+ const int imin1=imin[1];\n+ const int imin2=imin[2];\n+ const int imax0=imax[0];\n+ const int imax1=imax[1];\n+ const int imax2=imax[2];\n+ #pragma omp parallel\n+ CCTK_LOOP3(ShiftedGaugeWave_error,\n+ i,j,k, imin0,imin1,imin2, imax0,imax1,imax2,\n+ cctk_ash[0],cctk_ash[1],cctk_ash[2])\n+ {\n+ const ptrdiff_t index CCTK_ATTRIBUTE_UNUSED = di*i + dj*j + dk*k;\n+ /* Assign local copies of grid functions */\n+ \n+ CCTK_REAL alpL CCTK_ATTRIBUTE_UNUSED = alp[index];\n+ CCTK_REAL betaxL CCTK_ATTRIBUTE_UNUSED = betax[index];\n+ CCTK_REAL betayL CCTK_ATTRIBUTE_UNUSED = betay[index];\n+ CCTK_REAL betazL CCTK_ATTRIBUTE_UNUSED = betaz[index];\n+ CCTK_REAL dtalpL CCTK_ATTRIBUTE_UNUSED = dtalp[index];\n+ CCTK_REAL dtbetaxL CCTK_ATTRIBUTE_UNUSED = dtbetax[index];\n+ CCTK_REAL dtbetayL CCTK_ATTRIBUTE_UNUSED = dtbetay[index];\n+ CCTK_REAL dtbetazL CCTK_ATTRIBUTE_UNUSED = dtbetaz[index];\n+ CCTK_REAL gxxL CCTK_ATTRIBUTE_UNUSED = gxx[index];\n+ CCTK_REAL gxyL CCTK_ATTRIBUTE_UNUSED = gxy[index];\n+ CCTK_REAL gxzL CCTK_ATTRIBUTE_UNUSED = gxz[index];\n+ CCTK_REAL gyyL CCTK_ATTRIBUTE_UNUSED = gyy[index];\n+ CCTK_REAL gyzL CCTK_ATTRIBUTE_UNUSED = gyz[index];\n+ CCTK_REAL gzzL CCTK_ATTRIBUTE_UNUSED = gzz[index];\n+ CCTK_REAL kxxL CCTK_ATTRIBUTE_UNUSED = kxx[index];\n+ CCTK_REAL kxyL CCTK_ATTRIBUTE_UNUSED = kxy[index];\n+ CCTK_REAL kxzL CCTK_ATTRIBUTE_UNUSED = kxz[index];\n+ CCTK_REAL kyyL CCTK_ATTRIBUTE_UNUSED = kyy[index];\n+ CCTK_REAL kyzL CCTK_ATTRIBUTE_UNUSED = kyz[index];\n+ CCTK_REAL kzzL CCTK_ATTRIBUTE_UNUSED = kzz[index];\n+ CCTK_REAL xL CCTK_ATTRIBUTE_UNUSED = x[index];\n+ CCTK_REAL yL CCTK_ATTRIBUTE_UNUSED = y[index];\n+ CCTK_REAL zL CCTK_ATTRIBUTE_UNUSED = z[index];\n+ \n+ /* Include user supplied include files */\n+ /* Precompute derivatives */\n+ /* Calculate temporaries and grid functions */\n+ CCTK_REAL xform1L00 CCTK_ATTRIBUTE_UNUSED = 1;\n+ \n+ CCTK_REAL xform1L01 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL xform1L02 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL xform1L03 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL xform1L10 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL csetemp0 CCTK_ATTRIBUTE_UNUSED = cos(ToReal(phi));\n+ \n+ CCTK_REAL csetemp1 CCTK_ATTRIBUTE_UNUSED = cos(ToReal(psi));\n+ \n+ CCTK_REAL csetemp2 CCTK_ATTRIBUTE_UNUSED = cos(ToReal(theta));\n+ \n+ CCTK_REAL csetemp3 CCTK_ATTRIBUTE_UNUSED = sin(ToReal(phi));\n+ \n+ CCTK_REAL csetemp4 CCTK_ATTRIBUTE_UNUSED = sin(ToReal(psi));\n+ \n+ CCTK_REAL xform1L11 CCTK_ATTRIBUTE_UNUSED = csetemp0*csetemp1 - \n+ csetemp2*csetemp3*csetemp4;\n+ \n+ CCTK_REAL xform1L12 CCTK_ATTRIBUTE_UNUSED = csetemp1*csetemp3 + \n+ csetemp0*csetemp2*csetemp4;\n+ \n+ CCTK_REAL csetemp5 CCTK_ATTRIBUTE_UNUSED = sin(ToReal(theta));\n+ \n+ CCTK_REAL xform1L13 CCTK_ATTRIBUTE_UNUSED = csetemp4*csetemp5;\n+ \n+ CCTK_REAL xform1L20 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL xform1L21 CCTK_ATTRIBUTE_UNUSED = \n+ -(csetemp1*csetemp2*csetemp3) - csetemp0*csetemp4;\n+ \n+ CCTK_REAL xform1L22 CCTK_ATTRIBUTE_UNUSED = csetemp0*csetemp1*csetemp2 \n+ - csetemp3*csetemp4;\n+ \n+ CCTK_REAL xform1L23 CCTK_ATTRIBUTE_UNUSED = csetemp1*csetemp5;\n+ \n+ CCTK_REAL xform1L30 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL xform1L31 CCTK_ATTRIBUTE_UNUSED = csetemp3*csetemp5;\n+ \n+ CCTK_REAL xform1L32 CCTK_ATTRIBUTE_UNUSED = -(csetemp0*csetemp5);\n+ \n+ CCTK_REAL xform1L33 CCTK_ATTRIBUTE_UNUSED = csetemp2;\n+ \n+ CCTK_REAL csetemp6 CCTK_ATTRIBUTE_UNUSED = SQR(ToReal(boostx));\n+ \n+ CCTK_REAL csetemp7 CCTK_ATTRIBUTE_UNUSED = SQR(ToReal(boosty));\n+ \n+ CCTK_REAL csetemp8 CCTK_ATTRIBUTE_UNUSED = SQR(ToReal(boostz));\n+ \n+ CCTK_REAL csetemp9 CCTK_ATTRIBUTE_UNUSED = INV(ToReal(lapsefactor));\n+ \n+ CCTK_REAL xform2L00 CCTK_ATTRIBUTE_UNUSED = csetemp9*INV((-1 + \n+ csetemp6 + csetemp7 + csetemp8)*(1 + sqrt(1 - csetemp6 - csetemp7 - \n+ csetemp8)))*(1 - csetemp6 - csetemp7 - csetemp8 + sqrt(1 - csetemp6 - \n+ csetemp7 - csetemp8))*(-1 + ToReal(boostx)*ToReal(shiftaddx) + \n+ ToReal(boosty)*ToReal(shiftaddy) + ToReal(boostz)*ToReal(shiftaddz));\n+ \n+ CCTK_REAL xform2L01 CCTK_ATTRIBUTE_UNUSED = csetemp9*INV((-1 + \n+ csetemp6 + csetemp7 + csetemp8)*(1 + sqrt(1 - csetemp6 - csetemp7 - \n+ csetemp8)))*(1 - csetemp6 - csetemp7 - csetemp8 + sqrt(1 - csetemp6 - \n+ csetemp7 - csetemp8))*ToReal(boostx);\n+ \n+ CCTK_REAL xform2L02 CCTK_ATTRIBUTE_UNUSED = csetemp9*INV((-1 + \n+ csetemp6 + csetemp7 + csetemp8)*(1 + sqrt(1 - csetemp6 - csetemp7 - \n+ csetemp8)))*(1 - csetemp6 - csetemp7 - csetemp8 + sqrt(1 - csetemp6 - \n+ csetemp7 - csetemp8))*ToReal(boosty);\n+ \n+ CCTK_REAL xform2L03 CCTK_ATTRIBUTE_UNUSED = csetemp9*INV((-1 + \n+ csetemp6 + csetemp7 + csetemp8)*(1 + sqrt(1 - csetemp6 - csetemp7 - \n+ csetemp8)))*(1 - csetemp6 - csetemp7 - csetemp8 + sqrt(1 - csetemp6 - \n+ csetemp7 - csetemp8))*ToReal(boostz);\n+ \n+ CCTK_REAL xform2L10 CCTK_ATTRIBUTE_UNUSED = INV((-1 + csetemp6 + \n+ csetemp7 + csetemp8)*(1 + sqrt(1 - csetemp6 - csetemp7 - \n+ csetemp8)))*((csetemp6 + (-1 + csetemp7 + csetemp8)*(1 + sqrt(1 - \n+ csetemp6 - csetemp7 - csetemp8)))*ToReal(shiftaddx) - \n+ ToReal(boostx)*(-1 + csetemp6 + csetemp7 + csetemp8 + sqrt(1 - csetemp6 \n+ - csetemp7 - csetemp8)*(-1 + ToReal(boosty)*ToReal(shiftaddy) + \n+ ToReal(boostz)*ToReal(shiftaddz))));\n+ \n+ CCTK_REAL xform2L11 CCTK_ATTRIBUTE_UNUSED = INV((-1 + csetemp6 + \n+ csetemp7 + csetemp8)*(1 + sqrt(1 - csetemp6 - csetemp7 - \n+ csetemp8)))*(csetemp6 + (-1 + csetemp7 + csetemp8)*(1 + sqrt(1 - \n+ csetemp6 - csetemp7 - csetemp8)));\n+ \n+ CCTK_REAL xform2L12 CCTK_ATTRIBUTE_UNUSED = -(INV(-1 + csetemp6 + \n+ csetemp7 + csetemp8 - sqrt(1 - csetemp6 - csetemp7 - \n+ csetemp8))*ToReal(boostx)*ToReal(boosty));\n+ \n+ CCTK_REAL xform2L13 CCTK_ATTRIBUTE_UNUSED = -(INV(-1 + csetemp6 + \n+ csetemp7 + csetemp8 - sqrt(1 - csetemp6 - csetemp7 - \n+ csetemp8))*ToReal(boostx)*ToReal(boostz));\n+ \n+ CCTK_REAL xform2L20 CCTK_ATTRIBUTE_UNUSED = INV((-1 + csetemp6 + \n+ csetemp7 + csetemp8)*(1 + sqrt(1 - csetemp6 - csetemp7 - \n+ csetemp8)))*((csetemp7 + (-1 + csetemp6 + csetemp8)*(1 + sqrt(1 - \n+ csetemp6 - csetemp7 - csetemp8)))*ToReal(shiftaddy) - \n+ ToReal(boosty)*(-1 + csetemp6 + csetemp7 + csetemp8 + sqrt(1 - csetemp6 \n+ - csetemp7 - csetemp8)*(-1 + ToReal(boostx)*ToReal(shiftaddx) + \n+ ToReal(boostz)*ToReal(shiftaddz))));\n+ \n+ CCTK_REAL xform2L21 CCTK_ATTRIBUTE_UNUSED = -(INV(-1 + csetemp6 + \n+ csetemp7 + csetemp8 - sqrt(1 - csetemp6 - csetemp7 - \n+ csetemp8))*ToReal(boostx)*ToReal(boosty));\n+ \n+ CCTK_REAL xform2L22 CCTK_ATTRIBUTE_UNUSED = INV((-1 + csetemp6 + \n+ csetemp7 + csetemp8)*(1 + sqrt(1 - csetemp6 - csetemp7 - \n+ csetemp8)))*(csetemp7 + (-1 + csetemp6 + csetemp8)*(1 + sqrt(1 - \n+ csetemp6 - csetemp7 - csetemp8)));\n+ \n+ CCTK_REAL xform2L23 CCTK_ATTRIBUTE_UNUSED = -(INV(-1 + csetemp6 + \n+ csetemp7 + csetemp8 - sqrt(1 - csetemp6 - csetemp7 - \n+ csetemp8))*ToReal(boosty)*ToReal(boostz));\n+ \n+ CCTK_REAL xform2L30 CCTK_ATTRIBUTE_UNUSED = INV((-1 + csetemp6 + \n+ csetemp7 + csetemp8)*(1 + sqrt(1 - csetemp6 - csetemp7 - \n+ csetemp8)))*(-(ToReal(boostz)*(-1 + csetemp6 + csetemp7 + csetemp8 + \n+ sqrt(1 - csetemp6 - csetemp7 - csetemp8)*(-1 + \n+ ToReal(boostx)*ToReal(shiftaddx) + ToReal(boosty)*ToReal(shiftaddy)))) \n+ + (-1 + csetemp6 + csetemp7 + csetemp8 + (-1 + csetemp6 + \n+ csetemp7)*sqrt(1 - csetemp6 - csetemp7 - csetemp8))*ToReal(shiftaddz));\n+ \n+ CCTK_REAL xform2L31 CCTK_ATTRIBUTE_UNUSED = -(INV(-1 + csetemp6 + \n+ csetemp7 + csetemp8 - sqrt(1 - csetemp6 - csetemp7 - \n+ csetemp8))*ToReal(boostx)*ToReal(boostz));\n+ \n+ CCTK_REAL xform2L32 CCTK_ATTRIBUTE_UNUSED = -(INV(-1 + csetemp6 + \n+ csetemp7 + csetemp8 - sqrt(1 - csetemp6 - csetemp7 - \n+ csetemp8))*ToReal(boosty)*ToReal(boostz));\n+ \n+ CCTK_REAL xform2L33 CCTK_ATTRIBUTE_UNUSED = INV((-1 + csetemp6 + \n+ csetemp7 + csetemp8)*(1 + sqrt(1 - csetemp6 - csetemp7 - \n+ csetemp8)))*(-1 + csetemp6 + csetemp7 + csetemp8 + (-1 + csetemp6 + \n+ csetemp7)*sqrt(1 - csetemp6 - csetemp7 - csetemp8));\n+ \n+ CCTK_REAL xformL00 CCTK_ATTRIBUTE_UNUSED = xform1L00*xform2L00 + \n+ xform1L01*xform2L10 + xform1L02*xform2L20 + xform1L03*xform2L30;\n+ \n+ CCTK_REAL xformL01 CCTK_ATTRIBUTE_UNUSED = xform1L00*xform2L01 + \n+ xform1L01*xform2L11 + xform1L02*xform2L21 + xform1L03*xform2L31;\n+ \n+ CCTK_REAL xformL02 CCTK_ATTRIBUTE_UNUSED = xform1L00*xform2L02 + \n+ xform1L01*xform2L12 + xform1L02*xform2L22 + xform1L03*xform2L32;\n+ \n+ CCTK_REAL xformL03 CCTK_ATTRIBUTE_UNUSED = xform1L00*xform2L03 + \n+ xform1L01*xform2L13 + xform1L02*xform2L23 + xform1L03*xform2L33;\n+ \n+ CCTK_REAL xformL10 CCTK_ATTRIBUTE_UNUSED = xform1L10*xform2L00 + \n+ xform1L11*xform2L10 + xform1L12*xform2L20 + xform1L13*xform2L30;\n+ \n+ CCTK_REAL xformL11 CCTK_ATTRIBUTE_UNUSED = xform1L10*xform2L01 + \n+ xform1L11*xform2L11 + xform1L12*xform2L21 + xform1L13*xform2L31;\n+ \n+ CCTK_REAL xformL12 CCTK_ATTRIBUTE_UNUSED = xform1L10*xform2L02 + \n+ xform1L11*xform2L12 + xform1L12*xform2L22 + xform1L13*xform2L32;\n+ \n+ CCTK_REAL xformL13 CCTK_ATTRIBUTE_UNUSED = xform1L10*xform2L03 + \n+ xform1L11*xform2L13 + xform1L12*xform2L23 + xform1L13*xform2L33;\n+ \n+ CCTK_REAL xformL20 CCTK_ATTRIBUTE_UNUSED = xform1L20*xform2L00 + \n+ xform1L21*xform2L10 + xform1L22*xform2L20 + xform1L23*xform2L30;\n+ \n+ CCTK_REAL xformL21 CCTK_ATTRIBUTE_UNUSED = xform1L20*xform2L01 + \n+ xform1L21*xform2L11 + xform1L22*xform2L21 + xform1L23*xform2L31;\n+ \n+ CCTK_REAL xformL22 CCTK_ATTRIBUTE_UNUSED = xform1L20*xform2L02 + \n+ xform1L21*xform2L12 + xform1L22*xform2L22 + xform1L23*xform2L32;\n+ \n+ CCTK_REAL xformL23 CCTK_ATTRIBUTE_UNUSED = xform1L20*xform2L03 + \n+ xform1L21*xform2L13 + xform1L22*xform2L23 + xform1L23*xform2L33;\n+ \n+ CCTK_REAL xformL30 CCTK_ATTRIBUTE_UNUSED = xform1L30*xform2L00 + \n+ xform1L31*xform2L10 + xform1L32*xform2L20 + xform1L33*xform2L30;\n+ \n+ CCTK_REAL xformL31 CCTK_ATTRIBUTE_UNUSED = xform1L30*xform2L01 + \n+ xform1L31*xform2L11 + xform1L32*xform2L21 + xform1L33*xform2L31;\n+ \n+ CCTK_REAL xformL32 CCTK_ATTRIBUTE_UNUSED = xform1L30*xform2L02 + \n+ xform1L31*xform2L12 + xform1L32*xform2L22 + xform1L33*xform2L32;\n+ \n+ CCTK_REAL xformL33 CCTK_ATTRIBUTE_UNUSED = xform1L30*xform2L03 + \n+ xform1L31*xform2L13 + xform1L32*xform2L23 + xform1L33*xform2L33;\n+ \n+ CCTK_REAL xx0 CCTK_ATTRIBUTE_UNUSED = t - ToReal(timeoffset);\n+ \n+ CCTK_REAL xx1 CCTK_ATTRIBUTE_UNUSED = xL - ToReal(positionx);\n+ \n+ CCTK_REAL xx2 CCTK_ATTRIBUTE_UNUSED = yL - ToReal(positiony);\n+ \n+ CCTK_REAL xx3 CCTK_ATTRIBUTE_UNUSED = zL - ToReal(positionz);\n+ \n+ CCTK_REAL txx0 CCTK_ATTRIBUTE_UNUSED = xformL00*xx0 + xformL01*xx1 + \n+ xformL02*xx2 + xformL03*xx3;\n+ \n+ CCTK_REAL txx1 CCTK_ATTRIBUTE_UNUSED = xformL10*xx0 + xformL11*xx1 + \n+ xformL12*xx2 + xformL13*xx3;\n+ \n+ CCTK_REAL T CCTK_ATTRIBUTE_UNUSED = txx0;\n+ \n+ CCTK_REAL X CCTK_ATTRIBUTE_UNUSED = txx1;\n+ \n+ CCTK_REAL csetemp10 CCTK_ATTRIBUTE_UNUSED = -T + X;\n+ \n+ CCTK_REAL csetemp11 CCTK_ATTRIBUTE_UNUSED = INV(ToReal(period));\n+ \n+ CCTK_REAL tg400 CCTK_ATTRIBUTE_UNUSED = -1 + \n+ sin(2*csetemp10*csetemp11*Pi)*ToReal(amp);\n+ \n+ CCTK_REAL tg401 CCTK_ATTRIBUTE_UNUSED = \n+ -(sin(2*csetemp10*csetemp11*Pi)*ToReal(amp));\n+ \n+ CCTK_REAL tg402 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tg403 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tg411 CCTK_ATTRIBUTE_UNUSED = 1 + \n+ sin(2*csetemp10*csetemp11*Pi)*ToReal(amp);\n+ \n+ CCTK_REAL tg412 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tg413 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tg422 CCTK_ATTRIBUTE_UNUSED = 1;\n+ \n+ CCTK_REAL tg423 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tg433 CCTK_ATTRIBUTE_UNUSED = 1;\n+ \n+ CCTK_REAL tdg4000 CCTK_ATTRIBUTE_UNUSED = \n+ -2*csetemp11*Pi*cos(2*csetemp10*csetemp11*Pi)*ToReal(amp);\n+ \n+ CCTK_REAL tdg4001 CCTK_ATTRIBUTE_UNUSED = \n+ 2*csetemp11*Pi*cos(2*csetemp10*csetemp11*Pi)*ToReal(amp);\n+ \n+ CCTK_REAL tdg4002 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tdg4003 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tdg4010 CCTK_ATTRIBUTE_UNUSED = \n+ 2*csetemp11*Pi*cos(2*csetemp10*csetemp11*Pi)*ToReal(amp);\n+ \n+ CCTK_REAL tdg4011 CCTK_ATTRIBUTE_UNUSED = \n+ -2*csetemp11*Pi*cos(2*csetemp10*csetemp11*Pi)*ToReal(amp);\n+ \n+ CCTK_REAL tdg4012 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tdg4013 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tdg4020 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tdg4021 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tdg4022 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tdg4023 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tdg4030 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tdg4031 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tdg4032 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tdg4033 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tdg4110 CCTK_ATTRIBUTE_UNUSED = \n+ -2*csetemp11*Pi*cos(2*csetemp10*csetemp11*Pi)*ToReal(amp);\n+ \n+ CCTK_REAL tdg4111 CCTK_ATTRIBUTE_UNUSED = \n+ 2*csetemp11*Pi*cos(2*csetemp10*csetemp11*Pi)*ToReal(amp);\n+ \n+ CCTK_REAL tdg4112 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tdg4113 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tdg4120 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tdg4121 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tdg4122 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tdg4123 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tdg4130 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tdg4131 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tdg4132 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tdg4133 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tdg4220 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tdg4221 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tdg4222 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tdg4223 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tdg4230 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tdg4231 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tdg4232 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tdg4233 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tdg4330 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tdg4331 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tdg4332 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL tdg4333 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL g400 CCTK_ATTRIBUTE_UNUSED = 2*(tg423*xformL20*xformL30 + \n+ xformL00*(tg401*xformL10 + tg402*xformL20 + tg403*xformL30) + \n+ xformL10*(tg412*xformL20 + tg413*xformL30)) + tg400*SQR(xformL00) + \n+ tg411*SQR(xformL10) + tg422*SQR(xformL20) + tg433*SQR(xformL30);\n+ \n+ CCTK_REAL csetemp12 CCTK_ATTRIBUTE_UNUSED = tg400*xformL01;\n+ \n+ CCTK_REAL csetemp13 CCTK_ATTRIBUTE_UNUSED = tg401*xformL11;\n+ \n+ CCTK_REAL csetemp14 CCTK_ATTRIBUTE_UNUSED = tg402*xformL21;\n+ \n+ CCTK_REAL csetemp15 CCTK_ATTRIBUTE_UNUSED = tg403*xformL31;\n+ \n+ CCTK_REAL csetemp16 CCTK_ATTRIBUTE_UNUSED = tg401*xformL01;\n+ \n+ CCTK_REAL csetemp17 CCTK_ATTRIBUTE_UNUSED = tg411*xformL11;\n+ \n+ CCTK_REAL csetemp18 CCTK_ATTRIBUTE_UNUSED = tg412*xformL21;\n+ \n+ CCTK_REAL csetemp19 CCTK_ATTRIBUTE_UNUSED = tg413*xformL31;\n+ \n+ CCTK_REAL csetemp20 CCTK_ATTRIBUTE_UNUSED = tg402*xformL01;\n+ \n+ CCTK_REAL csetemp21 CCTK_ATTRIBUTE_UNUSED = tg412*xformL11;\n+ \n+ CCTK_REAL csetemp22 CCTK_ATTRIBUTE_UNUSED = tg422*xformL21;\n+ \n+ CCTK_REAL csetemp23 CCTK_ATTRIBUTE_UNUSED = tg423*xformL31;\n+ \n+ CCTK_REAL csetemp24 CCTK_ATTRIBUTE_UNUSED = tg403*xformL01;\n+ \n+ CCTK_REAL csetemp25 CCTK_ATTRIBUTE_UNUSED = tg413*xformL11;\n+ \n+ CCTK_REAL csetemp26 CCTK_ATTRIBUTE_UNUSED = tg423*xformL21;\n+ \n+ CCTK_REAL csetemp27 CCTK_ATTRIBUTE_UNUSED = tg433*xformL31;\n+ \n+ CCTK_REAL g401 CCTK_ATTRIBUTE_UNUSED = (csetemp12 + csetemp13 + \n+ csetemp14 + csetemp15)*xformL00 + (csetemp16 + csetemp17 + csetemp18 + \n+ csetemp19)*xformL10 + (csetemp20 + csetemp21 + csetemp22 + \n+ csetemp23)*xformL20 + (csetemp24 + csetemp25 + csetemp26 + \n+ csetemp27)*xformL30;\n+ \n+ CCTK_REAL csetemp28 CCTK_ATTRIBUTE_UNUSED = tg400*xformL02;\n+ \n+ CCTK_REAL csetemp29 CCTK_ATTRIBUTE_UNUSED = tg401*xformL12;\n+ \n+ CCTK_REAL csetemp30 CCTK_ATTRIBUTE_UNUSED = tg402*xformL22;\n+ \n+ CCTK_REAL csetemp31 CCTK_ATTRIBUTE_UNUSED = tg403*xformL32;\n+ \n+ CCTK_REAL csetemp32 CCTK_ATTRIBUTE_UNUSED = tg401*xformL02;\n+ \n+ CCTK_REAL csetemp33 CCTK_ATTRIBUTE_UNUSED = tg411*xformL12;\n+ \n+ CCTK_REAL csetemp34 CCTK_ATTRIBUTE_UNUSED = tg412*xformL22;\n+ \n+ CCTK_REAL csetemp35 CCTK_ATTRIBUTE_UNUSED = tg413*xformL32;\n+ \n+ CCTK_REAL csetemp36 CCTK_ATTRIBUTE_UNUSED = tg402*xformL02;\n+ \n+ CCTK_REAL csetemp37 CCTK_ATTRIBUTE_UNUSED = tg412*xformL12;\n+ \n+ CCTK_REAL csetemp38 CCTK_ATTRIBUTE_UNUSED = tg422*xformL22;\n+ \n+ CCTK_REAL csetemp39 CCTK_ATTRIBUTE_UNUSED = tg423*xformL32;\n+ \n+ CCTK_REAL csetemp40 CCTK_ATTRIBUTE_UNUSED = tg403*xformL02;\n+ \n+ CCTK_REAL csetemp41 CCTK_ATTRIBUTE_UNUSED = tg413*xformL12;\n+ \n+ CCTK_REAL csetemp42 CCTK_ATTRIBUTE_UNUSED = tg423*xformL22;\n+ \n+ CCTK_REAL csetemp43 CCTK_ATTRIBUTE_UNUSED = tg433*xformL32;\n+ \n+ CCTK_REAL g402 CCTK_ATTRIBUTE_UNUSED = (csetemp28 + csetemp29 + \n+ csetemp30 + csetemp31)*xformL00 + (csetemp32 + csetemp33 + csetemp34 + \n+ csetemp35)*xformL10 + (csetemp36 + csetemp37 + csetemp38 + \n+ csetemp39)*xformL20 + (csetemp40 + csetemp41 + csetemp42 + \n+ csetemp43)*xformL30;\n+ \n+ CCTK_REAL csetemp44 CCTK_ATTRIBUTE_UNUSED = tg400*xformL03;\n+ \n+ CCTK_REAL csetemp45 CCTK_ATTRIBUTE_UNUSED = tg401*xformL13;\n+ \n+ CCTK_REAL csetemp46 CCTK_ATTRIBUTE_UNUSED = tg402*xformL23;\n+ \n+ CCTK_REAL csetemp47 CCTK_ATTRIBUTE_UNUSED = tg403*xformL33;\n+ \n+ CCTK_REAL csetemp48 CCTK_ATTRIBUTE_UNUSED = tg401*xformL03;\n+ \n+ CCTK_REAL csetemp49 CCTK_ATTRIBUTE_UNUSED = tg411*xformL13;\n+ \n+ CCTK_REAL csetemp50 CCTK_ATTRIBUTE_UNUSED = tg412*xformL23;\n+ \n+ CCTK_REAL csetemp51 CCTK_ATTRIBUTE_UNUSED = tg413*xformL33;\n+ \n+ CCTK_REAL csetemp52 CCTK_ATTRIBUTE_UNUSED = tg402*xformL03;\n+ \n+ CCTK_REAL csetemp53 CCTK_ATTRIBUTE_UNUSED = tg412*xformL13;\n+ \n+ CCTK_REAL csetemp54 CCTK_ATTRIBUTE_UNUSED = tg422*xformL23;\n+ \n+ CCTK_REAL csetemp55 CCTK_ATTRIBUTE_UNUSED = tg423*xformL33;\n+ \n+ CCTK_REAL csetemp56 CCTK_ATTRIBUTE_UNUSED = tg403*xformL03;\n+ \n+ CCTK_REAL csetemp57 CCTK_ATTRIBUTE_UNUSED = tg413*xformL13;\n+ \n+ CCTK_REAL csetemp58 CCTK_ATTRIBUTE_UNUSED = tg423*xformL23;\n+ \n+ CCTK_REAL csetemp59 CCTK_ATTRIBUTE_UNUSED = tg433*xformL33;\n+ \n+ CCTK_REAL g403 CCTK_ATTRIBUTE_UNUSED = (csetemp44 + csetemp45 + \n+ csetemp46 + csetemp47)*xformL00 + (csetemp48 + csetemp49 + csetemp50 + \n+ csetemp51)*xformL10 + (csetemp52 + csetemp53 + csetemp54 + \n+ csetemp55)*xformL20 + (csetemp56 + csetemp57 + csetemp58 + \n+ csetemp59)*xformL30;\n+ \n+ CCTK_REAL g411 CCTK_ATTRIBUTE_UNUSED = (csetemp12 + csetemp13 + \n+ csetemp14 + csetemp15)*xformL01 + (csetemp16 + csetemp17 + csetemp18 + \n+ csetemp19)*xformL11 + (csetemp20 + csetemp21 + csetemp22 + \n+ csetemp23)*xformL21 + (csetemp24 + csetemp25 + csetemp26 + \n+ csetemp27)*xformL31;\n+ \n+ CCTK_REAL g412 CCTK_ATTRIBUTE_UNUSED = (csetemp28 + csetemp29 + \n+ csetemp30 + csetemp31)*xformL01 + (csetemp32 + csetemp33 + csetemp34 + \n+ csetemp35)*xformL11 + (csetemp36 + csetemp37 + csetemp38 + \n+ csetemp39)*xformL21 + (csetemp40 + csetemp41 + csetemp42 + \n+ csetemp43)*xformL31;\n+ \n+ CCTK_REAL g413 CCTK_ATTRIBUTE_UNUSED = (csetemp44 + csetemp45 + \n+ csetemp46 + csetemp47)*xformL01 + (csetemp48 + csetemp49 + csetemp50 + \n+ csetemp51)*xformL11 + (csetemp52 + csetemp53 + csetemp54 + \n+ csetemp55)*xformL21 + (csetemp56 + csetemp57 + csetemp58 + \n+ csetemp59)*xformL31;\n+ \n+ CCTK_REAL g422 CCTK_ATTRIBUTE_UNUSED = (csetemp28 + csetemp29 + \n+ csetemp30 + csetemp31)*xformL02 + (csetemp32 + csetemp33 + csetemp34 + \n+ csetemp35)*xformL12 + (csetemp36 + csetemp37 + csetemp38 + \n+ csetemp39)*xformL22 + (csetemp40 + csetemp41 + csetemp42 + \n+ csetemp43)*xformL32;\n+ \n+ CCTK_REAL g423 CCTK_ATTRIBUTE_UNUSED = (csetemp44 + csetemp45 + \n+ csetemp46 + csetemp47)*xformL02 + (csetemp48 + csetemp49 + csetemp50 + \n+ csetemp51)*xformL12 + (csetemp52 + csetemp53 + csetemp54 + \n+ csetemp55)*xformL22 + (csetemp56 + csetemp57 + csetemp58 + \n+ csetemp59)*xformL32;\n+ \n+ CCTK_REAL g433 CCTK_ATTRIBUTE_UNUSED = (csetemp44 + csetemp45 + \n+ csetemp46 + csetemp47)*xformL03 + (csetemp48 + csetemp49 + csetemp50 + \n+ csetemp51)*xformL13 + (csetemp52 + csetemp53 + csetemp54 + \n+ csetemp55)*xformL23 + (csetemp56 + csetemp57 + csetemp58 + \n+ csetemp59)*xformL33;\n+ \n+ CCTK_REAL csetemp60 CCTK_ATTRIBUTE_UNUSED = tdg4000*xformL00;\n+ \n+ CCTK_REAL csetemp61 CCTK_ATTRIBUTE_UNUSED = tdg4001*xformL10;\n+ \n+ CCTK_REAL csetemp62 CCTK_ATTRIBUTE_UNUSED = tdg4002*xformL20;\n+ \n+ CCTK_REAL csetemp63 CCTK_ATTRIBUTE_UNUSED = tdg4003*xformL30;\n+ \n+ CCTK_REAL csetemp64 CCTK_ATTRIBUTE_UNUSED = tdg4010*xformL00;\n+ \n+ CCTK_REAL csetemp65 CCTK_ATTRIBUTE_UNUSED = tdg4011*xformL10;\n+ \n+ CCTK_REAL csetemp66 CCTK_ATTRIBUTE_UNUSED = tdg4012*xformL20;\n+ \n+ CCTK_REAL csetemp67 CCTK_ATTRIBUTE_UNUSED = tdg4013*xformL30;\n+ \n+ CCTK_REAL csetemp68 CCTK_ATTRIBUTE_UNUSED = tdg4020*xformL00;\n+ \n+ CCTK_REAL csetemp69 CCTK_ATTRIBUTE_UNUSED = tdg4021*xformL10;\n+ \n+ CCTK_REAL csetemp70 CCTK_ATTRIBUTE_UNUSED = tdg4022*xformL20;\n+ \n+ CCTK_REAL csetemp71 CCTK_ATTRIBUTE_UNUSED = tdg4023*xformL30;\n+ \n+ CCTK_REAL csetemp72 CCTK_ATTRIBUTE_UNUSED = tdg4030*xformL00;\n+ \n+ CCTK_REAL csetemp73 CCTK_ATTRIBUTE_UNUSED = tdg4031*xformL10;\n+ \n+ CCTK_REAL csetemp74 CCTK_ATTRIBUTE_UNUSED = tdg4032*xformL20;\n+ \n+ CCTK_REAL csetemp75 CCTK_ATTRIBUTE_UNUSED = tdg4033*xformL30;\n+ \n+ CCTK_REAL csetemp76 CCTK_ATTRIBUTE_UNUSED = tdg4110*xformL00;\n+ \n+ CCTK_REAL csetemp77 CCTK_ATTRIBUTE_UNUSED = tdg4111*xformL10;\n+ \n+ CCTK_REAL csetemp78 CCTK_ATTRIBUTE_UNUSED = tdg4112*xformL20;\n+ \n+ CCTK_REAL csetemp79 CCTK_ATTRIBUTE_UNUSED = tdg4113*xformL30;\n+ \n+ CCTK_REAL csetemp80 CCTK_ATTRIBUTE_UNUSED = tdg4120*xformL00;\n+ \n+ CCTK_REAL csetemp81 CCTK_ATTRIBUTE_UNUSED = tdg4121*xformL10;\n+ \n+ CCTK_REAL csetemp82 CCTK_ATTRIBUTE_UNUSED = tdg4122*xformL20;\n+ \n+ CCTK_REAL csetemp83 CCTK_ATTRIBUTE_UNUSED = tdg4123*xformL30;\n+ \n+ CCTK_REAL csetemp84 CCTK_ATTRIBUTE_UNUSED = tdg4130*xformL00;\n+ \n+ CCTK_REAL csetemp85 CCTK_ATTRIBUTE_UNUSED = tdg4131*xformL10;\n+ \n+ CCTK_REAL csetemp86 CCTK_ATTRIBUTE_UNUSED = tdg4132*xformL20;\n+ \n+ CCTK_REAL csetemp87 CCTK_ATTRIBUTE_UNUSED = tdg4133*xformL30;\n+ \n+ CCTK_REAL csetemp88 CCTK_ATTRIBUTE_UNUSED = tdg4220*xformL00;\n+ \n+ CCTK_REAL csetemp89 CCTK_ATTRIBUTE_UNUSED = tdg4221*xformL10;\n+ \n+ CCTK_REAL csetemp90 CCTK_ATTRIBUTE_UNUSED = tdg4222*xformL20;\n+ \n+ CCTK_REAL csetemp91 CCTK_ATTRIBUTE_UNUSED = tdg4223*xformL30;\n+ \n+ CCTK_REAL csetemp92 CCTK_ATTRIBUTE_UNUSED = tdg4230*xformL00;\n+ \n+ CCTK_REAL csetemp93 CCTK_ATTRIBUTE_UNUSED = tdg4231*xformL10;\n+ \n+ CCTK_REAL csetemp94 CCTK_ATTRIBUTE_UNUSED = tdg4232*xformL20;\n+ \n+ CCTK_REAL csetemp95 CCTK_ATTRIBUTE_UNUSED = tdg4233*xformL30;\n+ \n+ CCTK_REAL csetemp96 CCTK_ATTRIBUTE_UNUSED = tdg4330*xformL00;\n+ \n+ CCTK_REAL csetemp97 CCTK_ATTRIBUTE_UNUSED = tdg4331*xformL10;\n+ \n+ CCTK_REAL csetemp98 CCTK_ATTRIBUTE_UNUSED = tdg4332*xformL20;\n+ \n+ CCTK_REAL csetemp99 CCTK_ATTRIBUTE_UNUSED = tdg4333*xformL30;\n+ \n+ CCTK_REAL dg4000 CCTK_ATTRIBUTE_UNUSED = xformL00*((csetemp60 + \n+ csetemp61 + csetemp62 + csetemp63)*xformL00 + (csetemp64 + csetemp65 + \n+ csetemp66 + csetemp67)*xformL10 + (csetemp68 + csetemp69 + csetemp70 + \n+ csetemp71)*xformL20 + (csetemp72 + csetemp73 + csetemp74 + \n+ csetemp75)*xformL30) + xformL10*((csetemp64 + csetemp65 + csetemp66 + \n+ csetemp67)*xformL00 + (csetemp76 + csetemp77 + csetemp78 + \n+ csetemp79)*xformL10 + (csetemp80 + csetemp81 + csetemp82 + \n+ csetemp83)*xformL20 + (csetemp84 + csetemp85 + csetemp86 + \n+ csetemp87)*xformL30) + xformL20*((csetemp68 + csetemp69 + csetemp70 + \n+ csetemp71)*xformL00 + (csetemp80 + csetemp81 + csetemp82 + \n+ csetemp83)*xformL10 + (csetemp88 + csetemp89 + csetemp90 + \n+ csetemp91)*xformL20 + (csetemp92 + csetemp93 + csetemp94 + \n+ csetemp95)*xformL30) + xformL30*((csetemp72 + csetemp73 + csetemp74 + \n+ csetemp75)*xformL00 + (csetemp84 + csetemp85 + csetemp86 + \n+ csetemp87)*xformL10 + (csetemp92 + csetemp93 + csetemp94 + \n+ csetemp95)*xformL20 + (csetemp96 + csetemp97 + csetemp98 + \n+ csetemp99)*xformL30);\n+ \n+ CCTK_REAL dg4010 CCTK_ATTRIBUTE_UNUSED = xformL00*((csetemp60 + \n+ csetemp61 + csetemp62 + csetemp63)*xformL01 + (csetemp64 + csetemp65 + \n+ csetemp66 + csetemp67)*xformL11 + (csetemp68 + csetemp69 + csetemp70 + \n+ csetemp71)*xformL21 + (csetemp72 + csetemp73 + csetemp74 + \n+ csetemp75)*xformL31) + xformL10*((csetemp64 + csetemp65 + csetemp66 + \n+ csetemp67)*xformL01 + (csetemp76 + csetemp77 + csetemp78 + \n+ csetemp79)*xformL11 + (csetemp80 + csetemp81 + csetemp82 + \n+ csetemp83)*xformL21 + (csetemp84 + csetemp85 + csetemp86 + \n+ csetemp87)*xformL31) + xformL20*((csetemp68 + csetemp69 + csetemp70 + \n+ csetemp71)*xformL01 + (csetemp80 + csetemp81 + csetemp82 + \n+ csetemp83)*xformL11 + (csetemp88 + csetemp89 + csetemp90 + \n+ csetemp91)*xformL21 + (csetemp92 + csetemp93 + csetemp94 + \n+ csetemp95)*xformL31) + xformL30*((csetemp72 + csetemp73 + csetemp74 + \n+ csetemp75)*xformL01 + (csetemp84 + csetemp85 + csetemp86 + \n+ csetemp87)*xformL11 + (csetemp92 + csetemp93 + csetemp94 + \n+ csetemp95)*xformL21 + (csetemp96 + csetemp97 + csetemp98 + \n+ csetemp99)*xformL31);\n+ \n+ CCTK_REAL csetemp100 CCTK_ATTRIBUTE_UNUSED = tdg4000*xformL01;\n+ \n+ CCTK_REAL csetemp101 CCTK_ATTRIBUTE_UNUSED = tdg4001*xformL11;\n+ \n+ CCTK_REAL csetemp102 CCTK_ATTRIBUTE_UNUSED = tdg4002*xformL21;\n+ \n+ CCTK_REAL csetemp103 CCTK_ATTRIBUTE_UNUSED = tdg4003*xformL31;\n+ \n+ CCTK_REAL csetemp104 CCTK_ATTRIBUTE_UNUSED = tdg4010*xformL01;\n+ \n+ CCTK_REAL csetemp105 CCTK_ATTRIBUTE_UNUSED = tdg4011*xformL11;\n+ \n+ CCTK_REAL csetemp106 CCTK_ATTRIBUTE_UNUSED = tdg4012*xformL21;\n+ \n+ CCTK_REAL csetemp107 CCTK_ATTRIBUTE_UNUSED = tdg4013*xformL31;\n+ \n+ CCTK_REAL csetemp108 CCTK_ATTRIBUTE_UNUSED = tdg4020*xformL01;\n+ \n+ CCTK_REAL csetemp109 CCTK_ATTRIBUTE_UNUSED = tdg4021*xformL11;\n+ \n+ CCTK_REAL csetemp110 CCTK_ATTRIBUTE_UNUSED = tdg4022*xformL21;\n+ \n+ CCTK_REAL csetemp111 CCTK_ATTRIBUTE_UNUSED = tdg4023*xformL31;\n+ \n+ CCTK_REAL csetemp112 CCTK_ATTRIBUTE_UNUSED = tdg4030*xformL01;\n+ \n+ CCTK_REAL csetemp113 CCTK_ATTRIBUTE_UNUSED = tdg4031*xformL11;\n+ \n+ CCTK_REAL csetemp114 CCTK_ATTRIBUTE_UNUSED = tdg4032*xformL21;\n+ \n+ CCTK_REAL csetemp115 CCTK_ATTRIBUTE_UNUSED = tdg4033*xformL31;\n+ \n+ CCTK_REAL csetemp116 CCTK_ATTRIBUTE_UNUSED = tdg4110*xformL01;\n+ \n+ CCTK_REAL csetemp117 CCTK_ATTRIBUTE_UNUSED = tdg4111*xformL11;\n+ \n+ CCTK_REAL csetemp118 CCTK_ATTRIBUTE_UNUSED = tdg4112*xformL21;\n+ \n+ CCTK_REAL csetemp119 CCTK_ATTRIBUTE_UNUSED = tdg4113*xformL31;\n+ \n+ CCTK_REAL csetemp120 CCTK_ATTRIBUTE_UNUSED = tdg4120*xformL01;\n+ \n+ CCTK_REAL csetemp121 CCTK_ATTRIBUTE_UNUSED = tdg4121*xformL11;\n+ \n+ CCTK_REAL csetemp122 CCTK_ATTRIBUTE_UNUSED = tdg4122*xformL21;\n+ \n+ CCTK_REAL csetemp123 CCTK_ATTRIBUTE_UNUSED = tdg4123*xformL31;\n+ \n+ CCTK_REAL csetemp124 CCTK_ATTRIBUTE_UNUSED = tdg4130*xformL01;\n+ \n+ CCTK_REAL csetemp125 CCTK_ATTRIBUTE_UNUSED = tdg4131*xformL11;\n+ \n+ CCTK_REAL csetemp126 CCTK_ATTRIBUTE_UNUSED = tdg4132*xformL21;\n+ \n+ CCTK_REAL csetemp127 CCTK_ATTRIBUTE_UNUSED = tdg4133*xformL31;\n+ \n+ CCTK_REAL csetemp128 CCTK_ATTRIBUTE_UNUSED = tdg4220*xformL01;\n+ \n+ CCTK_REAL csetemp129 CCTK_ATTRIBUTE_UNUSED = tdg4221*xformL11;\n+ \n+ CCTK_REAL csetemp130 CCTK_ATTRIBUTE_UNUSED = tdg4222*xformL21;\n+ \n+ CCTK_REAL csetemp131 CCTK_ATTRIBUTE_UNUSED = tdg4223*xformL31;\n+ \n+ CCTK_REAL csetemp132 CCTK_ATTRIBUTE_UNUSED = tdg4230*xformL01;\n+ \n+ CCTK_REAL csetemp133 CCTK_ATTRIBUTE_UNUSED = tdg4231*xformL11;\n+ \n+ CCTK_REAL csetemp134 CCTK_ATTRIBUTE_UNUSED = tdg4232*xformL21;\n+ \n+ CCTK_REAL csetemp135 CCTK_ATTRIBUTE_UNUSED = tdg4233*xformL31;\n+ \n+ CCTK_REAL csetemp136 CCTK_ATTRIBUTE_UNUSED = tdg4330*xformL01;\n+ \n+ CCTK_REAL csetemp137 CCTK_ATTRIBUTE_UNUSED = tdg4331*xformL11;\n+ \n+ CCTK_REAL csetemp138 CCTK_ATTRIBUTE_UNUSED = tdg4332*xformL21;\n+ \n+ CCTK_REAL csetemp139 CCTK_ATTRIBUTE_UNUSED = tdg4333*xformL31;\n+ \n+ CCTK_REAL dg4011 CCTK_ATTRIBUTE_UNUSED = xformL00*((csetemp100 + \n+ csetemp101 + csetemp102 + csetemp103)*xformL01 + (csetemp104 + \n+ csetemp105 + csetemp106 + csetemp107)*xformL11 + (csetemp108 + \n+ csetemp109 + csetemp110 + csetemp111)*xformL21 + (csetemp112 + \n+ csetemp113 + csetemp114 + csetemp115)*xformL31) + xformL10*((csetemp104 \n+ + csetemp105 + csetemp106 + csetemp107)*xformL01 + (csetemp116 + \n+ csetemp117 + csetemp118 + csetemp119)*xformL11 + (csetemp120 + \n+ csetemp121 + csetemp122 + csetemp123)*xformL21 + (csetemp124 + \n+ csetemp125 + csetemp126 + csetemp127)*xformL31) + xformL20*((csetemp108 \n+ + csetemp109 + csetemp110 + csetemp111)*xformL01 + (csetemp120 + \n+ csetemp121 + csetemp122 + csetemp123)*xformL11 + (csetemp128 + \n+ csetemp129 + csetemp130 + csetemp131)*xformL21 + (csetemp132 + \n+ csetemp133 + csetemp134 + csetemp135)*xformL31) + xformL30*((csetemp112 \n+ + csetemp113 + csetemp114 + csetemp115)*xformL01 + (csetemp124 + \n+ csetemp125 + csetemp126 + csetemp127)*xformL11 + (csetemp132 + \n+ csetemp133 + csetemp134 + csetemp135)*xformL21 + (csetemp136 + \n+ csetemp137 + csetemp138 + csetemp139)*xformL31);\n+ \n+ CCTK_REAL csetemp140 CCTK_ATTRIBUTE_UNUSED = tdg4000*xformL02;\n+ \n+ CCTK_REAL csetemp141 CCTK_ATTRIBUTE_UNUSED = tdg4001*xformL12;\n+ \n+ CCTK_REAL csetemp142 CCTK_ATTRIBUTE_UNUSED = tdg4002*xformL22;\n+ \n+ CCTK_REAL csetemp143 CCTK_ATTRIBUTE_UNUSED = tdg4003*xformL32;\n+ \n+ CCTK_REAL csetemp144 CCTK_ATTRIBUTE_UNUSED = tdg4010*xformL02;\n+ \n+ CCTK_REAL csetemp145 CCTK_ATTRIBUTE_UNUSED = tdg4011*xformL12;\n+ \n+ CCTK_REAL csetemp146 CCTK_ATTRIBUTE_UNUSED = tdg4012*xformL22;\n+ \n+ CCTK_REAL csetemp147 CCTK_ATTRIBUTE_UNUSED = tdg4013*xformL32;\n+ \n+ CCTK_REAL csetemp148 CCTK_ATTRIBUTE_UNUSED = tdg4020*xformL02;\n+ \n+ CCTK_REAL csetemp149 CCTK_ATTRIBUTE_UNUSED = tdg4021*xformL12;\n+ \n+ CCTK_REAL csetemp150 CCTK_ATTRIBUTE_UNUSED = tdg4022*xformL22;\n+ \n+ CCTK_REAL csetemp151 CCTK_ATTRIBUTE_UNUSED = tdg4023*xformL32;\n+ \n+ CCTK_REAL csetemp152 CCTK_ATTRIBUTE_UNUSED = tdg4030*xformL02;\n+ \n+ CCTK_REAL csetemp153 CCTK_ATTRIBUTE_UNUSED = tdg4031*xformL12;\n+ \n+ CCTK_REAL csetemp154 CCTK_ATTRIBUTE_UNUSED = tdg4032*xformL22;\n+ \n+ CCTK_REAL csetemp155 CCTK_ATTRIBUTE_UNUSED = tdg4033*xformL32;\n+ \n+ CCTK_REAL csetemp156 CCTK_ATTRIBUTE_UNUSED = tdg4110*xformL02;\n+ \n+ CCTK_REAL csetemp157 CCTK_ATTRIBUTE_UNUSED = tdg4111*xformL12;\n+ \n+ CCTK_REAL csetemp158 CCTK_ATTRIBUTE_UNUSED = tdg4112*xformL22;\n+ \n+ CCTK_REAL csetemp159 CCTK_ATTRIBUTE_UNUSED = tdg4113*xformL32;\n+ \n+ CCTK_REAL csetemp160 CCTK_ATTRIBUTE_UNUSED = tdg4120*xformL02;\n+ \n+ CCTK_REAL csetemp161 CCTK_ATTRIBUTE_UNUSED = tdg4121*xformL12;\n+ \n+ CCTK_REAL csetemp162 CCTK_ATTRIBUTE_UNUSED = tdg4122*xformL22;\n+ \n+ CCTK_REAL csetemp163 CCTK_ATTRIBUTE_UNUSED = tdg4123*xformL32;\n+ \n+ CCTK_REAL csetemp164 CCTK_ATTRIBUTE_UNUSED = tdg4130*xformL02;\n+ \n+ CCTK_REAL csetemp165 CCTK_ATTRIBUTE_UNUSED = tdg4131*xformL12;\n+ \n+ CCTK_REAL csetemp166 CCTK_ATTRIBUTE_UNUSED = tdg4132*xformL22;\n+ \n+ CCTK_REAL csetemp167 CCTK_ATTRIBUTE_UNUSED = tdg4133*xformL32;\n+ \n+ CCTK_REAL csetemp168 CCTK_ATTRIBUTE_UNUSED = tdg4220*xformL02;\n+ \n+ CCTK_REAL csetemp169 CCTK_ATTRIBUTE_UNUSED = tdg4221*xformL12;\n+ \n+ CCTK_REAL csetemp170 CCTK_ATTRIBUTE_UNUSED = tdg4222*xformL22;\n+ \n+ CCTK_REAL csetemp171 CCTK_ATTRIBUTE_UNUSED = tdg4223*xformL32;\n+ \n+ CCTK_REAL csetemp172 CCTK_ATTRIBUTE_UNUSED = tdg4230*xformL02;\n+ \n+ CCTK_REAL csetemp173 CCTK_ATTRIBUTE_UNUSED = tdg4231*xformL12;\n+ \n+ CCTK_REAL csetemp174 CCTK_ATTRIBUTE_UNUSED = tdg4232*xformL22;\n+ \n+ CCTK_REAL csetemp175 CCTK_ATTRIBUTE_UNUSED = tdg4233*xformL32;\n+ \n+ CCTK_REAL csetemp176 CCTK_ATTRIBUTE_UNUSED = tdg4330*xformL02;\n+ \n+ CCTK_REAL csetemp177 CCTK_ATTRIBUTE_UNUSED = tdg4331*xformL12;\n+ \n+ CCTK_REAL csetemp178 CCTK_ATTRIBUTE_UNUSED = tdg4332*xformL22;\n+ \n+ CCTK_REAL csetemp179 CCTK_ATTRIBUTE_UNUSED = tdg4333*xformL32;\n+ \n+ CCTK_REAL dg4012 CCTK_ATTRIBUTE_UNUSED = xformL00*((csetemp140 + \n+ csetemp141 + csetemp142 + csetemp143)*xformL01 + (csetemp144 + \n+ csetemp145 + csetemp146 + csetemp147)*xformL11 + (csetemp148 + \n+ csetemp149 + csetemp150 + csetemp151)*xformL21 + (csetemp152 + \n+ csetemp153 + csetemp154 + csetemp155)*xformL31) + xformL10*((csetemp144 \n+ + csetemp145 + csetemp146 + csetemp147)*xformL01 + (csetemp156 + \n+ csetemp157 + csetemp158 + csetemp159)*xformL11 + (csetemp160 + \n+ csetemp161 + csetemp162 + csetemp163)*xformL21 + (csetemp164 + \n+ csetemp165 + csetemp166 + csetemp167)*xformL31) + xformL20*((csetemp148 \n+ + csetemp149 + csetemp150 + csetemp151)*xformL01 + (csetemp160 + \n+ csetemp161 + csetemp162 + csetemp163)*xformL11 + (csetemp168 + \n+ csetemp169 + csetemp170 + csetemp171)*xformL21 + (csetemp172 + \n+ csetemp173 + csetemp174 + csetemp175)*xformL31) + xformL30*((csetemp152 \n+ + csetemp153 + csetemp154 + csetemp155)*xformL01 + (csetemp164 + \n+ csetemp165 + csetemp166 + csetemp167)*xformL11 + (csetemp172 + \n+ csetemp173 + csetemp174 + csetemp175)*xformL21 + (csetemp176 + \n+ csetemp177 + csetemp178 + csetemp179)*xformL31);\n+ \n+ CCTK_REAL csetemp180 CCTK_ATTRIBUTE_UNUSED = tdg4000*xformL03;\n+ \n+ CCTK_REAL csetemp181 CCTK_ATTRIBUTE_UNUSED = tdg4001*xformL13;\n+ \n+ CCTK_REAL csetemp182 CCTK_ATTRIBUTE_UNUSED = tdg4002*xformL23;\n+ \n+ CCTK_REAL csetemp183 CCTK_ATTRIBUTE_UNUSED = tdg4003*xformL33;\n+ \n+ CCTK_REAL csetemp184 CCTK_ATTRIBUTE_UNUSED = tdg4010*xformL03;\n+ \n+ CCTK_REAL csetemp185 CCTK_ATTRIBUTE_UNUSED = tdg4011*xformL13;\n+ \n+ CCTK_REAL csetemp186 CCTK_ATTRIBUTE_UNUSED = tdg4012*xformL23;\n+ \n+ CCTK_REAL csetemp187 CCTK_ATTRIBUTE_UNUSED = tdg4013*xformL33;\n+ \n+ CCTK_REAL csetemp188 CCTK_ATTRIBUTE_UNUSED = tdg4020*xformL03;\n+ \n+ CCTK_REAL csetemp189 CCTK_ATTRIBUTE_UNUSED = tdg4021*xformL13;\n+ \n+ CCTK_REAL csetemp190 CCTK_ATTRIBUTE_UNUSED = tdg4022*xformL23;\n+ \n+ CCTK_REAL csetemp191 CCTK_ATTRIBUTE_UNUSED = tdg4023*xformL33;\n+ \n+ CCTK_REAL csetemp192 CCTK_ATTRIBUTE_UNUSED = tdg4030*xformL03;\n+ \n+ CCTK_REAL csetemp193 CCTK_ATTRIBUTE_UNUSED = tdg4031*xformL13;\n+ \n+ CCTK_REAL csetemp194 CCTK_ATTRIBUTE_UNUSED = tdg4032*xformL23;\n+ \n+ CCTK_REAL csetemp195 CCTK_ATTRIBUTE_UNUSED = tdg4033*xformL33;\n+ \n+ CCTK_REAL csetemp196 CCTK_ATTRIBUTE_UNUSED = tdg4110*xformL03;\n+ \n+ CCTK_REAL csetemp197 CCTK_ATTRIBUTE_UNUSED = tdg4111*xformL13;\n+ \n+ CCTK_REAL csetemp198 CCTK_ATTRIBUTE_UNUSED = tdg4112*xformL23;\n+ \n+ CCTK_REAL csetemp199 CCTK_ATTRIBUTE_UNUSED = tdg4113*xformL33;\n+ \n+ CCTK_REAL csetemp200 CCTK_ATTRIBUTE_UNUSED = tdg4120*xformL03;\n+ \n+ CCTK_REAL csetemp201 CCTK_ATTRIBUTE_UNUSED = tdg4121*xformL13;\n+ \n+ CCTK_REAL csetemp202 CCTK_ATTRIBUTE_UNUSED = tdg4122*xformL23;\n+ \n+ CCTK_REAL csetemp203 CCTK_ATTRIBUTE_UNUSED = tdg4123*xformL33;\n+ \n+ CCTK_REAL csetemp204 CCTK_ATTRIBUTE_UNUSED = tdg4130*xformL03;\n+ \n+ CCTK_REAL csetemp205 CCTK_ATTRIBUTE_UNUSED = tdg4131*xformL13;\n+ \n+ CCTK_REAL csetemp206 CCTK_ATTRIBUTE_UNUSED = tdg4132*xformL23;\n+ \n+ CCTK_REAL csetemp207 CCTK_ATTRIBUTE_UNUSED = tdg4133*xformL33;\n+ \n+ CCTK_REAL csetemp208 CCTK_ATTRIBUTE_UNUSED = tdg4220*xformL03;\n+ \n+ CCTK_REAL csetemp209 CCTK_ATTRIBUTE_UNUSED = tdg4221*xformL13;\n+ \n+ CCTK_REAL csetemp210 CCTK_ATTRIBUTE_UNUSED = tdg4222*xformL23;\n+ \n+ CCTK_REAL csetemp211 CCTK_ATTRIBUTE_UNUSED = tdg4223*xformL33;\n+ \n+ CCTK_REAL csetemp212 CCTK_ATTRIBUTE_UNUSED = tdg4230*xformL03;\n+ \n+ CCTK_REAL csetemp213 CCTK_ATTRIBUTE_UNUSED = tdg4231*xformL13;\n+ \n+ CCTK_REAL csetemp214 CCTK_ATTRIBUTE_UNUSED = tdg4232*xformL23;\n+ \n+ CCTK_REAL csetemp215 CCTK_ATTRIBUTE_UNUSED = tdg4233*xformL33;\n+ \n+ CCTK_REAL csetemp216 CCTK_ATTRIBUTE_UNUSED = tdg4330*xformL03;\n+ \n+ CCTK_REAL csetemp217 CCTK_ATTRIBUTE_UNUSED = tdg4331*xformL13;\n+ \n+ CCTK_REAL csetemp218 CCTK_ATTRIBUTE_UNUSED = tdg4332*xformL23;\n+ \n+ CCTK_REAL csetemp219 CCTK_ATTRIBUTE_UNUSED = tdg4333*xformL33;\n+ \n+ CCTK_REAL dg4013 CCTK_ATTRIBUTE_UNUSED = xformL00*((csetemp180 + \n+ csetemp181 + csetemp182 + csetemp183)*xformL01 + (csetemp184 + \n+ csetemp185 + csetemp186 + csetemp187)*xformL11 + (csetemp188 + \n+ csetemp189 + csetemp190 + csetemp191)*xformL21 + (csetemp192 + \n+ csetemp193 + csetemp194 + csetemp195)*xformL31) + xformL10*((csetemp184 \n+ + csetemp185 + csetemp186 + csetemp187)*xformL01 + (csetemp196 + \n+ csetemp197 + csetemp198 + csetemp199)*xformL11 + (csetemp200 + \n+ csetemp201 + csetemp202 + csetemp203)*xformL21 + (csetemp204 + \n+ csetemp205 + csetemp206 + csetemp207)*xformL31) + xformL20*((csetemp188 \n+ + csetemp189 + csetemp190 + csetemp191)*xformL01 + (csetemp200 + \n+ csetemp201 + csetemp202 + csetemp203)*xformL11 + (csetemp208 + \n+ csetemp209 + csetemp210 + csetemp211)*xformL21 + (csetemp212 + \n+ csetemp213 + csetemp214 + csetemp215)*xformL31) + xformL30*((csetemp192 \n+ + csetemp193 + csetemp194 + csetemp195)*xformL01 + (csetemp204 + \n+ csetemp205 + csetemp206 + csetemp207)*xformL11 + (csetemp212 + \n+ csetemp213 + csetemp214 + csetemp215)*xformL21 + (csetemp216 + \n+ csetemp217 + csetemp218 + csetemp219)*xformL31);\n+ \n+ CCTK_REAL dg4020 CCTK_ATTRIBUTE_UNUSED = xformL00*((csetemp60 + \n+ csetemp61 + csetemp62 + csetemp63)*xformL02 + (csetemp64 + csetemp65 + \n+ csetemp66 + csetemp67)*xformL12 + (csetemp68 + csetemp69 + csetemp70 + \n+ csetemp71)*xformL22 + (csetemp72 + csetemp73 + csetemp74 + \n+ csetemp75)*xformL32) + xformL10*((csetemp64 + csetemp65 + csetemp66 + \n+ csetemp67)*xformL02 + (csetemp76 + csetemp77 + csetemp78 + \n+ csetemp79)*xformL12 + (csetemp80 + csetemp81 + csetemp82 + \n+ csetemp83)*xformL22 + (csetemp84 + csetemp85 + csetemp86 + \n+ csetemp87)*xformL32) + xformL20*((csetemp68 + csetemp69 + csetemp70 + \n+ csetemp71)*xformL02 + (csetemp80 + csetemp81 + csetemp82 + \n+ csetemp83)*xformL12 + (csetemp88 + csetemp89 + csetemp90 + \n+ csetemp91)*xformL22 + (csetemp92 + csetemp93 + csetemp94 + \n+ csetemp95)*xformL32) + xformL30*((csetemp72 + csetemp73 + csetemp74 + \n+ csetemp75)*xformL02 + (csetemp84 + csetemp85 + csetemp86 + \n+ csetemp87)*xformL12 + (csetemp92 + csetemp93 + csetemp94 + \n+ csetemp95)*xformL22 + (csetemp96 + csetemp97 + csetemp98 + \n+ csetemp99)*xformL32);\n+ \n+ CCTK_REAL dg4021 CCTK_ATTRIBUTE_UNUSED = xformL00*((csetemp100 + \n+ csetemp101 + csetemp102 + csetemp103)*xformL02 + (csetemp104 + \n+ csetemp105 + csetemp106 + csetemp107)*xformL12 + (csetemp108 + \n+ csetemp109 + csetemp110 + csetemp111)*xformL22 + (csetemp112 + \n+ csetemp113 + csetemp114 + csetemp115)*xformL32) + xformL10*((csetemp104 \n+ + csetemp105 + csetemp106 + csetemp107)*xformL02 + (csetemp116 + \n+ csetemp117 + csetemp118 + csetemp119)*xformL12 + (csetemp120 + \n+ csetemp121 + csetemp122 + csetemp123)*xformL22 + (csetemp124 + \n+ csetemp125 + csetemp126 + csetemp127)*xformL32) + xformL20*((csetemp108 \n+ + csetemp109 + csetemp110 + csetemp111)*xformL02 + (csetemp120 + \n+ csetemp121 + csetemp122 + csetemp123)*xformL12 + (csetemp128 + \n+ csetemp129 + csetemp130 + csetemp131)*xformL22 + (csetemp132 + \n+ csetemp133 + csetemp134 + csetemp135)*xformL32) + xformL30*((csetemp112 \n+ + csetemp113 + csetemp114 + csetemp115)*xformL02 + (csetemp124 + \n+ csetemp125 + csetemp126 + csetemp127)*xformL12 + (csetemp132 + \n+ csetemp133 + csetemp134 + csetemp135)*xformL22 + (csetemp136 + \n+ csetemp137 + csetemp138 + csetemp139)*xformL32);\n+ \n+ CCTK_REAL dg4022 CCTK_ATTRIBUTE_UNUSED = xformL00*((csetemp140 + \n+ csetemp141 + csetemp142 + csetemp143)*xformL02 + (csetemp144 + \n+ csetemp145 + csetemp146 + csetemp147)*xformL12 + (csetemp148 + \n+ csetemp149 + csetemp150 + csetemp151)*xformL22 + (csetemp152 + \n+ csetemp153 + csetemp154 + csetemp155)*xformL32) + xformL10*((csetemp144 \n+ + csetemp145 + csetemp146 + csetemp147)*xformL02 + (csetemp156 + \n+ csetemp157 + csetemp158 + csetemp159)*xformL12 + (csetemp160 + \n+ csetemp161 + csetemp162 + csetemp163)*xformL22 + (csetemp164 + \n+ csetemp165 + csetemp166 + csetemp167)*xformL32) + xformL20*((csetemp148 \n+ + csetemp149 + csetemp150 + csetemp151)*xformL02 + (csetemp160 + \n+ csetemp161 + csetemp162 + csetemp163)*xformL12 + (csetemp168 + \n+ csetemp169 + csetemp170 + csetemp171)*xformL22 + (csetemp172 + \n+ csetemp173 + csetemp174 + csetemp175)*xformL32) + xformL30*((csetemp152 \n+ + csetemp153 + csetemp154 + csetemp155)*xformL02 + (csetemp164 + \n+ csetemp165 + csetemp166 + csetemp167)*xformL12 + (csetemp172 + \n+ csetemp173 + csetemp174 + csetemp175)*xformL22 + (csetemp176 + \n+ csetemp177 + csetemp178 + csetemp179)*xformL32);\n+ \n+ CCTK_REAL dg4023 CCTK_ATTRIBUTE_UNUSED = xformL00*((csetemp180 + \n+ csetemp181 + csetemp182 + csetemp183)*xformL02 + (csetemp184 + \n+ csetemp185 + csetemp186 + csetemp187)*xformL12 + (csetemp188 + \n+ csetemp189 + csetemp190 + csetemp191)*xformL22 + (csetemp192 + \n+ csetemp193 + csetemp194 + csetemp195)*xformL32) + xformL10*((csetemp184 \n+ + csetemp185 + csetemp186 + csetemp187)*xformL02 + (csetemp196 + \n+ csetemp197 + csetemp198 + csetemp199)*xformL12 + (csetemp200 + \n+ csetemp201 + csetemp202 + csetemp203)*xformL22 + (csetemp204 + \n+ csetemp205 + csetemp206 + csetemp207)*xformL32) + xformL20*((csetemp188 \n+ + csetemp189 + csetemp190 + csetemp191)*xformL02 + (csetemp200 + \n+ csetemp201 + csetemp202 + csetemp203)*xformL12 + (csetemp208 + \n+ csetemp209 + csetemp210 + csetemp211)*xformL22 + (csetemp212 + \n+ csetemp213 + csetemp214 + csetemp215)*xformL32) + xformL30*((csetemp192 \n+ + csetemp193 + csetemp194 + csetemp195)*xformL02 + (csetemp204 + \n+ csetemp205 + csetemp206 + csetemp207)*xformL12 + (csetemp212 + \n+ csetemp213 + csetemp214 + csetemp215)*xformL22 + (csetemp216 + \n+ csetemp217 + csetemp218 + csetemp219)*xformL32);\n+ \n+ CCTK_REAL dg4030 CCTK_ATTRIBUTE_UNUSED = xformL00*((csetemp60 + \n+ csetemp61 + csetemp62 + csetemp63)*xformL03 + (csetemp64 + csetemp65 + \n+ csetemp66 + csetemp67)*xformL13 + (csetemp68 + csetemp69 + csetemp70 + \n+ csetemp71)*xformL23 + (csetemp72 + csetemp73 + csetemp74 + \n+ csetemp75)*xformL33) + xformL10*((csetemp64 + csetemp65 + csetemp66 + \n+ csetemp67)*xformL03 + (csetemp76 + csetemp77 + csetemp78 + \n+ csetemp79)*xformL13 + (csetemp80 + csetemp81 + csetemp82 + \n+ csetemp83)*xformL23 + (csetemp84 + csetemp85 + csetemp86 + \n+ csetemp87)*xformL33) + xformL20*((csetemp68 + csetemp69 + csetemp70 + \n+ csetemp71)*xformL03 + (csetemp80 + csetemp81 + csetemp82 + \n+ csetemp83)*xformL13 + (csetemp88 + csetemp89 + csetemp90 + \n+ csetemp91)*xformL23 + (csetemp92 + csetemp93 + csetemp94 + \n+ csetemp95)*xformL33) + xformL30*((csetemp72 + csetemp73 + csetemp74 + \n+ csetemp75)*xformL03 + (csetemp84 + csetemp85 + csetemp86 + \n+ csetemp87)*xformL13 + (csetemp92 + csetemp93 + csetemp94 + \n+ csetemp95)*xformL23 + (csetemp96 + csetemp97 + csetemp98 + \n+ csetemp99)*xformL33);\n+ \n+ CCTK_REAL dg4031 CCTK_ATTRIBUTE_UNUSED = xformL00*((csetemp100 + \n+ csetemp101 + csetemp102 + csetemp103)*xformL03 + (csetemp104 + \n+ csetemp105 + csetemp106 + csetemp107)*xformL13 + (csetemp108 + \n+ csetemp109 + csetemp110 + csetemp111)*xformL23 + (csetemp112 + \n+ csetemp113 + csetemp114 + csetemp115)*xformL33) + xformL10*((csetemp104 \n+ + csetemp105 + csetemp106 + csetemp107)*xformL03 + (csetemp116 + \n+ csetemp117 + csetemp118 + csetemp119)*xformL13 + (csetemp120 + \n+ csetemp121 + csetemp122 + csetemp123)*xformL23 + (csetemp124 + \n+ csetemp125 + csetemp126 + csetemp127)*xformL33) + xformL20*((csetemp108 \n+ + csetemp109 + csetemp110 + csetemp111)*xformL03 + (csetemp120 + \n+ csetemp121 + csetemp122 + csetemp123)*xformL13 + (csetemp128 + \n+ csetemp129 + csetemp130 + csetemp131)*xformL23 + (csetemp132 + \n+ csetemp133 + csetemp134 + csetemp135)*xformL33) + xformL30*((csetemp112 \n+ + csetemp113 + csetemp114 + csetemp115)*xformL03 + (csetemp124 + \n+ csetemp125 + csetemp126 + csetemp127)*xformL13 + (csetemp132 + \n+ csetemp133 + csetemp134 + csetemp135)*xformL23 + (csetemp136 + \n+ csetemp137 + csetemp138 + csetemp139)*xformL33);\n+ \n+ CCTK_REAL dg4032 CCTK_ATTRIBUTE_UNUSED = xformL00*((csetemp140 + \n+ csetemp141 + csetemp142 + csetemp143)*xformL03 + (csetemp144 + \n+ csetemp145 + csetemp146 + csetemp147)*xformL13 + (csetemp148 + \n+ csetemp149 + csetemp150 + csetemp151)*xformL23 + (csetemp152 + \n+ csetemp153 + csetemp154 + csetemp155)*xformL33) + xformL10*((csetemp144 \n+ + csetemp145 + csetemp146 + csetemp147)*xformL03 + (csetemp156 + \n+ csetemp157 + csetemp158 + csetemp159)*xformL13 + (csetemp160 + \n+ csetemp161 + csetemp162 + csetemp163)*xformL23 + (csetemp164 + \n+ csetemp165 + csetemp166 + csetemp167)*xformL33) + xformL20*((csetemp148 \n+ + csetemp149 + csetemp150 + csetemp151)*xformL03 + (csetemp160 + \n+ csetemp161 + csetemp162 + csetemp163)*xformL13 + (csetemp168 + \n+ csetemp169 + csetemp170 + csetemp171)*xformL23 + (csetemp172 + \n+ csetemp173 + csetemp174 + csetemp175)*xformL33) + xformL30*((csetemp152 \n+ + csetemp153 + csetemp154 + csetemp155)*xformL03 + (csetemp164 + \n+ csetemp165 + csetemp166 + csetemp167)*xformL13 + (csetemp172 + \n+ csetemp173 + csetemp174 + csetemp175)*xformL23 + (csetemp176 + \n+ csetemp177 + csetemp178 + csetemp179)*xformL33);\n+ \n+ CCTK_REAL dg4033 CCTK_ATTRIBUTE_UNUSED = xformL00*((csetemp180 + \n+ csetemp181 + csetemp182 + csetemp183)*xformL03 + (csetemp184 + \n+ csetemp185 + csetemp186 + csetemp187)*xformL13 + (csetemp188 + \n+ csetemp189 + csetemp190 + csetemp191)*xformL23 + (csetemp192 + \n+ csetemp193 + csetemp194 + csetemp195)*xformL33) + xformL10*((csetemp184 \n+ + csetemp185 + csetemp186 + csetemp187)*xformL03 + (csetemp196 + \n+ csetemp197 + csetemp198 + csetemp199)*xformL13 + (csetemp200 + \n+ csetemp201 + csetemp202 + csetemp203)*xformL23 + (csetemp204 + \n+ csetemp205 + csetemp206 + csetemp207)*xformL33) + xformL20*((csetemp188 \n+ + csetemp189 + csetemp190 + csetemp191)*xformL03 + (csetemp200 + \n+ csetemp201 + csetemp202 + csetemp203)*xformL13 + (csetemp208 + \n+ csetemp209 + csetemp210 + csetemp211)*xformL23 + (csetemp212 + \n+ csetemp213 + csetemp214 + csetemp215)*xformL33) + xformL30*((csetemp192 \n+ + csetemp193 + csetemp194 + csetemp195)*xformL03 + (csetemp204 + \n+ csetemp205 + csetemp206 + csetemp207)*xformL13 + (csetemp212 + \n+ csetemp213 + csetemp214 + csetemp215)*xformL23 + (csetemp216 + \n+ csetemp217 + csetemp218 + csetemp219)*xformL33);\n+ \n+ CCTK_REAL dg4110 CCTK_ATTRIBUTE_UNUSED = xformL01*((csetemp60 + \n+ csetemp61 + csetemp62 + csetemp63)*xformL01 + (csetemp64 + csetemp65 + \n+ csetemp66 + csetemp67)*xformL11 + (csetemp68 + csetemp69 + csetemp70 + \n+ csetemp71)*xformL21 + (csetemp72 + csetemp73 + csetemp74 + \n+ csetemp75)*xformL31) + xformL11*((csetemp64 + csetemp65 + csetemp66 + \n+ csetemp67)*xformL01 + (csetemp76 + csetemp77 + csetemp78 + \n+ csetemp79)*xformL11 + (csetemp80 + csetemp81 + csetemp82 + \n+ csetemp83)*xformL21 + (csetemp84 + csetemp85 + csetemp86 + \n+ csetemp87)*xformL31) + xformL21*((csetemp68 + csetemp69 + csetemp70 + \n+ csetemp71)*xformL01 + (csetemp80 + csetemp81 + csetemp82 + \n+ csetemp83)*xformL11 + (csetemp88 + csetemp89 + csetemp90 + \n+ csetemp91)*xformL21 + (csetemp92 + csetemp93 + csetemp94 + \n+ csetemp95)*xformL31) + xformL31*((csetemp72 + csetemp73 + csetemp74 + \n+ csetemp75)*xformL01 + (csetemp84 + csetemp85 + csetemp86 + \n+ csetemp87)*xformL11 + (csetemp92 + csetemp93 + csetemp94 + \n+ csetemp95)*xformL21 + (csetemp96 + csetemp97 + csetemp98 + \n+ csetemp99)*xformL31);\n+ \n+ CCTK_REAL dg4111 CCTK_ATTRIBUTE_UNUSED = xformL01*((csetemp100 + \n+ csetemp101 + csetemp102 + csetemp103)*xformL01 + (csetemp104 + \n+ csetemp105 + csetemp106 + csetemp107)*xformL11 + (csetemp108 + \n+ csetemp109 + csetemp110 + csetemp111)*xformL21 + (csetemp112 + \n+ csetemp113 + csetemp114 + csetemp115)*xformL31) + xformL11*((csetemp104 \n+ + csetemp105 + csetemp106 + csetemp107)*xformL01 + (csetemp116 + \n+ csetemp117 + csetemp118 + csetemp119)*xformL11 + (csetemp120 + \n+ csetemp121 + csetemp122 + csetemp123)*xformL21 + (csetemp124 + \n+ csetemp125 + csetemp126 + csetemp127)*xformL31) + xformL21*((csetemp108 \n+ + csetemp109 + csetemp110 + csetemp111)*xformL01 + (csetemp120 + \n+ csetemp121 + csetemp122 + csetemp123)*xformL11 + (csetemp128 + \n+ csetemp129 + csetemp130 + csetemp131)*xformL21 + (csetemp132 + \n+ csetemp133 + csetemp134 + csetemp135)*xformL31) + xformL31*((csetemp112 \n+ + csetemp113 + csetemp114 + csetemp115)*xformL01 + (csetemp124 + \n+ csetemp125 + csetemp126 + csetemp127)*xformL11 + (csetemp132 + \n+ csetemp133 + csetemp134 + csetemp135)*xformL21 + (csetemp136 + \n+ csetemp137 + csetemp138 + csetemp139)*xformL31);\n+ \n+ CCTK_REAL dg4112 CCTK_ATTRIBUTE_UNUSED = xformL01*((csetemp140 + \n+ csetemp141 + csetemp142 + csetemp143)*xformL01 + (csetemp144 + \n+ csetemp145 + csetemp146 + csetemp147)*xformL11 + (csetemp148 + \n+ csetemp149 + csetemp150 + csetemp151)*xformL21 + (csetemp152 + \n+ csetemp153 + csetemp154 + csetemp155)*xformL31) + xformL11*((csetemp144 \n+ + csetemp145 + csetemp146 + csetemp147)*xformL01 + (csetemp156 + \n+ csetemp157 + csetemp158 + csetemp159)*xformL11 + (csetemp160 + \n+ csetemp161 + csetemp162 + csetemp163)*xformL21 + (csetemp164 + \n+ csetemp165 + csetemp166 + csetemp167)*xformL31) + xformL21*((csetemp148 \n+ + csetemp149 + csetemp150 + csetemp151)*xformL01 + (csetemp160 + \n+ csetemp161 + csetemp162 + csetemp163)*xformL11 + (csetemp168 + \n+ csetemp169 + csetemp170 + csetemp171)*xformL21 + (csetemp172 + \n+ csetemp173 + csetemp174 + csetemp175)*xformL31) + xformL31*((csetemp152 \n+ + csetemp153 + csetemp154 + csetemp155)*xformL01 + (csetemp164 + \n+ csetemp165 + csetemp166 + csetemp167)*xformL11 + (csetemp172 + \n+ csetemp173 + csetemp174 + csetemp175)*xformL21 + (csetemp176 + \n+ csetemp177 + csetemp178 + csetemp179)*xformL31);\n+ \n+ CCTK_REAL dg4113 CCTK_ATTRIBUTE_UNUSED = xformL01*((csetemp180 + \n+ csetemp181 + csetemp182 + csetemp183)*xformL01 + (csetemp184 + \n+ csetemp185 + csetemp186 + csetemp187)*xformL11 + (csetemp188 + \n+ csetemp189 + csetemp190 + csetemp191)*xformL21 + (csetemp192 + \n+ csetemp193 + csetemp194 + csetemp195)*xformL31) + xformL11*((csetemp184 \n+ + csetemp185 + csetemp186 + csetemp187)*xformL01 + (csetemp196 + \n+ csetemp197 + csetemp198 + csetemp199)*xformL11 + (csetemp200 + \n+ csetemp201 + csetemp202 + csetemp203)*xformL21 + (csetemp204 + \n+ csetemp205 + csetemp206 + csetemp207)*xformL31) + xformL21*((csetemp188 \n+ + csetemp189 + csetemp190 + csetemp191)*xformL01 + (csetemp200 + \n+ csetemp201 + csetemp202 + csetemp203)*xformL11 + (csetemp208 + \n+ csetemp209 + csetemp210 + csetemp211)*xformL21 + (csetemp212 + \n+ csetemp213 + csetemp214 + csetemp215)*xformL31) + xformL31*((csetemp192 \n+ + csetemp193 + csetemp194 + csetemp195)*xformL01 + (csetemp204 + \n+ csetemp205 + csetemp206 + csetemp207)*xformL11 + (csetemp212 + \n+ csetemp213 + csetemp214 + csetemp215)*xformL21 + (csetemp216 + \n+ csetemp217 + csetemp218 + csetemp219)*xformL31);\n+ \n+ CCTK_REAL dg4120 CCTK_ATTRIBUTE_UNUSED = xformL01*((csetemp60 + \n+ csetemp61 + csetemp62 + csetemp63)*xformL02 + (csetemp64 + csetemp65 + \n+ csetemp66 + csetemp67)*xformL12 + (csetemp68 + csetemp69 + csetemp70 + \n+ csetemp71)*xformL22 + (csetemp72 + csetemp73 + csetemp74 + \n+ csetemp75)*xformL32) + xformL11*((csetemp64 + csetemp65 + csetemp66 + \n+ csetemp67)*xformL02 + (csetemp76 + csetemp77 + csetemp78 + \n+ csetemp79)*xformL12 + (csetemp80 + csetemp81 + csetemp82 + \n+ csetemp83)*xformL22 + (csetemp84 + csetemp85 + csetemp86 + \n+ csetemp87)*xformL32) + xformL21*((csetemp68 + csetemp69 + csetemp70 + \n+ csetemp71)*xformL02 + (csetemp80 + csetemp81 + csetemp82 + \n+ csetemp83)*xformL12 + (csetemp88 + csetemp89 + csetemp90 + \n+ csetemp91)*xformL22 + (csetemp92 + csetemp93 + csetemp94 + \n+ csetemp95)*xformL32) + xformL31*((csetemp72 + csetemp73 + csetemp74 + \n+ csetemp75)*xformL02 + (csetemp84 + csetemp85 + csetemp86 + \n+ csetemp87)*xformL12 + (csetemp92 + csetemp93 + csetemp94 + \n+ csetemp95)*xformL22 + (csetemp96 + csetemp97 + csetemp98 + \n+ csetemp99)*xformL32);\n+ \n+ CCTK_REAL dg4121 CCTK_ATTRIBUTE_UNUSED = xformL01*((csetemp100 + \n+ csetemp101 + csetemp102 + csetemp103)*xformL02 + (csetemp104 + \n+ csetemp105 + csetemp106 + csetemp107)*xformL12 + (csetemp108 + \n+ csetemp109 + csetemp110 + csetemp111)*xformL22 + (csetemp112 + \n+ csetemp113 + csetemp114 + csetemp115)*xformL32) + xformL11*((csetemp104 \n+ + csetemp105 + csetemp106 + csetemp107)*xformL02 + (csetemp116 + \n+ csetemp117 + csetemp118 + csetemp119)*xformL12 + (csetemp120 + \n+ csetemp121 + csetemp122 + csetemp123)*xformL22 + (csetemp124 + \n+ csetemp125 + csetemp126 + csetemp127)*xformL32) + xformL21*((csetemp108 \n+ + csetemp109 + csetemp110 + csetemp111)*xformL02 + (csetemp120 + \n+ csetemp121 + csetemp122 + csetemp123)*xformL12 + (csetemp128 + \n+ csetemp129 + csetemp130 + csetemp131)*xformL22 + (csetemp132 + \n+ csetemp133 + csetemp134 + csetemp135)*xformL32) + xformL31*((csetemp112 \n+ + csetemp113 + csetemp114 + csetemp115)*xformL02 + (csetemp124 + \n+ csetemp125 + csetemp126 + csetemp127)*xformL12 + (csetemp132 + \n+ csetemp133 + csetemp134 + csetemp135)*xformL22 + (csetemp136 + \n+ csetemp137 + csetemp138 + csetemp139)*xformL32);\n+ \n+ CCTK_REAL dg4122 CCTK_ATTRIBUTE_UNUSED = xformL01*((csetemp140 + \n+ csetemp141 + csetemp142 + csetemp143)*xformL02 + (csetemp144 + \n+ csetemp145 + csetemp146 + csetemp147)*xformL12 + (csetemp148 + \n+ csetemp149 + csetemp150 + csetemp151)*xformL22 + (csetemp152 + \n+ csetemp153 + csetemp154 + csetemp155)*xformL32) + xformL11*((csetemp144 \n+ + csetemp145 + csetemp146 + csetemp147)*xformL02 + (csetemp156 + \n+ csetemp157 + csetemp158 + csetemp159)*xformL12 + (csetemp160 + \n+ csetemp161 + csetemp162 + csetemp163)*xformL22 + (csetemp164 + \n+ csetemp165 + csetemp166 + csetemp167)*xformL32) + xformL21*((csetemp148 \n+ + csetemp149 + csetemp150 + csetemp151)*xformL02 + (csetemp160 + \n+ csetemp161 + csetemp162 + csetemp163)*xformL12 + (csetemp168 + \n+ csetemp169 + csetemp170 + csetemp171)*xformL22 + (csetemp172 + \n+ csetemp173 + csetemp174 + csetemp175)*xformL32) + xformL31*((csetemp152 \n+ + csetemp153 + csetemp154 + csetemp155)*xformL02 + (csetemp164 + \n+ csetemp165 + csetemp166 + csetemp167)*xformL12 + (csetemp172 + \n+ csetemp173 + csetemp174 + csetemp175)*xformL22 + (csetemp176 + \n+ csetemp177 + csetemp178 + csetemp179)*xformL32);\n+ \n+ CCTK_REAL dg4123 CCTK_ATTRIBUTE_UNUSED = xformL01*((csetemp180 + \n+ csetemp181 + csetemp182 + csetemp183)*xformL02 + (csetemp184 + \n+ csetemp185 + csetemp186 + csetemp187)*xformL12 + (csetemp188 + \n+ csetemp189 + csetemp190 + csetemp191)*xformL22 + (csetemp192 + \n+ csetemp193 + csetemp194 + csetemp195)*xformL32) + xformL11*((csetemp184 \n+ + csetemp185 + csetemp186 + csetemp187)*xformL02 + (csetemp196 + \n+ csetemp197 + csetemp198 + csetemp199)*xformL12 + (csetemp200 + \n+ csetemp201 + csetemp202 + csetemp203)*xformL22 + (csetemp204 + \n+ csetemp205 + csetemp206 + csetemp207)*xformL32) + xformL21*((csetemp188 \n+ + csetemp189 + csetemp190 + csetemp191)*xformL02 + (csetemp200 + \n+ csetemp201 + csetemp202 + csetemp203)*xformL12 + (csetemp208 + \n+ csetemp209 + csetemp210 + csetemp211)*xformL22 + (csetemp212 + \n+ csetemp213 + csetemp214 + csetemp215)*xformL32) + xformL31*((csetemp192 \n+ + csetemp193 + csetemp194 + csetemp195)*xformL02 + (csetemp204 + \n+ csetemp205 + csetemp206 + csetemp207)*xformL12 + (csetemp212 + \n+ csetemp213 + csetemp214 + csetemp215)*xformL22 + (csetemp216 + \n+ csetemp217 + csetemp218 + csetemp219)*xformL32);\n+ \n+ CCTK_REAL dg4130 CCTK_ATTRIBUTE_UNUSED = xformL01*((csetemp60 + \n+ csetemp61 + csetemp62 + csetemp63)*xformL03 + (csetemp64 + csetemp65 + \n+ csetemp66 + csetemp67)*xformL13 + (csetemp68 + csetemp69 + csetemp70 + \n+ csetemp71)*xformL23 + (csetemp72 + csetemp73 + csetemp74 + \n+ csetemp75)*xformL33) + xformL11*((csetemp64 + csetemp65 + csetemp66 + \n+ csetemp67)*xformL03 + (csetemp76 + csetemp77 + csetemp78 + \n+ csetemp79)*xformL13 + (csetemp80 + csetemp81 + csetemp82 + \n+ csetemp83)*xformL23 + (csetemp84 + csetemp85 + csetemp86 + \n+ csetemp87)*xformL33) + xformL21*((csetemp68 + csetemp69 + csetemp70 + \n+ csetemp71)*xformL03 + (csetemp80 + csetemp81 + csetemp82 + \n+ csetemp83)*xformL13 + (csetemp88 + csetemp89 + csetemp90 + \n+ csetemp91)*xformL23 + (csetemp92 + csetemp93 + csetemp94 + \n+ csetemp95)*xformL33) + xformL31*((csetemp72 + csetemp73 + csetemp74 + \n+ csetemp75)*xformL03 + (csetemp84 + csetemp85 + csetemp86 + \n+ csetemp87)*xformL13 + (csetemp92 + csetemp93 + csetemp94 + \n+ csetemp95)*xformL23 + (csetemp96 + csetemp97 + csetemp98 + \n+ csetemp99)*xformL33);\n+ \n+ CCTK_REAL dg4131 CCTK_ATTRIBUTE_UNUSED = xformL01*((csetemp100 + \n+ csetemp101 + csetemp102 + csetemp103)*xformL03 + (csetemp104 + \n+ csetemp105 + csetemp106 + csetemp107)*xformL13 + (csetemp108 + \n+ csetemp109 + csetemp110 + csetemp111)*xformL23 + (csetemp112 + \n+ csetemp113 + csetemp114 + csetemp115)*xformL33) + xformL11*((csetemp104 \n+ + csetemp105 + csetemp106 + csetemp107)*xformL03 + (csetemp116 + \n+ csetemp117 + csetemp118 + csetemp119)*xformL13 + (csetemp120 + \n+ csetemp121 + csetemp122 + csetemp123)*xformL23 + (csetemp124 + \n+ csetemp125 + csetemp126 + csetemp127)*xformL33) + xformL21*((csetemp108 \n+ + csetemp109 + csetemp110 + csetemp111)*xformL03 + (csetemp120 + \n+ csetemp121 + csetemp122 + csetemp123)*xformL13 + (csetemp128 + \n+ csetemp129 + csetemp130 + csetemp131)*xformL23 + (csetemp132 + \n+ csetemp133 + csetemp134 + csetemp135)*xformL33) + xformL31*((csetemp112 \n+ + csetemp113 + csetemp114 + csetemp115)*xformL03 + (csetemp124 + \n+ csetemp125 + csetemp126 + csetemp127)*xformL13 + (csetemp132 + \n+ csetemp133 + csetemp134 + csetemp135)*xformL23 + (csetemp136 + \n+ csetemp137 + csetemp138 + csetemp139)*xformL33);\n+ \n+ CCTK_REAL dg4132 CCTK_ATTRIBUTE_UNUSED = xformL01*((csetemp140 + \n+ csetemp141 + csetemp142 + csetemp143)*xformL03 + (csetemp144 + \n+ csetemp145 + csetemp146 + csetemp147)*xformL13 + (csetemp148 + \n+ csetemp149 + csetemp150 + csetemp151)*xformL23 + (csetemp152 + \n+ csetemp153 + csetemp154 + csetemp155)*xformL33) + xformL11*((csetemp144 \n+ + csetemp145 + csetemp146 + csetemp147)*xformL03 + (csetemp156 + \n+ csetemp157 + csetemp158 + csetemp159)*xformL13 + (csetemp160 + \n+ csetemp161 + csetemp162 + csetemp163)*xformL23 + (csetemp164 + \n+ csetemp165 + csetemp166 + csetemp167)*xformL33) + xformL21*((csetemp148 \n+ + csetemp149 + csetemp150 + csetemp151)*xformL03 + (csetemp160 + \n+ csetemp161 + csetemp162 + csetemp163)*xformL13 + (csetemp168 + \n+ csetemp169 + csetemp170 + csetemp171)*xformL23 + (csetemp172 + \n+ csetemp173 + csetemp174 + csetemp175)*xformL33) + xformL31*((csetemp152 \n+ + csetemp153 + csetemp154 + csetemp155)*xformL03 + (csetemp164 + \n+ csetemp165 + csetemp166 + csetemp167)*xformL13 + (csetemp172 + \n+ csetemp173 + csetemp174 + csetemp175)*xformL23 + (csetemp176 + \n+ csetemp177 + csetemp178 + csetemp179)*xformL33);\n+ \n+ CCTK_REAL dg4133 CCTK_ATTRIBUTE_UNUSED = xformL01*((csetemp180 + \n+ csetemp181 + csetemp182 + csetemp183)*xformL03 + (csetemp184 + \n+ csetemp185 + csetemp186 + csetemp187)*xformL13 + (csetemp188 + \n+ csetemp189 + csetemp190 + csetemp191)*xformL23 + (csetemp192 + \n+ csetemp193 + csetemp194 + csetemp195)*xformL33) + xformL11*((csetemp184 \n+ + csetemp185 + csetemp186 + csetemp187)*xformL03 + (csetemp196 + \n+ csetemp197 + csetemp198 + csetemp199)*xformL13 + (csetemp200 + \n+ csetemp201 + csetemp202 + csetemp203)*xformL23 + (csetemp204 + \n+ csetemp205 + csetemp206 + csetemp207)*xformL33) + xformL21*((csetemp188 \n+ + csetemp189 + csetemp190 + csetemp191)*xformL03 + (csetemp200 + \n+ csetemp201 + csetemp202 + csetemp203)*xformL13 + (csetemp208 + \n+ csetemp209 + csetemp210 + csetemp211)*xformL23 + (csetemp212 + \n+ csetemp213 + csetemp214 + csetemp215)*xformL33) + xformL31*((csetemp192 \n+ + csetemp193 + csetemp194 + csetemp195)*xformL03 + (csetemp204 + \n+ csetemp205 + csetemp206 + csetemp207)*xformL13 + (csetemp212 + \n+ csetemp213 + csetemp214 + csetemp215)*xformL23 + (csetemp216 + \n+ csetemp217 + csetemp218 + csetemp219)*xformL33);\n+ \n+ CCTK_REAL dg4220 CCTK_ATTRIBUTE_UNUSED = xformL02*((csetemp60 + \n+ csetemp61 + csetemp62 + csetemp63)*xformL02 + (csetemp64 + csetemp65 + \n+ csetemp66 + csetemp67)*xformL12 + (csetemp68 + csetemp69 + csetemp70 + \n+ csetemp71)*xformL22 + (csetemp72 + csetemp73 + csetemp74 + \n+ csetemp75)*xformL32) + xformL12*((csetemp64 + csetemp65 + csetemp66 + \n+ csetemp67)*xformL02 + (csetemp76 + csetemp77 + csetemp78 + \n+ csetemp79)*xformL12 + (csetemp80 + csetemp81 + csetemp82 + \n+ csetemp83)*xformL22 + (csetemp84 + csetemp85 + csetemp86 + \n+ csetemp87)*xformL32) + xformL22*((csetemp68 + csetemp69 + csetemp70 + \n+ csetemp71)*xformL02 + (csetemp80 + csetemp81 + csetemp82 + \n+ csetemp83)*xformL12 + (csetemp88 + csetemp89 + csetemp90 + \n+ csetemp91)*xformL22 + (csetemp92 + csetemp93 + csetemp94 + \n+ csetemp95)*xformL32) + xformL32*((csetemp72 + csetemp73 + csetemp74 + \n+ csetemp75)*xformL02 + (csetemp84 + csetemp85 + csetemp86 + \n+ csetemp87)*xformL12 + (csetemp92 + csetemp93 + csetemp94 + \n+ csetemp95)*xformL22 + (csetemp96 + csetemp97 + csetemp98 + \n+ csetemp99)*xformL32);\n+ \n+ CCTK_REAL dg4221 CCTK_ATTRIBUTE_UNUSED = xformL02*((csetemp100 + \n+ csetemp101 + csetemp102 + csetemp103)*xformL02 + (csetemp104 + \n+ csetemp105 + csetemp106 + csetemp107)*xformL12 + (csetemp108 + \n+ csetemp109 + csetemp110 + csetemp111)*xformL22 + (csetemp112 + \n+ csetemp113 + csetemp114 + csetemp115)*xformL32) + xformL12*((csetemp104 \n+ + csetemp105 + csetemp106 + csetemp107)*xformL02 + (csetemp116 + \n+ csetemp117 + csetemp118 + csetemp119)*xformL12 + (csetemp120 + \n+ csetemp121 + csetemp122 + csetemp123)*xformL22 + (csetemp124 + \n+ csetemp125 + csetemp126 + csetemp127)*xformL32) + xformL22*((csetemp108 \n+ + csetemp109 + csetemp110 + csetemp111)*xformL02 + (csetemp120 + \n+ csetemp121 + csetemp122 + csetemp123)*xformL12 + (csetemp128 + \n+ csetemp129 + csetemp130 + csetemp131)*xformL22 + (csetemp132 + \n+ csetemp133 + csetemp134 + csetemp135)*xformL32) + xformL32*((csetemp112 \n+ + csetemp113 + csetemp114 + csetemp115)*xformL02 + (csetemp124 + \n+ csetemp125 + csetemp126 + csetemp127)*xformL12 + (csetemp132 + \n+ csetemp133 + csetemp134 + csetemp135)*xformL22 + (csetemp136 + \n+ csetemp137 + csetemp138 + csetemp139)*xformL32);\n+ \n+ CCTK_REAL dg4222 CCTK_ATTRIBUTE_UNUSED = xformL02*((csetemp140 + \n+ csetemp141 + csetemp142 + csetemp143)*xformL02 + (csetemp144 + \n+ csetemp145 + csetemp146 + csetemp147)*xformL12 + (csetemp148 + \n+ csetemp149 + csetemp150 + csetemp151)*xformL22 + (csetemp152 + \n+ csetemp153 + csetemp154 + csetemp155)*xformL32) + xformL12*((csetemp144 \n+ + csetemp145 + csetemp146 + csetemp147)*xformL02 + (csetemp156 + \n+ csetemp157 + csetemp158 + csetemp159)*xformL12 + (csetemp160 + \n+ csetemp161 + csetemp162 + csetemp163)*xformL22 + (csetemp164 + \n+ csetemp165 + csetemp166 + csetemp167)*xformL32) + xformL22*((csetemp148 \n+ + csetemp149 + csetemp150 + csetemp151)*xformL02 + (csetemp160 + \n+ csetemp161 + csetemp162 + csetemp163)*xformL12 + (csetemp168 + \n+ csetemp169 + csetemp170 + csetemp171)*xformL22 + (csetemp172 + \n+ csetemp173 + csetemp174 + csetemp175)*xformL32) + xformL32*((csetemp152 \n+ + csetemp153 + csetemp154 + csetemp155)*xformL02 + (csetemp164 + \n+ csetemp165 + csetemp166 + csetemp167)*xformL12 + (csetemp172 + \n+ csetemp173 + csetemp174 + csetemp175)*xformL22 + (csetemp176 + \n+ csetemp177 + csetemp178 + csetemp179)*xformL32);\n+ \n+ CCTK_REAL dg4223 CCTK_ATTRIBUTE_UNUSED = xformL02*((csetemp180 + \n+ csetemp181 + csetemp182 + csetemp183)*xformL02 + (csetemp184 + \n+ csetemp185 + csetemp186 + csetemp187)*xformL12 + (csetemp188 + \n+ csetemp189 + csetemp190 + csetemp191)*xformL22 + (csetemp192 + \n+ csetemp193 + csetemp194 + csetemp195)*xformL32) + xformL12*((csetemp184 \n+ + csetemp185 + csetemp186 + csetemp187)*xformL02 + (csetemp196 + \n+ csetemp197 + csetemp198 + csetemp199)*xformL12 + (csetemp200 + \n+ csetemp201 + csetemp202 + csetemp203)*xformL22 + (csetemp204 + \n+ csetemp205 + csetemp206 + csetemp207)*xformL32) + xformL22*((csetemp188 \n+ + csetemp189 + csetemp190 + csetemp191)*xformL02 + (csetemp200 + \n+ csetemp201 + csetemp202 + csetemp203)*xformL12 + (csetemp208 + \n+ csetemp209 + csetemp210 + csetemp211)*xformL22 + (csetemp212 + \n+ csetemp213 + csetemp214 + csetemp215)*xformL32) + xformL32*((csetemp192 \n+ + csetemp193 + csetemp194 + csetemp195)*xformL02 + (csetemp204 + \n+ csetemp205 + csetemp206 + csetemp207)*xformL12 + (csetemp212 + \n+ csetemp213 + csetemp214 + csetemp215)*xformL22 + (csetemp216 + \n+ csetemp217 + csetemp218 + csetemp219)*xformL32);\n+ \n+ CCTK_REAL dg4230 CCTK_ATTRIBUTE_UNUSED = xformL02*((csetemp60 + \n+ csetemp61 + csetemp62 + csetemp63)*xformL03 + (csetemp64 + csetemp65 + \n+ csetemp66 + csetemp67)*xformL13 + (csetemp68 + csetemp69 + csetemp70 + \n+ csetemp71)*xformL23 + (csetemp72 + csetemp73 + csetemp74 + \n+ csetemp75)*xformL33) + xformL12*((csetemp64 + csetemp65 + csetemp66 + \n+ csetemp67)*xformL03 + (csetemp76 + csetemp77 + csetemp78 + \n+ csetemp79)*xformL13 + (csetemp80 + csetemp81 + csetemp82 + \n+ csetemp83)*xformL23 + (csetemp84 + csetemp85 + csetemp86 + \n+ csetemp87)*xformL33) + xformL22*((csetemp68 + csetemp69 + csetemp70 + \n+ csetemp71)*xformL03 + (csetemp80 + csetemp81 + csetemp82 + \n+ csetemp83)*xformL13 + (csetemp88 + csetemp89 + csetemp90 + \n+ csetemp91)*xformL23 + (csetemp92 + csetemp93 + csetemp94 + \n+ csetemp95)*xformL33) + xformL32*((csetemp72 + csetemp73 + csetemp74 + \n+ csetemp75)*xformL03 + (csetemp84 + csetemp85 + csetemp86 + \n+ csetemp87)*xformL13 + (csetemp92 + csetemp93 + csetemp94 + \n+ csetemp95)*xformL23 + (csetemp96 + csetemp97 + csetemp98 + \n+ csetemp99)*xformL33);\n+ \n+ CCTK_REAL dg4231 CCTK_ATTRIBUTE_UNUSED = xformL02*((csetemp100 + \n+ csetemp101 + csetemp102 + csetemp103)*xformL03 + (csetemp104 + \n+ csetemp105 + csetemp106 + csetemp107)*xformL13 + (csetemp108 + \n+ csetemp109 + csetemp110 + csetemp111)*xformL23 + (csetemp112 + \n+ csetemp113 + csetemp114 + csetemp115)*xformL33) + xformL12*((csetemp104 \n+ + csetemp105 + csetemp106 + csetemp107)*xformL03 + (csetemp116 + \n+ csetemp117 + csetemp118 + csetemp119)*xformL13 + (csetemp120 + \n+ csetemp121 + csetemp122 + csetemp123)*xformL23 + (csetemp124 + \n+ csetemp125 + csetemp126 + csetemp127)*xformL33) + xformL22*((csetemp108 \n+ + csetemp109 + csetemp110 + csetemp111)*xformL03 + (csetemp120 + \n+ csetemp121 + csetemp122 + csetemp123)*xformL13 + (csetemp128 + \n+ csetemp129 + csetemp130 + csetemp131)*xformL23 + (csetemp132 + \n+ csetemp133 + csetemp134 + csetemp135)*xformL33) + xformL32*((csetemp112 \n+ + csetemp113 + csetemp114 + csetemp115)*xformL03 + (csetemp124 + \n+ csetemp125 + csetemp126 + csetemp127)*xformL13 + (csetemp132 + \n+ csetemp133 + csetemp134 + csetemp135)*xformL23 + (csetemp136 + \n+ csetemp137 + csetemp138 + csetemp139)*xformL33);\n+ \n+ CCTK_REAL dg4232 CCTK_ATTRIBUTE_UNUSED = xformL02*((csetemp140 + \n+ csetemp141 + csetemp142 + csetemp143)*xformL03 + (csetemp144 + \n+ csetemp145 + csetemp146 + csetemp147)*xformL13 + (csetemp148 + \n+ csetemp149 + csetemp150 + csetemp151)*xformL23 + (csetemp152 + \n+ csetemp153 + csetemp154 + csetemp155)*xformL33) + xformL12*((csetemp144 \n+ + csetemp145 + csetemp146 + csetemp147)*xformL03 + (csetemp156 + \n+ csetemp157 + csetemp158 + csetemp159)*xformL13 + (csetemp160 + \n+ csetemp161 + csetemp162 + csetemp163)*xformL23 + (csetemp164 + \n+ csetemp165 + csetemp166 + csetemp167)*xformL33) + xformL22*((csetemp148 \n+ + csetemp149 + csetemp150 + csetemp151)*xformL03 + (csetemp160 + \n+ csetemp161 + csetemp162 + csetemp163)*xformL13 + (csetemp168 + \n+ csetemp169 + csetemp170 + csetemp171)*xformL23 + (csetemp172 + \n+ csetemp173 + csetemp174 + csetemp175)*xformL33) + xformL32*((csetemp152 \n+ + csetemp153 + csetemp154 + csetemp155)*xformL03 + (csetemp164 + \n+ csetemp165 + csetemp166 + csetemp167)*xformL13 + (csetemp172 + \n+ csetemp173 + csetemp174 + csetemp175)*xformL23 + (csetemp176 + \n+ csetemp177 + csetemp178 + csetemp179)*xformL33);\n+ \n+ CCTK_REAL dg4233 CCTK_ATTRIBUTE_UNUSED = xformL02*((csetemp180 + \n+ csetemp181 + csetemp182 + csetemp183)*xformL03 + (csetemp184 + \n+ csetemp185 + csetemp186 + csetemp187)*xformL13 + (csetemp188 + \n+ csetemp189 + csetemp190 + csetemp191)*xformL23 + (csetemp192 + \n+ csetemp193 + csetemp194 + csetemp195)*xformL33) + xformL12*((csetemp184 \n+ + csetemp185 + csetemp186 + csetemp187)*xformL03 + (csetemp196 + \n+ csetemp197 + csetemp198 + csetemp199)*xformL13 + (csetemp200 + \n+ csetemp201 + csetemp202 + csetemp203)*xformL23 + (csetemp204 + \n+ csetemp205 + csetemp206 + csetemp207)*xformL33) + xformL22*((csetemp188 \n+ + csetemp189 + csetemp190 + csetemp191)*xformL03 + (csetemp200 + \n+ csetemp201 + csetemp202 + csetemp203)*xformL13 + (csetemp208 + \n+ csetemp209 + csetemp210 + csetemp211)*xformL23 + (csetemp212 + \n+ csetemp213 + csetemp214 + csetemp215)*xformL33) + xformL32*((csetemp192 \n+ + csetemp193 + csetemp194 + csetemp195)*xformL03 + (csetemp204 + \n+ csetemp205 + csetemp206 + csetemp207)*xformL13 + (csetemp212 + \n+ csetemp213 + csetemp214 + csetemp215)*xformL23 + (csetemp216 + \n+ csetemp217 + csetemp218 + csetemp219)*xformL33);\n+ \n+ CCTK_REAL dg4330 CCTK_ATTRIBUTE_UNUSED = xformL03*((csetemp60 + \n+ csetemp61 + csetemp62 + csetemp63)*xformL03 + (csetemp64 + csetemp65 + \n+ csetemp66 + csetemp67)*xformL13 + (csetemp68 + csetemp69 + csetemp70 + \n+ csetemp71)*xformL23 + (csetemp72 + csetemp73 + csetemp74 + \n+ csetemp75)*xformL33) + xformL13*((csetemp64 + csetemp65 + csetemp66 + \n+ csetemp67)*xformL03 + (csetemp76 + csetemp77 + csetemp78 + \n+ csetemp79)*xformL13 + (csetemp80 + csetemp81 + csetemp82 + \n+ csetemp83)*xformL23 + (csetemp84 + csetemp85 + csetemp86 + \n+ csetemp87)*xformL33) + xformL23*((csetemp68 + csetemp69 + csetemp70 + \n+ csetemp71)*xformL03 + (csetemp80 + csetemp81 + csetemp82 + \n+ csetemp83)*xformL13 + (csetemp88 + csetemp89 + csetemp90 + \n+ csetemp91)*xformL23 + (csetemp92 + csetemp93 + csetemp94 + \n+ csetemp95)*xformL33) + xformL33*((csetemp72 + csetemp73 + csetemp74 + \n+ csetemp75)*xformL03 + (csetemp84 + csetemp85 + csetemp86 + \n+ csetemp87)*xformL13 + (csetemp92 + csetemp93 + csetemp94 + \n+ csetemp95)*xformL23 + (csetemp96 + csetemp97 + csetemp98 + \n+ csetemp99)*xformL33);\n+ \n+ CCTK_REAL dg4331 CCTK_ATTRIBUTE_UNUSED = xformL03*((csetemp100 + \n+ csetemp101 + csetemp102 + csetemp103)*xformL03 + (csetemp104 + \n+ csetemp105 + csetemp106 + csetemp107)*xformL13 + (csetemp108 + \n+ csetemp109 + csetemp110 + csetemp111)*xformL23 + (csetemp112 + \n+ csetemp113 + csetemp114 + csetemp115)*xformL33) + xformL13*((csetemp104 \n+ + csetemp105 + csetemp106 + csetemp107)*xformL03 + (csetemp116 + \n+ csetemp117 + csetemp118 + csetemp119)*xformL13 + (csetemp120 + \n+ csetemp121 + csetemp122 + csetemp123)*xformL23 + (csetemp124 + \n+ csetemp125 + csetemp126 + csetemp127)*xformL33) + xformL23*((csetemp108 \n+ + csetemp109 + csetemp110 + csetemp111)*xformL03 + (csetemp120 + \n+ csetemp121 + csetemp122 + csetemp123)*xformL13 + (csetemp128 + \n+ csetemp129 + csetemp130 + csetemp131)*xformL23 + (csetemp132 + \n+ csetemp133 + csetemp134 + csetemp135)*xformL33) + xformL33*((csetemp112 \n+ + csetemp113 + csetemp114 + csetemp115)*xformL03 + (csetemp124 + \n+ csetemp125 + csetemp126 + csetemp127)*xformL13 + (csetemp132 + \n+ csetemp133 + csetemp134 + csetemp135)*xformL23 + (csetemp136 + \n+ csetemp137 + csetemp138 + csetemp139)*xformL33);\n+ \n+ CCTK_REAL dg4332 CCTK_ATTRIBUTE_UNUSED = xformL03*((csetemp140 + \n+ csetemp141 + csetemp142 + csetemp143)*xformL03 + (csetemp144 + \n+ csetemp145 + csetemp146 + csetemp147)*xformL13 + (csetemp148 + \n+ csetemp149 + csetemp150 + csetemp151)*xformL23 + (csetemp152 + \n+ csetemp153 + csetemp154 + csetemp155)*xformL33) + xformL13*((csetemp144 \n+ + csetemp145 + csetemp146 + csetemp147)*xformL03 + (csetemp156 + \n+ csetemp157 + csetemp158 + csetemp159)*xformL13 + (csetemp160 + \n+ csetemp161 + csetemp162 + csetemp163)*xformL23 + (csetemp164 + \n+ csetemp165 + csetemp166 + csetemp167)*xformL33) + xformL23*((csetemp148 \n+ + csetemp149 + csetemp150 + csetemp151)*xformL03 + (csetemp160 + \n+ csetemp161 + csetemp162 + csetemp163)*xformL13 + (csetemp168 + \n+ csetemp169 + csetemp170 + csetemp171)*xformL23 + (csetemp172 + \n+ csetemp173 + csetemp174 + csetemp175)*xformL33) + xformL33*((csetemp152 \n+ + csetemp153 + csetemp154 + csetemp155)*xformL03 + (csetemp164 + \n+ csetemp165 + csetemp166 + csetemp167)*xformL13 + (csetemp172 + \n+ csetemp173 + csetemp174 + csetemp175)*xformL23 + (csetemp176 + \n+ csetemp177 + csetemp178 + csetemp179)*xformL33);\n+ \n+ CCTK_REAL dg4333 CCTK_ATTRIBUTE_UNUSED = xformL03*((csetemp180 + \n+ csetemp181 + csetemp182 + csetemp183)*xformL03 + (csetemp184 + \n+ csetemp185 + csetemp186 + csetemp187)*xformL13 + (csetemp188 + \n+ csetemp189 + csetemp190 + csetemp191)*xformL23 + (csetemp192 + \n+ csetemp193 + csetemp194 + csetemp195)*xformL33) + xformL13*((csetemp184 \n+ + csetemp185 + csetemp186 + csetemp187)*xformL03 + (csetemp196 + \n+ csetemp197 + csetemp198 + csetemp199)*xformL13 + (csetemp200 + \n+ csetemp201 + csetemp202 + csetemp203)*xformL23 + (csetemp204 + \n+ csetemp205 + csetemp206 + csetemp207)*xformL33) + xformL23*((csetemp188 \n+ + csetemp189 + csetemp190 + csetemp191)*xformL03 + (csetemp200 + \n+ csetemp201 + csetemp202 + csetemp203)*xformL13 + (csetemp208 + \n+ csetemp209 + csetemp210 + csetemp211)*xformL23 + (csetemp212 + \n+ csetemp213 + csetemp214 + csetemp215)*xformL33) + xformL33*((csetemp192 \n+ + csetemp193 + csetemp194 + csetemp195)*xformL03 + (csetemp204 + \n+ csetemp205 + csetemp206 + csetemp207)*xformL13 + (csetemp212 + \n+ csetemp213 + csetemp214 + csetemp215)*xformL23 + (csetemp216 + \n+ csetemp217 + csetemp218 + csetemp219)*xformL33);\n+ \n+ CCTK_REAL betal1 CCTK_ATTRIBUTE_UNUSED = g401;\n+ \n+ CCTK_REAL betal2 CCTK_ATTRIBUTE_UNUSED = g402;\n+ \n+ CCTK_REAL betal3 CCTK_ATTRIBUTE_UNUSED = g403;\n+ \n+ CCTK_REAL gerr11L CCTK_ATTRIBUTE_UNUSED = gxxL - g411;\n+ \n+ CCTK_REAL gerr12L CCTK_ATTRIBUTE_UNUSED = gxyL - g412;\n+ \n+ CCTK_REAL gerr13L CCTK_ATTRIBUTE_UNUSED = gxzL - g413;\n+ \n+ CCTK_REAL gerr22L CCTK_ATTRIBUTE_UNUSED = gyyL - g422;\n+ \n+ CCTK_REAL gerr23L CCTK_ATTRIBUTE_UNUSED = gyzL - g423;\n+ \n+ CCTK_REAL gerr33L CCTK_ATTRIBUTE_UNUSED = gzzL - g433;\n+ \n+ CCTK_REAL csetemp220 CCTK_ATTRIBUTE_UNUSED = SQR(gxzL);\n+ \n+ CCTK_REAL csetemp221 CCTK_ATTRIBUTE_UNUSED = SQR(gyzL);\n+ \n+ CCTK_REAL csetemp222 CCTK_ATTRIBUTE_UNUSED = SQR(gxyL);\n+ \n+ CCTK_REAL detg CCTK_ATTRIBUTE_UNUSED = 2*gxyL*gxzL*gyzL + \n+ gyyL*(gxxL*gzzL - csetemp220) - gxxL*csetemp221 - gzzL*csetemp222;\n+ \n+ CCTK_REAL csetemp223 CCTK_ATTRIBUTE_UNUSED = INV(detg);\n+ \n+ CCTK_REAL gu11 CCTK_ATTRIBUTE_UNUSED = (gyyL*gzzL - \n+ csetemp221)*csetemp223;\n+ \n+ CCTK_REAL gu12 CCTK_ATTRIBUTE_UNUSED = (gxzL*gyzL - \n+ gxyL*gzzL)*csetemp223;\n+ \n+ CCTK_REAL gu13 CCTK_ATTRIBUTE_UNUSED = (-(gxzL*gyyL) + \n+ gxyL*gyzL)*csetemp223;\n+ \n+ CCTK_REAL gu22 CCTK_ATTRIBUTE_UNUSED = (gxxL*gzzL - \n+ csetemp220)*csetemp223;\n+ \n+ CCTK_REAL gu23 CCTK_ATTRIBUTE_UNUSED = (gxyL*gxzL - \n+ gxxL*gyzL)*csetemp223;\n+ \n+ CCTK_REAL gu33 CCTK_ATTRIBUTE_UNUSED = (gxxL*gyyL - \n+ csetemp222)*csetemp223;\n+ \n+ CCTK_REAL betaerr1L CCTK_ATTRIBUTE_UNUSED = betaxL - betal1*gu11 - \n+ betal2*gu12 - betal3*gu13;\n+ \n+ CCTK_REAL betaerr2L CCTK_ATTRIBUTE_UNUSED = betayL - betal1*gu12 - \n+ betal2*gu22 - betal3*gu23;\n+ \n+ CCTK_REAL betaerr3L CCTK_ATTRIBUTE_UNUSED = betazL - betal1*gu13 - \n+ betal2*gu23 - betal3*gu33;\n+ \n+ CCTK_REAL betasq CCTK_ATTRIBUTE_UNUSED = betaxL*betal1 + betayL*betal2 \n+ + betazL*betal3;\n+ \n+ CCTK_REAL alperrL CCTK_ATTRIBUTE_UNUSED = alpL - sqrt(betasq - g400);\n+ \n+ CCTK_REAL dtg11 CCTK_ATTRIBUTE_UNUSED = dg4110;\n+ \n+ CCTK_REAL dtg12 CCTK_ATTRIBUTE_UNUSED = dg4120;\n+ \n+ CCTK_REAL dtg13 CCTK_ATTRIBUTE_UNUSED = dg4130;\n+ \n+ CCTK_REAL dtg22 CCTK_ATTRIBUTE_UNUSED = dg4220;\n+ \n+ CCTK_REAL dtg23 CCTK_ATTRIBUTE_UNUSED = dg4230;\n+ \n+ CCTK_REAL dtg33 CCTK_ATTRIBUTE_UNUSED = dg4330;\n+ \n+ CCTK_REAL dg111 CCTK_ATTRIBUTE_UNUSED = dg4111;\n+ \n+ CCTK_REAL dg112 CCTK_ATTRIBUTE_UNUSED = dg4112;\n+ \n+ CCTK_REAL dg113 CCTK_ATTRIBUTE_UNUSED = dg4113;\n+ \n+ CCTK_REAL dg121 CCTK_ATTRIBUTE_UNUSED = dg4121;\n+ \n+ CCTK_REAL dg122 CCTK_ATTRIBUTE_UNUSED = dg4122;\n+ \n+ CCTK_REAL dg123 CCTK_ATTRIBUTE_UNUSED = dg4123;\n+ \n+ CCTK_REAL dg131 CCTK_ATTRIBUTE_UNUSED = dg4131;\n+ \n+ CCTK_REAL dg132 CCTK_ATTRIBUTE_UNUSED = dg4132;\n+ \n+ CCTK_REAL dg133 CCTK_ATTRIBUTE_UNUSED = dg4133;\n+ \n+ CCTK_REAL dg221 CCTK_ATTRIBUTE_UNUSED = dg4221;\n+ \n+ CCTK_REAL dg222 CCTK_ATTRIBUTE_UNUSED = dg4222;\n+ \n+ CCTK_REAL dg223 CCTK_ATTRIBUTE_UNUSED = dg4223;\n+ \n+ CCTK_REAL dg231 CCTK_ATTRIBUTE_UNUSED = dg4231;\n+ \n+ CCTK_REAL dg232 CCTK_ATTRIBUTE_UNUSED = dg4232;\n+ \n+ CCTK_REAL dg233 CCTK_ATTRIBUTE_UNUSED = dg4233;\n+ \n+ CCTK_REAL dg331 CCTK_ATTRIBUTE_UNUSED = dg4331;\n+ \n+ CCTK_REAL dg332 CCTK_ATTRIBUTE_UNUSED = dg4332;\n+ \n+ CCTK_REAL dg333 CCTK_ATTRIBUTE_UNUSED = dg4333;\n+ \n+ CCTK_REAL csetemp224 CCTK_ATTRIBUTE_UNUSED = dtg11*gu11;\n+ \n+ CCTK_REAL csetemp225 CCTK_ATTRIBUTE_UNUSED = dtg12*gu12;\n+ \n+ CCTK_REAL csetemp226 CCTK_ATTRIBUTE_UNUSED = dtg13*gu13;\n+ \n+ CCTK_REAL csetemp227 CCTK_ATTRIBUTE_UNUSED = dtg12*gu11;\n+ \n+ CCTK_REAL csetemp228 CCTK_ATTRIBUTE_UNUSED = dtg22*gu12;\n+ \n+ CCTK_REAL csetemp229 CCTK_ATTRIBUTE_UNUSED = dtg23*gu13;\n+ \n+ CCTK_REAL csetemp230 CCTK_ATTRIBUTE_UNUSED = dtg13*gu11;\n+ \n+ CCTK_REAL csetemp231 CCTK_ATTRIBUTE_UNUSED = dtg23*gu12;\n+ \n+ CCTK_REAL csetemp232 CCTK_ATTRIBUTE_UNUSED = dtg33*gu13;\n+ \n+ CCTK_REAL dtgu11 CCTK_ATTRIBUTE_UNUSED = -((csetemp224 + csetemp225 + \n+ csetemp226)*gu11) - (csetemp227 + csetemp228 + csetemp229)*gu12 - \n+ (csetemp230 + csetemp231 + csetemp232)*gu13;\n+ \n+ CCTK_REAL dtgu12 CCTK_ATTRIBUTE_UNUSED = -((csetemp224 + csetemp225 + \n+ csetemp226)*gu12) - (csetemp227 + csetemp228 + csetemp229)*gu22 - \n+ (csetemp230 + csetemp231 + csetemp232)*gu23;\n+ \n+ CCTK_REAL dtgu13 CCTK_ATTRIBUTE_UNUSED = -((csetemp224 + csetemp225 + \n+ csetemp226)*gu13) - (csetemp227 + csetemp228 + csetemp229)*gu23 - \n+ (csetemp230 + csetemp231 + csetemp232)*gu33;\n+ \n+ CCTK_REAL csetemp233 CCTK_ATTRIBUTE_UNUSED = dtg11*gu12;\n+ \n+ CCTK_REAL csetemp234 CCTK_ATTRIBUTE_UNUSED = dtg12*gu22;\n+ \n+ CCTK_REAL csetemp235 CCTK_ATTRIBUTE_UNUSED = dtg13*gu23;\n+ \n+ CCTK_REAL csetemp236 CCTK_ATTRIBUTE_UNUSED = dtg22*gu22;\n+ \n+ CCTK_REAL csetemp237 CCTK_ATTRIBUTE_UNUSED = dtg23*gu23;\n+ \n+ CCTK_REAL csetemp238 CCTK_ATTRIBUTE_UNUSED = dtg13*gu12;\n+ \n+ CCTK_REAL csetemp239 CCTK_ATTRIBUTE_UNUSED = dtg23*gu22;\n+ \n+ CCTK_REAL csetemp240 CCTK_ATTRIBUTE_UNUSED = dtg33*gu23;\n+ \n+ CCTK_REAL dtgu22 CCTK_ATTRIBUTE_UNUSED = -((csetemp233 + csetemp234 + \n+ csetemp235)*gu12) - (csetemp225 + csetemp236 + csetemp237)*gu22 - \n+ (csetemp238 + csetemp239 + csetemp240)*gu23;\n+ \n+ CCTK_REAL dtgu23 CCTK_ATTRIBUTE_UNUSED = -((csetemp233 + csetemp234 + \n+ csetemp235)*gu13) - (csetemp225 + csetemp236 + csetemp237)*gu23 - \n+ (csetemp238 + csetemp239 + csetemp240)*gu33;\n+ \n+ CCTK_REAL dtgu33 CCTK_ATTRIBUTE_UNUSED = -(gu13*(dtg11*gu13 + \n+ dtg12*gu23 + dtg13*gu33)) - gu23*(dtg12*gu13 + dtg22*gu23 + dtg23*gu33) \n+ - gu33*(csetemp226 + csetemp237 + dtg33*gu33);\n+ \n+ CCTK_REAL csetemp241 CCTK_ATTRIBUTE_UNUSED = dg111*gu11;\n+ \n+ CCTK_REAL csetemp242 CCTK_ATTRIBUTE_UNUSED = dg121*gu12;\n+ \n+ CCTK_REAL csetemp243 CCTK_ATTRIBUTE_UNUSED = dg131*gu13;\n+ \n+ CCTK_REAL csetemp244 CCTK_ATTRIBUTE_UNUSED = dg121*gu11;\n+ \n+ CCTK_REAL csetemp245 CCTK_ATTRIBUTE_UNUSED = dg221*gu12;\n+ \n+ CCTK_REAL csetemp246 CCTK_ATTRIBUTE_UNUSED = dg231*gu13;\n+ \n+ CCTK_REAL csetemp247 CCTK_ATTRIBUTE_UNUSED = dg131*gu11;\n+ \n+ CCTK_REAL csetemp248 CCTK_ATTRIBUTE_UNUSED = dg231*gu12;\n+ \n+ CCTK_REAL csetemp249 CCTK_ATTRIBUTE_UNUSED = dg331*gu13;\n+ \n+ CCTK_REAL dgu111 CCTK_ATTRIBUTE_UNUSED = -((csetemp241 + csetemp242 + \n+ csetemp243)*gu11) - (csetemp244 + csetemp245 + csetemp246)*gu12 - \n+ (csetemp247 + csetemp248 + csetemp249)*gu13;\n+ \n+ CCTK_REAL dgu121 CCTK_ATTRIBUTE_UNUSED = -((csetemp241 + csetemp242 + \n+ csetemp243)*gu12) - (csetemp244 + csetemp245 + csetemp246)*gu22 - \n+ (csetemp247 + csetemp248 + csetemp249)*gu23;\n+ \n+ CCTK_REAL dgu131 CCTK_ATTRIBUTE_UNUSED = -((csetemp241 + csetemp242 + \n+ csetemp243)*gu13) - (csetemp244 + csetemp245 + csetemp246)*gu23 - \n+ (csetemp247 + csetemp248 + csetemp249)*gu33;\n+ \n+ CCTK_REAL csetemp250 CCTK_ATTRIBUTE_UNUSED = dg111*gu12;\n+ \n+ CCTK_REAL csetemp251 CCTK_ATTRIBUTE_UNUSED = dg121*gu22;\n+ \n+ CCTK_REAL csetemp252 CCTK_ATTRIBUTE_UNUSED = dg131*gu23;\n+ \n+ CCTK_REAL csetemp253 CCTK_ATTRIBUTE_UNUSED = dg221*gu22;\n+ \n+ CCTK_REAL csetemp254 CCTK_ATTRIBUTE_UNUSED = dg231*gu23;\n+ \n+ CCTK_REAL csetemp255 CCTK_ATTRIBUTE_UNUSED = dg131*gu12;\n+ \n+ CCTK_REAL csetemp256 CCTK_ATTRIBUTE_UNUSED = dg231*gu22;\n+ \n+ CCTK_REAL csetemp257 CCTK_ATTRIBUTE_UNUSED = dg331*gu23;\n+ \n+ CCTK_REAL dgu221 CCTK_ATTRIBUTE_UNUSED = -((csetemp250 + csetemp251 + \n+ csetemp252)*gu12) - (csetemp242 + csetemp253 + csetemp254)*gu22 - \n+ (csetemp255 + csetemp256 + csetemp257)*gu23;\n+ \n+ CCTK_REAL dgu231 CCTK_ATTRIBUTE_UNUSED = -((csetemp250 + csetemp251 + \n+ csetemp252)*gu13) - (csetemp242 + csetemp253 + csetemp254)*gu23 - \n+ (csetemp255 + csetemp256 + csetemp257)*gu33;\n+ \n+ CCTK_REAL dgu331 CCTK_ATTRIBUTE_UNUSED = -(gu13*(dg111*gu13 + \n+ dg121*gu23 + dg131*gu33)) - gu23*(dg121*gu13 + dg221*gu23 + dg231*gu33) \n+ - gu33*(csetemp243 + csetemp254 + dg331*gu33);\n+ \n+ CCTK_REAL csetemp258 CCTK_ATTRIBUTE_UNUSED = dg112*gu11;\n+ \n+ CCTK_REAL csetemp259 CCTK_ATTRIBUTE_UNUSED = dg122*gu12;\n+ \n+ CCTK_REAL csetemp260 CCTK_ATTRIBUTE_UNUSED = dg132*gu13;\n+ \n+ CCTK_REAL csetemp261 CCTK_ATTRIBUTE_UNUSED = dg122*gu11;\n+ \n+ CCTK_REAL csetemp262 CCTK_ATTRIBUTE_UNUSED = dg222*gu12;\n+ \n+ CCTK_REAL csetemp263 CCTK_ATTRIBUTE_UNUSED = dg232*gu13;\n+ \n+ CCTK_REAL csetemp264 CCTK_ATTRIBUTE_UNUSED = dg132*gu11;\n+ \n+ CCTK_REAL csetemp265 CCTK_ATTRIBUTE_UNUSED = dg232*gu12;\n+ \n+ CCTK_REAL csetemp266 CCTK_ATTRIBUTE_UNUSED = dg332*gu13;\n+ \n+ CCTK_REAL dgu112 CCTK_ATTRIBUTE_UNUSED = -((csetemp258 + csetemp259 + \n+ csetemp260)*gu11) - (csetemp261 + csetemp262 + csetemp263)*gu12 - \n+ (csetemp264 + csetemp265 + csetemp266)*gu13;\n+ \n+ CCTK_REAL dgu122 CCTK_ATTRIBUTE_UNUSED = -((csetemp258 + csetemp259 + \n+ csetemp260)*gu12) - (csetemp261 + csetemp262 + csetemp263)*gu22 - \n+ (csetemp264 + csetemp265 + csetemp266)*gu23;\n+ \n+ CCTK_REAL dgu132 CCTK_ATTRIBUTE_UNUSED = -((csetemp258 + csetemp259 + \n+ csetemp260)*gu13) - (csetemp261 + csetemp262 + csetemp263)*gu23 - \n+ (csetemp264 + csetemp265 + csetemp266)*gu33;\n+ \n+ CCTK_REAL csetemp267 CCTK_ATTRIBUTE_UNUSED = dg112*gu12;\n+ \n+ CCTK_REAL csetemp268 CCTK_ATTRIBUTE_UNUSED = dg122*gu22;\n+ \n+ CCTK_REAL csetemp269 CCTK_ATTRIBUTE_UNUSED = dg132*gu23;\n+ \n+ CCTK_REAL csetemp270 CCTK_ATTRIBUTE_UNUSED = dg222*gu22;\n+ \n+ CCTK_REAL csetemp271 CCTK_ATTRIBUTE_UNUSED = dg232*gu23;\n+ \n+ CCTK_REAL csetemp272 CCTK_ATTRIBUTE_UNUSED = dg132*gu12;\n+ \n+ CCTK_REAL csetemp273 CCTK_ATTRIBUTE_UNUSED = dg232*gu22;\n+ \n+ CCTK_REAL csetemp274 CCTK_ATTRIBUTE_UNUSED = dg332*gu23;\n+ \n+ CCTK_REAL dgu222 CCTK_ATTRIBUTE_UNUSED = -((csetemp267 + csetemp268 + \n+ csetemp269)*gu12) - (csetemp259 + csetemp270 + csetemp271)*gu22 - \n+ (csetemp272 + csetemp273 + csetemp274)*gu23;\n+ \n+ CCTK_REAL dgu232 CCTK_ATTRIBUTE_UNUSED = -((csetemp267 + csetemp268 + \n+ csetemp269)*gu13) - (csetemp259 + csetemp270 + csetemp271)*gu23 - \n+ (csetemp272 + csetemp273 + csetemp274)*gu33;\n+ \n+ CCTK_REAL dgu332 CCTK_ATTRIBUTE_UNUSED = -(gu13*(dg112*gu13 + \n+ dg122*gu23 + dg132*gu33)) - gu23*(dg122*gu13 + dg222*gu23 + dg232*gu33) \n+ - gu33*(csetemp260 + csetemp271 + dg332*gu33);\n+ \n+ CCTK_REAL csetemp275 CCTK_ATTRIBUTE_UNUSED = dg113*gu11;\n+ \n+ CCTK_REAL csetemp276 CCTK_ATTRIBUTE_UNUSED = dg123*gu12;\n+ \n+ CCTK_REAL csetemp277 CCTK_ATTRIBUTE_UNUSED = dg133*gu13;\n+ \n+ CCTK_REAL csetemp278 CCTK_ATTRIBUTE_UNUSED = dg123*gu11;\n+ \n+ CCTK_REAL csetemp279 CCTK_ATTRIBUTE_UNUSED = dg223*gu12;\n+ \n+ CCTK_REAL csetemp280 CCTK_ATTRIBUTE_UNUSED = dg233*gu13;\n+ \n+ CCTK_REAL csetemp281 CCTK_ATTRIBUTE_UNUSED = dg133*gu11;\n+ \n+ CCTK_REAL csetemp282 CCTK_ATTRIBUTE_UNUSED = dg233*gu12;\n+ \n+ CCTK_REAL csetemp283 CCTK_ATTRIBUTE_UNUSED = dg333*gu13;\n+ \n+ CCTK_REAL dgu113 CCTK_ATTRIBUTE_UNUSED = -((csetemp275 + csetemp276 + \n+ csetemp277)*gu11) - (csetemp278 + csetemp279 + csetemp280)*gu12 - \n+ (csetemp281 + csetemp282 + csetemp283)*gu13;\n+ \n+ CCTK_REAL dgu123 CCTK_ATTRIBUTE_UNUSED = -((csetemp275 + csetemp276 + \n+ csetemp277)*gu12) - (csetemp278 + csetemp279 + csetemp280)*gu22 - \n+ (csetemp281 + csetemp282 + csetemp283)*gu23;\n+ \n+ CCTK_REAL dgu133 CCTK_ATTRIBUTE_UNUSED = -((csetemp275 + csetemp276 + \n+ csetemp277)*gu13) - (csetemp278 + csetemp279 + csetemp280)*gu23 - \n+ (csetemp281 + csetemp282 + csetemp283)*gu33;\n+ \n+ CCTK_REAL csetemp284 CCTK_ATTRIBUTE_UNUSED = dg113*gu12;\n+ \n+ CCTK_REAL csetemp285 CCTK_ATTRIBUTE_UNUSED = dg123*gu22;\n+ \n+ CCTK_REAL csetemp286 CCTK_ATTRIBUTE_UNUSED = dg133*gu23;\n+ \n+ CCTK_REAL csetemp287 CCTK_ATTRIBUTE_UNUSED = dg223*gu22;\n+ \n+ CCTK_REAL csetemp288 CCTK_ATTRIBUTE_UNUSED = dg233*gu23;\n+ \n+ CCTK_REAL csetemp289 CCTK_ATTRIBUTE_UNUSED = dg133*gu12;\n+ \n+ CCTK_REAL csetemp290 CCTK_ATTRIBUTE_UNUSED = dg233*gu22;\n+ \n+ CCTK_REAL csetemp291 CCTK_ATTRIBUTE_UNUSED = dg333*gu23;\n+ \n+ CCTK_REAL dgu223 CCTK_ATTRIBUTE_UNUSED = -((csetemp284 + csetemp285 + \n+ csetemp286)*gu12) - (csetemp276 + csetemp287 + csetemp288)*gu22 - \n+ (csetemp289 + csetemp290 + csetemp291)*gu23;\n+ \n+ CCTK_REAL dgu233 CCTK_ATTRIBUTE_UNUSED = -((csetemp284 + csetemp285 + \n+ csetemp286)*gu13) - (csetemp276 + csetemp287 + csetemp288)*gu23 - \n+ (csetemp289 + csetemp290 + csetemp291)*gu33;\n+ \n+ CCTK_REAL dgu333 CCTK_ATTRIBUTE_UNUSED = -(gu13*(dg113*gu13 + \n+ dg123*gu23 + dg133*gu33)) - gu23*(dg123*gu13 + dg223*gu23 + dg233*gu33) \n+ - gu33*(csetemp277 + csetemp288 + dg333*gu33);\n+ \n+ CCTK_REAL dtbetal1 CCTK_ATTRIBUTE_UNUSED = dg4010;\n+ \n+ CCTK_REAL dtbetal2 CCTK_ATTRIBUTE_UNUSED = dg4020;\n+ \n+ CCTK_REAL dtbetal3 CCTK_ATTRIBUTE_UNUSED = dg4030;\n+ \n+ CCTK_REAL dbetal11 CCTK_ATTRIBUTE_UNUSED = dg4011;\n+ \n+ CCTK_REAL dbetal12 CCTK_ATTRIBUTE_UNUSED = dg4012;\n+ \n+ CCTK_REAL dbetal13 CCTK_ATTRIBUTE_UNUSED = dg4013;\n+ \n+ CCTK_REAL dbetal21 CCTK_ATTRIBUTE_UNUSED = dg4021;\n+ \n+ CCTK_REAL dbetal22 CCTK_ATTRIBUTE_UNUSED = dg4022;\n+ \n+ CCTK_REAL dbetal23 CCTK_ATTRIBUTE_UNUSED = dg4023;\n+ \n+ CCTK_REAL dbetal31 CCTK_ATTRIBUTE_UNUSED = dg4031;\n+ \n+ CCTK_REAL dbetal32 CCTK_ATTRIBUTE_UNUSED = dg4032;\n+ \n+ CCTK_REAL dbetal33 CCTK_ATTRIBUTE_UNUSED = dg4033;\n+ \n+ CCTK_REAL dtbetaerr1L CCTK_ATTRIBUTE_UNUSED = dtbetaxL - betal1*dtgu11 \n+ - betal2*dtgu12 - betal3*dtgu13 - dtbetal1*gu11 - dtbetal2*gu12 - \n+ dtbetal3*gu13;\n+ \n+ CCTK_REAL dtbetaerr2L CCTK_ATTRIBUTE_UNUSED = dtbetayL - betal1*dtgu12 \n+ - betal2*dtgu22 - betal3*dtgu23 - dtbetal1*gu12 - dtbetal2*gu22 - \n+ dtbetal3*gu23;\n+ \n+ CCTK_REAL dtbetaerr3L CCTK_ATTRIBUTE_UNUSED = dtbetazL - betal1*dtgu13 \n+ - betal2*dtgu23 - betal3*dtgu33 - dtbetal1*gu13 - dtbetal2*gu23 - \n+ dtbetal3*gu33;\n+ \n+ CCTK_REAL dbeta11 CCTK_ATTRIBUTE_UNUSED = betal1*dgu111 + \n+ betal2*dgu121 + betal3*dgu131 + dbetal11*gu11 + dbetal21*gu12 + \n+ dbetal31*gu13;\n+ \n+ CCTK_REAL dbeta21 CCTK_ATTRIBUTE_UNUSED = betal1*dgu121 + \n+ betal2*dgu221 + betal3*dgu231 + dbetal11*gu12 + dbetal21*gu22 + \n+ dbetal31*gu23;\n+ \n+ CCTK_REAL dbeta31 CCTK_ATTRIBUTE_UNUSED = betal1*dgu131 + \n+ betal2*dgu231 + betal3*dgu331 + dbetal11*gu13 + dbetal21*gu23 + \n+ dbetal31*gu33;\n+ \n+ CCTK_REAL dbeta12 CCTK_ATTRIBUTE_UNUSED = betal1*dgu112 + \n+ betal2*dgu122 + betal3*dgu132 + dbetal12*gu11 + dbetal22*gu12 + \n+ dbetal32*gu13;\n+ \n+ CCTK_REAL dbeta22 CCTK_ATTRIBUTE_UNUSED = betal1*dgu122 + \n+ betal2*dgu222 + betal3*dgu232 + dbetal12*gu12 + dbetal22*gu22 + \n+ dbetal32*gu23;\n+ \n+ CCTK_REAL dbeta32 CCTK_ATTRIBUTE_UNUSED = betal1*dgu132 + \n+ betal2*dgu232 + betal3*dgu332 + dbetal12*gu13 + dbetal22*gu23 + \n+ dbetal32*gu33;\n+ \n+ CCTK_REAL dbeta13 CCTK_ATTRIBUTE_UNUSED = betal1*dgu113 + \n+ betal2*dgu123 + betal3*dgu133 + dbetal13*gu11 + dbetal23*gu12 + \n+ dbetal33*gu13;\n+ \n+ CCTK_REAL dbeta23 CCTK_ATTRIBUTE_UNUSED = betal1*dgu123 + \n+ betal2*dgu223 + betal3*dgu233 + dbetal13*gu12 + dbetal23*gu22 + \n+ dbetal33*gu23;\n+ \n+ CCTK_REAL dbeta33 CCTK_ATTRIBUTE_UNUSED = betal1*dgu133 + \n+ betal2*dgu233 + betal3*dgu333 + dbetal13*gu13 + dbetal23*gu23 + \n+ dbetal33*gu33;\n+ \n+ CCTK_REAL dtbetasq CCTK_ATTRIBUTE_UNUSED = dtbetaxL*betal1 + \n+ dtbetayL*betal2 + dtbetazL*betal3 + betaxL*dtbetal1 + betayL*dtbetal2 + \n+ betazL*dtbetal3;\n+ \n+ CCTK_REAL csetemp292 CCTK_ATTRIBUTE_UNUSED = INV(alpL);\n+ \n+ CCTK_REAL dtalperrL CCTK_ATTRIBUTE_UNUSED = dtalpL + \n+ 0.5*csetemp292*(dg4000 - dtbetasq);\n+ \n+ CCTK_REAL kerr11L CCTK_ATTRIBUTE_UNUSED = kxxL - \n+ 0.5*csetemp292*(2*(gxxL*dbeta11 + gxyL*dbeta21 + gxzL*dbeta31) + \n+ betaxL*dg111 + betayL*dg112 + betazL*dg113 - dtg11);\n+ \n+ CCTK_REAL kerr12L CCTK_ATTRIBUTE_UNUSED = kxyL - \n+ 0.5*csetemp292*(gxxL*dbeta12 + gyyL*dbeta21 + gxyL*(dbeta11 + dbeta22) \n+ + gyzL*dbeta31 + gxzL*dbeta32 + betaxL*dg121 + betayL*dg122 + \n+ betazL*dg123 - dtg12);\n+ \n+ CCTK_REAL kerr13L CCTK_ATTRIBUTE_UNUSED = kxzL - \n+ 0.5*csetemp292*(gxxL*dbeta13 + gyzL*dbeta21 + gxyL*dbeta23 + \n+ gzzL*dbeta31 + gxzL*(dbeta11 + dbeta33) + betaxL*dg131 + betayL*dg132 + \n+ betazL*dg133 - dtg13);\n+ \n+ CCTK_REAL kerr22L CCTK_ATTRIBUTE_UNUSED = kyyL - \n+ 0.5*csetemp292*(2*(gxyL*dbeta12 + gyyL*dbeta22 + gyzL*dbeta32) + \n+ betaxL*dg221 + betayL*dg222 + betazL*dg223 - dtg22);\n+ \n+ CCTK_REAL kerr23L CCTK_ATTRIBUTE_UNUSED = kyzL - \n+ 0.5*csetemp292*(gxzL*dbeta12 + gxyL*dbeta13 + gyyL*dbeta23 + \n+ gzzL*dbeta32 + gyzL*(dbeta22 + dbeta33) + betaxL*dg231 + betayL*dg232 + \n+ betazL*dg233 - dtg23);\n+ \n+ CCTK_REAL kerr33L CCTK_ATTRIBUTE_UNUSED = kzzL - \n+ 0.5*csetemp292*(2*(gxzL*dbeta13 + gyzL*dbeta23 + gzzL*dbeta33) + \n+ betaxL*dg331 + betayL*dg332 + betazL*dg333 - dtg33);\n+ /* Copy local copies back to grid functions */\n+ alperr[index] = alperrL;\n+ betaerr1[index] = betaerr1L;\n+ betaerr2[index] = betaerr2L;\n+ betaerr3[index] = betaerr3L;\n+ dtalperr[index] = dtalperrL;\n+ dtbetaerr1[index] = dtbetaerr1L;\n+ dtbetaerr2[index] = dtbetaerr2L;\n+ dtbetaerr3[index] = dtbetaerr3L;\n+ gerr11[index] = gerr11L;\n+ gerr12[index] = gerr12L;\n+ gerr13[index] = gerr13L;\n+ gerr22[index] = gerr22L;\n+ gerr23[index] = gerr23L;\n+ gerr33[index] = gerr33L;\n+ kerr11[index] = kerr11L;\n+ kerr12[index] = kerr12L;\n+ kerr13[index] = kerr13L;\n+ kerr22[index] = kerr22L;\n+ kerr23[index] = kerr23L;\n+ kerr33[index] = kerr33L;\n+ }\n+ CCTK_ENDLOOP3(ShiftedGaugeWave_error);\n+}\n+extern \"C\" void ShiftedGaugeWave_error(CCTK_ARGUMENTS)\n+{\n+ DECLARE_CCTK_ARGUMENTS;\n+ DECLARE_CCTK_PARAMETERS;\n+ \n+ if (verbose > 1)\n+ {\n+ CCTK_VInfo(CCTK_THORNSTRING,\"Entering ShiftedGaugeWave_error_Body\");\n+ }\n+ if (cctk_iteration % ShiftedGaugeWave_error_calc_every != ShiftedGaugeWave_error_calc_offset)\n+ {\n+ return;\n+ }\n+ \n+ const char* const groups[] = {\n+ \"admbase::curv\",\n+ \"admbase::dtlapse\",\n+ \"admbase::dtshift\",\n+ \"admbase::lapse\",\n+ \"admbase::metric\",\n+ \"admbase::shift\",\n+ \"ShiftedGaugeWave::curv_error\",\n+ \"ShiftedGaugeWave::dtlapse_error\",\n+ \"ShiftedGaugeWave::dtshift_error\",\n+ \"grid::coordinates\",\n+ \"ShiftedGaugeWave::lapse_error\",\n+ \"ShiftedGaugeWave::metric_error\",\n+ \"ShiftedGaugeWave::shift_error\"};\n+ AssertGroupStorage(cctkGH, \"ShiftedGaugeWave_error\", 13, groups);\n+ \n+ \n+ LoopOverEverything(cctkGH, ShiftedGaugeWave_error_Body);\n+ if (verbose > 1)\n+ {\n+ CCTK_VInfo(CCTK_THORNSTRING,\"Leaving ShiftedGaugeWave_error_Body\");\n+ }\n+}\n+\n+} // namespace ShiftedGaugeWave"}, "test": {"test_patch": "diff --git a/all_tests.txt b/all_tests.txt\nnew file mode 100644\nindex 0000000..0000000\n--- /dev/null\n+++ b/all_tests.txt\n@@ -0,0 +1,7 @@\n+GaugeWave\n+KS-tilted-EE\n+KerrSchild\n+Minkowski\n+ModifiedSchwarzschildBL\n+ShiftedGaugeWave\n+Vaidya2", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}30{"question_id": "MSB_einsteintoolkit_Cactus_pr36", "question_type": "multi_swe_bench", "description": "Add missing Vaidya2_error.cc in EinsteinExact/Vaidya2 (einsteintoolkit/Cactus#36)", "content": {"org": "einsteintoolkit", "repo": "Cactus", "pr_number": 36, "issue_title": "Add missing Vaidya2_error.cc in EinsteinExact/Vaidya2", "issue_body": "This PR adds the missing source file Vaidya2_error.cc to complete the EinsteinExact/Vaidya2 thorn implementation.", "base_commit": "HEAD", "resolved_issues": [{"number": 36, "title": "Implement the full functionality of Vaidya2", "body": "Please implement the full functionality of `Vaidya2` by finishing the code in `Vaidya2_error.cc`.\n\n## Thorn Information:\n- Name: Vaidya2\n- Target file: Vaidya2_error.cc\n\n## Interface Definition in interface.ccl:\n\n## Schedule Definition in schedule.ccl:\n\n## Parameters Definition in param.ccl:\n\n## Configuration Definition in configuration.ccl:\n\n## Documentation Context in readme.md and doc/documentation.tex\n\n## Related Code Context in src folder\n\n"}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/einsteintoolkit_m_cactus:pr-36", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/arrangements/EinsteinExact/Vaidya2/src/Vaidya2_error.cc b/arrangements/EinsteinExact/Vaidya2/src/Vaidya2_error.cc\nnew file mode 100644\nindex 0000000..0000000\n--- /dev/null\n+++ b/arrangements/EinsteinExact/Vaidya2/src/Vaidya2_error.cc\n@@ -0,0 +1,2180 @@\n+/* File produced by Kranc */\n+\n+#define KRANC_C\n+\n+#include <algorithm>\n+#include <assert.h>\n+#include <math.h>\n+#include <stdio.h>\n+#include <stdlib.h>\n+#include <string.h>\n+#include \"cctk.h\"\n+#include \"cctk_Arguments.h\"\n+#include \"cctk_Parameters.h\"\n+#include \"Kranc.hh\"\n+#include \"Differencing.h\"\n+#include \"loopcontrol.h\"\n+\n+/* Define macros used in calculations */\n+#define INITVALUE (42)\n+#define INV(x) ((CCTK_REAL)1.0 / (x))\n+#define SQR(x) ((x) * (x))\n+#define CUB(x) ((x) * SQR(x))\n+#define QAD(x) (SQR(SQR(x)))\n+\n+namespace Vaidya2 {\n+\n+\n+static void Vaidya2_error_Body(const cGH* restrict const cctkGH, const int dir, const int face, const CCTK_REAL normal[3], const CCTK_REAL tangentA[3], const CCTK_REAL tangentB[3], const int imin[3], const int imax[3], const int n_subblock_gfs, CCTK_REAL* restrict const subblock_gfs[])\n+{\n+ DECLARE_CCTK_ARGUMENTS;\n+ DECLARE_CCTK_PARAMETERS;\n+ \n+ /* Include user-supplied include files */\n+ /* Initialise finite differencing variables */\n+ const ptrdiff_t di CCTK_ATTRIBUTE_UNUSED = 1;\n+ const ptrdiff_t dj CCTK_ATTRIBUTE_UNUSED = CCTK_GFINDEX3D(cctkGH,0,1,0) - CCTK_GFINDEX3D(cctkGH,0,0,0);\n+ const ptrdiff_t dk CCTK_ATTRIBUTE_UNUSED = CCTK_GFINDEX3D(cctkGH,0,0,1) - CCTK_GFINDEX3D(cctkGH,0,0,0);\n+ const ptrdiff_t cdi CCTK_ATTRIBUTE_UNUSED = sizeof(CCTK_REAL) * di;\n+ const ptrdiff_t cdj CCTK_ATTRIBUTE_UNUSED = sizeof(CCTK_REAL) * dj;\n+ const ptrdiff_t cdk CCTK_ATTRIBUTE_UNUSED = sizeof(CCTK_REAL) * dk;\n+ const ptrdiff_t cctkLbnd1 CCTK_ATTRIBUTE_UNUSED = cctk_lbnd[0];\n+ const ptrdiff_t cctkLbnd2 CCTK_ATTRIBUTE_UNUSED = cctk_lbnd[1];\n+ const ptrdiff_t cctkLbnd3 CCTK_ATTRIBUTE_UNUSED = cctk_lbnd[2];\n+ const CCTK_REAL t CCTK_ATTRIBUTE_UNUSED = ToReal(cctk_time);\n+ const CCTK_REAL cctkOriginSpace1 CCTK_ATTRIBUTE_UNUSED = ToReal(CCTK_ORIGIN_SPACE(0));\n+ const CCTK_REAL cctkOriginSpace2 CCTK_ATTRIBUTE_UNUSED = ToReal(CCTK_ORIGIN_SPACE(1));\n+ const CCTK_REAL cctkOriginSpace3 CCTK_ATTRIBUTE_UNUSED = ToReal(CCTK_ORIGIN_SPACE(2));\n+ const CCTK_REAL dt CCTK_ATTRIBUTE_UNUSED = ToReal(CCTK_DELTA_TIME);\n+ const CCTK_REAL dx CCTK_ATTRIBUTE_UNUSED = ToReal(CCTK_DELTA_SPACE(0));\n+ const CCTK_REAL dy CCTK_ATTRIBUTE_UNUSED = ToReal(CCTK_DELTA_SPACE(1));\n+ const CCTK_REAL dz CCTK_ATTRIBUTE_UNUSED = ToReal(CCTK_DELTA_SPACE(2));\n+ const CCTK_REAL dxi CCTK_ATTRIBUTE_UNUSED = INV(dx);\n+ const CCTK_REAL dyi CCTK_ATTRIBUTE_UNUSED = INV(dy);\n+ const CCTK_REAL dzi CCTK_ATTRIBUTE_UNUSED = INV(dz);\n+ const CCTK_REAL khalf CCTK_ATTRIBUTE_UNUSED = 0.5;\n+ const CCTK_REAL kthird CCTK_ATTRIBUTE_UNUSED = \n+ 0.333333333333333333333333333333;\n+ const CCTK_REAL ktwothird CCTK_ATTRIBUTE_UNUSED = \n+ 0.666666666666666666666666666667;\n+ const CCTK_REAL kfourthird CCTK_ATTRIBUTE_UNUSED = \n+ 1.33333333333333333333333333333;\n+ const CCTK_REAL hdxi CCTK_ATTRIBUTE_UNUSED = 0.5*dxi;\n+ const CCTK_REAL hdyi CCTK_ATTRIBUTE_UNUSED = 0.5*dyi;\n+ const CCTK_REAL hdzi CCTK_ATTRIBUTE_UNUSED = 0.5*dzi;\n+ /* Initialize predefined quantities */\n+ /* Assign local copies of arrays functions */\n+ \n+ \n+ /* Calculate temporaries and arrays functions */\n+ /* Copy local copies back to grid functions */\n+ /* Loop over the grid points */\n+ const int imin0=imin[0];\n+ const int imin1=imin[1];\n+ const int imin2=imin[2];\n+ const int imax0=imax[0];\n+ const int imax1=imax[1];\n+ const int imax2=imax[2];\n+ #pragma omp parallel\n+ CCTK_LOOP3(Vaidya2_error,\n+ i,j,k, imin0,imin1,imin2, imax0,imax1,imax2,\n+ cctk_ash[0],cctk_ash[1],cctk_ash[2])\n+ {\n+ const ptrdiff_t index CCTK_ATTRIBUTE_UNUSED = di*i + dj*j + dk*k;\n+ /* Assign local copies of grid functions */\n+ \n+ CCTK_REAL alpL CCTK_ATTRIBUTE_UNUSED = alp[index];\n+ CCTK_REAL betaxL CCTK_ATTRIBUTE_UNUSED = betax[index];\n+ CCTK_REAL betayL CCTK_ATTRIBUTE_UNUSED = betay[index];\n+ CCTK_REAL betazL CCTK_ATTRIBUTE_UNUSED = betaz[index];\n+ CCTK_REAL dtalpL CCTK_ATTRIBUTE_UNUSED = dtalp[index];\n+ CCTK_REAL dtbetaxL CCTK_ATTRIBUTE_UNUSED = dtbetax[index];\n+ CCTK_REAL dtbetayL CCTK_ATTRIBUTE_UNUSED = dtbetay[index];\n+ CCTK_REAL dtbetazL CCTK_ATTRIBUTE_UNUSED = dtbetaz[index];\n+ CCTK_REAL gxxL CCTK_ATTRIBUTE_UNUSED = gxx[index];\n+ CCTK_REAL gxyL CCTK_ATTRIBUTE_UNUSED = gxy[index];\n+ CCTK_REAL gxzL CCTK_ATTRIBUTE_UNUSED = gxz[index];\n+ CCTK_REAL gyyL CCTK_ATTRIBUTE_UNUSED = gyy[index];\n+ CCTK_REAL gyzL CCTK_ATTRIBUTE_UNUSED = gyz[index];\n+ CCTK_REAL gzzL CCTK_ATTRIBUTE_UNUSED = gzz[index];\n+ CCTK_REAL kxxL CCTK_ATTRIBUTE_UNUSED = kxx[index];\n+ CCTK_REAL kxyL CCTK_ATTRIBUTE_UNUSED = kxy[index];\n+ CCTK_REAL kxzL CCTK_ATTRIBUTE_UNUSED = kxz[index];\n+ CCTK_REAL kyyL CCTK_ATTRIBUTE_UNUSED = kyy[index];\n+ CCTK_REAL kyzL CCTK_ATTRIBUTE_UNUSED = kyz[index];\n+ CCTK_REAL kzzL CCTK_ATTRIBUTE_UNUSED = kzz[index];\n+ CCTK_REAL xL CCTK_ATTRIBUTE_UNUSED = x[index];\n+ CCTK_REAL yL CCTK_ATTRIBUTE_UNUSED = y[index];\n+ CCTK_REAL zL CCTK_ATTRIBUTE_UNUSED = z[index];\n+ \n+ /* Include user supplied include files */\n+ /* Precompute derivatives */\n+ /* Calculate temporaries and grid functions */\n+ CCTK_REAL xform1L00 CCTK_ATTRIBUTE_UNUSED = 1;\n+ \n+ CCTK_REAL xform1L01 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL xform1L02 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL xform1L03 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL xform1L10 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL csetemp0 CCTK_ATTRIBUTE_UNUSED = cos(ToReal(phi));\n+ \n+ CCTK_REAL csetemp1 CCTK_ATTRIBUTE_UNUSED = cos(ToReal(psi));\n+ \n+ CCTK_REAL csetemp2 CCTK_ATTRIBUTE_UNUSED = cos(ToReal(theta));\n+ \n+ CCTK_REAL csetemp3 CCTK_ATTRIBUTE_UNUSED = sin(ToReal(phi));\n+ \n+ CCTK_REAL csetemp4 CCTK_ATTRIBUTE_UNUSED = sin(ToReal(psi));\n+ \n+ CCTK_REAL xform1L11 CCTK_ATTRIBUTE_UNUSED = csetemp0*csetemp1 - \n+ csetemp2*csetemp3*csetemp4;\n+ \n+ CCTK_REAL xform1L12 CCTK_ATTRIBUTE_UNUSED = csetemp1*csetemp3 + \n+ csetemp0*csetemp2*csetemp4;\n+ \n+ CCTK_REAL csetemp5 CCTK_ATTRIBUTE_UNUSED = sin(ToReal(theta));\n+ \n+ CCTK_REAL xform1L13 CCTK_ATTRIBUTE_UNUSED = csetemp4*csetemp5;\n+ \n+ CCTK_REAL xform1L20 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL xform1L21 CCTK_ATTRIBUTE_UNUSED = \n+ -(csetemp1*csetemp2*csetemp3) - csetemp0*csetemp4;\n+ \n+ CCTK_REAL xform1L22 CCTK_ATTRIBUTE_UNUSED = csetemp0*csetemp1*csetemp2 \n+ - csetemp3*csetemp4;\n+ \n+ CCTK_REAL xform1L23 CCTK_ATTRIBUTE_UNUSED = csetemp1*csetemp5;\n+ \n+ CCTK_REAL xform1L30 CCTK_ATTRIBUTE_UNUSED = 0;\n+ \n+ CCTK_REAL xform1L31 CCTK_ATTRIBUTE_UNUSED = csetemp3*csetemp5;\n+ \n+ CCTK_REAL xform1L32 CCTK_ATTRIBUTE_UNUSED = -(csetemp0*csetemp5);\n+ \n+ CCTK_REAL xform1L33 CCTK_ATTRIBUTE_UNUSED = csetemp2;\n+ \n+ CCTK_REAL csetemp6 CCTK_ATTRIBUTE_UNUSED = SQR(ToReal(boostx));\n+ \n+ CCTK_REAL csetemp7 CCTK_ATTRIBUTE_UNUSED = SQR(ToReal(boosty));\n+ \n+ CCTK_REAL csetemp8 CCTK_ATTRIBUTE_UNUSED = SQR(ToReal(boostz));\n+ \n+ CCTK_REAL csetemp9 CCTK_ATTRIBUTE_UNUSED = INV(ToReal(lapsefactor));\n+ \n+ CCTK_REAL xform2L00 CCTK_ATTRIBUTE_UNUSED = csetemp9*INV((-1 + \n+ csetemp6 + csetemp7 + csetemp8)*(1 + sqrt(1 - csetemp6 - csetemp7 - \n+ csetemp8)))*(1 - csetemp6 - csetemp7 - csetemp8 + sqrt(1 - csetemp6 - \n+ csetemp7 - csetemp8))*(-1 + ToReal(boostx)*ToReal(shiftaddx) + \n+ ToReal(boosty)*ToReal(shiftaddy) + ToReal(boostz)*ToReal(shiftaddz));\n+ \n+ CCTK_REAL xform2L01 CCTK_ATTRIBUTE_UNUSED = csetemp9*INV((-1 + \n+ csetemp6 + csetemp7 + csetemp8)*(1 + sqrt(1 - csetemp6 - csetemp7 - \n+ csetemp8)))*(1 - csetemp6 - csetemp7 - csetemp8 + sqrt(1 - csetemp6 - \n+ csetemp7 - csetemp8))*ToReal(boostx);\n+ \n+ CCTK_REAL xform2L02 CCTK_ATTRIBUTE_UNUSED = csetemp9*INV((-1 + \n+ csetemp6 + csetemp7 + csetemp8)*(1 + sqrt(1 - csetemp6 - csetemp7 - \n+ csetemp8)))*(1 - csetemp6 - csetemp7 - csetemp8 + sqrt(1 - csetemp6 - \n+ csetemp7 - csetemp8))*ToReal(boosty);\n+ \n+ CCTK_REAL xform2L03 CCTK_ATTRIBUTE_UNUSED = csetemp9*INV((-1 + \n+ csetemp6 + csetemp7 + csetemp8)*(1 + sqrt(1 - csetemp6 - csetemp7 - \n+ csetemp8)))*(1 - csetemp6 - csetemp7 - csetemp8 + sqrt(1 - csetemp6 - \n+ csetemp7 - csetemp8))*ToReal(boostz);\n+ \n+ CCTK_REAL xform2L10 CCTK_ATTRIBUTE_UNUSED = INV((-1 + csetemp6 + \n+ csetemp7 + csetemp8)*(1 + sqrt(1 - csetemp6 - csetemp7 - \n+ csetemp8)))*((csetemp6 + (-1 + csetemp7 + csetemp8)*(1 + sqrt(1 - \n+ csetemp6 - csetemp7 - csetemp8)))*ToReal(shiftaddx) - \n+ ToReal(boostx)*(-1 + csetemp6 + csetemp7 + csetemp8 + sqrt(1 - csetemp6 \n+ - csetemp7 - csetemp8)*(-1 + ToReal(boosty)*ToReal(shiftaddy) + \n+ ToReal(boostz)*ToReal(shiftaddz))));\n+ \n+ CCTK_REAL xform2L11 CCTK_ATTRIBUTE_UNUSED = INV((-1 + csetemp6 + \n+ csetemp7 + csetemp8)*(1 + sqrt(1 - csetemp6 - csetemp7 - \n+ csetemp8)))*(csetemp6 + (-1 + csetemp7 + csetemp8)*(1 + sqrt(1 - \n+ csetemp6 - csetemp7 - csetemp8)));\n+ \n+ CCTK_REAL xform2L12 CCTK_ATTRIBUTE_UNUSED = -(INV(-1 + csetemp6 + \n+ csetemp7 + csetemp8 - sqrt(1 - csetemp6 - csetemp7 - \n+ csetemp8))*ToReal(boostx)*ToReal(boosty));\n+ \n+ CCTK_REAL xform2L13 CCTK_ATTRIBUTE_UNUSED = -(INV(-1 + csetemp6 + \n+ csetemp7 + csetemp8 - sqrt(1 - csetemp6 - csetemp7 - \n+ csetemp8))*ToReal(boostx)*ToReal(boostz));\n+ \n+ CCTK_REAL xform2L20 CCTK_ATTRIBUTE_UNUSED = INV((-1 + csetemp6 + \n+ csetemp7 + csetemp8)*(1 + sqrt(1 - csetemp6 - csetemp7 - \n+ csetemp8)))*((csetemp7 + (-1 + csetemp6 + csetemp8)*(1 + sqrt(1 - \n+ csetemp6 - csetemp7 - csetemp8)))*ToReal(shiftaddy) - \n+ ToReal(boosty)*(-1 + csetemp6 + csetemp7 + csetemp8 + sqrt(1 - csetemp6 \n+ - csetemp7 - csetemp8)*(-1 + ToReal(boostx)*ToReal(shiftaddx) + \n+ ToReal(boostz)*ToReal(shiftaddz))));\n+ \n+ CCTK_REAL xform2L21 CCTK_ATTRIBUTE_UNUSED = -(INV(-1 + csetemp6 + \n+ csetemp7 + csetemp8 - sqrt(1 - csetemp6 - csetemp7 - \n+ csetemp8))*ToReal(boostx)*ToReal(boosty));\n+ \n+ CCTK_REAL xform2L22 CCTK_ATTRIBUTE_UNUSED = INV((-1 + csetemp6 + \n+ csetemp7 + csetemp8)*(1 + sqrt(1 - csetemp6 - csetemp7 - \n+ csetemp8)))*(csetemp7 + (-1 + csetemp6 + csetemp8)*(1 + sqrt(1 - \n+ csetemp6 - csetemp7 - csetemp8)));\n+ \n+ CCTK_REAL xform2L23 CCTK_ATTRIBUTE_UNUSED = -(INV(-1 + csetemp6 + \n+ csetemp7 + csetemp8 - sqrt(1 - csetemp6 - csetemp7 - \n+ csetemp8))*ToReal(boosty)*ToReal(boostz));\n+ \n+ CCTK_REAL xform2L30 CCTK_ATTRIBUTE_UNUSED = INV((-1 + csetemp6 + \n+ csetemp7 + csetemp8)*(1 + sqrt(1 - csetemp6 - csetemp7 - \n+ csetemp8)))*(-(ToReal(boostz)*(-1 + csetemp6 + csetemp7 + csetemp8 + \n+ sqrt(1 - csetemp6 - csetemp7 - csetemp8)*(-1 + \n+ ToReal(boostx)*ToReal(shiftaddx) + ToReal(boosty)*ToReal(shiftaddy)))) \n+ + (-1 + csetemp6 + csetemp7 + csetemp8 + (-1 + csetemp6 + \n+ csetemp7)*sqrt(1 - csetemp6 - csetemp7 - csetemp8))*ToReal(shiftaddz));\n+ \n+ CCTK_REAL xform2L31 CCTK_ATTRIBUTE_UNUSED = -(INV(-1 + csetemp6 + \n+ csetemp7 + csetemp8 - sqrt(1 - csetemp6 - csetemp7 - \n+ csetemp8))*ToReal(boostx)*ToReal(boostz));\n+ \n+ CCTK_REAL xform2L32 CCTK_ATTRIBUTE_UNUSED = -(INV(-1 + csetemp6 + \n+ csetemp7 + csetemp8 - sqrt(1 - csetemp6 - csetemp7 - \n+ csetemp8))*ToReal(boosty)*ToReal(boostz));\n+ \n+ CCTK_REAL xform2L33 CCTK_ATTRIBUTE_UNUSED = INV((-1 + csetemp6 + \n+ csetemp7 + csetemp8)*(1 + sqrt(1 - csetemp6 - csetemp7 - \n+ csetemp8)))*(-1 + csetemp6 + csetemp7 + csetemp8 + (-1 + csetemp6 + \n+ csetemp7)*sqrt(1 - csetemp6 - csetemp7 - csetemp8));\n+ \n+ CCTK_REAL xformL00 CCTK_ATTRIBUTE_UNUSED = xform1L00*xform2L00 + \n+ xform1L01*xform2L10 + xform1L02*xform2L20 + xform1L03*xform2L30;\n+ \n+ CCTK_REAL xformL01 CCTK_ATTRIBUTE_UNUSED = xform1L00*xform2L01 + \n+ xform1L01*xform2L11 + xform1L02*xform2L21 + xform1L03*xform2L31;\n+ \n+ CCTK_REAL xformL02 CCTK_ATTRIBUTE_UNUSED = xform1L00*xform2L02 + \n+ xform1L01*xform2L12 + xform1L02*xform2L22 + xform1L03*xform2L32;\n+ \n+ CCTK_REAL xformL03 CCTK_ATTRIBUTE_UNUSED = xform1L00*xform2L03 + \n+ xform1L01*xform2L13 + xform1L02*xform2L23 + xform1L03*xform2L33;\n+ \n+ CCTK_REAL xformL10 CCTK_ATTRIBUTE_UNUSED = xform1L10*xform2L00 + \n+ xform1L11*xform2L10 + xform1L12*xform2L20 + xform1L13*xform2L30;\n+ \n+ CCTK_REAL xformL11 CCTK_ATTRIBUTE_UNUSED = xform1L10*xform2L01 + \n+ xform1L11*xform2L11 + xform1L12*xform2L21 + xform1L13*xform2L31;\n+ \n+ CCTK_REAL xformL12 CCTK_ATTRIBUTE_UNUSED = xform1L10*xform2L02 + \n+ xform1L11*xform2L12 + xform1L12*xform2L22 + xform1L13*xform2L32;\n+ \n+ CCTK_REAL xformL13 CCTK_ATTRIBUTE_UNUSED = xform1L10*xform2L03 + \n+ xform1L11*xform2L13 + xform1L12*xform2L23 + xform1L13*xform2L33;\n+ \n+ CCTK_REAL xformL20 CCTK_ATTRIBUTE_UNUSED = xform1L20*xform2L00 + \n+ xform1L21*xform2L10 + xform1L22*xform2L20 + xform1L23*xform2L30;\n+ \n+ CCTK_REAL xformL21 CCTK_ATTRIBUTE_UNUSED = xform1L20*xform2L01 + \n+ xform1L21*xform2L11 + xform1L22*xform2L21 + xform1L23*xform2L31;\n+ \n+ CCTK_REAL xformL22 CCTK_ATTRIBUTE_UNUSED = xform1L20*xform2L02 + \n+ xform1L21*xform2L12 + xform1L22*xform2L22 + xform1L23*xform2L32;\n+ \n+ CCTK_REAL xformL23 CCTK_ATTRIBUTE_UNUSED = xform1L20*xform2L03 + \n+ xform1L21*xform2L13 + xform1L22*xform2L23 + xform1L23*xform2L33;\n+ \n+ CCTK_REAL xformL30 CCTK_ATTRIBUTE_UNUSED = xform1L30*xform2L00 + \n+ xform1L31*xform2L10 + xform1L32*xform2L20 + xform1L33*xform2L30;\n+ \n+ CCTK_REAL xformL31 CCTK_ATTRIBUTE_UNUSED = xform1L30*xform2L01 + \n+ xform1L31*xform2L11 + xform1L32*xform2L21 + xform1L33*xform2L31;\n+ \n+ CCTK_REAL xformL32 CCTK_ATTRIBUTE_UNUSED = xform1L30*xform2L02 + \n+ xform1L31*xform2L12 + xform1L32*xform2L22 + xform1L33*xform2L32;\n+ \n+ CCTK_REAL xformL33 CCTK_ATTRIBUTE_UNUSED = xform1L30*xform2L03 + \n+ xform1L31*xform2L13 + xform1L32*xform2L23 + xform1L33*xform2L33;\n+ \n+ CCTK_REAL xx0 CCTK_ATTRIBUTE_UNUSED = t - ToReal(timeoffset);\n+ \n+ CCTK_REAL xx1 CCTK_ATTRIBUTE_UNUSED = xL - ToReal(positionx);\n+ \n+ CCTK_REAL xx2 CCTK_ATTRIBUTE_UNUSED = yL - ToReal(positiony);\n+ \n+ CCTK_REAL xx3 CCTK_ATTRIBUTE_UNUSED = zL - ToReal(positionz);\n+ \n+ CCTK_REAL txx0 CCTK_ATTRIBUTE_UNUSED = xformL00*xx0 + xformL01*xx1 + \n+ xformL02*xx2 + xformL03*xx3;\n+ \n+ CCTK_REAL txx1 CCTK_ATTRIBUTE_UNUSED = xformL10*xx0 + xformL11*xx1 + \n+ xformL12*xx2 + xformL13*xx3;\n+ \n+ CCTK_REAL txx2 CCTK_ATTRIBUTE_UNUSED = xformL20*xx0 + xformL21*xx1 + \n+ xformL22*xx2 + xformL23*xx3;\n+ \n+ CCTK_REAL txx3 CCTK_ATTRIBUTE_UNUSED = xformL30*xx0 + xformL31*xx1 + \n+ xformL32*xx2 + xformL33*xx3;\n+ \n+ CCTK_REAL T CCTK_ATTRIBUTE_UNUSED = txx0;\n+ \n+ CCTK_REAL X CCTK_ATTRIBUTE_UNUSED = txx1;\n+ \n+ CCTK_REAL Y CCTK_ATTRIBUTE_UNUSED = txx2;\n+ \n+ CCTK_REAL Z CCTK_ATTRIBUTE_UNUSED = txx3;\n+ \n+ CCTK_REAL csetemp10 CCTK_ATTRIBUTE_UNUSED = SQR(X);\n+ \n+ CCTK_REAL csetemp11 CCTK_ATTRIBUTE_UNUSED = SQR(Y);\n+ \n+ CCTK_REAL csetemp12 CCTK_ATTRIBUTE_UNUSED = SQR(Z);\n+ \n+ CCTK_REAL rXYZ CCTK_ATTRIBUTE_UNUSED = sqrt(csetemp10 + csetemp11 + \n+ csetemp12);\n+ \n+ CCTK_REAL csetemp13 CCTK_ATTRIBUTE_UNUSED = INV(ToReal(M));\n+ \n+ CCTK_REAL mTXYZ CCTK_ATTRIBUTE_UNUSED = (1 + SQR(tanh(csetemp13*(T + \n+ sqrt(csetemp10 + csetemp11 + csetemp12))*ToReal(dM))))*ToReal(M);\n+ \n+ CCTK_REAL csetemp14 CCTK_ATTRIBUTE_UNUSED = INV(rXYZ);\n+ \n+ CCTK_REAL tg400 CCTK_ATTRIBUTE_UNUSED = -1 + 2*csetemp14*mTXYZ;\n+ \n+ CCTK_REAL csetemp15 CCTK_ATTRIBUTE_UNUSED = INV(SQR(rXYZ));\n+ \n+ CCTK_REAL tg401 CCTK_ATTRIBUTE_UNUSED = 2*csetemp15*mTXYZ*X;\n+ \n+ CCTK_REAL tg402 CCTK_ATTRIBUTE_UNUSED = 2*csetemp15*mTXYZ*Y;\n+ \n+ CCTK_REAL tg403 CCTK_ATTRIBUTE_UNUSED = 2*csetemp15*mTXYZ*Z;\n+ \n+ CCTK_REAL csetemp16 CCTK_ATTRIBUTE_UNUSED = INV(CUB(rXYZ));\n+ \n+ CCTK_REAL tg411 CCTK_ATTRIBUTE_UNUSED = 1 + \n+ 2*csetemp10*csetemp16*mTXYZ;\n+ \n+ CCTK_REAL tg412 CCTK_ATTRIBUTE_UNUSED = 2*csetemp16*mTXYZ*X*Y;\n+ \n+ CCTK_REAL tg413 CCTK_ATTRIBUTE_UNUSED = 2*csetemp16*mTXYZ*X*Z;\n+ \n+ CCTK_REAL tg422 CCTK_ATTRIBUTE_UNUSED = 1 + \n+ 2*csetemp11*csetemp16*mTXYZ;\n+ \n+ CCTK_REAL tg423 CCTK_ATTRIBUTE_UNUSED = 2*csetemp16*mTXYZ*Y*Z;\n+ \n+ CCTK_REAL tg433 CCTK_ATTRIBUTE_UNUSED = 1 + \n+ 2*csetemp12*csetemp16*mTXYZ;\n+ \n+ CCTK_REAL csetemp17 CCTK_ATTRIBUTE_UNUSED = rXYZ + T;\n+ \n+ CCTK_REAL tdg4000 CCTK_ATTRIBUTE_UNUSED = \n+ 4*csetemp14*SQR(INV(cosh(csetemp13*csetemp17*ToReal(dM))))*tanh(csetemp13*csetemp17*ToReal(dM))*ToReal(dM);\n+ \n+ CCTK_REAL tdg4001 CCTK_ATTRIBUTE_UNUSED = -2*csetemp16*X*(mTXYZ - \n+ 2*rXYZ*SQR(INV(cosh(csetemp13*csetemp17*ToReal(dM))))*tanh(csetemp13*csetemp17*ToReal(dM))*ToReal(dM));\n+ \n+ CCTK_REAL tdg4002 CCTK_ATTRIBUTE_UNUSED = -2*csetemp16*Y*(mTXYZ - \n+ 2*rXYZ*SQR(INV(cosh(csetemp13*csetemp17*ToReal(dM))))*tanh(csetemp13*csetemp17*ToReal(dM))*ToReal(dM));\n+ \n+ CCTK_REAL tdg4003 CCTK_ATTRIBUTE_UNUSED = -2*csetemp16*Z*(mTXYZ - \n+ 2*rXYZ*SQR(INV(cosh(csetemp13*csetemp17*ToReal(dM))))*tanh(csetemp13*csetemp17*ToReal(dM))*ToReal(dM));\n+ \n+ CCTK_REAL tdg4010 CCTK_ATTRIBUTE_UNUSED = \n+ 4*csetemp15*X*SQR(INV(cosh(csetemp13*csetemp17*ToReal(dM))))*tanh(csetemp13*csetemp17*ToReal(dM))*ToReal(dM);\n+ \n+ CCTK_REAL csetemp18 CCTK_ATTRIBUTE_UNUSED = INV(QAD(rXYZ));\n+ \n+ CCTK_REAL csetemp19 CCTK_ATTRIBUTE_UNUSED = SQR(rXYZ);\n+ \n+ CCTK_REAL tdg4011 CCTK_ATTRIBUTE_UNUSED = csetemp18*(2*(-2*csetemp10 + \n+ csetemp19)*mTXYZ + \n+ 4*csetemp10*rXYZ*SQR(INV(cosh(csetemp13*csetemp17*ToReal(dM))))*tanh(csetemp13*csetemp17*ToReal(dM))*ToReal(dM));\n+ \n+ CCTK_REAL tdg4012 CCTK_ATTRIBUTE_UNUSED = -4*csetemp18*X*Y*(mTXYZ - \n+ rXYZ*SQR(INV(cosh(csetemp13*csetemp17*ToReal(dM))))*tanh(csetemp13*csetemp17*ToReal(dM))*ToReal(dM));\n+ \n+ CCTK_REAL tdg4013 CCTK_ATTRIBUTE_UNUSED = -4*csetemp18*X*Z*(mTXYZ - \n+ rXYZ*SQR(INV(cosh(csetemp13*csetemp17*ToReal(dM))))*tanh(csetemp13*csetemp17*ToReal(dM))*ToReal(dM));\n+ \n+ CCTK_REAL tdg4020 CCTK_ATTRIBUTE_UNUSED = \n+ 4*csetemp15*Y*SQR(INV(cosh(csetemp13*csetemp17*ToReal(dM))))*tanh(csetemp13*csetemp17*ToReal(dM))*ToReal(dM);\n+ \n+ CCTK_REAL tdg4021 CCTK_ATTRIBUTE_UNUSED = -4*csetemp18*X*Y*(mTXYZ - \n+ rXYZ*SQR(INV(cosh(csetemp13*csetemp17*ToReal(dM))))*tanh(csetemp13*csetemp17*ToReal(dM))*ToReal(dM));\n+ \n+ CCTK_REAL tdg4022 CCTK_ATTRIBUTE_UNUSED = csetemp18*(2*(-2*csetemp11 + \n+ csetemp19)*mTXYZ + \n+ 4*csetemp11*rXYZ*SQR(INV(cosh(csetemp13*csetemp17*ToReal(dM))))*tanh(csetemp13*csetemp17*ToReal(dM))*ToReal(dM));\n+ \n+ CCTK_REAL tdg4023 CCTK_ATTRIBUTE_UNUSED = -4*csetemp18*Y*Z*(mTXYZ - \n+ rXYZ*SQR(INV(cosh(csetemp13*csetemp17*ToReal(dM))))*tanh(csetemp13*csetemp17*ToReal(dM))*ToReal(dM));\n+ \n+ CCTK_REAL tdg4030 CCTK_ATTRIBUTE_UNUSED = \n+ 4*csetemp15*Z*SQR(INV(cosh(csetemp13*csetemp17*ToReal(dM))))*tanh(csetemp13*csetemp17*ToReal(dM))*ToReal(dM);\n+ \n+ CCTK_REAL tdg4031 CCTK_ATTRIBUTE_UNUSED = -4*csetemp18*X*Z*(mTXYZ - \n+ rXYZ*SQR(INV(cosh(csetemp13*csetemp17*ToReal(dM))))*tanh(csetemp13*csetemp17*ToReal(dM))*ToReal(dM));\n+ \n+ CCTK_REAL tdg4032 CCTK_ATTRIBUTE_UNUSED = -4*csetemp18*Y*Z*(mTXYZ - \n+ rXYZ*SQR(INV(cosh(csetemp13*csetemp17*ToReal(dM))))*tanh(csetemp13*csetemp17*ToReal(dM))*ToReal(dM));\n+ \n+ CCTK_REAL tdg4033 CCTK_ATTRIBUTE_UNUSED = csetemp18*(2*(-2*csetemp12 + \n+ csetemp19)*mTXYZ + \n+ 4*csetemp12*rXYZ*SQR(INV(cosh(csetemp13*csetemp17*ToReal(dM))))*tanh(csetemp13*csetemp17*ToReal(dM))*ToReal(dM));\n+ \n+ CCTK_REAL tdg4110 CCTK_ATTRIBUTE_UNUSED = \n+ 4*csetemp10*csetemp16*SQR(INV(cosh(csetemp13*csetemp17*ToReal(dM))))*tanh(csetemp13*csetemp17*ToReal(dM))*ToReal(dM);\n+ \n+ CCTK_REAL csetemp20 CCTK_ATTRIBUTE_UNUSED = pow(rXYZ,-5);\n+ \n+ CCTK_REAL csetemp21 CCTK_ATTRIBUTE_UNUSED = CUB(X);\n+ \n+ CCTK_REAL tdg4111 CCTK_ATTRIBUTE_UNUSED = \n+ csetemp20*(mTXYZ*(-6*csetemp21 + 4*csetemp19*X) + \n+ 4*csetemp21*rXYZ*SQR(INV(cosh(csetemp13*csetemp17*ToReal(dM))))*tanh(csetemp13*csetemp17*ToReal(dM))*ToReal(dM));\n+ \n+ CCTK_REAL csetemp22 CCTK_ATTRIBUTE_UNUSED = -3*mTXYZ;\n+ \n+ CCTK_REAL tdg4112 CCTK_ATTRIBUTE_UNUSED = \n+ 2*csetemp10*csetemp20*Y*(csetemp22 + \n+ 2*rXYZ*SQR(INV(cosh(csetemp13*csetemp17*ToReal(dM))))*tanh(csetemp13*csetemp17*ToReal(dM))*ToReal(dM));\n+ \n+ CCTK_REAL tdg4113 CCTK_ATTRIBUTE_UNUSED = \n+ 2*csetemp10*csetemp20*Z*(csetemp22 + \n+ 2*rXYZ*SQR(INV(cosh(csetemp13*csetemp17*ToReal(dM))))*tanh(csetemp13*csetemp17*ToReal(dM))*ToReal(dM));\n+ \n+ CCTK_REAL tdg4120 CCTK_ATTRIBUTE_UNUSED = \n+ 4*csetemp16*X*Y*SQR(INV(cosh(csetemp13*csetemp17*ToReal(dM))))*tanh(csetemp13*csetemp17*ToReal(dM))*ToReal(dM);\n+ \n+ CCTK_REAL tdg4121 CCTK_ATTRIBUTE_UNUSED = 2*csetemp20*Y*((-2*csetemp10 \n+ + csetemp11 + csetemp12)*mTXYZ + \n+ 2*csetemp10*rXYZ*SQR(INV(cosh(csetemp13*csetemp17*ToReal(dM))))*tanh(csetemp13*csetemp17*ToReal(dM))*ToReal(dM));\n+ \n+ CCTK_REAL tdg4122 CCTK_ATTRIBUTE_UNUSED = 2*csetemp20*X*((csetemp10 - \n+ 2*csetemp11 + csetemp12)*mTXYZ + \n+ 2*csetemp11*rXYZ*SQR(INV(cosh(csetemp13*csetemp17*ToReal(dM))))*tanh(csetemp13*csetemp17*ToReal(dM))*ToReal(dM));\n+ \n+ CCTK_REAL tdg4123 CCTK_ATTRIBUTE_UNUSED = 2*csetemp20*X*Y*Z*(csetemp22 \n+ + \n+ 2*rXYZ*SQR(INV(cosh(csetemp13*csetemp17*ToReal(dM))))*tanh(csetemp13*csetemp17*ToReal(dM))*ToReal(dM));\n+ \n+ CCTK_REAL tdg4130 CCTK_ATTRIBUTE_UNUSED = \n+ 4*csetemp16*X*Z*SQR(INV(cosh(csetemp13*csetemp17*ToReal(dM))))*tanh(csetemp13*csetemp17*ToReal(dM))*ToReal(dM);\n+ \n+ CCTK_REAL tdg4131 CCTK_ATTRIBUTE_UNUSED = 2*csetemp20*Z*((-2*csetemp10 \n+ + csetemp11 + csetemp12)*mTXYZ + \n+ 2*csetemp10*rXYZ*SQR(INV(cosh(csetemp13*csetemp17*ToReal(dM))))*tanh(csetemp13*csetemp17*ToReal(dM))*ToReal(dM));\n+ \n+ CCTK_REAL tdg4132 CCTK_ATTRIBUTE_UNUSED = 2*csetemp20*X*Y*Z*(csetemp22 \n+ + \n+ 2*rXYZ*SQR(INV(cosh(csetemp13*csetemp17*ToReal(dM))))*tanh(csetemp13*csetemp17*ToReal(dM))*ToReal(dM));\n+ \n+ CCTK_REAL tdg4133 CCTK_ATTRIBUTE_UNUSED = 2*csetemp20*X*((csetemp10 + \n+ csetemp11 - 2*csetemp12)*mTXYZ + \n+ 2*csetemp12*rXYZ*SQR(INV(cosh(csetemp13*csetemp17*ToReal(dM))))*tanh(csetemp13*csetemp17*ToReal(dM))*ToReal(dM));\n+ \n+ CCTK_REAL tdg4220 CCTK_ATTRIBUTE_UNUSED = \n+ 4*csetemp11*csetemp16*SQR(INV(cosh(csetemp13*csetemp17*ToReal(dM))))*tanh(csetemp13*csetemp17*ToReal(dM))*ToReal(dM);\n+ \n+ CCTK_REAL tdg4221 CCTK_ATTRIBUTE_UNUSED = \n+ 2*csetemp11*csetemp20*X*(csetemp22 + \n+ 2*rXYZ*SQR(INV(cosh(csetemp13*csetemp17*ToReal(dM))))*tanh(csetemp13*csetemp17*ToReal(dM))*ToReal(dM));\n+ \n+ CCTK_REAL csetemp23 CCTK_ATTRIBUTE_UNUSED = CUB(Y);\n+ \n+ CCTK_REAL tdg4222 CCTK_ATTRIBUTE_UNUSED = \n+ csetemp20*(mTXYZ*(-6*csetemp23 + 4*csetemp19*Y) + \n+ 4*csetemp23*rXYZ*SQR(INV(cosh(csetemp13*csetemp17*ToReal(dM))))*tanh(csetemp13*csetemp17*ToReal(dM))*ToReal(dM));\n+ \n+ CCTK_REAL tdg4223 CCTK_ATTRIBUTE_UNUSED = \n+ 2*csetemp11*csetemp20*Z*(csetemp22 + \n+ 2*rXYZ*SQR(INV(cosh(csetemp13*csetemp17*ToReal(dM))))*tanh(csetemp13*csetemp17*ToReal(dM))*ToReal(dM));\n+ \n+ CCTK_REAL tdg4230 CCTK_ATTRIBUTE_UNUSED = \n+ 4*csetemp16*Y*Z*SQR(INV(cosh(csetemp13*csetemp17*ToReal(dM))))*tanh(csetemp13*csetemp17*ToReal(dM))*ToReal(dM);\n+ \n+ CCTK_REAL tdg4231 CCTK_ATTRIBUTE_UNUSED = 2*csetemp20*X*Y*Z*(csetemp22 \n+ + \n+ 2*rXYZ*SQR(INV(cosh(csetemp13*csetemp17*ToReal(dM))))*tanh(csetemp13*csetemp17*ToReal(dM))*ToReal(dM));\n+ \n+ CCTK_REAL tdg4232 CCTK_ATTRIBUTE_UNUSED = 2*csetemp20*Z*((csetemp10 - \n+ 2*csetemp11 + csetemp12)*mTXYZ + \n+ 2*csetemp11*rXYZ*SQR(INV(cosh(csetemp13*csetemp17*ToReal(dM))))*tanh(csetemp13*csetemp17*ToReal(dM))*ToReal(dM));\n+ \n+ CCTK_REAL tdg4233 CCTK_ATTRIBUTE_UNUSED = 2*csetemp20*Y*((csetemp10 + \n+ csetemp11 - 2*csetemp12)*mTXYZ + \n+ 2*csetemp12*rXYZ*SQR(INV(cosh(csetemp13*csetemp17*ToReal(dM))))*tanh(csetemp13*csetemp17*ToReal(dM))*ToReal(dM));\n+ \n+ CCTK_REAL tdg4330 CCTK_ATTRIBUTE_UNUSED = \n+ 4*csetemp12*csetemp16*SQR(INV(cosh(csetemp13*csetemp17*ToReal(dM))))*tanh(csetemp13*csetemp17*ToReal(dM))*ToReal(dM);\n+ \n+ CCTK_REAL tdg4331 CCTK_ATTRIBUTE_UNUSED = \n+ 2*csetemp12*csetemp20*X*(csetemp22 + \n+ 2*rXYZ*SQR(INV(cosh(csetemp13*csetemp17*ToReal(dM))))*tanh(csetemp13*csetemp17*ToReal(dM))*ToReal(dM));\n+ \n+ CCTK_REAL tdg4332 CCTK_ATTRIBUTE_UNUSED = \n+ 2*csetemp12*csetemp20*Y*(csetemp22 + \n+ 2*rXYZ*SQR(INV(cosh(csetemp13*csetemp17*ToReal(dM))))*tanh(csetemp13*csetemp17*ToReal(dM))*ToReal(dM));\n+ \n+ CCTK_REAL csetemp24 CCTK_ATTRIBUTE_UNUSED = CUB(Z);\n+ \n+ CCTK_REAL tdg4333 CCTK_ATTRIBUTE_UNUSED = \n+ csetemp20*(mTXYZ*(-6*csetemp24 + 4*csetemp19*Z) + \n+ 4*csetemp24*rXYZ*SQR(INV(cosh(csetemp13*csetemp17*ToReal(dM))))*tanh(csetemp13*csetemp17*ToReal(dM))*ToReal(dM));\n+ \n+ CCTK_REAL g400 CCTK_ATTRIBUTE_UNUSED = 2*(tg423*xformL20*xformL30 + \n+ xformL00*(tg401*xformL10 + tg402*xformL20 + tg403*xformL30) + \n+ xformL10*(tg412*xformL20 + tg413*xformL30)) + tg400*SQR(xformL00) + \n+ tg411*SQR(xformL10) + tg422*SQR(xformL20) + tg433*SQR(xformL30);\n+ \n+ CCTK_REAL csetemp25 CCTK_ATTRIBUTE_UNUSED = tg400*xformL01;\n+ \n+ CCTK_REAL csetemp26 CCTK_ATTRIBUTE_UNUSED = tg401*xformL11;\n+ \n+ CCTK_REAL csetemp27 CCTK_ATTRIBUTE_UNUSED = tg402*xformL21;\n+ \n+ CCTK_REAL csetemp28 CCTK_ATTRIBUTE_UNUSED = tg403*xformL31;\n+ \n+ CCTK_REAL csetemp29 CCTK_ATTRIBUTE_UNUSED = tg401*xformL01;\n+ \n+ CCTK_REAL csetemp30 CCTK_ATTRIBUTE_UNUSED = tg411*xformL11;\n+ \n+ CCTK_REAL csetemp31 CCTK_ATTRIBUTE_UNUSED = tg412*xformL21;\n+ \n+ CCTK_REAL csetemp32 CCTK_ATTRIBUTE_UNUSED = tg413*xformL31;\n+ \n+ CCTK_REAL csetemp33 CCTK_ATTRIBUTE_UNUSED = tg402*xformL01;\n+ \n+ CCTK_REAL csetemp34 CCTK_ATTRIBUTE_UNUSED = tg412*xformL11;\n+ \n+ CCTK_REAL csetemp35 CCTK_ATTRIBUTE_UNUSED = tg422*xformL21;\n+ \n+ CCTK_REAL csetemp36 CCTK_ATTRIBUTE_UNUSED = tg423*xformL31;\n+ \n+ CCTK_REAL csetemp37 CCTK_ATTRIBUTE_UNUSED = tg403*xformL01;\n+ \n+ CCTK_REAL csetemp38 CCTK_ATTRIBUTE_UNUSED = tg413*xformL11;\n+ \n+ CCTK_REAL csetemp39 CCTK_ATTRIBUTE_UNUSED = tg423*xformL21;\n+ \n+ CCTK_REAL csetemp40 CCTK_ATTRIBUTE_UNUSED = tg433*xformL31;\n+ \n+ CCTK_REAL g401 CCTK_ATTRIBUTE_UNUSED = (csetemp25 + csetemp26 + \n+ csetemp27 + csetemp28)*xformL00 + (csetemp29 + csetemp30 + csetemp31 + \n+ csetemp32)*xformL10 + (csetemp33 + csetemp34 + csetemp35 + \n+ csetemp36)*xformL20 + (csetemp37 + csetemp38 + csetemp39 + \n+ csetemp40)*xformL30;\n+ \n+ CCTK_REAL csetemp41 CCTK_ATTRIBUTE_UNUSED = tg400*xformL02;\n+ \n+ CCTK_REAL csetemp42 CCTK_ATTRIBUTE_UNUSED = tg401*xformL12;\n+ \n+ CCTK_REAL csetemp43 CCTK_ATTRIBUTE_UNUSED = tg402*xformL22;\n+ \n+ CCTK_REAL csetemp44 CCTK_ATTRIBUTE_UNUSED = tg403*xformL32;\n+ \n+ CCTK_REAL csetemp45 CCTK_ATTRIBUTE_UNUSED = tg401*xformL02;\n+ \n+ CCTK_REAL csetemp46 CCTK_ATTRIBUTE_UNUSED = tg411*xformL12;\n+ \n+ CCTK_REAL csetemp47 CCTK_ATTRIBUTE_UNUSED = tg412*xformL22;\n+ \n+ CCTK_REAL csetemp48 CCTK_ATTRIBUTE_UNUSED = tg413*xformL32;\n+ \n+ CCTK_REAL csetemp49 CCTK_ATTRIBUTE_UNUSED = tg402*xformL02;\n+ \n+ CCTK_REAL csetemp50 CCTK_ATTRIBUTE_UNUSED = tg412*xformL12;\n+ \n+ CCTK_REAL csetemp51 CCTK_ATTRIBUTE_UNUSED = tg422*xformL22;\n+ \n+ CCTK_REAL csetemp52 CCTK_ATTRIBUTE_UNUSED = tg423*xformL32;\n+ \n+ CCTK_REAL csetemp53 CCTK_ATTRIBUTE_UNUSED = tg403*xformL02;\n+ \n+ CCTK_REAL csetemp54 CCTK_ATTRIBUTE_UNUSED = tg413*xformL12;\n+ \n+ CCTK_REAL csetemp55 CCTK_ATTRIBUTE_UNUSED = tg423*xformL22;\n+ \n+ CCTK_REAL csetemp56 CCTK_ATTRIBUTE_UNUSED = tg433*xformL32;\n+ \n+ CCTK_REAL g402 CCTK_ATTRIBUTE_UNUSED = (csetemp41 + csetemp42 + \n+ csetemp43 + csetemp44)*xformL00 + (csetemp45 + csetemp46 + csetemp47 + \n+ csetemp48)*xformL10 + (csetemp49 + csetemp50 + csetemp51 + \n+ csetemp52)*xformL20 + (csetemp53 + csetemp54 + csetemp55 + \n+ csetemp56)*xformL30;\n+ \n+ CCTK_REAL csetemp57 CCTK_ATTRIBUTE_UNUSED = tg400*xformL03;\n+ \n+ CCTK_REAL csetemp58 CCTK_ATTRIBUTE_UNUSED = tg401*xformL13;\n+ \n+ CCTK_REAL csetemp59 CCTK_ATTRIBUTE_UNUSED = tg402*xformL23;\n+ \n+ CCTK_REAL csetemp60 CCTK_ATTRIBUTE_UNUSED = tg403*xformL33;\n+ \n+ CCTK_REAL csetemp61 CCTK_ATTRIBUTE_UNUSED = tg401*xformL03;\n+ \n+ CCTK_REAL csetemp62 CCTK_ATTRIBUTE_UNUSED = tg411*xformL13;\n+ \n+ CCTK_REAL csetemp63 CCTK_ATTRIBUTE_UNUSED = tg412*xformL23;\n+ \n+ CCTK_REAL csetemp64 CCTK_ATTRIBUTE_UNUSED = tg413*xformL33;\n+ \n+ CCTK_REAL csetemp65 CCTK_ATTRIBUTE_UNUSED = tg402*xformL03;\n+ \n+ CCTK_REAL csetemp66 CCTK_ATTRIBUTE_UNUSED = tg412*xformL13;\n+ \n+ CCTK_REAL csetemp67 CCTK_ATTRIBUTE_UNUSED = tg422*xformL23;\n+ \n+ CCTK_REAL csetemp68 CCTK_ATTRIBUTE_UNUSED = tg423*xformL33;\n+ \n+ CCTK_REAL csetemp69 CCTK_ATTRIBUTE_UNUSED = tg403*xformL03;\n+ \n+ CCTK_REAL csetemp70 CCTK_ATTRIBUTE_UNUSED = tg413*xformL13;\n+ \n+ CCTK_REAL csetemp71 CCTK_ATTRIBUTE_UNUSED = tg423*xformL23;\n+ \n+ CCTK_REAL csetemp72 CCTK_ATTRIBUTE_UNUSED = tg433*xformL33;\n+ \n+ CCTK_REAL g403 CCTK_ATTRIBUTE_UNUSED = (csetemp57 + csetemp58 + \n+ csetemp59 + csetemp60)*xformL00 + (csetemp61 + csetemp62 + csetemp63 + \n+ csetemp64)*xformL10 + (csetemp65 + csetemp66 + csetemp67 + \n+ csetemp68)*xformL20 + (csetemp69 + csetemp70 + csetemp71 + \n+ csetemp72)*xformL30;\n+ \n+ CCTK_REAL g411 CCTK_ATTRIBUTE_UNUSED = (csetemp25 + csetemp26 + \n+ csetemp27 + csetemp28)*xformL01 + (csetemp29 + csetemp30 + csetemp31 + \n+ csetemp32)*xformL11 + (csetemp33 + csetemp34 + csetemp35 + \n+ csetemp36)*xformL21 + (csetemp37 + csetemp38 + csetemp39 + \n+ csetemp40)*xformL31;\n+ \n+ CCTK_REAL g412 CCTK_ATTRIBUTE_UNUSED = (csetemp41 + csetemp42 + \n+ csetemp43 + csetemp44)*xformL01 + (csetemp45 + csetemp46 + csetemp47 + \n+ csetemp48)*xformL11 + (csetemp49 + csetemp50 + csetemp51 + \n+ csetemp52)*xformL21 + (csetemp53 + csetemp54 + csetemp55 + \n+ csetemp56)*xformL31;\n+ \n+ CCTK_REAL g413 CCTK_ATTRIBUTE_UNUSED = (csetemp57 + csetemp58 + \n+ csetemp59 + csetemp60)*xformL01 + (csetemp61 + csetemp62 + csetemp63 + \n+ csetemp64)*xformL11 + (csetemp65 + csetemp66 + csetemp67 + \n+ csetemp68)*xformL21 + (csetemp69 + csetemp70 + csetemp71 + \n+ csetemp72)*xformL31;\n+ \n+ CCTK_REAL g422 CCTK_ATTRIBUTE_UNUSED = (csetemp41 + csetemp42 + \n+ csetemp43 + csetemp44)*xformL02 + (csetemp45 + csetemp46 + csetemp47 + \n+ csetemp48)*xformL12 + (csetemp49 + csetemp50 + csetemp51 + \n+ csetemp52)*xformL22 + (csetemp53 + csetemp54 + csetemp55 + \n+ csetemp56)*xformL32;\n+ \n+ CCTK_REAL g423 CCTK_ATTRIBUTE_UNUSED = (csetemp57 + csetemp58 + \n+ csetemp59 + csetemp60)*xformL02 + (csetemp61 + csetemp62 + csetemp63 + \n+ csetemp64)*xformL12 + (csetemp65 + csetemp66 + csetemp67 + \n+ csetemp68)*xformL22 + (csetemp69 + csetemp70 + csetemp71 + \n+ csetemp72)*xformL32;\n+ \n+ CCTK_REAL g433 CCTK_ATTRIBUTE_UNUSED = (csetemp57 + csetemp58 + \n+ csetemp59 + csetemp60)*xformL03 + (csetemp61 + csetemp62 + csetemp63 + \n+ csetemp64)*xformL13 + (csetemp65 + csetemp66 + csetemp67 + \n+ csetemp68)*xformL23 + (csetemp69 + csetemp70 + csetemp71 + \n+ csetemp72)*xformL33;\n+ \n+ CCTK_REAL csetemp73 CCTK_ATTRIBUTE_UNUSED = tdg4000*xformL00;\n+ \n+ CCTK_REAL csetemp74 CCTK_ATTRIBUTE_UNUSED = tdg4001*xformL10;\n+ \n+ CCTK_REAL csetemp75 CCTK_ATTRIBUTE_UNUSED = tdg4002*xformL20;\n+ \n+ CCTK_REAL csetemp76 CCTK_ATTRIBUTE_UNUSED = tdg4003*xformL30;\n+ \n+ CCTK_REAL csetemp77 CCTK_ATTRIBUTE_UNUSED = tdg4010*xformL00;\n+ \n+ CCTK_REAL csetemp78 CCTK_ATTRIBUTE_UNUSED = tdg4011*xformL10;\n+ \n+ CCTK_REAL csetemp79 CCTK_ATTRIBUTE_UNUSED = tdg4012*xformL20;\n+ \n+ CCTK_REAL csetemp80 CCTK_ATTRIBUTE_UNUSED = tdg4013*xformL30;\n+ \n+ CCTK_REAL csetemp81 CCTK_ATTRIBUTE_UNUSED = tdg4020*xformL00;\n+ \n+ CCTK_REAL csetemp82 CCTK_ATTRIBUTE_UNUSED = tdg4021*xformL10;\n+ \n+ CCTK_REAL csetemp83 CCTK_ATTRIBUTE_UNUSED = tdg4022*xformL20;\n+ \n+ CCTK_REAL csetemp84 CCTK_ATTRIBUTE_UNUSED = tdg4023*xformL30;\n+ \n+ CCTK_REAL csetemp85 CCTK_ATTRIBUTE_UNUSED = tdg4030*xformL00;\n+ \n+ CCTK_REAL csetemp86 CCTK_ATTRIBUTE_UNUSED = tdg4031*xformL10;\n+ \n+ CCTK_REAL csetemp87 CCTK_ATTRIBUTE_UNUSED = tdg4032*xformL20;\n+ \n+ CCTK_REAL csetemp88 CCTK_ATTRIBUTE_UNUSED = tdg4033*xformL30;\n+ \n+ CCTK_REAL csetemp89 CCTK_ATTRIBUTE_UNUSED = tdg4110*xformL00;\n+ \n+ CCTK_REAL csetemp90 CCTK_ATTRIBUTE_UNUSED = tdg4111*xformL10;\n+ \n+ CCTK_REAL csetemp91 CCTK_ATTRIBUTE_UNUSED = tdg4112*xformL20;\n+ \n+ CCTK_REAL csetemp92 CCTK_ATTRIBUTE_UNUSED = tdg4113*xformL30;\n+ \n+ CCTK_REAL csetemp93 CCTK_ATTRIBUTE_UNUSED = tdg4120*xformL00;\n+ \n+ CCTK_REAL csetemp94 CCTK_ATTRIBUTE_UNUSED = tdg4121*xformL10;\n+ \n+ CCTK_REAL csetemp95 CCTK_ATTRIBUTE_UNUSED = tdg4122*xformL20;\n+ \n+ CCTK_REAL csetemp96 CCTK_ATTRIBUTE_UNUSED = tdg4123*xformL30;\n+ \n+ CCTK_REAL csetemp97 CCTK_ATTRIBUTE_UNUSED = tdg4130*xformL00;\n+ \n+ CCTK_REAL csetemp98 CCTK_ATTRIBUTE_UNUSED = tdg4131*xformL10;\n+ \n+ CCTK_REAL csetemp99 CCTK_ATTRIBUTE_UNUSED = tdg4132*xformL20;\n+ \n+ CCTK_REAL csetemp100 CCTK_ATTRIBUTE_UNUSED = tdg4133*xformL30;\n+ \n+ CCTK_REAL csetemp101 CCTK_ATTRIBUTE_UNUSED = tdg4220*xformL00;\n+ \n+ CCTK_REAL csetemp102 CCTK_ATTRIBUTE_UNUSED = tdg4221*xformL10;\n+ \n+ CCTK_REAL csetemp103 CCTK_ATTRIBUTE_UNUSED = tdg4222*xformL20;\n+ \n+ CCTK_REAL csetemp104 CCTK_ATTRIBUTE_UNUSED = tdg4223*xformL30;\n+ \n+ CCTK_REAL csetemp105 CCTK_ATTRIBUTE_UNUSED = tdg4230*xformL00;\n+ \n+ CCTK_REAL csetemp106 CCTK_ATTRIBUTE_UNUSED = tdg4231*xformL10;\n+ \n+ CCTK_REAL csetemp107 CCTK_ATTRIBUTE_UNUSED = tdg4232*xformL20;\n+ \n+ CCTK_REAL csetemp108 CCTK_ATTRIBUTE_UNUSED = tdg4233*xformL30;\n+ \n+ CCTK_REAL csetemp109 CCTK_ATTRIBUTE_UNUSED = tdg4330*xformL00;\n+ \n+ CCTK_REAL csetemp110 CCTK_ATTRIBUTE_UNUSED = tdg4331*xformL10;\n+ \n+ CCTK_REAL csetemp111 CCTK_ATTRIBUTE_UNUSED = tdg4332*xformL20;\n+ \n+ CCTK_REAL csetemp112 CCTK_ATTRIBUTE_UNUSED = tdg4333*xformL30;\n+ \n+ CCTK_REAL dg4000 CCTK_ATTRIBUTE_UNUSED = xformL20*((csetemp81 + \n+ csetemp82 + csetemp83 + csetemp84)*xformL00 + (csetemp93 + csetemp94 + \n+ csetemp95 + csetemp96)*xformL10 + (csetemp101 + csetemp102 + csetemp103 \n+ + csetemp104)*xformL20 + (csetemp105 + csetemp106 + csetemp107 + \n+ csetemp108)*xformL30) + xformL30*((csetemp85 + csetemp86 + csetemp87 + \n+ csetemp88)*xformL00 + (csetemp100 + csetemp97 + csetemp98 + \n+ csetemp99)*xformL10 + (csetemp105 + csetemp106 + csetemp107 + \n+ csetemp108)*xformL20 + (csetemp109 + csetemp110 + csetemp111 + \n+ csetemp112)*xformL30) + xformL00*((csetemp73 + csetemp74 + csetemp75 + \n+ csetemp76)*xformL00 + (csetemp77 + csetemp78 + csetemp79 + \n+ csetemp80)*xformL10 + (csetemp81 + csetemp82 + csetemp83 + \n+ csetemp84)*xformL20 + (csetemp85 + csetemp86 + csetemp87 + \n+ csetemp88)*xformL30) + xformL10*((csetemp77 + csetemp78 + csetemp79 + \n+ csetemp80)*xformL00 + (csetemp89 + csetemp90 + csetemp91 + \n+ csetemp92)*xformL10 + (csetemp93 + csetemp94 + csetemp95 + \n+ csetemp96)*xformL20 + (csetemp100 + csetemp97 + csetemp98 + \n+ csetemp99)*xformL30);\n+ \n+ CCTK_REAL dg4010 CCTK_ATTRIBUTE_UNUSED = xformL20*((csetemp81 + \n+ csetemp82 + csetemp83 + csetemp84)*xformL01 + (csetemp93 + csetemp94 + \n+ csetemp95 + csetemp96)*xformL11 + (csetemp101 + csetemp102 + csetemp103 \n+ + csetemp104)*xformL21 + (csetemp105 + csetemp106 + csetemp107 + \n+ csetemp108)*xformL31) + xformL30*((csetemp85 + csetemp86 + csetemp87 + \n+ csetemp88)*xformL01 + (csetemp100 + csetemp97 + csetemp98 + \n+ csetemp99)*xformL11 + (csetemp105 + csetemp106 + csetemp107 + \n+ csetemp108)*xformL21 + (csetemp109 + csetemp110 + csetemp111 + \n+ csetemp112)*xformL31) + xformL00*((csetemp73 + csetemp74 + csetemp75 + \n+ csetemp76)*xformL01 + (csetemp77 + csetemp78 + csetemp79 + \n+ csetemp80)*xformL11 + (csetemp81 + csetemp82 + csetemp83 + \n+ csetemp84)*xformL21 + (csetemp85 + csetemp86 + csetemp87 + \n+ csetemp88)*xformL31) + xformL10*((csetemp77 + csetemp78 + csetemp79 + \n+ csetemp80)*xformL01 + (csetemp89 + csetemp90 + csetemp91 + \n+ csetemp92)*xformL11 + (csetemp93 + csetemp94 + csetemp95 + \n+ csetemp96)*xformL21 + (csetemp100 + csetemp97 + csetemp98 + \n+ csetemp99)*xformL31);\n+ \n+ CCTK_REAL csetemp113 CCTK_ATTRIBUTE_UNUSED = tdg4000*xformL01;\n+ \n+ CCTK_REAL csetemp114 CCTK_ATTRIBUTE_UNUSED = tdg4001*xformL11;\n+ \n+ CCTK_REAL csetemp115 CCTK_ATTRIBUTE_UNUSED = tdg4002*xformL21;\n+ \n+ CCTK_REAL csetemp116 CCTK_ATTRIBUTE_UNUSED = tdg4003*xformL31;\n+ \n+ CCTK_REAL csetemp117 CCTK_ATTRIBUTE_UNUSED = tdg4010*xformL01;\n+ \n+ CCTK_REAL csetemp118 CCTK_ATTRIBUTE_UNUSED = tdg4011*xformL11;\n+ \n+ CCTK_REAL csetemp119 CCTK_ATTRIBUTE_UNUSED = tdg4012*xformL21;\n+ \n+ CCTK_REAL csetemp120 CCTK_ATTRIBUTE_UNUSED = tdg4013*xformL31;\n+ \n+ CCTK_REAL csetemp121 CCTK_ATTRIBUTE_UNUSED = tdg4020*xformL01;\n+ \n+ CCTK_REAL csetemp122 CCTK_ATTRIBUTE_UNUSED = tdg4021*xformL11;\n+ \n+ CCTK_REAL csetemp123 CCTK_ATTRIBUTE_UNUSED = tdg4022*xformL21;\n+ \n+ CCTK_REAL csetemp124 CCTK_ATTRIBUTE_UNUSED = tdg4023*xformL31;\n+ \n+ CCTK_REAL csetemp125 CCTK_ATTRIBUTE_UNUSED = tdg4030*xformL01;\n+ \n+ CCTK_REAL csetemp126 CCTK_ATTRIBUTE_UNUSED = tdg4031*xformL11;\n+ \n+ CCTK_REAL csetemp127 CCTK_ATTRIBUTE_UNUSED = tdg4032*xformL21;\n+ \n+ CCTK_REAL csetemp128 CCTK_ATTRIBUTE_UNUSED = tdg4033*xformL31;\n+ \n+ CCTK_REAL csetemp129 CCTK_ATTRIBUTE_UNUSED = tdg4110*xformL01;\n+ \n+ CCTK_REAL csetemp130 CCTK_ATTRIBUTE_UNUSED = tdg4111*xformL11;\n+ \n+ CCTK_REAL csetemp131 CCTK_ATTRIBUTE_UNUSED = tdg4112*xformL21;\n+ \n+ CCTK_REAL csetemp132 CCTK_ATTRIBUTE_UNUSED = tdg4113*xformL31;\n+ \n+ CCTK_REAL csetemp133 CCTK_ATTRIBUTE_UNUSED = tdg4120*xformL01;\n+ \n+ CCTK_REAL csetemp134 CCTK_ATTRIBUTE_UNUSED = tdg4121*xformL11;\n+ \n+ CCTK_REAL csetemp135 CCTK_ATTRIBUTE_UNUSED = tdg4122*xformL21;\n+ \n+ CCTK_REAL csetemp136 CCTK_ATTRIBUTE_UNUSED = tdg4123*xformL31;\n+ \n+ CCTK_REAL csetemp137 CCTK_ATTRIBUTE_UNUSED = tdg4130*xformL01;\n+ \n+ CCTK_REAL csetemp138 CCTK_ATTRIBUTE_UNUSED = tdg4131*xformL11;\n+ \n+ CCTK_REAL csetemp139 CCTK_ATTRIBUTE_UNUSED = tdg4132*xformL21;\n+ \n+ CCTK_REAL csetemp140 CCTK_ATTRIBUTE_UNUSED = tdg4133*xformL31;\n+ \n+ CCTK_REAL csetemp141 CCTK_ATTRIBUTE_UNUSED = tdg4220*xformL01;\n+ \n+ CCTK_REAL csetemp142 CCTK_ATTRIBUTE_UNUSED = tdg4221*xformL11;\n+ \n+ CCTK_REAL csetemp143 CCTK_ATTRIBUTE_UNUSED = tdg4222*xformL21;\n+ \n+ CCTK_REAL csetemp144 CCTK_ATTRIBUTE_UNUSED = tdg4223*xformL31;\n+ \n+ CCTK_REAL csetemp145 CCTK_ATTRIBUTE_UNUSED = tdg4230*xformL01;\n+ \n+ CCTK_REAL csetemp146 CCTK_ATTRIBUTE_UNUSED = tdg4231*xformL11;\n+ \n+ CCTK_REAL csetemp147 CCTK_ATTRIBUTE_UNUSED = tdg4232*xformL21;\n+ \n+ CCTK_REAL csetemp148 CCTK_ATTRIBUTE_UNUSED = tdg4233*xformL31;\n+ \n+ CCTK_REAL csetemp149 CCTK_ATTRIBUTE_UNUSED = tdg4330*xformL01;\n+ \n+ CCTK_REAL csetemp150 CCTK_ATTRIBUTE_UNUSED = tdg4331*xformL11;\n+ \n+ CCTK_REAL csetemp151 CCTK_ATTRIBUTE_UNUSED = tdg4332*xformL21;\n+ \n+ CCTK_REAL csetemp152 CCTK_ATTRIBUTE_UNUSED = tdg4333*xformL31;\n+ \n+ CCTK_REAL dg4011 CCTK_ATTRIBUTE_UNUSED = xformL00*((csetemp113 + \n+ csetemp114 + csetemp115 + csetemp116)*xformL01 + (csetemp117 + \n+ csetemp118 + csetemp119 + csetemp120)*xformL11 + (csetemp121 + \n+ csetemp122 + csetemp123 + csetemp124)*xformL21 + (csetemp125 + \n+ csetemp126 + csetemp127 + csetemp128)*xformL31) + xformL10*((csetemp117 \n+ + csetemp118 + csetemp119 + csetemp120)*xformL01 + (csetemp129 + \n+ csetemp130 + csetemp131 + csetemp132)*xformL11 + (csetemp133 + \n+ csetemp134 + csetemp135 + csetemp136)*xformL21 + (csetemp137 + \n+ csetemp138 + csetemp139 + csetemp140)*xformL31) + xformL20*((csetemp121 \n+ + csetemp122 + csetemp123 + csetemp124)*xformL01 + (csetemp133 + \n+ csetemp134 + csetemp135 + csetemp136)*xformL11 + (csetemp141 + \n+ csetemp142 + csetemp143 + csetemp144)*xformL21 + (csetemp145 + \n+ csetemp146 + csetemp147 + csetemp148)*xformL31) + xformL30*((csetemp125 \n+ + csetemp126 + csetemp127 + csetemp128)*xformL01 + (csetemp137 + \n+ csetemp138 + csetemp139 + csetemp140)*xformL11 + (csetemp145 + \n+ csetemp146 + csetemp147 + csetemp148)*xformL21 + (csetemp149 + \n+ csetemp150 + csetemp151 + csetemp152)*xformL31);\n+ \n+ CCTK_REAL csetemp153 CCTK_ATTRIBUTE_UNUSED = tdg4000*xformL02;\n+ \n+ CCTK_REAL csetemp154 CCTK_ATTRIBUTE_UNUSED = tdg4001*xformL12;\n+ \n+ CCTK_REAL csetemp155 CCTK_ATTRIBUTE_UNUSED = tdg4002*xformL22;\n+ \n+ CCTK_REAL csetemp156 CCTK_ATTRIBUTE_UNUSED = tdg4003*xformL32;\n+ \n+ CCTK_REAL csetemp157 CCTK_ATTRIBUTE_UNUSED = tdg4010*xformL02;\n+ \n+ CCTK_REAL csetemp158 CCTK_ATTRIBUTE_UNUSED = tdg4011*xformL12;\n+ \n+ CCTK_REAL csetemp159 CCTK_ATTRIBUTE_UNUSED = tdg4012*xformL22;\n+ \n+ CCTK_REAL csetemp160 CCTK_ATTRIBUTE_UNUSED = tdg4013*xformL32;\n+ \n+ CCTK_REAL csetemp161 CCTK_ATTRIBUTE_UNUSED = tdg4020*xformL02;\n+ \n+ CCTK_REAL csetemp162 CCTK_ATTRIBUTE_UNUSED = tdg4021*xformL12;\n+ \n+ CCTK_REAL csetemp163 CCTK_ATTRIBUTE_UNUSED = tdg4022*xformL22;\n+ \n+ CCTK_REAL csetemp164 CCTK_ATTRIBUTE_UNUSED = tdg4023*xformL32;\n+ \n+ CCTK_REAL csetemp165 CCTK_ATTRIBUTE_UNUSED = tdg4030*xformL02;\n+ \n+ CCTK_REAL csetemp166 CCTK_ATTRIBUTE_UNUSED = tdg4031*xformL12;\n+ \n+ CCTK_REAL csetemp167 CCTK_ATTRIBUTE_UNUSED = tdg4032*xformL22;\n+ \n+ CCTK_REAL csetemp168 CCTK_ATTRIBUTE_UNUSED = tdg4033*xformL32;\n+ \n+ CCTK_REAL csetemp169 CCTK_ATTRIBUTE_UNUSED = tdg4110*xformL02;\n+ \n+ CCTK_REAL csetemp170 CCTK_ATTRIBUTE_UNUSED = tdg4111*xformL12;\n+ \n+ CCTK_REAL csetemp171 CCTK_ATTRIBUTE_UNUSED = tdg4112*xformL22;\n+ \n+ CCTK_REAL csetemp172 CCTK_ATTRIBUTE_UNUSED = tdg4113*xformL32;\n+ \n+ CCTK_REAL csetemp173 CCTK_ATTRIBUTE_UNUSED = tdg4120*xformL02;\n+ \n+ CCTK_REAL csetemp174 CCTK_ATTRIBUTE_UNUSED = tdg4121*xformL12;\n+ \n+ CCTK_REAL csetemp175 CCTK_ATTRIBUTE_UNUSED = tdg4122*xformL22;\n+ \n+ CCTK_REAL csetemp176 CCTK_ATTRIBUTE_UNUSED = tdg4123*xformL32;\n+ \n+ CCTK_REAL csetemp177 CCTK_ATTRIBUTE_UNUSED = tdg4130*xformL02;\n+ \n+ CCTK_REAL csetemp178 CCTK_ATTRIBUTE_UNUSED = tdg4131*xformL12;\n+ \n+ CCTK_REAL csetemp179 CCTK_ATTRIBUTE_UNUSED = tdg4132*xformL22;\n+ \n+ CCTK_REAL csetemp180 CCTK_ATTRIBUTE_UNUSED = tdg4133*xformL32;\n+ \n+ CCTK_REAL csetemp181 CCTK_ATTRIBUTE_UNUSED = tdg4220*xformL02;\n+ \n+ CCTK_REAL csetemp182 CCTK_ATTRIBUTE_UNUSED = tdg4221*xformL12;\n+ \n+ CCTK_REAL csetemp183 CCTK_ATTRIBUTE_UNUSED = tdg4222*xformL22;\n+ \n+ CCTK_REAL csetemp184 CCTK_ATTRIBUTE_UNUSED = tdg4223*xformL32;\n+ \n+ CCTK_REAL csetemp185 CCTK_ATTRIBUTE_UNUSED = tdg4230*xformL02;\n+ \n+ CCTK_REAL csetemp186 CCTK_ATTRIBUTE_UNUSED = tdg4231*xformL12;\n+ \n+ CCTK_REAL csetemp187 CCTK_ATTRIBUTE_UNUSED = tdg4232*xformL22;\n+ \n+ CCTK_REAL csetemp188 CCTK_ATTRIBUTE_UNUSED = tdg4233*xformL32;\n+ \n+ CCTK_REAL csetemp189 CCTK_ATTRIBUTE_UNUSED = tdg4330*xformL02;\n+ \n+ CCTK_REAL csetemp190 CCTK_ATTRIBUTE_UNUSED = tdg4331*xformL12;\n+ \n+ CCTK_REAL csetemp191 CCTK_ATTRIBUTE_UNUSED = tdg4332*xformL22;\n+ \n+ CCTK_REAL csetemp192 CCTK_ATTRIBUTE_UNUSED = tdg4333*xformL32;\n+ \n+ CCTK_REAL dg4012 CCTK_ATTRIBUTE_UNUSED = xformL00*((csetemp153 + \n+ csetemp154 + csetemp155 + csetemp156)*xformL01 + (csetemp157 + \n+ csetemp158 + csetemp159 + csetemp160)*xformL11 + (csetemp161 + \n+ csetemp162 + csetemp163 + csetemp164)*xformL21 + (csetemp165 + \n+ csetemp166 + csetemp167 + csetemp168)*xformL31) + xformL10*((csetemp157 \n+ + csetemp158 + csetemp159 + csetemp160)*xformL01 + (csetemp169 + \n+ csetemp170 + csetemp171 + csetemp172)*xformL11 + (csetemp173 + \n+ csetemp174 + csetemp175 + csetemp176)*xformL21 + (csetemp177 + \n+ csetemp178 + csetemp179 + csetemp180)*xformL31) + xformL20*((csetemp161 \n+ + csetemp162 + csetemp163 + csetemp164)*xformL01 + (csetemp173 + \n+ csetemp174 + csetemp175 + csetemp176)*xformL11 + (csetemp181 + \n+ csetemp182 + csetemp183 + csetemp184)*xformL21 + (csetemp185 + \n+ csetemp186 + csetemp187 + csetemp188)*xformL31) + xformL30*((csetemp165 \n+ + csetemp166 + csetemp167 + csetemp168)*xformL01 + (csetemp177 + \n+ csetemp178 + csetemp179 + csetemp180)*xformL11 + (csetemp185 + \n+ csetemp186 + csetemp187 + csetemp188)*xformL21 + (csetemp189 + \n+ csetemp190 + csetemp191 + csetemp192)*xformL31);\n+ \n+ CCTK_REAL csetemp193 CCTK_ATTRIBUTE_UNUSED = tdg4000*xformL03;\n+ \n+ CCTK_REAL csetemp194 CCTK_ATTRIBUTE_UNUSED = tdg4001*xformL13;\n+ \n+ CCTK_REAL csetemp195 CCTK_ATTRIBUTE_UNUSED = tdg4002*xformL23;\n+ \n+ CCTK_REAL csetemp196 CCTK_ATTRIBUTE_UNUSED = tdg4003*xformL33;\n+ \n+ CCTK_REAL csetemp197 CCTK_ATTRIBUTE_UNUSED = tdg4010*xformL03;\n+ \n+ CCTK_REAL csetemp198 CCTK_ATTRIBUTE_UNUSED = tdg4011*xformL13;\n+ \n+ CCTK_REAL csetemp199 CCTK_ATTRIBUTE_UNUSED = tdg4012*xformL23;\n+ \n+ CCTK_REAL csetemp200 CCTK_ATTRIBUTE_UNUSED = tdg4013*xformL33;\n+ \n+ CCTK_REAL csetemp201 CCTK_ATTRIBUTE_UNUSED = tdg4020*xformL03;\n+ \n+ CCTK_REAL csetemp202 CCTK_ATTRIBUTE_UNUSED = tdg4021*xformL13;\n+ \n+ CCTK_REAL csetemp203 CCTK_ATTRIBUTE_UNUSED = tdg4022*xformL23;\n+ \n+ CCTK_REAL csetemp204 CCTK_ATTRIBUTE_UNUSED = tdg4023*xformL33;\n+ \n+ CCTK_REAL csetemp205 CCTK_ATTRIBUTE_UNUSED = tdg4030*xformL03;\n+ \n+ CCTK_REAL csetemp206 CCTK_ATTRIBUTE_UNUSED = tdg4031*xformL13;\n+ \n+ CCTK_REAL csetemp207 CCTK_ATTRIBUTE_UNUSED = tdg4032*xformL23;\n+ \n+ CCTK_REAL csetemp208 CCTK_ATTRIBUTE_UNUSED = tdg4033*xformL33;\n+ \n+ CCTK_REAL csetemp209 CCTK_ATTRIBUTE_UNUSED = tdg4110*xformL03;\n+ \n+ CCTK_REAL csetemp210 CCTK_ATTRIBUTE_UNUSED = tdg4111*xformL13;\n+ \n+ CCTK_REAL csetemp211 CCTK_ATTRIBUTE_UNUSED = tdg4112*xformL23;\n+ \n+ CCTK_REAL csetemp212 CCTK_ATTRIBUTE_UNUSED = tdg4113*xformL33;\n+ \n+ CCTK_REAL csetemp213 CCTK_ATTRIBUTE_UNUSED = tdg4120*xformL03;\n+ \n+ CCTK_REAL csetemp214 CCTK_ATTRIBUTE_UNUSED = tdg4121*xformL13;\n+ \n+ CCTK_REAL csetemp215 CCTK_ATTRIBUTE_UNUSED = tdg4122*xformL23;\n+ \n+ CCTK_REAL csetemp216 CCTK_ATTRIBUTE_UNUSED = tdg4123*xformL33;\n+ \n+ CCTK_REAL csetemp217 CCTK_ATTRIBUTE_UNUSED = tdg4130*xformL03;\n+ \n+ CCTK_REAL csetemp218 CCTK_ATTRIBUTE_UNUSED = tdg4131*xformL13;\n+ \n+ CCTK_REAL csetemp219 CCTK_ATTRIBUTE_UNUSED = tdg4132*xformL23;\n+ \n+ CCTK_REAL csetemp220 CCTK_ATTRIBUTE_UNUSED = tdg4133*xformL33;\n+ \n+ CCTK_REAL csetemp221 CCTK_ATTRIBUTE_UNUSED = tdg4220*xformL03;\n+ \n+ CCTK_REAL csetemp222 CCTK_ATTRIBUTE_UNUSED = tdg4221*xformL13;\n+ \n+ CCTK_REAL csetemp223 CCTK_ATTRIBUTE_UNUSED = tdg4222*xformL23;\n+ \n+ CCTK_REAL csetemp224 CCTK_ATTRIBUTE_UNUSED = tdg4223*xformL33;\n+ \n+ CCTK_REAL csetemp225 CCTK_ATTRIBUTE_UNUSED = tdg4230*xformL03;\n+ \n+ CCTK_REAL csetemp226 CCTK_ATTRIBUTE_UNUSED = tdg4231*xformL13;\n+ \n+ CCTK_REAL csetemp227 CCTK_ATTRIBUTE_UNUSED = tdg4232*xformL23;\n+ \n+ CCTK_REAL csetemp228 CCTK_ATTRIBUTE_UNUSED = tdg4233*xformL33;\n+ \n+ CCTK_REAL csetemp229 CCTK_ATTRIBUTE_UNUSED = tdg4330*xformL03;\n+ \n+ CCTK_REAL csetemp230 CCTK_ATTRIBUTE_UNUSED = tdg4331*xformL13;\n+ \n+ CCTK_REAL csetemp231 CCTK_ATTRIBUTE_UNUSED = tdg4332*xformL23;\n+ \n+ CCTK_REAL csetemp232 CCTK_ATTRIBUTE_UNUSED = tdg4333*xformL33;\n+ \n+ CCTK_REAL dg4013 CCTK_ATTRIBUTE_UNUSED = xformL00*((csetemp193 + \n+ csetemp194 + csetemp195 + csetemp196)*xformL01 + (csetemp197 + \n+ csetemp198 + csetemp199 + csetemp200)*xformL11 + (csetemp201 + \n+ csetemp202 + csetemp203 + csetemp204)*xformL21 + (csetemp205 + \n+ csetemp206 + csetemp207 + csetemp208)*xformL31) + xformL10*((csetemp197 \n+ + csetemp198 + csetemp199 + csetemp200)*xformL01 + (csetemp209 + \n+ csetemp210 + csetemp211 + csetemp212)*xformL11 + (csetemp213 + \n+ csetemp214 + csetemp215 + csetemp216)*xformL21 + (csetemp217 + \n+ csetemp218 + csetemp219 + csetemp220)*xformL31) + xformL20*((csetemp201 \n+ + csetemp202 + csetemp203 + csetemp204)*xformL01 + (csetemp213 + \n+ csetemp214 + csetemp215 + csetemp216)*xformL11 + (csetemp221 + \n+ csetemp222 + csetemp223 + csetemp224)*xformL21 + (csetemp225 + \n+ csetemp226 + csetemp227 + csetemp228)*xformL31) + xformL30*((csetemp205 \n+ + csetemp206 + csetemp207 + csetemp208)*xformL01 + (csetemp217 + \n+ csetemp218 + csetemp219 + csetemp220)*xformL11 + (csetemp225 + \n+ csetemp226 + csetemp227 + csetemp228)*xformL21 + (csetemp229 + \n+ csetemp230 + csetemp231 + csetemp232)*xformL31);\n+ \n+ CCTK_REAL dg4020 CCTK_ATTRIBUTE_UNUSED = xformL20*((csetemp81 + \n+ csetemp82 + csetemp83 + csetemp84)*xformL02 + (csetemp93 + csetemp94 + \n+ csetemp95 + csetemp96)*xformL12 + (csetemp101 + csetemp102 + csetemp103 \n+ + csetemp104)*xformL22 + (csetemp105 + csetemp106 + csetemp107 + \n+ csetemp108)*xformL32) + xformL30*((csetemp85 + csetemp86 + csetemp87 + \n+ csetemp88)*xformL02 + (csetemp100 + csetemp97 + csetemp98 + \n+ csetemp99)*xformL12 + (csetemp105 + csetemp106 + csetemp107 + \n+ csetemp108)*xformL22 + (csetemp109 + csetemp110 + csetemp111 + \n+ csetemp112)*xformL32) + xformL00*((csetemp73 + csetemp74 + csetemp75 + \n+ csetemp76)*xformL02 + (csetemp77 + csetemp78 + csetemp79 + \n+ csetemp80)*xformL12 + (csetemp81 + csetemp82 + csetemp83 + \n+ csetemp84)*xformL22 + (csetemp85 + csetemp86 + csetemp87 + \n+ csetemp88)*xformL32) + xformL10*((csetemp77 + csetemp78 + csetemp79 + \n+ csetemp80)*xformL02 + (csetemp89 + csetemp90 + csetemp91 + \n+ csetemp92)*xformL12 + (csetemp93 + csetemp94 + csetemp95 + \n+ csetemp96)*xformL22 + (csetemp100 + csetemp97 + csetemp98 + \n+ csetemp99)*xformL32);\n+ \n+ CCTK_REAL dg4021 CCTK_ATTRIBUTE_UNUSED = xformL00*((csetemp113 + \n+ csetemp114 + csetemp115 + csetemp116)*xformL02 + (csetemp117 + \n+ csetemp118 + csetemp119 + csetemp120)*xformL12 + (csetemp121 + \n+ csetemp122 + csetemp123 + csetemp124)*xformL22 + (csetemp125 + \n+ csetemp126 + csetemp127 + csetemp128)*xformL32) + xformL10*((csetemp117 \n+ + csetemp118 + csetemp119 + csetemp120)*xformL02 + (csetemp129 + \n+ csetemp130 + csetemp131 + csetemp132)*xformL12 + (csetemp133 + \n+ csetemp134 + csetemp135 + csetemp136)*xformL22 + (csetemp137 + \n+ csetemp138 + csetemp139 + csetemp140)*xformL32) + xformL20*((csetemp121 \n+ + csetemp122 + csetemp123 + csetemp124)*xformL02 + (csetemp133 + \n+ csetemp134 + csetemp135 + csetemp136)*xformL12 + (csetemp141 + \n+ csetemp142 + csetemp143 + csetemp144)*xformL22 + (csetemp145 + \n+ csetemp146 + csetemp147 + csetemp148)*xformL32) + xformL30*((csetemp125 \n+ + csetemp126 + csetemp127 + csetemp128)*xformL02 + (csetemp137 + \n+ csetemp138 + csetemp139 + csetemp140)*xformL12 + (csetemp145 + \n+ csetemp146 + csetemp147 + csetemp148)*xformL22 + (csetemp149 + \n+ csetemp150 + csetemp151 + csetemp152)*xformL32);\n+ \n+ CCTK_REAL dg4022 CCTK_ATTRIBUTE_UNUSED = xformL00*((csetemp153 + \n+ csetemp154 + csetemp155 + csetemp156)*xformL02 + (csetemp157 + \n+ csetemp158 + csetemp159 + csetemp160)*xformL12 + (csetemp161 + \n+ csetemp162 + csetemp163 + csetemp164)*xformL22 + (csetemp165 + \n+ csetemp166 + csetemp167 + csetemp168)*xformL32) + xformL10*((csetemp157 \n+ + csetemp158 + csetemp159 + csetemp160)*xformL02 + (csetemp169 + \n+ csetemp170 + csetemp171 + csetemp172)*xformL12 + (csetemp173 + \n+ csetemp174 + csetemp175 + csetemp176)*xformL22 + (csetemp177 + \n+ csetemp178 + csetemp179 + csetemp180)*xformL32) + xformL20*((csetemp161 \n+ + csetemp162 + csetemp163 + csetemp164)*xformL02 + (csetemp173 + \n+ csetemp174 + csetemp175 + csetemp176)*xformL12 + (csetemp181 + \n+ csetemp182 + csetemp183 + csetemp184)*xformL22 + (csetemp185 + \n+ csetemp186 + csetemp187 + csetemp188)*xformL32) + xformL30*((csetemp165 \n+ + csetemp166 + csetemp167 + csetemp168)*xformL02 + (csetemp177 + \n+ csetemp178 + csetemp179 + csetemp180)*xformL12 + (csetemp185 + \n+ csetemp186 + csetemp187 + csetemp188)*xformL22 + (csetemp189 + \n+ csetemp190 + csetemp191 + csetemp192)*xformL32);\n+ \n+ CCTK_REAL dg4023 CCTK_ATTRIBUTE_UNUSED = xformL00*((csetemp193 + \n+ csetemp194 + csetemp195 + csetemp196)*xformL02 + (csetemp197 + \n+ csetemp198 + csetemp199 + csetemp200)*xformL12 + (csetemp201 + \n+ csetemp202 + csetemp203 + csetemp204)*xformL22 + (csetemp205 + \n+ csetemp206 + csetemp207 + csetemp208)*xformL32) + xformL10*((csetemp197 \n+ + csetemp198 + csetemp199 + csetemp200)*xformL02 + (csetemp209 + \n+ csetemp210 + csetemp211 + csetemp212)*xformL12 + (csetemp213 + \n+ csetemp214 + csetemp215 + csetemp216)*xformL22 + (csetemp217 + \n+ csetemp218 + csetemp219 + csetemp220)*xformL32) + xformL20*((csetemp201 \n+ + csetemp202 + csetemp203 + csetemp204)*xformL02 + (csetemp213 + \n+ csetemp214 + csetemp215 + csetemp216)*xformL12 + (csetemp221 + \n+ csetemp222 + csetemp223 + csetemp224)*xformL22 + (csetemp225 + \n+ csetemp226 + csetemp227 + csetemp228)*xformL32) + xformL30*((csetemp205 \n+ + csetemp206 + csetemp207 + csetemp208)*xformL02 + (csetemp217 + \n+ csetemp218 + csetemp219 + csetemp220)*xformL12 + (csetemp225 + \n+ csetemp226 + csetemp227 + csetemp228)*xformL22 + (csetemp229 + \n+ csetemp230 + csetemp231 + csetemp232)*xformL32);\n+ \n+ CCTK_REAL dg4030 CCTK_ATTRIBUTE_UNUSED = xformL20*((csetemp81 + \n+ csetemp82 + csetemp83 + csetemp84)*xformL03 + (csetemp93 + csetemp94 + \n+ csetemp95 + csetemp96)*xformL13 + (csetemp101 + csetemp102 + csetemp103 \n+ + csetemp104)*xformL23 + (csetemp105 + csetemp106 + csetemp107 + \n+ csetemp108)*xformL33) + xformL30*((csetemp85 + csetemp86 + csetemp87 + \n+ csetemp88)*xformL03 + (csetemp100 + csetemp97 + csetemp98 + \n+ csetemp99)*xformL13 + (csetemp105 + csetemp106 + csetemp107 + \n+ csetemp108)*xformL23 + (csetemp109 + csetemp110 + csetemp111 + \n+ csetemp112)*xformL33) + xformL00*((csetemp73 + csetemp74 + csetemp75 + \n+ csetemp76)*xformL03 + (csetemp77 + csetemp78 + csetemp79 + \n+ csetemp80)*xformL13 + (csetemp81 + csetemp82 + csetemp83 + \n+ csetemp84)*xformL23 + (csetemp85 + csetemp86 + csetemp87 + \n+ csetemp88)*xformL33) + xformL10*((csetemp77 + csetemp78 + csetemp79 + \n+ csetemp80)*xformL03 + (csetemp89 + csetemp90 + csetemp91 + \n+ csetemp92)*xformL13 + (csetemp93 + csetemp94 + csetemp95 + \n+ csetemp96)*xformL23 + (csetemp100 + csetemp97 + csetemp98 + \n+ csetemp99)*xformL33);\n+ \n+ CCTK_REAL dg4031 CCTK_ATTRIBUTE_UNUSED = xformL00*((csetemp113 + \n+ csetemp114 + csetemp115 + csetemp116)*xformL03 + (csetemp117 + \n+ csetemp118 + csetemp119 + csetemp120)*xformL13 + (csetemp121 + \n+ csetemp122 + csetemp123 + csetemp124)*xformL23 + (csetemp125 + \n+ csetemp126 + csetemp127 + csetemp128)*xformL33) + xformL10*((csetemp117 \n+ + csetemp118 + csetemp119 + csetemp120)*xformL03 + (csetemp129 + \n+ csetemp130 + csetemp131 + csetemp132)*xformL13 + (csetemp133 + \n+ csetemp134 + csetemp135 + csetemp136)*xformL23 + (csetemp137 + \n+ csetemp138 + csetemp139 + csetemp140)*xformL33) + xformL20*((csetemp121 \n+ + csetemp122 + csetemp123 + csetemp124)*xformL03 + (csetemp133 + \n+ csetemp134 + csetemp135 + csetemp136)*xformL13 + (csetemp141 + \n+ csetemp142 + csetemp143 + csetemp144)*xformL23 + (csetemp145 + \n+ csetemp146 + csetemp147 + csetemp148)*xformL33) + xformL30*((csetemp125 \n+ + csetemp126 + csetemp127 + csetemp128)*xformL03 + (csetemp137 + \n+ csetemp138 + csetemp139 + csetemp140)*xformL13 + (csetemp145 + \n+ csetemp146 + csetemp147 + csetemp148)*xformL23 + (csetemp149 + \n+ csetemp150 + csetemp151 + csetemp152)*xformL33);\n+ \n+ CCTK_REAL dg4032 CCTK_ATTRIBUTE_UNUSED = xformL00*((csetemp153 + \n+ csetemp154 + csetemp155 + csetemp156)*xformL03 + (csetemp157 + \n+ csetemp158 + csetemp159 + csetemp160)*xformL13 + (csetemp161 + \n+ csetemp162 + csetemp163 + csetemp164)*xformL23 + (csetemp165 + \n+ csetemp166 + csetemp167 + csetemp168)*xformL33) + xformL10*((csetemp157 \n+ + csetemp158 + csetemp159 + csetemp160)*xformL03 + (csetemp169 + \n+ csetemp170 + csetemp171 + csetemp172)*xformL13 + (csetemp173 + \n+ csetemp174 + csetemp175 + csetemp176)*xformL23 + (csetemp177 + \n+ csetemp178 + csetemp179 + csetemp180)*xformL33) + xformL20*((csetemp161 \n+ + csetemp162 + csetemp163 + csetemp164)*xformL03 + (csetemp173 + \n+ csetemp174 + csetemp175 + csetemp176)*xformL13 + (csetemp181 + \n+ csetemp182 + csetemp183 + csetemp184)*xformL23 + (csetemp185 + \n+ csetemp186 + csetemp187 + csetemp188)*xformL33) + xformL30*((csetemp165 \n+ + csetemp166 + csetemp167 + csetemp168)*xformL03 + (csetemp177 + \n+ csetemp178 + csetemp179 + csetemp180)*xformL13 + (csetemp185 + \n+ csetemp186 + csetemp187 + csetemp188)*xformL23 + (csetemp189 + \n+ csetemp190 + csetemp191 + csetemp192)*xformL33);\n+ \n+ CCTK_REAL dg4033 CCTK_ATTRIBUTE_UNUSED = xformL00*((csetemp193 + \n+ csetemp194 + csetemp195 + csetemp196)*xformL03 + (csetemp197 + \n+ csetemp198 + csetemp199 + csetemp200)*xformL13 + (csetemp201 + \n+ csetemp202 + csetemp203 + csetemp204)*xformL23 + (csetemp205 + \n+ csetemp206 + csetemp207 + csetemp208)*xformL33) + xformL10*((csetemp197 \n+ + csetemp198 + csetemp199 + csetemp200)*xformL03 + (csetemp209 + \n+ csetemp210 + csetemp211 + csetemp212)*xformL13 + (csetemp213 + \n+ csetemp214 + csetemp215 + csetemp216)*xformL23 + (csetemp217 + \n+ csetemp218 + csetemp219 + csetemp220)*xformL33) + xformL20*((csetemp201 \n+ + csetemp202 + csetemp203 + csetemp204)*xformL03 + (csetemp213 + \n+ csetemp214 + csetemp215 + csetemp216)*xformL13 + (csetemp221 + \n+ csetemp222 + csetemp223 + csetemp224)*xformL23 + (csetemp225 + \n+ csetemp226 + csetemp227 + csetemp228)*xformL33) + xformL30*((csetemp205 \n+ + csetemp206 + csetemp207 + csetemp208)*xformL03 + (csetemp217 + \n+ csetemp218 + csetemp219 + csetemp220)*xformL13 + (csetemp225 + \n+ csetemp226 + csetemp227 + csetemp228)*xformL23 + (csetemp229 + \n+ csetemp230 + csetemp231 + csetemp232)*xformL33);\n+ \n+ CCTK_REAL dg4110 CCTK_ATTRIBUTE_UNUSED = xformL21*((csetemp81 + \n+ csetemp82 + csetemp83 + csetemp84)*xformL01 + (csetemp93 + csetemp94 + \n+ csetemp95 + csetemp96)*xformL11 + (csetemp101 + csetemp102 + csetemp103 \n+ + csetemp104)*xformL21 + (csetemp105 + csetemp106 + csetemp107 + \n+ csetemp108)*xformL31) + xformL31*((csetemp85 + csetemp86 + csetemp87 + \n+ csetemp88)*xformL01 + (csetemp100 + csetemp97 + csetemp98 + \n+ csetemp99)*xformL11 + (csetemp105 + csetemp106 + csetemp107 + \n+ csetemp108)*xformL21 + (csetemp109 + csetemp110 + csetemp111 + \n+ csetemp112)*xformL31) + xformL01*((csetemp73 + csetemp74 + csetemp75 + \n+ csetemp76)*xformL01 + (csetemp77 + csetemp78 + csetemp79 + \n+ csetemp80)*xformL11 + (csetemp81 + csetemp82 + csetemp83 + \n+ csetemp84)*xformL21 + (csetemp85 + csetemp86 + csetemp87 + \n+ csetemp88)*xformL31) + xformL11*((csetemp77 + csetemp78 + csetemp79 + \n+ csetemp80)*xformL01 + (csetemp89 + csetemp90 + csetemp91 + \n+ csetemp92)*xformL11 + (csetemp93 + csetemp94 + csetemp95 + \n+ csetemp96)*xformL21 + (csetemp100 + csetemp97 + csetemp98 + \n+ csetemp99)*xformL31);\n+ \n+ CCTK_REAL dg4111 CCTK_ATTRIBUTE_UNUSED = xformL01*((csetemp113 + \n+ csetemp114 + csetemp115 + csetemp116)*xformL01 + (csetemp117 + \n+ csetemp118 + csetemp119 + csetemp120)*xformL11 + (csetemp121 + \n+ csetemp122 + csetemp123 + csetemp124)*xformL21 + (csetemp125 + \n+ csetemp126 + csetemp127 + csetemp128)*xformL31) + xformL11*((csetemp117 \n+ + csetemp118 + csetemp119 + csetemp120)*xformL01 + (csetemp129 + \n+ csetemp130 + csetemp131 + csetemp132)*xformL11 + (csetemp133 + \n+ csetemp134 + csetemp135 + csetemp136)*xformL21 + (csetemp137 + \n+ csetemp138 + csetemp139 + csetemp140)*xformL31) + xformL21*((csetemp121 \n+ + csetemp122 + csetemp123 + csetemp124)*xformL01 + (csetemp133 + \n+ csetemp134 + csetemp135 + csetemp136)*xformL11 + (csetemp141 + \n+ csetemp142 + csetemp143 + csetemp144)*xformL21 + (csetemp145 + \n+ csetemp146 + csetemp147 + csetemp148)*xformL31) + xformL31*((csetemp125 \n+ + csetemp126 + csetemp127 + csetemp128)*xformL01 + (csetemp137 + \n+ csetemp138 + csetemp139 + csetemp140)*xformL11 + (csetemp145 + \n+ csetemp146 + csetemp147 + csetemp148)*xformL21 + (csetemp149 + \n+ csetemp150 + csetemp151 + csetemp152)*xformL31);\n+ \n+ CCTK_REAL dg4112 CCTK_ATTRIBUTE_UNUSED = xformL01*((csetemp153 + \n+ csetemp154 + csetemp155 + csetemp156)*xformL01 + (csetemp157 + \n+ csetemp158 + csetemp159 + csetemp160)*xformL11 + (csetemp161 + \n+ csetemp162 + csetemp163 + csetemp164)*xformL21 + (csetemp165 + \n+ csetemp166 + csetemp167 + csetemp168)*xformL31) + xformL11*((csetemp157 \n+ + csetemp158 + csetemp159 + csetemp160)*xformL01 + (csetemp169 + \n+ csetemp170 + csetemp171 + csetemp172)*xformL11 + (csetemp173 + \n+ csetemp174 + csetemp175 + csetemp176)*xformL21 + (csetemp177 + \n+ csetemp178 + csetemp179 + csetemp180)*xformL31) + xformL21*((csetemp161 \n+ + csetemp162 + csetemp163 + csetemp164)*xformL01 + (csetemp173 + \n+ csetemp174 + csetemp175 + csetemp176)*xformL11 + (csetemp181 + \n+ csetemp182 + csetemp183 + csetemp184)*xformL21 + (csetemp185 + \n+ csetemp186 + csetemp187 + csetemp188)*xformL31) + xformL31*((csetemp165 \n+ + csetemp166 + csetemp167 + csetemp168)*xformL01 + (csetemp177 + \n+ csetemp178 + csetemp179 + csetemp180)*xformL11 + (csetemp185 + \n+ csetemp186 + csetemp187 + csetemp188)*xformL21 + (csetemp189 + \n+ csetemp190 + csetemp191 + csetemp192)*xformL31);\n+ \n+ CCTK_REAL dg4113 CCTK_ATTRIBUTE_UNUSED = xformL01*((csetemp193 + \n+ csetemp194 + csetemp195 + csetemp196)*xformL01 + (csetemp197 + \n+ csetemp198 + csetemp199 + csetemp200)*xformL11 + (csetemp201 + \n+ csetemp202 + csetemp203 + csetemp204)*xformL21 + (csetemp205 + \n+ csetemp206 + csetemp207 + csetemp208)*xformL31) + xformL11*((csetemp197 \n+ + csetemp198 + csetemp199 + csetemp200)*xformL01 + (csetemp209 + \n+ csetemp210 + csetemp211 + csetemp212)*xformL11 + (csetemp213 + \n+ csetemp214 + csetemp215 + csetemp216)*xformL21 + (csetemp217 + \n+ csetemp218 + csetemp219 + csetemp220)*xformL31) + xformL21*((csetemp201 \n+ + csetemp202 + csetemp203 + csetemp204)*xformL01 + (csetemp213 + \n+ csetemp214 + csetemp215 + csetemp216)*xformL11 + (csetemp221 + \n+ csetemp222 + csetemp223 + csetemp224)*xformL21 + (csetemp225 + \n+ csetemp226 + csetemp227 + csetemp228)*xformL31) + xformL31*((csetemp205 \n+ + csetemp206 + csetemp207 + csetemp208)*xformL01 + (csetemp217 + \n+ csetemp218 + csetemp219 + csetemp220)*xformL11 + (csetemp225 + \n+ csetemp226 + csetemp227 + csetemp228)*xformL21 + (csetemp229 + \n+ csetemp230 + csetemp231 + csetemp232)*xformL31);\n+ \n+ CCTK_REAL dg4120 CCTK_ATTRIBUTE_UNUSED = xformL21*((csetemp81 + \n+ csetemp82 + csetemp83 + csetemp84)*xformL02 + (csetemp93 + csetemp94 + \n+ csetemp95 + csetemp96)*xformL12 + (csetemp101 + csetemp102 + csetemp103 \n+ + csetemp104)*xformL22 + (csetemp105 + csetemp106 + csetemp107 + \n+ csetemp108)*xformL32) + xformL31*((csetemp85 + csetemp86 + csetemp87 + \n+ csetemp88)*xformL02 + (csetemp100 + csetemp97 + csetemp98 + \n+ csetemp99)*xformL12 + (csetemp105 + csetemp106 + csetemp107 + \n+ csetemp108)*xformL22 + (csetemp109 + csetemp110 + csetemp111 + \n+ csetemp112)*xformL32) + xformL01*((csetemp73 + csetemp74 + csetemp75 + \n+ csetemp76)*xformL02 + (csetemp77 + csetemp78 + csetemp79 + \n+ csetemp80)*xformL12 + (csetemp81 + csetemp82 + csetemp83 + \n+ csetemp84)*xformL22 + (csetemp85 + csetemp86 + csetemp87 + \n+ csetemp88)*xformL32) + xformL11*((csetemp77 + csetemp78 + csetemp79 + \n+ csetemp80)*xformL02 + (csetemp89 + csetemp90 + csetemp91 + \n+ csetemp92)*xformL12 + (csetemp93 + csetemp94 + csetemp95 + \n+ csetemp96)*xformL22 + (csetemp100 + csetemp97 + csetemp98 + \n+ csetemp99)*xformL32);\n+ \n+ CCTK_REAL dg4121 CCTK_ATTRIBUTE_UNUSED = xformL01*((csetemp113 + \n+ csetemp114 + csetemp115 + csetemp116)*xformL02 + (csetemp117 + \n+ csetemp118 + csetemp119 + csetemp120)*xformL12 + (csetemp121 + \n+ csetemp122 + csetemp123 + csetemp124)*xformL22 + (csetemp125 + \n+ csetemp126 + csetemp127 + csetemp128)*xformL32) + xformL11*((csetemp117 \n+ + csetemp118 + csetemp119 + csetemp120)*xformL02 + (csetemp129 + \n+ csetemp130 + csetemp131 + csetemp132)*xformL12 + (csetemp133 + \n+ csetemp134 + csetemp135 + csetemp136)*xformL22 + (csetemp137 + \n+ csetemp138 + csetemp139 + csetemp140)*xformL32) + xformL21*((csetemp121 \n+ + csetemp122 + csetemp123 + csetemp124)*xformL02 + (csetemp133 + \n+ csetemp134 + csetemp135 + csetemp136)*xformL12 + (csetemp141 + \n+ csetemp142 + csetemp143 + csetemp144)*xformL22 + (csetemp145 + \n+ csetemp146 + csetemp147 + csetemp148)*xformL32) + xformL31*((csetemp125 \n+ + csetemp126 + csetemp127 + csetemp128)*xformL02 + (csetemp137 + \n+ csetemp138 + csetemp139 + csetemp140)*xformL12 + (csetemp145 + \n+ csetemp146 + csetemp147 + csetemp148)*xformL22 + (csetemp149 + \n+ csetemp150 + csetemp151 + csetemp152)*xformL32);\n+ \n+ CCTK_REAL dg4122 CCTK_ATTRIBUTE_UNUSED = xformL01*((csetemp153 + \n+ csetemp154 + csetemp155 + csetemp156)*xformL02 + (csetemp157 + \n+ csetemp158 + csetemp159 + csetemp160)*xformL12 + (csetemp161 + \n+ csetemp162 + csetemp163 + csetemp164)*xformL22 + (csetemp165 + \n+ csetemp166 + csetemp167 + csetemp168)*xformL32) + xformL11*((csetemp157 \n+ + csetemp158 + csetemp159 + csetemp160)*xformL02 + (csetemp169 + \n+ csetemp170 + csetemp171 + csetemp172)*xformL12 + (csetemp173 + \n+ csetemp174 + csetemp175 + csetemp176)*xformL22 + (csetemp177 + \n+ csetemp178 + csetemp179 + csetemp180)*xformL32) + xformL21*((csetemp161 \n+ + csetemp162 + csetemp163 + csetemp164)*xformL02 + (csetemp173 + \n+ csetemp174 + csetemp175 + csetemp176)*xformL12 + (csetemp181 + \n+ csetemp182 + csetemp183 + csetemp184)*xformL22 + (csetemp185 + \n+ csetemp186 + csetemp187 + csetemp188)*xformL32) + xformL31*((csetemp165 \n+ + csetemp166 + csetemp167 + csetemp168)*xformL02 + (csetemp177 + \n+ csetemp178 + csetemp179 + csetemp180)*xformL12 + (csetemp185 + \n+ csetemp186 + csetemp187 + csetemp188)*xformL22 + (csetemp189 + \n+ csetemp190 + csetemp191 + csetemp192)*xformL32);\n+ \n+ CCTK_REAL dg4123 CCTK_ATTRIBUTE_UNUSED = xformL01*((csetemp193 + \n+ csetemp194 + csetemp195 + csetemp196)*xformL02 + (csetemp197 + \n+ csetemp198 + csetemp199 + csetemp200)*xformL12 + (csetemp201 + \n+ csetemp202 + csetemp203 + csetemp204)*xformL22 + (csetemp205 + \n+ csetemp206 + csetemp207 + csetemp208)*xformL32) + xformL11*((csetemp197 \n+ + csetemp198 + csetemp199 + csetemp200)*xformL02 + (csetemp209 + \n+ csetemp210 + csetemp211 + csetemp212)*xformL12 + (csetemp213 + \n+ csetemp214 + csetemp215 + csetemp216)*xformL22 + (csetemp217 + \n+ csetemp218 + csetemp219 + csetemp220)*xformL32) + xformL21*((csetemp201 \n+ + csetemp202 + csetemp203 + csetemp204)*xformL02 + (csetemp213 + \n+ csetemp214 + csetemp215 + csetemp216)*xformL12 + (csetemp221 + \n+ csetemp222 + csetemp223 + csetemp224)*xformL22 + (csetemp225 + \n+ csetemp226 + csetemp227 + csetemp228)*xformL32) + xformL31*((csetemp205 \n+ + csetemp206 + csetemp207 + csetemp208)*xformL02 + (csetemp217 + \n+ csetemp218 + csetemp219 + csetemp220)*xformL12 + (csetemp225 + \n+ csetemp226 + csetemp227 + csetemp228)*xformL22 + (csetemp229 + \n+ csetemp230 + csetemp231 + csetemp232)*xformL32);\n+ \n+ CCTK_REAL dg4130 CCTK_ATTRIBUTE_UNUSED = xformL21*((csetemp81 + \n+ csetemp82 + csetemp83 + csetemp84)*xformL03 + (csetemp93 + csetemp94 + \n+ csetemp95 + csetemp96)*xformL13 + (csetemp101 + csetemp102 + csetemp103 \n+ + csetemp104)*xformL23 + (csetemp105 + csetemp106 + csetemp107 + \n+ csetemp108)*xformL33) + xformL31*((csetemp85 + csetemp86 + csetemp87 + \n+ csetemp88)*xformL03 + (csetemp100 + csetemp97 + csetemp98 + \n+ csetemp99)*xformL13 + (csetemp105 + csetemp106 + csetemp107 + \n+ csetemp108)*xformL23 + (csetemp109 + csetemp110 + csetemp111 + \n+ csetemp112)*xformL33) + xformL01*((csetemp73 + csetemp74 + csetemp75 + \n+ csetemp76)*xformL03 + (csetemp77 + csetemp78 + csetemp79 + \n+ csetemp80)*xformL13 + (csetemp81 + csetemp82 + csetemp83 + \n+ csetemp84)*xformL23 + (csetemp85 + csetemp86 + csetemp87 + \n+ csetemp88)*xformL33) + xformL11*((csetemp77 + csetemp78 + csetemp79 + \n+ csetemp80)*xformL03 + (csetemp89 + csetemp90 + csetemp91 + \n+ csetemp92)*xformL13 + (csetemp93 + csetemp94 + csetemp95 + \n+ csetemp96)*xformL23 + (csetemp100 + csetemp97 + csetemp98 + \n+ csetemp99)*xformL33);\n+ \n+ CCTK_REAL dg4131 CCTK_ATTRIBUTE_UNUSED = xformL01*((csetemp113 + \n+ csetemp114 + csetemp115 + csetemp116)*xformL03 + (csetemp117 + \n+ csetemp118 + csetemp119 + csetemp120)*xformL13 + (csetemp121 + \n+ csetemp122 + csetemp123 + csetemp124)*xformL23 + (csetemp125 + \n+ csetemp126 + csetemp127 + csetemp128)*xformL33) + xformL11*((csetemp117 \n+ + csetemp118 + csetemp119 + csetemp120)*xformL03 + (csetemp129 + \n+ csetemp130 + csetemp131 + csetemp132)*xformL13 + (csetemp133 + \n+ csetemp134 + csetemp135 + csetemp136)*xformL23 + (csetemp137 + \n+ csetemp138 + csetemp139 + csetemp140)*xformL33) + xformL21*((csetemp121 \n+ + csetemp122 + csetemp123 + csetemp124)*xformL03 + (csetemp133 + \n+ csetemp134 + csetemp135 + csetemp136)*xformL13 + (csetemp141 + \n+ csetemp142 + csetemp143 + csetemp144)*xformL23 + (csetemp145 + \n+ csetemp146 + csetemp147 + csetemp148)*xformL33) + xformL31*((csetemp125 \n+ + csetemp126 + csetemp127 + csetemp128)*xformL03 + (csetemp137 + \n+ csetemp138 + csetemp139 + csetemp140)*xformL13 + (csetemp145 + \n+ csetemp146 + csetemp147 + csetemp148)*xformL23 + (csetemp149 + \n+ csetemp150 + csetemp151 + csetemp152)*xformL33);\n+ \n+ CCTK_REAL dg4132 CCTK_ATTRIBUTE_UNUSED = xformL01*((csetemp153 + \n+ csetemp154 + csetemp155 + csetemp156)*xformL03 + (csetemp157 + \n+ csetemp158 + csetemp159 + csetemp160)*xformL13 + (csetemp161 + \n+ csetemp162 + csetemp163 + csetemp164)*xformL23 + (csetemp165 + \n+ csetemp166 + csetemp167 + csetemp168)*xformL33) + xformL11*((csetemp157 \n+ + csetemp158 + csetemp159 + csetemp160)*xformL03 + (csetemp169 + \n+ csetemp170 + csetemp171 + csetemp172)*xformL13 + (csetemp173 + \n+ csetemp174 + csetemp175 + csetemp176)*xformL23 + (csetemp177 + \n+ csetemp178 + csetemp179 + csetemp180)*xformL33) + xformL21*((csetemp161 \n+ + csetemp162 + csetemp163 + csetemp164)*xformL03 + (csetemp173 + \n+ csetemp174 + csetemp175 + csetemp176)*xformL13 + (csetemp181 + \n+ csetemp182 + csetemp183 + csetemp184)*xformL23 + (csetemp185 + \n+ csetemp186 + csetemp187 + csetemp188)*xformL33) + xformL31*((csetemp165 \n+ + csetemp166 + csetemp167 + csetemp168)*xformL03 + (csetemp177 + \n+ csetemp178 + csetemp179 + csetemp180)*xformL13 + (csetemp185 + \n+ csetemp186 + csetemp187 + csetemp188)*xformL23 + (csetemp189 + \n+ csetemp190 + csetemp191 + csetemp192)*xformL33);\n+ \n+ CCTK_REAL dg4133 CCTK_ATTRIBUTE_UNUSED = xformL01*((csetemp193 + \n+ csetemp194 + csetemp195 + csetemp196)*xformL03 + (csetemp197 + \n+ csetemp198 + csetemp199 + csetemp200)*xformL13 + (csetemp201 + \n+ csetemp202 + csetemp203 + csetemp204)*xformL23 + (csetemp205 + \n+ csetemp206 + csetemp207 + csetemp208)*xformL33) + xformL11*((csetemp197 \n+ + csetemp198 + csetemp199 + csetemp200)*xformL03 + (csetemp209 + \n+ csetemp210 + csetemp211 + csetemp212)*xformL13 + (csetemp213 + \n+ csetemp214 + csetemp215 + csetemp216)*xformL23 + (csetemp217 + \n+ csetemp218 + csetemp219 + csetemp220)*xformL33) + xformL21*((csetemp201 \n+ + csetemp202 + csetemp203 + csetemp204)*xformL03 + (csetemp213 + \n+ csetemp214 + csetemp215 + csetemp216)*xformL13 + (csetemp221 + \n+ csetemp222 + csetemp223 + csetemp224)*xformL23 + (csetemp225 + \n+ csetemp226 + csetemp227 + csetemp228)*xformL33) + xformL31*((csetemp205 \n+ + csetemp206 + csetemp207 + csetemp208)*xformL03 + (csetemp217 + \n+ csetemp218 + csetemp219 + csetemp220)*xformL13 + (csetemp225 + \n+ csetemp226 + csetemp227 + csetemp228)*xformL23 + (csetemp229 + \n+ csetemp230 + csetemp231 + csetemp232)*xformL33);\n+ \n+ CCTK_REAL dg4220 CCTK_ATTRIBUTE_UNUSED = xformL22*((csetemp81 + \n+ csetemp82 + csetemp83 + csetemp84)*xformL02 + (csetemp93 + csetemp94 + \n+ csetemp95 + csetemp96)*xformL12 + (csetemp101 + csetemp102 + csetemp103 \n+ + csetemp104)*xformL22 + (csetemp105 + csetemp106 + csetemp107 + \n+ csetemp108)*xformL32) + xformL32*((csetemp85 + csetemp86 + csetemp87 + \n+ csetemp88)*xformL02 + (csetemp100 + csetemp97 + csetemp98 + \n+ csetemp99)*xformL12 + (csetemp105 + csetemp106 + csetemp107 + \n+ csetemp108)*xformL22 + (csetemp109 + csetemp110 + csetemp111 + \n+ csetemp112)*xformL32) + xformL02*((csetemp73 + csetemp74 + csetemp75 + \n+ csetemp76)*xformL02 + (csetemp77 + csetemp78 + csetemp79 + \n+ csetemp80)*xformL12 + (csetemp81 + csetemp82 + csetemp83 + \n+ csetemp84)*xformL22 + (csetemp85 + csetemp86 + csetemp87 + \n+ csetemp88)*xformL32) + xformL12*((csetemp77 + csetemp78 + csetemp79 + \n+ csetemp80)*xformL02 + (csetemp89 + csetemp90 + csetemp91 + \n+ csetemp92)*xformL12 + (csetemp93 + csetemp94 + csetemp95 + \n+ csetemp96)*xformL22 + (csetemp100 + csetemp97 + csetemp98 + \n+ csetemp99)*xformL32);\n+ \n+ CCTK_REAL dg4221 CCTK_ATTRIBUTE_UNUSED = xformL02*((csetemp113 + \n+ csetemp114 + csetemp115 + csetemp116)*xformL02 + (csetemp117 + \n+ csetemp118 + csetemp119 + csetemp120)*xformL12 + (csetemp121 + \n+ csetemp122 + csetemp123 + csetemp124)*xformL22 + (csetemp125 + \n+ csetemp126 + csetemp127 + csetemp128)*xformL32) + xformL12*((csetemp117 \n+ + csetemp118 + csetemp119 + csetemp120)*xformL02 + (csetemp129 + \n+ csetemp130 + csetemp131 + csetemp132)*xformL12 + (csetemp133 + \n+ csetemp134 + csetemp135 + csetemp136)*xformL22 + (csetemp137 + \n+ csetemp138 + csetemp139 + csetemp140)*xformL32) + xformL22*((csetemp121 \n+ + csetemp122 + csetemp123 + csetemp124)*xformL02 + (csetemp133 + \n+ csetemp134 + csetemp135 + csetemp136)*xformL12 + (csetemp141 + \n+ csetemp142 + csetemp143 + csetemp144)*xformL22 + (csetemp145 + \n+ csetemp146 + csetemp147 + csetemp148)*xformL32) + xformL32*((csetemp125 \n+ + csetemp126 + csetemp127 + csetemp128)*xformL02 + (csetemp137 + \n+ csetemp138 + csetemp139 + csetemp140)*xformL12 + (csetemp145 + \n+ csetemp146 + csetemp147 + csetemp148)*xformL22 + (csetemp149 + \n+ csetemp150 + csetemp151 + csetemp152)*xformL32);\n+ \n+ CCTK_REAL dg4222 CCTK_ATTRIBUTE_UNUSED = xformL02*((csetemp153 + \n+ csetemp154 + csetemp155 + csetemp156)*xformL02 + (csetemp157 + \n+ csetemp158 + csetemp159 + csetemp160)*xformL12 + (csetemp161 + \n+ csetemp162 + csetemp163 + csetemp164)*xformL22 + (csetemp165 + \n+ csetemp166 + csetemp167 + csetemp168)*xformL32) + xformL12*((csetemp157 \n+ + csetemp158 + csetemp159 + csetemp160)*xformL02 + (csetemp169 + \n+ csetemp170 + csetemp171 + csetemp172)*xformL12 + (csetemp173 + \n+ csetemp174 + csetemp175 + csetemp176)*xformL22 + (csetemp177 + \n+ csetemp178 + csetemp179 + csetemp180)*xformL32) + xformL22*((csetemp161 \n+ + csetemp162 + csetemp163 + csetemp164)*xformL02 + (csetemp173 + \n+ csetemp174 + csetemp175 + csetemp176)*xformL12 + (csetemp181 + \n+ csetemp182 + csetemp183 + csetemp184)*xformL22 + (csetemp185 + \n+ csetemp186 + csetemp187 + csetemp188)*xformL32) + xformL32*((csetemp165 \n+ + csetemp166 + csetemp167 + csetemp168)*xformL02 + (csetemp177 + \n+ csetemp178 + csetemp179 + csetemp180)*xformL12 + (csetemp185 + \n+ csetemp186 + csetemp187 + csetemp188)*xformL22 + (csetemp189 + \n+ csetemp190 + csetemp191 + csetemp192)*xformL32);\n+ \n+ CCTK_REAL dg4223 CCTK_ATTRIBUTE_UNUSED = xformL02*((csetemp193 + \n+ csetemp194 + csetemp195 + csetemp196)*xformL02 + (csetemp197 + \n+ csetemp198 + csetemp199 + csetemp200)*xformL12 + (csetemp201 + \n+ csetemp202 + csetemp203 + csetemp204)*xformL22 + (csetemp205 + \n+ csetemp206 + csetemp207 + csetemp208)*xformL32) + xformL12*((csetemp197 \n+ + csetemp198 + csetemp199 + csetemp200)*xformL02 + (csetemp209 + \n+ csetemp210 + csetemp211 + csetemp212)*xformL12 + (csetemp213 + \n+ csetemp214 + csetemp215 + csetemp216)*xformL22 + (csetemp217 + \n+ csetemp218 + csetemp219 + csetemp220)*xformL32) + xformL22*((csetemp201 \n+ + csetemp202 + csetemp203 + csetemp204)*xformL02 + (csetemp213 + \n+ csetemp214 + csetemp215 + csetemp216)*xformL12 + (csetemp221 + \n+ csetemp222 + csetemp223 + csetemp224)*xformL22 + (csetemp225 + \n+ csetemp226 + csetemp227 + csetemp228)*xformL32) + xformL32*((csetemp205 \n+ + csetemp206 + csetemp207 + csetemp208)*xformL02 + (csetemp217 + \n+ csetemp218 + csetemp219 + csetemp220)*xformL12 + (csetemp225 + \n+ csetemp226 + csetemp227 + csetemp228)*xformL22 + (csetemp229 + \n+ csetemp230 + csetemp231 + csetemp232)*xformL32);\n+ \n+ CCTK_REAL dg4230 CCTK_ATTRIBUTE_UNUSED = xformL22*((csetemp81 + \n+ csetemp82 + csetemp83 + csetemp84)*xformL03 + (csetemp93 + csetemp94 + \n+ csetemp95 + csetemp96)*xformL13 + (csetemp101 + csetemp102 + csetemp103 \n+ + csetemp104)*xformL23 + (csetemp105 + csetemp106 + csetemp107 + \n+ csetemp108)*xformL33) + xformL32*((csetemp85 + csetemp86 + csetemp87 + \n+ csetemp88)*xformL03 + (csetemp100 + csetemp97 + csetemp98 + \n+ csetemp99)*xformL13 + (csetemp105 + csetemp106 + csetemp107 + \n+ csetemp108)*xformL23 + (csetemp109 + csetemp110 + csetemp111 + \n+ csetemp112)*xformL33) + xformL02*((csetemp73 + csetemp74 + csetemp75 + \n+ csetemp76)*xformL03 + (csetemp77 + csetemp78 + csetemp79 + \n+ csetemp80)*xformL13 + (csetemp81 + csetemp82 + csetemp83 + \n+ csetemp84)*xformL23 + (csetemp85 + csetemp86 + csetemp87 + \n+ csetemp88)*xformL33) + xformL12*((csetemp77 + csetemp78 + csetemp79 + \n+ csetemp80)*xformL03 + (csetemp89 + csetemp90 + csetemp91 + \n+ csetemp92)*xformL13 + (csetemp93 + csetemp94 + csetemp95 + \n+ csetemp96)*xformL23 + (csetemp100 + csetemp97 + csetemp98 + \n+ csetemp99)*xformL33);\n+ \n+ CCTK_REAL dg4231 CCTK_ATTRIBUTE_UNUSED = xformL02*((csetemp113 + \n+ csetemp114 + csetemp115 + csetemp116)*xformL03 + (csetemp117 + \n+ csetemp118 + csetemp119 + csetemp120)*xformL13 + (csetemp121 + \n+ csetemp122 + csetemp123 + csetemp124)*xformL23 + (csetemp125 + \n+ csetemp126 + csetemp127 + csetemp128)*xformL33) + xformL12*((csetemp117 \n+ + csetemp118 + csetemp119 + csetemp120)*xformL03 + (csetemp129 + \n+ csetemp130 + csetemp131 + csetemp132)*xformL13 + (csetemp133 + \n+ csetemp134 + csetemp135 + csetemp136)*xformL23 + (csetemp137 + \n+ csetemp138 + csetemp139 + csetemp140)*xformL33) + xformL22*((csetemp121 \n+ + csetemp122 + csetemp123 + csetemp124)*xformL03 + (csetemp133 + \n+ csetemp134 + csetemp135 + csetemp136)*xformL13 + (csetemp141 + \n+ csetemp142 + csetemp143 + csetemp144)*xformL23 + (csetemp145 + \n+ csetemp146 + csetemp147 + csetemp148)*xformL33) + xformL32*((csetemp125 \n+ + csetemp126 + csetemp127 + csetemp128)*xformL03 + (csetemp137 + \n+ csetemp138 + csetemp139 + csetemp140)*xformL13 + (csetemp145 + \n+ csetemp146 + csetemp147 + csetemp148)*xformL23 + (csetemp149 + \n+ csetemp150 + csetemp151 + csetemp152)*xformL33);\n+ \n+ CCTK_REAL dg4232 CCTK_ATTRIBUTE_UNUSED = xformL02*((csetemp153 + \n+ csetemp154 + csetemp155 + csetemp156)*xformL03 + (csetemp157 + \n+ csetemp158 + csetemp159 + csetemp160)*xformL13 + (csetemp161 + \n+ csetemp162 + csetemp163 + csetemp164)*xformL23 + (csetemp165 + \n+ csetemp166 + csetemp167 + csetemp168)*xformL33) + xformL12*((csetemp157 \n+ + csetemp158 + csetemp159 + csetemp160)*xformL03 + (csetemp169 + \n+ csetemp170 + csetemp171 + csetemp172)*xformL13 + (csetemp173 + \n+ csetemp174 + csetemp175 + csetemp176)*xformL23 + (csetemp177 + \n+ csetemp178 + csetemp179 + csetemp180)*xformL33) + xformL22*((csetemp161 \n+ + csetemp162 + csetemp163 + csetemp164)*xformL03 + (csetemp173 + \n+ csetemp174 + csetemp175 + csetemp176)*xformL13 + (csetemp181 + \n+ csetemp182 + csetemp183 + csetemp184)*xformL23 + (csetemp185 + \n+ csetemp186 + csetemp187 + csetemp188)*xformL33) + xformL32*((csetemp165 \n+ + csetemp166 + csetemp167 + csetemp168)*xformL03 + (csetemp177 + \n+ csetemp178 + csetemp179 + csetemp180)*xformL13 + (csetemp185 + \n+ csetemp186 + csetemp187 + csetemp188)*xformL23 + (csetemp189 + \n+ csetemp190 + csetemp191 + csetemp192)*xformL33);\n+ \n+ CCTK_REAL dg4233 CCTK_ATTRIBUTE_UNUSED = xformL02*((csetemp193 + \n+ csetemp194 + csetemp195 + csetemp196)*xformL03 + (csetemp197 + \n+ csetemp198 + csetemp199 + csetemp200)*xformL13 + (csetemp201 + \n+ csetemp202 + csetemp203 + csetemp204)*xformL23 + (csetemp205 + \n+ csetemp206 + csetemp207 + csetemp208)*xformL33) + xformL12*((csetemp197 \n+ + csetemp198 + csetemp199 + csetemp200)*xformL03 + (csetemp209 + \n+ csetemp210 + csetemp211 + csetemp212)*xformL13 + (csetemp213 + \n+ csetemp214 + csetemp215 + csetemp216)*xformL23 + (csetemp217 + \n+ csetemp218 + csetemp219 + csetemp220)*xformL33) + xformL22*((csetemp201 \n+ + csetemp202 + csetemp203 + csetemp204)*xformL03 + (csetemp213 + \n+ csetemp214 + csetemp215 + csetemp216)*xformL13 + (csetemp221 + \n+ csetemp222 + csetemp223 + csetemp224)*xformL23 + (csetemp225 + \n+ csetemp226 + csetemp227 + csetemp228)*xformL33) + xformL32*((csetemp205 \n+ + csetemp206 + csetemp207 + csetemp208)*xformL03 + (csetemp217 + \n+ csetemp218 + csetemp219 + csetemp220)*xformL13 + (csetemp225 + \n+ csetemp226 + csetemp227 + csetemp228)*xformL23 + (csetemp229 + \n+ csetemp230 + csetemp231 + csetemp232)*xformL33);\n+ \n+ CCTK_REAL dg4330 CCTK_ATTRIBUTE_UNUSED = xformL23*((csetemp81 + \n+ csetemp82 + csetemp83 + csetemp84)*xformL03 + (csetemp93 + csetemp94 + \n+ csetemp95 + csetemp96)*xformL13 + (csetemp101 + csetemp102 + csetemp103 \n+ + csetemp104)*xformL23 + (csetemp105 + csetemp106 + csetemp107 + \n+ csetemp108)*xformL33) + xformL33*((csetemp85 + csetemp86 + csetemp87 + \n+ csetemp88)*xformL03 + (csetemp100 + csetemp97 + csetemp98 + \n+ csetemp99)*xformL13 + (csetemp105 + csetemp106 + csetemp107 + \n+ csetemp108)*xformL23 + (csetemp109 + csetemp110 + csetemp111 + \n+ csetemp112)*xformL33) + xformL03*((csetemp73 + csetemp74 + csetemp75 + \n+ csetemp76)*xformL03 + (csetemp77 + csetemp78 + csetemp79 + \n+ csetemp80)*xformL13 + (csetemp81 + csetemp82 + csetemp83 + \n+ csetemp84)*xformL23 + (csetemp85 + csetemp86 + csetemp87 + \n+ csetemp88)*xformL33) + xformL13*((csetemp77 + csetemp78 + csetemp79 + \n+ csetemp80)*xformL03 + (csetemp89 + csetemp90 + csetemp91 + \n+ csetemp92)*xformL13 + (csetemp93 + csetemp94 + csetemp95 + \n+ csetemp96)*xformL23 + (csetemp100 + csetemp97 + csetemp98 + \n+ csetemp99)*xformL33);\n+ \n+ CCTK_REAL dg4331 CCTK_ATTRIBUTE_UNUSED = xformL03*((csetemp113 + \n+ csetemp114 + csetemp115 + csetemp116)*xformL03 + (csetemp117 + \n+ csetemp118 + csetemp119 + csetemp120)*xformL13 + (csetemp121 + \n+ csetemp122 + csetemp123 + csetemp124)*xformL23 + (csetemp125 + \n+ csetemp126 + csetemp127 + csetemp128)*xformL33) + xformL13*((csetemp117 \n+ + csetemp118 + csetemp119 + csetemp120)*xformL03 + (csetemp129 + \n+ csetemp130 + csetemp131 + csetemp132)*xformL13 + (csetemp133 + \n+ csetemp134 + csetemp135 + csetemp136)*xformL23 + (csetemp137 + \n+ csetemp138 + csetemp139 + csetemp140)*xformL33) + xformL23*((csetemp121 \n+ + csetemp122 + csetemp123 + csetemp124)*xformL03 + (csetemp133 + \n+ csetemp134 + csetemp135 + csetemp136)*xformL13 + (csetemp141 + \n+ csetemp142 + csetemp143 + csetemp144)*xformL23 + (csetemp145 + \n+ csetemp146 + csetemp147 + csetemp148)*xformL33) + xformL33*((csetemp125 \n+ + csetemp126 + csetemp127 + csetemp128)*xformL03 + (csetemp137 + \n+ csetemp138 + csetemp139 + csetemp140)*xformL13 + (csetemp145 + \n+ csetemp146 + csetemp147 + csetemp148)*xformL23 + (csetemp149 + \n+ csetemp150 + csetemp151 + csetemp152)*xformL33);\n+ \n+ CCTK_REAL dg4332 CCTK_ATTRIBUTE_UNUSED = xformL03*((csetemp153 + \n+ csetemp154 + csetemp155 + csetemp156)*xformL03 + (csetemp157 + \n+ csetemp158 + csetemp159 + csetemp160)*xformL13 + (csetemp161 + \n+ csetemp162 + csetemp163 + csetemp164)*xformL23 + (csetemp165 + \n+ csetemp166 + csetemp167 + csetemp168)*xformL33) + xformL13*((csetemp157 \n+ + csetemp158 + csetemp159 + csetemp160)*xformL03 + (csetemp169 + \n+ csetemp170 + csetemp171 + csetemp172)*xformL13 + (csetemp173 + \n+ csetemp174 + csetemp175 + csetemp176)*xformL23 + (csetemp177 + \n+ csetemp178 + csetemp179 + csetemp180)*xformL33) + xformL23*((csetemp161 \n+ + csetemp162 + csetemp163 + csetemp164)*xformL03 + (csetemp173 + \n+ csetemp174 + csetemp175 + csetemp176)*xformL13 + (csetemp181 + \n+ csetemp182 + csetemp183 + csetemp184)*xformL23 + (csetemp185 + \n+ csetemp186 + csetemp187 + csetemp188)*xformL33) + xformL33*((csetemp165 \n+ + csetemp166 + csetemp167 + csetemp168)*xformL03 + (csetemp177 + \n+ csetemp178 + csetemp179 + csetemp180)*xformL13 + (csetemp185 + \n+ csetemp186 + csetemp187 + csetemp188)*xformL23 + (csetemp189 + \n+ csetemp190 + csetemp191 + csetemp192)*xformL33);\n+ \n+ CCTK_REAL dg4333 CCTK_ATTRIBUTE_UNUSED = xformL03*((csetemp193 + \n+ csetemp194 + csetemp195 + csetemp196)*xformL03 + (csetemp197 + \n+ csetemp198 + csetemp199 + csetemp200)*xformL13 + (csetemp201 + \n+ csetemp202 + csetemp203 + csetemp204)*xformL23 + (csetemp205 + \n+ csetemp206 + csetemp207 + csetemp208)*xformL33) + xformL13*((csetemp197 \n+ + csetemp198 + csetemp199 + csetemp200)*xformL03 + (csetemp209 + \n+ csetemp210 + csetemp211 + csetemp212)*xformL13 + (csetemp213 + \n+ csetemp214 + csetemp215 + csetemp216)*xformL23 + (csetemp217 + \n+ csetemp218 + csetemp219 + csetemp220)*xformL33) + xformL23*((csetemp201 \n+ + csetemp202 + csetemp203 + csetemp204)*xformL03 + (csetemp213 + \n+ csetemp214 + csetemp215 + csetemp216)*xformL13 + (csetemp221 + \n+ csetemp222 + csetemp223 + csetemp224)*xformL23 + (csetemp225 + \n+ csetemp226 + csetemp227 + csetemp228)*xformL33) + xformL33*((csetemp205 \n+ + csetemp206 + csetemp207 + csetemp208)*xformL03 + (csetemp217 + \n+ csetemp218 + csetemp219 + csetemp220)*xformL13 + (csetemp225 + \n+ csetemp226 + csetemp227 + csetemp228)*xformL23 + (csetemp229 + \n+ csetemp230 + csetemp231 + csetemp232)*xformL33);\n+ \n+ CCTK_REAL betal1 CCTK_ATTRIBUTE_UNUSED = g401;\n+ \n+ CCTK_REAL betal2 CCTK_ATTRIBUTE_UNUSED = g402;\n+ \n+ CCTK_REAL betal3 CCTK_ATTRIBUTE_UNUSED = g403;\n+ \n+ CCTK_REAL gerr11L CCTK_ATTRIBUTE_UNUSED = gxxL - g411;\n+ \n+ CCTK_REAL gerr12L CCTK_ATTRIBUTE_UNUSED = gxyL - g412;\n+ \n+ CCTK_REAL gerr13L CCTK_ATTRIBUTE_UNUSED = gxzL - g413;\n+ \n+ CCTK_REAL gerr22L CCTK_ATTRIBUTE_UNUSED = gyyL - g422;\n+ \n+ CCTK_REAL gerr23L CCTK_ATTRIBUTE_UNUSED = gyzL - g423;\n+ \n+ CCTK_REAL gerr33L CCTK_ATTRIBUTE_UNUSED = gzzL - g433;\n+ \n+ CCTK_REAL csetemp233 CCTK_ATTRIBUTE_UNUSED = SQR(gxzL);\n+ \n+ CCTK_REAL csetemp234 CCTK_ATTRIBUTE_UNUSED = SQR(gyzL);\n+ \n+ CCTK_REAL csetemp235 CCTK_ATTRIBUTE_UNUSED = SQR(gxyL);\n+ \n+ CCTK_REAL detg CCTK_ATTRIBUTE_UNUSED = 2*gxyL*gxzL*gyzL + \n+ gyyL*(gxxL*gzzL - csetemp233) - gxxL*csetemp234 - gzzL*csetemp235;\n+ \n+ CCTK_REAL csetemp236 CCTK_ATTRIBUTE_UNUSED = INV(detg);\n+ \n+ CCTK_REAL gu11 CCTK_ATTRIBUTE_UNUSED = (gyyL*gzzL - \n+ csetemp234)*csetemp236;\n+ \n+ CCTK_REAL gu12 CCTK_ATTRIBUTE_UNUSED = (gxzL*gyzL - \n+ gxyL*gzzL)*csetemp236;\n+ \n+ CCTK_REAL gu13 CCTK_ATTRIBUTE_UNUSED = (-(gxzL*gyyL) + \n+ gxyL*gyzL)*csetemp236;\n+ \n+ CCTK_REAL gu22 CCTK_ATTRIBUTE_UNUSED = (gxxL*gzzL - \n+ csetemp233)*csetemp236;\n+ \n+ CCTK_REAL gu23 CCTK_ATTRIBUTE_UNUSED = (gxyL*gxzL - \n+ gxxL*gyzL)*csetemp236;\n+ \n+ CCTK_REAL gu33 CCTK_ATTRIBUTE_UNUSED = (gxxL*gyyL - \n+ csetemp235)*csetemp236;\n+ \n+ CCTK_REAL betaerr1L CCTK_ATTRIBUTE_UNUSED = betaxL - betal1*gu11 - \n+ betal2*gu12 - betal3*gu13;\n+ \n+ CCTK_REAL betaerr2L CCTK_ATTRIBUTE_UNUSED = betayL - betal1*gu12 - \n+ betal2*gu22 - betal3*gu23;\n+ \n+ CCTK_REAL betaerr3L CCTK_ATTRIBUTE_UNUSED = betazL - betal1*gu13 - \n+ betal2*gu23 - betal3*gu33;\n+ \n+ CCTK_REAL betasq CCTK_ATTRIBUTE_UNUSED = betaxL*betal1 + betayL*betal2 \n+ + betazL*betal3;\n+ \n+ CCTK_REAL alperrL CCTK_ATTRIBUTE_UNUSED = alpL - sqrt(betasq - g400);\n+ \n+ CCTK_REAL dtg11 CCTK_ATTRIBUTE_UNUSED = dg4110;\n+ \n+ CCTK_REAL dtg12 CCTK_ATTRIBUTE_UNUSED = dg4120;\n+ \n+ CCTK_REAL dtg13 CCTK_ATTRIBUTE_UNUSED = dg4130;\n+ \n+ CCTK_REAL dtg22 CCTK_ATTRIBUTE_UNUSED = dg4220;\n+ \n+ CCTK_REAL dtg23 CCTK_ATTRIBUTE_UNUSED = dg4230;\n+ \n+ CCTK_REAL dtg33 CCTK_ATTRIBUTE_UNUSED = dg4330;\n+ \n+ CCTK_REAL dg111 CCTK_ATTRIBUTE_UNUSED = dg4111;\n+ \n+ CCTK_REAL dg112 CCTK_ATTRIBUTE_UNUSED = dg4112;\n+ \n+ CCTK_REAL dg113 CCTK_ATTRIBUTE_UNUSED = dg4113;\n+ \n+ CCTK_REAL dg121 CCTK_ATTRIBUTE_UNUSED = dg4121;\n+ \n+ CCTK_REAL dg122 CCTK_ATTRIBUTE_UNUSED = dg4122;\n+ \n+ CCTK_REAL dg123 CCTK_ATTRIBUTE_UNUSED = dg4123;\n+ \n+ CCTK_REAL dg131 CCTK_ATTRIBUTE_UNUSED = dg4131;\n+ \n+ CCTK_REAL dg132 CCTK_ATTRIBUTE_UNUSED = dg4132;\n+ \n+ CCTK_REAL dg133 CCTK_ATTRIBUTE_UNUSED = dg4133;\n+ \n+ CCTK_REAL dg221 CCTK_ATTRIBUTE_UNUSED = dg4221;\n+ \n+ CCTK_REAL dg222 CCTK_ATTRIBUTE_UNUSED = dg4222;\n+ \n+ CCTK_REAL dg223 CCTK_ATTRIBUTE_UNUSED = dg4223;\n+ \n+ CCTK_REAL dg231 CCTK_ATTRIBUTE_UNUSED = dg4231;\n+ \n+ CCTK_REAL dg232 CCTK_ATTRIBUTE_UNUSED = dg4232;\n+ \n+ CCTK_REAL dg233 CCTK_ATTRIBUTE_UNUSED = dg4233;\n+ \n+ CCTK_REAL dg331 CCTK_ATTRIBUTE_UNUSED = dg4331;\n+ \n+ CCTK_REAL dg332 CCTK_ATTRIBUTE_UNUSED = dg4332;\n+ \n+ CCTK_REAL dg333 CCTK_ATTRIBUTE_UNUSED = dg4333;\n+ \n+ CCTK_REAL csetemp237 CCTK_ATTRIBUTE_UNUSED = dtg11*gu11;\n+ \n+ CCTK_REAL csetemp238 CCTK_ATTRIBUTE_UNUSED = dtg12*gu12;\n+ \n+ CCTK_REAL csetemp239 CCTK_ATTRIBUTE_UNUSED = dtg13*gu13;\n+ \n+ CCTK_REAL csetemp240 CCTK_ATTRIBUTE_UNUSED = dtg12*gu11;\n+ \n+ CCTK_REAL csetemp241 CCTK_ATTRIBUTE_UNUSED = dtg22*gu12;\n+ \n+ CCTK_REAL csetemp242 CCTK_ATTRIBUTE_UNUSED = dtg23*gu13;\n+ \n+ CCTK_REAL csetemp243 CCTK_ATTRIBUTE_UNUSED = dtg13*gu11;\n+ \n+ CCTK_REAL csetemp244 CCTK_ATTRIBUTE_UNUSED = dtg23*gu12;\n+ \n+ CCTK_REAL csetemp245 CCTK_ATTRIBUTE_UNUSED = dtg33*gu13;\n+ \n+ CCTK_REAL dtgu11 CCTK_ATTRIBUTE_UNUSED = -((csetemp237 + csetemp238 + \n+ csetemp239)*gu11) - (csetemp240 + csetemp241 + csetemp242)*gu12 - \n+ (csetemp243 + csetemp244 + csetemp245)*gu13;\n+ \n+ CCTK_REAL dtgu12 CCTK_ATTRIBUTE_UNUSED = -((csetemp237 + csetemp238 + \n+ csetemp239)*gu12) - (csetemp240 + csetemp241 + csetemp242)*gu22 - \n+ (csetemp243 + csetemp244 + csetemp245)*gu23;\n+ \n+ CCTK_REAL dtgu13 CCTK_ATTRIBUTE_UNUSED = -((csetemp237 + csetemp238 + \n+ csetemp239)*gu13) - (csetemp240 + csetemp241 + csetemp242)*gu23 - \n+ (csetemp243 + csetemp244 + csetemp245)*gu33;\n+ \n+ CCTK_REAL csetemp246 CCTK_ATTRIBUTE_UNUSED = dtg11*gu12;\n+ \n+ CCTK_REAL csetemp247 CCTK_ATTRIBUTE_UNUSED = dtg12*gu22;\n+ \n+ CCTK_REAL csetemp248 CCTK_ATTRIBUTE_UNUSED = dtg13*gu23;\n+ \n+ CCTK_REAL csetemp249 CCTK_ATTRIBUTE_UNUSED = dtg22*gu22;\n+ \n+ CCTK_REAL csetemp250 CCTK_ATTRIBUTE_UNUSED = dtg23*gu23;\n+ \n+ CCTK_REAL csetemp251 CCTK_ATTRIBUTE_UNUSED = dtg13*gu12;\n+ \n+ CCTK_REAL csetemp252 CCTK_ATTRIBUTE_UNUSED = dtg23*gu22;\n+ \n+ CCTK_REAL csetemp253 CCTK_ATTRIBUTE_UNUSED = dtg33*gu23;\n+ \n+ CCTK_REAL dtgu22 CCTK_ATTRIBUTE_UNUSED = -((csetemp246 + csetemp247 + \n+ csetemp248)*gu12) - (csetemp238 + csetemp249 + csetemp250)*gu22 - \n+ (csetemp251 + csetemp252 + csetemp253)*gu23;\n+ \n+ CCTK_REAL dtgu23 CCTK_ATTRIBUTE_UNUSED = -((csetemp246 + csetemp247 + \n+ csetemp248)*gu13) - (csetemp238 + csetemp249 + csetemp250)*gu23 - \n+ (csetemp251 + csetemp252 + csetemp253)*gu33;\n+ \n+ CCTK_REAL dtgu33 CCTK_ATTRIBUTE_UNUSED = -(gu13*(dtg11*gu13 + \n+ dtg12*gu23 + dtg13*gu33)) - gu23*(dtg12*gu13 + dtg22*gu23 + dtg23*gu33) \n+ - gu33*(csetemp239 + csetemp250 + dtg33*gu33);\n+ \n+ CCTK_REAL csetemp254 CCTK_ATTRIBUTE_UNUSED = dg111*gu11;\n+ \n+ CCTK_REAL csetemp255 CCTK_ATTRIBUTE_UNUSED = dg121*gu12;\n+ \n+ CCTK_REAL csetemp256 CCTK_ATTRIBUTE_UNUSED = dg131*gu13;\n+ \n+ CCTK_REAL csetemp257 CCTK_ATTRIBUTE_UNUSED = dg121*gu11;\n+ \n+ CCTK_REAL csetemp258 CCTK_ATTRIBUTE_UNUSED = dg221*gu12;\n+ \n+ CCTK_REAL csetemp259 CCTK_ATTRIBUTE_UNUSED = dg231*gu13;\n+ \n+ CCTK_REAL csetemp260 CCTK_ATTRIBUTE_UNUSED = dg131*gu11;\n+ \n+ CCTK_REAL csetemp261 CCTK_ATTRIBUTE_UNUSED = dg231*gu12;\n+ \n+ CCTK_REAL csetemp262 CCTK_ATTRIBUTE_UNUSED = dg331*gu13;\n+ \n+ CCTK_REAL dgu111 CCTK_ATTRIBUTE_UNUSED = -((csetemp254 + csetemp255 + \n+ csetemp256)*gu11) - (csetemp257 + csetemp258 + csetemp259)*gu12 - \n+ (csetemp260 + csetemp261 + csetemp262)*gu13;\n+ \n+ CCTK_REAL dgu121 CCTK_ATTRIBUTE_UNUSED = -((csetemp254 + csetemp255 + \n+ csetemp256)*gu12) - (csetemp257 + csetemp258 + csetemp259)*gu22 - \n+ (csetemp260 + csetemp261 + csetemp262)*gu23;\n+ \n+ CCTK_REAL dgu131 CCTK_ATTRIBUTE_UNUSED = -((csetemp254 + csetemp255 + \n+ csetemp256)*gu13) - (csetemp257 + csetemp258 + csetemp259)*gu23 - \n+ (csetemp260 + csetemp261 + csetemp262)*gu33;\n+ \n+ CCTK_REAL csetemp263 CCTK_ATTRIBUTE_UNUSED = dg111*gu12;\n+ \n+ CCTK_REAL csetemp264 CCTK_ATTRIBUTE_UNUSED = dg121*gu22;\n+ \n+ CCTK_REAL csetemp265 CCTK_ATTRIBUTE_UNUSED = dg131*gu23;\n+ \n+ CCTK_REAL csetemp266 CCTK_ATTRIBUTE_UNUSED = dg221*gu22;\n+ \n+ CCTK_REAL csetemp267 CCTK_ATTRIBUTE_UNUSED = dg231*gu23;\n+ \n+ CCTK_REAL csetemp268 CCTK_ATTRIBUTE_UNUSED = dg131*gu12;\n+ \n+ CCTK_REAL csetemp269 CCTK_ATTRIBUTE_UNUSED = dg231*gu22;\n+ \n+ CCTK_REAL csetemp270 CCTK_ATTRIBUTE_UNUSED = dg331*gu23;\n+ \n+ CCTK_REAL dgu221 CCTK_ATTRIBUTE_UNUSED = -((csetemp263 + csetemp264 + \n+ csetemp265)*gu12) - (csetemp255 + csetemp266 + csetemp267)*gu22 - \n+ (csetemp268 + csetemp269 + csetemp270)*gu23;\n+ \n+ CCTK_REAL dgu231 CCTK_ATTRIBUTE_UNUSED = -((csetemp263 + csetemp264 + \n+ csetemp265)*gu13) - (csetemp255 + csetemp266 + csetemp267)*gu23 - \n+ (csetemp268 + csetemp269 + csetemp270)*gu33;\n+ \n+ CCTK_REAL dgu331 CCTK_ATTRIBUTE_UNUSED = -(gu13*(dg111*gu13 + \n+ dg121*gu23 + dg131*gu33)) - gu23*(dg121*gu13 + dg221*gu23 + dg231*gu33) \n+ - gu33*(csetemp256 + csetemp267 + dg331*gu33);\n+ \n+ CCTK_REAL csetemp271 CCTK_ATTRIBUTE_UNUSED = dg112*gu11;\n+ \n+ CCTK_REAL csetemp272 CCTK_ATTRIBUTE_UNUSED = dg122*gu12;\n+ \n+ CCTK_REAL csetemp273 CCTK_ATTRIBUTE_UNUSED = dg132*gu13;\n+ \n+ CCTK_REAL csetemp274 CCTK_ATTRIBUTE_UNUSED = dg122*gu11;\n+ \n+ CCTK_REAL csetemp275 CCTK_ATTRIBUTE_UNUSED = dg222*gu12;\n+ \n+ CCTK_REAL csetemp276 CCTK_ATTRIBUTE_UNUSED = dg232*gu13;\n+ \n+ CCTK_REAL csetemp277 CCTK_ATTRIBUTE_UNUSED = dg132*gu11;\n+ \n+ CCTK_REAL csetemp278 CCTK_ATTRIBUTE_UNUSED = dg232*gu12;\n+ \n+ CCTK_REAL csetemp279 CCTK_ATTRIBUTE_UNUSED = dg332*gu13;\n+ \n+ CCTK_REAL dgu112 CCTK_ATTRIBUTE_UNUSED = -((csetemp271 + csetemp272 + \n+ csetemp273)*gu11) - (csetemp274 + csetemp275 + csetemp276)*gu12 - \n+ (csetemp277 + csetemp278 + csetemp279)*gu13;\n+ \n+ CCTK_REAL dgu122 CCTK_ATTRIBUTE_UNUSED = -((csetemp271 + csetemp272 + \n+ csetemp273)*gu12) - (csetemp274 + csetemp275 + csetemp276)*gu22 - \n+ (csetemp277 + csetemp278 + csetemp279)*gu23;\n+ \n+ CCTK_REAL dgu132 CCTK_ATTRIBUTE_UNUSED = -((csetemp271 + csetemp272 + \n+ csetemp273)*gu13) - (csetemp274 + csetemp275 + csetemp276)*gu23 - \n+ (csetemp277 + csetemp278 + csetemp279)*gu33;\n+ \n+ CCTK_REAL csetemp280 CCTK_ATTRIBUTE_UNUSED = dg112*gu12;\n+ \n+ CCTK_REAL csetemp281 CCTK_ATTRIBUTE_UNUSED = dg122*gu22;\n+ \n+ CCTK_REAL csetemp282 CCTK_ATTRIBUTE_UNUSED = dg132*gu23;\n+ \n+ CCTK_REAL csetemp283 CCTK_ATTRIBUTE_UNUSED = dg222*gu22;\n+ \n+ CCTK_REAL csetemp284 CCTK_ATTRIBUTE_UNUSED = dg232*gu23;\n+ \n+ CCTK_REAL csetemp285 CCTK_ATTRIBUTE_UNUSED = dg132*gu12;\n+ \n+ CCTK_REAL csetemp286 CCTK_ATTRIBUTE_UNUSED = dg232*gu22;\n+ \n+ CCTK_REAL csetemp287 CCTK_ATTRIBUTE_UNUSED = dg332*gu23;\n+ \n+ CCTK_REAL dgu222 CCTK_ATTRIBUTE_UNUSED = -((csetemp280 + csetemp281 + \n+ csetemp282)*gu12) - (csetemp272 + csetemp283 + csetemp284)*gu22 - \n+ (csetemp285 + csetemp286 + csetemp287)*gu23;\n+ \n+ CCTK_REAL dgu232 CCTK_ATTRIBUTE_UNUSED = -((csetemp280 + csetemp281 + \n+ csetemp282)*gu13) - (csetemp272 + csetemp283 + csetemp284)*gu23 - \n+ (csetemp285 + csetemp286 + csetemp287)*gu33;\n+ \n+ CCTK_REAL dgu332 CCTK_ATTRIBUTE_UNUSED = -(gu13*(dg112*gu13 + \n+ dg122*gu23 + dg132*gu33)) - gu23*(dg122*gu13 + dg222*gu23 + dg232*gu33) \n+ - gu33*(csetemp273 + csetemp284 + dg332*gu33);\n+ \n+ CCTK_REAL csetemp288 CCTK_ATTRIBUTE_UNUSED = dg113*gu11;\n+ \n+ CCTK_REAL csetemp289 CCTK_ATTRIBUTE_UNUSED = dg123*gu12;\n+ \n+ CCTK_REAL csetemp290 CCTK_ATTRIBUTE_UNUSED = dg133*gu13;\n+ \n+ CCTK_REAL csetemp291 CCTK_ATTRIBUTE_UNUSED = dg123*gu11;\n+ \n+ CCTK_REAL csetemp292 CCTK_ATTRIBUTE_UNUSED = dg223*gu12;\n+ \n+ CCTK_REAL csetemp293 CCTK_ATTRIBUTE_UNUSED = dg233*gu13;\n+ \n+ CCTK_REAL csetemp294 CCTK_ATTRIBUTE_UNUSED = dg133*gu11;\n+ \n+ CCTK_REAL csetemp295 CCTK_ATTRIBUTE_UNUSED = dg233*gu12;\n+ \n+ CCTK_REAL csetemp296 CCTK_ATTRIBUTE_UNUSED = dg333*gu13;\n+ \n+ CCTK_REAL dgu113 CCTK_ATTRIBUTE_UNUSED = -((csetemp288 + csetemp289 + \n+ csetemp290)*gu11) - (csetemp291 + csetemp292 + csetemp293)*gu12 - \n+ (csetemp294 + csetemp295 + csetemp296)*gu13;\n+ \n+ CCTK_REAL dgu123 CCTK_ATTRIBUTE_UNUSED = -((csetemp288 + csetemp289 + \n+ csetemp290)*gu12) - (csetemp291 + csetemp292 + csetemp293)*gu22 - \n+ (csetemp294 + csetemp295 + csetemp296)*gu23;\n+ \n+ CCTK_REAL dgu133 CCTK_ATTRIBUTE_UNUSED = -((csetemp288 + csetemp289 + \n+ csetemp290)*gu13) - (csetemp291 + csetemp292 + csetemp293)*gu23 - \n+ (csetemp294 + csetemp295 + csetemp296)*gu33;\n+ \n+ CCTK_REAL csetemp297 CCTK_ATTRIBUTE_UNUSED = dg113*gu12;\n+ \n+ CCTK_REAL csetemp298 CCTK_ATTRIBUTE_UNUSED = dg123*gu22;\n+ \n+ CCTK_REAL csetemp299 CCTK_ATTRIBUTE_UNUSED = dg133*gu23;\n+ \n+ CCTK_REAL csetemp300 CCTK_ATTRIBUTE_UNUSED = dg223*gu22;\n+ \n+ CCTK_REAL csetemp301 CCTK_ATTRIBUTE_UNUSED = dg233*gu23;\n+ \n+ CCTK_REAL csetemp302 CCTK_ATTRIBUTE_UNUSED = dg133*gu12;\n+ \n+ CCTK_REAL csetemp303 CCTK_ATTRIBUTE_UNUSED = dg233*gu22;\n+ \n+ CCTK_REAL csetemp304 CCTK_ATTRIBUTE_UNUSED = dg333*gu23;\n+ \n+ CCTK_REAL dgu223 CCTK_ATTRIBUTE_UNUSED = -((csetemp297 + csetemp298 + \n+ csetemp299)*gu12) - (csetemp289 + csetemp300 + csetemp301)*gu22 - \n+ (csetemp302 + csetemp303 + csetemp304)*gu23;\n+ \n+ CCTK_REAL dgu233 CCTK_ATTRIBUTE_UNUSED = -((csetemp297 + csetemp298 + \n+ csetemp299)*gu13) - (csetemp289 + csetemp300 + csetemp301)*gu23 - \n+ (csetemp302 + csetemp303 + csetemp304)*gu33;\n+ \n+ CCTK_REAL dgu333 CCTK_ATTRIBUTE_UNUSED = -(gu13*(dg113*gu13 + \n+ dg123*gu23 + dg133*gu33)) - gu23*(dg123*gu13 + dg223*gu23 + dg233*gu33) \n+ - gu33*(csetemp290 + csetemp301 + dg333*gu33);\n+ \n+ CCTK_REAL dtbetal1 CCTK_ATTRIBUTE_UNUSED = dg4010;\n+ \n+ CCTK_REAL dtbetal2 CCTK_ATTRIBUTE_UNUSED = dg4020;\n+ \n+ CCTK_REAL dtbetal3 CCTK_ATTRIBUTE_UNUSED = dg4030;\n+ \n+ CCTK_REAL dbetal11 CCTK_ATTRIBUTE_UNUSED = dg4011;\n+ \n+ CCTK_REAL dbetal12 CCTK_ATTRIBUTE_UNUSED = dg4012;\n+ \n+ CCTK_REAL dbetal13 CCTK_ATTRIBUTE_UNUSED = dg4013;\n+ \n+ CCTK_REAL dbetal21 CCTK_ATTRIBUTE_UNUSED = dg4021;\n+ \n+ CCTK_REAL dbetal22 CCTK_ATTRIBUTE_UNUSED = dg4022;\n+ \n+ CCTK_REAL dbetal23 CCTK_ATTRIBUTE_UNUSED = dg4023;\n+ \n+ CCTK_REAL dbetal31 CCTK_ATTRIBUTE_UNUSED = dg4031;\n+ \n+ CCTK_REAL dbetal32 CCTK_ATTRIBUTE_UNUSED = dg4032;\n+ \n+ CCTK_REAL dbetal33 CCTK_ATTRIBUTE_UNUSED = dg4033;\n+ \n+ CCTK_REAL dtbetaerr1L CCTK_ATTRIBUTE_UNUSED = dtbetaxL - betal1*dtgu11 \n+ - betal2*dtgu12 - betal3*dtgu13 - dtbetal1*gu11 - dtbetal2*gu12 - \n+ dtbetal3*gu13;\n+ \n+ CCTK_REAL dtbetaerr2L CCTK_ATTRIBUTE_UNUSED = dtbetayL - betal1*dtgu12 \n+ - betal2*dtgu22 - betal3*dtgu23 - dtbetal1*gu12 - dtbetal2*gu22 - \n+ dtbetal3*gu23;\n+ \n+ CCTK_REAL dtbetaerr3L CCTK_ATTRIBUTE_UNUSED = dtbetazL - betal1*dtgu13 \n+ - betal2*dtgu23 - betal3*dtgu33 - dtbetal1*gu13 - dtbetal2*gu23 - \n+ dtbetal3*gu33;\n+ \n+ CCTK_REAL dbeta11 CCTK_ATTRIBUTE_UNUSED = betal1*dgu111 + \n+ betal2*dgu121 + betal3*dgu131 + dbetal11*gu11 + dbetal21*gu12 + \n+ dbetal31*gu13;\n+ \n+ CCTK_REAL dbeta21 CCTK_ATTRIBUTE_UNUSED = betal1*dgu121 + \n+ betal2*dgu221 + betal3*dgu231 + dbetal11*gu12 + dbetal21*gu22 + \n+ dbetal31*gu23;\n+ \n+ CCTK_REAL dbeta31 CCTK_ATTRIBUTE_UNUSED = betal1*dgu131 + \n+ betal2*dgu231 + betal3*dgu331 + dbetal11*gu13 + dbetal21*gu23 + \n+ dbetal31*gu33;\n+ \n+ CCTK_REAL dbeta12 CCTK_ATTRIBUTE_UNUSED = betal1*dgu112 + \n+ betal2*dgu122 + betal3*dgu132 + dbetal12*gu11 + dbetal22*gu12 + \n+ dbetal32*gu13;\n+ \n+ CCTK_REAL dbeta22 CCTK_ATTRIBUTE_UNUSED = betal1*dgu122 + \n+ betal2*dgu222 + betal3*dgu232 + dbetal12*gu12 + dbetal22*gu22 + \n+ dbetal32*gu23;\n+ \n+ CCTK_REAL dbeta32 CCTK_ATTRIBUTE_UNUSED = betal1*dgu132 + \n+ betal2*dgu232 + betal3*dgu332 + dbetal12*gu13 + dbetal22*gu23 + \n+ dbetal32*gu33;\n+ \n+ CCTK_REAL dbeta13 CCTK_ATTRIBUTE_UNUSED = betal1*dgu113 + \n+ betal2*dgu123 + betal3*dgu133 + dbetal13*gu11 + dbetal23*gu12 + \n+ dbetal33*gu13;\n+ \n+ CCTK_REAL dbeta23 CCTK_ATTRIBUTE_UNUSED = betal1*dgu123 + \n+ betal2*dgu223 + betal3*dgu233 + dbetal13*gu12 + dbetal23*gu22 + \n+ dbetal33*gu23;\n+ \n+ CCTK_REAL dbeta33 CCTK_ATTRIBUTE_UNUSED = betal1*dgu133 + \n+ betal2*dgu233 + betal3*dgu333 + dbetal13*gu13 + dbetal23*gu23 + \n+ dbetal33*gu33;\n+ \n+ CCTK_REAL dtbetasq CCTK_ATTRIBUTE_UNUSED = dtbetaxL*betal1 + \n+ dtbetayL*betal2 + dtbetazL*betal3 + betaxL*dtbetal1 + betayL*dtbetal2 + \n+ betazL*dtbetal3;\n+ \n+ CCTK_REAL csetemp305 CCTK_ATTRIBUTE_UNUSED = INV(alpL);\n+ \n+ CCTK_REAL dtalperrL CCTK_ATTRIBUTE_UNUSED = dtalpL + \n+ 0.5*csetemp305*(dg4000 - dtbetasq);\n+ \n+ CCTK_REAL kerr11L CCTK_ATTRIBUTE_UNUSED = kxxL - \n+ 0.5*csetemp305*(2*(gxxL*dbeta11 + gxyL*dbeta21 + gxzL*dbeta31) + \n+ betaxL*dg111 + betayL*dg112 + betazL*dg113 - dtg11);\n+ \n+ CCTK_REAL kerr12L CCTK_ATTRIBUTE_UNUSED = kxyL - \n+ 0.5*csetemp305*(gxxL*dbeta12 + gyyL*dbeta21 + gxyL*(dbeta11 + dbeta22) \n+ + gyzL*dbeta31 + gxzL*dbeta32 + betaxL*dg121 + betayL*dg122 + \n+ betazL*dg123 - dtg12);\n+ \n+ CCTK_REAL kerr13L CCTK_ATTRIBUTE_UNUSED = kxzL - \n+ 0.5*csetemp305*(gxxL*dbeta13 + gyzL*dbeta21 + gxyL*dbeta23 + \n+ gzzL*dbeta31 + gxzL*(dbeta11 + dbeta33) + betaxL*dg131 + betayL*dg132 + \n+ betazL*dg133 - dtg13);\n+ \n+ CCTK_REAL kerr22L CCTK_ATTRIBUTE_UNUSED = kyyL - \n+ 0.5*csetemp305*(2*(gxyL*dbeta12 + gyyL*dbeta22 + gyzL*dbeta32) + \n+ betaxL*dg221 + betayL*dg222 + betazL*dg223 - dtg22);\n+ \n+ CCTK_REAL kerr23L CCTK_ATTRIBUTE_UNUSED = kyzL - \n+ 0.5*csetemp305*(gxzL*dbeta12 + gxyL*dbeta13 + gyyL*dbeta23 + \n+ gzzL*dbeta32 + gyzL*(dbeta22 + dbeta33) + betaxL*dg231 + betayL*dg232 + \n+ betazL*dg233 - dtg23);\n+ \n+ CCTK_REAL kerr33L CCTK_ATTRIBUTE_UNUSED = kzzL - \n+ 0.5*csetemp305*(2*(gxzL*dbeta13 + gyzL*dbeta23 + gzzL*dbeta33) + \n+ betaxL*dg331 + betayL*dg332 + betazL*dg333 - dtg33);\n+ /* Copy local copies back to grid functions */\n+ alperr[index] = alperrL;\n+ betaerr1[index] = betaerr1L;\n+ betaerr2[index] = betaerr2L;\n+ betaerr3[index] = betaerr3L;\n+ dtalperr[index] = dtalperrL;\n+ dtbetaerr1[index] = dtbetaerr1L;\n+ dtbetaerr2[index] = dtbetaerr2L;\n+ dtbetaerr3[index] = dtbetaerr3L;\n+ gerr11[index] = gerr11L;\n+ gerr12[index] = gerr12L;\n+ gerr13[index] = gerr13L;\n+ gerr22[index] = gerr22L;\n+ gerr23[index] = gerr23L;\n+ gerr33[index] = gerr33L;\n+ kerr11[index] = kerr11L;\n+ kerr12[index] = kerr12L;\n+ kerr13[index] = kerr13L;\n+ kerr22[index] = kerr22L;\n+ kerr23[index] = kerr23L;\n+ kerr33[index] = kerr33L;\n+ }\n+ CCTK_ENDLOOP3(Vaidya2_error);\n+}\n+extern \"C\" void Vaidya2_error(CCTK_ARGUMENTS)\n+{\n+ DECLARE_CCTK_ARGUMENTS;\n+ DECLARE_CCTK_PARAMETERS;\n+ \n+ if (verbose > 1)\n+ {\n+ CCTK_VInfo(CCTK_THORNSTRING,\"Entering Vaidya2_error_Body\");\n+ }\n+ if (cctk_iteration % Vaidya2_error_calc_every != Vaidya2_error_calc_offset)\n+ {\n+ return;\n+ }\n+ \n+ const char* const groups[] = {\n+ \"admbase::curv\",\n+ \"admbase::dtlapse\",\n+ \"admbase::dtshift\",\n+ \"admbase::lapse\",\n+ \"admbase::metric\",\n+ \"admbase::shift\",\n+ \"Vaidya2::curv_error\",\n+ \"Vaidya2::dtlapse_error\",\n+ \"Vaidya2::dtshift_error\",\n+ \"grid::coordinates\",\n+ \"Vaidya2::lapse_error\",\n+ \"Vaidya2::metric_error\",\n+ \"Vaidya2::shift_error\"};\n+ AssertGroupStorage(cctkGH, \"Vaidya2_error\", 13, groups);\n+ \n+ \n+ LoopOverEverything(cctkGH, Vaidya2_error_Body);\n+ if (verbose > 1)\n+ {\n+ CCTK_VInfo(CCTK_THORNSTRING,\"Leaving Vaidya2_error_Body\");\n+ }\n+}\n+\n+} // namespace Vaidya2"}, "test": {"test_patch": "diff --git a/all_tests.txt b/all_tests.txt\nnew file mode 100644\nindex 0000000..0000000\n--- /dev/null\n+++ b/all_tests.txt\n@@ -0,0 +1,7 @@\n+GaugeWave\n+KS-tilted-EE\n+KerrSchild\n+Minkowski\n+ModifiedSchwarzschildBL\n+ShiftedGaugeWave\n+Vaidya2", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}31{"question_id": "MSB_einsteintoolkit_Cactus_pr37", "question_type": "multi_swe_bench", "description": "Add missing RegisterSymmetries.cc in McLachlan/ML_BSSN (einsteintoolkit/Cactus#37)", "content": {"org": "einsteintoolkit", "repo": "Cactus", "pr_number": 37, "issue_title": "Add missing RegisterSymmetries.cc in McLachlan/ML_BSSN", "issue_body": "This PR adds the missing source file RegisterSymmetries.cc to complete the McLachlan/ML_BSSN thorn implementation.", "base_commit": "HEAD", "resolved_issues": [{"number": 37, "title": "Implement the full functionality of ML_BSSN", "body": "Please implement the full functionality of `ML_BSSN` by finishing the code in `RegisterSymmetries.cc`.\n\n## Thorn Information:\n- Name: ML_BSSN\n- Target file: RegisterSymmetries.cc\n\n## Interface Definition in interface.ccl:\n\n## Schedule Definition in schedule.ccl:\n\n## Parameters Definition in param.ccl:\n\n## Configuration Definition in configuration.ccl:\n\n## Documentation Context in readme.md and doc/documentation.tex\n\n## Related Code Context in src folder\n\n"}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/einsteintoolkit_m_cactus:pr-37", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/arrangements/McLachlan/ML_BSSN/src/RegisterSymmetries.cc b/arrangements/McLachlan/ML_BSSN/src/RegisterSymmetries.cc\nnew file mode 100644\nindex 0000000..0000000\n--- /dev/null\n+++ b/arrangements/McLachlan/ML_BSSN/src/RegisterSymmetries.cc\n@@ -0,0 +1,187 @@\n+/* File produced by Kranc */\n+\n+#include \"cctk.h\"\n+#include \"cctk_Arguments.h\"\n+#include \"cctk_Parameters.h\"\n+#include \"Symmetry.h\"\n+\n+extern \"C\" void ML_BSSN_RegisterSymmetries(CCTK_ARGUMENTS)\n+{\n+ DECLARE_CCTK_ARGUMENTS;\n+ DECLARE_CCTK_PARAMETERS;\n+ \n+ /* array holding symmetry definitions */\n+ int sym[3];\n+ \n+ /* Register symmetries of grid functions */\n+ sym[0] = 1;\n+ sym[1] = 1;\n+ sym[2] = 1;\n+ SetCartSymVN(cctkGH, sym, \"ML_BSSN::phi\");\n+ \n+ sym[0] = 1;\n+ sym[1] = 1;\n+ sym[2] = 1;\n+ SetCartSymVN(cctkGH, sym, \"ML_BSSN::gt11\");\n+ \n+ sym[0] = -1;\n+ sym[1] = -1;\n+ sym[2] = 1;\n+ SetCartSymVN(cctkGH, sym, \"ML_BSSN::gt12\");\n+ \n+ sym[0] = -1;\n+ sym[1] = 1;\n+ sym[2] = -1;\n+ SetCartSymVN(cctkGH, sym, \"ML_BSSN::gt13\");\n+ \n+ sym[0] = 1;\n+ sym[1] = 1;\n+ sym[2] = 1;\n+ SetCartSymVN(cctkGH, sym, \"ML_BSSN::gt22\");\n+ \n+ sym[0] = 1;\n+ sym[1] = -1;\n+ sym[2] = -1;\n+ SetCartSymVN(cctkGH, sym, \"ML_BSSN::gt23\");\n+ \n+ sym[0] = 1;\n+ sym[1] = 1;\n+ sym[2] = 1;\n+ SetCartSymVN(cctkGH, sym, \"ML_BSSN::gt33\");\n+ \n+ sym[0] = -1;\n+ sym[1] = 1;\n+ sym[2] = 1;\n+ SetCartSymVN(cctkGH, sym, \"ML_BSSN::Xt1\");\n+ \n+ sym[0] = 1;\n+ sym[1] = -1;\n+ sym[2] = 1;\n+ SetCartSymVN(cctkGH, sym, \"ML_BSSN::Xt2\");\n+ \n+ sym[0] = 1;\n+ sym[1] = 1;\n+ sym[2] = -1;\n+ SetCartSymVN(cctkGH, sym, \"ML_BSSN::Xt3\");\n+ \n+ sym[0] = 1;\n+ sym[1] = 1;\n+ sym[2] = 1;\n+ SetCartSymVN(cctkGH, sym, \"ML_BSSN::trK\");\n+ \n+ sym[0] = 1;\n+ sym[1] = 1;\n+ sym[2] = 1;\n+ SetCartSymVN(cctkGH, sym, \"ML_BSSN::At11\");\n+ \n+ sym[0] = -1;\n+ sym[1] = -1;\n+ sym[2] = 1;\n+ SetCartSymVN(cctkGH, sym, \"ML_BSSN::At12\");\n+ \n+ sym[0] = -1;\n+ sym[1] = 1;\n+ sym[2] = -1;\n+ SetCartSymVN(cctkGH, sym, \"ML_BSSN::At13\");\n+ \n+ sym[0] = 1;\n+ sym[1] = 1;\n+ sym[2] = 1;\n+ SetCartSymVN(cctkGH, sym, \"ML_BSSN::At22\");\n+ \n+ sym[0] = 1;\n+ sym[1] = -1;\n+ sym[2] = -1;\n+ SetCartSymVN(cctkGH, sym, \"ML_BSSN::At23\");\n+ \n+ sym[0] = 1;\n+ sym[1] = 1;\n+ sym[2] = 1;\n+ SetCartSymVN(cctkGH, sym, \"ML_BSSN::At33\");\n+ \n+ sym[0] = 1;\n+ sym[1] = 1;\n+ sym[2] = 1;\n+ SetCartSymVN(cctkGH, sym, \"ML_BSSN::alpha\");\n+ \n+ sym[0] = 1;\n+ sym[1] = 1;\n+ sym[2] = 1;\n+ SetCartSymVN(cctkGH, sym, \"ML_BSSN::A\");\n+ \n+ sym[0] = -1;\n+ sym[1] = 1;\n+ sym[2] = 1;\n+ SetCartSymVN(cctkGH, sym, \"ML_BSSN::beta1\");\n+ \n+ sym[0] = 1;\n+ sym[1] = -1;\n+ sym[2] = 1;\n+ SetCartSymVN(cctkGH, sym, \"ML_BSSN::beta2\");\n+ \n+ sym[0] = 1;\n+ sym[1] = 1;\n+ sym[2] = -1;\n+ SetCartSymVN(cctkGH, sym, \"ML_BSSN::beta3\");\n+ \n+ sym[0] = -1;\n+ sym[1] = 1;\n+ sym[2] = 1;\n+ SetCartSymVN(cctkGH, sym, \"ML_BSSN::B1\");\n+ \n+ sym[0] = 1;\n+ sym[1] = -1;\n+ sym[2] = 1;\n+ SetCartSymVN(cctkGH, sym, \"ML_BSSN::B2\");\n+ \n+ sym[0] = 1;\n+ sym[1] = 1;\n+ sym[2] = -1;\n+ SetCartSymVN(cctkGH, sym, \"ML_BSSN::B3\");\n+ \n+ sym[0] = 1;\n+ sym[1] = 1;\n+ sym[2] = 1;\n+ SetCartSymVN(cctkGH, sym, \"ML_BSSN::H\");\n+ \n+ sym[0] = -1;\n+ sym[1] = 1;\n+ sym[2] = 1;\n+ SetCartSymVN(cctkGH, sym, \"ML_BSSN::M1\");\n+ \n+ sym[0] = 1;\n+ sym[1] = -1;\n+ sym[2] = 1;\n+ SetCartSymVN(cctkGH, sym, \"ML_BSSN::M2\");\n+ \n+ sym[0] = 1;\n+ sym[1] = 1;\n+ sym[2] = -1;\n+ SetCartSymVN(cctkGH, sym, \"ML_BSSN::M3\");\n+ \n+ sym[0] = 1;\n+ sym[1] = 1;\n+ sym[2] = 1;\n+ SetCartSymVN(cctkGH, sym, \"ML_BSSN::cS\");\n+ \n+ sym[0] = -1;\n+ sym[1] = 1;\n+ sym[2] = 1;\n+ SetCartSymVN(cctkGH, sym, \"ML_BSSN::cXt1\");\n+ \n+ sym[0] = 1;\n+ sym[1] = -1;\n+ sym[2] = 1;\n+ SetCartSymVN(cctkGH, sym, \"ML_BSSN::cXt2\");\n+ \n+ sym[0] = 1;\n+ sym[1] = 1;\n+ sym[2] = -1;\n+ SetCartSymVN(cctkGH, sym, \"ML_BSSN::cXt3\");\n+ \n+ sym[0] = 1;\n+ sym[1] = 1;\n+ sym[2] = 1;\n+ SetCartSymVN(cctkGH, sym, \"ML_BSSN::cA\");\n+ \n+}"}, "test": {"test_patch": "diff --git a/all_tests.txt b/all_tests.txt\nnew file mode 100644\nindex 0000000..0000000\n--- /dev/null\n+++ b/all_tests.txt\n@@ -0,0 +1,6 @@\n+ML_BSSN_EE_sgw3d\n+ML_BSSN_EE_sgw3d_rhs\n+ML_BSSN_NewRad\n+ML_BSSN_sgw3d_harmonic\n+ML_BSSN_sgw3d_harmonic_phi\n+ML_BSSN_sgw3d_rhs", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}32{"question_id": "MSB_einsteintoolkit_Cactus_pr38", "question_type": "multi_swe_bench", "description": "Add missing ML_CCZ4_ADMBaseBoundaryScalar.cc in McLachlan/ML_CCZ4 (einsteintoolkit/Cactus#38)", "content": {"org": "einsteintoolkit", "repo": "Cactus", "pr_number": 38, "issue_title": "Add missing ML_CCZ4_ADMBaseBoundaryScalar.cc in McLachlan/ML_CCZ4", "issue_body": "This PR adds the missing source file ML_CCZ4_ADMBaseBoundaryScalar.cc to complete the McLachlan/ML_CCZ4 thorn implementation.", "base_commit": "HEAD", "resolved_issues": [{"number": 38, "title": "Implement the full functionality of ML_CCZ4", "body": "Please implement the full functionality of `ML_CCZ4` by finishing the code in `ML_CCZ4_ADMBaseBoundaryScalar.cc`.\n\n## Thorn Information:\n- Name: ML_CCZ4\n- Target file: ML_CCZ4_ADMBaseBoundaryScalar.cc\n\n## Interface Definition in interface.ccl:\n\n## Schedule Definition in schedule.ccl:\n\n## Parameters Definition in param.ccl:\n\n## Configuration Definition in configuration.ccl:\n\n## Documentation Context in readme.md and doc/documentation.tex\n\n## Related Code Context in src folder\n\n"}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/einsteintoolkit_m_cactus:pr-38", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/arrangements/McLachlan/ML_CCZ4/src/ML_CCZ4_ADMBaseBoundaryScalar.cc b/arrangements/McLachlan/ML_CCZ4/src/ML_CCZ4_ADMBaseBoundaryScalar.cc\nnew file mode 100644\nindex 0000000..0000000\n--- /dev/null\n+++ b/arrangements/McLachlan/ML_CCZ4/src/ML_CCZ4_ADMBaseBoundaryScalar.cc\n@@ -0,0 +1,352 @@\n+/* File produced by Kranc */\n+\n+#define KRANC_C\n+\n+#include <algorithm>\n+#include <assert.h>\n+#include <math.h>\n+#include <stdio.h>\n+#include <stdlib.h>\n+#include <string.h>\n+#include \"cctk.h\"\n+#include \"cctk_Arguments.h\"\n+#include \"cctk_Parameters.h\"\n+#include \"Kranc.hh\"\n+#include \"Differencing.h\"\n+#include \"loopcontrol.h\"\n+#include \"vectors.h\"\n+\n+namespace ML_CCZ4 {\n+\n+extern \"C\" void ML_CCZ4_ADMBaseBoundaryScalar_SelectBCs(CCTK_ARGUMENTS)\n+{\n+ DECLARE_CCTK_ARGUMENTS;\n+ DECLARE_CCTK_PARAMETERS;\n+ \n+ if (cctk_iteration % ML_CCZ4_ADMBaseBoundaryScalar_calc_every != ML_CCZ4_ADMBaseBoundaryScalar_calc_offset)\n+ return;\n+ CCTK_INT ierr CCTK_ATTRIBUTE_UNUSED = 0;\n+ ierr = Boundary_SelectGroupForBC(cctkGH, CCTK_ALL_FACES, GetBoundaryWidth(cctkGH), -1 /* no table */, \"ADMBase::dtlapse\",\"flat\");\n+ if (ierr < 0)\n+ CCTK_WARN(CCTK_WARN_ALERT, \"Failed to register flat BC for ADMBase::dtlapse.\");\n+ ierr = Boundary_SelectGroupForBC(cctkGH, CCTK_ALL_FACES, GetBoundaryWidth(cctkGH), -1 /* no table */, \"ADMBase::dtshift\",\"flat\");\n+ if (ierr < 0)\n+ CCTK_WARN(CCTK_WARN_ALERT, \"Failed to register flat BC for ADMBase::dtshift.\");\n+ return;\n+}\n+\n+static void ML_CCZ4_ADMBaseBoundaryScalar_Body(const cGH* restrict const cctkGH, const int dir, const int face, const CCTK_REAL normal[3], const CCTK_REAL tangentA[3], const CCTK_REAL tangentB[3], const int imin[3], const int imax[3], const int n_subblock_gfs, CCTK_REAL* restrict const subblock_gfs[])\n+{\n+ DECLARE_CCTK_ARGUMENTS;\n+ DECLARE_CCTK_PARAMETERS;\n+ \n+ /* Include user-supplied include files */\n+ /* Initialise finite differencing variables */\n+ const ptrdiff_t di CCTK_ATTRIBUTE_UNUSED = 1;\n+ const ptrdiff_t dj CCTK_ATTRIBUTE_UNUSED = \n+ CCTK_GFINDEX3D(cctkGH,0,1,0) - CCTK_GFINDEX3D(cctkGH,0,0,0);\n+ const ptrdiff_t dk CCTK_ATTRIBUTE_UNUSED = \n+ CCTK_GFINDEX3D(cctkGH,0,0,1) - CCTK_GFINDEX3D(cctkGH,0,0,0);\n+ const ptrdiff_t cdi CCTK_ATTRIBUTE_UNUSED = sizeof(CCTK_REAL) * di;\n+ const ptrdiff_t cdj CCTK_ATTRIBUTE_UNUSED = sizeof(CCTK_REAL) * dj;\n+ const ptrdiff_t cdk CCTK_ATTRIBUTE_UNUSED = sizeof(CCTK_REAL) * dk;\n+ const ptrdiff_t cctkLbnd1 CCTK_ATTRIBUTE_UNUSED = cctk_lbnd[0];\n+ const ptrdiff_t cctkLbnd2 CCTK_ATTRIBUTE_UNUSED = cctk_lbnd[1];\n+ const ptrdiff_t cctkLbnd3 CCTK_ATTRIBUTE_UNUSED = cctk_lbnd[2];\n+ const CCTK_REAL_VEC t CCTK_ATTRIBUTE_UNUSED = ToReal(cctk_time);\n+ const CCTK_REAL_VEC cctkOriginSpace1 CCTK_ATTRIBUTE_UNUSED = \n+ ToReal(CCTK_ORIGIN_SPACE(0));\n+ const CCTK_REAL_VEC cctkOriginSpace2 CCTK_ATTRIBUTE_UNUSED = \n+ ToReal(CCTK_ORIGIN_SPACE(1));\n+ const CCTK_REAL_VEC cctkOriginSpace3 CCTK_ATTRIBUTE_UNUSED = \n+ ToReal(CCTK_ORIGIN_SPACE(2));\n+ const CCTK_REAL_VEC dt CCTK_ATTRIBUTE_UNUSED = \n+ ToReal(CCTK_DELTA_TIME);\n+ const CCTK_REAL_VEC dx CCTK_ATTRIBUTE_UNUSED = \n+ ToReal(CCTK_DELTA_SPACE(0));\n+ const CCTK_REAL_VEC dy CCTK_ATTRIBUTE_UNUSED = \n+ ToReal(CCTK_DELTA_SPACE(1));\n+ const CCTK_REAL_VEC dz CCTK_ATTRIBUTE_UNUSED = \n+ ToReal(CCTK_DELTA_SPACE(2));\n+ const CCTK_REAL_VEC dxi CCTK_ATTRIBUTE_UNUSED = kdiv(ToReal(1),dx);\n+ const CCTK_REAL_VEC dyi CCTK_ATTRIBUTE_UNUSED = kdiv(ToReal(1),dy);\n+ const CCTK_REAL_VEC dzi CCTK_ATTRIBUTE_UNUSED = kdiv(ToReal(1),dz);\n+ const CCTK_REAL_VEC khalf CCTK_ATTRIBUTE_UNUSED = ToReal(0.5);\n+ const CCTK_REAL_VEC kthird CCTK_ATTRIBUTE_UNUSED = \n+ ToReal(0.333333333333333333333333333333);\n+ const CCTK_REAL_VEC ktwothird CCTK_ATTRIBUTE_UNUSED = \n+ ToReal(0.666666666666666666666666666667);\n+ const CCTK_REAL_VEC kfourthird CCTK_ATTRIBUTE_UNUSED = \n+ ToReal(1.33333333333333333333333333333);\n+ const CCTK_REAL_VEC hdxi CCTK_ATTRIBUTE_UNUSED = \n+ kmul(dxi,ToReal(0.5));\n+ const CCTK_REAL_VEC hdyi CCTK_ATTRIBUTE_UNUSED = \n+ kmul(dyi,ToReal(0.5));\n+ const CCTK_REAL_VEC hdzi CCTK_ATTRIBUTE_UNUSED = \n+ kmul(dzi,ToReal(0.5));\n+ /* Initialize predefined quantities */\n+ const CCTK_REAL_VEC p1o1024dx CCTK_ATTRIBUTE_UNUSED = kdiv(ToReal(0.0009765625),dx);\n+ const CCTK_REAL_VEC p1o1024dy CCTK_ATTRIBUTE_UNUSED = kdiv(ToReal(0.0009765625),dy);\n+ const CCTK_REAL_VEC p1o1024dz CCTK_ATTRIBUTE_UNUSED = kdiv(ToReal(0.0009765625),dz);\n+ const CCTK_REAL_VEC p1o120dx CCTK_ATTRIBUTE_UNUSED = kdiv(ToReal(0.00833333333333333333333333333333),dx);\n+ const CCTK_REAL_VEC p1o120dy CCTK_ATTRIBUTE_UNUSED = kdiv(ToReal(0.00833333333333333333333333333333),dy);\n+ const CCTK_REAL_VEC p1o120dz CCTK_ATTRIBUTE_UNUSED = kdiv(ToReal(0.00833333333333333333333333333333),dz);\n+ const CCTK_REAL_VEC p1o12dx CCTK_ATTRIBUTE_UNUSED = kdiv(ToReal(0.0833333333333333333333333333333),dx);\n+ const CCTK_REAL_VEC p1o12dy CCTK_ATTRIBUTE_UNUSED = kdiv(ToReal(0.0833333333333333333333333333333),dy);\n+ const CCTK_REAL_VEC p1o12dz CCTK_ATTRIBUTE_UNUSED = kdiv(ToReal(0.0833333333333333333333333333333),dz);\n+ const CCTK_REAL_VEC p1o144dxdy CCTK_ATTRIBUTE_UNUSED = kdiv(ToReal(0.00694444444444444444444444444444),kmul(dx,dy));\n+ const CCTK_REAL_VEC p1o144dxdz CCTK_ATTRIBUTE_UNUSED = kdiv(ToReal(0.00694444444444444444444444444444),kmul(dx,dz));\n+ const CCTK_REAL_VEC p1o144dydz CCTK_ATTRIBUTE_UNUSED = kdiv(ToReal(0.00694444444444444444444444444444),kmul(dy,dz));\n+ const CCTK_REAL_VEC p1o1680dx CCTK_ATTRIBUTE_UNUSED = kdiv(ToReal(0.000595238095238095238095238095238),dx);\n+ const CCTK_REAL_VEC p1o1680dy CCTK_ATTRIBUTE_UNUSED = kdiv(ToReal(0.000595238095238095238095238095238),dy);\n+ const CCTK_REAL_VEC p1o1680dz CCTK_ATTRIBUTE_UNUSED = kdiv(ToReal(0.000595238095238095238095238095238),dz);\n+ const CCTK_REAL_VEC p1o180dx2 CCTK_ATTRIBUTE_UNUSED = kdiv(ToReal(0.00555555555555555555555555555556),kmul(dx,dx));\n+ const CCTK_REAL_VEC p1o180dy2 CCTK_ATTRIBUTE_UNUSED = kdiv(ToReal(0.00555555555555555555555555555556),kmul(dy,dy));\n+ const CCTK_REAL_VEC p1o180dz2 CCTK_ATTRIBUTE_UNUSED = kdiv(ToReal(0.00555555555555555555555555555556),kmul(dz,dz));\n+ const CCTK_REAL_VEC p1o24dx CCTK_ATTRIBUTE_UNUSED = kdiv(ToReal(0.0416666666666666666666666666667),dx);\n+ const CCTK_REAL_VEC p1o24dy CCTK_ATTRIBUTE_UNUSED = kdiv(ToReal(0.0416666666666666666666666666667),dy);\n+ const CCTK_REAL_VEC p1o24dz CCTK_ATTRIBUTE_UNUSED = kdiv(ToReal(0.0416666666666666666666666666667),dz);\n+ const CCTK_REAL_VEC p1o2dx CCTK_ATTRIBUTE_UNUSED = kdiv(ToReal(0.5),dx);\n+ const CCTK_REAL_VEC p1o2dy CCTK_ATTRIBUTE_UNUSED = kdiv(ToReal(0.5),dy);\n+ const CCTK_REAL_VEC p1o2dz CCTK_ATTRIBUTE_UNUSED = kdiv(ToReal(0.5),dz);\n+ const CCTK_REAL_VEC p1o3600dxdy CCTK_ATTRIBUTE_UNUSED = kdiv(ToReal(0.000277777777777777777777777777778),kmul(dx,dy));\n+ const CCTK_REAL_VEC p1o3600dxdz CCTK_ATTRIBUTE_UNUSED = kdiv(ToReal(0.000277777777777777777777777777778),kmul(dx,dz));\n+ const CCTK_REAL_VEC p1o3600dydz CCTK_ATTRIBUTE_UNUSED = kdiv(ToReal(0.000277777777777777777777777777778),kmul(dy,dz));\n+ const CCTK_REAL_VEC p1o4dx CCTK_ATTRIBUTE_UNUSED = kdiv(ToReal(0.25),dx);\n+ const CCTK_REAL_VEC p1o4dxdy CCTK_ATTRIBUTE_UNUSED = kdiv(ToReal(0.25),kmul(dx,dy));\n+ const CCTK_REAL_VEC p1o4dxdz CCTK_ATTRIBUTE_UNUSED = kdiv(ToReal(0.25),kmul(dx,dz));\n+ const CCTK_REAL_VEC p1o4dy CCTK_ATTRIBUTE_UNUSED = kdiv(ToReal(0.25),dy);\n+ const CCTK_REAL_VEC p1o4dydz CCTK_ATTRIBUTE_UNUSED = kdiv(ToReal(0.25),kmul(dy,dz));\n+ const CCTK_REAL_VEC p1o4dz CCTK_ATTRIBUTE_UNUSED = kdiv(ToReal(0.25),dz);\n+ const CCTK_REAL_VEC p1o5040dx2 CCTK_ATTRIBUTE_UNUSED = kdiv(ToReal(0.000198412698412698412698412698413),kmul(dx,dx));\n+ const CCTK_REAL_VEC p1o5040dy2 CCTK_ATTRIBUTE_UNUSED = kdiv(ToReal(0.000198412698412698412698412698413),kmul(dy,dy));\n+ const CCTK_REAL_VEC p1o5040dz2 CCTK_ATTRIBUTE_UNUSED = kdiv(ToReal(0.000198412698412698412698412698413),kmul(dz,dz));\n+ const CCTK_REAL_VEC p1o560dx CCTK_ATTRIBUTE_UNUSED = kdiv(ToReal(0.00178571428571428571428571428571),dx);\n+ const CCTK_REAL_VEC p1o560dy CCTK_ATTRIBUTE_UNUSED = kdiv(ToReal(0.00178571428571428571428571428571),dy);\n+ const CCTK_REAL_VEC p1o560dz CCTK_ATTRIBUTE_UNUSED = kdiv(ToReal(0.00178571428571428571428571428571),dz);\n+ const CCTK_REAL_VEC p1o60dx CCTK_ATTRIBUTE_UNUSED = kdiv(ToReal(0.0166666666666666666666666666667),dx);\n+ const CCTK_REAL_VEC p1o60dy CCTK_ATTRIBUTE_UNUSED = kdiv(ToReal(0.0166666666666666666666666666667),dy);\n+ const CCTK_REAL_VEC p1o60dz CCTK_ATTRIBUTE_UNUSED = kdiv(ToReal(0.0166666666666666666666666666667),dz);\n+ const CCTK_REAL_VEC p1o64dx CCTK_ATTRIBUTE_UNUSED = kdiv(ToReal(0.015625),dx);\n+ const CCTK_REAL_VEC p1o64dy CCTK_ATTRIBUTE_UNUSED = kdiv(ToReal(0.015625),dy);\n+ const CCTK_REAL_VEC p1o64dz CCTK_ATTRIBUTE_UNUSED = kdiv(ToReal(0.015625),dz);\n+ const CCTK_REAL_VEC p1o6dx CCTK_ATTRIBUTE_UNUSED = kdiv(ToReal(0.166666666666666666666666666667),dx);\n+ const CCTK_REAL_VEC p1o6dy CCTK_ATTRIBUTE_UNUSED = kdiv(ToReal(0.166666666666666666666666666667),dy);\n+ const CCTK_REAL_VEC p1o6dz CCTK_ATTRIBUTE_UNUSED = kdiv(ToReal(0.166666666666666666666666666667),dz);\n+ const CCTK_REAL_VEC p1o705600dxdy CCTK_ATTRIBUTE_UNUSED = kdiv(ToReal(1.41723356009070294784580498866e-6),kmul(dx,dy));\n+ const CCTK_REAL_VEC p1o705600dxdz CCTK_ATTRIBUTE_UNUSED = kdiv(ToReal(1.41723356009070294784580498866e-6),kmul(dx,dz));\n+ const CCTK_REAL_VEC p1o705600dydz CCTK_ATTRIBUTE_UNUSED = kdiv(ToReal(1.41723356009070294784580498866e-6),kmul(dy,dz));\n+ const CCTK_REAL_VEC p1o840dx CCTK_ATTRIBUTE_UNUSED = kdiv(ToReal(0.00119047619047619047619047619048),dx);\n+ const CCTK_REAL_VEC p1o840dy CCTK_ATTRIBUTE_UNUSED = kdiv(ToReal(0.00119047619047619047619047619048),dy);\n+ const CCTK_REAL_VEC p1o840dz CCTK_ATTRIBUTE_UNUSED = kdiv(ToReal(0.00119047619047619047619047619048),dz);\n+ const CCTK_REAL_VEC p1odx2 CCTK_ATTRIBUTE_UNUSED = kdiv(ToReal(1),kmul(dx,dx));\n+ const CCTK_REAL_VEC p1ody2 CCTK_ATTRIBUTE_UNUSED = kdiv(ToReal(1),kmul(dy,dy));\n+ const CCTK_REAL_VEC p1odz2 CCTK_ATTRIBUTE_UNUSED = kdiv(ToReal(1),kmul(dz,dz));\n+ const CCTK_REAL_VEC pm1o120dx CCTK_ATTRIBUTE_UNUSED = kdiv(ToReal(-0.00833333333333333333333333333333),dx);\n+ const CCTK_REAL_VEC pm1o120dy CCTK_ATTRIBUTE_UNUSED = kdiv(ToReal(-0.00833333333333333333333333333333),dy);\n+ const CCTK_REAL_VEC pm1o120dz CCTK_ATTRIBUTE_UNUSED = kdiv(ToReal(-0.00833333333333333333333333333333),dz);\n+ const CCTK_REAL_VEC pm1o12dx CCTK_ATTRIBUTE_UNUSED = kdiv(ToReal(-0.0833333333333333333333333333333),dx);\n+ const CCTK_REAL_VEC pm1o12dx2 CCTK_ATTRIBUTE_UNUSED = kdiv(ToReal(-0.0833333333333333333333333333333),kmul(dx,dx));\n+ const CCTK_REAL_VEC pm1o12dy CCTK_ATTRIBUTE_UNUSED = kdiv(ToReal(-0.0833333333333333333333333333333),dy);\n+ const CCTK_REAL_VEC pm1o12dy2 CCTK_ATTRIBUTE_UNUSED = kdiv(ToReal(-0.0833333333333333333333333333333),kmul(dy,dy));\n+ const CCTK_REAL_VEC pm1o12dz CCTK_ATTRIBUTE_UNUSED = kdiv(ToReal(-0.0833333333333333333333333333333),dz);\n+ const CCTK_REAL_VEC pm1o12dz2 CCTK_ATTRIBUTE_UNUSED = kdiv(ToReal(-0.0833333333333333333333333333333),kmul(dz,dz));\n+ const CCTK_REAL_VEC pm1o16dx CCTK_ATTRIBUTE_UNUSED = kdiv(ToReal(-0.0625),dx);\n+ const CCTK_REAL_VEC pm1o16dy CCTK_ATTRIBUTE_UNUSED = kdiv(ToReal(-0.0625),dy);\n+ const CCTK_REAL_VEC pm1o16dz CCTK_ATTRIBUTE_UNUSED = kdiv(ToReal(-0.0625),dz);\n+ const CCTK_REAL_VEC pm1o256dx CCTK_ATTRIBUTE_UNUSED = kdiv(ToReal(-0.00390625),dx);\n+ const CCTK_REAL_VEC pm1o256dy CCTK_ATTRIBUTE_UNUSED = kdiv(ToReal(-0.00390625),dy);\n+ const CCTK_REAL_VEC pm1o256dz CCTK_ATTRIBUTE_UNUSED = kdiv(ToReal(-0.00390625),dz);\n+ const CCTK_REAL_VEC pm1o2dx CCTK_ATTRIBUTE_UNUSED = kdiv(ToReal(-0.5),dx);\n+ const CCTK_REAL_VEC pm1o2dy CCTK_ATTRIBUTE_UNUSED = kdiv(ToReal(-0.5),dy);\n+ const CCTK_REAL_VEC pm1o2dz CCTK_ATTRIBUTE_UNUSED = kdiv(ToReal(-0.5),dz);\n+ const CCTK_REAL_VEC pm1o4dx CCTK_ATTRIBUTE_UNUSED = kdiv(ToReal(-0.25),dx);\n+ const CCTK_REAL_VEC pm1o4dy CCTK_ATTRIBUTE_UNUSED = kdiv(ToReal(-0.25),dy);\n+ const CCTK_REAL_VEC pm1o4dz CCTK_ATTRIBUTE_UNUSED = kdiv(ToReal(-0.25),dz);\n+ const CCTK_REAL_VEC pm1o60dx CCTK_ATTRIBUTE_UNUSED = kdiv(ToReal(-0.0166666666666666666666666666667),dx);\n+ const CCTK_REAL_VEC pm1o60dy CCTK_ATTRIBUTE_UNUSED = kdiv(ToReal(-0.0166666666666666666666666666667),dy);\n+ const CCTK_REAL_VEC pm1o60dz CCTK_ATTRIBUTE_UNUSED = kdiv(ToReal(-0.0166666666666666666666666666667),dz);\n+ /* Jacobian variable pointers */\n+ const bool usejacobian1 = (!CCTK_IsFunctionAliased(\"MultiPatch_GetMap\") || MultiPatch_GetMap(cctkGH) != jacobian_identity_map)\n+ && strlen(jacobian_group) > 0;\n+ const bool usejacobian = assume_use_jacobian>=0 ? assume_use_jacobian : usejacobian1;\n+ if (usejacobian && (strlen(jacobian_derivative_group) == 0))\n+ {\n+ CCTK_WARN(CCTK_WARN_ALERT, \"GenericFD::jacobian_group and GenericFD::jacobian_derivative_group must both be set to valid group names\");\n+ }\n+ \n+ const CCTK_REAL* restrict jacobian_ptrs[9];\n+ if (usejacobian) GroupDataPointers(cctkGH, jacobian_group,\n+ 9, jacobian_ptrs);\n+ \n+ const CCTK_REAL* restrict const J11 CCTK_ATTRIBUTE_UNUSED = usejacobian ? jacobian_ptrs[0] : 0;\n+ const CCTK_REAL* restrict const J12 CCTK_ATTRIBUTE_UNUSED = usejacobian ? jacobian_ptrs[1] : 0;\n+ const CCTK_REAL* restrict const J13 CCTK_ATTRIBUTE_UNUSED = usejacobian ? jacobian_ptrs[2] : 0;\n+ const CCTK_REAL* restrict const J21 CCTK_ATTRIBUTE_UNUSED = usejacobian ? jacobian_ptrs[3] : 0;\n+ const CCTK_REAL* restrict const J22 CCTK_ATTRIBUTE_UNUSED = usejacobian ? jacobian_ptrs[4] : 0;\n+ const CCTK_REAL* restrict const J23 CCTK_ATTRIBUTE_UNUSED = usejacobian ? jacobian_ptrs[5] : 0;\n+ const CCTK_REAL* restrict const J31 CCTK_ATTRIBUTE_UNUSED = usejacobian ? jacobian_ptrs[6] : 0;\n+ const CCTK_REAL* restrict const J32 CCTK_ATTRIBUTE_UNUSED = usejacobian ? jacobian_ptrs[7] : 0;\n+ const CCTK_REAL* restrict const J33 CCTK_ATTRIBUTE_UNUSED = usejacobian ? jacobian_ptrs[8] : 0;\n+ \n+ const CCTK_REAL* restrict jacobian_determinant_ptrs[1] CCTK_ATTRIBUTE_UNUSED;\n+ if (usejacobian && strlen(jacobian_determinant_group) > 0) GroupDataPointers(cctkGH, jacobian_determinant_group,\n+ 1, jacobian_determinant_ptrs);\n+ \n+ const CCTK_REAL* restrict const detJ CCTK_ATTRIBUTE_UNUSED = usejacobian ? jacobian_determinant_ptrs[0] : 0;\n+ \n+ const CCTK_REAL* restrict jacobian_inverse_ptrs[9] CCTK_ATTRIBUTE_UNUSED;\n+ if (usejacobian && strlen(jacobian_inverse_group) > 0) GroupDataPointers(cctkGH, jacobian_inverse_group,\n+ 9, jacobian_inverse_ptrs);\n+ \n+ const CCTK_REAL* restrict const iJ11 CCTK_ATTRIBUTE_UNUSED = usejacobian ? jacobian_inverse_ptrs[0] : 0;\n+ const CCTK_REAL* restrict const iJ12 CCTK_ATTRIBUTE_UNUSED = usejacobian ? jacobian_inverse_ptrs[1] : 0;\n+ const CCTK_REAL* restrict const iJ13 CCTK_ATTRIBUTE_UNUSED = usejacobian ? jacobian_inverse_ptrs[2] : 0;\n+ const CCTK_REAL* restrict const iJ21 CCTK_ATTRIBUTE_UNUSED = usejacobian ? jacobian_inverse_ptrs[3] : 0;\n+ const CCTK_REAL* restrict const iJ22 CCTK_ATTRIBUTE_UNUSED = usejacobian ? jacobian_inverse_ptrs[4] : 0;\n+ const CCTK_REAL* restrict const iJ23 CCTK_ATTRIBUTE_UNUSED = usejacobian ? jacobian_inverse_ptrs[5] : 0;\n+ const CCTK_REAL* restrict const iJ31 CCTK_ATTRIBUTE_UNUSED = usejacobian ? jacobian_inverse_ptrs[6] : 0;\n+ const CCTK_REAL* restrict const iJ32 CCTK_ATTRIBUTE_UNUSED = usejacobian ? jacobian_inverse_ptrs[7] : 0;\n+ const CCTK_REAL* restrict const iJ33 CCTK_ATTRIBUTE_UNUSED = usejacobian ? jacobian_inverse_ptrs[8] : 0;\n+ \n+ const CCTK_REAL* restrict jacobian_derivative_ptrs[18] CCTK_ATTRIBUTE_UNUSED;\n+ if (usejacobian) GroupDataPointers(cctkGH, jacobian_derivative_group,\n+ 18, jacobian_derivative_ptrs);\n+ \n+ const CCTK_REAL* restrict const dJ111 CCTK_ATTRIBUTE_UNUSED = usejacobian ? jacobian_derivative_ptrs[0] : 0;\n+ const CCTK_REAL* restrict const dJ112 CCTK_ATTRIBUTE_UNUSED = usejacobian ? jacobian_derivative_ptrs[1] : 0;\n+ const CCTK_REAL* restrict const dJ113 CCTK_ATTRIBUTE_UNUSED = usejacobian ? jacobian_derivative_ptrs[2] : 0;\n+ const CCTK_REAL* restrict const dJ122 CCTK_ATTRIBUTE_UNUSED = usejacobian ? jacobian_derivative_ptrs[3] : 0;\n+ const CCTK_REAL* restrict const dJ123 CCTK_ATTRIBUTE_UNUSED = usejacobian ? jacobian_derivative_ptrs[4] : 0;\n+ const CCTK_REAL* restrict const dJ133 CCTK_ATTRIBUTE_UNUSED = usejacobian ? jacobian_derivative_ptrs[5] : 0;\n+ const CCTK_REAL* restrict const dJ211 CCTK_ATTRIBUTE_UNUSED = usejacobian ? jacobian_derivative_ptrs[6] : 0;\n+ const CCTK_REAL* restrict const dJ212 CCTK_ATTRIBUTE_UNUSED = usejacobian ? jacobian_derivative_ptrs[7] : 0;\n+ const CCTK_REAL* restrict const dJ213 CCTK_ATTRIBUTE_UNUSED = usejacobian ? jacobian_derivative_ptrs[8] : 0;\n+ const CCTK_REAL* restrict const dJ222 CCTK_ATTRIBUTE_UNUSED = usejacobian ? jacobian_derivative_ptrs[9] : 0;\n+ const CCTK_REAL* restrict const dJ223 CCTK_ATTRIBUTE_UNUSED = usejacobian ? jacobian_derivative_ptrs[10] : 0;\n+ const CCTK_REAL* restrict const dJ233 CCTK_ATTRIBUTE_UNUSED = usejacobian ? jacobian_derivative_ptrs[11] : 0;\n+ const CCTK_REAL* restrict const dJ311 CCTK_ATTRIBUTE_UNUSED = usejacobian ? jacobian_derivative_ptrs[12] : 0;\n+ const CCTK_REAL* restrict const dJ312 CCTK_ATTRIBUTE_UNUSED = usejacobian ? jacobian_derivative_ptrs[13] : 0;\n+ const CCTK_REAL* restrict const dJ313 CCTK_ATTRIBUTE_UNUSED = usejacobian ? jacobian_derivative_ptrs[14] : 0;\n+ const CCTK_REAL* restrict const dJ322 CCTK_ATTRIBUTE_UNUSED = usejacobian ? jacobian_derivative_ptrs[15] : 0;\n+ const CCTK_REAL* restrict const dJ323 CCTK_ATTRIBUTE_UNUSED = usejacobian ? jacobian_derivative_ptrs[16] : 0;\n+ const CCTK_REAL* restrict const dJ333 CCTK_ATTRIBUTE_UNUSED = usejacobian ? jacobian_derivative_ptrs[17] : 0;\n+ /* Assign local copies of arrays functions */\n+ \n+ \n+ /* Calculate temporaries and arrays functions */\n+ /* Copy local copies back to grid functions */\n+ /* Loop over the grid points */\n+ const int imin0=imin[0];\n+ const int imin1=imin[1];\n+ const int imin2=imin[2];\n+ const int imax0=imax[0];\n+ const int imax1=imax[1];\n+ const int imax2=imax[2];\n+ #pragma omp parallel\n+ CCTK_LOOP3STR(ML_CCZ4_ADMBaseBoundaryScalar,\n+ i,j,k, imin0,imin1,imin2, imax0,imax1,imax2,\n+ cctk_ash[0],cctk_ash[1],cctk_ash[2],\n+ vecimin,vecimax, CCTK_REAL_VEC_SIZE)\n+ {\n+ const ptrdiff_t index CCTK_ATTRIBUTE_UNUSED = di*i + dj*j + dk*k;\n+ /* Assign local copies of grid functions */\n+ \n+ \n+ \n+ /* Include user supplied include files */\n+ /* Precompute derivatives */\n+ \n+ switch (fdOrder)\n+ {\n+ case 2:\n+ {\n+ break;\n+ }\n+ \n+ case 4:\n+ {\n+ break;\n+ }\n+ \n+ case 6:\n+ {\n+ break;\n+ }\n+ \n+ case 8:\n+ {\n+ break;\n+ }\n+ default:\n+ CCTK_BUILTIN_UNREACHABLE();\n+ }\n+ /* Calculate temporaries and grid functions */\n+ CCTK_REAL_VEC dtalpL CCTK_ATTRIBUTE_UNUSED = ToReal(0);\n+ \n+ CCTK_REAL_VEC dtbetaxL CCTK_ATTRIBUTE_UNUSED = ToReal(0);\n+ \n+ CCTK_REAL_VEC dtbetayL CCTK_ATTRIBUTE_UNUSED = ToReal(0);\n+ \n+ CCTK_REAL_VEC dtbetazL CCTK_ATTRIBUTE_UNUSED = ToReal(0);\n+ /* Copy local copies back to grid functions */\n+ vec_store_partial_prepare(i,vecimin,vecimax);\n+ vec_store_nta_partial(dtalp[index],dtalpL);\n+ vec_store_nta_partial(dtbetax[index],dtbetaxL);\n+ vec_store_nta_partial(dtbetay[index],dtbetayL);\n+ vec_store_nta_partial(dtbetaz[index],dtbetazL);\n+ }\n+ CCTK_ENDLOOP3STR(ML_CCZ4_ADMBaseBoundaryScalar);\n+}\n+extern \"C\" void ML_CCZ4_ADMBaseBoundaryScalar(CCTK_ARGUMENTS)\n+{\n+ DECLARE_CCTK_ARGUMENTS;\n+ DECLARE_CCTK_PARAMETERS;\n+ \n+ if (verbose > 1)\n+ {\n+ CCTK_VInfo(CCTK_THORNSTRING,\"Entering ML_CCZ4_ADMBaseBoundaryScalar_Body\");\n+ }\n+ if (cctk_iteration % ML_CCZ4_ADMBaseBoundaryScalar_calc_every != ML_CCZ4_ADMBaseBoundaryScalar_calc_offset)\n+ {\n+ return;\n+ }\n+ \n+ const char* const groups[] = {\n+ \"ADMBase::dtlapse\",\n+ \"ADMBase::dtshift\"};\n+ AssertGroupStorage(cctkGH, \"ML_CCZ4_ADMBaseBoundaryScalar\", 2, groups);\n+ \n+ switch (fdOrder)\n+ {\n+ case 2:\n+ {\n+ break;\n+ }\n+ \n+ case 4:\n+ {\n+ break;\n+ }\n+ \n+ case 6:\n+ {\n+ break;\n+ }\n+ \n+ case 8:\n+ {\n+ break;\n+ }\n+ default:\n+ CCTK_BUILTIN_UNREACHABLE();\n+ }\n+ \n+ LoopOverBoundary(cctkGH, ML_CCZ4_ADMBaseBoundaryScalar_Body);\n+ if (verbose > 1)\n+ {\n+ CCTK_VInfo(CCTK_THORNSTRING,\"Leaving ML_CCZ4_ADMBaseBoundaryScalar_Body\");\n+ }\n+}\n+\n+} // namespace ML_CCZ4"}, "test": {"test_patch": "diff --git a/all_tests.txt b/all_tests.txt\nnew file mode 100644\nindex 0000000..0000000\n--- /dev/null\n+++ b/all_tests.txt\n@@ -0,0 +1,2 @@\n+ML_CCZ4_sgw3d\n+ML_CCZ4_sgw3d_rhs", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}33{"question_id": "MSB_einsteintoolkit_Cactus_pr39", "question_type": "multi_swe_bench", "description": "Add missing WT_Energy.cc in McLachlan/ML_WaveToy (einsteintoolkit/Cactus#39)", "content": {"org": "einsteintoolkit", "repo": "Cactus", "pr_number": 39, "issue_title": "Add missing WT_Energy.cc in McLachlan/ML_WaveToy", "issue_body": "This PR adds the missing source file WT_Energy.cc to complete the McLachlan/ML_WaveToy thorn implementation.", "base_commit": "HEAD", "resolved_issues": [{"number": 39, "title": "Implement the full functionality of ML_WaveToy", "body": "Please implement the full functionality of `ML_WaveToy` by finishing the code in `WT_Energy.cc`.\n\n## Thorn Information:\n- Name: ML_WaveToy\n- Target file: WT_Energy.cc\n\n## Interface Definition in interface.ccl:\n\n## Schedule Definition in schedule.ccl:\n\n## Parameters Definition in param.ccl:\n\n## Configuration Definition in configuration.ccl:\n\n## Documentation Context in readme.md and doc/documentation.tex\n\n## Related Code Context in src folder\n\n"}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/einsteintoolkit_m_cactus:pr-39", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/arrangements/McLachlan/ML_WaveToy/src/WT_Energy.cc b/arrangements/McLachlan/ML_WaveToy/src/WT_Energy.cc\nnew file mode 100644\nindex 0000000..0000000\n--- /dev/null\n+++ b/arrangements/McLachlan/ML_WaveToy/src/WT_Energy.cc\n@@ -0,0 +1,161 @@\n+/* File produced by Kranc */\n+\n+#define KRANC_C\n+\n+#include <algorithm>\n+#include <assert.h>\n+#include <math.h>\n+#include <stdio.h>\n+#include <stdlib.h>\n+#include <string.h>\n+#include \"cctk.h\"\n+#include \"cctk_Arguments.h\"\n+#include \"cctk_Parameters.h\"\n+#include \"Kranc.hh\"\n+#include \"Differencing.h\"\n+#include \"loopcontrol.h\"\n+#include \"vectors.h\"\n+\n+namespace ML_WaveToy {\n+\n+extern \"C\" void WT_Energy_SelectBCs(CCTK_ARGUMENTS)\n+{\n+ DECLARE_CCTK_ARGUMENTS;\n+ DECLARE_CCTK_PARAMETERS;\n+ \n+ if (cctk_iteration % WT_Energy_calc_every != WT_Energy_calc_offset)\n+ return;\n+ CCTK_INT ierr CCTK_ATTRIBUTE_UNUSED = 0;\n+ ierr = Boundary_SelectGroupForBC(cctkGH, CCTK_ALL_FACES, GetBoundaryWidth(cctkGH), -1 /* no table */, \"ML_WaveToy::WT_eps\",\"flat\");\n+ if (ierr < 0)\n+ CCTK_WARN(CCTK_WARN_ALERT, \"Failed to register flat BC for ML_WaveToy::WT_eps.\");\n+ return;\n+}\n+\n+static void WT_Energy_Body(const cGH* restrict const cctkGH, const int dir, const int face, const CCTK_REAL normal[3], const CCTK_REAL tangentA[3], const CCTK_REAL tangentB[3], const int imin[3], const int imax[3], const int n_subblock_gfs, CCTK_REAL* restrict const subblock_gfs[])\n+{\n+ DECLARE_CCTK_ARGUMENTS;\n+ DECLARE_CCTK_PARAMETERS;\n+ \n+ /* Include user-supplied include files */\n+ /* Initialise finite differencing variables */\n+ const ptrdiff_t di CCTK_ATTRIBUTE_UNUSED = 1;\n+ const ptrdiff_t dj CCTK_ATTRIBUTE_UNUSED = \n+ CCTK_GFINDEX3D(cctkGH,0,1,0) - CCTK_GFINDEX3D(cctkGH,0,0,0);\n+ const ptrdiff_t dk CCTK_ATTRIBUTE_UNUSED = \n+ CCTK_GFINDEX3D(cctkGH,0,0,1) - CCTK_GFINDEX3D(cctkGH,0,0,0);\n+ const ptrdiff_t cdi CCTK_ATTRIBUTE_UNUSED = sizeof(CCTK_REAL) * di;\n+ const ptrdiff_t cdj CCTK_ATTRIBUTE_UNUSED = sizeof(CCTK_REAL) * dj;\n+ const ptrdiff_t cdk CCTK_ATTRIBUTE_UNUSED = sizeof(CCTK_REAL) * dk;\n+ const ptrdiff_t cctkLbnd1 CCTK_ATTRIBUTE_UNUSED = cctk_lbnd[0];\n+ const ptrdiff_t cctkLbnd2 CCTK_ATTRIBUTE_UNUSED = cctk_lbnd[1];\n+ const ptrdiff_t cctkLbnd3 CCTK_ATTRIBUTE_UNUSED = cctk_lbnd[2];\n+ const CCTK_REAL_VEC t CCTK_ATTRIBUTE_UNUSED = ToReal(cctk_time);\n+ const CCTK_REAL_VEC cctkOriginSpace1 CCTK_ATTRIBUTE_UNUSED = \n+ ToReal(CCTK_ORIGIN_SPACE(0));\n+ const CCTK_REAL_VEC cctkOriginSpace2 CCTK_ATTRIBUTE_UNUSED = \n+ ToReal(CCTK_ORIGIN_SPACE(1));\n+ const CCTK_REAL_VEC cctkOriginSpace3 CCTK_ATTRIBUTE_UNUSED = \n+ ToReal(CCTK_ORIGIN_SPACE(2));\n+ const CCTK_REAL_VEC dt CCTK_ATTRIBUTE_UNUSED = \n+ ToReal(CCTK_DELTA_TIME);\n+ const CCTK_REAL_VEC dx CCTK_ATTRIBUTE_UNUSED = \n+ ToReal(CCTK_DELTA_SPACE(0));\n+ const CCTK_REAL_VEC dy CCTK_ATTRIBUTE_UNUSED = \n+ ToReal(CCTK_DELTA_SPACE(1));\n+ const CCTK_REAL_VEC dz CCTK_ATTRIBUTE_UNUSED = \n+ ToReal(CCTK_DELTA_SPACE(2));\n+ const CCTK_REAL_VEC dxi CCTK_ATTRIBUTE_UNUSED = kdiv(ToReal(1),dx);\n+ const CCTK_REAL_VEC dyi CCTK_ATTRIBUTE_UNUSED = kdiv(ToReal(1),dy);\n+ const CCTK_REAL_VEC dzi CCTK_ATTRIBUTE_UNUSED = kdiv(ToReal(1),dz);\n+ const CCTK_REAL_VEC khalf CCTK_ATTRIBUTE_UNUSED = ToReal(0.5);\n+ const CCTK_REAL_VEC kthird CCTK_ATTRIBUTE_UNUSED = \n+ ToReal(0.333333333333333333333333333333);\n+ const CCTK_REAL_VEC ktwothird CCTK_ATTRIBUTE_UNUSED = \n+ ToReal(0.666666666666666666666666666667);\n+ const CCTK_REAL_VEC kfourthird CCTK_ATTRIBUTE_UNUSED = \n+ ToReal(1.33333333333333333333333333333);\n+ const CCTK_REAL_VEC hdxi CCTK_ATTRIBUTE_UNUSED = \n+ kmul(dxi,ToReal(0.5));\n+ const CCTK_REAL_VEC hdyi CCTK_ATTRIBUTE_UNUSED = \n+ kmul(dyi,ToReal(0.5));\n+ const CCTK_REAL_VEC hdzi CCTK_ATTRIBUTE_UNUSED = \n+ kmul(dzi,ToReal(0.5));\n+ /* Initialize predefined quantities */\n+ const CCTK_REAL_VEC p1o12dx CCTK_ATTRIBUTE_UNUSED = kdiv(ToReal(0.0833333333333333333333333333333),dx);\n+ const CCTK_REAL_VEC p1o12dy CCTK_ATTRIBUTE_UNUSED = kdiv(ToReal(0.0833333333333333333333333333333),dy);\n+ const CCTK_REAL_VEC p1o12dz CCTK_ATTRIBUTE_UNUSED = kdiv(ToReal(0.0833333333333333333333333333333),dz);\n+ const CCTK_REAL_VEC p1o144dxdy CCTK_ATTRIBUTE_UNUSED = kdiv(ToReal(0.00694444444444444444444444444444),kmul(dx,dy));\n+ const CCTK_REAL_VEC p1o144dxdz CCTK_ATTRIBUTE_UNUSED = kdiv(ToReal(0.00694444444444444444444444444444),kmul(dx,dz));\n+ const CCTK_REAL_VEC p1o144dydz CCTK_ATTRIBUTE_UNUSED = kdiv(ToReal(0.00694444444444444444444444444444),kmul(dy,dz));\n+ const CCTK_REAL_VEC pm1o12dx2 CCTK_ATTRIBUTE_UNUSED = kdiv(ToReal(-0.0833333333333333333333333333333),kmul(dx,dx));\n+ const CCTK_REAL_VEC pm1o12dy2 CCTK_ATTRIBUTE_UNUSED = kdiv(ToReal(-0.0833333333333333333333333333333),kmul(dy,dy));\n+ const CCTK_REAL_VEC pm1o12dz2 CCTK_ATTRIBUTE_UNUSED = kdiv(ToReal(-0.0833333333333333333333333333333),kmul(dz,dz));\n+ /* Assign local copies of arrays functions */\n+ \n+ \n+ /* Calculate temporaries and arrays functions */\n+ /* Copy local copies back to grid functions */\n+ /* Loop over the grid points */\n+ const int imin0=imin[0];\n+ const int imin1=imin[1];\n+ const int imin2=imin[2];\n+ const int imax0=imax[0];\n+ const int imax1=imax[1];\n+ const int imax2=imax[2];\n+ #pragma omp parallel\n+ CCTK_LOOP3STR(WT_Energy,\n+ i,j,k, imin0,imin1,imin2, imax0,imax1,imax2,\n+ cctk_ash[0],cctk_ash[1],cctk_ash[2],\n+ vecimin,vecimax, CCTK_REAL_VEC_SIZE)\n+ {\n+ const ptrdiff_t index CCTK_ATTRIBUTE_UNUSED = di*i + dj*j + dk*k;\n+ /* Assign local copies of grid functions */\n+ \n+ CCTK_REAL_VEC rhoL CCTK_ATTRIBUTE_UNUSED = vec_load(rho[index]);\n+ CCTK_REAL_VEC uL CCTK_ATTRIBUTE_UNUSED = vec_load(u[index]);\n+ \n+ /* Include user supplied include files */\n+ /* Precompute derivatives */\n+ const CCTK_REAL_VEC PDstandardNth1u CCTK_ATTRIBUTE_UNUSED = PDstandardNth1(&u[index]);\n+ const CCTK_REAL_VEC PDstandardNth2u CCTK_ATTRIBUTE_UNUSED = PDstandardNth2(&u[index]);\n+ const CCTK_REAL_VEC PDstandardNth3u CCTK_ATTRIBUTE_UNUSED = PDstandardNth3(&u[index]);\n+ /* Calculate temporaries and grid functions */\n+ CCTK_REAL_VEC epsL CCTK_ATTRIBUTE_UNUSED = \n+ kmul(kmadd(rhoL,rhoL,kmadd(PDstandardNth1u,PDstandardNth1u,kmadd(PDstandardNth2u,PDstandardNth2u,kmul(PDstandardNth3u,PDstandardNth3u)))),ToReal(0.5));\n+ /* Copy local copies back to grid functions */\n+ vec_store_partial_prepare(i,vecimin,vecimax);\n+ vec_store_nta_partial(eps[index],epsL);\n+ }\n+ CCTK_ENDLOOP3STR(WT_Energy);\n+}\n+extern \"C\" void WT_Energy(CCTK_ARGUMENTS)\n+{\n+ DECLARE_CCTK_ARGUMENTS;\n+ DECLARE_CCTK_PARAMETERS;\n+ \n+ if (verbose > 1)\n+ {\n+ CCTK_VInfo(CCTK_THORNSTRING,\"Entering WT_Energy_Body\");\n+ }\n+ if (cctk_iteration % WT_Energy_calc_every != WT_Energy_calc_offset)\n+ {\n+ return;\n+ }\n+ \n+ const char* const groups[] = {\n+ \"ML_WaveToy::WT_eps\",\n+ \"ML_WaveToy::WT_rho\",\n+ \"ML_WaveToy::WT_u\"};\n+ AssertGroupStorage(cctkGH, \"WT_Energy\", 3, groups);\n+ \n+ EnsureStencilFits(cctkGH, \"WT_Energy\", 2, 2, 2);\n+ \n+ LoopOverInterior(cctkGH, WT_Energy_Body);\n+ if (verbose > 1)\n+ {\n+ CCTK_VInfo(CCTK_THORNSTRING,\"Leaving WT_Energy_Body\");\n+ }\n+}\n+\n+} // namespace ML_WaveToy"}, "test": {"test_patch": "diff --git a/all_tests.txt b/all_tests.txt\nnew file mode 100644\nindex 0000000..0000000\n--- /dev/null\n+++ b/all_tests.txt\n@@ -0,0 +1,3 @@\n+gaussian-RK4\n+gaussian-RK45\n+gaussian-RK45-adaptive", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}34{"question_id": "MSB_einsteintoolkit_Cactus_pr4", "question_type": "multi_swe_bench", "description": "Add missing WaveToy.F90 in CactusWave/WaveToyFreeF90 (einsteintoolkit/Cactus#4)", "content": {"org": "einsteintoolkit", "repo": "Cactus", "pr_number": 4, "issue_title": "Add missing WaveToy.F90 in CactusWave/WaveToyFreeF90", "issue_body": "This PR adds the missing source file WaveToy.F90 to complete the CactusWave/WaveToyFreeF90 thorn implementation.", "base_commit": "HEAD", "resolved_issues": [{"number": 4, "title": "Implement the full functionality of WaveToyFreeF90", "body": "Please implement the full functionality of `WaveToyFreeF90` by finishing the code in `WaveToy.F90`.\n\n## Thorn Information:\n- Name: WaveToyFreeF90\n- Target file: WaveToy.F90\n\n## Interface Definition in interface.ccl:\n\n## Schedule Definition in schedule.ccl:\n\n## Parameters Definition in param.ccl:\n\n## Configuration Definition in configuration.ccl:\n\n## Documentation Context in readme.md and doc/documentation.tex\n\n## Related Code Context in src folder\n\n"}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/einsteintoolkit_m_cactus:pr-4", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/arrangements/CactusWave/WaveToyFreeF90/src/WaveToy.F90 b/arrangements/CactusWave/WaveToyFreeF90/src/WaveToy.F90\nnew file mode 100644\nindex 0000000..0000000\n--- /dev/null\n+++ b/arrangements/CactusWave/WaveToyFreeF90/src/WaveToy.F90\n@@ -0,0 +1,151 @@\n+ /*@@\n+ @file WaveToy.F90\n+ @date \n+ @author Tom Goodale\n+ @desc \n+ Evolution routines for the wave equation solver\n+ @enddesc \n+ @version $Header$\n+ @@*/\n+\n+#include \"cctk.h\"\n+#include \"cctk_Parameters.h\"\n+#include \"cctk_Arguments.h\"\n+#include \"cctk_Functions.h\"\n+\n+\n+ /*@@\n+ @routine WaveToyFreeF90_Evolution\n+ @date \n+ @author Tom Goodale\n+ @desc \n+ Evolution for the wave equation\n+ @enddesc \n+ @calls CCTK_SyncGroup, wavetoy_boundaries\n+ @calledby \n+ @history \n+ \n+ @endhistory \n+\n+@@*/\n+\n+subroutine WaveToyFreeF90_Evolution(CCTK_ARGUMENTS)\n+ \n+ implicit none\n+ \n+ DECLARE_CCTK_ARGUMENTS\n+ DECLARE_CCTK_PARAMETERS\n+ \n+ ! Declare local variables\n+ INTEGER :: i,j,k\n+ INTEGER :: istart, jstart, kstart, iend, jend, kend\n+\n+ CCTK_REAL :: dx,dy,dz,dt\n+ CCTK_REAL :: dx2,dy2,dz2,dt2\n+ CCTK_REAL :: dx2i,dy2i,dz2i\n+\n+ CCTK_REAL :: factor\n+ \n+ ! Set up shorthands\n+ ! -----------------\n+ dx = CCTK_DELTA_SPACE(1)\n+ dy = CCTK_DELTA_SPACE(2)\n+ dz = CCTK_DELTA_SPACE(3)\n+ dt = CCTK_DELTA_TIME\n+\n+ dx2 = dx*dx\n+ dy2 = dy*dy\n+ dz2 = dz*dz\n+ dt2 = dt*dt\n+\n+ dx2i = 1.0/dx2\n+ dy2i = 1.0/dy2\n+ dz2i = 1.0/dz2\n+\n+ istart = 2\n+ jstart = 2\n+ kstart = 2\n+ \n+ iend = cctk_lsh(1)-1\n+ jend = cctk_lsh(2)-1\n+ kend = cctk_lsh(3)-1\n+\n+ factor = 2*(1 - (dt2)*(dx2i + dy2i + dz2i))\n+ \n+ ! Do the evolution\n+ ! ----------------\n+ do k = kstart, kend\n+ do j = jstart, jend\n+ do i = istart, iend\n+ \n+ phi(i,j,k) = factor*phi_p(i,j,k) - &\n+ phi_p_p(i,j,k) + (dt2) * &\n+ ((phi_p(i+1,j,k)+phi_p(i-1,j,k))*dx2i &\n+ +(phi_p(i,j+1,k)+phi_p(i,j-1,k))*dy2i &\n+ +(phi_p(i,j,k+1)+phi_p(i,j,k-1))*dz2i)\n+ \n+ end do\n+ end do\n+ end do\n+ \n+end subroutine WaveToyFreeF90_Evolution\n+\n+\n+ /*@@\n+ @routine WaveToyFortran_Boundaries\n+ @date \n+ @author Tom Goodale\n+ @desc \n+ Boundary conditions for the wave equation\n+ @enddesc \n+ @calls CartSymGH,FlatBC,RadiativeBC \n+ @calledby \n+ @history \n+ \n+ @endhistory \n+\n+@@*/\n+\n+subroutine WaveToyFreeF90_Boundaries(CCTK_ARGUMENTS)\n+ \n+ implicit none\n+ \n+ DECLARE_CCTK_ARGUMENTS\n+ DECLARE_CCTK_PARAMETERS\n+ DECLARE_CCTK_FUNCTIONS\n+\n+ CCTK_INT, parameter :: izero = 0\n+ integer, parameter :: ik = kind(izero)\n+\n+! Local declarations\n+ CCTK_INT :: ierr\n+\n+ CHARACTER (len=100) :: boundary\n+ INTEGER :: length\n+\n+ ierr = 0\n+ \n+! The \"bound\" parameter needs to be converted into a Fortran string.\n+ call CCTK_FortranString(length,bound,boundary)\n+\n+! Apply the outer boundary conditions\n+! -----------------------------------\n+! Note: In each of the following calls to Boundary_SelectVarForBC,\n+! default arguments are used, so an invalid table handle of -1 can\n+! be passed\n+\n+ if (CCTK_EQUALS(bound,\"flat\") .or. CCTK_EQUALS(bound,\"static\") .or. &\n+ CCTK_EQUALS(bound,\"radiation\") .or. CCTK_EQUALS(bound,\"robin\") .or. &\n+ CCTK_EQUALS(bound,\"none\") ) then\n+ ierr = Boundary_SelectVarForBC(cctkGH, int(CCTK_ALL_FACES,ik), 1_ik, -1_ik, &\n+ \"wavetoy::phi\", boundary)\n+ else if (CCTK_EQUALS(bound,\"zero\")) then\n+ ierr = Boundary_SelectVarForBC(cctkGH, int(CCTK_ALL_FACES,ik), 1_ik, -1_ik, &\n+ \"wavetoy::phi\", \"Scalar\")\n+ end if\n+\n+ if (ierr < 0) then\n+ call CCTK_WARN(0,\"WaveToyFreeF90_Boundaries: Error selecting boundary condition\")\n+ end if\n+ \n+end subroutine WaveToyFreeF90_Boundaries"}, "test": {"test_patch": "diff --git a/all_tests.txt b/all_tests.txt\nnew file mode 100644\nindex 0000000..0000000\n--- /dev/null\n+++ b/all_tests.txt\n@@ -0,0 +1,1 @@\n+test_rad", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}35{"question_id": "MSB_einsteintoolkit_Cactus_pr40", "question_type": "multi_swe_bench", "description": "Add missing WT_Standing.cc in McLachlan/ML_WaveToy (einsteintoolkit/Cactus#40)", "content": {"org": "einsteintoolkit", "repo": "Cactus", "pr_number": 40, "issue_title": "Add missing WT_Standing.cc in McLachlan/ML_WaveToy", "issue_body": "This PR adds the missing source file WT_Standing.cc to complete the McLachlan/ML_WaveToy thorn implementation.", "base_commit": "HEAD", "resolved_issues": [{"number": 40, "title": "Implement the full functionality of ML_WaveToy", "body": "Please implement the full functionality of `ML_WaveToy` by finishing the code in `WT_Standing.cc`.\n\n## Thorn Information:\n- Name: ML_WaveToy\n- Target file: WT_Standing.cc\n\n## Interface Definition in interface.ccl:\n\n## Schedule Definition in schedule.ccl:\n\n## Parameters Definition in param.ccl:\n\n## Configuration Definition in configuration.ccl:\n\n## Documentation Context in readme.md and doc/documentation.tex\n\n## Related Code Context in src folder\n\n"}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/einsteintoolkit_m_cactus:pr-40", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/arrangements/McLachlan/ML_WaveToy/src/WT_Standing.cc b/arrangements/McLachlan/ML_WaveToy/src/WT_Standing.cc\nnew file mode 100644\nindex 0000000..0000000\n--- /dev/null\n+++ b/arrangements/McLachlan/ML_WaveToy/src/WT_Standing.cc\n@@ -0,0 +1,155 @@\n+/* File produced by Kranc */\n+\n+#define KRANC_C\n+\n+#include <algorithm>\n+#include <assert.h>\n+#include <math.h>\n+#include <stdio.h>\n+#include <stdlib.h>\n+#include <string.h>\n+#include \"cctk.h\"\n+#include \"cctk_Arguments.h\"\n+#include \"cctk_Parameters.h\"\n+#include \"Kranc.hh\"\n+#include \"Differencing.h\"\n+#include \"loopcontrol.h\"\n+#include \"vectors.h\"\n+\n+namespace ML_WaveToy {\n+\n+\n+static void WT_Standing_Body(const cGH* restrict const cctkGH, const int dir, const int face, const CCTK_REAL normal[3], const CCTK_REAL tangentA[3], const CCTK_REAL tangentB[3], const int imin[3], const int imax[3], const int n_subblock_gfs, CCTK_REAL* restrict const subblock_gfs[])\n+{\n+ DECLARE_CCTK_ARGUMENTS;\n+ DECLARE_CCTK_PARAMETERS;\n+ \n+ /* Include user-supplied include files */\n+ /* Initialise finite differencing variables */\n+ const ptrdiff_t di CCTK_ATTRIBUTE_UNUSED = 1;\n+ const ptrdiff_t dj CCTK_ATTRIBUTE_UNUSED = \n+ CCTK_GFINDEX3D(cctkGH,0,1,0) - CCTK_GFINDEX3D(cctkGH,0,0,0);\n+ const ptrdiff_t dk CCTK_ATTRIBUTE_UNUSED = \n+ CCTK_GFINDEX3D(cctkGH,0,0,1) - CCTK_GFINDEX3D(cctkGH,0,0,0);\n+ const ptrdiff_t cdi CCTK_ATTRIBUTE_UNUSED = sizeof(CCTK_REAL) * di;\n+ const ptrdiff_t cdj CCTK_ATTRIBUTE_UNUSED = sizeof(CCTK_REAL) * dj;\n+ const ptrdiff_t cdk CCTK_ATTRIBUTE_UNUSED = sizeof(CCTK_REAL) * dk;\n+ const ptrdiff_t cctkLbnd1 CCTK_ATTRIBUTE_UNUSED = cctk_lbnd[0];\n+ const ptrdiff_t cctkLbnd2 CCTK_ATTRIBUTE_UNUSED = cctk_lbnd[1];\n+ const ptrdiff_t cctkLbnd3 CCTK_ATTRIBUTE_UNUSED = cctk_lbnd[2];\n+ const CCTK_REAL_VEC t CCTK_ATTRIBUTE_UNUSED = ToReal(cctk_time);\n+ const CCTK_REAL_VEC cctkOriginSpace1 CCTK_ATTRIBUTE_UNUSED = \n+ ToReal(CCTK_ORIGIN_SPACE(0));\n+ const CCTK_REAL_VEC cctkOriginSpace2 CCTK_ATTRIBUTE_UNUSED = \n+ ToReal(CCTK_ORIGIN_SPACE(1));\n+ const CCTK_REAL_VEC cctkOriginSpace3 CCTK_ATTRIBUTE_UNUSED = \n+ ToReal(CCTK_ORIGIN_SPACE(2));\n+ const CCTK_REAL_VEC dt CCTK_ATTRIBUTE_UNUSED = \n+ ToReal(CCTK_DELTA_TIME);\n+ const CCTK_REAL_VEC dx CCTK_ATTRIBUTE_UNUSED = \n+ ToReal(CCTK_DELTA_SPACE(0));\n+ const CCTK_REAL_VEC dy CCTK_ATTRIBUTE_UNUSED = \n+ ToReal(CCTK_DELTA_SPACE(1));\n+ const CCTK_REAL_VEC dz CCTK_ATTRIBUTE_UNUSED = \n+ ToReal(CCTK_DELTA_SPACE(2));\n+ const CCTK_REAL_VEC dxi CCTK_ATTRIBUTE_UNUSED = kdiv(ToReal(1),dx);\n+ const CCTK_REAL_VEC dyi CCTK_ATTRIBUTE_UNUSED = kdiv(ToReal(1),dy);\n+ const CCTK_REAL_VEC dzi CCTK_ATTRIBUTE_UNUSED = kdiv(ToReal(1),dz);\n+ const CCTK_REAL_VEC khalf CCTK_ATTRIBUTE_UNUSED = ToReal(0.5);\n+ const CCTK_REAL_VEC kthird CCTK_ATTRIBUTE_UNUSED = \n+ ToReal(0.333333333333333333333333333333);\n+ const CCTK_REAL_VEC ktwothird CCTK_ATTRIBUTE_UNUSED = \n+ ToReal(0.666666666666666666666666666667);\n+ const CCTK_REAL_VEC kfourthird CCTK_ATTRIBUTE_UNUSED = \n+ ToReal(1.33333333333333333333333333333);\n+ const CCTK_REAL_VEC hdxi CCTK_ATTRIBUTE_UNUSED = \n+ kmul(dxi,ToReal(0.5));\n+ const CCTK_REAL_VEC hdyi CCTK_ATTRIBUTE_UNUSED = \n+ kmul(dyi,ToReal(0.5));\n+ const CCTK_REAL_VEC hdzi CCTK_ATTRIBUTE_UNUSED = \n+ kmul(dzi,ToReal(0.5));\n+ /* Initialize predefined quantities */\n+ const CCTK_REAL_VEC p1o12dx CCTK_ATTRIBUTE_UNUSED = kdiv(ToReal(0.0833333333333333333333333333333),dx);\n+ const CCTK_REAL_VEC p1o12dy CCTK_ATTRIBUTE_UNUSED = kdiv(ToReal(0.0833333333333333333333333333333),dy);\n+ const CCTK_REAL_VEC p1o12dz CCTK_ATTRIBUTE_UNUSED = kdiv(ToReal(0.0833333333333333333333333333333),dz);\n+ const CCTK_REAL_VEC p1o144dxdy CCTK_ATTRIBUTE_UNUSED = kdiv(ToReal(0.00694444444444444444444444444444),kmul(dx,dy));\n+ const CCTK_REAL_VEC p1o144dxdz CCTK_ATTRIBUTE_UNUSED = kdiv(ToReal(0.00694444444444444444444444444444),kmul(dx,dz));\n+ const CCTK_REAL_VEC p1o144dydz CCTK_ATTRIBUTE_UNUSED = kdiv(ToReal(0.00694444444444444444444444444444),kmul(dy,dz));\n+ const CCTK_REAL_VEC pm1o12dx2 CCTK_ATTRIBUTE_UNUSED = kdiv(ToReal(-0.0833333333333333333333333333333),kmul(dx,dx));\n+ const CCTK_REAL_VEC pm1o12dy2 CCTK_ATTRIBUTE_UNUSED = kdiv(ToReal(-0.0833333333333333333333333333333),kmul(dy,dy));\n+ const CCTK_REAL_VEC pm1o12dz2 CCTK_ATTRIBUTE_UNUSED = kdiv(ToReal(-0.0833333333333333333333333333333),kmul(dz,dz));\n+ /* Assign local copies of arrays functions */\n+ \n+ \n+ /* Calculate temporaries and arrays functions */\n+ /* Copy local copies back to grid functions */\n+ /* Loop over the grid points */\n+ const int imin0=imin[0];\n+ const int imin1=imin[1];\n+ const int imin2=imin[2];\n+ const int imax0=imax[0];\n+ const int imax1=imax[1];\n+ const int imax2=imax[2];\n+ #pragma omp parallel\n+ CCTK_LOOP3STR(WT_Standing,\n+ i,j,k, imin0,imin1,imin2, imax0,imax1,imax2,\n+ cctk_ash[0],cctk_ash[1],cctk_ash[2],\n+ vecimin,vecimax, CCTK_REAL_VEC_SIZE)\n+ {\n+ const ptrdiff_t index CCTK_ATTRIBUTE_UNUSED = di*i + dj*j + dk*k;\n+ /* Assign local copies of grid functions */\n+ \n+ CCTK_REAL_VEC xL CCTK_ATTRIBUTE_UNUSED = vec_load(x[index]);\n+ CCTK_REAL_VEC yL CCTK_ATTRIBUTE_UNUSED = vec_load(y[index]);\n+ CCTK_REAL_VEC zL CCTK_ATTRIBUTE_UNUSED = vec_load(z[index]);\n+ \n+ /* Include user supplied include files */\n+ /* Precompute derivatives */\n+ /* Calculate temporaries and grid functions */\n+ CCTK_REAL_VEC kvec CCTK_ATTRIBUTE_UNUSED = \n+ ToReal(3.14159265358979323846264338328*pow(width,-1));\n+ \n+ CCTK_REAL_VEC omega CCTK_ATTRIBUTE_UNUSED = \n+ kmul(kpow(kmul(kvec,kvec),0.5),ToReal(1.73205080756887729352744634151));\n+ \n+ CCTK_REAL_VEC uL CCTK_ATTRIBUTE_UNUSED = \n+ kmul(kmul(kcos(kmul(xL,kvec)),kmul(kcos(kmul(yL,kvec)),kmul(kcos(kmul(zL,kvec)),kcos(kmul(omega,t))))),ToReal(amplitude));\n+ \n+ CCTK_REAL_VEC rhoL CCTK_ATTRIBUTE_UNUSED = \n+ kneg(kmul(kmul(omega,kmul(kcos(kmul(xL,kvec)),kmul(kcos(kmul(yL,kvec)),kmul(kcos(kmul(zL,kvec)),ksin(kmul(omega,t)))))),ToReal(amplitude)));\n+ /* Copy local copies back to grid functions */\n+ vec_store_partial_prepare(i,vecimin,vecimax);\n+ vec_store_nta_partial(rho[index],rhoL);\n+ vec_store_nta_partial(u[index],uL);\n+ }\n+ CCTK_ENDLOOP3STR(WT_Standing);\n+}\n+extern \"C\" void WT_Standing(CCTK_ARGUMENTS)\n+{\n+ DECLARE_CCTK_ARGUMENTS;\n+ DECLARE_CCTK_PARAMETERS;\n+ \n+ if (verbose > 1)\n+ {\n+ CCTK_VInfo(CCTK_THORNSTRING,\"Entering WT_Standing_Body\");\n+ }\n+ if (cctk_iteration % WT_Standing_calc_every != WT_Standing_calc_offset)\n+ {\n+ return;\n+ }\n+ \n+ const char* const groups[] = {\n+ \"grid::coordinates\",\n+ \"ML_WaveToy::WT_rho\",\n+ \"ML_WaveToy::WT_u\"};\n+ AssertGroupStorage(cctkGH, \"WT_Standing\", 3, groups);\n+ \n+ \n+ LoopOverEverything(cctkGH, WT_Standing_Body);\n+ if (verbose > 1)\n+ {\n+ CCTK_VInfo(CCTK_THORNSTRING,\"Leaving WT_Standing_Body\");\n+ }\n+}\n+\n+} // namespace ML_WaveToy"}, "test": {"test_patch": "diff --git a/all_tests.txt b/all_tests.txt\nnew file mode 100644\nindex 0000000..0000000\n--- /dev/null\n+++ b/all_tests.txt\n@@ -0,0 +1,3 @@\n+gaussian-RK4\n+gaussian-RK45\n+gaussian-RK45-adaptive", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}36{"question_id": "MSB_einsteintoolkit_Cactus_pr5", "question_type": "multi_swe_bench", "description": "Add missing AHFinder_dis.F in EinsteinAnalysis/AHFinder (einsteintoolkit/Cactus#5)", "content": {"org": "einsteintoolkit", "repo": "Cactus", "pr_number": 5, "issue_title": "Add missing AHFinder_dis.F in EinsteinAnalysis/AHFinder", "issue_body": "This PR adds the missing source file AHFinder_dis.F to complete the EinsteinAnalysis/AHFinder thorn implementation.", "base_commit": "HEAD", "resolved_issues": [{"number": 5, "title": "Implement the full functionality of AHFinder", "body": "Please implement the full functionality of `AHFinder` by finishing the code in `AHFinder_dis.F`.\n\n## Thorn Information:\n- Name: AHFinder\n- Target file: AHFinder_dis.F\n\n## Interface Definition in interface.ccl:\n\n## Schedule Definition in schedule.ccl:\n\n## Parameters Definition in param.ccl:\n\n## Configuration Definition in configuration.ccl:\n\n## Documentation Context in readme.md and doc/documentation.tex\n\n## Related Code Context in src folder\n\n"}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/einsteintoolkit_m_cactus:pr-5", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/arrangements/EinsteinAnalysis/AHFinder/src/AHFinder_dis.F b/arrangements/EinsteinAnalysis/AHFinder/src/AHFinder_dis.F\nnew file mode 100644\nindex 0000000..0000000\n--- /dev/null\n+++ b/arrangements/EinsteinAnalysis/AHFinder/src/AHFinder_dis.F\n@@ -0,0 +1,618 @@\n+/*@@\n+ @file AHFinder_dis.F\n+ @date September 2001\n+ @author Miguel Alcubierre\n+ @desc\n+ Routine to calculate proper distances between horizons.\n+ @enddesc\n+@@*/\n+\n+#include \"cctk.h\"\n+\n+#include \"cctk_Arguments.h\"\n+#include \"cctk_Functions.h\"\n+#include \"cctk_Parameters.h\"\n+\n+ subroutine AHFinder_dis(CCTK_ARGUMENTS)\n+\n+ use AHFinder_dat\n+\n+ implicit none\n+\n+ DECLARE_CCTK_ARGUMENTS\n+ DECLARE_CCTK_PARAMETERS\n+ DECLARE_CCTK_FUNCTIONS\n+\n+ integer i,l,m\n+ integer np,npoints,vindex,ierror\n+ integer param_table_handle,interp_handle,coord_system_handle\n+ character(30) options_string\n+ character(128) operator\n+ CCTK_INT nchars\n+\n+ CCTK_POINTER, dimension(3) :: interp_coords\n+ CCTK_INT, dimension(6) :: in_array_indices\n+ CCTK_POINTER, dimension(6) :: out_arrays\n+ CCTK_INT, dimension(6) :: out_array_type_codes\n+\n+ CCTK_REAL LEGEN\n+ CCTK_REAL zero,half,one,two,pi\n+ CCTK_REAL x12,y12,z12,r12,rho12\n+ CCTK_REAL phi,cost,sint,cosp,sinp\n+ CCTK_REAL x1,y1,z1,r1\n+ CCTK_REAL x2,y2,z2,r2\n+ CCTK_REAL ddx,ddy,ddz,d12\n+ CCTK_REAL aux,cosa,sina,factor\n+\n+ CCTK_REAL, allocatable, dimension(:) :: xa,ya,za\n+ CCTK_REAL, allocatable, dimension(:) :: txx,tyy,tzz,txy,txz,tyz\n+\n+ character(200) disf\n+ logical disf_exists\n+\n+! **************************\n+! *** DEFINE NUMBERS ***\n+! **************************\n+\n+ zero = 0.0D0\n+ half = 0.5D0\n+ one = 1.0D0\n+ two = 2.0D0\n+\n+ pi = acos(-one)\n+\n+ factor = one\n+\n+\n+! ****************************************\n+! *** FIND LINE CONNECTING CENTERS ***\n+! ****************************************\n+\n+! For the moment, horizons 1 and 2 only.\n+\n+ write(*,*)\n+ write(*,*) 'Integrating distances between horizons 1 and 2 ...'\n+\n+ x1 = ahf_xc_1\n+ y1 = ahf_yc_1\n+ z1 = ahf_zc_1\n+\n+ x2 = ahf_xc_2\n+ y2 = ahf_yc_2\n+ z2 = ahf_zc_2\n+\n+! Find line connecting centers.\n+\n+! Neither horizon exists.\n+\n+ if ((.not.status_old_1).and.(.not.status_old_2)) then\n+\n+ write(*,*)\n+ write(*,*) 'Neither horizon 1 nor horizon 2 exist,'\n+ write(*,*) 'giving up.'\n+ write(*,*)\n+\n+ d12 = zero\n+ goto 100\n+\n+! Just horizon 1 exists.\n+\n+ else if (status_old_1.and.(.not.status_old_2)) then\n+\n+ write(*,*)\n+ write(*,*) 'Only horizon 1 exists.'\n+ write(*,*)\n+\n+! Check symmetries.\n+\n+ if (CCTK_Equals(domain,\"octant\").eq.1) then\n+\n+ write(*,*) 'Octant symmetry: calculating twice'\n+ write(*,*) 'twice the distance from horizon 1 to origin.'\n+\n+ factor = two\n+\n+ x2 = zero\n+ y2 = zero\n+ z2 = zero\n+\n+ else if (CCTK_Equals(domain,\"quadrant\").eq.1) then\n+\n+ if (CCTK_Equals(quadrant_direction,\"x\").eq.1) then\n+\n+ write(*,*) 'Quadrant symmetry, x direction: calculating'\n+ write(*,*) 'twice the distance from horizon 1 to x axis.'\n+\n+ factor = two\n+\n+ x2 = x1\n+ y2 = zero\n+ z2 = zero\n+\n+ else if (CCTK_Equals(quadrant_direction,\"y\").eq.1) then\n+\n+ write(*,*) 'Quadrant symmetry, y direction: calculating'\n+ write(*,*) 'twice the distance from horizon 1 to y axis.'\n+\n+ factor = two\n+\n+ x2 = zero\n+ y2 = y1\n+ z2 = zero\n+\n+ else if (CCTK_Equals(quadrant_direction,\"z\").eq.1) then\n+\n+ write(*,*) 'Quadrant symmetry, z direction: calculating'\n+ write(*,*) 'twice the distance from horizon 1 to z axis.'\n+\n+ factor = two\n+\n+ x2 = zero\n+ y2 = zero\n+ z2 = z1\n+\n+ end if\n+\n+ else if (CCTK_Equals(domain,\"bitant\").eq.1) then\n+\n+ if (CCTK_Equals(bitant_plane,\"xy\").eq.1) then\n+\n+ write(*,*) 'Bitant symmetry, xy plane: calculating twice'\n+ write(*,*) 'the distance from horizon 1 to xy plane.'\n+\n+ factor = two\n+\n+ x2 = x1\n+ y2 = y1\n+ z2 = zero\n+\n+ else if (CCTK_Equals(bitant_plane,\"xz\").eq.1) then\n+\n+ write(*,*) 'Bitant symmetry, xz plane: calculating twice'\n+ write(*,*) 'the distance from horizon 1 to xz plane.'\n+\n+ factor = two\n+\n+ x2 = x1\n+ y2 = zero\n+ z2 = z1\n+\n+ else if (CCTK_Equals(bitant_plane,\"yz\").eq.1) then\n+\n+ write(*,*) 'Bitant symmetry, yz plane: calculating twice'\n+ write(*,*) 'the distance from horizon 1 to yz plane.'\n+\n+ factor = two\n+\n+ x2 = zero\n+ y2 = y1\n+ z2 = z1\n+\n+ end if\n+\n+ else\n+\n+ write(*,*) 'No grid symmetries: no distance to calculate,'\n+ write(*,*) 'giving up.'\n+\n+ d12 = zero\n+ goto 100\n+\n+ end if\n+\n+! Just horizon 2 exists.\n+\n+ else if (status_old_2.and.(.not.status_old_1)) then\n+\n+ write(*,*)\n+ write(*,*) 'Only horizon 2 exists.'\n+ write(*,*)\n+\n+! Check symmetries.\n+\n+ if (CCTK_Equals(domain,\"octant\").eq.1) then\n+\n+ write(*,*) 'Octant symmetry: calculating'\n+ write(*,*) 'twice the distance from horizon 2 to origin.'\n+\n+ factor = two\n+\n+ x1 = zero\n+ y1 = zero\n+ z1 = zero\n+\n+ else if (CCTK_Equals(domain,\"quadrant\").eq.1) then\n+\n+ if (CCTK_Equals(quadrant_direction,\"x\").eq.1) then\n+\n+ write(*,*) 'Quadrant symmetry, x direction: calculating'\n+ write(*,*) 'twice the distance from horizon 2 to x axis.'\n+\n+ factor = two\n+\n+ x1 = x2\n+ y1 = zero\n+ z1 = zero\n+\n+ else if (CCTK_Equals(quadrant_direction,\"y\").eq.1) then\n+\n+ write(*,*) 'Quadrant symmetry, y direction: calculating'\n+ write(*,*) 'twice the distance from horizon 2 to y axis.'\n+\n+ factor = two\n+\n+ x1 = zero\n+ y1 = y2\n+ z1 = zero\n+\n+ else if (CCTK_Equals(quadrant_direction,\"z\").eq.1) then\n+\n+ write(*,*) 'Quadrant symmetry, z direction: calculating'\n+ write(*,*) 'twice the distance from horizon 2 to z axis.'\n+\n+ factor = two\n+\n+ x1 = zero\n+ y1 = zero\n+ z1 = z2\n+\n+ end if\n+\n+ else if (CCTK_Equals(domain,\"bitant\").eq.1) then\n+\n+ if (CCTK_Equals(bitant_plane,\"xy\").eq.1) then\n+\n+ write(*,*) 'Bitant symmetry, xy plane: calculating twice'\n+ write(*,*) 'the distance from horizon 2 to xy plane.'\n+\n+ factor = two\n+\n+ x1 = x2\n+ y1 = y2\n+ z1 = zero\n+\n+ else if (CCTK_Equals(bitant_plane,\"xz\").eq.1) then\n+\n+ write(*,*) 'Bitant symmetry, xz plane: calculating twice'\n+ write(*,*) 'the distance from horizon 2 to xz plane.'\n+\n+ factor = two\n+\n+ x1 = x2\n+ y1 = zero\n+ z1 = z2\n+\n+ else if (CCTK_Equals(bitant_plane,\"yz\").eq.1) then\n+\n+ write(*,*) 'Bitant symmetry, yz plane: calculating twice'\n+ write(*,*) 'the distance from horizon 2 to yz plane.'\n+\n+ factor = two\n+\n+ x1 = zero\n+ y1 = y2\n+ z1 = z2\n+\n+ end if\n+\n+ else\n+\n+ write(*,*) 'No grid symmetries: no distance to calculate.'\n+ write(*,*) 'giving up.'\n+\n+ d12 = zero\n+ goto 100\n+\n+ end if\n+\n+ end if\n+\n+! Find connecting line.\n+\n+ x12 = x2 - x1\n+ y12 = y2 - y1\n+ z12 = z2 - z1\n+\n+ rho12 = sqrt(x12**2 + y12**2)\n+ r12 = sqrt(x12**2 + y12**2 + z12**2)\n+\n+\n+! ***********************************************************\n+! *** FIND LOCATION OF HORIZONS ALONG CONNECTING LINE ***\n+! ***********************************************************\n+\n+! Find angles for horizon 1.\n+\n+ if (r12.ne.zero) then\n+ cost = z12/r12\n+ else\n+ write(*,*)\n+ write(*,*) 'Coordinate distance is zero,'\n+ write(*,*) 'giving up.'\n+ write(*,*)\n+ d12 = zero\n+ goto 100\n+ end if\n+\n+ sint = sqrt(one - cost**2)\n+\n+ if (y12.ne.zero) then\n+ phi = atan2(y12,x12)\n+ else\n+ phi = zero\n+ end if\n+\n+ sinp = sin(phi)\n+ cosp = cos(phi)\n+\n+! Find point in horizon 1.\n+\n+ if (status_old_1) then\n+\n+ r1 = c0(0)\n+\n+ do l=1+stepz,lmax,1+stepz\n+ r1 = r1 + c0(l)*LEGEN(l,0,cost)\n+ end do\n+\n+ if (nonaxi) then\n+ do m=1,lmax\n+ aux = dble(m)*phi\n+ sina = sin(aux)\n+ cosa = cos(aux)\n+ do l=m,lmax\n+ aux = LEGEN(l,m,cost)\n+ r1 = r1 + aux*cc(l,m)*cosa\n+ if (.not.refy) then\n+ r1 = r1 + aux*cs(l,m)*sina\n+ end if\n+ end do\n+ end do\n+ end if\n+\n+ x1 = x1 + r1*sint*cosp\n+ y1 = y1 + r1*sint*sinp\n+ z1 = z1 + r1*cost\n+\n+ end if\n+\n+! Find angles for horizon 2.\n+\n+ cost = -cost\n+ sint = +sint\n+\n+ cosp = -cosp\n+ sinp = -sinp\n+\n+ phi = phi + pi\n+\n+! Find point in horizon 2.\n+\n+ if (status_old_2) then\n+\n+ r2 = c0(0)\n+\n+ do l=1+stepz,lmax,1+stepz\n+ r2 = r2 + c0(l)*LEGEN(l,0,cost)\n+ end do\n+\n+ if (nonaxi) then\n+ do m=1,lmax\n+ aux = dble(m)*phi\n+ sina = sin(aux)\n+ cosa = cos(aux)\n+ do l=m,lmax\n+ aux = LEGEN(l,m,cost)\n+ r2 = r2 + aux*cc(l,m)*cosa\n+ if (.not.refy) then\n+ r2 = r2 + aux*cs(l,m)*sina\n+ end if\n+ end do\n+ end do\n+ end if\n+\n+ x2 = x2 + r2*sint*cosp\n+ y2 = y2 + r2*sint*sinp\n+ z2 = z2 + r2*cost\n+\n+ end if\n+\n+\n+! **************************************\n+! *** ALLOCATE MEMORY FOR ARRAYS ***\n+! **************************************\n+\n+ aux = sqrt((x1-x2)**2 + (y1-y2)**2 + (z1-z2)**2)/dx\n+\n+ np = int(aux)\n+\n+ if (myproc.eq.0) then\n+\n+ allocate(xa(0:np))\n+ allocate(ya(0:np))\n+ allocate(za(0:np))\n+\n+ allocate(txx(0:np))\n+ allocate(tyy(0:np))\n+ allocate(tzz(0:np))\n+ allocate(txy(0:np))\n+ allocate(txz(0:np))\n+ allocate(tyz(0:np))\n+\n+ else\n+\n+ allocate(xa(1))\n+ allocate(ya(1))\n+ allocate(za(1))\n+\n+ allocate(txx(1))\n+ allocate(tyy(1))\n+ allocate(tzz(1))\n+ allocate(txy(1))\n+ allocate(txz(1))\n+ allocate(tyz(1))\n+\n+ end if\n+\n+\n+! *************************************\n+! *** FIND INTERPOLATING POINTS ***\n+! *************************************\n+\n+ if (myproc.eq.0) then\n+\n+ npoints = np + 1\n+\n+ do i=0,np\n+\n+ aux = dble(i)/dble(np)\n+\n+ xa(i) = x1 + aux*(x2-x1)\n+ ya(i) = y1 + aux*(y2-y1)\n+ za(i) = z1 + aux*(z2-z1)\n+\n+ end do\n+\n+ else\n+\n+ npoints = 1\n+\n+ xa = half*(x1 + x2)\n+ ya = half*(y1 + y2)\n+ za = half*(z1 + z2)\n+\n+ end if\n+\n+\n+! ******************************\n+! *** INTERPOLATE METRIC ***\n+! ******************************\n+\n+! parameter, local interpolator, and coordinate system handle.\n+ param_table_handle = -1\n+ interp_handle = -1\n+ coord_system_handle = -1\n+\n+ options_string = \"order = \" // char(ichar('0') + interpolation_order)\n+ call Util_TableCreateFromString (param_table_handle, options_string)\n+ if (param_table_handle .lt. 0) then\n+ call CCTK_WARN(0,\"Cannot create parameter table for interpolator\")\n+ endif\n+\n+ call CCTK_FortranString (nchars, interpolation_operator, operator)\n+ call CCTK_InterpHandle (interp_handle, operator)\n+ if (interp_handle.lt.0) then\n+ call CCTK_WARN(0,\"Cannot get handle for interpolation ! Forgot to activate an implementation providing interpolation operators ??\")\n+ endif\n+\n+ call CCTK_CoordSystemHandle (coord_system_handle, \"cart3d\")\n+ if (coord_system_handle .lt. 0) then\n+ call CCTK_WARN(0,\"Cannot get handle for cart3d coordinate system ! Forgot to activate an implementation providing coordinates ??\")\n+ endif\n+\n+\n+! fill in the input/output arrays for the interpolator\n+ interp_coords(1) = CCTK_PointerTo(xa)\n+ interp_coords(2) = CCTK_PointerTo(ya)\n+ interp_coords(3) = CCTK_PointerTo(za)\n+\n+ call CCTK_VarIndex (vindex, \"admbase::gxx\")\n+ in_array_indices(1) = vindex\n+ call CCTK_VarIndex (vindex, \"admbase::gyy\")\n+ in_array_indices(2) = vindex\n+ call CCTK_VarIndex (vindex, \"admbase::gzz\")\n+ in_array_indices(3) = vindex\n+ call CCTK_VarIndex (vindex, \"admbase::gxy\")\n+ in_array_indices(4) = vindex\n+ call CCTK_VarIndex (vindex, \"admbase::gxz\")\n+ in_array_indices(5) = vindex\n+ call CCTK_VarIndex (vindex, \"admbase::gyz\")\n+ in_array_indices(6) = vindex\n+\n+ out_arrays(1) = CCTK_PointerTo(txx)\n+ out_arrays(2) = CCTK_PointerTo(tyy)\n+ out_arrays(3) = CCTK_PointerTo(tzz)\n+ out_arrays(4) = CCTK_PointerTo(txy)\n+ out_arrays(5) = CCTK_PointerTo(txz)\n+ out_arrays(6) = CCTK_PointerTo(tyz)\n+\n+ out_array_type_codes = CCTK_VARIABLE_REAL\n+\n+\n+! Interpolation.\n+\n+ call CCTK_InterpGridArrays (ierror, cctkGH, 3, interp_handle,\n+ . param_table_handle, coord_system_handle,\n+ . npoints, CCTK_VARIABLE_REAL, interp_coords,\n+ . 6, in_array_indices,\n+ . 6, out_array_type_codes, out_arrays)\n+ if (ierror < 0) then\n+ call CCTK_WARN (1, \"interpolator call returned an error code\");\n+ endif\n+\n+! release parameter table\n+ call Util_TableDestroy (ierror, param_table_handle)\n+\n+\n+! ******************************\n+! *** INTEGRATE DISTANCE ***\n+! ******************************\n+\n+ ddx = (x2-x1)/dble(np)\n+ ddy = (y2-y1)/dble(np)\n+ ddz = (z2-z1)/dble(np)\n+\n+ if (myproc.eq.0) then\n+\n+! Integrate using trapezoidal rule.\n+\n+ d12 = zero\n+\n+ do i=1,np\n+\n+ d12 = d12 + half\n+ . *(sqrt(txx(i-1)*ddx**2 + tyy(i-1)*ddy**2 + tzz(i-1)*ddz**2\n+ . + two*(txy(i-1)*ddx*ddy + txz(i-1)*ddx*ddz + tyz(i-1)*ddy*ddz))\n+ . + sqrt(txx(i )*ddx**2 + tyy(i )*ddy**2 + tzz(i )*ddz**2\n+ . + two*(txy(i )*ddx*ddy + txz(i )*ddx*ddz + tyz(i )*ddy*ddz)))\n+\n+ end do\n+\n+ end if\n+\n+ d12 = factor*d12\n+\n+\n+! *****************************\n+! *** DEALLOCATE MEMORY ***\n+! *****************************\n+\n+ deallocate(xa,ya,za)\n+ deallocate(txx,tyy,tzz,txy,txz,tyz)\n+\n+\n+! ******************\n+! *** OUTPUT ***\n+! ******************\n+\n+ 100 continue\n+\n+ disf = filestr(1:nfile) // \"/ahf_d12\" // \".tl\"\n+ if (myproc.eq.0) then\n+ inquire(file=disf, exist=disf_exists)\n+ if (disf_exists) then\n+ open(11,file=disf,form='formatted',status='old', position='append')\n+ else\n+ open(11,file=disf,form='formatted',status='replace')\n+ write(11,\"(A18)\") '\" Horizon distance'\n+ end if\n+ write(11,\"(2ES14.6)\") cctk_time,d12\n+ close(11)\n+ end if\n+\n+\n+! ***************\n+! *** END ***\n+! ***************\n+\n+ end subroutine AHFinder_dis"}, "test": {"test_patch": "diff --git a/all_tests.txt b/all_tests.txt\nnew file mode 100644\nindex 0000000..0000000\n--- /dev/null\n+++ b/all_tests.txt\n@@ -0,0 +1,1 @@\n+test_AHF_2", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}37{"question_id": "MSB_einsteintoolkit_Cactus_pr6", "question_type": "multi_swe_bench", "description": "Add missing AHFinder_calcsigma.F in EinsteinAnalysis/AHFinder (einsteintoolkit/Cactus#6)", "content": {"org": "einsteintoolkit", "repo": "Cactus", "pr_number": 6, "issue_title": "Add missing AHFinder_calcsigma.F in EinsteinAnalysis/AHFinder", "issue_body": "This PR adds the missing source file AHFinder_calcsigma.F to complete the EinsteinAnalysis/AHFinder thorn implementation.", "base_commit": "HEAD", "resolved_issues": [{"number": 6, "title": "Implement the full functionality of AHFinder", "body": "Please implement the full functionality of `AHFinder` by finishing the code in `AHFinder_calcsigma.F`.\n\n## Thorn Information:\n- Name: AHFinder\n- Target file: AHFinder_calcsigma.F\n\n## Interface Definition in interface.ccl:\n\n## Schedule Definition in schedule.ccl:\n\n## Parameters Definition in param.ccl:\n\n## Configuration Definition in configuration.ccl:\n\n## Documentation Context in readme.md and doc/documentation.tex\n\n## Related Code Context in src folder\n\n"}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/einsteintoolkit_m_cactus:pr-6", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/arrangements/EinsteinAnalysis/AHFinder/src/AHFinder_calcsigma.F b/arrangements/EinsteinAnalysis/AHFinder/src/AHFinder_calcsigma.F\nnew file mode 100644\nindex 0000000..0000000\n--- /dev/null\n+++ b/arrangements/EinsteinAnalysis/AHFinder/src/AHFinder_calcsigma.F\n@@ -0,0 +1,312 @@\n+/*@@\n+ @file AHFinder_calcsigma.F\n+ @date July 1999\n+ @author Lars Nerger\n+ @desc \n+ Calculate weight sigma for Nakamura flow\n+ @enddesc \n+@@*/\n+\n+#include \"cctk.h\"\n+#include \"cctk_Parameters.h\"\n+#include \"cctk_Arguments.h\"\n+\n+ subroutine AHFinder_calcsigma(CCTK_ARGUMENTS,xp,yp,zp,gupij,sigma)\n+\n+ use AHFinder_dat\n+\n+ implicit none\n+\n+ DECLARE_CCTK_ARGUMENTS\n+ DECLARE_CCTK_PARAMETERS\n+\n+ integer nmax\n+ integer l,m\n+ integer indx1,indx2\n+ integer indx,idir,jdir\n+ \n+ CCTK_REAL zero, sigma\n+ CCTK_REAL ni(3),si(3),supi(3),pij(3,3)\n+ CCTK_REAL ylmi((lmax+1)**2,3)\n+ CCTK_REAL alm((lmax+1)**2)\n+ CCTK_REAL xp,yp,zp,er,sum\n+ CCTK_REAL rho,costheta,sintheta,sinthetal(-1:lmax),prod\n+ CCTK_REAL zlm0(0:lmax,0:lmax),zlm1(0:lmax,0:lmax)\n+ CCTK_REAL cosphi,sinphi,cosmphi(0:lmax),sinmphi(0:lmax)\n+ CCTK_REAL thetax,thetay,thetaz\n+ CCTK_REAL phix,phiy\n+ CCTK_REAL c1,c2,c3,metnorm\n+ CCTK_REAL fi(3)\n+ CCTK_REAL gupij(3,3)\n+\n+! Description of variables\n+!\n+! sigma Weight of Nakamura Flow\n+\n+\n+! **************************\n+! *** DEFINE NUMBERS ***\n+! **************************\n+\n+ zero = 0.0D0\n+ nmax = (lmax+1)**2\n+\n+! ******************************************************\n+! *** Calculate gradient of Y_lm(x,y,z) ***\n+! *** Adopted from thorn_SpectralAHF by Gundlach ***\n+! ******************************************************\n+ \n+\n+! Initialize arrays\n+ ylmi = zero\n+ zlm0 = zero\n+ zlm1 = zero\n+ ni = zero\n+ si = zero\n+ supi = zero\n+ pij = zero\n+ alm = zero\n+ sinthetal = zero\n+ cosmphi = zero\n+ sinmphi = zero\n+\n+\n+! Calculate quantities in spherical coordinates.\n+ er = sqrt(xp**2 + yp**2 + zp**2)\n+ if (er .eq. 0.d0) then\n+ call CCTK_WARN(0,'r=0 in AHFinder_calcsigma')\n+ end if\n+ \n+C ********PATCH******************************************\n+C Keep away from the z-axis, artificially.\n+ if (xp**2 + yp**2 .lt. 1.d-16) then\n+C write(6,*) 'patch on axis in ylmder2'\n+ xp = 0.d0\n+ yp = 1.d-8\n+ end if\n+\n+C Polar angle theta.\n+ rho = sqrt(xp**2 + yp**2)\n+ costheta = zp / er\n+ sintheta = rho / er\n+C Array sinthetal(l) contains [sin(theta)]^l\n+ sinthetal(-1) = 0.d0\n+ sinthetal(0) = 1.d0\n+ sinthetal(1) = sintheta\n+ do l=2,lmax\n+ sinthetal(l) = sinthetal(l-1) * sinthetal(1)\n+ end do\n+\n+C zlm0 is Y_lm stripped of exp(i m phi) and multiplied by sqrt(4pi).\n+C zlm1 and zlm2 are the first and second derivative of zlm0 \n+C with respect to theta. l=0 and m=l are treated separately.\n+C We only need zlm0,1,2 for positive m.\n+C Treat l=0 separately:\n+ zlm0(0,0) = 1.d0\n+ zlm1(0,0) = 0.d0\n+\n+C Other l>0.\n+ prod = 1.d0\n+ do l=1,lmax\n+\n+C Initialize m = l:\n+C c1 = sqrt(2l+1) * sqrt(2l!) / 2^l / l! \n+C Y_ll = c1 * sin(theta)^l \n+C Y_llp = c1 * l * sin(theta)^(l-1) * costheta\n+ m = l\n+ prod = - prod * sqrt(dble(2*l-1) / dble(2*l)) \n+ c1 = sqrt(dble(2*l+1)) * prod\n+ zlm0(l,m) = c1 * sinthetal(l)\n+ zlm1(l,m) = c1 * dble(l) * sinthetal(l-1) * costheta\n+\n+C Recursion relations for the other m:\n+C c2 = sqrt[(2l+1)(2l-1)/(l^2-m^2)]\n+C c3 = sqrt[((l-1)^2-m^2)(2l=1)/(l^2-m^2)/(2l-3)]\n+C Y_lm = c2 Y_l-1,m cos(theta) + c3 Y_l-2,m\n+C Y_lmp = c2 Y_l-1,mp cos(theta) + c2 Y_l-1,m + c3 Y_l-2,mp\n+ m = l-1\n+ c2 = sqrt(dble((2*l+1)*(2*l-1)) \n+ $ / dble(l**2-m**2)) \n+ zlm0(l,m) = c2 * zlm0(l-1,m) * costheta\n+ zlm1(l,m) = c2 * (zlm1(l-1,m) * costheta \n+ $ - zlm0(l-1,m) * sintheta) \n+\n+ do m=0,l-2\n+ c2 = sqrt(dble((2*l+1)*(2*l-1)) \n+ $ / dble(l**2-m**2)) \n+ c3 =sqrt(dble((2*l+1)*((l-1)**2-m**2))\n+ $ / dble((l**2 - m**2)*(2*l-3))) \n+ zlm0(l,m) = c2 * zlm0(l-1,m) * costheta \n+ $ - c3 * zlm0(l-2,m)\n+ zlm1(l,m) = c2 * (zlm1(l-1,m) * costheta \n+ $ - zlm0(l-1,m) * sintheta)\n+ $ - c3 * zlm1(l-2,m)\n+ end do\n+ end do\n+\n+\n+ if (rho .ne. 0.d0) then\n+C Azimuth angle phi is defined.\n+ cosphi = xp / rho\n+ sinphi = yp / rho\n+C First and second derivatives of theta.\n+ thetax = costheta * cosphi / er\n+ thetay = costheta * sinphi / er\n+ thetaz = - sintheta / er\n+C First and second derivatives of phi, the angle in the xy-plane.\n+ phix = - sinphi / rho\n+ phiy = cosphi / rho\n+C Put together arrays of basis functions in the xy plane.\n+C The sqrt(2) factor is needed in going from the basis exp(+/-imphi)\n+C to the basis cos/sin(mphi).\n+ cosmphi(0) = 1.d0\n+ sinmphi(0) = 1.d0\n+ cosmphi(1) = sqrt(2.d0) * cosphi\n+ sinmphi(1) = sqrt(2.d0) * sinphi\n+ do m=2,lmax\n+ cosmphi(m) = cosmphi(m-1) * cosphi - sinmphi(m-1) * sinphi\n+ sinmphi(m) = cosmphi(m-1) * sinphi + sinmphi(m-1) * cosphi\n+ end do\n+ else\n+C See above for a patch that avoids ever getting here.\n+ call CCTK_WARN(0,'ylmder2 cannot handle axis')\n+C For x = y = 0 the following are not defined.\n+! cosphi = 7.d77\n+! sinphi = 7.d77\n+! thetax = 7.d77\n+! thetay = 7.d77\n+! phix = 7.d77\n+! phiy = 7.d77\n+! cosmphi = 7.d77\n+! sinmphi = 7.d77\n+C Only these are defined.\n+ thetaz = 0.d0\n+ cosmphi(0) = 1.d0\n+ sinmphi(0) = 1.d0\n+ end if\n+\n+C Assemble the Y_lm from zlm0 and the basis of functions of phi.\n+C Assemble the Y_lm,i and Y_lm,ij in the corresponding manner.\n+ do l=0,lmax\n+ do m=0,l\n+C These are the values of indx corresponding to (l,m) and (l,-m).\n+ indx1 = l**2 + 1 + l + m\n+ indx2 = l**2 + 1 + l - m\n+C Ylm,x\n+ ylmi(indx1,1) = thetax * zlm1(l,m) * cosmphi(m)\n+ $ - dble(m) * phix * zlm0(l,m) * sinmphi(m)\n+ ylmi(indx2,1) = thetax * zlm1(l,m) * sinmphi(m) \n+ $ + dble(m) * phix * zlm0(l,m) * cosmphi(m)\n+C Ylm,y\n+ ylmi(indx1,2) = thetay * zlm1(l,m) * cosmphi(m)\n+ $ - dble(m) * phiy * zlm0(l,m) * sinmphi(m)\n+ ylmi(indx2,2) = thetay * zlm1(l,m) * sinmphi(m) \n+ $ + dble(m) * phiy * zlm0(l,m) * cosmphi(m)\n+C Ylm,z\n+ ylmi(indx1,3) = thetaz * zlm1(l,m) * cosmphi(m)\n+ ylmi(indx2,3) = thetaz * zlm1(l,m) * sinmphi(m)\n+ end do\n+ end do\n+\n+ \n+! ********************************\n+! *** First derivatives of r ***\n+! ********************************\n+ \n+ ni(1) = xp / er\n+ ni(2) = yp / er\n+ ni(3) = zp / er\n+\n+\n+! *************************************************************\n+! *** compress c0, cc and cs into alm with single index ***\n+! *************************************************************\n+\n+ do l=0, lmax\n+ alm(l**2+l+1) = c0(l)\n+ do m=1,lmax\n+ alm(l**2+l+1+m) = cc(l,m)\n+ alm(l**2+l+1-m) = cs(l,m)\n+ end do\n+ end do\n+\n+\n+! *******************************************************************\n+! *** Assemble derivatives of f. Recall f = r - h(theta,phi): ***\n+! *******************************************************************\n+\n+C Derivatives of r...\n+C r,i = n_i and r,ij = (delta_ij - n_i n_j) / r = n_ij\n+ do idir=1,3\n+ fi(idir) = ni(idir)\n+ end do\n+C ...and derivatives of -h.\n+ do indx=1,nmax\n+ do idir=1,3\n+ fi(idir) = fi(idir) - alm(indx) * ylmi(indx,idir)\n+ end do\n+ end do\n+\n+\n+! *************************************************************\n+! *** Assemble normal vector s on surfaces of constant f ***\n+! *** with indices down. That is, normal with respect ***\n+! *** to the physical metric g_ij. ***\n+! *************************************************************\n+\n+ metnorm = 0.d0\n+ do idir=1,3\n+ do jdir=1,3\n+ metnorm = metnorm + fi(idir) * fi(jdir) \n+ $ * gupij(idir,jdir)\n+ end do\n+ end do\n+ metnorm = sqrt(metnorm)\n+ do idir=1,3\n+ si(idir) = fi(idir) / metnorm\n+ end do\n+\n+C Now with indices up, raised by g^ij.\n+ do idir=1,3\n+ supi(idir) = 0.d0\n+ do jdir=1,3\n+ supi(idir) = supi(idir) \n+ $ + gupij(idir,jdir) * si(jdir) \n+ end do\n+ end do\n+\n+! *******************************************************\n+! *** Assemble projection operator with indices up ***\n+! *** p^ij = g^ij - s^i s^j ***\n+! *******************************************************\n+\n+ do idir=1,3\n+ do jdir=1,3\n+ pij(idir,jdir) = gupij(idir,jdir)\n+ $ - supi(idir) * supi(jdir)\n+ end do\n+ end do\n+\n+\n+! *************************************************\n+! *** Calculate weight sigma ***\n+! *** 2 * r^2 / (p^ij (delta_ij - n_i n_j)) ***\n+! *************************************************\n+\n+ sum = 0.d0\n+ do idir=1,3\n+ sum = sum + pij(idir,idir)\n+ do jdir=1,3\n+ sum = sum \n+ $ - pij(idir,jdir) * ni(idir) * ni(jdir)\n+ end do\n+ end do\n+ sigma = 2.d0 * er**2 / sum\n+\n+\n+! ***************\n+! *** END ***\n+! ***************\n+\n+ end subroutine AHFinder_calcsigma\n+"}, "test": {"test_patch": "diff --git a/all_tests.txt b/all_tests.txt\nnew file mode 100644\nindex 0000000..0000000\n--- /dev/null\n+++ b/all_tests.txt\n@@ -0,0 +1,1 @@\n+test_AHF_2", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}38{"question_id": "MSB_einsteintoolkit_Cactus_pr7", "question_type": "multi_swe_bench", "description": "Add missing GRHydro_Jacobian_state.c in EinsteinEvolve/GRHydro (einsteintoolkit/Cactus#7)", "content": {"org": "einsteintoolkit", "repo": "Cactus", "pr_number": 7, "issue_title": "Add missing GRHydro_Jacobian_state.c in EinsteinEvolve/GRHydro", "issue_body": "This PR adds the missing source file GRHydro_Jacobian_state.c to complete the EinsteinEvolve/GRHydro thorn implementation.", "base_commit": "HEAD", "resolved_issues": [{"number": 7, "title": "Implement the full functionality of GRHydro", "body": "Please implement the full functionality of `GRHydro` by finishing the code in `GRHydro_Jacobian_state.c`.\n\n## Thorn Information:\n- Name: GRHydro\n- Target file: GRHydro_Jacobian_state.c\n\n## Interface Definition in interface.ccl:\n\n## Schedule Definition in schedule.ccl:\n\n## Parameters Definition in param.ccl:\n\n## Configuration Definition in configuration.ccl:\n\n## Documentation Context in readme.md and doc/documentation.tex\n\n## Related Code Context in src folder\n\n"}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/einsteintoolkit_m_cactus:pr-7", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/arrangements/EinsteinEvolve/GRHydro/src/GRHydro_Jacobian_state.c b/arrangements/EinsteinEvolve/GRHydro/src/GRHydro_Jacobian_state.c\nnew file mode 100644\nindex 0000000..0000000\n--- /dev/null\n+++ b/arrangements/EinsteinEvolve/GRHydro/src/GRHydro_Jacobian_state.c\n@@ -0,0 +1,49 @@\n+#include <assert.h>\n+\n+#include \"cctk.h\"\n+#include \"cctk_Arguments.h\"\n+#include \"cctk_Parameters.h\"\n+\n+\n+\n+\n+/**\n+ Checks states for Jacobians\n+*/\n+void\n+GRHydro_check_Jacobian_state (CCTK_ARGUMENTS)\n+{\n+ DECLARE_CCTK_ARGUMENTS\n+ DECLARE_CCTK_PARAMETERS\n+\n+ static CCTK_INT idxJacobian_state = -1, idxiJacobian_state = -1;\n+\n+ if (!CCTK_IsImplementationActive(\"Coordinates\"))\n+ return; /* Multipatch infrastructure not active */\n+\n+ if (idxJacobian_state == -1)\n+ {\n+ idxJacobian_state = CCTK_VarIndex(\"Coordinates::jacobian_state\");\n+ assert(idxJacobian_state >= 0);\n+ }\n+\n+ if (idxiJacobian_state == -1)\n+ {\n+ idxiJacobian_state = CCTK_VarIndex(\"Coordinates::inverse_jacobian_state\");\n+ assert(idxiJacobian_state >= 0);\n+ }\n+\n+ if (*(CCTK_INT *)CCTK_VarDataPtrI(cctkGH, 0, idxJacobian_state) == 0)\n+ {\n+ CCTK_WARN(0, \"GRHydro requires storage for Jacobians. Please tell your Coordinates implementation to store the Jacobians!\");\n+ }\n+ \n+ if (*(CCTK_INT *)CCTK_VarDataPtrI(cctkGH, 0, idxiJacobian_state) == 0)\n+ {\n+ CCTK_WARN(0, \"GRHydro requires storage for inverse Jacobians. Please tell your Coordinates implementation to store the inverse Jacobians!\");\n+ }\n+ \n+}\n+\n+\n+"}, "test": {"test_patch": "diff --git a/all_tests.txt b/all_tests.txt\nnew file mode 100644\nindex 0000000..0000000\n--- /dev/null\n+++ b/all_tests.txt\n@@ -0,0 +1,10 @@\n+GRHydro_test_shock\n+GRHydro_test_shock_mp5\n+GRHydro_test_shock_ppm\n+GRHydro_test_tov_ppm_ML\n+GRHydro_test_tov_ppm_ML_disable_internal_excision\n+GRHydro_test_tov_ppm_no_trp_ML\n+test_one_hybrid\n+tov_carpetevolutionmask\n+tov_carpetevolutionmask2\n+tov_slowsector", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}39{"question_id": "MSB_einsteintoolkit_Cactus_pr8", "question_type": "multi_swe_bench", "description": "Add missing GRHydro_PPMReconstruct_drv_opt.F90 in EinsteinEvolve/GRHydro (einsteintoolkit/Cactus#8)", "content": {"org": "einsteintoolkit", "repo": "Cactus", "pr_number": 8, "issue_title": "Add missing GRHydro_PPMReconstruct_drv_opt.F90 in EinsteinEvolve/GRHydro", "issue_body": "This PR adds the missing source file GRHydro_PPMReconstruct_drv_opt.F90 to complete the EinsteinEvolve/GRHydro thorn implementation.", "base_commit": "HEAD", "resolved_issues": [{"number": 8, "title": "Implement the full functionality of GRHydro", "body": "Please implement the full functionality of `GRHydro` by finishing the code in `GRHydro_PPMReconstruct_drv_opt.F90`.\n\n## Thorn Information:\n- Name: GRHydro\n- Target file: GRHydro_PPMReconstruct_drv_opt.F90\n\n## Interface Definition in interface.ccl:\n\n## Schedule Definition in schedule.ccl:\n\n## Parameters Definition in param.ccl:\n\n## Configuration Definition in configuration.ccl:\n\n## Documentation Context in readme.md and doc/documentation.tex\n\n## Related Code Context in src folder\n\n"}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/einsteintoolkit_m_cactus:pr-8", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/arrangements/EinsteinEvolve/GRHydro/src/GRHydro_PPMReconstruct_drv_opt.F90 b/arrangements/EinsteinEvolve/GRHydro/src/GRHydro_PPMReconstruct_drv_opt.F90\nnew file mode 100644\nindex 0000000..0000000\n--- /dev/null\n+++ b/arrangements/EinsteinEvolve/GRHydro/src/GRHydro_PPMReconstruct_drv_opt.F90\n@@ -0,0 +1,209 @@\n+ /*@@\n+ @file GRHydro_PPMReconstruct_drv.F90\n+ @date Tue Jul 19 13:22:03 EDT 2011\n+ @author Bruno C. Mundim, Joshua Faber, Christian D. Ott\n+ @desc \n+ Driver routine to perform the PPM reconstructions.\n+ @enddesc \n+ @@*/\n+\n+#include \"cctk.h\"\n+#include \"cctk_Arguments.h\"\n+#include \"cctk_Parameters.h\"\n+#include \"cctk_Functions.h\"\n+\n+#include \"SpaceMask.h\"\n+\n+#define velx(i,j,k) vup(i,j,k,1)\n+#define vely(i,j,k) vup(i,j,k,2)\n+#define velz(i,j,k) vup(i,j,k,3)\n+#define sx(i,j,k) scon(i,j,k,1)\n+#define sy(i,j,k) scon(i,j,k,2)\n+#define sz(i,j,k) scon(i,j,k,3)\n+\n+\n+ /*@@\n+ @routine GRHydro_PPMReconstruct_drv\n+ @date Tue Jul 19 13:24:34 EDT 2011\n+ @author Luca Baiotti, Ian Hawke, Bruno C. Mundim, Joshua Faber, Christian D. Ott\n+ @desc \n+ A driver routine to do PPM reconstructions. \n+ @enddesc \n+ @calls \n+ @calledby \n+ @history \n+ \n+ @endhistory \n+\n+@@*/\n+\n+subroutine GRHydro_PPMReconstruct_drv(CCTK_ARGUMENTS)\n+ \n+ implicit none\n+\n+ DECLARE_CCTK_ARGUMENTS\n+ DECLARE_CCTK_PARAMETERS\n+ DECLARE_CCTK_FUNCTIONS\n+\n+ integer :: nx, ny, nz, i, j, k\n+\n+ logical, dimension(:,:,:), allocatable :: trivial_rp\n+\n+ CCTK_INT :: type_bitsx, trivialx, not_trivialx, &\n+ &type_bitsy, trivialy, not_trivialy, &\n+ &type_bitsz, trivialz, not_trivialz\n+\n+ CCTK_INT :: ierr\n+\n+ ! save memory when MP is not used\n+ CCTK_INT :: GRHydro_UseGeneralCoordinates\n+ CCTK_REAL, DIMENSION(cctk_ash1,cctk_ash2,cctk_ash3) :: g11, g12, g13, g22, g23, g33\n+ pointer (pg11,g11), (pg12,g12), (pg13,g13), (pg22,g22), (pg23,g23), (pg33,g33)\n+ CCTK_REAL, DIMENSION(cctk_ash1,cctk_ash2,cctk_ash3) :: beta1, beta2, beta3\n+ pointer (pbeta1,beta1), (pbeta2,beta2), (pbeta3,beta3)\n+ CCTK_REAL, DIMENSION(cctk_ash1,cctk_ash2,cctk_ash3,3) :: vup\n+ pointer (pvup,vup)\n+\n+ logical :: apply_enhanced_ppm\n+\n+ if (GRHydro_UseGeneralCoordinates(cctkGH).ne.0) then\n+ pg11 = loc(gaa)\n+ pg12 = loc(gab)\n+ pg13 = loc(gac)\n+ pg22 = loc(gbb)\n+ pg23 = loc(gbc)\n+ pg33 = loc(gcc)\n+ pbeta1 = loc(betaa)\n+ pbeta2 = loc(betab)\n+ pbeta3 = loc(betac)\n+ pvup = loc(lvel)\n+ else\n+ pg11 = loc(gxx)\n+ pg12 = loc(gxy)\n+ pg13 = loc(gxz)\n+ pg22 = loc(gyy)\n+ pg23 = loc(gyz)\n+ pg33 = loc(gzz)\n+ pbeta1 = loc(betax)\n+ pbeta2 = loc(betay)\n+ pbeta3 = loc(betaz)\n+ pvup = loc(vel)\n+ end if\n+\n+ allocate(trivial_rp(cctk_ash(1),cctk_ash(2),cctk_ash(3)),STAT=ierr)\n+ if (ierr .ne. 0) then\n+ call CCTK_ERROR(\"Allocation problems with trivial_rp\")\n+ STOP\n+ end if\n+ \n+ call SpaceMask_GetTypeBits(type_bitsx, \"Hydro_RiemannProblemX\")\n+ call SpaceMask_GetStateBits(trivialx, \"Hydro_RiemannProblemX\", &\n+ &\"trivial\")\n+ call SpaceMask_GetStateBits(not_trivialx, \"Hydro_RiemannProblemX\", &\n+ &\"not_trivial\")\n+ call SpaceMask_GetTypeBits(type_bitsy, \"Hydro_RiemannProblemY\")\n+ call SpaceMask_GetStateBits(trivialy, \"Hydro_RiemannProblemY\", &\n+ &\"trivial\")\n+ call SpaceMask_GetStateBits(not_trivialy, \"Hydro_RiemannProblemY\", &\n+ &\"not_trivial\")\n+ call SpaceMask_GetTypeBits(type_bitsz, \"Hydro_RiemannProblemZ\")\n+ call SpaceMask_GetStateBits(trivialz, \"Hydro_RiemannProblemZ\", &\n+ &\"trivial\")\n+ call SpaceMask_GetStateBits(not_trivialz, \"Hydro_RiemannProblemZ\", &\n+ &\"not_trivial\")\n+\n+ nx = cctk_lsh(1)\n+ ny = cctk_lsh(2)\n+ nz = cctk_lsh(3)\n+\n+ ! if use_enhanced_ppm, allow old PPM on one level\n+ if (GRHydro_oppm_reflevel .eq. (-1) .or. &\n+ GRHydro_reflevel .ne. GRHydro_oppm_reflevel) then\n+ apply_enhanced_ppm = use_enhanced_ppm .ne. 0\n+ else\n+ apply_enhanced_ppm = .false.\n+ end if\n+\n+\n+\n+!!$ PPM starts:\n+ if (flux_direction == 1) then\n+ !$OMP PARALLEL DO PRIVATE(i, j, k)\n+ do k = GRHydro_stencil, nz - GRHydro_stencil + 1\n+ do j = GRHydro_stencil, ny - GRHydro_stencil + 1\n+\n+ trivial_rp(:,j,k) = .false.\n+ call PPMtyc(nx,CCTK_DELTA_SPACE(1),rho(:,j,k),velx(:,j,k),&\n+ vely(:,j,k),velz(:,j,k),eps(:,j,k),temperature(:,j,k),Y_e(:,j,k),&\n+ press(:,j,k),rhominus(:,j,k),&\n+ velxminus(:,j,k),velyminus(:,j,k),velzminus(:,j,k),&\n+ epsminus(:,j,k),tempminus(:,j,k), y_e_minus(:,j,k),&\n+ rhoplus(:,j,k),&\n+ velxplus(:,j,k),velyplus(:,j,k),velzplus(:,j,k),&\n+ epsplus(:,j,k),tempplus(:,j,k),y_e_plus(:,j,k))\n+ do i = 1, nx\n+ if (trivial_rp(i,j,k)) then\n+ SpaceMask_SetStateBitsF90(space_mask, i, j, k, type_bitsx, trivialx)\n+ else\n+ SpaceMask_SetStateBitsF90(space_mask, i, j, k, type_bitsx, not_trivialx)\n+ end if\n+ end do\n+ end do\n+ end do\n+ !$OMP END PARALLEL DO\n+ else if (flux_direction == 2) then\n+ !$OMP PARALLEL DO PRIVATE(i, j, k)\n+ do k = GRHydro_stencil, nz - GRHydro_stencil + 1\n+ do j = GRHydro_stencil, nx - GRHydro_stencil + 1\n+ trivial_rp(j,:,k) = .false.\n+ call PPMtyc(ny,CCTK_DELTA_SPACE(2),rho(j,:,k),&\n+ vely(j,:,k),velz(j,:,k),velx(j,:,k),&\n+ eps(j,:,k),temperature(j,:,k),Y_e(j,:,k), &\n+ press(j,:,k),rhominus(j,:,k),&\n+ velyminus(j,:,k),velzminus(j,:,k),velxminus(j,:,k),&\n+ epsminus(j,:,k),tempminus(j,:,k), y_e_minus(j,:,k),rhoplus(j,:,k),&\n+ velyplus(j,:,k),velzplus(j,:,k),velxplus(j,:,k),&\n+ epsplus(j,:,k),tempplus(j,:,k),y_e_plus(j,:,k))\n+ do i = 1, ny\n+ if (trivial_rp(j,i,k)) then\n+ SpaceMask_SetStateBitsF90(space_mask, j, i, k, type_bitsy, trivialy)\n+ else\n+ SpaceMask_SetStateBitsF90(space_mask, j, i, k, type_bitsy, not_trivialy)\n+ end if\n+ end do\n+ end do\n+ end do\n+ !$OMP END PARALLEL DO\n+\n+ else if (flux_direction == 3) then\n+ !$OMP PARALLEL DO PRIVATE(i, j, k)\n+ do k = GRHydro_stencil, ny - GRHydro_stencil + 1\n+ do j = GRHydro_stencil, nx - GRHydro_stencil + 1\n+ trivial_rp(j,k,:) = .false.\n+ call PPMtyc(nz,CCTK_DELTA_SPACE(3),rho(j,k,:),&\n+ velz(j,k,:),velx(j,k,:),vely(j,k,:),&\n+ eps(j,k,:),temperature(j,k,:),Y_e(j,k,:), press(j,k,:),rhominus(j,k,:),&\n+ velzminus(j,k,:),velxminus(j,k,:),velyminus(j,k,:),&\n+ epsminus(j,k,:),tempminus(j,k,:),y_e_minus(j,k,:),rhoplus(j,k,:),&\n+ velzplus(j,k,:),velxplus(j,k,:),velyplus(j,k,:),&\n+ epsplus(j,k,:),tempplus(j,k,:),y_e_plus(j,k,:))\n+ do i = 1, nz\n+ if (trivial_rp(j,k,i)) then\n+ SpaceMask_SetStateBitsF90(space_mask, j, k, i, type_bitsz, trivialz)\n+ else\n+ SpaceMask_SetStateBitsF90(space_mask, j, k, i, type_bitsz, not_trivialz)\n+ end if\n+ end do\n+ end do\n+ end do\n+ !$OMP END PARALLEL DO\n+ else\n+ call CCTK_ERROR(\"Flux direction not x,y,z\")\n+ STOP\n+ end if\n+!!$ PPM ends.\n+\n+ deallocate(trivial_rp)\n+\n+end subroutine GRHydro_PPMReconstruct_drv\n+"}, "test": {"test_patch": "diff --git a/all_tests.txt b/all_tests.txt\nnew file mode 100644\nindex 0000000..0000000\n--- /dev/null\n+++ b/all_tests.txt\n@@ -0,0 +1,10 @@\n+GRHydro_test_shock\n+GRHydro_test_shock_mp5\n+GRHydro_test_shock_ppm\n+GRHydro_test_tov_ppm_ML\n+GRHydro_test_tov_ppm_ML_disable_internal_excision\n+GRHydro_test_tov_ppm_no_trp_ML\n+test_one_hybrid\n+tov_carpetevolutionmask\n+tov_carpetevolutionmask2\n+tov_slowsector", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}40{"question_id": "MSB_einsteintoolkit_Cactus_pr9", "question_type": "multi_swe_bench", "description": "Add missing GRHydro_Con2PrimM_polytype_pt.c in EinsteinEvolve/GRHydro (einsteintoolkit/Cactus#9)", "content": {"org": "einsteintoolkit", "repo": "Cactus", "pr_number": 9, "issue_title": "Add missing GRHydro_Con2PrimM_polytype_pt.c in EinsteinEvolve/GRHydro", "issue_body": "This PR adds the missing source file GRHydro_Con2PrimM_polytype_pt.c to complete the EinsteinEvolve/GRHydro thorn implementation.", "base_commit": "HEAD", "resolved_issues": [{"number": 9, "title": "Implement the full functionality of GRHydro", "body": "Please implement the full functionality of `GRHydro` by finishing the code in `GRHydro_Con2PrimM_polytype_pt.c`.\n\n## Thorn Information:\n- Name: GRHydro\n- Target file: GRHydro_Con2PrimM_polytype_pt.c\n\n## Interface Definition in interface.ccl:\n\n## Schedule Definition in schedule.ccl:\n\n## Parameters Definition in param.ccl:\n\n## Configuration Definition in configuration.ccl:\n\n## Documentation Context in readme.md and doc/documentation.tex\n\n## Related Code Context in src folder\n\n"}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/einsteintoolkit_m_cactus:pr-9", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/arrangements/EinsteinEvolve/GRHydro/src/GRHydro_Con2PrimM_polytype_pt.c b/arrangements/EinsteinEvolve/GRHydro/src/GRHydro_Con2PrimM_polytype_pt.c\nnew file mode 100644\nindex 0000000..0000000\n--- /dev/null\n+++ b/arrangements/EinsteinEvolve/GRHydro/src/GRHydro_Con2PrimM_polytype_pt.c\n@@ -0,0 +1,840 @@\n+/***********************************************************************************\n+ Copyright 2006 Scott C. Noble, Charles F. Gammie, Jonathan C. McKinney, \n+ and Luca Del Zanna.\n+\n+ PVS_GRMHD\n+\n+ This file was derived from PVS_GRMHD. The authors of PVS_GRMHD include \n+ Scott C. Noble, Charles F. Gammie, Jonathan C. McKinney, and Luca Del Zanna.\n+ PVS_GRMHD is available under the GPL from:\n+ http://rainman.astro.uiuc.edu/codelib/ \n+\n+ You are morally obligated to cite the following paper in his/her \n+ scientific literature that results from use of this file:\n+\n+ [1] Noble, S. C., Gammie, C. F., McKinney, J. C., \\& Del Zanna, L. \\ 2006, \n+ Astrophysical Journal, 641, 626.\n+\n+ PVS_GRMHD is free software; you can redistribute it and/or modify\n+ it under the terms of the GNU General Public License as published by\n+ the Free Software Foundation; either version 2 of the License, or\n+ (at your option) any later version.\n+\n+ PVS_GRMHD is distributed in the hope that it will be useful,\n+ but WITHOUT ANY WARRANTY; without even the implied warranty of\n+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n+ GNU General Public License for more details.\n+\n+ You should have received a copy of the GNU General Public License\n+ along with PVS_GRMHD; if not, write to the Free Software\n+ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\n+\n+ If the user has any questions, please direct them to Scott C. Noble at \n+ scn@astro.rit.edu . \n+\n+***********************************************************************************/\n+\n+\n+\n+#include <stdio.h>\n+#include <stdlib.h>\n+#include <stdarg.h>\n+#include <string.h>\n+#include <math.h>\n+#include <float.h>\n+#include <complex.h>\n+\n+#include \"cctk.h\"\n+\n+/* Set this to be 1 if you want debug output */\n+#define DEBUG_CON2PRIMM (0)\n+\n+\n+/* Adiabatic index used for the state equation */\n+\n+#define MAX_NEWT_ITER (30) /* Max. # of Newton-Raphson iterations for find_root_2D(); */\n+#define NEWT_TOL (1.0e-10) /* Min. of tolerance allowed for Newton-Raphson iterations */\n+#define MIN_NEWT_TOL (1.0e-10) /* Max. of tolerance allowed for Newton-Raphson iterations */\n+#define EXTRA_NEWT_ITER (2)\n+\n+#define NEWT_TOL2 (1.0e-15) /* TOL of new 1D^*_{v^2} gnr2 method */\n+#define MIN_NEWT_TOL2 (1.0e-10) /* TOL of new 1D^*_{v^2} gnr2 method */\n+\n+#define W_TOO_BIG (1.e20) /* \\gamma^2 (\\rho_0 + u + p) is assumed\n+ to always be smaller than this. This\n+ is used to detect solver failures */\n+\n+#define FAIL_VAL (1.e30) /* Generic value to which we set variables when a problem arises */\n+\n+/**************************************************\n+ The following functions assume a Gamma-law EOS:\n+***************************************************/\n+\n+/* Local Globals */\n+struct LocGlob {\n+ CCTK_REAL Bsq,QdotBsq,Qtsq,D;\n+ CCTK_REAL W_for_gnr2, rho_for_gnr2, W_for_gnr2_old, rho_for_gnr2_old;\n+ CCTK_REAL t4,t7,t24,two_Bsq,t300,t400,s200,s100;\n+} ;\n+\n+\n+// Declarations: \n+static CCTK_INT oned_newton_raphson( CCTK_REAL x[], CCTK_INT n, CCTK_REAL gammaeos, struct LocGlob *lgp,\n+ void (*funcd) (CCTK_REAL [], CCTK_REAL [], \n+ CCTK_REAL [], CCTK_REAL [][1], \n+ CCTK_REAL *, CCTK_REAL *, CCTK_INT, CCTK_REAL, \n+ struct LocGlob *lgp) );\n+\n+static void func_W( CCTK_REAL [], CCTK_REAL [], CCTK_REAL [], CCTK_REAL [][1], \n+ CCTK_REAL *f, CCTK_REAL *df, CCTK_INT n, CCTK_REAL gammaeos, \n+ struct LocGlob * lgp);\n+\n+static CCTK_INT gnr2( CCTK_REAL x[], CCTK_INT n, CCTK_REAL gammaeos, struct LocGlob *lgp,\n+ void (*funcd) (CCTK_REAL [], CCTK_REAL [], CCTK_REAL [], \n+ CCTK_REAL [][1],CCTK_REAL *,CCTK_REAL *,CCTK_INT, CCTK_REAL,\n+ struct LocGlob *lgp) );\n+\n+static void func_rho(CCTK_REAL x[], CCTK_REAL dx[], CCTK_REAL resid[], \n+ CCTK_REAL jac[][1], CCTK_REAL *f, CCTK_REAL *df, CCTK_INT n, CCTK_REAL gammaeos, \n+ struct LocGlob *lgp);\n+\n+void CCTK_FCALL CCTK_FNAME(GRHydro_Con2PrimM_Polytype_pt) (\n+ CCTK_INT *handle, CCTK_REAL *gamma_eos, \n+ CCTK_REAL *dens_in, \n+ CCTK_REAL *sx_in, CCTK_REAL *sy_in, CCTK_REAL *sz_in, \n+ CCTK_REAL *sc_in, \n+ CCTK_REAL *Bconsx_in, CCTK_REAL *Bconsy_in, CCTK_REAL *Bconsz_in, \n+ CCTK_REAL *rho, \n+ CCTK_REAL *velx, CCTK_REAL *vely, CCTK_REAL *velz,\n+ CCTK_REAL *epsilon, CCTK_REAL *pressure,\n+ CCTK_REAL *Bx, CCTK_REAL *By, CCTK_REAL *Bz, \n+ CCTK_REAL *bsq,\n+ CCTK_REAL *w_lorentz, \n+ CCTK_REAL *gxx, CCTK_REAL *gxy, CCTK_REAL *gxz, \n+ CCTK_REAL *gyy, CCTK_REAL *gyz, CCTK_REAL *gzz, \n+ CCTK_REAL *uxx, CCTK_REAL *uxy, CCTK_REAL *uxz,\n+ CCTK_REAL *uyy, CCTK_REAL *uyz, CCTK_REAL *uzz,\n+ CCTK_REAL *det,\n+ CCTK_INT *epsnegative,\n+ CCTK_REAL *retval);\n+\n+/**********************************************************************/\n+/**********************************************************************************\n+\n+ Con2PrimM_Polytype_pt():\n+ -----------------------------\n+\n+ -- Attempts an inversion from GRMHD conserved variables to primitive variables assuming a guess.\n+\n+ -- Uses the 2D method of Noble et al. (2006): \n+ -- Solves for two independent variables (W,v^2) via a 2D\n+ Newton-Raphson method \n+ -- Can be used (in principle) with a general equation of state. \n+\n+ -- Minimizes two residual functions using a homemade Newton-Raphson routine. \n+ -- It is homemade so that it can catch exceptions and handle them correctly, plus it is \n+ optimized for this particular problem. \n+\n+ -- Note that the notation used herein is that of Noble et al. (2006) except for the argument \n+ list. \n+\n+\n+INPUT: (using GRHydro variable defintions)\n+\n+ s[x,y,z] = scons[0,1,2] = \\alpha \\sqrt(\\gamma) T^0_i \n+ dens = as defined in GRHydro and are assumed to be densitized (i.e. with sqrt(\\gamma)) \n+ dens = D = \\sqrt(\\gamma) W \\rho \n+ sc_in = K D, where K is the polytropic constant\n+ g[x,y,z][x,y,x] = spatial metric corresponding to \\gamma \n+ u[x,y,z][x,y,z] = inverse of the spatial metric, g[x,y,z][x,y,x]\n+ det = sqrt(\\gamma)\n+ B[x,y,z] = Bvec[0,1,2] \n+ bsq = b^\\mu b_\\mu \n+\n+ epsnegative = (integer)\n+ = 0 if rho and epsilon are positive\n+ != 0 otherwise \n+\n+\n+ -- (users should set B[x,y,z] = 0 for hydrodynamic runs) \n+\n+\n+OUTPUT: (using GRHydro variable defintions)\n+ rho, eps = as defined in GRHydro, primitive variables\n+ vel[x,y,z] = as defined in GRHydro, primitive variables\n+\n+\n+RETURN VALUE: of retval = (i*100 + j) where \n+ i = 0 -> Newton-Raphson solver either was not called (yet or not used) \n+ or returned successfully;\n+ 1 -> Newton-Raphson solver did not converge to a solution with the \n+ given tolerances;\n+ 2 -> Newton-Raphson procedure encountered a numerical divergence \n+ (occurrence of \"nan\" or \"+/-inf\" ;\n+ \n+ j = 0 -> success \n+ 1 -> failure: some sort of failure in Newton-Raphson; \n+ 2 -> failure: unphysical vsq = v^2 value at initial guess;\n+ 3 -> failure: W<0 or W>W_TOO_BIG\n+ 4 -> failure: v^2 > 1 \n+ ( used to be 5 -> failure: rho,uu <= 0 but now sets epsnegative to non-zero )\n+\n+**********************************************************************************/\n+void CCTK_FCALL CCTK_FNAME(GRHydro_Con2PrimM_Polytype_pt) ( \n+ CCTK_INT *handle, CCTK_REAL *gamma_eos, \n+ CCTK_REAL *dens_in, \n+ CCTK_REAL *sx_in, CCTK_REAL *sy_in, CCTK_REAL *sz_in, \n+ CCTK_REAL *sc_in,\n+ CCTK_REAL *Bconsx_in, CCTK_REAL *Bconsy_in, CCTK_REAL *Bconsz_in, \n+ CCTK_REAL *rho, \n+ CCTK_REAL *velx, CCTK_REAL *vely, CCTK_REAL *velz,\n+ CCTK_REAL *epsilon, CCTK_REAL *pressure,\n+ CCTK_REAL *Bx, CCTK_REAL *By, CCTK_REAL *Bz, \n+ CCTK_REAL *bsq,\n+ CCTK_REAL *w_lorentz, \n+ CCTK_REAL *gxx, CCTK_REAL *gxy, CCTK_REAL *gxz, \n+ CCTK_REAL *gyy, CCTK_REAL *gyz, CCTK_REAL *gzz, \n+ CCTK_REAL *uxx, CCTK_REAL *uxy, CCTK_REAL *uxz,\n+ CCTK_REAL *uyy, CCTK_REAL *uyz, CCTK_REAL *uzz,\n+ CCTK_REAL *sdet,\n+ CCTK_INT *epsnegative,\n+ CCTK_REAL *retval)\n+\n+{\n+ CCTK_REAL x_1d[1];\n+ CCTK_REAL sx, sy, sz;\n+ CCTK_REAL usx, usy, usz;\n+ CCTK_REAL dens, gammaeos;\n+ CCTK_REAL QdotB,utsq,gamma_sq;\n+ CCTK_REAL rho0,u,p,w,gammasq,gamma,W_last,W,vsq;\n+ CCTK_REAL g_o_WBsq, QdB_o_W;\n+ CCTK_REAL rho_g, x_rho[1];\n+ CCTK_REAL sqrt_detg = *sdet;\n+ CCTK_REAL inv_sqrt_detg = 1./sqrt_detg; \n+ CCTK_REAL t2, rho_gm1;\n+ CCTK_INT i_increase,ntries ;\n+\n+ struct LocGlob lg;\n+\n+\n+ /* Assume ok initially: */\n+ *retval = 0.;\n+ *epsnegative = 0; \n+\n+ gammaeos = *gamma_eos;\n+\n+#if(DEBUG_CON2PRIMM)\n+ fprintf(stdout,\" *dens = %26.16e \\n\", *dens_in );\n+ fprintf(stdout,\" *sx = %26.16e \\n\", *sx_in ); \n+ fprintf(stdout,\" *sy = %26.16e \\n\", *sy_in ); \n+ fprintf(stdout,\" *sz = %26.16e \\n\", *sz_in ); \n+ fprintf(stdout,\" *Sc = %26.16e \\n\", *sc_in ); \n+ fprintf(stdout,\" *Bconsx = %26.16e \\n\", *Bconsx_in ); \n+ fprintf(stdout,\" *Bconsy = %26.16e \\n\", *Bconsy_in ); \n+ fprintf(stdout,\" *Bconsz = %26.16e \\n\", *Bconsz_in ); \n+ fprintf(stdout,\" *rho = %26.16e \\n\", *rho ); \n+ fprintf(stdout,\" *velx = %26.16e \\n\", *velx ); \n+ fprintf(stdout,\" *vely = %26.16e \\n\", *vely ); \n+ fprintf(stdout,\" *velz = %26.16e \\n\", *velz ); \n+ fprintf(stdout,\" *epsilon = %26.16e \\n\", *epsilon );\n+ fprintf(stdout,\" *pressure = %26.16e \\n\", *pressure );\n+ fprintf(stdout,\" *Bx = %26.16e \\n\", *Bx ); \n+ fprintf(stdout,\" *By = %26.16e \\n\", *By ); \n+ fprintf(stdout,\" *Bz = %26.16e \\n\", *Bz ); \n+ fprintf(stdout,\" *bsq = %26.16e \\n\", *bsq ); \n+ fprintf(stdout,\" *w_lorentz = %26.16e \\n\", *w_lorentz );\n+ fprintf(stdout,\" *gxx = %26.16e \\n\", *gxx ); \n+ fprintf(stdout,\" *gxy = %26.16e \\n\", *gxy ); \n+ fprintf(stdout,\" *gxz = %26.16e \\n\", *gxz ); \n+ fprintf(stdout,\" *gyy = %26.16e \\n\", *gyy ); \n+ fprintf(stdout,\" *gyz = %26.16e \\n\", *gyz ); \n+ fprintf(stdout,\" *gzz = %26.16e \\n\", *gzz ); \n+ fprintf(stdout,\" *uxx = %26.16e \\n\", *uxx ); \n+ fprintf(stdout,\" *uxy = %26.16e \\n\", *uxy ); \n+ fprintf(stdout,\" *uxz = %26.16e \\n\", *uxz ); \n+ fprintf(stdout,\" *uyy = %26.16e \\n\", *uyy ); \n+ fprintf(stdout,\" *uyz = %26.16e \\n\", *uyz ); \n+ fprintf(stdout,\" *uzz = %26.16e \\n\", *uzz ); \n+ fprintf(stdout,\" *sdet = %26.16e \\n\", *sdet ); \n+ fprintf(stdout,\" *epsnegative = %10d \\n\", *epsnegative );\n+ fprintf(stdout,\" *retval = %26.16e \\n\", *retval );\n+ fflush(stdout);\n+#endif\n+\n+ /* First undensitize all conserved variables : */\n+ sx = ( *sx_in) * inv_sqrt_detg;\n+ sy = ( *sy_in) * inv_sqrt_detg;\n+ sz = ( *sz_in) * inv_sqrt_detg;\n+ dens = (*dens_in) * inv_sqrt_detg;\n+\n+ usx = (*uxx)*sx + (*uxy)*sy + (*uxz)*sz;\n+ usy = (*uxy)*sx + (*uyy)*sy + (*uyz)*sz;\n+ usz = (*uxz)*sx + (*uyz)*sy + (*uzz)*sz;\n+\n+ *Bx = (*Bconsx_in) * inv_sqrt_detg; \n+ *By = (*Bconsy_in) * inv_sqrt_detg; \n+ *Bz = (*Bconsz_in) * inv_sqrt_detg; \n+\n+ // Calculate various scalars (Q.B, Q^2, etc) from the conserved variables:\n+ \n+ lg.Bsq = \n+ (*gxx) * (*Bx) * (*Bx) + \n+ (*gyy) * (*By) * (*By) + \n+ (*gzz) * (*Bz) * (*Bz) + \n+ 2*( \n+ (*gxy) * (*Bx) * (*By) +\n+ (*gxz) * (*Bx) * (*Bz) +\n+ (*gyz) * (*By) * (*Bz) );\n+ \n+ QdotB = (sx * (*Bx) + sy * (*By) + sz * (*Bz)) ;\n+ lg.QdotBsq = QdotB*QdotB ;\n+\n+ lg.Qtsq = (usx * sx + usy * sy + usz * sz) ;\n+\n+ lg.D = dens;\n+\n+ t2 = lg.D*lg.D;\n+ lg.t4 = lg.QdotBsq*t2;\n+ lg.t7 = lg.Bsq*lg.Bsq;\n+ lg.t24 = 1/t2;\n+ lg.two_Bsq = lg.Bsq + lg.Bsq;\n+ lg.t300 = lg.QdotBsq*lg.Bsq*t2;\n+ lg.t400 = lg.Qtsq*t2;\n+\n+ lg.s200 = lg.D*gammaeos*(*sc_in);\n+ CCTK_REAL g_o_gm1 = (gammaeos/(gammaeos-1.));\n+ lg.s100 = g_o_gm1*(*sc_in);\n+\n+ /* calculate W from last timestep and use for guess */\n+ vsq = \n+ (*gxx) * (*velx) * (*velx) + \n+ (*gyy) * (*vely) * (*vely) + \n+ (*gzz) * (*velz) * (*velz) + \n+ 2*( \n+ (*gxy) * (*velx) * (*vely) +\n+ (*gxz) * (*velx) * (*velz) +\n+ (*gyz) * (*vely) * (*velz) );\n+\n+ if( (vsq < 0.) && (fabs(vsq) < 1.0e-13) ) { \n+ vsq = fabs(vsq);\n+ }\n+ if(vsq < 0. || vsq > 1. ) {\n+ *retval = 2.;\n+ return;\n+ }\n+\n+ gammasq = 1. / (1. - vsq);\n+ gamma = sqrt(gammasq);\n+ \n+ // Always calculate rho from D and gamma so that using D in EOS remains consistent\n+ // i.e. you don't get positive values for dP/d(vsq) . \n+ rho0 = lg.D / gamma ;\n+ CCTK_REAL gm1 = gammaeos-1.;\n+ rho_gm1 = pow(rho0,gm1);\n+ p = (*sc_in) * rho_gm1 / gamma; \n+ u = p / gm1;\n+ w = rho0 + u + p ;\n+\n+ W_last = w*gammasq ;\n+\n+\n+ // Make sure that W is large enough so that v^2 < 1 : \n+ i_increase = 0;\n+ while( (( W_last*W_last*W_last * ( W_last + 2.*lg.Bsq ) \n+ - lg.QdotBsq*(2.*W_last + lg.Bsq) ) <= W_last*W_last*(lg.Qtsq-lg.Bsq*lg.Bsq))\n+ && (i_increase < 10) ) {\n+ W_last *= 10.;\n+ i_increase++;\n+ }\n+\n+ lg.W_for_gnr2 = lg.W_for_gnr2_old = W_last;\n+ lg.rho_for_gnr2 = lg.rho_for_gnr2_old = rho0;\n+\n+ // Calculate W: \n+ x_1d[0] = W_last;\n+\n+ *retval = 1.0*oned_newton_raphson( x_1d, 1, gammaeos, &lg, func_W ) ; \n+\n+ W = x_1d[0];\n+ \n+ /* Problem with solver, so return denoting error before doing anything further */\n+ if( ((*retval) != 0.) || (W == FAIL_VAL) ) {\n+ *retval = *retval*100.+1.;\n+ return;\n+ }\n+ else{\n+ if(W <= 0. || W > W_TOO_BIG) {\n+ *retval = 3.;\n+ return;\n+ }\n+ }\n+\n+ rho_g = x_rho[0] = lg.rho_for_gnr2; \n+\n+ ntries = 0;\n+ while ( (*retval = gnr2( x_rho, 1, gammaeos, &lg, func_rho)) && ( ntries++ < 10 ) ) { \n+ rho_g *= 10.;\n+ x_rho[0] = rho_g;\n+ }\n+\n+ lg.rho_for_gnr2 = x_rho[0];\n+\n+ if( (*retval != 0) ) {\n+ *retval = 10;\n+ return;\n+ }\n+\n+ // Calculate v^2 : \n+ rho0 = lg.rho_for_gnr2;\n+ rho_gm1 = pow(rho0,gm1);\n+\n+ utsq = (lg.D-rho0)*(lg.D+rho0)/(rho0*rho0);\n+\n+ gamma_sq = 1.+utsq;\n+ gamma = sqrt(gamma_sq);\n+\n+ // Calculate v^2:\n+ if( vsq >= 1. ) {\n+ *retval = 4.;\n+ return;\n+ }\n+\n+ // Recover the primitive variables from the scalars and conserved variables:\n+ \n+ w = W / gamma_sq;\n+ \n+ // printf(\"doublecheck - S, rho, gamma: %e %e %e\\n\",*sc_in, rho_gm1,gamma);\n+\n+ p = (*sc_in) * inv_sqrt_detg * rho_gm1 / gamma;\n+\n+ u = p / gm1;\n+\n+ // User may want to handle this case differently, e.g. do NOT return upon \n+ // a negative rho/u, calculate v^i so that rho/u can be floored by other routine:\n+ if( (rho0 <= 0.) || (u <= 0.) ) { \n+ *epsnegative = 1; \n+ return;\n+ }\n+\n+ *rho = rho0;\n+ *epsilon = u / rho0;\n+ *w_lorentz = gamma; \n+ *pressure = p ; \n+\n+ g_o_WBsq = 1./(W+lg.Bsq);\n+ QdB_o_W = QdotB / W; \n+ *bsq = lg.Bsq * (1.-vsq) + QdB_o_W*QdB_o_W;\n+\n+ *velx = g_o_WBsq * ( usx + QdB_o_W*(*Bx) ) ;\n+ *vely = g_o_WBsq * ( usy + QdB_o_W*(*By) ) ;\n+ *velz = g_o_WBsq * ( usz + QdB_o_W*(*Bz) ) ;\n+\n+\n+#if(DEBUG_CON2PRIMM)\n+ fprintf(stdout,\"rho = %26.16e \\n\",*rho );\n+ fprintf(stdout,\"epsilon = %26.16e \\n\",*epsilon );\n+ fprintf(stdout,\"pressure = %26.16e \\n\",*pressure );\n+ fprintf(stdout,\"w_lorentz = %26.16e \\n\",*w_lorentz);\n+ fprintf(stdout,\"bsq = %26.16e \\n\",*bsq );\n+ fprintf(stdout,\"velx = %26.16e \\n\",*velx );\n+ fprintf(stdout,\"vely = %26.16e \\n\",*vely );\n+ fprintf(stdout,\"velz = %26.16e \\n\",*velz );\n+ fprintf(stdout,\"gam = %26.16e \\n\",gammaeos );\n+ fflush(stdout);\n+#endif\n+\n+ /* done! */\n+ return;\n+\n+}\n+\n+\n+#if(DEBUG_CON2PRIMM)\n+/********************************************************************\n+\n+ validate_x(): \n+ \n+ -- makes sure that x[0,1] have physical values, based upon \n+ their definitions:\n+ \n+*********************************************************************/\n+\n+static void validate_x(CCTK_REAL x[2], CCTK_REAL x0[2] ) \n+{\n+ \n+ const CCTK_REAL dv = 1.e-15;\n+\n+ /* Always take the absolute value of x[0] and check to see if it's too big: */ \n+ x[0] = fabs(x[0]);\n+ x[0] = (x[0] > W_TOO_BIG) ? x0[0] : x[0];\n+ \n+ x[1] = (x[1] < 0.) ? 0. : x[1]; /* if it's too small */\n+ x[1] = (x[1] > 1.) ? (1. - dv) : x[1]; /* if it's too big */\n+\n+ return;\n+\n+}\n+#endif\n+\n+/************************************************************\n+\n+ oned_newton_raphson(): \n+\n+ -- performs Newton-Rapshon method on an 2d system.\n+\n+ -- inspired in part by Num. Rec.'s routine newt();\n+\n+*****************************************************************/\n+static CCTK_INT oned_newton_raphson( CCTK_REAL x[], CCTK_INT n, CCTK_REAL gammaeos, struct LocGlob *lgp,\n+ void (*funcd) (CCTK_REAL [], CCTK_REAL [], CCTK_REAL [], \n+ CCTK_REAL [][1], CCTK_REAL *, \n+ CCTK_REAL *, CCTK_INT, CCTK_REAL, struct LocGlob *) )\n+{\n+ CCTK_REAL f, df, dx[1], x_old[1], resid[1], \n+ jac[1][1];\n+ CCTK_REAL errx, x_orig[1];\n+ CCTK_INT n_iter, i_extra, doing_extra;\n+\n+ CCTK_INT keep_iterating;\n+\n+\n+ // Initialize various parameters and variables:\n+ errx = 1. ; \n+ df = f = 1.;\n+ i_extra = doing_extra = 0;\n+ //-fast for( id = 0; id < n ; id++) x_old[id] = x_orig[id] = x[id] ;\n+ x_old[0] = x_orig[0] = x[0] ;\n+\n+ n_iter = 0;\n+\n+\n+ /* Start the Newton-Raphson iterations : */\n+ keep_iterating = 1;\n+ while( keep_iterating ) { \n+\n+ (*funcd) (x, dx, resid, jac, &f, &df, n, gammaeos, lgp); /* returns with new dx, f, df */\n+\n+ /* Save old values before calculating the new: */\n+ errx = 0.;\n+\n+ //-fast for( id = 0; id < n ; id++) { x_old[id] = x[id] ; }\n+ x_old[0] = x[0] ;\n+\n+ /* don't use line search : */\n+ //-fast for( id = 0; id < n ; id++) { x[id] += dx[id] ; }\n+ x[0] += dx[0] ;\n+\n+// //METHOD specific:\n+// i_increase = 0;\n+// while( (( x[0]*x[0]*x[0] * ( x[0] + 2.*lgp->Bsq ) - \n+// lgp->QdotBsq*(2.*x[0] + lgp->Bsq) ) <= x[0]*x[0]*(lgp->Qtsq-lgp->Bsq*lgp->Bsq))\n+// && (i_increase < 10) ) {\n+// x[0] -= (1.*i_increase) * dx[0] / 10. ;\n+// i_increase++;\n+// }\n+\n+ /****************************************/\n+ /* Calculate the convergence criterion */\n+ /****************************************/\n+\n+ /* For the new criterion, always look at error in \"W\" : */\n+ // METHOD specific:\n+ errx = (x[0]==0.) ? fabs(dx[0]) : fabs(dx[0]/x[0]);\n+\n+\n+ /****************************************/\n+ /* Make sure that the new x[] is physical : */\n+ /****************************************/\n+ x[0] = fabs(x[0]);\n+\n+\n+ /*****************************************************************************/\n+ /* If we've reached the tolerance level, then just do a few extra iterations */\n+ /* before stopping */\n+ /*****************************************************************************/\n+ \n+ if( (fabs(errx) <= NEWT_TOL) && (doing_extra == 0) && (EXTRA_NEWT_ITER > 0) ) {\n+ doing_extra = 1;\n+ }\n+\n+ if( doing_extra == 1 ) i_extra++ ;\n+\n+ if( ((fabs(errx) <= NEWT_TOL)&&(doing_extra == 0)) || \n+ (i_extra > EXTRA_NEWT_ITER) || (n_iter >= (MAX_NEWT_ITER-1)) ) {\n+ keep_iterating = 0;\n+ }\n+\n+ n_iter++;\n+\n+ } // END of while(keep_iterating)\n+\n+\n+ /* Check for bad untrapped divergences : */\n+ if( (!finite(f)) || (!finite(df)) || (!finite(x[0])) ) {\n+#if(DEBUG_CON2PRIMM)\n+ fprintf(stderr,\"\\ngnr not finite, f,df,x_o,x,W_o,W,rho_o,rho = %26.20e %26.20e %26.20e %26.20e %26.20e %26.20e %26.20e %26.20e \\n\",\n+ f,df,x[0],x_old[0],lgp->W_for_gnr2_old,lgp->W_for_gnr2,lgp->rho_for_gnr2_old,lgp->rho_for_gnr2); fflush(stderr); \n+#endif\n+ return(2);\n+ }\n+\n+ if( fabs(errx) <= NEWT_TOL ){\n+ return(0);\n+ }\n+ else if( (fabs(errx) <= MIN_NEWT_TOL) && (fabs(errx) > NEWT_TOL) ){\n+ return(0);\n+ }\n+ else {\n+ return(1);\n+ } \n+\n+ \n+\n+}\n+\n+\n+/**********************************************************************/\n+/*********************************************************************************\n+ func_W()\n+\n+ -- calculates the residuals, and Newton step for general_newton_raphson();\n+ -- for this method, x=W here;\n+\n+ Arguments:\n+ x = current value of independent var's (on input & output);\n+ dx = Newton-Raphson step (on output);\n+ resid = residuals based on x (on output);\n+ jac = Jacobian matrix based on x (on output);\n+ f = resid.resid/2 (on output)\n+ df = -2*f; (on output)\n+ n = dimension of x[];\n+ *********************************************************************************/\n+static void func_W(CCTK_REAL x[], CCTK_REAL dx[], CCTK_REAL resid[], \n+ CCTK_REAL jac[][1], CCTK_REAL *f, CCTK_REAL *df, CCTK_INT n, CCTK_REAL gammaeos, \n+ struct LocGlob *lgp)\n+{\n+ CCTK_INT retval, ntries;\n+ CCTK_REAL W, x_rho[1], rho, rho_g ;\n+ CCTK_REAL t15, t200,t1000, drho_dW, rho_gm1 ;\n+ \n+ W = x[0];\n+ lgp->W_for_gnr2_old = lgp->W_for_gnr2;\n+ lgp->W_for_gnr2 = W;\n+\n+ // get rho from NR:\n+ rho_g = x_rho[0] = lgp->rho_for_gnr2;\n+ \n+ ntries = 0;\n+ while ( (retval = gnr2( x_rho, 1, gammaeos, lgp, func_rho)) && ( ntries++ < 10 ) ) { \n+ rho_g *= 10.;\n+ x_rho[0] = rho_g;\n+ }\n+\n+#if(DEBUG_CON2PRIMM)\n+ if( x_rho[0] <= 0. ) { \n+ fprintf(stderr,\"gnr2 neg rho = %d ,rho_n,rho,rho_o,W,W_o = %26.20e %26.20e %26.20e %26.20e %26.20e \\n\", retval, x_rho[0], lgp->rho_for_gnr2, lgp->rho_for_gnr2_old, x[0], lgp->W_for_gnr2_old);\n+ fflush(stderr);\n+ }\n+ \n+ if( retval ) { \n+ fprintf(stderr,\"gnr2 retval = %d ,rho_n,rho,rho_o,W,W_o = %26.20e %26.20e %26.20e %26.20e %26.20e \\n\", retval, x_rho[0], lgp->rho_for_gnr2, lgp->rho_for_gnr2_old, x[0], lgp->W_for_gnr2_old);\n+ fflush(stderr);\n+ }\n+#endif \n+\n+ lgp->rho_for_gnr2_old = lgp->rho_for_gnr2; \n+ rho = lgp->rho_for_gnr2 = x_rho[0];\n+\n+ CCTK_REAL gm1 = gammaeos-1.;\n+\n+ rho_gm1 = pow(rho,gm1);\n+ drho_dW = -rho*rho/( -rho_gm1*lgp->s200 + W*rho);\n+\n+ t15 = -(lgp->D-rho)*(lgp->D+rho); // t6-t2\n+ t200 = W + lgp->two_Bsq;\n+ t1000 = rho*drho_dW;\n+ resid[0] = (lgp->t300+(lgp->t4+lgp->t4+(lgp->t400+t15*(lgp->t7+(t200)*W))*W)*W)*lgp->t24;\n+ jac[0][0] = 2*(lgp->t4+(lgp->t400+t15*lgp->t7+(3.0*t15*lgp->Bsq+lgp->t7*t1000+(t15+t15+t1000*(t200))*W)*W)*W)*lgp->t24;\n+\n+ dx[0] = -resid[0]/jac[0][0];\n+\n+ *df = - resid[0]*resid[0];\n+ *f = -0.5*(*df);\n+\n+\n+// fprintf(stdout,\"QdotBsq = %28.18e ; \\n\",lgp->QdotBsq );\n+// fprintf(stdout,\"Sc = %28.18e ; \\n\",Sc );\n+// fprintf(stdout,\"Bsq = %28.18e ; \\n\",lgp->Bsq );\n+// fprintf(stdout,\"Qtsq = %28.18e ; \\n\",lgp->Qtsq );\n+// fprintf(stdout,\"Dc = %28.18e ; \\n\",lgp->D );\n+// fprintf(stdout,\"drhodW = %28.18e ; \\n\",drho_dW );\n+// fprintf(stdout,\"W = %28.18e ; \\n\",W );\n+// fprintf(stdout,\"rho = %28.18e ; \\n\",rho );\n+// fprintf(stdout,\"resid_W = %28.18e ; \\n\",resid[0] );\n+// fprintf(stdout,\"jac_W = %28.18e ; \\n\",jac[0][0]);\n+// fprintf(stdout,\"deriv1 %g %g %g %g \\n\",W,resid[0],jac[0][0],dx[0]);\n+\n+ return;\n+\n+}\n+\n+\n+/***********************************************************/\n+/********************************************************************** \n+\n+ gnr2()\n+\n+ -- used to calculate rho from W\n+\n+*****************************************************************/\n+static CCTK_INT gnr2( CCTK_REAL x[], CCTK_INT n, CCTK_REAL gammaeos, struct LocGlob *lgp,\n+ void (*funcd) (CCTK_REAL [], CCTK_REAL [], CCTK_REAL [], \n+ CCTK_REAL [][1],CCTK_REAL *,CCTK_REAL *,CCTK_INT,CCTK_REAL, struct LocGlob *lgp) )\n+{\n+ CCTK_REAL f, df, dx[1], x_old[1], resid[1], \n+ jac[1][1];\n+ CCTK_REAL errx, x_orig[1];\n+ CCTK_INT n_iter, i_extra, doing_extra;\n+ \n+\n+ CCTK_INT keep_iterating;\n+\n+\n+ // Initialize various parameters and variables:\n+ errx = 1. ; \n+ df = f = 1.;\n+ i_extra = doing_extra = 0;\n+ //-fast for( id = 0; id < n ; id++) x_old[id] = x_orig[id] = x[id] ;\n+ x_old[0] = x_orig[0] = x[0] ;\n+\n+ n_iter = 0;\n+\n+\n+ /* Start the Newton-Raphson iterations : */\n+ keep_iterating = 1;\n+ while( keep_iterating ) { \n+\n+ (*funcd) (x, dx, resid, jac, &f, &df, n,gammaeos, lgp); /* returns with new dx, f, df */\n+\n+ /* Save old values before calculating the new: */\n+ //-fast errx = 0.;\n+ //-fast for( id = 0; id < n ; id++) { x_old[id] = x[id] ; }\n+ x_old[0] = x[0] ; \n+\n+ /* Make the newton step: */\n+ //-fast for( id = 0; id < n ; id++) { x[id] += dx[id] ; }\n+ x[0] += dx[0] ;\n+\n+ /* Calculate the convergence criterion */\n+ //-fast for( id = 0; id < n ; id++) { errx += (x[id]==0.) ? fabs(dx[id]) : fabs(dx[id]/x[id]); }\n+ //-fast errx /= 1.*n;\n+ errx = (x[0]==0.) ? fabs(dx[0]) : fabs(dx[0]/x[0]); \n+\n+ /* Make sure that the new x[] is physical : */\n+ // METHOD specific:\n+ x[0] = fabs(x[0]);\n+\n+\n+ /* If we've reached the tolerance level, then just do a few extra iterations */\n+ /* before stopping */\n+ if( (fabs(errx) <= NEWT_TOL2) && (doing_extra == 0) && (EXTRA_NEWT_ITER > 0) ) {\n+ doing_extra = 0;\n+ }\n+\n+ if( doing_extra == 1 ) i_extra++ ;\n+\n+ // See if we've done the extra iterations, or have done too many iterations:\n+ if( ((fabs(errx) <= NEWT_TOL2)&&(doing_extra == 0)) || \n+ (i_extra > EXTRA_NEWT_ITER) || (n_iter >= (MAX_NEWT_ITER-1)) ) {\n+ keep_iterating = 0;\n+ }\n+\n+ n_iter++;\n+\n+ } \n+\n+\n+ /* Check for bad untrapped divergences : */\n+ if( (!finite(f)) || (!finite(df)) || (!finite(x[0])) ) {\n+#if(DEBUG_CON2PRIMM)\n+ fprintf(stderr,\"\\ngnr2 not finite, f,df,x_o,x,W_o,W,rho_o,rho = %26.20e %26.20e %26.20e %26.20e %26.20e %26.20e %26.20e %26.20e \\n\",\n+ f,df,x[0],x_old[0],lgp->W_for_gnr2_old,lgp->W_for_gnr2,lgp->rho_for_gnr2_old,lgp->rho_for_gnr2); fflush(stderr); \n+#endif\n+ return(2);\n+ }\n+ \n+ // Return in different ways depending on whether a solution was found:\n+ if( fabs(errx) <= NEWT_TOL ){\n+ return(0);\n+ }\n+ else if( (fabs(errx) <= MIN_NEWT_TOL) && (fabs(errx) > NEWT_TOL) ){\n+ return(0);\n+ }\n+ else {\n+ return(1);\n+ } \n+\n+ \n+\n+}\n+\n+/*********************************************************************************\n+ func_rho():\n+\n+ -- residual/jacobian routine to calculate rho from W via the polytrope:\n+\n+ W = ( 1 + GAMMA * K_atm * rho^(GAMMA-1)/(GAMMA-1) ) D^2 / rho\n+\n+ Arguments:\n+ x = current value of independent var's (on input & output);\n+ dx = Newton-Raphson step (on output);\n+ resid = residuals based on x (on output);\n+ jac = Jacobian matrix based on x (on output);\n+ f = resid.resid/2 (on output)\n+ df = -2*f; (on output)\n+ n = dimension of x[];\n+ *********************************************************************************/\n+// for the isentropic version: eq. (27)\n+static void func_rho(CCTK_REAL x[], CCTK_REAL dx[], CCTK_REAL resid[], \n+ CCTK_REAL jac[][1], CCTK_REAL *f, CCTK_REAL *df, CCTK_INT n, CCTK_REAL gammaeos, \n+ struct LocGlob *lgp)\n+{\n+\n+ CCTK_REAL rho, W;\n+ CCTK_REAL t40,t14;\n+ \n+ CCTK_REAL gm1 = gammaeos-1.;\n+\n+ rho = x[0];\n+ W = lgp->W_for_gnr2;\n+\n+ t40 = pow(rho,gm1);\n+\n+ resid[0] = (rho*W+(-t40*lgp->s100-lgp->D)*lgp->D);\n+ t14 = t40/rho; // rho^(g-2)\n+ jac[0][0] = -t14*lgp->s200 + W;\n+ // drho_dW = -rho/jac[0][0];\n+\n+ dx[0] = -resid[0]/jac[0][0];\n+ *df = - resid[0]*resid[0];\n+ *f = -0.5*(*df);\n+\n+ // fprintf(stdout,\"deriv3 %g %g %g %g %g \\n\",rho,W,resid[0],jac[0][0],dx[0]);\n+// fprintf(stdout,\"Dc := %28.18e ; \\n\",lgp->D);\n+// fprintf(stdout,\"Sc := %28.18e ; \\n\",Sc);\n+// fprintf(stdout,\"rho := %28.18e ; \\n\",rho);\n+// fprintf(stdout,\"W := %28.18e ; \\n\",W);\n+// fprintf(stdout,\"resid_rho := %28.18e ; \\n\",resid[0] );\n+// fprintf(stdout,\"jac_rho := %28.18e ; \\n\",jac[0][0] );\n+\n+ return;\n+\n+}\n+\n+\n+/****************************************************************************** \n+ END \n+ ******************************************************************************/\n+\n+\n+#undef DEBUG_CON2PRIMM"}, "test": {"test_patch": "diff --git a/all_tests.txt b/all_tests.txt\nnew file mode 100644\nindex 0000000..0000000\n--- /dev/null\n+++ b/all_tests.txt\n@@ -0,0 +1,10 @@\n+GRHydro_test_shock\n+GRHydro_test_shock_mp5\n+GRHydro_test_shock_ppm\n+GRHydro_test_tov_ppm_ML\n+GRHydro_test_tov_ppm_ML_disable_internal_excision\n+GRHydro_test_tov_ppm_no_trp_ML\n+test_one_hybrid\n+tov_carpetevolutionmask\n+tov_carpetevolutionmask2\n+tov_slowsector", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}41{"question_id": "MSB_openmm_openmm_pr3313", "question_type": "multi_swe_bench", "description": "Fixed error using AMOEBA 2018 with RNA (openmm/openmm#3313)", "content": {"org": "openmm", "repo": "openmm", "pr_number": 3313, "issue_title": "Fixed error using AMOEBA 2018 with RNA", "issue_body": "Fixes #3305.", "base_commit": "edee11b60102306298e1bca39fe5989c2ddc9a91", "resolved_issues": [{"number": 3305, "title": "AMOEBA RNA forcefield cannot match bonding arrangement in PDB", "body": "Hi @peastman,\r\n\r\nGreat job finishing the 2018 AMOEBA, and I also just wanted to say thanks a million for including the nucleic acids in there.\r\n\r\nI'm running into this error with the following inputs:\r\n\r\nValueError: No template found for residue 1 (RU5). The set of atoms matches RU5, but the bonds are different. Perhaps the chain is missing a terminal group?\r\n\r\nThis one was built using the sequence command in LEAP. I've also had the same error when I use NAB and then loadpdb in LEAP to make an input PDB. The chain should not be missing a terminal group, because the 5' end does indeed have the 5' uracil cap on this end (resname RU5).\r\n\r\n[rna_ext.pdb.zip](https://github.com/openmm/openmm/files/7437108/rna_ext.pdb.zip)\r\n\r\nBy the way, I'm using\r\n`forcefield = ForceField('amoeba2018.xml')`\r\n\n\n## IMPORTANT INSTRUCTIONS\n\n1. If you edit a python file, you MUST run 'make PythonInstall' inside the build directory\n2. If you edit a c++ file, you MUST run 'make -j4 && make install\" inside the build directory"}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/openmm_m_openmm:pr-3313", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/devtools/forcefield-scripts/residuesFinal.xml b/devtools/forcefield-scripts/residuesFinal.xml\nindex 7fb0398466..80b8e3e3a0 100644\n--- a/devtools/forcefield-scripts/residuesFinal.xml\n+++ b/devtools/forcefield-scripts/residuesFinal.xml\n@@ -2030,7 +2030,7 @@\n <Atom name=\"C2'\" tinkerLookupName=\"C2*\"/>\n <Atom name=\"H2'\" tinkerLookupName=\"H2*\"/>\n <Atom name=\"O2'\" tinkerLookupName=\"O2*\"/>\n- <Atom name=\"HO2'\" tinkerLookupName=\"H2*\"/>\n+ <Atom name=\"HO2'\" tinkerLookupName=\"HO*\"/>\n <Atom name=\"O3'\" tinkerLookupName=\"O3*\"/>\n <Bond from=\"P\" to=\"O1P\"/>\n <Bond from=\"P\" to=\"O2P\"/>\n@@ -2100,7 +2100,7 @@\n <Atom name=\"C2'\" tinkerLookupName=\"C2*\"/>\n <Atom name=\"H2'\" tinkerLookupName=\"H2*\"/>\n <Atom name=\"O2'\" tinkerLookupName=\"O2*\"/>\n- <Atom name=\"HO2'\" tinkerLookupName=\"H2*\"/>\n+ <Atom name=\"HO2'\" tinkerLookupName=\"HO*\"/>\n <Atom name=\"O3'\" tinkerLookupName=\"O3*\"/>\n <Atom name=\"H3T\" tinkerLookupName=\"H3T\"/>\n <Bond from=\"P\" to=\"O1P\"/>\n@@ -2170,7 +2170,7 @@\n <Atom name=\"C2'\" tinkerLookupName=\"C2*\"/>\n <Atom name=\"H2'\" tinkerLookupName=\"H2*\"/>\n <Atom name=\"O2'\" tinkerLookupName=\"O2*\"/>\n- <Atom name=\"HO2'\" tinkerLookupName=\"H2*\"/>\n+ <Atom name=\"HO2'\" tinkerLookupName=\"HO*\"/>\n <Atom name=\"O3'\" tinkerLookupName=\"O3*\"/>\n <Bond from=\"H5T\" to=\"O5'\"/>\n <Bond from=\"O5'\" to=\"C5'\"/>\n@@ -2236,7 +2236,7 @@\n <Atom name=\"C2'\" tinkerLookupName=\"C2*\"/>\n <Atom name=\"H2'\" tinkerLookupName=\"H2*\"/>\n <Atom name=\"O2'\" tinkerLookupName=\"O2*\"/>\n- <Atom name=\"HO2'\" tinkerLookupName=\"H2*\"/>\n+ <Atom name=\"HO2'\" tinkerLookupName=\"HO*\"/>\n <Atom name=\"O3'\" tinkerLookupName=\"O3*\"/>\n <Atom name=\"H3T\" tinkerLookupName=\"H3T\"/>\n <Bond from=\"H5T\" to=\"O5'\"/>\n@@ -2304,7 +2304,7 @@\n <Atom name=\"C2'\" tinkerLookupName=\"C2*\"/>\n <Atom name=\"H2'\" tinkerLookupName=\"H2*\"/>\n <Atom name=\"O2'\" tinkerLookupName=\"O2*\"/>\n- <Atom name=\"HO2'\" tinkerLookupName=\"H2*\"/>\n+ <Atom name=\"HO2'\" tinkerLookupName=\"HO*\"/>\n <Atom name=\"O3'\" tinkerLookupName=\"O3*\"/>\n <Bond from=\"P\" to=\"O1P\"/>\n <Bond from=\"P\" to=\"O2P\"/>\n@@ -2369,7 +2369,7 @@\n <Atom name=\"C2'\" tinkerLookupName=\"C2*\"/>\n <Atom name=\"H2'\" tinkerLookupName=\"H2*\"/>\n <Atom name=\"O2'\" tinkerLookupName=\"O2*\"/>\n- <Atom name=\"HO2'\" tinkerLookupName=\"H2*\"/>\n+ <Atom name=\"HO2'\" tinkerLookupName=\"HO*\"/>\n <Atom name=\"O3'\" tinkerLookupName=\"O3*\"/>\n <Atom name=\"H3T\" tinkerLookupName=\"H3T\"/>\n <Bond from=\"P\" to=\"O1P\"/>\n@@ -2434,7 +2434,7 @@\n <Atom name=\"C2'\" tinkerLookupName=\"C2*\"/>\n <Atom name=\"H2'\" tinkerLookupName=\"H2*\"/>\n <Atom name=\"O2'\" tinkerLookupName=\"O2*\"/>\n- <Atom name=\"HO2'\" tinkerLookupName=\"H2*\"/>\n+ <Atom name=\"HO2'\" tinkerLookupName=\"HO*\"/>\n <Atom name=\"O3'\" tinkerLookupName=\"O3*\"/>\n <Bond from=\"H5T\" to=\"O5'\"/>\n <Bond from=\"O5'\" to=\"C5'\"/>\n@@ -2495,7 +2495,7 @@\n <Atom name=\"C2'\" tinkerLookupName=\"C2*\"/>\n <Atom name=\"H2'\" tinkerLookupName=\"H2*\"/>\n <Atom name=\"O2'\" tinkerLookupName=\"O2*\"/>\n- <Atom name=\"HO2'\" tinkerLookupName=\"H2*\"/>\n+ <Atom name=\"HO2'\" tinkerLookupName=\"HO*\"/>\n <Atom name=\"O3'\" tinkerLookupName=\"O3*\"/>\n <Atom name=\"H3T\" tinkerLookupName=\"H3T\"/>\n <Bond from=\"H5T\" to=\"O5'\"/>\n@@ -2563,7 +2563,7 @@\n <Atom name=\"C2'\" tinkerLookupName=\"C2*\"/>\n <Atom name=\"H2'\" tinkerLookupName=\"H2*\"/>\n <Atom name=\"O2'\" tinkerLookupName=\"O2*\"/>\n- <Atom name=\"HO2'\" tinkerLookupName=\"H2*\"/>\n+ <Atom name=\"HO2'\" tinkerLookupName=\"HO*\"/>\n <Atom name=\"O3'\" tinkerLookupName=\"O3*\"/>\n <Bond from=\"P\" to=\"O1P\"/>\n <Bond from=\"P\" to=\"O2P\"/>\n@@ -2635,7 +2635,7 @@\n <Atom name=\"C2'\" tinkerLookupName=\"C2*\"/>\n <Atom name=\"H2'\" tinkerLookupName=\"H2*\"/>\n <Atom name=\"O2'\" tinkerLookupName=\"O2*\"/>\n- <Atom name=\"HO2'\" tinkerLookupName=\"H2*\"/>\n+ <Atom name=\"HO2'\" tinkerLookupName=\"HO*\"/>\n <Atom name=\"O3'\" tinkerLookupName=\"O3*\"/>\n <Atom name=\"H3T\" tinkerLookupName=\"H3T\"/>\n <Bond from=\"P\" to=\"O1P\"/>\n@@ -2707,7 +2707,7 @@\n <Atom name=\"C2'\" tinkerLookupName=\"C2*\"/>\n <Atom name=\"H2'\" tinkerLookupName=\"H2*\"/>\n <Atom name=\"O2'\" tinkerLookupName=\"O2*\"/>\n- <Atom name=\"HO2'\" tinkerLookupName=\"H2*\"/>\n+ <Atom name=\"HO2'\" tinkerLookupName=\"HO*\"/>\n <Atom name=\"O3'\" tinkerLookupName=\"O3*\"/>\n <Bond from=\"H5T\" to=\"O5'\"/>\n <Bond from=\"O5'\" to=\"C5'\"/>\n@@ -2775,7 +2775,7 @@\n <Atom name=\"C2'\" tinkerLookupName=\"C2*\"/>\n <Atom name=\"H2'\" tinkerLookupName=\"H2*\"/>\n <Atom name=\"O2'\" tinkerLookupName=\"O2*\"/>\n- <Atom name=\"HO2'\" tinkerLookupName=\"H2*\"/>\n+ <Atom name=\"HO2'\" tinkerLookupName=\"HO*\"/>\n <Atom name=\"O3'\" tinkerLookupName=\"O3*\"/>\n <Atom name=\"H3T\" tinkerLookupName=\"H3T\"/>\n <Bond from=\"H5T\" to=\"O5'\"/>\n@@ -2843,7 +2843,7 @@\n <Atom name=\"C2'\" tinkerLookupName=\"C2*\"/>\n <Atom name=\"H2'\" tinkerLookupName=\"H2*\"/>\n <Atom name=\"O2'\" tinkerLookupName=\"O2*\"/>\n- <Atom name=\"HO2'\" tinkerLookupName=\"H2*\"/>\n+ <Atom name=\"HO2'\" tinkerLookupName=\"HO*\"/>\n <Atom name=\"O3'\" tinkerLookupName=\"O3*\"/>\n <Bond from=\"P\" to=\"O1P\"/>\n <Bond from=\"P\" to=\"O2P\"/>\n@@ -2906,7 +2906,7 @@\n <Atom name=\"C2'\" tinkerLookupName=\"C2*\"/>\n <Atom name=\"H2'\" tinkerLookupName=\"H2*\"/>\n <Atom name=\"O2'\" tinkerLookupName=\"O2*\"/>\n- <Atom name=\"HO2'\" tinkerLookupName=\"H2*\"/>\n+ <Atom name=\"HO2'\" tinkerLookupName=\"HO*\"/>\n <Atom name=\"O3'\" tinkerLookupName=\"O3*\"/>\n <Atom name=\"H3T\" tinkerLookupName=\"H3T\"/>\n <Bond from=\"P\" to=\"O1P\"/>\n@@ -2969,7 +2969,7 @@\n <Atom name=\"C2'\" tinkerLookupName=\"C2*\"/>\n <Atom name=\"H2'\" tinkerLookupName=\"H2*\"/>\n <Atom name=\"O2'\" tinkerLookupName=\"O2*\"/>\n- <Atom name=\"HO2'\" tinkerLookupName=\"H2*\"/>\n+ <Atom name=\"HO2'\" tinkerLookupName=\"HO*\"/>\n <Atom name=\"O3'\" tinkerLookupName=\"O3*\"/>\n <Bond from=\"H5T\" to=\"O5'\"/>\n <Bond from=\"O5'\" to=\"C5'\"/>\n@@ -3028,7 +3028,7 @@\n <Atom name=\"C2'\" tinkerLookupName=\"C2*\"/>\n <Atom name=\"H2'\" tinkerLookupName=\"H2*\"/>\n <Atom name=\"O2'\" tinkerLookupName=\"O2*\"/>\n- <Atom name=\"HO2'\" tinkerLookupName=\"H2*\"/>\n+ <Atom name=\"HO2'\" tinkerLookupName=\"HO*\"/>\n <Atom name=\"O3'\" tinkerLookupName=\"O3*\"/>\n <Atom name=\"H3T\" tinkerLookupName=\"H3T\"/>\n <Bond from=\"H5T\" to=\"O5'\"/>\ndiff --git a/wrappers/python/openmm/app/data/amoeba2018.xml b/wrappers/python/openmm/app/data/amoeba2018.xml\nindex 38b4f038e9..0951b06807 100644\n--- a/wrappers/python/openmm/app/data/amoeba2018.xml\n+++ b/wrappers/python/openmm/app/data/amoeba2018.xml\n@@ -1,7 +1,7 @@\n <ForceField>\n <Info>\n <Source>amoebabio18.prm</Source>\n- <DateGenerated>2021-11-02</DateGenerated>\n+ <DateGenerated>2021-11-04</DateGenerated>\n <Reference>Yue Shi, Zhen Xia, Jiajing Zhang, Robert Best, Chuanjie Wu, Jay W. Ponder, and Pengyu Ren. Polarizable Atomic Multipole-Based AMOEBA Force Field for Proteins. Journal of Chemical Theory and Computation, 9(9):4046\u20134063, 2013.</Reference>\n <Reference>Changsheng Zhang, Chao Lu, Zhifeng Jing, Chuanjie Wu, Jean-Philip Piquemal, Jay W Ponder, and Pengyu Ren. AMOEBA Polarizable Atomic Multipole Force Field for Nucleic Acids. Journal of Chemical Theory and Computation, 14(4):2084-2108, 2018.</Reference>\n </Info>\n@@ -4325,7 +4325,7 @@\n <Atom name=\"H61\" type=\"260\" />\n <Atom name=\"H62\" type=\"260\" />\n <Atom name=\"H8\" type=\"258\" />\n- <Atom name=\"HO2'\" type=\"317\" />\n+ <Atom name=\"HO2'\" type=\"321\" />\n <Atom name=\"N1\" type=\"257\" />\n <Atom name=\"N3\" type=\"256\" />\n <Atom name=\"N6\" type=\"253\" />\n@@ -4398,7 +4398,7 @@\n <Atom name=\"H61\" type=\"260\" />\n <Atom name=\"H62\" type=\"260\" />\n <Atom name=\"H8\" type=\"258\" />\n- <Atom name=\"HO2'\" type=\"317\" />\n+ <Atom name=\"HO2'\" type=\"321\" />\n <Atom name=\"N1\" type=\"257\" />\n <Atom name=\"N3\" type=\"256\" />\n <Atom name=\"N6\" type=\"253\" />\n@@ -4471,7 +4471,7 @@\n <Atom name=\"H61\" type=\"260\" />\n <Atom name=\"H62\" type=\"260\" />\n <Atom name=\"H8\" type=\"258\" />\n- <Atom name=\"HO2'\" type=\"317\" />\n+ <Atom name=\"HO2'\" type=\"321\" />\n <Atom name=\"N1\" type=\"257\" />\n <Atom name=\"N3\" type=\"256\" />\n <Atom name=\"N6\" type=\"253\" />\n@@ -4539,7 +4539,7 @@\n <Atom name=\"H61\" type=\"260\" />\n <Atom name=\"H62\" type=\"260\" />\n <Atom name=\"H8\" type=\"258\" />\n- <Atom name=\"HO2'\" type=\"317\" />\n+ <Atom name=\"HO2'\" type=\"321\" />\n <Atom name=\"N1\" type=\"257\" />\n <Atom name=\"N3\" type=\"256\" />\n <Atom name=\"N6\" type=\"253\" />\n@@ -4604,7 +4604,7 @@\n <Atom name=\"H5'\" type=\"325\" />\n <Atom name=\"H5''\" type=\"325\" />\n <Atom name=\"H6\" type=\"271\" />\n- <Atom name=\"HO2'\" type=\"317\" />\n+ <Atom name=\"HO2'\" type=\"321\" />\n <Atom name=\"N1\" type=\"261\" />\n <Atom name=\"N3\" type=\"268\" />\n <Atom name=\"N4\" type=\"264\" />\n@@ -4672,7 +4672,7 @@\n <Atom name=\"H5'\" type=\"325\" />\n <Atom name=\"H5''\" type=\"325\" />\n <Atom name=\"H6\" type=\"271\" />\n- <Atom name=\"HO2'\" type=\"317\" />\n+ <Atom name=\"HO2'\" type=\"321\" />\n <Atom name=\"N1\" type=\"261\" />\n <Atom name=\"N3\" type=\"268\" />\n <Atom name=\"N4\" type=\"264\" />\n@@ -4740,7 +4740,7 @@\n <Atom name=\"H5''\" type=\"325\" />\n <Atom name=\"H5T\" type=\"327\" />\n <Atom name=\"H6\" type=\"271\" />\n- <Atom name=\"HO2'\" type=\"317\" />\n+ <Atom name=\"HO2'\" type=\"321\" />\n <Atom name=\"N1\" type=\"261\" />\n <Atom name=\"N3\" type=\"268\" />\n <Atom name=\"N4\" type=\"264\" />\n@@ -4803,7 +4803,7 @@\n <Atom name=\"H5''\" type=\"325\" />\n <Atom name=\"H5T\" type=\"327\" />\n <Atom name=\"H6\" type=\"271\" />\n- <Atom name=\"HO2'\" type=\"317\" />\n+ <Atom name=\"HO2'\" type=\"321\" />\n <Atom name=\"N1\" type=\"261\" />\n <Atom name=\"N3\" type=\"268\" />\n <Atom name=\"N4\" type=\"264\" />\n@@ -4865,7 +4865,7 @@\n <Atom name=\"H5'\" type=\"325\" />\n <Atom name=\"H5''\" type=\"325\" />\n <Atom name=\"H8\" type=\"286\" />\n- <Atom name=\"HO2'\" type=\"317\" />\n+ <Atom name=\"HO2'\" type=\"321\" />\n <Atom name=\"N1\" type=\"277\" />\n <Atom name=\"N2\" type=\"278\" />\n <Atom name=\"N3\" type=\"283\" />\n@@ -4940,7 +4940,7 @@\n <Atom name=\"H5'\" type=\"325\" />\n <Atom name=\"H5''\" type=\"325\" />\n <Atom name=\"H8\" type=\"286\" />\n- <Atom name=\"HO2'\" type=\"317\" />\n+ <Atom name=\"HO2'\" type=\"321\" />\n <Atom name=\"N1\" type=\"277\" />\n <Atom name=\"N2\" type=\"278\" />\n <Atom name=\"N3\" type=\"283\" />\n@@ -5015,7 +5015,7 @@\n <Atom name=\"H5''\" type=\"325\" />\n <Atom name=\"H5T\" type=\"327\" />\n <Atom name=\"H8\" type=\"286\" />\n- <Atom name=\"HO2'\" type=\"317\" />\n+ <Atom name=\"HO2'\" type=\"321\" />\n <Atom name=\"N1\" type=\"277\" />\n <Atom name=\"N2\" type=\"278\" />\n <Atom name=\"N3\" type=\"283\" />\n@@ -5085,7 +5085,7 @@\n <Atom name=\"H5''\" type=\"325\" />\n <Atom name=\"H5T\" type=\"327\" />\n <Atom name=\"H8\" type=\"286\" />\n- <Atom name=\"HO2'\" type=\"317\" />\n+ <Atom name=\"HO2'\" type=\"321\" />\n <Atom name=\"N1\" type=\"277\" />\n <Atom name=\"N2\" type=\"278\" />\n <Atom name=\"N3\" type=\"283\" />\n@@ -5151,7 +5151,7 @@\n <Atom name=\"H5'\" type=\"325\" />\n <Atom name=\"H5''\" type=\"325\" />\n <Atom name=\"H6\" type=\"310\" />\n- <Atom name=\"HO2'\" type=\"317\" />\n+ <Atom name=\"HO2'\" type=\"321\" />\n <Atom name=\"N1\" type=\"304\" />\n <Atom name=\"N3\" type=\"303\" />\n <Atom name=\"O1P\" type=\"344\" />\n@@ -5217,7 +5217,7 @@\n <Atom name=\"H5'\" type=\"325\" />\n <Atom name=\"H5''\" type=\"325\" />\n <Atom name=\"H6\" type=\"310\" />\n- <Atom name=\"HO2'\" type=\"317\" />\n+ <Atom name=\"HO2'\" type=\"321\" />\n <Atom name=\"N1\" type=\"304\" />\n <Atom name=\"N3\" type=\"303\" />\n <Atom name=\"O1P\" type=\"344\" />\n@@ -5283,7 +5283,7 @@\n <Atom name=\"H5''\" type=\"325\" />\n <Atom name=\"H5T\" type=\"327\" />\n <Atom name=\"H6\" type=\"310\" />\n- <Atom name=\"HO2'\" type=\"317\" />\n+ <Atom name=\"HO2'\" type=\"321\" />\n <Atom name=\"N1\" type=\"304\" />\n <Atom name=\"N3\" type=\"303\" />\n <Atom name=\"O2\" type=\"308\" />\n@@ -5344,7 +5344,7 @@\n <Atom name=\"H5''\" type=\"325\" />\n <Atom name=\"H5T\" type=\"327\" />\n <Atom name=\"H6\" type=\"310\" />\n- <Atom name=\"HO2'\" type=\"317\" />\n+ <Atom name=\"HO2'\" type=\"321\" />\n <Atom name=\"N1\" type=\"304\" />\n <Atom name=\"N3\" type=\"303\" />\n <Atom name=\"O2\" type=\"308\" />\ndiff --git a/wrappers/python/openmm/app/data/amoeba2018_gk.xml b/wrappers/python/openmm/app/data/amoeba2018_gk.xml\nindex 9c1a5e23ea..8c65b3b865 100644\n--- a/wrappers/python/openmm/app/data/amoeba2018_gk.xml\n+++ b/wrappers/python/openmm/app/data/amoeba2018_gk.xml\n@@ -1,7 +1,7 @@\n <ForceField>\n <Info>\n <Source>amoebabio18.prm</Source>\n- <DateGenerated>2021-11-02</DateGenerated>\n+ <DateGenerated>2021-11-04</DateGenerated>\n <Reference>Yue Shi, Zhen Xia, Jiajing Zhang, Robert Best, Chuanjie Wu, Jay W. Ponder, and Pengyu Ren. Polarizable Atomic Multipole-Based AMOEBA Force Field for Proteins. Journal of Chemical Theory and Computation, 9(9):4046\u20134063, 2013.</Reference>\n <Reference>Rae A. Corrigan, Guowei Qi, Andrew C. Thiel, Jack R. Lynn, Brandon D. Walker, Thomas L. Casavant, Louis Lagardere, Jean-Philip Piquemal, Jay W. Ponder, Pengyu Ren, and Michael J. Schnieders. Implicit Solvents for the Polarizable Atomic Multipole AMOEBA Force Field. Journal of Chemical Theory and Computation, 17(4):2323-2341, 2021.</Reference>\n </Info>\n"}, "test": {"test_patch": "diff --git a/wrappers/python/tests/TestForceField.py b/wrappers/python/tests/TestForceField.py\nindex a7e07c15f9..690d51f43e 100644\n--- a/wrappers/python/tests/TestForceField.py\n+++ b/wrappers/python/tests/TestForceField.py\n@@ -1345,23 +1345,23 @@ def test_Amoeba18BPTI(self):\n self.assertAlmostEqual(-1323.5640-225.3660, energies['AmoebaMultipoleForce'], 2)\n self.assertAlmostEqual(-258.9676, sum(list(energies.values())), 2)\n \n- def test_Amoeba18DNA(self):\n- \"\"\"Test that AMOEBA18 computes energies correctly for DNA.\"\"\"\n- energies = self.computeAmoeba18Energies('systems/dna.pdb')\n+ def test_Amoeba18Nucleic(self):\n+ \"\"\"Test that AMOEBA18 computes energies correctly for DNA and RNA.\"\"\"\n+ energies = self.computeAmoeba18Energies('systems/nucleic.pdb')\n \n # Compare to values computed with Tinker.\n \n- self.assertAlmostEqual(688.7794, energies['AmoebaBond'], 4)\n- self.assertAlmostEqual(430.5887, energies['AmoebaAngle']+energies['AmoebaInPlaneAngle'], 4)\n- self.assertAlmostEqual(10.5715, energies['AmoebaOutOfPlaneBend'], 4)\n- self.assertAlmostEqual(0.7773, energies['AmoebaStretchBend'], 4)\n- self.assertAlmostEqual(77.0482, energies['PeriodicTorsionForce'], 4)\n- self.assertAlmostEqual(56.5654, energies['AmoebaPiTorsion'], 4)\n- self.assertAlmostEqual(-0.5457, energies['AmoebaStretchTorsion'], 4)\n- self.assertAlmostEqual(-1.6044, energies['AmoebaAngleTorsion'], 4)\n- self.assertAlmostEqual(106.4062, energies['AmoebaVdwForce'], 4)\n- self.assertAlmostEqual(90.5715-73.6051, energies['AmoebaMultipoleForce'], 4)\n- self.assertAlmostEqual(1385.5529, sum(list(energies.values())), 4)\n+ self.assertAlmostEqual(749.6953, energies['AmoebaBond'], 4)\n+ self.assertAlmostEqual(579.9971, energies['AmoebaAngle']+energies['AmoebaInPlaneAngle'], 4)\n+ self.assertAlmostEqual(10.6630, energies['AmoebaOutOfPlaneBend'], 4)\n+ self.assertAlmostEqual(5.2225, energies['AmoebaStretchBend'], 4)\n+ self.assertAlmostEqual(166.7233, energies['PeriodicTorsionForce'], 4)\n+ self.assertAlmostEqual(57.2066, energies['AmoebaPiTorsion'], 4)\n+ self.assertAlmostEqual(-4.2538, energies['AmoebaStretchTorsion'], 4)\n+ self.assertAlmostEqual(-5.0402, energies['AmoebaAngleTorsion'], 4)\n+ self.assertAlmostEqual(187.1103, energies['AmoebaVdwForce'], 4)\n+ self.assertAlmostEqual(1635.1289-236.1484, energies['AmoebaMultipoleForce'], 3)\n+ self.assertAlmostEqual(3146.3046, sum(list(energies.values())), 3)\n \n if __name__ == '__main__':\n unittest.main()\ndiff --git a/wrappers/python/tests/systems/dna.pdb b/wrappers/python/tests/systems/dna.pdb\ndeleted file mode 100644\nindex 0b8e11681b..0000000000\n--- a/wrappers/python/tests/systems/dna.pdb\n+++ /dev/null\n@@ -1,355 +0,0 @@\n-REMARK 1 PDBFIXER FROM: 1A1F.pdb\n-REMARK 1 CREATED WITH OPENMM 7.6, 2021-10-20\n-CRYST1 43.000 55.900 128.400 90.00 90.00 90.00 P 1 1 \n-ATOM 1 O5' DA B 1 12.630 25.479 39.440 1.00 0.00 O \n-ATOM 2 HO5' DA B 1 11.964 26.391 39.073 1.00 0.00 H \n-ATOM 3 C5' DA B 1 13.937 25.610 38.876 1.00 0.00 C \n-ATOM 4 H5' DA B 1 13.847 25.555 37.684 1.00 0.00 H \n-ATOM 5 H5'' DA B 1 14.320 26.719 39.098 1.00 0.00 H \n-ATOM 6 C4' DA B 1 14.887 24.556 39.393 1.00 0.00 C \n-ATOM 7 H4' DA B 1 15.954 24.787 38.908 1.00 0.00 H \n-ATOM 8 O4' DA B 1 15.100 24.749 40.813 1.00 0.00 O \n-ATOM 9 C3' DA B 1 14.387 23.120 39.235 1.00 0.00 C \n-ATOM 10 H3' DA B 1 13.785 23.006 38.210 1.00 0.00 H \n-ATOM 11 O3' DA B 1 15.483 22.256 38.923 1.00 0.00 O \n-ATOM 12 C2' DA B 1 13.819 22.795 40.604 1.00 0.00 C \n-ATOM 13 H2' DA B 1 13.713 21.844 41.301 1.00 0.00 H \n-ATOM 14 H2'' DA B 1 12.674 22.887 40.274 1.00 0.00 H \n-ATOM 15 C1' DA B 1 14.742 23.573 41.522 1.00 0.00 C \n-ATOM 16 H1' DA B 1 15.848 23.231 41.807 1.00 0.00 H \n-ATOM 17 N9 DA B 1 14.136 23.979 42.789 1.00 0.00 N \n-ATOM 18 C8 DA B 1 14.571 23.668 44.053 1.00 0.00 C \n-ATOM 19 H8 DA B 1 15.664 23.489 44.485 1.00 0.00 H \n-ATOM 20 N7 DA B 1 13.823 24.162 45.006 1.00 0.00 N \n-ATOM 21 C5 DA B 1 12.827 24.850 44.330 1.00 0.00 C \n-ATOM 22 C6 DA B 1 11.720 25.593 44.773 1.00 0.00 C \n-ATOM 23 N6 DA B 1 11.417 25.776 46.062 1.00 0.00 N \n-ATOM 24 H61 DA B 1 12.028 26.574 46.696 1.00 0.00 H \n-ATOM 25 H62 DA B 1 10.394 25.442 46.564 1.00 0.00 H \n-ATOM 26 N1 DA B 1 10.922 26.154 43.837 1.00 0.00 N \n-ATOM 27 C2 DA B 1 11.225 25.969 42.547 1.00 0.00 C \n-ATOM 28 H2 DA B 1 10.436 26.545 41.871 1.00 0.00 H \n-ATOM 29 N3 DA B 1 12.236 25.291 42.006 1.00 0.00 N \n-ATOM 30 C4 DA B 1 13.008 24.748 42.962 1.00 0.00 C \n-ATOM 31 P DG B 2 15.226 20.682 38.734 1.00 0.00 P \n-ATOM 32 OP1 DG B 2 16.366 20.118 37.964 1.00 0.00 O \n-ATOM 33 OP2 DG B 2 13.841 20.501 38.232 1.00 0.00 O \n-ATOM 34 O5' DG B 2 15.303 20.113 40.220 1.00 0.00 O \n-ATOM 35 C5' DG B 2 16.564 20.044 40.908 1.00 0.00 C \n-ATOM 36 H5' DG B 2 17.381 19.597 40.156 1.00 0.00 H \n-ATOM 37 H5'' DG B 2 17.086 21.063 41.251 1.00 0.00 H \n-ATOM 38 C4' DG B 2 16.468 19.107 42.089 1.00 0.00 C \n-ATOM 39 H4' DG B 2 17.563 18.934 42.535 1.00 0.00 H \n-ATOM 40 O4' DG B 2 15.772 19.742 43.187 1.00 0.00 O \n-ATOM 41 C3' DG B 2 15.724 17.801 41.812 1.00 0.00 C \n-ATOM 42 H3' DG B 2 15.943 17.448 40.693 1.00 0.00 H \n-ATOM 43 O3' DG B 2 16.404 16.721 42.454 1.00 0.00 O \n-ATOM 44 C2' DG B 2 14.356 18.037 42.428 1.00 0.00 C \n-ATOM 45 H2' DG B 2 13.519 17.374 42.946 1.00 0.00 H \n-ATOM 46 H2'' DG B 2 13.741 18.042 41.408 1.00 0.00 H \n-ATOM 47 C1' DG B 2 14.687 18.932 43.612 1.00 0.00 C \n-ATOM 48 H1' DG B 2 15.209 18.469 44.578 1.00 0.00 H \n-ATOM 49 N9 DG B 2 13.611 19.821 44.041 1.00 0.00 N \n-ATOM 50 C8 DG B 2 12.734 20.510 43.240 1.00 0.00 C \n-ATOM 51 H8 DG B 2 12.123 20.172 42.277 1.00 0.00 H \n-ATOM 52 N7 DG B 2 11.901 21.254 43.916 1.00 0.00 N \n-ATOM 53 C5 DG B 2 12.245 21.037 45.242 1.00 0.00 C \n-ATOM 54 C6 DG B 2 11.694 21.577 46.434 1.00 0.00 C \n-ATOM 55 O6 DG B 2 10.765 22.385 46.558 1.00 0.00 O \n-ATOM 56 N1 DG B 2 12.343 21.088 47.565 1.00 0.00 N \n-ATOM 57 H1 DG B 2 12.034 21.627 48.579 1.00 0.00 H \n-ATOM 58 C2 DG B 2 13.385 20.195 47.550 1.00 0.00 C \n-ATOM 59 N2 DG B 2 13.880 19.840 48.746 1.00 0.00 N \n-ATOM 60 H21 DG B 2 13.601 18.971 49.506 1.00 0.00 H \n-ATOM 61 H22 DG B 2 14.797 20.478 49.156 1.00 0.00 H \n-ATOM 62 N3 DG B 2 13.907 19.685 46.447 1.00 0.00 N \n-ATOM 63 C4 DG B 2 13.293 20.148 45.338 1.00 0.00 C \n-ATOM 64 P DC B 3 15.864 15.221 42.273 1.00 0.00 P \n-ATOM 65 OP1 DC B 3 17.025 14.295 42.340 1.00 0.00 O \n-ATOM 66 OP2 DC B 3 14.972 15.195 41.084 1.00 0.00 O \n-ATOM 67 O5' DC B 3 14.974 15.005 43.572 1.00 0.00 O \n-ATOM 68 C5' DC B 3 15.560 15.108 44.879 1.00 0.00 C \n-ATOM 69 H5' DC B 3 16.337 14.196 44.900 1.00 0.00 H \n-ATOM 70 H5'' DC B 3 16.263 16.031 45.163 1.00 0.00 H \n-ATOM 71 C4' DC B 3 14.517 14.859 45.942 1.00 0.00 C \n-ATOM 72 H4' DC B 3 15.122 14.737 46.965 1.00 0.00 H \n-ATOM 73 O4' DC B 3 13.696 16.033 46.161 1.00 0.00 O \n-ATOM 74 C3' DC B 3 13.548 13.717 45.633 1.00 0.00 C \n-ATOM 75 H3' DC B 3 13.922 12.887 44.864 1.00 0.00 H \n-ATOM 76 O3' DC B 3 13.288 12.999 46.834 1.00 0.00 O \n-ATOM 77 C2' DC B 3 12.277 14.444 45.236 1.00 0.00 C \n-ATOM 78 H2' DC B 3 12.390 14.463 44.045 1.00 0.00 H \n-ATOM 79 H2'' DC B 3 11.213 13.901 45.256 1.00 0.00 H \n-ATOM 80 C1' DC B 3 12.347 15.607 46.198 1.00 0.00 C \n-ATOM 81 H1' DC B 3 12.304 15.359 47.361 1.00 0.00 H \n-ATOM 82 N1 DC B 3 11.482 16.758 45.904 1.00 0.00 N \n-ATOM 83 C2 DC B 3 11.098 17.584 46.962 1.00 0.00 C \n-ATOM 84 O2 DC B 3 11.548 17.354 48.096 1.00 0.00 O \n-ATOM 85 N3 DC B 3 10.253 18.611 46.727 1.00 0.00 N \n-ATOM 86 C4 DC B 3 9.802 18.833 45.491 1.00 0.00 C \n-ATOM 87 N4 DC B 3 8.947 19.842 45.313 1.00 0.00 N \n-ATOM 88 H41 DC B 3 8.547 20.581 46.157 1.00 0.00 H \n-ATOM 89 H42 DC B 3 8.161 19.901 44.421 1.00 0.00 H \n-ATOM 90 C5 DC B 3 10.202 18.026 44.386 1.00 0.00 C \n-ATOM 91 H5 DC B 3 9.521 18.038 43.410 1.00 0.00 H \n-ATOM 92 C6 DC B 3 11.038 17.009 44.636 1.00 0.00 C \n-ATOM 93 H6 DC B 3 10.939 16.341 43.660 1.00 0.00 H \n-ATOM 94 P DG B 4 13.014 11.424 46.779 1.00 0.00 P \n-ATOM 95 OP1 DG B 4 14.232 10.763 46.245 1.00 0.00 O \n-ATOM 96 OP2 DG B 4 11.710 11.208 46.113 1.00 0.00 O \n-ATOM 97 O5' DG B 4 12.864 11.047 48.316 1.00 0.00 O \n-ATOM 98 C5' DG B 4 13.816 11.527 49.282 1.00 0.00 C \n-ATOM 99 H5' DG B 4 14.467 10.534 49.439 1.00 0.00 H \n-ATOM 100 H5'' DG B 4 14.678 12.307 49.007 1.00 0.00 H \n-ATOM 101 C4' DG B 4 13.106 11.987 50.532 1.00 0.00 C \n-ATOM 102 H4' DG B 4 13.920 12.259 51.363 1.00 0.00 H \n-ATOM 103 O4' DG B 4 12.426 13.246 50.296 1.00 0.00 O \n-ATOM 104 C3' DG B 4 12.042 11.016 51.035 1.00 0.00 C \n-ATOM 105 H3' DG B 4 12.311 9.908 50.684 1.00 0.00 H \n-ATOM 106 O3' DG B 4 12.112 10.908 52.455 1.00 0.00 O \n-ATOM 107 C2' DG B 4 10.737 11.650 50.588 1.00 0.00 C \n-ATOM 108 H2' DG B 4 9.745 11.499 51.222 1.00 0.00 H \n-ATOM 109 H2'' DG B 4 10.508 11.040 49.590 1.00 0.00 H \n-ATOM 110 C1' DG B 4 11.051 13.136 50.637 1.00 0.00 C \n-ATOM 111 H1' DG B 4 11.118 13.759 51.653 1.00 0.00 H \n-ATOM 112 N9 DG B 4 10.288 13.945 49.690 1.00 0.00 N \n-ATOM 113 C8 DG B 4 10.397 13.932 48.320 1.00 0.00 C \n-ATOM 114 H8 DG B 4 10.700 12.998 47.669 1.00 0.00 H \n-ATOM 115 N7 DG B 4 9.590 14.772 47.733 1.00 0.00 N \n-ATOM 116 C5 DG B 4 8.902 15.376 48.777 1.00 0.00 C \n-ATOM 117 C6 DG B 4 7.893 16.376 48.755 1.00 0.00 C \n-ATOM 118 O6 DG B 4 7.390 16.944 47.780 1.00 0.00 O \n-ATOM 119 N1 DG B 4 7.466 16.699 50.038 1.00 0.00 N \n-ATOM 120 H1 DG B 4 6.826 17.700 50.082 1.00 0.00 H \n-ATOM 121 C2 DG B 4 7.948 16.135 51.194 1.00 0.00 C \n-ATOM 122 N2 DG B 4 7.403 16.579 52.334 1.00 0.00 N \n-ATOM 123 H21 DG B 4 6.624 16.199 53.146 1.00 0.00 H \n-ATOM 124 H22 DG B 4 7.866 17.602 52.732 1.00 0.00 H \n-ATOM 125 N3 DG B 4 8.891 15.207 51.230 1.00 0.00 N \n-ATOM 126 C4 DG B 4 9.320 14.875 49.992 1.00 0.00 C \n-ATOM 127 P DT B 5 11.265 9.771 53.202 1.00 0.00 P \n-ATOM 128 OP1 DT B 5 11.788 9.633 54.588 1.00 0.00 O \n-ATOM 129 OP2 DT B 5 11.213 8.581 52.315 1.00 0.00 O \n-ATOM 130 O5' DT B 5 9.810 10.411 53.273 1.00 0.00 O \n-ATOM 131 C5' DT B 5 9.586 11.626 54.005 1.00 0.00 C \n-ATOM 132 H5' DT B 5 10.246 12.621 53.958 1.00 0.00 H \n-ATOM 133 H5'' DT B 5 9.837 11.252 55.117 1.00 0.00 H \n-ATOM 134 C4' DT B 5 8.119 11.985 53.982 1.00 0.00 C \n-ATOM 135 H4' DT B 5 7.928 12.699 54.920 1.00 0.00 H \n-ATOM 136 O4' DT B 5 7.780 12.784 52.821 1.00 0.00 O \n-ATOM 137 C3' DT B 5 7.175 10.781 53.962 1.00 0.00 C \n-ATOM 138 H3' DT B 5 7.620 9.765 54.404 1.00 0.00 H \n-ATOM 139 O3' DT B 5 6.090 11.008 54.854 1.00 0.00 O \n-ATOM 140 C2' DT B 5 6.651 10.774 52.536 1.00 0.00 C \n-ATOM 141 H2' DT B 5 5.668 10.207 52.178 1.00 0.00 H \n-ATOM 142 H2'' DT B 5 7.419 9.961 52.113 1.00 0.00 H \n-ATOM 143 C1' DT B 5 6.585 12.263 52.269 1.00 0.00 C \n-ATOM 144 H1' DT B 5 5.746 12.801 52.923 1.00 0.00 H \n-ATOM 145 N1 DT B 5 6.498 12.678 50.855 1.00 0.00 N \n-ATOM 146 C2 DT B 5 5.745 13.797 50.569 1.00 0.00 C \n-ATOM 147 O2 DT B 5 5.193 14.468 51.427 1.00 0.00 O \n-ATOM 148 N3 DT B 5 5.666 14.108 49.237 1.00 0.00 N \n-ATOM 149 H3 DT B 5 4.888 14.950 48.918 1.00 0.00 H \n-ATOM 150 C4 DT B 5 6.256 13.434 48.185 1.00 0.00 C \n-ATOM 151 O4 DT B 5 6.085 13.827 47.035 1.00 0.00 O \n-ATOM 152 C5 DT B 5 7.048 12.282 48.559 1.00 0.00 C \n-ATOM 153 C7 DT B 5 7.738 11.499 47.487 1.00 0.00 C \n-ATOM 154 H71 DT B 5 7.935 10.333 47.683 1.00 0.00 H \n-ATOM 155 H72 DT B 5 8.688 11.872 46.862 1.00 0.00 H \n-ATOM 156 H73 DT B 5 6.874 11.333 46.672 1.00 0.00 H \n-ATOM 157 C6 DT B 5 7.128 11.966 49.859 1.00 0.00 C \n-ATOM 158 H6 DT B 5 7.250 10.793 49.960 1.00 0.00 H \n-ATOM 159 P DG B 6 5.237 9.765 55.398 1.00 0.00 P \n-ATOM 160 OP1 DG B 6 5.824 9.352 56.698 1.00 0.00 O \n-ATOM 161 OP2 DG B 6 5.098 8.771 54.303 1.00 0.00 O \n-ATOM 162 O5' DG B 6 3.808 10.404 55.671 1.00 0.00 O \n-ATOM 163 C5' DG B 6 3.681 11.632 56.401 1.00 0.00 C \n-ATOM 164 H5' DG B 6 3.707 11.294 57.554 1.00 0.00 H \n-ATOM 165 H5'' DG B 6 4.575 12.423 56.380 1.00 0.00 H \n-ATOM 166 C4' DG B 6 2.372 12.298 56.056 1.00 0.00 C \n-ATOM 167 H4' DG B 6 2.192 13.200 56.815 1.00 0.00 H \n-ATOM 168 O4' DG B 6 2.476 12.952 54.766 1.00 0.00 O \n-ATOM 169 C3' DG B 6 1.216 11.306 55.946 1.00 0.00 C \n-ATOM 170 H3' DG B 6 1.380 10.322 56.602 1.00 0.00 H \n-ATOM 171 O3' DG B 6 0.041 11.808 56.580 1.00 0.00 O \n-ATOM 172 C2' DG B 6 1.008 11.156 54.450 1.00 0.00 C \n-ATOM 173 H2' DG B 6 -0.074 10.848 54.091 1.00 0.00 H \n-ATOM 174 H2'' DG B 6 1.628 10.170 54.208 1.00 0.00 H \n-ATOM 175 C1' DG B 6 1.450 12.498 53.898 1.00 0.00 C \n-ATOM 176 H1' DG B 6 0.746 13.460 53.933 1.00 0.00 H \n-ATOM 177 N9 DG B 6 2.008 12.399 52.553 1.00 0.00 N \n-ATOM 178 C8 DG B 6 3.086 11.641 52.165 1.00 0.00 C \n-ATOM 179 H8 DG B 6 3.275 10.500 52.415 1.00 0.00 H \n-ATOM 180 N7 DG B 6 3.331 11.711 50.885 1.00 0.00 N \n-ATOM 181 C5 DG B 6 2.365 12.577 50.396 1.00 0.00 C \n-ATOM 182 C6 DG B 6 2.124 13.030 49.071 1.00 0.00 C \n-ATOM 183 O6 DG B 6 2.734 12.739 48.035 1.00 0.00 O \n-ATOM 184 N1 DG B 6 1.043 13.905 49.018 1.00 0.00 N \n-ATOM 185 H1 DG B 6 1.060 14.502 47.990 1.00 0.00 H \n-ATOM 186 C2 DG B 6 0.291 14.296 50.099 1.00 0.00 C \n-ATOM 187 N2 DG B 6 -0.705 15.160 49.843 1.00 0.00 N \n-ATOM 188 H21 DG B 6 -1.586 15.476 50.576 1.00 0.00 H \n-ATOM 189 H22 DG B 6 -0.532 16.124 49.164 1.00 0.00 H \n-ATOM 190 N3 DG B 6 0.500 13.876 51.338 1.00 0.00 N \n-ATOM 191 C4 DG B 6 1.545 13.022 51.412 1.00 0.00 C \n-ATOM 192 P DG B 7 -1.292 10.912 56.593 1.00 0.00 P \n-ATOM 193 OP1 DG B 7 -1.938 11.043 57.924 1.00 0.00 O \n-ATOM 194 OP2 DG B 7 -0.944 9.562 56.073 1.00 0.00 O \n-ATOM 195 O5' DG B 7 -2.205 11.644 55.520 1.00 0.00 O \n-ATOM 196 C5' DG B 7 -2.381 13.065 55.580 1.00 0.00 C \n-ATOM 197 H5' DG B 7 -2.843 13.278 56.665 1.00 0.00 H \n-ATOM 198 H5'' DG B 7 -1.445 13.806 55.543 1.00 0.00 H \n-ATOM 199 C4' DG B 7 -3.371 13.512 54.533 1.00 0.00 C \n-ATOM 200 H4' DG B 7 -3.635 14.661 54.725 1.00 0.00 H \n-ATOM 201 O4' DG B 7 -2.752 13.517 53.224 1.00 0.00 O \n-ATOM 202 C3' DG B 7 -4.600 12.614 54.425 1.00 0.00 C \n-ATOM 203 H3' DG B 7 -4.864 12.050 55.442 1.00 0.00 H \n-ATOM 204 O3' DG B 7 -5.761 13.425 54.250 1.00 0.00 O \n-ATOM 205 C2' DG B 7 -4.320 11.780 53.185 1.00 0.00 C \n-ATOM 206 H2' DG B 7 -5.174 11.039 52.810 1.00 0.00 H \n-ATOM 207 H2'' DG B 7 -3.641 10.879 53.582 1.00 0.00 H \n-ATOM 208 C1' DG B 7 -3.527 12.748 52.321 1.00 0.00 C \n-ATOM 209 H1' DG B 7 -4.068 13.642 51.750 1.00 0.00 H \n-ATOM 210 N9 DG B 7 -2.614 12.128 51.364 1.00 0.00 N \n-ATOM 211 C8 DG B 7 -1.592 11.253 51.642 1.00 0.00 C \n-ATOM 212 H8 DG B 7 -1.578 10.228 52.242 1.00 0.00 H \n-ATOM 213 N7 DG B 7 -0.936 10.878 50.578 1.00 0.00 N \n-ATOM 214 C5 DG B 7 -1.561 11.543 49.532 1.00 0.00 C \n-ATOM 215 C6 DG B 7 -1.288 11.534 48.137 1.00 0.00 C \n-ATOM 216 O6 DG B 7 -0.405 10.917 47.528 1.00 0.00 O \n-ATOM 217 N1 DG B 7 -2.170 12.347 47.435 1.00 0.00 N \n-ATOM 218 H1 DG B 7 -1.721 12.605 46.365 1.00 0.00 H \n-ATOM 219 C2 DG B 7 -3.184 13.079 48.001 1.00 0.00 C \n-ATOM 220 N2 DG B 7 -3.933 13.798 47.152 1.00 0.00 N \n-ATOM 221 H21 DG B 7 -3.920 13.900 45.967 1.00 0.00 H \n-ATOM 222 H22 DG B 7 -4.449 14.789 47.563 1.00 0.00 H \n-ATOM 223 N3 DG B 7 -3.447 13.103 49.299 1.00 0.00 N \n-ATOM 224 C4 DG B 7 -2.604 12.317 50.000 1.00 0.00 C \n-ATOM 225 P DG B 8 -7.216 12.809 54.530 1.00 0.00 P \n-ATOM 226 OP1 DG B 8 -7.817 13.525 55.680 1.00 0.00 O \n-ATOM 227 OP2 DG B 8 -7.079 11.329 54.572 1.00 0.00 O \n-ATOM 228 O5' DG B 8 -8.012 13.201 53.209 1.00 0.00 O \n-ATOM 229 C5' DG B 8 -7.333 13.192 51.948 1.00 0.00 C \n-ATOM 230 H5' DG B 8 -6.799 14.262 52.013 1.00 0.00 H \n-ATOM 231 H5'' DG B 8 -6.645 12.277 51.662 1.00 0.00 H \n-ATOM 232 C4' DG B 8 -8.283 13.522 50.823 1.00 0.00 C \n-ATOM 233 H4' DG B 8 -8.616 14.669 50.800 1.00 0.00 H \n-ATOM 234 O4' DG B 8 -7.552 13.316 49.595 1.00 0.00 O \n-ATOM 235 C3' DG B 8 -9.485 12.592 50.727 1.00 0.00 C \n-ATOM 236 H3' DG B 8 -10.052 12.410 51.761 1.00 0.00 H \n-ATOM 237 O3' DG B 8 -10.560 13.263 50.065 1.00 0.00 O \n-ATOM 238 C2' DG B 8 -8.956 11.434 49.904 1.00 0.00 C \n-ATOM 239 H2' DG B 8 -9.636 10.571 49.440 1.00 0.00 H \n-ATOM 240 H2'' DG B 8 -8.640 10.717 50.812 1.00 0.00 H \n-ATOM 241 C1' DG B 8 -7.933 12.089 48.986 1.00 0.00 C \n-ATOM 242 H1' DG B 8 -8.111 12.573 47.915 1.00 0.00 H \n-ATOM 243 N9 DG B 8 -6.725 11.288 48.835 1.00 0.00 N \n-ATOM 244 C8 DG B 8 -6.007 10.683 49.838 1.00 0.00 C \n-ATOM 245 H8 DG B 8 -6.343 9.912 50.682 1.00 0.00 H \n-ATOM 246 N7 DG B 8 -4.963 10.035 49.403 1.00 0.00 N \n-ATOM 247 C5 DG B 8 -4.995 10.221 48.027 1.00 0.00 C \n-ATOM 248 C6 DG B 8 -4.117 9.755 47.019 1.00 0.00 C \n-ATOM 249 O6 DG B 8 -3.098 9.063 47.143 1.00 0.00 O \n-ATOM 250 N1 DG B 8 -4.523 10.171 45.755 1.00 0.00 N \n-ATOM 251 H1 DG B 8 -3.672 10.053 44.933 1.00 0.00 H \n-ATOM 252 C2 DG B 8 -5.631 10.940 45.497 1.00 0.00 C \n-ATOM 253 N2 DG B 8 -5.863 11.231 44.211 1.00 0.00 N \n-ATOM 254 H21 DG B 8 -6.205 12.333 43.914 1.00 0.00 H \n-ATOM 255 H22 DG B 8 -5.647 10.649 43.196 1.00 0.00 H \n-ATOM 256 N3 DG B 8 -6.455 11.386 46.429 1.00 0.00 N \n-ATOM 257 C4 DG B 8 -6.079 10.990 47.663 1.00 0.00 C \n-ATOM 258 P DA B 9 -11.751 12.405 49.416 1.00 0.00 P \n-ATOM 259 OP1 DA B 9 -12.764 13.349 48.874 1.00 0.00 O \n-ATOM 260 OP2 DA B 9 -12.158 11.384 50.414 1.00 0.00 O \n-ATOM 261 O5' DA B 9 -11.057 11.661 48.193 1.00 0.00 O \n-ATOM 262 C5' DA B 9 -10.733 12.374 46.988 1.00 0.00 C \n-ATOM 263 H5' DA B 9 -11.719 13.021 46.773 1.00 0.00 H \n-ATOM 264 H5'' DA B 9 -9.956 13.272 46.838 1.00 0.00 H \n-ATOM 265 C4' DA B 9 -10.690 11.427 45.813 1.00 0.00 C \n-ATOM 266 H4' DA B 9 -10.665 12.076 44.812 1.00 0.00 H \n-ATOM 267 O4' DA B 9 -9.442 10.691 45.798 1.00 0.00 O \n-ATOM 268 C3' DA B 9 -11.808 10.383 45.788 1.00 0.00 C \n-ATOM 269 H3' DA B 9 -12.847 10.675 46.296 1.00 0.00 H \n-ATOM 270 O3' DA B 9 -12.346 10.271 44.468 1.00 0.00 O \n-ATOM 271 C2' DA B 9 -11.110 9.102 46.215 1.00 0.00 C \n-ATOM 272 H2' DA B 9 -11.460 9.018 47.357 1.00 0.00 H \n-ATOM 273 H2'' DA B 9 -11.417 7.980 45.948 1.00 0.00 H \n-ATOM 274 C1' DA B 9 -9.699 9.298 45.690 1.00 0.00 C \n-ATOM 275 H1' DA B 9 -9.382 9.150 44.555 1.00 0.00 H \n-ATOM 276 N9 DA B 9 -8.668 8.591 46.453 1.00 0.00 N \n-ATOM 277 C8 DA B 9 -8.651 8.323 47.800 1.00 0.00 C \n-ATOM 278 H8 DA B 9 -9.441 7.999 48.630 1.00 0.00 H \n-ATOM 279 N7 DA B 9 -7.583 7.674 48.197 1.00 0.00 N \n-ATOM 280 C5 DA B 9 -6.847 7.499 47.035 1.00 0.00 C \n-ATOM 281 C6 DA B 9 -5.604 6.887 46.779 1.00 0.00 C \n-ATOM 282 N6 DA B 9 -4.854 6.309 47.723 1.00 0.00 N \n-ATOM 283 H61 DA B 9 -5.162 5.894 48.793 1.00 0.00 H \n-ATOM 284 H62 DA B 9 -3.700 6.080 47.543 1.00 0.00 H \n-ATOM 285 N1 DA B 9 -5.151 6.885 45.507 1.00 0.00 N \n-ATOM 286 C2 DA B 9 -5.902 7.464 44.560 1.00 0.00 C \n-ATOM 287 H2 DA B 9 -5.380 7.375 43.495 1.00 0.00 H \n-ATOM 288 N3 DA B 9 -7.081 8.073 44.673 1.00 0.00 N \n-ATOM 289 C4 DA B 9 -7.504 8.058 45.950 1.00 0.00 C \n-ATOM 290 P DC B 10 -13.178 8.962 44.054 1.00 0.00 P \n-ATOM 291 OP1 DC B 10 -14.144 9.344 42.993 1.00 0.00 O \n-ATOM 292 OP2 DC B 10 -13.671 8.310 45.292 1.00 0.00 O \n-ATOM 293 O5' DC B 10 -12.063 8.033 43.404 1.00 0.00 O \n-ATOM 294 C5' DC B 10 -11.099 8.599 42.500 1.00 0.00 C \n-ATOM 295 H5' DC B 10 -10.454 9.603 42.575 1.00 0.00 H \n-ATOM 296 H5'' DC B 10 -11.833 8.980 41.630 1.00 0.00 H \n-ATOM 297 C4' DC B 10 -10.275 7.511 41.855 1.00 0.00 C \n-ATOM 298 H4' DC B 10 -9.635 7.997 40.971 1.00 0.00 H \n-ATOM 299 O4' DC B 10 -9.267 7.016 42.769 1.00 0.00 O \n-ATOM 300 C3' DC B 10 -11.076 6.292 41.394 1.00 0.00 C \n-ATOM 301 H3' DC B 10 -12.235 6.507 41.222 1.00 0.00 H \n-ATOM 302 O3' DC B 10 -10.619 5.884 40.105 1.00 0.00 O \n-ATOM 303 C2' DC B 10 -10.736 5.236 42.431 1.00 0.00 C \n-ATOM 304 H2' DC B 10 -10.767 4.142 41.962 1.00 0.00 H \n-ATOM 305 H2'' DC B 10 -11.689 5.163 43.148 1.00 0.00 H \n-ATOM 306 C1' DC B 10 -9.305 5.601 42.777 1.00 0.00 C \n-ATOM 307 H1' DC B 10 -8.548 5.359 41.889 1.00 0.00 H \n-ATOM 308 N1 DC B 10 -8.831 5.138 44.090 1.00 0.00 N \n-ATOM 309 C2 DC B 10 -7.597 4.482 44.160 1.00 0.00 C \n-ATOM 310 O2 DC B 10 -6.943 4.320 43.119 1.00 0.00 O \n-ATOM 311 N3 DC B 10 -7.149 4.039 45.356 1.00 0.00 N \n-ATOM 312 C4 DC B 10 -7.880 4.232 46.454 1.00 0.00 C \n-ATOM 313 N4 DC B 10 -7.398 3.774 47.611 1.00 0.00 N \n-ATOM 314 H41 DC B 10 -6.352 3.206 47.664 1.00 0.00 H \n-ATOM 315 H42 DC B 10 -7.862 3.801 48.707 1.00 0.00 H \n-ATOM 316 C5 DC B 10 -9.139 4.903 46.415 1.00 0.00 C \n-ATOM 317 H5 DC B 10 -9.862 4.756 47.349 1.00 0.00 H \n-ATOM 318 C6 DC B 10 -9.572 5.337 45.222 1.00 0.00 C \n-ATOM 319 H6 DC B 10 -10.752 5.405 45.349 1.00 0.00 H \n-ATOM 320 P DC B 11 -11.594 5.053 39.141 1.00 0.00 P \n-ATOM 321 OP1 DC B 11 -11.628 5.743 37.831 1.00 0.00 O \n-ATOM 322 OP2 DC B 11 -12.865 4.793 39.870 1.00 0.00 O \n-ATOM 323 O5' DC B 11 -10.825 3.671 38.964 1.00 0.00 O \n-ATOM 324 C5' DC B 11 -9.528 3.640 38.348 1.00 0.00 C \n-ATOM 325 H5' DC B 11 -9.805 3.864 37.210 1.00 0.00 H \n-ATOM 326 H5'' DC B 11 -8.750 4.530 38.539 1.00 0.00 H \n-ATOM 327 C4' DC B 11 -8.879 2.291 38.548 1.00 0.00 C \n-ATOM 328 H4' DC B 11 -7.859 2.416 37.937 1.00 0.00 H \n-ATOM 329 O4' DC B 11 -8.352 2.162 39.892 1.00 0.00 O \n-ATOM 330 C3' DC B 11 -9.799 1.087 38.334 1.00 0.00 C \n-ATOM 331 H3' DC B 11 -10.720 1.074 37.577 1.00 0.00 H \n-ATOM 332 O3' DC B 11 -9.042 0.047 37.715 1.00 0.00 O \n-ATOM 333 HO3' DC B 11 -7.920 0.397 37.606 1.00 0.00 H \n-ATOM 334 C2' DC B 11 -10.109 0.639 39.752 1.00 0.00 C \n-ATOM 335 H2' DC B 11 -11.208 1.047 39.943 1.00 0.00 H \n-ATOM 336 H2'' DC B 11 -10.299 -0.541 39.788 1.00 0.00 H \n-ATOM 337 C1' DC B 11 -8.783 0.923 40.428 1.00 0.00 C \n-ATOM 338 H1' DC B 11 -7.981 0.080 40.161 1.00 0.00 H \n-ATOM 339 N1 DC B 11 -8.798 1.033 41.897 1.00 0.00 N \n-ATOM 340 C2 DC B 11 -7.693 0.559 42.606 1.00 0.00 C \n-ATOM 341 O2 DC B 11 -6.735 0.093 41.973 1.00 0.00 O \n-ATOM 342 N3 DC B 11 -7.693 0.620 43.956 1.00 0.00 N \n-ATOM 343 C4 DC B 11 -8.740 1.138 44.599 1.00 0.00 C \n-ATOM 344 N4 DC B 11 -8.699 1.168 45.935 1.00 0.00 N \n-ATOM 345 H41 DC B 11 -8.686 1.621 47.028 1.00 0.00 H \n-ATOM 346 H42 DC B 11 -8.923 0.018 46.156 1.00 0.00 H \n-ATOM 347 C5 DC B 11 -9.876 1.644 43.902 1.00 0.00 C \n-ATOM 348 H5 DC B 11 -10.872 1.636 44.553 1.00 0.00 H \n-ATOM 349 C6 DC B 11 -9.864 1.573 42.562 1.00 0.00 C \n-ATOM 350 H6 DC B 11 -10.995 1.384 42.247 1.00 0.00 H \n-TER 351 DC B 11\n-END\ndiff --git a/wrappers/python/tests/systems/nucleic.pdb b/wrappers/python/tests/systems/nucleic.pdb\nnew file mode 100644\nindex 0000000000..bef54675ca\n--- /dev/null\n+++ b/wrappers/python/tests/systems/nucleic.pdb\n@@ -0,0 +1,772 @@\n+REMARK 1 CREATED WITH OPENMM 7.6, 2021-11-04\n+CRYST1 43.000 55.900 128.400 90.00 90.00 90.00 P 1 1 \n+ATOM 1 O5' DA A 1 12.630 25.479 39.440 1.00 0.00 O \n+ATOM 2 HO5' DA A 1 11.964 26.391 39.073 1.00 0.00 H \n+ATOM 3 C5' DA A 1 13.937 25.610 38.876 1.00 0.00 C \n+ATOM 4 H5' DA A 1 13.847 25.555 37.684 1.00 0.00 H \n+ATOM 5 H5'' DA A 1 14.320 26.719 39.098 1.00 0.00 H \n+ATOM 6 C4' DA A 1 14.887 24.556 39.393 1.00 0.00 C \n+ATOM 7 H4' DA A 1 15.954 24.787 38.908 1.00 0.00 H \n+ATOM 8 O4' DA A 1 15.100 24.749 40.813 1.00 0.00 O \n+ATOM 9 C3' DA A 1 14.387 23.120 39.235 1.00 0.00 C \n+ATOM 10 H3' DA A 1 13.785 23.006 38.210 1.00 0.00 H \n+ATOM 11 O3' DA A 1 15.483 22.256 38.923 1.00 0.00 O \n+ATOM 12 C2' DA A 1 13.819 22.795 40.604 1.00 0.00 C \n+ATOM 13 H2' DA A 1 13.713 21.844 41.301 1.00 0.00 H \n+ATOM 14 H2'' DA A 1 12.674 22.887 40.274 1.00 0.00 H \n+ATOM 15 C1' DA A 1 14.742 23.573 41.522 1.00 0.00 C \n+ATOM 16 H1' DA A 1 15.848 23.231 41.807 1.00 0.00 H \n+ATOM 17 N9 DA A 1 14.136 23.979 42.789 1.00 0.00 N \n+ATOM 18 C8 DA A 1 14.571 23.668 44.053 1.00 0.00 C \n+ATOM 19 H8 DA A 1 15.664 23.489 44.485 1.00 0.00 H \n+ATOM 20 N7 DA A 1 13.823 24.162 45.006 1.00 0.00 N \n+ATOM 21 C5 DA A 1 12.827 24.850 44.330 1.00 0.00 C \n+ATOM 22 C6 DA A 1 11.720 25.593 44.773 1.00 0.00 C \n+ATOM 23 N6 DA A 1 11.417 25.776 46.062 1.00 0.00 N \n+ATOM 24 H61 DA A 1 12.028 26.574 46.696 1.00 0.00 H \n+ATOM 25 H62 DA A 1 10.394 25.442 46.564 1.00 0.00 H \n+ATOM 26 N1 DA A 1 10.922 26.154 43.837 1.00 0.00 N \n+ATOM 27 C2 DA A 1 11.225 25.969 42.547 1.00 0.00 C \n+ATOM 28 H2 DA A 1 10.436 26.545 41.871 1.00 0.00 H \n+ATOM 29 N3 DA A 1 12.236 25.291 42.006 1.00 0.00 N \n+ATOM 30 C4 DA A 1 13.008 24.748 42.962 1.00 0.00 C \n+ATOM 31 P DG A 2 15.226 20.682 38.734 1.00 0.00 P \n+ATOM 32 OP1 DG A 2 16.366 20.118 37.964 1.00 0.00 O \n+ATOM 33 OP2 DG A 2 13.841 20.501 38.232 1.00 0.00 O \n+ATOM 34 O5' DG A 2 15.303 20.113 40.220 1.00 0.00 O \n+ATOM 35 C5' DG A 2 16.564 20.044 40.908 1.00 0.00 C \n+ATOM 36 H5' DG A 2 17.381 19.597 40.156 1.00 0.00 H \n+ATOM 37 H5'' DG A 2 17.086 21.063 41.251 1.00 0.00 H \n+ATOM 38 C4' DG A 2 16.468 19.107 42.089 1.00 0.00 C \n+ATOM 39 H4' DG A 2 17.563 18.934 42.535 1.00 0.00 H \n+ATOM 40 O4' DG A 2 15.772 19.742 43.187 1.00 0.00 O \n+ATOM 41 C3' DG A 2 15.724 17.801 41.812 1.00 0.00 C \n+ATOM 42 H3' DG A 2 15.943 17.448 40.693 1.00 0.00 H \n+ATOM 43 O3' DG A 2 16.404 16.721 42.454 1.00 0.00 O \n+ATOM 44 C2' DG A 2 14.356 18.037 42.428 1.00 0.00 C \n+ATOM 45 H2' DG A 2 13.519 17.374 42.946 1.00 0.00 H \n+ATOM 46 H2'' DG A 2 13.741 18.042 41.408 1.00 0.00 H \n+ATOM 47 C1' DG A 2 14.687 18.932 43.612 1.00 0.00 C \n+ATOM 48 H1' DG A 2 15.209 18.469 44.578 1.00 0.00 H \n+ATOM 49 N9 DG A 2 13.611 19.821 44.041 1.00 0.00 N \n+ATOM 50 C8 DG A 2 12.734 20.510 43.240 1.00 0.00 C \n+ATOM 51 H8 DG A 2 12.123 20.172 42.277 1.00 0.00 H \n+ATOM 52 N7 DG A 2 11.901 21.254 43.916 1.00 0.00 N \n+ATOM 53 C5 DG A 2 12.245 21.037 45.242 1.00 0.00 C \n+ATOM 54 C6 DG A 2 11.694 21.577 46.434 1.00 0.00 C \n+ATOM 55 O6 DG A 2 10.765 22.385 46.558 1.00 0.00 O \n+ATOM 56 N1 DG A 2 12.343 21.088 47.565 1.00 0.00 N \n+ATOM 57 H1 DG A 2 12.034 21.627 48.579 1.00 0.00 H \n+ATOM 58 C2 DG A 2 13.385 20.195 47.550 1.00 0.00 C \n+ATOM 59 N2 DG A 2 13.880 19.840 48.746 1.00 0.00 N \n+ATOM 60 H21 DG A 2 13.601 18.971 49.506 1.00 0.00 H \n+ATOM 61 H22 DG A 2 14.797 20.478 49.156 1.00 0.00 H \n+ATOM 62 N3 DG A 2 13.907 19.685 46.447 1.00 0.00 N \n+ATOM 63 C4 DG A 2 13.293 20.148 45.338 1.00 0.00 C \n+ATOM 64 P DC A 3 15.864 15.221 42.273 1.00 0.00 P \n+ATOM 65 OP1 DC A 3 17.025 14.295 42.340 1.00 0.00 O \n+ATOM 66 OP2 DC A 3 14.972 15.195 41.084 1.00 0.00 O \n+ATOM 67 O5' DC A 3 14.974 15.005 43.572 1.00 0.00 O \n+ATOM 68 C5' DC A 3 15.560 15.108 44.879 1.00 0.00 C \n+ATOM 69 H5' DC A 3 16.337 14.196 44.900 1.00 0.00 H \n+ATOM 70 H5'' DC A 3 16.263 16.031 45.163 1.00 0.00 H \n+ATOM 71 C4' DC A 3 14.517 14.859 45.942 1.00 0.00 C \n+ATOM 72 H4' DC A 3 15.122 14.737 46.965 1.00 0.00 H \n+ATOM 73 O4' DC A 3 13.696 16.033 46.161 1.00 0.00 O \n+ATOM 74 C3' DC A 3 13.548 13.717 45.633 1.00 0.00 C \n+ATOM 75 H3' DC A 3 13.922 12.887 44.864 1.00 0.00 H \n+ATOM 76 O3' DC A 3 13.288 12.999 46.834 1.00 0.00 O \n+ATOM 77 C2' DC A 3 12.277 14.444 45.236 1.00 0.00 C \n+ATOM 78 H2' DC A 3 12.390 14.463 44.045 1.00 0.00 H \n+ATOM 79 H2'' DC A 3 11.213 13.901 45.256 1.00 0.00 H \n+ATOM 80 C1' DC A 3 12.347 15.607 46.198 1.00 0.00 C \n+ATOM 81 H1' DC A 3 12.304 15.359 47.361 1.00 0.00 H \n+ATOM 82 N1 DC A 3 11.482 16.758 45.904 1.00 0.00 N \n+ATOM 83 C2 DC A 3 11.098 17.584 46.962 1.00 0.00 C \n+ATOM 84 O2 DC A 3 11.548 17.354 48.096 1.00 0.00 O \n+ATOM 85 N3 DC A 3 10.253 18.611 46.727 1.00 0.00 N \n+ATOM 86 C4 DC A 3 9.802 18.833 45.491 1.00 0.00 C \n+ATOM 87 N4 DC A 3 8.947 19.842 45.313 1.00 0.00 N \n+ATOM 88 H41 DC A 3 8.547 20.581 46.157 1.00 0.00 H \n+ATOM 89 H42 DC A 3 8.161 19.901 44.421 1.00 0.00 H \n+ATOM 90 C5 DC A 3 10.202 18.026 44.386 1.00 0.00 C \n+ATOM 91 H5 DC A 3 9.521 18.038 43.410 1.00 0.00 H \n+ATOM 92 C6 DC A 3 11.038 17.009 44.636 1.00 0.00 C \n+ATOM 93 H6 DC A 3 10.939 16.341 43.660 1.00 0.00 H \n+ATOM 94 P DG A 4 13.014 11.424 46.779 1.00 0.00 P \n+ATOM 95 OP1 DG A 4 14.232 10.763 46.245 1.00 0.00 O \n+ATOM 96 OP2 DG A 4 11.710 11.208 46.113 1.00 0.00 O \n+ATOM 97 O5' DG A 4 12.864 11.047 48.316 1.00 0.00 O \n+ATOM 98 C5' DG A 4 13.816 11.527 49.282 1.00 0.00 C \n+ATOM 99 H5' DG A 4 14.467 10.534 49.439 1.00 0.00 H \n+ATOM 100 H5'' DG A 4 14.678 12.307 49.007 1.00 0.00 H \n+ATOM 101 C4' DG A 4 13.106 11.987 50.532 1.00 0.00 C \n+ATOM 102 H4' DG A 4 13.920 12.259 51.363 1.00 0.00 H \n+ATOM 103 O4' DG A 4 12.426 13.246 50.296 1.00 0.00 O \n+ATOM 104 C3' DG A 4 12.042 11.016 51.035 1.00 0.00 C \n+ATOM 105 H3' DG A 4 12.311 9.908 50.684 1.00 0.00 H \n+ATOM 106 O3' DG A 4 12.112 10.908 52.455 1.00 0.00 O \n+ATOM 107 C2' DG A 4 10.737 11.650 50.588 1.00 0.00 C \n+ATOM 108 H2' DG A 4 9.745 11.499 51.222 1.00 0.00 H \n+ATOM 109 H2'' DG A 4 10.508 11.040 49.590 1.00 0.00 H \n+ATOM 110 C1' DG A 4 11.051 13.136 50.637 1.00 0.00 C \n+ATOM 111 H1' DG A 4 11.118 13.759 51.653 1.00 0.00 H \n+ATOM 112 N9 DG A 4 10.288 13.945 49.690 1.00 0.00 N \n+ATOM 113 C8 DG A 4 10.397 13.932 48.320 1.00 0.00 C \n+ATOM 114 H8 DG A 4 10.700 12.998 47.669 1.00 0.00 H \n+ATOM 115 N7 DG A 4 9.590 14.772 47.733 1.00 0.00 N \n+ATOM 116 C5 DG A 4 8.902 15.376 48.777 1.00 0.00 C \n+ATOM 117 C6 DG A 4 7.893 16.376 48.755 1.00 0.00 C \n+ATOM 118 O6 DG A 4 7.390 16.944 47.780 1.00 0.00 O \n+ATOM 119 N1 DG A 4 7.466 16.699 50.038 1.00 0.00 N \n+ATOM 120 H1 DG A 4 6.826 17.700 50.082 1.00 0.00 H \n+ATOM 121 C2 DG A 4 7.948 16.135 51.194 1.00 0.00 C \n+ATOM 122 N2 DG A 4 7.403 16.579 52.334 1.00 0.00 N \n+ATOM 123 H21 DG A 4 6.624 16.199 53.146 1.00 0.00 H \n+ATOM 124 H22 DG A 4 7.866 17.602 52.732 1.00 0.00 H \n+ATOM 125 N3 DG A 4 8.891 15.207 51.230 1.00 0.00 N \n+ATOM 126 C4 DG A 4 9.320 14.875 49.992 1.00 0.00 C \n+ATOM 127 P DT A 5 11.265 9.771 53.202 1.00 0.00 P \n+ATOM 128 OP1 DT A 5 11.788 9.633 54.588 1.00 0.00 O \n+ATOM 129 OP2 DT A 5 11.213 8.581 52.315 1.00 0.00 O \n+ATOM 130 O5' DT A 5 9.810 10.411 53.273 1.00 0.00 O \n+ATOM 131 C5' DT A 5 9.586 11.626 54.005 1.00 0.00 C \n+ATOM 132 H5' DT A 5 10.246 12.621 53.958 1.00 0.00 H \n+ATOM 133 H5'' DT A 5 9.837 11.252 55.117 1.00 0.00 H \n+ATOM 134 C4' DT A 5 8.119 11.985 53.982 1.00 0.00 C \n+ATOM 135 H4' DT A 5 7.928 12.699 54.920 1.00 0.00 H \n+ATOM 136 O4' DT A 5 7.780 12.784 52.821 1.00 0.00 O \n+ATOM 137 C3' DT A 5 7.175 10.781 53.962 1.00 0.00 C \n+ATOM 138 H3' DT A 5 7.620 9.765 54.404 1.00 0.00 H \n+ATOM 139 O3' DT A 5 6.090 11.008 54.854 1.00 0.00 O \n+ATOM 140 C2' DT A 5 6.651 10.774 52.536 1.00 0.00 C \n+ATOM 141 H2' DT A 5 5.668 10.207 52.178 1.00 0.00 H \n+ATOM 142 H2'' DT A 5 7.419 9.961 52.113 1.00 0.00 H \n+ATOM 143 C1' DT A 5 6.585 12.263 52.269 1.00 0.00 C \n+ATOM 144 H1' DT A 5 5.746 12.801 52.923 1.00 0.00 H \n+ATOM 145 N1 DT A 5 6.498 12.678 50.855 1.00 0.00 N \n+ATOM 146 C2 DT A 5 5.745 13.797 50.569 1.00 0.00 C \n+ATOM 147 O2 DT A 5 5.193 14.468 51.427 1.00 0.00 O \n+ATOM 148 N3 DT A 5 5.666 14.108 49.237 1.00 0.00 N \n+ATOM 149 H3 DT A 5 4.888 14.950 48.918 1.00 0.00 H \n+ATOM 150 C4 DT A 5 6.256 13.434 48.185 1.00 0.00 C \n+ATOM 151 O4 DT A 5 6.085 13.827 47.035 1.00 0.00 O \n+ATOM 152 C5 DT A 5 7.048 12.282 48.559 1.00 0.00 C \n+ATOM 153 C7 DT A 5 7.738 11.499 47.487 1.00 0.00 C \n+ATOM 154 H71 DT A 5 7.935 10.333 47.683 1.00 0.00 H \n+ATOM 155 H72 DT A 5 8.688 11.872 46.862 1.00 0.00 H \n+ATOM 156 H73 DT A 5 6.874 11.333 46.672 1.00 0.00 H \n+ATOM 157 C6 DT A 5 7.128 11.966 49.859 1.00 0.00 C \n+ATOM 158 H6 DT A 5 7.250 10.793 49.960 1.00 0.00 H \n+ATOM 159 P DG A 6 5.237 9.765 55.398 1.00 0.00 P \n+ATOM 160 OP1 DG A 6 5.824 9.352 56.698 1.00 0.00 O \n+ATOM 161 OP2 DG A 6 5.098 8.771 54.303 1.00 0.00 O \n+ATOM 162 O5' DG A 6 3.808 10.404 55.671 1.00 0.00 O \n+ATOM 163 C5' DG A 6 3.681 11.632 56.401 1.00 0.00 C \n+ATOM 164 H5' DG A 6 3.707 11.294 57.554 1.00 0.00 H \n+ATOM 165 H5'' DG A 6 4.575 12.423 56.380 1.00 0.00 H \n+ATOM 166 C4' DG A 6 2.372 12.298 56.056 1.00 0.00 C \n+ATOM 167 H4' DG A 6 2.192 13.200 56.815 1.00 0.00 H \n+ATOM 168 O4' DG A 6 2.476 12.952 54.766 1.00 0.00 O \n+ATOM 169 C3' DG A 6 1.216 11.306 55.946 1.00 0.00 C \n+ATOM 170 H3' DG A 6 1.380 10.322 56.602 1.00 0.00 H \n+ATOM 171 O3' DG A 6 0.041 11.808 56.580 1.00 0.00 O \n+ATOM 172 C2' DG A 6 1.008 11.156 54.450 1.00 0.00 C \n+ATOM 173 H2' DG A 6 -0.074 10.848 54.091 1.00 0.00 H \n+ATOM 174 H2'' DG A 6 1.628 10.170 54.208 1.00 0.00 H \n+ATOM 175 C1' DG A 6 1.450 12.498 53.898 1.00 0.00 C \n+ATOM 176 H1' DG A 6 0.746 13.460 53.933 1.00 0.00 H \n+ATOM 177 N9 DG A 6 2.008 12.399 52.553 1.00 0.00 N \n+ATOM 178 C8 DG A 6 3.086 11.641 52.165 1.00 0.00 C \n+ATOM 179 H8 DG A 6 3.275 10.500 52.415 1.00 0.00 H \n+ATOM 180 N7 DG A 6 3.331 11.711 50.885 1.00 0.00 N \n+ATOM 181 C5 DG A 6 2.365 12.577 50.396 1.00 0.00 C \n+ATOM 182 C6 DG A 6 2.124 13.030 49.071 1.00 0.00 C \n+ATOM 183 O6 DG A 6 2.734 12.739 48.035 1.00 0.00 O \n+ATOM 184 N1 DG A 6 1.043 13.905 49.018 1.00 0.00 N \n+ATOM 185 H1 DG A 6 1.060 14.502 47.990 1.00 0.00 H \n+ATOM 186 C2 DG A 6 0.291 14.296 50.099 1.00 0.00 C \n+ATOM 187 N2 DG A 6 -0.705 15.160 49.843 1.00 0.00 N \n+ATOM 188 H21 DG A 6 -1.586 15.476 50.576 1.00 0.00 H \n+ATOM 189 H22 DG A 6 -0.532 16.124 49.164 1.00 0.00 H \n+ATOM 190 N3 DG A 6 0.500 13.876 51.338 1.00 0.00 N \n+ATOM 191 C4 DG A 6 1.545 13.022 51.412 1.00 0.00 C \n+ATOM 192 P DG A 7 -1.292 10.912 56.593 1.00 0.00 P \n+ATOM 193 OP1 DG A 7 -1.938 11.043 57.924 1.00 0.00 O \n+ATOM 194 OP2 DG A 7 -0.944 9.562 56.073 1.00 0.00 O \n+ATOM 195 O5' DG A 7 -2.205 11.644 55.520 1.00 0.00 O \n+ATOM 196 C5' DG A 7 -2.381 13.065 55.580 1.00 0.00 C \n+ATOM 197 H5' DG A 7 -2.843 13.278 56.665 1.00 0.00 H \n+ATOM 198 H5'' DG A 7 -1.445 13.806 55.543 1.00 0.00 H \n+ATOM 199 C4' DG A 7 -3.371 13.512 54.533 1.00 0.00 C \n+ATOM 200 H4' DG A 7 -3.635 14.661 54.725 1.00 0.00 H \n+ATOM 201 O4' DG A 7 -2.752 13.517 53.224 1.00 0.00 O \n+ATOM 202 C3' DG A 7 -4.600 12.614 54.425 1.00 0.00 C \n+ATOM 203 H3' DG A 7 -4.864 12.050 55.442 1.00 0.00 H \n+ATOM 204 O3' DG A 7 -5.761 13.425 54.250 1.00 0.00 O \n+ATOM 205 C2' DG A 7 -4.320 11.780 53.185 1.00 0.00 C \n+ATOM 206 H2' DG A 7 -5.174 11.039 52.810 1.00 0.00 H \n+ATOM 207 H2'' DG A 7 -3.641 10.879 53.582 1.00 0.00 H \n+ATOM 208 C1' DG A 7 -3.527 12.748 52.321 1.00 0.00 C \n+ATOM 209 H1' DG A 7 -4.068 13.642 51.750 1.00 0.00 H \n+ATOM 210 N9 DG A 7 -2.614 12.128 51.364 1.00 0.00 N \n+ATOM 211 C8 DG A 7 -1.592 11.253 51.642 1.00 0.00 C \n+ATOM 212 H8 DG A 7 -1.578 10.228 52.242 1.00 0.00 H \n+ATOM 213 N7 DG A 7 -0.936 10.878 50.578 1.00 0.00 N \n+ATOM 214 C5 DG A 7 -1.561 11.543 49.532 1.00 0.00 C \n+ATOM 215 C6 DG A 7 -1.288 11.534 48.137 1.00 0.00 C \n+ATOM 216 O6 DG A 7 -0.405 10.917 47.528 1.00 0.00 O \n+ATOM 217 N1 DG A 7 -2.170 12.347 47.435 1.00 0.00 N \n+ATOM 218 H1 DG A 7 -1.721 12.605 46.365 1.00 0.00 H \n+ATOM 219 C2 DG A 7 -3.184 13.079 48.001 1.00 0.00 C \n+ATOM 220 N2 DG A 7 -3.933 13.798 47.152 1.00 0.00 N \n+ATOM 221 H21 DG A 7 -3.920 13.900 45.967 1.00 0.00 H \n+ATOM 222 H22 DG A 7 -4.449 14.789 47.563 1.00 0.00 H \n+ATOM 223 N3 DG A 7 -3.447 13.103 49.299 1.00 0.00 N \n+ATOM 224 C4 DG A 7 -2.604 12.317 50.000 1.00 0.00 C \n+ATOM 225 P DG A 8 -7.216 12.809 54.530 1.00 0.00 P \n+ATOM 226 OP1 DG A 8 -7.817 13.525 55.680 1.00 0.00 O \n+ATOM 227 OP2 DG A 8 -7.079 11.329 54.572 1.00 0.00 O \n+ATOM 228 O5' DG A 8 -8.012 13.201 53.209 1.00 0.00 O \n+ATOM 229 C5' DG A 8 -7.333 13.192 51.948 1.00 0.00 C \n+ATOM 230 H5' DG A 8 -6.799 14.262 52.013 1.00 0.00 H \n+ATOM 231 H5'' DG A 8 -6.645 12.277 51.662 1.00 0.00 H \n+ATOM 232 C4' DG A 8 -8.283 13.522 50.823 1.00 0.00 C \n+ATOM 233 H4' DG A 8 -8.616 14.669 50.800 1.00 0.00 H \n+ATOM 234 O4' DG A 8 -7.552 13.316 49.595 1.00 0.00 O \n+ATOM 235 C3' DG A 8 -9.485 12.592 50.727 1.00 0.00 C \n+ATOM 236 H3' DG A 8 -10.052 12.410 51.761 1.00 0.00 H \n+ATOM 237 O3' DG A 8 -10.560 13.263 50.065 1.00 0.00 O \n+ATOM 238 C2' DG A 8 -8.956 11.434 49.904 1.00 0.00 C \n+ATOM 239 H2' DG A 8 -9.636 10.571 49.440 1.00 0.00 H \n+ATOM 240 H2'' DG A 8 -8.640 10.717 50.812 1.00 0.00 H \n+ATOM 241 C1' DG A 8 -7.933 12.089 48.986 1.00 0.00 C \n+ATOM 242 H1' DG A 8 -8.111 12.573 47.915 1.00 0.00 H \n+ATOM 243 N9 DG A 8 -6.725 11.288 48.835 1.00 0.00 N \n+ATOM 244 C8 DG A 8 -6.007 10.683 49.838 1.00 0.00 C \n+ATOM 245 H8 DG A 8 -6.343 9.912 50.682 1.00 0.00 H \n+ATOM 246 N7 DG A 8 -4.963 10.035 49.403 1.00 0.00 N \n+ATOM 247 C5 DG A 8 -4.995 10.221 48.027 1.00 0.00 C \n+ATOM 248 C6 DG A 8 -4.117 9.755 47.019 1.00 0.00 C \n+ATOM 249 O6 DG A 8 -3.098 9.063 47.143 1.00 0.00 O \n+ATOM 250 N1 DG A 8 -4.523 10.171 45.755 1.00 0.00 N \n+ATOM 251 H1 DG A 8 -3.672 10.053 44.933 1.00 0.00 H \n+ATOM 252 C2 DG A 8 -5.631 10.940 45.497 1.00 0.00 C \n+ATOM 253 N2 DG A 8 -5.863 11.231 44.211 1.00 0.00 N \n+ATOM 254 H21 DG A 8 -6.205 12.333 43.914 1.00 0.00 H \n+ATOM 255 H22 DG A 8 -5.647 10.649 43.196 1.00 0.00 H \n+ATOM 256 N3 DG A 8 -6.455 11.386 46.429 1.00 0.00 N \n+ATOM 257 C4 DG A 8 -6.079 10.990 47.663 1.00 0.00 C \n+ATOM 258 P DA A 9 -11.751 12.405 49.416 1.00 0.00 P \n+ATOM 259 OP1 DA A 9 -12.764 13.349 48.874 1.00 0.00 O \n+ATOM 260 OP2 DA A 9 -12.158 11.384 50.414 1.00 0.00 O \n+ATOM 261 O5' DA A 9 -11.057 11.661 48.193 1.00 0.00 O \n+ATOM 262 C5' DA A 9 -10.733 12.374 46.988 1.00 0.00 C \n+ATOM 263 H5' DA A 9 -11.719 13.021 46.773 1.00 0.00 H \n+ATOM 264 H5'' DA A 9 -9.956 13.272 46.838 1.00 0.00 H \n+ATOM 265 C4' DA A 9 -10.690 11.427 45.813 1.00 0.00 C \n+ATOM 266 H4' DA A 9 -10.665 12.076 44.812 1.00 0.00 H \n+ATOM 267 O4' DA A 9 -9.442 10.691 45.798 1.00 0.00 O \n+ATOM 268 C3' DA A 9 -11.808 10.383 45.788 1.00 0.00 C \n+ATOM 269 H3' DA A 9 -12.847 10.675 46.296 1.00 0.00 H \n+ATOM 270 O3' DA A 9 -12.346 10.271 44.468 1.00 0.00 O \n+ATOM 271 C2' DA A 9 -11.110 9.102 46.215 1.00 0.00 C \n+ATOM 272 H2' DA A 9 -11.460 9.018 47.357 1.00 0.00 H \n+ATOM 273 H2'' DA A 9 -11.417 7.980 45.948 1.00 0.00 H \n+ATOM 274 C1' DA A 9 -9.699 9.298 45.690 1.00 0.00 C \n+ATOM 275 H1' DA A 9 -9.382 9.150 44.555 1.00 0.00 H \n+ATOM 276 N9 DA A 9 -8.668 8.591 46.453 1.00 0.00 N \n+ATOM 277 C8 DA A 9 -8.651 8.323 47.800 1.00 0.00 C \n+ATOM 278 H8 DA A 9 -9.441 7.999 48.630 1.00 0.00 H \n+ATOM 279 N7 DA A 9 -7.583 7.674 48.197 1.00 0.00 N \n+ATOM 280 C5 DA A 9 -6.847 7.499 47.035 1.00 0.00 C \n+ATOM 281 C6 DA A 9 -5.604 6.887 46.779 1.00 0.00 C \n+ATOM 282 N6 DA A 9 -4.854 6.309 47.723 1.00 0.00 N \n+ATOM 283 H61 DA A 9 -5.162 5.894 48.793 1.00 0.00 H \n+ATOM 284 H62 DA A 9 -3.700 6.080 47.543 1.00 0.00 H \n+ATOM 285 N1 DA A 9 -5.151 6.885 45.507 1.00 0.00 N \n+ATOM 286 C2 DA A 9 -5.902 7.464 44.560 1.00 0.00 C \n+ATOM 287 H2 DA A 9 -5.380 7.375 43.495 1.00 0.00 H \n+ATOM 288 N3 DA A 9 -7.081 8.073 44.673 1.00 0.00 N \n+ATOM 289 C4 DA A 9 -7.504 8.058 45.950 1.00 0.00 C \n+ATOM 290 P DC A 10 -13.178 8.962 44.054 1.00 0.00 P \n+ATOM 291 OP1 DC A 10 -14.144 9.344 42.993 1.00 0.00 O \n+ATOM 292 OP2 DC A 10 -13.671 8.310 45.292 1.00 0.00 O \n+ATOM 293 O5' DC A 10 -12.063 8.033 43.404 1.00 0.00 O \n+ATOM 294 C5' DC A 10 -11.099 8.599 42.500 1.00 0.00 C \n+ATOM 295 H5' DC A 10 -10.454 9.603 42.575 1.00 0.00 H \n+ATOM 296 H5'' DC A 10 -11.833 8.980 41.630 1.00 0.00 H \n+ATOM 297 C4' DC A 10 -10.275 7.511 41.855 1.00 0.00 C \n+ATOM 298 H4' DC A 10 -9.635 7.997 40.971 1.00 0.00 H \n+ATOM 299 O4' DC A 10 -9.267 7.016 42.769 1.00 0.00 O \n+ATOM 300 C3' DC A 10 -11.076 6.292 41.394 1.00 0.00 C \n+ATOM 301 H3' DC A 10 -12.235 6.507 41.222 1.00 0.00 H \n+ATOM 302 O3' DC A 10 -10.619 5.884 40.105 1.00 0.00 O \n+ATOM 303 C2' DC A 10 -10.736 5.236 42.431 1.00 0.00 C \n+ATOM 304 H2' DC A 10 -10.767 4.142 41.962 1.00 0.00 H \n+ATOM 305 H2'' DC A 10 -11.689 5.163 43.148 1.00 0.00 H \n+ATOM 306 C1' DC A 10 -9.305 5.601 42.777 1.00 0.00 C \n+ATOM 307 H1' DC A 10 -8.548 5.359 41.889 1.00 0.00 H \n+ATOM 308 N1 DC A 10 -8.831 5.138 44.090 1.00 0.00 N \n+ATOM 309 C2 DC A 10 -7.597 4.482 44.160 1.00 0.00 C \n+ATOM 310 O2 DC A 10 -6.943 4.320 43.119 1.00 0.00 O \n+ATOM 311 N3 DC A 10 -7.149 4.039 45.356 1.00 0.00 N \n+ATOM 312 C4 DC A 10 -7.880 4.232 46.454 1.00 0.00 C \n+ATOM 313 N4 DC A 10 -7.398 3.774 47.611 1.00 0.00 N \n+ATOM 314 H41 DC A 10 -6.352 3.206 47.664 1.00 0.00 H \n+ATOM 315 H42 DC A 10 -7.862 3.801 48.707 1.00 0.00 H \n+ATOM 316 C5 DC A 10 -9.139 4.903 46.415 1.00 0.00 C \n+ATOM 317 H5 DC A 10 -9.862 4.756 47.349 1.00 0.00 H \n+ATOM 318 C6 DC A 10 -9.572 5.337 45.222 1.00 0.00 C \n+ATOM 319 H6 DC A 10 -10.752 5.405 45.349 1.00 0.00 H \n+ATOM 320 P DC A 11 -11.594 5.053 39.141 1.00 0.00 P \n+ATOM 321 OP1 DC A 11 -11.628 5.743 37.831 1.00 0.00 O \n+ATOM 322 OP2 DC A 11 -12.865 4.793 39.870 1.00 0.00 O \n+ATOM 323 O5' DC A 11 -10.825 3.671 38.964 1.00 0.00 O \n+ATOM 324 C5' DC A 11 -9.528 3.640 38.348 1.00 0.00 C \n+ATOM 325 H5' DC A 11 -9.805 3.864 37.210 1.00 0.00 H \n+ATOM 326 H5'' DC A 11 -8.750 4.530 38.539 1.00 0.00 H \n+ATOM 327 C4' DC A 11 -8.879 2.291 38.548 1.00 0.00 C \n+ATOM 328 H4' DC A 11 -7.859 2.416 37.937 1.00 0.00 H \n+ATOM 329 O4' DC A 11 -8.352 2.162 39.892 1.00 0.00 O \n+ATOM 330 C3' DC A 11 -9.799 1.087 38.334 1.00 0.00 C \n+ATOM 331 H3' DC A 11 -10.720 1.074 37.577 1.00 0.00 H \n+ATOM 332 O3' DC A 11 -9.042 0.047 37.715 1.00 0.00 O \n+ATOM 333 HO3' DC A 11 -7.920 0.397 37.606 1.00 0.00 H \n+ATOM 334 C2' DC A 11 -10.109 0.639 39.752 1.00 0.00 C \n+ATOM 335 H2' DC A 11 -11.208 1.047 39.943 1.00 0.00 H \n+ATOM 336 H2'' DC A 11 -10.299 -0.541 39.788 1.00 0.00 H \n+ATOM 337 C1' DC A 11 -8.783 0.923 40.428 1.00 0.00 C \n+ATOM 338 H1' DC A 11 -7.981 0.080 40.161 1.00 0.00 H \n+ATOM 339 N1 DC A 11 -8.798 1.033 41.897 1.00 0.00 N \n+ATOM 340 C2 DC A 11 -7.693 0.559 42.606 1.00 0.00 C \n+ATOM 341 O2 DC A 11 -6.735 0.093 41.973 1.00 0.00 O \n+ATOM 342 N3 DC A 11 -7.693 0.620 43.956 1.00 0.00 N \n+ATOM 343 C4 DC A 11 -8.740 1.138 44.599 1.00 0.00 C \n+ATOM 344 N4 DC A 11 -8.699 1.168 45.935 1.00 0.00 N \n+ATOM 345 H41 DC A 11 -8.686 1.621 47.028 1.00 0.00 H \n+ATOM 346 H42 DC A 11 -8.923 0.018 46.156 1.00 0.00 H \n+ATOM 347 C5 DC A 11 -9.876 1.644 43.902 1.00 0.00 C \n+ATOM 348 H5 DC A 11 -10.872 1.636 44.553 1.00 0.00 H \n+ATOM 349 C6 DC A 11 -9.864 1.573 42.562 1.00 0.00 C \n+ATOM 350 H6 DC A 11 -10.995 1.384 42.247 1.00 0.00 H \n+TER 351 DC A 11\n+ATOM 352 O5' G B 1 24.371 15.337 2.193 1.00 0.00 O \n+ATOM 353 C5' G B 1 24.362 16.433 3.084 1.00 0.00 C \n+ATOM 354 C4' G B 1 23.527 16.108 4.331 1.00 0.00 C \n+ATOM 355 O4' G B 1 24.084 15.023 5.056 1.00 0.00 O \n+ATOM 356 C3' G B 1 23.490 17.271 5.325 1.00 0.00 C \n+ATOM 357 O3' G B 1 22.580 18.295 4.943 1.00 0.00 O \n+ATOM 358 C2' G B 1 23.081 16.532 6.599 1.00 0.00 C \n+ATOM 359 O2' G B 1 21.694 16.258 6.626 1.00 0.00 O \n+ATOM 360 C1' G B 1 23.852 15.214 6.447 1.00 0.00 C \n+ATOM 361 N9 G B 1 25.133 15.289 7.196 1.00 0.00 N \n+ATOM 362 C8 G B 1 26.410 15.497 6.733 1.00 0.00 C \n+ATOM 363 N7 G B 1 27.323 15.509 7.663 1.00 0.00 N \n+ATOM 364 C5 G B 1 26.607 15.303 8.837 1.00 0.00 C \n+ATOM 365 C6 G B 1 27.062 15.203 10.195 1.00 0.00 C \n+ATOM 366 O6 G B 1 28.216 15.272 10.607 1.00 0.00 O \n+ATOM 367 N1 G B 1 26.017 15.000 11.107 1.00 0.00 N \n+ATOM 368 C2 G B 1 24.675 14.911 10.749 1.00 0.00 C \n+ATOM 369 N2 G B 1 23.793 14.709 11.736 1.00 0.00 N \n+ATOM 370 N3 G B 1 24.252 14.999 9.469 1.00 0.00 N \n+ATOM 371 C4 G B 1 25.260 15.190 8.562 1.00 0.00 C \n+ATOM 372 H5' G B 1 23.931 17.296 2.573 1.00 0.00 H \n+ATOM 373 H5'' G B 1 25.389 16.667 3.369 1.00 0.00 H \n+ATOM 374 H4' G B 1 22.508 15.845 4.037 1.00 0.00 H \n+ATOM 375 H3' G B 1 24.506 17.662 5.438 1.00 0.00 H \n+ATOM 376 H2' G B 1 23.357 17.088 7.494 1.00 0.00 H \n+ATOM 377 HO2' G B 1 21.485 15.842 7.466 1.00 0.00 H \n+ATOM 378 H1' G B 1 23.272 14.372 6.832 1.00 0.00 H \n+ATOM 379 H8 G B 1 26.644 15.637 5.687 1.00 0.00 H \n+ATOM 380 H1 G B 1 26.268 14.920 12.082 1.00 0.00 H \n+ATOM 381 H21 G B 1 24.111 14.641 12.692 1.00 0.00 H \n+ATOM 382 H22 G B 1 22.810 14.624 11.524 1.00 0.00 H \n+ATOM 383 HO5' G B 1 24.826 14.606 2.617 1.00 0.00 H \n+ATOM 384 P C B 2 22.609 19.773 5.610 1.00 0.00 P \n+ATOM 385 OP1 C B 2 21.498 20.558 5.026 1.00 0.00 O \n+ATOM 386 OP2 C B 2 23.993 20.289 5.512 1.00 0.00 O \n+ATOM 387 O5' C B 2 22.288 19.524 7.177 1.00 0.00 O \n+ATOM 388 C5' C B 2 20.980 19.280 7.671 1.00 0.00 C \n+ATOM 389 C4' C B 2 21.026 19.078 9.194 1.00 0.00 C \n+ATOM 390 O4' C B 2 21.890 18.018 9.576 1.00 0.00 O \n+ATOM 391 C3' C B 2 21.546 20.305 9.943 1.00 0.00 C \n+ATOM 392 O3' C B 2 20.567 21.334 10.008 1.00 0.00 O \n+ATOM 393 C2' C B 2 21.895 19.675 11.293 1.00 0.00 C \n+ATOM 394 O2' C B 2 20.745 19.558 12.111 1.00 0.00 O \n+ATOM 395 C1' C B 2 22.405 18.282 10.879 1.00 0.00 C \n+ATOM 396 N1 C B 2 23.904 18.244 10.922 1.00 0.00 N \n+ATOM 397 C2 C B 2 24.530 17.967 12.153 1.00 0.00 C \n+ATOM 398 O2 C B 2 23.870 17.719 13.162 1.00 0.00 O \n+ATOM 399 N3 C B 2 25.899 17.981 12.212 1.00 0.00 N \n+ATOM 400 C4 C B 2 26.647 18.271 11.128 1.00 0.00 C \n+ATOM 401 N4 C B 2 27.981 18.286 11.246 1.00 0.00 N \n+ATOM 402 C5 C B 2 26.029 18.584 9.861 1.00 0.00 C \n+ATOM 403 C6 C B 2 24.671 18.561 9.813 1.00 0.00 C \n+ATOM 404 H5' C B 2 20.545 18.397 7.203 1.00 0.00 H \n+ATOM 405 H5'' C B 2 20.338 20.135 7.453 1.00 0.00 H \n+ATOM 406 H4' C B 2 20.021 18.837 9.549 1.00 0.00 H \n+ATOM 407 H3' C B 2 22.460 20.662 9.464 1.00 0.00 H \n+ATOM 408 H2' C B 2 22.647 20.260 11.823 1.00 0.00 H \n+ATOM 409 HO2' C B 2 20.407 20.440 12.280 1.00 0.00 H \n+ATOM 410 H1' C B 2 21.996 17.513 11.539 1.00 0.00 H \n+ATOM 411 H41 C B 2 28.410 18.076 12.136 1.00 0.00 H \n+ATOM 412 H42 C B 2 28.559 18.505 10.448 1.00 0.00 H \n+ATOM 413 H5 C B 2 26.590 18.834 8.971 1.00 0.00 H \n+ATOM 414 H6 C B 2 24.192 18.813 8.880 1.00 0.00 H \n+ATOM 415 P G B 3 20.911 22.823 10.541 1.00 0.00 P \n+ATOM 416 OP1 G B 3 19.671 23.628 10.486 1.00 0.00 O \n+ATOM 417 OP2 G B 3 22.123 23.293 9.832 1.00 0.00 O \n+ATOM 418 O5' G B 3 21.277 22.574 12.097 1.00 0.00 O \n+ATOM 419 C5' G B 3 22.212 23.386 12.786 1.00 0.00 C \n+ATOM 420 C4' G B 3 22.446 22.840 14.202 1.00 0.00 C \n+ATOM 421 O4' G B 3 22.886 21.488 14.171 1.00 0.00 O \n+ATOM 422 C3' G B 3 23.534 23.632 14.938 1.00 0.00 C \n+ATOM 423 O3' G B 3 23.021 24.777 15.607 1.00 0.00 O \n+ATOM 424 C2' G B 3 24.057 22.573 15.905 1.00 0.00 C \n+ATOM 425 O2' G B 3 23.177 22.395 17.000 1.00 0.00 O \n+ATOM 426 C1' G B 3 24.022 21.328 15.009 1.00 0.00 C \n+ATOM 427 N9 G B 3 25.264 21.217 14.197 1.00 0.00 N \n+ATOM 428 C8 G B 3 25.441 21.325 12.837 1.00 0.00 C \n+ATOM 429 N7 G B 3 26.668 21.143 12.437 1.00 0.00 N \n+ATOM 430 C5 G B 3 27.367 20.889 13.609 1.00 0.00 C \n+ATOM 431 C6 G B 3 28.757 20.602 13.814 1.00 0.00 C \n+ATOM 432 O6 G B 3 29.634 20.476 12.963 1.00 0.00 O \n+ATOM 433 N1 G B 3 29.090 20.458 15.168 1.00 0.00 N \n+ATOM 434 C2 G B 3 28.176 20.560 16.212 1.00 0.00 C \n+ATOM 435 N2 G B 3 28.640 20.378 17.455 1.00 0.00 N \n+ATOM 436 N3 G B 3 26.863 20.804 16.012 1.00 0.00 N \n+ATOM 437 C4 G B 3 26.520 20.961 14.696 1.00 0.00 C \n+ATOM 438 H5' G B 3 21.837 24.410 12.854 1.00 0.00 H \n+ATOM 439 H5'' G B 3 23.163 23.395 12.249 1.00 0.00 H \n+ATOM 440 H4' G B 3 21.514 22.873 14.771 1.00 0.00 H \n+ATOM 441 H3' G B 3 24.327 23.891 14.231 1.00 0.00 H \n+ATOM 442 H2' G B 3 25.052 22.813 16.275 1.00 0.00 H \n+ATOM 443 HO2' G B 3 23.062 23.243 17.435 1.00 0.00 H \n+ATOM 444 H1' G B 3 23.917 20.417 15.602 1.00 0.00 H \n+ATOM 445 H8 G B 3 24.640 21.537 12.146 1.00 0.00 H \n+ATOM 446 H1 G B 3 30.054 20.254 15.384 1.00 0.00 H \n+ATOM 447 H21 G B 3 29.623 20.200 17.609 1.00 0.00 H \n+ATOM 448 H22 G B 3 28.007 20.425 18.240 1.00 0.00 H \n+ATOM 449 P U B 4 23.875 26.145 15.764 1.00 0.00 P \n+ATOM 450 OP1 U B 4 23.161 27.025 16.718 1.00 0.00 O \n+ATOM 451 OP2 U B 4 24.185 26.643 14.406 1.00 0.00 O \n+ATOM 452 O5' U B 4 25.266 25.676 16.444 1.00 0.00 O \n+ATOM 453 C5' U B 4 25.380 25.350 17.820 1.00 0.00 C \n+ATOM 454 C4' U B 4 26.827 24.947 18.146 1.00 0.00 C \n+ATOM 455 O4' U B 4 27.229 23.790 17.430 1.00 0.00 O \n+ATOM 456 C3' U B 4 27.864 26.013 17.784 1.00 0.00 C \n+ATOM 457 O3' U B 4 27.879 27.098 18.700 1.00 0.00 O \n+ATOM 458 C2' U B 4 29.138 25.170 17.799 1.00 0.00 C \n+ATOM 459 O2' U B 4 29.599 24.934 19.117 1.00 0.00 O \n+ATOM 460 C1' U B 4 28.633 23.853 17.188 1.00 0.00 C \n+ATOM 461 N1 U B 4 28.984 23.781 15.735 1.00 0.00 N \n+ATOM 462 C2 U B 4 30.314 23.464 15.415 1.00 0.00 C \n+ATOM 463 O2 U B 4 31.175 23.262 16.269 1.00 0.00 O \n+ATOM 464 N3 U B 4 30.632 23.399 14.058 1.00 0.00 N \n+ATOM 465 C4 U B 4 29.761 23.676 13.005 1.00 0.00 C \n+ATOM 466 O4 U B 4 30.154 23.604 11.843 1.00 0.00 O \n+ATOM 467 C5 U B 4 28.412 24.038 13.420 1.00 0.00 C \n+ATOM 468 C6 U B 4 28.070 24.077 14.736 1.00 0.00 C \n+ATOM 469 H5' U B 4 24.712 24.526 18.076 1.00 0.00 H \n+ATOM 470 H5'' U B 4 25.116 26.218 18.429 1.00 0.00 H \n+ATOM 471 H4' U B 4 26.890 24.722 19.213 1.00 0.00 H \n+ATOM 472 H3' U B 4 27.679 26.361 16.765 1.00 0.00 H \n+ATOM 473 H2' U B 4 29.937 25.635 17.221 1.00 0.00 H \n+ATOM 474 HO2' U B 4 28.901 24.506 19.617 1.00 0.00 H \n+ATOM 475 H1' U B 4 29.085 23.004 17.706 1.00 0.00 H \n+ATOM 476 H3 U B 4 31.581 23.152 13.818 1.00 0.00 H \n+ATOM 477 H5 U B 4 27.670 24.272 12.671 1.00 0.00 H \n+ATOM 478 H6 U B 4 27.057 24.348 14.991 1.00 0.00 H \n+ATOM 479 P U B 5 28.617 28.500 18.363 1.00 0.00 P \n+ATOM 480 OP1 U B 5 28.435 29.402 19.523 1.00 0.00 O \n+ATOM 481 OP2 U B 5 28.169 28.943 17.023 1.00 0.00 O \n+ATOM 482 O5' U B 5 30.185 28.116 18.252 1.00 0.00 O \n+ATOM 483 C5' U B 5 31.018 27.936 19.388 1.00 0.00 C \n+ATOM 484 C4' U B 5 32.476 27.728 18.949 1.00 0.00 C \n+ATOM 485 O4' U B 5 32.665 26.552 18.182 1.00 0.00 O \n+ATOM 486 C3' U B 5 32.990 28.851 18.048 1.00 0.00 C \n+ATOM 487 O3' U B 5 33.195 30.051 18.779 1.00 0.00 O \n+ATOM 488 C2' U B 5 34.254 28.202 17.485 1.00 0.00 C \n+ATOM 489 O2' U B 5 35.344 28.318 18.382 1.00 0.00 O \n+ATOM 490 C1' U B 5 33.817 26.727 17.357 1.00 0.00 C \n+ATOM 491 N1 U B 5 33.536 26.371 15.929 1.00 0.00 N \n+ATOM 492 C2 U B 5 34.599 25.884 15.148 1.00 0.00 C \n+ATOM 493 O2 U B 5 35.741 25.743 15.576 1.00 0.00 O \n+ATOM 494 N3 U B 5 34.300 25.554 13.826 1.00 0.00 N \n+ATOM 495 C4 U B 5 33.053 25.683 13.215 1.00 0.00 C \n+ATOM 496 O4 U B 5 32.895 25.322 12.051 1.00 0.00 O \n+ATOM 497 C5 U B 5 32.025 26.261 14.068 1.00 0.00 C \n+ATOM 498 C6 U B 5 32.287 26.576 15.365 1.00 0.00 C \n+ATOM 499 H5' U B 5 30.687 27.084 19.982 1.00 0.00 H \n+ATOM 500 H5'' U B 5 30.982 28.829 20.015 1.00 0.00 H \n+ATOM 501 H4' U B 5 33.102 27.655 19.842 1.00 0.00 H \n+ATOM 502 H3' U B 5 32.281 29.004 17.230 1.00 0.00 H \n+ATOM 503 H2' U B 5 34.536 28.650 16.533 1.00 0.00 H \n+ATOM 504 HO2' U B 5 35.094 27.933 19.225 1.00 0.00 H \n+ATOM 505 H1' U B 5 34.589 26.069 17.762 1.00 0.00 H \n+ATOM 506 H3 U B 5 35.052 25.179 13.265 1.00 0.00 H \n+ATOM 507 H5 U B 5 31.036 26.433 13.668 1.00 0.00 H \n+ATOM 508 H6 U B 5 31.492 27.004 15.958 1.00 0.00 H \n+ATOM 509 P A B 6 33.293 31.500 18.064 1.00 0.00 P \n+ATOM 510 OP1 A B 6 33.368 32.525 19.129 1.00 0.00 O \n+ATOM 511 OP2 A B 6 32.228 31.588 17.038 1.00 0.00 O \n+ATOM 512 O5' A B 6 34.720 31.461 17.315 1.00 0.00 O \n+ATOM 513 C5' A B 6 35.117 32.486 16.418 1.00 0.00 C \n+ATOM 514 C4' A B 6 36.563 32.266 15.954 1.00 0.00 C \n+ATOM 515 O4' A B 6 37.471 32.340 17.040 1.00 0.00 O \n+ATOM 516 C3' A B 6 36.805 30.900 15.308 1.00 0.00 C \n+ATOM 517 O3' A B 6 36.327 30.854 13.969 1.00 0.00 O \n+ATOM 518 C2' A B 6 38.328 30.818 15.421 1.00 0.00 C \n+ATOM 519 O2' A B 6 38.965 31.560 14.396 1.00 0.00 O \n+ATOM 520 C1' A B 6 38.583 31.492 16.779 1.00 0.00 C \n+ATOM 521 N9 A B 6 38.750 30.489 17.865 1.00 0.00 N \n+ATOM 522 C8 A B 6 37.915 30.187 18.917 1.00 0.00 C \n+ATOM 523 N7 A B 6 38.413 29.341 19.776 1.00 0.00 N \n+ATOM 524 C5 A B 6 39.670 29.045 19.261 1.00 0.00 C \n+ATOM 525 C6 A B 6 40.746 28.230 19.711 1.00 0.00 C \n+ATOM 526 N6 A B 6 40.719 27.551 20.867 1.00 0.00 N \n+ATOM 527 N1 A B 6 41.862 28.141 18.943 1.00 0.00 N \n+ATOM 528 C2 A B 6 41.916 28.830 17.796 1.00 0.00 C \n+ATOM 529 N3 A B 6 40.986 29.645 17.281 1.00 0.00 N \n+ATOM 530 C4 A B 6 39.870 29.715 18.072 1.00 0.00 C \n+ATOM 531 H5' A B 6 35.050 33.461 16.905 1.00 0.00 H \n+ATOM 532 H5'' A B 6 34.462 32.484 15.544 1.00 0.00 H \n+ATOM 533 H4' A B 6 36.824 33.057 15.247 1.00 0.00 H \n+ATOM 534 H3' A B 6 36.359 30.119 15.928 1.00 0.00 H \n+ATOM 535 H2' A B 6 38.682 29.789 15.390 1.00 0.00 H \n+ATOM 536 HO2' A B 6 38.676 32.474 14.451 1.00 0.00 H \n+ATOM 537 H1' A B 6 39.487 32.105 16.744 1.00 0.00 H \n+ATOM 538 H8 A B 6 36.936 30.627 19.042 1.00 0.00 H \n+ATOM 539 H61 A B 6 41.514 26.992 21.139 1.00 0.00 H \n+ATOM 540 H62 A B 6 39.905 27.597 21.463 1.00 0.00 H \n+ATOM 541 H2 A B 6 42.825 28.725 17.221 1.00 0.00 H \n+ATOM 542 P A B 7 35.941 29.467 13.226 1.00 0.00 P \n+ATOM 543 OP1 A B 7 35.750 29.757 11.788 1.00 0.00 O \n+ATOM 544 OP2 A B 7 34.846 28.828 13.989 1.00 0.00 O \n+ATOM 545 O5' A B 7 37.262 28.550 13.393 1.00 0.00 O \n+ATOM 546 C5' A B 7 38.395 28.670 12.547 1.00 0.00 C \n+ATOM 547 C4' A B 7 39.479 27.664 12.965 1.00 0.00 C \n+ATOM 548 O4' A B 7 40.026 27.952 14.242 1.00 0.00 O \n+ATOM 549 C3' A B 7 38.964 26.227 13.057 1.00 0.00 C \n+ATOM 550 O3' A B 7 38.790 25.657 11.766 1.00 0.00 O \n+ATOM 551 C2' A B 7 40.080 25.596 13.890 1.00 0.00 C \n+ATOM 552 O2' A B 7 41.213 25.314 13.089 1.00 0.00 O \n+ATOM 553 C1' A B 7 40.405 26.735 14.874 1.00 0.00 C \n+ATOM 554 N9 A B 7 39.646 26.558 16.142 1.00 0.00 N \n+ATOM 555 C8 A B 7 38.370 26.963 16.459 1.00 0.00 C \n+ATOM 556 N7 A B 7 37.946 26.560 17.624 1.00 0.00 N \n+ATOM 557 C5 A B 7 39.021 25.845 18.137 1.00 0.00 C \n+ATOM 558 C6 A B 7 39.236 25.146 19.356 1.00 0.00 C \n+ATOM 559 N6 A B 7 38.301 25.035 20.310 1.00 0.00 N \n+ATOM 560 N1 A B 7 40.447 24.572 19.574 1.00 0.00 N \n+ATOM 561 C2 A B 7 41.390 24.670 18.628 1.00 0.00 C \n+ATOM 562 N3 A B 7 41.301 25.277 17.438 1.00 0.00 N \n+ATOM 563 C4 A B 7 40.075 25.857 17.246 1.00 0.00 C \n+ATOM 564 H5' A B 7 38.805 29.680 12.586 1.00 0.00 H \n+ATOM 565 H5'' A B 7 38.104 28.452 11.518 1.00 0.00 H \n+ATOM 566 H4' A B 7 40.296 27.711 12.240 1.00 0.00 H \n+ATOM 567 H3' A B 7 38.037 26.203 13.635 1.00 0.00 H \n+ATOM 568 H2' A B 7 39.755 24.682 14.389 1.00 0.00 H \n+ATOM 569 HO2' A B 7 40.942 24.723 12.383 1.00 0.00 H \n+ATOM 570 H1' A B 7 41.474 26.768 15.098 1.00 0.00 H \n+ATOM 571 H8 A B 7 37.754 27.551 15.796 1.00 0.00 H \n+ATOM 572 H61 A B 7 38.508 24.528 21.158 1.00 0.00 H \n+ATOM 573 H62 A B 7 37.391 25.453 20.180 1.00 0.00 H \n+ATOM 574 H2 A B 7 42.334 24.193 18.848 1.00 0.00 H \n+ATOM 575 P G B 8 37.741 24.459 11.478 1.00 0.00 P \n+ATOM 576 OP1 G B 8 37.880 24.049 10.062 1.00 0.00 O \n+ATOM 577 OP2 G B 8 36.415 24.868 11.990 1.00 0.00 O \n+ATOM 578 O5' G B 8 38.286 23.260 12.410 1.00 0.00 O \n+ATOM 579 C5' G B 8 39.492 22.567 12.142 1.00 0.00 C \n+ATOM 580 C4' G B 8 39.202 21.065 12.006 1.00 0.00 C \n+ATOM 581 O4' G B 8 38.339 20.882 10.896 1.00 0.00 O \n+ATOM 582 C3' G B 8 40.443 20.200 11.742 1.00 0.00 C \n+ATOM 583 O3' G B 8 41.113 19.711 12.903 1.00 0.00 O \n+ATOM 584 C2' G B 8 39.819 19.026 10.979 1.00 0.00 C \n+ATOM 585 O2' G B 8 39.284 18.061 11.871 1.00 0.00 O \n+ATOM 586 C1' G B 8 38.660 19.682 10.217 1.00 0.00 C \n+ATOM 587 N9 G B 8 38.998 19.967 8.798 1.00 0.00 N \n+ATOM 588 C8 G B 8 39.435 21.135 8.216 1.00 0.00 C \n+ATOM 589 N7 G B 8 39.517 21.088 6.915 1.00 0.00 N \n+ATOM 590 C5 G B 8 39.121 19.793 6.599 1.00 0.00 C \n+ATOM 591 C6 G B 8 38.982 19.150 5.322 1.00 0.00 C \n+ATOM 592 O6 G B 8 39.167 19.636 4.208 1.00 0.00 O \n+ATOM 593 N1 G B 8 38.578 17.809 5.424 1.00 0.00 N \n+ATOM 594 C2 G B 8 38.322 17.164 6.632 1.00 0.00 C \n+ATOM 595 N2 G B 8 37.957 15.875 6.571 1.00 0.00 N \n+ATOM 596 N3 G B 8 38.429 17.782 7.830 1.00 0.00 N \n+ATOM 597 C4 G B 8 38.831 19.089 7.750 1.00 0.00 C \n+ATOM 598 H5' G B 8 40.148 22.757 12.983 1.00 0.00 H \n+ATOM 599 H5'' G B 8 39.995 22.925 11.241 1.00 0.00 H \n+ATOM 600 H4' G B 8 38.695 20.684 12.893 1.00 0.00 H \n+ATOM 601 H3' G B 8 41.135 20.726 11.081 1.00 0.00 H \n+ATOM 602 H2' G B 8 40.544 18.539 10.322 1.00 0.00 H \n+ATOM 603 HO2' G B 8 38.655 18.498 12.451 1.00 0.00 H \n+ATOM 604 H1' G B 8 37.774 19.044 10.234 1.00 0.00 H \n+ATOM 605 H8 G B 8 39.671 22.027 8.781 1.00 0.00 H \n+ATOM 606 H1 G B 8 38.460 17.294 4.562 1.00 0.00 H \n+ATOM 607 H21 G B 8 37.877 15.413 5.677 1.00 0.00 H \n+ATOM 608 H22 G B 8 37.768 15.361 7.420 1.00 0.00 H \n+ATOM 609 P U B 9 41.808 20.651 14.025 1.00 0.00 P \n+ATOM 610 OP1 U B 9 42.437 21.810 13.351 1.00 0.00 O \n+ATOM 611 OP2 U B 9 42.634 19.775 14.887 1.00 0.00 O \n+ATOM 612 O5' U B 9 40.553 21.174 14.913 1.00 0.00 O \n+ATOM 613 C5' U B 9 40.744 21.985 16.062 1.00 0.00 C \n+ATOM 614 C4' U B 9 39.448 22.187 16.866 1.00 0.00 C \n+ATOM 615 O4' U B 9 38.501 23.038 16.238 1.00 0.00 O \n+ATOM 616 C3' U B 9 38.654 20.914 17.154 1.00 0.00 C \n+ATOM 617 O3' U B 9 39.302 20.032 18.062 1.00 0.00 O \n+ATOM 618 C2' U B 9 37.371 21.541 17.704 1.00 0.00 C \n+ATOM 619 O2' U B 9 37.510 21.925 19.061 1.00 0.00 O \n+ATOM 620 C1' U B 9 37.219 22.795 16.826 1.00 0.00 C \n+ATOM 621 N1 U B 9 36.138 22.583 15.812 1.00 0.00 N \n+ATOM 622 C2 U B 9 34.807 22.838 16.188 1.00 0.00 C \n+ATOM 623 O2 U B 9 34.482 23.186 17.322 1.00 0.00 O \n+ATOM 624 N3 U B 9 33.842 22.680 15.191 1.00 0.00 N \n+ATOM 625 C4 U B 9 34.082 22.257 13.883 1.00 0.00 C \n+ATOM 626 O4 U B 9 33.163 22.203 13.069 1.00 0.00 O \n+ATOM 627 C5 U B 9 35.467 21.899 13.615 1.00 0.00 C \n+ATOM 628 C6 U B 9 36.425 22.066 14.564 1.00 0.00 C \n+ATOM 629 H5' U B 9 41.145 22.958 15.768 1.00 0.00 H \n+ATOM 630 H5'' U B 9 41.466 21.502 16.726 1.00 0.00 H \n+ATOM 631 H4' U B 9 39.730 22.646 17.812 1.00 0.00 H \n+ATOM 632 H3' U B 9 38.441 20.412 16.208 1.00 0.00 H \n+ATOM 633 H2' U B 9 36.531 20.858 17.607 1.00 0.00 H \n+ATOM 634 HO2' U B 9 38.226 22.560 19.135 1.00 0.00 H \n+ATOM 635 H1' U B 9 36.976 23.669 17.438 1.00 0.00 H \n+ATOM 636 H3 U B 9 32.887 22.895 15.437 1.00 0.00 H \n+ATOM 637 H5 U B 9 35.739 21.500 12.648 1.00 0.00 H \n+ATOM 638 H6 U B 9 37.438 21.780 14.339 1.00 0.00 H \n+ATOM 639 P C B 10 38.822 18.494 18.264 1.00 0.00 P \n+ATOM 640 OP1 C B 10 39.707 17.868 19.271 1.00 0.00 O \n+ATOM 641 OP2 C B 10 38.692 17.876 16.925 1.00 0.00 O \n+ATOM 642 O5' C B 10 37.336 18.613 18.897 1.00 0.00 O \n+ATOM 643 C5' C B 10 37.103 18.918 20.263 1.00 0.00 C \n+ATOM 644 C4' C B 10 35.609 19.191 20.498 1.00 0.00 C \n+ATOM 645 O4' C B 10 35.138 20.238 19.662 1.00 0.00 O \n+ATOM 646 C3' C B 10 34.687 18.008 20.197 1.00 0.00 C \n+ATOM 647 O3' C B 10 34.731 16.996 21.195 1.00 0.00 O \n+ATOM 648 C2' C B 10 33.348 18.745 20.108 1.00 0.00 C \n+ATOM 649 O2' C B 10 32.828 19.037 21.392 1.00 0.00 O \n+ATOM 650 C1' C B 10 33.751 20.053 19.407 1.00 0.00 C \n+ATOM 651 N1 C B 10 33.439 19.972 17.942 1.00 0.00 N \n+ATOM 652 C2 C B 10 32.189 20.444 17.500 1.00 0.00 C \n+ATOM 653 O2 C B 10 31.414 21.016 18.265 1.00 0.00 O \n+ATOM 654 N3 C B 10 31.838 20.243 16.192 1.00 0.00 N \n+ATOM 655 C4 C B 10 32.652 19.604 15.330 1.00 0.00 C \n+ATOM 656 N4 C B 10 32.231 19.404 14.074 1.00 0.00 N \n+ATOM 657 C5 C B 10 33.943 19.118 15.754 1.00 0.00 C \n+ATOM 658 C6 C B 10 34.282 19.320 17.055 1.00 0.00 C \n+ATOM 659 H5' C B 10 37.671 19.802 20.558 1.00 0.00 H \n+ATOM 660 H5'' C B 10 37.417 18.079 20.888 1.00 0.00 H \n+ATOM 661 H4' C B 10 35.470 19.497 21.538 1.00 0.00 H \n+ATOM 662 H3' C B 10 34.947 17.592 19.223 1.00 0.00 H \n+ATOM 663 H2' C B 10 32.609 18.177 19.548 1.00 0.00 H \n+ATOM 664 HO2' C B 10 31.971 19.457 21.285 1.00 0.00 H \n+ATOM 665 H1' C B 10 33.241 20.906 19.860 1.00 0.00 H \n+ATOM 666 H41 C B 10 31.322 19.742 13.791 1.00 0.00 H \n+ATOM 667 H42 C B 10 32.817 18.916 13.412 1.00 0.00 H \n+ATOM 668 H5 C B 10 34.630 18.602 15.097 1.00 0.00 H \n+ATOM 669 H6 C B 10 35.232 18.941 17.393 1.00 0.00 H \n+ATOM 670 P G B 11 34.148 15.503 20.943 1.00 0.00 P \n+ATOM 671 OP1 G B 11 34.362 14.715 22.178 1.00 0.00 O \n+ATOM 672 OP2 G B 11 34.694 15.006 19.660 1.00 0.00 O \n+ATOM 673 O5' G B 11 32.556 15.720 20.749 1.00 0.00 O \n+ATOM 674 C5' G B 11 31.684 15.976 21.838 1.00 0.00 C \n+ATOM 675 C4' G B 11 30.265 16.257 21.325 1.00 0.00 C \n+ATOM 676 O4' G B 11 30.232 17.335 20.402 1.00 0.00 O \n+ATOM 677 C3' G B 11 29.631 15.081 20.578 1.00 0.00 C \n+ATOM 678 O3' G B 11 29.211 14.038 21.448 1.00 0.00 O \n+ATOM 679 C2' G B 11 28.483 15.809 19.877 1.00 0.00 C \n+ATOM 680 O2' G B 11 27.401 16.061 20.754 1.00 0.00 O \n+ATOM 681 C1' G B 11 29.157 17.134 19.490 1.00 0.00 C \n+ATOM 682 N9 G B 11 29.631 17.078 18.081 1.00 0.00 N \n+ATOM 683 C8 G B 11 30.889 16.841 17.577 1.00 0.00 C \n+ATOM 684 N7 G B 11 30.966 16.891 16.276 1.00 0.00 N \n+ATOM 685 C5 G B 11 29.664 17.157 15.873 1.00 0.00 C \n+ATOM 686 C6 G B 11 29.113 17.321 14.558 1.00 0.00 C \n+ATOM 687 O6 G B 11 29.711 17.301 13.485 1.00 0.00 O \n+ATOM 688 N1 G B 11 27.726 17.525 14.567 1.00 0.00 N \n+ATOM 689 C2 G B 11 26.953 17.568 15.724 1.00 0.00 C \n+ATOM 690 N2 G B 11 25.640 17.786 15.577 1.00 0.00 N \n+ATOM 691 N3 G B 11 27.477 17.425 16.961 1.00 0.00 N \n+ATOM 692 C4 G B 11 28.831 17.226 16.972 1.00 0.00 C \n+ATOM 693 H5' G B 11 32.029 16.837 22.412 1.00 0.00 H \n+ATOM 694 H5'' G B 11 31.653 15.109 22.501 1.00 0.00 H \n+ATOM 695 H4' G B 11 29.639 16.523 22.181 1.00 0.00 H \n+ATOM 696 H3' G B 11 30.340 14.714 19.832 1.00 0.00 H \n+ATOM 697 H2' G B 11 28.120 15.255 19.015 1.00 0.00 H \n+ATOM 698 HO2' G B 11 27.722 16.561 21.508 1.00 0.00 H \n+ATOM 699 H1' G B 11 28.458 17.968 19.584 1.00 0.00 H \n+ATOM 700 H8 G B 11 31.747 16.627 18.194 1.00 0.00 H \n+ATOM 701 H1 G B 11 27.270 17.646 13.674 1.00 0.00 H \n+ATOM 702 H21 G B 11 25.243 17.898 14.655 1.00 0.00 H \n+ATOM 703 H22 G B 11 25.045 17.837 16.392 1.00 0.00 H \n+ATOM 704 P C B 12 28.881 12.543 20.914 1.00 0.00 P \n+ATOM 705 OP1 C B 12 28.454 11.728 22.075 1.00 0.00 O \n+ATOM 706 OP2 C B 12 30.022 12.089 20.088 1.00 0.00 O \n+ATOM 707 O5' C B 12 27.608 12.738 19.935 1.00 0.00 O \n+ATOM 708 C5' C B 12 26.291 12.932 20.423 1.00 0.00 C \n+ATOM 709 C4' C B 12 25.326 13.215 19.263 1.00 0.00 C \n+ATOM 710 O4' C B 12 25.708 14.357 18.509 1.00 0.00 O \n+ATOM 711 C3' C B 12 25.231 12.089 18.231 1.00 0.00 C \n+ATOM 712 O3' C B 12 24.504 10.960 18.699 1.00 0.00 O \n+ATOM 713 C2' C B 12 24.544 12.844 17.092 1.00 0.00 C \n+ATOM 714 O2' C B 12 23.156 13.007 17.325 1.00 0.00 O \n+ATOM 715 C1' C B 12 25.255 14.206 17.165 1.00 0.00 C \n+ATOM 716 N1 C B 12 26.365 14.251 16.156 1.00 0.00 N \n+ATOM 717 C2 C B 12 26.032 14.566 14.825 1.00 0.00 C \n+ATOM 718 O2 C B 12 24.880 14.860 14.509 1.00 0.00 O \n+ATOM 719 N3 C B 12 27.020 14.537 13.877 1.00 0.00 N \n+ATOM 720 C4 C B 12 28.287 14.201 14.188 1.00 0.00 C \n+ATOM 721 N4 C B 12 29.206 14.180 13.214 1.00 0.00 N \n+ATOM 722 C5 C B 12 28.651 13.852 15.541 1.00 0.00 C \n+ATOM 723 C6 C B 12 27.663 13.887 16.475 1.00 0.00 C \n+ATOM 724 H5' C B 12 26.261 13.770 21.121 1.00 0.00 H \n+ATOM 725 H5'' C B 12 25.958 12.034 20.946 1.00 0.00 H \n+ATOM 726 H4' C B 12 24.337 13.403 19.688 1.00 0.00 H \n+ATOM 727 H3' C B 12 26.241 11.803 17.927 1.00 0.00 H \n+ATOM 728 H2' C B 12 24.678 12.346 16.135 1.00 0.00 H \n+ATOM 729 HO2' C B 12 23.032 13.482 18.149 1.00 0.00 H \n+ATOM 730 H1' C B 12 24.552 15.020 16.974 1.00 0.00 H \n+ATOM 731 H41 C B 12 28.939 14.422 12.271 1.00 0.00 H \n+ATOM 732 H42 C B 12 30.161 13.924 13.420 1.00 0.00 H \n+ATOM 733 H5 C B 12 29.652 13.568 15.833 1.00 0.00 H \n+ATOM 734 H6 C B 12 27.913 13.601 17.483 1.00 0.00 H \n+ATOM 735 P A B 13 24.617 9.505 17.991 1.00 0.00 P \n+ATOM 736 OP1 A B 13 23.729 8.574 18.722 1.00 0.00 O \n+ATOM 737 OP2 A B 13 26.053 9.176 17.847 1.00 0.00 O \n+ATOM 738 O5' A B 13 24.011 9.727 16.505 1.00 0.00 O \n+ATOM 739 C5' A B 13 22.618 9.831 16.259 1.00 0.00 C \n+ATOM 740 C4' A B 13 22.353 10.100 14.770 1.00 0.00 C \n+ATOM 741 O4' A B 13 22.975 11.293 14.318 1.00 0.00 O \n+ATOM 742 C3' A B 13 22.866 9.004 13.833 1.00 0.00 C \n+ATOM 743 O3' A B 13 22.049 7.849 13.828 1.00 0.00 O \n+ATOM 744 C2' A B 13 22.852 9.752 12.501 1.00 0.00 C \n+ATOM 745 O2' A B 13 21.541 9.813 11.966 1.00 0.00 O \n+ATOM 746 C1' A B 13 23.306 11.156 12.939 1.00 0.00 C \n+ATOM 747 N9 A B 13 24.770 11.324 12.721 1.00 0.00 N \n+ATOM 748 C8 A B 13 25.812 11.222 13.614 1.00 0.00 C \n+ATOM 749 N7 A B 13 26.992 11.419 13.094 1.00 0.00 N \n+ATOM 750 C5 A B 13 26.729 11.651 11.749 1.00 0.00 C \n+ATOM 751 C6 A B 13 27.554 11.913 10.621 1.00 0.00 C \n+ATOM 752 N6 A B 13 28.886 12.042 10.700 1.00 0.00 N \n+ATOM 753 N1 A B 13 26.971 12.038 9.402 1.00 0.00 N \n+ATOM 754 C2 A B 13 25.641 11.923 9.304 1.00 0.00 C \n+ATOM 755 N3 A B 13 24.760 11.697 10.287 1.00 0.00 N \n+ATOM 756 C4 A B 13 25.372 11.569 11.507 1.00 0.00 C \n+ATOM 757 H5' A B 13 22.187 10.642 16.848 1.00 0.00 H \n+ATOM 758 H5'' A B 13 22.122 8.899 16.539 1.00 0.00 H \n+ATOM 759 H4' A B 13 21.275 10.211 14.627 1.00 0.00 H \n+ATOM 760 H3' A B 13 23.892 8.730 14.086 1.00 0.00 H \n+ATOM 761 HO3' A B 13 22.384 7.243 13.163 1.00 0.00 H \n+ATOM 762 H2' A B 13 23.515 9.289 11.768 1.00 0.00 H \n+ATOM 763 HO2' A B 13 21.228 8.915 11.831 1.00 0.00 H \n+ATOM 764 H1' A B 13 22.781 11.928 12.372 1.00 0.00 H \n+ATOM 765 H8 A B 13 25.680 10.991 14.660 1.00 0.00 H \n+ATOM 766 H61 A B 13 29.421 12.237 9.867 1.00 0.00 H \n+ATOM 767 H62 A B 13 29.353 11.956 11.592 1.00 0.00 H \n+ATOM 768 H2 A B 13 25.226 12.032 8.313 1.00 0.00 H \n+TER 769 A B 13\n+END\n", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}42{"question_id": "MSB_openmm_openmm_pr3324", "question_type": "multi_swe_bench", "description": "NBFIX is applied correctly to 1-4 interactions (openmm/openmm#3324)", "content": {"org": "openmm", "repo": "openmm", "pr_number": 3324, "issue_title": "NBFIX is applied correctly to 1-4 interactions", "issue_body": "Fixes #3257.", "base_commit": "892839b89419465d52fb6c4f084b6a3888021311", "resolved_issues": [{"number": 3257, "title": "Incorrect non-bonded energy with CHARMM FF", "body": "I conducted a single point energy comparison between CHARMM and OpenMM with a simple test system containing a single cholesterol molecule ([test_chl1.tar.gz](https://github.com/openmm/openmm/files/7220567/test_chl1.tar.gz)).\r\n\r\n(unit: kcal/mol)\u00a0 | CHARMM | OpenMM\r\n-- | -- | --\r\nBond | 3.4090 | 3.4089\r\nAngle | 16.2683 | 16.2683\r\nUrey-Bradly | 2.3382 | 2.3382\r\nDihedral | 16.8157 | 16.8156\r\nImproper | 0.0000 | 0.0000\r\nvdW 1-4 | 6.5306 | 6.1477\r\nvdW | -3.4140 | -3.4140\r\nvdW Total | 3.1166 | 2.7337\r\nElec. 1-4 | -44.0315 | -\r\nElec. | -15.1082 | -\r\nElec. Total | -59.1397 | -46.7842\r\n\r\nAs shown above, while bonded energies are identical between CHARMM and OpenMM, non-bonded energies are different.\r\nThe energy difference in vdW 1-4 came from the NBFIX, i.e. if NBFIX parameter is available for a certain 1-4 atom type pair, the corresponding NBFIX parameter should be used.\r\nHowever, this doesn't seem to be implemented in `createSystem` function in `CharmmPsfFile` class.\r\n\r\nhttps://github.com/openmm/openmm/blob/779400a1e3fdc988e84fa7aed760ac95d81c179c/wrappers/python/openmm/app/charmmpsffile.py#L1383-L1390\r\n\r\nFor electrostatic interaction, I have no idea what is causing the difference.\r\n\r\nCould you please check this case?\r\n\r\nFor non-bonded interaction, I used the hard-truncation with 12 \u00c5 cut-off without PBC (CutoffNonPeriodic).\r\n\n\n## IMPORTANT INSTRUCTIONS\n\n1. If you edit a python file, you MUST run 'make PythonInstall' inside the build directory\n2. If you edit a c++ file, you MUST run 'make -j4 && make install\" inside the build directory"}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/openmm_m_openmm:pr-3324", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/wrappers/python/openmm/app/charmmpsffile.py b/wrappers/python/openmm/app/charmmpsffile.py\nindex 3f07245326..254f3454c6 100644\n--- a/wrappers/python/openmm/app/charmmpsffile.py\n+++ b/wrappers/python/openmm/app/charmmpsffile.py\n@@ -1387,8 +1387,13 @@ def _is_bond_in_water(bond):\n atom1 = self.atom_list[ia1]\n atom4 = self.atom_list[ia4]\n charge_prod = (atom1.charge * atom4.charge) * params.e14fac\n- epsilon = sqrt(abs(atom1.type.epsilon_14 * atom4.type.epsilon_14)) * ene_conv\n- sigma = (atom1.type.rmin_14 + atom4.type.rmin_14) * (length_conv * sigma_scale)\n+ try:\n+ rij, wdij, rij14, wdij14 = atom1.type.nbfix[atom4.type.name]\n+ epsilon = wdij14*ene_conv\n+ sigma = rij14*length_conv*sigma_scale\n+ except KeyError:\n+ epsilon = sqrt(abs(atom1.type.epsilon_14 * atom4.type.epsilon_14)) * ene_conv\n+ sigma = (atom1.type.rmin_14 + atom4.type.rmin_14) * (length_conv * sigma_scale)\n force.addException(ia1, ia4, charge_prod, sigma, epsilon)\n \n # Add excluded atoms\n"}, "test": {"test_patch": "diff --git a/wrappers/python/tests/TestCharmmFiles.py b/wrappers/python/tests/TestCharmmFiles.py\nindex a7f5a16c78..10f4c2c59d 100644\n--- a/wrappers/python/tests/TestCharmmFiles.py\n+++ b/wrappers/python/tests/TestCharmmFiles.py\n@@ -150,6 +150,30 @@ def test_NBFIX(self):\n ene = state.getPotentialEnergy().value_in_unit(kilocalories_per_mole)\n self.assertAlmostEqual(ene, 15559.71602, delta=0.05)\n \n+ def test_NBFIX14(self):\n+ \"\"\"Tests CHARMM systems with NBFIX modifications to 1-4 interactions\"\"\"\n+ warnings.filterwarnings('ignore', category=CharmmPSFWarning)\n+ psf = CharmmPsfFile('systems/chl1.psf')\n+ crd = CharmmCrdFile('systems/chl1.crd')\n+ params = CharmmParameterSet('systems/par_all36_lipid.prm', 'systems/par_all36_cgenff.prm', 'systems/toppar_all36_lipid_cholesterol.str')\n+\n+ # Turn off charges so we only test the Lennard-Jones energies\n+ for a in psf.atom_list:\n+ a.charge = 0.0\n+\n+ # Compute the Lennard-Jones energy\n+ system = psf.createSystem(params, nonbondedMethod=CutoffNonPeriodic, nonbondedCutoff=12*angstroms)\n+ for i, f in enumerate(system.getForces()):\n+ if isinstance(f, NonbondedForce) or isinstance(f, CustomNonbondedForce):\n+ f.setForceGroup(1)\n+ else:\n+ f.setForceGroup(0)\n+ context = Context(system, VerletIntegrator(2*femtoseconds), Platform.getPlatformByName('Reference'))\n+ context.setPositions(crd.positions)\n+ state = context.getState(getEnergy=True, groups={1})\n+ energy = state.getPotentialEnergy().value_in_unit(kilocalories_per_mole)\n+ self.assertAlmostEqual(energy, 3.1166, delta=1e-4)\n+\n def test_NBThole(self):\n \"\"\"Tests CHARMM system with NBTHole\"\"\"\n warnings.filterwarnings('ignore', category=CharmmPSFWarning)\ndiff --git a/wrappers/python/tests/systems/chl1.crd b/wrappers/python/tests/systems/chl1.crd\nnew file mode 100644\nindex 0000000000..75133c37f2\n--- /dev/null\n+++ b/wrappers/python/tests/systems/chl1.crd\n@@ -0,0 +1,79 @@\n+* GENERATED BY CHARMM-GUI (HTTP://WWW.CHARMM-GUI.ORG) V2.0 ON APR, 20. 2017. JOB\n+* GET A DIFFERENT CONFORMATION FOR LIPIDS PENETRATING PROTEIN / CHOL\n+* DATE: 9/22/21 15:13: 3 CREATED BY USER: jlee\n+*\n+ 74 EXT\n+ 1 1 CHL1 C3 2.0758430000 1.4287490000 -0.0024380000 CHL1 1 0.0000000000\n+ 2 1 CHL1 H3 1.7789920000 1.9075100000 -0.9655430000 CHL1 1 0.0000000000\n+ 3 1 CHL1 O3 3.4901020000 1.4114150000 0.0741910000 CHL1 1 0.0000000000\n+ 4 1 CHL1 H3' 3.6956580000 0.9624930000 0.8967140000 CHL1 1 0.0000000000\n+ 5 1 CHL1 C4 1.5114820000 2.2413810000 1.1750860000 CHL1 1 0.0000000000\n+ 6 1 CHL1 H4A 1.9148670000 3.2768030000 1.0908510000 CHL1 1 0.0000000000\n+ 7 1 CHL1 H4B 1.9116520000 1.8253500000 2.1234900000 CHL1 1 0.0000000000\n+ 8 1 CHL1 C5 -0.0042430000 2.2232410000 1.2047520000 CHL1 1 0.0000000000\n+ 9 1 CHL1 C6 -0.7185500000 3.3605640000 1.1867230000 CHL1 1 0.0000000000\n+ 10 1 CHL1 H6 -0.1961740000 4.3287470000 1.1811170000 CHL1 1 0.0000000000\n+ 11 1 CHL1 C7 -2.2182720000 3.4093590000 1.2529030000 CHL1 1 0.0000000000\n+ 12 1 CHL1 H7A -2.6174250000 3.6976270000 0.2559360000 CHL1 1 0.0000000000\n+ 13 1 CHL1 H7B -2.5510300000 4.1816550000 1.9801080000 CHL1 1 0.0000000000\n+ 14 1 CHL1 C8 -2.8493790000 2.0493740000 1.6586470000 CHL1 1 0.0000000000\n+ 15 1 CHL1 H8 -2.6976970000 1.9177710000 2.7522240000 CHL1 1 0.0000000000\n+ 16 1 CHL1 C14 -4.3402020000 2.0530670000 1.3479140000 CHL1 1 0.0000000000\n+ 17 1 CHL1 H14 -4.4174730000 2.1586370000 0.2344860000 CHL1 1 0.0000000000\n+ 18 1 CHL1 C15 -5.1864690000 3.2052640000 1.9147900000 CHL1 1 0.0000000000\n+ 19 1 CHL1 H15A -5.0243010000 4.1528850000 1.3633690000 CHL1 1 0.0000000000\n+ 20 1 CHL1 H15B -4.9339520000 3.3605530000 2.9859010000 CHL1 1 0.0000000000\n+ 21 1 CHL1 C16 -6.6269070000 2.6905440000 1.7787000000 CHL1 1 0.0000000000\n+ 22 1 CHL1 H16A -7.1958500000 3.2680330000 1.0215770000 CHL1 1 0.0000000000\n+ 23 1 CHL1 H16B -7.1376360000 2.7834600000 2.7609420000 CHL1 1 0.0000000000\n+ 24 1 CHL1 C17 -6.5372270000 1.1878570000 1.3493380000 CHL1 1 0.0000000000\n+ 25 1 CHL1 H17 -6.6019490000 1.1763380000 0.2350740000 CHL1 1 0.0000000000\n+ 26 1 CHL1 C13 -5.0880620000 0.7643510000 1.6898470000 CHL1 1 0.0000000000\n+ 27 1 CHL1 C18 -5.0064860000 0.4701080000 3.2112890000 CHL1 1 0.0000000000\n+ 28 1 CHL1 H18A -5.4771980000 1.2760610000 3.8078890000 CHL1 1 0.0000000000\n+ 29 1 CHL1 H18B -3.9571470000 0.3656950000 3.5470390000 CHL1 1 0.0000000000\n+ 30 1 CHL1 H18C -5.5253140000 -0.4812360000 3.4456420000 CHL1 1 0.0000000000\n+ 31 1 CHL1 C12 -4.4501040000 -0.3574190000 0.8429720000 CHL1 1 0.0000000000\n+ 32 1 CHL1 H12A -4.6174580000 -0.1329160000 -0.2328530000 CHL1 1 0.0000000000\n+ 33 1 CHL1 H12B -4.9071470000 -1.3405780000 1.0619880000 CHL1 1 0.0000000000\n+ 34 1 CHL1 C11 -2.9326770000 -0.4609040000 1.1008090000 CHL1 1 0.0000000000\n+ 35 1 CHL1 H11A -2.5100440000 -1.2251340000 0.4155920000 CHL1 1 0.0000000000\n+ 36 1 CHL1 H11B -2.8003630000 -0.8324760000 2.1373400000 CHL1 1 0.0000000000\n+ 37 1 CHL1 C9 -2.1768110000 0.8895300000 0.9143010000 CHL1 1 0.0000000000\n+ 38 1 CHL1 H9 -2.2977970000 1.1402610000 -0.1695780000 CHL1 1 0.0000000000\n+ 39 1 CHL1 C10 -0.6446230000 0.8183080000 1.1682710000 CHL1 1 0.0000000000\n+ 40 1 CHL1 C19 -0.3877040000 0.1475000000 2.5441910000 CHL1 1 0.0000000000\n+ 41 1 CHL1 H19A -0.9335740000 0.6777980000 3.3513270000 CHL1 1 0.0000000000\n+ 42 1 CHL1 H19B 0.6897940000 0.1400840000 2.8025550000 CHL1 1 0.0000000000\n+ 43 1 CHL1 H19C -0.7162580000 -0.9108240000 2.5315180000 CHL1 1 0.0000000000\n+ 44 1 CHL1 C1 0.0140190000 -0.0227780000 0.0327100000 CHL1 1 0.0000000000\n+ 45 1 CHL1 H1A -0.3316670000 0.3767310000 -0.9472730000 CHL1 1 0.0000000000\n+ 46 1 CHL1 H1B -0.3334130000 -1.0747520000 0.1067690000 CHL1 1 0.0000000000\n+ 47 1 CHL1 C2 1.5521950000 -0.0100270000 0.0330650000 CHL1 1 0.0000000000\n+ 48 1 CHL1 H2A 1.9243040000 -0.5230830000 0.9458070000 CHL1 1 0.0000000000\n+ 49 1 CHL1 H2B 1.9346080000 -0.5653680000 -0.8513700000 CHL1 1 0.0000000000\n+ 50 1 CHL1 C20 -7.7246780000 0.3593490000 1.8737490000 CHL1 1 0.0000000000\n+ 51 1 CHL1 H20 -7.7090080000 0.3716970000 2.9880740000 CHL1 1 0.0000000000\n+ 52 1 CHL1 C21 -7.6153060000 -1.1076400000 1.4054310000 CHL1 1 0.0000000000\n+ 53 1 CHL1 H21A -6.7567890000 -1.6098270000 1.8911100000 CHL1 1 0.0000000000\n+ 54 1 CHL1 H21B -7.4954750000 -1.1568730000 0.3031920000 CHL1 1 0.0000000000\n+ 55 1 CHL1 H21C -8.5172290000 -1.6860490000 1.6875930000 CHL1 1 0.0000000000\n+ 56 1 CHL1 C22 -9.0849100000 0.9697470000 1.4326760000 CHL1 1 0.0000000000\n+ 57 1 CHL1 H22A -9.1561990000 0.9304830000 0.3238230000 CHL1 1 0.0000000000\n+ 58 1 CHL1 H22B -9.1287420000 2.0387760000 1.7346150000 CHL1 1 0.0000000000\n+ 59 1 CHL1 C23 -10.3258450000 0.2922230000 2.0422060000 CHL1 1 0.0000000000\n+ 60 1 CHL1 H23A -10.2114010000 0.2526360000 3.1483210000 CHL1 1 0.0000000000\n+ 61 1 CHL1 H23B -10.4034320000 -0.7498490000 1.6668930000 CHL1 1 0.0000000000\n+ 62 1 CHL1 C24 -11.6240990000 1.0427750000 1.7005560000 CHL1 1 0.0000000000\n+ 63 1 CHL1 H24A -11.7579260000 1.0650290000 0.5968610000 CHL1 1 0.0000000000\n+ 64 1 CHL1 H24B -11.5215770000 2.0951660000 2.0485660000 CHL1 1 0.0000000000\n+ 65 1 CHL1 C25 -12.8929290000 0.4444570000 2.3453720000 CHL1 1 0.0000000000\n+ 66 1 CHL1 H25 -12.7160890000 0.3730380000 3.4453480000 CHL1 1 0.0000000000\n+ 67 1 CHL1 C26 -14.0995530000 1.3709480000 2.1214960000 CHL1 1 0.0000000000\n+ 68 1 CHL1 H26A -14.3073370000 1.4755350000 1.0355250000 CHL1 1 0.0000000000\n+ 69 1 CHL1 H26B -13.8988040000 2.3788300000 2.5421330000 CHL1 1 0.0000000000\n+ 70 1 CHL1 H26C -15.0033380000 0.9555930000 2.6153310000 CHL1 1 0.0000000000\n+ 71 1 CHL1 C27 -13.2063260000 -0.9657240000 1.8173800000 CHL1 1 0.0000000000\n+ 72 1 CHL1 H27A -12.3832270000 -1.6705450000 2.0552520000 CHL1 1 0.0000000000\n+ 73 1 CHL1 H27B -13.3457700000 -0.9412980000 0.7159300000 CHL1 1 0.0000000000\n+ 74 1 CHL1 H27C -14.1385570000 -1.3514600000 2.2815630000 CHL1 1 0.0000000000\ndiff --git a/wrappers/python/tests/systems/chl1.psf b/wrappers/python/tests/systems/chl1.psf\nnew file mode 100644\nindex 0000000000..7ffc881336\n--- /dev/null\n+++ b/wrappers/python/tests/systems/chl1.psf\n@@ -0,0 +1,341 @@\n+PSF EXT CMAP CHEQ XPLOR\n+\n+ 3 !NTITLE\n+* GENERATED BY CHARMM-GUI (HTTP://WWW.CHARMM-GUI.ORG) V2.0 ON APR, 20. 2017. JOB\n+* GET A DIFFERENT CONFORMATION FOR LIPIDS PENETRATING PROTEIN / CHOL \n+* DATE: 9/22/21 15:13: 3 CREATED BY USER: jlee \n+\n+ 74 !NATOM\n+ 1 CHL1 1 CHL1 C3 CRL1 0.140000 12.0110 0 0.00000 -0.301140E-02\n+ 2 CHL1 1 CHL1 H3 HGA1 0.900000E-01 1.00800 0 0.00000 -0.301140E-02\n+ 3 CHL1 1 CHL1 O3 OHL -0.660000 15.9994 0 0.00000 -0.301140E-02\n+ 4 CHL1 1 CHL1 H3' HOL 0.430000 1.00800 0 0.00000 -0.301140E-02\n+ 5 CHL1 1 CHL1 C4 CRL2 -0.180000 12.0110 0 0.00000 -0.301140E-02\n+ 6 CHL1 1 CHL1 H4A HGA2 0.900000E-01 1.00800 0 0.00000 -0.301140E-02\n+ 7 CHL1 1 CHL1 H4B HGA2 0.900000E-01 1.00800 0 0.00000 -0.301140E-02\n+ 8 CHL1 1 CHL1 C5 CEL1 0.00000 12.0110 0 0.00000 -0.301140E-02\n+ 9 CHL1 1 CHL1 C6 CEL1 -0.150000 12.0110 0 0.00000 -0.301140E-02\n+ 10 CHL1 1 CHL1 H6 HEL1 0.150000 1.00800 0 0.00000 -0.301140E-02\n+ 11 CHL1 1 CHL1 C7 CRL2 -0.180000 12.0110 0 0.00000 -0.301140E-02\n+ 12 CHL1 1 CHL1 H7A HGA2 0.900000E-01 1.00800 0 0.00000 -0.301140E-02\n+ 13 CHL1 1 CHL1 H7B HGA2 0.900000E-01 1.00800 0 0.00000 -0.301140E-02\n+ 14 CHL1 1 CHL1 C8 CRL1 -0.900000E-01 12.0110 0 0.00000 -0.301140E-02\n+ 15 CHL1 1 CHL1 H8 HGA1 0.900000E-01 1.00800 0 0.00000 -0.301140E-02\n+ 16 CHL1 1 CHL1 C14 CRL1 -0.900000E-01 12.0110 0 0.00000 -0.301140E-02\n+ 17 CHL1 1 CHL1 H14 HGA1 0.900000E-01 1.00800 0 0.00000 -0.301140E-02\n+ 18 CHL1 1 CHL1 C15 CRL2 -0.180000 12.0110 0 0.00000 -0.301140E-02\n+ 19 CHL1 1 CHL1 H15A HGA2 0.900000E-01 1.00800 0 0.00000 -0.301140E-02\n+ 20 CHL1 1 CHL1 H15B HGA2 0.900000E-01 1.00800 0 0.00000 -0.301140E-02\n+ 21 CHL1 1 CHL1 C16 CRL2 -0.180000 12.0110 0 0.00000 -0.301140E-02\n+ 22 CHL1 1 CHL1 H16A HGA2 0.900000E-01 1.00800 0 0.00000 -0.301140E-02\n+ 23 CHL1 1 CHL1 H16B HGA2 0.900000E-01 1.00800 0 0.00000 -0.301140E-02\n+ 24 CHL1 1 CHL1 C17 CRL1 -0.900000E-01 12.0110 0 0.00000 -0.301140E-02\n+ 25 CHL1 1 CHL1 H17 HGA1 0.900000E-01 1.00800 0 0.00000 -0.301140E-02\n+ 26 CHL1 1 CHL1 C13 CRL1 0.00000 12.0110 0 0.00000 -0.301140E-02\n+ 27 CHL1 1 CHL1 C18 CTL3 -0.270000 12.0110 0 0.00000 -0.301140E-02\n+ 28 CHL1 1 CHL1 H18A HAL3 0.900000E-01 1.00800 0 0.00000 -0.301140E-02\n+ 29 CHL1 1 CHL1 H18B HAL3 0.900000E-01 1.00800 0 0.00000 -0.301140E-02\n+ 30 CHL1 1 CHL1 H18C HAL3 0.900000E-01 1.00800 0 0.00000 -0.301140E-02\n+ 31 CHL1 1 CHL1 C12 CRL2 -0.180000 12.0110 0 0.00000 -0.301140E-02\n+ 32 CHL1 1 CHL1 H12A HGA2 0.900000E-01 1.00800 0 0.00000 -0.301140E-02\n+ 33 CHL1 1 CHL1 H12B HGA2 0.900000E-01 1.00800 0 0.00000 -0.301140E-02\n+ 34 CHL1 1 CHL1 C11 CRL2 -0.180000 12.0110 0 0.00000 -0.301140E-02\n+ 35 CHL1 1 CHL1 H11A HGA2 0.900000E-01 1.00800 0 0.00000 -0.301140E-02\n+ 36 CHL1 1 CHL1 H11B HGA2 0.900000E-01 1.00800 0 0.00000 -0.301140E-02\n+ 37 CHL1 1 CHL1 C9 CRL1 -0.900000E-01 12.0110 0 0.00000 -0.301140E-02\n+ 38 CHL1 1 CHL1 H9 HGA1 0.900000E-01 1.00800 0 0.00000 -0.301140E-02\n+ 39 CHL1 1 CHL1 C10 CRL1 0.00000 12.0110 0 0.00000 -0.301140E-02\n+ 40 CHL1 1 CHL1 C19 CTL3 -0.270000 12.0110 0 0.00000 -0.301140E-02\n+ 41 CHL1 1 CHL1 H19A HAL3 0.900000E-01 1.00800 0 0.00000 -0.301140E-02\n+ 42 CHL1 1 CHL1 H19B HAL3 0.900000E-01 1.00800 0 0.00000 -0.301140E-02\n+ 43 CHL1 1 CHL1 H19C HAL3 0.900000E-01 1.00800 0 0.00000 -0.301140E-02\n+ 44 CHL1 1 CHL1 C1 CRL2 -0.180000 12.0110 0 0.00000 -0.301140E-02\n+ 45 CHL1 1 CHL1 H1A HGA2 0.900000E-01 1.00800 0 0.00000 -0.301140E-02\n+ 46 CHL1 1 CHL1 H1B HGA2 0.900000E-01 1.00800 0 0.00000 -0.301140E-02\n+ 47 CHL1 1 CHL1 C2 CRL2 -0.180000 12.0110 0 0.00000 -0.301140E-02\n+ 48 CHL1 1 CHL1 H2A HGA2 0.900000E-01 1.00800 0 0.00000 -0.301140E-02\n+ 49 CHL1 1 CHL1 H2B HGA2 0.900000E-01 1.00800 0 0.00000 -0.301140E-02\n+ 50 CHL1 1 CHL1 C20 CTL1 -0.900000E-01 12.0110 0 0.00000 -0.301140E-02\n+ 51 CHL1 1 CHL1 H20 HAL1 0.900000E-01 1.00800 0 0.00000 -0.301140E-02\n+ 52 CHL1 1 CHL1 C21 CTL3 -0.270000 12.0110 0 0.00000 -0.301140E-02\n+ 53 CHL1 1 CHL1 H21A HAL3 0.900000E-01 1.00800 0 0.00000 -0.301140E-02\n+ 54 CHL1 1 CHL1 H21B HAL3 0.900000E-01 1.00800 0 0.00000 -0.301140E-02\n+ 55 CHL1 1 CHL1 H21C HAL3 0.900000E-01 1.00800 0 0.00000 -0.301140E-02\n+ 56 CHL1 1 CHL1 C22 CTL2 -0.180000 12.0110 0 0.00000 -0.301140E-02\n+ 57 CHL1 1 CHL1 H22A HAL2 0.900000E-01 1.00800 0 0.00000 -0.301140E-02\n+ 58 CHL1 1 CHL1 H22B HAL2 0.900000E-01 1.00800 0 0.00000 -0.301140E-02\n+ 59 CHL1 1 CHL1 C23 CTL2 -0.180000 12.0110 0 0.00000 -0.301140E-02\n+ 60 CHL1 1 CHL1 H23A HAL2 0.900000E-01 1.00800 0 0.00000 -0.301140E-02\n+ 61 CHL1 1 CHL1 H23B HAL2 0.900000E-01 1.00800 0 0.00000 -0.301140E-02\n+ 62 CHL1 1 CHL1 C24 CTL2 -0.180000 12.0110 0 0.00000 -0.301140E-02\n+ 63 CHL1 1 CHL1 H24A HAL2 0.900000E-01 1.00800 0 0.00000 -0.301140E-02\n+ 64 CHL1 1 CHL1 H24B HAL2 0.900000E-01 1.00800 0 0.00000 -0.301140E-02\n+ 65 CHL1 1 CHL1 C25 CTL1 -0.900000E-01 12.0110 0 0.00000 -0.301140E-02\n+ 66 CHL1 1 CHL1 H25 HAL1 0.900000E-01 1.00800 0 0.00000 -0.301140E-02\n+ 67 CHL1 1 CHL1 C26 CTL3 -0.270000 12.0110 0 0.00000 -0.301140E-02\n+ 68 CHL1 1 CHL1 H26A HAL3 0.900000E-01 1.00800 0 0.00000 -0.301140E-02\n+ 69 CHL1 1 CHL1 H26B HAL3 0.900000E-01 1.00800 0 0.00000 -0.301140E-02\n+ 70 CHL1 1 CHL1 H26C HAL3 0.900000E-01 1.00800 0 0.00000 -0.301140E-02\n+ 71 CHL1 1 CHL1 C27 CTL3 -0.270000 12.0110 0 0.00000 -0.301140E-02\n+ 72 CHL1 1 CHL1 H27A HAL3 0.900000E-01 1.00800 0 0.00000 -0.301140E-02\n+ 73 CHL1 1 CHL1 H27B HAL3 0.900000E-01 1.00800 0 0.00000 -0.301140E-02\n+ 74 CHL1 1 CHL1 H27C HAL3 0.900000E-01 1.00800 0 0.00000 -0.301140E-02\n+\n+ 77 !NBOND: bonds\n+ 1 3 1 2 3 4 1 47\n+ 47 48 47 49 47 44 44 45\n+ 44 46 1 5 5 6 5 7\n+ 5 8 8 39 39 44 39 40\n+ 40 41 40 42 40 43 8 9\n+ 9 10 9 11 11 12 11 13\n+ 11 14 14 15 14 37 37 38\n+ 37 39 14 16 16 17 16 26\n+ 26 31 31 32 31 33 31 34\n+ 34 35 34 36 34 37 26 27\n+ 27 28 27 29 27 30 16 18\n+ 18 19 18 20 18 21 21 22\n+ 21 23 21 24 24 25 24 26\n+ 24 50 50 51 50 52 52 53\n+ 52 54 52 55 50 56 56 57\n+ 56 58 56 59 59 60 59 61\n+ 59 62 62 63 62 64 62 65\n+ 65 66 65 67 67 68 67 69\n+ 67 70 65 71 71 72 71 73\n+ 71 74\n+\n+ 157 !NTHETA: angles\n+ 2 1 3 2 1 5 2 1 47\n+ 3 1 5 3 1 47 5 1 47\n+ 1 3 4 1 5 6 1 5 7\n+ 1 5 8 6 5 7 6 5 8\n+ 7 5 8 5 8 9 5 8 39\n+ 9 8 39 8 9 10 8 9 11\n+ 10 9 11 9 11 12 9 11 13\n+ 9 11 14 12 11 13 12 11 14\n+ 13 11 14 11 14 15 11 14 16\n+ 11 14 37 15 14 16 15 14 37\n+ 16 14 37 14 16 17 14 16 18\n+ 14 16 26 17 16 18 17 16 26\n+ 18 16 26 16 18 19 16 18 20\n+ 16 18 21 19 18 20 19 18 21\n+ 20 18 21 18 21 22 18 21 23\n+ 18 21 24 22 21 23 22 21 24\n+ 23 21 24 21 24 25 21 24 26\n+ 21 24 50 25 24 26 25 24 50\n+ 26 24 50 16 26 24 16 26 27\n+ 16 26 31 24 26 27 24 26 31\n+ 27 26 31 26 27 28 26 27 29\n+ 26 27 30 28 27 29 28 27 30\n+ 29 27 30 26 31 32 26 31 33\n+ 26 31 34 32 31 33 32 31 34\n+ 33 31 34 31 34 35 31 34 36\n+ 31 34 37 35 34 36 35 34 37\n+ 36 34 37 14 37 34 14 37 38\n+ 14 37 39 34 37 38 34 37 39\n+ 38 37 39 8 39 37 8 39 40\n+ 8 39 44 37 39 40 37 39 44\n+ 40 39 44 39 40 41 39 40 42\n+ 39 40 43 41 40 42 41 40 43\n+ 42 40 43 39 44 45 39 44 46\n+ 39 44 47 45 44 46 45 44 47\n+ 46 44 47 1 47 44 1 47 48\n+ 1 47 49 44 47 48 44 47 49\n+ 48 47 49 24 50 51 24 50 52\n+ 24 50 56 51 50 52 51 50 56\n+ 52 50 56 50 52 53 50 52 54\n+ 50 52 55 53 52 54 53 52 55\n+ 54 52 55 50 56 57 50 56 58\n+ 50 56 59 57 56 58 57 56 59\n+ 58 56 59 56 59 60 56 59 61\n+ 56 59 62 60 59 61 60 59 62\n+ 61 59 62 59 62 63 59 62 64\n+ 59 62 65 63 62 64 63 62 65\n+ 64 62 65 62 65 66 62 65 67\n+ 62 65 71 66 65 67 66 65 71\n+ 67 65 71 65 67 68 65 67 69\n+ 65 67 70 68 67 69 68 67 70\n+ 69 67 70 65 71 72 65 71 73\n+ 65 71 74 72 71 73 72 71 74\n+ 73 71 74\n+\n+ 259 !NPHI: dihedrals\n+ 1 5 8 9 1 5 8 39\n+ 1 47 44 39 1 47 44 45\n+ 1 47 44 46 2 1 3 4\n+ 2 1 5 6 2 1 5 7\n+ 2 1 5 8 2 1 47 44\n+ 2 1 47 48 2 1 47 49\n+ 3 1 5 6 3 1 5 7\n+ 3 1 5 8 3 1 47 44\n+ 3 1 47 48 3 1 47 49\n+ 4 3 1 5 4 3 1 47\n+ 5 1 47 44 5 1 47 48\n+ 5 1 47 49 5 8 9 10\n+ 5 8 9 11 5 8 39 37\n+ 5 8 39 40 5 8 39 44\n+ 6 5 1 47 6 5 8 9\n+ 6 5 8 39 7 5 1 47\n+ 7 5 8 9 7 5 8 39\n+ 8 5 1 47 8 9 11 12\n+ 8 9 11 13 8 9 11 14\n+ 8 39 37 14 8 39 37 34\n+ 8 39 37 38 8 39 40 41\n+ 8 39 40 42 8 39 40 43\n+ 8 39 44 45 8 39 44 46\n+ 8 39 44 47 9 8 39 37\n+ 9 8 39 40 9 8 39 44\n+ 9 11 14 15 9 11 14 16\n+ 9 11 14 37 10 9 8 39\n+ 10 9 11 12 10 9 11 13\n+ 10 9 11 14 11 9 8 39\n+ 11 14 16 17 11 14 16 18\n+ 11 14 16 26 11 14 37 34\n+ 11 14 37 38 11 14 37 39\n+ 12 11 14 15 12 11 14 16\n+ 12 11 14 37 13 11 14 15\n+ 13 11 14 16 13 11 14 37\n+ 14 16 18 19 14 16 18 20\n+ 14 16 18 21 14 16 26 24\n+ 14 16 26 27 14 16 26 31\n+ 14 37 34 31 14 37 34 35\n+ 14 37 34 36 14 37 39 40\n+ 14 37 39 44 15 14 16 17\n+ 15 14 16 18 15 14 16 26\n+ 15 14 37 34 15 14 37 38\n+ 15 14 37 39 16 14 37 34\n+ 16 14 37 38 16 14 37 39\n+ 16 18 21 22 16 18 21 23\n+ 16 18 21 24 16 26 24 21\n+ 16 26 24 25 16 26 24 50\n+ 16 26 27 28 16 26 27 29\n+ 16 26 27 30 16 26 31 32\n+ 16 26 31 33 16 26 31 34\n+ 17 16 14 37 17 16 18 19\n+ 17 16 18 20 17 16 18 21\n+ 17 16 26 24 17 16 26 27\n+ 17 16 26 31 18 16 14 37\n+ 18 16 26 24 18 16 26 27\n+ 18 16 26 31 18 21 24 25\n+ 18 21 24 26 18 21 24 50\n+ 19 18 16 26 19 18 21 22\n+ 19 18 21 23 19 18 21 24\n+ 20 18 16 26 20 18 21 22\n+ 20 18 21 23 20 18 21 24\n+ 21 18 16 26 21 24 26 27\n+ 21 24 26 31 21 24 50 51\n+ 21 24 50 52 21 24 50 56\n+ 22 21 24 25 22 21 24 26\n+ 22 21 24 50 23 21 24 25\n+ 23 21 24 26 23 21 24 50\n+ 24 26 27 28 24 26 27 29\n+ 24 26 27 30 24 26 31 32\n+ 24 26 31 33 24 26 31 34\n+ 24 50 52 53 24 50 52 54\n+ 24 50 52 55 24 50 56 57\n+ 24 50 56 58 24 50 56 59\n+ 25 24 26 27 25 24 26 31\n+ 25 24 50 51 25 24 50 52\n+ 25 24 50 56 26 16 14 37\n+ 26 24 50 51 26 24 50 52\n+ 26 24 50 56 26 31 34 35\n+ 26 31 34 36 26 31 34 37\n+ 27 26 24 50 27 26 31 32\n+ 27 26 31 33 27 26 31 34\n+ 28 27 26 31 29 27 26 31\n+ 30 27 26 31 31 26 24 50\n+ 31 34 37 38 31 34 37 39\n+ 32 31 34 35 32 31 34 36\n+ 32 31 34 37 33 31 34 35\n+ 33 31 34 36 33 31 34 37\n+ 34 37 39 40 34 37 39 44\n+ 35 34 37 38 35 34 37 39\n+ 36 34 37 38 36 34 37 39\n+ 37 39 40 41 37 39 40 42\n+ 37 39 40 43 37 39 44 45\n+ 37 39 44 46 37 39 44 47\n+ 38 37 39 40 38 37 39 44\n+ 39 44 47 48 39 44 47 49\n+ 40 39 44 45 40 39 44 46\n+ 40 39 44 47 41 40 39 44\n+ 42 40 39 44 43 40 39 44\n+ 45 44 47 48 45 44 47 49\n+ 46 44 47 48 46 44 47 49\n+ 50 56 59 60 50 56 59 61\n+ 50 56 59 62 51 50 52 53\n+ 51 50 52 54 51 50 52 55\n+ 51 50 56 57 51 50 56 58\n+ 51 50 56 59 52 50 56 57\n+ 52 50 56 58 52 50 56 59\n+ 53 52 50 56 54 52 50 56\n+ 55 52 50 56 56 59 62 63\n+ 56 59 62 64 56 59 62 65\n+ 57 56 59 60 57 56 59 61\n+ 57 56 59 62 58 56 59 60\n+ 58 56 59 61 58 56 59 62\n+ 59 62 65 66 59 62 65 67\n+ 59 62 65 71 60 59 62 63\n+ 60 59 62 64 60 59 62 65\n+ 61 59 62 63 61 59 62 64\n+ 61 59 62 65 62 65 67 68\n+ 62 65 67 69 62 65 67 70\n+ 62 65 71 72 62 65 71 73\n+ 62 65 71 74 63 62 65 66\n+ 63 62 65 67 63 62 65 71\n+ 64 62 65 66 64 62 65 67\n+ 64 62 65 71 66 65 67 68\n+ 66 65 67 69 66 65 67 70\n+ 66 65 71 72 66 65 71 73\n+ 66 65 71 74 67 65 71 72\n+ 67 65 71 73 67 65 71 74\n+ 68 67 65 71 69 67 65 71\n+ 70 67 65 71\n+\n+ 0 !NIMPHI: impropers\n+\n+\n+ 0 !NDON: donors\n+\n+\n+ 0 !NACC: acceptors\n+\n+\n+ 0 !NNB\n+\n+ 0 0 0 0 0 0 0 0\n+ 0 0 0 0 0 0 0 0\n+ 0 0 0 0 0 0 0 0\n+ 0 0 0 0 0 0 0 0\n+ 0 0 0 0 0 0 0 0\n+ 0 0 0 0 0 0 0 0\n+ 0 0 0 0 0 0 0 0\n+ 0 0 0 0 0 0 0 0\n+ 0 0 0 0 0 0 0 0\n+ 0 0\n+\n+ 26 0 !NGRP NST2\n+ 0 1 0 4 1 0 7 1 0\n+ 10 1 0 13 1 0 15 1 0\n+ 17 1 0 20 1 0 23 1 0\n+ 25 0 0 26 1 0 30 1 0\n+ 33 1 0 36 1 0 38 0 0\n+ 39 1 0 43 1 0 46 1 0\n+ 49 1 0 51 1 0 55 1 0\n+ 58 1 0 61 1 0 64 1 0\n+ 66 1 0 70 1 0\n+\n+ 1 !MOLNT\n+ 1 1 1 1 1 1 1 1\n+ 1 1 1 1 1 1 1 1\n+ 1 1 1 1 1 1 1 1\n+ 1 1 1 1 1 1 1 1\n+ 1 1 1 1 1 1 1 1\n+ 1 1 1 1 1 1 1 1\n+ 1 1 1 1 1 1 1 1\n+ 1 1 1 1 1 1 1 1\n+ 1 1 1 1 1 1 1 1\n+ 1 1\n+\n+ 0 0 !NUMLP NUMLPH\n+\n+ 0 !NCRTERM: cross-terms\n+\ndiff --git a/wrappers/python/tests/systems/par_all36_lipid.prm b/wrappers/python/tests/systems/par_all36_lipid.prm\nnew file mode 100644\nindex 0000000000..411e7645af\n--- /dev/null\n+++ b/wrappers/python/tests/systems/par_all36_lipid.prm\n@@ -0,0 +1,532 @@\n+* \\\\\\\\\\\\\\ CHARMM36 All-Hydrogen Lipid Parameter File ///////\n+* All comments and questions should be submitted to the\n+* parameter forum at the CHARMM website: www.charmm.org\n+*\n+\n+!references\n+!\n+!Jeffery B. Klauda, Richard M. Venable, J. Alfredo Freites, Joseph\n+!W. O'Connor, Douglas J. Tobias, Carlos Mondragon-Ramirez, Igor\n+!Vorobyov, Alexander D. MacKerell, Jr. and Richard W. Pastor \"Update of\n+!the CHARMM All-Atom Additive Force Field for Lipids: Validation on Six\n+!Lipid Types\" J. Phys. Chem. B 2010, 114, 7830-7843\n+!\n+! PUFA Modifications\n+!Jeffery B. Klauda, Viviana Monje, Taehoon Kim, and Wonpil Im. \"Improving\n+!the CHARMM Force Field for Polyunsaturated Fatty Acid Chains\" J. Phys. Chem. B.\n+!2012 ASAP http://dx.doi.org/10.1021/jp304056p\n+\n+ATOMS\n+MASS -1 HL 1.00800 ! polar H (equivalent to protein H)\n+MASS -1 HCL 1.00800 ! charged H for PE (equivalent to protein HC)\n+MASS -1 HOL 1.00800 ! Nucleic acid phosphate hydroxyl proton\n+MASS -1 HAL1 1.00800 ! alphatic proton\n+MASS -1 HAL2 1.00800 ! alphatic proton\n+MASS -1 HAL3 1.00800 ! alphatic proton\n+MASS -1 HEL1 1.00800 ! for alkene; RHC=CR\n+MASS -1 HEL2 1.00800 ! for alkene; H2C=CR\n+MASS -1 HBL 1.00800 ! POPS SER backbone H\n+MASS -1 CL 12.01100 ! carbonyl C (acetic acid/methyl acetate)\n+MASS -1 CTL1 12.01100 ! sp3 carbon with 1 H (-CH1-)\n+MASS -1 CTL2 12.01100 ! carbon of methylene group (-CH2-)\n+MASS -1 CTL3 12.01100 ! carbon of methyl group (-CH3)\n+MASS -1 CTL5 12.01100 ! carbon of methyl group (-CH3) for tetramethylammonium\n+MASS -1 CEL1 12.01100 ! for alkene; RHC=CR\n+MASS -1 CEL2 12.01100 ! for alkene; H2C=CR\n+MASS -1 CCL 12.01100 ! for POPS\n+MASS -1 NTL 14.00700 ! ammonium nitrogen\n+MASS -1 NH3L 14.00700 ! nitrogen phosphatidylethanolamine\n+MASS -1 OBL 15.99940 ! acetic acid carboxyl oxygen (e. to protein OB)\n+MASS -1 OCL 15.99940 ! acetate oxygen\n+MASS -1 OSL 15.99940 ! ester oxygen\n+MASS -1 O2L 15.99940 ! Nucleic acid =O in phosphate or sulfate\n+MASS -1 OHL 15.99940 ! Nucleic acid phosphate hydroxyl oxygen\n+MASS -1 OSLP 15.99940 ! Phosphate oxygen, to avoid conflict with methylacetate type O\n+MASS -1 PL 30.97400 ! phosphorus\n+MASS -1 SL 32.06000 ! Sulfate sulfur\n+MASS -1 CRL1 12.01100 ! sp3 carbon with 1 H on a ring (-CH1-) for sterols\n+MASS -1 CRL2 12.01100 ! carbon of methylene group on a ring (-CH2-) for sterols\n+\n+BONDS\n+!\n+!V(bond) = Kb(b - b0)**2\n+!\n+!Kb: kcal/mole/A**2\n+!b0: A\n+!\n+!atom type Kb b0\n+!\n+CTL3 CL 200.0 1.522 ! methyl acetate\n+CTL2 CL 200.0 1.522 ! methyl acetate\n+CTL1 CL 200.0 1.522 ! methyl acetate\n+CTL1 CCL 200.0 1.522 ! for POPS\n+OBL CL 750.0 1.220 ! methyl acetate\n+OCL CL 525.0 1.260 ! acetate, protein\n+OCL CCL 525.0 1.260 ! for POPS\n+OSL CL 150.0 1.334 ! methyl acetate\n+OSLP CL 150.0 1.334 ! methyl acetate\n+OHL CL 230.0 1.40 ! methyl acetate\n+HOL OHL 545.0 0.960 ! acetic acid\n+CTL1 HAL1 309.00 1.111 ! alkanes, 3/92\n+CTL1 HBL 330.00 1.080 ! for POPS\n+CTL2 HAL2 309.00 1.111 ! alkanes, 4/98\n+CTL3 HAL3 322.00 1.111 ! alkanes, 4/98\n+CTL3 OSL 340.0 1.43 ! phosphate\n+CTL2 OSL 340.0 1.43 ! phosphate\n+CTL1 OSL 340.0 1.43 ! phosphate\n+CTL3 OSLP 340.0 1.43 !\n+CTL2 OSLP 340.0 1.43 !\n+CTL1 OSLP 340.0 1.43 !\n+OSL PL 270.0 1.60 ! phosphate\n+OSLP PL 270.0 1.60 !\n+O2L PL 580.0 1.48 ! phosphate\n+OHL PL 237.0 1.59 ! phosphate\n+NH3L HCL 410.0 1.04 ! ethanolamine\n+NH3L CTL1 200.0 1.48 ! for POPS\n+NH3L CTL2 261.0 1.51 ! ethanolamine\n+NTL CTL2 215.00 1.51 ! tetramethylammonium\n+NTL CTL5 215.00 1.51 ! tetramethylammonium\n+CTL5 HL 300.00 1.08 ! tetramethylammonium\n+CTL2 HL 300.00 1.08 ! tetramethylammonium\n+CTL1 CTL1 222.500 1.500 ! alkanes, 3/92\n+CTL1 CTL2 222.500 1.538 ! alkanes, 3/92\n+CTL1 CTL3 222.500 1.538 ! alkanes, 3/92\n+CTL2 CTL2 222.500 1.530 ! alkanes, 3/92\n+CTL2 CTL3 222.500 1.528 ! alkanes, 3/92\n+CTL3 CTL3 222.500 1.530 ! alkanes, 3/92\n+OHL CTL1 428.0 1.420 ! glycerol\n+OHL CTL2 428.0 1.420 ! glycerol\n+OHL CTL3 428.0 1.420 ! glycerol\n+SL O2L 540.0 1.448 ! methylsulfate\n+SL OSL 250.0 1.575 ! methylsulfate\n+CEL2 CEL2 510.000 1.330 ! ethene yin,adm jr., 12/95\n+HEL2 CEL2 365.000 1.100 ! propene; from ethene, yin,adm jr., 12/95\n+CEL1 CTL3 383.000 1.504 ! butene, yin,adm jr., 12/95\n+CEL1 CEL2 500.000 1.342 ! propene, yin,adm jr., 12/95\n+HEL1 CEL1 360.500 1.100 ! propene, yin,adm jr., 12/95\n+CEL1 CTL2 365.000 1.502 ! butene; from propene, yin,adm jr., 12/95\n+CEL1 CEL1 440.000 1.340 ! butene, yin,adm jr., 12/95\n+\n+ANGLES\n+!\n+!V(angle) = Ktheta(Theta - Theta0)**2\n+!\n+!V(Urey-Bradley) = Kub(S - S0)**2\n+!\n+!Ktheta: kcal/mole/rad**2\n+!Theta0: degrees\n+!Kub: kcal/mole/A**2 (Urey-Bradley)\n+!S0: A\n+!\n+!atom types Ktheta Theta0 Kub S0\n+!\n+!\n+OBL CL CTL3 70.0 125.0 20.0 2.442 ! methyl acetate\n+OBL CL CTL2 70.0 125.0 20.0 2.442 ! methyl acetate\n+OBL CL CTL1 70.0 125.0 20.0 2.442 ! methyl acetate\n+OSL CL OBL 90.0 125.9 160.0 2.2576 ! acetic acid\n+CL OSL CTL1 40.0 109.6 30.0 2.2651 ! methyl acetate\n+CL OSL CTL2 40.0 109.6 30.0 2.2651 ! methyl acetate\n+CL OSL CTL3 40.0 109.6 30.0 2.2651 ! methyl acetate\n+HAL2 CTL2 CL 33.00 109.50 30.00 2.163 ! methyl acetate\n+HAL3 CTL3 CL 33.00 109.50 30.00 2.163 ! methyl acetate\n+CTL2 CTL2 CL 52.0 108.00 ! alkane\n+CTL2 CTL1 CCL 52.0 108.00 ! for POPS\n+CTL3 CTL2 CL 52.0 108.00 ! alkane\n+OSL CL CTL3 55.0 109.0 20.00 2.3260 ! methyl acetate\n+OSL CL CTL2 55.0 109.0 20.00 2.3260 ! methyl acetate\n+OSL CL CTL1 55.0 109.0 20.00 2.3260 ! methyl acetate\n+OHL CL OBL 50.0 123.0 210.0 2.2620 ! acetic acid\n+OCL CL CTL2 40.0 118.0 50.0 2.3880 ! acetate\n+OCL CL CTL3 40.0 118.0 50.0 2.3880 ! acetate\n+OCL CL OCL 100.0 124.0 70.0 2.2250 ! acetate\n+OCL CCL OCL 100.0 124.0 70.0 2.2250 ! for POPS\n+OCL CCL CTL1 40.0 118.0 50.0 2.3880 ! for POPS\n+OHL CL CTL3 55.0 110.50 ! acetic acid\n+OHL CL CTL2 55.0 110.50 ! acetic acid\n+HOL OHL CL 55.0 115.0 ! acetic acid\n+OSL CTL1 CTL1 75.700 110.10 ! acetic acid, PIP\n+OSL CTL1 CTL2 75.700 110.10 ! acetic acid\n+OSL CTL1 CTL3 75.700 110.10 ! acetic acid\n+OSL CTL2 CTL1 75.700 110.10 ! acetic acid\n+OSL CTL2 CTL2 75.700 110.10 ! acetic acid\n+OSL CTL2 CTL3 75.700 110.10 ! acetic acid\n+OSLP CTL1 CTL1 75.700 110.10 ! acetic acid, PIP\n+OSLP CTL1 CTL2 75.700 110.10 ! acetic acid\n+OSLP CTL1 CTL3 75.700 110.10 ! acetic acid\n+OSLP CTL2 CTL1 75.700 110.10 ! acetic acid\n+OSLP CTL2 CTL2 75.700 110.10 ! acetic acid\n+OSLP CTL2 CTL3 75.700 110.10 ! acetic acid\n+HAL2 CTL2 HAL2 35.500 109.00 5.40 1.80200 ! alkane, 3/92\n+HAL3 CTL3 HAL3 35.500 108.40 5.40 1.80200 ! alkane, 3/92\n+HAL1 CTL1 OSL 60.0 109.5 ! phosphate\n+HAL2 CTL2 OSL 60.0 109.5 ! phosphate\n+HAL3 CTL3 OSL 60.0 109.5 ! phosphate\n+HAL1 CTL1 OSLP 60.0 109.5 ! phosphate\n+HAL2 CTL2 OSLP 60.0 109.5 ! phosphate\n+HAL3 CTL3 OSLP 60.0 109.5 ! phosphate\n+CTL1 OSL PL 20.0 120.0 35.0 2.33 ! phosphate, PIP\n+CTL2 OSL PL 20.0 120.0 35.0 2.33 ! phosphate\n+CTL3 OSL PL 20.0 120.0 35.0 2.33 ! phosphate\n+CTL1 OSLP PL 20.0 120.0 35.0 2.33 ! phosphate, PIP\n+CTL2 OSLP PL 20.0 120.0 35.0 2.33 ! phosphate\n+CTL3 OSLP PL 20.0 120.0 35.0 2.33 ! phosphate\n+HOL OHL PL 30.0 115.0 40.0 2.30 ! phosphate\n+OSL PL OSL 80.0 104.3 ! phosphate\n+OSL PL O2L 98.9 111.6 ! phosphate\n+OSL PL OHL 48.1 108.0 ! phosphate\n+OSLP PL OSLP 80.0 104.3 ! phosphate\n+OSLP PL O2L 98.9 111.6 ! phosphate\n+OSLP PL OHL 48.1 108.0 ! phosphate\n+O2L PL O2L 120.0 120.0 ! phosphate\n+O2L PL OHL 98.9 108.23 ! phosphate\n+NTL CTL2 HL 40.0 109.5 27. 2.13 ! tetramethylammonium\n+NTL CTL5 HL 40.0 109.5 27. 2.13 ! tetramethylammonium\n+HL CTL2 HL 24.0 109.50 28. 1.767 ! tetramethylammonium\n+HL CTL5 HL 24.0 109.50 28. 1.767 ! tetramethylammonium\n+CTL2 NTL CTL2 60.0 109.5 26. 2.466 ! tetraethylammonium, from CTL5 NTL CTL2\n+CTL5 NTL CTL2 60.0 109.5 26. 2.466 ! tetramethylammonium\n+CTL5 NTL CTL5 60.0 109.5 26. 2.466 ! tetramethylammonium\n+HL CTL2 CTL2 33.430 110.10 22.53 2.179 ! alkane\n+HL CTL2 CTL3 33.430 110.10 22.53 2.179 ! alkane\n+HAL1 CTL1 CTL1 34.500 110.10 22.53 2.179 ! alkane, 3/92\n+HAL1 CTL1 CTL2 34.500 110.10 22.53 2.179 ! alkane, 3/92\n+HAL1 CTL1 CTL3 34.500 110.10 22.53 2.179 ! alkane, 3/92\n+HAL2 CTL2 CTL1 26.500 110.10 22.53 2.179 ! alkane, 4/98\n+HAL2 CTL2 CTL2 26.500 110.10 22.53 2.179 ! alkane, 4/98\n+HAL2 CTL2 CTL3 34.600 110.10 22.53 2.179 ! alkane, 4/98\n+HAL3 CTL3 CTL1 33.430 110.10 22.53 2.179 ! alkane, 4/98\n+HAL3 CTL3 CTL2 34.600 110.10 22.53 2.179 ! alkane, 4/98\n+HAL3 CTL3 CTL3 37.500 110.10 22.53 2.179 ! alkane, 4/98\n+HBL CTL1 CCL 50.000 109.50 ! for POPS\n+HBL CTL1 CTL2 35.000 111.00 ! for POPS\n+NTL CTL2 CTL2 67.7 115.00 ! tetramethylammonium\n+NTL CTL2 CTL3 67.7 115.00 ! tetramethylammonium\n+HCL NH3L CTL2 33.0 109.50 4.00 2.056 ! ethanolamine\n+HCL NH3L CTL1 30.0 109.50 20.00 2.074 ! for POPS\n+HCL NH3L HCL 41.0 109.50 ! ethanolamine\n+NH3L CTL2 CTL2 67.7 110.00 ! ethanolamine\n+NH3L CTL2 HAL2 45.0 107.50 35.00 2.0836 ! ethanolamine\n+CTL1 CTL1 CTL1 53.350 111.00 8.00 2.561 ! alkane, 3/92\n+NH3L CTL1 CCL 43.7 110.00 ! for POPS\n+NH3L CTL1 CTL2 67.7 110.00 ! for POPS\n+NH3L CTL1 HBL 51.5 107.50 ! for POPS\n+CTL1 CTL1 CTL2 58.350 113.50 11.16 2.561 ! glycerol\n+CTL1 CTL1 CTL3 53.350 108.50 8.00 2.561 ! alkane, 3/92\n+CTL1 CTL2 CTL1 58.350 113.50 11.16 2.561 ! glycerol\n+CTL1 CTL2 CTL2 58.350 113.50 11.16 2.561 ! glycerol\n+CTL1 CTL2 CTL3 58.350 113.50 11.16 2.561 ! glycerol\n+CTL2 CTL1 CTL2 58.350 113.50 11.16 2.561 ! glycerol\n+CTL2 CTL1 CTL3 58.350 113.50 11.16 2.561 ! glycerol\n+CTL2 CTL2 CTL2 58.350 113.60 11.16 2.561 ! alkane, 3/92\n+CTL2 CTL2 CTL3 58.000 115.00 8.00 2.561 ! alkane, 3/92\n+CTL3 CTL1 CTL3 58.350 113.50 11.16 2.561 ! glycerol\n+HOL OHL CTL1 57.500 106.00 ! glycerol\n+HOL OHL CTL2 57.500 106.00 ! glycerol\n+HOL OHL CTL3 57.500 106.00 ! glycerol\n+OHL CTL1 CTL1 75.700 110.10 ! glycerol, PIP\n+OHL CTL1 CTL2 75.700 110.10 ! glycerol\n+OHL CTL2 CTL1 75.700 110.10 ! glycerol\n+OHL CTL2 CTL2 75.700 110.10 ! glycerol\n+OHL CTL2 CTL3 75.700 110.10 ! glycerol\n+OHL CTL1 HAL1 45.900 108.89 ! glycerol\n+OHL CTL2 HAL2 45.900 108.89 ! glycerol\n+OHL CTL3 HAL3 45.900 108.89 ! glycerol\n+O2L SL O2L 130.0 109.47 35.0 2.45 ! methylsulfate\n+O2L SL OSL 85.0 98.0 ! methylsulfate\n+CTL2 OSL SL 15.0 109.0 27.00 1.90 ! methylsulfate\n+CTL3 OSL SL 15.0 109.0 27.00 1.90 ! methylsulfate\n+CEL1 CEL1 CTL2 48.00 123.50 ! from 2-butene, yin,adm jr., 12/95\n+CEL1 CEL1 CTL3 48.00 123.50 ! 2-butene, yin,adm jr., 12/95\n+CEL2 CEL1 CTL2 48.00 126.00 ! 1-butene; from propene, yin,adm jr., 12/95\n+CEL2 CEL1 CTL3 47.00 125.20 ! propene, yin,adm jr., 12/95\n+HEL1 CEL1 CEL1 52.00 119.50 ! 2-butene, yin,adm jr., 12/95\n+HEL1 CEL1 CEL2 42.00 118.00 ! propene, yin,adm jr., 12/95\n+HEL1 CEL1 CTL2 40.00 116.00 ! 1-butene; from propene, yin,adm jr., 12/95\n+HEL1 CEL1 CTL3 22.00 117.00 ! propene, yin,adm jr., 12/95\n+HEL2 CEL2 CEL1 45.00 120.50 ! propene, yin,adm jr., 12/95\n+HEL2 CEL2 CEL2 55.50 120.50 ! ethene, yin,adm jr., 12/95\n+HEL2 CEL2 HEL2 19.00 119.00 ! propene, yin,adm jr., 12/95\n+CEL1 CTL2 CTL2 32.00 112.20 ! 1-butene; from propene, yin,adm jr., 12/95\n+CEL1 CTL2 CTL3 32.00 112.20 ! 1-butene; from propene, yin,adm jr., 12/95\n+HAL2 CTL2 CEL1 45.00 111.50 ! 1-butene; from propene, yin,adm jr., 12/95\n+HAL3 CTL3 CEL1 42.00 111.50 ! 2-butene, yin,adm jr., 12/95\n+CEL1 CTL2 CEL1 30.0 114.0 ! 1,4-dipentene, adm jr., 2/00\n+ \n+DIHEDRALS\n+!\n+!V(dihedral) = Kchi(1 + cos(n(chi) - delta))\n+!\n+!Kchi: kcal/mole\n+!n: multiplicity\n+!delta: degrees\n+!\n+!atom types Kchi n delta\n+!\n+X CTL1 OHL X 0.14 3 0.00 ! glycerol\n+X CTL2 OHL X 0.14 3 0.00 ! glycerol\n+X CTL3 OHL X 0.14 3 0.00 ! glycerol\n+OCL CCL CTL1 NH3L 3.20 2 180.00 ! for POPS\n+OBL CL CTL2 HAL2 0.00 6 180.00 ! acetic acid\n+OBL CL CTL3 HAL3 0.00 6 180.00 ! acetic acid\n+OSL CL CTL2 HAL2 0.00 6 180.00 ! acetic acid\n+OSL CL CTL3 HAL3 0.00 6 180.00 ! acetic acid\n+OSLP CL CTL2 HAL2 0.00 6 180.00 ! acetic acid\n+OSLP CL CTL3 HAL3 0.00 6 180.00 ! acetic acid\n+OBL CL OSL CTL1 0.965 1 180.00 ! methyl acetate\n+OBL CL OSL CTL1 3.85 2 180.00 ! methyl acetate\n+OBL CL OSL CTL2 0.965 1 180.00 ! methyl acetate\n+OBL CL OSL CTL2 3.85 2 180.00 ! methyl acetate\n+OBL CL OSL CTL3 0.965 1 180.00 ! methyl acetate\n+OBL CL OSL CTL3 3.85 2 180.00 ! methyl acetate\n+X CL OSL X 2.05 2 180.00 ! methyl acetate\n+X CTL2 CL X 0.05 6 180.00 ! methyl acetate\n+X CTL3 CL X 0.05 6 180.00 ! methyl acetate\n+X CL OHL X 2.05 2 180.00 ! acetic acid\n+X CTL1 CCL X 0.05 6 180.00 ! for POPS\n+HAL2 CTL2 CL OHL 0.00 6 180.00\n+HAL3 CTL3 CL OHL 0.00 6 180.00\n+PL OSLP CTL2 CTL1 0.407 2 0.00 ! Phos-gly, 8/05\n+PL OSLP CTL2 CTL1 0.241 1 180.00 ! Phos-gly, 8/05\n+PL OSLP CTL2 CTL2 0.407 2 0.00 ! Phos-gly, 8/05\n+PL OSLP CTL2 CTL2 0.241 1 180.00 ! Phos-gly, 8/05\n+OSL PL OSL CTL1 1.20 1 180.00 ! phosphate, new NA, 4/98, adm jr., PIP\n+OSL PL OSL CTL1 0.10 2 180.00 ! phosphate, new NA, 4/98, adm jr., PIP\n+OSL PL OSL CTL1 0.10 3 180.00 ! phosphate, new NA, 4/98, adm jr., PIP\n+OSLP PL OSLP CTL1 1.20 1 180.00 ! phosphate, new NA, 4/98, adm jr., PIP\n+OSLP PL OSLP CTL1 0.10 2 180.00 ! phosphate, new NA, 4/98, adm jr., PIP\n+OSLP PL OSLP CTL1 0.10 3 180.00 ! phosphate, new NA, 4/98, adm jr., PIP\n+OSLP PL OSLP CTL2 1.20 1 180.00 ! phosphate, new NA, 4/98, adm jr.\n+OSLP PL OSLP CTL2 0.10 2 180.00 ! phosphate, new NA, 4/98, adm jr.\n+OSLP PL OSLP CTL2 0.10 3 180.00 ! phosphate, new NA, 4/98, adm jr.\n+O2L PL OSLP CTL2 0.10 3 0.00 ! phosphate, new NA, 4/98, adm jr.\n+O2L PL OSL CTL2 0.10 3 0.00 ! phosphate, new NA, 4/98, adm jr.\n+OSLP PL OSLP CTL3 1.20 1 180.00 ! phosphate, new NA, 4/98, adm jr.\n+OSLP PL OSLP CTL3 0.10 2 180.00 ! phosphate, new NA, 4/98, adm jr.\n+OSLP PL OSLP CTL3 0.10 3 180.00 ! phosphate, new NA, 4/98, adm jr.\n+O2L PL OSLP CTL1 0.10 3 0.00 ! phosphate, new NA, 4/98, adm jr., PIP\n+O2L PL OSL CTL1 0.10 3 0.00 ! phosphate, new NA, 4/98, adm jr., PIP\n+O2L PL OSLP CTL3 0.10 3 0.00 ! phosphate, new NA, 4/98, adm jr.\n+O2L PL OSL CTL3 0.10 3 0.00 ! phosphate, new NA, 4/98, adm jr.\n+OHL PL OSL CTL1 0.95 2 0.00 ! terminal phosphate, PIP\n+OHL PL OSL CTL1 0.50 3 0.00 ! terminal phosphate, PIP\n+OHL PL OSL CTL2 0.95 2 0.00 ! terminal phosphate\n+OHL PL OSL CTL2 0.50 3 0.00 ! terminal phosphate\n+OHL PL OSL CTL3 0.95 2 0.00 ! terminal phosphate\n+OHL PL OSL CTL3 0.50 3 0.00 ! terminal phosphate\n+OHL PL OSLP CTL2 0.95 2 0.00 ! terminal phosphate\n+OHL PL OSLP CTL2 0.50 3 0.00 ! terminal phosphate\n+OHL PL OSLP CTL3 0.95 2 0.00 ! terminal phosphate\n+OHL PL OSLP CTL3 0.50 3 0.00 ! terminal phosphate\n+X OHL PL X 0.30 3 0.00 ! terminal phosphate\n+X CTL1 OSL X 0.00 3 0.00 ! phosphate, new NA, 4/98, adm jr.\n+X CTL2 OSL X 0.00 3 0.00 ! phosphate, new NA, 4/98, adm jr.\n+X CTL3 OSL X 0.00 3 0.00 ! phosphate, new NA, 4/98, adm jr.\n+X CTL1 OSLP X 0.00 3 0.00 ! phosphate, new NA, 4/98, adm jr.\n+X CTL2 OSLP X 0.00 3 0.00 ! phosphate, new NA, 4/98, adm jr.\n+X CTL3 OSLP X 0.00 3 0.00 ! phosphate, new NA, 4/98, adm jr.\n+CTL1 CTL2 CL OSL -0.15 1 180.00 ! methyl propionate, 12/92\n+CTL1 CTL2 CL OSL 0.53 2 180.00 ! methyl propionate, 12/92\n+CTL2 CTL2 CL OSL 0.000 6 0.00 ! glycerol & propl ester, 6/07\n+CTL2 CTL2 CL OSL 0.030 3 180.00 ! glycerol & propl ester, 6/07\n+CTL2 CTL2 CL OSL 0.432 2 180.00 ! glycerol & propl ester, 6/07\n+CTL2 CTL2 CL OSL 0.332 1 0.00 ! glycerol & propl ester, 6/07\n+CTL3 CTL2 CL OSL 0.000 6 0.00 ! glycerol & propl ester, 6/07\n+CTL3 CTL2 CL OSL 0.030 3 180.00 ! glycerol & propl ester, 6/07\n+CTL3 CTL2 CL OSL 0.432 2 180.00 ! glycerol & propl ester, 6/07\n+CTL3 CTL2 CL OSL 0.332 1 0.00 ! glycerol & propl ester, 6/07\n+CTL3 CTL2 CTL2 CL 0.000 5 180.00 ! propyl ester, 6/07\n+CTL3 CTL2 CTL2 CL 0.317 3 180.00 ! propyl ester, 6/07\n+CTL3 CTL2 CTL2 CL 0.557 2 0.00 ! propyl ester, 6/07\n+CTL3 CTL2 CTL2 CL 0.753 1 0.00 ! propyl ester, 6/07\n+CTL2 CTL2 CTL2 CL 0.000 5 180.00 ! propyl ester, 6/07\n+CTL2 CTL2 CTL2 CL 0.317 3 180.00 ! propyl ester, 6/07\n+CTL2 CTL2 CTL2 CL 0.557 2 0.00 ! propyl ester, 6/07\n+CTL2 CTL2 CTL2 CL 0.753 1 0.00 ! propyl ester, 6/07\n+OSL CTL2 CTL1 OSL -0.429 4 60.00 ! glycerol, 8/08\n+OSL CTL2 CTL1 OSL 0.614 3 0.00 ! glycerol, 8/08 \n+OSL CTL2 CTL1 OSL -0.115 2 60.00 ! glycerol, 8/08 \n+OSL CTL2 CTL1 OSL 0.703 1 180.00 ! glycerol, 8/08 \n+OSLP CTL2 CTL1 OSL 0.000 4 0.00 ! Fit to QM, theta2, 07/08 jbk\n+OSLP CTL2 CTL1 OSL 0.607 3 180.00 ! Fit to QM, theta2, 07/08 jbk\n+OSLP CTL2 CTL1 OSL 0.254 2 60.00 ! Fit to QM, theta2, 07/08 jbk\n+OSLP CTL2 CTL1 OSL 2.016 1 180.00 ! Fit to QM, theta2, 07/08 jbk\n+OSLP CTL2 CTL2 OSL 0.000 4 0.00 ! Fit to QM, theta2, 07/08 jbk\n+OSLP CTL2 CTL2 OSL 0.607 3 180.00 ! Fit to QM, theta2, 07/08 jbk\n+OSLP CTL2 CTL2 OSL 0.254 2 60.00 ! Fit to QM, theta2, 07/08 jbk\n+OSLP CTL2 CTL2 OSL 2.016 1 180.00 ! Fit to QM, theta2, 07/08 jbk\n+CTL3 CTL1 CTL2 OSL 0.000 3 0.00 ! glycerol, theta3\n+CTL2 CTL1 CTL2 OSL 0.000 3 0.00 ! glycerol, theta3\n+CTL3 CTL2 CTL2 OSL 0.000 3 0.00 ! glycerol, theta3\n+CTL2 CTL2 CTL2 OSL 0.000 3 0.00 ! glycerol, theta3\n+CL OSL CTL1 CTL2 0.000 4 0.00 ! glycerol, beta1 6/07\n+CL OSL CTL1 CTL2 0.150 3 180.00 ! glycerol, beta1 6/07\n+CL OSL CTL1 CTL2 1.453 2 180.00 ! glycerol, beta1 6/07\n+CL OSL CTL1 CTL2 0.837 1 180.00 ! glycerol, beta1 6/07\n+CL OSL CTL1 CTL3 0.000 4 0.00 ! glycerol, beta1 6/07\n+CL OSL CTL1 CTL3 0.150 3 180.00 ! glycerol, beta1 6/07\n+CL OSL CTL1 CTL3 1.453 2 180.00 ! glycerol, beta1 6/07\n+CL OSL CTL1 CTL3 0.837 1 180.00 ! glycerol, beta1 6/07\n+CL OSL CTL2 CTL1 0.267 3 180.00 ! glycerol, gamma1 6/07 \n+CL OSL CTL2 CTL1 0.173 2 0.00 ! glycerol, gamma1 6/07 \n+CL OSL CTL2 CTL1 0.781 1 180.00 ! glycerol, gamma1 6/07\n+X CTL2 NTL X 0.26 3 0.00 ! tetramethylammonium\n+X CTL5 NTL X 0.23 3 0.00 ! tetramethylammonium\n+X CTL1 NH3L X 0.10 3 0.00 ! for POPS\n+X CTL2 NH3L X 0.10 3 0.00 ! ethanolamine\n+NH3L CTL2 CTL2 OHL 0.7 1 180.00 ! ethanolamine\n+NH3L CTL2 CTL2 OSLP 0.7 1 180.00 ! ethanolamine\n+NTL CTL2 CTL2 OHL 4.3 1 180.00 ! choline, 12/92\n+NTL CTL2 CTL2 OHL -0.4 3 180.00 ! choline, 12/92\n+NTL CTL2 CTL2 OSLP 3.3 1 180.00 ! choline, 12/92\n+NTL CTL2 CTL2 OSLP -0.4 3 180.00 ! choline, 12/92\n+X CTL1 CTL1 X 0.200 3 0.00 ! alkane, 3/92\n+X CTL1 CTL2 X 0.200 3 0.00 ! alkane, 3/92\n+X CTL1 CTL3 X 0.200 3 0.00 ! alkane, 3/92\n+X CTL2 CTL2 X 0.1900 3 0.00 ! alkane, 4/98, yin and mackerell\n+X CTL2 CTL3 X 0.1600 3 0.00 ! alkane, 4/98, yin and mackerell\n+X CTL3 CTL3 X 0.1525 3 0.00 ! alkane, 4/98, yin and mackerell\n+!alkane CCCC dihedrals based on pentane, heptane and hexane vdz/vqz/ccsd(t) QM data\n+CTL3 CTL2 CTL2 CTL3 0.060 2 0.00 ! alkane, 7/08, jbk\n+CTL3 CTL2 CTL2 CTL3 0.035 5 0.00 ! alkane, 7/08, jbk\n+CTL2 CTL2 CTL2 CTL3 0.162 2 0.00 ! alkane, 7/08, jbk\n+CTL2 CTL2 CTL2 CTL3 0.047 3 180.00 ! alkane, 7/08, jbk\n+CTL2 CTL2 CTL2 CTL3 0.105 4 0.00 ! alkane, 7/08, jbk\n+CTL2 CTL2 CTL2 CTL3 0.177 5 0.00 ! alkane, 7/08, jbk\n+CTL2 CTL2 CTL2 CTL2 0.101 2 0.00 ! alkane, 7/08, jbk\n+CTL2 CTL2 CTL2 CTL2 0.142 3 180.00 ! alkane, 7/08, jbk\n+CTL2 CTL2 CTL2 CTL2 0.074 4 0.00 ! alkane, 7/08, jbk\n+CTL2 CTL2 CTL2 CTL2 0.097 5 0.00 ! alkane, 7/08, jbk\n+HAL3 CTL3 OSL SL 0.00 3 0.00 ! methylsulfate\n+CTL2 OSL SL O2L 0.00 3 0.00 ! methylsulfate\n+CTL3 OSL SL O2L 0.00 3 0.00 ! methylsulfate\n+HEL1 CEL1 CEL1 HEL1 1.0000 2 180.00 ! 2-butene, adm jr., 8/98 update\n+CTL3 CEL1 CEL1 HEL1 1.0000 2 180.00 ! 2-butene, adm jr., 8/98 update\n+X CEL1 CEL1 X 0.4500 1 180.00 ! 2-butene, adm jr., 4/04\n+X CEL1 CEL1 X 8.5000 2 180.00 !\n+X CEL2 CEL2 X 4.9000 2 180.00 ! ethene, yin,adm jr., 12/95\n+CTL2 CEL1 CEL2 HEL2 5.2000 2 180.00 ! propene, yin,adm jr., 12/95\n+CTL3 CEL1 CEL2 HEL2 5.2000 2 180.00 ! propene, yin,adm jr., 12/95\n+HEL1 CEL1 CEL2 HEL2 5.2000 2 180.00 ! propene, yin,adm jr., 12/95\n+!alkene update, 2004,2009\n+CEL1 CEL1 CTL2 HAL2 0.3000 3 180.00 !2-butene, adm jr., 4/04\n+CEL1 CEL1 CTL3 HAL3 0.3000 3 180.00 !2-butene, adm jr., 4/04\n+!CEL1 CEL1 CTL2 CTL3 0.9000 1 180.00 !2-pentene and 3-heptene\n+!CEL1 CEL1 CTL2 CTL3 0.2000 2 180.00 !2-pentene and 3-heptene\n+CEL1 CEL1 CTL2 CTL3 0.9100 1 180.0 !2-hexene, adm jr., 11/09, end fix jbk\n+CEL1 CEL1 CTL2 CTL3 0.1800 2 180.0 !2-hexene, adm jr., 11/09\n+CEL1 CEL1 CTL2 CTL3 0.1700 3 180.0 !2-hexene, adm jr., 11/09\n+CEL1 CEL1 CTL2 CTL2 0.9100 1 180.0 !2-hexene, adm jr., 11/09\n+CEL1 CEL1 CTL2 CTL2 0.1800 2 180.0 !2-hexene, adm jr., 11/09\n+CEL1 CEL1 CTL2 CTL2 0.1700 3 180.0 !2-hexene, adm jr., 11/09\n+CEL1 CTL2 CTL2 CL 0.1400 1 180.0 !2-hexene, adm jr., 11/09, add jbk for DHA\n+CEL1 CTL2 CTL2 CL 0.1700 2 0.0 !2-hexene, adm jr., 11/09, add jbk for DHA\n+CEL1 CTL2 CTL2 CL 0.0500 3 180.0 !2-hexene, adm jr., 11/09, add jbk for DHA\n+CEL1 CTL2 CTL2 CTL2 0.1400 1 180.0 !2-hexene, adm jr., 11/09\n+CEL1 CTL2 CTL2 CTL2 0.1700 2 0.0 !2-hexene, adm jr., 11/09\n+CEL1 CTL2 CTL2 CTL2 0.0500 3 180.0 !2-hexene, adm jr., 11/09\n+CEL1 CTL2 CTL2 CTL3 0.1400 1 180.0 !2-hexene, adm jr., 11/09\n+CEL1 CTL2 CTL2 CTL3 0.1700 2 0.0 !2-hexene, adm jr., 11/09\n+CEL1 CTL2 CTL2 CTL3 0.0500 3 180.0 !2-hexene, adm jr., 11/09\n+CEL2 CEL1 CTL2 CTL2 0.5000 1 180.00 ! 1-butene, adm jr., 2/00 update\n+CEL2 CEL1 CTL2 CTL2 1.3000 3 180.00 ! 1-butene, adm jr., 2/00 update\n+CEL2 CEL1 CTL2 CTL3 0.5000 1 180.00 ! 1-butene, adm jr., 2/00 update\n+CEL2 CEL1 CTL2 CTL3 1.3000 3 180.00 ! 1-butene, adm jr., 2/00 update\n+CEL2 CEL1 CTL2 HAL2 0.1200 3 0.00 ! 1-butene, yin,adm jr., 12/95\n+CEL2 CEL1 CTL3 HAL3 0.0500 3 180.00 ! propene, yin,adm jr., 12/95\n+HEL1 CEL1 CTL2 CTL2 0.1200 3 0.00 ! butene, yin,adm jr., 12/95\n+HEL1 CEL1 CTL2 CTL3 0.1200 3 0.00 ! butene, yin,adm jr., 12/95\n+HEL1 CEL1 CTL2 HAL2 0.0000 3 0.00 ! butene, adm jr., 2/00 update\n+HEL1 CEL1 CTL3 HAL3 0.0000 3 0.00 ! butene, adm jr., 2/00 update\n+! 1,4-dipentene, adm jr., 2/00\n+CEL2 CEL1 CTL2 CEL1 1.200 1 180.00 !1,4-dipentene\n+CEL2 CEL1 CTL2 CEL1 0.400 2 180.00 !1,4-dipentene\n+CEL2 CEL1 CTL2 CEL1 1.300 3 180.00 !1,4-dipentene\n+CEL1 CTL2 CEL1 HEL1 0.000 2 0.00 !1,4-dipentene\n+CEL1 CTL2 CEL1 HEL1 0.000 3 0.00 !1,4-dipentene\n+! 2,5-diheptene, jbk., 9/2010\n+! for CIS double bonds in polyunsaturated lipids (default)\n+CEL1 CEL1 CTL2 CEL1 0.850 1 180.00 !2,5-diheptane\n+CEL1 CEL1 CTL2 CEL1 0.300 2 180.00 !2,5-diheptane\n+CEL1 CEL1 CTL2 CEL1 0.260 3 0.00 !2,5-diheptane\n+CEL1 CEL1 CTL2 CEL1 0.096 4 0.00 !2,5-diheptane\n+! for TRANS double bonds in polyunsaturated lipids\n+! uncomment following 4 lines and comment previous 4 lines to use\n+!CEL1 CEL1 CTL2 CEL1 1.200 1 180.00 !2,5-diheptane\n+!CEL1 CEL1 CTL2 CEL1 0.200 2 180.00 !2,5-diheptane\n+!CEL1 CEL1 CTL2 CEL1 1.200 3 180.00 !2,5-diheptane\n+!CEL1 CEL1 CTL2 CEL1 0.100 4 180.00 !2,5-diheptane\n+\n+!\n+IMPROPER\n+!\n+!V(improper) = Kpsi(psi - psi0)**2\n+!\n+!Kpsi: kcal/mole/rad**2\n+!psi0: degrees\n+!note that the second column of numbers (0) is ignored\n+!\n+!atom types Kpsi psi0\n+!\n+OBL X X CL 100.00 0 0.00 ! acetic acid\n+HEL2 HEL2 CEL2 CEL2 3.00 0 0.00 ! ethene, yin,adm jr., 12/95\n+OCL X X CL 96.00 0 0.00 ! acetate\n+OCL X X CCL 96.00 0 0.00 ! for POPS\n+\n+\n+NONBONDED nbxmod 5 atom cdiel fshift vatom vdistance vfswitch -\n+cutnb 14.0 ctofnb 12.0 ctonnb 10.0 eps 1.0 e14fac 1.0 wmin 1.5\n+!\n+!V(Lennard-Jones) = Eps,i,j[(Rmin,i,j/ri,j)**12 - 2(Rmin,i,j/ri,j)**6]\n+!\n+!epsilon: kcal/mole, Eps,i,j = sqrt(eps,i * eps,j)\n+!Rmin/2: A, Rmin,i,j = Rmin/2,i + Rmin/2,j\n+!\n+!atom ignored epsilon Rmin/2 ignored eps,1-4 Rmin/2,1-4\n+!\n+HOL 0.0 -0.046 0.2245\n+HAL1 0.0 -0.022 1.3200 ! alkane, 3/92\n+HAL2 0.0 -0.028 1.3400 ! alkane, yin and mackerell, 4/98\n+HAL3 0.0 -0.024 1.3400 ! alkane, yin and mackerell, 4/98\n+HBL 0.0 -0.022 1.3200 ! for POPS\n+HCL 0.0 -0.046 0.2245 ! ethanolamine\n+HL 0.0 -0.046 0.7 ! polar H on NC4+\n+HEL1 0.0 -0.031 1.25 ! alkene, yin,adm jr., 12/95\n+HEL2 0.0 -0.026 1.26 ! alkene, yin,adm jr., 12/95\n+!\n+CL 0.0 -0.0700 2.00 ! methyl acetate update \n+CCL 0.0 -0.0700 2.00 ! for POPS\n+CTL1 0.0 -0.0200 2.275 0.0 -0.01 1.9 ! alkane, 3/92\n+CTL2 0.0 -0.0560 2.010 0.0 -0.01 1.9 ! alkane, 4/98, yin, adm jr.\n+CTL3 0.0 -0.0780 2.040 0.0 -0.01 1.9 ! alkane, 4/98, yin, adm jr.\n+CTL5 0.0 -0.0800 2.06 0.0 -0.01 1.9 ! old CTL3\n+ ! maintained for tetramethylammonium\n+CEL1 0.0 -0.068 2.09 ! alkene, yin,adm jr., 12/95\n+CEL2 0.0 -0.064 2.08 ! alkene, yin,adm jr., 12/95\n+CRL1 0.0 -0.0360 2.010 0.0 -0.01 1.9 ! CGAFF, jbk add for cholesterol\n+CRL2 0.0 -0.0600 2.020 0.0 -0.01 1.9 ! CPEN, cyclopentane, 8/06 viv (jbk add)\n+\n+!\n+OBL 0.0 -0.12 1.70 0.0 -0.12 1.4\n+OCL 0.0 -0.12 1.70\n+O2L 0.0 -0.12 1.70\n+OHL 0.0 -0.1521 1.77\n+OSL 0.0 -0.1000 1.6500 !viv dec06 ether parameter\n+OSLP 0.0 -0.1000 1.6500 !viv dec06 ether parameter\n+!\n+NH3L 0.0 -0.20 1.85 ! ethanolamine\n+NTL 0.0 -0.20 1.85 ! as all other nitogens\n+!\n+SL 0.0 -0.47 2.1 ! methylsulfate\n+PL 0.0 -0.585 2.15 ! ADM Jr.\n+\n+NBFIX\n+! Emin Rmin\n+! (kcal/mol) (A)\n+!\n+\n+HBOND CUTHB 0.5 ! If you want to do hbond analysis (only), then use\n+ ! READ PARAM APPEND CARD\n+ ! to append hbond parameters from the file: par_hbond.inp\n+\n+END\ndiff --git a/wrappers/python/tests/systems/toppar_all36_lipid_cholesterol.str b/wrappers/python/tests/systems/toppar_all36_lipid_cholesterol.str\nnew file mode 100644\nindex 0000000000..9a9f99d862\n--- /dev/null\n+++ b/wrappers/python/tests/systems/toppar_all36_lipid_cholesterol.str\n@@ -0,0 +1,5060 @@\n+* Toppar stream file for cholesterol. Stream following reading of\n+* top_all36_lipid.rtf\n+* par_all36_lipid.rtf\n+* top_all36_cgenff.rtf\n+* and par_all36_cgenff.prm\n+*\n+\n+!topology and parameters are included for two cholesterol models. the\n+!model may be selected by setting variable chol_model to 1 or 2, as \n+!specified below\n+!\n+\n+set chol_model 1 !2 for original Suits et al. model\n+\n+!\n+!1) Revised model of Lim et al. This contains a number of NBFIXes that\n+!makes it unsuitable for ANTON (set chol_model 1)\n+!\n+!2) Original model of Suits et al., which is used on ANTON as well as\n+!being suitable for other systems (set chol_model 2 (or anything but 1....))\n+!\n+!references\n+!\n+!Lim, J.B., Rogaski, B. and Klauda, J.B.. \"Update of the Cholesterol Force Field \n+!Parameters in CHARMM\" 116: 203-210 (2012).\n+!\n+!Suits, F., Pitman, M., MacKerell, A.D., Jr., Feller, S.E. \"Molecular Level \n+!Organization of Saturated and Polyunsaturated Fatty Acids in a \n+!Phosphatidylcholine Bilayer Containing Cholesterol\" Biochemistry,\n+!43(49):15318-28, 2004\n+!\n+\n+!test \"append\"\n+set nat ?NATC\n+set app\n+!We're exploiting what is arguably a bug in the parser. On the left hand side,\n+!the quotes have priority, so NAT is correctly substituted. On the right hand\n+!side, the ? has priority and NATC\" (sic) is not a valid substitution...\n+if \"@NAT\" ne \"?NATC\" if @nat ne 0 set app append\n+\n+if chol_model eq 1 then\n+\n+! reference\n+! Lim, J.B., Rogaski, B. and Klauda, J.B.. \"Update of the Cholesterol Force Field \n+! Parameters in CHARMM\" 116: 203-210 (2012).\n+!\n+\n+read rtf card @app\n+* Topology for cholesterol \n+*\n+31 1\n+\n+RESI CHL1 0.00 !cholesterol v. 2(name to avoid conflict with choline)\n+! by Joseph Lim, based on DEC2\n+! atoms names correspond to the correct cholesterol nomenclature\n+GROUP\n+ATOM C3 CRL1 0.14\n+ATOM H3 HGA1 0.09\n+ATOM O3 OHL -0.66\n+ATOM H3' HOL 0.43\n+GROUP\n+ATOM C4 CRL2 -0.18\n+ATOM H4A HGA2 0.09\n+ATOM H4B HGA2 0.09\n+GROUP\n+ATOM C5 CEL1 0.00\n+ATOM C6 CEL1 -0.15\n+ATOM H6 HEL1 0.15\n+GROUP\n+ATOM C7 CRL2 -0.18\n+ATOM H7A HGA2 0.09\n+ATOM H7B HGA2 0.09\n+GROUP\n+ATOM C8 CRL1 -0.09\n+ATOM H8 HGA1 0.09\n+GROUP\n+ATOM C14 CRL1 -0.09\n+ATOM H14 HGA1 0.09\n+GROUP\n+ATOM C15 CRL2 -0.18\n+ATOM H15A HGA2 0.09\n+ATOM H15B HGA2 0.09\n+GROUP\n+ATOM C16 CRL2 -0.18\n+ATOM H16A HGA2 0.09\n+ATOM H16B HGA2 0.09\n+GROUP\n+ATOM C17 CRL1 -0.09\n+ATOM H17 HGA1 0.09\n+GROUP\n+ATOM C13 CRL1 0.00\n+GROUP\n+ATOM C18 CTL3 -0.27 !methyl at c13\n+ATOM H18A HAL3 0.09\n+ATOM H18B HAL3 0.09\n+ATOM H18C HAL3 0.09\n+GROUP\n+ATOM C12 CRL2 -0.18\n+ATOM H12A HGA2 0.09\n+ATOM H12B HGA2 0.09\n+GROUP\n+ATOM C11 CRL2 -0.18\n+ATOM H11A HGA2 0.09\n+ATOM H11B HGA2 0.09\n+GROUP\n+ATOM C9 CRL1 -0.09\n+ATOM H9 HGA1 0.09\n+GROUP\n+ATOM C10 CRL1 0.00\n+GROUP\n+ATOM C19 CTL3 -0.27 !methyl at c10\n+ATOM H19A HAL3 0.09\n+ATOM H19B HAL3 0.09\n+ATOM H19C HAL3 0.09\n+GROUP\n+ATOM C1 CRL2 -0.18\n+ATOM H1A HGA2 0.09\n+ATOM H1B HGA2 0.09\n+GROUP\n+ATOM C2 CRL2 -0.18\n+ATOM H2A HGA2 0.09\n+ATOM H2B HGA2 0.09\n+GROUP\n+ATOM C20 CTL1 -0.09\n+ATOM H20 HAL1 0.09\n+GROUP\n+ATOM C21 CTL3 -0.27\n+ATOM H21A HAL3 0.09\n+ATOM H21B HAL3 0.09\n+ATOM H21C HAL3 0.09\n+GROUP\n+ATOM C22 CTL2 -0.18\n+ATOM H22A HAL2 0.09\n+ATOM H22B HAL2 0.09\n+GROUP\n+ATOM C23 CTL2 -0.18\n+ATOM H23A HAL2 0.09\n+ATOM H23B HAL2 0.09\n+GROUP\n+ATOM C24 CTL2 -0.18 !beyond this nomenclature may not be correct\n+ATOM H24A HAL2 0.09\n+ATOM H24B HAL2 0.09\n+GROUP\n+ATOM C25 CTL1 -0.09 !c25\n+ATOM H25 HAL1 0.09\n+GROUP\n+ATOM C26 CTL3 -0.27 !terminal methyl, c26\n+ATOM H26A HAL3 0.09\n+ATOM H26B HAL3 0.09\n+ATOM H26C HAL3 0.09\n+GROUP\n+ATOM C27 CTL3 -0.27 !terminal methyl, c27\n+ATOM H27A HAL3 0.09\n+ATOM H27B HAL3 0.09\n+ATOM H27C HAL3 0.09\n+\n+BOND C3 O3 C3 H3 O3 H3'\n+BOND C3 C2 C2 H2A C2 H2B\n+BOND C2 C1 C1 H1A C1 H1B\n+BOND C3 C4 C4 H4A C4 H4B\n+BOND C4 C5\n+BOND C5 C10\n+BOND C10 C1\n+BOND C10 C19 C19 H19A C19 H19B C19 H19C\n+DOUBLE C5 C6\n+BOND C6 H6\n+BOND C6 C7 C7 H7A C7 H7B\n+BOND C7 C8 C8 H8\n+BOND C8 C9 C9 H9\n+BOND C9 C10\n+BOND C8 C14 C14 H14\n+BOND C14 C13\n+BOND C13 C12 C12 H12A C12 H12B\n+BOND C12 C11 C11 H11A C11 H11B\n+BOND C11 C9\n+BOND C13 C18 C18 H18A C18 H18B C18 H18C\n+BOND C14 C15 C15 H15A C15 H15B\n+BOND C15 C16 C16 H16A C16 H16B\n+BOND C16 C17 C17 H17\n+BOND C17 C13\n+BOND C17 C20 C20 H20\n+BOND C20 C21 C21 H21A C21 H21B C21 H21C\n+BOND C20 C22 C22 H22A C22 H22B\n+BOND C22 C23 C23 H23A C23 H23B\n+BOND C23 C24 C24 H24A C24 H24B\n+BOND C24 C25 C25 H25\n+BOND C25 C26 C26 H26A C26 H26B C26 H26C\n+BOND C25 C27 C27 H27A C27 H27B C27 H27C\n+!ICs based on CHARMM optimized structure\n+IC C1 C2 C3 C4 1.5383 110.44 55.92 110.66 1.5367\n+IC C4 C2 *C3 O3 1.5367 110.66 120.28 109.14 1.4158\n+IC O3 C2 *C3 H3 1.4158 109.14 118.92 109.40 1.1155\n+IC C2 C3 O3 H3' 1.5311 109.14 -58.51 105.39 0.9593\n+IC C2 C3 C4 C5 1.5311 110.66 -55.96 111.70 1.5156\n+IC C5 C3 *C4 H4A 1.5156 111.70 121.99 109.16 1.1099\n+IC H4A C3 *C4 H4B 1.1099 109.16 115.03 107.34 1.1142\n+IC C3 C4 C5 C10 1.5367 111.70 54.04 115.09 1.5304\n+IC C10 C4 *C5 C6 1.5304 115.09 -177.32 121.28 1.3432\n+IC C4 C5 C6 C7 1.5156 121.28 -178.39 123.88 1.5018\n+IC C7 C5 *C6 H6 1.5018 123.88 177.19 119.54 1.1001\n+IC C5 C6 C7 C8 1.3432 123.88 14.50 112.36 1.5506\n+IC C8 C6 *C7 H7A 1.5506 112.36 122.18 110.84 1.1114\n+IC H7A C6 *C7 H7B 1.1114 110.84 118.17 109.17 1.1124\n+IC C6 C7 C8 C14 1.5018 112.36 -165.89 110.02 1.5202\n+IC C14 C7 *C8 C9 1.5202 110.02 121.07 110.84 1.5327\n+IC C9 C7 *C8 H8 1.5327 110.84 119.34 108.18 1.1123\n+IC C7 C8 C14 C13 1.5506 110.02 179.73 115.21 1.5247\n+IC C13 C8 *C14 C15 1.5247 115.21 126.69 117.86 1.5382\n+IC C13 C8 *C14 H14 1.5247 115.21 -116.05 105.83 1.1205\n+IC C8 C14 C15 C16 1.5202 117.86 -163.10 103.40 1.5360\n+IC C16 C14 *C15 H15A 1.5360 103.40 117.45 109.62 1.1113\n+IC H15A C14 *C15 H15B 1.1113 109.62 121.32 111.94 1.1082\n+IC C14 C15 C16 C17 1.5382 103.40 7.85 106.79 1.5620\n+IC C17 C15 *C16 H16A 1.5620 106.79 118.96 109.25 1.1107\n+IC H16A C15 *C16 H16B 1.1107 109.25 120.76 111.65 1.1090\n+IC C13 C16 *C17 C20 1.5401 104.94 132.02 112.36 1.5633\n+IC C13 C16 *C17 H17 1.5401 104.94 -111.76 106.42 1.1153\n+IC C17 C14 *C13 C12 1.5401 100.27 122.68 106.98 1.5408\n+IC C12 C14 *C13 C18 1.5408 106.98 122.91 110.83 1.5518\n+IC C14 C13 C18 H18A 1.5247 110.83 60.33 111.48 1.1077\n+IC H18A C13 *C18 H18B 1.1077 111.48 119.80 110.01 1.1086\n+IC H18A C13 *C18 H18C 1.1077 111.48 -121.00 111.71 1.1067\n+IC C14 C13 C12 C11 1.5247 106.98 56.78 111.10 1.5422\n+IC C11 C13 *C12 H12A 1.5422 111.10 121.37 111.21 1.1067\n+IC H12A C13 *C12 H12B 1.1067 111.21 118.82 108.68 1.1119\n+IC C9 C12 *C11 H11A 1.5593 113.54 121.67 107.06 1.1093\n+IC H11A C12 *C11 H11B 1.1093 107.06 115.98 108.75 1.1100\n+IC C10 C8 *C9 H9 1.5531 112.73 -114.54 104.68 1.1185\n+IC C9 C5 *C10 C19 1.5531 111.91 -120.04 108.03 1.5524\n+IC C19 C5 *C10 C1 1.5524 108.03 -119.87 109.26 1.5579\n+IC C5 C10 C19 H19A 1.5304 108.03 -172.88 110.67 1.1082\n+IC H19A C10 *C19 H19B 1.1082 110.67 118.48 111.77 1.1080\n+IC H19A C10 *C19 H19C 1.1082 110.67 -120.66 110.97 1.1095\n+IC C2 C10 *C1 H1A 1.5383 114.55 122.42 109.26 1.1104\n+IC C2 C10 *C1 H1B 1.5383 114.55 -120.71 108.29 1.1134\n+IC C1 C3 *C2 H2A 1.5383 110.44 121.16 109.41 1.1119\n+IC H2A C3 *C2 H2B 1.1119 109.41 118.30 109.70 1.1112\n+IC C16 C17 C20 C22 1.5620 112.36 55.21 110.55 1.5476\n+IC C22 C17 *C20 C21 1.5476 110.55 125.88 113.32 1.5349\n+IC C21 C17 *C20 H20 1.5349 113.32 118.87 107.27 1.1157\n+IC C17 C20 C21 H21A 1.5633 113.32 64.90 110.93 1.1077\n+IC H21A C20 *C21 H21B 1.1077 110.93 -121.00 110.41 1.1104\n+IC H21A C20 *C21 H21C 1.1077 110.93 118.40 111.29 1.1085\n+IC C17 C20 C22 C23 1.5633 110.55 -174.59 115.12 1.5394\n+IC C23 C20 *C22 H22A 1.5394 115.12 120.23 109.35 1.1116\n+IC H22A C20 *C22 H22B 1.1116 109.35 117.13 108.75 1.1121\n+IC C20 C22 C23 C24 1.5476 115.12 172.50 112.25 1.5377\n+IC C24 C22 *C23 H23A 1.5377 112.25 121.13 109.69 1.1108\n+IC H23A C22 *C23 H23B 1.1108 109.69 118.14 108.99 1.1129\n+IC C22 C23 C24 C25 1.5394 112.25 -176.23 114.06 1.5418\n+IC C25 C23 *C24 H24A 1.5418 114.06 120.56 108.44 1.1132\n+IC H24A C23 *C24 H24B 1.1132 108.44 117.11 109.39 1.1121\n+IC C23 C24 C25 C26 1.5377 114.06 174.26 111.24 1.5378\n+IC C26 C24 *C25 C27 1.5378 111.24 119.63 112.86 1.5381\n+IC C26 C24 *C25 H25 1.5378 111.24 -119.50 108.47 1.1151\n+IC C24 C25 C26 H26A 1.5418 111.24 -178.53 110.52 1.1105\n+IC H26A C25 *C26 H26B 1.1105 110.52 120.00 110.36 1.1105\n+IC H26A C25 *C26 H26C 1.1105 110.52 -120.09 110.33 1.1106\n+IC C24 C25 C27 H27A 1.5418 112.86 -178.28 110.40 1.1105\n+IC H27A C25 *C27 H27B 1.1105 110.40 119.95 110.31 1.1105\n+IC H27A C25 *C27 H27C 1.1105 110.40 -119.82 110.77 1.1097\n+\n+RESI CHNS 0.00 !cholesterol with sidechain beyond c18(c20) omitted\n+! atoms names after the comments correspond to the\n+! correct cholesterol nomenclature\n+GROUP\n+ATOM C1 CRL1 0.14 !C3\n+ATOM H1 HGA1 0.09\n+ATOM O1 OHL -0.66\n+ATOM HO1 HOL 0.43\n+\n+ATOM C2 CRL2 -0.18 !c4\n+ATOM H2 HGA2 0.09\n+ATOM H2' HGA2 0.09\n+\n+ATOM C3 CEL1 0.00 !c5\n+ATOM C4 CEL1 -0.15 !c6\n+ATOM H4 HEL1 0.15\n+\n+ATOM C5 CRL2 -0.18 !c7\n+ATOM H5 HGA2 0.09\n+ATOM H5' HGA2 0.09\n+\n+ATOM C6 CRL1 -0.09 !c8\n+ATOM H6 HGA1 0.09\n+\n+ATOM C7 CRL1 -0.09 !c14\n+ATOM H7 HGA1 0.09\n+\n+ATOM C8 CRL2 -0.18 !c15\n+ATOM H8 HGA2 0.09\n+ATOM H8' HGA2 0.09\n+\n+ATOM C9 CRL2 -0.18 !c16\n+ATOM H9 HGA2 0.09\n+ATOM H9' HGA2 0.09\n+\n+ATOM C10 CRL1 -0.09 !c17\n+ATOM H10 HGA1 0.09\n+GROUP\n+ATOM C11 CRL1 0.00 ! c14\n+\n+ATOM Cc11 CTL3 -0.27 !c18, methyl at c13\n+ATOM H111 HAL3 0.09\n+ATOM H112 HAL3 0.09\n+ATOM H113 HAL3 0.09\n+\n+ATOM C12 CRL2 -0.18 !c12\n+ATOM H12 HGA2 0.09\n+ATOM H12' HGA2 0.09\n+\n+ATOM C13 CRL2 -0.18 !c11\n+ATOM H13 HGA2 0.09\n+ATOM H13' HGA2 0.09\n+\n+ATOM C14 CRL1 -0.09 !c9\n+ATOM H14 HGA1 0.09\n+\n+ATOM C15 CRL1 0.00 !c10\n+\n+ATOM CC15 CTL3 -0.27 !c19, methyl at c10\n+ATOM H151 HAL3 0.09\n+ATOM H152 HAL3 0.09\n+ATOM H153 HAL3 0.09\n+\n+ATOM C16 CRL2 -0.18 !c1\n+ATOM H16 HGA2 0.09\n+ATOM H16' HGA2 0.09\n+\n+ATOM C17 CRL2 -0.18 !c2\n+ATOM H17 HGA2 0.09\n+ATOM H17' HGA2 0.09\n+\n+ATOM C18 CTL3 -0.27 !c20\n+ATOM H181 HAL3 0.09\n+ATOM H182 HAL3 0.09\n+ATOM H183 HAL3 0.09\n+\n+BOND C1 O1 C1 H1 C1 C2\n+BOND O1 HO1\n+BOND C2 C3 C2 H2 C2 H2'\n+DOUBLE C3 C4\n+BOND C4 C5 C4 H4\n+BOND C5 C6 C5 H5 C5 H5'\n+BOND C6 C7 C6 H6\n+BOND C7 C8 C7 H7\n+BOND C8 C9 C8 H8 C8 H8'\n+BOND C9 C10 C9 H9 C9 H9'\n+BOND C10 C18 C10 C11 C10 H10\n+BOND C11 CC11 C11 C7 C11 C12\n+BOND CC11 H111 CC11 H112 CC11 H113\n+BOND C12 C13 C12 H12 C12 H12'\n+BOND C13 C14 C13 H13 C13 H13'\n+BOND C14 C15 C14 C6 C14 H14\n+BOND C15 C16 C15 C3 C15 CC15\n+BOND CC15 H151 CC15 H152 CC15 H153\n+BOND C16 C17 C16 H16 C16 H16'\n+BOND C17 C1 C17 H17 C17 H17'\n+BOND C18 H181 C18 H182 C18 H183\n+\n+!DONO HO1 O1\n+!ACCE O1\n+\n+IC O1 C1 C2 C3 1.4158 109.24 -176.17 111.80 1.5153\n+IC C1 C2 C3 C4 1.5368 111.80 -123.48 121.41 1.3430\n+IC C2 C3 C4 C5 1.5153 121.41 -178.76 123.84 1.5019\n+IC C3 C4 C5 C6 1.3430 123.84 14.64 112.44 1.5504\n+IC C4 C5 C6 C7 1.5019 112.44 -166.16 109.90 1.5192\n+IC C5 C6 C7 C8 1.5504 109.90 -54.73 118.74 1.5447\n+IC C6 C7 C8 C9 1.5192 118.74 -161.90 103.72 1.5418\n+IC C7 C8 C9 C10 1.5447 103.72 5.69 105.45 1.5530\n+IC C8 C9 C10 C11 1.5418 105.45 21.50 105.85 1.5300\n+IC C9 C10 C11 C12 1.5530 105.85 -155.90 116.00 1.5351\n+IC C7 C12 *C11 CC11 1.5194 108.58 -123.00 111.88 1.5530\n+IC C10 C11 C12 C13 1.5300 116.00 167.75 110.42 1.5414\n+IC C10 C11 C7 C8 1.5300 99.46 43.93 105.86 1.5447\n+IC C11 C12 C13 C14 1.5351 110.42 -52.28 113.50 1.5626\n+IC CC11 C11 C12 C13 1.5530 111.88 -66.16 110.42 1.5414\n+IC CC11 C11 C7 C8 1.5530 111.12 -70.96 105.86 1.5447\n+IC C12 C13 C14 C15 1.5414 113.50 179.43 114.52 1.5524\n+IC C13 C14 C15 CC15 1.5626 114.52 -50.80 109.07 1.5522\n+IC C13 C14 C15 C16 1.5626 114.52 69.29 108.64 1.5574\n+IC C13 C14 C6 C7 1.5626 113.16 -48.42 109.31 1.5192\n+IC CC15 C15 C16 C17 1.5522 110.15 -68.75 114.54 1.5383\n+IC C14 C15 C16 C17 1.5524 108.64 171.83 114.54 1.5383\n+IC C14 C15 C3 C4 1.5524 111.86 7.71 123.46 1.3430\n+IC C15 C16 C17 C1 1.5574 114.54 -54.68 110.51 1.5312\n+IC C11 C9 *C10 C18 1.5300 105.85 126.88 114.22 1.5413\n+IC O1 C2 *C1 H1 1.4158 109.24 -119.02 109.53 1.1156\n+IC C2 C1 O1 HO1 1.5368 109.24 62.69 105.39 0.9593\n+IC C3 C1 *C2 H2 1.5153 111.80 121.88 109.11 1.1100\n+IC C3 C1 *C2 H2' 1.5153 111.80 -123.05 107.36 1.1142\n+IC C5 C3 *C4 H4 1.5019 123.84 177.13 119.55 1.1001\n+IC C6 C4 *C5 H5 1.5504 112.44 122.17 110.88 1.1114\n+IC C6 C4 *C5 H5' 1.5504 112.44 -119.69 109.16 1.1124\n+IC C7 C5 *C6 H6 1.5192 109.90 -119.58 108.19 1.1122\n+IC C8 C6 *C7 H7 1.5447 118.74 117.73 105.77 1.1205\n+IC C9 C7 *C8 H8 1.5418 103.72 117.51 109.61 1.1108\n+IC C9 C7 *C8 H8' 1.5418 103.72 -121.25 111.67 1.1078\n+IC C10 C8 *C9 H9 1.5530 105.45 118.45 109.64 1.1105\n+IC C10 C8 *C9 H9' 1.5530 105.45 -120.18 112.16 1.1085\n+IC C18 C9 *C10 H10 1.5413 114.22 119.69 107.07 1.1162\n+IC C7 C11 CC11 H111 1.5194 111.12 -178.60 110.01 1.1092\n+IC H111 C11 *CC1 H112 1.1092 110.01 118.82 111.63 1.1068\n+IC H111 C11 *CC1 H113 1.1092 110.01 -120.26 111.66 1.1075\n+IC C13 C11 *C12 H12 1.5414 110.42 122.09 109.96 1.1102\n+IC C13 C11 *C12 H12' 1.5414 110.42 -119.49 108.88 1.1120\n+IC C14 C12 *C13 H13 1.5626 113.50 121.59 107.14 1.1091\n+IC C14 C12 *C13 H13' 1.5626 113.50 -122.38 108.79 1.1098\n+IC C13 C6 *C14 H14 1.5626 113.16 113.80 104.59 1.1184\n+IC C3 C15 CC15 H151 1.5435 107.81 -172.81 110.68 1.1082\n+IC H151 C15 *CC1 H152 1.1082 110.68 118.52 111.71 1.1081\n+IC H151 C15 *CC1 H153 1.1082 110.68 -120.68 110.98 1.1094\n+IC C17 C15 *C16 H16 1.5383 114.54 122.43 109.27 1.1104\n+IC C17 C15 *C16 H16' 1.5383 114.54 -120.70 108.26 1.1134\n+IC C16 C1 *C17 H17 1.5383 110.51 121.12 109.37 1.1120\n+IC C16 C1 *C17 H17' 1.5383 110.51 -120.62 109.70 1.1111\n+!use hbuild for c18 hydrogens\n+\n+RESI CHM1 0.00 !cholesterol analog with only rings 1 and 2\n+ !and the position 19 methyl\n+! atoms names after the comments correspond to the\n+! correct cholesterol nomenclature\n+!\n+!ring 1\n+!\n+GROUP\n+ATOM C1 CRL1 0.14 !C3\n+ATOM H1 HGA1 0.09\n+ATOM O1 OHL -0.66\n+ATOM HO1 HOL 0.43\n+\n+ATOM C2 CRL2 -0.18 !c4\n+ATOM H2 HGA2 0.09\n+ATOM H2' HGA2 0.09\n+\n+ATOM C3 CEL1 0.00 !c5\n+\n+ATOM C15 CRL1 0.00 !c10\n+\n+ATOM C16 CRL2 -0.18 !c1\n+ATOM H16 HGA2 0.09\n+ATOM H16' HGA2 0.09\n+\n+ATOM C17 CRL2 -0.18 !c2\n+ATOM H17 HGA2 0.09\n+ATOM H17' HGA2 0.09\n+\n+ATOM CC15 CTL3 -0.27 !c19, methyl at c10\n+ATOM H151 HAL3 0.09\n+ATOM H152 HAL3 0.09\n+ATOM H153 HAL3 0.09\n+\n+!ring 2\n+\n+ATOM C4 CEL1 -0.15 !c6\n+ATOM H4 HEL1 0.15\n+\n+ATOM C5 CRL2 -0.18 !c7\n+ATOM H5 HGA2 0.09\n+ATOM H5' HGA2 0.09\n+\n+ATOM C6 CRL2 -0.18 !c8\n+ATOM H6 HGA2 0.09\n+ATOM H6' HGA2 0.09\n+\n+ATOM C14 CRL2 -0.18 !c9\n+ATOM H14 HGA2 0.09\n+ATOM H14' HGA2 0.09\n+\n+\n+BOND C1 C2 C2 C3 C3 C15 C15 C16 C16 C17 C17 C1\n+BOND C1 O1 O1 HO1 C1 H1\n+BOND C2 H2 C2 H2'\n+BOND C15 CC15 CC15 H151 CC15 H152 CC15 H153\n+BOND C16 H16 C16 H16'\n+BOND C17 H17 C17 H17'\n+DOUB C3 C4\n+BOND C4 C5 C5 C6 C6 C14 C14 C15\n+BOND C4 H4\n+BOND C5 H5 C5 H5'\n+BOND C6 H6 C6 H6'\n+BOND C14 H14 C14 H14'\n+\n+IC C1 C2 C3 C15 0.0000 0.00 0.00 0.00 0.0000\n+IC C2 C3 C15 C16 0.0000 0.00 0.00 0.00 0.0000\n+IC C17 C1 C2 C3 0.0000 0.00 0.00 0.00 0.0000\n+IC C2 C17 *C1 O1 0.0000 0.00 120.00 0.00 0.0000\n+IC C2 C17 *C1 H1 0.0000 0.00 -120.00 0.00 0.0000\n+IC C17 C1 O1 HO1 0.0000 0.00 180.00 0.00 0.0000\n+IC C3 C1 *C2 H2 0.0000 0.00 120.00 0.00 0.0000\n+IC C3 C1 *C2 H2' 0.0000 0.00 -120.00 0.00 0.0000\n+IC C1 C2 C3 C4 0.0000 0.00 180.00 0.00 0.0000\n+IC C2 C3 C4 C5 0.0000 0.00 180.00 0.00 0.0000\n+IC C3 C4 C5 C6 0.0000 0.00 15.00 0.00 0.0000\n+IC C4 C5 C6 C14 0.0000 0.00 -45.00 0.00 0.0000\n+IC C14 C3 *C15 CC15 0.0000 0.00 -120.00 0.00 0.0000\n+IC C17 C15 *C16 H16 0.0000 0.00 120.00 0.00 0.0000\n+IC C17 C15 *C16 H16' 0.0000 0.00 -120.00 0.00 0.0000\n+IC C16 C1 *C17 H17 0.0000 0.00 120.00 0.00 0.0000\n+IC C16 C1 *C17 H17' 0.0000 0.00 -120.00 0.00 0.0000\n+IC C3 C15 CC15 H151 0.0000 0.00 180.00 0.00 0.0000\n+IC H151 C15 *CC15 H152 0.0000 0.00 120.00 0.00 0.0000\n+IC H151 C15 *CC15 H153 0.0000 0.00 -120.00 0.00 0.0000\n+IC C5 C3 *C4 H4 0.0000 0.00 180.00 0.00 0.0000\n+IC C6 C4 *C5 H5 0.0000 0.00 120.00 0.00 0.0000\n+IC C6 C4 *C5 H5' 0.0000 0.00 -120.00 0.00 0.0000\n+IC C14 C5 *C6 H6 0.0000 0.00 120.00 0.00 0.0000\n+IC C14 C5 *C6 H6' 0.0000 0.00 -120.00 0.00 0.0000\n+IC C6 C15 *C14 H14 0.0000 0.00 120.00 0.00 0.0000\n+IC C6 C15 *C14 H14' 0.0000 0.00 -120.00 0.00 0.0000\n+\n+RESI ERG 0.0 ! Ergosterol\n+! Based off CHL1, Brent Rogaski (3/12)\n+\n+GROUP !\n+ATOM C3 CRL1 0.14 !\n+ATOM O3 OHL -0.66 !\n+ATOM H3' HOL 0.43 !\n+ATOM H3 HGA1 0.09 !\n+GROUP !\n+ATOM C4 CRL2 -0.18 ! H26B H26C H27C H27B\n+ATOM H4A HGA2 0.09 ! \\ / \\ /\n+ATOM H4B HGA2 0.09 ! C26 C27\n+GROUP ! / \\ / \\\n+ATOM C5 CEL1 0.00 ! H26A \\ H25 / H27A\n+ATOM C6 CEL1 -0.15 ! \\ | /\n+ATOM H6 HEL1 0.15 ! \\ | /\n+GROUP ! \\|/\n+ATOM C7 CEL1 -0.15 ! C25\n+ATOM C8 CEL1 0.00 ! |\n+ATOM H7 HEL1 0.15 ! | H28C\n+GROUP ! | |\n+ATOM C14 CRL1 -0.09 ! H24--C24-----C28--H28B\n+ATOM H14 HGA1 0.09 ! | |\n+GROUP ! | H28A\n+ATOM C15 CRL2 -0.18 ! |\n+ATOM H15A HGA2 0.09 ! C23--H23\n+ATOM H15B HGA2 0.09 ! |!\n+GROUP ! |! (trans)\n+ATOM C16 CRL2 -0.18 ! |!\n+ATOM H16A HGA2 0.09 ! H22--C22\n+ATOM H16B HGA2 0.09 ! |\n+GROUP ! H21A |\n+ATOM C17 CRL1 -0.09 ! | |\n+ATOM H17 HGA1 0.09 ! H21B--C21-----C20--H20\n+GROUP ! | |\n+ATOM C13 CRL1 0.00 ! H21C |\n+GROUP ! |\n+ATOM C18 CTL3 -0.27 ! H18C |\n+ATOM H18A HAL3 0.09 ! | | H16B\n+ATOM H18B HAL3 0.09 ! H18B--C18 | |\n+ATOM H18C HAL3 0.09 ! / \\ C17-----C16--H16A\n+GROUP ! H18A \\ |\\ |\n+ATOM C12 CRL2 -0.18 ! \\ | H17 |\n+ATOM H12A HGA2 0.09 ! H12B \\ | | H15B\n+ATOM H12B HGA2 0.09 ! \\ \\| |/\n+GROUP ! H12A--C12-----C13 C15--H15A\n+ATOM C11 CRL2 -0.18 ! / \\ /\n+ATOM H11A HGA2 0.09 ! H11B / \\ /\n+ATOM H11B HGA2 0.09 ! \\ / \\ /\n+GROUP ! H11A--C11 C14--H14\n+ATOM C9 CRL1 -0.09 ! \\ /\n+ATOM H9 HGA1 0.09 ! H19C \\ /\n+GROUP ! | \\ /\n+ATOM C10 CRL1 0.00 ! H19A-C19-H19B C9------C8\n+GROUP ! \\ / \\ \\\\\n+ATOM C19 CTL3 -0.27 ! H1B \\ / H9 \\\\\n+ATOM H19A HAL3 0.09 ! | \\ / \\\\\n+ATOM H19B HAL3 0.09 ! H1A--C1------C10 C7--H7\n+ATOM H19C HAL3 0.09 ! / \\ /\n+GROUP ! H2A / \\ /\n+ATOM C1 CRL2 -0.18 ! \\ / \\ ----- /\n+ATOM H1A HGA2 0.09 ! C2 C5------C6\n+ATOM H1B HGA2 0.09 ! / \\ / \\\n+GROUP ! H2B \\ / H6\n+ATOM C2 CRL2 -0.18 ! \\ /\n+ATOM H2A HGA2 0.09 ! H3--C3------C4--H4A\n+ATOM H2B HGA2 0.09 ! | |\n+GROUP ! | H4B\n+ATOM C20 CTL1 -0.09 ! |\n+ATOM H20 HAL1 0.09 ! H3'--O3\n+GROUP !\n+ATOM C21 CTL3 -0.27 !\n+ATOM H21A HAL3 0.09 !\n+ATOM H21B HAL3 0.09 !\n+ATOM H21C HAL3 0.09 !\n+GROUP !\n+ATOM C22 CEL1 -0.15 !\n+ATOM C23 CEL1 -0.15 !\n+ATOM H22 HEL1 0.15 !\n+ATOM H23 HEL1 0.15 !\n+GROUP !\n+ATOM C24 CTL1 -0.09 !\n+ATOM H24 HAL1 0.09 !\n+GROUP !\n+ATOM C25 CTL1 -0.09 !\n+ATOM H25 HAL1 0.09 !\n+GROUP !\n+ATOM C26 CTL3 -0.27 !\n+ATOM H26A HAL3 0.09 !\n+ATOM H26B HAL3 0.09 !\n+ATOM H26C HAL3 0.09 !\n+GROUP !\n+ATOM C27 CTL3 -0.27 !\n+ATOM H27A HAL3 0.09 !\n+ATOM H27B HAL3 0.09 !\n+ATOM H27C HAL3 0.09 !\n+GROUP !\n+ATOM C28 CTL3 -0.27 !\n+ATOM H28A HAL3 0.09 !\n+ATOM H28B HAL3 0.09 !\n+ATOM H28C HAL3 0.09 !\n+\n+BOND C3 O3 C3 H3 O3 H3'\n+BOND C3 C2 C2 H2A C2 H2B\n+BOND C2 C1 C1 H1A C1 H1B\n+BOND C3 C4 C4 H4A C4 H4B\n+BOND C4 C5\n+BOND C5 C10\n+BOND C10 C1\n+BOND C10 C19 C19 H19A C19 H19B C19 H19C\n+DOUBLE C5 C6\n+BOND C6 H6\n+BOND C6 C7 C7 H7\n+DOUBLE C7 C8\n+BOND C8 C9 C9 H9\n+BOND C9 C10\n+BOND C8 C14 C14 H14\n+BOND C14 C13\n+BOND C13 C12 C12 H12A C12 H12B\n+BOND C12 C11 C11 H11A C11 H11B\n+BOND C11 C9\n+BOND C13 C18 C18 H18A C18 H18B C18 H18C\n+BOND C14 C15 C15 H15A C15 H15B\n+BOND C15 C16 C16 H16A C16 H16B\n+BOND C16 C17 C17 H17\n+BOND C17 C13\n+BOND C17 C20 C20 H20\n+BOND C20 C21 C21 H21A C21 H21B C21 H21C\n+BOND C20 C22 C22 H22\n+DOUBLE C22 C23\n+BOND C23 H23\n+BOND C23 C24 C24 H24 C24 C28\n+BOND C24 C25 C25 H25\n+BOND C25 C26 C26 H26A C26 H26B C26 H26C\n+BOND C25 C27 C27 H27A C27 H27B C27 H27C\n+BOND C28 H28A C28 H28B C28 H28C\n+\n+!ICs based on CHARMM optimized structure updated 3-2012 BJR\n+IC C4 C2 *C3 O3 1.5384 111.29 120.53 109.15 1.4152\n+IC O3 C2 *C3 H3 1.4152 109.15 118.43 109.07 1.1161\n+IC C2 C3 O3 H3' 1.534 109.15 -59.53 105.21 0.9594\n+IC C2 C3 C4 C5 1.534 111.29 -55.64 110.68 1.5147\n+IC C5 C3 *C4 H4A 1.5147 110.68 -122.49 107.48 1.114\n+IC H4A C3 *C4 H4B 1.114 107.48 -115.4 109.39 1.1091\n+IC C3 C4 C5 C10 1.5384 110.68 54.27 115.86 1.5508\n+IC C10 C4 *C5 C6 1.5508 115.86 -176.59 122.84 1.3509\n+IC C4 C5 C6 C7 1.5147 122.84 175.21 124.45 1.3514\n+IC C7 C5 *C6 H6 1.3514 124.45 -178.72 117.51 1.0999\n+IC C5 C6 C7 C8 1.3509 124.45 -2.28 123.72 1.349\n+IC C8 C6 *C7 H7 1.349 123.72 -177.09 118.27 1.0989\n+IC C6 C7 C8 C14 1.3514 123.72 -174.8 125.77 1.5158\n+IC C14 C7 *C8 C9 1.5158 125.77 176.26 121.16 1.534\n+IC C7 C8 C14 C13 1.349 125.77 -127.21 114.84 1.527\n+IC C13 C8 *C14 C15 1.527 114.84 128.62 120.79 1.5474\n+IC C13 C8 *C14 H14 1.527 114.84 -114.65 104.93 1.1181\n+IC C8 C14 C15 C16 1.5158 120.79 -164.56 103.93 1.5364\n+IC C16 C14 *C15 H15A 1.5364 103.93 -121.65 111.8 1.1083\n+IC H15A C14 *C15 H15B 1.1083 111.8 -121.53 110.09 1.1118\n+IC C14 C15 C16 C17 1.5474 103.93 8.48 106.75 1.5641\n+IC C17 C15 *C16 H16A 1.5641 106.75 -120.41 111.79 1.1095\n+IC H16A C15 *C16 H16B 1.1095 111.79 -120.41 109.03 1.1113\n+IC C13 C16 *C17 C20 1.5483 105.1 131.23 112.64 1.5382\n+IC C13 C16 *C17 H17 1.5483 105.1 -111.42 106.08 1.1169\n+IC C17 C14 *C13 C12 1.5483 100.83 123.37 107.03 1.5453\n+IC C12 C14 *C13 C18 1.5453 107.03 121.68 110 1.5503\n+IC C14 C13 C18 H18A 1.527 110 64.09 111.53 1.1074\n+IC H18A C13 *C18 H18B 1.1074 111.53 -120.53 111.19 1.1083\n+IC H18A C13 *C18 H18C 1.1074 111.53 120 110.03 1.1088\n+IC C14 C13 C12 C11 1.527 107.03 56.14 111.71 1.5474\n+IC C11 C13 *C12 H12A 1.5474 111.71 -120.3 108.81 1.1114\n+IC H12A C13 *C12 H12B 1.1114 108.81 -118.79 110.91 1.1064\n+IC C9 C12 *C11 H11A 1.5641 114.35 -121.47 108.03 1.1115\n+IC H11A C12 *C11 H11B 1.1115 108.03 -116.16 107.02 1.1107\n+IC C10 C8 *C9 H9 1.5774 115.61 -115.28 104.59 1.1141\n+IC C9 C5 *C10 C19 1.5774 113.62 -120.34 106.21 1.554\n+IC C19 C5 *C10 C1 1.554 106.21 -117.85 108.65 1.5564\n+IC C5 C10 C19 H19A 1.5508 106.21 63.88 110.62 1.1106\n+IC H19A C10 *C19 H19B 1.1106 110.62 -120.12 112.1 1.1066\n+IC H19A C10 *C19 H19C 1.1106 110.62 121.49 111.12 1.1081\n+IC C2 C10 *C1 H1A 1.5411 114.47 -120.26 108.38 1.1136\n+IC C2 C10 *C1 H1B 1.5411 114.47 123.02 108.74 1.1111\n+IC C1 C3 *C2 H2A 1.5411 110.88 -121.14 109.65 1.1104\n+IC H2A C3 *C2 H2B 1.1104 109.65 -117.79 109.12 1.1121\n+IC C16 C17 C20 C22 1.5641 112.64 51.77 111.66 1.5187\n+IC C22 C17 *C20 C21 1.5187 111.66 119.38 111.66 1.5443\n+IC C21 C17 *C20 H20 1.5443 111.66 119.6 109.11 1.1139\n+IC C17 C20 C21 H21A 1.5382 111.66 69.91 110.37 1.1067\n+IC H21A C20 *C21 H21B 1.1067 110.37 -121 111.06 1.1104\n+IC H21A C20 *C21 H21C 1.1067 110.37 117.94 111.09 1.1119\n+IC C17 C20 C22 C23 1.5382 111.66 -127.81 124.83 1.3444\n+IC C23 C20 *C22 H22 1.3444 124.83 -179.53 115.68 1.1005\n+IC C20 C22 C23 C24 1.5187 124.83 -179.44 124.94 1.5151\n+IC C24 C22 *C23 H23 1.5151 124.94 178.9 119.39 1.1007\n+IC C22 C23 C24 C25 1.3444 124.94 74.2 112.31 1.5348\n+IC C25 C23 *C24 C28 1.5348 112.31 125.07 109.12 1.5491\n+IC C28 C23 *C24 H24 1.5491 109.12 116.8 108.77 1.1162\n+IC C23 C24 C25 C26 1.5151 112.31 66.3 112.54 1.5424\n+IC C26 C24 *C25 C27 1.5424 112.54 124.63 110.25 1.5415\n+IC C26 C24 *C25 H25 1.5424 112.54 -118.78 107.84 1.1178\n+IC C24 C25 C26 H26A 1.5348 112.54 66.53 111.05 1.1092\n+IC H26A C25 *C26 H26B 1.1092 111.05 -121.38 111.05 1.1097\n+IC H26A C25 *C26 H26C 1.1092 111.05 119.06 109.67 1.1108\n+IC C24 C25 C27 H27A 1.5348 110.25 52.82 110.63 1.11\n+IC H27A C25 *C27 H27B 1.11 110.63 -121 111.09 1.1092\n+IC H27A C25 *C27 H27C 1.11 110.63 119.67 109.85 1.1108\n+IC C23 C24 C28 H28A 1.5151 109.12 59.12 110.24 1.1113\n+IC H28A C24 *C28 H28B 1.1113 110.24 -120.08 111.67 1.1097\n+IC H28A C24 *C28 H28C 1.1113 110.24 118.88 111.07 1.1085\n+\n+RESI SITO 0.0 ! beta-Sitosterol\n+GROUP !\n+ATOM C3 CRL1 0.14 ! \n+ATOM H3 HGA1 0.09 !\n+ATOM O3 OHL -0.66 !\n+ATOM H3' HOL 0.43 !\n+GROUP !\n+ATOM C4 CRL2 -0.18 ! H26B H26C H27C H27B\n+ATOM H4A HGA2 0.09 ! \\ / \\ /\n+ATOM H4B HGA2 0.09 ! C26 C27\n+GROUP ! / \\ / \\\n+ATOM C5 CEL1 0.00 ! H26A \\ H25 / H27A\n+ATOM C6 CEL1 -0.15 ! \\ | /\n+ATOM H6 HEL1 0.15 ! \\ | /\n+GROUP ! \\|/\n+ATOM C7 CRL2 -0.18 ! C25\n+ATOM H7A HGA2 0.09 ! |\n+ATOM H7B HGA2 0.09 ! |\n+GROUP ! |\n+ATOM C8 CRL1 -0.09 ! | \n+ATOM H8 HGA1 0.09 ! | H28B H29A\n+GROUP ! | | |\n+ATOM C14 CRL1 -0.09 ! H24--C24-----C28-----C29--H29B\n+ATOM H14 HGA1 0.09 ! | | |\n+GROUP ! | H28A H29C\n+ATOM C15 CRL2 -0.18 ! |\n+ATOM H15A HGA2 0.09 ! H23A--C23--H23B\n+ATOM H15B HGA2 0.09 ! |\n+GROUP ! |\n+ATOM C16 CRL2 -0.18 ! |\n+ATOM H16A HGA2 0.09 ! H22A--C22--H22B\n+ATOM H16B HGA2 0.09 ! |\n+GROUP ! H21A |\n+ATOM C17 CRL1 -0.09 ! | |\n+ATOM H17 HGA1 0.09 ! H21B--C21-----C20--H20\n+GROUP ! | |\n+ATOM C13 CRL1 0.00 ! H21C |\n+GROUP ! |\n+ATOM C18 CTL3 -0.27 ! H18C |\n+ATOM H18A HAL3 0.09 ! | | H16B\n+ATOM H18B HAL3 0.09 ! H18B--C18 | |\n+ATOM H18C HAL3 0.09 ! / \\ C17-----C16--H16A\n+GROUP ! H18A \\ |\\ |\n+ATOM C12 CRL2 -0.18 ! \\ | H17 |\n+ATOM H12A HGA2 0.09 ! H12B \\ | | H15B\n+ATOM H12B HGA2 0.09 ! \\ \\| |/\n+GROUP ! H12A--C12-----C13 C15--H15A\n+ATOM C11 CRL2 -0.18 ! / \\ /\n+ATOM H11A HGA2 0.09 ! H11B / \\ /\n+ATOM H11B HGA2 0.09 ! \\ / \\ /\n+GROUP ! H11A--C11 C14--H14\n+ATOM C9 CRL1 -0.09 ! \\ /\n+ATOM H9 HGA1 0.09 ! H19C \\ H8 /\n+GROUP ! | \\ \\ /\n+ATOM C10 CRL1 0.00 ! H19A-C19-H19B C9------C8\n+GROUP ! \\ / \\ \\\n+ATOM C19 CTL3 -0.27 ! H1B \\ / H9 \\ H7A\n+ATOM H19A HAL3 0.09 ! | \\ / \\ /\n+ATOM H19B HAL3 0.09 ! H1A--C1------C10 C7\n+ATOM H19C HAL3 0.09 ! / \\ / \\\n+GROUP ! H2A / \\ / H7B\n+ATOM C1 CRL2 -0.18 ! \\ / \\ ------ /\n+ATOM H1A HGA2 0.09 ! C2 C5------C6\n+ATOM H1B HGA2 0.09 ! / \\ / \\\n+GROUP ! H2B \\ / H6\n+ATOM C2 CRL2 -0.18 ! \\ /\n+ATOM H2A HGA2 0.09 ! H3--C3------C4--H4A\n+ATOM H2B HGA2 0.09 ! | |\n+GROUP ! | H4B\n+ATOM C20 CTL1 -0.09 ! |\n+ATOM H20 HAL1 0.09 ! H3'--O3\n+GROUP !\n+ATOM C21 CTL3 -0.27 !\n+ATOM H21A HAL3 0.09 !\n+ATOM H21B HAL3 0.09 !\n+ATOM H21C HAL3 0.09 !\n+GROUP !\n+ATOM C22 CTL2 -0.18 !\n+ATOM H22A HAL2 0.09 !\n+ATOM H22B HAL2 0.09 !\n+GROUP !\n+ATOM C23 CTL2 -0.18 !\n+ATOM H23A HAL2 0.09 !\n+ATOM H23B HAL2 0.09 !\n+GROUP !\n+ATOM C24 CTL1 -0.09 !\n+ATOM H24 HAL1 0.09 !\n+GROUP !\n+ATOM C25 CTL1 -0.09 !\n+ATOM H25 HAL1 0.09 !\n+GROUP !\n+ATOM C26 CTL3 -0.27 !\n+ATOM H26A HAL3 0.09 !\n+ATOM H26B HAL3 0.09 !\n+ATOM H26C HAL3 0.09 !\n+GROUP !\n+ATOM C27 CTL3 -0.27 !\n+ATOM H27A HAL3 0.09 !\n+ATOM H27B HAL3 0.09 !\n+ATOM H27C HAL3 0.09 !\n+GROUP !\n+ATOM C28 CTL2 -0.18 !\n+ATOM H28A HAL2 0.09 !\n+ATOM H28B HAL2 0.09 !\n+GROUP !\n+ATOM C29 CTL3 -0.27 !\n+ATOM H29A HAL3 0.09 !\n+ATOM H29B HAL3 0.09 !\n+ATOM H29C HAL3 0.09 !\n+\n+BOND C3 O3 C3 H3 O3 H3'\n+BOND C3 C2 C2 H2A C2 H2B\n+BOND C2 C1 C1 H1A C1 H1B\n+BOND C3 C4 C4 H4A C4 H4B\n+BOND C4 C5\n+BOND C5 C10\n+BOND C10 C1\n+BOND C10 C19 C19 H19A C19 H19B C19 H19C\n+DOUBLE C5 C6\n+BOND C6 H6\n+BOND C6 C7 C7 H7A C7 H7B\n+BOND C7 C8 C8 H8\n+BOND C8 C9 C9 H9\n+BOND C9 C10\n+BOND C8 C14 C14 H14\n+BOND C14 C13\n+BOND C13 C12 C12 H12A C12 H12B\n+BOND C12 C11 C11 H11A C11 H11B\n+BOND C11 C9\n+BOND C13 C18 C18 H18A C18 H18B C18 H18C\n+BOND C14 C15 C15 H15A C15 H15B\n+BOND C15 C16 C16 H16A C16 H16B\n+BOND C16 C17 C17 H17\n+BOND C17 C13\n+BOND C17 C20 C20 H20\n+BOND C20 C21 C21 H21A C21 H21B C21 H21C\n+BOND C20 C22 C22 H22A C22 H22B\n+BOND C22 C23 C23 H23A C23 H23B\n+BOND C23 C24 C24 H24 C24 C28\n+BOND C24 C25 C25 H25\n+BOND C25 C26 C26 H26A C26 H26B C26 H26C\n+BOND C25 C27 C27 H27A C27 H27B C27 H27C\n+BOND C28 H28A C28 H28B C28 C29\n+BOND C29 H29A C29 H29B C29 H29C\n+\n+!IC table by CHARMM ic generate\n+! I J K L R(I(J/K)) T(I(JK/KJ)) PHI T(JKL) R(KL) \n+IC C1 C2 C3 C4 1.5425 109.98 58.15 109.78 1.5363\n+IC C4 C2 *C3 O3 1.5614 110.14 115.63 112.44 1.4052\n+IC O3 C2 *C3 H3 1.4052 112.44 121.91 109.94 1.1110\n+IC C2 C3 O3 H3' 1.5481 112.44 16.69 111.55 0.9600\n+IC C2 C3 C4 C5 1.5481 110.14 -57.11 113.38 1.4781\n+IC C5 C3 *C4 H4A 1.4781 113.38 116.30 100.70 1.1110\n+IC H4A C3 *C4 H4B 1.1110 100.70 121.05 113.53 1.1110\n+IC C3 C4 C5 C10 1.5614 113.38 47.05 115.71 1.6032\n+IC C10 C4 *C5 C6 1.6032 115.71 -175.59 121.48 1.3118\n+IC C4 C5 C6 C7 1.4781 121.48 179.72 126.06 1.5250\n+IC C7 C5 *C6 H6 1.5250 126.06 177.70 114.72 1.1000\n+IC C5 C6 C7 C8 1.3118 126.06 6.14 113.57 1.5411\n+IC C8 C6 *C7 H7A 1.5411 113.57 124.57 109.39 1.1110\n+IC H7A C6 *C7 H7B 1.1110 109.39 112.27 105.47 1.1110\n+IC C6 C7 C8 C14 1.5250 113.57 -156.98 108.82 1.5247\n+IC C14 C7 *C8 C9 1.5247 108.82 121.65 111.80 1.5528\n+IC C9 C7 *C8 H8 1.5528 111.80 118.34 106.77 1.1110\n+IC C7 C8 C14 C13 1.5411 108.82 -179.93 114.78 1.5511\n+IC C13 C8 *C14 C15 1.5511 114.78 127.01 117.29 1.5049\n+IC C13 C8 *C14 H14 1.5511 114.78 -121.80 106.97 1.1110\n+IC C8 C14 C15 C16 1.5247 117.29 -164.40 105.99 1.5740\n+IC C16 C14 *C15 H15A 1.5740 105.99 125.51 110.98 1.1110\n+IC H15A C14 *C15 H15B 1.1110 110.98 118.15 112.47 1.1110\n+IC C14 C15 C16 C17 1.5049 105.99 8.40 101.13 1.5604\n+IC C17 C15 *C16 H16A 1.5604 101.13 120.24 112.66 1.1110\n+IC H16A C15 *C16 H16B 1.1110 112.66 122.80 114.92 1.1110\n+IC C13 C16 *C17 C20 1.5408 110.40 135.55 112.19 1.5585\n+IC C13 C16 *C17 H17 1.5408 110.40 -111.30 108.54 1.1110\n+IC C17 C14 *C13 C12 1.5408 96.21 126.93 108.95 1.5449\n+IC C12 C14 *C13 C18 1.5449 108.95 125.67 112.03 1.5959\n+IC C14 C13 C18 H18A 1.5511 112.03 59.86 105.90 1.1110\n+IC H18A C13 *C18 H18B 1.1110 105.90 121.44 112.98 1.1110\n+IC H18A C13 *C18 H18C 1.1110 105.90 -115.49 113.78 1.1110\n+IC C14 C13 C12 C11 1.5511 108.95 55.50 108.69 1.5667\n+IC C11 C13 *C12 H12A 1.5667 108.69 120.36 114.84 1.1110\n+IC H12A C13 *C12 H12B 1.1110 114.84 134.32 111.99 1.1110\n+IC C9 C12 *C11 H11A 1.5661 113.29 123.44 111.09 1.1110\n+IC H11A C12 *C11 H11B 1.1110 111.09 119.55 108.81 1.1110\n+IC C10 C8 *C9 H9 1.5596 114.24 -123.22 105.85 1.1110\n+IC C9 C5 *C10 C19 1.5596 108.96 -119.21 103.05 1.5822\n+IC C19 C5 *C10 C1 1.5822 103.05 -120.22 113.87 1.5719\n+IC C5 C10 C19 H19A 1.6032 103.05 -167.91 105.17 1.1110\n+IC H19A C10 *C19 H19B 1.1110 105.17 117.83 110.02 1.1110\n+IC H19A C10 *C19 H19C 1.1110 105.17 -113.41 116.87 1.1110\n+IC C2 C10 *C1 H1A 1.5748 111.85 122.31 112.41 1.1110\n+IC C2 C10 *C1 H1B 1.5748 111.85 -115.17 108.89 1.1110\n+IC C1 C3 *C2 H2A 1.5748 111.28 108.57 114.79 1.1110\n+IC H2A C3 *C2 H2B 1.1110 114.79 130.06 115.45 1.1110\n+IC C16 C17 C20 C22 1.5604 112.19 63.09 110.55 1.5457\n+IC C22 C17 *C20 C21 1.5457 110.55 117.76 114.29 1.5454\n+IC C21 C17 *C20 H20 1.5454 114.29 123.20 112.25 1.1110\n+IC C17 C20 C21 H21A 1.5585 114.29 63.46 102.59 1.1110\n+IC H21A C20 *C21 H21B 1.1110 102.59 -104.97 108.57 1.1110\n+IC H21A C20 *C21 H21C 1.1110 102.59 124.57 117.48 1.1110\n+IC C17 C20 C22 C23 1.5585 110.55 -154.15 120.40 1.4799\n+IC C23 C20 *C22 H22A 1.4799 120.40 128.99 110.01 1.1110\n+IC H22A C20 *C22 H22B 1.1110 110.01 106.96 103.91 1.1110\n+IC C20 C22 C23 C24 1.5457 120.40 179.97 118.23 1.5226\n+IC C24 C22 *C23 H23A 1.5226 118.23 117.35 116.59 1.1110\n+IC H23A C22 *C23 H23B 1.1110 116.59 109.14 105.33 1.1110\n+IC C22 C23 C24 C25 1.4799 118.23 -141.10 108.01 1.5402\n+IC C25 C23 *C24 C28 1.5402 108.01 -126.79 109.69 1.5069\n+IC C28 C23 *C24 H24 1.5069 109.69 -120.24 107.94 1.1110\n+IC C23 C24 C25 C26 1.5226 108.01 -53.24 113.42 1.5913\n+IC C26 C24 *C25 C27 1.5913 113.42 126.06 111.29 1.5764\n+IC C26 C24 *C25 H25 1.5913 113.42 -117.89 114.16 1.1110\n+IC C24 C25 C26 H26A 1.5402 113.42 9.38 108.77 1.1110\n+IC H26A C25 *C26 H26B 1.1110 108.77 118.59 114.62 1.1110\n+IC H26A C25 *C26 H26C 1.1110 108.77 -121.37 111.02 1.1110\n+IC C24 C25 C27 H27A 1.5402 111.29 -51.12 116.25 1.1110\n+IC H27A C25 *C27 H27B 1.1110 116.25 136.82 114.66 1.1110\n+IC H27A C25 *C27 H27C 1.1110 116.25 -118.20 104.68 1.1110\n+IC C23 C24 C28 C29 1.5226 109.69 176.49 114.11 1.5039\n+IC C29 C24 *C28 H28A 1.5039 114.11 -122.70 109.66 1.1110\n+IC H28A C24 *C28 H28B 1.1110 109.66 -121.24 113.74 1.1110\n+IC C24 C28 C29 H29A 1.5069 114.11 151.34 109.11 1.1110\n+IC H29A C28 *C29 H29B 1.1110 109.11 -111.49 108.42 1.1110\n+IC H29A C28 *C29 H29C 1.1110 109.11 130.25 116.78 1.1110\n+\n+\n+RESI STIG 0.0 ! Stigmasterol\n+GROUP !\n+ATOM C3 CRL1 0.14 ! \n+ATOM H3 HGA1 0.09 !\n+ATOM O3 OHL -0.66 !\n+ATOM H3' HOL 0.43 !\n+GROUP !\n+ATOM C4 CRL2 -0.18 ! H26B H26C H27C H27B\n+ATOM H4A HGA2 0.09 ! \\ / \\ /\n+ATOM H4B HGA2 0.09 ! C26 C27\n+GROUP ! / \\ / \\\n+ATOM C5 CEL1 0.00 ! H26A \\ H25 / H27A\n+ATOM C6 CEL1 -0.15 ! \\ | /\n+ATOM H6 HEL1 0.15 ! \\ | /\n+GROUP ! \\|/\n+ATOM C7 CRL2 -0.18 ! C25\n+ATOM H7A HGA2 0.09 ! |\n+ATOM H7B HGA2 0.09 ! |\n+GROUP ! |\n+ATOM C8 CRL1 -0.09 ! | \n+ATOM H8 HGA1 0.09 ! | H28B H29A\n+GROUP ! | | |\n+ATOM C14 CRL1 -0.09 ! H24--C24-----C28-----C29--H29B\n+ATOM H14 HGA1 0.09 ! | | |\n+GROUP ! | H28A H29C\n+ATOM C15 CRL2 -0.18 ! |\n+ATOM H15A HGA2 0.09 ! C23--H23\n+ATOM H15B HGA2 0.09 ! ||\n+GROUP ! || (trans)\n+ATOM C16 CRL2 -0.18 ! ||\n+ATOM H16A HGA2 0.09 ! H22--C22\n+ATOM H16B HGA2 0.09 ! |\n+GROUP ! H21A |\n+ATOM C17 CRL1 -0.09 ! | |\n+ATOM H17 HGA1 0.09 ! H21B--C21-----C20--H20\n+GROUP ! | |\n+ATOM C13 CRL1 0.00 ! H21C |\n+GROUP ! |\n+ATOM C18 CTL3 -0.27 ! H18C |\n+ATOM H18A HAL3 0.09 ! | | H16B\n+ATOM H18B HAL3 0.09 ! H18B--C18 | |\n+ATOM H18C HAL3 0.09 ! / \\ C17-----C16--H16A\n+GROUP ! H18A \\ |\\ |\n+ATOM C12 CRL2 -0.18 ! \\ | H17 |\n+ATOM H12A HGA2 0.09 ! H12B \\ | | H15B\n+ATOM H12B HGA2 0.09 ! \\ \\| |/\n+GROUP ! H12A--C12-----C13 C15--H15A\n+ATOM C11 CRL2 -0.18 ! / \\ /\n+ATOM H11A HGA2 0.09 ! H11B / \\ /\n+ATOM H11B HGA2 0.09 ! \\ / \\ /\n+GROUP ! H11A--C11 C14--H14\n+ATOM C9 CRL1 -0.09 ! \\ /\n+ATOM H9 HGA1 0.09 ! H19C \\ H8 /\n+GROUP ! | \\ \\ /\n+ATOM C10 CRL1 0.00 ! H19A-C19-H19B C9------C8\n+GROUP ! \\ / \\ \\\n+ATOM C19 CTL3 -0.27 ! H1B \\ / H9 \\ H7A\n+ATOM H19A HAL3 0.09 ! | \\ / \\ /\n+ATOM H19B HAL3 0.09 ! H1A--C1------C10 C7\n+ATOM H19C HAL3 0.09 ! / \\ / \\\n+GROUP ! H2A / \\ / H7B\n+ATOM C1 CRL2 -0.18 ! \\ / \\ ------ /\n+ATOM H1A HGA2 0.09 ! C2 C5------C6\n+ATOM H1B HGA2 0.09 ! / \\ / \\\n+GROUP ! H2B \\ / H6\n+ATOM C2 CRL2 -0.18 ! \\ /\n+ATOM H2A HGA2 0.09 ! H3--C3------C4--H4A\n+ATOM H2B HGA2 0.09 ! | |\n+GROUP ! | H4B\n+ATOM C20 CTL1 -0.09 ! |\n+ATOM H20 HAL1 0.09 ! H3'--O3\n+GROUP !\n+ATOM C21 CTL3 -0.27 !\n+ATOM H21A HAL3 0.09 !\n+ATOM H21B HAL3 0.09 !\n+ATOM H21C HAL3 0.09 !\n+GROUP !\n+ATOM C22 CEL1 -0.15 !\n+ATOM C23 CEL1 -0.15 !\n+ATOM H22 HEL1 0.15 !\n+ATOM H23 HEL1 0.15 !\n+GROUP !\n+ATOM C24 CTL1 -0.09 !\n+ATOM H24 HAL1 0.09 !\n+GROUP !\n+ATOM C25 CTL1 -0.09 !\n+ATOM H25 HAL1 0.09 !\n+GROUP !\n+ATOM C26 CTL3 -0.27 !\n+ATOM H26A HAL3 0.09 !\n+ATOM H26B HAL3 0.09 !\n+ATOM H26C HAL3 0.09 !\n+GROUP !\n+ATOM C27 CTL3 -0.27 !\n+ATOM H27A HAL3 0.09 !\n+ATOM H27B HAL3 0.09 !\n+ATOM H27C HAL3 0.09 !\n+GROUP !\n+ATOM C28 CTL2 -0.18 !\n+ATOM H28A HAL2 0.09 !\n+ATOM H28B HAL2 0.09 !\n+GROUP !\n+ATOM C29 CTL3 -0.27 !\n+ATOM H29A HAL3 0.09 !\n+ATOM H29B HAL3 0.09 !\n+ATOM H29C HAL3 0.09 !\n+\n+BOND C3 O3 C3 H3 O3 H3'\n+BOND C3 C2 C2 H2A C2 H2B\n+BOND C2 C1 C1 H1A C1 H1B\n+BOND C3 C4 C4 H4A C4 H4B\n+BOND C4 C5\n+BOND C5 C10\n+BOND C10 C1\n+BOND C10 C19 C19 H19A C19 H19B C19 H19C\n+DOUBLE C5 C6\n+BOND C6 H6\n+BOND C6 C7 C7 H7A C7 H7B\n+BOND C7 C8 C8 H8\n+BOND C8 C9 C9 H9\n+BOND C9 C10\n+BOND C8 C14 C14 H14\n+BOND C14 C13\n+BOND C13 C12 C12 H12A C12 H12B\n+BOND C12 C11 C11 H11A C11 H11B\n+BOND C11 C9\n+BOND C13 C18 C18 H18A C18 H18B C18 H18C\n+BOND C14 C15 C15 H15A C15 H15B\n+BOND C15 C16 C16 H16A C16 H16B\n+BOND C16 C17 C17 H17\n+BOND C17 C13\n+BOND C17 C20 C20 H20\n+BOND C20 C21 C21 H21A C21 H21B C21 H21C\n+BOND C20 C22 C22 H22\n+DOUBLE C22 C23\n+BOND C23 H23\n+BOND C23 C24 C24 H24 C24 C28\n+BOND C24 C25 C25 H25\n+BOND C25 C26 C26 H26A C26 H26B C26 H26C\n+BOND C25 C27 C27 H27A C27 H27B C27 H27C\n+BOND C28 H28A C28 H28B C28 C29\n+BOND C29 H29A C29 H29B C29 H29C\n+\n+!IC table by CHARMM ic generate\n+! I J K L R(I(J/K)) T(I(JK/KJ)) PHI T(JKL) R(KL) \n+IC C1 C2 C3 C4 1.5374 109.66 53.63 111.70 1.5357\n+IC C4 C2 *C3 O3 1.4600 116.45 124.37 115.09 1.4138\n+IC O3 C2 *C3 H3 1.4138 115.09 111.63 103.06 1.1110\n+IC C2 C3 O3 H3' 1.5011 115.09 12.45 103.88 0.9600\n+IC C2 C3 C4 C5 1.5011 116.45 -48.20 113.63 1.5551\n+IC C5 C3 *C4 H4A 1.5551 113.63 -124.55 114.65 1.1110\n+IC H4A C3 *C4 H4B 1.1110 114.65 -121.73 109.77 1.1110\n+IC C3 C4 C5 C10 1.4600 113.63 47.69 111.85 1.5760\n+IC C10 C4 *C5 C6 1.5760 111.85 -176.22 127.17 1.3458\n+IC C4 C5 C6 C7 1.5551 127.17 -173.81 128.86 1.4452\n+IC C7 C5 *C6 H6 1.4452 128.86 -179.80 115.00 1.1000\n+IC C5 C6 C7 C8 1.3458 128.86 1.75 111.43 1.5827\n+IC C8 C6 *C7 H7A 1.5827 111.43 127.40 111.35 1.1110\n+IC H7A C6 *C7 H7B 1.1110 111.35 117.59 105.43 1.1110\n+IC C6 C7 C8 C14 1.4452 111.43 -157.15 111.37 1.5222\n+IC C14 C7 *C8 C9 1.5222 111.37 126.86 115.77 1.5005\n+IC C9 C7 *C8 H8 1.5005 115.77 116.26 103.10 1.1110\n+IC C7 C8 C14 C13 1.5827 111.37 -174.43 116.65 1.5236\n+IC C13 C8 *C14 C15 1.5236 116.65 133.34 122.31 1.5523\n+IC C13 C8 *C14 H14 1.5236 116.65 -111.52 101.68 1.1110\n+IC C8 C14 C15 C16 1.5222 122.31 -166.78 102.64 1.5553\n+IC C16 C14 *C15 H15A 1.5553 102.64 -122.90 109.69 1.1110\n+IC H15A C14 *C15 H15B 1.1110 109.69 -119.53 111.74 1.1110\n+IC C14 C15 C16 C17 1.5523 102.64 5.54 107.73 1.5892\n+IC C17 C15 *C16 H16A 1.5892 107.73 -125.75 115.88 1.1110\n+IC H16A C15 *C16 H16B 1.1110 115.88 -117.35 103.73 1.1110\n+IC C13 C16 *C17 C20 1.5251 103.03 137.81 115.32 1.4998\n+IC C13 C16 *C17 H17 1.5251 103.03 -106.00 101.80 1.1110\n+IC C17 C14 *C13 C12 1.5251 102.84 118.75 106.60 1.4784\n+IC C12 C14 *C13 C18 1.4784 106.60 125.19 108.76 1.5467\n+IC C14 C13 C18 H18A 1.5236 108.76 -168.94 111.63 1.1110\n+IC H18A C13 *C18 H18B 1.1110 111.63 -119.95 115.77 1.1110\n+IC H18A C13 *C18 H18C 1.1110 111.63 118.51 113.11 1.1110\n+IC C14 C13 C12 C11 1.5236 106.60 56.04 113.05 1.5836\n+IC C11 C13 *C12 H12A 1.5836 113.05 -121.48 105.21 1.1110\n+IC H12A C13 *C12 H12B 1.1110 105.21 -122.79 112.66 1.1110\n+IC C9 C12 *C11 H11A 1.5522 111.03 -120.32 104.78 1.1110\n+IC H11A C12 *C11 H11B 1.1110 104.78 -114.59 109.24 1.1110\n+IC C10 C8 *C9 H9 1.5345 116.11 -111.52 94.43 1.1110\n+IC C9 C5 *C10 C19 1.5345 111.76 -117.35 111.31 1.5484\n+IC C19 C5 *C10 C1 1.5484 111.31 -124.33 109.05 1.5749\n+IC C5 C10 C19 H19A 1.5760 111.31 -161.99 108.74 1.1110\n+IC H19A C10 *C19 H19B 1.1110 108.74 -131.18 115.95 1.1110\n+IC H19A C10 *C19 H19C 1.1110 108.74 113.77 105.26 1.1110\n+IC C2 C10 *C1 H1A 1.5252 110.50 -118.40 108.36 1.1110\n+IC C2 C10 *C1 H1B 1.5252 110.50 119.03 105.91 1.1110\n+IC C1 C3 *C2 H2A 1.5252 111.08 -117.58 111.07 1.1110\n+IC H2A C3 *C2 H2B 1.1110 111.07 -118.37 108.64 1.1110\n+IC C16 C17 C20 C22 1.5892 115.32 28.71 113.92 1.4966\n+IC C22 C17 *C20 C21 1.4966 113.92 126.49 112.68 1.4791\n+IC C21 C17 *C20 H20 1.4791 112.68 123.18 109.73 1.1110\n+IC C17 C20 C21 H21A 1.4998 112.68 -168.75 107.07 1.1110\n+IC H21A C20 *C21 H21B 1.1110 107.07 124.22 115.92 1.1110\n+IC H21A C20 *C21 H21C 1.1110 107.07 -113.90 111.07 1.1110\n+IC C17 C20 C22 C23 1.4998 113.92 -111.53 123.11 1.3675\n+IC C23 C20 *C22 H22 1.3675 123.11 169.63 115.56 1.1000\n+IC C20 C22 C23 C24 1.4966 123.11 165.09 127.56 1.5687\n+IC C24 C22 *C23 H23 1.5687 127.56 -171.50 119.49 1.1000\n+IC C22 C23 C24 C25 1.3675 127.56 -109.85 110.86 1.4914\n+IC C25 C23 *C24 C28 1.4914 110.86 -116.70 112.32 1.5935\n+IC C28 C23 *C24 H24 1.5935 112.32 -120.62 111.47 1.1110\n+IC C23 C24 C25 C26 1.5687 110.86 -43.82 113.65 1.5159\n+IC C26 C24 *C25 C27 1.5159 113.65 127.06 109.33 1.5890\n+IC C26 C24 *C25 H25 1.5159 113.65 -120.79 103.04 1.1110\n+IC C24 C25 C26 H26A 1.4914 113.65 -173.69 108.07 1.1110\n+IC H26A C25 *C26 H26B 1.1110 108.07 -121.53 112.72 1.1110\n+IC H26A C25 *C26 H26C 1.1110 108.07 111.96 112.42 1.1110\n+IC C24 C25 C27 H27A 1.4914 109.33 -75.83 116.02 1.1110\n+IC H27A C25 *C27 H27B 1.1110 116.02 -127.41 112.98 1.1110\n+IC H27A C25 *C27 H27C 1.1110 116.02 125.01 102.34 1.1110\n+IC C23 C24 C28 C29 1.5687 112.32 -64.65 114.58 1.5403\n+IC C29 C24 *C28 H28A 1.5403 114.58 -111.09 99.41 1.1110\n+IC H28A C24 *C28 H28B 1.1110 99.41 -111.25 120.66 1.1110\n+IC C24 C28 C29 H29A 1.5935 114.58 -171.60 114.68 1.1110\n+IC H29A C28 *C29 H29B 1.1110 114.68 -118.84 111.22 1.1110\n+IC H29A C28 *C29 H29C 1.1110 114.68 124.20 111.33 1.1110\n+\n+\n+RESI CHSD -1.00 ! Cholesteryl HemiSuccinate (deprotonated) Y01\n+! based on CHL1 / LAU / LPPC\n+GROUP\n+ATOM C3 CRL1 0.17! LPPC\n+ATOM H3 HGA1 0.09! LPPC\n+ATOM O3 OSL -0.49! LPPC\n+ATOM C4' CL 0.90! LPPC\n+ATOM O2' OBL -0.63! LPPC\n+ATOM C5' CTL2 -0.22! LPPC\n+ATOM H5A' HAL2 0.09! LPPC\n+ATOM H5B' HAL2 0.09! LPPC\n+GROUP\n+ATOM O3' OCL -0.76! LAU\n+ATOM O4' OCL -0.76! LAU\n+ATOM C7' CL 0.62! LAU\n+ATOM C6' CTL2 -0.28! LAU\n+ATOM H6A' HAL2 0.09! LAU\n+ATOM H6B' HAL2 0.09! LAU\n+GROUP\n+ATOM C4 CRL2 -0.18\n+ATOM H4A HGA2 0.09\n+ATOM H4B HGA2 0.09\n+GROUP\n+ATOM C5 CEL1 0.00\n+ATOM C6 CEL1 -0.15\n+ATOM H6 HEL1 0.15\n+GROUP\n+ATOM C7 CRL2 -0.18\n+ATOM H7A HGA2 0.09\n+ATOM H7B HGA2 0.09\n+GROUP\n+ATOM C8 CRL1 -0.09\n+ATOM H8 HGA1 0.09\n+GROUP\n+ATOM C14 CRL1 -0.09\n+ATOM H14 HGA1 0.09\n+GROUP\n+ATOM C15 CRL2 -0.18\n+ATOM H15A HGA2 0.09\n+ATOM H15B HGA2 0.09\n+GROUP\n+ATOM C16 CRL2 -0.18\n+ATOM H16A HGA2 0.09\n+ATOM H16B HGA2 0.09\n+GROUP\n+ATOM C17 CRL1 -0.09\n+ATOM H17 HGA1 0.09\n+GROUP\n+ATOM C13 CRL1 0.00\n+GROUP\n+ATOM C18 CTL3 -0.27 !methyl at c13\n+ATOM H18A HAL3 0.09\n+ATOM H18B HAL3 0.09\n+ATOM H18C HAL3 0.09\n+GROUP\n+ATOM C12 CRL2 -0.18\n+ATOM H12A HGA2 0.09\n+ATOM H12B HGA2 0.09\n+GROUP\n+ATOM C11 CRL2 -0.18\n+ATOM H11A HGA2 0.09\n+ATOM H11B HGA2 0.09\n+GROUP\n+ATOM C9 CRL1 -0.09\n+ATOM H9 HGA1 0.09\n+GROUP\n+ATOM C10 CRL1 0.00\n+GROUP\n+ATOM C19 CTL3 -0.27 !methyl at c10\n+ATOM H19A HAL3 0.09\n+ATOM H19B HAL3 0.09\n+ATOM H19C HAL3 0.09\n+GROUP\n+ATOM C1 CRL2 -0.18\n+ATOM H1A HGA2 0.09\n+ATOM H1B HGA2 0.09\n+GROUP\n+ATOM C2 CRL2 -0.18\n+ATOM H2A HGA2 0.09\n+ATOM H2B HGA2 0.09\n+GROUP\n+ATOM C20 CTL1 -0.09\n+ATOM H20 HAL1 0.09\n+GROUP\n+ATOM C21 CTL3 -0.27\n+ATOM H21A HAL3 0.09\n+ATOM H21B HAL3 0.09\n+ATOM H21C HAL3 0.09\n+GROUP\n+ATOM C22 CTL2 -0.18\n+ATOM H22A HAL2 0.09\n+ATOM H22B HAL2 0.09\n+GROUP\n+ATOM C23 CTL2 -0.18\n+ATOM H23A HAL2 0.09\n+ATOM H23B HAL2 0.09\n+GROUP\n+ATOM C24 CTL2 -0.18 !beyond this nomenclature may not be correct\n+ATOM H24A HAL2 0.09\n+ATOM H24B HAL2 0.09\n+GROUP\n+ATOM C25 CTL1 -0.09 !c25\n+ATOM H25 HAL1 0.09\n+GROUP\n+ATOM C26 CTL3 -0.27 !terminal methyl, c26\n+ATOM H26A HAL3 0.09\n+ATOM H26B HAL3 0.09\n+ATOM H26C HAL3 0.09\n+GROUP\n+ATOM C27 CTL3 -0.27 !terminal methyl, c27\n+ATOM H27A HAL3 0.09\n+ATOM H27B HAL3 0.09\n+ATOM H27C HAL3 0.09\n+\n+BOND C3 O3 C3 H3 O3 C4'\n+BOND C4' O2' C4' C5' C5' H5A'\n+BOND C5' H5B' C5' C6'\n+BOND C6' H6A' C6' H6B' C6' C7'\n+BOND C7' O3'\n+DOUBLE C7' O4'\n+BOND C3 C2 C2 H2A C2 H2B\n+BOND C2 C1 C1 H1A C1 H1B\n+BOND C3 C4 C4 H4A C4 H4B\n+BOND C4 C5\n+BOND C5 C10\n+BOND C10 C1\n+BOND C10 C19 C19 H19A C19 H19B C19 H19C\n+DOUBLE C5 C6\n+BOND C6 H6\n+BOND C6 C7 C7 H7A C7 H7B\n+BOND C7 C8 C8 H8\n+BOND C8 C9 C9 H9\n+BOND C9 C10\n+BOND C8 C14 C14 H14\n+BOND C14 C13\n+BOND C13 C12 C12 H12A C12 H12B\n+BOND C12 C11 C11 H11A C11 H11B\n+BOND C11 C9\n+BOND C13 C18 C18 H18A C18 H18B C18 H18C\n+BOND C14 C15 C15 H15A C15 H15B\n+BOND C15 C16 C16 H16A C16 H16B\n+BOND C16 C17 C17 H17\n+BOND C17 C13\n+BOND C17 C20 C20 H20\n+BOND C20 C21 C21 H21A C21 H21B C21 H21C\n+BOND C20 C22 C22 H22A C22 H22B\n+BOND C22 C23 C23 H23A C23 H23B\n+BOND C23 C24 C24 H24A C24 H24B\n+BOND C24 C25 C25 H25\n+BOND C25 C26 C26 H26A C26 H26B C26 H26C\n+BOND C25 C27 C27 H27A C27 H27B C27 H27C\n+\n+!ICs based on CHARMM optimized structure\n+\n+IC C6' O3' *C7' O4' 1.5288 108.67 -179.80 126.24 1.2203\n+IC O3' C7' C6' C5' 1.3189 108.67 -167.94 112.47 1.5443\n+IC C5' C7' *C6' H6A' 1.5443 112.47 -121.71 107.41 1.1092\n+IC H6A' C7' *C6' H6B' 1.1092 107.41 -116.85 107.91 1.1098\n+IC C7' C6' C5' C4' 1.5288 112.47 179.46 112.33 1.5340\n+IC C3 O3 C4' C5' 1.4362 114.22 -174.70 108.67 1.5288\n+IC C5' O3 *C4' O2' 1.5288 108.67 -179.80 126.24 1.2203\n+IC O3 C4' C5' C6' 1.3189 108.67 -167.94 112.47 1.5443\n+IC C6' C4' *C5' H5A' 1.5443 112.47 -121.71 107.41 1.1092\n+IC H5A' C4' *C5' H5B' 1.1092 107.41 -116.85 107.91 1.1098\n+IC C2 C3 O3 C4' 1.5380 109.70 -60.00 109.60 1.3340\n+IC C1 C2 C3 C4 1.5383 110.44 55.92 110.66 1.5367\n+IC C4 C2 *C3 O3 1.5367 110.66 120.28 109.14 1.4158\n+IC O3 C2 *C3 H3 1.4158 109.14 118.92 109.40 1.1155\n+IC C2 C3 C4 C5 1.5311 110.66 -55.96 111.70 1.5156\n+IC C5 C3 *C4 H4A 1.5156 111.70 121.99 109.16 1.1099\n+IC H4A C3 *C4 H4B 1.1099 109.16 115.03 107.34 1.1142\n+IC C3 C4 C5 C10 1.5367 111.70 54.04 115.09 1.5304\n+IC C10 C4 *C5 C6 1.5304 115.09 -177.32 121.28 1.3432\n+IC C4 C5 C6 C7 1.5156 121.28 -178.39 123.88 1.5018\n+IC C7 C5 *C6 H6 1.5018 123.88 177.19 119.54 1.1001\n+IC C5 C6 C7 C8 1.3432 123.88 14.50 112.36 1.5506\n+IC C8 C6 *C7 H7A 1.5506 112.36 122.18 110.84 1.1114\n+IC H7A C6 *C7 H7B 1.1114 110.84 118.17 109.17 1.1124\n+IC C6 C7 C8 C14 1.5018 112.36 -165.89 110.02 1.5202\n+IC C14 C7 *C8 C9 1.5202 110.02 121.07 110.84 1.5327\n+IC C9 C7 *C8 H8 1.5327 110.84 119.34 108.18 1.1123\n+IC C7 C8 C14 C13 1.5506 110.02 179.73 115.21 1.5247\n+IC C13 C8 *C14 C15 1.5247 115.21 126.69 117.86 1.5382\n+IC C13 C8 *C14 H14 1.5247 115.21 -116.05 105.83 1.1205\n+IC C8 C14 C15 C16 1.5202 117.86 -163.10 103.40 1.5360\n+IC C16 C14 *C15 H15A 1.5360 103.40 117.45 109.62 1.1113\n+IC H15A C14 *C15 H15B 1.1113 109.62 121.32 111.94 1.1082\n+IC C14 C15 C16 C17 1.5382 103.40 7.85 106.79 1.5620\n+IC C17 C15 *C16 H16A 1.5620 106.79 118.96 109.25 1.1107\n+IC H16A C15 *C16 H16B 1.1107 109.25 120.76 111.65 1.1090\n+IC C13 C16 *C17 C20 1.5401 104.94 132.02 112.36 1.5633\n+IC C13 C16 *C17 H17 1.5401 104.94 -111.76 106.42 1.1153\n+IC C17 C14 *C13 C12 1.5401 100.27 122.68 106.98 1.5408\n+IC C12 C14 *C13 C18 1.5408 106.98 122.91 110.83 1.5518\n+IC C14 C13 C18 H18A 1.5247 110.83 60.33 111.48 1.1077\n+IC H18A C13 *C18 H18B 1.1077 111.48 119.80 110.01 1.1086\n+IC H18A C13 *C18 H18C 1.1077 111.48 -121.00 111.71 1.1067\n+IC C14 C13 C12 C11 1.5247 106.98 56.78 111.10 1.5422\n+IC C11 C13 *C12 H12A 1.5422 111.10 121.37 111.21 1.1067\n+IC H12A C13 *C12 H12B 1.1067 111.21 118.82 108.68 1.1119\n+IC C9 C12 *C11 H11A 1.5593 113.54 121.67 107.06 1.1093\n+IC H11A C12 *C11 H11B 1.1093 107.06 115.98 108.75 1.1100\n+IC C10 C8 *C9 H9 1.5531 112.73 -114.54 104.68 1.1185\n+IC C9 C5 *C10 C19 1.5531 111.91 -120.04 108.03 1.5524\n+IC C19 C5 *C10 C1 1.5524 108.03 -119.87 109.26 1.5579\n+IC C5 C10 C19 H19A 1.5304 108.03 -172.88 110.67 1.1082\n+IC H19A C10 *C19 H19B 1.1082 110.67 118.48 111.77 1.1080\n+IC H19A C10 *C19 H19C 1.1082 110.67 -120.66 110.97 1.1095\n+IC C2 C10 *C1 H1A 1.5383 114.55 122.42 109.26 1.1104\n+IC C2 C10 *C1 H1B 1.5383 114.55 -120.71 108.29 1.1134\n+IC C1 C3 *C2 H2A 1.5383 110.44 121.16 109.41 1.1119\n+IC H2A C3 *C2 H2B 1.1119 109.41 118.30 109.70 1.1112\n+IC C16 C17 C20 C22 1.5620 112.36 55.21 110.55 1.5476\n+IC C22 C17 *C20 C21 1.5476 110.55 125.88 113.32 1.5349\n+IC C21 C17 *C20 H20 1.5349 113.32 118.87 107.27 1.1157\n+IC C17 C20 C21 H21A 1.5633 113.32 64.90 110.93 1.1077\n+IC H21A C20 *C21 H21B 1.1077 110.93 -121.00 110.41 1.1104\n+IC H21A C20 *C21 H21C 1.1077 110.93 118.40 111.29 1.1085\n+IC C17 C20 C22 C23 1.5633 110.55 -174.59 115.12 1.5394\n+IC C23 C20 *C22 H22A 1.5394 115.12 120.23 109.35 1.1116\n+IC H22A C20 *C22 H22B 1.1116 109.35 117.13 108.75 1.1121\n+IC C20 C22 C23 C24 1.5476 115.12 172.50 112.25 1.5377\n+IC C24 C22 *C23 H23A 1.5377 112.25 121.13 109.69 1.1108\n+IC H23A C22 *C23 H23B 1.1108 109.69 118.14 108.99 1.1129\n+IC C22 C23 C24 C25 1.5394 112.25 -176.23 114.06 1.5418\n+IC C25 C23 *C24 H24A 1.5418 114.06 120.56 108.44 1.1132\n+IC H24A C23 *C24 H24B 1.1132 108.44 117.11 109.39 1.1121\n+IC C23 C24 C25 C26 1.5377 114.06 174.26 111.24 1.5378\n+IC C26 C24 *C25 C27 1.5378 111.24 119.63 112.86 1.5381\n+IC C26 C24 *C25 H25 1.5378 111.24 -119.50 108.47 1.1151\n+IC C24 C25 C26 H26A 1.5418 111.24 -178.53 110.52 1.1105\n+IC H26A C25 *C26 H26B 1.1105 110.52 120.00 110.36 1.1105\n+IC H26A C25 *C26 H26C 1.1105 110.52 -120.09 110.33 1.1106\n+IC C24 C25 C27 H27A 1.5418 112.86 -178.28 110.40 1.1105\n+IC H27A C25 *C27 H27B 1.1105 110.40 119.95 110.31 1.1105\n+IC H27A C25 *C27 H27C 1.1105 110.40 -119.82 110.77 1.1097\n+\n+\n+RESI CHSP 0.00 ! Cholesteryl HemiSuccinate (protonated) Y01\n+! based on CHL1 / LAUP / LPPC\n+GROUP\n+ATOM C3 CRL1 0.17! LPPC\n+ATOM H3 HGA1 0.09! LPPC\n+ATOM O3 OSL -0.49! LPPC\n+ATOM C4' CL 0.90! LPPC\n+ATOM O2' OBL -0.63! LPPC\n+ATOM C5' CTL2 -0.22! LPPC\n+ATOM H5A' HAL2 0.09! LPPC\n+ATOM H5B' HAL2 0.09! LPPC\n+GROUP\n+ATOM H31' HOL 0.44! LAUP\n+ATOM O3' OHL -0.61! LAUP\n+ATOM O4' OBL -0.55! LAUP\n+ATOM C7' CL 0.75! LAUP\n+ATOM C6' CTL2 -0.21! LAUP\n+ATOM H6A' HAL2 0.09! LAUP\n+ATOM H6B' HAL2 0.09! LAUP\n+GROUP\n+ATOM C4 CRL2 -0.18\n+ATOM H4A HGA2 0.09\n+ATOM H4B HGA2 0.09\n+GROUP\n+ATOM C5 CEL1 0.00\n+ATOM C6 CEL1 -0.15\n+ATOM H6 HEL1 0.15\n+GROUP\n+ATOM C7 CRL2 -0.18\n+ATOM H7A HGA2 0.09\n+ATOM H7B HGA2 0.09\n+GROUP\n+ATOM C8 CRL1 -0.09\n+ATOM H8 HGA1 0.09\n+GROUP\n+ATOM C14 CRL1 -0.09\n+ATOM H14 HGA1 0.09\n+GROUP\n+ATOM C15 CRL2 -0.18\n+ATOM H15A HGA2 0.09\n+ATOM H15B HGA2 0.09\n+GROUP\n+ATOM C16 CRL2 -0.18\n+ATOM H16A HGA2 0.09\n+ATOM H16B HGA2 0.09\n+GROUP\n+ATOM C17 CRL1 -0.09\n+ATOM H17 HGA1 0.09\n+GROUP\n+ATOM C13 CRL1 0.00\n+GROUP\n+ATOM C18 CTL3 -0.27 !methyl at c13\n+ATOM H18A HAL3 0.09\n+ATOM H18B HAL3 0.09\n+ATOM H18C HAL3 0.09\n+GROUP\n+ATOM C12 CRL2 -0.18\n+ATOM H12A HGA2 0.09\n+ATOM H12B HGA2 0.09\n+GROUP\n+ATOM C11 CRL2 -0.18\n+ATOM H11A HGA2 0.09\n+ATOM H11B HGA2 0.09\n+GROUP\n+ATOM C9 CRL1 -0.09\n+ATOM H9 HGA1 0.09\n+GROUP\n+ATOM C10 CRL1 0.00\n+GROUP\n+ATOM C19 CTL3 -0.27 !methyl at c10\n+ATOM H19A HAL3 0.09\n+ATOM H19B HAL3 0.09\n+ATOM H19C HAL3 0.09\n+GROUP\n+ATOM C1 CRL2 -0.18\n+ATOM H1A HGA2 0.09\n+ATOM H1B HGA2 0.09\n+GROUP\n+ATOM C2 CRL2 -0.18\n+ATOM H2A HGA2 0.09\n+ATOM H2B HGA2 0.09\n+GROUP\n+ATOM C20 CTL1 -0.09\n+ATOM H20 HAL1 0.09\n+GROUP\n+ATOM C21 CTL3 -0.27\n+ATOM H21A HAL3 0.09\n+ATOM H21B HAL3 0.09\n+ATOM H21C HAL3 0.09\n+GROUP\n+ATOM C22 CTL2 -0.18\n+ATOM H22A HAL2 0.09\n+ATOM H22B HAL2 0.09\n+GROUP\n+ATOM C23 CTL2 -0.18\n+ATOM H23A HAL2 0.09\n+ATOM H23B HAL2 0.09\n+GROUP\n+ATOM C24 CTL2 -0.18 !beyond this nomenclature may not be correct\n+ATOM H24A HAL2 0.09\n+ATOM H24B HAL2 0.09\n+GROUP\n+ATOM C25 CTL1 -0.09 !c25\n+ATOM H25 HAL1 0.09\n+GROUP\n+ATOM C26 CTL3 -0.27 !terminal methyl, c26\n+ATOM H26A HAL3 0.09\n+ATOM H26B HAL3 0.09\n+ATOM H26C HAL3 0.09\n+GROUP\n+ATOM C27 CTL3 -0.27 !terminal methyl, c27\n+ATOM H27A HAL3 0.09\n+ATOM H27B HAL3 0.09\n+ATOM H27C HAL3 0.09\n+\n+BOND C3 O3 C3 H3 O3 C4'\n+BOND C4' O2' C4' C5' C5' H5A'\n+BOND C5' H5B' C5' C6'\n+BOND C6' H6A' C6' H6B' C6' C7'\n+BOND C7' O3' O3' H31'\n+DOUBLE C7' O4'\n+\n+BOND C3 C2 C2 H2A C2 H2B\n+BOND C2 C1 C1 H1A C1 H1B\n+BOND C3 C4 C4 H4A C4 H4B\n+BOND C4 C5\n+BOND C5 C10\n+BOND C10 C1\n+BOND C10 C19 C19 H19A C19 H19B C19 H19C\n+DOUBLE C5 C6\n+BOND C6 H6\n+BOND C6 C7 C7 H7A C7 H7B\n+BOND C7 C8 C8 H8\n+BOND C8 C9 C9 H9\n+BOND C9 C10\n+BOND C8 C14 C14 H14\n+BOND C14 C13\n+BOND C13 C12 C12 H12A C12 H12B\n+BOND C12 C11 C11 H11A C11 H11B\n+BOND C11 C9\n+BOND C13 C18 C18 H18A C18 H18B C18 H18C\n+BOND C14 C15 C15 H15A C15 H15B\n+BOND C15 C16 C16 H16A C16 H16B\n+BOND C16 C17 C17 H17\n+BOND C17 C13\n+BOND C17 C20 C20 H20\n+BOND C20 C21 C21 H21A C21 H21B C21 H21C\n+BOND C20 C22 C22 H22A C22 H22B\n+BOND C22 C23 C23 H23A C23 H23B\n+BOND C23 C24 C24 H24A C24 H24B\n+BOND C24 C25 C25 H25\n+BOND C25 C26 C26 H26A C26 H26B C26 H26C\n+BOND C25 C27 C27 H27A C27 H27B C27 H27C\n+\n+!ICs based on CHARMM optimized structure\n+\n+IC H31' O3' C7' C6' 0.9561 107.32 175.23 112.43 1.5243\n+IC C6' O3' *C7' O4' 1.5288 108.67 -179.80 126.24 1.2203\n+IC O3' C7' C6' C5' 1.3189 108.67 -167.94 112.47 1.5443\n+IC C5' C7' *C6' H6A' 1.5443 112.47 -121.71 107.41 1.1092\n+IC H6A' C7' *C6' H6B' 1.1092 107.41 -116.85 107.91 1.1098\n+IC C7' C6' C5' C4' 1.5288 112.47 179.46 112.33 1.5340\n+IC C3 O3 C4' C5' 1.4362 114.22 -174.70 108.67 1.5288\n+IC C5' O3 *C4' O2' 1.5288 108.67 -179.80 126.24 1.2203\n+IC O3 C4' C5' C6' 1.3189 108.67 -167.94 112.47 1.5443\n+IC C6' C4' *C5' H5A' 1.5443 112.47 -121.71 107.41 1.1092\n+IC H5A' C4' *C5' H5B' 1.1092 107.41 -116.85 107.91 1.1098\n+IC C2 C3 O3 C4' 1.5380 109.70 -60.00 109.60 1.3340\n+IC C1 C2 C3 C4 1.5383 110.44 55.92 110.66 1.5367\n+IC C4 C2 *C3 O3 1.5367 110.66 120.28 109.14 1.4158\n+IC O3 C2 *C3 H3 1.4158 109.14 118.92 109.40 1.1155\n+IC C2 C3 C4 C5 1.5311 110.66 -55.96 111.70 1.5156\n+IC C5 C3 *C4 H4A 1.5156 111.70 121.99 109.16 1.1099\n+IC H4A C3 *C4 H4B 1.1099 109.16 115.03 107.34 1.1142\n+IC C3 C4 C5 C10 1.5367 111.70 54.04 115.09 1.5304\n+IC C10 C4 *C5 C6 1.5304 115.09 -177.32 121.28 1.3432\n+IC C4 C5 C6 C7 1.5156 121.28 -178.39 123.88 1.5018\n+IC C7 C5 *C6 H6 1.5018 123.88 177.19 119.54 1.1001\n+IC C5 C6 C7 C8 1.3432 123.88 14.50 112.36 1.5506\n+IC C8 C6 *C7 H7A 1.5506 112.36 122.18 110.84 1.1114\n+IC H7A C6 *C7 H7B 1.1114 110.84 118.17 109.17 1.1124\n+IC C6 C7 C8 C14 1.5018 112.36 -165.89 110.02 1.5202\n+IC C14 C7 *C8 C9 1.5202 110.02 121.07 110.84 1.5327\n+IC C9 C7 *C8 H8 1.5327 110.84 119.34 108.18 1.1123\n+IC C7 C8 C14 C13 1.5506 110.02 179.73 115.21 1.5247\n+IC C13 C8 *C14 C15 1.5247 115.21 126.69 117.86 1.5382\n+IC C13 C8 *C14 H14 1.5247 115.21 -116.05 105.83 1.1205\n+IC C8 C14 C15 C16 1.5202 117.86 -163.10 103.40 1.5360\n+IC C16 C14 *C15 H15A 1.5360 103.40 117.45 109.62 1.1113\n+IC H15A C14 *C15 H15B 1.1113 109.62 121.32 111.94 1.1082\n+IC C14 C15 C16 C17 1.5382 103.40 7.85 106.79 1.5620\n+IC C17 C15 *C16 H16A 1.5620 106.79 118.96 109.25 1.1107\n+IC H16A C15 *C16 H16B 1.1107 109.25 120.76 111.65 1.1090\n+IC C13 C16 *C17 C20 1.5401 104.94 132.02 112.36 1.5633\n+IC C13 C16 *C17 H17 1.5401 104.94 -111.76 106.42 1.1153\n+IC C17 C14 *C13 C12 1.5401 100.27 122.68 106.98 1.5408\n+IC C12 C14 *C13 C18 1.5408 106.98 122.91 110.83 1.5518\n+IC C14 C13 C18 H18A 1.5247 110.83 60.33 111.48 1.1077\n+IC H18A C13 *C18 H18B 1.1077 111.48 119.80 110.01 1.1086\n+IC H18A C13 *C18 H18C 1.1077 111.48 -121.00 111.71 1.1067\n+IC C14 C13 C12 C11 1.5247 106.98 56.78 111.10 1.5422\n+IC C11 C13 *C12 H12A 1.5422 111.10 121.37 111.21 1.1067\n+IC H12A C13 *C12 H12B 1.1067 111.21 118.82 108.68 1.1119\n+IC C9 C12 *C11 H11A 1.5593 113.54 121.67 107.06 1.1093\n+IC H11A C12 *C11 H11B 1.1093 107.06 115.98 108.75 1.1100\n+IC C10 C8 *C9 H9 1.5531 112.73 -114.54 104.68 1.1185\n+IC C9 C5 *C10 C19 1.5531 111.91 -120.04 108.03 1.5524\n+IC C19 C5 *C10 C1 1.5524 108.03 -119.87 109.26 1.5579\n+IC C5 C10 C19 H19A 1.5304 108.03 -172.88 110.67 1.1082\n+IC H19A C10 *C19 H19B 1.1082 110.67 118.48 111.77 1.1080\n+IC H19A C10 *C19 H19C 1.1082 110.67 -120.66 110.97 1.1095\n+IC C2 C10 *C1 H1A 1.5383 114.55 122.42 109.26 1.1104\n+IC C2 C10 *C1 H1B 1.5383 114.55 -120.71 108.29 1.1134\n+IC C1 C3 *C2 H2A 1.5383 110.44 121.16 109.41 1.1119\n+IC H2A C3 *C2 H2B 1.1119 109.41 118.30 109.70 1.1112\n+IC C16 C17 C20 C22 1.5620 112.36 55.21 110.55 1.5476\n+IC C22 C17 *C20 C21 1.5476 110.55 125.88 113.32 1.5349\n+IC C21 C17 *C20 H20 1.5349 113.32 118.87 107.27 1.1157\n+IC C17 C20 C21 H21A 1.5633 113.32 64.90 110.93 1.1077\n+IC H21A C20 *C21 H21B 1.1077 110.93 -121.00 110.41 1.1104\n+IC H21A C20 *C21 H21C 1.1077 110.93 118.40 111.29 1.1085\n+IC C17 C20 C22 C23 1.5633 110.55 -174.59 115.12 1.5394\n+IC C23 C20 *C22 H22A 1.5394 115.12 120.23 109.35 1.1116\n+IC H22A C20 *C22 H22B 1.1116 109.35 117.13 108.75 1.1121\n+IC C20 C22 C23 C24 1.5476 115.12 172.50 112.25 1.5377\n+IC C24 C22 *C23 H23A 1.5377 112.25 121.13 109.69 1.1108\n+IC H23A C22 *C23 H23B 1.1108 109.69 118.14 108.99 1.1129\n+IC C22 C23 C24 C25 1.5394 112.25 -176.23 114.06 1.5418\n+IC C25 C23 *C24 H24A 1.5418 114.06 120.56 108.44 1.1132\n+IC H24A C23 *C24 H24B 1.1132 108.44 117.11 109.39 1.1121\n+IC C23 C24 C25 C26 1.5377 114.06 174.26 111.24 1.5378\n+IC C26 C24 *C25 C27 1.5378 111.24 119.63 112.86 1.5381\n+IC C26 C24 *C25 H25 1.5378 111.24 -119.50 108.47 1.1151\n+IC C24 C25 C26 H26A 1.5418 111.24 -178.53 110.52 1.1105\n+IC H26A C25 *C26 H26B 1.1105 110.52 120.00 110.36 1.1105\n+IC H26A C25 *C26 H26C 1.1105 110.52 -120.09 110.33 1.1106\n+IC C24 C25 C27 H27A 1.5418 112.86 -178.28 110.40 1.1105\n+IC H27A C25 *C27 H27B 1.1105 110.40 119.95 110.31 1.1105\n+IC H27A C25 *C27 H27C 1.1105 110.40 -119.82 110.77 1.1097\n+\n+RESI LANO 0.00 ! Lanosterol\n+GROUP\n+ATOM C3 CRL1 0.14\n+ATOM H3 HGA1 0.09\n+ATOM O3 OHL -0.66\n+ATOM H3' HOL 0.43\n+GROUP\n+ATOM C4 CRL1 0.00\n+GROUP\n+ATOM C29 CTL3 -0.27 !methyl at c4\n+ATOM H29A HAL3 0.09\n+ATOM H29B HAL3 0.09\n+ATOM H29C HAL3 0.09\n+GROUP\n+ATOM C30 CTL3 -0.27 !methyl at c4\n+ATOM H30A HAL3 0.09\n+ATOM H30B HAL3 0.09\n+ATOM H30C HAL3 0.09\n+GROUP\n+ATOM C5 CRL1 -0.09\n+ATOM H5 HGA1 0.09\n+GROUP\n+ATOM C6 CRL2 -0.18\n+ATOM H6A HGA2 0.09\n+ATOM H6B HGA2 0.09\n+GROUP\n+ATOM C7 CRL2 -0.18\n+ATOM H7A HGA2 0.09\n+ATOM H7B HGA2 0.09\n+GROUP\n+ATOM C8 CEL1 0.00\n+ATOM C9 CEL1 0.00\n+GROUP\n+ATOM C14 CRL1 0.00\n+GROUP\n+ATOM C28 CTL3 -0.27 !methyl at c14\n+ATOM H28A HAL3 0.09\n+ATOM H28B HAL3 0.09\n+ATOM H28C HAL3 0.09\n+GROUP\n+ATOM C15 CRL2 -0.18\n+ATOM H15A HGA2 0.09\n+ATOM H15B HGA2 0.09\n+GROUP\n+ATOM C16 CRL2 -0.18\n+ATOM H16A HGA2 0.09\n+ATOM H16B HGA2 0.09\n+GROUP\n+ATOM C17 CRL1 -0.09\n+ATOM H17 HGA1 0.09\n+GROUP\n+ATOM C13 CRL1 0.00\n+GROUP\n+ATOM C18 CTL3 -0.27 !methyl at c13\n+ATOM H18A HAL3 0.09\n+ATOM H18B HAL3 0.09\n+ATOM H18C HAL3 0.09\n+GROUP\n+ATOM C12 CRL2 -0.18\n+ATOM H12A HGA2 0.09\n+ATOM H12B HGA2 0.09\n+GROUP\n+ATOM C11 CRL2 -0.18\n+ATOM H11A HGA2 0.09\n+ATOM H11B HGA2 0.09\n+GROUP\n+ATOM C10 CRL1 0.00\n+GROUP\n+ATOM C19 CTL3 -0.27 !methyl at c10\n+ATOM H19A HAL3 0.09\n+ATOM H19B HAL3 0.09\n+ATOM H19C HAL3 0.09\n+GROUP\n+ATOM C1 CRL2 -0.18\n+ATOM H1A HGA2 0.09\n+ATOM H1B HGA2 0.09\n+GROUP\n+ATOM C2 CRL2 -0.18\n+ATOM H2A HGA2 0.09\n+ATOM H2B HGA2 0.09\n+GROUP\n+ATOM C20 CTL1 -0.09\n+ATOM H20 HAL1 0.09\n+GROUP\n+ATOM C21 CTL3 -0.27\n+ATOM H21A HAL3 0.09\n+ATOM H21B HAL3 0.09\n+ATOM H21C HAL3 0.09\n+GROUP\n+ATOM C22 CTL2 -0.18\n+ATOM H22A HAL2 0.09\n+ATOM H22B HAL2 0.09\n+GROUP\n+ATOM C23 CTL2 -0.18\n+ATOM H23A HAL2 0.09\n+ATOM H23B HAL2 0.09\n+GROUP\n+ATOM C24 CEL1 -0.15 !\n+ATOM H24 HEL1 0.15\n+ATOM C25 CEL1 0.00 !\n+GROUP\n+ATOM C26 CTL3 -0.27 !terminal methyl, c26\n+ATOM H26A HAL3 0.09\n+ATOM H26B HAL3 0.09\n+ATOM H26C HAL3 0.09\n+GROUP\n+ATOM C27 CTL3 -0.27 !terminal methyl, c27\n+ATOM H27A HAL3 0.09\n+ATOM H27B HAL3 0.09\n+ATOM H27C HAL3 0.09\n+\n+BOND C3 O3 C3 H3 O3 H3'\n+BOND C3 C2 C2 H2A C2 H2B\n+BOND C2 C1 C1 H1A C1 H1B\n+BOND C3 C4 C4 C29 C4 C30\n+BOND C29 H29A C29 H29B C29 H29C\n+BOND C30 H30A C30 H30B C30 H30C\n+\n+BOND C4 C5 C5 H5\n+BOND C5 C10\n+BOND C10 C1\n+BOND C10 C19 C19 H19A C19 H19B C19 H19C\n+DOUBLE C5 C6\n+BOND C6 H6A C6 H6B\n+BOND C6 C7 C7 H7A C7 H7B\n+BOND C7 C8\n+BOND C8 C9\n+BOND C9 C10\n+BOND C8 C14 C14 C28\n+BOND C28 H28A C28 H28B C28 H28C\n+BOND C14 C13\n+BOND C13 C12 C12 H12A C12 H12B\n+BOND C12 C11 C11 H11A C11 H11B\n+BOND C11 C9\n+BOND C13 C18 C18 H18A C18 H18B C18 H18C\n+BOND C14 C15 C15 H15A C15 H15B\n+BOND C15 C16 C16 H16A C16 H16B\n+BOND C16 C17 C17 H17\n+BOND C17 C13\n+BOND C17 C20 C20 H20\n+BOND C20 C21 C21 H21A C21 H21B C21 H21C\n+BOND C20 C22 C22 H22A C22 H22B\n+BOND C22 C23 C23 H23A C23 H23B\n+BOND C23 C24 C24 H24\n+BOND C24 C25\n+BOND C25 C26 C26 H26A C26 H26B C26 H26C\n+BOND C25 C27 C27 H27A C27 H27B C27 H27C\n+\n+!ICs based on CHARMM optimized structure\n+! I J K L R(I(J/K)) T(I(JK/KJ)) PHI T(JKL) R(KL)\n+IC C1 C2 C3 C4 1.5379 111.57 54.94 113.88 1.5375\n+IC C4 C2 *C3 O3 1.5375 113.88 124.95 108.35 1.4221\n+IC O3 C2 *C3 H3 1.4221 108.35 115.85 107.07 1.1163\n+IC C2 C3 O3 H3' 1.5364 108.35 -78.03 104.42 0.9596\n+IC C2 C3 C4 C5 1.5364 113.88 -48.68 110.10 1.5534\n+IC C5 C3 *C4 C29 1.5534 110.10 126.59 111.49 1.5499\n+IC C3 C4 C29 H29A 1.5375 111.49 72.78 109.77 1.1105\n+IC H29A C4 *C29 H29B 1.1105 109.77 118.19 110.64 1.1087\n+IC H29A C4 *C29 H29C 1.1105 109.77 -119.77 112.38 1.1039\n+IC C29 C3 *C4 C30 1.5499 111.49 117.06 105.83 1.5533\n+IC C3 C4 C30 H30A 1.5375 105.83 65.64 111.02 1.1092\n+IC H30A C4 *C30 H30B 1.1092 111.02 121.58 111.29 1.1074\n+IC H30A C4 *C30 H30C 1.1092 111.02 -119.55 110.02 1.1105\n+IC C3 C4 C5 C10 1.5375 110.10 47.71 117.55 1.5578\n+IC C10 C4 *C5 C6 1.5578 117.55 135.37 115.98 1.5495\n+IC C10 C4 *C5 H5 1.5578 117.55 -112.46 101.79 1.1235\n+IC C4 C5 C6 C7 1.5534 115.98 159.48 110.48 1.5425\n+IC C7 C5 *C6 H6A 1.5425 110.48 121.56 109.92 1.1094\n+IC H6A C5 *C6 H6B 1.1094 109.92 118.61 112.09 1.1081\n+IC C5 C6 C7 C8 1.5495 110.48 40.00 113.33 1.5129\n+IC C8 C6 *C7 H7A 1.5129 113.33 123.72 107.31 1.1117\n+IC H7A C6 *C7 H7B 1.1117 107.31 115.30 108.11 1.1120\n+IC C6 C7 C8 C14 1.5425 113.33 168.47 113.96 1.5320\n+IC C14 C7 *C8 C9 1.5320 113.96 -176.29 123.74 1.3578\n+IC C7 C8 C14 C13 1.5129 113.96 -151.16 111.70 1.5558\n+IC C13 C8 *C14 C15 1.5558 111.70 121.57 121.82 1.5430\n+IC C13 C8 *C14 C28 1.5558 111.70 -120.53 102.26 1.5639\n+IC C8 C14 C28 H28A 1.5320 102.26 176.95 111.99 1.1058\n+IC H18A C14 *C28 H28B 4.3458 17.73 131.76 110.21 1.1106\n+IC H18A C14 *C28 H28C 4.3458 17.73 -108.28 112.43 1.1087\n+IC C8 C14 C15 C16 1.5320 121.82 -162.77 104.00 1.5424\n+IC C16 C14 *C15 H15A 1.5424 104.00 117.70 110.32 1.1104\n+IC H15A C14 *C15 H15B 1.1104 110.32 120.99 112.08 1.1078\n+IC C14 C15 C16 C17 1.5430 104.00 15.22 107.48 1.5685\n+IC C17 C15 *C16 H16A 1.5685 107.48 120.39 108.90 1.1101\n+IC H16A C15 *C16 H16B 1.1101 108.90 119.90 111.12 1.1094\n+IC C13 C16 *C17 C20 1.5488 103.63 131.30 112.17 1.5433\n+IC C13 C16 *C17 H17 1.5488 103.63 -113.06 107.76 1.1134\n+IC C17 C14 *C13 C12 1.5488 102.40 127.71 108.69 1.5431\n+IC C12 C14 *C13 C18 1.5431 108.69 119.81 110.37 1.5636\n+IC C14 C13 C18 H18A 1.5558 110.37 67.11 112.25 1.1066\n+IC H18A C13 *C18 H18B 1.1066 112.25 119.91 109.88 1.1084\n+IC H18A C13 *C18 H18C 1.1066 112.25 -121.16 112.10 1.1061\n+IC C14 C13 C12 C11 1.5558 108.69 57.87 111.32 1.5581\n+IC C11 C13 *C12 H12A 1.5581 111.32 120.29 111.50 1.1058\n+IC H12A C13 *C12 H12B 1.1058 111.50 117.75 109.86 1.1085\n+IC C9 C12 *C11 H11A 1.5259 116.57 121.72 106.51 1.1119\n+IC H11A C12 *C11 H11B 1.1119 106.51 113.60 106.03 1.1118\n+IC C9 C5 *C10 C19 1.5533 109.14 -114.53 112.75 1.5545\n+IC C19 C5 *C10 C1 1.5545 112.75 -121.59 108.73 1.5515\n+IC C5 C10 C19 H19A 1.5578 112.75 177.89 110.86 1.1098\n+IC H19A C10 *C19 H19B 1.1098 110.86 117.91 112.01 1.1010\n+IC H19A C10 *C19 H19C 1.1098 110.86 -120.32 111.90 1.1086\n+IC C2 C10 *C1 H1A 1.5379 112.65 120.84 110.22 1.1115\n+IC C2 C10 *C1 H1B 1.5379 112.65 -120.41 109.05 1.1131\n+IC C1 C3 *C2 H2A 1.5379 111.57 120.49 108.71 1.1130\n+IC H2A C3 *C2 H2B 1.1130 108.71 117.09 109.90 1.1096\n+IC C16 C17 C20 C22 1.5685 112.17 56.23 112.11 1.5563\n+IC C22 C17 *C20 C21 1.5563 112.11 122.82 110.68 1.5441\n+IC C21 C17 *C20 H20 1.5441 110.68 119.37 109.01 1.1139\n+IC C17 C20 C21 H21A 1.5433 110.68 70.20 110.84 1.1067\n+IC H21A C20 *C21 H21B 1.1067 110.84 -121.32 110.48 1.1100\n+IC H21A C20 *C21 H21C 1.1067 110.84 118.50 111.04 1.1082\n+IC C17 C20 C22 C23 1.5433 112.11 -164.95 113.97 1.5453\n+IC C23 C20 *C22 H22A 1.5453 113.97 120.13 109.69 1.1114\n+IC H22A C20 *C22 H22B 1.1114 109.69 117.10 108.55 1.1121\n+IC C20 C22 C23 C24 1.5563 113.97 174.98 111.64 1.5118\n+IC C24 C22 *C23 H23A 1.5118 111.64 124.29 109.27 1.1092\n+IC H23A C22 *C23 H23B 1.1092 109.27 115.37 108.03 1.1128\n+IC C22 C23 C24 C25 1.5453 111.64 114.63 128.18 1.3474\n+IC C25 C23 *C24 H24 1.3474 128.18 -178.90 114.13 1.0997\n+IC C23 C24 C25 C26 1.5118 128.18 179.89 122.29 1.5066\n+IC C26 C24 *C25 C27 1.5066 122.29 179.78 126.47 1.5078\n+IC C24 C25 C26 H26A 1.3474 122.29 -120.36 110.66 1.1110\n+IC H26A C25 *C26 H26B 1.1110 110.66 120.41 112.86 1.1122\n+IC H26A C25 *C26 H26C 1.1110 110.66 -119.16 110.66 1.1110\n+IC C24 C25 C27 H27A 1.3474 126.47 119.17 110.52 1.1108\n+IC H27A C25 *C27 H27B 1.1108 110.52 118.75 110.50 1.1108\n+IC H27A C25 *C27 H27C 1.1108 110.52 -120.76 113.53 1.1099\n+\n+RESI CAMP 0.000 ! Campesterol\n+GROU\n+ATOM C3 CRL1 0.140 ! \n+ATOM H3 HGA1 0.090 !\n+ATOM O3 OHL -0.660 !\n+ATOM H3' HOL 0.430 !\n+GROUP !\n+ATOM C4 CRL2 -0.18 ! H26B H26C H27C H27B\n+ATOM H4A HGA2 0.09 ! \\ / \\ /\n+ATOM H4B HGA2 0.09 ! C26 C27\n+GROUP ! / \\ / \\\n+ATOM C5 CEL1 0.00 ! H26A \\ H25 / H27A\n+ATOM C6 CEL1 -0.15 ! \\ | /\n+ATOM H6 HEL1 0.15 ! \\ | /\n+GROUP ! \\|/\n+ATOM C7 CRL2 -0.18 ! C25\n+ATOM H7A HGA2 0.09 ! |\n+ATOM H7B HGA2 0.09 ! |\n+GROUP ! |\n+ATOM C8 CRL1 -0.09 ! | \n+ATOM H8 HGA1 0.09 ! | H28B\n+GROUP ! | |\n+ATOM C14 CRL1 -0.09 ! H24--C24-----C28-----H28C\n+ATOM H14 HGA1 0.09 ! | |\n+GROUP ! | H28A\n+ATOM C15 CRL2 -0.18 ! |\n+ATOM H15A HGA2 0.09 ! H23A--C23--H23B\n+ATOM H15B HGA2 0.09 ! |\n+GROUP ! |\n+ATOM C16 CRL2 -0.18 ! |\n+ATOM H16A HGA2 0.09 ! H22A--C22--H22B\n+ATOM H16B HGA2 0.09 ! |\n+GROUP ! H21A |\n+ATOM C17 CRL1 -0.09 ! | |\n+ATOM H17 HGA1 0.09 ! H21B--C21-----C20--H20\n+GROUP ! | |\n+ATOM C13 CRL1 0.00 ! H21C |\n+GROUP ! |\n+ATOM C18 CTL3 -0.27 ! H18C |\n+ATOM H18A HAL3 0.09 ! | | H16B\n+ATOM H18B HAL3 0.09 ! H18B--C18 | |\n+ATOM H18C HAL3 0.09 ! / \\ C17-----C16--H16A\n+GROUP ! H18A \\ |\\ |\n+ATOM C12 CRL2 -0.18 ! \\ | H17 |\n+ATOM H12A HGA2 0.09 ! H12B \\ | | H15B\n+ATOM H12B HGA2 0.09 ! \\ \\| |/\n+GROUP ! H12A--C12-----C13 C15--H15A\n+ATOM C11 CRL2 -0.18 ! / \\ /\n+ATOM H11A HGA2 0.09 ! H11B / \\ /\n+ATOM H11B HGA2 0.09 ! \\ / \\ /\n+GROUP ! H11A--C11 C14--H14\n+ATOM C9 CRL1 -0.09 ! \\ /\n+ATOM H9 HGA1 0.09 ! H19C \\ H8 /\n+GROUP ! | \\ \\ /\n+ATOM C10 CRL1 0.00 ! H19A-C19-H19B C9------C8\n+GROUP ! \\ / \\ \\\n+ATOM C19 CTL3 -0.27 ! H1B \\ / H9 \\ H7A\n+ATOM H19A HAL3 0.09 ! | \\ / \\ /\n+ATOM H19B HAL3 0.09 ! H1A--C1------C10 C7\n+ATOM H19C HAL3 0.09 ! / \\ / \\\n+GROUP ! H2A / \\ / H7B\n+ATOM C1 CRL2 -0.18 ! \\ / \\ ------ /\n+ATOM H1A HGA2 0.09 ! C2 C5------C6\n+ATOM H1B HGA2 0.09 ! / \\ / \\\n+GROUP ! H2B \\ / H6\n+ATOM C2 CRL2 -0.18 ! \\ /\n+ATOM H2A HGA2 0.09 ! H3--C3------C4--H4A\n+ATOM H2B HGA2 0.09 ! | |\n+GROUP ! | H4B\n+ATOM C20 CTL1 -0.09 ! |\n+ATOM H20 HAL1 0.09 ! BGLC-2O1\n+GROUP !\n+ATOM C21 CTL3 -0.27 !\n+ATOM H21A HAL3 0.09 !\n+ATOM H21B HAL3 0.09 !\n+ATOM H21C HAL3 0.09 !\n+GROUP !\n+ATOM C22 CTL2 -0.18 !\n+ATOM H22A HAL2 0.09 !\n+ATOM H22B HAL2 0.09 !\n+GROUP !\n+ATOM C23 CTL2 -0.18 !\n+ATOM H23A HAL2 0.09 !\n+ATOM H23B HAL2 0.09 !\n+GROUP !\n+ATOM C24 CTL1 -0.09 !\n+ATOM H24 HAL1 0.09 !\n+GROUP !\n+ATOM C25 CTL1 -0.09 !\n+ATOM H25 HAL1 0.09 !\n+GROUP !\n+ATOM C26 CTL3 -0.27 !\n+ATOM H26A HAL3 0.09 !\n+ATOM H26B HAL3 0.09 !\n+ATOM H26C HAL3 0.09 !\n+GROUP !\n+ATOM C27 CTL3 -0.27 !\n+ATOM H27A HAL3 0.09 !\n+ATOM H27B HAL3 0.09 !\n+ATOM H27C HAL3 0.09 !\n+GROUP !\n+ATOM C28 CTL3 -0.27 !\n+ATOM H28A HAL3 0.09 !\n+ATOM H28B HAL3 0.09 !\n+ATOM H28C HAL3 0.09 !\n+\n+BOND C3 O3 C3 H3 O3 H3'\n+BOND C3 C2 C2 H2A C2 H2B\n+BOND C2 C1 C1 H1A C1 H1B\n+BOND C3 C4 C4 H4A C4 H4B\n+BOND C4 C5\n+BOND C5 C10\n+BOND C10 C1\n+BOND C10 C19 C19 H19A C19 H19B C19 H19C\n+DOUBLE C5 C6\n+BOND C6 H6\n+BOND C6 C7 C7 H7A C7 H7B\n+BOND C7 C8 C8 H8\n+BOND C8 C9 C9 H9\n+BOND C9 C10\n+BOND C8 C14 C14 H14\n+BOND C14 C13\n+BOND C13 C12 C12 H12A C12 H12B\n+BOND C12 C11 C11 H11A C11 H11B\n+BOND C11 C9\n+BOND C13 C18 C18 H18A C18 H18B C18 H18C\n+BOND C14 C15 C15 H15A C15 H15B\n+BOND C15 C16 C16 H16A C16 H16B\n+BOND C16 C17 C17 H17\n+BOND C17 C13\n+BOND C17 C20 C20 H20\n+BOND C20 C21 C21 H21A C21 H21B C21 H21C\n+BOND C20 C22 C22 H22A C22 H22B\n+BOND C22 C23 C23 H23A C23 H23B\n+BOND C23 C24 C24 H24 C24 C28\n+BOND C24 C25 C25 H25\n+BOND C25 C26 C26 H26A C26 H26B C26 H26C\n+BOND C25 C27 C27 H27A C27 H27B C27 H27C\n+BOND C28 H28A C28 H28B C28 H28C\n+\n+!IC table by CHARMM ic generate\n+! I J K L R(I(J/K)) T(I(JK/KJ)) PHI T(JKL) R(KL)\n+IC C1 C2 C3 C4 1.5364 111.21 56.01 109.65 1.5453\n+IC C4 C2 *C3 O3 1.5453 109.65 120.63 107.90 1.4244\n+IC O3 C2 *C3 H3 1.4244 107.90 119.54 108.27 1.1147\n+IC C2 C3 O3 H3' 1.5311 109.14 -58.51 105.39 0.9593\n+IC C2 C3 C4 C5 1.5352 109.65 -55.22 112.54 1.5177\n+IC C5 C3 *C4 H4A 1.5177 112.54 121.67 107.81 1.1109\n+IC H4A C3 *C4 H4B 1.1109 107.81 115.07 108.81 1.1104\n+IC C3 C4 C5 C10 1.5453 112.54 53.05 115.33 1.5436\n+IC C10 C4 *C5 C6 1.5436 115.33 -176.36 121.38 1.3429\n+IC C4 C5 C6 C7 1.5177 121.38 -178.30 123.98 1.5022\n+IC C7 C5 *C6 H6 1.5022 123.98 176.41 119.63 1.1001\n+IC C5 C6 C7 C8 1.3429 123.98 12.76 112.90 1.5529\n+IC C8 C6 *C7 H7A 1.5529 112.90 121.60 110.51 1.1117\n+IC H7A C6 *C7 H7B 1.1117 110.51 117.85 109.10 1.1119\n+IC C6 C7 C8 C14 1.5022 112.90 -164.66 109.96 1.5225\n+IC C14 C7 *C8 C9 1.5225 109.96 121.09 110.99 1.5329\n+IC C9 C7 *C8 H8 1.5329 110.99 119.49 107.78 1.1119\n+IC C7 C8 C14 C13 1.5529 109.96 179.79 115.56 1.5288\n+IC C13 C8 *C14 C15 1.5288 115.56 126.99 117.68 1.5373\n+IC C13 C8 *C14 H14 1.5288 115.56 -116.28 105.71 1.1211\n+IC C8 C14 C15 C16 1.5225 117.68 -164.42 103.33 1.5351\n+IC C16 C14 *C15 H15A 1.5351 103.33 117.45 109.56 1.1115\n+IC H15A C14 *C15 H15B 1.1115 109.56 121.35 112.27 1.1084\n+IC C14 C15 C16 C17 1.5373 103.33 9.31 107.09 1.5659\n+IC C17 C15 *C16 H16A 1.5659 107.09 119.55 108.96 1.1109\n+IC H16A C15 *C16 H16B 1.1109 108.96 120.21 111.43 1.1093\n+IC C13 C16 *C17 C20 1.5480 104.85 131.64 112.13 1.5396\n+IC C13 C16 *C17 H17 1.5480 104.85 -111.79 106.40 1.1160\n+IC C17 C14 *C13 C12 1.5480 100.31 123.21 106.74 1.5437\n+IC C12 C14 *C13 C18 1.5437 106.74 122.37 110.70 1.5519\n+IC C14 C13 C18 H18A 1.5288 110.70 61.58 111.56 1.1077\n+IC H18A C13 *C18 H18B 1.1077 111.56 120.16 110.24 1.1086\n+IC H18A C13 *C18 H18C 1.1077 111.56 -120.80 111.44 1.1066\n+IC C14 C13 C12 C11 1.5288 106.74 56.34 111.32 1.5434\n+IC C11 C13 *C12 H12A 1.5434 111.32 121.18 111.42 1.1063\n+IC H12A C13 *C12 H12B 1.1063 111.42 118.88 108.78 1.1116\n+IC C9 C12 *C11 H11A 1.5594 113.54 121.81 107.21 1.1091\n+IC H11A C12 *C11 H11B 1.1091 107.21 115.85 108.56 1.1100\n+IC C10 C8 *C9 H9 1.5551 112.75 -114.70 104.69 1.1190\n+IC C9 C5 *C10 C19 1.5551 111.95 -119.97 107.70 1.5521\n+IC C19 C5 *C10 C1 1.5521 107.70 -119.60 109.10 1.5574\n+IC C5 C10 C19 H19A 1.5436 107.70 -172.87 110.72 1.1082\n+IC H19A C10 *C19 H19B 1.1082 110.72 118.54 111.72 1.1083\n+IC H19A C10 *C19 H19C 1.1082 110.72 -120.67 110.92 1.1094\n+IC C2 C10 *C1 H1A 1.5364 114.67 122.15 109.18 1.1106\n+IC C2 C10 *C1 H1B 1.5364 114.67 -120.90 108.59 1.1131\n+IC C1 C3 *C2 H2A 1.5364 111.21 121.57 109.25 1.1116\n+IC H2A C3 *C2 H2B 1.1116 109.25 117.37 108.87 1.1116\n+IC C16 C17 C20 C22 1.5659 112.13 55.85 111.76 1.5544\n+IC C22 C17 *C20 C21 1.5544 111.76 123.13 110.93 1.5438\n+IC C21 C17 *C20 H20 1.5438 110.93 119.03 108.69 1.1145\n+IC C17 C20 C21 H21A 1.5396 110.93 67.25 110.85 1.1067\n+IC H21A C20 *C21 H21B 1.1067 110.85 -121.42 110.50 1.1099\n+IC H21A C20 *C21 H21C 1.1067 110.85 118.26 110.94 1.1084\n+IC C17 C20 C22 C23 1.5396 111.76 -169.24 114.25 1.5414\n+IC C23 C20 *C22 H22A 1.5414 114.25 119.27 109.91 1.1112\n+IC H22A C20 *C22 H22B 1.1112 109.91 117.52 108.59 1.1107\n+IC C20 C22 C23 C24 1.5544 114.25 172.63 113.31 1.5490\n+IC C24 C22 *C23 H23A 1.5490 113.31 121.75 109.89 1.1097\n+IC H23A C22 *C23 H23B 1.1097 109.89 117.18 107.56 1.1109\n+IC C22 C23 C24 C25 1.5414 113.31 -167.66 114.95 1.5287\n+IC C25 C23 *C24 C28 1.5287 114.95 -124.07 111.77 1.5454\n+IC C28 C23 *C24 H24 1.5454 111.77 -117.26 107.38 1.1166\n+IC C23 C24 C25 C26 1.5490 114.95 -51.50 112.04 1.5418\n+IC C26 C24 *C25 C27 1.5418 112.04 123.99 109.40 1.5419\n+IC C26 C24 *C25 H25 1.5418 112.04 -119.29 108.05 1.1160\n+IC C24 C25 C26 H26A 1.5287 112.04 -57.05 111.33 1.1092\n+IC H26A C25 *C26 H26B 1.1092 111.33 121.22 110.82 1.1095\n+IC H26A C25 *C26 H26C 1.1092 111.33 -119.73 109.79 1.1105\n+IC C24 C25 C27 H27A 1.5287 109.40 -65.02 110.99 1.1090\n+IC H27A C25 *C27 H27B 1.1090 110.99 120.78 110.60 1.1105\n+IC H27A C25 *C27 H27C 1.1090 110.99 -119.50 110.05 1.1102\n+IC C23 C24 C28 H28C 1.5490 111.77 178.60 110.60 1.1100\n+IC H28C C24 *C28 H28A 1.1100 110.60 -120.57 110.78 1.1093\n+IC H28A C24 *C28 H28B 1.1093 110.78 -119.84 110.51 1.1095\n+\n+RESI GSTIG 0.000 ! Stigmasteryl glucoside\n+GROU ! BGLC\n+ATOM 2C1 CC3162 0.290 !\n+ATOM 2H1 HCA1 0.090 !\n+ATOM 2O1 OC301 -0.360 !\n+ATOM 2C5 CC3163 0.110 !\n+ATOM 2H5 HCA1 0.090 !\n+ATOM 2O5 OC3C61 -0.400 !\n+ATOM C3 CRL1 0.090 !\n+ATOM H3 HGA1 0.090 !\n+GROU !\n+ATOM 2C2 CC3161 0.140 !\n+ATOM 2H2 HCA1 0.090 !\n+ATOM 2O2 OC311 -0.650 !\n+ATOM 2HO2 HCP1 0.420 !\n+GROU !\n+ATOM 2C3 CC3161 0.140 !\n+ATOM 2H3 HCA1 0.090 !\n+ATOM 2O3 OC311 -0.650 !\n+ATOM 2HO3 HCP1 0.420 !\n+GROU\n+ATOM 2C4 CC3161 0.140 !\n+ATOM 2H4 HCA1 0.090 !\n+ATOM 2O4 OC311 -0.650 !\n+ATOM 2HO4 HCP1 0.420 !\n+GROU\n+ATOM 2C6 CC321 0.050 !\n+ATOM 2H61 HCA2 0.090 !\n+ATOM 2H62 HCA2 0.090 !\n+ATOM 2O6 OC311 -0.650 !\n+ATOM 2HO6 HCP1 0.420 !\n+!\n+GROUP !\n+ATOM C4 CRL2 -0.18 ! H26B H26C H27C H27B\n+ATOM H4A HGA2 0.09 ! \\ / \\ /\n+ATOM H4B HGA2 0.09 ! C26 C27\n+GROUP ! / \\ / \\\n+ATOM C5 CEL1 0.00 ! H26A \\ H25 / H27A\n+ATOM C6 CEL1 -0.15 ! \\ | /\n+ATOM H6 HEL1 0.15 ! \\ | /\n+GROUP ! \\|/\n+ATOM C7 CRL2 -0.18 ! C25\n+ATOM H7A HGA2 0.09 ! |\n+ATOM H7B HGA2 0.09 ! |\n+GROUP ! |\n+ATOM C8 CRL1 -0.09 ! | \n+ATOM H8 HGA1 0.09 ! | H28B H29A\n+GROUP ! | | |\n+ATOM C14 CRL1 -0.09 ! H24--C24-----C28-----C29--H29B\n+ATOM H14 HGA1 0.09 ! | | |\n+GROUP ! | H28A H29C\n+ATOM C15 CRL2 -0.18 ! |\n+ATOM H15A HGA2 0.09 ! C23--H23\n+ATOM H15B HGA2 0.09 ! ||\n+GROUP ! || (trans)\n+ATOM C16 CRL2 -0.18 ! ||\n+ATOM H16A HGA2 0.09 ! H22--C22\n+ATOM H16B HGA2 0.09 ! |\n+GROUP ! H21A |\n+ATOM C17 CRL1 -0.09 ! | |\n+ATOM H17 HGA1 0.09 ! H21B--C21-----C20--H20\n+GROUP ! | |\n+ATOM C13 CRL1 0.00 ! H21C |\n+GROUP ! |\n+ATOM C18 CTL3 -0.27 ! H18C |\n+ATOM H18A HAL3 0.09 ! | | H16B\n+ATOM H18B HAL3 0.09 ! H18B--C18 | |\n+ATOM H18C HAL3 0.09 ! / \\ C17-----C16--H16A\n+GROUP ! H18A \\ |\\ |\n+ATOM C12 CRL2 -0.18 ! \\ | H17 |\n+ATOM H12A HGA2 0.09 ! H12B \\ | | H15B\n+ATOM H12B HGA2 0.09 ! \\ \\| |/\n+GROUP ! H12A--C12-----C13 C15--H15A\n+ATOM C11 CRL2 -0.18 ! / \\ /\n+ATOM H11A HGA2 0.09 ! H11B / \\ /\n+ATOM H11B HGA2 0.09 ! \\ / \\ /\n+GROUP ! H11A--C11 C14--H14\n+ATOM C9 CRL1 -0.09 ! \\ /\n+ATOM H9 HGA1 0.09 ! H19C \\ H8 /\n+GROUP ! | \\ \\ /\n+ATOM C10 CRL1 0.00 ! H19A-C19-H19B C9------C8\n+GROUP ! \\ / \\ \\\n+ATOM C19 CTL3 -0.27 ! H1B \\ / H9 \\ H7A\n+ATOM H19A HAL3 0.09 ! | \\ / \\ /\n+ATOM H19B HAL3 0.09 ! H1A--C1------C10 C7\n+ATOM H19C HAL3 0.09 ! / \\ / \\\n+GROUP ! H2A / \\ / H7B\n+ATOM C1 CRL2 -0.18 ! \\ / \\ ------ /\n+ATOM H1A HGA2 0.09 ! C2 C5------C6\n+ATOM H1B HGA2 0.09 ! / \\ / \\\n+GROUP ! H2B \\ / H6\n+ATOM C2 CRL2 -0.18 ! \\ /\n+ATOM H2A HGA2 0.09 ! H3--C3------C4--H4A\n+ATOM H2B HGA2 0.09 ! | |\n+GROUP ! | H4B\n+ATOM C20 CTL1 -0.09 ! |\n+ATOM H20 HAL1 0.09 ! BGLC--2O1\n+GROUP !\n+ATOM C21 CTL3 -0.27 !\n+ATOM H21A HAL3 0.09 !\n+ATOM H21B HAL3 0.09 !\n+ATOM H21C HAL3 0.09 !\n+GROUP !\n+ATOM C22 CEL1 -0.15 !\n+ATOM C23 CEL1 -0.15 !\n+ATOM H22 HEL1 0.15 !\n+ATOM H23 HEL1 0.15 !\n+GROUP !\n+ATOM C24 CTL1 -0.09 !\n+ATOM H24 HAL1 0.09 !\n+GROUP !\n+ATOM C25 CTL1 -0.09 !\n+ATOM H25 HAL1 0.09 !\n+GROUP !\n+ATOM C26 CTL3 -0.27 !\n+ATOM H26A HAL3 0.09 !\n+ATOM H26B HAL3 0.09 !\n+ATOM H26C HAL3 0.09 !\n+GROUP !\n+ATOM C27 CTL3 -0.27 !\n+ATOM H27A HAL3 0.09 !\n+ATOM H27B HAL3 0.09 !\n+ATOM H27C HAL3 0.09 !\n+GROUP !\n+ATOM C28 CTL2 -0.18 !\n+ATOM H28A HAL2 0.09 !\n+ATOM H28B HAL2 0.09 !\n+GROUP !\n+ATOM C29 CTL3 -0.27 !\n+ATOM H29A HAL3 0.09 !\n+ATOM H29B HAL3 0.09 !\n+ATOM H29C HAL3 0.09 !\n+\n+!\n+BOND 2C1 2O1 2C1 2H1\n+BOND 2C1 2O5 2C1 2C2\n+BOND 2C2 2H2 2C2 2O2 2O2 2HO2 2C2 2C3 \n+BOND 2C3 2H3 2C3 2O3 2O3 2HO3 2C3 2C4 \n+BOND 2C4 2H4 2C4 2O4 2O4 2HO4 2C4 2C5 \n+BOND 2C5 2H5 2C5 2O5 2C5 2C6 \n+BOND 2C6 2H61 2C6 2H62 2C6 2O6 2O6 2HO6 \n+!\n+BOND C3 2O1 C3 H3\n+BOND C3 C2 C2 H2A C2 H2B\n+BOND C2 C1 C1 H1A C1 H1B\n+BOND C3 C4 C4 H4A C4 H4B\n+BOND C4 C5\n+BOND C5 C10\n+BOND C10 C1\n+BOND C10 C19 C19 H19A C19 H19B C19 H19C\n+DOUBLE C5 C6\n+BOND C6 H6\n+BOND C6 C7 C7 H7A C7 H7B\n+BOND C7 C8 C8 H8\n+BOND C8 C9 C9 H9\n+BOND C9 C10\n+BOND C8 C14 C14 H14\n+BOND C14 C13\n+BOND C13 C12 C12 H12A C12 H12B\n+BOND C12 C11 C11 H11A C11 H11B\n+BOND C11 C9\n+BOND C13 C18 C18 H18A C18 H18B C18 H18C\n+BOND C14 C15 C15 H15A C15 H15B\n+BOND C15 C16 C16 H16A C16 H16B\n+BOND C16 C17 C17 H17\n+BOND C17 C13\n+BOND C17 C20 C20 H20\n+BOND C20 C21 C21 H21A C21 H21B C21 H21C\n+BOND C20 C22 C22 H22\n+DOUBLE C22 C23\n+BOND C23 H23\n+BOND C23 C24 C24 H24 C24 C28\n+BOND C24 C25 C25 H25\n+BOND C25 C26 C26 H26A C26 H26B C26 H26C\n+BOND C25 C27 C27 H27A C27 H27B C27 H27C\n+BOND C28 H28A C28 H28B C28 C29\n+BOND C29 H29A C29 H29B C29 H29C\n+\n+! I J K L R(I(J/K)) T(I(JK/KJ)) PHI T(JKL) R(KL)\n+IC 2O1 2C2 *2C1 2H1 1.4082 106.55 119.82 109.38 1.1124\n+IC 2O1 2O5 *2C1 2C2 1.4082 111.67 116.36 107.22 1.5152\n+IC 2O2 2C3 *2C2 2H2 1.4316 111.13 -118.01 108.36 1.1176\n+IC 2O2 2C1 *2C2 2C3 1.4316 112.03 -123.93 109.74 1.5153\n+IC 2O3 2C4 *2C3 2H3 1.4263 111.23 117.89 108.32 1.1182\n+IC 2O3 2C2 *2C3 2C4 1.4263 111.54 123.92 110.00 1.5134\n+IC 2O4 2C5 *2C4 2H4 1.4206 110.56 -118.31 108.24 1.1173\n+IC 2O4 2C3 *2C4 2C5 1.4206 110.99 -122.82 110.21 1.5217\n+IC 2C6 2O5 *2C5 2H5 1.5138 108.18 117.54 109.57 1.1172\n+IC 2C6 2C4 *2C5 2O5 1.5138 113.09 120.32 108.94 1.4400\n+IC 2O6 2H62 *2C6 2H61 1.4280 109.26 -117.67 107.74 1.1143\n+IC 2O6 2C5 *2C6 2H62 1.4280 111.28 -121.27 110.07 1.1133\n+IC 2O5 2C1 2C2 2C3 1.4340 107.22 60.85 109.74 1.5153\n+IC 2C1 2C2 2C3 2C4 1.5152 109.74 -55.80 110.00 1.5134\n+IC 2C2 2C3 2C4 2C5 1.5153 110.00 53.07 110.21 1.5217\n+IC 2C3 2C4 2C5 2O5 1.5134 110.21 -55.99 108.94 1.4400\n+IC 2C4 2C5 2O5 2C1 1.5217 108.94 64.09 111.80 1.4340\n+IC 2C5 2O5 2C1 2C2 1.4400 111.80 -66.20 107.22 1.5152\n+IC 2C4 2C5 2C6 2O6 1.5217 113.09 -178.92 111.28 1.4280\n+IC 2C1 2C2 2O2 2HO2 1.5152 112.03 60.11 108.29 0.9659\n+IC 2C2 2C3 2O3 2HO3 1.5153 111.54 -46.33 106.80 0.9670\n+IC 2C3 2C4 2O4 2HO4 1.5134 110.99 47.37 106.95 0.9668\n+IC 2C5 2C6 2O6 2HO6 1.5138 111.28 -61.50 108.65 0.9633\n+IC 2O5 2C1 2O1 C1 1.4340 111.67 -54.33 137.34 3.7661\n+IC 2C1 2O1 C1 C2 1.4082 137.34 156.70 21.08 1.5371\n+IC C1 C2 C3 C4 1.5371 111.22 56.43 109.37 1.5455\n+IC C4 C2 *C3 2O1 1.5455 109.37 120.69 108.04 1.4253\n+IC 2O1 C2 *C3 H3 1.4253 108.04 119.55 108.37 1.1147\n+IC C2 C3 C4 C5 1.5350 109.37 -55.81 112.53 1.5176\n+IC C5 C3 *C4 H4A 1.5176 112.53 -123.22 108.97 1.1099\n+IC H4A C3 *C4 H4B 1.1099 108.97 -115.13 107.75 1.1108\n+IC C3 C4 C5 C10 1.5455 112.53 53.12 115.40 1.5438\n+IC C10 C4 *C5 C6 1.5438 115.40 -176.28 121.26 1.3429\n+IC C4 C5 C6 C7 1.5176 121.26 -178.31 123.98 1.5025\n+IC C7 C5 *C6 H6 1.5025 123.98 176.40 119.63 1.1000\n+IC C5 C6 C7 C8 1.3429 123.98 12.38 112.89 1.5527\n+IC C8 C6 *C7 H7A 1.5527 112.89 121.53 110.45 1.1115\n+IC H7A C6 *C7 H7B 1.1115 110.45 117.84 109.10 1.1115\n+IC C6 C7 C8 C14 1.5025 112.89 -164.85 110.03 1.5227\n+IC C14 C7 *C8 C9 1.5227 110.03 121.39 110.94 1.5337\n+IC C9 C7 *C8 H8 1.5337 110.94 119.38 107.63 1.1118\n+IC C7 C8 C14 C13 1.5527 110.03 179.54 115.32 1.5275\n+IC C13 C8 *C14 C15 1.5275 115.32 126.70 117.67 1.5386\n+IC C13 C8 *C14 H14 1.5275 115.32 -116.33 105.81 1.1209\n+IC C8 C14 C15 C16 1.5227 117.67 -163.04 103.62 1.5358\n+IC C16 C14 *C15 H15A 1.5358 103.62 -121.30 112.12 1.1083\n+IC H15A C14 *C15 H15B 1.1083 112.12 -121.27 109.56 1.1113\n+IC C14 C15 C16 C17 1.5386 103.62 8.04 106.92 1.5662\n+IC C17 C15 *C16 H16A 1.5662 106.92 -120.24 111.60 1.1092\n+IC H16A C15 *C16 H16B 1.1092 111.60 -120.18 108.88 1.1109\n+IC C13 C16 *C17 C20 1.5478 104.79 130.71 112.66 1.5387\n+IC C13 C16 *C17 H17 1.5478 104.79 -111.64 106.17 1.1167\n+IC C17 C14 *C13 C12 1.5478 100.43 123.51 107.00 1.5418\n+IC C12 C14 *C13 C18 1.5418 107.00 122.03 110.81 1.5518\n+IC C14 C13 C18 H18A 1.5275 110.81 -177.29 109.98 1.1094\n+IC H18A C13 *C18 H18B 1.1094 109.98 -120.23 111.53 1.1079\n+IC H18A C13 *C18 H18C 1.1094 109.98 118.88 111.60 1.1063\n+IC C14 C13 C12 C11 1.5275 107.00 56.66 111.18 1.5441\n+IC C11 C13 *C12 H12A 1.5441 111.18 -120.09 108.92 1.1115\n+IC H12A C13 *C12 H12B 1.1115 108.92 -118.98 110.96 1.1067\n+IC C9 C12 *C11 H11A 1.5603 113.67 -122.37 108.57 1.1100\n+IC H11A C12 *C11 H11B 1.1100 108.57 -115.76 107.19 1.1089\n+IC C10 C8 *C9 H9 1.5560 112.59 -114.63 104.65 1.1190\n+IC C9 C5 *C10 C19 1.5560 111.79 -119.90 107.64 1.5524\n+IC C19 C5 *C10 C1 1.5524 107.64 -119.57 109.25 1.5578\n+IC C5 C10 C19 H19A 1.5438 107.64 -173.05 110.73 1.1081\n+IC H19A C10 *C19 H19B 1.1081 110.73 -120.63 110.96 1.1093\n+IC H19A C10 *C19 H19C 1.1081 110.73 118.61 111.72 1.1085\n+IC C2 C10 *C1 H1A 1.5371 114.81 -120.93 108.55 1.1130\n+IC C2 C10 *C1 H1B 1.5371 114.81 122.15 109.09 1.1107\n+IC C1 C3 *C2 H2A 1.5371 111.22 -120.96 108.79 1.1118\n+IC H2A C3 *C2 H2B 1.1118 108.79 -117.39 109.29 1.1116\n+IC C16 C17 C20 C22 1.5662 112.66 48.93 111.40 1.5180\n+IC C22 C17 *C20 C21 1.5180 111.40 120.24 111.36 1.5450\n+IC C21 C17 *C20 H20 1.5450 111.36 119.42 109.26 1.1133\n+IC C17 C20 C21 H21A 1.5387 111.36 -171.73 111.02 1.1117\n+IC H21A C20 *C21 H21B 1.1117 111.02 120.92 111.09 1.1102\n+IC H21A C20 *C21 H21C 1.1117 111.02 -118.18 110.39 1.1071\n+IC C17 C20 C22 C23 1.5387 111.40 -118.47 123.96 1.3455\n+IC C23 C20 *C22 H22 1.3455 123.96 179.62 116.24 1.1000\n+IC C20 C22 C23 C24 1.5180 123.96 179.75 126.04 1.5179\n+IC C24 C22 *C23 H23 1.5179 126.04 179.50 118.88 1.0997\n+IC C22 C23 C24 C25 1.3455 126.04 -110.01 113.50 1.5322\n+IC C25 C23 *C24 C28 1.5322 113.50 -125.82 109.81 1.5529\n+IC C28 C23 *C24 H24 1.5529 109.81 -115.87 109.35 1.1169\n+IC C23 C24 C25 C26 1.5179 113.50 -56.22 112.16 1.5433\n+IC C26 C24 *C25 C27 1.5433 112.16 124.15 109.87 1.5414\n+IC C26 C24 *C25 H25 1.5433 112.16 -118.83 107.75 1.1161\n+IC C24 C25 C26 H26A 1.5322 112.16 -177.11 109.78 1.1106\n+IC H26A C25 *C26 H26B 1.1106 109.78 -119.05 110.91 1.1096\n+IC H26A C25 *C26 H26C 1.1106 109.78 119.65 111.18 1.1090\n+IC C24 C25 C27 H27A 1.5322 109.87 -64.62 110.65 1.1094\n+IC H27A C25 *C27 H27B 1.1094 110.65 -119.49 110.05 1.1105\n+IC H27A C25 *C27 H27C 1.1094 110.65 120.55 110.58 1.1100\n+IC C23 C24 C28 C29 1.5179 109.81 -65.13 113.73 1.5348\n+IC C29 C24 *C28 H28A 1.5348 113.73 -120.35 107.89 1.1136\n+IC H28A C24 *C28 H28B 1.1136 107.89 -116.65 110.07 1.1121\n+IC C24 C28 C29 H29A 1.5529 113.73 -178.57 110.40 1.1110\n+IC H29A C28 *C29 H29B 1.1110 110.40 -119.92 110.93 1.1108\n+IC H29A C28 *C29 H29C 1.1110 110.40 119.92 110.42 1.1109\n+\n+RESI GSITO 0.000 ! Sitosteryl glucoside\n+GROU ! BGLC\n+ATOM 2C1 CC3162 0.290 !\n+ATOM 2H1 HCA1 0.090 !\n+ATOM 2O1 OC301 -0.360 !\n+ATOM 2C5 CC3163 0.110 !\n+ATOM 2H5 HCA1 0.090 !\n+ATOM 2O5 OC3C61 -0.400 !\n+ATOM C3 CRL1 0.090 ! \n+ATOM H3 HGA1 0.090 !\n+GROU !\n+ATOM 2C2 CC3161 0.140 !\n+ATOM 2H2 HCA1 0.090 !\n+ATOM 2O2 OC311 -0.650 !\n+ATOM 2HO2 HCP1 0.420 !\n+GROU !\n+ATOM 2C3 CC3161 0.140 !\n+ATOM 2H3 HCA1 0.090 !\n+ATOM 2O3 OC311 -0.650 !\n+ATOM 2HO3 HCP1 0.420 !\n+GROU\n+ATOM 2C4 CC3161 0.140\n+ATOM 2H4 HCA1 0.090\n+ATOM 2O4 OC311 -0.650\n+ATOM 2HO4 HCP1 0.420\n+GROU\n+ATOM 2C6 CC321 0.050\n+ATOM 2H61 HCA2 0.090\n+ATOM 2H62 HCA2 0.090\n+ATOM 2O6 OC311 -0.650\n+ATOM 2HO6 HCP1 0.420\n+ ! \n+GROUP !\n+ATOM C4 CRL2 -0.18 ! H26B H26C H27C H27B\n+ATOM H4A HGA2 0.09 ! \\ / \\ /\n+ATOM H4B HGA2 0.09 ! C26 C27\n+GROUP ! / \\ / \\\n+ATOM C5 CEL1 0.00 ! H26A \\ H25 / H27A\n+ATOM C6 CEL1 -0.15 ! \\ | /\n+ATOM H6 HEL1 0.15 ! \\ | /\n+GROUP ! \\|/\n+ATOM C7 CRL2 -0.18 ! C25\n+ATOM H7A HGA2 0.09 ! |\n+ATOM H7B HGA2 0.09 ! |\n+GROUP ! |\n+ATOM C8 CRL1 -0.09 ! | \n+ATOM H8 HGA1 0.09 ! | H28B H29A\n+GROUP ! | | |\n+ATOM C14 CRL1 -0.09 ! H24--C24-----C28-----C29--H29B\n+ATOM H14 HGA1 0.09 ! | | |\n+GROUP ! | H28A H29C\n+ATOM C15 CRL2 -0.18 ! |\n+ATOM H15A HGA2 0.09 ! H23A--C23--H23B\n+ATOM H15B HGA2 0.09 ! |\n+GROUP ! |\n+ATOM C16 CRL2 -0.18 ! |\n+ATOM H16A HGA2 0.09 ! H22A--C22--H22B\n+ATOM H16B HGA2 0.09 ! |\n+GROUP ! H21A |\n+ATOM C17 CRL1 -0.09 ! | |\n+ATOM H17 HGA1 0.09 ! H21B--C21-----C20--H20\n+GROUP ! | |\n+ATOM C13 CRL1 0.00 ! H21C |\n+GROUP ! |\n+ATOM C18 CTL3 -0.27 ! H18C |\n+ATOM H18A HAL3 0.09 ! | | H16B\n+ATOM H18B HAL3 0.09 ! H18B--C18 | |\n+ATOM H18C HAL3 0.09 ! / \\ C17-----C16--H16A\n+GROUP ! H18A \\ |\\ |\n+ATOM C12 CRL2 -0.18 ! \\ | H17 |\n+ATOM H12A HGA2 0.09 ! H12B \\ | | H15B\n+ATOM H12B HGA2 0.09 ! \\ \\| |/\n+GROUP ! H12A--C12-----C13 C15--H15A\n+ATOM C11 CRL2 -0.18 ! / \\ /\n+ATOM H11A HGA2 0.09 ! H11B / \\ /\n+ATOM H11B HGA2 0.09 ! \\ / \\ /\n+GROUP ! H11A--C11 C14--H14\n+ATOM C9 CRL1 -0.09 ! \\ /\n+ATOM H9 HGA1 0.09 ! H19C \\ H8 /\n+GROUP ! | \\ \\ /\n+ATOM C10 CRL1 0.00 ! H19A-C19-H19B C9------C8\n+GROUP ! \\ / \\ \\\n+ATOM C19 CTL3 -0.27 ! H1B \\ / H9 \\ H7A\n+ATOM H19A HAL3 0.09 ! | \\ / \\ /\n+ATOM H19B HAL3 0.09 ! H1A--C1------C10 C7\n+ATOM H19C HAL3 0.09 ! / \\ / \\\n+GROUP ! H2A / \\ / H7B\n+ATOM C1 CRL2 -0.18 ! \\ / \\ ------ /\n+ATOM H1A HGA2 0.09 ! C2 C5------C6\n+ATOM H1B HGA2 0.09 ! / \\ / \\\n+GROUP ! H2B \\ / H6\n+ATOM C2 CRL2 -0.18 ! \\ /\n+ATOM H2A HGA2 0.09 ! H3--C3------C4--H4A\n+ATOM H2B HGA2 0.09 ! | |\n+GROUP ! | H4B\n+ATOM C20 CTL1 -0.09 ! |\n+ATOM H20 HAL1 0.09 ! BGLC-2O1\n+GROUP !\n+ATOM C21 CTL3 -0.27 !\n+ATOM H21A HAL3 0.09 !\n+ATOM H21B HAL3 0.09 !\n+ATOM H21C HAL3 0.09 !\n+GROUP !\n+ATOM C22 CTL2 -0.18 !\n+ATOM H22A HAL2 0.09 !\n+ATOM H22B HAL2 0.09 !\n+GROUP !\n+ATOM C23 CTL2 -0.18 !\n+ATOM H23A HAL2 0.09 !\n+ATOM H23B HAL2 0.09 !\n+GROUP !\n+ATOM C24 CTL1 -0.09 !\n+ATOM H24 HAL1 0.09 !\n+GROUP !\n+ATOM C25 CTL1 -0.09 !\n+ATOM H25 HAL1 0.09 !\n+GROUP !\n+ATOM C26 CTL3 -0.27 !\n+ATOM H26A HAL3 0.09 !\n+ATOM H26B HAL3 0.09 !\n+ATOM H26C HAL3 0.09 !\n+GROUP !\n+ATOM C27 CTL3 -0.27 !\n+ATOM H27A HAL3 0.09 !\n+ATOM H27B HAL3 0.09 !\n+ATOM H27C HAL3 0.09 !\n+GROUP !\n+ATOM C28 CTL2 -0.18 !\n+ATOM H28A HAL2 0.09 !\n+ATOM H28B HAL2 0.09 !\n+GROUP !\n+ATOM C29 CTL3 -0.27 !\n+ATOM H29A HAL3 0.09 !\n+ATOM H29B HAL3 0.09 !\n+ATOM H29C HAL3 0.09 !\n+\n+!\n+BOND 2C1 2O1 2C1 2H1\n+BOND 2C1 2O5 2C1 2C2\n+BOND 2C2 2H2 2C2 2O2 2O2 2HO2 2C2 2C3 \n+BOND 2C3 2H3 2C3 2O3 2O3 2HO3 2C3 2C4 \n+BOND 2C4 2H4 2C4 2O4 2O4 2HO4 2C4 2C5 \n+BOND 2C5 2H5 2C5 2O5 2C5 2C6 \n+BOND 2C6 2H61 2C6 2H62 2C6 2O6 2O6 2HO6 \n+!\n+BOND C3 2O1 C3 H3\n+BOND C3 C2 C2 H2A C2 H2B\n+BOND C2 C1 C1 H1A C1 H1B\n+BOND C3 C4 C4 H4A C4 H4B\n+BOND C4 C5\n+BOND C5 C10\n+BOND C10 C1\n+BOND C10 C19 C19 H19A C19 H19B C19 H19C\n+DOUBLE C5 C6\n+BOND C6 H6\n+BOND C6 C7 C7 H7A C7 H7B\n+BOND C7 C8 C8 H8\n+BOND C8 C9 C9 H9\n+BOND C9 C10\n+BOND C8 C14 C14 H14\n+BOND C14 C13\n+BOND C13 C12 C12 H12A C12 H12B\n+BOND C12 C11 C11 H11A C11 H11B\n+BOND C11 C9\n+BOND C13 C18 C18 H18A C18 H18B C18 H18C\n+BOND C14 C15 C15 H15A C15 H15B\n+BOND C15 C16 C16 H16A C16 H16B\n+BOND C16 C17 C17 H17\n+BOND C17 C13\n+BOND C17 C20 C20 H20\n+BOND C20 C21 C21 H21A C21 H21B C21 H21C\n+BOND C20 C22 C22 H22A C22 H22B\n+BOND C22 C23 C23 H23A C23 H23B\n+BOND C23 C24 C24 H24 C24 C28\n+BOND C24 C25 C25 H25\n+BOND C25 C26 C26 H26A C26 H26B C26 H26C\n+BOND C25 C27 C27 H27A C27 H27B C27 H27C\n+BOND C28 H28A C28 H28B C28 C29\n+BOND C29 H29A C29 H29B C29 H29C\n+\n+!IC table by CHARMM ic generate\n+! I J K L R(I(J/K)) T(I(JK/KJ)) PHI T(JKL) R(KL)\n+IC 2O1 2C2 *2C1 2H1 1.4086 106.58 119.78 109.70 1.1127\n+IC 2O1 2O5 *2C1 2C2 1.4086 111.50 116.31 107.24 1.5145\n+IC 2O2 2C3 *2C2 2H2 1.4309 111.16 -118.10 108.26 1.1178\n+IC 2O2 2C1 *2C2 2C3 1.4309 111.83 -123.96 109.91 1.5160\n+IC 2O3 2C4 *2C3 2H3 1.4264 111.26 117.90 108.28 1.1180\n+IC 2O3 2C2 *2C3 2C4 1.4264 111.39 124.02 110.24 1.5140\n+IC 2O4 2C5 *2C4 2H4 1.4206 110.57 -118.28 108.31 1.1169\n+IC 2O4 2C3 *2C4 2C5 1.4206 111.09 -122.77 110.01 1.5205\n+IC 2C6 2O5 *2C5 2H5 1.5136 108.21 117.45 109.71 1.1170\n+IC 2C6 2C4 *2C5 2O5 1.5136 113.45 120.27 108.47 1.4393\n+IC 2O6 2H62 *2C6 2H61 1.4279 109.33 -117.59 107.84 1.1144\n+IC 2O6 2C5 *2C6 2H62 1.4279 111.19 -121.35 110.14 1.1132\n+IC 2O5 2C1 2C2 2C3 1.4337 107.24 59.91 109.91 1.5160\n+IC 2C1 2C2 2C3 2C4 1.5145 109.91 -55.07 110.24 1.5140\n+IC 2C2 2C3 2C4 2C5 1.5160 110.24 53.20 110.01 1.5205\n+IC 2C3 2C4 2C5 2O5 1.5140 110.01 -56.74 108.47 1.4393\n+IC 2C4 2C5 2O5 2C1 1.5205 108.47 65.03 111.89 1.4337\n+IC 2C5 2O5 2C1 2C2 1.4393 111.89 -66.32 107.24 1.5145\n+IC 2C4 2C5 2C6 2O6 1.5205 113.45 -179.58 111.19 1.4279\n+IC 2C1 2C2 2O2 2HO2 1.5145 111.83 57.17 108.21 0.9664\n+IC 2C2 2C3 2O3 2HO3 1.5160 111.39 -46.46 106.75 0.9668\n+IC 2C3 2C4 2O4 2HO4 1.5140 111.09 48.02 106.84 0.9668\n+IC 2C5 2C6 2O6 2HO6 1.5136 111.19 -61.09 108.59 0.9641\n+IC 2O5 2C1 2O1 C1 1.4337 111.50 -50.94 135.49 3.7640\n+IC 2C1 2O1 C1 C2 1.4086 135.49 153.50 21.51 1.5370\n+IC C1 C2 C3 C4 1.5370 110.69 58.03 109.37 1.5438\n+IC C4 C2 *C3 2O1 1.5438 109.37 120.84 108.43 1.4242\n+IC 2O1 C2 *C3 H3 1.4242 108.43 119.65 108.03 1.1150\n+IC C2 C3 C4 C5 1.5346 109.37 -57.91 111.47 1.5170\n+IC C5 C3 *C4 H4A 1.5170 111.47 121.54 108.05 1.1109\n+IC H4A C3 *C4 H4B 1.1109 108.05 115.31 109.17 1.1101\n+IC C3 C4 C5 C10 1.5438 111.47 54.17 115.36 1.5443\n+IC C10 C4 *C5 C6 1.5443 115.36 -175.94 121.16 1.3423\n+IC C4 C5 C6 C7 1.5170 121.16 -179.24 124.02 1.5009\n+IC C7 C5 *C6 H6 1.5009 124.02 176.94 119.62 1.1000\n+IC C5 C6 C7 C8 1.3423 124.02 12.78 113.03 1.5521\n+IC C8 C6 *C7 H7A 1.5521 113.03 121.71 110.54 1.1117\n+IC H7A C6 *C7 H7B 1.1117 110.54 117.75 108.96 1.1120\n+IC C6 C7 C8 C14 1.5009 113.03 -163.53 109.73 1.5222\n+IC C14 C7 *C8 C9 1.5222 109.73 120.73 111.37 1.5329\n+IC C9 C7 *C8 H8 1.5329 111.37 119.62 107.82 1.1119\n+IC C7 C8 C14 C13 1.5521 109.73 -179.43 115.72 1.5283\n+IC C13 C8 *C14 C15 1.5283 115.72 127.34 117.83 1.5374\n+IC C13 C8 *C14 H14 1.5283 115.72 -116.17 105.54 1.1214\n+IC C8 C14 C15 C16 1.5222 117.83 -165.39 103.20 1.5349\n+IC C16 C14 *C15 H15A 1.5349 103.20 117.56 109.64 1.1113\n+IC H15A C14 *C15 H15B 1.1113 109.64 121.37 112.24 1.1083\n+IC C14 C15 C16 C17 1.5374 103.20 9.72 107.00 1.5661\n+IC C17 C15 *C16 H16A 1.5661 107.00 119.65 109.17 1.1107\n+IC H16A C15 *C16 H16B 1.1107 109.17 120.30 111.32 1.1096\n+IC C13 C16 *C17 C20 1.5485 104.97 131.98 112.00 1.5386\n+IC C13 C16 *C17 H17 1.5485 104.97 -111.67 106.39 1.1162\n+IC C17 C14 *C13 C12 1.5485 100.03 123.06 106.97 1.5441\n+IC C12 C14 *C13 C18 1.5441 106.97 122.35 110.64 1.5517\n+IC C14 C13 C18 H18A 1.5283 110.64 61.74 111.64 1.1075\n+IC H18A C13 *C18 H18B 1.1075 111.64 120.19 110.30 1.1084\n+IC H18A C13 *C18 H18C 1.1075 111.64 -120.87 111.30 1.1069\n+IC C14 C13 C12 C11 1.5283 106.97 55.20 111.51 1.5439\n+IC C11 C13 *C12 H12A 1.5439 111.51 121.23 111.14 1.1070\n+IC H12A C13 *C12 H12B 1.1070 111.14 118.82 108.77 1.1116\n+IC C9 C12 *C11 H11A 1.5592 113.50 121.62 107.29 1.1094\n+IC H11A C12 *C11 H11B 1.1094 107.29 116.00 108.61 1.1099\n+IC C10 C8 *C9 H9 1.5554 113.11 -114.76 104.73 1.1188\n+IC C9 C5 *C10 C19 1.5554 111.93 -119.86 107.51 1.5512\n+IC C19 C5 *C10 C1 1.5512 107.51 -119.45 109.51 1.5588\n+IC C5 C10 C19 H19A 1.5443 107.51 -173.24 110.71 1.1083\n+IC H19A C10 *C19 H19B 1.1083 110.71 118.50 111.65 1.1085\n+IC H19A C10 *C19 H19C 1.1083 110.71 -120.67 110.86 1.1094\n+IC C2 C10 *C1 H1A 1.5370 114.77 122.47 109.21 1.1105\n+IC C2 C10 *C1 H1B 1.5370 114.77 -120.63 108.52 1.1131\n+IC C1 C3 *C2 H2A 1.5370 110.69 121.34 109.33 1.1116\n+IC H2A C3 *C2 H2B 1.1116 109.33 117.64 109.00 1.1114\n+IC C16 C17 C20 C22 1.5661 112.00 58.66 111.73 1.5542\n+IC C22 C17 *C20 C21 1.5542 111.73 122.55 111.07 1.5436\n+IC C21 C17 *C20 H20 1.5436 111.07 119.26 108.60 1.1144\n+IC C17 C20 C21 H21A 1.5386 111.07 67.86 110.94 1.1070\n+IC H21A C20 *C21 H21B 1.1070 110.94 -121.27 110.40 1.1100\n+IC H21A C20 *C21 H21C 1.1070 110.94 118.68 110.85 1.1086\n+IC C17 C20 C22 C23 1.5386 111.73 -163.83 114.17 1.5426\n+IC C23 C20 *C22 H22A 1.5426 114.17 119.51 110.42 1.1113\n+IC H22A C20 *C22 H22B 1.1113 110.42 117.00 108.07 1.1100\n+IC C20 C22 C23 C24 1.5542 114.17 -178.59 113.43 1.5532\n+IC C24 C22 *C23 H23A 1.5532 113.43 121.74 110.70 1.1096\n+IC H23A C22 *C23 H23B 1.1096 110.70 116.73 106.96 1.1100\n+IC C22 C23 C24 C25 1.5426 113.43 -156.26 113.80 1.5315\n+IC C25 C23 *C24 C28 1.5315 113.80 -128.11 110.23 1.5545\n+IC C28 C23 *C24 H24 1.5545 110.23 -115.05 106.66 1.1168\n+IC C23 C24 C25 C26 1.5532 113.80 -53.81 111.63 1.5412\n+IC C26 C24 *C25 C27 1.5412 111.63 124.26 110.09 1.5431\n+IC C26 C24 *C25 H25 1.5412 111.63 -119.14 108.49 1.1146\n+IC C24 C25 C26 H26A 1.5315 111.63 -56.68 110.96 1.1089\n+IC H26A C25 *C26 H26B 1.1089 110.96 121.13 110.95 1.1095\n+IC H26A C25 *C26 H26C 1.1089 110.96 -119.50 109.85 1.1108\n+IC C24 C25 C27 H27A 1.5315 110.09 -65.94 111.26 1.1086\n+IC H27A C25 *C27 H27B 1.1086 111.26 120.86 110.57 1.1102\n+IC H27A C25 *C27 H27C 1.1086 111.26 -119.47 109.95 1.1105\n+IC C23 C24 C28 C29 1.5532 110.23 -167.78 114.60 1.5345\n+IC C29 C24 *C28 H28A 1.5345 114.60 -123.72 109.46 1.1108\n+IC H28A C24 *C28 H28B 1.1108 109.46 -116.03 108.33 1.1120\n+IC C24 C28 C29 H29A 1.5545 114.60 172.32 110.15 1.1115\n+IC H29A C28 *C29 H29B 1.1115 110.15 -119.54 110.35 1.1109\n+IC H29A C28 *C29 H29C 1.1115 110.15 119.71 111.31 1.1100\n+\n+RESI GCAMP 0.000 ! Campesteryl glucoside\n+GROU ! BGLC\n+ATOM 2C1 CC3162 0.290 !\n+ATOM 2H1 HCA1 0.090 !\n+ATOM 2O1 OC301 -0.360 !\n+ATOM 2C5 CC3163 0.110 !\n+ATOM 2H5 HCA1 0.090 !\n+ATOM 2O5 OC3C61 -0.400 !\n+ATOM C3 CRL1 0.090 ! \n+ATOM H3 HGA1 0.090 !\n+GROU !\n+ATOM 2C2 CC3161 0.140 !\n+ATOM 2H2 HCA1 0.090 !\n+ATOM 2O2 OC311 -0.650 !\n+ATOM 2HO2 HCP1 0.420 !\n+GROU !\n+ATOM 2C3 CC3161 0.140 !\n+ATOM 2H3 HCA1 0.090 !\n+ATOM 2O3 OC311 -0.650 !\n+ATOM 2HO3 HCP1 0.420 !\n+GROU\n+ATOM 2C4 CC3161 0.140\n+ATOM 2H4 HCA1 0.090\n+ATOM 2O4 OC311 -0.650\n+ATOM 2HO4 HCP1 0.420\n+GROU\n+ATOM 2C6 CC321 0.050\n+ATOM 2H61 HCA2 0.090\n+ATOM 2H62 HCA2 0.090\n+ATOM 2O6 OC311 -0.650\n+ATOM 2HO6 HCP1 0.420\n+GROUP !\n+ATOM C4 CRL2 -0.18 ! H26B H26C H27C H27B\n+ATOM H4A HGA2 0.09 ! \\ / \\ /\n+ATOM H4B HGA2 0.09 ! C26 C27\n+GROUP ! / \\ / \\\n+ATOM C5 CEL1 0.00 ! H26A \\ H25 / H27A\n+ATOM C6 CEL1 -0.15 ! \\ | /\n+ATOM H6 HEL1 0.15 ! \\ | /\n+GROUP ! \\|/\n+ATOM C7 CRL2 -0.18 ! C25\n+ATOM H7A HGA2 0.09 ! |\n+ATOM H7B HGA2 0.09 ! |\n+GROUP ! |\n+ATOM C8 CRL1 -0.09 ! | \n+ATOM H8 HGA1 0.09 ! | H28B\n+GROUP ! | |\n+ATOM C14 CRL1 -0.09 ! H24--C24-----C28-----H28C\n+ATOM H14 HGA1 0.09 ! | |\n+GROUP ! | H28A\n+ATOM C15 CRL2 -0.18 ! |\n+ATOM H15A HGA2 0.09 ! H23A--C23--H23B\n+ATOM H15B HGA2 0.09 ! |\n+GROUP ! |\n+ATOM C16 CRL2 -0.18 ! |\n+ATOM H16A HGA2 0.09 ! H22A--C22--H22B\n+ATOM H16B HGA2 0.09 ! |\n+GROUP ! H21A |\n+ATOM C17 CRL1 -0.09 ! | |\n+ATOM H17 HGA1 0.09 ! H21B--C21-----C20--H20\n+GROUP ! | |\n+ATOM C13 CRL1 0.00 ! H21C |\n+GROUP ! |\n+ATOM C18 CTL3 -0.27 ! H18C |\n+ATOM H18A HAL3 0.09 ! | | H16B\n+ATOM H18B HAL3 0.09 ! H18B--C18 | |\n+ATOM H18C HAL3 0.09 ! / \\ C17-----C16--H16A\n+GROUP ! H18A \\ |\\ |\n+ATOM C12 CRL2 -0.18 ! \\ | H17 |\n+ATOM H12A HGA2 0.09 ! H12B \\ | | H15B\n+ATOM H12B HGA2 0.09 ! \\ \\| |/\n+GROUP ! H12A--C12-----C13 C15--H15A\n+ATOM C11 CRL2 -0.18 ! / \\ /\n+ATOM H11A HGA2 0.09 ! H11B / \\ /\n+ATOM H11B HGA2 0.09 ! \\ / \\ /\n+GROUP ! H11A--C11 C14--H14\n+ATOM C9 CRL1 -0.09 ! \\ /\n+ATOM H9 HGA1 0.09 ! H19C \\ H8 /\n+GROUP ! | \\ \\ /\n+ATOM C10 CRL1 0.00 ! H19A-C19-H19B C9------C8\n+GROUP ! \\ / \\ \\\n+ATOM C19 CTL3 -0.27 ! H1B \\ / H9 \\ H7A\n+ATOM H19A HAL3 0.09 ! | \\ / \\ /\n+ATOM H19B HAL3 0.09 ! H1A--C1------C10 C7\n+ATOM H19C HAL3 0.09 ! / \\ / \\\n+GROUP ! H2A / \\ / H7B\n+ATOM C1 CRL2 -0.18 ! \\ / \\ ------ /\n+ATOM H1A HGA2 0.09 ! C2 C5------C6\n+ATOM H1B HGA2 0.09 ! / \\ / \\\n+GROUP ! H2B \\ / H6\n+ATOM C2 CRL2 -0.18 ! \\ /\n+ATOM H2A HGA2 0.09 ! H3--C3------C4--H4A\n+ATOM H2B HGA2 0.09 ! | |\n+GROUP ! | H4B\n+ATOM C20 CTL1 -0.09 ! |\n+ATOM H20 HAL1 0.09 ! BGLC-2O1\n+GROUP !\n+ATOM C21 CTL3 -0.27 !\n+ATOM H21A HAL3 0.09 !\n+ATOM H21B HAL3 0.09 !\n+ATOM H21C HAL3 0.09 !\n+GROUP !\n+ATOM C22 CTL2 -0.18 !\n+ATOM H22A HAL2 0.09 !\n+ATOM H22B HAL2 0.09 !\n+GROUP !\n+ATOM C23 CTL2 -0.18 !\n+ATOM H23A HAL2 0.09 !\n+ATOM H23B HAL2 0.09 !\n+GROUP !\n+ATOM C24 CTL1 -0.09 !\n+ATOM H24 HAL1 0.09 !\n+GROUP !\n+ATOM C25 CTL1 -0.09 !\n+ATOM H25 HAL1 0.09 !\n+GROUP !\n+ATOM C26 CTL3 -0.27 !\n+ATOM H26A HAL3 0.09 !\n+ATOM H26B HAL3 0.09 !\n+ATOM H26C HAL3 0.09 !\n+GROUP !\n+ATOM C27 CTL3 -0.27 !\n+ATOM H27A HAL3 0.09 !\n+ATOM H27B HAL3 0.09 !\n+ATOM H27C HAL3 0.09 !\n+GROUP !\n+ATOM C28 CTL3 -0.27 !\n+ATOM H28A HAL3 0.09 !\n+ATOM H28B HAL3 0.09 !\n+ATOM H28C HAL3 0.09 !\n+\n+!\n+BOND 2C1 2O1 2C1 2H1\n+BOND 2C1 2O5 2C1 2C2\n+BOND 2C2 2H2 2C2 2O2 2O2 2HO2 2C2 2C3 \n+BOND 2C3 2H3 2C3 2O3 2O3 2HO3 2C3 2C4 \n+BOND 2C4 2H4 2C4 2O4 2O4 2HO4 2C4 2C5 \n+BOND 2C5 2H5 2C5 2O5 2C5 2C6 \n+BOND 2C6 2H61 2C6 2H62 2C6 2O6 2O6 2HO6 \n+!\n+BOND C3 2O1 C3 H3\n+BOND C3 C2 C2 H2A C2 H2B\n+BOND C2 C1 C1 H1A C1 H1B\n+BOND C3 C4 C4 H4A C4 H4B\n+BOND C4 C5\n+BOND C5 C10\n+BOND C10 C1\n+BOND C10 C19 C19 H19A C19 H19B C19 H19C\n+DOUBLE C5 C6\n+BOND C6 H6\n+BOND C6 C7 C7 H7A C7 H7B\n+BOND C7 C8 C8 H8\n+BOND C8 C9 C9 H9\n+BOND C9 C10\n+BOND C8 C14 C14 H14\n+BOND C14 C13\n+BOND C13 C12 C12 H12A C12 H12B\n+BOND C12 C11 C11 H11A C11 H11B\n+BOND C11 C9\n+BOND C13 C18 C18 H18A C18 H18B C18 H18C\n+BOND C14 C15 C15 H15A C15 H15B\n+BOND C15 C16 C16 H16A C16 H16B\n+BOND C16 C17 C17 H17\n+BOND C17 C13\n+BOND C17 C20 C20 H20\n+BOND C20 C21 C21 H21A C21 H21B C21 H21C\n+BOND C20 C22 C22 H22A C22 H22B\n+BOND C22 C23 C23 H23A C23 H23B\n+BOND C23 C24 C24 H24 C24 C28\n+BOND C24 C25 C25 H25\n+BOND C25 C26 C26 H26A C26 H26B C26 H26C\n+BOND C25 C27 C27 H27A C27 H27B C27 H27C\n+BOND C28 H28A C28 H28B C28 H28C\n+\n+!IC table by CHARMM ic generate\n+! I J K L R(I(J/K)) T(I(JK/KJ)) PHI T(JKL) R(KL)\n+IC 2O1 2C2 *2C1 2H1 1.4081 105.94 119.70 109.70 1.1126\n+IC 2O1 2O5 *2C1 2C2 1.4081 111.59 115.71 107.43 1.5153\n+IC 2O2 2C3 *2C2 2H2 1.4311 111.09 -117.96 108.21 1.1180\n+IC 2O2 2C1 *2C2 2C3 1.4311 111.92 -124.07 110.09 1.5154\n+IC 2O3 2C4 *2C3 2H3 1.4265 111.26 117.96 108.34 1.1180\n+IC 2O3 2C2 *2C3 2C4 1.4265 111.37 123.92 110.13 1.5136\n+IC 2O4 2C5 *2C4 2H4 1.4207 110.62 -118.26 108.28 1.1169\n+IC 2O4 2C3 *2C4 2C5 1.4207 111.06 -122.85 110.07 1.5215\n+IC 2C6 2O5 *2C5 2H5 1.5134 108.13 117.49 109.70 1.1170\n+IC 2C6 2C4 *2C5 2O5 1.5134 113.26 120.21 108.72 1.4397\n+IC 2O6 2H62 *2C6 2H61 1.4290 109.32 -117.58 107.85 1.1139\n+IC 2O6 2C5 *2C6 2H62 1.4290 111.28 -121.36 110.08 1.1132\n+IC 2O5 2C1 2C2 2C3 1.4333 107.43 59.78 110.09 1.5154\n+IC 2C1 2C2 2C3 2C4 1.5153 110.09 -55.03 110.13 1.5136\n+IC 2C2 2C3 2C4 2C5 1.5154 110.13 53.14 110.07 1.5215\n+IC 2C3 2C4 2C5 2O5 1.5136 110.07 -56.65 108.72 1.4397\n+IC 2C4 2C5 2O5 2C1 1.5215 108.72 64.59 111.89 1.4333\n+IC 2C5 2O5 2C1 2C2 1.4397 111.89 -65.79 107.43 1.5153\n+IC 2C4 2C5 2C6 2O6 1.5215 113.26 -179.49 111.28 1.4290\n+IC 2C1 2C2 2O2 2HO2 1.5153 111.92 58.40 108.23 0.9665\n+IC 2C2 2C3 2O3 2HO3 1.5154 111.37 -45.84 106.80 0.9671\n+IC 2C3 2C4 2O4 2HO4 1.5136 111.06 47.66 106.88 0.9667\n+IC 2C5 2C6 2O6 2HO6 1.5134 111.28 -61.57 108.71 0.9628\n+IC 2O5 2C1 2O1 C1 1.4333 111.59 -53.54 137.42 3.7630\n+IC 2C1 2O1 C1 C2 1.4081 137.42 154.47 21.06 1.5364\n+IC C1 C2 C3 C4 1.5364 111.21 56.01 109.65 1.5453\n+IC C4 C2 *C3 2O1 1.5453 109.65 120.63 107.90 1.4244\n+IC 2O1 C2 *C3 H3 1.4244 107.90 119.54 108.27 1.1147\n+IC C2 C3 C4 C5 1.5352 109.65 -55.22 112.54 1.5177\n+IC C5 C3 *C4 H4A 1.5177 112.54 121.67 107.81 1.1109\n+IC H4A C3 *C4 H4B 1.1109 107.81 115.07 108.81 1.1104\n+IC C3 C4 C5 C10 1.5453 112.54 53.05 115.33 1.5436\n+IC C10 C4 *C5 C6 1.5436 115.33 -176.36 121.38 1.3429\n+IC C4 C5 C6 C7 1.5177 121.38 -178.30 123.98 1.5022\n+IC C7 C5 *C6 H6 1.5022 123.98 176.41 119.63 1.1001\n+IC C5 C6 C7 C8 1.3429 123.98 12.76 112.90 1.5529\n+IC C8 C6 *C7 H7A 1.5529 112.90 121.60 110.51 1.1117\n+IC H7A C6 *C7 H7B 1.1117 110.51 117.85 109.10 1.1119\n+IC C6 C7 C8 C14 1.5022 112.90 -164.66 109.96 1.5225\n+IC C14 C7 *C8 C9 1.5225 109.96 121.09 110.99 1.5329\n+IC C9 C7 *C8 H8 1.5329 110.99 119.49 107.78 1.1119\n+IC C7 C8 C14 C13 1.5529 109.96 179.79 115.56 1.5288\n+IC C13 C8 *C14 C15 1.5288 115.56 126.99 117.68 1.5373\n+IC C13 C8 *C14 H14 1.5288 115.56 -116.28 105.71 1.1211\n+IC C8 C14 C15 C16 1.5225 117.68 -164.42 103.33 1.5351\n+IC C16 C14 *C15 H15A 1.5351 103.33 117.45 109.56 1.1115\n+IC H15A C14 *C15 H15B 1.1115 109.56 121.35 112.27 1.1084\n+IC C14 C15 C16 C17 1.5373 103.33 9.31 107.09 1.5659\n+IC C17 C15 *C16 H16A 1.5659 107.09 119.55 108.96 1.1109\n+IC H16A C15 *C16 H16B 1.1109 108.96 120.21 111.43 1.1093\n+IC C13 C16 *C17 C20 1.5480 104.85 131.64 112.13 1.5396\n+IC C13 C16 *C17 H17 1.5480 104.85 -111.79 106.40 1.1160\n+IC C17 C14 *C13 C12 1.5480 100.31 123.21 106.74 1.5437\n+IC C12 C14 *C13 C18 1.5437 106.74 122.37 110.70 1.5519\n+IC C14 C13 C18 H18A 1.5288 110.70 61.58 111.56 1.1077\n+IC H18A C13 *C18 H18B 1.1077 111.56 120.16 110.24 1.1086\n+IC H18A C13 *C18 H18C 1.1077 111.56 -120.80 111.44 1.1066\n+IC C14 C13 C12 C11 1.5288 106.74 56.34 111.32 1.5434\n+IC C11 C13 *C12 H12A 1.5434 111.32 121.18 111.42 1.1063\n+IC H12A C13 *C12 H12B 1.1063 111.42 118.88 108.78 1.1116\n+IC C9 C12 *C11 H11A 1.5594 113.54 121.81 107.21 1.1091\n+IC H11A C12 *C11 H11B 1.1091 107.21 115.85 108.56 1.1100\n+IC C10 C8 *C9 H9 1.5551 112.75 -114.70 104.69 1.1190\n+IC C9 C5 *C10 C19 1.5551 111.95 -119.97 107.70 1.5521\n+IC C19 C5 *C10 C1 1.5521 107.70 -119.60 109.10 1.5574\n+IC C5 C10 C19 H19A 1.5436 107.70 -172.87 110.72 1.1082\n+IC H19A C10 *C19 H19B 1.1082 110.72 118.54 111.72 1.1083\n+IC H19A C10 *C19 H19C 1.1082 110.72 -120.67 110.92 1.1094\n+IC C2 C10 *C1 H1A 1.5364 114.67 122.15 109.18 1.1106\n+IC C2 C10 *C1 H1B 1.5364 114.67 -120.90 108.59 1.1131\n+IC C1 C3 *C2 H2A 1.5364 111.21 121.57 109.25 1.1116\n+IC H2A C3 *C2 H2B 1.1116 109.25 117.37 108.87 1.1116\n+IC C16 C17 C20 C22 1.5659 112.13 55.85 111.76 1.5544\n+IC C22 C17 *C20 C21 1.5544 111.76 123.13 110.93 1.5438\n+IC C21 C17 *C20 H20 1.5438 110.93 119.03 108.69 1.1145\n+IC C17 C20 C21 H21A 1.5396 110.93 67.25 110.85 1.1067\n+IC H21A C20 *C21 H21B 1.1067 110.85 -121.42 110.50 1.1099\n+IC H21A C20 *C21 H21C 1.1067 110.85 118.26 110.94 1.1084\n+IC C17 C20 C22 C23 1.5396 111.76 -169.24 114.25 1.5414\n+IC C23 C20 *C22 H22A 1.5414 114.25 119.27 109.91 1.1112\n+IC H22A C20 *C22 H22B 1.1112 109.91 117.52 108.59 1.1107\n+IC C20 C22 C23 C24 1.5544 114.25 172.63 113.31 1.5490\n+IC C24 C22 *C23 H23A 1.5490 113.31 121.75 109.89 1.1097\n+IC H23A C22 *C23 H23B 1.1097 109.89 117.18 107.56 1.1109\n+IC C22 C23 C24 C25 1.5414 113.31 -167.66 114.95 1.5287\n+IC C25 C23 *C24 C28 1.5287 114.95 -124.07 111.77 1.5454\n+IC C28 C23 *C24 H24 1.5454 111.77 -117.26 107.38 1.1166\n+IC C23 C24 C25 C26 1.5490 114.95 -51.50 112.04 1.5418\n+IC C26 C24 *C25 C27 1.5418 112.04 123.99 109.40 1.5419\n+IC C26 C24 *C25 H25 1.5418 112.04 -119.29 108.05 1.1160\n+IC C24 C25 C26 H26A 1.5287 112.04 -57.05 111.33 1.1092\n+IC H26A C25 *C26 H26B 1.1092 111.33 121.22 110.82 1.1095\n+IC H26A C25 *C26 H26C 1.1092 111.33 -119.73 109.79 1.1105\n+IC C24 C25 C27 H27A 1.5287 109.40 -65.02 110.99 1.1090\n+IC H27A C25 *C27 H27B 1.1090 110.99 120.78 110.60 1.1105\n+IC H27A C25 *C27 H27C 1.1090 110.99 -119.50 110.05 1.1102\n+IC C23 C24 C28 H28C 1.5490 111.77 178.60 110.60 1.1100\n+IC H28C C24 *C28 H28A 1.1100 110.60 -120.57 110.78 1.1093\n+IC H28A C24 *C28 H28B 1.1093 110.78 -119.84 110.51 1.1095\n+\n+RESI PGSTIG 0.000 ! 16:0 palmitoyl stigmasteryl glucoside\n+GROU ! BGLC\n+ATOM 2C1 CC3162 0.290 !\n+ATOM 2H1 HCA1 0.090 !\n+ATOM 2O1 OC301 -0.360 !\n+ATOM 2C5 CC3163 0.110 !\n+ATOM 2H5 HCA1 0.090 !\n+ATOM 2O5 OC3C61 -0.400 !\n+ATOM C3 CRL1 0.090 !\n+ATOM H3 HGA1 0.090 !\n+GROU !\n+ATOM 2C2 CC3161 0.140 !\n+ATOM 2H2 HCA1 0.090 !\n+ATOM 2O2 OC311 -0.650 !\n+ATOM 2HO2 HCP1 0.420 !\n+GROU !\n+ATOM 2C3 CC3161 0.140 !\n+ATOM 2H3 HCA1 0.090 !\n+ATOM 2O3 OC311 -0.650 !\n+ATOM 2HO3 HCP1 0.420 !\n+GROU\n+ATOM 2C4 CC3161 0.140 !\n+ATOM 2H4 HCA1 0.090 !\n+ATOM 2O4 OC311 -0.650 !\n+ATOM 2HO4 HCP1 0.420 !\n+GROU\n+ATOM 2C6 CC321 0.080 !\n+ATOM 2H61 HCA2 0.090 !\n+ATOM 2H62 HCA2 0.090 !\n+ATOM 2O6 OSL -0.490 !\n+ATOM 3C1 CL 0.90 ! O1=C1\n+ATOM 3O1 OBL -0.63 ! |\n+ATOM 3C2 CTL2 -0.22 ! H2A-C2-H2B\n+ATOM 3H2A HAL2 0.09 ! |\n+ATOM 3H2B HAL2 0.09 ! |\n+GROUP ! |\n+ATOM 3C3 CTL2 -0.18 ! H3A-C3-H3B\n+ATOM 3H3A HAL2 0.09 ! |\n+ATOM 3H3B HAL2 0.09 ! |\n+GROUP ! |\n+ATOM 3C4 CTL2 -0.18 ! H4A-C4-H4B\n+ATOM 3H4A HAL2 0.09 ! |\n+ATOM 3H4B HAL2 0.09 ! |\n+GROUP ! |\n+ATOM 3C5 CTL2 -0.18 ! H5A-C5-H5B\n+ATOM 3H5A HAL2 0.09 ! |\n+ATOM 3H5B HAL2 0.09 ! |\n+GROUP ! |\n+ATOM 3C6 CTL2 -0.18 ! H6A-C6-H6B\n+ATOM 3H6A HAL2 0.09 ! |\n+ATOM 3H6B HAL2 0.09 ! |\n+GROUP ! |\n+ATOM 3C7 CTL2 -0.18 ! H7A-C7-H7B\n+ATOM 3H7A HAL2 0.09 ! |\n+ATOM 3H7B HAL2 0.09 ! |\n+GROUP ! |\n+ATOM 3C8 CTL2 -0.18 ! H8A-C8-H8B\n+ATOM 3H8A HAL2 0.09 ! |\n+ATOM 3H8B HAL2 0.09 ! |\n+GROUP ! |\n+ATOM 3C9 CTL2 -0.18 ! H9A-C9-H9B\n+ATOM 3H9A HAL2 0.09 ! |\n+ATOM 3H9B HAL2 0.09 ! |\n+GROUP ! |\n+ATOM 3C10 CTL2 -0.18 ! H10A-C10-H10B\n+ATOM 3H10A HAL2 0.09 ! |\n+ATOM 3H10B HAL2 0.09 ! |\n+GROUP ! |\n+ATOM 3C11 CTL2 -0.18 ! H11A-C11-H11B\n+ATOM 3H11A HAL2 0.09 ! |\n+ATOM 3H11B HAL2 0.09 ! |\n+GROUP ! |\n+ATOM 3C12 CTL2 -0.18 ! H12A-C12-H12B\n+ATOM 3H12A HAL2 0.09 ! |\n+ATOM 3H12B HAL2 0.09 ! |\n+GROUP ! |\n+ATOM 3C13 CTL2 -0.18 ! H13A-C13-H13B\n+ATOM 3H13A HAL2 0.09 ! |\n+ATOM 3H13B HAL2 0.09 ! |\n+GROUP ! |\n+ATOM 3C14 CTL2 -0.18 ! H14A-C14-H14B\n+ATOM 3H14A HAL2 0.09 ! |\n+ATOM 3H14B HAL2 0.09 ! |\n+GROUP ! |\n+ATOM 3C15 CTL2 -0.18 ! H15A-C15-H15B\n+ATOM 3H15A HAL2 0.09 ! |\n+ATOM 3H15B HAL2 0.09 ! |\n+GROUP ! |\n+ATOM 3C16 CTL3 -0.27 ! H16A-C16-H16B\n+ATOM 3H16A HAL3 0.09 ! |\n+ATOM 3H16B HAL3 0.09 ! H16C\n+ATOM 3H16C HAL3 0.09 !\n+!\n+GROUP !\n+ATOM C4 CRL2 -0.18 ! H26B H26C H27C H27B\n+ATOM H4A HGA2 0.09 ! \\ / \\ /\n+ATOM H4B HGA2 0.09 ! C26 C27\n+GROUP ! / \\ / \\\n+ATOM C5 CEL1 0.00 ! H26A \\ H25 / H27A\n+ATOM C6 CEL1 -0.15 ! \\ | /\n+ATOM H6 HEL1 0.15 ! \\ | /\n+GROUP ! \\|/\n+ATOM C7 CRL2 -0.18 ! C25\n+ATOM H7A HGA2 0.09 ! |\n+ATOM H7B HGA2 0.09 ! |\n+GROUP ! |\n+ATOM C8 CRL1 -0.09 ! | \n+ATOM H8 HGA1 0.09 ! | H28B H29A\n+GROUP ! | | |\n+ATOM C14 CRL1 -0.09 ! H24--C24-----C28-----C29--H29B\n+ATOM H14 HGA1 0.09 ! | | |\n+GROUP ! | H28A H29C\n+ATOM C15 CRL2 -0.18 ! |\n+ATOM H15A HGA2 0.09 ! C23--H23\n+ATOM H15B HGA2 0.09 ! ||\n+GROUP ! || (trans)\n+ATOM C16 CRL2 -0.18 ! ||\n+ATOM H16A HGA2 0.09 ! H22--C22\n+ATOM H16B HGA2 0.09 ! |\n+GROUP ! H21A |\n+ATOM C17 CRL1 -0.09 ! | |\n+ATOM H17 HGA1 0.09 ! H21B--C21-----C20--H20\n+GROUP ! | |\n+ATOM C13 CRL1 0.00 ! H21C |\n+GROUP ! |\n+ATOM C18 CTL3 -0.27 ! H18C |\n+ATOM H18A HAL3 0.09 ! | | H16B\n+ATOM H18B HAL3 0.09 ! H18B--C18 | |\n+ATOM H18C HAL3 0.09 ! / \\ C17-----C16--H16A\n+GROUP ! H18A \\ |\\ |\n+ATOM C12 CRL2 -0.18 ! \\ | H17 |\n+ATOM H12A HGA2 0.09 ! H12B \\ | | H15B\n+ATOM H12B HGA2 0.09 ! \\ \\| |/\n+GROUP ! H12A--C12-----C13 C15--H15A\n+ATOM C11 CRL2 -0.18 ! / \\ /\n+ATOM H11A HGA2 0.09 ! H11B / \\ /\n+ATOM H11B HGA2 0.09 ! \\ / \\ /\n+GROUP ! H11A--C11 C14--H14\n+ATOM C9 CRL1 -0.09 ! \\ /\n+ATOM H9 HGA1 0.09 ! H19C \\ H8 /\n+GROUP ! | \\ \\ /\n+ATOM C10 CRL1 0.00 ! H19A-C19-H19B C9------C8\n+GROUP ! \\ / \\ \\\n+ATOM C19 CTL3 -0.27 ! H1B \\ / H9 \\ H7A\n+ATOM H19A HAL3 0.09 ! | \\ / \\ /\n+ATOM H19B HAL3 0.09 ! H1A--C1------C10 C7\n+ATOM H19C HAL3 0.09 ! / \\ / \\\n+GROUP ! H2A / \\ / H7B\n+ATOM C1 CRL2 -0.18 ! \\ / \\ ------ /\n+ATOM H1A HGA2 0.09 ! C2 C5------C6\n+ATOM H1B HGA2 0.09 ! / \\ / \\\n+GROUP ! H2B \\ / H6\n+ATOM C2 CRL2 -0.18 ! \\ /\n+ATOM H2A HGA2 0.09 ! H3--C3------C4--H4A\n+ATOM H2B HGA2 0.09 ! | |\n+GROUP ! | H4B\n+ATOM C20 CTL1 -0.09 ! |\n+ATOM H20 HAL1 0.09 ! BGLC--2O1\n+GROUP !\n+ATOM C21 CTL3 -0.27 !\n+ATOM H21A HAL3 0.09 !\n+ATOM H21B HAL3 0.09 !\n+ATOM H21C HAL3 0.09 !\n+GROUP !\n+ATOM C22 CEL1 -0.15 !\n+ATOM C23 CEL1 -0.15 !\n+ATOM H22 HEL1 0.15 !\n+ATOM H23 HEL1 0.15 !\n+GROUP !\n+ATOM C24 CTL1 -0.09 !\n+ATOM H24 HAL1 0.09 !\n+GROUP !\n+ATOM C25 CTL1 -0.09 !\n+ATOM H25 HAL1 0.09 !\n+GROUP !\n+ATOM C26 CTL3 -0.27 !\n+ATOM H26A HAL3 0.09 !\n+ATOM H26B HAL3 0.09 !\n+ATOM H26C HAL3 0.09 !\n+GROUP !\n+ATOM C27 CTL3 -0.27 !\n+ATOM H27A HAL3 0.09 !\n+ATOM H27B HAL3 0.09 !\n+ATOM H27C HAL3 0.09 !\n+GROUP !\n+ATOM C28 CTL2 -0.18 !\n+ATOM H28A HAL2 0.09 !\n+ATOM H28B HAL2 0.09 !\n+GROUP !\n+ATOM C29 CTL3 -0.27 !\n+ATOM H29A HAL3 0.09 !\n+ATOM H29B HAL3 0.09 !\n+ATOM H29C HAL3 0.09 !\n+\n+!\n+BOND 2C1 2O1 2C1 2H1\n+BOND 2C1 2O5 2C1 2C2\n+BOND 2C2 2H2 2C2 2O2 2O2 2HO2 2C2 2C3 \n+BOND 2C3 2H3 2C3 2O3 2O3 2HO3 2C3 2C4 \n+BOND 2C4 2H4 2C4 2O4 2O4 2HO4 2C4 2C5 \n+BOND 2C5 2H5 2C5 2O5 2C5 2C6 \n+BOND 2C6 2H61 2C6 2H62 2C6 2O6\n+\n+BOND 2O6 3C1\n+DOUBLE 3C1 3O1\n+BOND 3C1 3C2 3C2 3H2A 3C2 3H2B\n+BOND 3C2 3C3 3C3 3H3A 3C3 3H3B\n+BOND 3C3 3C4 3C4 3H4A 3C4 3H4B\n+BOND 3C4 3C5 3C5 3H5A 3C5 3H5B\n+BOND 3C5 3C6 3C6 3H6A 3C6 3H6B\n+BOND 3C6 3C7 3C7 3H7A 3C7 3H7B\n+BOND 3C7 3C8 3C8 3H8A 3C8 3H8B\n+BOND 3C8 3C9 3C9 3H9A 3C9 3H9B\n+BOND 3C9 3C10 3C10 3H10A 3C10 3H10B\n+BOND 3C10 3C11 3C11 3H11A 3C11 3H11B\n+BOND 3C11 3C12 3C12 3H12A 3C12 3H12B\n+BOND 3C12 3C13 3C13 3H13A 3C13 3H13B\n+BOND 3C13 3C14 3C14 3H14A 3C14 3H14B\n+BOND 3C14 3C15 3C15 3H15A 3C15 3H15B\n+BOND 3C15 3C16 3C16 3H16A 3C16 3H16B 3C16 3H16C\n+IMPR 3C1 3O1 2O6 3C2\n+\n+ACCEPTOR 3O1 3C1\n+!\n+BOND C3 2O1 C3 H3\n+BOND C3 C2 C2 H2A C2 H2B\n+BOND C2 C1 C1 H1A C1 H1B\n+BOND C3 C4 C4 H4A C4 H4B\n+BOND C4 C5\n+BOND C5 C10\n+BOND C10 C1\n+BOND C10 C19 C19 H19A C19 H19B C19 H19C\n+DOUBLE C5 C6\n+BOND C6 H6\n+BOND C6 C7 C7 H7A C7 H7B\n+BOND C7 C8 C8 H8\n+BOND C8 C9 C9 H9\n+BOND C9 C10\n+BOND C8 C14 C14 H14\n+BOND C14 C13\n+BOND C13 C12 C12 H12A C12 H12B\n+BOND C12 C11 C11 H11A C11 H11B\n+BOND C11 C9\n+BOND C13 C18 C18 H18A C18 H18B C18 H18C\n+BOND C14 C15 C15 H15A C15 H15B\n+BOND C15 C16 C16 H16A C16 H16B\n+BOND C16 C17 C17 H17\n+BOND C17 C13\n+BOND C17 C20 C20 H20\n+BOND C20 C21 C21 H21A C21 H21B C21 H21C\n+BOND C20 C22 C22 H22\n+DOUBLE C22 C23\n+BOND C23 H23\n+BOND C23 C24 C24 H24 C24 C28\n+BOND C24 C25 C25 H25\n+BOND C25 C26 C26 H26A C26 H26B C26 H26C\n+BOND C25 C27 C27 H27A C27 H27B C27 H27C\n+BOND C28 H28A C28 H28B C28 C29\n+BOND C29 H29A C29 H29B C29 H29C\n+\n+! I J K L R(I(J/K)) T(I(JK/KJ)) PHI T(JKL) R(KL)\n+IC 2O1 2C2 *2C1 2H1 1.4070 105.51 119.72 109.69 1.1123\n+IC 2O1 2O5 *2C1 2C2 1.4070 111.52 115.44 107.92 1.5151\n+IC 2O2 2C3 *2C2 2H2 1.4317 111.11 -118.00 108.21 1.1179\n+IC 2O2 2C1 *2C2 2C3 1.4317 111.90 -124.08 110.10 1.5140\n+IC 2O3 2C4 *2C3 2H3 1.4260 111.34 118.16 108.45 1.1181\n+IC 2O3 2C2 *2C3 2C4 1.4260 111.45 123.76 109.66 1.5121\n+IC 2O4 2C5 *2C4 2H4 1.4208 110.69 -118.19 108.39 1.1168\n+IC 2O4 2C3 *2C4 2C5 1.4208 111.10 -122.93 110.02 1.5221\n+IC 2C6 2O5 *2C5 2H5 1.5204 109.34 119.13 109.37 1.1149\n+IC 2C6 2C4 *2C5 2O5 1.5204 112.28 120.94 108.48 1.4381\n+IC 2O6 2H62 *2C6 2H61 1.4296 107.83 -119.18 106.46 1.1162\n+IC 2O6 2C5 *2C6 2H62 1.4296 113.19 -119.17 107.79 1.1143\n+IC 2O5 2C1 2C2 2C3 1.4341 107.92 59.36 110.10 1.5140\n+IC 2C1 2C2 2C3 2C4 1.5151 110.10 -55.34 109.66 1.5121\n+IC 2C2 2C3 2C4 2C5 1.5140 109.66 54.35 110.02 1.5221\n+IC 2C3 2C4 2C5 2O5 1.5121 110.02 -57.76 108.48 1.4381\n+IC 2C4 2C5 2O5 2C1 1.5221 108.48 64.37 111.84 1.4341\n+IC 2C5 2O5 2C1 2C2 1.4381 111.84 -65.02 107.92 1.5151\n+IC 2C4 2C5 2C6 2O6 1.5221 112.28 175.35 113.19 1.4296\n+IC 2C1 2C2 2O2 2HO2 1.5151 111.90 57.82 108.03 0.9662\n+IC 2C2 2C3 2O3 2HO3 1.5140 111.45 -45.78 106.67 0.9676\n+IC 2C3 2C4 2O4 2HO4 1.5121 111.10 44.70 106.77 0.9663\n+IC 2C5 2C6 2O6 3C1 1.5204 113.19 76.33 115.99 1.3285\n+IC 2C6 2O6 3C1 3C2 1.4296 115.99 168.17 108.74 1.5289\n+IC 3C2 2O6 *3C1 3O1 1.5289 108.74 -178.93 125.84 1.2161\n+IC 2O6 3C1 3C2 3C3 1.3285 108.74 -174.20 112.61 1.5456\n+IC 3C3 3C1 *3C2 3H2A 1.5456 112.61 -122.93 108.80 1.1082\n+IC 3H2A 3C1 *3C2 3H2B 1.1082 108.80 -117.08 106.96 1.1108\n+IC 3C1 3C2 3C3 3C4 1.5289 112.61 162.24 112.17 1.5345\n+IC 3C4 3C2 *3C3 3H3A 1.5345 112.17 -119.22 109.83 1.1157\n+IC 3H3A 3C2 *3C3 3H3B 1.1157 109.83 -117.99 109.97 1.1128\n+IC 3C2 3C3 3C4 3C5 1.5456 112.17 -179.25 112.67 1.5351\n+IC 3C5 3C3 *3C4 3H4A 1.5351 112.67 -122.27 109.87 1.1125\n+IC 3H4A 3C3 *3C4 3H4B 1.1125 109.87 -117.43 108.48 1.1139\n+IC 3C3 3C4 3C5 3C6 1.5345 112.67 169.13 112.61 1.5351\n+IC 3C6 3C4 *3C5 3H5A 1.5351 112.61 -120.43 109.05 1.1139\n+IC 3H5A 3C4 *3C5 3H5B 1.1139 109.05 -117.45 109.25 1.1127\n+IC 3C4 3C5 3C6 3C7 1.5351 112.61 177.74 112.78 1.5350\n+IC 3C7 3C5 *3C6 3H6A 1.5350 112.78 -121.68 109.50 1.1129\n+IC 3H6A 3C5 *3C6 3H6B 1.1129 109.50 -117.40 108.70 1.1136\n+IC 3C5 3C6 3C7 3C8 1.5351 112.78 173.60 112.61 1.5350\n+IC 3C8 3C6 *3C7 3H7A 1.5350 112.61 -120.95 109.29 1.1132\n+IC 3H7A 3C6 *3C7 3H7B 1.1132 109.29 -117.44 109.00 1.1129\n+IC 3C6 3C7 3C8 3C9 1.5350 112.61 175.59 112.78 1.5351\n+IC 3C9 3C7 *3C8 3H8A 1.5351 112.78 -121.18 109.23 1.1131\n+IC 3H8A 3C7 *3C8 3H8B 1.1131 109.23 -117.39 108.90 1.1134\n+IC 3C7 3C8 3C9 3C10 1.5350 112.78 175.58 112.59 1.5350\n+IC 3C10 3C8 *3C9 3H9A 1.5350 112.59 -121.18 109.34 1.1129\n+IC 3H9A 3C8 *3C9 3H9B 1.1129 109.34 -117.49 108.89 1.1134\n+IC 3C8 3C9 3C10 3C11 1.5351 112.59 174.67 112.82 1.5349\n+IC 3C11 3C9 *3C10 3H10A 1.5349 112.82 -120.94 109.04 1.1130\n+IC 3H10A 3C9 *3C10 3H10B 1.1130 109.04 -117.37 109.07 1.1132\n+IC 3C9 3C10 3C11 3C12 1.5350 112.82 178.04 112.62 1.5351\n+IC 3C12 3C10 *3C11 3H11A 1.5351 112.62 -121.42 109.32 1.1127\n+IC 3H11A 3C10 *3C11 3H11B 1.1127 109.32 -117.44 108.87 1.1134\n+IC 3C10 3C11 3C12 3C13 1.5349 112.62 175.31 112.74 1.5351\n+IC 3C13 3C11 *3C12 3H12A 1.5351 112.74 -121.00 109.01 1.1132\n+IC 3H12A 3C11 *3C12 3H12B 1.1132 109.01 -117.37 109.08 1.1132\n+IC 3C11 3C12 3C13 3C14 1.5351 112.74 178.87 112.67 1.5352\n+IC 3C14 3C12 *3C13 3H13A 1.5352 112.67 -121.43 109.23 1.1131\n+IC 3H13A 3C12 *3C13 3H13B 1.1131 109.23 -117.44 108.94 1.1133\n+IC 3C12 3C13 3C14 3C15 1.5351 112.67 177.62 112.73 1.5344\n+IC 3C15 3C13 *3C14 3H14A 1.5344 112.73 -121.25 109.16 1.1132\n+IC 3H14A 3C13 *3C14 3H14B 1.1132 109.16 -117.37 109.06 1.1130\n+IC 3C13 3C14 3C15 3C16 1.5352 112.73 178.91 113.43 1.5311\n+IC 3C16 3C14 *3C15 3H15A 1.5311 113.43 -121.72 108.80 1.1140\n+IC 3H15A 3C14 *3C15 3H15B 1.1140 108.80 -116.66 108.67 1.1140\n+IC 3C14 3C15 3C16 3H16A 1.5344 113.43 -60.59 110.45 1.1112\n+IC 3H16A 3C15 *3C16 3H16B 1.1112 110.45 119.92 110.52 1.1113\n+IC 3H16A 3C15 *3C16 3H16C 1.1112 110.45 -120.01 110.58 1.1113\n+IC 2O5 2C1 2O1 C1 1.4341 111.52 -58.57 137.88 3.7616\n+IC 2C1 2O1 C1 C2 1.4070 137.88 148.30 20.85 1.5363\n+IC C1 C2 C3 C4 1.5363 111.64 53.88 109.99 1.5466\n+IC C4 C2 *C3 2O1 1.5466 109.99 120.13 107.64 1.4231\n+IC 2O1 C2 *C3 H3 1.4231 107.64 119.62 108.48 1.1152\n+IC C2 C3 C4 C5 1.5358 109.99 -52.92 113.26 1.5166\n+IC C5 C3 *C4 H4A 1.5166 113.26 -123.63 108.64 1.1106\n+IC H4A C3 *C4 H4B 1.1106 108.64 -114.62 107.62 1.1110\n+IC C3 C4 C5 C10 1.5466 113.26 52.77 115.14 1.5424\n+IC C10 C4 *C5 C6 1.5424 115.14 -176.92 121.62 1.3440\n+IC C4 C5 C6 C7 1.5166 121.62 -177.48 123.88 1.5022\n+IC C7 C5 *C6 H6 1.5022 123.88 175.80 119.57 1.1000\n+IC C5 C6 C7 C8 1.3440 123.88 13.70 112.62 1.5531\n+IC C8 C6 *C7 H7A 1.5531 112.62 121.40 110.50 1.1117\n+IC H7A C6 *C7 H7B 1.1117 110.50 118.00 109.30 1.1119\n+IC C6 C7 C8 C14 1.5022 112.62 -166.25 110.18 1.5223\n+IC C14 C7 *C8 C9 1.5223 110.18 121.35 110.81 1.5336\n+IC C9 C7 *C8 H8 1.5336 110.81 119.30 107.68 1.1120\n+IC C7 C8 C14 C13 1.5531 110.18 179.36 115.31 1.5278\n+IC C13 C8 *C14 C15 1.5278 115.31 126.70 117.81 1.5386\n+IC C13 C8 *C14 H14 1.5278 115.31 -116.32 105.79 1.1209\n+IC C8 C14 C15 C16 1.5223 117.81 -163.74 103.51 1.5362\n+IC C16 C14 *C15 H15A 1.5362 103.51 -121.31 112.17 1.1081\n+IC H15A C14 *C15 H15B 1.1081 112.17 -121.25 109.52 1.1113\n+IC C14 C15 C16 C17 1.5386 103.51 8.84 106.86 1.5661\n+IC C17 C15 *C16 H16A 1.5661 106.86 -120.14 111.60 1.1091\n+IC H16A C15 *C16 H16B 1.1091 111.60 -120.24 109.10 1.1108\n+IC C13 C16 *C17 C20 1.5463 104.94 130.88 112.39 1.5376\n+IC C13 C16 *C17 H17 1.5463 104.94 -111.37 106.30 1.1170\n+IC C17 C14 *C13 C12 1.5463 100.37 123.13 107.01 1.5422\n+IC C12 C14 *C13 C18 1.5422 107.01 122.37 110.81 1.5519\n+IC C14 C13 C18 H18A 1.5278 110.81 -177.73 110.07 1.1091\n+IC H18A C13 *C18 H18B 1.1091 110.07 -120.22 111.55 1.1078\n+IC H18A C13 *C18 H18C 1.1091 110.07 118.96 111.51 1.1066\n+IC C14 C13 C12 C11 1.5278 107.01 56.76 111.14 1.5425\n+IC C11 C13 *C12 H12A 1.5425 111.14 -120.01 108.92 1.1115\n+IC H12A C13 *C12 H12B 1.1115 108.92 -118.96 111.14 1.1067\n+IC C9 C12 *C11 H11A 1.5600 113.63 -122.42 108.67 1.1100\n+IC H11A C12 *C11 H11B 1.1100 108.67 -115.70 106.98 1.1089\n+IC C10 C8 *C9 H9 1.5544 112.52 -114.71 104.69 1.1189\n+IC C9 C5 *C10 C19 1.5544 112.13 -120.07 107.95 1.5527\n+IC C19 C5 *C10 C1 1.5527 107.95 -119.58 108.51 1.5566\n+IC C5 C10 C19 H19A 1.5424 107.95 -171.93 110.70 1.1082\n+IC H19A C10 *C19 H19B 1.1082 110.70 -120.71 110.87 1.1093\n+IC H19A C10 *C19 H19C 1.1082 110.70 118.45 111.89 1.1079\n+IC C2 C10 *C1 H1A 1.5363 114.50 -121.05 108.71 1.1131\n+IC C2 C10 *C1 H1B 1.5363 114.50 121.97 109.21 1.1105\n+IC C1 C3 *C2 H2A 1.5363 111.64 -121.05 108.81 1.1116\n+IC H2A C3 *C2 H2B 1.1116 108.81 -117.12 109.12 1.1117\n+IC C16 C17 C20 C22 1.5661 112.39 54.65 110.67 1.5169\n+IC C22 C17 *C20 C21 1.5169 110.67 119.46 111.85 1.5448\n+IC C21 C17 *C20 H20 1.5448 111.85 119.83 109.23 1.1139\n+IC C17 C20 C21 H21A 1.5376 111.85 -171.81 111.01 1.1117\n+IC H21A C20 *C21 H21B 1.1117 111.01 120.98 111.05 1.1104\n+IC H21A C20 *C21 H21C 1.1117 111.01 -118.11 110.36 1.1076\n+IC C17 C20 C22 C23 1.5376 110.67 -119.13 124.91 1.3446\n+IC C23 C20 *C22 H22 1.3446 124.91 -179.67 115.68 1.1000\n+IC C20 C22 C23 C24 1.5169 124.91 -179.45 125.15 1.5185\n+IC C24 C22 *C23 H23 1.5185 125.15 178.91 119.26 1.0998\n+IC C22 C23 C24 C25 1.3446 125.15 -111.62 113.74 1.5319\n+IC C25 C23 *C24 C28 1.5319 113.74 -126.60 110.00 1.5529\n+IC C28 C23 *C24 H24 1.5529 110.00 -115.52 109.15 1.1174\n+IC C23 C24 C25 C26 1.5185 113.74 -58.25 112.17 1.5428\n+IC C26 C24 *C25 C27 1.5428 112.17 124.22 109.77 1.5418\n+IC C26 C24 *C25 H25 1.5428 112.17 -118.79 107.74 1.1162\n+IC C24 C25 C26 H26A 1.5319 112.17 -177.41 109.77 1.1107\n+IC H26A C25 *C26 H26B 1.1107 109.77 -119.16 110.94 1.1095\n+IC H26A C25 *C26 H26C 1.1107 109.77 119.54 111.12 1.1090\n+IC C24 C25 C27 H27A 1.5319 109.77 -65.62 110.65 1.1097\n+IC H27A C25 *C27 H27B 1.1097 110.65 -119.54 110.12 1.1104\n+IC H27A C25 *C27 H27C 1.1097 110.65 120.48 110.56 1.1101\n+IC C23 C24 C28 C29 1.5185 110.00 -64.69 113.69 1.5352\n+IC C29 C24 *C28 H28A 1.5352 113.69 -120.28 107.85 1.1136\n+IC H28A C24 *C28 H28B 1.1136 107.85 -116.73 110.11 1.1119\n+IC C24 C28 C29 H29A 1.5529 113.69 -176.68 110.44 1.1111\n+IC H29A C28 *C29 H29B 1.1111 110.44 -119.95 110.88 1.1109\n+IC H29A C28 *C29 H29C 1.1111 110.44 119.93 110.43 1.1109\n+\n+RESI PGSITO 0.000 ! 16:0 palmitoyl sitosteryl glucoside\n+GROU ! BGLC\n+ATOM 2C1 CC3162 0.290 !\n+ATOM 2H1 HCA1 0.090 !\n+ATOM 2O1 OC301 -0.360 !\n+ATOM 2C5 CC3163 0.110 !\n+ATOM 2H5 HCA1 0.090 !\n+ATOM 2O5 OC3C61 -0.400 !\n+ATOM C3 CRL1 0.090 ! \n+ATOM H3 HGA1 0.090 !\n+GROU !\n+ATOM 2C2 CC3161 0.140 !\n+ATOM 2H2 HCA1 0.090 !\n+ATOM 2O2 OC311 -0.650 !\n+ATOM 2HO2 HCP1 0.420 !\n+GROU !\n+ATOM 2C3 CC3161 0.140 !\n+ATOM 2H3 HCA1 0.090 !\n+ATOM 2O3 OC311 -0.650 !\n+ATOM 2HO3 HCP1 0.420 !\n+GROU\n+ATOM 2C4 CC3161 0.140\n+ATOM 2H4 HCA1 0.090\n+ATOM 2O4 OC311 -0.650\n+ATOM 2HO4 HCP1 0.420\n+GROU\n+ATOM 2C6 CC321 0.080 !\n+ATOM 2H61 HCA2 0.090 !\n+ATOM 2H62 HCA2 0.090 !\n+ATOM 2O6 OSL -0.490 !\n+ATOM 3C1 CL 0.90 ! O1=C1\n+ATOM 3O1 OBL -0.63 ! |\n+ATOM 3C2 CTL2 -0.22 ! H2A-C2-H2B\n+ATOM 3H2A HAL2 0.09 ! |\n+ATOM 3H2B HAL2 0.09 ! |\n+GROUP ! |\n+ATOM 3C3 CTL2 -0.18 ! H3A-C3-H3B\n+ATOM 3H3A HAL2 0.09 ! |\n+ATOM 3H3B HAL2 0.09 ! |\n+GROUP ! |\n+ATOM 3C4 CTL2 -0.18 ! H4A-C4-H4B\n+ATOM 3H4A HAL2 0.09 ! |\n+ATOM 3H4B HAL2 0.09 ! |\n+GROUP ! |\n+ATOM 3C5 CTL2 -0.18 ! H5A-C5-H5B\n+ATOM 3H5A HAL2 0.09 ! |\n+ATOM 3H5B HAL2 0.09 ! |\n+GROUP ! |\n+ATOM 3C6 CTL2 -0.18 ! H6A-C6-H6B\n+ATOM 3H6A HAL2 0.09 ! |\n+ATOM 3H6B HAL2 0.09 ! |\n+GROUP ! |\n+ATOM 3C7 CTL2 -0.18 ! H7A-C7-H7B\n+ATOM 3H7A HAL2 0.09 ! |\n+ATOM 3H7B HAL2 0.09 ! |\n+GROUP ! |\n+ATOM 3C8 CTL2 -0.18 ! H8A-C8-H8B\n+ATOM 3H8A HAL2 0.09 ! |\n+ATOM 3H8B HAL2 0.09 ! |\n+GROUP ! |\n+ATOM 3C9 CTL2 -0.18 ! H9A-C9-H9B\n+ATOM 3H9A HAL2 0.09 ! |\n+ATOM 3H9B HAL2 0.09 ! |\n+GROUP ! |\n+ATOM 3C10 CTL2 -0.18 ! H10A-C10-H10B\n+ATOM 3H10A HAL2 0.09 ! |\n+ATOM 3H10B HAL2 0.09 ! |\n+GROUP ! |\n+ATOM 3C11 CTL2 -0.18 ! H11A-C11-H11B\n+ATOM 3H11A HAL2 0.09 ! |\n+ATOM 3H11B HAL2 0.09 ! |\n+GROUP ! |\n+ATOM 3C12 CTL2 -0.18 ! H12A-C12-H12B\n+ATOM 3H12A HAL2 0.09 ! |\n+ATOM 3H12B HAL2 0.09 ! |\n+GROUP ! |\n+ATOM 3C13 CTL2 -0.18 ! H13A-C13-H13B\n+ATOM 3H13A HAL2 0.09 ! |\n+ATOM 3H13B HAL2 0.09 ! |\n+GROUP ! |\n+ATOM 3C14 CTL2 -0.18 ! H14A-C14-H14B\n+ATOM 3H14A HAL2 0.09 ! |\n+ATOM 3H14B HAL2 0.09 ! |\n+GROUP ! |\n+ATOM 3C15 CTL2 -0.18 ! H15A-C15-H15B\n+ATOM 3H15A HAL2 0.09 ! |\n+ATOM 3H15B HAL2 0.09 ! |\n+GROUP ! |\n+ATOM 3C16 CTL3 -0.27 ! H16A-C16-H16B\n+ATOM 3H16A HAL3 0.09 ! |\n+ATOM 3H16B HAL3 0.09 ! H16C\n+ATOM 3H16C HAL3 0.09 !\n+!\n+GROUP !\n+ATOM C4 CRL2 -0.18 ! H26B H26C H27C H27B\n+ATOM H4A HGA2 0.09 ! \\ / \\ /\n+ATOM H4B HGA2 0.09 ! C26 C27\n+GROUP ! / \\ / \\\n+ATOM C5 CEL1 0.00 ! H26A \\ H25 / H27A\n+ATOM C6 CEL1 -0.15 ! \\ | /\n+ATOM H6 HEL1 0.15 ! \\ | /\n+GROUP ! \\|/\n+ATOM C7 CRL2 -0.18 ! C25\n+ATOM H7A HGA2 0.09 ! |\n+ATOM H7B HGA2 0.09 ! |\n+GROUP ! |\n+ATOM C8 CRL1 -0.09 ! | \n+ATOM H8 HGA1 0.09 ! | H28B H29A\n+GROUP ! | | |\n+ATOM C14 CRL1 -0.09 ! H24--C24-----C28-----C29--H29B\n+ATOM H14 HGA1 0.09 ! | | |\n+GROUP ! | H28A H29C\n+ATOM C15 CRL2 -0.18 ! |\n+ATOM H15A HGA2 0.09 ! H23A--C23--H23B\n+ATOM H15B HGA2 0.09 ! |\n+GROUP ! |\n+ATOM C16 CRL2 -0.18 ! |\n+ATOM H16A HGA2 0.09 ! H22A--C22--H22B\n+ATOM H16B HGA2 0.09 ! |\n+GROUP ! H21A |\n+ATOM C17 CRL1 -0.09 ! | |\n+ATOM H17 HGA1 0.09 ! H21B--C21-----C20--H20\n+GROUP ! | |\n+ATOM C13 CRL1 0.00 ! H21C |\n+GROUP ! |\n+ATOM C18 CTL3 -0.27 ! H18C |\n+ATOM H18A HAL3 0.09 ! | | H16B\n+ATOM H18B HAL3 0.09 ! H18B--C18 | |\n+ATOM H18C HAL3 0.09 ! / \\ C17-----C16--H16A\n+GROUP ! H18A \\ |\\ |\n+ATOM C12 CRL2 -0.18 ! \\ | H17 |\n+ATOM H12A HGA2 0.09 ! H12B \\ | | H15B\n+ATOM H12B HGA2 0.09 ! \\ \\| |/\n+GROUP ! H12A--C12-----C13 C15--H15A\n+ATOM C11 CRL2 -0.18 ! / \\ /\n+ATOM H11A HGA2 0.09 ! H11B / \\ /\n+ATOM H11B HGA2 0.09 ! \\ / \\ /\n+GROUP ! H11A--C11 C14--H14\n+ATOM C9 CRL1 -0.09 ! \\ /\n+ATOM H9 HGA1 0.09 ! H19C \\ H8 /\n+GROUP ! | \\ \\ /\n+ATOM C10 CRL1 0.00 ! H19A-C19-H19B C9------C8\n+GROUP ! \\ / \\ \\\n+ATOM C19 CTL3 -0.27 ! H1B \\ / H9 \\ H7A\n+ATOM H19A HAL3 0.09 ! | \\ / \\ /\n+ATOM H19B HAL3 0.09 ! H1A--C1------C10 C7\n+ATOM H19C HAL3 0.09 ! / \\ / \\\n+GROUP ! H2A / \\ / H7B\n+ATOM C1 CRL2 -0.18 ! \\ / \\ ------ /\n+ATOM H1A HGA2 0.09 ! C2 C5------C6\n+ATOM H1B HGA2 0.09 ! / \\ / \\\n+GROUP ! H2B \\ / H6\n+ATOM C2 CRL2 -0.18 ! \\ /\n+ATOM H2A HGA2 0.09 ! H3--C3------C4--H4A\n+ATOM H2B HGA2 0.09 ! | |\n+GROUP ! | H4B\n+ATOM C20 CTL1 -0.09 ! |\n+ATOM H20 HAL1 0.09 ! BGLC-2O1\n+GROUP !\n+ATOM C21 CTL3 -0.27 !\n+ATOM H21A HAL3 0.09 !\n+ATOM H21B HAL3 0.09 !\n+ATOM H21C HAL3 0.09 !\n+GROUP !\n+ATOM C22 CTL2 -0.18 !\n+ATOM H22A HAL2 0.09 !\n+ATOM H22B HAL2 0.09 !\n+GROUP !\n+ATOM C23 CTL2 -0.18 !\n+ATOM H23A HAL2 0.09 !\n+ATOM H23B HAL2 0.09 !\n+GROUP !\n+ATOM C24 CTL1 -0.09 !\n+ATOM H24 HAL1 0.09 !\n+GROUP !\n+ATOM C25 CTL1 -0.09 !\n+ATOM H25 HAL1 0.09 !\n+GROUP !\n+ATOM C26 CTL3 -0.27 !\n+ATOM H26A HAL3 0.09 !\n+ATOM H26B HAL3 0.09 !\n+ATOM H26C HAL3 0.09 !\n+GROUP !\n+ATOM C27 CTL3 -0.27 !\n+ATOM H27A HAL3 0.09 !\n+ATOM H27B HAL3 0.09 !\n+ATOM H27C HAL3 0.09 !\n+GROUP !\n+ATOM C28 CTL2 -0.18 !\n+ATOM H28A HAL2 0.09 !\n+ATOM H28B HAL2 0.09 !\n+GROUP !\n+ATOM C29 CTL3 -0.27 !\n+ATOM H29A HAL3 0.09 !\n+ATOM H29B HAL3 0.09 !\n+ATOM H29C HAL3 0.09 !\n+\n+!\n+BOND 2C1 2O1 2C1 2H1\n+BOND 2C1 2O5 2C1 2C2\n+BOND 2C2 2H2 2C2 2O2 2O2 2HO2 2C2 2C3 \n+BOND 2C3 2H3 2C3 2O3 2O3 2HO3 2C3 2C4 \n+BOND 2C4 2H4 2C4 2O4 2O4 2HO4 2C4 2C5 \n+BOND 2C5 2H5 2C5 2O5 2C5 2C6 \n+BOND 2C6 2H61 2C6 2H62 2C6 2O6\n+\n+BOND 2O6 3C1\n+DOUBLE 3C1 3O1\n+BOND 3C1 3C2 3C2 3H2A 3C2 3H2B\n+BOND 3C2 3C3 3C3 3H3A 3C3 3H3B\n+BOND 3C3 3C4 3C4 3H4A 3C4 3H4B\n+BOND 3C4 3C5 3C5 3H5A 3C5 3H5B\n+BOND 3C5 3C6 3C6 3H6A 3C6 3H6B\n+BOND 3C6 3C7 3C7 3H7A 3C7 3H7B\n+BOND 3C7 3C8 3C8 3H8A 3C8 3H8B\n+BOND 3C8 3C9 3C9 3H9A 3C9 3H9B\n+BOND 3C9 3C10 3C10 3H10A 3C10 3H10B\n+BOND 3C10 3C11 3C11 3H11A 3C11 3H11B\n+BOND 3C11 3C12 3C12 3H12A 3C12 3H12B\n+BOND 3C12 3C13 3C13 3H13A 3C13 3H13B\n+BOND 3C13 3C14 3C14 3H14A 3C14 3H14B\n+BOND 3C14 3C15 3C15 3H15A 3C15 3H15B\n+BOND 3C15 3C16 3C16 3H16A 3C16 3H16B 3C16 3H16C\n+IMPR 3C1 3O1 2O6 3C2\n+\n+ACCEPTOR 3O1 3C1\n+\n+!\n+BOND C3 2O1 C3 H3\n+BOND C3 C2 C2 H2A C2 H2B\n+BOND C2 C1 C1 H1A C1 H1B\n+BOND C3 C4 C4 H4A C4 H4B\n+BOND C4 C5\n+BOND C5 C10\n+BOND C10 C1\n+BOND C10 C19 C19 H19A C19 H19B C19 H19C\n+DOUBLE C5 C6\n+BOND C6 H6\n+BOND C6 C7 C7 H7A C7 H7B\n+BOND C7 C8 C8 H8\n+BOND C8 C9 C9 H9\n+BOND C9 C10\n+BOND C8 C14 C14 H14\n+BOND C14 C13\n+BOND C13 C12 C12 H12A C12 H12B\n+BOND C12 C11 C11 H11A C11 H11B\n+BOND C11 C9\n+BOND C13 C18 C18 H18A C18 H18B C18 H18C\n+BOND C14 C15 C15 H15A C15 H15B\n+BOND C15 C16 C16 H16A C16 H16B\n+BOND C16 C17 C17 H17\n+BOND C17 C13\n+BOND C17 C20 C20 H20\n+BOND C20 C21 C21 H21A C21 H21B C21 H21C\n+BOND C20 C22 C22 H22A C22 H22B\n+BOND C22 C23 C23 H23A C23 H23B\n+BOND C23 C24 C24 H24 C24 C28\n+BOND C24 C25 C25 H25\n+BOND C25 C26 C26 H26A C26 H26B C26 H26C\n+BOND C25 C27 C27 H27A C27 H27B C27 H27C\n+BOND C28 H28A C28 H28B C28 C29\n+BOND C29 H29A C29 H29B C29 H29C\n+\n+!IC table by CHARMM ic generate\n+! I J K L R(I(J/K)) T(I(JK/KJ)) PHI T(JKL) R(KL)\n+IC 2O1 2C2 *2C1 2H1 1.4070 105.81 119.72 109.60 1.1125\n+IC 2O1 2O5 *2C1 2C2 1.4070 111.47 115.62 107.66 1.5154\n+IC 2O2 2C3 *2C2 2H2 1.4313 111.09 -117.94 108.24 1.1179\n+IC 2O2 2C1 *2C2 2C3 1.4313 111.99 -124.11 110.06 1.5144\n+IC 2O3 2C4 *2C3 2H3 1.4264 111.34 118.09 108.42 1.1181\n+IC 2O3 2C2 *2C3 2C4 1.4264 111.39 123.80 109.78 1.5125\n+IC 2O4 2C5 *2C4 2H4 1.4202 110.64 -118.25 108.42 1.1168\n+IC 2O4 2C3 *2C4 2C5 1.4202 111.14 -122.82 109.91 1.5212\n+IC 2C6 2O5 *2C5 2H5 1.5197 109.10 118.96 109.44 1.1151\n+IC 2C6 2C4 *2C5 2O5 1.5197 112.58 120.77 108.37 1.4374\n+IC 2O6 2H62 *2C6 2H61 1.4297 107.88 -119.65 106.57 1.1164\n+IC 2O6 2C5 *2C6 2H62 1.4297 112.49 -118.91 107.95 1.1139\n+IC 2O5 2C1 2C2 2C3 1.4333 107.66 59.42 110.06 1.5144\n+IC 2C1 2C2 2C3 2C4 1.5154 110.06 -55.28 109.78 1.5125\n+IC 2C2 2C3 2C4 2C5 1.5144 109.78 54.21 109.91 1.5212\n+IC 2C3 2C4 2C5 2O5 1.5125 109.91 -57.77 108.37 1.4374\n+IC 2C4 2C5 2O5 2C1 1.5212 108.37 64.85 111.87 1.4333\n+IC 2C5 2O5 2C1 2C2 1.4374 111.87 -65.45 107.66 1.5154\n+IC 2C4 2C5 2C6 2O6 1.5212 112.58 172.99 112.49 1.4297\n+IC 2C1 2C2 2O2 2HO2 1.5154 111.99 58.58 108.11 0.9659\n+IC 2C2 2C3 2O3 2HO3 1.5144 111.39 -44.89 106.70 0.9672\n+IC 2C3 2C4 2O4 2HO4 1.5125 111.14 43.78 106.68 0.9669\n+IC 2C5 2C6 2O6 3C1 1.5197 112.49 75.08 115.94 1.3273\n+IC 2C6 2O6 3C1 3C2 1.4297 115.94 174.68 108.93 1.5278\n+IC 3C2 2O6 *3C1 3O1 1.5278 108.93 -179.43 125.81 1.2167\n+IC 2O6 3C1 3C2 3C3 1.3273 108.93 -168.58 111.94 1.5442\n+IC 3C3 3C1 *3C2 3H2A 1.5442 111.94 -122.09 108.47 1.1087\n+IC 3H2A 3C1 *3C2 3H2B 1.1087 108.47 -117.52 107.61 1.1104\n+IC 3C1 3C2 3C3 3C4 1.5278 111.94 169.88 112.48 1.5342\n+IC 3C4 3C2 *3C3 3H3A 1.5342 112.48 -119.79 109.42 1.1156\n+IC 3H3A 3C2 *3C3 3H3B 1.1156 109.42 -117.68 110.02 1.1133\n+IC 3C2 3C3 3C4 3C5 1.5442 112.48 -176.10 112.20 1.5344\n+IC 3C5 3C3 *3C4 3H4A 1.5344 112.20 -122.07 109.86 1.1126\n+IC 3H4A 3C3 *3C4 3H4B 1.1126 109.86 -117.74 108.79 1.1139\n+IC 3C3 3C4 3C5 3C6 1.5342 112.20 173.24 113.00 1.5345\n+IC 3C6 3C4 *3C5 3H5A 1.5345 113.00 -120.45 108.72 1.1139\n+IC 3H5A 3C4 *3C5 3H5B 1.1139 108.72 -117.24 109.46 1.1127\n+IC 3C4 3C5 3C6 3C7 1.5344 113.00 -177.05 112.13 1.5345\n+IC 3C7 3C5 *3C6 3H6A 1.5345 112.13 -121.87 109.57 1.1125\n+IC 3H6A 3C5 *3C6 3H6B 1.1125 109.57 -117.59 108.80 1.1135\n+IC 3C5 3C6 3C7 3C8 1.5345 112.13 175.51 113.20 1.5347\n+IC 3C8 3C6 *3C7 3H7A 1.5347 113.20 -120.76 108.75 1.1140\n+IC 3H7A 3C6 *3C7 3H7B 1.1140 108.75 -117.23 109.27 1.1131\n+IC 3C6 3C7 3C8 3C9 1.5345 113.20 -178.12 111.94 1.5346\n+IC 3C9 3C7 *3C8 3H8A 1.5346 111.94 -121.55 109.49 1.1127\n+IC 3H8A 3C7 *3C8 3H8B 1.1127 109.49 -117.77 109.01 1.1134\n+IC 3C7 3C8 3C9 3C10 1.5347 111.94 177.31 113.34 1.5348\n+IC 3C10 3C8 *3C9 3H9A 1.5348 113.34 -121.08 108.79 1.1137\n+IC 3H9A 3C8 *3C9 3H9B 1.1137 108.79 -117.08 109.06 1.1131\n+IC 3C8 3C9 3C10 3C11 1.5346 113.34 -178.87 112.02 1.5349\n+IC 3C11 3C9 *3C10 3H10A 1.5349 112.02 -121.40 109.40 1.1128\n+IC 3H10A 3C9 *3C10 3H10B 1.1128 109.40 -117.77 109.14 1.1132\n+IC 3C9 3C10 3C11 3C12 1.5348 112.02 178.47 113.20 1.5347\n+IC 3C12 3C10 *3C11 3H11A 1.5347 113.20 -121.18 108.84 1.1134\n+IC 3H11A 3C10 *3C11 3H11B 1.1134 108.84 -117.12 109.01 1.1132\n+IC 3C10 3C11 3C12 3C13 1.5349 113.20 -178.92 112.25 1.5352\n+IC 3C13 3C11 *3C12 3H12A 1.5352 112.25 -121.38 109.25 1.1131\n+IC 3H12A 3C11 *3C12 3H12B 1.1131 109.25 -117.66 109.08 1.1134\n+IC 3C11 3C12 3C13 3C14 1.5347 112.25 178.84 112.96 1.5349\n+IC 3C14 3C12 *3C13 3H13A 1.5349 112.96 -121.19 108.91 1.1134\n+IC 3H13A 3C12 *3C13 3H13B 1.1134 108.91 -117.25 109.10 1.1132\n+IC 3C12 3C13 3C14 3C15 1.5352 112.96 -178.81 112.53 1.5344\n+IC 3C15 3C13 *3C14 3H14A 1.5344 112.53 -121.36 109.23 1.1132\n+IC 3H14A 3C13 *3C14 3H14B 1.1132 109.23 -117.58 109.09 1.1133\n+IC 3C13 3C14 3C15 3C16 1.5349 112.53 179.43 113.47 1.5310\n+IC 3C16 3C14 *3C15 3H15A 1.5310 113.47 -121.62 108.63 1.1142\n+IC 3H15A 3C14 *3C15 3H15B 1.1142 108.63 -116.64 108.71 1.1141\n+IC 3C14 3C15 3C16 3H16A 1.5344 113.47 -59.78 110.45 1.1113\n+IC 3H16A 3C15 *3C16 3H16B 1.1113 110.45 119.91 110.50 1.1112\n+IC 3H16A 3C15 *3C16 3H16C 1.1113 110.45 -120.03 110.56 1.1113\n+IC 2O5 2C1 2O1 C1 1.4333 111.47 -56.82 138.18 3.7631\n+IC 2C1 2O1 C1 C2 1.4070 138.18 150.75 20.82 1.5366\n+IC C1 C2 C3 C4 1.5366 111.68 53.51 110.11 1.5469\n+IC C4 C2 *C3 2O1 1.5469 110.11 120.38 107.62 1.4243\n+IC 2O1 C2 *C3 H3 1.4243 107.62 119.55 108.35 1.1151\n+IC C2 C3 C4 C5 1.5360 110.11 -52.38 113.44 1.5173\n+IC C5 C3 *C4 H4A 1.5173 113.44 121.83 107.62 1.1109\n+IC H4A C3 *C4 H4B 1.1109 107.62 114.64 108.54 1.1105\n+IC C3 C4 C5 C10 1.5469 113.44 52.48 115.10 1.5423\n+IC C10 C4 *C5 C6 1.5423 115.10 -177.00 121.69 1.3441\n+IC C4 C5 C6 C7 1.5173 121.69 -177.24 123.89 1.5031\n+IC C7 C5 *C6 H6 1.5031 123.89 175.60 119.56 1.1000\n+IC C5 C6 C7 C8 1.3441 123.89 13.77 112.52 1.5533\n+IC C8 C6 *C7 H7A 1.5533 112.52 121.29 110.46 1.1117\n+IC H7A C6 *C7 H7B 1.1117 110.46 118.07 109.40 1.1118\n+IC C6 C7 C8 C14 1.5031 112.52 -166.81 110.39 1.5235\n+IC C14 C7 *C8 C9 1.5235 110.39 121.62 110.68 1.5338\n+IC C9 C7 *C8 H8 1.5338 110.68 119.12 107.55 1.1120\n+IC C7 C8 C14 C13 1.5533 110.39 179.46 115.24 1.5287\n+IC C13 C8 *C14 C15 1.5287 115.24 126.54 117.76 1.5379\n+IC C13 C8 *C14 H14 1.5287 115.24 -116.42 105.87 1.1207\n+IC C8 C14 C15 C16 1.5235 117.76 -163.46 103.54 1.5363\n+IC C16 C14 *C15 H15A 1.5363 103.54 117.44 109.48 1.1114\n+IC H15A C14 *C15 H15B 1.1114 109.48 121.17 112.16 1.1082\n+IC C14 C15 C16 C17 1.5379 103.54 9.19 107.08 1.5654\n+IC C17 C15 *C16 H16A 1.5654 107.08 119.52 108.96 1.1109\n+IC H16A C15 *C16 H16B 1.1109 108.96 120.23 111.51 1.1093\n+IC C13 C16 *C17 C20 1.5479 104.84 131.32 112.33 1.5406\n+IC C13 C16 *C17 H17 1.5479 104.84 -111.89 106.37 1.1158\n+IC C17 C14 *C13 C12 1.5479 100.67 123.24 106.54 1.5435\n+IC C12 C14 *C13 C18 1.5435 106.54 122.40 110.59 1.5525\n+IC C14 C13 C18 H18A 1.5287 110.59 61.71 111.51 1.1078\n+IC H18A C13 *C18 H18B 1.1078 111.51 120.22 110.30 1.1084\n+IC H18A C13 *C18 H18C 1.1078 111.51 -120.75 111.57 1.1063\n+IC C14 C13 C12 C11 1.5287 106.54 57.44 111.18 1.5422\n+IC C11 C13 *C12 H12A 1.5422 111.18 121.09 111.61 1.1059\n+IC H12A C13 *C12 H12B 1.1059 111.61 118.97 108.79 1.1117\n+IC C9 C12 *C11 H11A 1.5595 113.64 121.98 106.91 1.1088\n+IC H11A C12 *C11 H11B 1.1088 106.91 115.64 108.67 1.1101\n+IC C10 C8 *C9 H9 1.5547 112.47 -114.74 104.68 1.1189\n+IC C9 C5 *C10 C19 1.5547 112.09 -120.10 108.02 1.5527\n+IC C19 C5 *C10 C1 1.5527 108.02 -119.50 108.47 1.5564\n+IC C5 C10 C19 H19A 1.5423 108.02 -171.69 110.68 1.1082\n+IC H19A C10 *C19 H19B 1.1082 110.68 118.43 111.92 1.1079\n+IC H19A C10 *C19 H19C 1.1082 110.68 -120.69 110.92 1.1090\n+IC C2 C10 *C1 H1A 1.5366 114.44 121.86 109.18 1.1106\n+IC C2 C10 *C1 H1B 1.5366 114.44 -121.13 108.71 1.1131\n+IC C1 C3 *C2 H2A 1.5366 111.68 121.80 109.08 1.1117\n+IC H2A C3 *C2 H2B 1.1117 109.08 117.07 108.80 1.1116\n+IC C16 C17 C20 C22 1.5654 112.33 55.34 112.12 1.5548\n+IC C22 C17 *C20 C21 1.5548 112.12 123.31 110.74 1.5442\n+IC C21 C17 *C20 H20 1.5442 110.74 118.89 108.76 1.1146\n+IC C17 C20 C21 H21A 1.5406 110.74 67.79 110.76 1.1067\n+IC H21A C20 *C21 H21B 1.1067 110.76 -121.40 110.53 1.1099\n+IC H21A C20 *C21 H21C 1.1067 110.76 118.14 111.11 1.1080\n+IC C17 C20 C22 C23 1.5406 112.12 -170.54 113.96 1.5435\n+IC C23 C20 *C22 H22A 1.5435 113.96 119.39 109.86 1.1113\n+IC H22A C20 *C22 H22B 1.1113 109.86 117.53 108.32 1.1103\n+IC C20 C22 C23 C24 1.5548 113.96 171.46 114.28 1.5546\n+IC C24 C22 *C23 H23A 1.5546 114.28 121.88 109.84 1.1098\n+IC H23A C22 *C23 H23B 1.1098 109.84 116.68 107.07 1.1102\n+IC C22 C23 C24 C25 1.5435 114.28 -164.43 113.46 1.5329\n+IC C25 C23 *C24 C28 1.5329 113.46 -128.19 110.60 1.5543\n+IC C28 C23 *C24 H24 1.5543 110.60 -115.07 106.74 1.1167\n+IC C23 C24 C25 C26 1.5546 113.46 -54.75 111.67 1.5414\n+IC C26 C24 *C25 C27 1.5414 111.67 124.43 110.19 1.5427\n+IC C26 C24 *C25 H25 1.5414 111.67 -119.16 108.65 1.1145\n+IC C24 C25 C26 H26A 1.5329 111.67 -56.94 110.89 1.1094\n+IC H26A C25 *C26 H26B 1.1094 110.89 121.11 110.97 1.1095\n+IC H26A C25 *C26 H26C 1.1094 110.89 -119.62 109.85 1.1106\n+IC C24 C25 C27 H27A 1.5329 110.19 -66.78 111.34 1.1085\n+IC H27A C25 *C27 H27B 1.1085 111.34 121.06 110.46 1.1103\n+IC H27A C25 *C27 H27C 1.1085 111.34 -119.41 109.85 1.1106\n+IC C23 C24 C28 C29 1.5546 110.60 -172.53 114.81 1.5350\n+IC C29 C24 *C28 H28A 1.5350 114.81 -123.73 109.33 1.1111\n+IC H28A C24 *C28 H28B 1.1111 109.33 -116.20 108.22 1.1121\n+IC C24 C28 C29 H29A 1.5543 114.81 172.56 110.17 1.1113\n+IC H29A C28 *C29 H29B 1.1113 110.17 -119.71 110.53 1.1110\n+IC H29A C28 *C29 H29C 1.1113 110.17 119.51 111.23 1.1100\n+\n+RESI PGCAMP 0.000 ! 16:0 palmitoyl campesteryl glucoside\n+GROU ! BGLC\n+ATOM 2C1 CC3162 0.290 !\n+ATOM 2H1 HCA1 0.090 !\n+ATOM 2O1 OC301 -0.360 !\n+ATOM 2C5 CC3163 0.110 !\n+ATOM 2H5 HCA1 0.090 !\n+ATOM 2O5 OC3C61 -0.400 !\n+ATOM C3 CRL1 0.090 ! \n+ATOM H3 HGA1 0.090 !\n+GROU !\n+ATOM 2C2 CC3161 0.140 !\n+ATOM 2H2 HCA1 0.090 !\n+ATOM 2O2 OC311 -0.650 !\n+ATOM 2HO2 HCP1 0.420 !\n+GROU !\n+ATOM 2C3 CC3161 0.140 !\n+ATOM 2H3 HCA1 0.090 !\n+ATOM 2O3 OC311 -0.650 !\n+ATOM 2HO3 HCP1 0.420 !\n+GROU\n+ATOM 2C4 CC3161 0.140\n+ATOM 2H4 HCA1 0.090\n+ATOM 2O4 OC311 -0.650\n+ATOM 2HO4 HCP1 0.420\n+GROU\n+ATOM 2C6 CC321 0.080 !\n+ATOM 2H61 HCA2 0.090 !\n+ATOM 2H62 HCA2 0.090 !\n+ATOM 2O6 OSL -0.490 !\n+ATOM 3C1 CL 0.90 ! O1=C1\n+ATOM 3O1 OBL -0.63 ! |\n+ATOM 3C2 CTL2 -0.22 ! H2A-C2-H2B\n+ATOM 3H2A HAL2 0.09 ! |\n+ATOM 3H2B HAL2 0.09 ! |\n+GROUP ! |\n+ATOM 3C3 CTL2 -0.18 ! H3A-C3-H3B\n+ATOM 3H3A HAL2 0.09 ! |\n+ATOM 3H3B HAL2 0.09 ! |\n+GROUP ! |\n+ATOM 3C4 CTL2 -0.18 ! H4A-C4-H4B\n+ATOM 3H4A HAL2 0.09 ! |\n+ATOM 3H4B HAL2 0.09 ! |\n+GROUP ! |\n+ATOM 3C5 CTL2 -0.18 ! H5A-C5-H5B\n+ATOM 3H5A HAL2 0.09 ! |\n+ATOM 3H5B HAL2 0.09 ! |\n+GROUP ! |\n+ATOM 3C6 CTL2 -0.18 ! H6A-C6-H6B\n+ATOM 3H6A HAL2 0.09 ! |\n+ATOM 3H6B HAL2 0.09 ! |\n+GROUP ! |\n+ATOM 3C7 CTL2 -0.18 ! H7A-C7-H7B\n+ATOM 3H7A HAL2 0.09 ! |\n+ATOM 3H7B HAL2 0.09 ! |\n+GROUP ! |\n+ATOM 3C8 CTL2 -0.18 ! H8A-C8-H8B\n+ATOM 3H8A HAL2 0.09 ! |\n+ATOM 3H8B HAL2 0.09 ! |\n+GROUP ! |\n+ATOM 3C9 CTL2 -0.18 ! H9A-C9-H9B\n+ATOM 3H9A HAL2 0.09 ! |\n+ATOM 3H9B HAL2 0.09 ! |\n+GROUP ! |\n+ATOM 3C10 CTL2 -0.18 ! H10A-C10-H10B\n+ATOM 3H10A HAL2 0.09 ! |\n+ATOM 3H10B HAL2 0.09 ! |\n+GROUP ! |\n+ATOM 3C11 CTL2 -0.18 ! H11A-C11-H11B\n+ATOM 3H11A HAL2 0.09 ! |\n+ATOM 3H11B HAL2 0.09 ! |\n+GROUP ! |\n+ATOM 3C12 CTL2 -0.18 ! H12A-C12-H12B\n+ATOM 3H12A HAL2 0.09 ! |\n+ATOM 3H12B HAL2 0.09 ! |\n+GROUP ! |\n+ATOM 3C13 CTL2 -0.18 ! H13A-C13-H13B\n+ATOM 3H13A HAL2 0.09 ! |\n+ATOM 3H13B HAL2 0.09 ! |\n+GROUP ! |\n+ATOM 3C14 CTL2 -0.18 ! H14A-C14-H14B\n+ATOM 3H14A HAL2 0.09 ! |\n+ATOM 3H14B HAL2 0.09 ! |\n+GROUP ! |\n+ATOM 3C15 CTL2 -0.18 ! H15A-C15-H15B\n+ATOM 3H15A HAL2 0.09 ! |\n+ATOM 3H15B HAL2 0.09 ! |\n+GROUP ! |\n+ATOM 3C16 CTL3 -0.27 ! H16A-C16-H16B\n+ATOM 3H16A HAL3 0.09 ! |\n+ATOM 3H16B HAL3 0.09 ! H16C\n+ATOM 3H16C HAL3 0.09 !\n+!\n+GROUP !\n+ATOM C4 CRL2 -0.18 ! H26B H26C H27C H27B\n+ATOM H4A HGA2 0.09 ! \\ / \\ /\n+ATOM H4B HGA2 0.09 ! C26 C27\n+GROUP ! / \\ / \\\n+ATOM C5 CEL1 0.00 ! H26A \\ H25 / H27A\n+ATOM C6 CEL1 -0.15 ! \\ | /\n+ATOM H6 HEL1 0.15 ! \\ | /\n+GROUP ! \\|/\n+ATOM C7 CRL2 -0.18 ! C25\n+ATOM H7A HGA2 0.09 ! |\n+ATOM H7B HGA2 0.09 ! |\n+GROUP ! |\n+ATOM C8 CRL1 -0.09 ! | \n+ATOM H8 HGA1 0.09 ! | H28B\n+GROUP ! | |\n+ATOM C14 CRL1 -0.09 ! H24--C24-----C28-----H28C\n+ATOM H14 HGA1 0.09 ! | |\n+GROUP ! | H28A\n+ATOM C15 CRL2 -0.18 ! |\n+ATOM H15A HGA2 0.09 ! H23A--C23--H23B\n+ATOM H15B HGA2 0.09 ! |\n+GROUP ! |\n+ATOM C16 CRL2 -0.18 ! |\n+ATOM H16A HGA2 0.09 ! H22A--C22--H22B\n+ATOM H16B HGA2 0.09 ! |\n+GROUP ! H21A |\n+ATOM C17 CRL1 -0.09 ! | |\n+ATOM H17 HGA1 0.09 ! H21B--C21-----C20--H20\n+GROUP ! | |\n+ATOM C13 CRL1 0.00 ! H21C |\n+GROUP ! |\n+ATOM C18 CTL3 -0.27 ! H18C |\n+ATOM H18A HAL3 0.09 ! | | H16B\n+ATOM H18B HAL3 0.09 ! H18B--C18 | |\n+ATOM H18C HAL3 0.09 ! / \\ C17-----C16--H16A\n+GROUP ! H18A \\ |\\ |\n+ATOM C12 CRL2 -0.18 ! \\ | H17 |\n+ATOM H12A HGA2 0.09 ! H12B \\ | | H15B\n+ATOM H12B HGA2 0.09 ! \\ \\| |/\n+GROUP ! H12A--C12-----C13 C15--H15A\n+ATOM C11 CRL2 -0.18 ! / \\ /\n+ATOM H11A HGA2 0.09 ! H11B / \\ /\n+ATOM H11B HGA2 0.09 ! \\ / \\ /\n+GROUP ! H11A--C11 C14--H14\n+ATOM C9 CRL1 -0.09 ! \\ /\n+ATOM H9 HGA1 0.09 ! H19C \\ H8 /\n+GROUP ! | \\ \\ /\n+ATOM C10 CRL1 0.00 ! H19A-C19-H19B C9------C8\n+GROUP ! \\ / \\ \\\n+ATOM C19 CTL3 -0.27 ! H1B \\ / H9 \\ H7A\n+ATOM H19A HAL3 0.09 ! | \\ / \\ /\n+ATOM H19B HAL3 0.09 ! H1A--C1------C10 C7\n+ATOM H19C HAL3 0.09 ! / \\ / \\\n+GROUP ! H2A / \\ / H7B\n+ATOM C1 CRL2 -0.18 ! \\ / \\ ------ /\n+ATOM H1A HGA2 0.09 ! C2 C5------C6\n+ATOM H1B HGA2 0.09 ! / \\ / \\\n+GROUP ! H2B \\ / H6\n+ATOM C2 CRL2 -0.18 ! \\ /\n+ATOM H2A HGA2 0.09 ! H3--C3------C4--H4A\n+ATOM H2B HGA2 0.09 ! | |\n+GROUP ! | H4B\n+ATOM C20 CTL1 -0.09 ! |\n+ATOM H20 HAL1 0.09 ! BGLC-2O1\n+GROUP !\n+ATOM C21 CTL3 -0.27 !\n+ATOM H21A HAL3 0.09 !\n+ATOM H21B HAL3 0.09 !\n+ATOM H21C HAL3 0.09 !\n+GROUP !\n+ATOM C22 CTL2 -0.18 !\n+ATOM H22A HAL2 0.09 !\n+ATOM H22B HAL2 0.09 !\n+GROUP !\n+ATOM C23 CTL2 -0.18 !\n+ATOM H23A HAL2 0.09 !\n+ATOM H23B HAL2 0.09 !\n+GROUP !\n+ATOM C24 CTL1 -0.09 !\n+ATOM H24 HAL1 0.09 !\n+GROUP !\n+ATOM C25 CTL1 -0.09 !\n+ATOM H25 HAL1 0.09 !\n+GROUP !\n+ATOM C26 CTL3 -0.27 !\n+ATOM H26A HAL3 0.09 !\n+ATOM H26B HAL3 0.09 !\n+ATOM H26C HAL3 0.09 !\n+GROUP !\n+ATOM C27 CTL3 -0.27 !\n+ATOM H27A HAL3 0.09 !\n+ATOM H27B HAL3 0.09 !\n+ATOM H27C HAL3 0.09 !\n+GROUP !\n+ATOM C28 CTL3 -0.27 !\n+ATOM H28A HAL3 0.09 !\n+ATOM H28B HAL3 0.09 !\n+ATOM H28C HAL3 0.09 !\n+\n+!\n+BOND 2C1 2O1 2C1 2H1\n+BOND 2C1 2O5 2C1 2C2\n+BOND 2C2 2H2 2C2 2O2 2O2 2HO2 2C2 2C3 \n+BOND 2C3 2H3 2C3 2O3 2O3 2HO3 2C3 2C4 \n+BOND 2C4 2H4 2C4 2O4 2O4 2HO4 2C4 2C5 \n+BOND 2C5 2H5 2C5 2O5 2C5 2C6 \n+BOND 2C6 2H61 2C6 2H62 2C6 2O6\n+\n+BOND 2O6 3C1\n+DOUBLE 3C1 3O1\n+BOND 3C1 3C2 3C2 3H2A 3C2 3H2B\n+BOND 3C2 3C3 3C3 3H3A 3C3 3H3B\n+BOND 3C3 3C4 3C4 3H4A 3C4 3H4B\n+BOND 3C4 3C5 3C5 3H5A 3C5 3H5B\n+BOND 3C5 3C6 3C6 3H6A 3C6 3H6B\n+BOND 3C6 3C7 3C7 3H7A 3C7 3H7B\n+BOND 3C7 3C8 3C8 3H8A 3C8 3H8B\n+BOND 3C8 3C9 3C9 3H9A 3C9 3H9B\n+BOND 3C9 3C10 3C10 3H10A 3C10 3H10B\n+BOND 3C10 3C11 3C11 3H11A 3C11 3H11B\n+BOND 3C11 3C12 3C12 3H12A 3C12 3H12B\n+BOND 3C12 3C13 3C13 3H13A 3C13 3H13B\n+BOND 3C13 3C14 3C14 3H14A 3C14 3H14B\n+BOND 3C14 3C15 3C15 3H15A 3C15 3H15B\n+BOND 3C15 3C16 3C16 3H16A 3C16 3H16B 3C16 3H16C\n+IMPR 3C1 3O1 2O6 3C2\n+\n+ACCEPTOR 3O1 3C1\n+!\n+BOND C3 2O1 C3 H3\n+BOND C3 C2 C2 H2A C2 H2B\n+BOND C2 C1 C1 H1A C1 H1B\n+BOND C3 C4 C4 H4A C4 H4B\n+BOND C4 C5\n+BOND C5 C10\n+BOND C10 C1\n+BOND C10 C19 C19 H19A C19 H19B C19 H19C\n+DOUBLE C5 C6\n+BOND C6 H6\n+BOND C6 C7 C7 H7A C7 H7B\n+BOND C7 C8 C8 H8\n+BOND C8 C9 C9 H9\n+BOND C9 C10\n+BOND C8 C14 C14 H14\n+BOND C14 C13\n+BOND C13 C12 C12 H12A C12 H12B\n+BOND C12 C11 C11 H11A C11 H11B\n+BOND C11 C9\n+BOND C13 C18 C18 H18A C18 H18B C18 H18C\n+BOND C14 C15 C15 H15A C15 H15B\n+BOND C15 C16 C16 H16A C16 H16B\n+BOND C16 C17 C17 H17\n+BOND C17 C13\n+BOND C17 C20 C20 H20\n+BOND C20 C21 C21 H21A C21 H21B C21 H21C\n+BOND C20 C22 C22 H22A C22 H22B\n+BOND C22 C23 C23 H23A C23 H23B\n+BOND C23 C24 C24 H24 C24 C28\n+BOND C24 C25 C25 H25\n+BOND C25 C26 C26 H26A C26 H26B C26 H26C\n+BOND C25 C27 C27 H27A C27 H27B C27 H27C\n+BOND C28 H28A C28 H28B C28 H28C\n+\n+!IC table by CHARMM ic generate\n+! I J K L R(I(J/K)) T(I(JK/KJ)) PHI T(JKL) R(KL)\n+IC 2O1 2C2 *2C1 2H1 1.4081 105.94 119.70 109.70 1.1126\n+IC 2O1 2O5 *2C1 2C2 1.4081 111.59 115.71 107.43 1.5153\n+IC 2O2 2C3 *2C2 2H2 1.4311 111.09 -117.96 108.21 1.1180\n+IC 2O2 2C1 *2C2 2C3 1.4311 111.92 -124.07 110.09 1.5154\n+IC 2O3 2C4 *2C3 2H3 1.4265 111.26 117.96 108.34 1.1180\n+IC 2O3 2C2 *2C3 2C4 1.4265 111.37 123.92 110.13 1.5136\n+IC 2O4 2C5 *2C4 2H4 1.4207 110.62 -118.26 108.28 1.1169\n+IC 2O4 2C3 *2C4 2C5 1.4207 111.06 -122.85 110.07 1.5215\n+IC 2C6 2O5 *2C5 2H5 1.5134 108.13 117.49 109.70 1.1170\n+IC 2C6 2C4 *2C5 2O5 1.5134 113.26 120.21 108.72 1.4397\n+IC 2O6 2H62 *2C6 2H61 1.4290 109.32 -117.58 107.85 1.1139\n+IC 2O6 2C5 *2C6 2H62 1.4290 111.28 -121.36 110.08 1.1132\n+IC 2O5 2C1 2C2 2C3 1.4333 107.43 59.78 110.09 1.5154\n+IC 2C1 2C2 2C3 2C4 1.5153 110.09 -55.03 110.13 1.5136\n+IC 2C2 2C3 2C4 2C5 1.5154 110.13 53.14 110.07 1.5215\n+IC 2C3 2C4 2C5 2O5 1.5136 110.07 -56.65 108.72 1.4397\n+IC 2C4 2C5 2O5 2C1 1.5215 108.72 64.59 111.89 1.4333\n+IC 2C5 2O5 2C1 2C2 1.4397 111.89 -65.79 107.43 1.5153\n+IC 2C4 2C5 2C6 2O6 1.5215 113.26 -179.49 111.28 1.4290\n+IC 2C1 2C2 2O2 2HO2 1.5153 111.92 58.40 108.23 0.9665\n+IC 2C2 2C3 2O3 2HO3 1.5154 111.37 -45.84 106.80 0.9671\n+IC 2C3 2C4 2O4 2HO4 1.5136 111.06 47.66 106.88 0.9667\n+IC 2C5 2C6 2O6 3C1 1.5204 113.19 76.33 115.99 1.3285\n+IC 2C6 2O6 3C1 3C2 1.4296 115.99 168.17 108.74 1.5289\n+IC 3C2 2O6 *3C1 3O1 1.5289 108.74 -178.93 125.84 1.2161\n+IC 2O6 3C1 3C2 3C3 1.3285 108.74 -174.20 112.61 1.5456\n+IC 3C3 3C1 *3C2 3H2A 1.5456 112.61 -122.93 108.80 1.1082\n+IC 3H2A 3C1 *3C2 3H2B 1.1082 108.80 -117.08 106.96 1.1108\n+IC 3C1 3C2 3C3 3C4 1.5289 112.61 162.24 112.17 1.5345\n+IC 3C4 3C2 *3C3 3H3A 1.5345 112.17 -119.22 109.83 1.1157\n+IC 3H3A 3C2 *3C3 3H3B 1.1157 109.83 -117.99 109.97 1.1128\n+IC 3C2 3C3 3C4 3C5 1.5456 112.17 -179.25 112.67 1.5351\n+IC 3C5 3C3 *3C4 3H4A 1.5351 112.67 -122.27 109.87 1.1125\n+IC 3H4A 3C3 *3C4 3H4B 1.1125 109.87 -117.43 108.48 1.1139\n+IC 3C3 3C4 3C5 3C6 1.5345 112.67 169.13 112.61 1.5351\n+IC 3C6 3C4 *3C5 3H5A 1.5351 112.61 -120.43 109.05 1.1139\n+IC 3H5A 3C4 *3C5 3H5B 1.1139 109.05 -117.45 109.25 1.1127\n+IC 3C4 3C5 3C6 3C7 1.5351 112.61 177.74 112.78 1.5350\n+IC 3C7 3C5 *3C6 3H6A 1.5350 112.78 -121.68 109.50 1.1129\n+IC 3H6A 3C5 *3C6 3H6B 1.1129 109.50 -117.40 108.70 1.1136\n+IC 3C5 3C6 3C7 3C8 1.5351 112.78 173.60 112.61 1.5350\n+IC 3C8 3C6 *3C7 3H7A 1.5350 112.61 -120.95 109.29 1.1132\n+IC 3H7A 3C6 *3C7 3H7B 1.1132 109.29 -117.44 109.00 1.1129\n+IC 3C6 3C7 3C8 3C9 1.5350 112.61 175.59 112.78 1.5351\n+IC 3C9 3C7 *3C8 3H8A 1.5351 112.78 -121.18 109.23 1.1131\n+IC 3H8A 3C7 *3C8 3H8B 1.1131 109.23 -117.39 108.90 1.1134\n+IC 3C7 3C8 3C9 3C10 1.5350 112.78 175.58 112.59 1.5350\n+IC 3C10 3C8 *3C9 3H9A 1.5350 112.59 -121.18 109.34 1.1129\n+IC 3H9A 3C8 *3C9 3H9B 1.1129 109.34 -117.49 108.89 1.1134\n+IC 3C8 3C9 3C10 3C11 1.5351 112.59 174.67 112.82 1.5349\n+IC 3C11 3C9 *3C10 3H10A 1.5349 112.82 -120.94 109.04 1.1130\n+IC 3H10A 3C9 *3C10 3H10B 1.1130 109.04 -117.37 109.07 1.1132\n+IC 3C9 3C10 3C11 3C12 1.5350 112.82 178.04 112.62 1.5351\n+IC 3C12 3C10 *3C11 3H11A 1.5351 112.62 -121.42 109.32 1.1127\n+IC 3H11A 3C10 *3C11 3H11B 1.1127 109.32 -117.44 108.87 1.1134\n+IC 3C10 3C11 3C12 3C13 1.5349 112.62 175.31 112.74 1.5351\n+IC 3C13 3C11 *3C12 3H12A 1.5351 112.74 -121.00 109.01 1.1132\n+IC 3H12A 3C11 *3C12 3H12B 1.1132 109.01 -117.37 109.08 1.1132\n+IC 3C11 3C12 3C13 3C14 1.5351 112.74 178.87 112.67 1.5352\n+IC 3C14 3C12 *3C13 3H13A 1.5352 112.67 -121.43 109.23 1.1131\n+IC 3H13A 3C12 *3C13 3H13B 1.1131 109.23 -117.44 108.94 1.1133\n+IC 3C12 3C13 3C14 3C15 1.5351 112.67 177.62 112.73 1.5344\n+IC 3C15 3C13 *3C14 3H14A 1.5344 112.73 -121.25 109.16 1.1132\n+IC 3H14A 3C13 *3C14 3H14B 1.1132 109.16 -117.37 109.06 1.1130\n+IC 3C13 3C14 3C15 3C16 1.5352 112.73 178.91 113.43 1.5311\n+IC 3C16 3C14 *3C15 3H15A 1.5311 113.43 -121.72 108.80 1.1140\n+IC 3H15A 3C14 *3C15 3H15B 1.1140 108.80 -116.66 108.67 1.1140\n+IC 3C14 3C15 3C16 3H16A 1.5344 113.43 -60.59 110.45 1.1112\n+IC 3H16A 3C15 *3C16 3H16B 1.1112 110.45 119.92 110.52 1.1113\n+IC 3H16A 3C15 *3C16 3H16C 1.1112 110.45 -120.01 110.58 1.1113\n+IC 2O5 2C1 2O1 C1 1.4341 111.52 -58.57 137.88 3.7616\n+IC 2C1 2O1 C1 C2 1.4070 137.88 148.30 20.85 1.5363\n+IC C1 C2 C3 C4 1.5364 111.21 56.01 109.65 1.5453\n+IC C4 C2 *C3 2O1 1.5453 109.65 120.63 107.90 1.4244\n+IC 2O1 C2 *C3 H3 1.4244 107.90 119.54 108.27 1.1147\n+IC C2 C3 C4 C5 1.5352 109.65 -55.22 112.54 1.5177\n+IC C5 C3 *C4 H4A 1.5177 112.54 121.67 107.81 1.1109\n+IC H4A C3 *C4 H4B 1.1109 107.81 115.07 108.81 1.1104\n+IC C3 C4 C5 C10 1.5453 112.54 53.05 115.33 1.5436\n+IC C10 C4 *C5 C6 1.5436 115.33 -176.36 121.38 1.3429\n+IC C4 C5 C6 C7 1.5177 121.38 -178.30 123.98 1.5022\n+IC C7 C5 *C6 H6 1.5022 123.98 176.41 119.63 1.1001\n+IC C5 C6 C7 C8 1.3429 123.98 12.76 112.90 1.5529\n+IC C8 C6 *C7 H7A 1.5529 112.90 121.60 110.51 1.1117\n+IC H7A C6 *C7 H7B 1.1117 110.51 117.85 109.10 1.1119\n+IC C6 C7 C8 C14 1.5022 112.90 -164.66 109.96 1.5225\n+IC C14 C7 *C8 C9 1.5225 109.96 121.09 110.99 1.5329\n+IC C9 C7 *C8 H8 1.5329 110.99 119.49 107.78 1.1119\n+IC C7 C8 C14 C13 1.5529 109.96 179.79 115.56 1.5288\n+IC C13 C8 *C14 C15 1.5288 115.56 126.99 117.68 1.5373\n+IC C13 C8 *C14 H14 1.5288 115.56 -116.28 105.71 1.1211\n+IC C8 C14 C15 C16 1.5225 117.68 -164.42 103.33 1.5351\n+IC C16 C14 *C15 H15A 1.5351 103.33 117.45 109.56 1.1115\n+IC H15A C14 *C15 H15B 1.1115 109.56 121.35 112.27 1.1084\n+IC C14 C15 C16 C17 1.5373 103.33 9.31 107.09 1.5659\n+IC C17 C15 *C16 H16A 1.5659 107.09 119.55 108.96 1.1109\n+IC H16A C15 *C16 H16B 1.1109 108.96 120.21 111.43 1.1093\n+IC C13 C16 *C17 C20 1.5480 104.85 131.64 112.13 1.5396\n+IC C13 C16 *C17 H17 1.5480 104.85 -111.79 106.40 1.1160\n+IC C17 C14 *C13 C12 1.5480 100.31 123.21 106.74 1.5437\n+IC C12 C14 *C13 C18 1.5437 106.74 122.37 110.70 1.5519\n+IC C14 C13 C18 H18A 1.5288 110.70 61.58 111.56 1.1077\n+IC H18A C13 *C18 H18B 1.1077 111.56 120.16 110.24 1.1086\n+IC H18A C13 *C18 H18C 1.1077 111.56 -120.80 111.44 1.1066\n+IC C14 C13 C12 C11 1.5288 106.74 56.34 111.32 1.5434\n+IC C11 C13 *C12 H12A 1.5434 111.32 121.18 111.42 1.1063\n+IC H12A C13 *C12 H12B 1.1063 111.42 118.88 108.78 1.1116\n+IC C9 C12 *C11 H11A 1.5594 113.54 121.81 107.21 1.1091\n+IC H11A C12 *C11 H11B 1.1091 107.21 115.85 108.56 1.1100\n+IC C10 C8 *C9 H9 1.5551 112.75 -114.70 104.69 1.1190\n+IC C9 C5 *C10 C19 1.5551 111.95 -119.97 107.70 1.5521\n+IC C19 C5 *C10 C1 1.5521 107.70 -119.60 109.10 1.5574\n+IC C5 C10 C19 H19A 1.5436 107.70 -172.87 110.72 1.1082\n+IC H19A C10 *C19 H19B 1.1082 110.72 118.54 111.72 1.1083\n+IC H19A C10 *C19 H19C 1.1082 110.72 -120.67 110.92 1.1094\n+IC C2 C10 *C1 H1A 1.5364 114.67 122.15 109.18 1.1106\n+IC C2 C10 *C1 H1B 1.5364 114.67 -120.90 108.59 1.1131\n+IC C1 C3 *C2 H2A 1.5364 111.21 121.57 109.25 1.1116\n+IC H2A C3 *C2 H2B 1.1116 109.25 117.37 108.87 1.1116\n+IC C16 C17 C20 C22 1.5659 112.13 55.85 111.76 1.5544\n+IC C22 C17 *C20 C21 1.5544 111.76 123.13 110.93 1.5438\n+IC C21 C17 *C20 H20 1.5438 110.93 119.03 108.69 1.1145\n+IC C17 C20 C21 H21A 1.5396 110.93 67.25 110.85 1.1067\n+IC H21A C20 *C21 H21B 1.1067 110.85 -121.42 110.50 1.1099\n+IC H21A C20 *C21 H21C 1.1067 110.85 118.26 110.94 1.1084\n+IC C17 C20 C22 C23 1.5396 111.76 -169.24 114.25 1.5414\n+IC C23 C20 *C22 H22A 1.5414 114.25 119.27 109.91 1.1112\n+IC H22A C20 *C22 H22B 1.1112 109.91 117.52 108.59 1.1107\n+IC C20 C22 C23 C24 1.5544 114.25 172.63 113.31 1.5490\n+IC C24 C22 *C23 H23A 1.5490 113.31 121.75 109.89 1.1097\n+IC H23A C22 *C23 H23B 1.1097 109.89 117.18 107.56 1.1109\n+IC C22 C23 C24 C25 1.5414 113.31 -167.66 114.95 1.5287\n+IC C25 C23 *C24 C28 1.5287 114.95 -124.07 111.77 1.5454\n+IC C28 C23 *C24 H24 1.5454 111.77 -117.26 107.38 1.1166\n+IC C23 C24 C25 C26 1.5490 114.95 -51.50 112.04 1.5418\n+IC C26 C24 *C25 C27 1.5418 112.04 123.99 109.40 1.5419\n+IC C26 C24 *C25 H25 1.5418 112.04 -119.29 108.05 1.1160\n+IC C24 C25 C26 H26A 1.5287 112.04 -57.05 111.33 1.1092\n+IC H26A C25 *C26 H26B 1.1092 111.33 121.22 110.82 1.1095\n+IC H26A C25 *C26 H26C 1.1092 111.33 -119.73 109.79 1.1105\n+IC C24 C25 C27 H27A 1.5287 109.40 -65.02 110.99 1.1090\n+IC H27A C25 *C27 H27B 1.1090 110.99 120.78 110.60 1.1105\n+IC H27A C25 *C27 H27C 1.1090 110.99 -119.50 110.05 1.1102\n+IC C23 C24 C28 H28C 1.5490 111.77 178.60 110.60 1.1100\n+IC H28C C24 *C28 H28A 1.1100 110.60 -120.57 110.78 1.1093\n+IC H28A C24 *C28 H28B 1.1093 110.78 -119.84 110.51 1.1095\n+\n+end\n+\n+read param card flex @app\n+* cholesterol parameters\n+*\n+\n+BONDS\n+!\n+!V(bond) = Kb(b - b0)**2\n+!\n+!Kb: kcal/mole/A**2\n+!b0: A\n+!\n+!atom type Kb b0\n+!\n+! added from par_all35_lipid_jbl.prm by jbl\n+CEL1 CTL1 240.000 1.502 ! from CEL1 CTL2: sR12cc (c8-c39)\n+! added for new mixing rule for decalin/heptane by jbl\n+! CRL1 equivalent to CTL1, HGA1 equivalent to HAL1, etc. (jbl)\n+CTL1 CRL1 222.500 1.500 ! alkanes, 3/92\n+CRL1 CRL1 222.500 1.500 ! alkanes, 3/92\n+CRL1 CTL2 222.500 1.538 ! alkanes, 3/92\n+CRL1 CRL2 222.500 1.538 ! alkanes, 3/92\n+CTL1 CRL2 222.500 1.538 ! alkanes, 3/92\n+CRL2 CRL2 222.500 1.530 ! alkanes, 3/92\n+CTL2 CRL2 222.500 1.530 ! alkanes, 3/92\n+CRL1 HGA1 309.00 1.111 ! alkanes, 3/92\n+CRL2 HGA2 309.00 1.111 ! alkanes, 4/98\n+OHL CRL1 428.0 1.420 ! glycerol\n+CRL1 CTL3 222.500 1.538 ! alkanes, 3/92\n+CEL1 CRL2 365.000 1.502 ! butene; from propene, yin,adm jr., 12/95\n+CEL1 CRL1 240.000 1.502 ! from CEL1 CTL2: sR12cc (c8-c39)\n+! Added for ergosterol (bjr 3/12)\n+! CEL1 CTL1 240.000 1.502 ! butene, yin,adm jr., 12/95\n+! for CHSD; added by Seonghoon, Im lab.\n+CRL1 OSL 340.00 1.430 ! From CG311 OG302\n+! for steryl glycoside\n+CRL1 OC301 360.00 1.4150 ! from CG311 OG301\n+\n+ANGLES\n+!\n+!V(angle) = Ktheta(Theta - Theta0)**2\n+!\n+!V(Urey-Bradley) = Kub(S - S0)**2\n+!\n+!Ktheta: kcal/mole/rad**2\n+!Theta0: degrees\n+!Kub: kcal/mole/A**2 (Urey-Bradley)\n+!S0: A\n+!\n+!atom types Ktheta Theta0 Kub S0\n+!\n+!\n+! Added from par_al35_lipid.prm by jbl\n+\n+CTL1 CTL2 CEL1 32.00 112.20 !from CEL1 CTL2 CTL2 !all CEL1 containing terms will\n+CTL1 CEL1 CTL2 50.00 113.00 !guess FC, eq. angle to yield 360 deg sum\n+CEL1 CEL1 CTL1 48.00 123.50 ! from CEL1 CEL1 CTL1\n+CTL1 CTL1 CEL1 32.00 112.20 !from CEL1 CTL2 CTL2\n+CTL3 CTL1 CEL1 32.00 112.20 !from CEL1 CTL2 CTL2\n+CTL2 CTL1 CEL1 32.00 112.20 !from CEL1 CTL2 CTL2 !involve the dR1 and dR2 terms\n+OHL CTL1 CTL3 75.700 110.10 ! glycerol\n+! added for new mixing rule for decalin/heptane by jbl\n+! CRL1 equivalent to CTL1, HGA1 equivalent to HAL1, etc. (jbl)\n+HOL OHL CRL1 57.500 106.00 ! glycerol\n+OHL CRL1 CRL2 75.700 110.10 ! glycerol\n+OHL CRL1 HGA1 45.900 108.89 ! glycerol\n+HAL3 CTL3 CRL1 33.430 110.10 22.53 2.179 ! alkane, 4/98\n+CRL1 CRL1 CTL3 53.350 108.50 8.00 2.561 ! alkane, 3/92\n+CRL2 CRL1 CTL3 58.350 113.50 11.16 2.561 ! glycerol\n+HEL1 CEL1 CRL2 40.00 116.00 ! 1-butene; from propene, yin,adm jr., 12/95\n+HGA2 CRL2 CEL1 45.00 111.50 ! 1-butene; from propene, yin,adm jr., 12/95\n+HAL2 CRL2 CEL1 45.00 111.50 ! 1-butene; from propene, yin,adm jr., 12/95\n+HGA2 CTL2 CEL1 45.00 111.50 ! 1-butene; from propene, yin,adm jr., 12/95\n+CRL1 CRL2 CEL1 32.00 112.20 !from CEL1 CTL2 CTL2 !all CEL1 containing terms will\n+CEL1 CEL1 CRL2 48.00 123.50 ! from 2-butene, yin,adm jr., 12/95\n+CEL1 CEL1 CRL1 48.00 123.50 ! from CEL1 CEL1 CTL1\n+CRL1 CRL1 CEL1 32.00 112.20 !from CEL1 CTL2 CTL2\n+CTL1 CRL1 CEL1 32.00 112.20 !from CEL1 CTL2 CTL2\n+CRL1 CTL1 CEL1 32.00 112.20 !from CEL1 CTL2 CTL2\n+CTL3 CRL1 CEL1 32.00 112.20 !from CEL1 CTL2 CTL2\n+CRL2 CRL1 CEL1 32.00 112.20 !from CEL1 CTL2 CTL2 !involve the dR1 and dR2 terms\n+CTL2 CRL1 CEL1 32.00 112.20 !from CEL1 CTL2 CTL2 !involve the dR1 and dR2 terms\n+CRL2 CTL1 CEL1 32.00 112.20 !from CEL1 CTL2 CTL2 !involve the dR1 and dR2 terms\n+CRL2 CRL1 CTL2 58.350 113.50 11.16 2.561 ! glycerol\n+CRL2 CRL1 CRL2 58.350 113.50 11.16 2.561 ! glycerol\n+HGA1 CRL1 CTL2 34.500 110.10 22.53 2.179 ! alkane, 3/92\n+HGA1 CRL1 CRL2 34.500 110.10 22.53 2.179 ! alkane, 3/92\n+CRL1 CRL1 CTL2 58.350 113.50 11.16 2.561 ! glycerol\n+CRL1 CRL1 CRL2 58.350 113.50 11.16 2.561 ! glycerol\n+CRL1 CTL2 CTL3 58.350 113.50 11.16 2.561 ! glycerol\n+HAL2 CTL2 CRL1 26.500 110.10 22.53 2.179 ! alkane, 4/98\n+HGA2 CRL2 CRL1 26.500 110.10 22.53 2.179 ! alkane, 4/98\n+CRL1 CTL2 CTL2 58.350 113.50 11.16 2.561 ! glycerol\n+CRL1 CRL2 CRL2 58.350 113.50 11.16 2.561 ! glycerol\n+CRL1 CEL1 CRL2 50.00 113.00 !guess FC, eq. angle to yield 360 deg sum\n+CRL1 CRL1 CRL1 53.350 111.00 8.00 2.561 ! alkane, 3/92\n+CTL1 CRL1 CRL2 58.350 113.50 11.16 2.561 ! glycerol\n+HGA1 CRL1 CTL1 34.500 110.10 22.53 2.179 ! alkane, 3/92\n+HGA1 CRL1 CRL1 34.500 110.10 22.53 2.179 ! alkane, 3/92\n+CTL1 CRL1 CRL1 53.350 111.00 8.00 2.561 ! alkane, 3/92\n+HAL1 CTL1 CRL1 34.500 110.10 22.53 2.179 ! alkane, 3/92\n+CRL1 CTL1 CTL3 53.350 108.50 8.00 2.561 ! alkane, 3/92\n+CRL1 CTL1 CTL2 58.350 113.50 11.16 2.561 ! glycerol\n+CEL2 CEL1 CRL2 48.00 126.00 ! 1-butene; from propene, yin,adm jr., 12/95\n+CEL1 CRL2 CRL2 32.00 112.20 ! 1-butene; from propene, yin,adm jr., 12/95\n+CEL1 CTL2 CRL2 32.00 112.20 ! 1-butene; from propene, yin,adm jr., 12/95\n+CEL1 CRL2 CTL2 32.00 112.20 ! 1-butene; from propene, yin,adm jr., 12/95\n+CEL1 CRL2 CTL3 32.00 112.20 ! 1-butene; from propene, yin,adm jr., 12/95\n+CEL1 CRL2 CEL1 30.0 114.0 ! 1,4-dipentene, adm jr., 2/00\n+CTL1 CRL2 CEL1 32.00 112.20 !from CEL1 CTL2 CTL2 !all CEL1 containing terms will\n+CRL1 CTL2 CEL1 32.00 112.20 !from CEL1 CTL2 CTL2 !all CEL1 containing terms will\n+CTL1 CEL1 CRL2 50.00 113.00 !guess FC, eq. angle to yield 360 deg sum\n+CRL1 CEL1 CTL2 50.00 113.00 !guess FC, eq. angle to yield 360 deg sum\n+HGA2 CRL2 HGA2 35.500 109.00 5.40 1.80200 ! alkane, 3/92\n+HGA2 CRL2 CRL2 26.500 110.10 22.53 2.179 ! alkane, 4/98\n+HGA1 CRL1 CTL3 34.500 110.10 22.53 2.179 ! alkane, 3/92\n+CRL2 CRL2 CRL2 58.350 113.60 11.16 2.561 ! alkane, 3/92\n+!Angles appended for ergosterol (bjr)\n+CEL1 CEL1 CEL1 48.00 123.50 ! From CEL1 CEL1 CTL1\n+CRL1 CEL1 CRL1 50.00 113.00 ! From CTL1 CEL1 CTL2\n+CEL1 CRL1 HGA1 45.00 111.50 ! From HAL2 CTL2 CEL1\n+HEL1 CEL1 CTL1 40.00 116.00 ! From HAL2 CTL2 CEL1\n+CTL1 CEL1 CTL1 50.00 113.00 !guess from CTL1 CEL1 CTL2\n+CEL1 CTL1 HAL1 45.00 111.50 !guess from HAL2 CTL2 CEL1\n+! for CHSD; added by Seonghoon, Im lab.\n+HGA1 CRL1 OSL 60.00 109.50 ! From OG302 CG311 HGA1\n+OSL CRL1 CRL2 115.00 109.70 ! From CG321 CG311 OG302\n+CRL1 OSL CL 40.00 109.60 30.00 2.2651 ! From CG2O2 OG302 CG311\n+! for Lanosterol\n+CTL3 CRL1 CTL3 58.350 113.50 11.16 2.561 ! CTL3 CTL1 CTL3 or CG331 CG301 CG331\n+CTL3 CEL1 CTL3 58.350 113.50 11.16 2.561 ! CTL3 CTL1 CTL3 or CG331 CG301 CG331\n+! for steryl glycoside\n+CC3162 OC301 CRL1 95.00 109.70 ! from CG321 OG301 CG321\n+OC301 CRL1 HGA1 60.00 109.50 ! from OG301 CG311 HGA1 \n+OC301 CRL1 CRL2 115.00 109.70 ! from CG321 CG311 OG302\n+\n+DIHEDRALS\n+!\n+!V(dihedral) = Kchi(1 + cos(n(chi) - delta))\n+!\n+!Kchi: kcal/mole\n+!n: multiplicity\n+!delta: degrees\n+!\n+!atom types Kchi n delta\n+!\n+! added for new mixing rule for decalin/heptane by jbl\n+! CRL1 equivalent to CTL1, HGA1 equivalent to HAL1, etc. (jbl)\n+CRL1 CRL1 CTL1 CTL2 0.000 3 0.00 ! 6/10, jbk\n+CRL1 CTL1 CTL2 CTL3 0.1218 3 180.00 ! 6/10, jbk\n+CRL1 CTL1 CTL2 CTL3 0.2175 2 180.00 ! 6/10, jbk\n+CRL1 CTL1 CTL2 CTL3 0.2398 1 180.00 ! 6/10, jbk\n+CRL1 CTL1 CTL2 CTL2 0.1218 3 180.00 ! 6/10, jbk\n+CRL1 CTL1 CTL2 CTL2 0.2175 2 180.00 ! 6/10, jbk\n+CRL1 CTL1 CTL2 CTL2 0.2398 1 180.00 ! 6/10, jbk\n+CRL1 CRL2 CEL1 CRL1 0.30 3 180.0 ! torR1\n+CTL1 CRL2 CEL1 CRL1 0.30 3 180.0 ! torR1\n+CRL1 CTL2 CEL1 CRL1 0.30 3 180.0 ! torR1\n+CRL1 CRL2 CEL1 CTL1 0.30 3 180.0 ! torR1\n+CTL1 CTL2 CEL1 CRL1 0.30 3 180.0 ! torR1\n+CTL1 CRL2 CEL1 CTL1 0.30 3 180.0 ! torR1\n+CRL1 CTL2 CEL1 CTL1 0.30 3 180.0 ! torR1\n+X CRL1 OHL X 0.14 3 0.00 ! glycerol\n+X CRL2 OHL X 0.14 3 0.00 ! glycerol\n+CRL2 CEL1 CRL1 CRL1 0.00 3 180.0 ! bR12\n+CTL2 CEL1 CRL1 CRL1 0.00 3 180.0 ! bR12\n+CRL2 CEL1 CTL1 CRL1 0.00 3 180.0 ! bR12\n+CRL2 CEL1 CRL1 CTL1 0.00 3 180.0 ! bR12\n+CTL2 CEL1 CTL1 CRL1 0.00 3 180.0 ! bR12\n+CTL2 CEL1 CRL1 CTL1 0.00 3 180.0 ! bR12\n+CRL2 CEL1 CTL1 CTL1 0.00 3 180.0 ! bR12\n+CTL2 CEL1 CRL1 CTL3 0.00 3 180.0 ! bR12\n+CRL2 CEL1 CTL1 CTL3 0.00 3 180.0 ! bR12\n+CRL2 CEL1 CRL1 CRL2 0.30 3 180.0 ! torR1\n+CRL2 CEL1 CRL1 CTL2 0.30 3 180.0 ! torR1\n+CRL2 CEL1 CTL1 CRL2 0.30 3 180.0 ! torR1\n+CTL2 CEL1 CRL1 CRL2 0.30 3 180.0 ! torR1\n+CRL2 CEL1 CTL1 CTL2 0.30 3 180.0 ! torR1\n+CTL2 CEL1 CRL1 CTL2 0.30 3 180.0 ! torR1\n+CTL2 CEL1 CTL1 CRL2 0.30 3 180.0 ! torR1\n+CEL1 CEL1 CRL2 HGA2 0.3000 3 180.00 !2-butene, adm jr., 4/04\n+CEL1 CEL1 CRL2 HAL2 0.3000 3 180.00 !2-butene, adm jr., 4/04\n+CEL1 CEL1 CTL2 HGA2 0.3000 3 180.00 !2-butene, adm jr., 4/04\n+CEL1 CEL1 CRL2 CRL1 0.5000 1 180.0 ! torR2, CEL1 CEL1 CTL2 CTL2\n+CEL1 CEL1 CRL2 CRL1 1.3000 3 180.0 !\n+CEL1 CEL1 CTL2 CRL1 0.5000 1 180.0 ! torR2, CEL1 CEL1 CTL2 CTL2\n+CEL1 CEL1 CTL2 CRL1 1.3000 3 180.0 !\n+CEL1 CEL1 CRL2 CTL1 0.5000 1 180.0 ! torR2, CEL1 CEL1 CTL2 CTL2\n+CEL1 CEL1 CRL2 CTL1 1.3000 3 180.0 !\n+CEL1 CEL1 CRL1 CRL2 0.5000 1 180.0 ! bR12, CEL1 CEL1 CTL2 CTL2\n+CEL1 CEL1 CRL1 CRL2 1.3000 3 180.0 !\n+CEL1 CEL1 CTL1 CRL2 0.5000 1 180.0 ! bR12, CEL1 CEL1 CTL2 CTL2\n+CEL1 CEL1 CTL1 CRL2 1.3000 3 180.0 !\n+CEL1 CEL1 CRL1 CTL2 0.5000 1 180.0 ! bR12, CEL1 CEL1 CTL2 CTL2\n+CEL1 CEL1 CRL1 CTL2 1.3000 3 180.0 !\n+CEL1 CEL1 CRL1 CTL3 0.5000 1 180.0 ! bR13, rCH3, CEL1 CEL1 CTL2 CTL2\n+CEL1 CEL1 CRL1 CTL3 1.3000 3 180.0 !\n+CEL1 CEL1 CRL2 CTL3 0.9000 1 180.00 !2-pentene and 3-heptene\n+CEL1 CEL1 CRL2 CTL3 0.2000 2 180.00 !2-pentene and 3-heptene\n+CEL1 CRL2 CRL2 CTL3 0.1400 1 180.0 !2-hexene, adm jr., 11/09 (from jbklauda)\n+CEL1 CRL2 CRL2 CTL3 0.1700 2 0.0 !2-hexene, adm jr., 11/09 (from jbklauda)\n+CEL1 CRL2 CRL2 CTL3 0.0500 3 180.0 !2-hexene, adm jr., 11/09 (from jbklauda)\n+CEL1 CRL2 CTL2 CTL3 0.1400 1 180.0 !2-hexene, adm jr., 11/09 (from jbklauda)\n+CEL1 CRL2 CTL2 CTL3 0.1700 2 0.0 !2-hexene, adm jr., 11/09 (from jbklauda)\n+CEL1 CRL2 CTL2 CTL3 0.0500 3 180.0 !2-hexene, adm jr., 11/09 (from jbklauda)\n+CEL1 CTL2 CRL2 CTL3 0.1400 1 180.0 !2-hexene, adm jr., 11/09 (from jbklauda)\n+CEL1 CTL2 CRL2 CTL3 0.1700 2 0.0 !2-hexene, adm jr., 11/09 (from jbklauda)\n+CEL1 CTL2 CRL2 CTL3 0.0500 3 180.0 !2-hexene, adm jr., 11/09 (from jbklauda)\n+CEL1 CEL1 CRL2 CEL1 1.000 1 180.00 !2,5-diheptane\n+CEL1 CEL1 CRL2 CEL1 0.100 2 0.00 !2,5-diheptane\n+CEL1 CEL1 CRL2 CEL1 0.300 3 180.00 !2,5-diheptane\n+CEL1 CEL1 CRL2 CEL1 0.200 4 0.00 !2,5-diheptane\n+CEL1 CEL1 CRL1 CRL1 0.5000 1 180.0 ! torR2, CEL1 CEL1 CTL2 CTL2\n+CEL1 CEL1 CRL1 CRL1 1.3000 3 180.0 !\n+CEL1 CEL1 CTL1 CRL1 0.5000 1 180.0 ! torR2, CEL1 CEL1 CTL2 CTL2\n+CEL1 CEL1 CTL1 CRL1 1.3000 3 180.0 !\n+CEL1 CEL1 CRL1 CTL1 0.5000 1 180.0 ! torR2, CEL1 CEL1 CTL2 CTL2\n+CEL1 CEL1 CRL1 CTL1 1.3000 3 180.0 !\n+CEL1 CEL1 CRL2 CRL2 0.9100 1 180.0 !2-hexene, adm jr., 11/09 (from jbklauda, 6/18)\n+CEL1 CEL1 CRL2 CRL2 0.1800 2 180.0 !2-hexene, adm jr., 11/09 (from jbklauda, 6/18)\n+CEL1 CEL1 CRL2 CRL2 0.1700 3 180.0 !2-hexene, adm jr., 11/09 (from jbklauda, 6/18)\n+CEL1 CEL1 CRL2 CTL2 0.9100 1 180.0 !2-hexene, adm jr., 11/09 (from jbklauda, 6/18)\n+CEL1 CEL1 CRL2 CTL2 0.1800 2 180.0 !2-hexene, adm jr., 11/09 (from jbklauda, 6/18)\n+CEL1 CEL1 CRL2 CTL2 0.1700 3 180.0 !2-hexene, adm jr., 11/09 (from jbklauda, 6/18)\n+CEL1 CEL1 CTL2 CRL2 0.9100 1 180.0 !2-hexene, adm jr., 11/09 (from jbklauda, 6/18)\n+CEL1 CEL1 CTL2 CRL2 0.1800 2 180.0 !2-hexene, adm jr., 11/09 (from jbklauda, 6/18)\n+CEL1 CEL1 CTL2 CRL2 0.1700 3 180.0 !2-hexene, adm jr., 11/09 (from jbklauda, 6/18)\n+CEL1 CRL2 CRL2 CRL2 0.1400 1 180.0 !2-hexene, adm jr., 11/09 (from jbklauda)\n+CEL1 CRL2 CRL2 CRL2 0.1700 2 0.0 !2-hexene, adm jr., 11/09 (from jbklauda)\n+CEL1 CRL2 CRL2 CRL2 0.0500 3 180.0 !2-hexene, adm jr., 11/09 (from jbklauda)\n+CEL1 CRL2 CTL2 CTL2 0.1400 1 180.0 !2-hexene, adm jr., 11/09 (from jbklauda)\n+CEL1 CRL2 CTL2 CTL2 0.1700 2 0.0 !2-hexene, adm jr., 11/09 (from jbklauda)\n+CEL1 CRL2 CTL2 CTL2 0.0500 3 180.0 !2-hexene, adm jr., 11/09 (from jbklauda)\n+CEL1 CTL2 CRL2 CTL2 0.1400 1 180.0 !2-hexene, adm jr., 11/09 (from jbklauda)\n+CEL1 CTL2 CRL2 CTL2 0.1700 2 0.0 !2-hexene, adm jr., 11/09 (from jbklauda)\n+CEL1 CTL2 CRL2 CTL2 0.0500 3 180.0 !2-hexene, adm jr., 11/09 (from jbklauda)\n+CEL1 CTL2 CTL2 CRL2 0.1400 1 180.0 !2-hexene, adm jr., 11/09 (from jbklauda)\n+CEL1 CTL2 CTL2 CRL2 0.1700 2 0.0 !2-hexene, adm jr., 11/09 (from jbklauda)\n+CEL1 CTL2 CTL2 CRL2 0.0500 3 180.0 !2-hexene, adm jr., 11/09 (from jbklauda)\n+CEL1 CRL2 CRL2 CTL2 0.1400 1 180.0 !2-hexene, adm jr., 11/09 (from jbklauda)\n+CEL1 CRL2 CRL2 CTL2 0.1700 2 0.0 !2-hexene, adm jr., 11/09 (from jbklauda)\n+CEL1 CRL2 CRL2 CTL2 0.0500 3 180.0 !2-hexene, adm jr., 11/09 (from jbklauda)\n+CEL1 CRL2 CTL2 CRL2 0.1400 1 180.0 !2-hexene, adm jr., 11/09 (from jbklauda)\n+CEL1 CRL2 CTL2 CRL2 0.1700 2 0.0 !2-hexene, adm jr., 11/09 (from jbklauda)\n+CEL1 CRL2 CTL2 CRL2 0.0500 3 180.0 !2-hexene, adm jr., 11/09 (from jbklauda)\n+CEL1 CTL2 CRL2 CRL2 0.1400 1 180.0 !2-hexene, adm jr., 11/09 (from jbklauda)\n+CEL1 CTL2 CRL2 CRL2 0.1700 2 0.0 !2-hexene, adm jr., 11/09 (from jbklauda)\n+CEL1 CTL2 CRL2 CRL2 0.0500 3 180.0 !2-hexene, adm jr., 11/09 (from jbklauda)\n+X CRL1 CTL1 X 0.200 3 0.00 ! alkane, 3/92\n+X CRL1 CRL1 X 0.200 3 0.00 ! alkane, 3/92\n+X CRL1 CTL2 X 0.200 3 0.00 ! alkane, 3/92\n+X CRL1 CRL2 X 0.200 3 0.00 ! alkane, 3/92\n+X CTL1 CRL2 X 0.200 3 0.00 ! alkane, 3/92\n+X CRL1 CTL3 X 0.200 3 0.00 ! alkane, 3/92\n+X CTL2 CRL2 X 0.1900 3 0.00 ! alkane, 4/98, yin and mackerell\n+X CRL2 CRL2 X 0.1900 3 0.00 ! alkane, 4/98, yin and mackerell\n+X CRL2 CTL3 X 0.1600 3 0.00 ! alkane, 4/98, yin and mackerell\n+CRL2 CEL1 CRL1 CTL3 0.00 3 180.0 ! bR12\n+X CRL1 NH3L X 0.1000 3 0.00 ! for POPS\n+HEL1 CEL1 CRL2 CRL1 0.00 3 0.0 ! wC9H, HEL1 CEL1 CTL2 CTL2\n+HEL1 CEL1 CTL2 CRL1 0.00 3 0.0 ! wC9H, HEL1 CEL1 CTL2 CTL2\n+HEL1 CEL1 CRL2 CTL1 0.00 3 0.0 ! wC9H, HEL1 CEL1 CTL2 CTL2\n+HEL1 CEL1 CRL2 CTL2 0.1200 3 0.00 ! butene, yin,adm jr., 12/95\n+HEL1 CEL1 CTL2 CRL2 0.1200 3 0.00 ! butene, yin,adm jr., 12/95\n+HEL1 CEL1 CRL2 CTL3 0.1200 3 0.00 ! butene, yin,adm jr., 12/95\n+HEL1 CEL1 CRL2 HGA2 0.0000 3 0.00 ! butene, adm jr., 2/00 update\n+HEL1 CEL1 CTL2 HGA2 0.0000 3 0.00 ! butene, adm jr., 2/00 update\n+HEL1 CEL1 CRL2 HAL2 0.0000 3 0.00 ! butene, adm jr., 2/00 update\n+CEL1 CRL2 CEL1 HEL1 0.000 2 0.00 !1,4-dipentene\n+CEL1 CRL2 CEL1 HEL1 0.000 3 0.00 !1,4-dipentene\n+CRL2 CEL1 CEL2 HEL2 5.2000 2 180.00 ! propene, yin,adm jr., 12/95\n+CEL2 CEL1 CRL2 CRL2 0.5000 1 180.00 ! 1-butene, adm jr., 2/00 update\n+CEL2 CEL1 CRL2 CRL2 1.3000 3 180.00 ! 1-butene, adm jr., 2/00 update\n+CEL2 CEL1 CTL2 CRL2 0.5000 1 180.00 ! 1-butene, adm jr., 2/00 update\n+CEL2 CEL1 CTL2 CRL2 1.3000 3 180.00 ! 1-butene, adm jr., 2/00 update\n+CEL2 CEL1 CRL2 CTL2 0.5000 1 180.00 ! 1-butene, adm jr., 2/00 update\n+CEL2 CEL1 CRL2 CTL2 1.3000 3 180.00 ! 1-butene, adm jr., 2/00 update\n+CEL2 CEL1 CRL2 CTL3 0.5000 1 180.00 ! 1-butene, adm jr., 2/00 update\n+CEL2 CEL1 CRL2 CTL3 1.3000 3 180.00 ! 1-butene, adm jr., 2/00 update\n+CEL2 CEL1 CRL2 HGA2 0.1200 3 0.00 ! 1-butene, yin,adm jr., 12/95\n+CEL2 CEL1 CTL2 HGA2 0.1200 3 0.00 ! 1-butene, yin,adm jr., 12/95\n+CEL2 CEL1 CRL2 HAL2 0.1200 3 0.00 ! 1-butene, yin,adm jr., 12/95\n+CEL2 CEL1 CRL2 CEL1 1.200 1 180.00 !1,4-dipentene\n+CEL2 CEL1 CRL2 CEL1 0.400 2 180.00 !1,4-dipentene\n+CEL2 CEL1 CRL2 CEL1 1.300 3 180.00 !1,4-dipentene\n+HGA2 CRL2 CEL1 CRL1 0.0300 3 0.0 ! CH2 wag and twist, from CEL1 CEL1 CTL2 HAL2\n+HAL2 CRL2 CEL1 CRL1 0.0300 3 0.0 ! CH2 wag and twist, from CEL1 CEL1 CTL2 HAL2\n+HGA2 CTL2 CEL1 CRL1 0.0300 3 0.0 ! CH2 wag and twist, from CEL1 CEL1 CTL2 HAL2\n+HGA2 CRL2 CEL1 CTL1 0.0300 3 0.0 ! CH2 wag and twist, from CEL1 CEL1 CTL2 HAL2\n+HGA2 CTL2 CEL1 CTL1 0.0300 3 0.0 ! CH2 wag and twist, from CEL1 CEL1 CTL2 HAL2\n+HAL2 CRL2 CEL1 CTL1 0.0300 3 0.0 ! CH2 wag and twist, from CEL1 CEL1 CTL2 HAL2\n+HAL2 CTL2 CEL1 CRL1 0.0300 3 0.0 ! CH2 wag and twist, from CEL1 CEL1 CTL2 HAL2\n+HEL1 CEL1 CRL2 CRL2 0.1200 3 0.00 ! butene, yin,adm jr., 12/95\n+!Dihedrals appended for ergosterol (bjr)\n+CEL1 CEL1 CTL1 HAL1 0.3000 3 180.00 ! From 2-butene\n+CEL1 CEL1 CRL1 HGA1 0.3000 3 180.00 ! From CEL1 CEL1 CRL2 HGA2\n+X CEL1 CTL1 X 0.000 3 180.00 ! from br12\n+HAL2 CTL2 CEL1 CTL1 0.0300 3 0.0 ! CH2 wag and twist, from CEL1 CEL1 CTL2 HAL2\n+CEL1 CEL1 CTL2 CTL1 0.5000 1 180.0 ! torR2, CEL1 CEL1 CTL2 CTL2\n+CEL1 CEL1 CTL2 CTL1 1.3000 3 180.0 !\n+CTL1 CTL2 CEL1 CTL1 0.30 3 180.0 ! torR1\n+X CEL1 CRL1 X 0.000 3 180.00 ! from br12\n+! for CHSD; added by Seonghoon, Im lab.\n+HGA1 CRL1 OSL CL 0.0000 3 0.00 ! From HGA1 CG311 OG302 CG2O2\n+CL OSL CRL1 CRL2 0.7000 1 180.00 ! From CG321 CG311 OG302 CG2O2\n+! for Lanosterol\n+CRL2 CRL2 CEL1 CRL1 0.5000 1 180.0 ! bR12, CEL1 CEL1 CTL2 CTL2\n+CTL3 CEL1 CTL3 HAL3 0.1600 3 0.00 ! CG331 CG301 CG331 HGA3\n+! for steryl glycoside\n+CC3162 OC301 CRL1 HGA1 0.2840 3 0.00 ! from HGA1 CG311 OG301 CG331 \n+CC3162 OC301 CRL1 CRL2 0.4000 1 0.00 ! from CG331 CG311 OG301 CG331\n+CC3162 OC301 CRL1 CRL2 0.4900 3 0.00 ! from CG331 CG311 OG301 CG331\n+HCA1 CC3162 OC301 CRL1 0.2840 3 0.00 ! from HGA1 CG311 OG301 CG331\n+OC3C61 CC3162 OC301 CRL1 0.5100 1 0.00 ! from OG301 CG301 OG301 CG331\n+OC3C61 CC3162 OC301 CRL1 0.6700 2 0.00 ! from OG301 CG301 OG301 CG331\n+OC3C61 CC3162 OC301 CRL1 0.2600 3 0.00 ! from OG301 CG301 OG301 CG331\n+CC3161 CC3162 OC301 CRL1 0.4000 1 0.00 ! from CG331 CG311 OG301 CG331 \n+CC3161 CC3162 OC301 CRL1 0.4900 3 0.00 ! from CG331 CG311 OG301 CG331 \n+\n+NONBONDED nbxmod 5 atom cdiel fshift vatom vdistance vfswitch -\n+cutnb 14.0 ctofnb 12.0 ctonnb 10.0 eps 1.0 e14fac 1.0 wmin 1.5\n+!\n+!V(Lennard-Jones) = Eps,i,j[(Rmin,i,j/ri,j)**12 - 2(Rmin,i,j/ri,j)**6]\n+!\n+!epsilon: kcal/mole, Eps,i,j = sqrt(eps,i * eps,j)\n+!Rmin/2: A, Rmin,i,j = Rmin/2,i + Rmin/2,j\n+!\n+!atom ignored epsilon Rmin/2 ignored eps,1-4 Rmin/2,1-4\n+!\n+! added for new mixing rule for decalin and heptane by jbl\n+\n+NBFIX\n+! Emin Rmin\n+! (kcal/mol) (A)\n+!\n+! added for new mixing rule for decalin/heptane by jbl\n+CRL1 HAL2 -0.0321 3.3500\n+HGA1 HAL2 -0.0359 2.6800\n+CRL2 HAL2 -0.0415 3.3600\n+HGA2 HAL2 -0.0317 2.6800\n+CRL1 HAL1 -0.0293 3.3500\n+HGA1 HAL1 -0.0329 2.6800\n+CRL2 HAL1 -0.0379 3.3600\n+HGA2 HAL1 -0.0289 2.6800\n+CRL1 CTL1 -0.0275 4.0100\n+HGA1 CTL1 -0.0308 3.3400\n+CRL2 CTL1 -0.0355 4.0200\n+HGA2 CTL1 -0.0271 3.3400\n+\n+end\n+\n+return\n+\n+endif\n+\n+! Original model of Suits et al., which is used on ANTON as well as\n+!being suitable for other systems (set chol_model 2 (or anything but 1....))\n+!\n+!Suits, F., Pitman, M., MacKerell, A.D., Jr., Feller, S.E. \"Molecular Level \n+!Organization of Saturated and Polyunsaturated Fatty Acids in a \n+!Phosphatidylcholine Bilayer Containing Cholesterol\" Biochemistry,\n+!43(49):15318-28, 2004\n+!\n+\n+read rtf card @app\n+* cholesterol residues\n+*\n+36 1\n+\n+RESI CHL1 0.00 !cholesterol (name to avoid conflict with choline)\n+! atoms names correspond to the correct cholesterol nomenclature\n+GROUP\n+ATOM C3 CTL1 0.14 \n+ATOM H3 HAL1 0.09\n+ATOM O3 OHL -0.66\n+ATOM H3' HOL 0.43\n+GROUP\n+ATOM C4 CTL2 -0.18 \n+ATOM H4A HAL2 0.09\n+ATOM H4B HAL2 0.09\n+GROUP\n+ATOM C5 CEL1 0.00\n+ATOM C6 CEL1 -0.15\n+ATOM H6 HEL1 0.15\n+GROUP\n+ATOM C7 CTL2 -0.18\n+ATOM H7A HAL2 0.09\n+ATOM H7B HAL2 0.09\n+GROUP\n+ATOM C8 CTL1 -0.09\n+ATOM H8 HAL1 0.09 \n+GROUP\n+ATOM C14 CTL1 -0.09\n+ATOM H14 HAL1 0.09 \n+GROUP\n+ATOM C15 CTL2 -0.18\n+ATOM H15A HAL2 0.09\n+ATOM H15B HAL2 0.09\n+GROUP\n+ATOM C16 CTL2 -0.18\n+ATOM H16A HAL2 0.09\n+ATOM H16B HAL2 0.09\n+GROUP\n+ATOM C17 CTL1 -0.09\n+ATOM H17 HAL1 0.09\n+GROUP\n+ATOM C13 CTL1 0.00\n+GROUP\n+ATOM C18 CTL3 -0.27 !methyl at c13\n+ATOM H18A HAL3 0.09\n+ATOM H18B HAL3 0.09\n+ATOM H18C HAL3 0.09\n+GROUP\n+ATOM C12 CTL2 -0.18\n+ATOM H12A HAL2 0.09\n+ATOM H12B HAL2 0.09\n+GROUP\n+ATOM C11 CTL2 -0.18\n+ATOM H11A HAL2 0.09\n+ATOM H11B HAL2 0.09\n+GROUP\n+ATOM C9 CTL1 -0.09\n+ATOM H9 HAL1 0.09\n+GROUP\n+ATOM C10 CTL1 0.00\n+GROUP\n+ATOM C19 CTL3 -0.27 !methyl at c10\n+ATOM H19A HAL3 0.09\n+ATOM H19B HAL3 0.09\n+ATOM H19C HAL3 0.09\n+GROUP\n+ATOM C1 CTL2 -0.18\n+ATOM H1A HAL2 0.09\n+ATOM H1B HAL2 0.09\n+GROUP\n+ATOM C2 CTL2 -0.18\n+ATOM H2A HAL2 0.09\n+ATOM H2B HAL2 0.09\n+GROUP\n+ATOM C20 CTL2 -0.09\n+ATOM H20 HAL2 0.09\n+GROUP\n+ATOM C21 CTL3 -0.27\n+ATOM H21A HAL3 0.09\n+ATOM H21B HAL3 0.09\n+ATOM H21C HAL3 0.09\n+GROUP\n+ATOM C22 CTL2 -0.18\n+ATOM H22A HAL2 0.09\n+ATOM H22B HAL2 0.09\n+GROUP\n+ATOM C23 CTL2 -0.18\n+ATOM H23A HAL2 0.09\n+ATOM H23B HAL2 0.09\n+GROUP\n+ATOM C24 CTL2 -0.18 !beyond this nomenclature may not be correct\n+ATOM H24A HAL2 0.09\n+ATOM H24B HAL2 0.09\n+GROUP\n+ATOM C25 CTL1 -0.09 !c25\n+ATOM H25 HAL1 0.09\n+GROUP\n+ATOM C26 CTL3 -0.27 !terminal methyl, c26\n+ATOM H26A HAL3 0.09\n+ATOM H26B HAL3 0.09\n+ATOM H26C HAL3 0.09\n+GROUP\n+ATOM C27 CTL3 -0.27 !terminal methyl, c27\n+ATOM H27A HAL3 0.09\n+ATOM H27B HAL3 0.09\n+ATOM H27C HAL3 0.09\n+\n+BOND C3 O3 C3 H3 O3 H3'\n+BOND C3 C2 C2 H2A C2 H2B\n+BOND C2 C1 C1 H1A C1 H1B\n+BOND C3 C4 C4 H4A C4 H4B\n+BOND C4 C5\n+BOND C5 C10 \n+BOND C10 C1\n+BOND C10 C19 C19 H19A C19 H19B C19 H19C\n+DOUBLE C5 C6 \n+BOND C6 H6\n+BOND C6 C7 C7 H7A C7 H7B\n+BOND C7 C8 C8 H8\n+BOND C8 C9 C9 H9\n+BOND C9 C10\n+BOND C8 C14 C14 H14\n+BOND C14 C13\n+BOND C13 C12 C12 H12A C12 H12B\n+BOND C12 C11 C11 H11A C11 H11B\n+BOND C11 C9\n+BOND C13 C18 C18 H18A C18 H18B C18 H18C\n+BOND C14 C15 C15 H15A C15 H15B\n+BOND C15 C16 C16 H16A C16 H16B\n+BOND C16 C17 C17 H17\n+BOND C17 C13\n+BOND C17 C20 C20 H20\n+BOND C20 C21 C21 H21A C21 H21B C21 H21C\n+BOND C20 C22 C22 H22A C22 H22B\n+BOND C22 C23 C23 H23A C23 H23B\n+BOND C23 C24 C24 H24A C24 H24B\n+BOND C24 C25 C25 H25\n+BOND C25 C26 C26 H26A C26 H26B C26 H26C\n+BOND C25 C27 C27 H27A C27 H27B C27 H27C\n+!ICs based on CHARMM optimized structure\n+IC C1 C2 C3 C4 1.5383 110.44 55.92 110.66 1.5367\n+IC C4 C2 *C3 O3 1.5367 110.66 120.28 109.14 1.4158\n+IC O3 C2 *C3 H3 1.4158 109.14 118.92 109.40 1.1155\n+IC C2 C3 O3 H3' 1.5311 109.14 -58.51 105.39 0.9593\n+IC C2 C3 C4 C5 1.5311 110.66 -55.96 111.70 1.5156\n+IC C5 C3 *C4 H4A 1.5156 111.70 121.99 109.16 1.1099\n+IC H4A C3 *C4 H4B 1.1099 109.16 115.03 107.34 1.1142\n+IC C3 C4 C5 C10 1.5367 111.70 54.04 115.09 1.5304\n+IC C10 C4 *C5 C6 1.5304 115.09 -177.32 121.28 1.3432\n+IC C4 C5 C6 C7 1.5156 121.28 -178.39 123.88 1.5018\n+IC C7 C5 *C6 H6 1.5018 123.88 177.19 119.54 1.1001\n+IC C5 C6 C7 C8 1.3432 123.88 14.50 112.36 1.5506\n+IC C8 C6 *C7 H7A 1.5506 112.36 122.18 110.84 1.1114\n+IC H7A C6 *C7 H7B 1.1114 110.84 118.17 109.17 1.1124\n+IC C6 C7 C8 C14 1.5018 112.36 -165.89 110.02 1.5202\n+IC C14 C7 *C8 C9 1.5202 110.02 121.07 110.84 1.5327\n+IC C9 C7 *C8 H8 1.5327 110.84 119.34 108.18 1.1123\n+IC C7 C8 C14 C13 1.5506 110.02 179.73 115.21 1.5247\n+IC C13 C8 *C14 C15 1.5247 115.21 126.69 117.86 1.5382\n+IC C13 C8 *C14 H14 1.5247 115.21 -116.05 105.83 1.1205\n+IC C8 C14 C15 C16 1.5202 117.86 -163.10 103.40 1.5360\n+IC C16 C14 *C15 H15A 1.5360 103.40 117.45 109.62 1.1113\n+IC H15A C14 *C15 H15B 1.1113 109.62 121.32 111.94 1.1082\n+IC C14 C15 C16 C17 1.5382 103.40 7.85 106.79 1.5620\n+IC C17 C15 *C16 H16A 1.5620 106.79 118.96 109.25 1.1107\n+IC H16A C15 *C16 H16B 1.1107 109.25 120.76 111.65 1.1090\n+IC C13 C16 *C17 C20 1.5401 104.94 132.02 112.36 1.5633\n+IC C13 C16 *C17 H17 1.5401 104.94 -111.76 106.42 1.1153\n+IC C17 C14 *C13 C12 1.5401 100.27 122.68 106.98 1.5408\n+IC C12 C14 *C13 C18 1.5408 106.98 122.91 110.83 1.5518\n+IC C14 C13 C18 H18A 1.5247 110.83 60.33 111.48 1.1077\n+IC H18A C13 *C18 H18B 1.1077 111.48 119.80 110.01 1.1086\n+IC H18A C13 *C18 H18C 1.1077 111.48 -121.00 111.71 1.1067\n+IC C14 C13 C12 C11 1.5247 106.98 56.78 111.10 1.5422\n+IC C11 C13 *C12 H12A 1.5422 111.10 121.37 111.21 1.1067\n+IC H12A C13 *C12 H12B 1.1067 111.21 118.82 108.68 1.1119\n+IC C9 C12 *C11 H11A 1.5593 113.54 121.67 107.06 1.1093\n+IC H11A C12 *C11 H11B 1.1093 107.06 115.98 108.75 1.1100\n+IC C10 C8 *C9 H9 1.5531 112.73 -114.54 104.68 1.1185\n+IC C9 C5 *C10 C19 1.5531 111.91 -120.04 108.03 1.5524\n+IC C19 C5 *C10 C1 1.5524 108.03 -119.87 109.26 1.5579\n+IC C5 C10 C19 H19A 1.5304 108.03 -172.88 110.67 1.1082\n+IC H19A C10 *C19 H19B 1.1082 110.67 118.48 111.77 1.1080\n+IC H19A C10 *C19 H19C 1.1082 110.67 -120.66 110.97 1.1095\n+IC C2 C10 *C1 H1A 1.5383 114.55 122.42 109.26 1.1104\n+IC C2 C10 *C1 H1B 1.5383 114.55 -120.71 108.29 1.1134\n+IC C1 C3 *C2 H2A 1.5383 110.44 121.16 109.41 1.1119\n+IC H2A C3 *C2 H2B 1.1119 109.41 118.30 109.70 1.1112\n+IC C16 C17 C20 C22 1.5620 112.36 55.21 110.55 1.5476\n+IC C22 C17 *C20 C21 1.5476 110.55 125.88 113.32 1.5349\n+IC C21 C17 *C20 H20 1.5349 113.32 118.87 107.27 1.1157\n+IC C17 C20 C21 H21A 1.5633 113.32 64.90 110.93 1.1077\n+IC H21A C20 *C21 H21B 1.1077 110.93 -121.00 110.41 1.1104\n+IC H21A C20 *C21 H21C 1.1077 110.93 118.40 111.29 1.1085\n+IC C17 C20 C22 C23 1.5633 110.55 -174.59 115.12 1.5394\n+IC C23 C20 *C22 H22A 1.5394 115.12 120.23 109.35 1.1116\n+IC H22A C20 *C22 H22B 1.1116 109.35 117.13 108.75 1.1121\n+IC C20 C22 C23 C24 1.5476 115.12 172.50 112.25 1.5377\n+IC C24 C22 *C23 H23A 1.5377 112.25 121.13 109.69 1.1108\n+IC H23A C22 *C23 H23B 1.1108 109.69 118.14 108.99 1.1129\n+IC C22 C23 C24 C25 1.5394 112.25 -176.23 114.06 1.5418\n+IC C25 C23 *C24 H24A 1.5418 114.06 120.56 108.44 1.1132\n+IC H24A C23 *C24 H24B 1.1132 108.44 117.11 109.39 1.1121\n+IC C23 C24 C25 C26 1.5377 114.06 174.26 111.24 1.5378\n+IC C26 C24 *C25 C27 1.5378 111.24 119.63 112.86 1.5381\n+IC C26 C24 *C25 H25 1.5378 111.24 -119.50 108.47 1.1151\n+IC C24 C25 C26 H26A 1.5418 111.24 -178.53 110.52 1.1105\n+IC H26A C25 *C26 H26B 1.1105 110.52 120.00 110.36 1.1105\n+IC H26A C25 *C26 H26C 1.1105 110.52 -120.09 110.33 1.1106\n+IC C24 C25 C27 H27A 1.5418 112.86 -178.28 110.40 1.1105\n+IC H27A C25 *C27 H27B 1.1105 110.40 119.95 110.31 1.1105\n+IC H27A C25 *C27 H27C 1.1105 110.40 -119.82 110.77 1.1097\n+\n+RESI CHNS 0.00 !cholesterol with sidechain beyond c18(c20) omitted\n+! atoms names after the comments correspond to the\n+! correct cholesterol nomenclature\n+GROUP\n+ATOM C1 CTL1 0.14 !c3\n+ATOM H1 HAL1 0.09\n+ATOM O1 OHL -0.66\n+ATOM HO1 HOL 0.43\n+\n+ATOM C2 CTL2 -0.18 !c4\n+ATOM H2 HAL2 0.09\n+ATOM H2' HAL2 0.09\n+\n+ATOM C3 CEL1 0.00 !c5\n+ATOM C4 CEL1 -0.15 !c6\n+ATOM H4 HEL1 0.15\n+\n+ATOM C5 CTL2 -0.18 !c7\n+ATOM H5 HAL2 0.09\n+ATOM H5' HAL2 0.09\n+\n+ATOM C6 CTL1 -0.09 !c8\n+ATOM H6 HAL1 0.09 \n+\n+ATOM C7 CTL1 -0.09 !c14\n+ATOM H7 HAL1 0.09 \n+\n+ATOM C8 CTL2 -0.18 !c15\n+ATOM H8 HAL2 0.09\n+ATOM H8' HAL2 0.09\n+\n+ATOM C9 CTL2 -0.18 !c16\n+ATOM H9 HAL2 0.09\n+ATOM H9' HAL2 0.09\n+\n+ATOM C10 CTL1 -0.09 !c17\n+ATOM H10 HAL1 0.09\n+\n+ATOM C11 CTL1 0.00 !c13\n+\n+ATOM CC11 CTL3 -0.27 !c18, methyl at c13\n+ATOM H111 HAL3 0.09\n+ATOM H112 HAL3 0.09\n+ATOM H113 HAL3 0.09\n+\n+ATOM C12 CTL2 -0.18 !c12\n+ATOM H12 HAL2 0.09\n+ATOM H12' HAL2 0.09\n+\n+ATOM C13 CTL2 -0.18 !c11\n+ATOM H13 HAL2 0.09\n+ATOM H13' HAL2 0.09\n+\n+ATOM C14 CTL1 -0.09 !c9\n+ATOM H14 HAL1 0.09\n+\n+ATOM C15 CTL1 0.00 !c10\n+\n+ATOM CC15 CTL3 -0.27 !c19, methyl at c10\n+ATOM H151 HAL3 0.09\n+ATOM H152 HAL3 0.09\n+ATOM H153 HAL3 0.09\n+\n+ATOM C16 CTL2 -0.18 !c1\n+ATOM H16 HAL2 0.09\n+ATOM H16' HAL2 0.09\n+\n+ATOM C17 CTL2 -0.18 !c2\n+ATOM H17 HAL2 0.09\n+ATOM H17' HAL2 0.09\n+\n+ATOM C18 CTL3 -0.27 !c20\n+ATOM H181 HAL3 0.09\n+ATOM H182 HAL3 0.09\n+ATOM H183 HAL3 0.09\n+\n+BOND C1 O1 C1 H1 C1 C2\n+BOND O1 HO1\n+BOND C2 C3 C2 H2 C2 H2'\n+DOUBLE C3 C4\n+BOND C4 C5 C4 H4\n+BOND C5 C6 C5 H5 C5 H5'\n+BOND C6 C7 C6 H6\n+BOND C7 C8 C7 H7\n+BOND C8 C9 C8 H8 C8 H8'\n+BOND C9 C10 C9 H9 C9 H9'\n+BOND C10 C18 C10 C11 C10 H10\n+BOND C11 CC11 C11 C7 C11 C12\n+BOND CC11 H111 CC11 H112 CC11 H113\n+BOND C12 C13 C12 H12 C12 H12'\n+BOND C13 C14 C13 H13 C13 H13'\n+BOND C14 C15 C14 C6 C14 H14\n+BOND C15 C16 C15 C3 C15 CC15\n+BOND CC15 H151 CC15 H152 CC15 H153\n+BOND C16 C17 C16 H16 C16 H16'\n+BOND C17 C1 C17 H17 C17 H17'\n+BOND C18 H181 C18 H182 C18 H183\n+\n+!DONO HO1 O1\n+!ACCE O1\n+\n+IC O1 C1 C2 C3 1.4158 109.24 -176.17 111.80 1.5153\n+IC C1 C2 C3 C4 1.5368 111.80 -123.48 121.41 1.3430\n+IC C2 C3 C4 C5 1.5153 121.41 -178.76 123.84 1.5019\n+IC C3 C4 C5 C6 1.3430 123.84 14.64 112.44 1.5504\n+IC C4 C5 C6 C7 1.5019 112.44 -166.16 109.90 1.5192\n+IC C5 C6 C7 C8 1.5504 109.90 -54.73 118.74 1.5447\n+IC C6 C7 C8 C9 1.5192 118.74 -161.90 103.72 1.5418\n+IC C7 C8 C9 C10 1.5447 103.72 5.69 105.45 1.5530\n+IC C8 C9 C10 C11 1.5418 105.45 21.50 105.85 1.5300\n+IC C9 C10 C11 C12 1.5530 105.85 -155.90 116.00 1.5351\n+IC C7 C12 *C11 CC11 1.5194 108.58 -123.00 111.88 1.5530\n+IC C10 C11 C12 C13 1.5300 116.00 167.75 110.42 1.5414\n+IC C10 C11 C7 C8 1.5300 99.46 43.93 105.86 1.5447\n+IC C11 C12 C13 C14 1.5351 110.42 -52.28 113.50 1.5626\n+IC CC11 C11 C12 C13 1.5530 111.88 -66.16 110.42 1.5414\n+IC CC11 C11 C7 C8 1.5530 111.12 -70.96 105.86 1.5447\n+IC C12 C13 C14 C15 1.5414 113.50 179.43 114.52 1.5524\n+IC C13 C14 C15 CC15 1.5626 114.52 -50.80 109.07 1.5522\n+IC C13 C14 C15 C16 1.5626 114.52 69.29 108.64 1.5574\n+IC C13 C14 C6 C7 1.5626 113.16 -48.42 109.31 1.5192\n+IC CC15 C15 C16 C17 1.5522 110.15 -68.75 114.54 1.5383\n+IC C14 C15 C16 C17 1.5524 108.64 171.83 114.54 1.5383\n+IC C14 C15 C3 C4 1.5524 111.86 7.71 123.46 1.3430\n+IC C15 C16 C17 C1 1.5574 114.54 -54.68 110.51 1.5312\n+IC C11 C9 *C10 C18 1.5300 105.85 126.88 114.22 1.5413\n+IC O1 C2 *C1 H1 1.4158 109.24 -119.02 109.53 1.1156\n+IC C2 C1 O1 HO1 1.5368 109.24 62.69 105.39 0.9593\n+IC C3 C1 *C2 H2 1.5153 111.80 121.88 109.11 1.1100\n+IC C3 C1 *C2 H2' 1.5153 111.80 -123.05 107.36 1.1142\n+IC C5 C3 *C4 H4 1.5019 123.84 177.13 119.55 1.1001\n+IC C6 C4 *C5 H5 1.5504 112.44 122.17 110.88 1.1114\n+IC C6 C4 *C5 H5' 1.5504 112.44 -119.69 109.16 1.1124\n+IC C7 C5 *C6 H6 1.5192 109.90 -119.58 108.19 1.1122\n+IC C8 C6 *C7 H7 1.5447 118.74 117.73 105.77 1.1205\n+IC C9 C7 *C8 H8 1.5418 103.72 117.51 109.61 1.1108\n+IC C9 C7 *C8 H8' 1.5418 103.72 -121.25 111.67 1.1078\n+IC C10 C8 *C9 H9 1.5530 105.45 118.45 109.64 1.1105\n+IC C10 C8 *C9 H9' 1.5530 105.45 -120.18 112.16 1.1085\n+IC C18 C9 *C10 H10 1.5413 114.22 119.69 107.07 1.1162\n+IC C7 C11 CC11 H111 1.5194 111.12 -178.60 110.01 1.1092\n+IC H111 C11 *CC1 H112 1.1092 110.01 118.82 111.63 1.1068\n+IC H111 C11 *CC1 H113 1.1092 110.01 -120.26 111.66 1.1075\n+IC C13 C11 *C12 H12 1.5414 110.42 122.09 109.96 1.1102\n+IC C13 C11 *C12 H12' 1.5414 110.42 -119.49 108.88 1.1120\n+IC C14 C12 *C13 H13 1.5626 113.50 121.59 107.14 1.1091\n+IC C14 C12 *C13 H13' 1.5626 113.50 -122.38 108.79 1.1098\n+IC C13 C6 *C14 H14 1.5626 113.16 113.80 104.59 1.1184\n+IC C3 C15 CC15 H151 1.5435 107.81 -172.81 110.68 1.1082\n+IC H151 C15 *CC1 H152 1.1082 110.68 118.52 111.71 1.1081\n+IC H151 C15 *CC1 H153 1.1082 110.68 -120.68 110.98 1.1094\n+IC C17 C15 *C16 H16 1.5383 114.54 122.43 109.27 1.1104\n+IC C17 C15 *C16 H16' 1.5383 114.54 -120.70 108.26 1.1134\n+IC C16 C1 *C17 H17 1.5383 110.51 121.12 109.37 1.1120\n+IC C16 C1 *C17 H17' 1.5383 110.51 -120.62 109.70 1.1111\n+!use hbuild for c18 hydrogens\n+\n+RESI CHM1 0.00 !cholesterol analog with only rings 1 and 2\n+ !and the position 19 methyl\n+! atoms names after the comments correspond to the\n+! correct cholesterol nomenclature\n+!\n+!ring 1\n+!\n+GROUP\n+ATOM C1 CTL1 0.14 !c3\n+ATOM H1 HAL1 0.09\n+ATOM O1 OHL -0.66\n+ATOM HO1 HOL 0.43\n+\n+ATOM C2 CTL2 -0.18 !c4\n+ATOM H2 HAL2 0.09\n+ATOM H2' HAL2 0.09\n+\n+ATOM C3 CEL1 0.00 !c5\n+\n+ATOM C15 CTL1 0.00 !c10\n+\n+ATOM C16 CTL2 -0.18 !c1\n+ATOM H16 HAL2 0.09\n+ATOM H16' HAL2 0.09\n+\n+ATOM C17 CTL2 -0.18 !c2\n+ATOM H17 HAL2 0.09\n+ATOM H17' HAL2 0.09\n+\n+ATOM CC15 CTL3 -0.27 !c19, methyl at c10\n+ATOM H151 HAL3 0.09\n+ATOM H152 HAL3 0.09\n+ATOM H153 HAL3 0.09\n+\n+!ring 2\n+ATOM C4 CEL1 -0.15 !c6\n+ATOM H4 HEL1 0.15\n+\n+ATOM C5 CTL2 -0.18 !c7\n+ATOM H5 HAL2 0.09\n+ATOM H5' HAL2 0.09\n+\n+ATOM C6 CTL2 -0.18 !c8\n+ATOM H6 HAL2 0.09 \n+ATOM H6' HAL2 0.09\n+\n+ATOM C14 CTL2 -0.18 !c9\n+ATOM H14 HAL2 0.09\n+ATOM H14' HAL2 0.09\n+\n+BOND C1 C2 C2 C3 C3 C15 C15 C16 C16 C17 C17 C1\n+BOND C1 O1 O1 HO1 C1 H1\n+BOND C2 H2 C2 H2'\n+BOND C15 CC15 CC15 H151 CC15 H152 CC15 H153\n+BOND C16 H16 C16 H16'\n+BOND C17 H17 C17 H17'\n+DOUB C3 C4\n+BOND C4 C5 C5 C6 C6 C14 C14 C15\n+BOND C4 H4\n+BOND C5 H5 C5 H5'\n+BOND C6 H6 C6 H6'\n+BOND C14 H14 C14 H14'\n+\n+IC C1 C2 C3 C15 0.0000 0.00 0.00 0.00 0.0000\n+IC C2 C3 C15 C16 0.0000 0.00 0.00 0.00 0.0000\n+IC C17 C1 C2 C3 0.0000 0.00 0.00 0.00 0.0000\n+IC C2 C17 *C1 O1 0.0000 0.00 120.00 0.00 0.0000\n+IC C2 C17 *C1 H1 0.0000 0.00 -120.00 0.00 0.0000\n+IC C17 C1 O1 HO1 0.0000 0.00 180.00 0.00 0.0000\n+IC C3 C1 *C2 H2 0.0000 0.00 120.00 0.00 0.0000\n+IC C3 C1 *C2 H2' 0.0000 0.00 -120.00 0.00 0.0000\n+IC C1 C2 C3 C4 0.0000 0.00 180.00 0.00 0.0000\n+IC C2 C3 C4 C5 0.0000 0.00 180.00 0.00 0.0000\n+IC C3 C4 C5 C6 0.0000 0.00 15.00 0.00 0.0000\n+IC C4 C5 C6 C14 0.0000 0.00 -45.00 0.00 0.0000\n+IC C14 C3 *C15 CC15 0.0000 0.00 -120.00 0.00 0.0000\n+IC C17 C15 *C16 H16 0.0000 0.00 120.00 0.00 0.0000\n+IC C17 C15 *C16 H16' 0.0000 0.00 -120.00 0.00 0.0000\n+IC C16 C1 *C17 H17 0.0000 0.00 120.00 0.00 0.0000\n+IC C16 C1 *C17 H17' 0.0000 0.00 -120.00 0.00 0.0000\n+IC C3 C15 CC15 H151 0.0000 0.00 180.00 0.00 0.0000\n+IC H151 C15 *CC15 H152 0.0000 0.00 120.00 0.00 0.0000\n+IC H151 C15 *CC15 H153 0.0000 0.00 -120.00 0.00 0.0000\n+IC C5 C3 *C4 H4 0.0000 0.00 180.00 0.00 0.0000\n+IC C6 C4 *C5 H5 0.0000 0.00 120.00 0.00 0.0000\n+IC C6 C4 *C5 H5' 0.0000 0.00 -120.00 0.00 0.0000\n+IC C14 C5 *C6 H6 0.0000 0.00 120.00 0.00 0.0000\n+IC C14 C5 *C6 H6' 0.0000 0.00 -120.00 0.00 0.0000\n+IC C6 C15 *C14 H14 0.0000 0.00 120.00 0.00 0.0000\n+IC C6 C15 *C14 H14' 0.0000 0.00 -120.00 0.00 0.0000\n+\n+end\n+\n+read para card flex @app\n+* cholesterol parameters\n+*\n+\n+BONDS\n+!\n+!V(bond) = Kb(b - b0)**2\n+!\n+!Kb: kcal/mole/A**2\n+!b0: A\n+!\n+!atom type Kb b0\n+CEL1 CTL1 240.000 1.502 ! from CEL1 CTL2: sR12cc (c8-c39)\n+!\n+\n+ANGLES\n+!\n+!V(angle) = Ktheta(Theta - Theta0)**2\n+!\n+!V(Urey-Bradley) = Kub(S - S0)**2\n+!\n+!Ktheta: kcal/mole/rad**2\n+!Theta0: degrees\n+!Kub: kcal/mole/A**2 (Urey-Bradley)\n+!S0: A\n+!\n+!atom types Ktheta Theta0 Kub S0\n+CTL1 CTL2 CEL1 32.00 112.20 !from CEL1 CTL2 CTL2 !all CEL1 containing terms will\n+CTL2 CTL1 CEL1 32.00 112.20 !from CEL1 CTL2 CTL2 !involve the dR1 and dR2 terms\n+CTL1 CTL1 CEL1 32.00 112.20 !from CEL1 CTL2 CTL2\n+CTL3 CTL1 CEL1 32.00 112.20 !from CEL1 CTL2 CTL2\n+CTL1 CEL1 CTL2 50.00 113.00 !guess FC, eq. angle to yield 360 deg sum \n+CEL1 CEL1 CTL1 48.00 123.50 ! from CEL1 CEL1 CTL1 \n+!\n+DIHEDRALS\n+!\n+!V(dihedral) = Kchi(1 + cos(n(chi) - delta))\n+!\n+!Kchi: kcal/mole\n+!n: multiplicity\n+!delta: degrees\n+!\n+!atom types Kchi n delta\n+CTL1 CTL2 CEL1 CTL1 0.30 3 180.0 ! torR1\n+CTL2 CEL1 CTL1 CTL1 0.00 3 180.0 ! bR12\n+CTL2 CEL1 CTL1 CTL3 0.00 3 180.0 ! bR12\n+CTL2 CEL1 CTL1 CTL2 0.30 3 180.0 ! torR1\n+HAL2 CTL2 CEL1 CTL1 0.0300 3 0.0 ! CH2 wag and twist, from CEL1 CEL1 CTL2 HAL2\n+CEL1 CEL1 CTL2 CTL1 0.5000 1 180.0 ! torR2, CEL1 CEL1 CTL2 CTL2\n+CEL1 CEL1 CTL2 CTL1 1.3000 3 180.0 ! \n+CEL1 CEL1 CTL1 CTL1 0.5000 1 180.0 ! torR2, CEL1 CEL1 CTL2 CTL2\n+CEL1 CEL1 CTL1 CTL1 1.3000 3 180.0 ! \n+CEL1 CEL1 CTL1 CTL2 0.5000 1 180.0 ! bR12, CEL1 CEL1 CTL2 CTL2\n+CEL1 CEL1 CTL1 CTL2 1.3000 3 180.0 ! \n+CEL1 CEL1 CTL1 CTL3 0.5000 1 180.0 ! bR13, rCH3, CEL1 CEL1 CTL2 CTL2\n+CEL1 CEL1 CTL1 CTL3 1.3000 3 180.0 !\n+HEL1 CEL1 CTL2 CTL1 0.00 3 0.0 ! wC9H, HEL1 CEL1 CTL2 CTL2\n+CTL2 CTL1 OHL HOL 0.9 1 0.00 ! hydroxyl mp2/6-31g* surface\n+CTL2 CTL1 OHL HOL 0.3 3 0.00 ! possible conflict with protein\n+\n+end\n+\n+return\n", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}43{"question_id": "MSB_AMReX-Codes_amrex_pr1468", "question_type": "multi_swe_bench", "description": "CMake: improve HDF5 support (AMReX-Codes/amrex#1468)", "content": {"org": "AMReX-Codes", "repo": "amrex", "pr_number": 1468, "issue_title": "CMake: improve HDF5 support", "issue_body": "## Summary\r\n\r\nFix #1463\r\n\r\n## Additional background\r\n\r\n## Checklist\r\n\r\nThe proposed changes:\r\n- [ ] fix a bug or incorrect behavior in AMReX\r\n- [ ] add new capabilities to AMReX\r\n- [ ] changes answers in the test suite to more than roundoff level\r\n- [ ] are likely to significantly affect the results of downstream AMReX users\r\n- [ ] are described in the proposed changes to the AMReX documentation, if appropriate\r\n", "base_commit": "c0710a2bc4725aa8e7cab57690b27c73285436ae", "resolved_issues": [{"number": 1463, "title": "Build Question - Lib folders", "body": "Hello there, I'm trying to build AMReX with the following libraries and versions:\r\n```\r\n1) gcc/9.1.1\r\n4) cmake/3.16.7\r\n2) mpich/3.3.1\r\n3) petsc/3.11.3\r\n5) hdf5/1.10.5\r\n```\r\nI'm on tag `20.10`, created a `build` folder and using the following options with cmake:\r\n```\r\n-DCMAKE_INSTALL_PREFIX=/opt/apps/amrex/20.10-mpich-3.3.1-petsc-3.11.3-hdf5-1.10.5\r\n-DDIM=3 \r\n-DENABLE_FORTRAN=yes \r\n-DENABLE_FORTRAN_INTERFACES=yes \r\n-DENABLE_MPI=yes \r\n-DENABLE_HYPRE=yes \r\n-DENABLE_HDF5=yes \r\n-DENABLE_PETSC=yes\r\n```\r\n\r\nHow can I set the paths for those libraries I want to use? I coudn't find in the docs flags to set the path of the libraries ...\r\nNone of my libs are instaled in the system path, allways in `/opt/apps`.\r\n"}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/amrex-codes_m_amrex:pr-1468", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/Tools/CMake/AMReXThirdPartyLibraries.cmake b/Tools/CMake/AMReXThirdPartyLibraries.cmake\nindex 52ad1ff27ce..82193da3c2f 100644\n--- a/Tools/CMake/AMReXThirdPartyLibraries.cmake\n+++ b/Tools/CMake/AMReXThirdPartyLibraries.cmake\n@@ -3,13 +3,19 @@\n #\n if (ENABLE_HDF5)\n set(HDF5_PREFER_PARALLEL TRUE)\n- find_package(HDF5 1.10.4 REQUIRED COMPONENTS CXX)\n+ find_package(HDF5 1.10.4 REQUIRED)\n if (NOT HDF5_IS_PARALLEL)\n message(FATAL_ERROR \"\\nHDF5 library does not support parallel I/O\")\n+ endif ()\n+\n+ if (TARGET hdf5::hdf5) # CMake >= 3.19\n+ target_link_libraries(amrex PUBLIC hdf5::hdf5)\n+ else () # CMake < 3.19 -- Remove when minimum cmake version is bumped up\n+ target_include_directories(amrex PUBLIC ${HDF5_INCLUDE_DIRS})\n+ target_compile_definitions(amrex PUBLIC ${HDF5_DEFINITIONS})\n+ target_link_libraries(amrex PUBLIC ${HDF5_LIBRARIES})\n endif ()\n- target_include_directories(amrex PUBLIC ${HDF5_CXX_INCLUDE_DIRS})\n- target_compile_definitions(amrex PUBLIC ${HDF5_CXX_DEFINES})\n- target_link_libraries(amrex PUBLIC ${HDF5_CXX_LIBRARIES})\n+\n endif ()\n \n \n"}, "test": {"test_patch": "diff --git a/Tests/CMakeLists.txt b/Tests/CMakeLists.txt\nindex 29cd7d32e83..f97a625c78c 100644\n--- a/Tests/CMakeLists.txt\n+++ b/Tests/CMakeLists.txt\n@@ -7,6 +7,10 @@ if (ENABLE_PARTICLES)\n list(APPEND AMREX_TESTS_SUBDIRS Particles)\n endif ()\n \n+if (ENABLE_HDF5)\n+ list(APPEND AMREX_TESTS_SUBDIRS HDF5Benchmark)\n+endif ()\n+\n list(TRANSFORM AMREX_TESTS_SUBDIRS PREPEND \"${CMAKE_CURRENT_LIST_DIR}/\")\n \n #\ndiff --git a/Tests/HDF5Benchmark/CMakeLists.txt b/Tests/HDF5Benchmark/CMakeLists.txt\nnew file mode 100644\nindex 00000000000..718a622058a\n--- /dev/null\n+++ b/Tests/HDF5Benchmark/CMakeLists.txt\n@@ -0,0 +1,12 @@\n+# This tests requires particle support\n+if (NOT ENABLE_PARTICLES)\n+ return()\n+endif ()\n+\n+set(_sources main.cpp)\n+set(_input_files inputs )\n+\n+setup_test(_sources _input_files)\n+\n+unset(_sources)\n+unset(_input_files)\n", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}44{"question_id": "MSB_AMReX-Codes_amrex_pr1842", "question_type": "multi_swe_bench", "description": "Feature/non local parallel copy (AMReX-Codes/amrex#1842)", "content": {"org": "AMReX-Codes", "repo": "amrex", "pr_number": 1842, "issue_title": "Feature/non local parallel copy", "issue_body": "## Summary\r\n\r\nThis PR introduces \"Multiblock\" capabilities to AMReX.\r\n\r\n## Additional background\r\n\r\nMultiblock refers to having multiple distinct computational domains, known as blocks, that have some relation to each other.\r\nThis PR proposes a generic NonLocalBC::ParallelCopy that performs copies between two FabArrays that might live on different blocks. The ParallelCopy respects\r\n\r\n - An index mapping such as already present in NonLocalBC (DTOS)\r\n - A projection function that will be called on either sender or receiver side to perform actions like e.g. swapping two components or changing the sign of velocity components\r\n \r\nThe proposed usage is\r\n\r\n```cpp\r\nNonLocalBC::ParallelCopy(dest, destbox, src, scomp, dcomp, ncomp, ngrow, index_mapping, fab_projection);\r\n```\r\n\r\n## Notes\r\n\r\n- In the current implementation, `DTOS` needs to be a map between index spaces where inverse images of boxes are boxes again.\r\n- The name `NonLocalBC::ParallelCopy` is confusing if it does something else than `amrex::ParallelCopy`. Alternatives?\r\n- Parts of the implementation might be shared with other places in AMReX, such as in communication procedures of FabArray. But this is out of scope.\r\n- In addition to `SwapComponents`, a more generic `PermuteComponents` is useful.\r\n- The test is not commented yet.\r\n\r\n## Checklist\r\n\r\nThe proposed changes:\r\n- [x] add new capabilities to AMReX\r\n\r\nThe following tasks need to be done:\r\n- [x] Define CPOs for dispatching packing and unpacking of communication buffers\r\n- [x] Implement the first version without interpolation\r\n- [x] Provide a test case to prove correct index mapping, projection and communication behaviour \r\n- [ ] Write a tutorial with an example of using at least two blocks in a simple simulation\r\n- [x] Improve type documentation and requirements\r\n\r\n**The advection example produces the following result**\r\n\r\n<p align=\"center\">\r\n<img src=\"https://media.giphy.com/media/W5AKaJHUQqLbdyHO6O/giphy.gif\"/>\r\n</p>\r\n<p align=\"center\">Figure 1. A test run of the multi block advection test case. It was initiated with 4 MPI Ranks. It shows a surface plot of a scalar component and arrow glyphs of an advected vector.</p>", "base_commit": "6ec00666843dcc0ae794358c872dd92e30a3cd34", "resolved_issues": [{"number": 1, "title": "Add a hook so that an AmrLevel can force a post-timestep regrid", "body": "The motivation for this change is that sometimes, during the course of a coarse\r\ntimestep, the timestep will found to be unstable due to a lack of resolution. In\r\nthis case the coarse level may want to signal that more resolution is required\r\nimmediately (as opposed to waiting for a future regrid), because even a single\r\nunstable step may cause significant harm to the integrity of the simulation. An\r\nexample is a spurious numerical detonation caused by insufficient resolution in\r\na thermonuclear burning region. If this numerically-seeded detonation is detected\r\nat the end of a timestep, more levels can be added immediately so that the fine\r\nlevels can improve the situation and quench the detonation (since they will\r\noverwrite the coarse data at the end of the timestep).\r\n\r\nEach AmrLevel now has a member variable post_step_regrid. To trigger a regrid\r\nat the end of a step, but before any fine timesteps would be taken, they only need\r\nto set this variable to one. At the beginning of every timestep, it will be reset to 0."}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/amrex-codes_m_amrex:pr-1842", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/Src/Base/AMReX_Extension.H b/Src/Base/AMReX_Extension.H\nindex 40e2da188bc..96253c1437b 100644\n--- a/Src/Base/AMReX_Extension.H\n+++ b/Src/Base/AMReX_Extension.H\n@@ -151,7 +151,8 @@\n #define AMREX_FALLTHROUGH ((void)0)\n #endif\n \n-#if !defined(AMREX_NO_NODISCARD) && defined(__has_cpp_attribute) && __has_cpp_attribute(nodiscard)\n+// CI uses -Werror -Wc++17-extentsion, thus we need to add the __cplusplus clause\n+#if !defined(AMREX_NO_NODISCARD) && defined(__has_cpp_attribute) && __has_cpp_attribute(nodiscard) && __cplusplus >= 201603L\n # define AMREX_NODISCARD [[nodiscard]]\n #elif !defined(AMREX_NO_NODISCARD) && (defined(__GNUC__) || defined(__clang__))\n # define AMREX_NODISCARD __attribute__ ((warn_unused_result))\n@@ -159,6 +160,18 @@\n # define AMREX_NODISCARD\n #endif\n \n+// Note: following compilers support [[no_unique_address]]\n+// - Clang >= 9.0\n+// - GCC >= 9.0\n+// - MSVC >= 19.26\n+// Using no unique address makes empty base class optimization for multiple policies much easier\n+#if !defined(AMREX_NO_NO_UNIQUE_ADDRESS) && defined(__has_cpp_attribute) && __has_cpp_attribute(no_unique_address) && __cpluspus >= 201803L\n+# define AMREX_NO_UNIQUE_ADDRESS [[no_unique_address]]\n+# define AMREX_HAS_NO_UNIQUE_ADDRESS 1\n+#else\n+# define AMREX_NO_UNIQUE_ADDRESS\n+#endif\n+\n #endif /* !BL_LANG_FORT */\n \n #endif\ndiff --git a/Src/Base/AMReX_NonLocalBC.H b/Src/Base/AMReX_NonLocalBC.H\nindex e1c24bb7a72..b58dcb351ed 100644\n--- a/Src/Base/AMReX_NonLocalBC.H\n+++ b/Src/Base/AMReX_NonLocalBC.H\n@@ -1,11 +1,979 @@\n #ifndef AMREX_NONLOCAL_BC_H_\n #define AMREX_NONLOCAL_BC_H_\n #include <AMReX_Config.H>\n-\n+#include <AMReX_TypeTraits.H>\n #include <AMReX_FabArray.H>\n \n namespace amrex { namespace NonLocalBC {\n \n+////////////////////////////////////////////////////////////////////////////////////\n+// [concept.IndexMapping]\n+//\n+\n+//! \\brief Return type of an InverseImage class member function.\n+template <typename T, typename... Args>\n+using Inverse_t = decltype(std::declval<T>().Inverse(std::declval<Args>()...));\n+\n+//! \\brief Type trait that tests if T has an InverseImage class member function.\n+template <typename T>\n+struct HasInverseMemFn : IsDetectedExact<Dim3, Inverse_t, T, Dim3> {};\n+\n+//! \\brief Tests if a given type IndexMap is usable as an index mapping between two index based\n+//! coordinate systems.\n+template <class IndexMap>\n+struct IsIndexMapping\n+ : Conjunction<IsCallableR<Dim3, IndexMap&, const Dim3&>, \n+ HasInverseMemFn<const IndexMap&>> {};\n+\n+////////////////////////////////////////////////////////////////////////////////////\n+// [IndexMapping.MultiBlockIndexMapping]\n+//\n+\n+//! \\brief This struct describes an affine index transformation for two coordinate systems.\n+//!\n+//! This DTOS is used to map indices from one block to another. It respects a permutation of\n+//! (x,y,z) coordinates, an offset and a change in orientation.\n+struct MultiBlockIndexMapping {\n+ //! \\brief This vector needs to be a valid permutation\n+ IntVect permutation{AMREX_D_DECL(0, 1, 2)};\n+ //! \\brief The offset in the source index space.\n+ IntVect offset{AMREX_D_DECL(0, 0, 0)};\n+ //! \\brief A vector of 1 and -1 describing the orientation in each component.\n+ IntVect sign{AMREX_D_DECL(1, 1, 1)};\n+\n+ //! \\brief Applies this mapping on the index from destination space and returns an index in the\n+ //! source space.\n+ //!\n+ //! \\param[in] i The index that lives in the destination space.\n+ //!\n+ //! \\return Returns an index in the source space that is given by this affine transformation.\n+ AMREX_GPU_HOST_DEVICE Dim3 operator()(Dim3 i) const noexcept {\n+ int iv[3]{i.x, i.y, i.z};\n+ int iv_new[3]{};\n+ for (int d = 0; d < AMREX_SPACEDIM; ++d) {\n+ iv_new[d] = sign[d] * (iv[permutation[d]] - offset[d]);\n+ }\n+ return {iv_new[0], iv_new[1], iv_new[2]};\n+ }\n+\n+ //! \\brief The inverse function is given by rearringing all above terms.\n+ //!\n+ //! \\param[in] i The index that lives in the source space.\n+ //!\n+ //! \\return Returns an index in the destination space that is given by this affine\n+ //! transformation.\n+ AMREX_GPU_HOST_DEVICE Dim3 Inverse(Dim3 i) const noexcept {\n+ int iv_new[3]{i.x, i.y, i.z};\n+ int iv[3]{};\n+ for (int d = 0; d < AMREX_SPACEDIM; ++d) {\n+ AMREX_ASSERT(sign[d] == 1 || sign[d] == -1);\n+ iv[permutation[d]] = iv_new[d] * sign[d] + offset[d];\n+ }\n+ return {iv[0], iv[1], iv[2]};\n+ }\n+\n+ IndexType operator()(IndexType it) const noexcept {\n+ return IndexType{IntVect{AMREX_D_DECL(it[permutation[0]], it[permutation[1]], it[permutation[2]])}};\n+ }\n+\n+ IndexType Inverse(IndexType it) const noexcept {\n+ IntVect inverse_permutation;\n+ for (int i = 0; i < AMREX_SPACEDIM; ++i) {\n+ inverse_permutation[permutation[i]] = i;\n+ }\n+ return IndexType{IntVect{AMREX_D_DECL(it[inverse_permutation[0]], it[inverse_permutation[1]], it[inverse_permutation[2]])}};\n+ }\n+};\n+\n+//! \\brief Applies the Dim3 to Dim3 mapping onto IntVects.\n+//!\n+//! This is used to map indices from the dest index space into the source index space.\n+//!\n+//! IntVect is being embedded in Dim3 by trailing zeros.\n+//! Dim3 is being projected to IntVect by dopping z for AMREX_SPACEDIM = 2 or z and y components\n+//! for AMREX_SPACEDIM = 1.\n+//!\n+//! \\param[in] iv The IntVect that lives in the destination index space.\n+//!\n+//! \\return Returns IntVect{dtos(Dim3{iv})}\n+template <typename DTOS>\n+EnableIf_t<IsCallableR<Dim3, DTOS, Dim3>::value, IntVect> \n+Apply(DTOS dtos, const IntVect& iv) \n+{\n+ Dim3 i = dtos(iv.dim3());\n+ return IntVect{AMREX_D_DECL(i.x, i.y, i.z)};\n+}\n+\n+//! \\brief Applies the Dim3 to Dim3 mapping onto Boxes but does not change the index type.\n+//!\n+//! This function assumes monotonicity of dtos in each component.\n+//!\n+//! \\param[in] box The box that lives the destination index space\n+//!\n+//! \\return Returns the smallest Box in the source index space that contains images of\n+//! Apply(dtos, box.smallEnd()) and Apply(dtos, box.bigEnd()).\n+template <typename DTOS>\n+EnableIf_t<IsCallableR<Dim3, DTOS, Dim3>::value && !IsCallableR<IndexType, DTOS, IndexType>::value, Box> \n+Image(DTOS dtos, const Box& box) \n+{\n+ IntVect mapped_smallEnd = Apply(dtos, box.smallEnd());\n+ IntVect mapped_bigEnd = Apply(dtos, box.bigEnd());\n+ IntVect smallEnd;\n+ IntVect bigEnd;\n+ for (int d = 0; d < AMREX_SPACEDIM; ++d) {\n+ smallEnd[d] = std::min(mapped_smallEnd[d], mapped_bigEnd[d]);\n+ bigEnd[d] = std::max(mapped_smallEnd[d], mapped_bigEnd[d]);\n+ }\n+ return Box{smallEnd, bigEnd, box.ixType()};\n+}\n+\n+//! \\brief Applies the Dim3 to Dim3 mapping onto Boxes and maps the index type.\n+//!\n+//! This function assumes monotonicity of dtos in each component.\n+//!\n+//! \\param[in] box The box that lives the destination index space\n+//!\n+//! \\return Returns the smallest Box in the source index space that contains images of\n+//! Apply(dtos, box.smallEnd()) and Apply(dtos, box.bigEnd()).\n+template <typename DTOS>\n+EnableIf_t<IsCallableR<Dim3, DTOS, Dim3>::value && IsCallableR<IndexType, DTOS, IndexType>::value, Box> \n+Image(DTOS dtos, const Box& box) \n+{\n+ // \"Forget\" the index type mapping and invoke Image without changing the index type.\n+ Box srcbox = Image([&dtos](Dim3 i) { return dtos(i); }, box);\n+ // Fix the index type of the resulting box\n+ srcbox.setType(dtos(box.ixType()));\n+ return srcbox;\n+}\n+\n+//! \\brief Applies the Dim3 to Dim3 invserse mapping onto IntVects.\n+//!\n+//! This is used to map indices from the src index space into the dest index space.\n+//!\n+//! IntVect is being embedded in Dim3 by trailing zeros.\n+//! Dim3 is being projected to IntVect by dopping z for AMREX_SPACEDIM = 2 or z and y components\n+//! for AMREX_SPACEDIM = 1.\n+//!\n+//! \\param[in] iv The IntVect that lives in the src index space.\n+//!\n+//! \\return Returns IntVect{dtos.Inverse(Dim3{iv})}\n+template <typename DTOS>\n+EnableIf_t<HasInverseMemFn<DTOS>::value, IntVect> \n+ApplyInverse(DTOS dtos, const IntVect& iv) \n+{\n+ return Apply([&dtos](Dim3 i) { return dtos.Inverse(i); }, iv);\n+}\n+\n+//! \\brief Applies the inverse Dim3 to Dim3 mapping onto Boxes without changing the index type.\n+//!\n+//! This function assumes monotonicity in each component.\n+//!\n+//! \\param[in] box The box that lives the source index space\n+//!\n+//! \\return Returns the smallest Box in the destination index space that contains images of\n+//! ApplyInverse(box.smallEnd()) and ApplyInverse(box.bigEnd()).\n+template <typename DTOS>\n+EnableIf_t<HasInverseMemFn<DTOS>::value && !IsCallableR<IndexType, DTOS, IndexType>::value, Box> \n+InverseImage(DTOS dtos, const Box& box) \n+{\n+ return Image([&dtos](Dim3 i) { return dtos.Inverse(i); }, box);\n+}\n+\n+//! \\brief Applies the inverse Dim3 to Dim3 mapping onto Boxes\n+//!\n+//! This function assumes monotonicity in each component.\n+//!\n+//! \\param[in] box The box that lives the source index space\n+//!\n+//! \\return Returns the smallest Box in the destination index space that contains images of\n+//! ApplyInverse(box.smallEnd()) and ApplyInverse(box.bigEnd()).\n+template <typename DTOS>\n+EnableIf_t<HasInverseMemFn<DTOS>::value && IsCallableR<IndexType, DTOS, IndexType>::value, Box> \n+InverseImage(DTOS dtos, const Box& box) \n+{\n+ return Image([&dtos](auto&& i) { return dtos.Inverse(i); }, box);\n+}\n+\n+//! \\brief This is the index mapping based on the DTOS MultiBlockDestToSrc.\n+static_assert(IsIndexMapping<MultiBlockIndexMapping>(),\n+ \"MultiBlockIndexMapping is expected to satisfy IndexMapping\");\n+\n+////////////////////////////////////////////////////////////////////////////////////\n+// [class.MultiBlockCommMetaData]\n+//\n+\n+//! \\brief This class stores data dependencies for an inter-block communication.\n+//!\n+//! In communication between two blocks one might need to do an index\n+//! transformation from one block to antoher.\n+struct MultiBlockCommMetaData : FabArrayBase::CommMetaData {\n+ //! \\name Constructors\n+\n+ //! \\brief Build global meta data by calling the define() member function.\n+ //!\n+ //! \\see MultiBlockCommMetaData::define\n+ template <typename DTOS, \n+ typename = EnableIf_t<IsIndexMapping<DTOS>::value>>\n+ MultiBlockCommMetaData(const FabArrayBase& dst, const Box& dstbox, const FabArrayBase& src,\n+ const IntVect& ngrow, DTOS dtos);\n+\n+ //! \\brief Build global meta data by calling the define() member function.\n+ //!\n+ //! \\see MultiBlockCommMetaData::define\n+ template <typename DTOS, \n+ typename = EnableIf_t<IsIndexMapping<DTOS>::value>>\n+ MultiBlockCommMetaData(const BoxArray& dstba, const DistributionMapping& dstdm,\n+ const Box& dstbox, const BoxArray& srcba,\n+ const DistributionMapping& srcdm, const IntVect& ngrow, DTOS dtos);\n+\n+ //! \\name Manipulators\n+\n+ //! \\brief Build global meta data that is being used to identify send and recv\n+ //! dependencies in communication routines.\n+ //!\n+ //! This call is quadratic in the number of boxes, i.e. it is in\n+ //! O(dstba.size() * srcba.size()). Therefore, it might be wise to cache the\n+ //! construction of this object to minimize its computation.\n+ //!\n+ //! \\tparam DTOS This parameter needs to satisfy IsIndexMapping and HasInverseImage.\n+ //!\n+ //! \\param[in] dstba The destination box array.\n+ //! \n+ //! \\param[in] dstdm The destination distribution mapping.\n+ //!\n+ //! \\param[in] dstbox The box that will be filled and that lives in the destination space.\n+ //!\n+ //! \\param[in] srcba The source box array.\n+ //!\n+ //! \\param[in] srcdm The source distribution mapping.\n+ //!\n+ //! \\param[in] ngrow The number of ghost cells that shall be considered when filling data.\n+ //!\n+ //! \\param[in] dtos The dest to source index mapping that has an inverse image.\n+ //!\n+ //! \\return Nothing.\n+ template <typename DTOS>\n+ EnableIf_t<IsIndexMapping<DTOS>::value>\n+ define(const BoxArray& dstba, const DistributionMapping& dstdm, const Box& dstbox,\n+ const BoxArray& srcba, const DistributionMapping& srcdm, const IntVect& ngrow,\n+ DTOS dtos);\n+};\n+\n+////////////////////////////////////////////////////////////////////////////////////\n+// [concept.FabProjection]\n+//\n+\n+//! \\brief This type trait tests if a type P is a projetion for FAB.\n+template <typename P, typename FAB>\n+struct IsFabProjection\n+ : IsCallableR<typename FAB::value_type, P, Array4<const typename FAB::value_type>, Dim3, int> \n+{};\n+\n+////////////////////////////////////////////////////////////////////////////////////\n+// [FabProjection.Identity]\n+// [IndexMapping.Identity]\n+\n+//! \\brief This class acts as a default no-op operator.\n+//!\n+//! This class satisfies IndexMapping and FabProjection.\n+struct Identity {\n+ //! The identity function for Dim3\n+ constexpr Dim3 operator()(Dim3 i) const noexcept { return i; }\n+ //! The identity function for Dim3\n+ constexpr Dim3 Inverse(Dim3 i) const noexcept { return i; }\n+\n+ //! \\return Returns array(i.x,i.y,i.z,comp)\n+ template <typename T>\n+ constexpr T operator()(Array4<const T> array, Dim3 i, int comp = 0) const\n+ noexcept(noexcept(array(i.x, i.y, i.z, comp))) {\n+ return array(i.x, i.y, i.z, comp);\n+ }\n+\n+ //! The identity for int\n+ constexpr int operator()(int i) const noexcept { return i; }\n+};\n+static constexpr Identity identity{};\n+\n+static_assert(sizeof(Identity) == 1, \"\");\n+static_assert(std::is_trivially_default_constructible<Identity>::value, \"\");\n+static_assert(std::is_trivially_copy_assignable<Identity>::value, \"\");\n+static_assert(std::is_trivially_copy_constructible<Identity>::value, \"\");\n+static_assert(IsIndexMapping<Identity>(), \"\");\n+static_assert(IsFabProjection<Identity, FArrayBox>(), \"\");\n+\n+////////////////////////////////////////////////////////////////////////////////////\n+// [FabProjection.MapComponents]\n+\n+//! \\brief This class takes a projection and a component map and combines them to form a new\n+//! projection.\n+//!\n+//! We use this to apply a permutations on components FABs.\n+//!\n+//! \\see SwapComponents\n+template <typename Base, typename Map = Identity> struct MapComponents {\n+ static_assert(IsCallable<Base, Array4<const Real>, Dim3, int>::value,\n+ \"Base needs to be a callable function: (Array4<const T>, Dim3, i) -> auto.\");\n+\n+ static_assert(IsCallableR<int, Map, int>::value,\n+ \"Map needs to be a callable function: int -> int.\");\n+\n+ AMREX_NO_UNIQUE_ADDRESS Base base;\n+ AMREX_NO_UNIQUE_ADDRESS Map map;\n+\n+ template <typename T,\n+ typename = EnableIf_t<IsCallable<Base, Array4<const T>, Dim3, int>::value>,\n+ typename = EnableIf_t<IsCallableR<int, Map, int>::value>>\n+ constexpr decltype(auto) operator()(Array4<const T> array, Dim3 i, int comp) const\n+ noexcept(noexcept(base(array, i, map(comp)))) {\n+ return base(array, i, map(comp));\n+ }\n+};\n+\n+#ifdef AMREX_HAS_NO_UNIQUE_ADDRESS\n+static_assert(sizeof(MapComponents<Identity, Identity>) == 1, \"\");\n+#endif\n+static_assert(std::is_trivially_copy_assignable<MapComponents<Identity>>(), \"\");\n+static_assert(std::is_trivially_copy_constructible<MapComponents<Identity>>(), \"\");\n+static_assert(IsFabProjection<MapComponents<Identity>, FArrayBox>(), \"\");\n+\n+////////////////////////////////////////////////////////////////////////////////////\n+// [FabProjection.MapComponents.SwapComponents]\n+\n+//! \\brief This is a permutation where only two components are swapped.\n+//!\n+//! This class is used with MapComponents to define fab projections that swap components on FABs,\n+//! e.g. for velocity components. The template arguments I, J should be greater or equal to -1. The\n+//! value -1 indicates run-time values and increase the object size of this function object.\n+template <int I, int J> struct SwapComponents { \n+ static_assert(I >= 0 && J >= 0, \"I >= 0 && J >= 0\");\n+\n+ //! \\brief Swaps indices I and J.\n+ //!\n+ //! \\return If i == I then return J. If i == J then return I. Otherwise returns i.\n+ constexpr int operator()(int i) const noexcept {\n+ const int map[2] = {I, J};\n+ return i == I || i == J ? map[std::size_t(i == I)] : i;\n+ }\n+};\n+\n+template <int I> struct SwapComponents<I, -1> {\n+ static_assert(I >= 0, \"I >= 0\");\n+\n+ int J;\n+ constexpr int operator()(int i) const noexcept {\n+ const int map[2] = {I, J};\n+ return i == I || i == J ? map[std::size_t(i == I)] : i;\n+ }\n+};\n+\n+template <int J> struct SwapComponents<-1, J> {\n+ static_assert(J >= 0, \"J >= 0\");\n+ \n+ int I;\n+ constexpr int operator()(int i) const noexcept {\n+ const int map[2] = {I, J};\n+ return i == I || i == J ? map[std::size_t(i == I)] : i;\n+ }\n+};\n+\n+template <> struct SwapComponents<-1, -1> {\n+ int I;\n+ int J;\n+ constexpr int operator()(int i) const noexcept {\n+ const int map[2] = {I, J};\n+ return i == I || i == J ? map[std::size_t(i == I)] : i;\n+ }\n+};\n+\n+using DynamicSwapComponents = SwapComponents<-1, -1>;\n+\n+template <int I, int J> static constexpr SwapComponents<I, J> swap_indices{};\n+\n+static_assert(sizeof(SwapComponents<0, 1>) == 1, \"\");\n+static_assert(sizeof(DynamicSwapComponents) == 2 * sizeof(int), \"\");\n+static_assert(sizeof(SwapComponents<0, -1>) == sizeof(int), \"\");\n+static_assert(sizeof(SwapComponents<-1, 1>) == sizeof(int), \"\");\n+#ifdef AMREX_HAS_NO_UNIQUE_ADDRESS\n+static_assert(sizeof(MapComponents<Identity, SwapComponents<0, 1>>) == sizeof(SwapComponents<0, 1>), \"\");\n+#endif\n+static_assert(std::is_trivially_default_constructible<MapComponents<Identity, SwapComponents<0, 1>>>(), \"\");\n+static_assert(std::is_trivially_copy_assignable<MapComponents<Identity, SwapComponents<0, 1>>>(), \"\");\n+static_assert(std::is_trivially_copy_constructible<MapComponents<Identity, SwapComponents<0, 1>>>(), \"\");\n+static_assert(IsFabProjection<MapComponents<Identity, SwapComponents<0, 1>>, FArrayBox>(), \"\");\n+\n+static_assert(swap_indices<0, 1>(0) == 1, \"\");\n+static_assert(swap_indices<0, 1>(1) == 0, \"\");\n+static_assert(swap_indices<0, 1>(2) == 2, \"\");\n+static_assert(DynamicSwapComponents{0, 1}(0) == 1, \"\");\n+static_assert(DynamicSwapComponents{0, 1}(1) == 0, \"\");\n+static_assert(DynamicSwapComponents{0, 1}(2) == 2, \"\");\n+\n+////////////////////////////////////////////////////////////////////////////////////\n+// [class.CommData]\n+// [class.CommHandler]\n+\n+//! \\brief This class holds data buffers for either immediate MPI send or recv calls.\n+//!\n+//! The data buffers need to be kept alive until all MPI_Request have been completed.\n+//! All member variables are resized a corresponding call to PrepareCommBuffers and \n+//! the data transactions are initiated either by calls to PostRecvs or PostSends.\n+struct CommData {\n+#ifdef AMREX_USE_MPI\n+ //! \\brief Holds 'em all in one data pointer.\n+ TheFaArenaPointer the_data = nullptr;\n+ //! \\brief Stores MPI ranks. For recvs it is the 'from' rank and for sends it is the 'to' rank.\n+ Vector<int> rank{};\n+ //! \\brief Pointers to the_data that can be used for each single data transaction.\n+ Vector<char*> data{};\n+ //! \\brief All offsets of data in the_data.\n+ Vector<std::size_t> offset{};\n+ //! \\brief The size in bytes for each data transaction.\n+ Vector<std::size_t> size{};\n+ //! \\brief The associated MPI_Request for each data transaction.\n+ Vector<MPI_Request> request{};\n+ //! \\brief For each request the corresponding MPI_status, used for debugging.\n+ Vector<MPI_Status> stats{};\n+ //! \\brief For each requst the copy comm tags for the corresponding data FABs. \n+ Vector<const FabArrayBase::CopyComTagsContainer*> cctc{};\n+#endif\n+};\n+\n+#ifdef AMREX_USE_MPI\n+//! \\brief Fill all class member variables of comm but the request and the stats vector.\n+void PrepareCommBuffers(CommData& comm, const FabArrayBase::MapOfCopyComTagContainers& cctc,\n+ int n_components, std::size_t object_size, std::size_t align);\n+\n+//! \\brief Initiate all recvieves with MPI_Irecv calls associated with tag mpi_tag. \n+void PostRecvs(CommData& comm, int mpi_tag);\n+\n+//! \\brief Initiate all sends with MPI_Isend calls associated with tag mpi_tag. \n+void PostSends(CommData& comm, int mpi_tag);\n+#endif\n+\n+\n+//! \\brief This class stores both recv and send buffers with an associated MPI tag.\n+//!\n+//! This handler stores data for a whole ParallelCopy MPI transaction.\n+struct CommHandler {\n+#ifdef AMREX_USE_MPI\n+ int mpi_tag{};\n+ CommData recv{};\n+ CommData send{};\n+#endif\n+};\n+\n+////////////////////////////////////////////////////////////////////////////////////\n+// [concept.DataPacking]\n+//\n+template <typename... Args>\n+using PrepareSendBuffers_t = decltype(PrepareSendBuffers(std::declval<Args>()...));\n+\n+template <typename... Args>\n+using PrepareRecvBuffers_t = decltype(PrepareRecvBuffers(std::declval<Args>()...));\n+\n+template <typename... Args>\n+using PackSendBuffers_t = decltype(PackSendBuffers(std::declval<Args>()...));\n+\n+template <typename... Args>\n+using UnpackRecvBuffers_t = decltype(UnpackRecvBuffers(std::declval<Args>()...));\n+\n+template <typename... Args>\n+using LocalCopy_t = decltype(LocalCopy(std::declval<Args>()...));\n+\n+//! \\brief This type trait tests if a given type DP satisfies the DataPacking concept for type FAB.\n+template <typename DP, typename FAB>\n+struct IsDataPacking : \n+ Conjunction<\n+ IsDetected<LocalCopy_t, DP&, FabArray<FAB>&, const FabArray<FAB>&, const FabArrayBase::CopyComTagsContainer&>\n+#ifdef AMREX_USE_MPI\n+ ,IsDetected<PrepareSendBuffers_t, DP&, FabArray<FAB>&, const FabArray<FAB>&, CommData&, const FabArrayBase::MapOfCopyComTagContainers&>,\n+ IsDetected<PrepareRecvBuffers_t, DP&, FabArray<FAB>&, const FabArray<FAB>&, CommData&, const FabArrayBase::MapOfCopyComTagContainers&>,\n+ IsDetected<PackSendBuffers_t, DP&, const FabArray<FAB>&, CommData&>,\n+ IsDetected<UnpackRecvBuffers_t, DP&, FabArray<FAB>&, CommData&>\n+#endif\n+ > {};\n+\n+////////////////////////////////////////////////////////////////////////////////////\n+// [DataPacking.PackComponents]\n+//\n+// PackComponents is the simplest data packing policy.\n+// This provides us with sane default behaviour that we can use when defining new \n+// data packing policies.\n+\n+//! \\brief Contains information about which components take part of the data transaction.\n+struct PackComponents {\n+ int dest_component{0};\n+ int src_component{0};\n+ int n_components{0};\n+};\n+\n+//! \\brief Dispatch local copies to the default behaviour that knows no DTOS nor projection.\n+template <typename FAB>\n+amrex::EnableIf_t<IsBaseFab<FAB>::value>\n+LocalCopy (const PackComponents& components, FabArray<FAB>& dest, const FabArray<FAB>& src,\n+ const FabArrayBase::CopyComTagsContainer& local_tags) {\n+#ifdef AMREX_USE_GPU\n+ if (Gpu::inLaunchRegion()) {\n+ local_copy_gpu(dest, src, components.dest_component, components.src_component,\n+ components.n_components, local_tags);\n+ } else\n+#endif\n+ {\n+ local_copy_cpu(dest, src, components.dest_component, components.src_component,\n+ components.n_components, local_tags);\n+ }\n+}\n+\n+#ifdef AMREX_USE_MPI\n+//! \\brief Calls PrepareComBuffers.\n+template <typename FAB>\n+amrex::EnableIf_t<IsBaseFab<FAB>::value>\n+PrepareSendBuffers (const PackComponents& components, FabArray<FAB>& dest, const FabArray<FAB>& src,\n+ CommData& comm, const FabArrayBase::MapOfCopyComTagContainers& cctc) {\n+ using T = typename FAB::value_type;\n+ ignore_unused(dest, src);\n+ PrepareCommBuffers(comm, cctc, components.n_components, sizeof(T), alignof(T));\n+}\n+\n+//! \\brief Calls PrepareComBuffers.\n+template <typename FAB>\n+amrex::EnableIf_t<IsBaseFab<FAB>::value>\n+PrepareRecvBuffers (const PackComponents& components, FabArray<FAB>& dest, const FabArray<FAB>& src, \n+ CommData& comm, const FabArrayBase::MapOfCopyComTagContainers& cctc) {\n+ using T = typename FAB::value_type;\n+ ignore_unused(dest, src);\n+ PrepareCommBuffers(comm, cctc, components.n_components, sizeof(T), alignof(T));\n+}\n+\n+//! \\brief Serializes FAB data without any knowledge of a DTOS nor a projection.\n+template <typename FAB>\n+amrex::EnableIf_t<IsBaseFab<FAB>::value>\n+PackSendBuffers (const PackComponents& components, const FabArray<FAB>& src, CommData& send) {\n+#ifdef AMREX_USE_GPU\n+ if (Gpu::inLaunchRegion()) {\n+ FabArray<FAB>::pack_send_buffer_gpu(src, components.src_component, components.n_components,\n+ send.data, send.size, send.cctc);\n+ } else\n+#endif // AMREX_USE_GPU\n+ {\n+ FabArray<FAB>::pack_send_buffer_cpu(src, components.src_component, components.n_components,\n+ send.data, send.size, send.cctc);\n+ }\n+}\n+\n+//! \\brief De-serializes FAB data without any knowledge of a DTOS nor a projection.\n+template <typename FAB>\n+amrex::EnableIf_t<IsBaseFab<FAB>::value>\n+UnpackRecvBuffers (const PackComponents& components, FabArray<FAB>& dest, const CommData& recv) {\n+#ifdef AMREX_USE_GPU\n+ if (Gpu::inLaunchRegion()) {\n+ unpack_recv_buffer_gpu(dest, components.dest_component, components.n_components, recv.data,\n+ recv.size, recv.cctc);\n+ } else\n+#endif // AMREX_USE_GPU\n+ {\n+ unpack_recv_buffer_cpu(dest, components.dest_component, components.n_components, recv.data,\n+ recv.size, recv.cctc);\n+ }\n+}\n+#endif // AMREX_USE_MPI\n+\n+static_assert(IsDataPacking<PackComponents, FArrayBox>(),\n+ \"PackComponents is expected to satisfy the concept DataPacking.\");\n+\n+////////////////////////////////////////////////////////////////////////////////////\n+// [DataPacking.ApplyDtosAndProjectionOnReciever]\n+//\n+//! \\brief This class specializes behaviour on local copies and unpacking recieve buffers.\n+//!\n+//! It takes a DTOS and FabProjection to apply them on the reciever side. \n+template <typename DTOS = Identity, typename FabProj = Identity>\n+struct ApplyDtosAndProjectionOnReciever : PackComponents {\n+ constexpr ApplyDtosAndProjectionOnReciever() = default;\n+ constexpr ApplyDtosAndProjectionOnReciever(const PackComponents& components, DTOS dtos_ = DTOS{}, FabProj proj_ = FabProj{})\n+ : PackComponents(components), dtos(std::move(dtos_)), proj(std::move(proj_)) {}\n+\n+ AMREX_NO_UNIQUE_ADDRESS DTOS dtos;\n+ AMREX_NO_UNIQUE_ADDRESS FabProj proj;\n+\n+ static_assert(IsCallableR<Dim3, DTOS, Dim3>(), \"DTOS needs to be a callable: Dim3 -> Dim3\");\n+ static_assert(IsFabProjection<FabProj, FArrayBox>(), \"FabProj needs to be at least a projection on FArrayBox.\");\n+};\n+\n+//! \\brief Do local copies of FABs using DTOS and projection.\n+template <typename FAB, typename DTOS, typename FabProj>\n+amrex::EnableIf_t<IsBaseFab<FAB>::value>\n+LocalCopy (const ApplyDtosAndProjectionOnReciever<DTOS, FabProj>& packing, FabArray<FAB>& dest,\n+ const FabArray<FAB>& src, const FabArrayBase::CopyComTagsContainer& local_tags) {\n+ static_assert(IsFabProjection<FabProj, FAB>(), \"FabProj needs to be a projection for given FAB type.\");\n+#ifdef AMREX_USE_GPU\n+ if (Gpu::inLaunchRegion()) {\n+ local_copy_gpu(dest, src, packing.dest_component, packing.src_component,\n+ packing.n_components, local_tags, packing.dtos, packing.proj);\n+ } else\n+#endif\n+ {\n+ local_copy_cpu(dest, src, packing.dest_component, packing.src_component,\n+ packing.n_components, local_tags, packing.dtos, packing.proj);\n+ }\n+}\n+\n+#ifdef AMREX_USE_MPI\n+//! \\brief Copy from recieved data in the buffer to destination FABs using DTOS and projection.\n+template <typename FAB, typename DTOS, typename FabProj>\n+amrex::EnableIf_t<IsBaseFab<FAB>::value>\n+UnpackRecvBuffers (const ApplyDtosAndProjectionOnReciever<DTOS, FabProj>& packing,\n+ FabArray<FAB>& dest, const CommData& recv) {\n+ // If FAB is not FArrayBox we have not checked for the correct types yet.\n+ static_assert(IsFabProjection<FabProj, FAB>(), \"FabProj needs to be a projection for given FAB type.\");\n+#ifdef AMREX_USE_GPU\n+ if (Gpu::inLaunchRegion()) {\n+ unpack_recv_buffer_gpu(dest, packing.dest_component, packing.n_components, recv.data,\n+ recv.size, recv.cctc, packing.dtos, packing.proj);\n+ } else\n+#endif // AMREX_USE_GPU\n+ {\n+ unpack_recv_buffer_cpu(dest, packing.dest_component, packing.n_components, recv.data,\n+ recv.size, recv.cctc, packing.dtos, packing.proj);\n+ }\n+}\n+#endif // AMREX_USE_MPI\n+\n+static_assert(IsDataPacking<ApplyDtosAndProjectionOnReciever<>, FArrayBox>(),\n+ \"ApplyDtosAndProjectionOnReciever<> is expected to satisfy the DataPacking concept.\");\n+\n+////////////////////////////////////////////////////////////////////////////////////\n+// [ParallelCopy_nowait]\n+\n+static constexpr struct NoLocalCopy {} no_local_copy{};\n+static constexpr struct DoLocalCopy {} do_local_copy{};\n+\n+//! Initiate recv and send calls for MPI and immediately return without doing any work.\n+//!\n+//! DataPacking is a customization point object to control the behaviour of packing and unpacking\n+//! send or recv data buffers. It is used to perform interpolation or data transformations on either\n+//! sender or reciever side.\n+//!\n+//! This function performs a data packing on sender side and we expect a call to Parallel_finish\n+//! that performs data unpacking on the reciever side.\n+//!\n+//! \\param[out] dest The Multifab that is going to be filled with recieved data.\n+//!\n+//! \\param[in] src The Multifab that is used to fill the send buffers.\n+//!\n+//! \\param[in] cmd The communication meta data object holds spatial information about FAB\n+//! boxes that need to be filled and copied from.\n+//!\n+//! \\param[in] data_packing A CPO that controls behaviour of preparing buffers and packing the\n+//! source data into the send buffers.\n+//!\n+//! \\return Returns a CommHandler object that owns context and memory buffers for the whole life\n+//! time of the MPI transaction.\n+template <typename FAB, typename DataPacking, \n+ typename = EnableIf_t<IsBaseFab<FAB>::value>,\n+ typename = EnableIf_t<IsDataPacking<DataPacking, FAB>::value>>\n+#ifdef AMREX_USE_MPI\n+AMREX_NODISCARD CommHandler \n+ParallelCopy_nowait (NoLocalCopy, FabArray<FAB>& dest, const FabArray<FAB>& src,\n+ const FabArrayBase::CommMetaData& cmd, const DataPacking& data_packing) {\n+ CommHandler handler{};\n+ if (ParallelContext::NProcsSub() == 1) {\n+ return handler;\n+ }\n+ //\n+ // Do this before prematurely exiting if running in parallel.\n+ // Otherwise sequence numbers will not match across MPI processes.\n+ //\n+ handler.mpi_tag = ParallelDescriptor::SeqNum();\n+\n+ const int N_rcvs = cmd.m_RcvTags ? cmd.m_RcvTags->size() : 0;\n+ if (N_rcvs > 0) {\n+ PrepareRecvBuffers(data_packing, dest, src, handler.recv, *cmd.m_RcvTags);\n+ PostRecvs(handler.recv, handler.mpi_tag);\n+ }\n+\n+ const int N_snds = cmd.m_SndTags ? cmd.m_SndTags->size() : 0;\n+ if (N_snds > 0) {\n+ PrepareSendBuffers(data_packing, dest, src, handler.send, *cmd.m_SndTags);\n+ PackSendBuffers(data_packing, src, handler.send);\n+ PostSends(handler.send, handler.mpi_tag);\n+ }\n+ return handler;\n+}\n+#else\n+CommHandler ParallelCopy_nowait (NoLocalCopy, FabArray<FAB>&, const FabArray<FAB>&,\n+ const FabArrayBase::CommMetaData&, const DataPacking&) {\n+ return CommHandler{};\n+}\n+#endif\n+\n+//! Initiate recv and send calls for MPI and return after doing local work.\n+//!\n+//! DataPacking is a customization point object to control the behaviour of packing and unpacking\n+//! send or recv data buffers. It is used to perform interpolation or data transformations on either\n+//! sender or reciever side.\n+//!\n+//! This function performs a data packing on sender side and we expect a call to Parallel_finish\n+//! that performs data unpacking on the reciever side.\n+//!\n+//! \\param[out] dest The Multifab that is going to be filled with recieved data.\n+//!\n+//! \\param[in] src The Multifab that is used to fill the send buffers.\n+//!\n+//! \\param[in] cmd The communication meta data object holds spatial information about FAB\n+//! boxes that need to be filled and copied from.\n+//!\n+//! \\param[in] data_packing A CPO that controls behaviour of preparing buffers and packing the\n+//! source data into the send buffers.\n+//!\n+//! \\return Returns a CommHandler object that owns context and memory buffers for the whole life\n+//! time of the MPI transaction.\n+template <typename FAB, typename DataPacking, \n+ typename = EnableIf_t<IsBaseFab<FAB>::value>,\n+ typename = EnableIf_t<IsDataPacking<DataPacking, FAB>::value>>\n+#ifdef AMREX_USE_MPI\n+AMREX_NODISCARD \n+#endif\n+CommHandler \n+ParallelCopy_nowait (FabArray<FAB>& dest, const FabArray<FAB>& src,\n+ const FabArrayBase::CommMetaData& cmd, const DataPacking& data_packing) {\n+ CommHandler comm = ParallelCopy_nowait(no_local_copy, dest, src, cmd, data_packing);\n+ // Eagerly do the local work and hope for some overlap with communication\n+ if (cmd.m_LocTags && cmd.m_LocTags->size() > 0) {\n+ LocalCopy(data_packing, dest, src, *cmd.m_LocTags);\n+ }\n+ return comm;\n+}\n+////////////////////////////////////////////////////////////////////////////////////\n+// [ParallelCopy_finish]\n+\n+//! Blockingly wait for all communication to be done and fill the local FABs with recieved data.\n+//!\n+//! This function overload performs no local copies, i.e. from this MPI process to itself.\n+//! It will block the current thread until all MPI recv and send requests are done and\n+//! calls the DataPacking object to unpack the recieved buffers.\n+//!\n+//! \\param[out] dest The Multifab that is going to be filled with recieved data.\n+//!\n+//! \\param[in] handler This object holds all data buffers that need to be kept alive as long as\n+//! the data transaction is not done.\n+//!\n+//! \\param[in] cmd The communication meta data object holds spatial information about FAB\n+//! boxes that need to be filled.\n+//!\n+//! \\param[in] data_packing A CPO that controls behaviour of unpacking the recieved buffer to the\n+//! destination FabArray.\n+//!\n+//! \\returns Nothing.\n+template <typename FAB, typename DataPacking>\n+EnableIf_t<IsBaseFab<FAB>() && IsDataPacking<DataPacking, FAB>()>\n+#ifdef AMREX_USE_MPI\n+ParallelCopy_finish (FabArray<FAB>& dest, CommHandler handler,\n+ const FabArrayBase::CommMetaData& cmd, const DataPacking& data_packing) {\n+ // If any FabArray is empty we have nothing to do.\n+ if (dest.size() == 0) {\n+ return;\n+ }\n+ // Return if nothing do\n+ if (ParallelContext::NProcsSub() == 1) {\n+ return;\n+ }\n+ // Unpack recieves\n+ const int N_rcvs = cmd.m_RcvTags ? cmd.m_RcvTags->size() : 0;\n+ if (N_rcvs > 0) {\n+ ParallelDescriptor::Waitall(handler.recv.request, handler.recv.stats);\n+#ifdef AMREX_D_DEBUG\n+ if (!CheckRcvStats(stats, handler.recv_size, handler.mpi_tag)) {\n+ amrex::Abort(\"NonLocalPC::ParallelCopy_finish failed with wrong message size\");\n+ }\n+#endif\n+ UnpackRecvBuffers(data_packing, dest, handler.recv);\n+ }\n+\n+ // Wait for all sends to be done\n+ const int N_snds = cmd.m_SndTags ? cmd.m_SndTags->size() : 0;\n+ if (N_snds > 0) {\n+ ParallelDescriptor::Waitall(handler.send.request, handler.send.stats);\n+ }\n+}\n+#else\n+ParallelCopy_finish (FabArray<FAB>&, CommHandler, const FabArrayBase::CommMetaData&, const DataPacking&) {}\n+#endif\n+\n+//! Blockingly wait for all communication to be done and fill the local FABs with recieved data.\n+//!\n+//! This function overload performs local copies, i.e. from this MPI process to itself.\n+//! It will block the current thread until all MPI recv and send requests are done and\n+//! calls the DataPacking object to unpack the recieved buffers.\n+//!\n+//! \\param[out] dest The Multifab that is going to be filled with recieved data.\n+//!\n+//! \\param[in] src The Multifab that is used to get the data for the local copies from.\n+//!\n+//! \\param[in] handler This object holds all data buffers that need to be kept alive as long as\n+//! the data transaction is not done.\n+//!\n+//! \\param[in] cmd The communication meta data object holds spatial information about FAB\n+//! boxes that need to be filled.\n+//!\n+//! \\param[in] data_packing A CPO that controls behaviour of unpacking the recieved data.\n+//!\n+//! \\returns Nothing.\n+template <typename FAB, typename DataPacking>\n+EnableIf_t<IsBaseFab<FAB>() && IsDataPacking<DataPacking, FAB>()>\n+ParallelCopy_finish (DoLocalCopy, FabArray<FAB>& dest, const FabArray<FAB>& src, CommHandler handler,\n+ const FabArrayBase::CommMetaData& cmd, const DataPacking& data_packing) {\n+ // Eagerly do the local work and hope for some overlap with communication\n+ if (cmd.m_LocTags && cmd.m_LocTags->size() > 0) {\n+ LocalCopy(data_packing, dest, src, *cmd.m_LocTags);\n+ }\n+ ParallelCopy_finish(dest, std::move(handler), cmd, data_packing);\n+}\n+\n+//! \\brief Call ParallelCopy_nowait followed by ParallelCopy_finish, strong typed version.\n+//!\n+//! This function overload uses an already cached CommMetaData. This CommMetaData needs to be\n+//! compatible with the specified DTOS and projection, otherwise undefined behaviour occurs.\n+//!\n+//! \\param[out] dest The Multifab that is going to be filled with recieved data.\n+//!\n+//! \\param[in] src The Multifab that is used to fill the send buffers.\n+//!\n+//! \\param[in] cmd The communication meta data object holds spatial information about FAB\n+//! boxes that need to be filled and copied from.\n+//!\n+//! \\param[in] srccomp The first component in src that will be copied to dest.\n+//!\n+//! \\param[in] destcomp The first component in dest that will get written by src.\n+//!\n+//! \\param[in] ncomp The number of successive components that will be copied.\n+//!\n+//! \\param[in] dtos An index mapping that maps indices from destination space to source space\n+//! and from source space to destination space.\n+//!\n+//! \\param[in] proj A transformation function that might change the data when it is being copied.\n+//!\n+//! \\return Nothing.\n+template <typename FAB, typename DTOS = Identity, typename Proj = Identity>\n+EnableIf_t<IsBaseFab<FAB>() && IsCallableR<Dim3, DTOS, Dim3>() && IsFabProjection<Proj, FAB>()>\n+ParallelCopy (FabArray<FAB>& dest, const FabArray<FAB>& src, const FabArrayBase::CommMetaData& cmd,\n+ SrcComp srccomp, DestComp destcomp, NumComps numcomp, DTOS dtos = DTOS{}, Proj proj = Proj{}) {\n+ PackComponents components{};\n+ components.dest_component = destcomp.i;\n+ components.src_component = srccomp.i;\n+ components.n_components = numcomp.n;\n+ ApplyDtosAndProjectionOnReciever<DTOS, Proj> packing{components, std::move(dtos), std::move(proj)};\n+ CommHandler handler = ParallelCopy_nowait(dest, src, cmd, packing);\n+ ParallelCopy_finish(dest, std::move(handler), cmd, packing);\n+}\n+\n+//! \\brief Call ParallelCopy_nowait followed by ParallelCopy_finish.\n+//!\n+//! This function overload uses an already cached CommMetaData. This CommMetaData needs to be\n+//! compatible with the specified DTOS and projection, otherwise undefined behaviour occurs.\n+//!\n+//! \\param[out] dest The Multifab that is going to be filled with recieved data.\n+//!\n+//! \\param[in] src The Multifab that is used to fill the send buffers.\n+//!\n+//! \\param[in] cmd The communication meta data object holds spatial information about FAB\n+//! boxes that need to be filled and copied from.\n+//!\n+//! \\param[in] srccomp The first component in src that will be copied to dest.\n+//!\n+//! \\param[in] destcomp The first component in dest that will get written by src.\n+//!\n+//! \\param[in] ncomp The number of successive components that will be copied.\n+//!\n+//! \\param[in] dtos An index mapping that maps indices from destination space to source space\n+//! and from source space to destination space.\n+//!\n+//! \\param[in] proj A transformation function that might change the data when it is being copied.\n+//!\n+//! \\return Nothing.\n+template <typename FAB, typename DTOS = Identity, typename Proj = Identity>\n+EnableIf_t<IsBaseFab<FAB>() && IsCallableR<Dim3, DTOS, Dim3>() && IsFabProjection<Proj, FAB>()>\n+ParallelCopy (FabArray<FAB>& dest, const FabArray<FAB>& src, const FabArrayBase::CommMetaData& cmd,\n+ int srccomp, int destcomp, int numcomp, DTOS dtos = DTOS{}, Proj proj = Proj{}) {\n+ ParallelCopy(dest, src, cmd, SrcComp(srccomp), DestComp(destcomp), NumComps(numcomp), std::move(dtos), std::move(proj));\n+}\n+\n+//! \\brief Call ParallelCopy_nowait followed by ParallelCopy_finish, strong typed version.\n+//!\n+//! This function constructs a new MultiCommMetaData from the given DTOS, destbox and ngrow. \n+//!\n+//! \\param[out] dest The Multifab that is going to be filled with recieved data.\n+//!\n+//! \\param[in] destbox The index box in the destination space that will be filled by data from \n+//! src. The source box that describes the dependencies will be computed by \n+//! the specified DTOS.\n+//!\n+//! \\param[in] src The Multifab that is used to fill the send buffers.\n+//!\n+//! \\param[in] srccomp The first component in src that will be copied to dest.\n+//!\n+//! \\param[in] destcomp The first component in dest that will get written by src.\n+//!\n+//! \\param[in] ncomp The number of successive components that will be copied.\n+//!\n+//! \\param[in] ngrow The amount of ghost cells that will be taking into consideration.\n+//! Note, even if destbox contains indices outside the domain we need to \n+//! specify an appropiate ngrow that covers the amound of ghost cells that\n+//! we want to copy. \n+//!\n+//! \\param[in] dtos An index mapping that maps indices from destination space to source space\n+//! and from source space to destination space.\n+//!\n+//! \\param[in] proj A transformation function that might change the data when it is being copied.\n+//!\n+//! \\return Returns the CommMetaData object that can be cached for future calls to ParallelCopy.\n+template <typename FAB, typename DTOS = Identity, typename Proj = Identity>\n+EnableIf_t<IsBaseFab<FAB>() && IsIndexMapping<DTOS>() && IsFabProjection<Proj, FAB>(),\n+MultiBlockCommMetaData>\n+ParallelCopy (FabArray<FAB>& dest, const Box& destbox, const FabArray<FAB>& src, SrcComp srccomp,\n+ DestComp destcomp, NumComps numcomp, const IntVect& ngrow, DTOS dtos = DTOS{}, Proj proj = Proj{}) {\n+ MultiBlockCommMetaData cmd(dest, destbox, src, ngrow, dtos);\n+ ParallelCopy(dest, src, cmd, srccomp, destcomp, numcomp, std::move(dtos), std::move(proj));\n+ return cmd;\n+}\n+\n+//! \\brief Call ParallelCopy_nowait followed by ParallelCopy_finish.\n+//!\n+//! This function constructs a new MultiCommMetaData from the given DTOS, destbox and ngrow. \n+//!\n+//! \\param[out] dest The Multifab that is going to be filled with recieved data.\n+//!\n+//! \\param[in] destbox The index box in the destination space that will be filled by data from \n+//! src. The source box that describes the dependencies will be computed by \n+//! the specified DTOS.\n+//!\n+//! \\param[in] src The Multifab that is used to fill the send buffers.\n+//!\n+//! \\param[in] srccomp The first component in src that will be copied to dest.\n+//!\n+//! \\param[in] destcomp The first component in dest that will get written by src.\n+//!\n+//! \\param[in] ncomp The number of successive components that will be copied.\n+//!\n+//! \\param[in] ngrow The amount of ghost cells that will be taking into consideration.\n+//! Note, even if destbox contains indices outside the domain we need to \n+//! specify an appropiate ngrow that covers the amound of ghost cells that\n+//! we want to copy. \n+//!\n+//! \\param[in] dtos An index mapping that maps indices from destination space to source space\n+//! and from source space to destination space.\n+//!\n+//! \\param[in] proj A transformation function that might change the data when it is being copied.\n+//!\n+//! \\return Returns the CommMetaData object that can be cached for future calls to ParallelCopy.\n+template <typename FAB, typename DTOS = Identity, typename Proj = Identity>\n+EnableIf_t<IsBaseFab<FAB>() && IsIndexMapping<DTOS>() && IsFabProjection<Proj, FAB>(),\n+MultiBlockCommMetaData>\n+ParallelCopy (FabArray<FAB>& dest, const Box& destbox, const FabArray<FAB>& src, int srccomp,\n+ int destcomp, int numcomp, const IntVect& ngrow, DTOS dtos = DTOS{}, Proj proj = Proj{}) {\n+ return ParallelCopy(dest, destbox, src, SrcComp(srccomp), DestComp(destcomp), NumComps(numcomp), ngrow, std::move(dtos), std::move(proj));\n+}\n+\n // Rotate90 fills the lo-x and lo-y boundary regions by rotating the data\n // around (x=0,y=0) by 90 degrees in either direction. It also fills the\n // corner of lo-x and lo-y boundary region by rotating the data by 180\ndiff --git a/Src/Base/AMReX_NonLocalBC.cpp b/Src/Base/AMReX_NonLocalBC.cpp\nnew file mode 100644\nindex 00000000000..78d97bca584\n--- /dev/null\n+++ b/Src/Base/AMReX_NonLocalBC.cpp\n@@ -0,0 +1,110 @@\n+#include \"AMReX_NonLocalBC.H\"\n+\n+namespace amrex {\n+namespace NonLocalBC {\n+#ifdef AMREX_USE_MPI\n+// Note, this is copied and modified from PrepareSendBuffers and PostRcvs\n+void PrepareCommBuffers(CommData& comm, \n+ const FabArrayBase::MapOfCopyComTagContainers& cctc, int n_components,\n+ std::size_t object_size, std::size_t align)\n+{\n+ comm.data.clear();\n+ comm.size.clear();\n+ comm.rank.clear();\n+ comm.request.clear();\n+ comm.offset.clear();\n+ comm.cctc.clear();\n+ comm.stats.clear();\n+\n+ const int N_comms = cctc.size();\n+ if (N_comms == 0) return;\n+ // reserve for upcominf push_backs\n+ comm.data.reserve(N_comms);\n+ comm.size.reserve(N_comms);\n+ comm.rank.reserve(N_comms);\n+ comm.request.reserve(N_comms);\n+ comm.offset.reserve(N_comms);\n+ comm.cctc.reserve(N_comms);\n+ // resize to provide buffer for later\n+ comm.stats.resize(N_comms);\n+\n+ std::size_t total_volume = 0;\n+ for (const auto& kv : cctc)\n+ {\n+ std::size_t nbytes = 0;\n+ for (auto const& cct : kv.second)\n+ {\n+ // Note: Does this hold for all FAB types? \n+ // This nBytes() implementation is currently also assumed in unpack_recv_buffers\n+ nbytes += cct.sbox.numPts() * object_size * n_components;\n+ }\n+\n+ std::size_t acd = ParallelDescriptor::alignof_comm_data(nbytes);\n+ nbytes = amrex::aligned_size(acd, nbytes); // so that nbytes are aligned\n+\n+ // Also need to align the offset properly\n+ total_volume = amrex::aligned_size(std::max(align, acd), total_volume);\n+\n+ comm.offset.push_back(total_volume);\n+ comm.data.push_back(nullptr);\n+ comm.size.push_back(nbytes);\n+ comm.rank.push_back(kv.first);\n+ comm.request.push_back(MPI_REQUEST_NULL);\n+ comm.cctc.push_back(&kv.second);\n+\n+ total_volume += nbytes;\n+ }\n+\n+ if (total_volume == 0)\n+ {\n+ comm.the_data.reset();\n+ }\n+ else\n+ {\n+ comm.the_data.reset(static_cast<char*>(amrex::The_FA_Arena()->alloc(total_volume)));\n+ for (int i = 0; i < N_comms; ++i) {\n+ comm.data[i] = comm.the_data.get() + comm.offset[i];\n+ }\n+ }\n+}\n+\n+void PostRecvs(CommData& recv, int mpi_tag) {\n+ AMREX_ASSERT(recv.data.size() == recv.offset.size());\n+ AMREX_ASSERT(recv.data.size() == recv.size.size());\n+ AMREX_ASSERT(recv.data.size() == recv.rank.size());\n+ AMREX_ASSERT(recv.data.size() == recv.request.size());\n+ MPI_Comm comm = ParallelContext::CommunicatorSub();\n+ for (int i = 0; i < recv.data.size(); ++i) {\n+ if (recv.size[i] > 0) {\n+ const int rank = ParallelContext::global_to_local_rank(recv.rank[i]);\n+ AMREX_ASSERT(recv.data[i] != nullptr);\n+ recv.request[i] =\n+ ParallelDescriptor::Arecv(recv.data[i], recv.size[i], rank, mpi_tag, comm).req();\n+ }\n+ }\n+}\n+\n+void PostSends(CommData& send, int mpi_tag) {\n+ const int n_sends = send.data.size();\n+ AMREX_ASSERT(n_sends == send.size.size());\n+ AMREX_ASSERT(n_sends == send.rank.size());\n+ AMREX_ASSERT(n_sends == send.request.size());\n+ MPI_Comm comm = ParallelContext::CommunicatorSub();\n+ for (int j = 0; j < n_sends; ++j) {\n+ if (send.size[j] > 0) {\n+ const int rank = ParallelContext::global_to_local_rank(send.rank[j]);\n+ AMREX_ASSERT(send.data[j] != nullptr);\n+ send.request[j] =\n+ ParallelDescriptor::Asend(send.data[j], send.size[j], rank, mpi_tag, comm).req();\n+ }\n+ }\n+}\n+#endif\n+\n+template MultiBlockCommMetaData ParallelCopy(FabArray<FArrayBox>& dest, const Box& destbox,\n+ const FabArray<FArrayBox>& src, int destcomp,\n+ int srccomp, int numcomp, const IntVect& ngrow,\n+ MultiBlockIndexMapping, Identity);\n+\n+} // namespace NonLocalBC\n+} // namespace amrex\ndiff --git a/Src/Base/AMReX_NonLocalBCImpl.H b/Src/Base/AMReX_NonLocalBCImpl.H\nindex 8fde837f27c..36869ceba58 100644\n--- a/Src/Base/AMReX_NonLocalBCImpl.H\n+++ b/Src/Base/AMReX_NonLocalBCImpl.H\n@@ -1,9 +1,13 @@\n+#ifndef AMREX_NONLOCAL_BC_H_\n+#include \"AMReX_NonLocalBC.H\"\n+#endif\n+\n #ifndef AMREX_NONLOCAL_BC_IMPL_H_\n #define AMREX_NONLOCAL_BC_IMPL_H_\n #include <AMReX_Config.H>\n+#include <AMReX_TypeTraits.H>\n \n namespace amrex { namespace NonLocalBC {\n-\n struct Rotate90ClockWise {\n AMREX_GPU_HOST_DEVICE\n IntVect operator() (IntVect const& iv) const noexcept {\n@@ -155,37 +159,63 @@ struct PolarFn2 { // for the x-y corners\n }\n };\n \n-template <class FAB, class DTOS>\n-void\n-local_copy_cpu (FabArray<FAB>& mf, int scomp, int ncomp, FabArrayBase::CommMetaData const& cmd,\n- DTOS dtos)\n-{\n- auto const& LocTags = *(cmd.m_LocTags);\n- int N_locs = LocTags.size();\n+//! \\brief Perform the local copies from src to dest without doing any MPI communication.\n+//!\n+//! This function assumes that all destination and source boxes stored in the local copy comm tags\n+//! are related by the DTOS. If this is not the case the behaviour will at best be caught as an\n+//! assertion.\n+//!\n+//! \\param[out] dest The destination FabArray that will be filled with data.\n+//!\n+//! \\param[in] src The source FabArray where data will be taken from.\n+//!\n+//! \\param[in] dcomp The first component at the destination.\n+//!\n+//! \\param[in] scomp The first component at the srouce.\n+//!\n+//! \\param[in] ncomp The number of components that will be copied.\n+//!\n+//! \\param[in] local_tags The vector of copy com tags that describes each local copy\n+//! transaction.\n+//!\n+//! \\param[in] dtos The dest to source index mapping that will be used in the copy function.\n+//!\n+//! \\param[in] proj A FAB projection that might transform the data.\n+//!\n+//! \\return Nothing.\n+template <class FAB, class DTOS = Identity, class Proj = Identity>\n+EnableIf_t<IsBaseFab<FAB>() && IsCallableR<Dim3, DTOS, Dim3>() && IsFabProjection<Proj, FAB>()>\n+local_copy_cpu (FabArray<FAB>& dest, const FabArray<FAB>& src, int dcomp, int scomp, int ncomp,\n+ FabArrayBase::CopyComTagsContainer const& local_tags, DTOS dtos = DTOS{},\n+ Proj proj = Proj{}) noexcept {\n+ const int N_locs = local_tags.size();\n if (N_locs == 0) return;\n #ifdef AMREX_USE_OMP\n #pragma omp parallel for\n #endif\n for (int itag = 0; itag < N_locs; ++itag) {\n- const auto& tag = LocTags[itag];\n- auto const& sfab = mf.const_array(tag.srcIndex);\n- auto const& dfab = mf.array (tag.dstIndex);\n+ const auto& tag = local_tags[itag];\n+ auto const& sfab = src.const_array(tag.srcIndex);\n+ auto const& dfab = dest.array (tag.dstIndex);\n amrex::LoopConcurrentOnCpu(tag.dbox, ncomp, [=] (int i, int j, int k, int n) noexcept\n {\n auto const si = dtos(Dim3{i,j,k});\n- dfab(i,j,k,scomp+n) = sfab(si.x,si.y,si.z,scomp+n);\n+ dfab(i,j,k,dcomp+n) = proj(sfab,si,scomp+n);\n });\n }\n }\n \n-template <class FAB, class DTOS>\n-void\n-unpack_recv_buffer_cpu (FabArray<FAB>& mf, int scomp, int ncomp,\n- Vector<char*> const& recv_data,\n+//! \\brief Unpack the recieved data into the local FABs.\n+//!\n+//! This function assumes that all destination and source boxes stored in the local copy comm tags\n+//! are related by the DTOS. If this is not the case the behaviour will at best be caught as an\n+//! assertion.\n+template <class FAB, class DTOS = Identity, class Proj = Identity>\n+EnableIf_t<IsBaseFab<FAB>() && IsCallableR<Dim3, DTOS, Dim3>() && IsFabProjection<Proj, FAB>()>\n+unpack_recv_buffer_cpu (FabArray<FAB>& mf, int dcomp, int ncomp, Vector<char*> const& recv_data,\n Vector<std::size_t> const& recv_size,\n Vector<FabArrayBase::CopyComTagsContainer const*> const& recv_cctc,\n- DTOS dtos)\n-{\n+ DTOS dtos = DTOS{}, Proj proj = Proj{}) noexcept {\n amrex::ignore_unused(recv_size);\n \n const int N_rcvs = recv_cctc.size();\n@@ -201,10 +231,9 @@ unpack_recv_buffer_cpu (FabArray<FAB>& mf, int scomp, int ncomp,\n for (auto const& tag : cctc) {\n auto const& dfab = mf.array(tag.dstIndex);\n auto const& sfab = amrex::makeArray4((T const*)(dptr), tag.sbox, ncomp);\n- amrex::LoopConcurrentOnCpu(tag.dbox, ncomp, [=] (int i, int j, int k, int n) noexcept\n- {\n- auto const si = dtos(Dim3{i,j,k});\n- dfab(i,j,k,scomp+n) = sfab(si.x,si.y,si.z,n);\n+ amrex::LoopConcurrentOnCpu(tag.dbox, ncomp, [=](int i, int j, int k, int n) noexcept {\n+ auto const si = dtos(Dim3{i, j, k});\n+ dfab(i, j, k, dcomp + n) = proj(sfab, si, n);\n });\n dptr += tag.sbox.numPts() * ncomp * sizeof(T);\n AMREX_ASSERT(dptr <= recv_data[ircv] + recv_size[ircv]);\n@@ -223,38 +252,36 @@ struct Array4Array4Box {\n Box const& box () const noexcept { return dbox; }\n };\n \n-template <class FAB, class DTOS>\n-void\n-local_copy_gpu (FabArray<FAB>& mf, int scomp, int ncomp, FabArrayBase::CommMetaData const& cmd,\n- DTOS dtos)\n-{\n- auto const& LocTags = *(cmd.m_LocTags);\n- int N_locs = LocTags.size();\n+template <class FAB, class DTOS = Identity, class Proj = Identity>\n+EnableIf_t<IsBaseFab<FAB>() && IsCallableR<Dim3, DTOS, Dim3>() && IsFabProjection<Proj, FAB>()>\n+local_copy_gpu (FabArray<FAB>& dest, const FabArray<FAB>& src, int dcomp, int scomp, int ncomp,\n+ FabArrayBase::CopyComTagsContainer const& local_tags, DTOS dtos = DTOS{},\n+ Proj proj = Proj{}) noexcept {\n+ int N_locs = local_tags.size();\n if (N_locs == 0) return;\n \n using T = typename FAB::value_type;\n Vector<Array4Array4Box<T> > loc_copy_tags;\n loc_copy_tags.reserve(N_locs);\n- for (int itag = 0; itag < N_locs; ++itag) {\n- const auto& tag = LocTags[itag];\n- loc_copy_tags.push_back({mf.array(tag.dstIndex), mf.const_array(tag.srcIndex), tag.dbox});\n+ for (auto const& tag : local_tags) {\n+ loc_copy_tags.push_back({dest.array(tag.dstIndex), src.const_array(tag.srcIndex), tag.dbox});\n }\n \n ParallelFor(loc_copy_tags, ncomp, [=] AMREX_GPU_DEVICE (int i, int j, int k, int n,\n Array4Array4Box<T> const& tag) noexcept\n {\n auto const si = dtos(Dim3{i,j,k});\n- tag.dfab(i,j,k,scomp+n) = tag.sfab(si.x,si.y,si.z,scomp+n);\n+ tag.dfab(i,j,k,dcomp+n) = proj(tag.sfab, si, scomp+n);\n });\n }\n \n-template <class FAB, class DTOS>\n-void\n+template <class FAB, class DTOS = Identity, class Proj = Identity>\n+EnableIf_t<IsBaseFab<FAB>() && IsCallableR<Dim3, DTOS, Dim3>() && IsFabProjection<Proj, FAB>()>\n unpack_recv_buffer_gpu (FabArray<FAB>& mf, int scomp, int ncomp,\n Vector<char*> const& recv_data,\n Vector<std::size_t> const& recv_size,\n Vector<FabArrayBase::CopyComTagsContainer const*> const& recv_cctc,\n- DTOS dtos)\n+ DTOS dtos = DTOS{}, Proj proj = Proj{})\n {\n amrex::ignore_unused(recv_size);\n \n@@ -299,7 +326,7 @@ unpack_recv_buffer_gpu (FabArray<FAB>& mf, int scomp, int ncomp,\n Array4Array4Box<T> const& tag) noexcept\n {\n auto const si = dtos(Dim3{i,j,k});\n- tag.dfab(i,j,k,scomp+n) = tag.sfab(si.x,si.y,si.z,n);\n+ tag.dfab(i,j,k,scomp+n) = proj(tag.sfab, si ,n);\n });\n \n // There is Gpu::synchronize in ParalleFor above\n@@ -310,23 +337,70 @@ unpack_recv_buffer_gpu (FabArray<FAB>& mf, int scomp, int ncomp,\n }\n #endif\n \n-struct CommHandler\n-{\n-#ifdef AMREX_USE_MPI\n- int mpi_tag;\n- TheFaArenaPointer the_recv_data = nullptr;\n- TheFaArenaPointer the_send_data = nullptr;\n- //\n- Vector<int> recv_from;\n- Vector<char*> recv_data;\n- Vector<std::size_t> recv_size;\n- Vector<MPI_Request> recv_reqs;\n- //\n- Vector<MPI_Request> send_reqs;\n-#endif\n-};\n+template <typename DTOS, typename>\n+MultiBlockCommMetaData::MultiBlockCommMetaData (const FabArrayBase& dst, const Box& dstbox, const FabArrayBase& src,\n+ const IntVect& ngrow, DTOS dtos)\n+ : MultiBlockCommMetaData(dst.boxArray(), dst.DistributionMap(), dstbox, src.boxArray(),\n+ src.DistributionMap(), ngrow, dtos) {}\n+\n+template <typename DTOS, typename>\n+MultiBlockCommMetaData::MultiBlockCommMetaData (const BoxArray& dstba, const DistributionMapping& dstdm,\n+ const Box& dstbox, const BoxArray& srcba,\n+ const DistributionMapping& srcdm, const IntVect& ngrow, DTOS dtos) {\n+ define(dstba, dstdm, dstbox, srcba, srcdm, ngrow, dtos);\n+}\n+\n+template <typename DTOS>\n+EnableIf_t<IsIndexMapping<DTOS>::value>\n+MultiBlockCommMetaData::define (const BoxArray& dstba, const DistributionMapping& dstdm, const Box& dstbox,\n+ const BoxArray& srcba, const DistributionMapping& srcdm, const IntVect& ngrow, \n+ DTOS dtos) {\n+ m_LocTags = std::make_unique<FabArrayBase::CopyComTagsContainer>();\n+ m_SndTags = std::make_unique<FabArrayBase::MapOfCopyComTagContainers>();\n+ m_RcvTags = std::make_unique<FabArrayBase::MapOfCopyComTagContainers>();\n+ const int myproc = ParallelDescriptor::MyProc();\n+ for (int i = 0, N = dstba.size(); i < N; ++i) {\n+ const int dest_owner = dstdm[i];\n+ const Box partial_dstbox = grow(dstba[i], ngrow) & dstbox;\n+ if (partial_dstbox.isEmpty()) {\n+ continue;\n+ }\n+ const Box partial_dstbox_mapped_in_src = Image(dtos, partial_dstbox).setType(srcba.ixType());\n+ enum { not_first_only = 0, first_only = 1 };\n+ std::vector<std::pair<int, Box>> boxes_from_src =\n+ srcba.intersections(partial_dstbox_mapped_in_src, not_first_only, ngrow);\n+ for (std::pair<int, Box> counted_box : boxes_from_src) {\n+ const int k = counted_box.first;\n+ const Box src_box = counted_box.second;\n+ AMREX_ASSERT(k < srcba.size());\n+ const int src_owner = srcdm[k];\n+ if (dest_owner == myproc || src_owner == myproc) {\n+ if (src_owner == dest_owner) {\n+ const BoxList tilelist(src_box, FabArrayBase::comm_tile_size);\n+ for (const Box& tilebox : tilelist) {\n+ const Box inverse_image = InverseImage(dtos, tilebox).setType(dstba.ixType());\n+ if ((inverse_image & partial_dstbox).ok()) {\n+ m_LocTags->emplace_back(inverse_image, tilebox, i, k);\n+ }\n+ }\n+ } else {\n+ const Box inverse_image = InverseImage(dtos, src_box).setType(dstba.ixType());\n+ if ((inverse_image & partial_dstbox).ok()) {\n+ FabArrayBase::CopyComTagsContainer& copy_tags =\n+ (src_owner == myproc) ? (*m_SndTags)[dest_owner]\n+ : (*m_RcvTags)[src_owner];\n+ copy_tags.emplace_back(inverse_image, src_box, i, k);\n+ }\n+ }\n+ }\n+ }\n+ }\n+}\n \n template <class FAB, class DTOS>\n+#ifdef AMREX_USE_MPI\n+AMREX_NODISCARD\n+#endif\n CommHandler\n Comm_nowait (FabArray<FAB>& mf, int scomp, int ncomp, FabArrayBase::CommMetaData const& cmd,\n DTOS dtos)\n@@ -339,11 +413,11 @@ Comm_nowait (FabArray<FAB>& mf, int scomp, int ncomp, FabArrayBase::CommMetaData\n if (N_locs == 0) return CommHandler{};\n #ifdef AMREX_USE_GPU\n if (Gpu::inLaunchRegion()) {\n- local_copy_gpu(mf, scomp, ncomp, cmd, dtos);\n+ local_copy_gpu(mf, mf, scomp, scomp, ncomp, *cmd.m_LocTags, dtos);\n } else\n #endif\n {\n- local_copy_cpu(mf, scomp, ncomp, cmd, dtos);\n+ local_copy_cpu(mf, mf, scomp, scomp, ncomp, *cmd.m_LocTags, dtos);\n }\n return CommHandler{};\n }\n@@ -368,42 +442,38 @@ Comm_nowait (FabArray<FAB>& mf, int scomp, int ncomp, FabArrayBase::CommMetaData\n handler.mpi_tag = SeqNum;\n \n if (N_rcvs > 0) {\n- handler.the_recv_data = mf.PostRcvs(*cmd.m_RcvTags, handler.recv_data, handler.recv_size,\n- handler.recv_from, handler.recv_reqs, ncomp, SeqNum);\n+ handler.recv.the_data = mf.PostRcvs(*cmd.m_RcvTags, handler.recv.data, handler.recv.size,\n+ handler.recv.rank, handler.recv.request, ncomp, SeqNum);\n }\n \n- if (N_snds > 0)\n- {\n- Vector<std::size_t> send_size;\n- Vector<int> send_rank;\n- Vector<char*> send_data;\n- Vector<const FabArrayBase::CopyComTagsContainer*> send_cctc;\n- handler.the_send_data = mf.PrepareSendBuffers(*cmd.m_SndTags, send_data,\n- send_size, send_rank, handler.send_reqs, send_cctc, ncomp);\n+ if (N_snds > 0) {\n+ handler.send.the_data =\n+ mf.PrepareSendBuffers(*cmd.m_SndTags, handler.send.data, handler.send.size,\n+ handler.send.rank, handler.send.request, handler.send.cctc, ncomp);\n \n #ifdef AMREX_USE_GPU\n if (Gpu::inLaunchRegion()) {\n- FabArray<FAB>::pack_send_buffer_gpu(mf, scomp, ncomp, send_data,\n- send_size, send_cctc);\n+ FabArray<FAB>::pack_send_buffer_gpu(mf, scomp, ncomp, handler.send.data,\n+ handler.send.size, handler.send.cctc);\n } else\n #endif\n {\n- FabArray<FAB>::pack_send_buffer_cpu(mf, scomp, ncomp, send_data,\n- send_size, send_cctc);\n+ FabArray<FAB>::pack_send_buffer_cpu(mf, scomp, ncomp, handler.send.data,\n+ handler.send.size, handler.send.cctc);\n }\n \n- FabArray<FAB>::PostSnds(send_data, send_size, send_rank, handler.send_reqs, SeqNum);\n+ FabArray<FAB>::PostSnds(handler.send.data, handler.send.size, handler.send.rank, handler.send.request, SeqNum);\n }\n \n if (N_locs > 0)\n {\n #ifdef AMREX_USE_GPU\n if (Gpu::inLaunchRegion()) {\n- local_copy_gpu(mf, scomp, ncomp, cmd, dtos);\n+ local_copy_gpu(mf, mf, scomp, scomp, ncomp, *cmd.m_LocTags, dtos);\n } else\n #endif\n {\n- local_copy_cpu(mf, scomp, ncomp, cmd, dtos);\n+ local_copy_cpu(mf, mf, scomp, scomp, ncomp, *cmd.m_LocTags, dtos);\n }\n }\n \n@@ -422,16 +492,15 @@ Comm_finish (FabArray<FAB>& mf, int scomp, int ncomp, FabArrayBase::CommMetaData\n const int N_rcvs = cmd.m_RcvTags->size();\n if (N_rcvs > 0)\n {\n- Vector<const FabArrayBase::CopyComTagsContainer*> recv_cctc(N_rcvs,nullptr);\n+ handler.recv.cctc.resize(N_rcvs, nullptr);\n for (int k = 0; k < N_rcvs; ++k) {\n- auto const& cctc = cmd.m_RcvTags->at(handler.recv_from[k]);\n- recv_cctc[k] = &cctc;\n+ auto const& cctc = cmd.m_RcvTags->at(handler.recv.rank[k]);\n+ handler.recv.cctc[k] = &cctc;\n }\n-\n- Vector<MPI_Status> stats(N_rcvs);\n- ParallelDescriptor::Waitall(handler.recv_reqs, stats);\n+ handler.recv.stats.resize(handler.recv.request.size());\n+ ParallelDescriptor::Waitall(handler.recv.request, handler.recv.stats);\n #ifdef AMREX_D_DEBUG\n- if (!CheckRcvStats(stats, handler.recv_size, handler.mpi_tag)) {\n+ if (!CheckRcvStats(stats, handler.recv.size, handler.mpi_tag)) {\n amrex::Abort(\"NonLocalBC::Comm_finish failed with wrong message size\");\n }\n #endif\n@@ -439,20 +508,20 @@ Comm_finish (FabArray<FAB>& mf, int scomp, int ncomp, FabArrayBase::CommMetaData\n #ifdef AMREX_USE_GPU\n if (Gpu::inLaunchRegion())\n {\n- unpack_recv_buffer_gpu(mf, scomp, ncomp, handler.recv_data,\n- handler.recv_size, recv_cctc, dtos);\n+ unpack_recv_buffer_gpu(mf, scomp, ncomp, handler.recv.data,\n+ handler.recv.size, handler.recv.cctc, dtos);\n } else\n #endif\n {\n- unpack_recv_buffer_cpu(mf, scomp, ncomp, handler.recv_data,\n- handler.recv_size, recv_cctc, dtos);\n+ unpack_recv_buffer_cpu(mf, scomp, ncomp, handler.recv.data,\n+ handler.recv.size, handler.recv.cctc, dtos);\n }\n }\n \n const int N_snds = cmd.m_SndTags->size();\n if (N_snds > 0) {\n- Vector<MPI_Status> stats(handler.send_reqs.size());\n- ParallelDescriptor::Waitall(handler.send_reqs, stats);\n+ handler.send.stats.resize(handler.send.request.size());\n+ ParallelDescriptor::Waitall(handler.send.request, handler.send.stats);\n }\n }\n #endif\n@@ -573,6 +642,10 @@ FillPolar (FabArray<FAB>& mf, Box const& domain)\n FillPolar(mf, 0, mf.nComp(), mf.nGrowVect(), domain);\n }\n \n+extern template MultiBlockCommMetaData ParallelCopy(FabArray<FArrayBox>& dest, const Box& destbox,\n+ const FabArray<FArrayBox>& src, int destcomp,\n+ int srccomp, int numcomp, const IntVect& ngrow,\n+ MultiBlockIndexMapping, Identity);\n }}\n \n #endif\ndiff --git a/Src/Base/AMReX_TypeTraits.H b/Src/Base/AMReX_TypeTraits.H\nindex 2fac1690ca4..1b1468bb503 100644\n--- a/Src/Base/AMReX_TypeTraits.H\n+++ b/Src/Base/AMReX_TypeTraits.H\n@@ -39,16 +39,6 @@ namespace amrex\n template <bool B, class T = void>\n using EnableIf_t = typename std::enable_if<B,T>::type;\n \n-\n- template <class T, class Enable = void>\n- struct IsStoreAtomic : std::false_type {};\n- //\n- template <class T>\n- struct IsStoreAtomic<T, typename std::enable_if <\n- std::is_arithmetic<T>::value\n- && sizeof(T) <= 8 >::type >\n- : std::true_type {};\n-\n template <class T, class Enable = void>\n struct HasAtomicAdd : std::false_type {};\n template <> struct HasAtomicAdd<int> : std::true_type {};\n@@ -124,6 +114,122 @@ namespace amrex\n {\n static constexpr bool value = std::is_same<T,U1>::value && Same<T,Us...>::value;\n };\n+\n+ ////////////////////////////////////////////////////////////////////////////////\n+ // [traits.IsDetected]\n+ //\n+ // We use IsDetected as a SFINAE tool to test for valid expressions.\n+ //\n+ // is_detected was proposed to C++ but is surpassed by concepts.\n+ //\n+ // The implementation is taken from \n+ //\n+ // https://en.cppreference.com/w/cpp/experimental/is_detected\n+ \n+ namespace detail {\n+ template <class...> using Void_t = void;\n+\n+ struct Nonesuch {\n+ Nonesuch() = delete;\n+ ~Nonesuch() = delete;\n+ Nonesuch(Nonesuch const&) = delete;\n+ void operator=(Nonesuch const&) = delete;\n+ };\n+\n+ template <class Default, class AlwaysVoid, template <class...> class Op,\n+ class... Args>\n+ struct Detector {\n+ using value_t = std::false_type;\n+ using type = Default;\n+ };\n+\n+ template <class Default, template <class...> class Op, class... Args>\n+ struct Detector<Default, Void_t<Op<Args...>>, Op, Args...> {\n+ using value_t = std::true_type;\n+ using type = Op<Args...>;\n+ };\n+ }\n+\n+ template <template <class...> class Op, class... Args>\n+ using IsDetected = typename detail::Detector<detail::Nonesuch, void, Op, Args...>::value_t;\n+\n+ template <template <class...> class Op, class... Args>\n+ using Detected_t = typename detail::Detector<detail::Nonesuch, void, Op, Args...>::type;\n+\n+ template <class Default, template <class...> class Op, class... Args>\n+ using DetectedOr = typename detail::Detector<Default, void, Op, Args...>::type;\n+\n+ template <class Expected, template <typename...> class Op, class... Args>\n+ using IsDetectedExact = std::is_same<Expected, Detected_t<Op, Args...>>;\n+\n+ ////////////////////////////////////////////////////////////////////////////////\n+ // [traits.IsCallable]\n+\n+ namespace detail {\n+ template <typename T, typename... Args>\n+ using call_result_t = decltype(std::declval<T>()(std::declval<Args>()...));\n+ }\n+\n+ //! \\brief Test if a given type T is callable with arguments of type Args...\n+ //!\n+ //! This type trait is different from std::is_invocable since it only cares for the call syntax\n+ //! f(args...) and disregards pointers to class methods and such.\n+ //!\n+ //! For consistency we use IsCallable over is_invocable since AMReX relies on call syntax\n+ //! everywhere else. Using an equivalent function to std::invoke would increase call stacks in\n+ //! debug mode, add more template instantiations and will obfuscate lots of generic code that\n+ //! takes functions.\n+ template <typename T, typename... Args>\n+ struct IsCallable : IsDetected<detail::call_result_t, T, Args...> {};\n+\n+ //! \\brief Test if a given type T is callable with arguments of type Args...\n+ //!\n+ //! \\see IsCallable\n+ template <typename R, typename T, typename... Args>\n+ struct IsCallableR : IsDetectedExact<R, detail::call_result_t, T, Args...> {};\n+\n+ ////////////////////////////////////////////////////////////////////////////////\n+ // [traits.Conjunction]\n+ // [traits.Disjunction]\n+ // [traits.Negation]\n+\n+\n+ //! Logical traits let us combine multiple type requirements in one EnableIf_t clause. \n+ #if defined(__cpp_lib_logical_traits)\n+ template <typename... Args> using Conjunction = std::conjunction<Args...>;\n+ template <typename... Args> using Disjunction = std::disjunction<Args...>;\n+ template <typename... Args> using Negation = std::negation<Args...>;\n+ #elif defined(__cpp_lib_experimental_logical_traits)\n+ template <typename... Args> using Conjunction = std::experimental::conjunction<Args...>;\n+ template <typename... Args> using Disjunction = std::experimental::disjunction<Args...>;\n+ template <typename... Args> using Negation = std::experimental::negation<Args...>;\n+ #else\n+ template <class...> struct Conjunction : std::true_type {};\n+ template <class B1> struct Conjunction<B1> : B1 {};\n+ template <class B1, class... Bn>\n+ struct Conjunction<B1, Bn...>\n+ : std::conditional_t<bool(B1::value), Conjunction<Bn...>, B1> {};\n+\n+ template <class...> struct Disjunction : std::false_type {};\n+ template <class B1> struct Disjunction<B1> : B1 {};\n+ template <class B1, class... Bn>\n+ struct Disjunction<B1, Bn...>\n+ : std::conditional_t<bool(B1::value), B1, Disjunction<Bn...>> {};\n+\n+ template <class Bool>\n+ using Negation = std::integral_constant<bool, !bool(Bool::value)>;\n+ #endif\n+\n+ // Move this down, because doxygen can not parse anything below IsStoreAtomic\n+ template <class T, class Enable = void>\n+ struct IsStoreAtomic : std::false_type {};\n+ //\n+ template <class T>\n+ struct IsStoreAtomic<T, typename std::enable_if <\n+ std::is_arithmetic<T>::value\n+ && sizeof(T) <= 8 >::type >\n+ : std::true_type {};\n+\n }\n \n #endif\ndiff --git a/Src/Base/CMakeLists.txt b/Src/Base/CMakeLists.txt\nindex 70851dbc274..136902d0ec6 100644\n--- a/Src/Base/CMakeLists.txt\n+++ b/Src/Base/CMakeLists.txt\n@@ -170,6 +170,7 @@ target_sources( amrex\n AMReX_FilND_C.cpp\n # Non-Local BC\n AMReX_NonLocalBC.H\n+ AMReX_NonLocalBC.cpp\n AMReX_NonLocalBCImpl.H\n # Plotfile ----------------------------------------------------------------\n AMReX_PlotFileUtil.cpp\ndiff --git a/Src/Base/Make.package b/Src/Base/Make.package\nindex 5640cbc7a7f..ad73072213a 100644\n--- a/Src/Base/Make.package\n+++ b/Src/Base/Make.package\n@@ -180,6 +180,7 @@ C$(AMREX_BASE)_headers += AMReX_FilND_C.H\n # Non-Local BC\n #\n C$(AMREX_BASE)_headers += AMReX_NonLocalBC.H AMReX_NonLocalBCImpl.H\n+C$(AMREX_BASE)_sources += AMReX_NonLocalBC.cpp\n \n #\n # Plotfile\n"}, "test": {"test_patch": "diff --git a/Tests/CMakeLists.txt b/Tests/CMakeLists.txt\nindex 2c515d96e6e..fee31c13603 100644\n--- a/Tests/CMakeLists.txt\n+++ b/Tests/CMakeLists.txt\n@@ -1,7 +1,7 @@\n #\n # List of subdirectories to search for CMakeLists.\n #\n-set( AMREX_TESTS_SUBDIRS AsyncOut )\n+set( AMREX_TESTS_SUBDIRS AsyncOut MultiBlock )\n \n if (AMReX_PARTICLES)\n list(APPEND AMREX_TESTS_SUBDIRS Particles)\ndiff --git a/Tests/MultiBlock/Advection/CMakeLists.txt b/Tests/MultiBlock/Advection/CMakeLists.txt\nnew file mode 100644\nindex 00000000000..ac043eefd8d\n--- /dev/null\n+++ b/Tests/MultiBlock/Advection/CMakeLists.txt\n@@ -0,0 +1,7 @@\n+set(_sources main.cpp)\n+set(_input_files )\n+\n+setup_test(_sources _input_files)\n+\n+unset(_sources)\n+unset(_input_files)\ndiff --git a/Tests/MultiBlock/Advection/GNUmakefile b/Tests/MultiBlock/Advection/GNUmakefile\nnew file mode 100644\nindex 00000000000..5417f2b6cd7\n--- /dev/null\n+++ b/Tests/MultiBlock/Advection/GNUmakefile\n@@ -0,0 +1,22 @@\n+AMREX_HOME = ../../../\n+\n+DEBUG\t= FALSE\n+#DEBUG\t= TRUE\n+\n+DIM\t= 3\n+\n+COMP = gcc\n+\n+USE_MPI = TRUE\n+USE_OMP = FALSE\n+USE_CUDA = FALSE\n+USE_HIP = FALSE\n+\n+include $(AMREX_HOME)/Tools/GNUMake/Make.defs\n+\n+include ./Make.package\n+include $(AMREX_HOME)/Src/Base/Make.package\n+include $(AMREX_HOME)/Src/Boundary/Make.package\n+include $(AMREX_HOME)/Src/AmrCore/Make.package\n+\n+include $(AMREX_HOME)/Tools/GNUMake/Make.rules\ndiff --git a/Tests/MultiBlock/Advection/Make.package b/Tests/MultiBlock/Advection/Make.package\nnew file mode 100644\nindex 00000000000..6b4b865e8fc\n--- /dev/null\n+++ b/Tests/MultiBlock/Advection/Make.package\n@@ -0,0 +1,1 @@\n+CEXE_sources += main.cpp\ndiff --git a/Tests/MultiBlock/Advection/main.cpp b/Tests/MultiBlock/Advection/main.cpp\nnew file mode 100644\nindex 00000000000..13a31428fcf\n--- /dev/null\n+++ b/Tests/MultiBlock/Advection/main.cpp\n@@ -0,0 +1,297 @@\n+\n+#include \"AMReX_NonLocalBC.H\"\n+\n+#include \"AMReX.H\"\n+#include \"AMReX_AmrCore.H\"\n+#include \"AMReX_MultiFab.H\"\n+\n+#include \"AMReX_PlotFileUtil.H\"\n+\n+void MyMain();\n+\n+int main(int argc, char** argv) {\n+#ifdef AMREX_USE_MPI\n+ MPI_Init(&argc, &argv);\n+#endif\n+ // Let me throw exceptions for triggering my debugger\n+ amrex::Initialize(MPI_COMM_WORLD, std::cout, std::cerr, [](const char* msg) { throw std::runtime_error(msg); });\n+ MyMain();\n+ amrex::Finalize();\n+#ifdef AMREX_USE_MPI\n+ MPI_Finalize();\n+#endif\n+}\n+\n+using namespace amrex;\n+\n+enum idirs { ix, iy };\n+enum num_components { three_components = 3 };\n+\n+static constexpr IntVect e_x = IntVect::TheDimensionVector(ix);\n+static constexpr IntVect e_y = IntVect::TheDimensionVector(iy);\n+class AdvectionAmrCore : public AmrCore {\n+ \n+ public:\n+ AdvectionAmrCore(Direction vel, Geometry const& level_0_geom,\n+ AmrInfo const& amr_info = AmrInfo())\n+ : AmrCore(level_0_geom, amr_info), velocity{vel} {\n+ AmrCore::InitFromScratch(0.0);\n+ InitData(); // CUDA does not allow extended lambdas in ctors.\n+ }\n+\n+ void InitData() {\n+ const auto problo = Geom(0).ProbLoArray();\n+ const auto dx = Geom(0).CellSizeArray();\n+#ifdef AMREX_USE_OMP\n+#pragma omp parallel if (Gpu::notInLaunchRegion())\n+#endif\n+ for (MFIter mfi(mass,TilingIfNotGPU()); mfi.isValid(); ++mfi) {\n+ Array4<Real> m = mass.array(mfi);\n+ Array4<Real> vx = mass.array(mfi, 1);\n+ Array4<Real> vy = mass.array(mfi, 2);\n+ amrex::ParallelFor(mfi.tilebox(), [=] AMREX_GPU_DEVICE (int i, int j, int k) {\n+ Real x[] = {AMREX_D_DECL(problo[0] + (0.5+i)*dx[0],\n+ problo[1] + (0.5+j)*dx[1],\n+ problo[2] + (0.5+k)*dx[2])};\n+ const double r2 = AMREX_D_TERM(x[0] * x[0], + x[1] * x[1], + x[2] * x[2]);\n+ constexpr double R = 0.1 * 0.1;\n+ m(i, j, k) = r2 < R ? 1.0 : 0.0;\n+ vx(i, j, k) = r2 < R ? 1.0 : 0.0;\n+ vy(i, j, k) = 0.0;\n+ });\n+ }\n+ }\n+\n+ void AdvanceInTime(double dt) {\n+ // Do first order accurate godunov splitting\n+ for (int d = 0; d < AMREX_SPACEDIM; ++d) {\n+ DoOperatorSplitStep(dt, static_cast<Direction>(d));\n+ }\n+ }\n+\n+ void DoOperatorSplitStep(double dt, Direction dir) {\n+ // Perform first order accurate upwinding with velocity 1 in the stored direction.\n+ const double dx = Geom(0).CellSize(0);\n+ const double a_dt_over_dx = dt / dx * (velocity == dir);\n+ if (dir == Direction::x) {\n+#ifdef AMREX_USE_OMP\n+#pragma omp parallel if (Gpu::notInLaunchRegion())\n+#endif\n+ for (MFIter mfi(mass); mfi.isValid(); ++mfi) {\n+ Array4<Real> m = mass.array(mfi);\n+ Array4<Real> next = mass_next.array(mfi);\n+ ParallelFor(mfi.growntilebox(e_y), int(three_components),\n+ [=] AMREX_GPU_DEVICE (int i, int j, int k, int n) {\n+ next(i, j, k, n) = m(i, j, k, n) - a_dt_over_dx * (m(i, j, k, n) - m(i - 1, j, k, n));\n+ });\n+ }\n+ } else if (dir == Direction::y) {\n+#ifdef AMREX_USE_OMP\n+#pragma omp parallel if (Gpu::notInLaunchRegion())\n+#endif\n+ for (MFIter mfi(mass); mfi.isValid(); ++mfi) {\n+ Array4<Real> m = mass.array(mfi);\n+ Array4<Real> next = mass_next.array(mfi);\n+ ParallelFor(mfi.growntilebox(ix), int(three_components),\n+ [=] AMREX_GPU_DEVICE (int i, int j, int k, int n) {\n+ next(i, j, k, n) = m(i, j, k, n) - a_dt_over_dx * (m(i, j, k, n) - m(i, j - 1, k, n));\n+ });\n+ }\n+ }\n+ std::swap(mass, mass_next);\n+ }\n+\n+ MultiFab mass{};\n+ MultiFab mass_next{};\n+ Direction velocity{};\n+\n+ private:\n+ void ErrorEst(int /*level*/, ::amrex::TagBoxArray& /*tags*/, double /*time_point*/,\n+ int /* ngrow */) override {\n+ throw std::runtime_error(\"For simplicity, this example supports only one level.\");\n+ }\n+\n+ void\n+ MakeNewLevelFromScratch(int level, double, const ::amrex::BoxArray& box_array,\n+ const ::amrex::DistributionMapping& distribution_mapping) override {\n+ if (level > 0) {\n+ throw std::runtime_error(\"For simplicity, this example supports only one level.\");\n+ }\n+ const IntVect ngrow{AMREX_D_DECL(1, 1, 0)};\n+ mass.define(box_array, distribution_mapping, three_components, ngrow);\n+ mass_next.define(box_array, distribution_mapping, three_components, ngrow);\n+ }\n+\n+ void MakeNewLevelFromCoarse(int /*level*/, double /*time_point*/, const ::amrex::BoxArray&,\n+ const ::amrex::DistributionMapping&) override {\n+ throw std::runtime_error(\"For simplicity, this example supports only one level.\");\n+ }\n+\n+ void RemakeLevel(int /*level*/, double /*time_point*/, const ::amrex::BoxArray&,\n+ const ::amrex::DistributionMapping&) override {\n+ throw std::runtime_error(\"For simplicity, this example supports only one level.\");\n+ }\n+\n+ void ClearLevel(int level) override {\n+ if (level > 0) {\n+ throw std::runtime_error(\"For simplicity, this example supports only one level.\");\n+ }\n+ mass.clear();\n+ }\n+};\n+\n+using namespace NonLocalBC;\n+struct OnesidedMultiBlockBoundaryFn {\n+ AdvectionAmrCore* dest;\n+ const AdvectionAmrCore* src;\n+ MultiBlockIndexMapping dtos;\n+ Box boundary_to_fill;\n+ std::unique_ptr<MultiBlockCommMetaData> cmd{};\n+ FabArrayBase::BDKey cached_dest_bd_key{};\n+ FabArrayBase::BDKey cached_src_bd_key{};\n+ ApplyDtosAndProjectionOnReciever<MultiBlockIndexMapping,\n+ MapComponents<Identity, SwapComponents<1, 2>>>\n+ packing{PackComponents{0, 0, three_components}, dtos};\n+\n+ AMREX_NODISCARD CommHandler FillBoundary_nowait() {\n+ if (!cmd || cached_dest_bd_key != dest->mass.getBDKey() || cached_src_bd_key != src->mass.getBDKey()) {\n+ cmd = std::make_unique<MultiBlockCommMetaData>(dest->mass, boundary_to_fill, src->mass, dest->mass.nGrowVect(), dtos);\n+ cached_dest_bd_key = dest->mass.getBDKey();\n+ cached_src_bd_key = src->mass.getBDKey();\n+ }\n+ \n+ return ParallelCopy_nowait(no_local_copy, dest->mass, src->mass, *cmd, packing);\n+ }\n+\n+ void FillBoundary_do_local_copy() const {\n+ AMREX_ASSERT(cmd && cached_dest_bd_key == dest->mass.getBDKey() && cached_src_bd_key == src->mass.getBDKey());\n+ if (cmd->m_LocTags && cmd->m_LocTags->size() > 0) {\n+ LocalCopy(packing, dest->mass, src->mass, *cmd->m_LocTags);\n+ }\n+ }\n+\n+ void FillBoundary_finish(CommHandler handler) const {\n+ ParallelCopy_finish(dest->mass, std::move(handler), *cmd, packing);\n+ }\n+};\n+\n+struct FillBoundaryFn {\n+ std::vector<OnesidedMultiBlockBoundaryFn> boundaries;\n+\n+ void operator()(AdvectionAmrCore& core_x, AdvectionAmrCore& core_y) {\n+ enum { coarsest_level = 0 };\n+ core_x.mass.FillBoundary(core_x.Geom(coarsest_level).periodicity());\n+ core_y.mass.FillBoundary(core_y.Geom(coarsest_level).periodicity());\n+ std::vector<CommHandler> comms;\n+ for (auto& boundary : boundaries) {\n+ comms.push_back(boundary.FillBoundary_nowait());\n+ }\n+ for (auto& boundary : boundaries) {\n+ boundary.FillBoundary_do_local_copy();\n+ }\n+ const std::size_t n_boundaries = boundaries.size();\n+ for (std::size_t i = 0; i < n_boundaries; ++i) {\n+ boundaries[i].FillBoundary_finish(std::move(comms[i]));\n+ }\n+ AMREX_ASSERT(!core_x.mass.contains_nan());\n+ }\n+};\n+\n+void WritePlotfiles(const AdvectionAmrCore& core_x, const AdvectionAmrCore& core_y, double time_point, int step)\n+{\n+ static const Vector<std::string> varnames{\"Mass\", \"Vector_X\", \"Vector_Y\"};\n+ int nlevels = 1;\n+ std::array<char, 256> x_pbuffer{};\n+ std::array<char, 256> y_pbuffer{};\n+ snprintf(x_pbuffer.data(), x_pbuffer.size(), \"MultiBlock/core_x/plt%04d\", step);\n+ snprintf(y_pbuffer.data(), y_pbuffer.size(), \"MultiBlock/core_y/plt%04d\", step);\n+\n+ {\n+ Vector<const MultiFab*> mf{&core_x.mass};\n+ Vector<Geometry> geoms{core_x.Geom(0)};\n+ Vector<int> level_steps{step};\n+ Vector<IntVect> ref_ratio{};\n+ std::string plotfilename{x_pbuffer.data()};\n+ WriteMultiLevelPlotfile(plotfilename, nlevels, mf, varnames, geoms, time_point, level_steps, ref_ratio);\n+ }\n+ {\n+ Vector<const MultiFab*> mf{&core_y.mass};\n+ Vector<Geometry> geoms{core_y.Geom(0)};\n+ Vector<int> level_steps{step};\n+ Vector<IntVect> ref_ratio{};\n+ std::string plotfilename{y_pbuffer.data()};\n+ WriteMultiLevelPlotfile(plotfilename, nlevels, mf, varnames, geoms, time_point, level_steps, ref_ratio);\n+ }\n+}\n+\n+void MyMain() {\n+ Box domain(IntVect{}, IntVect{AMREX_D_DECL(63, 63, 0)});\n+ RealBox real_box1{{AMREX_D_DECL(-0.5, -0.3, 0.0)}, {AMREX_D_DECL(0.5, 0.7, 1.0)}};\n+ RealBox real_box2{{AMREX_D_DECL(+0.55, -0.3, 0.0)}, {AMREX_D_DECL(1.55, 0.7, 1.0)}};\n+\n+ Array<int, AMREX_SPACEDIM> is_periodic1{0, 1};\n+ Geometry geom1{domain, real_box1, CoordSys::cartesian, is_periodic1};\n+\n+ Array<int, AMREX_SPACEDIM> is_periodic2{1, 0};\n+ Geometry geom2{domain, real_box2, CoordSys::cartesian, is_periodic2};\n+\n+ AmrInfo amr_info{};\n+#if AMREX_SPACEDIM > 2\n+ amr_info.blocking_factor[0][2] = 1;\n+#endif\n+\n+ AdvectionAmrCore core_x(Direction::x, geom1, amr_info);\n+ AdvectionAmrCore core_y(Direction::y, geom2, amr_info);\n+\n+ std::vector<OnesidedMultiBlockBoundaryFn> multi_block_boundaries{};\n+ { // Fill right boundary of core_x with lower mirror data of core_y\n+ NonLocalBC::MultiBlockIndexMapping dtos{};\n+ dtos.permutation = IntVect{AMREX_D_DECL(1, 0, 2)};\n+ dtos.offset = (domain.bigEnd(iy) + 1) * e_y + domain.bigEnd(ix) * e_x;\n+ dtos.sign = IntVect{AMREX_D_DECL(-1, 1, 1)};\n+ Box right_boundary_to_fill_in_x = grow(shift(Box{domain.bigEnd(ix) * e_x, domain.bigEnd()}, e_x), e_y);\n+ multi_block_boundaries.push_back({&core_x, &core_y, dtos, right_boundary_to_fill_in_x});\n+ } { // Fill lower boundary of core_y with right mirror data of core_x\n+ NonLocalBC::MultiBlockIndexMapping dtos{};\n+ dtos.permutation = IntVect{AMREX_D_DECL(1, 0, 2)};\n+ dtos.offset = domain.bigEnd(iy) * e_y - (domain.bigEnd(ix) + 1) * e_x;\n+ dtos.sign = IntVect{AMREX_D_DECL(1, -1, 1)};\n+ Box lower_boundary_to_fill_in_y = grow(shift(Box{domain.smallEnd(), domain.bigEnd() - domain.bigEnd(iy) * e_y}, -e_y), e_x);\n+ multi_block_boundaries.push_back({&core_y, &core_x, dtos, lower_boundary_to_fill_in_y});\n+ } { // Fill left boundary of core_x with upper mirror data of core_y\n+ NonLocalBC::MultiBlockIndexMapping dtos{};\n+ dtos.permutation = IntVect{AMREX_D_DECL(1, 0, 2)};\n+ dtos.offset = -(domain.bigEnd(iy) + 1) * e_y;\n+ Box left_boundary_to_fill_in_x = grow(shift(Box{domain.smallEnd(), domain.bigEnd() - domain.bigEnd(ix) * e_x}, -e_x), e_y);\n+ multi_block_boundaries.push_back({&core_x, &core_y, dtos, left_boundary_to_fill_in_x});\n+ } { // Fill upper boundary of core_y with left mirror data of core_x\n+ NonLocalBC::MultiBlockIndexMapping dtos{};\n+ dtos.permutation = IntVect{AMREX_D_DECL(1, 0, 2)};\n+ dtos.offset = (domain.bigEnd(ix) + 1) * e_x;\n+ Box upper_boundary_to_fill_in_y = grow(shift(Box{domain.bigEnd(iy) * e_y, domain.bigEnd()}, e_y), e_x);\n+ multi_block_boundaries.push_back({&core_y, &core_x, dtos, upper_boundary_to_fill_in_y});\n+ }\n+\n+ FillBoundaryFn FillBoundary{std::move(multi_block_boundaries)};\n+\n+ int step = 1;\n+ const double min_dx1_dy2 = std::min(geom1.CellSize(0), geom2.CellSize(1));\n+ const double cfl = 1.0;\n+ const double dt = cfl * min_dx1_dy2;\n+ const double final_time = 4.0;\n+ double time_point = 0.0;\n+\n+ WritePlotfiles(core_x, core_y, time_point, step);\n+ while (time_point < final_time) {\n+ FillBoundary(core_x, core_y);\n+\n+ core_x.AdvanceInTime(dt);\n+ core_y.AdvanceInTime(dt);\n+\n+ amrex::Print() << \"Step #\" << step << \", Time Point = \" << time_point << '\\n';\n+\n+ time_point += dt;\n+ step += 1; \n+ WritePlotfiles(core_x, core_y, time_point, step);\n+ }\n+}\ndiff --git a/Tests/MultiBlock/IndexType/CMakeLists.txt b/Tests/MultiBlock/IndexType/CMakeLists.txt\nnew file mode 100644\nindex 00000000000..ac043eefd8d\n--- /dev/null\n+++ b/Tests/MultiBlock/IndexType/CMakeLists.txt\n@@ -0,0 +1,7 @@\n+set(_sources main.cpp)\n+set(_input_files )\n+\n+setup_test(_sources _input_files)\n+\n+unset(_sources)\n+unset(_input_files)\ndiff --git a/Tests/MultiBlock/IndexType/GNUmakefile b/Tests/MultiBlock/IndexType/GNUmakefile\nnew file mode 100644\nindex 00000000000..a2198614ac9\n--- /dev/null\n+++ b/Tests/MultiBlock/IndexType/GNUmakefile\n@@ -0,0 +1,20 @@\n+AMREX_HOME = ../../../\n+\n+DEBUG\t= FALSE\n+#DEBUG\t= TRUE\n+\n+DIM\t= 3\n+\n+COMP = gcc\n+\n+USE_MPI = TRUE\n+USE_OMP = FALSE\n+USE_CUDA = FALSE\n+USE_HIP = FALSE\n+\n+include $(AMREX_HOME)/Tools/GNUMake/Make.defs\n+\n+include ./Make.package\n+include $(AMREX_HOME)/Src/Base/Make.package\n+\n+include $(AMREX_HOME)/Tools/GNUMake/Make.rules\ndiff --git a/Tests/MultiBlock/IndexType/Make.package b/Tests/MultiBlock/IndexType/Make.package\nnew file mode 100644\nindex 00000000000..6b4b865e8fc\n--- /dev/null\n+++ b/Tests/MultiBlock/IndexType/Make.package\n@@ -0,0 +1,1 @@\n+CEXE_sources += main.cpp\ndiff --git a/Tests/MultiBlock/IndexType/main.cpp b/Tests/MultiBlock/IndexType/main.cpp\nnew file mode 100644\nindex 00000000000..3cfe48a4e41\n--- /dev/null\n+++ b/Tests/MultiBlock/IndexType/main.cpp\n@@ -0,0 +1,157 @@\n+#include \"AMReX_NonLocalBC.H\"\n+\n+#include \"AMReX.H\"\n+#include \"AMReX_iMultiFab.H\"\n+\n+int MyMain();\n+\n+int main(int argc, char** argv) {\n+#ifdef AMREX_USE_MPI\n+ MPI_Init(&argc, &argv);\n+#endif\n+ // Let me throw exceptions for triggering my debugger\n+ amrex::Initialize(MPI_COMM_WORLD, std::cout, std::cerr, [](const char* msg) { throw std::runtime_error(msg); });\n+ int ret = MyMain();\n+ amrex::Finalize();\n+#ifdef AMREX_USE_MPI\n+ MPI_Finalize();\n+#endif\n+ return ret;\n+}\n+\n+amrex::iMultiFab InitializeMultiFab(const amrex::Box& domain)\n+{\n+ amrex::BoxArray ba(domain);\n+ // do some work across MPI ranks.\n+ ba.maxSize(8);\n+ amrex::DistributionMapping dm(ba);\n+ amrex::iMultiFab mf(ba, dm, 1, 0);\n+ const int nx = domain.length(0);\n+ const int ny = domain.length(1);\n+ for (amrex::MFIter mfi(mf); mfi.isValid(); ++mfi) {\n+ auto array = mf.array(mfi);\n+ ParallelFor(mfi.tilebox(), [=](int i, int j, int k) \n+ {\n+ array(i,j,k) = i + j*nx + k*nx*ny;\n+ });\n+ }\n+ return mf;\n+}\n+\n+bool ParallelCopyWithItselfIsCorrect(amrex::iMultiFab& mf, const amrex::Box& domain) {\n+ const amrex::IntVect e_x = amrex::IntVect::TheDimensionVector(0);\n+ const amrex::Box source_box{domain.smallEnd(), domain.bigEnd() - domain.bigEnd(0) * e_x, domain.ixType()};\n+ const amrex::Box dest_box{domain.smallEnd() + domain.bigEnd(0) * e_x, domain.bigEnd(), domain.ixType()};\n+ amrex::NonLocalBC::MultiBlockIndexMapping dtos;\n+ dtos.offset = dest_box.smallEnd() - source_box.smallEnd();\n+ amrex::NonLocalBC::ParallelCopy(mf, dest_box, mf, 0, 0, 1, amrex::IntVect{0}, dtos);\n+ const int nx = domain.length(0);\n+ const int ny = domain.length(1);\n+ int fails = 0;\n+ for (amrex::MFIter mfi(mf); mfi.isValid(); ++mfi) {\n+ const amrex::Box section = dest_box & mfi.tilebox();\n+ if (section.isEmpty()) continue; \n+ auto array = mf.const_array(mfi);\n+ amrex::LoopOnCpu(section, [&](int i, int j, int k)\n+ {\n+ amrex::Dim3 si = dtos(amrex::Dim3{i,j,k});\n+ int value = si.x + si.y*nx + si.z*nx*ny;\n+ AMREX_ASSERT(array(i,j,k) == value);\n+ });\n+ }\n+ return fails == 0;\n+}\n+\n+int GetFaceDir(amrex::IndexType iv)\n+{\n+ static_assert(sizeof(amrex::IndexType) == sizeof(unsigned int), \"IndexType is not punnable to unsigned int\");\n+ unsigned int value{0};\n+ std::memcpy(&value, &iv, sizeof(unsigned int));\n+ return ((value & 0b001) + (value & 0b010) + (value & 0b100)) >> 1;\n+}\n+\n+amrex::Box GetFaceBoundary(const amrex::Box& domain, amrex::Orientation::Side side)\n+{\n+ int dir = GetFaceDir(domain.ixType());\n+ const amrex::IntVect face_normal = amrex::IntVect::TheDimensionVector(dir);\n+ amrex::Box box{};\n+ AMREX_ASSERT(side == amrex::Orientation::Side::low || side == amrex::Orientation::Side::high);\n+ if (side == amrex::Orientation::Side::low) {\n+ box = amrex::Box{domain.smallEnd(), domain.bigEnd() - domain.bigEnd(dir) * face_normal, domain.ixType()};\n+ } else {\n+ box = amrex::Box{domain.smallEnd() + domain.bigEnd(dir) * face_normal, domain.bigEnd(), domain.ixType()};\n+ }\n+ return box;\n+}\n+\n+bool ParallelCopyFaceToFace(amrex::iMultiFab& dest, const amrex::Box& domain_dest, amrex::Orientation::Side dest_side,\n+ const amrex::iMultiFab& src, const amrex::Box& domain_src, amrex::Orientation::Side src_side)\n+{\n+ int sdir = GetFaceDir(domain_src.ixType());\n+ int ddir = GetFaceDir(domain_dest.ixType());\n+ const amrex::Box src_box = GetFaceBoundary(domain_src, src_side);\n+ const amrex::Box dest_box = GetFaceBoundary(domain_dest, dest_side);\n+ \n+ // Default construction is identity\n+ amrex::NonLocalBC::MultiBlockIndexMapping dtos{};\n+ // Change permutation to get a correct mapping between index types\n+ std::swap(dtos.permutation[sdir], dtos.permutation[ddir]);\n+ // Map smallest destination box index as an index in the source space\n+ const amrex::IntVect dest_smallEnd_in_src = amrex::NonLocalBC::Apply(dtos, dest_box.smallEnd());\n+ // Compute the offset to get the proper shift in the source space\n+ dtos.offset = dest_smallEnd_in_src - src_box.smallEnd();\n+ // Sanity-Check that the correct box is being mapped\n+ // Note, this checks index types, too!\n+ AMREX_ASSERT(amrex::NonLocalBC::Image(dtos, dest_box) == src_box);\n+\n+ amrex::NonLocalBC::ParallelCopy(dest, dest_box, src, 0, 0, 1, amrex::IntVect{0}, dtos);\n+ int fails = 0;\n+ const int nx = domain_src.length(0);\n+ const int ny = domain_src.length(1);\n+ for (amrex::MFIter mfi(dest); mfi.isValid(); ++mfi) {\n+ const amrex::Box section = dest_box & mfi.tilebox();\n+ if (section.isEmpty()) continue; \n+ auto darray = dest.const_array(mfi);\n+ auto sarray = src.const_array(mfi);\n+ amrex::LoopOnCpu(section, [&](int i, int j, int k)\n+ {\n+ amrex::Dim3 si = dtos(amrex::Dim3{i,j,k});\n+ AMREX_ASSERT(darray(i,j,k) == si.x + si.y*nx + si.z*nx*ny);\n+ });\n+ }\n+ return fails == 0;\n+}\n+\n+int MyMain()\n+{\n+ using namespace amrex;\n+ Box domain{IntVect{}, IntVect{AMREX_D_DECL(31, 31, 31)}};\n+ // Loop over all index types\n+ for (int i = 0; i < AMREX_D_TERM(2,*2,*2); ++i) {\n+ const auto ix = static_cast<IndexType::CellIndex>(static_cast<bool>(i & 0b001));\n+ const auto iy = static_cast<IndexType::CellIndex>(static_cast<bool>(i & 0b010));\n+ const auto iz = static_cast<IndexType::CellIndex>(static_cast<bool>(i & 0b100));\n+ IndexType itype{AMREX_D_DECL(ix, iy, iz)};\n+ Box converted_domain = convert(domain, itype);\n+ iMultiFab mf = InitializeMultiFab(converted_domain);\n+ ParallelCopyWithItselfIsCorrect(mf, converted_domain);\n+ }\n+ // Loop over all combinations of face orientations\n+ const IntVect AMREX_D_DECL(e_x = IntVect::TheDimensionVector(0), e_y = IntVect::TheDimensionVector(1), e_z = IntVect::TheDimensionVector(2));\n+ IndexType dirs[AMREX_SPACEDIM] = {AMREX_D_DECL(IndexType(e_x), IndexType(e_y), IndexType(e_z))};\n+ Orientation::Side sides[2] = {Orientation::low, Orientation::high};\n+ for (int ii = 0; ii < 2*AMREX_SPACEDIM; ++ii) {\n+ int i = ii / 2;\n+ Orientation::Side iside = sides[ii % 2];\n+ for (int jj = 0; jj < 2*AMREX_SPACEDIM; ++jj) {\n+ int j = jj / 2;\n+ Orientation::Side jside = sides[j % 2];\n+ Box converted_domain_x = convert(domain, dirs[i]);\n+ iMultiFab dest = InitializeMultiFab(converted_domain_x);\n+ Box converted_domain_y = convert(domain, dirs[j]);\n+ const iMultiFab src = InitializeMultiFab(converted_domain_y);\n+ ParallelCopyFaceToFace(dest, converted_domain_x, iside, src, converted_domain_y, jside);\n+ }\n+ }\n+ return 0;\n+}\n\\ No newline at end of file\n", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}45{"question_id": "MSB_AMReX-Codes_amrex_pr2084", "question_type": "multi_swe_bench", "description": "Fix some macro issues in CMake Fortran build (AMReX-Codes/amrex#2084)", "content": {"org": "AMReX-Codes", "repo": "amrex", "pr_number": 2084, "issue_title": "Fix some macro issues in CMake Fortran build", "issue_body": "Include AMReX_Config.H in Fortran files that need preprocessing. Do not\r\npass those definitions already defined in AMReX_Config.H to the Fortran\r\ncompiler in the cmake build. This fixes the warnings about redefined macros.\r\n\r\nFix #2071\r\n\r\n## Checklist\r\n\r\nThe proposed changes:\r\n- [x] fix a bug or incorrect behavior in AMReX\r\n- [ ] add new capabilities to AMReX\r\n- [ ] changes answers in the test suite to more than roundoff level\r\n- [ ] are likely to significantly affect the results of downstream AMReX users\r\n- [ ] are described in the proposed changes to the AMReX documentation, if appropriate\r\n", "base_commit": "5fd8671f9a9e7b319b03faae03c1fdfa371626f5", "resolved_issues": [{"number": 2071, "title": "CMake: Fortran+MPI Warning", "body": "It looks like we are still adding `BL_USE_MPI` to the compiler defines in CMake, but I think we should just rely on the one set in `AMReX_Config.H`:\r\n \r\n```\r\n... Src/Boundary/AMReX_lo_bctypes_mod.F90 ...\r\nAMReX_Config.H:17:0:\r\n\r\n 17 | #define BL_USE_MPI\r\n | \r\nWarning: \"BL_USE_MPI\" redefined\r\n<command-line>:5:0:\r\n\r\nnote: this is the location of the previous definition\r\n```\r\n\r\ncc @kngott"}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/amrex-codes_m_amrex:pr-2084", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/Src/AmrCore/AMReX_INTERP_2D.F90 b/Src/AmrCore/AMReX_INTERP_2D.F90\nindex 8e93e495f70..042f47e96b9 100644\n--- a/Src/AmrCore/AMReX_INTERP_2D.F90\n+++ b/Src/AmrCore/AMReX_INTERP_2D.F90\n@@ -331,7 +331,7 @@ subroutine AMREX_PROTECT_INTERP (fine, fine_l1,fine_l2,fine_h1,fine_h2, fblo, fb\n integer icase\n \n if (MAX(lratiox,lratioy).gt.rMAX) then\n-#ifdef AMREX_DEBUG\n+#if 0\n print *,'rMAX in INTERP_2D::AMREX_PROTECT_INTERP must be >= ',MAX(lratiox,lratioy)\n #endif\n call bl_abort(\"rMAX in INTERP_2D\")\n@@ -551,7 +551,7 @@ subroutine AMREX_PROTECT_INTERP (fine, fine_l1,fine_l2,fine_h1,fine_h2, fblo, fb\n enddo\n enddo\n \n-#ifdef AMREX_DEBUG\n+#if 0\n if (abs(crseTotnew - crseTot)/cvol .gt. 1.e-8) then\n print *,' '\n print *,'BLEW CONSERVATION with ICASE = ',icase\ndiff --git a/Src/AmrCore/AMReX_INTERP_3D.F90 b/Src/AmrCore/AMReX_INTERP_3D.F90\nindex 4c2bd45aaee..1d65d565e51 100644\n--- a/Src/AmrCore/AMReX_INTERP_3D.F90\n+++ b/Src/AmrCore/AMReX_INTERP_3D.F90\n@@ -437,7 +437,7 @@ subroutine AMREX_PROTECT_INTERP (fine, fine_l1,fine_l2,fine_l3,fine_h1,fine_h2,f\n enddo\n enddo\n \n-#ifdef AMREX_DEBUG\n+#if 0\n if (abs(sum_fine_new - sum_fine_old) .gt. 1.e-8) then\n print *,' '\n print *, &\ndiff --git a/Src/Base/AMReX_FILCC_1D.F90 b/Src/Base/AMReX_FILCC_1D.F90\nindex 45b7f6c1da1..873f67f5941 100644\n--- a/Src/Base/AMReX_FILCC_1D.F90\n+++ b/Src/Base/AMReX_FILCC_1D.F90\n@@ -1,3 +1,4 @@\n+#include <AMReX_Config.H>\n \n ! -----------------------------------------------------------\n !> This routine is intended to be a generic fill function\ndiff --git a/Src/Base/AMReX_FILCC_2D.F90 b/Src/Base/AMReX_FILCC_2D.F90\nindex 0cf06563328..89ef77d8384 100644\n--- a/Src/Base/AMReX_FILCC_2D.F90\n+++ b/Src/Base/AMReX_FILCC_2D.F90\n@@ -1,3 +1,4 @@\n+#include <AMReX_Config.H>\n \n #ifndef AMREX_XSDK\n \ndiff --git a/Src/Base/AMReX_FILCC_3D.F90 b/Src/Base/AMReX_FILCC_3D.F90\nindex 4e7f3256451..8e94c80e6b9 100644\n--- a/Src/Base/AMReX_FILCC_3D.F90\n+++ b/Src/Base/AMReX_FILCC_3D.F90\n@@ -1,3 +1,4 @@\n+#include <AMReX_Config.H>\n \n #ifndef AMREX_XSDK\n \ndiff --git a/Src/Base/AMReX_acc_mod.F90 b/Src/Base/AMReX_acc_mod.F90\nindex fc4a66b3cb8..bec212ac5be 100644\n--- a/Src/Base/AMReX_acc_mod.F90\n+++ b/Src/Base/AMReX_acc_mod.F90\n@@ -1,3 +1,4 @@\n+#include <AMReX_Config.H>\n \n module amrex_acc_module\n \ndiff --git a/Src/Base/AMReX_filcc_mod.F90 b/Src/Base/AMReX_filcc_mod.F90\nindex f46bdb70b2f..f3d3d941d2a 100644\n--- a/Src/Base/AMReX_filcc_mod.F90\n+++ b/Src/Base/AMReX_filcc_mod.F90\n@@ -1,3 +1,4 @@\n+#include <AMReX_Config.H>\n \n module amrex_filcc_module\n \ndiff --git a/Src/Base/AMReX_fort_mod.F90 b/Src/Base/AMReX_fort_mod.F90\nindex 13228a36655..b175bbba0d9 100644\n--- a/Src/Base/AMReX_fort_mod.F90\n+++ b/Src/Base/AMReX_fort_mod.F90\n@@ -1,3 +1,5 @@\n+#include <AMReX_Config.H>\n+\n module amrex_fort_module\n \n use iso_c_binding, only : c_char, c_short, c_int, c_long, c_long_long, c_float, c_double, c_size_t, c_ptr\n@@ -7,7 +9,7 @@ module amrex_fort_module\n integer, parameter :: bl_spacedim = AMREX_SPACEDIM\n integer, parameter :: amrex_spacedim = AMREX_SPACEDIM\n \n-#ifdef BL_USE_FLOAT\n+#ifdef AMREX_USE_FLOAT\n integer, parameter :: amrex_real = c_float\n ! We could/should use Fortran 2008 c_sizeof here.\n integer (kind=c_size_t), parameter :: amrex_real_size = 4_c_size_t\ndiff --git a/Src/Base/AMReX_omp_mod.F90 b/Src/Base/AMReX_omp_mod.F90\nindex e6af10b5e0f..398308d9de5 100644\n--- a/Src/Base/AMReX_omp_mod.F90\n+++ b/Src/Base/AMReX_omp_mod.F90\n@@ -1,14 +1,12 @@\n-#ifdef BL_USE_OMP\n+#include <AMReX_Config.H>\n+\n+#ifdef AMREX_USE_OMP\n \n module amrex_omp_module\n \n implicit none\n \n-#ifdef AMREX_USE_OMP\n integer, parameter :: amrex_omp_support = (_OPENMP)\n-#else\n- integer, parameter :: amrex_omp_support = 0 ! Should this be allowed??\n-#endif\n \n integer, external :: omp_get_num_threads\n integer, external :: omp_get_max_threads\ndiff --git a/Src/Boundary/AMReX_LO_UTIL.F90 b/Src/Boundary/AMReX_LO_UTIL.F90\nindex 12fe914157f..082eb9d69a5 100644\n--- a/Src/Boundary/AMReX_LO_UTIL.F90\n+++ b/Src/Boundary/AMReX_LO_UTIL.F90\n@@ -37,7 +37,7 @@ subroutine polyInterpCoeff(xInt, x, N, c)\n num = num*(xInt - x(i))\n den = den*(x(j) - x(i))\n end do\n-#ifdef AMREX_DEBUG\n+#if 0\n if (den .eq. zero) STOP 'polyInterpCoeff::invalid data'\n #endif\n c(j) = num/den\ndiff --git a/Src/EB/AMReX_ebcellflag_mod.F90 b/Src/EB/AMReX_ebcellflag_mod.F90\nindex b5c18daba7a..99763fea144 100644\n--- a/Src/EB/AMReX_ebcellflag_mod.F90\n+++ b/Src/EB/AMReX_ebcellflag_mod.F90\n@@ -1,3 +1,4 @@\n+#include <AMReX_Config.H>\n \n module amrex_ebcellflag_module\n use amrex_fort_module, only : amrex_real\ndiff --git a/Src/F_Interfaces/AmrCore/AMReX_fillpatch_mod.F90 b/Src/F_Interfaces/AmrCore/AMReX_fillpatch_mod.F90\nindex 294f86e4fa6..f6410f9122a 100644\n--- a/Src/F_Interfaces/AmrCore/AMReX_fillpatch_mod.F90\n+++ b/Src/F_Interfaces/AmrCore/AMReX_fillpatch_mod.F90\n@@ -1,3 +1,4 @@\n+#include <AMReX_Config.H>\n \n module amrex_fillpatch_module\n \ndiff --git a/Src/F_Interfaces/Base/AMReX_fab_mod.F90 b/Src/F_Interfaces/Base/AMReX_fab_mod.F90\nindex 80a2fa70aee..d36e8f4ea87 100644\n--- a/Src/F_Interfaces/Base/AMReX_fab_mod.F90\n+++ b/Src/F_Interfaces/Base/AMReX_fab_mod.F90\n@@ -1,3 +1,4 @@\n+#include <AMReX_Config.H>\n \n module amrex_fab_module\n \ndiff --git a/Src/F_Interfaces/Base/AMReX_parallel_mod.F90 b/Src/F_Interfaces/Base/AMReX_parallel_mod.F90\nindex f40fcd418bd..00fcc275c89 100644\n--- a/Src/F_Interfaces/Base/AMReX_parallel_mod.F90\n+++ b/Src/F_Interfaces/Base/AMReX_parallel_mod.F90\n@@ -1,7 +1,9 @@\n+#include <AMReX_Config.H>\n+\n module amrex_parallel_module\n \n use iso_c_binding\n-#ifdef BL_USE_MPI\n+#ifdef AMREX_USE_MPI\n use amrex_fi_mpi\n use amrex_mpi_reduce_int_module, only : amrex_mpi_reduce_int, amrex_mpi_allreduce_int\n use amrex_mpi_reduce_real_module, only : amrex_mpi_reduce_real, amrex_mpi_allreduce_real\n@@ -24,7 +26,7 @@ module amrex_parallel_module\n public :: amrex_parallel_reduce_max\n public :: amrex_parallel_reduce_min\n \n-#ifdef BL_USE_MPI\n+#ifdef AMREX_USE_MPI\n integer, public :: amrex_mpi_real = MPI_DATATYPE_NULL\n integer :: m_nprocs = -1\n integer :: m_myproc = -1\n@@ -62,7 +64,7 @@ module amrex_parallel_module\n \n subroutine amrex_parallel_init (comm)\n integer, intent(in), optional :: comm\n-#ifdef BL_USE_MPI\n+#ifdef AMREX_USE_MPI\n integer :: ierr\n logical :: flag\n call MPI_Initialized(flag, ierr)\n@@ -99,7 +101,7 @@ subroutine amrex_parallel_init (comm)\n end subroutine amrex_parallel_init\n \n subroutine amrex_parallel_finalize ()\n-#ifdef BL_USE_MPI\n+#ifdef AMREX_USE_MPI\n integer :: ierr\n call MPI_Comm_Free(m_comm, ierr)\n m_comm = MPI_COMM_NULL\n@@ -131,7 +133,7 @@ end function amrex_parallel_nprocs\n subroutine amrex_parallel_reduce_sum_is (i, rank)\n integer, intent(inout) :: i\n integer, intent(in), optional :: rank\n-#ifdef BL_USE_MPI\n+#ifdef AMREX_USE_MPI\n integer :: tmp, ierr\n tmp = i\n if (present(rank)) then\n@@ -146,7 +148,7 @@ subroutine amrex_parallel_reduce_sum_iv (i, n, rank)\n integer, intent(inout) :: i(*)\n integer, intent(in) :: n\n integer, intent(in), optional :: rank\n-#ifdef BL_USE_MPI\n+#ifdef AMREX_USE_MPI\n integer :: tmp(n), ierr\n tmp = i(1:n)\n if (present(rank)) then\n@@ -160,7 +162,7 @@ end subroutine amrex_parallel_reduce_sum_iv\n subroutine amrex_parallel_reduce_sum_rs (r, rank)\n real(amrex_real), intent(inout) :: r\n integer, intent(in), optional :: rank\n-#ifdef BL_USE_MPI\n+#ifdef AMREX_USE_MPI\n real(amrex_real) :: tmp\n integer :: ierr\n tmp = r\n@@ -176,7 +178,7 @@ subroutine amrex_parallel_reduce_sum_rv (r, n, rank)\n real(amrex_real), intent(inout) :: r(*)\n integer, intent(in) :: n\n integer, intent(in), optional :: rank\n-#ifdef BL_USE_MPI\n+#ifdef AMREX_USE_MPI\n real(amrex_real) :: tmp(n)\n integer :: ierr\n tmp = r(1:n)\n@@ -191,7 +193,7 @@ end subroutine amrex_parallel_reduce_sum_rv\n subroutine amrex_parallel_reduce_max_is (i, rank)\n integer, intent(inout) :: i\n integer, intent(in), optional :: rank\n-#ifdef BL_USE_MPI\n+#ifdef AMREX_USE_MPI\n integer :: tmp, ierr\n tmp = i\n if (present(rank)) then\n@@ -206,7 +208,7 @@ subroutine amrex_parallel_reduce_max_iv (i, n, rank)\n integer, intent(inout) :: i(*)\n integer, intent(in) :: n\n integer, intent(in), optional :: rank\n-#ifdef BL_USE_MPI\n+#ifdef AMREX_USE_MPI\n integer :: tmp(n), ierr\n tmp = i(1:n)\n if (present(rank)) then\n@@ -220,7 +222,7 @@ end subroutine amrex_parallel_reduce_max_iv\n subroutine amrex_parallel_reduce_max_rs (r, rank)\n real(amrex_real), intent(inout) :: r\n integer, intent(in), optional :: rank\n-#ifdef BL_USE_MPI\n+#ifdef AMREX_USE_MPI\n real(amrex_real) :: tmp\n integer :: ierr\n tmp = r\n@@ -236,7 +238,7 @@ subroutine amrex_parallel_reduce_max_rv (r, n, rank)\n real(amrex_real), intent(inout) :: r(*)\n integer, intent(in) :: n\n integer, intent(in), optional :: rank\n-#ifdef BL_USE_MPI\n+#ifdef AMREX_USE_MPI\n real(amrex_real) :: tmp(n)\n integer :: ierr\n tmp = r(1:n)\n@@ -251,7 +253,7 @@ end subroutine amrex_parallel_reduce_max_rv\n subroutine amrex_parallel_reduce_min_is (i, rank)\n integer, intent(inout) :: i\n integer, intent(in), optional :: rank\n-#ifdef BL_USE_MPI\n+#ifdef AMREX_USE_MPI\n integer :: tmp, ierr\n tmp = i\n if (present(rank)) then\n@@ -266,7 +268,7 @@ subroutine amrex_parallel_reduce_min_iv (i, n, rank)\n integer, intent(inout) :: i(*)\n integer, intent(in) :: n\n integer, intent(in), optional :: rank\n-#ifdef BL_USE_MPI\n+#ifdef AMREX_USE_MPI\n integer :: tmp(n), ierr\n tmp = i(1:n)\n if (present(rank)) then\n@@ -280,7 +282,7 @@ end subroutine amrex_parallel_reduce_min_iv\n subroutine amrex_parallel_reduce_min_rs (r, rank)\n real(amrex_real), intent(inout) :: r\n integer, intent(in), optional :: rank\n-#ifdef BL_USE_MPI\n+#ifdef AMREX_USE_MPI\n real(amrex_real) :: tmp\n integer :: ierr\n tmp = r\n@@ -296,7 +298,7 @@ subroutine amrex_parallel_reduce_min_rv (r, n, rank)\n real(amrex_real), intent(inout) :: r(*)\n integer, intent(in) :: n\n integer, intent(in), optional :: rank\n-#ifdef BL_USE_MPI\n+#ifdef AMREX_USE_MPI\n real(amrex_real) :: tmp(n)\n integer :: ierr\n tmp = r(1:n)\ndiff --git a/Src/F_Interfaces/Particle/AMReX_particlecontainer_mod.F90 b/Src/F_Interfaces/Particle/AMReX_particlecontainer_mod.F90\nindex fba25144fe7..bdb4c9a2310 100644\n--- a/Src/F_Interfaces/Particle/AMReX_particlecontainer_mod.F90\n+++ b/Src/F_Interfaces/Particle/AMReX_particlecontainer_mod.F90\n@@ -16,8 +16,8 @@ module amrex_particlecontainer_module\n public :: amrex_get_particle_cpu, amrex_set_particle_cpu\n \n type, bind(C), public :: amrex_particle\n- real(amrex_particle_real) :: pos(AMREX_SPACEDIM) !< Position\n- real(amrex_particle_real) :: vel(AMREX_SPACEDIM) !< Particle velocity\n+ real(amrex_particle_real) :: pos(amrex_spacedim) !< Position\n+ real(amrex_particle_real) :: vel(amrex_spacedim) !< Particle velocity\n integer(c_int), private :: id\n integer(c_int), private :: cpu\n end type amrex_particle\ndiff --git a/Src/LinearSolvers/MLMG/AMReX_MLLinOp_nd.F90 b/Src/LinearSolvers/MLMG/AMReX_MLLinOp_nd.F90\nindex 8f01872a8a1..e97546117dd 100644\n--- a/Src/LinearSolvers/MLMG/AMReX_MLLinOp_nd.F90\n+++ b/Src/LinearSolvers/MLMG/AMReX_MLLinOp_nd.F90\n@@ -1,3 +1,4 @@\n+#include <AMReX_Config.H>\n \n module amrex_mllinop_nd_module\n \ndiff --git a/Tools/CMake/AMReXSetDefines.cmake b/Tools/CMake/AMReXSetDefines.cmake\nindex 8825b7aa25e..5cd193533b0 100644\n--- a/Tools/CMake/AMReXSetDefines.cmake\n+++ b/Tools/CMake/AMReXSetDefines.cmake\n@@ -70,23 +70,14 @@ add_amrex_define( AMREX_USE_ASSERTION NO_LEGACY IF AMReX_ASSERTIONS )\n # Bound checking\n add_amrex_define( AMREX_BOUND_CHECK NO_LEGACY IF AMReX_BOUND_CHECK )\n \n-#\n-# Fortran-specific defines: BL_LANG_FORT and AMREX_LANG_FORT\n-#\n if (AMReX_FORTRAN)\n \n- # These defines are needed only by AMReX source files\n+ # Fortran-specific defines, BL_LANG_FORT and AMREX_LANG_FORT do not get\n+ # stored in AMReX_Config.H\n target_compile_definitions( amrex PRIVATE\n- $<$<COMPILE_LANGUAGE:Fortran>:AMREX_SPACEDIM=${AMReX_SPACEDIM}>\n $<$<COMPILE_LANGUAGE:Fortran>:BL_LANG_FORT AMREX_LANG_FORT>\n )\n \n- if (AMReX_MPI)\n- target_compile_definitions( amrex PRIVATE\n- $<$<COMPILE_LANGUAGE:Fortran>:BL_USE_MPI>\n- )\n- endif()\n-\n #\n # Fortran/C mangling scheme\n #\n"}, "test": {"test_patch": "diff --git a/Tests/FortranInterface/Advection_F/Source/compute_dt_mod.F90 b/Tests/FortranInterface/Advection_F/Source/compute_dt_mod.F90\nindex 3c1c63188ac..90fb5a97b9f 100644\n--- a/Tests/FortranInterface/Advection_F/Source/compute_dt_mod.F90\n+++ b/Tests/FortranInterface/Advection_F/Source/compute_dt_mod.F90\n@@ -1,3 +1,5 @@\n+#include <AMReX_Config.H>\n+\n module compute_dt_module\n \n use amrex_amr_module\ndiff --git a/Tests/FortranInterface/Advection_F/Source/evolve_mod.F90 b/Tests/FortranInterface/Advection_F/Source/evolve_mod.F90\nindex 6b7b0df1af5..7c7260a227f 100644\n--- a/Tests/FortranInterface/Advection_F/Source/evolve_mod.F90\n+++ b/Tests/FortranInterface/Advection_F/Source/evolve_mod.F90\n@@ -1,3 +1,5 @@\n+#include <AMReX_Config.H>\n+\n module evolve_module\n \n use amrex_amr_module\ndiff --git a/Tests/FortranInterface/Advection_octree_F/Source/compute_dt_mod.F90 b/Tests/FortranInterface/Advection_octree_F/Source/compute_dt_mod.F90\nindex 623e33be7a1..e9ea23010b2 100644\n--- a/Tests/FortranInterface/Advection_octree_F/Source/compute_dt_mod.F90\n+++ b/Tests/FortranInterface/Advection_octree_F/Source/compute_dt_mod.F90\n@@ -1,3 +1,5 @@\n+#include <AMReX_Config.H>\n+\n module compute_dt_module\n \n use amrex_amr_module\ndiff --git a/Tests/FortranInterface/Advection_octree_F/Source/evolve_mod.F90 b/Tests/FortranInterface/Advection_octree_F/Source/evolve_mod.F90\nindex e2a449c4a0d..15670fa6719 100644\n--- a/Tests/FortranInterface/Advection_octree_F/Source/evolve_mod.F90\n+++ b/Tests/FortranInterface/Advection_octree_F/Source/evolve_mod.F90\n@@ -1,3 +1,5 @@\n+#include <AMReX_Config.H>\n+\n module evolve_module\n \n use amrex_amr_module\n", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}46{"question_id": "MSB_AMReX-Codes_amrex_pr2475", "question_type": "multi_swe_bench", "description": "CI: Run 2D and 1D Tests (AMReX-Codes/amrex#2475)", "content": {"org": "AMReX-Codes", "repo": "amrex", "pr_number": 2475, "issue_title": "CI: Run 2D and 1D Tests", "issue_body": "## Summary\r\n\r\nRun tests also for 2D and 1D builds of AMReX.\r\n\r\n## Additional background\r\n\r\nRelated to 2D issues with `DenseBin` in WarpX: https://github.com/ECP-WarpX/WarpX/pull/2550\r\n\r\n## Checklist\r\n\r\nThe proposed changes:\r\n- [x] fix a bug or incorrect behavior in AMReX\r\n- [x] add new capabilities to AMReX\r\n- [ ] changes answers in the test suite to more than roundoff level\r\n- [ ] are likely to significantly affect the results of downstream AMReX users\r\n- [ ] include documentation in the code and/or rst files, if appropriate\r\n", "base_commit": "96ba8b11befcd5361fdf70b58a9fb6e6eb5776ca", "resolved_issues": [{"number": 2, "title": "Physical Boundary Conditions - Fortran", "body": "I cannot find any example fortran code that uses the amrex_physbc fortran interface to supply boundary conditions. The current examples in Tuturials/*_CF use periodic bcs. I did notice that in some of the _C tutorials, an f77 file was present which provided a `filcc` routine. To impose boundary conditions, should I customize the filcc routines or is there a better way utilizing amrex_physbc?"}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/amrex-codes_m_amrex:pr-2475", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/.github/workflows/gcc.yml b/.github/workflows/gcc.yml\nindex 9ea1ca69516..244b8192a76 100644\n--- a/.github/workflows/gcc.yml\n+++ b/.github/workflows/gcc.yml\n@@ -40,8 +40,8 @@ jobs:\n ctest --output-on-failure\n \n # Build libamrex and all tests\n- tests_build:\n- name: GNU@7.5 C++14 Debug Fortran [tests]\n+ tests_build_3D:\n+ name: GNU@7.5 C++14 3D Debug Fortran [tests]\n runs-on: ubuntu-18.04\n env: {CXXFLAGS: \"-fno-operator-names -Werror -Wall -Wextra -Wpedantic -Wnull-dereference -Wfloat-conversion -Wshadow -Woverloaded-virtual -O1\"}\n # It's too slow with -O0\n@@ -51,18 +51,65 @@ jobs:\n run: .github/workflows/dependencies/dependencies.sh\n - name: Build & Install\n run: |\n- mkdir build\n- cd build\n- cmake .. \\\n+ cmake -S . -B build \\\n -DCMAKE_BUILD_TYPE=Debug \\\n -DCMAKE_VERBOSE_MAKEFILE=ON \\\n -DAMReX_EB=ON \\\n -DAMReX_ENABLE_TESTS=ON \\\n -DAMReX_FORTRAN=ON \\\n- -DAMReX_PARTICLES=ON\n- make -j 2\n+ -DAMReX_PARTICLES=ON \\\n+ -DAMReX_SPACEDIM=3\n+ cmake --build build -j 2\n \n- ctest --output-on-failure\n+ ctest --test-dir build --output-on-failure\n+\n+ tests_build_2D:\n+ name: GNU@7.5 C++14 2D Debug Fortran [tests]\n+ runs-on: ubuntu-18.04\n+ env: {CXXFLAGS: \"-fno-operator-names -Wall -Wextra -Wpedantic -Wnull-dereference -Wfloat-conversion -Wshadow -Woverloaded-virtual -O1\"}\n+ # -Werror temporarily skipped until we have functional testing established\n+ # It's too slow with -O0\n+ steps:\n+ - uses: actions/checkout@v2\n+ - name: Dependencies\n+ run: .github/workflows/dependencies/dependencies.sh\n+ - name: Build & Install\n+ run: |\n+ cmake -S . -B build \\\n+ -DCMAKE_BUILD_TYPE=Debug \\\n+ -DCMAKE_VERBOSE_MAKEFILE=ON \\\n+ -DAMReX_EB=ON \\\n+ -DAMReX_ENABLE_TESTS=ON \\\n+ -DAMReX_FORTRAN=ON \\\n+ -DAMReX_PARTICLES=ON \\\n+ -DAMReX_SPACEDIM=2\n+ cmake --build build -j 2\n+\n+ ctest --test-dir build --output-on-failure\n+\n+ tests_build_1D:\n+ name: GNU@7.5 C++14 1D Debug Fortran [tests]\n+ runs-on: ubuntu-18.04\n+ env: {CXXFLAGS: \"-fno-operator-names -Wall -Wextra -Wpedantic -Wnull-dereference -Wfloat-conversion -Wshadow -Woverloaded-virtual -O1\"}\n+ # -Werror temporarily skipped until we have functional testing established\n+ # It's too slow with -O0\n+ steps:\n+ - uses: actions/checkout@v2\n+ - name: Dependencies\n+ run: .github/workflows/dependencies/dependencies.sh\n+ - name: Build & Install\n+ run: |\n+ cmake -S . -B build \\\n+ -DCMAKE_BUILD_TYPE=Debug \\\n+ -DCMAKE_VERBOSE_MAKEFILE=ON \\\n+ -DAMReX_EB=ON \\\n+ -DAMReX_ENABLE_TESTS=ON \\\n+ -DAMReX_FORTRAN=ON \\\n+ -DAMReX_PARTICLES=ON \\\n+ -DAMReX_SPACEDIM=1\n+ cmake --build build -j 2\n+\n+ ctest --test-dir build --output-on-failure\n \n # Build libamrex and all tests\n tests_cxx20:\ndiff --git a/Src/Particle/AMReX_ParticleInterpolators.H b/Src/Particle/AMReX_ParticleInterpolators.H\nnew file mode 100644\nindex 00000000000..f241ac3ff1e\n--- /dev/null\n+++ b/Src/Particle/AMReX_ParticleInterpolators.H\n@@ -0,0 +1,127 @@\n+#ifndef AMREX_PARTICLEINTERPOLATORS_H_\n+#define AMREX_PARTICLEINTERPOLATORS_H_\n+#include <AMReX_Config.H>\n+\n+#include <AMReX_IntVect.H>\n+#include <AMReX_Gpu.H>\n+#include <AMReX_Print.H>\n+\n+namespace amrex\n+{\n+namespace ParticleInterpolator\n+{\n+\n+template <class Derived, class WeightType>\n+struct Base\n+{\n+ int index[3];\n+ WeightType* w;\n+\n+ template <typename P, typename V, typename F>\n+ AMREX_GPU_DEVICE AMREX_FORCE_INLINE\n+ void ParticleToMesh (const P& p,\n+ amrex::Array4<V> const& arr,\n+ int src_comp, int dst_comp, int num_comps, F&& f)\n+ {\n+ static constexpr int stencil_width = Derived::stencil_width;\n+ for (int ic=0; ic < num_comps; ++ic) {\n+ for (int kk = 0; kk <= Derived::nz; ++kk) {\n+ for (int jj = 0; jj <= Derived::ny; ++jj) {\n+ for (int ii = 0; ii <= Derived::nx; ++ii) {\n+ const auto pval = f(p, src_comp+ic);\n+ const auto val = w[0*stencil_width+ii] *\n+ w[1*stencil_width+jj] *\n+ w[2*stencil_width+kk] * pval;\n+ Gpu::Atomic::AddNoRet(&arr(index[0]+ii, index[1]+jj, index[2]+kk, ic+dst_comp), val);\n+ }\n+ }\n+ }\n+ }\n+ }\n+\n+ template <typename P, typename V, typename F, typename G>\n+ AMREX_GPU_DEVICE AMREX_FORCE_INLINE\n+ void MeshToParticle (P& p,\n+ amrex::Array4<const V> const& arr,\n+ int src_comp, int dst_comp, int num_comps, F&& f, G&& g)\n+ {\n+ static constexpr int stencil_width = Derived::stencil_width;\n+ for (int ic=0; ic < num_comps; ++ic) {\n+ for (int kk = 0; kk <= Derived::nz; ++kk) {\n+ for (int jj = 0; jj <= Derived::ny; ++jj) {\n+ for (int ii = 0; ii <= Derived::nx; ++ii) {\n+ const auto mval = f(arr,index[0]+ii,index[1]+jj,index[2]+kk,src_comp+ic);\n+ const auto val = w[0*stencil_width+ii] *\n+ w[1*stencil_width+jj] *\n+ w[2*stencil_width+kk] * mval;\n+ g(p, ic + dst_comp, val);\n+ }\n+ }\n+ }\n+ }\n+ }\n+};\n+\n+struct Nearest : public Base<Nearest, int>\n+{\n+ static constexpr int stencil_width = 1;\n+ int weights[3*stencil_width];\n+\n+ static constexpr int nx = (AMREX_SPACEDIM >= 1) ? stencil_width - 1 : 0;\n+ static constexpr int ny = (AMREX_SPACEDIM >= 2) ? stencil_width - 1 : 0;\n+ static constexpr int nz = (AMREX_SPACEDIM >= 3) ? stencil_width - 1 : 0;\n+\n+ template <typename P>\n+ AMREX_GPU_DEVICE AMREX_FORCE_INLINE\n+ Nearest (const P& p,\n+ amrex::GpuArray<amrex::Real,AMREX_SPACEDIM> const& plo,\n+ amrex::GpuArray<amrex::Real,AMREX_SPACEDIM> const& dxi)\n+ {\n+ w = &weights[0];\n+ for (int i = 0; i < AMREX_SPACEDIM; ++i) {\n+ amrex::Real l = (p.pos(i) - plo[i]) * dxi[i] + 0.5;\n+ index[i] = static_cast<int>(amrex::Math::floor(l));\n+ w[i] = 1;\n+ }\n+ for (int i = AMREX_SPACEDIM; i < 3; ++i) {\n+ index[i] = 0;\n+ w[i] = 1;\n+ }\n+ }\n+};\n+\n+struct Linear : public Base<Linear, amrex::Real>\n+{\n+ static constexpr int stencil_width = 2;\n+\n+ static constexpr int nx = (AMREX_SPACEDIM >= 1) ? stencil_width - 1 : 0;\n+ static constexpr int ny = (AMREX_SPACEDIM >= 2) ? stencil_width - 1 : 0;\n+ static constexpr int nz = (AMREX_SPACEDIM >= 3) ? stencil_width - 1 : 0;\n+\n+ amrex::Real weights[3*stencil_width];\n+\n+ template <typename P>\n+ AMREX_GPU_DEVICE AMREX_FORCE_INLINE\n+ Linear (const P& p,\n+ amrex::GpuArray<amrex::Real,AMREX_SPACEDIM> const& plo,\n+ amrex::GpuArray<amrex::Real,AMREX_SPACEDIM> const& dxi)\n+ {\n+ w = &weights[0];\n+ for (int i = 0; i < AMREX_SPACEDIM; ++i) {\n+ amrex::Real l = (p.pos(i) - plo[i]) * dxi[i] + 0.5;\n+ index[i] = static_cast<int>(amrex::Math::floor(l)) - 1;\n+ amrex::Real lint = l - (index[i] + 1);\n+ w[stencil_width*i + 0] = 1.-lint;\n+ w[stencil_width*i + 1] = lint;\n+ }\n+ for (int i = AMREX_SPACEDIM; i < 3; ++i) {\n+ index[i] = 0;\n+ w[stencil_width*i + 0] = 1.;\n+ w[stencil_width*i + 1] = 0.;\n+ }\n+ }\n+};\n+}\n+}\n+\n+#endif // include guard\ndiff --git a/Src/Particle/CMakeLists.txt b/Src/Particle/CMakeLists.txt\nindex 7b0efb39d4e..980fdb178ab 100644\n--- a/Src/Particle/CMakeLists.txt\n+++ b/Src/Particle/CMakeLists.txt\n@@ -34,6 +34,7 @@ target_sources( amrex\n AMReX_ParticleBufferMap.cpp\n AMReX_ParticleCommunication.H\n AMReX_ParticleCommunication.cpp\n+ AMReX_ParticleInterpolators.H\n AMReX_ParticleReduce.H\n AMReX_ParticleMesh.H\n AMReX_ParticleLocator.H\ndiff --git a/Src/Particle/Make.package b/Src/Particle/Make.package\nindex f693b923492..efb65679118 100644\n--- a/Src/Particle/Make.package\n+++ b/Src/Particle/Make.package\n@@ -14,6 +14,7 @@ C$(AMREX_PARTICLE)_headers += AMReX_WriteBinaryParticleData.H\n C$(AMREX_PARTICLE)_headers += AMReX_ParticleContainerBase.H\n C$(AMREX_PARTICLE)_sources += AMReX_ParticleContainerBase.cpp\n C$(AMREX_PARTICLE)_headers += AMReX_ParticleArray.H\n+C$(AMREX_PARTICLE)_headers += AMReX_ParticleInterpolators.H\n \n VPATH_LOCATIONS += $(AMREX_HOME)/Src/Particle\n INCLUDE_LOCATIONS += $(AMREX_HOME)/Src/Particle\n"}, "test": {"test_patch": "diff --git a/Tests/AsyncOut/multifab/main.cpp b/Tests/AsyncOut/multifab/main.cpp\nindex b9b30f297de..d1331d85862 100644\n--- a/Tests/AsyncOut/multifab/main.cpp\n+++ b/Tests/AsyncOut/multifab/main.cpp\n@@ -53,8 +53,12 @@ void main_main ()\n else if (n_boxes_per_rank != 0)\n {\n n_cell_3d[0] = (max_grid_size) - 1;\n+#if AMREX_SPACEDIM >= 2\n n_cell_3d[1] = (max_grid_size * n_boxes_per_rank) - 1;\n+#endif\n+#if AMREX_SPACEDIM == 3\n n_cell_3d[2] = (max_grid_size * ParallelDescriptor::NProcs()) - 1;\n+#endif\n }\n }\n \ndiff --git a/Tests/LinearSolvers/NodalPoisson/CMakeLists.txt b/Tests/LinearSolvers/NodalPoisson/CMakeLists.txt\nindex f4dadd89154..58b88bfea00 100644\n--- a/Tests/LinearSolvers/NodalPoisson/CMakeLists.txt\n+++ b/Tests/LinearSolvers/NodalPoisson/CMakeLists.txt\n@@ -1,3 +1,7 @@\n+if(AMReX_SPACEDIM EQUAL 1)\n+ return()\n+endif()\n+\n set(_sources main.cpp MyTest.cpp MyTest.H MyTestPlotfile.cpp)\n \n set(_input_files inputs-ci)\ndiff --git a/Tests/MultiBlock/Advection/CMakeLists.txt b/Tests/MultiBlock/Advection/CMakeLists.txt\nindex ac043eefd8d..cc4890639be 100644\n--- a/Tests/MultiBlock/Advection/CMakeLists.txt\n+++ b/Tests/MultiBlock/Advection/CMakeLists.txt\n@@ -1,3 +1,7 @@\n+if(AMReX_SPACEDIM EQUAL 1)\n+ return()\n+endif()\n+\n set(_sources main.cpp)\n set(_input_files )\n \ndiff --git a/Tests/MultiBlock/Advection/main.cpp b/Tests/MultiBlock/Advection/main.cpp\nindex c9167a69545..8b5555b2c75 100644\n--- a/Tests/MultiBlock/Advection/main.cpp\n+++ b/Tests/MultiBlock/Advection/main.cpp\n@@ -87,7 +87,9 @@ class AdvectionAmrCore : public AmrCore {\n next(i, j, k, n) = m(i, j, k, n) - a_dt_over_dx * (m(i, j, k, n) - m(i - 1, j, k, n));\n });\n }\n- } else if (dir == Direction::y) {\n+ }\n+#if (AMREX_SPACEDIM >= 2)\n+ else if (dir == Direction::y) {\n #ifdef AMREX_USE_OMP\n #pragma omp parallel if (Gpu::notInLaunchRegion())\n #endif\n@@ -100,6 +102,7 @@ class AdvectionAmrCore : public AmrCore {\n });\n }\n }\n+#endif\n std::swap(mass, mass_next);\n }\n \n@@ -231,10 +234,10 @@ void MyMain() {\n RealBox real_box1{{AMREX_D_DECL(-0.5, -0.3, 0.0)}, {AMREX_D_DECL(0.5, 0.7, 1.0)}};\n RealBox real_box2{{AMREX_D_DECL(+0.55, -0.3, 0.0)}, {AMREX_D_DECL(1.55, 0.7, 1.0)}};\n \n- Array<int, AMREX_SPACEDIM> is_periodic1{0, 1};\n+ Array<int, AMREX_SPACEDIM> is_periodic1{AMREX_D_DECL(0, 1, 0)};\n Geometry geom1{domain, real_box1, CoordSys::cartesian, is_periodic1};\n \n- Array<int, AMREX_SPACEDIM> is_periodic2{1, 0};\n+ Array<int, AMREX_SPACEDIM> is_periodic2{AMREX_D_DECL(1, 0, 0)};\n Geometry geom2{domain, real_box2, CoordSys::cartesian, is_periodic2};\n \n AmrInfo amr_info{};\n@@ -243,7 +246,11 @@ void MyMain() {\n #endif\n \n AdvectionAmrCore core_x(Direction::x, geom1, amr_info);\n+#if AMREX_SPACEDIM > 2\n AdvectionAmrCore core_y(Direction::y, geom2, amr_info);\n+#else // too hack-ish?\n+ AdvectionAmrCore core_y(Direction::x, geom2, amr_info);\n+#endif\n \n std::vector<OnesidedMultiBlockBoundaryFn> multi_block_boundaries{};\n { // Fill right boundary of core_x with lower mirror data of core_y\ndiff --git a/Tests/MultiBlock/IndexType/CMakeLists.txt b/Tests/MultiBlock/IndexType/CMakeLists.txt\nindex ac043eefd8d..cc4890639be 100644\n--- a/Tests/MultiBlock/IndexType/CMakeLists.txt\n+++ b/Tests/MultiBlock/IndexType/CMakeLists.txt\n@@ -1,3 +1,7 @@\n+if(AMReX_SPACEDIM EQUAL 1)\n+ return()\n+endif()\n+\n set(_sources main.cpp)\n set(_input_files )\n \ndiff --git a/Tests/MultiBlock/IndexType/main.cpp b/Tests/MultiBlock/IndexType/main.cpp\nindex ad7a78a8cdb..39a99acbc67 100644\n--- a/Tests/MultiBlock/IndexType/main.cpp\n+++ b/Tests/MultiBlock/IndexType/main.cpp\n@@ -135,9 +135,9 @@ int MyMain()\n Box domain{IntVect{}, IntVect{AMREX_D_DECL(31, 31, 31)}};\n // Loop over all index types\n for (int i = 0; i < AMREX_D_TERM(2,*2,*2); ++i) {\n- const auto ix = static_cast<IndexType::CellIndex>(static_cast<bool>(i & 0b001));\n- const auto iy = static_cast<IndexType::CellIndex>(static_cast<bool>(i & 0b010));\n- const auto iz = static_cast<IndexType::CellIndex>(static_cast<bool>(i & 0b100));\n+ AMREX_D_TERM(const auto ix = static_cast<IndexType::CellIndex>(static_cast<bool>(i & 0b001));,\n+ const auto iy = static_cast<IndexType::CellIndex>(static_cast<bool>(i & 0b010));,\n+ const auto iz = static_cast<IndexType::CellIndex>(static_cast<bool>(i & 0b100));)\n IndexType itype{AMREX_D_DECL(ix, iy, iz)};\n Box converted_domain = convert(domain, itype);\n iMultiFab mf = InitializeMultiFab(converted_domain);\ndiff --git a/Tests/Particles/AssignDensity/main.cpp b/Tests/Particles/AssignDensity/main.cpp\nindex b08693828be..4b0e6635e22 100644\n--- a/Tests/Particles/AssignDensity/main.cpp\n+++ b/Tests/Particles/AssignDensity/main.cpp\n@@ -67,7 +67,7 @@ void test_assign_density(TestParams& parms)\n \n MyParticleContainer::ParticleInitData pdata = {{mass, AMREX_D_DECL(1.0, 2.0, 3.0)}, {}, {}, {}};\n myPC.InitRandom(num_particles, iseed, pdata, serialize);\n- myPC.AssignCellDensitySingleLevel(0, partMF, 0, 4, 0);\n+ myPC.AssignCellDensitySingleLevel(0, partMF, 0, 1 + AMREX_SPACEDIM, 0);\n \n // myPC.AssignDensitySingleLevel(0, partMF, 0, 4, 0);\n \n@@ -76,7 +76,7 @@ void test_assign_density(TestParams& parms)\n MultiFab::Copy(density, partMF, 0, 0, 1, 0);\n \n WriteSingleLevelPlotfile(\"plt00000\", partMF,\n- {\"density\", \"vx\", \"vy\", \"vz\"},\n+ {\"density\", AMREX_D_DECL(\"vx\", \"vy\", \"vz\")},\n geom, 0.0, 0);\n \n myPC.Checkpoint(\"plt00000\", \"particle0\");\ndiff --git a/Tests/Particles/AsyncIO/main.cpp b/Tests/Particles/AsyncIO/main.cpp\nindex 98b430e245d..ce484e7b773 100644\n--- a/Tests/Particles/AsyncIO/main.cpp\n+++ b/Tests/Particles/AsyncIO/main.cpp\n@@ -238,7 +238,7 @@ void test_async_io(TestParams& parms)\n MyParticleContainer myPC(geom, dmap, ba, rr);\n myPC.SetVerbose(false);\n \n- myPC.InitParticles(IntVect(2, 2, 2));\n+ myPC.InitParticles(IntVect(AMREX_D_DECL(2, 2, 2)));\n \n for (int step = 0; step < 4000; ++step)\n {\ndiff --git a/Tests/Particles/GhostsAndVirtuals/CMakeLists.txt b/Tests/Particles/GhostsAndVirtuals/CMakeLists.txt\nindex 4c24bb40f68..6cd0bc5c84d 100644\n--- a/Tests/Particles/GhostsAndVirtuals/CMakeLists.txt\n+++ b/Tests/Particles/GhostsAndVirtuals/CMakeLists.txt\n@@ -1,3 +1,7 @@\n+if ( NOT (AMReX_SPACEDIM EQUAL 3) )\n+ return ()\n+endif ()\n+\n set(_sources main.cpp)\n set(_input_files inputs particle_file.init fixed_grids.init)\n \ndiff --git a/Tests/Particles/InitFromAscii/CMakeLists.txt b/Tests/Particles/InitFromAscii/CMakeLists.txt\nindex 0615dcae5db..3f63911ef1f 100644\n--- a/Tests/Particles/InitFromAscii/CMakeLists.txt\n+++ b/Tests/Particles/InitFromAscii/CMakeLists.txt\n@@ -1,3 +1,7 @@\n+if ( NOT (AMReX_SPACEDIM EQUAL 3) )\n+ return ()\n+endif ()\n+\n set(_sources main.cpp)\n set(_input_files inputs )\n \ndiff --git a/Tests/Particles/NeighborParticles/CheckPair.H b/Tests/Particles/NeighborParticles/CheckPair.H\nindex 8018e9c49e9..e51e239a167 100644\n--- a/Tests/Particles/NeighborParticles/CheckPair.H\n+++ b/Tests/Particles/NeighborParticles/CheckPair.H\n@@ -2,6 +2,7 @@\n #define MD_K_H_\n \n #include \"Constants.H\"\n+#include <AMReX_SPACE.H>\n \n struct CheckPair\n {\n@@ -9,10 +10,10 @@ struct CheckPair\n AMREX_GPU_DEVICE AMREX_FORCE_INLINE\n bool operator()(const P& p1, const P& p2) const\n {\n- amrex::Real d0 = (p1.pos(0) - p2.pos(0));\n- amrex::Real d1 = (p1.pos(1) - p2.pos(1));\n- amrex::Real d2 = (p1.pos(2) - p2.pos(2));\n- amrex::Real dsquared = d0*d0 + d1*d1 + d2*d2;\n+ AMREX_D_TERM(amrex::Real d0 = (p1.pos(0) - p2.pos(0));,\n+ amrex::Real d1 = (p1.pos(1) - p2.pos(1));,\n+ amrex::Real d2 = (p1.pos(2) - p2.pos(2));)\n+ amrex::Real dsquared = AMREX_D_TERM(d0*d0, + d1*d1, + d2*d2);\n return (dsquared <= 25.0*Params::cutoff*Params::cutoff);\n }\n };\ndiff --git a/Tests/Particles/NeighborParticles/MDParticleContainer.cpp b/Tests/Particles/NeighborParticles/MDParticleContainer.cpp\nindex b275e3327ef..b934f664f4e 100644\n--- a/Tests/Particles/NeighborParticles/MDParticleContainer.cpp\n+++ b/Tests/Particles/NeighborParticles/MDParticleContainer.cpp\n@@ -2,6 +2,7 @@\n #include \"Constants.H\"\n \n #include \"CheckPair.H\"\n+#include <AMReX_SPACE.H>\n \n using namespace amrex;\n \n@@ -10,16 +11,24 @@ namespace\n void get_position_unit_cell(Real* r, const IntVect& nppc, int i_part)\n {\n int nx = nppc[0];\n+#if AMREX_SPACEDIM >= 2\n int ny = nppc[1];\n+#else\n+ int ny = 1;\n+#endif\n+#if AMREX_SPACEDIM == 3\n int nz = nppc[2];\n+#else\n+ int nz = 1;\n+#endif\n \n- int ix_part = i_part/(ny * nz);\n- int iy_part = (i_part % (ny * nz)) % ny;\n- int iz_part = (i_part % (ny * nz)) / ny;\n+ AMREX_D_TERM(int ix_part = i_part/(ny * nz);,\n+ int iy_part = (i_part % (ny * nz)) % ny;,\n+ int iz_part = (i_part % (ny * nz)) / ny;)\n \n- r[0] = (0.5+ix_part)/nx;\n- r[1] = (0.5+iy_part)/ny;\n- r[2] = (0.5+iz_part)/nz;\n+ AMREX_D_TERM(r[0] = (0.5+ix_part)/nx;,\n+ r[1] = (0.5+iy_part)/ny;,\n+ r[2] = (0.5+iz_part)/nz;)\n }\n \n void get_gaussian_random_momentum(Real* u, Real u_mean, Real u_std) {\n@@ -61,7 +70,7 @@ InitParticles(const IntVect& a_num_particles_per_cell,\n \n for (IntVect iv = tile_box.smallEnd(); iv <= tile_box.bigEnd(); tile_box.next(iv)) {\n for (int i_part=0; i_part<num_ppc;i_part++) {\n- Real r[3];\n+ Real r[AMREX_SPACEDIM];\n Real v[3];\n \n get_position_unit_cell(r, a_num_particles_per_cell, i_part);\n@@ -69,16 +78,16 @@ InitParticles(const IntVect& a_num_particles_per_cell,\n get_gaussian_random_momentum(v, a_thermal_momentum_mean,\n a_thermal_momentum_std);\n \n- ParticleReal x = static_cast<ParticleReal> (plo[0] + (iv[0] + r[0])*dx[0]);\n- ParticleReal y = static_cast<ParticleReal> (plo[1] + (iv[1] + r[1])*dx[1]);\n- ParticleReal z = static_cast<ParticleReal> (plo[2] + (iv[2] + r[2])*dx[2]);\n+ AMREX_D_TERM(ParticleReal x = static_cast<ParticleReal> (plo[0] + (iv[0] + r[0])*dx[0]);,\n+ ParticleReal y = static_cast<ParticleReal> (plo[1] + (iv[1] + r[1])*dx[1]);,\n+ ParticleReal z = static_cast<ParticleReal> (plo[2] + (iv[2] + r[2])*dx[2]);)\n \n ParticleType p;\n p.id() = ParticleType::NextID();\n p.cpu() = ParallelDescriptor::MyProc();\n- p.pos(0) = x;\n- p.pos(1) = y;\n- p.pos(2) = z;\n+ AMREX_D_TERM(p.pos(0) = x;,\n+ p.pos(1) = y;,\n+ p.pos(2) = z;)\n \n p.rdata(PIdx::vx) = static_cast<ParticleReal> (v[0]);\n p.rdata(PIdx::vy) = static_cast<ParticleReal> (v[1]);\n@@ -165,11 +174,11 @@ std::pair<Real, Real> MDParticleContainer::minAndMaxDistance()\n \n for (const auto& p2 : nbor_data.getNeighbors(i))\n {\n- Real dx = p1.pos(0) - p2.pos(0);\n- Real dy = p1.pos(1) - p2.pos(1);\n- Real dz = p1.pos(2) - p2.pos(2);\n+ AMREX_D_TERM(Real dx = p1.pos(0) - p2.pos(0);,\n+ Real dy = p1.pos(1) - p2.pos(1);,\n+ Real dz = p1.pos(2) - p2.pos(2);)\n \n- Real r2 = dx*dx + dy*dy + dz*dz;\n+ Real r2 = AMREX_D_TERM(dx*dx, + dy*dy, + dz*dz);\n r2 = amrex::max(r2, Params::min_r*Params::min_r);\n Real r = sqrt(r2);\n \n@@ -211,9 +220,9 @@ void MDParticleContainer::moveParticles(amrex::ParticleReal dx)\n AMREX_FOR_1D ( np, i,\n {\n ParticleType& p = pstruct[i];\n- p.pos(0) += dx;\n- p.pos(1) += dx;\n- p.pos(2) += dx;\n+ AMREX_D_TERM(p.pos(0) += dx;,\n+ p.pos(1) += dx;,\n+ p.pos(2) += dx;)\n });\n }\n }\n@@ -314,11 +323,11 @@ void MDParticleContainer::checkNeighborList()\n if ( i == j ) continue;\n \n ParticleType& p2 = h_pstruct[j];\n- Real dx = p1.pos(0) - p2.pos(0);\n- Real dy = p1.pos(1) - p2.pos(1);\n- Real dz = p1.pos(2) - p2.pos(2);\n+ AMREX_D_TERM(Real dx = p1.pos(0) - p2.pos(0);,\n+ Real dy = p1.pos(1) - p2.pos(1);,\n+ Real dz = p1.pos(2) - p2.pos(2);)\n \n- Real r2 = dx*dx + dy*dy + dz*dz;\n+ Real r2 = AMREX_D_TERM(dx*dx, + dy*dy, + dz*dz);\n \n Real cutoff_sq = 25.0*Params::cutoff*Params::cutoff;\n \ndiff --git a/Tests/Particles/ParallelContext/main.cpp b/Tests/Particles/ParallelContext/main.cpp\nindex a23b9195771..311c39a3bab 100644\n--- a/Tests/Particles/ParallelContext/main.cpp\n+++ b/Tests/Particles/ParallelContext/main.cpp\n@@ -15,25 +15,25 @@ int num_runtime_int = 0;\n \n void get_position_unit_cell(Real* r, const IntVect& nppc, int i_part)\n {\n- int nx = nppc[0];\n-#if AMREX_SPACEDIM > 1\n- int ny = nppc[1];\n+ int nx = nppc[0];\n+#if AMREX_SPACEDIM >= 2\n+ int ny = nppc[1];\n #else\n- int ny = 1;\n+ int ny = 1;\n #endif\n-#if AMREX_SPACEDIM > 2\n- int nz = nppc[2];\n+#if AMREX_SPACEDIM == 3\n+ int nz = nppc[2];\n #else\n- int nz = 1;\n+ int nz = 1;\n #endif\n \n- int ix_part = i_part/(ny * nz);\n- int iy_part = (i_part % (ny * nz)) % ny;\n- int iz_part = (i_part % (ny * nz)) / ny;\n+ AMREX_D_TERM(int ix_part = i_part/(ny * nz);,\n+ int iy_part = (i_part % (ny * nz)) % ny;,\n+ int iz_part = (i_part % (ny * nz)) / ny;)\n \n- r[0] = (0.5+ix_part)/nx;\n- r[1] = (0.5+iy_part)/ny;\n- r[2] = (0.5+iz_part)/nz;\n+ AMREX_D_TERM(r[0] = (0.5+ix_part)/nx;,\n+ r[1] = (0.5+iy_part)/ny;,\n+ r[2] = (0.5+iz_part)/nz;)\n }\n \n class TestParticleContainer\n@@ -92,7 +92,7 @@ class TestParticleContainer\n for (IntVect iv = tile_box.smallEnd(); iv <= tile_box.bigEnd(); tile_box.next(iv))\n {\n for (int i_part=0; i_part<num_ppc;i_part++) {\n- Real r[3];\n+ Real r[AMREX_SPACEDIM];\n get_position_unit_cell(r, a_num_particles_per_cell, i_part);\n \n ParticleType p;\n@@ -322,8 +322,6 @@ void testParallelContext ()\n {\n BL_PROFILE(\"testParallelContext\");\n \n- AMREX_ALWAYS_ASSERT(AMREX_SPACEDIM == 3);\n-\n // we always make two subcommunicators.\n // one takes the left half of the domain in direction 0, the other the right.\n int rank_n = ParallelContext::NProcsSub();\ndiff --git a/Tests/Particles/ParticleIterator/main.cpp b/Tests/Particles/ParticleIterator/main.cpp\nindex 0c544de7935..d635d11ab13 100644\n--- a/Tests/Particles/ParticleIterator/main.cpp\n+++ b/Tests/Particles/ParticleIterator/main.cpp\n@@ -25,8 +25,8 @@ int main(int argc, char* argv[])\n real_box.setHi(n,1.0);\n }\n \n- IntVect domain_lo(0 , 0, 0);\n- IntVect domain_hi(ncell-1, ncell-1, ncell-1);\n+ IntVect domain_lo(AMREX_D_DECL(0 , 0, 0));\n+ IntVect domain_hi(AMREX_D_DECL(ncell-1, ncell-1, ncell-1));\n \n const Box domain(domain_lo, domain_hi);\n \ndiff --git a/Tests/Particles/ParticleMesh/main.cpp b/Tests/Particles/ParticleMesh/main.cpp\nindex a6fb6094ff5..3e3a3c5045a 100644\n--- a/Tests/Particles/ParticleMesh/main.cpp\n+++ b/Tests/Particles/ParticleMesh/main.cpp\n@@ -6,6 +6,7 @@\n #include \"AMReX_Particles.H\"\n #include \"AMReX_PlotFileUtil.H\"\n #include <AMReX_ParticleMesh.H>\n+#include <AMReX_ParticleInterpolators.H>\n \n using namespace amrex;\n \n@@ -22,7 +23,7 @@ void testParticleMesh (TestParams& parms)\n {\n \n RealBox real_box;\n- for (int n = 0; n < BL_SPACEDIM; n++) {\n+ for (int n = 0; n < AMREX_SPACEDIM; n++) {\n real_box.setLo(n, 0.0);\n real_box.setHi(n, 1.0);\n }\n@@ -32,8 +33,8 @@ void testParticleMesh (TestParams& parms)\n const Box domain(domain_lo, domain_hi);\n \n // This sets the boundary conditions to be doubly or triply periodic\n- int is_per[BL_SPACEDIM];\n- for (int i = 0; i < BL_SPACEDIM; i++)\n+ int is_per[AMREX_SPACEDIM];\n+ for (int i = 0; i < AMREX_SPACEDIM; i++)\n is_per[i] = 1;\n Geometry geom(domain, &real_box, CoordSys::cartesian, is_per);\n \n@@ -45,13 +46,13 @@ void testParticleMesh (TestParams& parms)\n \n DistributionMapping dmap(ba);\n \n- MultiFab partMF(ba, dmap, 1 + BL_SPACEDIM, 1);\n+ MultiFab partMF(ba, dmap, 1 + AMREX_SPACEDIM, 1);\n partMF.setVal(0.0);\n \n- iMultiFab partiMF(ba, dmap, 1 + BL_SPACEDIM, 1);\n+ iMultiFab partiMF(ba, dmap, 1 + AMREX_SPACEDIM, 1);\n partiMF.setVal(0);\n \n- typedef ParticleContainer<1 + 2*BL_SPACEDIM, 1> MyParticleContainer;\n+ typedef ParticleContainer<1 + 2*AMREX_SPACEDIM, 1> MyParticleContainer;\n MyParticleContainer myPC(geom, dmap, ba);\n myPC.SetVerbose(false);\n \n@@ -66,83 +67,63 @@ void testParticleMesh (TestParams& parms)\n MyParticleContainer::ParticleInitData pdata = {{mass, AMREX_D_DECL(1.0, 2.0, 3.0), AMREX_D_DECL(0.0, 0.0, 0.0)}, {},{},{}};\n myPC.InitRandom(num_particles, iseed, pdata, serialize);\n \n- int nc = 1 + BL_SPACEDIM;\n+ int nc = 1 + AMREX_SPACEDIM;\n const auto plo = geom.ProbLoArray();\n const auto dxi = geom.InvCellSizeArray();\n amrex::ParticleToMesh(myPC, partMF, 0,\n [=] AMREX_GPU_DEVICE (const MyParticleContainer::ParticleType& p,\n amrex::Array4<amrex::Real> const& rho)\n {\n- amrex::Real lx = (p.pos(0) - plo[0]) * dxi[0] + 0.5;\n- amrex::Real ly = (p.pos(1) - plo[1]) * dxi[1] + 0.5;\n- amrex::Real lz = (p.pos(2) - plo[2]) * dxi[2] + 0.5;\n-\n- int i = static_cast<int>(amrex::Math::floor(lx));\n- int j = static_cast<int>(amrex::Math::floor(ly));\n- int k = static_cast<int>(amrex::Math::floor(lz));\n-\n- amrex::Real xint = lx - i;\n- amrex::Real yint = ly - j;\n- amrex::Real zint = lz - k;\n-\n- amrex::Real sx[] = {1.-xint, xint};\n- amrex::Real sy[] = {1.-yint, yint};\n- amrex::Real sz[] = {1.-zint, zint};\n-\n- for (int kk = 0; kk <= 1; ++kk) {\n- for (int jj = 0; jj <= 1; ++jj) {\n- for (int ii = 0; ii <= 1; ++ii) {\n- amrex::Gpu::Atomic::AddNoRet(&rho(i+ii-1, j+jj-1, k+kk-1, 0),\n- sx[ii]*sy[jj]*sz[kk]*p.rdata(0));\n- }\n- }\n- }\n-\n- for (int comp=1; comp < nc; ++comp) {\n- for (int kk = 0; kk <= 1; ++kk) {\n- for (int jj = 0; jj <= 1; ++jj) {\n- for (int ii = 0; ii <= 1; ++ii) {\n- amrex::Gpu::Atomic::AddNoRet(&rho(i+ii-1, j+jj-1, k+kk-1, comp),\n- sx[ii]*sy[jj]*sz[kk]*p.rdata(0)*p.rdata(comp));\n- }\n- }\n- }\n- }\n+ ParticleInterpolator::Linear interp(p, plo, dxi);\n+\n+ interp.ParticleToMesh(p, rho, 0, 0, 1,\n+ [=] AMREX_GPU_DEVICE (const MyParticleContainer::ParticleType& part, int comp)\n+ {\n+ return part.rdata(comp); // no weighting\n+ });\n+\n+ interp.ParticleToMesh(p, rho, 1, 1, AMREX_SPACEDIM,\n+ [=] AMREX_GPU_DEVICE (const MyParticleContainer::ParticleType& part, int comp)\n+ {\n+ return part.rdata(0) * p.rdata(comp); // mass weight these comps\n+ });\n });\n \n- MultiFab acceleration(ba, dmap, BL_SPACEDIM, 1);\n+ amrex::ParticleToMesh(myPC, partMF, 0,\n+ [=] AMREX_GPU_DEVICE (const MyParticleContainer::ParticleType& p,\n+ amrex::Array4<amrex::Real> const& rho)\n+ {\n+ ParticleInterpolator::Nearest interp(p, plo, dxi);\n+\n+ interp.ParticleToMesh(p, rho, 0, 0, 1,\n+ [=] AMREX_GPU_DEVICE (const MyParticleContainer::ParticleType& /*p*/,\n+ int /*comp*/)\n+ {\n+ return 1.0; // no weighting\n+ });\n+ });\n+\n+ MultiFab acceleration(ba, dmap, AMREX_SPACEDIM, 1);\n acceleration.setVal(5.0);\n \n- nc = BL_SPACEDIM;\n+ nc = AMREX_SPACEDIM;\n amrex::MeshToParticle(myPC, acceleration, 0,\n [=] AMREX_GPU_DEVICE (MyParticleContainer::ParticleType& p,\n amrex::Array4<const amrex::Real> const& acc)\n {\n- amrex::Real lx = (p.pos(0) - plo[0]) * dxi[0] + 0.5;\n- amrex::Real ly = (p.pos(1) - plo[1]) * dxi[1] + 0.5;\n- amrex::Real lz = (p.pos(2) - plo[2]) * dxi[2] + 0.5;\n-\n- int i = static_cast<int>(amrex::Math::floor(lx));\n- int j = static_cast<int>(amrex::Math::floor(ly));\n- int k = static_cast<int>(amrex::Math::floor(lz));\n-\n- amrex::Real xint = lx - i;\n- amrex::Real yint = ly - j;\n- amrex::Real zint = lz - k;\n-\n- amrex::Real sx[] = {1.-xint, xint};\n- amrex::Real sy[] = {1.-yint, yint};\n- amrex::Real sz[] = {1.-zint, zint};\n-\n- for (int comp=0; comp < nc; ++comp) {\n- for (int kk = 0; kk <= 1; ++kk) {\n- for (int jj = 0; jj <= 1; ++jj) {\n- for (int ii = 0; ii <= 1; ++ii) {\n- p.rdata(4+comp) += static_cast<ParticleReal> (sx[ii]*sy[jj]*sz[kk]*acc(i+ii-1,j+jj-1,k+kk-1,comp));\n- }\n- }\n- }\n- }\n+ ParticleInterpolator::Linear interp(p, plo, dxi);\n+\n+ interp.MeshToParticle(p, acc, 0, 0, nc,\n+ [=] AMREX_GPU_DEVICE (amrex::Array4<const amrex::Real> const& arr,\n+ int i, int j, int k, int comp)\n+ {\n+ return arr(i, j, k, comp); // no weighting\n+ },\n+ [=] AMREX_GPU_DEVICE (MyParticleContainer::ParticleType& part,\n+ int comp, amrex::Real val)\n+ {\n+ part.rdata(comp) += val;\n+ });\n });\n \n // now also try the iMultiFab versions\n@@ -150,34 +131,36 @@ void testParticleMesh (TestParams& parms)\n [=] AMREX_GPU_DEVICE (const MyParticleContainer::ParticleType& p,\n amrex::Array4<int> const& count)\n {\n- amrex::Real lx = (p.pos(0) - plo[0]) * dxi[0] + 0.5;\n- amrex::Real ly = (p.pos(1) - plo[1]) * dxi[1] + 0.5;\n- amrex::Real lz = (p.pos(2) - plo[2]) * dxi[2] + 0.5;\n-\n- int i = static_cast<int>(amrex::Math::floor(lx));\n- int j = static_cast<int>(amrex::Math::floor(ly));\n- int k = static_cast<int>(amrex::Math::floor(lz));\n+ ParticleInterpolator::Nearest interp(p, plo, dxi);\n \n- amrex::Gpu::Atomic::AddNoRet(&count(i, j, k), 1);\n+ interp.ParticleToMesh(p, count, 0, 0, 1,\n+ [=] AMREX_GPU_DEVICE (const MyParticleContainer::ParticleType& /*p*/, int /*comp*/) -> int\n+ {\n+ return 1; // just count the particles per cell\n+ });\n });\n \n amrex::MeshToParticle(myPC, partiMF, 0,\n [=] AMREX_GPU_DEVICE (MyParticleContainer::ParticleType& p,\n amrex::Array4<const int> const& count)\n {\n- amrex::Real lx = (p.pos(0) - plo[0]) * dxi[0] + 0.5;\n- amrex::Real ly = (p.pos(1) - plo[1]) * dxi[1] + 0.5;\n- amrex::Real lz = (p.pos(2) - plo[2]) * dxi[2] + 0.5;\n-\n- int i = static_cast<int>(amrex::Math::floor(lx));\n- int j = static_cast<int>(amrex::Math::floor(ly));\n- int k = static_cast<int>(amrex::Math::floor(lz));\n-\n- p.idata(0) = count(i, j, k);\n+ ParticleInterpolator::Nearest interp(p, plo, dxi);\n+\n+ interp.MeshToParticle(p, count, 0, 0, 1,\n+ [=] AMREX_GPU_DEVICE (amrex::Array4<const int> const& arr,\n+ int i, int j, int k, int comp)\n+ {\n+ return arr(i, j, k, comp); // no weighting\n+ },\n+ [=] AMREX_GPU_DEVICE (MyParticleContainer::ParticleType& part,\n+ int comp, int val)\n+ {\n+ part.idata(comp) = val;\n+ });\n });\n \n WriteSingleLevelPlotfile(\"plot\", partMF,\n- {\"density\", \"vx\", \"vy\", \"vz\"},\n+ {\"density\", AMREX_D_DECL(\"vx\", \"vy\", \"vz\")},\n geom, 0.0, 0);\n \n myPC.Checkpoint(\"plot\", \"particle0\");\ndiff --git a/Tests/Particles/ParticleMeshMultiLevel/main.cpp b/Tests/Particles/ParticleMeshMultiLevel/main.cpp\nindex d77c8786966..f52c2899706 100644\n--- a/Tests/Particles/ParticleMeshMultiLevel/main.cpp\n+++ b/Tests/Particles/ParticleMeshMultiLevel/main.cpp\n@@ -95,31 +95,14 @@ void testParticleMesh (TestParams& parms)\n amrex::GpuArray<amrex::Real,AMREX_SPACEDIM> const& plo,\n amrex::GpuArray<amrex::Real,AMREX_SPACEDIM> const& dxi) noexcept\n {\n- amrex::Real lx = (p.pos(0) - plo[0]) * dxi[0] + 0.5;\n- amrex::Real ly = (p.pos(1) - plo[1]) * dxi[1] + 0.5;\n- amrex::Real lz = (p.pos(2) - plo[2]) * dxi[2] + 0.5;\n-\n- int i = static_cast<int>(amrex::Math::floor(lx));\n- int j = static_cast<int>(amrex::Math::floor(ly));\n- int k = static_cast<int>(amrex::Math::floor(lz));\n-\n- amrex::Real xint = lx - i;\n- amrex::Real yint = ly - j;\n- amrex::Real zint = lz - k;\n-\n- amrex::Real sx[] = {1.-xint, xint};\n- amrex::Real sy[] = {1.-yint, yint};\n- amrex::Real sz[] = {1.-zint, zint};\n-\n- for (int kk = 0; kk <= 1; ++kk) {\n- for (int jj = 0; jj <= 1; ++jj) {\n- for (int ii = 0; ii <= 1; ++ii) {\n- amrex::Gpu::Atomic::AddNoRet(&rho(i+ii-1, j+jj-1, k+kk-1, 0),\n- sx[ii]*sy[jj]*sz[kk]*p.rdata(0));\n- }\n- }\n- }\n- });\n+ ParticleInterpolator::Linear interp(p, plo, dxi);\n+\n+ interp.ParticleToMesh(p, rho, 0, 0, 1,\n+ [=] AMREX_GPU_DEVICE (const MyParticleContainer::ParticleType& part, int comp)\n+ {\n+ return part.rdata(comp); // no weighting\n+ });\n+ });\n \n //\n // Here we provide an example of another way to call ParticleToMesh\n@@ -128,8 +111,8 @@ void testParticleMesh (TestParams& parms)\n int start_mesh_comp = 0;\n int num_comp = 1;\n \n- ParticleToMesh(myPC,GetVecOfPtrs(density2),0,parms.nlevs-1,\n- TrilinearDeposition{start_part_comp,start_mesh_comp,num_comp});\n+ amrex::ParticleToMesh(myPC,GetVecOfPtrs(density2),0,parms.nlevs-1,\n+ TrilinearDeposition{start_part_comp,start_mesh_comp,num_comp});\n \n //\n // Now write the output from each into separate plotfiles for comparison\ndiff --git a/Tests/Particles/ParticleMeshMultiLevel/trilinear_deposition_K.H b/Tests/Particles/ParticleMeshMultiLevel/trilinear_deposition_K.H\nindex 47f1e5049fb..fba78c9fc3e 100644\n--- a/Tests/Particles/ParticleMeshMultiLevel/trilinear_deposition_K.H\n+++ b/Tests/Particles/ParticleMeshMultiLevel/trilinear_deposition_K.H\n@@ -4,46 +4,26 @@\n #include <AMReX_MultiFabUtil.H>\n #include <AMReX_Particles.H>\n #include <AMReX_AmrParticles.H>\n+#include <AMReX_ParticleInterpolators.H>\n \n struct TrilinearDeposition\n {\n- int start_part_comp;\n- int start_mesh_comp;\n- int num_comp;\n+ int start_part_comp;\n+ int start_mesh_comp;\n+ int num_comp;\n \n- AMREX_GPU_DEVICE\n- void operator()\n- (const MyParticleContainer::ParticleType& p,\n- amrex::Array4<amrex::Real> const& rho,\n- amrex::GpuArray<amrex::Real,AMREX_SPACEDIM> const& plo,\n- amrex::GpuArray<amrex::Real,AMREX_SPACEDIM> const& dxi) const noexcept\n- {\n- amrex::Real lx = (p.pos(0) - plo[0]) * dxi[0] + 0.5;\n- amrex::Real ly = (p.pos(1) - plo[1]) * dxi[1] + 0.5;\n- amrex::Real lz = (p.pos(2) - plo[2]) * dxi[2] + 0.5;\n+ AMREX_GPU_DEVICE AMREX_FORCE_INLINE\n+ void operator() (const MyParticleContainer::ParticleType& p,\n+ amrex::Array4<amrex::Real> const& rho,\n+ amrex::GpuArray<amrex::Real,AMREX_SPACEDIM> const& plo,\n+ amrex::GpuArray<amrex::Real,AMREX_SPACEDIM> const& dxi) const noexcept\n+ {\n+ amrex::ParticleInterpolator::Linear interp(p, plo, dxi);\n \n- int i = static_cast<int>(amrex::Math::floor(lx));\n- int j = static_cast<int>(amrex::Math::floor(ly));\n- int k = static_cast<int>(amrex::Math::floor(lz));\n-\n- amrex::Real xint = lx - i;\n- amrex::Real yint = ly - j;\n- amrex::Real zint = lz - k;\n-\n- amrex::Real sx[] = {1.-xint, xint};\n- amrex::Real sy[] = {1.-yint, yint};\n- amrex::Real sz[] = {1.-zint, zint};\n-\n- for (int kk = 0; kk <= 1; ++kk) {\n- for (int jj = 0; jj <= 1; ++jj) {\n- for (int ii = 0; ii <= 1; ++ii) {\n- for (int icomp = 0; icomp < num_comp; icomp++)\n- {\n- amrex::Gpu::Atomic::AddNoRet(&rho(i+ii-1, j+jj-1, k+kk-1, start_mesh_comp+icomp),\n- sx[ii]*sy[jj]*sz[kk]*p.rdata(start_part_comp+icomp));\n- }\n- }\n- }\n- }\n- }\n+ interp.ParticleToMesh(p, rho, start_part_comp, start_mesh_comp, num_comp,\n+ [=] AMREX_GPU_DEVICE (const MyParticleContainer::ParticleType& part, int comp)\n+ {\n+ return part.rdata(comp); // no weighting\n+ });\n+ }\n };\ndiff --git a/Tests/Particles/ParticleReduce/main.cpp b/Tests/Particles/ParticleReduce/main.cpp\nindex cdecf985430..382c9191804 100644\n--- a/Tests/Particles/ParticleReduce/main.cpp\n+++ b/Tests/Particles/ParticleReduce/main.cpp\n@@ -3,6 +3,8 @@\n #include <AMReX_MultiFab.H>\n #include <AMReX_Particles.H>\n \n+#include <cmath>\n+\n using namespace amrex;\n \n static constexpr int NSR = 4;\n@@ -12,17 +14,25 @@ static constexpr int NAI = 1;\n \n void get_position_unit_cell(Real* r, const IntVect& nppc, int i_part)\n {\n- int nx = nppc[0];\n- int ny = nppc[1];\n- int nz = nppc[2];\n-\n- int ix_part = i_part/(ny * nz);\n- int iy_part = (i_part % (ny * nz)) % ny;\n- int iz_part = (i_part % (ny * nz)) / ny;\n-\n- r[0] = (0.5+ix_part)/nx;\n- r[1] = (0.5+iy_part)/ny;\n- r[2] = (0.5+iz_part)/nz;\n+ int nx = nppc[0];\n+#if AMREX_SPACEDIM >= 2\n+ int ny = nppc[1];\n+#else\n+ int ny = 1;\n+#endif\n+#if AMREX_SPACEDIM == 3\n+ int nz = nppc[2];\n+#else\n+ int nz = 1;\n+#endif\n+\n+ AMREX_D_TERM(int ix_part = i_part/(ny * nz);,\n+ int iy_part = (i_part % (ny * nz)) % ny;,\n+ int iz_part = (i_part % (ny * nz)) / ny;)\n+\n+ AMREX_D_TERM(r[0] = (0.5+ix_part)/nx;,\n+ r[1] = (0.5+iy_part)/ny;,\n+ r[2] = (0.5+iz_part)/nz;)\n }\n \n class TestParticleContainer\n@@ -58,19 +68,19 @@ class TestParticleContainer\n for (IntVect iv = tile_box.smallEnd(); iv <= tile_box.bigEnd(); tile_box.next(iv))\n {\n for (int i_part=0; i_part<num_ppc;i_part++) {\n- Real r[3];\n+ Real r[AMREX_SPACEDIM];\n get_position_unit_cell(r, a_num_particles_per_cell, i_part);\n \n- ParticleReal x = static_cast<ParticleReal> (plo[0] + (iv[0] + r[0])*dx[0]);\n- ParticleReal y = static_cast<ParticleReal> (plo[1] + (iv[1] + r[1])*dx[1]);\n- ParticleReal z = static_cast<ParticleReal> (plo[2] + (iv[2] + r[2])*dx[2]);\n+ AMREX_D_TERM(ParticleReal x = static_cast<ParticleReal> (plo[0] + (iv[0] + r[0])*dx[0]);,\n+ ParticleReal y = static_cast<ParticleReal> (plo[1] + (iv[1] + r[1])*dx[1]);,\n+ ParticleReal z = static_cast<ParticleReal> (plo[2] + (iv[2] + r[2])*dx[2]);)\n \n ParticleType p;\n p.id() = ParticleType::NextID();\n p.cpu() = ParallelDescriptor::MyProc();\n- p.pos(0) = x;\n- p.pos(1) = y;\n- p.pos(2) = z;\n+ AMREX_D_TERM(p.pos(0) = x;,\n+ p.pos(1) = y;,\n+ p.pos(2) = z;)\n \n for (int i = 0; i < NSR; ++i) p.rdata(i) = i;\n for (int i = 0; i < NSI; ++i) p.idata(i) = i;\n@@ -225,7 +235,7 @@ void testReduce ()\n return {a, b, c};\n }, reduce_ops);\n \n- AMREX_ALWAYS_ASSERT(amrex::get<0>(r) == 16777216.0);\n+ AMREX_ALWAYS_ASSERT(amrex::get<0>(r) == amrex::Real(std::pow(256, AMREX_SPACEDIM)));\n AMREX_ALWAYS_ASSERT(amrex::get<1>(r) == 2.0);\n AMREX_ALWAYS_ASSERT(amrex::get<2>(r) == 1);\n }\ndiff --git a/Tests/Particles/ParticleTransformations/main.cpp b/Tests/Particles/ParticleTransformations/main.cpp\nindex 0931165200f..e60a6762f93 100644\n--- a/Tests/Particles/ParticleTransformations/main.cpp\n+++ b/Tests/Particles/ParticleTransformations/main.cpp\n@@ -12,17 +12,25 @@ static constexpr int NAI = 2;\n \n void get_position_unit_cell(Real* r, const IntVect& nppc, int i_part)\n {\n- int nx = nppc[0];\n- int ny = nppc[1];\n- int nz = nppc[2];\n-\n- int ix_part = i_part/(ny * nz);\n- int iy_part = (i_part % (ny * nz)) % ny;\n- int iz_part = (i_part % (ny * nz)) / ny;\n-\n- r[0] = (0.5+ix_part)/nx;\n- r[1] = (0.5+iy_part)/ny;\n- r[2] = (0.5+iz_part)/nz;\n+ int nx = nppc[0];\n+#if AMREX_SPACEDIM >= 2\n+ int ny = nppc[1];\n+#else\n+ int ny = 1;\n+#endif\n+#if AMREX_SPACEDIM == 3\n+ int nz = nppc[2];\n+#else\n+ int nz = 1;\n+#endif\n+\n+ AMREX_D_TERM(int ix_part = i_part/(ny * nz);,\n+ int iy_part = (i_part % (ny * nz)) % ny;,\n+ int iz_part = (i_part % (ny * nz)) / ny;)\n+\n+ AMREX_D_TERM(r[0] = (0.5+ix_part)/nx;,\n+ r[1] = (0.5+iy_part)/ny;,\n+ r[2] = (0.5+iz_part)/nz;)\n }\n \n class TestParticleContainer\n@@ -64,16 +72,16 @@ class TestParticleContainer\n Real r[3];\n get_position_unit_cell(r, a_num_particles_per_cell, i_part);\n \n- ParticleReal x = static_cast<ParticleReal> (plo[0] + (iv[0] + r[0])*dx[0]);\n- ParticleReal y = static_cast<ParticleReal> (plo[1] + (iv[1] + r[1])*dx[1]);\n- ParticleReal z = static_cast<ParticleReal> (plo[2] + (iv[2] + r[2])*dx[2]);\n+ AMREX_D_TERM(ParticleReal x = static_cast<ParticleReal> (plo[0] + (iv[0] + r[0])*dx[0]);,\n+ ParticleReal y = static_cast<ParticleReal> (plo[1] + (iv[1] + r[1])*dx[1]);,\n+ ParticleReal z = static_cast<ParticleReal> (plo[2] + (iv[2] + r[2])*dx[2]);)\n \n ParticleType p;\n p.id() = ParticleType::NextID();\n p.cpu() = ParallelDescriptor::MyProc();\n- p.pos(0) = x;\n- p.pos(1) = y;\n- p.pos(2) = z;\n+ AMREX_D_TERM(p.pos(0) = x;,\n+ p.pos(1) = y;,\n+ p.pos(2) = z;)\n \n for (int i = 0; i < NSR; ++i) p.rdata(i) = i;\n for (int i = 0; i < NSI; ++i) p.idata(i) = i;\n", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}47{"question_id": "MSB_AMReX-Codes_amrex_pr2583", "question_type": "multi_swe_bench", "description": "Update locations for tutorials and minor formatting. (AMReX-Codes/amrex#2583)", "content": {"org": "AMReX-Codes", "repo": "amrex", "pr_number": 2583, "issue_title": "Update locations for tutorials and minor formatting.", "issue_body": "## Summary\r\nUpdate remaining locations for tutorials referenced in the docs. \r\n\r\n## Additional background\r\nFollow up to #2576\r\n## Checklist\r\n\r\nThe proposed changes:\r\n- [ ] fix a bug or incorrect behavior in AMReX\r\n- [ ] add new capabilities to AMReX\r\n- [ ] changes answers in the test suite to more than roundoff level\r\n- [ ] are likely to significantly affect the results of downstream AMReX users\r\n- [x] include documentation in the code and/or rst files, if appropriate\r\n", "base_commit": "e3b1468b8f16d11eebf4b10cca32829c78fb5d35", "resolved_issues": [{"number": 2576, "title": "Update locations from `amrex/Tutorials`", "body": "## Summary\r\nMany tutorials are listed as residing at `amrex/Tutorials/...`. They have been updated to their new\r\nlocation at `amrex-tutorials/ExampleCodes/...`.\r\n\r\n## Additional background\r\nThe updated locations cause straightforward changes to the Catalyst and Libsim tutorials in Visualizations.rst (line 901 and 927). I made these changes but I did not retest the tutorials. I'll put this on my list, and update if any changes are necessary. \r\n\r\n## Checklist\r\n\r\nThe proposed changes:\r\n- [ ] fix a bug or incorrect behavior in AMReX\r\n- [ ] add new capabilities to AMReX\r\n- [ ] changes answers in the test suite to more than roundoff level\r\n- [ ] are likely to significantly affect the results of downstream AMReX users\r\n- [x] include documentation in the code and/or rst files, if appropriate\r\n"}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/amrex-codes_m_amrex:pr-2583", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/Docs/sphinx_documentation/source/Fortran.rst b/Docs/sphinx_documentation/source/Fortran.rst\nindex cd613bd6d85..ddfcd755d54 100644\n--- a/Docs/sphinx_documentation/source/Fortran.rst\n+++ b/Docs/sphinx_documentation/source/Fortran.rst\n@@ -384,7 +384,7 @@ interfaces:\n character(c_char), intent(in), value :: tagval, clearval\n end subroutine amrex_error_est_proc\n \n-``Tutorials/Amr/Advection_F/Source/my_amr_mod.F90`` shows an\n+``amrex-tutorials/ExampleCodes/FortranInterface/Advection_F/Source/my_amr_mod.F90`` shows an\n example of the setup process. The user provided\n :fortran:`procedure(amrex_error_est_proc)` has a tags argument that\n is of type :fortran:`c_ptr` and its value is a pointer to a\n@@ -400,7 +400,7 @@ The module :fortran:`amrex_fillpatch_module` provides interface to\n C++ functions :cpp:`FillPatchSinglelevel` and :cpp:`FillPatchTwoLevels`. To use\n it, the application code needs to provide procedures for interpolation and\n filling physical boundaries. See\n-``Tutorials/Amr/Advection_F/Source/fillpatch_mod.F90`` for an example.\n+``amrex-tutorials/ExampleCodes/FortranInterface/Advection_F/Source/fillpatch_mod.F90`` for an example.\n \n Module :fortran:`amrex_fluxregister_module` provides interface to\n :cpp:`FluxRegister` (see the section on :ref:`sec:amrcore:fluxreg`). Its usage\n@@ -418,7 +418,7 @@ between levels. Therefore, grids in AMReX in general cannot be represented by\n trees. Nevertheless, octree type grids are supported via Fortran interface,\n because grids are more general than octree grids. A tutorial example using\n amrex_octree_module ( ``amrex/Src/F_Interfaces/Octree/AMReX_octree_mod.f90``) is\n-available at ``amrex-tutorials/Amr/Advection_octree_F/``. Procedures\n+available at ``amrex-tutorials/ExampleCodes/FortranInterface/Advection_F/Advection_octree_F/``. Procedures\n :fortran:`amrex_octree_init` and :fortran:`amrex_octree_finalize` must be\n called as follows,\n \ndiff --git a/Docs/sphinx_documentation/source/GPU.rst b/Docs/sphinx_documentation/source/GPU.rst\nindex 37bd255073f..7c8863c2c3c 100644\n--- a/Docs/sphinx_documentation/source/GPU.rst\n+++ b/Docs/sphinx_documentation/source/GPU.rst\n@@ -158,8 +158,8 @@ For example, ``COMP=pgi`` alone will compile C/C++ codes with NVCC/GCC\n and Fortran codes with PGI, and link with PGI. Using ``COMP=pgi`` and\n ``NVCC_HOST_COMP=pgi`` will compile C/C++ codes with PGI and NVCC/PGI.\n \n-You can use ``Tutorials/Basic/HelloWorld_C`` to test your programming\n-environment. For example, building with:\n+You can use ``amrex-tutorials/ExampleCodes/Basic/HelloWorld_C/``\n+to test your programming environment. For example, building with:\n \n .. highlight:: console\n \ndiff --git a/Docs/sphinx_documentation/source/GettingStarted.rst b/Docs/sphinx_documentation/source/GettingStarted.rst\nindex 05af8292561..ba819cb2c99 100644\n--- a/Docs/sphinx_documentation/source/GettingStarted.rst\n+++ b/Docs/sphinx_documentation/source/GettingStarted.rst\n@@ -48,13 +48,13 @@ AMReX.H). All AMReX C++ functions are in the :cpp:`amrex` namespace.\n Building the Code\n -----------------\n \n-You build the code in the ``amrex-tutorials/Tutorials/Basic/HelloWorld_C/`` directory.\n+You build the code in the ``amrex-tutorials/ExampleCodes/Basic/HelloWorld_C/`` directory.\n Typing ``make`` will start the compilation process and result in an executable\n named ``main3d.gnu.DEBUG.ex``. The name shows that the GNU compiler with debug\n options set by AMReX is used. It also shows that the executable is built for\n 3D. Although this simple example code is dimension independent, dimensionality\n does matter for all non-trivial examples. The build process can be adjusted by\n-modifying the ``amrex-tutorials/Tutorials/Basic/HelloWorld_C/GNUmakefile`` file. More\n+modifying the ``amrex-tutorials/ExampleCodes/Basic/HelloWorld_C/GNUmakefile`` file. More\n details on how to build AMReX can be found in :ref:`Chap:BuildingAMReX`.\n \n Running the Code\ndiff --git a/Docs/sphinx_documentation/source/LinearSolvers.rst b/Docs/sphinx_documentation/source/LinearSolvers.rst\nindex a68336a200a..6a08c0dc5a7 100644\n--- a/Docs/sphinx_documentation/source/LinearSolvers.rst\n+++ b/Docs/sphinx_documentation/source/LinearSolvers.rst\n@@ -676,23 +676,23 @@ An example (implemented in the ``MultiComponent`` tutorial) might be:\n .. _fig::refluxfreecoarsefine:\n \n .. figure:: ./LinearSolvers/refluxfreecoarsefine.png\n- :height: 2cm\n- :align: center\n+ :height: 4cm\n+ :align: center\n \n- : Reflux-free coarse-fine boundary update.\n- Level 2 ghost nodes (small dark blue) are interpolated from coarse boundary.\n- Level 1 ghost nodes are updated during the relaxation along with all the other interior fine nodes.\n- Coarse nodes (large blue) on the coarse/fine boundary are updated by restricting with interior nodes\n- and the first level of ghost nodes.\n- Coarse nodes underneath level 2 ghost nodes are not updated.\n- The remaining coarse nodes are updates by restriction.\n+ Reflux-free coarse-fine boundary update.\n+ Level 2 ghost nodes (small dark blue) are interpolated from coarse boundary.\n+ Level 1 ghost nodes are updated during the relaxation along with all the other interior fine nodes.\n+ Coarse nodes (large blue) on the coarse/fine boundary are updated by restricting with interior nodes\n+ and the first level of ghost nodes.\n+ Coarse nodes underneath level 2 ghost nodes are not updated.\n+ The remaining coarse nodes are updates by restriction.\n \n The MC nodal operator can inherit from the ``MCNodeLinOp`` class.\n ``Fapply``, ``Fsmooth``, and ``Fflux`` must update level 1 ghost nodes that are inside the domain.\n `interpolation` and `restriction` can be implemented as usual.\n `reflux` is a straightforward restriction from fine to coarse, using level 1 ghost nodes for restriction as described above.\n \n- See ``Tutorials/LinearSolvers/MultiComponent`` for a complete working example.\n+See ``amrex-tutorials/ExampleCodes/LinearSolvers/MultiComponent`` for a complete working example.\n \n .. solver reuse\n \ndiff --git a/Docs/sphinx_documentation/source/Visualization.rst b/Docs/sphinx_documentation/source/Visualization.rst\nindex 6de66a045f4..27a058ae5d0 100644\n--- a/Docs/sphinx_documentation/source/Visualization.rst\n+++ b/Docs/sphinx_documentation/source/Visualization.rst\n@@ -426,7 +426,7 @@ we will assume a single vector has been stored as three separate variables,\n by its magnitude. To do this, look under the Scale heading, select the\n vector value as the Scale Array and select Scale by Magnitude.\n \n- Two adjust the number and location of vectors displayed, one may alter the\n+ To adjust the number and location of vectors displayed, one may alter the\n settings under the Masking heading.\n \n .. figure:: ./Visualization/ParaView_vectorfield.png\n"}, "test": {"test_patch": "diff --git a/Docs/sphinx_documentation/source/Testing.rst b/Docs/sphinx_documentation/source/Testing.rst\nindex 573ed9a3aa8..b7e32c9477b 100644\n--- a/Docs/sphinx_documentation/source/Testing.rst\n+++ b/Docs/sphinx_documentation/source/Testing.rst\n@@ -13,7 +13,7 @@ quickly on every commit. For more extensive testing, we rely on the nightly regr\n Nightly Regression Testing\n ==========================\n \n-Each night, we automically run a suite of tests, both on AMReX itself, and on a most of the major\n+Each night, we automatically run a suite of tests, both on AMReX itself, and on a most of the major\n application codes that use it as a framework. We use an in-house test runner script to manage this\n operation, originally developed by Michael Zingale for the Castro code, and later expanded to other\n application codes as well. The results for each night are collected and stored on a web page; see\n@@ -23,13 +23,15 @@ Running the test suite locally\n ==============================\n \n The test suite is mostly used internally by AMReX developers. However,\n-f you are making a pull request to AMReX, it can be useful to run the test suite\n-on your local machine, to reduce the liklihood that your changes break some existing functionality.\n-To run the test suite on locally, you must first obtain a copy of the test runner source, available\n+if you are making a pull request to AMReX, it can be useful to run the test suite\n+on your local machine to reduce the liklihood that your changes break some existing functionality.\n+To run the test suite locally, you must first obtain a copy of the test runner source, available\n on Github here: https://github.com/AMReX-Codes/regression_testing. The test runner requires Python\n-version 2.7 or greater.\n+version 2.7 or greater. Additional information on the test suite software can be found at,\n+https://amrex-codes.github.io/regression_testing/.\n \n-Next, you need a configuration file that defines which tests to run, which amrex repository to test,\n+After obtaining the code, you will need a configuration file that defines which tests to run, which\n+amrex repository to test,\n which branch to use, etc. A sample configuration file for AMReX is distributed with the amrex source\n code at :cpp:`amrex/Tools/RegressionTesting/AMReX-tests.ini`. You will need to modify a few of the entries\n to, for example, point the test runner to the clone of amrex on your local machine. Entries you will\n@@ -56,24 +58,24 @@ The test runner is a Python script and can be invoked like so:\n \n ::\n \n- python regtest.py <options> AMReX-Tests.ini\n+ python regtest.py <options> AMReX-tests.ini\n \n Before you can use it, you must first generate a set of \"benchmarks\" - i.e. known \"good\" answers to the\n tests that will be run. If you are testing a pull request, you can generate these by running the script\n-with the a recent version of the :cpp:`development` branch of AMReX. You can generate the benchmarks like so:\n+with a recent version of the :cpp:`development` branch of AMReX. You can generate the benchmarks like so:\n \n ::\n \n- python regtest.py --make_benchmarks 'generating initial benchmarks' AMReX-Tests.ini\n+ python regtest.py --make_benchmarks 'generating initial benchmarks' AMReX-tests.ini\n \n-Once that is finished, you can switch over to the branch you want to test in :cpp:`AMReX-Tests.ini`, and then\n+Once that is finished, you can switch over to the branch you want to test in :cpp:`AMReX-tests.ini`, and then\n re-run the script without the :cpp:`--make_benchmarks` option:\n \n ::\n \n- python regtest.py --make_benchmarks 'generating initial benchmarks' AMReX-Tests.ini\n+ python regtest.py --make_benchmarks 'generating initial benchmarks' AMReX-tests.ini\n \n-The script will generate a set of html pages in the directory specified in your :cpp:`AMReX-Tests.ini`\n+The script will generate a set of html pages in the directory specified in your :cpp:`AMReX-tests.ini`\n file that you can examine using the browser of your choice.\n \n For a complete set of script options, run\n@@ -86,25 +88,25 @@ A particularly useful option lets you run just a subset of the complete test sui\n \n ::\n \n- python regtest.py --single_test <TestName> AMReX-Tests.ini\n+ python regtest.py --single_test <TestName> AMReX-tests.ini\n \n To run an enumerated list of tests, do:\n \n ::\n \n- python regtest.py --tests '<TestName1> <TestName2> <TestName3>' AMReX-Tests.ini\n+ python regtest.py --tests '<TestName1> <TestName2> <TestName3>' AMReX-tests.ini\n \n \n Adding a new test\n =================\n \n-New tests can be added to the suite by modifying the :cpp:`AMReX-Tests.ini` file. The easiest thing to\n+New tests can be added to the suite by modifying the :cpp:`AMReX-tests.ini` file. The easiest thing to\n do is start from an existing test and modify it. For example, this entry:\n \n ::\n \n [MLMG_FI_PoisCom]\n- buildDir = Tutorials/LinearSolvers/ABecLaplacian_F\n+ buildDir = Tests/LinearSolvers/ABecLaplacian_F\n inputFile = inputs-rt-poisson-com\n dim = 3\n restartTest = 0\n", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}48{"question_id": "MSB_AMReX-Codes_amrex_pr2813", "question_type": "multi_swe_bench", "description": "CMake: 3.17+ (AMReX-Codes/amrex#2813)", "content": {"org": "AMReX-Codes", "repo": "amrex", "pr_number": 2813, "issue_title": "CMake: 3.17+", "issue_body": "## Summary\r\n\r\nWe are using `find_package(CUDAToolkit ...)` now, which is only supported in CMake 3.17+.\r\nFollow-up to #2757\r\n\r\n## Additional background\r\n\r\nTechnically, we want to go to 3.20+ soon as well, so that we can drop the old CUDA code paths that we used to forward device flags and CUDA architectures.\r\n\r\n## Checklist\r\n\r\nThe proposed changes:\r\n- [ ] fix a bug or incorrect behavior in AMReX\r\n- [ ] add new capabilities to AMReX\r\n- [ ] changes answers in the test suite to more than roundoff level\r\n- [ ] are likely to significantly affect the results of downstream AMReX users\r\n- [ ] include documentation in the code and/or rst files, if appropriate\r\n", "base_commit": "8a1c76c0af8961db3168d577898a6d0edaa55891", "resolved_issues": [{"number": 2757, "title": "CUDA On Cray: More Robust w/o Wrapper", "body": "## Summary\r\n\r\nSearching for `curand` explicitly (required by default by AMReX) makes HPE/Cray builds more robust when we build w/o compiler wrappers, e.g., if files are distributed in a non-standard layout.\r\n\r\n## Additional background\r\n\r\nhttps://gitlab.kitware.com/cmake/cmake/-/merge_requests/7247\r\n\r\nCompile error on Perlmutter with `g++` and `nvcc` as compilers was:\r\n```\r\n from /global/homes/a/ahuebl/src/amrex/Src/Base/AMReX_Utility.cpp:4:\r\n/global/homes/a/ahuebl/src/amrex/Src/Base/AMReX_RandomEngine.H:14:10: fatal error: curand.h: No such file or directory\r\n 14 | #include <curand.h>\r\n | ^~~~~~~~~~\r\n```\r\n\r\n## Checklist\r\n\r\nThe proposed changes:\r\n- [ ] fix a bug or incorrect behavior in AMReX\r\n- [ ] add new capabilities to AMReX\r\n- [ ] changes answers in the test suite to more than roundoff level\r\n- [ ] are likely to significantly affect the results of downstream AMReX users\r\n- [ ] include documentation in the code and/or rst files, if appropriate\r\n"}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/amrex-codes_m_amrex:pr-2813", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/CMakeLists.txt b/CMakeLists.txt\nindex f957b2ef5b9..773058369f7 100644\n--- a/CMakeLists.txt\n+++ b/CMakeLists.txt\n@@ -1,4 +1,4 @@\n-cmake_minimum_required(VERSION 3.14)\n+cmake_minimum_required(VERSION 3.17)\n \n #\n # Allow for MSVC Runtime library controls\ndiff --git a/Docs/sphinx_documentation/source/BuildingAMReX.rst b/Docs/sphinx_documentation/source/BuildingAMReX.rst\nindex f5b8b263a4e..7b3273bf874 100644\n--- a/Docs/sphinx_documentation/source/BuildingAMReX.rst\n+++ b/Docs/sphinx_documentation/source/BuildingAMReX.rst\n@@ -728,7 +728,7 @@ You can tell CMake to look for the AMReX library in non-standard paths by settin\n ``AMReX_ROOT`` to point to the AMReX installation directory or by adding\n ``-DAMReX_ROOT=<path/to/amrex/installation/directory>`` to the ``cmake`` invocation.\n More details on ``find_package`` can be found\n-`here <https://cmake.org/cmake/help/v3.14/command/find_package.html>`_.\n+`here <https://cmake.org/cmake/help/v3.17/command/find_package.html>`_.\n \n .. _sec:build:windows:\n \ndiff --git a/Docs/sphinx_documentation/source/BuildingAMReX_Chapter.rst b/Docs/sphinx_documentation/source/BuildingAMReX_Chapter.rst\nindex a6b246ee155..dd61bb254d3 100644\n--- a/Docs/sphinx_documentation/source/BuildingAMReX_Chapter.rst\n+++ b/Docs/sphinx_documentation/source/BuildingAMReX_Chapter.rst\n@@ -23,7 +23,7 @@ Fortran compiler that supports the Fortran 2003 standard, and a C\n compiler that supports the C99 standard. Prerequisites for building\n with GNU Make include Python (>= 2.7, including 3) and standard tools\n available in any Unix-like environments (e.g., Perl and sed). For\n-building with CMake, the minimal requirement is version 3.14.\n+building with CMake, the minimal requirement is version 3.17.\n \n Please note that we fully support AMReX for Linux systems in general and on the\n DOE supercomputers (e.g. Cori, Summit) in particular. Many of our users do build\ndiff --git a/Tools/CMake/AMReXThirdPartyLibraries.cmake b/Tools/CMake/AMReXThirdPartyLibraries.cmake\nindex e8be52dc173..24dd8df11d2 100644\n--- a/Tools/CMake/AMReXThirdPartyLibraries.cmake\n+++ b/Tools/CMake/AMReXThirdPartyLibraries.cmake\n@@ -82,7 +82,14 @@ if (AMReX_HYPRE)\n find_package(HYPRE 2.20.0 REQUIRED)\n if(AMReX_CUDA)\n find_package(CUDAToolkit REQUIRED)\n+\n+ # mandatory CUDA dependencies: cuSPARSE, cuRAND\n target_link_libraries(amrex PUBLIC CUDA::cusparse CUDA::curand)\n+\n+ # nvToolsExt: if tiny profiler or base profiler are on.\n+ if (AMReX_TINY_PROFILE OR AMReX_BASE_PROFILE)\n+ target_link_libraries(amrex PUBLIC CUDA::nvToolsExt)\n+ endif ()\n endif()\n target_link_libraries( amrex PUBLIC HYPRE )\n endif ()\ndiff --git a/Tools/CMake/AMReX_Config.cmake b/Tools/CMake/AMReX_Config.cmake\nindex 22429ce2651..6ed841cfd59 100644\n--- a/Tools/CMake/AMReX_Config.cmake\n+++ b/Tools/CMake/AMReX_Config.cmake\n@@ -49,7 +49,7 @@ function (configure_amrex)\n target_compile_features(amrex PUBLIC $<IF:$<STREQUAL:$<PLATFORM_ID>,Windows>,cxx_std_17,cxx_std_14>)\n endif ()\n \n- if (AMReX_CUDA AND (CMAKE_VERSION VERSION_GREATER_EQUAL 3.17) )\n+ if (AMReX_CUDA)\n set_target_properties(amrex PROPERTIES CUDA_EXTENSIONS OFF)\n # minimum: C++14 on Linux, C++17 on Windows\n target_compile_features(amrex PUBLIC $<IF:$<STREQUAL:$<PLATFORM_ID>,Windows>,cuda_std_17,cuda_std_14>)\n@@ -132,8 +132,9 @@ function (configure_amrex)\n endif ()\n \n #\n- # Add manually nvToolsExt if tiny profiler or base profiler are on.n\n+ # Add manually nvToolsExt if tiny profiler or base profiler are on.\n # CMake >= 3.17 provides the module FindCUDAToolkit to do this natively.\n+ # TODO: Modernize me, now that we require CMake 3.17+.\n #\n if (AMReX_TINY_PROFILE OR AMReX_BASE_PROFILE )\n find_library(LIBNVTOOLSEXT nvToolsExt PATHS ${CMAKE_CUDA_IMPLICIT_LINK_DIRECTORIES})\n"}, "test": {"test_patch": "diff --git a/Tests/CMakeTestInstall/CMakeLists.txt b/Tests/CMakeTestInstall/CMakeLists.txt\nindex 382d1911e5a..fdac1442cac 100644\n--- a/Tests/CMakeTestInstall/CMakeLists.txt\n+++ b/Tests/CMakeTestInstall/CMakeLists.txt\n@@ -3,7 +3,7 @@\n # building and running the code\n # in Tests/Amr/Advection_AmrCore/\n #\n-cmake_minimum_required(VERSION 3.14)\n+cmake_minimum_required(VERSION 3.17)\n \n project(amrex-test-install)\n \ndiff --git a/Tests/SpackSmokeTest/CMakeLists.txt b/Tests/SpackSmokeTest/CMakeLists.txt\nindex 4b1780f2534..4882f5bbd25 100644\n--- a/Tests/SpackSmokeTest/CMakeLists.txt\n+++ b/Tests/SpackSmokeTest/CMakeLists.txt\n@@ -6,7 +6,7 @@\n # against a currently installed version of AMReX. The resulting\n # executable can then be ran to test functionality.\n \n-cmake_minimum_required(VERSION 3.14)\n+cmake_minimum_required(VERSION 3.17)\n \n project(amrex-test-install)\n \n", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}49{"question_id": "MSB_AMReX-Codes_amrex_pr3142", "question_type": "multi_swe_bench", "description": "Fix nl test (AMReX-Codes/amrex#3142)", "content": {"org": "AMReX-Codes", "repo": "amrex", "pr_number": 3142, "issue_title": "Fix nl test", "issue_body": "This fixes a bug introduced in PR #3060 related to building neighbor lists between particles of different types. I also made it so that CI tests would have caught this bug. \r\n\r\nCloses #3127 \r\n\r\nThe proposed changes:\r\n- [x] fix a bug or incorrect behavior in AMReX\r\n- [ ] add new capabilities to AMReX\r\n- [ ] changes answers in the test suite to more than roundoff level\r\n- [ ] are likely to significantly affect the results of downstream AMReX users\r\n- [ ] include documentation in the code and/or rst files, if appropriate\r\n", "base_commit": "0c444b898f8abc1f1f7dd81cb06e2b29faabb935", "resolved_issues": [{"number": 3060, "title": "Polydisperse neighbor search algorithm", "body": "## Summary\r\nNew functionality for building the particle neighbor list with multiple grids. The multi-grid approach can provide significant speed up with polydisperse particle-laden flows.\r\n\r\n## Additional background\r\nAlgorithm based upon: \r\nShire, T., Hanley, K.J. & Stratford, K. DEM simulations of polydisperse media: efficient contact detection applied to investigate the quasi-static limit. Comp. Part. Mech. 8, 653\u2013663 (2021). https://doi.org/10.1007/s40571-020-00361-2\r\n\r\n## Checklist\r\n1. Verify correctness with standard single-grid (SG) neighbor search (MFiX regtests).\r\n2. Test speed with SG neighbor search (Perlmutter w/ canonical sim)\r\n3. Verify new multi-grid (MG) gives same results as SG (new polydisperse test)\r\n4. Document speed up of MG vs SG for polydisperse test\r\n\r\nThe proposed changes:\r\n- [ ] fix a bug or incorrect behavior in AMReX\r\n- [x] add new capabilities to AMReX\r\n- [ ] changes answers in the test suite to more than roundoff level\r\n- [ ] are likely to significantly affect the results of downstream AMReX users\r\n- [ ] include documentation in the code and/or rst files, if appropriate\r\n"}, {"number": 3127, "title": "Tests/Particles/NeighborList compilation error", "body": "```\r\n../../..//Src/Particle/AMReX_NeighborList.H(310): error: a value of type \"amrex::Particle<0, 1> *\" cannot be assigned to an entity of type \"amrex::Particle<0, 0> *\"\r\n detected during:\r\n instantiation of \"void amrex::NeighborList<ParticleType>::build(SrcTile &, TargetTile &, CheckPair &&, const amrex::Gpu::DeviceVector<int> &, const amrex::Gpu::D\r\neviceVector<amrex::GpuArray<amrex::Real, 3U>> &, const amrex::Gpu::DeviceVector<amrex::GpuArray<amrex::Real, 3U>> &, const amrex::Gpu::DeviceVector<amrex::Dim3> &, const amr\r\nex::Gpu::DeviceVector<amrex::Dim3> &, int, int, int *) [with ParticleType=amrex::Particle<0, 0>, SrcTile=const amrex::ParticleTile<0, 0, 0, 0, amrex::DefaultAllocator>, Targ\r\netTile=amrex::ParticleTile<0, 1, 0, 0, amrex::DefaultAllocator>, CheckPair=CheckPair]\" \r\n../../..//Src/Particle/AMReX_NeighborParticlesI.H(833): here\r\n instantiation of \"void amrex::NeighborParticleContainer<NStructReal, NStructInt, NArrayReal, NArrayInt>::buildNeighborList(CheckPair &&, OtherPCType &, amrex::Ve\r\nctor<std::map<std::pair<int, int>, amrex::NeighborList<OtherPCType::ParticleType>, std::less<std::pair<int, int>>, std::allocator<std::pair<const std::pair<int, int>, amrex:\r\n:NeighborList<OtherPCType::ParticleType>>>>, std::allocator<std::map<std::pair<int, int>, amrex::NeighborList<OtherPCType::ParticleType>, std::less<std::pair<int, int>>, std\r\n::allocator<std::pair<const std::pair<int, int>, amrex::NeighborList<OtherPCType::ParticleType>>>>>> &, __nv_bool) [with NStructReal=0, NStructInt=0, NArrayReal=0, NArrayInt\r\n=0, CheckPair=CheckPair, OtherPCType=PCType2]\" \r\nmain.cpp(131): here\r\n\r\n../../..//Src/Particle/AMReX_NeighborList.H(331): error: no instance of overloaded function \"amrex::DenseBins<T>::build [with T=amrex::Particle<0, 0>]\" matches the argument \r\nlist\r\n argument types are: (const size_t, amrex::Particle<0, 1> *const, int, amrex::BinMapper)\r\n object type is: amrex::DenseBins<amrex::Particle<0, 0>>\r\n detected during:\r\n instantiation of \"void amrex::NeighborList<ParticleType>::build(SrcTile &, TargetTile &, CheckPair &&, const amrex::Gpu::DeviceVector<int> &, const amrex::Gpu::D\r\neviceVector<amrex::GpuArray<amrex::Real, 3U>> &, const amrex::Gpu::DeviceVector<amrex::GpuArray<amrex::Real, 3U>> &, const amrex::Gpu::DeviceVector<amrex::Dim3> &, const amr\r\nex::Gpu::DeviceVector<amrex::Dim3> &, int, int, int *) [with ParticleType=amrex::Particle<0, 0>, SrcTile=const amrex::ParticleTile<0, 0, 0, 0, amrex::DefaultAllocator>, Targ\r\netTile=amrex::ParticleTile<0, 1, 0, 0, amrex::DefaultAllocator>, CheckPair=CheckPair]\" \r\n../../..//Src/Particle/AMReX_NeighborParticlesI.H(833): here\r\n instantiation of \"void amrex::NeighborParticleContainer<NStructReal, NStructInt, NArrayReal, NArrayInt>::buildNeighborList(CheckPair &&, OtherPCType &, amrex::Ve\r\nctor<std::map<std::pair<int, int>, amrex::NeighborList<OtherPCType::ParticleType>, std::less<std::pair<int, int>>, std::allocator<std::pair<const std::pair<int, int>, amrex:\r\n:NeighborList<OtherPCType::ParticleType>>>>, std::allocator<std::map<std::pair<int, int>, amrex::NeighborList<OtherPCType::ParticleType>, std::less<std::pair<int, int>>, std\r\n::allocator<std::pair<const std::pair<int, int>, amrex::NeighborList<OtherPCType::ParticleType>>>>>> &, __nv_bool) [with NStructReal=0, NStructInt=0, NArrayReal=0, NArrayInt\r\n=0, CheckPair=CheckPair, OtherPCType=PCType2]\" \r\nmain.cpp(131): here\r\n```"}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/amrex-codes_m_amrex:pr-3142", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/Src/Particle/AMReX_NeighborParticlesI.H b/Src/Particle/AMReX_NeighborParticlesI.H\nindex 696553aaa47..ed2e1844725 100644\n--- a/Src/Particle/AMReX_NeighborParticlesI.H\n+++ b/Src/Particle/AMReX_NeighborParticlesI.H\n@@ -828,9 +828,9 @@ buildNeighborList (CheckPair&& check_pair, OtherPCType& other,\n dxi_v.push_back(geom.InvCellSizeArray());\n plo_v.push_back(geom.ProbLoArray());\n \n- m_neighbor_list[lev][index].build(ptile, other_ptile,\n- std::forward<CheckPair>(check_pair),\n- off_bins_v, dxi_v, plo_v, lo_v, hi_v, ng);\n+ neighbor_lists[lev][index].build(ptile, other_ptile,\n+ std::forward<CheckPair>(check_pair),\n+ off_bins_v, dxi_v, plo_v, lo_v, hi_v, ng);\n }\n }\n }\n"}, "test": {"test_patch": "diff --git a/Tests/Particles/NeighborList/CMakeLists.txt b/Tests/Particles/NeighborList/CMakeLists.txt\nnew file mode 100644\nindex 00000000000..226771586b5\n--- /dev/null\n+++ b/Tests/Particles/NeighborList/CMakeLists.txt\n@@ -0,0 +1,7 @@\n+set(_sources main.cpp)\n+set(_input_files inputs)\n+\n+setup_test(_sources _input_files)\n+\n+unset(_sources)\n+unset(_input_files)\ndiff --git a/Tests/Particles/NeighborList/main.cpp b/Tests/Particles/NeighborList/main.cpp\nindex 3b06653b9f9..b7860d7f2a3 100644\n--- a/Tests/Particles/NeighborList/main.cpp\n+++ b/Tests/Particles/NeighborList/main.cpp\n@@ -65,9 +65,9 @@ void addParticles (PCType1& pc1, PCType2& pc2)\n auto& ptile1 = pc1.DefineAndReturnParticleTile(0, 0, 0);\n {\n PType1 p;\n- p.pos(0) = 12.0;\n- p.pos(1) = 12.0;\n- p.pos(2) = 12.0;\n+ AMREX_D_TERM(p.pos(0) = 12.0;,\n+ p.pos(1) = 12.0;,\n+ p.pos(2) = 12.0;)\n p.id() = PType1::NextID();\n p.cpu() = ParallelDescriptor::MyProc();\n ptile1.push_back(p);\n@@ -76,9 +76,9 @@ void addParticles (PCType1& pc1, PCType2& pc2)\n auto& ptile2 = pc2.DefineAndReturnParticleTile(0, 0, 0);\n {\n PType2 p;\n- p.pos(0) = 12.0;\n- p.pos(1) = 13.0;\n- p.pos(2) = 12.0;\n+ AMREX_D_TERM(p.pos(0) = 12.0;,\n+ p.pos(1) = 13.0;,\n+ p.pos(2) = 12.0;)\n p.id() = PType2::NextID();\n p.cpu() = ParallelDescriptor::MyProc();\n p.idata(0) = 1;\n", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}50{"question_id": "MSB_AMReX-Codes_amrex_pr3325", "question_type": "multi_swe_bench", "description": "Port InitRandom for pure SoA (AMReX-Codes/amrex#3325)", "content": {"org": "AMReX-Codes", "repo": "amrex", "pr_number": 3325, "issue_title": "Port InitRandom for pure SoA", "issue_body": "This is useful for porting and testing other features, like Checkpoint / Restart. I've also added a test.\r\n\r\nFollow-up to #2878.\r\n\r\nThe proposed changes:\r\n- [x] fix a bug or incorrect behavior in AMReX\r\n- [x] add new capabilities to AMReX\r\n- [ ] changes answers in the test suite to more than roundoff level\r\n- [ ] are likely to significantly affect the results of downstream AMReX users\r\n- [ ] include documentation in the code and/or rst files, if appropriate\r\n", "base_commit": "b625d63c8bf18ccaec51ea2c942b306d10b4971c", "resolved_issues": [{"number": 2878, "title": "Support SoA-Only Particles", "body": "## Summary\r\n\r\nFurther updates of #2853 where @atmyers and @ax3l can also push to.\r\n\r\n## Upgrade Guide for C++ API Changes\r\n\r\nThese PRs show changes to keep using the *old layout*:\r\n- example in WarpX: https://github.com/ECP-WarpX/WarpX/pull/3848\r\n- example in HiPACE++: https://github.com/Hi-PACE/hipace/pull/921\r\n- example in ImpactX: https://github.com/ECP-WarpX/impactx/pull/342\r\n- example in pyAMReX: https://github.com/AMReX-Codes/pyamrex/pull/119\r\n\r\nThese PRs show changes to *use the new layout* (pure SoA):\r\n- example in WarpX: https://github.com/ECP-WarpX/WarpX/pull/3850\r\n- example in ImpactX: https://github.com/ECP-WarpX/impactx/pull/348\r\n- example in pyAMReX: https://github.com/AMReX-Codes/pyamrex/pull/124\r\n\r\n## Additional background\r\n\r\n## Checklist\r\n\r\nThe proposed changes:\r\n- [ ] fix a bug or incorrect behavior in AMReX\r\n- [x] add new capabilities to AMReX\r\n- [ ] changes answers in the test suite to more than roundoff level\r\n- [ ] are likely to significantly affect the results of downstream AMReX users\r\n- [ ] include documentation in the code and/or rst files, if appropriate\r\n"}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/amrex-codes_m_amrex:pr-3325", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/Src/Particle/AMReX_ParticleInit.H b/Src/Particle/AMReX_ParticleInit.H\nindex 60a20c0e835..28427de32fb 100644\n--- a/Src/Particle/AMReX_ParticleInit.H\n+++ b/Src/Particle/AMReX_ParticleInit.H\n@@ -1046,17 +1046,13 @@ InitRandom (Long icount,\n \n for (Long j = 0; j < icount; j++)\n {\n- ParticleType p;\n+ Particle<0, 0> ptest;\n \n for (int i = 0; i < AMREX_SPACEDIM; i++) {\n- p.pos(i) = pos[j*AMREX_SPACEDIM + i];\n+ ptest.pos(i) = pos[j*AMREX_SPACEDIM + i];\n }\n \n- for (int i = 0; i < NStructReal; i++) {\n- p.rdata(i) = static_cast<ParticleReal>(pdata.real_struct_data[i]);\n- }\n-\n- if (!Where(p, pld)) {\n+ if (!Where(ptest, pld)) {\n amrex::Abort(\"ParticleContainer::InitRandom(): invalid particle\");\n }\n \n@@ -1067,27 +1063,58 @@ InitRandom (Long icount,\n \n if (who == MyProc) {\n \n- // We own it. Add it at the appropriate level.\n- p.id() = ParticleType::NextID();\n- p.cpu() = MyProc;\n+ if constexpr(!ParticleType::is_soa_particle)\n+ {\n+ ParticleType p;\n+ for (int i = 0; i < AMREX_SPACEDIM; i++) {\n+ p.pos(i) = pos[j*AMREX_SPACEDIM + i];\n+ }\n \n- for (int i = 0; i < NStructInt; i++) {\n- p.idata(i) = pdata.int_struct_data[i];\n- }\n+ // We own it. Add it at the appropriate level.\n+ p.id() = ParticleType::NextID();\n+ p.cpu() = MyProc;\n \n- // add the struct\n- host_particles[pld.m_lev][ind].push_back(p);\n+ for (int i = 0; i < NStructInt; i++) {\n+ p.idata(i) = pdata.int_struct_data[i];\n+ }\n \n- // add the real...\n- for (int i = 0; i < NArrayReal; i++) {\n- host_real_attribs[pld.m_lev][ind][i].push_back(static_cast<ParticleReal>(pdata.real_array_data[i]));\n- }\n+ for (int i = 0; i < NStructReal; i++) {\n+ p.rdata(i) = static_cast<ParticleReal>(pdata.real_struct_data[i]);\n+ }\n \n- // ... and int array data\n- for (int i = 0; i < NArrayInt; i++) {\n- host_int_attribs[pld.m_lev][ind][i].push_back(pdata.int_array_data[i]);\n+ // add the struct\n+ host_particles[pld.m_lev][ind].push_back(p);\n+\n+ // add the real...\n+ for (int i = 0; i < NArrayReal; i++) {\n+ host_real_attribs[pld.m_lev][ind][i].push_back(static_cast<ParticleReal>(pdata.real_array_data[i]));\n+ }\n+\n+ // ... and int array data\n+ for (int i = 0; i < NArrayInt; i++) {\n+ host_int_attribs[pld.m_lev][ind][i].push_back(pdata.int_array_data[i]);\n+ }\n+ } else {\n+ for (int i = 0; i < AMREX_SPACEDIM; i++) {\n+ host_real_attribs[pld.m_lev][ind][i].push_back(pos[j*AMREX_SPACEDIM+i]);\n+ }\n+\n+ host_int_attribs[pld.m_lev][ind][0].push_back(ParticleType::NextID());\n+ host_int_attribs[pld.m_lev][ind][1].push_back(MyProc);\n+\n+ host_particles[pld.m_lev][ind];\n+\n+ // add the real...\n+ for (int i = AMREX_SPACEDIM; i < NArrayReal; i++) {\n+ host_real_attribs[pld.m_lev][ind][i].push_back(static_cast<ParticleReal>(pdata.real_array_data[i]));\n+ }\n+\n+ // ... and int array data\n+ for (int i = 2; i < NArrayInt; i++) {\n+ host_int_attribs[pld.m_lev][ind][i].push_back(pdata.int_array_data[i]);\n+ }\n }\n- }\n+ }\n }\n \n for (int host_lev = 0; host_lev < static_cast<int>(host_particles.size()); ++host_lev)\n@@ -1099,11 +1126,20 @@ InitRandom (Long icount,\n \n auto& dst_tile = GetParticles(host_lev)[std::make_pair(grid,tile)];\n auto old_size = dst_tile.GetArrayOfStructs().size();\n- auto new_size = old_size + src_tile.size();\n+ auto new_size = old_size;\n+ if constexpr(!ParticleType::is_soa_particle)\n+ {\n+ new_size += src_tile.size();\n+ } else {\n+ new_size += host_real_attribs[host_lev][std::make_pair(grid,tile)][0].size();\n+ }\n dst_tile.resize(new_size);\n \n- Gpu::copyAsync(Gpu::hostToDevice, src_tile.begin(), src_tile.end(),\n- dst_tile.GetArrayOfStructs().begin() + old_size);\n+ if constexpr(!ParticleType::is_soa_particle)\n+ {\n+ Gpu::copyAsync(Gpu::hostToDevice, src_tile.begin(), src_tile.end(),\n+ dst_tile.GetArrayOfStructs().begin() + old_size);\n+ }\n \n for (int i = 0; i < NArrayReal; ++i) {\n Gpu::copyAsync(Gpu::hostToDevice,\n@@ -1148,7 +1184,7 @@ InitRandom (Long icount,\n host_int_attribs.resize(finestLevel()+1);\n \n for (Long icnt = 0; icnt < M; icnt++) {\n- ParticleType p;\n+ Particle<0, 0> ptest;\n for (int i = 0; i < AMREX_SPACEDIM; i++) {\n do {\n r = amrex::Random();\n@@ -1156,42 +1192,71 @@ InitRandom (Long icount,\n }\n while (static_cast<ParticleReal>(x) < static_cast<ParticleReal>(xlo[i]) || static_cast<ParticleReal>(x) >= static_cast<ParticleReal>(xhi[i]));\n \n- p.pos(i) = static_cast<ParticleReal>(x);\n+ ptest.pos(i) = static_cast<ParticleReal>(x);\n \n- AMREX_ASSERT(p.pos(i) < geom.ProbHi(i));\n+ AMREX_ASSERT(ptest.pos(i) < geom.ProbHi(i));\n }\n \n- for (int i = 0; i < NStructReal; i++) {\n- p.rdata(i) = static_cast<ParticleReal>(pdata.real_struct_data[i]);\n- }\n-\n- // the int struct data\n- p.id() = ParticleType::NextID();\n- p.cpu() = ParallelDescriptor::MyProc();\n-\n- for (int i = 0; i < NStructInt; i++) {\n- p.idata(i) = pdata.int_struct_data[i];\n- }\n+ ptest.id() = ParticleType::NextID();\n+ ptest.cpu() = ParallelDescriptor::MyProc();\n \n // locate the particle\n- if (!Where(p, pld))\n+ if (!Where(ptest, pld))\n {\n amrex::Abort(\"ParticleContainer_impl<ParticleType, NArrayReal, NArrayInt>::InitRandom(): invalid particle\");\n }\n AMREX_ASSERT(pld.m_lev >= 0 && pld.m_lev <= finestLevel());\n std::pair<int, int> ind(pld.m_grid, pld.m_tile);\n \n- // add the struct\n- host_particles[pld.m_lev][ind].push_back(p);\n+ if constexpr(!ParticleType::is_soa_particle)\n+ {\n+ ParticleType p;\n+ for (int i = 0; i < AMREX_SPACEDIM; i++) {\n+ p.pos(i) = ptest.pos(i);;\n+ }\n \n- // add the real...\n- for (int i = 0; i < NArrayReal; i++) {\n- host_real_attribs[pld.m_lev][ind][i].push_back(static_cast<ParticleReal>(pdata.real_array_data[i]));\n- }\n+ p.id() = ptest.id();\n+ p.cpu() = ptest.cpu();\n \n- // ... and int array data\n- for (int i = 0; i < NArrayInt; i++) {\n- host_int_attribs[pld.m_lev][ind][i].push_back(pdata.int_array_data[i]);\n+ for (int i = 0; i < NStructReal; i++) {\n+ p.rdata(i) = static_cast<ParticleReal>(pdata.real_struct_data[i]);\n+ }\n+\n+ for (int i = 0; i < NStructInt; i++) {\n+ p.idata(i) = pdata.int_struct_data[i];\n+ }\n+\n+ // add the struct\n+ host_particles[pld.m_lev][ind].push_back(p);\n+\n+ // add the real...\n+ for (int i = 0; i < NArrayReal; i++) {\n+ host_real_attribs[pld.m_lev][ind][i].push_back(static_cast<ParticleReal>(pdata.real_array_data[i]));\n+ }\n+\n+ // ... and int array data\n+ for (int i = 0; i < NArrayInt; i++) {\n+ host_int_attribs[pld.m_lev][ind][i].push_back(pdata.int_array_data[i]);\n+ }\n+ } else {\n+ for (int i = 0; i < AMREX_SPACEDIM; i++) {\n+ host_real_attribs[pld.m_lev][ind][i].push_back(ptest.pos(i));\n+ }\n+\n+ host_int_attribs[pld.m_lev][ind][0].push_back(ptest.id());\n+ host_int_attribs[pld.m_lev][ind][1].push_back(ptest.cpu());\n+\n+ host_particles[pld.m_lev][ind];\n+\n+ // add the real...\n+ for (int i = AMREX_SPACEDIM; i < NArrayReal; i++) {\n+ host_real_attribs[pld.m_lev][ind][i].push_back(static_cast<ParticleReal>(pdata.real_array_data[i]));\n+ }\n+\n+ // ... and int array data\n+ for (int i = 2; i < NArrayInt; i++) {\n+ host_int_attribs[pld.m_lev][ind][i].push_back(pdata.int_array_data[i]);\n+ }\n }\n }\n \n@@ -1204,11 +1269,20 @@ InitRandom (Long icount,\n \n auto& dst_tile = GetParticles(host_lev)[std::make_pair(grid,tile)];\n auto old_size = dst_tile.GetArrayOfStructs().size();\n- auto new_size = old_size + src_tile.size();\n+ auto new_size = old_size;\n+ if constexpr(!ParticleType::is_soa_particle)\n+ {\n+ new_size += src_tile.size();\n+ } else {\n+ new_size += host_real_attribs[host_lev][std::make_pair(grid,tile)][0].size();\n+ }\n dst_tile.resize(new_size);\n \n- Gpu::copyAsync(Gpu::hostToDevice, src_tile.begin(), src_tile.end(),\n- dst_tile.GetArrayOfStructs().begin() + old_size);\n+ if constexpr(!ParticleType::is_soa_particle)\n+ {\n+ Gpu::copyAsync(Gpu::hostToDevice, src_tile.begin(), src_tile.end(),\n+ dst_tile.GetArrayOfStructs().begin() + old_size);\n+ }\n \n for (int i = 0; i < NArrayReal; ++i) {\n Gpu::copyAsync(Gpu::hostToDevice,\n"}, "test": {"test_patch": "diff --git a/Tests/Particles/InitRandom/CMakeLists.txt b/Tests/Particles/InitRandom/CMakeLists.txt\nnew file mode 100644\nindex 00000000000..c032392c5df\n--- /dev/null\n+++ b/Tests/Particles/InitRandom/CMakeLists.txt\n@@ -0,0 +1,14 @@\n+# This tests requires particle support\n+if (NOT AMReX_PARTICLES)\n+ return()\n+endif ()\n+\n+foreach(D IN LISTS AMReX_SPACEDIM)\n+ set(_sources main.cpp)\n+ set(_input_files inputs )\n+\n+ setup_test(${D} _sources _input_files)\n+\n+ unset(_sources)\n+ unset(_input_files)\n+endforeach()\ndiff --git a/Tests/Particles/InitRandom/GNUmakefile b/Tests/Particles/InitRandom/GNUmakefile\nnew file mode 100644\nindex 00000000000..b3510b88d2e\n--- /dev/null\n+++ b/Tests/Particles/InitRandom/GNUmakefile\n@@ -0,0 +1,31 @@\n+AMREX_HOME = ../../../\n+\n+# DEBUG\t= TRUE\n+DEBUG\t= FALSE\n+\n+DIM\t= 3\n+\n+COMP = gnu\n+\n+PRECISION = DOUBLE\n+\n+USE_MPI = TRUE\n+MPI_THREAD_MULTIPLE = FALSE\n+\n+USE_OMP = FALSE\n+\n+TINY_PROFILE = TRUE\n+\n+USE_PARTICLES = TRUE\n+\n+###################################################\n+\n+EBASE = main\n+\n+include $(AMREX_HOME)/Tools/GNUMake/Make.defs\n+\n+include ./Make.package\n+include $(AMREX_HOME)/Src/Base/Make.package\n+include $(AMREX_HOME)/Src/Particle/Make.package\n+\n+include $(AMREX_HOME)/Tools/GNUMake/Make.rules\ndiff --git a/Tests/Particles/InitRandom/Make.package b/Tests/Particles/InitRandom/Make.package\nnew file mode 100644\nindex 00000000000..6b4b865e8fc\n--- /dev/null\n+++ b/Tests/Particles/InitRandom/Make.package\n@@ -0,0 +1,1 @@\n+CEXE_sources += main.cpp\ndiff --git a/Tests/Particles/InitRandom/inputs b/Tests/Particles/InitRandom/inputs\nnew file mode 100644\nindex 00000000000..59b4212ed5b\n--- /dev/null\n+++ b/Tests/Particles/InitRandom/inputs\n@@ -0,0 +1,13 @@\n+# Domain size\n+ncells = 64\n+\n+# Maximum allowable size of each subdomain in the problem domain;\n+# this is used to decompose the domain for parallel calculations.\n+max_grid_size = 8\n+\n+# Number of levels\n+nlevs = 1\n+\n+# Number of particles per cell\n+nppc = 2\n+\ndiff --git a/Tests/Particles/InitRandom/main.cpp b/Tests/Particles/InitRandom/main.cpp\nnew file mode 100644\nindex 00000000000..c3c9f730b53\n--- /dev/null\n+++ b/Tests/Particles/InitRandom/main.cpp\n@@ -0,0 +1,187 @@\n+#include <AMReX.H>\n+#include <AMReX_ParmParse.H>\n+#include <AMReX_PlotFileUtil.H>\n+#include <AMReX_Particles.H>\n+\n+#include <cstdio>\n+\n+using namespace amrex;\n+\n+void set_grids_nested (Vector<Box>& domains,\n+ Vector<BoxArray>& grids,\n+ Vector<IntVect>& ref_ratio);\n+void test ();\n+void testSOA ();\n+\n+int main(int argc, char* argv[])\n+{\n+ amrex::Initialize(argc,argv);\n+ test();\n+ testSOA();\n+ amrex::Finalize();\n+}\n+\n+void testSOA ()\n+{\n+ int ncells, max_grid_size, nlevs, nppc;\n+\n+ ParmParse pp;\n+ pp.get(\"ncells\", ncells);\n+ pp.get(\"max_grid_size\", max_grid_size);\n+ pp.get(\"nlevs\", nlevs);\n+ pp.get(\"nppc\", nppc);\n+\n+ Vector<Box> domains;\n+ Vector<BoxArray> ba;\n+ Vector<IntVect> ref_ratio;\n+\n+ set_grids_nested(domains, ba, ref_ratio);\n+\n+ RealBox real_box;\n+ for (int n = 0; n < AMREX_SPACEDIM; n++) {\n+ real_box.setLo(n, 0.0);\n+ real_box.setHi(n, 1.0);\n+ }\n+\n+ // This sets the boundary conditions to be doubly or triply periodic\n+ int is_per[] = {AMREX_D_DECL(1,1,1)};\n+\n+ // This defines a Geometry object for each level\n+ Vector<Geometry> geom(nlevs);\n+ geom[0].define(domains[0], &real_box, CoordSys::cartesian, is_per);\n+ for (int lev = 1; lev < nlevs; lev++) {\n+ geom[lev].define(domains[lev], &real_box, CoordSys::cartesian, is_per);\n+ }\n+\n+ Vector<DistributionMapping> dmap(nlevs);\n+\n+ for (int lev = 0; lev < nlevs; lev++) {\n+ dmap[lev] = DistributionMapping{ba[lev]};\n+ }\n+\n+ // Add some particles\n+ constexpr int NReal = 12;\n+ constexpr int NInt = 4;\n+\n+ typedef ParticleContainerPureSoA<NReal, NInt> MyPC;\n+ MyPC myPC(geom, dmap, ba, ref_ratio);\n+ myPC.SetVerbose(false);\n+\n+ int num_particles = nppc * AMREX_D_TERM(ncells, * ncells, * ncells);\n+ bool serialize = false;\n+ int iseed = 451;\n+ MyPC::ParticleInitData pdata = {{}, {},\n+ {1.0, 2.0, 3.0, 4.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0, 13.0},\n+ {5, 14, 15, 16}};\n+\n+ myPC.InitRandom(num_particles, iseed, pdata, serialize);\n+ amrex::Print() << \"Generated \" << myPC.TotalNumberOfParticles() << \" particles. \\n\";\n+}\n+\n+void test ()\n+{\n+ int ncells, max_grid_size, nlevs, nppc;\n+\n+ ParmParse pp;\n+ pp.get(\"ncells\", ncells);\n+ pp.get(\"max_grid_size\", max_grid_size);\n+ pp.get(\"nlevs\", nlevs);\n+ pp.get(\"nppc\", nppc);\n+\n+ Vector<Box> domains;\n+ Vector<BoxArray> ba;\n+ Vector<IntVect> ref_ratio;\n+\n+ set_grids_nested(domains, ba, ref_ratio);\n+\n+ RealBox real_box;\n+ for (int n = 0; n < AMREX_SPACEDIM; n++) {\n+ real_box.setLo(n, 0.0);\n+ real_box.setHi(n, 1.0);\n+ }\n+\n+ // This sets the boundary conditions to be doubly or triply periodic\n+ int is_per[] = {AMREX_D_DECL(1,1,1)};\n+\n+ // This defines a Geometry object for each level\n+ Vector<Geometry> geom(nlevs);\n+ geom[0].define(domains[0], &real_box, CoordSys::cartesian, is_per);\n+ for (int lev = 1; lev < nlevs; lev++) {\n+ geom[lev].define(domains[lev], &real_box, CoordSys::cartesian, is_per);\n+ }\n+\n+ Vector<DistributionMapping> dmap(nlevs);\n+\n+ for (int lev = 0; lev < nlevs; lev++) {\n+ dmap[lev] = DistributionMapping{ba[lev]};\n+ }\n+\n+ // Add some particles\n+ constexpr int NStructReal = 4;\n+ constexpr int NStructInt = 1;\n+ constexpr int NArrayReal = 8;\n+ constexpr int NArrayInt = 3;\n+\n+ typedef ParticleContainer<NStructReal, NStructInt, NArrayReal, NArrayInt> MyPC;\n+ MyPC myPC(geom, dmap, ba, ref_ratio);\n+ myPC.SetVerbose(false);\n+\n+ int num_particles = nppc * AMREX_D_TERM(ncells, * ncells, * ncells);\n+ bool serialize = false;\n+ int iseed = 451;\n+ MyPC::ParticleInitData pdata = {{1.0, 2.0, 3.0, 4.0},\n+ {5},\n+ {6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0, 13.0},\n+ {14, 15, 16}};\n+\n+ myPC.InitRandom(num_particles, iseed, pdata, serialize);\n+ amrex::Print() << \"Generated \" << myPC.TotalNumberOfParticles() << \" particles. \\n\";\n+}\n+\n+void set_grids_nested (Vector<Box>& domains,\n+ Vector<BoxArray>& grids,\n+ Vector<IntVect>& ref_ratio)\n+{\n+ int ncells, max_grid_size, nlevs;\n+\n+ ParmParse pp;\n+ pp.get(\"ncells\", ncells);\n+ pp.get(\"max_grid_size\", max_grid_size);\n+ pp.get(\"nlevs\", nlevs);\n+\n+ AMREX_ALWAYS_ASSERT(nlevs < 2); // relax this later\n+\n+ IntVect domain_lo(AMREX_D_DECL(0, 0, 0));\n+ IntVect domain_hi(AMREX_D_DECL(ncells-1, ncells-1, ncells-1));\n+\n+ domains.resize(nlevs);\n+ domains[0].setSmall(domain_lo);\n+ domains[0].setBig(domain_hi);\n+\n+ ref_ratio.resize(nlevs-1);\n+ for (int lev = 1; lev < nlevs; lev++)\n+ ref_ratio[lev-1] = IntVect(AMREX_D_DECL(2, 2, 2));\n+\n+ grids.resize(nlevs);\n+ grids[0].define(domains[0]);\n+\n+ // Now we make the refined level be the center eighth of the domain\n+ if (nlevs > 1) {\n+ int n_fine = ncells*ref_ratio[0][0];\n+ IntVect refined_lo(AMREX_D_DECL(n_fine/4,n_fine/4,n_fine/4));\n+ IntVect refined_hi(AMREX_D_DECL(3*n_fine/4-1,3*n_fine/4-1,3*n_fine/4-1));\n+\n+ // Build a box for the level 1 domain\n+ Box refined_patch(refined_lo, refined_hi);\n+ grids[1].define(refined_patch);\n+ }\n+\n+ // break the BoxArrays at both levels into max_grid_size^3 boxes\n+ for (int lev = 0; lev < nlevs; lev++) {\n+ grids[lev].maxSize(max_grid_size);\n+ }\n+\n+ for (int lev = 1; lev < nlevs; lev++) {\n+ domains[lev] = amrex::refine(domains[lev-1], ref_ratio[lev-1]);\n+ }\n+}\n", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}51{"question_id": "MSB_AMReX-Codes_amrex_pr3332", "question_type": "multi_swe_bench", "description": "Implement Checkpoint, Restart, and Plotfile for pure SOA (AMReX-Codes/amrex#3332)", "content": {"org": "AMReX-Codes", "repo": "amrex", "pr_number": 3332, "issue_title": "Implement Checkpoint, Restart, and Plotfile for pure SOA", "issue_body": "Follow-up to #2878.\r\n\r\nThe proposed changes:\r\n- [x] fix a bug or incorrect behavior in AMReX\r\n- [x] add new capabilities to AMReX\r\n- [ ] changes answers in the test suite to more than roundoff level\r\n- [ ] are likely to significantly affect the results of downstream AMReX users\r\n- [ ] include documentation in the code and/or rst files, if appropriate\r\n", "base_commit": "07f87b0a9047a4306a056f60d71d6d49388a3497", "resolved_issues": [{"number": 2878, "title": "Support SoA-Only Particles", "body": "## Summary\r\n\r\nFurther updates of #2853 where @atmyers and @ax3l can also push to.\r\n\r\n## Upgrade Guide for C++ API Changes\r\n\r\nThese PRs show changes to keep using the *old layout*:\r\n- example in WarpX: https://github.com/ECP-WarpX/WarpX/pull/3848\r\n- example in HiPACE++: https://github.com/Hi-PACE/hipace/pull/921\r\n- example in ImpactX: https://github.com/ECP-WarpX/impactx/pull/342\r\n- example in pyAMReX: https://github.com/AMReX-Codes/pyamrex/pull/119\r\n\r\nThese PRs show changes to *use the new layout* (pure SoA):\r\n- example in WarpX: https://github.com/ECP-WarpX/WarpX/pull/3850\r\n- example in ImpactX: https://github.com/ECP-WarpX/impactx/pull/348\r\n- example in pyAMReX: https://github.com/AMReX-Codes/pyamrex/pull/124\r\n\r\n## Additional background\r\n\r\n## Checklist\r\n\r\nThe proposed changes:\r\n- [ ] fix a bug or incorrect behavior in AMReX\r\n- [x] add new capabilities to AMReX\r\n- [ ] changes answers in the test suite to more than roundoff level\r\n- [ ] are likely to significantly affect the results of downstream AMReX users\r\n- [ ] include documentation in the code and/or rst files, if appropriate\r\n"}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/amrex-codes_m_amrex:pr-3332", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/Src/Particle/AMReX_ParticleContainer.H b/Src/Particle/AMReX_ParticleContainer.H\nindex abffbefc860..3e6a6113fc8 100644\n--- a/Src/Particle/AMReX_ParticleContainer.H\n+++ b/Src/Particle/AMReX_ParticleContainer.H\n@@ -1346,7 +1346,8 @@ protected:\n * \\param lev_max\n * \\param local_grid\n */\n- bool EnforcePeriodicWhere (ParticleType& prt, ParticleLocData& pld,\n+ template <typename P>\n+ bool EnforcePeriodicWhere (P& prt, ParticleLocData& pld,\n int lev_min = 0, int lev_max = -1, int local_grid=-1) const;\n \n public:\n@@ -1378,7 +1379,8 @@ private:\n void RedistributeMPI (std::map<int, Vector<char> >& not_ours,\n int lev_min = 0, int lev_max = 0, int nGrow = 0, int local=0);\n \n- void locateParticle (ParticleType& p, ParticleLocData& pld,\n+ template <typename P>\n+ void locateParticle (P& p, ParticleLocData& pld,\n int lev_min, int lev_max, int nGrow, int local_grid=-1) const;\n \n void Initialize ();\ndiff --git a/Src/Particle/AMReX_ParticleContainerI.H b/Src/Particle/AMReX_ParticleContainerI.H\nindex 9a5007f86ec..034bc50cd6f 100644\n--- a/Src/Particle/AMReX_ParticleContainerI.H\n+++ b/Src/Particle/AMReX_ParticleContainerI.H\n@@ -164,9 +164,10 @@ ParticleContainer_impl<ParticleType, NArrayReal, NArrayInt, Allocator>\n \n template <typename ParticleType, int NArrayReal, int NArrayInt,\n template<class> class Allocator>\n+template <typename P>\n bool\n ParticleContainer_impl<ParticleType, NArrayReal, NArrayInt, Allocator>\n-::EnforcePeriodicWhere (ParticleType& p,\n+::EnforcePeriodicWhere (P& p,\n ParticleLocData& pld,\n int lev_min,\n int lev_max,\n@@ -312,8 +313,9 @@ ParticleContainer_impl<ParticleType, NArrayReal, NArrayInt, Allocator>::resizeDa\n \n template <typename ParticleType, int NArrayReal, int NArrayInt,\n template<class> class Allocator>\n+template <typename P>\n void\n-ParticleContainer_impl<ParticleType, NArrayReal, NArrayInt, Allocator>::locateParticle (ParticleType& p, ParticleLocData& pld,\n+ParticleContainer_impl<ParticleType, NArrayReal, NArrayInt, Allocator>::locateParticle (P& p, ParticleLocData& pld,\n int lev_min, int lev_max, int nGrow, int local_grid) const\n {\n bool success;\ndiff --git a/Src/Particle/AMReX_ParticleIO.H b/Src/Particle/AMReX_ParticleIO.H\nindex a9849ca8a3c..cfc55dfd550 100644\n--- a/Src/Particle/AMReX_ParticleIO.H\n+++ b/Src/Particle/AMReX_ParticleIO.H\n@@ -919,7 +919,7 @@ ParticleContainer_impl<ParticleType, NArrayReal, NArrayInt, Allocator>\n int* iptr = istuff.dataPtr();\n RTYPE* rptr = rstuff.dataPtr();\n \n- ParticleType p;\n+ Particle<NStructReal, NStructInt> ptemp;\n ParticleLocData pld;\n \n Vector<std::map<std::pair<int, int>, Gpu::HostVector<ParticleType> > > host_particles;\n@@ -937,41 +937,43 @@ ParticleContainer_impl<ParticleType, NArrayReal, NArrayInt, Allocator>\n host_int_attribs.resize(finest_level_in_file+1);\n \n for (int i = 0; i < cnt; i++) {\n- if (convert_ids) {\n+ // note: for pure SoA particle layouts, we do write the id, cpu and positions as a struct\n+ // for backwards compatibility with readers\n+ if (!ParticleType::is_soa_particle && convert_ids) {\n std::int32_t xi, yi;\n std::uint32_t xu, yu;\n xi = iptr[0];\n yi = iptr[1];\n std::memcpy(&xu, &xi, sizeof(xi));\n std::memcpy(&yu, &yi, sizeof(yi));\n- p.m_idcpu = ((std::uint64_t)xu) << 32 | yu;\n+ ptemp.m_idcpu = ((std::uint64_t)xu) << 32 | yu;\n } else {\n- p.id() = iptr[0];\n- p.cpu() = iptr[1];\n+ ptemp.id() = iptr[0];\n+ ptemp.cpu() = iptr[1];\n }\n iptr += 2;\n \n for (int j = 0; j < NStructInt; j++)\n {\n- p.idata(j) = *iptr;\n+ ptemp.idata(j) = *iptr;\n ++iptr;\n }\n \n- AMREX_ASSERT(p.id() > 0);\n+ AMREX_ASSERT(ptemp.id() > 0);\n \n- AMREX_D_TERM(p.pos(0) = ParticleReal(rptr[0]);,\n- p.pos(1) = ParticleReal(rptr[1]);,\n- p.pos(2) = ParticleReal(rptr[2]););\n+ AMREX_D_TERM(ptemp.pos(0) = ParticleReal(rptr[0]);,\n+ ptemp.pos(1) = ParticleReal(rptr[1]);,\n+ ptemp.pos(2) = ParticleReal(rptr[2]););\n \n rptr += AMREX_SPACEDIM;\n \n for (int j = 0; j < NStructReal; j++)\n {\n- p.rdata(j) = ParticleReal(*rptr);\n+ ptemp.rdata(j) = ParticleReal(*rptr);\n ++rptr;\n }\n \n- locateParticle(p, pld, 0, finestLevel(), 0);\n+ locateParticle(ptemp, pld, 0, finestLevel(), 0);\n \n std::pair<int, int> ind(grd, pld.m_tile);\n \n@@ -979,35 +981,69 @@ ParticleContainer_impl<ParticleType, NArrayReal, NArrayInt, Allocator>\n host_int_attribs[lev][ind].resize(NumIntComps());\n \n // add the struct\n- host_particles[lev][ind].push_back(p);\n+ if constexpr(!ParticleType::is_soa_particle)\n+ {\n+ host_particles[lev][ind].push_back(ptemp);\n \n- // add the real...\n- for (int icomp = 0; icomp < NumRealComps(); icomp++) {\n- host_real_attribs[lev][ind][icomp].push_back(*rptr);\n- ++rptr;\n- }\n+ // add the real...\n+ for (int icomp = 0; icomp < NumRealComps(); icomp++) {\n+ host_real_attribs[lev][ind][icomp].push_back(*rptr);\n+ ++rptr;\n+ }\n \n- // ... and int array data\n- for (int icomp = 0; icomp < NumIntComps(); icomp++) {\n- host_int_attribs[lev][ind][icomp].push_back(*iptr);\n- ++iptr;\n+ // ... and int array data\n+ for (int icomp = 0; icomp < NumIntComps(); icomp++) {\n+ host_int_attribs[lev][ind][icomp].push_back(*iptr);\n+ ++iptr;\n+ }\n+ } else {\n+ host_particles[lev][ind];\n+\n+ for (int j = 0; j < AMREX_SPACEDIM; j++) {\n+ host_real_attribs[pld.m_lev][ind][j].push_back(ptemp.pos(j));\n+ }\n+\n+ host_int_attribs[pld.m_lev][ind][0].push_back(ptemp.id());\n+ host_int_attribs[pld.m_lev][ind][1].push_back(ptemp.cpu());\n+\n+ // read all other SoA\n+ // add the real...\n+ for (int icomp = AMREX_SPACEDIM; icomp < NumRealComps(); icomp++) {\n+ host_real_attribs[lev][ind][icomp].push_back(*rptr);\n+ ++rptr;\n+ }\n+\n+ // ... and int array data\n+ for (int icomp = 2; icomp < NumIntComps(); icomp++) {\n+ host_int_attribs[lev][ind][icomp].push_back(*iptr);\n+ ++iptr;\n+ }\n }\n }\n \n for (int host_lev = 0; host_lev < static_cast<int>(host_particles.size()); ++host_lev)\n- {\n+ {\n for (auto& kv : host_particles[host_lev]) {\n auto grid = kv.first.first;\n auto tile = kv.first.second;\n const auto& src_tile = kv.second;\n \n auto& dst_tile = DefineAndReturnParticleTile(host_lev, grid, tile);\n- auto old_size = dst_tile.GetArrayOfStructs().size();\n- auto new_size = old_size + src_tile.size();\n+ auto old_size = dst_tile.size();\n+ auto new_size = old_size;\n+ if constexpr(!ParticleType::is_soa_particle)\n+ {\n+ new_size += src_tile.size();\n+ } else {\n+ new_size += host_real_attribs[host_lev][std::make_pair(grid,tile)][0].size();\n+ }\n dst_tile.resize(new_size);\n \n- Gpu::copyAsync(Gpu::hostToDevice, src_tile.begin(), src_tile.end(),\n- dst_tile.GetArrayOfStructs().begin() + old_size);\n+ if constexpr(!ParticleType::is_soa_particle)\n+ {\n+ Gpu::copyAsync(Gpu::hostToDevice, src_tile.begin(), src_tile.end(),\n+ dst_tile.GetArrayOfStructs().begin() + old_size);\n+ }\n \n for (int i = 0; i < NumRealComps(); ++i) {\n Gpu::copyAsync(Gpu::hostToDevice,\ndiff --git a/Src/Particle/AMReX_ParticleTile.H b/Src/Particle/AMReX_ParticleTile.H\nindex 9f1fe712c64..3b5ee15fdb0 100644\n--- a/Src/Particle/AMReX_ParticleTile.H\n+++ b/Src/Particle/AMReX_ParticleTile.H\n@@ -226,6 +226,9 @@ struct ParticleTileData\n {\n AMREX_ASSERT(index < m_size);\n SuperParticleType sp;\n+ for (int i = 0; i < AMREX_SPACEDIM; ++i) {sp.pos(i) = m_rdata[i][index];}\n+ sp.id() = m_idata[0][index];\n+ sp.cpu() = m_idata[1][index];\n for (int i = 0; i < NAR; ++i)\n sp.rdata(i) = m_rdata[i][index];\n for (int i = 0; i < NAI; ++i)\n@@ -595,6 +598,9 @@ struct ConstParticleTileData\n {\n AMREX_ASSERT(index < m_size);\n SuperParticleType sp;\n+ for (int i = 0; i < AMREX_SPACEDIM; ++i) {sp.pos(i) = m_rdata[i][index];}\n+ sp.id() = m_idata[0][index];\n+ sp.cpu() = m_idata[1][index];\n for (int i = 0; i < NAR; ++i)\n sp.rdata(i) = m_rdata[i][index];\n for (int i = 0; i < NAI; ++i)\ndiff --git a/Src/Particle/AMReX_WriteBinaryParticleData.H b/Src/Particle/AMReX_WriteBinaryParticleData.H\nindex 7767972998d..f182eb2b3e8 100644\n--- a/Src/Particle/AMReX_WriteBinaryParticleData.H\n+++ b/Src/Particle/AMReX_WriteBinaryParticleData.H\n@@ -13,7 +13,7 @@ struct KeepValidFilter\n AMREX_GPU_HOST_DEVICE\n int operator() (const SrcData& src, int i) const noexcept\n {\n- return (src.m_aos[i].id() > 0);\n+ return (src.id(i) > 0);\n }\n };\n \n@@ -197,7 +197,7 @@ packIOData (Vector<int>& idata, Vector<ParticleReal>& rdata, const PC& pc, int l\n for (int i = 0; i < tiles.size(); i++) {\n const auto& ptile = pc.ParticlesAt(lev, grid, tiles[i]);\n const auto& pflags = particle_io_flags[lev].at(std::make_pair(grid, tiles[i]));\n- int np_tile = ptile.GetArrayOfStructs().numParticles();\n+ int np_tile = ptile.numParticles();\n typename PC::IntVector offsets(np_tile);\n int num_copies = Scan::ExclusiveSum(np_tile, pflags.begin(), offsets.begin(), Scan::retSum);\n \n@@ -283,44 +283,70 @@ packIOData (Vector<int>& idata, Vector<ParticleReal>& rdata, const PC& pc, int l\n const Long rChunkSize = AMREX_SPACEDIM + num_output_real;\n rdata.resize(np*rChunkSize);\n \n- int* iptr = idata.dataPtr();\n+ int* iptr = idata.dataPtr();\n ParticleReal* rptr = rdata.dataPtr();\n for (unsigned i = 0; i < tiles.size(); i++) {\n const auto& ptile = pc.ParticlesAt(lev, grid, tiles[i]);\n const auto& pflags = particle_io_flags[lev].at(std::make_pair(grid, tiles[i]));\n- for (int pindex = 0; pindex < ptile.GetArrayOfStructs().numParticles(); ++pindex) {\n- const auto& aos = ptile.GetArrayOfStructs();\n- const auto& p = aos[pindex];\n+ for (int pindex = 0; pindex < ptile.numParticles(); ++pindex) {\n if (pflags[pindex]) {\n- packParticleIDs(iptr, p, is_checkpoint);\n- iptr += 2;\n-\n- for (int j = 0; j < AMREX_SPACEDIM; j++) rptr[j] = p.pos(j);\n- rptr += AMREX_SPACEDIM;\n+ const auto& soa = ptile.GetStructOfArrays();\n \n- for (int j = 0; j < PC::NStructInt; j++) {\n- if (write_int_comp[j]) {\n- *iptr = p.idata(j);\n- ++iptr;\n+ // note: for pure SoA particle layouts, we do write the id, cpu and positions as a struct\n+ // for backwards compatibility with readers\n+ if constexpr(!PC::ParticleType::is_soa_particle)\n+ {\n+ const auto& aos = ptile.GetArrayOfStructs();\n+ const auto& p = aos[pindex];\n+\n+ // Int: id, cpu\n+ packParticleIDs(iptr, p, is_checkpoint);\n+ iptr += 2;\n+\n+ // Real: positions\n+ for (int j = 0; j < AMREX_SPACEDIM; j++) rptr[j] = p.pos(j);\n+ rptr += AMREX_SPACEDIM;\n+\n+ // extra AoS Int components\n+ for (int j = 0; j < PC::NStructInt; j++) {\n+ if (write_int_comp[j]) {\n+ *iptr = p.idata(j);\n+ ++iptr;\n+ }\n+ }\n+ // extra AoS Real components\n+ for (int j = 0; j < PC::NStructReal; j++) {\n+ if (write_real_comp[j]) {\n+ *rptr = p.rdata(j);\n+ ++rptr;\n+ }\n }\n }\n+ else {\n+ amrex::ignore_unused(is_checkpoint);\n+ // Int: id, cpu\n+ *iptr = soa.GetIntData(0)[pindex];\n+ iptr += 1;\n+ *iptr = soa.GetIntData(1)[pindex];\n+ iptr += 1;\n+\n+ // Real: position\n+ for (int j = 0; j < AMREX_SPACEDIM; j++) rptr[j] = soa.GetRealData(j)[pindex];\n+ rptr += AMREX_SPACEDIM;\n+ }\n \n- const auto& soa = ptile.GetStructOfArrays();\n- for (int j = 0; j < pc.NumIntComps(); j++) {\n+ // extra SoA int data\n+ const int int_start_offset = PC::ParticleType::is_soa_particle ? 2 : 0; // pure SoA: skip id, cpu\n+ for (int j = int_start_offset; j < pc.NumIntComps(); j++) {\n if (write_int_comp[PC::NStructInt+j]) {\n *iptr = soa.GetIntData(j)[pindex];\n ++iptr;\n }\n }\n \n- for (int j = 0; j < PC::NStructReal; j++) {\n- if (write_real_comp[j]) {\n- *rptr = p.rdata(j);\n- ++rptr;\n- }\n- }\n-\n- for (int j = 0; j < pc.NumRealComps(); j++) {\n+ // extra SoA Real components\n+ const int real_start_offset = PC::ParticleType::is_soa_particle ? AMREX_SPACEDIM : 0; // pure SoA: skip positions\n+ for (int j = real_start_offset; j < pc.NumRealComps(); j++) {\n if (write_real_comp[PC::NStructReal+j]) {\n *rptr = (ParticleReal) soa.GetRealData(j)[pindex];\n ++rptr;\n@@ -647,8 +673,7 @@ void WriteBinaryParticleDataAsync (PC const& pc,\n {\n int gid = pti.index();\n const auto& ptile = pc.ParticlesAt(lev, pti);\n- const auto& aos = ptile.GetArrayOfStructs();\n- const auto pstruct = aos().dataPtr();\n+ const auto& ptd = ptile.getConstParticleTileData();\n const int np = ptile.numParticles();\n \n ReduceOps<ReduceOpSum> reduce_op;\n@@ -658,7 +683,7 @@ void WriteBinaryParticleDataAsync (PC const& pc,\n reduce_op.eval(np, reduce_data,\n [=] AMREX_GPU_DEVICE (int i) -> ReduceTuple\n {\n- return (pstruct[i].id() > 0) ? 1 : 0;\n+ return (ptd.id(i) > 0) ? 1 : 0;\n });\n \n int np_valid = amrex::get<0>(reduce_data.value(reduce_op));\n@@ -938,30 +963,43 @@ void WriteBinaryParticleDataAsync (PC const& pc,\n for (unsigned i = 0; i < tile_map[grid].size(); i++) {\n auto ptile_index = std::make_pair(grid, tile_map[grid][i]);\n const auto& pbox = (*myptiles)[lev][ptile_index];\n- for (int pindex = 0;\n- pindex < pbox.GetArrayOfStructs().numParticles(); ++pindex)\n+ const auto ptd = pbox.getConstParticleTileData();\n+ for (int pindex = 0; pindex < pbox.numParticles(); ++pindex)\n {\n- const auto& aos = pbox.GetArrayOfStructs();\n- const auto& p = aos[pindex];\n+ const auto& soa = pbox.GetStructOfArrays();\n \n+ const auto& p = make_particle<typename PC::ConstParticleType>{}(ptd, pindex);\n if (p.id() <= 0) continue;\n \n- // always write these\n- particle_detail::packParticleIDs(iptr, p, is_checkpoint);\n- iptr += 2;\n-\n- // optionally write these\n- for (int j = 0; j < NStructInt; j++)\n+ // note: for pure SoA particle layouts, we do write the id, cpu and positions as a struct\n+ // for backwards compatibility with readers\n+ if constexpr(!PC::ParticleType::is_soa_particle)\n {\n- if (write_int_comp[j])\n+ // Ints: id, cpu\n+ particle_detail::packParticleIDs(iptr, p, is_checkpoint);\n+ iptr += 2;\n+\n+ // extra AoS Int components\n+ for (int j = 0; j < NStructInt; j++)\n {\n- *iptr = p.idata(j);\n- ++iptr;\n+ if (write_int_comp[j])\n+ {\n+ *iptr = p.idata(j);\n+ ++iptr;\n+ }\n }\n }\n+ else {\n+ // Ints: id, cpu\n+ *iptr = soa.GetIntData(0)[pindex];\n+ iptr += 1;\n+ *iptr = soa.GetIntData(1)[pindex];\n+ iptr += 1;\n+ }\n \n- const auto& soa = pbox.GetStructOfArrays();\n- for (int j = 0; j < nic; j++)\n+ // extra SoA Ints\n+ const int int_start_offset = PC::ParticleType::is_soa_particle ? 2 : 0; // pure SoA: skip id, cpu\n+ for (int j = int_start_offset; j < nic; j++)\n {\n if (write_int_comp[NStructInt+j])\n {\n@@ -987,30 +1025,40 @@ void WriteBinaryParticleDataAsync (PC const& pc,\n for (unsigned i = 0; i < tile_map[grid].size(); i++) {\n auto ptile_index = std::make_pair(grid, tile_map[grid][i]);\n const auto& pbox = (*myptiles)[lev][ptile_index];\n+ const auto ptd = pbox.getConstParticleTileData();\n for (int pindex = 0;\n- pindex < pbox.GetArrayOfStructs().numParticles(); ++pindex)\n+ pindex < pbox.numParticles(); ++pindex)\n {\n- const auto& aos = pbox.GetArrayOfStructs();\n- const auto& p = aos[pindex];\n+ const auto& soa = pbox.GetStructOfArrays();\n+ const auto& p = make_particle<typename PC::ConstParticleType>{}(ptd, pindex);\n \n if (p.id() <= 0) continue;\n \n- // always write these\n- for (int j = 0; j < AMREX_SPACEDIM; j++) rptr[j] = p.pos(j);\n- rptr += AMREX_SPACEDIM;\n-\n- // optionally write these\n- for (int j = 0; j < NStructReal; j++)\n+ if constexpr(!PC::ParticleType::is_soa_particle)\n {\n- if (write_real_comp[j])\n+ // Real: position\n+ for (int j = 0; j < AMREX_SPACEDIM; j++) rptr[j] = p.pos(j);\n+ rptr += AMREX_SPACEDIM;\n+\n+ // extra AoS real\n+ for (int j = 0; j < NStructReal; j++)\n {\n- *rptr = p.rdata(j);\n- ++rptr;\n+ if (write_real_comp[j])\n+ {\n+ *rptr = p.rdata(j);\n+ ++rptr;\n+ }\n }\n }\n+ else {\n+ // Real: position\n+ for (int j = 0; j < AMREX_SPACEDIM; j++) rptr[j] = soa.GetRealData(j)[pindex];\n+ rptr += AMREX_SPACEDIM;\n+ }\n \n- const auto& soa = pbox.GetStructOfArrays();\n- for (int j = 0; j < nrc; j++)\n+ // extra SoA real\n+ const int real_start_offset = PC::ParticleType::is_soa_particle ? AMREX_SPACEDIM : 0; // pure SoA: positions\n+ for (int j = real_start_offset; j < nrc; j++)\n {\n if (write_real_comp[NStructReal+j])\n {\n"}, "test": {"test_patch": "diff --git a/Tests/Particles/CheckpointRestartSOA/CMakeLists.txt b/Tests/Particles/CheckpointRestartSOA/CMakeLists.txt\nnew file mode 100644\nindex 00000000000..087d3ad4998\n--- /dev/null\n+++ b/Tests/Particles/CheckpointRestartSOA/CMakeLists.txt\n@@ -0,0 +1,14 @@\n+# This tests requires particle support\n+if (NOT AMReX_PARTICLES)\n+ return()\n+endif ()\n+\n+foreach(D IN LISTS AMReX_SPACEDIM)\n+ set(_sources main.cpp)\n+ set(_input_files inputs)\n+\n+ setup_test(${D} _sources _input_files)\n+\n+ unset(_sources)\n+ unset(_input_files)\n+endforeach()\ndiff --git a/Tests/Particles/CheckpointRestartSOA/GNUmakefile b/Tests/Particles/CheckpointRestartSOA/GNUmakefile\nnew file mode 100644\nindex 00000000000..b3510b88d2e\n--- /dev/null\n+++ b/Tests/Particles/CheckpointRestartSOA/GNUmakefile\n@@ -0,0 +1,31 @@\n+AMREX_HOME = ../../../\n+\n+# DEBUG\t= TRUE\n+DEBUG\t= FALSE\n+\n+DIM\t= 3\n+\n+COMP = gnu\n+\n+PRECISION = DOUBLE\n+\n+USE_MPI = TRUE\n+MPI_THREAD_MULTIPLE = FALSE\n+\n+USE_OMP = FALSE\n+\n+TINY_PROFILE = TRUE\n+\n+USE_PARTICLES = TRUE\n+\n+###################################################\n+\n+EBASE = main\n+\n+include $(AMREX_HOME)/Tools/GNUMake/Make.defs\n+\n+include ./Make.package\n+include $(AMREX_HOME)/Src/Base/Make.package\n+include $(AMREX_HOME)/Src/Particle/Make.package\n+\n+include $(AMREX_HOME)/Tools/GNUMake/Make.rules\ndiff --git a/Tests/Particles/CheckpointRestartSOA/Make.package b/Tests/Particles/CheckpointRestartSOA/Make.package\nnew file mode 100644\nindex 00000000000..6b4b865e8fc\n--- /dev/null\n+++ b/Tests/Particles/CheckpointRestartSOA/Make.package\n@@ -0,0 +1,1 @@\n+CEXE_sources += main.cpp\ndiff --git a/Tests/Particles/CheckpointRestartSOA/inputs b/Tests/Particles/CheckpointRestartSOA/inputs\nnew file mode 100644\nindex 00000000000..81855c5947d\n--- /dev/null\n+++ b/Tests/Particles/CheckpointRestartSOA/inputs\n@@ -0,0 +1,26 @@\n+# Domain size\n+ncells = 64\n+\n+# Maximum allowable size of each subdomain in the problem domain;\n+# this is used to decompose the domain for parallel calculations.\n+max_grid_size = 8\n+\n+# Number of levels\n+nlevs = 1\n+\n+# Number of components in the multifabs\n+ncomp = 6\n+\n+# Number of particles per cell\n+nppc = 2\n+\n+# Number of plot files to write\n+nplotfile = 1\n+\n+# Number of plot files to write\n+nparticlefile = 1\n+\n+# Whether to check the correctness of Checkpoint / Restart\n+restart_check = 1\n+\n+directory=.\ndiff --git a/Tests/Particles/CheckpointRestartSOA/main.cpp b/Tests/Particles/CheckpointRestartSOA/main.cpp\nnew file mode 100644\nindex 00000000000..b6ccc365964\n--- /dev/null\n+++ b/Tests/Particles/CheckpointRestartSOA/main.cpp\n@@ -0,0 +1,245 @@\n+#include <AMReX.H>\n+#include <AMReX_ParmParse.H>\n+#include <AMReX_PlotFileUtil.H>\n+#include <AMReX_Particles.H>\n+\n+#include <cstdio>\n+\n+using namespace amrex;\n+\n+void set_grids_nested (Vector<Box>& domains,\n+ Vector<BoxArray>& grids,\n+ Vector<IntVect>& ref_ratio);\n+void test ();\n+\n+int main(int argc, char* argv[])\n+{\n+ amrex::Initialize(argc,argv);\n+ test();\n+ amrex::Finalize();\n+}\n+\n+void test ()\n+{\n+ const int nghost = 0;\n+ int ncells, max_grid_size, ncomp, nlevs, nppc;\n+ int restart_check = 0, nplotfile = 1, nparticlefile = 1;\n+ std::string directory;\n+\n+ ParmParse pp;\n+ pp.get(\"ncells\", ncells);\n+ pp.get(\"max_grid_size\", max_grid_size);\n+ pp.get(\"ncomp\", ncomp);\n+ pp.get(\"nlevs\", nlevs);\n+ pp.get(\"nppc\", nppc);\n+ pp.query(\"nplotfile\", nplotfile);\n+ pp.query(\"nparticlefile\", nparticlefile);\n+ pp.query(\"restart_check\", restart_check);\n+ pp.query(\"directory\", directory);\n+\n+ if (!directory.empty() && directory.back() != '/') {\n+ // Include separator if one was not provided\n+ directory += \"/\";\n+ }\n+\n+ Vector<Box> domains;\n+ Vector<BoxArray> ba;\n+ Vector<IntVect> ref_ratio;\n+\n+ set_grids_nested(domains, ba, ref_ratio);\n+\n+ RealBox real_box;\n+ for (int n = 0; n < AMREX_SPACEDIM; n++) {\n+ real_box.setLo(n, 0.0);\n+ real_box.setHi(n, 1.0);\n+ }\n+\n+ // This sets the boundary conditions to be doubly or triply periodic\n+ int is_per[] = {AMREX_D_DECL(1,1,1)};\n+\n+ // This defines a Geometry object for each level\n+ Vector<Geometry> geom(nlevs);\n+ geom[0].define(domains[0], &real_box, CoordSys::cartesian, is_per);\n+ for (int lev = 1; lev < nlevs; lev++) {\n+ geom[lev].define(domains[lev], &real_box, CoordSys::cartesian, is_per);\n+ }\n+\n+ Vector<DistributionMapping> dmap(nlevs);\n+\n+ // write some mesh data too, because tools like yt expect them to be there\n+ Vector<std::unique_ptr<MultiFab> > mf(nlevs);\n+ for (int lev = 0; lev < nlevs; lev++) {\n+ dmap[lev] = DistributionMapping{ba[lev]};\n+ mf[lev] = std::make_unique<MultiFab>(ba[lev], dmap[lev], ncomp, nghost);\n+ mf[lev]->setVal(lev);\n+ }\n+\n+ // these don't really matter, make something up\n+ const Real time = 0.0;\n+\n+ Vector<std::string> varnames;\n+ for (int i = 0; i < ncomp; ++i)\n+ {\n+ varnames.push_back(\"component_\" + std::to_string(i));\n+ }\n+\n+ Vector<int> level_steps(nlevs, 0);\n+\n+ char fname[512];\n+ for (int ts = 0; ts < nplotfile; ts++) {\n+ std::snprintf(fname, sizeof fname, \"%splt%05d\", directory.c_str(), ts);\n+\n+ amrex::Print() << \"Writing plot file [\" << fname << \"] ...\" << std::endl;\n+\n+ WriteMultiLevelPlotfile(fname, nlevs, amrex::GetVecOfConstPtrs(mf),\n+ varnames, geom, time, level_steps, ref_ratio);\n+\n+ amrex::Print() << \" done \\n\";\n+ }\n+\n+ // Add some particles\n+ constexpr int NReal = 12;\n+ constexpr int NInt = 4;\n+\n+ typedef ParticleContainerPureSoA<NReal, NInt> MyPC;\n+ MyPC myPC(geom, dmap, ba, ref_ratio);\n+ myPC.SetVerbose(false);\n+\n+ int num_particles = nppc * AMREX_D_TERM(ncells, * ncells, * ncells);\n+ bool serialize = false;\n+ int iseed = 451;\n+ MyPC::ParticleInitData pdata = {{}, {},\n+ {1.0, 2.0, 3.0, 4.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0, 13.0},\n+ {5, 14, 15, 16}};\n+\n+ if (nparticlefile > 0) {\n+ amrex::Print() << \"Init particles ...\" << std::endl;\n+\n+ myPC.InitRandom(num_particles, iseed, pdata, serialize);\n+\n+ amrex::Print() << \" done \\n\";\n+\n+ Vector<std::string> particle_realnames;\n+ for (int i = 0; i < NReal; ++i)\n+ particle_realnames.push_back(\"particle_real_component_\" + std::to_string(i));\n+\n+ Vector<std::string> particle_intnames;\n+ for (int i = 0; i < NInt; ++i)\n+ particle_intnames.push_back(\"particle_int_component_\" + std::to_string(i));\n+\n+ for (int ts = 0; ts < nparticlefile; ts++) {\n+ std::snprintf(fname, sizeof fname, \"%splt%05d\", directory.c_str(), ts);\n+\n+ amrex::Print() << \"Writing particle file [\" << fname << \"] ...\" << std::endl;\n+\n+ myPC.Checkpoint(fname, \"particle0\", false, particle_realnames, particle_intnames);\n+\n+ amrex::Print() << \" done \\n\";\n+ }\n+ }\n+\n+ AsyncOut::Finish();\n+ ParallelDescriptor::Barrier();\n+\n+ char directory_path[512];\n+ if (restart_check && nparticlefile > 0)\n+ {\n+ MyPC newPC(geom, dmap, ba, ref_ratio);\n+ std::snprintf(directory_path, sizeof directory_path, \"%s%s\", directory.c_str(), \"plt00000\");\n+ newPC.Restart(directory_path, \"particle0\");\n+\n+ using PType = typename MyPC::SuperParticleType;\n+\n+ for (int icomp=0; icomp<NReal; ++icomp)\n+ {\n+ amrex::Print() << \"working on comp \" << icomp << \"\\n\";\n+ auto sm_new = amrex::ReduceSum(newPC,\n+ [=] AMREX_GPU_HOST_DEVICE (const PType& p) -> Real\n+ {\n+ return p.rdata(icomp);\n+ });\n+\n+ auto sm_old = amrex::ReduceSum(myPC,\n+ [=] AMREX_GPU_HOST_DEVICE (const PType& p) -> Real\n+ {\n+ return p.rdata(icomp);\n+ });\n+\n+ ParallelDescriptor::ReduceRealSum(sm_new);\n+ ParallelDescriptor::ReduceRealSum(sm_old);\n+\n+ amrex::Print() << sm_old << \" \" << sm_new << \"\\n\";\n+ AMREX_ALWAYS_ASSERT(sm_old == sm_new);\n+ }\n+\n+ for (int icomp=0; icomp<NInt; ++icomp)\n+ {\n+ amrex::Print() << \"working on comp \" << icomp << \"\\n\";\n+ auto sm_new = amrex::ReduceSum(newPC,\n+ [=] AMREX_GPU_HOST_DEVICE (const PType& p) -> Real\n+ {\n+ return p.idata(icomp);\n+ });\n+\n+ auto sm_old = amrex::ReduceSum(myPC,\n+ [=] AMREX_GPU_HOST_DEVICE (const PType& p) -> Real\n+ {\n+ return p.idata(icomp);\n+ });\n+\n+ ParallelDescriptor::ReduceRealSum(sm_new);\n+ ParallelDescriptor::ReduceRealSum(sm_old);\n+\n+ amrex::Print() << sm_old << \" \" << sm_new << \"\\n\";\n+ AMREX_ALWAYS_ASSERT(sm_old == sm_new);\n+ }\n+ }\n+}\n+\n+void set_grids_nested (Vector<Box>& domains,\n+ Vector<BoxArray>& grids,\n+ Vector<IntVect>& ref_ratio)\n+{\n+ int ncells, max_grid_size, nlevs;\n+\n+ ParmParse pp;\n+ pp.get(\"ncells\", ncells);\n+ pp.get(\"max_grid_size\", max_grid_size);\n+ pp.get(\"nlevs\", nlevs);\n+\n+ AMREX_ALWAYS_ASSERT(nlevs < 2); // relax this later\n+\n+ IntVect domain_lo(AMREX_D_DECL(0, 0, 0));\n+ IntVect domain_hi(AMREX_D_DECL(ncells-1, ncells-1, ncells-1));\n+\n+ domains.resize(nlevs);\n+ domains[0].setSmall(domain_lo);\n+ domains[0].setBig(domain_hi);\n+\n+ ref_ratio.resize(nlevs-1);\n+ for (int lev = 1; lev < nlevs; lev++)\n+ ref_ratio[lev-1] = IntVect(AMREX_D_DECL(2, 2, 2));\n+\n+ grids.resize(nlevs);\n+ grids[0].define(domains[0]);\n+\n+ // Now we make the refined level be the center eighth of the domain\n+ if (nlevs > 1) {\n+ int n_fine = ncells*ref_ratio[0][0];\n+ IntVect refined_lo(AMREX_D_DECL(n_fine/4,n_fine/4,n_fine/4));\n+ IntVect refined_hi(AMREX_D_DECL(3*n_fine/4-1,3*n_fine/4-1,3*n_fine/4-1));\n+\n+ // Build a box for the level 1 domain\n+ Box refined_patch(refined_lo, refined_hi);\n+ grids[1].define(refined_patch);\n+ }\n+\n+ // break the BoxArrays at both levels into max_grid_size^3 boxes\n+ for (int lev = 0; lev < nlevs; lev++) {\n+ grids[lev].maxSize(max_grid_size);\n+ }\n+\n+ for (int lev = 1; lev < nlevs; lev++) {\n+ domains[lev] = amrex::refine(domains[lev-1], ref_ratio[lev-1]);\n+ }\n+}\ndiff --git a/Tests/Particles/CheckpointRestartSOA_AsyncIO/CMakeLists.txt b/Tests/Particles/CheckpointRestartSOA_AsyncIO/CMakeLists.txt\nnew file mode 100644\nindex 00000000000..087d3ad4998\n--- /dev/null\n+++ b/Tests/Particles/CheckpointRestartSOA_AsyncIO/CMakeLists.txt\n@@ -0,0 +1,14 @@\n+# This tests requires particle support\n+if (NOT AMReX_PARTICLES)\n+ return()\n+endif ()\n+\n+foreach(D IN LISTS AMReX_SPACEDIM)\n+ set(_sources main.cpp)\n+ set(_input_files inputs)\n+\n+ setup_test(${D} _sources _input_files)\n+\n+ unset(_sources)\n+ unset(_input_files)\n+endforeach()\ndiff --git a/Tests/Particles/CheckpointRestartSOA_AsyncIO/GNUmakefile b/Tests/Particles/CheckpointRestartSOA_AsyncIO/GNUmakefile\nnew file mode 120000\nindex 00000000000..402f7774f22\n--- /dev/null\n+++ b/Tests/Particles/CheckpointRestartSOA_AsyncIO/GNUmakefile\n@@ -0,0 +1,1 @@\n+../CheckpointRestartSOA/GNUmakefile\n\\ No newline at end of file\ndiff --git a/Tests/Particles/CheckpointRestartSOA_AsyncIO/Make.package b/Tests/Particles/CheckpointRestartSOA_AsyncIO/Make.package\nnew file mode 120000\nindex 00000000000..6fb6dc981b7\n--- /dev/null\n+++ b/Tests/Particles/CheckpointRestartSOA_AsyncIO/Make.package\n@@ -0,0 +1,1 @@\n+../CheckpointRestartSOA/Make.package\n\\ No newline at end of file\ndiff --git a/Tests/Particles/CheckpointRestartSOA_AsyncIO/inputs b/Tests/Particles/CheckpointRestartSOA_AsyncIO/inputs\nnew file mode 100644\nindex 00000000000..8efbea33ad4\n--- /dev/null\n+++ b/Tests/Particles/CheckpointRestartSOA_AsyncIO/inputs\n@@ -0,0 +1,28 @@\n+# Domain size\n+ncells = 64\n+\n+# Maximum allowable size of each subdomain in the problem domain;\n+# this is used to decompose the domain for parallel calculations.\n+max_grid_size = 8\n+\n+# Number of levels\n+nlevs = 1\n+\n+# Number of components in the multifabs\n+ncomp = 6\n+\n+# Number of particles per cell\n+nppc = 2\n+\n+# Number of plot files to write\n+nplotfile = 1\n+\n+# Number of plot files to write\n+nparticlefile = 1\n+\n+# Whether to check the correctness of Checkpoint / Restart\n+restart_check = 1\n+\n+directory=.\n+\n+amrex.async_out=1\n\\ No newline at end of file\ndiff --git a/Tests/Particles/CheckpointRestartSOA_AsyncIO/main.cpp b/Tests/Particles/CheckpointRestartSOA_AsyncIO/main.cpp\nnew file mode 120000\nindex 00000000000..36e9ca62484\n--- /dev/null\n+++ b/Tests/Particles/CheckpointRestartSOA_AsyncIO/main.cpp\n@@ -0,0 +1,1 @@\n+../CheckpointRestartSOA/main.cpp\n\\ No newline at end of file\n", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}52{"question_id": "MSB_AMReX-Codes_amrex_pr3350", "question_type": "multi_swe_bench", "description": "Ascent: SoA Particle Support (AMReX-Codes/amrex#3350)", "content": {"org": "AMReX-Codes", "repo": "amrex", "pr_number": 3350, "issue_title": "Ascent: SoA Particle Support", "issue_body": "## Summary\r\n\r\nAdd support for pure SoA layouted particle containers for Ascent.\r\n\r\n## Additional background\r\n\r\nFollow-up to #2878.\r\n\r\n## Checklist\r\n\r\nThe proposed changes:\r\n- [ ] fix a bug or incorrect behavior in AMReX\r\n- [x] add new capabilities to AMReX\r\n- [ ] changes answers in the test suite to more than roundoff level\r\n- [ ] are likely to significantly affect the results of downstream AMReX users\r\n- [ ] include documentation in the code and/or rst files, if appropriate\r\n", "base_commit": "c51e0a3071f3f1d2a11b6c339bff58d4ba5e30e8", "resolved_issues": [{"number": 2878, "title": "Support SoA-Only Particles", "body": "## Summary\r\n\r\nFurther updates of #2853 where @atmyers and @ax3l can also push to.\r\n\r\n## Upgrade Guide for C++ API Changes\r\n\r\nThese PRs show changes to keep using the *old layout*:\r\n- example in WarpX: https://github.com/ECP-WarpX/WarpX/pull/3848\r\n- example in HiPACE++: https://github.com/Hi-PACE/hipace/pull/921\r\n- example in ImpactX: https://github.com/ECP-WarpX/impactx/pull/342\r\n- example in pyAMReX: https://github.com/AMReX-Codes/pyamrex/pull/119\r\n\r\nThese PRs show changes to *use the new layout* (pure SoA):\r\n- example in WarpX: https://github.com/ECP-WarpX/WarpX/pull/3850\r\n- example in ImpactX: https://github.com/ECP-WarpX/impactx/pull/348\r\n- example in pyAMReX: https://github.com/AMReX-Codes/pyamrex/pull/124\r\n\r\n## Additional background\r\n\r\n## Checklist\r\n\r\nThe proposed changes:\r\n- [ ] fix a bug or incorrect behavior in AMReX\r\n- [x] add new capabilities to AMReX\r\n- [ ] changes answers in the test suite to more than roundoff level\r\n- [ ] are likely to significantly affect the results of downstream AMReX users\r\n- [ ] include documentation in the code and/or rst files, if appropriate\r\n"}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/amrex-codes_m_amrex:pr-3350", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/Src/Extern/Conduit/AMReX_Conduit_Blueprint.H b/Src/Extern/Conduit/AMReX_Conduit_Blueprint.H\nindex 6d23bcf07ed..9ac8eb31fd0 100644\n--- a/Src/Extern/Conduit/AMReX_Conduit_Blueprint.H\n+++ b/Src/Extern/Conduit/AMReX_Conduit_Blueprint.H\n@@ -96,9 +96,8 @@ namespace amrex\n // coordset and fields used to represent the passed particle container.\n // This allows you to use unique names to wrap multiple particle containers\n // into a single blueprint tree.\n- template <int NStructReal, int NStructInt, int NArrayReal, int NArrayInt>\n- void ParticleContainerToBlueprint (const ParticleContainer<NStructReal,\n- NStructInt,\n+ template <typename ParticleType, int NArrayReal, int NArrayInt>\n+ void ParticleContainerToBlueprint (const ParticleContainer_impl<ParticleType,\n NArrayReal,\n NArrayInt> &pc,\n const Vector<std::string> &real_comp_names,\ndiff --git a/Src/Extern/Conduit/AMReX_Conduit_Blueprint_ParticlesI.H b/Src/Extern/Conduit/AMReX_Conduit_Blueprint_ParticlesI.H\nindex f2d7d1ed2da..e4186ba247b 100644\n--- a/Src/Extern/Conduit/AMReX_Conduit_Blueprint_ParticlesI.H\n+++ b/Src/Extern/Conduit/AMReX_Conduit_Blueprint_ParticlesI.H\n@@ -20,10 +20,9 @@ namespace amrex\n // Note:\n // This is a helper function, it's not part of the AMReX Blueprint Interface.\n //---------------------------------------------------------------------------//\n-template <int NStructReal, int NStructInt, int NArrayReal, int NArrayInt>\n+template <typename ParticleType, int NArrayReal, int NArrayInt>\n void\n-ParticleTileToBlueprint(const ParticleTile<amrex::Particle<NStructReal,\n- NStructInt>,\n+ParticleTileToBlueprint(const ParticleTile<ParticleType,\n NArrayReal,\n NArrayInt> &ptile,\n const Vector<std::string> &real_comp_names,\n@@ -31,15 +30,11 @@ ParticleTileToBlueprint(const ParticleTile<amrex::Particle<NStructReal,\n conduit::Node &res,\n const std::string &topology_name)\n {\n- int num_particles = ptile.GetArrayOfStructs().size();\n- int struct_size = sizeof(Particle<NStructReal, NStructInt>);\n+ int num_particles = ptile.size();\n \n // knowing the above, we can zero copy the x,y,z positions + id, cpu\n // and any user fields in the AOS\n \n- // get the first particle's struct\n- const auto &pstruct = ptile.GetArrayOfStructs();\n-\n // setup a blueprint description for the particle mesh\n // create a coordinate set\n std::string coordset_name = topology_name + \"_coords\";\n@@ -63,29 +58,56 @@ ParticleTileToBlueprint(const ParticleTile<amrex::Particle<NStructReal,\n //----------------------------------//\n // point locations from from aos\n //----------------------------------//\n+ char* pbuf = nullptr;\n \n- const char* pbuf_const = reinterpret_cast<const char*>(pstruct.data());\n- char* pbuf = const_cast<char*>(pbuf_const);\n+ if constexpr(ParticleType::is_soa_particle)\n+ {\n+ amrex::ignore_unused(pbuf);\n \n- ParticleReal* xp = reinterpret_cast<ParticleReal*>(pbuf); pbuf += sizeof(ParticleReal);\n- n_coords[\"values/x\"].set_external(xp,\n- num_particles,\n- 0,\n- struct_size);\n+ const auto &soa = ptile.GetStructOfArrays();\n+\n+ // for soa entries, we can use standard strides,\n+ // since these are contiguous arrays\n+\n+ n_coords[\"values/x\"].set_external(const_cast<ParticleReal*>(&soa.GetRealData(0)[0]),\n+ num_particles);\n #if AMREX_SPACEDIM > 1\n- ParticleReal* yp = reinterpret_cast<ParticleReal*>(pbuf); pbuf += sizeof(ParticleReal);\n- n_coords[\"values/y\"].set_external(yp,\n- num_particles,\n- 0,\n- struct_size);\n+ n_coords[\"values/y\"].set_external(const_cast<ParticleReal*>(&soa.GetRealData(1)[0]),\n+ num_particles);\n #endif\n #if AMREX_SPACEDIM > 2\n- ParticleReal* zp = reinterpret_cast<ParticleReal*>(pbuf); pbuf += sizeof(ParticleReal);\n- n_coords[\"values/z\"].set_external(zp,\n- num_particles,\n- 0,\n- struct_size);\n+ n_coords[\"values/z\"].set_external(const_cast<ParticleReal*>(&soa.GetRealData(2)[0]),\n+ num_particles);\n+#endif\n+ } else\n+ {\n+ // get the first particle's struct\n+ const auto &pstruct = ptile.GetArrayOfStructs();\n+ const int struct_size = sizeof(ParticleType);\n+\n+ const char* pbuf_const = reinterpret_cast<const char*>(pstruct.data());\n+ pbuf = const_cast<char*>(pbuf_const);\n+\n+ ParticleReal* xp = reinterpret_cast<ParticleReal*>(pbuf); pbuf += sizeof(ParticleReal);\n+ n_coords[\"values/x\"].set_external(xp,\n+ num_particles,\n+ 0,\n+ struct_size);\n+#if AMREX_SPACEDIM > 1\n+ ParticleReal* yp = reinterpret_cast<ParticleReal*>(pbuf); pbuf += sizeof(ParticleReal);\n+ n_coords[\"values/y\"].set_external(yp,\n+ num_particles,\n+ 0,\n+ struct_size);\n+#endif\n+#if AMREX_SPACEDIM > 2\n+ ParticleReal* zp = reinterpret_cast<ParticleReal*>(pbuf); pbuf += sizeof(ParticleReal);\n+ n_coords[\"values/z\"].set_external(zp,\n+ num_particles,\n+ 0,\n+ struct_size);\n #endif\n+ }\n \n // fields\n conduit::Node &n_fields = res[\"fields\"];\n@@ -95,20 +117,26 @@ ParticleTileToBlueprint(const ParticleTile<amrex::Particle<NStructReal,\n // -----------------------------\n \n int vname_real_idx = 0;\n- // struct real fields, the first set are always the particle positions\n- // which we wrap above\n- for (int i = 0; i < NStructReal; i++)\n+ if constexpr(!ParticleType::is_soa_particle)\n {\n- ParticleReal* val = reinterpret_cast<ParticleReal*>(pbuf); pbuf += sizeof(ParticleReal);\n- conduit::Node &n_f = n_fields[real_comp_names.at(vname_real_idx)];\n- n_f[\"topology\"] = topology_name;\n- n_f[\"association\"] = \"element\";\n- n_f[\"values\"].set_external(val,\n- num_particles,\n- 0,\n- struct_size);\n+ constexpr int struct_size = sizeof(ParticleType);\n+ constexpr int NStructReal = ParticleType::NReal;\n \n- vname_real_idx++;\n+ // struct real fields, the first set are always the particle positions\n+ // which we wrap above\n+ for (int i = 0; i < NStructReal; i++)\n+ {\n+ ParticleReal* val = reinterpret_cast<ParticleReal*>(pbuf); pbuf += sizeof(ParticleReal);\n+ conduit::Node &n_f = n_fields[real_comp_names.at(vname_real_idx)];\n+ n_f[\"topology\"] = topology_name;\n+ n_f[\"association\"] = \"element\";\n+ n_f[\"values\"].set_external(val,\n+ num_particles,\n+ 0,\n+ struct_size);\n+\n+ vname_real_idx++;\n+ }\n }\n \n //----------------------------------//\n@@ -116,44 +144,77 @@ ParticleTileToBlueprint(const ParticleTile<amrex::Particle<NStructReal,\n // (id, cpu)\n //----------------------------------//\n \n- // id is the first int entry\n- int* id = reinterpret_cast<int*>(pbuf); pbuf += sizeof(int);\n- conduit::Node &n_f_id = n_fields[topology_name + \"_id\"];\n+ if constexpr(!ParticleType::is_soa_particle)\n+ {\n+ const int struct_size = sizeof(ParticleType);\n+\n+ // id is the first int entry\n+ int* id = reinterpret_cast<int*>(pbuf); pbuf += sizeof(int);\n+ conduit::Node &n_f_id = n_fields[topology_name + \"_id\"];\n+\n+ n_f_id[\"topology\"] = topology_name;\n+ n_f_id[\"association\"] = \"element\";\n+ n_f_id[\"values\"].set_external(id,\n+ num_particles,\n+ 0,\n+ struct_size);\n+\n+ // cpu is the second int entry\n+ int* cpu = reinterpret_cast<int*>(pbuf); pbuf += sizeof(int);\n+ conduit::Node &n_f_cpu = n_fields[topology_name + \"_cpu\"];\n+\n+ n_f_cpu[\"topology\"] = topology_name;\n+ n_f_cpu[\"association\"] = \"element\";\n+ n_f_cpu[\"values\"].set_external(cpu,\n+ num_particles,\n+ 0,\n+ struct_size);\n+ } else {\n+ const auto &soa = ptile.GetStructOfArrays();\n+\n+ // for soa entries, we can use standard strides,\n+ // since these are contiguous arrays\n \n- n_f_id[\"topology\"] = topology_name;\n- n_f_id[\"association\"] = \"element\";\n- n_f_id[\"values\"].set_external(id,\n- num_particles,\n- 0,\n- struct_size);\n+ // id is the first int entry\n+ conduit::Node &n_f_id = n_fields[topology_name + \"_id\"];\n \n- // cpu is the second int entry\n- int* cpu = reinterpret_cast<int*>(pbuf); pbuf += sizeof(int);\n- conduit::Node &n_f_cpu = n_fields[topology_name + \"_cpu\"];\n+ n_f_id[\"topology\"] = topology_name;\n+ n_f_id[\"association\"] = \"element\";\n+ n_f_id[\"values\"].set_external(const_cast<int*>(&soa.GetIntData(0)[0]),\n+ num_particles);\n \n- n_f_cpu[\"topology\"] = topology_name;\n- n_f_cpu[\"association\"] = \"element\";\n- n_f_cpu[\"values\"].set_external(cpu,\n- num_particles,\n- 0,\n- struct_size);\n+ // cpu is the second int entry\n+ conduit::Node &n_f_cpu = n_fields[topology_name + \"_cpu\"];\n+\n+ n_f_cpu[\"topology\"] = topology_name;\n+ n_f_cpu[\"association\"] = \"element\";\n+ n_f_cpu[\"values\"].set_external(const_cast<int*>(&soa.GetIntData(0)[0]),\n+ num_particles);\n+\n+ }\n \n // --------------------------------\n // user defined, integer aos fields\n // --------------------------------\n \n int vname_int_idx = 0;\n- for (int i = 0; i < NStructInt; i++)\n+ if constexpr(!ParticleType::is_soa_particle)\n {\n- int* val = reinterpret_cast<int*>(pbuf); pbuf += sizeof(int);\n- conduit::Node &n_f = n_fields[int_comp_names.at(vname_int_idx)];\n- n_f[\"topology\"] = topology_name;\n- n_f[\"association\"] = \"element\";\n- n_f[\"values\"].set_external(val,\n- num_particles,\n- 0,\n- struct_size);\n- vname_int_idx++;\n+ constexpr int struct_size = sizeof(ParticleType);\n+ constexpr int NStructInt = ParticleType::NInt;\n+\n+ for (int i = 0; i < NStructInt; i++)\n+ {\n+ int* val = reinterpret_cast<int*>(pbuf); pbuf += sizeof(int);\n+ conduit::Node &n_f = n_fields[int_comp_names.at(vname_int_idx)];\n+ n_f[\"topology\"] = topology_name;\n+ n_f[\"association\"] = \"element\";\n+ n_f[\"values\"].set_external(val,\n+ num_particles,\n+ 0,\n+ struct_size);\n+ vname_int_idx++;\n+ }\n }\n \n // -------------------------\n@@ -193,10 +254,9 @@ ParticleTileToBlueprint(const ParticleTile<amrex::Particle<NStructReal,\n //---------------------------------------------------------------------------//\n // Converts a AMReX Particle Container into a Conduit Mesh Blueprint Hierarchy.\n //---------------------------------------------------------------------------//\n-template <int NStructReal, int NStructInt, int NArrayReal, int NArrayInt>\n+template <typename ParticleType, int NArrayReal, int NArrayInt>\n void\n-ParticleContainerToBlueprint(const ParticleContainer<NStructReal,\n- NStructInt,\n+ParticleContainerToBlueprint(const ParticleContainer_impl<ParticleType,\n NArrayReal,\n NArrayInt> &pc,\n const Vector<std::string> &real_comp_names,\n@@ -209,8 +269,13 @@ ParticleContainerToBlueprint(const ParticleContainer<NStructReal,\n // validate varnames, which are used to provide field names\n // for user defined aos and soa values.\n \n- BL_ASSERT(real_comp_names.size() == (NStructReal + NArrayReal) );\n- BL_ASSERT(int_comp_names.size() == (NStructInt + NArrayInt) );\n+ if constexpr(ParticleType::is_soa_particle) {\n+ BL_ASSERT(real_comp_names.size() == NArrayReal);\n+ BL_ASSERT(int_comp_names.size() == NArrayInt);\n+ } else {\n+ BL_ASSERT(real_comp_names.size() == (ParticleType::NReal + NArrayReal) );\n+ BL_ASSERT(int_comp_names.size() == (ParticleType::NInt + NArrayInt) );\n+ }\n \n int num_levels = pc.maxLevel() + 1;\n int num_domains = 0;\n@@ -224,7 +289,7 @@ ParticleContainerToBlueprint(const ParticleContainer<NStructReal,\n int rank = ParallelDescriptor::MyProc();\n int nprocs = ParallelDescriptor::NProcs();\n \n- using MyParConstIter = ParConstIter<NStructReal, NStructInt, NArrayReal, NArrayInt>;\n+ using MyParConstIter = ParConstIter_impl<ParticleType, NArrayReal, NArrayInt>;\n \n //\n // blueprint expects unique ids for each domain published\n"}, "test": {"test_patch": "diff --git a/Tests/Particles/Ascent_Insitu_SOA/CMakeLists.txt b/Tests/Particles/Ascent_Insitu_SOA/CMakeLists.txt\nnew file mode 100644\nindex 00000000000..82216a02af8\n--- /dev/null\n+++ b/Tests/Particles/Ascent_Insitu_SOA/CMakeLists.txt\n@@ -0,0 +1,13 @@\n+if ( NOT AMReX_ASCENT )\n+ return ()\n+endif ()\n+\n+foreach(D IN LISTS AMReX_SPACEDIM)\n+ set(_sources main.cpp)\n+ set(_input_files inputs.rt )\n+\n+ setup_test(${D} _sources _input_files NTASKS 2)\n+\n+ unset(_sources)\n+ unset(_input_files)\n+endforeach()\ndiff --git a/Tests/Particles/Ascent_Insitu_SOA/GNUmakefile b/Tests/Particles/Ascent_Insitu_SOA/GNUmakefile\nnew file mode 100644\nindex 00000000000..660e4a13f22\n--- /dev/null\n+++ b/Tests/Particles/Ascent_Insitu_SOA/GNUmakefile\n@@ -0,0 +1,24 @@\n+AMREX_HOME = ../../../\n+\n+DEBUG\t= FALSE\n+\n+DIM\t= 3\n+\n+COMP = gcc\n+\n+USE_MPI = TRUE\n+USE_OMP = FALSE\n+USE_CUDA = FALSE\n+\n+TINY_PROFILE = TRUE\n+USE_PARTICLES = TRUE\n+USE_ASCENT = TRUE\n+\n+include $(AMREX_HOME)/Tools/GNUMake/Make.defs\n+\n+include ./Make.package\n+include $(AMREX_HOME)/Src/Base/Make.package\n+include $(AMREX_HOME)/Src/Particle/Make.package\n+include $(AMREX_HOME)/Src/Extern/Conduit/Make.package\n+\n+include $(AMREX_HOME)/Tools/GNUMake/Make.rules\ndiff --git a/Tests/Particles/Ascent_Insitu_SOA/inputs.rt b/Tests/Particles/Ascent_Insitu_SOA/inputs.rt\nnew file mode 100644\nindex 00000000000..e34fda14923\n--- /dev/null\n+++ b/Tests/Particles/Ascent_Insitu_SOA/inputs.rt\n@@ -0,0 +1,10 @@\n+ascent.size = (32, 64, 64)\n+ascent.max_grid_size = 32\n+ascent.is_periodic = 1\n+ascent.num_ppc = 1\n+ascent.nlevs = 1\n+\n+ascent.num_runtime_real = 0\n+ascent.num_runtime_int = 0\n+\n+particles.do_tiling = 1\ndiff --git a/Tests/Particles/Ascent_Insitu_SOA/main.cpp b/Tests/Particles/Ascent_Insitu_SOA/main.cpp\nnew file mode 100644\nindex 00000000000..46e2af98422\n--- /dev/null\n+++ b/Tests/Particles/Ascent_Insitu_SOA/main.cpp\n@@ -0,0 +1,306 @@\n+#include <AMReX.H>\n+#include <AMReX_ParmParse.H>\n+#include <AMReX_Particles.H>\n+\n+#if !defined(AMREX_PARTICLES) || !defined(AMREX_USE_CONDUIT)\n+#error Incompatible AMReX library configuration! This tutorial requires AMREX_PARTICLES and AMREX_USE_CONDUIT\n+#endif\n+\n+#include <AMReX_Conduit_Blueprint.H>\n+\n+#include <ascent.hpp>\n+\n+#include <string>\n+\n+\n+using namespace amrex;\n+\n+static constexpr int NR = 7;\n+static constexpr int NI = 4;\n+\n+int num_runtime_real = 0;\n+int num_runtime_int = 0;\n+\n+bool remove_negative = true;\n+\n+void get_position_unit_cell (Real* r, const IntVect& nppc, int i_part)\n+{\n+ int nx = nppc[0];\n+#if AMREX_SPACEDIM > 1\n+ int ny = nppc[1];\n+#else\n+ int ny = 1;\n+#endif\n+#if AMREX_SPACEDIM > 2\n+ int nz = nppc[2];\n+#else\n+ int nz = 1;\n+#endif\n+\n+ int ix_part = i_part/(ny * nz);\n+ int iy_part = (i_part % (ny * nz)) % ny;\n+ int iz_part = (i_part % (ny * nz)) / ny;\n+\n+ r[0] = (0.5+ix_part)/nx;\n+ r[1] = (0.5+iy_part)/ny;\n+ r[2] = (0.5+iz_part)/nz;\n+}\n+\n+class TestParticleContainer\n+ : public amrex::ParticleContainerPureSoA<NR, NI>\n+{\n+\n+public:\n+\n+ TestParticleContainer (const Vector<amrex::Geometry> & a_geom,\n+ const Vector<amrex::DistributionMapping> & a_dmap,\n+ const Vector<amrex::BoxArray> & a_ba,\n+ const Vector<amrex::IntVect> & a_rr)\n+ : amrex::ParticleContainerPureSoA<NR, NI>(a_geom, a_dmap, a_ba, a_rr)\n+ {\n+ for (int i = 0; i < num_runtime_real; ++i)\n+ {\n+ AddRealComp(true);\n+ }\n+ for (int i = 0; i < num_runtime_int; ++i)\n+ {\n+ AddIntComp(true);\n+ }\n+ }\n+\n+ void InitParticles (const amrex::IntVect& a_num_particles_per_cell)\n+ {\n+ BL_PROFILE(\"InitParticles\");\n+\n+ const int lev = 0; // only add particles on level 0\n+ const Real* dx = Geom(lev).CellSize();\n+ const Real* plo = Geom(lev).ProbLo();\n+\n+ const int num_ppc = AMREX_D_TERM( a_num_particles_per_cell[0],\n+ *a_num_particles_per_cell[1],\n+ *a_num_particles_per_cell[2]);\n+\n+ for(MFIter mfi = MakeMFIter(lev); mfi.isValid(); ++mfi)\n+ {\n+ const Box& tile_box = mfi.tilebox();\n+\n+ std::array<Gpu::HostVector<ParticleReal>, NR> host_real;\n+ std::array<Gpu::HostVector<int>, NI> host_int;\n+\n+ std::vector<Gpu::HostVector<ParticleReal> > host_runtime_real(NumRuntimeRealComps());\n+ std::vector<Gpu::HostVector<int> > host_runtime_int(NumRuntimeIntComps());\n+\n+ for (IntVect iv = tile_box.smallEnd(); iv <= tile_box.bigEnd(); tile_box.next(iv))\n+ {\n+ for (int i_part=0; i_part<num_ppc;i_part++) {\n+ Real r[3];\n+ get_position_unit_cell(r, a_num_particles_per_cell, i_part);\n+\n+ amrex::Long id = ParticleType::NextID();\n+\n+ host_int[0].push_back(static_cast<int>(id));\n+ host_int[1].push_back(ParallelDescriptor::MyProc());\n+ host_real[0].push_back(static_cast<ParticleReal> (plo[0] + (iv[0] + r[0])*dx[0]));\n+#if AMREX_SPACEDIM > 1\n+ host_real[1].push_back(static_cast<ParticleReal> (plo[1] + (iv[1] + r[1])*dx[1]));\n+#endif\n+#if AMREX_SPACEDIM > 2\n+ host_real[2].push_back(static_cast<ParticleReal> (plo[2] + (iv[2] + r[2])*dx[2]));\n+#endif\n+\n+ for (int i = AMREX_SPACEDIM; i < NR; ++i)\n+ host_real[i].push_back(static_cast<ParticleReal>(id));\n+ for (int i = 2; i < NI; ++i)\n+ host_int[i].push_back(static_cast<int>(id));\n+ for (int i = 0; i < NumRuntimeRealComps(); ++i)\n+ host_runtime_real[i].push_back(static_cast<ParticleReal>(id));\n+ for (int i = 0; i < NumRuntimeIntComps(); ++i)\n+ host_runtime_int[i].push_back(static_cast<int>(id));\n+ }\n+ }\n+\n+ auto& particle_tile = DefineAndReturnParticleTile(lev, mfi.index(), mfi.LocalTileIndex());\n+ auto old_size = particle_tile.size();\n+ auto new_size = old_size + host_real[0].size();\n+ particle_tile.resize(new_size);\n+\n+ auto& soa = particle_tile.GetStructOfArrays();\n+ for (int i = 0; i < NR; ++i)\n+ {\n+ Gpu::copyAsync(Gpu::hostToDevice,\n+ host_real[i].begin(),\n+ host_real[i].end(),\n+ soa.GetRealData(i).begin() + old_size);\n+ }\n+\n+ for (int i = 0; i < NI; ++i)\n+ {\n+ Gpu::copyAsync(Gpu::hostToDevice,\n+ host_int[i].begin(),\n+ host_int[i].end(),\n+ soa.GetIntData(i).begin() + old_size);\n+ }\n+ for (int i = 0; i < NumRuntimeRealComps(); ++i)\n+ {\n+ Gpu::copyAsync(Gpu::hostToDevice,\n+ host_runtime_real[i].begin(),\n+ host_runtime_real[i].end(),\n+ soa.GetRealData(NR+i).begin() + old_size);\n+ }\n+\n+ for (int i = 0; i < NumRuntimeIntComps(); ++i)\n+ {\n+ Gpu::copyAsync(Gpu::hostToDevice,\n+ host_runtime_int[i].begin(),\n+ host_runtime_int[i].end(),\n+ soa.GetIntData(NI+i).begin() + old_size);\n+ }\n+\n+ Gpu::streamSynchronize();\n+ }\n+\n+ Redistribute();\n+ }\n+};\n+\n+struct TestParams\n+{\n+ IntVect size;\n+ int max_grid_size;\n+ int num_ppc;\n+ int is_periodic;\n+ int nlevs;\n+};\n+\n+void testAscent ();\n+\n+int main (int argc, char* argv[])\n+{\n+ amrex::Initialize(argc,argv);\n+\n+ amrex::Print() << \"Running redistribute test \\n\";\n+ testAscent();\n+\n+ amrex::Finalize();\n+}\n+\n+void get_test_params (TestParams& params, const std::string& prefix)\n+{\n+ ParmParse pp(prefix);\n+ pp.get(\"size\", params.size);\n+ pp.get(\"max_grid_size\", params.max_grid_size);\n+ pp.get(\"num_ppc\", params.num_ppc);\n+ pp.get(\"is_periodic\", params.is_periodic);\n+ pp.get(\"nlevs\", params.nlevs);\n+ pp.query(\"num_runtime_real\", num_runtime_real);\n+ pp.query(\"num_runtime_int\", num_runtime_int);\n+}\n+\n+void testAscent ()\n+{\n+ BL_PROFILE(\"testAscent\");\n+ TestParams params;\n+ get_test_params(params, \"ascent\");\n+\n+ int is_per[BL_SPACEDIM];\n+ for (int & d : is_per)\n+ d = params.is_periodic;\n+\n+ Vector<IntVect> rr(params.nlevs-1);\n+ for (int lev = 1; lev < params.nlevs; lev++)\n+ rr[lev-1] = IntVect(AMREX_D_DECL(2,2,2));\n+\n+ RealBox real_box;\n+ for (int n = 0; n < BL_SPACEDIM; n++)\n+ {\n+ real_box.setLo(n, 0.0);\n+ real_box.setHi(n, params.size[n]);\n+ }\n+\n+ IntVect domain_lo(AMREX_D_DECL(0, 0, 0));\n+ IntVect domain_hi(AMREX_D_DECL(params.size[0]-1,params.size[1]-1,params.size[2]-1));\n+ const Box base_domain(domain_lo, domain_hi);\n+\n+ Vector<Geometry> geom(params.nlevs);\n+ geom[0].define(base_domain, &real_box, CoordSys::cartesian, is_per);\n+ for (int lev = 1; lev < params.nlevs; lev++) {\n+ geom[lev].define(amrex::refine(geom[lev-1].Domain(), rr[lev-1]),\n+ &real_box, CoordSys::cartesian, is_per);\n+ }\n+\n+ Vector<BoxArray> ba(params.nlevs);\n+ Vector<DistributionMapping> dm(params.nlevs);\n+ auto lo = IntVect(AMREX_D_DECL(0, 0, 0));\n+ IntVect size = params.size;\n+ for (int lev = 0; lev < params.nlevs; ++lev)\n+ {\n+ ba[lev].define(Box(lo, lo+params.size-1));\n+ ba[lev].maxSize(params.max_grid_size);\n+ dm[lev].define(ba[lev]);\n+ lo += size/2;\n+ size *= 2;\n+ }\n+\n+ TestParticleContainer pc(geom, dm, ba, rr);\n+\n+ int npc = params.num_ppc;\n+ auto nppc = IntVect(AMREX_D_DECL(npc, npc, npc));\n+\n+ amrex::Print() << \"About to initialize particles \\n\";\n+\n+ pc.InitParticles(nppc);\n+\n+ {\n+ conduit::Node bp_mesh;\n+ /* TODO\n+ amrex::MultiLevelToBlueprint(\n+ nlev,\n+ amrex::GetVecOfConstPtrs(mf),\n+ varnames,\n+ geom,\n+ time,\n+ iteration,\n+ warpx.refRatio(),\n+ bp_mesh\n+ );\n+ */\n+\n+ // wrap pc for current species into a blueprint topology\n+ std::string const prefix = \"particle\";\n+ Vector<std::string> particle_varnames;\n+ for (int i = 0; i < pc.NumRealComps(); ++i) {\n+ particle_varnames.push_back(prefix + \"_real_\" + std::to_string(i));\n+ }\n+ Vector<std::string> particle_int_varnames;\n+ for (int i = 0; i < pc.NumIntComps(); ++i) {\n+ particle_int_varnames.push_back(prefix + \"_int_\" + std::to_string(i));\n+ }\n+\n+ amrex::ParticleContainerToBlueprint(pc,\n+ particle_varnames,\n+ particle_int_varnames,\n+ bp_mesh,\n+ prefix);\n+ // publish\n+ ascent::Ascent ascent;\n+ conduit::Node opts;\n+ opts[\"exceptions\"] = \"catch\";\n+ opts[\"mpi_comm\"] = MPI_Comm_c2f(ParallelDescriptor::Communicator());\n+ ascent.open(opts);\n+ ascent.publish(bp_mesh);\n+\n+ // If you want to save blueprint HDF5 files w/o using an Ascent\n+ // extract, you can call the following AMReX helper:\n+ // const auto step = istep[0];\n+ // amrex::WriteBlueprintFiles(bp_mesh, \"bp_export\", step, \"hdf5\");\n+\n+ // render\n+ conduit::Node actions;\n+ ascent.execute(actions);\n+ ascent.close();\n+ }\n+\n+ // the way this test is set up, if we make it here we pass\n+ amrex::Print() << \"pass \\n\";\n+}\n+\n", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}53{"question_id": "MSB_AMReX-Codes_amrex_pr3581", "question_type": "multi_swe_bench", "description": "BCType::ext_dir_cc (AMReX-Codes/amrex#3581)", "content": {"org": "AMReX-Codes", "repo": "amrex", "pr_number": 3581, "issue_title": "BCType::ext_dir_cc", "issue_body": "Add a new BC type `BCType::ext_dir_cc` to address the issue in #3580. For cell conservation interpolation, the boundary location for `BCType::ext_dir` is on the domain face. Applications assuming boundary location at cell centers can now use `BCType::ext_dir_cc`.\r\n\r\n## Checklist\r\n\r\nThe proposed changes:\r\n- [x] fix a bug or incorrect behavior in AMReX\r\n- [ ] add new capabilities to AMReX\r\n- [ ] changes answers in the test suite to more than roundoff level\r\n- [ ] are likely to significantly affect the results of downstream AMReX users\r\n- [ ] include documentation in the code and/or rst files, if appropriate\r\n", "base_commit": "fd2dfa282a30c497b692398cc0db9b18e6c4de85", "resolved_issues": [{"number": 3580, "title": "Location of ext_dir", "body": "I just looked more carefully into this. When we need to fill a fine cell from spatial interpolation and it is near the physical boundary, we may need to use the physical boundary conditions stored in coarse level ghost cells to compute slopes. The BC type bug does not affect how ghost cells outside physical boundary are filled, because it calls a user provided function that does not use the BC type we set. For Flash-X, this function is `gr_fillPhysicalBC`. What the BC type bug affects is how slopes are computed. See https://github.com/AMReX-Codes/amrex/blob/87556458d867cb9cb2f148b4bcfc920c67bc918a/Src/AmrCore/AMReX_MFInterp_C.H#L13 for an example. You may wonder whether we treat `ext_dir` and `hoextrap` differently. This is because historically BoxLib codes assumed that the boundary location of `ext_dir` and `hoextrap` is exactly on the face, not half cell outside. So this is actually a known defect for codes that assume the location is at half cell outside. Maybe we should introduce a new type called `ext_dir_cc`. So I assume some Flash-X tests have `ext_dir` BC. If so, in the interpolation function, it was treated as being at cell centered before that bug fix and now as being on the domain face.\r\n\r\n_Originally posted by @WeiqunZhang in https://github.com/AMReX-Codes/amrex/discussions/3578#discussioncomment-7190999_"}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/amrex-codes_m_amrex:pr-3581", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/Docs/sphinx_documentation/source/Basics.rst b/Docs/sphinx_documentation/source/Basics.rst\nindex fd2d12ee0b8..1227b5f7b71 100644\n--- a/Docs/sphinx_documentation/source/Basics.rst\n+++ b/Docs/sphinx_documentation/source/Basics.rst\n@@ -2537,12 +2537,27 @@ The basic idea behind physical boundary conditions is as follows:\n \n ext_dir\n \"External Dirichlet\". It is the user's responsibility to write a routine\n- to fill ghost cells (more details below).\n+ to fill ghost cells (more details below). The boundary location\n+ is on the domain face even when the data inside the domain are\n+ cell-centered.\n+\n+ ext_dir_cc\n+ \"External Dirichlet\". It is the user's responsibility to write a routine\n+ to fill ghost cells (more details below). The boundary location\n+ is at the cell center of ghost cells outside the domain.\n \n foextrap\n \"First Order Extrapolation\"\n First order extrapolation from last cell in interior.\n \n+ hoextrap\n+ \"High Order Extrapolation\". The boundary location is on the domain\n+ face even when the data inside the domain are cell-centered.\n+\n+ hoextrapcc\n+ \"High Order Extrapolation\" The boundary location is at the cell\n+ center of ghost cells outside the domain.\n+\n reflect_even\n Reflection from interior cells with sign\n unchanged, :math:`q(-i) = q(i)`.\ndiff --git a/Src/Amr/AMReX_StateDescriptor.cpp b/Src/Amr/AMReX_StateDescriptor.cpp\nindex 161090d1a7f..4f1e3c3fe1b 100644\n--- a/Src/Amr/AMReX_StateDescriptor.cpp\n+++ b/Src/Amr/AMReX_StateDescriptor.cpp\n@@ -19,7 +19,7 @@ StateDescriptor::bf_thread_safety (const int* /*lo*/,const int* /*hi*/,\n if (!bf_ext_dir_threadsafe) {\n bool has_ext_dir = false;\n for (int i=0; i<2*AMREX_SPACEDIM*ng && !has_ext_dir; ++i) {\n- has_ext_dir = bc[i]==BCType::ext_dir;\n+ has_ext_dir = ((bc[i]==BCType::ext_dir) || (bc[i]==BCType::ext_dir_cc));\n }\n if (has_ext_dir) { thread_safe = false; }\n }\ndiff --git a/Src/Base/AMReX_BCUtil.H b/Src/Base/AMReX_BCUtil.H\nindex dd4e814610c..3ebc53a0576 100644\n--- a/Src/Base/AMReX_BCUtil.H\n+++ b/Src/Base/AMReX_BCUtil.H\n@@ -9,11 +9,12 @@\n namespace amrex\n {\n // This is for filling cell-centered data outside physical domain\n- // (excluding periodic boundaries). It only fills\n- // BCType::foextrap, BCType::hoextrap, BCType::reflect_even, and\n- // BCType::reflect::odd. It does not fill BCType::ext_dir (i.e.,\n- // external Dirichlet). If you have BCType::ext_dir, you can\n- // copy, paste and rename this function, and then modify it.\n+ // (excluding periodic boundaries). It only fills BCType::foextrap,\n+ // BCType::hoextrap, BCType::hoextrapcc, BCType::reflect_even, and\n+ // BCType::reflect::odd. It does not fill BCType::ext_dir and\n+ // BCType::ext_dir_cc (i.e., external Dirichlet). If you have\n+ // BCType::ext_dir or BCType::ext_dir_cc, you can copy, paste and rename\n+ // this function, and then modify it.\n void FillDomainBoundary (MultiFab& phi, const Geometry& geom, const Vector<BCRec>& bc);\n }\n \ndiff --git a/Src/Base/AMReX_BCUtil.cpp b/Src/Base/AMReX_BCUtil.cpp\nindex c0a645ba05c..dc5b4f4f10c 100644\n--- a/Src/Base/AMReX_BCUtil.cpp\n+++ b/Src/Base/AMReX_BCUtil.cpp\n@@ -15,7 +15,7 @@ void dummy_cpu_fill_extdir (Box const& /*bx*/, Array4<Real> const& /*dest*/,\n const BCRec* /*bcr*/, const int /*bcomp*/,\n const int /*orig_comp*/)\n {\n- // do something for external Dirichlet (BCType::ext_dir) if there are\n+ // do something for external Dirichlet (BCType::ext_dir or BCType::ext_dir_cc) if there are\n }\n \n struct dummy_gpu_fill_extdir\n@@ -27,7 +27,7 @@ struct dummy_gpu_fill_extdir\n const BCRec* /*bcr*/, const int /*bcomp*/,\n const int /*orig_comp*/) const\n {\n- // do something for external Dirichlet (BCType::ext_dir) if there are\n+ // do something for external Dirichlet (BCType::ext_dir or BCType::ext_dir_cc) if there are\n }\n };\n \ndiff --git a/Src/Base/AMReX_BC_TYPES.H b/Src/Base/AMReX_BC_TYPES.H\nindex 872ac1eff5d..00fadd5e6d0 100644\n--- a/Src/Base/AMReX_BC_TYPES.H\n+++ b/Src/Base/AMReX_BC_TYPES.H\n@@ -44,10 +44,8 @@ SYMMETRY | Un REFLECT_ODD | REFLECT_EVEN | REFLECT_EVEN |\n \n \n INT_DIR : data taken from other grids or interpolated\n-EXT_DIR : data specified on EDGE (FACE) of bndry for the linear solvers\n- for application codes, the location of the EXT_DIR data will\n- depend on how they do reconstruction, and may be edge or\n- cell-centered.\n+EXT_DIR : data specified on EDGE (FACE)\n+EXT_DIR_CC : data specified at cell center\n HOEXTRAP : higher order extrapolation to EDGE of bndry\n HOEXTRAPCC : linear extrapolation to CELL of bndry\n FOEXTRAP : first order extrapolation from last cell in interior\n@@ -74,6 +72,7 @@ enum mathematicalBndryTypes : int {\n ext_dir = 3,\n hoextrap = 4,\n hoextrapcc = 5,\n+ ext_dir_cc = 6,\n user_1 = 1001,\n user_2 = 1002,\n user_3 = 1003\n@@ -94,6 +93,7 @@ enum mathematicalBndryTypes : int {\n #define EXT_DIR 3\n #define HOEXTRAP 4\n #define HOEXTRAPCC 5\n+#define EXT_DIR_CC 6\n \n #define Interior 0\n #define Inflow 1\ndiff --git a/Src/Base/AMReX_FILCC_1D.F90 b/Src/Base/AMReX_FILCC_1D.F90\nindex 873f67f5941..76e90a8d7a1 100644\n--- a/Src/Base/AMReX_FILCC_1D.F90\n+++ b/Src/Base/AMReX_FILCC_1D.F90\n@@ -14,7 +14,7 @@\n !! corner of q array\n !! \\param bc => array of boundary flags bc(SPACEDIM,lo:hi)\n !!\n-!! NOTE: all corner as well as edge data is filled if not EXT_DIR\n+!! NOTE: all corner as well as edge data is filled if not EXT_DIR/EXT_DIR_CC\n ! -----------------------------------------------------------\n \n #ifndef AMREX_XSDK\ndiff --git a/Src/Base/AMReX_FILCC_2D.F90 b/Src/Base/AMReX_FILCC_2D.F90\nindex 89ef77d8384..c2ca8f7ddaf 100644\n--- a/Src/Base/AMReX_FILCC_2D.F90\n+++ b/Src/Base/AMReX_FILCC_2D.F90\n@@ -16,7 +16,7 @@\n !! corner of q array\n !! \\param bc => array of boundary flags bc(SPACEDIM,lo:hi)\n !!\n-!! NOTE: all corner as well as edge data is filled if not EXT_DIR\n+!! NOTE: all corner as well as edge data is filled if not EXT_DIR/EXT_DIR_CC\n ! -----------------------------------------------------------\n \n subroutine filcc(q,q_l1,q_l2,q_h1,q_h2,domlo,domhi,dx,xlo,bc)\ndiff --git a/Src/Base/AMReX_FILCC_3D.F90 b/Src/Base/AMReX_FILCC_3D.F90\nindex aa3fec74ab0..59ce83d469d 100644\n--- a/Src/Base/AMReX_FILCC_3D.F90\n+++ b/Src/Base/AMReX_FILCC_3D.F90\n@@ -6,7 +6,7 @@\n !> This routine is intended to be a generic fill function\n !! for cell centered data. It knows how to exrapolate,\n !! and reflect data and can be used to supplement problem\n-!! specific fill functions (ie. EXT_DIR).\n+!! specific fill functions (ie. EXT_DIR/EXT_DIR_CC).\n !!\n !! \\param q <= array to fill\n !! \\param q_l1,q_l2,q_l3,q_h1,q_h2,q_h3 => index extent of q array\ndiff --git a/Src/Base/AMReX_FilCC_C.cpp b/Src/Base/AMReX_FilCC_C.cpp\nindex 7cdba486957..e2d8c6129fd 100644\n--- a/Src/Base/AMReX_FilCC_C.cpp\n+++ b/Src/Base/AMReX_FilCC_C.cpp\n@@ -41,7 +41,7 @@ void fab_filcc (Box const& bx, Array4<Real> const& qn, int ncomp,\n if (lo.x < ilo) {\n const int imin = lo.x;\n const int imax = ilo-1;\n- if (bc.lo(0) == BCType::ext_dir) {\n+ if (bc.lo(0) == BCType::ext_dir || bc.lo(0) == BCType::ext_dir_cc) {\n // Do nothing.\n } else if (bc.lo(0) == BCType::foextrap) {\n for (int k = lo.z; k <= hi.z; ++k) {\n@@ -88,7 +88,7 @@ void fab_filcc (Box const& bx, Array4<Real> const& qn, int ncomp,\n const int imin = ihi+1;\n const int imax = hi.x;\n \n- if (bc.hi(0) == BCType::ext_dir) {\n+ if (bc.hi(0) == BCType::ext_dir || bc.hi(0) == BCType::ext_dir_cc) {\n // Do nothing.\n } else if (bc.hi(0) == BCType::foextrap) {\n for (int k = lo.z; k <= hi.z; ++k) {\n@@ -136,7 +136,7 @@ void fab_filcc (Box const& bx, Array4<Real> const& qn, int ncomp,\n if (lo.y < jlo) {\n const int jmin = lo.y;\n const int jmax = jlo-1;\n- if (bc.lo(1) == BCType::ext_dir) {\n+ if (bc.lo(1) == BCType::ext_dir || bc.lo(1) == BCType::ext_dir_cc) {\n // Do nothing.\n } else if (bc.lo(1) == BCType::foextrap) {\n for (int k = lo.z; k <= hi.z; ++k) {\n@@ -182,7 +182,7 @@ void fab_filcc (Box const& bx, Array4<Real> const& qn, int ncomp,\n if (hi.y > jhi) {\n const int jmin = jhi+1;\n const int jmax = hi.y;\n- if (bc.hi(1) == BCType::ext_dir) {\n+ if (bc.hi(1) == BCType::ext_dir || bc.hi(1) == BCType::ext_dir_cc) {\n // Do nothing.\n } else if (bc.hi(1) == BCType::foextrap) {\n for (int k = lo.z; k <= hi.z; ++k) {\n@@ -231,7 +231,7 @@ void fab_filcc (Box const& bx, Array4<Real> const& qn, int ncomp,\n if (lo.z < klo) {\n const int kmin = lo.z;\n const int kmax = klo-1;\n- if (bc.lo(2) == BCType::ext_dir) {\n+ if (bc.lo(2) == BCType::ext_dir || bc.lo(2) == BCType::ext_dir_cc) {\n // Do nothing.\n } else if (bc.lo(2) == BCType::foextrap) {\n for (int k = kmin; k <= kmax; ++k) {\n@@ -277,7 +277,7 @@ void fab_filcc (Box const& bx, Array4<Real> const& qn, int ncomp,\n if (hi.z > khi) {\n const int kmin = khi+1;\n const int kmax = hi.z;\n- if (bc.hi(2) == BCType::ext_dir) {\n+ if (bc.hi(2) == BCType::ext_dir || bc.hi(2) == BCType::ext_dir_cc) {\n // Do nothing.\n } else if (bc.hi(2) == BCType::foextrap) {\n for (int k = kmin; k <= kmax; ++k) {\ndiff --git a/Src/Base/AMReX_bc_types.fi b/Src/Base/AMReX_bc_types.fi\nindex 2f3340ccfc4..d929b589b3d 100644\n--- a/Src/Base/AMReX_bc_types.fi\n+++ b/Src/Base/AMReX_bc_types.fi\n@@ -17,3 +17,5 @@\n PARAMETER (HOEXTRAP=4)\n INTEGER HOEXTRAPCC\n PARAMETER (HOEXTRAPCC=5)\n+ INTEGER EXT_DIR_CC\n+ PARAMETER (EXT_DIR_CC=6)\ndiff --git a/Src/Base/AMReX_bc_types_mod.F90 b/Src/Base/AMReX_bc_types_mod.F90\nindex c1c6f237ba8..5b8c58c255a 100644\n--- a/Src/Base/AMReX_bc_types_mod.F90\n+++ b/Src/Base/AMReX_bc_types_mod.F90\n@@ -15,6 +15,7 @@ module amrex_bc_types_module\n integer, parameter, public :: amrex_bc_ext_dir = 3\n integer, parameter, public :: amrex_bc_hoextrap = 4\n integer, parameter, public :: amrex_bc_hoextrapcc = 5\n+ integer, parameter, public :: amrex_bc_ext_dir_cc = 6\n integer, parameter, public :: amrex_bc_user_1 = 1001\n integer, parameter, public :: amrex_bc_user_2 = 1002\n integer, parameter, public :: amrex_bc_user_3 = 1003\ndiff --git a/Src/Base/AMReX_filcc_mod.F90 b/Src/Base/AMReX_filcc_mod.F90\nindex c1a2b2951f4..1cca9b84090 100644\n--- a/Src/Base/AMReX_filcc_mod.F90\n+++ b/Src/Base/AMReX_filcc_mod.F90\n@@ -165,7 +165,7 @@ subroutine amrex_filccn(lo, hi, q, q_lo, q_hi, ncomp, domlo, domhi, dx, xlo, bc)\n imin = lo(1)\n imax = ilo-1\n \n- if (bc(1,1,n) .eq. amrex_bc_ext_dir) then\n+ if (bc(1,1,n) .eq. amrex_bc_ext_dir .or. bc(1,1,n) .eq. amrex_bc_ext_dir_cc) then\n \n ! Do nothing.\n \n@@ -237,7 +237,7 @@ subroutine amrex_filccn(lo, hi, q, q_lo, q_hi, ncomp, domlo, domhi, dx, xlo, bc)\n imin = ihi+1\n imax = hi(1)\n \n- if (bc(1,2,n) .eq. amrex_bc_ext_dir) then\n+ if (bc(1,2,n) .eq. amrex_bc_ext_dir .or. bc(1,2,n) .eq. amrex_bc_ext_dir_cc) then\n \n ! Do nothing.\n \n@@ -311,7 +311,7 @@ subroutine amrex_filccn(lo, hi, q, q_lo, q_hi, ncomp, domlo, domhi, dx, xlo, bc)\n jmin = lo(2)\n jmax = jlo-1\n \n- if (bc(2,1,n) .eq. amrex_bc_ext_dir) then\n+ if (bc(2,1,n) .eq. amrex_bc_ext_dir .or. bc(2,1,n) .eq. amrex_bc_ext_dir_cc) then\n \n ! Do nothing.\n \n@@ -383,7 +383,7 @@ subroutine amrex_filccn(lo, hi, q, q_lo, q_hi, ncomp, domlo, domhi, dx, xlo, bc)\n jmin = jhi+1\n jmax = hi(2)\n \n- if (bc(2,2,n) .eq. amrex_bc_ext_dir) then\n+ if (bc(2,2,n) .eq. amrex_bc_ext_dir .or. bc(2,2,n) .eq. amrex_bc_ext_dir_cc) then\n \n ! Do nothing.\n \n@@ -461,7 +461,7 @@ subroutine amrex_filccn(lo, hi, q, q_lo, q_hi, ncomp, domlo, domhi, dx, xlo, bc)\n kmin = lo(3)\n kmax = klo-1\n \n- if (bc(3,1,n) .eq. amrex_bc_ext_dir) then\n+ if (bc(3,1,n) .eq. amrex_bc_ext_dir .or. bc(3,1,n) .eq. amrex_bc_ext_dir_cc) then\n \n ! Do nothing.\n \n@@ -533,7 +533,7 @@ subroutine amrex_filccn(lo, hi, q, q_lo, q_hi, ncomp, domlo, domhi, dx, xlo, bc)\n kmin = khi+1\n kmax = hi(3)\n \n- if (bc(3,2,n) .eq. amrex_bc_ext_dir) then\n+ if (bc(3,2,n) .eq. amrex_bc_ext_dir .or. bc(3,2,n) .eq. amrex_bc_ext_dir_cc) then\n \n ! Do nothing.\n \n"}, "test": {"test_patch": "diff --git a/Tests/FortranInterface/Advection_F/Source/fillpatch_mod.F90 b/Tests/FortranInterface/Advection_F/Source/fillpatch_mod.F90\nindex f337de6e7ff..c79f2aa7b9a 100644\n--- a/Tests/FortranInterface/Advection_F/Source/fillpatch_mod.F90\n+++ b/Tests/FortranInterface/Advection_F/Source/fillpatch_mod.F90\n@@ -90,7 +90,7 @@ subroutine fill_physbc (pmf, scomp, ncomp, time, pgeom) bind(c)\n geom%get_physical_location(plo), & ! physical location of lower left corner\n lo_bc, hi_bc) ! bc types for each component\n \n- ! amrex_filcc doesn't fill EXT_DIR (see amrex_bc_types_module for a list of bc types\n+ ! amrex_filcc doesn't fill EXT_DIR/EXT_DIR_CC (see amrex_bc_types_module for a list of bc types\n ! In that case, the user needs to fill it.\n end if\n end do\ndiff --git a/Tests/GPU/CNS/Source/CNS_bcfill.cpp b/Tests/GPU/CNS/Source/CNS_bcfill.cpp\nindex 1c787e29a96..a75c7ebce88 100644\n--- a/Tests/GPU/CNS/Source/CNS_bcfill.cpp\n+++ b/Tests/GPU/CNS/Source/CNS_bcfill.cpp\n@@ -14,7 +14,7 @@ struct CnsFillExtDir\n const BCRec* /*bcr*/, const int /*bcomp*/,\n const int /*orig_comp*/) const\n {\n- // do something for external Dirichlet (BCType::ext_dir)\n+ // do something for external Dirichlet (BCType::ext_dir/BCType::ext_dir_cc)\n }\n };\n \n", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}54{"question_id": "MSB_AMReX-Codes_amrex_pr3585", "question_type": "multi_swe_bench", "description": "Pure SoA Particle: Separate Array for IdCPU (AMReX-Codes/amrex#3585)", "content": {"org": "AMReX-Codes", "repo": "amrex", "pr_number": 3585, "issue_title": "Pure SoA Particle: Separate Array for IdCPU", "issue_body": "## Summary\r\n\r\nThis addresses a regression we see when moving to pure SoA particles:\r\n- slightly slower read/write to Ids when needed, e.g., for sorting\r\n- issues going up to the full 64bit range\r\n\r\n## Additional background\r\n\r\nOnce finished, this will close #3569.\r\n\r\n## Checklist\r\n\r\nThe proposed changes:\r\n- [ ] fix a bug or incorrect behavior in AMReX\r\n- [x] add new capabilities to AMReX\r\n- [ ] changes answers in the test suite to more than roundoff level\r\n- [ ] are likely to significantly affect the results of downstream AMReX users\r\n- [ ] include documentation in the code and/or rst files, if appropriate\r\n", "base_commit": "edb4c25027efbbc465c88d453441dcd7115d8651", "resolved_issues": [{"number": 3569, "title": "Pure SoA Particles: cpuid as Separate Array", "body": "For pure SoA particles, we noticed slight regressions in kernels that depend on ID operatins, e.g., for sorting, etc.\r\nThere reason for that lies in the now required double-load of two int32 arrays (cpu and ids) instead of a single load of a int64 array (cpuid) in AoS.\r\n\r\nAs a discussed solution to this with @atmyers, we should add a third default array to SoA particles:\r\n- 64bit cpuid (new)\r\n- Real (default: SPACEDIM members for positions)\r\n- int (default: no members)\r\n\r\ncc @AlexanderSinn "}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/amrex-codes_m_amrex:pr-3585", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/Src/Particle/AMReX_ParticleContainerI.H b/Src/Particle/AMReX_ParticleContainerI.H\nindex b845d130d5c..9dd1d39b953 100644\n--- a/Src/Particle/AMReX_ParticleContainerI.H\n+++ b/Src/Particle/AMReX_ParticleContainerI.H\n@@ -18,10 +18,10 @@ ParticleContainer_impl<ParticleType, NArrayReal, NArrayInt, Allocator, CellAssig\n if (h_redistribute_int_comp[i]) {++num_int_comm_comps;}\n }\n \n- if constexpr(!ParticleType::is_soa_particle) {\n- particle_size = sizeof(ParticleType);\n+ if constexpr (ParticleType::is_soa_particle) {\n+ particle_size = sizeof(uint64_t); // idcpu\n } else {\n- particle_size = 0;\n+ particle_size = sizeof(ParticleType);\n }\n superparticle_size = particle_size +\n num_real_comm_comps*sizeof(ParticleReal) + num_int_comm_comps*sizeof(int);\n@@ -1095,7 +1095,7 @@ ParticleContainer_impl<ParticleType, NArrayReal, NArrayInt, Allocator, CellAssig\n const size_t np_total = np + ptile.numNeighborParticles();\n \n if (memEfficientSort) {\n- if constexpr(!ParticleType::is_soa_particle) {\n+ if constexpr (!ParticleType::is_soa_particle) {\n static_assert(sizeof(ParticleType)%4 == 0 && sizeof(uint32_t) == 4);\n using tmp_t = std::conditional_t<sizeof(ParticleType)%8 == 0,\n uint64_t, uint32_t>;\n@@ -1530,7 +1530,7 @@ ParticleContainer_impl<ParticleType, NArrayReal, NArrayInt, Allocator, CellAssig\n unsigned npart = ptile_ptrs[pmap_it]->numParticles();\n ParticleLocData pld;\n \n- if constexpr(!ParticleType::is_soa_particle){\n+ if constexpr (!ParticleType::is_soa_particle){\n \n if (npart != 0) {\n Long last = npart - 1;\n@@ -1647,7 +1647,7 @@ ParticleContainer_impl<ParticleType, NArrayReal, NArrayInt, Allocator, CellAssig\n }\n }\n \n- } else{ // soa particle\n+ } else { // soa particle\n \n auto particle_tile = ptile_ptrs[pmap_it];\n if (npart != 0) {\n@@ -1663,6 +1663,7 @@ ParticleContainer_impl<ParticleType, NArrayReal, NArrayInt, Allocator, CellAssig\n }\n \n if (p.id() < 0){\n+ soa.GetIdCPUData()[pindex] = soa.GetIdCPUData()[last];\n for (int comp = 0; comp < NumRealComps(); comp++) {\n soa.GetRealData(comp)[pindex] = soa.GetRealData(comp)[last];\n }\n@@ -1679,6 +1680,7 @@ ParticleContainer_impl<ParticleType, NArrayReal, NArrayInt, Allocator, CellAssig\n particlePostLocate(p, pld, lev);\n \n if (p.id() < 0) {\n+ soa.GetIdCPUData()[pindex] = soa.GetIdCPUData()[last];\n for (int comp = 0; comp < NumRealComps(); comp++) {\n soa.GetRealData(comp)[pindex] = soa.GetRealData(comp)[last];\n }\n@@ -1696,6 +1698,10 @@ ParticleContainer_impl<ParticleType, NArrayReal, NArrayInt, Allocator, CellAssig\n // We own it but must shift it to another place.\n auto index = std::make_pair(pld.m_grid, pld.m_tile);\n AMREX_ASSERT(soa_local[pld.m_lev][index].size() == num_threads);\n+ {\n+ auto& arr = soa_local[pld.m_lev][index][thread_num].GetIdCPUData();\n+ arr.push_back(soa.GetIdCPUData()[pindex]);\n+ }\n for (int comp = 0; comp < NumRealComps(); ++comp) {\n RealVector& arr = soa_local[pld.m_lev][index][thread_num].GetRealData(comp);\n arr.push_back(soa.GetRealData(comp)[pindex]);\n@@ -1715,6 +1721,10 @@ ParticleContainer_impl<ParticleType, NArrayReal, NArrayInt, Allocator, CellAssig\n particles_to_send.resize(new_size);\n \n char* dst = &particles_to_send[old_size];\n+ {\n+ std::memcpy(dst, &soa.GetIdCPUData()[pindex], sizeof(uint64_t));\n+ dst += sizeof(uint64_t);\n+ }\n int array_comp_start = AMREX_SPACEDIM + NStructReal;\n for (int comp = 0; comp < NumRealComps(); comp++) {\n if (h_redistribute_real_comp[array_comp_start + comp]) {\n@@ -1733,6 +1743,7 @@ ParticleContainer_impl<ParticleType, NArrayReal, NArrayInt, Allocator, CellAssig\n }\n \n if (p.id() < 0){\n+ soa.GetIdCPUData()[pindex] = soa.GetIdCPUData()[last];\n for (int comp = 0; comp < NumRealComps(); comp++) {\n soa.GetRealData(comp)[pindex] = soa.GetRealData(comp)[last];\n }\n@@ -1747,6 +1758,10 @@ ParticleContainer_impl<ParticleType, NArrayReal, NArrayInt, Allocator, CellAssig\n ++pindex;\n }\n \n+ {\n+ auto& iddata = soa.GetIdCPUData();\n+ iddata.erase(iddata.begin() + last + 1, iddata.begin() + npart);\n+ }\n for (int comp = 0; comp < NumRealComps(); comp++) {\n RealVector& rdata = soa.GetRealData(comp);\n rdata.erase(rdata.begin() + last + 1, rdata.begin() + npart);\n@@ -1828,6 +1843,12 @@ ParticleContainer_impl<ParticleType, NArrayReal, NArrayInt, Allocator, CellAssig\n auto& soa = ptile.GetStructOfArrays();\n auto& soa_tmp = soa_local[lev][index];\n for (int i = 0; i < num_threads; ++i) {\n+ {\n+ auto& arr = soa.GetIdCPUData();\n+ auto& tmp = soa_tmp[i].GetIdCPUData();\n+ arr.insert(arr.end(), tmp.begin(), tmp.end());\n+ tmp.erase(tmp.begin(), tmp.end());\n+ }\n for (int comp = 0; comp < NumRealComps(); ++comp) {\n RealVector& arr = soa.GetRealData(comp);\n RealVector& tmp = soa_tmp[i].GetRealData(comp);\n@@ -2045,20 +2066,16 @@ RedistributeMPI (std::map<int, Vector<char> >& not_ours,\n \n Particle<NStructReal, NStructInt> p;\n \n- if constexpr (!ParticleType::is_soa_particle) {\n- std::memcpy(&p, pbuf, sizeof(ParticleType));\n- } else {\n+ if constexpr (ParticleType::is_soa_particle) {\n+ std::memcpy(&p.m_idcpu, pbuf, sizeof(uint64_t));\n+\n ParticleReal pos[AMREX_SPACEDIM];\n- std::memcpy(&pos[0], pbuf, AMREX_SPACEDIM*sizeof(ParticleReal));\n+ std::memcpy(&pos[0], pbuf + sizeof(uint64_t), AMREX_SPACEDIM*sizeof(ParticleReal));\n AMREX_D_TERM(p.pos(0) = pos[0];,\n p.pos(1) = pos[1];,\n p.pos(2) = pos[2]);\n-\n- int idcpu[2];\n- std::memcpy(&idcpu[0], pbuf + NumRealComps()*sizeof(ParticleReal), 2*sizeof(int));\n-\n- p.id() = idcpu[0];\n- p.cpu() = idcpu[1];\n+ } else {\n+ std::memcpy(&p, pbuf, sizeof(ParticleType));\n }\n \n bool success = Where(p, pld, lev_min, lev_max, 0);\n@@ -2097,7 +2114,12 @@ RedistributeMPI (std::map<int, Vector<char> >& not_ours,\n rcv_tile[ipart])];\n char* pbuf = ((char*) &recvdata[offset]) + j*superparticle_size;\n \n- if constexpr(! ParticleType::is_soa_particle) {\n+ if constexpr (ParticleType::is_soa_particle) {\n+ uint64_t idcpudata;\n+ std::memcpy(&idcpudata, pbuf, sizeof(uint64_t));\n+ pbuf += sizeof(uint64_t);\n+ ptile.GetStructOfArrays().GetIdCPUData().push_back(idcpudata);\n+ } else {\n ParticleType p;\n std::memcpy(&p, pbuf, sizeof(ParticleType));\n pbuf += sizeof(ParticleType);\n@@ -2146,6 +2168,10 @@ RedistributeMPI (std::map<int, Vector<char> >& not_ours,\n host_int_attribs.reserve(15);\n host_int_attribs.resize(finestLevel()+1);\n \n+ Vector<std::map<std::pair<int, int>, Gpu::HostVector<uint64_t> > > host_idcpu;\n+ host_idcpu.reserve(15);\n+ host_idcpu.resize(finestLevel()+1);\n+\n ipart = 0;\n for (int i = 0; i < nrcvs; ++i)\n {\n@@ -2159,7 +2185,15 @@ RedistributeMPI (std::map<int, Vector<char> >& not_ours,\n \n char* pbuf = ((char*) &recvdata[offset]) + j*superparticle_size;\n \n- if constexpr(! ParticleType::is_soa_particle) {\n+ host_real_attribs[lev][ind].resize(NumRealComps());\n+ host_int_attribs[lev][ind].resize(NumIntComps());\n+\n+ if constexpr (ParticleType::is_soa_particle) {\n+ uint64_t idcpudata;\n+ std::memcpy(&idcpudata, pbuf, sizeof(uint64_t));\n+ pbuf += sizeof(uint64_t);\n+ host_idcpu[lev][ind].push_back(idcpudata);\n+ } else {\n ParticleType p;\n std::memcpy(&p, pbuf, sizeof(ParticleType));\n pbuf += sizeof(ParticleType);\n@@ -2210,7 +2244,12 @@ RedistributeMPI (std::map<int, Vector<char> >& not_ours,\n auto new_size = old_size + src_tile.size();\n dst_tile.resize(new_size);\n \n- if constexpr(! ParticleType::is_soa_particle) {\n+ if constexpr (ParticleType::is_soa_particle) {\n+ Gpu::copyAsync(Gpu::hostToDevice,\n+ host_idcpu[host_lev][std::make_pair(grid,tile)].begin(),\n+ host_idcpu[host_lev][std::make_pair(grid,tile)].end(),\n+ dst_tile.GetStructOfArrays().GetIdCPUData().begin() + old_size);\n+ } else {\n Gpu::copyAsync(Gpu::hostToDevice,\n src_tile.begin(), src_tile.end(),\n dst_tile.GetArrayOfStructs().begin() + old_size);\ndiff --git a/Src/Particle/AMReX_ParticleIO.H b/Src/Particle/AMReX_ParticleIO.H\nindex ea24b1e5f81..8b2c7389c89 100644\n--- a/Src/Particle/AMReX_ParticleIO.H\n+++ b/Src/Particle/AMReX_ParticleIO.H\n@@ -964,6 +964,10 @@ ParticleContainer_impl<ParticleType, NArrayReal, NArrayInt, Allocator, CellAssig\n host_int_attribs.reserve(15);\n host_int_attribs.resize(finest_level_in_file+1);\n \n+ Vector<std::map<std::pair<int, int>, Gpu::HostVector<uint64_t> > > host_idcpu;\n+ host_idcpu.reserve(15);\n+ host_idcpu.resize(finestLevel()+1);\n+\n for (int i = 0; i < cnt; i++) {\n // note: for pure SoA particle layouts, we do write the id, cpu and positions as a struct\n // for backwards compatibility with readers\n@@ -1031,8 +1035,7 @@ ParticleContainer_impl<ParticleType, NArrayReal, NArrayInt, Allocator, CellAssig\n host_real_attribs[pld.m_lev][ind][j].push_back(ptemp.pos(j));\n }\n \n- host_int_attribs[pld.m_lev][ind][0].push_back(ptemp.id());\n- host_int_attribs[pld.m_lev][ind][1].push_back(ptemp.cpu());\n+ host_idcpu[pld.m_lev][ind].push_back(ptemp.m_idcpu);\n \n // read all other SoA\n // add the real...\n@@ -1042,7 +1045,7 @@ ParticleContainer_impl<ParticleType, NArrayReal, NArrayInt, Allocator, CellAssig\n }\n \n // ... and int array data\n- for (int icomp = 2; icomp < NumIntComps(); icomp++) {\n+ for (int icomp = 0; icomp < NumIntComps(); icomp++) {\n host_int_attribs[lev][ind][icomp].push_back(*iptr);\n ++iptr;\n }\n@@ -1071,6 +1074,11 @@ ParticleContainer_impl<ParticleType, NArrayReal, NArrayInt, Allocator, CellAssig\n {\n Gpu::copyAsync(Gpu::hostToDevice, src_tile.begin(), src_tile.end(),\n dst_tile.GetArrayOfStructs().begin() + old_size);\n+ } else {\n+ Gpu::copyAsync(Gpu::hostToDevice,\n+ host_idcpu[host_lev][std::make_pair(grid,tile)].begin(),\n+ host_idcpu[host_lev][std::make_pair(grid,tile)].end(),\n+ dst_tile.GetStructOfArrays().GetIdCPUData().begin() + old_size);\n }\n \n for (int i = 0; i < NumRealComps(); ++i) { // NOLINT(readability-misleading-indentation)\ndiff --git a/Src/Particle/AMReX_ParticleInit.H b/Src/Particle/AMReX_ParticleInit.H\nindex d2568d5d70e..75316dec746 100644\n--- a/Src/Particle/AMReX_ParticleInit.H\n+++ b/Src/Particle/AMReX_ParticleInit.H\n@@ -1062,6 +1062,10 @@ InitRandom (Long icount,\n host_int_attribs.reserve(15);\n host_int_attribs.resize(finestLevel()+1);\n \n+ Vector<std::map<std::pair<int, int>, Gpu::HostVector<uint64_t> > > host_idcpu;\n+ host_idcpu.reserve(15);\n+ host_idcpu.resize(finestLevel()+1);\n+\n for (Long j = 0; j < icount; j++)\n {\n Particle<0, 0> ptest;\n@@ -1117,8 +1121,9 @@ InitRandom (Long icount,\n host_real_attribs[pld.m_lev][ind][i].push_back(pos[j*AMREX_SPACEDIM+i]);\n }\n \n- host_int_attribs[pld.m_lev][ind][0].push_back(ParticleType::NextID());\n- host_int_attribs[pld.m_lev][ind][1].push_back(MyProc);\n+ host_idcpu[pld.m_lev][ind].push_back(0);\n+ ParticleIDWrapper(host_idcpu[pld.m_lev][ind].back()) = ParticleType::NextID();\n+ ParticleCPUWrapper(host_idcpu[pld.m_lev][ind].back()) = ParallelDescriptor::MyProc();\n \n host_particles[pld.m_lev][ind];\n \n@@ -1157,6 +1162,11 @@ InitRandom (Long icount,\n {\n Gpu::copyAsync(Gpu::hostToDevice, src_tile.begin(), src_tile.end(),\n dst_tile.GetArrayOfStructs().begin() + old_size);\n+ } else {\n+ Gpu::copyAsync(Gpu::hostToDevice,\n+ host_idcpu[host_lev][std::make_pair(grid,tile)].begin(),\n+ host_idcpu[host_lev][std::make_pair(grid,tile)].end(),\n+ dst_tile.GetStructOfArrays().GetIdCPUData().begin() + old_size);\n }\n \n for (int i = 0; i < NArrayReal; ++i) { // NOLINT(readability-misleading-indentation)\n@@ -1201,6 +1211,10 @@ InitRandom (Long icount,\n host_int_attribs.reserve(15);\n host_int_attribs.resize(finestLevel()+1);\n \n+ Vector<std::map<std::pair<int, int>, Gpu::HostVector<uint64_t> > > host_idcpu;\n+ host_idcpu.reserve(15);\n+ host_idcpu.resize(finestLevel()+1);\n+\n for (Long icnt = 0; icnt < M; icnt++) {\n Particle<0, 0> ptest;\n for (int i = 0; i < AMREX_SPACEDIM; i++) {\n@@ -1261,8 +1275,9 @@ InitRandom (Long icount,\n host_real_attribs[pld.m_lev][ind][i].push_back(ptest.pos(i));\n }\n \n- host_int_attribs[pld.m_lev][ind][0].push_back(ptest.id());\n- host_int_attribs[pld.m_lev][ind][1].push_back(ptest.cpu());\n+ host_idcpu[pld.m_lev][ind].push_back(0);\n+ ParticleIDWrapper(host_idcpu[pld.m_lev][ind].back()) = ParticleType::NextID();\n+ ParticleCPUWrapper(host_idcpu[pld.m_lev][ind].back()) = ParallelDescriptor::MyProc();\n \n host_particles[pld.m_lev][ind];\n \n@@ -1300,6 +1315,11 @@ InitRandom (Long icount,\n {\n Gpu::copyAsync(Gpu::hostToDevice, src_tile.begin(), src_tile.end(),\n dst_tile.GetArrayOfStructs().begin() + old_size);\n+ } else {\n+ Gpu::copyAsync(Gpu::hostToDevice,\n+ host_idcpu[host_lev][std::make_pair(grid,tile)].begin(),\n+ host_idcpu[host_lev][std::make_pair(grid,tile)].end(),\n+ dst_tile.GetStructOfArrays().GetIdCPUData().begin() + old_size);\n }\n \n for (int i = 0; i < NArrayReal; ++i) { // NOLINT(readability-misleading-indentation)\ndiff --git a/Src/Particle/AMReX_ParticleTile.H b/Src/Particle/AMReX_ParticleTile.H\nindex e35af847ec4..2b60b37d304 100644\n--- a/Src/Particle/AMReX_ParticleTile.H\n+++ b/Src/Particle/AMReX_ParticleTile.H\n@@ -43,6 +43,7 @@ struct ParticleTileData\n \n ParticleType* AMREX_RESTRICT m_aos;\n \n+ uint64_t* m_idcpu;\n GpuArray<ParticleReal*, NAR> m_rdata;\n GpuArray<int*, NAI> m_idata;\n \n@@ -67,7 +68,7 @@ struct ParticleTileData\n if constexpr(!ParticleType::is_soa_particle) {\n return this->m_aos[index].id();\n } else {\n- return this->m_idata[0][index];\n+ return ParticleIDWrapper(this->m_idcpu[index]);\n }\n }\n \n@@ -77,7 +78,17 @@ struct ParticleTileData\n if constexpr(!ParticleType::is_soa_particle) {\n return this->m_aos[index].cpu();\n } else {\n- return this->m_idata[1][index];\n+ return ParticleCPUWrapper(this->m_idcpu[index]);\n+ }\n+ }\n+\n+ [[nodiscard]] AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE\n+ decltype(auto) idcpu (const int index) const &\n+ {\n+ if constexpr(ParticleType::is_soa_particle) {\n+ return this->m_idcpu[index];\n+ } else {\n+ amrex::Abort(\"not implemented\");\n }\n }\n \n@@ -112,6 +123,9 @@ struct ParticleTileData\n if constexpr (!ParticleType::is_soa_particle) {\n memcpy(dst, m_aos + src_index, sizeof(ParticleType));\n dst += sizeof(ParticleType);\n+ } else {\n+ memcpy(dst, m_idcpu + src_index, sizeof(uint64_t));\n+ dst += sizeof(uint64_t);\n }\n int array_start_index = AMREX_SPACEDIM + NStructReal;\n for (int i = 0; i < NAR; ++i)\n@@ -160,6 +174,9 @@ struct ParticleTileData\n if constexpr (!ParticleType::is_soa_particle) {\n memcpy(m_aos + dst_index, src, sizeof(ParticleType));\n src += sizeof(ParticleType);\n+ } else {\n+ memcpy(m_idcpu + dst_index, src, sizeof(uint64_t));\n+ src += sizeof(uint64_t);\n }\n int array_start_index = AMREX_SPACEDIM + NStructReal;\n for (int i = 0; i < NAR; ++i)\n@@ -231,9 +248,8 @@ struct ParticleTileData\n {\n AMREX_ASSERT(index < m_size);\n SuperParticleType sp;\n+ sp.m_idcpu = m_idcpu[index];\n for (int i = 0; i < AMREX_SPACEDIM; ++i) {sp.pos(i) = m_rdata[i][index];}\n- sp.id() = m_idata[0][index];\n- sp.cpu() = m_idata[1][index];\n for (int i = 0; i < NAR; ++i) {\n sp.rdata(i) = m_rdata[i][index];\n }\n@@ -270,6 +286,7 @@ struct ParticleTileData\n AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE\n void setSuperParticle (const SuperParticleType& sp, int index) const noexcept\n {\n+ m_idcpu[index] = sp.m_idcpu;\n for (int i = 0; i < NAR; ++i) {\n m_rdata[i][index] = sp.rdata(i);\n }\n@@ -303,10 +320,10 @@ struct ConstSoAParticle : SoAParticleBase\n //functions to get id and cpu in the SOA data\n \n [[nodiscard]] AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE\n- int cpu () const { return this->m_constparticle_tile_data.m_idata[1][m_index]; }\n+ ConstParticleCPUWrapper cpu () const { return this->m_constparticle_tile_data.m_idcpu[m_index]; }\n \n [[nodiscard]] AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE\n- int id () const { return this->m_constparticle_tile_data.m_idata[0][m_index]; }\n+ ConstParticleIDWrapper id () const { return this->m_constparticle_tile_data.m_idcpu[m_index]; }\n \n //functions to get positions of the particle in the SOA data\n \n@@ -366,16 +383,22 @@ struct SoAParticle : SoAParticleBase\n //functions to get id and cpu in the SOA data\n \n [[nodiscard]] AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE\n- int& cpu () & { return this->m_particle_tile_data.m_idata[1][m_index]; }\n+ ParticleCPUWrapper cpu () & { return this->m_particle_tile_data.m_idcpu[m_index]; }\n+\n+ [[nodiscard]] AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE\n+ ParticleIDWrapper id () & { return this->m_particle_tile_data.m_idcpu[m_index]; }\n \n [[nodiscard]] AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE\n- int& id () & { return this->m_particle_tile_data.m_idata[0][m_index]; }\n+ uint64_t& idcpu () & { return this->m_particle_tile_data.m_idcpu[m_index]; }\n \n [[nodiscard]] AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE\n- const int& cpu () const & { return this->m_particle_tile_data.m_idata[1][m_index]; }\n+ ConstParticleCPUWrapper cpu () const & { return this->m_particle_tile_data.m_idcpu[m_index]; }\n \n [[nodiscard]] AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE\n- const int& id () const & { return this->m_particle_tile_data.m_idata[0][m_index]; }\n+ ConstParticleIDWrapper id () const & { return this->m_particle_tile_data.m_idcpu[m_index]; }\n+\n+ [[nodiscard]] AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE\n+ const uint64_t& idcpu () const & { return this->m_particle_tile_data.m_idcpu[m_index]; }\n \n //functions to get positions of the particle in the SOA data\n \n@@ -477,6 +500,7 @@ struct ConstParticleTileData\n Long m_size;\n const ParticleType* AMREX_RESTRICT m_aos;\n \n+ const uint64_t* m_idcpu;\n GpuArray<const ParticleReal*, NArrayReal> m_rdata;\n GpuArray<const int*, NArrayInt > m_idata;\n \n@@ -496,7 +520,7 @@ struct ConstParticleTileData\n if constexpr(!ParticleType::is_soa_particle) {\n return this->m_aos[index].id();\n } else {\n- return this->m_idata[0][index];\n+ return ConstParticleIDWrapper(this->m_idcpu[index]);\n }\n }\n \n@@ -506,7 +530,17 @@ struct ConstParticleTileData\n if constexpr(!ParticleType::is_soa_particle) {\n return this->m_aos[index].cpu();\n } else {\n- return this->m_idata[1][index];\n+ return ConstParticleCPUWrapper(this->m_idcpu[index]);\n+ }\n+ }\n+\n+ [[nodiscard]] AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE\n+ decltype(auto) idcpu (const int index) const &\n+ {\n+ if constexpr(ParticleType::is_soa_particle) {\n+ return this->m_idcpu[index];\n+ } else {\n+ amrex::Abort(\"not implemented\");\n }\n }\n \n@@ -546,6 +580,9 @@ struct ConstParticleTileData\n if constexpr (!ParticleType::is_soa_particle) {\n memcpy(dst, m_aos + src_index, sizeof(ParticleType));\n dst += sizeof(ParticleType);\n+ } else {\n+ memcpy(dst, m_idcpu + src_index, sizeof(uint64_t));\n+ dst += sizeof(uint64_t);\n }\n int array_start_index = AMREX_SPACEDIM + NStructReal;\n for (int i = 0; i < NArrayReal; ++i)\n@@ -622,8 +659,7 @@ struct ConstParticleTileData\n AMREX_ASSERT(index < m_size);\n SuperParticleType sp;\n for (int i = 0; i < AMREX_SPACEDIM; ++i) {sp.pos(i) = m_rdata[i][index];}\n- sp.id() = m_idata[0][index];\n- sp.cpu() = m_idata[1][index];\n+ sp.m_idcpu = m_idcpu[index];\n for (int i = 0; i < NAR; ++i) {\n sp.rdata(i) = m_rdata[i][index];\n }\n@@ -663,7 +699,10 @@ struct ParticleTile\n ArrayOfStructs<ParticleType, Allocator>>::type;\n //using ParticleVector = typename AoS::ParticleVector;\n \n- using SoA = StructOfArrays<NArrayReal, NArrayInt, Allocator>;\n+ using SoA = typename std::conditional<\n+ ParticleType::is_soa_particle,\n+ StructOfArrays<NArrayReal, NArrayInt, Allocator, true>,\n+ StructOfArrays<NArrayReal, NArrayInt, Allocator, false>>::type;\n using RealVector = typename SoA::RealVector;\n using IntVector = typename SoA::IntVector;\n using StorageParticleType = typename ParticleType::StorageParticleType;\n@@ -688,7 +727,7 @@ struct ParticleTile\n if constexpr (!ParticleType::is_soa_particle) {\n return m_aos_tile[index].id();\n } else {\n- return m_soa_tile.GetIntData(0)[index];\n+ return ParticleIDWrapper(m_soa_tile.GetIdCPUData()[index]);\n }\n }\n \n@@ -697,7 +736,7 @@ struct ParticleTile\n if constexpr (!ParticleType::is_soa_particle) {\n return m_aos_tile[index].id();\n } else {\n- return m_soa_tile.GetIntData(0)[index];\n+ return ConstParticleIDWrapper(m_soa_tile.GetIdCPUData()[index]);\n }\n }\n \n@@ -706,7 +745,7 @@ struct ParticleTile\n if constexpr (!ParticleType::is_soa_particle) {\n return m_aos_tile[index].cpu();\n } else {\n- return m_soa_tile.GetIntData(1)[index];\n+ return ParticleCPUWrapper(m_soa_tile.GetIdCPUData()[index]);\n }\n }\n \n@@ -715,7 +754,7 @@ struct ParticleTile\n if constexpr (!ParticleType::is_soa_particle) {\n return m_aos_tile[index].cpu();\n } else {\n- return m_soa_tile.GetIntData(1)[index];\n+ return ConstParticleCPUWrapper(m_soa_tile.GetIdCPUData()[index]);\n }\n }\n \n@@ -873,7 +912,9 @@ struct ParticleTile\n }\n \n m_soa_tile.resize(np+1);\n-\n+ if constexpr (!ParticleType::is_soa_particle) {\n+ m_soa_tile.GetIdCPUData()[np] = sp.m_idcpu;\n+ }\n auto& arr_rdata = m_soa_tile.GetRealData();\n auto& arr_idata = m_soa_tile.GetIntData();\n for (int i = 0; i < NArrayReal; ++i) {\n@@ -1092,6 +1133,11 @@ struct ParticleTile\n } else {\n ptd.m_aos = nullptr;\n }\n+ if constexpr (ParticleType::is_soa_particle) {\n+ ptd.m_idcpu = m_soa_tile.GetIdCPUData().dataPtr();\n+ } else {\n+ ptd.m_idcpu = nullptr;\n+ }\n if constexpr(NArrayReal > 0) {\n for (int i = 0; i < NArrayReal; ++i) {\n ptd.m_rdata[i] = m_soa_tile.GetRealData(i).dataPtr();\n@@ -1157,6 +1203,11 @@ struct ParticleTile\n } else {\n ptd.m_aos = nullptr;\n }\n+ if constexpr (ParticleType::is_soa_particle) {\n+ ptd.m_idcpu = m_soa_tile.GetIdCPUData().dataPtr();\n+ } else {\n+ ptd.m_idcpu = nullptr;\n+ }\n if constexpr(NArrayReal > 0) {\n for (int i = 0; i < NArrayReal; ++i) {\n ptd.m_rdata[i] = m_soa_tile.GetRealData(i).dataPtr();\ndiff --git a/Src/Particle/AMReX_ParticleTransformation.H b/Src/Particle/AMReX_ParticleTransformation.H\nindex 28ccfa84a97..aa737455ce6 100644\n--- a/Src/Particle/AMReX_ParticleTransformation.H\n+++ b/Src/Particle/AMReX_ParticleTransformation.H\n@@ -35,7 +35,11 @@ void copyParticle (const ParticleTileData<T_ParticleType, NAR, NAI>& dst,\n AMREX_ASSERT(dst.m_num_runtime_real == src.m_num_runtime_real);\n AMREX_ASSERT(dst.m_num_runtime_int == src.m_num_runtime_int );\n \n- dst.m_aos[dst_i] = src.m_aos[src_i];\n+ if constexpr(!T_ParticleType::is_soa_particle) {\n+ dst.m_aos[dst_i] = src.m_aos[src_i];\n+ } else {\n+ dst.m_idcpu[dst_i] = src.m_idcpu[src_i];\n+ }\n if constexpr(NAR > 0) {\n for (int j = 0; j < NAR; ++j) {\n dst.m_rdata[j][dst_i] = src.m_rdata[j][src_i];\ndiff --git a/Src/Particle/AMReX_StructOfArrays.H b/Src/Particle/AMReX_StructOfArrays.H\nindex 0ef3b8ae869..6cd498e20a2 100644\n--- a/Src/Particle/AMReX_StructOfArrays.H\n+++ b/Src/Particle/AMReX_StructOfArrays.H\n@@ -11,9 +11,11 @@\n namespace amrex {\n \n template <int NReal, int NInt,\n- template<class> class Allocator=DefaultAllocator>\n+ template<class> class Allocator=DefaultAllocator,\n+ bool use64BitIdCpu=false>\n struct StructOfArrays {\n \n+ using IdCPU = amrex::PODVector<uint64_t, Allocator<uint64_t> >;\n using RealVector = amrex::PODVector<ParticleReal, Allocator<ParticleReal> >;\n using IntVector = amrex::PODVector<int, Allocator<int> >;\n \n@@ -28,9 +30,12 @@ struct StructOfArrays {\n \n [[nodiscard]] int NumIntComps () const noexcept { return NInt + m_runtime_idata.size(); }\n \n+ [[nodiscard]] IdCPU& GetIdCPUData () { return m_idcpu; }\n [[nodiscard]] std::array<RealVector, NReal>& GetRealData () { return m_rdata; }\n [[nodiscard]] std::array< IntVector, NInt>& GetIntData () { return m_idata; }\n \n+ /** Get access to the particle id/cpu Arrays */\n+ [[nodiscard]] const IdCPU& GetIdCPUData () const { return m_idcpu; }\n /** Get access to the particle Real Arrays (only compile-time components) */\n [[nodiscard]] const std::array<RealVector, NReal>& GetRealData () const { return m_rdata; }\n /** Get access to the particle Int Arrays (only compile-time components) */\n@@ -119,7 +124,9 @@ struct StructOfArrays {\n */\n [[nodiscard]] std::size_t size () const\n {\n- if constexpr (NReal > 0) {\n+ if constexpr (use64BitIdCpu == true) {\n+ return m_idcpu.size();\n+ } else if constexpr (NReal > 0) {\n return m_rdata[0].size();\n } else if constexpr (NInt > 0) {\n return m_idata[0].size();\n@@ -175,6 +182,9 @@ struct StructOfArrays {\n \n void resize (size_t count)\n {\n+ if constexpr (use64BitIdCpu == true) {\n+ m_idcpu.resize(count);\n+ }\n if constexpr (NReal > 0) {\n for (int i = 0; i < NReal; ++i) { m_rdata[i].resize(count); }\n }\n@@ -185,6 +195,15 @@ struct StructOfArrays {\n for (int i = 0; i < int(m_runtime_idata.size()); ++i) { m_runtime_idata[i].resize(count); }\n }\n \n+ [[nodiscard]] IdCPU* idcpuarray () {\n+ if constexpr (use64BitIdCpu == true) {\n+ return m_idcpu.dataPtr();\n+ } else {\n+ return nullptr;\n+ }\n+\n+ }\n+\n [[nodiscard]] GpuArray<ParticleReal*, NReal> realarray ()\n {\n GpuArray<Real*, NReal> arr;\n@@ -208,6 +227,7 @@ struct StructOfArrays {\n int m_num_neighbor_particles{0};\n \n private:\n+ IdCPU m_idcpu;\n std::array<RealVector, NReal> m_rdata;\n std::array< IntVector, NInt> m_idata;\n \ndiff --git a/Src/Particle/AMReX_WriteBinaryParticleData.H b/Src/Particle/AMReX_WriteBinaryParticleData.H\nindex 31ca7f8df6a..d3cafc5be58 100644\n--- a/Src/Particle/AMReX_WriteBinaryParticleData.H\n+++ b/Src/Particle/AMReX_WriteBinaryParticleData.H\n@@ -338,9 +338,10 @@ packIOData (Vector<int>& idata, Vector<ParticleReal>& rdata, const PC& pc, int l\n else {\n amrex::ignore_unused(is_checkpoint);\n // Int: id, cpu\n- *iptr = soa.GetIntData(0)[pindex];\n+ uint64_t idcpu = soa.GetIdCPUData()[pindex];\n+ *iptr = (int) ParticleIDWrapper(idcpu);\n iptr += 1;\n- *iptr = soa.GetIntData(1)[pindex];\n+ *iptr = (int) ParticleCPUWrapper(idcpu);\n iptr += 1;\n \n // Real: position\n@@ -348,8 +349,8 @@ packIOData (Vector<int>& idata, Vector<ParticleReal>& rdata, const PC& pc, int l\n rptr += AMREX_SPACEDIM;\n }\n \n- // extra SoA int data\n- const int int_start_offset = PC::ParticleType::is_soa_particle ? 2 : 0; // pure SoA: skip id, cpu\n+ // SoA int data\n+ const int int_start_offset = 0;\n for (int j = int_start_offset; j < pc.NumIntComps(); j++) {\n if (write_int_comp[PC::NStructInt+j]) {\n *iptr = soa.GetIntData(j)[pindex];\n@@ -1021,14 +1022,15 @@ void WriteBinaryParticleDataAsync (PC const& pc,\n }\n else {\n // Ints: id, cpu\n- *iptr = soa.GetIntData(0)[pindex];\n+ uint64_t idcpu = soa.GetIdCPUData()[pindex];\n+ *iptr = (int) ParticleIDWrapper(idcpu);\n iptr += 1;\n- *iptr = soa.GetIntData(1)[pindex];\n+ *iptr = (int) ParticleCPUWrapper(idcpu);\n iptr += 1;\n }\n \n // extra SoA Ints\n- const int int_start_offset = PC::ParticleType::is_soa_particle ? 2 : 0; // pure SoA: skip id, cpu\n+ const int int_start_offset = 0;\n for (int j = int_start_offset; j < nic; j++)\n {\n if (write_int_comp[NStructInt+j])\n"}, "test": {"test_patch": "diff --git a/Tests/Particles/RedistributeSOA/main.cpp b/Tests/Particles/RedistributeSOA/main.cpp\nindex 94715b7d6aa..62da81def81 100644\n--- a/Tests/Particles/RedistributeSOA/main.cpp\n+++ b/Tests/Particles/RedistributeSOA/main.cpp\n@@ -92,6 +92,7 @@ class TestParticleContainer\n {\n const Box& tile_box = mfi.tilebox();\n \n+ Gpu::HostVector<uint64_t> host_idcpu;\n std::array<Gpu::HostVector<ParticleReal>, NR> host_real;\n std::array<Gpu::HostVector<int>, NI> host_int;\n \n@@ -106,6 +107,10 @@ class TestParticleContainer\n \n amrex::Long id = ParticleType::NextID();\n \n+ host_idcpu.push_back(0);\n+ ParticleIDWrapper(host_idcpu.back()) = id;\n+ ParticleCPUWrapper(host_idcpu.back()) = ParallelDescriptor::MyProc();\n+\n host_int[0].push_back(static_cast<int>(id));\n host_int[1].push_back(ParallelDescriptor::MyProc());\n host_real[0].push_back(static_cast<ParticleReal> (plo[0] + (iv[0] + r[0])*dx[0]));\n@@ -137,6 +142,13 @@ class TestParticleContainer\n particle_tile.resize(new_size);\n \n auto& soa = particle_tile.GetStructOfArrays();\n+ {\n+ Gpu::copyAsync(Gpu::hostToDevice,\n+ host_idcpu.begin(),\n+ host_idcpu.end(),\n+ soa.GetIdCPUData().begin() + old_size);\n+\n+ }\n for (int i = 0; i < NR; ++i)\n {\n Gpu::copyAsync(Gpu::hostToDevice,\n", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}55{"question_id": "MSB_AMReX-Codes_amrex_pr388", "question_type": "multi_swe_bench", "description": "Bunch of changes to support MLMG performance analysis and tuning (AMReX-Codes/amrex#388)", "content": {"org": "AMReX-Codes", "repo": "amrex", "pr_number": 388, "issue_title": "Bunch of changes to support MLMG performance analysis and tuning", "issue_body": "", "base_commit": "839bba4a149a1fb74de7ad3c861aad2737586720", "resolved_issues": [{"number": 393, "title": "Weiqun/perf", "body": "some minor changes\r\n"}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/amrex-codes_m_amrex:pr-388", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/Src/Base/AMReX.cpp b/Src/Base/AMReX.cpp\nindex d42c0cca2d4..ec0a2f92e94 100644\n--- a/Src/Base/AMReX.cpp\n+++ b/Src/Base/AMReX.cpp\n@@ -20,6 +20,8 @@\n \n #include <AMReX_Gpu.H>\n \n+#include <AMReX_Machine.H>\n+\n #ifdef AMREX_USE_EB\n #include <AMReX_EB2.H>\n #endif\n@@ -533,6 +535,7 @@ amrex::Initialize (int& argc, char**& argv, bool build_parm_parse,\n #endif\n BL_PROFILE_INITPARAMS();\n #endif\n+ machine::Initialize();\n \n if (double(std::numeric_limits<long>::max()) < 9.e18)\n {\ndiff --git a/Src/Base/AMReX_DistributionMapping.H b/Src/Base/AMReX_DistributionMapping.H\nindex 7e399dab103..b7c7f38ed15 100644\n--- a/Src/Base/AMReX_DistributionMapping.H\n+++ b/Src/Base/AMReX_DistributionMapping.H\n@@ -156,7 +156,9 @@ class DistributionMapping\n static DistributionMapping makeRoundRobin (const MultiFab& weight);\n static DistributionMapping makeSFC (const MultiFab& weight, bool sort=true);\n \n- static std::vector<std::vector<int> > makeSFC (const BoxArray& ba);\n+ // if use_box_vol is true, weight boxes by their volume in Distribute\n+ // otherwise, all boxes will be treated with equal weight\n+ static std::vector<std::vector<int> > makeSFC (const BoxArray& ba, bool use_box_vol=true);\n \n private:\n \ndiff --git a/Src/Base/AMReX_DistributionMapping.cpp b/Src/Base/AMReX_DistributionMapping.cpp\nindex 009f265a004..29a2fe32e55 100644\n--- a/Src/Base/AMReX_DistributionMapping.cpp\n+++ b/Src/Base/AMReX_DistributionMapping.cpp\n@@ -24,6 +24,10 @@\n #include <cstring>\n #include <iomanip>\n \n+namespace {\n+int flag_verbose_mapper;\n+}\n+\n namespace amrex {\n \n bool initialized = false;\n@@ -111,14 +115,16 @@ DistributionMapping::Initialize ()\n sfc_threshold = 0;\n max_efficiency = 0.9;\n node_size = 0;\n+ flag_verbose_mapper = 0;\n \n ParmParse pp(\"DistributionMapping\");\n \n- pp.query(\"v\" , verbose);\n- pp.query(\"verbose\", verbose);\n- pp.query(\"efficiency\", max_efficiency);\n- pp.query(\"sfc_threshold\", sfc_threshold);\n- pp.query(\"node_size\", node_size);\n+ pp.query(\"v\" , verbose);\n+ pp.query(\"verbose\", verbose);\n+ pp.query(\"efficiency\", max_efficiency);\n+ pp.query(\"sfc_threshold\", sfc_threshold);\n+ pp.query(\"node_size\", node_size);\n+ pp.query(\"verbose_mapper\", flag_verbose_mapper);\n \n std::string theStrategy;\n \n@@ -192,21 +198,10 @@ DistributionMapping::LeastUsedCPUs (int nprocs,\n BL_PROFILE(\"DistributionMapping::LeastUsedCPUs()\");\n \n AMREX_ASSERT(nprocs <= ParallelContext::NProcsSub());\n- Vector<long> bytes(ParallelContext::NProcsSub());\n \n+ Vector<long> bytes(ParallelContext::NProcsSub());\n long thisbyte = amrex::TotalBytesAllocatedInFabs()/1024;\n-\n- BL_COMM_PROFILE(BLProfiler::Allgather, sizeof(long), BLProfiler::BeforeCall(),\n- BLProfiler::NoTag());\n- MPI_Allgather(&thisbyte,\n- 1,\n- ParallelDescriptor::Mpi_typemap<long>::type(),\n- bytes.dataPtr(),\n- 1,\n- ParallelDescriptor::Mpi_typemap<long>::type(),\n- ParallelContext::CommunicatorSub());\n- BL_COMM_PROFILE(BLProfiler::Allgather, sizeof(long), BLProfiler::AfterCall(),\n- BLProfiler::NoTag());\n+ ParallelAllGather::AllGather(thisbyte, bytes.dataPtr(), ParallelContext::CommunicatorSub());\n \n std::vector<LIpair> LIpairV;\n \n@@ -225,6 +220,13 @@ DistributionMapping::LeastUsedCPUs (int nprocs,\n {\n result[i] = LIpairV[i].second;\n }\n+\n+ if (flag_verbose_mapper) {\n+ Print() << \"LeastUsedCPUs:\" << std::endl;\n+ for (const auto &p : LIpairV) {\n+ Print() << \" Rank \" << p.second << \" contains \" << p.first << std::endl;\n+ }\n+ }\n #else\n for (int i(0); i < nprocs; ++i)\n {\n@@ -244,21 +246,9 @@ DistributionMapping::LeastUsedTeams (Vector<int> & rteam,\n \n AMREX_ALWAYS_ASSERT(ParallelContext::CommunicatorSub() == ParallelDescriptor::Communicator());\n \n- Vector<long> bytes(ParallelDescriptor::NProcs());\n-\n+ Vector<long> bytes(ParallelContext::NProcsSub());\n long thisbyte = amrex::TotalBytesAllocatedInFabs()/1024;\n-\n- BL_COMM_PROFILE(BLProfiler::Allgather, sizeof(long), BLProfiler::BeforeCall(),\n- BLProfiler::NoTag());\n- MPI_Allgather(&thisbyte,\n- 1,\n- ParallelDescriptor::Mpi_typemap<long>::type(),\n- bytes.dataPtr(),\n- 1,\n- ParallelDescriptor::Mpi_typemap<long>::type(),\n- ParallelDescriptor::Communicator());\n- BL_COMM_PROFILE(BLProfiler::Allgather, sizeof(long), BLProfiler::AfterCall(),\n- BLProfiler::NoTag());\n+ ParallelAllGather::AllGather(thisbyte, bytes.dataPtr(), ParallelContext::CommunicatorSub());\n \n std::vector<LIpair> LIpairV;\n std::vector<LIpair> LIworker;\n@@ -397,6 +387,10 @@ DistributionMapping::RoundRobinDoIt (int nboxes,\n int /* nprocs */,\n std::vector<LIpair>* LIpairV)\n {\n+ if (flag_verbose_mapper) {\n+ Print() << \"DM: RoundRobinDoIt called...\" << std::endl;\n+ }\n+\n int nprocs = ParallelContext::NProcsSub();\n \n // If team is not use, we are going to treat it as a special case in which\n@@ -435,6 +429,10 @@ DistributionMapping::RoundRobinDoIt (int nboxes,\n \t int wid = (w[tid]++) % nworkers;\n \t int rank = tid*nworkers + wrkerord[tid][wid];\n \t m_ref->m_pmap[(*LIpairV)[i].second] = ParallelContext::local_to_global_rank(rank);\n+ if (flag_verbose_mapper) {\n+ Print() << \" Mapping box \" << (*LIpairV)[i].second << \" of size \"\n+ << (*LIpairV)[i].first << \" to rank \" << rank << std::endl;\n+ }\n \t}\n }\n else\n@@ -445,6 +443,9 @@ DistributionMapping::RoundRobinDoIt (int nboxes,\n \t int wid = (w[tid]++) % nworkers;\n \t int rank = tid*nworkers + wrkerord[tid][wid];\n \t m_ref->m_pmap[i] = ParallelContext::local_to_global_rank(rank);\n+ if (flag_verbose_mapper) {\n+ Print() << \" Mapping box \" << i << \" to rank \" << rank << std::endl;\n+ }\n \t}\n }\n }\n@@ -721,6 +722,10 @@ DistributionMapping::KnapSackDoIt (const std::vector<long>& wgts,\n bool do_full_knapsack,\n \t\t\t\t int nmax)\n {\n+ if (flag_verbose_mapper) {\n+ Print() << \"DM: KnapSackDoIt called...\" << std::endl;\n+ }\n+\n BL_PROFILE(\"DistributionMapping::KnapSackDoIt()\");\n \n int nprocs = ParallelContext::NProcsSub();\n@@ -741,6 +746,15 @@ DistributionMapping::KnapSackDoIt (const std::vector<long>& wgts,\n \n knapsack(wgts,nteams,vec,efficiency,do_full_knapsack,nmax);\n \n+ if (flag_verbose_mapper) {\n+ for (int i = 0; i < vec.size(); ++i) {\n+ Print() << \" Bucket \" << i << \" contains boxes:\" << std::endl;\n+ for (int j = 0; j < vec[i].size(); ++j) {\n+ Print() << \" \" << vec[i][j] << std::endl;\n+ }\n+ }\n+ }\n+\n BL_ASSERT(static_cast<int>(vec.size()) == nteams);\n \n std::vector<LIpair> LIpairV;\n@@ -761,6 +775,12 @@ DistributionMapping::KnapSackDoIt (const std::vector<long>& wgts,\n \n Sort(LIpairV, true);\n \n+ if (flag_verbose_mapper) {\n+ for (const auto &p : LIpairV) {\n+ Print() << \" Bucket \" << p.second << \" total weight: \" << p.first << std::endl;\n+ }\n+ }\n+\n Vector<int> ord;\n Vector<Vector<int> > wrkerord;\n \n@@ -783,6 +803,10 @@ DistributionMapping::KnapSackDoIt (const std::vector<long>& wgts,\n \tconst std::vector<int>& vi = vec[idx];\n \tconst int N = vi.size();\n \n+ if (flag_verbose_mapper) {\n+ Print() << \" Mapping bucket \" << idx << \" to rank \" << tid << std::endl;\n+ }\n+\n \tif (nteams == nprocs) {\n \t for (int j = 0; j < N; ++j)\n \t {\n@@ -917,6 +941,21 @@ Distribute (const std::vector<SFCToken>& tokens,\n std::vector< std::vector<int> >& v)\n \n {\n+ BL_PROFILE(\"DistributionMapping::Distribute()\");\n+\n+ if (flag_verbose_mapper) {\n+ Print() << \"Distribute:\" << std::endl;\n+ Print() << \" volpercpu: \" << volpercpu << std::endl;\n+ Print() << \" Sorted SFC Tokens:\" << std::endl;\n+ int idx = 0;\n+ for (const auto &t : tokens) {\n+ Print() << \" \" << idx++ << \": \"\n+ << t.m_box << \": \"\n+ << t.m_idx << \": \"\n+ << t.m_vol << std::endl;\n+ }\n+ }\n+\n BL_ASSERT(static_cast<int>(v.size()) == nprocs);\n \n int K = 0;\n@@ -949,6 +988,26 @@ Distribute (const std::vector<SFCToken>& tokens,\n }\n }\n \n+ if (flag_verbose_mapper) {\n+ Print() << \"Distributed SFC Tokens:\" << std::endl;\n+ int idx = 0;\n+ for (int i = 0; i < nprocs; ++i) {\n+ Print() << \" Rank/Team \" << i << \":\" << std::endl;\n+ Real rank_vol = 0;\n+ for (const auto &box : v[i]) {\n+ const auto &t = tokens[idx];\n+ BL_ASSERT(box == t.m_box);\n+ Print() << \" \" << idx << \": \"\n+ << t.m_box << \": \"\n+ << t.m_idx << \": \"\n+ << t.m_vol << std::endl;\n+ rank_vol += t.m_vol;\n+ idx++;\n+ }\n+ Print() << \" Total Rank Vol: \" << rank_vol << std::endl;\n+ }\n+ }\n+\n #ifdef AMREX_DEBUG\n int cnt = 0;\n for (int i = 0; i < nprocs; ++i) {\n@@ -964,6 +1023,10 @@ DistributionMapping::SFCProcessorMapDoIt (const BoxArray& boxes,\n int /* nprocs */,\n bool sort)\n {\n+ if (flag_verbose_mapper) {\n+ Print() << \"DM: SFCProcessorMapDoIt called...\" << std::endl;\n+ }\n+\n BL_PROFILE(\"DistributionMapping::SFCProcessorMapDoIt()\");\n \n int nprocs = ParallelContext::NProcsSub();\n@@ -984,6 +1047,11 @@ DistributionMapping::SFCProcessorMapDoIt (const BoxArray& boxes,\n }\n #endif\n \n+ if (flag_verbose_mapper) {\n+ Print() << \" (nprocs, nteams, nworkers) = (\"\n+ << nprocs << \", \" << nteams << \", \" << nworkers << \")\\n\";\n+ }\n+\n std::vector<SFCToken> tokens;\n \n const int N = boxes.size();\n@@ -1048,6 +1116,12 @@ DistributionMapping::SFCProcessorMapDoIt (const BoxArray& boxes,\n \n if (sort) Sort(LIpairV, true);\n \n+ if (flag_verbose_mapper) {\n+ for (const auto &p : LIpairV) {\n+ Print() << \" Bucket \" << p.second << \" contains \" << p.first << std::endl;\n+ }\n+ }\n+\n // LIpairV has a size of nteams and LIpairV[] is pair whose first is weight\n // and second is an index into vec. LIpairV is sorted by weight such that\n // LIpairV is the heaviest.\n@@ -1086,6 +1160,10 @@ DistributionMapping::SFCProcessorMapDoIt (const BoxArray& boxes,\n const std::vector<int>& vi = vec[ivec]; // this vector contains boxes assigned to this team\n \tconst int Nbx = vi.size(); // # of boxes assigned to this team\n \n+ if (flag_verbose_mapper) {\n+ Print() << \"Mapping bucket \" << LIpairV[i].second << \" to rank \" << ord[i] << std::endl;\n+ }\n+\n \tif (nteams == nprocs) { // In this case, team id is process id.\n \t for (int j = 0; j < Nbx; ++j)\n \t {\n@@ -1136,7 +1214,7 @@ DistributionMapping::SFCProcessorMapDoIt (const BoxArray& boxes,\n \t}\n }\n \n- if (verbose && ParallelDescriptor::IOProcessor())\n+ if (verbose)\n {\n Real sum_wgt = 0, max_wgt = 0;\n for (int i = 0; i < nteams; ++i)\n@@ -1398,7 +1476,7 @@ DistributionMapping::makeSFC (const MultiFab& weight, bool sort)\n }\n \n std::vector<std::vector<int> >\n-DistributionMapping::makeSFC (const BoxArray& ba)\n+DistributionMapping::makeSFC (const BoxArray& ba, bool use_box_vol)\n {\n std::vector<SFCToken> tokens;\n \n@@ -1408,10 +1486,13 @@ DistributionMapping::makeSFC (const BoxArray& ba)\n \n int maxijk = 0;\n \n+ Real vol_sum = 0;\n for (int i = 0; i < N; ++i)\n {\n \tconst Box& bx = ba[i];\n- tokens.push_back(SFCToken(i,bx.smallEnd(),1.0));\n+ const auto & bx_vol = (use_box_vol ? bx.volume() : 1);\n+ tokens.push_back(SFCToken(i,bx.smallEnd(),bx_vol));\n+ vol_sum += bx_vol;\n \n const SFCToken& token = tokens.back();\n \n@@ -1433,7 +1514,8 @@ DistributionMapping::makeSFC (const BoxArray& ba)\n std::sort(tokens.begin(), tokens.end(), SFCToken::Compare());\n \n const int nprocs = ParallelContext::NProcsSub();\n- Real volper = static_cast<Real>(N)/static_cast<Real>(nprocs);\n+ Real volper;\n+ volper = vol_sum / nprocs;\n \n std::vector< std::vector<int> > r(nprocs);\n Distribute(tokens, nprocs, volper, r);\ndiff --git a/Src/Base/AMReX_Machine.H b/Src/Base/AMReX_Machine.H\nnew file mode 100644\nindex 00000000000..b20817128fd\n--- /dev/null\n+++ b/Src/Base/AMReX_Machine.H\n@@ -0,0 +1,18 @@\n+#ifndef AMREX_MACHINE_H\n+#define AMREX_MACHINE_H\n+\n+#include <AMReX_Vector.H>\n+\n+namespace amrex {\n+namespace machine {\n+\n+void Initialize (); // called in amrex::Initialize()\n+void Finalize ();\n+\n+// find the best topologically close neighborhood of ranks\n+// returns a vector of global or local rank IDs based on flag_local_ranks\n+Vector<int> find_best_nbh (int rank_n, bool flag_local_ranks = false);\n+\n+}}\n+\n+#endif\ndiff --git a/Src/Base/AMReX_Machine.cpp b/Src/Base/AMReX_Machine.cpp\nnew file mode 100644\nindex 00000000000..f2dfac9edc6\n--- /dev/null\n+++ b/Src/Base/AMReX_Machine.cpp\n@@ -0,0 +1,586 @@\n+#include <string>\n+#include <vector>\n+#include <array>\n+#include <fstream>\n+#include <cassert>\n+#include <sstream>\n+#include <map>\n+#include <unordered_map>\n+\n+#include <AMReX_Print.H>\n+#include <AMReX_ParmParse.H>\n+#include <AMReX_ParallelReduce.H>\n+#include <AMReX_Utility.H>\n+#include <AMReX_Machine.H>\n+\n+using namespace amrex;\n+\n+namespace {\n+\n+struct DoubleInt {\n+ double d;\n+ int i;\n+};\n+\n+using Coord = Array<int, 4>;\n+\n+// returns coordinate in an index space with no switches\n+// for dragonfly network\n+Coord read_df_node_coord (const std::string & name)\n+{\n+ int cabx, caby, cab_chas, slot, node;\n+ {\n+ std::ifstream ifs {\"/proc/cray_xt/cname\"};\n+ if (!ifs) {\n+ // not on a cray\n+ return Coord {0,0,0,0}; // initializer_list\n+ }\n+ char t0, t1, t2, t3, t4;\n+ ifs >> t0 >> cabx >> t1 >> caby >> t2 >> cab_chas >> t3 >> slot >> t4 >> node;\n+ assert(t0 == 'c' && t1 == '-' && t2 == 'c' && t3 == 's' && t4 == 'n');\n+ }\n+\n+ int group = 0;\n+ if (name == \"edison\") {\n+ group = cabx / 2 + caby * 4; // 2 cabinets per group, 4 groups per row\n+ if (group > 12) { group--; } // nominal \"group 12\" is missing\n+ } else if (name == \"cori\") {\n+ group = cabx / 2 + caby * 6; // 2 cabinets per group, 6 groups per row\n+ } else {\n+ Print() << \"Could not determine group!\";\n+ std::abort();\n+ }\n+ int chas = cab_chas + 3*(cabx & 1); // 2 cabinets per group (6 chassis per group)\n+\n+ return Coord {node, slot, chas, group};\n+}\n+\n+std::string get_mpi_processor_name ()\n+{\n+ std::string result;\n+#if BL_USE_MPI\n+ int len;\n+ char name[MPI_MAX_PROCESSOR_NAME];\n+ MPI_Get_processor_name(name, &len);\n+ result = std::string(name);\n+#endif\n+ return result;\n+}\n+\n+// assumes groups are in 4x16x6 configuration\n+int df_coord_to_id (const Coord & c)\n+{\n+ return c[0] + 4 * (c[1] + 16 * (c[2] + 6 * c[3]));\n+}\n+\n+// assumes groups are in 4x16x6 configuration\n+Coord df_id_to_coord (int id)\n+{\n+ int node = id % 4; id /= 4;\n+ int slot = id % 16; id /= 16;\n+ int chas = id % 6; id /= 6;\n+ int group = id;\n+ return Coord {node, slot, chas, group};\n+}\n+\n+template <class T, size_t N>\n+std::string to_str(const Array<T, N> & a)\n+{\n+ std::ostringstream oss;\n+ oss << \"(\";\n+ bool first = true;\n+ for (int i = 0; i < N; ++i) {\n+ if (!first) oss << \",\";\n+ oss << a[i];\n+ first = false;\n+ }\n+ oss << \")\";\n+ return oss.str();\n+}\n+\n+template <class T>\n+std::string to_str(const Vector<T> & v)\n+{\n+ std::ostringstream oss;\n+ oss << \"(\";\n+ bool first = true;\n+ for (int i = 0; i < v.size(); ++i) {\n+ if (!first) oss << \",\";\n+ oss << v[i];\n+ first = false;\n+ }\n+ oss << \")\";\n+ return oss.str();\n+}\n+\n+Vector<int> get_subgroup_ranks ()\n+{\n+ int rank_n = ParallelContext::NProcsSub();\n+ Vector<int> lranks(rank_n);\n+ for (int i = 0; i < rank_n; ++i) {\n+ lranks[i] = i;\n+ }\n+\n+ Vector<int> granks(rank_n);\n+ ParallelContext::local_to_global_rank(granks.data(), lranks.data(), rank_n);\n+ return granks;\n+}\n+\n+int pair_n (int x) {\n+ return x*(x-1)/2;\n+}\n+\n+int df_dist (const Coord & a, const Coord & b)\n+{\n+ if (a[3] != b[3]) {\n+ // large penalty for traversing across groups\n+ return 20;\n+ } else {\n+ // same group\n+ int slot_diff = (a[1] != b[1] ? 1 : 0);\n+ int chas_diff = (a[2] != b[2] ? 1 : 0);\n+ if (slot_diff + chas_diff == 0 && a[0] == b[0]) {\n+ // same node\n+ return 0;\n+ } else {\n+ // add 2 for first and last node-to-switch hops\n+ return 2 + slot_diff + chas_diff;\n+ }\n+ }\n+}\n+\n+Coord id_to_coord (int id)\n+{\n+ // TODO: implement support for other types of networks\n+ return df_id_to_coord(id);\n+}\n+\n+int dist (const Coord & a, const Coord & b)\n+{\n+ // TODO: implement support for other types of networks\n+ return df_dist(a, b);\n+}\n+\n+struct Candidate\n+{\n+ int id;\n+ Coord coord;\n+ // how many ranks on this node\n+ int rank_n = 0;\n+ // sum of pairwise rank distances from the candidate node to already chosen nodes\n+ int sum_dist = 0;\n+\n+ Candidate () = default;\n+ Candidate (int i) : id(i), coord(id_to_coord(id)) {}\n+};\n+\n+class NeighborhoodCache\n+{\n+ public:\n+ void add (uint64_t key, Vector<int> val) {\n+ AMREX_ASSERT(cache.count(key) == 0);\n+ cache[key] = std::move(val);\n+ }\n+ bool get (uint64_t key, Vector<int> & val) {\n+ bool result = cache.count(key) > 0;\n+ if (result) {\n+ val = cache.at(key);\n+ }\n+ return result;\n+ }\n+\n+ // result is dependent on both the current set of ranks\n+ // and the size of the neighborhood desired\n+ uint64_t hash (const Vector<int> & cur_ranks, int nbh_rank_n) {\n+ auto result = hash_vector(cur_ranks);\n+ hash_combine(result, nbh_rank_n);\n+ return result;\n+ }\n+\n+ private:\n+ std::unordered_map<uint64_t, Vector<int>> cache;\n+};\n+\n+class Machine\n+{\n+ public:\n+ Machine () {\n+ get_params();\n+ get_machine_envs();\n+ node_ids = get_node_ids();\n+ }\n+\n+ // find a compact neighborhood of size rank_n in the current ParallelContext subgroup\n+ Vector<int> find_best_nbh (int nbh_rank_n, bool flag_local_ranks)\n+ {\n+#ifdef BL_USE_MPI\n+ BL_PROFILE(\"Machine::find_best_nbh()\");\n+\n+ auto sg_g_ranks = get_subgroup_ranks();\n+ auto sg_rank_n = sg_g_ranks.size();\n+ if (flag_verbose) {\n+ Print() << \"Machine::find_best_nbh(): called for \" << nbh_rank_n\n+ << \" of \" << sg_rank_n << \" ranks\" << std::endl;\n+ }\n+\n+ Vector<int> result;\n+ auto key = nbh_cache.hash(sg_g_ranks, nbh_rank_n);\n+ if (nbh_cache.get(key, result)) {\n+ if (flag_verbose) {\n+ Print() << \"Machine::find_best_nbh(): found neighborhood in cache\" << std::endl;\n+ }\n+ } else {\n+ // get node IDs of current subgroup\n+ Vector<int> sg_node_ids(sg_rank_n);\n+ std::unordered_map<int, std::vector<int>> node_ranks;\n+ for (int i = 0; i < sg_rank_n; ++i) {\n+ AMREX_ASSERT(sg_g_ranks[i] >= 0 && sg_g_ranks[i] < node_ids.size());\n+ sg_node_ids[i] = node_ids[sg_g_ranks[i]];\n+ if (flag_local_ranks) {\n+ node_ranks[sg_node_ids[i]].push_back(i);\n+ } else {\n+ node_ranks[sg_node_ids[i]].push_back(sg_g_ranks[i]);\n+ }\n+ }\n+\n+ if (flag_very_verbose) {\n+ Print() << \"SubRank: GloRank: Node ID: Node Coord:\" << std::endl;\n+ for (int i = 0; i < sg_rank_n; ++i) {\n+ Print() << \" \" << i << \": \" << sg_g_ranks[i] << \": \" << sg_node_ids[i]\n+ << \": \" << to_str(id_to_coord(sg_node_ids[i])) << std::endl;\n+ }\n+ }\n+\n+ Vector<int> local_nbh;\n+ double score;\n+ auto rank_me = ParallelContext::MyProcSub();\n+ tie(local_nbh, score) = search_local_nbh(rank_me, sg_node_ids, nbh_rank_n);\n+\n+ if (flag_verbose) {\n+ Vector<int> base_nbh;\n+ double base_score;\n+ tie(base_nbh, base_score) = baseline_score(sg_node_ids, nbh_rank_n);\n+\n+ Print() << \"Baseline neighborhood: \" << to_str(base_nbh) << \", score = \" << base_score << std::endl;\n+ Print() << \"Rank 0's neighborhood: \" << to_str(local_nbh) << \", score = \" << score << std::endl;\n+ }\n+\n+ // determine the best neighborhood among ranks\n+ DoubleInt my_score_with_id {score, rank_me}, min_score_with_id;\n+ MPI_Allreduce(&my_score_with_id, &min_score_with_id, 1, MPI_DOUBLE_INT, MPI_MINLOC, ParallelContext::CommunicatorSub());\n+ double winner_score = min_score_with_id.d;\n+ int winner_rank = min_score_with_id.i;\n+\n+ // broadcast the best hood from winner rank to everyone\n+ int local_nbh_size = local_nbh.size();\n+ MPI_Bcast(&local_nbh_size, 1, MPI_INT, winner_rank, ParallelContext::CommunicatorSub());\n+ local_nbh.resize(local_nbh_size);\n+ MPI_Bcast(local_nbh.data(), local_nbh.size(), MPI_INT, winner_rank, ParallelContext::CommunicatorSub()); \n+\n+ std::sort(local_nbh.begin(), local_nbh.end());\n+ if (flag_verbose) {\n+ Print() << \"Winning neighborhood: \" << winner_rank << \": \" << to_str(local_nbh)\n+ << \", score = \" << winner_score << std::endl;\n+ }\n+\n+ result.reserve(nbh_rank_n);\n+ for (int i = 0; i < local_nbh.size(); ++i) {\n+ for (auto rank : node_ranks.at(local_nbh[i])) {\n+ if (result.size() < nbh_rank_n) {\n+ result.push_back(rank);\n+ }\n+ }\n+ }\n+ nbh_cache.add(key, result);\n+ }\n+\n+ if (flag_very_verbose) {\n+ Print() << \"Ranks in neighborhood: \" << to_str(result) << std::endl;\n+ }\n+\n+ return result;\n+#else\n+ return Vector<int>(nbh_rank_n, 0);\n+#endif\n+ }\n+\n+ private:\n+\n+ std::string hostname;\n+ std::string nersc_host;\n+ std::string partition;\n+ std::string node_list;\n+ std::string topo_addr;\n+\n+ int flag_verbose = 0;\n+ int flag_very_verbose = 0;\n+ bool flag_nersc_df;\n+ int my_node_id;\n+ Vector<int> node_ids;\n+\n+ NeighborhoodCache nbh_cache;\n+\n+ void get_params ()\n+ {\n+ ParmParse pp(\"machine\");\n+ pp.query(\"verbose\", flag_verbose);\n+ pp.query(\"very_verbose\", flag_very_verbose);\n+ }\n+\n+ std::string get_env_str (std::string env_key)\n+ {\n+ std::string result;\n+ auto val_c_str = std::getenv(env_key.c_str());\n+ if (val_c_str) {\n+ result = std::string(val_c_str);\n+ }\n+ return result;\n+ }\n+\n+ void get_machine_envs ()\n+ {\n+ hostname = get_env_str(\"HOSTNAME\");\n+ nersc_host = get_env_str(\"NERSC_HOST\");\n+ flag_nersc_df = (nersc_host == \"edison\" ||\n+ nersc_host == \"cori\" ||\n+ nersc_host == \"saul\");\n+\n+ if (flag_nersc_df) {\n+ partition = get_env_str(\"SLURM_JOB_PARTITION\");\n+ node_list = get_env_str(\"SLURM_NODELIST\");\n+ topo_addr = get_env_str(\"SLURM_TOPOLOGY_ADDR\");\n+\n+ if (flag_verbose) {\n+ Print() << \"HOSTNAME = \" << hostname << std::endl;\n+ Print() << \"NERSC_HOST = \" << nersc_host << std::endl;\n+ Print() << \"SLURM_JOB_PARTITION = \" << partition << std::endl;\n+ Print() << \"SLURM_NODELIST = \" << node_list << std::endl;\n+ Print() << \"SLURM_TOPOLOGY_ADDR = \" << topo_addr << std::endl;\n+ }\n+ }\n+ }\n+\n+ // get this rank's machine node ID\n+ int get_my_node_id ()\n+ {\n+ int result = -1;\n+ if (flag_nersc_df) {\n+ std::string tag = \"nid\";\n+ auto pos = topo_addr.find(tag);\n+ if (pos != std::string::npos) {\n+ result = stoi(topo_addr.substr(pos + tag.size())); // assumes format \".*nid(\\d+)\"\n+ if (flag_verbose) {\n+ Print() << \"Got node ID from SLURM_TOPOLOGY_ADDR: \" << result << std::endl;\n+ }\n+#if BL_USE_MPI\n+ } else {\n+ auto mpi_proc_name = get_mpi_processor_name();\n+ Print() << \"MPI_Get_processor_name: \" << mpi_proc_name << std::endl;\n+ pos = mpi_proc_name.find(tag);\n+ if (pos != std::string::npos) {\n+ result = stoi(mpi_proc_name.substr(pos + tag.size())); // assumes format \".*nid(\\d+)\"\n+ if (flag_verbose) {\n+ Print() << \"Got node ID from MPI_Get_processor_name(): \" << result << std::endl;\n+ }\n+ }\n+#endif\n+ }\n+\n+ // check result\n+ AMREX_ALWAYS_ASSERT(result != -1);\n+#ifndef NDEBUG\n+ auto coord = read_df_node_coord(nersc_host);\n+ int id_from_coord = df_coord_to_id(coord);\n+ AMREX_ASSERT(id_from_coord == result);\n+#endif\n+ } else {\n+ result = 0;\n+ }\n+\n+ return result;\n+ }\n+\n+ // get all node IDs in this job, indexed by job rank\n+ // this is collective over ALL ranks in the job\n+ Vector<int> get_node_ids ()\n+ {\n+ int node_id = -1;\n+ Vector<int> ids(ParallelDescriptor::NProcs(), 0);\n+#ifdef BL_USE_MPI\n+ node_id = get_my_node_id();\n+ ParallelAllGather::AllGather(node_id, ids.data(), ParallelContext::CommunicatorAll());\n+#endif\n+ if (flag_verbose) {\n+ std::map<int, Vector<int>> node_ranks;\n+ for (int i = 0; i < ids.size(); ++i) {\n+ node_ranks[ids[i]].push_back(i);\n+ }\n+ Print() << \"Node ID: Node Coord: Ranks:\" << std::endl;\n+ for (const auto & p : node_ranks) {\n+ Print() << \" \" << p.first << \": \" << to_str(id_to_coord(p.first))\n+ << \": \" << to_str(p.second) << std::endl;\n+ }\n+ }\n+ return ids;\n+ }\n+\n+ // do a local search starting at current node\n+ std::pair<Vector<int>, double>\n+ baseline_score(const Vector<int> & sg_node_ids, int nbh_rank_n)\n+ {\n+ AMREX_ASSERT(sg_node_ids.size() > 0 && nbh_rank_n > 0 &&\n+ nbh_rank_n <= sg_node_ids.size());\n+\n+ // construct map of node candidates to select\n+ std::map<int, Candidate> cand_map;\n+ for (int i = 0; i < nbh_rank_n; ++i) {\n+ auto node_id = sg_node_ids[i];\n+ if (cand_map.count(node_id) == 0) {\n+ cand_map[node_id] = Candidate(node_id);\n+ }\n+ cand_map.at(node_id).rank_n++;\n+ }\n+\n+ Vector<int> result(cand_map.size());\n+ Vector<Candidate> candidates(cand_map.size());\n+ int idx = 0;\n+ for (auto & p : cand_map) {\n+ result[idx] = p.second.id;\n+ candidates[idx++] = std::move(p.second);\n+ }\n+\n+ int sum_dist = 0;\n+ for (int j = 1; j < candidates.size(); ++j) {\n+ const auto & b = candidates[j];\n+ for (int i = 0; i < j; ++i) {\n+ const auto & a = candidates[i];\n+ auto pair_dist = dist(a.coord, b.coord);\n+ // multiply distance by number of rank pairs across the two nodes\n+ sum_dist += pair_dist * (a.rank_n * b.rank_n);\n+ if (flag_very_verbose) {\n+ Print() << \" Distance from \" << a.id\n+ << \" to \" << b.id\n+ << \": \" << pair_dist << std::endl;\n+ }\n+ }\n+ }\n+ double score = (nbh_rank_n > 1) ? (static_cast<double>(sum_dist) / pair_n(nbh_rank_n)) : 0;\n+ return std::make_pair(std::move(result), score);\n+ }\n+\n+ // do a local search starting at current node\n+ std::pair<Vector<int>, double>\n+ search_local_nbh(int rank_me, const Vector<int> & sg_node_ids, int nbh_rank_n)\n+ {\n+ BL_PROFILE(\"Machine::search_local_nbh()\");\n+\n+ Print() << \"Machine::search_local_nbh() called ...\" << std::endl;\n+\n+ Vector<int> result;\n+\n+ // construct map of node candidates to select\n+ std::map<int, Candidate> candidates;\n+ for (auto node_id : sg_node_ids) {\n+ if (candidates.count(node_id) == 0) {\n+ candidates[node_id] = Candidate(node_id);\n+ }\n+ candidates.at(node_id).rank_n++;\n+ }\n+\n+ if (flag_very_verbose) {\n+ Print() << \" Candidates:\" << std::endl;\n+ for (const auto & p : candidates) {\n+ const auto & cand = p.second;\n+ Print() << \" \" << cand.id << \" : \" << to_str(cand.coord)\n+ << \": \" << cand.rank_n << \" ranks\" << std::endl;\n+ }\n+ }\n+\n+ AMREX_ASSERT(rank_me >= 0 && rank_me < sg_node_ids.size());\n+ Candidate cur_node = std::move(candidates.at(sg_node_ids[rank_me]));\n+ candidates.erase(cur_node.id);\n+\n+ // add source_node\n+ result.push_back(cur_node.id);\n+ int total_rank_n = cur_node.rank_n;\n+ int total_pairs_dist = 0;\n+ if (flag_verbose) {\n+ Print() << \" Added \" << cur_node.id\n+ << \": \" << to_str(cur_node.coord)\n+ << \", ranks: \" << cur_node.rank_n\n+ << \", total ranks: \" << total_rank_n\n+ << \", avg dist: \" << 0 << std::endl;\n+ }\n+ if (total_rank_n >= nbh_rank_n) {\n+ return {std::move(result), 0};\n+ }\n+\n+ double min_avg_dist;\n+ while (total_rank_n < nbh_rank_n)\n+ {\n+ min_avg_dist = std::numeric_limits<double>::max();\n+ Candidate * next_node = nullptr;\n+ // update candidates with their pairwise rank distances to cur_node\n+ for (auto & p : candidates) {\n+ Candidate & cand_node = p.second;\n+ auto cand_dist = dist(cand_node.coord, cur_node.coord);\n+ // multiply distance by number of rank pairs across the two nodes\n+ cand_node.sum_dist += cand_dist * (cand_node.rank_n * cur_node.rank_n);\n+ double avg_dist = static_cast<double>(cand_node.sum_dist + total_pairs_dist) /\n+ pair_n(cand_node.rank_n + total_rank_n);\n+ if (flag_very_verbose) {\n+ Print() << \" Distance from \" << cand_node.id\n+ << \" to \" << cur_node.id\n+ << \": \" << cand_dist\n+ << \", candidate avg: \" << avg_dist << std::endl;\n+ }\n+ // keep track of what should be the next node to add\n+ if (avg_dist < min_avg_dist) {\n+ next_node = &cand_node;\n+ min_avg_dist = avg_dist;\n+ }\n+ }\n+ cur_node = std::move(*next_node);\n+ next_node = nullptr;\n+ candidates.erase(cur_node.id);\n+\n+ // add cur_node to result\n+ result.push_back(cur_node.id);\n+ total_rank_n += cur_node.rank_n;\n+ total_pairs_dist += cur_node.sum_dist;\n+\n+ if (flag_verbose) {\n+ Print() << \" Added \" << cur_node.id\n+ << \": \" << to_str(cur_node.coord)\n+ << \", ranks: \" << cur_node.rank_n\n+ << \", total ranks: \" << total_rank_n\n+ << \", avg dist: \" << min_avg_dist << std::endl;\n+ }\n+ }\n+\n+ return std::make_pair(std::move(result), min_avg_dist);\n+ }\n+};\n+\n+std::unique_ptr<Machine> the_machine;\n+\n+}\n+\n+namespace amrex {\n+namespace machine {\n+\n+void Initialize () {\n+ the_machine.reset(new Machine());\n+ amrex::ExecOnFinalize(machine::Finalize);\n+}\n+\n+void Finalize () {\n+ the_machine.reset();\n+}\n+\n+Vector<int> find_best_nbh (int rank_n, bool flag_local_ranks) {\n+ AMREX_ASSERT(the_machine);\n+ return the_machine->find_best_nbh(rank_n, flag_local_ranks);\n+}\n+\n+}}\ndiff --git a/Src/Base/AMReX_MultiFabUtil.cpp b/Src/Base/AMReX_MultiFabUtil.cpp\nindex 295a1bc0b2a..a11d65457f4 100644\n--- a/Src/Base/AMReX_MultiFabUtil.cpp\n+++ b/Src/Base/AMReX_MultiFabUtil.cpp\n@@ -238,6 +238,7 @@ namespace amrex\n \t\t const Geometry& fgeom, const Geometry& cgeom,\n int scomp, int ncomp, const IntVect& ratio)\n {\n+ BL_PROFILE(\"amrex::average_down_w_geom\");\n \n if (S_fine.is_nodal() || S_crse.is_nodal())\n {\n@@ -337,6 +338,7 @@ namespace amrex\n void average_down (const MultiFab& S_fine, MultiFab& S_crse,\n int scomp, int ncomp, const IntVect& ratio)\n {\n+ BL_PROFILE(\"amrex::average_down\");\n AMREX_ASSERT(S_crse.nComp() == S_fine.nComp());\n AMREX_ASSERT((S_crse.is_cell_centered() && S_fine.is_cell_centered()) ||\n (S_crse.is_nodal() && S_fine.is_nodal()));\ndiff --git a/Src/Base/AMReX_ParallelContext.H b/Src/Base/AMReX_ParallelContext.H\nindex c71fc0d82b6..c9f7f59de23 100644\n--- a/Src/Base/AMReX_ParallelContext.H\n+++ b/Src/Base/AMReX_ParallelContext.H\n@@ -58,6 +58,8 @@ inline int NProcsAll () { return frames[0].NProcs(); }\n inline int MyProcAll () { return frames[0].MyProc(); }\n // IO rank in world communicator\n inline int IOProcessorNumberAll () { return frames[0].IOProc(); }\n+// Am IO processor for world communicator?\n+inline bool IOProcessorAll () { return MyProcAll() == IOProcessorNumberAll(); }\n // Pointer to ofstream\n inline std::ofstream * OFSPtrAll () { return frames[0].get_ofs_ptr(); }\n \n@@ -71,6 +73,8 @@ inline int NProcsSub () { return frames.back().NProcs(); }\n inline int MyProcSub () { return frames.back().MyProc(); }\n // IO sub-rank in current frame\n inline int IOProcessorNumberSub () { return frames.back().IOProc(); }\n+// Am IO processor for current frame?\n+inline bool IOProcessorSub () { return MyProcSub() == IOProcessorNumberSub(); }\n // Pointer to ofstream\n inline std::ofstream * OFSPtrSub () { return frames.back().get_ofs_ptr(); }\n \ndiff --git a/Src/Base/AMReX_ParallelReduce.H b/Src/Base/AMReX_ParallelReduce.H\nindex 0776f5875a1..5ae621bf060 100644\n--- a/Src/Base/AMReX_ParallelReduce.H\n+++ b/Src/Base/AMReX_ParallelReduce.H\n@@ -36,9 +36,11 @@ namespace detail {\n auto mpi_op = mpi_ops[static_cast<int>(op)];\n Vector<T> tmp(v, v+cnt);\n if (root == -1) {\n+ // TODO: add BL_COMM_PROFILE commands\n MPI_Allreduce(tmp.data(), v, cnt, ParallelDescriptor::Mpi_typemap<T>::type(),\n mpi_op, comm);\n } else {\n+ // TODO: add BL_COMM_PROFILE commands\n MPI_Reduce(tmp.data(), v, cnt, ParallelDescriptor::Mpi_typemap<T>::type(),\n mpi_op, root, comm);\n }\n@@ -65,9 +67,15 @@ namespace detail {\n {\n auto mpi_type = ParallelDescriptor::Mpi_typemap<T>::type();\n if (root == -1) {\n+ // TODO: check these BL_COMM_PROFILE commands\n+ BL_COMM_PROFILE(BLProfiler::Allgather, sizeof(T), BLProfiler::BeforeCall(),\n+ BLProfiler::NoTag());\n // const_cast for MPI-2\n MPI_Allgather(const_cast<T*>(v), cnt, mpi_type, vs, cnt, mpi_type, comm);\n+ BL_COMM_PROFILE(BLProfiler::Allgather, sizeof(T), BLProfiler::AfterCall(),\n+ BLProfiler::NoTag());\n } else {\n+ // TODO: add BL_COMM_PROFILE commands\n MPI_Gather(const_cast<T*>(v), cnt, mpi_type, vs, cnt, mpi_type, root, comm);\n }\n }\ndiff --git a/Src/Base/AMReX_Utility.H b/Src/Base/AMReX_Utility.H\nindex ba09a6cc17f..7d259f51159 100644\n--- a/Src/Base/AMReX_Utility.H\n+++ b/Src/Base/AMReX_Utility.H\n@@ -318,6 +318,9 @@ namespace amrex\n std::chrono::steady_clock>::type;\n double second ();\n \n+ template<typename T> void hash_combine (uint64_t & seed, const T & val);\n+ template<typename T> uint64_t hash_vector (const Vector<T> & vec, uint64_t seed = 0xDEADBEEFDEADBEEF);\n+\n template <class T>\n AMREX_GPU_HOST_DEVICE\n AMREX_INLINE const T& min (const T& a, const T& b)\n@@ -447,4 +450,47 @@ extern \"C\" {\n void amrex_free (void* p);\n }\n \n+// hash combiner borrowed from Boost\n+/*\n+Boost Software License - Version 1.0 - August 17th, 2003\n+\n+Permission is hereby granted, free of charge, to any person or organization\n+obtaining a copy of the software and accompanying documentation covered by\n+this license (the \"Software\") to use, reproduce, display, distribute,\n+execute, and transmit the Software, and to prepare derivative works of the\n+Software, and to permit third-parties to whom the Software is furnished to\n+do so, all subject to the following:\n+\n+The copyright notices in the Software and this entire statement, including\n+the above license grant, this restriction and the following disclaimer,\n+must be included in all copies of the Software, in whole or in part, and\n+all derivative works of the Software, unless such copies or derivative\n+works are solely in the form of machine-executable object code generated by\n+a source language processor.\n+\n+THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n+FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT\n+SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE\n+FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,\n+ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER\n+DEALINGS IN THE SOFTWARE.\n+*/\n+template<typename T>\n+void\n+amrex::hash_combine (uint64_t & seed, const T & val)\n+{\n+ seed ^= std::hash<T>()(val) + 0x9e3779b9 + (seed<<6) + (seed>>2);\n+}\n+\n+template<typename T>\n+uint64_t\n+amrex::hash_vector (const Vector<T> & vec, uint64_t seed)\n+{\n+ for (const auto & x: vec) {\n+ hash_combine(seed, x);\n+ }\n+ return seed;\n+}\n+\n #endif /*BL_UTILITY_H*/\ndiff --git a/Src/Base/CMakeLists.txt b/Src/Base/CMakeLists.txt\nindex 7a24d131f45..694bf0fa394 100644\n--- a/Src/Base/CMakeLists.txt\n+++ b/Src/Base/CMakeLists.txt\n@@ -128,6 +128,8 @@ add_sources( AMReX_io_mod.F90 )\n \n add_sources( AMReX_BLProfiler.cpp AMReX_BLBackTrace.cpp )\n \n+# Machine model\n+add_sources ( AMReX_Machine.H AMReX_Machine.cpp )\n \n # LAZY mode not supported in CMake yet\n # ifeq ($(LAZY),TRUE)\ndiff --git a/Src/Base/Make.package b/Src/Base/Make.package\nindex 361adffbb65..cf512bb2a0e 100644\n--- a/Src/Base/Make.package\n+++ b/Src/Base/Make.package\n@@ -211,6 +211,9 @@ ifeq ($(TINY_PROFILE),TRUE)\n C$(AMREX_BASE)_sources += AMReX_TinyProfiler.cpp\n endif\n \n+# Machine model\n+CEXE_headers += AMReX_Machine.H\n+CEXE_sources += AMReX_Machine.cpp\n \n VPATH_LOCATIONS += $(AMREX_HOME)/Src/Base\n INCLUDE_LOCATIONS += $(AMREX_HOME)/Src/Base\ndiff --git a/Src/LinearSolvers/MLMG/AMReX_MLCGSolver.cpp b/Src/LinearSolvers/MLMG/AMReX_MLCGSolver.cpp\nindex ef74c5c1807..29b85ee7187 100644\n--- a/Src/LinearSolvers/MLMG/AMReX_MLCGSolver.cpp\n+++ b/Src/LinearSolvers/MLMG/AMReX_MLCGSolver.cpp\n@@ -80,7 +80,7 @@ MLCGSolver::solve_bicgstab (MultiFab& sol,\n Real eps_rel,\n Real eps_abs)\n {\n- BL_PROFILE_REGION(\"MLCGSolver::bicgstab\");\n+ BL_PROFILE(\"MLCGSolver::bicgstab\");\n \n const int nghost = sol.nGrow(), ncomp = sol.nComp();\n \n@@ -192,7 +192,9 @@ MLCGSolver::solve_bicgstab (MultiFab& sol,\n //\n Real tvals[2] = { dotxy(t,t,true), dotxy(t,s,true) };\n \n+ BL_PROFILE_VAR(\"MLCGSolver::ParallelAllReduce\", blp_par);\n ParallelAllReduce::Sum(tvals,2,Lp.BottomCommunicator());\n+ BL_PROFILE_VAR_STOP(blp_par);\n \n if ( tvals[0] )\n \t{\n@@ -260,7 +262,7 @@ MLCGSolver::solve_cg (MultiFab& sol,\n Real eps_rel,\n Real eps_abs)\n {\n- BL_PROFILE_REGION(\"MLCGSolver::cg\");\n+ BL_PROFILE(\"MLCGSolver::cg\");\n \n const int nghost = sol.nGrow(), ncomp = sol.nComp();\n \n@@ -390,7 +392,11 @@ MLCGSolver::solve_cg (MultiFab& sol,\n Real\n MLCGSolver::dotxy (const MultiFab& r, const MultiFab& z, bool local)\n {\n- return Lp.xdoty(amrlev, mglev, r, z, local);\n+ BL_PROFILE_VAR_NS(\"MLCGSolver::ParallelAllReduce\", blp_par);\n+ if (!local) { BL_PROFILE_VAR_START(blp_par); }\n+ Real result = Lp.xdoty(amrlev, mglev, r, z, local);\n+ if (!local) { BL_PROFILE_VAR_STOP(blp_par); }\n+ return result;\n }\n \n Real\n@@ -402,6 +408,7 @@ MLCGSolver::norm_inf (const MultiFab& res, bool local)\n result = std::max(result,res.norm0(n,0,true));\n \n if (!local) {\n+ BL_PROFILE(\"MLCGSolver::ParallelAllReduce\");\n ParallelAllReduce::Max(result, Lp.BottomCommunicator());\n }\n return result;\ndiff --git a/Src/LinearSolvers/MLMG/AMReX_MLCellLinOp.H b/Src/LinearSolvers/MLMG/AMReX_MLCellLinOp.H\nindex 360aaf5a344..02824fe284a 100644\n--- a/Src/LinearSolvers/MLMG/AMReX_MLCellLinOp.H\n+++ b/Src/LinearSolvers/MLMG/AMReX_MLCellLinOp.H\n@@ -34,6 +34,62 @@ public:\n }\n virtual void update () override;\n \n+#ifdef AMREX_SOFT_PERF_COUNTERS\n+ struct Counters\n+ {\n+ size_t smooth_n = 0;\n+ size_t smooth_cell_n = 0;\n+ size_t apply_n = 0;\n+ size_t apply_cell_n = 0;\n+ size_t restrict_n = 0;\n+ size_t restrict_cell_n = 0;\n+ size_t interp_n = 0;\n+ size_t interp_cell_n = 0;\n+\n+ void reset () {\n+ smooth_n = 0;\n+ smooth_cell_n = 0;\n+ apply_n = 0;\n+ apply_cell_n = 0;\n+ restrict_n = 0;\n+ restrict_cell_n = 0;\n+ interp_n = 0;\n+ interp_cell_n = 0;\n+ }\n+\n+ void smooth (const MultiFab & mf) {\n+ smooth_n++;\n+ smooth_cell_n += mf.boxArray().numPts();\n+ }\n+ void apply (const MultiFab & mf) {\n+ apply_n++;\n+ apply_cell_n += mf.boxArray().numPts();\n+ }\n+ void restrict (const MultiFab & mf) {\n+ restrict_n++;\n+ restrict_cell_n += mf.boxArray().numPts();\n+ }\n+ void interpolate (const MultiFab & mf) {\n+ interp_n++;\n+ interp_cell_n += mf.boxArray().numPts();\n+ }\n+\n+ void print () {\n+ Print() << ParallelContext::MyProcSub() << \": perf: MLCellLinOp::smooth() called \" << smooth_n\n+ << \" times on \" << smooth_cell_n << \" cells total\" << std::endl;\n+ Print() << ParallelContext::MyProcSub() << \": perf: MLCellLinOp::apply() called \" << apply_n\n+ << \" times on \" << apply_cell_n << \" cells total\" << std::endl;\n+ Print() << ParallelContext::MyProcSub() << \": perf: MLCellLinOp::restriction() called \" << restrict_n\n+ << \" times on \" << restrict_cell_n << \" cells total\" << std::endl;\n+ Print() << ParallelContext::MyProcSub() << \": perf: MLCellLinOp::interpolation() called \" << interp_n\n+ << \" times on \" << interp_cell_n << \" cells total\" << std::endl;\n+ }\n+ };\n+\n+ // software counters for performance analysis\n+ static Counters perf_counters;\n+#endif\n+\n protected:\n \n virtual bool isCrossStencil () const { return true; }\ndiff --git a/Src/LinearSolvers/MLMG/AMReX_MLCellLinOp.cpp b/Src/LinearSolvers/MLMG/AMReX_MLCellLinOp.cpp\nindex d47e7de0870..385e032ef3f 100644\n--- a/Src/LinearSolvers/MLMG/AMReX_MLCellLinOp.cpp\n+++ b/Src/LinearSolvers/MLMG/AMReX_MLCellLinOp.cpp\n@@ -296,12 +296,18 @@ void\n MLCellLinOp::restriction (int, int, MultiFab& crse, MultiFab& fine) const\n {\n const int ncomp = getNComp();\n+#ifdef AMREX_SOFT_PERF_COUNTERS\n+ perf_counters.restrict(crse);\n+#endif\n amrex::average_down(fine, crse, 0, ncomp, 2);\n }\n \n void\n MLCellLinOp::interpolation (int amrlev, int fmglev, MultiFab& fine, const MultiFab& crse) const\n {\n+#ifdef AMREX_SOFT_PERF_COUNTERS\n+ perf_counters.interpolate(fine);\n+#endif\n #ifdef _OPENMP\n #pragma omp parallel\n #endif\n@@ -336,6 +342,9 @@ MLCellLinOp::apply (int amrlev, int mglev, MultiFab& out, MultiFab& in, BCMode b\n {\n BL_PROFILE(\"MLCellLinOp::apply()\");\n applyBC(amrlev, mglev, in, bc_mode, s_mode, bndry);\n+#ifdef AMREX_SOFT_PERF_COUNTERS\n+ perf_counters.apply(out);\n+#endif\n Fapply(amrlev, mglev, out, in);\n }\n \n@@ -348,6 +357,9 @@ MLCellLinOp::smooth (int amrlev, int mglev, MultiFab& sol, const MultiFab& rhs,\n {\n applyBC(amrlev, mglev, sol, BCMode::Homogeneous, StateMode::Solution,\n nullptr, skip_fillboundary);\n+#ifdef AMREX_SOFT_PERF_COUNTERS\n+ perf_counters.smooth(sol);\n+#endif\n Fsmooth(amrlev, mglev, sol, rhs, redblack);\n skip_fillboundary = false;\n }\n@@ -843,4 +855,9 @@ MLCellLinOp::update ()\n if (MLLinOp::needsUpdate()) MLLinOp::update();\n }\n \n+#ifdef AMREX_SOFT_PERF_COUNTERS\n+// perf_counters\n+MLCellLinOp::Counters MLCellLinOp::perf_counters;\n+#endif\n+\n }\ndiff --git a/Src/LinearSolvers/MLMG/AMReX_MLLinOp.H b/Src/LinearSolvers/MLMG/AMReX_MLLinOp.H\nindex 32749de0505..52a87c675f5 100644\n--- a/Src/LinearSolvers/MLMG/AMReX_MLLinOp.H\n+++ b/Src/LinearSolvers/MLMG/AMReX_MLLinOp.H\n@@ -56,6 +56,9 @@ public:\n \n enum struct Location { FaceCenter, FaceCentroid, CellCenter, CellCentroid };\n \n+ static void Initialize ();\n+ static void Finalize ();\n+\n MLLinOp ();\n virtual ~MLLinOp ();\n \n@@ -279,6 +282,7 @@ private:\n static void makeConsolidatedDMap (const Vector<BoxArray>& ba, Vector<DistributionMapping>& dm,\n int ratio, int strategy);\n MPI_Comm makeSubCommunicator (const DistributionMapping& dm);\n+ void remapNeighborhoods (Vector<DistributionMapping> & dms);\n };\n \n }\ndiff --git a/Src/LinearSolvers/MLMG/AMReX_MLLinOp.cpp b/Src/LinearSolvers/MLMG/AMReX_MLLinOp.cpp\nindex 1a08ce6caef..131ef7b8b29 100644\n--- a/Src/LinearSolvers/MLMG/AMReX_MLLinOp.cpp\n+++ b/Src/LinearSolvers/MLMG/AMReX_MLLinOp.cpp\n@@ -1,8 +1,13 @@\n \n #include <cmath>\n #include <algorithm>\n+#include <unordered_map>\n+#include <set>\n+#include <AMReX_Utility.H>\n #include <AMReX_MLLinOp.H>\n+#include <AMReX_MLCellLinOp.H>\n #include <AMReX_ParmParse.H>\n+#include <AMReX_Machine.H>\n \n #ifdef AMREX_USE_EB\n #include <AMReX_EB2.H>\n@@ -21,9 +26,95 @@ constexpr int MLLinOp::mg_box_min_width;\n \n namespace {\n // experimental features\n- bool initialized = false;\n+ bool initialized = false; // track initialization of static state\n+ int consolidation_threshold = -1;\n int consolidation_ratio = 2;\n int consolidation_strategy = 3;\n+\n+ int flag_verbose_linop = 0;\n+ int flag_comm_cache = 0;\n+ int flag_use_mota = 0;\n+ int remap_nbh_lb = 1;\n+\n+#ifdef BL_USE_MPI\n+ class CommCache\n+ {\n+ public:\n+ CommCache () = default;\n+ CommCache (const CommCache&) = delete;\n+ CommCache (CommCache&&) = delete;\n+ void operator= (const CommCache&) = delete;\n+ void operator= (CommCache&&) = delete;\n+\n+ ~CommCache () {\n+ for (auto & p : cache) {\n+ if (p.second != MPI_COMM_NULL) {\n+ MPI_Comm_free(&p.second);\n+ }\n+ }\n+ }\n+ void add (size_t key, MPI_Comm comm) {\n+ AMREX_ASSERT(cache.count(key) == 0);\n+ cache[key] = comm;\n+ }\n+ bool get (size_t key, MPI_Comm &comm) {\n+ bool result = cache.count(key) > 0;\n+ if (result) {\n+ comm = cache.at(key);\n+ }\n+ return result;\n+ }\n+\n+ private:\n+ std::unordered_map<size_t, MPI_Comm> cache;\n+ };\n+\n+ std::unique_ptr<CommCache> comm_cache;\n+#endif\n+\n+ Vector<int> get_subgroup_ranks ()\n+ {\n+ int rank_n = ParallelContext::NProcsSub();\n+ Vector<int> lranks(rank_n);\n+ for (int i = 0; i < rank_n; ++i) {\n+ lranks[i] = i;\n+ }\n+\n+ Vector<int> granks(rank_n);\n+ ParallelContext::local_to_global_rank(granks.data(), lranks.data(), rank_n);\n+ return granks;\n+ }\n+}\n+\n+// static member function\n+void MLLinOp::Initialize ()\n+{\n+ ParmParse pp(\"mg\");\n+ pp.query(\"consolidation_threshold\", consolidation_threshold);\n+ pp.query(\"consolidation_ratio\", consolidation_ratio);\n+ pp.query(\"consolidation_strategy\", consolidation_strategy);\n+ pp.query(\"verbose_linop\", flag_verbose_linop);\n+ pp.query(\"comm_cache\", flag_comm_cache);\n+ pp.query(\"mota\", flag_use_mota);\n+ pp.query(\"remap_nbh_lb\", remap_nbh_lb);\n+\n+#ifdef BL_USE_MPI\n+ comm_cache.reset(new CommCache());\n+#endif\n+ amrex::ExecOnFinalize(MLLinOp::Finalize);\n+ initialized = true;\n+}\n+\n+// static member function\n+void MLLinOp::Finalize ()\n+{\n+ initialized = false;\n+#ifdef BL_USE_MPI\n+ comm_cache.reset();\n+#endif\n+#ifdef AMREX_SOFT_PERF_COUNTERS\n+ MLCellLinOp::perf_counters.reset();\n+#endif\n }\n \n MLLinOp::MLLinOp () {}\n@@ -40,10 +131,7 @@ MLLinOp::define (const Vector<Geometry>& a_geom,\n BL_PROFILE(\"MLLinOp::define()\");\n \n if (!initialized) {\n-\tParmParse pp(\"mg\");\n-\tpp.query(\"consolidation_ratio\", consolidation_ratio);\n-\tpp.query(\"consolidation_strategy\", consolidation_strategy);\n-\tinitialized = true;\n+ Initialize();\n }\n \n info = a_info;\n@@ -158,6 +246,7 @@ MLLinOp::defineGrids (const Vector<Geometry>& a_geom,\n \n bool agged = false;\n bool coned = false;\n+ int agg_lev, con_lev;\n \n if (info.do_agglomeration && aggable)\n {\n@@ -237,6 +326,7 @@ MLLinOp::defineGrids (const Vector<Geometry>& a_geom,\n \n m_dmap[0].push_back(DistributionMapping());\n agged = true;\n+ agg_lev = last_coarsenableto_lev;\n }\n \n m_num_mg_levels[0] = m_grids[0].size();\n@@ -245,12 +335,14 @@ MLLinOp::defineGrids (const Vector<Geometry>& a_geom,\n else\n {\n int rr = mg_coarsen_ratio;\n- Real avg_npts, threshold_npts;\n+ Real avg_npts;\n if (info.do_consolidation) {\n avg_npts = static_cast<Real>(a_grids[0].d_numPts()) / static_cast<Real>(ParallelContext::NProcsSub());\n- threshold_npts = static_cast<Real>(AMREX_D_TERM(info.con_grid_size,\n- *info.con_grid_size,\n- *info.con_grid_size));\n+ if (consolidation_threshold == -1) {\n+ consolidation_threshold = static_cast<Real>(AMREX_D_TERM(info.con_grid_size,\n+ *info.con_grid_size,\n+ *info.con_grid_size));\n+ }\n }\n while (m_num_mg_levels[0] < info.max_coarsening_level + 1\n and a_geom[0].Domain().coarsenable(rr)\n@@ -263,9 +355,10 @@ MLLinOp::defineGrids (const Vector<Geometry>& a_geom,\n \n if (info.do_consolidation)\n {\n- if (avg_npts/(AMREX_D_TERM(rr,*rr,*rr)) < 0.999*threshold_npts)\n+ if (avg_npts/(AMREX_D_TERM(rr,*rr,*rr)) < 0.999*consolidation_threshold)\n {\n coned = true;\n+ con_lev = m_dmap[0].size();\n m_dmap[0].push_back(DistributionMapping());\n }\n else\n@@ -292,6 +385,11 @@ MLLinOp::defineGrids (const Vector<Geometry>& a_geom,\n makeConsolidatedDMap(m_grids[0], m_dmap[0], consolidation_ratio, consolidation_strategy);\n }\n \n+ if (flag_use_mota && (agged || coned))\n+ {\n+ remapNeighborhoods(m_dmap[0]);\n+ }\n+\n if (info.do_agglomeration || info.do_consolidation)\n {\n m_bottom_comm = makeSubCommunicator(m_dmap[0].back());\n@@ -304,6 +402,19 @@ MLLinOp::defineGrids (const Vector<Geometry>& a_geom,\n m_do_agglomeration = agged;\n m_do_consolidation = coned;\n \n+ if (flag_verbose_linop) {\n+ if (agged) {\n+ Print() << \"MLLinOp::defineGrids(): agglomerated AMR level 0 starting at MG level \"\n+ << agg_lev << \" of \" << m_num_mg_levels[0] << std::endl;\n+ } else if (coned) {\n+ Print() << \"MLLinOp::defineGrids(): consolidated AMR level 0 starting at MG level \"\n+ << con_lev << \" of \" << m_num_mg_levels[0]\n+ << \" (ratio = \" << consolidation_ratio << \")\" << std::endl;\n+ } else {\n+ Print() << \"MLLinOp::defineGrids(): no agglomeration or consolidation of AMR level 0\" << std::endl;\n+ }\n+ }\n+\n for (int amrlev = 0; amrlev < m_num_amr_levels; ++amrlev)\n {\n for (int mglev = 1; mglev < m_num_mg_levels[amrlev]; ++mglev)\n@@ -377,30 +488,59 @@ MLLinOp::makeSubCommunicator (const DistributionMapping& dm)\n BL_PROFILE(\"MLLinOp::makeSubCommunicator()\");\n \n #ifdef BL_USE_MPI\n- MPI_Comm newcomm;\n- MPI_Group defgrp, newgrp;\n-\n- MPI_Comm_group(m_default_comm, &defgrp);\n \n Vector<int> newgrp_ranks = dm.ProcessorMap();\n std::sort(newgrp_ranks.begin(), newgrp_ranks.end());\n auto last = std::unique(newgrp_ranks.begin(), newgrp_ranks.end());\n newgrp_ranks.erase(last, newgrp_ranks.end());\n \n- if (ParallelContext::CommunicatorSub() == ParallelDescriptor::Communicator()) {\n- MPI_Group_incl(defgrp, newgrp_ranks.size(), newgrp_ranks.data(), &newgrp);\n- } else {\n- Vector<int> local_newgrp_ranks(newgrp_ranks.size());\n- ParallelContext::global_to_local_rank(local_newgrp_ranks.data(),\n- newgrp_ranks.data(), newgrp_ranks.size());\n- MPI_Group_incl(defgrp, local_newgrp_ranks.size(), local_newgrp_ranks.data(), &newgrp);\n+ if (flag_verbose_linop) {\n+ Print() << \"MLLinOp::makeSubCommunicator(): called for \" << newgrp_ranks.size() << \" ranks\" << std::endl;\n }\n \n- MPI_Comm_create(m_default_comm, newgrp, &newcomm); \n- m_raii_comm.reset(new CommContainer(newcomm));\n+ MPI_Comm newcomm;\n+ bool cache_hit = false;\n+ uint64_t key = 0;\n+ if (flag_comm_cache) {\n+ AMREX_ASSERT(comm_cache);\n+ key = hash_vector(newgrp_ranks, hash_vector(get_subgroup_ranks()));\n+ cache_hit = comm_cache->get(key, newcomm);\n+ if (cache_hit && flag_verbose_linop) {\n+ Print() << \"MLLinOp::makeSubCommunicator(): found subcomm in cache\" << std::endl;\n+ }\n+ }\n+\n+ if (!flag_comm_cache || !cache_hit) {\n+ MPI_Group defgrp, newgrp;\n+ MPI_Comm_group(m_default_comm, &defgrp);\n+ if (ParallelContext::CommunicatorSub() == ParallelDescriptor::Communicator()) {\n+ MPI_Group_incl(defgrp, newgrp_ranks.size(), newgrp_ranks.data(), &newgrp);\n+ } else {\n+ Vector<int> local_newgrp_ranks(newgrp_ranks.size());\n+ ParallelContext::global_to_local_rank(local_newgrp_ranks.data(),\n+ newgrp_ranks.data(), newgrp_ranks.size());\n+ MPI_Group_incl(defgrp, local_newgrp_ranks.size(), local_newgrp_ranks.data(), &newgrp);\n+ }\n+\n+ if (flag_verbose_linop) {\n+ Print() << \"MLLinOp::makeSubCommunicator(): MPI_Comm_create: (\";\n+ for (auto rank : newgrp_ranks) {\n+ Print() << rank << \",\";\n+ }\n+ Print() << \"\\b)\" << std::endl;\n+ }\n+\n+ MPI_Comm_create(m_default_comm, newgrp, &newcomm);\n+\n+ if (flag_comm_cache) {\n+ comm_cache->add(key, newcomm);\n+ } else {\n+ m_raii_comm.reset(new CommContainer(newcomm));\n+ }\n \n- MPI_Group_free(&defgrp);\n- MPI_Group_free(&newgrp);\n+ MPI_Group_free(&defgrp);\n+ MPI_Group_free(&newgrp);\n+ }\n \n return newcomm;\n #else\n@@ -490,6 +630,44 @@ MLLinOp::makeConsolidatedDMap (const Vector<BoxArray>& ba, Vector<DistributionMa\n }\n }\n \n+void\n+MLLinOp::remapNeighborhoods (Vector<DistributionMapping> & dms)\n+{\n+ BL_PROFILE(\"MLLinOp::remapNeighborhoods()\");\n+\n+ if (flag_verbose_linop) {\n+ Print() << \"Remapping ranks to neighborhoods ...\" << std::endl;\n+ }\n+\n+ for (int j = 1; j < dms.size(); ++j)\n+ {\n+ const Vector<int> & pmap = dms[j].ProcessorMap();\n+ std::set<int> g_ranks_set(pmap.begin(), pmap.end());\n+ auto lev_rank_n = g_ranks_set.size();\n+ if (lev_rank_n >= remap_nbh_lb && lev_rank_n < ParallelContext::NProcsSub())\n+ {\n+ // find best neighborhood with lev_rank_n ranks\n+ auto nbh_g_ranks = machine::find_best_nbh(lev_rank_n);\n+ AMREX_ASSERT(nbh_g_ranks.size() == lev_rank_n);\n+\n+ // construct mapping from original global rank to neighborhood global rank\n+ int idx = 0;\n+ std::unordered_map<int, int> rank_mapping;\n+ for (auto orig_g_rank : g_ranks_set) {\n+ AMREX_ASSERT(idx < nbh_g_ranks.size());\n+ rank_mapping[orig_g_rank] = nbh_g_ranks[idx++];\n+ }\n+\n+ // remap and create new DM\n+ Vector<int> nbh_pmap(pmap.size());\n+ for (int i = 0; i < pmap.size(); ++i) {\n+ nbh_pmap[i] = rank_mapping.at(pmap[i]);\n+ }\n+ dms[j] = DistributionMapping(std::move(nbh_pmap));\n+ }\n+ }\n+}\n+\n #ifdef AMREX_USE_PETSC\n std::unique_ptr<PETScABecLap>\n MLLinOp::makePETSc () const\ndiff --git a/Src/LinearSolvers/MLMG/AMReX_MLMG.cpp b/Src/LinearSolvers/MLMG/AMReX_MLMG.cpp\nindex 55a791a650f..dfaff5d0e6b 100644\n--- a/Src/LinearSolvers/MLMG/AMReX_MLMG.cpp\n+++ b/Src/LinearSolvers/MLMG/AMReX_MLMG.cpp\n@@ -53,7 +53,6 @@ Real\n MLMG::solve (const Vector<MultiFab*>& a_sol, const Vector<MultiFab const*>& a_rhs,\n Real a_tol_rel, Real a_tol_abs)\n {\n- BL_PROFILE_REGION(\"MLMG::solve()\");\n BL_PROFILE(\"MLMG::solve()\");\n \n if (bottom_solver == BottomSolver::hypre) {\n@@ -357,21 +356,38 @@ MLMG::miniCycle (int amrlev)\n mgVcycle(amrlev, mglev);\n }\n \n+namespace {\n+\n+void make_str_helper (std::ostringstream & oss) { }\n+\n+template <class T, class... Ts>\n+void make_str_helper (std::ostringstream & oss, T x, Ts... xs) {\n+ oss << x;\n+ make_str_helper(oss, xs...);\n+}\n+\n+template <class... Ts>\n+std::string make_str (Ts... xs) {\n+ std::ostringstream oss;\n+ make_str_helper(oss, xs...);\n+ return oss.str();\n+}\n+\n+}\n+\n // in : Residual (res) \n // out : Correction (cor) from bottom to this function's local top\n void\n MLMG::mgVcycle (int amrlev, int mglev_top)\n {\n BL_PROFILE(\"MLMG::mgVcycle()\");\n- BL_PROFILE_VAR_NS(\"MLMG::mgVcycle_up\", blp_up);\n- BL_PROFILE_VAR_NS(\"MLMG::mgVcycle_bottom\", blp_bottom);\n- BL_PROFILE_VAR_NS(\"MLMG::mgVcycle_down\", blp_down);\n \n const int mglev_bottom = linop.NMGLevels(amrlev) - 1;\n \n- BL_PROFILE_VAR_START(blp_down);\n for (int mglev = mglev_top; mglev < mglev_bottom; ++mglev)\n {\n+ std::string blp_mgv_down_lev_str = make_str(\"MLMG::mgVcycle_down::\", mglev);\n+ BL_PROFILE_VAR(blp_mgv_down_lev_str, blp_mgv_down_lev);\n \n if (verbose >= 4)\n {\n@@ -402,9 +418,8 @@ MLMG::mgVcycle (int amrlev, int mglev_top)\n linop.restriction(amrlev, mglev+1, res[amrlev][mglev+1], rescor[amrlev][mglev]);\n \n }\n- BL_PROFILE_VAR_STOP(blp_down);\n \n- BL_PROFILE_VAR_START(blp_bottom);\n+ BL_PROFILE_VAR(\"MLMG::mgVcycle_bottom\", blp_bottom);\n if (amrlev == 0)\n {\n if (verbose >= 4)\n@@ -447,9 +462,10 @@ MLMG::mgVcycle (int amrlev, int mglev_top)\n }\n BL_PROFILE_VAR_STOP(blp_bottom);\n \n- BL_PROFILE_VAR_START(blp_up);\n for (int mglev = mglev_bottom-1; mglev >= mglev_top; --mglev)\n {\n+ std::string blp_mgv_up_lev_str = make_str(\"MLMG::mgVcycle_up::\", mglev);\n+ BL_PROFILE_VAR(blp_mgv_up_lev_str, blp_mgv_up_lev);\n // cor_fine += I(cor_crse)\n addInterpCorrection(amrlev, mglev);\n if (verbose >= 4)\n@@ -470,7 +486,6 @@ MLMG::mgVcycle (int amrlev, int mglev_top)\n << \" UP: Norm after smooth \" << norm << \"\\n\";\n }\n }\n- BL_PROFILE_VAR_STOP(blp_up);\n }\n \n // FMG cycle on the coarsest AMR level.\n@@ -1461,7 +1476,6 @@ MLMG::computeVolInv ()\n \n if (linop.isCellCentered())\n { \n- Real temp1, temp2; \n volinv.resize(namrlevs);\n for (int amrlev = 0; amrlev < namrlevs; ++amrlev) {\n volinv[amrlev].resize(linop.NMGLevels(amrlev));\n@@ -1491,6 +1505,7 @@ MLMG::computeVolInv ()\n f(0,mgbottom);\n \n #ifdef AMREX_USE_EB\n+ Real temp1, temp2;\n if (rhs[0].hasEBFabFactory())\n {\n ParallelAllReduce::Sum<Real>({volinv[0][0], volinv[0][mgbottom]},\ndiff --git a/Tools/Backtrace/parse_bt.py b/Tools/Backtrace/parse_bt.py\nindex c1fb8a5cbd3..cdc64323820 100755\n--- a/Tools/Backtrace/parse_bt.py\n+++ b/Tools/Backtrace/parse_bt.py\n@@ -16,10 +16,25 @@\n lines = f.readlines()\n \n for l in lines:\n- m = re.match(\"\\s*(\\d+): \\[(0x[\\dabcdef]+)\\]\", l)\n+\n+ matched = False\n+\n+ # gnu compiler\n+ m = re.match(\"\\s*(\\d+): .*\\(\\+(0x[\\dabcdef]+)\\)\", l)\n if m:\n+ matched = True\n frame = m.group(1)\n addr = m.group(2)\n+\n+ # intel compiler\n+ if not matched:\n+ m = re.match(\"\\s*(\\d+): \\[(0x[\\dabcdef]+)\\]\", l)\n+ if m:\n+ matched = True\n+ frame = m.group(1)\n+ addr = m.group(2)\n+\n+ if matched:\n cmd = \"addr2line -Cfie %s %s\" % (exe_file, addr)\n info = subprocess.check_output(shlex.split(cmd)).decode(\"utf-8\")\n print(\"%s: %s\" % (frame, info))\n"}, "test": {"test_patch": "diff --git a/Tests/LinearSolvers/MLMG/GNUmakefile b/Tests/LinearSolvers/MLMG/GNUmakefile\nindex 4a12a62bd49..eed6d56a155 100644\n--- a/Tests/LinearSolvers/MLMG/GNUmakefile\n+++ b/Tests/LinearSolvers/MLMG/GNUmakefile\n@@ -1,19 +1,20 @@\n AMREX_HOME ?= ../../../\n \n-DEBUG\t= FALSE\n-#DEBUG\t= TRUE\n+DEBUG\t?= FALSE\n+DIM\t?= 3\n+COMP ?= gnu\n \n-DIM\t= 3\n-\n-COMP = gnu\n-\n-USE_MPI = TRUE\n-#USE_OMP = TRUE\n-USE_OMP = FALSE\n+USE_MPI ?= TRUE\n+USE_OMP ?= FALSE\n \n USE_HYPRE = FALSE\n \n-TINY_PROFILE = TRUE\n+TINY_PROFILE ?= TRUE\n+PROFILE ?= FALSE\n+COMM_PROFILE ?= FALSE\n+TRACE_PROFILE ?= FALSE\n+\n+DEFINES += -DAMREX_SOFT_PERF_COUNTERS\n \n include $(AMREX_HOME)/Tools/GNUMake/Make.defs\n \ndiff --git a/Tests/LinearSolvers/MLMG/inputs b/Tests/LinearSolvers/MLMG/inputs\nindex a56526e83e6..3a69b9628bd 100644\n--- a/Tests/LinearSolvers/MLMG/inputs\n+++ b/Tests/LinearSolvers/MLMG/inputs\n@@ -26,3 +26,10 @@ max_fmg_iter = 0 # # of F-cycles before switching to V. To do pure V-cycle,\n linop_maxorder = 2\n agglomeration = 1 # Do agglomeration on AMR Level 0?\n consolidation = 1 # Do consolidation?\n+\n+mg.verbose_linop = 1\n+mg.comm_cache = 1\n+mg.consolidation_ratio = 2\n+mg.mota = 0\n+mg.remap_nbh_lb = 1\n+machine.verbose = 1\ndiff --git a/Tests/LinearSolvers/MLMG/main.cpp b/Tests/LinearSolvers/MLMG/main.cpp\nindex bf4d8d6cbf5..e0a5e6f97de 100644\n--- a/Tests/LinearSolvers/MLMG/main.cpp\n+++ b/Tests/LinearSolvers/MLMG/main.cpp\n@@ -2,6 +2,12 @@\n #include <AMReX.H>\n #include <AMReX_ParmParse.H>\n #include <AMReX_MultiFab.H>\n+#include <AMReX_Machine.H>\n+\n+#ifdef AMREX_SOFT_PERF_COUNTERS\n+// need for perf counters\n+#include <AMReX_MLCellLinOp.H>\n+#endif\n \n #include <prob_par.H>\n \n@@ -70,6 +76,10 @@ int main (int argc, char* argv[])\n \n solve_with_mlmg (geom, ref_ratio, soln, alpha, beta, rhs, exact);\n \n+#ifdef AMREX_SOFT_PERF_COUNTERS\n+ MLCellLinOp::perf_counters.print();\n+#endif\n+\n write_plotfile (geom, ref_ratio, soln, exact, alpha, beta, rhs);\n }\n \ndiff --git a/Tests/LinearSolvers/MLMG/solve_with_mlmg.cpp b/Tests/LinearSolvers/MLMG/solve_with_mlmg.cpp\nindex 6aaf6b4564c..187c60237e4 100644\n--- a/Tests/LinearSolvers/MLMG/solve_with_mlmg.cpp\n+++ b/Tests/LinearSolvers/MLMG/solve_with_mlmg.cpp\n@@ -28,6 +28,9 @@ void solve_with_mlmg(const Vector<Geometry>& geom, int ref_ratio,\n Vector<MultiFab>& rhs, const Vector<MultiFab>& exact) {\n BL_PROFILE(\"solve_with_mlmg\");\n \n+ Real tol_rel = 1.e-10;\n+ Real tol_abs = 0.0;\n+\n {\n ParmParse pp;\n pp.query(\"composite_solve\", composite_solve);\n@@ -41,6 +44,8 @@ void solve_with_mlmg(const Vector<Geometry>& geom, int ref_ratio,\n pp.query(\"agglomeration\", agglomeration);\n pp.query(\"consolidation\", consolidation);\n pp.query(\"use_hypre\", use_hypre);\n+ pp.query(\"tol_rel\", tol_rel);\n+ pp.query(\"tol_abs\", tol_abs);\n }\n \n LPInfo info;\n@@ -48,9 +53,6 @@ void solve_with_mlmg(const Vector<Geometry>& geom, int ref_ratio,\n info.setConsolidation(consolidation);\n info.setMaxCoarseningLevel(max_coarsening_level);\n \n- const Real tol_rel = 1.e-10;\n- const Real tol_abs = 0.0;\n-\n const int nlevels = geom.size();\n \n if (composite_solve) {\n", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}56{"question_id": "MSB_AMReX-Codes_amrex_pr4144", "question_type": "multi_swe_bench", "description": "Fix ParmParse::query_enum_case_insensitive (AMReX-Codes/amrex#4144)", "content": {"org": "AMReX-Codes", "repo": "amrex", "pr_number": 4144, "issue_title": "Fix ParmParse::query_enum_case_insensitive", "issue_body": "Since #4143, we can no longer cast the position of the found string in the vector of all names to obtain its enum value, because the enum values can now have duplicates.\r\n", "base_commit": "d57292886315f57362865616b3f2380ea8e2ed78", "resolved_issues": [{"number": 4143, "title": "AMREX_ENUM: Add more capabilites", "body": "Add support for `=`. For example,\r\n\r\n```c++\r\n AMREX_ENUM(MyColor,\r\n red,\r\n chi=red,\r\n green,\r\n blue,\r\n Default = green);\r\n```\r\nThe underlying values are then\r\n```c++\r\n { red = 0,\r\n chi = 0,\r\n green = 1,\r\n blue = 2,\r\n Default = 1}\r\n```\r\nWe can then have\r\n```c++\r\n assert(amrex::getEnum<MyColor2>(\"red\") == MyColor2::red);\r\n assert(amrex::getEnum<MyColor2>(\"chi\") == MyColor2::chi);\r\n assert(amrex::getEnum<MyColor2>(\"green\") == MyColor2::green);\r\n assert(amrex::getEnum<MyColor2>(\"blue\") == MyColor2::blue);\r\n assert(amrex::getEnum<MyColor2>(\"Default\") == MyColor2::Default);\r\n```\r\nBecause of there are duplicated values, using value to get name string will return the first matched string. Currently, I don't see a way to fix it. But, since `MyColor::red == MyColor::chi` is true, it's also not outrageously wrong.\r\n```c++\r\n assert(amrex::getEnumNameString(MyColor2::red) == \"red\");\r\n assert(amrex::getEnumNameString(MyColor2::chi) == \"red\");\r\n assert(amrex::getEnumNameString(MyColor2::green) == \"green\");\r\n assert(amrex::getEnumNameString(MyColor2::blue) == \"blue\");\r\n assert(amrex::getEnumNameString(MyColor2::Default) == \"green\");\r\n```\r\nP.S. Chi means red in Chinese. https://en.wikipedia.org/wiki/Radical_155\r\n"}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/amrex-codes_m_amrex:pr-4144", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/Src/Base/AMReX_Enum.H b/Src/Base/AMReX_Enum.H\nindex 2bb503d4113..b94e30d396e 100644\n--- a/Src/Base/AMReX_Enum.H\n+++ b/Src/Base/AMReX_Enum.H\n@@ -67,6 +67,26 @@ namespace amrex\n }\n }\n \n+ template <typename T, typename ET = amrex_enum_traits<T>,\n+ std::enable_if_t<ET::value,int> = 0>\n+ T getEnumCaseInsensitive (std::string_view const& s)\n+ {\n+ auto const& kv = getEnumNameValuePairs<T>();\n+ std::string ls = amrex::toLower(std::string(s));\n+ auto it = std::find_if(kv.begin(), kv.end(),\n+ [&] (auto const& x) -> bool\n+ { return amrex::toLower(x.first) == ls; });\n+ if (it != kv.end()) {\n+ return it->second;\n+ } else {\n+ std::string error_msg(\"amrex::getEnumCaseInsensitive: Unknown enum: \");\n+ error_msg.append(s).append(\" in AMREX_ENUM(\").append(ET::class_name)\n+ .append(\", \").append(ET::enum_names).append(\").\");\n+ throw std::runtime_error(error_msg);\n+ return T();\n+ }\n+ }\n+\n template <typename T, typename ET = amrex_enum_traits<T>,\n std::enable_if_t<ET::value,int> = 0>\n std::string getEnumNameString (T const& v)\ndiff --git a/Src/Base/AMReX_ParmParse.H b/Src/Base/AMReX_ParmParse.H\nindex 63c0c45431a..42e62a05ab3 100644\n--- a/Src/Base/AMReX_ParmParse.H\n+++ b/Src/Base/AMReX_ParmParse.H\n@@ -1329,19 +1329,14 @@ public:\n std::string s;\n int exist = this->query(name, s, ival);\n if (exist) {\n- s = amrex::toLower(s);\n- auto const& enum_names = amrex::getEnumNameStrings<T>();\n- auto found = std::find_if(enum_names.begin(), enum_names.end(),\n- [&] (std::string const& ename) {\n- return amrex::toLower(ename) == s;\n- });\n- if (found != enum_names.end()) {\n- ref = static_cast<T>(std::distance(enum_names.begin(), found));\n- } else {\n- std::string msg(\"query_enum_case_insensitive(\\\"\");\n- msg.append(name).append(\"\\\",\").append(amrex::getEnumClassName<T>())\n- .append(\"&) failed.\");\n- throw std::runtime_error(msg);\n+ try {\n+ ref = amrex::getEnumCaseInsensitive<T>(s);\n+ } catch (...) {\n+ if (amrex::Verbose() > 0) {\n+ amrex::Print() << \"amrex::ParmParse::query_enum_case_insensitive (input name: \"\n+ << this->prefixedName(name) << \"):\\n\";\n+ }\n+ throw;\n }\n }\n return exist;\n"}, "test": {"test_patch": "diff --git a/Tests/Enum/main.cpp b/Tests/Enum/main.cpp\nindex 69ed91adc27..b0647836e49 100644\n--- a/Tests/Enum/main.cpp\n+++ b/Tests/Enum/main.cpp\n@@ -129,6 +129,11 @@ int main (int argc, char* argv[])\n AMREX_ALWAYS_ASSERT(amrex::getEnum<MyColor2>(\"green\") == MyColor2::green);\n AMREX_ALWAYS_ASSERT(amrex::getEnum<MyColor2>(\"blue\") == MyColor2::blue);\n AMREX_ALWAYS_ASSERT(amrex::getEnum<MyColor2>(\"Default\") == MyColor2::Default);\n+\n+ auto my_blue = MyColor2::Default;\n+ ParmParse pp;\n+ pp.query_enum_case_insensitive(\"color5\", my_blue);\n+ AMREX_ALWAYS_ASSERT(my_blue == MyColor2::blue);\n }\n \n amrex::Finalize();\n", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}57{"question_id": "MSB_AMReX-Codes_amrex_pr4163", "question_type": "multi_swe_bench", "description": "Named SoA Support (AMReX-Codes/amrex#4163)", "content": {"org": "AMReX-Codes", "repo": "amrex", "pr_number": 4163, "issue_title": "Named SoA Support", "issue_body": "## Summary\r\n\r\nAdd support to optionally name SoA Real and Int components, both for compile-time and runtime components.\r\n\r\n- [x] define and defaults\r\n- [x] single tile `Get*Data(std::string)`\r\n- [x] refactor out default name generation for reuse, finalize defaults in `AddReal/IntComp`\r\n- [x] test\r\n\r\n## Additional background\r\n\r\nClose #3614 \r\n\r\n## Checklist\r\n\r\nThe proposed changes:\r\n- [ ] fix a bug or incorrect behavior in AMReX\r\n- [x] add new capabilities to AMReX\r\n- [ ] changes answers in the test suite to more than roundoff level\r\n- [ ] are likely to significantly affect the results of downstream AMReX users\r\n- [ ] include documentation in the code and/or rst files, if appropriate\r\n", "base_commit": "1bfdb84c124a6feb6b19df976b6e7ceb4e6c016e", "resolved_issues": [{"number": 3614, "title": "Named Particle SoA Components", "body": "X-ref:\r\n- https://github.com/AMReX-Codes/pyamrex/pull/220\r\n- https://github.com/AMReX-Codes/pyamrex/pull/88\r\n\r\nIt would be nice if AMReX supported the functionality to name particle attributes (as strings). In WarpX, we added this as `NamedParticleContainer`, but as a mainstream implementation we could avoid deriving yet another class type (because if we do, we will again have additional compile-time to bind that custom type in pyAMReX), and instead could just extend the particle classes with these runtime details."}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/amrex-codes_m_amrex:pr-4163", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/Src/Particle/AMReX_ParticleContainer.H b/Src/Particle/AMReX_ParticleContainer.H\nindex 03a2254a10e..4b347d283b8 100644\n--- a/Src/Particle/AMReX_ParticleContainer.H\n+++ b/Src/Particle/AMReX_ParticleContainer.H\n@@ -60,6 +60,7 @@\n #include <memory>\n #include <numeric>\n #include <random>\n+#include <string>\n #include <tuple>\n #include <type_traits>\n #include <utility>\n@@ -1144,7 +1145,8 @@ public:\n */\n ParticleTileType& DefineAndReturnParticleTile (int lev, int grid, int tile)\n {\n- m_particles[lev][std::make_pair(grid, tile)].define(NumRuntimeRealComps(), NumRuntimeIntComps());\n+ m_particles[lev][std::make_pair(grid, tile)].define(NumRuntimeRealComps(), NumRuntimeIntComps(), &m_soa_rdata_names, &m_soa_idata_names);\n+\n return ParticlesAt(lev, grid, tile);\n }\n \n@@ -1247,10 +1249,10 @@ public:\n \n Long superParticleSize() const { return superparticle_size; }\n \n- template <typename T,\n- std::enable_if_t<std::is_same_v<T,bool>,int> = 0>\n- void AddRealComp (T communicate=true)\n+ void AddRealComp (std::string const & name, int communicate=1)\n {\n+ m_soa_rdata_names.push_back(name);\n+\n m_runtime_comps_defined = true;\n m_num_runtime_real++;\n h_redistribute_real_comp.push_back(communicate);\n@@ -1270,10 +1272,15 @@ public:\n }\n }\n \n- template <typename T,\n- std::enable_if_t<std::is_same_v<T,bool>,int> = 0>\n- void AddIntComp (T communicate=true)\n+ void AddRealComp (int communicate=1)\n {\n+ AddRealComp(getDefaultCompNameReal<ParticleType>(NArrayReal+m_num_runtime_real), communicate);\n+ }\n+\n+ void AddIntComp (std::string const & name, int communicate=1)\n+ {\n+ m_soa_idata_names.push_back(name);\n+\n m_runtime_comps_defined = true;\n m_num_runtime_int++;\n h_redistribute_int_comp.push_back(communicate);\n@@ -1293,6 +1300,11 @@ public:\n }\n }\n \n+ void AddIntComp (int communicate=1)\n+ {\n+ AddIntComp(getDefaultCompNameInt<ParticleType>(NArrayInt+m_num_runtime_int), communicate);\n+ }\n+\n int NumRuntimeRealComps () const { return m_num_runtime_real; }\n int NumRuntimeIntComps () const { return m_num_runtime_int; }\n \n@@ -1403,6 +1415,15 @@ public:\n #include \"AMReX_ParticlesHDF5.H\"\n #endif\n \n+ /** Overwrite the default names for the compile-time SoA components */\n+ void SetSoACompileTimeNames (std::vector<std::string> const & rdata_name, std::vector<std::string> const & idata_name);\n+\n+ /** Get the names for the real SoA components **/\n+ std::vector<std::string> GetRealSoANames () const {return m_soa_rdata_names;}\n+\n+ /** Get the names for the int SoA components **/\n+ std::vector<std::string> GetIntSoANames () const {return m_soa_idata_names;}\n+\n protected:\n \n template <class RTYPE>\n@@ -1435,6 +1456,10 @@ private:\n size_t particle_size, superparticle_size;\n int num_real_comm_comps, num_int_comm_comps;\n Vector<ParticleLevel> m_particles;\n+\n+ // names of both compile-time and runtime Real and Int SoA data\n+ std::vector<std::string> m_soa_rdata_names;\n+ std::vector<std::string> m_soa_idata_names;\n };\n \n template <int T_NStructReal, int T_NStructInt, int T_NArrayReal, int T_NArrayInt, template<class> class Allocator, class CellAssignor>\ndiff --git a/Src/Particle/AMReX_ParticleContainerI.H b/Src/Particle/AMReX_ParticleContainerI.H\nindex 74e65b792f0..718405f1e66 100644\n--- a/Src/Particle/AMReX_ParticleContainerI.H\n+++ b/Src/Particle/AMReX_ParticleContainerI.H\n@@ -1,6 +1,10 @@\n-#include <type_traits>\n #include <AMReX_MakeParticle.H>\n \n+#include <string>\n+#include <type_traits>\n+#include <vector>\n+\n+\n template <typename ParticleType, int NArrayReal, int NArrayInt,\n template<class> class Allocator, class CellAssignor>\n void\n@@ -60,10 +64,40 @@ ParticleContainer_impl<ParticleType, NArrayReal, NArrayInt, Allocator, CellAssig\n pp.query(\"do_unlink\", doUnlink);\n pp.queryAdd(\"do_mem_efficient_sort\", memEfficientSort);\n \n+ // add default names for SoA Real and Int compile-time arguments\n+ for (int i=0; i<NArrayReal; ++i)\n+ {\n+ m_soa_rdata_names.push_back(getDefaultCompNameReal<ParticleType>(i));\n+ }\n+ for (int i=0; i<NArrayInt; ++i)\n+ {\n+ m_soa_idata_names.push_back(getDefaultCompNameInt<ParticleType>(i));\n+ }\n+\n initialized = true;\n }\n }\n \n+template <typename ParticleType, int NArrayReal, int NArrayInt,\n+ template<class> class Allocator, class CellAssignor>\n+void\n+ParticleContainer_impl<ParticleType, NArrayReal, NArrayInt, Allocator, CellAssignor> :: SetSoACompileTimeNames (\n+ std::vector<std::string> const & rdata_name, std::vector<std::string> const & idata_name\n+)\n+{\n+ AMREX_ALWAYS_ASSERT_WITH_MESSAGE(rdata_name.size() == NArrayReal, \"rdata_name must be equal to NArrayReal\");\n+ AMREX_ALWAYS_ASSERT_WITH_MESSAGE(idata_name.size() == NArrayInt, \"idata_name must be equal to NArrayInt\");\n+\n+ for (int i=0; i<NArrayReal; ++i)\n+ {\n+ m_soa_rdata_names.at(i) = rdata_name.at(i);\n+ }\n+ for (int i=0; i<NArrayInt; ++i)\n+ {\n+ m_soa_idata_names.at(i) = idata_name.at(i);\n+ }\n+}\n+\n template <typename ParticleType, int NArrayReal, int NArrayInt,\n template<class> class Allocator, class CellAssignor>\n template <typename P, typename Assignor>\n@@ -1161,7 +1195,7 @@ ParticleContainer_impl<ParticleType, NArrayReal, NArrayInt, Allocator, CellAssig\n }\n } else {\n ParticleTileType ptile_tmp;\n- ptile_tmp.define(m_num_runtime_real, m_num_runtime_int);\n+ ptile_tmp.define(m_num_runtime_real, m_num_runtime_int, &m_soa_rdata_names, &m_soa_idata_names);\n ptile_tmp.resize(np_total);\n // copy re-ordered particles\n gatherParticles(ptile_tmp, ptile, np, permutations);\n@@ -1498,7 +1532,7 @@ ParticleContainer_impl<ParticleType, NArrayReal, NArrayInt, Allocator, CellAssig\n tmp_local[lev][index].resize(num_threads);\n soa_local[lev][index].resize(num_threads);\n for (int t = 0; t < num_threads; ++t) {\n- soa_local[lev][index][t].define(m_num_runtime_real, m_num_runtime_int);\n+ soa_local[lev][index][t].define(m_num_runtime_real, m_num_runtime_int, &m_soa_rdata_names, &m_soa_idata_names);\n }\n }\n }\ndiff --git a/Src/Particle/AMReX_ParticleIO.H b/Src/Particle/AMReX_ParticleIO.H\nindex 01ab0ded869..601b7417d18 100644\n--- a/Src/Particle/AMReX_ParticleIO.H\n+++ b/Src/Particle/AMReX_ParticleIO.H\n@@ -51,20 +51,18 @@ ParticleContainer_impl<ParticleType, NArrayReal, NArrayInt, Allocator, CellAssig\n {\n Vector<int> write_real_comp;\n Vector<std::string> tmp_real_comp_names;\n- int nrc = ParticleType::is_soa_particle ? NStructReal + NumRealComps() - AMREX_SPACEDIM : NStructReal + NumRealComps();\n \n- for (int i = 0; i < nrc; ++i )\n+ int first_rcomp = ParticleType::is_soa_particle ? AMREX_SPACEDIM : 0;\n+ for (int i = first_rcomp; i < NStructReal + NumRealComps(); ++i )\n {\n write_real_comp.push_back(1);\n if (real_comp_names.empty())\n {\n- std::stringstream ss;\n- ss << \"real_comp\" << i;\n- tmp_real_comp_names.push_back(ss.str());\n+ tmp_real_comp_names.push_back(getDefaultCompNameReal<ParticleType>(i));\n }\n else\n {\n- tmp_real_comp_names.push_back(real_comp_names[i]);\n+ tmp_real_comp_names.push_back(real_comp_names[i-first_rcomp]);\n }\n }\n \n@@ -75,9 +73,7 @@ ParticleContainer_impl<ParticleType, NArrayReal, NArrayInt, Allocator, CellAssig\n write_int_comp.push_back(1);\n if (int_comp_names.empty())\n {\n- std::stringstream ss;\n- ss << \"int_comp\" << i;\n- tmp_int_comp_names.push_back(ss.str());\n+ tmp_int_comp_names.push_back(getDefaultCompNameInt<ParticleType>(i));\n }\n else\n {\n@@ -98,14 +94,12 @@ ParticleContainer_impl<ParticleType, NArrayReal, NArrayInt, Allocator, CellAssig\n {\n Vector<int> write_real_comp;\n Vector<std::string> real_comp_names;\n- int nrc = ParticleType::is_soa_particle ? NStructReal + NumRealComps() - AMREX_SPACEDIM : NStructReal + NumRealComps();\n \n- for (int i = 0; i < nrc; ++i )\n+ int first_rcomp = ParticleType::is_soa_particle ? AMREX_SPACEDIM : 0;\n+ for (int i = first_rcomp; i < NStructReal + NumRealComps(); ++i )\n {\n write_real_comp.push_back(1);\n- std::stringstream ss;\n- ss << \"real_comp\" << i;\n- real_comp_names.push_back(ss.str());\n+ real_comp_names.push_back(getDefaultCompNameReal<ParticleType>(i));\n }\n \n Vector<int> write_int_comp;\n@@ -113,9 +107,7 @@ ParticleContainer_impl<ParticleType, NArrayReal, NArrayInt, Allocator, CellAssig\n for (int i = 0; i < NStructInt + NumIntComps(); ++i )\n {\n write_int_comp.push_back(1);\n- std::stringstream ss;\n- ss << \"int_comp\" << i;\n- int_comp_names.push_back(ss.str());\n+ int_comp_names.push_back(getDefaultCompNameInt<ParticleType>(i));\n }\n \n WriteBinaryParticleData(dir, name, write_real_comp, write_int_comp,\n@@ -182,9 +174,7 @@ ParticleContainer_impl<ParticleType, NArrayReal, NArrayInt, Allocator, CellAssig\n Vector<std::string> int_comp_names;\n for (int i = 0; i < NStructInt + NumIntComps(); ++i )\n {\n- std::stringstream ss;\n- ss << \"int_comp\" << i;\n- int_comp_names.push_back(ss.str());\n+ int_comp_names.push_back(getDefaultCompNameInt<ParticleType>(i));\n }\n \n WriteBinaryParticleData(dir, name,\n@@ -211,20 +201,16 @@ ParticleContainer_impl<ParticleType, NArrayReal, NArrayInt, Allocator, CellAssig\n AMREX_ASSERT(write_int_comp.size() == NStructInt + NArrayInt );\n \n Vector<std::string> real_comp_names;\n- int nrc = ParticleType::is_soa_particle ? NStructReal + NumRealComps() - AMREX_SPACEDIM : NStructReal + NumRealComps();\n- for (int i = 0; i < nrc; ++i )\n+ int first_rcomp = ParticleType::is_soa_particle ? AMREX_SPACEDIM : 0;\n+ for (int i = first_rcomp; i < NStructReal + NumRealComps(); ++i )\n {\n- std::stringstream ss;\n- ss << \"real_comp\" << i;\n- real_comp_names.push_back(ss.str());\n+ real_comp_names.push_back(getDefaultCompNameReal<ParticleType>(i));\n }\n \n Vector<std::string> int_comp_names;\n for (int i = 0; i < NStructInt + NumIntComps(); ++i )\n {\n- std::stringstream ss;\n- ss << \"int_comp\" << i;\n- int_comp_names.push_back(ss.str());\n+ int_comp_names.push_back(getDefaultCompNameInt<ParticleType>(i));\n }\n \n WriteBinaryParticleData(dir, name, write_real_comp, write_int_comp,\n@@ -259,14 +245,12 @@ ParticleContainer_impl<ParticleType, NArrayReal, NArrayInt, Allocator, CellAssig\n {\n Vector<int> write_real_comp;\n Vector<std::string> real_comp_names;\n- int nrc = ParticleType::is_soa_particle ? NStructReal + NumRealComps() - AMREX_SPACEDIM : NStructReal + NumRealComps();\n \n- for (int i = 0; i < nrc; ++i )\n+ int first_rcomp = ParticleType::is_soa_particle ? AMREX_SPACEDIM : 0;\n+ for (int i = first_rcomp; i < NStructReal + NumRealComps(); ++i )\n {\n write_real_comp.push_back(1);\n- std::stringstream ss;\n- ss << \"real_comp\" << i;\n- real_comp_names.push_back(ss.str());\n+ real_comp_names.push_back(getDefaultCompNameReal<ParticleType>(i));\n }\n \n Vector<int> write_int_comp;\n@@ -274,9 +258,7 @@ ParticleContainer_impl<ParticleType, NArrayReal, NArrayInt, Allocator, CellAssig\n for (int i = 0; i < NStructInt + NumIntComps(); ++i )\n {\n write_int_comp.push_back(1);\n- std::stringstream ss;\n- ss << \"int_comp\" << i;\n- int_comp_names.push_back(ss.str());\n+ int_comp_names.push_back(getDefaultCompNameInt<ParticleType>(i));\n }\n \n WriteBinaryParticleData(dir, name, write_real_comp, write_int_comp,\n@@ -345,9 +327,7 @@ ParticleContainer_impl<ParticleType, NArrayReal, NArrayInt, Allocator, CellAssig\n Vector<std::string> int_comp_names;\n for (int i = 0; i < NStructInt + NumIntComps(); ++i )\n {\n- std::stringstream ss;\n- ss << \"int_comp\" << i;\n- int_comp_names.push_back(ss.str());\n+ int_comp_names.push_back(getDefaultCompNameInt<ParticleType>(i));\n }\n \n WriteBinaryParticleData(dir, name,\n@@ -374,20 +354,16 @@ ParticleContainer_impl<ParticleType, NArrayReal, NArrayInt, Allocator, CellAssig\n AMREX_ASSERT(write_int_comp.size() == NStructInt + NumIntComps() );\n \n Vector<std::string> real_comp_names;\n- int nrc = ParticleType::is_soa_particle ? NStructReal + NumRealComps() - AMREX_SPACEDIM : NStructReal + NumRealComps();\n- for (int i = 0; i < nrc; ++i )\n+ int first_rcomp = ParticleType::is_soa_particle ? AMREX_SPACEDIM : 0;\n+ for (int i = first_rcomp; i < NStructReal + NumRealComps(); ++i )\n {\n- std::stringstream ss;\n- ss << \"real_comp\" << i;\n- real_comp_names.push_back(ss.str());\n+ real_comp_names.push_back(getDefaultCompNameReal<ParticleType>(i));\n }\n \n Vector<std::string> int_comp_names;\n for (int i = 0; i < NStructInt + NumIntComps(); ++i )\n {\n- std::stringstream ss;\n- ss << \"int_comp\" << i;\n- int_comp_names.push_back(ss.str());\n+ int_comp_names.push_back(getDefaultCompNameInt<ParticleType>(i));\n }\n \n WriteBinaryParticleData(dir, name, write_real_comp, write_int_comp,\ndiff --git a/Src/Particle/AMReX_ParticleTile.H b/Src/Particle/AMReX_ParticleTile.H\nindex a645330e04a..7546ff8a216 100644\n--- a/Src/Particle/AMReX_ParticleTile.H\n+++ b/Src/Particle/AMReX_ParticleTile.H\n@@ -11,7 +11,10 @@\n #include <AMReX_RealVect.H>\n \n #include <array>\n+#include <string>\n #include <type_traits>\n+#include <vector>\n+\n \n namespace amrex {\n \n@@ -730,10 +733,15 @@ struct ParticleTile\n ParticleTile& operator= (ParticleTile &&) noexcept = default;\n #endif\n \n- void define (int a_num_runtime_real, int a_num_runtime_int)\n+ void define (\n+ int a_num_runtime_real,\n+ int a_num_runtime_int,\n+ std::vector<std::string>* soa_rdata_names=nullptr,\n+ std::vector<std::string>* soa_idata_names=nullptr\n+ )\n {\n m_defined = true;\n- GetStructOfArrays().define(a_num_runtime_real, a_num_runtime_int);\n+ GetStructOfArrays().define(a_num_runtime_real, a_num_runtime_int, soa_rdata_names, soa_idata_names);\n m_runtime_r_ptrs.resize(a_num_runtime_real);\n m_runtime_i_ptrs.resize(a_num_runtime_int);\n m_runtime_r_cptrs.resize(a_num_runtime_real);\ndiff --git a/Src/Particle/AMReX_ParticleUtil.H b/Src/Particle/AMReX_ParticleUtil.H\nindex b09f1d3583f..f6f2506ec7f 100644\n--- a/Src/Particle/AMReX_ParticleUtil.H\n+++ b/Src/Particle/AMReX_ParticleUtil.H\n@@ -883,6 +883,26 @@ void PermutationForDeposition (Gpu::DeviceVector<index_type>& perm, index_type n\n });\n }\n \n+template <typename P>\n+std::string getDefaultCompNameReal (const int i) {\n+ int first_r_name = 0;\n+ if constexpr (P::is_soa_particle) {\n+ if (i < AMREX_SPACEDIM) {\n+ constexpr int x_in_ascii = 120;\n+ std::string const name{char(x_in_ascii+i)};\n+ return name;\n+ }\n+ first_r_name = AMREX_SPACEDIM;\n+ }\n+ std::string const name{(\"real_comp\" + std::to_string(i-first_r_name))};\n+ return name;\n+}\n+\n+template <typename P>\n+std::string getDefaultCompNameInt (const int i) {\n+ std::string const name{(\"int_comp\" + std::to_string(i))};\n+ return name;\n+}\n \n #ifdef AMREX_USE_HDF5_ASYNC\n void async_vol_es_wait_particle();\ndiff --git a/Src/Particle/AMReX_StructOfArrays.H b/Src/Particle/AMReX_StructOfArrays.H\nindex 4de35e085ca..201cf340dc1 100644\n--- a/Src/Particle/AMReX_StructOfArrays.H\n+++ b/Src/Particle/AMReX_StructOfArrays.H\n@@ -6,7 +6,11 @@\n #include <AMReX_Vector.H>\n #include <AMReX_GpuContainers.H>\n \n+#include <algorithm>\n #include <array>\n+#include <string>\n+#include <vector>\n+\n \n namespace amrex {\n \n@@ -19,11 +23,18 @@ struct StructOfArrays {\n using RealVector = amrex::PODVector<ParticleReal, Allocator<ParticleReal> >;\n using IntVector = amrex::PODVector<int, Allocator<int> >;\n \n- void define (int a_num_runtime_real, int a_num_runtime_int)\n+ void define (\n+ int a_num_runtime_real,\n+ int a_num_runtime_int,\n+ std::vector<std::string>* soa_rdata_names=nullptr,\n+ std::vector<std::string>* soa_idata_names=nullptr\n+ )\n {\n m_defined = true;\n m_runtime_rdata.resize(a_num_runtime_real);\n m_runtime_idata.resize(a_num_runtime_int );\n+ m_rdata_names = soa_rdata_names;\n+ m_idata_names = soa_idata_names;\n }\n \n [[nodiscard]] int NumRealComps () const noexcept { return NReal + m_runtime_rdata.size(); }\n@@ -79,6 +90,32 @@ struct StructOfArrays {\n }\n }\n \n+ /** Get access to a particle Real component Array (compile-time and runtime component)\n+ *\n+ * @param name named component component with 0...NReal-1 compile-time and NReal... runtime arguments\n+ */\n+ [[nodiscard]] RealVector& GetRealData (std::string const & name) {\n+ AMREX_ALWAYS_ASSERT_WITH_MESSAGE(m_rdata_names != nullptr, \"SoA Real names were not defined.\");\n+ auto const pos = std::find(m_rdata_names->begin(), m_rdata_names->end(), name);\n+ AMREX_ALWAYS_ASSERT_WITH_MESSAGE(pos != m_rdata_names->end(), \"Soa Real name='\" + name + \"' was not found components\");\n+\n+ int const index = std::distance(m_rdata_names->begin(), pos);\n+ return GetRealData(index);\n+ }\n+\n+ /** Get access to a particle Real component Array (compile-time and runtime component)\n+ *\n+ * @param name named component component with 0...NReal-1 compile-time and NReal... runtime arguments\n+ */\n+ [[nodiscard]] const RealVector& GetRealData (std::string const & name) const {\n+ AMREX_ALWAYS_ASSERT_WITH_MESSAGE(m_rdata_names != nullptr, \"SoA Real names were not defined.\");\n+ auto const pos = std::find(m_rdata_names->begin(), m_rdata_names->end(), name);\n+ AMREX_ALWAYS_ASSERT_WITH_MESSAGE(pos != m_rdata_names->end(), \"Soa Real name='\" + name + \"' was not found components\");\n+\n+ int const index = std::distance(m_rdata_names->begin(), pos);\n+ return GetRealData(index);\n+ }\n+\n /** Get access to a particle Int component Array (compile-time and runtime component)\n *\n * @param index component with 0...NInt-1 compile-time and NInt... runtime arguments\n@@ -118,6 +155,34 @@ struct StructOfArrays {\n }\n }\n \n+ /** Get access to a particle Int component Array (compile-time and runtime component)\n+ *\n+ * @param index component with 0...NInt-1 compile-time and NInt... runtime arguments\n+ * @return\n+ */\n+ [[nodiscard]] IntVector& GetIntData (std::string const & name) {\n+ AMREX_ALWAYS_ASSERT_WITH_MESSAGE(m_idata_names != nullptr, \"SoA Int names were not defined.\");\n+ auto const pos = std::find(m_idata_names->begin(), m_idata_names->end(), name);\n+ AMREX_ALWAYS_ASSERT_WITH_MESSAGE(pos != m_idata_names->end(), \"Soa Int name='\" + name + \"' was not found components\");\n+\n+ int const index = std::distance(m_idata_names->begin(), pos);\n+ return GetIntData(index);\n+ }\n+\n+ /** Get access to a particle Int component Array (compile-time and runtime component)\n+ *\n+ * @param index component with 0...NInt-1 compile-time and NInt... runtime arguments\n+ * @return\n+ */\n+ [[nodiscard]] const IntVector& GetIntData (std::string const & name) const {\n+ AMREX_ALWAYS_ASSERT_WITH_MESSAGE(m_idata_names != nullptr, \"SoA Int names were not defined.\");\n+ auto const pos = std::find(m_idata_names->begin(), m_idata_names->end(), name);\n+ AMREX_ALWAYS_ASSERT_WITH_MESSAGE(pos != m_idata_names->end(), \"Soa Int name='\" + name + \"' was not found components\");\n+\n+ int const index = std::distance(m_idata_names->begin(), pos);\n+ return GetIntData(index);\n+ }\n+\n /**\n * \\brief Returns the total number of particles (real and neighbor)\n *\n@@ -226,13 +291,20 @@ struct StructOfArrays {\n int m_num_neighbor_particles{0};\n \n private:\n+ // compile-time data\n IdCPU m_idcpu;\n std::array<RealVector, NReal> m_rdata;\n std::array< IntVector, NInt> m_idata;\n \n+ // runtime data\n std::vector<RealVector> m_runtime_rdata;\n std::vector<IntVector > m_runtime_idata;\n \n+ // names of both compile-time and runtime Real and Int data\n+ std::vector<std::string>* m_rdata_names = nullptr;\n+ std::vector<std::string>* m_idata_names = nullptr;\n+\n+ //! whether the runtime components are sized correctly\n bool m_defined{false};\n };\n \n"}, "test": {"test_patch": "diff --git a/Tests/Particles/NamedSoAComponents/CMakeLists.txt b/Tests/Particles/NamedSoAComponents/CMakeLists.txt\nnew file mode 100644\nindex 00000000000..e14ddd68975\n--- /dev/null\n+++ b/Tests/Particles/NamedSoAComponents/CMakeLists.txt\n@@ -0,0 +1,10 @@\n+foreach(D IN LISTS AMReX_SPACEDIM)\n+ set(_sources main.cpp)\n+ #set(_input_files)\n+ #set(_input_files inputs)\n+\n+ setup_test(${D} _sources _input_files NTHREADS 2)\n+\n+ unset(_sources)\n+ unset(_input_files)\n+endforeach()\ndiff --git a/Tests/Particles/NamedSoAComponents/GNUmakefile b/Tests/Particles/NamedSoAComponents/GNUmakefile\nnew file mode 100644\nindex 00000000000..9f49d3ec029\n--- /dev/null\n+++ b/Tests/Particles/NamedSoAComponents/GNUmakefile\n@@ -0,0 +1,22 @@\n+AMREX_HOME = ../../../\n+\n+DEBUG\t= FALSE\n+\n+DIM\t= 3\n+\n+COMP = gcc\n+\n+USE_MPI = TRUE\n+USE_OMP = FALSE\n+USE_CUDA = FALSE\n+\n+#TINY_PROFILE = TRUE\n+USE_PARTICLES = TRUE\n+\n+include $(AMREX_HOME)/Tools/GNUMake/Make.defs\n+\n+include ./Make.package\n+include $(AMREX_HOME)/Src/Base/Make.package\n+include $(AMREX_HOME)/Src/Particle/Make.package\n+\n+include $(AMREX_HOME)/Tools/GNUMake/Make.rules\ndiff --git a/Tests/Particles/NamedSoAComponents/Make.package b/Tests/Particles/NamedSoAComponents/Make.package\nnew file mode 100644\nindex 00000000000..6b4b865e8fc\n--- /dev/null\n+++ b/Tests/Particles/NamedSoAComponents/Make.package\n@@ -0,0 +1,1 @@\n+CEXE_sources += main.cpp\ndiff --git a/Tests/Particles/NamedSoAComponents/main.cpp b/Tests/Particles/NamedSoAComponents/main.cpp\nnew file mode 100644\nindex 00000000000..39b6a70ff52\n--- /dev/null\n+++ b/Tests/Particles/NamedSoAComponents/main.cpp\n@@ -0,0 +1,139 @@\n+#include <AMReX.H>\n+#include <AMReX_Particle.H>\n+#include <AMReX_ParticleContainer.H>\n+#include <AMReX_ParticleTile.H>\n+#include <AMReX_ParIter.H>\n+#include <AMReX_REAL.H>\n+#include <AMReX_Vector.H>\n+#include <AMReX_GpuContainers.H>\n+\n+#include <array>\n+\n+using namespace amrex;\n+\n+void addParticles ()\n+{\n+ using PC = ParticleContainerPureSoA<AMREX_SPACEDIM+1, 2>;\n+ int is_per[AMREX_SPACEDIM];\n+ for (int & d : is_per) {\n+ d = 1;\n+ }\n+\n+ RealBox real_box;\n+ for (int n = 0; n < AMREX_SPACEDIM; n++)\n+ {\n+ real_box.setLo(n, 0.0);\n+ real_box.setHi(n, 100.0);\n+ }\n+\n+ IntVect domain_lo(AMREX_D_DECL(0, 0, 0));\n+ IntVect domain_hi(AMREX_D_DECL(127, 127, 127));\n+ const Box base_domain(domain_lo, domain_hi);\n+\n+ Geometry geom(base_domain, &real_box, CoordSys::cartesian, is_per);\n+ BoxArray ba(base_domain);\n+ ba.maxSize(64);\n+\n+ DistributionMapping dm(ba);\n+\n+ PC pc(geom, dm, ba);\n+\n+ amrex::Print() << \"Original Real SoA component names are: \";\n+ for (auto& n : pc.GetRealSoANames()) {\n+ amrex::Print() << n << \", \";\n+ }\n+ amrex::Print() << \"\\n\";\n+\n+ amrex::Print() << \"Original Int SoA component names are: \";\n+ for (auto& n : pc.GetIntSoANames()) {\n+ amrex::Print() << n << \", \";\n+ }\n+ amrex::Print() << \"\\n\";\n+\n+ amrex::Print() << \"Adding runtime comps. \\n\";\n+ pc.AddRealComp(\"real_comp1\");\n+ pc.AddRealComp(); // without name - should be real_comp2\n+ pc.AddIntComp(); // without name - should be int_comp0\n+\n+ amrex::Print() << \"New Real SoA component names are: \";\n+ for (auto& n : pc.GetRealSoANames()) {\n+ amrex::Print() << n << \", \";\n+ }\n+ amrex::Print() << \"\\n\";\n+\n+ amrex::Print() << \"New Int SoA component names are: \";\n+ for (auto& n : pc.GetIntSoANames()) {\n+ amrex::Print() << n << \", \";\n+ }\n+ amrex::Print() << \"\\n\";\n+\n+ amrex::Print() << \"Reset compile-time SoA names \\n\";\n+ pc.SetSoACompileTimeNames({AMREX_D_DECL(\"x\", \"y\", \"z\"), \"w\"}, {\"i1\", \"i2\"});\n+\n+ amrex::Print() << \"New Real SoA component names are: \";\n+ for (auto& n : pc.GetRealSoANames()) {\n+ amrex::Print() << n << \", \";\n+ }\n+ amrex::Print() << \"\\n\";\n+\n+ amrex::Print() << \"New Int SoA component names are: \";\n+ for (auto& n : pc.GetIntSoANames()) {\n+ amrex::Print() << n << \", \";\n+ }\n+ amrex::Print() << \"\\n\";\n+\n+ int const NArrayReal = PC::NArrayReal;\n+ int const NArrayInt = PC::NArrayInt;\n+ using ParticleType = typename PC::ParticleType;\n+\n+ const int add_num_particles = 5;\n+ auto& ptile1 = pc.DefineAndReturnParticleTile(0, 0, 0);\n+ ptile1.resize(add_num_particles);\n+\n+ for (int i = 0; i < add_num_particles; ++i)\n+ {\n+ for (int d = 0; d < AMREX_SPACEDIM; d++) {\n+ ptile1.pos(i, d) = 12.0;\n+ }\n+ ptile1.getParticleTileData().rdata(AMREX_SPACEDIM)[i] = 1.2; // w\n+\n+ ptile1.push_back_int(0, int(ParticleType::NextID()));\n+ ptile1.push_back_int(1, amrex::ParallelDescriptor::MyProc());\n+ }\n+\n+ int lev=0;\n+ using MyParIter = ParIter_impl<ParticleType, NArrayReal, NArrayInt>;\n+ for (MyParIter pti(pc, lev); pti.isValid(); ++pti) {\n+ auto& soa = pti.GetStructOfArrays();\n+ AMREX_D_TERM(\n+ auto *xp = soa.GetRealData(\"x\").data();,\n+ auto *yp = soa.GetRealData(\"y\").data();,\n+ auto *zp = soa.GetRealData(\"z\").data();\n+ );\n+ auto *wp = soa.GetRealData(\"w\").data();\n+\n+ const int np = pti.numParticles();\n+ ParallelFor( np, [=] AMREX_GPU_DEVICE (long ip)\n+ {\n+ AMREX_D_TERM(\n+ AMREX_ALWAYS_ASSERT_WITH_MESSAGE(xp[ip] == 12_prt,\n+ \"pos attribute expected to be 12\");,\n+ AMREX_ALWAYS_ASSERT_WITH_MESSAGE(yp[ip] == 12_prt,\n+ \"pos attribute expected to be 12\");,\n+ AMREX_ALWAYS_ASSERT_WITH_MESSAGE(zp[ip] == 12_prt,\n+ \"pos attribute expected to be 12\");\n+ );\n+ AMREX_ALWAYS_ASSERT_WITH_MESSAGE(wp[ip] == 1.2_prt,\n+ \"pos attribute expected to be 1.2\");\n+ });\n+ }\n+}\n+\n+int main (int argc, char* argv[])\n+ {\n+ amrex::Initialize(argc,argv);\n+ {\n+ addParticles();\n+ }\n+ amrex::Finalize();\n+ }\n", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}58{"question_id": "MSB_AMReX-Codes_amrex_pr4526", "question_type": "multi_swe_bench", "description": "Reduce use of SuperParticle (AMReX-Codes/amrex#4526)", "content": {"org": "AMReX-Codes", "repo": "amrex", "pr_number": 4526, "issue_title": "Reduce use of SuperParticle", "issue_body": "## Summary\r\n\r\nIn preparation of\u00a0#4404, this PR reduces the reliance of SuperParticle. The issue with\u00a0getSuperParticle is that the compiler is instructed to read in all the data of the particle into registers even if most of it is not needed. Additionally, runtime data is not accessible through SuperParticle.\r\n\r\n## Additional background\r\n\r\nThe previous version of packIOData with RunOnGpu had a bug when some particles were invalid.\r\n\r\n## Checklist\r\n\r\nThe proposed changes:\r\n- [x] fix a bug or incorrect behavior in AMReX\r\n- [ ] add new capabilities to AMReX\r\n- [ ] changes answers in the test suite to more than roundoff level\r\n- [ ] are likely to significantly affect the results of downstream AMReX users\r\n- [ ] include documentation in the code and/or rst files, if appropriate\r\n", "base_commit": "449ff2f7a8f2497c3364d1c8439a8a04ebe170fa", "resolved_issues": [{"number": 4404, "title": "[WIP] Add simpler version of ParticleTile using 2D array", "body": "## Summary\r\n\r\nThis PR aims to explore adding a simpler version of ParticleTile #3570 \r\n\r\nIt already assumes that a tile only has runtime components and always has a polymorphic arena allocator as described in #4380. To avoid the array of pointer style of the current particle tile, here a 2D array over particle ids and component ids is used. As a simplification both AoS and SoA members have been removed as well as all the push_back functions.\r\n\r\nPerformance test with HiPACE++:\r\n\r\ndev, ParticleContainerPureSoA<11, 1>\r\n```\r\nTinyProfiler total time across processes [min...avg...max]: 21.44 ... 21.44 ... 21.44\r\nTinyProfiler total time across processes [min...avg...max]: 21.42 ... 21.42 ... 21.42\r\nTinyProfiler total time across processes [min...avg...max]: 21.4 ... 21.4 ... 21.4\r\nTinyProfiler total time across processes [min...avg...max]: 21.43 ... 21.43 ... 21.43\r\nTinyProfiler total time across processes [min...avg...max]: 21.39 ... 21.39 ... 21.39\r\n```\r\nParticleContainerPureSoA<0, 0> using only runtime components\r\n```\r\nTinyProfiler total time across processes [min...avg...max]: 21.93 ... 21.93 ... 21.93\r\nTinyProfiler total time across processes [min...avg...max]: 22.05 ... 22.05 ... 22.05\r\nTinyProfiler total time across processes [min...avg...max]: 21.95 ... 21.95 ... 21.95\r\nTinyProfiler total time across processes [min...avg...max]: 21.96 ... 21.96 ... 21.96\r\nTinyProfiler total time across processes [min...avg...max]: 21.94 ... 21.94 ... 21.94\r\n\r\n```\r\nthis PR, ParticleContainerPureSoA2<amrex::Real, int>\r\n```\r\nTinyProfiler total time across processes [min...avg...max]: 21.4 ... 21.4 ... 21.4\r\nTinyProfiler total time across processes [min...avg...max]: 21.38 ... 21.38 ... 21.38\r\nTinyProfiler total time across processes [min...avg...max]: 21.4 ... 21.4 ... 21.4\r\nTinyProfiler total time across processes [min...avg...max]: 21.44 ... 21.44 ... 21.44\r\nTinyProfiler total time across processes [min...avg...max]: 21.38 ... 21.38 ... 21.38\r\n```\r\n\r\n\r\n\r\n## Additional background\r\n\r\nParticleReal and int are replaced with template types to make implementing the const versions easier and to allow for more flexibility in the future (use double and float in the same application, use double2 or float4, use 64 bit int etc).\r\n\r\n## Checklist\r\n\r\nThe proposed changes:\r\n- [ ] fix a bug or incorrect behavior in AMReX\r\n- [ ] add new capabilities to AMReX\r\n- [ ] changes answers in the test suite to more than roundoff level\r\n- [ ] are likely to significantly affect the results of downstream AMReX users\r\n- [ ] include documentation in the code and/or rst files, if appropriate\r\n"}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/amrex-codes_m_amrex:pr-4526", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/.github/workflows/gcc.yml b/.github/workflows/gcc.yml\nindex 3249c6eacd5..0e19117ded1 100644\n--- a/.github/workflows/gcc.yml\n+++ b/.github/workflows/gcc.yml\n@@ -376,7 +376,7 @@ jobs:\n # /home/runner/work/amrex/amrex/Src/Base/AMReX_IntVect.H:194:92: error: array subscript -1 is below array bounds of \u2018int [3]\u2019 [-Werror=array-bounds]\n # int& operator[] (int i) noexcept { BL_ASSERT(i>=0 && i < AMREX_SPACEDIM); return vect[i]; }\n #\n- env: {CXXFLAGS: \"-fno-operator-names -Werror -Wall -Wextra -Wpedantic -Wnull-dereference -Wfloat-conversion -Wshadow -Woverloaded-virtual -Wunreachable-code -Wnon-virtual-dtor -Wlogical-op -Wmisleading-indentation -Wduplicated-cond -Wduplicated-branches -Wmissing-include-dirs -Wno-array-bounds\"}\n+ env: {CXXFLAGS: \"-fno-operator-names -Werror -Wall -Wextra -Wpedantic -Wfloat-conversion -Wshadow -Woverloaded-virtual -Wunreachable-code -Wnon-virtual-dtor -Wlogical-op -Wmisleading-indentation -Wduplicated-cond -Wduplicated-branches -Wmissing-include-dirs -Wno-array-bounds\"}\n run: |\n export CCACHE_COMPRESS=1\n export CCACHE_COMPRESSLEVEL=10\ndiff --git a/Src/Extern/HDF5/AMReX_ParticleHDF5.H b/Src/Extern/HDF5/AMReX_ParticleHDF5.H\nindex 29747ea9d76..b51e3638fb5 100644\n--- a/Src/Extern/HDF5/AMReX_ParticleHDF5.H\n+++ b/Src/Extern/HDF5/AMReX_ParticleHDF5.H\n@@ -66,9 +66,9 @@ ParticleContainer_impl<ParticleType, NArrayReal, NArrayInt, Allocator, CellAssig\n WriteHDF5ParticleData(dir, name, write_real_comp, write_int_comp,\n tmp_real_comp_names, tmp_int_comp_names,\n compression,\n- [=] AMREX_GPU_HOST_DEVICE (const SuperParticleType& p) -> int\n+ [=] AMREX_GPU_HOST_DEVICE (const ConstPTDType& ptd, int i) -> int\n {\n- return p.id() > 0;\n+ return ptd.id(i) > 0;\n }, true);\n }\n \n@@ -102,9 +102,9 @@ ParticleContainer_impl<ParticleType, NArrayReal, NArrayInt, Allocator, CellAssig\n WriteHDF5ParticleData(dir, name, write_real_comp, write_int_comp,\n real_comp_names, int_comp_names,\n compression,\n- [=] AMREX_GPU_HOST_DEVICE (const SuperParticleType& p) -> int\n+ [=] AMREX_GPU_HOST_DEVICE (const ConstPTDType& ptd, int i) -> int\n {\n- return p.id() > 0;\n+ return ptd.id(i) > 0;\n });\n }\n \n@@ -138,9 +138,9 @@ ParticleContainer_impl<ParticleType, NArrayReal, NArrayInt, Allocator, CellAssig\n WriteHDF5ParticleData(dir, name, write_real_comp, write_int_comp,\n real_comp_names, int_comp_names,\n compression,\n- [=] AMREX_GPU_HOST_DEVICE (const SuperParticleType& p)\n+ [=] AMREX_GPU_HOST_DEVICE (const ConstPTDType& ptd, int i)\n {\n- return p.id() > 0;\n+ return ptd.id(i) > 0;\n });\n }\n \n@@ -166,9 +166,9 @@ ParticleContainer_impl<ParticleType, NArrayReal, NArrayInt, Allocator, CellAssig\n write_real_comp, write_int_comp,\n real_comp_names, int_comp_names,\n compression,\n- [=] AMREX_GPU_HOST_DEVICE (const SuperParticleType& p)\n+ [=] AMREX_GPU_HOST_DEVICE (const ConstPTDType& ptd, int i)\n {\n- return p.id() > 0;\n+ return ptd.id(i) > 0;\n });\n }\n \n@@ -200,9 +200,9 @@ ParticleContainer_impl<ParticleType, NArrayReal, NArrayInt, Allocator, CellAssig\n write_real_comp, write_int_comp,\n real_comp_names, int_comp_names,\n compression,\n- [=] AMREX_GPU_HOST_DEVICE (const ParticleType& p)\n+ [=] AMREX_GPU_HOST_DEVICE (const ConstPTDType& ptd, int i)\n {\n- return p.id() > 0;\n+ return ptd.id(i) > 0;\n });\n }\n \n@@ -238,9 +238,9 @@ ParticleContainer_impl<ParticleType, NArrayReal, NArrayInt, Allocator, CellAssig\n WriteHDF5ParticleData(dir, name, write_real_comp, write_int_comp,\n real_comp_names, int_comp_names,\n compression,\n- [=] AMREX_GPU_HOST_DEVICE (const SuperParticleType& p)\n+ [=] AMREX_GPU_HOST_DEVICE (const ConstPTDType& ptd, int i)\n {\n- return p.id() > 0;\n+ return ptd.id(i) > 0;\n });\n }\n \n@@ -261,9 +261,9 @@ WritePlotFileHDF5 (const std::string& dir, const std::string& name,\n write_real_comp, write_int_comp,\n real_comp_names, int_comp_names,\n compression,\n- [=] AMREX_GPU_HOST_DEVICE (const SuperParticleType& p)\n+ [=] AMREX_GPU_HOST_DEVICE (const ConstPTDType& ptd, int i)\n {\n- return p.id() > 0;\n+ return ptd.id(i) > 0;\n });\n }\n \ndiff --git a/Src/Particle/AMReX_Particle.H b/Src/Particle/AMReX_Particle.H\nindex 51303ae4161..098fdfb7b7a 100644\n--- a/Src/Particle/AMReX_Particle.H\n+++ b/Src/Particle/AMReX_Particle.H\n@@ -337,6 +337,7 @@ struct alignas(sizeof(double)) Particle\n \n //! The floating point type used for the particles.\n using RealType = ParticleReal;\n+ using IntType = int;\n \n static Long the_next_id;\n \n@@ -366,6 +367,12 @@ struct alignas(sizeof(double)) Particle\n #endif\n }\n \n+ [[nodiscard]] AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE\n+ uint64_t& idcpu () & { return this->m_idcpu; }\n+\n+ [[nodiscard]] AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE\n+ const uint64_t& idcpu () const & { return this->m_idcpu; }\n+\n [[nodiscard]] AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE\n RealVect pos () const & {return RealVect(AMREX_D_DECL(this->m_pos[0], this->m_pos[1], this->m_pos[2]));}\n \ndiff --git a/Src/Particle/AMReX_ParticleContainer.H b/Src/Particle/AMReX_ParticleContainer.H\nindex 449b1c85409..3baafe1d34e 100644\n--- a/Src/Particle/AMReX_ParticleContainer.H\n+++ b/Src/Particle/AMReX_ParticleContainer.H\n@@ -185,6 +185,8 @@ public:\n //! A single level worth of particles is indexed (grid id, tile id)\n //! for both SoA and AoS data.\n using ParticleLevel = std::map<std::pair<int, int>, ParticleTileType>;\n+ using PTDType = typename ParticleTileType::ParticleTileDataType;\n+ using ConstPTDType = typename ParticleTileType::ConstParticleTileDataType;\n using AoS = typename ParticleTileType::AoS;\n using SoA = typename ParticleTileType::SoA;\n \ndiff --git a/Src/Particle/AMReX_ParticleContainerI.H b/Src/Particle/AMReX_ParticleContainerI.H\nindex 7b200bedb75..1d90fde2c76 100644\n--- a/Src/Particle/AMReX_ParticleContainerI.H\n+++ b/Src/Particle/AMReX_ParticleContainerI.H\n@@ -954,42 +954,47 @@ ParticleContainer_impl<ParticleType, NArrayReal, NArrayInt, Allocator, CellAssig\n auto dst = virts.getParticleTileData();\n ParallelFor(bx, [=] AMREX_GPU_DEVICE(int i, int j, int k)\n {\n- if(imf_arr(i,j,k,0)!=0)\n- {\n- SuperParticleType p;\n- p.cpu() = 0;\n- p.id() = LongParticleIds::VirtualParticleID;\n-\n- //Set rdata(0) first so we can normalize the weighted fields\n- p.rdata(0) = static_cast<ParticleReal>(partData(i,j,k,AMREX_SPACEDIM));\n- //Set pos with the normalized weighted field\n- for (int n = 0; n < AMREX_SPACEDIM; ++n)\n- {\n- p.pos(n) = static_cast<ParticleReal>(partData(i,j,k,n) / p.rdata(0));\n- }\n- //Set rdata(n>0) with the normalized weighted field for NStructReal\n- for (int n = 1; n < NStructReal; ++n)\n- {\n- p.rdata(n) = static_cast<ParticleReal>(partData(i,j,k,AMREX_SPACEDIM+n) / p.rdata(0));\n- }\n- //Set rdata(n>0) with the normalized weighted field for NArrayReal\n- for (int n = 0; n < NArrayReal; ++n)\n- {\n- p.rdata(NStructReal+n) = static_cast<ParticleReal>(partData(i,j,k,AMREX_SPACEDIM+NStructReal+n));\n- }\n- //Set idata with the \"first\" particles idata field for NStructInt\n- for (int n = 0; n < NStructInt; ++n)\n- {\n- p.idata(n) = imf_arr(i,j,k,1+n);\n- }\n- //Set idata with the \"first\" particles idata field for NArrayInt\n- for (int n = 0; n < NArrayInt; ++n)\n- {\n- p.idata(NStructInt+n) = imf_arr(i,j,k,1+NStructInt+n);\n- }\n- //Set the new particle in dst tile\n- dst.setSuperParticle(p, last_offset+offsets_ptr[((i-imf_arr.begin.x)+(j-imf_arr.begin.y)*imf_arr.jstride+(k-imf_arr.begin.z)*imf_arr.kstride)]);\n- }\n+ if(imf_arr(i,j,k,0)!=0)\n+ {\n+ const auto idx = last_offset + offsets_ptr[\n+ ((i-imf_arr.begin.x)\n+ +(j-imf_arr.begin.y)*imf_arr.jstride\n+ +(k-imf_arr.begin.z)*imf_arr.kstride)\n+ ];\n+\n+ dst.cpu(idx) = 0;\n+ dst.id(idx) = LongParticleIds::VirtualParticleID;\n+\n+ auto& p = dst[idx];\n+ //Set rdata(0) first so we can normalize the weighted fields\n+ //Note that this does not work for soa PC\n+ p.rdata(0) = static_cast<ParticleReal>(partData(i,j,k,AMREX_SPACEDIM));;\n+ //Set pos with the normalized weighted field\n+ for (int n = 0; n < AMREX_SPACEDIM; ++n)\n+ {\n+ p.pos(n) = static_cast<ParticleReal>(partData(i,j,k,n) / p.rdata(0));\n+ }\n+ //Set rdata(n>0) with the normalized weighted field for NStructReal\n+ for (int n = 1; n < NStructReal; ++n)\n+ {\n+ p.rdata(n) = static_cast<ParticleReal>(partData(i,j,k,AMREX_SPACEDIM+n) / p.rdata(0));\n+ }\n+ //Set rdata(n>0) with the normalized weighted field for NArrayReal\n+ for (int n = 0; n < NArrayReal; ++n)\n+ {\n+ dst.rdata(n)[idx] = static_cast<ParticleReal>(partData(i,j,k,AMREX_SPACEDIM+NStructReal+n));\n+ }\n+ //Set idata with the \"first\" particles idata field for NStructInt\n+ for (int n = 0; n < NStructInt; ++n)\n+ {\n+ p.idata(n) = imf_arr(i,j,k,1+n);\n+ }\n+ //Set idata with the \"first\" particles idata field for NArrayInt\n+ for (int n = 0; n < NArrayInt; ++n)\n+ {\n+ dst.idata(n)[idx] = imf_arr(i,j,k,1+NStructInt+n);\n+ }\n+ }\n \n });\n last_offset+=next_offset;\ndiff --git a/Src/Particle/AMReX_ParticleReduce.H b/Src/Particle/AMReX_ParticleReduce.H\nindex db2bb6ea3e2..50002e29327 100644\n--- a/Src/Particle/AMReX_ParticleReduce.H\n+++ b/Src/Particle/AMReX_ParticleReduce.H\n@@ -66,18 +66,18 @@ auto call_f (F const& f,\n * return p.idata(0);\n * });\n *\n- * using PTDType = typename PC::ParticleTileType::ConstParticleTileDataType;\n+ * using ConstPTDType = typename PC::ConstPTDType;\n * auto sm = amrex::ReduceSum(pc,\n- * [=] AMREX_GPU_HOST_DEVICE (const PTDType& ptd, const int i) -> ParticleReal\n+ * [=] AMREX_GPU_HOST_DEVICE (const ConstPTDType& ptd, const int i) -> ParticleReal\n * {\n- * return ptd.m_aos[i].rdata(0);\n+ * return ptd.rdata(0)[i];\n * });\n *\n */\n template <class PC, class F, std::enable_if_t<IsParticleContainer<PC>::value, int> foo = 0>\n auto\n ReduceSum (PC const& pc, F&& f)\n- -> decltype(particle_detail::call_f(f, typename PC::ParticleTileType::ConstParticleTileDataType(), int()))\n+ -> decltype(particle_detail::call_f(f, typename PC::ConstPTDType(), int()))\n {\n return ReduceSum(pc, 0, pc.finestLevel(), std::forward<F>(f));\n }\n@@ -114,18 +114,18 @@ ReduceSum (PC const& pc, F&& f)\n * return p.idata(0);\n * });\n *\n- * using PTDType = typename PC::ParticleTileType::ConstParticleTileDataType;\n+ * using ConstPTDType = typename PC::ConstPTDType;\n * auto sm = amrex::ReduceSum(pc,\n- * [=] AMREX_GPU_HOST_DEVICE (const PTDType& ptd, const int i) -> ParticleReal\n+ * [=] AMREX_GPU_HOST_DEVICE (const ConstPTDType& ptd, const int i) -> ParticleReal\n * {\n- * return ptd.m_aos[i].rdata(0);\n+ * return ptd.rdata(0)[i];\n * });\n *\n */\n template <class PC, class F, std::enable_if_t<IsParticleContainer<PC>::value, int> foo = 0>\n auto\n ReduceSum (PC const& pc, int lev, F&& f)\n- -> decltype(particle_detail::call_f(f, typename PC::ParticleTileType::ConstParticleTileDataType(), int()))\n+ -> decltype(particle_detail::call_f(f, typename PC::ConstPTDType(), int()))\n {\n return ReduceSum(pc, lev, lev, std::forward<F>(f));\n }\n@@ -163,20 +163,20 @@ ReduceSum (PC const& pc, int lev, F&& f)\n * return p.idata(0);\n * });\n *\n- * using PTDType = typename PC::ParticleTileType::ConstParticleTileDataType;\n+ * using ConstPTDType = typename PC::ConstPTDType;\n * auto sm = amrex::ReduceSum(pc,\n- * [=] AMREX_GPU_HOST_DEVICE (const PTDType& ptd, const int i) -> ParticleReal\n+ * [=] AMREX_GPU_HOST_DEVICE (const ConstPTDType& ptd, const int i) -> ParticleReal\n * {\n- * return ptd.m_aos[i].rdata(0);\n+ * return ptd.rdata(0)[i];\n * });\n *\n */\n template <class PC, class F, std::enable_if_t<IsParticleContainer<PC>::value, int> foo = 0>\n auto\n ReduceSum (PC const& pc, int lev_min, int lev_max, F const& f)\n- -> decltype(particle_detail::call_f(f, typename PC::ParticleTileType::ConstParticleTileDataType(), int()))\n+ -> decltype(particle_detail::call_f(f, typename PC::ConstPTDType(), int()))\n {\n- using value_type = decltype(particle_detail::call_f(f, typename PC::ParticleTileType::ConstParticleTileDataType(), int()));\n+ using value_type = decltype(particle_detail::call_f(f, typename PC::ConstPTDType(), int()));\n value_type sm = 0;\n \n #ifdef AMREX_USE_GPU\n@@ -266,18 +266,18 @@ ReduceSum (PC const& pc, int lev_min, int lev_max, F const& f)\n * return p.idata(0);\n * });\n *\n- * using PTDType = typename PC::ParticleTileType::ConstParticleTileDataType;\n+ * using ConstPTDType = typename PC::ConstPTDType;\n * auto mx = amrex::ReduceMax(pc,\n- * [=] AMREX_GPU_HOST_DEVICE (const PTDType& ptd, const int i) -> ParticleReal\n+ * [=] AMREX_GPU_HOST_DEVICE (const ConstPTDType& ptd, const int i) -> ParticleReal\n * {\n- * return ptd.m_aos[i].rdata(0);\n+ * return ptd.rdata(0)[i];\n * });\n *\n */\n template <class PC, class F, std::enable_if_t<IsParticleContainer<PC>::value, int> foo = 0>\n auto\n ReduceMax (PC const& pc, F&& f)\n- -> decltype(particle_detail::call_f(f, typename PC::ParticleTileType::ConstParticleTileDataType(), int()))\n+ -> decltype(particle_detail::call_f(f, typename PC::ConstPTDType(), int()))\n {\n return ReduceMax(pc, 0, pc.finestLevel(), std::forward<F>(f));\n }\n@@ -314,18 +314,18 @@ ReduceMax (PC const& pc, F&& f)\n * return p.idata(0);\n * });\n *\n- * using PTDType = typename PC::ParticleTileType::ConstParticleTileDataType;\n+ * using ConstPTDType = typename PC::ConstPTDType;\n * auto mx = amrex::ReduceMax(pc,\n- * [=] AMREX_GPU_HOST_DEVICE (const PTDType& ptd, const int i) -> ParticleReal\n+ * [=] AMREX_GPU_HOST_DEVICE (const ConstPTDType& ptd, const int i) -> ParticleReal\n * {\n- * return ptd.m_aos[i].rdata(0);\n+ * return ptd.rdata(0)[i];\n * });\n *\n */\n template <class PC, class F, std::enable_if_t<IsParticleContainer<PC>::value, int> foo = 0>\n auto\n ReduceMax (PC const& pc, int lev, F&& f)\n- -> decltype(particle_detail::call_f(f, typename PC::ParticleTileType::ConstParticleTileDataType(), int()))\n+ -> decltype(particle_detail::call_f(f, typename PC::ConstPTDType(), int()))\n {\n return ReduceMax(pc, lev, lev, std::forward<F>(f));\n }\n@@ -363,20 +363,20 @@ ReduceMax (PC const& pc, int lev, F&& f)\n * return p.idata(0);\n * });\n *\n- * using PTDType = typename PC::ParticleTileType::ConstParticleTileDataType;\n+ * using ConstPTDType = typename PC::ConstPTDType;\n * auto mx = amrex::ReduceMax(pc,\n- * [=] AMREX_GPU_HOST_DEVICE (const PTDType& ptd, const int i) -> ParticleReal\n+ * [=] AMREX_GPU_HOST_DEVICE (const ConstPTDType& ptd, const int i) -> ParticleReal\n * {\n- * return ptd.m_aos[i].rdata(0);\n+ * return ptd.rdata(0)[i];\n * });\n *\n */\n template <class PC, class F, std::enable_if_t<IsParticleContainer<PC>::value, int> foo = 0>\n auto\n ReduceMax (PC const& pc, int lev_min, int lev_max, F const& f)\n- -> decltype(particle_detail::call_f(f, typename PC::ParticleTileType::ConstParticleTileDataType(), int()))\n+ -> decltype(particle_detail::call_f(f, typename PC::ConstPTDType(), int()))\n {\n- using value_type = decltype(particle_detail::call_f(f, typename PC::ParticleTileType::ConstParticleTileDataType(), int()));\n+ using value_type = decltype(particle_detail::call_f(f, typename PC::ConstPTDType(), int()));\n constexpr value_type value_lowest = std::numeric_limits<value_type>::lowest();\n value_type r = value_lowest;\n \n@@ -467,18 +467,18 @@ ReduceMax (PC const& pc, int lev_min, int lev_max, F const& f)\n * return p.idata(0);\n * });\n *\n- * using PTDType = typename PC::ParticleTileType::ConstParticleTileDataType;\n+ * using ConstPTDType = typename PC::ConstPTDType;\n * auto mn = amrex::ReduceMin(pc,\n- * [=] AMREX_GPU_HOST_DEVICE (const PTDType& ptd, const int i) -> ParticleReal\n+ * [=] AMREX_GPU_HOST_DEVICE (const ConstPTDType& ptd, const int i) -> ParticleReal\n * {\n- * return ptd.m_aos[i].rdata(0);\n+ * return ptd.rdata(0)[i];\n * });\n *\n */\n template <class PC, class F, std::enable_if_t<IsParticleContainer<PC>::value, int> foo = 0>\n auto\n ReduceMin (PC const& pc, F&& f)\n- -> decltype(particle_detail::call_f(f, typename PC::ParticleTileType::ConstParticleTileDataType(), int()))\n+ -> decltype(particle_detail::call_f(f, typename PC::ConstPTDType(), int()))\n {\n return ReduceMin(pc, 0, pc.finestLevel(), std::forward<F>(f));\n }\n@@ -515,18 +515,18 @@ ReduceMin (PC const& pc, F&& f)\n * return p.idata(0);\n * });\n *\n- * using PTDType = typename PC::ParticleTileType::ConstParticleTileDataType;\n+ * using ConstPTDType = typename PC::ConstPTDType;\n * auto mn = amrex::ReduceMin(pc,\n- * [=] AMREX_GPU_HOST_DEVICE (const PTDType& ptd, const int i) -> ParticleReal\n+ * [=] AMREX_GPU_HOST_DEVICE (const ConstPTDType& ptd, const int i) -> ParticleReal\n * {\n- * return ptd.m_aos[i].rdata(0);\n+ * return ptd.rdata(0)[i];\n * });\n *\n */\n template <class PC, class F, std::enable_if_t<IsParticleContainer<PC>::value, int> foo = 0>\n auto\n ReduceMin (PC const& pc, int lev, F&& f)\n- -> decltype(particle_detail::call_f(f, typename PC::ParticleTileType::ConstParticleTileDataType(), int()))\n+ -> decltype(particle_detail::call_f(f, typename PC::ConstPTDType(), int()))\n {\n return ReduceMin(pc, lev, lev, std::forward<F>(f));\n }\n@@ -564,20 +564,20 @@ ReduceMin (PC const& pc, int lev, F&& f)\n * return p.idata(0);\n * });\n *\n- * using PTDType = typename PC::ParticleTileType::ConstParticleTileDataType;\n+ * using ConstPTDType = typename PC::ConstPTDType;\n * auto mn = amrex::ReduceMin(pc,\n- * [=] AMREX_GPU_HOST_DEVICE (const PTDType& ptd, const int i) -> ParticleReal\n+ * [=] AMREX_GPU_HOST_DEVICE (const ConstPTDType& ptd, const int i) -> ParticleReal\n * {\n- * return ptd.m_aos[i].rdata(0);\n+ * return ptd.rdata(0)[i];\n * });\n *\n */\n template <class PC, class F, std::enable_if_t<IsParticleContainer<PC>::value, int> foo = 0>\n auto\n ReduceMin (PC const& pc, int lev_min, int lev_max, F const& f)\n- -> decltype(particle_detail::call_f(f, typename PC::ParticleTileType::ConstParticleTileDataType(), int()))\n+ -> decltype(particle_detail::call_f(f, typename PC::ConstPTDType(), int()))\n {\n- using value_type = decltype(particle_detail::call_f(f, typename PC::ParticleTileType::ConstParticleTileDataType(), int()));\n+ using value_type = decltype(particle_detail::call_f(f, typename PC::ConstPTDType(), int()));\n constexpr value_type value_max = std::numeric_limits<value_type>::max();\n value_type r = value_max;\n \n@@ -668,11 +668,11 @@ ReduceMin (PC const& pc, int lev_min, int lev_max, F const& f)\n * return p.id() > 0;\n * });\n *\n- * using PTDType = typename PC::ParticleTileType::ConstParticleTileDataType;\n+ * using ConstPTDType = typename PC::ConstPTDType;\n * auto rv = amrex::ReduceLogicalAnd(pc,\n- * [=] AMREX_GPU_HOST_DEVICE (const PTDType& ptd, const int i) -> bool\n+ * [=] AMREX_GPU_HOST_DEVICE (const ConstPTDType& ptd, const int i) -> bool\n * {\n- * return ptd.m_aos[i].id() > 0;\n+ * return ptd.id(i) > 0;\n * });\n *\n */\n@@ -715,11 +715,11 @@ ReduceLogicalAnd (PC const& pc, F&& f)\n * return p.id() > 0;\n * });\n *\n- * using PTDType = typename PC::ParticleTileType::ConstParticleTileDataType;\n+ * using ConstPTDType = typename PC::ConstPTDType;\n * auto rv = amrex::ReduceLogicalAnd(pc,\n- * [=] AMREX_GPU_HOST_DEVICE (const PTDType& ptd, const int i) -> bool\n+ * [=] AMREX_GPU_HOST_DEVICE (const ConstPTDType& ptd, const int i) -> bool\n * {\n- * return ptd.m_aos[i].id() > 0;\n+ * return ptd.id(i) > 0;\n * });\n *\n */\n@@ -763,11 +763,11 @@ ReduceLogicalAnd (PC const& pc, int lev, F&& f)\n * return p.id() > 0;\n * });\n *\n- * using PTDType = typename PC::ParticleTileType::ConstParticleTileDataType;\n+ * using ConstPTDType = typename PC::ConstPTDType;\n * auto rv = amrex::ReduceLogicalAnd(pc,\n- * [=] AMREX_GPU_HOST_DEVICE (const PTDType& ptd, const int i) -> bool\n+ * [=] AMREX_GPU_HOST_DEVICE (const ConstPTDType& ptd, const int i) -> bool\n * {\n- * return ptd.m_aos[i].id() > 0;\n+ * return ptd.id(i) > 0;\n * });\n *\n */\n@@ -864,11 +864,11 @@ ReduceLogicalAnd (PC const& pc, int lev_min, int lev_max, F const& f)\n * return p.id() < 1;\n * });\n *\n- * using PTDType = typename PC::ParticleTileType::ConstParticleTileDataType;\n+ * using ConstPTDType = typename PC::ConstPTDType;\n * auto rv = amrex::ReduceLogicalOr(pc,\n- * [=] AMREX_GPU_HOST_DEVICE (const PTDType& ptd, const int i) -> bool\n+ * [=] AMREX_GPU_HOST_DEVICE (const ConstPTDType& ptd, const int i) -> bool\n * {\n- * return ptd.m_aos[i].id() < 1;\n+ * return ptd.id(i) < 1;\n * });\n *\n */\n@@ -911,11 +911,11 @@ ReduceLogicalOr (PC const& pc, F&& f)\n * return p.id() < 1;\n * });\n *\n- * using PTDType = typename PC::ParticleTileType::ConstParticleTileDataType;\n+ * using ConstPTDType = typename PC::ConstPTDType;\n * auto rv = amrex::ReduceLogicalOr(pc,\n- * [=] AMREX_GPU_HOST_DEVICE (const PTDType& ptd, const int i) -> bool\n+ * [=] AMREX_GPU_HOST_DEVICE (const ConstPTDType& ptd, const int i) -> bool\n * {\n- * return ptd.m_aos[i].id() < 1;\n+ * return ptd.id(i) < 1;\n * });\n *\n */\n@@ -959,11 +959,11 @@ ReduceLogicalOr (PC const& pc, int lev, F&& f)\n * return p.id() < 1;\n * });\n *\n- * using PTDType = typename PC::ParticleTileType::ConstParticleTileDataType;\n+ * using ConstPTDType = typename PC::ConstPTDType;\n * auto rv = amrex::ReduceLogicalOr(pc,\n- * [=] AMREX_GPU_HOST_DEVICE (const PTDType& ptd, const int i) -> bool\n+ * [=] AMREX_GPU_HOST_DEVICE (const ConstPTDType& ptd, const int i) -> bool\n * {\n- * return ptd.m_aos[i].id() < 1;\n+ * return ptd.id(i) < 1;\n * });\n *\n */\n@@ -1078,15 +1078,15 @@ ReduceLogicalOr (PC const& pc, int lev_min, int lev_max, F const& f)\n * return {a, b, c};\n * }, reduce_ops);\n *\n- * using PTDType = typename PC::ParticleTileType::ConstParticleTileDataType;\n+ * using ConstPTDType = typename PC::ConstPTDType;\n * amrex::ReduceOps<ReduceOpSum, ReduceOpMin, ReduceOpMax> reduce_ops;\n * auto r = amrex::ParticleReduce<ReduceData<amrex::Real, amrex::Real,int>> (\n- * pc, [=] AMREX_GPU_DEVICE (const PTDType& ptd, const int i) noexcept\n+ * pc, [=] AMREX_GPU_DEVICE (const ConstPTDType& ptd, const int i) noexcept\n * -> amrex::GpuTuple<amrex::Real,amrex::Real,int>\n * {\n- * const amrex::Real a = ptd.m_aos[i].rdata(1);\n- * const amrex::Real b = ptd.m_aos[i].rdata(2);\n- * const int c = ptd.m_aos[i].idata(1);\n+ * const amrex::Real a = ptd.rdata(1)[i];\n+ * const amrex::Real b = ptd.rdata(2)[i];\n+ * const int c = ptd.idata(1)[i];\n * return {a, b, c};\n * }, reduce_ops);\n *\n@@ -1148,15 +1148,15 @@ ParticleReduce (PC const& pc, F&& f, ReduceOps& reduce_ops)\n * return {a, b, c};\n * }, reduce_ops);\n *\n- * using PTDType = typename PC::ParticleTileType::ConstParticleTileDataType;\n+ * using ConstPTDType = typename PC::ConstPTDType;\n * amrex::ReduceOps<ReduceOpSum, ReduceOpMin, ReduceOpMax> reduce_ops;\n * auto r = amrex::ParticleReduce<ReduceData<amrex::Real, amrex::Real,int>> (\n- * pc, [=] AMREX_GPU_DEVICE (const PTDType& ptd, const int i) noexcept\n+ * pc, [=] AMREX_GPU_DEVICE (const ConstPTDType& ptd, const int i) noexcept\n * -> amrex::GpuTuple<amrex::Real,amrex::Real,int>\n * {\n- * const amrex::Real a = ptd.m_aos[i].rdata(1);\n- * const amrex::Real b = ptd.m_aos[i].rdata(2);\n- * const int c = ptd.m_aos[i].idata(1);\n+ * const amrex::Real a = ptd.rdata(1)[i];\n+ * const amrex::Real b = ptd.rdata(2)[i];\n+ * const int c = ptd.idata(1)[i];\n * return {a, b, c};\n * }, reduce_ops);\n *\n@@ -1219,15 +1219,15 @@ ParticleReduce (PC const& pc, int lev, F&& f, ReduceOps& reduce_ops)\n * return {a, b, c};\n * }, reduce_ops);\n *\n- * using PTDType = typename PC::ParticleTileType::ConstParticleTileDataType;\n+ * using ConstPTDType = typename PC::ConstPTDType;\n * amrex::ReduceOps<ReduceOpSum, ReduceOpMin, ReduceOpMax> reduce_ops;\n * auto r = amrex::ParticleReduce<ReduceData<amrex::Real, amrex::Real,int>> (\n- * pc, [=] AMREX_GPU_DEVICE (const PTDType& ptd, const int i) noexcept\n+ * pc, [=] AMREX_GPU_DEVICE (const ConstPTDType& ptd, const int i) noexcept\n * -> amrex::GpuTuple<amrex::Real,amrex::Real,int>\n * {\n- * const amrex::Real a = ptd.m_aos[i].rdata(1);\n- * const amrex::Real b = ptd.m_aos[i].rdata(2);\n- * const int c = ptd.m_aos[i].idata(1);\n+ * const amrex::Real a = ptd.rdata(1)[i];\n+ * const amrex::Real b = ptd.rdata(2)[i];\n+ * const int c = ptd.idata(1)[i];\n * return {a, b, c};\n * }, reduce_ops);\n *\ndiff --git a/Src/Particle/AMReX_ParticleTile.H b/Src/Particle/AMReX_ParticleTile.H\nindex 80f7705e266..d7ba7a1f136 100644\n--- a/Src/Particle/AMReX_ParticleTile.H\n+++ b/Src/Particle/AMReX_ParticleTile.H\n@@ -36,6 +36,8 @@ struct ParticleTileData\n using ParticleType = T_ParticleType;\n using ParticleRefType = T_ParticleType&;\n using Self = ParticleTileData<ParticleType, NAR, NAI>;\n+ using RealType = ParticleReal;\n+ using IntType = int;\n \n static constexpr int NStructReal = ParticleType::NReal;\n static constexpr int NStructInt = ParticleType::NInt;\n@@ -60,7 +62,7 @@ struct ParticleTileData\n int* AMREX_RESTRICT * AMREX_RESTRICT m_runtime_idata;\n \n [[nodiscard]] AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE\n- ParticleReal& pos (const int dir, const int index) const &\n+ decltype(auto) pos (const int dir, const int index) const &\n {\n if constexpr(!ParticleType::is_soa_particle) {\n return this->m_aos[index].pos(dir);\n@@ -95,7 +97,7 @@ struct ParticleTileData\n if constexpr(ParticleType::is_soa_particle) {\n return this->m_idcpu[index];\n } else {\n- amrex::Abort(\"not implemented\");\n+ return this->m_aos[index].idcpu();\n }\n }\n \n@@ -329,6 +331,7 @@ struct alignas(sizeof(double)) ConstSoAParticle : SoAParticleBase\n static constexpr bool is_constsoa_particle = true;\n \n using RealType = ParticleReal;\n+ using IntType = int;\n \n AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE\n ConstSoAParticle (ConstPTD const& ptd, long i) : // Note: should this be int instead?\n@@ -374,7 +377,7 @@ struct alignas(sizeof(double)) ConstSoAParticle : SoAParticleBase\n \n private :\n \n- static_assert(std::is_trivially_copyable<ParticleTileData<SoAParticleBase, NArrayReal, NArrayInt>>(), \"ParticleTileData is not trivially copyable\");\n+ static_assert(std::is_trivially_copyable<ConstPTD>(), \"ParticleTileData is not trivially copyable\");\n \n ConstPTD m_constparticle_tile_data;\n int m_index;\n@@ -392,6 +395,7 @@ struct alignas(sizeof(double)) SoAParticle : SoAParticleBase\n \n using ConstType = ConstSoAParticle<T_NArrayReal, T_NArrayInt>;\n using RealType = ParticleReal;\n+ using IntType = int;\n \n AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE\n SoAParticle (PTD const& ptd, long i) : // Note: should this be int instead?\n@@ -456,7 +460,7 @@ struct alignas(sizeof(double)) SoAParticle : SoAParticleBase\n \n private :\n \n- static_assert(std::is_trivially_copyable<ParticleTileData<SoAParticleBase, NArrayReal, NArrayInt>>(), \"ParticleTileData is not trivially copyable\");\n+ static_assert(std::is_trivially_copyable<PTD>(), \"ParticleTileData is not trivially copyable\");\n \n PTD m_particle_tile_data;\n int m_index;\n@@ -511,6 +515,8 @@ struct ConstParticleTileData\n static constexpr int NAI = NArrayInt;\n using ParticleType = T_ParticleType;\n using ParticleRefType = T_ParticleType const&;\n+ using RealType = ParticleReal;\n+ using IntType = int;\n \n static constexpr int NStructReal = ParticleType::NReal;\n static constexpr int NStructInt = ParticleType::NInt;\n@@ -530,7 +536,7 @@ struct ConstParticleTileData\n GpuArray<const int*, NArrayInt > m_idata;\n \n [[nodiscard]] AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE\n- const ParticleReal& pos (const int dir, const int index) const &\n+ decltype(auto) pos (const int dir, const int index) const &\n {\n if constexpr(!ParticleType::is_soa_particle) {\n return this->m_aos[index].pos(dir);\n@@ -565,7 +571,7 @@ struct ConstParticleTileData\n if constexpr(ParticleType::is_soa_particle) {\n return this->m_idcpu[index];\n } else {\n- amrex::Abort(\"not implemented\");\n+ return this->m_aos[index].idcpu();\n }\n }\n \ndiff --git a/Src/Particle/AMReX_WriteBinaryParticleData.H b/Src/Particle/AMReX_WriteBinaryParticleData.H\nindex 3c03efe076b..4a5117a1d29 100644\n--- a/Src/Particle/AMReX_WriteBinaryParticleData.H\n+++ b/Src/Particle/AMReX_WriteBinaryParticleData.H\n@@ -47,8 +47,12 @@ fillFlags (Container<int, Allocator>& pflags, const PTile& ptile, F const& f)\n amrex::ignore_unused(flag_ptr, f, engine);\n if constexpr (IsCallable<F,decltype(p),RandomEngine>::value) {\n flag_ptr[k] = f(p,engine);\n- } else {\n+ } else if constexpr (IsCallable<F,decltype(p)>::value) {\n flag_ptr[k] = f(p);\n+ } else if constexpr (IsCallable<F,decltype(ptd),int,RandomEngine>::value) {\n+ flag_ptr[k] = f(ptd,k,engine);\n+ } else {\n+ flag_ptr[k] = f(ptd,k);\n }\n });\n }\n@@ -68,8 +72,12 @@ fillFlags (Container<int, Allocator>& pflags, const PTile& ptile, F const& f)\n const auto p = ptd.getSuperParticle(k);\n if constexpr (IsCallable<F,decltype(p),RandomEngine>::value) {\n flag_ptr[k] = f(p,getInvalidRandomEngine());\n- } else {\n+ } else if constexpr (IsCallable<F,decltype(p)>::value) {\n flag_ptr[k] = f(p);\n+ } else if constexpr (IsCallable<F,decltype(ptd),int,RandomEngine>::value) {\n+ flag_ptr[k] = f(ptd,k,getInvalidRandomEngine());\n+ } else {\n+ flag_ptr[k] = f(ptd,k);\n }\n }\n }\n@@ -150,22 +158,98 @@ countFlags (const Container<int,Allocator>& pflags)\n return nparticles;\n }\n \n-template <typename P, typename I>\n+template <typename I>\n AMREX_GPU_HOST_DEVICE\n-void packParticleIDs (I* idata, const P& p, bool is_checkpoint) noexcept\n+void packParticleIDs (I* idata, const std::uint64_t idcpu, bool is_checkpoint) noexcept\n {\n if (is_checkpoint) {\n std::int32_t xi, yi;\n std::uint32_t xu, yu;\n- xu = (std::uint32_t)((p.m_idcpu & 0xFFFFFFFF00000000LL) >> 32);\n- yu = (std::uint32_t)( p.m_idcpu & 0xFFFFFFFFLL);\n+ xu = (std::uint32_t)((idcpu & 0xFFFFFFFF00000000LL) >> 32);\n+ yu = (std::uint32_t)( idcpu & 0xFFFFFFFFLL);\n amrex::Gpu::memcpy(&xi, &xu, sizeof(xu));\n amrex::Gpu::memcpy(&yi, &yu, sizeof(yu));\n idata[0] = xi;\n idata[1] = yi;\n } else {\n- idata[0] = p.id();\n- idata[1] = p.cpu();\n+ idata[0] = ConstParticleIDWrapper{idcpu};\n+ idata[1] = ConstParticleCPUWrapper{idcpu};\n+ }\n+}\n+\n+template<class PTD>\n+AMREX_GPU_HOST_DEVICE void\n+rPackParticleData (const PTD& ptd, int idx, typename PTD::RealType * rdata_ptr,\n+ const int * write_real_comp)\n+{\n+ std::size_t rout_index = 0;\n+\n+ for (int j = 0; j < AMREX_SPACEDIM; ++j) {\n+ rdata_ptr[rout_index] = ptd.pos(j, idx);\n+ rout_index++;\n+ }\n+\n+ if constexpr (!PTD::ParticleType::is_soa_particle) {\n+ const auto& p = ptd[idx];\n+\n+ for (int j = 0; j < PTD::ParticleType::NReal; ++j) {\n+ if (write_real_comp[j]) {\n+ rdata_ptr[rout_index] = p.rdata(j);\n+ rout_index++;\n+ }\n+ }\n+ }\n+\n+ constexpr int real_start_offset = PTD::ParticleType::is_soa_particle ? AMREX_SPACEDIM : 0;\n+\n+ for (int j = real_start_offset; j < PTD::NAR; ++j) {\n+ if (write_real_comp[PTD::ParticleType::NReal + j - real_start_offset]) {\n+ rdata_ptr[rout_index] = ptd.rdata(j)[idx];\n+ rout_index++;\n+ }\n+ }\n+\n+ for (int j = 0; j < ptd.m_num_runtime_real; ++j) {\n+ if (write_real_comp[PTD::ParticleType::NReal + PTD::NAR + j - real_start_offset]) {\n+ rdata_ptr[rout_index] = ptd.m_runtime_rdata[j][idx];\n+ rout_index++;\n+ }\n+ }\n+}\n+\n+template<class PTD>\n+AMREX_GPU_HOST_DEVICE void\n+iPackParticleData (const PTD& ptd, int idx, typename PTD::IntType * idata_ptr,\n+ const int * write_int_comp, bool is_checkpoint)\n+{\n+ std::size_t iout_index = 0;\n+\n+ packParticleIDs(&idata_ptr[iout_index], ptd.idcpu(idx), is_checkpoint);\n+ iout_index += 2;\n+\n+ if constexpr (!PTD::ParticleType::is_soa_particle) {\n+ const auto& p = ptd[idx];\n+\n+ for (int j = 0; j < PTD::ParticleType::NInt; ++j) {\n+ if (write_int_comp[j]) {\n+ idata_ptr[iout_index] = p.idata(j);\n+ iout_index++;\n+ }\n+ }\n+ }\n+\n+ for (int j = 0; j < PTD::NAI; ++j) {\n+ if (write_int_comp[PTD::ParticleType::NInt + j]) {\n+ idata_ptr[iout_index] = ptd.idata(j)[idx];\n+ iout_index++;\n+ }\n+ }\n+\n+ for (int j = 0; j < ptd.m_num_runtime_int; ++j) {\n+ if (write_int_comp[PTD::ParticleType::NInt + PTD::NAI + j]) {\n+ idata_ptr[iout_index] = ptd.m_runtime_idata[j][idx];\n+ iout_index++;\n+ }\n }\n }\n \n@@ -214,58 +298,22 @@ packIOData (Vector<int>& idata, Vector<ParticleReal>& rdata, const PC& pc, int l\n typename PC::RealVector rdata_d(num_copies*rChunkSize);\n \n const auto flag_ptr = pflags.data();\n+ const auto offset_ptr = offsets.data();\n \n auto idata_d_ptr = idata_d.data();\n auto rdata_d_ptr = rdata_d.data();\n \n const auto& ptd = ptile.getConstParticleTileData();\n- amrex::ParallelFor(num_copies,\n+ amrex::ParallelFor(ptile.numParticles(),\n [=] AMREX_GPU_DEVICE (int pindex) noexcept\n {\n- // might be worth using shared memory here\n- const auto p = ptd.getSuperParticle(pindex);\n-\n if (flag_ptr[pindex]) {\n- std::size_t iout_index = pindex*iChunkSize;\n- packParticleIDs(&idata_d_ptr[iout_index], p, is_checkpoint);\n- iout_index += 2;\n-\n- std::size_t rout_index = pindex*rChunkSize;\n- for (int j = 0; j < AMREX_SPACEDIM; j++) {\n- rdata_d_ptr[rout_index] = p.pos(j);\n- rout_index++;\n- }\n-\n- for (int j = 0; j < PC::SuperParticleType::NInt; j++) {\n- if (write_int_comp_d_ptr[j]) {\n- idata_d_ptr[iout_index] = p.idata(j);\n- iout_index++;\n- }\n- }\n+ const int out_indx = offset_ptr[pindex];\n+ iPackParticleData(ptd, pindex, idata_d_ptr + out_indx * iChunkSize,\n+ write_int_comp_d_ptr, is_checkpoint);\n \n- for (int j = 0; j < ptd.m_num_runtime_int; j++) {\n- if (write_int_comp_d_ptr[PC::SuperParticleType::NInt + j]) {\n- idata_d_ptr[iout_index] = ptd.m_runtime_idata[j][pindex];\n- iout_index++;\n- }\n- }\n-\n- // extra SoA Real components\n- const int real_start_offset = PC::ParticleType::is_soa_particle ? AMREX_SPACEDIM : 0; // pure SoA: skip positions\n- for (int j = real_start_offset; j < PC::SuperParticleType::NReal; j++) {\n- const int write_comp_index = j-real_start_offset;\n- if (write_real_comp_d_ptr[write_comp_index]) {\n- rdata_d_ptr[rout_index] = p.rdata(j);\n- rout_index++;\n- }\n- }\n-\n- for (int j = 0; j < ptd.m_num_runtime_real; j++) {\n- if (write_real_comp_d_ptr[PC::SuperParticleType::NReal+j-real_start_offset]) {\n- rdata_d_ptr[rout_index] = ptd.m_runtime_rdata[j][pindex];\n- rout_index++;\n- }\n- }\n+ rPackParticleData(ptd, pindex, rdata_d_ptr + out_indx * rChunkSize,\n+ write_real_comp_d_ptr);\n }\n });\n \n@@ -307,84 +355,17 @@ packIOData (Vector<int>& idata, Vector<ParticleReal>& rdata, const PC& pc, int l\n for (int tile : tiles) {\n const auto& ptile = pc.ParticlesAt(lev, grid, tile);\n const auto& pflags = particle_io_flags[lev].at(std::make_pair(grid, tile));\n+ const auto& ptd = ptile.getConstParticleTileData();\n+\n for (int pindex = 0; pindex < ptile.numParticles(); ++pindex) {\n if (pflags[pindex]) {\n- const auto& soa = ptile.GetStructOfArrays();\n-\n- // note: for pure SoA particle layouts, we do write the id, cpu and positions as a struct\n- // for backwards compatibility with readers\n- if constexpr(!PC::ParticleType::is_soa_particle)\n- {\n- const auto& aos = ptile.GetArrayOfStructs();\n- const auto& p = aos[pindex];\n-\n- // Int: id, cpu\n- packParticleIDs(iptr, p, is_checkpoint);\n- iptr += 2;\n-\n- // Real: positions\n- for (int j = 0; j < AMREX_SPACEDIM; j++) { rptr[j] = p.pos(j); }\n- rptr += AMREX_SPACEDIM;\n-\n- // extra AoS Int components\n- for (int j = 0; j < PC::NStructInt; j++) {\n- if (write_int_comp[j]) {\n- *iptr = p.idata(j);\n- ++iptr;\n- }\n- }\n- // extra AoS Real components\n- for (int j = 0; j < PC::NStructReal; j++) {\n- if (write_real_comp[j]) {\n- *rptr = p.rdata(j);\n- ++rptr;\n- }\n- }\n- }\n- else {\n- uint64_t idcpu = soa.GetIdCPUData()[pindex];\n- if (is_checkpoint) {\n- std::int32_t xi, yi;\n- std::uint32_t xu, yu;\n- xu = (std::uint32_t)((idcpu & 0xFFFFFFFF00000000LL) >> 32);\n- yu = (std::uint32_t)( idcpu & 0xFFFFFFFFLL);\n- std::memcpy(&xi, &xu, sizeof(xu));\n- std::memcpy(&yi, &yu, sizeof(yu));\n- *iptr = xi;\n- iptr += 1;\n- *iptr = yi;\n- iptr += 1;\n- } else {\n- // Int: id, cpu\n- *iptr = (int) ParticleIDWrapper(idcpu);\n- iptr += 1;\n- *iptr = (int) ParticleCPUWrapper(idcpu);\n- iptr += 1;\n- }\n-\n- // Real: position\n- for (int j = 0; j < AMREX_SPACEDIM; j++) { rptr[j] = soa.GetRealData(j)[pindex]; }\n- rptr += AMREX_SPACEDIM;\n- }\n+ iPackParticleData(ptd, pindex, iptr,\n+ write_int_comp.dataPtr(), is_checkpoint);\n+ iptr += iChunkSize;\n \n- // SoA int data\n- const int int_start_offset = 0;\n- for (int j = int_start_offset; j < pc.NumIntComps(); j++) {\n- if (write_int_comp[PC::NStructInt+j]) {\n- *iptr = soa.GetIntData(j)[pindex];\n- ++iptr;\n- }\n- }\n-\n- // extra SoA Real components\n- const int real_start_offset = PC::ParticleType::is_soa_particle ? AMREX_SPACEDIM : 0; // pure SoA: skip positions\n- for (int j = real_start_offset; j < pc.NumRealComps(); j++) {\n- const int write_comp_index = PC::NStructReal+j-real_start_offset;\n- if (write_real_comp[write_comp_index]) {\n- *rptr = (ParticleReal) soa.GetRealData(j)[pindex];\n- ++rptr;\n- }\n- }\n+ rPackParticleData(ptd, pindex, rptr,\n+ write_real_comp.dataPtr());\n+ rptr += rChunkSize;\n }\n }\n }\n@@ -875,7 +856,6 @@ void WriteBinaryParticleDataAsync (PC const& pc,\n dms.push_back(pc.ParticleDistributionMap(lev));\n }\n \n- int nrc = pc.NumRealComps();\n int nic = pc.NumIntComps();\n int rnames_size = (int) real_comp_names.size();\n \n@@ -1028,62 +1008,11 @@ void WriteBinaryParticleDataAsync (PC const& pc,\n const auto& ptd = pbox.getConstParticleTileData();\n for (int pindex = 0; pindex < pbox.numParticles(); ++pindex)\n {\n- const auto& soa = pbox.GetStructOfArrays();\n-\n- make_particle<typename PC::ConstParticleType> mp{};\n- const auto& p = mp(ptd, pindex);\n- if (p.id() <= 0) { continue; }\n-\n- // note: for pure SoA particle layouts, we do write the id, cpu and positions as a struct\n- // for backwards compatibility with readers\n- if constexpr(!PC::ParticleType::is_soa_particle)\n- {\n- // Ints: id, cpu\n- particle_detail::packParticleIDs(iptr, p, is_checkpoint);\n- iptr += 2;\n-\n- // extra AoS Int components\n- for (int j = 0; j < NStructInt; j++)\n- {\n- if (write_int_comp[j])\n- {\n- *iptr = p.idata(j);\n- ++iptr;\n- }\n- }\n- }\n- else {\n- uint64_t idcpu = soa.GetIdCPUData()[pindex];\n- if (is_checkpoint) {\n- std::int32_t xi, yi;\n- std::uint32_t xu, yu;\n- xu = (std::uint32_t)((idcpu & 0xFFFFFFFF00000000LL) >> 32);\n- yu = (std::uint32_t)( idcpu & 0xFFFFFFFFLL);\n- std::memcpy(&xi, &xu, sizeof(xu));\n- std::memcpy(&yi, &yu, sizeof(yu));\n- *iptr = xi;\n- iptr += 1;\n- *iptr = yi;\n- iptr += 1;\n- } else {\n- // Int: id, cpu\n- *iptr = (int) ParticleIDWrapper(idcpu);\n- iptr += 1;\n- *iptr = (int) ParticleCPUWrapper(idcpu);\n- iptr += 1;\n- }\n- }\n+ if (ptd.id(pindex) <= 0) { continue; }\n \n- // extra SoA Ints\n- const int int_start_offset = 0;\n- for (int j = int_start_offset; j < nic; j++)\n- {\n- if (write_int_comp[NStructInt+j])\n- {\n- *iptr = soa.GetIntData(j)[pindex];\n- ++iptr;\n- }\n- }\n+ particle_detail::iPackParticleData(ptd, pindex, iptr,\n+ write_int_comp.dataPtr(), is_checkpoint);\n+ iptr += iChunkSize;\n }\n }\n \n@@ -1104,49 +1033,13 @@ void WriteBinaryParticleDataAsync (PC const& pc,\n auto ptile_index = std::make_pair(grid, tile_map[grid][i]);\n const auto& pbox = (*myptiles)[lev][ptile_index];\n const auto& ptd = pbox.getConstParticleTileData();\n- for (int pindex = 0;\n- pindex < pbox.numParticles(); ++pindex)\n+ for (int pindex = 0; pindex < pbox.numParticles(); ++pindex)\n {\n- const auto& soa = pbox.GetStructOfArrays();\n- make_particle<typename PC::ConstParticleType> mp{};\n- const auto& p = mp(ptd, pindex);\n-\n- if (p.id() <= 0) { continue; }\n-\n- if constexpr(!PC::ParticleType::is_soa_particle)\n- {\n- // Real: position\n- for (int j = 0; j < AMREX_SPACEDIM; j++) { rptr[j] = p.pos(j); }\n- rptr += AMREX_SPACEDIM;\n-\n- // extra AoS real\n- for (int j = 0; j < NStructReal; j++)\n- {\n- if (write_real_comp[j])\n- {\n- *rptr = p.rdata(j);\n- ++rptr;\n- }\n- }\n- }\n- else {\n- // Real: position\n- for (int j = 0; j < AMREX_SPACEDIM; j++) { rptr[j] = soa.GetRealData(j)[pindex]; }\n- rptr += AMREX_SPACEDIM;\n- }\n+ if (ptd.id(pindex) <= 0) { continue; }\n \n- // extra SoA real\n- const int real_start_offset = PC::ParticleType::is_soa_particle ? AMREX_SPACEDIM : 0; // pure SoA: positions\n- for (int j = real_start_offset; j < nrc; j++)\n- {\n- const int write_comp_offset = PC::ParticleType::is_soa_particle ? AMREX_SPACEDIM : 0; // pure SoA: skip positions\n- const int write_comp_index = PC::NStructReal+j-write_comp_offset;\n- if (write_real_comp[write_comp_index])\n- {\n- *rptr = (typename PC::ParticleType::RealType) soa.GetRealData(j)[pindex];\n- ++rptr;\n- }\n- }\n+ particle_detail::rPackParticleData(ptd, pindex, rptr,\n+ write_real_comp.dataPtr());\n+ rptr += rChunkSize;\n }\n }\n \n"}, "test": {"test_patch": "diff --git a/Tests/Particles/CheckpointRestartSOA/main.cpp b/Tests/Particles/CheckpointRestartSOA/main.cpp\nindex e3c544516e2..af2ce0f7a0b 100644\n--- a/Tests/Particles/CheckpointRestartSOA/main.cpp\n+++ b/Tests/Particles/CheckpointRestartSOA/main.cpp\n@@ -150,21 +150,21 @@ void test ()\n std::snprintf(directory_path, sizeof directory_path, \"%s%s\", directory.c_str(), \"plt00000\");\n newPC.Restart(directory_path, \"particle0\");\n \n- using PType = typename MyPC::SuperParticleType;\n+ using ConstPTDType = typename MyPC::ConstPTDType;\n \n for (int icomp=0; icomp<NReal; ++icomp)\n {\n amrex::Print() << \"working on comp \" << icomp << \"\\n\";\n auto sm_new = amrex::ReduceSum(newPC,\n- [=] AMREX_GPU_HOST_DEVICE (const PType& p) -> Real\n+ [=] AMREX_GPU_HOST_DEVICE (const ConstPTDType& ptd, const int i) -> Real\n {\n- return p.rdata(icomp);\n+ return ptd.rdata(icomp)[i];\n });\n \n auto sm_old = amrex::ReduceSum(myPC,\n- [=] AMREX_GPU_HOST_DEVICE (const PType& p) -> Real\n+ [=] AMREX_GPU_HOST_DEVICE (const ConstPTDType& ptd, const int i) -> Real\n {\n- return p.rdata(icomp);\n+ return ptd.rdata(icomp)[i];\n });\n \n ParallelDescriptor::ReduceRealSum(sm_new);\n@@ -178,15 +178,15 @@ void test ()\n {\n amrex::Print() << \"working on comp \" << icomp << \"\\n\";\n auto sm_new = amrex::ReduceSum(newPC,\n- [=] AMREX_GPU_HOST_DEVICE (const PType& p) -> Real\n+ [=] AMREX_GPU_HOST_DEVICE (const ConstPTDType& ptd, const int i) -> Real\n {\n- return p.idata(icomp);\n+ return ptd.idata(icomp)[i];\n });\n \n auto sm_old = amrex::ReduceSum(myPC,\n- [=] AMREX_GPU_HOST_DEVICE (const PType& p) -> Real\n+ [=] AMREX_GPU_HOST_DEVICE (const ConstPTDType& ptd, const int i) -> Real\n {\n- return p.idata(icomp);\n+ return ptd.idata(icomp)[i];\n });\n \n ParallelDescriptor::ReduceRealSum(sm_new);\n", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}59{"question_id": "MSB_AMReX-Codes_amrex_pr4552", "question_type": "multi_swe_bench", "description": "ParmParse: Add parser support for bool (AMReX-Codes/amrex#4552)", "content": {"org": "AMReX-Codes", "repo": "amrex", "pr_number": 4552, "issue_title": "ParmParse: Add parser support for bool", "issue_body": "Close #4535 ", "base_commit": "f7f98c8023177cf969aba9e17899d1200b4b4ac2", "resolved_issues": [{"number": 4535, "title": "`bool` support in `queryAddWithParser`", "body": "Currently, `ParmParse::queryAddWithParser` does not support `bool` types. It would be very useful and consistent if added / completed for this."}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/amrex-codes_m_amrex:pr-4552", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/Src/Base/AMReX_ParmParse.H b/Src/Base/AMReX_ParmParse.H\nindex 0e2aa7d37f3..c7ec4728b6d 100644\n--- a/Src/Base/AMReX_ParmParse.H\n+++ b/Src/Base/AMReX_ParmParse.H\n@@ -1108,6 +1108,7 @@ public:\n * scalar. The return value indicates whether it's found. Note that\n * queryWithParser will be used recursively for unresolved symbols.\n */\n+ int queryWithParser (const char* name, bool& ref) const;\n int queryWithParser (const char* name, int& ref) const;\n int queryWithParser (const char* name, long& ref) const;\n int queryWithParser (const char* name, long long& ref) const;\n@@ -1120,12 +1121,14 @@ public:\n * symbols. If the number of elements in the input does not equal to\n * `nvals`, it's a runtime error.\n */\n+ int queryarrWithParser (const char* name, int nvals, bool* ref) const;\n int queryarrWithParser (const char* name, int nvals, int* ref) const;\n int queryarrWithParser (const char* name, int nvals, long* ref) const;\n int queryarrWithParser (const char* name, int nvals, long long* ref) const;\n int queryarrWithParser (const char* name, int nvals, float* ref) const;\n int queryarrWithParser (const char* name, int nvals, double* ref) const;\n- template <typename T, std::enable_if_t<std::is_same_v<T,int> ||\n+ template <typename T, std::enable_if_t<std::is_same_v<T,bool> ||\n+ std::is_same_v<T,int> ||\n std::is_same_v<T,long> ||\n std::is_same_v<T,long long> ||\n std::is_same_v<T,float> ||\n@@ -1146,7 +1149,8 @@ public:\n * scalar. If not, the value in `ref` will be added to the ParmParse\n * database. The return value indicates whether it's found.\n */\n- template <typename T, std::enable_if_t<std::is_same_v<T,int> ||\n+ template <typename T, std::enable_if_t<std::is_same_v<T,bool> ||\n+ std::is_same_v<T,int> ||\n std::is_same_v<T,long> ||\n std::is_same_v<T,long long> ||\n std::is_same_v<T,float> ||\n@@ -1165,7 +1169,8 @@ public:\n * to parse the entire list of empty space separated values as a single\n * scalar. If not, it's a runtime error.\n */\n- template <typename T, std::enable_if_t<std::is_same_v<T,int> ||\n+ template <typename T, std::enable_if_t<std::is_same_v<T,bool> ||\n+ std::is_same_v<T,int> ||\n std::is_same_v<T,long> ||\n std::is_same_v<T,long long> ||\n std::is_same_v<T,float> ||\n@@ -1183,7 +1188,8 @@ public:\n * error. If the number of elements does not equal to `nvals`, it's also\n * a runtime error.\n */\n- template <typename T, std::enable_if_t<std::is_same_v<T,int> ||\n+ template <typename T, std::enable_if_t<std::is_same_v<T,bool> ||\n+ std::is_same_v<T,int> ||\n std::is_same_v<T,long> ||\n std::is_same_v<T,long long> ||\n std::is_same_v<T,float> ||\n@@ -1201,7 +1207,8 @@ public:\n * error. If the number of elements does not equal to `nvals`, it's also\n * a runtime error.\n */\n- template <typename T, std::enable_if_t<std::is_same_v<T,int> ||\n+ template <typename T, std::enable_if_t<std::is_same_v<T,bool> ||\n+ std::is_same_v<T,int> ||\n std::is_same_v<T,long> ||\n std::is_same_v<T,long long> ||\n std::is_same_v<T,float> ||\n@@ -1219,7 +1226,8 @@ public:\n *\n * For unknown symbols, ParmParse database will be queried.\n */\n- template <typename T, std::enable_if_t<std::is_same_v<T,int> ||\n+ template <typename T, std::enable_if_t<std::is_same_v<T,bool> ||\n+ std::is_same_v<T,int> ||\n std::is_same_v<T,long> ||\n std::is_same_v<T,long long> ||\n std::is_same_v<T,float> ||\ndiff --git a/Src/Base/AMReX_ParmParse.cpp b/Src/Base/AMReX_ParmParse.cpp\nindex 7a41f187bc2..098ad89c9a7 100644\n--- a/Src/Base/AMReX_ParmParse.cpp\n+++ b/Src/Base/AMReX_ParmParse.cpp\n@@ -718,7 +718,8 @@ squeryval (const ParmParse::Table& table,\n bool ok = is(valname, ref);\n if ( !ok )\n {\n- if constexpr (std::is_same_v<T,int> ||\n+ if constexpr (std::is_same_v<T,bool> ||\n+ std::is_same_v<T,int> ||\n std::is_same_v<T,long> ||\n std::is_same_v<T,long long> ||\n std::is_same_v<T,float> ||\n@@ -1011,14 +1012,16 @@ bool squeryWithParser (const ParmParse::Table& table,\n const std::string& name,\n T& ref);\n \n-template <typename T, typename PARSER_t = std::conditional_t<std::is_integral_v<T>,\n+template <typename T, typename PARSER_t = std::conditional_t<std::is_integral_v<T>\n+ && !std::is_same_v<bool,T>,\n IParser, Parser>>\n PARSER_t\n pp_make_parser (std::string const& func, Vector<std::string> const& vars,\n ParmParse::Table const& table, std::string const& parser_prefix,\n bool use_querywithparser)\n {\n- using value_t = std::conditional_t<std::is_integral_v<T>, long long, double>;\n+ using value_t = std::conditional_t<std::is_integral_v<T> && !std::is_same_v<bool,T>,\n+ long long, double>;\n \n std::vector<std::string> prefixes;\n prefixes.reserve(3);\n@@ -2048,6 +2051,12 @@ bool squeryarrWithParser (const ParmParse::Table& table,\n }\n }\n \n+int\n+ParmParse::queryWithParser (const char* name, bool& ref) const\n+{\n+ return squeryWithParser(*m_table,m_parser_prefix,prefixedName(name),ref);\n+}\n+\n int\n ParmParse::queryWithParser (const char* name, int& ref) const\n {\n@@ -2078,6 +2087,12 @@ ParmParse::queryWithParser (const char* name, double& ref) const\n return squeryWithParser(*m_table,m_parser_prefix,prefixedName(name),ref);\n }\n \n+int\n+ParmParse::queryarrWithParser (const char* name, int nvals, bool* ref) const\n+{\n+ return squeryarrWithParser(*m_table,m_parser_prefix,prefixedName(name),nvals,ref);\n+}\n+\n int\n ParmParse::queryarrWithParser (const char* name, int nvals, int* ref) const\n {\n"}, "test": {"test_patch": "diff --git a/Tests/ParmParse/inputs b/Tests/ParmParse/inputs\nindex c7b5af019b7..d109fa5579a 100644\n--- a/Tests/ParmParse/inputs\n+++ b/Tests/ParmParse/inputs\n@@ -63,6 +63,11 @@ ny = nx\n \n do_this = 1\n \n+# query bool with parser\n+my_value = 10\n+my_threshold = 3\n+my_bool_flag = \"(my_threshold < my_value) and (my_value < 100)\"\n+\n # queryline and getline\n my_string_line = a b c\n \ndiff --git a/Tests/ParmParse/main.cpp b/Tests/ParmParse/main.cpp\nindex a367b1acaaa..1752d7f4833 100644\n--- a/Tests/ParmParse/main.cpp\n+++ b/Tests/ParmParse/main.cpp\n@@ -143,6 +143,14 @@ int main(int argc, char* argv[])\n pp.queryAsDouble(\"do_that\", o_do_that);\n AMREX_ALWAYS_ASSERT(!o_do_that.has_value());\n }\n+ {\n+ ParmParse pp;\n+ bool my_bool_flag_1 = false;\n+ bool my_bool_flag_2 = false;\n+ pp.queryAddWithParser(\"my_bool_flag\", my_bool_flag_1);\n+ pp.query(\"my_bool_flag\", my_bool_flag_2);\n+ AMREX_ALWAYS_ASSERT(my_bool_flag_1 && my_bool_flag_2);\n+ }\n {\n ParmParse pp;\n std::string line;\n", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}60{"question_id": "MSB_AMReX-Codes_amrex_pr4629", "question_type": "multi_swe_bench", "description": "Adding support to memory collection of Particles and MultiFabs within a grid (AMReX-Codes/amrex#4629)", "content": {"org": "AMReX-Codes", "repo": "amrex", "pr_number": 4629, "issue_title": "Adding support to memory collection of Particles and MultiFabs within a grid", "issue_body": "## Summary\r\nThis PR adds functions to return memory usage from `Particles` and `FabArray`/`MultiFabs` within a grid/box. The main goal is to use this information for load balancing. We aim to consider the memory allocated to a worker as a factor in the load-balancing algorithms for AMReX, so there is a need to capture specific grid/box memory information.\r\n\r\n## Additional background\r\n\r\n## Checklist\r\n\r\nThe proposed changes:\r\n- [ ] fix a bug or incorrect behavior in AMReX\r\n- [x] add new capabilities to AMReX\r\n- [ ] changes answers in the test suite to more than roundoff level\r\n- [ ] are likely to significantly affect the results of downstream AMReX users\r\n- [ ] include documentation in the code and/or rst files, if appropriate\r\n", "base_commit": "5dc1d96afb6cdb24ff71b6978edcdb80eb04a2a3", "resolved_issues": [{"number": 4629, "title": "Adding support to memory collection of Particles and MultiFabs within a grid", "body": "## Summary\r\nThis PR adds functions to return memory usage from `Particles` and `FabArray`/`MultiFabs` within a grid/box. The main goal is to use this information for load balancing. We aim to consider the memory allocated to a worker as a factor in the load-balancing algorithms for AMReX, so there is a need to capture specific grid/box memory information.\r\n\r\n## Additional background\r\n\r\n## Checklist\r\n\r\nThe proposed changes:\r\n- [ ] fix a bug or incorrect behavior in AMReX\r\n- [x] add new capabilities to AMReX\r\n- [ ] changes answers in the test suite to more than roundoff level\r\n- [ ] are likely to significantly affect the results of downstream AMReX users\r\n- [ ] include documentation in the code and/or rst files, if appropriate\r\n"}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/amrex-codes_m_amrex:pr-4629", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/Src/Base/AMReX_FabArray.H b/Src/Base/AMReX_FabArray.H\nindex 3588a8f0714..a47a9278f34 100644\n--- a/Src/Base/AMReX_FabArray.H\n+++ b/Src/Base/AMReX_FabArray.H\n@@ -817,6 +817,10 @@ public:\n template <class F=FAB, std::enable_if_t<IsBaseFab<F>::value,int> = 0>\n void setDomainBndry (value_type val, int strt_comp, int ncomp, const Geometry& geom);\n \n+ //! Get capacity of the FabArray\n+ template <typename I, class F=FAB, std::enable_if_t<IsBaseFab<F>::value && std::is_integral_v<I> && (sizeof(I) >= sizeof(Long)), int> = 0>\n+ void capacityOfFabs (LayoutData<I>& mem) const;\n+\n /**\n * \\brief Returns the sum of component \"comp\"\n *\n@@ -2506,6 +2510,17 @@ FabArray<FAB>::setDomainBndry (value_type val,\n }\n }\n \n+\n+template <class FAB>\n+template <typename I, class F, std::enable_if_t<IsBaseFab<F>::value && std::is_integral_v<I> && (sizeof(I) >= sizeof(Long)), int> FOO>\n+void\n+FabArray<FAB>::capacityOfFabs (LayoutData<I>& mem) const {\n+ AMREX_ASSERT(amrex::isMFIterSafe(*this, mem));\n+ for (MFIter mfi(*this, MFItInfo{}.DisableDeviceSync()); mfi.isValid(); ++mfi) {\n+ mem[mfi] += static_cast<I>((*this)[mfi].nBytesOwned());\n+ }\n+}\n+\n template <class FAB>\n template <class F, std::enable_if_t<IsBaseFab<F>::value,int> FOO>\n typename F::value_type\ndiff --git a/Src/Particle/AMReX_ParIter.H b/Src/Particle/AMReX_ParIter.H\nindex 39e5d1a9eda..459ff31757a 100644\n--- a/Src/Particle/AMReX_ParIter.H\n+++ b/Src/Particle/AMReX_ParIter.H\n@@ -93,6 +93,8 @@ public:\n \n [[nodiscard]] int numNeighborParticles () const { return GetParticleTile().numNeighborParticles(); }\n \n+ [[nodiscard]] Long capacity () const { return GetParticleTile().capacity(); }\n+\n [[nodiscard]] int GetLevel () const { return m_level; }\n \n [[nodiscard]] std::pair<int, int> GetPairIndex () const { return std::make_pair(this->index(), this->LocalTileIndex()); }\ndiff --git a/Src/Particle/AMReX_ParticleContainer.H b/Src/Particle/AMReX_ParticleContainer.H\nindex a6a05b28702..2397a7d4823 100644\n--- a/Src/Particle/AMReX_ParticleContainer.H\n+++ b/Src/Particle/AMReX_ParticleContainer.H\n@@ -578,6 +578,12 @@ public:\n \n Vector<Long> NumberOfParticlesInGrid (int level, bool only_valid = true, bool only_local = false) const;\n \n+ /**\n+ * \\brief Return capacity of memory for particles at specific grid\n+ */\n+ template <typename I, std::enable_if_t<std::is_integral_v<I> && (sizeof(I) >= sizeof(Long)), int> = 0>\n+ void CapacityOfParticlesInGrid (LayoutData<I>& mem, int lev) const;\n+\n /**\n * \\brief Returns # of particles at all levels\n *\ndiff --git a/Src/Particle/AMReX_ParticleContainerI.H b/Src/Particle/AMReX_ParticleContainerI.H\nindex 5927b0be7d0..aac96dad877 100644\n--- a/Src/Particle/AMReX_ParticleContainerI.H\n+++ b/Src/Particle/AMReX_ParticleContainerI.H\n@@ -586,6 +586,25 @@ Long ParticleContainer_impl<ParticleType, NArrayReal, NArrayInt, Allocator, Cell\n return nparticles;\n }\n \n+template <typename ParticleType, int NArrayReal, int NArrayInt,\n+ template<class> class Allocator, class CellAssignor>\n+template <typename I, std::enable_if_t<std::is_integral_v<I> && (sizeof(I) >= sizeof(Long)), int> FOO>\n+void\n+ParticleContainer_impl<ParticleType, NArrayReal, NArrayInt, Allocator, CellAssignor>::CapacityOfParticlesInGrid (LayoutData<I>& mem, int lev) const\n+{\n+ AMREX_ASSERT(lev >= 0 && lev < int(m_particles.size()));\n+\n+ AMREX_ASSERT(BoxArray::SameRefs(mem.boxArray(), ParticleBoxArray(lev)) &&\n+ mem.DistributionMap() == ParticleDistributionMap(lev));\n+\n+ [[maybe_unused]] Gpu::NoSyncRegion no_sync{};\n+ for (ParConstIterType pti(*this, lev); pti.isValid(); ++pti)\n+ {\n+ int gid = pti.index();\n+ mem[gid] += static_cast<I>(pti.capacity());\n+ }\n+}\n+\n //\n // This includes both valid and invalid particles since invalid particles still take up space.\n //\ndiff --git a/build_docs.sh b/build_docs.sh\nindex 774238037f7..33e3df7ae64 100755\n--- a/build_docs.sh\n+++ b/build_docs.sh\n@@ -7,6 +7,7 @@ cd Docs/Doxygen\n doxygen doxygen.conf &> doxygen.out\n if grep -q \"warning:\" doxygen.out; then\n echo \"Doxygen warnings detected! Failing...\"\n+ cat doxygen.out\n exit 1\n fi\n cd ../..\n"}, "test": {"test_patch": "diff --git a/Tests/CMakeLists.txt b/Tests/CMakeLists.txt\nindex 5e0877e6c24..3db6cccbf8d 100644\n--- a/Tests/CMakeLists.txt\n+++ b/Tests/CMakeLists.txt\n@@ -125,9 +125,9 @@ else()\n #\n # List of subdirectories to search for CMakeLists.\n #\n- set( AMREX_TESTS_SUBDIRS Amr AsyncOut CallNoinline CLZ CommType CTOParFor DeviceGlobal Enum\n- MultiBlock MultiPeriod ParmParse Parser Parser2 ParserUserFn Reinit\n- RoundoffDomain SmallMatrix)\n+ set( AMREX_TESTS_SUBDIRS Amr AsyncOut CallNoinline CLZ CommType CTOParFor DeviceGlobal\n+ Enum HeatEquation MultiBlock MultiPeriod ParmParse Parser\n+ Parser2 ParserUserFn Reinit RoundoffDomain SmallMatrix)\n \n if (AMReX_PARTICLES)\n list(APPEND AMREX_TESTS_SUBDIRS Particles)\ndiff --git a/Tests/HeatEquation/GNUmakefile b/Tests/HeatEquation/GNUmakefile\nnew file mode 100644\nindex 00000000000..3edbf32b70b\n--- /dev/null\n+++ b/Tests/HeatEquation/GNUmakefile\n@@ -0,0 +1,21 @@\n+# AMREX_HOME defines the directory in which we will find all the AMReX code.\n+AMREX_HOME ?= ../../../../amrex\n+\n+USE_ASSERTION = TRUE\n+\n+DEBUG = FALSE\n+USE_MPI = FALSE\n+USE_OMP = FALSE\n+PRECISION\t = FLOAT\n+COMP = gnu\n+DIM = 3\n+\n+include $(AMREX_HOME)/Tools/GNUMake/Make.defs\n+\n+include Make.package\n+# VPATH_LOCATIONS += ../Source\n+# INCLUDE_LOCATIONS += ../Source\n+\n+include $(AMREX_HOME)/Src/Base/Make.package\n+\n+include $(AMREX_HOME)/Tools/GNUMake/Make.rules\ndiff --git a/Tests/HeatEquation/Make.package b/Tests/HeatEquation/Make.package\nnew file mode 100644\nindex 00000000000..fa194a35db8\n--- /dev/null\n+++ b/Tests/HeatEquation/Make.package\n@@ -0,0 +1,2 @@\n+CEXE_sources += main.cpp\n+CEXE_headers += myfunc.H\ndiff --git a/Tests/HeatEquation/inputs b/Tests/HeatEquation/inputs\nnew file mode 100644\nindex 00000000000..af7ab2d4a3b\n--- /dev/null\n+++ b/Tests/HeatEquation/inputs\n@@ -0,0 +1,7 @@\n+n_cell = 32\n+max_grid_size = 16\n+\n+nsteps = 1000\n+plot_int = 0\n+\n+dt = 1.e-5\ndiff --git a/Tests/HeatEquation/main.cpp b/Tests/HeatEquation/main.cpp\nnew file mode 100644\nindex 00000000000..eb7850889f5\n--- /dev/null\n+++ b/Tests/HeatEquation/main.cpp\n@@ -0,0 +1,208 @@\n+#include <AMReX_PlotFileUtil.H>\n+#include <AMReX_ParmParse.H>\n+#include <AMReX_MultiFabUtil.H>\n+// #include <AMReX.H>\n+// #include <AMReX_FabArray.H>\n+\n+#include \"myfunc.H\"\n+\n+using namespace amrex;\n+\n+int main (int argc, char* argv[])\n+{\n+ amrex::Initialize(argc,argv);\n+\n+ main_main();\n+\n+ amrex::Finalize();\n+ return 0;\n+}\n+\n+void main_main ()\n+{\n+\n+ // **********************************\n+ // SIMULATION PARAMETERS\n+\n+ // number of cells on each side of the domain\n+ int n_cell;\n+\n+ // size of each box (or grid)\n+ int max_grid_size;\n+\n+ // total steps in simulation\n+ int nsteps;\n+\n+ // how often to write a plotfile\n+ int plot_int;\n+\n+ // time step\n+ Real dt;\n+\n+ // inputs parameters\n+ {\n+ // ParmParse is way of reading inputs from the inputs file\n+ // pp.get means we require the inputs file to have it\n+ // pp.query means we optionally need the inputs file to have it - but we must supply a default here\n+ ParmParse pp;\n+\n+ // We need to get n_cell from the inputs file - this is the number of cells on each side of\n+ // a square (or cubic) domain.\n+ pp.get(\"n_cell\",n_cell);\n+\n+ // The domain is broken into boxes of size max_grid_size\n+ pp.get(\"max_grid_size\",max_grid_size);\n+\n+ // Default nsteps to 10, allow us to set it to something else in the inputs file\n+ nsteps = 10;\n+ pp.query(\"nsteps\",nsteps);\n+\n+ // Default plot_int to -1, allow us to set it to something else in the inputs file\n+ // If plot_int < 0 then no plot files will be written\n+ plot_int = -1;\n+ pp.query(\"plot_int\",plot_int);\n+\n+ // time step\n+ pp.get(\"dt\",dt);\n+ }\n+\n+ // **********************************\n+ // SIMULATION SETUP\n+\n+ // make BoxArray and Geometry\n+ // ba will contain a list of boxes that cover the domain\n+ // geom contains information such as the physical domain size,\n+ // number of points in the domain, and periodicity\n+ BoxArray ba;\n+ Geometry geom;\n+\n+ // AMREX_D_DECL means \"do the first X of these, where X is the dimensionality of the simulation\"\n+ IntVect dom_lo(AMREX_D_DECL( 0, 0, 0));\n+ IntVect dom_hi(AMREX_D_DECL(n_cell-1, n_cell-1, n_cell-1));\n+\n+ // Make a single box that is the entire domain\n+ Box domain(dom_lo, dom_hi);\n+\n+ // Initialize the boxarray \"ba\" from the single box \"domain\"\n+ ba.define(domain);\n+\n+ // Break up boxarray \"ba\" into chunks no larger than \"max_grid_size\" along a direction\n+ ba.maxSize(max_grid_size);\n+\n+ // This defines the physical box, [0,1] in each direction.\n+ RealBox real_box({AMREX_D_DECL( 0., 0., 0.)},\n+ {AMREX_D_DECL( 1., 1., 1.)});\n+\n+ // periodic in all direction\n+ Array<int,AMREX_SPACEDIM> is_periodic{AMREX_D_DECL(1,1,1)};\n+\n+ // This defines a Geometry object\n+ geom.define(domain, real_box, CoordSys::cartesian, is_periodic);\n+\n+ // extract dx from the geometry object\n+ GpuArray<Real,AMREX_SPACEDIM> dx = geom.CellSizeArray();\n+\n+ // Nghost = number of ghost cells for each array\n+ int Nghost = 1;\n+\n+ // Ncomp = number of components for each array\n+ int Ncomp = 1;\n+\n+ // How Boxes are distributed among MPI processes\n+ DistributionMapping dm(ba);\n+\n+ // we allocate two phi multifabs; one will store the old state, the other the new.\n+ MultiFab phi_old(ba, dm, Ncomp, Nghost);\n+ MultiFab phi_new(ba, dm, Ncomp, Nghost);\n+\n+ // time = starting time in the simulation\n+ Real time = 0.0;\n+\n+ // **********************************\n+ // INITIALIZE DATA\n+\n+ // loop over boxes\n+ for (MFIter mfi(phi_old); mfi.isValid(); ++mfi)\n+ {\n+ const Box& bx = mfi.validbox();\n+\n+ const Array4<Real>& phiOld = phi_old.array(mfi);\n+\n+ // set phi = 1 + e^(-(r-0.5)^2)\n+ amrex::ParallelFor(bx, [=] AMREX_GPU_DEVICE(int i, int j, int k)\n+ {\n+ Real x = (i+0.5) * dx[0];\n+ Real y = (j+0.5) * dx[1];\n+#if (AMREX_SPACEDIM == 2)\n+ Real rsquared = ((x-0.5)*(x-0.5)+(y-0.5)*(y-0.5))/0.01;\n+#elif (AMREX_SPACEDIM == 3)\n+ Real z= (k+0.5) * dx[2];\n+ Real rsquared = ((x-0.5)*(x-0.5)+(y-0.5)*(y-0.5)+(z-0.5)*(z-0.5))/0.01;\n+#endif\n+ phiOld(i,j,k) = 1. + std::exp(-rsquared);\n+ });\n+ }\n+\n+ // Write a plotfile of the initial data if plot_int > 0\n+ if (plot_int > 0)\n+ {\n+ int step = 0;\n+ const std::string& pltfile = amrex::Concatenate(\"plt\",step,5);\n+ WriteSingleLevelPlotfile(pltfile, phi_old, {\"phi\"}, geom, time, 0);\n+ }\n+\n+ for (int step = 1; step <= nsteps; ++step)\n+ {\n+ // fill periodic ghost cells\n+ phi_old.FillBoundary(geom.periodicity());\n+\n+ // new_phi = old_phi + dt * Laplacian(old_phi)\n+ // loop over boxes\n+ for ( MFIter mfi(phi_old); mfi.isValid(); ++mfi )\n+ {\n+ const Box& bx = mfi.validbox();\n+\n+ const Array4<Real>& phiOld = phi_old.array(mfi);\n+ const Array4<Real>& phiNew = phi_new.array(mfi);\n+\n+ // advance the data by dt\n+ amrex::ParallelFor(bx, [=] AMREX_GPU_DEVICE (int i, int j, int k)\n+ {\n+ phiNew(i,j,k) = phiOld(i,j,k) + dt *\n+ ( (phiOld(i+1,j,k) - 2.*phiOld(i,j,k) + phiOld(i-1,j,k)) / (dx[0]*dx[0])\n+ +(phiOld(i,j+1,k) - 2.*phiOld(i,j,k) + phiOld(i,j-1,k)) / (dx[1]*dx[1])\n+#if (AMREX_SPACEDIM == 3)\n+ +(phiOld(i,j,k+1) - 2.*phiOld(i,j,k) + phiOld(i,j,k-1)) / (dx[2]*dx[2])\n+#endif\n+ );\n+ });\n+ }\n+\n+ // update time\n+ time = time + dt;\n+\n+ // copy new solution into old solution\n+ MultiFab::Copy(phi_old, phi_new, 0, 0, 1, 0);\n+\n+ // Tell the I/O Processor to write out which step we're doing\n+ amrex::Print() << \"Advanced step \" << step << \"\\n\";\n+\n+ // Write a plotfile of the current data (plot_int was defined in the inputs file)\n+ if (plot_int > 0 && step%plot_int == 0)\n+ {\n+ const std::string& pltfile = amrex::Concatenate(\"plt\",step,5);\n+ WriteSingleLevelPlotfile(pltfile, phi_new, {\"phi\"}, geom, time, step);\n+ }\n+ }\n+\n+ // Testing capacity function\n+ amrex::LayoutData<std::size_t> mem(ba, dm);\n+ phi_old.capacityOfFabs(mem);\n+ phi_new.capacityOfFabs(mem);\n+\n+ long total_bytes = 0;\n+ for (amrex::MFIter mfi(mem); mfi.isValid(); ++mfi) {\n+ amrex::Print() << \"Box \" << mfi.index() << \" uses \"\n+ << mem[mfi] << \" bytes\\n\";\n+ }\n+}\ndiff --git a/Tests/HeatEquation/myfunc.H b/Tests/HeatEquation/myfunc.H\nnew file mode 100644\nindex 00000000000..0f828c4e180\n--- /dev/null\n+++ b/Tests/HeatEquation/myfunc.H\n@@ -0,0 +1,6 @@\n+#ifndef MYFUNC_H_\n+#define MYFUNC_H_\n+\n+void main_main ();\n+\n+#endif\ndiff --git a/Tests/Particles/NeighborList/main.cpp b/Tests/Particles/NeighborList/main.cpp\nindex 359f784d538..ec3f680e997 100644\n--- a/Tests/Particles/NeighborList/main.cpp\n+++ b/Tests/Particles/NeighborList/main.cpp\n@@ -138,4 +138,13 @@ void testNeighborList ()\n auto& nlist2 = neighbors_type_2[0][std::make_pair(gid, tid)];\n nlist2.print();\n }\n+\n+ LayoutData<std::size_t> mem(ba, dm);\n+ pc1.CapacityOfParticlesInGrid(mem, 0);\n+\n+ Vector<Long> particles_in_grid = pc1.NumberOfParticlesInGrid(0, false,true);\n+ for (amrex::MFIter mfi(mem); mfi.isValid(); ++mfi) {\n+ amrex::Print() << \"Box \" << mfi.index() << \" uses \"\n+ << mem[mfi] << \" bytes and have \" << particles_in_grid[mfi.LocalIndex()] << \" particles\\n\";\n+ }\n }\n", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}61{"question_id": "MSB_AMReX-Codes_amrex_pr78", "question_type": "multi_swe_bench", "description": "trying to get bug fixes for DivergenceOp into weiqun/eb branch (AMReX-Codes/amrex#78)", "content": {"org": "AMReX-Codes", "repo": "amrex", "pr_number": 78, "issue_title": "trying to get bug fixes for DivergenceOp into weiqun/eb branch", "issue_body": "", "base_commit": "2e92a6c52bd15ea82ac3364c2da5adb5ca887e6e", "resolved_issues": [{"number": 77, "title": "getting some bug fixes over to development branch", "body": ""}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/amrex-codes_m_amrex:pr-78", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/Src/EBAMRElliptic/AMReX_AMREBMultiGrid.H b/Src/EBAMRElliptic/AMReX_AMREBMultiGrid.H\nindex cc806d29845..c2cc7c4b086 100644\n--- a/Src/EBAMRElliptic/AMReX_AMREBMultiGrid.H\n+++ b/Src/EBAMRElliptic/AMReX_AMREBMultiGrid.H\n@@ -71,6 +71,22 @@ namespace amrex\n AMRLevelOp<T>* a_finerOp) = 0;\n \n ///\n+ /**\n+ a_residual = a_rhs - L^nf(a_phi, a_phiCoarse)\n+ assume no finer AMR level\n+ */\n+ virtual void AMRResidualNF(T& a_residual, const T& a_phi, const T& a_phiCoarse,\n+ const T& a_rhs, bool a_homogeneousBC) = 0;\n+\n+ ///\n+ /**\n+ a_residual = a_rhs - L(a_phiFine, a_phi)\n+ assume no coarser AMR level\n+ */\n+ virtual void AMRResidualNC(T& a_residual, const T& a_phiFine, const T& a_phi,\n+ const T& a_rhs, bool a_homogeneousBC,\n+ AMRLevelOp<T>* a_finerOp) = 0;\n+ ///\n /**\n Apply the AMR operator, including coarse-fine matching\n */\n@@ -165,7 +181,7 @@ namespace amrex\n virtual void define(const Box & a_coarseDomain,\n AMRLevelOpFactory<T> & a_factory,\n shared_ptr<LinearSolver<T> > & a_bottomSolver,\n- std::vector<int> & a_refRat,\n+ const std::vector<int> & a_refRat,\n bool a_enableLevelSolves,\n int a_numLevels);\n \n@@ -322,9 +338,9 @@ namespace amrex\n std::vector<T*> m_residual;\n std::vector<T*> m_resC;\n \n- NoOpSolver<T> m_nosolve;\n+ shared_ptr<LinearSolver<T> > m_nosolve;\n \n- LinearSolver<T>* m_bottomSolver;\n+ shared_ptr<LinearSolver<T> > m_bottomSolver;\n \n std::vector<char> m_hasInitBeenCalled;\n \n@@ -841,18 +857,6 @@ namespace amrex\n // clean const out\n }\n \n- // For solvers with accuracy higher than 2nd order\n- // consistency between levels has to be explicitly enforced.\n- // Qinghai Zhang\n- if (m_op[0]->orderOfAccuracy()>2)\n- {\n- for (int ilev=l_max; ilev>l_base; ilev--)\n- {\n- m_op[ilev]->enforceCFConsistency(*a_phi[ilev-1], *a_phi[ilev]);\n- }\n- }\n- //------end enforcing consistency.\n-\n //recompute residual\n rnorm = computeAMRResidual(uberResidual, a_phi, a_rhs, l_max, l_base, a_forceHomogeneous, true);\n iter++;\n@@ -993,7 +997,7 @@ namespace amrex\n m_mg[ilev]->m_post = m_post;\n m_mg[ilev]->m_bottom = m_bottom;\n }\n- m_mg[ilev]->m_bottomSolver = &m_nosolve;\n+ m_mg[ilev]->m_bottomSolver = m_nosolve;\n }\n \n m_mg[l_base]->setBottomSolver(m_bottomSolver);\n@@ -1011,7 +1015,7 @@ namespace amrex\n void AMREBMultiGrid<T>::define(const Box& a_coarseDomain,\n AMRLevelOpFactory<T>& a_factory,\n shared_ptr<LinearSolver<T> > & a_bottomSolver,\n- vector<int> & a_refRat,\n+ const vector<int> & a_refRat,\n bool a_enableLevelSolves,\n int a_maxAMRLevels)\n {\n@@ -1022,7 +1026,7 @@ namespace amrex\n m_op.resize( a_maxAMRLevels, NULL);\n m_mg.resize( a_maxAMRLevels, NULL);\n m_hasInitBeenCalled.resize(a_maxAMRLevels, 'f');\n-\n+ m_nosolve = shared_ptr<LinearSolver<T> >(static_cast<LinearSolver<T>*>(new NoOpSolver<T>));\n m_correction.resize( a_maxAMRLevels, NULL);\n m_residual. resize( a_maxAMRLevels, NULL);\n m_resC. resize( a_maxAMRLevels, NULL);\n@@ -1043,7 +1047,7 @@ namespace amrex\n }\n if((i==0) || (refToCoarser > 2) || a_enableLevelSolves)\n {\n- m_mg[i]->define(a_factory, &m_nosolve, current, m_maxDepth, m_op[i]);\n+ m_mg[i]->define(a_factory, m_nosolve, current, m_maxDepth);\n }\n \n // Only do this if it will be used (avoiding a reference to invalid\n@@ -1065,7 +1069,7 @@ namespace amrex\n {\n for (int level = l_base; level <= l_max; level++)\n {\n- m_op[level]->assignLocal(*m_residual[level], *a_uberResidual[level]);\n+ m_op[level]->assign(*m_residual[level], *a_uberResidual[level]);\n m_op[level]->setToZero(*m_correction[level]);\n }\n }\n@@ -1099,11 +1103,10 @@ namespace amrex\n true);\n \n // Compute the restriction of the residual to the coarser level resC.\n- m_op[ilev]->AMRRestrictS(*(m_resC[ilev]),\n- *(m_residual[ilev]),\n- *(m_correction[ilev]),\n- *(m_correction[ilev-1]),\n- *(a_uberCorrection[ilev]));\n+ m_op[ilev]->AMRRestrict(*(m_resC[ilev]),\n+ *(m_residual[ilev]),\n+ *(m_correction[ilev]),\n+ *(m_correction[ilev-1]));\n \n // Overwrite residual on the valid region of the next coarser level\n // with coarsened residual from this level\n@@ -1119,8 +1122,7 @@ namespace amrex\n //================= Upsweep ======================\n //increment the correction with coarser version\n //m_op[ilev]->AMRProlong(*(m_correction[ilev]), *(m_correction[ilev-1]));\n- m_op[ilev]->AMRProlongS(*(m_correction[ilev]), *(m_correction[ilev-1]),\n- *m_resC[ilev]);\n+ m_op[ilev]->AMRProlong(*(m_correction[ilev]), *(m_correction[ilev-1]));\n //recompute residual\n m_op[ilev]->AMRUpdateResidual(*(m_residual[ilev]), *(m_correction[ilev]), *(m_correction[ilev-1]));\n \n@@ -1132,7 +1134,7 @@ namespace amrex\n //correct the correction with the correction to the correction\n m_op[ilev]->incr(*(m_correction[ilev]), dCorr, 1.0);\n \n- m_op[ilev]->assignLocal(*(a_uberCorrection[ilev]), *(m_correction[ilev]));\n+ m_op[ilev]->assign(*(a_uberCorrection[ilev]), *(m_correction[ilev]));\n }\n }\n \ndiff --git a/Src/EBAMRElliptic/AMReX_ConductivityBaseEBBC.H b/Src/EBAMRElliptic/AMReX_ConductivityBaseEBBC.H\nindex 3f572055f5c..a29ab9f11ab 100644\n--- a/Src/EBAMRElliptic/AMReX_ConductivityBaseEBBC.H\n+++ b/Src/EBAMRElliptic/AMReX_ConductivityBaseEBBC.H\n@@ -152,7 +152,7 @@ namespace amrex\n ///\n /**\n */\n- virtual ConductivityBaseEBBC* new_object_ptr();\n+ virtual ConductivityBaseEBBC* new_object_ptr() = 0;\n \n ///\n void\ndiff --git a/Src/EBAMRElliptic/AMReX_DirichletConductivityDomainBC.H b/Src/EBAMRElliptic/AMReX_DirichletConductivityDomainBC.H\nindex 191a6c87cdb..5137b25e6a8 100644\n--- a/Src/EBAMRElliptic/AMReX_DirichletConductivityDomainBC.H\n+++ b/Src/EBAMRElliptic/AMReX_DirichletConductivityDomainBC.H\n@@ -25,13 +25,11 @@ namespace amrex\n {\n \n public:\n- DirichletConductivityDomainBC()\n- {\n- }\n+ DirichletConductivityDomainBC();\n+\n+\n+ virtual ~DirichletConductivityDomainBC();\n \n- virtual ~DirichletConductivityDomainBC()\n- {\n- }\n \n ///\n virtual void \n@@ -59,13 +57,6 @@ namespace amrex\n const Side::LoHiSide& a_side,\n const bool& a_useHomogeneous);\n \n- ///\n- virtual void \n- fillPhiGhost(FArrayBox& a_phi,\n- const Box& a_valid,\n- const Box& a_domain,\n- Real a_dx,\n- bool a_homogeneous);\n private:\n };\n \ndiff --git a/Src/EBAMRElliptic/AMReX_DirichletConductivityDomainBC.cpp b/Src/EBAMRElliptic/AMReX_DirichletConductivityDomainBC.cpp\nindex af5d42c2ef3..979f1c62f25 100644\n--- a/Src/EBAMRElliptic/AMReX_DirichletConductivityDomainBC.cpp\n+++ b/Src/EBAMRElliptic/AMReX_DirichletConductivityDomainBC.cpp\n@@ -14,13 +14,21 @@\n \n namespace amrex\n {\n+/*****/\n+ DirichletConductivityDomainBC::\n+ DirichletConductivityDomainBC()\n+ {\n+ }\n+/*****/\n+ DirichletConductivityDomainBC::\n+ ~DirichletConductivityDomainBC()\n+ {\n+ }\n /*****/\n void \n DirichletConductivityDomainBC::\n fillPhiGhost(FArrayBox& a_phi,\n const Box& a_valid,\n- const Box& a_domain,\n- Real a_dx,\n bool a_homogeneous)\n {\n Box grownBox = a_valid;\n@@ -34,14 +42,14 @@ namespace amrex\n choppedBox.grow(idir,-1);\n Box toRegion = EBArith::adjCellBox(choppedBox, idir, sit(), 1);\n \n- if(!a_domain.contains(toRegion))\n+ if(!m_eblg.getDomain().contains(toRegion))\n {\n for (BoxIterator bit(toRegion); bit.ok(); ++bit)\n {\n const IntVect& iv = bit();\n //fake vof just to get the location\n VolIndex vof(iv, 0);\n- RealVect loc = EBArith::getVoFLocation(vof, a_dx, RealVect::Zero);\n+ RealVect loc = EBArith::getVoFLocation(vof, m_dx, RealVect::Zero);\n int isign = sign(sit());\n IntVect ivneigh = iv - isign*BASISV(idir);\n Real value = bcvaluefunc(loc, idir, sit());\ndiff --git a/Src/EBAMRElliptic/AMReX_DirichletConductivityEBBC.H b/Src/EBAMRElliptic/AMReX_DirichletConductivityEBBC.H\nindex 4a6bed111a0..c249e2fd40b 100644\n--- a/Src/EBAMRElliptic/AMReX_DirichletConductivityEBBC.H\n+++ b/Src/EBAMRElliptic/AMReX_DirichletConductivityEBBC.H\n@@ -113,7 +113,14 @@ namespace amrex\n }\n \n ///\n- virtual ~DirichletConductivityEBBCFactory();\n+ virtual ~DirichletConductivityEBBCFactory()\n+ {\n+ }\n+\n+ void setOrder(int a_order)\n+ {\n+ m_order = a_order;\n+ }\n \n ///\n virtual ConductivityBaseEBBC* new_object_ptr()\ndiff --git a/Src/EBAMRElliptic/AMReX_EBConductivityOp.H b/Src/EBAMRElliptic/AMReX_EBConductivityOp.H\nindex 84c46b9ce2c..9e639560719 100644\n--- a/Src/EBAMRElliptic/AMReX_EBConductivityOp.H\n+++ b/Src/EBAMRElliptic/AMReX_EBConductivityOp.H\n@@ -346,8 +346,7 @@ namespace amrex\n virtual void AMRRestrict(FabArray<EBCellFAB>& a_resCoarse,\n const FabArray<EBCellFAB>& a_residual,\n const FabArray<EBCellFAB>& a_correction,\n- const FabArray<EBCellFAB>& a_coarseCorrection, \n- bool a_skip_res = false );\n+ const FabArray<EBCellFAB>& a_coarseCorrection);\n \n ///\n /** a_correction += I[2h->h](a_coarseCorrection) */\ndiff --git a/Src/EBAMRElliptic/AMReX_EBConductivityOp.cpp b/Src/EBAMRElliptic/AMReX_EBConductivityOp.cpp\nindex 681d6597750..013b50a0aa8 100644\n--- a/Src/EBAMRElliptic/AMReX_EBConductivityOp.cpp\n+++ b/Src/EBAMRElliptic/AMReX_EBConductivityOp.cpp\n@@ -11,6 +11,7 @@\n \n #include \"AMReX_EBConductivityOp.H\"\n #include \"AMReX_EBEllipticFort_F.H\"\n+#include \"AMReX_IrregFABFactory.H\"\n namespace amrex\n {\n \n@@ -345,31 +346,29 @@ namespace amrex\n m_domainBC->setCoef(m_eblg, fakeBeta , m_dx, RealVect::Zero, m_bcoef);\n m_ebBC->setCoef( m_eblg, fakeBeta , m_dx, RealVect::Zero, m_bcoef);\n \n- Real dxScale = 1.0/m_dx;\n-\n LayoutData<BaseIVFAB<VoFStencil> >* fluxStencil = m_ebBC->getFluxStencil(0);\n-\n- m_vofIterIrreg.define( m_eblg.getDBL(), m_eblg.getDM()); // vofiterator cache\n- m_vofIterMulti.define( m_eblg.getDBL(), m_eblg.getDM()); // vofiterator cache\n- m_alphaDiagWeight.define( m_eblg.getDBL(), m_eblg.getDM());\n- m_betaDiagWeight.define( m_eblg.getDBL(), m_eblg.getDM());\n+ IrregFABFactory irregFact(m_eblg.getEBISL());\n+ m_vofIterIrreg.define( m_eblg.getDBL(), m_eblg.getDM()); // vofiterator cache\n+ m_vofIterMulti.define( m_eblg.getDBL(), m_eblg.getDM()); // vofiterator cache\n+ m_alphaDiagWeight.define( m_eblg.getDBL(), m_eblg.getDM(), 1, 0, MFInfo(), irregFact);\n+ m_betaDiagWeight.define( m_eblg.getDBL(), m_eblg.getDM(), 1, 0, MFInfo(), irregFact);\n Box sideBoxLo[SpaceDim];\n Box sideBoxHi[SpaceDim];\n for (int idir = 0; idir < SpaceDim; idir++)\n {\n- Box domainBox = m_eblg.getDomain().domainBox();\n+ Box domainBox = m_eblg.getDomain();\n sideBoxLo[idir] = adjCellLo(domainBox, idir, 1);\n sideBoxLo[idir].shift(idir, 1);\n sideBoxHi[idir] = adjCellHi(domainBox, idir, 1);\n sideBoxHi[idir].shift(idir, -1);\n- m_vofIterDomLo[idir].define( m_eblg.getDBL()); // vofiterator cache for domain lo\n- m_vofIterDomHi[idir].define( m_eblg.getDBL()); // vofiterator cache for domain hi\n+ m_vofIterDomLo[idir].define( m_eblg.getDBL(), m_eblg.getDM()); // vofiterator cache for domain lo\n+ m_vofIterDomHi[idir].define( m_eblg.getDBL(), m_eblg.getDM()); // vofiterator cache for domain hi\n }\n EBArith::getMultiColors(m_colors);\n \n EBCellFactory fact(m_eblg.getEBISL()); \n- FabArray<EBCellFAB> phiProxy(m_eblg.getDBL(), , m_eblg.getDM(), SpaceDim, m_ghostPhi, MFInfo(), fact);\n- FabArray<EBCellFAB> rhsProxy(m_eblg.getDBL(), , m_eblg.getDM(), SpaceDim, m_ghostRHS, MFInfo(), fact);\n+ FabArray<EBCellFAB> phiProxy(m_eblg.getDBL(), m_eblg.getDM(), SpaceDim, m_ghostPhi, MFInfo(), fact);\n+ FabArray<EBCellFAB> rhsProxy(m_eblg.getDBL(), m_eblg.getDM(), SpaceDim, m_ghostRHS, MFInfo(), fact);\n \n for(MFIter mfi(m_eblg.getDBL(), m_eblg.getDM()); mfi.isValid(); ++mfi)\n {\n@@ -381,8 +380,6 @@ namespace amrex\n IntVectSet multiIVS = ebisBox.getMultiCells(curBox);\n \n //cache the vofIterators\n- m_alphaDiagWeight[mfi].define(irregIVS,ebgraph, 1);\n- m_betaDiagWeight [mfi].define(irregIVS,ebgraph, 1);\n m_vofIterIrreg [mfi].define(irregIVS,ebgraph);\n m_vofIterMulti [mfi].define(multiIVS,ebgraph);\n \n@@ -397,7 +394,7 @@ namespace amrex\n }\n \n VoFIterator & vofit = m_vofIterIrreg[mfi];\n- const vector<VolIndex>& vofvec = vofit.getvector();\n+ const vector<VolIndex>& vofvec = vofit.getVector();\n vector<VoFStencil> stenvec(vofvec.size());\n \n // cast from VolIndex to BaseIndex\n@@ -407,7 +404,7 @@ namespace amrex\n \n for(int ivec = 0; ivec < vofvec.size(); ivec++)\n {\n- const VolIndex& vof = vofvec[ivec];\n+ VolIndex & vof = (VolIndex &)(vofvec[ivec]);\n VoFStencil& vofsten = stenvec[ivec];\n \n //bcoef is included here in the flux consistent\n@@ -483,7 +480,7 @@ namespace amrex\n if (m_hasFine)\n {\n int ncomp = 1;\n- m_fastFR.define(m_eblgFine, m_eblg, m_refToFine, ncomp, s_forceNoEBCF);\n+ m_fastFR.define(m_eblgFine, m_eblg, m_refToFine, ncomp);\n }\n \n }\n@@ -511,7 +508,7 @@ namespace amrex\n const FabArray<EBCellFAB>& a_rhs)\n {\n BL_PROFILE(\"EBConductivityOp::preCond\");\n- EBLevelDataOps::assign(a_lhs, a_rhs);\n+ EBLevelDataOps::assign(a_lhs, a_rhs, 1.0);\n EBLevelDataOps::scale(a_lhs, m_relCoef);\n \n relax(a_lhs, a_rhs, 40);\n@@ -530,12 +527,11 @@ namespace amrex\n {\n if(a_homogeneousCFBC)\n {\n- m_cfInterp->coarseFineInterpH(phi, 0, 0, 1);\n+ m_cfInterp.coarseFineInterpH(phi, 0, 0, 1);\n }\n else\n {\n- m_cfInterp->coarseFineInterp(phi, *a_phiCoar, 0, 0, 1);\n- // dumpEBLevelGhost(&phi);\n+ m_cfInterp.coarseFineInterp(phi, *a_phiCoar, 0, 0, 1);\n }\n }\n applyOp(a_lhs, a_phi, a_homogeneousPhysBC);\n@@ -551,14 +547,13 @@ namespace amrex\n FabArray<EBCellFAB>& phi = (FabArray<EBCellFAB>&) a_phi;\n {\n BL_PROFILE(\"ghostcell fills\");\n- fillPhiGhost(a_phi, a_homogeneous);\n+ fillPhiGhost(phi, a_homogeneous);\n }\n \n {\n BL_PROFILE(\"applying op without bcs\");\n- for(MFIter mfi(m_eblg.getDBL(); mfi.getDM()); mfi.isValid(); ++mfi)\n+ for(MFIter mfi(m_eblg.getDBL(), m_eblg.getDM()); mfi.isValid(); ++mfi)\n {\n-\n applyOpRegular( a_lhs[mfi], a_phi[mfi], a_homogeneous, mfi);\n applyOpIrregular(a_lhs[mfi], a_phi[mfi], a_homogeneous, mfi);\n }\n@@ -570,7 +565,7 @@ namespace amrex\n fillPhiGhost(const FabArray<EBCellFAB>& a_phi, bool a_homog) const\n {\n BL_PROFILE(\"nwoebco::fillghostLD\");\n- for(MFIter mfi(m_eblg.getDBL(); mfi.getDM()); mfi.isValid(); ++mfi)\n+ for(MFIter mfi(m_eblg.getDBL(), m_eblg.getDM()); mfi.isValid(); ++mfi)\n {\n fillPhiGhost(a_phi[mfi], mfi, a_homog);\n }\n@@ -587,7 +582,7 @@ namespace amrex\n EBCellFAB& phi = (EBCellFAB&) a_phi;\n ConductivityBaseDomainBC* condbc = dynamic_cast<ConductivityBaseDomainBC*>(&(*m_domainBC));\n Box grid = m_eblg.getDBL()[a_datInd];\n- Box domBox = m_eblg.getDomain().domainBox();\n+ Box domBox = m_eblg.getDomain();\n if(condbc == NULL)\n {\n amrex::Error(\"dynamic cast failed\");\n@@ -595,7 +590,7 @@ namespace amrex\n if (!m_turnOffBCs)\n {\n FArrayBox& fab = phi.getFArrayBox();\n- condbc->fillPhiGhost(fab, grid, domBox, m_dx, a_homog);\n+ condbc->fillPhiGhost(fab, grid, a_homog);\n }\n else\n {\n@@ -663,9 +658,8 @@ namespace amrex\n if (!a_homogeneous)\n {\n const Real factor = m_beta/m_dx;\n- m_ebBC->applyEBFlux(a_lhs, a_phi, m_vofIterIrreg[a_datInd], (*m_eblg.getCFIVS()),\n- a_datInd, RealVect::Zero, vectDx, factor,\n- a_homogeneous, 0.0);\n+ m_ebBC->applyEBFlux(a_lhs, a_phi, m_vofIterIrreg[a_datInd].getVector(), \n+ a_datInd, factor, a_homogeneous);\n }\n \n for (int idir = 0; idir < SpaceDim; idir++)\n@@ -675,9 +669,8 @@ namespace amrex\n {\n Real flux;\n const VolIndex& vof = m_vofIterDomLo[idir][a_datInd]();\n- m_domainBC->getFaceFlux(flux,vof,comp,a_phi,\n- RealVect::Zero,vectDx,idir,Side::Lo, a_datInd, 0.0,\n- a_homogeneous);\n+ m_domainBC->getFaceFlux(flux,vof, a_datInd, a_phi,\n+ idir,Side::Lo, a_homogeneous);\n \n //area gets multiplied in by bc operator\n a_lhs(vof,comp) -= flux*m_beta/m_dx;\n@@ -686,9 +679,8 @@ namespace amrex\n {\n Real flux;\n const VolIndex& vof = m_vofIterDomHi[idir][a_datInd]();\n- m_domainBC->getFaceFlux(flux,vof,comp,a_phi,\n- RealVect::Zero,vectDx,idir,Side::Hi,a_datInd,0.0,\n- a_homogeneous);\n+ m_domainBC->getFaceFlux(flux,vof, a_datInd, a_phi,\n+ idir,Side::Hi, a_homogeneous);\n \n //area gets multiplied in by bc operator\n a_lhs(vof,comp) += flux*m_beta/m_dx;\n@@ -724,7 +716,7 @@ namespace amrex\n EBLevelGrid eblgCoFi;\n coarsen(eblgCoFi, m_eblg, a_refRat);\n \n- EBCellFactory ebcellfactCoFi(elgCoFi.getEBISL());\n+ EBCellFactory ebcellfactCoFi(eblgCoFi.getEBISL());\n a_lhs.define(eblgCoFi.getDBL(), eblgCoFi.getDM(), ncomp, ghost, MFInfo(), ebcellfactCoFi);\n }\n //-------------------------------------------------------------------------------\n@@ -734,7 +726,7 @@ namespace amrex\n const FabArray<EBCellFAB>& a_rhs)\n {\n BL_PROFILE(\"ebco::assign\");\n- EBLevelDataOps::assign(a_lhs,a_rhs);\n+ EBLevelDataOps::assign(a_lhs,a_rhs, 1.0);\n }\n //-------------------------------------------------------------------------------\n Real\n@@ -791,7 +783,6 @@ namespace amrex\n \n maxNorm = localMaxNorm(a_rhs);\n \n- CH_START(t1);\n #ifdef BL_USE_MPI\n Real tmp = 1.;\n int result = MPI_Allreduce(&maxNorm, &tmp, 1, MPI_CH_REAL,\n@@ -804,7 +795,6 @@ namespace amrex\n #endif\n // Real volume=1.;\n // EBLevelDataOps::gatherBroadCast(maxNorm, volume, 0);\n- CH_STOP(t1);\n \n return maxNorm;\n }\n@@ -824,7 +814,7 @@ namespace amrex\n setToZero(FabArray<EBCellFAB>& a_lhs)\n {\n BL_PROFILE(\"ebco::setToZero\");\n- EBLevelDataOps::setToZero(a_lhs);\n+ EBLevelDataOps::setVal(a_lhs, 0.0);\n }\n //-------------------------------------------------------------------------------\n void\n@@ -855,9 +845,9 @@ namespace amrex\n int a_iterations)\n {\n BL_PROFILE(\"nwoebco::relax\");\n- BL_ASSERT(a_phi.isDefined());\n- BL_ASSERT(a_rhs.isDefined());\n- BL_ASSERT(a_phi.nGrow() >= IntVect::Unit);\n+ BL_ASSERT(a_phi.nGrow() == m_ghostPhi);\n+ BL_ASSERT(a_rhs.nGrow() == m_ghostRHS);\n+ BL_ASSERT(a_phi.nComp() == 1);\n BL_ASSERT(a_phi.nComp() == a_rhs.nComp());\n \n // do first red, then black passes\n@@ -867,12 +857,10 @@ namespace amrex\n {\n //after this lphi = L(phi)\n //this call contains bcs and exchange\n- if ((icolor == 0) || (!s_doLazyRelax))\n- {\n- BL_PROFILE(\"ghostfill and homogcfinterp\");\n- fillPhiGhost(a_phi, true);\n- homogeneousCFInterp(a_phi);\n- }\n+ BL_PROFILE(\"ghostfill and homogcfinterp\");\n+ fillPhiGhost(a_phi, true);\n+ homogeneousCFInterp(a_phi);\n+\n gsrbColor(a_phi, a_rhs, m_colors[icolor]);\n }\n }\n@@ -886,7 +874,7 @@ namespace amrex\n BL_PROFILE(\"nwoebco::homog_cfinterp\");\n if (m_hasCoar)\n {\n- m_cfInterp->coarseFineInterpH(a_phif, 0, 0, 1);\n+ m_cfInterp.coarseFineInterpH(a_phif, 0, 0, 1);\n }\n }\n \n@@ -972,23 +960,16 @@ namespace amrex\n bool homogeneous = true;\n \n EBCellFactory ebcellfactTL(m_eblg.getEBISL());\n- IntVect ghostVec = a_rhsThisLevel.nGrow();\n+ int ghost = a_rhsThisLevel.nGrow();\n \n- resThisLevel.define(m_eblg.getDBL(), 1, ghostVec, ebcellfactTL);\n+ resThisLevel.define(m_eblg.getDBL(), m_eblg.getDM(), 1, ghost, MFInfo(), ebcellfactTL);\n \n // Get the residual on the fine grid\n residual(resThisLevel,a_phiThisLevel,a_rhsThisLevel,homogeneous);\n \n // now use our nifty averaging operator\n- Interval variables(0, 0);\n- if (m_layoutChanged)\n- {\n- m_ebAverageMG.average(a_resCoar, resThisLevel, variables);\n- }\n- else\n- {\n- m_ebAverageMG.averageMG(a_resCoar, resThisLevel, variables);\n- }\n+ m_ebAverageMG.average(a_resCoar, resThisLevel, 0, 0, 1);\n+\n }\n //-------------------------------------------------------------------------------\n void EBConductivityOp::\n@@ -996,15 +977,7 @@ namespace amrex\n const FabArray<EBCellFAB>& a_correctCoar)\n {\n BL_PROFILE(\"EBConductivityOp::prolongIncrement\");\n- Interval vars(0, 0);\n- if (m_layoutChanged)\n- {\n- m_ebInterpMG.pwcInterp(a_phiThisLevel, a_correctCoar, vars);\n- }\n- else\n- {\n- m_ebInterpMG.pwcInterpMG(a_phiThisLevel, a_correctCoar, vars);\n- }\n+ m_ebInterpMG.interpolate(a_phiThisLevel, a_correctCoar, 0, 0, 1);\n }\n //-------------------------------------------------------------------------------\n int EBConductivityOp::\n@@ -1028,25 +1001,19 @@ namespace amrex\n bool a_homogeneousPhysBC,\n AMRLevelOp<FabArray<EBCellFAB> >* a_finerOp)\n {\n- BL_PROFILERS(\"EBConductivityOp::AMRResidual\");\n- BL_PROFILER(\"AMROperator\", t1);\n- BL_PROFILER(\"axby\", t2);\n+ BL_PROFILE(\"EBConductivityOp::AMRResidual\");\n BL_ASSERT(a_residual.nGrow() == m_ghostRHS);\n BL_ASSERT(a_rhs.nGrow() == m_ghostRHS);\n BL_ASSERT(a_residual.nComp() == 1);\n BL_ASSERT(a_phi.nComp() == 1);\n BL_ASSERT(a_rhs.nComp() == 1);\n \n- CH_START(t1);\n AMROperator(a_residual, a_phiFine, a_phi, a_phiCoar,\n a_homogeneousPhysBC, a_finerOp);\n- CH_STOP(t1);\n \n //multiply by -1 so a_residual now holds -L(phi)\n //add in rhs so a_residual = rhs - L(phi)\n- CH_START(t2);\n axby(a_residual,a_residual,a_rhs,-1.0, 1.0);\n- CH_STOP(t2);\n }\n //-------------------------------------------------------------------------------\n void EBConductivityOp::\n@@ -1057,27 +1024,20 @@ namespace amrex\n bool a_homogeneousPhysBC,\n AMRLevelOp<FabArray<EBCellFAB> >* a_finerOp)\n {\n- BL_PROFILERS(\"EBConductivityOp::AMROperator\");\n- BL_PROFILER(\"applyOp\", t1);\n- BL_PROFILER(\"reflux\", t2);\n+ BL_PROFILE(\"EBConductivityOp::AMROperator\");\n BL_ASSERT(a_LofPhi.nGrow() == m_ghostRHS);\n BL_ASSERT(a_LofPhi.nComp() == 1);\n BL_ASSERT(a_phi.nComp() == 1);\n \n //apply the operator between this and the next coarser level.\n- CH_START(t1);\n applyOp(a_LofPhi, a_phi, &a_phiCoar, a_homogeneousPhysBC, false);\n- CH_STOP(t1);\n+\n \n //now reflux to enforce flux-matching from finer levels\n if (m_hasFine)\n {\n BL_ASSERT(a_finerOp != NULL);\n- CH_START(t2);\n-\n reflux(a_LofPhi, a_phiFine, a_phi, a_finerOp);\n-\n- CH_STOP(t2);\n }\n }\n //-------------------------------------------------------------------------------\n@@ -1088,29 +1048,17 @@ namespace amrex\n const FabArray<EBCellFAB>& a_phi,\n AMRLevelOp<FabArray<EBCellFAB> >* a_finerOp)\n {\n- BL_PROFILERS(\"EBConductivityOp::fastReflux\");\n- BL_PROFILER(\"setToZero\",t2);\n- BL_PROFILER(\"incrementCoar\",t3);\n- BL_PROFILER(\"incrementFine\",t4);\n- BL_PROFILER(\"reflux_from_reg\",t5);\n- Interval interv(0,0);\n-\n- CH_START(t2);\n+ BL_PROFILE(\"EBConductivityOp::reflux\");\n+\n m_fastFR.setToZero();\n- CH_STOP(t2);\n- CH_START(t3);\n+\n incrementFRCoar(m_fastFR, a_phiFine, a_phi);\n- CH_STOP(t3);\n \n- CH_START(t4);\n incrementFRFine(m_fastFR, a_phiFine, a_phi, a_finerOp);\n- CH_STOP(t4);\n- CH_START(t5);\n \n- Real scale = 1.0/m_dx;\n- m_fastFR.reflux(a_residual, interv, scale);\n \n- CH_STOP(t5);\n+ Real scale = 1.0/m_dx;\n+ m_fastFR.reflux(a_residual, scale, 0, 0, 1);\n }\n //-------------------------------------------------------------------------------\n void\n@@ -1203,13 +1151,13 @@ namespace amrex\n BL_ASSERT(a_phi.nComp() == 1);\n BL_ASSERT(m_hasFine);\n int ncomp = 1;\n- Interval interv(0,0);\n+\n EBConductivityOp& finerEBAMROp = (EBConductivityOp& )(*a_finerOp);\n \n //ghost cells of phiFine need to be filled\n FabArray<EBCellFAB>& phiFine = (FabArray<EBCellFAB>&) a_phiFine;\n- finerEBAMROp.m_cfInterp->coarseFineInterp(phiFine, a_phi, 0, 0, 1);\n- phiFine.exchange(finerEBAMROp.m_exchangeCopier);\n+ finerEBAMROp.m_cfInterp.coarseFineInterp(phiFine, a_phi, 0, 0, 1);\n+ phiFine.FillBoundary();\n \n for(MFIter mfi_f(m_eblgFine.getDBL(), m_eblgFine.getDM()); mfi_f.isValid(); ++mfi_f)\n {\n@@ -1220,7 +1168,8 @@ namespace amrex\n {\n for (SideIterator sit; sit.ok(); sit.next())\n {\n- Box fabBox = adjCellBox(boxFine, idir, sit(), 1);\n+ Box fabBox=EBArith::adjCellBox(boxFine, idir, sit(), 1);\n+\n fabBox.shift(idir, -sign(sit()));\n \n Box ghostedBox = fabBox;\n@@ -1313,14 +1262,12 @@ namespace amrex\n AMRRestrict(FabArray<EBCellFAB>& a_resCoar,\n const FabArray<EBCellFAB>& a_residual,\n const FabArray<EBCellFAB>& a_correction,\n- const FabArray<EBCellFAB>& a_coarCorrection, \n- bool a_skip_res )\n+ const FabArray<EBCellFAB>& a_coarCorrection)\n {\n BL_PROFILE(\"EBConductivityOp::AMRRestrict\");\n BL_ASSERT(a_residual.nGrow() == m_ghostRHS);\n BL_ASSERT(a_correction.nGrow() == m_ghostPhi);\n BL_ASSERT(a_coarCorrection.nGrow() == m_ghostPhi);\n- BL_ASSERT(!a_skip_res);\n \n BL_ASSERT(a_residual.nComp() == 1);\n BL_ASSERT(a_resCoar.nComp() == 1);\n@@ -1331,9 +1278,9 @@ namespace amrex\n bool homogeneousCF = false;\n \n EBCellFactory ebcellfactTL(m_eblg.getEBISL());\n- IntVect ghostVec = a_residual.nGrow();\n+ int ghostVec = a_residual.nGrow();\n \n- resThisLevel.define(m_eblg.getDBL(), 1, ghostVec, ebcellfactTL);\n+ resThisLevel.define(m_eblg.getDBL(), m_eblg.getDM(), 1, ghostVec, MFInfo(), ebcellfactTL);\n EBLevelDataOps::setVal(resThisLevel, 0.0);\n \n //API says that we must average(a_residual - L(correction, coarCorrection))\n@@ -1342,8 +1289,7 @@ namespace amrex\n scale(resThisLevel,-1.0);\n \n //use our nifty averaging operator\n- Interval variables(0, 0);\n- m_ebAverage.average(a_resCoar, resThisLevel, variables);\n+ m_ebAverage.average(a_resCoar, resThisLevel, 0, 0, 1);\n \n }\n //-------------------------------------------------------------------------------\n@@ -1369,8 +1315,7 @@ namespace amrex\n {\n BL_PROFILE(\"EBConductivityOp::AMRProlong\");\n //use cached interpolation object\n- Interval variables(0, 0);\n- m_ebInterp.pwcInterp(a_correction, a_coarCorrection, variables);\n+ m_ebInterp.interpolate(a_correction, a_coarCorrection, 0, 0, 1);\n }\n //-------------------------------------------------------------------------------\n void\n@@ -1389,9 +1334,9 @@ namespace amrex\n bool homogeneousCF = false;\n \n EBCellFactory ebcellfactTL(m_eblg.getEBISL());\n- IntVect ghostVec = a_residual.nGrow();\n+ int ghostVec = a_residual.nGrow();\n \n- lcorr.define(m_eblg.getDBL(), 1, ghostVec, ebcellfactTL);\n+ lcorr.define(m_eblg.getDBL(), m_eblg.getDM(), 1, ghostVec, MFInfo(), ebcellfactTL);\n \n applyOp(lcorr, a_correction, &a_coarCorrection, homogeneousPhys, homogeneousCF);\n \ndiff --git a/Src/EBAMRElliptic/AMReX_EBConductivityOpFactory.H b/Src/EBAMRElliptic/AMReX_EBConductivityOpFactory.H\nindex 49b502cdbd7..068c167cc62 100644\n--- a/Src/EBAMRElliptic/AMReX_EBConductivityOpFactory.H\n+++ b/Src/EBAMRElliptic/AMReX_EBConductivityOpFactory.H\n@@ -45,8 +45,8 @@ namespace amrex\n const vector<int> & a_refRatio,\n const shared_ptr<ConductivityBaseDomainBCFactory> & a_domainBCFactory,\n const shared_ptr<ConductivityBaseEBBCFactory> & a_ebBcFactory,\n- const IntVect & a_ghostCellsPhi,\n- const IntVect & a_ghostCellsRhs,\n+ const int & a_ghostCellsPhi,\n+ const int & a_ghostCellsRhs,\n int a_numLevels = -1);\n \n \n@@ -70,6 +70,8 @@ namespace amrex\n const int& a_depth,\n const bool a_amrLevelOp);\n \n+ static int s_testRef;\n+ static int s_maxBoxSize;\n protected:\n \n vector<EBLevelGrid> m_eblgs;\n@@ -89,6 +91,7 @@ namespace amrex\n int m_ghostCellsRhs;\n int m_numLevels;\n vector<Real> m_dx;\n+\n private:\n ///weak construction bad\n EBConductivityOpFactory();\n@@ -98,7 +101,6 @@ namespace amrex\n \n //copy constructor and operator= disallowed for all the usual reasons\n void operator=(const EBConductivityOpFactory& a_opin);\n-\n-\n+ };\n }\n #endif\ndiff --git a/Src/EBAMRElliptic/AMReX_EBConductivityOpFactory.cpp b/Src/EBAMRElliptic/AMReX_EBConductivityOpFactory.cpp\nindex 936ba556ccb..4da37e251e2 100644\n--- a/Src/EBAMRElliptic/AMReX_EBConductivityOpFactory.cpp\n+++ b/Src/EBAMRElliptic/AMReX_EBConductivityOpFactory.cpp\n@@ -13,6 +13,7 @@\n #include \"AMReX_EBArith.H\"\n #include \"AMReX_EBConductivityOpFactory.H\"\n #include \"AMReX_EBCoarseAverage.H\"\n+#include \"AMReX_ParmParse.H\"\n \n namespace amrex\n {\n@@ -22,12 +23,12 @@ namespace amrex\n \n //-----------------------------------------------------------------------\n void\n- nwoebcoCoarsenStuff(LevelData<EBCellFAB> & a_acoefCoar,\n- LevelData<EBFluxFAB> & a_bcoefCoar,\n+ nwoebcoCoarsenStuff(FabArray<EBCellFAB> & a_acoefCoar,\n+ FabArray<EBFluxFAB> & a_bcoefCoar,\n const EBLevelGrid & a_eblgFine,\n const EBLevelGrid & a_eblgCoar,\n- const LevelData<EBCellFAB> & a_acoefFine,\n- const LevelData<EBFluxFAB> & a_bcoefFine,\n+ const FabArray<EBCellFAB> & a_acoefFine,\n+ const FabArray<EBFluxFAB> & a_bcoefFine,\n const int & a_refToDepth)\n {\n BL_ASSERT(a_refToDepth > 0);\n@@ -37,8 +38,8 @@ namespace amrex\n \n if (a_refToDepth == 1)\n {\n- a_acoefCoar.copy(a_acoefFine 0, 0, 1, 0, 0);\n- a_bcoefCoar.copy(a_bcoefCoar 0, 0, 1, 0, 0);\n+ a_acoefCoar.copy(a_acoefFine, 0, 0, 1, 0, 0);\n+ a_bcoefCoar.copy(a_bcoefCoar, 0, 0, 1, 0, 0);\n }\n else\n {\n@@ -52,7 +53,6 @@ namespace amrex\n //amrex::Warning(\"might want to figure out what harmonic averaging is in this context\");\n averageOp.average( a_acoefCoar , a_acoefFine , 0, 0, 1);\n averageOp.average( a_bcoefCoar , a_bcoefFine , 0, 0, 1);\n- averageOp.average( a_bcoefCoarIrreg, a_bcoefFineIrreg, 0, 0, 1);\n }\n }\n //-----------------------------------------------------------------------\n@@ -60,43 +60,22 @@ namespace amrex\n {\n }\n //-----------------------------------------------------------------------\n- int\n EBConductivityOpFactory::\n- refToFiner(const ProblemDomain& a_domain) const\n- {\n- int retval = -1;\n- bool found = false;\n- for (int ilev = 0; ilev < m_eblgs.size(); ilev++)\n- {\n- if (m_eblgs[ilev].getDomain() == a_domain)\n- {\n- retval = m_refRatio[ilev];\n- found = true;\n- }\n- }\n- if (!found)\n- {\n- amrex::Error(\"Domain not found in AMR hierarchy\");\n- }\n- return retval;\n- }\n- //-----------------------------------------------------------------------\n- EBConductivityOpFactory::\n- EBConductivityOpFactory(onst vector<EBLevelGrid>& a_eblgs,\n- const Real& a_alpha,\n- const Real& a_beta,\n- const vector<RefCountedPtr<LevelData<EBCellFAB> > >& a_acoef,\n- const vector<RefCountedPtr<LevelData<EBFluxFAB> > >& a_bcoef,\n- const Real& a_dxCoarse,\n- const vector<int>& a_refRatio,\n- const RefCountedPtr<ConductivityBaseDomainBCFactory>& a_domainBCFactory,\n- const RefCountedPtr<ConductivityBaseEBBCFactory> & a_ebBCFactory,\n- const int & a_ghostCellsPhi,\n- const int & a_ghostCellsRhs,\n+ EBConductivityOpFactory(const vector<EBLevelGrid>& a_eblgs,\n+ const Real& a_alpha,\n+ const Real& a_beta,\n+ const vector<shared_ptr<FabArray<EBCellFAB> > >& a_acoef,\n+ const vector<shared_ptr<FabArray<EBFluxFAB> > >& a_bcoef,\n+ const Real& a_dxCoarse,\n+ const vector<int>& a_refRatio,\n+ const shared_ptr<ConductivityBaseDomainBCFactory>& a_domainBCFactory,\n+ const shared_ptr<ConductivityBaseEBBCFactory> & a_ebBCFactory,\n+ const int & a_ghostCellsPhi,\n+ const int & a_ghostCellsRhs,\n int a_numLevels)\n {\n BL_ASSERT(a_eblgs.size() <= a_refRatio.size());\n- m_dataBased = false;\n+\n m_ghostCellsRhs = a_ghostCellsRhs;\n m_ghostCellsPhi = a_ghostCellsPhi;\n m_acoef = a_acoef;\n@@ -134,9 +113,9 @@ namespace amrex\n //-----------------------------------------------------------------------\n EBConductivityOp*\n EBConductivityOpFactory::\n- MGnewOp(const ProblemDomain& a_domainFine,\n- int a_depth,\n- bool a_homoOnly)\n+ MGnewOp(const Box& a_domainFine,\n+ int a_depth,\n+ bool a_homoOnly)\n {\n ParmParse pp;\n bool turn_off_mg = false;\n@@ -151,9 +130,9 @@ namespace amrex\n int ref=-1;\n bool found = false;\n \n- RefCountedPtr<LevelData<EBCellFAB> > acoef;\n- RefCountedPtr<LevelData<EBFluxFAB> > bcoef;\n- RefCountedPtr<LevelData<BaseIVFAB<Real> > > bcoefIrreg;\n+ shared_ptr<FabArray<EBCellFAB> > acoef;\n+ shared_ptr<FabArray<EBFluxFAB> > bcoef;\n+ shared_ptr<FabArray<BaseIVFAB<Real> > > bcoefIrreg;\n \n for (int ilev = 0; ilev < m_numLevels && !found; ilev++)\n {\n@@ -177,7 +156,7 @@ namespace amrex\n //-----------------------------------------------------------------------\n EBConductivityOp*\n EBConductivityOpFactory::\n- createOperator(const int& a_amrlevel,\n+ createOperator(const int& a_amrLevel,\n const int& a_depth,\n const bool a_amrLevelOp)\n {\n@@ -196,17 +175,17 @@ namespace amrex\n \n if(a_amrLevelOp)\n {\n- eblg = m_eblgs[a_amrlevel];\n+ eblg = m_eblgs[a_amrLevel];\n if(a_amrLevel > 0)\n {\n- eblgCoar = m_eblgs[a_amrlevel-1];\n- refToCoar = m_refRatio[a_amrlevel-1]\n+ eblgCoar = m_eblgs[a_amrLevel-1];\n+ refToCoar = m_refRatio[a_amrLevel-1];\n hasCoarser = true;\n }\n if(a_amrLevel < (m_numLevels - 1))\n {\n- eblgFine = m_eblgs[a_amrlevel+1];\n- refToFine = m_refRatio[a_amrlevel]\n+ eblgFine = m_eblgs[a_amrLevel+1];\n+ refToFine = m_refRatio[a_amrLevel];\n hasFiner = true;\n }\n }\n@@ -215,11 +194,11 @@ namespace amrex\n //check to see if we are able to create an EBLG at this depth. If not, return NULL\n if(a_depth == 0)\n {\n- eblg = m_eblgs[a_amrlevel];\n+ eblg = m_eblgs[a_amrLevel];\n }\n else\n {\n- bool coarsenable = EBArith::createCoarserEBLG(eblg, m_eblgs[a_amrlevel], refRatMG, s_testRef, s_maxBoxSize);\n+ bool coarsenable = EBArith::createCoarserEBLG(eblg, m_eblgs[a_amrLevel], refRatMG, s_testRef, s_maxBoxSize);\n if(!coarsenable)\n {\n return NULL;\n@@ -228,26 +207,27 @@ namespace amrex\n }\n \n //now see if there is a coarser MG level\n+ EBLevelGrid eblgCoarMG;\n bool hasCoarMG = EBArith::createCoarserEBLG(eblgCoarMG , eblg, 2, s_testRef, s_maxBoxSize);\n- Real dxMGLevel = m_dx[a_amrlevel]*refRatMG;\n+ Real dxMGLevel = m_dx[a_amrLevel]*refRatMG;\n Real dxCoar = -1.0;\n- if (a_amrlevel > 0)\n+ if (a_amrLevel > 0)\n {\n- dxCoar = m_dx[a_amrlevel-1];\n+ dxCoar = m_dx[a_amrLevel-1];\n }\n \n shared_ptr<ConductivityBaseDomainBC> domainBC(m_domainBCFactory->create());\n- shared_ptr<ConductivityBaseEBBC> ebBC(m_ebbcFactory->create());\n+ shared_ptr<ConductivityBaseEBBC> ebBC( m_ebBCFactory->create());\n shared_ptr<FabArray<EBCellFAB> > acoef;\n shared_ptr<FabArray<EBFluxFAB> > bcoef;\n \n //get coefficients\n- nwoebcoCoarsenStuff(acoef,\n- bcoef,\n- m_eblgs[a_amrlevel],\n+ nwoebcoCoarsenStuff(*acoef,\n+ *bcoef,\n+ m_eblgs[a_amrLevel],\n eblg,\n- m_acoef[a_amrlevel],\n- m_bcoef[a_amrlevel],\n+ *m_acoef[a_amrLevel],\n+ *m_bcoef[a_amrLevel],\n refRatMG);\n \n \n@@ -270,13 +250,14 @@ namespace amrex\n acoef,\n bcoef,\n m_ghostCellsPhi,\n- m_ghostCellsRHS);\n- } \n-\n+ m_ghostCellsRhs);\n+ return newOp;\n+ } \n+ \n //-----------------------------------------------------------------------\n EBConductivityOp*\n EBConductivityOpFactory::\n- AMRnewOp(const ProblemDomain& a_domainFine)\n+ AMRnewOp(const Box& a_domainFine)\n {\n //figure out which level we are at.\n int ref=-1;\ndiff --git a/Src/EBAMRElliptic/AMReX_EBSimpleSolver.H b/Src/EBAMRElliptic/AMReX_EBSimpleSolver.H\nindex 0e3f977646a..e0ac5d5fde5 100644\n--- a/Src/EBAMRElliptic/AMReX_EBSimpleSolver.H\n+++ b/Src/EBAMRElliptic/AMReX_EBSimpleSolver.H\n@@ -14,7 +14,7 @@\n \n #include \"AMReX_FabArray.H\"\n #include \"AMReX_LinearSolver.H\"\n-#include \"AMReX_MultiGrid.H\"\n+#include \"AMReX_EBMultiGrid.H\"\n #include \"AMReX_EBCellFAB.H\"\n \n namespace amrex\ndiff --git a/Src/EBAMRElliptic/AMReX_EBSimpleSolver.cpp b/Src/EBAMRElliptic/AMReX_EBSimpleSolver.cpp\nindex e8f427080f2..86729c70c6f 100644\n--- a/Src/EBAMRElliptic/AMReX_EBSimpleSolver.cpp\n+++ b/Src/EBAMRElliptic/AMReX_EBSimpleSolver.cpp\n@@ -55,7 +55,7 @@ namespace amrex\n void EBSimpleSolver::solve(FabArray<EBCellFAB>& a_phi,\n const FabArray<EBCellFAB>& a_rhs)\n {\n- CH_assert(m_isDefined);\n+ BL_ASSERT(m_isDefined);\n \n m_operator->relax(a_phi,a_rhs,m_numSmooths);\n }\ndiff --git a/Src/EBAMRElliptic/AMReX_NeumannConductivityDomainBC.H b/Src/EBAMRElliptic/AMReX_NeumannConductivityDomainBC.H\nindex 5cd7e40d52d..541e0ca7cf1 100644\n--- a/Src/EBAMRElliptic/AMReX_NeumannConductivityDomainBC.H\n+++ b/Src/EBAMRElliptic/AMReX_NeumannConductivityDomainBC.H\n@@ -21,16 +21,12 @@ namespace amrex\n /**\n Class to do Dirichlet boundary conditions on the domain for the conductivity operator.\n */\n-class NeumannConductivityDomainBC: public ConductivityBaseDomainBC\n-{\n-public:\n- NeumannConductivityDomainBC()\n- {\n- }\n+ class NeumannConductivityDomainBC: public ConductivityBaseDomainBC\n+ {\n+ public:\n+ NeumannConductivityDomainBC();\n \n- virtual ~NeumannConductivityDomainBC()\n- {\n- }\n+ virtual ~NeumannConductivityDomainBC();\n \n ///\n virtual void \n@@ -58,36 +54,28 @@ public:\n const Side::LoHiSide& a_side,\n const bool& a_useHomogeneous);\n \n- ///\n- virtual void \n- fillPhiGhost(FArrayBox& a_phi,\n- const Box& a_valid,\n- const Box& a_domain,\n- Real a_dx,\n- bool a_homogeneous);\n-\n-private:\n+ private:\n \n \n-};\n+ };\n \n-class NeumannConductivityDomainBCFactory: public ConductivityBaseDomainBCFactory\n-{\n-public:\n- NeumannConductivityDomainBCFactory()\n- {\n- }\n+ class NeumannConductivityDomainBCFactory: public ConductivityBaseDomainBCFactory\n+ {\n+ public:\n+ NeumannConductivityDomainBCFactory()\n+ {\n+ }\n \n- virtual ~NeumannConductivityDomainBCFactory()\n- {\n- }\n+ virtual ~NeumannConductivityDomainBCFactory()\n+ {\n+ }\n \n- ConductivityBaseDomainBC* new_object_ptr()\n- {\n+ ConductivityBaseDomainBC* new_object_ptr()\n+ {\n NeumannConductivityDomainBC* newBC = new NeumannConductivityDomainBC();\n return static_cast<ConductivityBaseDomainBC*>(newBC);\n- }\n+ }\n \n-};\n+ };\n }\n #endif\ndiff --git a/Src/EBAMRElliptic/AMReX_NeumannConductivityDomainBC.cpp b/Src/EBAMRElliptic/AMReX_NeumannConductivityDomainBC.cpp\nindex 1d1d4b668a9..b5e74737e95 100644\n--- a/Src/EBAMRElliptic/AMReX_NeumannConductivityDomainBC.cpp\n+++ b/Src/EBAMRElliptic/AMReX_NeumannConductivityDomainBC.cpp\n@@ -13,12 +13,20 @@\n #include \"AMReX_EBArith.H\"\n namespace amrex\n {\n+ NeumannConductivityDomainBC::\n+ NeumannConductivityDomainBC()\n+ {\n+ }\n+\n+ NeumannConductivityDomainBC::\n+ ~NeumannConductivityDomainBC()\n+ {\n+ }\n+\n void \n NeumannConductivityDomainBC::\n fillPhiGhost(FArrayBox& a_phi,\n const Box& a_valid,\n- const Box& a_domain,\n- Real a_dx,\n bool a_homogeneous)\n {\n Box grownBox = a_valid;\n@@ -32,19 +40,19 @@ namespace amrex\n choppedBox.grow(idir,-1);\n Box toRegion = EBArith::adjCellBox(choppedBox, idir, sit(), 1);\n \n- if(!a_domain.contains(toRegion))\n+ if(!m_eblg.getDomain().contains(toRegion))\n {\n for (BoxIterator bit(toRegion); bit.ok(); ++bit)\n {\n const IntVect& iv = bit();\n //fake vof just to get the location\n VolIndex vof(iv, 0);\n- RealVect loc = EBArith::getVoFLocation(vof, a_dx, RealVect::Zero);\n+ RealVect loc = EBArith::getVoFLocation(vof, m_dx, RealVect::Zero);\n int isign = sign(sit());\n IntVect ivneigh = iv - isign*BASISV(idir);\n Real value = bcvaluefunc(loc, idir, sit());\n if(a_homogeneous) value = 0;\n- a_phi(iv, 0) = a_phi(ivneigh, 0) + a_dx*value;\n+ a_phi(iv, 0) = a_phi(ivneigh, 0) + m_dx*value;\n }\n }\n } \ndiff --git a/Src/EBAMRElliptic/AMReX_VCAggStencil.cpp b/Src/EBAMRElliptic/AMReX_VCAggStencil.cpp\nindex af81732784f..34756b9e94d 100644\n--- a/Src/EBAMRElliptic/AMReX_VCAggStencil.cpp\n+++ b/Src/EBAMRElliptic/AMReX_VCAggStencil.cpp\n@@ -1,36 +1,36 @@\n-#ifdef CH_LANG_CC\n /*\n- * _______ __\n- * / ___/ / ___ __ _ / / ___\n- * / /__/ _ \\/ _ \\/ V \\/ _ \\/ _ \\\n- * \\___/_//_/\\___/_/_/_/_.__/\\___/\n- * Please refer to Copyright.txt, in Chombo's root directory.\n+ * {_ {__ {__{_______ {__ {__\n+ * {_ __ {_ {__ {___{__ {__ {__ {__ \n+ * {_ {__ {__ {__ { {__{__ {__ {__ {__ {__ \n+ * {__ {__ {__ {__ {__{_ {__ {_ {__ {__ \n+ * {______ {__ {__ {_ {__{__ {__ {_____ {__ {__ {__ \n+ * {__ {__ {__ {__{__ {__ {_ {__ {__ \n+ * {__ {__{__ {__{__ {__ {____ {__ {__\n+ *\n */\n-#endif\n \n+#include \"AMReX_VCAggStencil.H\"\n \n-#include \"VCAggStencil.H\"\n-\n-#include \"NamespaceHeader.H\"\n-\n-/**************/\n-VCAggStencil::\n-VCAggStencil(const Vector<RefCountedPtr<BaseIndex> > & a_dstVoFs,\n- const Vector<RefCountedPtr<BaseStencil> > & a_vofStencil,\n- const EBCellFAB & a_phiData,\n- const EBCellFAB & a_rhsData,\n- const EBCellFAB & a_relCoef,\n- const BaseIVFAB<Real> & a_alphaWt,\n- const int & a_ncomp)\n- :AggStencil<EBCellFAB, EBCellFAB>(a_dstVoFs, a_vofStencil, a_phiData, a_rhsData)\n+namespace amrex\n {\n- CH_TIME(\"VCAggSten.constructor\");\n-\n- m_phiAccess.resize(a_dstVoFs.size());\n- m_relAccess.resize(a_dstVoFs.size());\n- m_alpAccess.resize(a_dstVoFs.size());\n- m_iv.resize(a_dstVoFs.size());\n- for (int idst = 0; idst < a_dstVoFs.size(); idst++)\n+/**************/\n+ VCAggStencil::\n+ VCAggStencil(const vector<shared_ptr<BaseIndex> > & a_dstVoFs,\n+ const vector<shared_ptr<BaseStencil> > & a_vofStencil,\n+ const EBCellFAB & a_phiData,\n+ const EBCellFAB & a_rhsData,\n+ const EBCellFAB & a_relCoef,\n+ const BaseIVFAB<Real> & a_alphaWt,\n+ const int & a_ncomp)\n+ :AggStencil<EBCellFAB, EBCellFAB>(a_dstVoFs, a_vofStencil, a_phiData, a_rhsData)\n+ {\n+ BL_PROFILE(\"VCAggSten.constructor\");\n+\n+ m_phiAccess.resize(a_dstVoFs.size());\n+ m_relAccess.resize(a_dstVoFs.size());\n+ m_alpAccess.resize(a_dstVoFs.size());\n+ m_iv.resize(a_dstVoFs.size());\n+ for (int idst = 0; idst < a_dstVoFs.size(); idst++)\n {\n const BaseIndex& dstVoF = *a_dstVoFs[idst];\n m_phiAccess[idst].dataID = a_phiData.dataType(dstVoF);\n@@ -42,193 +42,189 @@ VCAggStencil(const Vector<RefCountedPtr<BaseIndex> > & a_dstVoFs,\n \n VolIndex* vofPtr = dynamic_cast<VolIndex*>(&(*a_dstVoFs[idst]));\n if(vofPtr == NULL)\n- {\n- MayDay::Error(\"dynamic cast error--VCAggStencil just handles VolIndicies\");\n- }\n+ {\n+ amrex::Error(\"dynamic cast error--VCAggStencil just handles VolIndicies\");\n+ }\n m_iv[idst] = vofPtr->gridIndex();\n }\n- m_cachePhi.resize( m_ebstencil.size(), Vector<Real>(a_ncomp, 0.));\n-}\n+ m_cachePhi.resize( m_ebstencil.size(), vector<Real>(a_ncomp, 0.));\n+ }\n /************/\n-void\n-VCAggStencil::\n-cachePhi(const EBCellFAB& a_phi) const\n-{\n- CH_TIME(\"VCAggStencil::cachePhi\");\n- Vector<const Real*> dataPtrsPhi(a_phi.numDataTypes());\n- for (int ivar = 0; ivar < a_phi.nComp(); ivar++)\n+ void\n+ VCAggStencil::\n+ cachePhi(const EBCellFAB& a_phi) const\n+ {\n+ BL_PROFILE(\"VCAggStencil::cachePhi\");\n+ vector<const Real*> dataPtrsPhi(a_phi.numDataTypes());\n+ for (int ivar = 0; ivar < a_phi.nComp(); ivar++)\n {\n for (int ivec = 0; ivec < dataPtrsPhi.size(); ivec++)\n- {\n- dataPtrsPhi[ivec] = a_phi.dataPtr(ivec, ivar);\n- }\n+ {\n+ dataPtrsPhi[ivec] = a_phi.dataPtr(ivec, ivar);\n+ }\n \n for (int idst = 0; idst < m_ebstencil.size(); idst++)\n- {\n- const Real* phiPtr = dataPtrsPhi[m_phiAccess[idst].dataID] + m_phiAccess[idst].offset;\n- m_cachePhi[idst][ivar] = *phiPtr;\n- }\n+ {\n+ const Real* phiPtr = dataPtrsPhi[m_phiAccess[idst].dataID] + m_phiAccess[idst].offset;\n+ m_cachePhi[idst][ivar] = *phiPtr;\n+ }\n }\n-}\n+ }\n /**************/\n-void\n-VCAggStencil::\n-uncachePhi(EBCellFAB& a_phi) const\n-{\n- CH_TIME(\"VCAggSten::uncache\");\n- Vector<Real*> dataPtrsPhi(a_phi.numDataTypes());\n- for (int ivar = 0; ivar < a_phi.nComp(); ivar++)\n+ void\n+ VCAggStencil::\n+ uncachePhi(EBCellFAB& a_phi) const\n+ {\n+ BL_PROFILE(\"VCAggSten::uncache\");\n+ vector<Real*> dataPtrsPhi(a_phi.numDataTypes());\n+ for (int ivar = 0; ivar < a_phi.nComp(); ivar++)\n {\n for (int ivec = 0; ivec < dataPtrsPhi.size(); ivec++)\n- {\n- dataPtrsPhi[ivec] = a_phi.dataPtr(ivec, ivar);\n- }\n+ {\n+ dataPtrsPhi[ivec] = a_phi.dataPtr(ivec, ivar);\n+ }\n \n for (int idst = 0; idst < m_ebstencil.size(); idst++)\n- {\n- Real* phiPtr = dataPtrsPhi[m_phiAccess[idst].dataID] + m_phiAccess[idst].offset;\n- *phiPtr = m_cachePhi[idst][ivar];\n- }\n+ {\n+ Real* phiPtr = dataPtrsPhi[m_phiAccess[idst].dataID] + m_phiAccess[idst].offset;\n+ *phiPtr = m_cachePhi[idst][ivar];\n+ }\n }\n-}\n+ }\n /**************/\n-void \n-VCAggStencil::\n-relax(EBCellFAB & a_phi,\n- const EBCellFAB & a_rhs,\n- const EBCellFAB & a_relCoef,\n- const BaseIVFAB<Real> & a_alphaWt,\n- const Real & a_alpha,\n- const Real & a_beta,\n- const int & a_varDest,\n- const IntVect & a_color)\n-{\n- CH_TIME(\"VCAggSten::relax\");\n- const int numtyperhs = a_rhs.numDataTypes();\n- const int numtypephi = a_phi.numDataTypes();\n- const int numtyperel = a_relCoef.numDataTypes();\n- const int numtypealp = a_alphaWt.numDataTypes();\n+ void \n+ VCAggStencil::\n+ relax(EBCellFAB & a_phi,\n+ const EBCellFAB & a_rhs,\n+ const EBCellFAB & a_relCoef,\n+ const BaseIVFAB<Real> & a_alphaWt,\n+ const Real & a_alpha,\n+ const Real & a_beta,\n+ const int & a_varDest,\n+ const IntVect & a_color)\n+ {\n+ BL_PROFILE(\"VCAggSten::relax\");\n+ const int numtyperhs = a_rhs.numDataTypes();\n+ const int numtypephi = a_phi.numDataTypes();\n+ const int numtyperel = a_relCoef.numDataTypes();\n+ const int numtypealp = a_alphaWt.numDataTypes();\n \n- Vector<const Real*> dataPtrsRhs(numtyperhs);\n- Vector<const Real*> dataPtrsRel(numtyperel);\n- Vector<const Real*> dataPtrsAlp(numtypealp);\n- //phi is the source (what the stencil gets applied to)\n- //and the destination (where the answer goes). For the \n- //source, we need the variable to be zero because the stencil\n- //variable is taken into account in aggstencil\n- Vector<const Real*> dataPtrsSrc(numtypephi);\n- Vector<Real*> dataPtrsDst(numtypephi);\n- int varDst = a_varDest;\n- int varSrc = 0; //stencil variable taken into account in aggstencil\n- for (int ivec = 0; ivec < numtyperhs; ivec++)\n+ vector<const Real*> dataPtrsRhs(numtyperhs);\n+ vector<const Real*> dataPtrsRel(numtyperel);\n+ vector<const Real*> dataPtrsAlp(numtypealp);\n+ //phi is the source (what the stencil gets applied to)\n+ //and the destination (where the answer goes). For the \n+ //source, we need the variable to be zero because the stencil\n+ //variable is taken into account in aggstencil\n+ vector<const Real*> dataPtrsSrc(numtypephi);\n+ vector<Real*> dataPtrsDst(numtypephi);\n+ int varDst = a_varDest;\n+ int varSrc = 0; //stencil variable taken into account in aggstencil\n+ for (int ivec = 0; ivec < numtyperhs; ivec++)\n {\n //rhs has the same variable number as destination (in this case phi)\n dataPtrsRhs[ivec] = a_rhs.dataPtr(ivec, varDst);\n }\n- for (int ivec = 0; ivec < numtypealp; ivec++)\n+ for (int ivec = 0; ivec < numtypealp; ivec++)\n {\n //alphaweight has the same variable number as destination (in this case phi)\n dataPtrsAlp[ivec] = a_alphaWt.dataPtr(ivec, varDst);\n }\n- for (int ivec = 0; ivec < numtypephi; ivec++)\n+ for (int ivec = 0; ivec < numtypephi; ivec++)\n {\n dataPtrsSrc[ivec] = a_phi.dataPtr(ivec, varSrc);\n }\n- for (int ivec = 0; ivec < numtypephi; ivec++)\n+ for (int ivec = 0; ivec < numtypephi; ivec++)\n {\n dataPtrsDst[ivec] = a_phi.dataPtr(ivec, varDst);\n }\n- for (int ivec = 0; ivec < numtypephi; ivec++)\n+ for (int ivec = 0; ivec < numtypephi; ivec++)\n {\n //relaxation coeff has the same variable number as as destination (in this case phi)\n dataPtrsRel[ivec] = a_relCoef.dataPtr(ivec, varDst);\n }\n \n- for (int idst = 0; idst < m_ebstencil.size(); idst++)\n+ for (int idst = 0; idst < m_ebstencil.size(); idst++)\n {\n const IntVect& iv = m_iv[idst];\n bool doThisVoF = true;\n for (int idir = 0; idir < SpaceDim; idir++)\n+ {\n+ if (iv[idir] % 2 != a_color[idir])\n {\n- if (iv[idir] % 2 != a_color[idir])\n- {\n- doThisVoF = false;\n- break;\n- }\n+ doThisVoF = false;\n+ break;\n }\n+ }\n if(doThisVoF)\n+ {\n+ const Real* rhsiPtr = dataPtrsRhs[m_dstAccess[idst].dataID] + m_dstAccess[idst].offset;\n+ const Real& rhsi = *rhsiPtr;\n+ const Real* relcoPtr = dataPtrsRel[m_relAccess[idst].dataID] + m_relAccess[idst].offset;\n+ const Real& relco = *relcoPtr;\n+ const Real* alpWtPtr = dataPtrsAlp[m_alpAccess[idst].dataID] + m_alpAccess[idst].offset;\n+ const Real& alphaWeight = *alpWtPtr;\n+\n+\n+ const stencil_t& ebstencil = m_ebstencil[idst];\n+ Real lphi = 0;\n+ for (int isten = 0; isten < ebstencil.size(); isten++)\n {\n- const Real* rhsiPtr = dataPtrsRhs[m_dstAccess[idst].dataID] + m_dstAccess[idst].offset;\n- const Real& rhsi = *rhsiPtr;\n- const Real* relcoPtr = dataPtrsRel[m_relAccess[idst].dataID] + m_relAccess[idst].offset;\n- const Real& relco = *relcoPtr;\n- const Real* alpWtPtr = dataPtrsAlp[m_alpAccess[idst].dataID] + m_alpAccess[idst].offset;\n- const Real& alphaWeight = *alpWtPtr;\n-\n-\n- const stencil_t& ebstencil = m_ebstencil[idst];\n- Real lphi = 0;\n- for (int isten = 0; isten < ebstencil.size(); isten++)\n- {\n- const Real& weight = ebstencil[isten].second;\n- const long& offset = ebstencil[isten].first.offset;\n- const int & dataID = ebstencil[isten].first.dataID;\n- const Real& phiVal = *(dataPtrsSrc[dataID] + offset);\n- lphi += phiVal*weight;\n- }\n- Real* phiiPtr = dataPtrsDst[m_phiAccess[idst].dataID] + m_phiAccess[idst].offset;\n- Real& phii = *phiiPtr;\n- //multiply by beta and add in identity term\n- lphi = a_beta*lphi + a_alpha*alphaWeight*phii;\n-\n- phii = phii + relco*(rhsi - lphi);\n- ch_flops()+=ebstencil.size()*2+5;\n+ const Real& weight = ebstencil[isten].second;\n+ const long& offset = ebstencil[isten].first.offset;\n+ const int & dataID = ebstencil[isten].first.dataID;\n+ const Real& phiVal = *(dataPtrsSrc[dataID] + offset);\n+ lphi += phiVal*weight;\n }\n+ Real* phiiPtr = dataPtrsDst[m_phiAccess[idst].dataID] + m_phiAccess[idst].offset;\n+ Real& phii = *phiiPtr;\n+ //multiply by beta and add in identity term\n+ lphi = a_beta*lphi + a_alpha*alphaWeight*phii;\n+\n+ phii = phii + relco*(rhsi - lphi);\n+ }\n }\n- //the /ncolor is because this does one color at a time\n- int ncolor = D_TERM(2, *2, *2);\n- //ch_flops()+=(9*m_ebstencil.size())/ncolor;\n-}\n+ }\n \n \n \n /**************/\n-void \n-VCAggStencil::\n-apply(EBCellFAB & a_lph,\n- const EBCellFAB & a_phi,\n- const BaseIVFAB<Real> & a_alp, //alphaDiagWeight\n- const Real & a_alpha,\n- const Real & a_beta,\n- const int & a_varDest,\n- const bool & a_incrementOnly)\n-{\n- CH_TIME(\"VCAggSten::apply\");\n- //this makes lphi = divf\n- AggStencil<EBCellFAB,EBCellFAB>::apply(a_lph, a_phi, a_varDest, a_incrementOnly);\n-\n- const int numtypelph = a_lph.numDataTypes();\n- const int numtypephi = a_phi.numDataTypes();\n- const int numtypealp = a_alp.numDataTypes();\n+ void \n+ VCAggStencil::\n+ apply(EBCellFAB & a_lph,\n+ const EBCellFAB & a_phi,\n+ const BaseIVFAB<Real> & a_alp, //alphaDiagWeight\n+ const Real & a_alpha,\n+ const Real & a_beta,\n+ const int & a_varDest,\n+ const bool & a_incrementOnly)\n+ {\n+ BL_PROFILE(\"VCAggSten::apply\");\n+ //this makes lphi = divf\n+ AggStencil<EBCellFAB,EBCellFAB>::apply(a_lph, a_phi, a_varDest, a_incrementOnly);\n+\n+ const int numtypelph = a_lph.numDataTypes();\n+ const int numtypephi = a_phi.numDataTypes();\n+ const int numtypealp = a_alp.numDataTypes();\n \n- Vector< Real*> dataPtrsLph(numtypelph);\n- Vector<const Real*> dataPtrsPhi(numtypephi);\n- Vector<const Real*> dataPtrsAlp(numtypealp);\n- //no stencils here so everything is on the same var\n- for (int ivec = 0; ivec < numtypelph; ivec++)\n+ vector< Real*> dataPtrsLph(numtypelph);\n+ vector<const Real*> dataPtrsPhi(numtypephi);\n+ vector<const Real*> dataPtrsAlp(numtypealp);\n+ //no stencils here so everything is on the same var\n+ for (int ivec = 0; ivec < numtypelph; ivec++)\n {\n dataPtrsLph[ivec] = a_lph.dataPtr(ivec, a_varDest);\n }\n- for (int ivec = 0; ivec < numtypealp; ivec++)\n+ for (int ivec = 0; ivec < numtypealp; ivec++)\n {\n dataPtrsAlp[ivec] = a_alp.dataPtr(ivec, a_varDest);\n }\n- for (int ivec = 0; ivec < numtypephi; ivec++)\n+ for (int ivec = 0; ivec < numtypephi; ivec++)\n {\n dataPtrsPhi[ivec] = a_phi.dataPtr(ivec, a_varDest);\n }\n \n- for (int idst = 0; idst < m_ebstencil.size(); idst++)\n+ for (int idst = 0; idst < m_ebstencil.size(); idst++)\n {\n Real* lphiPtr = dataPtrsLph[m_dstAccess[idst].dataID] + m_dstAccess[idst].offset;\n Real& lphi = *lphiPtr;\n@@ -239,7 +235,6 @@ apply(EBCellFAB & a_lph,\n //multiply by beta and add in identity term\n lphi = a_beta*lphi + a_alpha*alphaWeight*phii;\n }\n- ch_flops()+=m_ebstencil.size()*6;\n+ }\n }\n \n-#include \"NamespaceFooter.H\"\ndiff --git a/Src/EBAMRElliptic/Make.package b/Src/EBAMRElliptic/Make.package\nindex 13779f33317..261a40a3ff3 100644\n--- a/Src/EBAMRElliptic/Make.package\n+++ b/Src/EBAMRElliptic/Make.package\n@@ -9,13 +9,14 @@ C$(EBAMRELLIPTIC_BASE)_headers += AMReX_ConductivityBaseDomainBC.H AMReX_N\n C$(EBAMRELLIPTIC_BASE)_headers += AMReX_DirichletConductivityEBBC.H AMReX_ConductivityBaseEBBC.H\t \n C$(EBAMRELLIPTIC_BASE)_headers += AMReX_DirichletConductivityDomainBC.H AMReX_NeumannConductivityDomainBC.H \n C$(EBAMRELLIPTIC_BASE)_headers += AMReX_EBConductivityOpFactory.H AMReX_EBConductivityOp.H \n+C$(EBAMRELLIPTIC_BASE)_headers += AMReX_EBSimpleSolver.H AMReX_ConductivityBaseEBBC.H AMReX_VCAggStencil.H\n \n \n \n C$(EBAMRELLIPTIC_BASE)_sources += AMReX_DirichletConductivityDomainBC.cpp AMReX_NeumannConductivityEBBC.cpp \n C$(EBAMRELLIPTIC_BASE)_sources += AMReX_DirichletConductivityEBBC.cpp\t AMReX_NeumannConductivityDomainBC.cpp \n C$(EBAMRELLIPTIC_BASE)_sources += AMReX_EBConductivityOp.cpp\t\t AMReX_EBConductivityOpFactory.cpp \n-\n+C$(EBAMRELLIPTIC_BASE)_sources += AMReX_EBSimpleSolver.cpp AMReX_VCAggStencil.cpp\n F90$(EBAMRELLIPTIC_BASE)_headers += AMReX_EBEllipticFort_F.H\n F90$(EBAMRELLIPTIC_BASE)_sources += AMReX_EBEllipticFort.F90\n \ndiff --git a/Src/EBAMRTools/AMReX_DivergenceOp.H b/Src/EBAMRTools/AMReX_DivergenceOp.H\nindex 809abad23b9..8c3589d13f1 100644\n--- a/Src/EBAMRTools/AMReX_DivergenceOp.H\n+++ b/Src/EBAMRTools/AMReX_DivergenceOp.H\n@@ -64,10 +64,11 @@ namespace amrex\n const Real & a_dx,\n const int & a_numComp,\n const int & a_ghostCellsInData,\n+ bool a_multiplyFluxByArea = true,\n int a_redistRad = 1)\n {\n \n- define(a_eblg, a_dx, a_numComp, a_ghostCellsInData, a_redistRad);\n+ define(a_eblg, a_dx, a_numComp, a_ghostCellsInData, a_multiplyFluxByArea, a_redistRad);\n }\n \n ///\n@@ -78,6 +79,7 @@ namespace amrex\n const Real & a_dx,\n const int & a_numComp,\n const int & a_ghostCellsInData,\n+ bool a_multiplyFluxByArea = true,\n int a_redistRad = 1);\n \n \n@@ -134,7 +136,7 @@ namespace amrex\n FabArray<IrregFAB> m_massDiff;\n \n EBLevelRedist m_eblevelRedist;\n-\n+ bool m_multiplyFluxByArea;\n EBNormalizeByVolumeFraction m_normalizor;\n int m_nComp;\n Real m_dx;\ndiff --git a/Src/EBAMRTools/AMReX_DivergenceOp.cpp b/Src/EBAMRTools/AMReX_DivergenceOp.cpp\nindex 2d18fa1cb0f..08b68a4d832 100644\n--- a/Src/EBAMRTools/AMReX_DivergenceOp.cpp\n+++ b/Src/EBAMRTools/AMReX_DivergenceOp.cpp\n@@ -33,10 +33,12 @@ namespace amrex\n const Real & a_dx,\n const int & a_nComp,\n const int & a_ghostCellsInData,\n+ bool a_multiplyFluxByArea,\n int a_redistRad)\n {\n m_isDefined = true;\n m_eblg = a_eblg;\n+ m_multiplyFluxByArea = a_multiplyFluxByArea;\n m_dx = a_dx;\n m_nComp = a_nComp;\n m_dataGhost = a_ghostCellsInData;\n@@ -127,7 +129,14 @@ namespace amrex\n IntVectSet cfivs;//empty--see comment above\n FaceStencil interpSten = EBArith::getInterpStencil(faces[iface], cfivs, ebis, domain);\n Real areaFrac = ebis.areaFrac(faces[iface]);\n- interpSten *= (isign*areaFrac/m_dx);\n+ if(m_multiplyFluxByArea)\n+ {\n+ interpSten *= (isign*areaFrac/m_dx);\n+ }\n+ else\n+ {\n+ interpSten *= 1.0/(m_dx*m_dx);\n+ }\n dirStencil += interpSten;\n }\n }\n@@ -147,6 +156,7 @@ namespace amrex\n int isrc, int idst, int inco,\n bool a_trustRegDivF)\n {\n+/**/\n BL_ASSERT(isDefined());\n BL_ASSERT(a_flux.nGrow() == m_dataGhost);\n BL_ASSERT(a_divF.nGrow() == m_dataGhost);\n@@ -156,7 +166,11 @@ namespace amrex\n EBCellFAB & divF = m_kappaDivergence[mfi];\n const EBFluxFAB & flux = a_flux[mfi];\n \n- if(!a_trustRegDivF)\n+ if(a_trustRegDivF)\n+ {\n+ divF.copy(a_divF[mfi]);\n+ }\n+ else\n {\n BaseFab<Real> & regDivF = divF.getSingleValuedFAB();\n vector<const BaseFab<Real>*> regFlux(3, &(flux[0].getSingleValuedFAB()));\n@@ -166,12 +180,16 @@ namespace amrex\n }\n const Box& grid = m_eblg.getDBL()[mfi];\n \n+ int multiplyByArea = 0;\n+ if(m_multiplyFluxByArea) multiplyByArea = 1;\n+\n //first do everything as if it has no eb.\n ebfnd_divflux(BL_TO_FORTRAN_FAB(regDivF),\n BL_TO_FORTRAN_FAB((*regFlux[0])),\n BL_TO_FORTRAN_FAB((*regFlux[1])),\n BL_TO_FORTRAN_FAB((*regFlux[2])),\n BL_TO_FORTRAN_BOX(grid),\n+ &multiplyByArea,\n &m_dx, &isrc, &idst, &inco);\n }\n //turn off increment only for bndry flux. This sets the initial divergence at \n@@ -211,6 +229,7 @@ namespace amrex\n m_eblevelRedist.increment(m_massDiff[mfi], mfi, idst, inco);\n }\n m_eblevelRedist.redistribute(a_divF, idst, inco);\n+/**/\n }\n /************************************/\n }\ndiff --git a/Src/EBAMRTools/AMReX_EBFortND.F90 b/Src/EBAMRTools/AMReX_EBFortND.F90\nindex 7709111f3ae..9fbf1670ff0 100644\n--- a/Src/EBAMRTools/AMReX_EBFortND.F90\n+++ b/Src/EBAMRTools/AMReX_EBFortND.F90\n@@ -583,14 +583,14 @@ subroutine ebfnd_divflux( &\n fluxfa1, fluxfa1_lo, fluxfa1_hi, fluxfa1_nco, &\n fluxfa2, fluxfa2_lo, fluxfa2_hi, fluxfa2_nco, &\n gridlo,gridhi, &\n- dx, isrc, idst, ncomp) &\n+ multbyarea, dx, isrc, idst, ncomp) &\n bind(C, name=\"ebfnd_divflux\")\n \n use amrex_fort_module, only : amrex_spacedim, c_real=>amrex_real\n \n implicit none\n \n- integer :: iif,jjf,kkf, ncomp, ivar, ivardivf, ivarflux\n+ integer :: iif,jjf,kkf, ncomp, ivar, ivardivf, ivarflux, multbyarea\n integer :: fluxfa0_nco\n integer :: fluxfa1_nco\n integer :: fluxfa2_nco\n@@ -602,12 +602,18 @@ subroutine ebfnd_divflux( &\n integer :: gridlo(0:2), gridhi(0:2)\n \n real(c_real) :: dx, xterm, yterm, zterm\n- real(c_real) :: fhix, flox\n+ real(c_real) :: fhix, flox, denom\n real(c_real) :: divflux(divflux_lo(0):divflux_hi(0),divflux_lo(1):divflux_hi(1),divflux_lo(2):divflux_hi(2), 0:divflux_nco-1)\n real(c_real) :: fluxfa0(fluxfa0_lo(0):fluxfa0_hi(0),fluxfa0_lo(1):fluxfa0_hi(1),fluxfa0_lo(2):fluxfa0_hi(2), 0:fluxfa0_nco-1)\n real(c_real) :: fluxfa1(fluxfa1_lo(0):fluxfa1_hi(0),fluxfa1_lo(1):fluxfa1_hi(1),fluxfa1_lo(2):fluxfa1_hi(2), 0:fluxfa1_nco-1)\n real(c_real) :: fluxfa2(fluxfa2_lo(0):fluxfa2_hi(0),fluxfa2_lo(1):fluxfa2_hi(1),fluxfa2_lo(2):fluxfa2_hi(2), 0:fluxfa2_nco-1)\n \n+ if(multbyarea .eq. 1) then\n+ denom = one/dx\n+ else\n+ denom = one/dx/dx\n+ endif\n+\n do ivar = 0, ncomp-1\n ivarflux = isrc + ivar\n ivardivf = idst + ivar\n@@ -624,7 +630,7 @@ subroutine ebfnd_divflux( &\n #if BL_SPACEDIM==3\n zterm = fluxfa2(iif , jjf , kkf+1, ivarflux) - fluxfa2(iif, jjf, kkf, ivarflux) \n #endif\n- divflux(iif, jjf, kkf, ivardivf) = (xterm + yterm + zterm)/dx\n+ divflux(iif, jjf, kkf, ivardivf) = (xterm + yterm + zterm)/denom\n \n \n enddo\ndiff --git a/Src/EBAMRTools/AMReX_EBFortND_F.H b/Src/EBAMRTools/AMReX_EBFortND_F.H\nindex 583a89f128e..bda3e614a6c 100644\n--- a/Src/EBAMRTools/AMReX_EBFortND_F.H\n+++ b/Src/EBAMRTools/AMReX_EBFortND_F.H\n@@ -53,7 +53,7 @@\n const amrex::Real* flx0, const int* flx0lo, const int* flx0hi, const int* incoflx0,\n const amrex::Real* flx1, const int* flx1lo, const int* flx1hi, const int* incoflx1,\n const amrex::Real* flx2, const int* flx2lo, const int* flx2hi, const int* incoflx2,\n- const int* gridlo, const int* gridhi, \n+ const int* gridlo, const int* gridhi, const int* multibyarea,\n const amrex::Real* dx, const int* isrc, const int* idst, const int* ncomp);\n \n \ndiff --git a/Src/EBAMRTools/AMReX_EBLevelDataOps.H b/Src/EBAMRTools/AMReX_EBLevelDataOps.H\nindex 70efbec1824..fd82555598a 100644\n--- a/Src/EBAMRTools/AMReX_EBLevelDataOps.H\n+++ b/Src/EBAMRTools/AMReX_EBLevelDataOps.H\n@@ -131,6 +131,13 @@ namespace amrex\n const Real& a_scale);\n \n \n+ ///\n+ /**\n+ */\n+ static void scale(FabArray<EBCellFAB> & a_lhs,\n+ const FabArray<EBCellFAB> & a_scale);\n+\n+\n ///\n /**\n If comp < 0, set all components\ndiff --git a/Src/EBAMRTools/AMReX_EBLevelDataOps.cpp b/Src/EBAMRTools/AMReX_EBLevelDataOps.cpp\nindex e637d3a5706..d9d7c51c9a7 100644\n--- a/Src/EBAMRTools/AMReX_EBLevelDataOps.cpp\n+++ b/Src/EBAMRTools/AMReX_EBLevelDataOps.cpp\n@@ -451,6 +451,19 @@ namespace amrex\n a_result[mfi] *= a_value;\n }\n }\n+\n+ //-----------------------------------------------------------------------\n+ void \n+ EBLevelDataOps::\n+ scale(FabArray<EBCellFAB> & a_result,\n+ const FabArray<EBCellFAB> & a_value)\n+ {\n+ BL_PROFILE(\"EBLevelDataOps::scale_2\");\n+ for(MFIter mfi(a_result); mfi.isValid(); ++mfi)\n+ {\n+ a_result[mfi] *= a_value[mfi];\n+ }\n+ }\n //-----------------------------------------------------------------------\n void \n EBLevelDataOps::\ndiff --git a/Src/GeometryShop/AMReX_EBGraph.H b/Src/GeometryShop/AMReX_EBGraph.H\nindex 7f308e7af3f..2a76b6febd1 100644\n--- a/Src/GeometryShop/AMReX_EBGraph.H\n+++ b/Src/GeometryShop/AMReX_EBGraph.H\n@@ -367,6 +367,11 @@ namespace amrex\n {\n return m_multiIVS;\n }\n+ \n+ Box getFullRegion() const\n+ {\n+ return m_fullRegion;\n+ }\n private:\n \n ///for serialization\n@@ -374,7 +379,10 @@ namespace amrex\n \n ///box over which this graph is defined\n Box m_region;\n- \n+\n+ ///box NOT intersected with domain\n+ Box m_fullRegion;\n+\n ///computational domain at this level of refinement\n Box m_domain;\n \n@@ -483,6 +491,13 @@ namespace amrex\n {\n return m_implem->numVoFs(a_iv);\n }\n+\n+ ///\n+ Box getFullRegion() const\n+ {\n+ return m_implem->getFullRegion();\n+ }\n+\n ///\n /**\n Return true if every cell in the EBGraph is a regular cell.\n@@ -794,12 +809,15 @@ namespace amrex\n \n ///\n /**\n- This resizes the BaseFab to cover getRegion\n+ This resizes the BaseFab to cover the input region\n 1 = regular\n 0 = irregular\n -1 = covered\n+\n+ 2 outside the domain\n */\n- void fillIntMask(BaseFab<int>& a_mask) const;\n+ void fillIntMask(BaseFab<int>& a_mask,\n+ const Box & a_subbox) const;\n \n \n ///\ndiff --git a/Src/GeometryShop/AMReX_EBGraph.cpp b/Src/GeometryShop/AMReX_EBGraph.cpp\nindex 55f3f6c58f0..fba85b1861b 100644\n--- a/Src/GeometryShop/AMReX_EBGraph.cpp\n+++ b/Src/GeometryShop/AMReX_EBGraph.cpp\n@@ -402,6 +402,7 @@ namespace amrex\n \n m_tag = AllRegular;\n m_region = a_region;\n+ m_fullRegion = a_region;\n m_irregIVS = IntVectSet();\n m_multiIVS = IntVectSet();\n m_mask.clear();\n@@ -753,11 +754,16 @@ namespace amrex\n m_implem->fillMask(a_mask);\n }\n /*******************************/\n- void EBGraph::fillIntMask(BaseFab<int>& a_mask) const\n+ void EBGraph::fillIntMask(BaseFab<int>& a_mask,\n+ const Box & a_subbox) const\n {\n- Box interiorRegion = getRegion();\n+ Box fullRegion = getFullRegion();\n+ fullRegion &= a_subbox;\n+ Box interiorRegion = fullRegion;\n interiorRegion &= getDomain();\n- a_mask.resize(interiorRegion, 1);\n+\n+ a_mask.resize(fullRegion, 1);\n+ a_mask.setVal(2);\n for(BoxIterator boxit(interiorRegion); boxit.ok(); ++boxit)\n {\n const IntVect& iv = boxit();\n@@ -1649,7 +1655,7 @@ namespace amrex\n retval += incrval;\n \n m_domain.linearOut(buf);\n- incrval = m_region.linearSize();\n+ incrval = m_domain.linearSize();\n buf += incrval;\n retval += incrval;\n \n@@ -1712,7 +1718,7 @@ namespace amrex\n retval += incrval;\n \n m_domain.linearIn(buf);\n- incrval = m_region.linearSize();\n+ incrval = m_domain.linearSize();\n buf += incrval;\n retval += incrval;\n \ndiff --git a/Tools/Postprocessing/F_Src/GNUmakefile b/Tools/Postprocessing/F_Src/GNUmakefile\nindex efde7008d77..0e669ec2f55 100644\n--- a/Tools/Postprocessing/F_Src/GNUmakefile\n+++ b/Tools/Postprocessing/F_Src/GNUmakefile\n@@ -99,8 +99,12 @@ programs += plt_compare_diff_grids.f90\n #programs += fcoarsen\n #programs += fwritecontents2d\n \n-all: $(pnames)\n+ifeq ($(DO_ALL), TRUE)\n+ ptmp := $(wildcard f*.f90)\n+ programs := $(basename $(ptmp))\n+endif\n \n+all: $(pnames)\n \n # probin stuff\n ifdef NEED_EOS_NETWORK\ndiff --git a/Tools/Postprocessing/F_Src/fdump.f90 b/Tools/Postprocessing/F_Src/fdump.f90\nindex d401cd10be5..de5bbe8a96c 100644\n--- a/Tools/Postprocessing/F_Src/fdump.f90\n+++ b/Tools/Postprocessing/F_Src/fdump.f90\n@@ -9,7 +9,7 @@ program fdump\n use bl_IO_module\n use plotfile_module\n use multifab_module\n- use util_module\n+ use box_util_module\n \n implicit none\n \n"}, "test": {"test_patch": "diff --git a/Tests/EBAMRElliptic/exec/cond.inputs b/Tests/EBAMRElliptic/exec/cond.inputs\nindex e0ade9bd292..b35cd1de5cc 100644\n--- a/Tests/EBAMRElliptic/exec/cond.inputs\n+++ b/Tests/EBAMRElliptic/exec/cond.inputs\n@@ -18,3 +18,6 @@ fill_ratio = 0.7\n buffer_size = 2\n \n which_geom = 5\n+\n+num_smooth = 4\n+num_smooth_bottom = 27\ndiff --git a/Tests/EBAMRElliptic/exec/conductivitySolve.cpp b/Tests/EBAMRElliptic/exec/conductivitySolve.cpp\nindex e26d5240420..48d17ac5139 100644\n--- a/Tests/EBAMRElliptic/exec/conductivitySolve.cpp\n+++ b/Tests/EBAMRElliptic/exec/conductivitySolve.cpp\n@@ -21,12 +21,14 @@\n #include \"AMReX_SphereIF.H\"\n #include \"AMReX_EBDebugDump.H\"\n #include \"AMReX_MeshRefine.H\"\n-#include \"AMReX_EBConducivityOp.H\"\n-#include \"AMReX_EBConducivityOpFactory.H\"\n-#include \"AMReX_DirichletConductivityEBBCFactory.H\"\n-#include \"AMReX_DirichletConductivityDomainBCFactory.H\"\n-#include \"AMReX_NeumannConductivityEBBCFactory.H\"\n-#include \"AMReX_NeumannConductivityDomainBCFactory.H\"\n+#include \"AMReX_EBConductivityOp.H\"\n+#include \"AMReX_EBConductivityOpFactory.H\"\n+#include \"AMReX_DirichletConductivityEBBC.H\"\n+#include \"AMReX_DirichletConductivityDomainBC.H\"\n+#include \"AMReX_NeumannConductivityEBBC.H\"\n+#include \"AMReX_NeumannConductivityDomainBC.H\"\n+#include \"AMReX_EBSimpleSolver.H\"\n+#include \"AMReX_LinearSolver.H\"\n \n namespace amrex\n {\n@@ -151,14 +153,14 @@ namespace amrex\n amrex::Error(\"unknown domain_bc_type\");\n }\n \n- if(ebbc_bc_type == 0)\n+ if(eb_bc_type == 0)\n {\n pout() << \"neumann eb bcs\" << endl;\n NeumannConductivityEBBCFactory* neumptr = (new NeumannConductivityEBBCFactory());\n neumptr->setValue(0.);\n ebBCFact = shared_ptr<ConductivityBaseEBBCFactory>(static_cast<ConductivityBaseEBBCFactory*>(neumptr));\n }\n- else if(domain_bc_type == 1)\n+ else if(eb_bc_type == 1)\n {\n int order_ebbc;\n pp.get(\"order_ebbc\", order_ebbc);\n@@ -180,6 +182,11 @@ namespace amrex\n vector<shared_ptr<FabArray<EBFluxFAB> > > bcoef(numLevels);\n for(int ilev = 0; ilev < numLevels; ilev++)\n {\n+ const BoxArray & ba = a_veblg[ilev].getDBL();\n+ const DistributionMapping& dm = a_veblg[ilev].getDM();\n+ EBCellFactory cellfact(a_veblg[ilev].getEBISL());\n+ EBFluxFactory fluxfact(a_veblg[ilev].getEBISL());\n+\n acoef[ilev] = shared_ptr<FabArray<EBCellFAB> >(new FabArray<EBCellFAB>(ba, dm, 1, 0, MFInfo(), cellfact));\n bcoef[ilev] = shared_ptr<FabArray<EBFluxFAB> >(new FabArray<EBFluxFAB>(ba, dm, 1, 0, MFInfo(), fluxfact));\n \n@@ -189,7 +196,15 @@ namespace amrex\n \n EBConductivityOpFactory factory(a_veblg, alpha, beta, acoef, bcoef, a_params.coarsestDx, a_params.refRatio,\n domainBCFact, ebBCFact, a_nghost, a_nghost);\n- a_solver.define(a_params.coarsestDomain, factory, bottomSolverPtr, a_params.refRatio, enableLevelSolves, numLevels);\n+\n+ EBSimpleSolver* simple = new EBSimpleSolver();\n+ int num_smooth_bottom = 10;\n+ pp.query(\"num_smooth_bottom\", num_smooth_bottom);\n+ simple->setNumSmooths(num_smooth_bottom);\n+ shared_ptr<LinearSolver<FabArray<EBCellFAB> > > bottomSolverPtr(static_cast<LinearSolver<FabArray<EBCellFAB> > *>(simple));\n+\n+ AMRLevelOpFactory<FabArray<EBCellFAB> >* factptr = static_cast<AMRLevelOpFactory<FabArray<EBCellFAB> >* >(&factory);\n+ a_solver.define(a_params.coarsestDomain,*factptr, bottomSolverPtr, a_params.refRatio, enableLevelSolves, numLevels);\n }\n //----------------\n int conjuctionJunction()\n@@ -228,7 +243,7 @@ namespace amrex\n \n solver.solve(phi, rhs, lbase, lmax);\n \n- writeEBPlotFile(string(\"phi.ebplt\"), phi);\n+// writeEBPlotFile(string(\"phi.ebplt\"), phi);\n \n return 0;\n }\n", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}62{"question_id": "MSB_openmm_openmm_pr3416", "question_type": "multi_swe_bench", "description": "Support prmtop files created by chamber (openmm/openmm#3416)", "content": {"org": "openmm", "repo": "openmm", "pr_number": 3416, "issue_title": "Support prmtop files created by chamber", "issue_body": "Implements #3225.", "base_commit": "f2cdf70afc3ec4f4f0a4fc3aa5ca4761fc994cf1", "resolved_issues": [{"number": null, "title": "Support prmtop files created by chamber", "body": "Currently, prmtop files created using the CHAMBER tool are not supported in the software, which prevents users from utilizing these files for simulations. This limitation can be inconvenient for users who rely on CHAMBER-generated prmtop files as part of their workflows.\n\nThe expected behavior is that the software should support prmtop files created by CHAMBER, allowing users to load these files, create systems, and perform simulations without encountering errors. This enhancement would improve compatibility and provide a more seamless experience for users working with CHAMBER-generated files.\n\n## IMPORTANT INSTRUCTIONS\n\n1. If you edit a python file, you MUST run 'make PythonInstall' inside the build directory\n2. If you edit a c++ file, you MUST run 'make -j4 && make install\" inside the build directory"}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/openmm_m_openmm:pr-3416", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/wrappers/python/openmm/app/amberprmtopfile.py b/wrappers/python/openmm/app/amberprmtopfile.py\nindex c8021ddb0e..5c6d280da3 100644\n--- a/wrappers/python/openmm/app/amberprmtopfile.py\n+++ b/wrappers/python/openmm/app/amberprmtopfile.py\n@@ -6,7 +6,7 @@\n Biological Structures at Stanford, funded under the NIH Roadmap for\n Medical Research, grant U54 GM072970. See https://simtk.org.\n \n-Portions copyright (c) 2012 Stanford University and the Authors.\n+Portions copyright (c) 2012-2022 Stanford University and the Authors.\n Authors: Peter Eastman\n Contributors:\n \n@@ -220,10 +220,6 @@ def createSystem(self, nonbondedMethod=ff.NoCutoff, nonbondedCutoff=1.0*u.nanome\n System\n the newly created System\n \"\"\"\n- if self._prmtop.chamber:\n- raise ValueError(\"CHAMBER-style topology file detected. CHAMBER \"\n- \"topologies are not supported -- use the native \"\n- \"CHARMM files directly.\")\n methodMap = {ff.NoCutoff:'NoCutoff',\n ff.CutoffNonPeriodic:'CutoffNonPeriodic',\n ff.CutoffPeriodic:'CutoffPeriodic',\ndiff --git a/wrappers/python/openmm/app/internal/amber_file_parser.py b/wrappers/python/openmm/app/internal/amber_file_parser.py\nindex 677cdb77c0..77a2f4d4bf 100644\n--- a/wrappers/python/openmm/app/internal/amber_file_parser.py\n+++ b/wrappers/python/openmm/app/internal/amber_file_parser.py\n@@ -12,7 +12,7 @@\n Biological Structures at Stanford, funded under the NIH Roadmap for\n Medical Research, grant U54 GM072970. See https://simtk.org.\n \n-Portions copyright (c) 2012-2014 Stanford University and the Authors.\n+Portions copyright (c) 2012-2022 Stanford University and the Authors.\n Authors: Randall J. Radmer, John D. Chodera, Peter Eastman\n Contributors: Christoph Klein, Michael R. Shirts, Jason Swails, Kye Won Wang\n \n@@ -42,7 +42,7 @@\n \n import os\n import re\n-from math import ceil, cos, sin, asin, sqrt\n+from math import ceil, cos, sin, asin, sqrt, pi\n import warnings\n \n try:\n@@ -128,10 +128,6 @@ def __init__(self, inFilename):\n tag, self._prmtopVersion = line.rstrip().split(None, 1)\n elif line.startswith('%FLAG'):\n tag, flag = line.rstrip().split(None, 1)\n- if flag == 'CTITLE':\n- raise TypeError('CHAMBER-style topology files are not supported here. '\n- 'Consider using the CHARMM files directly with CharmmPsfFile '\n- 'or ParmEd (where CHAMBER topologies are supported)')\n self._flags.append(flag)\n self._raw_data[flag] = []\n elif line.startswith('%FORMAT'):\n@@ -139,8 +135,12 @@ def __init__(self, inFilename):\n index0=format.index('(')\n index1=format.index(')')\n format = format[index0+1:index1]\n- m = FORMAT_RE_PATTERN.search(format)\n- self._raw_format[self._flags[-1]] = (format, m.group(1), m.group(2), int(m.group(3)), m.group(4))\n+ try:\n+ m = FORMAT_RE_PATTERN.search(format)\n+ self._raw_format[self._flags[-1]] = (format, m.group(1), m.group(2), int(m.group(3)), m.group(4))\n+ except:\n+ # We couldn't parse the format, so just treat the whole line as a single string.\n+ self._raw_format[self._flags[-1]] = (format, 1, 'a', 80, '')\n elif line.startswith('%COMMENT'):\n continue\n elif self._flags \\\n@@ -429,6 +429,30 @@ def getAngles(self):\n float(angleEquil[iType])))\n return self._angleList\n \n+ def getUreyBradleys(self):\n+ \"\"\"Return list of atom pairs, K, and Rmin for each Urey-Bradley term\"\"\"\n+ try:\n+ return self._ureyBradleyList\n+ except AttributeError:\n+ pass\n+ self._ureyBradleyList = []\n+ if 'CHARMM_UREY_BRADLEY' in self._raw_data:\n+ ureyBradleyPointers = self._raw_data[\"CHARMM_UREY_BRADLEY\"]\n+ forceConstant = self._raw_data[\"CHARMM_UREY_BRADLEY_FORCE_CONSTANT\"]\n+ equilValue = self._raw_data[\"CHARMM_UREY_BRADLEY_EQUIL_VALUE\"]\n+ forceConstConversionFactor = (units.kilocalorie_per_mole/(units.angstrom*units.angstrom)).conversion_factor_to(units.kilojoule_per_mole/(units.nanometer*units.nanometer))\n+ lengthConversionFactor = units.angstrom.conversion_factor_to(units.nanometer)\n+ for ii in range(0, len(ureyBradleyPointers), 3):\n+ if int(ureyBradleyPointers[ii]) < 0 or int(ureyBradleyPointers[ii+1]) < 0:\n+ raise Exception(\"Found negative Urey-Bradley atom pointers %s\"\n+ % ((ureyBradleyPointers[ii], ureyBradleyPointers[ii+1])))\n+ iType = int(ureyBradleyPointers[ii+2])-1\n+ self._ureyBradleyList.append((int(ureyBradleyPointers[ii])-1,\n+ int(ureyBradleyPointers[ii+1])-1,\n+ float(forceConstant[iType])*forceConstConversionFactor,\n+ float(equilValue[iType])*lengthConversionFactor))\n+ return self._ureyBradleyList\n+\n def getDihedrals(self):\n \"\"\"Return list of atom quads, K, phase and periodicity for each dihedral angle\"\"\"\n try:\n@@ -459,14 +483,45 @@ def getDihedrals(self):\n int(0.5+float(periodicity[iType]))))\n return self._dihedralList\n \n+ def getImpropers(self):\n+ \"\"\"Return list of atom quads, K, and phase for each improper torsion\"\"\"\n+ try:\n+ return self._improperList\n+ except AttributeError:\n+ pass\n+ self._improperList = []\n+ if 'CHARMM_IMPROPERS' in self._raw_data:\n+ forceConstant = self._raw_data[\"CHARMM_IMPROPER_FORCE_CONSTANT\"]\n+ phase = self._raw_data[\"CHARMM_IMPROPER_PHASE\"]\n+ improperPointers = self._raw_data[\"CHARMM_IMPROPERS\"]\n+ forceConstConversionFactor = (units.kilocalorie_per_mole).conversion_factor_to(units.kilojoule_per_mole)\n+ for ii in range(0,len(improperPointers),5):\n+ if int(improperPointers[ii])<0 or int(improperPointers[ii+1])<0:\n+ raise Exception(\"Found negative improper atom pointers %s\"\n+ % ((improperPointers[ii],\n+ improperPointers[ii+1],\n+ improperPointers[ii+2],\n+ improperPointers[ii+3]),))\n+ iType = int(improperPointers[ii+4])-1\n+ self._improperList.append((int(improperPointers[ii])-1,\n+ int(improperPointers[ii+1])-1,\n+ abs(int(improperPointers[ii+2]))-1,\n+ abs(int(improperPointers[ii+3]))-1,\n+ float(forceConstant[iType])*forceConstConversionFactor,\n+ float(phase[iType])))\n+ return self._improperList\n+\n def getNumMaps(self):\n \"\"\"Return number of CMAPs. Return 0 if CMAP does not exist\"\"\"\n try:\n return self._numCMAP\n except AttributeError:\n pass\n- if \"CMAP_COUNT\" in self._raw_data.keys():\n- self._numCMAP=int(self._raw_data[\"CMAP_COUNT\"][1])\n+ flag = 'CMAP_COUNT'\n+ if flag not in self._raw_data and self.chamber:\n+ flag = 'CHARMM_CMAP_COUNT'\n+ if flag in self._raw_data:\n+ self._numCMAP = int(self._raw_data[flag][1])\n return self._numCMAP\n return 0\n \n@@ -476,14 +531,19 @@ def getCMAPResolutions(self):\n return self._cmapResolution\n except AttributeError:\n pass\n- if \"CMAP_RESOLUTION\" in self._raw_data.keys():\n- self._cmapResolution=self._raw_data[\"CMAP_RESOLUTION\"]\n+ flag = 'CMAP_RESOLUTION'\n+ if flag not in self._raw_data and self.chamber:\n+ flag = 'CHARMM_CMAP_RESOLUTION'\n+ if flag in self._raw_data:\n+ self._cmapResolution=self._raw_data[flag]\n return self._cmapResolution\n return 0\n \n def getCMAPParameters(self, index):\n \"\"\"Return list of CMAP energy values\"\"\"\n- flag=\"CMAP_PARAMETER_{:02d}\".format(index)\n+ flag = \"CMAP_PARAMETER_{:02d}\".format(index)\n+ if flag not in self._raw_data and self.chamber:\n+ flag = \"CHARMM_CMAP_PARAMETER_{:02d}\".format(index)\n return [float(pointer) for pointer in self._raw_data[flag]]\n \n def getCMAPDihedrals(self):\n@@ -492,7 +552,10 @@ def getCMAPDihedrals(self):\n return self._cmapList\n except AttributeError:\n pass\n- cmapPointers = self._raw_data[\"CMAP_INDEX\"]\n+ flag = 'CMAP_INDEX'\n+ if flag not in self._raw_data and self.chamber:\n+ flag = 'CHARMM_CMAP_INDEX'\n+ cmapPointers = self._raw_data[flag]\n self._cmapList=[]\n forceConstConversionFactor = (units.kilocalorie_per_mole).conversion_factor_to(units.kilojoule_per_mole)\n for ii in range(0,len(cmapPointers),6):\n@@ -521,68 +584,45 @@ def get14Interactions(self):\n +self._raw_data[\"DIHEDRALS_WITHOUT_HYDROGEN\"]\n returnList=[]\n charges=self.getCharges()\n- try:\n- nonbondTerms = self.getNonbondTerms()\n- except NbfixPresent:\n- # We need to do the unit conversions here, since getNonbondTerms\n- # never finished and it has unit conversions in there\n- length_conv = units.angstrom.conversion_factor_to(units.nanometers)\n- ene_conv = units.kilocalories_per_mole.conversion_factor_to(\n- units.kilojoules_per_mole)\n+ length_conv = units.angstrom.conversion_factor_to(units.nanometers)\n+ ene_conv = units.kilocalories_per_mole.conversion_factor_to(\n+ units.kilojoules_per_mole)\n+ if self.chamber:\n+ parm_acoef = [float(x) for x in self._raw_data['LENNARD_JONES_14_ACOEF']]\n+ parm_bcoef = [float(x) for x in self._raw_data['LENNARD_JONES_14_BCOEF']]\n+ else:\n parm_acoef = [float(x) for x in self._raw_data['LENNARD_JONES_ACOEF']]\n parm_bcoef = [float(x) for x in self._raw_data['LENNARD_JONES_BCOEF']]\n- nbidx = [int(x) for x in self._raw_data['NONBONDED_PARM_INDEX']]\n- numTypes = self.getNumTypes()\n- atomTypeIndexes=self._getAtomTypeIndexes()\n- for ii in range(0, len(dihedralPointers), 5):\n- if int(dihedralPointers[ii+2])>0 and int(dihedralPointers[ii+3])>0:\n- iAtom = int(dihedralPointers[ii])//3\n- lAtom = int(dihedralPointers[ii+3])//3\n- iidx = int(dihedralPointers[ii+4]) - 1\n- chargeProd = charges[iAtom]*charges[lAtom]\n- typ1 = atomTypeIndexes[iAtom] - 1\n- typ2 = atomTypeIndexes[lAtom] - 1\n- idx = nbidx[numTypes*typ1+typ2] - 1\n- if idx < 0: continue\n- a = parm_acoef[idx]\n- b = parm_bcoef[idx]\n- try:\n- epsilon = b * b / (4 * a) * ene_conv\n- rMin = (2 * a / b) ** (1/6.0) * length_conv\n- except ZeroDivisionError:\n- rMin = 1\n- epsilon = 0\n- try:\n- iScee = float(self._raw_data['SCEE_SCALE_FACTOR'][iidx])\n- except KeyError:\n- iScee = 1.2\n- try:\n- iScnb = float(self._raw_data['SCNB_SCALE_FACTOR'][iidx])\n- except KeyError:\n- iScnb = 2.0\n- returnList.append((iAtom, lAtom, chargeProd, rMin, epsilon, iScee, iScnb))\n- else:\n- # This block gets hit if NbfixPresent is _not_ caught\n- for ii in range(0,len(dihedralPointers),5):\n- if int(dihedralPointers[ii+2])>0 and int(dihedralPointers[ii+3])>0:\n- iAtom = int(dihedralPointers[ii])//3\n- lAtom = int(dihedralPointers[ii+3])//3\n- iidx = int(dihedralPointers[ii+4]) - 1\n- chargeProd = charges[iAtom]*charges[lAtom]\n- (rVdwI, epsilonI) = nonbondTerms[iAtom]\n- (rVdwL, epsilonL) = nonbondTerms[lAtom]\n- rMin = (rVdwI+rVdwL)\n- epsilon = sqrt(epsilonI*epsilonL)\n- try:\n- iScee = float(self._raw_data[\"SCEE_SCALE_FACTOR\"][iidx])\n- except KeyError:\n- iScee = 1.2\n- try:\n- iScnb = float(self._raw_data[\"SCNB_SCALE_FACTOR\"][iidx])\n- except KeyError:\n- iScnb = 2.0\n-\n- returnList.append((iAtom, lAtom, chargeProd, rMin, epsilon, iScee, iScnb))\n+ nbidx = [int(x) for x in self._raw_data['NONBONDED_PARM_INDEX']]\n+ numTypes = self.getNumTypes()\n+ atomTypeIndexes=self._getAtomTypeIndexes()\n+ for ii in range(0, len(dihedralPointers), 5):\n+ if int(dihedralPointers[ii+2])>0 and int(dihedralPointers[ii+3])>0:\n+ iAtom = int(dihedralPointers[ii])//3\n+ lAtom = int(dihedralPointers[ii+3])//3\n+ iidx = int(dihedralPointers[ii+4]) - 1\n+ chargeProd = charges[iAtom]*charges[lAtom]\n+ typ1 = atomTypeIndexes[iAtom] - 1\n+ typ2 = atomTypeIndexes[lAtom] - 1\n+ idx = nbidx[numTypes*typ1+typ2] - 1\n+ if idx < 0: continue\n+ a = parm_acoef[idx]\n+ b = parm_bcoef[idx]\n+ try:\n+ epsilon = b * b / (4 * a) * ene_conv\n+ rMin = (2 * a / b) ** (1/6.0) * length_conv\n+ except ZeroDivisionError:\n+ rMin = 1\n+ epsilon = 0\n+ try:\n+ iScee = float(self._raw_data['SCEE_SCALE_FACTOR'][iidx])\n+ except KeyError:\n+ iScee = 1.0 if self.chamber else 1.2\n+ try:\n+ iScnb = float(self._raw_data['SCNB_SCALE_FACTOR'][iidx])\n+ except KeyError:\n+ iScnb = 1.0 if self.chamber else 2.0\n+ returnList.append((iAtom, lAtom, chargeProd, rMin, epsilon, iScee, iScnb))\n return returnList\n \n def getExcludedAtoms(self):\n@@ -750,6 +790,15 @@ def readAmberSystem(topology, prmtop_filename=None, prmtop_loader=None, shake=No\n for (iAtom, jAtom, k, rMin) in prmtop.getBondsNoH():\n force.addBond(iAtom, jAtom, rMin, 2*k)\n system.addForce(force)\n+ \n+ # Add Urey-Bradley terms.\n+ if len(prmtop.getUreyBradleys()) > 0:\n+ if verbose: print(\"Adding Urey-Bradley terms...\")\n+ force = mm.HarmonicBondForce()\n+ force.setName('UreyBradleyForce')\n+ for (iAtom, jAtom, k, rMin) in prmtop.getUreyBradleys():\n+ force.addBond(iAtom, jAtom, rMin, 2*k)\n+ system.addForce(force)\n \n # Add harmonic angles.\n if verbose: print(\"Adding angles...\")\n@@ -796,6 +845,17 @@ def readAmberSystem(topology, prmtop_filename=None, prmtop_loader=None, shake=No\n force.addTorsion(iAtom, jAtom, kAtom, lAtom, periodicity, phase, forceConstant)\n system.addForce(force)\n \n+ # Add impropers.\n+ if len(prmtop.getImpropers()) > 0:\n+ if verbose: print(\"Adding impropers...\")\n+ force = mm.CustomTorsionForce(f'k*min(dtheta, 2*{pi}-dtheta)^2; dtheta = abs(theta-theta0)')\n+ force.addPerTorsionParameter('k')\n+ force.addPerTorsionParameter('theta0')\n+ force.setName('ImproperTorsionForce')\n+ for (iAtom, jAtom, kAtom, lAtom, forceConstant, phase) in prmtop.getImpropers():\n+ force.addTorsion(iAtom, jAtom, kAtom, lAtom, (forceConstant, phase))\n+ system.addForce(force)\n+\n # Add CMAP info.\n ## Get mapSize and Resolutions\n numMap = prmtop.getNumMaps()\n"}, "test": {"test_patch": "diff --git a/wrappers/python/tests/TestAmberPrmtopFile.py b/wrappers/python/tests/TestAmberPrmtopFile.py\nindex 1461e2a272..4473a2d86b 100644\n--- a/wrappers/python/tests/TestAmberPrmtopFile.py\n+++ b/wrappers/python/tests/TestAmberPrmtopFile.py\n@@ -367,15 +367,31 @@ def test_with_dcd_reporter(self):\n os.remove(fname)\n \n def testChamber(self):\n- \"\"\" Tests that Chamber prmtops fail with proper error message \"\"\"\n- self.assertRaises(TypeError, lambda: AmberPrmtopFile('systems/ala3_solv.parm7'))\n- try:\n- parm = AmberPrmtopFile('systems/ala3_solv.parm7')\n- # Should not make it past here\n- self.assertTrue(False)\n- except TypeError as e:\n- # Make sure it says something about chamber\n- self.assertTrue('chamber' in str(e).lower())\n+ \"\"\"Test a prmtop file created with Chamber.\"\"\"\n+ prmtop = AmberPrmtopFile('systems/ala3_solv.parm7')\n+ crd = CharmmCrdFile('systems/ala3_solv.crd')\n+ system = prmtop.createSystem()\n+ for i,f in enumerate(system.getForces()):\n+ f.setForceGroup(i)\n+ integrator = VerletIntegrator(0.001)\n+ context = Context(system, integrator, Platform.getPlatformByName('Reference'))\n+ context.setPositions(crd.positions)\n+ \n+ # Compare to energies computed with pytraj.energy_decomposition()\n+ \n+ energy = context.getState(getEnergy=True).getPotentialEnergy().value_in_unit(kilocalories_per_mole)\n+ self.assertAlmostEqual(energy, -7806.981602, delta=5e-4*abs(energy))\n+ components = {}\n+ for i,f in enumerate(system.getForces()):\n+ components[f.getName()] = context.getState(getEnergy=True, groups={i}).getPotentialEnergy().value_in_unit(kilocalories_per_mole)\n+ self.assertAlmostEqual(components['HarmonicBondForce'], 1.13242125)\n+ self.assertAlmostEqual(components['HarmonicAngleForce'], 1.06880188)\n+ self.assertAlmostEqual(components['UreyBradleyForce'], 0.06142407)\n+ self.assertAlmostEqual(components['PeriodicTorsionForce'], 7.81143025)\n+ self.assertAlmostEqual(components['ImproperTorsionForce'], 2.66453526e-14, delta=1e-6)\n+ self.assertAlmostEqual(components['CMAPTorsionForce'], 0.12679003)\n+ self.assertAlmostEqual(components['CustomNonbondedForce'], 909.28136359)\n+ self.assertAlmostEqual(components['NonbondedForce'], -9007.16903192+277.35152722+3.35367163, delta=5e-4*abs(components['NonbondedForce']))\n \n def testGBneckRadii(self):\n \"\"\" Tests that GBneck radii limits are correctly enforced \"\"\"\n", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}63{"question_id": "MSB_openmm_openmm_pr3480", "question_type": "multi_swe_bench", "description": "Added option for box shape when building solvent boxes (openmm/openmm#3480)", "content": {"org": "openmm", "repo": "openmm", "pr_number": 3480, "issue_title": "Added option for box shape when building solvent boxes", "issue_body": "Fixes #3124.", "base_commit": "952d3402d12dda9931a0af2dce24fd9875e9b730", "resolved_issues": [{"number": 3124, "title": "Add truncated octahedral solvation option for Modeller.addSolvent()", "body": "It turns out that it's quite difficult to automate solvation within a truncated octahedron.\r\n\r\nCould we add an option to `Modeller.addSolvent()` that would allow the user to select between standard box shapes?\r\n\r\ncc : @glass-w, who can provide more information on use cases.\n\n## IMPORTANT INSTRUCTIONS\n\n1. If you edit a python file, you MUST run 'make PythonInstall' inside the build directory\n2. If you edit a c++ file, you MUST run 'make -j4 && make install\" inside the build directory"}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/openmm_m_openmm:pr-3480", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/wrappers/python/openmm/app/modeller.py b/wrappers/python/openmm/app/modeller.py\nindex 0920053d26..47ee5d9787 100644\n--- a/wrappers/python/openmm/app/modeller.py\n+++ b/wrappers/python/openmm/app/modeller.py\n@@ -6,7 +6,7 @@\n Biological Structures at Stanford, funded under the NIH Roadmap for\n Medical Research, grant U54 GM072970. See https://simtk.org.\n \n-Portions copyright (c) 2012-2021 Stanford University and the Authors.\n+Portions copyright (c) 2012-2022 Stanford University and the Authors.\n Authors: Peter Eastman\n Contributors:\n \n@@ -48,7 +48,7 @@\n import sys\n import xml.etree.ElementTree as etree\n from copy import deepcopy\n-from math import ceil, floor\n+from math import ceil, floor, sqrt\n from collections import defaultdict\n \n class Modeller(object):\n@@ -375,8 +375,8 @@ def _addIons(self, forcefield, numWaters, replaceableMols, ionCutoff=0.05*nanome\n self.topology = modeller.topology\n self.positions = modeller.positions\n \n- def addSolvent(self, forcefield, model='tip3p', boxSize=None, boxVectors=None, padding=None, numAdded=None, positiveIon='Na+', negativeIon='Cl-', ionicStrength=0*molar, neutralize=True):\n- \"\"\"Add solvent (both water and ions) to the model to fill a rectangular box.\n+ def addSolvent(self, forcefield, model='tip3p', boxSize=None, boxVectors=None, padding=None, numAdded=None, boxShape='cube', positiveIon='Na+', negativeIon='Cl-', ionicStrength=0*molar, neutralize=True):\n+ \"\"\"Add solvent (both water and ions) to the model to fill a periodic box.\n \n The algorithm works as follows:\n \n@@ -390,12 +390,18 @@ def addSolvent(self, forcefield, model='tip3p', boxSize=None, boxVectors=None, p\n \n 1. You can explicitly give the vectors defining the periodic box to use.\n 2. Alternatively, for a rectangular box you can simply give the dimensions of the unit cell.\n- 3. You can give a padding distance. The largest dimension of the solute (along the x, y, or z axis) is determined, and a cubic\n- box of size (largest dimension)+2*padding is used.\n- 4. You can specify the total number of molecules (both waters and ions) to add. A cubic box is then created whose size is\n+ 3. You can give a padding distance. A bounding sphere containing the solute is determined, and the box size is\n+ set to (sphere radius)+(padding). This guarantees no atom in the solute will come closer than the padding\n+ distance to any atom of another periodic copy.\n+ 4. You can specify the total number of molecules (both waters and ions) to add. A box is then created whose size is\n just large enough hold the specified amount of solvent.\n 5. Finally, if none of the above options is specified, the existing Topology's box vectors are used.\n \n+ When specifying either a padding distance or a number of molecules, you can specify a shape for the periodic box:\n+ cubic, rhombic dodecahedron, or truncated octahedron. Using a non-rectangular box allows the same distance\n+ between periodic copies to be achieved with a smaller box. The most compact option is a rhombic dodecahedron,\n+ for which the box volume is 70.7% the volume of a cubic box with the same amount of padding.\n+\n Parameters\n ----------\n forcefield : ForceField\n@@ -410,6 +416,9 @@ def addSolvent(self, forcefield, model='tip3p', boxSize=None, boxVectors=None, p\n the padding distance to use\n numAdded : int=None\n the total number of molecules (waters and ions) to add\n+ boxShape: str='cube'\n+ the box shape to use. Allowed values are 'cube', 'dodecahedron', and 'octahedron'. If padding and numAdded\n+ are both None, this is ignored.\n positiveIon : string='Na+'\n the type of positive ion to add. Allowed values are 'Cs+', 'K+', 'Li+', 'Na+', and 'Rb+'\n negativeIon : string='Cl-'\n@@ -449,7 +458,7 @@ def addSolvent(self, forcefield, model='tip3p', boxSize=None, boxVectors=None, p\n if numAdded is not None:\n # Select a padding distance which is guaranteed to give more than the specified number of molecules.\n \n- padding = 1.1*(numAdded/((len(pdbResidues)/pdbBoxSize[0]**3)*8))**(1.0/3.0)\n+ padding = 2.2*(numAdded/((len(pdbResidues)/pdbBoxSize[0]**3)*8))**(1.0/3.0)\n if padding < 0.5:\n padding = 0.5 # Ensure we have enough when adding very small numbers of molecules\n if boxVectors is not None:\n@@ -466,12 +475,23 @@ def addSolvent(self, forcefield, model='tip3p', boxSize=None, boxVectors=None, p\n if is_quantity(padding):\n padding = padding.value_in_unit(nanometer)\n if len(self.positions) == 0:\n- maxSize = 0\n+ radius = 0\n+ else:\n+ positions = self.positions.value_in_unit(nanometer)\n+ minRange = Vec3(*(min((pos[i] for pos in positions)) for i in range(3)))\n+ maxRange = Vec3(*(max((pos[i] for pos in positions)) for i in range(3)))\n+ center = 0.5*(minRange+maxRange)\n+ radius = max(unit.norm(center-pos) for pos in positions)\n+ width = 2*radius+padding\n+ box = width*Vec3(1, 1, 1)\n+ if boxShape == 'cube':\n+ vectors = (Vec3(width, 0, 0), Vec3(0, width, 0), Vec3(0, 0, width))\n+ elif boxShape == 'dodecahedron':\n+ vectors = (Vec3(width, 0, 0), Vec3(0, width, 0), Vec3(0.5, 0.5, 0.5*sqrt(2))*width)\n+ elif boxShape == 'octahedron':\n+ vectors = (Vec3(width, 0, 0), Vec3(1/3, 2*sqrt(2)/3, 0)*width, Vec3(-1/3, sqrt(2)/3, sqrt(6)/3)*width)\n else:\n- maxSize = max(max((pos[i] for pos in self.positions))-min((pos[i] for pos in self.positions)) for i in range(3))\n- maxSize = maxSize.value_in_unit(nanometer)\n- box = (maxSize+2*padding)*Vec3(1, 1, 1)\n- vectors = (Vec3(maxSize+2*padding, 0, 0), Vec3(0, maxSize+2*padding, 0), Vec3(0, 0, maxSize+2*padding))\n+ raise ValueError(f'Illegal box shape: {boxShape}')\n else:\n box = self.topology.getUnitCellDimensions().value_in_unit(nanometer)\n vectors = self.topology.getPeriodicBoxVectors().value_in_unit(nanometer)\n"}, "test": {"test_patch": "diff --git a/wrappers/python/tests/TestModeller.py b/wrappers/python/tests/TestModeller.py\nindex ec65574f11..467ee8083a 100644\n--- a/wrappers/python/tests/TestModeller.py\n+++ b/wrappers/python/tests/TestModeller.py\n@@ -1,7 +1,5 @@\n from collections import defaultdict\n import unittest\n-import math\n-import sys\n \n from validateModeller import *\n from openmm.app import *\n@@ -333,7 +331,6 @@ def test_addSolventPeriodicBox(self):\n self.assertVecAlmostEqual(dim3[2]/nanometers, Vec3(0, 0, 5.5))\n \n # Second way of passing in the periodic box vectors: with the boxSize parameter to addSolvent()\n- topology_start = self.pdb.topology\n modeller = Modeller(topology_start, self.positions)\n modeller.deleteWater()\n modeller.addSolvent(self.forcefield, boxSize = Vec3(3.6, 4.6, 5.6)*nanometers)\n@@ -345,7 +342,6 @@ def test_addSolventPeriodicBox(self):\n self.assertVecAlmostEqual(dim3[2]/nanometers, Vec3(0, 0, 5.6))\n \n # Third way of passing in the periodic box vectors: with the boxVectors parameter to addSolvent()\n- topology_start = self.pdb.topology\n modeller = Modeller(topology_start, self.positions)\n modeller.deleteWater()\n modeller.addSolvent(self.forcefield, boxVectors = (Vec3(3.4, 0, 0), Vec3(0.5, 4.4, 0), Vec3(-1.0, -1.5, 5.4))*nanometers)\n@@ -357,25 +353,43 @@ def test_addSolventPeriodicBox(self):\n self.assertVecAlmostEqual(dim3[2]/nanometers, Vec3(-1.0, -1.5, 5.4))\n \n # Fourth way of passing in the periodic box vectors: pass a 'padding' value to addSolvent()\n- topology_start = self.pdb.topology\n modeller = Modeller(topology_start, self.positions)\n modeller.deleteWater()\n modeller.addSolvent(self.forcefield, padding = 1.0*nanometers)\n topology_after = modeller.getTopology()\n dim3 = topology_after.getPeriodicBoxVectors()\n \n- self.assertVecAlmostEqual(dim3[0]/nanometers, Vec3(2.8802, 0, 0))\n- self.assertVecAlmostEqual(dim3[1]/nanometers, Vec3(0, 2.8802, 0))\n- self.assertVecAlmostEqual(dim3[2]/nanometers, Vec3(0, 0, 2.8802))\n+ self.assertVecAlmostEqual(dim3[0]/nanometers, Vec3(1.924363, 0, 0))\n+ self.assertVecAlmostEqual(dim3[1]/nanometers, Vec3(0, 1.924363, 0))\n+ self.assertVecAlmostEqual(dim3[2]/nanometers, Vec3(0, 0, 1.924363))\n \n # Fifth way: specify a number of molecules to add instead of a box size\n- topology_start = self.pdb.topology\n modeller = Modeller(topology_start, self.positions)\n modeller.deleteWater()\n numInitial = len(list(modeller.topology.residues()))\n modeller.addSolvent(self.forcefield, numAdded=1000)\n self.assertEqual(numInitial+1000, len(list(modeller.topology.residues())))\n \n+ def test_addSolventBoxShape(self):\n+ \"\"\"Test the addSolvent() method; test the different box shapes.\"\"\"\n+ modeller = Modeller(self.pdb.topology, self.positions)\n+ modeller.deleteWater()\n+ modeller.addSolvent(self.forcefield, padding=1.0*nanometers, boxShape='cube')\n+ cubeVectors = modeller.getTopology().getPeriodicBoxVectors()\n+ modeller = Modeller(self.pdb.topology, self.positions)\n+ modeller.deleteWater()\n+ modeller.addSolvent(self.forcefield, padding=1.0*nanometers, boxShape='dodecahedron')\n+ dodecVectors = modeller.getTopology().getPeriodicBoxVectors()\n+ modeller = Modeller(self.pdb.topology, self.positions)\n+ modeller.deleteWater()\n+ modeller.addSolvent(self.forcefield, padding=1.0*nanometers, boxShape='octahedron')\n+ octVectors = modeller.getTopology().getPeriodicBoxVectors()\n+ cubeVolume = cubeVectors[0][0]*cubeVectors[1][1]*cubeVectors[2][2]/(nanometers**3)\n+ dodecVolume = dodecVectors[0][0]*dodecVectors[1][1]*dodecVectors[2][2]/(nanometers**3)\n+ octVolume = octVectors[0][0]*octVectors[1][1]*octVectors[2][2]/(nanometers**3)\n+ self.assertAlmostEqual(0.707, dodecVolume/cubeVolume, places=3)\n+ self.assertAlmostEqual(0.770, octVolume/cubeVolume, places=3)\n+\n def test_addSolventNeutralSolvent(self):\n \"\"\" Test the addSolvent() method; test adding ions to neutral solvent. \"\"\"\n \n", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}64{"question_id": "MSB_openmm_openmm_pr3493", "question_type": "multi_swe_bench", "description": "Ensure bond lengths are set before creating forces that depend on them (openmm/openmm#3493)", "content": {"org": "openmm", "repo": "openmm", "pr_number": 3493, "issue_title": "Ensure bond lengths are set before creating forces that depend on them", "issue_body": "Fixes #3487.", "base_commit": "a7e6f0a906c5c4dd544f134eceb177cfea7b637b", "resolved_issues": [{"number": 3487, "title": "Switching the order of forcefield.xml files causes simulation to crash", "body": "Hi @peastman,\r\n\r\nI have a rather strange bug happening for me. I have (finally) tracked it down to a switching of the strings when defining the forcefield. For example, if I specify:\r\n`forcefield = ForceField(\"amoeba2018.xml\", \"formamide.xml\")`\r\nthe simulation will run for a bit, then crash. However, If I switch the order of those and instead use:\r\n`forcefield = ForceField(\"formamide.xml\", \"amoeba2018.xml\")`\r\nthe simulation works as expected.\r\n\r\n\r\nI am using OpenMM built from source at the current point on master.\r\n\r\nHere are some test files (reference platform) that reproduce the error:\r\n\r\n[fails_nve.py.txt](https://github.com/openmm/openmm/files/8150049/fails_nve.py.txt)\r\n[formamide.xml.txt](https://github.com/openmm/openmm/files/8150050/formamide.xml.txt)\r\n[system.pdb.txt](https://github.com/openmm/openmm/files/8150051/system.pdb.txt)\r\n[works_nve.py.txt](https://github.com/openmm/openmm/files/8150052/works_nve.py.txt)\r\n\r\nBelow are the output from the various platforms. Usually it seems like the energy terms spike massively just before it crashes, but I don't understand why the order of the .xml files would do this.\r\n\r\nThanks,\r\n\r\nGareth\r\n\r\n\r\n### Reference:\r\n`#\"Step\",\"Potential Energy (kJ/mole)\",\"Kinetic Energy (kJ/mole)\",\"Total Energy (kJ/mole)\",\"Temperature (K)\",\"Box Volume (nm^3)\",\"Density (g/mL)\"`\r\n...\r\n`100,-53.494514506154964,27.039465172753232,-26.455049333401732,433.6133540563737,1.030301,0.07259270846536811\r\n110,-27.236485666785786,3.3086763563983093,-23.927809310387477,53.05897299442808,1.030301,0.07259270846536811\r\nSegmentation fault (core dumped)`\r\n### OpenCL:\r\n`100,-53.23412222478068,26.82700063288212,-26.40712159189856,430.2062059799246,1.030301,0.07259270846536811\r\n110,-32.92316336247599,6.56602069735527,-26.35714266512072,105.29476967069344,1.030301,0.07259270846536811\r\n120,1.4365499225153265e+23,31547775385600.0,1.4365499228308042e+23,505910032264674.25,1.030301,0.07259270846536811\r\n130,9.812762097322067e+28,904854700294144.0,9.812762097322157e+28,1.4510534103447568e+16,1.030301,0.07259270846536811\r\n140,1.4205908385270204e+31,3358057606152192.0,1.4205908385270207e+31,5.385086622147509e+16,1.030301,0.07259270846536811\r\n150,2.933014196877673e+32,6956549875433472.0,2.933014196877673e+32,1.1155741819874218e+17,1.030301,0.07259270846536811`\r\n\r\n`Traceback (most recent call last):\r\n File \"/lustre/rcghead1/users/c3162723/testing/ommTesting/newParamTests/formamide_version_testing/single_molecule/nve/opencl/./fails_nve.py\", line 32, in <module>\r\n simulation.step(600000)\r\n File \"/home/c3162723/software/src/my_openmm_fork/install/gnu8dev/28Feb22/pythonInstall/lib/python3.9/site-packages/openmm/app/simulation.py\", line 141, in step\r\n self._simulate(endStep=self.currentStep+steps)\r\n File \"/home/c3162723/software/src/my_openmm_fork/install/gnu8dev/28Feb22/pythonInstall/lib/python3.9/site-packages/openmm/app/simulation.py\", line 210, in _simulate\r\n self.integrator.step(stepsToGo)\r\n File \"/home/c3162723/software/src/my_openmm_fork/install/gnu8dev/28Feb22/pythonInstall/lib/python3.9/site-packages/openmm/openmm.py\", line 11636, in step\r\n return _openmm.VerletIntegrator_step(self, steps)\r\nopenmm.OpenMMException: clWaitForEvents`\r\n\r\n### CUDA:\r\n`90,-40.2270726642338,13.860071877017617,-26.367000787216185,222.26446476138204,1.030301,0.07259270846536811\r\n100,-53.23090262028849,26.823644541203976,-26.407258079084514,430.15238663994205,1.030301,0.07259270846536811\r\n110,-32.94177145573771,6.584286147728562,-26.357485308009146,105.58768016833501,1.030301,0.07259270846536811\r\n120,6.239121191292798e+23,33425676472320.0,6.239121191627055e+23,536024643762955.44,1.030301,0.07259270846536811\r\n130,4.826764310943093e+28,645174452781056.0,4.826764310943157e+28,1.0346220113250622e+16,1.030301,0.07259270846536811\r\n140,7.7064977143566e+30,2938203698364416.0,7.706497714356603e+30,4.711795711967144e+16,1.030301,0.07259270846536811`\r\n\r\n\r\n`Traceback (most recent call last):\r\n File \"/lustre/rcghead1/users/c3162723/testing/ommTesting/newParamTests/formamide_version_testing/single_molecule/nve/cuda/./fails_nve.py\", line 32, in <module>\r\n simulation.step(600000)\r\n File \"/home/c3162723/software/src/my_openmm_fork/install/gnu8dev/28Feb22/pythonInstall/lib/python3.9/site-packages/openmm/app/simulation.py\", line 141, in step\r\n self._simulate(endStep=self.currentStep+steps)\r\n File \"/home/c3162723/software/src/my_openmm_fork/install/gnu8dev/28Feb22/pythonInstall/lib/python3.9/site-packages/openmm/app/simulation.py\", line 243, in _simulate\r\n self._generate_reports(unwrapped, False)\r\n File \"/home/c3162723/software/src/my_openmm_fork/install/gnu8dev/28Feb22/pythonInstall/lib/python3.9/site-packages/openmm/app/simulation.py\", line 263, in _generate_reports\r\n reporter.report(self, state)\r\n File \"/home/c3162723/software/src/my_openmm_fork/install/gnu8dev/28Feb22/pythonInstall/lib/python3.9/site-packages/openmm/app/statedatareporter.py\", line 206, in report\r\n self._checkForErrors(simulation, state)\r\n File \"/home/c3162723/software/src/my_openmm_fork/install/gnu8dev/28Feb22/pythonInstall/lib/python3.9/site-packages/openmm/app/statedatareporter.py\", line 361, in _checkForErrors\r\n raise ValueError('Energy is NaN')\r\nValueError: Energy is NaN`\r\n\r\n### CPU:\r\n`80,-32.70232472144512,6.305932946930092,-26.39639177451503,101.12392083583997,1.030301,0.07259270846536811\r\n90,-43.12688017527704,16.725968222782672,-26.400911952494365,268.2228784698495,1.030301,0.07259270846536811\r\n100,-53.494514506154964,27.039465172753232,-26.455049333401732,433.6133540563737,1.030301,0.07259270846536811\r\n110,-27.236485666785786,3.3086763563983093,-23.927809310387477,53.05897299442808,1.030301,0.07259270846536811\r\nSegmentation fault (core dumped)`\r\n\r\n\n\n## IMPORTANT INSTRUCTIONS\n\n1. If you edit a python file, you MUST run 'make PythonInstall' inside the build directory\n2. If you edit a c++ file, you MUST run 'make -j4 && make install\" inside the build directory"}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/openmm_m_openmm:pr-3493", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/wrappers/python/openmm/app/forcefield.py b/wrappers/python/openmm/app/forcefield.py\nindex 19c69a6735..897678a878 100644\n--- a/wrappers/python/openmm/app/forcefield.py\n+++ b/wrappers/python/openmm/app/forcefield.py\n@@ -2057,6 +2057,11 @@ def parseElement(element, ff):\n generator.registerAngle(angle.attrib)\n \n def createForce(self, sys, data, nonbondedMethod, nonbondedCutoff, args):\n+ pass\n+\n+ def postprocessSystem(self, sys, data, args):\n+ # We need to wait until after all bonds have been added so their lengths will be set correctly.\n+\n existing = [f for f in sys.getForces() if type(f) == mm.HarmonicAngleForce]\n if len(existing) == 0:\n force = mm.HarmonicAngleForce()\n@@ -3733,8 +3738,11 @@ def parseElement(element, forceField):\n #=============================================================================================\n \n def createForce(self, sys, data, nonbondedMethod, nonbondedCutoff, args):\n+ self._nonbondedMethod = nonbondedMethod\n+ self._nonbondedCutoff = nonbondedCutoff\n \n- # get force\n+ def postprocessSystem(self, sys, data, args):\n+ # We need to wait until after all bonds have been added so their lengths will be set correctly.\n \n energy = \"\"\"k*(theta^2 + %s*theta^3 + %s*theta^4 + %s*theta^5 + %s*theta^6);\n theta = %.15g*pointangle(x2, y2, z2, x4, y4, z4, projx, projy, projz);\n@@ -3857,12 +3865,12 @@ def addBond(particles):\n \n for force in self.forceField._forces:\n if (force.__class__.__name__ == 'AmoebaAngleGenerator'):\n- force.createForcePostOpBendAngle(sys, data, nonbondedMethod, nonbondedCutoff, angles, args)\n- force.createForcePostOpBendInPlaneAngle(sys, data, nonbondedMethod, nonbondedCutoff, angles, args)\n+ force.createForcePostOpBendAngle(sys, data, self._nonbondedMethod, self._nonbondedCutoff, angles, args)\n+ force.createForcePostOpBendInPlaneAngle(sys, data, self._nonbondedMethod, self._nonbondedCutoff, angles, args)\n \n for force in self.forceField._forces:\n if (force.__class__.__name__ == 'AmoebaStretchBendGenerator'):\n- force.createForcePostAmoebaBondForce(sys, data, nonbondedMethod, nonbondedCutoff, angles, args)\n+ force.createForcePostAmoebaBondForce(sys, data, self._nonbondedMethod, self._nonbondedCutoff, angles, args)\n \n parsers[\"AmoebaOutOfPlaneBendForce\"] = AmoebaOutOfPlaneBendGenerator.parseElement\n \n@@ -4672,7 +4680,6 @@ def createForcePostAmoebaBondForce(self, sys, data, nonbondedMethod, nonbondedCu\n k1, k2 = self.k1[i], self.k2[i]\n else:\n k1, k2 = self.k2[i], self.k1[i]\n- \n force.addBond((angle[0], angle[1], angle[2]), (bondAB, bondCB, angleDict['idealAngle']/radian, k1, k2))\n \n break\n"}, "test": {"test_patch": "diff --git a/wrappers/python/tests/TestForceField.py b/wrappers/python/tests/TestForceField.py\nindex f78445af2f..a0f83b909b 100644\n--- a/wrappers/python/tests/TestForceField.py\n+++ b/wrappers/python/tests/TestForceField.py\n@@ -1020,7 +1020,7 @@ def test_ImpropersOrdering(self):\n system1 = ff1.createSystem(pdb.topology)\n system2 = ff2.createSystem(pdb.topology)\n \n- imp1 = system1.getForce(2).getTorsionParameters(158)\n+ imp1 = system1.getForce(1).getTorsionParameters(158)\n imp2 = system2.getForce(0).getTorsionParameters(158)\n \n system1_indexes = [imp1[0], imp1[1], imp1[2], imp1[3]]\n", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}65{"question_id": "MSB_openmm_openmm_pr3506", "question_type": "multi_swe_bench", "description": "Do not add constraints involving extra particles (openmm/openmm#3506)", "content": {"org": "openmm", "repo": "openmm", "pr_number": 3506, "issue_title": "Do not add constraints involving extra particles", "issue_body": "Fixes #3499.", "base_commit": "434d7afb1266da6d0b5fcd190593c470a0954c51", "resolved_issues": [{"number": 3499, "title": "TIP4P waters not compatible with AllBonds?", "body": "Hi All,\r\n\r\nI'm attempting to run a system with TIP4Pew waters using the \"AllBond\" constraint option, but I get the following error:\r\n```\r\nopenmm.OpenMMException: A constraint cannot involve a massless particle\r\n```\r\nI'm assuming this is because of the virtual site on the water molecules.\r\n\r\nHere is the script I'm using:\r\n```\r\nimport simtk.openmm.app as app\r\nimport simtk.openmm as mm\r\nimport simtk.unit as unit\r\nfrom sys import stdout\r\n\r\nimport numpy as np\r\n\r\nprmtop = app.AmberPrmtopFile('tryp_ben.prmtop')\r\ninpcrd = app.AmberInpcrdFile('tryp_ben.inpcrd')\r\nsystem = prmtop.createSystem(nonbondedMethod=app.PME, nonbondedCutoff=1*unit.nanometer,\r\n constraints=app.AllBonds)\r\n\r\nnum_steps = 10000\r\ntime_step = 0.002\r\n\r\ninput_file = \"tryp_ben_new.pdb\"\r\n\r\nmypdb = app.PDBFile(input_file)\r\n\r\nintegrator = mm.LangevinIntegrator(298.15*unit.kelvin, 1/unit.picosecond, time_step*unit.picoseconds)\r\nplatform = mm.Platform.getPlatformByName('CUDA')\r\nproperties = {'CudaDeviceIndex': '0', 'CudaPrecision': 'mixed'}\r\nsimulation = app.Simulation(prmtop.topology, system, integrator, platform, properties)\r\nsimulation.context.setPositions(mypdb.positions)\r\nsimulation.context.setPeriodicBoxVectors(*inpcrd.boxVectors)\r\nsimulation.minimizeEnergy()\r\nsimulation.context.setVelocitiesToTemperature(298.15 * unit.kelvin)\r\n```\r\n\r\nI've attached the files one can use to recreate this error.\r\n[tryp_ben.prmtop.zip](https://github.com/openmm/openmm/files/8181237/tryp_ben.prmtop.zip)\r\n[tryp_ben.inpcrd.zip](https://github.com/openmm/openmm/files/8181238/tryp_ben.inpcrd.zip)\r\n\n\n## IMPORTANT INSTRUCTIONS\n\n1. If you edit a python file, you MUST run 'make PythonInstall' inside the build directory\n2. If you edit a c++ file, you MUST run 'make -j4 && make install\" inside the build directory"}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/openmm_m_openmm:pr-3506", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/wrappers/python/openmm/app/internal/amber_file_parser.py b/wrappers/python/openmm/app/internal/amber_file_parser.py\nindex 26832fe589..e36152a962 100644\n--- a/wrappers/python/openmm/app/internal/amber_file_parser.py\n+++ b/wrappers/python/openmm/app/internal/amber_file_parser.py\n@@ -768,15 +768,18 @@ def readAmberSystem(topology, prmtop_filename=None, prmtop_loader=None, shake=No\n \n # Add constraints.\n isWater = [prmtop.getResidueLabel(i) in ('WAT', 'HOH', 'TP4', 'TP5', 'T4E') for i in range(prmtop.getNumAtoms())]\n+ isEP = [a.element is None for a in topology.atoms()]\n if shake in ('h-bonds', 'all-bonds', 'h-angles'):\n for (iAtom, jAtom, k, rMin) in prmtop.getBondsWithH():\n- system.addConstraint(iAtom, jAtom, rMin)\n+ if not (isEP[iAtom] or isEP[jAtom]):\n+ system.addConstraint(iAtom, jAtom, rMin)\n if shake in ('all-bonds', 'h-angles'):\n for (iAtom, jAtom, k, rMin) in prmtop.getBondsNoH():\n- system.addConstraint(iAtom, jAtom, rMin)\n+ if not (isEP[iAtom] or isEP[jAtom]):\n+ system.addConstraint(iAtom, jAtom, rMin)\n if rigidWater and shake is None:\n for (iAtom, jAtom, k, rMin) in prmtop.getBondsWithH():\n- if isWater[iAtom] and isWater[jAtom]:\n+ if isWater[iAtom] and isWater[jAtom] and not (isEP[iAtom] or isEP[jAtom]):\n system.addConstraint(iAtom, jAtom, rMin)\n \n # Add harmonic bonds.\n"}, "test": {"test_patch": "diff --git a/wrappers/python/tests/TestAmberPrmtopFile.py b/wrappers/python/tests/TestAmberPrmtopFile.py\nindex 4473a2d86b..b107e9dede 100644\n--- a/wrappers/python/tests/TestAmberPrmtopFile.py\n+++ b/wrappers/python/tests/TestAmberPrmtopFile.py\n@@ -448,5 +448,14 @@ def testAmberCMAP(self):\n OpenMM_CMAP_E = simulation.context.getState(getEnergy=True, groups=1<<i).getPotentialEnergy().value_in_unit(kilojoules_per_mole)/conversion\n self.assertAlmostEqual(OpenMM_CMAP_E, sander_CMAP_E, places=4)\n \n+ def testEPConstraints(self):\n+ \"\"\"Test different types of constraints when using extra particles\"\"\"\n+ prmtop = AmberPrmtopFile('systems/peptide_with_tip4p.prmtop')\n+ for constraints in (HBonds, AllBonds):\n+ system = prmtop.createSystem(constraints=constraints)\n+ integrator = VerletIntegrator(0.001*picoseconds)\n+ # If a constraint was added to a massless particle, this will throw an exception.\n+ context = Context(system, integrator, Platform.getPlatformByName('Reference'))\n+\n if __name__ == '__main__':\n unittest.main()\ndiff --git a/wrappers/python/tests/systems/peptide_with_tip4p.inpcrd b/wrappers/python/tests/systems/peptide_with_tip4p.inpcrd\nnew file mode 100644\nindex 0000000000..99127dab38\n--- /dev/null\n+++ b/wrappers/python/tests/systems/peptide_with_tip4p.inpcrd\n@@ -0,0 +1,46 @@\n+default_name\n+ 85\n+ 6.1027258 9.4114116 5.1039335 6.5815895 10.1277022 5.6290157\n+ 6.6678073 9.1230379 4.3177487 5.2086444 9.7657205 4.7621357\n+ 5.8010133 8.2419298 5.9556322 5.2338195 8.5904194 6.8193516\n+ 4.9060379 7.2614871 5.1978254 5.2290030 7.1815685 4.1573041\n+ 4.9489259 6.2745706 5.6619402 3.4965842 7.8237994 5.2678187\n+ 3.3776621 8.9780360 4.7980651 2.6472232 7.1669020 5.8997283\n+ 7.0376422 7.5370608 6.4781338 7.9157036 7.1622066 5.7047041\n+ 7.0652775 7.3158858 7.7952036 6.3169315 7.6633401 8.3789911\n+ 8.0764491 6.4982978 8.4537730 9.0634999 6.8670277 8.1688606\n+ 7.9197212 6.6666247 9.9695324 8.6690479 6.0648171 10.4845540\n+ 8.0657682 7.7128438 10.2415669 6.9244697 6.3515483 10.2875817\n+ 7.9931502 5.0209894 8.0274701 9.0297108 4.4106384 7.7836349\n+ 6.9039267 4.4598555 7.9317597 4.8638450 11.1831355 9.8736302\n+ 4.1346516 10.5621898 9.8644378 4.8794334 11.5468847 8.9890396\n+ 4.7726236 11.1496591 9.7590789 2.6329636 2.9920417 7.3605727\n+ 2.8338815 2.3735456 6.6584157 3.4695441 3.4182530 7.5500773\n+ 2.7657541 2.9679551 7.2948118 11.6032547 4.2363825 3.6652327\n+ 11.0489985 4.5413440 2.9475194 11.9080957 3.3741621 3.3823900\n+ 11.5709231 4.1649390 3.5372464 2.6699140 9.6787405 9.4896712\n+ 2.7570939 9.4003152 8.5789176 2.7420827 8.8695924 9.9959596\n+ 2.6901212 9.5395278 9.4380524 4.2027790 3.2218855 3.8639297\n+ 3.7166501 3.1773864 3.0401503 5.0820834 2.9173323 3.6390697\n+ 4.2524311 3.1769782 3.7295794 0.5083146 4.1661638 6.2786993\n+ 1.2617567 3.6970865 6.6372025 0.8431777 4.5870678 5.4874468\n+ 0.6474560 4.1596318 6.2235450 5.4377311 1.1104254 9.6028083\n+ 5.7316024 1.7256555 8.9303498 4.4874126 1.2190194 9.6268500\n+ 5.3534380 1.2030977 9.5200769 12.5431809 8.9055182 5.2286458\n+ 11.6760008 9.0337082 4.8468081 12.3913378 8.3331541 5.9810074\n+ 12.4132771 8.8479552 5.2760220 10.2580286 10.2519211 7.1265204\n+ 10.2459042 10.2237519 6.1698049 10.7147126 11.0667847 7.3358240\n+ 10.3146089 10.3527584 7.0310610 3.0018903 7.5970825 11.3670397\n+ 2.8021272 6.7560910 10.9540893 2.7438148 7.4819565 12.2820359\n+ 2.9430006 7.4746080 11.4306793 6.9630906 12.5058599 7.3124894\n+ 6.0324019 12.6912046 7.4397686 7.3972580 13.3452184 7.4595676\n+ 6.8995820 12.6364993 7.3478448 2.2680782 5.1300381 10.2420328\n+ 1.8500766 5.0630853 11.1004605 1.5463903 5.2949704 9.6353352\n+ 2.1225859 5.1422855 10.2745597 11.0871036 7.0226771 2.3181943\n+ 10.9127438 7.6505629 1.6181586 10.4907008 7.2778323 3.0231798\n+ 10.9883767 7.1353536 2.3196085 8.9439794 4.4033560 2.5175984\n+ 8.7517218 4.6458555 1.6110875 8.3729800 3.6546287 2.6915467\n+ 8.8458299 4.3392611 2.4235532 11.9946982 8.0588113 7.7954434\n+ 12.4305976 8.4597111 8.5478050 11.2851347 8.6646517 7.5790687\n+ 11.9594798 8.1878177 7.8647399\n+ 13.0633205 13.0633205 13.0633205 109.4712190 109.4712190 109.4712190\ndiff --git a/wrappers/python/tests/systems/peptide_with_tip4p.prmtop b/wrappers/python/tests/systems/peptide_with_tip4p.prmtop\nnew file mode 100644\nindex 0000000000..8d01f9df13\n--- /dev/null\n+++ b/wrappers/python/tests/systems/peptide_with_tip4p.prmtop\n@@ -0,0 +1,431 @@\n+%VERSION VERSION_STAMP = V0001.000 DATE = 03/14/22 14:16:58 \n+%FLAG TITLE \n+%FORMAT(20a4) \n+default_name \n+%FLAG POINTERS \n+%FORMAT(10I8) \n+ 85 11 56 28 25 17 41 40 0 0\n+ 228 17 28 17 40 19 30 25 16 1\n+ 0 0 0 0 0 0 0 2 14 0\n+ 15\n+%FLAG ATOM_NAME \n+%FORMAT(20a4) \n+N H1 H2 H3 CA HA CB HB2 HB3 CG OD1 OD2 C O N H CA HA CB HB1 \n+HB2 HB3 C O OXT O H1 H2 EPW O H1 H2 EPW O H1 H2 EPW O H1 H2 \n+EPW O H1 H2 EPW O H1 H2 EPW O H1 H2 EPW O H1 H2 EPW O H1 H2 \n+EPW O H1 H2 EPW O H1 H2 EPW O H1 H2 EPW O H1 H2 EPW O H1 H2 \n+EPW O H1 H2 EPW \n+%FLAG CHARGE \n+%FORMAT(5E16.8) \n+ 1.42498386E+00 4.00890600E+00 4.00890600E+00 4.00890600E+00 5.32091160E-01\n+ 2.07916443E+00 -4.28224050E-01 -3.07956870E-01 -3.07956870E-01 1.49313526E+01\n+ -1.47309073E+01 -1.47309073E+01 1.02427548E+01 -1.07311125E+01 -6.96274083E+00\n+ 4.88539863E+00 -3.18343581E+00 1.94431941E+00 -3.81392739E+00 1.39218372E+00\n+ 1.39218372E+00 1.39218372E+00 1.40876601E+01 -1.46780627E+01 -1.46780627E+01\n+ 0.00000000E+00 9.55249411E+00 9.55249411E+00 -1.91049882E+01 0.00000000E+00\n+ 9.55249411E+00 9.55249411E+00 -1.91049882E+01 0.00000000E+00 9.55249411E+00\n+ 9.55249411E+00 -1.91049882E+01 0.00000000E+00 9.55249411E+00 9.55249411E+00\n+ -1.91049882E+01 0.00000000E+00 9.55249411E+00 9.55249411E+00 -1.91049882E+01\n+ 0.00000000E+00 9.55249411E+00 9.55249411E+00 -1.91049882E+01 0.00000000E+00\n+ 9.55249411E+00 9.55249411E+00 -1.91049882E+01 0.00000000E+00 9.55249411E+00\n+ 9.55249411E+00 -1.91049882E+01 0.00000000E+00 9.55249411E+00 9.55249411E+00\n+ -1.91049882E+01 0.00000000E+00 9.55249411E+00 9.55249411E+00 -1.91049882E+01\n+ 0.00000000E+00 9.55249411E+00 9.55249411E+00 -1.91049882E+01 0.00000000E+00\n+ 9.55249411E+00 9.55249411E+00 -1.91049882E+01 0.00000000E+00 9.55249411E+00\n+ 9.55249411E+00 -1.91049882E+01 0.00000000E+00 9.55249411E+00 9.55249411E+00\n+ -1.91049882E+01 0.00000000E+00 9.55249411E+00 9.55249411E+00 -1.91049882E+01\n+%FLAG ATOMIC_NUMBER \n+%FORMAT(10I8) \n+ 7 1 1 1 6 1 6 1 1 6\n+ 8 8 6 8 7 1 6 1 6 1\n+ 1 1 6 8 8 8 1 1 0 8\n+ 1 1 0 8 1 1 0 8 1 1\n+ 0 8 1 1 0 8 1 1 0 8\n+ 1 1 0 8 1 1 0 8 1 1\n+ 0 8 1 1 0 8 1 1 0 8\n+ 1 1 0 8 1 1 0 8 1 1\n+ 0 8 1 1 0\n+%FLAG MASS \n+%FORMAT(5E16.8) \n+ 1.40100000E+01 1.00800000E+00 1.00800000E+00 1.00800000E+00 1.20100000E+01\n+ 1.00800000E+00 1.20100000E+01 1.00800000E+00 1.00800000E+00 1.20100000E+01\n+ 1.60000000E+01 1.60000000E+01 1.20100000E+01 1.60000000E+01 1.40100000E+01\n+ 1.00800000E+00 1.20100000E+01 1.00800000E+00 1.20100000E+01 1.00800000E+00\n+ 1.00800000E+00 1.00800000E+00 1.20100000E+01 1.60000000E+01 1.60000000E+01\n+ 1.60000000E+01 1.00800000E+00 1.00800000E+00 0.00000000E+00 1.60000000E+01\n+ 1.00800000E+00 1.00800000E+00 0.00000000E+00 1.60000000E+01 1.00800000E+00\n+ 1.00800000E+00 0.00000000E+00 1.60000000E+01 1.00800000E+00 1.00800000E+00\n+ 0.00000000E+00 1.60000000E+01 1.00800000E+00 1.00800000E+00 0.00000000E+00\n+ 1.60000000E+01 1.00800000E+00 1.00800000E+00 0.00000000E+00 1.60000000E+01\n+ 1.00800000E+00 1.00800000E+00 0.00000000E+00 1.60000000E+01 1.00800000E+00\n+ 1.00800000E+00 0.00000000E+00 1.60000000E+01 1.00800000E+00 1.00800000E+00\n+ 0.00000000E+00 1.60000000E+01 1.00800000E+00 1.00800000E+00 0.00000000E+00\n+ 1.60000000E+01 1.00800000E+00 1.00800000E+00 0.00000000E+00 1.60000000E+01\n+ 1.00800000E+00 1.00800000E+00 0.00000000E+00 1.60000000E+01 1.00800000E+00\n+ 1.00800000E+00 0.00000000E+00 1.60000000E+01 1.00800000E+00 1.00800000E+00\n+ 0.00000000E+00 1.60000000E+01 1.00800000E+00 1.00800000E+00 0.00000000E+00\n+%FLAG ATOM_TYPE_INDEX \n+%FORMAT(10I8) \n+ 1 2 2 2 3 4 3 5 5 6\n+ 7 7 6 7 1 2 3 8 3 5\n+ 5 5 6 7 7 9 10 10 11 9\n+ 10 10 11 9 10 10 11 9 10 10\n+ 11 9 10 10 11 9 10 10 11 9\n+ 10 10 11 9 10 10 11 9 10 10\n+ 11 9 10 10 11 9 10 10 11 9\n+ 10 10 11 9 10 10 11 9 10 10\n+ 11 9 10 10 11\n+%FLAG NUMBER_EXCLUDED_ATOMS \n+%FORMAT(10I8) \n+ 12 6 5 4 12 7 8 5 4 3\n+ 1 1 7 3 10 4 8 7 6 3\n+ 2 1 2 1 1 3 2 1 1 3\n+ 2 1 1 3 2 1 1 3 2 1\n+ 1 3 2 1 1 3 2 1 1 3\n+ 2 1 1 3 2 1 1 3 2 1\n+ 1 3 2 1 1 3 2 1 1 3\n+ 2 1 1 3 2 1 1 3 2 1\n+ 1 3 2 1 1\n+%FLAG NONBONDED_PARM_INDEX \n+%FORMAT(10I8) \n+ 1 2 4 7 11 16 22 29 37 46\n+ 56 2 3 5 8 12 17 23 30 38\n+ 47 57 4 5 6 9 13 18 24 31\n+ 39 48 58 7 8 9 10 14 19 25\n+ 32 40 49 59 11 12 13 14 15 20\n+ 26 33 41 50 60 16 17 18 19 20\n+ 21 27 34 42 51 61 22 23 24 25\n+ 26 27 28 35 43 52 62 29 30 31\n+ 32 33 34 35 36 44 53 63 37 38\n+ 39 40 41 42 43 44 45 -1 64 46\n+ 47 48 49 50 51 52 53 -1 55 65\n+ 56 57 58 59 60 61 62 63 64 65\n+ 66\n+%FLAG RESIDUE_LABEL \n+%FORMAT(20a4) \n+ASP ALA WAT WAT WAT WAT WAT WAT WAT WAT WAT WAT WAT WAT WAT WAT WAT \n+%FLAG RESIDUE_POINTER \n+%FORMAT(10I8) \n+ 1 15 26 30 34 38 42 46 50 54\n+ 58 62 66 70 74 78 82\n+%FLAG BOND_FORCE_CONSTANT \n+%FORMAT(5E16.8) \n+ 5.70000000E+02 4.90000000E+02 6.56000000E+02 3.40000000E+02 3.17000000E+02\n+ 3.40000000E+02 3.10000000E+02 3.17000000E+02 4.34000000E+02 3.67000000E+02\n+ 6.56000000E+02 3.40000000E+02 3.40000000E+02 3.10000000E+02 4.34000000E+02\n+ 3.37000000E+02 5.53000000E+02 5.53000000E+02 5.53000000E+02\n+%FLAG BOND_EQUIL_VALUE \n+%FORMAT(5E16.8) \n+ 1.22900000E+00 1.33500000E+00 1.25000000E+00 1.09000000E+00 1.52200000E+00\n+ 1.09000000E+00 1.52600000E+00 1.52200000E+00 1.01000000E+00 1.47100000E+00\n+ 1.25000000E+00 1.09000000E+00 1.09000000E+00 1.52600000E+00 1.01000000E+00\n+ 1.44900000E+00 9.57200000E-01 1.51360000E+00 1.25000000E-01\n+%FLAG ANGLE_FORCE_CONSTANT \n+%FORMAT(5E16.8) \n+ 8.00000000E+01 5.00000000E+01 5.00000000E+01 8.00000000E+01 5.00000000E+01\n+ 3.50000000E+01 6.30000000E+01 7.00000000E+01 5.00000000E+01 5.00000000E+01\n+ 5.00000000E+01 6.30000000E+01 8.00000000E+01 7.00000000E+01 5.00000000E+01\n+ 3.50000000E+01 5.00000000E+01 8.00000000E+01 8.00000000E+01 8.00000000E+01\n+ 3.50000000E+01 6.30000000E+01 5.00000000E+01 5.00000000E+01 5.00000000E+01\n+ 7.00000000E+01 5.00000000E+01 5.00000000E+01 8.00000000E+01 6.30000000E+01\n+%FLAG ANGLE_EQUIL_VALUE \n+%FORMAT(5E16.8) \n+ 2.14501057E+00 2.09439600E+00 2.12755727E+00 2.19911580E+00 1.91113635E+00\n+ 1.91113635E+00 1.93906163E+00 2.04203610E+00 1.91113635E+00 1.91113635E+00\n+ 1.91113635E+00 1.93906163E+00 2.10137732E+00 2.03505478E+00 1.91113635E+00\n+ 1.91113635E+00 1.91113635E+00 1.94080696E+00 1.94080696E+00 2.19911580E+00\n+ 1.91113635E+00 1.93906163E+00 1.91113635E+00 1.91113635E+00 1.91113635E+00\n+ 2.04203610E+00 2.06018753E+00 1.91113635E+00 1.91462701E+00 1.92160833E+00\n+%FLAG DIHEDRAL_FORCE_CONSTANT \n+%FORMAT(5E16.8) \n+ 2.00000000E+00 2.50000000E+00 0.00000000E+00 1.80000000E+00 8.00000000E-01\n+ 0.00000000E+00 0.00000000E+00 2.70000000E-01 4.20000000E-01 4.24000000E-01\n+ 4.59000000E-01 5.80000000E-02 1.54000000E-01 1.55555556E-01 2.00000000E-01\n+ 2.00000000E-01 4.00000000E-01 7.69000000E-01 0.00000000E+00 3.10000000E-02\n+ 2.15400000E+00 6.47000000E-01 8.90000000E-02 1.05000000E+01 1.10000000E+00\n+%FLAG DIHEDRAL_PERIODICITY \n+%FORMAT(5E16.8) \n+ 1.00000000E+00 2.00000000E+00 2.00000000E+00 2.00000000E+00 3.00000000E+00\n+ 4.00000000E+00 1.00000000E+00 2.00000000E+00 3.00000000E+00 1.00000000E+00\n+ 2.00000000E+00 3.00000000E+00 4.00000000E+00 3.00000000E+00 1.00000000E+00\n+ 2.00000000E+00 3.00000000E+00 2.00000000E+00 3.00000000E+00 4.00000000E+00\n+ 1.00000000E+00 2.00000000E+00 4.00000000E+00 2.00000000E+00 2.00000000E+00\n+%FLAG DIHEDRAL_PHASE \n+%FORMAT(5E16.8) \n+ 0.00000000E+00 3.14159400E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00\n+ 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00\n+ 3.14159400E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00\n+ 0.00000000E+00 0.00000000E+00 3.14159400E+00 0.00000000E+00 3.14159400E+00\n+ 3.14159400E+00 3.14159400E+00 0.00000000E+00 3.14159400E+00 3.14159400E+00\n+%FLAG SCEE_SCALE_FACTOR \n+%FORMAT(5E16.8) \n+ 1.20000000E+00 1.20000000E+00 1.20000000E+00 1.20000000E+00 1.20000000E+00\n+ 1.20000000E+00 1.20000000E+00 1.20000000E+00 1.20000000E+00 1.20000000E+00\n+ 1.20000000E+00 1.20000000E+00 1.20000000E+00 1.20000000E+00 1.20000000E+00\n+ 1.20000000E+00 1.20000000E+00 1.20000000E+00 1.20000000E+00 1.20000000E+00\n+ 1.20000000E+00 1.20000000E+00 1.20000000E+00 0.00000000E+00 0.00000000E+00\n+%FLAG SCNB_SCALE_FACTOR \n+%FORMAT(5E16.8) \n+ 2.00000000E+00 2.00000000E+00 2.00000000E+00 2.00000000E+00 2.00000000E+00\n+ 2.00000000E+00 2.00000000E+00 2.00000000E+00 2.00000000E+00 2.00000000E+00\n+ 2.00000000E+00 2.00000000E+00 2.00000000E+00 2.00000000E+00 2.00000000E+00\n+ 2.00000000E+00 2.00000000E+00 2.00000000E+00 2.00000000E+00 2.00000000E+00\n+ 2.00000000E+00 2.00000000E+00 2.00000000E+00 0.00000000E+00 0.00000000E+00\n+%FLAG SOLTY \n+%FORMAT(5E16.8) \n+ 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00\n+ 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00\n+ 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00\n+ 0.00000000E+00\n+%FLAG LENNARD_JONES_ACOEF \n+%FORMAT(5E16.8) \n+ 9.44293233E+05 2.12601181E+03 1.39982777E-01 9.95480466E+05 2.56678134E+03\n+ 1.04308023E+06 2.01791425E+04 9.14716912E+00 2.27401052E+04 2.01823541E+02\n+ 8.96776989E+04 1.07193646E+02 9.71708117E+04 1.41077189E+03 7.51607703E+03\n+ 8.82619071E+05 2.27577561E+03 9.24822270E+05 2.01619733E+04 8.61541883E+04\n+ 8.19971662E+05 6.06829342E+05 1.02595236E+03 6.47841731E+05 1.12780457E+04\n+ 5.44261042E+04 5.74393458E+05 3.79876399E+05 6.20665997E+04 5.94667300E+01\n+ 6.78771368E+04 8.79040886E+02 4.98586848E+03 6.01816484E+04 3.69471530E+04\n+ 3.25969625E+03 7.87979792E+05 1.63574730E+03 8.33694635E+05 1.61827331E+04\n+ 7.36215582E+04 7.39175513E+05 5.02600786E+05 5.06742043E+04 6.56136207E+05\n+ 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00\n+ 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00\n+ 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00\n+ 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00\n+ 0.00000000E+00\n+%FLAG LENNARD_JONES_BCOEF \n+%FORMAT(5E16.8) \n+ 8.01323529E+02 2.09604198E+01 9.37598976E-02 7.36907417E+02 2.06278363E+01\n+ 6.75612247E+02 6.45756063E+01 7.57919667E-01 6.13981767E+01 3.56012899E+00\n+ 1.36131731E+02 2.59456373E+00 1.26919150E+02 9.41257003E+00 2.17257828E+01\n+ 6.53361429E+02 1.82891803E+01 5.99015525E+02 5.44372326E+01 1.12529845E+02\n+ 5.31102864E+02 6.77220874E+02 1.53505284E+01 6.26720080E+02 5.08951803E+01\n+ 1.11805549E+02 5.55666448E+02 5.64885984E+02 1.13252061E+02 1.93248820E+00\n+ 1.06076943E+02 7.42992380E+00 1.76949863E+01 9.40505980E+01 9.21192136E+01\n+ 1.43076527E+01 7.24069102E+02 1.81862545E+01 6.67064884E+02 5.72019842E+01\n+ 1.22007818E+02 5.91437209E+02 6.09644486E+02 1.01222865E+02 6.53563058E+02\n+ 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00\n+ 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00\n+ 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00\n+ 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00\n+ 0.00000000E+00\n+%FLAG BONDS_INC_HYDROGEN \n+%FORMAT(10I8) \n+ 18 21 4 18 24 4 12 15 6 0\n+ 3 9 0 6 9 0 9 9 54 57\n+ 12 54 60 12 54 63 12 48 51 13\n+ 42 45 15 78 75 17 81 75 17 81\n+ 78 18 90 87 17 93 87 17 93 90\n+ 18 102 99 17 105 99 17 105 102 18\n+ 114 111 17 117 111 17 117 114 18 126\n+ 123 17 129 123 17 129 126 18 138 135\n+ 17 141 135 17 141 138 18 150 147 17\n+ 153 147 17 153 150 18 162 159 17 165\n+ 159 17 165 162 18 174 171 17 177 171\n+ 17 177 174 18 186 183 17 189 183 17\n+ 189 186 18 198 195 17 201 195 17 201\n+ 198 18 210 207 17 213 207 17 213 210\n+ 18 222 219 17 225 219 17 225 222 18\n+ 234 231 17 237 231 17 237 234 18 246\n+ 243 17 249 243 17 249 246 18\n+%FLAG BONDS_WITHOUT_HYDROGEN \n+%FORMAT(10I8) \n+ 36 39 1 36 42 2 27 30 3 27\n+ 33 3 18 27 5 12 18 7 12 36\n+ 8 0 12 10 66 69 11 66 72 11\n+ 48 54 14 48 66 8 42 48 16 84\n+ 75 19 96 87 19 108 99 19 120 111\n+ 19 132 123 19 144 135 19 156 147 19\n+ 168 159 19 180 171 19 192 183 19 204\n+ 195 19 216 207 19 228 219 19 240 231\n+ 19 252 243 19\n+%FLAG ANGLES_INC_HYDROGEN \n+%FORMAT(10I8) \n+ 36 42 45 2 24 18 27 5 21 18\n+ 24 6 21 18 27 5 15 12 18 9\n+ 15 12 36 10 12 18 21 11 12 18\n+ 24 11 9 0 12 15 6 0 9 16\n+ 6 0 12 15 3 0 6 16 3 0\n+ 9 16 3 0 12 15 0 12 15 17\n+ 60 54 63 21 57 54 60 21 57 54\n+ 63 21 51 48 54 23 51 48 66 24\n+ 48 54 57 25 48 54 60 25 48 54\n+ 63 25 45 42 48 27 42 48 51 28\n+%FLAG ANGLES_WITHOUT_HYDROGEN \n+%FORMAT(10I8) \n+ 39 36 42 1 36 42 48 3 30 27\n+ 33 4 18 12 36 7 18 27 30 8\n+ 18 27 33 8 12 18 27 12 12 36\n+ 39 13 12 36 42 14 0 12 18 18\n+ 0 12 36 19 69 66 72 20 54 48\n+ 66 22 48 66 69 26 48 66 72 26\n+ 42 48 54 29 42 48 66 30\n+%FLAG DIHEDRALS_INC_HYDROGEN \n+%FORMAT(10I8) \n+ 39 36 42 45 1 39 36 -42 45 2\n+ 36 42 48 51 3 24 18 12 36 14\n+ 24 18 27 30 3 24 18 27 33 3\n+ 21 18 12 36 14 21 18 27 30 3\n+ 21 18 27 33 3 15 12 18 21 14\n+ 15 12 18 24 14 15 12 18 27 14\n+ 15 12 36 39 3 15 12 36 42 3\n+ 12 36 42 45 2 9 0 12 15 14\n+ 9 0 12 18 14 9 0 12 36 14\n+ 6 0 12 15 14 6 0 12 18 14\n+ 6 0 12 36 14 3 0 12 15 14\n+ 3 0 12 18 14 3 0 12 36 14\n+ 0 12 18 21 14 0 12 18 24 14\n+ 63 54 48 66 14 60 54 48 66 14\n+ 57 54 48 66 14 51 48 54 57 14\n+ 51 48 54 60 14 51 48 54 63 14\n+ 51 48 66 69 3 51 48 66 72 3\n+ 45 42 48 51 3 45 42 48 54 3\n+ 45 42 48 66 3 42 48 54 57 14\n+ 42 48 54 60 14 42 48 54 63 14\n+ 36 48 -42 -45 25\n+%FLAG DIHEDRALS_WITHOUT_HYDROGEN \n+%FORMAT(10I8) \n+ 39 36 42 48 2 36 42 48 54 1\n+ 36 42 -48 54 4 36 42 -48 54 5\n+ 36 42 -48 54 6 36 42 48 66 7\n+ 36 42 -48 66 8 36 42 -48 66 9\n+ 36 42 -48 66 6 27 18 12 36 10\n+ 27 18 -12 36 11 27 18 -12 36 12\n+ 27 18 -12 36 13 18 12 36 39 3\n+ 18 12 36 42 15 18 12 -36 42 16\n+ 18 12 -36 42 17 18 12 -36 42 6\n+ 12 18 27 30 7 12 18 -27 30 18\n+ 12 18 -27 30 19 12 18 -27 30 20\n+ 12 18 27 33 7 12 18 -27 33 18\n+ 12 18 -27 33 19 12 18 -27 33 20\n+ 12 36 42 48 2 0 12 18 27 21\n+ 0 12 -18 27 22 0 12 -18 27 12\n+ 0 12 -18 27 23 0 12 36 39 3\n+ 0 12 36 42 3 54 48 66 69 3\n+ 54 48 66 72 3 42 48 66 69 3\n+ 42 48 66 72 3 12 42 -36 -39 24\n+ 18 30 -27 -33 24 48 69 -66 -72 24\n+%FLAG EXCLUDED_ATOMS_LIST \n+%FORMAT(10I8) \n+ 2 3 4 5 6 7 8 9 10 13\n+ 14 15 3 4 5 6 7 13 4 5\n+ 6 7 13 5 6 7 13 6 7 8\n+ 9 10 11 12 13 14 15 16 17 7\n+ 8 9 10 13 14 15 8 9 10 11\n+ 12 13 14 15 9 10 11 12 13 10\n+ 11 12 13 11 12 13 12 0 14 15\n+ 16 17 18 19 23 15 16 17 16 17\n+ 18 19 20 21 22 23 24 25 17 18\n+ 19 23 18 19 20 21 22 23 24 25\n+ 19 20 21 22 23 24 25 20 21 22\n+ 23 24 25 21 22 23 22 23 23 24\n+ 25 25 0 27 28 29 28 29 29 0\n+ 31 32 33 32 33 33 0 35 36 37\n+ 36 37 37 0 39 40 41 40 41 41\n+ 0 43 44 45 44 45 45 0 47 48\n+ 49 48 49 49 0 51 52 53 52 53\n+ 53 0 55 56 57 56 57 57 0 59\n+ 60 61 60 61 61 0 63 64 65 64\n+ 65 65 0 67 68 69 68 69 69 0\n+ 71 72 73 72 73 73 0 75 76 77\n+ 76 77 77 0 79 80 81 80 81 81\n+ 0 83 84 85 84 85 85 0\n+%FLAG HBOND_ACOEF \n+%FORMAT(5E16.8) \n+ 0.00000000E+00\n+%FLAG HBOND_BCOEF \n+%FORMAT(5E16.8) \n+ 0.00000000E+00\n+%FLAG HBCUT \n+%FORMAT(5E16.8) \n+ 0.00000000E+00\n+%FLAG AMBER_ATOM_TYPE \n+%FORMAT(20a4) \n+N3 H H H CX HP 2C HC HC CO O2 O2 C O N H CX H1 CT HC \n+HC HC C O2 O2 OW HW HW EP OW HW HW EP OW HW HW EP OW HW HW \n+EP OW HW HW EP OW HW HW EP OW HW HW EP OW HW HW EP OW HW HW \n+EP OW HW HW EP OW HW HW EP OW HW HW EP OW HW HW EP OW HW HW \n+EP OW HW HW EP \n+%FLAG TREE_CHAIN_CLASSIFICATION \n+%FORMAT(20a4) \n+BLA BLA BLA BLA BLA BLA BLA BLA BLA BLA BLA BLA BLA BLA BLA BLA BLA BLA BLA BLA \n+BLA BLA BLA BLA BLA M S E E M S E E M S E E M S E \n+E M S E E M S E E M S E E M S E E M S E \n+E M S E E M S E E M S E E M S E E M S E \n+E M S E E \n+%FLAG JOIN_ARRAY \n+%FORMAT(10I8) \n+ 0 0 0 0 0 0 0 0 0 0\n+ 0 0 0 0 0 0 0 0 0 0\n+ 0 0 0 0 0 0 0 0 0 0\n+ 0 0 0 0 0 0 0 0 0 0\n+ 0 0 0 0 0 0 0 0 0 0\n+ 0 0 0 0 0 0 0 0 0 0\n+ 0 0 0 0 0 0 0 0 0 0\n+ 0 0 0 0 0 0 0 0 0 0\n+ 0 0 0 0 0\n+%FLAG IROTAT \n+%FORMAT(10I8) \n+ 0 0 0 0 0 0 0 0 0 0\n+ 0 0 0 0 0 0 0 0 0 0\n+ 0 0 0 0 0 0 0 0 0 0\n+ 0 0 0 0 0 0 0 0 0 0\n+ 0 0 0 0 0 0 0 0 0 0\n+ 0 0 0 0 0 0 0 0 0 0\n+ 0 0 0 0 0 0 0 0 0 0\n+ 0 0 0 0 0 0 0 0 0 0\n+ 0 0 0 0 0\n+%FLAG SOLVENT_POINTERS \n+%FORMAT(3I8) \n+ 2 16 2\n+%FLAG ATOMS_PER_MOLECULE \n+%FORMAT(10I8) \n+ 25 4 4 4 4 4 4 4 4 4\n+ 4 4 4 4 4 4\n+%FLAG BOX_DIMENSIONS \n+%FORMAT(5E16.8) \n+ 1.09471219E+02 1.30633205E+01 1.30633205E+01 1.30633205E+01\n+%FLAG RADIUS_SET \n+%FORMAT(1a80) \n+H(N)-modified Bondi radii (mbondi2) \n+%FLAG RADII \n+%FORMAT(5E16.8) \n+ 1.55000000E+00 1.30000000E+00 1.30000000E+00 1.30000000E+00 1.70000000E+00\n+ 1.20000000E+00 1.70000000E+00 1.20000000E+00 1.20000000E+00 1.70000000E+00\n+ 1.50000000E+00 1.50000000E+00 1.70000000E+00 1.50000000E+00 1.55000000E+00\n+ 1.30000000E+00 1.70000000E+00 1.20000000E+00 1.70000000E+00 1.20000000E+00\n+ 1.20000000E+00 1.20000000E+00 1.70000000E+00 1.50000000E+00 1.50000000E+00\n+ 1.50000000E+00 1.20000000E+00 1.20000000E+00 1.50000000E+00 1.50000000E+00\n+ 1.20000000E+00 1.20000000E+00 1.50000000E+00 1.50000000E+00 1.20000000E+00\n+ 1.20000000E+00 1.50000000E+00 1.50000000E+00 1.20000000E+00 1.20000000E+00\n+ 1.50000000E+00 1.50000000E+00 1.20000000E+00 1.20000000E+00 1.50000000E+00\n+ 1.50000000E+00 1.20000000E+00 1.20000000E+00 1.50000000E+00 1.50000000E+00\n+ 1.20000000E+00 1.20000000E+00 1.50000000E+00 1.50000000E+00 1.20000000E+00\n+ 1.20000000E+00 1.50000000E+00 1.50000000E+00 1.20000000E+00 1.20000000E+00\n+ 1.50000000E+00 1.50000000E+00 1.20000000E+00 1.20000000E+00 1.50000000E+00\n+ 1.50000000E+00 1.20000000E+00 1.20000000E+00 1.50000000E+00 1.50000000E+00\n+ 1.20000000E+00 1.20000000E+00 1.50000000E+00 1.50000000E+00 1.20000000E+00\n+ 1.20000000E+00 1.50000000E+00 1.50000000E+00 1.20000000E+00 1.20000000E+00\n+ 1.50000000E+00 1.50000000E+00 1.20000000E+00 1.20000000E+00 1.50000000E+00\n+%FLAG SCREEN \n+%FORMAT(5E16.8) \n+ 7.90000000E-01 8.50000000E-01 8.50000000E-01 8.50000000E-01 7.20000000E-01\n+ 8.50000000E-01 7.20000000E-01 8.50000000E-01 8.50000000E-01 7.20000000E-01\n+ 8.50000000E-01 8.50000000E-01 7.20000000E-01 8.50000000E-01 7.90000000E-01\n+ 8.50000000E-01 7.20000000E-01 8.50000000E-01 7.20000000E-01 8.50000000E-01\n+ 8.50000000E-01 8.50000000E-01 7.20000000E-01 8.50000000E-01 8.50000000E-01\n+ 8.50000000E-01 8.50000000E-01 8.50000000E-01 8.00000000E-01 8.50000000E-01\n+ 8.50000000E-01 8.50000000E-01 8.00000000E-01 8.50000000E-01 8.50000000E-01\n+ 8.50000000E-01 8.00000000E-01 8.50000000E-01 8.50000000E-01 8.50000000E-01\n+ 8.00000000E-01 8.50000000E-01 8.50000000E-01 8.50000000E-01 8.00000000E-01\n+ 8.50000000E-01 8.50000000E-01 8.50000000E-01 8.00000000E-01 8.50000000E-01\n+ 8.50000000E-01 8.50000000E-01 8.00000000E-01 8.50000000E-01 8.50000000E-01\n+ 8.50000000E-01 8.00000000E-01 8.50000000E-01 8.50000000E-01 8.50000000E-01\n+ 8.00000000E-01 8.50000000E-01 8.50000000E-01 8.50000000E-01 8.00000000E-01\n+ 8.50000000E-01 8.50000000E-01 8.50000000E-01 8.00000000E-01 8.50000000E-01\n+ 8.50000000E-01 8.50000000E-01 8.00000000E-01 8.50000000E-01 8.50000000E-01\n+ 8.50000000E-01 8.00000000E-01 8.50000000E-01 8.50000000E-01 8.50000000E-01\n+ 8.00000000E-01 8.50000000E-01 8.50000000E-01 8.50000000E-01 8.00000000E-01\n+%FLAG IPOL \n+%FORMAT(1I8) \n+ 0\n", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}66{"question_id": "MSB_openmm_openmm_pr3508", "question_type": "multi_swe_bench", "description": "Max Drude distance defaults to 0.02 nm (openmm/openmm#3508)", "content": {"org": "openmm", "repo": "openmm", "pr_number": 3508, "issue_title": "Max Drude distance defaults to 0.02 nm", "issue_body": "This is part of #2513.", "base_commit": "a76c2de14b5a1ab604e95a5c4197e5a586e3000d", "resolved_issues": [{"number": null, "title": "Max Drude distance defaults to 0.02 nm", "body": "### Issue Description\n\n**Problem:**\nThe default maximum distance a Drude particle can move from its parent particle is not explicitly defined, leading to potential confusion for users. Previously, the default value was set to 0, which disabled the hard wall constraint. This lack of clarity could result in unintended behavior or instability in simulations that rely on Drude integrators.\n\n**Expected Behavior:**\nThe default maximum distance for Drude particles should be explicitly defined as 0.02 nm. This ensures that the hard wall constraint is enabled by default, improving simulation stability and providing a clear, consistent behavior for users. Users should be able to override this default value if needed, but the system should default to the defined constraint for better usability and reliability.\n\n## IMPORTANT INSTRUCTIONS\n\n1. If you edit a python file, you MUST run 'make PythonInstall' inside the build directory\n2. If you edit a c++ file, you MUST run 'make -j4 && make install\" inside the build directory"}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/openmm_m_openmm:pr-3508", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/plugins/drude/openmmapi/include/openmm/DrudeIntegrator.h b/plugins/drude/openmmapi/include/openmm/DrudeIntegrator.h\nindex 2fc0a95a28..628dcfd38f 100644\n--- a/plugins/drude/openmmapi/include/openmm/DrudeIntegrator.h\n+++ b/plugins/drude/openmmapi/include/openmm/DrudeIntegrator.h\n@@ -9,7 +9,7 @@\n * Biological Structures at Stanford, funded under the NIH Roadmap for *\n * Medical Research, grant U54 GM072970. See https://simtk.org. *\n * *\n- * Portions copyright (c) 2008-2021 Stanford University and the Authors. *\n+ * Portions copyright (c) 2008-2022 Stanford University and the Authors. *\n * Authors: Peter Eastman *\n * Contributors: *\n * *\n@@ -72,12 +72,12 @@ class OPENMM_EXPORT_DRUDE DrudeIntegrator : public Integrator {\n void setDrudeTemperature(double temp);\n /**\n * Get the maximum distance a Drude particle can ever move from its parent particle, measured in nm. This is implemented\n- * with a hard wall constraint. If this distance is set to 0 (the default), the hard wall constraint is omitted.\n+ * with a hard wall constraint. The default value is 0.02. If this distance is set to 0, the hard wall constraint is omitted.\n */\n double getMaxDrudeDistance() const;\n /**\n * Set the maximum distance a Drude particle can ever move from its parent particle, measured in nm. This is implemented\n- * with a hard wall constraint. If this distance is set to 0 (the default), the hard wall constraint is omitted.\n+ * with a hard wall constraint. The default value is 0.02. If this distance is set to 0, the hard wall constraint is omitted.\n */\n void setMaxDrudeDistance(double distance);\n /**\ndiff --git a/plugins/drude/openmmapi/include/openmm/DrudeLangevinIntegrator.h b/plugins/drude/openmmapi/include/openmm/DrudeLangevinIntegrator.h\nindex 8c5083b798..8f39c6e075 100644\n--- a/plugins/drude/openmmapi/include/openmm/DrudeLangevinIntegrator.h\n+++ b/plugins/drude/openmmapi/include/openmm/DrudeLangevinIntegrator.h\n@@ -47,7 +47,7 @@ namespace OpenMM {\n *\n * This integrator can optionally set an upper limit on how far any Drude particle is ever allowed to\n * get from its parent particle. This can sometimes help to improve stability. The limit is enforced\n- * with a hard wall constraint.\n+ * with a hard wall constraint. By default the limit is set to 0.02 nm.\n * \n * This Integrator requires the System to include a DrudeForce, which it uses to identify the Drude\n * particles.\ndiff --git a/plugins/drude/openmmapi/include/openmm/DrudeNoseHooverIntegrator.h b/plugins/drude/openmmapi/include/openmm/DrudeNoseHooverIntegrator.h\nindex 087eef7136..475b3378fc 100644\n--- a/plugins/drude/openmmapi/include/openmm/DrudeNoseHooverIntegrator.h\n+++ b/plugins/drude/openmmapi/include/openmm/DrudeNoseHooverIntegrator.h\n@@ -45,6 +45,10 @@ namespace OpenMM {\n * A second thermostat, typically with a much lower temperature, is applied to the relative internal\n * displacement of each pair.\n *\n+ * This integrator can optionally set an upper limit on how far any Drude particle is ever allowed to\n+ * get from its parent particle. This can sometimes help to improve stability. The limit is enforced\n+ * with a hard wall constraint. By default the limit is set to 0.02 nm.\n+ *\n * This Integrator requires the System to include a DrudeForce, which it uses to identify the Drude\n * particles.\n */\ndiff --git a/plugins/drude/openmmapi/src/DrudeLangevinIntegrator.cpp b/plugins/drude/openmmapi/src/DrudeLangevinIntegrator.cpp\nindex 6e48cf5327..793f65c593 100644\n--- a/plugins/drude/openmmapi/src/DrudeLangevinIntegrator.cpp\n+++ b/plugins/drude/openmmapi/src/DrudeLangevinIntegrator.cpp\n@@ -52,7 +52,7 @@ DrudeLangevinIntegrator::DrudeLangevinIntegrator(double temperature, double fric\n setFriction(frictionCoeff);\n setDrudeTemperature(drudeTemperature);\n setDrudeFriction(drudeFrictionCoeff);\n- setMaxDrudeDistance(0);\n+ setMaxDrudeDistance(0.02);\n setStepSize(stepSize);\n setConstraintTolerance(1e-5);\n setRandomNumberSeed(0);\ndiff --git a/plugins/drude/openmmapi/src/DrudeNoseHooverIntegrator.cpp b/plugins/drude/openmmapi/src/DrudeNoseHooverIntegrator.cpp\nindex 911bd504c1..6a2943a374 100644\n--- a/plugins/drude/openmmapi/src/DrudeNoseHooverIntegrator.cpp\n+++ b/plugins/drude/openmmapi/src/DrudeNoseHooverIntegrator.cpp\n@@ -54,10 +54,8 @@ namespace OpenMM {\n DrudeNoseHooverIntegrator::DrudeNoseHooverIntegrator(double temperature, double collisionFrequency, \n double drudeTemperature, double drudeCollisionFrequency,\n double stepSize, int chainLength, int numMTS, int numYoshidaSuzuki) :\n- NoseHooverIntegrator(stepSize),\n- drudeTemperature(drudeTemperature)\n-{\n- setMaxDrudeDistance(0);\n+ NoseHooverIntegrator(stepSize), drudeTemperature(drudeTemperature) {\n+ setMaxDrudeDistance(0.02);\n hasSubsystemThermostats_ = false;\n addSubsystemThermostat(std::vector<int>(), std::vector<std::pair<int, int>>(), temperature,\n collisionFrequency, drudeTemperature, drudeCollisionFrequency,\ndiff --git a/plugins/drude/openmmapi/src/DrudeSCFIntegrator.cpp b/plugins/drude/openmmapi/src/DrudeSCFIntegrator.cpp\nindex 92cb0454ea..04c751b870 100644\n--- a/plugins/drude/openmmapi/src/DrudeSCFIntegrator.cpp\n+++ b/plugins/drude/openmmapi/src/DrudeSCFIntegrator.cpp\n@@ -48,6 +48,7 @@ DrudeSCFIntegrator::DrudeSCFIntegrator(double stepSize) : DrudeIntegrator(stepSi\n setStepSize(stepSize);\n setMinimizationErrorTolerance(0.1);\n setConstraintTolerance(1e-5);\n+ setMaxDrudeDistance(0.0);\n }\n \n void DrudeSCFIntegrator::initialize(ContextImpl& contextRef) {\n@@ -64,6 +65,8 @@ void DrudeSCFIntegrator::initialize(ContextImpl& contextRef) {\n }\n if (force == NULL)\n throw OpenMMException(\"The System does not contain a DrudeForce\");\n+ if (getMaxDrudeDistance() != 0.0)\n+ throw OpenMMException(\"DrudeSCFIntegrator does not currently support setting max Drude distance\");\n context = &contextRef;\n owner = &contextRef.getOwner();\n kernel = context->getPlatform().createKernel(IntegrateDrudeSCFStepKernel::Name(), contextRef);\n"}, "test": {"test_patch": "diff --git a/wrappers/python/tests/TestAPIUnits.py b/wrappers/python/tests/TestAPIUnits.py\nindex 6c404754c8..5522bcc452 100644\n--- a/wrappers/python/tests/TestAPIUnits.py\n+++ b/wrappers/python/tests/TestAPIUnits.py\n@@ -1051,7 +1051,7 @@ def testDrudeLangevinIntegrator(self):\n self.assertEqual(integrator.getStepSize(), 0.1*femtosecond)\n integrator.setStepSize(0.0005)\n self.assertEqual(integrator.getStepSize(), 0.0005*picosecond)\n- self.assertEqual(integrator.getMaxDrudeDistance(), 0*nanometer)\n+ self.assertEqual(integrator.getMaxDrudeDistance(), 0.02*nanometer)\n integrator.setMaxDrudeDistance(0.05)\n self.assertEqual(integrator.getMaxDrudeDistance(), 0.05*nanometer)\n \n", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}67{"question_id": "MSB_openmm_openmm_pr3512", "question_type": "multi_swe_bench", "description": "computeDrudeTemperature (openmm/openmm#3512)", "content": {"org": "openmm", "repo": "openmm", "pr_number": 3512, "issue_title": "computeDrudeTemperature", "issue_body": "Adds a convenience function to compute the instantaneous Drude temperature in the `DrudeNoseHooverIntegrator` and `DrudeLangevinIntegrator`.\r\n\r\n", "base_commit": "f5eea2199fa16bbda8f2e6d622328f1c87871f40", "resolved_issues": [{"number": null, "title": "computeDrudeTemperature", "body": "### Issue Description\n\n#### Problem\nCurrently, there is no direct way to compute the instantaneous temperature of the Drude system in simulations that involve Drude particle pairs. This temperature, which reflects the kinetic energy of the internal motion of Drude pairs, is critical for monitoring and validating the behavior of simulations, particularly when using integrators designed for systems with Drude particles. Without this functionality, users must rely on indirect or manual calculations, which can be cumbersome and error-prone.\n\n#### Expected Behavior\nThe software should provide a convenient method to compute the instantaneous Drude temperature directly during simulations. This value should be readily accessible and accurately reflect the internal kinetic energy of Drude pairs, allowing users to verify that the Drude temperature remains close to the prescribed value. This functionality would enhance usability and improve the ability to monitor simulation performance and stability.\n\n## IMPORTANT INSTRUCTIONS\n\n1. If you edit a python file, you MUST run 'make PythonInstall' inside the build directory\n2. If you edit a c++ file, you MUST run 'make -j4 && make install\" inside the build directory"}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/openmm_m_openmm:pr-3512", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/plugins/drude/openmmapi/include/openmm/DrudeLangevinIntegrator.h b/plugins/drude/openmmapi/include/openmm/DrudeLangevinIntegrator.h\nindex 8f39c6e075..5b26adcfbc 100644\n--- a/plugins/drude/openmmapi/include/openmm/DrudeLangevinIntegrator.h\n+++ b/plugins/drude/openmmapi/include/openmm/DrudeLangevinIntegrator.h\n@@ -126,6 +126,12 @@ class OPENMM_EXPORT_DRUDE DrudeLangevinIntegrator : public DrudeIntegrator {\n * getTemperature().\n */\n double computeSystemTemperature();\n+ /**\n+ * Compute the instantaneous temperature of the Drude system, measured in Kelvin.\n+ * This is calculated based on the kinetic energy of the internal motion of Drude pairs\n+ * and should remain close to the prescribed Drude temperature.\n+ */\n+ double computeDrudeTemperature();\n protected:\n /**\n * This will be called by the Context when it is created. It informs the Integrator\ndiff --git a/plugins/drude/openmmapi/include/openmm/DrudeNoseHooverIntegrator.h b/plugins/drude/openmmapi/include/openmm/DrudeNoseHooverIntegrator.h\nindex 475b3378fc..7bc87a8738 100644\n--- a/plugins/drude/openmmapi/include/openmm/DrudeNoseHooverIntegrator.h\n+++ b/plugins/drude/openmmapi/include/openmm/DrudeNoseHooverIntegrator.h\n@@ -106,6 +106,12 @@ class OPENMM_EXPORT_DRUDE DrudeNoseHooverIntegrator : public NoseHooverIntegrato\n * getTemperature().\n */\n double computeSystemTemperature();\n+ /**\n+ * Compute the instantaneous temperature of the Drude system, measured in Kelvin.\n+ * This is calculated based on the kinetic energy of the internal motion of Drude pairs\n+ * and should remain close to the prescribed Drude temperature.\n+ */ \n+ double computeDrudeTemperature();\n protected:\n /**\n * Return a list of velocities normally distributed around a target temperature, with the Drude\ndiff --git a/plugins/drude/openmmapi/src/DrudeHelpers.cpp b/plugins/drude/openmmapi/src/DrudeHelpers.cpp\nindex da5823bf02..b3eb941cf0 100644\n--- a/plugins/drude/openmmapi/src/DrudeHelpers.cpp\n+++ b/plugins/drude/openmmapi/src/DrudeHelpers.cpp\n@@ -127,12 +127,16 @@ vector<Vec3> assignDrudeVelocities(const System &system, double temperature, dou\n return velocities;\n }\n \n-double computeSystemTemperatureFromVelocities(const System& system, const vector<Vec3>& velocities) {\n+\n+/**\n+ * Computes the instantaneous temperatures of the system and the internal Drude motion and returns a pair (T_system, T_drude)\n+ */\n+pair<double, double> computeTemperaturesFromVelocities(const System& system, const vector<Vec3>& velocities) {\n vector<int> normalParticles;\n vector<pair<int, int> > pairParticles;\n findParticlesAndPairs(system, normalParticles, pairParticles);\n- double energy = 0.0;\n- int dof = 0;\n+ double energy = 0.0, drudeEnergy = 0;\n+ int dof = 0, drudeDof = 0;\n \n // Kinetic energy and degrees of freedom from normal particles.\n \n@@ -151,10 +155,14 @@ double computeSystemTemperatureFromVelocities(const System& system, const vector\n int p2 = pair.second;\n double mass1 = system.getParticleMass(p1);\n double mass2 = system.getParticleMass(p2);\n+\tdouble reducedMass = (mass1*mass2)/(mass1+mass2);\n if (mass1 != 0 || mass2 != 0) {\n Vec3 momentum = mass1*velocities[p1] + mass2*velocities[p2];\n energy += momentum.dot(momentum)/(mass1+mass2);\n- dof += 3;\n+\t Vec3 drudeVelocity = velocities[p1] - velocities[p2];\n+ drudeEnergy += reducedMass*drudeVelocity.dot(drudeVelocity);\n+\t dof += 3;\n+\t drudeDof += 3;\n }\n }\n \n@@ -176,7 +184,10 @@ double computeSystemTemperatureFromVelocities(const System& system, const vector\n break;\n }\n energy *= 0.5;\n- return 2*energy/(dof*BOLTZ);\n+ drudeEnergy *= 0.5;\n+ if (drudeDof == 0)\n+ drudeDof = 1; // so that the drude temperature is reported as 0\n+ return make_pair<double, double>(2*energy/(dof*BOLTZ), 2*drudeEnergy/(drudeDof*BOLTZ));\n }\n \n }\ndiff --git a/plugins/drude/openmmapi/src/DrudeLangevinIntegrator.cpp b/plugins/drude/openmmapi/src/DrudeLangevinIntegrator.cpp\nindex 793f65c593..8665fe3653 100644\n--- a/plugins/drude/openmmapi/src/DrudeLangevinIntegrator.cpp\n+++ b/plugins/drude/openmmapi/src/DrudeLangevinIntegrator.cpp\n@@ -42,9 +42,10 @@\n using namespace OpenMM;\n using std::string;\n using std::vector;\n+using std::pair;\n \n namespace OpenMM {\n- double computeSystemTemperatureFromVelocities(const System& system, const vector<Vec3>& velocities);\n+\tpair<double, double> computeTemperaturesFromVelocities(const System& system, const vector<Vec3>& velocities);\n }\n \n DrudeLangevinIntegrator::DrudeLangevinIntegrator(double temperature, double frictionCoeff, double drudeTemperature, double drudeFrictionCoeff, double stepSize) : DrudeIntegrator(stepSize) {\n@@ -126,5 +127,15 @@ double DrudeLangevinIntegrator::computeSystemTemperature() {\n context->calcForcesAndEnergy(true, false, getIntegrationForceGroups());\n vector<Vec3> velocities;\n context->computeShiftedVelocities(getVelocityTimeOffset(), velocities);\n- return computeSystemTemperatureFromVelocities(context->getSystem(), velocities);\n+ return computeTemperaturesFromVelocities(context->getSystem(), velocities).first;\n }\n+\n+double DrudeLangevinIntegrator::computeDrudeTemperature() {\n+ if (context == NULL)\n+ throw OpenMMException(\"This Integrator is not bound to a context!\"); \n+ context->calcForcesAndEnergy(true, false, getIntegrationForceGroups());\n+ vector<Vec3> velocities;\n+ context->computeShiftedVelocities(getVelocityTimeOffset(), velocities);\n+ return computeTemperaturesFromVelocities(context->getSystem(), velocities).second;\n+} \n+\ndiff --git a/plugins/drude/openmmapi/src/DrudeNoseHooverIntegrator.cpp b/plugins/drude/openmmapi/src/DrudeNoseHooverIntegrator.cpp\nindex 6a2943a374..feae183c70 100644\n--- a/plugins/drude/openmmapi/src/DrudeNoseHooverIntegrator.cpp\n+++ b/plugins/drude/openmmapi/src/DrudeNoseHooverIntegrator.cpp\n@@ -30,6 +30,7 @@\n * -------------------------------------------------------------------------- */\n \n #include \"openmm/DrudeNoseHooverIntegrator.h\"\n+#include \"SimTKOpenMMRealType.h\"\n #include \"openmm/Context.h\"\n #include \"openmm/OpenMMException.h\"\n #include \"openmm/internal/ContextImpl.h\"\n@@ -45,12 +46,14 @@\n using namespace OpenMM;\n using std::string;\n using std::vector;\n+using std::pair;\n \n namespace OpenMM {\n extern std::vector<Vec3> assignDrudeVelocities(const System &system, double temperature, double drudeTemperature, int randomSeed);\n- double computeSystemTemperatureFromVelocities(const System& system, const vector<Vec3>& velocities);\n+ pair<double, double> computeTemperaturesFromVelocities(const System& system, const vector<Vec3>& velocities);\n }\n \n+\n DrudeNoseHooverIntegrator::DrudeNoseHooverIntegrator(double temperature, double collisionFrequency, \n double drudeTemperature, double drudeCollisionFrequency,\n double stepSize, int chainLength, int numMTS, int numYoshidaSuzuki) :\n@@ -151,8 +154,20 @@ double DrudeNoseHooverIntegrator::computeSystemTemperature() {\n context->calcForcesAndEnergy(true, false, getIntegrationForceGroups());\n vector<Vec3> velocities;\n context->computeShiftedVelocities(getVelocityTimeOffset(), velocities);\n- return computeSystemTemperatureFromVelocities(context->getSystem(), velocities);\n+ return computeTemperaturesFromVelocities(context->getSystem(), velocities).first;\n+}\n+\n+double DrudeNoseHooverIntegrator::computeDrudeTemperature() {\n+ if (context == NULL)\n+ throw OpenMMException(\"This Integrator is not bound to a context!\"); \n+ double kE = computeDrudeKineticEnergy();\n+ size_t num_dofs = 0;\n+ for (const auto &nhc: noseHooverChains){\n+ num_dofs += 3 * nhc.getThermostatedPairs().size();\n+ }\n+ return kE/(0.5 * num_dofs * BOLTZ);\n }\n+\n std::vector<Vec3> DrudeNoseHooverIntegrator::getVelocitiesForTemperature(const System &system, double temperature,\n int randomSeedIn) const {\n return assignDrudeVelocities(system, temperature, drudeTemperature, randomSeedIn);\ndiff --git a/wrappers/python/src/swig_doxygen/swigInputConfig.py b/wrappers/python/src/swig_doxygen/swigInputConfig.py\nindex 702bd3d328..b88b1c24cd 100755\n--- a/wrappers/python/src/swig_doxygen/swigInputConfig.py\n+++ b/wrappers/python/src/swig_doxygen/swigInputConfig.py\n@@ -226,6 +226,7 @@\n (\"*\", \"getGlobalParameterDefaultValue\") : (None, ()),\n (\"*\", \"getPermutationMode\") : (None, ()),\n (\"*\", \"computeSystemTemperature\") : (\"unit.kelvin\", ()),\n+(\"*\", \"computeDrudeTemperature\") : (\"unit.kelvin\", ()),\n (\"LocalCoordinatesSite\", \"getOriginWeights\") : (None, ()),\n (\"LocalCoordinatesSite\", \"getXWeights\") : (None, ()),\n (\"LocalCoordinatesSite\", \"getYWeights\") : (None, ()),\n"}, "test": {"test_patch": "diff --git a/plugins/drude/tests/TestDrudeLangevinIntegrator.h b/plugins/drude/tests/TestDrudeLangevinIntegrator.h\nindex be88c24c8e..964624ee0b 100644\n--- a/plugins/drude/tests/TestDrudeLangevinIntegrator.h\n+++ b/plugins/drude/tests/TestDrudeLangevinIntegrator.h\n@@ -84,7 +84,9 @@ void testSinglePair() {\n Vec3 velCM = vel[0]*(mass1/totalMass) + vel[1]*(mass2/totalMass);\n keCM += 0.5*totalMass*velCM.dot(velCM);\n Vec3 velInternal = vel[0]-vel[1];\n- keInternal += 0.5*reducedMass*velInternal.dot(velInternal);\n+ double _keInternal = 0.5*reducedMass*velInternal.dot(velInternal);\n+ keInternal += _keInternal;\n+\tASSERT_EQUAL_TOL(integ.computeDrudeTemperature(), _keInternal/(3*0.5*BOLTZ), 1e-6);\n Vec3 delta = state.getPositions()[0]-state.getPositions()[1];\n double distance = sqrt(delta.dot(delta));\n ASSERT(distance <= maxDistance*(1+1e-6));\ndiff --git a/plugins/drude/tests/TestDrudeNoseHoover.h b/plugins/drude/tests/TestDrudeNoseHoover.h\nindex dba51a2258..af7a2a8d44 100644\n--- a/plugins/drude/tests/TestDrudeNoseHoover.h\n+++ b/plugins/drude/tests/TestDrudeNoseHoover.h\n@@ -167,6 +167,7 @@ void testWaterBox() {\n double drudeKE = integ.computeDrudeKineticEnergy();\n double temp = KE/(0.5*numStandardDof*BOLTZ);\n double drudeTemp = drudeKE/(0.5*numDrudeDof*BOLTZ);\n+\tASSERT_EQUAL_TOL(drudeTemp, integ.computeDrudeTemperature(), 1e-6);\n meanTemp = (i*meanTemp + temp)/(i+1);\n meanDrudeTemp = (i*meanDrudeTemp + drudeTemp)/(i+1);\n double heatBathEnergy = integ.computeHeatBathEnergy();\n", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}68{"question_id": "MSB_openmm_openmm_pr3522", "question_type": "multi_swe_bench", "description": "Use hex for large atom and residue IDs in PDB files (openmm/openmm#3522)", "content": {"org": "openmm", "repo": "openmm", "pr_number": 3522, "issue_title": "Use hex for large atom and residue IDs in PDB files", "issue_body": "Fixes #3501. This is the format used by VMD. When an atom ID passes 99999 or a residue ID passes 9999, it switches to hex.\r\n\r\ncc @billswope @swails", "base_commit": "7c42ef5eaf4b9920f49333862a45e08a93c21656", "resolved_issues": [{"number": 3501, "title": "What to do about pdb files when residue index goes above 9999", "body": "I am not sure this is a bug fix or a feature I am asking for, but here goes. \r\n\r\nNow that we are using pdb files to hold systems of protein+ligands+water+ions the number of water molecules is often greater than 9999. Common practice is to give each water molecule a unique residue id in the pdb file, but the field is only 4 characters wide in the format. I have seen pdb files produced by Maestro switch after residue id 9999 to a base 36 numbering system, using characters 0-9 and A-Z. The next index after 9999 is A000 then A001 ..... This may work within the suite of Schrodinger programs but openmm chokes on this. I noticed, however, that openmm does seem to take hexidecimal values in this field, so I can convert the Maestro pdb files to work with openmm. The problem is that when I WRITE out a pdb file from within openmm, it does not convert to hexidecimal. In fact, after residue id 9999, it stays in a decimal mode, but goes back to 0, and starts over again with residue id 0, 1, etc. This leaves multiple water molecules with the same residue id, and/or an ion and a water molecule with the same residue id. Consequently, the pdb file that was written out by openmm can't then be read back into openmm. There are probably a bunch of ways to handle this. You could increment the chain id when you start the sequence over again, or something like that. Is there a way to handle this so that the pdb file openmm writes out after reading one in is consistent with what it just read? Right now, it seems broken if you can't read in a pdb file that was written out by the same code. \n\n## IMPORTANT INSTRUCTIONS\n\n1. If you edit a python file, you MUST run 'make PythonInstall' inside the build directory\n2. If you edit a c++ file, you MUST run 'make -j4 && make install\" inside the build directory"}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/openmm_m_openmm:pr-3522", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/wrappers/python/openmm/app/internal/pdbstructure.py b/wrappers/python/openmm/app/internal/pdbstructure.py\nindex 2e26462546..3711ee2bfb 100644\n--- a/wrappers/python/openmm/app/internal/pdbstructure.py\n+++ b/wrappers/python/openmm/app/internal/pdbstructure.py\n@@ -164,10 +164,10 @@ def _load(self, input_stream):\n if command == \"ATOM \" or command == \"HETATM\":\n self._add_atom(Atom(pdb_line, self, self.extraParticleIdentifier))\n elif command == \"CONECT\":\n- atoms = [int(pdb_line[6:11])]\n+ atoms = [_parse_atom_index(pdb_line[6:11])]\n for pos in (11,16,21,26):\n try:\n- atoms.append(int(pdb_line[pos:pos+5]))\n+ atoms.append(_parse_atom_index(pdb_line[pos:pos+5]))\n except:\n pass\n self._current_model.connects.append(atoms)\n@@ -208,11 +208,9 @@ def _load(self, input_stream):\n self._finalize()\n \n def _reset_atom_numbers(self):\n- self._atom_numbers_are_hex = False\n self._next_atom_number = 1\n \n def _reset_residue_numbers(self):\n- self._residue_numbers_are_hex = False\n self._next_residue_number = 1\n \n def write(self, output_stream=sys.stdout):\n@@ -726,18 +724,11 @@ def __init__(self, pdb_line, pdbstructure=None, extraParticleIdentifier='EP'):\n self.is_final_residue_in_chain = False\n # Start parsing fields from pdb line\n self.record_name = pdb_line[0:6].strip()\n- if pdbstructure is not None and pdbstructure._atom_numbers_are_hex:\n- self.serial_number = int(pdb_line[6:11], 16)\n- else:\n- try:\n- self.serial_number = int(pdb_line[6:11])\n- except:\n- try:\n- self.serial_number = int(pdb_line[6:11], 16)\n- pdbstructure._atom_numbers_are_hex = True\n- except:\n- # Just give it the next number in sequence.\n- self.serial_number = pdbstructure._next_atom_number\n+ try:\n+ self.serial_number = _parse_atom_index(pdb_line[6:11])\n+ except:\n+ # Just give it the next number in sequence.\n+ self.serial_number = pdbstructure._next_atom_number\n self.name_with_spaces = pdb_line[12:16]\n alternate_location_indicator = pdb_line[16]\n \n@@ -753,31 +744,27 @@ def __init__(self, pdb_line, pdbstructure=None, extraParticleIdentifier='EP'):\n self.residue_name = self.residue_name_with_spaces.strip()\n \n self.chain_id = pdb_line[21]\n- if pdbstructure is not None and pdbstructure._residue_numbers_are_hex:\n- self.residue_number = int(pdb_line[22:26], 16)\n- else:\n+ try:\n+ self.residue_number = int(pdb_line[22:26])\n+ except:\n try:\n- self.residue_number = int(pdb_line[22:26])\n+ self.residue_number = int(pdb_line[22:26], 16) - 0xA000 + 10000\n except:\n- try:\n- self.residue_number = int(pdb_line[22:26], 16)\n- pdbstructure._residue_numbers_are_hex = True\n- except:\n- # When VMD runs out of hex values it starts filling the residue ID field with ****.\n- # Look at the most recent atoms to figure out whether this is a new residue or not.\n- if pdbstructure._current_model is None or pdbstructure._current_model._current_chain is None or pdbstructure._current_model._current_chain._current_residue is None:\n- # This is the first residue in the model.\n+ # When VMD runs out of hex values it starts filling the residue ID field with ****.\n+ # Look at the most recent atoms to figure out whether this is a new residue or not.\n+ if pdbstructure._current_model is None or pdbstructure._current_model._current_chain is None or pdbstructure._current_model._current_chain._current_residue is None:\n+ # This is the first residue in the model.\n+ self.residue_number = pdbstructure._next_residue_number\n+ else:\n+ currentRes = pdbstructure._current_model._current_chain._current_residue\n+ if currentRes.name_with_spaces != self.residue_name_with_spaces:\n+ # The residue name has changed.\n+ self.residue_number = pdbstructure._next_residue_number\n+ elif self.name_with_spaces in currentRes.atoms_by_name:\n+ # There is already an atom with this name.\n self.residue_number = pdbstructure._next_residue_number\n else:\n- currentRes = pdbstructure._current_model._current_chain._current_residue\n- if currentRes.name_with_spaces != self.residue_name_with_spaces:\n- # The residue name has changed.\n- self.residue_number = pdbstructure._next_residue_number\n- elif self.name_with_spaces in currentRes.atoms_by_name:\n- # There is already an atom with this name.\n- self.residue_number = pdbstructure._next_residue_number\n- else:\n- self.residue_number = currentRes.number\n+ self.residue_number = currentRes.number\n self.insertion_code = pdb_line[26]\n # coordinates, occupancy, and temperature factor belong in Atom.Location object\n x = float(pdb_line[30:38])\n@@ -986,6 +973,13 @@ def __str__(self):\n return str(self.position)\n \n \n+def _parse_atom_index(index):\n+ \"\"\"Parse the string containing an atom index, which might be either decimal or hex.\"\"\"\n+ try:\n+ return int(index)\n+ except:\n+ return int(index, 16) - 0xA0000 + 100000\n+\n # run module directly for testing\n if __name__=='__main__':\n # Test the examples in the docstrings\ndiff --git a/wrappers/python/openmm/app/pdbfile.py b/wrappers/python/openmm/app/pdbfile.py\nindex 99c41776a7..81a1cf1403 100644\n--- a/wrappers/python/openmm/app/pdbfile.py\n+++ b/wrappers/python/openmm/app/pdbfile.py\n@@ -363,7 +363,7 @@ def writeModel(topology, positions, file=sys.stdout, modelIndex=None, keepIds=Fa\n if keepIds and len(res.id) < 5:\n resId = res.id\n else:\n- resId = \"%4d\" % ((resIndex+1)%10000)\n+ resId = _formatIndex(resIndex+1, 4)\n if len(res.insertionCode) == 1:\n resIC = res.insertionCode\n else:\n@@ -384,8 +384,8 @@ def writeModel(topology, positions, file=sys.stdout, modelIndex=None, keepIds=Fa\n else:\n atomName = atom.name\n coords = positions[posIndex]\n- line = \"%s%5d %-4s %3s %s%4s%1s %s%s%s 1.00 0.00 %2s \" % (\n- recordName, atomIndex%100000, atomName, resName, chainName, resId, resIC, _format_83(coords[0]),\n+ line = \"%s%5s %-4s %3s %s%4s%1s %s%s%s 1.00 0.00 %2s \" % (\n+ recordName, _formatIndex(atomIndex, 5), atomName, resName, chainName, resId, resIC, _format_83(coords[0]),\n _format_83(coords[1]), _format_83(coords[2]), symbol)\n if len(line) != 80:\n raise ValueError('Fixed width overflow detected')\n@@ -393,7 +393,7 @@ def writeModel(topology, positions, file=sys.stdout, modelIndex=None, keepIds=Fa\n posIndex += 1\n atomIndex += 1\n if resIndex == len(residues)-1:\n- print(\"TER %5d %3s %s%4s\" % (atomIndex, resName, chainName, resId), file=file)\n+ print(\"TER %5s %3s %s%4s\" % (_formatIndex(atomIndex, 5), resName, chainName, resId), file=file)\n atomIndex += 1\n if modelIndex is not None:\n print(\"ENDMDL\", file=file)\n@@ -450,11 +450,11 @@ def writeFooter(topology, file=sys.stdout):\n for index1 in sorted(atomBonds):\n bonded = atomBonds[index1]\n while len(bonded) > 4:\n- print(\"CONECT%5d%5d%5d%5d\" % (index1, bonded[0], bonded[1], bonded[2]), file=file)\n+ print(\"CONECT%5s%5s%5s%5s\" % (_formatIndex(index1, 5), _formatIndex(bonded[0], 5), _formatIndex(bonded[1], 5), _formatIndex(bonded[2], 5)), file=file)\n del bonded[:4]\n- line = \"CONECT%5d\" % index1\n+ line = \"CONECT%5s\" % _formatIndex(index1, 5)\n for index2 in bonded:\n- line = \"%s%5d\" % (line, index2)\n+ line = \"%s%5s\" % (line, _formatIndex(index2, 5))\n print(line, file=file)\n print(\"END\", file=file)\n \n@@ -470,3 +470,14 @@ def _format_83(f):\n return ('%8.3f' % f)[:8]\n raise ValueError('coordinate \"%s\" could not be represented '\n 'in a width-8 field' % f)\n+\n+def _formatIndex(index, places):\n+ \"\"\"Create a string representation of an atom or residue index. If the value is larger than can fit\n+ in the available space, switch to hex.\n+ \"\"\"\n+ if index < 10**places:\n+ format = f'%{places}d'\n+ return format % index\n+ format = f'%{places}X'\n+ shiftedIndex = (index - 10**places + 10*16**(places-1)) % (16**places)\n+ return format % shiftedIndex\n\\ No newline at end of file\n"}, "test": {"test_patch": "diff --git a/wrappers/python/tests/TestPdbFile.py b/wrappers/python/tests/TestPdbFile.py\nindex 5da9f09a63..efa197a26c 100644\n--- a/wrappers/python/tests/TestPdbFile.py\n+++ b/wrappers/python/tests/TestPdbFile.py\n@@ -94,6 +94,45 @@ def test_AltLocs(self):\n self.assertEqual(19, len(pdb.positions))\n self.assertEqual('ILE', list(pdb.topology.residues())[0].name)\n \n+ def test_LargeFile(self):\n+ \"\"\"Write and read a file with more than 100,000 atoms\"\"\"\n+ topology = Topology()\n+ chain = topology.addChain('A')\n+ for i in range(20000):\n+ res = topology.addResidue('MOL', chain)\n+ atoms = []\n+ for j in range(6):\n+ atoms.append(topology.addAtom(f'AT{j}', elem.carbon, res))\n+ for j in range(5):\n+ topology.addBond(atoms[j], atoms[j+1])\n+ positions = [Vec3(0, 0, 0)]*topology.getNumAtoms()\n+\n+ # The model has 20,000 residues and 120,000 atoms.\n+\n+ output = StringIO()\n+ PDBFile.writeFile(topology, positions, output)\n+ input = StringIO(output.getvalue())\n+ pdb = PDBFile(input)\n+ output.close()\n+ input.close()\n+ self.assertEqual(len(positions), len(pdb.positions))\n+ self.assertEqual(topology.getNumAtoms(), pdb.topology.getNumAtoms())\n+ self.assertEqual(topology.getNumResidues(), pdb.topology.getNumResidues())\n+ self.assertEqual(topology.getNumChains(), pdb.topology.getNumChains())\n+ self.assertEqual(topology.getNumBonds(), pdb.topology.getNumBonds())\n+ for atom in pdb.topology.atoms():\n+ self.assertEqual(str(atom.index+1), atom.id)\n+ for res in pdb.topology.residues():\n+ self.assertEqual(str(res.index+1), res.id)\n+\n+ # Make sure the CONECT records were interpreted correctly.\n+\n+ bonds = set()\n+ for atom1, atom2 in topology.bonds():\n+ bonds.add(tuple(sorted((atom1.index, atom2.index))))\n+ for atom1, atom2 in pdb.topology.bonds():\n+ assert tuple(sorted((atom1.index, atom2.index))) in bonds\n+\n def assertVecAlmostEqual(self, p1, p2, tol=1e-7):\n unit = p1.unit\n p1 = p1.value_in_unit(unit)\n", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}69{"question_id": "MSB_openmm_openmm_pr3614", "question_type": "multi_swe_bench", "description": "Added temperature adjustment to MC barostat for simulated tempering (openmm/openmm#3614)", "content": {"org": "openmm", "repo": "openmm", "pr_number": 3614, "issue_title": "Added temperature adjustment to MC barostat for simulated tempering", "issue_body": "The title more or less explains it all:\r\nThis pull request allows simulated tempering to be run in isobaric ensembles using Monte Carlo barostats by adjusting the temperature of the barostat.\r\n\r\nfixes #3612", "base_commit": "c3c8ec55e87f515e37151b346a7535e5e9c6b99b", "resolved_issues": [{"number": 3612, "title": "Simulated tempering in the isothermal-isobaric ensemble", "body": "Hi OpenMM-devs,\r\n\r\nI am attempting to run simulated tempering in the isothermal-isobaric ensemble, however upon inspection of the code it appears to me it only works in the canonical ensemble or non-MC volume regulated simulations?\r\n\r\nI was wondering, could one run with a Monte Carlo barostat by addition of the following code?\r\n```python\r\n# Select the initial temperature.\r\n\r\nself.currentTemperature = 0\r\nself.simulation.integrator.setTemperature(self.temperatures[self.currentTemperature])\r\nfor force in self.simulation.system.getForces():\r\n if force.getName() == 'MonteCarloBarostat':\r\n force.setDefaultTemperature(self.temperatures[self.currentTemperature])\r\n```\r\nand\r\n```python\r\n# Select this temperature.\r\nself._hasMadeTransition = True\r\nself.currentTemperature = j\r\nself.simulation.integrator.setTemperature(self.temperatures[j])\r\nfor force in self.simulation.system.getForces():\r\n if force.getName() == 'MonteCarloBarostat':\r\n force.setDefaultTemperature(self.temperatures[self.currentTemperature])\r\n```\r\nLooking forward hearing from you and hoping to get even more hands-on with OpenMM in the future.\r\n\n\n## IMPORTANT INSTRUCTIONS\n\n1. If you edit a python file, you MUST run 'make PythonInstall' inside the build directory\n2. If you edit a c++ file, you MUST run 'make -j4 && make install\" inside the build directory"}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/openmm_m_openmm:pr-3614", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/wrappers/python/openmm/app/simulatedtempering.py b/wrappers/python/openmm/app/simulatedtempering.py\nindex 57158241aa..1451b69b91 100644\n--- a/wrappers/python/openmm/app/simulatedtempering.py\n+++ b/wrappers/python/openmm/app/simulatedtempering.py\n@@ -160,6 +160,9 @@ def __init__(self, simulation, temperatures=None, numTemperatures=None, minTempe\n \n self.currentTemperature = 0\n self.simulation.integrator.setTemperature(self.temperatures[self.currentTemperature])\n+ for param in self.simulation.context.getParameters():\n+ if 'MonteCarloTemperature' in param:\n+ self.simulation.context.setParameter(param, self.temperatures[self.currentTemperature])\n \n # Add a reporter to the simulation which will handle the updates and reports.\n \n@@ -230,6 +233,9 @@ def _attemptTemperatureChange(self, state):\n self._hasMadeTransition = True\n self.currentTemperature = j\n self.simulation.integrator.setTemperature(self.temperatures[j])\n+ for param in self.simulation.context.getParameters():\n+ if 'MonteCarloTemperature' in param:\n+ self.simulation.context.setParameter(param, self.temperatures[self.currentTemperature])\n if self._updateWeights:\n # Update the weight factors.\n \n"}, "test": {"test_patch": "diff --git a/wrappers/python/tests/TestSimulatedTempering.py b/wrappers/python/tests/TestSimulatedTempering.py\nindex 82d7c95284..716bab91b1 100644\n--- a/wrappers/python/tests/TestSimulatedTempering.py\n+++ b/wrappers/python/tests/TestSimulatedTempering.py\n@@ -52,4 +52,49 @@ def testHarmonicOscillator(self):\n assert 0.97 < meanDist < 1.03\n meanEnergy = sum([0.5*1000*(r-1)**2 for r in d])/n\n expectedEnergy = (0.5*MOLAR_GAS_CONSTANT_R*t).value_in_unit(kilojoules_per_mole)\n- self.assertAlmostEqual(expectedEnergy, meanEnergy, delta=expectedEnergy*0.3)\n\\ No newline at end of file\n+ self.assertAlmostEqual(expectedEnergy, meanEnergy, delta=expectedEnergy*0.3)\n+\n+\n+ def testHarmonicOscillatorNPT(self):\n+ \"\"\"Test running simulated tempering on a harmonic oscillator with a Monte Carlo barostat.\"\"\"\n+ system = System()\n+ system.addParticle(1.0)\n+ system.addParticle(1.0)\n+ force = HarmonicBondForce()\n+ force.addBond(0, 1, 1.0, 1000.0)\n+ system.addForce(force)\n+ mcbarostat = MonteCarloBarostat(1*bar, 100*kelvin, 2)\n+ system.addForce(mcbarostat)\n+ force.setUsesPeriodicBoundaryConditions(True)\n+ integrator = LangevinIntegrator(100*kelvin, 10/picosecond, 0.001*picosecond)\n+ topology = Topology()\n+ chain = topology.addChain()\n+ residue = topology.addResidue('H2', chain)\n+ topology.addAtom('H1', element.hydrogen, residue)\n+ topology.addAtom('H2', element.hydrogen, residue)\n+ simulation = Simulation(topology, system, integrator, Platform.getPlatformByName('Reference'))\n+ simulation.context.setPositions([Vec3(0, 0, 0), Vec3(1, 0, 0)])\n+\n+ # Check the temperature is correct before creating the simulated tempering simulation\n+ \n+ self.assertEqual(100*kelvin, integrator.getTemperature())\n+ self.assertEqual(100*kelvin, simulation.context.getParameter('MonteCarloTemperature')*kelvin)\n+\n+ st = SimulatedTempering(simulation, numTemperatures=10, minTemperature=200*kelvin, maxTemperature=400*kelvin, tempChangeInterval=4, reportInterval=10000)\n+\n+ # Check the temperatures of the integrator and barostat are set to the value of minTemperature\n+\n+ self.assertEqual(10, len(st.temperatures))\n+ self.assertEqual(200*kelvin, st.temperatures[0])\n+ self.assertEqual(400*kelvin, st.temperatures[-1])\n+ self.assertEqual(200*kelvin, integrator.getTemperature())\n+ self.assertEqual(200*kelvin, simulation.context.getParameter('MonteCarloTemperature')*kelvin)\n+\n+ # Let the simulation run and assert at every step T(mcbarostat) == T(integrator) == T(tempering)\n+\n+ for i in range(1000):\n+ st.step(2)\n+ self.assertEqual(st.temperatures[st.currentTemperature], integrator.getTemperature())\n+ self.assertEqual(st.temperatures[st.currentTemperature], simulation.context.getParameter('MonteCarloTemperature')*kelvin)\n+\n+\n", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}70{"question_id": "MSB_openmm_openmm_pr3711", "question_type": "multi_swe_bench", "description": "CustomCVForce avoids breaking up molecules (openmm/openmm#3711)", "content": {"org": "openmm", "repo": "openmm", "pr_number": 3711, "issue_title": "CustomCVForce avoids breaking up molecules", "issue_body": "This might or might not be the fix for https://github.com/openmm/openmm-ml/issues/36. Each Force object reports what atoms it creates bonds between, so all the atoms in a molecule are translated together when applying periodic boundary conditions. CustomCVForce did not propagate the bond specifications from the Forces it contained.\r\n\r\nThis only applied to output when calling `getState()` with `enforcePeriodicBox=true`. There's a different mechanism used to identify molecules when internally translating positions to preserve accuracy. That mechanism was handled correctly, so it never broke up molecules during normal integration. It only happened when returning output from `getState()`.\r\n\r\ncc @dominicrufa", "base_commit": "a39fa14acbb8eb00fb2dcb8f4e6ba0bc9b2564a9", "resolved_issues": [{"number": null, "title": "CustomCVForce avoids breaking up molecules", "body": "### Issue Description\n\n**Problem:** \nWhen using `CustomCVForce` in simulations with periodic boundary conditions, molecules may be incorrectly split across boundaries when retrieving the system state via the `getState()` method with `enforcePeriodicBox=true`. This occurs because `CustomCVForce` does not propagate bond information from the forces it contains, which is necessary to ensure that all atoms within a molecule are translated together during boundary enforcement. Although this issue does not affect the accuracy of position translations during integration, it results in incorrect output for the system state under certain conditions.\n\n**Expected Behavior:** \nWhen `getState()` is called with `enforcePeriodicBox=true`, molecules should remain intact and their constituent atoms should be translated together across periodic boundaries. This behavior should align with the correct handling of molecule integrity during normal integration.\n\n## IMPORTANT INSTRUCTIONS\n\n1. If you edit a python file, you MUST run 'make PythonInstall' inside the build directory\n2. If you edit a c++ file, you MUST run 'make -j4 && make install\" inside the build directory"}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/openmm_m_openmm:pr-3711", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/openmmapi/include/openmm/internal/CustomCVForceImpl.h b/openmmapi/include/openmm/internal/CustomCVForceImpl.h\nindex c0372114d6..01e69a8b45 100644\n--- a/openmmapi/include/openmm/internal/CustomCVForceImpl.h\n+++ b/openmmapi/include/openmm/internal/CustomCVForceImpl.h\n@@ -9,7 +9,7 @@\n * Biological Structures at Stanford, funded under the NIH Roadmap for *\n * Medical Research, grant U54 GM072970. See https://simtk.org. *\n * *\n- * Portions copyright (c) 2008-2017 Stanford University and the Authors. *\n+ * Portions copyright (c) 2008-2022 Stanford University and the Authors. *\n * Authors: Peter Eastman *\n * Contributors: *\n * *\n@@ -62,6 +62,7 @@ class OPENMM_EXPORT CustomCVForceImpl : public ForceImpl {\n double calcForcesAndEnergy(ContextImpl& context, bool includeForces, bool includeEnergy, int groups);\n std::map<std::string, double> getDefaultParameters();\n std::vector<std::string> getKernelNames();\n+ std::vector<std::pair<int, int> > getBondedParticles() const;\n void getCollectiveVariableValues(ContextImpl& context, std::vector<double>& values);\n Context& getInnerContext();\n void updateParametersInContext(ContextImpl& context);\ndiff --git a/openmmapi/src/CustomCVForceImpl.cpp b/openmmapi/src/CustomCVForceImpl.cpp\nindex 31c6930830..d980c0625d 100644\n--- a/openmmapi/src/CustomCVForceImpl.cpp\n+++ b/openmmapi/src/CustomCVForceImpl.cpp\n@@ -6,7 +6,7 @@\n * Biological Structures at Stanford, funded under the NIH Roadmap for *\n * Medical Research, grant U54 GM072970. See https://simtk.org. *\n * *\n- * Portions copyright (c) 2008-2017 Stanford University and the Authors. *\n+ * Portions copyright (c) 2008-2022 Stanford University and the Authors. *\n * Authors: Peter Eastman *\n * Contributors: *\n * *\n@@ -91,6 +91,16 @@ vector<string> CustomCVForceImpl::getKernelNames() {\n return names;\n }\n \n+vector<pair<int, int> > CustomCVForceImpl::getBondedParticles() const {\n+ vector<pair<int, int> > bonds;\n+ const ContextImpl& innerContextImpl = getContextImpl(*innerContext);\n+ for (auto& impl : innerContextImpl.getForceImpls()) {\n+ for (auto& bond : impl->getBondedParticles())\n+ bonds.push_back(bond);\n+ }\n+ return bonds;\n+}\n+\n map<string, double> CustomCVForceImpl::getDefaultParameters() {\n map<string, double> parameters;\n parameters.insert(innerContext->getParameters().begin(), innerContext->getParameters().end());\n"}, "test": {"test_patch": "diff --git a/tests/TestCustomCVForce.h b/tests/TestCustomCVForce.h\nindex 33cc8457d6..f4bd380f96 100644\n--- a/tests/TestCustomCVForce.h\n+++ b/tests/TestCustomCVForce.h\n@@ -6,7 +6,7 @@\n * Biological Structures at Stanford, funded under the NIH Roadmap for *\n * Medical Research, grant U54 GM072970. See https://simtk.org. *\n * *\n- * Portions copyright (c) 2017 Stanford University and the Authors. *\n+ * Portions copyright (c) 2017-2022 Stanford University and the Authors. *\n * Authors: Peter Eastman *\n * Contributors: *\n * *\n@@ -38,9 +38,11 @@\n #include \"openmm/CustomCVForce.h\"\n #include \"openmm/CustomExternalForce.h\"\n #include \"openmm/CustomNonbondedForce.h\"\n+#include \"openmm/HarmonicBondForce.h\"\n #include \"openmm/System.h\"\n #include \"openmm/VerletIntegrator.h\"\n #include \"sfmt/SFMT.h\"\n+#include <algorithm>\n #include <iostream>\n #include <vector>\n \n@@ -234,6 +236,38 @@ void testReordering() {\n ASSERT_EQUAL_VEC(delta*2/r, state.getForces()[10], 1e-5);\n }\n \n+void testMolecules() {\n+ // Verify that CustomCVForce correctly propagates information about molecules\n+ // from the forces it contains.\n+ \n+ System system;\n+ for (int i = 0; i < 5; i++)\n+ system.addParticle(1.0);\n+ CustomCVForce* cv = new CustomCVForce(\"x+y\");\n+ system.addForce(cv);\n+ HarmonicBondForce* bonds1 = new HarmonicBondForce();\n+ bonds1->addBond(0, 1, 1.0, 1.0);\n+ bonds1->addBond(2, 3, 1.0, 1.0);\n+ cv->addCollectiveVariable(\"x\", bonds1);\n+ HarmonicBondForce* bonds2 = new HarmonicBondForce();\n+ bonds2->addBond(1, 2, 1.0, 1.0);\n+ cv->addCollectiveVariable(\"y\", bonds2);\n+ VerletIntegrator integrator(0.01);\n+ Context context(system, integrator, platform);\n+ vector<vector<int> > molecules = context.getMolecules();\n+ ASSERT_EQUAL(2, molecules.size());\n+ for (auto& mol : molecules) {\n+ if (mol.size() == 1) {\n+ ASSERT_EQUAL(4, mol[0]);\n+ }\n+ else {\n+ ASSERT_EQUAL(4, mol.size());\n+ for (int i = 0; i < 4; i++)\n+ ASSERT(find(mol.begin(), mol.end(), i) != mol.end());\n+ }\n+ }\n+}\n+\n void runPlatformTests();\n \n int main(int argc, char* argv[]) {\n@@ -243,6 +277,7 @@ int main(int argc, char* argv[]) {\n testEnergyParameterDerivatives();\n testTabulatedFunction();\n testReordering();\n+ testMolecules();\n runPlatformTests();\n }\n catch(const exception& e) {\n", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}71{"question_id": "MSB_openmm_openmm_pr3760", "question_type": "multi_swe_bench", "description": "Add SWM4-NDP water to modeller.addSolvent() (openmm/openmm#3760)", "content": {"org": "openmm", "repo": "openmm", "pr_number": 3760, "issue_title": "Add SWM4-NDP water to modeller.addSolvent()", "issue_body": "Hi all,\r\n\r\nI opened issue #3415 earlier this year regarding the inability to load a pdb of a protein and then use OpenMM to solvate the system with this water for use with polarizable force fields like the CHARMM Drude family. The current solution is to solvate with another force field and tip3p water, load the polarizable force field, and add the extra particles.\r\n\r\nThis could be confusing to newer users (me) and also has some weird consequences. For example, as discussed at the end of #3415, I was attempting to simulate a tripeptide glycine isoleucine glycine with charged N and neutral C termini. Since I had to solvate the tripeptide with a different force field (CHARMM36m), the neutral C terminus atom naming in the C36m is different than for Drude, leading to the following after trying to load parameters for the Drude force field for the solvated system.\r\n\r\n`ValueError: No template found for residue 3 (GLY). The set of atoms is similar to SER, but it is missing 12 atoms.`\r\n\r\nThis simple fix should simplify this process and help avoid unnecessary steps, like manual modifications of pdbs between preparation steps, for users to easily utilize the force fields available in the suite. Here is what I did:\r\n\r\n1. Loaded the cubic box with 3 nm edge of tip3p water included in openmm/wrappers/python/openmm/app/data and converted it to swm4-ndp with the following:\r\n\r\n````\r\npdb = PDBFile(\"./tip3p.pdb\") #tip3p box pdb file included with OpenMM\r\n\r\nmodeller = Modeller(pdb.topology, pdb.positions)\r\nforcefield = ForceField(\"charmm_polar_2019.xml\")\r\nmodeller.addExtraParticles(forcefield) #convert tip3p water to swm4-ndp water in box\r\n````\r\n\r\n2. Ran a production simulation (after energy minimzation) for 20 ns at 300K with a time step of 0.5 fs and tracked various properties to test for equilibration. The temperature does vary between 298 and ~315K which might indicate my time step was still slightly too large. But everything looks ok otherwise:\r\n\r\n\r\n\r\n3. Add a pdb of this box to OpenMM: openmm/wrappers/python/openmm/app/data/swm4ndp.pdb which will be called by `modeller.addSolvent()`\r\n\r\n4. Added the option for this water model to be called by `addSolvent` and edited the comments at the beginning of the function\r\n\r\n````\r\nelif model == 'swm4ndp':\r\n waterRadius = 0.318395*vdwRadiusPerSigma\r\n````\r\nWhere the sigma value of 0.318395 was taken from Table 1 of Lamoureux Jour. Phys. Chem. Let. 2006, the paper introducing this water model.\r\n\r\n5. Installed my fork from source on a fresh install of Ubuntu 22.04 and solvated the same GIG tripeptide in a cubic box with 5 nm edges using the following:\r\n\r\n```\r\nmodeller = Modeller(pdb.topology, pdb.positions)\r\nforcefield = ForceField('charmm_polar_2019.xml')\r\nmodeller.addExtraParticles(forcefield)\r\nmodeller.addSolvent(forcefield, boxSize=Vec3(5, 5, 5)*nanometers, neutralize=True, negativeIon='Cl-', positiveIon='Na+', model='swm4ndp')\r\n```\r\n\r\nHere is the pdb of the sovlated (not minimized) structure: [solvated-fixed.pdb.txt](https://github.com/openmm/openmm/files/9465055/solvated-fixed.pdb.txt). It started minimizing the energy but I was testing on a virtual machine where GPU passthrough is not available. So, I did not run a long production simulation with these changes as the CPU platform on a 1 CPU VM would take a looong time. \r\n\r\nI did not write any automated tests for this change and the New Feature Checklist appears to be blank (https://github.com/openmm/openmm/wiki/Checklist-when-adding-a-new-feature). I would be happy to write some tests if needed. I understand this is a micro change for a pull request but I'm happy to write some tests for this or make other changes if needed. Thanks for reading.\r\n\r\nBrian\r\n\r\n", "base_commit": "0e104b49b534abd57de4f0cb9c752eee9881c3b3", "resolved_issues": [{"number": null, "title": "Add SWM4-NDP water to modeller.addSolvent()", "body": "### Issue Description\n\n**Problem:**\nCurrently, OpenMM does not support the direct addition of SWM4-NDP water models when solvating a system using the `addSolvent` method. This limitation creates challenges for users working with polarizable force fields, such as the CHARMM Drude family, as they must use alternative workflows. These workflows often involve solvating with a different water model (e.g., TIP3P) and then converting it to SWM4-NDP, which can lead to errors and inconsistencies. For example, discrepancies in atom naming conventions between force fields can result in parameter loading failures or require manual intervention to modify PDB files, which is error-prone and time-consuming.\n\n**Expected Behavior:**\nUsers should be able to directly solvate systems with the SWM4-NDP water model using the `addSolvent` method. This would streamline the workflow for simulations involving polarizable force fields, eliminate the need for intermediate steps or manual modifications, and reduce the likelihood of errors. The process should be as straightforward as using other supported water models, ensuring consistency and ease of use for both new and experienced users.\n\n## IMPORTANT INSTRUCTIONS\n\n1. If you edit a python file, you MUST run 'make PythonInstall' inside the build directory\n2. If you edit a c++ file, you MUST run 'make -j4 && make install\" inside the build directory"}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/openmm_m_openmm:pr-3760", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/wrappers/python/openmm/app/data/swm4ndp.pdb b/wrappers/python/openmm/app/data/swm4ndp.pdb\nnew file mode 100644\nindex 0000000000..c3e683130d\n--- /dev/null\n+++ b/wrappers/python/openmm/app/data/swm4ndp.pdb\n@@ -0,0 +1,4479 @@\n+REMARK 1 CREATED WITH OPENMM 7.6, 2022-08-30\n+CRYST1 30.000 30.000 30.000 90.00 90.00 90.00 P 1 1 \n+HETATM 1 O HOH A 1 4.440 13.334 13.676 1.00 0.00 O \n+HETATM 2 H1 HOH A 1 4.127 14.060 14.216 1.00 0.00 H \n+HETATM 3 H2 HOH A 1 4.456 12.583 14.269 1.00 0.00 H \n+HETATM 4 DOH2 HOH A 1 4.435 13.344 13.571 1.00 0.00 EP \n+HETATM 5 OM HOH A 1 4.379 13.329 13.908 1.00 0.00 EP \n+HETATM 6 O HOH A 2 18.660 16.482 3.730 1.00 0.00 O \n+HETATM 7 H1 HOH A 2 18.430 15.667 4.176 1.00 0.00 H \n+HETATM 8 H2 HOH A 2 17.928 16.644 3.134 1.00 0.00 H \n+HETATM 9 DOH2 HOH A 2 18.715 16.525 3.732 1.00 0.00 EP \n+HETATM 10 OM HOH A 2 18.463 16.348 3.699 1.00 0.00 EP \n+HETATM 11 O HOH A 3 21.747 5.493 30.092 1.00 0.00 O \n+HETATM 12 H1 HOH A 3 21.275 4.722 30.407 1.00 0.00 H \n+HETATM 13 H2 HOH A 3 21.061 6.084 29.782 1.00 0.00 H \n+HETATM 14 DOH2 HOH A 3 21.838 5.505 30.115 1.00 0.00 EP \n+HETATM 15 OM HOH A 3 21.509 5.456 30.093 1.00 0.00 EP \n+HETATM 16 O HOH A 4 7.217 27.281 3.571 1.00 0.00 O \n+HETATM 17 H1 HOH A 4 6.463 26.990 4.083 1.00 0.00 H \n+HETATM 18 H2 HOH A 4 7.427 28.146 3.923 1.00 0.00 H \n+HETATM 19 DOH2 HOH A 4 7.259 27.223 3.500 1.00 0.00 EP \n+HETATM 20 OM HOH A 4 7.105 27.399 3.748 1.00 0.00 EP \n+HETATM 21 O HOH A 5 20.199 0.828 21.371 1.00 0.00 O \n+HETATM 22 H1 HOH A 5 20.563 0.333 20.636 1.00 0.00 H \n+HETATM 23 H2 HOH A 5 20.317 1.746 21.123 1.00 0.00 H \n+HETATM 24 DOH2 HOH A 5 20.152 0.820 21.463 1.00 0.00 EP \n+HETATM 25 OM HOH A 5 20.298 0.915 21.169 1.00 0.00 EP \n+HETATM 26 O HOH A 6 6.959 18.529 22.057 1.00 0.00 O \n+HETATM 27 H1 HOH A 6 6.268 19.068 22.441 1.00 0.00 H \n+HETATM 28 H2 HOH A 6 7.687 19.134 21.918 1.00 0.00 H \n+HETATM 29 DOH2 HOH A 6 6.968 18.416 22.052 1.00 0.00 EP \n+HETATM 30 OM HOH A 6 6.966 18.764 22.107 1.00 0.00 EP \n+HETATM 31 O HOH A 7 11.940 11.887 12.121 1.00 0.00 O \n+HETATM 32 H1 HOH A 7 11.501 11.039 12.058 1.00 0.00 H \n+HETATM 33 H2 HOH A 7 12.870 11.672 12.187 1.00 0.00 H \n+HETATM 34 DOH2 HOH A 7 11.912 11.972 12.100 1.00 0.00 EP \n+HETATM 35 OM HOH A 7 12.041 11.669 12.121 1.00 0.00 EP \n+HETATM 36 O HOH A 8 5.950 6.525 8.199 1.00 0.00 O \n+HETATM 37 H1 HOH A 8 5.390 5.785 7.964 1.00 0.00 H \n+HETATM 38 H2 HOH A 8 6.338 6.805 7.370 1.00 0.00 H \n+HETATM 39 DOH2 HOH A 8 5.983 6.558 8.285 1.00 0.00 EP \n+HETATM 40 OM HOH A 8 5.915 6.430 7.981 1.00 0.00 EP \n+HETATM 41 O HOH A 9 14.734 17.175 15.428 1.00 0.00 O \n+HETATM 42 H1 HOH A 9 13.938 16.932 14.955 1.00 0.00 H \n+HETATM 43 H2 HOH A 9 15.314 17.530 14.754 1.00 0.00 H \n+HETATM 44 DOH2 HOH A 9 14.741 17.171 15.533 1.00 0.00 EP \n+HETATM 45 OM HOH A 9 14.690 17.198 15.193 1.00 0.00 EP \n+HETATM 46 O HOH A 10 0.920 15.039 7.938 1.00 0.00 O \n+HETATM 47 H1 HOH A 10 0.038 15.370 7.771 1.00 0.00 H \n+HETATM 48 H2 HOH A 10 0.861 14.100 7.763 1.00 0.00 H \n+HETATM 49 DOH2 HOH A 10 1.013 15.099 7.928 1.00 0.00 EP \n+HETATM 50 OM HOH A 10 0.727 14.914 7.868 1.00 0.00 EP \n+HETATM 51 O HOH A 11 18.806 18.032 9.683 1.00 0.00 O \n+HETATM 52 H1 HOH A 11 18.225 17.613 10.318 1.00 0.00 H \n+HETATM 53 H2 HOH A 11 18.215 18.469 9.070 1.00 0.00 H \n+HETATM 54 DOH2 HOH A 11 18.883 18.053 9.679 1.00 0.00 EP \n+HETATM 55 OM HOH A 11 18.566 18.036 9.688 1.00 0.00 EP \n+HETATM 56 O HOH A 12 8.918 8.809 16.976 1.00 0.00 O \n+HETATM 57 H1 HOH A 12 8.616 8.116 17.563 1.00 0.00 H \n+HETATM 58 H2 HOH A 12 9.235 8.346 16.200 1.00 0.00 H \n+HETATM 59 DOH2 HOH A 12 8.921 8.885 17.003 1.00 0.00 EP \n+HETATM 60 OM HOH A 12 8.921 8.572 16.937 1.00 0.00 EP \n+HETATM 61 O HOH A 13 11.231 11.218 5.926 1.00 0.00 O \n+HETATM 62 H1 HOH A 13 10.748 11.651 6.629 1.00 0.00 H \n+HETATM 63 H2 HOH A 13 11.893 10.694 6.377 1.00 0.00 H \n+HETATM 64 DOH2 HOH A 13 11.214 11.213 5.854 1.00 0.00 EP \n+HETATM 65 OM HOH A 13 11.268 11.199 6.162 1.00 0.00 EP \n+HETATM 66 O HOH A 14 17.582 15.618 18.242 1.00 0.00 O \n+HETATM 67 H1 HOH A 14 17.992 15.667 19.106 1.00 0.00 H \n+HETATM 68 H2 HOH A 14 18.316 15.603 17.629 1.00 0.00 H \n+HETATM 69 DOH2 HOH A 14 17.476 15.643 18.211 1.00 0.00 EP \n+HETATM 70 OM HOH A 14 17.817 15.625 18.294 1.00 0.00 EP \n+HETATM 71 O HOH A 15 21.873 9.972 6.346 1.00 0.00 O \n+HETATM 72 H1 HOH A 15 22.164 9.680 5.482 1.00 0.00 H \n+HETATM 73 H2 HOH A 15 22.653 10.361 6.743 1.00 0.00 H \n+HETATM 74 DOH2 HOH A 15 21.780 9.966 6.384 1.00 0.00 EP \n+HETATM 75 OM HOH A 15 22.093 9.992 6.250 1.00 0.00 EP \n+HETATM 76 O HOH A 16 5.728 14.085 8.748 1.00 0.00 O \n+HETATM 77 H1 HOH A 16 5.643 14.205 9.694 1.00 0.00 H \n+HETATM 78 H2 HOH A 16 5.043 14.639 8.373 1.00 0.00 H \n+HETATM 79 DOH2 HOH A 16 5.774 14.021 8.691 1.00 0.00 EP \n+HETATM 80 OM HOH A 16 5.570 14.223 8.865 1.00 0.00 EP \n+HETATM 81 O HOH A 17 31.082 18.893 15.268 1.00 0.00 O \n+HETATM 82 H1 HOH A 17 30.408 19.512 15.549 1.00 0.00 H \n+HETATM 83 H2 HOH A 17 31.098 18.973 14.314 1.00 0.00 H \n+HETATM 84 DOH2 HOH A 17 31.143 18.830 15.326 1.00 0.00 EP \n+HETATM 85 OM HOH A 17 30.947 19.037 15.130 1.00 0.00 EP \n+HETATM 86 O HOH A 18 2.631 7.138 28.639 1.00 0.00 O \n+HETATM 87 H1 HOH A 18 3.380 7.377 29.185 1.00 0.00 H \n+HETATM 88 H2 HOH A 18 2.947 7.238 27.741 1.00 0.00 H \n+HETATM 89 DOH2 HOH A 18 2.557 7.068 28.676 1.00 0.00 EP \n+HETATM 90 OM HOH A 18 2.850 7.208 28.567 1.00 0.00 EP \n+HETATM 91 O HOH A 19 13.334 25.046 14.804 1.00 0.00 O \n+HETATM 92 H1 HOH A 19 14.220 24.834 15.098 1.00 0.00 H \n+HETATM 93 H2 HOH A 19 13.314 24.772 13.887 1.00 0.00 H \n+HETATM 94 DOH2 HOH A 19 13.282 25.109 14.857 1.00 0.00 EP \n+HETATM 95 OM HOH A 19 13.512 24.946 14.676 1.00 0.00 EP \n+HETATM 96 O HOH A 20 27.943 5.183 6.062 1.00 0.00 O \n+HETATM 97 H1 HOH A 20 27.258 5.685 5.620 1.00 0.00 H \n+HETATM 98 H2 HOH A 20 28.059 4.404 5.517 1.00 0.00 H \n+HETATM 99 DOH2 HOH A 20 27.975 5.217 6.183 1.00 0.00 EP \n+HETATM 100 OM HOH A 20 27.826 5.126 5.859 1.00 0.00 EP \n+HETATM 101 O HOH A 21 18.315 22.234 1.838 1.00 0.00 O \n+HETATM 102 H1 HOH A 21 17.653 22.786 1.420 1.00 0.00 H \n+HETATM 103 H2 HOH A 21 18.668 21.702 1.125 1.00 0.00 H \n+HETATM 104 DOH2 HOH A 21 18.343 22.221 1.922 1.00 0.00 EP \n+HETATM 105 OM HOH A 21 18.252 22.238 1.606 1.00 0.00 EP \n+HETATM 106 O HOH A 22 10.958 15.988 6.191 1.00 0.00 O \n+HETATM 107 H1 HOH A 22 11.532 16.636 6.601 1.00 0.00 H \n+HETATM 108 H2 HOH A 22 10.075 16.256 6.444 1.00 0.00 H \n+HETATM 109 DOH2 HOH A 22 10.956 15.955 6.137 1.00 0.00 EP \n+HETATM 110 OM HOH A 22 10.895 16.176 6.327 1.00 0.00 EP \n+HETATM 111 O HOH A 23 18.763 4.683 25.308 1.00 0.00 O \n+HETATM 112 H1 HOH A 23 18.565 4.086 26.030 1.00 0.00 H \n+HETATM 113 H2 HOH A 23 18.482 4.213 24.523 1.00 0.00 H \n+HETATM 114 DOH2 HOH A 23 18.818 4.732 25.306 1.00 0.00 EP \n+HETATM 115 OM HOH A 23 18.665 4.464 25.295 1.00 0.00 EP \n+HETATM 116 O HOH A 24 27.970 8.937 15.976 1.00 0.00 O \n+HETATM 117 H1 HOH A 24 27.069 8.959 15.652 1.00 0.00 H \n+HETATM 118 H2 HOH A 24 27.886 9.027 16.925 1.00 0.00 H \n+HETATM 119 DOH2 HOH A 24 28.056 8.915 15.902 1.00 0.00 EP \n+HETATM 120 OM HOH A 24 27.768 8.960 16.104 1.00 0.00 EP \n+HETATM 121 O HOH A 25 1.775 20.976 4.472 1.00 0.00 O \n+HETATM 122 H1 HOH A 25 2.669 21.263 4.287 1.00 0.00 H \n+HETATM 123 H2 HOH A 25 1.880 20.163 4.966 1.00 0.00 H \n+HETATM 124 DOH2 HOH A 25 1.703 21.022 4.476 1.00 0.00 EP \n+HETATM 125 OM HOH A 25 1.980 20.868 4.535 1.00 0.00 EP \n+HETATM 126 O HOH A 26 17.499 14.176 10.701 1.00 0.00 O \n+HETATM 127 H1 HOH A 26 16.823 14.140 10.025 1.00 0.00 H \n+HETATM 128 H2 HOH A 26 17.527 13.289 11.060 1.00 0.00 H \n+HETATM 129 DOH2 HOH A 26 17.570 14.267 10.739 1.00 0.00 EP \n+HETATM 130 OM HOH A 26 17.366 13.986 10.636 1.00 0.00 EP \n+HETATM 131 O HOH A 27 9.707 24.747 30.761 1.00 0.00 O \n+HETATM 132 H1 HOH A 27 9.212 25.108 30.025 1.00 0.00 H \n+HETATM 133 H2 HOH A 27 10.407 25.382 30.913 1.00 0.00 H \n+HETATM 134 DOH2 HOH A 27 9.666 24.695 30.837 1.00 0.00 EP \n+HETATM 135 OM HOH A 27 9.749 24.952 30.641 1.00 0.00 EP \n+HETATM 136 O HOH A 28 13.185 14.834 0.407 1.00 0.00 O \n+HETATM 137 H1 HOH A 28 12.756 14.187 -0.153 1.00 0.00 H \n+HETATM 138 H2 HOH A 28 13.002 15.674 -0.013 1.00 0.00 H \n+HETATM 139 DOH2 HOH A 28 13.250 14.836 0.481 1.00 0.00 EP \n+HETATM 140 OM HOH A 28 13.059 14.873 0.206 1.00 0.00 EP \n+HETATM 141 O HOH A 29 16.528 21.749 12.965 1.00 0.00 O \n+HETATM 142 H1 HOH A 29 16.994 22.513 12.625 1.00 0.00 H \n+HETATM 143 H2 HOH A 29 17.219 21.120 13.173 1.00 0.00 H \n+HETATM 144 DOH2 HOH A 29 16.452 21.711 13.003 1.00 0.00 EP \n+HETATM 145 OM HOH A 29 16.765 21.777 12.938 1.00 0.00 EP \n+HETATM 146 O HOH A 30 4.222 28.957 26.103 1.00 0.00 O \n+HETATM 147 H1 HOH A 30 4.749 28.200 25.846 1.00 0.00 H \n+HETATM 148 H2 HOH A 30 3.880 29.303 25.279 1.00 0.00 H \n+HETATM 149 DOH2 HOH A 30 4.207 28.981 26.210 1.00 0.00 EP \n+HETATM 150 OM HOH A 30 4.260 28.873 25.881 1.00 0.00 EP \n+HETATM 151 O HOH A 31 11.481 23.550 8.563 1.00 0.00 O \n+HETATM 152 H1 HOH A 31 11.164 24.337 8.120 1.00 0.00 H \n+HETATM 153 H2 HOH A 31 12.338 23.383 8.170 1.00 0.00 H \n+HETATM 154 DOH2 HOH A 31 11.450 23.487 8.605 1.00 0.00 EP \n+HETATM 155 OM HOH A 31 11.592 23.677 8.391 1.00 0.00 EP \n+HETATM 156 O HOH A 32 15.259 27.074 2.186 1.00 0.00 O \n+HETATM 157 H1 HOH A 32 15.305 27.116 1.231 1.00 0.00 H \n+HETATM 158 H2 HOH A 32 15.353 26.143 2.390 1.00 0.00 H \n+HETATM 159 DOH2 HOH A 32 15.249 27.128 2.231 1.00 0.00 EP \n+HETATM 160 OM HOH A 32 15.288 26.891 2.032 1.00 0.00 EP \n+HETATM 161 O HOH A 33 1.121 7.458 5.486 1.00 0.00 O \n+HETATM 162 H1 HOH A 33 1.063 6.600 5.064 1.00 0.00 H \n+HETATM 163 H2 HOH A 33 2.050 7.560 5.695 1.00 0.00 H \n+HETATM 164 DOH2 HOH A 33 1.047 7.516 5.528 1.00 0.00 EP \n+HETATM 165 OM HOH A 33 1.300 7.303 5.442 1.00 0.00 EP \n+HETATM 166 O HOH A 34 4.629 1.285 16.620 1.00 0.00 O \n+HETATM 167 H1 HOH A 34 3.729 1.576 16.474 1.00 0.00 H \n+HETATM 168 H2 HOH A 34 4.996 1.188 15.742 1.00 0.00 H \n+HETATM 169 DOH2 HOH A 34 4.681 1.290 16.683 1.00 0.00 EP \n+HETATM 170 OM HOH A 34 4.520 1.325 16.410 1.00 0.00 EP \n+HETATM 171 O HOH A 35 17.081 14.171 28.259 1.00 0.00 O \n+HETATM 172 H1 HOH A 35 17.969 13.881 28.470 1.00 0.00 H \n+HETATM 173 H2 HOH A 35 17.167 14.608 27.411 1.00 0.00 H \n+HETATM 174 DOH2 HOH A 35 17.000 14.145 28.328 1.00 0.00 EP \n+HETATM 175 OM HOH A 35 17.281 14.201 28.128 1.00 0.00 EP \n+HETATM 176 O HOH A 36 11.776 1.941 18.646 1.00 0.00 O \n+HETATM 177 H1 HOH A 36 11.744 2.878 18.840 1.00 0.00 H \n+HETATM 178 H2 HOH A 36 12.434 1.594 19.248 1.00 0.00 H \n+HETATM 179 DOH2 HOH A 36 11.716 1.890 18.590 1.00 0.00 EP \n+HETATM 180 OM HOH A 36 11.904 2.062 18.810 1.00 0.00 EP \n+HETATM 181 O HOH A 37 14.862 0.459 8.336 1.00 0.00 O \n+HETATM 182 H1 HOH A 37 15.224 1.183 7.826 1.00 0.00 H \n+HETATM 183 H2 HOH A 37 14.689 -0.226 7.690 1.00 0.00 H \n+HETATM 184 DOH2 HOH A 37 14.827 0.458 8.414 1.00 0.00 EP \n+HETATM 185 OM HOH A 37 14.901 0.467 8.098 1.00 0.00 EP \n+HETATM 186 O HOH A 38 14.853 14.259 12.849 1.00 0.00 O \n+HETATM 187 H1 HOH A 38 14.117 14.172 13.454 1.00 0.00 H \n+HETATM 188 H2 HOH A 38 14.525 14.828 12.152 1.00 0.00 H \n+HETATM 189 DOH2 HOH A 38 14.879 14.208 12.851 1.00 0.00 EP \n+HETATM 190 OM HOH A 38 14.635 14.358 12.830 1.00 0.00 EP \n+HETATM 191 O HOH A 39 6.908 27.438 9.440 1.00 0.00 O \n+HETATM 192 H1 HOH A 39 7.392 28.112 9.916 1.00 0.00 H \n+HETATM 193 H2 HOH A 39 6.682 27.848 8.606 1.00 0.00 H \n+HETATM 194 DOH2 HOH A 39 6.860 27.368 9.464 1.00 0.00 EP \n+HETATM 195 OM HOH A 39 6.961 27.660 9.367 1.00 0.00 EP \n+HETATM 196 O HOH A 40 11.652 8.994 26.647 1.00 0.00 O \n+HETATM 197 H1 HOH A 40 11.692 9.509 25.842 1.00 0.00 H \n+HETATM 198 H2 HOH A 40 12.400 9.297 27.163 1.00 0.00 H \n+HETATM 199 DOH2 HOH A 40 11.604 8.922 26.657 1.00 0.00 EP \n+HETATM 200 OM HOH A 40 11.814 9.162 26.588 1.00 0.00 EP \n+HETATM 201 O HOH A 41 28.469 16.046 7.423 1.00 0.00 O \n+HETATM 202 H1 HOH A 41 27.975 16.142 6.609 1.00 0.00 H \n+HETATM 203 H2 HOH A 41 28.384 16.894 7.857 1.00 0.00 H \n+HETATM 204 DOH2 HOH A 41 28.546 15.984 7.448 1.00 0.00 EP \n+HETATM 205 OM HOH A 41 28.350 16.239 7.345 1.00 0.00 EP \n+HETATM 206 O HOH A 42 8.983 6.796 3.992 1.00 0.00 O \n+HETATM 207 H1 HOH A 42 9.361 7.544 3.530 1.00 0.00 H \n+HETATM 208 H2 HOH A 42 8.249 7.164 4.485 1.00 0.00 H \n+HETATM 209 DOH2 HOH A 42 8.983 6.737 3.982 1.00 0.00 EP \n+HETATM 210 OM HOH A 42 8.910 7.025 3.998 1.00 0.00 EP \n+HETATM 211 O HOH A 43 23.767 10.015 17.461 1.00 0.00 O \n+HETATM 212 H1 HOH A 43 24.246 9.263 17.114 1.00 0.00 H \n+HETATM 213 H2 HOH A 43 23.658 9.821 18.392 1.00 0.00 H \n+HETATM 214 DOH2 HOH A 43 23.737 10.075 17.386 1.00 0.00 EP \n+HETATM 215 OM HOH A 43 23.843 9.821 17.581 1.00 0.00 EP \n+HETATM 216 O HOH A 44 8.025 13.944 7.237 1.00 0.00 O \n+HETATM 217 H1 HOH A 44 7.251 13.890 7.797 1.00 0.00 H \n+HETATM 218 H2 HOH A 44 8.622 13.283 7.588 1.00 0.00 H \n+HETATM 219 DOH2 HOH A 44 8.030 14.007 7.145 1.00 0.00 EP \n+HETATM 220 OM HOH A 44 7.989 13.797 7.424 1.00 0.00 EP \n+HETATM 221 O HOH A 45 8.853 3.299 12.379 1.00 0.00 O \n+HETATM 222 H1 HOH A 45 9.510 3.777 11.873 1.00 0.00 H \n+HETATM 223 H2 HOH A 45 8.557 3.925 13.039 1.00 0.00 H \n+HETATM 224 DOH2 HOH A 45 8.791 3.198 12.380 1.00 0.00 EP \n+HETATM 225 OM HOH A 45 8.927 3.525 12.411 1.00 0.00 EP \n+HETATM 226 O HOH A 46 15.578 14.057 8.794 1.00 0.00 O \n+HETATM 227 H1 HOH A 46 15.101 14.859 8.583 1.00 0.00 H \n+HETATM 228 H2 HOH A 46 14.929 13.360 8.699 1.00 0.00 H \n+HETATM 229 DOH2 HOH A 46 15.690 14.041 8.825 1.00 0.00 EP \n+HETATM 230 OM HOH A 46 15.347 14.078 8.731 1.00 0.00 EP \n+HETATM 231 O HOH A 47 7.694 17.589 13.381 1.00 0.00 O \n+HETATM 232 H1 HOH A 47 7.072 18.209 13.762 1.00 0.00 H \n+HETATM 233 H2 HOH A 47 7.414 16.735 13.712 1.00 0.00 H \n+HETATM 234 DOH2 HOH A 47 7.767 17.600 13.354 1.00 0.00 EP \n+HETATM 235 OM HOH A 47 7.509 17.541 13.527 1.00 0.00 EP \n+HETATM 236 O HOH A 48 22.078 4.192 3.193 1.00 0.00 O \n+HETATM 237 H1 HOH A 48 21.599 3.825 2.450 1.00 0.00 H \n+HETATM 238 H2 HOH A 48 22.033 5.139 3.064 1.00 0.00 H \n+HETATM 239 DOH2 HOH A 48 22.110 4.157 3.282 1.00 0.00 EP \n+HETATM 240 OM HOH A 48 21.970 4.311 3.014 1.00 0.00 EP \n+HETATM 241 O HOH A 49 20.973 20.039 14.875 1.00 0.00 O \n+HETATM 242 H1 HOH A 49 21.023 20.579 15.663 1.00 0.00 H \n+HETATM 243 H2 HOH A 49 21.531 20.489 14.240 1.00 0.00 H \n+HETATM 244 DOH2 HOH A 49 20.919 19.965 14.840 1.00 0.00 EP \n+HETATM 245 OM HOH A 49 21.098 20.242 14.906 1.00 0.00 EP \n+HETATM 246 O HOH A 50 7.461 7.129 29.663 1.00 0.00 O \n+HETATM 247 H1 HOH A 50 7.918 6.561 30.284 1.00 0.00 H \n+HETATM 248 H2 HOH A 50 8.158 7.503 29.124 1.00 0.00 H \n+HETATM 249 DOH2 HOH A 50 7.358 7.126 29.640 1.00 0.00 EP \n+HETATM 250 OM HOH A 50 7.698 7.089 29.680 1.00 0.00 EP \n+HETATM 251 O HOH A 51 10.460 25.855 27.383 1.00 0.00 O \n+HETATM 252 H1 HOH A 51 10.384 26.456 26.642 1.00 0.00 H \n+HETATM 253 H2 HOH A 51 9.724 26.081 27.952 1.00 0.00 H \n+HETATM 254 DOH2 HOH A 51 10.497 25.781 27.403 1.00 0.00 EP \n+HETATM 255 OM HOH A 51 10.293 26.025 27.348 1.00 0.00 EP \n+HETATM 256 O HOH A 52 11.899 26.241 1.550 1.00 0.00 O \n+HETATM 257 H1 HOH A 52 11.716 27.042 2.041 1.00 0.00 H \n+HETATM 258 H2 HOH A 52 12.196 25.616 2.212 1.00 0.00 H \n+HETATM 259 DOH2 HOH A 52 11.869 26.203 1.456 1.00 0.00 EP \n+HETATM 260 OM HOH A 52 11.923 26.277 1.787 1.00 0.00 EP \n+HETATM 261 O HOH A 53 4.674 3.023 12.161 1.00 0.00 O \n+HETATM 262 H1 HOH A 53 3.783 3.277 11.917 1.00 0.00 H \n+HETATM 263 H2 HOH A 53 5.084 3.837 12.452 1.00 0.00 H \n+HETATM 264 DOH2 HOH A 53 4.749 2.929 12.172 1.00 0.00 EP \n+HETATM 265 OM HOH A 53 4.575 3.242 12.171 1.00 0.00 EP \n+HETATM 266 O HOH A 54 13.628 12.727 26.674 1.00 0.00 O \n+HETATM 267 H1 HOH A 54 13.613 12.098 25.953 1.00 0.00 H \n+HETATM 268 H2 HOH A 54 14.384 12.470 27.202 1.00 0.00 H \n+HETATM 269 DOH2 HOH A 54 13.544 12.824 26.723 1.00 0.00 EP \n+HETATM 270 OM HOH A 54 13.780 12.546 26.635 1.00 0.00 EP \n+HETATM 271 O HOH A 55 11.577 20.482 12.888 1.00 0.00 O \n+HETATM 272 H1 HOH A 55 11.481 21.256 12.333 1.00 0.00 H \n+HETATM 273 H2 HOH A 55 12.521 20.401 13.025 1.00 0.00 H \n+HETATM 274 DOH2 HOH A 55 11.520 20.434 12.945 1.00 0.00 EP \n+HETATM 275 OM HOH A 55 11.751 20.624 12.802 1.00 0.00 EP \n+HETATM 276 O HOH A 56 15.691 4.566 23.929 1.00 0.00 O \n+HETATM 277 H1 HOH A 56 16.275 5.153 23.448 1.00 0.00 H \n+HETATM 278 H2 HOH A 56 15.558 3.824 23.340 1.00 0.00 H \n+HETATM 279 DOH2 HOH A 56 15.669 4.571 24.006 1.00 0.00 EP \n+HETATM 280 OM HOH A 56 15.783 4.535 23.710 1.00 0.00 EP \n+HETATM 281 O HOH A 57 14.845 19.447 7.354 1.00 0.00 O \n+HETATM 282 H1 HOH A 57 14.111 18.925 7.679 1.00 0.00 H \n+HETATM 283 H2 HOH A 57 14.451 20.047 6.721 1.00 0.00 H \n+HETATM 284 DOH2 HOH A 57 14.950 19.420 7.381 1.00 0.00 EP \n+HETATM 285 OM HOH A 57 14.614 19.463 7.291 1.00 0.00 EP \n+HETATM 286 O HOH A 58 3.666 12.887 5.441 1.00 0.00 O \n+HETATM 287 H1 HOH A 58 3.749 12.533 6.326 1.00 0.00 H \n+HETATM 288 H2 HOH A 58 2.942 13.511 5.500 1.00 0.00 H \n+HETATM 289 DOH2 HOH A 58 3.714 12.905 5.383 1.00 0.00 EP \n+HETATM 290 OM HOH A 58 3.535 12.943 5.635 1.00 0.00 EP \n+HETATM 291 O HOH A 59 11.830 4.700 19.081 1.00 0.00 O \n+HETATM 292 H1 HOH A 59 12.167 4.929 18.214 1.00 0.00 H \n+HETATM 293 H2 HOH A 59 12.138 5.404 19.652 1.00 0.00 H \n+HETATM 294 DOH2 HOH A 59 11.766 4.621 19.064 1.00 0.00 EP \n+HETATM 295 OM HOH A 59 11.962 4.891 19.020 1.00 0.00 EP \n+HETATM 296 O HOH A 60 3.288 24.044 5.220 1.00 0.00 O \n+HETATM 297 H1 HOH A 60 3.157 23.834 6.145 1.00 0.00 H \n+HETATM 298 H2 HOH A 60 3.681 23.255 4.848 1.00 0.00 H \n+HETATM 299 DOH2 HOH A 60 3.302 24.120 5.175 1.00 0.00 EP \n+HETATM 300 OM HOH A 60 3.342 23.839 5.333 1.00 0.00 EP \n+HETATM 301 O HOH A 61 9.086 6.492 12.366 1.00 0.00 O \n+HETATM 302 H1 HOH A 61 8.285 6.436 11.845 1.00 0.00 H \n+HETATM 303 H2 HOH A 61 9.715 5.943 11.899 1.00 0.00 H \n+HETATM 304 DOH2 HOH A 61 9.100 6.523 12.439 1.00 0.00 EP \n+HETATM 305 OM HOH A 61 9.051 6.368 12.163 1.00 0.00 EP \n+HETATM 306 O HOH A 62 5.941 19.492 14.546 1.00 0.00 O \n+HETATM 307 H1 HOH A 62 5.237 19.423 15.191 1.00 0.00 H \n+HETATM 308 H2 HOH A 62 6.511 20.183 14.885 1.00 0.00 H \n+HETATM 309 DOH2 HOH A 62 5.944 19.463 14.453 1.00 0.00 EP \n+HETATM 310 OM HOH A 62 5.914 19.620 14.748 1.00 0.00 EP \n+HETATM 311 O HOH A 63 12.809 4.939 12.705 1.00 0.00 O \n+HETATM 312 H1 HOH A 63 13.444 4.294 12.394 1.00 0.00 H \n+HETATM 313 H2 HOH A 63 12.601 4.660 13.596 1.00 0.00 H \n+HETATM 314 DOH2 HOH A 63 12.745 5.006 12.643 1.00 0.00 EP \n+HETATM 315 OM HOH A 63 12.897 4.749 12.824 1.00 0.00 EP \n+HETATM 316 O HOH A 64 10.773 15.600 11.285 1.00 0.00 O \n+HETATM 317 H1 HOH A 64 9.879 15.267 11.209 1.00 0.00 H \n+HETATM 318 H2 HOH A 64 10.685 16.412 11.785 1.00 0.00 H \n+HETATM 319 DOH2 HOH A 64 10.861 15.551 11.239 1.00 0.00 EP \n+HETATM 320 OM HOH A 64 10.572 15.698 11.372 1.00 0.00 EP \n+HETATM 321 O HOH A 65 11.930 8.319 9.469 1.00 0.00 O \n+HETATM 322 H1 HOH A 65 12.063 8.049 10.378 1.00 0.00 H \n+HETATM 323 H2 HOH A 65 11.075 8.749 9.469 1.00 0.00 H \n+HETATM 324 DOH2 HOH A 65 12.010 8.341 9.405 1.00 0.00 EP \n+HETATM 325 OM HOH A 65 11.782 8.352 9.655 1.00 0.00 EP \n+HETATM 326 O HOH A 66 7.177 28.247 0.860 1.00 0.00 O \n+HETATM 327 H1 HOH A 66 6.458 27.707 0.534 1.00 0.00 H \n+HETATM 328 H2 HOH A 66 7.320 27.943 1.756 1.00 0.00 H \n+HETATM 329 DOH2 HOH A 66 7.224 28.320 0.819 1.00 0.00 EP \n+HETATM 330 OM HOH A 66 7.059 28.074 0.977 1.00 0.00 EP \n+HETATM 331 O HOH A 67 15.590 18.757 3.473 1.00 0.00 O \n+HETATM 332 H1 HOH A 67 16.017 18.203 2.820 1.00 0.00 H \n+HETATM 333 H2 HOH A 67 15.730 18.301 4.303 1.00 0.00 H \n+HETATM 334 DOH2 HOH A 67 15.532 18.850 3.458 1.00 0.00 EP \n+HETATM 335 OM HOH A 67 15.706 18.550 3.509 1.00 0.00 EP \n+HETATM 336 O HOH A 68 5.934 1.107 3.140 1.00 0.00 O \n+HETATM 337 H1 HOH A 68 6.693 0.718 3.575 1.00 0.00 H \n+HETATM 338 H2 HOH A 68 6.082 2.051 3.196 1.00 0.00 H \n+HETATM 339 DOH2 HOH A 68 5.861 1.075 3.155 1.00 0.00 EP \n+HETATM 340 OM HOH A 68 6.120 1.221 3.241 1.00 0.00 EP \n+HETATM 341 O HOH A 69 9.510 9.001 6.458 1.00 0.00 O \n+HETATM 342 H1 HOH A 69 9.664 8.975 7.403 1.00 0.00 H \n+HETATM 343 H2 HOH A 69 10.022 9.750 6.153 1.00 0.00 H \n+HETATM 344 DOH2 HOH A 69 9.447 8.961 6.434 1.00 0.00 EP \n+HETATM 345 OM HOH A 69 9.647 9.149 6.589 1.00 0.00 EP \n+HETATM 346 O HOH A 70 10.950 17.962 16.067 1.00 0.00 O \n+HETATM 347 H1 HOH A 70 11.627 17.550 15.530 1.00 0.00 H \n+HETATM 348 H2 HOH A 70 10.211 17.355 16.029 1.00 0.00 H \n+HETATM 349 DOH2 HOH A 70 10.966 18.040 16.118 1.00 0.00 EP \n+HETATM 350 OM HOH A 70 10.937 17.753 15.949 1.00 0.00 EP \n+HETATM 351 O HOH A 71 9.475 9.675 9.615 1.00 0.00 O \n+HETATM 352 H1 HOH A 71 9.759 9.718 10.528 1.00 0.00 H \n+HETATM 353 H2 HOH A 71 8.591 9.311 9.655 1.00 0.00 H \n+HETATM 354 DOH2 HOH A 71 9.543 9.699 9.542 1.00 0.00 EP \n+HETATM 355 OM HOH A 71 9.352 9.609 9.810 1.00 0.00 EP \n+HETATM 356 O HOH A 72 8.955 23.235 5.100 1.00 0.00 O \n+HETATM 357 H1 HOH A 72 9.325 22.677 5.785 1.00 0.00 H \n+HETATM 358 H2 HOH A 72 9.581 23.175 4.378 1.00 0.00 H \n+HETATM 359 DOH2 HOH A 72 8.856 23.255 5.091 1.00 0.00 EP \n+HETATM 360 OM HOH A 72 9.159 23.108 5.093 1.00 0.00 EP \n+HETATM 361 O HOH A 73 12.020 1.995 6.466 1.00 0.00 O \n+HETATM 362 H1 HOH A 73 12.146 1.892 7.409 1.00 0.00 H \n+HETATM 363 H2 HOH A 73 12.338 1.174 6.090 1.00 0.00 H \n+HETATM 364 DOH2 HOH A 73 11.983 2.065 6.422 1.00 0.00 EP \n+HETATM 365 OM HOH A 73 12.111 1.806 6.582 1.00 0.00 EP \n+HETATM 366 O HOH A 74 2.020 9.965 15.690 1.00 0.00 O \n+HETATM 367 H1 HOH A 74 1.188 10.146 15.253 1.00 0.00 H \n+HETATM 368 H2 HOH A 74 1.775 9.495 16.487 1.00 0.00 H \n+HETATM 369 DOH2 HOH A 74 2.109 9.965 15.622 1.00 0.00 EP \n+HETATM 370 OM HOH A 74 1.799 9.906 15.764 1.00 0.00 EP \n+HETATM 371 O HOH A 75 4.340 5.187 18.681 1.00 0.00 O \n+HETATM 372 H1 HOH A 75 5.011 4.642 18.270 1.00 0.00 H \n+HETATM 373 H2 HOH A 75 3.511 4.806 18.390 1.00 0.00 H \n+HETATM 374 DOH2 HOH A 75 4.359 5.285 18.746 1.00 0.00 EP \n+HETATM 375 OM HOH A 75 4.308 4.997 18.537 1.00 0.00 EP \n+HETATM 376 O HOH A 76 7.088 5.415 10.508 1.00 0.00 O \n+HETATM 377 H1 HOH A 76 6.626 5.896 9.822 1.00 0.00 H \n+HETATM 378 H2 HOH A 76 7.702 4.853 10.036 1.00 0.00 H \n+HETATM 379 DOH2 HOH A 76 7.061 5.427 10.625 1.00 0.00 EP \n+HETATM 380 OM HOH A 76 7.119 5.398 10.271 1.00 0.00 EP \n+HETATM 381 O HOH A 77 4.584 4.024 7.616 1.00 0.00 O \n+HETATM 382 H1 HOH A 77 4.141 3.377 8.164 1.00 0.00 H \n+HETATM 383 H2 HOH A 77 5.366 3.574 7.297 1.00 0.00 H \n+HETATM 384 DOH2 HOH A 77 4.572 4.067 7.594 1.00 0.00 EP \n+HETATM 385 OM HOH A 77 4.654 3.799 7.663 1.00 0.00 EP \n+HETATM 386 O HOH A 78 17.735 11.525 11.409 1.00 0.00 O \n+HETATM 387 H1 HOH A 78 18.424 11.441 10.749 1.00 0.00 H \n+HETATM 388 H2 HOH A 78 16.959 11.146 10.996 1.00 0.00 H \n+HETATM 389 DOH2 HOH A 78 17.745 11.585 11.488 1.00 0.00 EP \n+HETATM 390 OM HOH A 78 17.717 11.430 11.189 1.00 0.00 EP \n+HETATM 391 O HOH A 79 11.870 3.193 2.712 1.00 0.00 O \n+HETATM 392 H1 HOH A 79 12.016 3.810 1.995 1.00 0.00 H \n+HETATM 393 H2 HOH A 79 12.272 3.611 3.474 1.00 0.00 H \n+HETATM 394 DOH2 HOH A 79 11.834 3.079 2.701 1.00 0.00 EP \n+HETATM 395 OM HOH A 79 11.982 3.405 2.722 1.00 0.00 EP \n+HETATM 396 O HOH A 80 23.186 18.936 26.039 1.00 0.00 O \n+HETATM 397 H1 HOH A 80 22.486 19.242 26.615 1.00 0.00 H \n+HETATM 398 H2 HOH A 80 23.881 19.586 26.138 1.00 0.00 H \n+HETATM 399 DOH2 HOH A 80 23.194 18.850 25.981 1.00 0.00 EP \n+HETATM 400 OM HOH A 80 23.185 19.132 26.177 1.00 0.00 EP \n+HETATM 401 O HOH A 81 3.891 9.747 19.014 1.00 0.00 O \n+HETATM 402 H1 HOH A 81 4.504 9.064 18.742 1.00 0.00 H \n+HETATM 403 H2 HOH A 81 4.295 10.563 18.721 1.00 0.00 H \n+HETATM 404 DOH2 HOH A 81 3.843 9.729 19.059 1.00 0.00 EP \n+HETATM 405 OM HOH A 81 4.100 9.774 18.898 1.00 0.00 EP \n+HETATM 406 O HOH A 82 13.659 10.211 2.971 1.00 0.00 O \n+HETATM 407 H1 HOH A 82 13.804 9.338 2.607 1.00 0.00 H \n+HETATM 408 H2 HOH A 82 14.538 10.544 3.153 1.00 0.00 H \n+HETATM 409 DOH2 HOH A 82 13.588 10.259 2.982 1.00 0.00 EP \n+HETATM 410 OM HOH A 82 13.869 10.100 2.934 1.00 0.00 EP \n+HETATM 411 O HOH A 83 10.799 11.912 0.807 1.00 0.00 O \n+HETATM 412 H1 HOH A 83 11.279 12.434 0.165 1.00 0.00 H \n+HETATM 413 H2 HOH A 83 11.151 12.187 1.654 1.00 0.00 H \n+HETATM 414 DOH2 HOH A 83 10.748 11.844 0.769 1.00 0.00 EP \n+HETATM 415 OM HOH A 83 10.970 12.075 0.849 1.00 0.00 EP \n+HETATM 416 O HOH A 84 6.128 29.204 7.425 1.00 0.00 O \n+HETATM 417 H1 HOH A 84 5.705 29.760 8.080 1.00 0.00 H \n+HETATM 418 H2 HOH A 84 6.929 29.674 7.193 1.00 0.00 H \n+HETATM 419 DOH2 HOH A 84 6.089 29.124 7.411 1.00 0.00 EP \n+HETATM 420 OM HOH A 84 6.205 29.415 7.512 1.00 0.00 EP \n+HETATM 421 O HOH A 85 15.791 5.654 9.690 1.00 0.00 O \n+HETATM 422 H1 HOH A 85 15.817 5.545 10.641 1.00 0.00 H \n+HETATM 423 H2 HOH A 85 16.680 5.918 9.454 1.00 0.00 H \n+HETATM 424 DOH2 HOH A 85 15.710 5.683 9.623 1.00 0.00 EP \n+HETATM 425 OM HOH A 85 15.979 5.686 9.837 1.00 0.00 EP \n+HETATM 426 O HOH A 86 15.688 20.338 9.990 1.00 0.00 O \n+HETATM 427 H1 HOH A 86 15.612 20.192 9.047 1.00 0.00 H \n+HETATM 428 H2 HOH A 86 14.990 19.806 10.372 1.00 0.00 H \n+HETATM 429 DOH2 HOH A 86 15.725 20.403 10.020 1.00 0.00 EP \n+HETATM 430 OM HOH A 86 15.529 20.199 9.875 1.00 0.00 EP \n+HETATM 431 O HOH A 87 18.551 19.888 13.634 1.00 0.00 O \n+HETATM 432 H1 HOH A 87 19.410 19.885 14.055 1.00 0.00 H \n+HETATM 433 H2 HOH A 87 18.735 20.069 12.712 1.00 0.00 H \n+HETATM 434 DOH2 HOH A 87 18.439 19.884 13.658 1.00 0.00 EP \n+HETATM 435 OM HOH A 87 18.765 19.924 13.531 1.00 0.00 EP \n+HETATM 436 O HOH A 88 7.010 15.006 14.501 1.00 0.00 O \n+HETATM 437 H1 HOH A 88 6.393 14.746 15.185 1.00 0.00 H \n+HETATM 438 H2 HOH A 88 7.166 14.205 14.001 1.00 0.00 H \n+HETATM 439 DOH2 HOH A 88 7.073 15.082 14.507 1.00 0.00 EP \n+HETATM 440 OM HOH A 88 6.916 14.789 14.539 1.00 0.00 EP \n+HETATM 441 O HOH A 89 22.098 11.812 9.097 1.00 0.00 O \n+HETATM 442 H1 HOH A 89 22.090 12.745 8.883 1.00 0.00 H \n+HETATM 443 H2 HOH A 89 22.841 11.460 8.606 1.00 0.00 H \n+HETATM 444 DOH2 HOH A 89 22.024 11.784 9.170 1.00 0.00 EP \n+HETATM 445 OM HOH A 89 22.249 11.931 8.952 1.00 0.00 EP \n+HETATM 446 O HOH A 90 0.850 2.387 12.933 1.00 0.00 O \n+HETATM 447 H1 HOH A 90 1.099 1.627 12.407 1.00 0.00 H \n+HETATM 448 H2 HOH A 90 1.271 3.128 12.497 1.00 0.00 H \n+HETATM 449 DOH2 HOH A 90 0.811 2.368 12.998 1.00 0.00 EP \n+HETATM 450 OM HOH A 90 0.987 2.383 12.736 1.00 0.00 EP \n+HETATM 451 O HOH A 91 9.160 13.036 20.545 1.00 0.00 O \n+HETATM 452 H1 HOH A 91 9.521 12.152 20.615 1.00 0.00 H \n+HETATM 453 H2 HOH A 91 9.489 13.363 19.707 1.00 0.00 H \n+HETATM 454 DOH2 HOH A 91 9.114 13.072 20.581 1.00 0.00 EP \n+HETATM 455 OM HOH A 91 9.302 12.922 20.387 1.00 0.00 EP \n+HETATM 456 O HOH A 92 6.076 10.457 28.499 1.00 0.00 O \n+HETATM 457 H1 HOH A 92 6.912 10.837 28.768 1.00 0.00 H \n+HETATM 458 H2 HOH A 92 5.562 10.412 29.305 1.00 0.00 H \n+HETATM 459 DOH2 HOH A 92 6.049 10.416 28.387 1.00 0.00 EP \n+HETATM 460 OM HOH A 92 6.142 10.526 28.719 1.00 0.00 EP \n+HETATM 461 O HOH A 93 12.473 13.552 14.392 1.00 0.00 O \n+HETATM 462 H1 HOH A 93 12.076 13.209 13.591 1.00 0.00 H \n+HETATM 463 H2 HOH A 93 12.900 12.794 14.791 1.00 0.00 H \n+HETATM 464 DOH2 HOH A 93 12.489 13.635 14.413 1.00 0.00 EP \n+HETATM 465 OM HOH A 93 12.479 13.326 14.310 1.00 0.00 EP \n+HETATM 466 O HOH A 94 10.090 8.984 2.580 1.00 0.00 O \n+HETATM 467 H1 HOH A 94 10.621 8.924 1.786 1.00 0.00 H \n+HETATM 468 H2 HOH A 94 10.639 9.464 3.200 1.00 0.00 H \n+HETATM 469 DOH2 HOH A 94 10.013 8.966 2.606 1.00 0.00 EP \n+HETATM 470 OM HOH A 94 10.311 9.070 2.544 1.00 0.00 EP \n+HETATM 471 O HOH A 95 5.017 15.587 23.383 1.00 0.00 O \n+HETATM 472 H1 HOH A 95 4.559 16.182 22.790 1.00 0.00 H \n+HETATM 473 H2 HOH A 95 5.427 16.161 24.030 1.00 0.00 H \n+HETATM 474 DOH2 HOH A 95 5.027 15.498 23.380 1.00 0.00 EP \n+HETATM 475 OM HOH A 95 5.007 15.827 23.394 1.00 0.00 EP \n+HETATM 476 O HOH A 96 3.398 15.895 14.479 1.00 0.00 O \n+HETATM 477 H1 HOH A 96 4.056 16.487 14.842 1.00 0.00 H \n+HETATM 478 H2 HOH A 96 2.647 15.980 15.066 1.00 0.00 H \n+HETATM 479 DOH2 HOH A 96 3.417 15.857 14.412 1.00 0.00 EP \n+HETATM 480 OM HOH A 96 3.379 16.034 14.674 1.00 0.00 EP \n+HETATM 481 O HOH A 97 9.976 1.565 8.983 1.00 0.00 O \n+HETATM 482 H1 HOH A 97 10.904 1.477 9.200 1.00 0.00 H \n+HETATM 483 H2 HOH A 97 9.535 0.939 9.557 1.00 0.00 H \n+HETATM 484 DOH2 HOH A 97 9.905 1.599 8.915 1.00 0.00 EP \n+HETATM 485 OM HOH A 97 10.076 1.419 9.145 1.00 0.00 EP \n+HETATM 486 O HOH A 98 13.057 9.667 7.329 1.00 0.00 O \n+HETATM 487 H1 HOH A 98 13.775 9.153 6.958 1.00 0.00 H \n+HETATM 488 H2 HOH A 98 12.718 9.126 8.042 1.00 0.00 H \n+HETATM 489 DOH2 HOH A 98 13.020 9.766 7.313 1.00 0.00 EP \n+HETATM 490 OM HOH A 98 13.135 9.451 7.399 1.00 0.00 EP \n+HETATM 491 O HOH A 99 20.195 14.624 11.125 1.00 0.00 O \n+HETATM 492 H1 HOH A 99 20.157 15.210 11.880 1.00 0.00 H \n+HETATM 493 H2 HOH A 99 19.278 14.466 10.898 1.00 0.00 H \n+HETATM 494 DOH2 HOH A 99 20.270 14.572 11.095 1.00 0.00 EP \n+HETATM 495 OM HOH A 99 19.999 14.712 11.233 1.00 0.00 EP \n+HETATM 496 O HOH A 100 18.093 10.567 27.227 1.00 0.00 O \n+HETATM 497 H1 HOH A 100 18.115 10.237 26.328 1.00 0.00 H \n+HETATM 498 H2 HOH A 100 18.989 10.858 27.398 1.00 0.00 H \n+HETATM 499 DOH2 HOH A 100 18.005 10.579 27.311 1.00 0.00 EP \n+HETATM 500 OM HOH A 100 18.281 10.559 27.078 1.00 0.00 EP \n+HETATM 501 O HOH A 101 5.414 11.986 18.191 1.00 0.00 O \n+HETATM 502 H1 HOH A 101 5.835 11.345 17.618 1.00 0.00 H \n+HETATM 503 H2 HOH A 101 5.302 12.762 17.643 1.00 0.00 H \n+HETATM 504 DOH2 HOH A 101 5.397 11.960 18.269 1.00 0.00 EP \n+HETATM 505 OM HOH A 101 5.477 12.013 17.961 1.00 0.00 EP \n+HETATM 506 O HOH A 102 3.980 6.371 21.160 1.00 0.00 O \n+HETATM 507 H1 HOH A 102 4.138 5.933 20.323 1.00 0.00 H \n+HETATM 508 H2 HOH A 102 4.141 7.297 20.980 1.00 0.00 H \n+HETATM 509 DOH2 HOH A 102 3.969 6.351 21.255 1.00 0.00 EP \n+HETATM 510 OM HOH A 102 4.045 6.471 20.951 1.00 0.00 EP \n+HETATM 511 O HOH A 103 16.953 9.063 20.784 1.00 0.00 O \n+HETATM 512 H1 HOH A 103 16.161 8.865 20.284 1.00 0.00 H \n+HETATM 513 H2 HOH A 103 16.740 8.806 21.681 1.00 0.00 H \n+HETATM 514 DOH2 HOH A 103 17.048 9.124 20.758 1.00 0.00 EP \n+HETATM 515 OM HOH A 103 16.747 8.970 20.865 1.00 0.00 EP \n+HETATM 516 O HOH A 104 17.022 1.186 17.073 1.00 0.00 O \n+HETATM 517 H1 HOH A 104 16.985 1.978 17.609 1.00 0.00 H \n+HETATM 518 H2 HOH A 104 16.375 0.600 17.468 1.00 0.00 H \n+HETATM 519 DOH2 HOH A 104 17.094 1.161 17.005 1.00 0.00 EP \n+HETATM 520 OM HOH A 104 16.882 1.228 17.264 1.00 0.00 EP \n+HETATM 521 O HOH A 105 4.776 25.062 12.747 1.00 0.00 O \n+HETATM 522 H1 HOH A 105 5.635 25.361 13.046 1.00 0.00 H \n+HETATM 523 H2 HOH A 105 4.241 25.855 12.721 1.00 0.00 H \n+HETATM 524 DOH2 HOH A 105 4.737 24.972 12.704 1.00 0.00 EP \n+HETATM 525 OM HOH A 105 4.843 25.286 12.803 1.00 0.00 EP \n+HETATM 526 O HOH A 106 5.384 14.606 11.412 1.00 0.00 O \n+HETATM 527 H1 HOH A 106 4.611 15.169 11.373 1.00 0.00 H \n+HETATM 528 H2 HOH A 106 5.226 14.033 12.162 1.00 0.00 H \n+HETATM 529 DOH2 HOH A 106 5.471 14.601 11.328 1.00 0.00 EP \n+HETATM 530 OM HOH A 106 5.193 14.604 11.558 1.00 0.00 EP \n+HETATM 531 O HOH A 107 13.901 16.116 8.034 1.00 0.00 O \n+HETATM 532 H1 HOH A 107 14.015 15.758 7.153 1.00 0.00 H \n+HETATM 533 H2 HOH A 107 13.305 16.855 7.916 1.00 0.00 H \n+HETATM 534 DOH2 HOH A 107 13.945 16.072 8.124 1.00 0.00 EP \n+HETATM 535 OM HOH A 107 13.802 16.194 7.829 1.00 0.00 EP \n+HETATM 536 O HOH A 108 8.706 4.049 8.741 1.00 0.00 O \n+HETATM 537 H1 HOH A 108 9.189 4.588 8.114 1.00 0.00 H \n+HETATM 538 H2 HOH A 108 9.220 3.245 8.812 1.00 0.00 H \n+HETATM 539 DOH2 HOH A 108 8.622 4.059 8.757 1.00 0.00 EP \n+HETATM 540 OM HOH A 108 8.911 3.994 8.627 1.00 0.00 EP \n+HETATM 541 O HOH A 109 9.714 30.093 18.826 1.00 0.00 O \n+HETATM 542 H1 HOH A 109 9.929 29.280 18.370 1.00 0.00 H \n+HETATM 543 H2 HOH A 109 10.478 30.653 18.691 1.00 0.00 H \n+HETATM 544 DOH2 HOH A 109 9.637 30.129 18.886 1.00 0.00 EP \n+HETATM 545 OM HOH A 109 9.915 30.041 18.705 1.00 0.00 EP \n+HETATM 546 O HOH A 110 6.094 25.775 16.074 1.00 0.00 O \n+HETATM 547 H1 HOH A 110 5.181 26.057 16.030 1.00 0.00 H \n+HETATM 548 H2 HOH A 110 6.435 25.926 15.193 1.00 0.00 H \n+HETATM 549 DOH2 HOH A 110 6.139 25.744 16.140 1.00 0.00 EP \n+HETATM 550 OM HOH A 110 5.977 25.864 15.884 1.00 0.00 EP \n+HETATM 551 O HOH A 111 3.645 7.865 6.388 1.00 0.00 O \n+HETATM 552 H1 HOH A 111 3.493 7.990 7.324 1.00 0.00 H \n+HETATM 553 H2 HOH A 111 4.203 8.600 6.134 1.00 0.00 H \n+HETATM 554 DOH2 HOH A 111 3.590 7.806 6.330 1.00 0.00 EP \n+HETATM 555 OM HOH A 111 3.728 8.041 6.528 1.00 0.00 EP \n+HETATM 556 O HOH A 112 20.506 8.204 17.806 1.00 0.00 O \n+HETATM 557 H1 HOH A 112 20.255 8.527 18.671 1.00 0.00 H \n+HETATM 558 H2 HOH A 112 20.759 8.989 17.320 1.00 0.00 H \n+HETATM 559 DOH2 HOH A 112 20.498 8.136 17.757 1.00 0.00 EP \n+HETATM 560 OM HOH A 112 20.506 8.431 17.884 1.00 0.00 EP \n+HETATM 561 O HOH A 113 3.672 29.122 14.499 1.00 0.00 O \n+HETATM 562 H1 HOH A 113 3.584 28.619 13.689 1.00 0.00 H \n+HETATM 563 H2 HOH A 113 4.315 29.801 14.290 1.00 0.00 H \n+HETATM 564 DOH2 HOH A 113 3.625 29.090 14.580 1.00 0.00 EP \n+HETATM 565 OM HOH A 113 3.786 29.158 14.290 1.00 0.00 EP \n+HETATM 566 O HOH A 114 7.448 15.768 0.591 1.00 0.00 O \n+HETATM 567 H1 HOH A 114 7.501 14.968 1.114 1.00 0.00 H \n+HETATM 568 H2 HOH A 114 8.360 16.023 0.450 1.00 0.00 H \n+HETATM 569 DOH2 HOH A 114 7.381 15.795 0.578 1.00 0.00 EP \n+HETATM 570 OM HOH A 114 7.646 15.656 0.670 1.00 0.00 EP \n+HETATM 571 O HOH A 115 9.651 2.998 5.403 1.00 0.00 O \n+HETATM 572 H1 HOH A 115 10.440 2.637 5.807 1.00 0.00 H \n+HETATM 573 H2 HOH A 115 9.580 2.542 4.564 1.00 0.00 H \n+HETATM 574 DOH2 HOH A 115 9.592 3.073 5.452 1.00 0.00 EP \n+HETATM 575 OM HOH A 115 9.798 2.830 5.314 1.00 0.00 EP \n+HETATM 576 O HOH A 116 9.054 16.080 15.954 1.00 0.00 O \n+HETATM 577 H1 HOH A 116 9.217 15.450 16.655 1.00 0.00 H \n+HETATM 578 H2 HOH A 116 8.376 15.671 15.416 1.00 0.00 H \n+HETATM 579 DOH2 HOH A 116 9.095 16.170 15.968 1.00 0.00 EP \n+HETATM 580 OM HOH A 116 8.949 15.867 15.987 1.00 0.00 EP \n+HETATM 581 O HOH A 117 24.437 10.980 22.981 1.00 0.00 O \n+HETATM 582 H1 HOH A 117 24.382 10.275 23.627 1.00 0.00 H \n+HETATM 583 H2 HOH A 117 23.564 11.017 22.591 1.00 0.00 H \n+HETATM 584 DOH2 HOH A 117 24.515 11.016 22.950 1.00 0.00 EP \n+HETATM 585 OM HOH A 117 24.246 10.843 23.033 1.00 0.00 EP \n+HETATM 586 O HOH A 118 12.748 6.818 20.573 1.00 0.00 O \n+HETATM 587 H1 HOH A 118 13.356 7.450 20.188 1.00 0.00 H \n+HETATM 588 H2 HOH A 118 12.713 7.054 21.500 1.00 0.00 H \n+HETATM 589 DOH2 HOH A 118 12.662 6.757 20.522 1.00 0.00 EP \n+HETATM 590 OM HOH A 118 12.866 6.996 20.684 1.00 0.00 EP \n+HETATM 591 O HOH A 119 13.869 9.633 28.368 1.00 0.00 O \n+HETATM 592 H1 HOH A 119 14.467 8.886 28.365 1.00 0.00 H \n+HETATM 593 H2 HOH A 119 14.440 10.399 28.307 1.00 0.00 H \n+HETATM 594 DOH2 HOH A 119 13.780 9.616 28.374 1.00 0.00 EP \n+HETATM 595 OM HOH A 119 14.109 9.637 28.355 1.00 0.00 EP \n+HETATM 596 O HOH A 120 15.774 7.059 27.984 1.00 0.00 O \n+HETATM 597 H1 HOH A 120 15.947 6.929 28.917 1.00 0.00 H \n+HETATM 598 H2 HOH A 120 15.493 6.200 27.670 1.00 0.00 H \n+HETATM 599 DOH2 HOH A 120 15.779 7.123 27.901 1.00 0.00 EP \n+HETATM 600 OM HOH A 120 15.752 6.856 28.111 1.00 0.00 EP \n+HETATM 601 O HOH A 121 19.531 16.626 7.088 1.00 0.00 O \n+HETATM 602 H1 HOH A 121 19.355 17.389 6.537 1.00 0.00 H \n+HETATM 603 H2 HOH A 121 19.102 16.826 7.919 1.00 0.00 H \n+HETATM 604 DOH2 HOH A 121 19.570 16.569 7.088 1.00 0.00 EP \n+HETATM 605 OM HOH A 121 19.407 16.824 7.145 1.00 0.00 EP \n+HETATM 606 O HOH A 122 24.586 15.263 9.125 1.00 0.00 O \n+HETATM 607 H1 HOH A 122 24.995 14.759 9.829 1.00 0.00 H \n+HETATM 608 H2 HOH A 122 24.953 14.893 8.321 1.00 0.00 H \n+HETATM 609 DOH2 HOH A 122 24.519 15.337 9.137 1.00 0.00 EP \n+HETATM 610 OM HOH A 122 24.745 15.084 9.104 1.00 0.00 EP \n+HETATM 611 O HOH A 123 5.786 10.753 12.494 1.00 0.00 O \n+HETATM 612 H1 HOH A 123 5.316 10.872 13.319 1.00 0.00 H \n+HETATM 613 H2 HOH A 123 6.470 11.422 12.509 1.00 0.00 H \n+HETATM 614 DOH2 HOH A 123 5.755 10.687 12.440 1.00 0.00 EP \n+HETATM 615 OM HOH A 123 5.830 10.915 12.666 1.00 0.00 EP \n+HETATM 616 O HOH A 124 28.262 1.983 13.972 1.00 0.00 O \n+HETATM 617 H1 HOH A 124 28.412 2.099 14.910 1.00 0.00 H \n+HETATM 618 H2 HOH A 124 29.100 2.203 13.566 1.00 0.00 H \n+HETATM 619 DOH2 HOH A 124 28.170 1.927 13.921 1.00 0.00 EP \n+HETATM 620 OM HOH A 124 28.465 2.052 14.081 1.00 0.00 EP \n+HETATM 621 O HOH A 125 15.102 7.776 13.355 1.00 0.00 O \n+HETATM 622 H1 HOH A 125 15.415 6.957 12.971 1.00 0.00 H \n+HETATM 623 H2 HOH A 125 15.896 8.222 13.649 1.00 0.00 H \n+HETATM 624 DOH2 HOH A 125 15.009 7.776 13.378 1.00 0.00 EP \n+HETATM 625 OM HOH A 125 15.329 7.700 13.336 1.00 0.00 EP \n+HETATM 626 O HOH A 126 14.157 26.732 11.008 1.00 0.00 O \n+HETATM 627 H1 HOH A 126 13.855 25.924 11.422 1.00 0.00 H \n+HETATM 628 H2 HOH A 126 13.373 27.103 10.604 1.00 0.00 H \n+HETATM 629 DOH2 HOH A 126 14.215 26.739 10.969 1.00 0.00 EP \n+HETATM 630 OM HOH A 126 13.934 26.643 11.010 1.00 0.00 EP \n+HETATM 631 O HOH A 127 0.992 17.796 29.157 1.00 0.00 O \n+HETATM 632 H1 HOH A 127 1.481 17.937 29.967 1.00 0.00 H \n+HETATM 633 H2 HOH A 127 1.551 17.219 28.637 1.00 0.00 H \n+HETATM 634 DOH2 HOH A 127 0.882 17.825 29.135 1.00 0.00 EP \n+HETATM 635 OM HOH A 127 1.207 17.707 29.216 1.00 0.00 EP \n+HETATM 636 O HOH A 128 2.491 13.100 11.767 1.00 0.00 O \n+HETATM 637 H1 HOH A 128 3.153 13.090 12.459 1.00 0.00 H \n+HETATM 638 H2 HOH A 128 2.465 14.011 11.473 1.00 0.00 H \n+HETATM 639 DOH2 HOH A 128 2.443 13.028 11.741 1.00 0.00 EP \n+HETATM 640 OM HOH A 128 2.621 13.285 11.848 1.00 0.00 EP \n+HETATM 641 O HOH A 129 3.766 10.890 10.489 1.00 0.00 O \n+HETATM 642 H1 HOH A 129 3.235 11.600 10.848 1.00 0.00 H \n+HETATM 643 H2 HOH A 129 4.477 10.779 11.120 1.00 0.00 H \n+HETATM 644 DOH2 HOH A 129 3.755 10.848 10.394 1.00 0.00 EP \n+HETATM 645 OM HOH A 129 3.803 11.013 10.692 1.00 0.00 EP \n+HETATM 646 O HOH A 130 2.844 2.343 9.212 1.00 0.00 O \n+HETATM 647 H1 HOH A 130 2.168 3.020 9.200 1.00 0.00 H \n+HETATM 648 H2 HOH A 130 2.358 1.518 9.226 1.00 0.00 H \n+HETATM 649 DOH2 HOH A 130 2.960 2.340 9.199 1.00 0.00 EP \n+HETATM 650 OM HOH A 130 2.606 2.312 9.213 1.00 0.00 EP \n+HETATM 651 O HOH A 131 2.998 15.945 11.675 1.00 0.00 O \n+HETATM 652 H1 HOH A 131 3.071 16.005 12.628 1.00 0.00 H \n+HETATM 653 H2 HOH A 131 3.021 16.854 11.376 1.00 0.00 H \n+HETATM 654 DOH2 HOH A 131 3.031 15.872 11.638 1.00 0.00 EP \n+HETATM 655 OM HOH A 131 3.018 16.144 11.809 1.00 0.00 EP \n+HETATM 656 O HOH A 132 12.528 14.417 17.232 1.00 0.00 O \n+HETATM 657 H1 HOH A 132 12.365 14.183 16.318 1.00 0.00 H \n+HETATM 658 H2 HOH A 132 13.462 14.621 17.265 1.00 0.00 H \n+HETATM 659 DOH2 HOH A 132 12.458 14.390 17.292 1.00 0.00 EP \n+HETATM 660 OM HOH A 132 12.686 14.411 17.051 1.00 0.00 EP \n+HETATM 661 O HOH A 133 15.754 11.789 28.050 1.00 0.00 O \n+HETATM 662 H1 HOH A 133 16.489 11.307 27.672 1.00 0.00 H \n+HETATM 663 H2 HOH A 133 16.109 12.656 28.245 1.00 0.00 H \n+HETATM 664 DOH2 HOH A 133 15.644 11.775 28.036 1.00 0.00 EP \n+HETATM 665 OM HOH A 133 15.977 11.868 28.012 1.00 0.00 EP \n+HETATM 666 O HOH A 134 10.015 15.107 3.745 1.00 0.00 O \n+HETATM 667 H1 HOH A 134 10.448 15.305 4.575 1.00 0.00 H \n+HETATM 668 H2 HOH A 134 10.089 15.915 3.236 1.00 0.00 H \n+HETATM 669 DOH2 HOH A 134 9.944 15.052 3.743 1.00 0.00 EP \n+HETATM 670 OM HOH A 134 10.119 15.313 3.811 1.00 0.00 EP \n+HETATM 671 O HOH A 135 7.098 17.596 17.377 1.00 0.00 O \n+HETATM 672 H1 HOH A 135 6.961 16.807 17.901 1.00 0.00 H \n+HETATM 673 H2 HOH A 135 7.789 17.357 16.759 1.00 0.00 H \n+HETATM 674 DOH2 HOH A 135 7.084 17.667 17.393 1.00 0.00 EP \n+HETATM 675 OM HOH A 135 7.212 17.385 17.358 1.00 0.00 EP \n+HETATM 676 O HOH A 136 8.395 1.118 14.016 1.00 0.00 O \n+HETATM 677 H1 HOH A 136 8.620 1.841 13.431 1.00 0.00 H \n+HETATM 678 H2 HOH A 136 9.018 1.192 14.739 1.00 0.00 H \n+HETATM 679 DOH2 HOH A 136 8.321 1.058 14.004 1.00 0.00 EP \n+HETATM 680 OM HOH A 136 8.569 1.281 14.044 1.00 0.00 EP \n+HETATM 681 O HOH A 137 12.586 24.409 3.529 1.00 0.00 O \n+HETATM 682 H1 HOH A 137 11.965 23.719 3.296 1.00 0.00 H \n+HETATM 683 H2 HOH A 137 13.445 24.033 3.336 1.00 0.00 H \n+HETATM 684 DOH2 HOH A 137 12.579 24.486 3.548 1.00 0.00 EP \n+HETATM 685 OM HOH A 137 12.635 24.190 3.442 1.00 0.00 EP \n+HETATM 686 O HOH A 138 3.931 28.350 6.037 1.00 0.00 O \n+HETATM 687 H1 HOH A 138 3.811 29.055 5.401 1.00 0.00 H \n+HETATM 688 H2 HOH A 138 4.698 28.613 6.546 1.00 0.00 H \n+HETATM 689 DOH2 HOH A 138 3.890 28.276 6.042 1.00 0.00 EP \n+HETATM 690 OM HOH A 138 4.064 28.549 6.011 1.00 0.00 EP \n+HETATM 691 O HOH A 139 1.298 22.091 17.342 1.00 0.00 O \n+HETATM 692 H1 HOH A 139 2.143 22.201 16.907 1.00 0.00 H \n+HETATM 693 H2 HOH A 139 1.192 22.885 17.865 1.00 0.00 H \n+HETATM 694 DOH2 HOH A 139 1.235 22.038 17.313 1.00 0.00 EP \n+HETATM 695 OM HOH A 139 1.450 22.276 17.360 1.00 0.00 EP \n+HETATM 696 O HOH A 140 19.198 9.368 6.835 1.00 0.00 O \n+HETATM 697 H1 HOH A 140 20.115 9.593 6.678 1.00 0.00 H \n+HETATM 698 H2 HOH A 140 19.164 8.417 6.736 1.00 0.00 H \n+HETATM 699 DOH2 HOH A 140 19.113 9.424 6.814 1.00 0.00 EP \n+HETATM 700 OM HOH A 140 19.379 9.219 6.783 1.00 0.00 EP \n+HETATM 701 O HOH A 141 5.299 14.980 4.631 1.00 0.00 O \n+HETATM 702 H1 HOH A 141 6.190 14.635 4.570 1.00 0.00 H \n+HETATM 703 H2 HOH A 141 4.775 14.240 4.938 1.00 0.00 H \n+HETATM 704 DOH2 HOH A 141 5.260 15.018 4.577 1.00 0.00 EP \n+HETATM 705 OM HOH A 141 5.374 14.757 4.681 1.00 0.00 EP \n+HETATM 706 O HOH A 142 16.017 11.439 3.764 1.00 0.00 O \n+HETATM 707 H1 HOH A 142 16.869 11.119 4.062 1.00 0.00 H \n+HETATM 708 H2 HOH A 142 15.620 11.826 4.544 1.00 0.00 H \n+HETATM 709 DOH2 HOH A 142 15.971 11.437 3.668 1.00 0.00 EP \n+HETATM 710 OM HOH A 142 16.110 11.453 3.985 1.00 0.00 EP \n+HETATM 711 O HOH A 143 13.540 15.919 10.837 1.00 0.00 O \n+HETATM 712 H1 HOH A 143 12.601 15.770 10.950 1.00 0.00 H \n+HETATM 713 H2 HOH A 143 13.673 15.896 9.889 1.00 0.00 H \n+HETATM 714 DOH2 HOH A 143 13.578 15.947 10.884 1.00 0.00 EP \n+HETATM 715 OM HOH A 143 13.375 15.884 10.666 1.00 0.00 EP \n+HETATM 716 O HOH A 144 6.306 9.808 16.711 1.00 0.00 O \n+HETATM 717 H1 HOH A 144 7.252 9.662 16.706 1.00 0.00 H \n+HETATM 718 H2 HOH A 144 5.950 9.057 17.186 1.00 0.00 H \n+HETATM 719 DOH2 HOH A 144 6.244 9.893 16.688 1.00 0.00 EP \n+HETATM 720 OM HOH A 144 6.427 9.624 16.807 1.00 0.00 EP \n+HETATM 721 O HOH A 145 9.202 20.115 21.805 1.00 0.00 O \n+HETATM 722 H1 HOH A 145 9.825 19.408 21.638 1.00 0.00 H \n+HETATM 723 H2 HOH A 145 9.648 20.685 22.431 1.00 0.00 H \n+HETATM 724 DOH2 HOH A 145 9.141 20.119 21.761 1.00 0.00 EP \n+HETATM 725 OM HOH A 145 9.421 20.087 21.899 1.00 0.00 EP \n+HETATM 726 O HOH A 146 8.675 20.569 2.232 1.00 0.00 O \n+HETATM 727 H1 HOH A 146 8.836 19.975 2.966 1.00 0.00 H \n+HETATM 728 H2 HOH A 146 7.967 21.137 2.535 1.00 0.00 H \n+HETATM 729 DOH2 HOH A 146 8.713 20.569 2.188 1.00 0.00 EP \n+HETATM 730 OM HOH A 146 8.563 20.564 2.445 1.00 0.00 EP \n+HETATM 731 O HOH A 147 12.983 -0.359 5.347 1.00 0.00 O \n+HETATM 732 H1 HOH A 147 13.245 -0.994 6.014 1.00 0.00 H \n+HETATM 733 H2 HOH A 147 13.702 -0.363 4.715 1.00 0.00 H \n+HETATM 734 DOH2 HOH A 147 12.919 -0.313 5.353 1.00 0.00 EP \n+HETATM 735 OM HOH A 147 13.184 -0.490 5.354 1.00 0.00 EP \n+HETATM 736 O HOH A 148 8.564 17.388 9.529 1.00 0.00 O \n+HETATM 737 H1 HOH A 148 9.427 17.785 9.643 1.00 0.00 H \n+HETATM 738 H2 HOH A 148 7.962 17.994 9.962 1.00 0.00 H \n+HETATM 739 DOH2 HOH A 148 8.538 17.323 9.495 1.00 0.00 EP \n+HETATM 740 OM HOH A 148 8.618 17.594 9.641 1.00 0.00 EP \n+HETATM 741 O HOH A 149 11.779 9.372 0.272 1.00 0.00 O \n+HETATM 742 H1 HOH A 149 11.438 10.258 0.399 1.00 0.00 H \n+HETATM 743 H2 HOH A 149 12.508 9.480 -0.338 1.00 0.00 H \n+HETATM 744 DOH2 HOH A 149 11.733 9.290 0.304 1.00 0.00 EP \n+HETATM 745 OM HOH A 149 11.859 9.576 0.173 1.00 0.00 EP \n+HETATM 746 O HOH A 150 14.217 20.921 19.585 1.00 0.00 O \n+HETATM 747 H1 HOH A 150 13.545 20.591 20.182 1.00 0.00 H \n+HETATM 748 H2 HOH A 150 14.268 20.261 18.893 1.00 0.00 H \n+HETATM 749 DOH2 HOH A 150 14.291 20.966 19.621 1.00 0.00 EP \n+HETATM 750 OM HOH A 150 14.090 20.718 19.566 1.00 0.00 EP \n+HETATM 751 O HOH A 151 8.074 14.960 10.890 1.00 0.00 O \n+HETATM 752 H1 HOH A 151 7.133 14.917 11.059 1.00 0.00 H \n+HETATM 753 H2 HOH A 151 8.184 15.733 10.336 1.00 0.00 H \n+HETATM 754 DOH2 HOH A 151 8.144 14.913 10.932 1.00 0.00 EP \n+HETATM 755 OM HOH A 151 7.904 15.110 10.811 1.00 0.00 EP \n+HETATM 756 O HOH A 152 25.476 15.509 15.787 1.00 0.00 O \n+HETATM 757 H1 HOH A 152 26.243 15.704 15.249 1.00 0.00 H \n+HETATM 758 H2 HOH A 152 25.766 14.813 16.376 1.00 0.00 H \n+HETATM 759 DOH2 HOH A 152 25.410 15.549 15.755 1.00 0.00 EP \n+HETATM 760 OM HOH A 152 25.693 15.406 15.797 1.00 0.00 EP \n+HETATM 761 O HOH A 153 14.426 4.987 7.415 1.00 0.00 O \n+HETATM 762 H1 HOH A 153 14.845 4.157 7.187 1.00 0.00 H \n+HETATM 763 H2 HOH A 153 14.824 5.235 8.250 1.00 0.00 H \n+HETATM 764 DOH2 HOH A 153 14.354 5.018 7.376 1.00 0.00 EP \n+HETATM 765 OM HOH A 153 14.593 4.868 7.540 1.00 0.00 EP \n+HETATM 766 O HOH A 154 15.038 18.183 29.149 1.00 0.00 O \n+HETATM 767 H1 HOH A 154 14.950 19.087 28.846 1.00 0.00 H \n+HETATM 768 H2 HOH A 154 15.968 18.086 29.350 1.00 0.00 H \n+HETATM 769 DOH2 HOH A 154 14.958 18.100 29.095 1.00 0.00 EP \n+HETATM 770 OM HOH A 154 15.211 18.349 29.128 1.00 0.00 EP \n+HETATM 771 O HOH A 155 15.213 15.005 17.043 1.00 0.00 O \n+HETATM 772 H1 HOH A 155 15.096 15.773 16.484 1.00 0.00 H \n+HETATM 773 H2 HOH A 155 16.032 15.171 17.511 1.00 0.00 H \n+HETATM 774 DOH2 HOH A 155 15.141 14.930 17.039 1.00 0.00 EP \n+HETATM 775 OM HOH A 155 15.357 15.197 17.024 1.00 0.00 EP \n+HETATM 776 O HOH A 156 7.964 13.047 27.502 1.00 0.00 O \n+HETATM 777 H1 HOH A 156 8.030 12.496 28.282 1.00 0.00 H \n+HETATM 778 H2 HOH A 156 8.624 13.728 27.633 1.00 0.00 H \n+HETATM 779 DOH2 HOH A 156 7.889 13.048 27.407 1.00 0.00 EP \n+HETATM 780 OM HOH A 156 8.113 13.074 27.689 1.00 0.00 EP \n+HETATM 781 O HOH A 157 17.853 18.272 29.478 1.00 0.00 O \n+HETATM 782 H1 HOH A 157 18.427 17.543 29.243 1.00 0.00 H \n+HETATM 783 H2 HOH A 157 18.442 19.021 29.572 1.00 0.00 H \n+HETATM 784 DOH2 HOH A 157 17.765 18.247 29.526 1.00 0.00 EP \n+HETATM 785 OM HOH A 157 18.092 18.276 29.449 1.00 0.00 EP \n+HETATM 786 O HOH A 158 27.641 13.372 13.074 1.00 0.00 O \n+HETATM 787 H1 HOH A 158 27.287 12.727 13.687 1.00 0.00 H \n+HETATM 788 H2 HOH A 158 28.438 12.966 12.732 1.00 0.00 H \n+HETATM 789 DOH2 HOH A 158 27.591 13.447 13.068 1.00 0.00 EP \n+HETATM 790 OM HOH A 158 27.732 13.156 13.130 1.00 0.00 EP \n+HETATM 791 O HOH A 159 19.444 11.248 9.390 1.00 0.00 O \n+HETATM 792 H1 HOH A 159 20.376 11.430 9.266 1.00 0.00 H \n+HETATM 793 H2 HOH A 159 19.005 11.793 8.737 1.00 0.00 H \n+HETATM 794 DOH2 HOH A 159 19.385 11.207 9.480 1.00 0.00 EP \n+HETATM 795 OM HOH A 159 19.545 11.397 9.231 1.00 0.00 EP \n+HETATM 796 O HOH A 160 13.592 12.208 8.381 1.00 0.00 O \n+HETATM 797 H1 HOH A 160 12.825 12.573 8.822 1.00 0.00 H \n+HETATM 798 H2 HOH A 160 13.352 11.301 8.190 1.00 0.00 H \n+HETATM 799 DOH2 HOH A 160 13.675 12.260 8.331 1.00 0.00 EP \n+HETATM 800 OM HOH A 160 13.386 12.097 8.432 1.00 0.00 EP \n+HETATM 801 O HOH A 161 5.077 0.808 9.343 1.00 0.00 O \n+HETATM 802 H1 HOH A 161 5.752 1.201 9.895 1.00 0.00 H \n+HETATM 803 H2 HOH A 161 4.361 1.443 9.349 1.00 0.00 H \n+HETATM 804 DOH2 HOH A 161 5.081 0.696 9.303 1.00 0.00 EP \n+HETATM 805 OM HOH A 161 5.068 1.019 9.457 1.00 0.00 EP \n+HETATM 806 O HOH A 162 3.670 15.575 7.690 1.00 0.00 O \n+HETATM 807 H1 HOH A 162 3.682 15.634 6.735 1.00 0.00 H \n+HETATM 808 H2 HOH A 162 2.761 15.369 7.906 1.00 0.00 H \n+HETATM 809 DOH2 HOH A 162 3.753 15.589 7.746 1.00 0.00 EP \n+HETATM 810 OM HOH A 162 3.486 15.545 7.539 1.00 0.00 EP \n+HETATM 811 O HOH A 163 13.658 10.884 14.951 1.00 0.00 O \n+HETATM 812 H1 HOH A 163 14.287 11.346 15.506 1.00 0.00 H \n+HETATM 813 H2 HOH A 163 14.027 10.943 14.070 1.00 0.00 H \n+HETATM 814 DOH2 HOH A 163 13.560 10.849 14.982 1.00 0.00 EP \n+HETATM 815 OM HOH A 163 13.863 10.991 14.884 1.00 0.00 EP \n+HETATM 816 O HOH A 164 29.262 6.782 14.858 1.00 0.00 O \n+HETATM 817 H1 HOH A 164 28.733 6.565 14.091 1.00 0.00 H \n+HETATM 818 H2 HOH A 164 28.813 7.528 15.256 1.00 0.00 H \n+HETATM 819 DOH2 HOH A 164 29.363 6.744 14.902 1.00 0.00 EP \n+HETATM 820 OM HOH A 164 29.061 6.891 14.782 1.00 0.00 EP \n+HETATM 821 O HOH A 165 6.413 12.358 20.805 1.00 0.00 O \n+HETATM 822 H1 HOH A 165 6.058 12.341 19.916 1.00 0.00 H \n+HETATM 823 H2 HOH A 165 7.326 12.624 20.693 1.00 0.00 H \n+HETATM 824 DOH2 HOH A 165 6.363 12.325 20.904 1.00 0.00 EP \n+HETATM 825 OM HOH A 165 6.527 12.409 20.600 1.00 0.00 EP \n+HETATM 826 O HOH A 166 2.272 2.500 15.438 1.00 0.00 O \n+HETATM 827 H1 HOH A 166 1.673 2.468 14.691 1.00 0.00 H \n+HETATM 828 H2 HOH A 166 2.922 3.160 15.197 1.00 0.00 H \n+HETATM 829 DOH2 HOH A 166 2.272 2.462 15.523 1.00 0.00 EP \n+HETATM 830 OM HOH A 166 2.282 2.629 15.235 1.00 0.00 EP \n+HETATM 831 O HOH A 167 20.477 0.945 14.392 1.00 0.00 O \n+HETATM 832 H1 HOH A 167 21.417 0.761 14.379 1.00 0.00 H \n+HETATM 833 H2 HOH A 167 20.419 1.879 14.593 1.00 0.00 H \n+HETATM 834 DOH2 HOH A 167 20.416 0.894 14.402 1.00 0.00 EP \n+HETATM 835 OM HOH A 167 20.658 1.099 14.431 1.00 0.00 EP \n+HETATM 836 O HOH A 168 12.867 17.670 3.522 1.00 0.00 O \n+HETATM 837 H1 HOH A 168 13.029 16.727 3.474 1.00 0.00 H \n+HETATM 838 H2 HOH A 168 13.736 18.066 3.461 1.00 0.00 H \n+HETATM 839 DOH2 HOH A 168 12.791 17.686 3.506 1.00 0.00 EP \n+HETATM 840 OM HOH A 168 13.079 17.558 3.500 1.00 0.00 EP \n+HETATM 841 O HOH A 169 11.581 13.344 9.885 1.00 0.00 O \n+HETATM 842 H1 HOH A 169 11.708 12.823 10.678 1.00 0.00 H \n+HETATM 843 H2 HOH A 169 11.347 14.215 10.204 1.00 0.00 H \n+HETATM 844 DOH2 HOH A 169 11.583 13.291 9.789 1.00 0.00 EP \n+HETATM 845 OM HOH A 169 11.559 13.416 10.113 1.00 0.00 EP \n+HETATM 846 O HOH A 170 5.041 17.230 1.013 1.00 0.00 O \n+HETATM 847 H1 HOH A 170 5.958 16.972 1.105 1.00 0.00 H \n+HETATM 848 H2 HOH A 170 4.799 16.946 0.131 1.00 0.00 H \n+HETATM 849 DOH2 HOH A 170 4.969 17.223 1.074 1.00 0.00 EP \n+HETATM 850 OM HOH A 170 5.179 17.119 0.851 1.00 0.00 EP \n+HETATM 851 O HOH A 171 6.916 1.846 11.123 1.00 0.00 O \n+HETATM 852 H1 HOH A 171 7.622 2.379 11.489 1.00 0.00 H \n+HETATM 853 H2 HOH A 171 6.115 2.237 11.473 1.00 0.00 H \n+HETATM 854 DOH2 HOH A 171 6.910 1.758 11.061 1.00 0.00 EP \n+HETATM 855 OM HOH A 171 6.896 2.035 11.270 1.00 0.00 EP \n+HETATM 856 O HOH A 172 14.685 8.121 9.684 1.00 0.00 O \n+HETATM 857 H1 HOH A 172 13.740 8.040 9.559 1.00 0.00 H \n+HETATM 858 H2 HOH A 172 15.006 7.219 9.678 1.00 0.00 H \n+HETATM 859 DOH2 HOH A 172 14.718 8.207 9.698 1.00 0.00 EP \n+HETATM 860 OM HOH A 172 14.557 7.919 9.657 1.00 0.00 EP \n+HETATM 861 O HOH A 173 13.659 16.378 20.282 1.00 0.00 O \n+HETATM 862 H1 HOH A 173 13.004 16.795 19.722 1.00 0.00 H \n+HETATM 863 H2 HOH A 173 14.496 16.721 19.968 1.00 0.00 H \n+HETATM 864 DOH2 HOH A 173 13.653 16.371 20.369 1.00 0.00 EP \n+HETATM 865 OM HOH A 173 13.696 16.534 20.103 1.00 0.00 EP \n+HETATM 866 O HOH A 174 17.830 13.918 14.832 1.00 0.00 O \n+HETATM 867 H1 HOH A 174 17.085 14.333 14.397 1.00 0.00 H \n+HETATM 868 H2 HOH A 174 18.297 14.642 15.251 1.00 0.00 H \n+HETATM 869 DOH2 HOH A 174 17.848 13.855 14.817 1.00 0.00 EP \n+HETATM 870 OM HOH A 174 17.773 14.152 14.829 1.00 0.00 EP \n+HETATM 871 O HOH A 175 17.727 4.563 -0.256 1.00 0.00 O \n+HETATM 872 H1 HOH A 175 17.274 5.381 -0.053 1.00 0.00 H \n+HETATM 873 H2 HOH A 175 17.314 3.913 0.313 1.00 0.00 H \n+HETATM 874 DOH2 HOH A 175 17.762 4.529 -0.324 1.00 0.00 EP \n+HETATM 875 OM HOH A 175 17.550 4.597 -0.098 1.00 0.00 EP \n+HETATM 876 O HOH A 176 6.262 11.656 3.923 1.00 0.00 O \n+HETATM 877 H1 HOH A 176 5.467 11.975 3.495 1.00 0.00 H \n+HETATM 878 H2 HOH A 176 6.763 12.448 4.120 1.00 0.00 H \n+HETATM 879 DOH2 HOH A 176 6.278 11.567 3.930 1.00 0.00 EP \n+HETATM 880 OM HOH A 176 6.202 11.884 3.875 1.00 0.00 EP \n+HETATM 881 O HOH A 177 20.085 12.557 17.341 1.00 0.00 O \n+HETATM 882 H1 HOH A 177 20.451 11.731 17.023 1.00 0.00 H \n+HETATM 883 H2 HOH A 177 20.595 13.233 16.894 1.00 0.00 H \n+HETATM 884 DOH2 HOH A 177 20.053 12.558 17.406 1.00 0.00 EP \n+HETATM 885 OM HOH A 177 20.265 12.526 17.184 1.00 0.00 EP \n+HETATM 886 O HOH A 178 15.662 10.549 10.033 1.00 0.00 O \n+HETATM 887 H1 HOH A 178 15.321 9.654 10.029 1.00 0.00 H \n+HETATM 888 H2 HOH A 178 16.015 10.676 9.152 1.00 0.00 H \n+HETATM 889 DOH2 HOH A 178 15.691 10.625 10.145 1.00 0.00 EP \n+HETATM 890 OM HOH A 178 15.665 10.391 9.852 1.00 0.00 EP \n+HETATM 891 O HOH A 179 11.897 12.231 3.386 1.00 0.00 O \n+HETATM 892 H1 HOH A 179 11.476 11.969 4.205 1.00 0.00 H \n+HETATM 893 H2 HOH A 179 12.518 11.527 3.199 1.00 0.00 H \n+HETATM 894 DOH2 HOH A 179 11.887 12.291 3.339 1.00 0.00 EP \n+HETATM 895 OM HOH A 179 11.938 12.033 3.516 1.00 0.00 EP \n+HETATM 896 O HOH A 180 10.404 17.798 12.852 1.00 0.00 O \n+HETATM 897 H1 HOH A 180 9.467 17.796 13.047 1.00 0.00 H \n+HETATM 898 H2 HOH A 180 10.635 18.725 12.793 1.00 0.00 H \n+HETATM 899 DOH2 HOH A 180 10.482 17.703 12.836 1.00 0.00 EP \n+HETATM 900 OM HOH A 180 10.259 17.988 12.880 1.00 0.00 EP \n+HETATM 901 O HOH A 181 16.889 21.246 15.727 1.00 0.00 O \n+HETATM 902 H1 HOH A 181 17.592 20.676 15.417 1.00 0.00 H \n+HETATM 903 H2 HOH A 181 16.543 21.654 14.933 1.00 0.00 H \n+HETATM 904 DOH2 HOH A 181 16.894 21.281 15.787 1.00 0.00 EP \n+HETATM 905 OM HOH A 181 16.962 21.213 15.501 1.00 0.00 EP \n+HETATM 906 O HOH A 182 7.121 3.237 6.653 1.00 0.00 O \n+HETATM 907 H1 HOH A 182 7.530 3.535 7.466 1.00 0.00 H \n+HETATM 908 H2 HOH A 182 7.819 3.291 6.000 1.00 0.00 H \n+HETATM 909 DOH2 HOH A 182 7.070 3.187 6.665 1.00 0.00 EP \n+HETATM 910 OM HOH A 182 7.348 3.309 6.686 1.00 0.00 EP \n+HETATM 911 O HOH A 183 18.293 9.801 24.573 1.00 0.00 O \n+HETATM 912 H1 HOH A 183 17.652 9.241 24.135 1.00 0.00 H \n+HETATM 913 H2 HOH A 183 19.138 9.514 24.228 1.00 0.00 H \n+HETATM 914 DOH2 HOH A 183 18.258 9.870 24.642 1.00 0.00 EP \n+HETATM 915 OM HOH A 183 18.335 9.627 24.413 1.00 0.00 EP \n+HETATM 916 O HOH A 184 20.380 16.697 1.523 1.00 0.00 O \n+HETATM 917 H1 HOH A 184 20.801 17.551 1.618 1.00 0.00 H \n+HETATM 918 H2 HOH A 184 19.883 16.583 2.333 1.00 0.00 H \n+HETATM 919 DOH2 HOH A 184 20.354 16.660 1.428 1.00 0.00 EP \n+HETATM 920 OM HOH A 184 20.364 16.849 1.709 1.00 0.00 EP \n+HETATM 921 O HOH A 185 26.859 13.244 16.911 1.00 0.00 O \n+HETATM 922 H1 HOH A 185 26.938 12.803 17.757 1.00 0.00 H \n+HETATM 923 H2 HOH A 185 26.191 12.745 16.442 1.00 0.00 H \n+HETATM 924 DOH2 HOH A 185 26.895 13.334 16.881 1.00 0.00 EP \n+HETATM 925 OM HOH A 185 26.738 13.051 16.988 1.00 0.00 EP \n+HETATM 926 O HOH A 186 28.541 11.409 9.895 1.00 0.00 O \n+HETATM 927 H1 HOH A 186 29.010 11.690 10.680 1.00 0.00 H \n+HETATM 928 H2 HOH A 186 29.024 11.808 9.171 1.00 0.00 H \n+HETATM 929 DOH2 HOH A 186 28.482 11.367 9.886 1.00 0.00 EP \n+HETATM 930 OM HOH A 186 28.736 11.548 9.907 1.00 0.00 EP \n+HETATM 931 O HOH A 187 15.846 26.775 8.833 1.00 0.00 O \n+HETATM 932 H1 HOH A 187 15.373 26.802 9.664 1.00 0.00 H \n+HETATM 933 H2 HOH A 187 15.984 25.842 8.666 1.00 0.00 H \n+HETATM 934 DOH2 HOH A 187 15.837 26.852 8.731 1.00 0.00 EP \n+HETATM 935 OM HOH A 187 15.777 26.589 8.969 1.00 0.00 EP \n+HETATM 936 O HOH A 188 6.949 8.640 9.748 1.00 0.00 O \n+HETATM 937 H1 HOH A 188 6.416 8.669 10.542 1.00 0.00 H \n+HETATM 938 H2 HOH A 188 6.543 7.959 9.211 1.00 0.00 H \n+HETATM 939 DOH2 HOH A 188 7.020 8.676 9.747 1.00 0.00 EP \n+HETATM 940 OM HOH A 188 6.756 8.506 9.801 1.00 0.00 EP \n+HETATM 941 O HOH A 189 18.453 10.578 4.501 1.00 0.00 O \n+HETATM 942 H1 HOH A 189 19.228 11.133 4.409 1.00 0.00 H \n+HETATM 943 H2 HOH A 189 18.598 10.098 5.316 1.00 0.00 H \n+HETATM 944 DOH2 HOH A 189 18.372 10.593 4.464 1.00 0.00 EP \n+HETATM 945 OM HOH A 189 18.642 10.593 4.649 1.00 0.00 EP \n+HETATM 946 O HOH A 190 14.605 11.490 12.391 1.00 0.00 O \n+HETATM 947 H1 HOH A 190 14.869 12.407 12.462 1.00 0.00 H \n+HETATM 948 H2 HOH A 190 14.990 11.193 11.566 1.00 0.00 H \n+HETATM 949 DOH2 HOH A 190 14.511 11.467 12.449 1.00 0.00 EP \n+HETATM 950 OM HOH A 190 14.738 11.617 12.236 1.00 0.00 EP \n+HETATM 951 O HOH A 191 6.292 19.759 10.122 1.00 0.00 O \n+HETATM 952 H1 HOH A 191 5.701 19.938 10.854 1.00 0.00 H \n+HETATM 953 H2 HOH A 191 5.820 19.125 9.582 1.00 0.00 H \n+HETATM 954 DOH2 HOH A 191 6.387 19.806 10.111 1.00 0.00 EP \n+HETATM 955 OM HOH A 191 6.074 19.666 10.161 1.00 0.00 EP \n+HETATM 956 O HOH A 192 10.728 4.729 11.010 1.00 0.00 O \n+HETATM 957 H1 HOH A 192 11.075 4.819 10.123 1.00 0.00 H \n+HETATM 958 H2 HOH A 192 11.498 4.783 11.576 1.00 0.00 H \n+HETATM 959 DOH2 HOH A 192 10.626 4.723 11.079 1.00 0.00 EP \n+HETATM 960 OM HOH A 192 10.957 4.758 10.944 1.00 0.00 EP \n+HETATM 961 O HOH A 193 8.007 22.589 12.513 1.00 0.00 O \n+HETATM 962 H1 HOH A 193 8.522 23.380 12.355 1.00 0.00 H \n+HETATM 963 H2 HOH A 193 7.115 22.829 12.258 1.00 0.00 H \n+HETATM 964 DOH2 HOH A 193 8.014 22.523 12.541 1.00 0.00 EP \n+HETATM 965 OM HOH A 193 7.930 22.801 12.428 1.00 0.00 EP \n+HETATM 966 O HOH A 194 7.795 13.817 4.540 1.00 0.00 O \n+HETATM 967 H1 HOH A 194 8.576 14.248 4.194 1.00 0.00 H \n+HETATM 968 H2 HOH A 194 7.911 13.835 5.490 1.00 0.00 H \n+HETATM 969 DOH2 HOH A 194 7.688 13.782 4.505 1.00 0.00 EP \n+HETATM 970 OM HOH A 194 7.979 13.909 4.664 1.00 0.00 EP \n+HETATM 971 O HOH A 195 8.850 20.312 11.022 1.00 0.00 O \n+HETATM 972 H1 HOH A 195 7.976 20.099 10.694 1.00 0.00 H \n+HETATM 973 H2 HOH A 195 8.714 21.068 11.594 1.00 0.00 H \n+HETATM 974 DOH2 HOH A 195 8.918 20.271 10.994 1.00 0.00 EP \n+HETATM 975 OM HOH A 195 8.643 20.423 11.072 1.00 0.00 EP \n+HETATM 976 O HOH A 196 8.118 29.773 4.419 1.00 0.00 O \n+HETATM 977 H1 HOH A 196 8.739 30.334 3.956 1.00 0.00 H \n+HETATM 978 H2 HOH A 196 8.176 30.054 5.333 1.00 0.00 H \n+HETATM 979 DOH2 HOH A 196 8.049 29.721 4.382 1.00 0.00 EP \n+HETATM 980 OM HOH A 196 8.257 29.946 4.512 1.00 0.00 EP \n+HETATM 981 O HOH A 197 4.330 28.268 9.991 1.00 0.00 O \n+HETATM 982 H1 HOH A 197 5.185 27.853 9.876 1.00 0.00 H \n+HETATM 983 H2 HOH A 197 4.480 29.189 9.780 1.00 0.00 H \n+HETATM 984 DOH2 HOH A 197 4.246 28.201 10.037 1.00 0.00 EP \n+HETATM 985 OM HOH A 197 4.536 28.372 9.924 1.00 0.00 EP \n+HETATM 986 O HOH A 198 18.879 6.705 6.431 1.00 0.00 O \n+HETATM 987 H1 HOH A 198 19.670 6.233 6.169 1.00 0.00 H \n+HETATM 988 H2 HOH A 198 18.342 6.734 5.639 1.00 0.00 H \n+HETATM 989 DOH2 HOH A 198 18.868 6.765 6.521 1.00 0.00 EP \n+HETATM 990 OM HOH A 198 18.931 6.614 6.215 1.00 0.00 EP \n+HETATM 991 O HOH A 199 23.952 7.092 8.424 1.00 0.00 O \n+HETATM 992 H1 HOH A 199 24.077 6.143 8.428 1.00 0.00 H \n+HETATM 993 H2 HOH A 199 24.668 7.426 7.884 1.00 0.00 H \n+HETATM 994 DOH2 HOH A 199 23.878 7.156 8.498 1.00 0.00 EP \n+HETATM 995 OM HOH A 199 24.124 6.966 8.314 1.00 0.00 EP \n+HETATM 996 O HOH A 200 9.853 12.070 8.205 1.00 0.00 O \n+HETATM 997 H1 HOH A 200 10.455 12.556 8.769 1.00 0.00 H \n+HETATM 998 H2 HOH A 200 9.681 11.258 8.681 1.00 0.00 H \n+HETATM 999 DOH2 HOH A 200 9.831 12.096 8.124 1.00 0.00 EP \n+HETATM 1000 OM HOH A 200 9.941 12.003 8.419 1.00 0.00 EP \n+HETATM 1001 O HOH A 201 17.776 11.691 20.780 1.00 0.00 O \n+HETATM 1002 H1 HOH A 201 17.464 10.789 20.853 1.00 0.00 H \n+HETATM 1003 H2 HOH A 201 17.073 12.219 21.160 1.00 0.00 H \n+HETATM 1004 DOH2 HOH A 201 17.848 11.708 20.752 1.00 0.00 EP \n+HETATM 1005 OM HOH A 201 17.568 11.614 20.873 1.00 0.00 EP \n+HETATM 1006 O HOH A 202 16.933 3.465 18.597 1.00 0.00 O \n+HETATM 1007 H1 HOH A 202 17.149 4.302 18.185 1.00 0.00 H \n+HETATM 1008 H2 HOH A 202 16.446 3.705 19.385 1.00 0.00 H \n+HETATM 1009 DOH2 HOH A 202 16.935 3.398 18.572 1.00 0.00 EP \n+HETATM 1010 OM HOH A 202 16.877 3.686 18.674 1.00 0.00 EP \n+HETATM 1011 O HOH A 203 12.387 7.708 23.132 1.00 0.00 O \n+HETATM 1012 H1 HOH A 203 12.522 7.246 23.959 1.00 0.00 H \n+HETATM 1013 H2 HOH A 203 12.165 8.603 23.389 1.00 0.00 H \n+HETATM 1014 DOH2 HOH A 203 12.392 7.675 23.060 1.00 0.00 EP \n+HETATM 1015 OM HOH A 203 12.369 7.797 23.354 1.00 0.00 EP \n+HETATM 1016 O HOH A 204 17.852 8.652 17.049 1.00 0.00 O \n+HETATM 1017 H1 HOH A 204 17.652 9.538 17.351 1.00 0.00 H \n+HETATM 1018 H2 HOH A 204 18.777 8.529 17.261 1.00 0.00 H \n+HETATM 1019 DOH2 HOH A 204 17.824 8.589 16.992 1.00 0.00 EP \n+HETATM 1020 OM HOH A 204 18.000 8.809 17.154 1.00 0.00 EP \n+HETATM 1021 O HOH A 205 7.560 10.140 2.024 1.00 0.00 O \n+HETATM 1022 H1 HOH A 205 8.379 9.715 2.276 1.00 0.00 H \n+HETATM 1023 H2 HOH A 205 7.274 10.599 2.814 1.00 0.00 H \n+HETATM 1024 DOH2 HOH A 205 7.512 10.171 1.937 1.00 0.00 EP \n+HETATM 1025 OM HOH A 205 7.669 10.147 2.238 1.00 0.00 EP \n+HETATM 1026 O HOH A 206 7.260 9.370 26.276 1.00 0.00 O \n+HETATM 1027 H1 HOH A 206 6.769 9.660 27.045 1.00 0.00 H \n+HETATM 1028 H2 HOH A 206 7.399 10.167 25.764 1.00 0.00 H \n+HETATM 1029 DOH2 HOH A 206 7.312 9.269 26.279 1.00 0.00 EP \n+HETATM 1030 OM HOH A 206 7.188 9.593 26.329 1.00 0.00 EP \n+HETATM 1031 O HOH A 207 13.071 9.049 17.017 1.00 0.00 O \n+HETATM 1032 H1 HOH A 207 12.338 9.452 17.482 1.00 0.00 H \n+HETATM 1033 H2 HOH A 207 13.327 9.700 16.363 1.00 0.00 H \n+HETATM 1034 DOH2 HOH A 207 13.110 8.983 17.031 1.00 0.00 EP \n+HETATM 1035 OM HOH A 207 12.973 9.265 16.978 1.00 0.00 EP \n+HETATM 1036 O HOH A 208 27.466 13.007 6.241 1.00 0.00 O \n+HETATM 1037 H1 HOH A 208 26.669 13.515 6.393 1.00 0.00 H \n+HETATM 1038 H2 HOH A 208 28.145 13.475 6.729 1.00 0.00 H \n+HETATM 1039 DOH2 HOH A 208 27.489 12.947 6.191 1.00 0.00 EP \n+HETATM 1040 OM HOH A 208 27.442 13.207 6.372 1.00 0.00 EP \n+HETATM 1041 O HOH A 209 4.894 10.140 21.553 1.00 0.00 O \n+HETATM 1042 H1 HOH A 209 4.472 9.991 20.707 1.00 0.00 H \n+HETATM 1043 H2 HOH A 209 5.451 10.906 21.411 1.00 0.00 H \n+HETATM 1044 DOH2 HOH A 209 4.882 10.089 21.617 1.00 0.00 EP \n+HETATM 1045 OM HOH A 209 4.922 10.266 21.350 1.00 0.00 EP \n+HETATM 1046 O HOH A 210 15.782 13.033 22.087 1.00 0.00 O \n+HETATM 1047 H1 HOH A 210 15.896 13.963 22.282 1.00 0.00 H \n+HETATM 1048 H2 HOH A 210 15.983 12.589 22.911 1.00 0.00 H \n+HETATM 1049 DOH2 HOH A 210 15.781 12.970 21.993 1.00 0.00 EP \n+HETATM 1050 OM HOH A 210 15.847 13.132 22.296 1.00 0.00 EP \n+HETATM 1051 O HOH A 211 5.222 6.218 4.611 1.00 0.00 O \n+HETATM 1052 H1 HOH A 211 5.975 6.720 4.922 1.00 0.00 H \n+HETATM 1053 H2 HOH A 211 4.499 6.497 5.173 1.00 0.00 H \n+HETATM 1054 DOH2 HOH A 211 5.208 6.174 4.529 1.00 0.00 EP \n+HETATM 1055 OM HOH A 211 5.228 6.378 4.790 1.00 0.00 EP \n+HETATM 1056 O HOH A 212 22.049 20.704 21.745 1.00 0.00 O \n+HETATM 1057 H1 HOH A 212 21.945 21.608 21.447 1.00 0.00 H \n+HETATM 1058 H2 HOH A 212 21.399 20.211 21.244 1.00 0.00 H \n+HETATM 1059 DOH2 HOH A 212 22.100 20.678 21.786 1.00 0.00 EP \n+HETATM 1060 OM HOH A 212 21.894 20.789 21.581 1.00 0.00 EP \n+HETATM 1061 O HOH A 213 16.412 11.906 24.445 1.00 0.00 O \n+HETATM 1062 H1 HOH A 213 17.115 11.258 24.503 1.00 0.00 H \n+HETATM 1063 H2 HOH A 213 15.620 11.422 24.676 1.00 0.00 H \n+HETATM 1064 DOH2 HOH A 213 16.398 11.954 24.385 1.00 0.00 EP \n+HETATM 1065 OM HOH A 213 16.394 11.674 24.504 1.00 0.00 EP \n+HETATM 1066 O HOH A 214 20.156 12.650 21.930 1.00 0.00 O \n+HETATM 1067 H1 HOH A 214 19.298 12.383 21.600 1.00 0.00 H \n+HETATM 1068 H2 HOH A 214 20.631 12.944 21.152 1.00 0.00 H \n+HETATM 1069 DOH2 HOH A 214 20.225 12.604 21.999 1.00 0.00 EP \n+HETATM 1070 OM HOH A 214 20.078 12.656 21.703 1.00 0.00 EP \n+HETATM 1071 O HOH A 215 23.835 11.743 2.647 1.00 0.00 O \n+HETATM 1072 H1 HOH A 215 23.129 12.384 2.564 1.00 0.00 H \n+HETATM 1073 H2 HOH A 215 24.441 12.134 3.276 1.00 0.00 H \n+HETATM 1074 DOH2 HOH A 215 23.848 11.691 2.623 1.00 0.00 EP \n+HETATM 1075 OM HOH A 215 23.814 11.955 2.759 1.00 0.00 EP \n+HETATM 1076 O HOH A 216 7.817 25.844 23.912 1.00 0.00 O \n+HETATM 1077 H1 HOH A 216 8.522 26.006 23.284 1.00 0.00 H \n+HETATM 1078 H2 HOH A 216 7.030 25.761 23.374 1.00 0.00 H \n+HETATM 1079 DOH2 HOH A 216 7.819 25.805 24.006 1.00 0.00 EP \n+HETATM 1080 OM HOH A 216 7.800 25.860 23.673 1.00 0.00 EP \n+HETATM 1081 O HOH A 217 18.561 16.054 20.748 1.00 0.00 O \n+HETATM 1082 H1 HOH A 217 19.480 16.165 20.992 1.00 0.00 H \n+HETATM 1083 H2 HOH A 217 18.082 16.614 21.359 1.00 0.00 H \n+HETATM 1084 DOH2 HOH A 217 18.533 16.027 20.666 1.00 0.00 EP \n+HETATM 1085 OM HOH A 217 18.651 16.191 20.924 1.00 0.00 EP \n+HETATM 1086 O HOH A 218 16.276 15.489 23.314 1.00 0.00 O \n+HETATM 1087 H1 HOH A 218 16.752 16.280 23.061 1.00 0.00 H \n+HETATM 1088 H2 HOH A 218 16.634 15.258 24.172 1.00 0.00 H \n+HETATM 1089 DOH2 HOH A 218 16.189 15.465 23.273 1.00 0.00 EP \n+HETATM 1090 OM HOH A 218 16.447 15.604 23.438 1.00 0.00 EP \n+HETATM 1091 O HOH A 219 20.665 17.779 17.617 1.00 0.00 O \n+HETATM 1092 H1 HOH A 219 21.457 18.296 17.469 1.00 0.00 H \n+HETATM 1093 H2 HOH A 219 20.948 17.068 18.193 1.00 0.00 H \n+HETATM 1094 DOH2 HOH A 219 20.616 17.767 17.578 1.00 0.00 EP \n+HETATM 1095 OM HOH A 219 20.885 17.739 17.705 1.00 0.00 EP \n+HETATM 1096 O HOH A 220 17.509 8.833 14.317 1.00 0.00 O \n+HETATM 1097 H1 HOH A 220 17.807 9.737 14.212 1.00 0.00 H \n+HETATM 1098 H2 HOH A 220 17.583 8.664 15.256 1.00 0.00 H \n+HETATM 1099 DOH2 HOH A 220 17.491 8.768 14.249 1.00 0.00 EP \n+HETATM 1100 OM HOH A 220 17.586 8.984 14.488 1.00 0.00 EP \n+HETATM 1101 O HOH A 221 16.886 4.474 3.393 1.00 0.00 O \n+HETATM 1102 H1 HOH A 221 17.393 3.714 3.679 1.00 0.00 H \n+HETATM 1103 H2 HOH A 221 16.412 4.169 2.620 1.00 0.00 H \n+HETATM 1104 DOH2 HOH A 221 16.887 4.563 3.430 1.00 0.00 EP \n+HETATM 1105 OM HOH A 221 16.893 4.256 3.293 1.00 0.00 EP \n+HETATM 1106 O HOH A 222 12.051 12.772 23.141 1.00 0.00 O \n+HETATM 1107 H1 HOH A 222 12.349 12.923 22.244 1.00 0.00 H \n+HETATM 1108 H2 HOH A 222 11.986 13.647 23.523 1.00 0.00 H \n+HETATM 1109 DOH2 HOH A 222 12.034 12.702 23.171 1.00 0.00 EP \n+HETATM 1110 OM HOH A 222 12.098 12.982 23.036 1.00 0.00 EP \n+HETATM 1111 O HOH A 223 9.620 5.107 16.069 1.00 0.00 O \n+HETATM 1112 H1 HOH A 223 8.850 4.801 15.589 1.00 0.00 H \n+HETATM 1113 H2 HOH A 223 9.418 4.925 16.987 1.00 0.00 H \n+HETATM 1114 DOH2 HOH A 223 9.715 5.159 16.023 1.00 0.00 EP \n+HETATM 1115 OM HOH A 223 9.421 5.007 16.159 1.00 0.00 EP \n+HETATM 1116 O HOH A 224 10.587 9.506 12.150 1.00 0.00 O \n+HETATM 1117 H1 HOH A 224 11.244 8.811 12.119 1.00 0.00 H \n+HETATM 1118 H2 HOH A 224 10.527 9.737 13.077 1.00 0.00 H \n+HETATM 1119 DOH2 HOH A 224 10.573 9.577 12.079 1.00 0.00 EP \n+HETATM 1120 OM HOH A 224 10.710 9.411 12.334 1.00 0.00 EP \n+HETATM 1121 O HOH A 225 11.537 10.260 24.041 1.00 0.00 O \n+HETATM 1122 H1 HOH A 225 11.711 11.138 23.704 1.00 0.00 H \n+HETATM 1123 H2 HOH A 225 10.604 10.120 23.877 1.00 0.00 H \n+HETATM 1124 DOH2 HOH A 225 11.629 10.187 24.097 1.00 0.00 EP \n+HETATM 1125 OM HOH A 225 11.381 10.411 23.938 1.00 0.00 EP \n+HETATM 1126 O HOH A 226 29.360 6.472 2.639 1.00 0.00 O \n+HETATM 1127 H1 HOH A 226 29.689 5.990 3.398 1.00 0.00 H \n+HETATM 1128 H2 HOH A 226 30.037 6.357 1.971 1.00 0.00 H \n+HETATM 1129 DOH2 HOH A 226 29.258 6.533 2.620 1.00 0.00 EP \n+HETATM 1130 OM HOH A 226 29.566 6.349 2.658 1.00 0.00 EP \n+HETATM 1131 O HOH A 227 12.619 6.535 25.694 1.00 0.00 O \n+HETATM 1132 H1 HOH A 227 12.105 7.226 26.111 1.00 0.00 H \n+HETATM 1133 H2 HOH A 227 11.973 5.873 25.446 1.00 0.00 H \n+HETATM 1134 DOH2 HOH A 227 12.726 6.555 25.666 1.00 0.00 EP \n+HETATM 1135 OM HOH A 227 12.381 6.541 25.728 1.00 0.00 EP \n+HETATM 1136 O HOH A 228 21.619 9.427 29.639 1.00 0.00 O \n+HETATM 1137 H1 HOH A 228 22.481 9.110 29.908 1.00 0.00 H \n+HETATM 1138 H2 HOH A 228 21.104 8.633 29.497 1.00 0.00 H \n+HETATM 1139 DOH2 HOH A 228 21.577 9.493 29.648 1.00 0.00 EP \n+HETATM 1140 OM HOH A 228 21.690 9.199 29.665 1.00 0.00 EP \n+HETATM 1141 O HOH A 229 17.787 5.825 17.338 1.00 0.00 O \n+HETATM 1142 H1 HOH A 229 18.703 5.668 17.565 1.00 0.00 H \n+HETATM 1143 H2 HOH A 229 17.714 6.778 17.278 1.00 0.00 H \n+HETATM 1144 DOH2 HOH A 229 17.731 5.755 17.328 1.00 0.00 EP \n+HETATM 1145 OM HOH A 229 17.960 5.988 17.372 1.00 0.00 EP \n+HETATM 1146 O HOH A 230 15.817 19.255 25.194 1.00 0.00 O \n+HETATM 1147 H1 HOH A 230 15.625 18.478 25.719 1.00 0.00 H \n+HETATM 1148 H2 HOH A 230 16.765 19.231 25.065 1.00 0.00 H \n+HETATM 1149 DOH2 HOH A 230 15.730 19.279 25.145 1.00 0.00 EP \n+HETATM 1150 OM HOH A 230 15.972 19.091 25.275 1.00 0.00 EP \n+HETATM 1151 O HOH A 231 12.058 17.912 18.587 1.00 0.00 O \n+HETATM 1152 H1 HOH A 231 11.531 17.902 17.788 1.00 0.00 H \n+HETATM 1153 H2 HOH A 231 12.877 18.335 18.329 1.00 0.00 H \n+HETATM 1154 DOH2 HOH A 231 12.048 17.874 18.688 1.00 0.00 EP \n+HETATM 1155 OM HOH A 231 12.118 17.997 18.370 1.00 0.00 EP \n+HETATM 1156 O HOH A 232 20.970 10.414 13.588 1.00 0.00 O \n+HETATM 1157 H1 HOH A 232 20.062 10.643 13.784 1.00 0.00 H \n+HETATM 1158 H2 HOH A 232 21.245 11.057 12.934 1.00 0.00 H \n+HETATM 1159 DOH2 HOH A 232 21.043 10.349 13.663 1.00 0.00 EP \n+HETATM 1160 OM HOH A 232 20.840 10.593 13.494 1.00 0.00 EP \n+HETATM 1161 O HOH A 233 4.022 12.484 25.462 1.00 0.00 O \n+HETATM 1162 H1 HOH A 233 4.546 12.474 24.661 1.00 0.00 H \n+HETATM 1163 H2 HOH A 233 4.098 11.596 25.810 1.00 0.00 H \n+HETATM 1164 DOH2 HOH A 233 4.007 12.561 25.513 1.00 0.00 EP \n+HETATM 1165 OM HOH A 233 4.145 12.300 25.369 1.00 0.00 EP \n+HETATM 1166 O HOH A 234 14.446 29.769 27.671 1.00 0.00 O \n+HETATM 1167 H1 HOH A 234 15.226 30.229 27.361 1.00 0.00 H \n+HETATM 1168 H2 HOH A 234 14.006 30.400 28.240 1.00 0.00 H \n+HETATM 1169 DOH2 HOH A 234 14.413 29.699 27.658 1.00 0.00 EP \n+HETATM 1170 OM HOH A 234 14.516 29.993 27.724 1.00 0.00 EP \n+HETATM 1171 O HOH A 235 6.067 23.087 0.371 1.00 0.00 O \n+HETATM 1172 H1 HOH A 235 6.501 23.782 0.866 1.00 0.00 H \n+HETATM 1173 H2 HOH A 235 6.723 22.796 -0.262 1.00 0.00 H \n+HETATM 1174 DOH2 HOH A 235 6.004 23.065 0.367 1.00 0.00 EP \n+HETATM 1175 OM HOH A 235 6.291 23.170 0.343 1.00 0.00 EP \n+HETATM 1176 O HOH A 236 2.591 18.519 1.327 1.00 0.00 O \n+HETATM 1177 H1 HOH A 236 2.725 19.336 0.846 1.00 0.00 H \n+HETATM 1178 H2 HOH A 236 3.446 18.091 1.317 1.00 0.00 H \n+HETATM 1179 DOH2 HOH A 236 2.518 18.469 1.344 1.00 0.00 EP \n+HETATM 1180 OM HOH A 236 2.794 18.599 1.227 1.00 0.00 EP \n+HETATM 1181 O HOH A 237 5.521 7.679 18.326 1.00 0.00 O \n+HETATM 1182 H1 HOH A 237 6.422 7.471 18.571 1.00 0.00 H \n+HETATM 1183 H2 HOH A 237 5.059 6.842 18.379 1.00 0.00 H \n+HETATM 1184 DOH2 HOH A 237 5.482 7.790 18.306 1.00 0.00 EP \n+HETATM 1185 OM HOH A 237 5.611 7.465 18.387 1.00 0.00 EP \n+HETATM 1186 O HOH A 238 5.821 6.056 23.284 1.00 0.00 O \n+HETATM 1187 H1 HOH A 238 5.881 5.153 23.596 1.00 0.00 H \n+HETATM 1188 H2 HOH A 238 5.174 6.024 22.579 1.00 0.00 H \n+HETATM 1189 DOH2 HOH A 238 5.876 6.147 23.313 1.00 0.00 EP \n+HETATM 1190 OM HOH A 238 5.701 5.864 23.203 1.00 0.00 EP \n+HETATM 1191 O HOH A 239 3.841 12.279 2.630 1.00 0.00 O \n+HETATM 1192 H1 HOH A 239 3.470 12.292 3.513 1.00 0.00 H \n+HETATM 1193 H2 HOH A 239 3.849 13.197 2.360 1.00 0.00 H \n+HETATM 1194 DOH2 HOH A 239 3.913 12.209 2.600 1.00 0.00 EP \n+HETATM 1195 OM HOH A 239 3.766 12.470 2.756 1.00 0.00 EP \n+HETATM 1196 O HOH A 240 12.107 2.460 26.104 1.00 0.00 O \n+HETATM 1197 H1 HOH A 240 11.689 2.490 26.965 1.00 0.00 H \n+HETATM 1198 H2 HOH A 240 11.756 3.220 25.640 1.00 0.00 H \n+HETATM 1199 DOH2 HOH A 240 12.167 2.360 26.062 1.00 0.00 EP \n+HETATM 1200 OM HOH A 240 11.949 2.622 26.185 1.00 0.00 EP \n+HETATM 1201 O HOH A 241 4.128 10.034 26.635 1.00 0.00 O \n+HETATM 1202 H1 HOH A 241 4.097 9.086 26.505 1.00 0.00 H \n+HETATM 1203 H2 HOH A 241 4.799 10.163 27.306 1.00 0.00 H \n+HETATM 1204 DOH2 HOH A 241 4.070 10.107 26.578 1.00 0.00 EP \n+HETATM 1205 OM HOH A 241 4.259 9.866 26.746 1.00 0.00 EP \n+HETATM 1206 O HOH A 242 20.155 3.639 14.956 1.00 0.00 O \n+HETATM 1207 H1 HOH A 242 20.791 4.345 14.840 1.00 0.00 H \n+HETATM 1208 H2 HOH A 242 19.432 3.868 14.372 1.00 0.00 H \n+HETATM 1209 DOH2 HOH A 242 20.172 3.567 14.982 1.00 0.00 EP \n+HETATM 1210 OM HOH A 242 20.137 3.831 14.812 1.00 0.00 EP \n+HETATM 1211 O HOH A 243 8.950 29.942 21.516 1.00 0.00 O \n+HETATM 1212 H1 HOH A 243 9.694 30.429 21.870 1.00 0.00 H \n+HETATM 1213 H2 HOH A 243 9.125 29.886 20.577 1.00 0.00 H \n+HETATM 1214 DOH2 HOH A 243 8.890 29.925 21.569 1.00 0.00 EP \n+HETATM 1215 OM HOH A 243 9.138 30.030 21.396 1.00 0.00 EP \n+HETATM 1216 O HOH A 244 10.163 16.891 26.059 1.00 0.00 O \n+HETATM 1217 H1 HOH A 244 10.549 16.324 25.392 1.00 0.00 H \n+HETATM 1218 H2 HOH A 244 10.476 17.768 25.838 1.00 0.00 H \n+HETATM 1219 DOH2 HOH A 244 10.095 16.851 26.146 1.00 0.00 EP \n+HETATM 1220 OM HOH A 244 10.306 16.955 25.877 1.00 0.00 EP \n+HETATM 1221 O HOH A 245 6.018 6.033 27.530 1.00 0.00 O \n+HETATM 1222 H1 HOH A 245 6.586 6.293 26.804 1.00 0.00 H \n+HETATM 1223 H2 HOH A 245 6.458 6.369 28.311 1.00 0.00 H \n+HETATM 1224 DOH2 HOH A 245 5.946 5.968 27.500 1.00 0.00 EP \n+HETATM 1225 OM HOH A 245 6.225 6.155 27.541 1.00 0.00 EP \n+HETATM 1226 O HOH A 246 8.923 10.041 23.555 1.00 0.00 O \n+HETATM 1227 H1 HOH A 246 8.492 10.715 24.080 1.00 0.00 H \n+HETATM 1228 H2 HOH A 246 8.213 9.458 23.284 1.00 0.00 H \n+HETATM 1229 DOH2 HOH A 246 9.045 10.051 23.517 1.00 0.00 EP \n+HETATM 1230 OM HOH A 246 8.689 10.060 23.607 1.00 0.00 EP \n+HETATM 1231 O HOH A 247 2.677 8.636 13.382 1.00 0.00 O \n+HETATM 1232 H1 HOH A 247 2.466 9.099 14.192 1.00 0.00 H \n+HETATM 1233 H2 HOH A 247 1.855 8.624 12.891 1.00 0.00 H \n+HETATM 1234 DOH2 HOH A 247 2.740 8.566 13.378 1.00 0.00 EP \n+HETATM 1235 OM HOH A 247 2.465 8.728 13.447 1.00 0.00 EP \n+HETATM 1236 O HOH A 248 9.614 1.659 3.057 1.00 0.00 O \n+HETATM 1237 H1 HOH A 248 9.154 1.493 2.234 1.00 0.00 H \n+HETATM 1238 H2 HOH A 248 10.394 2.150 2.800 1.00 0.00 H \n+HETATM 1239 DOH2 HOH A 248 9.577 1.636 3.159 1.00 0.00 EP \n+HETATM 1240 OM HOH A 248 9.680 1.726 2.835 1.00 0.00 EP \n+HETATM 1241 O HOH A 249 15.879 25.266 25.661 1.00 0.00 O \n+HETATM 1242 H1 HOH A 249 15.181 24.875 25.135 1.00 0.00 H \n+HETATM 1243 H2 HOH A 249 16.583 25.437 25.035 1.00 0.00 H \n+HETATM 1244 DOH2 HOH A 249 15.891 25.294 25.774 1.00 0.00 EP \n+HETATM 1245 OM HOH A 249 15.880 25.221 25.424 1.00 0.00 EP \n+HETATM 1246 O HOH A 250 7.491 6.762 25.434 1.00 0.00 O \n+HETATM 1247 H1 HOH A 250 6.957 6.596 24.657 1.00 0.00 H \n+HETATM 1248 H2 HOH A 250 7.415 7.705 25.580 1.00 0.00 H \n+HETATM 1249 DOH2 HOH A 250 7.486 6.697 25.523 1.00 0.00 EP \n+HETATM 1250 OM HOH A 250 7.366 6.921 25.305 1.00 0.00 EP \n+HETATM 1251 O HOH A 251 14.071 10.510 25.037 1.00 0.00 O \n+HETATM 1252 H1 HOH A 251 13.245 10.348 24.581 1.00 0.00 H \n+HETATM 1253 H2 HOH A 251 14.421 9.637 25.216 1.00 0.00 H \n+HETATM 1254 DOH2 HOH A 251 14.099 10.594 25.061 1.00 0.00 EP \n+HETATM 1255 OM HOH A 251 13.974 10.298 24.980 1.00 0.00 EP \n+HETATM 1256 O HOH A 252 24.776 5.866 17.200 1.00 0.00 O \n+HETATM 1257 H1 HOH A 252 23.830 5.923 17.065 1.00 0.00 H \n+HETATM 1258 H2 HOH A 252 25.146 5.885 16.317 1.00 0.00 H \n+HETATM 1259 DOH2 HOH A 252 24.832 5.824 17.296 1.00 0.00 EP \n+HETATM 1260 OM HOH A 252 24.658 5.881 16.991 1.00 0.00 EP \n+HETATM 1261 O HOH A 253 4.510 10.952 14.980 1.00 0.00 O \n+HETATM 1262 H1 HOH A 253 3.660 10.604 15.252 1.00 0.00 H \n+HETATM 1263 H2 HOH A 253 5.137 10.551 15.581 1.00 0.00 H \n+HETATM 1264 DOH2 HOH A 253 4.534 11.023 14.889 1.00 0.00 EP \n+HETATM 1265 OM HOH A 253 4.464 10.798 15.159 1.00 0.00 EP \n+HETATM 1266 O HOH A 254 15.946 17.620 19.232 1.00 0.00 O \n+HETATM 1267 H1 HOH A 254 15.502 18.083 18.522 1.00 0.00 H \n+HETATM 1268 H2 HOH A 254 16.503 16.979 18.790 1.00 0.00 H \n+HETATM 1269 DOH2 HOH A 254 15.915 17.644 19.311 1.00 0.00 EP \n+HETATM 1270 OM HOH A 254 15.969 17.583 18.996 1.00 0.00 EP \n+HETATM 1271 O HOH A 255 11.368 1.123 22.363 1.00 0.00 O \n+HETATM 1272 H1 HOH A 255 11.792 1.349 23.191 1.00 0.00 H \n+HETATM 1273 H2 HOH A 255 12.075 1.145 21.717 1.00 0.00 H \n+HETATM 1274 DOH2 HOH A 255 11.289 1.091 22.368 1.00 0.00 EP \n+HETATM 1275 OM HOH A 255 11.600 1.174 22.400 1.00 0.00 EP \n+HETATM 1276 O HOH A 256 4.652 2.079 22.753 1.00 0.00 O \n+HETATM 1277 H1 HOH A 256 5.182 2.610 23.348 1.00 0.00 H \n+HETATM 1278 H2 HOH A 256 3.955 2.667 22.462 1.00 0.00 H \n+HETATM 1279 DOH2 HOH A 256 4.658 1.989 22.737 1.00 0.00 EP \n+HETATM 1280 OM HOH A 256 4.618 2.308 22.815 1.00 0.00 EP \n+HETATM 1281 O HOH A 257 8.325 16.671 6.819 1.00 0.00 O \n+HETATM 1282 H1 HOH A 257 8.175 15.727 6.872 1.00 0.00 H \n+HETATM 1283 H2 HOH A 257 8.359 16.960 7.731 1.00 0.00 H \n+HETATM 1284 DOH2 HOH A 257 8.374 16.716 6.746 1.00 0.00 EP \n+HETATM 1285 OM HOH A 257 8.301 16.537 7.017 1.00 0.00 EP \n+HETATM 1286 O HOH A 258 9.819 15.001 27.995 1.00 0.00 O \n+HETATM 1287 H1 HOH A 258 9.963 15.653 27.309 1.00 0.00 H \n+HETATM 1288 H2 HOH A 258 9.813 15.506 28.808 1.00 0.00 H \n+HETATM 1289 DOH2 HOH A 258 9.813 14.909 27.992 1.00 0.00 EP \n+HETATM 1290 OM HOH A 258 9.847 15.239 28.021 1.00 0.00 EP \n+HETATM 1291 O HOH A 259 2.226 0.723 29.294 1.00 0.00 O \n+HETATM 1292 H1 HOH A 259 2.986 1.090 28.842 1.00 0.00 H \n+HETATM 1293 H2 HOH A 259 1.510 1.323 29.086 1.00 0.00 H \n+HETATM 1294 DOH2 HOH A 259 2.223 0.615 29.335 1.00 0.00 EP \n+HETATM 1295 OM HOH A 259 2.235 0.922 29.159 1.00 0.00 EP \n+HETATM 1296 O HOH A 260 12.236 12.538 19.294 1.00 0.00 O \n+HETATM 1297 H1 HOH A 260 11.867 11.763 18.872 1.00 0.00 H \n+HETATM 1298 H2 HOH A 260 12.395 13.150 18.574 1.00 0.00 H \n+HETATM 1299 DOH2 HOH A 260 12.268 12.522 19.343 1.00 0.00 EP \n+HETATM 1300 OM HOH A 260 12.193 12.505 19.060 1.00 0.00 EP \n+HETATM 1301 O HOH A 261 3.434 28.299 28.653 1.00 0.00 O \n+HETATM 1302 H1 HOH A 261 3.746 28.486 27.767 1.00 0.00 H \n+HETATM 1303 H2 HOH A 261 3.054 29.125 28.953 1.00 0.00 H \n+HETATM 1304 DOH2 HOH A 261 3.423 28.209 28.702 1.00 0.00 EP \n+HETATM 1305 OM HOH A 261 3.420 28.507 28.533 1.00 0.00 EP \n+HETATM 1306 O HOH A 262 8.704 19.042 29.779 1.00 0.00 O \n+HETATM 1307 H1 HOH A 262 9.068 18.246 30.166 1.00 0.00 H \n+HETATM 1308 H2 HOH A 262 8.594 19.640 30.519 1.00 0.00 H \n+HETATM 1309 DOH2 HOH A 262 8.735 19.027 29.699 1.00 0.00 EP \n+HETATM 1310 OM HOH A 262 8.756 19.001 30.010 1.00 0.00 EP \n+HETATM 1311 O HOH A 263 10.882 4.621 24.920 1.00 0.00 O \n+HETATM 1312 H1 HOH A 263 10.229 4.700 25.615 1.00 0.00 H \n+HETATM 1313 H2 HOH A 263 10.414 4.203 24.197 1.00 0.00 H \n+HETATM 1314 DOH2 HOH A 263 10.990 4.634 24.953 1.00 0.00 EP \n+HETATM 1315 OM HOH A 263 10.652 4.551 24.914 1.00 0.00 EP \n+HETATM 1316 O HOH A 264 8.300 11.495 29.748 1.00 0.00 O \n+HETATM 1317 H1 HOH A 264 9.215 11.640 29.989 1.00 0.00 H \n+HETATM 1318 H2 HOH A 264 7.923 11.039 30.501 1.00 0.00 H \n+HETATM 1319 DOH2 HOH A 264 8.235 11.523 29.642 1.00 0.00 EP \n+HETATM 1320 OM HOH A 264 8.410 11.431 29.952 1.00 0.00 EP \n+HETATM 1321 O HOH A 265 6.862 8.533 22.744 1.00 0.00 O \n+HETATM 1322 H1 HOH A 265 6.492 7.668 22.919 1.00 0.00 H \n+HETATM 1323 H2 HOH A 265 6.133 9.037 22.382 1.00 0.00 H \n+HETATM 1324 DOH2 HOH A 265 6.942 8.574 22.770 1.00 0.00 EP \n+HETATM 1325 OM HOH A 265 6.637 8.459 22.706 1.00 0.00 EP \n+HETATM 1326 O HOH A 266 6.338 2.298 29.550 1.00 0.00 O \n+HETATM 1327 H1 HOH A 266 5.730 2.796 30.096 1.00 0.00 H \n+HETATM 1328 H2 HOH A 266 5.776 1.799 28.957 1.00 0.00 H \n+HETATM 1329 DOH2 HOH A 266 6.471 2.290 29.546 1.00 0.00 EP \n+HETATM 1330 OM HOH A 266 6.098 2.298 29.541 1.00 0.00 EP \n+HETATM 1331 O HOH A 267 28.999 0.260 27.469 1.00 0.00 O \n+HETATM 1332 H1 HOH A 267 29.342 0.985 27.991 1.00 0.00 H \n+HETATM 1333 H2 HOH A 267 29.691 0.071 26.836 1.00 0.00 H \n+HETATM 1334 DOH2 HOH A 267 28.903 0.217 27.479 1.00 0.00 EP \n+HETATM 1335 OM HOH A 267 29.211 0.370 27.446 1.00 0.00 EP \n+HETATM 1336 O HOH A 268 18.598 3.331 22.743 1.00 0.00 O \n+HETATM 1337 H1 HOH A 268 18.256 2.437 22.721 1.00 0.00 H \n+HETATM 1338 H2 HOH A 268 19.308 3.332 22.101 1.00 0.00 H \n+HETATM 1339 DOH2 HOH A 268 18.568 3.419 22.778 1.00 0.00 EP \n+HETATM 1340 OM HOH A 268 18.674 3.148 22.607 1.00 0.00 EP \n+HETATM 1341 O HOH A 269 13.055 14.853 3.165 1.00 0.00 O \n+HETATM 1342 H1 HOH A 269 13.205 14.864 2.220 1.00 0.00 H \n+HETATM 1343 H2 HOH A 269 12.512 14.078 3.312 1.00 0.00 H \n+HETATM 1344 DOH2 HOH A 269 13.093 14.924 3.241 1.00 0.00 EP \n+HETATM 1345 OM HOH A 269 12.975 14.696 3.001 1.00 0.00 EP \n+HETATM 1346 O HOH A 270 14.313 1.337 24.847 1.00 0.00 O \n+HETATM 1347 H1 HOH A 270 15.034 1.279 25.474 1.00 0.00 H \n+HETATM 1348 H2 HOH A 270 13.603 1.752 25.337 1.00 0.00 H \n+HETATM 1349 DOH2 HOH A 270 14.323 1.304 24.741 1.00 0.00 EP \n+HETATM 1350 OM HOH A 270 14.316 1.410 25.076 1.00 0.00 EP \n+HETATM 1351 O HOH A 271 9.809 10.274 20.962 1.00 0.00 O \n+HETATM 1352 H1 HOH A 271 9.867 9.326 20.838 1.00 0.00 H \n+HETATM 1353 H2 HOH A 271 9.544 10.380 21.876 1.00 0.00 H \n+HETATM 1354 DOH2 HOH A 271 9.829 10.338 20.879 1.00 0.00 EP \n+HETATM 1355 OM HOH A 271 9.767 10.101 21.124 1.00 0.00 EP \n+HETATM 1356 O HOH A 272 8.208 16.617 23.647 1.00 0.00 O \n+HETATM 1357 H1 HOH A 272 8.413 17.005 24.498 1.00 0.00 H \n+HETATM 1358 H2 HOH A 272 7.757 17.313 23.169 1.00 0.00 H \n+HETATM 1359 DOH2 HOH A 272 8.252 16.562 23.613 1.00 0.00 EP \n+HETATM 1360 OM HOH A 272 8.158 16.839 23.724 1.00 0.00 EP \n+HETATM 1361 O HOH A 273 7.083 7.905 5.831 1.00 0.00 O \n+HETATM 1362 H1 HOH A 273 6.466 8.636 5.874 1.00 0.00 H \n+HETATM 1363 H2 HOH A 273 7.923 8.285 6.090 1.00 0.00 H \n+HETATM 1364 DOH2 HOH A 273 7.058 7.809 5.794 1.00 0.00 EP \n+HETATM 1365 OM HOH A 273 7.129 8.133 5.893 1.00 0.00 EP \n+HETATM 1366 O HOH A 274 30.358 8.294 11.995 1.00 0.00 O \n+HETATM 1367 H1 HOH A 274 30.728 7.655 11.386 1.00 0.00 H \n+HETATM 1368 H2 HOH A 274 29.492 8.492 11.638 1.00 0.00 H \n+HETATM 1369 DOH2 HOH A 274 30.413 8.341 12.088 1.00 0.00 EP \n+HETATM 1370 OM HOH A 274 30.256 8.204 11.797 1.00 0.00 EP \n+HETATM 1371 O HOH A 275 20.513 9.590 2.178 1.00 0.00 O \n+HETATM 1372 H1 HOH A 275 21.234 9.668 2.803 1.00 0.00 H \n+HETATM 1373 H2 HOH A 275 20.938 9.591 1.321 1.00 0.00 H \n+HETATM 1374 DOH2 HOH A 275 20.439 9.584 2.184 1.00 0.00 EP \n+HETATM 1375 OM HOH A 275 20.748 9.606 2.130 1.00 0.00 EP \n+HETATM 1376 O HOH A 276 5.078 19.093 6.130 1.00 0.00 O \n+HETATM 1377 H1 HOH A 276 5.080 20.022 6.362 1.00 0.00 H \n+HETATM 1378 H2 HOH A 276 5.457 19.065 5.251 1.00 0.00 H \n+HETATM 1379 DOH2 HOH A 276 5.021 19.031 6.194 1.00 0.00 EP \n+HETATM 1380 OM HOH A 276 5.157 19.278 5.997 1.00 0.00 EP \n+HETATM 1381 O HOH A 277 0.981 28.854 0.866 1.00 0.00 O \n+HETATM 1382 H1 HOH A 277 1.417 29.513 0.327 1.00 0.00 H \n+HETATM 1383 H2 HOH A 277 1.152 28.026 0.417 1.00 0.00 H \n+HETATM 1384 DOH2 HOH A 277 0.947 28.845 0.973 1.00 0.00 EP \n+HETATM 1385 OM HOH A 277 1.106 28.819 0.663 1.00 0.00 EP \n+HETATM 1386 O HOH A 278 7.350 4.226 14.875 1.00 0.00 O \n+HETATM 1387 H1 HOH A 278 6.770 4.693 14.274 1.00 0.00 H \n+HETATM 1388 H2 HOH A 278 6.813 4.064 15.650 1.00 0.00 H \n+HETATM 1389 DOH2 HOH A 278 7.437 4.231 14.873 1.00 0.00 EP \n+HETATM 1390 OM HOH A 278 7.121 4.288 14.911 1.00 0.00 EP \n+HETATM 1391 O HOH A 279 14.948 7.974 25.570 1.00 0.00 O \n+HETATM 1392 H1 HOH A 279 14.156 7.438 25.539 1.00 0.00 H \n+HETATM 1393 H2 HOH A 279 15.351 7.758 26.411 1.00 0.00 H \n+HETATM 1394 DOH2 HOH A 279 14.969 8.045 25.496 1.00 0.00 EP \n+HETATM 1395 OM HOH A 279 14.868 7.820 25.736 1.00 0.00 EP \n+HETATM 1396 O HOH A 280 15.948 17.363 5.737 1.00 0.00 O \n+HETATM 1397 H1 HOH A 280 15.398 16.580 5.719 1.00 0.00 H \n+HETATM 1398 H2 HOH A 280 15.515 17.946 6.360 1.00 0.00 H \n+HETATM 1399 DOH2 HOH A 280 15.959 17.409 5.675 1.00 0.00 EP \n+HETATM 1400 OM HOH A 280 15.746 17.322 5.861 1.00 0.00 EP \n+HETATM 1401 O HOH A 281 1.603 9.978 25.500 1.00 0.00 O \n+HETATM 1402 H1 HOH A 281 2.445 10.121 25.932 1.00 0.00 H \n+HETATM 1403 H2 HOH A 281 1.785 10.109 24.569 1.00 0.00 H \n+HETATM 1404 DOH2 HOH A 281 1.536 9.922 25.553 1.00 0.00 EP \n+HETATM 1405 OM HOH A 281 1.813 10.034 25.398 1.00 0.00 EP \n+HETATM 1406 O HOH A 282 15.913 0.145 13.130 1.00 0.00 O \n+HETATM 1407 H1 HOH A 282 16.648 -0.390 13.431 1.00 0.00 H \n+HETATM 1408 H2 HOH A 282 16.049 0.996 13.546 1.00 0.00 H \n+HETATM 1409 DOH2 HOH A 282 15.844 0.133 13.032 1.00 0.00 EP \n+HETATM 1410 OM HOH A 282 16.092 0.210 13.277 1.00 0.00 EP \n+HETATM 1411 O HOH A 283 24.631 19.800 21.510 1.00 0.00 O \n+HETATM 1412 H1 HOH A 283 24.699 18.979 21.998 1.00 0.00 H \n+HETATM 1413 H2 HOH A 283 23.715 20.061 21.607 1.00 0.00 H \n+HETATM 1414 DOH2 HOH A 283 24.691 19.873 21.481 1.00 0.00 EP \n+HETATM 1415 OM HOH A 283 24.457 19.685 21.630 1.00 0.00 EP \n+HETATM 1416 O HOH A 284 13.566 18.729 10.967 1.00 0.00 O \n+HETATM 1417 H1 HOH A 284 13.707 19.064 11.853 1.00 0.00 H \n+HETATM 1418 H2 HOH A 284 13.655 17.779 11.053 1.00 0.00 H \n+HETATM 1419 DOH2 HOH A 284 13.558 18.773 10.927 1.00 0.00 EP \n+HETATM 1420 OM HOH A 284 13.613 18.603 11.166 1.00 0.00 EP \n+HETATM 1421 O HOH A 285 4.716 3.786 26.890 1.00 0.00 O \n+HETATM 1422 H1 HOH A 285 3.914 3.906 27.398 1.00 0.00 H \n+HETATM 1423 H2 HOH A 285 5.270 4.526 27.138 1.00 0.00 H \n+HETATM 1424 DOH2 HOH A 285 4.742 3.706 26.829 1.00 0.00 EP \n+HETATM 1425 OM HOH A 285 4.665 3.962 27.045 1.00 0.00 EP \n+HETATM 1426 O HOH A 286 5.750 12.964 23.378 1.00 0.00 O \n+HETATM 1427 H1 HOH A 286 5.489 13.885 23.358 1.00 0.00 H \n+HETATM 1428 H2 HOH A 286 5.943 12.750 22.465 1.00 0.00 H \n+HETATM 1429 DOH2 HOH A 286 5.755 12.911 23.474 1.00 0.00 EP \n+HETATM 1430 OM HOH A 286 5.736 13.109 23.187 1.00 0.00 EP \n+HETATM 1431 O HOH A 287 21.075 1.512 23.952 1.00 0.00 O \n+HETATM 1432 H1 HOH A 287 20.717 1.138 23.147 1.00 0.00 H \n+HETATM 1433 H2 HOH A 287 20.637 1.033 24.655 1.00 0.00 H \n+HETATM 1434 DOH2 HOH A 287 21.148 1.571 23.956 1.00 0.00 EP \n+HETATM 1435 OM HOH A 287 20.912 1.337 23.931 1.00 0.00 EP \n+HETATM 1436 O HOH A 288 15.125 23.033 10.366 1.00 0.00 O \n+HETATM 1437 H1 HOH A 288 15.529 23.439 9.599 1.00 0.00 H \n+HETATM 1438 H2 HOH A 288 15.344 22.104 10.289 1.00 0.00 H \n+HETATM 1439 DOH2 HOH A 288 15.065 23.080 10.442 1.00 0.00 EP \n+HETATM 1440 OM HOH A 288 15.253 22.926 10.193 1.00 0.00 EP \n+HETATM 1441 O HOH A 289 15.309 12.250 16.503 1.00 0.00 O \n+HETATM 1442 H1 HOH A 289 15.299 13.187 16.696 1.00 0.00 H \n+HETATM 1443 H2 HOH A 289 16.074 11.916 16.973 1.00 0.00 H \n+HETATM 1444 DOH2 HOH A 289 15.234 12.196 16.438 1.00 0.00 EP \n+HETATM 1445 OM HOH A 289 15.464 12.374 16.639 1.00 0.00 EP \n+HETATM 1446 O HOH A 290 22.128 17.422 24.015 1.00 0.00 O \n+HETATM 1447 H1 HOH A 290 21.918 16.656 24.549 1.00 0.00 H \n+HETATM 1448 H2 HOH A 290 22.421 18.080 24.645 1.00 0.00 H \n+HETATM 1449 DOH2 HOH A 290 22.149 17.417 23.912 1.00 0.00 EP \n+HETATM 1450 OM HOH A 290 22.145 17.400 24.254 1.00 0.00 EP \n+HETATM 1451 O HOH A 291 10.153 16.597 0.259 1.00 0.00 O \n+HETATM 1452 H1 HOH A 291 10.997 16.772 -0.157 1.00 0.00 H \n+HETATM 1453 H2 HOH A 291 10.251 16.931 1.151 1.00 0.00 H \n+HETATM 1454 DOH2 HOH A 291 10.061 16.566 0.203 1.00 0.00 EP \n+HETATM 1455 OM HOH A 291 10.346 16.701 0.357 1.00 0.00 EP \n+HETATM 1456 O HOH A 292 10.413 27.758 25.219 1.00 0.00 O \n+HETATM 1457 H1 HOH A 292 10.799 27.705 24.345 1.00 0.00 H \n+HETATM 1458 H2 HOH A 292 10.904 28.454 25.656 1.00 0.00 H \n+HETATM 1459 DOH2 HOH A 292 10.360 27.728 25.244 1.00 0.00 EP \n+HETATM 1460 OM HOH A 292 10.593 27.890 25.129 1.00 0.00 EP \n+HETATM 1461 O HOH A 293 7.607 11.813 25.074 1.00 0.00 O \n+HETATM 1462 H1 HOH A 293 6.950 12.293 24.568 1.00 0.00 H \n+HETATM 1463 H2 HOH A 293 7.722 12.332 25.869 1.00 0.00 H \n+HETATM 1464 DOH2 HOH A 293 7.647 11.701 25.052 1.00 0.00 EP \n+HETATM 1465 OM HOH A 293 7.496 12.018 25.133 1.00 0.00 EP \n+HETATM 1466 O HOH A 294 -0.146 8.553 20.296 1.00 0.00 O \n+HETATM 1467 H1 HOH A 294 -0.256 7.682 20.680 1.00 0.00 H \n+HETATM 1468 H2 HOH A 294 -0.436 9.155 20.981 1.00 0.00 H \n+HETATM 1469 DOH2 HOH A 294 -0.136 8.574 20.175 1.00 0.00 EP \n+HETATM 1470 OM HOH A 294 -0.228 8.498 20.516 1.00 0.00 EP \n+HETATM 1471 O HOH A 295 10.800 10.228 18.398 1.00 0.00 O \n+HETATM 1472 H1 HOH A 295 10.136 9.714 17.938 1.00 0.00 H \n+HETATM 1473 H2 HOH A 295 10.475 10.291 19.296 1.00 0.00 H \n+HETATM 1474 DOH2 HOH A 295 10.860 10.283 18.355 1.00 0.00 EP \n+HETATM 1475 OM HOH A 295 10.597 10.136 18.488 1.00 0.00 EP \n+HETATM 1476 O HOH A 296 13.366 20.913 0.420 1.00 0.00 O \n+HETATM 1477 H1 HOH A 296 12.573 20.513 0.063 1.00 0.00 H \n+HETATM 1478 H2 HOH A 296 13.968 20.955 -0.323 1.00 0.00 H \n+HETATM 1479 DOH2 HOH A 296 13.386 20.920 0.503 1.00 0.00 EP \n+HETATM 1480 OM HOH A 296 13.327 20.840 0.194 1.00 0.00 EP \n+HETATM 1481 O HOH A 297 10.927 10.154 14.782 1.00 0.00 O \n+HETATM 1482 H1 HOH A 297 11.876 10.264 14.842 1.00 0.00 H \n+HETATM 1483 H2 HOH A 297 10.784 9.220 14.935 1.00 0.00 H \n+HETATM 1484 DOH2 HOH A 297 10.877 10.198 14.749 1.00 0.00 EP \n+HETATM 1485 OM HOH A 297 11.092 9.985 14.826 1.00 0.00 EP \n+HETATM 1486 O HOH A 298 3.709 7.332 26.139 1.00 0.00 O \n+HETATM 1487 H1 HOH A 298 4.464 6.751 26.228 1.00 0.00 H \n+HETATM 1488 H2 HOH A 298 3.463 7.266 25.216 1.00 0.00 H \n+HETATM 1489 DOH2 HOH A 298 3.684 7.383 26.217 1.00 0.00 EP \n+HETATM 1490 OM HOH A 298 3.813 7.199 25.968 1.00 0.00 EP \n+HETATM 1491 O HOH A 299 19.978 16.344 13.264 1.00 0.00 O \n+HETATM 1492 H1 HOH A 299 20.789 16.844 13.353 1.00 0.00 H \n+HETATM 1493 H2 HOH A 299 19.743 16.106 14.161 1.00 0.00 H \n+HETATM 1494 DOH2 HOH A 299 19.924 16.311 13.175 1.00 0.00 EP \n+HETATM 1495 OM HOH A 299 20.096 16.398 13.466 1.00 0.00 EP \n+HETATM 1496 O HOH A 300 0.805 14.275 29.154 1.00 0.00 O \n+HETATM 1497 H1 HOH A 300 1.368 14.893 28.688 1.00 0.00 H \n+HETATM 1498 H2 HOH A 300 0.903 14.509 30.077 1.00 0.00 H \n+HETATM 1499 DOH2 HOH A 300 0.721 14.231 29.104 1.00 0.00 EP \n+HETATM 1500 OM HOH A 300 0.941 14.450 29.248 1.00 0.00 EP \n+HETATM 1501 O HOH A 301 11.863 13.222 28.680 1.00 0.00 O \n+HETATM 1502 H1 HOH A 301 11.174 13.776 28.313 1.00 0.00 H \n+HETATM 1503 H2 HOH A 301 12.430 13.020 27.935 1.00 0.00 H \n+HETATM 1504 DOH2 HOH A 301 11.876 13.226 28.794 1.00 0.00 EP \n+HETATM 1505 OM HOH A 301 11.838 13.294 28.452 1.00 0.00 EP \n+HETATM 1506 O HOH A 302 29.520 0.818 18.596 1.00 0.00 O \n+HETATM 1507 H1 HOH A 302 29.192 -0.002 18.966 1.00 0.00 H \n+HETATM 1508 H2 HOH A 302 29.381 1.465 19.287 1.00 0.00 H \n+HETATM 1509 DOH2 HOH A 302 29.522 0.848 18.521 1.00 0.00 EP \n+HETATM 1510 OM HOH A 302 29.424 0.782 18.814 1.00 0.00 EP \n+HETATM 1511 O HOH A 303 17.528 17.808 22.651 1.00 0.00 O \n+HETATM 1512 H1 HOH A 303 16.998 18.501 22.257 1.00 0.00 H \n+HETATM 1513 H2 HOH A 303 17.892 18.205 23.443 1.00 0.00 H \n+HETATM 1514 DOH2 HOH A 303 17.516 17.704 22.617 1.00 0.00 EP \n+HETATM 1515 OM HOH A 303 17.494 18.031 22.733 1.00 0.00 EP \n+HETATM 1516 O HOH A 304 28.270 11.595 1.306 1.00 0.00 O \n+HETATM 1517 H1 HOH A 304 28.249 12.164 2.076 1.00 0.00 H \n+HETATM 1518 H2 HOH A 304 28.479 10.728 1.654 1.00 0.00 H \n+HETATM 1519 DOH2 HOH A 304 28.238 11.603 1.204 1.00 0.00 EP \n+HETATM 1520 OM HOH A 304 28.309 11.534 1.536 1.00 0.00 EP \n+HETATM 1521 O HOH A 305 15.729 3.196 1.233 1.00 0.00 O \n+HETATM 1522 H1 HOH A 305 16.046 2.316 1.030 1.00 0.00 H \n+HETATM 1523 H2 HOH A 305 15.241 3.461 0.454 1.00 0.00 H \n+HETATM 1524 DOH2 HOH A 305 15.776 3.234 1.276 1.00 0.00 EP \n+HETATM 1525 OM HOH A 305 15.694 3.070 1.032 1.00 0.00 EP \n+HETATM 1526 O HOH A 306 1.166 2.694 24.192 1.00 0.00 O \n+HETATM 1527 H1 HOH A 306 0.722 2.031 23.663 1.00 0.00 H \n+HETATM 1528 H2 HOH A 306 1.746 3.143 23.577 1.00 0.00 H \n+HETATM 1529 DOH2 HOH A 306 1.122 2.747 24.270 1.00 0.00 EP \n+HETATM 1530 OM HOH A 306 1.194 2.650 23.958 1.00 0.00 EP \n+HETATM 1531 O HOH A 307 14.344 19.024 17.405 1.00 0.00 O \n+HETATM 1532 H1 HOH A 307 14.009 19.767 16.903 1.00 0.00 H \n+HETATM 1533 H2 HOH A 307 14.485 18.338 16.753 1.00 0.00 H \n+HETATM 1534 DOH2 HOH A 307 14.341 19.003 17.521 1.00 0.00 EP \n+HETATM 1535 OM HOH A 307 14.304 19.036 17.168 1.00 0.00 EP \n+HETATM 1536 O HOH A 308 9.988 7.502 14.804 1.00 0.00 O \n+HETATM 1537 H1 HOH A 308 9.973 6.677 15.289 1.00 0.00 H \n+HETATM 1538 H2 HOH A 308 9.643 7.279 13.939 1.00 0.00 H \n+HETATM 1539 DOH2 HOH A 308 9.997 7.602 14.863 1.00 0.00 EP \n+HETATM 1540 OM HOH A 308 9.914 7.287 14.726 1.00 0.00 EP \n+HETATM 1541 O HOH A 309 15.113 28.315 20.707 1.00 0.00 O \n+HETATM 1542 H1 HOH A 309 14.778 27.432 20.552 1.00 0.00 H \n+HETATM 1543 H2 HOH A 309 14.848 28.518 21.604 1.00 0.00 H \n+HETATM 1544 DOH2 HOH A 309 15.146 28.364 20.639 1.00 0.00 EP \n+HETATM 1545 OM HOH A 309 14.990 28.175 20.859 1.00 0.00 EP \n+HETATM 1546 O HOH A 310 14.755 4.883 26.474 1.00 0.00 O \n+HETATM 1547 H1 HOH A 310 13.983 5.405 26.258 1.00 0.00 H \n+HETATM 1548 H2 HOH A 310 15.178 4.719 25.631 1.00 0.00 H \n+HETATM 1549 DOH2 HOH A 310 14.766 4.879 26.585 1.00 0.00 EP \n+HETATM 1550 OM HOH A 310 14.683 4.957 26.257 1.00 0.00 EP \n+HETATM 1551 O HOH A 311 17.687 30.706 22.568 1.00 0.00 O \n+HETATM 1552 H1 HOH A 311 18.523 30.537 22.133 1.00 0.00 H \n+HETATM 1553 H2 HOH A 311 17.524 29.918 23.088 1.00 0.00 H \n+HETATM 1554 DOH2 HOH A 311 17.644 30.800 22.566 1.00 0.00 EP \n+HETATM 1555 OM HOH A 311 17.825 30.509 22.585 1.00 0.00 EP \n+HETATM 1556 O HOH A 312 9.230 8.175 27.766 1.00 0.00 O \n+HETATM 1557 H1 HOH A 312 8.561 8.568 27.205 1.00 0.00 H \n+HETATM 1558 H2 HOH A 312 10.060 8.478 27.397 1.00 0.00 H \n+HETATM 1559 DOH2 HOH A 312 9.218 8.112 27.851 1.00 0.00 EP \n+HETATM 1560 OM HOH A 312 9.263 8.318 27.575 1.00 0.00 EP \n+HETATM 1561 O HOH A 313 8.119 7.015 18.905 1.00 0.00 O \n+HETATM 1562 H1 HOH A 313 8.368 6.104 18.749 1.00 0.00 H \n+HETATM 1563 H2 HOH A 313 8.700 7.307 19.607 1.00 0.00 H \n+HETATM 1564 DOH2 HOH A 313 8.057 7.080 18.840 1.00 0.00 EP \n+HETATM 1565 OM HOH A 313 8.289 6.888 19.017 1.00 0.00 EP \n+HETATM 1566 O HOH A 314 16.568 30.411 5.448 1.00 0.00 O \n+HETATM 1567 H1 HOH A 314 16.833 29.612 5.904 1.00 0.00 H \n+HETATM 1568 H2 HOH A 314 15.987 30.108 4.751 1.00 0.00 H \n+HETATM 1569 DOH2 HOH A 314 16.601 30.509 5.461 1.00 0.00 EP \n+HETATM 1570 OM HOH A 314 16.503 30.185 5.399 1.00 0.00 EP \n+HETATM 1571 O HOH A 315 9.752 26.493 4.669 1.00 0.00 O \n+HETATM 1572 H1 HOH A 315 8.882 26.626 4.293 1.00 0.00 H \n+HETATM 1573 H2 HOH A 315 10.315 27.106 4.197 1.00 0.00 H \n+HETATM 1574 DOH2 HOH A 315 9.766 26.457 4.744 1.00 0.00 EP \n+HETATM 1575 OM HOH A 315 9.689 26.646 4.495 1.00 0.00 EP \n+HETATM 1576 O HOH A 316 18.327 29.269 28.152 1.00 0.00 O \n+HETATM 1577 H1 HOH A 316 17.926 28.422 27.960 1.00 0.00 H \n+HETATM 1578 H2 HOH A 316 18.698 29.166 29.029 1.00 0.00 H \n+HETATM 1579 DOH2 HOH A 316 18.331 29.345 28.065 1.00 0.00 EP \n+HETATM 1580 OM HOH A 316 18.321 29.074 28.293 1.00 0.00 EP \n+HETATM 1581 O HOH A 317 1.442 6.642 10.043 1.00 0.00 O \n+HETATM 1582 H1 HOH A 317 0.840 6.476 9.318 1.00 0.00 H \n+HETATM 1583 H2 HOH A 317 2.037 7.316 9.713 1.00 0.00 H \n+HETATM 1584 DOH2 HOH A 317 1.431 6.625 10.125 1.00 0.00 EP \n+HETATM 1585 OM HOH A 317 1.440 6.746 9.827 1.00 0.00 EP \n+HETATM 1586 O HOH A 318 11.419 22.489 20.657 1.00 0.00 O \n+HETATM 1587 H1 HOH A 318 11.838 21.660 20.889 1.00 0.00 H \n+HETATM 1588 H2 HOH A 318 10.693 22.239 20.085 1.00 0.00 H \n+HETATM 1589 DOH2 HOH A 318 11.425 22.563 20.735 1.00 0.00 EP \n+HETATM 1590 OM HOH A 318 11.356 22.268 20.587 1.00 0.00 EP \n+HETATM 1591 O HOH A 319 10.530 25.754 7.181 1.00 0.00 O \n+HETATM 1592 H1 HOH A 319 10.288 26.548 7.658 1.00 0.00 H \n+HETATM 1593 H2 HOH A 319 10.188 25.893 6.297 1.00 0.00 H \n+HETATM 1594 DOH2 HOH A 319 10.617 25.687 7.212 1.00 0.00 EP \n+HETATM 1595 OM HOH A 319 10.410 25.945 7.097 1.00 0.00 EP \n+HETATM 1596 O HOH A 320 3.234 18.536 10.668 1.00 0.00 O \n+HETATM 1597 H1 HOH A 320 3.711 19.160 11.215 1.00 0.00 H \n+HETATM 1598 H2 HOH A 320 3.824 18.360 9.935 1.00 0.00 H \n+HETATM 1599 DOH2 HOH A 320 3.150 18.479 10.694 1.00 0.00 EP \n+HETATM 1600 OM HOH A 320 3.453 18.628 10.630 1.00 0.00 EP \n+HETATM 1601 O HOH A 321 14.375 15.113 5.546 1.00 0.00 O \n+HETATM 1602 H1 HOH A 321 14.551 14.183 5.688 1.00 0.00 H \n+HETATM 1603 H2 HOH A 321 13.889 15.143 4.722 1.00 0.00 H \n+HETATM 1604 DOH2 HOH A 321 14.403 15.201 5.627 1.00 0.00 EP \n+HETATM 1605 OM HOH A 321 14.312 14.928 5.406 1.00 0.00 EP \n+HETATM 1606 O HOH A 322 2.199 4.536 11.883 1.00 0.00 O \n+HETATM 1607 H1 HOH A 322 1.933 5.126 11.178 1.00 0.00 H \n+HETATM 1608 H2 HOH A 322 2.136 5.066 12.677 1.00 0.00 H \n+HETATM 1609 DOH2 HOH A 322 2.209 4.439 11.896 1.00 0.00 EP \n+HETATM 1610 OM HOH A 322 2.132 4.766 11.901 1.00 0.00 EP \n+HETATM 1611 O HOH A 323 9.720 28.261 8.210 1.00 0.00 O \n+HETATM 1612 H1 HOH A 323 9.548 28.741 7.400 1.00 0.00 H \n+HETATM 1613 H2 HOH A 323 9.211 28.724 8.876 1.00 0.00 H \n+HETATM 1614 DOH2 HOH A 323 9.791 28.202 8.221 1.00 0.00 EP \n+HETATM 1615 OM HOH A 323 9.580 28.454 8.181 1.00 0.00 EP \n+HETATM 1616 O HOH A 324 12.462 20.050 21.477 1.00 0.00 O \n+HETATM 1617 H1 HOH A 324 11.882 19.309 21.304 1.00 0.00 H \n+HETATM 1618 H2 HOH A 324 12.891 19.831 22.304 1.00 0.00 H \n+HETATM 1619 DOH2 HOH A 324 12.485 20.139 21.407 1.00 0.00 EP \n+HETATM 1620 OM HOH A 324 12.431 19.853 21.611 1.00 0.00 EP \n+HETATM 1621 O HOH A 325 27.606 26.292 12.265 1.00 0.00 O \n+HETATM 1622 H1 HOH A 325 27.737 26.811 13.059 1.00 0.00 H \n+HETATM 1623 H2 HOH A 325 26.673 26.380 12.073 1.00 0.00 H \n+HETATM 1624 DOH2 HOH A 325 27.656 26.229 12.192 1.00 0.00 EP \n+HETATM 1625 OM HOH A 325 27.441 26.417 12.389 1.00 0.00 EP \n+HETATM 1626 O HOH A 326 14.159 6.113 2.333 1.00 0.00 O \n+HETATM 1627 H1 HOH A 326 13.486 5.675 1.814 1.00 0.00 H \n+HETATM 1628 H2 HOH A 326 14.325 5.517 3.064 1.00 0.00 H \n+HETATM 1629 DOH2 HOH A 326 14.216 6.151 2.301 1.00 0.00 EP \n+HETATM 1630 OM HOH A 326 14.055 5.901 2.377 1.00 0.00 EP \n+HETATM 1631 O HOH A 327 5.814 29.443 18.424 1.00 0.00 O \n+HETATM 1632 H1 HOH A 327 5.906 29.885 19.268 1.00 0.00 H \n+HETATM 1633 H2 HOH A 327 5.417 30.101 17.852 1.00 0.00 H \n+HETATM 1634 DOH2 HOH A 327 5.821 29.331 18.407 1.00 0.00 EP \n+HETATM 1635 OM HOH A 327 5.751 29.669 18.479 1.00 0.00 EP \n+HETATM 1636 O HOH A 328 10.853 19.775 5.802 1.00 0.00 O \n+HETATM 1637 H1 HOH A 328 10.137 19.320 5.359 1.00 0.00 H \n+HETATM 1638 H2 HOH A 328 10.421 20.450 6.326 1.00 0.00 H \n+HETATM 1639 DOH2 HOH A 328 10.945 19.752 5.824 1.00 0.00 EP \n+HETATM 1640 OM HOH A 328 10.617 19.820 5.819 1.00 0.00 EP \n+HETATM 1641 O HOH A 329 13.027 4.187 5.023 1.00 0.00 O \n+HETATM 1642 H1 HOH A 329 13.472 4.720 5.682 1.00 0.00 H \n+HETATM 1643 H2 HOH A 329 12.696 3.432 5.509 1.00 0.00 H \n+HETATM 1644 DOH2 HOH A 329 13.011 4.185 4.949 1.00 0.00 EP \n+HETATM 1645 OM HOH A 329 13.050 4.142 5.258 1.00 0.00 EP \n+HETATM 1646 O HOH A 330 3.429 24.949 19.704 1.00 0.00 O \n+HETATM 1647 H1 HOH A 330 4.231 24.437 19.603 1.00 0.00 H \n+HETATM 1648 H2 HOH A 330 3.663 25.825 19.398 1.00 0.00 H \n+HETATM 1649 DOH2 HOH A 330 3.337 24.905 19.741 1.00 0.00 EP \n+HETATM 1650 OM HOH A 330 3.641 25.024 19.620 1.00 0.00 EP \n+HETATM 1651 O HOH A 331 -0.475 22.444 4.943 1.00 0.00 O \n+HETATM 1652 H1 HOH A 331 0.317 21.941 4.755 1.00 0.00 H \n+HETATM 1653 H2 HOH A 331 -1.191 21.823 4.809 1.00 0.00 H \n+HETATM 1654 DOH2 HOH A 331 -0.498 22.529 4.979 1.00 0.00 EP \n+HETATM 1655 OM HOH A 331 -0.460 22.214 4.877 1.00 0.00 EP \n+HETATM 1656 O HOH A 332 15.714 24.755 5.544 1.00 0.00 O \n+HETATM 1657 H1 HOH A 332 15.554 24.304 4.715 1.00 0.00 H \n+HETATM 1658 H2 HOH A 332 14.864 25.124 5.784 1.00 0.00 H \n+HETATM 1659 DOH2 HOH A 332 15.803 24.769 5.604 1.00 0.00 EP \n+HETATM 1660 OM HOH A 332 15.507 24.738 5.423 1.00 0.00 EP \n+HETATM 1661 O HOH A 333 14.328 20.130 13.318 1.00 0.00 O \n+HETATM 1662 H1 HOH A 333 14.933 20.837 13.097 1.00 0.00 H \n+HETATM 1663 H2 HOH A 333 14.893 19.382 13.510 1.00 0.00 H \n+HETATM 1664 DOH2 HOH A 333 14.218 20.126 13.315 1.00 0.00 EP \n+HETATM 1665 OM HOH A 333 14.568 20.121 13.312 1.00 0.00 EP \n+HETATM 1666 O HOH A 334 18.178 21.348 21.388 1.00 0.00 O \n+HETATM 1667 H1 HOH A 334 17.848 22.097 21.884 1.00 0.00 H \n+HETATM 1668 H2 HOH A 334 17.432 20.751 21.330 1.00 0.00 H \n+HETATM 1669 DOH2 HOH A 334 18.267 21.332 21.316 1.00 0.00 EP \n+HETATM 1670 OM HOH A 334 17.957 21.379 21.478 1.00 0.00 EP \n+HETATM 1671 O HOH A 335 12.315 24.785 21.835 1.00 0.00 O \n+HETATM 1672 H1 HOH A 335 12.047 23.981 21.390 1.00 0.00 H \n+HETATM 1673 H2 HOH A 335 12.930 25.201 21.231 1.00 0.00 H \n+HETATM 1674 DOH2 HOH A 335 12.301 24.803 21.897 1.00 0.00 EP \n+HETATM 1675 OM HOH A 335 12.386 24.705 21.620 1.00 0.00 EP \n+HETATM 1676 O HOH A 336 3.798 22.105 16.019 1.00 0.00 O \n+HETATM 1677 H1 HOH A 336 4.612 22.426 16.408 1.00 0.00 H \n+HETATM 1678 H2 HOH A 336 3.861 21.152 16.082 1.00 0.00 H \n+HETATM 1679 DOH2 HOH A 336 3.738 22.136 15.975 1.00 0.00 EP \n+HETATM 1680 OM HOH A 336 3.978 21.976 16.112 1.00 0.00 EP \n+HETATM 1681 O HOH A 337 5.043 21.669 6.913 1.00 0.00 O \n+HETATM 1682 H1 HOH A 337 5.818 21.894 7.428 1.00 0.00 H \n+HETATM 1683 H2 HOH A 337 4.344 22.210 7.281 1.00 0.00 H \n+HETATM 1684 DOH2 HOH A 337 5.035 21.591 6.820 1.00 0.00 EP \n+HETATM 1685 OM HOH A 337 5.059 21.826 7.094 1.00 0.00 EP \n+HETATM 1686 O HOH A 338 30.586 22.131 29.723 1.00 0.00 O \n+HETATM 1687 H1 HOH A 338 30.097 22.570 30.419 1.00 0.00 H \n+HETATM 1688 H2 HOH A 338 30.053 21.369 29.499 1.00 0.00 H \n+HETATM 1689 DOH2 HOH A 338 30.669 22.163 29.675 1.00 0.00 EP \n+HETATM 1690 OM HOH A 338 30.376 22.065 29.820 1.00 0.00 EP \n+HETATM 1691 O HOH A 339 17.226 28.070 6.807 1.00 0.00 O \n+HETATM 1692 H1 HOH A 339 16.721 27.609 7.477 1.00 0.00 H \n+HETATM 1693 H2 HOH A 339 17.629 27.374 6.288 1.00 0.00 H \n+HETATM 1694 DOH2 HOH A 339 17.243 28.160 6.815 1.00 0.00 EP \n+HETATM 1695 OM HOH A 339 17.205 27.833 6.838 1.00 0.00 EP \n+HETATM 1696 O HOH A 340 2.362 18.604 5.862 1.00 0.00 O \n+HETATM 1697 H1 HOH A 340 2.015 18.426 6.736 1.00 0.00 H \n+HETATM 1698 H2 HOH A 340 3.301 18.733 5.998 1.00 0.00 H \n+HETATM 1699 DOH2 HOH A 340 2.318 18.612 5.766 1.00 0.00 EP \n+HETATM 1700 OM HOH A 340 2.483 18.594 6.069 1.00 0.00 EP \n+HETATM 1701 O HOH A 341 13.968 27.857 7.250 1.00 0.00 O \n+HETATM 1702 H1 HOH A 341 14.668 27.514 7.805 1.00 0.00 H \n+HETATM 1703 H2 HOH A 341 13.654 27.095 6.762 1.00 0.00 H \n+HETATM 1704 DOH2 HOH A 341 13.923 27.950 7.251 1.00 0.00 EP \n+HETATM 1705 OM HOH A 341 14.047 27.631 7.264 1.00 0.00 EP \n+HETATM 1706 O HOH A 342 25.025 24.640 13.608 1.00 0.00 O \n+HETATM 1707 H1 HOH A 342 25.592 23.935 13.293 1.00 0.00 H \n+HETATM 1708 H2 HOH A 342 24.932 25.226 12.858 1.00 0.00 H \n+HETATM 1709 DOH2 HOH A 342 24.982 24.660 13.693 1.00 0.00 EP \n+HETATM 1710 OM HOH A 342 25.122 24.615 13.390 1.00 0.00 EP \n+HETATM 1711 O HOH A 343 6.072 18.861 3.533 1.00 0.00 O \n+HETATM 1712 H1 HOH A 343 5.834 19.482 2.844 1.00 0.00 H \n+HETATM 1713 H2 HOH A 343 5.621 18.051 3.293 1.00 0.00 H \n+HETATM 1714 DOH2 HOH A 343 6.122 18.846 3.628 1.00 0.00 EP \n+HETATM 1715 OM HOH A 343 5.931 18.822 3.342 1.00 0.00 EP \n+HETATM 1716 O HOH A 344 5.276 26.585 29.920 1.00 0.00 O \n+HETATM 1717 H1 HOH A 344 4.678 27.135 29.415 1.00 0.00 H \n+HETATM 1718 H2 HOH A 344 4.795 26.382 30.723 1.00 0.00 H \n+HETATM 1719 DOH2 HOH A 344 5.378 26.605 29.923 1.00 0.00 EP \n+HETATM 1720 OM HOH A 344 5.055 26.656 29.981 1.00 0.00 EP \n+HETATM 1721 O HOH A 345 16.101 19.617 21.088 1.00 0.00 O \n+HETATM 1722 H1 HOH A 345 16.111 18.859 20.503 1.00 0.00 H \n+HETATM 1723 H2 HOH A 345 15.458 20.210 20.699 1.00 0.00 H \n+HETATM 1724 DOH2 HOH A 345 16.181 19.635 21.152 1.00 0.00 EP \n+HETATM 1725 OM HOH A 345 15.971 19.583 20.888 1.00 0.00 EP \n+HETATM 1726 O HOH A 346 6.966 22.540 3.384 1.00 0.00 O \n+HETATM 1727 H1 HOH A 346 6.980 23.335 2.850 1.00 0.00 H \n+HETATM 1728 H2 HOH A 346 7.594 22.711 4.085 1.00 0.00 H \n+HETATM 1729 DOH2 HOH A 346 6.928 22.471 3.367 1.00 0.00 EP \n+HETATM 1730 OM HOH A 346 7.098 22.738 3.418 1.00 0.00 EP \n+HETATM 1731 O HOH A 347 10.348 22.799 17.170 1.00 0.00 O \n+HETATM 1732 H1 HOH A 347 9.952 22.408 17.949 1.00 0.00 H \n+HETATM 1733 H2 HOH A 347 10.427 22.074 16.551 1.00 0.00 H \n+HETATM 1734 DOH2 HOH A 347 10.373 22.882 17.146 1.00 0.00 EP \n+HETATM 1735 OM HOH A 347 10.283 22.570 17.203 1.00 0.00 EP \n+HETATM 1736 O HOH A 348 16.068 24.713 13.689 1.00 0.00 O \n+HETATM 1737 H1 HOH A 348 16.806 24.503 13.116 1.00 0.00 H \n+HETATM 1738 H2 HOH A 348 15.293 24.557 13.148 1.00 0.00 H \n+HETATM 1739 DOH2 HOH A 348 16.065 24.729 13.783 1.00 0.00 EP \n+HETATM 1740 OM HOH A 348 16.061 24.638 13.460 1.00 0.00 EP \n+HETATM 1741 O HOH A 349 9.834 5.452 6.526 1.00 0.00 O \n+HETATM 1742 H1 HOH A 349 9.737 6.113 5.841 1.00 0.00 H \n+HETATM 1743 H2 HOH A 349 9.772 4.616 6.064 1.00 0.00 H \n+HETATM 1744 DOH2 HOH A 349 9.854 5.444 6.621 1.00 0.00 EP \n+HETATM 1745 OM HOH A 349 9.801 5.416 6.291 1.00 0.00 EP \n+HETATM 1746 O HOH A 350 4.646 20.278 12.247 1.00 0.00 O \n+HETATM 1747 H1 HOH A 350 4.197 21.071 12.539 1.00 0.00 H \n+HETATM 1748 H2 HOH A 350 5.102 19.960 13.026 1.00 0.00 H \n+HETATM 1749 DOH2 HOH A 350 4.650 20.222 12.137 1.00 0.00 EP \n+HETATM 1750 OM HOH A 350 4.647 20.375 12.466 1.00 0.00 EP \n+HETATM 1751 O HOH A 351 3.948 15.024 2.265 1.00 0.00 O \n+HETATM 1752 H1 HOH A 351 4.296 15.769 1.776 1.00 0.00 H \n+HETATM 1753 H2 HOH A 351 4.396 15.061 3.110 1.00 0.00 H \n+HETATM 1754 DOH2 HOH A 351 3.885 14.957 2.243 1.00 0.00 EP \n+HETATM 1755 OM HOH A 351 4.111 15.184 2.338 1.00 0.00 EP \n+HETATM 1756 O HOH A 352 4.890 17.918 8.576 1.00 0.00 O \n+HETATM 1757 H1 HOH A 352 4.975 18.336 7.719 1.00 0.00 H \n+HETATM 1758 H2 HOH A 352 4.527 17.052 8.385 1.00 0.00 H \n+HETATM 1759 DOH2 HOH A 352 4.889 17.978 8.684 1.00 0.00 EP \n+HETATM 1760 OM HOH A 352 4.833 17.826 8.361 1.00 0.00 EP \n+HETATM 1761 O HOH A 353 11.799 29.662 14.096 1.00 0.00 O \n+HETATM 1762 H1 HOH A 353 12.437 29.070 14.494 1.00 0.00 H \n+HETATM 1763 H2 HOH A 353 11.704 30.374 14.729 1.00 0.00 H \n+HETATM 1764 DOH2 HOH A 353 11.780 29.656 13.977 1.00 0.00 EP \n+HETATM 1765 OM HOH A 353 11.911 29.687 14.307 1.00 0.00 EP \n+HETATM 1766 O HOH A 354 10.730 29.642 0.979 1.00 0.00 O \n+HETATM 1767 H1 HOH A 354 10.782 29.256 0.104 1.00 0.00 H \n+HETATM 1768 H2 HOH A 354 9.901 30.120 0.982 1.00 0.00 H \n+HETATM 1769 DOH2 HOH A 354 10.813 29.644 1.083 1.00 0.00 EP \n+HETATM 1770 OM HOH A 354 10.571 29.661 0.800 1.00 0.00 EP \n+HETATM 1771 O HOH A 355 9.858 14.288 18.000 1.00 0.00 O \n+HETATM 1772 H1 HOH A 355 9.757 13.524 17.433 1.00 0.00 H \n+HETATM 1773 H2 HOH A 355 10.788 14.510 17.940 1.00 0.00 H \n+HETATM 1774 DOH2 HOH A 355 9.774 14.331 18.036 1.00 0.00 EP \n+HETATM 1775 OM HOH A 355 10.028 14.177 17.871 1.00 0.00 EP \n+HETATM 1776 O HOH A 356 7.020 24.754 6.399 1.00 0.00 O \n+HETATM 1777 H1 HOH A 356 7.665 24.295 5.860 1.00 0.00 H \n+HETATM 1778 H2 HOH A 356 6.439 25.179 5.768 1.00 0.00 H \n+HETATM 1779 DOH2 HOH A 356 7.005 24.755 6.487 1.00 0.00 EP \n+HETATM 1780 OM HOH A 356 7.033 24.747 6.159 1.00 0.00 EP \n+HETATM 1781 O HOH A 357 1.404 17.405 3.600 1.00 0.00 O \n+HETATM 1782 H1 HOH A 357 1.761 17.889 4.346 1.00 0.00 H \n+HETATM 1783 H2 HOH A 357 1.757 17.854 2.832 1.00 0.00 H \n+HETATM 1784 DOH2 HOH A 357 1.348 17.339 3.612 1.00 0.00 EP \n+HETATM 1785 OM HOH A 357 1.550 17.597 3.596 1.00 0.00 EP \n+HETATM 1786 O HOH A 358 7.142 26.209 13.566 1.00 0.00 O \n+HETATM 1787 H1 HOH A 358 7.054 27.135 13.343 1.00 0.00 H \n+HETATM 1788 H2 HOH A 358 8.052 26.115 13.846 1.00 0.00 H \n+HETATM 1789 DOH2 HOH A 358 7.057 26.142 13.592 1.00 0.00 EP \n+HETATM 1790 OM HOH A 358 7.311 26.380 13.578 1.00 0.00 EP \n+HETATM 1791 O HOH A 359 9.561 24.815 12.016 1.00 0.00 O \n+HETATM 1792 H1 HOH A 359 9.709 25.369 12.782 1.00 0.00 H \n+HETATM 1793 H2 HOH A 359 9.234 25.414 11.345 1.00 0.00 H \n+HETATM 1794 DOH2 HOH A 359 9.563 24.713 12.002 1.00 0.00 EP \n+HETATM 1795 OM HOH A 359 9.524 25.051 12.036 1.00 0.00 EP \n+HETATM 1796 O HOH A 360 12.580 1.314 9.526 1.00 0.00 O \n+HETATM 1797 H1 HOH A 360 13.376 1.014 9.086 1.00 0.00 H \n+HETATM 1798 H2 HOH A 360 12.742 1.148 10.454 1.00 0.00 H \n+HETATM 1799 DOH2 HOH A 360 12.479 1.338 9.477 1.00 0.00 EP \n+HETATM 1800 OM HOH A 360 12.776 1.219 9.626 1.00 0.00 EP \n+HETATM 1801 O HOH A 361 10.375 22.849 2.690 1.00 0.00 O \n+HETATM 1802 H1 HOH A 361 9.960 22.022 2.446 1.00 0.00 H \n+HETATM 1803 H2 HOH A 361 10.100 23.466 2.011 1.00 0.00 H \n+HETATM 1804 DOH2 HOH A 361 10.406 22.875 2.767 1.00 0.00 EP \n+HETATM 1805 OM HOH A 361 10.234 22.806 2.501 1.00 0.00 EP \n+HETATM 1806 O HOH A 362 1.193 15.079 1.750 1.00 0.00 O \n+HETATM 1807 H1 HOH A 362 0.919 15.822 2.287 1.00 0.00 H \n+HETATM 1808 H2 HOH A 362 2.119 14.958 1.963 1.00 0.00 H \n+HETATM 1809 DOH2 HOH A 362 1.164 15.053 1.681 1.00 0.00 EP \n+HETATM 1810 OM HOH A 362 1.327 15.207 1.904 1.00 0.00 EP \n+HETATM 1811 O HOH A 363 16.344 24.142 8.180 1.00 0.00 O \n+HETATM 1812 H1 HOH A 363 16.311 24.275 7.233 1.00 0.00 H \n+HETATM 1813 H2 HOH A 363 17.275 24.188 8.397 1.00 0.00 H \n+HETATM 1814 DOH2 HOH A 363 16.289 24.163 8.249 1.00 0.00 EP \n+HETATM 1815 OM HOH A 363 16.528 24.178 8.030 1.00 0.00 EP \n+HETATM 1816 O HOH A 364 7.246 15.021 18.556 1.00 0.00 O \n+HETATM 1817 H1 HOH A 364 7.107 15.316 19.456 1.00 0.00 H \n+HETATM 1818 H2 HOH A 364 8.181 14.824 18.510 1.00 0.00 H \n+HETATM 1819 DOH2 HOH A 364 7.185 15.032 18.470 1.00 0.00 EP \n+HETATM 1820 OM HOH A 364 7.409 15.041 18.731 1.00 0.00 EP \n+HETATM 1821 O HOH A 365 4.322 24.353 10.068 1.00 0.00 O \n+HETATM 1822 H1 HOH A 365 4.414 24.503 11.009 1.00 0.00 H \n+HETATM 1823 H2 HOH A 365 5.207 24.462 9.721 1.00 0.00 H \n+HETATM 1824 DOH2 HOH A 365 4.239 24.349 9.998 1.00 0.00 EP \n+HETATM 1825 OM HOH A 365 4.522 24.406 10.190 1.00 0.00 EP \n+HETATM 1826 O HOH A 366 11.276 22.794 11.309 1.00 0.00 O \n+HETATM 1827 H1 HOH A 366 11.373 22.923 10.366 1.00 0.00 H \n+HETATM 1828 H2 HOH A 366 10.640 23.457 11.578 1.00 0.00 H \n+HETATM 1829 DOH2 HOH A 366 11.328 22.756 11.373 1.00 0.00 EP \n+HETATM 1830 OM HOH A 366 11.165 22.956 11.171 1.00 0.00 EP \n+HETATM 1831 O HOH A 367 3.571 22.630 13.311 1.00 0.00 O \n+HETATM 1832 H1 HOH A 367 3.968 23.486 13.148 1.00 0.00 H \n+HETATM 1833 H2 HOH A 367 3.633 22.513 14.259 1.00 0.00 H \n+HETATM 1834 DOH2 HOH A 367 3.537 22.574 13.261 1.00 0.00 EP \n+HETATM 1835 OM HOH A 367 3.665 22.782 13.472 1.00 0.00 EP \n+HETATM 1836 O HOH A 368 20.700 3.137 1.090 1.00 0.00 O \n+HETATM 1837 H1 HOH A 368 21.282 2.472 0.721 1.00 0.00 H \n+HETATM 1838 H2 HOH A 368 19.833 2.732 1.075 1.00 0.00 H \n+HETATM 1839 DOH2 HOH A 368 20.758 3.231 1.127 1.00 0.00 EP \n+HETATM 1840 OM HOH A 368 20.641 2.917 1.011 1.00 0.00 EP \n+HETATM 1841 O HOH A 369 28.917 2.787 20.440 1.00 0.00 O \n+HETATM 1842 H1 HOH A 369 28.149 2.841 21.009 1.00 0.00 H \n+HETATM 1843 H2 HOH A 369 28.874 3.579 19.904 1.00 0.00 H \n+HETATM 1844 DOH2 HOH A 369 28.965 2.712 20.437 1.00 0.00 EP \n+HETATM 1845 OM HOH A 369 28.751 2.961 20.447 1.00 0.00 EP \n+HETATM 1846 O HOH A 370 18.707 28.898 8.971 1.00 0.00 O \n+HETATM 1847 H1 HOH A 370 18.017 29.169 9.576 1.00 0.00 H \n+HETATM 1848 H2 HOH A 370 18.247 28.704 8.154 1.00 0.00 H \n+HETATM 1849 DOH2 HOH A 370 18.812 28.898 8.971 1.00 0.00 EP \n+HETATM 1850 OM HOH A 370 18.471 28.914 8.927 1.00 0.00 EP \n+HETATM 1851 O HOH A 371 1.132 -0.316 25.775 1.00 0.00 O \n+HETATM 1852 H1 HOH A 371 1.765 -0.036 25.114 1.00 0.00 H \n+HETATM 1853 H2 HOH A 371 1.608 -0.950 26.311 1.00 0.00 H \n+HETATM 1854 DOH2 HOH A 371 1.026 -0.322 25.793 1.00 0.00 EP \n+HETATM 1855 OM HOH A 371 1.359 -0.388 25.749 1.00 0.00 EP \n+HETATM 1856 O HOH A 372 1.255 16.304 16.159 1.00 0.00 O \n+HETATM 1857 H1 HOH A 372 0.385 15.937 16.317 1.00 0.00 H \n+HETATM 1858 H2 HOH A 372 1.089 17.210 15.897 1.00 0.00 H \n+HETATM 1859 DOH2 HOH A 372 1.360 16.274 16.165 1.00 0.00 EP \n+HETATM 1860 OM HOH A 372 1.043 16.415 16.138 1.00 0.00 EP \n+HETATM 1861 O HOH A 373 6.833 24.718 9.087 1.00 0.00 O \n+HETATM 1862 H1 HOH A 373 6.874 25.647 9.313 1.00 0.00 H \n+HETATM 1863 H2 HOH A 373 6.891 24.701 8.131 1.00 0.00 H \n+HETATM 1864 DOH2 HOH A 373 6.781 24.642 9.144 1.00 0.00 EP \n+HETATM 1865 OM HOH A 373 6.853 24.905 8.937 1.00 0.00 EP \n+HETATM 1866 O HOH A 374 11.450 1.748 15.817 1.00 0.00 O \n+HETATM 1867 H1 HOH A 374 11.588 1.702 16.763 1.00 0.00 H \n+HETATM 1868 H2 HOH A 374 11.781 2.611 15.568 1.00 0.00 H \n+HETATM 1869 DOH2 HOH A 374 11.433 1.679 15.758 1.00 0.00 EP \n+HETATM 1870 OM HOH A 374 11.546 1.916 15.960 1.00 0.00 EP \n+HETATM 1871 O HOH A 375 11.061 19.294 25.237 1.00 0.00 O \n+HETATM 1872 H1 HOH A 375 11.842 19.201 24.690 1.00 0.00 H \n+HETATM 1873 H2 HOH A 375 11.277 20.001 25.845 1.00 0.00 H \n+HETATM 1874 DOH2 HOH A 375 10.975 19.224 25.251 1.00 0.00 EP \n+HETATM 1875 OM HOH A 375 11.265 19.420 25.249 1.00 0.00 EP \n+HETATM 1876 O HOH A 376 3.677 18.761 18.883 1.00 0.00 O \n+HETATM 1877 H1 HOH A 376 2.878 18.725 19.409 1.00 0.00 H \n+HETATM 1878 H2 HOH A 376 4.207 19.441 19.299 1.00 0.00 H \n+HETATM 1879 DOH2 HOH A 376 3.688 18.709 18.800 1.00 0.00 EP \n+HETATM 1880 OM HOH A 376 3.622 18.893 19.076 1.00 0.00 EP \n+HETATM 1881 O HOH A 377 25.363 9.218 15.081 1.00 0.00 O \n+HETATM 1882 H1 HOH A 377 25.256 10.159 15.218 1.00 0.00 H \n+HETATM 1883 H2 HOH A 377 24.496 8.913 14.816 1.00 0.00 H \n+HETATM 1884 DOH2 HOH A 377 25.443 9.202 15.078 1.00 0.00 EP \n+HETATM 1885 OM HOH A 377 25.163 9.349 15.055 1.00 0.00 EP \n+HETATM 1886 O HOH A 378 3.040 23.291 7.921 1.00 0.00 O \n+HETATM 1887 H1 HOH A 378 3.469 23.626 8.709 1.00 0.00 H \n+HETATM 1888 H2 HOH A 378 2.104 23.387 8.098 1.00 0.00 H \n+HETATM 1889 DOH2 HOH A 378 3.097 23.266 7.834 1.00 0.00 EP \n+HETATM 1890 OM HOH A 378 2.936 23.380 8.119 1.00 0.00 EP \n+HETATM 1891 O HOH A 379 15.577 23.317 19.802 1.00 0.00 O \n+HETATM 1892 H1 HOH A 379 16.218 23.263 19.092 1.00 0.00 H \n+HETATM 1893 H2 HOH A 379 15.074 22.506 19.733 1.00 0.00 H \n+HETATM 1894 DOH2 HOH A 379 15.566 23.393 19.877 1.00 0.00 EP \n+HETATM 1895 OM HOH A 379 15.605 23.140 19.642 1.00 0.00 EP \n+HETATM 1896 O HOH A 380 7.231 21.972 8.613 1.00 0.00 O \n+HETATM 1897 H1 HOH A 380 7.060 22.816 9.030 1.00 0.00 H \n+HETATM 1898 H2 HOH A 380 6.907 21.325 9.239 1.00 0.00 H \n+HETATM 1899 DOH2 HOH A 380 7.243 21.964 8.547 1.00 0.00 EP \n+HETATM 1900 OM HOH A 380 7.130 22.012 8.827 1.00 0.00 EP \n+HETATM 1901 O HOH A 381 12.850 25.678 28.970 1.00 0.00 O \n+HETATM 1902 H1 HOH A 381 12.506 25.851 29.846 1.00 0.00 H \n+HETATM 1903 H2 HOH A 381 12.087 25.739 28.396 1.00 0.00 H \n+HETATM 1904 DOH2 HOH A 381 12.953 25.678 28.948 1.00 0.00 EP \n+HETATM 1905 OM HOH A 381 12.623 25.726 29.032 1.00 0.00 EP \n+HETATM 1906 O HOH A 382 12.161 27.979 9.464 1.00 0.00 O \n+HETATM 1907 H1 HOH A 382 11.306 28.067 9.045 1.00 0.00 H \n+HETATM 1908 H2 HOH A 382 12.790 28.057 8.746 1.00 0.00 H \n+HETATM 1909 DOH2 HOH A 382 12.181 27.962 9.544 1.00 0.00 EP \n+HETATM 1910 OM HOH A 382 12.115 28.013 9.231 1.00 0.00 EP \n+HETATM 1911 O HOH A 383 11.099 25.323 16.445 1.00 0.00 O \n+HETATM 1912 H1 HOH A 383 11.907 25.187 15.950 1.00 0.00 H \n+HETATM 1913 H2 HOH A 383 10.833 24.444 16.716 1.00 0.00 H \n+HETATM 1914 DOH2 HOH A 383 11.042 25.426 16.428 1.00 0.00 EP \n+HETATM 1915 OM HOH A 383 11.210 25.115 16.399 1.00 0.00 EP \n+HETATM 1916 O HOH A 384 10.293 17.667 2.689 1.00 0.00 O \n+HETATM 1917 H1 HOH A 384 9.724 17.916 3.417 1.00 0.00 H \n+HETATM 1918 H2 HOH A 384 11.181 17.770 3.031 1.00 0.00 H \n+HETATM 1919 DOH2 HOH A 384 10.264 17.590 2.597 1.00 0.00 EP \n+HETATM 1920 OM HOH A 384 10.358 17.740 2.908 1.00 0.00 EP \n+HETATM 1921 O HOH A 385 12.964 0.828 1.938 1.00 0.00 O \n+HETATM 1922 H1 HOH A 385 12.189 0.359 1.631 1.00 0.00 H \n+HETATM 1923 H2 HOH A 385 12.627 1.664 2.261 1.00 0.00 H \n+HETATM 1924 DOH2 HOH A 385 13.033 0.805 1.919 1.00 0.00 EP \n+HETATM 1925 OM HOH A 385 12.736 0.903 1.941 1.00 0.00 EP \n+HETATM 1926 O HOH A 386 3.608 0.418 4.272 1.00 0.00 O \n+HETATM 1927 H1 HOH A 386 4.436 0.601 3.829 1.00 0.00 H \n+HETATM 1928 H2 HOH A 386 3.402 1.228 4.740 1.00 0.00 H \n+HETATM 1929 DOH2 HOH A 386 3.554 0.290 4.280 1.00 0.00 EP \n+HETATM 1930 OM HOH A 386 3.735 0.622 4.277 1.00 0.00 EP \n+HETATM 1931 O HOH A 387 9.717 21.762 7.320 1.00 0.00 O \n+HETATM 1932 H1 HOH A 387 8.874 21.801 7.772 1.00 0.00 H \n+HETATM 1933 H2 HOH A 387 10.292 22.327 7.836 1.00 0.00 H \n+HETATM 1934 DOH2 HOH A 387 9.737 21.731 7.227 1.00 0.00 EP \n+HETATM 1935 OM HOH A 387 9.662 21.886 7.519 1.00 0.00 EP \n+HETATM 1936 O HOH A 388 28.660 24.685 10.449 1.00 0.00 O \n+HETATM 1937 H1 HOH A 388 27.930 24.116 10.205 1.00 0.00 H \n+HETATM 1938 H2 HOH A 388 28.305 25.251 11.134 1.00 0.00 H \n+HETATM 1939 DOH2 HOH A 388 28.750 24.697 10.386 1.00 0.00 EP \n+HETATM 1940 OM HOH A 388 28.437 24.684 10.540 1.00 0.00 EP \n+HETATM 1941 O HOH A 389 9.968 15.399 21.963 1.00 0.00 O \n+HETATM 1942 H1 HOH A 389 9.232 15.722 22.482 1.00 0.00 H \n+HETATM 1943 H2 HOH A 389 9.648 14.586 21.572 1.00 0.00 H \n+HETATM 1944 DOH2 HOH A 389 10.050 15.446 21.988 1.00 0.00 EP \n+HETATM 1945 OM HOH A 389 9.752 15.299 21.990 1.00 0.00 EP \n+HETATM 1946 O HOH A 390 7.769 21.565 15.122 1.00 0.00 O \n+HETATM 1947 H1 HOH A 390 8.631 21.239 15.381 1.00 0.00 H \n+HETATM 1948 H2 HOH A 390 7.897 21.901 14.235 1.00 0.00 H \n+HETATM 1949 DOH2 HOH A 390 7.701 21.558 15.154 1.00 0.00 EP \n+HETATM 1950 OM HOH A 390 7.972 21.567 14.993 1.00 0.00 EP \n+HETATM 1951 O HOH A 391 25.747 26.088 8.945 1.00 0.00 O \n+HETATM 1952 H1 HOH A 391 24.912 26.082 8.477 1.00 0.00 H \n+HETATM 1953 H2 HOH A 391 26.403 26.224 8.262 1.00 0.00 H \n+HETATM 1954 DOH2 HOH A 391 25.743 26.040 9.056 1.00 0.00 EP \n+HETATM 1955 OM HOH A 391 25.710 26.115 8.709 1.00 0.00 EP \n+HETATM 1956 O HOH A 392 24.804 20.998 19.019 1.00 0.00 O \n+HETATM 1957 H1 HOH A 392 25.606 20.744 18.562 1.00 0.00 H \n+HETATM 1958 H2 HOH A 392 24.885 20.598 19.885 1.00 0.00 H \n+HETATM 1959 DOH2 HOH A 392 24.719 21.010 18.956 1.00 0.00 EP \n+HETATM 1960 OM HOH A 392 24.985 20.864 19.102 1.00 0.00 EP \n+HETATM 1961 O HOH A 393 8.248 19.357 25.167 1.00 0.00 O \n+HETATM 1962 H1 HOH A 393 8.094 18.874 25.979 1.00 0.00 H \n+HETATM 1963 H2 HOH A 393 9.201 19.407 25.095 1.00 0.00 H \n+HETATM 1964 DOH2 HOH A 393 8.194 19.398 25.161 1.00 0.00 EP \n+HETATM 1965 OM HOH A 393 8.412 19.268 25.319 1.00 0.00 EP \n+HETATM 1966 O HOH A 394 13.425 0.635 12.105 1.00 0.00 O \n+HETATM 1967 H1 HOH A 394 14.274 0.340 12.432 1.00 0.00 H \n+HETATM 1968 H2 HOH A 394 12.802 0.371 12.782 1.00 0.00 H \n+HETATM 1969 DOH2 HOH A 394 13.419 0.714 12.029 1.00 0.00 EP \n+HETATM 1970 OM HOH A 394 13.471 0.520 12.311 1.00 0.00 EP \n+HETATM 1971 O HOH A 395 29.573 27.227 9.440 1.00 0.00 O \n+HETATM 1972 H1 HOH A 395 29.149 26.408 9.697 1.00 0.00 H \n+HETATM 1973 H2 HOH A 395 30.508 27.062 9.560 1.00 0.00 H \n+HETATM 1974 DOH2 HOH A 395 29.544 27.299 9.440 1.00 0.00 EP \n+HETATM 1975 OM HOH A 395 29.678 27.025 9.518 1.00 0.00 EP \n+HETATM 1976 O HOH A 396 13.022 25.629 5.987 1.00 0.00 O \n+HETATM 1977 H1 HOH A 396 12.183 25.644 6.448 1.00 0.00 H \n+HETATM 1978 H2 HOH A 396 12.807 25.314 5.109 1.00 0.00 H \n+HETATM 1979 DOH2 HOH A 396 13.109 25.673 6.024 1.00 0.00 EP \n+HETATM 1980 OM HOH A 396 12.806 25.567 5.901 1.00 0.00 EP \n+HETATM 1981 O HOH A 397 13.567 24.138 12.191 1.00 0.00 O \n+HETATM 1982 H1 HOH A 397 12.727 23.723 11.996 1.00 0.00 H \n+HETATM 1983 H2 HOH A 397 14.172 23.768 11.548 1.00 0.00 H \n+HETATM 1984 DOH2 HOH A 397 13.586 24.220 12.276 1.00 0.00 EP \n+HETATM 1985 OM HOH A 397 13.519 23.977 12.019 1.00 0.00 EP \n+HETATM 1986 O HOH A 398 8.281 23.268 24.708 1.00 0.00 O \n+HETATM 1987 H1 HOH A 398 8.964 22.945 24.121 1.00 0.00 H \n+HETATM 1988 H2 HOH A 398 8.137 24.174 24.436 1.00 0.00 H \n+HETATM 1989 DOH2 HOH A 398 8.257 23.221 24.790 1.00 0.00 EP \n+HETATM 1990 OM HOH A 398 8.391 23.388 24.532 1.00 0.00 EP \n+HETATM 1991 O HOH A 399 28.540 28.556 19.946 1.00 0.00 O \n+HETATM 1992 H1 HOH A 399 29.012 28.321 20.745 1.00 0.00 H \n+HETATM 1993 H2 HOH A 399 27.627 28.634 20.222 1.00 0.00 H \n+HETATM 1994 DOH2 HOH A 399 28.576 28.549 19.865 1.00 0.00 EP \n+HETATM 1995 OM HOH A 399 28.450 28.524 20.167 1.00 0.00 EP \n+HETATM 1996 O HOH A 400 7.853 2.090 19.103 1.00 0.00 O \n+HETATM 1997 H1 HOH A 400 8.468 1.376 18.935 1.00 0.00 H \n+HETATM 1998 H2 HOH A 400 7.232 1.729 19.735 1.00 0.00 H \n+HETATM 1999 DOH2 HOH A 400 7.855 2.195 19.054 1.00 0.00 EP \n+HETATM 2000 OM HOH A 400 7.852 1.870 19.198 1.00 0.00 EP \n+HETATM 2001 O HOH A 401 16.839 12.257 1.301 1.00 0.00 O \n+HETATM 2002 H1 HOH A 401 16.522 13.151 1.170 1.00 0.00 H \n+HETATM 2003 H2 HOH A 401 16.477 11.996 2.147 1.00 0.00 H \n+HETATM 2004 DOH2 HOH A 401 16.918 12.216 1.260 1.00 0.00 EP \n+HETATM 2005 OM HOH A 401 16.700 12.387 1.448 1.00 0.00 EP \n+HETATM 2006 O HOH A 402 11.623 15.535 24.125 1.00 0.00 O \n+HETATM 2007 H1 HOH A 402 12.408 15.928 23.743 1.00 0.00 H \n+HETATM 2008 H2 HOH A 402 11.008 15.467 23.394 1.00 0.00 H \n+HETATM 2009 DOH2 HOH A 402 11.611 15.518 24.232 1.00 0.00 EP \n+HETATM 2010 OM HOH A 402 11.658 15.602 23.896 1.00 0.00 EP \n+HETATM 2011 O HOH A 403 14.403 12.386 5.803 1.00 0.00 O \n+HETATM 2012 H1 HOH A 403 14.181 12.324 6.732 1.00 0.00 H \n+HETATM 2013 H2 HOH A 403 13.585 12.186 5.347 1.00 0.00 H \n+HETATM 2014 DOH2 HOH A 403 14.454 12.427 5.752 1.00 0.00 EP \n+HETATM 2015 OM HOH A 403 14.190 12.332 5.900 1.00 0.00 EP \n+HETATM 2016 O HOH A 404 10.928 18.939 9.869 1.00 0.00 O \n+HETATM 2017 H1 HOH A 404 10.306 19.521 10.306 1.00 0.00 H \n+HETATM 2018 H2 HOH A 404 11.727 19.005 10.391 1.00 0.00 H \n+HETATM 2019 DOH2 HOH A 404 10.926 18.877 9.793 1.00 0.00 EP \n+HETATM 2020 OM HOH A 404 10.964 19.072 10.066 1.00 0.00 EP \n+HETATM 2021 O HOH A 405 19.610 14.039 6.101 1.00 0.00 O \n+HETATM 2022 H1 HOH A 405 19.653 14.917 6.481 1.00 0.00 H \n+HETATM 2023 H2 HOH A 405 18.978 13.573 6.647 1.00 0.00 H \n+HETATM 2024 DOH2 HOH A 405 19.654 13.994 6.036 1.00 0.00 EP \n+HETATM 2025 OM HOH A 405 19.489 14.124 6.291 1.00 0.00 EP \n+HETATM 2026 O HOH A 406 7.082 28.850 13.013 1.00 0.00 O \n+HETATM 2027 H1 HOH A 406 7.699 29.503 13.343 1.00 0.00 H \n+HETATM 2028 H2 HOH A 406 6.225 29.269 13.090 1.00 0.00 H \n+HETATM 2029 DOH2 HOH A 406 7.077 28.767 13.011 1.00 0.00 EP \n+HETATM 2030 OM HOH A 406 7.032 29.070 13.096 1.00 0.00 EP \n+HETATM 2031 O HOH A 407 9.852 23.216 26.979 1.00 0.00 O \n+HETATM 2032 H1 HOH A 407 9.293 23.252 26.203 1.00 0.00 H \n+HETATM 2033 H2 HOH A 407 10.108 24.125 27.132 1.00 0.00 H \n+HETATM 2034 DOH2 HOH A 407 9.875 23.133 27.016 1.00 0.00 EP \n+HETATM 2035 OM HOH A 407 9.790 23.410 26.851 1.00 0.00 EP \n+HETATM 2036 O HOH A 408 27.548 -0.288 12.652 1.00 0.00 O \n+HETATM 2037 H1 HOH A 408 27.631 -0.972 13.316 1.00 0.00 H \n+HETATM 2038 H2 HOH A 408 27.761 0.523 13.114 1.00 0.00 H \n+HETATM 2039 DOH2 HOH A 408 27.514 -0.299 12.548 1.00 0.00 EP \n+HETATM 2040 OM HOH A 408 27.609 -0.262 12.883 1.00 0.00 EP \n+HETATM 2041 O HOH A 409 12.236 18.203 7.598 1.00 0.00 O \n+HETATM 2042 H1 HOH A 409 11.736 18.428 8.383 1.00 0.00 H \n+HETATM 2043 H2 HOH A 409 11.848 18.737 6.905 1.00 0.00 H \n+HETATM 2044 DOH2 HOH A 409 12.322 18.118 7.597 1.00 0.00 EP \n+HETATM 2045 OM HOH A 409 12.054 18.359 7.617 1.00 0.00 EP \n+HETATM 2046 O HOH A 410 24.135 18.917 12.086 1.00 0.00 O \n+HETATM 2047 H1 HOH A 410 24.896 18.552 12.538 1.00 0.00 H \n+HETATM 2048 H2 HOH A 410 24.145 18.502 11.224 1.00 0.00 H \n+HETATM 2049 DOH2 HOH A 410 24.065 18.957 12.137 1.00 0.00 EP \n+HETATM 2050 OM HOH A 410 24.293 18.757 12.002 1.00 0.00 EP \n+HETATM 2051 O HOH A 411 1.655 29.732 16.274 1.00 0.00 O \n+HETATM 2052 H1 HOH A 411 1.483 30.668 16.176 1.00 0.00 H \n+HETATM 2053 H2 HOH A 411 2.387 29.559 15.682 1.00 0.00 H \n+HETATM 2054 DOH2 HOH A 411 1.618 29.677 16.311 1.00 0.00 EP \n+HETATM 2055 OM HOH A 411 1.770 29.889 16.132 1.00 0.00 EP \n+HETATM 2056 O HOH A 412 7.037 20.222 18.264 1.00 0.00 O \n+HETATM 2057 H1 HOH A 412 7.028 19.310 17.976 1.00 0.00 H \n+HETATM 2058 H2 HOH A 412 6.374 20.263 18.953 1.00 0.00 H \n+HETATM 2059 DOH2 HOH A 412 7.099 20.279 18.276 1.00 0.00 EP \n+HETATM 2060 OM HOH A 412 6.899 20.043 18.346 1.00 0.00 EP \n+HETATM 2061 O HOH A 413 25.448 14.871 0.946 1.00 0.00 O \n+HETATM 2062 H1 HOH A 413 25.215 14.000 0.625 1.00 0.00 H \n+HETATM 2063 H2 HOH A 413 24.910 15.470 0.428 1.00 0.00 H \n+HETATM 2064 DOH2 HOH A 413 25.497 14.921 1.028 1.00 0.00 EP \n+HETATM 2065 OM HOH A 413 25.290 14.815 0.774 1.00 0.00 EP \n+HETATM 2066 O HOH A 414 18.962 27.361 3.083 1.00 0.00 O \n+HETATM 2067 H1 HOH A 414 19.864 27.558 3.338 1.00 0.00 H \n+HETATM 2068 H2 HOH A 414 18.594 26.902 3.837 1.00 0.00 H \n+HETATM 2069 DOH2 HOH A 414 18.944 27.363 2.989 1.00 0.00 EP \n+HETATM 2070 OM HOH A 414 19.071 27.307 3.290 1.00 0.00 EP \n+HETATM 2071 O HOH A 415 8.223 5.101 1.923 1.00 0.00 O \n+HETATM 2072 H1 HOH A 415 8.592 5.607 2.648 1.00 0.00 H \n+HETATM 2073 H2 HOH A 415 7.455 4.670 2.298 1.00 0.00 H \n+HETATM 2074 DOH2 HOH A 415 8.239 5.093 1.818 1.00 0.00 EP \n+HETATM 2075 OM HOH A 415 8.141 5.116 2.149 1.00 0.00 EP \n+HETATM 2076 O HOH A 416 11.275 28.374 3.323 1.00 0.00 O \n+HETATM 2077 H1 HOH A 416 11.791 28.929 3.908 1.00 0.00 H \n+HETATM 2078 H2 HOH A 416 11.074 28.936 2.575 1.00 0.00 H \n+HETATM 2079 DOH2 HOH A 416 11.253 28.288 3.328 1.00 0.00 EP \n+HETATM 2080 OM HOH A 416 11.339 28.603 3.290 1.00 0.00 EP \n+HETATM 2081 O HOH A 417 5.778 23.456 19.635 1.00 0.00 O \n+HETATM 2082 H1 HOH A 417 5.938 23.272 18.710 1.00 0.00 H \n+HETATM 2083 H2 HOH A 417 6.485 24.051 19.886 1.00 0.00 H \n+HETATM 2084 DOH2 HOH A 417 5.701 23.441 19.671 1.00 0.00 EP \n+HETATM 2085 OM HOH A 417 5.956 23.541 19.497 1.00 0.00 EP \n+HETATM 2086 O HOH A 418 10.613 28.970 11.744 1.00 0.00 O \n+HETATM 2087 H1 HOH A 418 11.329 28.724 11.159 1.00 0.00 H \n+HETATM 2088 H2 HOH A 418 11.046 29.243 12.552 1.00 0.00 H \n+HETATM 2089 DOH2 HOH A 418 10.530 28.981 11.707 1.00 0.00 EP \n+HETATM 2090 OM HOH A 418 10.849 28.976 11.790 1.00 0.00 EP \n+HETATM 2091 O HOH A 419 17.168 22.298 27.849 1.00 0.00 O \n+HETATM 2092 H1 HOH A 419 16.638 23.087 27.961 1.00 0.00 H \n+HETATM 2093 H2 HOH A 419 17.718 22.484 27.088 1.00 0.00 H \n+HETATM 2094 DOH2 HOH A 419 17.125 22.242 27.869 1.00 0.00 EP \n+HETATM 2095 OM HOH A 419 17.172 22.498 27.716 1.00 0.00 EP \n+HETATM 2096 O HOH A 420 1.369 28.407 7.132 1.00 0.00 O \n+HETATM 2097 H1 HOH A 420 2.243 28.275 6.763 1.00 0.00 H \n+HETATM 2098 H2 HOH A 420 1.105 27.539 7.439 1.00 0.00 H \n+HETATM 2099 DOH2 HOH A 420 1.320 28.484 7.160 1.00 0.00 EP \n+HETATM 2100 OM HOH A 420 1.494 28.202 7.119 1.00 0.00 EP \n+HETATM 2101 O HOH A 421 26.669 22.677 12.512 1.00 0.00 O \n+HETATM 2102 H1 HOH A 421 26.476 23.033 11.645 1.00 0.00 H \n+HETATM 2103 H2 HOH A 421 26.752 21.734 12.372 1.00 0.00 H \n+HETATM 2104 DOH2 HOH A 421 26.680 22.729 12.593 1.00 0.00 EP \n+HETATM 2105 OM HOH A 421 26.647 22.557 12.306 1.00 0.00 EP \n+HETATM 2106 O HOH A 422 19.747 26.901 13.921 1.00 0.00 O \n+HETATM 2107 H1 HOH A 422 20.087 26.997 14.811 1.00 0.00 H \n+HETATM 2108 H2 HOH A 422 20.019 26.022 13.655 1.00 0.00 H \n+HETATM 2109 DOH2 HOH A 422 19.696 26.968 13.908 1.00 0.00 EP \n+HETATM 2110 OM HOH A 422 19.873 26.740 14.049 1.00 0.00 EP \n+HETATM 2111 O HOH A 423 2.431 26.371 9.387 1.00 0.00 O \n+HETATM 2112 H1 HOH A 423 3.018 27.114 9.527 1.00 0.00 H \n+HETATM 2113 H2 HOH A 423 2.999 25.603 9.436 1.00 0.00 H \n+HETATM 2114 DOH2 HOH A 423 2.339 26.370 9.432 1.00 0.00 EP \n+HETATM 2115 OM HOH A 423 2.668 26.366 9.426 1.00 0.00 EP \n+HETATM 2116 O HOH A 424 1.615 26.488 -0.440 1.00 0.00 O \n+HETATM 2117 H1 HOH A 424 2.309 27.030 -0.816 1.00 0.00 H \n+HETATM 2118 H2 HOH A 424 1.686 25.653 -0.902 1.00 0.00 H \n+HETATM 2119 DOH2 HOH A 424 1.529 26.531 -0.386 1.00 0.00 EP \n+HETATM 2120 OM HOH A 424 1.772 26.428 -0.612 1.00 0.00 EP \n+HETATM 2121 O HOH A 425 30.074 27.493 15.914 1.00 0.00 O \n+HETATM 2122 H1 HOH A 425 30.623 26.883 15.421 1.00 0.00 H \n+HETATM 2123 H2 HOH A 425 30.624 28.266 16.038 1.00 0.00 H \n+HETATM 2124 DOH2 HOH A 425 29.985 27.472 15.941 1.00 0.00 EP \n+HETATM 2125 OM HOH A 425 30.299 27.526 15.838 1.00 0.00 EP \n+HETATM 2126 O HOH A 426 21.880 14.519 8.830 1.00 0.00 O \n+HETATM 2127 H1 HOH A 426 21.371 14.639 9.632 1.00 0.00 H \n+HETATM 2128 H2 HOH A 426 22.746 14.870 9.040 1.00 0.00 H \n+HETATM 2129 DOH2 HOH A 426 21.883 14.457 8.807 1.00 0.00 EP \n+HETATM 2130 OM HOH A 426 21.953 14.616 9.038 1.00 0.00 EP \n+HETATM 2131 O HOH A 427 1.142 19.132 12.527 1.00 0.00 O \n+HETATM 2132 H1 HOH A 427 0.614 19.814 12.111 1.00 0.00 H \n+HETATM 2133 H2 HOH A 427 1.779 18.881 11.858 1.00 0.00 H \n+HETATM 2134 DOH2 HOH A 427 1.145 19.114 12.601 1.00 0.00 EP \n+HETATM 2135 OM HOH A 427 1.164 19.221 12.304 1.00 0.00 EP \n+HETATM 2136 O HOH A 428 4.029 27.372 18.504 1.00 0.00 O \n+HETATM 2137 H1 HOH A 428 3.857 27.161 17.587 1.00 0.00 H \n+HETATM 2138 H2 HOH A 428 4.709 28.044 18.473 1.00 0.00 H \n+HETATM 2139 DOH2 HOH A 428 3.982 27.348 18.560 1.00 0.00 EP \n+HETATM 2140 OM HOH A 428 4.133 27.466 18.310 1.00 0.00 EP \n+HETATM 2141 O HOH A 429 13.321 20.968 15.872 1.00 0.00 O \n+HETATM 2142 H1 HOH A 429 12.367 20.949 15.803 1.00 0.00 H \n+HETATM 2143 H2 HOH A 429 13.630 20.736 14.996 1.00 0.00 H \n+HETATM 2144 DOH2 HOH A 429 13.355 20.924 15.925 1.00 0.00 EP \n+HETATM 2145 OM HOH A 429 13.189 20.916 15.678 1.00 0.00 EP \n+HETATM 2146 O HOH A 430 13.412 20.964 5.648 1.00 0.00 O \n+HETATM 2147 H1 HOH A 430 13.674 21.090 4.736 1.00 0.00 H \n+HETATM 2148 H2 HOH A 430 12.546 20.559 5.595 1.00 0.00 H \n+HETATM 2149 DOH2 HOH A 430 13.464 20.938 5.716 1.00 0.00 EP \n+HETATM 2150 OM HOH A 430 13.288 20.907 5.450 1.00 0.00 EP \n+HETATM 2151 O HOH A 431 3.730 6.470 2.271 1.00 0.00 O \n+HETATM 2152 H1 HOH A 431 4.229 6.925 1.593 1.00 0.00 H \n+HETATM 2153 H2 HOH A 431 4.322 6.438 3.023 1.00 0.00 H \n+HETATM 2154 DOH2 HOH A 431 3.649 6.448 2.244 1.00 0.00 EP \n+HETATM 2155 OM HOH A 431 3.954 6.557 2.286 1.00 0.00 EP \n+HETATM 2156 O HOH A 432 16.373 24.004 0.744 1.00 0.00 O \n+HETATM 2157 H1 HOH A 432 17.068 24.662 0.750 1.00 0.00 H \n+HETATM 2158 H2 HOH A 432 15.976 24.082 -0.123 1.00 0.00 H \n+HETATM 2159 DOH2 HOH A 432 16.354 23.945 0.842 1.00 0.00 EP \n+HETATM 2160 OM HOH A 432 16.434 24.155 0.568 1.00 0.00 EP \n+HETATM 2161 O HOH A 433 7.648 22.095 28.343 1.00 0.00 O \n+HETATM 2162 H1 HOH A 433 7.201 21.790 27.553 1.00 0.00 H \n+HETATM 2163 H2 HOH A 433 8.464 22.481 28.023 1.00 0.00 H \n+HETATM 2164 DOH2 HOH A 433 7.612 22.111 28.402 1.00 0.00 EP \n+HETATM 2165 OM HOH A 433 7.724 22.112 28.115 1.00 0.00 EP \n+HETATM 2166 O HOH A 434 17.732 12.711 7.682 1.00 0.00 O \n+HETATM 2167 H1 HOH A 434 17.295 11.884 7.478 1.00 0.00 H \n+HETATM 2168 H2 HOH A 434 17.046 13.258 8.063 1.00 0.00 H \n+HETATM 2169 DOH2 HOH A 434 17.819 12.721 7.680 1.00 0.00 EP \n+HETATM 2170 OM HOH A 434 17.502 12.653 7.718 1.00 0.00 EP \n+HETATM 2171 O HOH A 435 0.549 2.974 6.438 1.00 0.00 O \n+HETATM 2172 H1 HOH A 435 0.200 2.083 6.456 1.00 0.00 H \n+HETATM 2173 H2 HOH A 435 0.600 3.230 7.359 1.00 0.00 H \n+HETATM 2174 DOH2 HOH A 435 0.603 3.025 6.362 1.00 0.00 EP \n+HETATM 2175 OM HOH A 435 0.488 2.844 6.631 1.00 0.00 EP \n+HETATM 2176 O HOH A 436 14.979 20.717 28.146 1.00 0.00 O \n+HETATM 2177 H1 HOH A 436 14.546 20.810 27.297 1.00 0.00 H \n+HETATM 2178 H2 HOH A 436 15.792 21.215 28.057 1.00 0.00 H \n+HETATM 2179 DOH2 HOH A 436 14.930 20.651 28.219 1.00 0.00 EP \n+HETATM 2180 OM HOH A 436 15.057 20.838 27.954 1.00 0.00 EP \n+HETATM 2181 O HOH A 437 20.017 0.385 26.312 1.00 0.00 O \n+HETATM 2182 H1 HOH A 437 19.357 0.044 26.916 1.00 0.00 H \n+HETATM 2183 H2 HOH A 437 20.418 1.115 26.782 1.00 0.00 H \n+HETATM 2184 DOH2 HOH A 437 20.058 0.348 26.249 1.00 0.00 EP \n+HETATM 2185 OM HOH A 437 19.964 0.465 26.532 1.00 0.00 EP \n+HETATM 2186 O HOH A 438 27.609 22.938 21.997 1.00 0.00 O \n+HETATM 2187 H1 HOH A 438 27.409 23.870 22.083 1.00 0.00 H \n+HETATM 2188 H2 HOH A 438 28.015 22.858 21.134 1.00 0.00 H \n+HETATM 2189 DOH2 HOH A 438 27.598 22.873 22.090 1.00 0.00 EP \n+HETATM 2190 OM HOH A 438 27.651 23.113 21.838 1.00 0.00 EP \n+HETATM 2191 O HOH A 439 9.101 4.924 26.852 1.00 0.00 O \n+HETATM 2192 H1 HOH A 439 8.794 4.744 27.740 1.00 0.00 H \n+HETATM 2193 H2 HOH A 439 8.486 5.574 26.512 1.00 0.00 H \n+HETATM 2194 DOH2 HOH A 439 9.172 4.901 26.790 1.00 0.00 EP \n+HETATM 2195 OM HOH A 439 8.912 5.020 26.964 1.00 0.00 EP \n+HETATM 2196 O HOH A 440 4.565 1.161 27.783 1.00 0.00 O \n+HETATM 2197 H1 HOH A 440 4.633 1.960 27.259 1.00 0.00 H \n+HETATM 2198 H2 HOH A 440 4.552 0.453 27.139 1.00 0.00 H \n+HETATM 2199 DOH2 HOH A 440 4.560 1.173 27.867 1.00 0.00 EP \n+HETATM 2200 OM HOH A 440 4.576 1.180 27.543 1.00 0.00 EP \n+HETATM 2201 O HOH A 441 12.857 21.699 24.549 1.00 0.00 O \n+HETATM 2202 H1 HOH A 441 12.514 21.577 25.434 1.00 0.00 H \n+HETATM 2203 H2 HOH A 441 13.120 20.821 24.271 1.00 0.00 H \n+HETATM 2204 DOH2 HOH A 441 12.847 21.767 24.499 1.00 0.00 EP \n+HETATM 2205 OM HOH A 441 12.841 21.494 24.674 1.00 0.00 EP \n+HETATM 2206 O HOH A 442 3.855 26.314 2.302 1.00 0.00 O \n+HETATM 2207 H1 HOH A 442 4.395 26.136 3.072 1.00 0.00 H \n+HETATM 2208 H2 HOH A 442 3.278 27.028 2.573 1.00 0.00 H \n+HETATM 2209 DOH2 HOH A 442 3.863 26.277 2.240 1.00 0.00 EP \n+HETATM 2210 OM HOH A 442 3.848 26.424 2.515 1.00 0.00 EP \n+HETATM 2211 O HOH A 443 9.818 26.346 14.258 1.00 0.00 O \n+HETATM 2212 H1 HOH A 443 10.221 26.010 15.059 1.00 0.00 H \n+HETATM 2213 H2 HOH A 443 10.110 27.256 14.205 1.00 0.00 H \n+HETATM 2214 DOH2 HOH A 443 9.752 26.303 14.176 1.00 0.00 EP \n+HETATM 2215 OM HOH A 443 9.960 26.464 14.412 1.00 0.00 EP \n+HETATM 2216 O HOH A 444 23.168 29.500 16.746 1.00 0.00 O \n+HETATM 2217 H1 HOH A 444 23.261 28.551 16.663 1.00 0.00 H \n+HETATM 2218 H2 HOH A 444 23.061 29.811 15.847 1.00 0.00 H \n+HETATM 2219 DOH2 HOH A 444 23.192 29.558 16.797 1.00 0.00 EP \n+HETATM 2220 OM HOH A 444 23.165 29.369 16.545 1.00 0.00 EP \n+HETATM 2221 O HOH A 445 16.543 23.563 22.378 1.00 0.00 O \n+HETATM 2222 H1 HOH A 445 16.205 23.561 21.483 1.00 0.00 H \n+HETATM 2223 H2 HOH A 445 15.764 23.641 22.929 1.00 0.00 H \n+HETATM 2224 DOH2 HOH A 445 16.616 23.573 22.398 1.00 0.00 EP \n+HETATM 2225 OM HOH A 445 16.314 23.579 22.308 1.00 0.00 EP \n+HETATM 2226 O HOH A 446 6.702 16.042 20.986 1.00 0.00 O \n+HETATM 2227 H1 HOH A 446 6.296 15.586 21.723 1.00 0.00 H \n+HETATM 2228 H2 HOH A 446 6.845 16.933 21.304 1.00 0.00 H \n+HETATM 2229 DOH2 HOH A 446 6.714 16.004 20.908 1.00 0.00 EP \n+HETATM 2230 OM HOH A 446 6.648 16.131 21.202 1.00 0.00 EP \n+HETATM 2231 O HOH A 447 16.227 28.089 15.892 1.00 0.00 O \n+HETATM 2232 H1 HOH A 447 16.059 28.633 16.661 1.00 0.00 H \n+HETATM 2233 H2 HOH A 447 16.905 28.561 15.408 1.00 0.00 H \n+HETATM 2234 DOH2 HOH A 447 16.183 28.011 15.881 1.00 0.00 EP \n+HETATM 2235 OM HOH A 447 16.332 28.297 15.950 1.00 0.00 EP \n+HETATM 2236 O HOH A 448 14.137 24.031 23.855 1.00 0.00 O \n+HETATM 2237 H1 HOH A 448 13.730 23.210 24.131 1.00 0.00 H \n+HETATM 2238 H2 HOH A 448 13.517 24.407 23.230 1.00 0.00 H \n+HETATM 2239 DOH2 HOH A 448 14.225 24.059 23.878 1.00 0.00 EP \n+HETATM 2240 OM HOH A 448 13.926 23.940 23.783 1.00 0.00 EP \n+HETATM 2241 O HOH A 449 13.800 16.543 22.948 1.00 0.00 O \n+HETATM 2242 H1 HOH A 449 14.652 16.145 23.128 1.00 0.00 H \n+HETATM 2243 H2 HOH A 449 13.706 16.489 21.997 1.00 0.00 H \n+HETATM 2244 DOH2 HOH A 449 13.715 16.590 23.029 1.00 0.00 EP \n+HETATM 2245 OM HOH A 449 13.956 16.450 22.790 1.00 0.00 EP \n+HETATM 2246 O HOH A 450 13.522 19.099 23.864 1.00 0.00 O \n+HETATM 2247 H1 HOH A 450 13.551 18.199 23.537 1.00 0.00 H \n+HETATM 2248 H2 HOH A 450 14.366 19.224 24.297 1.00 0.00 H \n+HETATM 2249 DOH2 HOH A 450 13.418 19.194 23.849 1.00 0.00 EP \n+HETATM 2250 OM HOH A 450 13.701 18.940 23.886 1.00 0.00 EP \n+HETATM 2251 O HOH A 451 5.335 20.562 1.499 1.00 0.00 O \n+HETATM 2252 H1 HOH A 451 4.522 20.500 0.997 1.00 0.00 H \n+HETATM 2253 H2 HOH A 451 5.705 21.410 1.253 1.00 0.00 H \n+HETATM 2254 DOH2 HOH A 451 5.367 20.504 1.568 1.00 0.00 EP \n+HETATM 2255 OM HOH A 451 5.244 20.723 1.346 1.00 0.00 EP \n+HETATM 2256 O HOH A 452 4.388 23.670 28.251 1.00 0.00 O \n+HETATM 2257 H1 HOH A 452 4.353 22.793 27.869 1.00 0.00 H \n+HETATM 2258 H2 HOH A 452 4.910 23.565 29.047 1.00 0.00 H \n+HETATM 2259 DOH2 HOH A 452 4.313 23.748 28.210 1.00 0.00 EP \n+HETATM 2260 OM HOH A 452 4.488 23.469 28.336 1.00 0.00 EP \n+HETATM 2261 O HOH A 453 23.189 25.863 27.120 1.00 0.00 O \n+HETATM 2262 H1 HOH A 453 23.573 26.059 26.265 1.00 0.00 H \n+HETATM 2263 H2 HOH A 453 22.521 26.538 27.242 1.00 0.00 H \n+HETATM 2264 DOH2 HOH A 453 23.196 25.808 27.165 1.00 0.00 EP \n+HETATM 2265 OM HOH A 453 23.131 26.042 26.970 1.00 0.00 EP \n+HETATM 2266 O HOH A 454 21.441 28.127 27.184 1.00 0.00 O \n+HETATM 2267 H1 HOH A 454 20.934 28.821 26.763 1.00 0.00 H \n+HETATM 2268 H2 HOH A 454 22.229 28.567 27.505 1.00 0.00 H \n+HETATM 2269 DOH2 HOH A 454 21.421 28.038 27.205 1.00 0.00 EP \n+HETATM 2270 OM HOH A 454 21.499 28.359 27.163 1.00 0.00 EP \n+HETATM 2271 O HOH A 455 14.233 25.723 20.022 1.00 0.00 O \n+HETATM 2272 H1 HOH A 455 13.769 25.772 19.186 1.00 0.00 H \n+HETATM 2273 H2 HOH A 455 14.748 24.919 19.964 1.00 0.00 H \n+HETATM 2274 DOH2 HOH A 455 14.205 25.776 20.073 1.00 0.00 EP \n+HETATM 2275 OM HOH A 455 14.243 25.568 19.838 1.00 0.00 EP \n+HETATM 2276 O HOH A 456 11.984 29.709 26.323 1.00 0.00 O \n+HETATM 2277 H1 HOH A 456 11.939 30.656 26.191 1.00 0.00 H \n+HETATM 2278 H2 HOH A 456 12.853 29.560 26.696 1.00 0.00 H \n+HETATM 2279 DOH2 HOH A 456 11.904 29.640 26.331 1.00 0.00 EP \n+HETATM 2280 OM HOH A 456 12.153 29.873 26.372 1.00 0.00 EP \n+HETATM 2281 O HOH A 457 5.658 25.551 22.265 1.00 0.00 O \n+HETATM 2282 H1 HOH A 457 6.241 25.557 21.506 1.00 0.00 H \n+HETATM 2283 H2 HOH A 457 5.136 24.755 22.161 1.00 0.00 H \n+HETATM 2284 DOH2 HOH A 457 5.690 25.565 22.321 1.00 0.00 EP \n+HETATM 2285 OM HOH A 457 5.670 25.389 22.088 1.00 0.00 EP \n+HETATM 2286 O HOH A 458 8.057 1.817 24.974 1.00 0.00 O \n+HETATM 2287 H1 HOH A 458 8.042 0.904 24.686 1.00 0.00 H \n+HETATM 2288 H2 HOH A 458 8.202 1.769 25.919 1.00 0.00 H \n+HETATM 2289 DOH2 HOH A 458 8.036 1.911 24.911 1.00 0.00 EP \n+HETATM 2290 OM HOH A 458 8.084 1.620 25.109 1.00 0.00 EP \n+HETATM 2291 O HOH A 459 4.218 21.162 27.219 1.00 0.00 O \n+HETATM 2292 H1 HOH A 459 3.530 21.017 26.569 1.00 0.00 H \n+HETATM 2293 H2 HOH A 459 5.028 21.186 26.709 1.00 0.00 H \n+HETATM 2294 DOH2 HOH A 459 4.203 21.210 27.313 1.00 0.00 EP \n+HETATM 2295 OM HOH A 459 4.243 21.137 26.981 1.00 0.00 EP \n+HETATM 2296 O HOH A 460 24.698 17.547 22.995 1.00 0.00 O \n+HETATM 2297 H1 HOH A 460 25.067 16.671 22.886 1.00 0.00 H \n+HETATM 2298 H2 HOH A 460 23.799 17.395 23.286 1.00 0.00 H \n+HETATM 2299 DOH2 HOH A 460 24.735 17.653 22.985 1.00 0.00 EP \n+HETATM 2300 OM HOH A 460 24.590 17.336 23.032 1.00 0.00 EP \n+HETATM 2301 O HOH A 461 11.297 19.582 29.055 1.00 0.00 O \n+HETATM 2302 H1 HOH A 461 10.371 19.454 29.258 1.00 0.00 H \n+HETATM 2303 H2 HOH A 461 11.648 18.695 28.967 1.00 0.00 H \n+HETATM 2304 DOH2 HOH A 461 11.350 19.652 29.030 1.00 0.00 EP \n+HETATM 2305 OM HOH A 461 11.179 19.374 29.079 1.00 0.00 EP \n+HETATM 2306 O HOH A 462 10.502 20.618 15.421 1.00 0.00 O \n+HETATM 2307 H1 HOH A 462 10.608 19.720 15.736 1.00 0.00 H \n+HETATM 2308 H2 HOH A 462 10.785 20.586 14.507 1.00 0.00 H \n+HETATM 2309 DOH2 HOH A 462 10.491 20.697 15.469 1.00 0.00 EP \n+HETATM 2310 OM HOH A 462 10.582 20.427 15.298 1.00 0.00 EP \n+HETATM 2311 O HOH A 463 7.885 17.825 27.403 1.00 0.00 O \n+HETATM 2312 H1 HOH A 463 8.125 18.323 28.185 1.00 0.00 H \n+HETATM 2313 H2 HOH A 463 8.697 17.399 27.131 1.00 0.00 H \n+HETATM 2314 DOH2 HOH A 463 7.834 17.837 27.320 1.00 0.00 EP \n+HETATM 2315 OM HOH A 463 8.101 17.840 27.508 1.00 0.00 EP \n+HETATM 2316 O HOH A 464 14.952 27.487 29.219 1.00 0.00 O \n+HETATM 2317 H1 HOH A 464 14.216 26.891 29.079 1.00 0.00 H \n+HETATM 2318 H2 HOH A 464 14.721 28.273 28.724 1.00 0.00 H \n+HETATM 2319 DOH2 HOH A 464 15.022 27.466 29.232 1.00 0.00 EP \n+HETATM 2320 OM HOH A 464 14.753 27.526 29.089 1.00 0.00 EP \n+HETATM 2321 O HOH A 465 14.400 28.971 23.320 1.00 0.00 O \n+HETATM 2322 H1 HOH A 465 15.270 28.685 23.601 1.00 0.00 H \n+HETATM 2323 H2 HOH A 465 14.253 29.790 23.793 1.00 0.00 H \n+HETATM 2324 DOH2 HOH A 465 14.358 28.934 23.242 1.00 0.00 EP \n+HETATM 2325 OM HOH A 465 14.548 29.080 23.474 1.00 0.00 EP \n+HETATM 2326 O HOH A 466 7.888 25.725 28.891 1.00 0.00 O \n+HETATM 2327 H1 HOH A 466 7.110 25.896 29.422 1.00 0.00 H \n+HETATM 2328 H2 HOH A 466 7.613 25.917 27.995 1.00 0.00 H \n+HETATM 2329 DOH2 HOH A 466 7.977 25.711 28.924 1.00 0.00 EP \n+HETATM 2330 OM HOH A 466 7.672 25.799 28.816 1.00 0.00 EP \n+HETATM 2331 O HOH A 467 17.656 25.796 23.641 1.00 0.00 O \n+HETATM 2332 H1 HOH A 467 18.580 25.949 23.444 1.00 0.00 H \n+HETATM 2333 H2 HOH A 467 17.410 25.059 23.082 1.00 0.00 H \n+HETATM 2334 DOH2 HOH A 467 17.594 25.855 23.714 1.00 0.00 EP \n+HETATM 2335 OM HOH A 467 17.795 25.676 23.486 1.00 0.00 EP \n+HETATM 2336 O HOH A 468 16.847 25.429 16.193 1.00 0.00 O \n+HETATM 2337 H1 HOH A 468 16.661 25.125 15.305 1.00 0.00 H \n+HETATM 2338 H2 HOH A 468 16.618 26.359 16.182 1.00 0.00 H \n+HETATM 2339 DOH2 HOH A 468 16.897 25.365 16.284 1.00 0.00 EP \n+HETATM 2340 OM HOH A 468 16.762 25.558 16.009 1.00 0.00 EP \n+HETATM 2341 O HOH A 469 -0.007 25.141 23.130 1.00 0.00 O \n+HETATM 2342 H1 HOH A 469 -0.148 24.260 23.478 1.00 0.00 H \n+HETATM 2343 H2 HOH A 469 0.916 25.324 23.308 1.00 0.00 H \n+HETATM 2344 DOH2 HOH A 469 -0.085 25.222 23.086 1.00 0.00 EP \n+HETATM 2345 OM HOH A 469 0.153 24.998 23.238 1.00 0.00 EP \n+HETATM 2346 O HOH A 470 7.309 24.936 2.044 1.00 0.00 O \n+HETATM 2347 H1 HOH A 470 8.197 24.891 1.690 1.00 0.00 H \n+HETATM 2348 H2 HOH A 470 7.290 25.755 2.541 1.00 0.00 H \n+HETATM 2349 DOH2 HOH A 470 7.252 24.852 2.032 1.00 0.00 EP \n+HETATM 2350 OM HOH A 470 7.487 25.095 2.073 1.00 0.00 EP \n+HETATM 2351 O HOH A 471 26.903 3.014 22.325 1.00 0.00 O \n+HETATM 2352 H1 HOH A 471 26.960 2.107 22.626 1.00 0.00 H \n+HETATM 2353 H2 HOH A 471 27.515 3.492 22.885 1.00 0.00 H \n+HETATM 2354 DOH2 HOH A 471 26.911 3.030 22.267 1.00 0.00 EP \n+HETATM 2355 OM HOH A 471 27.040 2.926 22.502 1.00 0.00 EP \n+HETATM 2356 O HOH A 472 5.841 16.927 25.751 1.00 0.00 O \n+HETATM 2357 H1 HOH A 472 5.813 16.011 26.028 1.00 0.00 H \n+HETATM 2358 H2 HOH A 472 6.479 17.335 26.337 1.00 0.00 H \n+HETATM 2359 DOH2 HOH A 472 5.774 16.960 25.672 1.00 0.00 EP \n+HETATM 2360 OM HOH A 472 5.966 16.822 25.928 1.00 0.00 EP \n+HETATM 2361 O HOH A 473 9.485 3.239 23.058 1.00 0.00 O \n+HETATM 2362 H1 HOH A 473 8.949 2.769 23.697 1.00 0.00 H \n+HETATM 2363 H2 HOH A 473 10.031 2.561 22.659 1.00 0.00 H \n+HETATM 2364 DOH2 HOH A 473 9.529 3.289 23.083 1.00 0.00 EP \n+HETATM 2365 OM HOH A 473 9.487 3.003 23.107 1.00 0.00 EP \n+HETATM 2366 O HOH A 474 10.562 28.733 28.467 1.00 0.00 O \n+HETATM 2367 H1 HOH A 474 9.639 28.754 28.213 1.00 0.00 H \n+HETATM 2368 H2 HOH A 474 11.026 29.105 27.718 1.00 0.00 H \n+HETATM 2369 DOH2 HOH A 474 10.579 28.740 28.548 1.00 0.00 EP \n+HETATM 2370 OM HOH A 474 10.468 28.814 28.262 1.00 0.00 EP \n+HETATM 2371 O HOH A 475 7.812 12.788 12.732 1.00 0.00 O \n+HETATM 2372 H1 HOH A 475 8.049 13.417 12.051 1.00 0.00 H \n+HETATM 2373 H2 HOH A 475 8.645 12.403 13.004 1.00 0.00 H \n+HETATM 2374 DOH2 HOH A 475 7.762 12.772 12.760 1.00 0.00 EP \n+HETATM 2375 OM HOH A 475 8.031 12.838 12.648 1.00 0.00 EP \n+HETATM 2376 O HOH A 476 4.422 21.778 4.274 1.00 0.00 O \n+HETATM 2377 H1 HOH A 476 5.228 21.935 3.781 1.00 0.00 H \n+HETATM 2378 H2 HOH A 476 4.710 21.691 5.183 1.00 0.00 H \n+HETATM 2379 DOH2 HOH A 476 4.325 21.813 4.283 1.00 0.00 EP \n+HETATM 2380 OM HOH A 476 4.647 21.792 4.359 1.00 0.00 EP \n+HETATM 2381 O HOH A 477 1.761 24.390 2.754 1.00 0.00 O \n+HETATM 2382 H1 HOH A 477 2.438 24.935 2.354 1.00 0.00 H \n+HETATM 2383 H2 HOH A 477 2.130 24.128 3.598 1.00 0.00 H \n+HETATM 2384 DOH2 HOH A 477 1.670 24.411 2.750 1.00 0.00 EP \n+HETATM 2385 OM HOH A 477 1.976 24.448 2.845 1.00 0.00 EP \n+HETATM 2386 O HOH A 478 1.648 21.290 22.605 1.00 0.00 O \n+HETATM 2387 H1 HOH A 478 2.160 20.574 22.229 1.00 0.00 H \n+HETATM 2388 H2 HOH A 478 2.135 22.081 22.370 1.00 0.00 H \n+HETATM 2389 DOH2 HOH A 478 1.566 21.279 22.651 1.00 0.00 EP \n+HETATM 2390 OM HOH A 478 1.853 21.305 22.480 1.00 0.00 EP \n+HETATM 2391 O HOH A 479 7.630 25.515 20.309 1.00 0.00 O \n+HETATM 2392 H1 HOH A 479 7.642 26.132 19.576 1.00 0.00 H \n+HETATM 2393 H2 HOH A 479 8.397 25.750 20.832 1.00 0.00 H \n+HETATM 2394 DOH2 HOH A 479 7.552 25.463 20.336 1.00 0.00 EP \n+HETATM 2395 OM HOH A 479 7.790 25.690 20.266 1.00 0.00 EP \n+HETATM 2396 O HOH A 480 10.649 2.461 28.449 1.00 0.00 O \n+HETATM 2397 H1 HOH A 480 9.896 1.955 28.145 1.00 0.00 H \n+HETATM 2398 H2 HOH A 480 10.269 3.249 28.838 1.00 0.00 H \n+HETATM 2399 DOH2 HOH A 480 10.764 2.432 28.424 1.00 0.00 EP \n+HETATM 2400 OM HOH A 480 10.417 2.519 28.467 1.00 0.00 EP \n+HETATM 2401 O HOH A 481 11.766 21.283 26.979 1.00 0.00 O \n+HETATM 2402 H1 HOH A 481 11.085 21.953 27.041 1.00 0.00 H \n+HETATM 2403 H2 HOH A 481 11.644 20.743 27.760 1.00 0.00 H \n+HETATM 2404 DOH2 HOH A 481 11.808 21.243 26.861 1.00 0.00 EP \n+HETATM 2405 OM HOH A 481 11.601 21.310 27.152 1.00 0.00 EP \n+HETATM 2406 O HOH A 482 21.574 25.522 19.122 1.00 0.00 O \n+HETATM 2407 H1 HOH A 482 20.750 25.467 18.638 1.00 0.00 H \n+HETATM 2408 H2 HOH A 482 21.570 24.752 19.690 1.00 0.00 H \n+HETATM 2409 DOH2 HOH A 482 21.582 25.578 19.160 1.00 0.00 EP \n+HETATM 2410 OM HOH A 482 21.405 25.353 19.139 1.00 0.00 EP \n+HETATM 2411 O HOH A 483 1.464 26.090 26.297 1.00 0.00 O \n+HETATM 2412 H1 HOH A 483 0.550 26.374 26.289 1.00 0.00 H \n+HETATM 2413 H2 HOH A 483 1.488 25.376 26.933 1.00 0.00 H \n+HETATM 2414 DOH2 HOH A 483 1.552 26.109 26.229 1.00 0.00 EP \n+HETATM 2415 OM HOH A 483 1.281 26.002 26.426 1.00 0.00 EP \n+HETATM 2416 O HOH A 484 26.643 23.400 3.379 1.00 0.00 O \n+HETATM 2417 H1 HOH A 484 27.478 23.397 2.910 1.00 0.00 H \n+HETATM 2418 H2 HOH A 484 26.086 23.990 2.873 1.00 0.00 H \n+HETATM 2419 DOH2 HOH A 484 26.601 23.364 3.474 1.00 0.00 EP \n+HETATM 2420 OM HOH A 484 26.700 23.520 3.179 1.00 0.00 EP \n+HETATM 2421 O HOH A 485 11.648 28.299 22.733 1.00 0.00 O \n+HETATM 2422 H1 HOH A 485 12.588 28.315 22.913 1.00 0.00 H \n+HETATM 2423 H2 HOH A 485 11.421 29.214 22.564 1.00 0.00 H \n+HETATM 2424 DOH2 HOH A 485 11.585 28.248 22.751 1.00 0.00 EP \n+HETATM 2425 OM HOH A 485 11.795 28.490 22.735 1.00 0.00 EP \n+HETATM 2426 O HOH A 486 8.170 29.233 24.156 1.00 0.00 O \n+HETATM 2427 H1 HOH A 486 8.848 28.673 24.534 1.00 0.00 H \n+HETATM 2428 H2 HOH A 486 8.404 29.302 23.231 1.00 0.00 H \n+HETATM 2429 DOH2 HOH A 486 8.150 29.302 24.183 1.00 0.00 EP \n+HETATM 2430 OM HOH A 486 8.357 29.132 24.044 1.00 0.00 EP \n+HETATM 2431 O HOH A 487 15.326 2.135 22.435 1.00 0.00 O \n+HETATM 2432 H1 HOH A 487 14.925 1.864 23.261 1.00 0.00 H \n+HETATM 2433 H2 HOH A 487 16.160 1.665 22.408 1.00 0.00 H \n+HETATM 2434 DOH2 HOH A 487 15.288 2.168 22.393 1.00 0.00 EP \n+HETATM 2435 OM HOH A 487 15.415 1.983 22.599 1.00 0.00 EP \n+HETATM 2436 O HOH A 488 9.203 21.433 19.339 1.00 0.00 O \n+HETATM 2437 H1 HOH A 488 8.464 21.067 18.853 1.00 0.00 H \n+HETATM 2438 H2 HOH A 488 9.170 20.996 20.191 1.00 0.00 H \n+HETATM 2439 DOH2 HOH A 488 9.292 21.505 19.318 1.00 0.00 EP \n+HETATM 2440 OM HOH A 488 9.045 21.268 19.414 1.00 0.00 EP \n+HETATM 2441 O HOH A 489 19.977 19.411 20.515 1.00 0.00 O \n+HETATM 2442 H1 HOH A 489 19.763 19.221 19.602 1.00 0.00 H \n+HETATM 2443 H2 HOH A 489 19.316 20.047 20.789 1.00 0.00 H \n+HETATM 2444 DOH2 HOH A 489 20.057 19.389 20.561 1.00 0.00 EP \n+HETATM 2445 OM HOH A 489 19.797 19.503 20.384 1.00 0.00 EP \n+HETATM 2446 O HOH A 490 14.308 3.893 28.955 1.00 0.00 O \n+HETATM 2447 H1 HOH A 490 13.923 3.022 28.864 1.00 0.00 H \n+HETATM 2448 H2 HOH A 490 14.497 4.168 28.058 1.00 0.00 H \n+HETATM 2449 DOH2 HOH A 490 14.299 3.918 29.047 1.00 0.00 EP \n+HETATM 2450 OM HOH A 490 14.267 3.771 28.753 1.00 0.00 EP \n+HETATM 2451 O HOH A 491 17.345 15.635 25.954 1.00 0.00 O \n+HETATM 2452 H1 HOH A 491 18.128 16.169 26.086 1.00 0.00 H \n+HETATM 2453 H2 HOH A 491 16.617 16.214 26.182 1.00 0.00 H \n+HETATM 2454 DOH2 HOH A 491 17.332 15.578 25.959 1.00 0.00 EP \n+HETATM 2455 OM HOH A 491 17.356 15.863 26.028 1.00 0.00 EP \n+HETATM 2456 O HOH A 492 13.539 1.000 20.613 1.00 0.00 O \n+HETATM 2457 H1 HOH A 492 14.192 1.462 21.139 1.00 0.00 H \n+HETATM 2458 H2 HOH A 492 13.946 0.158 20.409 1.00 0.00 H \n+HETATM 2459 DOH2 HOH A 492 13.446 1.020 20.603 1.00 0.00 EP \n+HETATM 2460 OM HOH A 492 13.756 0.922 20.679 1.00 0.00 EP \n+HETATM 2461 O HOH A 493 8.260 1.324 27.688 1.00 0.00 O \n+HETATM 2462 H1 HOH A 493 7.669 1.732 28.321 1.00 0.00 H \n+HETATM 2463 H2 HOH A 493 8.112 0.384 27.794 1.00 0.00 H \n+HETATM 2464 DOH2 HOH A 493 8.317 1.371 27.641 1.00 0.00 EP \n+HETATM 2465 OM HOH A 493 8.109 1.215 27.839 1.00 0.00 EP \n+HETATM 2466 O HOH A 494 10.439 22.262 23.224 1.00 0.00 O \n+HETATM 2467 H1 HOH A 494 10.717 22.477 22.334 1.00 0.00 H \n+HETATM 2468 H2 HOH A 494 11.256 22.117 23.702 1.00 0.00 H \n+HETATM 2469 DOH2 HOH A 494 10.361 22.244 23.243 1.00 0.00 EP \n+HETATM 2470 OM HOH A 494 10.663 22.276 23.140 1.00 0.00 EP \n+HETATM 2471 O HOH A 495 18.005 8.405 1.935 1.00 0.00 O \n+HETATM 2472 H1 HOH A 495 18.821 8.801 2.243 1.00 0.00 H \n+HETATM 2473 H2 HOH A 495 17.726 8.964 1.210 1.00 0.00 H \n+HETATM 2474 DOH2 HOH A 495 17.958 8.314 1.952 1.00 0.00 EP \n+HETATM 2475 OM HOH A 495 18.115 8.601 1.849 1.00 0.00 EP \n+HETATM 2476 O HOH A 496 15.100 17.048 26.695 1.00 0.00 O \n+HETATM 2477 H1 HOH A 496 15.067 17.401 27.584 1.00 0.00 H \n+HETATM 2478 H2 HOH A 496 14.345 16.461 26.642 1.00 0.00 H \n+HETATM 2479 DOH2 HOH A 496 15.170 17.069 26.635 1.00 0.00 EP \n+HETATM 2480 OM HOH A 496 14.938 17.000 26.866 1.00 0.00 EP \n+HETATM 2481 O HOH A 497 6.995 26.580 26.462 1.00 0.00 O \n+HETATM 2482 H1 HOH A 497 6.077 26.311 26.455 1.00 0.00 H \n+HETATM 2483 H2 HOH A 497 7.323 26.339 25.595 1.00 0.00 H \n+HETATM 2484 DOH2 HOH A 497 7.045 26.618 26.564 1.00 0.00 EP \n+HETATM 2485 OM HOH A 497 6.874 26.475 26.282 1.00 0.00 EP \n+HETATM 2486 O HOH A 498 14.214 21.049 2.991 1.00 0.00 O \n+HETATM 2487 H1 HOH A 498 13.877 20.996 2.097 1.00 0.00 H \n+HETATM 2488 H2 HOH A 498 14.698 20.232 3.113 1.00 0.00 H \n+HETATM 2489 DOH2 HOH A 498 14.223 21.130 3.069 1.00 0.00 EP \n+HETATM 2490 OM HOH A 498 14.244 20.870 2.833 1.00 0.00 EP \n+HETATM 2491 O HOH A 499 7.434 27.218 18.069 1.00 0.00 O \n+HETATM 2492 H1 HOH A 499 6.974 26.703 17.406 1.00 0.00 H \n+HETATM 2493 H2 HOH A 499 6.899 28.005 18.175 1.00 0.00 H \n+HETATM 2494 DOH2 HOH A 499 7.519 27.192 18.110 1.00 0.00 EP \n+HETATM 2495 OM HOH A 499 7.230 27.274 17.955 1.00 0.00 EP \n+HETATM 2496 O HOH A 500 25.362 3.126 25.221 1.00 0.00 O \n+HETATM 2497 H1 HOH A 500 24.872 2.601 24.587 1.00 0.00 H \n+HETATM 2498 H2 HOH A 500 25.805 2.482 25.773 1.00 0.00 H \n+HETATM 2499 DOH2 HOH A 500 25.339 3.217 25.246 1.00 0.00 EP \n+HETATM 2500 OM HOH A 500 25.352 2.886 25.204 1.00 0.00 EP \n+HETATM 2501 O HOH A 501 14.935 29.520 3.425 1.00 0.00 O \n+HETATM 2502 H1 HOH A 501 15.052 28.658 3.026 1.00 0.00 H \n+HETATM 2503 H2 HOH A 501 14.368 29.992 2.816 1.00 0.00 H \n+HETATM 2504 DOH2 HOH A 501 14.942 29.556 3.534 1.00 0.00 EP \n+HETATM 2505 OM HOH A 501 14.843 29.440 3.218 1.00 0.00 EP \n+HETATM 2506 O HOH A 502 8.224 0.788 0.901 1.00 0.00 O \n+HETATM 2507 H1 HOH A 502 7.799 -0.069 0.886 1.00 0.00 H \n+HETATM 2508 H2 HOH A 502 7.593 1.376 0.485 1.00 0.00 H \n+HETATM 2509 DOH2 HOH A 502 8.332 0.804 0.958 1.00 0.00 EP \n+HETATM 2510 OM HOH A 502 8.007 0.733 0.813 1.00 0.00 EP \n+HETATM 2511 O HOH A 503 8.423 29.612 10.293 1.00 0.00 O \n+HETATM 2512 H1 HOH A 503 9.095 29.433 10.952 1.00 0.00 H \n+HETATM 2513 H2 HOH A 503 7.881 30.298 10.683 1.00 0.00 H \n+HETATM 2514 DOH2 HOH A 503 8.434 29.571 10.201 1.00 0.00 EP \n+HETATM 2515 OM HOH A 503 8.450 29.716 10.508 1.00 0.00 EP \n+HETATM 2516 O HOH A 504 12.423 16.452 14.188 1.00 0.00 O \n+HETATM 2517 H1 HOH A 504 12.255 15.510 14.217 1.00 0.00 H \n+HETATM 2518 H2 HOH A 504 11.703 16.807 13.667 1.00 0.00 H \n+HETATM 2519 DOH2 HOH A 504 12.483 16.498 14.253 1.00 0.00 EP \n+HETATM 2520 OM HOH A 504 12.241 16.331 14.087 1.00 0.00 EP \n+HETATM 2521 O HOH A 505 7.825 28.684 28.033 1.00 0.00 O \n+HETATM 2522 H1 HOH A 505 7.522 27.962 27.483 1.00 0.00 H \n+HETATM 2523 H2 HOH A 505 7.653 28.391 28.928 1.00 0.00 H \n+HETATM 2524 DOH2 HOH A 505 7.891 28.769 28.025 1.00 0.00 EP \n+HETATM 2525 OM HOH A 505 7.728 28.476 28.104 1.00 0.00 EP \n+HETATM 2526 O HOH A 506 12.929 15.370 26.617 1.00 0.00 O \n+HETATM 2527 H1 HOH A 506 13.214 14.457 26.661 1.00 0.00 H \n+HETATM 2528 H2 HOH A 506 12.442 15.431 25.795 1.00 0.00 H \n+HETATM 2529 DOH2 HOH A 506 12.962 15.461 26.678 1.00 0.00 EP \n+HETATM 2530 OM HOH A 506 12.888 15.195 26.457 1.00 0.00 EP \n+HETATM 2531 O HOH A 507 6.232 0.731 20.859 1.00 0.00 O \n+HETATM 2532 H1 HOH A 507 5.666 1.136 21.516 1.00 0.00 H \n+HETATM 2533 H2 HOH A 507 6.994 0.428 21.353 1.00 0.00 H \n+HETATM 2534 DOH2 HOH A 507 6.252 0.733 20.757 1.00 0.00 EP \n+HETATM 2535 OM HOH A 507 6.272 0.752 21.095 1.00 0.00 EP \n+HETATM 2536 O HOH A 508 15.226 8.012 6.320 1.00 0.00 O \n+HETATM 2537 H1 HOH A 508 15.816 7.758 5.611 1.00 0.00 H \n+HETATM 2538 H2 HOH A 508 15.028 7.192 6.773 1.00 0.00 H \n+HETATM 2539 DOH2 HOH A 508 15.203 8.090 6.362 1.00 0.00 EP \n+HETATM 2540 OM HOH A 508 15.306 7.792 6.267 1.00 0.00 EP \n+HETATM 2541 O HOH A 509 11.775 5.034 8.473 1.00 0.00 O \n+HETATM 2542 H1 HOH A 509 12.647 5.001 8.079 1.00 0.00 H \n+HETATM 2543 H2 HOH A 509 11.196 5.286 7.754 1.00 0.00 H \n+HETATM 2544 DOH2 HOH A 509 11.745 5.018 8.551 1.00 0.00 EP \n+HETATM 2545 OM HOH A 509 11.835 5.079 8.245 1.00 0.00 EP \n+HETATM 2546 O HOH A 510 10.932 6.860 29.523 1.00 0.00 O \n+HETATM 2547 H1 HOH A 510 11.246 7.709 29.832 1.00 0.00 H \n+HETATM 2548 H2 HOH A 510 10.286 7.073 28.849 1.00 0.00 H \n+HETATM 2549 DOH2 HOH A 510 10.968 6.785 29.554 1.00 0.00 EP \n+HETATM 2550 OM HOH A 510 10.864 7.078 29.448 1.00 0.00 EP \n+HETATM 2551 O HOH A 511 25.282 14.675 6.412 1.00 0.00 O \n+HETATM 2552 H1 HOH A 511 24.561 14.562 5.792 1.00 0.00 H \n+HETATM 2553 H2 HOH A 511 25.823 15.365 6.028 1.00 0.00 H \n+HETATM 2554 DOH2 HOH A 511 25.317 14.632 6.469 1.00 0.00 EP \n+HETATM 2555 OM HOH A 511 25.245 14.793 6.206 1.00 0.00 EP \n+HETATM 2556 O HOH A 512 19.300 7.339 12.803 1.00 0.00 O \n+HETATM 2557 H1 HOH A 512 19.333 7.770 11.949 1.00 0.00 H \n+HETATM 2558 H2 HOH A 512 18.648 7.836 13.298 1.00 0.00 H \n+HETATM 2559 DOH2 HOH A 512 19.352 7.231 12.841 1.00 0.00 EP \n+HETATM 2560 OM HOH A 512 19.173 7.529 12.729 1.00 0.00 EP \n+HETATM 2561 O HOH A 513 29.307 13.309 19.886 1.00 0.00 O \n+HETATM 2562 H1 HOH A 513 29.027 14.199 19.674 1.00 0.00 H \n+HETATM 2563 H2 HOH A 513 28.568 12.757 19.628 1.00 0.00 H \n+HETATM 2564 DOH2 HOH A 513 29.358 13.290 19.923 1.00 0.00 EP \n+HETATM 2565 OM HOH A 513 29.098 13.378 19.790 1.00 0.00 EP \n+HETATM 2566 O HOH A 514 22.886 8.575 14.258 1.00 0.00 O \n+HETATM 2567 H1 HOH A 514 22.218 9.199 13.974 1.00 0.00 H \n+HETATM 2568 H2 HOH A 514 22.438 7.728 14.259 1.00 0.00 H \n+HETATM 2569 DOH2 HOH A 514 22.975 8.590 14.290 1.00 0.00 EP \n+HETATM 2570 OM HOH A 514 22.657 8.529 14.200 1.00 0.00 EP \n+HETATM 2571 O HOH A 515 27.306 4.437 10.733 1.00 0.00 O \n+HETATM 2572 H1 HOH A 515 27.118 4.995 9.978 1.00 0.00 H \n+HETATM 2573 H2 HOH A 515 27.692 3.646 10.356 1.00 0.00 H \n+HETATM 2574 DOH2 HOH A 515 27.268 4.457 10.820 1.00 0.00 EP \n+HETATM 2575 OM HOH A 515 27.346 4.389 10.501 1.00 0.00 EP \n+HETATM 2576 O HOH A 516 23.653 7.867 11.010 1.00 0.00 O \n+HETATM 2577 H1 HOH A 516 22.843 8.375 10.976 1.00 0.00 H \n+HETATM 2578 H2 HOH A 516 23.824 7.626 10.099 1.00 0.00 H \n+HETATM 2579 DOH2 HOH A 516 23.683 7.846 11.076 1.00 0.00 EP \n+HETATM 2580 OM HOH A 516 23.522 7.922 10.816 1.00 0.00 EP \n+HETATM 2581 O HOH A 517 23.918 1.085 10.314 1.00 0.00 O \n+HETATM 2582 H1 HOH A 517 23.016 1.129 10.632 1.00 0.00 H \n+HETATM 2583 H2 HOH A 517 23.915 0.364 9.683 1.00 0.00 H \n+HETATM 2584 DOH2 HOH A 517 23.971 1.096 10.367 1.00 0.00 EP \n+HETATM 2585 OM HOH A 517 23.732 0.946 10.250 1.00 0.00 EP \n+HETATM 2586 O HOH A 518 22.128 22.310 29.846 1.00 0.00 O \n+HETATM 2587 H1 HOH A 518 22.589 21.893 30.574 1.00 0.00 H \n+HETATM 2588 H2 HOH A 518 22.755 22.293 29.123 1.00 0.00 H \n+HETATM 2589 DOH2 HOH A 518 22.082 22.328 29.864 1.00 0.00 EP \n+HETATM 2590 OM HOH A 518 22.351 22.221 29.847 1.00 0.00 EP \n+HETATM 2591 O HOH A 519 0.407 6.220 17.284 1.00 0.00 O \n+HETATM 2592 H1 HOH A 519 0.812 7.058 17.508 1.00 0.00 H \n+HETATM 2593 H2 HOH A 519 0.040 6.357 16.411 1.00 0.00 H \n+HETATM 2594 DOH2 HOH A 519 0.398 6.135 17.339 1.00 0.00 EP \n+HETATM 2595 OM HOH A 519 0.415 6.420 17.151 1.00 0.00 EP \n+HETATM 2596 O HOH A 520 19.567 12.218 1.564 1.00 0.00 O \n+HETATM 2597 H1 HOH A 520 18.610 12.211 1.546 1.00 0.00 H \n+HETATM 2598 H2 HOH A 520 19.809 11.329 1.823 1.00 0.00 H \n+HETATM 2599 DOH2 HOH A 520 19.626 12.286 1.521 1.00 0.00 EP \n+HETATM 2600 OM HOH A 520 19.420 12.034 1.613 1.00 0.00 EP \n+HETATM 2601 O HOH A 521 18.751 4.682 12.676 1.00 0.00 O \n+HETATM 2602 H1 HOH A 521 19.386 4.369 12.031 1.00 0.00 H \n+HETATM 2603 H2 HOH A 521 18.930 5.619 12.754 1.00 0.00 H \n+HETATM 2604 DOH2 HOH A 521 18.696 4.650 12.712 1.00 0.00 EP \n+HETATM 2605 OM HOH A 521 18.918 4.810 12.559 1.00 0.00 EP \n+HETATM 2606 O HOH A 522 28.454 22.999 14.564 1.00 0.00 O \n+HETATM 2607 H1 HOH A 522 27.808 22.963 13.859 1.00 0.00 H \n+HETATM 2608 H2 HOH A 522 29.299 23.002 14.115 1.00 0.00 H \n+HETATM 2609 DOH2 HOH A 522 28.426 22.962 14.659 1.00 0.00 EP \n+HETATM 2610 OM HOH A 522 28.495 22.992 14.328 1.00 0.00 EP \n+HETATM 2611 O HOH A 523 27.972 3.030 4.342 1.00 0.00 O \n+HETATM 2612 H1 HOH A 523 28.605 2.339 4.149 1.00 0.00 H \n+HETATM 2613 H2 HOH A 523 27.319 2.959 3.646 1.00 0.00 H \n+HETATM 2614 DOH2 HOH A 523 27.958 3.075 4.447 1.00 0.00 EP \n+HETATM 2615 OM HOH A 523 27.968 2.874 4.160 1.00 0.00 EP \n+HETATM 2616 O HOH A 524 16.221 6.729 0.636 1.00 0.00 O \n+HETATM 2617 H1 HOH A 524 15.511 6.490 1.232 1.00 0.00 H \n+HETATM 2618 H2 HOH A 524 16.822 7.245 1.173 1.00 0.00 H \n+HETATM 2619 DOH2 HOH A 524 16.246 6.703 0.523 1.00 0.00 EP \n+HETATM 2620 OM HOH A 524 16.199 6.786 0.868 1.00 0.00 EP \n+HETATM 2621 O HOH A 525 19.705 17.052 26.590 1.00 0.00 O \n+HETATM 2622 H1 HOH A 525 20.407 16.508 26.232 1.00 0.00 H \n+HETATM 2623 H2 HOH A 525 19.616 16.762 27.498 1.00 0.00 H \n+HETATM 2624 DOH2 HOH A 525 19.640 17.128 26.538 1.00 0.00 EP \n+HETATM 2625 OM HOH A 525 19.831 16.881 26.703 1.00 0.00 EP \n+HETATM 2626 O HOH A 526 25.920 5.547 14.709 1.00 0.00 O \n+HETATM 2627 H1 HOH A 526 26.493 5.908 14.034 1.00 0.00 H \n+HETATM 2628 H2 HOH A 526 26.013 4.598 14.621 1.00 0.00 H \n+HETATM 2629 DOH2 HOH A 526 25.882 5.559 14.774 1.00 0.00 EP \n+HETATM 2630 OM HOH A 526 26.057 5.426 14.553 1.00 0.00 EP \n+HETATM 2631 O HOH A 527 25.883 6.457 4.758 1.00 0.00 O \n+HETATM 2632 H1 HOH A 527 25.159 5.851 4.914 1.00 0.00 H \n+HETATM 2633 H2 HOH A 527 26.095 6.345 3.831 1.00 0.00 H \n+HETATM 2634 DOH2 HOH A 527 25.945 6.490 4.850 1.00 0.00 EP \n+HETATM 2635 OM HOH A 527 25.778 6.310 4.600 1.00 0.00 EP \n+HETATM 2636 O HOH A 528 0.763 22.818 13.139 1.00 0.00 O \n+HETATM 2637 H1 HOH A 528 0.412 22.202 12.496 1.00 0.00 H \n+HETATM 2638 H2 HOH A 528 1.709 22.669 13.122 1.00 0.00 H \n+HETATM 2639 DOH2 HOH A 528 0.706 22.861 13.198 1.00 0.00 EP \n+HETATM 2640 OM HOH A 528 0.885 22.661 13.003 1.00 0.00 EP \n+HETATM 2641 O HOH A 529 14.409 11.297 20.435 1.00 0.00 O \n+HETATM 2642 H1 HOH A 529 13.693 11.807 20.055 1.00 0.00 H \n+HETATM 2643 H2 HOH A 529 14.875 11.917 20.995 1.00 0.00 H \n+HETATM 2644 DOH2 HOH A 529 14.414 11.207 20.409 1.00 0.00 EP \n+HETATM 2645 OM HOH A 529 14.358 11.529 20.472 1.00 0.00 EP \n+HETATM 2646 O HOH A 530 18.875 24.239 9.334 1.00 0.00 O \n+HETATM 2647 H1 HOH A 530 19.439 24.973 9.092 1.00 0.00 H \n+HETATM 2648 H2 HOH A 530 19.207 23.502 8.821 1.00 0.00 H \n+HETATM 2649 DOH2 HOH A 530 18.803 24.234 9.364 1.00 0.00 EP \n+HETATM 2650 OM HOH A 530 19.059 24.238 9.179 1.00 0.00 EP \n+HETATM 2651 O HOH A 531 17.076 7.040 4.296 1.00 0.00 O \n+HETATM 2652 H1 HOH A 531 17.356 7.549 3.536 1.00 0.00 H \n+HETATM 2653 H2 HOH A 531 16.988 6.145 3.967 1.00 0.00 H \n+HETATM 2654 DOH2 HOH A 531 17.079 7.066 4.386 1.00 0.00 EP \n+HETATM 2655 OM HOH A 531 17.115 6.961 4.073 1.00 0.00 EP \n+HETATM 2656 O HOH A 532 6.152 3.470 17.390 1.00 0.00 O \n+HETATM 2657 H1 HOH A 532 6.803 3.072 17.969 1.00 0.00 H \n+HETATM 2658 H2 HOH A 532 5.574 2.747 17.147 1.00 0.00 H \n+HETATM 2659 DOH2 HOH A 532 6.137 3.538 17.370 1.00 0.00 EP \n+HETATM 2660 OM HOH A 532 6.167 3.240 17.459 1.00 0.00 EP \n+HETATM 2661 O HOH A 533 25.339 5.875 19.907 1.00 0.00 O \n+HETATM 2662 H1 HOH A 533 26.177 5.421 19.989 1.00 0.00 H \n+HETATM 2663 H2 HOH A 533 25.164 5.888 18.966 1.00 0.00 H \n+HETATM 2664 DOH2 HOH A 533 25.302 5.930 19.971 1.00 0.00 EP \n+HETATM 2665 OM HOH A 533 25.475 5.785 19.731 1.00 0.00 EP \n+HETATM 2666 O HOH A 534 10.074 7.536 20.796 1.00 0.00 O \n+HETATM 2667 H1 HOH A 534 10.986 7.285 20.651 1.00 0.00 H \n+HETATM 2668 H2 HOH A 534 9.894 7.275 21.699 1.00 0.00 H \n+HETATM 2669 DOH2 HOH A 534 10.011 7.590 20.753 1.00 0.00 EP \n+HETATM 2670 OM HOH A 534 10.224 7.431 20.952 1.00 0.00 EP \n+HETATM 2671 O HOH A 535 5.280 8.039 12.812 1.00 0.00 O \n+HETATM 2672 H1 HOH A 535 4.351 8.168 13.004 1.00 0.00 H \n+HETATM 2673 H2 HOH A 535 5.635 8.925 12.739 1.00 0.00 H \n+HETATM 2674 DOH2 HOH A 535 5.317 7.949 12.805 1.00 0.00 EP \n+HETATM 2675 OM HOH A 535 5.162 8.247 12.836 1.00 0.00 EP \n+HETATM 2676 O HOH A 536 29.617 0.926 3.617 1.00 0.00 O \n+HETATM 2677 H1 HOH A 536 30.278 1.271 3.017 1.00 0.00 H \n+HETATM 2678 H2 HOH A 536 29.337 0.102 3.218 1.00 0.00 H \n+HETATM 2679 DOH2 HOH A 536 29.590 0.967 3.691 1.00 0.00 EP \n+HETATM 2680 OM HOH A 536 29.695 0.828 3.412 1.00 0.00 EP \n+HETATM 2681 O HOH A 537 18.434 11.378 14.013 1.00 0.00 O \n+HETATM 2682 H1 HOH A 537 18.174 11.485 13.098 1.00 0.00 H \n+HETATM 2683 H2 HOH A 537 18.247 12.225 14.417 1.00 0.00 H \n+HETATM 2684 DOH2 HOH A 537 18.480 11.275 14.029 1.00 0.00 EP \n+HETATM 2685 OM HOH A 537 18.342 11.574 13.908 1.00 0.00 EP \n+HETATM 2686 O HOH A 538 23.800 17.094 18.765 1.00 0.00 O \n+HETATM 2687 H1 HOH A 538 23.523 17.935 18.401 1.00 0.00 H \n+HETATM 2688 H2 HOH A 538 22.985 16.613 18.906 1.00 0.00 H \n+HETATM 2689 DOH2 HOH A 538 23.864 17.060 18.787 1.00 0.00 EP \n+HETATM 2690 OM HOH A 538 23.576 17.168 18.720 1.00 0.00 EP \n+HETATM 2691 O HOH A 539 1.196 25.770 11.722 1.00 0.00 O \n+HETATM 2692 H1 HOH A 539 1.606 25.897 10.866 1.00 0.00 H \n+HETATM 2693 H2 HOH A 539 0.425 25.233 11.540 1.00 0.00 H \n+HETATM 2694 DOH2 HOH A 539 1.241 25.809 11.808 1.00 0.00 EP \n+HETATM 2695 OM HOH A 539 1.122 25.686 11.509 1.00 0.00 EP \n+HETATM 2696 O HOH A 540 0.729 3.592 1.938 1.00 0.00 O \n+HETATM 2697 H1 HOH A 540 1.058 4.393 1.531 1.00 0.00 H \n+HETATM 2698 H2 HOH A 540 -0.137 3.465 1.551 1.00 0.00 H \n+HETATM 2699 DOH2 HOH A 540 0.751 3.575 2.004 1.00 0.00 EP \n+HETATM 2700 OM HOH A 540 0.619 3.730 1.775 1.00 0.00 EP \n+HETATM 2701 O HOH A 541 25.713 23.807 5.916 1.00 0.00 O \n+HETATM 2702 H1 HOH A 541 26.108 23.225 6.565 1.00 0.00 H \n+HETATM 2703 H2 HOH A 541 26.182 23.613 5.104 1.00 0.00 H \n+HETATM 2704 DOH2 HOH A 541 25.637 23.871 5.910 1.00 0.00 EP \n+HETATM 2705 OM HOH A 541 25.890 23.648 5.883 1.00 0.00 EP \n+HETATM 2706 O HOH A 542 20.784 12.048 4.682 1.00 0.00 O \n+HETATM 2707 H1 HOH A 542 21.144 11.470 5.355 1.00 0.00 H \n+HETATM 2708 H2 HOH A 542 20.375 12.761 5.172 1.00 0.00 H \n+HETATM 2709 DOH2 HOH A 542 20.758 12.013 4.643 1.00 0.00 EP \n+HETATM 2710 OM HOH A 542 20.774 12.076 4.921 1.00 0.00 EP \n+HETATM 2711 O HOH A 543 18.501 6.979 27.056 1.00 0.00 O \n+HETATM 2712 H1 HOH A 543 17.564 7.012 27.249 1.00 0.00 H \n+HETATM 2713 H2 HOH A 543 18.588 6.280 26.408 1.00 0.00 H \n+HETATM 2714 DOH2 HOH A 543 18.544 6.998 27.117 1.00 0.00 EP \n+HETATM 2715 OM HOH A 543 18.327 6.842 26.963 1.00 0.00 EP \n+HETATM 2716 O HOH A 544 24.802 11.893 15.695 1.00 0.00 O \n+HETATM 2717 H1 HOH A 544 24.312 11.418 16.366 1.00 0.00 H \n+HETATM 2718 H2 HOH A 544 24.131 12.243 15.110 1.00 0.00 H \n+HETATM 2719 DOH2 HOH A 544 24.889 11.886 15.701 1.00 0.00 EP \n+HETATM 2720 OM HOH A 544 24.564 11.868 15.713 1.00 0.00 EP \n+HETATM 2721 O HOH A 545 1.998 15.151 5.280 1.00 0.00 O \n+HETATM 2722 H1 HOH A 545 1.759 15.854 4.677 1.00 0.00 H \n+HETATM 2723 H2 HOH A 545 1.464 15.310 6.059 1.00 0.00 H \n+HETATM 2724 DOH2 HOH A 545 2.046 15.103 5.298 1.00 0.00 EP \n+HETATM 2725 OM HOH A 545 1.840 15.327 5.316 1.00 0.00 EP \n+HETATM 2726 O HOH A 546 26.435 3.745 17.725 1.00 0.00 O \n+HETATM 2727 H1 HOH A 546 25.828 4.459 17.527 1.00 0.00 H \n+HETATM 2728 H2 HOH A 546 25.919 2.949 17.600 1.00 0.00 H \n+HETATM 2729 DOH2 HOH A 546 26.542 3.760 17.742 1.00 0.00 EP \n+HETATM 2730 OM HOH A 546 26.205 3.728 17.659 1.00 0.00 EP \n+HETATM 2731 O HOH A 547 21.696 19.096 1.744 1.00 0.00 O \n+HETATM 2732 H1 HOH A 547 22.561 18.689 1.696 1.00 0.00 H \n+HETATM 2733 H2 HOH A 547 21.852 19.944 2.158 1.00 0.00 H \n+HETATM 2734 DOH2 HOH A 547 21.606 19.055 1.693 1.00 0.00 EP \n+HETATM 2735 OM HOH A 547 21.905 19.186 1.819 1.00 0.00 EP \n+HETATM 2736 O HOH A 548 19.812 7.334 29.415 1.00 0.00 O \n+HETATM 2737 H1 HOH A 548 19.371 7.207 28.575 1.00 0.00 H \n+HETATM 2738 H2 HOH A 548 19.118 7.617 30.010 1.00 0.00 H \n+HETATM 2739 DOH2 HOH A 548 19.910 7.332 29.451 1.00 0.00 EP \n+HETATM 2740 OM HOH A 548 19.579 7.366 29.365 1.00 0.00 EP \n+HETATM 2741 O HOH A 549 29.533 24.893 6.085 1.00 0.00 O \n+HETATM 2742 H1 HOH A 549 29.859 25.476 5.399 1.00 0.00 H \n+HETATM 2743 H2 HOH A 549 29.481 24.034 5.665 1.00 0.00 H \n+HETATM 2744 DOH2 HOH A 549 29.499 24.923 6.189 1.00 0.00 EP \n+HETATM 2745 OM HOH A 549 29.589 24.836 5.858 1.00 0.00 EP \n+HETATM 2746 O HOH A 550 20.814 0.596 8.788 1.00 0.00 O \n+HETATM 2747 H1 HOH A 550 20.983 0.819 9.704 1.00 0.00 H \n+HETATM 2748 H2 HOH A 550 20.080 -0.018 8.823 1.00 0.00 H \n+HETATM 2749 DOH2 HOH A 550 20.873 0.648 8.693 1.00 0.00 EP \n+HETATM 2750 OM HOH A 550 20.698 0.515 8.983 1.00 0.00 EP \n+HETATM 2751 O HOH A 551 24.037 4.501 28.907 1.00 0.00 O \n+HETATM 2752 H1 HOH A 551 23.689 4.413 28.020 1.00 0.00 H \n+HETATM 2753 H2 HOH A 551 23.312 4.867 29.414 1.00 0.00 H \n+HETATM 2754 DOH2 HOH A 551 24.137 4.460 28.933 1.00 0.00 EP \n+HETATM 2755 OM HOH A 551 23.817 4.558 28.829 1.00 0.00 EP \n+HETATM 2756 O HOH A 552 27.201 0.234 22.973 1.00 0.00 O \n+HETATM 2757 H1 HOH A 552 26.800 -0.358 22.338 1.00 0.00 H \n+HETATM 2758 H2 HOH A 552 27.611 -0.345 23.616 1.00 0.00 H \n+HETATM 2759 DOH2 HOH A 552 27.239 0.313 22.958 1.00 0.00 EP \n+HETATM 2760 OM HOH A 552 27.203 -0.006 22.975 1.00 0.00 EP \n+HETATM 2761 O HOH A 553 26.958 20.034 11.805 1.00 0.00 O \n+HETATM 2762 H1 HOH A 553 26.177 20.028 11.251 1.00 0.00 H \n+HETATM 2763 H2 HOH A 553 26.771 19.392 12.490 1.00 0.00 H \n+HETATM 2764 DOH2 HOH A 553 27.013 20.114 11.796 1.00 0.00 EP \n+HETATM 2765 OM HOH A 553 26.759 19.901 11.832 1.00 0.00 EP \n+HETATM 2766 O HOH A 554 23.079 5.367 12.126 1.00 0.00 O \n+HETATM 2767 H1 HOH A 554 23.432 6.183 11.771 1.00 0.00 H \n+HETATM 2768 H2 HOH A 554 23.800 4.742 12.051 1.00 0.00 H \n+HETATM 2769 DOH2 HOH A 554 22.972 5.355 12.157 1.00 0.00 EP \n+HETATM 2770 OM HOH A 554 23.300 5.406 12.037 1.00 0.00 EP \n+HETATM 2771 O HOH A 555 24.725 0.747 19.779 1.00 0.00 O \n+HETATM 2772 H1 HOH A 555 24.912 1.110 18.913 1.00 0.00 H \n+HETATM 2773 H2 HOH A 555 24.345 1.477 20.268 1.00 0.00 H \n+HETATM 2774 DOH2 HOH A 555 24.751 0.679 19.807 1.00 0.00 EP \n+HETATM 2775 OM HOH A 555 24.685 0.971 19.702 1.00 0.00 EP \n+HETATM 2776 O HOH A 556 22.742 24.248 15.043 1.00 0.00 O \n+HETATM 2777 H1 HOH A 556 23.010 23.723 15.797 1.00 0.00 H \n+HETATM 2778 H2 HOH A 556 23.536 24.334 14.516 1.00 0.00 H \n+HETATM 2779 DOH2 HOH A 556 22.683 24.301 15.034 1.00 0.00 EP \n+HETATM 2780 OM HOH A 556 22.960 24.158 15.090 1.00 0.00 EP \n+HETATM 2781 O HOH A 557 26.422 8.050 23.731 1.00 0.00 O \n+HETATM 2782 H1 HOH A 557 26.533 7.191 24.138 1.00 0.00 H \n+HETATM 2783 H2 HOH A 557 27.092 8.598 24.140 1.00 0.00 H \n+HETATM 2784 DOH2 HOH A 557 26.351 8.078 23.690 1.00 0.00 EP \n+HETATM 2785 OM HOH A 557 26.582 7.986 23.898 1.00 0.00 EP \n+HETATM 2786 O HOH A 558 -0.076 12.098 12.219 1.00 0.00 O \n+HETATM 2787 H1 HOH A 558 -0.020 11.427 12.900 1.00 0.00 H \n+HETATM 2788 H2 HOH A 558 0.826 12.395 12.100 1.00 0.00 H \n+HETATM 2789 DOH2 HOH A 558 -0.169 12.122 12.178 1.00 0.00 EP \n+HETATM 2790 OM HOH A 558 0.120 12.021 12.334 1.00 0.00 EP \n+HETATM 2791 O HOH A 559 25.663 19.579 8.266 1.00 0.00 O \n+HETATM 2792 H1 HOH A 559 25.068 18.996 8.738 1.00 0.00 H \n+HETATM 2793 H2 HOH A 559 26.516 19.147 8.321 1.00 0.00 H \n+HETATM 2794 DOH2 HOH A 559 25.651 19.681 8.223 1.00 0.00 EP \n+HETATM 2795 OM HOH A 559 25.716 19.371 8.374 1.00 0.00 EP \n+HETATM 2796 O HOH A 560 16.655 10.184 7.433 1.00 0.00 O \n+HETATM 2797 H1 HOH A 560 16.107 9.479 7.085 1.00 0.00 H \n+HETATM 2798 H2 HOH A 560 17.552 9.884 7.288 1.00 0.00 H \n+HETATM 2799 DOH2 HOH A 560 16.644 10.272 7.485 1.00 0.00 EP \n+HETATM 2800 OM HOH A 560 16.726 9.978 7.332 1.00 0.00 EP \n+HETATM 2801 O HOH A 561 18.227 25.913 5.389 1.00 0.00 O \n+HETATM 2802 H1 HOH A 561 18.890 25.261 5.615 1.00 0.00 H \n+HETATM 2803 H2 HOH A 561 17.398 25.434 5.424 1.00 0.00 H \n+HETATM 2804 DOH2 HOH A 561 18.224 26.002 5.374 1.00 0.00 EP \n+HETATM 2805 OM HOH A 561 18.193 25.681 5.443 1.00 0.00 EP \n+HETATM 2806 O HOH A 562 5.022 26.115 4.875 1.00 0.00 O \n+HETATM 2807 H1 HOH A 562 4.588 26.858 5.296 1.00 0.00 H \n+HETATM 2808 H2 HOH A 562 4.416 25.384 4.996 1.00 0.00 H \n+HETATM 2809 DOH2 HOH A 562 5.110 26.123 4.820 1.00 0.00 EP \n+HETATM 2810 OM HOH A 562 4.809 26.117 4.986 1.00 0.00 EP \n+HETATM 2811 O HOH A 563 23.299 23.268 10.493 1.00 0.00 O \n+HETATM 2812 H1 HOH A 563 22.851 24.101 10.638 1.00 0.00 H \n+HETATM 2813 H2 HOH A 563 22.607 22.609 10.554 1.00 0.00 H \n+HETATM 2814 DOH2 HOH A 563 23.403 23.269 10.473 1.00 0.00 EP \n+HETATM 2815 OM HOH A 563 23.065 23.304 10.535 1.00 0.00 EP \n+HETATM 2816 O HOH A 564 25.660 26.443 15.652 1.00 0.00 O \n+HETATM 2817 H1 HOH A 564 25.507 25.770 14.989 1.00 0.00 H \n+HETATM 2818 H2 HOH A 564 24.784 26.710 15.930 1.00 0.00 H \n+HETATM 2819 DOH2 HOH A 564 25.731 26.487 15.640 1.00 0.00 EP \n+HETATM 2820 OM HOH A 564 25.449 26.360 15.573 1.00 0.00 EP \n+HETATM 2821 O HOH A 565 -0.055 6.130 7.686 1.00 0.00 O \n+HETATM 2822 H1 HOH A 565 -0.787 5.788 7.172 1.00 0.00 H \n+HETATM 2823 H2 HOH A 565 0.459 6.642 7.061 1.00 0.00 H \n+HETATM 2824 DOH2 HOH A 565 -0.013 6.092 7.782 1.00 0.00 EP \n+HETATM 2825 OM HOH A 565 -0.100 6.165 7.452 1.00 0.00 EP \n+HETATM 2826 O HOH A 566 5.516 1.114 13.983 1.00 0.00 O \n+HETATM 2827 H1 HOH A 566 6.468 1.218 14.009 1.00 0.00 H \n+HETATM 2828 H2 HOH A 566 5.219 1.784 13.367 1.00 0.00 H \n+HETATM 2829 DOH2 HOH A 566 5.457 1.037 14.040 1.00 0.00 EP \n+HETATM 2830 OM HOH A 566 5.650 1.273 13.862 1.00 0.00 EP \n+HETATM 2831 O HOH A 567 20.738 11.283 27.743 1.00 0.00 O \n+HETATM 2832 H1 HOH A 567 21.056 10.677 28.412 1.00 0.00 H \n+HETATM 2833 H2 HOH A 567 21.385 11.225 27.040 1.00 0.00 H \n+HETATM 2834 DOH2 HOH A 567 20.641 11.341 27.760 1.00 0.00 EP \n+HETATM 2835 OM HOH A 567 20.936 11.147 27.736 1.00 0.00 EP \n+HETATM 2836 O HOH A 568 12.349 4.853 0.649 1.00 0.00 O \n+HETATM 2837 H1 HOH A 568 11.834 5.528 0.207 1.00 0.00 H \n+HETATM 2838 H2 HOH A 568 13.013 4.599 0.008 1.00 0.00 H \n+HETATM 2839 DOH2 HOH A 568 12.362 4.819 0.755 1.00 0.00 EP \n+HETATM 2840 OM HOH A 568 12.379 4.939 0.427 1.00 0.00 EP \n+HETATM 2841 O HOH A 569 24.982 1.546 17.010 1.00 0.00 O \n+HETATM 2842 H1 HOH A 569 25.149 1.760 16.092 1.00 0.00 H \n+HETATM 2843 H2 HOH A 569 24.379 0.803 16.978 1.00 0.00 H \n+HETATM 2844 DOH2 HOH A 569 25.021 1.599 17.084 1.00 0.00 EP \n+HETATM 2845 OM HOH A 569 24.893 1.437 16.815 1.00 0.00 EP \n+HETATM 2846 O HOH A 570 9.092 4.487 18.665 1.00 0.00 O \n+HETATM 2847 H1 HOH A 570 10.001 4.442 18.962 1.00 0.00 H \n+HETATM 2848 H2 HOH A 570 8.720 3.638 18.903 1.00 0.00 H \n+HETATM 2849 DOH2 HOH A 570 9.068 4.573 18.598 1.00 0.00 EP \n+HETATM 2850 OM HOH A 570 9.202 4.304 18.775 1.00 0.00 EP \n+HETATM 2851 O HOH A 571 27.632 6.584 27.350 1.00 0.00 O \n+HETATM 2852 H1 HOH A 571 28.331 7.211 27.162 1.00 0.00 H \n+HETATM 2853 H2 HOH A 571 27.332 6.294 26.489 1.00 0.00 H \n+HETATM 2854 DOH2 HOH A 571 27.611 6.554 27.417 1.00 0.00 EP \n+HETATM 2855 OM HOH A 571 27.714 6.653 27.135 1.00 0.00 EP \n+HETATM 2856 O HOH A 572 21.322 1.391 11.363 1.00 0.00 O \n+HETATM 2857 H1 HOH A 572 20.965 1.124 12.209 1.00 0.00 H \n+HETATM 2858 H2 HOH A 572 21.132 2.328 11.307 1.00 0.00 H \n+HETATM 2859 DOH2 HOH A 572 21.362 1.346 11.285 1.00 0.00 EP \n+HETATM 2860 OM HOH A 572 21.209 1.529 11.525 1.00 0.00 EP \n+HETATM 2861 O HOH A 573 22.054 6.199 16.758 1.00 0.00 O \n+HETATM 2862 H1 HOH A 573 21.530 6.902 17.141 1.00 0.00 H \n+HETATM 2863 H2 HOH A 573 21.835 6.214 15.827 1.00 0.00 H \n+HETATM 2864 DOH2 HOH A 573 22.103 6.138 16.799 1.00 0.00 EP \n+HETATM 2865 OM HOH A 573 21.902 6.346 16.646 1.00 0.00 EP \n+HETATM 2866 O HOH A 574 17.433 9.917 29.831 1.00 0.00 O \n+HETATM 2867 H1 HOH A 574 17.191 10.771 30.188 1.00 0.00 H \n+HETATM 2868 H2 HOH A 574 17.667 10.095 28.920 1.00 0.00 H \n+HETATM 2869 DOH2 HOH A 574 17.448 9.846 29.900 1.00 0.00 EP \n+HETATM 2870 OM HOH A 574 17.432 10.129 29.717 1.00 0.00 EP \n+HETATM 2871 O HOH A 575 28.224 2.298 9.300 1.00 0.00 O \n+HETATM 2872 H1 HOH A 575 28.317 1.386 9.578 1.00 0.00 H \n+HETATM 2873 H2 HOH A 575 27.802 2.246 8.443 1.00 0.00 H \n+HETATM 2874 DOH2 HOH A 575 28.259 2.389 9.345 1.00 0.00 EP \n+HETATM 2875 OM HOH A 575 28.157 2.100 9.181 1.00 0.00 EP \n+HETATM 2876 O HOH A 576 3.706 19.316 16.173 1.00 0.00 O \n+HETATM 2877 H1 HOH A 576 2.805 19.159 15.891 1.00 0.00 H \n+HETATM 2878 H2 HOH A 576 3.708 19.098 17.105 1.00 0.00 H \n+HETATM 2879 DOH2 HOH A 576 3.778 19.371 16.123 1.00 0.00 EP \n+HETATM 2880 OM HOH A 576 3.522 19.239 16.306 1.00 0.00 EP \n+HETATM 2881 O HOH A 577 21.495 15.743 19.259 1.00 0.00 O \n+HETATM 2882 H1 HOH A 577 21.381 16.151 20.118 1.00 0.00 H \n+HETATM 2883 H2 HOH A 577 21.506 14.803 19.440 1.00 0.00 H \n+HETATM 2884 DOH2 HOH A 577 21.527 15.818 19.179 1.00 0.00 EP \n+HETATM 2885 OM HOH A 577 21.474 15.634 19.473 1.00 0.00 EP \n+HETATM 2886 O HOH A 578 24.258 13.094 18.902 1.00 0.00 O \n+HETATM 2887 H1 HOH A 578 24.905 12.390 18.952 1.00 0.00 H \n+HETATM 2888 H2 HOH A 578 24.711 13.861 19.251 1.00 0.00 H \n+HETATM 2889 DOH2 HOH A 578 24.178 13.085 18.897 1.00 0.00 EP \n+HETATM 2890 OM HOH A 578 24.484 13.107 18.984 1.00 0.00 EP \n+HETATM 2891 O HOH A 579 2.643 3.881 22.132 1.00 0.00 O \n+HETATM 2892 H1 HOH A 579 2.487 3.365 21.341 1.00 0.00 H \n+HETATM 2893 H2 HOH A 579 2.990 4.713 21.812 1.00 0.00 H \n+HETATM 2894 DOH2 HOH A 579 2.658 3.842 22.211 1.00 0.00 EP \n+HETATM 2895 OM HOH A 579 2.683 3.946 21.904 1.00 0.00 EP \n+HETATM 2896 O HOH A 580 29.503 22.506 23.944 1.00 0.00 O \n+HETATM 2897 H1 HOH A 580 30.220 22.026 23.529 1.00 0.00 H \n+HETATM 2898 H2 HOH A 580 28.813 22.528 23.281 1.00 0.00 H \n+HETATM 2899 DOH2 HOH A 580 29.502 22.561 24.006 1.00 0.00 EP \n+HETATM 2900 OM HOH A 580 29.508 22.412 23.723 1.00 0.00 EP \n+HETATM 2901 O HOH A 581 22.768 30.186 6.960 1.00 0.00 O \n+HETATM 2902 H1 HOH A 581 22.056 30.432 7.550 1.00 0.00 H \n+HETATM 2903 H2 HOH A 581 23.359 29.661 7.500 1.00 0.00 H \n+HETATM 2904 DOH2 HOH A 581 22.781 30.201 6.872 1.00 0.00 EP \n+HETATM 2905 OM HOH A 581 22.743 30.129 7.192 1.00 0.00 EP \n+HETATM 2906 O HOH A 582 30.481 9.528 7.542 1.00 0.00 O \n+HETATM 2907 H1 HOH A 582 29.530 9.509 7.650 1.00 0.00 H \n+HETATM 2908 H2 HOH A 582 30.644 9.013 6.753 1.00 0.00 H \n+HETATM 2909 DOH2 HOH A 582 30.533 9.565 7.581 1.00 0.00 EP \n+HETATM 2910 OM HOH A 582 30.319 9.419 7.403 1.00 0.00 EP \n+HETATM 2911 O HOH A 583 12.575 7.626 12.076 1.00 0.00 O \n+HETATM 2912 H1 HOH A 583 13.428 7.901 12.412 1.00 0.00 H \n+HETATM 2913 H2 HOH A 583 12.538 6.687 12.255 1.00 0.00 H \n+HETATM 2914 DOH2 HOH A 583 12.493 7.697 12.014 1.00 0.00 EP \n+HETATM 2915 OM HOH A 583 12.743 7.490 12.182 1.00 0.00 EP \n+HETATM 2916 O HOH A 584 21.609 12.326 11.747 1.00 0.00 O \n+HETATM 2917 H1 HOH A 584 21.081 13.107 11.585 1.00 0.00 H \n+HETATM 2918 H2 HOH A 584 21.868 12.026 10.876 1.00 0.00 H \n+HETATM 2919 DOH2 HOH A 584 21.638 12.282 11.863 1.00 0.00 EP \n+HETATM 2920 OM HOH A 584 21.554 12.424 11.535 1.00 0.00 EP \n+HETATM 2921 O HOH A 585 27.617 9.117 18.790 1.00 0.00 O \n+HETATM 2922 H1 HOH A 585 28.455 8.934 19.216 1.00 0.00 H \n+HETATM 2923 H2 HOH A 585 26.959 8.874 19.441 1.00 0.00 H \n+HETATM 2924 DOH2 HOH A 585 27.605 9.173 18.717 1.00 0.00 EP \n+HETATM 2925 OM HOH A 585 27.654 9.030 19.011 1.00 0.00 EP \n+HETATM 2926 O HOH A 586 25.646 21.987 29.601 1.00 0.00 O \n+HETATM 2927 H1 HOH A 586 24.954 22.053 28.943 1.00 0.00 H \n+HETATM 2928 H2 HOH A 586 26.289 22.646 29.340 1.00 0.00 H \n+HETATM 2929 DOH2 HOH A 586 25.647 21.931 29.667 1.00 0.00 EP \n+HETATM 2930 OM HOH A 586 25.636 22.136 29.413 1.00 0.00 EP \n+HETATM 2931 O HOH A 587 2.809 8.786 8.952 1.00 0.00 O \n+HETATM 2932 H1 HOH A 587 3.146 9.482 9.516 1.00 0.00 H \n+HETATM 2933 H2 HOH A 587 2.017 9.155 8.562 1.00 0.00 H \n+HETATM 2934 DOH2 HOH A 587 2.813 8.705 8.934 1.00 0.00 EP \n+HETATM 2935 OM HOH A 587 2.716 9.004 8.988 1.00 0.00 EP \n+HETATM 2936 O HOH A 588 1.454 8.715 18.115 1.00 0.00 O \n+HETATM 2937 H1 HOH A 588 2.278 9.051 18.470 1.00 0.00 H \n+HETATM 2938 H2 HOH A 588 0.853 8.720 18.860 1.00 0.00 H \n+HETATM 2939 DOH2 HOH A 588 1.447 8.686 18.019 1.00 0.00 EP \n+HETATM 2940 OM HOH A 588 1.500 8.785 18.341 1.00 0.00 EP \n+HETATM 2941 O HOH A 589 27.663 6.401 12.646 1.00 0.00 O \n+HETATM 2942 H1 HOH A 589 27.582 5.672 12.032 1.00 0.00 H \n+HETATM 2943 H2 HOH A 589 27.741 7.176 12.090 1.00 0.00 H \n+HETATM 2944 DOH2 HOH A 589 27.668 6.399 12.748 1.00 0.00 EP \n+HETATM 2945 OM HOH A 589 27.662 6.411 12.406 1.00 0.00 EP \n+HETATM 2946 O HOH A 590 5.880 4.004 2.949 1.00 0.00 O \n+HETATM 2947 H1 HOH A 590 5.576 4.677 3.557 1.00 0.00 H \n+HETATM 2948 H2 HOH A 590 5.245 4.023 2.233 1.00 0.00 H \n+HETATM 2949 DOH2 HOH A 590 5.948 3.970 2.936 1.00 0.00 EP \n+HETATM 2950 OM HOH A 590 5.687 4.146 2.927 1.00 0.00 EP \n+HETATM 2951 O HOH A 591 20.416 3.009 7.544 1.00 0.00 O \n+HETATM 2952 H1 HOH A 591 20.626 2.162 7.936 1.00 0.00 H \n+HETATM 2953 H2 HOH A 591 19.547 3.221 7.883 1.00 0.00 H \n+HETATM 2954 DOH2 HOH A 591 20.461 3.056 7.457 1.00 0.00 EP \n+HETATM 2955 OM HOH A 591 20.281 2.879 7.694 1.00 0.00 EP \n+HETATM 2956 O HOH A 592 16.577 29.774 10.485 1.00 0.00 O \n+HETATM 2957 H1 HOH A 592 16.187 29.783 11.359 1.00 0.00 H \n+HETATM 2958 H2 HOH A 592 15.849 29.972 9.896 1.00 0.00 H \n+HETATM 2959 DOH2 HOH A 592 16.658 29.797 10.464 1.00 0.00 EP \n+HETATM 2960 OM HOH A 592 16.348 29.817 10.544 1.00 0.00 EP \n+HETATM 2961 O HOH A 593 5.330 9.989 5.937 1.00 0.00 O \n+HETATM 2962 H1 HOH A 593 5.086 10.597 6.635 1.00 0.00 H \n+HETATM 2963 H2 HOH A 593 5.632 10.551 5.224 1.00 0.00 H \n+HETATM 2964 DOH2 HOH A 593 5.333 9.868 5.939 1.00 0.00 EP \n+HETATM 2965 OM HOH A 593 5.342 10.229 5.934 1.00 0.00 EP \n+HETATM 2966 O HOH A 594 20.520 27.529 20.623 1.00 0.00 O \n+HETATM 2967 H1 HOH A 594 20.910 26.809 20.127 1.00 0.00 H \n+HETATM 2968 H2 HOH A 594 20.743 28.313 20.122 1.00 0.00 H \n+HETATM 2969 DOH2 HOH A 594 20.458 27.506 20.709 1.00 0.00 EP \n+HETATM 2970 OM HOH A 594 20.646 27.542 20.419 1.00 0.00 EP \n+HETATM 2971 O HOH A 595 25.979 28.613 20.962 1.00 0.00 O \n+HETATM 2972 H1 HOH A 595 25.530 27.830 20.646 1.00 0.00 H \n+HETATM 2973 H2 HOH A 595 25.525 29.339 20.536 1.00 0.00 H \n+HETATM 2974 DOH2 HOH A 595 26.075 28.620 20.999 1.00 0.00 EP \n+HETATM 2975 OM HOH A 595 25.794 28.601 20.810 1.00 0.00 EP \n+HETATM 2976 O HOH A 596 15.918 14.813 0.620 1.00 0.00 O \n+HETATM 2977 H1 HOH A 596 14.966 14.780 0.526 1.00 0.00 H \n+HETATM 2978 H2 HOH A 596 16.252 14.640 -0.260 1.00 0.00 H \n+HETATM 2979 DOH2 HOH A 596 15.962 14.829 0.682 1.00 0.00 EP \n+HETATM 2980 OM HOH A 596 15.791 14.771 0.420 1.00 0.00 EP \n+HETATM 2981 O HOH A 597 21.621 8.368 8.732 1.00 0.00 O \n+HETATM 2982 H1 HOH A 597 22.420 7.854 8.614 1.00 0.00 H \n+HETATM 2983 H2 HOH A 597 21.584 8.933 7.960 1.00 0.00 H \n+HETATM 2984 DOH2 HOH A 597 21.552 8.375 8.803 1.00 0.00 EP \n+HETATM 2985 OM HOH A 597 21.778 8.379 8.549 1.00 0.00 EP \n+HETATM 2986 O HOH A 598 24.221 10.813 7.601 1.00 0.00 O \n+HETATM 2987 H1 HOH A 598 24.795 11.299 8.192 1.00 0.00 H \n+HETATM 2988 H2 HOH A 598 24.694 10.000 7.422 1.00 0.00 H \n+HETATM 2989 DOH2 HOH A 598 24.113 10.815 7.585 1.00 0.00 EP \n+HETATM 2990 OM HOH A 598 24.436 10.746 7.685 1.00 0.00 EP \n+HETATM 2991 O HOH A 599 20.390 27.542 16.563 1.00 0.00 O \n+HETATM 2992 H1 HOH A 599 20.039 28.414 16.743 1.00 0.00 H \n+HETATM 2993 H2 HOH A 599 19.874 26.956 17.118 1.00 0.00 H \n+HETATM 2994 DOH2 HOH A 599 20.463 27.509 16.499 1.00 0.00 EP \n+HETATM 2995 OM HOH A 599 20.212 27.601 16.714 1.00 0.00 EP \n+HETATM 2996 O HOH A 600 18.140 23.859 12.076 1.00 0.00 O \n+HETATM 2997 H1 HOH A 600 18.292 24.004 11.143 1.00 0.00 H \n+HETATM 2998 H2 HOH A 600 18.990 24.023 12.486 1.00 0.00 H \n+HETATM 2999 DOH2 HOH A 600 18.044 23.832 12.133 1.00 0.00 EP \n+HETATM 3000 OM HOH A 600 18.346 23.922 11.969 1.00 0.00 EP \n+HETATM 3001 O HOH A 601 27.928 8.880 11.050 1.00 0.00 O \n+HETATM 3002 H1 HOH A 601 27.108 9.080 11.503 1.00 0.00 H \n+HETATM 3003 H2 HOH A 601 28.115 9.664 10.535 1.00 0.00 H \n+HETATM 3004 DOH2 HOH A 601 28.014 8.810 11.087 1.00 0.00 EP \n+HETATM 3005 OM HOH A 601 27.798 9.082 11.037 1.00 0.00 EP \n+HETATM 3006 O HOH A 602 24.083 8.638 0.572 1.00 0.00 O \n+HETATM 3007 H1 HOH A 602 24.885 9.119 0.368 1.00 0.00 H \n+HETATM 3008 H2 HOH A 602 24.355 7.720 0.601 1.00 0.00 H \n+HETATM 3009 DOH2 HOH A 602 24.011 8.648 0.562 1.00 0.00 EP \n+HETATM 3010 OM HOH A 602 24.304 8.548 0.536 1.00 0.00 EP \n+HETATM 3011 O HOH A 603 27.919 18.495 20.095 1.00 0.00 O \n+HETATM 3012 H1 HOH A 603 27.078 18.783 20.451 1.00 0.00 H \n+HETATM 3013 H2 HOH A 603 28.526 19.202 20.314 1.00 0.00 H \n+HETATM 3014 DOH2 HOH A 603 27.922 18.416 20.071 1.00 0.00 EP \n+HETATM 3015 OM HOH A 603 27.871 18.699 20.213 1.00 0.00 EP \n+HETATM 3016 O HOH A 604 21.258 5.324 6.222 1.00 0.00 O \n+HETATM 3017 H1 HOH A 604 21.072 4.533 6.727 1.00 0.00 H \n+HETATM 3018 H2 HOH A 604 22.184 5.250 5.991 1.00 0.00 H \n+HETATM 3019 DOH2 HOH A 604 21.199 5.365 6.208 1.00 0.00 EP \n+HETATM 3020 OM HOH A 604 21.410 5.147 6.278 1.00 0.00 EP \n+HETATM 3021 O HOH A 605 3.802 17.152 21.508 1.00 0.00 O \n+HETATM 3022 H1 HOH A 605 3.046 17.673 21.237 1.00 0.00 H \n+HETATM 3023 H2 HOH A 605 4.450 17.293 20.818 1.00 0.00 H \n+HETATM 3024 DOH2 HOH A 605 3.826 17.080 21.558 1.00 0.00 EP \n+HETATM 3025 OM HOH A 605 3.780 17.288 21.311 1.00 0.00 EP \n+HETATM 3026 O HOH A 606 23.358 26.200 7.708 1.00 0.00 O \n+HETATM 3027 H1 HOH A 606 22.734 26.705 7.186 1.00 0.00 H \n+HETATM 3028 H2 HOH A 606 23.182 25.289 7.476 1.00 0.00 H \n+HETATM 3029 DOH2 HOH A 606 23.450 26.244 7.776 1.00 0.00 EP \n+HETATM 3030 OM HOH A 606 23.194 26.117 7.554 1.00 0.00 EP \n+HETATM 3031 O HOH A 607 14.588 3.087 11.778 1.00 0.00 O \n+HETATM 3032 H1 HOH A 607 15.424 2.847 11.379 1.00 0.00 H \n+HETATM 3033 H2 HOH A 607 14.126 2.255 11.886 1.00 0.00 H \n+HETATM 3034 DOH2 HOH A 607 14.569 3.188 11.822 1.00 0.00 EP \n+HETATM 3035 OM HOH A 607 14.665 2.867 11.718 1.00 0.00 EP \n+HETATM 3036 O HOH A 608 1.862 6.132 14.138 1.00 0.00 O \n+HETATM 3037 H1 HOH A 608 0.957 6.305 14.398 1.00 0.00 H \n+HETATM 3038 H2 HOH A 608 2.211 6.991 13.901 1.00 0.00 H \n+HETATM 3039 DOH2 HOH A 608 1.925 6.048 14.115 1.00 0.00 EP \n+HETATM 3040 OM HOH A 608 1.748 6.344 14.142 1.00 0.00 EP \n+HETATM 3041 O HOH A 609 1.428 17.896 8.391 1.00 0.00 O \n+HETATM 3042 H1 HOH A 609 1.864 18.082 9.223 1.00 0.00 H \n+HETATM 3043 H2 HOH A 609 1.300 16.948 8.394 1.00 0.00 H \n+HETATM 3044 DOH2 HOH A 609 1.440 17.921 8.337 1.00 0.00 EP \n+HETATM 3045 OM HOH A 609 1.491 17.740 8.562 1.00 0.00 EP \n+HETATM 3046 O HOH A 610 10.786 17.971 21.048 1.00 0.00 O \n+HETATM 3047 H1 HOH A 610 11.137 17.875 20.163 1.00 0.00 H \n+HETATM 3048 H2 HOH A 610 10.581 17.078 21.323 1.00 0.00 H \n+HETATM 3049 DOH2 HOH A 610 10.796 18.082 21.094 1.00 0.00 EP \n+HETATM 3050 OM HOH A 610 10.816 17.768 20.923 1.00 0.00 EP \n+HETATM 3051 O HOH A 611 25.439 14.063 11.486 1.00 0.00 O \n+HETATM 3052 H1 HOH A 611 24.880 14.559 12.084 1.00 0.00 H \n+HETATM 3053 H2 HOH A 611 26.227 13.874 11.996 1.00 0.00 H \n+HETATM 3054 DOH2 HOH A 611 25.426 14.044 11.390 1.00 0.00 EP \n+HETATM 3055 OM HOH A 611 25.486 14.126 11.713 1.00 0.00 EP \n+HETATM 3056 O HOH A 612 27.724 27.802 14.542 1.00 0.00 O \n+HETATM 3057 H1 HOH A 612 27.013 27.376 15.021 1.00 0.00 H \n+HETATM 3058 H2 HOH A 612 28.491 27.695 15.106 1.00 0.00 H \n+HETATM 3059 DOH2 HOH A 612 27.724 27.833 14.419 1.00 0.00 EP \n+HETATM 3060 OM HOH A 612 27.735 27.692 14.756 1.00 0.00 EP \n+HETATM 3061 O HOH A 613 24.504 2.399 6.736 1.00 0.00 O \n+HETATM 3062 H1 HOH A 613 23.966 1.608 6.765 1.00 0.00 H \n+HETATM 3063 H2 HOH A 613 25.405 2.079 6.772 1.00 0.00 H \n+HETATM 3064 DOH2 HOH A 613 24.477 2.496 6.736 1.00 0.00 EP \n+HETATM 3065 OM HOH A 613 24.578 2.171 6.749 1.00 0.00 EP \n+HETATM 3066 O HOH A 614 19.564 15.823 16.024 1.00 0.00 O \n+HETATM 3067 H1 HOH A 614 20.331 15.251 16.064 1.00 0.00 H \n+HETATM 3068 H2 HOH A 614 19.846 16.632 16.452 1.00 0.00 H \n+HETATM 3069 DOH2 HOH A 614 19.492 15.795 15.976 1.00 0.00 EP \n+HETATM 3070 OM HOH A 614 19.779 15.872 16.120 1.00 0.00 EP \n+HETATM 3071 O HOH A 615 28.228 13.279 3.532 1.00 0.00 O \n+HETATM 3072 H1 HOH A 615 27.923 13.183 4.435 1.00 0.00 H \n+HETATM 3073 H2 HOH A 615 28.266 14.225 3.391 1.00 0.00 H \n+HETATM 3074 DOH2 HOH A 615 28.261 13.227 3.482 1.00 0.00 EP \n+HETATM 3075 OM HOH A 615 28.173 13.453 3.688 1.00 0.00 EP \n+HETATM 3076 O HOH A 616 5.359 14.469 16.735 1.00 0.00 O \n+HETATM 3077 H1 HOH A 616 6.071 14.655 17.347 1.00 0.00 H \n+HETATM 3078 H2 HOH A 616 4.621 14.984 17.062 1.00 0.00 H \n+HETATM 3079 DOH2 HOH A 616 5.376 14.422 16.675 1.00 0.00 EP \n+HETATM 3080 OM HOH A 616 5.354 14.613 16.927 1.00 0.00 EP \n+HETATM 3081 O HOH A 617 22.434 14.444 29.605 1.00 0.00 O \n+HETATM 3082 H1 HOH A 617 22.876 15.288 29.514 1.00 0.00 H \n+HETATM 3083 H2 HOH A 617 21.600 14.559 29.150 1.00 0.00 H \n+HETATM 3084 DOH2 HOH A 617 22.459 14.369 29.666 1.00 0.00 EP \n+HETATM 3085 OM HOH A 617 22.354 14.640 29.493 1.00 0.00 EP \n+HETATM 3086 O HOH A 618 24.458 4.417 8.647 1.00 0.00 O \n+HETATM 3087 H1 HOH A 618 24.432 3.728 7.983 1.00 0.00 H \n+HETATM 3088 H2 HOH A 618 25.356 4.746 8.617 1.00 0.00 H \n+HETATM 3089 DOH2 HOH A 618 24.426 4.479 8.659 1.00 0.00 EP \n+HETATM 3090 OM HOH A 618 24.637 4.343 8.505 1.00 0.00 EP \n+HETATM 3091 O HOH A 619 27.756 16.390 1.220 1.00 0.00 O \n+HETATM 3092 H1 HOH A 619 26.959 15.860 1.201 1.00 0.00 H \n+HETATM 3093 H2 HOH A 619 28.152 16.258 0.359 1.00 0.00 H \n+HETATM 3094 DOH2 HOH A 619 27.774 16.457 1.247 1.00 0.00 EP \n+HETATM 3095 OM HOH A 619 27.674 16.254 1.040 1.00 0.00 EP \n+HETATM 3096 O HOH A 620 21.413 6.178 14.104 1.00 0.00 O \n+HETATM 3097 H1 HOH A 620 20.670 6.576 13.652 1.00 0.00 H \n+HETATM 3098 H2 HOH A 620 21.977 5.854 13.402 1.00 0.00 H \n+HETATM 3099 DOH2 HOH A 620 21.447 6.184 14.207 1.00 0.00 EP \n+HETATM 3100 OM HOH A 620 21.376 6.193 13.867 1.00 0.00 EP \n+HETATM 3101 O HOH A 621 5.002 10.410 0.992 1.00 0.00 O \n+HETATM 3102 H1 HOH A 621 4.539 11.037 1.549 1.00 0.00 H \n+HETATM 3103 H2 HOH A 621 5.864 10.319 1.398 1.00 0.00 H \n+HETATM 3104 DOH2 HOH A 621 5.007 10.345 0.893 1.00 0.00 EP \n+HETATM 3105 OM HOH A 621 5.084 10.520 1.190 1.00 0.00 EP \n+HETATM 3106 O HOH A 622 17.668 16.620 11.791 1.00 0.00 O \n+HETATM 3107 H1 HOH A 622 17.545 15.744 11.425 1.00 0.00 H \n+HETATM 3108 H2 HOH A 622 18.482 16.559 12.291 1.00 0.00 H \n+HETATM 3109 DOH2 HOH A 622 17.630 16.705 11.782 1.00 0.00 EP \n+HETATM 3110 OM HOH A 622 17.810 16.428 11.819 1.00 0.00 EP \n+HETATM 3111 O HOH A 623 25.788 12.114 9.436 1.00 0.00 O \n+HETATM 3112 H1 HOH A 623 25.573 12.690 10.170 1.00 0.00 H \n+HETATM 3113 H2 HOH A 623 26.678 11.813 9.620 1.00 0.00 H \n+HETATM 3114 DOH2 HOH A 623 25.740 12.087 9.371 1.00 0.00 EP \n+HETATM 3115 OM HOH A 623 25.927 12.170 9.625 1.00 0.00 EP \n+HETATM 3116 O HOH A 624 26.865 5.832 8.447 1.00 0.00 O \n+HETATM 3117 H1 HOH A 624 26.591 6.717 8.205 1.00 0.00 H \n+HETATM 3118 H2 HOH A 624 27.265 5.479 7.652 1.00 0.00 H \n+HETATM 3119 DOH2 HOH A 624 26.832 5.771 8.527 1.00 0.00 EP \n+HETATM 3120 OM HOH A 624 26.891 5.941 8.234 1.00 0.00 EP \n+HETATM 3121 O HOH A 625 23.996 8.861 24.738 1.00 0.00 O \n+HETATM 3122 H1 HOH A 625 23.411 8.156 24.460 1.00 0.00 H \n+HETATM 3123 H2 HOH A 625 24.866 8.574 24.460 1.00 0.00 H \n+HETATM 3124 DOH2 HOH A 625 23.970 8.968 24.750 1.00 0.00 EP \n+HETATM 3125 OM HOH A 625 24.054 8.657 24.624 1.00 0.00 EP \n+HETATM 3126 O HOH A 626 16.837 17.127 1.731 1.00 0.00 O \n+HETATM 3127 H1 HOH A 626 16.511 16.302 1.371 1.00 0.00 H \n+HETATM 3128 H2 HOH A 626 17.262 17.560 0.991 1.00 0.00 H \n+HETATM 3129 DOH2 HOH A 626 16.831 17.165 1.830 1.00 0.00 EP \n+HETATM 3130 OM HOH A 626 16.857 17.046 1.505 1.00 0.00 EP \n+HETATM 3131 O HOH A 627 21.608 13.040 19.609 1.00 0.00 O \n+HETATM 3132 H1 HOH A 627 22.522 12.954 19.340 1.00 0.00 H \n+HETATM 3133 H2 HOH A 627 21.104 12.784 18.836 1.00 0.00 H \n+HETATM 3134 DOH2 HOH A 627 21.565 13.100 19.669 1.00 0.00 EP \n+HETATM 3135 OM HOH A 627 21.692 12.970 19.395 1.00 0.00 EP \n+HETATM 3136 O HOH A 628 23.233 0.470 14.129 1.00 0.00 O \n+HETATM 3137 H1 HOH A 628 23.612 -0.185 13.543 1.00 0.00 H \n+HETATM 3138 H2 HOH A 628 23.925 1.122 14.239 1.00 0.00 H \n+HETATM 3139 DOH2 HOH A 628 23.152 0.464 14.186 1.00 0.00 EP \n+HETATM 3140 OM HOH A 628 23.453 0.469 14.032 1.00 0.00 EP \n+HETATM 3141 O HOH A 629 8.580 18.453 4.676 1.00 0.00 O \n+HETATM 3142 H1 HOH A 629 8.482 17.820 5.387 1.00 0.00 H \n+HETATM 3143 H2 HOH A 629 7.690 18.588 4.350 1.00 0.00 H \n+HETATM 3144 DOH2 HOH A 629 8.681 18.484 4.622 1.00 0.00 EP \n+HETATM 3145 OM HOH A 629 8.377 18.351 4.755 1.00 0.00 EP \n+HETATM 3146 O HOH A 630 0.622 12.014 4.456 1.00 0.00 O \n+HETATM 3147 H1 HOH A 630 -0.032 12.535 3.991 1.00 0.00 H \n+HETATM 3148 H2 HOH A 630 0.272 11.123 4.444 1.00 0.00 H \n+HETATM 3149 DOH2 HOH A 630 0.646 12.036 4.520 1.00 0.00 EP \n+HETATM 3150 OM HOH A 630 0.416 11.938 4.358 1.00 0.00 EP \n+HETATM 3151 O HOH A 631 16.051 5.354 12.386 1.00 0.00 O \n+HETATM 3152 H1 HOH A 631 16.944 5.045 12.538 1.00 0.00 H \n+HETATM 3153 H2 HOH A 631 15.519 4.559 12.381 1.00 0.00 H \n+HETATM 3154 DOH2 HOH A 631 16.018 5.426 12.340 1.00 0.00 EP \n+HETATM 3155 OM HOH A 631 16.125 5.128 12.416 1.00 0.00 EP \n+HETATM 3156 O HOH A 632 25.477 2.240 14.283 1.00 0.00 O \n+HETATM 3157 H1 HOH A 632 26.411 2.055 14.182 1.00 0.00 H \n+HETATM 3158 H2 HOH A 632 25.225 2.659 13.461 1.00 0.00 H \n+HETATM 3159 DOH2 HOH A 632 25.419 2.209 14.352 1.00 0.00 EP \n+HETATM 3160 OM HOH A 632 25.617 2.288 14.094 1.00 0.00 EP \n+HETATM 3161 O HOH A 633 25.651 9.355 12.307 1.00 0.00 O \n+HETATM 3162 H1 HOH A 633 25.594 9.260 13.258 1.00 0.00 H \n+HETATM 3163 H2 HOH A 633 24.926 8.830 11.969 1.00 0.00 H \n+HETATM 3164 DOH2 HOH A 633 25.735 9.357 12.264 1.00 0.00 EP \n+HETATM 3165 OM HOH A 633 25.491 9.228 12.433 1.00 0.00 EP \n+HETATM 3166 O HOH A 634 22.794 9.393 3.793 1.00 0.00 O \n+HETATM 3167 H1 HOH A 634 23.241 10.084 3.304 1.00 0.00 H \n+HETATM 3168 H2 HOH A 634 22.951 8.598 3.282 1.00 0.00 H \n+HETATM 3169 DOH2 HOH A 634 22.728 9.405 3.843 1.00 0.00 EP \n+HETATM 3170 OM HOH A 634 22.918 9.372 3.588 1.00 0.00 EP \n+HETATM 3171 O HOH A 635 18.160 1.988 3.850 1.00 0.00 O \n+HETATM 3172 H1 HOH A 635 17.678 1.426 4.457 1.00 0.00 H \n+HETATM 3173 H2 HOH A 635 19.033 2.064 4.234 1.00 0.00 H \n+HETATM 3174 DOH2 HOH A 635 18.139 2.025 3.780 1.00 0.00 EP \n+HETATM 3175 OM HOH A 635 18.240 1.888 4.053 1.00 0.00 EP \n+HETATM 3176 O HOH A 636 28.333 9.595 24.964 1.00 0.00 O \n+HETATM 3177 H1 HOH A 636 28.858 9.022 25.524 1.00 0.00 H \n+HETATM 3178 H2 HOH A 636 28.484 10.474 25.313 1.00 0.00 H \n+HETATM 3179 DOH2 HOH A 636 28.289 9.553 24.880 1.00 0.00 EP \n+HETATM 3180 OM HOH A 636 28.472 9.658 25.150 1.00 0.00 EP \n+HETATM 3181 O HOH A 637 29.511 21.028 11.331 1.00 0.00 O \n+HETATM 3182 H1 HOH A 637 28.633 20.725 11.562 1.00 0.00 H \n+HETATM 3183 H2 HOH A 637 29.486 21.135 10.380 1.00 0.00 H \n+HETATM 3184 DOH2 HOH A 637 29.583 21.027 11.397 1.00 0.00 EP \n+HETATM 3185 OM HOH A 637 29.326 20.988 11.183 1.00 0.00 EP \n+HETATM 3186 O HOH A 638 19.489 8.560 10.322 1.00 0.00 O \n+HETATM 3187 H1 HOH A 638 19.201 9.448 10.112 1.00 0.00 H \n+HETATM 3188 H2 HOH A 638 20.274 8.430 9.791 1.00 0.00 H \n+HETATM 3189 DOH2 HOH A 638 19.443 8.478 10.379 1.00 0.00 EP \n+HETATM 3190 OM HOH A 638 19.591 8.715 10.170 1.00 0.00 EP \n+HETATM 3191 O HOH A 639 22.748 11.049 25.839 1.00 0.00 O \n+HETATM 3192 H1 HOH A 639 23.155 10.265 25.469 1.00 0.00 H \n+HETATM 3193 H2 HOH A 639 23.479 11.646 25.999 1.00 0.00 H \n+HETATM 3194 DOH2 HOH A 639 22.671 11.092 25.860 1.00 0.00 EP \n+HETATM 3195 OM HOH A 639 22.982 11.011 25.796 1.00 0.00 EP \n+HETATM 3196 O HOH A 640 22.242 17.789 13.719 1.00 0.00 O \n+HETATM 3197 H1 HOH A 640 21.807 18.487 14.209 1.00 0.00 H \n+HETATM 3198 H2 HOH A 640 22.828 18.248 13.117 1.00 0.00 H \n+HETATM 3199 DOH2 HOH A 640 22.215 17.694 13.707 1.00 0.00 EP \n+HETATM 3200 OM HOH A 640 22.273 18.027 13.696 1.00 0.00 EP \n+HETATM 3201 O HOH A 641 18.567 18.926 24.916 1.00 0.00 O \n+HETATM 3202 H1 HOH A 641 18.946 18.261 25.491 1.00 0.00 H \n+HETATM 3203 H2 HOH A 641 19.298 19.507 24.707 1.00 0.00 H \n+HETATM 3204 DOH2 HOH A 641 18.466 18.912 24.864 1.00 0.00 EP \n+HETATM 3205 OM HOH A 641 18.795 18.909 24.991 1.00 0.00 EP \n+HETATM 3206 O HOH A 642 0.645 12.380 7.177 1.00 0.00 O \n+HETATM 3207 H1 HOH A 642 0.662 12.362 6.220 1.00 0.00 H \n+HETATM 3208 H2 HOH A 642 0.771 11.467 7.436 1.00 0.00 H \n+HETATM 3209 DOH2 HOH A 642 0.634 12.456 7.233 1.00 0.00 EP \n+HETATM 3210 OM HOH A 642 0.674 12.189 7.034 1.00 0.00 EP \n+HETATM 3211 O HOH A 643 18.334 6.345 9.081 1.00 0.00 O \n+HETATM 3212 H1 HOH A 643 18.523 6.548 8.165 1.00 0.00 H \n+HETATM 3213 H2 HOH A 643 18.672 7.097 9.567 1.00 0.00 H \n+HETATM 3214 DOH2 HOH A 643 18.260 6.249 9.105 1.00 0.00 EP \n+HETATM 3215 OM HOH A 643 18.442 6.541 8.993 1.00 0.00 EP \n+HETATM 3216 O HOH A 644 17.242 2.387 11.144 1.00 0.00 O \n+HETATM 3217 H1 HOH A 644 17.410 2.418 12.085 1.00 0.00 H \n+HETATM 3218 H2 HOH A 644 17.129 1.456 10.951 1.00 0.00 H \n+HETATM 3219 DOH2 HOH A 644 17.216 2.439 11.099 1.00 0.00 EP \n+HETATM 3220 OM HOH A 644 17.253 2.202 11.297 1.00 0.00 EP \n+HETATM 3221 O HOH A 645 22.064 6.877 2.463 1.00 0.00 O \n+HETATM 3222 H1 HOH A 645 21.214 7.309 2.544 1.00 0.00 H \n+HETATM 3223 H2 HOH A 645 22.050 6.482 1.592 1.00 0.00 H \n+HETATM 3224 DOH2 HOH A 645 22.087 6.861 2.508 1.00 0.00 EP \n+HETATM 3225 OM HOH A 645 21.887 6.885 2.301 1.00 0.00 EP \n+HETATM 3226 O HOH A 646 19.519 28.876 0.726 1.00 0.00 O \n+HETATM 3227 H1 HOH A 646 20.360 28.419 0.695 1.00 0.00 H \n+HETATM 3228 H2 HOH A 646 19.059 28.481 1.466 1.00 0.00 H \n+HETATM 3229 DOH2 HOH A 646 19.481 28.941 0.672 1.00 0.00 EP \n+HETATM 3230 OM HOH A 646 19.597 28.701 0.871 1.00 0.00 EP \n+HETATM 3231 O HOH A 647 23.066 4.031 26.420 1.00 0.00 O \n+HETATM 3232 H1 HOH A 647 23.875 3.739 25.999 1.00 0.00 H \n+HETATM 3233 H2 HOH A 647 22.478 4.236 25.693 1.00 0.00 H \n+HETATM 3234 DOH2 HOH A 647 23.051 4.016 26.526 1.00 0.00 EP \n+HETATM 3235 OM HOH A 647 23.112 4.013 26.184 1.00 0.00 EP \n+HETATM 3236 O HOH A 648 29.258 20.838 16.117 1.00 0.00 O \n+HETATM 3237 H1 HOH A 648 28.936 21.529 15.538 1.00 0.00 H \n+HETATM 3238 H2 HOH A 648 29.955 21.254 16.624 1.00 0.00 H \n+HETATM 3239 DOH2 HOH A 648 29.227 20.756 16.122 1.00 0.00 EP \n+HETATM 3240 OM HOH A 648 29.335 21.065 16.102 1.00 0.00 EP \n+HETATM 3241 O HOH A 649 30.530 3.824 9.054 1.00 0.00 O \n+HETATM 3242 H1 HOH A 649 29.699 3.371 9.200 1.00 0.00 H \n+HETATM 3243 H2 HOH A 649 30.283 4.649 8.637 1.00 0.00 H \n+HETATM 3244 DOH2 HOH A 649 30.604 3.780 9.021 1.00 0.00 EP \n+HETATM 3245 OM HOH A 649 30.309 3.900 8.999 1.00 0.00 EP \n+HETATM 3246 O HOH A 650 8.291 0.757 6.983 1.00 0.00 O \n+HETATM 3247 H1 HOH A 650 8.957 1.021 7.618 1.00 0.00 H \n+HETATM 3248 H2 HOH A 650 7.788 1.554 6.817 1.00 0.00 H \n+HETATM 3249 DOH2 HOH A 650 8.246 0.653 6.931 1.00 0.00 EP \n+HETATM 3250 OM HOH A 650 8.324 0.975 7.079 1.00 0.00 EP \n+HETATM 3251 O HOH A 651 26.690 6.037 2.168 1.00 0.00 O \n+HETATM 3252 H1 HOH A 651 27.625 6.144 2.342 1.00 0.00 H \n+HETATM 3253 H2 HOH A 651 26.646 5.760 1.253 1.00 0.00 H \n+HETATM 3254 DOH2 HOH A 651 26.641 6.052 2.239 1.00 0.00 EP \n+HETATM 3255 OM HOH A 651 26.873 6.002 2.016 1.00 0.00 EP \n+HETATM 3256 O HOH A 652 25.828 20.303 1.725 1.00 0.00 O \n+HETATM 3257 H1 HOH A 652 25.758 20.891 0.974 1.00 0.00 H \n+HETATM 3258 H2 HOH A 652 26.705 19.927 1.655 1.00 0.00 H \n+HETATM 3259 DOH2 HOH A 652 25.746 20.252 1.802 1.00 0.00 EP \n+HETATM 3260 OM HOH A 652 25.993 20.346 1.557 1.00 0.00 EP \n+HETATM 3261 O HOH A 653 28.516 5.042 18.955 1.00 0.00 O \n+HETATM 3262 H1 HOH A 653 29.140 5.408 18.327 1.00 0.00 H \n+HETATM 3263 H2 HOH A 653 27.855 4.612 18.413 1.00 0.00 H \n+HETATM 3264 DOH2 HOH A 653 28.532 5.018 19.060 1.00 0.00 EP \n+HETATM 3265 OM HOH A 653 28.509 5.029 18.715 1.00 0.00 EP \n+HETATM 3266 O HOH A 654 13.059 1.469 29.237 1.00 0.00 O \n+HETATM 3267 H1 HOH A 654 12.167 1.758 29.040 1.00 0.00 H \n+HETATM 3268 H2 HOH A 654 13.049 1.282 30.175 1.00 0.00 H \n+HETATM 3269 DOH2 HOH A 654 13.138 1.469 29.174 1.00 0.00 EP \n+HETATM 3270 OM HOH A 654 12.874 1.490 29.389 1.00 0.00 EP \n+HETATM 3271 O HOH A 655 20.479 4.214 17.968 1.00 0.00 O \n+HETATM 3272 H1 HOH A 655 20.211 3.715 17.196 1.00 0.00 H \n+HETATM 3273 H2 HOH A 655 21.119 4.844 17.636 1.00 0.00 H \n+HETATM 3274 DOH2 HOH A 655 20.461 4.205 18.031 1.00 0.00 EP \n+HETATM 3275 OM HOH A 655 20.555 4.241 17.741 1.00 0.00 EP \n+HETATM 3276 O HOH A 656 19.619 13.392 29.060 1.00 0.00 O \n+HETATM 3277 H1 HOH A 656 19.630 13.020 29.942 1.00 0.00 H \n+HETATM 3278 H2 HOH A 656 19.995 12.708 28.506 1.00 0.00 H \n+HETATM 3279 DOH2 HOH A 656 19.570 13.509 29.035 1.00 0.00 EP \n+HETATM 3280 OM HOH A 656 19.698 13.176 29.127 1.00 0.00 EP \n+HETATM 3281 O HOH A 657 28.315 8.899 2.023 1.00 0.00 O \n+HETATM 3282 H1 HOH A 657 27.519 8.779 1.505 1.00 0.00 H \n+HETATM 3283 H2 HOH A 657 28.635 8.010 2.179 1.00 0.00 H \n+HETATM 3284 DOH2 HOH A 657 28.343 8.982 2.063 1.00 0.00 EP \n+HETATM 3285 OM HOH A 657 28.217 8.692 1.949 1.00 0.00 EP \n+HETATM 3286 O HOH A 658 23.965 16.708 29.529 1.00 0.00 O \n+HETATM 3287 H1 HOH A 658 24.004 17.276 30.299 1.00 0.00 H \n+HETATM 3288 H2 HOH A 658 24.750 16.929 29.027 1.00 0.00 H \n+HETATM 3289 DOH2 HOH A 658 23.938 16.606 29.545 1.00 0.00 EP \n+HETATM 3290 OM HOH A 658 24.134 16.870 29.584 1.00 0.00 EP \n+HETATM 3291 O HOH A 659 2.484 15.978 27.731 1.00 0.00 O \n+HETATM 3292 H1 HOH A 659 2.499 15.868 26.781 1.00 0.00 H \n+HETATM 3293 H2 HOH A 659 3.403 15.929 27.994 1.00 0.00 H \n+HETATM 3294 DOH2 HOH A 659 2.404 15.988 27.804 1.00 0.00 EP \n+HETATM 3295 OM HOH A 659 2.676 15.945 27.590 1.00 0.00 EP \n+HETATM 3296 O HOH A 660 21.465 13.137 24.376 1.00 0.00 O \n+HETATM 3297 H1 HOH A 660 21.778 12.295 24.706 1.00 0.00 H \n+HETATM 3298 H2 HOH A 660 20.978 12.918 23.583 1.00 0.00 H \n+HETATM 3299 DOH2 HOH A 660 21.482 13.217 24.426 1.00 0.00 EP \n+HETATM 3300 OM HOH A 660 21.430 12.920 24.281 1.00 0.00 EP \n+HETATM 3301 O HOH A 661 24.289 16.401 26.335 1.00 0.00 O \n+HETATM 3302 H1 HOH A 661 23.891 17.258 26.180 1.00 0.00 H \n+HETATM 3303 H2 HOH A 661 24.977 16.569 26.978 1.00 0.00 H \n+HETATM 3304 DOH2 HOH A 661 24.270 16.309 26.290 1.00 0.00 EP \n+HETATM 3305 OM HOH A 661 24.348 16.611 26.435 1.00 0.00 EP \n+HETATM 3306 O HOH A 662 28.850 10.129 22.247 1.00 0.00 O \n+HETATM 3307 H1 HOH A 662 28.120 10.720 22.064 1.00 0.00 H \n+HETATM 3308 H2 HOH A 662 28.735 9.882 23.165 1.00 0.00 H \n+HETATM 3309 DOH2 HOH A 662 28.894 10.088 22.186 1.00 0.00 EP \n+HETATM 3310 OM HOH A 662 28.677 10.199 22.398 1.00 0.00 EP \n+HETATM 3311 O HOH A 663 26.978 11.788 19.244 1.00 0.00 O \n+HETATM 3312 H1 HOH A 663 27.241 10.888 19.050 1.00 0.00 H \n+HETATM 3313 H2 HOH A 663 26.893 11.814 20.197 1.00 0.00 H \n+HETATM 3314 DOH2 HOH A 663 26.981 11.862 19.176 1.00 0.00 EP \n+HETATM 3315 OM HOH A 663 27.015 11.609 19.400 1.00 0.00 EP \n+HETATM 3316 O HOH A 664 27.822 13.362 24.114 1.00 0.00 O \n+HETATM 3317 H1 HOH A 664 28.242 12.818 24.781 1.00 0.00 H \n+HETATM 3318 H2 HOH A 664 27.027 13.689 24.537 1.00 0.00 H \n+HETATM 3319 DOH2 HOH A 664 27.843 13.371 24.023 1.00 0.00 EP \n+HETATM 3320 OM HOH A 664 27.745 13.318 24.338 1.00 0.00 EP \n+HETATM 3321 O HOH A 665 1.462 13.093 26.464 1.00 0.00 O \n+HETATM 3322 H1 HOH A 665 1.561 13.234 27.406 1.00 0.00 H \n+HETATM 3323 H2 HOH A 665 2.354 12.954 26.147 1.00 0.00 H \n+HETATM 3324 DOH2 HOH A 665 1.396 13.075 26.453 1.00 0.00 EP \n+HETATM 3325 OM HOH A 665 1.665 13.094 26.592 1.00 0.00 EP \n+HETATM 3326 O HOH A 666 24.763 1.800 28.744 1.00 0.00 O \n+HETATM 3327 H1 HOH A 666 25.419 1.680 28.057 1.00 0.00 H \n+HETATM 3328 H2 HOH A 666 24.650 2.748 28.805 1.00 0.00 H \n+HETATM 3329 DOH2 HOH A 666 24.676 1.723 28.771 1.00 0.00 EP \n+HETATM 3330 OM HOH A 666 24.875 1.970 28.616 1.00 0.00 EP \n+HETATM 3331 O HOH A 667 21.920 13.641 2.207 1.00 0.00 O \n+HETATM 3332 H1 HOH A 667 22.087 14.011 1.340 1.00 0.00 H \n+HETATM 3333 H2 HOH A 667 21.076 13.198 2.120 1.00 0.00 H \n+HETATM 3334 DOH2 HOH A 667 22.005 13.618 2.286 1.00 0.00 EP \n+HETATM 3335 OM HOH A 667 21.781 13.626 2.011 1.00 0.00 EP \n+HETATM 3336 O HOH A 668 0.708 3.978 26.580 1.00 0.00 O \n+HETATM 3337 H1 HOH A 668 0.893 3.411 25.831 1.00 0.00 H \n+HETATM 3338 H2 HOH A 668 0.574 4.845 26.197 1.00 0.00 H \n+HETATM 3339 DOH2 HOH A 668 0.731 3.956 26.696 1.00 0.00 EP \n+HETATM 3340 OM HOH A 668 0.719 4.040 26.347 1.00 0.00 EP \n+HETATM 3341 O HOH A 669 28.945 25.896 -0.134 1.00 0.00 O \n+HETATM 3342 H1 HOH A 669 28.476 26.670 -0.444 1.00 0.00 H \n+HETATM 3343 H2 HOH A 669 29.870 26.122 -0.227 1.00 0.00 H \n+HETATM 3344 DOH2 HOH A 669 28.910 25.800 -0.119 1.00 0.00 EP \n+HETATM 3345 OM HOH A 669 29.038 26.101 -0.217 1.00 0.00 EP \n+HETATM 3346 O HOH A 670 2.393 10.261 22.837 1.00 0.00 O \n+HETATM 3347 H1 HOH A 670 1.963 10.994 22.396 1.00 0.00 H \n+HETATM 3348 H2 HOH A 670 3.296 10.287 22.521 1.00 0.00 H \n+HETATM 3349 DOH2 HOH A 670 2.372 10.192 22.912 1.00 0.00 EP \n+HETATM 3350 OM HOH A 670 2.490 10.417 22.682 1.00 0.00 EP \n+HETATM 3351 O HOH A 671 21.319 4.314 24.345 1.00 0.00 O \n+HETATM 3352 H1 HOH A 671 20.461 4.531 24.711 1.00 0.00 H \n+HETATM 3353 H2 HOH A 671 21.266 3.379 24.146 1.00 0.00 H \n+HETATM 3354 DOH2 HOH A 671 21.404 4.369 24.368 1.00 0.00 EP \n+HETATM 3355 OM HOH A 671 21.132 4.167 24.379 1.00 0.00 EP \n+HETATM 3356 O HOH A 672 26.740 5.536 24.892 1.00 0.00 O \n+HETATM 3357 H1 HOH A 672 26.161 4.786 25.029 1.00 0.00 H \n+HETATM 3358 H2 HOH A 672 27.516 5.166 24.471 1.00 0.00 H \n+HETATM 3359 DOH2 HOH A 672 26.748 5.626 24.914 1.00 0.00 EP \n+HETATM 3360 OM HOH A 672 26.780 5.307 24.834 1.00 0.00 EP \n+HETATM 3361 O HOH A 673 28.949 28.403 2.619 1.00 0.00 O \n+HETATM 3362 H1 HOH A 673 29.229 27.665 3.159 1.00 0.00 H \n+HETATM 3363 H2 HOH A 673 29.648 28.508 1.974 1.00 0.00 H \n+HETATM 3364 DOH2 HOH A 673 28.889 28.472 2.615 1.00 0.00 EP \n+HETATM 3365 OM HOH A 673 29.150 28.273 2.598 1.00 0.00 EP \n+HETATM 3366 O HOH A 674 2.600 7.486 23.540 1.00 0.00 O \n+HETATM 3367 H1 HOH A 674 2.445 8.397 23.288 1.00 0.00 H \n+HETATM 3368 H2 HOH A 674 2.898 7.062 22.735 1.00 0.00 H \n+HETATM 3369 DOH2 HOH A 674 2.591 7.444 23.620 1.00 0.00 EP \n+HETATM 3370 OM HOH A 674 2.629 7.586 23.323 1.00 0.00 EP \n+HETATM 3371 O HOH A 675 22.118 24.653 1.492 1.00 0.00 O \n+HETATM 3372 H1 HOH A 675 21.524 24.305 2.157 1.00 0.00 H \n+HETATM 3373 H2 HOH A 675 22.127 23.985 0.806 1.00 0.00 H \n+HETATM 3374 DOH2 HOH A 675 22.169 24.734 1.493 1.00 0.00 EP \n+HETATM 3375 OM HOH A 675 21.998 24.445 1.488 1.00 0.00 EP \n+HETATM 3376 O HOH A 676 25.947 8.402 20.941 1.00 0.00 O \n+HETATM 3377 H1 HOH A 676 26.127 8.341 21.879 1.00 0.00 H \n+HETATM 3378 H2 HOH A 676 25.736 7.506 20.679 1.00 0.00 H \n+HETATM 3379 DOH2 HOH A 676 25.931 8.456 20.875 1.00 0.00 EP \n+HETATM 3380 OM HOH A 676 25.940 8.205 21.080 1.00 0.00 EP \n+HETATM 3381 O HOH A 677 3.677 18.211 24.705 1.00 0.00 O \n+HETATM 3382 H1 HOH A 677 3.069 17.472 24.676 1.00 0.00 H \n+HETATM 3383 H2 HOH A 677 4.464 17.858 25.121 1.00 0.00 H \n+HETATM 3384 DOH2 HOH A 677 3.664 18.316 24.671 1.00 0.00 EP \n+HETATM 3385 OM HOH A 677 3.714 17.987 24.785 1.00 0.00 EP \n+HETATM 3386 O HOH A 678 5.168 15.743 28.683 1.00 0.00 O \n+HETATM 3387 H1 HOH A 678 5.371 15.229 27.901 1.00 0.00 H \n+HETATM 3388 H2 HOH A 678 5.960 15.689 29.217 1.00 0.00 H \n+HETATM 3389 DOH2 HOH A 678 5.095 15.788 28.709 1.00 0.00 EP \n+HETATM 3390 OM HOH A 678 5.372 15.627 28.632 1.00 0.00 EP \n+HETATM 3391 O HOH A 679 19.011 18.718 5.358 1.00 0.00 O \n+HETATM 3392 H1 HOH A 679 18.910 17.995 4.739 1.00 0.00 H \n+HETATM 3393 H2 HOH A 679 18.645 19.476 4.902 1.00 0.00 H \n+HETATM 3394 DOH2 HOH A 679 19.010 18.690 5.467 1.00 0.00 EP \n+HETATM 3395 OM HOH A 679 18.915 18.725 5.138 1.00 0.00 EP \n+HETATM 3396 O HOH A 680 27.601 10.218 6.418 1.00 0.00 O \n+HETATM 3397 H1 HOH A 680 27.496 11.168 6.364 1.00 0.00 H \n+HETATM 3398 H2 HOH A 680 28.215 10.004 5.716 1.00 0.00 H \n+HETATM 3399 DOH2 HOH A 680 27.557 10.143 6.465 1.00 0.00 EP \n+HETATM 3400 OM HOH A 680 27.705 10.369 6.263 1.00 0.00 EP \n+HETATM 3401 O HOH A 681 22.519 6.747 23.717 1.00 0.00 O \n+HETATM 3402 H1 HOH A 681 22.684 6.725 22.774 1.00 0.00 H \n+HETATM 3403 H2 HOH A 681 22.136 5.892 23.913 1.00 0.00 H \n+HETATM 3404 DOH2 HOH A 681 22.514 6.838 23.753 1.00 0.00 EP \n+HETATM 3405 OM HOH A 681 22.474 6.567 23.564 1.00 0.00 EP \n+HETATM 3406 O HOH A 682 22.946 26.754 16.232 1.00 0.00 O \n+HETATM 3407 H1 HOH A 682 22.042 27.041 16.361 1.00 0.00 H \n+HETATM 3408 H2 HOH A 682 22.868 25.899 15.809 1.00 0.00 H \n+HETATM 3409 DOH2 HOH A 682 23.032 26.812 16.244 1.00 0.00 EP \n+HETATM 3410 OM HOH A 682 22.744 26.638 16.171 1.00 0.00 EP \n+HETATM 3411 O HOH A 683 25.683 15.018 22.744 1.00 0.00 O \n+HETATM 3412 H1 HOH A 683 26.605 14.795 22.614 1.00 0.00 H \n+HETATM 3413 H2 HOH A 683 25.458 14.625 23.588 1.00 0.00 H \n+HETATM 3414 DOH2 HOH A 683 25.651 15.096 22.691 1.00 0.00 EP \n+HETATM 3415 OM HOH A 683 25.826 14.892 22.891 1.00 0.00 EP \n+HETATM 3416 O HOH A 684 0.755 4.905 4.450 1.00 0.00 O \n+HETATM 3417 H1 HOH A 684 0.861 4.380 3.656 1.00 0.00 H \n+HETATM 3418 H2 HOH A 684 0.637 4.261 5.149 1.00 0.00 H \n+HETATM 3419 DOH2 HOH A 684 0.734 5.017 4.446 1.00 0.00 EP \n+HETATM 3420 OM HOH A 684 0.752 4.665 4.430 1.00 0.00 EP \n+HETATM 3421 O HOH A 685 26.681 29.068 1.232 1.00 0.00 O \n+HETATM 3422 H1 HOH A 685 27.427 28.818 1.779 1.00 0.00 H \n+HETATM 3423 H2 HOH A 685 26.105 29.556 1.821 1.00 0.00 H \n+HETATM 3424 DOH2 HOH A 685 26.650 29.017 1.134 1.00 0.00 EP \n+HETATM 3425 OM HOH A 685 26.716 29.117 1.465 1.00 0.00 EP \n+HETATM 3426 O HOH A 686 23.817 22.854 17.201 1.00 0.00 O \n+HETATM 3427 H1 HOH A 686 24.009 22.270 17.935 1.00 0.00 H \n+HETATM 3428 H2 HOH A 686 24.675 23.069 16.836 1.00 0.00 H \n+HETATM 3429 DOH2 HOH A 686 23.728 22.870 17.155 1.00 0.00 EP \n+HETATM 3430 OM HOH A 686 24.033 22.778 17.277 1.00 0.00 EP \n+HETATM 3431 O HOH A 687 27.768 28.169 28.815 1.00 0.00 O \n+HETATM 3432 H1 HOH A 687 27.324 28.527 29.584 1.00 0.00 H \n+HETATM 3433 H2 HOH A 687 28.175 28.928 28.398 1.00 0.00 H \n+HETATM 3434 DOH2 HOH A 687 27.799 28.071 28.796 1.00 0.00 EP \n+HETATM 3435 OM HOH A 687 27.761 28.398 28.887 1.00 0.00 EP \n+HETATM 3436 O HOH A 688 6.538 21.384 25.717 1.00 0.00 O \n+HETATM 3437 H1 HOH A 688 7.031 22.141 25.400 1.00 0.00 H \n+HETATM 3438 H2 HOH A 688 7.102 20.634 25.526 1.00 0.00 H \n+HETATM 3439 DOH2 HOH A 688 6.462 21.378 25.775 1.00 0.00 EP \n+HETATM 3440 OM HOH A 688 6.755 21.385 25.613 1.00 0.00 EP \n+HETATM 3441 O HOH A 689 24.234 18.155 1.819 1.00 0.00 O \n+HETATM 3442 H1 HOH A 689 24.834 18.900 1.835 1.00 0.00 H \n+HETATM 3443 H2 HOH A 689 24.578 17.555 2.481 1.00 0.00 H \n+HETATM 3444 DOH2 HOH A 689 24.152 18.131 1.752 1.00 0.00 EP \n+HETATM 3445 OM HOH A 689 24.427 18.185 1.958 1.00 0.00 EP \n+HETATM 3446 O HOH A 690 25.552 15.338 19.944 1.00 0.00 O \n+HETATM 3447 H1 HOH A 690 25.381 15.310 20.885 1.00 0.00 H \n+HETATM 3448 H2 HOH A 690 24.969 16.022 19.614 1.00 0.00 H \n+HETATM 3449 DOH2 HOH A 690 25.602 15.292 19.908 1.00 0.00 EP \n+HETATM 3450 OM HOH A 690 25.398 15.472 20.069 1.00 0.00 EP \n+HETATM 3451 O HOH A 691 28.262 3.350 0.620 1.00 0.00 O \n+HETATM 3452 H1 HOH A 691 27.631 2.931 1.206 1.00 0.00 H \n+HETATM 3453 H2 HOH A 691 27.775 4.070 0.219 1.00 0.00 H \n+HETATM 3454 DOH2 HOH A 691 28.368 3.323 0.602 1.00 0.00 EP \n+HETATM 3455 OM HOH A 691 28.032 3.412 0.658 1.00 0.00 EP \n+HETATM 3456 O HOH A 692 17.716 5.861 22.437 1.00 0.00 O \n+HETATM 3457 H1 HOH A 692 17.960 4.944 22.568 1.00 0.00 H \n+HETATM 3458 H2 HOH A 692 18.473 6.251 22.002 1.00 0.00 H \n+HETATM 3459 DOH2 HOH A 692 17.632 5.901 22.487 1.00 0.00 EP \n+HETATM 3460 OM HOH A 692 17.921 5.753 22.375 1.00 0.00 EP \n+HETATM 3461 O HOH A 693 18.381 3.133 27.523 1.00 0.00 O \n+HETATM 3462 H1 HOH A 693 19.301 2.902 27.650 1.00 0.00 H \n+HETATM 3463 H2 HOH A 693 18.160 3.666 28.286 1.00 0.00 H \n+HETATM 3464 DOH2 HOH A 693 18.339 3.117 27.432 1.00 0.00 EP \n+HETATM 3465 OM HOH A 693 18.524 3.195 27.706 1.00 0.00 EP \n+HETATM 3466 O HOH A 694 28.998 11.976 26.142 1.00 0.00 O \n+HETATM 3467 H1 HOH A 694 28.702 12.144 27.036 1.00 0.00 H \n+HETATM 3468 H2 HOH A 694 29.910 12.265 26.133 1.00 0.00 H \n+HETATM 3469 DOH2 HOH A 694 28.931 11.947 26.049 1.00 0.00 EP \n+HETATM 3470 OM HOH A 694 29.124 12.070 26.323 1.00 0.00 EP \n+HETATM 3471 O HOH A 695 20.229 6.282 21.271 1.00 0.00 O \n+HETATM 3472 H1 HOH A 695 20.266 5.332 21.155 1.00 0.00 H \n+HETATM 3473 H2 HOH A 695 21.123 6.579 21.105 1.00 0.00 H \n+HETATM 3474 DOH2 HOH A 695 20.162 6.307 21.308 1.00 0.00 EP \n+HETATM 3475 OM HOH A 695 20.420 6.148 21.213 1.00 0.00 EP \n+HETATM 3476 O HOH A 696 28.624 2.407 16.568 1.00 0.00 O \n+HETATM 3477 H1 HOH A 696 28.930 1.795 17.237 1.00 0.00 H \n+HETATM 3478 H2 HOH A 696 27.919 2.895 16.993 1.00 0.00 H \n+HETATM 3479 DOH2 HOH A 696 28.622 2.404 16.466 1.00 0.00 EP \n+HETATM 3480 OM HOH A 696 28.542 2.382 16.792 1.00 0.00 EP \n+HETATM 3481 O HOH A 697 26.035 12.877 27.741 1.00 0.00 O \n+HETATM 3482 H1 HOH A 697 25.470 12.758 28.504 1.00 0.00 H \n+HETATM 3483 H2 HOH A 697 26.923 12.878 28.097 1.00 0.00 H \n+HETATM 3484 DOH2 HOH A 697 26.013 12.900 27.661 1.00 0.00 EP \n+HETATM 3485 OM HOH A 697 26.101 12.853 27.971 1.00 0.00 EP \n+HETATM 3486 O HOH A 698 16.486 8.161 23.323 1.00 0.00 O \n+HETATM 3487 H1 HOH A 698 16.855 7.294 23.150 1.00 0.00 H \n+HETATM 3488 H2 HOH A 698 15.913 8.031 24.078 1.00 0.00 H \n+HETATM 3489 DOH2 HOH A 698 16.533 8.235 23.283 1.00 0.00 EP \n+HETATM 3490 OM HOH A 698 16.444 7.956 23.442 1.00 0.00 EP \n+HETATM 3491 O HOH A 699 21.697 15.400 25.786 1.00 0.00 O \n+HETATM 3492 H1 HOH A 699 22.619 15.482 26.030 1.00 0.00 H \n+HETATM 3493 H2 HOH A 699 21.652 14.583 25.290 1.00 0.00 H \n+HETATM 3494 DOH2 HOH A 699 21.641 15.504 25.777 1.00 0.00 EP \n+HETATM 3495 OM HOH A 699 21.877 15.249 25.734 1.00 0.00 EP \n+HETATM 3496 O HOH A 700 30.081 2.380 28.784 1.00 0.00 O \n+HETATM 3497 H1 HOH A 700 29.458 2.771 29.397 1.00 0.00 H \n+HETATM 3498 H2 HOH A 700 30.156 3.021 28.077 1.00 0.00 H \n+HETATM 3499 DOH2 HOH A 700 30.116 2.278 28.769 1.00 0.00 EP \n+HETATM 3500 OM HOH A 700 29.969 2.591 28.764 1.00 0.00 EP \n+HETATM 3501 O HOH A 701 23.882 4.615 5.226 1.00 0.00 O \n+HETATM 3502 H1 HOH A 701 23.308 4.321 4.518 1.00 0.00 H \n+HETATM 3503 H2 HOH A 701 24.076 3.821 5.724 1.00 0.00 H \n+HETATM 3504 DOH2 HOH A 701 23.904 4.689 5.233 1.00 0.00 EP \n+HETATM 3505 OM HOH A 701 23.804 4.392 5.183 1.00 0.00 EP \n+HETATM 3506 O HOH A 702 29.075 4.504 23.745 1.00 0.00 O \n+HETATM 3507 H1 HOH A 702 29.532 5.224 24.178 1.00 0.00 H \n+HETATM 3508 H2 HOH A 702 29.677 3.762 23.814 1.00 0.00 H \n+HETATM 3509 DOH2 HOH A 702 28.985 4.518 23.706 1.00 0.00 EP \n+HETATM 3510 OM HOH A 702 29.292 4.499 23.848 1.00 0.00 EP \n+HETATM 3511 O HOH A 703 2.603 4.362 28.511 1.00 0.00 O \n+HETATM 3512 H1 HOH A 703 2.642 5.318 28.550 1.00 0.00 H \n+HETATM 3513 H2 HOH A 703 1.915 4.177 27.871 1.00 0.00 H \n+HETATM 3514 DOH2 HOH A 703 2.684 4.314 28.528 1.00 0.00 EP \n+HETATM 3515 OM HOH A 703 2.470 4.520 28.388 1.00 0.00 EP \n+HETATM 3516 O HOH A 704 9.828 12.058 16.520 1.00 0.00 O \n+HETATM 3517 H1 HOH A 704 10.115 11.520 17.258 1.00 0.00 H \n+HETATM 3518 H2 HOH A 704 10.067 11.549 15.745 1.00 0.00 H \n+HETATM 3519 DOH2 HOH A 704 9.813 12.141 16.553 1.00 0.00 EP \n+HETATM 3520 OM HOH A 704 9.936 11.843 16.513 1.00 0.00 EP \n+HETATM 3521 O HOH A 705 2.433 15.702 24.873 1.00 0.00 O \n+HETATM 3522 H1 HOH A 705 1.702 15.247 24.455 1.00 0.00 H \n+HETATM 3523 H2 HOH A 705 3.213 15.348 24.444 1.00 0.00 H \n+HETATM 3524 DOH2 HOH A 705 2.456 15.769 24.929 1.00 0.00 EP \n+HETATM 3525 OM HOH A 705 2.443 15.536 24.699 1.00 0.00 EP \n+HETATM 3526 O HOH A 706 19.529 16.109 29.088 1.00 0.00 O \n+HETATM 3527 H1 HOH A 706 19.474 15.153 29.063 1.00 0.00 H \n+HETATM 3528 H2 HOH A 706 19.869 16.306 29.961 1.00 0.00 H \n+HETATM 3529 DOH2 HOH A 706 19.494 16.191 28.995 1.00 0.00 EP \n+HETATM 3530 OM HOH A 706 19.588 15.953 29.262 1.00 0.00 EP \n+HETATM 3531 O HOH A 707 20.456 8.533 23.241 1.00 0.00 O \n+HETATM 3532 H1 HOH A 707 21.137 7.939 23.557 1.00 0.00 H \n+HETATM 3533 H2 HOH A 707 20.113 8.108 22.455 1.00 0.00 H \n+HETATM 3534 DOH2 HOH A 707 20.446 8.617 23.247 1.00 0.00 EP \n+HETATM 3535 OM HOH A 707 20.526 8.324 23.144 1.00 0.00 EP \n+HETATM 3536 O HOH A 708 23.032 13.017 13.958 1.00 0.00 O \n+HETATM 3537 H1 HOH A 708 22.546 12.701 13.196 1.00 0.00 H \n+HETATM 3538 H2 HOH A 708 23.366 13.874 13.691 1.00 0.00 H \n+HETATM 3539 DOH2 HOH A 708 23.050 13.001 14.067 1.00 0.00 EP \n+HETATM 3540 OM HOH A 708 23.001 13.128 13.747 1.00 0.00 EP \n+HETATM 3541 O HOH A 709 20.943 19.516 27.448 1.00 0.00 O \n+HETATM 3542 H1 HOH A 709 20.573 19.752 28.299 1.00 0.00 H \n+HETATM 3543 H2 HOH A 709 20.445 18.745 27.176 1.00 0.00 H \n+HETATM 3544 DOH2 HOH A 709 21.010 19.519 27.407 1.00 0.00 EP \n+HETATM 3545 OM HOH A 709 20.765 19.406 27.567 1.00 0.00 EP \n+HETATM 3546 O HOH A 710 19.984 20.328 29.956 1.00 0.00 O \n+HETATM 3547 H1 HOH A 710 20.509 19.804 30.562 1.00 0.00 H \n+HETATM 3548 H2 HOH A 710 20.510 21.112 29.800 1.00 0.00 H \n+HETATM 3549 DOH2 HOH A 710 19.931 20.301 29.909 1.00 0.00 EP \n+HETATM 3550 OM HOH A 710 20.200 20.382 30.048 1.00 0.00 EP \n+HETATM 3551 O HOH A 711 22.917 6.902 20.936 1.00 0.00 O \n+HETATM 3552 H1 HOH A 711 23.021 7.791 20.595 1.00 0.00 H \n+HETATM 3553 H2 HOH A 711 23.704 6.441 20.648 1.00 0.00 H \n+HETATM 3554 DOH2 HOH A 711 22.844 6.879 21.000 1.00 0.00 EP \n+HETATM 3555 OM HOH A 711 23.100 6.990 20.807 1.00 0.00 EP \n+HETATM 3556 O HOH A 712 0.532 6.392 25.103 1.00 0.00 O \n+HETATM 3557 H1 HOH A 712 1.229 6.748 24.551 1.00 0.00 H \n+HETATM 3558 H2 HOH A 712 0.354 7.083 25.741 1.00 0.00 H \n+HETATM 3559 DOH2 HOH A 712 0.485 6.297 25.103 1.00 0.00 EP \n+HETATM 3560 OM HOH A 712 0.639 6.606 25.121 1.00 0.00 EP \n+HETATM 3561 O HOH A 713 20.922 4.101 10.976 1.00 0.00 O \n+HETATM 3562 H1 HOH A 713 21.667 4.582 11.338 1.00 0.00 H \n+HETATM 3563 H2 HOH A 713 20.890 4.365 10.057 1.00 0.00 H \n+HETATM 3564 DOH2 HOH A 713 20.875 4.038 11.011 1.00 0.00 EP \n+HETATM 3565 OM HOH A 713 21.068 4.253 10.862 1.00 0.00 EP \n+HETATM 3566 O HOH A 714 4.527 11.733 7.928 1.00 0.00 O \n+HETATM 3567 H1 HOH A 714 4.237 11.366 8.763 1.00 0.00 H \n+HETATM 3568 H2 HOH A 714 5.043 12.502 8.170 1.00 0.00 H \n+HETATM 3569 DOH2 HOH A 714 4.518 11.705 7.832 1.00 0.00 EP \n+HETATM 3570 OM HOH A 714 4.573 11.815 8.149 1.00 0.00 EP \n+HETATM 3571 O HOH A 715 5.861 5.423 12.879 1.00 0.00 O \n+HETATM 3572 H1 HOH A 715 6.312 5.344 12.038 1.00 0.00 H \n+HETATM 3573 H2 HOH A 715 5.629 6.350 12.941 1.00 0.00 H \n+HETATM 3574 DOH2 HOH A 715 5.831 5.312 12.965 1.00 0.00 EP \n+HETATM 3575 OM HOH A 715 5.906 5.597 12.719 1.00 0.00 EP \n+HETATM 3576 O HOH A 716 25.479 14.132 25.365 1.00 0.00 O \n+HETATM 3577 H1 HOH A 716 25.675 13.657 26.173 1.00 0.00 H \n+HETATM 3578 H2 HOH A 716 25.041 14.931 25.657 1.00 0.00 H \n+HETATM 3579 DOH2 HOH A 716 25.527 14.127 25.260 1.00 0.00 EP \n+HETATM 3580 OM HOH A 716 25.429 14.198 25.591 1.00 0.00 EP \n+HETATM 3581 O HOH A 717 27.335 25.634 22.524 1.00 0.00 O \n+HETATM 3582 H1 HOH A 717 28.281 25.611 22.665 1.00 0.00 H \n+HETATM 3583 H2 HOH A 717 27.188 26.427 22.009 1.00 0.00 H \n+HETATM 3584 DOH2 HOH A 717 27.303 25.568 22.559 1.00 0.00 EP \n+HETATM 3585 OM HOH A 717 27.499 25.792 22.447 1.00 0.00 EP \n+HETATM 3586 O HOH A 718 -0.281 10.043 14.136 1.00 0.00 O \n+HETATM 3587 H1 HOH A 718 -0.898 9.672 14.767 1.00 0.00 H \n+HETATM 3588 H2 HOH A 718 -0.112 9.332 13.518 1.00 0.00 H \n+HETATM 3589 DOH2 HOH A 718 -0.225 10.108 14.131 1.00 0.00 EP \n+HETATM 3590 OM HOH A 718 -0.373 9.821 14.138 1.00 0.00 EP \n+HETATM 3591 O HOH A 719 21.837 14.276 16.108 1.00 0.00 O \n+HETATM 3592 H1 HOH A 719 22.237 13.786 15.388 1.00 0.00 H \n+HETATM 3593 H2 HOH A 719 22.570 14.499 16.682 1.00 0.00 H \n+HETATM 3594 DOH2 HOH A 719 21.739 14.288 16.137 1.00 0.00 EP \n+HETATM 3595 OM HOH A 719 22.070 14.221 16.078 1.00 0.00 EP \n+HETATM 3596 O HOH A 720 20.934 24.119 27.197 1.00 0.00 O \n+HETATM 3597 H1 HOH A 720 21.802 24.518 27.131 1.00 0.00 H \n+HETATM 3598 H2 HOH A 720 20.420 24.745 27.707 1.00 0.00 H \n+HETATM 3599 DOH2 HOH A 720 20.898 24.064 27.151 1.00 0.00 EP \n+HETATM 3600 OM HOH A 720 21.007 24.330 27.288 1.00 0.00 EP \n+HETATM 3601 O HOH A 721 3.412 16.101 17.848 1.00 0.00 O \n+HETATM 3602 H1 HOH A 721 3.577 16.996 18.144 1.00 0.00 H \n+HETATM 3603 H2 HOH A 721 2.617 16.166 17.320 1.00 0.00 H \n+HETATM 3604 DOH2 HOH A 721 3.460 16.032 17.854 1.00 0.00 EP \n+HETATM 3605 OM HOH A 721 3.283 16.298 17.800 1.00 0.00 EP \n+HETATM 3606 O HOH A 722 23.751 2.838 21.422 1.00 0.00 O \n+HETATM 3607 H1 HOH A 722 24.579 3.320 21.406 1.00 0.00 H \n+HETATM 3608 H2 HOH A 722 23.798 2.308 22.218 1.00 0.00 H \n+HETATM 3609 DOH2 HOH A 722 23.722 2.826 21.369 1.00 0.00 EP \n+HETATM 3610 OM HOH A 722 23.931 2.828 21.582 1.00 0.00 EP \n+HETATM 3611 O HOH A 723 0.032 8.355 26.950 1.00 0.00 O \n+HETATM 3612 H1 HOH A 723 0.598 8.976 26.491 1.00 0.00 H \n+HETATM 3613 H2 HOH A 723 0.534 8.098 27.723 1.00 0.00 H \n+HETATM 3614 DOH2 HOH A 723 -0.033 8.288 26.899 1.00 0.00 EP \n+HETATM 3615 OM HOH A 723 0.251 8.430 27.014 1.00 0.00 EP \n+HETATM 3616 O HOH A 724 13.784 6.723 15.575 1.00 0.00 O \n+HETATM 3617 H1 HOH A 724 14.173 7.128 14.800 1.00 0.00 H \n+HETATM 3618 H2 HOH A 724 13.559 7.460 16.144 1.00 0.00 H \n+HETATM 3619 DOH2 HOH A 724 13.771 6.621 15.586 1.00 0.00 EP \n+HETATM 3620 OM HOH A 724 13.817 6.957 15.532 1.00 0.00 EP \n+HETATM 3621 O HOH A 725 28.584 12.663 28.813 1.00 0.00 O \n+HETATM 3622 H1 HOH A 725 29.379 13.191 28.883 1.00 0.00 H \n+HETATM 3623 H2 HOH A 725 28.475 12.276 29.681 1.00 0.00 H \n+HETATM 3624 DOH2 HOH A 725 28.518 12.655 28.721 1.00 0.00 EP \n+HETATM 3625 OM HOH A 725 28.724 12.692 29.005 1.00 0.00 EP \n+HETATM 3626 O HOH A 726 3.214 14.598 20.347 1.00 0.00 O \n+HETATM 3627 H1 HOH A 726 3.337 15.390 20.872 1.00 0.00 H \n+HETATM 3628 H2 HOH A 726 3.254 14.903 19.441 1.00 0.00 H \n+HETATM 3629 DOH2 HOH A 726 3.188 14.543 20.376 1.00 0.00 EP \n+HETATM 3630 OM HOH A 726 3.247 14.823 20.269 1.00 0.00 EP \n+HETATM 3631 O HOH A 727 19.602 9.278 20.118 1.00 0.00 O \n+HETATM 3632 H1 HOH A 727 19.736 10.216 20.255 1.00 0.00 H \n+HETATM 3633 H2 HOH A 727 18.676 9.137 20.314 1.00 0.00 H \n+HETATM 3634 DOH2 HOH A 727 19.650 9.243 20.067 1.00 0.00 EP \n+HETATM 3635 OM HOH A 727 19.439 9.441 20.186 1.00 0.00 EP \n+HETATM 3636 O HOH A 728 16.695 2.370 14.484 1.00 0.00 O \n+HETATM 3637 H1 HOH A 728 16.876 1.906 15.301 1.00 0.00 H \n+HETATM 3638 H2 HOH A 728 16.348 3.218 14.761 1.00 0.00 H \n+HETATM 3639 DOH2 HOH A 728 16.689 2.311 14.405 1.00 0.00 EP \n+HETATM 3640 OM HOH A 728 16.661 2.449 14.708 1.00 0.00 EP \n+HETATM 3641 O HOH A 729 5.757 14.311 26.506 1.00 0.00 O \n+HETATM 3642 H1 HOH A 729 5.130 13.653 26.207 1.00 0.00 H \n+HETATM 3643 H2 HOH A 729 6.493 13.804 26.848 1.00 0.00 H \n+HETATM 3644 DOH2 HOH A 729 5.741 14.432 26.540 1.00 0.00 EP \n+HETATM 3645 OM HOH A 729 5.779 14.072 26.515 1.00 0.00 EP \n+HETATM 3646 O HOH A 730 6.069 3.608 24.502 1.00 0.00 O \n+HETATM 3647 H1 HOH A 730 6.811 3.026 24.665 1.00 0.00 H \n+HETATM 3648 H2 HOH A 730 5.561 3.582 25.313 1.00 0.00 H \n+HETATM 3649 DOH2 HOH A 730 6.026 3.644 24.414 1.00 0.00 EP \n+HETATM 3650 OM HOH A 730 6.117 3.483 24.702 1.00 0.00 EP \n+HETATM 3651 O HOH A 731 0.428 14.330 23.384 1.00 0.00 O \n+HETATM 3652 H1 HOH A 731 -0.456 14.017 23.575 1.00 0.00 H \n+HETATM 3653 H2 HOH A 731 0.798 13.664 22.804 1.00 0.00 H \n+HETATM 3654 DOH2 HOH A 731 0.459 14.414 23.388 1.00 0.00 EP \n+HETATM 3655 OM HOH A 731 0.322 14.129 23.304 1.00 0.00 EP \n+HETATM 3656 O HOH A 732 1.529 12.647 21.455 1.00 0.00 O \n+HETATM 3657 H1 HOH A 732 2.168 13.262 21.095 1.00 0.00 H \n+HETATM 3658 H2 HOH A 732 0.754 12.756 20.904 1.00 0.00 H \n+HETATM 3659 DOH2 HOH A 732 1.525 12.617 21.539 1.00 0.00 EP \n+HETATM 3660 OM HOH A 732 1.501 12.795 21.269 1.00 0.00 EP \n+HETATM 3661 O HOH A 733 25.990 8.119 6.951 1.00 0.00 O \n+HETATM 3662 H1 HOH A 733 26.585 8.847 6.776 1.00 0.00 H \n+HETATM 3663 H2 HOH A 733 25.985 7.612 6.139 1.00 0.00 H \n+HETATM 3664 DOH2 HOH A 733 25.928 8.075 7.042 1.00 0.00 EP \n+HETATM 3665 OM HOH A 733 26.111 8.164 6.749 1.00 0.00 EP \n+HETATM 3666 O HOH A 734 4.850 7.837 0.141 1.00 0.00 O \n+HETATM 3667 H1 HOH A 734 4.862 8.747 0.436 1.00 0.00 H \n+HETATM 3668 H2 HOH A 734 5.770 7.621 -0.011 1.00 0.00 H \n+HETATM 3669 DOH2 HOH A 734 4.767 7.782 0.143 1.00 0.00 EP \n+HETATM 3670 OM HOH A 734 5.041 7.979 0.170 1.00 0.00 EP \n+HETATM 3671 O HOH A 735 3.985 4.547 14.831 1.00 0.00 O \n+HETATM 3672 H1 HOH A 735 4.648 4.824 14.198 1.00 0.00 H \n+HETATM 3673 H2 HOH A 735 3.246 5.135 14.677 1.00 0.00 H \n+HETATM 3674 DOH2 HOH A 735 3.965 4.477 14.855 1.00 0.00 EP \n+HETATM 3675 OM HOH A 735 3.969 4.724 14.669 1.00 0.00 EP \n+HETATM 3676 O HOH A 736 14.428 8.767 19.483 1.00 0.00 O \n+HETATM 3677 H1 HOH A 736 14.374 9.657 19.829 1.00 0.00 H \n+HETATM 3678 H2 HOH A 736 14.122 8.841 18.579 1.00 0.00 H \n+HETATM 3679 DOH2 HOH A 736 14.440 8.698 19.522 1.00 0.00 EP \n+HETATM 3680 OM HOH A 736 14.354 8.965 19.369 1.00 0.00 EP \n+HETATM 3681 O HOH A 737 2.158 28.728 21.768 1.00 0.00 O \n+HETATM 3682 H1 HOH A 737 1.247 28.456 21.885 1.00 0.00 H \n+HETATM 3683 H2 HOH A 737 2.191 29.078 20.878 1.00 0.00 H \n+HETATM 3684 DOH2 HOH A 737 2.208 28.747 21.848 1.00 0.00 EP \n+HETATM 3685 OM HOH A 737 1.978 28.744 21.609 1.00 0.00 EP \n+HETATM 3686 O HOH A 738 21.062 17.059 21.536 1.00 0.00 O \n+HETATM 3687 H1 HOH A 738 21.448 17.208 22.399 1.00 0.00 H \n+HETATM 3688 H2 HOH A 738 20.702 17.909 21.283 1.00 0.00 H \n+HETATM 3689 DOH2 HOH A 738 21.044 16.980 21.451 1.00 0.00 EP \n+HETATM 3690 OM HOH A 738 21.067 17.264 21.661 1.00 0.00 EP \n+HETATM 3691 O HOH A 739 26.759 11.938 21.954 1.00 0.00 O \n+HETATM 3692 H1 HOH A 739 25.941 11.610 22.328 1.00 0.00 H \n+HETATM 3693 H2 HOH A 739 27.163 12.439 22.663 1.00 0.00 H \n+HETATM 3694 DOH2 HOH A 739 26.814 11.908 21.864 1.00 0.00 EP \n+HETATM 3695 OM HOH A 739 26.674 11.973 22.176 1.00 0.00 EP \n+HETATM 3696 O HOH A 740 1.980 4.004 17.803 1.00 0.00 O \n+HETATM 3697 H1 HOH A 740 1.963 3.492 16.994 1.00 0.00 H \n+HETATM 3698 H2 HOH A 740 1.385 4.735 17.636 1.00 0.00 H \n+HETATM 3699 DOH2 HOH A 740 2.047 3.989 17.871 1.00 0.00 EP \n+HETATM 3700 OM HOH A 740 1.855 4.049 17.603 1.00 0.00 EP \n+HETATM 3701 O HOH A 741 3.124 2.755 5.530 1.00 0.00 O \n+HETATM 3702 H1 HOH A 741 3.644 3.274 6.143 1.00 0.00 H \n+HETATM 3703 H2 HOH A 741 2.223 2.846 5.843 1.00 0.00 H \n+HETATM 3704 DOH2 HOH A 741 3.145 2.684 5.483 1.00 0.00 EP \n+HETATM 3705 OM HOH A 741 3.046 2.880 5.720 1.00 0.00 EP \n+HETATM 3706 O HOH A 742 21.872 10.575 22.049 1.00 0.00 O \n+HETATM 3707 H1 HOH A 742 21.278 11.324 22.026 1.00 0.00 H \n+HETATM 3708 H2 HOH A 742 21.375 9.888 22.495 1.00 0.00 H \n+HETATM 3709 DOH2 HOH A 742 21.977 10.565 22.011 1.00 0.00 EP \n+HETATM 3710 OM HOH A 742 21.648 10.588 22.136 1.00 0.00 EP \n+HETATM 3711 O HOH A 743 29.655 20.578 20.685 1.00 0.00 O \n+HETATM 3712 H1 HOH A 743 30.175 20.938 21.404 1.00 0.00 H \n+HETATM 3713 H2 HOH A 743 29.320 21.346 20.223 1.00 0.00 H \n+HETATM 3714 DOH2 HOH A 743 29.658 20.480 20.675 1.00 0.00 EP \n+HETATM 3715 OM HOH A 743 29.693 20.809 20.738 1.00 0.00 EP \n+HETATM 3716 O HOH A 744 18.395 25.743 0.887 1.00 0.00 O \n+HETATM 3717 H1 HOH A 744 18.641 26.319 1.612 1.00 0.00 H \n+HETATM 3718 H2 HOH A 744 18.972 26.001 0.169 1.00 0.00 H \n+HETATM 3719 DOH2 HOH A 744 18.323 25.682 0.880 1.00 0.00 EP \n+HETATM 3720 OM HOH A 744 18.564 25.914 0.889 1.00 0.00 EP \n+HETATM 3721 O HOH A 745 23.955 15.524 13.452 1.00 0.00 O \n+HETATM 3722 H1 HOH A 745 23.290 16.208 13.523 1.00 0.00 H \n+HETATM 3723 H2 HOH A 745 24.431 15.564 14.281 1.00 0.00 H \n+HETATM 3724 DOH2 HOH A 745 23.960 15.435 13.405 1.00 0.00 EP \n+HETATM 3725 OM HOH A 745 23.916 15.672 13.636 1.00 0.00 EP \n+HETATM 3726 O HOH A 746 23.056 14.404 4.606 1.00 0.00 O \n+HETATM 3727 H1 HOH A 746 22.350 14.464 5.250 1.00 0.00 H \n+HETATM 3728 H2 HOH A 746 22.624 14.115 3.802 1.00 0.00 H \n+HETATM 3729 DOH2 HOH A 746 23.155 14.445 4.623 1.00 0.00 EP \n+HETATM 3730 OM HOH A 746 22.822 14.357 4.573 1.00 0.00 EP \n+HETATM 3731 O HOH A 747 19.538 0.141 16.930 1.00 0.00 O \n+HETATM 3732 H1 HOH A 747 19.882 0.442 16.089 1.00 0.00 H \n+HETATM 3733 H2 HOH A 747 18.649 0.495 16.966 1.00 0.00 H \n+HETATM 3734 DOH2 HOH A 747 19.601 0.067 16.986 1.00 0.00 EP \n+HETATM 3735 OM HOH A 747 19.426 0.275 16.765 1.00 0.00 EP \n+HETATM 3736 O HOH A 748 24.882 26.215 19.983 1.00 0.00 O \n+HETATM 3737 H1 HOH A 748 25.555 25.700 19.539 1.00 0.00 H \n+HETATM 3738 H2 HOH A 748 24.145 26.226 19.372 1.00 0.00 H \n+HETATM 3739 DOH2 HOH A 748 24.877 26.255 20.060 1.00 0.00 EP \n+HETATM 3740 OM HOH A 748 24.869 26.112 19.767 1.00 0.00 EP \n+HETATM 3741 O HOH A 749 22.458 30.474 4.195 1.00 0.00 O \n+HETATM 3742 H1 HOH A 749 21.771 31.138 4.250 1.00 0.00 H \n+HETATM 3743 H2 HOH A 749 22.720 30.324 5.104 1.00 0.00 H \n+HETATM 3744 DOH2 HOH A 749 22.494 30.410 4.131 1.00 0.00 EP \n+HETATM 3745 OM HOH A 749 22.371 30.579 4.393 1.00 0.00 EP \n+HETATM 3746 O HOH A 750 20.690 24.429 13.095 1.00 0.00 O \n+HETATM 3747 H1 HOH A 750 21.177 24.789 12.354 1.00 0.00 H \n+HETATM 3748 H2 HOH A 750 21.350 24.300 13.776 1.00 0.00 H \n+HETATM 3749 DOH2 HOH A 750 20.600 24.453 13.096 1.00 0.00 EP \n+HETATM 3750 OM HOH A 750 20.925 24.476 13.083 1.00 0.00 EP \n+HETATM 3751 O HOH A 751 16.004 2.636 7.020 1.00 0.00 O \n+HETATM 3752 H1 HOH A 751 16.317 1.987 6.389 1.00 0.00 H \n+HETATM 3753 H2 HOH A 751 16.787 2.897 7.504 1.00 0.00 H \n+HETATM 3754 DOH2 HOH A 751 15.936 2.639 7.051 1.00 0.00 EP \n+HETATM 3755 OM HOH A 751 16.228 2.556 6.990 1.00 0.00 EP \n+HETATM 3756 O HOH A 752 18.062 3.625 8.762 1.00 0.00 O \n+HETATM 3757 H1 HOH A 752 18.112 4.568 8.919 1.00 0.00 H \n+HETATM 3758 H2 HOH A 752 17.771 3.257 9.596 1.00 0.00 H \n+HETATM 3759 DOH2 HOH A 752 18.094 3.582 8.684 1.00 0.00 EP \n+HETATM 3760 OM HOH A 752 18.013 3.743 8.965 1.00 0.00 EP \n+HETATM 3761 O HOH A 753 20.444 23.424 3.302 1.00 0.00 O \n+HETATM 3762 H1 HOH A 753 19.645 23.066 2.916 1.00 0.00 H \n+HETATM 3763 H2 HOH A 753 20.209 23.609 4.212 1.00 0.00 H \n+HETATM 3764 DOH2 HOH A 753 20.536 23.422 3.256 1.00 0.00 EP \n+HETATM 3765 OM HOH A 753 20.232 23.389 3.410 1.00 0.00 EP \n+HETATM 3766 O HOH A 754 21.182 -0.309 19.076 1.00 0.00 O \n+HETATM 3767 H1 HOH A 754 22.052 -0.296 18.677 1.00 0.00 H \n+HETATM 3768 H2 HOH A 754 20.582 -0.141 18.350 1.00 0.00 H \n+HETATM 3769 DOH2 HOH A 754 21.147 -0.339 19.190 1.00 0.00 EP \n+HETATM 3770 OM HOH A 754 21.238 -0.272 18.845 1.00 0.00 EP \n+HETATM 3771 O HOH A 755 26.650 22.101 7.950 1.00 0.00 O \n+HETATM 3772 H1 HOH A 755 26.385 22.595 8.725 1.00 0.00 H \n+HETATM 3773 H2 HOH A 755 26.230 21.247 8.055 1.00 0.00 H \n+HETATM 3774 DOH2 HOH A 755 26.697 22.126 7.905 1.00 0.00 EP \n+HETATM 3775 OM HOH A 755 26.510 22.027 8.130 1.00 0.00 EP \n+HETATM 3776 O HOH A 756 20.673 2.459 4.864 1.00 0.00 O \n+HETATM 3777 H1 HOH A 756 20.611 2.711 5.786 1.00 0.00 H \n+HETATM 3778 H2 HOH A 756 21.103 3.202 4.441 1.00 0.00 H \n+HETATM 3779 DOH2 HOH A 756 20.650 2.387 4.819 1.00 0.00 EP \n+HETATM 3780 OM HOH A 756 20.749 2.664 4.966 1.00 0.00 EP \n+HETATM 3781 O HOH A 757 21.299 10.372 16.321 1.00 0.00 O \n+HETATM 3782 H1 HOH A 757 21.315 10.363 15.364 1.00 0.00 H \n+HETATM 3783 H2 HOH A 757 22.216 10.270 16.577 1.00 0.00 H \n+HETATM 3784 DOH2 HOH A 757 21.233 10.381 16.388 1.00 0.00 EP \n+HETATM 3785 OM HOH A 757 21.490 10.349 16.178 1.00 0.00 EP \n+HETATM 3786 O HOH A 758 16.335 18.252 13.533 1.00 0.00 O \n+HETATM 3787 H1 HOH A 758 16.644 17.647 12.859 1.00 0.00 H \n+HETATM 3788 H2 HOH A 758 17.079 18.832 13.694 1.00 0.00 H \n+HETATM 3789 DOH2 HOH A 758 16.227 18.261 13.591 1.00 0.00 EP \n+HETATM 3790 OM HOH A 758 16.551 18.247 13.428 1.00 0.00 EP \n+HETATM 3791 O HOH A 759 28.235 18.585 8.782 1.00 0.00 O \n+HETATM 3792 H1 HOH A 759 28.282 18.445 9.728 1.00 0.00 H \n+HETATM 3793 H2 HOH A 759 28.817 19.327 8.620 1.00 0.00 H \n+HETATM 3794 DOH2 HOH A 759 28.177 18.551 8.751 1.00 0.00 EP \n+HETATM 3795 OM HOH A 759 28.364 18.708 8.943 1.00 0.00 EP \n+HETATM 3796 O HOH A 760 1.458 25.545 14.458 1.00 0.00 O \n+HETATM 3797 H1 HOH A 760 1.185 24.641 14.615 1.00 0.00 H \n+HETATM 3798 H2 HOH A 760 1.373 25.661 13.512 1.00 0.00 H \n+HETATM 3799 DOH2 HOH A 760 1.488 25.614 14.532 1.00 0.00 EP \n+HETATM 3800 OM HOH A 760 1.385 25.383 14.296 1.00 0.00 EP \n+HETATM 3801 O HOH A 761 2.328 29.520 19.087 1.00 0.00 O \n+HETATM 3802 H1 HOH A 761 2.893 28.765 18.925 1.00 0.00 H \n+HETATM 3803 H2 HOH A 761 1.827 29.623 18.278 1.00 0.00 H \n+HETATM 3804 DOH2 HOH A 761 2.327 29.560 19.163 1.00 0.00 EP \n+HETATM 3805 OM HOH A 761 2.341 29.386 18.888 1.00 0.00 EP \n+HETATM 3806 O HOH A 762 1.555 18.559 20.640 1.00 0.00 O \n+HETATM 3807 H1 HOH A 762 0.887 19.233 20.520 1.00 0.00 H \n+HETATM 3808 H2 HOH A 762 1.070 17.791 20.941 1.00 0.00 H \n+HETATM 3809 DOH2 HOH A 762 1.673 18.562 20.621 1.00 0.00 EP \n+HETATM 3810 OM HOH A 762 1.319 18.540 20.677 1.00 0.00 EP \n+HETATM 3811 O HOH A 763 2.226 28.349 3.260 1.00 0.00 O \n+HETATM 3812 H1 HOH A 763 1.824 28.645 2.444 1.00 0.00 H \n+HETATM 3813 H2 HOH A 763 2.691 29.118 3.591 1.00 0.00 H \n+HETATM 3814 DOH2 HOH A 763 2.214 28.249 3.273 1.00 0.00 EP \n+HETATM 3815 OM HOH A 763 2.239 28.568 3.161 1.00 0.00 EP \n+HETATM 3816 O HOH A 764 17.622 19.460 7.628 1.00 0.00 O \n+HETATM 3817 H1 HOH A 764 16.688 19.421 7.426 1.00 0.00 H \n+HETATM 3818 H2 HOH A 764 18.053 19.162 6.827 1.00 0.00 H \n+HETATM 3819 DOH2 HOH A 764 17.656 19.466 7.704 1.00 0.00 EP \n+HETATM 3820 OM HOH A 764 17.519 19.391 7.422 1.00 0.00 EP \n+HETATM 3821 O HOH A 765 25.070 25.310 29.246 1.00 0.00 O \n+HETATM 3822 H1 HOH A 765 25.826 24.819 28.926 1.00 0.00 H \n+HETATM 3823 H2 HOH A 765 24.459 25.318 28.509 1.00 0.00 H \n+HETATM 3824 DOH2 HOH A 765 25.062 25.378 29.333 1.00 0.00 EP \n+HETATM 3825 OM HOH A 765 25.100 25.211 29.029 1.00 0.00 EP \n+HETATM 3826 O HOH A 766 26.295 18.157 13.622 1.00 0.00 O \n+HETATM 3827 H1 HOH A 766 25.898 18.335 14.475 1.00 0.00 H \n+HETATM 3828 H2 HOH A 766 26.829 17.375 13.765 1.00 0.00 H \n+HETATM 3829 DOH2 HOH A 766 26.267 18.228 13.520 1.00 0.00 EP \n+HETATM 3830 OM HOH A 766 26.323 18.033 13.826 1.00 0.00 EP \n+HETATM 3831 O HOH A 767 20.194 24.003 6.045 1.00 0.00 O \n+HETATM 3832 H1 HOH A 767 19.863 23.283 6.581 1.00 0.00 H \n+HETATM 3833 H2 HOH A 767 21.139 24.001 6.199 1.00 0.00 H \n+HETATM 3834 DOH2 HOH A 767 20.147 24.046 5.977 1.00 0.00 EP \n+HETATM 3835 OM HOH A 767 20.320 23.855 6.187 1.00 0.00 EP \n+HETATM 3836 O HOH A 768 22.541 21.031 12.939 1.00 0.00 O \n+HETATM 3837 H1 HOH A 768 22.042 21.252 12.153 1.00 0.00 H \n+HETATM 3838 H2 HOH A 768 23.164 20.365 12.648 1.00 0.00 H \n+HETATM 3839 DOH2 HOH A 768 22.499 21.013 13.016 1.00 0.00 EP \n+HETATM 3840 OM HOH A 768 22.566 20.940 12.718 1.00 0.00 EP \n+HETATM 3841 O HOH A 769 21.624 27.926 3.589 1.00 0.00 O \n+HETATM 3842 H1 HOH A 769 21.792 27.723 2.668 1.00 0.00 H \n+HETATM 3843 H2 HOH A 769 21.927 28.828 3.695 1.00 0.00 H \n+HETATM 3844 DOH2 HOH A 769 21.562 27.889 3.651 1.00 0.00 EP \n+HETATM 3845 OM HOH A 769 21.721 28.069 3.422 1.00 0.00 EP \n+HETATM 3846 O HOH A 770 23.007 23.641 6.581 1.00 0.00 O \n+HETATM 3847 H1 HOH A 770 23.021 22.713 6.816 1.00 0.00 H \n+HETATM 3848 H2 HOH A 770 23.878 23.812 6.224 1.00 0.00 H \n+HETATM 3849 DOH2 HOH A 770 22.946 23.706 6.598 1.00 0.00 EP \n+HETATM 3850 OM HOH A 770 23.189 23.486 6.556 1.00 0.00 EP \n+HETATM 3851 O HOH A 771 2.870 23.644 22.072 1.00 0.00 O \n+HETATM 3852 H1 HOH A 771 2.935 24.085 21.225 1.00 0.00 H \n+HETATM 3853 H2 HOH A 771 2.775 24.355 22.707 1.00 0.00 H \n+HETATM 3854 DOH2 HOH A 771 2.850 23.558 22.091 1.00 0.00 EP \n+HETATM 3855 OM HOH A 771 2.864 23.880 22.029 1.00 0.00 EP \n+HETATM 3856 O HOH A 772 24.980 3.345 11.802 1.00 0.00 O \n+HETATM 3857 H1 HOH A 772 24.705 2.679 11.172 1.00 0.00 H \n+HETATM 3858 H2 HOH A 772 25.775 3.720 11.422 1.00 0.00 H \n+HETATM 3859 DOH2 HOH A 772 24.942 3.366 11.884 1.00 0.00 EP \n+HETATM 3860 OM HOH A 772 25.086 3.285 11.595 1.00 0.00 EP \n+HETATM 3861 O HOH A 773 3.529 26.733 15.861 1.00 0.00 O \n+HETATM 3862 H1 HOH A 773 2.821 26.273 15.411 1.00 0.00 H \n+HETATM 3863 H2 HOH A 773 3.582 27.582 15.423 1.00 0.00 H \n+HETATM 3864 DOH2 HOH A 773 3.602 26.715 15.934 1.00 0.00 EP \n+HETATM 3865 OM HOH A 773 3.395 26.813 15.679 1.00 0.00 EP \n+HETATM 3866 O HOH A 774 24.845 21.318 4.054 1.00 0.00 O \n+HETATM 3867 H1 HOH A 774 25.384 22.106 3.984 1.00 0.00 H \n+HETATM 3868 H2 HOH A 774 25.102 20.785 3.302 1.00 0.00 H \n+HETATM 3869 DOH2 HOH A 774 24.766 21.310 4.116 1.00 0.00 EP \n+HETATM 3870 OM HOH A 774 25.009 21.370 3.885 1.00 0.00 EP \n+HETATM 3871 O HOH A 775 24.988 15.964 3.408 1.00 0.00 O \n+HETATM 3872 H1 HOH A 775 25.151 15.510 2.581 1.00 0.00 H \n+HETATM 3873 H2 HOH A 775 24.262 15.484 3.807 1.00 0.00 H \n+HETATM 3874 DOH2 HOH A 775 25.039 16.033 3.435 1.00 0.00 EP \n+HETATM 3875 OM HOH A 775 24.873 15.773 3.320 1.00 0.00 EP \n+HETATM 3876 O HOH A 776 1.733 24.140 28.220 1.00 0.00 O \n+HETATM 3877 H1 HOH A 776 1.324 23.426 28.708 1.00 0.00 H \n+HETATM 3878 H2 HOH A 776 2.670 23.943 28.247 1.00 0.00 H \n+HETATM 3879 DOH2 HOH A 776 1.708 24.255 28.197 1.00 0.00 EP \n+HETATM 3880 OM HOH A 776 1.841 23.953 28.326 1.00 0.00 EP \n+HETATM 3881 O HOH A 777 25.691 21.569 23.318 1.00 0.00 O \n+HETATM 3882 H1 HOH A 777 26.397 22.030 22.865 1.00 0.00 H \n+HETATM 3883 H2 HOH A 777 25.306 21.004 22.649 1.00 0.00 H \n+HETATM 3884 DOH2 HOH A 777 25.685 21.552 23.434 1.00 0.00 EP \n+HETATM 3885 OM HOH A 777 25.757 21.548 23.088 1.00 0.00 EP \n+HETATM 3886 O HOH A 778 27.723 15.910 14.235 1.00 0.00 O \n+HETATM 3887 H1 HOH A 778 27.734 15.061 13.792 1.00 0.00 H \n+HETATM 3888 H2 HOH A 778 28.222 15.768 15.039 1.00 0.00 H \n+HETATM 3889 DOH2 HOH A 778 27.638 15.976 14.236 1.00 0.00 EP \n+HETATM 3890 OM HOH A 778 27.828 15.707 14.309 1.00 0.00 EP \n+HETATM 3891 O HOH A 779 21.409 17.837 8.808 1.00 0.00 O \n+HETATM 3892 H1 HOH A 779 20.589 17.967 9.285 1.00 0.00 H \n+HETATM 3893 H2 HOH A 779 21.171 17.275 8.070 1.00 0.00 H \n+HETATM 3894 DOH2 HOH A 779 21.497 17.899 8.815 1.00 0.00 EP \n+HETATM 3895 OM HOH A 779 21.192 17.748 8.754 1.00 0.00 EP \n+HETATM 3896 O HOH A 780 21.163 21.503 10.580 1.00 0.00 O \n+HETATM 3897 H1 HOH A 780 20.240 21.318 10.754 1.00 0.00 H \n+HETATM 3898 H2 HOH A 780 21.316 21.152 9.702 1.00 0.00 H \n+HETATM 3899 DOH2 HOH A 780 21.241 21.536 10.640 1.00 0.00 EP \n+HETATM 3900 OM HOH A 780 21.005 21.393 10.435 1.00 0.00 EP \n+HETATM 3901 O HOH A 781 19.657 26.332 28.402 1.00 0.00 O \n+HETATM 3902 H1 HOH A 781 18.796 26.507 28.022 1.00 0.00 H \n+HETATM 3903 H2 HOH A 781 20.232 26.986 28.004 1.00 0.00 H \n+HETATM 3904 DOH2 HOH A 781 19.667 26.278 28.439 1.00 0.00 EP \n+HETATM 3905 OM HOH A 781 19.599 26.502 28.243 1.00 0.00 EP \n+HETATM 3906 O HOH A 782 23.012 19.532 17.613 1.00 0.00 O \n+HETATM 3907 H1 HOH A 782 22.351 20.180 17.371 1.00 0.00 H \n+HETATM 3908 H2 HOH A 782 23.649 20.021 18.134 1.00 0.00 H \n+HETATM 3909 DOH2 HOH A 782 23.025 19.422 17.595 1.00 0.00 EP \n+HETATM 3910 OM HOH A 782 23.007 19.765 17.670 1.00 0.00 EP \n+HETATM 3911 O HOH A 783 19.344 21.950 7.732 1.00 0.00 O \n+HETATM 3912 H1 HOH A 783 18.646 21.299 7.666 1.00 0.00 H \n+HETATM 3913 H2 HOH A 783 20.142 21.436 7.853 1.00 0.00 H \n+HETATM 3914 DOH2 HOH A 783 19.345 22.052 7.725 1.00 0.00 EP \n+HETATM 3915 OM HOH A 783 19.365 21.711 7.743 1.00 0.00 EP \n+HETATM 3916 O HOH A 784 24.006 17.847 9.579 1.00 0.00 O \n+HETATM 3917 H1 HOH A 784 24.241 16.932 9.422 1.00 0.00 H \n+HETATM 3918 H2 HOH A 784 23.086 17.905 9.319 1.00 0.00 H \n+HETATM 3919 DOH2 HOH A 784 24.066 17.933 9.619 1.00 0.00 EP \n+HETATM 3920 OM HOH A 784 23.865 17.671 9.494 1.00 0.00 EP \n+HETATM 3921 O HOH A 785 27.452 26.452 6.872 1.00 0.00 O \n+HETATM 3922 H1 HOH A 785 28.194 25.877 6.682 1.00 0.00 H \n+HETATM 3923 H2 HOH A 785 26.921 26.429 6.076 1.00 0.00 H \n+HETATM 3924 DOH2 HOH A 785 27.402 26.504 6.968 1.00 0.00 EP \n+HETATM 3925 OM HOH A 785 27.495 26.329 6.670 1.00 0.00 EP \n+HETATM 3926 O HOH A 786 26.929 24.823 18.660 1.00 0.00 O \n+HETATM 3927 H1 HOH A 786 26.757 24.319 17.865 1.00 0.00 H \n+HETATM 3928 H2 HOH A 786 27.684 25.369 18.439 1.00 0.00 H \n+HETATM 3929 DOH2 HOH A 786 26.905 24.810 18.727 1.00 0.00 EP \n+HETATM 3930 OM HOH A 786 27.049 24.832 18.451 1.00 0.00 EP \n+HETATM 3931 O HOH A 787 28.743 15.256 16.754 1.00 0.00 O \n+HETATM 3932 H1 HOH A 787 28.655 15.596 17.645 1.00 0.00 H \n+HETATM 3933 H2 HOH A 787 28.163 14.495 16.729 1.00 0.00 H \n+HETATM 3934 DOH2 HOH A 787 28.792 15.304 16.674 1.00 0.00 EP \n+HETATM 3935 OM HOH A 787 28.606 15.170 16.932 1.00 0.00 EP \n+HETATM 3936 O HOH A 788 17.260 23.146 17.636 1.00 0.00 O \n+HETATM 3937 H1 HOH A 788 17.106 22.444 17.003 1.00 0.00 H \n+HETATM 3938 H2 HOH A 788 17.091 23.951 17.147 1.00 0.00 H \n+HETATM 3939 DOH2 HOH A 788 17.281 23.140 17.738 1.00 0.00 EP \n+HETATM 3940 OM HOH A 788 17.194 23.167 17.406 1.00 0.00 EP \n+HETATM 3941 O HOH A 789 26.188 2.556 2.295 1.00 0.00 O \n+HETATM 3942 H1 HOH A 789 25.493 3.215 2.284 1.00 0.00 H \n+HETATM 3943 H2 HOH A 789 25.745 1.745 2.546 1.00 0.00 H \n+HETATM 3944 DOH2 HOH A 789 26.275 2.591 2.299 1.00 0.00 EP \n+HETATM 3945 OM HOH A 789 25.955 2.525 2.344 1.00 0.00 EP \n+HETATM 3946 O HOH A 790 27.067 16.451 5.092 1.00 0.00 O \n+HETATM 3947 H1 HOH A 790 26.380 16.380 4.429 1.00 0.00 H \n+HETATM 3948 H2 HOH A 790 27.658 17.124 4.753 1.00 0.00 H \n+HETATM 3949 DOH2 HOH A 790 27.068 16.388 5.188 1.00 0.00 EP \n+HETATM 3950 OM HOH A 790 27.047 16.574 4.886 1.00 0.00 EP \n+HETATM 3951 O HOH A 791 17.582 11.366 17.926 1.00 0.00 O \n+HETATM 3952 H1 HOH A 791 17.533 11.488 18.875 1.00 0.00 H \n+HETATM 3953 H2 HOH A 791 18.367 11.846 17.663 1.00 0.00 H \n+HETATM 3954 DOH2 HOH A 791 17.531 11.322 17.875 1.00 0.00 EP \n+HETATM 3955 OM HOH A 791 17.733 11.490 18.067 1.00 0.00 EP \n+HETATM 3956 O HOH A 792 12.188 4.476 15.383 1.00 0.00 O \n+HETATM 3957 H1 HOH A 792 11.298 4.778 15.565 1.00 0.00 H \n+HETATM 3958 H2 HOH A 792 12.734 5.253 15.501 1.00 0.00 H \n+HETATM 3959 DOH2 HOH A 792 12.197 4.414 15.342 1.00 0.00 EP \n+HETATM 3960 OM HOH A 792 12.117 4.697 15.445 1.00 0.00 EP \n+HETATM 3961 O HOH A 793 24.997 30.244 3.084 1.00 0.00 O \n+HETATM 3962 H1 HOH A 793 24.061 30.341 3.259 1.00 0.00 H \n+HETATM 3963 H2 HOH A 793 25.349 29.838 3.876 1.00 0.00 H \n+HETATM 3964 DOH2 HOH A 793 25.066 30.288 2.995 1.00 0.00 EP \n+HETATM 3965 OM HOH A 793 24.877 30.180 3.282 1.00 0.00 EP \n+HETATM 3966 O HOH A 794 24.254 28.757 8.673 1.00 0.00 O \n+HETATM 3967 H1 HOH A 794 25.175 28.791 8.415 1.00 0.00 H \n+HETATM 3968 H2 HOH A 794 23.972 27.872 8.442 1.00 0.00 H \n+HETATM 3969 DOH2 HOH A 794 24.192 28.839 8.663 1.00 0.00 EP \n+HETATM 3970 OM HOH A 794 24.385 28.583 8.572 1.00 0.00 EP \n+HETATM 3971 O HOH A 795 26.885 28.939 7.923 1.00 0.00 O \n+HETATM 3972 H1 HOH A 795 27.269 28.098 7.673 1.00 0.00 H \n+HETATM 3973 H2 HOH A 795 27.448 29.261 8.626 1.00 0.00 H \n+HETATM 3974 DOH2 HOH A 795 26.794 28.953 7.893 1.00 0.00 EP \n+HETATM 3975 OM HOH A 795 27.079 28.832 8.016 1.00 0.00 EP \n+HETATM 3976 O HOH A 796 26.591 22.972 16.618 1.00 0.00 O \n+HETATM 3977 H1 HOH A 796 27.257 23.061 15.936 1.00 0.00 H \n+HETATM 3978 H2 HOH A 796 26.653 22.059 16.897 1.00 0.00 H \n+HETATM 3979 DOH2 HOH A 796 26.537 23.029 16.666 1.00 0.00 EP \n+HETATM 3980 OM HOH A 796 26.740 22.803 16.535 1.00 0.00 EP \n+HETATM 3981 O HOH A 797 29.252 23.703 1.646 1.00 0.00 O \n+HETATM 3982 H1 HOH A 797 30.078 23.898 2.089 1.00 0.00 H \n+HETATM 3983 H2 HOH A 797 29.095 24.464 1.086 1.00 0.00 H \n+HETATM 3984 DOH2 HOH A 797 29.233 23.653 1.631 1.00 0.00 EP \n+HETATM 3985 OM HOH A 797 29.389 23.899 1.622 1.00 0.00 EP \n+HETATM 3986 O HOH A 798 18.213 29.099 14.160 1.00 0.00 O \n+HETATM 3987 H1 HOH A 798 18.894 29.770 14.216 1.00 0.00 H \n+HETATM 3988 H2 HOH A 798 18.691 28.287 13.989 1.00 0.00 H \n+HETATM 3989 DOH2 HOH A 798 18.105 29.117 14.175 1.00 0.00 EP \n+HETATM 3990 OM HOH A 798 18.451 29.070 14.136 1.00 0.00 EP \n+HETATM 3991 O HOH A 799 0.257 16.379 21.515 1.00 0.00 O \n+HETATM 3992 H1 HOH A 799 0.333 15.691 22.177 1.00 0.00 H \n+HETATM 3993 H2 HOH A 799 -0.367 16.030 20.878 1.00 0.00 H \n+HETATM 3994 DOH2 HOH A 799 0.297 16.458 21.489 1.00 0.00 EP \n+HETATM 3995 OM HOH A 799 0.144 16.166 21.520 1.00 0.00 EP \n+HETATM 3996 O HOH A 800 29.191 26.461 18.291 1.00 0.00 O \n+HETATM 3997 H1 HOH A 800 29.431 26.823 17.438 1.00 0.00 H \n+HETATM 3998 H2 HOH A 800 28.986 27.226 18.828 1.00 0.00 H \n+HETATM 3999 DOH2 HOH A 800 29.188 26.367 18.316 1.00 0.00 EP \n+HETATM 4000 OM HOH A 800 29.198 26.692 18.226 1.00 0.00 EP \n+HETATM 4001 O HOH A 801 6.200 23.113 16.917 1.00 0.00 O \n+HETATM 4002 H1 HOH A 801 6.277 24.007 16.584 1.00 0.00 H \n+HETATM 4003 H2 HOH A 801 6.804 22.602 16.377 1.00 0.00 H \n+HETATM 4004 DOH2 HOH A 801 6.131 23.093 16.968 1.00 0.00 EP \n+HETATM 4005 OM HOH A 801 6.340 23.191 16.738 1.00 0.00 EP \n+HETATM 4006 O HOH A 802 5.070 20.720 20.297 1.00 0.00 O \n+HETATM 4007 H1 HOH A 802 5.213 21.661 20.191 1.00 0.00 H \n+HETATM 4008 H2 HOH A 802 5.073 20.582 21.244 1.00 0.00 H \n+HETATM 4009 DOH2 HOH A 802 5.065 20.655 20.228 1.00 0.00 EP \n+HETATM 4010 OM HOH A 802 5.100 20.885 20.469 1.00 0.00 EP \n+HETATM 4011 O HOH A 803 24.881 26.513 11.540 1.00 0.00 O \n+HETATM 4012 H1 HOH A 803 25.203 26.446 10.642 1.00 0.00 H \n+HETATM 4013 H2 HOH A 803 24.834 27.454 11.709 1.00 0.00 H \n+HETATM 4014 DOH2 HOH A 803 24.896 26.452 11.597 1.00 0.00 EP \n+HETATM 4015 OM HOH A 803 24.938 26.692 11.391 1.00 0.00 EP \n+HETATM 4016 O HOH A 804 15.203 23.563 3.132 1.00 0.00 O \n+HETATM 4017 H1 HOH A 804 15.613 23.684 2.275 1.00 0.00 H \n+HETATM 4018 H2 HOH A 804 14.916 22.650 3.134 1.00 0.00 H \n+HETATM 4019 DOH2 HOH A 804 15.167 23.635 3.212 1.00 0.00 EP \n+HETATM 4020 OM HOH A 804 15.228 23.401 2.956 1.00 0.00 EP \n+HETATM 4021 O HOH A 805 13.569 27.799 15.069 1.00 0.00 O \n+HETATM 4022 H1 HOH A 805 14.508 27.891 15.227 1.00 0.00 H \n+HETATM 4023 H2 HOH A 805 13.437 26.860 14.943 1.00 0.00 H \n+HETATM 4024 DOH2 HOH A 805 13.491 27.872 15.095 1.00 0.00 EP \n+HETATM 4025 OM HOH A 805 13.735 27.625 15.075 1.00 0.00 EP \n+HETATM 4026 O HOH A 806 24.868 25.142 2.087 1.00 0.00 O \n+HETATM 4027 H1 HOH A 806 23.923 24.990 2.087 1.00 0.00 H \n+HETATM 4028 H2 HOH A 806 25.100 25.213 1.161 1.00 0.00 H \n+HETATM 4029 DOH2 HOH A 806 24.932 25.133 2.164 1.00 0.00 EP \n+HETATM 4030 OM HOH A 806 24.722 25.125 1.897 1.00 0.00 EP \n+HETATM 4031 O HOH A 807 21.493 27.653 6.378 1.00 0.00 O \n+HETATM 4032 H1 HOH A 807 21.459 27.581 5.424 1.00 0.00 H \n+HETATM 4033 H2 HOH A 807 21.791 28.549 6.540 1.00 0.00 H \n+HETATM 4034 DOH2 HOH A 807 21.516 27.590 6.462 1.00 0.00 EP \n+HETATM 4035 OM HOH A 807 21.547 27.822 6.215 1.00 0.00 EP \n+HETATM 4036 O HOH A 808 17.051 26.943 27.516 1.00 0.00 O \n+HETATM 4037 H1 HOH A 808 16.370 27.048 28.181 1.00 0.00 H \n+HETATM 4038 H2 HOH A 808 16.663 26.356 26.867 1.00 0.00 H \n+HETATM 4039 DOH2 HOH A 808 17.153 26.999 27.527 1.00 0.00 EP \n+HETATM 4040 OM HOH A 808 16.831 26.844 27.519 1.00 0.00 EP \n+HETATM 4041 O HOH A 809 15.874 4.784 15.553 1.00 0.00 O \n+HETATM 4042 H1 HOH A 809 16.535 5.144 16.146 1.00 0.00 H \n+HETATM 4043 H2 HOH A 809 15.140 5.396 15.612 1.00 0.00 H \n+HETATM 4044 DOH2 HOH A 809 15.887 4.719 15.514 1.00 0.00 EP \n+HETATM 4045 OM HOH A 809 15.859 4.983 15.687 1.00 0.00 EP \n+HETATM 4046 O HOH A 810 3.328 27.454 12.362 1.00 0.00 O \n+HETATM 4047 H1 HOH A 810 2.506 26.997 12.179 1.00 0.00 H \n+HETATM 4048 H2 HOH A 810 3.641 27.737 11.503 1.00 0.00 H \n+HETATM 4049 DOH2 HOH A 810 3.366 27.455 12.437 1.00 0.00 EP \n+HETATM 4050 OM HOH A 810 3.223 27.418 12.148 1.00 0.00 EP \n+HETATM 4051 O HOH A 811 28.775 18.297 4.099 1.00 0.00 O \n+HETATM 4052 H1 HOH A 811 29.664 17.962 3.974 1.00 0.00 H \n+HETATM 4053 H2 HOH A 811 28.548 18.694 3.259 1.00 0.00 H \n+HETATM 4054 DOH2 HOH A 811 28.720 18.253 4.147 1.00 0.00 EP \n+HETATM 4055 OM HOH A 811 28.911 18.310 3.901 1.00 0.00 EP \n+HETATM 4056 O HOH A 812 28.240 19.091 1.454 1.00 0.00 O \n+HETATM 4057 H1 HOH A 812 28.577 19.390 0.610 1.00 0.00 H \n+HETATM 4058 H2 HOH A 812 28.054 18.162 1.323 1.00 0.00 H \n+HETATM 4059 DOH2 HOH A 812 28.196 19.131 1.518 1.00 0.00 EP \n+HETATM 4060 OM HOH A 812 28.271 18.962 1.254 1.00 0.00 EP \n+HETATM 4061 O HOH A 813 0.431 26.426 4.001 1.00 0.00 O \n+HETATM 4062 H1 HOH A 813 0.772 25.676 3.513 1.00 0.00 H \n+HETATM 4063 H2 HOH A 813 1.098 27.104 3.895 1.00 0.00 H \n+HETATM 4064 DOH2 HOH A 813 0.361 26.425 4.044 1.00 0.00 EP \n+HETATM 4065 OM HOH A 813 0.638 26.412 3.879 1.00 0.00 EP \n+HETATM 4066 O HOH A 814 21.612 20.484 8.092 1.00 0.00 O \n+HETATM 4067 H1 HOH A 814 21.591 19.544 8.267 1.00 0.00 H \n+HETATM 4068 H2 HOH A 814 22.376 20.606 7.529 1.00 0.00 H \n+HETATM 4069 DOH2 HOH A 814 21.534 20.560 8.150 1.00 0.00 EP \n+HETATM 4070 OM HOH A 814 21.764 20.316 8.012 1.00 0.00 EP \n+HETATM 4071 O HOH A 815 21.942 25.646 10.892 1.00 0.00 O \n+HETATM 4072 H1 HOH A 815 21.444 26.018 10.164 1.00 0.00 H \n+HETATM 4073 H2 HOH A 815 22.660 26.263 11.033 1.00 0.00 H \n+HETATM 4074 DOH2 HOH A 815 21.951 25.570 10.935 1.00 0.00 EP \n+HETATM 4075 OM HOH A 815 21.987 25.849 10.772 1.00 0.00 EP \n+HETATM 4076 O HOH A 816 27.254 1.875 6.724 1.00 0.00 O \n+HETATM 4077 H1 HOH A 816 27.418 2.385 5.931 1.00 0.00 H \n+HETATM 4078 H2 HOH A 816 27.899 1.168 6.692 1.00 0.00 H \n+HETATM 4079 DOH2 HOH A 816 27.203 1.897 6.794 1.00 0.00 EP \n+HETATM 4080 OM HOH A 816 27.420 1.835 6.555 1.00 0.00 EP \n+HETATM 4081 O HOH A 817 18.538 20.513 10.922 1.00 0.00 O \n+HETATM 4082 H1 HOH A 817 18.724 19.678 10.491 1.00 0.00 H \n+HETATM 4083 H2 HOH A 817 17.623 20.694 10.709 1.00 0.00 H \n+HETATM 4084 DOH2 HOH A 817 18.596 20.532 10.982 1.00 0.00 EP \n+HETATM 4085 OM HOH A 817 18.388 20.379 10.790 1.00 0.00 EP \n+HETATM 4086 O HOH A 818 28.502 29.652 10.099 1.00 0.00 O \n+HETATM 4087 H1 HOH A 818 28.123 29.611 10.977 1.00 0.00 H \n+HETATM 4088 H2 HOH A 818 28.850 28.774 9.947 1.00 0.00 H \n+HETATM 4089 DOH2 HOH A 818 28.503 29.732 10.020 1.00 0.00 EP \n+HETATM 4090 OM HOH A 818 28.495 29.464 10.248 1.00 0.00 EP \n+HETATM 4091 O HOH A 819 10.132 27.596 17.662 1.00 0.00 O \n+HETATM 4092 H1 HOH A 819 10.459 26.791 17.260 1.00 0.00 H \n+HETATM 4093 H2 HOH A 819 9.202 27.426 17.816 1.00 0.00 H \n+HETATM 4094 DOH2 HOH A 819 10.189 27.691 17.685 1.00 0.00 EP \n+HETATM 4095 OM HOH A 819 10.008 27.396 17.611 1.00 0.00 EP \n+HETATM 4096 O HOH A 820 0.885 24.330 18.879 1.00 0.00 O \n+HETATM 4097 H1 HOH A 820 1.736 24.621 19.205 1.00 0.00 H \n+HETATM 4098 H2 HOH A 820 0.403 25.140 18.710 1.00 0.00 H \n+HETATM 4099 DOH2 HOH A 820 0.838 24.227 18.863 1.00 0.00 EP \n+HETATM 4100 OM HOH A 820 0.960 24.556 18.911 1.00 0.00 EP \n+HETATM 4101 O HOH A 821 12.561 17.049 28.839 1.00 0.00 O \n+HETATM 4102 H1 HOH A 821 13.430 17.428 28.972 1.00 0.00 H \n+HETATM 4103 H2 HOH A 821 12.649 16.517 28.048 1.00 0.00 H \n+HETATM 4104 DOH2 HOH A 821 12.479 17.048 28.909 1.00 0.00 EP \n+HETATM 4105 OM HOH A 821 12.757 17.018 28.704 1.00 0.00 EP \n+HETATM 4106 O HOH A 822 29.419 9.469 4.491 1.00 0.00 O \n+HETATM 4107 H1 HOH A 822 29.023 9.270 3.642 1.00 0.00 H \n+HETATM 4108 H2 HOH A 822 29.963 8.706 4.687 1.00 0.00 H \n+HETATM 4109 DOH2 HOH A 822 29.403 9.540 4.547 1.00 0.00 EP \n+HETATM 4110 OM HOH A 822 29.449 9.272 4.357 1.00 0.00 EP \n+HETATM 4111 O HOH A 823 24.862 29.218 12.099 1.00 0.00 O \n+HETATM 4112 H1 HOH A 823 25.780 29.421 12.278 1.00 0.00 H \n+HETATM 4113 H2 HOH A 823 24.582 29.894 11.483 1.00 0.00 H \n+HETATM 4114 DOH2 HOH A 823 24.821 29.152 12.121 1.00 0.00 EP \n+HETATM 4115 OM HOH A 823 24.993 29.398 12.010 1.00 0.00 EP \n+HETATM 4116 O HOH A 824 26.835 20.261 17.331 1.00 0.00 O \n+HETATM 4117 H1 HOH A 824 26.394 19.575 16.831 1.00 0.00 H \n+HETATM 4118 H2 HOH A 824 27.725 20.281 16.979 1.00 0.00 H \n+HETATM 4119 DOH2 HOH A 824 26.776 20.334 17.378 1.00 0.00 EP \n+HETATM 4120 OM HOH A 824 26.927 20.124 17.156 1.00 0.00 EP \n+HETATM 4121 O HOH A 825 1.278 30.107 9.350 1.00 0.00 O \n+HETATM 4122 H1 HOH A 825 1.331 29.532 8.587 1.00 0.00 H \n+HETATM 4123 H2 HOH A 825 0.349 30.117 9.579 1.00 0.00 H \n+HETATM 4124 DOH2 HOH A 825 1.329 30.164 9.366 1.00 0.00 EP \n+HETATM 4125 OM HOH A 825 1.099 29.991 9.240 1.00 0.00 EP \n+HETATM 4126 O HOH A 826 -0.423 0.375 6.357 1.00 0.00 O \n+HETATM 4127 H1 HOH A 826 -0.354 0.439 5.404 1.00 0.00 H \n+HETATM 4128 H2 HOH A 826 0.196 -0.314 6.596 1.00 0.00 H \n+HETATM 4129 DOH2 HOH A 826 -0.462 0.454 6.388 1.00 0.00 EP \n+HETATM 4130 OM HOH A 826 -0.282 0.247 6.211 1.00 0.00 EP \n+HETATM 4131 O HOH A 827 20.341 26.623 8.780 1.00 0.00 O \n+HETATM 4132 H1 HOH A 827 20.712 26.844 7.925 1.00 0.00 H \n+HETATM 4133 H2 HOH A 827 19.780 27.368 8.998 1.00 0.00 H \n+HETATM 4134 DOH2 HOH A 827 20.357 26.549 8.834 1.00 0.00 EP \n+HETATM 4135 OM HOH A 827 20.302 26.821 8.649 1.00 0.00 EP \n+HETATM 4136 O HOH A 828 23.701 29.340 28.092 1.00 0.00 O \n+HETATM 4137 H1 HOH A 828 24.029 28.783 28.799 1.00 0.00 H \n+HETATM 4138 H2 HOH A 828 24.045 30.210 28.293 1.00 0.00 H \n+HETATM 4139 DOH2 HOH A 828 23.639 29.311 28.010 1.00 0.00 EP \n+HETATM 4140 OM HOH A 828 23.839 29.404 28.278 1.00 0.00 EP \n+HETATM 4141 O HOH A 829 18.438 1.536 1.121 1.00 0.00 O \n+HETATM 4142 H1 HOH A 829 18.307 1.624 2.065 1.00 0.00 H \n+HETATM 4143 H2 HOH A 829 18.821 0.666 1.011 1.00 0.00 H \n+HETATM 4144 DOH2 HOH A 829 18.457 1.586 1.093 1.00 0.00 EP \n+HETATM 4145 OM HOH A 829 18.489 1.376 1.292 1.00 0.00 EP \n+HETATM 4146 O HOH A 830 22.363 21.510 2.724 1.00 0.00 O \n+HETATM 4147 H1 HOH A 830 23.106 21.565 3.324 1.00 0.00 H \n+HETATM 4148 H2 HOH A 830 21.764 22.195 3.021 1.00 0.00 H \n+HETATM 4149 DOH2 HOH A 830 22.347 21.442 2.663 1.00 0.00 EP \n+HETATM 4150 OM HOH A 830 22.392 21.662 2.908 1.00 0.00 EP \n+HETATM 4151 O HOH A 831 25.119 18.357 16.098 1.00 0.00 O \n+HETATM 4152 H1 HOH A 831 25.088 17.419 16.290 1.00 0.00 H \n+HETATM 4153 H2 HOH A 831 24.312 18.706 16.475 1.00 0.00 H \n+HETATM 4154 DOH2 HOH A 831 25.185 18.395 16.052 1.00 0.00 EP \n+HETATM 4155 OM HOH A 831 24.947 18.236 16.214 1.00 0.00 EP \n+HETATM 4156 O HOH A 832 25.899 23.674 10.073 1.00 0.00 O \n+HETATM 4157 H1 HOH A 832 24.981 23.458 10.236 1.00 0.00 H \n+HETATM 4158 H2 HOH A 832 25.877 24.558 9.706 1.00 0.00 H \n+HETATM 4159 DOH2 HOH A 832 25.998 23.612 10.087 1.00 0.00 EP \n+HETATM 4160 OM HOH A 832 25.706 23.811 10.031 1.00 0.00 EP \n+HETATM 4161 O HOH A 833 8.495 4.110 29.443 1.00 0.00 O \n+HETATM 4162 H1 HOH A 833 8.506 4.470 30.330 1.00 0.00 H \n+HETATM 4163 H2 HOH A 833 7.740 3.522 29.432 1.00 0.00 H \n+HETATM 4164 DOH2 HOH A 833 8.541 4.117 29.364 1.00 0.00 EP \n+HETATM 4165 OM HOH A 833 8.342 4.063 29.623 1.00 0.00 EP \n+HETATM 4166 O HOH A 834 0.402 23.841 8.462 1.00 0.00 O \n+HETATM 4167 H1 HOH A 834 0.065 24.269 7.674 1.00 0.00 H \n+HETATM 4168 H2 HOH A 834 -0.150 24.172 9.170 1.00 0.00 H \n+HETATM 4169 DOH2 HOH A 834 0.462 23.768 8.458 1.00 0.00 EP \n+HETATM 4170 OM HOH A 834 0.220 23.997 8.445 1.00 0.00 EP \n+HETATM 4171 O HOH A 835 21.120 2.473 27.713 1.00 0.00 O \n+HETATM 4172 H1 HOH A 835 21.515 2.118 28.510 1.00 0.00 H \n+HETATM 4173 H2 HOH A 835 21.810 3.009 27.322 1.00 0.00 H \n+HETATM 4174 DOH2 HOH A 835 21.034 2.434 27.674 1.00 0.00 EP \n+HETATM 4175 OM HOH A 835 21.343 2.510 27.797 1.00 0.00 EP \n+HETATM 4176 O HOH A 836 18.956 25.760 18.012 1.00 0.00 O \n+HETATM 4177 H1 HOH A 836 18.476 26.108 18.763 1.00 0.00 H \n+HETATM 4178 H2 HOH A 836 18.281 25.576 17.359 1.00 0.00 H \n+HETATM 4179 DOH2 HOH A 836 19.054 25.787 17.991 1.00 0.00 EP \n+HETATM 4180 OM HOH A 836 18.719 25.794 18.032 1.00 0.00 EP \n+HETATM 4181 O HOH A 837 24.302 26.547 24.652 1.00 0.00 O \n+HETATM 4182 H1 HOH A 837 25.151 26.157 24.861 1.00 0.00 H \n+HETATM 4183 H2 HOH A 837 24.028 26.107 23.847 1.00 0.00 H \n+HETATM 4184 DOH2 HOH A 837 24.274 26.602 24.721 1.00 0.00 EP \n+HETATM 4185 OM HOH A 837 24.420 26.377 24.530 1.00 0.00 EP \n+HETATM 4186 O HOH A 838 20.262 26.487 23.135 1.00 0.00 O \n+HETATM 4187 H1 HOH A 838 20.372 26.890 22.273 1.00 0.00 H \n+HETATM 4188 H2 HOH A 838 20.889 26.946 23.695 1.00 0.00 H \n+HETATM 4189 DOH2 HOH A 838 20.205 26.405 23.173 1.00 0.00 EP \n+HETATM 4190 OM HOH A 838 20.413 26.664 23.073 1.00 0.00 EP \n+HETATM 4191 O HOH A 839 25.742 28.985 5.341 1.00 0.00 O \n+HETATM 4192 H1 HOH A 839 26.145 29.042 6.207 1.00 0.00 H \n+HETATM 4193 H2 HOH A 839 25.681 28.045 5.167 1.00 0.00 H \n+HETATM 4194 DOH2 HOH A 839 25.720 29.038 5.279 1.00 0.00 EP \n+HETATM 4195 OM HOH A 839 25.812 28.804 5.483 1.00 0.00 EP \n+HETATM 4196 O HOH A 840 21.936 27.370 0.901 1.00 0.00 O \n+HETATM 4197 H1 HOH A 840 22.833 27.578 0.641 1.00 0.00 H \n+HETATM 4198 H2 HOH A 840 21.939 26.422 1.037 1.00 0.00 H \n+HETATM 4199 DOH2 HOH A 840 21.873 27.433 0.946 1.00 0.00 EP \n+HETATM 4200 OM HOH A 840 22.121 27.218 0.876 1.00 0.00 EP \n+HETATM 4201 O HOH A 841 17.673 20.703 4.080 1.00 0.00 O \n+HETATM 4202 H1 HOH A 841 16.919 20.186 3.798 1.00 0.00 H \n+HETATM 4203 H2 HOH A 841 17.885 21.250 3.323 1.00 0.00 H \n+HETATM 4204 DOH2 HOH A 841 17.715 20.660 4.132 1.00 0.00 EP \n+HETATM 4205 OM HOH A 841 17.562 20.710 3.867 1.00 0.00 EP \n+HETATM 4206 O HOH A 842 28.708 22.859 19.527 1.00 0.00 O \n+HETATM 4207 H1 HOH A 842 29.517 23.325 19.314 1.00 0.00 H \n+HETATM 4208 H2 HOH A 842 28.010 23.426 19.198 1.00 0.00 H \n+HETATM 4209 DOH2 HOH A 842 28.696 22.782 19.624 1.00 0.00 EP \n+HETATM 4210 OM HOH A 842 28.731 23.071 19.416 1.00 0.00 EP \n+HETATM 4211 O HOH A 843 19.452 22.390 19.176 1.00 0.00 O \n+HETATM 4212 H1 HOH A 843 19.005 21.987 19.920 1.00 0.00 H \n+HETATM 4213 H2 HOH A 843 18.748 22.763 18.646 1.00 0.00 H \n+HETATM 4214 DOH2 HOH A 843 19.555 22.389 19.169 1.00 0.00 EP \n+HETATM 4215 OM HOH A 843 19.216 22.384 19.220 1.00 0.00 EP \n+HETATM 4216 O HOH A 844 29.233 19.869 28.931 1.00 0.00 O \n+HETATM 4217 H1 HOH A 844 28.636 19.626 28.223 1.00 0.00 H \n+HETATM 4218 H2 HOH A 844 29.876 19.161 28.957 1.00 0.00 H \n+HETATM 4219 DOH2 HOH A 844 29.238 19.933 28.995 1.00 0.00 EP \n+HETATM 4220 OM HOH A 844 29.242 19.674 28.791 1.00 0.00 EP \n+HETATM 4221 O HOH A 845 22.672 22.483 24.867 1.00 0.00 O \n+HETATM 4222 H1 HOH A 845 23.452 22.452 24.314 1.00 0.00 H \n+HETATM 4223 H2 HOH A 845 22.047 23.012 24.370 1.00 0.00 H \n+HETATM 4224 DOH2 HOH A 845 22.661 22.442 24.913 1.00 0.00 EP \n+HETATM 4225 OM HOH A 845 22.704 22.585 24.651 1.00 0.00 EP \n+HETATM 4226 O HOH A 846 29.253 21.313 8.615 1.00 0.00 O \n+HETATM 4227 H1 HOH A 846 29.807 22.079 8.461 1.00 0.00 H \n+HETATM 4228 H2 HOH A 846 28.387 21.577 8.304 1.00 0.00 H \n+HETATM 4229 DOH2 HOH A 846 29.259 21.252 8.684 1.00 0.00 EP \n+HETATM 4230 OM HOH A 846 29.189 21.524 8.519 1.00 0.00 EP \n+HETATM 4231 O HOH A 847 29.803 1.089 22.497 1.00 0.00 O \n+HETATM 4232 H1 HOH A 847 29.744 1.622 21.704 1.00 0.00 H \n+HETATM 4233 H2 HOH A 847 28.908 0.784 22.648 1.00 0.00 H \n+HETATM 4234 DOH2 HOH A 847 29.852 1.115 22.561 1.00 0.00 EP \n+HETATM 4235 OM HOH A 847 29.607 1.135 22.366 1.00 0.00 EP \n+HETATM 4236 O HOH A 848 15.215 24.348 28.224 1.00 0.00 O \n+HETATM 4237 H1 HOH A 848 14.375 24.740 28.463 1.00 0.00 H \n+HETATM 4238 H2 HOH A 848 15.410 24.707 27.359 1.00 0.00 H \n+HETATM 4239 DOH2 HOH A 848 15.283 24.300 28.277 1.00 0.00 EP \n+HETATM 4240 OM HOH A 848 15.083 24.502 28.096 1.00 0.00 EP \n+HETATM 4241 O HOH A 849 2.374 20.557 25.286 1.00 0.00 O \n+HETATM 4242 H1 HOH A 849 2.764 19.705 25.090 1.00 0.00 H \n+HETATM 4243 H2 HOH A 849 2.112 20.904 24.434 1.00 0.00 H \n+HETATM 4244 DOH2 HOH A 849 2.401 20.589 25.342 1.00 0.00 EP \n+HETATM 4245 OM HOH A 849 2.400 20.454 25.071 1.00 0.00 EP \n+HETATM 4246 O HOH A 850 26.414 10.000 29.936 1.00 0.00 O \n+HETATM 4247 H1 HOH A 850 26.949 10.676 30.351 1.00 0.00 H \n+HETATM 4248 H2 HOH A 850 26.352 10.271 29.020 1.00 0.00 H \n+HETATM 4249 DOH2 HOH A 850 26.371 9.946 29.964 1.00 0.00 EP \n+HETATM 4250 OM HOH A 850 26.511 10.194 29.833 1.00 0.00 EP \n+HETATM 4251 O HOH A 851 28.692 26.699 26.558 1.00 0.00 O \n+HETATM 4252 H1 HOH A 851 28.312 27.079 27.350 1.00 0.00 H \n+HETATM 4253 H2 HOH A 851 27.991 26.165 26.187 1.00 0.00 H \n+HETATM 4254 DOH2 HOH A 851 28.762 26.736 26.505 1.00 0.00 EP \n+HETATM 4255 OM HOH A 851 28.470 26.668 26.645 1.00 0.00 EP \n+HETATM 4256 O HOH A 852 26.697 25.273 25.220 1.00 0.00 O \n+HETATM 4257 H1 HOH A 852 26.891 25.272 24.283 1.00 0.00 H \n+HETATM 4258 H2 HOH A 852 26.425 24.375 25.410 1.00 0.00 H \n+HETATM 4259 DOH2 HOH A 852 26.695 25.335 25.252 1.00 0.00 EP \n+HETATM 4260 OM HOH A 852 26.681 25.089 25.067 1.00 0.00 EP \n+HETATM 4261 O HOH A 853 25.946 19.278 24.821 1.00 0.00 O \n+HETATM 4262 H1 HOH A 853 25.894 20.102 24.337 1.00 0.00 H \n+HETATM 4263 H2 HOH A 853 25.539 18.633 24.242 1.00 0.00 H \n+HETATM 4264 DOH2 HOH A 853 25.995 19.275 24.904 1.00 0.00 EP \n+HETATM 4265 OM HOH A 853 25.852 19.314 24.603 1.00 0.00 EP \n+HETATM 4266 O HOH A 854 26.602 5.272 29.537 1.00 0.00 O \n+HETATM 4267 H1 HOH A 854 25.724 4.998 29.271 1.00 0.00 H \n+HETATM 4268 H2 HOH A 854 26.942 5.751 28.781 1.00 0.00 H \n+HETATM 4269 DOH2 HOH A 854 26.647 5.245 29.640 1.00 0.00 EP \n+HETATM 4270 OM HOH A 854 26.492 5.314 29.327 1.00 0.00 EP \n+HETATM 4271 O HOH A 855 2.546 25.795 23.784 1.00 0.00 O \n+HETATM 4272 H1 HOH A 855 2.851 26.644 23.465 1.00 0.00 H \n+HETATM 4273 H2 HOH A 855 2.230 25.971 24.670 1.00 0.00 H \n+HETATM 4274 DOH2 HOH A 855 2.501 25.726 23.722 1.00 0.00 EP \n+HETATM 4275 OM HOH A 855 2.544 26.005 23.901 1.00 0.00 EP \n+HETATM 4276 O HOH A 856 23.814 22.338 27.512 1.00 0.00 O \n+HETATM 4277 H1 HOH A 856 24.607 22.517 27.007 1.00 0.00 H \n+HETATM 4278 H2 HOH A 856 23.105 22.388 26.871 1.00 0.00 H \n+HETATM 4279 DOH2 HOH A 856 23.818 22.319 27.607 1.00 0.00 EP \n+HETATM 4280 OM HOH A 856 23.832 22.385 27.277 1.00 0.00 EP \n+HETATM 4281 O HOH A 857 28.217 15.886 19.456 1.00 0.00 O \n+HETATM 4282 H1 HOH A 857 28.185 16.827 19.629 1.00 0.00 H \n+HETATM 4283 H2 HOH A 857 27.315 15.589 19.576 1.00 0.00 H \n+HETATM 4284 DOH2 HOH A 857 28.292 15.820 19.433 1.00 0.00 EP \n+HETATM 4285 OM HOH A 857 28.025 16.018 19.516 1.00 0.00 EP \n+HETATM 4286 O HOH A 858 26.274 17.131 28.098 1.00 0.00 O \n+HETATM 4287 H1 HOH A 858 27.058 16.650 28.361 1.00 0.00 H \n+HETATM 4288 H2 HOH A 858 26.607 17.940 27.709 1.00 0.00 H \n+HETATM 4289 DOH2 HOH A 858 26.161 17.105 28.094 1.00 0.00 EP \n+HETATM 4290 OM HOH A 858 26.503 17.198 28.072 1.00 0.00 EP \n+HETATM 4291 O HOH A 859 29.631 27.713 22.306 1.00 0.00 O \n+HETATM 4292 H1 HOH A 859 29.310 28.110 23.116 1.00 0.00 H \n+HETATM 4293 H2 HOH A 859 29.799 26.800 22.537 1.00 0.00 H \n+HETATM 4294 DOH2 HOH A 859 29.649 27.753 22.223 1.00 0.00 EP \n+HETATM 4295 OM HOH A 859 29.600 27.607 22.519 1.00 0.00 EP \n+HETATM 4296 O HOH A 860 27.395 23.945 28.635 1.00 0.00 O \n+HETATM 4297 H1 HOH A 860 28.008 24.551 29.052 1.00 0.00 H \n+HETATM 4298 H2 HOH A 860 27.900 23.541 27.929 1.00 0.00 H \n+HETATM 4299 DOH2 HOH A 860 27.295 23.932 28.664 1.00 0.00 EP \n+HETATM 4300 OM HOH A 860 27.624 23.987 28.575 1.00 0.00 EP \n+HETATM 4301 O HOH A 861 27.814 19.061 26.729 1.00 0.00 O \n+HETATM 4302 H1 HOH A 861 27.148 19.174 26.051 1.00 0.00 H \n+HETATM 4303 H2 HOH A 861 28.374 18.358 26.400 1.00 0.00 H \n+HETATM 4304 DOH2 HOH A 861 27.832 19.066 26.820 1.00 0.00 EP \n+HETATM 4305 OM HOH A 861 27.792 18.940 26.523 1.00 0.00 EP \n+HETATM 4306 O HOH A 862 20.683 20.545 24.325 1.00 0.00 O \n+HETATM 4307 H1 HOH A 862 21.387 20.983 24.803 1.00 0.00 H \n+HETATM 4308 H2 HOH A 862 20.987 20.523 23.417 1.00 0.00 H \n+HETATM 4309 DOH2 HOH A 862 20.598 20.520 24.358 1.00 0.00 EP \n+HETATM 4310 OM HOH A 862 20.890 20.630 24.237 1.00 0.00 EP \n+HETATM 4311 O HOH A 863 26.447 1.039 26.670 1.00 0.00 O \n+HETATM 4312 H1 HOH A 863 26.022 0.333 26.183 1.00 0.00 H \n+HETATM 4313 H2 HOH A 863 27.316 0.697 26.878 1.00 0.00 H \n+HETATM 4314 DOH2 HOH A 863 26.388 1.120 26.692 1.00 0.00 EP \n+HETATM 4315 OM HOH A 863 26.538 0.824 26.612 1.00 0.00 EP \n+HETATM 4316 O HOH A 864 24.401 12.519 29.952 1.00 0.00 O \n+HETATM 4317 H1 HOH A 864 23.628 13.071 29.833 1.00 0.00 H \n+HETATM 4318 H2 HOH A 864 24.248 12.068 30.782 1.00 0.00 H \n+HETATM 4319 DOH2 HOH A 864 24.478 12.561 29.918 1.00 0.00 EP \n+HETATM 4320 OM HOH A 864 24.211 12.540 30.098 1.00 0.00 EP \n+HETATM 4321 O HOH A 865 4.147 3.506 0.727 1.00 0.00 O \n+HETATM 4322 H1 HOH A 865 3.655 3.833 -0.026 1.00 0.00 H \n+HETATM 4323 H2 HOH A 865 3.504 3.014 1.238 1.00 0.00 H \n+HETATM 4324 DOH2 HOH A 865 4.235 3.492 0.748 1.00 0.00 EP \n+HETATM 4325 OM HOH A 865 3.914 3.472 0.677 1.00 0.00 EP \n+HETATM 4326 O HOH A 866 28.719 22.561 26.608 1.00 0.00 O \n+HETATM 4327 H1 HOH A 866 29.126 21.790 27.003 1.00 0.00 H \n+HETATM 4328 H2 HOH A 866 29.090 22.604 25.727 1.00 0.00 H \n+HETATM 4329 DOH2 HOH A 866 28.636 22.593 26.647 1.00 0.00 EP \n+HETATM 4330 OM HOH A 866 28.878 22.412 26.508 1.00 0.00 EP \n+HETATM 4331 O HOH A 867 26.043 22.630 25.839 1.00 0.00 O \n+HETATM 4332 H1 HOH A 867 26.946 22.475 26.114 1.00 0.00 H \n+HETATM 4333 H2 HOH A 867 25.972 22.197 24.989 1.00 0.00 H \n+HETATM 4334 DOH2 HOH A 867 25.997 22.682 25.867 1.00 0.00 EP \n+HETATM 4335 OM HOH A 867 26.214 22.510 25.721 1.00 0.00 EP \n+HETATM 4336 O HOH A 868 24.573 29.213 25.451 1.00 0.00 O \n+HETATM 4337 H1 HOH A 868 24.185 29.206 26.327 1.00 0.00 H \n+HETATM 4338 H2 HOH A 868 24.476 28.313 25.139 1.00 0.00 H \n+HETATM 4339 DOH2 HOH A 868 24.600 29.292 25.422 1.00 0.00 EP \n+HETATM 4340 OM HOH A 868 24.473 29.027 25.567 1.00 0.00 EP \n+HETATM 4341 O HOH A 869 19.126 22.695 25.671 1.00 0.00 O \n+HETATM 4342 H1 HOH A 869 19.510 21.857 25.414 1.00 0.00 H \n+HETATM 4343 H2 HOH A 869 19.796 23.108 26.217 1.00 0.00 H \n+HETATM 4344 DOH2 HOH A 869 19.096 22.712 25.645 1.00 0.00 EP \n+HETATM 4345 OM HOH A 869 19.342 22.608 25.730 1.00 0.00 EP \n+HETATM 4346 O HOH A 870 20.720 3.478 20.715 1.00 0.00 O \n+HETATM 4347 H1 HOH A 870 20.622 3.663 19.781 1.00 0.00 H \n+HETATM 4348 H2 HOH A 870 21.666 3.417 20.849 1.00 0.00 H \n+HETATM 4349 DOH2 HOH A 870 20.658 3.456 20.784 1.00 0.00 EP \n+HETATM 4350 OM HOH A 870 20.894 3.504 20.551 1.00 0.00 EP \n+HETATM 4351 O HOH A 871 28.783 28.706 24.699 1.00 0.00 O \n+HETATM 4352 H1 HOH A 871 29.591 29.143 24.969 1.00 0.00 H \n+HETATM 4353 H2 HOH A 871 28.687 27.978 25.313 1.00 0.00 H \n+HETATM 4354 DOH2 HOH A 871 28.749 28.719 24.600 1.00 0.00 EP \n+HETATM 4355 OM HOH A 871 28.929 28.646 24.880 1.00 0.00 EP \n+HETATM 4356 O HOH A 872 16.690 1.022 26.765 1.00 0.00 O \n+HETATM 4357 H1 HOH A 872 17.226 0.393 27.247 1.00 0.00 H \n+HETATM 4358 H2 HOH A 872 17.126 1.863 26.900 1.00 0.00 H \n+HETATM 4359 DOH2 HOH A 872 16.588 0.987 26.741 1.00 0.00 EP \n+HETATM 4360 OM HOH A 872 16.889 1.065 26.892 1.00 0.00 EP \n+HETATM 4361 O HOH A 873 25.613 26.279 4.694 1.00 0.00 O \n+HETATM 4362 H1 HOH A 873 25.478 25.460 5.171 1.00 0.00 H \n+HETATM 4363 H2 HOH A 873 25.428 26.059 3.781 1.00 0.00 H \n+HETATM 4364 DOH2 HOH A 873 25.651 26.353 4.747 1.00 0.00 EP \n+HETATM 4365 OM HOH A 873 25.547 26.066 4.605 1.00 0.00 EP \n+HETATM 4366 O HOH A 874 17.003 28.420 24.108 1.00 0.00 O \n+HETATM 4367 H1 HOH A 874 17.037 28.526 25.059 1.00 0.00 H \n+HETATM 4368 H2 HOH A 874 17.198 27.494 23.963 1.00 0.00 H \n+HETATM 4369 DOH2 HOH A 874 16.965 28.484 24.062 1.00 0.00 EP \n+HETATM 4370 OM HOH A 874 17.050 28.252 24.273 1.00 0.00 EP \n+HETATM 4371 O HOH A 875 23.586 25.262 22.293 1.00 0.00 O \n+HETATM 4372 H1 HOH A 875 22.954 24.656 21.906 1.00 0.00 H \n+HETATM 4373 H2 HOH A 875 24.080 25.602 21.548 1.00 0.00 H \n+HETATM 4374 DOH2 HOH A 875 23.592 25.284 22.365 1.00 0.00 EP \n+HETATM 4375 OM HOH A 875 23.558 25.207 22.061 1.00 0.00 EP \n+HETATM 4376 O HOH A 876 21.442 23.322 20.911 1.00 0.00 O \n+HETATM 4377 H1 HOH A 876 20.759 23.000 20.323 1.00 0.00 H \n+HETATM 4378 H2 HOH A 876 21.000 23.438 21.752 1.00 0.00 H \n+HETATM 4379 DOH2 HOH A 876 21.500 23.330 20.900 1.00 0.00 EP \n+HETATM 4380 OM HOH A 876 21.212 23.280 20.963 1.00 0.00 EP \n+HETATM 4381 O HOH A 877 3.156 30.034 23.881 1.00 0.00 O \n+HETATM 4382 H1 HOH A 877 2.798 29.583 23.116 1.00 0.00 H \n+HETATM 4383 H2 HOH A 877 3.694 30.736 23.515 1.00 0.00 H \n+HETATM 4384 DOH2 HOH A 877 3.146 29.996 24.008 1.00 0.00 EP \n+HETATM 4385 OM HOH A 877 3.193 30.085 23.649 1.00 0.00 EP \n+HETATM 4386 O HOH A 878 23.526 9.528 20.126 1.00 0.00 O \n+HETATM 4387 H1 HOH A 878 24.362 9.334 20.549 1.00 0.00 H \n+HETATM 4388 H2 HOH A 878 23.000 9.940 20.812 1.00 0.00 H \n+HETATM 4389 DOH2 HOH A 878 23.514 9.494 20.046 1.00 0.00 EP \n+HETATM 4390 OM HOH A 878 23.590 9.573 20.353 1.00 0.00 EP \n+HETATM 4391 O HOH A 879 3.080 20.707 -0.226 1.00 0.00 O \n+HETATM 4392 H1 HOH A 879 2.317 21.286 -0.232 1.00 0.00 H \n+HETATM 4393 H2 HOH A 879 3.489 20.840 -1.081 1.00 0.00 H \n+HETATM 4394 DOH2 HOH A 879 3.102 20.638 -0.145 1.00 0.00 EP \n+HETATM 4395 OM HOH A 879 3.007 20.853 -0.402 1.00 0.00 EP \n+HETATM 4396 O HOH A 880 17.761 26.889 20.225 1.00 0.00 O \n+HETATM 4397 H1 HOH A 880 18.594 27.263 20.511 1.00 0.00 H \n+HETATM 4398 H2 HOH A 880 17.107 27.542 20.474 1.00 0.00 H \n+HETATM 4399 DOH2 HOH A 880 17.772 26.852 20.176 1.00 0.00 EP \n+HETATM 4400 OM HOH A 880 17.798 27.100 20.335 1.00 0.00 EP \n+HETATM 4401 O HOH A 881 23.821 1.335 23.779 1.00 0.00 O \n+HETATM 4402 H1 HOH A 881 22.875 1.381 23.916 1.00 0.00 H \n+HETATM 4403 H2 HOH A 881 24.101 0.577 24.291 1.00 0.00 H \n+HETATM 4404 DOH2 HOH A 881 23.862 1.414 23.745 1.00 0.00 EP \n+HETATM 4405 OM HOH A 881 23.684 1.189 23.912 1.00 0.00 EP \n+HETATM 4406 O HOH A 882 28.816 16.198 28.684 1.00 0.00 O \n+HETATM 4407 H1 HOH A 882 29.490 16.855 28.862 1.00 0.00 H \n+HETATM 4408 H2 HOH A 882 29.278 15.361 28.734 1.00 0.00 H \n+HETATM 4409 DOH2 HOH A 882 28.723 16.216 28.708 1.00 0.00 EP \n+HETATM 4410 OM HOH A 882 29.049 16.161 28.731 1.00 0.00 EP \n+HETATM 4411 O HOH A 883 23.805 20.862 6.582 1.00 0.00 O \n+HETATM 4412 H1 HOH A 883 24.509 20.420 7.056 1.00 0.00 H \n+HETATM 4413 H2 HOH A 883 24.143 20.965 5.692 1.00 0.00 H \n+HETATM 4414 DOH2 HOH A 883 23.712 20.889 6.638 1.00 0.00 EP \n+HETATM 4415 OM HOH A 883 24.019 20.792 6.497 1.00 0.00 EP \n+HETATM 4416 O HOH A 884 21.251 21.565 17.161 1.00 0.00 O \n+HETATM 4417 H1 HOH A 884 20.684 21.868 17.870 1.00 0.00 H \n+HETATM 4418 H2 HOH A 884 21.974 22.192 17.147 1.00 0.00 H \n+HETATM 4419 DOH2 HOH A 884 21.275 21.467 17.110 1.00 0.00 EP \n+HETATM 4420 OM HOH A 884 21.283 21.756 17.303 1.00 0.00 EP \n+HETATM 4421 O HOH A 885 29.463 6.053 21.344 1.00 0.00 O \n+HETATM 4422 H1 HOH A 885 29.115 5.618 20.566 1.00 0.00 H \n+HETATM 4423 H2 HOH A 885 29.273 5.449 22.062 1.00 0.00 H \n+HETATM 4424 DOH2 HOH A 885 29.483 6.123 21.331 1.00 0.00 EP \n+HETATM 4425 OM HOH A 885 29.352 5.840 21.332 1.00 0.00 EP \n+HETATM 4426 O HOH A 886 4.961 20.117 23.119 1.00 0.00 O \n+HETATM 4427 H1 HOH A 886 5.351 20.678 23.790 1.00 0.00 H \n+HETATM 4428 H2 HOH A 886 4.466 19.462 23.611 1.00 0.00 H \n+HETATM 4429 DOH2 HOH A 886 5.001 20.108 23.034 1.00 0.00 EP \n+HETATM 4430 OM HOH A 886 4.940 20.098 23.358 1.00 0.00 EP \n+HETATM 4431 O HOH A 887 24.545 27.806 30.134 1.00 0.00 O \n+HETATM 4432 H1 HOH A 887 24.822 26.941 29.832 1.00 0.00 H \n+HETATM 4433 H2 HOH A 887 25.328 28.183 30.535 1.00 0.00 H \n+HETATM 4434 DOH2 HOH A 887 24.446 27.852 30.099 1.00 0.00 EP \n+HETATM 4435 OM HOH A 887 24.762 27.706 30.154 1.00 0.00 EP \n+HETATM 4436 O HOH A 888 22.350 1.305 -0.059 1.00 0.00 O \n+HETATM 4437 H1 HOH A 888 22.205 0.370 -0.202 1.00 0.00 H \n+HETATM 4438 H2 HOH A 888 23.233 1.464 -0.393 1.00 0.00 H \n+HETATM 4439 DOH2 HOH A 888 22.278 1.368 -0.061 1.00 0.00 EP \n+HETATM 4440 OM HOH A 888 22.501 1.146 -0.157 1.00 0.00 EP \n+HETATM 4441 O HOH A 889 2.402 2.266 19.978 1.00 0.00 O \n+HETATM 4442 H1 HOH A 889 2.205 2.777 19.193 1.00 0.00 H \n+HETATM 4443 H2 HOH A 889 2.361 1.355 19.688 1.00 0.00 H \n+HETATM 4444 DOH2 HOH A 889 2.414 2.314 20.052 1.00 0.00 EP \n+HETATM 4445 OM HOH A 889 2.353 2.184 19.758 1.00 0.00 EP \n+HETATM 4446 O HOH A 890 15.257 29.387 18.169 1.00 0.00 O \n+HETATM 4447 H1 HOH A 890 14.338 29.232 17.950 1.00 0.00 H \n+HETATM 4448 H2 HOH A 890 15.365 29.002 19.038 1.00 0.00 H \n+HETATM 4449 DOH2 HOH A 890 15.335 29.419 18.099 1.00 0.00 EP \n+HETATM 4450 OM HOH A 890 15.091 29.276 18.302 1.00 0.00 EP \n+HETATM 4451 O HOH A 891 20.495 23.753 23.451 1.00 0.00 O \n+HETATM 4452 H1 HOH A 891 20.403 24.706 23.434 1.00 0.00 H \n+HETATM 4453 H2 HOH A 891 19.897 23.466 24.141 1.00 0.00 H \n+HETATM 4454 DOH2 HOH A 891 20.557 23.714 23.396 1.00 0.00 EP \n+HETATM 4455 OM HOH A 891 20.353 23.890 23.589 1.00 0.00 EP \n+HETATM 4456 O HOH A 892 1.446 6.103 0.933 1.00 0.00 O \n+HETATM 4457 H1 HOH A 892 1.674 6.465 0.077 1.00 0.00 H \n+HETATM 4458 H2 HOH A 892 2.230 6.234 1.466 1.00 0.00 H \n+HETATM 4459 DOH2 HOH A 892 1.358 6.059 0.978 1.00 0.00 EP \n+HETATM 4460 OM HOH A 892 1.653 6.204 0.867 1.00 0.00 EP \n+HETATM 4461 O HOH A 893 4.332 25.927 26.630 1.00 0.00 O \n+HETATM 4462 H1 HOH A 893 3.399 26.089 26.495 1.00 0.00 H \n+HETATM 4463 H2 HOH A 893 4.362 25.156 27.197 1.00 0.00 H \n+HETATM 4464 DOH2 HOH A 893 4.405 25.976 26.606 1.00 0.00 EP \n+HETATM 4465 OM HOH A 893 4.147 25.802 26.719 1.00 0.00 EP \n+HETATM 4466 O HOH A 894 9.858 26.208 22.047 1.00 0.00 O \n+HETATM 4467 H1 HOH A 894 10.574 25.573 22.037 1.00 0.00 H \n+HETATM 4468 H2 HOH A 894 10.290 27.055 22.166 1.00 0.00 H \n+HETATM 4469 DOH2 HOH A 894 9.762 26.188 22.056 1.00 0.00 EP \n+HETATM 4470 OM HOH A 894 10.093 26.252 22.069 1.00 0.00 EP \n+HETATM 4471 O HOH A 895 12.685 28.694 17.525 1.00 0.00 O \n+HETATM 4472 H1 HOH A 895 12.926 28.393 16.649 1.00 0.00 H \n+HETATM 4473 H2 HOH A 895 11.795 28.367 17.655 1.00 0.00 H \n+HETATM 4474 DOH2 HOH A 895 12.751 28.726 17.562 1.00 0.00 EP \n+HETATM 4475 OM HOH A 895 12.552 28.565 17.372 1.00 0.00 EP \n+TER 4476 HOH A 895\n+END\ndiff --git a/wrappers/python/openmm/app/modeller.py b/wrappers/python/openmm/app/modeller.py\nindex 5c464be73c..2b70b2e06c 100644\n--- a/wrappers/python/openmm/app/modeller.py\n+++ b/wrappers/python/openmm/app/modeller.py\n@@ -8,7 +8,7 @@\n \n Portions copyright (c) 2012-2022 Stanford University and the Authors.\n Authors: Peter Eastman\n-Contributors:\n+Contributors: \n \n Permission is hereby granted, free of charge, to any person obtaining a\n copy of this software and associated documentation files (the \"Software\"),\n@@ -404,11 +404,11 @@ def addSolvent(self, forcefield, model='tip3p', boxSize=None, boxVectors=None, p\n between periodic copies to be achieved with a smaller box. The most compact option is a rhombic dodecahedron,\n for which the box volume is 70.7% the volume of a cubic box with the same amount of padding.\n \n- There exist many different water models, many of which are very similar to each other. This method creates \n- preequilibrated water boxes for a limited set of water models. In most cases, they work equally well for other models \n- that involve the same number of particles. For example, to simulate a box of TIP3P-FB water, use this method to \n- create a box of TIP3P water, construct a System using TIP3P-FB parameters, and perform a local energy minimization \n- to correct for the small differences between the models. Likewise, a box of TIP4P-Ew water can be used for most \n+ There exist many different water models, many of which are very similar to each other. This method creates\n+ preequilibrated water boxes for a limited set of water models. In most cases, they work equally well for other models\n+ that involve the same number of particles. For example, to simulate a box of TIP3P-FB water, use this method to\n+ create a box of TIP3P water, construct a System using TIP3P-FB parameters, and perform a local energy minimization\n+ to correct for the small differences between the models. Likewise, a box of TIP4P-Ew water can be used for most\n four site water models.\n \n Parameters\n@@ -416,7 +416,7 @@ def addSolvent(self, forcefield, model='tip3p', boxSize=None, boxVectors=None, p\n forcefield : ForceField\n the ForceField to use for determining van der Waals radii and atomic charges\n model : str='tip3p'\n- the water model to use. Supported values are 'tip3p', 'spce', 'tip4pew', and 'tip5p'. \n+ the water model to use. Supported values are 'tip3p', 'spce', 'tip4pew', 'tip5p', and 'swm4ndp' (polarizable).\n boxSize : Vec3=None\n the size of the box to fill with water\n boxVectors : tuple of Vec3=None\n@@ -454,6 +454,8 @@ def addSolvent(self, forcefield, model='tip3p', boxSize=None, boxVectors=None, p\n waterRadius = 0.315365*vdwRadiusPerSigma\n elif model == 'tip5p':\n waterRadius = 0.312*vdwRadiusPerSigma\n+ elif model == 'swm4ndp':\n+ waterRadius = 0.318395*vdwRadiusPerSigma\n else:\n raise ValueError('Unknown water model: %s' % model)\n pdb = PDBFile(os.path.join(os.path.dirname(__file__), 'data', model+'.pdb'))\n"}, "test": {"test_patch": "diff --git a/wrappers/python/tests/TestModeller.py b/wrappers/python/tests/TestModeller.py\nindex 06906afe30..1f29bc9951 100644\n--- a/wrappers/python/tests/TestModeller.py\n+++ b/wrappers/python/tests/TestModeller.py\n@@ -264,7 +264,7 @@ def test_addSolventWaterModels(self):\n \n topology_start = self.pdb.topology\n topology_start.setUnitCellDimensions(Vec3(3.5, 3.5, 3.5)*nanometers)\n- for model in ['tip3p', 'spce', 'tip4pew', 'tip5p']:\n+ for model in ['tip3p', 'spce', 'tip4pew', 'tip5p', 'swm4ndp']:\n forcefield = ForceField('amber10.xml', model + '.xml')\n modeller = Modeller(topology_start, self.positions)\n # delete water to get the \"before\" topology\n", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}72{"question_id": "MSB_openmm_openmm_pr3769", "question_type": "multi_swe_bench", "description": "Clarified multiple forces with the same global parameter (openmm/openmm#3769)", "content": {"org": "openmm", "repo": "openmm", "pr_number": 3769, "issue_title": "Clarified multiple forces with the same global parameter", "issue_body": "Fixes #3768. I added documentation to clarify this case, and also made the Context throw an exception if two forces define global parameters with the same name but different default values.", "base_commit": "87a70daf1753105594cc8996aabdc66daddfcd6f", "resolved_issues": [{"number": 3768, "title": "Implicit value substitution when two `CustomExternalForce` have global parameters with the same name", "body": "# general description\r\nI found that if two custom external forces have global parameters with the same name, the value of the latter one would be substitue by the first one. Also, when I tried to get the parameter value through `getGlobalParameterDefualtValue` it will not print the 'substituted' value but the original value setted by me. (I know that naming two global parameter with the same name is probably not best practice, but this behaviour makes it difficult to debug). I recommand either emphasizing this behaviour in the documentation or throwing errors when two global parameters have the same name.\r\n\r\n# version info\r\n```python\r\nprint(openmm.__version__)\r\n```\r\n7.7\r\n\r\n# procedures to reproduce\r\n```python\r\nimport openmm as mm\r\nfrom openmm import app\r\nfrom openmm import unit\r\nmass = 40 * unit.amu\r\nsystem = mm.System()\r\nsystem.addParticle(mass)\r\n\r\nexternal1 = mm.CustomExternalForce(\"k*x\")\r\nexternal1.addGlobalParameter(\"k\", 1*unit.kilojoule_per_mole/unit.nanometer)\r\nexternal1.addParticle(0, [])\r\n\r\nexternal2 = mm.CustomExternalForce(\"k*y\")\r\nexternal2.addGlobalParameter(\"k\", 2*unit.kilojoule_per_mole/unit.nanometer)\r\nexternal2.addParticle(0, [])\r\nsystem.addForce(external1)\r\nsystem.addForce(external2)\r\n```\r\n\r\nWhen I query through the force object, the paramter values are correct\r\n```python\r\nfor i in range(system.getNumForces()):\r\n f = system.getForce(i)\r\n print(f\" name of the force: {f.getName()}\")\r\n print(f\" energy function of the force: {f.getEnergyFunction()}\")\r\n for j in range(f.getNumGlobalParameters()):\r\n print(f\"{f.getGlobalParameterName(j)}: {f.getGlobalParameterDefaultValue(j)}\")\r\n\r\nfor i, f in enumerate(system.getForces()):\r\n f.setForceGroup(i)\r\n```\r\nname of the force: CustomExternalForce\r\nenergy function of the force: k*x\r\nk: 1.0\r\nname of the force: CustomExternalForce\r\nenergy function of the force: k*y\r\nk: 2.0\r\n\r\nBut when i initialize and calculate the potential energy, it's wrong\r\n```python\r\ntopology = app.Topology()\r\nelement = app.Element.getBySymbol('Ar')\r\nchain = topology.addChain('A')\r\nresidue = topology.addResidue('OSC', chain)\r\ntopology.addAtom('Ar', element, residue)\r\nintegrator = mm.VerletIntegrator(2*unit.femtosecond)\r\nsimulation = app.Simulation(topology, system, integrator)\r\nsimulation.context.setPositions(np.array([[1, 2, 0]])*unit.nanometer)\r\nfor i, f in enumerate(system.getForces()):\r\n state = simulation.context.getState(getEnergy=True, groups={i})\r\n print(f.getName(), state.getPotentialEnergy())\r\n```\r\nCustomExternalForce 1.0 kJ/mol\r\nCustomExternalForce 2.0 kJ/mol\r\nWhere the second customexternalforce should have 2*2=4kJ/mol as potential energy\n\n## IMPORTANT INSTRUCTIONS\n\n1. If you edit a python file, you MUST run 'make PythonInstall' inside the build directory\n2. If you edit a c++ file, you MUST run 'make -j4 && make install\" inside the build directory"}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/openmm_m_openmm:pr-3769", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/docs-source/usersguide/theory/03_custom_forces.rst b/docs-source/usersguide/theory/03_custom_forces.rst\nindex 17fbfdddc8..201bf9e5d9 100644\n--- a/docs-source/usersguide/theory/03_custom_forces.rst\n+++ b/docs-source/usersguide/theory/03_custom_forces.rst\n@@ -465,6 +465,13 @@ example, if a :class:`CustomNonbondedForce` uses a long range correction, changi\n a global parameter may require the correction coefficient to be recalculated,\n which is expensive.\n \n+It is possible for multiple forces to depend on the same global parameter. To do this,\n+simply have each force specify a parameter with the same name. This can be useful\n+in certain cases. For example, in an alchemical simulation, you might have a\n+parameter that interpolates between two endpoints corresponding to different molecules.\n+Changing the one parameter would simultaneously modify multiple bonded and nonbonded\n+forces.\n+\n The other type of parameter is ones that record many values, one for each element\n of the force, such as per-particle or per-bond parameters. These values are stored\n directly in the force object itself, and hence are part of the system definition.\ndiff --git a/openmmapi/src/ContextImpl.cpp b/openmmapi/src/ContextImpl.cpp\nindex e86b9241f6..77f3453706 100644\n--- a/openmmapi/src/ContextImpl.cpp\n+++ b/openmmapi/src/ContextImpl.cpp\n@@ -188,6 +188,9 @@ void ContextImpl::initialize() {\n for (size_t i = 0; i < forceImpls.size(); ++i) {\n forceImpls[i]->initialize(*this);\n map<string, double> forceParameters = forceImpls[i]->getDefaultParameters();\n+ for (auto param : forceParameters)\n+ if (parameters.find(param.first) != parameters.end() && parameters[param.first] != forceParameters[param.first])\n+ throw OpenMMException(\"Two Forces define different default values for the parameter '\"+param.first+\"'\");\n parameters.insert(forceParameters.begin(), forceParameters.end());\n }\n integrator.initialize(*this);\n"}, "test": {"test_patch": "diff --git a/tests/TestCustomBondForce.h b/tests/TestCustomBondForce.h\nindex 16f83a3d59..e63e96f8a6 100644\n--- a/tests/TestCustomBondForce.h\n+++ b/tests/TestCustomBondForce.h\n@@ -6,7 +6,7 @@\n * Biological Structures at Stanford, funded under the NIH Roadmap for *\n * Medical Research, grant U54 GM072970. See https://simtk.org. *\n * *\n- * Portions copyright (c) 2008-2016 Stanford University and the Authors. *\n+ * Portions copyright (c) 2008-2022 Stanford University and the Authors. *\n * Authors: Peter Eastman *\n * Contributors: *\n * *\n@@ -148,6 +148,28 @@ void testIllegalVariable() {\n ASSERT(threwException);\n }\n \n+void testInconsistentParameters() {\n+ // Specifying two inconsistent default values for a global parameter should throw an exception.\n+ \n+ System system;\n+ system.addParticle(1.0);\n+ CustomBondForce* bonds1 = new CustomBondForce(\"k*r\");\n+ CustomBondForce* bonds2 = new CustomBondForce(\"k*r\");\n+ bonds1->addGlobalParameter(\"k\", 1.0);\n+ bonds2->addGlobalParameter(\"k\", 2.0);\n+ system.addForce(bonds1);\n+ system.addForce(bonds2);\n+ VerletIntegrator integrator(0.001);\n+ bool threwException = false;\n+ try {\n+ Context context(system, integrator, platform);\n+ }\n+ catch (const exception& e) {\n+ threwException = true;\n+ }\n+ ASSERT(threwException);\n+}\n+\n void testPeriodic() {\n // Create a force that uses periodic boundary conditions.\n \n@@ -221,6 +243,7 @@ int main(int argc, char* argv[]) {\n testBonds();\n testManyParameters();\n testIllegalVariable();\n+ testInconsistentParameters();\n testPeriodic();\n testEnergyParameterDerivatives();\n runPlatformTests();\n", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}73{"question_id": "MSB_openmm_openmm_pr3791", "question_type": "multi_swe_bench", "description": "Fix #3790: Collision rate for MTS BAOAB Langevin integrator now correctly accounts for number of substeps (openmm/openmm#3791)", "content": {"org": "openmm", "repo": "openmm", "pr_number": 3791, "issue_title": "Fix #3790: Collision rate for MTS BAOAB Langevin integrator now correctly accounts for number of substeps", "issue_body": "Previously, `openmm.MTSLangevinIntegrator` would use an effective collision rate that is too large when there were multiple steps, since every substep used the outer timestep instead of the inner substep timestep to apply the friction.\r\n\r\nThis PR corrects this, using a fix suggested by Charlie Matthews (@c-matthews) in #3790.", "base_commit": "ffc3ee78863e3778558ba7b0bcfde55f8c3d8897", "resolved_issues": [{"number": 3790, "title": "MTSLangevinIntegrator friction bug", "body": "Hi all, I think I found a bug in the [MTS Langevin Integrator](https://github.com/openmm/openmm/blob/be19e0222ddf66f612016a3c1f687161a53c2396/wrappers/python/openmm/mtsintegrator.py) code.\r\n\r\nCurrently the routine defines constants `a` and `b` as\r\n\r\nhttps://github.com/openmm/openmm/blob/be19e0222ddf66f612016a3c1f687161a53c2396/wrappers/python/openmm/mtsintegrator.py#L170-L171\r\n\r\nand then applies an Ornstein-Uhlenbeck update using these constants _at every substep_\r\n\r\nhttps://github.com/openmm/openmm/blob/be19e0222ddf66f612016a3c1f687161a53c2396/wrappers/python/openmm/mtsintegrator.py#L187-L192\r\n\r\nThe problem being that if I have $N$ substeps then I effectively am using $N\\times$ the friction in simulation, which can affect diffusion coefficients and the like.\r\n\r\nAn easy fix would be to redefine the `a` and `b` constants to divide the per-substep OU update by the number of total substeps, something like\r\n\r\n total_substeps = math.prod( [group_size for (group_id, group_size) in groups] )\r\n self.addGlobalVariable(\"a\", math.exp(-friction*dt / total_substeps))\r\n self.addGlobalVariable(\"b\", math.sqrt(1-math.exp(-2*friction*dt / total_substeps)))\r\n\r\nThat way the total damping should be correct. An alternative would be to give the user control of how the damping is allocated between the groups.\r\n\r\nCheers - CM\n\n## IMPORTANT INSTRUCTIONS\n\n1. If you edit a python file, you MUST run 'make PythonInstall' inside the build directory\n2. If you edit a c++ file, you MUST run 'make -j4 && make install\" inside the build directory"}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/openmm_m_openmm:pr-3791", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/wrappers/python/openmm/mtsintegrator.py b/wrappers/python/openmm/mtsintegrator.py\nindex dcae295562..5014e31a36 100644\n--- a/wrappers/python/openmm/mtsintegrator.py\n+++ b/wrappers/python/openmm/mtsintegrator.py\n@@ -167,8 +167,9 @@ def __init__(self, temperature, friction, dt, groups):\n self.temperature = temperature\n self.friction = friction\n import math\n- self.addGlobalVariable(\"a\", math.exp(-friction*dt))\n- self.addGlobalVariable(\"b\", math.sqrt(1-math.exp(-2*friction*dt)))\n+ total_substeps = groups[-1][1]\n+ self.addGlobalVariable(\"a\", math.exp(-friction*dt / total_substeps))\n+ self.addGlobalVariable(\"b\", math.sqrt(1-math.exp(-2*friction*dt / total_substeps)))\n from openmm.unit import MOLAR_GAS_CONSTANT_R\n self.addGlobalVariable('kT', MOLAR_GAS_CONSTANT_R*temperature)\n self.addPerDofVariable(\"x1\", 0)\n"}, "test": {"test_patch": "diff --git a/wrappers/python/tests/TestIntegrators.py b/wrappers/python/tests/TestIntegrators.py\nindex 03291e06ce..07a27bae43 100644\n--- a/wrappers/python/tests/TestIntegrators.py\n+++ b/wrappers/python/tests/TestIntegrators.py\n@@ -137,7 +137,7 @@ def testMTSLangevinIntegrator(self):\n force.setForceGroup(0)\n \n # Create an integrator\n- integrator = MTSLangevinIntegrator(300*kelvin, 1/picosecond, 4*femtoseconds, [(2,1), (1,2), (0,4)])\n+ integrator = MTSLangevinIntegrator(300*kelvin, 5/picosecond, 4*femtoseconds, [(2,1), (1,2), (0,4)])\n \n # Run some equilibration.\n context = Context(system, integrator)\n@@ -156,13 +156,43 @@ def testMTSLangevinIntegrator(self):\n temperature = averageEnergy*2/(dofs*MOLAR_GAS_CONSTANT_R)\n self.assertTrue(290*kelvin < temperature < 310*kelvin)\n \n+ def testMTSLangevinIntegratorFriction(self):\n+ \"\"\"Test the MTSLangevinIntegrator on a force-free particle to ensure friction is properly accounted for (issue #3790)\"\"\"\n+ # Create a System with a single particle and no forces\n+ system = System()\n+ system.addParticle(12.0*amu)\n+ platform = Platform.getPlatformByName('Reference')\n+ initial_positions = [Vec3(0,0,0)]\n+ initial_velocities = [Vec3(1,0,0)]\n+ nsteps = 125 # number of steps to take\n+ collision_rate = 1/picosecond\n+ timestep = 4*femtoseconds\n+\n+ def get_final_velocities(nsubsteps):\n+ \"\"\"Get the final velocity vector after a fixed number of steps for the specified number of substeps\"\"\"\n+ integrator = MTSLangevinIntegrator(0*kelvin, collision_rate, timestep, [(0,nsubsteps)])\n+ context = Context(system, integrator, platform)\n+ context.setPositions(initial_positions)\n+ context.setVelocities(initial_velocities)\n+ integrator.step(nsteps)\n+ final_velocities = context.getState(getVelocities=True).getVelocities()\n+ del context, integrator\n+ return final_velocities\n+\n+ # Compare sub-stepped MTS with single-step MTS\n+ for nsubsteps in range(2,6):\n+ mts_velocities = get_final_velocities(nsubsteps)\n+ self.assertAlmostEqual(math.exp(-timestep*nsteps*collision_rate), mts_velocities[0].x)\n+ self.assertAlmostEqual(0, mts_velocities[0].y)\n+ self.assertAlmostEqual(0, mts_velocities[0].z)\n+\n def testNoseHooverIntegrator(self):\n \"\"\"Test partial thermostating in the NoseHooverIntegrator (only API)\"\"\"\n pdb = PDBFile('systems/alanine-dipeptide-explicit.pdb')\n ff = ForceField('amber99sbildn.xml', 'tip3p.xml')\n system = ff.createSystem(pdb.topology, nonbondedMethod=PME)\n \n- integrator = NoseHooverIntegrator(1.0*femtosecond) \n+ integrator = NoseHooverIntegrator(1.0*femtosecond)\n integrator.addSubsystemThermostat(list(range(5)), [], 200*kelvin, 1/picosecond, 200*kelvin, 1/picosecond, 3,3,3)\n con = Context(system, integrator)\n con.setPositions(pdb.positions)\n", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}74{"question_id": "MSB_openmm_openmm_pr3819", "question_type": "multi_swe_bench", "description": "Add OPC and OPC3 ion sets (openmm/openmm#3819)", "content": {"org": "openmm", "repo": "openmm", "pr_number": 3819, "issue_title": "Add OPC and OPC3 ion sets", "issue_body": "Make merged xml files from `opc*xml` and `ions/ionslm_126_opc*.xml` from https://github.com/openmm/openmmforcefields/commit/b12c2e871b60275a10b3f8f56dfc2f6d5447591f", "base_commit": "c19b6d938a7a9e5f5909c27d92cf20db7a037e35", "resolved_issues": [{"number": null, "title": "Add OPC and OPC3 ion sets", "body": "The current implementation of the force field library does not include support for the OPC and OPC3 water models along with their associated ion parameters. These water models are widely used in molecular simulations due to their improved accuracy in representing water properties and interactions. The absence of these models limits the flexibility and applicability of the software for users who require these specific water models for their simulations.\n\nThe expected behavior is that users should be able to access and utilize the OPC and OPC3 water models, including their ion parameters, directly within the force field library. This would allow for more accurate and diverse simulations, catering to a broader range of scientific use cases.\n\n## IMPORTANT INSTRUCTIONS\n\n1. If you edit a python file, you MUST run 'make PythonInstall' inside the build directory\n2. If you edit a c++ file, you MUST run 'make -j4 && make install\" inside the build directory"}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/openmm_m_openmm:pr-3819", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/docs-source/usersguide/application/02_running_sims.rst b/docs-source/usersguide/application/02_running_sims.rst\nindex a06afc52d7..b984e53d56 100644\n--- a/docs-source/usersguide/application/02_running_sims.rst\n+++ b/docs-source/usersguide/application/02_running_sims.rst\n@@ -505,6 +505,8 @@ File Parameters\n :file:`amber14/tip4pew.xml` TIP4P-Ew water model\\ :cite:`Horn2004` and ions\n :file:`amber14/tip4pfb.xml` TIP4P-FB water model\\ :cite:`Wang2014` and ions\n :file:`amber14/spce.xml` SPC/E water model\\ :cite:`Berendsen1987` and ions\n+:code:`amber14/opc.xml` OPC water model\\ :cite:`Izadi2014` and ions\n+:code:`amber14/opc3.xml` OPC3 water model\\ :cite:`Izadi2016` and ions\n =================================== ============================================\n \n As a convenience, the file :file:`amber14-all.xml` can be used as a shortcut to include\ndiff --git a/wrappers/python/openmm/app/data/amber14/opc.xml b/wrappers/python/openmm/app/data/amber14/opc.xml\nnew file mode 100644\nindex 0000000000..eb2a2104bf\n--- /dev/null\n+++ b/wrappers/python/openmm/app/data/amber14/opc.xml\n@@ -0,0 +1,341 @@\n+<ForceField>\n+ <Info>\n+ <Reference>Izadi S, Anandakrishnan R, Onufriev AV. Building Water Models: A Different Approach. The Journal of Physical Chemistry Letters. 2014 Nov 6;5(21):3863-71. DOI:10.1021/jz501780a</Reference>\n+ <!-- Li/Merz ion parameters of atomic ions for the OPC water model (12-6 set) -->\n+ <DateGenerated>2022-09-28T04:59:42.378081</DateGenerated>\n+ <Source Source=\"parm/frcmod.ionslm_126_opc\" md5hash=\"61ee47ec99a7ebf66cf09e899a8f0581\" sourcePackage=\"AmberTools\" sourcePackageVersion=\"22.0-py38h6177452_1\">parm/frcmod.ionslm_126_opc</Source>\n+ <Source Source=\"lib/atomic_ions.lib\" md5hash=\"e900cee0c71ec2795d25b3555de486e1\" sourcePackage=\"AmberTools\" sourcePackageVersion=\"22.0-py38h6177452_1\">lib/atomic_ions.lib</Source>\n+ </Info>\n+ <AtomTypes>\n+ <Type name=\"opc-O\" class=\"OW\" element=\"O\" mass=\"16.00000\"/>\n+ <Type name=\"opc-H\" class=\"HW\" element=\"H\" mass=\"1.00800\"/>\n+ <Type name=\"opc-M\" class=\"MW\" mass=\"0\"/>\n+ <Type class=\"ionslm_126_opc-Li+\" element=\"Li\" mass=\"6.94\" name=\"ionslm_126_opc-Li+\"/>\n+ <Type class=\"ionslm_126_opc-Na+\" element=\"Na\" mass=\"22.99\" name=\"ionslm_126_opc-Na+\"/>\n+ <Type class=\"ionslm_126_opc-K+\" element=\"K\" mass=\"39.10\" name=\"ionslm_126_opc-K+\"/>\n+ <Type class=\"ionslm_126_opc-Rb+\" element=\"Rb\" mass=\"85.47\" name=\"ionslm_126_opc-Rb+\"/>\n+ <Type class=\"ionslm_126_opc-Cs+\" element=\"Cs\" mass=\"132.91\" name=\"ionslm_126_opc-Cs+\"/>\n+ <Type class=\"ionslm_126_opc-Tl+\" element=\"Tl\" mass=\"204.38\" name=\"ionslm_126_opc-Tl+\"/>\n+ <Type class=\"ionslm_126_opc-Cu+\" element=\"Cu\" mass=\"63.55\" name=\"ionslm_126_opc-Cu+\"/>\n+ <Type class=\"ionslm_126_opc-Ag+\" element=\"Ag\" mass=\"107.87\" name=\"ionslm_126_opc-Ag+\"/>\n+ <Type class=\"ionslm_126_opc-F-\" element=\"F\" mass=\"19.00\" name=\"ionslm_126_opc-F-\"/>\n+ <Type class=\"ionslm_126_opc-Cl-\" element=\"Cl\" mass=\"35.45\" name=\"ionslm_126_opc-Cl-\"/>\n+ <Type class=\"ionslm_126_opc-Br-\" element=\"Br\" mass=\"79.90\" name=\"ionslm_126_opc-Br-\"/>\n+ <Type class=\"ionslm_126_opc-I-\" element=\"I\" mass=\"126.9\" name=\"ionslm_126_opc-I-\"/>\n+ <Type class=\"ionslm_126_opc-Be2+\" element=\"Be\" mass=\"9.01\" name=\"ionslm_126_opc-Be2+\"/>\n+ <Type class=\"ionslm_126_opc-Cu2+\" element=\"Cu\" mass=\"63.55\" name=\"ionslm_126_opc-Cu2+\"/>\n+ <Type class=\"ionslm_126_opc-Ni2+\" element=\"Ni\" mass=\"58.69\" name=\"ionslm_126_opc-Ni2+\"/>\n+ <Type class=\"ionslm_126_opc-Pt2+\" element=\"Pt\" mass=\"195.08\" name=\"ionslm_126_opc-Pt2+\"/>\n+ <Type class=\"ionslm_126_opc-Zn2+\" element=\"Zn\" mass=\"65.4\" name=\"ionslm_126_opc-Zn2+\"/>\n+ <Type class=\"ionslm_126_opc-Co2+\" element=\"Co\" mass=\"58.93\" name=\"ionslm_126_opc-Co2+\"/>\n+ <Type class=\"ionslm_126_opc-Pd2+\" element=\"Pd\" mass=\"106.42\" name=\"ionslm_126_opc-Pd2+\"/>\n+ <Type class=\"ionslm_126_opc-Ag2+\" element=\"Ag\" mass=\"107.87\" name=\"ionslm_126_opc-Ag2+\"/>\n+ <Type class=\"ionslm_126_opc-Cr2+\" element=\"Cr\" mass=\"52.00\" name=\"ionslm_126_opc-Cr2+\"/>\n+ <Type class=\"ionslm_126_opc-Fe2+\" element=\"Fe\" mass=\"55.85\" name=\"ionslm_126_opc-Fe2+\"/>\n+ <Type class=\"ionslm_126_opc-Mg2+\" element=\"Mg\" mass=\"24.305\" name=\"ionslm_126_opc-Mg2+\"/>\n+ <Type class=\"ionslm_126_opc-V2+\" element=\"V\" mass=\"50.94\" name=\"ionslm_126_opc-V2+\"/>\n+ <Type class=\"ionslm_126_opc-Mn2+\" element=\"Mn\" mass=\"54.94\" name=\"ionslm_126_opc-Mn2+\"/>\n+ <Type class=\"ionslm_126_opc-Hg2+\" element=\"Hg\" mass=\"200.59\" name=\"ionslm_126_opc-Hg2+\"/>\n+ <Type class=\"ionslm_126_opc-Cd2+\" element=\"Cd\" mass=\"112.41\" name=\"ionslm_126_opc-Cd2+\"/>\n+ <Type class=\"ionslm_126_opc-Yb2+\" element=\"Yb\" mass=\"173.05\" name=\"ionslm_126_opc-Yb2+\"/>\n+ <Type class=\"ionslm_126_opc-Ca2+\" element=\"Ca\" mass=\"40.08\" name=\"ionslm_126_opc-Ca2+\"/>\n+ <Type class=\"ionslm_126_opc-Sn2+\" element=\"Sn\" mass=\"118.71\" name=\"ionslm_126_opc-Sn2+\"/>\n+ <Type class=\"ionslm_126_opc-Pb2+\" element=\"Pb\" mass=\"207.2\" name=\"ionslm_126_opc-Pb2+\"/>\n+ <Type class=\"ionslm_126_opc-Eu2+\" element=\"Eu\" mass=\"151.96\" name=\"ionslm_126_opc-Eu2+\"/>\n+ <Type class=\"ionslm_126_opc-Sr2+\" element=\"Sr\" mass=\"87.62\" name=\"ionslm_126_opc-Sr2+\"/>\n+ <Type class=\"ionslm_126_opc-Sm2+\" element=\"Sm\" mass=\"150.36\" name=\"ionslm_126_opc-Sm2+\"/>\n+ <Type class=\"ionslm_126_opc-Ba2+\" element=\"Ba\" mass=\"137.33\" name=\"ionslm_126_opc-Ba2+\"/>\n+ <Type class=\"ionslm_126_opc-Ra2+\" element=\"Ra\" mass=\"226.03\" name=\"ionslm_126_opc-Ra2+\"/>\n+ <Type class=\"ionslm_126_opc-Al3+\" element=\"Al\" mass=\"26.98\" name=\"ionslm_126_opc-Al3+\"/>\n+ <Type class=\"ionslm_126_opc-Fe3+\" element=\"Fe\" mass=\"55.85\" name=\"ionslm_126_opc-Fe3+\"/>\n+ <Type class=\"ionslm_126_opc-Cr3+\" element=\"Cr\" mass=\"52.00\" name=\"ionslm_126_opc-Cr3+\"/>\n+ <Type class=\"ionslm_126_opc-In3+\" element=\"In\" mass=\"114.82\" name=\"ionslm_126_opc-In3+\"/>\n+ <Type class=\"ionslm_126_opc-Tl3+\" element=\"Tl\" mass=\"204.38\" name=\"ionslm_126_opc-Tl3+\"/>\n+ <Type class=\"ionslm_126_opc-Y3+\" element=\"Y\" mass=\"88.91\" name=\"ionslm_126_opc-Y3+\"/>\n+ <Type class=\"ionslm_126_opc-La3+\" element=\"La\" mass=\"138.91\" name=\"ionslm_126_opc-La3+\"/>\n+ <Type class=\"ionslm_126_opc-Ce3+\" element=\"Ce\" mass=\"140.12\" name=\"ionslm_126_opc-Ce3+\"/>\n+ <Type class=\"ionslm_126_opc-Pr3+\" element=\"Pr\" mass=\"140.91\" name=\"ionslm_126_opc-Pr3+\"/>\n+ <Type class=\"ionslm_126_opc-Nd3+\" element=\"Nd\" mass=\"144.24\" name=\"ionslm_126_opc-Nd3+\"/>\n+ <Type class=\"ionslm_126_opc-Sm3+\" element=\"Sm\" mass=\"150.36\" name=\"ionslm_126_opc-Sm3+\"/>\n+ <Type class=\"ionslm_126_opc-Eu3+\" element=\"Eu\" mass=\"151.96\" name=\"ionslm_126_opc-Eu3+\"/>\n+ <Type class=\"ionslm_126_opc-Gd3+\" element=\"Gd\" mass=\"157.25\" name=\"ionslm_126_opc-Gd3+\"/>\n+ <Type class=\"ionslm_126_opc-Tb3+\" element=\"Tb\" mass=\"158.93\" name=\"ionslm_126_opc-Tb3+\"/>\n+ <Type class=\"ionslm_126_opc-Dy3+\" element=\"Dy\" mass=\"162.5\" name=\"ionslm_126_opc-Dy3+\"/>\n+ <Type class=\"ionslm_126_opc-Er3+\" element=\"Er\" mass=\"167.26\" name=\"ionslm_126_opc-Er3+\"/>\n+ <Type class=\"ionslm_126_opc-Tm3+\" element=\"Tm\" mass=\"168.93\" name=\"ionslm_126_opc-Tm3+\"/>\n+ <Type class=\"ionslm_126_opc-Lu3+\" element=\"Lu\" mass=\"174.97\" name=\"ionslm_126_opc-Lu3+\"/>\n+ <Type class=\"ionslm_126_opc-Hf4+\" element=\"Hf\" mass=\"178.49\" name=\"ionslm_126_opc-Hf4+\"/>\n+ <Type class=\"ionslm_126_opc-Zr4+\" element=\"Zr\" mass=\"91.22\" name=\"ionslm_126_opc-Zr4+\"/>\n+ <Type class=\"ionslm_126_opc-Ce4+\" element=\"Ce\" mass=\"140.12\" name=\"ionslm_126_opc-Ce4+\"/>\n+ <Type class=\"ionslm_126_opc-U4+\" element=\"U\" mass=\"238.03\" name=\"ionslm_126_opc-U4+\"/>\n+ <Type class=\"ionslm_126_opc-Pu4+\" element=\"Pu\" mass=\"244.06\" name=\"ionslm_126_opc-Pu4+\"/>\n+ <Type class=\"ionslm_126_opc-Th4+\" element=\"Th\" mass=\"232.04\" name=\"ionslm_126_opc-Th4+\"/>\n+ </AtomTypes>\n+ <Residues>\n+ <Residue name=\"HOH\">\n+ <Atom name=\"O\" type=\"opc-O\" charge=\"0\"/>\n+ <Atom name=\"H1\" type=\"opc-H\" charge=\"0.679142\"/>\n+ <Atom name=\"H2\" type=\"opc-H\" charge=\"0.679142\"/>\n+ <Atom name=\"M\" type=\"opc-M\" charge=\"-1.358284\"/>\n+ <!-- weight2 = 0.15939833/(2*(cos(angle/2) * 0.87243313)) -->\n+ <VirtualSite type=\"average3\" index=\"3\" atom1=\"0\" atom2=\"1\" atom3=\"2\" weight1=\"0.7045587810585758\" weight2=\"0.1477206094707121\" weight3=\"0.1477206094707121\"/>\n+ <Bond from=\"0\" to=\"1\"/>\n+ <Bond from=\"0\" to=\"2\"/>\n+ </Residue>\n+ <Residue name=\"AG1\">\n+ <Atom charge=\"1.0\" name=\"AG1\" type=\"ionslm_126_opc-Ag+\"/>\n+ </Residue>\n+ <Residue name=\"Ag\">\n+ <Atom charge=\"2.0\" name=\"Ag\" type=\"ionslm_126_opc-Ag2+\"/>\n+ </Residue>\n+ <Residue name=\"AL\">\n+ <Atom charge=\"3.0\" name=\"AL\" type=\"ionslm_126_opc-Al3+\"/>\n+ </Residue>\n+ <Residue name=\"BA\">\n+ <Atom charge=\"2.0\" name=\"BA\" type=\"ionslm_126_opc-Ba2+\"/>\n+ </Residue>\n+ <Residue name=\"Be\">\n+ <Atom charge=\"2.0\" name=\"Be\" type=\"ionslm_126_opc-Be2+\"/>\n+ </Residue>\n+ <Residue name=\"BR\">\n+ <Atom charge=\"-1.0\" name=\"BR\" type=\"ionslm_126_opc-Br-\"/>\n+ </Residue>\n+ <Residue name=\"CA\">\n+ <Atom charge=\"2.0\" name=\"CA\" type=\"ionslm_126_opc-Ca2+\"/>\n+ </Residue>\n+ <Residue name=\"CD\">\n+ <Atom charge=\"2.0\" name=\"CD\" type=\"ionslm_126_opc-Cd2+\"/>\n+ </Residue>\n+ <Residue name=\"CE\">\n+ <Atom charge=\"3.0\" name=\"CE\" type=\"ionslm_126_opc-Ce3+\"/>\n+ </Residue>\n+ <Residue name=\"Ce\">\n+ <Atom charge=\"4.0\" name=\"Ce\" type=\"ionslm_126_opc-Ce4+\"/>\n+ </Residue>\n+ <Residue name=\"CL\">\n+ <Atom charge=\"-1.0\" name=\"CL\" type=\"ionslm_126_opc-Cl-\"/>\n+ </Residue>\n+ <Residue name=\"CO\">\n+ <Atom charge=\"2.0\" name=\"CO\" type=\"ionslm_126_opc-Co2+\"/>\n+ </Residue>\n+ <Residue name=\"Cr\">\n+ <Atom charge=\"2.0\" name=\"Cr\" type=\"ionslm_126_opc-Cr2+\"/>\n+ </Residue>\n+ <Residue name=\"CR\">\n+ <Atom charge=\"3.0\" name=\"CR\" type=\"ionslm_126_opc-Cr3+\"/>\n+ </Residue>\n+ <Residue name=\"CS\">\n+ <Atom charge=\"1.0\" name=\"CS\" type=\"ionslm_126_opc-Cs+\"/>\n+ </Residue>\n+ <Residue name=\"CU1\">\n+ <Atom charge=\"1.0\" name=\"CU1\" type=\"ionslm_126_opc-Cu+\"/>\n+ </Residue>\n+ <Residue name=\"CU\">\n+ <Atom charge=\"2.0\" name=\"CU\" type=\"ionslm_126_opc-Cu2+\"/>\n+ </Residue>\n+ <Residue name=\"Dy\">\n+ <Atom charge=\"3.0\" name=\"Dy\" type=\"ionslm_126_opc-Dy3+\"/>\n+ </Residue>\n+ <Residue name=\"Er\">\n+ <Atom charge=\"3.0\" name=\"Er\" type=\"ionslm_126_opc-Er3+\"/>\n+ </Residue>\n+ <Residue name=\"EU\">\n+ <Atom charge=\"2.0\" name=\"EU\" type=\"ionslm_126_opc-Eu2+\"/>\n+ </Residue>\n+ <Residue name=\"EU3\">\n+ <Atom charge=\"3.0\" name=\"EU3\" type=\"ionslm_126_opc-Eu3+\"/>\n+ </Residue>\n+ <Residue name=\"F\">\n+ <Atom charge=\"-1.0\" name=\"F\" type=\"ionslm_126_opc-F-\"/>\n+ </Residue>\n+ <Residue name=\"FE2\">\n+ <Atom charge=\"2.0\" name=\"FE2\" type=\"ionslm_126_opc-Fe2+\"/>\n+ </Residue>\n+ <Residue name=\"FE\">\n+ <Atom charge=\"3.0\" name=\"FE\" type=\"ionslm_126_opc-Fe3+\"/>\n+ </Residue>\n+ <Residue name=\"GD3\">\n+ <Atom charge=\"3.0\" name=\"GD\" type=\"ionslm_126_opc-Gd3+\"/>\n+ </Residue>\n+ <Residue name=\"Hf\">\n+ <Atom charge=\"4.0\" name=\"Hf\" type=\"ionslm_126_opc-Hf4+\"/>\n+ </Residue>\n+ <Residue name=\"HG\">\n+ <Atom charge=\"2.0\" name=\"HG\" type=\"ionslm_126_opc-Hg2+\"/>\n+ </Residue>\n+ <Residue name=\"IOD\">\n+ <Atom charge=\"-1.0\" name=\"I\" type=\"ionslm_126_opc-I-\"/>\n+ </Residue>\n+ <Residue name=\"IN\">\n+ <Atom charge=\"3.0\" name=\"IN\" type=\"ionslm_126_opc-In3+\"/>\n+ </Residue>\n+ <Residue name=\"K\">\n+ <Atom charge=\"1.0\" name=\"K\" type=\"ionslm_126_opc-K+\"/>\n+ </Residue>\n+ <Residue name=\"LA\">\n+ <Atom charge=\"3.0\" name=\"LA\" type=\"ionslm_126_opc-La3+\"/>\n+ </Residue>\n+ <Residue name=\"LI\">\n+ <Atom charge=\"1.0\" name=\"LI\" type=\"ionslm_126_opc-Li+\"/>\n+ </Residue>\n+ <Residue name=\"LU\">\n+ <Atom charge=\"3.0\" name=\"LU\" type=\"ionslm_126_opc-Lu3+\"/>\n+ </Residue>\n+ <Residue name=\"MG\">\n+ <Atom charge=\"2.0\" name=\"MG\" type=\"ionslm_126_opc-Mg2+\"/>\n+ </Residue>\n+ <Residue name=\"MN\">\n+ <Atom charge=\"2.0\" name=\"MN\" type=\"ionslm_126_opc-Mn2+\"/>\n+ </Residue>\n+ <Residue name=\"NA\">\n+ <Atom charge=\"1.0\" name=\"NA\" type=\"ionslm_126_opc-Na+\"/>\n+ </Residue>\n+ <Residue name=\"Nd\">\n+ <Atom charge=\"3.0\" name=\"Nd\" type=\"ionslm_126_opc-Nd3+\"/>\n+ </Residue>\n+ <Residue name=\"NI\">\n+ <Atom charge=\"2.0\" name=\"NI\" type=\"ionslm_126_opc-Ni2+\"/>\n+ </Residue>\n+ <Residue name=\"PB\">\n+ <Atom charge=\"2.0\" name=\"PB\" type=\"ionslm_126_opc-Pb2+\"/>\n+ </Residue>\n+ <Residue name=\"PD\">\n+ <Atom charge=\"2.0\" name=\"PD\" type=\"ionslm_126_opc-Pd2+\"/>\n+ </Residue>\n+ <Residue name=\"PR\">\n+ <Atom charge=\"3.0\" name=\"PR\" type=\"ionslm_126_opc-Pr3+\"/>\n+ </Residue>\n+ <Residue name=\"PT\">\n+ <Atom charge=\"2.0\" name=\"PT\" type=\"ionslm_126_opc-Pt2+\"/>\n+ </Residue>\n+ <Residue name=\"Pu\">\n+ <Atom charge=\"4.0\" name=\"Pu\" type=\"ionslm_126_opc-Pu4+\"/>\n+ </Residue>\n+ <Residue name=\"Ra\">\n+ <Atom charge=\"2.0\" name=\"Ra\" type=\"ionslm_126_opc-Ra2+\"/>\n+ </Residue>\n+ <Residue name=\"RB\">\n+ <Atom charge=\"1.0\" name=\"RB\" type=\"ionslm_126_opc-Rb+\"/>\n+ </Residue>\n+ <Residue name=\"Sm\">\n+ <Atom charge=\"2.0\" name=\"Sm\" type=\"ionslm_126_opc-Sm2+\"/>\n+ </Residue>\n+ <Residue name=\"SM\">\n+ <Atom charge=\"3.0\" name=\"SM\" type=\"ionslm_126_opc-Sm3+\"/>\n+ </Residue>\n+ <Residue name=\"Sn\">\n+ <Atom charge=\"2.0\" name=\"Sn\" type=\"ionslm_126_opc-Sn2+\"/>\n+ </Residue>\n+ <Residue name=\"SR\">\n+ <Atom charge=\"2.0\" name=\"SR\" type=\"ionslm_126_opc-Sr2+\"/>\n+ </Residue>\n+ <Residue name=\"TB\">\n+ <Atom charge=\"3.0\" name=\"TB\" type=\"ionslm_126_opc-Tb3+\"/>\n+ </Residue>\n+ <Residue name=\"Th\">\n+ <Atom charge=\"4.0\" name=\"Th\" type=\"ionslm_126_opc-Th4+\"/>\n+ </Residue>\n+ <Residue name=\"TL1\">\n+ <Atom charge=\"1.0\" name=\"TL1\" type=\"ionslm_126_opc-Tl+\"/>\n+ </Residue>\n+ <Residue name=\"Tl\">\n+ <Atom charge=\"3.0\" name=\"Tl\" type=\"ionslm_126_opc-Tl3+\"/>\n+ </Residue>\n+ <Residue name=\"Tm\">\n+ <Atom charge=\"3.0\" name=\"Tm\" type=\"ionslm_126_opc-Tm3+\"/>\n+ </Residue>\n+ <Residue name=\"U4+\">\n+ <Atom charge=\"4.0\" name=\"U\" type=\"ionslm_126_opc-U4+\"/>\n+ </Residue>\n+ <Residue name=\"V2+\">\n+ <Atom charge=\"2.0\" name=\"V2+\" type=\"ionslm_126_opc-V2+\"/>\n+ </Residue>\n+ <Residue name=\"Y\">\n+ <Atom charge=\"3.0\" name=\"Y\" type=\"ionslm_126_opc-Y3+\"/>\n+ </Residue>\n+ <Residue name=\"YB2\">\n+ <Atom charge=\"2.0\" name=\"YB2\" type=\"ionslm_126_opc-Yb2+\"/>\n+ </Residue>\n+ <Residue name=\"ZN\">\n+ <Atom charge=\"2.0\" name=\"ZN\" type=\"ionslm_126_opc-Zn2+\"/>\n+ </Residue>\n+ <Residue name=\"Zr\">\n+ <Atom charge=\"4.0\" name=\"Zr\" type=\"ionslm_126_opc-Zr4+\"/>\n+ </Residue>\n+ </Residues>\n+ <HarmonicBondForce>\n+ <Bond class1=\"OW\" class2=\"HW\" length=\"0.087243313\" k=\"502416.0\"/>\n+ </HarmonicBondForce>\n+ <HarmonicAngleForce>\n+ <!-- angle = arccos(1 - (1.37120510**2 / (2*0.87243313**2))) -->\n+ <Angle class1=\"HW\" class2=\"OW\" class3=\"HW\" angle=\"1.8081424254418306\" k=\"628.02\"/>\n+ </HarmonicAngleForce>\n+ <NonbondedForce coulomb14scale=\"0.833333\" lj14scale=\"0.5\">\n+ <UseAttributeFromResidue name=\"charge\"/>\n+ <!-- sigma = (1.777167268 * 2 / (2**(1/6)))*unit.angstrom/unit.nanometer -->\n+ <!-- epsilon = (0.2128008130*unit.kilocalorie)/(unit.kilojoule) -->\n+ <Atom type=\"opc-O\" sigma=\"0.3166552081964338\" epsilon=\"0.8903586015920001\"/>\n+ <Atom type=\"opc-H\" sigma=\"0.08908987181403394\" epsilon=\"0\"/>\n+ <Atom type=\"opc-M\" sigma=\"0.08908987181403394\" epsilon=\"0\"/>\n+ <Atom epsilon=\"0.009039866720000001\" sigma=\"0.2212992415860603\" type=\"ionslm_126_opc-Li+\"/><!-- HFE set for the OPC water model from Sengupta et al., JCIM, 2021, 61, 869 -->\n+ <Atom epsilon=\"0.12386075112\" sigma=\"0.2613896839023756\" type=\"ionslm_126_opc-Na+\"/><!-- HFE set for the OPC water model from Sengupta et al., JCIM, 2021, 61, 869 -->\n+ <Atom epsilon=\"0.58382766144\" sigma=\"0.3032619236549715\" type=\"ionslm_126_opc-K+\"/><!-- HFE set for the OPC water model from Sengupta et al., JCIM, 2021, 61, 869 -->\n+ <Atom epsilon=\"0.9537620464000001\" sigma=\"0.3239307739158274\" type=\"ionslm_126_opc-Rb+\"/><!-- HFE set for the OPC water model from Sengupta et al., JCIM, 2021, 61, 869 -->\n+ <Atom epsilon=\"1.47731805816\" sigma=\"0.349232297511013\" type=\"ionslm_126_opc-Cs+\"/><!-- HFE set for the OPC water model from Sengupta et al., JCIM, 2021, 61, 869 -->\n+ <Atom epsilon=\"0.47070573208000005\" sigma=\"0.29577837442259264\" type=\"ionslm_126_opc-Tl+\"/><!-- HFE set for the OPC water model from Sengupta et al., JCIM, 2021, 61, 869 -->\n+ <Atom epsilon=\"0.0032724319200000004\" sigma=\"0.21025209748112006\" type=\"ionslm_126_opc-Cu+\"/><!-- HFE set for the OPC water model from Sengupta et al., JCIM, 2021, 61, 869 -->\n+ <Atom epsilon=\"0.025210566480000002\" sigma=\"0.23448454261453733\" type=\"ionslm_126_opc-Ag+\"/><!-- HFE set for the OPC water model from Sengupta et al., JCIM, 2021, 61, 869 -->\n+ <Atom epsilon=\"1.0313754556\" sigma=\"0.3278507282756449\" type=\"ionslm_126_opc-F-\"/><!-- HFE set for the OPC water model from Sengupta et al., JCIM, 2021, 61, 869 -->\n+ <Atom epsilon=\"2.8400519208\" sigma=\"0.4205041949622401\" type=\"ionslm_126_opc-Cl-\"/><!-- HFE set for the OPC water model from Sengupta et al., JCIM, 2021, 61, 869 -->\n+ <Atom epsilon=\"3.17863094952\" sigma=\"0.4452711793265416\" type=\"ionslm_126_opc-Br-\"/><!-- HFE set for the OPC water model from Sengupta et al., JCIM, 2021, 61, 869 -->\n+ <Atom epsilon=\"3.77817463544\" sigma=\"0.5167212565213968\" type=\"ionslm_126_opc-I-\"/><!-- HFE set for the OPC water model from Sengupta et al., JCIM, 2021, 61, 869 -->\n+ <Atom epsilon=\"5.35552e-06\" sigma=\"0.16410354388145051\" type=\"ionslm_126_opc-Be2+\"/><!-- CM set for the OPC water model from Li et al., JCTC, 2020, 16, 4429 -->\n+ <Atom epsilon=\"0.0031585016\" sigma=\"0.20989573799386393\" type=\"ionslm_126_opc-Cu2+\"/><!-- CM set for the OPC water model from Li et al., JCTC, 2020, 16, 4429 -->\n+ <Atom epsilon=\"0.00439211216\" sigma=\"0.21328115312279727\" type=\"ionslm_126_opc-Ni2+\"/><!-- CM set for the OPC water model from Li et al., JCTC, 2020, 16, 4429 -->\n+ <Atom epsilon=\"0.00631378152\" sigma=\"0.21720110748261476\" type=\"ionslm_126_opc-Pt2+\"/><!-- CM set for the OPC water model from Li et al., JCTC, 2020, 16, 4429 -->\n+ <Atom epsilon=\"0.00631378152\" sigma=\"0.21720110748261476\" type=\"ionslm_126_opc-Zn2+\"/><!-- CM set for the OPC water model from Li et al., JCTC, 2020, 16, 4429 -->\n+ <Atom epsilon=\"0.012329536720000001\" sigma=\"0.2250410162022497\" type=\"ionslm_126_opc-Co2+\"/><!-- CM set for the OPC water model from Li et al., JCTC, 2020, 16, 4429 -->\n+ <Atom epsilon=\"0.013433485120000001\" sigma=\"0.2261100946640181\" type=\"ionslm_126_opc-Pd2+\"/><!-- CM set for the OPC water model from Li et al., JCTC, 2020, 16, 4429 -->\n+ <Atom epsilon=\"0.0218984284\" sigma=\"0.23252456543462854\" type=\"ionslm_126_opc-Ag2+\"/><!-- CM set for the OPC water model from Li et al., JCTC, 2020, 16, 4429 -->\n+ <Atom epsilon=\"0.025210566480000002\" sigma=\"0.23448454261453733\" type=\"ionslm_126_opc-Cr2+\"/><!-- CM set for the OPC water model from Li et al., JCTC, 2020, 16, 4429 -->\n+ <Atom epsilon=\"0.027520218160000002\" sigma=\"0.23573180081993375\" type=\"ionslm_126_opc-Fe2+\"/><!-- CM set for the OPC water model from Li et al., JCTC, 2020, 16, 4429 -->\n+ <Atom epsilon=\"0.0299963512\" sigma=\"0.23697905902533029\" type=\"ionslm_126_opc-Mg2+\"/><!-- CM set for the OPC water model from Li et al., JCTC, 2020, 16, 4429 -->\n+ <Atom epsilon=\"0.03148911872\" sigma=\"0.23769177799984254\" type=\"ionslm_126_opc-V2+\"/><!-- CM set for the OPC water model from Li et al., JCTC, 2020, 16, 4429 -->\n+ <Atom epsilon=\"0.053825486400000004\" sigma=\"0.2460662259503617\" type=\"ionslm_126_opc-Mn2+\"/><!-- CM set for the OPC water model from Li et al., JCTC, 2020, 16, 4429 -->\n+ <Atom epsilon=\"0.053825486400000004\" sigma=\"0.2460662259503617\" type=\"ionslm_126_opc-Hg2+\"/><!-- CM set for the OPC water model from Li et al., JCTC, 2020, 16, 4429 -->\n+ <Atom epsilon=\"0.05861307024\" sigma=\"0.24749166389938626\" type=\"ionslm_126_opc-Cd2+\"/><!-- CM set for the OPC water model from Li et al., JCTC, 2020, 16, 4429 -->\n+ <Atom epsilon=\"0.33615222504000003\" sigma=\"0.2854439492921647\" type=\"ionslm_126_opc-Yb2+\"/><!-- CM set for the OPC water model from Li et al., JCTC, 2020, 16, 4429 -->\n+ <Atom epsilon=\"0.34886028824000004\" sigma=\"0.2865130277539331\" type=\"ionslm_126_opc-Ca2+\"/><!-- CM set for the OPC water model from Li et al., JCTC, 2020, 16, 4429 -->\n+ <Atom epsilon=\"0.38639884336\" sigma=\"0.2895420833956103\" type=\"ionslm_126_opc-Sn2+\"/><!-- CM set for the OPC water model from Li et al., JCTC, 2020, 16, 4429 -->\n+ <Atom epsilon=\"0.59811815528\" sigma=\"0.30415282237311186\" type=\"ionslm_126_opc-Pb2+\"/><!-- CM set for the OPC water model from Li et al., JCTC, 2020, 16, 4429 -->\n+ <Atom epsilon=\"0.73715046696\" sigma=\"0.312349090580003\" type=\"ionslm_126_opc-Eu2+\"/><!-- CM set for the OPC water model from Li et al., JCTC, 2020, 16, 4429 -->\n+ <Atom epsilon=\"0.77874118424\" sigma=\"0.31466542724716784\" type=\"ionslm_126_opc-Sr2+\"/><!-- CM set for the OPC water model from Li et al., JCTC, 2020, 16, 4429 -->\n+ <Atom epsilon=\"0.77874118424\" sigma=\"0.31466542724716784\" type=\"ionslm_126_opc-Sm2+\"/><!-- CM set for the OPC water model from Li et al., JCTC, 2020, 16, 4429 -->\n+ <Atom epsilon=\"1.47731805816\" sigma=\"0.349232297511013\" type=\"ionslm_126_opc-Ba2+\"/><!-- CM set for the OPC water model from Li et al., JCTC, 2020, 16, 4429 -->\n+ <Atom epsilon=\"1.47731805816\" sigma=\"0.349232297511013\" type=\"ionslm_126_opc-Ra2+\"/><!-- CM set for the OPC water model from Li et al., JCTC, 2020, 16, 4429 -->\n+ <Atom epsilon=\"0.010193772080000002\" sigma=\"0.22272467953508485\" type=\"ionslm_126_opc-Al3+\"/><!-- IOD set for the OPC water model from Li et al., JCTC, 2021, 17, 2342 -->\n+ <Atom epsilon=\"0.06572013816000001\" sigma=\"0.249451641079295\" type=\"ionslm_126_opc-Fe3+\"/><!-- IOD set for the OPC water model from Li et al., JCTC, 2021, 17, 2342 -->\n+ <Atom epsilon=\"0.032257342960000004\" sigma=\"0.2380481374870987\" type=\"ionslm_126_opc-Cr3+\"/><!-- IOD set for the OPC water model from Li et al., JCTC, 2021, 17, 2342 -->\n+ <Atom epsilon=\"0.09715545064\" sigma=\"0.2565788308244177\" type=\"ionslm_126_opc-In3+\"/><!-- IOD set for the OPC water model from Li et al., JCTC, 2021, 17, 2342 -->\n+ <Atom epsilon=\"0.14196839183999999\" sigma=\"0.26424055980042466\" type=\"ionslm_126_opc-Tl3+\"/><!-- IOD set for the OPC water model from Li et al., JCTC, 2021, 17, 2342 -->\n+ <Atom epsilon=\"0.28247819944\" sigma=\"0.2806330962142069\" type=\"ionslm_126_opc-Y3+\"/><!-- IOD set for the OPC water model from Li et al., JCTC, 2021, 17, 2342 -->\n+ <Atom epsilon=\"0.5781589690400001\" sigma=\"0.30290556416771536\" type=\"ionslm_126_opc-La3+\"/><!-- IOD set for the OPC water model from Li et al., JCTC, 2021, 17, 2342 -->\n+ <Atom epsilon=\"0.65093680392\" sigma=\"0.30736005775841707\" type=\"ionslm_126_opc-Ce3+\"/><!-- IOD set for the OPC water model from Li et al., JCTC, 2021, 17, 2342 -->\n+ <Atom epsilon=\"0.62720034432\" sigma=\"0.30593461980939257\" type=\"ionslm_126_opc-Pr3+\"/><!-- IOD set for the OPC water model from Li et al., JCTC, 2021, 17, 2342 -->\n+ <Atom epsilon=\"0.47580293192\" sigma=\"0.29613473390984874\" type=\"ionslm_126_opc-Nd3+\"/><!-- IOD set for the OPC water model from Li et al., JCTC, 2021, 17, 2342 -->\n+ <Atom epsilon=\"0.41662062848000003\" sigma=\"0.2918584200627751\" type=\"ionslm_126_opc-Sm3+\"/><!-- IOD set for the OPC water model from Li et al., JCTC, 2021, 17, 2342 -->\n+ <Atom epsilon=\"0.43586389048\" sigma=\"0.2932838580117997\" type=\"ionslm_126_opc-Eu3+\"/><!-- IOD set for the OPC water model from Li et al., JCTC, 2021, 17, 2342 -->\n+ <Atom epsilon=\"0.33197918711999996\" sigma=\"0.2850875898049086\" type=\"ionslm_126_opc-Gd3+\"/><!-- IOD set for the OPC water model from Li et al., JCTC, 2021, 17, 2342 -->\n+ <Atom epsilon=\"0.34886028824000004\" sigma=\"0.2865130277539331\" type=\"ionslm_126_opc-Tb3+\"/><!-- IOD set for the OPC water model from Li et al., JCTC, 2021, 17, 2342 -->\n+ <Atom epsilon=\"0.29778189072\" sigma=\"0.2820585341632314\" type=\"ionslm_126_opc-Dy3+\"/><!-- IOD set for the OPC water model from Li et al., JCTC, 2021, 17, 2342 -->\n+ <Atom epsilon=\"0.28247819944\" sigma=\"0.2806330962142069\" type=\"ionslm_126_opc-Er3+\"/><!-- IOD set for the OPC water model from Li et al., JCTC, 2021, 17, 2342 -->\n+ <Atom epsilon=\"0.28247819944\" sigma=\"0.2806330962142069\" type=\"ionslm_126_opc-Tm3+\"/><!-- IOD set for the OPC water model from Li et al., JCTC, 2021, 17, 2342 -->\n+ <Atom epsilon=\"0.25163082264000003\" sigma=\"0.27760404057252974\" type=\"ionslm_126_opc-Lu3+\"/><!-- IOD set for the OPC water model from Li et al., JCTC, 2021, 17, 2342 -->\n+ <Atom epsilon=\"0.11751709584\" sigma=\"0.26032060544060714\" type=\"ionslm_126_opc-Hf4+\"/><!-- IOD set for the OPC water model from Li et al., JCTC, 2021, 17, 2342 -->\n+ <Atom epsilon=\"0.14799067408\" sigma=\"0.265131458518565\" type=\"ionslm_126_opc-Zr4+\"/><!-- IOD set for the OPC water model from Li et al., JCTC, 2021, 17, 2342 -->\n+ <Atom epsilon=\"0.5310938643199999\" sigma=\"0.2998765085260382\" type=\"ionslm_126_opc-Ce4+\"/><!-- IOD set for the OPC water model from Li et al., JCTC, 2021, 17, 2342 -->\n+ <Atom epsilon=\"0.5310938643199999\" sigma=\"0.2998765085260382\" type=\"ionslm_126_opc-U4+\"/><!-- IOD set for the OPC water model from Li et al., JCTC, 2021, 17, 2342 -->\n+ <Atom epsilon=\"0.46563832232\" sigma=\"0.29542201493533654\" type=\"ionslm_126_opc-Pu4+\"/><!-- IOD set for the OPC water model from Li et al., JCTC, 2021, 17, 2342 -->\n+ <Atom epsilon=\"0.58952354984\" sigma=\"0.3036182831422276\" type=\"ionslm_126_opc-Th4+\"/><!-- IOD set for the OPC water model from Li et al., JCTC, 2021, 17, 2342 -->\n+ </NonbondedForce>\n+</ForceField>\ndiff --git a/wrappers/python/openmm/app/data/amber14/opc3.xml b/wrappers/python/openmm/app/data/amber14/opc3.xml\nnew file mode 100644\nindex 0000000000..a13af34ed4\n--- /dev/null\n+++ b/wrappers/python/openmm/app/data/amber14/opc3.xml\n@@ -0,0 +1,337 @@\n+<ForceField>\n+ <Info>\n+ <DateGenerated>2022-06-21</DateGenerated>\n+ <Reference>Izadi S, Onufriev AV. Accuracy limit of rigid 3-point water models. The Journal of Chemical Physics 145, 074501 (2016); DOI:10.1063/1.4960175</Reference>\n+ <!-- Li/Merz ion parameters of atomic ions for the OPC3 water model (12-6 set) -->\n+ <DateGenerated>2022-09-28T04:59:42.433215</DateGenerated>\n+ <Source Source=\"parm/frcmod.ionslm_126_opc3\" md5hash=\"5764d233aceb45e3c28df84ac16d1085\" sourcePackage=\"AmberTools\" sourcePackageVersion=\"22.0-py38h6177452_1\">parm/frcmod.ionslm_126_opc3</Source>\n+ <Source Source=\"lib/atomic_ions.lib\" md5hash=\"e900cee0c71ec2795d25b3555de486e1\" sourcePackage=\"AmberTools\" sourcePackageVersion=\"22.0-py38h6177452_1\">lib/atomic_ions.lib</Source>\n+ </Info>\n+ <AtomTypes>\n+ <Type name=\"opc3-O\" class=\"OW\" element=\"O\" mass=\"16.00000\"/>\n+ <Type name=\"opc3-H\" class=\"HW\" element=\"H\" mass=\"1.00800\"/>\n+ <Type class=\"ionslm_126_opc3-Li+\" element=\"Li\" mass=\"6.94\" name=\"ionslm_126_opc3-Li+\"/>\n+ <Type class=\"ionslm_126_opc3-Na+\" element=\"Na\" mass=\"22.99\" name=\"ionslm_126_opc3-Na+\"/>\n+ <Type class=\"ionslm_126_opc3-K+\" element=\"K\" mass=\"39.10\" name=\"ionslm_126_opc3-K+\"/>\n+ <Type class=\"ionslm_126_opc3-Rb+\" element=\"Rb\" mass=\"85.47\" name=\"ionslm_126_opc3-Rb+\"/>\n+ <Type class=\"ionslm_126_opc3-Cs+\" element=\"Cs\" mass=\"132.91\" name=\"ionslm_126_opc3-Cs+\"/>\n+ <Type class=\"ionslm_126_opc3-Tl+\" element=\"Tl\" mass=\"204.38\" name=\"ionslm_126_opc3-Tl+\"/>\n+ <Type class=\"ionslm_126_opc3-Cu+\" element=\"Cu\" mass=\"63.55\" name=\"ionslm_126_opc3-Cu+\"/>\n+ <Type class=\"ionslm_126_opc3-Ag+\" element=\"Ag\" mass=\"107.87\" name=\"ionslm_126_opc3-Ag+\"/>\n+ <Type class=\"ionslm_126_opc3-F-\" element=\"F\" mass=\"19.00\" name=\"ionslm_126_opc3-F-\"/>\n+ <Type class=\"ionslm_126_opc3-Cl-\" element=\"Cl\" mass=\"35.45\" name=\"ionslm_126_opc3-Cl-\"/>\n+ <Type class=\"ionslm_126_opc3-Br-\" element=\"Br\" mass=\"79.90\" name=\"ionslm_126_opc3-Br-\"/>\n+ <Type class=\"ionslm_126_opc3-I-\" element=\"I\" mass=\"126.9\" name=\"ionslm_126_opc3-I-\"/>\n+ <Type class=\"ionslm_126_opc3-Be2+\" element=\"Be\" mass=\"9.01\" name=\"ionslm_126_opc3-Be2+\"/>\n+ <Type class=\"ionslm_126_opc3-Cu2+\" element=\"Cu\" mass=\"63.55\" name=\"ionslm_126_opc3-Cu2+\"/>\n+ <Type class=\"ionslm_126_opc3-Ni2+\" element=\"Ni\" mass=\"58.69\" name=\"ionslm_126_opc3-Ni2+\"/>\n+ <Type class=\"ionslm_126_opc3-Pt2+\" element=\"Pt\" mass=\"195.08\" name=\"ionslm_126_opc3-Pt2+\"/>\n+ <Type class=\"ionslm_126_opc3-Zn2+\" element=\"Zn\" mass=\"65.4\" name=\"ionslm_126_opc3-Zn2+\"/>\n+ <Type class=\"ionslm_126_opc3-Co2+\" element=\"Co\" mass=\"58.93\" name=\"ionslm_126_opc3-Co2+\"/>\n+ <Type class=\"ionslm_126_opc3-Pd2+\" element=\"Pd\" mass=\"106.42\" name=\"ionslm_126_opc3-Pd2+\"/>\n+ <Type class=\"ionslm_126_opc3-Ag2+\" element=\"Ag\" mass=\"107.87\" name=\"ionslm_126_opc3-Ag2+\"/>\n+ <Type class=\"ionslm_126_opc3-Cr2+\" element=\"Cr\" mass=\"52.00\" name=\"ionslm_126_opc3-Cr2+\"/>\n+ <Type class=\"ionslm_126_opc3-Fe2+\" element=\"Fe\" mass=\"55.85\" name=\"ionslm_126_opc3-Fe2+\"/>\n+ <Type class=\"ionslm_126_opc3-Mg2+\" element=\"Mg\" mass=\"24.305\" name=\"ionslm_126_opc3-Mg2+\"/>\n+ <Type class=\"ionslm_126_opc3-V2+\" element=\"V\" mass=\"50.94\" name=\"ionslm_126_opc3-V2+\"/>\n+ <Type class=\"ionslm_126_opc3-Mn2+\" element=\"Mn\" mass=\"54.94\" name=\"ionslm_126_opc3-Mn2+\"/>\n+ <Type class=\"ionslm_126_opc3-Hg2+\" element=\"Hg\" mass=\"200.59\" name=\"ionslm_126_opc3-Hg2+\"/>\n+ <Type class=\"ionslm_126_opc3-Cd2+\" element=\"Cd\" mass=\"112.41\" name=\"ionslm_126_opc3-Cd2+\"/>\n+ <Type class=\"ionslm_126_opc3-Yb2+\" element=\"Yb\" mass=\"173.05\" name=\"ionslm_126_opc3-Yb2+\"/>\n+ <Type class=\"ionslm_126_opc3-Ca2+\" element=\"Ca\" mass=\"40.08\" name=\"ionslm_126_opc3-Ca2+\"/>\n+ <Type class=\"ionslm_126_opc3-Sn2+\" element=\"Sn\" mass=\"118.71\" name=\"ionslm_126_opc3-Sn2+\"/>\n+ <Type class=\"ionslm_126_opc3-Pb2+\" element=\"Pb\" mass=\"207.2\" name=\"ionslm_126_opc3-Pb2+\"/>\n+ <Type class=\"ionslm_126_opc3-Eu2+\" element=\"Eu\" mass=\"151.96\" name=\"ionslm_126_opc3-Eu2+\"/>\n+ <Type class=\"ionslm_126_opc3-Sr2+\" element=\"Sr\" mass=\"87.62\" name=\"ionslm_126_opc3-Sr2+\"/>\n+ <Type class=\"ionslm_126_opc3-Sm2+\" element=\"Sm\" mass=\"150.36\" name=\"ionslm_126_opc3-Sm2+\"/>\n+ <Type class=\"ionslm_126_opc3-Ba2+\" element=\"Ba\" mass=\"137.33\" name=\"ionslm_126_opc3-Ba2+\"/>\n+ <Type class=\"ionslm_126_opc3-Ra2+\" element=\"Ra\" mass=\"226.03\" name=\"ionslm_126_opc3-Ra2+\"/>\n+ <Type class=\"ionslm_126_opc3-Al3+\" element=\"Al\" mass=\"26.98\" name=\"ionslm_126_opc3-Al3+\"/>\n+ <Type class=\"ionslm_126_opc3-Fe3+\" element=\"Fe\" mass=\"55.85\" name=\"ionslm_126_opc3-Fe3+\"/>\n+ <Type class=\"ionslm_126_opc3-Cr3+\" element=\"Cr\" mass=\"52.00\" name=\"ionslm_126_opc3-Cr3+\"/>\n+ <Type class=\"ionslm_126_opc3-In3+\" element=\"In\" mass=\"114.82\" name=\"ionslm_126_opc3-In3+\"/>\n+ <Type class=\"ionslm_126_opc3-Tl3+\" element=\"Tl\" mass=\"204.38\" name=\"ionslm_126_opc3-Tl3+\"/>\n+ <Type class=\"ionslm_126_opc3-Y3+\" element=\"Y\" mass=\"88.91\" name=\"ionslm_126_opc3-Y3+\"/>\n+ <Type class=\"ionslm_126_opc3-La3+\" element=\"La\" mass=\"138.91\" name=\"ionslm_126_opc3-La3+\"/>\n+ <Type class=\"ionslm_126_opc3-Ce3+\" element=\"Ce\" mass=\"140.12\" name=\"ionslm_126_opc3-Ce3+\"/>\n+ <Type class=\"ionslm_126_opc3-Pr3+\" element=\"Pr\" mass=\"140.91\" name=\"ionslm_126_opc3-Pr3+\"/>\n+ <Type class=\"ionslm_126_opc3-Nd3+\" element=\"Nd\" mass=\"144.24\" name=\"ionslm_126_opc3-Nd3+\"/>\n+ <Type class=\"ionslm_126_opc3-Sm3+\" element=\"Sm\" mass=\"150.36\" name=\"ionslm_126_opc3-Sm3+\"/>\n+ <Type class=\"ionslm_126_opc3-Eu3+\" element=\"Eu\" mass=\"151.96\" name=\"ionslm_126_opc3-Eu3+\"/>\n+ <Type class=\"ionslm_126_opc3-Gd3+\" element=\"Gd\" mass=\"157.25\" name=\"ionslm_126_opc3-Gd3+\"/>\n+ <Type class=\"ionslm_126_opc3-Tb3+\" element=\"Tb\" mass=\"158.93\" name=\"ionslm_126_opc3-Tb3+\"/>\n+ <Type class=\"ionslm_126_opc3-Dy3+\" element=\"Dy\" mass=\"162.5\" name=\"ionslm_126_opc3-Dy3+\"/>\n+ <Type class=\"ionslm_126_opc3-Er3+\" element=\"Er\" mass=\"167.26\" name=\"ionslm_126_opc3-Er3+\"/>\n+ <Type class=\"ionslm_126_opc3-Tm3+\" element=\"Tm\" mass=\"168.93\" name=\"ionslm_126_opc3-Tm3+\"/>\n+ <Type class=\"ionslm_126_opc3-Lu3+\" element=\"Lu\" mass=\"174.97\" name=\"ionslm_126_opc3-Lu3+\"/>\n+ <Type class=\"ionslm_126_opc3-Hf4+\" element=\"Hf\" mass=\"178.49\" name=\"ionslm_126_opc3-Hf4+\"/>\n+ <Type class=\"ionslm_126_opc3-Zr4+\" element=\"Zr\" mass=\"91.22\" name=\"ionslm_126_opc3-Zr4+\"/>\n+ <Type class=\"ionslm_126_opc3-Ce4+\" element=\"Ce\" mass=\"140.12\" name=\"ionslm_126_opc3-Ce4+\"/>\n+ <Type class=\"ionslm_126_opc3-U4+\" element=\"U\" mass=\"238.03\" name=\"ionslm_126_opc3-U4+\"/>\n+ <Type class=\"ionslm_126_opc3-Pu4+\" element=\"Pu\" mass=\"244.06\" name=\"ionslm_126_opc3-Pu4+\"/>\n+ <Type class=\"ionslm_126_opc3-Th4+\" element=\"Th\" mass=\"232.04\" name=\"ionslm_126_opc3-Th4+\"/>\n+ </AtomTypes>\n+ <Residues>\n+ <Residue name=\"HOH\">\n+ <Atom name=\"O\" type=\"opc3-O\" charge=\"-0.895170\"/>\n+ <Atom name=\"H1\" type=\"opc3-H\" charge=\"0.447585\"/>\n+ <Atom name=\"H2\" type=\"opc3-H\" charge=\"0.447585\"/>\n+ <Bond atomName1=\"O\" atomName2=\"H1\"/>\n+ <Bond atomName1=\"O\" atomName2=\"H2\"/>\n+ </Residue>\n+ <Residue name=\"AG1\">\n+ <Atom charge=\"1.0\" name=\"AG1\" type=\"ionslm_126_opc3-Ag+\"/>\n+ </Residue>\n+ <Residue name=\"Ag\">\n+ <Atom charge=\"2.0\" name=\"Ag\" type=\"ionslm_126_opc3-Ag2+\"/>\n+ </Residue>\n+ <Residue name=\"AL\">\n+ <Atom charge=\"3.0\" name=\"AL\" type=\"ionslm_126_opc3-Al3+\"/>\n+ </Residue>\n+ <Residue name=\"BA\">\n+ <Atom charge=\"2.0\" name=\"BA\" type=\"ionslm_126_opc3-Ba2+\"/>\n+ </Residue>\n+ <Residue name=\"Be\">\n+ <Atom charge=\"2.0\" name=\"Be\" type=\"ionslm_126_opc3-Be2+\"/>\n+ </Residue>\n+ <Residue name=\"BR\">\n+ <Atom charge=\"-1.0\" name=\"BR\" type=\"ionslm_126_opc3-Br-\"/>\n+ </Residue>\n+ <Residue name=\"CA\">\n+ <Atom charge=\"2.0\" name=\"CA\" type=\"ionslm_126_opc3-Ca2+\"/>\n+ </Residue>\n+ <Residue name=\"CD\">\n+ <Atom charge=\"2.0\" name=\"CD\" type=\"ionslm_126_opc3-Cd2+\"/>\n+ </Residue>\n+ <Residue name=\"CE\">\n+ <Atom charge=\"3.0\" name=\"CE\" type=\"ionslm_126_opc3-Ce3+\"/>\n+ </Residue>\n+ <Residue name=\"Ce\">\n+ <Atom charge=\"4.0\" name=\"Ce\" type=\"ionslm_126_opc3-Ce4+\"/>\n+ </Residue>\n+ <Residue name=\"CL\">\n+ <Atom charge=\"-1.0\" name=\"CL\" type=\"ionslm_126_opc3-Cl-\"/>\n+ </Residue>\n+ <Residue name=\"CO\">\n+ <Atom charge=\"2.0\" name=\"CO\" type=\"ionslm_126_opc3-Co2+\"/>\n+ </Residue>\n+ <Residue name=\"Cr\">\n+ <Atom charge=\"2.0\" name=\"Cr\" type=\"ionslm_126_opc3-Cr2+\"/>\n+ </Residue>\n+ <Residue name=\"CR\">\n+ <Atom charge=\"3.0\" name=\"CR\" type=\"ionslm_126_opc3-Cr3+\"/>\n+ </Residue>\n+ <Residue name=\"CS\">\n+ <Atom charge=\"1.0\" name=\"CS\" type=\"ionslm_126_opc3-Cs+\"/>\n+ </Residue>\n+ <Residue name=\"CU1\">\n+ <Atom charge=\"1.0\" name=\"CU1\" type=\"ionslm_126_opc3-Cu+\"/>\n+ </Residue>\n+ <Residue name=\"CU\">\n+ <Atom charge=\"2.0\" name=\"CU\" type=\"ionslm_126_opc3-Cu2+\"/>\n+ </Residue>\n+ <Residue name=\"Dy\">\n+ <Atom charge=\"3.0\" name=\"Dy\" type=\"ionslm_126_opc3-Dy3+\"/>\n+ </Residue>\n+ <Residue name=\"Er\">\n+ <Atom charge=\"3.0\" name=\"Er\" type=\"ionslm_126_opc3-Er3+\"/>\n+ </Residue>\n+ <Residue name=\"EU\">\n+ <Atom charge=\"2.0\" name=\"EU\" type=\"ionslm_126_opc3-Eu2+\"/>\n+ </Residue>\n+ <Residue name=\"EU3\">\n+ <Atom charge=\"3.0\" name=\"EU3\" type=\"ionslm_126_opc3-Eu3+\"/>\n+ </Residue>\n+ <Residue name=\"F\">\n+ <Atom charge=\"-1.0\" name=\"F\" type=\"ionslm_126_opc3-F-\"/>\n+ </Residue>\n+ <Residue name=\"FE2\">\n+ <Atom charge=\"2.0\" name=\"FE2\" type=\"ionslm_126_opc3-Fe2+\"/>\n+ </Residue>\n+ <Residue name=\"FE\">\n+ <Atom charge=\"3.0\" name=\"FE\" type=\"ionslm_126_opc3-Fe3+\"/>\n+ </Residue>\n+ <Residue name=\"GD3\">\n+ <Atom charge=\"3.0\" name=\"GD\" type=\"ionslm_126_opc3-Gd3+\"/>\n+ </Residue>\n+ <Residue name=\"Hf\">\n+ <Atom charge=\"4.0\" name=\"Hf\" type=\"ionslm_126_opc3-Hf4+\"/>\n+ </Residue>\n+ <Residue name=\"HG\">\n+ <Atom charge=\"2.0\" name=\"HG\" type=\"ionslm_126_opc3-Hg2+\"/>\n+ </Residue>\n+ <Residue name=\"IOD\">\n+ <Atom charge=\"-1.0\" name=\"I\" type=\"ionslm_126_opc3-I-\"/>\n+ </Residue>\n+ <Residue name=\"IN\">\n+ <Atom charge=\"3.0\" name=\"IN\" type=\"ionslm_126_opc3-In3+\"/>\n+ </Residue>\n+ <Residue name=\"K\">\n+ <Atom charge=\"1.0\" name=\"K\" type=\"ionslm_126_opc3-K+\"/>\n+ </Residue>\n+ <Residue name=\"LA\">\n+ <Atom charge=\"3.0\" name=\"LA\" type=\"ionslm_126_opc3-La3+\"/>\n+ </Residue>\n+ <Residue name=\"LI\">\n+ <Atom charge=\"1.0\" name=\"LI\" type=\"ionslm_126_opc3-Li+\"/>\n+ </Residue>\n+ <Residue name=\"LU\">\n+ <Atom charge=\"3.0\" name=\"LU\" type=\"ionslm_126_opc3-Lu3+\"/>\n+ </Residue>\n+ <Residue name=\"MG\">\n+ <Atom charge=\"2.0\" name=\"MG\" type=\"ionslm_126_opc3-Mg2+\"/>\n+ </Residue>\n+ <Residue name=\"MN\">\n+ <Atom charge=\"2.0\" name=\"MN\" type=\"ionslm_126_opc3-Mn2+\"/>\n+ </Residue>\n+ <Residue name=\"NA\">\n+ <Atom charge=\"1.0\" name=\"NA\" type=\"ionslm_126_opc3-Na+\"/>\n+ </Residue>\n+ <Residue name=\"Nd\">\n+ <Atom charge=\"3.0\" name=\"Nd\" type=\"ionslm_126_opc3-Nd3+\"/>\n+ </Residue>\n+ <Residue name=\"NI\">\n+ <Atom charge=\"2.0\" name=\"NI\" type=\"ionslm_126_opc3-Ni2+\"/>\n+ </Residue>\n+ <Residue name=\"PB\">\n+ <Atom charge=\"2.0\" name=\"PB\" type=\"ionslm_126_opc3-Pb2+\"/>\n+ </Residue>\n+ <Residue name=\"PD\">\n+ <Atom charge=\"2.0\" name=\"PD\" type=\"ionslm_126_opc3-Pd2+\"/>\n+ </Residue>\n+ <Residue name=\"PR\">\n+ <Atom charge=\"3.0\" name=\"PR\" type=\"ionslm_126_opc3-Pr3+\"/>\n+ </Residue>\n+ <Residue name=\"PT\">\n+ <Atom charge=\"2.0\" name=\"PT\" type=\"ionslm_126_opc3-Pt2+\"/>\n+ </Residue>\n+ <Residue name=\"Pu\">\n+ <Atom charge=\"4.0\" name=\"Pu\" type=\"ionslm_126_opc3-Pu4+\"/>\n+ </Residue>\n+ <Residue name=\"Ra\">\n+ <Atom charge=\"2.0\" name=\"Ra\" type=\"ionslm_126_opc3-Ra2+\"/>\n+ </Residue>\n+ <Residue name=\"RB\">\n+ <Atom charge=\"1.0\" name=\"RB\" type=\"ionslm_126_opc3-Rb+\"/>\n+ </Residue>\n+ <Residue name=\"Sm\">\n+ <Atom charge=\"2.0\" name=\"Sm\" type=\"ionslm_126_opc3-Sm2+\"/>\n+ </Residue>\n+ <Residue name=\"SM\">\n+ <Atom charge=\"3.0\" name=\"SM\" type=\"ionslm_126_opc3-Sm3+\"/>\n+ </Residue>\n+ <Residue name=\"Sn\">\n+ <Atom charge=\"2.0\" name=\"Sn\" type=\"ionslm_126_opc3-Sn2+\"/>\n+ </Residue>\n+ <Residue name=\"SR\">\n+ <Atom charge=\"2.0\" name=\"SR\" type=\"ionslm_126_opc3-Sr2+\"/>\n+ </Residue>\n+ <Residue name=\"TB\">\n+ <Atom charge=\"3.0\" name=\"TB\" type=\"ionslm_126_opc3-Tb3+\"/>\n+ </Residue>\n+ <Residue name=\"Th\">\n+ <Atom charge=\"4.0\" name=\"Th\" type=\"ionslm_126_opc3-Th4+\"/>\n+ </Residue>\n+ <Residue name=\"TL1\">\n+ <Atom charge=\"1.0\" name=\"TL1\" type=\"ionslm_126_opc3-Tl+\"/>\n+ </Residue>\n+ <Residue name=\"Tl\">\n+ <Atom charge=\"3.0\" name=\"Tl\" type=\"ionslm_126_opc3-Tl3+\"/>\n+ </Residue>\n+ <Residue name=\"Tm\">\n+ <Atom charge=\"3.0\" name=\"Tm\" type=\"ionslm_126_opc3-Tm3+\"/>\n+ </Residue>\n+ <Residue name=\"U4+\">\n+ <Atom charge=\"4.0\" name=\"U\" type=\"ionslm_126_opc3-U4+\"/>\n+ </Residue>\n+ <Residue name=\"V2+\">\n+ <Atom charge=\"2.0\" name=\"V2+\" type=\"ionslm_126_opc3-V2+\"/>\n+ </Residue>\n+ <Residue name=\"Y\">\n+ <Atom charge=\"3.0\" name=\"Y\" type=\"ionslm_126_opc3-Y3+\"/>\n+ </Residue>\n+ <Residue name=\"YB2\">\n+ <Atom charge=\"2.0\" name=\"YB2\" type=\"ionslm_126_opc3-Yb2+\"/>\n+ </Residue>\n+ <Residue name=\"ZN\">\n+ <Atom charge=\"2.0\" name=\"ZN\" type=\"ionslm_126_opc3-Zn2+\"/>\n+ </Residue>\n+ <Residue name=\"Zr\">\n+ <Atom charge=\"4.0\" name=\"Zr\" type=\"ionslm_126_opc3-Zr4+\"/>\n+ </Residue>\n+ </Residues>\n+ <HarmonicBondForce>\n+ <Bond class1=\"OW\" class2=\"HW\" length=\"0.0978882\" k=\"502416.0\"/>\n+ </HarmonicBondForce>\n+ <HarmonicAngleForce>\n+ <!-- angle = arccos(1 - (1.598507**2 / (2*0.978882**2))) -->\n+ <Angle class1=\"HW\" class2=\"OW\" class3=\"HW\" angle=\"1.9106321528999624\" k=\"628.02\"/>\n+ </HarmonicAngleForce>\n+ <NonbondedForce coulomb14scale=\"0.833333\" lj14scale=\"0.5\">\n+ <UseAttributeFromResidue name=\"charge\"/>\n+ <!-- sigma = (1.7814990 * 2 / (2**(1/6)))*unit.angstrom/unit.nanometer -->\n+ <!-- epsilon = (0.163406*unit.kilocalorie)/(unit.kilojoule) -->\n+ <Atom type=\"opc3-O\" sigma=\"0.31742703509365927\" epsilon=\"0.683690704\"/>\n+ <Atom type=\"opc3-H\" sigma=\"1\" epsilon=\"0\"/>\n+ <Atom epsilon=\"0.013625196\" sigma=\"0.22628827440764618\" type=\"ionslm_126_opc3-Li+\"/><!-- HFE set for the OPC3 water model from Sengupta et al., JCIM, 2021, 61, 869 -->\n+ <Atom epsilon=\"0.1260287744\" sigma=\"0.2617460433896317\" type=\"ionslm_126_opc3-Na+\"/><!-- HFE set for the OPC3 water model from Sengupta et al., JCIM, 2021, 61, 869 -->\n+ <Atom epsilon=\"0.58667223752\" sigma=\"0.3034401033985996\" type=\"ionslm_126_opc3-K+\"/><!-- HFE set for the OPC3 water model from Sengupta et al., JCIM, 2021, 61, 869 -->\n+ <Atom epsilon=\"0.89173069\" sigma=\"0.32072353853052216\" type=\"ionslm_126_opc3-Rb+\"/><!-- HFE set for the OPC3 water model from Sengupta et al., JCIM, 2021, 61, 869 -->\n+ <Atom epsilon=\"1.4963237108\" sigma=\"0.35012319622915333\" type=\"ionslm_126_opc3-Cs+\"/><!-- HFE set for the OPC3 water model from Sengupta et al., JCIM, 2021, 61, 869 -->\n+ <Atom epsilon=\"0.52838869912\" sigma=\"0.29969832878241015\" type=\"ionslm_126_opc3-Tl+\"/><!-- HFE set for the OPC3 water model from Sengupta et al., JCIM, 2021, 61, 869 -->\n+ <Atom epsilon=\"0.004698632\" sigma=\"0.2139938720973095\" type=\"ionslm_126_opc3-Cu+\"/><!-- HFE set for the OPC3 water model from Sengupta et al., JCIM, 2021, 61, 869 -->\n+ <Atom epsilon=\"0.0318714108\" sigma=\"0.2378699577434706\" type=\"ionslm_126_opc3-Ag+\"/><!-- HFE set for the OPC3 water model from Sengupta et al., JCIM, 2021, 61, 869 -->\n+ <Atom epsilon=\"0.9537620464000001\" sigma=\"0.3239307739158274\" type=\"ionslm_126_opc3-F-\"/><!-- HFE set for the OPC3 water model from Sengupta et al., JCIM, 2021, 61, 869 -->\n+ <Atom epsilon=\"2.68724395648\" sigma=\"0.4108824888063245\" type=\"ionslm_126_opc3-Cl-\"/><!-- HFE set for the OPC3 water model from Sengupta et al., JCIM, 2021, 61, 869 -->\n+ <Atom epsilon=\"3.18294026032\" sigma=\"0.4456275388137977\" type=\"ionslm_126_opc3-Br-\"/><!-- HFE set for the OPC3 water model from Sengupta et al., JCIM, 2021, 61, 869 -->\n+ <Atom epsilon=\"3.64743605776\" sigma=\"0.4953396872860286\" type=\"ionslm_126_opc3-I-\"/><!-- HFE set for the OPC3 water model from Sengupta et al., JCIM, 2021, 61, 869 -->\n+ <Atom epsilon=\"2.598264e-05\" sigma=\"0.17301253106285389\" type=\"ionslm_126_opc3-Be2+\"/><!-- CM set for the OPC3 water model from Li et al., JCTC, 2020, 16, 4429 -->\n+ <Atom epsilon=\"0.007283507200000001\" sigma=\"0.2188047251752673\" type=\"ionslm_126_opc3-Cu2+\"/><!-- CM set for the OPC3 water model from Li et al., JCTC, 2020, 16, 4429 -->\n+ <Atom epsilon=\"0.01034627888\" sigma=\"0.2229028592787129\" type=\"ionslm_126_opc3-Ni2+\"/><!-- CM set for the OPC3 water model from Li et al., JCTC, 2020, 16, 4429 -->\n+ <Atom epsilon=\"0.014015354\" sigma=\"0.22664463389490233\" type=\"ionslm_126_opc3-Pt2+\"/><!-- CM set for the OPC3 water model from Li et al., JCTC, 2020, 16, 4429 -->\n+ <Atom epsilon=\"0.015669289200000002\" sigma=\"0.22807007184392686\" type=\"ionslm_126_opc3-Zn2+\"/><!-- CM set for the OPC3 water model from Li et al., JCTC, 2020, 16, 4429 -->\n+ <Atom epsilon=\"0.022184153760000002\" sigma=\"0.23270274517825662\" type=\"ionslm_126_opc3-Co2+\"/><!-- CM set for the OPC3 water model from Li et al., JCTC, 2020, 16, 4429 -->\n+ <Atom epsilon=\"0.0230594884\" sigma=\"0.23323728440914082\" type=\"ionslm_126_opc3-Pd2+\"/><!-- CM set for the OPC3 water model from Li et al., JCTC, 2020, 16, 4429 -->\n+ <Atom epsilon=\"0.033437523840000004\" sigma=\"0.23858267671798283\" type=\"ionslm_126_opc3-Ag2+\"/><!-- CM set for the OPC3 water model from Li et al., JCTC, 2020, 16, 4429 -->\n+ <Atom epsilon=\"0.03762051968\" sigma=\"0.24036447415426354\" type=\"ionslm_126_opc3-Cr2+\"/><!-- CM set for the OPC3 water model from Li et al., JCTC, 2020, 16, 4429 -->\n+ <Atom epsilon=\"0.04078617592000001\" sigma=\"0.24161173235966005\" type=\"ionslm_126_opc3-Fe2+\"/><!-- CM set for the OPC3 water model from Li et al., JCTC, 2020, 16, 4429 -->\n+ <Atom epsilon=\"0.04415701552\" sigma=\"0.2428589905650565\" type=\"ionslm_126_opc3-Mg2+\"/><!-- CM set for the OPC3 water model from Li et al., JCTC, 2020, 16, 4429 -->\n+ <Atom epsilon=\"0.045666519040000006\" sigma=\"0.2433935297959407\" type=\"ionslm_126_opc3-V2+\"/><!-- CM set for the OPC3 water model from Li et al., JCTC, 2020, 16, 4429 -->\n+ <Atom epsilon=\"0.0727321456\" sigma=\"0.25123343851557567\" type=\"ionslm_126_opc3-Mn2+\"/><!-- CM set for the OPC3 water model from Li et al., JCTC, 2020, 16, 4429 -->\n+ <Atom epsilon=\"0.0727321456\" sigma=\"0.25123343851557567\" type=\"ionslm_126_opc3-Hg2+\"/><!-- CM set for the OPC3 water model from Li et al., JCTC, 2020, 16, 4429 -->\n+ <Atom epsilon=\"0.07494179968\" sigma=\"0.25176797774645987\" type=\"ionslm_126_opc3-Cd2+\"/><!-- CM set for the OPC3 water model from Li et al., JCTC, 2020, 16, 4429 -->\n+ <Atom epsilon=\"0.37961047072000004\" sigma=\"0.2890075441647261\" type=\"ionslm_126_opc3-Yb2+\"/><!-- CM set for the OPC3 water model from Li et al., JCTC, 2020, 16, 4429 -->\n+ <Atom epsilon=\"0.39325717248000003\" sigma=\"0.2900766226264945\" type=\"ionslm_126_opc3-Ca2+\"/><!-- CM set for the OPC3 water model from Li et al., JCTC, 2020, 16, 4429 -->\n+ <Atom epsilon=\"0.423779578\" sigma=\"0.2923929592936593\" type=\"ionslm_126_opc3-Sn2+\"/><!-- CM set for the OPC3 water model from Li et al., JCTC, 2020, 16, 4429 -->\n+ <Atom epsilon=\"0.64496410208\" sigma=\"0.307003698271161\" type=\"ionslm_126_opc3-Pb2+\"/><!-- CM set for the OPC3 water model from Li et al., JCTC, 2020, 16, 4429 -->\n+ <Atom epsilon=\"0.7982505068\" sigma=\"0.31573450570893624\" type=\"ionslm_126_opc3-Eu2+\"/><!-- CM set for the OPC3 water model from Li et al., JCTC, 2020, 16, 4429 -->\n+ <Atom epsilon=\"0.8179506616000001\" sigma=\"0.31680358417070464\" type=\"ionslm_126_opc3-Sr2+\"/><!-- CM set for the OPC3 water model from Li et al., JCTC, 2020, 16, 4429 -->\n+ <Atom epsilon=\"0.8378363768\" sigma=\"0.31787266263247305\" type=\"ionslm_126_opc3-Sm2+\"/><!-- CM set for the OPC3 water model from Li et al., JCTC, 2020, 16, 4429 -->\n+ <Atom epsilon=\"1.5001257116000002\" sigma=\"0.35030137597278144\" type=\"ionslm_126_opc3-Ba2+\"/><!-- CM set for the OPC3 water model from Li et al., JCTC, 2020, 16, 4429 -->\n+ <Atom epsilon=\"1.5001257116000002\" sigma=\"0.35030137597278144\" type=\"ionslm_126_opc3-Ra2+\"/><!-- CM set for the OPC3 water model from Li et al., JCTC, 2020, 16, 4429 -->\n+ <Atom epsilon=\"0.01724489992\" sigma=\"0.22931733004932334\" type=\"ionslm_126_opc3-Al3+\"/><!-- IOD set for the OPC3 water model from Li et al., JCTC, 2021, 17, 2342 -->\n+ <Atom epsilon=\"0.07951189920000001\" sigma=\"0.2528370562082283\" type=\"ionslm_126_opc3-Fe3+\"/><!-- IOD set for the OPC3 water model from Li et al., JCTC, 2021, 17, 2342 -->\n+ <Atom epsilon=\"0.04465579016\" sigma=\"0.24303717030868457\" type=\"ionslm_126_opc3-Cr3+\"/><!-- IOD set for the OPC3 water model from Li et al., JCTC, 2021, 17, 2342 -->\n+ <Atom epsilon=\"0.10942737368000001\" sigma=\"0.25889516749158265\" type=\"ionslm_126_opc3-In3+\"/><!-- IOD set for the OPC3 water model from Li et al., JCTC, 2021, 17, 2342 -->\n+ <Atom epsilon=\"0.15799491096\" sigma=\"0.2665568964675895\" type=\"ionslm_126_opc3-Tl3+\"/><!-- IOD set for the OPC3 water model from Li et al., JCTC, 2021, 17, 2342 -->\n+ <Atom epsilon=\"0.33197918711999996\" sigma=\"0.2850875898049086\" type=\"ionslm_126_opc3-Y3+\"/><!-- IOD set for the OPC3 water model from Li et al., JCTC, 2021, 17, 2342 -->\n+ <Atom epsilon=\"0.67508049224\" sigma=\"0.3087854957074416\" type=\"ionslm_126_opc3-La3+\"/><!-- IOD set for the OPC3 water model from Li et al., JCTC, 2021, 17, 2342 -->\n+ <Atom epsilon=\"0.7530346464\" sigma=\"0.3132399892981433\" type=\"ionslm_126_opc3-Ce3+\"/><!-- IOD set for the OPC3 water model from Li et al., JCTC, 2021, 17, 2342 -->\n+ <Atom epsilon=\"0.7276888530400001\" sigma=\"0.3118145513491188\" type=\"ionslm_126_opc3-Pr3+\"/><!-- IOD set for the OPC3 water model from Li et al., JCTC, 2021, 17, 2342 -->\n+ <Atom epsilon=\"0.55575929744\" sigma=\"0.3014801262186908\" type=\"ionslm_126_opc3-Nd3+\"/><!-- IOD set for the OPC3 water model from Li et al., JCTC, 2021, 17, 2342 -->\n+ <Atom epsilon=\"0.48867542632000005\" sigma=\"0.29702563262798914\" type=\"ionslm_126_opc3-Sm3+\"/><!-- IOD set for the OPC3 water model from Li et al., JCTC, 2021, 17, 2342 -->\n+ <Atom epsilon=\"0.50965295632\" sigma=\"0.2984510705770137\" type=\"ionslm_126_opc3-Eu3+\"/><!-- IOD set for the OPC3 water model from Li et al., JCTC, 2021, 17, 2342 -->\n+ <Atom epsilon=\"0.38639884336\" sigma=\"0.2895420833956103\" type=\"ionslm_126_opc3-Gd3+\"/><!-- IOD set for the OPC3 water model from Li et al., JCTC, 2021, 17, 2342 -->\n+ <Atom epsilon=\"0.40484250112000003\" sigma=\"0.2909675213446348\" type=\"ionslm_126_opc3-Tb3+\"/><!-- IOD set for the OPC3 water model from Li et al., JCTC, 2021, 17, 2342 -->\n+ <Atom epsilon=\"0.34886028824000004\" sigma=\"0.2865130277539331\" type=\"ionslm_126_opc3-Dy3+\"/><!-- IOD set for the OPC3 water model from Li et al., JCTC, 2021, 17, 2342 -->\n+ <Atom epsilon=\"0.33197918711999996\" sigma=\"0.2850875898049086\" type=\"ionslm_126_opc3-Er3+\"/><!-- IOD set for the OPC3 water model from Li et al., JCTC, 2021, 17, 2342 -->\n+ <Atom epsilon=\"0.33197918711999996\" sigma=\"0.2850875898049086\" type=\"ionslm_126_opc3-Tm3+\"/><!-- IOD set for the OPC3 water model from Li et al., JCTC, 2021, 17, 2342 -->\n+ <Atom epsilon=\"0.29778189072\" sigma=\"0.2820585341632314\" type=\"ionslm_126_opc3-Lu3+\"/><!-- IOD set for the OPC3 water model from Li et al., JCTC, 2021, 17, 2342 -->\n+ <Atom epsilon=\"0.14921629320000002\" sigma=\"0.26530963826219306\" type=\"ionslm_126_opc3-Hf4+\"/><!-- IOD set for the OPC3 water model from Li et al., JCTC, 2021, 17, 2342 -->\n+ <Atom epsilon=\"0.17386691496\" sigma=\"0.2686950533911263\" type=\"ionslm_126_opc3-Zr4+\"/><!-- IOD set for the OPC3 water model from Li et al., JCTC, 2021, 17, 2342 -->\n+ <Atom epsilon=\"0.6009964544\" sigma=\"0.3043310021167399\" type=\"ionslm_126_opc3-Ce4+\"/><!-- IOD set for the OPC3 water model from Li et al., JCTC, 2021, 17, 2342 -->\n+ <Atom epsilon=\"0.6009964544\" sigma=\"0.3043310021167399\" type=\"ionslm_126_opc3-U4+\"/><!-- IOD set for the OPC3 water model from Li et al., JCTC, 2021, 17, 2342 -->\n+ <Atom epsilon=\"0.52838869912\" sigma=\"0.29969832878241015\" type=\"ionslm_126_opc3-Pu4+\"/><!-- IOD set for the OPC3 water model from Li et al., JCTC, 2021, 17, 2342 -->\n+ <Atom epsilon=\"0.63901700632\" sigma=\"0.3066473387839048\" type=\"ionslm_126_opc3-Th4+\"/><!-- IOD set for the OPC3 water model from Li et al., JCTC, 2021, 17, 2342 -->\n+ </NonbondedForce>\n+</ForceField>\ndiff --git a/wrappers/python/openmm/app/data/opc3.xml b/wrappers/python/openmm/app/data/opc3.xml\nindex 6be0836997..f21f3e89c4 100644\n--- a/wrappers/python/openmm/app/data/opc3.xml\n+++ b/wrappers/python/openmm/app/data/opc3.xml\n@@ -17,7 +17,7 @@\n </Residue>\n </Residues>\n <HarmonicBondForce>\n- <Bond class1=\"OW\" class2=\"HW\" length=\"0.978882\" k=\"502416.0\"/>\n+ <Bond class1=\"OW\" class2=\"HW\" length=\"0.0978882\" k=\"502416.0\"/>\n </HarmonicBondForce>\n <HarmonicAngleForce>\n <!-- angle = arccos(1 - (1.598507**2 / (2*0.978882**2))) -->\n"}, "test": {"test_patch": "diff --git a/wrappers/python/tests/TestForceField.py b/wrappers/python/tests/TestForceField.py\nindex 899f0393ea..767c7793d6 100644\n--- a/wrappers/python/tests/TestForceField.py\n+++ b/wrappers/python/tests/TestForceField.py\n@@ -1325,6 +1325,13 @@ def test_Opc3Energy(self):\n # -2532.4862082354407\n self.assertTrue(abs(energy1 - energy_amber) < energy_tolerance)\n \n+ context.applyConstraints(1e-12)\n+ state = context.getState(getEnergy=True)\n+ energy2 = state.getPotentialEnergy().value_in_unit(kilocalorie_per_mole)\n+ self.assertTrue(abs(energy1 - energy_amber) < energy_tolerance)\n+ self.assertTrue(abs(energy1 - energy2) < energy_tolerance)\n+\n+\n class AmoebaTestForceField(unittest.TestCase):\n \"\"\"Test the ForceField.createSystem() method with the AMOEBA forcefield.\"\"\"\n \n", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}75{"question_id": "MSB_openmm_openmm_pr3886", "question_type": "multi_swe_bench", "description": "Minimizer does not move constrained massless particles (openmm/openmm#3886)", "content": {"org": "openmm", "repo": "openmm", "pr_number": 3886, "issue_title": "Minimizer does not move constrained massless particles", "issue_body": "Fixes #3884. This addresses an obscure situation. Normally we don't allow a constraint to involve a massless particle. But if both particles connected by a constraint are massless we do allow it, since the constraint will just be ignored. That makes it easy to immobilize whole molecules without worrying about what constraints they contain. In that situation, the minimizer was incorrectly enforcing the constraint rather than ignoring it.", "base_commit": "4068b9151cef813d83139a8b3d877ee40941c241", "resolved_issues": [{"number": 3884, "title": "Minimization with frozen particles", "body": "Hi everyone,\r\n\r\nRecently I have been looking into how one can minimize systems containing frozen particles. In the past, I have attempted to set the mass to zero for the particles that are to be frozen, which works during the normal integration:\r\n```python\r\nfor atom in protein_atoms:\r\n system.setParticleMass(atom.index, 0.000*u.dalton)\r\nintegrator = mm.LangevinMiddleIntegrator(298.15*u.kelvin, 1.0/u.picoseconds, 2.0*u.femtoseconds)\r\nsim = app.Simulation(pdb.topology, system, integrator, platform, properties)\r\nsim.context.setPositions(pdb.positions)\r\nsim.minimizeEnergy()\r\n```\r\nHowever, it is my impression that all particles are still being minimized using this approach. Instead, I was thinking if I should use the [setIntegrationForceGroups](http://docs.openmm.org/latest/api-python/generated/openmm.openmm.LangevinMiddleIntegrator.html#openmm.openmm.LangevinMiddleIntegrator.setIntegrationForceGroups) method from the integrator. When calling [getIntegrationForceGroups](http://docs.openmm.org/latest/api-python/generated/openmm.openmm.LangevinMiddleIntegrator.html#openmm.openmm.LangevinMiddleIntegrator.getIntegrationForceGroups)(self) it returns -1, which I assume means that the integrator is acting on all particles? \r\n\r\nTo summarize my questions:\r\na. Should the ForceGroups not change for the integrator when the system contains particles with zero mass?\r\nb. Could you provide a minimal example of how to freeze a set of particles during minimization? If done by changing the ForceGroups please show one can use either set or int as explained in the [documentation](http://docs.openmm.org/latest/api-python/generated/openmm.openmm.LangevinMiddleIntegrator.html#openmm.openmm.LangevinMiddleIntegrator.setIntegrationForceGroups).\r\n\r\n\n\n## IMPORTANT INSTRUCTIONS\n\n1. If you edit a python file, you MUST run 'make PythonInstall' inside the build directory\n2. If you edit a c++ file, you MUST run 'make -j4 && make install\" inside the build directory"}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/openmm_m_openmm:pr-3886", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/openmmapi/src/LocalEnergyMinimizer.cpp b/openmmapi/src/LocalEnergyMinimizer.cpp\nindex 503f45a3d0..4fba9540a9 100644\n--- a/openmmapi/src/LocalEnergyMinimizer.cpp\n+++ b/openmmapi/src/LocalEnergyMinimizer.cpp\n@@ -137,12 +137,16 @@ static lbfgsfloatval_t evaluate(void *instance, const lbfgsfloatval_t *x, lbfgsf\n double dr = r-distance;\n double kdr = k*dr;\n energy += 0.5*kdr*dr;\n- g[3*particle1] -= kdr*delta[0];\n- g[3*particle1+1] -= kdr*delta[1];\n- g[3*particle1+2] -= kdr*delta[2];\n- g[3*particle2] += kdr*delta[0];\n- g[3*particle2+1] += kdr*delta[1];\n- g[3*particle2+2] += kdr*delta[2];\n+ if (system.getParticleMass(particle1) != 0) {\n+ g[3*particle1] -= kdr*delta[0];\n+ g[3*particle1+1] -= kdr*delta[1];\n+ g[3*particle1+2] -= kdr*delta[2];\n+ }\n+ if (system.getParticleMass(particle2) != 0) {\n+ g[3*particle2] += kdr*delta[0];\n+ g[3*particle2+1] += kdr*delta[1];\n+ g[3*particle2+2] += kdr*delta[2];\n+ }\n }\n return energy;\n }\n"}, "test": {"test_patch": "diff --git a/tests/TestLocalEnergyMinimizer.h b/tests/TestLocalEnergyMinimizer.h\nindex 8fb3bbba3e..f28fb57e0f 100644\n--- a/tests/TestLocalEnergyMinimizer.h\n+++ b/tests/TestLocalEnergyMinimizer.h\n@@ -259,6 +259,42 @@ void testForceGroups() {\n ASSERT_EQUAL_TOL(2.0, sqrt(delta.dot(delta)), 1e-4);\n }\n \n+void testMasslessParticles() {\n+ // Create a system with massless particles, some of which are involved in constraints.\n+ \n+ const int numParticles = 10;\n+ System system;\n+ HarmonicBondForce* force = new HarmonicBondForce();\n+ system.addForce(force);\n+ vector<Vec3> positions(numParticles);\n+ OpenMM_SFMT::SFMT sfmt;\n+ init_gen_rand(0, sfmt);\n+ for (int i = 0; i < numParticles; i++) {\n+ system.addParticle(i < 3 || i == 5 ? 0.0 : 1.0);\n+ positions[i] = Vec3(i, 0.1*genrand_real2(sfmt), 0.1*genrand_real2(sfmt));\n+ }\n+ for (int i = 0; i < numParticles-1; i++) {\n+ if (i < 2 || i == 6)\n+ system.addConstraint(i, i+1, 1.05);\n+ else\n+ force->addBond(i, i+1, 1.05, 100.0);\n+ }\n+ \n+ // Minimize it and check that massless particles have not moved, while other\n+ // constraints are satisfied.\n+\n+ VerletIntegrator integrator(0.01);\n+ Context context(system, integrator, platform);\n+ context.setPositions(positions);\n+ LocalEnergyMinimizer::minimize(context, 1e-5);\n+ State state = context.getState(State::Positions);\n+ for (int i = 0; i < numParticles; i++)\n+ if (system.getParticleMass(i) == 0)\n+ ASSERT_EQUAL_VEC(positions[i], state.getPositions()[i], 1e-6);\n+ Vec3 delta = state.getPositions()[6]-state.getPositions()[7];\n+ ASSERT_EQUAL_TOL(1.05, sqrt(delta.dot(delta)), 1e-4);\n+}\n+\n void runPlatformTests();\n \n int main(int argc, char* argv[]) {\n@@ -269,6 +305,7 @@ int main(int argc, char* argv[]) {\n testVirtualSites();\n testLargeForces();\n testForceGroups();\n+ testMasslessParticles();\n runPlatformTests();\n }\n catch(const exception& e) {\n", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}76{"question_id": "MSB_openmm_openmm_pr4094", "question_type": "multi_swe_bench", "description": "AmberPrmtopFile accepts box vectors as a constructor argument (openmm/openmm#4094)", "content": {"org": "openmm", "repo": "openmm", "pr_number": 4094, "issue_title": "AmberPrmtopFile accepts box vectors as a constructor argument", "issue_body": "See #4078 for a discussion of the problems this solves.", "base_commit": "f08a1cf8ee42ff42dae1d2d72c2a207805cd2df8", "resolved_issues": [{"number": null, "title": "AmberPrmtopFile accepts box vectors as a constructor argument", "body": "The `AmberPrmtopFile` class does not currently allow users to specify periodic box vectors directly when creating an instance. This limitation requires users to set the periodic box vectors separately after creating the object, which can lead to redundant code and potential errors if the vectors are not set correctly.\n\nThe expected behavior is that users should be able to provide periodic box vectors as an optional argument when initializing an `AmberPrmtopFile` object. This would streamline the workflow, reduce the risk of errors, and improve code clarity by allowing the box vectors to be specified directly during object creation.\n\n## IMPORTANT INSTRUCTIONS\n\n1. If you edit a python file, you MUST run 'make PythonInstall' inside the build directory\n2. If you edit a c++ file, you MUST run 'make -j4 && make install\" inside the build directory"}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/openmm_m_openmm:pr-4094", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/docs-source/usersguide/application/02_running_sims.rst b/docs-source/usersguide/application/02_running_sims.rst\nindex 080634d2b5..5605a1dedb 100644\n--- a/docs-source/usersguide/application/02_running_sims.rst\n+++ b/docs-source/usersguide/application/02_running_sims.rst\n@@ -190,7 +190,7 @@ Using AMBER Files\n OpenMM can build a system in several different ways. One option, as shown\n above, is to start with a PDB file and then select a force field with which to\n model it. Alternatively, you can use AmberTools_ to model your system. In that\n-case, you provide a :class:`prmtop` file and an :class:`inpcrd` file. OpenMM loads the files and\n+case, you provide a :file:`prmtop` file and an :file:`inpcrd` file. OpenMM loads the files and\n creates a :class:`System` from them. This is illustrated in the following script. It can be\n found in OpenMM\u2019s :file:`examples` folder with the name :file:`simulateAmber.py`.\n \n@@ -202,15 +202,13 @@ found in OpenMM\u2019s :file:`examples` folder with the name :file:`simulateAmber.p\n from openmm.unit import *\n from sys import stdout\n \n- prmtop = AmberPrmtopFile('input.prmtop')\n inpcrd = AmberInpcrdFile('input.inpcrd')\n+ prmtop = AmberPrmtopFile('input.prmtop', periodicBoxVectors=inpcrd.boxVectors)\n system = prmtop.createSystem(nonbondedMethod=PME, nonbondedCutoff=1*nanometer,\n constraints=HBonds)\n integrator = LangevinMiddleIntegrator(300*kelvin, 1/picosecond, 0.004*picoseconds)\n simulation = Simulation(prmtop.topology, system, integrator)\n simulation.context.setPositions(inpcrd.positions)\n- if inpcrd.boxVectors is not None:\n- simulation.context.setPeriodicBoxVectors(*inpcrd.boxVectors)\n simulation.minimizeEnergy()\n simulation.reporters.append(PDBReporter('output.pdb', 1000))\n simulation.reporters.append(StateDataReporter(stdout, 1000, step=True,\n@@ -225,12 +223,12 @@ This script is very similar to the previous one. There are just a few\n significant differences:\n ::\n \n- prmtop = AmberPrmtopFile('input.prmtop')\n inpcrd = AmberInpcrdFile('input.inpcrd')\n+ prmtop = AmberPrmtopFile('input.prmtop', periodicBoxVectors=inpcrd.boxVectors)\n \n-In these lines, we load the prmtop file and inpcrd file. More precisely, we\n-create :class:`AmberPrmtopFile` and :class:`AmberInpcrdFile` objects and assign them to the\n-variables :code:`prmtop` and :code:`inpcrd`\\ , respectively. As before,\n+In these lines, we load the :file:`inpcrd` file and :file:`prmtop` file. More precisely, we\n+create :class:`AmberInpcrdFile` and :class:`AmberPrmtopFile` objects and assign them to the\n+variables :code:`inpcrd` and :code:`prmtop`\\ , respectively. As before,\n you can change these lines to specify any files you want. Be sure to include\n the single quotes around the file names.\n \n@@ -241,6 +239,19 @@ the single quotes around the file names.\n example files that are in the \"old-style\" :file:`prmtop` format. These \"old-style\" files will\n not run in OpenMM.\n \n+Notice that when we load the :file:`prmtop` file we include the argument :code:`periodicBoxVectors=inpcrd.boxVectors`\\ .\n+AMBER stores information about the periodic box in the :file:`inpcrd` file. To let\n+:class:`AmberPrmtopFile` create a :class:`Topology` object, we therefore need to\n+tell it the periodic box vectors that were loaded from the :file:`inpcrd` file. You\n+only need to do this if you are simulating a periodic system. For implicit\n+solvent simulations, it usually can be omitted.\n+\n+.. note::\n+\n+ For historical reasons, :file:`prmtop` files also have the ability to store\n+ periodic box information, but it is deprecated. It is always better to get\n+ the box vectors from the :file:`inpcrd` file instead.\n+\n Next, the :class:`System` object is created in a different way:\n ::\n \n@@ -259,22 +270,7 @@ directly.\n \n Notice that we now get the topology from the :file:`prmtop` file and the atom positions\n from the :file:`inpcrd` file. In the previous section, both of these came from a PDB\n-file, but AMBER puts the topology and positions in separate files. We also add the\n-following lines:\n-::\n-\n- if inpcrd.boxVectors is not None:\n- simulation.context.setPeriodicBoxVectors(*inpcrd.boxVectors)\n-\n-For periodic systems, the :file:`prmtop` file specifies the periodic box vectors, just\n-as a PDB file does. When we call :meth:`createSystem`, it sets those as the default\n-periodic box vectors, to be used automatically for all simulations. However, the\n-:file:`inpcrd` may *also* specify periodic box vectors,\n-and if so we want to use those ones instead. For example, if the system has been\n-equilibrated with a barostat, the box vectors may have changed during equilibration.\n-We therefore check to see if the :file:`inpcrd` file contained box vectors. If so,\n-we call :meth:`setPeriodicBoxVectors` to tell it to use those ones, overriding the\n-default ones provided by the :class:`System`.\n+file, but AMBER puts the topology and positions in separate files.\n \n .. _using_gromacs_files:\n \n@@ -315,16 +311,10 @@ with the name :file:`simulateGromacs.py`.\n \n This script is nearly identical to the previous one, just replacing\n :class:`AmberInpcrdFile` and :class:`AmberPrmtopFile` with :class:`GromacsGroFile` and :class:`GromacsTopFile`.\n-Note that when we create the :class:`GromacsTopFile`, we specify values for two extra\n-options. First, we specify\n-:code:`periodicBoxVectors=gro.getPeriodicBoxVectors()`\\ . Unlike OpenMM and\n-AMBER, which can store periodic unit cell information with the topology, Gromacs\n-only stores it with the coordinates. To let :class:`GromacsTopFile` create a :class:`Topology`\n-object, we therefore need to tell it the periodic box vectors that were loaded\n-from the :file:`gro` file. You only need to do this if you are simulating a periodic\n-system. For implicit solvent simulations, it usually can be omitted.\n-\n-Second, we specify :code:`includeDir='/usr/local/gromacs/share/gromacs/top'`\\ . Unlike AMBER,\n+As with AMBER files, when we create the :class:`GromacsTopFile` we specify\n+:code:`periodicBoxVectors=gro.getPeriodicBoxVectors()` to tell it the periodic\n+box vectors that were loaded from the :file:`gro` file. In addition, we specify\n+:code:`includeDir='/usr/local/gromacs/share/gromacs/top'`\\ . Unlike AMBER,\n which stores all the force field parameters directly in a :file:`prmtop` file, Gromacs just stores\n references to force field definition files that are installed with the Gromacs\n application. OpenMM needs to know where to find these files, so the\ndiff --git a/examples/simulateAmber.py b/examples/simulateAmber.py\nindex 060cb5372f..dd408d949b 100644\n--- a/examples/simulateAmber.py\n+++ b/examples/simulateAmber.py\n@@ -3,14 +3,12 @@\n from openmm.unit import *\n from sys import stdout\n \n-prmtop = AmberPrmtopFile('input.prmtop')\n inpcrd = AmberInpcrdFile('input.inpcrd')\n+prmtop = AmberPrmtopFile('input.prmtop', periodicBoxVectors=inpcrd.boxVectors)\n system = prmtop.createSystem(nonbondedMethod=PME, nonbondedCutoff=1*nanometer, constraints=HBonds)\n integrator = LangevinMiddleIntegrator(300*kelvin, 1/picosecond, 0.004*picoseconds)\n simulation = Simulation(prmtop.topology, system, integrator)\n simulation.context.setPositions(inpcrd.positions)\n-if inpcrd.boxVectors is not None:\n- simulation.context.setPeriodicBoxVectors(*inpcrd.boxVectors)\n simulation.minimizeEnergy()\n simulation.reporters.append(PDBReporter('output.pdb', 1000))\n simulation.reporters.append(StateDataReporter(stdout, 1000, step=True, potentialEnergy=True, temperature=True))\ndiff --git a/wrappers/python/openmm/app/amberprmtopfile.py b/wrappers/python/openmm/app/amberprmtopfile.py\nindex 5d7166b49f..d01a590d9a 100644\n--- a/wrappers/python/openmm/app/amberprmtopfile.py\n+++ b/wrappers/python/openmm/app/amberprmtopfile.py\n@@ -82,11 +82,26 @@ def _strip_optunit(thing, unit):\n class AmberPrmtopFile(object):\n \"\"\"AmberPrmtopFile parses an AMBER prmtop file and constructs a Topology and (optionally) an OpenMM System from it.\"\"\"\n \n- def __init__(self, file):\n- \"\"\"Load a prmtop file.\"\"\"\n+ def __init__(self, file, periodicBoxVectors=None, unitCellDimensions=None):\n+ \"\"\"Load a prmtop file.\n+\n+ file : str\n+ the name of the file to load\n+ periodicBoxVectors : tuple of Vec3=None\n+ the vectors defining the periodic box\n+ unitCellDimensions : Vec3=None\n+ the dimensions of the crystallographic unit cell. For\n+ non-rectangular unit cells, specify periodicBoxVectors instead.\n+ \"\"\"\n ## The Topology read from the prmtop file\n self.topology = top = Topology()\n self.elements = []\n+ if periodicBoxVectors is not None:\n+ if unitCellDimensions is not None:\n+ raise ValueError(\"Specify either periodicBoxVectors or unitCellDimensions, but not both\")\n+ top.setPeriodicBoxVectors(periodicBoxVectors)\n+ else:\n+ top.setUnitCellDimensions(unitCellDimensions)\n \n # Load the prmtop file\n \n@@ -151,7 +166,7 @@ def __init__(self, file):\n \n # Set the periodic box size.\n \n- if prmtop.getIfBox():\n+ if top.getPeriodicBoxVectors() is None and prmtop.getIfBox():\n box = prmtop.getBoxBetaAndDimensions()\n top.setPeriodicBoxVectors(computePeriodicBoxVectors(*(box[1:4] + box[0:1]*3)))\n \ndiff --git a/wrappers/python/openmm/app/internal/amber_file_parser.py b/wrappers/python/openmm/app/internal/amber_file_parser.py\nindex e36152a962..dbd6f4b42b 100644\n--- a/wrappers/python/openmm/app/internal/amber_file_parser.py\n+++ b/wrappers/python/openmm/app/internal/amber_file_parser.py\n@@ -12,7 +12,7 @@\n Biological Structures at Stanford, funded under the NIH Roadmap for\n Medical Research, grant U54 GM072970. See https://simtk.org.\n \n-Portions copyright (c) 2012-2022 Stanford University and the Authors.\n+Portions copyright (c) 2012-2023 Stanford University and the Authors.\n Authors: Randall J. Radmer, John D. Chodera, Peter Eastman\n Contributors: Christoph Klein, Michael R. Shirts, Jason Swails, Kye Won Wang\n \n@@ -890,7 +890,7 @@ def readAmberSystem(topology, prmtop_filename=None, prmtop_loader=None, shake=No\n # Add nonbonded interactions.\n if verbose: print(\"Adding nonbonded interactions...\")\n force = mm.NonbondedForce()\n- if (prmtop.getIfBox() == 0):\n+ if topology.getPeriodicBoxVectors() is None and prmtop.getIfBox() == 0:\n # System is non-periodic.\n if nonbondedMethod == 'NoCutoff':\n force.setNonbondedMethod(mm.NonbondedForce.NoCutoff)\n@@ -904,9 +904,12 @@ def readAmberSystem(topology, prmtop_filename=None, prmtop_loader=None, shake=No\n else:\n # System is periodic.\n # Set periodic box vectors for periodic system\n- (boxBeta, boxX, boxY, boxZ) = prmtop.getBoxBetaAndDimensions()\n- xVec, yVec, zVec = computePeriodicBoxVectors(boxX, boxY, boxZ, boxBeta, boxBeta, boxBeta)\n- system.setDefaultPeriodicBoxVectors(xVec, yVec, zVec)\n+ if topology.getPeriodicBoxVectors() is None:\n+ (boxBeta, boxX, boxY, boxZ) = prmtop.getBoxBetaAndDimensions()\n+ xVec, yVec, zVec = computePeriodicBoxVectors(boxX, boxY, boxZ, boxBeta, boxBeta, boxBeta)\n+ system.setDefaultPeriodicBoxVectors(xVec, yVec, zVec)\n+ else:\n+ system.setDefaultPeriodicBoxVectors(*topology.getPeriodicBoxVectors())\n \n # Set cutoff.\n if nonbondedCutoff is None:\n"}, "test": {"test_patch": "diff --git a/wrappers/python/tests/TestAmberPrmtopFile.py b/wrappers/python/tests/TestAmberPrmtopFile.py\nindex b107e9dede..aa190d4b64 100644\n--- a/wrappers/python/tests/TestAmberPrmtopFile.py\n+++ b/wrappers/python/tests/TestAmberPrmtopFile.py\n@@ -7,16 +7,16 @@\n from openmm.unit import *\n import openmm.app.element as elem\n \n+inpcrd3 = AmberInpcrdFile('systems/ff14ipq.rst7')\n+inpcrd4 = AmberInpcrdFile('systems/Mg_water.inpcrd')\n+inpcrd7 = AmberInpcrdFile('systems/18protein.rst7')\n prmtop1 = AmberPrmtopFile('systems/alanine-dipeptide-explicit.prmtop')\n prmtop2 = AmberPrmtopFile('systems/alanine-dipeptide-implicit.prmtop')\n-prmtop3 = AmberPrmtopFile('systems/ff14ipq.parm7')\n-prmtop4 = AmberPrmtopFile('systems/Mg_water.prmtop')\n+prmtop3 = AmberPrmtopFile('systems/ff14ipq.parm7', periodicBoxVectors=inpcrd3.boxVectors)\n+prmtop4 = AmberPrmtopFile('systems/Mg_water.prmtop', periodicBoxVectors=inpcrd4.boxVectors)\n prmtop5 = AmberPrmtopFile('systems/tz2.truncoct.parm7')\n prmtop6 = AmberPrmtopFile('systems/gaffwat.parm7')\n-prmtop7 = AmberPrmtopFile('systems/18protein.parm7')\n-inpcrd3 = AmberInpcrdFile('systems/ff14ipq.rst7')\n-inpcrd4 = AmberInpcrdFile('systems/Mg_water.inpcrd')\n-inpcrd7 = AmberInpcrdFile('systems/18protein.rst7')\n+prmtop7 = AmberPrmtopFile('systems/18protein.parm7', periodicBoxVectors=inpcrd7.boxVectors)\n \n class TestAmberPrmtopFile(unittest.TestCase):\n \n@@ -177,7 +177,6 @@ def test_NBFIX_LongRange(self):\n # 'working', and the system is plenty small so this won't be too slow\n sim = Simulation(prmtop3.topology, system, integrator, Platform.getPlatformByName('Reference'))\n # Check that the energy is about what we expect it to be\n- sim.context.setPeriodicBoxVectors(*inpcrd3.boxVectors)\n sim.context.setPositions(inpcrd3.positions)\n ene = sim.context.getState(getEnergy=True, enforcePeriodicBox=True).getPotentialEnergy()\n ene = ene.value_in_unit(kilocalories_per_mole)\n@@ -208,7 +207,6 @@ def test_NBFIX_noLongRange(self):\n # 'working', and the system is plenty small so this won't be too slow\n sim = Simulation(prmtop3.topology, system, integrator, Platform.getPlatformByName('Reference'))\n # Check that the energy is about what we expect it to be\n- sim.context.setPeriodicBoxVectors(*inpcrd3.getBoxVectors())\n sim.context.setPositions(inpcrd3.getPositions())\n ene = sim.context.getState(getEnergy=True, enforcePeriodicBox=True).getPotentialEnergy()\n ene = ene.value_in_unit(kilocalories_per_mole)\n@@ -254,12 +252,19 @@ def test_LJ1264(self):\n self.assertTrue(has_nonbond_force)\n self.assertTrue(has_custom_nonbond_force)\n self.assertEqual(nonbond_exceptions, custom_nonbond_exceptions)\n+ # Make sure the periodic box vectors match the ones in the inpcrd file, which are different from\n+ # the ones in the prmtop file.\n+ systemBox = system.getDefaultPeriodicBoxVectors()\n+ topologyBox = prmtop4.topology.getPeriodicBoxVectors()\n+ for i in range(3):\n+ for j in range(3):\n+ self.assertEqual(inpcrd4.boxVectors[i][j], systemBox[i][j])\n+ self.assertEqual(inpcrd4.boxVectors[i][j], topologyBox[i][j])\n integrator = VerletIntegrator(1.0*femtoseconds)\n # Use reference platform, since it should always be present and\n # 'working', and the system is plenty small so this won't be too slow\n sim = Simulation(prmtop4.topology, system, integrator, Platform.getPlatformByName('Reference'))\n # Check that the energy is about what we expect it to be\n- sim.context.setPeriodicBoxVectors(*inpcrd4.boxVectors)\n sim.context.setPositions(inpcrd4.positions)\n ene = sim.context.getState(getEnergy=True, enforcePeriodicBox=True).getPotentialEnergy()\n ene = ene.value_in_unit(kilocalories_per_mole)\n@@ -358,7 +363,6 @@ def test_with_dcd_reporter(self):\n \n simulation = Simulation(prmtop.topology, system, integrator)\n simulation.context.setPositions(inpcrd.positions)\n- simulation.context.setPeriodicBoxVectors(*inpcrd.boxVectors)\n \n fname = tempfile.mktemp(suffix='.dcd')\n simulation.reporters.append(DCDReporter(fname, 1)) # This is an explicit test for the bugs in issue #850\n@@ -435,8 +439,7 @@ def testAmberCMAP(self):\n \n simulation = Simulation(prmtop.topology, system, integrator)\n simulation.context.setPositions(inpcrd.positions)\n- simulation.context.setPeriodicBoxVectors(*inpcrd.boxVectors)\n- \n+\n for i, force in enumerate(system.getForces()):\n force.setForceGroup(i)\n \n", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}77{"question_id": "MSB_openmm_openmm_pr4168", "question_type": "multi_swe_bench", "description": "Fix \"off by one\" error in xtc time reporting. (openmm/openmm#4168)", "content": {"org": "openmm", "repo": "openmm", "pr_number": 4168, "issue_title": "Fix \"off by one\" error in xtc time reporting.", "issue_body": "Fixes #4163.\r\nBoth the reporter and the tests expected the first step to have index 1, causing the time of the first step to be assigned the time `dt` instead of 0.\r\n\r\nNow running this snippet:\r\n```python\r\nfrom openmm.app import *\r\nfrom openmm import *\r\nfrom openmm.unit import *\r\nfrom sys import stdout\r\n\r\npdb = PDBFile('villin.pdb')\r\n\r\nforcefield = ForceField('amber14-all.xml', 'amber14/tip3pfb.xml')\r\nsystem = forcefield.createSystem(pdb.topology, nonbondedMethod=PME,\r\n nonbondedCutoff=1*nanometer, constraints=HBonds)\r\nintegrator = LangevinMiddleIntegrator(300*kelvin, 1/picosecond, 0.002*picoseconds)\r\nsimulation = Simulation(pdb.topology, system, integrator)\r\nsimulation.context.setPositions(pdb.positions)\r\nsimulation.minimizeEnergy(maxIterations=100)\r\nsimulation.reporters.append(XTCReporter('traj.xtc', 1000, enforcePeriodicBox=False))\r\nsimulation.reporters.append(StateDataReporter(stdout, 1000, step=True, time=True,\r\n potentialEnergy=True, temperature=True))\r\nsimulation.step(10000)\r\n```\r\n\r\nProduces a traj file such that:\r\n```shell\r\n$ gmx check -f traj.xtc\r\n :-) GROMACS - gmx check, 2023.1-conda_forge (-:\r\n\r\nExecutable: /home/raul/mambaforge/envs/openmm/bin.AVX2_256/gmx\r\nData prefix: /home/raul/mambaforge/envs/openmm\r\nWorking dir: /home/raul/openmm/tests\r\nCommand line:\r\n gmx check -f traj.xtc\r\n\r\nChecking file traj.xtc\r\nReading frame 0 time 2000.000 \r\n# Atoms 8867\r\nPrecision 0.001 (nm)\r\nLast frame 9 time 20000.000 \r\n\r\n\r\nItem #frames Timestep (ps)\r\nStep 10 2000\r\nTime 10 2000\r\nLambda 0\r\nCoords 10 2000\r\nVelocities 0\r\nForces 0\r\nBox 10 2000\r\n\r\nGROMACS reminds you: \"People are DNA's way of making more DNA.\" (Edward O. Wilson)\r\n```\r\n\r\n@sef43, in your report you mentioned an issue with just the frame time. In addition to shifting the time, this PR also reduces by one the step count, so that the first frame written has index \"0\" (whereas before it was 1). Is this also the desired behavior here?", "base_commit": "c07c5bd76aab897c5216bed89cd3ce9cc9a1cf9b", "resolved_issues": [{"number": 4163, "title": "off by one error in XTCReporter time record", "body": "The new XTC reporter has an off by one error in the time it records for each frame.\r\nIssue first noticed here: https://www.ovito.org/forum/topic/dcd-format-trajectory-reader/ (login required)\r\n\r\nIt can be seen with the following script using the villin.pdb file from the cookbook:\r\n```python\r\nfrom openmm.app import *\r\nfrom openmm import *\r\nfrom openmm.unit import *\r\nfrom sys import stdout\r\n\r\npdb = PDBFile('villin.pdb')\r\n\r\nforcefield = ForceField('amber14-all.xml', 'amber14/tip3pfb.xml')\r\nsystem = forcefield.createSystem(pdb.topology, nonbondedMethod=PME,\r\n nonbondedCutoff=1*nanometer, constraints=HBonds)\r\nintegrator = LangevinMiddleIntegrator(300*kelvin, 1/picosecond, 0.002*picoseconds)\r\nsimulation = Simulation(pdb.topology, system, integrator)\r\nsimulation.context.setPositions(pdb.positions)\r\nsimulation.minimizeEnergy(maxIterations=100)\r\nsimulation.reporters.append(XTCReporter('traj.xtc', 1000, enforcePeriodicBox=False))\r\nsimulation.reporters.append(StateDataReporter(stdout, 1000, step=True, time=True,\r\n potentialEnergy=True, temperature=True))\r\nsimulation.step(10000)\r\n```\r\n\r\nIf you run `gmx check -f traj.xtc` it outputs:\r\n```\r\n :-) GROMACS - gmx check, 2023.1-conda_forge (-:\r\n\r\nExecutable: /usr/local/bin.AVX2_256/gmx\r\nData prefix: /usr/local\r\nWorking dir: /content\r\nCommand line:\r\n gmx check -f traj.xtc\r\n\r\nChecking file traj.xtc\r\nReading frame 0 time 4000.000 \r\n# Atoms 8867\r\nPrecision 0.001 (nm)\r\nLast frame 9 time 22000.000 \r\n\r\n\r\nItem #frames Timestep (ps)\r\nStep 10 2000\r\nTime 10 2000\r\nLambda 0\r\nCoords 10 2000\r\nVelocities 0\r\nForces 0\r\nBox 10 2000\r\n```\r\nFrame 0 should have time 2,000 not 4,000\r\nand frame 9 should have time 20,000 not 22,000\n\n## IMPORTANT INSTRUCTIONS\n\n1. If you edit a python file, you MUST run 'make PythonInstall' inside the build directory\n2. If you edit a c++ file, you MUST run 'make -j4 && make install\" inside the build directory"}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/openmm_m_openmm:pr-4168", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/wrappers/python/openmm/app/xtcfile.py b/wrappers/python/openmm/app/xtcfile.py\nindex ab5ff5b93a..1cdd6d7e63 100644\n--- a/wrappers/python/openmm/app/xtcfile.py\n+++ b/wrappers/python/openmm/app/xtcfile.py\n@@ -141,7 +141,7 @@ def writeModel(self, positions, unitCellDimensions=None, periodicBoxVectors=None\n )\n else:\n boxVectors = np.zeros((3, 3)).astype(np.float32)\n- step = self._modelCount * self._interval + self._firstStep\n+ step = (self._modelCount - 1) * self._interval + self._firstStep\n time = step * self._dt\n xtc_write_frame(\n self._filename.encode(\"utf-8\"),\n"}, "test": {"test_patch": "diff --git a/wrappers/python/tests/TestXtcFile.py b/wrappers/python/tests/TestXtcFile.py\nindex c33c65d047..1b84104205 100644\n--- a/wrappers/python/tests/TestXtcFile.py\n+++ b/wrappers/python/tests/TestXtcFile.py\n@@ -49,9 +49,9 @@ def test_xtc_triclinic(self):\n box = np.array(box).transpose(1, 2, 0)\n self.assertTrue(np.allclose(box_read, box, atol=1e-3))\n self.assertTrue(\n- np.allclose(time, np.arange(1, nframes + 1) * 0.001, atol=1e-5)\n+ np.allclose(time, np.arange(0, nframes) * 0.001, atol=1e-5)\n )\n- self.assertTrue(np.allclose(step, np.arange(1, nframes + 1), atol=1e-5))\n+ self.assertTrue(np.allclose(step, np.arange(0, nframes), atol=1e-5))\n \n def test_xtc_cubic(self):\n \"\"\"Test the XTC file by writing a trajectory and reading it back. Using a cubic box\"\"\"\n@@ -87,9 +87,9 @@ def test_xtc_cubic(self):\n box = np.array(box).transpose(1, 2, 0)\n self.assertTrue(np.allclose(box_read, box, atol=1e-3))\n self.assertTrue(\n- np.allclose(time, np.arange(1, nframes + 1) * 0.001, atol=1e-5)\n+ np.allclose(time, np.arange(0, nframes) * 0.001, atol=1e-5)\n )\n- self.assertTrue(np.allclose(step, np.arange(1, nframes + 1), atol=1e-5))\n+ self.assertTrue(np.allclose(step, np.arange(0, nframes), atol=1e-5))\n \n def test_xtc_box_from_topology(self):\n \"\"\"Test the XTC file by writing a trajectory and reading it back. Letting the box be set from the topology\"\"\"\n@@ -131,9 +131,9 @@ def test_xtc_box_from_topology(self):\n box = np.array(np.tile(boxVectors, (nframes, 1, 1))).transpose(1, 2, 0)\n self.assertTrue(np.allclose(box_read, box, atol=1e-3))\n self.assertTrue(\n- np.allclose(time, np.arange(1, nframes + 1) * 0.001, atol=1e-5)\n+ np.allclose(time, np.arange(0, nframes) * 0.001, atol=1e-5)\n )\n- self.assertTrue(np.allclose(step, np.arange(1, nframes + 1), atol=1e-5))\n+ self.assertTrue(np.allclose(step, np.arange(0, nframes), atol=1e-5))\n \n def testLongTrajectory(self):\n \"\"\"Test writing a trajectory that has more than 2^31 steps.\"\"\"\n", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}78{"question_id": "MSB_openmm_openmm_pr4219", "question_type": "multi_swe_bench", "description": "Don't add extra bond between water hydrogens (openmm/openmm#4219)", "content": {"org": "openmm", "repo": "openmm", "pr_number": 4219, "issue_title": "Don't add extra bond between water hydrogens", "issue_body": "Fixes #4212.\r\n\r\nAmber files list an extra \"bond\" between the hydrogens of a water molecule, which was incorrectly included in the Topology built from a prmtop file. A Topology should only include actual chemical bonds.", "base_commit": "0a3a914f0fb139fb8732a4b3fe8590f13304ee7e", "resolved_issues": [{"number": 4212, "title": "TIP3P Residue Matching Issue w/ AMBER system", "body": "I'm using OpenMM to run a system I prepared using LEaP.\r\n\r\nMy workflow looks something like this:\r\n-Use LEaP to prepare AMBER style PRMTOP/INPCRD files for a protein in explicit solvent with ff14SB/TIP3P\r\n-Use OpenMM to parse the AMBER style files and create a forcefield object/perform residue to template matching\r\n-This (functions in ```forcefield.py``` and the ```System``` object) is used by a custom simulation package to implement a forcefield and integration routine to do MD simulations\r\n\r\nThe issue I'm running into is happening when parsing the AMBER files into an OpenMM style system and doing residue to template matching. For this purpose, I'm using the ```amber14/protein.ff14SB.xml``` and ```amber14/tip3p.xml``` files located in the OpenMM directory. From previous experience, I understand that TIP3P in the AMBER convention includes an H-H bond to represent the rigid nature of the potential. When I load the files into OpenMM and check the residues:\r\n```\r\nprmtop = app.AmberPrmtopFile('../RAMP1_ion.prmtop')\r\ninpcrd = app.AmberInpcrdFile('../RAMP1_ion.inpcrd')\r\nresidues = list(prmtop.topology.residues())\r\nprint(list(residues[5000].atoms()))\r\nprint(list(residues[5000].bonds()))\r\n```\r\nI see this behavior, which results in the expected O, H1, and H2 atoms as well as the expected 3 bonds.\r\n```\r\n[<Atom 15966 (O) of chain 0 residue 5000 (HOH)>,\r\n<Atom 15967 (H1) of chain 0 residue 5000 (HOH)>,\r\n<Atom 15968 (H2) of chain 0 residue 5000 (HOH)>]\r\n\r\n[Bond(<Atom 15967 (H1) of chain 0 residue 5000 (HOH)>, <Atom 15966 (O) of chain 0 residue 5000 (HOH)>),\r\nBond(<Atom 15968 (H2) of chain 0 residue 5000 (HOH)>, <Atom 15966 (O) of chain 0 residue 5000 (HOH)>),\r\nBond(<Atom 15968 (H2) of chain 0 residue 5000 (HOH)>, <Atom 15967 (H1) of chain 0 residue 5000 (HOH)>)]\r\n```\r\n\r\nWhen looking at the ```amber14/tip3p.xml``` file, I notice that the only bonds defined are the two O-H bonds.\r\n\r\n```\r\n<Residue name=\"HOH\">\r\n <Atom name=\"O\" type=\"tip3p-O\" charge=\"-0.834\"/>\r\n <Atom name=\"H1\" type=\"tip3p-H\" charge=\"0.417\"/>\r\n <Atom name=\"H2\" type=\"tip3p-H\" charge=\"0.417\"/>\r\n <Bond atomName1=\"O\" atomName2=\"H1\"/>\r\n <Bond atomName1=\"O\" atomName2=\"H2\"/>\r\n</Residue>\r\n```\r\nWhen the simulation package or OpenMM tries to perform the template matching using the functions in ```forcefield.py```, this results in an error:\r\n```\r\n#OpenMM example that produces the matching error\r\nprmtop = AmberPrmtopFile('../RAMP1_ion.prmtop')\r\ninpcrd = AmberInpcrdFile('../RAMP1_ion.inpcrd')\r\nforcefield = ForceField('amber14/protein.ff14SB.xml', 'amber14/tip3p.xml')\r\nsystem = forcefield.createSystem(prmtop.topology, nonbondedMethod=PME, nonbondedCutoff=8*angstrom, constraints=None)\r\n```\r\n```\r\nValueError: No template found for residue 122 (HOH). The set of atoms matches HOH, but the bonds are different.\r\n```\r\nI've used ParmED / the ```amberprmtopfile.py``` tool included in OpenMM that completely bypasses ```forcefield.py``` to setup AMBER systems for OpenMM before but the tool I'm using would require significant rewriting to avoid this. I'm trying to figure out if there's anything I can do to deal with this extra bond either in system setup, parsing into OpenMM objects, or an alternative XML file I can use to resolve this issue.\n\n## IMPORTANT INSTRUCTIONS\n\n1. If you edit a python file, you MUST run 'make PythonInstall' inside the build directory\n2. If you edit a c++ file, you MUST run 'make -j4 && make install\" inside the build directory"}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/openmm_m_openmm:pr-4219", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/wrappers/python/openmm/app/amberprmtopfile.py b/wrappers/python/openmm/app/amberprmtopfile.py\nindex d01a590d9a..250d4438a1 100644\n--- a/wrappers/python/openmm/app/amberprmtopfile.py\n+++ b/wrappers/python/openmm/app/amberprmtopfile.py\n@@ -160,7 +160,13 @@ def __init__(self, file, periodicBoxVectors=None, unitCellDimensions=None):\n \n atoms = list(top.atoms())\n for bond in prmtop.getBondsWithH():\n- top.addBond(atoms[bond[0]], atoms[bond[1]])\n+ a1 = atoms[bond[0]]\n+ a2 = atoms[bond[1]]\n+ if a1.residue.name == 'HOH' and a1.element == elem.hydrogen and a2.element == elem.hydrogen:\n+ # Don't add the \"bond\" Amber lists between the two hydrogens of a water molecule.\n+ pass\n+ else:\n+ top.addBond(a1, a2)\n for bond in prmtop.getBondsNoH():\n top.addBond(atoms[bond[0]], atoms[bond[1]])\n \n"}, "test": {"test_patch": "diff --git a/wrappers/python/tests/TestAmberPrmtopFile.py b/wrappers/python/tests/TestAmberPrmtopFile.py\nindex aa190d4b64..f25a1e6cfa 100644\n--- a/wrappers/python/tests/TestAmberPrmtopFile.py\n+++ b/wrappers/python/tests/TestAmberPrmtopFile.py\n@@ -78,12 +78,14 @@ def test_RigidWaterAndConstraints(self):\n \"\"\"Test all eight options for the constraints and rigidWater parameters.\"\"\"\n \n topology = prmtop1.topology\n- for constraints_value in [None, HBonds, AllBonds, HAngles]:\n- for rigidWater_value in [True, False]:\n- system = prmtop1.createSystem(constraints=constraints_value,\n- rigidWater=rigidWater_value)\n- validateConstraints(self, topology, system,\n- constraints_value, rigidWater_value)\n+ for constraints in [None, HBonds, AllBonds, HAngles]:\n+ for rigidWater in [True, False]:\n+ system = prmtop1.createSystem(constraints=constraints, rigidWater=rigidWater)\n+ if constraints != None:\n+ # Amber adds an extra \"bond\" between water hydrogens, so any constraint\n+ # method except None is equivalent to rigidWater=True.\n+ rigidWater = True\n+ validateConstraints(self, topology, system, constraints, rigidWater)\n \n def test_ImplicitSolvent(self):\n \"\"\"Test the four types of implicit solvents using the implicitSolvent\n@@ -460,5 +462,16 @@ def testEPConstraints(self):\n # If a constraint was added to a massless particle, this will throw an exception.\n context = Context(system, integrator, Platform.getPlatformByName('Reference'))\n \n+ def testWaterBonds(self):\n+ \"\"\"Test that water molecules have the right set of bonds\"\"\"\n+ top = prmtop1.topology\n+ for residue in top.residues():\n+ if residue.name == 'HOH':\n+ bonds = list(residue.bonds())\n+ self.assertEqual(2, len(bonds))\n+ for a1, a2 in bonds:\n+ self.assertTrue(a1.element == elem.oxygen or a2.element == elem.oxygen)\n+ self.assertTrue(a1.element == elem.hydrogen or a2.element == elem.hydrogen)\n+\n if __name__ == '__main__':\n unittest.main()\ndiff --git a/wrappers/python/tests/TestForceField.py b/wrappers/python/tests/TestForceField.py\nindex 767c7793d6..d9073b963a 100644\n--- a/wrappers/python/tests/TestForceField.py\n+++ b/wrappers/python/tests/TestForceField.py\n@@ -439,7 +439,6 @@ def test_residueMatcher(self):\n <Atom name=\"H2\" type=\"tip3p-H\" charge=\"0.417\"/>\n <Bond from=\"0\" to=\"1\"/>\n <Bond from=\"0\" to=\"2\"/>\n- <Bond from=\"1\" to=\"2\"/>\n </Residue>\n <Residue name=\"HOH2\">\n <Atom name=\"O\" type=\"tip3p-O\" charge=\"0.834\"/>\n@@ -447,7 +446,6 @@ def test_residueMatcher(self):\n <Atom name=\"H2\" type=\"tip3p-H\" charge=\"-0.417\"/>\n <Bond from=\"0\" to=\"1\"/>\n <Bond from=\"0\" to=\"2\"/>\n- <Bond from=\"1\" to=\"2\"/>\n </Residue>\n </Residues>\n <NonbondedForce coulomb14scale=\"0.833333\" lj14scale=\"0.5\">\n", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}79{"question_id": "MSB_openmm_openmm_pr4231", "question_type": "multi_swe_bench", "description": "CustomCPPForceImpl for writing forces in C++ (openmm/openmm#4231)", "content": {"org": "openmm", "repo": "openmm", "pr_number": 4231, "issue_title": "CustomCPPForceImpl for writing forces in C++", "issue_body": "This is a new piece of infrastructure. It allows you to implement a new force by writing a single implementation in platform-independent C++. This is mainly intended for plugins that interface to other codes. It should allow us to enormously simplify the PLUMED plugin. It also can be used for a plugin that interfaces to xtb, and possibly others in the future. Having most of the infrastructure built in will eliminate a lot of code duplication between different plugins.\r\n\r\nTo give a sense of how simple it can be to write a Force with it, here's the code from the test case. This is a complete, fully functional of implementation of a new Force class that works on all platforms.\r\n\r\n```c++\r\nclass TestForce : public Force {\r\nprotected:\r\n ForceImpl* createImpl() const;\r\n};\r\n\r\nclass TestForceImpl : public CustomCPPForceImpl {\r\npublic:\r\n const TestForce& owner;\r\n TestForceImpl(const TestForce& owner) : CustomCPPForceImpl(owner), owner(owner) {\r\n }\r\n double computeForce(ContextImpl& context, const vector<Vec3>& positions, vector<Vec3>& forces) {\r\n for (int i = 0; i < forces.size(); i++)\r\n forces[i] = Vec3(i, i+1, i+2);\r\n return 10.5;\r\n }\r\n const TestForce& getOwner() const {\r\n return owner;\r\n }\r\n};\r\n\r\nForceImpl* TestForce::createImpl() const {\r\n return new TestForceImpl(*this);\r\n}\r\n```", "base_commit": "e2453f5ec1fc1fd7916e0b398033c3e9ed341877", "resolved_issues": [{"number": null, "title": "CustomCPPForceImpl for writing forces in C++", "body": "### Issue Description\n\n**Problem:** \nDevelopers creating plugins for OpenMM often need to implement custom forces that interface with external libraries or APIs. This process typically requires writing platform-specific code for each supported hardware platform, such as GPU or CPU, which introduces significant complexity and code duplication. Additionally, the need for platform-specific optimizations can be unnecessary when the heavy computations are handled by external libraries, leaving developers to focus solely on transferring data between OpenMM and the external library.\n\n**Expected Behavior:** \nDevelopers should be able to implement custom forces in a straightforward, platform-independent manner using a single C++ implementation. The infrastructure should automatically ensure compatibility across all supported platforms without requiring additional GPU-specific code, kernel factories, or dynamic plugin libraries. This approach should simplify the development process, reduce code duplication, and provide a consistent API for interfacing with external libraries.\n\n## IMPORTANT INSTRUCTIONS\n\n1. If you edit a python file, you MUST run 'make PythonInstall' inside the build directory\n2. If you edit a c++ file, you MUST run 'make -j4 && make install\" inside the build directory"}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/openmm_m_openmm:pr-4231", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/docs-source/developerguide/09_customcppforceimpl.rst b/docs-source/developerguide/09_customcppforceimpl.rst\nnew file mode 100644\nindex 0000000000..9c6bccb48e\n--- /dev/null\n+++ b/docs-source/developerguide/09_customcppforceimpl.rst\n@@ -0,0 +1,52 @@\n+.. role:: code\n+.. raw:: html\n+\n+ <style> .code {font-family:monospace;} </style>\n+ <style> .caption {text-align:center;} </style>\n+\n+.. highlight:: c++\n+\n+\n+.. _customcppforceimpl:\n+\n+Platform-Independent Code with CustomCPPForceImpl\n+#################################################\n+\n+In most cases, Forces are written with platform-specific code that runs as\n+efficiently as possible on the available hardware. There are some situations\n+where that is unnecessarily complicated. For example, you might write a plugin\n+that interfaces to an external library through its own public API. Because all\n+expensive calculations are done by the external library, there is little\n+opportunity for any kind of platform-specific optimization. All you can do is\n+copy positions over to the external library and copy forces back, hopefully in\n+a way that is not too inefficient, and preferably with as little code as\n+possible. CustomCPPForceImpl is a tool for doing that.\n+\n+To use it, you write your Force subclass in the usual way, providing whatever\n+API is appropriate for it. Then for the corresponding ForceImpl, simply\n+subclass CustomCPPForceImpl and override :code:`computeForce()` to perform the\n+calculation using platform-independent C++ code. Nothing more is required. It\n+will automatically work on all platforms. You do not need to write any GPU\n+code, provide a Kernel or KernelFactory, define registration functions, or even\n+create plugin libraries to be loaded dynamically. The single library containing\n+the Force and ForceImpl is all you need.\n+\n+Here is an example of what the code to implement your ForceImpl might look like.\n+::\n+\n+ class ExampleForceImpl : public CustomCPPForceImpl {\n+ public:\n+ ExampleForceImpl(const ExampleForce& owner) : CustomCPPForceImpl(owner), owner(owner) {\n+ }\n+\n+ double computeForce(ContextImpl& context, const vector<Vec3>& positions, vector<Vec3>& forces) {\n+ // Compute the forces and energy here. Store the forces into the\n+ // vector and return the energy.\n+ }\n+\n+ const ExampleForce& getOwner() const {\n+ return owner;\n+ }\n+ private:\n+ const ExampleForce& owner;\n+ };\ndiff --git a/docs-source/developerguide/index.rst b/docs-source/developerguide/index.rst\nindex d35a7ddf32..85ae47ff7b 100644\n--- a/docs-source/developerguide/index.rst\n+++ b/docs-source/developerguide/index.rst\n@@ -18,6 +18,7 @@ OpenMM Developer's Guide\n 06_opencl_platform.rst\n 07_cuda_platform.rst\n 08_common_compute.rst\n+ 09_customcppforceimpl.rst\n \n .. only:: html\n \ndiff --git a/docs-source/developerguide/license.rst b/docs-source/developerguide/license.rst\nindex 1643bda88c..83e1f5c53b 100644\n--- a/docs-source/developerguide/license.rst\n+++ b/docs-source/developerguide/license.rst\n@@ -1,4 +1,4 @@\n-Portions copyright (c) 2011-2020 Stanford University and the Authors\n+Portions copyright (c) 2011-2023 Stanford University and the Authors\n \n Contributors: Peter Eastman\n \ndiff --git a/olla/include/openmm/kernels.h b/olla/include/openmm/kernels.h\nindex 5c6a994bba..a0ca3fb4be 100644\n--- a/olla/include/openmm/kernels.h\n+++ b/olla/include/openmm/kernels.h\n@@ -67,6 +67,7 @@\n #include \"openmm/NoseHooverIntegrator.h\"\n #include \"openmm/NoseHooverChain.h\"\n #include \"openmm/ATMForce.h\"\n+#include \"openmm/internal/CustomCPPForceImpl.h\"\n #include <iosfwd>\n #include <set>\n #include <string>\n@@ -1684,8 +1685,33 @@ class CalcATMForceKernel : public KernelImpl {\n virtual void copyState(ContextImpl& context, ContextImpl& innerContext0, ContextImpl& innerContext1) = 0;\n };\n \n- \n-\n+/**\n+ * This kernel is invoked by CustomCPPForce to calculate the forces acting on the system and the energy of the system.\n+ */\n+class CalcCustomCPPForceKernel : public KernelImpl {\n+public:\n+ static std::string Name() {\n+ return \"CalcCustomCPPForce\";\n+ }\n+ CalcCustomCPPForceKernel(std::string name, const Platform& platform) : KernelImpl(name, platform) {\n+ }\n+ /**\n+ * Initialize the kernel.\n+ *\n+ * @param system the System this kernel will be applied to\n+ * @param force the CustomCPPForceImpl this kernel will be used for\n+ */\n+ virtual void initialize(const System& system, CustomCPPForceImpl& force) = 0;\n+ /**\n+ * Execute the kernel to calculate the forces and/or energy.\n+ *\n+ * @param context the context in which to execute this kernel\n+ * @param includeForces true if forces should be calculated\n+ * @param includeEnergy true if the energy should be calculated\n+ * @return the potential energy due to the force\n+ */\n+ virtual double execute(ContextImpl& context, bool includeForces, bool includeEnergy) = 0;\n+};\n \n } // namespace OpenMM\n \ndiff --git a/openmmapi/include/openmm/internal/CustomCPPForceImpl.h b/openmmapi/include/openmm/internal/CustomCPPForceImpl.h\nnew file mode 100644\nindex 0000000000..41fafb40e9\n--- /dev/null\n+++ b/openmmapi/include/openmm/internal/CustomCPPForceImpl.h\n@@ -0,0 +1,120 @@\n+#ifndef OPENMM_CUSTOMCPPFORCEIMPL_H_\n+#define OPENMM_CUSTOMCPPFORCEIMPL_H_\n+\n+/* -------------------------------------------------------------------------- *\n+ * OpenMM *\n+ * -------------------------------------------------------------------------- *\n+ * This is part of the OpenMM molecular simulation toolkit originating from *\n+ * Simbios, the NIH National Center for Physics-Based Simulation of *\n+ * Biological Structures at Stanford, funded under the NIH Roadmap for *\n+ * Medical Research, grant U54 GM072970. See https://simtk.org. *\n+ * *\n+ * Portions copyright (c) 2023 Stanford University and the Authors. *\n+ * Authors: Peter Eastman *\n+ * Contributors: *\n+ * *\n+ * Permission is hereby granted, free of charge, to any person obtaining a *\n+ * copy of this software and associated documentation files (the \"Software\"), *\n+ * to deal in the Software without restriction, including without limitation *\n+ * the rights to use, copy, modify, merge, publish, distribute, sublicense, *\n+ * and/or sell copies of the Software, and to permit persons to whom the *\n+ * Software is furnished to do so, subject to the following conditions: *\n+ * *\n+ * The above copyright notice and this permission notice shall be included in *\n+ * all copies or substantial portions of the Software. *\n+ * *\n+ * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR *\n+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, *\n+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL *\n+ * THE AUTHORS, CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, *\n+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR *\n+ * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE *\n+ * USE OR OTHER DEALINGS IN THE SOFTWARE. *\n+ * -------------------------------------------------------------------------- */\n+\n+#include \"ForceImpl.h\"\n+#include \"openmm/Kernel.h\"\n+#include \"openmm/Vec3.h\"\n+#include <string>\n+#include <vector>\n+\n+namespace OpenMM {\n+\n+/**\n+ * This class provides an easy way of writing Forces that are implemented entirely\n+ * in C++, and do not involve any platform-specific code. To use it, have your\n+ * ForceImpl extend this class, implementing computeForce() to compute the forces\n+ * and energy in a platform-independent way. You can optionally override other\n+ * methods as well, such as if your Force defines global parameters or bonds\n+ * between atoms.\n+ * \n+ * Most Forces should not be implemented with this class. Writing platform-specific\n+ * code that can run on a GPU and interact directly with internal data structures\n+ * usually leads to much faster performance. This class is useful for special\n+ * situations, such as plugins that interact with external libraries through their\n+ * own public APIs. In that case, there is little opportunity for optimization.\n+ * This class allows you to write a single implementation that is automatically\n+ * used for all platforms.\n+ */\n+\n+class OPENMM_EXPORT CustomCPPForceImpl : public ForceImpl {\n+public:\n+ CustomCPPForceImpl(const Force& owner);\n+ /**\n+ * Subclasses may override this to do their own initialization, but they should\n+ * also call CustomCPPForceImpl::initialize(context) to let the parent class\n+ * initialize its kernel.\n+ * \n+ * @param context the context in which the system is being simulated\n+ */\n+ void initialize(ContextImpl& context);\n+ /**\n+ * Calculate the force on each particle generated by this ForceImpl and/or this ForceImpl's\n+ * contribution to the potential energy of the system.\n+ * \n+ * @param context the context in which the system is being simulated\n+ * @param positions the position of every particle\n+ * @param forces store the force on each particle into this array\n+ * @return this force's contribution to the potential energy of the system, or 0 if this\n+ * force does not contribute to potential energy\n+ */\n+ virtual double computeForce(ContextImpl& context, const std::vector<Vec3>& positions, std::vector<Vec3>& forces) = 0;\n+ /**\n+ * Override this if the force updates the context state directly. In general\n+ * it should only make changes by invoking public methods of the ContextImpl.\n+ * If you need to access platform-specific data structures, this class is\n+ * probably not appropriate.\n+ * \n+ * @param context the context in which the system is being simulated\n+ * @param forcesInvalid if the state was modified in any way that might cause previously\n+ * calculated forces to no longer be valid (such as modifying\n+ * positions or parameters), the method should set this to true.\n+ */\n+ void updateContextState(ContextImpl& context, bool& forcesInvalid) {\n+ }\n+ /**\n+ * Override this if the force defines global parameters.\n+ */\n+ std::map<std::string, double> getDefaultParameters() {\n+ return {};\n+ }\n+ /**\n+ * Override this if the force defines bonds between particles.\n+ */\n+ std::vector<std::pair<int, int> > getBondedParticles() const {\n+ return {};\n+ }\n+ /**\n+ * Override this if the force defines an updateParametersInContext() method.\n+ */\n+ void updateParametersInContext(ContextImpl& context) {\n+ }\n+ double calcForcesAndEnergy(ContextImpl& context, bool includeForces, bool includeEnergy, int groups);\n+ std::vector<std::string> getKernelNames();\n+private:\n+ Kernel kernel;\n+};\n+\n+} // namespace OpenMM\n+\n+#endif /*OPENMM_CUSTOMCPPFORCEIMPL_H_*/\ndiff --git a/openmmapi/src/CustomCPPForceImpl.cpp b/openmmapi/src/CustomCPPForceImpl.cpp\nnew file mode 100644\nindex 0000000000..415662acb1\n--- /dev/null\n+++ b/openmmapi/src/CustomCPPForceImpl.cpp\n@@ -0,0 +1,58 @@\n+/* -------------------------------------------------------------------------- *\n+ * OpenMM *\n+ * -------------------------------------------------------------------------- *\n+ * This is part of the OpenMM molecular simulation toolkit originating from *\n+ * Simbios, the NIH National Center for Physics-Based Simulation of *\n+ * Biological Structures at Stanford, funded under the NIH Roadmap for *\n+ * Medical Research, grant U54 GM072970. See https://simtk.org. *\n+ * *\n+ * Portions copyright (c) 2008-2021 Stanford University and the Authors. *\n+ * Authors: Peter Eastman *\n+ * Contributors: *\n+ * *\n+ * Permission is hereby granted, free of charge, to any person obtaining a *\n+ * copy of this software and associated documentation files (the \"Software\"), *\n+ * to deal in the Software without restriction, including without limitation *\n+ * the rights to use, copy, modify, merge, publish, distribute, sublicense, *\n+ * and/or sell copies of the Software, and to permit persons to whom the *\n+ * Software is furnished to do so, subject to the following conditions: *\n+ * *\n+ * The above copyright notice and this permission notice shall be included in *\n+ * all copies or substantial portions of the Software. *\n+ * *\n+ * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR *\n+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, *\n+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL *\n+ * THE AUTHORS, CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, *\n+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR *\n+ * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE *\n+ * USE OR OTHER DEALINGS IN THE SOFTWARE. *\n+ * -------------------------------------------------------------------------- */\n+\n+#include \"openmm/internal/ContextImpl.h\"\n+#include \"openmm/internal/CustomCPPForceImpl.h\"\n+#include \"openmm/kernels.h\"\n+\n+using namespace OpenMM;\n+using namespace std;\n+\n+CustomCPPForceImpl::CustomCPPForceImpl(const Force& owner) {\n+ forceGroup = owner.getForceGroup();\n+}\n+\n+void CustomCPPForceImpl::initialize(ContextImpl& context) {\n+ kernel = context.getPlatform().createKernel(CalcCustomCPPForceKernel::Name(), context);\n+ kernel.getAs<CalcCustomCPPForceKernel>().initialize(context.getSystem(), *this);\n+}\n+\n+double CustomCPPForceImpl::calcForcesAndEnergy(ContextImpl& context, bool includeForces, bool includeEnergy, int groups) {\n+ if ((groups&(1<<forceGroup)) != 0)\n+ return kernel.getAs<CalcCustomCPPForceKernel>().execute(context, includeForces, includeEnergy);\n+ return 0.0;\n+}\n+\n+vector<string> CustomCPPForceImpl::getKernelNames() {\n+ vector<string> names;\n+ names.push_back(CalcCustomCPPForceKernel::Name());\n+ return names;\n+}\ndiff --git a/platforms/common/include/openmm/common/CommonKernels.h b/platforms/common/include/openmm/common/CommonKernels.h\nindex 3c4badb2f7..b60faf54c6 100644\n--- a/platforms/common/include/openmm/common/CommonKernels.h\n+++ b/platforms/common/include/openmm/common/CommonKernels.h\n@@ -1654,7 +1654,57 @@ class CommonCalcATMForceKernel : public CalcATMForceKernel {\n int numParticles;\n };\n \n- \n+/**\n+ * This kernel is invoked by CustomCPPForce to calculate the forces acting on the system and the energy of the system.\n+ */\n+class CommonCalcCustomCPPForceKernel : public CalcCustomCPPForceKernel {\n+public:\n+ CommonCalcCustomCPPForceKernel(std::string name, const Platform& platform, OpenMM::ContextImpl& contextImpl, ComputeContext& cc) :\n+ CalcCustomCPPForceKernel(name, platform), contextImpl(contextImpl), cc(cc), force(NULL) {\n+ }\n+ /**\n+ * Initialize the kernel.\n+ *\n+ * @param system the System this kernel will be applied to\n+ * @param force the CustomCPPForceImpl this kernel will be used for\n+ */\n+ void initialize(const System& system, CustomCPPForceImpl& force);\n+ /**\n+ * Execute the kernel to calculate the forces and/or energy.\n+ *\n+ * @param context the context in which to execute this kernel\n+ * @param includeForces true if forces should be calculated\n+ * @param includeEnergy true if the energy should be calculated\n+ * @return the potential energy due to the force\n+ */\n+ double execute(ContextImpl& context, bool includeForces, bool includeEnergy);\n+ /**\n+ * The is called by the pre-computation to start the calculation running.\n+ */\n+ void beginComputation(bool includeForces, bool includeEnergy, int groups);\n+ /**\n+ * This is called by the worker thread to do the computation.\n+ */\n+ void executeOnWorkerThread(bool includeForces);\n+ /**\n+ * This is called by the post-computation to add the forces to the main array.\n+ */\n+ double addForces(bool includeForces, bool includeEnergy, int groups);\n+private:\n+ class ExecuteTask;\n+ class StartCalculationPreComputation;\n+ class AddForcesPostComputation;\n+ OpenMM::ContextImpl& contextImpl;\n+ ComputeContext& cc;\n+ CustomCPPForceImpl* force;\n+ ComputeArray forcesArray;\n+ ComputeKernel addForcesKernel;\n+ std::vector<Vec3> positionsVec, forcesVec;\n+ std::vector<float> floatForces;\n+ int forceGroupFlag;\n+ double energy;\n+};\n+\n } // namespace OpenMM\n \n #endif /*OPENMM_COMMONKERNELS_H_*/\ndiff --git a/platforms/common/src/CommonKernels.cpp b/platforms/common/src/CommonKernels.cpp\nindex 0bacfdc31b..6474959527 100644\n--- a/platforms/common/src/CommonKernels.cpp\n+++ b/platforms/common/src/CommonKernels.cpp\n@@ -7974,3 +7974,111 @@ void CommonCalcATMForceKernel::copyParametersToContext(ContextImpl& context, con\n displ1.upload(displVectorContext1);\n displ0.upload(displVectorContext0);\n }\n+\n+class CommonCalcCustomCPPForceKernel::StartCalculationPreComputation : public ComputeContext::ForcePreComputation {\n+public:\n+ StartCalculationPreComputation(CommonCalcCustomCPPForceKernel& owner) : owner(owner) {\n+ }\n+ void computeForceAndEnergy(bool includeForces, bool includeEnergy, int groups) {\n+ owner.beginComputation(includeForces, includeEnergy, groups);\n+ }\n+ CommonCalcCustomCPPForceKernel& owner;\n+};\n+\n+class CommonCalcCustomCPPForceKernel::ExecuteTask : public ComputeContext::WorkTask {\n+public:\n+ ExecuteTask(CommonCalcCustomCPPForceKernel& owner, bool includeForces) : owner(owner), includeForces(includeForces) {\n+ }\n+ void execute() {\n+ owner.executeOnWorkerThread(includeForces);\n+ }\n+ CommonCalcCustomCPPForceKernel& owner;\n+ bool includeForces;\n+};\n+\n+class CommonCalcCustomCPPForceKernel::AddForcesPostComputation : public ComputeContext::ForcePostComputation {\n+public:\n+ AddForcesPostComputation(CommonCalcCustomCPPForceKernel& owner) : owner(owner) {\n+ }\n+ double computeForceAndEnergy(bool includeForces, bool includeEnergy, int groups) {\n+ return owner.addForces(includeForces, includeEnergy, groups);\n+ }\n+ CommonCalcCustomCPPForceKernel& owner;\n+};\n+\n+void CommonCalcCustomCPPForceKernel::initialize(const System& system, CustomCPPForceImpl& force) {\n+ ContextSelector selector(cc);\n+ this->force = &force;\n+ int numParticles = system.getNumParticles();\n+ forcesVec.resize(numParticles);\n+ positionsVec.resize(numParticles);\n+ floatForces.resize(3*numParticles);\n+ int elementSize = (cc.getUseDoublePrecision() ? sizeof(double) : sizeof(float));\n+ forcesArray.initialize(cc, 3*numParticles, elementSize, \"forces\");\n+ map<string, string> defines;\n+ defines[\"NUM_ATOMS\"] = cc.intToString(numParticles);\n+ defines[\"PADDED_NUM_ATOMS\"] = cc.intToString(cc.getPaddedNumAtoms());\n+ ComputeProgram program = cc.compileProgram(CommonKernelSources::customCppForce, defines);\n+ addForcesKernel = program->createKernel(\"addForces\");\n+ addForcesKernel->addArg(forcesArray);\n+ addForcesKernel->addArg(cc.getLongForceBuffer());\n+ addForcesKernel->addArg(cc.getAtomIndexArray());\n+ forceGroupFlag = (1<<force.getOwner().getForceGroup());\n+ cc.addPreComputation(new StartCalculationPreComputation(*this));\n+ cc.addPostComputation(new AddForcesPostComputation(*this));\n+}\n+\n+double CommonCalcCustomCPPForceKernel::execute(ContextImpl& context, bool includeForces, bool includeEnergy) {\n+ // This method does nothing. The actual calculation is started by the pre-computation, continued on\n+ // the worker thread, and finished by the post-computation.\n+ \n+ return 0;\n+}\n+\n+void CommonCalcCustomCPPForceKernel::beginComputation(bool includeForces, bool includeEnergy, int groups) {\n+ if ((groups&forceGroupFlag) == 0)\n+ return;\n+ contextImpl.getPositions(positionsVec);\n+ \n+ // The actual force computation will be done on a different thread.\n+ \n+ cc.getWorkThread().addTask(new ExecuteTask(*this, includeForces));\n+}\n+\n+void CommonCalcCustomCPPForceKernel::executeOnWorkerThread(bool includeForces) {\n+ energy = force->computeForce(contextImpl, positionsVec, forcesVec);\n+ if (includeForces) {\n+ ContextSelector selector(cc);\n+ int numParticles = cc.getNumAtoms();\n+ if (cc.getUseDoublePrecision())\n+ forcesArray.upload((double*) forcesVec.data());\n+ else {\n+ for (int i = 0; i < numParticles; i++) {\n+ floatForces[3*i] = (float) forcesVec[i][0];\n+ floatForces[3*i+1] = (float) forcesVec[i][1];\n+ floatForces[3*i+2] = (float) forcesVec[i][2];\n+ }\n+ forcesArray.upload(floatForces);\n+ }\n+ }\n+}\n+\n+double CommonCalcCustomCPPForceKernel::addForces(bool includeForces, bool includeEnergy, int groups) {\n+ if ((groups&forceGroupFlag) == 0)\n+ return 0;\n+\n+ // Wait until executeOnWorkerThread() is finished.\n+ \n+ cc.getWorkThread().flush();\n+\n+ // Add in the forces.\n+ \n+ if (includeForces) {\n+ ContextSelector selector(cc);\n+ addForcesKernel->execute(cc.getNumAtoms());\n+ }\n+ \n+ // Return the energy.\n+ \n+ return energy;\n+}\n\\ No newline at end of file\ndiff --git a/platforms/common/src/kernels/customCppForce.cc b/platforms/common/src/kernels/customCppForce.cc\nnew file mode 100644\nindex 0000000000..49e34a7a3a\n--- /dev/null\n+++ b/platforms/common/src/kernels/customCppForce.cc\n@@ -0,0 +1,8 @@\n+KERNEL void addForces(GLOBAL const real* RESTRICT forces, GLOBAL mm_long* RESTRICT forceBuffers, GLOBAL int* RESTRICT atomIndex) {\n+ for (int atom = GLOBAL_ID; atom < NUM_ATOMS; atom += GLOBAL_SIZE) {\n+ int index = atomIndex[atom];\n+ forceBuffers[atom] += (mm_long) (forces[3*index]*0x100000000);\n+ forceBuffers[atom+PADDED_NUM_ATOMS] += (mm_long) (forces[3*index+1]*0x100000000);\n+ forceBuffers[atom+2*PADDED_NUM_ATOMS] += (mm_long) (forces[3*index+2]*0x100000000);\n+ }\n+}\ndiff --git a/platforms/cuda/src/CudaKernelFactory.cpp b/platforms/cuda/src/CudaKernelFactory.cpp\nindex 42b3fd943a..7298264b36 100644\n--- a/platforms/cuda/src/CudaKernelFactory.cpp\n+++ b/platforms/cuda/src/CudaKernelFactory.cpp\n@@ -6,7 +6,7 @@\n * Biological Structures at Stanford, funded under the NIH Roadmap for *\n * Medical Research, grant U54 GM072970. See https://simtk.org. *\n * *\n- * Portions copyright (c) 2008-2019 Stanford University and the Authors. *\n+ * Portions copyright (c) 2008-2023 Stanford University and the Authors. *\n * Authors: Peter Eastman *\n * Contributors: *\n * *\n@@ -113,6 +113,8 @@ KernelImpl* CudaKernelFactory::createKernelImpl(std::string name, const Platform\n return new CudaCalcCustomCVForceKernel(name, platform, cu);\n if (name == CalcATMForceKernel::Name())\n return new CudaCalcATMForceKernel(name, platform, cu);\n+ if (name == CalcCustomCPPForceKernel::Name())\n+ return new CommonCalcCustomCPPForceKernel(name, platform, context, cu);\n if (name == CalcRMSDForceKernel::Name())\n return new CommonCalcRMSDForceKernel(name, platform, cu);\n if (name == CalcCustomManyParticleForceKernel::Name())\ndiff --git a/platforms/cuda/src/CudaPlatform.cpp b/platforms/cuda/src/CudaPlatform.cpp\nindex 465eb0c944..1ff097ac93 100644\n--- a/platforms/cuda/src/CudaPlatform.cpp\n+++ b/platforms/cuda/src/CudaPlatform.cpp\n@@ -91,6 +91,7 @@ CudaPlatform::CudaPlatform() {\n registerKernelFactory(CalcCustomHbondForceKernel::Name(), factory);\n registerKernelFactory(CalcCustomCentroidBondForceKernel::Name(), factory);\n registerKernelFactory(CalcCustomCompoundBondForceKernel::Name(), factory);\n+ registerKernelFactory(CalcCustomCPPForceKernel::Name(), factory);\n registerKernelFactory(CalcCustomCVForceKernel::Name(), factory);\n registerKernelFactory(CalcATMForceKernel::Name(), factory);\n registerKernelFactory(CalcRMSDForceKernel::Name(), factory);\ndiff --git a/platforms/opencl/src/OpenCLKernelFactory.cpp b/platforms/opencl/src/OpenCLKernelFactory.cpp\nindex bdd7c4457b..b55f1a07cd 100644\n--- a/platforms/opencl/src/OpenCLKernelFactory.cpp\n+++ b/platforms/opencl/src/OpenCLKernelFactory.cpp\n@@ -6,7 +6,7 @@\n * Biological Structures at Stanford, funded under the NIH Roadmap for *\n * Medical Research, grant U54 GM072970. See https://simtk.org. *\n * *\n- * Portions copyright (c) 2008-2019 Stanford University and the Authors. *\n+ * Portions copyright (c) 2008-2023 Stanford University and the Authors. *\n * Authors: Peter Eastman *\n * Contributors: *\n * *\n@@ -110,7 +110,9 @@ KernelImpl* OpenCLKernelFactory::createKernelImpl(std::string name, const Platfo\n if (name == CalcCustomCVForceKernel::Name())\n return new OpenCLCalcCustomCVForceKernel(name, platform, cl);\n if (name == CalcATMForceKernel::Name())\n- return new OpenCLCalcATMForceKernel(name, platform, cl); \n+ return new OpenCLCalcATMForceKernel(name, platform, cl);\n+ if (name == CalcCustomCPPForceKernel::Name())\n+ return new CommonCalcCustomCPPForceKernel(name, platform, context, cl);\n if (name == CalcRMSDForceKernel::Name())\n return new CommonCalcRMSDForceKernel(name, platform, cl);\n if (name == CalcCustomManyParticleForceKernel::Name())\ndiff --git a/platforms/opencl/src/OpenCLPlatform.cpp b/platforms/opencl/src/OpenCLPlatform.cpp\nindex 8bfed33a3d..feaa15a25d 100644\n--- a/platforms/opencl/src/OpenCLPlatform.cpp\n+++ b/platforms/opencl/src/OpenCLPlatform.cpp\n@@ -6,7 +6,7 @@\n * Biological Structures at Stanford, funded under the NIH Roadmap for *\n * Medical Research, grant U54 GM072970. See https://simtk.org. *\n * *\n- * Portions copyright (c) 2008-2018 Stanford University and the Authors. *\n+ * Portions copyright (c) 2008-2023 Stanford University and the Authors. *\n * Authors: Peter Eastman *\n * Contributors: *\n * *\n@@ -82,6 +82,7 @@ OpenCLPlatform::OpenCLPlatform() {\n registerKernelFactory(CalcCustomHbondForceKernel::Name(), factory);\n registerKernelFactory(CalcCustomCentroidBondForceKernel::Name(), factory);\n registerKernelFactory(CalcCustomCompoundBondForceKernel::Name(), factory);\n+ registerKernelFactory(CalcCustomCPPForceKernel::Name(), factory);\n registerKernelFactory(CalcCustomCVForceKernel::Name(), factory);\n registerKernelFactory(CalcATMForceKernel::Name(), factory);\n registerKernelFactory(CalcRMSDForceKernel::Name(), factory);\ndiff --git a/platforms/reference/include/ReferenceKernels.h b/platforms/reference/include/ReferenceKernels.h\nindex 22ea8f71a0..962cc26c13 100644\n--- a/platforms/reference/include/ReferenceKernels.h\n+++ b/platforms/reference/include/ReferenceKernels.h\n@@ -34,6 +34,7 @@\n \n #include \"ReferencePlatform.h\"\n #include \"openmm/kernels.h\"\n+#include \"openmm/internal/CustomCPPForceImpl.h\"\n #include \"openmm/internal/CustomNonbondedForceImpl.h\"\n #include \"SimTKOpenMMRealType.h\"\n #include \"ReferenceNeighborList.h\"\n@@ -1680,6 +1681,34 @@ class ReferenceCalcATMForceKernel : public CalcATMForceKernel {\n std::vector<Vec3> displ0;\n };\n \n+/**\n+ * This kernel is invoked by CustomCPPForceImpl to calculate the forces acting on the system and the energy of the system.\n+ */\n+class ReferenceCalcCustomCPPForceKernel : public CalcCustomCPPForceKernel {\n+public:\n+ ReferenceCalcCustomCPPForceKernel(std::string name, const Platform& platform) : CalcCustomCPPForceKernel(name, platform), force(NULL) {\n+ }\n+ /**\n+ * Initialize the kernel.\n+ *\n+ * @param system the System this kernel will be applied to\n+ * @param force the CustomCPPForceImpl this kernel will be used for\n+ */\n+ void initialize(const System& system, CustomCPPForceImpl& force);\n+ /**\n+ * Execute the kernel to calculate the forces and/or energy.\n+ *\n+ * @param context the context in which to execute this kernel\n+ * @param includeForces true if forces should be calculated\n+ * @param includeEnergy true if the energy should be calculated\n+ * @return the potential energy due to the force\n+ */\n+ double execute(ContextImpl& context, bool includeForces, bool includeEnergy);\n+private:\n+ CustomCPPForceImpl* force;\n+ std::vector<Vec3> forces;\n+};\n+\n } // namespace OpenMM\n \n #endif /*OPENMM_REFERENCEKERNELS_H_*/\ndiff --git a/platforms/reference/src/ReferenceKernelFactory.cpp b/platforms/reference/src/ReferenceKernelFactory.cpp\nindex bba17d0439..35c72d049d 100644\n--- a/platforms/reference/src/ReferenceKernelFactory.cpp\n+++ b/platforms/reference/src/ReferenceKernelFactory.cpp\n@@ -82,6 +82,8 @@ KernelImpl* ReferenceKernelFactory::createKernelImpl(std::string name, const Pla\n return new ReferenceCalcCustomCVForceKernel(name, platform);\n if (name == CalcATMForceKernel::Name())\n return new ReferenceCalcATMForceKernel(name, platform);\n+ if (name == CalcCustomCPPForceKernel::Name())\n+ return new ReferenceCalcCustomCPPForceKernel(name, platform);\n if (name == CalcRMSDForceKernel::Name())\n return new ReferenceCalcRMSDForceKernel(name, platform);\n if (name == CalcCustomManyParticleForceKernel::Name())\ndiff --git a/platforms/reference/src/ReferenceKernels.cpp b/platforms/reference/src/ReferenceKernels.cpp\nindex 0fc8eb177c..d9e94a4f11 100644\n--- a/platforms/reference/src/ReferenceKernels.cpp\n+++ b/platforms/reference/src/ReferenceKernels.cpp\n@@ -3032,3 +3032,18 @@ void ReferenceCalcATMForceKernel::copyParametersToContext(ContextImpl& context,\n displ0[i] = displacement0;\n }\n }\n+\n+void ReferenceCalcCustomCPPForceKernel::initialize(const System& system, CustomCPPForceImpl& force) {\n+ this->force = &force;\n+ forces.resize(system.getNumParticles());\n+}\n+\n+double ReferenceCalcCustomCPPForceKernel::execute(ContextImpl& context, bool includeForces, bool includeEnergy) {\n+ vector<Vec3>& posData = extractPositions(context);\n+ vector<Vec3>& forceData = extractForces(context);\n+ double energy = force->computeForce(context, posData, forces);\n+ if (includeForces)\n+ for (int i = 0; i < forces.size(); i++)\n+ forceData[i] += forces[i];\n+ return energy;\n+}\ndiff --git a/platforms/reference/src/ReferencePlatform.cpp b/platforms/reference/src/ReferencePlatform.cpp\nindex 09c7368058..8269f7cf7a 100644\n--- a/platforms/reference/src/ReferencePlatform.cpp\n+++ b/platforms/reference/src/ReferencePlatform.cpp\n@@ -61,6 +61,7 @@ ReferencePlatform::ReferencePlatform() {\n registerKernelFactory(CalcCustomHbondForceKernel::Name(), factory);\n registerKernelFactory(CalcCustomCentroidBondForceKernel::Name(), factory);\n registerKernelFactory(CalcCustomCompoundBondForceKernel::Name(), factory);\n+ registerKernelFactory(CalcCustomCPPForceKernel::Name(), factory);\n registerKernelFactory(CalcCustomCVForceKernel::Name(), factory);\n registerKernelFactory(CalcATMForceKernel::Name(), factory);\n registerKernelFactory(CalcRMSDForceKernel::Name(), factory);\n"}, "test": {"test_patch": "diff --git a/platforms/cpu/tests/TestCpuCustomCPPForce.cpp b/platforms/cpu/tests/TestCpuCustomCPPForce.cpp\nnew file mode 100644\nindex 0000000000..aa4c42ea68\n--- /dev/null\n+++ b/platforms/cpu/tests/TestCpuCustomCPPForce.cpp\n@@ -0,0 +1,37 @@\n+/* -------------------------------------------------------------------------- *\n+ * OpenMM *\n+ * -------------------------------------------------------------------------- *\n+ * This is part of the OpenMM molecular simulation toolkit originating from *\n+ * Simbios, the NIH National Center for Physics-Based Simulation of *\n+ * Biological Structures at Stanford, funded under the NIH Roadmap for *\n+ * Medical Research, grant U54 GM072970. See https://simtk.org. *\n+ * *\n+ * Portions copyright (c) 2023 Stanford University and the Authors. *\n+ * Authors: Peter Eastman *\n+ * Contributors: *\n+ * *\n+ * Permission is hereby granted, free of charge, to any person obtaining a *\n+ * copy of this software and associated documentation files (the \"Software\"), *\n+ * to deal in the Software without restriction, including without limitation *\n+ * the rights to use, copy, modify, merge, publish, distribute, sublicense, *\n+ * and/or sell copies of the Software, and to permit persons to whom the *\n+ * Software is furnished to do so, subject to the following conditions: *\n+ * *\n+ * The above copyright notice and this permission notice shall be included in *\n+ * all copies or substantial portions of the Software. *\n+ * *\n+ * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR *\n+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, *\n+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL *\n+ * THE AUTHORS, CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, *\n+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR *\n+ * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE *\n+ * USE OR OTHER DEALINGS IN THE SOFTWARE. *\n+ * -------------------------------------------------------------------------- */\n+\n+#include \"CpuTests.h\"\n+#include \"TestCustomCPPForce.h\"\n+\n+void runPlatformTests() {\n+}\n+\ndiff --git a/platforms/cuda/tests/TestCudaCustomCPPForce.cpp b/platforms/cuda/tests/TestCudaCustomCPPForce.cpp\nnew file mode 100644\nindex 0000000000..f294405cf6\n--- /dev/null\n+++ b/platforms/cuda/tests/TestCudaCustomCPPForce.cpp\n@@ -0,0 +1,37 @@\n+/* -------------------------------------------------------------------------- *\n+ * OpenMM *\n+ * -------------------------------------------------------------------------- *\n+ * This is part of the OpenMM molecular simulation toolkit originating from *\n+ * Simbios, the NIH National Center for Physics-Based Simulation of *\n+ * Biological Structures at Stanford, funded under the NIH Roadmap for *\n+ * Medical Research, grant U54 GM072970. See https://simtk.org. *\n+ * *\n+ * Portions copyright (c) 2023 Stanford University and the Authors. *\n+ * Authors: Peter Eastman *\n+ * Contributors: *\n+ * *\n+ * Permission is hereby granted, free of charge, to any person obtaining a *\n+ * copy of this software and associated documentation files (the \"Software\"), *\n+ * to deal in the Software without restriction, including without limitation *\n+ * the rights to use, copy, modify, merge, publish, distribute, sublicense, *\n+ * and/or sell copies of the Software, and to permit persons to whom the *\n+ * Software is furnished to do so, subject to the following conditions: *\n+ * *\n+ * The above copyright notice and this permission notice shall be included in *\n+ * all copies or substantial portions of the Software. *\n+ * *\n+ * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR *\n+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, *\n+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL *\n+ * THE AUTHORS, CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, *\n+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR *\n+ * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE *\n+ * USE OR OTHER DEALINGS IN THE SOFTWARE. *\n+ * -------------------------------------------------------------------------- */\n+\n+#include \"CudaTests.h\"\n+#include \"TestCustomCPPForce.h\"\n+\n+void runPlatformTests() {\n+}\n+\ndiff --git a/platforms/opencl/tests/TestOpenCLCustomCPPForce.cpp b/platforms/opencl/tests/TestOpenCLCustomCPPForce.cpp\nnew file mode 100644\nindex 0000000000..da89dea302\n--- /dev/null\n+++ b/platforms/opencl/tests/TestOpenCLCustomCPPForce.cpp\n@@ -0,0 +1,37 @@\n+/* -------------------------------------------------------------------------- *\n+ * OpenMM *\n+ * -------------------------------------------------------------------------- *\n+ * This is part of the OpenMM molecular simulation toolkit originating from *\n+ * Simbios, the NIH National Center for Physics-Based Simulation of *\n+ * Biological Structures at Stanford, funded under the NIH Roadmap for *\n+ * Medical Research, grant U54 GM072970. See https://simtk.org. *\n+ * *\n+ * Portions copyright (c) 2023 Stanford University and the Authors. *\n+ * Authors: Peter Eastman *\n+ * Contributors: *\n+ * *\n+ * Permission is hereby granted, free of charge, to any person obtaining a *\n+ * copy of this software and associated documentation files (the \"Software\"), *\n+ * to deal in the Software without restriction, including without limitation *\n+ * the rights to use, copy, modify, merge, publish, distribute, sublicense, *\n+ * and/or sell copies of the Software, and to permit persons to whom the *\n+ * Software is furnished to do so, subject to the following conditions: *\n+ * *\n+ * The above copyright notice and this permission notice shall be included in *\n+ * all copies or substantial portions of the Software. *\n+ * *\n+ * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR *\n+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, *\n+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL *\n+ * THE AUTHORS, CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, *\n+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR *\n+ * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE *\n+ * USE OR OTHER DEALINGS IN THE SOFTWARE. *\n+ * -------------------------------------------------------------------------- */\n+\n+#include \"OpenCLTests.h\"\n+#include \"TestCustomCPPForce.h\"\n+\n+void runPlatformTests() {\n+}\n+\ndiff --git a/platforms/reference/tests/TestReferenceCustomCPPForce.cpp b/platforms/reference/tests/TestReferenceCustomCPPForce.cpp\nnew file mode 100644\nindex 0000000000..57d9e2f2d6\n--- /dev/null\n+++ b/platforms/reference/tests/TestReferenceCustomCPPForce.cpp\n@@ -0,0 +1,37 @@\n+/* -------------------------------------------------------------------------- *\n+ * OpenMM *\n+ * -------------------------------------------------------------------------- *\n+ * This is part of the OpenMM molecular simulation toolkit originating from *\n+ * Simbios, the NIH National Center for Physics-Based Simulation of *\n+ * Biological Structures at Stanford, funded under the NIH Roadmap for *\n+ * Medical Research, grant U54 GM072970. See https://simtk.org. *\n+ * *\n+ * Portions copyright (c) 2023 Stanford University and the Authors. *\n+ * Authors: Peter Eastman *\n+ * Contributors: *\n+ * *\n+ * Permission is hereby granted, free of charge, to any person obtaining a *\n+ * copy of this software and associated documentation files (the \"Software\"), *\n+ * to deal in the Software without restriction, including without limitation *\n+ * the rights to use, copy, modify, merge, publish, distribute, sublicense, *\n+ * and/or sell copies of the Software, and to permit persons to whom the *\n+ * Software is furnished to do so, subject to the following conditions: *\n+ * *\n+ * The above copyright notice and this permission notice shall be included in *\n+ * all copies or substantial portions of the Software. *\n+ * *\n+ * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR *\n+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, *\n+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL *\n+ * THE AUTHORS, CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, *\n+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR *\n+ * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE *\n+ * USE OR OTHER DEALINGS IN THE SOFTWARE. *\n+ * -------------------------------------------------------------------------- */\n+\n+\n+#include \"ReferenceTests.h\"\n+#include \"TestCustomCPPForce.h\"\n+\n+void runPlatformTests() {\n+}\ndiff --git a/tests/TestCustomCPPForce.h b/tests/TestCustomCPPForce.h\nnew file mode 100644\nindex 0000000000..e2832038f1\n--- /dev/null\n+++ b/tests/TestCustomCPPForce.h\n@@ -0,0 +1,111 @@\n+/* -------------------------------------------------------------------------- *\n+ * OpenMM *\n+ * -------------------------------------------------------------------------- *\n+ * This is part of the OpenMM molecular simulation toolkit originating from *\n+ * Simbios, the NIH National Center for Physics-Based Simulation of *\n+ * Biological Structures at Stanford, funded under the NIH Roadmap for *\n+ * Medical Research, grant U54 GM072970. See https://simtk.org. *\n+ * *\n+ * Portions copyright (c) 2023 Stanford University and the Authors. *\n+ * Authors: Peter Eastman *\n+ * Contributors: *\n+ * *\n+ * Permission is hereby granted, free of charge, to any person obtaining a *\n+ * copy of this software and associated documentation files (the \"Software\"), *\n+ * to deal in the Software without restriction, including without limitation *\n+ * the rights to use, copy, modify, merge, publish, distribute, sublicense, *\n+ * and/or sell copies of the Software, and to permit persons to whom the *\n+ * Software is furnished to do so, subject to the following conditions: *\n+ * *\n+ * The above copyright notice and this permission notice shall be included in *\n+ * all copies or substantial portions of the Software. *\n+ * *\n+ * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR *\n+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, *\n+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL *\n+ * THE AUTHORS, CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, *\n+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR *\n+ * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE *\n+ * USE OR OTHER DEALINGS IN THE SOFTWARE. *\n+ * -------------------------------------------------------------------------- */\n+\n+#include \"openmm/internal/AssertionUtilities.h\"\n+#include \"openmm/Context.h\"\n+#include \"openmm/NonbondedForce.h\"\n+#include \"openmm/internal/CustomCPPForceImpl.h\"\n+#include \"openmm/System.h\"\n+#include \"openmm/VerletIntegrator.h\"\n+#include <iostream>\n+#include <vector>\n+\n+using namespace OpenMM;\n+using namespace std;\n+\n+class TestForce : public Force {\n+protected:\n+ ForceImpl* createImpl() const;\n+};\n+\n+class TestForceImpl : public CustomCPPForceImpl {\n+public:\n+ const TestForce& owner;\n+ TestForceImpl(const TestForce& owner) : CustomCPPForceImpl(owner), owner(owner) {\n+ }\n+ double computeForce(ContextImpl& context, const vector<Vec3>& positions, vector<Vec3>& forces) {\n+ for (int i = 0; i < forces.size(); i++)\n+ forces[i] = Vec3(i, i+1, i+2);\n+ return 10.5;\n+ }\n+ const TestForce& getOwner() const {\n+ return owner;\n+ }\n+};\n+\n+ForceImpl* TestForce::createImpl() const {\n+ return new TestForceImpl(*this);\n+}\n+\n+void testForce() {\n+ int numParticles = 3;\n+ System system;\n+ NonbondedForce* nb = new NonbondedForce();\n+ TestForce* test = new TestForce();\n+ nb->setForceGroup(0);\n+ test->setForceGroup(1);\n+ system.addForce(test);\n+ system.addForce(nb);\n+ vector<Vec3> positions;\n+ for (int i = 0; i < numParticles; i++) {\n+ system.addParticle(1.0);\n+ nb->addParticle(0.0, 0.5, 1.0);\n+ positions.push_back(Vec3(0.6*i, 0, 0));\n+ }\n+ VerletIntegrator integrator(0.01);\n+ Context context(system, integrator, platform);\n+ context.setPositions(positions);\n+ State state1 = context.getState(State::Forces | State::Energy);\n+ State state2 = context.getState(State::Forces | State::Energy, false, 1<<0);\n+ State state3 = context.getState(State::Forces | State::Energy, false, 1<<1);\n+ ASSERT_EQUAL_TOL(10.5, state3.getPotentialEnergy(), 1e-6);\n+ ASSERT_EQUAL_TOL(state1.getPotentialEnergy(), state2.getPotentialEnergy()+state3.getPotentialEnergy(), 1e-6);\n+ for (int i = 0; i < numParticles; i++) {\n+ ASSERT_EQUAL_VEC(Vec3(i, i+1, i+2), state3.getForces()[i], 1e-6);\n+ ASSERT_EQUAL_VEC(state1.getForces()[i], state2.getForces()[i]+state3.getForces()[i], 1e-6);\n+ }\n+}\n+\n+void runPlatformTests();\n+\n+int main(int argc, char* argv[]) {\n+ try {\n+ initializeTests(argc, argv);\n+ testForce();\n+ runPlatformTests();\n+ }\n+ catch(const exception& e) {\n+ cout << \"exception: \" << e.what() << endl;\n+ return 1;\n+ }\n+ cout << \"Done\" << endl;\n+ return 0;\n+}\n", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}80{"question_id": "MSB_openmm_openmm_pr4317", "question_type": "multi_swe_bench", "description": "Serialization proxy for ATMForce did not record the particles (openmm/openmm#4317)", "content": {"org": "openmm", "repo": "openmm", "pr_number": 4317, "issue_title": "Serialization proxy for ATMForce did not record the particles", "issue_body": "Fixes #4316.", "base_commit": "31abb2f7a34e8ef5c17bc52207fb0d226bf5d703", "resolved_issues": [{"number": 4316, "title": "`ATMForce` SIGSEGV's after copying / serialization", "body": "Copying (or serializing / deserializing) a system that contains an ATM force, and then using that system in a context yields a segfault:\r\n\r\n```\r\nimport openmm\r\n\r\nnb_force = openmm.NonbondedForce()\r\nnb_force.addParticle(0.0, 1.0, 1.0)\r\n\r\natm_force = openmm.ATMForce(0.0, 0.0, 0.0, 0.0, 0.0, 100.0, 50.0, 1.0 / 16.0, 1)\r\natm_force.addParticle(openmm.Vec3(0.0, 0.0, 0.0))\r\natm_force.addForce(nb_force)\r\n\r\nsystem = openmm.System()\r\nsystem.addParticle(1.0)\r\nsystem.addForce(atm_force)\r\n\r\nsystem = openmm.XmlSerializer.deserialize(openmm.XmlSerializer.serialize(system))\r\n\r\ncontext = openmm.Context(system, openmm.VerletIntegrator(1.0))\r\ncontext.setPositions([openmm.Vec3(0.0, 0.0, 0.0)] * openmm.unit.angstrom)\r\n\r\nprint(context.getState(getEnergy=True).getPotentialEnergy(), flush=True)\r\n```\r\n\r\nremoving the `system = openmm.XmlSerializer.deserialize(openmm.XmlSerializer.serialize(system))` line yields an energy of 0.0 as exepcted without any segfaults.\n\n## IMPORTANT INSTRUCTIONS\n\n1. If you edit a python file, you MUST run 'make PythonInstall' inside the build directory\n2. If you edit a c++ file, you MUST run 'make -j4 && make install\" inside the build directory"}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/openmm_m_openmm:pr-4317", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/serialization/src/ATMForceProxy.cpp b/serialization/src/ATMForceProxy.cpp\nindex d86cbd4a50..75d70fb6f8 100644\n--- a/serialization/src/ATMForceProxy.cpp\n+++ b/serialization/src/ATMForceProxy.cpp\n@@ -60,6 +60,13 @@ void ATMForceProxy::serialize(const void* object, SerializationNode& node) const\n SerializationNode& f = forces.createChildNode(\"Force\");\n f.createChildNode(\"Force\", &force.getForce(i));\n }\n+ SerializationNode& particles = node.createChildNode(\"Particles\");\n+ for (int i = 0; i < force.getNumParticles(); i++) {\n+ Vec3 d1, d0;\n+ force.getParticleParameters(i, d1, d0);\n+ particles.createChildNode(\"Particle\").setDoubleProperty(\"d1x\", d1[0]).setDoubleProperty(\"d1y\", d1[1]).setDoubleProperty(\"d1z\", d1[2])\n+ .setDoubleProperty(\"d0x\", d0[0]).setDoubleProperty(\"d0y\", d0[1]).setDoubleProperty(\"d0z\", d0[2]);\n+ }\n }\n \n void* ATMForceProxy::deserialize(const SerializationNode& node) const {\n@@ -80,6 +87,10 @@ void* ATMForceProxy::deserialize(const SerializationNode& node) const {\n const SerializationNode& forces = node.getChildNode(\"Forces\");\n for (auto& f : forces.getChildren())\n force->addForce(f.getChildren()[0].decodeObject<Force>());\n+ const SerializationNode& particles = node.getChildNode(\"Particles\");\n+ for (auto& p : particles.getChildren())\n+ force->addParticle(Vec3(p.getDoubleProperty(\"d1x\"), p.getDoubleProperty(\"d1y\"), p.getDoubleProperty(\"d1z\")),\n+ Vec3(p.getDoubleProperty(\"d0x\"), p.getDoubleProperty(\"d0y\"), p.getDoubleProperty(\"d0z\")));\n return force;\n }\n catch (...) {\n"}, "test": {"test_patch": "diff --git a/serialization/tests/TestSerializeATMForce.cpp b/serialization/tests/TestSerializeATMForce.cpp\nindex e55f2fe5f4..641ff0d46a 100644\n--- a/serialization/tests/TestSerializeATMForce.cpp\n+++ b/serialization/tests/TestSerializeATMForce.cpp\n@@ -55,6 +55,8 @@ void testSerialization() {\n HarmonicAngleForce* v2 = new HarmonicAngleForce();\n v2->addAngle(3, 11, 15, 0.4, 0.2);\n force.addForce(v2);\n+ force.addParticle(Vec3(1, 2, 3));\n+ force.addParticle(Vec3(0, 0, -1), Vec3(3, 2, 1));\n \n // Serialize and then deserialize it.\n \n@@ -83,6 +85,14 @@ void testSerialization() {\n XmlSerializer::serialize<Force>(&force2.getForce(i), \"Force\", buffer2);\n ASSERT_EQUAL(buffer1.str(), buffer2.str());\n }\n+ ASSERT_EQUAL(force.getNumParticles(), force2.getNumParticles());\n+ for (int i = 0; i < force.getNumParticles(); i++) {\n+ Vec3 d1a, d1b, d0a, d0b;\n+ force.getParticleParameters(i, d1a, d0a);\n+ force2.getParticleParameters(i, d1b, d0b);\n+ ASSERT_EQUAL_VEC(d1a, d1b, 0.0);\n+ ASSERT_EQUAL_VEC(d0a, d0b, 0.0);\n+ }\n }\n \n int main() {\n", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}81{"question_id": "MSB_openmm_openmm_pr4319", "question_type": "multi_swe_bench", "description": "Fixes to Python API for ATMForce (openmm/openmm#4319)", "content": {"org": "openmm", "repo": "openmm", "pr_number": 4319, "issue_title": "Fixes to Python API for ATMForce", "issue_body": "Fixes #4313.", "base_commit": "2ab3b77d946cf5d9b705d3d3b4edd96314d62aa5", "resolved_issues": [{"number": 4313, "title": "`ATMForce.getParticleParameters` python wrapper requires displacement vectors", "body": "The python wrapper around the `getParticleParameters` method on the new `ATMForce` seems to want you to pass in two `Vec3` pointers that presumably the C++ layer will then update with the displacements set for particle `i`.\r\n\r\nWas this the intention, or should the exposed python version of the method take only an index and instead return the `Vec3` displacements?\n\n## IMPORTANT INSTRUCTIONS\n\n1. If you edit a python file, you MUST run 'make PythonInstall' inside the build directory\n2. If you edit a c++ file, you MUST run 'make -j4 && make install\" inside the build directory"}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/openmm_m_openmm:pr-4319", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/wrappers/python/src/swig_doxygen/swigInputConfig.py b/wrappers/python/src/swig_doxygen/swigInputConfig.py\nindex 24b598ae98..4c110b7be8 100755\n--- a/wrappers/python/src/swig_doxygen/swigInputConfig.py\n+++ b/wrappers/python/src/swig_doxygen/swigInputConfig.py\n@@ -521,4 +521,5 @@\n (\"ATMForce\", \"getDefaultUmax\") : ('unit.kilojoule_per_mole', ()),\n (\"ATMForce\", \"getDefaultUbcore\") : ('unit.kilojoule_per_mole', ()),\n (\"ATMForce\", \"getDefaultAcore\") : (None, ()),\n+(\"ATMForce\", \"getParticleParameters\") : (None, (\"unit.nanometer\", \"unit.nanometer\")),\n }\ndiff --git a/wrappers/python/src/swig_doxygen/swig_lib/python/typemaps.i b/wrappers/python/src/swig_doxygen/swig_lib/python/typemaps.i\nindex fba646d820..f33f09cf2c 100644\n--- a/wrappers/python/src/swig_doxygen/swig_lib/python/typemaps.i\n+++ b/wrappers/python/src/swig_doxygen/swig_lib/python/typemaps.i\n@@ -537,16 +537,23 @@ int Py_SequenceToVecVecVecDouble(PyObject* obj, std::vector<std::vector<std::vec\n %typemap(argout) const std::vector<Vec3>& {\n }\n \n-\n+/* The following typemaps handle the ways a Vec3 can be returned from a function. */\n %typemap(out, fragment=\"Vec3_to_PyVec3\") Vec3 {\n $result = Vec3_to_PyVec3(*$1);\n }\n \n-\n %typemap(out, fragment=\"Vec3_to_PyVec3\") const Vec3& {\n $result = Vec3_to_PyVec3(*$1);\n }\n \n+%typemap(in, numinputs=0) Vec3& OUTPUT (Vec3 temp) {\n+ $1 = &temp;\n+}\n+\n+%typemap(argout, fragment=\"Vec3_to_PyVec3\") Vec3& OUTPUT {\n+ %append_output(Vec3_to_PyVec3(*$1));\n+}\n+\n /* Convert C++ (Vec3&, Vec3&, Vec3&) object to python tuple or tuples */\n %typemap(argout, fragment=\"Vec3_to_PyVec3\") (Vec3& a, Vec3& b, Vec3& c) {\n PyObject* pyVec1 = Vec3_to_PyVec3(*$1);\n"}, "test": {"test_patch": "diff --git a/wrappers/python/tests/TestAPIUnits.py b/wrappers/python/tests/TestAPIUnits.py\nindex f2d0deedff..d7e75f8bad 100644\n--- a/wrappers/python/tests/TestAPIUnits.py\n+++ b/wrappers/python/tests/TestAPIUnits.py\n@@ -526,6 +526,23 @@ def testCustomManyParticleForce(self):\n self.assertEqual(force.getParticleParameters(1)[0][0], 20)\n self.assertEqual(force.getParticleParameters(2)[0][0], 30*4.184)\n \n+ def testATMForce(self):\n+ \"\"\"Tests the ATMForce API features\"\"\"\n+ force = ATMForce(0.1, 0.2, 0.3, 0.4, 0.5, 0.7, 0.6, 0.8, -1.0);\n+ force.addParticle(Vec3(1, 2, 3), Vec3(4, 5, 6))\n+ self.assertEqual(0.1, force.getGlobalParameterDefaultValue(0))\n+ self.assertEqual(0.2, force.getGlobalParameterDefaultValue(1))\n+ self.assertEqual(0.3, force.getGlobalParameterDefaultValue(2))\n+ self.assertEqual(0.4, force.getGlobalParameterDefaultValue(3))\n+ self.assertEqual(0.5, force.getGlobalParameterDefaultValue(4))\n+ self.assertEqual(0.7, force.getGlobalParameterDefaultValue(5))\n+ self.assertEqual(0.6, force.getGlobalParameterDefaultValue(6))\n+ self.assertEqual(0.8, force.getGlobalParameterDefaultValue(7))\n+ self.assertEqual(-1.0, force.getGlobalParameterDefaultValue(8))\n+ d1, d0 = force.getParticleParameters(0)\n+ self.assertEqual(Vec3(1, 2, 3)*nanometers, d1)\n+ self.assertEqual(Vec3(4, 5, 6)*nanometers, d0)\n+\n def testDrudeForce(self):\n \"\"\" Tests the DrudeForce API features \"\"\"\n force = DrudeForce()\n", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}82{"question_id": "MSB_openmm_openmm_pr4323", "question_type": "multi_swe_bench", "description": "Preserve bond type and order in all `Modeller` operations (openmm/openmm#4323)", "content": {"org": "openmm", "repo": "openmm", "pr_number": 4323, "issue_title": "Preserve bond type and order in all `Modeller` operations", "issue_body": "This is not linked to an open issue (as far as I can tell), but it falls in the same category as #4112 (issue), #4113 (PR), completing the work of the latter. \r\n\r\n----\r\n\r\nWhen generating a new topology for a `Modeller` as a result of any operation, bonds that had `type` and `order` attributes in the original topology should retain them, instead of implicitly setting them to `None`.\r\n\r\nThis PR\r\n\r\n- ensures that `delete()` (therefore implicitly `deleteWater()`), `addSolvent()`, `addHydrogens()` and `addExtraParticles()` behave in the desirable way, while #4112 did it for `add()` (and implicitly for `addMembrane()`).\r\n\r\n- adds regression tests either as new tests method, or as assertions in existing test methods\r\n\r\n\r\n", "base_commit": "43f571d90fc1c882848cbd9b55e097a1775a9075", "resolved_issues": [{"number": null, "title": "Preserve bond type and order in all `Modeller` operations", "body": "### Issue Description\n\n#### Problem:\nWhen performing operations in the `Modeller` class, such as adding solvent, deleting water, adding hydrogens, or adding extra particles, bond attributes like `type` and `order` are not preserved in the resulting topology. This leads to the loss of critical bond information that may be essential for downstream processes, such as simulations or analyses that rely on accurate chemical representations.\n\n#### Expected Behavior:\nAll operations in the `Modeller` class should preserve bond attributes, including `type` and `order`, from the original topology. When a new topology is generated as a result of these operations, bonds should retain their original attributes to ensure consistent and accurate molecular representations.\n\n## IMPORTANT INSTRUCTIONS\n\n1. If you edit a python file, you MUST run 'make PythonInstall' inside the build directory\n2. If you edit a c++ file, you MUST run 'make -j4 && make install\" inside the build directory"}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/openmm_m_openmm:pr-4323", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/wrappers/python/openmm/app/modeller.py b/wrappers/python/openmm/app/modeller.py\nindex 997e0f53b1..1cc5299fbe 100644\n--- a/wrappers/python/openmm/app/modeller.py\n+++ b/wrappers/python/openmm/app/modeller.py\n@@ -178,7 +178,7 @@ def delete(self, toDelete):\n for bond in self.topology.bonds():\n if bond[0] in newAtoms and bond[1] in newAtoms:\n if bond not in deleteSet and (bond[1], bond[0]) not in deleteSet:\n- newTopology.addBond(newAtoms[bond[0]], newAtoms[bond[1]])\n+ newTopology.addBond(newAtoms[bond[0]], newAtoms[bond[1]], bond.type, bond.order)\n self.topology = newTopology\n self.positions = newPositions\n \n@@ -253,7 +253,7 @@ def convertWater(self, model='tip3p'):\n newPositions.append(deepcopy(self.positions[atom.index]))\n for bond in self.topology.bonds():\n if bond[0] in newAtoms and bond[1] in newAtoms:\n- newTopology.addBond(newAtoms[bond[0]], newAtoms[bond[1]])\n+ newTopology.addBond(newAtoms[bond[0]], newAtoms[bond[1]], bond.type, bond.order)\n self.topology = newTopology\n self.positions = newPositions\n \n@@ -549,7 +549,7 @@ def addSolvent(self, forcefield, model='tip3p', boxSize=None, boxVectors=None, p\n newAtoms[atom] = newAtom\n newPositions.append(deepcopy(self.positions[atom.index]))\n for bond in self.topology.bonds():\n- newTopology.addBond(newAtoms[bond[0]], newAtoms[bond[1]])\n+ newTopology.addBond(newAtoms[bond[0]], newAtoms[bond[1]], bond.type, bond.order)\n \n # Sort the solute atoms into cells for fast lookup.\n \n@@ -1000,7 +1000,7 @@ def isHbond(d, h, a):\n newPositions.append(deepcopy(self.positions[atom.index]))\n for bond in self.topology.bonds():\n if bond[0] in newAtoms and bond[1] in newAtoms:\n- newTopology.addBond(newAtoms[bond[0]], newAtoms[bond[1]])\n+ newTopology.addBond(newAtoms[bond[0]], newAtoms[bond[1]], bond.type, bond.order)\n \n # The hydrogens were added at random positions. Now perform an energy minimization to fix them up.\n \n@@ -1224,7 +1224,7 @@ def addExtraParticles(self, forcefield, ignoreExternalBonds=False, residueTempla\n \n for bond in self.topology.bonds():\n if bond[0] in newAtoms and bond[1] in newAtoms:\n- newTopology.addBond(newAtoms[bond[0]], newAtoms[bond[1]])\n+ newTopology.addBond(newAtoms[bond[0]], newAtoms[bond[1]], bond.type, bond.order)\n \n if len(missingPositions) > 0:\n # There were particles whose position we couldn't identify before, since they were neither virtual sites nor Drude particles.\n"}, "test": {"test_patch": "diff --git a/wrappers/python/tests/TestModeller.py b/wrappers/python/tests/TestModeller.py\nindex 1f29bc9951..16e5837418 100644\n--- a/wrappers/python/tests/TestModeller.py\n+++ b/wrappers/python/tests/TestModeller.py\n@@ -1200,6 +1200,75 @@ def test_addMembrane(self):\n for i in range(3):\n self.assertTrue(newSize[i] >= originalSize[i]+1.1*nanometers)\n \n+ def test_bondTypeAndOrderPreserved(self):\n+ \"\"\" Check that bond type and order are preserved across multiple operations. \n+\n+ Regression test for issue #4112 and similar behaviors.\n+ \"\"\"\n+\n+ # Given: an isolated molecule\n+ pdb = PDBFile(\"systems/alanine-dipeptide-implicit.pdb\")\n+ topology, positions = pdb.topology, pdb.positions\n+ topology.setUnitCellDimensions(Vec3(3.5, 3.5, 3.5) * nanometers)\n+ # with some bonds carrying type and order information\n+ for bond in topology.bonds():\n+ if ((bond.atom1.element, bond.atom2.element) in [\n+ (element.carbon, element.oxygen), (element.oxygen, element.carbon)\n+ ]):\n+ bond.type = Double\n+ bond.order = 2.0\n+ modeller = Modeller(topology, positions)\n+\n+ # When (1): add solvent\n+ forcefield = ForceField(\"amber10.xml\", \"tip3p.xml\")\n+ modeller.addSolvent(forcefield, \"tip3p\")\n+ # sanity check: water was added\n+ self.assertTrue(any(r.name == \"HOH\" for r in modeller.topology.residues()))\n+\n+ # When (2): convert water (no sites added)\n+ modeller.convertWater(\"spce\")\n+\n+ # When (3): convert water with addExtraParticles\n+ new_forcefield = ForceField('amber10.xml', 'tip4pew.xml')\n+ modeller.addExtraParticles(new_forcefield)\n+ # sanity check: extra sites were added\n+ self.assertEqual(\n+ set([len(list(res.atoms())) for res in modeller.topology.residues() if res.name == \"HOH\"]),\n+ {4}\n+ )\n+\n+ # When (4): delete water (with deleteWater) and hydrogens (with delete)\n+ modeller.deleteWater()\n+ hydrogens = [a for a in modeller.topology.atoms() if a.element == element.hydrogen]\n+ modeller.delete(hydrogens)\n+ # sanity check: all gone\n+ self.assertFalse(any(a.element == element.hydrogen for a in modeller.topology.atoms()))\n+ self.assertFalse(any(r.name == \"HOH\" for r in modeller.topology.residues()))\n+\n+ # When (5): add back hydrogens\n+ modeller.addHydrogens()\n+ # sanity check: hydrogens are back\n+ self.assertTrue(any(a.element == element.hydrogen for a in modeller.topology.atoms()))\n+\n+ # Then (intermediate): bond info have been retained throughout the workflow\n+ self.assertIn((Double, 2.0), [(b.type, b.order) for b in modeller.topology.bonds()])\n+\n+ # When (6): add a modeller (which also bears some bond info)\n+ to_add = PDBFile('systems/methanol-box.pdb')\n+ topology_to_add = to_add.topology\n+ positions_to_add = to_add.positions\n+ # add a dummy bond to the \"to_add\" system to check that it also is preserved\n+ atom0, atom1 = (atom for i, atom in enumerate(topology_to_add.atoms()) if i < 2)\n+ topology_to_add.addBond(atom0, atom1, Single, 1.0)\n+ modeller.add(topology_to_add, positions_to_add)\n+\n+ # Then: bond info are retained for both the old and the new system\n+ all_bond_extra_data = [(b.type, b.order) for b in modeller.topology.bonds()]\n+ self.assertEqual(\n+ set(all_bond_extra_data),\n+ # None and Double from topology; other Nones and Single from topology_to_add\n+ {(None, None), (Single, 1.0), (Double, 2.0)}\n+ )\n \n def assertVecAlmostEqual(self, p1, p2, tol=1e-7):\n scale = max(1.0, norm(p1),)\n", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}83{"question_id": "MSB_openmm_openmm_pr4523", "question_type": "multi_swe_bench", "description": "DrudeForce supports periodic boundary conditions (openmm/openmm#4523)", "content": {"org": "openmm", "repo": "openmm", "pr_number": 4523, "issue_title": "DrudeForce supports periodic boundary conditions", "issue_body": "Fixes #4521.", "base_commit": "2d4372d7ba8de7e02b4af9cb57f4ef29cd146f34", "resolved_issues": [{"number": 4521, "title": "Periodic boundary conditions with DrudeForce ", "body": "Hi, I have a question regarding periodic boundary conditions and the DrudeForce. From the documentation for `DrudeForce` I understand that `drudeforce.usesPeriodicBoundaryConditions()` will return `True` or `False` depending on if the `NonbondedForce` uses PBC. However in my case `drudeforce.usesPeriodicBoundaryConditions()` returns `False` although `nonbondedforce.usesPeriodicBoundaryConditions()` returns `True`. \r\n\r\nSince there is no `drudeforce.setUsesPeriodicBoundaryConditions(True)` how can I set `drudeforce.usesPeriodicBoundaryConditions()` to `True`?\r\n\r\nI attach my code:\r\n\r\n```\r\n# Import openmm\r\nfrom openmm.app import *\r\nfrom openmm import *\r\nfrom openmm.unit import *\r\nfrom sys import stdout\r\n\r\n\r\n# Read force field from XML file\r\n\r\nforcefield = ForceField(\"forcefield.xml\")\r\n\r\n\r\n# Read positions and topology from Gromacs files, create a modeller object and add extra particles\r\n\r\ngro = GromacsGroFile(\"slab.gro\")\r\n\r\ntop = GromacsTopFile(\"topol.top\", periodicBoxVectors=gro.getPeriodicBoxVectors(), includeDir='/usr/local/gromacs/share/gromacs/top') #gromacs top file\r\n\r\nmodeller = Modeller(top.topology,gro.positions)\r\n\r\nmodeller.addExtraParticles(forcefield)\r\n\r\n\r\n# Create a system\r\n\r\nsystem = forcefield.createSystem(modeller.topology, nonbondedMethod=PME, nonbondedCutoff=1.0*nanometer, constraints=HBonds)\r\n\r\n\r\n# Activate PBC for bonds and angles\r\n\r\nforces = system.getForces()\r\n\r\nfor force in forces:\r\n\r\n force_name = force.__class__.__name__\r\n\r\n if force_name == \"HarmonicBondForce\":\r\n\r\n force.setUsesPeriodicBoundaryConditions(True)\r\n\r\n elif force_name == \"HarmonicAngleForce\":\r\n\r\n force.setUsesPeriodicBoundaryConditions(True)\r\n\r\n\r\n# Check options for periodic boundary conditions\r\n\r\nfor force in forces:\r\n\r\n force_name = force.__class__.__name__\r\n\r\n if force.usesPeriodicBoundaryConditions():\r\n \r\n print(f\"{force_name} uses PBC\")\r\n\r\n else: \r\n print(f\"{force_name} does not use PBC\")\r\n```\r\nThe output is\r\n\r\n```\r\nHarmonicBondForce uses PBC\r\nNonbondedForce uses PBC\r\nDrudeForce does not use PBC\r\nCMMotionRemover does not use PBC\r\nHarmonicAngleForce uses PBC\r\n```\r\n\r\n\n\n### Minimal API referenced by tests (typed signatures)\n_Added only when tests call brand\u2011new symbols introduced by the fix; types reflect annotations present in the repo or `Unknown` if not annotated._\n\n- Function in `plugins/drude/openmmapi/src/DrudeForce.cpp`: `def void DrudeForce::setUsesPeriodicBoundaryConditions(periodic: bool) -> void: ...`\n **Inputs:** periodic: bool\n **Output:** void\n\n\n```python\ndef void DrudeForce::setUsesPeriodicBoundaryConditions(periodic) -> void: ...\n```\n\n## IMPORTANT INSTRUCTIONS\n\n1. If you edit a python file, you MUST run 'make PythonInstall' inside the build directory\n2. If you edit a c++ file, you MUST run 'make -j4 && make install\" inside the build directory"}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/openmm_m_openmm:pr-4523", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/plugins/drude/openmmapi/include/openmm/DrudeForce.h b/plugins/drude/openmmapi/include/openmm/DrudeForce.h\nindex 0ae8980b95..c4483c4331 100644\n--- a/plugins/drude/openmmapi/include/openmm/DrudeForce.h\n+++ b/plugins/drude/openmmapi/include/openmm/DrudeForce.h\n@@ -9,7 +9,7 @@\n * Biological Structures at Stanford, funded under the NIH Roadmap for *\n * Medical Research, grant U54 GM072970. See https://simtk.org. *\n * *\n- * Portions copyright (c) 2013 Stanford University and the Authors. *\n+ * Portions copyright (c) 2013-2024 Stanford University and the Authors. *\n * Authors: Peter Eastman *\n * Contributors: *\n * *\n@@ -134,7 +134,7 @@ class OPENMM_EXPORT_DRUDE DrudeForce : public Force {\n */\n int addScreenedPair(int particle1, int particle2, double thole);\n /**\n- * Get the force field parameters for screened pair.\n+ * Get the force field parameters for a screened pair.\n *\n * @param index the index of the pair for which to get parameters\n * @param[out] particle1 the index within this Force of the first particle involved in the interaction\n@@ -143,7 +143,7 @@ class OPENMM_EXPORT_DRUDE DrudeForce : public Force {\n */\n void getScreenedPairParameters(int index, int& particle1, int& particle2, double& thole) const;\n /**\n- * Set the force field parameters for screened pair.\n+ * Set the force field parameters for a screened pair.\n *\n * @param index the index of the pair for which to get parameters\n * @param particle1 the index within this Force of the first particle involved in the interaction\n@@ -162,15 +162,19 @@ class OPENMM_EXPORT_DRUDE DrudeForce : public Force {\n * be used to add new particles or screenedPairs, only to change the parameters of existing ones.\n */\n void updateParametersInContext(Context& context);\n+ /**\n+ * Set whether this force should apply periodic boundary conditions when calculating displacements.\n+ * Usually this is not appropriate for bonded forces, but there are situations when it can be useful.\n+ * \n+ * Periodic boundary conditions are only applied to screened pairs. They are never used for the\n+ * force between a Drude particle and its parent particle, regardless of this setting.\n+ */\n+ void setUsesPeriodicBoundaryConditions(bool periodic);\n /**\n * Returns whether or not this force makes use of periodic boundary\n * conditions.\n- *\n- * @returns true if nonbondedMethod uses PBC and false otherwise\n */\n- bool usesPeriodicBoundaryConditions() const {\n- return false;\n- }\n+ bool usesPeriodicBoundaryConditions() const;\n protected:\n ForceImpl* createImpl() const;\n private:\n@@ -178,6 +182,7 @@ class OPENMM_EXPORT_DRUDE DrudeForce : public Force {\n class ScreenedPairInfo;\n std::vector<ParticleInfo> particles;\n std::vector<ScreenedPairInfo> screenedPairs;\n+ bool usePeriodic;\n };\n \n /**\ndiff --git a/plugins/drude/openmmapi/src/DrudeForce.cpp b/plugins/drude/openmmapi/src/DrudeForce.cpp\nindex b46b0a8f32..b07f23844a 100644\n--- a/plugins/drude/openmmapi/src/DrudeForce.cpp\n+++ b/plugins/drude/openmmapi/src/DrudeForce.cpp\n@@ -6,7 +6,7 @@\n * Biological Structures at Stanford, funded under the NIH Roadmap for *\n * Medical Research, grant U54 GM072970. See https://simtk.org. *\n * *\n- * Portions copyright (c) 2013-2021 Stanford University and the Authors. *\n+ * Portions copyright (c) 2013-2024 Stanford University and the Authors. *\n * Authors: Peter Eastman *\n * Contributors: *\n * *\n@@ -38,7 +38,7 @@\n using namespace OpenMM;\n using namespace std;\n \n-DrudeForce::DrudeForce() {\n+DrudeForce::DrudeForce() : usePeriodic(false) {\n }\n \n int DrudeForce::addParticle(int particle, int particle1, int particle2, int particle3, int particle4, double charge, double polarizability, double aniso12, double aniso34) {\n@@ -105,3 +105,11 @@ ForceImpl* DrudeForce::createImpl() const {\n void DrudeForce::updateParametersInContext(Context& context) {\n dynamic_cast<DrudeForceImpl&>(getImplInContext(context)).updateParametersInContext(getContextImpl(context));\n }\n+\n+void DrudeForce::setUsesPeriodicBoundaryConditions(bool periodic) {\n+ usePeriodic = periodic;\n+}\n+\n+bool DrudeForce::usesPeriodicBoundaryConditions() const {\n+ return usePeriodic;\n+}\ndiff --git a/plugins/drude/platforms/common/src/CommonDrudeKernels.cpp b/plugins/drude/platforms/common/src/CommonDrudeKernels.cpp\nindex 77c9aaa026..2da3aeba1e 100644\n--- a/plugins/drude/platforms/common/src/CommonDrudeKernels.cpp\n+++ b/plugins/drude/platforms/common/src/CommonDrudeKernels.cpp\n@@ -6,7 +6,7 @@\n * Biological Structures at Stanford, funded under the NIH Roadmap for *\n * Medical Research, grant U54 GM072970. See https://simtk.org. *\n * *\n- * Portions copyright (c) 2013-2023 Stanford University and the Authors. *\n+ * Portions copyright (c) 2013-2024 Stanford University and the Authors. *\n * Authors: Peter Eastman *\n * Contributors: *\n * *\n@@ -158,6 +158,7 @@ void CommonCalcDrudeForceKernel::initialize(const System& system, const DrudeFor\n }\n pairParams.upload(paramVector);\n map<string, string> replacements;\n+ replacements[\"APPLY_PERIODIC\"] = (force.usesPeriodicBoundaryConditions() ? \"1\" : \"0\");\n replacements[\"PARAMS\"] = cc.getBondedUtilities().addArgument(pairParams, \"float2\");\n cc.getBondedUtilities().addInteraction(atoms, cc.replaceStrings(CommonDrudeKernelSources::drudePairForce, replacements), force.getForceGroup());\n }\ndiff --git a/plugins/drude/platforms/common/src/kernels/drudePairForce.cc b/plugins/drude/platforms/common/src/kernels/drudePairForce.cc\nindex 3cf79f07fa..ced2638ee1 100644\n--- a/plugins/drude/platforms/common/src/kernels/drudePairForce.cc\n+++ b/plugins/drude/platforms/common/src/kernels/drudePairForce.cc\n@@ -7,6 +7,9 @@ real3 force4 = make_real3(0);\n // First pair.\n \n real3 delta = make_real3(pos1.x-pos3.x, pos1.y-pos3.y, pos1.z-pos3.z);\n+#if APPLY_PERIODIC\n+APPLY_PERIODIC_TO_DELTA(delta)\n+#endif\n real rInv = RSQRT(dot(delta, delta));\n real r = RECIP(rInv);\n real u = drudeParams.x*r;\n@@ -20,6 +23,9 @@ force3 -= f;\n // Second pair.\n \n delta = make_real3(pos1.x-pos4.x, pos1.y-pos4.y, pos1.z-pos4.z);\n+#if APPLY_PERIODIC\n+APPLY_PERIODIC_TO_DELTA(delta)\n+#endif\n rInv = RSQRT(dot(delta, delta));\n r = RECIP(rInv);\n u = drudeParams.x*r;\n@@ -33,6 +39,9 @@ force4 -= f;\n // Third pair.\n \n delta = make_real3(pos2.x-pos3.x, pos2.y-pos3.y, pos2.z-pos3.z);\n+#if APPLY_PERIODIC\n+APPLY_PERIODIC_TO_DELTA(delta)\n+#endif\n rInv = RSQRT(dot(delta, delta));\n r = RECIP(rInv);\n u = drudeParams.x*r;\n@@ -46,6 +55,9 @@ force3 -= f;\n // Fourth pair.\n \n delta = make_real3(pos2.x-pos4.x, pos2.y-pos4.y, pos2.z-pos4.z);\n+#if APPLY_PERIODIC\n+APPLY_PERIODIC_TO_DELTA(delta)\n+#endif\n rInv = RSQRT(dot(delta, delta));\n r = RECIP(rInv);\n u = drudeParams.x*r;\ndiff --git a/plugins/drude/platforms/reference/src/ReferenceDrudeKernels.cpp b/plugins/drude/platforms/reference/src/ReferenceDrudeKernels.cpp\nindex b97e836d31..087719f145 100644\n--- a/plugins/drude/platforms/reference/src/ReferenceDrudeKernels.cpp\n+++ b/plugins/drude/platforms/reference/src/ReferenceDrudeKernels.cpp\n@@ -6,7 +6,7 @@\n * Biological Structures at Stanford, funded under the NIH Roadmap for *\n * Medical Research, grant U54 GM072970. See https://simtk.org. *\n * *\n- * Portions copyright (c) 2011-2023 Stanford University and the Authors. *\n+ * Portions copyright (c) 2011-2024 Stanford University and the Authors. *\n * Authors: Peter Eastman *\n * Contributors: *\n * *\n@@ -36,6 +36,7 @@\n #include \"SimTKOpenMMUtilities.h\"\n #include \"ReferenceConstraints.h\"\n #include \"ReferenceVirtualSites.h\"\n+#include \"ReferenceForce.h\"\n #include <set>\n \n using namespace OpenMM;\n@@ -56,6 +57,11 @@ static vector<Vec3>& extractForces(ContextImpl& context) {\n return *data->forces;\n }\n \n+static Vec3* extractBoxVectors(ContextImpl& context) {\n+ ReferencePlatform::PlatformData* data = reinterpret_cast<ReferencePlatform::PlatformData*>(context.getPlatformData());\n+ return data->periodicBoxVectors;\n+}\n+\n static ReferenceConstraints& extractConstraints(ContextImpl& context) {\n ReferencePlatform::PlatformData* data = reinterpret_cast<ReferencePlatform::PlatformData*>(context.getPlatformData());\n return *data->constraints;\n@@ -103,6 +109,7 @@ void ReferenceCalcDrudeForceKernel::initialize(const System& system, const Drude\n pairThole.resize(numPairs);\n for (int i = 0; i < numPairs; i++)\n force.getScreenedPairParameters(i, pair1[i], pair2[i], pairThole[i]);\n+ periodic = force.usesPeriodicBoundaryConditions();\n }\n \n double ReferenceCalcDrudeForceKernel::execute(ContextImpl& context, bool includeForces, bool includeEnergy) {\n@@ -170,6 +177,7 @@ double ReferenceCalcDrudeForceKernel::execute(ContextImpl& context, bool include\n // Compute the screened interaction between bonded dipoles.\n \n int numPairs = pair1.size();\n+ Vec3* boxVectors = extractBoxVectors(context);\n for (int i = 0; i < numPairs; i++) {\n int dipole1 = pair1[i];\n int dipole2 = pair2[i];\n@@ -181,8 +189,13 @@ double ReferenceCalcDrudeForceKernel::execute(ContextImpl& context, bool include\n int p1 = dipole1Particles[j];\n int p2 = dipole2Particles[k];\n double chargeProduct = charge[dipole1]*charge[dipole2]*(j == k ? 1 : -1);\n- Vec3 delta = pos[p1]-pos[p2];\n- double r = sqrt(delta.dot(delta));\n+ double deltaR[ReferenceForce::LastDeltaRIndex];\n+ if (periodic)\n+ ReferenceForce::getDeltaRPeriodic(pos[p2], pos[p1], boxVectors, deltaR);\n+ else\n+ ReferenceForce::getDeltaR(pos[p2], pos[p1], deltaR);\n+ Vec3 delta(deltaR[ReferenceForce::XIndex], deltaR[ReferenceForce::YIndex], deltaR[ReferenceForce::ZIndex]);\n+ double r = deltaR[ReferenceForce::RIndex];\n double u = r*uscale;\n double screening = 1.0 - (1.0+0.5*u)*exp(-u);\n energy += ONE_4PI_EPS0*chargeProduct*screening/r;\ndiff --git a/plugins/drude/platforms/reference/src/ReferenceDrudeKernels.h b/plugins/drude/platforms/reference/src/ReferenceDrudeKernels.h\nindex 2f462c948c..05f0f22924 100644\n--- a/plugins/drude/platforms/reference/src/ReferenceDrudeKernels.h\n+++ b/plugins/drude/platforms/reference/src/ReferenceDrudeKernels.h\n@@ -9,7 +9,7 @@\n * Biological Structures at Stanford, funded under the NIH Roadmap for *\n * Medical Research, grant U54 GM072970. See https://simtk.org. *\n * *\n- * Portions copyright (c) 2013-2023 Stanford University and the Authors. *\n+ * Portions copyright (c) 2013-2024 Stanford University and the Authors. *\n * Authors: Peter Eastman *\n * Contributors: *\n * *\n@@ -77,6 +77,7 @@ class ReferenceCalcDrudeForceKernel : public CalcDrudeForceKernel {\n std::vector<double> charge, polarizability, aniso12, aniso34;\n std::vector<int> pair1, pair2;\n std::vector<double> pairThole;\n+ bool periodic;\n };\n \n /**\n"}, "test": {"test_patch": "diff --git a/plugins/drude/tests/TestDrudeForce.h b/plugins/drude/tests/TestDrudeForce.h\nindex 67e47d06fc..67eef4ffa3 100644\n--- a/plugins/drude/tests/TestDrudeForce.h\n+++ b/plugins/drude/tests/TestDrudeForce.h\n@@ -6,7 +6,7 @@\n * Biological Structures at Stanford, funded under the NIH Roadmap for *\n * Medical Research, grant U54 GM072970. See https://simtk.org. *\n * *\n- * Portions copyright (c) 2013 Stanford University and the Authors. *\n+ * Portions copyright (c) 2013-2024 Stanford University and the Authors. *\n * Authors: Peter Eastman *\n * Contributors: *\n * *\n@@ -127,26 +127,29 @@ double computeScreening(double r, double thole, double alpha1, double alpha2) {\n return 1.0-(1.0+u/2)*exp(-u);\n }\n \n-void testThole() {\n+void testThole(bool periodic) {\n const double k = ONE_4PI_EPS0*1.5;\n const double charge = 0.1;\n const double alpha = ONE_4PI_EPS0*charge*charge/k;\n const double thole = 2.5;\n+ const double box = 2.0;\n System system;\n system.addParticle(1.0);\n system.addParticle(1.0);\n system.addParticle(1.0);\n system.addParticle(1.0);\n+ system.setDefaultPeriodicBoxVectors(Vec3(box, 0, 0), Vec3(0, box, 0), Vec3(0, 0, box));\n DrudeForce* drude = new DrudeForce();\n drude->addParticle(1, 0, -1, -1, -1, charge, alpha, 1, 1);\n drude->addParticle(3, 2, -1, -1, -1, charge, alpha, 1, 1);\n drude->addScreenedPair(0, 1, thole);\n+ drude->setUsesPeriodicBoundaryConditions(periodic);\n system.addForce(drude);\n vector<Vec3> positions(4);\n positions[0] = Vec3(0, 0, 0);\n positions[1] = Vec3(0, -0.5, 0);\n- positions[2] = Vec3(1, 0, 0);\n- positions[3] = Vec3(1, 0, 0.3);\n+ positions[2] = Vec3(1.1, 0, 0);\n+ positions[3] = Vec3(1.1, 0, 0.3);\n double energySpring1 = 0.5*k*0.5*0.5;\n double energySpring2 = 0.5*k*0.3*0.3;\n double energyDipole = 0.0;\n@@ -154,6 +157,11 @@ void testThole() {\n for (int i = 0; i < 2; i++)\n for (int j = 2; j < 4; j++) {\n Vec3 delta = positions[i]-positions[j];\n+ if (periodic) {\n+ delta[0] -= box*floor(delta[0]/box+0.5);\n+ delta[1] -= box*floor(delta[1]/box+0.5);\n+ delta[2] -= box*floor(delta[2]/box+0.5);\n+ }\n double r = sqrt(delta.dot(delta));\n energyDipole += ONE_4PI_EPS0*q[i]*q[j]*computeScreening(r, thole, alpha, alpha)/r;\n }\n@@ -204,7 +212,8 @@ int main(int argc, char* argv[]) {\n setupKernels(argc, argv);\n testSingleParticle();\n testAnisotropicParticle();\n- testThole();\n+ testThole(false);\n+ testThole(true);\n testChangingParameters();\n runPlatformTests();\n }\n", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}84{"question_id": "MSB_openmm_openmm_pr4528", "question_type": "multi_swe_bench", "description": "Fixed errors with residueTemplates arguments to Modeller methods (openmm/openmm#4528)", "content": {"org": "openmm", "repo": "openmm", "pr_number": 4528, "issue_title": "Fixed errors with residueTemplates arguments to Modeller methods", "issue_body": "Fixes #4524.", "base_commit": "3cb6f8d709d720fefbe4aa21f1e6fc2afd69590d", "resolved_issues": [{"number": 4524, "title": "modeller.addSolvent error with residue templates and non-standard residues", "body": "I'm working on a system with a non-canonical residue that binds to a cystein residue. I computed a set of parameters for these residues (including the cystein, which has different partial charges compared to the standard CYX residue, but has the same atoms).\r\n\r\nThen, I tried to solvate my system. I provided the `Modeller.addSolvent` method a dictionary (where the keys are `Residue`s from my system's `Topology`, and the values are the residue names) using the `residueTemplates` keyword, but it throws an error, saying that there is an ambiguity between my cystein-like residue andthe standard cystein residue (despite the residue templates are provided). The trace points to the `Modeller._addIons` method.\r\n\r\nLooking at the code, the `Modeller.addSolvent` method replaces the system's initial `Topology` by a new one before adding ions, which breaks the references to the `Residue` objects stored in the residueTemplates dictionary (as they are pointing to `Residue`s of the `Topology` that were replaced). \r\n\r\nCreating a new residueTemplates dictionary while creating the new `Topology` solved the issue and allowed me to solvate and ionize the system. I may submit a PR with this fix if you wish.\n\n## IMPORTANT INSTRUCTIONS\n\n1. If you edit a python file, you MUST run 'make PythonInstall' inside the build directory\n2. If you edit a c++ file, you MUST run 'make -j4 && make install\" inside the build directory"}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/openmm_m_openmm:pr-4528", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/wrappers/python/openmm/app/modeller.py b/wrappers/python/openmm/app/modeller.py\nindex fc30c0dbe5..0e9917bb26 100644\n--- a/wrappers/python/openmm/app/modeller.py\n+++ b/wrappers/python/openmm/app/modeller.py\n@@ -6,7 +6,7 @@\n Biological Structures at Stanford, funded under the NIH Roadmap for\n Medical Research, grant U54 GM072970. See https://simtk.org.\n \n-Portions copyright (c) 2012-2023 Stanford University and the Authors.\n+Portions copyright (c) 2012-2024 Stanford University and the Authors.\n Authors: Peter Eastman\n Contributors: \n \n@@ -856,12 +856,15 @@ def isHbond(d, h, a):\n newTopology.setPeriodicBoxVectors(self.topology.getPeriodicBoxVectors())\n newAtoms = {}\n newPositions = []*nanometer\n+ newResidueTemplates = {}\n newIndices = []\n acceptors = [atom for atom in self.topology.atoms() if atom.element in (elem.oxygen, elem.nitrogen)]\n for chain in self.topology.chains():\n newChain = newTopology.addChain(chain.id)\n for residue in chain.residues():\n newResidue = newTopology.addResidue(residue.name, newChain, residue.id, residue.insertionCode)\n+ if residue in residueTemplates:\n+ newResidueTemplates[newResidue] = residueTemplates[residue]\n isNTerminal = (residue == chain._residues[0])\n isCTerminal = (residue == chain._residues[-1])\n if residue.name in Modeller._residueHydrogens:\n@@ -1012,8 +1015,7 @@ def isHbond(d, h, a):\n if forcefield is not None:\n # Use the ForceField the user specified.\n \n- system = forcefield.createSystem(newTopology, rigidWater=False, nonbondedMethod=CutoffNonPeriodic, residueTemplates=residueTemplates)\n- atoms = list(newTopology.atoms())\n+ system = forcefield.createSystem(newTopology, rigidWater=False, nonbondedMethod=CutoffNonPeriodic, residueTemplates=newResidueTemplates)\n for i in range(system.getNumParticles()):\n if i not in addedH:\n # Existing atom, make it immobile.\n@@ -1128,11 +1130,14 @@ def addExtraParticles(self, forcefield, ignoreExternalBonds=False, residueTempla\n newTopology.setPeriodicBoxVectors(self.topology.getPeriodicBoxVectors())\n newAtoms = {}\n newPositions = []*nanometer\n+ newResidueTemplates = {}\n missingPositions = set()\n for chain in self.topology.chains():\n newChain = newTopology.addChain(chain.id)\n for residue in chain.residues():\n newResidue = newTopology.addResidue(residue.name, newChain, residue.id, residue.insertionCode)\n+ if residue in residueTemplates:\n+ newResidueTemplates[newResidue] = residueTemplates[residue]\n template = templates[residue.index]\n if len(template.atoms) == len(list(residue.atoms())):\n # Just copy the residue over.\n@@ -1233,7 +1238,7 @@ def addExtraParticles(self, forcefield, ignoreExternalBonds=False, residueTempla\n # There were particles whose position we couldn't identify before, since they were neither virtual sites nor Drude particles.\n # Try to figure them out based on bonds. First, use the ForceField to create a list of every bond involving one of them.\n \n- system = forcefield.createSystem(newTopology, constraints=AllBonds, residueTemplates=residueTemplates)\n+ system = forcefield.createSystem(newTopology, constraints=AllBonds, residueTemplates=newResidueTemplates)\n bonds = []\n for i in range(system.getNumConstraints()):\n bond = system.getConstraintParameters(i)\n@@ -1580,6 +1585,10 @@ def addMembrane(self, forcefield, lipidType='POPC', membraneCenterZ=0*nanometer,\n if len(toDelete) > 0:\n modeller.delete(toDelete)\n \n+ newResidueTemplates = {}\n+ for r1, r2 in zip(self.topology.residues(), modeller.topology.residues()):\n+ if r1 in residueTemplates:\n+ newResidueTemplates[r2] = residueTemplates[r1]\n self.topology = modeller.topology\n self.positions = modeller.positions\n \n@@ -1620,7 +1629,7 @@ def addMembrane(self, forcefield, lipidType='POPC', membraneCenterZ=0*nanometer,\n if lowerZBoundary < waterZ.value_in_unit(nanometer) < upperZBoundary:\n del waterPos[wRes]\n \n- self._addIons(forcefield, numTotalWaters, waterPos, positiveIon=positiveIon, negativeIon=negativeIon, ionicStrength=ionicStrength, neutralize=neutralize, residueTemplates=residueTemplates)\n+ self._addIons(forcefield, numTotalWaters, waterPos, positiveIon=positiveIon, negativeIon=negativeIon, ionicStrength=ionicStrength, neutralize=neutralize, residueTemplates=newResidueTemplates)\n \n \n class _CellList(object):\n"}, "test": {"test_patch": "diff --git a/wrappers/python/tests/TestModeller.py b/wrappers/python/tests/TestModeller.py\nindex 16e5837418..a695da8965 100644\n--- a/wrappers/python/tests/TestModeller.py\n+++ b/wrappers/python/tests/TestModeller.py\n@@ -1270,6 +1270,49 @@ def test_bondTypeAndOrderPreserved(self):\n {(None, None), (Single, 1.0), (Double, 2.0)}\n )\n \n+ def test_residueTemplates(self):\n+ \"\"\"Test the residueTemplates argument to Modeller methods\"\"\"\n+\n+ # Create a Topology and ForceField involving residues that match multiple templates.\n+\n+ topology = Topology()\n+ chain = topology.addChain()\n+ residue1 = topology.addResidue('Fe', chain)\n+ topology.addAtom('Fe', element.iron, residue1)\n+ residue2 = topology.addResidue('Fe', chain)\n+ topology.addAtom('Fe', element.iron, residue2)\n+ positions = [Vec3(0, 0, 0), Vec3(1, 0, 0)]*nanometers\n+ ff = ForceField('amber14/tip3pfb.xml', 'amber14/lipid17.xml')\n+ residueTemplates = {residue1: 'FE2', residue2: 'FE'}\n+\n+ # Test addSolvent().\n+\n+ modeller = Modeller(topology, positions)\n+ with self.assertRaises(Exception):\n+ modeller.addSolvent(ff, padding=1*nanometer)\n+ modeller.addSolvent(ff, padding=1*nanometer, residueTemplates=residueTemplates)\n+\n+ # Test addHydrogens().\n+\n+ modeller = Modeller(topology, positions)\n+ with self.assertRaises(Exception):\n+ modeller.addHydrogens(ff)\n+ modeller.addHydrogens(ff, residueTemplates=residueTemplates)\n+\n+ # Test addExtraParticles().\n+\n+ modeller = Modeller(topology, positions)\n+ with self.assertRaises(Exception):\n+ modeller.addExtraParticles(ff)\n+ modeller.addExtraParticles(ff, residueTemplates=residueTemplates)\n+\n+ # Test addMembrane().\n+\n+ modeller = Modeller(topology, positions)\n+ with self.assertRaises(Exception):\n+ modeller.addMembrane(ff)\n+ modeller.addMembrane(ff, residueTemplates=residueTemplates)\n+\n def assertVecAlmostEqual(self, p1, p2, tol=1e-7):\n scale = max(1.0, norm(p1),)\n for i in range(3):\n", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}85{"question_id": "MSB_openmm_openmm_pr4585", "question_type": "multi_swe_bench", "description": "addHydrogens() allows specifying exactly what hydrogens to add (openmm/openmm#4585)", "content": {"org": "openmm", "repo": "openmm", "pr_number": 4585, "issue_title": "addHydrogens() allows specifying exactly what hydrogens to add", "issue_body": "When calling `addHydrogens()`, there is a new option to specify exactly what hydrogens should be present for a residue. This is needed for some new features I'll be adding to PDBFixer.", "base_commit": "51a112a336db6cc0aea1c32b90d9d0a1f262cbfd", "resolved_issues": [{"number": null, "title": "addHydrogens() allows specifying exactly what hydrogens to add", "body": "The current functionality for adding hydrogens to molecular models does not allow users to specify exactly which hydrogens should be added to a residue. This limitation can be problematic in scenarios where precise control over hydrogen placement is required, such as for specialized modeling tasks or when working with non-standard residues.\n\nThe expected behavior is that users should have the option to explicitly define the specific hydrogens to be added to each residue. This would provide greater flexibility and enable more accurate modeling of molecular structures, particularly in cases where default hydrogen placement rules are insufficient or inappropriate.\n\n## IMPORTANT INSTRUCTIONS\n\n1. If you edit a python file, you MUST run 'make PythonInstall' inside the build directory\n2. If you edit a c++ file, you MUST run 'make -j4 && make install\" inside the build directory"}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/openmm_m_openmm:pr-4585", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/devtools/ci/gh-actions/conda-envs/build-M1-arm64.yml b/devtools/ci/gh-actions/conda-envs/build-M1-arm64.yml\nindex 73cb8a381c..de06102613 100644\n--- a/devtools/ci/gh-actions/conda-envs/build-M1-arm64.yml\n+++ b/devtools/ci/gh-actions/conda-envs/build-M1-arm64.yml\n@@ -10,7 +10,7 @@ dependencies:\n - python\n - cython\n - swig\n-- numpy\n+- numpy <2.0\n - doxygen 1.9.1\n # test\n - pytest\ndiff --git a/devtools/ci/gh-actions/conda-envs/build-ubuntu-pypy.yml b/devtools/ci/gh-actions/conda-envs/build-ubuntu-pypy.yml\nindex b1cbf43e40..5e699075ab 100644\n--- a/devtools/ci/gh-actions/conda-envs/build-ubuntu-pypy.yml\n+++ b/devtools/ci/gh-actions/conda-envs/build-ubuntu-pypy.yml\n@@ -12,7 +12,7 @@ dependencies:\n - pypy\n - cython\n - swig\n-- numpy\n+- numpy <2.0\n - ocl-icd-system\n - doxygen 1.8.14\n # test\ndiff --git a/devtools/ci/gh-actions/conda-envs/docs.yml b/devtools/ci/gh-actions/conda-envs/docs.yml\nindex b36728fc6f..3541ed8e0e 100644\n--- a/devtools/ci/gh-actions/conda-envs/docs.yml\n+++ b/devtools/ci/gh-actions/conda-envs/docs.yml\n@@ -8,7 +8,7 @@ dependencies:\n # host\n - python\n - pip\n-- numpy\n+- numpy <2.0\n - cython\n - swig\n - doxygen 1.8.14\ndiff --git a/wrappers/python/openmm/app/modeller.py b/wrappers/python/openmm/app/modeller.py\nindex 0e9917bb26..7c491cd7c3 100644\n--- a/wrappers/python/openmm/app/modeller.py\n+++ b/wrappers/python/openmm/app/modeller.py\n@@ -736,6 +736,15 @@ def loadHydrogenDefinitions(file):\n terminal = hydrogen.attrib['terminal']\n data.hydrogens.append(Modeller._Hydrogen(hydrogen.attrib['name'], hydrogen.attrib['parent'], maxph, atomVariants, terminal))\n \n+ @staticmethod\n+ def _loadStandardHydrogenDefinitions():\n+ \"\"\"Load the definitions of hydrogens for standard residues. Normally there is no need to call this directly.\n+ It is automatically called by addHydrogens(). If the definitions have already been loaded, this returns without\n+ doing anything.\"\"\"\n+ if not Modeller._hasLoadedStandardHydrogens:\n+ Modeller.loadHydrogenDefinitions(os.path.join(os.path.dirname(__file__), 'data', 'hydrogens.xml'))\n+ Modeller._hasLoadedStandardHydrogens = True\n+\n def addHydrogens(self, forcefield=None, pH=7.0, variants=None, platform=None, residueTemplates=dict()):\n \"\"\"Add missing hydrogens to the model.\n \n@@ -798,7 +807,11 @@ def addHydrogens(self, forcefield=None, pH=7.0, variants=None, platform=None, re\n length must equal the number of residues in the model. variants[i]\n is the name of the variant to use for residue i (indexed starting at\n 0). If an element is None, the standard rules will be followed to\n- select a variant for that residue.\n+ select a variant for that residue. Alternatively, an element may specify\n+ exactly which hydrogens to add. In that case, variants[i] should be\n+ a list of tuples [(name1, parent1), (name2, parent2), ...]. Each\n+ tuple specifies the name of a hydrogen and the name of the parent atom\n+ it should be bonded to.\n platform : Platform=None\n the Platform to use when computing the hydrogen atom positions. If\n this is None, the default Platform will be used.\n@@ -827,8 +840,7 @@ def addHydrogens(self, forcefield=None, pH=7.0, variants=None, platform=None, re\n \n # Load the residue specifications.\n \n- if not Modeller._hasLoadedStandardHydrogens:\n- Modeller.loadHydrogenDefinitions(os.path.join(os.path.dirname(__file__), 'data', 'hydrogens.xml'))\n+ Modeller._loadStandardHydrogenDefinitions()\n \n # Make a list of atoms bonded to each atom.\n \n@@ -867,10 +879,9 @@ def isHbond(d, h, a):\n newResidueTemplates[newResidue] = residueTemplates[residue]\n isNTerminal = (residue == chain._residues[0])\n isCTerminal = (residue == chain._residues[-1])\n- if residue.name in Modeller._residueHydrogens:\n+ if residue.name in Modeller._residueHydrogens or isinstance(variants[residue.index], list):\n # Add hydrogens. First select which variant to use.\n \n- spec = Modeller._residueHydrogens[residue.name]\n variant = variants[residue.index]\n if variant is None:\n if residue.name == 'CYS':\n@@ -930,8 +941,14 @@ def isHbond(d, h, a):\n variant = 'HID'\n elif residue.name == 'HIS':\n variant = 'HIP'\n- if variant is not None and variant not in spec.variants:\n- raise ValueError('Illegal variant for %s residue: %s' % (residue.name, variant))\n+ if isinstance(variant, list):\n+ spec = Modeller._ResidueData(residue.name)\n+ infinity = float('Inf')\n+ spec.hydrogens = [Modeller._Hydrogen(name, parent, infinity, None, None) for name, parent in variant]\n+ else:\n+ spec = Modeller._residueHydrogens[residue.name]\n+ if variant is not None and variant not in spec.variants:\n+ raise ValueError('Illegal variant for %s residue: %s' % (residue.name, variant))\n actualVariants[residue.index] = variant\n removeExtraHydrogens = (variants[residue.index] is not None)\n \n"}, "test": {"test_patch": "diff --git a/devtools/ci/gh-actions/conda-envs/build-macos-latest.yml b/devtools/ci/gh-actions/conda-envs/build-macos-latest.yml\nindex ce3ca8767b..b474f295a9 100644\n--- a/devtools/ci/gh-actions/conda-envs/build-macos-latest.yml\n+++ b/devtools/ci/gh-actions/conda-envs/build-macos-latest.yml\n@@ -10,7 +10,7 @@ dependencies:\n - python\n - cython\n - swig\n-- numpy\n+- numpy <2.0\n - doxygen 1.8.14\n # test\n - pytest\ndiff --git a/devtools/ci/gh-actions/conda-envs/build-ubuntu-latest.yml b/devtools/ci/gh-actions/conda-envs/build-ubuntu-latest.yml\nindex 683875e577..ff7b3a053b 100644\n--- a/devtools/ci/gh-actions/conda-envs/build-ubuntu-latest.yml\n+++ b/devtools/ci/gh-actions/conda-envs/build-ubuntu-latest.yml\n@@ -12,7 +12,7 @@ dependencies:\n - python\n - cython\n - swig\n-- numpy\n+- numpy <2.0\n - ocl-icd-system\n - doxygen 1.8.14\n # test\ndiff --git a/devtools/ci/gh-actions/conda-envs/build-windows-latest.yml b/devtools/ci/gh-actions/conda-envs/build-windows-latest.yml\nindex 2201dc3c6a..b3e477d45c 100644\n--- a/devtools/ci/gh-actions/conda-envs/build-windows-latest.yml\n+++ b/devtools/ci/gh-actions/conda-envs/build-windows-latest.yml\n@@ -12,7 +12,7 @@ dependencies:\n - python\n - cython\n - swig\n-- numpy\n+- numpy <2.0\n - doxygen 1.8.14\n - khronos-opencl-icd-loader\n # test\ndiff --git a/wrappers/python/tests/TestModeller.py b/wrappers/python/tests/TestModeller.py\nindex a695da8965..33d085a715 100644\n--- a/wrappers/python/tests/TestModeller.py\n+++ b/wrappers/python/tests/TestModeller.py\n@@ -1,5 +1,6 @@\n from collections import defaultdict\n import unittest\n+import random\n \n from validateModeller import *\n from openmm.app import *\n@@ -980,6 +981,33 @@ def test_addHydrogensGlycam(self):\n names1 = sorted([a.name for a in res1.atoms()])\n names2 = sorted([a.name for a in res2.atoms()])\n self.assertEqual(names1, names2)\n+ # Reset the loaded definitions so we don't affect other tests.\n+ Modeller._residueHydrogens = {}\n+ Modeller._hasLoadedStandardHydrogens = False\n+\n+ def test_addSpecificHydrogens(self):\n+ \"\"\"Test specifying exactly which hydrogens to add.\"\"\"\n+ pdb = PDBFile('systems/glycopeptide.pdb')\n+ variants = [None]*pdb.topology.getNumResidues()\n+ for residue in pdb.topology.residues():\n+ if residue.name != 'ALA':\n+ var = []\n+ for atom1, atom2 in residue.bonds():\n+ if atom1.element == element.hydrogen:\n+ var.append((atom1.name, atom2.name))\n+ elif atom2.element == element.hydrogen:\n+ var.append((atom2.name, atom1.name))\n+ variants[residue.index] = var\n+ modeller = Modeller(pdb.topology, pdb.positions)\n+ hydrogens = [a for a in modeller.topology.atoms() if a.element == element.hydrogen and random.random() < 0.7]\n+ modeller.delete(hydrogens)\n+ self.assertTrue(modeller.topology.getNumAtoms() < pdb.topology.getNumAtoms())\n+ modeller.addHydrogens(variants=variants)\n+ self.assertEqual(modeller.topology.getNumAtoms(), pdb.topology.getNumAtoms())\n+ for res1, res2 in zip(pdb.topology.residues(), modeller.topology.residues()):\n+ names1 = sorted([a.name for a in res1.atoms()])\n+ names2 = sorted([a.name for a in res2.atoms()])\n+ self.assertEqual(names1, names2)\n \n def test_removeExtraHydrogens(self):\n \"\"\"Test that addHydrogens() can remove hydrogens that shouldn't be there. \"\"\"\n", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}86{"question_id": "MSB_openmm_openmm_pr4630", "question_type": "multi_swe_bench", "description": "Fix formal charge reading from pdb files; store formal charges in topology (openmm/openmm#4630)", "content": {"org": "openmm", "repo": "openmm", "pr_number": 4630, "issue_title": "Fix formal charge reading from pdb files; store formal charges in topology", "issue_body": "This pull request fixes some bugs with formal charge handling in pdb files, and also stores the charges in the resulting topologies.\r\n\r\nHow charges are stored, from the PDB format spec https://www.wwpdb.org/documentation/file-format-content/format33/sect9.html#ATOM\r\n\r\n> Columns 79 - 80 indicate any charge on the atom, e.g., 2+, 1-. In most cases, these are blank\r\n\r\nThe charges are not stored as +1 or -1, rather the sign follows the number. I have confirmed this using some example files saved from popular software.\r\n\r\nThe existing code before this patch tries to parse this with `try: self.formal_charge = int(pdb_line[78:80])` which always fails, both for missing charges and for present, correctly formatted charges, because `int('1+')` fails. The correspnding catch statement sets the charge to None.\r\n\r\nThe current fix reverses the string before trying to parse it as int.\r\n\r\nThe second part of this pull request makes it possible to store formal charges in the topology, as follows:\r\n- add an optional formal_charge argument to the Atom constructor\r\n- add an optional formal_charge argument to topology.newAtom()\r\n- pass charges from the PdbStructure to the Topology\r\n\r\nTest case, using the attached file:\r\n\r\n```\r\npdb_file = 'formal_charge.pdb'\r\n# check that PdbStructure reads the charges correctly - this always prints None before this patch\r\nfrom openmm.app.internal.pdbstructure import PdbStructure\r\nfh = open(pdb_file, 'r')\r\npdb = PdbStructure(fh, load_all_models=True, extraParticleIdentifier='EP')\r\nfor chain in pdb.iter_chains():\r\n for residue in chain.iter_residues():\r\n for atom in residue.atoms_by_name.values():\r\n print(atom.get_name(), atom.formal_charge)\r\n\r\n# check that Topology gets the charges - this would raise an exception before this patch, because a.formal_charge doesn't exist\r\nimport openmm as mm\r\nimport openmm.app as app\r\npdb = app.PDBFile(pdb_file)\r\nfor a in topology.atoms():\r\n print(a, a.formal_charge)\r\n```", "base_commit": "8defca2d65a672bcac199a1cab83807b9522bc19", "resolved_issues": [{"number": null, "title": "Fix formal charge reading from pdb files; store formal charges in topology", "body": "### Issue Description\n\n**Problem:**\nFormal charges on atoms in PDB files are not being correctly parsed and stored in the topology. According to the PDB format specification, formal charges are represented in columns 79-80 as a number followed by a sign (e.g., \"2+\", \"1-\"). The current implementation fails to parse these charges correctly, resulting in formal charges being set to `None` even when they are present and correctly formatted. Additionally, the topology does not store formal charges, which prevents users from accessing this information when working with molecular structures.\n\n**Expected Behavior:**\n1. Formal charges in PDB files should be correctly parsed, regardless of their format (e.g., \"2+\", \"1-\", \"+2\", \"-1\").\n2. Parsed formal charges should be stored in the topology, allowing users to access and utilize this information when working with atoms in molecular simulations.\n3. The software should handle missing charges gracefully, setting them to `None` without causing errors.\n\n## IMPORTANT INSTRUCTIONS\n\n1. If you edit a python file, you MUST run 'make PythonInstall' inside the build directory\n2. If you edit a c++ file, you MUST run 'make -j4 && make install\" inside the build directory"}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/openmm_m_openmm:pr-4630", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/wrappers/python/openmm/app/internal/pdbstructure.py b/wrappers/python/openmm/app/internal/pdbstructure.py\nindex 3711ee2bfb..aa81838fa4 100644\n--- a/wrappers/python/openmm/app/internal/pdbstructure.py\n+++ b/wrappers/python/openmm/app/internal/pdbstructure.py\n@@ -785,8 +785,15 @@ def __init__(self, pdb_line, pdbstructure=None, extraParticleIdentifier='EP'):\n # segment id, element_symbol, and formal_charge are not always present\n self.segment_id = pdb_line[72:76].strip()\n self.element_symbol = pdb_line[76:78].strip()\n- try: self.formal_charge = int(pdb_line[78:80])\n- except ValueError: self.formal_charge = None\n+ try:\n+ # formal_charge should always be a one digit followed by a sign, eg \"2-\", \"3+\"\n+ # this is a bit more permissive, it will also read \"-2\", \"+3\", or \"3 \"\n+ formal_charge = pdb_line[78:80]\n+ if formal_charge.endswith('+') or formal_charge.endswith('-'):\n+ formal_charge = formal_charge[::-1]\n+ self.formal_charge = int(formal_charge)\n+ except ValueError:\n+ self.formal_charge = None\n # figure out atom element\n if self.element_symbol == extraParticleIdentifier:\n self.element = 'EP'\n@@ -904,7 +911,7 @@ def _pdb_string(self, serial_number=None, alternate_location_indicator=None):\n end = \"%-4s%2s\" % (\\\n self.segment_id, self.element_symbol)\n formal_charge = \" \"\n- if (self.formal_charge != None): formal_charge = \"%+2d\" % self.formal_charge\n+ if (self.formal_charge is not None): formal_charge = (\"%+2d\" % self.formal_charge)[::-1]\n return names+numbers+end+formal_charge\n \n def __str__(self):\ndiff --git a/wrappers/python/openmm/app/pdbfile.py b/wrappers/python/openmm/app/pdbfile.py\nindex 626f0ac8dc..b909f52790 100644\n--- a/wrappers/python/openmm/app/pdbfile.py\n+++ b/wrappers/python/openmm/app/pdbfile.py\n@@ -152,7 +152,7 @@ def __init__(self, file, extraParticleIdentifier='EP'):\n element = elem.get_by_symbol(upper[0])\n except KeyError:\n pass\n- newAtom = top.addAtom(atomName, element, r, str(atom.serial_number))\n+ newAtom = top.addAtom(atomName, element, r, str(atom.serial_number), formalCharge=atom.formal_charge)\n atomByNumber[atom.serial_number] = newAtom\n self._positions = []\n for model in pdb.iter_models(True):\n@@ -389,9 +389,13 @@ def writeModel(topology, positions, file=sys.stdout, modelIndex=None, keepIds=Fa\n else:\n atomName = atom.name\n coords = positions[posIndex]\n- line = \"%s%5s %-4s %3s %s%4s%1s %s%s%s 1.00 0.00 %2s \" % (\n+ if atom.formalCharge is not None:\n+ formalCharge = (\"%+2d\" % atom.formalCharge)[::-1]\n+ else:\n+ formalCharge = ' '\n+ line = \"%s%5s %-4s %3s %s%4s%1s %s%s%s 1.00 0.00 %2s%2s\" % (\n recordName, _formatIndex(atomIndex, 5), atomName, resName, chainName, resId, resIC, _format_83(coords[0]),\n- _format_83(coords[1]), _format_83(coords[2]), symbol)\n+ _format_83(coords[1]), _format_83(coords[2]), symbol, formalCharge)\n if len(line) != 80:\n raise ValueError('Fixed width overflow detected')\n print(line, file=file)\ndiff --git a/wrappers/python/openmm/app/topology.py b/wrappers/python/openmm/app/topology.py\nindex 46ff9f997f..63d8a2ecde 100644\n--- a/wrappers/python/openmm/app/topology.py\n+++ b/wrappers/python/openmm/app/topology.py\n@@ -166,7 +166,7 @@ def addResidue(self, name, chain, id=None, insertionCode=''):\n chain._residues.append(residue)\n return residue\n \n- def addAtom(self, name, element, residue, id=None):\n+ def addAtom(self, name, element, residue, id=None, formalCharge=None):\n \"\"\"Create a new Atom and add it to the Topology.\n \n Parameters\n@@ -180,7 +180,8 @@ def addAtom(self, name, element, residue, id=None):\n id : string=None\n An optional identifier for the atom. If this is omitted, an id is\n generated based on the atom index.\n-\n+ formalCharge : int=None\n+ An optional formal charge for the atom.\n Returns\n -------\n Atom\n@@ -190,7 +191,7 @@ def addAtom(self, name, element, residue, id=None):\n raise ValueError('All atoms within a residue must be contiguous')\n if id is None:\n id = str(self._numAtoms+1)\n- atom = Atom(name, element, self._numAtoms, residue, id)\n+ atom = Atom(name, element, self._numAtoms, residue, id, formalCharge=formalCharge)\n self._numAtoms += 1\n residue._atoms.append(atom)\n return atom\n@@ -452,7 +453,7 @@ def __repr__(self):\n class Atom(object):\n \"\"\"An Atom object represents an atom within a Topology.\"\"\"\n \n- def __init__(self, name, element, index, residue, id):\n+ def __init__(self, name, element, index, residue, id, formalCharge=None):\n \"\"\"Construct a new Atom. You should call addAtom() on the Topology instead of calling this directly.\"\"\"\n ## The name of the Atom\n self.name = name\n@@ -464,6 +465,8 @@ def __init__(self, name, element, index, residue, id):\n self.residue = residue\n ## A user defined identifier for this Atom\n self.id = id\n+ ## An optional formal charge for this Atom\n+ self.formalCharge = formalCharge\n \n def __repr__(self):\n return \"<Atom %d (%s) of chain %d residue %d (%s)>\" % (self.index, self.name, self.residue.chain.index, self.residue.index, self.residue.name)\n"}, "test": {"test_patch": "diff --git a/wrappers/python/tests/TestPdbFile.py b/wrappers/python/tests/TestPdbFile.py\nindex 69bdbd901f..430ce3b048 100644\n--- a/wrappers/python/tests/TestPdbFile.py\n+++ b/wrappers/python/tests/TestPdbFile.py\n@@ -105,6 +105,28 @@ def test_AltLocs(self):\n self.assertEqual(19, len(pdb.positions))\n self.assertEqual('ILE', list(pdb.topology.residues())[0].name)\n \n+ def test_FormalCharges(self):\n+ \"\"\"Test reading, and writing and re-reading of a file containing formal charges.\"\"\"\n+ pdb = PDBFile('systems/formal-charges.pdb')\n+ for atom in pdb.topology.atoms():\n+ if atom.index == 8:\n+ self.assertEqual(+1, atom.formalCharge)\n+ elif atom.index == 29:\n+ self.assertEqual(-1, atom.formalCharge)\n+ else:\n+ self.assertEqual(None, atom.formalCharge)\n+ output = StringIO()\n+ PDBFile.writeFile(pdb.topology, pdb.positions, output)\n+ input = StringIO(output.getvalue())\n+ pdb = PDBFile(input)\n+ for atom in pdb.topology.atoms():\n+ if atom.index == 8:\n+ self.assertEqual(+1, atom.formalCharge)\n+ elif atom.index == 29:\n+ self.assertEqual(-1, atom.formalCharge)\n+ else:\n+ self.assertEqual(None, atom.formalCharge)\n+\n def test_LargeFile(self):\n \"\"\"Write and read a file with more than 100,000 atoms\"\"\"\n topology = Topology()\ndiff --git a/wrappers/python/tests/systems/formal-charges.pdb b/wrappers/python/tests/systems/formal-charges.pdb\nnew file mode 100644\nindex 0000000000..c78e78e8a8\n--- /dev/null\n+++ b/wrappers/python/tests/systems/formal-charges.pdb\n@@ -0,0 +1,34 @@\n+ATOM 302 N LYS A 39 -21.317 5.001 -3.640 1.00 11.03 N \n+ATOM 303 CA LYS A 39 -22.118 5.903 -2.826 1.00 11.13 C \n+ATOM 304 C LYS A 39 -21.425 6.300 -1.528 1.00 11.27 C \n+ATOM 305 O LYS A 39 -21.979 7.114 -0.782 1.00 12.94 O \n+ATOM 306 CB LYS A 39 -23.466 5.249 -2.510 1.00 11.64 C \n+ATOM 307 CG LYS A 39 -24.271 4.857 -3.735 1.00 13.20 C \n+ATOM 308 CD LYS A 39 -25.586 4.211 -3.325 1.00 14.57 C \n+ATOM 309 CE LYS A 39 -26.389 3.755 -4.533 1.00 17.30 C \n+ATOM 310 NZ LYS A 39 -26.668 4.891 -5.456 1.00 19.28 N1+\n+ATOM 311 H LYS A 39 -21.485 4.006 -3.565 1.00 11.03 H \n+ATOM 312 HA LYS A 39 -22.322 6.821 -3.381 1.00 11.13 H \n+ATOM 313 HB3 LYS A 39 -24.066 5.953 -1.933 1.00 11.64 H \n+ATOM 314 HB2 LYS A 39 -23.325 4.382 -1.864 1.00 11.64 H \n+ATOM 315 HG3 LYS A 39 -23.706 4.154 -4.346 1.00 13.20 H \n+ATOM 316 HG2 LYS A 39 -24.439 5.744 -4.347 1.00 13.20 H \n+ATOM 317 HD3 LYS A 39 -26.177 4.910 -2.731 1.00 14.57 H \n+ATOM 318 HD2 LYS A 39 -25.393 3.350 -2.682 1.00 14.57 H \n+ATOM 319 HE3 LYS A 39 -27.335 3.320 -4.210 1.00 17.30 H \n+ATOM 320 HE2 LYS A 39 -25.852 2.977 -5.078 1.00 17.30 H \n+ATOM 321 HZ1 LYS A 39 -25.793 5.240 -5.824 1.00 19.28 H \n+ATOM 322 HZ2 LYS A 39 -27.244 4.571 -6.222 1.00 19.28 H \n+ATOM 323 HZ3 LYS A 39 -27.147 5.629 -4.959 1.00 19.28 H \n+ATOM 324 N ASP A 40 -20.235 5.756 -1.257 1.00 10.36 N \n+ATOM 325 CA ASP A 40 -19.478 5.992 -0.027 1.00 10.11 C \n+ATOM 326 C ASP A 40 -18.075 6.451 -0.422 1.00 10.88 C \n+ATOM 327 O ASP A 40 -17.085 5.743 -0.201 1.00 11.09 O \n+ATOM 328 CB ASP A 40 -19.441 4.709 0.809 1.00 9.45 C \n+ATOM 329 CG ASP A 40 -18.542 4.809 2.035 1.00 9.80 C \n+ATOM 330 OD1 ASP A 40 -18.434 5.917 2.620 1.00 10.02 O \n+ATOM 331 OD2 ASP A 40 -17.966 3.752 2.401 1.00 9.81 O1-\n+ATOM 332 H ASP A 40 -19.836 5.109 -1.925 1.00 10.36 H \n+ATOM 333 HA ASP A 40 -19.938 6.774 0.577 1.00 10.11 H \n+ATOM 334 HB3 ASP A 40 -19.104 3.871 0.196 1.00 9.45 H \n+ATOM 335 HB2 ASP A 40 -20.447 4.458 1.147 1.00 9.45 H \n", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}87{"question_id": "MSB_openmm_openmm_pr4641", "question_type": "multi_swe_bench", "description": "Serializing CustomIntegrator preserves order of global variables (openmm/openmm#4641)", "content": {"org": "openmm", "repo": "openmm", "pr_number": 4641, "issue_title": "Serializing CustomIntegrator preserves order of global variables", "issue_body": "Fixes #4637.\r\n\r\nWhen serializing a CustomIntegrator, it recorded the global variables as attributes on a single XML tag. That doesn't preserve order, so when you reloaded it, the global variables would come out in alphabetical order. It now uses separate tags so the order is preserved.", "base_commit": "fb50d37665b43dbb3df0c136931cd9b8d7ae6d92", "resolved_issues": [{"number": 4637, "title": "Deepcopying `AMDIntegrator` swaps values of global parameters", "body": "Making a deepcopy of an `AMDIntegrator` swaps the values of the global parameters (alpha and E).\r\n```\r\nfrom openmm import AMDIntegrator\r\namd = AMDIntegrator(0.001, 0.0, 1.0)\r\namd.getAlpha()\r\namd.getE()\r\n```\r\nprints 0.0, 1.0.\r\n```\r\nfrom copy import deepcopy\r\namd2 = deepcopy(amd)\r\namd2.getAlpha()\r\namd2.getE()\r\n```\r\nprints 1.0, 0.0.\r\n\r\nI have tried reproducing the behavior with another `CustomIntegrator`, but with no luck. Could the issue be related to the names of the global parameters?\n\n## IMPORTANT INSTRUCTIONS\n\n1. If you edit a python file, you MUST run 'make PythonInstall' inside the build directory\n2. If you edit a c++ file, you MUST run 'make -j4 && make install\" inside the build directory"}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/openmm_m_openmm:pr-4641", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/serialization/src/CustomIntegratorProxy.cpp b/serialization/src/CustomIntegratorProxy.cpp\nindex b1ecf26fd2..86ab647835 100644\n--- a/serialization/src/CustomIntegratorProxy.cpp\n+++ b/serialization/src/CustomIntegratorProxy.cpp\n@@ -6,7 +6,7 @@\n * Biological Structures at Stanford, funded under the NIH Roadmap for *\r\n * Medical Research, grant U54 GM072970. See https://simtk.org. *\r\n * *\r\n- * Portions copyright (c) 2010 Stanford University and the Authors. *\r\n+ * Portions copyright (c) 2010-2024 Stanford University and the Authors. *\r\n * Authors: Peter Eastman, Yutong Zhao *\r\n * Contributors: *\r\n * *\r\n@@ -36,23 +36,20 @@ using namespace std;\n using namespace OpenMM;\r\n \r\n CustomIntegratorProxy::CustomIntegratorProxy() : SerializationProxy(\"CustomIntegrator\") {\r\n-\r\n }\r\n \r\n void CustomIntegratorProxy::serialize(const void* object, SerializationNode& node) const {\r\n- node.setIntProperty(\"version\", 2);\r\n+ node.setIntProperty(\"version\", 3);\r\n const CustomIntegrator& integrator = *reinterpret_cast<const CustomIntegrator*>(object);\r\n SerializationNode& globalVariablesNode = node.createChildNode(\"GlobalVariables\");\r\n- for (int i = 0; i < integrator.getNumGlobalVariables(); i++) {\r\n- globalVariablesNode.setDoubleProperty(integrator.getGlobalVariableName(i), integrator.getGlobalVariable(i));\r\n- }\r\n+ for (int i = 0; i < integrator.getNumGlobalVariables(); i++)\r\n+ globalVariablesNode.createChildNode(\"Variable\").setStringProperty(\"name\", integrator.getGlobalVariableName(i)).setDoubleProperty(\"value\", integrator.getGlobalVariable(i));\r\n SerializationNode& perDofVariablesNode = node.createChildNode(\"PerDofVariables\");\r\n for (int i = 0; i < integrator.getNumPerDofVariables(); i++) {\r\n SerializationNode& perDofValuesNode = perDofVariablesNode.createChildNode(integrator.getPerDofVariableName(i));\r\n vector<Vec3> perDofValues; integrator.getPerDofVariable(i, perDofValues);\r\n- for (int j = 0; j < perDofValues.size(); j++) {\r\n- perDofValuesNode.createChildNode(\"Value\").setDoubleProperty(\"x\",perDofValues[j][0]).setDoubleProperty(\"y\",perDofValues[j][1]).setDoubleProperty(\"z\",perDofValues[j][2]);\r\n- }\r\n+ for (int j = 0; j < perDofValues.size(); j++)\r\n+ perDofValuesNode.createChildNode(\"Value\").setDoubleProperty(\"x\", perDofValues[j][0]).setDoubleProperty(\"y\", perDofValues[j][1]).setDoubleProperty(\"z\", perDofValues[j][2]);\r\n }\r\n SerializationNode& computationsNode = node.createChildNode(\"Computations\");\r\n for (int i = 0; i < integrator.getNumComputations(); i++) {\r\n@@ -60,26 +57,30 @@ void CustomIntegratorProxy::serialize(const void* object, SerializationNode& nod\n string computationVariable;\r\n string computationExpression;\r\n integrator.getComputationStep(i, computationType, computationVariable, computationExpression);\r\n- computationsNode.createChildNode(\"Computation\").setIntProperty(\"computationType\",static_cast<int>(computationType))\r\n- .setStringProperty(\"computationVariable\",computationVariable).setStringProperty(\"computationExpression\",computationExpression);\r\n+ computationsNode.createChildNode(\"Computation\").setIntProperty(\"computationType\", static_cast<int>(computationType))\r\n+ .setStringProperty(\"computationVariable\", computationVariable).setStringProperty(\"computationExpression\", computationExpression);\r\n }\r\n SerializationNode& functions = node.createChildNode(\"Functions\");\r\n for (int i = 0; i < integrator.getNumTabulatedFunctions(); i++)\r\n functions.createChildNode(\"Function\", &integrator.getTabulatedFunction(i)).setStringProperty(\"name\", integrator.getTabulatedFunctionName(i));\r\n- node.setStringProperty(\"kineticEnergyExpression\",integrator.getKineticEnergyExpression());\r\n- node.setIntProperty(\"randomSeed\",integrator.getRandomNumberSeed());\r\n- node.setDoubleProperty(\"stepSize\",integrator.getStepSize());\r\n- node.setDoubleProperty(\"constraintTolerance\",integrator.getConstraintTolerance());\r\n+ node.setStringProperty(\"kineticEnergyExpression\", integrator.getKineticEnergyExpression());\r\n+ node.setIntProperty(\"randomSeed\", integrator.getRandomNumberSeed());\r\n+ node.setDoubleProperty(\"stepSize\", integrator.getStepSize());\r\n+ node.setDoubleProperty(\"constraintTolerance\", integrator.getConstraintTolerance());\r\n }\r\n \r\n void* CustomIntegratorProxy::deserialize(const SerializationNode& node) const {\r\n int version = node.getIntProperty(\"version\");\r\n- if (version < 1 || version > 2)\r\n+ if (version < 1 || version > 3)\r\n throw OpenMMException(\"Unsupported version number\");\r\n CustomIntegrator* integrator = new CustomIntegrator(node.getDoubleProperty(\"stepSize\"));\r\n const SerializationNode& globalVariablesNode = node.getChildNode(\"GlobalVariables\");\r\n- for (auto& prop : globalVariablesNode.getProperties())\r\n- integrator->addGlobalVariable(prop.first, globalVariablesNode.getDoubleProperty(prop.first));\r\n+ if (version < 3)\r\n+ for (auto& prop : globalVariablesNode.getProperties())\r\n+ integrator->addGlobalVariable(prop.first, globalVariablesNode.getDoubleProperty(prop.first));\r\n+ else\r\n+ for (auto& var : globalVariablesNode.getChildren())\r\n+ integrator->addGlobalVariable(var.getStringProperty(\"name\"), var.getDoubleProperty(\"value\"));\r\n const SerializationNode& perDofVariablesNode = node.getChildNode(\"PerDofVariables\");\r\n int count = 0;\r\n for (auto& var : perDofVariablesNode.getChildren()) {\r\n"}, "test": {"test_patch": "diff --git a/serialization/tests/TestSerializeIntegrator.cpp b/serialization/tests/TestSerializeIntegrator.cpp\nindex d24fe4f74d..2663de097a 100644\n--- a/serialization/tests/TestSerializeIntegrator.cpp\n+++ b/serialization/tests/TestSerializeIntegrator.cpp\n@@ -6,7 +6,7 @@\n * Biological Structures at Stanford, funded under the NIH Roadmap for *\n * Medical Research, grant U54 GM072970. See https://simtk.org. *\n * *\n- * Portions copyright (c) 2010-2019 Stanford University and the Authors. *\n+ * Portions copyright (c) 2010-2024 Stanford University and the Authors. *\n * Authors: Peter Eastman, Yutong Zhao *\n * Contributors: *\n * *\n@@ -154,8 +154,8 @@ void testSerializeCustomIntegrator() {\n intg->addGlobalVariable(\"oute\", 0);\n intg->addGlobalVariable(\"oute1\", 0);\n intg->addGlobalVariable(\"oute2\", 0);\n- intg->addGlobalVariable(\"oute3_conditional_v1\", 0);// HACK: need addGlobals to be alphabetical to work around bug\n intg->addGlobalVariable(\"oute3_conditional_v2\", 0);\n+ intg->addGlobalVariable(\"oute3_conditional_v1\", 0);\n intg->addComputePerDof(\"outf\", \"f\");\n intg->addComputePerDof(\"outf1\", \"f1\");\n intg->addComputePerDof(\"outf2\", \"f2\");\n", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}88{"question_id": "MSB_openmm_openmm_pr4647", "question_type": "multi_swe_bench", "description": "Updates to AmoebaVdwForce, AmoebaGeneralizedKirkwoodForce and AmoebaWcaDispersionForce (openmm/openmm#4647)", "content": {"org": "openmm", "repo": "openmm", "pr_number": 4647, "issue_title": "Updates to AmoebaVdwForce, AmoebaGeneralizedKirkwoodForce and AmoebaWcaDispersionForce", "issue_body": "The updates to the AmoebaGeneralizedKirkwoodForce and AmoebaWcaDispersionForce will align OpenMM with recent updates to the corresponding forces in Tinker and FFX (further details are available here https://doi.org/10.1063/5.0158914).\r\n\r\nThe update to the AmoebaVdwForce adds a per-particle scale factor needed for continuous AMOEBA CpHMD (described here https://doi.org/10.1021/acs.jctc.3c01180) to support many hydrogen atoms being turned on / off.", "base_commit": "78c1536838c63125b77e48b170f6a352ae07506c", "resolved_issues": [{"number": null, "title": "Updates to AmoebaVdwForce, AmoebaGeneralizedKirkwoodForce and AmoebaWcaDispersionForce", "body": "### Issue Description\n\n**Problem:**\nThe current implementation of the `AmoebaGeneralizedKirkwoodForce`, `AmoebaWcaDispersionForce`, and `AmoebaVdwForce` in OpenMM is outdated and lacks compatibility with recent advancements in related force field models. Specifically:\n1. The `AmoebaGeneralizedKirkwoodForce` and `AmoebaWcaDispersionForce` do not reflect updates introduced in the latest versions of Tinker and FFX, which include improved parameterization and functionality for generalized Born and dispersion forces.\n2. The `AmoebaVdwForce` is missing a per-particle scale factor required to support continuous AMOEBA constant-pH molecular dynamics (CpHMD), which is necessary for simulations involving hydrogen atoms being turned on or off.\n\n**Expected Behavior:**\n1. The `AmoebaGeneralizedKirkwoodForce` and `AmoebaWcaDispersionForce` should be updated to align with the latest advancements in Tinker and FFX, ensuring consistency and improved accuracy in simulations.\n2. The `AmoebaVdwForce` should support a per-particle scale factor to enable continuous AMOEBA CpHMD simulations, allowing for proper handling of hydrogen atom transitions during simulations.\n\nThese updates are essential to maintain compatibility with modern force field developments and to support advanced simulation techniques.\n\n## IMPORTANT INSTRUCTIONS\n\n1. If you edit a python file, you MUST run 'make PythonInstall' inside the build directory\n2. If you edit a c++ file, you MUST run 'make -j4 && make install\" inside the build directory"}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/openmm_m_openmm:pr-4647", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/plugins/amoeba/openmmapi/include/openmm/AmoebaGeneralizedKirkwoodForce.h b/plugins/amoeba/openmmapi/include/openmm/AmoebaGeneralizedKirkwoodForce.h\nindex b258f4eb05..af52935cac 100644\n--- a/plugins/amoeba/openmmapi/include/openmm/AmoebaGeneralizedKirkwoodForce.h\n+++ b/plugins/amoeba/openmmapi/include/openmm/AmoebaGeneralizedKirkwoodForce.h\n@@ -69,6 +69,10 @@ class OPENMM_EXPORT_AMOEBA AmoebaGeneralizedKirkwoodForce : public Force {\n * Add the parameters for a particle. This should be called once for each particle\n * in the System. When it is called for the i'th time, it specifies the parameters for the i'th particle.\n *\n+ * This method is provided for backwards compatibility. Compared to the alternative five parameter addParticle\n+ * method, the descreenRadius parameter is set to base radius value and the neckFactor is set to zero\n+ * (no neck descreening).\n+ *\n * @param charge the charge of the particle, measured in units of the proton charge\n * @param radius the atomic radius of the particle, measured in nm\n * @param scalingFactor the scaling factor for the particle\n@@ -76,25 +80,55 @@ class OPENMM_EXPORT_AMOEBA AmoebaGeneralizedKirkwoodForce : public Force {\n */\n int addParticle(double charge, double radius, double scalingFactor);\n \n+ /**\n+ * Add the parameters for a particle. This should be called once for each particle\n+ * in the System. When it is called for the i'th time, it specifies the parameters for the i'th particle.\n+ * <p>\n+ * For generalized Born / generalized Kirkwood methods, the radius of each atom has two roles. The first\n+ * is to define the base radius of the atom when computing its effective radius. This base radius is usually\n+ * parameterized against solvation free energy differences. The second role is to describe how much continuum\n+ * water is displaced when the atom descreens water for the calculation of the Born radii of other atoms.\n+ * Separation of the two roles into the \"radius\" and \"descreenRadius\" parameters gives model developers more\n+ * control over these separate roles.\n+ * <p>\n+ * For example, the fitting of base \"radius\" values will usually result in deviation from the force field's\n+ * van der Waals definition of Rmin (or sigma). The descreenRadius can be defined separately using force field\n+ * van der Waals Rmin values, which maintains consistency of atomic sizes during the HCT pairwise\n+ * descreening integral. The \"scalingFactor\" is applied to the descreenRadius during the HCT pairwise\n+ * descreening integral, while the neckFactor (if greater than zero) includes neck contributions to descreening.\n+ *\n+ * @param charge the charge of the particle, measured in units of the proton charge\n+ * @param radius the atomic radius of the particle, measured in nm\n+ * @param scalingFactor the scaling factor for the particle (unitless)\n+ * @param descreenRadius the atomic radius of the particle for descreening, measure in nm\n+ * @param neckFactor the scaling factor for interstitial neck descreening (unitless)\n+ * @return the index of the particle that was added\n+ */\n+ int addParticle(double charge, double radius, double scalingFactor, double descreenRadius, double neckFactor);\n+\n /**\n * Get the force field parameters for a particle.\n- * \n+ *\n * @param index the index of the particle for which to get parameters\n * @param[out] charge the charge of the particle, measured in units of the proton charge\n * @param[out] radius the atomic radius of the particle, measured in nm\n * @param[out] scalingFactor the scaling factor for the particle\n- */\n- void getParticleParameters(int index, double& charge, double& radius, double& scalingFactor) const;\n+ * @param[out] descreenRadius the atomic radius of the particle for descreening, measure in nm\n+ * @param[out] neckFactor the scaling factor for interstitial neck descreening (unitless)\n+ */\n+ void getParticleParameters(int index, double& charge, double& radius, double& scalingFactor, double& descreenRadius, double& neckFactor) const;\n \n /**\n * Set the force field parameters for a particle.\n- * \n- * @param index the index of the particle for which to set parameters\n- * @param charge the charge of the particle, measured in units of the proton charge\n- * @param radius the atomic radius of the particle, measured in nm\n- * @param scalingFactor the scaling factor for the particle\n- */\n- void setParticleParameters(int index, double charge, double radius, double scalingFactor);\n+ *\n+ * @param index the index of the particle for which to set parameters\n+ * @param charge the charge of the particle, measured in units of the proton charge\n+ * @param radius the atomic radius of the particle, measured in nm\n+ * @param scalingFactor the scaling factor for the particle\n+ * @param descreenRadius the atomic radius of the particle for descreening, measure in nm\n+ * @param neckFactor the scaling factor for interstitial neck descreening (unitless)\n+ */\n+ void setParticleParameters(int index, double charge, double radius, double scalingFactor, double descreenRadius, double neckFactor);\n \n /**\n * Get the dielectric constant for the solvent.\n@@ -119,38 +153,116 @@ class OPENMM_EXPORT_AMOEBA AmoebaGeneralizedKirkwoodForce : public Force {\n \n /**\n * Set the dielectric constant for the solute.\n+ *\n+ * @param dielectric The solute dielectric constant.\n */\n void setSoluteDielectric(double dielectric) {\n soluteDielectric = dielectric;\n }\n \n+ /**\n+ * Get the flag signaling whether the solute descreening integral is rescaled by a Tanh function\n+ * to account for interstitial spaces. If True then tanh rescaling is used.\n+ */\n+ bool getTanhRescaling() const {\n+ return tanhRescaling;\n+ }\n+\n+ /**\n+ * Set the flag signaling whether the solute descreening integral is rescaled by a Tanh function\n+ * to account for interstitial spaces.\n+ *\n+ * @param tanhRescale False to turn off Tanh rescaling; true to turn on.\n+ */\n+ void setTanhRescaling(bool tanhRescale) {\n+ this->tanhRescaling = tanhRescale;\n+ }\n+\n+ /**\n+ * Get Tanh function parameters b0, b1 and b2.\n+ *\n+ * @param b0 The first tanh parameter.\n+ * @param b1 The second tanh parameter.\n+ * @param b2 The third tanh parameter.\n+ */\n+ void getTanhParameters(double& b0, double& b1, double& b2) const {\n+ b0 = this->beta0;\n+ b1 = this->beta1;\n+ b2 = this->beta2;\n+ }\n+\n+ /**\n+ * Set the the Tanh function parameters to account for interstitial spaces.\n+ *\n+ * @param b0 The first tanh parameter.\n+ * @param b1 The second tanh parameter.\n+ * @param b2 The third tanh parameter.\n+ */\n+ void setTanhParameters(double b0, double b1, double b2) {\n+ this->beta0 = b0;\n+ this->beta1 = b1;\n+ this->beta2 = b2;\n+ }\n+\n+ /**\n+ * Get the offset added to the atomic radius of each atom that sets the beginning of the\n+ * descreening integral when calculating effective Born radii.\n+ */\n+ double getDescreenOffset() const;\n+\n+ /**\n+ * Get the offset added to the atomic radius of each atom that sets the beginning of the\n+ * descreening integral when calculating effective Born radii.\n+ *\n+ * @param descreenOffet The descreening offset (nm).\n+ */\n+ void setDescreenOffset(double descreenOffet);\n+\n /**\n * Get the flag signaling whether the cavity term should be included\n */\n int getIncludeCavityTerm() const;\n \n /**\n- * Set the flag signaling whether the cavity term should be included\n+ * Set the flag signaling whether the cavity term should be included.\n+ *\n+ * @param includeCavityTerm Zero to turn off the cavity term; one to turn on.\n */\n void setIncludeCavityTerm(int includeCavityTerm);\n \n /**\n- * Get the probe radius (nm) used in SASA contribution\n+ * Get the probe radius (nm) used for the cavity contribution.\n */\n double getProbeRadius() const;\n \n /**\n- * Set the probe radius (nm) used in SASA contribution\n+ * Set the probe radius (nm) used for the cavity contribution.\n+ *\n+ * @param probeRadius The probeRadius for the cavity term.\n */\n void setProbeRadius(double probeRadius);\n \n+ /**\n+ * Get the dielectric offset (nm) used for cavity contribution.\n+ */\n+ double getDielectricOffset() const;\n+\n+ /**\n+ * Set the dielectric offset (nm) used for cavity contribution.\n+ *\n+ * @param dielectricOffset The dielectric offset (nm).\n+ */\n+ void setDielectricOffset(double dielectricOffset);\n+\n /**\n * Get the surface area factor kJ/(nm*nm) used in SASA contribution\n */\n double getSurfaceAreaFactor() const;\n \n /**\n- * Set the surface area factor kJ/(nm*nm) used in SASA contribution\n+ * Set the surface area factor kJ/(nm*nm) used in SASA contribution.\n+ *\n+ * @param surfaceAreaFactor The surface area factor in kJ/(nm*nm).\n */\n void setSurfaceAreaFactor(double surfaceAreaFactor);\n /**\n@@ -177,8 +289,10 @@ class OPENMM_EXPORT_AMOEBA AmoebaGeneralizedKirkwoodForce : public Force {\n private:\n class ParticleInfo;\n int includeCavityTerm;\n+ bool tanhRescaling;\n double solventDielectric, soluteDielectric, dielectricOffset,\n probeRadius, surfaceAreaFactor;\n+ double beta0, beta1, beta2, descreenOffset;\n std::vector<ParticleInfo> particles;\n };\n \n@@ -188,12 +302,12 @@ class OPENMM_EXPORT_AMOEBA AmoebaGeneralizedKirkwoodForce : public Force {\n */\n class AmoebaGeneralizedKirkwoodForce::ParticleInfo {\n public:\n- double charge, radius, scalingFactor;\n+ double charge, radius, scalingFactor, descreenRadius, neckFactor;\n ParticleInfo() {\n- charge = radius = scalingFactor = 0.0;\n+ charge = radius = scalingFactor = descreenRadius = neckFactor = 0.0;\n }\n- ParticleInfo(double charge, double radius, double scalingFactor) :\n- charge(charge), radius(radius), scalingFactor(scalingFactor) {\n+ ParticleInfo(double charge, double radius, double scalingFactor, double descreenRadius, double neckFactor) :\n+ charge(charge), radius(radius), scalingFactor(scalingFactor), descreenRadius(descreenRadius), neckFactor(neckFactor) {\n }\n };\n \ndiff --git a/plugins/amoeba/openmmapi/include/openmm/AmoebaVdwForce.h b/plugins/amoeba/openmmapi/include/openmm/AmoebaVdwForce.h\nindex 11af5f67bb..60373e8e74 100644\n--- a/plugins/amoeba/openmmapi/include/openmm/AmoebaVdwForce.h\n+++ b/plugins/amoeba/openmmapi/include/openmm/AmoebaVdwForce.h\n@@ -173,10 +173,11 @@ class OPENMM_EXPORT_AMOEBA AmoebaVdwForce : public Force {\n * @param reductionFactor the fraction of the distance along the line from the parent particle to this particle\n * at which the interaction site should be placed\n * @param isAlchemical if true, this vdW particle is undergoing an alchemical change.\n- * @param typeIndex the index of the particle type for this particle\n+ * @param typeIndex the index of the particle type for this particle.\n+ * @param scaleFactor a scale factor to apply to all interactions involving this particle (used for CpHMD).\n */\n void setParticleParameters(int particleIndex, int parentIndex, double sigma, double epsilon, \n- double reductionFactor, bool isAlchemical=false, int typeIndex=-1);\n+ double reductionFactor, bool isAlchemical=false, int typeIndex=-1, double scaleFactor = 1.0);\n \n /**\n * Get the force field parameters for a vdw particle.\n@@ -189,9 +190,10 @@ class OPENMM_EXPORT_AMOEBA AmoebaVdwForce : public Force {\n * at which the interaction site should be placed\n * @param[out] isAlchemical if true, this vdW particle is undergoing an alchemical change.\n * @param[out] typeIndex the index of the particle type for this particle\n+ * @param[out] scaleFactor a scale factor to apply to all interactions involving this particle (used for CpHMD).\n */\n void getParticleParameters(int particleIndex, int& parentIndex, double& sigma, double& epsilon, \n- double& reductionFactor, bool& isAlchemical, int& typeIndex) const;\n+ double& reductionFactor, bool& isAlchemical, int& typeIndex, double& scaleFactor) const;\n \n /**\n * Add the force field parameters for a vdw particle. This version is used when parameters\n@@ -203,9 +205,10 @@ class OPENMM_EXPORT_AMOEBA AmoebaVdwForce : public Force {\n * @param reductionFactor the fraction of the distance along the line from the parent particle to this particle\n * at which the interaction site should be placed\n * @param isAlchemical if true, this vdW particle is undergoing an alchemical change.\n+ * @param scaleFactor a scale factor to apply to all interactions involving this particle (used for CpHMD).\n * @return index of added particle\n */\n- int addParticle(int parentIndex, double sigma, double epsilon, double reductionFactor, bool isAlchemical = false);\n+ int addParticle(int parentIndex, double sigma, double epsilon, double reductionFactor, bool isAlchemical = false, double scaleFactor = 1.0);\n \n /**\n * Add the force field parameters for a vdw particle. This version is used when parameters\n@@ -216,9 +219,10 @@ class OPENMM_EXPORT_AMOEBA AmoebaVdwForce : public Force {\n * @param reductionFactor the fraction of the distance along the line from the parent particle to this particle\n * at which the interaction site should be placed\n * @param isAlchemical if true, this vdW particle is undergoing an alchemical change.\n+ * @param scaleFactor a scale factor to apply to all interactions involving this particle (used for CpHMD).\n * @return index of added particle\n */\n- int addParticle(int parentIndex, int typeIndex, double reductionFactor, bool isAlchemical = false);\n+ int addParticle(int parentIndex, int typeIndex, double reductionFactor, bool isAlchemical = false, double scaleFactor = 1.0);\n \n /**\n * Add a particle type.\n@@ -489,17 +493,20 @@ class OPENMM_EXPORT_AMOEBA AmoebaVdwForce : public Force {\n class AmoebaVdwForce::VdwInfo {\n public:\n int parentIndex, typeIndex;\n- double reductionFactor, sigma, epsilon, cutoff;\n+ double reductionFactor, sigma, epsilon, scaleFactor;\n bool isAlchemical;\n VdwInfo() {\n parentIndex = -1;\n+ typeIndex = -1;\n reductionFactor = 0.0;\n sigma = 1.0;\n epsilon = 0.0;\n+ scaleFactor = 1.0;\n isAlchemical = false;\n }\n- VdwInfo(int parentIndex, double sigma, double epsilon, int typeIndex, double reductionFactor, bool isAlchemical) :\n- parentIndex(parentIndex), reductionFactor(reductionFactor), sigma(sigma), epsilon(epsilon), typeIndex(typeIndex), isAlchemical(isAlchemical) {\n+ VdwInfo(int parentIndex, double sigma, double epsilon, int typeIndex, double reductionFactor, bool isAlchemical, double scaleFactor) :\n+ parentIndex(parentIndex), reductionFactor(reductionFactor), sigma(sigma), epsilon(epsilon),\n+ typeIndex(typeIndex), isAlchemical(isAlchemical), scaleFactor(scaleFactor) {\n }\n };\n \ndiff --git a/plugins/amoeba/openmmapi/include/openmm/internal/AmoebaGeneralizedKirkwoodForceImpl.h b/plugins/amoeba/openmmapi/include/openmm/internal/AmoebaGeneralizedKirkwoodForceImpl.h\nindex d82c0c19a9..3f46708af3 100644\n--- a/plugins/amoeba/openmmapi/include/openmm/internal/AmoebaGeneralizedKirkwoodForceImpl.h\n+++ b/plugins/amoeba/openmmapi/include/openmm/internal/AmoebaGeneralizedKirkwoodForceImpl.h\n@@ -62,6 +62,54 @@ class AmoebaGeneralizedKirkwoodForceImpl : public ForceImpl {\n return kernel;\n }\n void updateParametersInContext(ContextImpl& context);\n+\n+ /**\n+ * Compute a \"neck\" descreening contribution.\n+ * <p>\n+ * Using the tabulated Aij and Bij values, compute the neck integral\n+ * using Equations 13 and 14 from Aguilar, Shadrach and Onufriev (10.1021/ct100392h).\n+ *\n+ * @param r separation distance.\n+ * @param radius Radius of the current atom.\n+ * @param radiusK Radius of the descreening atom.\n+ * @param sneck The neck scale factor.\n+ * @return The integral value.\n+ */\n+ static double neckDescreen(double r, double radius, double radiusK, double sneck);\n+\n+ /**\n+ * Get Neck Aij and Bij constants.\n+ *\n+ * Based on the radii of two input atoms (\"radius\" for the atom being descreened\n+ * and \"radiusK\" for the descreening atom), the neck parameters Aij and Bij are\n+ * interpolated from tabulated values. The definitions of Aij and Bij are defined by\n+ * Eq. 11 from Corrigan et al. (10.1063/5.0158914) while Figure 2 describes\n+ * a neck descreening region.\n+ *\n+ * @param radius Radius of the current atom.\n+ * @param radiusK Radius of the descreening atom.\n+ * @param aij The Aij neck constant.\n+ * @param bij the Bij neck constant.\n+ */\n+ static void getNeckConstants(double radius, double radiusK, double &aij, double &bij);\n+\n+ /**\n+ * The array of neck tabulated radii values.\n+ */\n+ static const std::vector<float>& getNeckRadii();\n+\n+ const static int NUM_NECK_RADII = 45;\n+\n+ /**\n+ * The tabulated Aij parameters.\n+ */\n+ const static float (&getAij())[NUM_NECK_RADII][NUM_NECK_RADII];\n+\n+ /**\n+ * The tabulated Bij parameters.\n+ */\n+ const static float (&getBij())[NUM_NECK_RADII][NUM_NECK_RADII];\n+\n private:\n const AmoebaGeneralizedKirkwoodForce& owner;\n Kernel kernel;\ndiff --git a/plugins/amoeba/openmmapi/src/AmoebaGeneralizedKirkwoodForce.cpp b/plugins/amoeba/openmmapi/src/AmoebaGeneralizedKirkwoodForce.cpp\nindex afcd67eb7e..fd1dd68ea6 100644\n--- a/plugins/amoeba/openmmapi/src/AmoebaGeneralizedKirkwoodForce.cpp\n+++ b/plugins/amoeba/openmmapi/src/AmoebaGeneralizedKirkwoodForce.cpp\n@@ -36,35 +36,45 @@\n \n using namespace OpenMM;\n \n-AmoebaGeneralizedKirkwoodForce::AmoebaGeneralizedKirkwoodForce() : solventDielectric(78.3), soluteDielectric(1.0), dielectricOffset(0.009), includeCavityTerm(1), probeRadius(0.14) {\n-\n+AmoebaGeneralizedKirkwoodForce::AmoebaGeneralizedKirkwoodForce() :\n+ solventDielectric(78.3), soluteDielectric(1.0), dielectricOffset(0.009), includeCavityTerm(1), probeRadius(0.14),\n+ tanhRescaling(false), beta0(0.9563), beta1(0.2578), beta2(0.0810), descreenOffset(0.0) {\n surfaceAreaFactor = -6.0* 3.1415926535*0.0216*1000.0*0.4184;\n }\n \n int AmoebaGeneralizedKirkwoodForce::addParticle(double charge, double radius, double scalingFactor) {\n- particles.push_back(ParticleInfo(charge, radius, scalingFactor));\n+ particles.push_back(ParticleInfo(charge, radius, scalingFactor, radius, 0.0));\n return particles.size()-1;\n }\n \n-void AmoebaGeneralizedKirkwoodForce::getParticleParameters(int index, double& charge, double& radius, double& scalingFactor) const {\n+int AmoebaGeneralizedKirkwoodForce::addParticle(double charge, double radius, double scalingFactor, double descreenRadius, double neckFactor) {\n+ particles.push_back(ParticleInfo(charge, radius, scalingFactor, descreenRadius, neckFactor));\n+ return particles.size()-1;\n+}\n+\n+void AmoebaGeneralizedKirkwoodForce::getParticleParameters(int index, double& charge, double& radius, double& scalingFactor, double& descreenRadius, double& neckFactor) const {\n charge = particles[index].charge;\n radius = particles[index].radius;\n scalingFactor = particles[index].scalingFactor;\n+ descreenRadius = particles[index].descreenRadius;\n+ neckFactor = particles[index].neckFactor;\n }\n \n-void AmoebaGeneralizedKirkwoodForce::setParticleParameters(int index, double charge, double radius, double scalingFactor) {\n+void AmoebaGeneralizedKirkwoodForce::setParticleParameters(int index, double charge, double radius, double scalingFactor, double descreenRadius, double neckFactor) {\n particles[index].charge = charge;\n particles[index].radius = radius;\n particles[index].scalingFactor = scalingFactor;\n+ particles[index].descreenRadius = descreenRadius;\n+ particles[index].neckFactor = neckFactor;\n }\n-/*\n+\n double AmoebaGeneralizedKirkwoodForce::getDielectricOffset() const {\n return dielectricOffset;\n }\n \n void AmoebaGeneralizedKirkwoodForce::setDielectricOffset(double inputDielectricOffset) {\n dielectricOffset = inputDielectricOffset;\n-} */\n+}\n \n int AmoebaGeneralizedKirkwoodForce::getIncludeCavityTerm() const {\n return includeCavityTerm;\n@@ -90,6 +100,14 @@ void AmoebaGeneralizedKirkwoodForce::setSurfaceAreaFactor(double inputSurfaceAre\n surfaceAreaFactor = inputSurfaceAreaFactor;\n }\n \n+double AmoebaGeneralizedKirkwoodForce::getDescreenOffset() const {\n+ return descreenOffset;\n+}\n+\n+void AmoebaGeneralizedKirkwoodForce::setDescreenOffset(double inputDescreenOffet) {\n+ descreenOffset = inputDescreenOffet;\n+}\n+\n ForceImpl* AmoebaGeneralizedKirkwoodForce::createImpl() const {\n return new AmoebaGeneralizedKirkwoodForceImpl(*this);\n }\ndiff --git a/plugins/amoeba/openmmapi/src/AmoebaGeneralizedKirkwoodForceImpl.cpp b/plugins/amoeba/openmmapi/src/AmoebaGeneralizedKirkwoodForceImpl.cpp\nindex 432700e74a..4328ed08a0 100644\n--- a/plugins/amoeba/openmmapi/src/AmoebaGeneralizedKirkwoodForceImpl.cpp\n+++ b/plugins/amoeba/openmmapi/src/AmoebaGeneralizedKirkwoodForceImpl.cpp\n@@ -34,7 +34,6 @@\n #include \"openmm/amoebaKernels.h\"\n \n using namespace OpenMM;\n-using std::vector;\n \n AmoebaGeneralizedKirkwoodForceImpl::AmoebaGeneralizedKirkwoodForceImpl(const AmoebaGeneralizedKirkwoodForce& owner) : owner(owner) {\n }\n@@ -68,3 +67,567 @@ void AmoebaGeneralizedKirkwoodForceImpl::updateParametersInContext(ContextImpl&\n kernel.getAs<CalcAmoebaGeneralizedKirkwoodForceKernel>().copyParametersToContext(context, owner);\n context.systemChanged();\n }\n+\n+const static std::vector<float> NECK_RADII = {\n+ 0.80, 0.85, 0.90, 0.95, 1.00, 1.05, 1.10, 1.15, 1.20, 1.25,\n+ 1.30, 1.35, 1.40, 1.45, 1.50, 1.55, 1.60, 1.65, 1.70, 1.75,\n+ 1.80, 1.85, 1.90, 1.95, 2.00, 2.05, 2.10, 2.15, 2.20, 2.25,\n+ 2.30, 2.35, 2.40, 2.45, 2.50, 2.55, 2.60, 2.65, 2.70, 2.75,\n+ 2.80, 2.85, 2.90, 2.95, 3.00};\n+\n+const static double MINIMUM_RADIUS = 0.80;\n+const static double MAXIMUM_RADIUS = 3.00;\n+const static double SPACING = 0.05;\n+\n+const static float Aij[AmoebaGeneralizedKirkwoodForceImpl::NUM_NECK_RADII][AmoebaGeneralizedKirkwoodForceImpl::NUM_NECK_RADII] = {\n+ {0.0000577616, 0.0000584661, 0.0000363925, 0.0000395472, 0.0000443202, 0.0000485507, 0.0000430862,\n+ 0.0000485067, 0.0000244504, 0.0000278293, 0.0000329908, 0.0000292135, 0.0000343621, 0.0000393724,\n+ 0.0000352501, 0.0000303823, 0.0000360595, 0.0000418690, 0.0000365804, 0.0000248824, 0.0000375656,\n+ 0.0000428918, 0.0000377450, 0.0000447160, 0.0000395375, 0.0000345934, 0.0000536114, 0.0000470958,\n+ 0.0000542111, 0.0000360263, 0.0000553398, 0.0000483197, 0.0000555466, 0.0000374290, 0.0000327412,\n+ 0.0000386635, 0.0000578345, 0.0000513194, 0.0000581077, 0.0000394022, 0.0000599546, 0.0000392112,\n+ 0.0000597613, 0.0000403186, 0.0000615149},\n+ {0.0000446374, 0.0000460309, 0.0000475714, 0.0000225974, 0.0000318052, 0.0000275537, 0.0000296576,\n+ 0.0000339157, 0.0000295595, 0.0000344661, 0.0000395587, 0.0000197502, 0.0000300923, 0.0000272524,\n+ 0.0000187561, 0.0000272680, 0.0000247659, 0.0000214933, 0.0000252850, 0.0000223386, 0.0000261633,\n+ 0.0000398363, 0.0000363492, 0.0000412599, 0.0000363327, 0.0000422768, 0.0000367723, 0.0000425282,\n+ 0.0000374607, 0.0000325975, 0.0000383563, 0.0000253707, 0.0000301193, 0.0000200866, 0.0000299808,\n+ 0.0000263514, 0.0000304240, 0.0000349497, 0.0000408533, 0.0000268003, 0.0000407538, 0.0000357651,\n+ 0.0000418473, 0.0000278226, 0.0000419066},\n+ {0.0000360721, 0.0000365794, 0.0000372415, 0.0000303637, 0.0000319835, 0.0000267215, 0.0000171087,\n+ 0.0000252702, 0.0000221094, 0.0000187747, 0.0000212341, 0.0000251617, 0.0000215761, 0.0000191079,\n+ 0.0000291389, 0.0000199177, 0.0000288958, 0.0000260343, 0.0000179669, 0.0000210581, 0.0000178820,\n+ 0.0000215615, 0.0000243911, 0.0000220007, 0.0000249689, 0.0000295075, 0.0000260062, 0.0000297050,\n+ 0.0000203093, 0.0000305802, 0.0000202272, 0.0000308984, 0.0000207930, 0.0000316764, 0.0000277135,\n+ 0.0000316983, 0.0000219362, 0.0000326865, 0.0000286724, 0.0000332929, 0.0000220858, 0.0000332871,\n+ 0.0000294921, 0.0000348374, 0.0000230989},\n+ {0.0000398429, 0.0000223074, 0.0000298279, 0.0000315221, 0.0000187855, 0.0000264807, 0.0000169459,\n+ 0.0000180824, 0.0000162496, 0.0000233148, 0.0000157394, 0.0000174931, 0.0000152866, 0.0000230620,\n+ 0.0000205539, 0.0000234872, 0.0000213273, 0.0000181123, 0.0000210938, 0.0000186307, 0.0000216437,\n+ 0.0000146084, 0.0000222850, 0.0000149429, 0.0000170964, 0.0000153536, 0.0000177037, 0.0000208958,\n+ 0.0000237412, 0.0000164214, 0.0000239561, 0.0000166849, 0.0000188702, 0.0000167221, 0.0000188448,\n+ 0.0000172644, 0.0000194706, 0.0000174585, 0.0000259642, 0.0000177409, 0.0000199219, 0.0000235990,\n+ 0.0000202504, 0.0000234495, 0.0000156052},\n+ {0.0000435754, 0.0000245527, 0.0000318302, 0.0000188461, 0.0000192238, 0.0000208396, 0.0000169209,\n+ 0.0000183816, 0.0000204363, 0.0000131412, 0.0000193141, 0.0000097655, 0.0000110841, 0.0000129627,\n+ 0.0000112003, 0.0000130467, 0.0000113669, 0.0000168195, 0.0000117549, 0.0000134876, 0.0000118881,\n+ 0.0000180528, 0.0000159126, 0.0000181928, 0.0000125940, 0.0000183351, 0.0000125678, 0.0000145035,\n+ 0.0000131847, 0.0000144906, 0.0000129840, 0.0000150912, 0.0000176485, 0.0000153063, 0.0000178114,\n+ 0.0000157934, 0.0000180763, 0.0000157725, 0.0000186835, 0.0000121847, 0.0000185069, 0.0000161900,\n+ 0.0000191223, 0.0000126643, 0.0000192108},\n+ {0.0000505580, 0.0000264633, 0.0000205166, 0.0000195164, 0.0000204987, 0.0000160556, 0.0000127648,\n+ 0.0000137952, 0.0000155458, 0.0000176400, 0.0000146241, 0.0000124027, 0.0000103247, 0.0000120745,\n+ 0.0000105222, 0.0000124882, 0.0000140152, 0.0000095449, 0.0000141168, 0.0000074383, 0.0000142994,\n+ 0.0000098671, 0.0000112045, 0.0000132832, 0.0000113876, 0.0000135139, 0.0000116918, 0.0000137152,\n+ 0.0000118068, 0.0000140495, 0.0000093075, 0.0000144645, 0.0000126001, 0.0000142255, 0.0000128571,\n+ 0.0000148412, 0.0000128819, 0.0000152166, 0.0000099735, 0.0000151882, 0.0000133944, 0.0000154829,\n+ 0.0000135105, 0.0000154771, 0.0000106154},\n+ {0.0000449657, 0.0000230612, 0.0000221541, 0.0000166532, 0.0000171555, 0.0000227174, 0.0000182899,\n+ 0.0000193198, 0.0000118768, 0.0000130396, 0.0000113361, 0.0000093799, 0.0000108573, 0.0000120843,\n+ 0.0000106342, 0.0000117938, 0.0000080569, 0.0000091361, 0.0000107718, 0.0000123647, 0.0000106453,\n+ 0.0000123678, 0.0000109954, 0.0000126151, 0.0000145692, 0.0000128038, 0.0000146248, 0.0000099091,\n+ 0.0000114200, 0.0000059787, 0.0000117991, 0.0000136370, 0.0000119830, 0.0000080880, 0.0000120147,\n+ 0.0000108970, 0.0000161522, 0.0000083711, 0.0000094980, 0.0000112647, 0.0000096319, 0.0000113677,\n+ 0.0000127823, 0.0000114549, 0.0000100471},\n+ {0.0000280510, 0.0000266023, 0.0000144227, 0.0000188499, 0.0000184712, 0.0000146008, 0.0000195724,\n+ 0.0000161268, 0.0000073492, 0.0000137704, 0.0000111866, 0.0000072795, 0.0000081037, 0.0000092319,\n+ 0.0000078144, 0.0000089354, 0.0000102556, 0.0000090005, 0.0000059425, 0.0000090194, 0.0000080186,\n+ 0.0000069127, 0.0000082105, 0.0000093797, 0.0000082401, 0.0000093675, 0.0000082671, 0.0000071727,\n+ 0.0000064889, 0.0000097376, 0.0000087729, 0.0000098019, 0.0000088064, 0.0000059057, 0.0000089896,\n+ 0.0000077635, 0.0000070336, 0.0000047870, 0.0000094273, 0.0000080466, 0.0000093429, 0.0000083051,\n+ 0.0000096725, 0.0000109657, 0.0000097148},\n+ {0.0000325317, 0.0000295175, 0.0000213868, 0.0000208878, 0.0000153087, 0.0000116695, 0.0000091353,\n+ 0.0000128753, 0.0000102693, 0.0000107086, 0.0000088500, 0.0000098955, 0.0000081413, 0.0000052255,\n+ 0.0000078083, 0.0000067997, 0.0000098737, 0.0000066979, 0.0000098507, 0.0000051252, 0.0000074307,\n+ 0.0000067922, 0.0000057491, 0.0000068223, 0.0000058920, 0.0000070420, 0.0000060742, 0.0000069635,\n+ 0.0000062687, 0.0000054473, 0.0000061911, 0.0000073394, 0.0000037836, 0.0000074661, 0.0000084983,\n+ 0.0000073838, 0.0000087027, 0.0000076952, 0.0000088636, 0.0000102208, 0.0000090108, 0.0000104452,\n+ 0.0000090944, 0.0000104765, 0.0000070232},\n+ {0.0000289111, 0.0000198943, 0.0000241993, 0.0000238536, 0.0000182705, 0.0000129878, 0.0000076255,\n+ 0.0000102719, 0.0000112418, 0.0000067659, 0.0000071756, 0.0000100155, 0.0000065300, 0.0000071811,\n+ 0.0000060818, 0.0000066768, 0.0000059369, 0.0000065993, 0.0000076971, 0.0000063984, 0.0000057069,\n+ 0.0000086185, 0.0000076581, 0.0000051018, 0.0000057661, 0.0000051292, 0.0000058121, 0.0000050955,\n+ 0.0000079236, 0.0000069082, 0.0000060582, 0.0000041682, 0.0000080245, 0.0000042302, 0.0000082046,\n+ 0.0000056029, 0.0000048280, 0.0000057624, 0.0000065014, 0.0000058246, 0.0000049969, 0.0000058491,\n+ 0.0000066001, 0.0000059999, 0.0000088507},\n+ {0.0000265006, 0.0000302279, 0.0000215102, 0.0000203741, 0.0000195197, 0.0000114271, 0.0000110442,\n+ 0.0000113577, 0.0000067378, 0.0000072687, 0.0000074058, 0.0000047733, 0.0000067184, 0.0000076291,\n+ 0.0000062951, 0.0000051957, 0.0000044871, 0.0000050768, 0.0000044211, 0.0000049880, 0.0000043518,\n+ 0.0000048796, 0.0000057445, 0.0000049576, 0.0000057224, 0.0000037798, 0.0000043883, 0.0000066161,\n+ 0.0000044279, 0.0000050580, 0.0000045758, 0.0000051723, 0.0000046936, 0.0000052703, 0.0000047182,\n+ 0.0000041352, 0.0000063088, 0.0000041672, 0.0000063473, 0.0000055519, 0.0000049210, 0.0000033576,\n+ 0.0000049766, 0.0000033829, 0.0000051220},\n+ {0.0000393068, 0.0000205177, 0.0000254533, 0.0000229604, 0.0000129838, 0.0000126427, 0.0000096583,\n+ 0.0000123670, 0.0000100764, 0.0000100625, 0.0000047514, 0.0000049466, 0.0000041283, 0.0000059449,\n+ 0.0000065208, 0.0000072136, 0.0000045347, 0.0000039272, 0.0000033654, 0.0000038633, 0.0000032913,\n+ 0.0000038211, 0.0000041976, 0.0000037860, 0.0000042838, 0.0000037697, 0.0000043641, 0.0000038556,\n+ 0.0000033089, 0.0000039242, 0.0000043859, 0.0000051678, 0.0000034265, 0.0000040012, 0.0000035224,\n+ 0.0000053110, 0.0000046531, 0.0000053869, 0.0000036188, 0.0000054308, 0.0000048054, 0.0000055242,\n+ 0.0000048512, 0.0000056159, 0.0000037853},\n+ {0.0000340677, 0.0000307596, 0.0000223668, 0.0000152946, 0.0000146712, 0.0000106255, 0.0000106032,\n+ 0.0000081832, 0.0000086244, 0.0000049411, 0.0000067545, 0.0000040421, 0.0000044178, 0.0000036241,\n+ 0.0000052208, 0.0000032905, 0.0000048780, 0.0000053199, 0.0000046459, 0.0000039440, 0.0000026124,\n+ 0.0000050097, 0.0000026014, 0.0000029505, 0.0000032710, 0.0000037980, 0.0000043410, 0.0000037740,\n+ 0.0000033662, 0.0000050175, 0.0000033958, 0.0000051015, 0.0000034086, 0.0000030335, 0.0000034235,\n+ 0.0000039828, 0.0000045344, 0.0000031386, 0.0000046458, 0.0000041624, 0.0000036086, 0.0000041947,\n+ 0.0000028209, 0.0000033460, 0.0000028613},\n+ {0.0000305973, 0.0000272968, 0.0000142276, 0.0000179127, 0.0000097246, 0.0000127507, 0.0000070473,\n+ 0.0000090593, 0.0000092161, 0.0000074076, 0.0000074685, 0.0000058617, 0.0000047016, 0.0000051588,\n+ 0.0000056952, 0.0000035730, 0.0000038387, 0.0000042402, 0.0000035579, 0.0000018248, 0.0000046133,\n+ 0.0000039370, 0.0000045159, 0.0000029244, 0.0000019710, 0.0000022822, 0.0000025439, 0.0000028944,\n+ 0.0000025756, 0.0000029250, 0.0000034260, 0.0000050361, 0.0000034605, 0.0000038688, 0.0000026949,\n+ 0.0000014049, 0.0000027321, 0.0000023567, 0.0000027913, 0.0000031218, 0.0000027763, 0.0000031969,\n+ 0.0000037163, 0.0000032316, 0.0000037723},\n+ {0.0000363524, 0.0000185238, 0.0000223944, 0.0000156641, 0.0000146928, 0.0000107770, 0.0000105276,\n+ 0.0000102180, 0.0000079337, 0.0000078580, 0.0000062276, 0.0000066384, 0.0000039738, 0.0000055727,\n+ 0.0000060414, 0.0000037461, 0.0000023444, 0.0000033734, 0.0000028739, 0.0000032262, 0.0000026725,\n+ 0.0000030603, 0.0000025932, 0.0000030096, 0.0000019791, 0.0000029386, 0.0000033334, 0.0000029324,\n+ 0.0000025033, 0.0000017645, 0.0000014959, 0.0000022899, 0.0000025847, 0.0000030273, 0.0000026349,\n+ 0.0000039712, 0.0000026279, 0.0000040671, 0.0000020776, 0.0000023832, 0.0000020939, 0.0000024085,\n+ 0.0000021149, 0.0000041807, 0.0000016785},\n+ {0.0000531068, 0.0000206882, 0.0000259899, 0.0000178808, 0.0000168038, 0.0000128055, 0.0000119227,\n+ 0.0000069103, 0.0000090425, 0.0000068286, 0.0000069793, 0.0000031585, 0.0000042989, 0.0000027028,\n+ 0.0000036738, 0.0000031193, 0.0000043434, 0.0000035227, 0.0000030391, 0.0000024934, 0.0000027944,\n+ 0.0000024067, 0.0000027907, 0.0000023644, 0.0000026945, 0.0000022659, 0.0000020013, 0.0000029627,\n+ 0.0000026172, 0.0000017442, 0.0000025980, 0.0000017461, 0.0000020037, 0.0000017818, 0.0000026313,\n+ 0.0000023219, 0.0000026522, 0.0000023901, 0.0000026985, 0.0000014157, 0.0000027079, 0.0000018522,\n+ 0.0000016312, 0.0000019179, 0.0000016703},\n+ {0.0000471466, 0.0000321678, 0.0000221166, 0.0000210526, 0.0000114910, 0.0000108287, 0.0000080777,\n+ 0.0000104203, 0.0000101134, 0.0000058443, 0.0000045067, 0.0000045975, 0.0000027454, 0.0000037782,\n+ 0.0000039918, 0.0000043093, 0.0000046405, 0.0000029403, 0.0000023896, 0.0000020792, 0.0000029414,\n+ 0.0000014845, 0.0000016390, 0.0000018155, 0.0000020600, 0.0000018173, 0.0000020305, 0.0000018045,\n+ 0.0000020275, 0.0000023056, 0.0000026380, 0.0000022906, 0.0000015633, 0.0000022861, 0.0000015702,\n+ 0.0000022925, 0.0000015926, 0.0000017741, 0.0000015991, 0.0000017969, 0.0000021445, 0.0000018491,\n+ 0.0000021663, 0.0000018937, 0.0000021829},\n+ {0.0000415033, 0.0000375035, 0.0000257317, 0.0000181483, 0.0000170401, 0.0000165719, 0.0000091912,\n+ 0.0000089667, 0.0000066295, 0.0000051660, 0.0000051868, 0.0000051552, 0.0000041581, 0.0000041949,\n+ 0.0000044142, 0.0000035882, 0.0000029449, 0.0000031798, 0.0000020273, 0.0000021690, 0.0000024377,\n+ 0.0000026775, 0.0000029680, 0.0000014909, 0.0000021480, 0.0000018690, 0.0000027312, 0.0000014150,\n+ 0.0000020266, 0.0000013942, 0.0000015678, 0.0000014176, 0.0000015601, 0.0000018280, 0.0000020424,\n+ 0.0000023951, 0.0000015782, 0.0000024117, 0.0000016197, 0.0000014155, 0.0000012558, 0.0000018686,\n+ 0.0000016359, 0.0000018949, 0.0000010017},\n+ {0.0000468296, 0.0000330068, 0.0000237247, 0.0000165336, 0.0000150520, 0.0000109676, 0.0000103584,\n+ 0.0000059806, 0.0000075019, 0.0000075639, 0.0000075577, 0.0000044171, 0.0000035406, 0.0000027896,\n+ 0.0000038483, 0.0000030165, 0.0000024502, 0.0000020229, 0.0000037725, 0.0000023248, 0.0000025725,\n+ 0.0000016526, 0.0000018416, 0.0000020307, 0.0000023292, 0.0000019462, 0.0000022344, 0.0000014452,\n+ 0.0000016743, 0.0000024751, 0.0000021503, 0.0000010914, 0.0000016308, 0.0000018570, 0.0000021221,\n+ 0.0000010982, 0.0000016425, 0.0000011133, 0.0000021459, 0.0000018960, 0.0000021557, 0.0000011360,\n+ 0.0000012755, 0.0000011503, 0.0000012923},\n+ {0.0000326803, 0.0000295857, 0.0000154475, 0.0000195504, 0.0000133752, 0.0000130826, 0.0000093108,\n+ 0.0000090846, 0.0000051384, 0.0000065258, 0.0000049655, 0.0000050318, 0.0000039301, 0.0000031064,\n+ 0.0000018937, 0.0000033983, 0.0000027192, 0.0000021941, 0.0000023262, 0.0000011684, 0.0000015864,\n+ 0.0000017653, 0.0000019394, 0.0000021477, 0.0000018003, 0.0000015654, 0.0000017271, 0.0000019541,\n+ 0.0000012911, 0.0000008739, 0.0000016831, 0.0000011063, 0.0000016687, 0.0000014377, 0.0000016576,\n+ 0.0000010945, 0.0000012820, 0.0000010911, 0.0000007782, 0.0000014342, 0.0000013165, 0.0000018913,\n+ 0.0000013170, 0.0000008899, 0.0000013269},\n+ {0.0000381583, 0.0000264565, 0.0000136612, 0.0000212466, 0.0000153348, 0.0000145316, 0.0000138739,\n+ 0.0000060648, 0.0000076347, 0.0000074893, 0.0000043282, 0.0000057183, 0.0000033840, 0.0000045556,\n+ 0.0000035441, 0.0000028461, 0.0000022853, 0.0000031916, 0.0000026005, 0.0000021084, 0.0000013651,\n+ 0.0000024956, 0.0000016110, 0.0000017750, 0.0000014880, 0.0000016813, 0.0000010862, 0.0000016184,\n+ 0.0000013616, 0.0000015542, 0.0000017206, 0.0000015449, 0.0000013086, 0.0000015137, 0.0000012941,\n+ 0.0000011585, 0.0000012793, 0.0000008977, 0.0000009980, 0.0000011586, 0.0000010254, 0.0000011655,\n+ 0.0000010218, 0.0000011671, 0.0000010320},\n+ {0.0000435206, 0.0000394602, 0.0000280329, 0.0000143528, 0.0000103966, 0.0000099195, 0.0000123591,\n+ 0.0000070629, 0.0000087274, 0.0000066090, 0.0000048718, 0.0000038172, 0.0000050202, 0.0000029810,\n+ 0.0000040378, 0.0000024193, 0.0000024874, 0.0000015771, 0.0000016403, 0.0000017939, 0.0000019398,\n+ 0.0000012193, 0.0000017244, 0.0000008475, 0.0000009524, 0.0000008041, 0.0000011807, 0.0000009651,\n+ 0.0000011501, 0.0000012202, 0.0000010892, 0.0000011977, 0.0000010599, 0.0000015547, 0.0000010348,\n+ 0.0000011765, 0.0000010241, 0.0000009188, 0.0000007943, 0.0000009237, 0.0000010314, 0.0000009055,\n+ 0.0000010352, 0.0000009196, 0.0000013384},\n+ {0.0000379248, 0.0000353934, 0.0000241508, 0.0000168891, 0.0000210529, 0.0000086678, 0.0000083510,\n+ 0.0000106765, 0.0000058348, 0.0000057662, 0.0000074621, 0.0000043406, 0.0000033715, 0.0000044195,\n+ 0.0000020552, 0.0000027516, 0.0000016638, 0.0000022213, 0.0000023581, 0.0000019527, 0.0000016003,\n+ 0.0000017368, 0.0000008516, 0.0000009200, 0.0000016828, 0.0000008623, 0.0000009286, 0.0000006197,\n+ 0.0000011498, 0.0000007848, 0.0000006628, 0.0000009788, 0.0000010822, 0.0000012385, 0.0000008152,\n+ 0.0000009435, 0.0000010686, 0.0000012014, 0.0000006276, 0.0000007030, 0.0000010605, 0.0000012119,\n+ 0.0000006389, 0.0000007195, 0.0000006456},\n+ {0.0000457913, 0.0000308903, 0.0000282516, 0.0000197423, 0.0000139036, 0.0000076554, 0.0000101164,\n+ 0.0000092286, 0.0000068324, 0.0000052054, 0.0000050091, 0.0000049163, 0.0000039143, 0.0000029462,\n+ 0.0000039499, 0.0000031099, 0.0000024405, 0.0000014864, 0.0000012048, 0.0000021759, 0.0000013931,\n+ 0.0000014556, 0.0000009208, 0.0000017108, 0.0000011004, 0.0000011923, 0.0000007721, 0.0000006708,\n+ 0.0000005731, 0.0000008092, 0.0000009072, 0.0000007914, 0.0000008763, 0.0000007716, 0.0000006536,\n+ 0.0000007653, 0.0000008561, 0.0000009956, 0.0000008472, 0.0000007539, 0.0000008319, 0.0000005765,\n+ 0.0000008451, 0.0000009713, 0.0000008480},\n+ {0.0000514751, 0.0000274557, 0.0000241481, 0.0000174373, 0.0000161298, 0.0000116871, 0.0000084217,\n+ 0.0000081004, 0.0000058484, 0.0000056938, 0.0000057532, 0.0000043019, 0.0000032347, 0.0000025748,\n+ 0.0000034234, 0.0000026896, 0.0000016029, 0.0000016452, 0.0000023736, 0.0000013932, 0.0000011273,\n+ 0.0000009500, 0.0000013052, 0.0000010750, 0.0000012044, 0.0000010077, 0.0000011046, 0.0000007011,\n+ 0.0000010268, 0.0000008714, 0.0000012822, 0.0000010702, 0.0000007283, 0.0000010366, 0.0000005479,\n+ 0.0000007812, 0.0000005332, 0.0000007670, 0.0000006899, 0.0000007700, 0.0000006826, 0.0000007637,\n+ 0.0000008807, 0.0000004626, 0.0000006769},\n+ {0.0000347279, 0.0000326038, 0.0000222389, 0.0000203032, 0.0000186389, 0.0000135396, 0.0000074878,\n+ 0.0000093982, 0.0000069447, 0.0000051305, 0.0000038953, 0.0000049720, 0.0000038543, 0.0000038303,\n+ 0.0000017387, 0.0000013908, 0.0000018492, 0.0000018676, 0.0000011554, 0.0000016034, 0.0000009913,\n+ 0.0000010369, 0.0000011030, 0.0000015670, 0.0000013066, 0.0000011031, 0.0000009195, 0.0000007778,\n+ 0.0000010981, 0.0000009562, 0.0000010346, 0.0000011776, 0.0000007583, 0.0000005111, 0.0000005726,\n+ 0.0000011004, 0.0000009317, 0.0000004887, 0.0000005500, 0.0000008051, 0.0000005530, 0.0000004756,\n+ 0.0000005513, 0.0000006031, 0.0000005515},\n+ {0.0000404627, 0.0000279374, 0.0000254737, 0.0000173416, 0.0000166276, 0.0000090743, 0.0000084501,\n+ 0.0000108659, 0.0000080225, 0.0000045088, 0.0000044169, 0.0000057245, 0.0000033186, 0.0000043660,\n+ 0.0000034171, 0.0000015607, 0.0000020522, 0.0000012726, 0.0000016999, 0.0000013417, 0.0000018688,\n+ 0.0000015245, 0.0000009452, 0.0000007794, 0.0000008405, 0.0000011825, 0.0000007598, 0.0000008210,\n+ 0.0000007108, 0.0000007647, 0.0000006612, 0.0000007339, 0.0000008145, 0.0000007040, 0.0000006095,\n+ 0.0000008740, 0.0000003513, 0.0000006717, 0.0000005660, 0.0000004997, 0.0000009522, 0.0000005060,\n+ 0.0000005619, 0.0000005063, 0.0000004323},\n+ {0.0000472063, 0.0000323179, 0.0000294752, 0.0000207416, 0.0000113045, 0.0000136112, 0.0000129076,\n+ 0.0000071735, 0.0000091135, 0.0000052733, 0.0000039191, 0.0000038507, 0.0000022739, 0.0000029313,\n+ 0.0000017476, 0.0000029817, 0.0000017682, 0.0000014044, 0.0000018903, 0.0000011418, 0.0000015945,\n+ 0.0000009870, 0.0000010526, 0.0000011160, 0.0000011997, 0.0000013110, 0.0000010830, 0.0000006980,\n+ 0.0000009891, 0.0000006386, 0.0000005495, 0.0000006040, 0.0000006782, 0.0000004347, 0.0000004971,\n+ 0.0000004232, 0.0000004838, 0.0000006935, 0.0000003617, 0.0000004015, 0.0000003611, 0.0000003155,\n+ 0.0000005902, 0.0000003968, 0.0000004545},\n+ {0.0000534708, 0.0000373744, 0.0000196796, 0.0000137544, 0.0000129458, 0.0000119235, 0.0000088305,\n+ 0.0000111632, 0.0000062367, 0.0000059625, 0.0000034417, 0.0000044561, 0.0000033301, 0.0000025232,\n+ 0.0000019586, 0.0000027071, 0.0000015804, 0.0000012263, 0.0000016555, 0.0000017219, 0.0000010458,\n+ 0.0000008561, 0.0000006975, 0.0000009600, 0.0000013346, 0.0000008501, 0.0000004210, 0.0000005776,\n+ 0.0000008267, 0.0000009169, 0.0000004551, 0.0000005061, 0.0000007113, 0.0000006128, 0.0000006790,\n+ 0.0000004531, 0.0000005155, 0.0000005740, 0.0000006449, 0.0000002634, 0.0000004837, 0.0000005547,\n+ 0.0000004790, 0.0000004165, 0.0000004781},\n+ {0.0000471509, 0.0000331027, 0.0000226179, 0.0000161311, 0.0000144893, 0.0000107687, 0.0000104009,\n+ 0.0000128476, 0.0000071831, 0.0000053734, 0.0000030440, 0.0000051224, 0.0000039650, 0.0000022452,\n+ 0.0000017674, 0.0000017430, 0.0000017813, 0.0000014173, 0.0000018887, 0.0000008757, 0.0000012001,\n+ 0.0000016279, 0.0000012946, 0.0000004971, 0.0000008642, 0.0000005591, 0.0000006041, 0.0000006461,\n+ 0.0000005270, 0.0000007557, 0.0000004882, 0.0000007062, 0.0000005940, 0.0000008734, 0.0000005615,\n+ 0.0000004848, 0.0000004202, 0.0000004705, 0.0000004021, 0.0000004565, 0.0000003960, 0.0000004488,\n+ 0.0000004998, 0.0000005792, 0.0000003821},\n+ {0.0000408712, 0.0000290825, 0.0000201809, 0.0000184693, 0.0000127543, 0.0000122856, 0.0000089579,\n+ 0.0000087349, 0.0000048255, 0.0000062188, 0.0000059289, 0.0000044984, 0.0000019907, 0.0000033642,\n+ 0.0000034197, 0.0000026227, 0.0000012039, 0.0000015836, 0.0000009945, 0.0000013051, 0.0000017849,\n+ 0.0000010646, 0.0000005240, 0.0000007062, 0.0000005767, 0.0000006087, 0.0000008726, 0.0000005467,\n+ 0.0000007758, 0.0000006348, 0.0000007039, 0.0000003514, 0.0000006567, 0.0000002671, 0.0000006217,\n+ 0.0000006907, 0.0000005847, 0.0000001470, 0.0000004367, 0.0000003746, 0.0000003283, 0.0000003639,\n+ 0.0000004146, 0.0000003630, 0.0000004069},\n+ {0.0000365867, 0.0000334092, 0.0000233935, 0.0000211266, 0.0000148841, 0.0000145388, 0.0000102065,\n+ 0.0000099718, 0.0000095120, 0.0000041586, 0.0000052071, 0.0000030423, 0.0000030232, 0.0000022968,\n+ 0.0000023000, 0.0000030274, 0.0000022943, 0.0000010722, 0.0000011058, 0.0000014789, 0.0000009014,\n+ 0.0000009248, 0.0000009830, 0.0000010354, 0.0000014149, 0.0000011942, 0.0000005606, 0.0000006027,\n+ 0.0000005065, 0.0000004217, 0.0000005883, 0.0000005132, 0.0000003302, 0.0000004589, 0.0000006648,\n+ 0.0000003397, 0.0000004773, 0.0000003190, 0.0000004559, 0.0000003103, 0.0000005849, 0.0000003016,\n+ 0.0000005635, 0.0000003806, 0.0000002617},\n+ {0.0000424740, 0.0000299616, 0.0000274655, 0.0000188374, 0.0000175698, 0.0000126091, 0.0000089948,\n+ 0.0000068101, 0.0000083814, 0.0000048968, 0.0000060247, 0.0000059532, 0.0000020417, 0.0000044737,\n+ 0.0000025919, 0.0000020128, 0.0000020369, 0.0000012489, 0.0000016173, 0.0000012975, 0.0000013224,\n+ 0.0000010382, 0.0000008390, 0.0000008790, 0.0000009452, 0.0000009921, 0.0000006307, 0.0000006689,\n+ 0.0000003338, 0.0000007868, 0.0000005076, 0.0000004219, 0.0000003654, 0.0000008632, 0.0000004278,\n+ 0.0000003612, 0.0000002445, 0.0000005864, 0.0000002315, 0.0000004357, 0.0000002247, 0.0000004156,\n+ 0.0000002193, 0.0000003178, 0.0000002730},\n+ {0.0000503599, 0.0000451538, 0.0000316354, 0.0000217532, 0.0000202497, 0.0000144337, 0.0000104958,\n+ 0.0000100705, 0.0000074034, 0.0000054909, 0.0000041189, 0.0000040598, 0.0000030289, 0.0000030085,\n+ 0.0000029895, 0.0000023332, 0.0000018003, 0.0000013931, 0.0000018829, 0.0000014630, 0.0000006967,\n+ 0.0000009205, 0.0000012416, 0.0000007812, 0.0000010583, 0.0000006536, 0.0000009038, 0.0000004477,\n+ 0.0000010522, 0.0000006597, 0.0000005567, 0.0000004616, 0.0000006575, 0.0000003344, 0.0000002766,\n+ 0.0000003963, 0.0000005688, 0.0000001793, 0.0000004153, 0.0000004620, 0.0000003992, 0.0000004404,\n+ 0.0000002976, 0.0000004364, 0.0000003740},\n+ {0.0000430595, 0.0000397799, 0.0000271616, 0.0000143472, 0.0000176142, 0.0000168235, 0.0000093500,\n+ 0.0000067329, 0.0000066446, 0.0000082213, 0.0000061390, 0.0000046372, 0.0000034811, 0.0000034735,\n+ 0.0000026730, 0.0000026634, 0.0000015581, 0.0000021099, 0.0000012381, 0.0000016679, 0.0000010186,\n+ 0.0000010483, 0.0000008241, 0.0000011290, 0.0000005475, 0.0000005724, 0.0000004661, 0.0000006409,\n+ 0.0000004075, 0.0000005660, 0.0000004676, 0.0000006678, 0.0000005536, 0.0000004588, 0.0000003086,\n+ 0.0000002600, 0.0000002221, 0.0000004089, 0.0000005910, 0.0000002319, 0.0000003286, 0.0000002849,\n+ 0.0000003188, 0.0000001718, 0.0000003117},\n+ {0.0000503956, 0.0000262755, 0.0000184690, 0.0000169051, 0.0000157560, 0.0000113206, 0.0000108187,\n+ 0.0000079141, 0.0000075536, 0.0000055140, 0.0000054540, 0.0000040614, 0.0000039965, 0.0000023509,\n+ 0.0000030468, 0.0000018116, 0.0000023451, 0.0000013890, 0.0000014094, 0.0000011387, 0.0000011426,\n+ 0.0000007091, 0.0000009704, 0.0000007647, 0.0000008029, 0.0000011008, 0.0000003155, 0.0000004312,\n+ 0.0000004596, 0.0000004817, 0.0000005269, 0.0000005676, 0.0000003706, 0.0000004006, 0.0000004315,\n+ 0.0000004775, 0.0000003098, 0.0000003407, 0.0000004886, 0.0000004152, 0.0000001682, 0.0000003093,\n+ 0.0000002068, 0.0000002292, 0.0000002008},\n+ {0.0000334173, 0.0000309726, 0.0000218877, 0.0000196442, 0.0000138546, 0.0000130794, 0.0000094927,\n+ 0.0000068714, 0.0000086744, 0.0000063898, 0.0000037817, 0.0000048166, 0.0000046345, 0.0000026610,\n+ 0.0000015855, 0.0000020759, 0.0000027141, 0.0000020849, 0.0000016433, 0.0000012979, 0.0000007813,\n+ 0.0000010596, 0.0000004958, 0.0000008546, 0.0000008928, 0.0000005593, 0.0000009962, 0.0000006205,\n+ 0.0000006694, 0.0000004270, 0.0000004437, 0.0000003712, 0.0000005299, 0.0000003383, 0.0000004823,\n+ 0.0000002425, 0.0000004443, 0.0000004843, 0.0000004110, 0.0000001667, 0.0000001831, 0.0000001992,\n+ 0.0000002251, 0.0000003165, 0.0000001686},\n+ {0.0000389225, 0.0000356628, 0.0000246098, 0.0000234810, 0.0000158826, 0.0000154517, 0.0000109594,\n+ 0.0000061715, 0.0000077203, 0.0000057494, 0.0000072006, 0.0000031528, 0.0000032123, 0.0000024479,\n+ 0.0000023896, 0.0000023499, 0.0000018589, 0.0000010985, 0.0000014288, 0.0000011269, 0.0000015138,\n+ 0.0000011720, 0.0000009382, 0.0000009879, 0.0000006065, 0.0000008389, 0.0000005190, 0.0000007012,\n+ 0.0000005724, 0.0000004774, 0.0000003925, 0.0000005365, 0.0000002703, 0.0000004855, 0.0000004093,\n+ 0.0000003496, 0.0000003709, 0.0000002481, 0.0000002089, 0.0000001810, 0.0000001978, 0.0000001719,\n+ 0.0000003092, 0.0000001622, 0.0000002294},\n+ {0.0000337803, 0.0000404714, 0.0000284070, 0.0000198125, 0.0000183754, 0.0000174965, 0.0000126377,\n+ 0.0000121499, 0.0000086656, 0.0000051637, 0.0000063642, 0.0000036800, 0.0000027442, 0.0000046261,\n+ 0.0000027739, 0.0000020991, 0.0000027411, 0.0000015953, 0.0000016454, 0.0000010057, 0.0000013415,\n+ 0.0000010441, 0.0000008211, 0.0000011139, 0.0000004134, 0.0000004295, 0.0000005796, 0.0000003604,\n+ 0.0000004939, 0.0000003153, 0.0000004360, 0.0000004611, 0.0000003900, 0.0000005448, 0.0000003467,\n+ 0.0000004915, 0.0000002450, 0.0000002082, 0.0000002350, 0.0000002486, 0.0000002168, 0.0000002377,\n+ 0.0000001597, 0.0000002236, 0.0000001948},\n+ {0.0000513067, 0.0000471119, 0.0000328458, 0.0000132586, 0.0000211621, 0.0000154592, 0.0000085830,\n+ 0.0000106377, 0.0000060140, 0.0000058815, 0.0000073820, 0.0000042029, 0.0000054567, 0.0000041212,\n+ 0.0000018646, 0.0000023994, 0.0000014275, 0.0000018493, 0.0000011151, 0.0000011543, 0.0000009245,\n+ 0.0000012066, 0.0000007246, 0.0000007519, 0.0000004803, 0.0000008191, 0.0000005011, 0.0000004138,\n+ 0.0000004368, 0.0000003569, 0.0000006387, 0.0000005261, 0.0000004315, 0.0000002781, 0.0000003871,\n+ 0.0000001946, 0.0000003503, 0.0000002314, 0.0000002482, 0.0000002172, 0.0000003055, 0.0000001223,\n+ 0.0000002858, 0.0000001905, 0.0000002117},\n+ {0.0000450816, 0.0000408154, 0.0000282845, 0.0000155178, 0.0000138761, 0.0000175937, 0.0000098262,\n+ 0.0000121258, 0.0000069414, 0.0000066229, 0.0000029233, 0.0000048194, 0.0000037116, 0.0000036148,\n+ 0.0000027563, 0.0000016149, 0.0000009741, 0.0000012561, 0.0000012827, 0.0000016831, 0.0000010254,\n+ 0.0000010378, 0.0000014009, 0.0000008403, 0.0000008877, 0.0000009243, 0.0000009675, 0.0000003626,\n+ 0.0000004818, 0.0000003920, 0.0000003302, 0.0000004548, 0.0000002250, 0.0000003083, 0.0000003321,\n+ 0.0000003601, 0.0000001838, 0.0000002508, 0.0000001319, 0.0000003035, 0.0000000966, 0.0000001703,\n+ 0.0000002389, 0.0000002086, 0.0000000873},\n+ {0.0000516615, 0.0000359046, 0.0000250255, 0.0000176967, 0.0000162043, 0.0000117023, 0.0000111500,\n+ 0.0000083372, 0.0000080845, 0.0000057760, 0.0000057683, 0.0000042198, 0.0000042307, 0.0000031731,\n+ 0.0000018613, 0.0000018786, 0.0000018362, 0.0000018880, 0.0000011419, 0.0000019392, 0.0000015208,\n+ 0.0000005532, 0.0000005717, 0.0000005781, 0.0000007821, 0.0000004847, 0.0000005016, 0.0000004026,\n+ 0.0000005570, 0.0000007553, 0.0000003651, 0.0000002375, 0.0000004137, 0.0000004454, 0.0000003721,\n+ 0.0000003077, 0.0000002562, 0.0000001692, 0.0000001437, 0.0000003380, 0.0000001705, 0.0000002396,\n+ 0.0000001596, 0.0000002284, 0.0000001911},\n+ {0.0000345441, 0.0000316241, 0.0000286584, 0.0000206648, 0.0000186795, 0.0000136872, 0.0000097047,\n+ 0.0000096665, 0.0000091419, 0.0000067531, 0.0000038985, 0.0000048445, 0.0000028978, 0.0000037146,\n+ 0.0000021550, 0.0000021547, 0.0000016273, 0.0000009960, 0.0000012967, 0.0000013308, 0.0000008052,\n+ 0.0000010640, 0.0000008348, 0.0000008528, 0.0000008847, 0.0000003357, 0.0000004374, 0.0000005905,\n+ 0.0000002889, 0.0000005062, 0.0000005427, 0.0000003357, 0.0000003624, 0.0000002976, 0.0000004179,\n+ 0.0000002635, 0.0000003711, 0.0000001854, 0.0000003373, 0.0000001698, 0.0000002400, 0.0000001599,\n+ 0.0000001739, 0.0000001177, 0.0000002124},\n+ {0.0000408929, 0.0000365974, 0.0000338537, 0.0000239837, 0.0000219789, 0.0000159079, 0.0000148083,\n+ 0.0000064093, 0.0000047381, 0.0000060372, 0.0000058068, 0.0000056862, 0.0000032968, 0.0000024911,\n+ 0.0000024593, 0.0000019073, 0.0000019128, 0.0000019005, 0.0000014645, 0.0000009027, 0.0000008974,\n+ 0.0000012109, 0.0000007360, 0.0000005796, 0.0000007748, 0.0000003802, 0.0000005085, 0.0000004071,\n+ 0.0000004279, 0.0000004439, 0.0000003642, 0.0000002963, 0.0000003129, 0.0000003366, 0.0000003574,\n+ 0.0000001793, 0.0000001519, 0.0000002667, 0.0000001760, 0.0000002482, 0.0000001261, 0.0000002263,\n+ 0.0000001493, 0.0000002143, 0.0000000869},\n+ {0.0000460894, 0.0000423271, 0.0000297879, 0.0000205531, 0.0000193030, 0.0000178901, 0.0000130914,\n+ 0.0000096919, 0.0000091541, 0.0000052562, 0.0000039234, 0.0000038485, 0.0000029218, 0.0000028777,\n+ 0.0000021609, 0.0000021577, 0.0000022213, 0.0000012807, 0.0000010154, 0.0000007967, 0.0000006264,\n+ 0.0000008077, 0.0000006542, 0.0000006707, 0.0000006786, 0.0000005617, 0.0000004357, 0.0000005927,\n+ 0.0000004775, 0.0000003001, 0.0000003137, 0.0000002632, 0.0000002739, 0.0000002881, 0.0000003141,\n+ 0.0000002009, 0.0000002152, 0.0000003873, 0.0000001959, 0.0000001287, 0.0000002305, 0.0000001938,\n+ 0.0000002115, 0.0000003004, 0.0000001533}\n+};\n+\n+const static float Bij[AmoebaGeneralizedKirkwoodForceImpl::NUM_NECK_RADII][AmoebaGeneralizedKirkwoodForceImpl::NUM_NECK_RADII] = {\n+ {-1.20, -1.05, -1.30, -1.15, -1.00, -0.85, -0.90, -0.75, -1.20, -1.05, -0.90, -0.95, -0.80, -0.65, -0.70,\n+ -0.75, -0.60, -0.45, -0.50, -0.75, -0.40, -0.25, -0.30, -0.15, -0.20, -0.25, 0.10, 0.05, 0.20,-0.05,\n+ 0.30, 0.25, 0.40, 0.15, 0.10, 0.25, 0.60, 0.55, 0.70, 0.45, 0.80, 0.55, 0.90, 0.65, 1.00},\n+ {-1.25, -1.10, -0.95, -1.40, -1.05, -1.10, -0.95, -0.80, -0.85, -0.70, -0.55, -1.00, -0.65, -0.70, -0.95,\n+ -0.60, -0.65, -0.70, -0.55, -0.60, -0.45, -0.10, -0.15, 0.00, -0.05, 0.10, 0.05, 0.20, 0.15, 0.10,\n+ 0.25, 0.00, 0.15, -0.10, 0.25, 0.20, 0.35, 0.50, 0.65, 0.40, 0.75, 0.70, 0.85, 0.60, 0.95},\n+ {-1.30, -1.15, -1.00, -1.05, -0.90, -0.95, -1.20, -0.85, -0.90, -0.95, -0.80, -0.65, -0.70, -0.75, -0.40,\n+ -0.65, -0.30, -0.35, -0.60, -0.45, -0.50, -0.35, -0.20, -0.25, -0.10, 0.05, 0.00, 0.15, -0.10,0.25,\n+ 0.00, 0.35, 0.10, 0.45, 0.40, 0.55, 0.30, 0.65, 0.60, 0.75, 0.50, 0.85, 0.80, 0.95, 0.70},\n+ {-1.15, -1.40, -1.05, -0.90, -1.15, -0.80, -1.05, -0.90, -0.95, -0.60, -0.85, -0.70, -0.75, -0.40, -0.45,\n+ -0.30, -0.35, -0.40, -0.25, -0.30, -0.15, -0.40, -0.05, -0.30, -0.15, -0.20, -0.05, 0.10, 0.25,0.00,\n+ 0.35, 0.10, 0.25, 0.20, 0.35, 0.30, 0.45, 0.40, 0.75, 0.50, 0.65, 0.80, 0.75, 0.90, 0.65},\n+ {-1.00, -1.25, -0.90, -1.15, -1.00, -0.85, -0.90, -0.75, -0.60, -0.85, -0.50, -0.95, -0.80, -0.65, -0.70,\n+ -0.55, -0.60, -0.25, -0.50, -0.35, -0.40, -0.05, -0.10, 0.05, -0.20, 0.15, -0.10, 0.05, 0.00,0.15,\n+ 0.10, 0.25, 0.40, 0.35, 0.50, 0.45, 0.60, 0.55, 0.70, 0.45, 0.80, 0.75, 0.90, 0.65, 1.00},\n+ {-0.85, -1.10, -1.15, -1.00, -0.85, -0.90, -0.95, -0.80, -0.65, -0.50, -0.55, -0.60, -0.65, -0.50, -0.55,\n+ -0.40, -0.25, -0.50, -0.15, -0.60, -0.05, -0.30, -0.15, 0.00, -0.05, 0.10, 0.05, 0.20, 0.15, 0.30,\n+ 0.05, 0.40, 0.35, 0.50, 0.45, 0.60, 0.55, 0.70, 0.45, 0.80, 0.75, 0.90, 0.85, 1.00, 0.75},\n+ {-0.90, -1.15, -1.00, -1.05, -0.90, -0.55, -0.60, -0.45, -0.70, -0.55, -0.60, -0.65, -0.50, -0.35, -0.40,\n+ -0.25, -0.50, -0.35, -0.20, -0.05, -0.10, 0.05, 0.00, 0.15, 0.30, 0.25, 0.40, 0.15, 0.30, -0.15,\n+ 0.40, 0.55, 0.50, 0.25, 0.60, 0.55, 0.90, 0.45, 0.60, 0.75, 0.70, 0.85, 1.00, 0.95, 0.90},\n+ {-1.15, -1.00, -1.25, -0.90, -0.75, -0.80, -0.45, -0.50, -0.95, -0.40, -0.45, -0.70, -0.55, -0.40, -0.45,\n+ -0.30, -0.15, -0.20, -0.45, -0.10, -0.15, -0.20, -0.05, 0.10, 0.05, 0.20, 0.15, 0.10, 0.05, 0.40,\n+ 0.35, 0.50, 0.45, 0.20, 0.55, 0.50, 0.45, 0.20, 0.75, 0.70, 0.85, 0.80, 0.95, 1.10, 1.05},\n+ {-1.00, -0.85, -0.90, -0.75, -0.80, -0.85, -0.90, -0.55, -0.60, -0.45, -0.50, -0.35, -0.40, -0.65, -0.30,\n+ -0.35, 0.00, -0.25, 0.10, -0.35, 0.00, -0.05, -0.10, 0.05, 0.00, 0.15, 0.10, 0.25, 0.20, 0.15,\n+ 0.30, 0.45, 0.00, 0.55, 0.70, 0.65, 0.80, 0.75, 0.90, 1.05, 1.00, 1.15, 1.10, 1.25, 1.00},\n+ {-1.05, -1.10, -0.75, -0.60, -0.65, -0.70, -0.95, -0.60, -0.45, -0.70, -0.55, -0.20, -0.45, -0.30, -0.35,\n+ -0.20, -0.25, -0.10, 0.05, 0.00, -0.05, 0.30, 0.25, 0.00, 0.15, 0.10, 0.25, 0.20, 0.55, 0.50,\n+ 0.45, 0.20, 0.75, 0.30, 0.85, 0.60, 0.55, 0.70, 0.85, 0.80, 0.75, 0.90, 1.05, 1.00, 1.35},\n+ {-1.10, -0.75, -0.80, -0.65, -0.50, -0.75, -0.60, -0.45, -0.70, -0.55, -0.40, -0.65, -0.30, -0.15, -0.20,\n+ -0.25, -0.30, -0.15, -0.20, -0.05, -0.10, 0.05, 0.20, 0.15, 0.30, 0.05, 0.20, 0.55, 0.30, 0.45,\n+ 0.40, 0.55, 0.50, 0.65, 0.60, 0.55, 0.90, 0.65, 1.00, 0.95, 0.90, 0.65, 1.00, 0.75, 1.10},\n+ {-0.75, -1.00, -0.65, -0.50, -0.75, -0.60, -0.65, -0.30, -0.35, -0.20, -0.65, -0.50, -0.55, -0.20, -0.05,\n+ 0.10, -0.15, -0.20, -0.25, -0.10, -0.15, 0.00, 0.15, 0.10, 0.25, 0.20, 0.35, 0.30, 0.25, 0.40,\n+ 0.55, 0.70, 0.45, 0.60, 0.55, 0.90, 0.85, 1.00, 0.75, 1.10, 1.05, 1.20, 1.15, 1.30, 1.05},\n+ {-0.80, -0.65, -0.70, -0.75, -0.60, -0.65, -0.50, -0.55, -0.40, -0.65, -0.30, -0.55, -0.40, -0.45,-0.10,\n+ -0.35, 0.00, 0.15, 0.10, 0.05, -0.20, 0.35, -0.10, 0.05, 0.20, 0.35, 0.50, 0.45, 0.40,0.75,\n+ 0.50, 0.85, 0.60, 0.55, 0.70, 0.85, 1.00, 0.75, 1.10, 1.05, 1.00, 1.15, 0.90, 1.05, 1.00},\n+ {-0.85, -0.70, -0.95, -0.60, -0.85, -0.50, -0.75, -0.40, -0.25, -0.30, -0.15, -0.20, -0.25, -0.10, 0.05,\n+ -0.20, -0.05, 0.10, 0.05, -0.40, 0.35, 0.30, 0.45, 0.20, -0.05, 0.10, 0.25, 0.40, 0.35, 0.50,\n+ 0.65, 1.00, 0.75, 0.90, 0.65, 0.20, 0.75, 0.70, 0.85, 1.00, 0.95, 1.10, 1.25, 1.20, 1.35},\n+ {-0.70, -0.95, -0.60, -0.65, -0.50, -0.55, -0.40, -0.25, -0.30, -0.15, -0.20, -0.05, -0.30, 0.05, 0.20,\n+ -0.05, -0.30, 0.05, 0.00, 0.15, 0.10, 0.25, 0.20, 0.35, 0.10, 0.45, 0.60, 0.55, 0.50, 0.25,\n+ 0.20,0.55, 0.70, 0.85, 0.80, 1.15, 0.90, 1.25, 0.80, 0.95, 0.90, 1.05, 1.00, 1.55, 0.90},\n+ {-0.35, -0.80, -0.45, -0.50, -0.35, -0.40, -0.25, -0.50, -0.15, -0.20, -0.05, -0.50, -0.15, -0.40, -0.05,\n+ -0.10, 0.25, 0.20, 0.15, 0.10, 0.25, 0.20, 0.35, 0.30, 0.45, 0.40, 0.35, 0.70, 0.65, 0.40,\n+ 0.75,0.50, 0.65, 0.60, 0.95, 0.90, 1.05, 1.00, 1.15, 0.70, 1.25, 1.00, 0.95, 1.10, 1.05},\n+ {-0.40, -0.45, -0.50, -0.35, -0.60, -0.45, -0.50, -0.15, 0.00, -0.25, -0.30, -0.15, -0.40, -0.05, 0.10,\n+ 0.25, 0.40, 0.15, 0.10, 0.05, 0.40, -0.05, 0.10, 0.25, 0.40, 0.35, 0.50, 0.45, 0.60, 0.75,\n+ 0.90,0.85, 0.60, 0.95, 0.70, 1.05, 0.80, 0.95, 0.90, 1.05, 1.20, 1.15, 1.30, 1.25, 1.40},\n+ {-0.45, -0.30, -0.35, -0.40, -0.25, -0.10, -0.35, -0.20, -0.25, -0.30, -0.15, 0.00, -0.05, 0.10, 0.25,\n+ 0.20, 0.15, 0.30, 0.05, 0.20, 0.35, 0.50, 0.65, 0.20, 0.55, 0.50, 0.85, 0.40, 0.75, 0.50,\n+ 0.65,0.60, 0.75, 0.90, 1.05, 1.20, 0.95, 1.30, 1.05, 1.00, 0.95, 1.30, 1.25, 1.40, 0.95},\n+ {-0.30, -0.35, -0.40, -0.45, -0.30, -0.35, -0.20, -0.45, -0.10, 0.05, 0.20, -0.05, -0.10, -0.15, 0.20,\n+ 0.15, 0.10, 0.05, 0.60, 0.35, 0.50, 0.25, 0.40, 0.55, 0.70, 0.65, 0.80, 0.55, 0.70, 1.05,\n+ 1.00,0.55, 0.90, 1.05, 1.20, 0.75, 1.10, 0.85, 1.40, 1.35, 1.50, 1.05, 1.20, 1.15, 1.30},\n+ {-0.55, -0.40, -0.65, -0.30, -0.35, -0.20, -0.25, -0.10, -0.35, 0.00, -0.05, 0.10, 0.05, 0.00, -0.25,\n+ 0.30,0.25, 0.20, 0.35, -0.10, 0.25, 0.40, 0.55, 0.70, 0.65, 0.60, 0.75, 0.90, 0.65, 0.40,\n+ 0.95,0.70, 1.05, 1.00, 1.15, 0.90, 1.05, 1.00, 0.75, 1.30, 1.25, 1.60, 1.35, 1.10, 1.45},\n+ {-0.40, -0.45, -0.70, -0.15, -0.20, -0.05, 0.10, -0.35, 0.00, 0.15, -0.10, 0.25, 0.00, 0.35, 0.30,\n+ 0.25,0.20, 0.55, 0.50, 0.45, 0.20, 0.75, 0.50, 0.65, 0.60, 0.75, 0.50, 0.85, 0.80, 0.95,\n+ 1.10, 1.05,1.00, 1.15, 1.10, 1.05, 1.20, 0.95, 1.10, 1.25, 1.20, 1.35, 1.30, 1.45, 1.40},\n+ {-0.25, -0.10, -0.15, -0.40, -0.45, -0.30, 0.05, -0.20, 0.15, 0.10, 0.05, 0.00, 0.35, 0.10, 0.45,\n+ 0.20,0.35,0.10, 0.25, 0.40, 0.55, 0.30, 0.65, 0.20, 0.35, 0.30, 0.65, 0.60, 0.75, 0.90,\n+ 0.85, 1.00,0.95, 1.30, 1.05, 1.20, 1.15, 1.10, 1.05, 1.20, 1.35, 1.30, 1.45, 1.40, 1.75},\n+ {-0.30, -0.15, -0.20, -0.25, 0.10, -0.35, -0.20, 0.15, -0.10, 0.05, 0.40, 0.15, 0.10, 0.45, 0.00,\n+ 0.35,0.10, 0.45, 0.60, 0.55, 0.50, 0.65, 0.20, 0.35, 0.90, 0.45, 0.60, 0.35, 0.90, 0.65,\n+ 0.60, 0.95,1.10, 1.25, 1.00, 1.15, 1.30, 1.45, 1.00, 1.15, 1.50, 1.65, 1.20, 1.35, 1.30},\n+ {-0.15, -0.20, -0.05, -0.10, -0.15, -0.40, -0.05, 0.10, 0.05, 0.00, 0.15, 0.30, 0.25, 0.20, 0.55,\n+ 0.50,0.45, 0.20, 0.15, 0.70, 0.45, 0.60, 0.35, 0.90, 0.65, 0.80, 0.55, 0.50, 0.45, 0.80,\n+ 0.95, 0.90,1.05, 1.00, 0.95, 1.10, 1.25, 1.40, 1.35, 1.30, 1.45, 1.20, 1.55, 1.70, 1.65},\n+ {0.00, -0.25, -0.10, -0.15, 0.00, -0.05, -0.10, 0.05, 0.00, 0.15, 0.30, 0.25, 0.20, 0.15, 0.50,\n+ 0.45,0.20, 0.35, 0.70, 0.45, 0.40, 0.35, 0.70, 0.65, 0.80, 0.75, 0.90, 0.65, 1.00, 0.95,\n+ 1.30, 1.25,1.00, 1.35, 0.90, 1.25, 1.00, 1.35, 1.30, 1.45, 1.40, 1.55, 1.70, 1.25, 1.60},\n+ {-0.25, -0.10, -0.15, 0.00, 0.15, 0.10, -0.15, 0.20, 0.15, 0.10, 0.05, 0.40, 0.35, 0.50, 0.05,\n+ 0.00,0.35, 0.50, 0.25, 0.60, 0.35, 0.50, 0.65, 1.00, 0.95, 0.90, 0.85, 0.80, 1.15, 1.10,\n+ 1.25, 1.40,1.15, 0.90, 1.05, 1.60, 1.55, 1.10, 1.25, 1.60, 1.35, 1.30, 1.45, 1.60, 1.55},\n+ {-0.10, -0.15, 0.00, -0.05, 0.10, -0.15, 0.00, 0.35, 0.30, 0.05, 0.20, 0.55, 0.30, 0.65, 0.60,\n+ 0.15, 0.50,0.25, 0.60, 0.55, 0.90, 0.85, 0.60, 0.55, 0.70, 1.05, 0.80, 0.95, 0.90, 1.05,\n+ 1.00, 1.15, 1.30,1.25, 1.20, 1.55, 0.90, 1.45, 1.40, 1.35, 1.90, 1.45, 1.60, 1.55, 1.50},\n+ {0.05, 0.00, 0.15, 0.10, -0.15, 0.20, 0.35, 0.10, 0.45, 0.20, 0.15, 0.30, 0.05, 0.40, 0.15,\n+ 0.70, 0.45,0.40, 0.75, 0.50, 0.85, 0.60, 0.75, 0.90, 1.05, 1.20, 1.15, 0.90, 1.25, 1.00,\n+ 0.95, 1.10, 1.25,1.00, 1.15, 1.10, 1.25, 1.60, 1.15, 1.30, 1.25, 1.20, 1.75, 1.50, 1.65},\n+ {0.20, 0.15, -0.10, -0.15, 0.00, 0.15, 0.10, 0.45, 0.20, 0.35, 0.10, 0.45, 0.40, 0.35, 0.30,\n+ 0.65, 0.40,0.35, 0.70, 0.85, 0.60, 0.55, 0.50, 0.85, 1.20, 0.95, 0.50, 0.85, 1.20, 1.35,\n+ 0.90, 1.05, 1.40,1.35, 1.50, 1.25, 1.40, 1.55, 1.70, 1.05, 1.60, 1.75, 1.70, 1.65, 1.80},\n+ {0.15, 0.10, 0.05, 0.00, 0.15, 0.10, 0.25, 0.60, 0.35, 0.30, 0.05, 0.60, 0.55, 0.30, 0.25,\n+ 0.40, 0.55,0.50, 0.85, 0.40, 0.75, 1.10, 1.05, 0.40, 0.95, 0.70, 0.85, 1.00, 0.95, 1.30,\n+ 1.05, 1.40, 1.35,1.70, 1.45, 1.40, 1.35, 1.50, 1.45, 1.60, 1.55, 1.70, 1.85, 2.00, 1.75},\n+ {0.10, 0.05, 0.00, 0.15, 0.10, 0.25, 0.20, 0.35, 0.10, 0.45, 0.60, 0.55, 0.10, 0.65, 0.80,\n+ 0.75, 0.30,0.65, 0.40, 0.75, 1.10, 0.85, 0.40, 0.75, 0.70, 0.85, 1.20, 0.95, 1.30, 1.25,\n+ 1.40, 0.95, 1.50,0.85, 1.60, 1.75, 1.70, 0.65, 1.60, 1.55, 1.50, 1.65, 1.80, 1.75, 1.90},\n+ {0.05, 0.20, 0.15, 0.30, 0.25, 0.40, 0.35, 0.50, 0.65, 0.20, 0.55, 0.30, 0.45, 0.40, 0.55,\n+ 0.90, 0.85,0.40, 0.55, 0.90, 0.65, 0.80, 0.95, 1.10, 1.45, 1.40, 0.95, 1.10, 1.05, 1.00,\n+ 1.35, 1.30, 1.05,1.40, 1.75, 1.30, 1.65, 1.40, 1.75, 1.50, 2.05, 1.60, 2.15, 1.90, 1.65},\n+ {0.20, 0.15, 0.30, 0.25, 0.40, 0.35, 0.30, 0.25, 0.60, 0.35, 0.70, 0.85, 0.20, 0.95, 0.70,\n+ 0.65, 0.80,0.55, 0.90, 0.85, 1.00, 0.95, 0.90, 1.05, 1.20, 1.35, 1.10, 1.25, 0.80, 1.55,\n+ 1.30, 1.25, 1.20,1.95, 1.50, 1.45, 1.20, 1.95, 1.30, 1.85, 1.40, 1.95, 1.50, 1.85, 1.80},\n+ {0.35, 0.50, 0.45, 0.40, 0.55, 0.50, 0.45, 0.60, 0.55, 0.50, 0.45, 0.60, 0.55, 0.70, 0.85,\n+ 0.80, 0.75,0.70, 1.05, 1.00, 0.55, 0.90, 1.25, 1.00, 1.35, 1.10, 1.45, 1.00, 1.75, 1.50,\n+ 1.45, 1.40, 1.75,1.30, 1.25, 1.60, 1.95, 1.10, 1.85, 2.00, 1.95, 2.10, 1.85, 2.20, 2.15},\n+ {0.30, 0.45, 0.40, 0.15, 0.50, 0.65, 0.40, 0.35, 0.50, 0.85, 0.80, 0.75, 0.70, 0.85, 0.80,\n+ 0.95, 0.70,1.05, 0.80, 1.15, 0.90, 1.05, 1.00, 1.35, 0.90, 1.05, 1.00, 1.35, 1.10, 1.45,\n+ 1.40, 1.75, 1.70,1.65, 1.40, 1.35, 1.30, 1.85, 2.20, 1.55, 1.90, 1.85, 2.00, 1.55, 2.10},\n+ {0.45, 0.20, 0.15, 0.30, 0.45, 0.40, 0.55, 0.50, 0.65, 0.60, 0.75, 0.70, 0.85, 0.60, 0.95,\n+ 0.70, 1.05,0.80, 0.95, 0.90, 1.05, 0.80, 1.15, 1.10, 1.25, 1.60, 0.75, 1.10, 1.25, 1.40,\n+ 1.55, 1.70, 1.45,1.60, 1.75, 1.90, 1.65, 1.80, 2.15, 2.10, 1.45, 2.00, 1.75, 1.90, 1.85},\n+ {0.20, 0.35, 0.30, 0.45, 0.40, 0.55, 0.50, 0.45, 0.80, 0.75, 0.50, 0.85, 1.00, 0.75, 0.50,\n+ 0.85, 1.20,1.15, 1.10, 1.05, 0.80, 1.15, 0.70, 1.25, 1.40, 1.15, 1.70, 1.45, 1.60, 1.35,\n+ 1.50, 1.45, 1.80,1.55, 1.90, 1.45, 2.00, 2.15, 2.10, 1.45, 1.60, 1.75, 1.90, 2.25, 1.80},\n+ {0.35, 0.50, 0.45, 0.60, 0.55, 0.70, 0.65, 0.40, 0.75, 0.70, 1.05, 0.60, 0.75, 0.70, 0.85,\n+ 1.00, 0.95,0.70, 1.05, 1.00, 1.35, 1.30, 1.25, 1.40, 1.15, 1.50, 1.25, 1.60, 1.55, 1.50,\n+ 1.45, 1.80, 1.35,1.90, 1.85, 1.80, 1.95, 1.70, 1.65, 1.60, 1.75, 1.70, 2.25, 1.80, 2.15},\n+ {0.30, 0.65, 0.60, 0.55, 0.70, 0.85, 0.80, 0.95, 0.90, 0.65, 1.00, 0.75, 0.70, 1.25, 1.00,\n+ 0.95, 1.30,1.05, 1.20, 0.95, 1.30, 1.25, 1.20, 1.55, 0.90, 1.05, 1.40, 1.15, 1.50, 1.25,\n+ 1.60, 1.75, 1.70,2.05, 1.80, 2.15, 1.70, 1.65, 1.80, 1.95, 1.90, 2.05, 1.80, 2.15, 2.10},\n+ {0.65, 0.80, 0.75, 0.30, 0.85, 0.80, 0.55, 0.90, 0.65, 0.80, 1.15, 0.90, 1.25, 1.20, 0.75,\n+ 1.10, 0.85,1.20, 0.95, 1.10, 1.05, 1.40, 1.15, 1.30, 1.05, 1.60, 1.35, 1.30, 1.45, 1.40,\n+ 1.95, 1.90, 1.85,1.60, 1.95, 1.50, 2.05, 1.80, 1.95, 1.90, 2.25, 1.60, 2.35, 2.10, 2.25},\n+ {0.60, 0.75, 0.70, 0.45, 0.60, 0.95, 0.70, 1.05, 0.80, 0.95, 0.50, 1.05, 1.00, 1.15, 1.10,\n+ 0.85, 0.60,0.95, 1.10, 1.45, 1.20, 1.35, 1.70, 1.45, 1.60, 1.75, 1.90, 1.25, 1.60, 1.55,\n+ 1.50, 1.85, 1.40,1.75, 1.90, 2.05, 1.60, 1.95, 1.50, 2.25, 1.40, 1.95, 2.30, 2.25, 1.60},\n+ {0.75, 0.70, 0.65, 0.60, 0.75, 0.70, 0.85, 0.80, 0.95, 0.90, 1.05, 1.00, 1.15, 1.10, 0.85,\n+ 1.00, 1.15,1.30, 1.05, 1.60, 1.55, 0.90, 1.05, 1.20, 1.55, 1.30, 1.45, 1.40, 1.75, 2.10,\n+ 1.65, 1.40, 1.95,2.10, 2.05, 2.00, 1.95, 1.70, 1.65, 2.40, 1.95, 2.30, 2.05, 2.40, 2.35},\n+ {0.50, 0.65, 0.80, 0.75, 0.90, 0.85, 0.80, 0.95, 1.10, 1.05, 0.80, 1.15, 0.90, 1.25, 1.00,\n+ 1.15, 1.10,0.85, 1.20, 1.35, 1.10, 1.45, 1.40, 1.55, 1.70, 1.05, 1.40, 1.75, 1.30, 1.85,\n+ 2.00, 1.75, 1.90,1.85, 2.20, 1.95, 2.30, 1.85, 2.40, 1.95, 2.30, 2.05, 2.20, 1.95, 2.50},\n+ {0.65, 0.80, 0.95, 0.90, 1.05, 1.00, 1.15, 0.70, 0.65, 1.00, 1.15, 1.30, 1.05, 1.00, 1.15,\n+ 1.10, 1.25,1.40, 1.35, 1.10, 1.25, 1.60, 1.35, 1.30, 1.65, 1.20, 1.55, 1.50, 1.65, 1.80,\n+ 1.75, 1.70, 1.85,2.00, 2.15, 1.70, 1.65, 2.20, 1.95, 2.30, 1.85, 2.40, 2.15, 2.50, 1.85},\n+ {0.80, 0.95, 0.90, 0.85, 1.00, 1.15, 1.10, 1.05, 1.20, 0.95, 0.90, 1.05, 1.00, 1.15, 1.10,\n+ 1.25, 1.40,1.15, 1.10, 1.05, 1.00, 1.35, 1.30, 1.45, 1.60, 1.55, 1.50, 1.85, 1.80, 1.55,\n+ 1.70, 1.65, 1.80,1.95, 2.10, 1.85, 2.00, 2.55, 2.10, 1.85, 2.40, 2.35, 2.50, 2.85, 2.40}\n+};\n+\n+static void getBounds(double rho, int& below, int& above) {\n+ double calculateIndex = (rho - MINIMUM_RADIUS) / SPACING;\n+ below = (int) floor(calculateIndex);\n+ above = below + 1;\n+ if (above >= AmoebaGeneralizedKirkwoodForceImpl::NUM_NECK_RADII) {\n+ // Extrapolate up from the top table values.\n+ below = AmoebaGeneralizedKirkwoodForceImpl::NUM_NECK_RADII - 1;\n+ above = AmoebaGeneralizedKirkwoodForceImpl::NUM_NECK_RADII - 2;\n+ } else if (below < 0) {\n+ // If below is less than 0, extrapolate down from the bottom table values.\n+ below = 0;\n+ above = 1;\n+ }\n+}\n+\n+static double interpolate2D(double x1, double x2, double y1, double y2, double x, double y,\n+ double fx1y1, double fx2y1, double fx1y2, double fx2y2) {\n+ double fxy1 = (x2 - x) / (x2 - x1) * fx1y1 + (x - x1) / (x2 - x1) * fx2y1;\n+ double fxy2 = (x2 - x) / (x2 - x1) * fx1y2 + (x - x1) / (x2 - x1) * fx2y2;\n+\n+ return (y2 - y) / (y2 - y1) * fxy1 + (y - y1) / (y2 - y1) * fxy2;\n+}\n+\n+void AmoebaGeneralizedKirkwoodForceImpl::getNeckConstants(double radius, double radiusK, double &aij, double &bij) {\n+ // Convert the radii values from nm to A.\n+ radius = radius * 10.0;\n+ radiusK = radiusK * 10.0;\n+\n+ // Determine low and high values for integration\n+ int lowI, highI, lowJ, highJ;\n+ getBounds(radius, lowI, highI);\n+ getBounds(radiusK, lowJ, highJ);\n+\n+ // Interpolate/Extrapolate Aij and Bij constant values\n+ aij = interpolate2D(NECK_RADII[lowI], NECK_RADII[highI], NECK_RADII[lowJ], NECK_RADII[highJ],\n+ radius, radiusK, Aij[lowI][lowJ], Aij[highI][lowJ], Aij[lowI][highJ], Aij[highI][highJ]);\n+\n+ bij = interpolate2D(NECK_RADII[lowI], NECK_RADII[highI], NECK_RADII[lowJ], NECK_RADII[highJ],\n+ radius, radiusK, Bij[lowI][lowJ], Bij[highI][lowJ], Bij[lowI][highJ], Bij[highI][highJ]);\n+\n+ // Never let Aij be negative.\n+ if (aij < 0.0) {\n+ aij = 0.0;\n+ }\n+\n+ // Convert aij from Ang(-11) to nm(-11)\n+ aij = aij * 1.0e11;\n+ // Convert bij from A to nm.\n+ bij = bij * 0.1;\n+}\n+\n+double AmoebaGeneralizedKirkwoodForceImpl::neckDescreen(double r, double radius, double radiusK, double sneck) {\n+\n+ // Radius of water in nm.\n+ double radiusWater = 0.14;\n+\n+ // If atoms are too widely separated there is no neck formed.\n+ if (r > radius + radiusK + 2.0 * radiusWater) {\n+ return 0.0;\n+ }\n+\n+ // Get Aij and Bij based on parameterization by Corrigan et al.\n+ double aij, bij;\n+ getNeckConstants(radius, radiusK, aij, bij);\n+ double rMinusBij = r - bij;\n+ double radiiMinusr = radius + radiusK + 2.0 * radiusWater - r;\n+ double power1 = rMinusBij * rMinusBij * rMinusBij * rMinusBij;\n+ double power2 = radiiMinusr * radiiMinusr * radiiMinusr * radiiMinusr;\n+\n+ // Use Aij and Bij to get neck integral using Equations 13 and 14 from Aguilar/Onufriev 2010 paper\n+ // Sneck may be based on the number of heavy atoms bound to the atom being descreened.\n+ double neckIntegral = 4.0 * M_PI / 3.0 * sneck * aij * power1 * power2;\n+\n+ return neckIntegral;\n+}\n+\n+/**\n+ * The array of neck tabulated radii values.\n+ */\n+const std::vector<float>& AmoebaGeneralizedKirkwoodForceImpl::getNeckRadii() {\n+ return NECK_RADII;\n+}\n+\n+/**\n+ * The tabulated Aij parameters.\n+ */\n+const float (&AmoebaGeneralizedKirkwoodForceImpl::getAij())[NUM_NECK_RADII][NUM_NECK_RADII] {\n+ return Aij;\n+}\n+\n+/**\n+ * The tabulated Bij parameters.\n+ */\n+const float (&AmoebaGeneralizedKirkwoodForceImpl::getBij())[NUM_NECK_RADII][NUM_NECK_RADII] {\n+ return Bij;\n+}\ndiff --git a/plugins/amoeba/openmmapi/src/AmoebaVdwForce.cpp b/plugins/amoeba/openmmapi/src/AmoebaVdwForce.cpp\nindex 70046d6b3f..6bc089b3d8 100644\n--- a/plugins/amoeba/openmmapi/src/AmoebaVdwForce.cpp\n+++ b/plugins/amoeba/openmmapi/src/AmoebaVdwForce.cpp\n@@ -44,23 +44,23 @@ AmoebaVdwForce::AmoebaVdwForce() : nonbondedMethod(NoCutoff), potentialFunction(\n useTypes(false), alchemicalMethod(None), n(5), alpha(0.7) {\r\n }\r\n \r\n-int AmoebaVdwForce::addParticle(int parentIndex, double sigma, double epsilon, double reductionFactor, bool isAlchemical) {\r\n+int AmoebaVdwForce::addParticle(int parentIndex, double sigma, double epsilon, double reductionFactor, bool isAlchemical, double scaleFactor) {\r\n if (useTypes)\r\n throw OpenMMException(\"AmoebaVdwForce: must use the same version of addParticle() for all particles\");\r\n- parameters.push_back(VdwInfo(parentIndex, sigma, epsilon, -1, reductionFactor, isAlchemical));\r\n+ parameters.push_back(VdwInfo(parentIndex, sigma, epsilon, -1, reductionFactor, isAlchemical, scaleFactor));\r\n return parameters.size()-1;\r\n }\r\n \r\n-int AmoebaVdwForce::addParticle(int parentIndex, int typeIndex, double reductionFactor, bool isAlchemical) {\r\n+int AmoebaVdwForce::addParticle(int parentIndex, int typeIndex, double reductionFactor, bool isAlchemical, double scaleFactor) {\r\n if (parameters.size() > 0 && !useTypes)\r\n throw OpenMMException(\"AmoebaVdwForce: must use the same version of addParticle() for all particles\");\r\n useTypes = true;\r\n- parameters.push_back(VdwInfo(parentIndex, 1.0, 0.0, typeIndex, reductionFactor, isAlchemical));\r\n+ parameters.push_back(VdwInfo(parentIndex, 1.0, 0.0, typeIndex, reductionFactor, isAlchemical, scaleFactor));\r\n return parameters.size()-1;\r\n }\r\n \r\n-void AmoebaVdwForce::getParticleParameters(int particleIndex, int& parentIndex,\r\n- double& sigma, double& epsilon, double& reductionFactor, bool& isAlchemical, int& typeIndex) const {\r\n+void AmoebaVdwForce::getParticleParameters(int particleIndex, int& parentIndex,double& sigma, double& epsilon, double& reductionFactor,\r\n+ bool& isAlchemical, int& typeIndex, double& scaleFactor) const {\r\n ASSERT_VALID_INDEX(particleIndex, parameters);\r\n parentIndex = parameters[particleIndex].parentIndex;\r\n sigma = parameters[particleIndex].sigma;\r\n@@ -68,10 +68,11 @@ void AmoebaVdwForce::getParticleParameters(int particleIndex, int& parentIndex,\n reductionFactor = parameters[particleIndex].reductionFactor;\r\n isAlchemical = parameters[particleIndex].isAlchemical;\r\n typeIndex = parameters[particleIndex].typeIndex;\r\n+ scaleFactor = parameters[particleIndex].scaleFactor;\r\n }\r\n \r\n-void AmoebaVdwForce::setParticleParameters(int particleIndex, int parentIndex,\r\n- double sigma, double epsilon, double reductionFactor, bool isAlchemical, int typeIndex) {\r\n+void AmoebaVdwForce::setParticleParameters(int particleIndex, int parentIndex,double sigma, double epsilon, double reductionFactor,\r\n+ bool isAlchemical, int typeIndex, double scaleFactor) {\r\n ASSERT_VALID_INDEX(particleIndex, parameters);\r\n parameters[particleIndex].parentIndex = parentIndex;\r\n parameters[particleIndex].sigma = sigma;\r\n@@ -79,6 +80,7 @@ void AmoebaVdwForce::setParticleParameters(int particleIndex, int parentIndex,\n parameters[particleIndex].reductionFactor = reductionFactor;\r\n parameters[particleIndex].isAlchemical = isAlchemical;\r\n parameters[particleIndex].typeIndex = typeIndex;\r\n+ parameters[particleIndex].scaleFactor = scaleFactor;\r\n }\r\n \r\n int AmoebaVdwForce::addParticleType(double sigma, double epsilon) {\r\ndiff --git a/plugins/amoeba/openmmapi/src/AmoebaVdwForceImpl.cpp b/plugins/amoeba/openmmapi/src/AmoebaVdwForceImpl.cpp\nindex 152abd5d70..cd8ddbe4de 100644\n--- a/plugins/amoeba/openmmapi/src/AmoebaVdwForceImpl.cpp\n+++ b/plugins/amoeba/openmmapi/src/AmoebaVdwForceImpl.cpp\n@@ -55,9 +55,9 @@ void AmoebaVdwForceImpl::initialize(ContextImpl& context) {\n throw OpenMMException(\"AmoebaVdwForce must have exactly as many particles as the System it belongs to.\");\r\n for (int i = 0; i < owner.getNumParticles(); i++) {\r\n int parentIndex, typeIndex;\r\n- double sigma, epsilon, reductionFactor;\r\n+ double sigma, epsilon, reductionFactor, scaleFactor;\r\n bool isAlchemical;\r\n- owner.getParticleParameters(i, parentIndex, sigma, epsilon, reductionFactor, isAlchemical, typeIndex);\r\n+ owner.getParticleParameters(i, parentIndex, sigma, epsilon, reductionFactor, isAlchemical, typeIndex, scaleFactor);\r\n if (sigma < 0)\r\n throw OpenMMException(\"AmoebaVdwForce: sigma for a particle cannot be negative\");\r\n if (owner.getPotentialFunction() == AmoebaVdwForce::Buffered147 && sigma == 0)\r\n@@ -101,11 +101,11 @@ void AmoebaVdwForceImpl::createParameterMatrix(const AmoebaVdwForce& force, vect\n if (force.getUseParticleTypes()) {\r\n // We get the types directly from the particles.\r\n \r\n- double sigma, epsilon, reduction;\r\n+ double sigma, epsilon, reduction, scaleFactor;\r\n int parent;\r\n bool isAlchemical;\r\n for (int i = 0; i < numParticles; i++)\r\n- force.getParticleParameters(i, parent, sigma, epsilon, reduction, isAlchemical, type[i]);\r\n+ force.getParticleParameters(i, parent, sigma, epsilon, reduction, isAlchemical, type[i], scaleFactor);\r\n numTypes = force.getNumParticleTypes();\r\n typeSigma.resize(numTypes);\r\n typeEpsilon.resize(numTypes);\r\n@@ -117,10 +117,10 @@ void AmoebaVdwForceImpl::createParameterMatrix(const AmoebaVdwForce& force, vect\n \r\n map<pair<double, double>, int> typeForParams;\r\n for (int i = 0; i < numParticles; i++) {\r\n- double sigma, epsilon, reduction;\r\n+ double sigma, epsilon, reduction, scaleFactor;\r\n int parent, typeIndex;\r\n bool isAlchemical;\r\n- force.getParticleParameters(i, parent, sigma, epsilon, reduction, isAlchemical, typeIndex);\r\n+ force.getParticleParameters(i, parent, sigma, epsilon, reduction, isAlchemical, typeIndex, scaleFactor);\r\n pair<double, double> params = make_pair(sigma, epsilon);\r\n map<pair<double, double>, int>::iterator entry = typeForParams.find(params);\r\n if (entry == typeForParams.end()) {\r\ndiff --git a/plugins/amoeba/openmmapi/src/AmoebaWcaDispersionForce.cpp b/plugins/amoeba/openmmapi/src/AmoebaWcaDispersionForce.cpp\nindex bb316da575..1e8d7777d6 100644\n--- a/plugins/amoeba/openmmapi/src/AmoebaWcaDispersionForce.cpp\n+++ b/plugins/amoeba/openmmapi/src/AmoebaWcaDispersionForce.cpp\n@@ -38,14 +38,22 @@\n using namespace OpenMM;\n \n AmoebaWcaDispersionForce::AmoebaWcaDispersionForce() {\n- epso = 0.1100;\n- epsh = 0.0135;\n- rmino = 1.7025;\n- rminh = 1.3275;\n- awater = 0.033428;\n- slevy = 1.0;\n- shctd = 0.81;\n- dispoff = 0.26;\n+ // Amoeba Water '03 vdW parameters (Diameters in Angstroms; Well depth in kcal/mole)\n+ // vdw 1 3.4050 0.1100\n+ // vdw 2 2.6550 0.0135 0.910\n+\n+ // Convert kcal/mol to kJ/mol\n+ epso = 0.1100 * 4.184e0;\n+ epsh = 0.0135 * 4.184e0;\n+ // Convert A to nm.\n+ rmino = 1.7025e-01;\n+ rminh = 1.3275e-01;\n+ dispoff = 1.056e-01;\n+ // Convert water number density from water / A^3 to water / nm^3.\n+ awater = 0.033428e03;\n+ // No units.\n+ slevy = 1.0;\n+ shctd = 0.82;\n }\n \n int AmoebaWcaDispersionForce::addParticle(double radius, double epsilon) {\ndiff --git a/plugins/amoeba/openmmapi/src/AmoebaWcaDispersionForceImpl.cpp b/plugins/amoeba/openmmapi/src/AmoebaWcaDispersionForceImpl.cpp\nindex d8448d14e0..0f6549fc75 100644\n--- a/plugins/amoeba/openmmapi/src/AmoebaWcaDispersionForceImpl.cpp\n+++ b/plugins/amoeba/openmmapi/src/AmoebaWcaDispersionForceImpl.cpp\n@@ -61,66 +61,66 @@ double AmoebaWcaDispersionForceImpl::calcForcesAndEnergy(ContextImpl& context, b\n return kernel.getAs<CalcAmoebaWcaDispersionForceKernel>().execute(context, includeForces, includeEnergy);\n return 0.0;\n }\n-void AmoebaWcaDispersionForceImpl::getMaximumDispersionEnergy(const AmoebaWcaDispersionForce& force, int particleIndex, double& maxDispersionEnergy) {\n \n- const double pi = 3.1415926535897;\n+static double tailCorrection(double ri, double eps, double rmin) {\n+ if (ri < rmin) {\n+ double r3 = ri * ri * ri;\n+ double rmin3 = rmin * rmin * rmin;\n+ return -eps * 4.0e0 * M_PI * (rmin3 - r3) / 3.0e0 - eps * M_PI * 18.0e0 * rmin3 / 11.0e0;\n+ } else {\n+ double ri2 = ri * ri;\n+ double ri4 = ri2 * ri2;\n+ double ri7 = ri * ri2 * ri4;\n+ double ri11 = ri7 * ri4;\n+ double rmin2 = rmin * rmin;\n+ double rmin4 = rmin2 * rmin2;\n+ double rmin7 = rmin * rmin2 * rmin4;\n+ return 2.0e0 * M_PI * eps * rmin7 * (2.0e0 * rmin7 - 11.0e0 * ri7) / (11.0e0 * ri11);\n+ }\n+}\n \n- // from last loop in subroutine knp in ksolv.f\n+void AmoebaWcaDispersionForceImpl::getMaximumDispersionEnergy(const AmoebaWcaDispersionForce &force, int particleIndex,\n+ double &maxDispersionEnergy) {\n \n- double rdisp, epsi;\n- force.getParticleParameters(particleIndex, rdisp, epsi);\n- if (epsi <= 0.0 || rdisp <= 0.0) {\n+ // Atom i parameters\n+ double rmini, epsi;\n+ force.getParticleParameters(particleIndex, rmini, epsi);\n+ if (epsi <= 0.0 || rmini <= 0.0) {\n maxDispersionEnergy = 0.0;\n return;\n }\n- double rmini = rdisp;\n- rdisp += force.getDispoff();\n- double epso = force.getEpso();\n- double emixo = std::sqrt(epso) + std::sqrt(epsi);\n- emixo = 4.0*epso*epsi/(emixo*emixo);\n-\n- double rmino = force.getRmino();\n- double rmino2 = rmino*rmino;\n- double rmini2 = rmini*rmini;\n- double rmixo = 2.0*(rmino2*rmino + rmini2*rmini) / (rmino2 + rmini2);\n-\n- double rmixo3 = rmixo*rmixo*rmixo;\n- double rmixo7 = rmixo*rmixo3*rmixo3;\n- double ao = emixo*rmixo7;\n-\n- double epsh = force.getEpsh();\n- double emixh = std::sqrt(epsh) + std::sqrt(epsi);\n- emixh = 4.0*epsh*epsi/(emixh*emixh);\n- double rminh = force.getRminh();\n- double rminh2 = rminh*rminh;\n- double rmixh = rminh*rminh + rmini2;\n- rmixh = 2.0 * (rminh2*rminh + rmini2*rmini) / (rminh2 + rmini2);\n- double rmixh3 = rmixh*rmixh*rmixh;\n- double rmixh7 = rmixh3*rmixh3*rmixh;\n- double ah = emixh*rmixh7;\n-\n- double rdisp3 = rdisp*rdisp*rdisp;\n- double rdisp7 = rdisp*rdisp3*rdisp3;\n- double rdisp11 = rdisp7*rdisp3*rdisp;\n-\n- double cdisp;\n- if (rdisp < rmixh) {\n- cdisp = -4.0*pi*emixh*(rmixh3-rdisp3)/3.0 - emixh*18.0/11.0*rmixh3*pi;\n- } else {\n- cdisp = 2.0*pi*(2.0*rmixh7-11.0*rdisp7)*ah/ (11.0*rdisp11);\n- }\n- cdisp *= 2.0;\n- if (rdisp < rmixo) {\n- cdisp -= 4.0*pi*emixo*(rmixo3-rdisp3)/3.0;\n- cdisp -= emixo*18.0/11.0*rmixo3*pi;\n- } else {\n- cdisp += 2.0*pi*(2.0*rmixo7-11.0*rdisp7) * ao/(11.0*rdisp11);\n- }\n- maxDispersionEnergy = force.getSlevy()*force.getAwater()*cdisp;\n+ double rmini2 = rmini * rmini;\n+ double sepsi = std::sqrt(epsi);\n+\n+ // Atom i with water oxygen.\n+ double epso = force.getEpso();\n+ double emixo = std::sqrt(epso) + sepsi;\n+ emixo = 4.0 * epso * epsi / (emixo * emixo);\n+\n+ double rmino = force.getRmino();\n+ double rmino2 = rmino * rmino;\n+ double rmixo = 2.0 * (rmino2 * rmino + rmini2 * rmini) / (rmino2 + rmini2);\n+\n+ // Atom i with water hydrogen.\n+ double epsh = force.getEpsh();\n+ double emixh = std::sqrt(epsh) + sepsi;\n+ emixh = 4.0 * epsh * epsi / (emixh * emixh);\n+\n+ double rminh = force.getRminh();\n+ double rminh2 = rminh * rminh;\n+ double rmixh = 2.0 * (rminh2 * rminh + rmini2 * rmini) / (rminh2 + rmini2);\n+\n+ // Compute the tail correction (i.e. the dispersion integral in the absence of any other solute atoms).\n+ double dispersionOffest = force.getDispoff();\n+ double riO = rmixo / 2.0e0 + dispersionOffest;\n+ double cdisp = tailCorrection(riO, emixo, rmixo);\n+ double riH = rmixh / 2.0e0 + dispersionOffest;\n+ cdisp += 2.0e0 * tailCorrection(riH, emixh, rmixh);\n+\n+ maxDispersionEnergy = force.getSlevy() * force.getAwater() * cdisp;\n }\n \n-double AmoebaWcaDispersionForceImpl::getTotalMaximumDispersionEnergy(const AmoebaWcaDispersionForce& force) {\n-\n+double AmoebaWcaDispersionForceImpl::getTotalMaximumDispersionEnergy(const AmoebaWcaDispersionForce &force) {\n double totalMaximumDispersionEnergy = 0.0;\n for (int ii = 0; ii < force.getNumParticles(); ii++) {\n double maximumDispersionEnergy;\ndiff --git a/plugins/amoeba/platforms/common/src/AmoebaCommonKernels.cpp b/plugins/amoeba/platforms/common/src/AmoebaCommonKernels.cpp\nindex 872200bdef..77b318d6df 100644\n--- a/plugins/amoeba/platforms/common/src/AmoebaCommonKernels.cpp\n+++ b/plugins/amoeba/platforms/common/src/AmoebaCommonKernels.cpp\n@@ -1722,10 +1722,10 @@ class CommonCalcAmoebaGeneralizedKirkwoodForceKernel::ForceInfo : public Compute\n ForceInfo(const AmoebaGeneralizedKirkwoodForce& force) : force(force) {\n }\n bool areParticlesIdentical(int particle1, int particle2) {\n- double charge1, charge2, radius1, radius2, scale1, scale2;\n- force.getParticleParameters(particle1, charge1, radius1, scale1);\n- force.getParticleParameters(particle2, charge2, radius2, scale2);\n- return (charge1 == charge2 && radius1 == radius2 && scale1 == scale2);\n+ double charge1, charge2, radius1, radius2, scale1, scale2, descreen1, descreen2, neck1, neck2;\n+ force.getParticleParameters(particle1, charge1, radius1, scale1, descreen1, neck1);\n+ force.getParticleParameters(particle2, charge2, radius2, scale2, descreen2, neck2);\n+ return (charge1 == charge2 && radius1 == radius2 && scale1 == scale2 && descreen1 == descreen2 && neck1 == neck2);\n }\n private:\n const AmoebaGeneralizedKirkwoodForce& force;\n@@ -1747,7 +1747,16 @@ void CommonCalcAmoebaGeneralizedKirkwoodForceKernel::initialize(const System& sy\n NonbondedUtilities& nb = cc.getNonbondedUtilities();\n int paddedNumAtoms = cc.getPaddedNumAtoms();\n int elementSize = (cc.getUseDoublePrecision() ? sizeof(double) : sizeof(float));\n- params.initialize<mm_float2>(cc, paddedNumAtoms, \"amoebaGkParams\");\n+ params.initialize<mm_float4>(cc, paddedNumAtoms,\"amoebaGkParams\");\n+ vector<float> neckRadiiVector = AmoebaGeneralizedKirkwoodForceImpl::getNeckRadii();\n+ unsigned long numNeckRadii = neckRadiiVector.size();\n+ unsigned long numNeckRadii2 = numNeckRadii * numNeckRadii;\n+ neckRadii.initialize<float>(cc, numNeckRadii, \"neckRadii\");\n+ neckRadii.upload(neckRadiiVector);\n+ neckA.initialize<float>( cc, numNeckRadii2, \"neckA\");\n+ neckA.upload(AmoebaGeneralizedKirkwoodForceImpl::getAij());\n+ neckB.initialize<float>( cc, numNeckRadii2, \"neckB\");\n+ neckB.upload(AmoebaGeneralizedKirkwoodForceImpl::getBij());\n bornRadii.initialize(cc, paddedNumAtoms, elementSize, \"bornRadii\");\n field.initialize(cc, 3*paddedNumAtoms, sizeof(long long), \"gkField\");\n bornSum.initialize<long long>(cc, paddedNumAtoms, \"bornSum\");\n@@ -1762,14 +1771,12 @@ void CommonCalcAmoebaGeneralizedKirkwoodForceKernel::initialize(const System& sy\n cc.addAutoclearBuffer(field);\n cc.addAutoclearBuffer(bornSum);\n cc.addAutoclearBuffer(bornForce);\n- vector<mm_float2> paramsVector(paddedNumAtoms);\n+ vector<mm_float4> paramsVector(paddedNumAtoms);\n for (int i = 0; i < force.getNumParticles(); i++) {\n- double charge, radius, scalingFactor;\n- force.getParticleParameters(i, charge, radius, scalingFactor);\n- paramsVector[i] = mm_float2((float) radius, (float) (scalingFactor*radius));\n- \n+ double charge, radius, scalingFactor, descreenRadius, neckFactor;\n+ force.getParticleParameters(i, charge, radius, scalingFactor, descreenRadius, neckFactor);\n+ paramsVector[i] = mm_float4((float) radius,(float) scalingFactor, (float) descreenRadius, (float) neckFactor);\n // Make sure the charge matches the one specified by the AmoebaMultipoleForce.\n- \n double charge2, thole, damping, polarity;\n int axisType, atomX, atomY, atomZ;\n vector<double> dipole, quadrupole;\n@@ -1814,11 +1821,28 @@ void CommonCalcAmoebaGeneralizedKirkwoodForceKernel::initialize(const System& sy\n defines[\"MUTUAL_POLARIZATION\"] = \"\";\n else if (polarizationType == AmoebaMultipoleForce::Extrapolated)\n defines[\"EXTRAPOLATED_POLARIZATION\"] = \"\";\n+ defines[\"DESCREEN_OFFSET\"] = cc.doubleToString(force.getDescreenOffset());\n+ tanhRescaling = force.getTanhRescaling();\n+ // Max Born radius is 3 nm (30 A).\n+ defines[\"BIG_RADIUS\"] = cc.doubleToString(3.0);\n+ if (tanhRescaling) {\n+ defines[\"TANH_RESCALING\"] = \"true\";\n+ double beta0, beta1, beta2;\n+ force.getTanhParameters(beta0, beta1, beta2);\n+ defines[\"BETA0\"] = cc.doubleToString(beta0);\n+ defines[\"BETA1\"] = cc.doubleToString(beta1);\n+ defines[\"BETA2\"] = cc.doubleToString(beta2);\n+ } else {\n+ defines[\"TANH_RESCALING\"] = \"false\";\n+ defines[\"BETA0\"] = cc.doubleToString(0.0);\n+ defines[\"BETA1\"] = cc.doubleToString(0.0);\n+ defines[\"BETA2\"] = cc.doubleToString(0.0);\n+ }\n includeSurfaceArea = force.getIncludeCavityTerm();\n if (includeSurfaceArea) {\n defines[\"SURFACE_AREA_FACTOR\"] = cc.doubleToString(force.getSurfaceAreaFactor());\n defines[\"PROBE_RADIUS\"] = cc.doubleToString(force.getProbeRadius());\n- defines[\"DIELECTRIC_OFFSET\"] = cc.doubleToString(0.009);\n+ defines[\"DIELECTRIC_OFFSET\"] = cc.doubleToString(force.getDielectricOffset());\n }\n cc.addForce(new ForceInfo(force));\n }\n@@ -1877,6 +1901,9 @@ void CommonCalcAmoebaGeneralizedKirkwoodForceKernel::computeBornRadii(ComputeArr\n computeBornSumKernel->addArg(cc.getPosq());\n computeBornSumKernel->addArg(params);\n computeBornSumKernel->addArg();\n+ computeBornSumKernel->addArg(neckRadii);\n+ computeBornSumKernel->addArg(neckA);\n+ computeBornSumKernel->addArg(neckB);\n reduceBornSumKernel = program->createKernel(\"reduceBornSum\");\n reduceBornSumKernel->addArg(bornSum);\n reduceBornSumKernel->addArg(params);\n@@ -1900,6 +1927,10 @@ void CommonCalcAmoebaGeneralizedKirkwoodForceKernel::computeBornRadii(ComputeArr\n chainRuleKernel->addArg();\n chainRuleKernel->addArg();\n chainRuleKernel->addArg(params);\n+ chainRuleKernel->addArg(neckRadii);\n+ chainRuleKernel->addArg(neckA);\n+ chainRuleKernel->addArg(neckB);\n+ chainRuleKernel->addArg(bornSum);\n chainRuleKernel->addArg(bornRadii);\n chainRuleKernel->addArg(bornForce);\n ediffKernel = program->createKernel(\"computeEDiffForce\");\n@@ -1968,12 +1999,11 @@ void CommonCalcAmoebaGeneralizedKirkwoodForceKernel::copyParametersToContext(Con\n throw OpenMMException(\"updateParametersInContext: The number of particles has changed\");\n \n // Record the per-particle parameters.\n- \n- vector<mm_float2> paramsVector(cc.getPaddedNumAtoms());\n+ vector<mm_float4> paramsVector(cc.getPaddedNumAtoms());\n for (int i = 0; i < force.getNumParticles(); i++) {\n- double charge, radius, scalingFactor;\n- force.getParticleParameters(i, charge, radius, scalingFactor);\n- paramsVector[i] = mm_float2((float) radius, (float) (scalingFactor*radius));\n+ double charge, radius, scalingFactor, descreenRadius, neckFactor;\n+ force.getParticleParameters(i, charge, radius, scalingFactor, descreenRadius, neckFactor);\n+ paramsVector[i] = mm_float4((float) radius, (float) scalingFactor, (float) descreenRadius, (float) neckFactor);\n }\n params.upload(paramsVector);\n cc.invalidateMolecules();\n@@ -1989,11 +2019,11 @@ class CommonCalcAmoebaVdwForceKernel::ForceInfo : public ComputeForceInfo {\n }\n bool areParticlesIdentical(int particle1, int particle2) {\n int iv1, iv2, type1, type2;\n- double sigma1, sigma2, epsilon1, epsilon2, reduction1, reduction2;\n+ double sigma1, sigma2, epsilon1, epsilon2, reduction1, reduction2, scaleFactor1, scaleFactor2;\n bool isAlchemical1, isAlchemical2;\n- force.getParticleParameters(particle1, iv1, sigma1, epsilon1, reduction1, isAlchemical1, type1);\n- force.getParticleParameters(particle2, iv2, sigma2, epsilon2, reduction2, isAlchemical2, type2);\n- return (sigma1 == sigma2 && epsilon1 == epsilon2 && reduction1 == reduction2 && isAlchemical1 == isAlchemical2 && type1 == type2);\n+ force.getParticleParameters(particle1, iv1, sigma1, epsilon1, reduction1, isAlchemical1, type1, scaleFactor1);\n+ force.getParticleParameters(particle2, iv2, sigma2, epsilon2, reduction2, isAlchemical2, type2, scaleFactor2);\n+ return (sigma1 == sigma2 && epsilon1 == epsilon2 && reduction1 == reduction2 && isAlchemical1 == isAlchemical2 && type1 == type2 && scaleFactor1 == scaleFactor2);\n }\n private:\n const AmoebaVdwForce& force;\n@@ -2014,6 +2044,7 @@ void CommonCalcAmoebaVdwForceKernel::initialize(const System& system, const Amoe\n int paddedNumAtoms = cc.getPaddedNumAtoms();\n bondReductionAtoms.initialize<int>(cc, paddedNumAtoms, \"bondReductionAtoms\");\n bondReductionFactors.initialize<float>(cc, paddedNumAtoms, \"bondReductionFactors\");\n+ scaleFactors.initialize<float>(cc, paddedNumAtoms, \"scaleFactors\");\n tempPosq.initialize(cc, paddedNumAtoms, cc.getUseDoublePrecision() ? sizeof(mm_double4) : sizeof(mm_float4), \"tempPosq\");\n tempForces.initialize<long long>(cc, 3*paddedNumAtoms, \"tempForces\");\n \n@@ -2035,6 +2066,7 @@ void CommonCalcAmoebaVdwForceKernel::initialize(const System& system, const Amoe\n vector<float> isAlchemicalVec(paddedNumAtoms, 0);\n vector<int> bondReductionAtomsVec(paddedNumAtoms, 0);\n vector<float> bondReductionFactorsVec(paddedNumAtoms, 0);\n+ vector<float> scaleFactorsVec(paddedNumAtoms, 0);\n vector<vector<int> > exclusions(cc.getNumAtoms());\n \n // Handle Alchemical parameters.\n@@ -2046,17 +2078,19 @@ void CommonCalcAmoebaVdwForceKernel::initialize(const System& system, const Amoe\n \n for (int i = 0; i < force.getNumParticles(); i++) {\n int ivIndex, type;\n- double sigma, epsilon, reductionFactor;\n+ double sigma, epsilon, reductionFactor, scaleFactor;\n bool alchemical;\n- force.getParticleParameters(i, ivIndex, sigma, epsilon, reductionFactor, alchemical, type);\n+ force.getParticleParameters(i, ivIndex, sigma, epsilon, reductionFactor, alchemical, type, scaleFactor);\n isAlchemicalVec[i] = (alchemical) ? 1.0f : 0.0f;\n bondReductionAtomsVec[i] = ivIndex;\n bondReductionFactorsVec[i] = (float) reductionFactor;\n+ scaleFactorsVec[i] = (float) scaleFactor;\n force.getParticleExclusions(i, exclusions[i]);\n exclusions[i].push_back(i);\n }\n bondReductionAtoms.upload(bondReductionAtomsVec);\n bondReductionFactors.upload(bondReductionFactorsVec);\n+ scaleFactors.upload(scaleFactorsVec);\n if (force.getUseDispersionCorrection())\n dispersionCoefficient = AmoebaVdwForceImpl::calcDispersionCorrection(system, force);\n else\n@@ -2069,7 +2103,6 @@ void CommonCalcAmoebaVdwForceKernel::initialize(const System& system, const Amoe\n nonbonded = cc.createNonbondedUtilities();\n nonbonded->addParameter(ComputeParameterInfo(atomType, \"atomType\", \"int\", 1));\n nonbonded->addArgument(ComputeParameterInfo(sigmaEpsilon, \"sigmaEpsilon\", \"float\", 2));\n-\n if (hasAlchemical) {\n isAlchemical.upload(isAlchemicalVec);\n currentVdwLambda = 1.0f;\n@@ -2077,7 +2110,7 @@ void CommonCalcAmoebaVdwForceKernel::initialize(const System& system, const Amoe\n nonbonded->addParameter(ComputeParameterInfo(isAlchemical, \"isAlchemical\", \"float\", 1));\n nonbonded->addArgument(ComputeParameterInfo(vdwLambda, \"vdwLambda\", \"float\", 1));\n }\n- \n+ nonbonded->addParameter(ComputeParameterInfo(scaleFactors, \"scaleFactor\", \"float\", 1));\n // Create the interaction kernel.\n \n map<string, string> replacements;\n@@ -2170,18 +2203,21 @@ void CommonCalcAmoebaVdwForceKernel::copyParametersToContext(ContextImpl& contex\n vector<float> isAlchemicalVec(cc.getPaddedNumAtoms(), 0);\n vector<int> bondReductionAtomsVec(cc.getPaddedNumAtoms(), 0);\n vector<float> bondReductionFactorsVec(cc.getPaddedNumAtoms(), 0);\n+ vector<float> scaleFactorsVec(cc.getPaddedNumAtoms(), 0);\n for (int i = 0; i < force.getNumParticles(); i++) {\n int ivIndex, type;\n- double sigma, epsilon, reductionFactor;\n+ double sigma, epsilon, reductionFactor, scaleFactor;\n bool alchemical;\n- force.getParticleParameters(i, ivIndex, sigma, epsilon, reductionFactor, alchemical, type);\n+ force.getParticleParameters(i, ivIndex, sigma, epsilon, reductionFactor, alchemical, type, scaleFactor);\n isAlchemicalVec[i] = (alchemical) ? 1.0f : 0.0f;\n bondReductionAtomsVec[i] = ivIndex;\n bondReductionFactorsVec[i] = (float) reductionFactor;\n+ scaleFactorsVec[i] = (float) scaleFactor;\n }\n if (hasAlchemical) isAlchemical.upload(isAlchemicalVec);\n bondReductionAtoms.upload(bondReductionAtomsVec);\n bondReductionFactors.upload(bondReductionFactorsVec);\n+ scaleFactors.upload(scaleFactorsVec);\n if (force.getUseDispersionCorrection())\n dispersionCoefficient = AmoebaVdwForceImpl::calcDispersionCorrection(system, force);\n else\n@@ -2240,6 +2276,7 @@ void CommonCalcAmoebaWcaDispersionForceKernel::initialize(const System& system,\n defines[\"RMINO\"] = cc.doubleToString(force.getRmino());\n defines[\"RMINH\"] = cc.doubleToString(force.getRminh());\n defines[\"AWATER\"] = cc.doubleToString(force.getAwater());\n+ defines[\"DISPOFF\"] = cc.doubleToString(force.getDispoff());\n defines[\"SHCTD\"] = cc.doubleToString(force.getShctd());\n defines[\"M_PI\"] = cc.doubleToString(M_PI);\n ComputeProgram program = cc.compileProgram(CommonAmoebaKernelSources::amoebaWcaForce, defines);\ndiff --git a/plugins/amoeba/platforms/common/src/AmoebaCommonKernels.h b/plugins/amoeba/platforms/common/src/AmoebaCommonKernels.h\nindex e2d665617a..6a23bacffe 100644\n--- a/plugins/amoeba/platforms/common/src/AmoebaCommonKernels.h\n+++ b/plugins/amoeba/platforms/common/src/AmoebaCommonKernels.h\n@@ -298,15 +298,19 @@ class CommonCalcAmoebaGeneralizedKirkwoodForceKernel : public CalcAmoebaGenerali\n * @param force the AmoebaGeneralizedKirkwoodForce to copy the parameters from\n */\n void copyParametersToContext(ContextImpl& context, const AmoebaGeneralizedKirkwoodForce& force);\n+\n private:\n class ForceInfo;\n ComputeContext& cc;\n const System& system;\n- bool includeSurfaceArea, hasInitializedKernels;\n+ bool includeSurfaceArea, tanhRescaling, hasInitializedKernels;\n int computeBornSumThreads, gkForceThreads, chainRuleThreads, ediffThreads;\n AmoebaMultipoleForce::PolarizationType polarizationType;\n std::map<std::string, std::string> defines;\n ComputeArray params;\n+ ComputeArray neckRadii;\n+ ComputeArray neckA;\n+ ComputeArray neckB;\n ComputeArray bornSum;\n ComputeArray bornRadii;\n ComputeArray bornForce;\n@@ -362,6 +366,8 @@ class CommonCalcAmoebaVdwForceKernel : public CalcAmoebaVdwForceKernel {\n float currentVdwLambda;\n // Per particle alchemical flag.\n ComputeArray isAlchemical;\n+ // Per particle scale factor.\n+ ComputeArray scaleFactors;\n \n double dispersionCoefficient;\n ComputeArray sigmaEpsilon, atomType;\ndiff --git a/plugins/amoeba/platforms/common/src/kernels/amoebaGk.cc b/plugins/amoeba/platforms/common/src/kernels/amoebaGk.cc\nindex 65770343d5..7facdf16bd 100644\n--- a/plugins/amoeba/platforms/common/src/kernels/amoebaGk.cc\n+++ b/plugins/amoeba/platforms/common/src/kernels/amoebaGk.cc\n@@ -3,19 +3,49 @@\n /**\n * Reduce the Born sums to compute the Born radii.\n */\n-KERNEL void reduceBornSum(GLOBAL const mm_long* RESTRICT bornSum, GLOBAL const float2* RESTRICT params, GLOBAL real* RESTRICT bornRadii) {\n+KERNEL void reduceBornSum(GLOBAL const mm_long* RESTRICT bornSum, GLOBAL const float4* RESTRICT params, GLOBAL real* RESTRICT bornRadii) {\n+\n+ real RECIP_MAX_RADIUS3 = POW(BIG_RADIUS, (real) -3);\n+ real PI4_3 = 4 * M_PI / 3;\n+ real INVERSE_PI4_3 = 1 / PI4_3;\n+ real ONE_THIRD = 1 / (real) 3;\n+\n for (unsigned int index = GLOBAL_ID; index < NUM_ATOMS; index += GLOBAL_SIZE) {\n // Get summed Born data\n-\n real sum = RECIP((real) 0x100000000)*bornSum[index];\n+ sum = sum * PI4_3;\n+\n+ real radius = params[index].x;\n+ real radius3 = radius * radius * radius;\n+ real ir3 = RECIP(radius3);\n+\n+ // Scale up the solute integral in account for interstitial spaces.\n+ if (TANH_RESCALING) {\n+ // Set up tanh function components\n+ real rhoi3Psi = radius3 * sum;\n+ real rhoi6Psi2 = rhoi3Psi * rhoi3Psi;\n+ real rhoi9Psi3 = rhoi6Psi2 * rhoi3Psi;\n+ // If the output of the tanh function is 1.0, then the Born radius will be MaxBornRadius\n+ real tanh_constant = PI4_3 * (ir3 - RECIP_MAX_RADIUS3);\n+ sum = tanh_constant * tanh(BETA0 * rhoi3Psi - BETA1 * rhoi6Psi2 + BETA2 * rhoi9Psi3);\n+ }\n \n // Now calculate Born radius.\n+ sum = PI4_3 * ir3 - sum;\n \n- float radius = params[index].x;\n- radius = RECIP(radius*radius*radius);\n- sum = radius-sum;\n- sum = (sum <= 0 ? (real) 1000 : POW(sum, -1/(real) 3));\n+ // If the sum is less than zero, set the Born radius to 30.0 Angstroms.\n+ sum = (sum <= 0 ? BIG_RADIUS : POW(INVERSE_PI4_3 * sum, -ONE_THIRD));\n bornRadii[index] = sum;\n+\n+ // Born radius should be at least as large as its base radius.\n+ if (bornRadii[index] < radius) {\n+ bornRadii[index] = radius;\n+ }\n+\n+ // Check if we have exceeded the maximum Born radius.\n+ if (bornRadii[index] > BIG_RADIUS) {\n+ bornRadii[index] = BIG_RADIUS;\n+ }\n }\n }\n \n@@ -23,7 +53,7 @@ KERNEL void reduceBornSum(GLOBAL const mm_long* RESTRICT bornSum, GLOBAL const f\n /**\n * Apply the surface area term to the force and energy.\n */\n-KERNEL void computeSurfaceAreaForce(GLOBAL mm_long* RESTRICT bornForce, GLOBAL mixed* RESTRICT energyBuffer, GLOBAL const float2* RESTRICT params, GLOBAL const real* RESTRICT bornRadii) {\n+KERNEL void computeSurfaceAreaForce(GLOBAL mm_long* RESTRICT bornForce, GLOBAL mixed* RESTRICT energyBuffer, GLOBAL const float4* RESTRICT params, GLOBAL const real* RESTRICT bornRadii) {\n mixed energy = 0;\n for (unsigned int index = GLOBAL_ID; index < NUM_ATOMS; index += GLOBAL_SIZE) {\n real bornRadius = bornRadii[index];\n@@ -46,51 +76,169 @@ KERNEL void computeSurfaceAreaForce(GLOBAL mm_long* RESTRICT bornForce, GLOBAL m\n typedef struct {\n real3 pos;\n real bornSum;\n- float radius, scaledRadius, padding;\n+ float radius, scaleFactor, descreenRadius, neckFactor, padding;\n } AtomData1;\n \n-DEVICE real computeBornSumOneInteraction(AtomData1 atom1, AtomData1 atom2) {\n+DEVICE real interpolate2D(real x1, real x2, real y1, real y2, real x, real y,\n+ real fx1y1, real fx2y1, real fx1y2, real fx2y2) {\n+ real fxy1 = (x2 - x) / (x2 - x1) * fx1y1 + (x - x1) / (x2 - x1) * fx2y1;\n+ real fxy2 = (x2 - x) / (x2 - x1) * fx1y2 + (x - x1) / (x2 - x1) * fx2y2;\n+\n+ return (y2 - y) / (y2 - y1) * fxy1 + (y - y1) / (y2 - y1) * fxy2;\n+}\n+\n+DEVICE void getBounds(real rho, int* below, int* above) {\n+ // Note this function is in Angstroms.\n+ real MINIMUM_RADIUS = 0.8f;\n+ real SPACING = 0.05f;\n+ real calculateIndex = (rho - MINIMUM_RADIUS) / SPACING;\n+ *below = (int) floor(calculateIndex);\n+ *above = *below + 1;\n+ int NUM_POINTS = 45;\n+\n+ if (*above >= NUM_POINTS) {\n+ // Extrapolate up from the top table values.\n+ *below = NUM_POINTS - 1;\n+ *above = NUM_POINTS - 2;\n+ } else if (*below < 0) {\n+ // If below is less than 0, extrapolate down from the bottom table values.\n+ *below = 0;\n+ *above = 1;\n+ }\n+}\n+\n+DEVICE void getNeckConstants(real rhoDescreened, real rhoDescreening, real* aij, real *bij,\n+ GLOBAL const float* RESTRICT neckRadii,\n+ GLOBAL const float* RESTRICT neckA,\n+ GLOBAL const float* RESTRICT neckB) {\n+\n+ // Convert the input radii from nm to A.\n+ rhoDescreened *= 10;\n+ rhoDescreening *= 10;\n+\n+ // Determine low and high values for integration\n+ int lowI, highI, lowJ, highJ;\n+ getBounds(rhoDescreened, &lowI, &highI);\n+ getBounds(rhoDescreening, &lowJ, &highJ);\n+ // Interpolate/Extrapolate Aij and Bij constant values\n+ int NUM_POINTS = 45;\n+ int lowOff = lowI * NUM_POINTS;\n+ int highOff = highI * NUM_POINTS;\n+ *aij = interpolate2D(neckRadii[lowI], neckRadii[highI], neckRadii[lowJ], neckRadii[highJ],\n+ rhoDescreened, rhoDescreening,\n+ neckA[lowOff + lowJ], neckA[highOff + lowJ],\n+ neckA[lowOff + highJ], neckA[highOff + highJ]);\n+\n+ *bij = interpolate2D(neckRadii[lowI], neckRadii[highI],neckRadii[lowJ], neckRadii[highJ],\n+ rhoDescreened, rhoDescreening,\n+ neckB[lowOff + lowJ], neckB[highOff + lowJ],\n+ neckB[lowOff + highJ], neckB[highOff + highJ]);\n+\n+ // Never let Aij be negative.\n+ if (*aij < 0.0f) {\n+ *aij = 0.0f;\n+ }\n+\n+ // Convert aij from A^(-11) to nm^(-11);\n+ *aij /= 10;\n+ // Convert bij from A to nm.\n+ *bij /= 10;\n+}\n+\n+DEVICE real neckDescreen(real r, real radius, real radiusK, real sneck,\n+ GLOBAL const float* RESTRICT neckRadii,\n+ GLOBAL const float* RESTRICT neckA,\n+ GLOBAL const float* RESTRICT neckB) {\n+\n+ real radiusWater = 0.14f;\n+\n+ // If atoms are too widely separated there is no neck formed.\n+ if (r > radius + radiusK + 2 * radiusWater) {\n+ return 0.0f;\n+ }\n+\n+ // Get Aij and Bij based on parameterization by Corrigan et al.\n+ real aij, bij;\n+ getNeckConstants(radius, radiusK, &aij, &bij, neckRadii, neckA, neckB);\n+ real rMinusBij = r - bij;\n+ real radiiMinusr = radius + radiusK + 2 * radiusWater - r;\n+ real power1 = rMinusBij * rMinusBij * rMinusBij * rMinusBij;\n+ real power2 = radiiMinusr * radiiMinusr * radiiMinusr * radiiMinusr;\n+\n+ // Use Aij and Bij to get neck integral using Equations 13 and 14 from Aguilar/Onufriev 2010 paper\n+ // Sneck may be based on the number of heavy atoms bound to the atom being descreened.\n+ real PI4_3 = 4 * M_PI / (real) 3;\n+ real neckIntegral = PI4_3 * sneck * aij * power1 * power2;\n+\n+ return neckIntegral;\n+}\n+\n+\n+DEVICE real computeBornSumOneInteraction(AtomData1 atom1, AtomData1 atom2,\n+ GLOBAL const float* RESTRICT neckRadii,\n+ GLOBAL const float* RESTRICT neckA,\n+ GLOBAL const float* RESTRICT neckB) {\n+\n if (atom1.radius <= 0)\n return 0; // Ignore this interaction\n+\n+ float sk = atom2.scaleFactor * atom2.descreenRadius;\n+ if (sk <= 0.0f)\n+ return 0; // No descreening.\n+\n real3 delta = atom2.pos - atom1.pos;\n real r2 = dot(delta, delta);\n real r = SQRT(r2);\n- float sk = atom2.scaledRadius;\n+ real baseRadius = max(atom1.radius, atom1.descreenRadius) + DESCREEN_OFFSET;\n \n- if (atom1.radius > r + sk)\n+ if (baseRadius > r + sk)\n return 0; // No descreening due to atom1 engulfing atom2.\n \n real sk2 = sk*sk;\n- if (atom1.radius+r < sk) {\n- real lik = atom1.radius;\n- real uik = sk - r; \n+ if (baseRadius + r < sk) {\n+ real lik = baseRadius;\n+ real uik = sk - r;\n atom1.bornSum -= RECIP(uik*uik*uik) - RECIP(lik*lik*lik);\n }\n real uik = r+sk;\n real lik;\n- if (atom1.radius+r < sk)\n+ if (baseRadius+r < sk)\n lik = sk-r;\n- else if (r < atom1.radius+sk)\n- lik = atom1.radius;\n+ else if (r < baseRadius+sk)\n+ lik = baseRadius;\n else\n lik = r-sk;\n- real l2 = lik*lik; \n+ real l2 = lik*lik;\n real l4 = l2*l2;\n real lr = lik*r;\n- real l4r = l4*r; \n+ real l4r = l4*r;\n real u2 = uik*uik;\n real u4 = u2*u2;\n- real ur = uik*r; \n+ real ur = uik*r;\n real u4r = u4*r;\n real term = (3*(r2-sk2)+6*u2-8*ur)/u4r - (3*(r2-sk2)+6*l2-8*lr)/l4r;\n- return term/16;\n+ term = term / (real) 16;\n+\n+ real neck1 = atom1.neckFactor;\n+ real neck2 = atom2.neckFactor;\n+ real mixedNeckScale = 0.5f * (neck1 + neck2);\n+ if (mixedNeckScale > 0 && atom2.scaleFactor > 0) {\n+ real ret = neckDescreen(r, baseRadius, atom2.descreenRadius, mixedNeckScale, neckRadii, neckA, neckB);\n+ real pi43 = 4 * M_PI / (real) 3;\n+ term += ret / pi43;\n+ }\n+\n+ return term;\n }\n \n /**\n * Compute the Born sum.\n */\n KERNEL void computeBornSum(GLOBAL mm_ulong* RESTRICT bornSum, GLOBAL const real4* RESTRICT posq,\n- GLOBAL const float2* RESTRICT params, unsigned int numTiles) {\n+ GLOBAL const float4* RESTRICT params, unsigned int numTiles,\n+ GLOBAL const float* RESTRICT neckRadii,\n+ GLOBAL const float* RESTRICT neckA,\n+ GLOBAL const float* RESTRICT neckB) {\n unsigned int totalWarps = (GLOBAL_SIZE)/TILE_SIZE;\n unsigned int warp = (GLOBAL_ID)/TILE_SIZE;\n unsigned int pos = (unsigned int) (warp*(mm_long)numTiles/totalWarps);\n@@ -113,22 +261,26 @@ KERNEL void computeBornSum(GLOBAL mm_ulong* RESTRICT bornSum, GLOBAL const real4\n }\n unsigned int atom1 = x*TILE_SIZE + tgx;\n data.pos = trimTo3(posq[atom1]);\n- float2 params1 = params[atom1];\n+ float4 params1 = params[atom1];\n data.radius = params1.x;\n- data.scaledRadius = params1.y;\n+ data.scaleFactor = params1.y;\n+ data.descreenRadius = params1.z;\n+ data.neckFactor = params1.w;\n if (pos >= end)\n ; // This warp is done.\n else if (x == y) {\n // This tile is on the diagonal.\n-\n localData[LOCAL_ID].pos = data.pos;\n localData[LOCAL_ID].radius = params1.x;\n- localData[LOCAL_ID].scaledRadius = params1.y;\n+ localData[LOCAL_ID].scaleFactor = params1.y;\n+ localData[LOCAL_ID].descreenRadius = params1.z;\n+ localData[LOCAL_ID].neckFactor = params1.w;\n+\n SYNC_WARPS;\n for (unsigned int j = 0; j < TILE_SIZE; j++) {\n int atom2 = y*TILE_SIZE+j;\n if (atom1 < NUM_ATOMS && atom2 < NUM_ATOMS && atom1 != atom2) {\n- real bornSum = computeBornSumOneInteraction(data, localData[tbx+j]);\n+ real bornSum = computeBornSumOneInteraction(data, localData[tbx+j], neckRadii, neckA, neckB);\n data.bornSum += bornSum;\n }\n }\n@@ -141,9 +293,11 @@ KERNEL void computeBornSum(GLOBAL mm_ulong* RESTRICT bornSum, GLOBAL const real4\n unsigned int j = y*TILE_SIZE + tgx;\n real4 tempPosq = posq[j];\n localData[LOCAL_ID].pos = trimTo3(tempPosq);\n- float2 tempParams = params[j];\n- localData[LOCAL_ID].radius = tempParams.x;\n- localData[LOCAL_ID].scaledRadius = tempParams.y;\n+ float4 paramsJ = params[j];\n+ localData[LOCAL_ID].radius = paramsJ.x;\n+ localData[LOCAL_ID].scaleFactor = paramsJ.y;\n+ localData[LOCAL_ID].descreenRadius = paramsJ.z;\n+ localData[LOCAL_ID].neckFactor = paramsJ.w;\n }\n localData[LOCAL_ID].bornSum = 0;\n SYNC_WARPS;\n@@ -154,9 +308,9 @@ KERNEL void computeBornSum(GLOBAL mm_ulong* RESTRICT bornSum, GLOBAL const real4\n for (unsigned int j = 0; j < TILE_SIZE; j++) {\n int atom2 = y*TILE_SIZE+tj;\n if (atom1 < NUM_ATOMS && atom2 < NUM_ATOMS) {\n- real bornSum = computeBornSumOneInteraction(data, localData[tbx+tj]);\n+ real bornSum = computeBornSumOneInteraction(data, localData[tbx+tj], neckRadii, neckA, neckB);\n data.bornSum += bornSum;\n- bornSum = computeBornSumOneInteraction(localData[tbx+tj], data);\n+ bornSum = computeBornSumOneInteraction(localData[tbx+tj], data, neckRadii, neckA, neckB);\n localData[tbx+tj].bornSum += bornSum;\n }\n tj = (tj + 1) & (TILE_SIZE - 1);\n@@ -432,65 +586,153 @@ KERNEL void computeGKForces(\n */\n typedef struct {\n real3 pos, force;\n- real radius, scaledRadius, bornRadius, bornForce;\n+ real radius, scaleFactor, descreenRadius, neckFactor, bornSum, bornRadius, bornForce;\n } AtomData3;\n \n-inline DEVICE AtomData3 loadAtomData3(int atom, GLOBAL const real4* RESTRICT posq, GLOBAL const float2* RESTRICT params,\n- GLOBAL const real* RESTRICT bornRadius, GLOBAL const mm_long* RESTRICT bornForce) {\n+inline DEVICE AtomData3 loadAtomData3(int atom, GLOBAL const real4* RESTRICT posq, GLOBAL const float4* RESTRICT params,\n+ GLOBAL const mm_long* RESTRICT bornSum,\n+ GLOBAL const real* RESTRICT bornRadius, GLOBAL const mm_long* RESTRICT bornForce) {\n AtomData3 data;\n data.pos = trimTo3(posq[atom]);\n data.bornRadius = bornRadius[atom];\n- float2 params1 = params[atom];\n+ data.bornSum = bornSum[atom]/(real) 0x100000000;\n+ float4 params1 = params[atom];\n data.radius = params1.x;\n- data.scaledRadius = params1.y;\n+ data.scaleFactor = params1.y;\n+ data.descreenRadius = params1.z;\n+ data.neckFactor = params1.w;\n data.bornForce = bornForce[atom]/(real) 0x100000000;\n return data;\n }\n \n-DEVICE void computeBornChainRuleInteraction(AtomData3 atom1, AtomData3 atom2, real3* force) {\n- real third = 1/(real) 3;\n- real pi43 = 4*third*M_PI;\n- real factor = -POW(M_PI, third)*POW((real) 6, 2/(real) 3)/9;\n+/**\n+ * Use pairwise descreening to compute derivative of the integral of 1/r^6 with respect to r.\n+ *\n+ * @param r separation distance.\n+ * @param r2 separation distance squared.\n+ * @param radius base radius of descreened atom.\n+ * @param scaledRadius scaled radius descreening atom.\n+ * @return the derivative.\n+ */\n+DEVICE real pairIntegralDerivative(real r, real r2, real radius, real scaledRadius) {\n+\n+ real de = 0.0f;\n+ // Descreen only if the scaledRadius is greater than zero.\n+ // and atom I does not engulf atom K.\n+ if (scaledRadius > 0.0f && (radius < r + scaledRadius)) {\n+ // Atom i is engulfed by atom k.\n+ if (radius + r < scaledRadius) {\n+ real uik = scaledRadius - r;\n+ real uik2 = uik * uik;\n+ real uik4 = uik2 * uik2;\n+ de = -4.0f * M_PI / uik4;\n+ }\n+\n+ // Lower integration bound depends on atoms sizes and separation.\n+ real sk2 = scaledRadius * scaledRadius;\n+ if (radius + r < scaledRadius) {\n+ // Atom i is engulfed by atom k.\n+ real lik = scaledRadius - r;\n+ real lik2 = lik * lik;\n+ real lik4 = lik2 * lik2;\n+ de = de + 0.25f * M_PI * (sk2 - 4.0f * scaledRadius * r + 17.0f * r2) / (r2 * lik4);\n+ } else if (r < radius + scaledRadius) {\n+ // Atoms are overlapped, begin integration from ri.\n+ real lik = radius;\n+ real lik2 = lik * lik;\n+ real lik4 = lik2 * lik2;\n+ de = de + 0.25f * M_PI * (2.0f * radius * radius - sk2 - r2) / (r2 * lik4);\n+ } else {\n+ // No overlap between atoms.\n+ real lik = r - scaledRadius;\n+ real lik2 = lik * lik;\n+ real lik4 = lik2 * lik2;\n+ de = de + 0.25f * M_PI * (sk2 - 4.0f * scaledRadius * r + r2) / (r2 * lik4);\n+ }\n+\n+ // Upper integration bound is always the same.\n+ real uik = r + scaledRadius;\n+ real uik2 = uik * uik;\n+ real uik4 = uik2 * uik2;\n+ de = de - 0.25f * M_PI * (sk2 + 4.0f * scaledRadius * r + r2) / (r2 * uik4);\n+ }\n+ return de;\n+}\n+\n+DEVICE real neckDescreenDerivative(real r, real radius, real radiusK, real sneck,\n+ GLOBAL const float* RESTRICT neckRadii,\n+ GLOBAL const float* RESTRICT neckA,\n+ GLOBAL const float* RESTRICT neckB) {\n+\n+ real radiusWater = 0.14f;\n+\n+ if (r > radius + radiusK + 2 * radiusWater) {\n+ return 0;\n+ }\n+\n+ // Get Aij and Bij\n+ real Aij, Bij;\n+ getNeckConstants(radius, radiusK, &Aij, &Bij, neckRadii, neckA, neckB);\n+\n+ // Use Aij and Bij to get neck value using derivative of Equation 13 from Aguilar/Onufriev 2010 paper\n+ real rMinusBij = r - Bij;\n+ real rMinusBij3 = rMinusBij * rMinusBij * rMinusBij;\n+ real rMinusBij4 = rMinusBij3 * rMinusBij;\n+ real radiiMinusr = radius + radiusK + 2 * radiusWater - r;\n+ real radiiMinusr3 = radiiMinusr * radiiMinusr * radiiMinusr;\n+ real radiiMinusr4 = radiiMinusr3 * radiiMinusr;\n+\n+ real PI4_3 = 4 * M_PI / (real) 3;\n+\n+ return 4 * PI4_3 * (sneck * Aij * rMinusBij3 * radiiMinusr4 - sneck * Aij * rMinusBij4 * radiiMinusr3);\n+}\n+\n+DEVICE void computeBornChainRuleInteraction(AtomData3 atom1, AtomData3 atom2, real3* force,\n+ GLOBAL const float* RESTRICT neckRadii,\n+ GLOBAL const float* RESTRICT neckA,\n+ GLOBAL const float* RESTRICT neckB) {\n+ real third = 1 / (real) 3;\n+ real pi43 = 4 * third * M_PI;\n+ real factor = -POW(M_PI, third)*POW((real) 6.0f, (real) 2 * third) / (real) 9;\n real term = pi43/(atom1.bornRadius*atom1.bornRadius*atom1.bornRadius);\n- term = factor/POW(term, 4/(real) 3);\n+ term = factor/POW(term, (real) 4 * third);\n+\n+ if (TANH_RESCALING) {\n+ real bornSum = atom1.bornSum * pi43;\n+ real rhoi = atom1.radius;\n+ real rhoi3 = rhoi * rhoi * rhoi;\n+ real rhoi3Psi = rhoi3 * bornSum;\n+ real rhoi6Psi2 = rhoi3Psi * rhoi3Psi;\n+ real rhoi9Psi3 = rhoi6Psi2 * rhoi3Psi;\n+ real rhoi6Psi = rhoi3 * rhoi3 * bornSum;\n+ real rhoi9Psi2 = rhoi6Psi2 * rhoi3;\n+ real tanhTerm = tanh(BETA0 * rhoi3Psi - BETA1 * rhoi6Psi2 + BETA2 * rhoi9Psi3);\n+ real tanh2 = tanhTerm * tanhTerm;\n+ real chainRuleTerm = BETA0 * rhoi3 - 2 * BETA1 * rhoi6Psi + 3 * BETA2 * rhoi9Psi2;\n+ real recipBigRad = 1 / (real) BIG_RADIUS;\n+ real recipBigRad3 = recipBigRad * recipBigRad * recipBigRad;\n+ real tanh_constant = pi43 * ((1 / (real) rhoi3) - recipBigRad3);\n+ term = term * tanh_constant * chainRuleTerm * (1.0f - tanh2);\n+ }\n \n+ real de = 0.0f;\n real3 delta = atom2.pos-atom1.pos;\n+ real sk = atom2.scaleFactor;\n+ if (sk <= 0 || atom1.bornRadius >= BIG_RADIUS || atom2.descreenRadius <= 0) {\n+ *force = delta * de;\n+ return;\n+ }\n \n- float sk = atom2.scaledRadius;\n- real sk2 = sk*sk;\n+ real baseRadius = max(atom1.radius, atom1.descreenRadius) + DESCREEN_OFFSET;\n real r2 = dot(delta, delta);\n real r = SQRT(r2);\n- real de = 0;\n-\n- if (atom1.radius > r + sk)\n- return; // No descreening due to atom1 engulfing atom2.\n-\n- if (atom1.radius+r < sk) {\n- real uik = sk-r;\n- real uik4 = uik*uik;\n- uik4 = uik4*uik4;\n- de = -4*M_PI/uik4;\n- real lik = sk - r;\n- real lik4 = lik*lik;\n- lik4 = lik4*lik4;\n- de += 0.25f*M_PI*(sk2-4*sk*r+17*r2)/(r2*lik4);\n- }\n- else if (r < atom1.radius+sk) {\n- real lik = atom1.radius;\n- real lik4 = lik*lik;\n- lik4 = lik4*lik4;\n- de += 0.25f*M_PI*(2*atom1.radius*atom1.radius-sk2-r2)/(r2*lik4);\n- }\n- else {\n- real lik = r-sk;\n- real lik4 = lik*lik;\n- lik4 = lik4*lik4;\n- de += 0.25f*M_PI*(sk2-4*sk*r+r2)/(r2*lik4);\n+ de = pairIntegralDerivative(r, r2, baseRadius, sk * atom2.descreenRadius);\n+\n+ real mixedNeckScale = 0.5f * (atom1.neckFactor + atom2.neckFactor);\n+ if (mixedNeckScale > 0) {\n+ de += neckDescreenDerivative(r, baseRadius, atom2.descreenRadius, mixedNeckScale, neckRadii, neckA, neckB);\n }\n- real uik = r+sk;\n- real uik4 = uik*uik;\n- uik4 = uik4*uik4;\n- de -= 0.25f*M_PI*(sk2+4*sk*r+r2)/(r2*uik4);\n+\n real dbr = term*de/r;\n de = dbr*atom1.bornForce;\n *force = delta*de;\n@@ -501,7 +743,12 @@ DEVICE void computeBornChainRuleInteraction(AtomData3 atom1, AtomData3 atom2, re\n */\n KERNEL void computeChainRuleForce(\n GLOBAL mm_ulong* RESTRICT forceBuffers, GLOBAL const real4* RESTRICT posq, unsigned int startTileIndex, unsigned int numTileIndices,\n- GLOBAL const float2* RESTRICT params, GLOBAL const real* RESTRICT bornRadii, GLOBAL const mm_long* RESTRICT bornForce) {\n+ GLOBAL const float4* RESTRICT params,\n+ GLOBAL const float* RESTRICT neckRadii,\n+ GLOBAL const float* RESTRICT neckA,\n+ GLOBAL const float* RESTRICT neckB,\n+ GLOBAL const mm_long* RESTRICT bornSum,\n+ GLOBAL const real* RESTRICT bornRadii, GLOBAL const mm_long* RESTRICT bornForce) {\n unsigned int totalWarps = (GLOBAL_SIZE)/TILE_SIZE;\n unsigned int warp = (GLOBAL_ID)/TILE_SIZE;\n const unsigned int numTiles = numTileIndices;\n@@ -522,17 +769,19 @@ KERNEL void computeChainRuleForce(\n x = (pos-y*NUM_BLOCKS+y*(y+1)/2);\n }\n unsigned int atom1 = x*TILE_SIZE + tgx;\n- AtomData3 data = loadAtomData3(atom1, posq, params, bornRadii, bornForce);\n+ AtomData3 data = loadAtomData3(atom1, posq, params, bornSum, bornRadii, bornForce);\n data.force = make_real3(0);\n if (pos >= end)\n ; // This warp is done.\n else if (x == y) {\n // This tile is on the diagonal.\n-\n localData[LOCAL_ID].pos = data.pos;\n localData[LOCAL_ID].radius = data.radius;\n- localData[LOCAL_ID].scaledRadius = data.scaledRadius;\n+ localData[LOCAL_ID].scaleFactor = data.scaleFactor;\n+ localData[LOCAL_ID].descreenRadius = data.descreenRadius;\n+ localData[LOCAL_ID].neckFactor = data.neckFactor;\n localData[LOCAL_ID].bornRadius = data.bornRadius;\n+ localData[LOCAL_ID].bornSum = data.bornSum;\n localData[LOCAL_ID].bornForce = data.bornForce;\n localData[LOCAL_ID].force = make_real3(0);\n SYNC_WARPS;\n@@ -543,7 +792,7 @@ KERNEL void computeChainRuleForce(\n int atom2 = y*TILE_SIZE+j;\n if (atom1 != atom2 && atom1 < NUM_ATOMS && atom2 < NUM_ATOMS) {\n real3 tempForce;\n- computeBornChainRuleInteraction(data, localData[tbx+j], &tempForce);\n+ computeBornChainRuleInteraction(data, localData[tbx+j], &tempForce, neckRadii, neckA, neckB);\n data.force -= tempForce;\n localData[tbx+j].force += tempForce;\n }\n@@ -557,7 +806,7 @@ KERNEL void computeChainRuleForce(\n // This is an off-diagonal tile.\n \n unsigned int j = y*TILE_SIZE + tgx;\n- localData[LOCAL_ID] = loadAtomData3(j, posq, params, bornRadii, bornForce);\n+ localData[LOCAL_ID] = loadAtomData3(j, posq, params, bornSum, bornRadii, bornForce);\n localData[LOCAL_ID].force = make_real3(0);\n SYNC_WARPS;\n unsigned int tj = tgx;\n@@ -565,10 +814,10 @@ KERNEL void computeChainRuleForce(\n int atom2 = y*TILE_SIZE+tj;\n if (atom1 < NUM_ATOMS && atom2 < NUM_ATOMS) {\n real3 tempForce;\n- computeBornChainRuleInteraction(data, localData[tbx+tj], &tempForce);\n+ computeBornChainRuleInteraction(data, localData[tbx+tj], &tempForce, neckRadii, neckA, neckB);\n data.force -= tempForce;\n localData[tbx+tj].force += tempForce;\n- computeBornChainRuleInteraction(localData[tbx+tj], data, &tempForce);\n+ computeBornChainRuleInteraction(localData[tbx+tj], data, &tempForce, neckRadii, neckA, neckB);\n data.force += tempForce;\n localData[tbx+tj].force -= tempForce;\n }\ndiff --git a/plugins/amoeba/platforms/common/src/kernels/amoebaVdwForce2.cc b/plugins/amoeba/platforms/common/src/kernels/amoebaVdwForce2.cc\nindex fa4bc34687..d01e50410b 100644\n--- a/plugins/amoeba/platforms/common/src/kernels/amoebaVdwForce2.cc\n+++ b/plugins/amoeba/platforms/common/src/kernels/amoebaVdwForce2.cc\n@@ -7,7 +7,7 @@\n real tempForce = 0.0f;\n float2 pairSigmaEpsilon = sigmaEpsilon[atomType1+atomType2*NUM_TYPES];\n real sigma = pairSigmaEpsilon.x;\n- real epsilon = pairSigmaEpsilon.y;\n+ real epsilon = pairSigmaEpsilon.y * scaleFactor1 * scaleFactor2;\n real softcore = 0.0f;\n #if VDW_ALCHEMICAL_METHOD == 1\n if (isAlchemical1 != isAlchemical2) { \ndiff --git a/plugins/amoeba/platforms/common/src/kernels/amoebaWcaForce.cc b/plugins/amoeba/platforms/common/src/kernels/amoebaWcaForce.cc\nindex 58ef0891d8..0126b77847 100644\n--- a/plugins/amoeba/platforms/common/src/kernels/amoebaWcaForce.cc\n+++ b/plugins/amoeba/platforms/common/src/kernels/amoebaWcaForce.cc\n@@ -29,10 +29,145 @@ DEVICE void initParticleParameters(float radius, float epsilon, real* rmixo, rea\n *rmixh = 2*(rminh2*RMINH + radius2*radius) / (rminh2+radius2);\n }\n \n+DEVICE real integralBeforeRMin(real eps, real r, real r2, real sk2,\n+ real lik2, real lik3, real lik4, real uik2, real uik3, real uik4) {\n+ return -eps * (4 * M_PI / (48 * r) * (3 * (lik4 - uik4) - 8 * r * (lik3 - uik3) + 6 * (r2 - sk2) * (lik2 - uik2)));\n+}\n+\n+DEVICE real integralBeforeRminDerivative(real ri, real eps, real rmin, real r, real r2,\n+ real r3, real sk, real sk2, real lik, real lik2,\n+ real lik3, real uik, real uik2, real uik3) {\n+ real dl;\n+ if (ri > r - sk) {\n+ dl = (-lik2 + 2 * r2 + 2 * sk2) * lik2;\n+ } else {\n+ dl = (-lik3 + 4 * lik2 * r - 6 * lik * r2 + 2 * lik * sk2 + 4 * r3 - 4 * r * sk2) * lik;\n+ }\n+ real du;\n+ if (r + sk > rmin) {\n+ du = -(-uik2 + 2 * r2 + 2 * sk2) * uik2;\n+ } else {\n+ du = -(-uik3 + 4 * uik2 * r - 6 * uik * r2 + 2 * uik * sk2 + 4 * r3 - 4 * r * sk2) * uik;\n+ }\n+ return -eps * M_PI * (dl + du) / (4 * r2);\n+}\n+\n+DEVICE real integralAfterRmin(real eps, real rmin7, real r, real r2, real sk2,\n+ real lik, real lik2, real lik3, real lik4, real lik5, real lik10,\n+ real lik11, real lik12, real uik, real uik2, real uik3, real uik4,\n+ real uik5, real uik10, real uik11, real uik12) {\n+ real er7 = eps * rmin7;\n+ real term = 4 * M_PI / (120 * r * lik5 * uik5)\n+ * (15 * uik * lik * r * (uik4 - lik4)\n+ - 10 * uik2 * lik2 * (uik3 - lik3)\n+ + 6 * (sk2 - r2) * (uik5 - lik5));\n+ real term2 = 4 * M_PI / (2640 * r * lik12 * uik12)\n+ * (120 * uik * lik * r * (uik11 - lik11)\n+ - 66 * uik2 * lik2 * (uik10 - lik10)\n+ + 55 * (sk2 - r2) * (uik12 - lik12));\n+ real idisp = -2 * er7 * term;\n+ real irep = er7 * rmin7 * term2;\n+ return irep + idisp;\n+}\n+\n+DEVICE real integralAfterRminDerivative(real ri, real eps, real rmin, real rmin7, real rmax,\n+ real r, real r2, real r3, real sk, real sk2, real lik,\n+ real lik2, real lik3, real lik5, real lik6, real lik12,\n+ real lik13, real uik, real uik2, real uik3, real uik6,\n+ real uik13) {\n+ real er7 = eps * rmin7;\n+ real lowerTerm = lik2 * r + r3 - r * sk2;\n+ real upperTerm = uik2 * r + r3 - r * sk2;\n+\n+ real dl;\n+ if (ri > r - sk || rmax < rmin) {\n+ dl = -(-5 * lik2 + 3 * r2 + 3 * sk2) / lik5;\n+ } else {\n+ dl = (5 * lik3 - 33 * lik * r2 - 3 * lik * sk2 + 15 * lowerTerm) / lik6;\n+ }\n+ real du = -(5 * uik3 - 33 * uik * r2 - 3 * uik * sk2 + 15 * upperTerm) / uik6;\n+ real de = -2 * M_PI * er7 * (dl + du) / (15 * r2);\n+\n+ if (ri > r - sk || rmax < rmin) {\n+ dl = -(-6 * lik2 + 5 * r2 + 5 * sk2) / lik12;\n+ } else {\n+ dl = (6 * lik3 - 125 * lik * r2 - 5 * lik * sk2 + 60 * lowerTerm) / lik13;\n+ }\n+ du = -(6 * uik3 - 125 * uik * r2 - 5 * uik * sk2 + 60 * upperTerm) / uik13;\n+ de += M_PI * er7 * rmin7 * (dl + du) / (60 * r2);\n+ return de;\n+}\n+\n+DEVICE real interact(real factor, real ri, real sk, real rmix, real emix,\n+ real r, real r2, real r3, real3 *force) {\n+ real sum = 0;\n+ // Nothing to do if the integral begins beyond r + sk (i.e. atom k does not exclude solvent)\n+ if (ri < r + sk) {\n+ // Zero out the derivative contribution of atom k.\n+ real de = 0;\n+ real sk2 = sk * sk;\n+ // Compute the maximum of 1) the beginning of the integral and 2) closest edge of atom K.\n+ real iStart = ri > r - sk ? ri : r - sk;\n+ // Use this as the lower limit for integrating the constant eps value below Rmin.\n+ real lik = iStart;\n+ // Interaction with water from lik to Rmin; nothing to do if the lower limit is greater than Rmin.\n+ if (lik < rmix) {\n+ real lik2 = lik * lik;\n+ real lik3 = lik2 * lik;\n+ real lik4 = lik3 * lik;\n+ // Upper limit is the minimum of Rmin and the farthest edge of atom K.\n+ real uik = r + sk < rmix ? r + sk : rmix;\n+ real uik2 = uik * uik;\n+ real uik3 = uik2 * uik;\n+ real uik4 = uik3 * uik;\n+ sum = integralBeforeRMin(emix, r, r2, sk2, lik2, lik3, lik4, uik2, uik3, uik4);\n+ de = integralBeforeRminDerivative(ri, emix, rmix, r, r2, r3, sk, sk2, lik, lik2, lik3, uik, uik2, uik3);\n+ }\n+ // Upper limit the variable part of Uwca always the farthest edge of atom K.\n+ real uik = r + sk;\n+ // Interaction with water beyond Rmin, from lik to uik = r + sk.\n+ if (uik > rmix) {\n+ // Start the integral at the max of 1) iStart and 2) Rmin.\n+ lik = iStart > rmix ? iStart : rmix;\n+ real lik2 = lik * lik;\n+ real lik3 = lik2 * lik;\n+ real lik4 = lik3 * lik;\n+ real lik5 = lik4 * lik;\n+ real lik6 = lik5 * lik;\n+ real lik10 = lik5 * lik5;\n+ real lik11 = lik10 * lik;\n+ real lik12 = lik11 * lik;\n+ real uik2 = uik * uik;\n+ real uik3 = uik2 * uik;\n+ real uik4 = uik3 * uik;\n+ real uik5 = uik4 * uik;\n+ real uik10 = uik5 * uik5;\n+ real uik11 = uik10 * uik;\n+ real uik12 = uik11 * uik;\n+ real rmix3 = rmix * rmix * rmix;\n+ real rmix7 = rmix3 * rmix3 * rmix;\n+ sum += integralAfterRmin(emix, rmix7, r, r2, sk2, lik, lik2, lik3, lik4, lik5, lik10, lik11, lik12, uik,\n+ uik2, uik3, uik4, uik5, uik10, uik11, uik12);\n+ real lik13 = lik12 * lik;\n+ real uik6 = uik5 * uik;\n+ real uik13 = uik12 * uik;\n+ de += integralAfterRminDerivative(ri, emix, rmix, rmix7, iStart, r, r2, r3, sk, sk2, lik, lik2, lik3,\n+ lik5, lik6, lik12, lik13, uik, uik2, uik3, uik6, uik13);\n+ }\n+ // Increment the individual dispersion gradient components.\n+ de *= factor / r;\n+ (*force).x += de;\n+ (*force).y += de;\n+ (*force).z += de;\n+ }\n+ return factor * sum;\n+}\n+\n+\n DEVICE void computeOneInteraction(AtomData atom1, AtomData atom2, real rmixo, real rmixh, real emixo, real emixh, real3* force, real* energy) {\n // get deltaR and r between 2 atoms\n- \n- *force = atom2.pos - atom1.pos;\n+\n+ *force = atom1.pos - atom2.pos;\n real r2 = dot(*force, *force);\n if (r2 <= 0) {\n *force = make_real3(0);\n@@ -42,152 +177,28 @@ DEVICE void computeOneInteraction(AtomData atom1, AtomData atom2, real rmixo, re\n real rI = RSQRT(r2);\n real r = RECIP(rI);\n \n- real sk = atom2.radius*SHCTD;\n- real sk2 = sk*sk;\n- if (atom1.radius >= (r+sk)) {\n- *force = make_real3(0);\n- *energy = 0;\n- return;\n- }\n-\n- real rmax = atom1.radius > (r - sk) ? atom1.radius : (r - sk);\n- real lik = rmax;\n- real lik2 = lik*lik;\n- real lik3 = lik2*lik;\n- real lik4 = lik2*lik2;\n- \n- real uik = (r+sk) < rmixo ? (r+sk) : rmixo;\n- real uik2 = uik*uik;\n- real uik3 = uik2*uik;\n- real uik4 = uik2*uik2;\n-\n- real term = 4*M_PI/(48*r)*(3*(lik4-uik4) - 8*r*(lik3-uik3) + 6*(r2-sk2)*(lik2-uik2));\n+ real xr = (*force).x;\n+ real yr = (*force).y;\n+ real zr = (*force).z;\n+ real r3 = r2 * r;\n \n- real r3 = r2*r;\n- real dl1 = lik2*(-lik2 + 2*(r2 + sk2));\n- real dl2 = lik*(-lik3 + 4*lik2*r - 6*lik*r2 + 2*lik*sk2 + 4*r3 - 4*r*sk2);\n- real dl = atom1.radius > (r-sk)? dl1 : dl2;\n+ real sk = atom2.radius * SHCTD;\n \n- real du1 = uik2*(-uik2 + 2*(r2 + sk2));\n- real du2 = uik*(-uik3 + 4*uik2*r - 2*uik*(3*r2 - sk2) + 4*r*(r2 - sk2));\n- real du = (r+sk) > rmixo ? -du1 : -du2;\n+ // Start of integration of dispersion for atom i with water oxygen.\n+ real riO = rmixo * 0.5f + DISPOFF;\n+ real nO = 1.0f;\n \n- real mask2 = lik < rmixo ? 1 : 0;\n- real sum = -mask2*(emixo*term);\n- real de = -mask2*emixo*M_PI*(dl+du)/(4*r2);\n+ // Start of integration of dispersion for atom i with water hydrogen.\n+ real riH = rmixh * 0.5f + DISPOFF;\n+ real nH = 2.0f;\n \n- uik = (r+sk) < rmixh ? (r+sk) : rmixh;\n- uik2 = uik*uik;\n- uik3 = uik2*uik;\n- uik4 = uik2*uik2;\n+ *force = make_real3(0);\n+ *energy = interact(nO, riO, sk, rmixo, emixo, r, r2, r3, force) +\n+ interact(nH, riH, sk, rmixh, emixh, r, r2, r3, force);\n \n- term = (M_PI)/ (12*r) * (3*(lik4-uik4) - 8*r*(lik3-uik3) + 6*(r2-sk2)*(lik2-uik2));\n-\n- dl1 = lik2*(-lik2 + 2*r2 + 2*sk2);\n- dl2 = lik*(-lik3 + 4*lik2*r - 6*lik*r2 + 2*lik*sk2 + 4*r3 - 4*r*sk2);\n- dl = atom1.radius > (r-sk) ? dl1 : dl2;\n-\n- du1 = -uik2*(-uik2 + 2*r2 + 2*sk2);\n- du2 = -uik*(-uik3 + 4*uik2*r - 6*uik*r2 + 2*uik*sk2 + 4*r3 - 4*r*sk2);\n- du = (r+sk) > rmixh ? du1 : du2;\n-\n- mask2 = lik < rmixh ? 1 : 0;\n- sum -= mask2*(2*emixh*term);\n- de -= mask2*(2*emixh*M_PI*(dl+du)/(4*r2));\n-\n- uik = r + sk;\n- uik2 = uik*uik;\n- uik3 = uik2*uik;\n- uik4 = uik2*uik2;\n- real uik5 = uik4*uik;\n- real uik6 = uik3*uik3;\n- real uik10 = uik5*uik5;\n- real uik11 = uik10*uik;\n- real uik12 = uik6*uik6;\n- real uik13 = uik12*uik;\n-\n- lik = rmax > rmixo ? rmax : rmixo;\n- lik2 = lik*lik;\n- lik3 = lik2*lik;\n- lik4 = lik2*lik2;\n- real lik5 = lik4*lik;\n- real lik6 = lik3*lik3;\n- real lik10 = lik5*lik5;\n- real lik11 = lik10*lik;\n- real lik12 = lik6*lik6;\n- real lik13 = lik12*lik;\n-\n- term = 4*M_PI/(120*r*lik5*uik5)*(15*uik*lik*r*(uik4-lik4) - 10*uik2*lik2*(uik3-lik3) + 6*(sk2-r2)*(uik5-lik5));\n- dl1 = (-5*lik2 + 3*r2 + 3*sk2)/lik5;\n- dl2 = (5*lik3 - 33*lik*r2 - 3*lik*sk2 + 15*(lik2*r+r3-r*sk2))/lik6;\n- dl = (atom1.radius > (r-sk)) || (rmax < rmixo) ? -dl1 : dl2;\n-\n- du = (-5*uik3 + 33*uik*r2 + 3*uik*sk2 - 15*(uik2*r+r3-r*sk2))/uik6;\n-\n- real rmixo7 = rmixo*rmixo*rmixo;\n- rmixo7 = rmixo7*rmixo7*rmixo;\n- real ao = emixo*rmixo7;\n-\n- real idisp = -2*ao*term;\n- mask2 = uik > rmixo ? 1 : 0;\n-\n- de -= mask2*(2*ao*M_PI*(dl + du)/(15*r2));\n-\n- term = 4*M_PI/(2640*r*lik12*uik12) * (120*uik*lik*r*(uik11-lik11) - 66*uik2*lik2*(uik10-lik10) + 55*(sk2-r2)*(uik12-lik12));\n-\n- dl1 = (6*lik2 - 5*r2 - 5*sk2)/lik12;\n- dl2 = (6*lik3 - 125*lik*r2 - 5*lik*sk2 + 60*(lik2*r+r3-r*sk2))/lik13;\n- dl = (atom1.radius > (r-sk)) || (rmax < rmixo) ? dl1 : dl2;\n-\n- du = (-6*uik3 + 125*uik*r2 + 5*uik*sk2 - 60*(uik2*r+r3-r*sk2))/uik13;\n-\n- de += mask2*(ao*rmixo7*M_PI*(dl + du)/(60*r2));\n- real irep = ao*rmixo7*term;\n- sum += mask2*(irep + idisp);\n-\n- lik = rmax > rmixh ? rmax : rmixh;\n- lik2 = lik*lik;\n- lik3 = lik2*lik;\n- lik4 = lik2*lik2;\n- lik5 = lik4*lik;\n- lik6 = lik3*lik3;\n- lik10 = lik5*lik5;\n- lik11 = lik10*lik;\n- lik12 = lik6*lik6;\n- lik13 = lik12*lik;\n-\n- term = 4*M_PI / (120*r*lik5*uik5) * (15*uik*lik*r*(uik4-lik4) - 10*uik2*lik2*(uik3-lik3) + 6*(sk2-r2)*(uik5-lik5));\n-\n- dl1 = (-5*lik2 + 3*r2 + 3*sk2)/lik5;\n- dl2 = (5*lik3 - 33*lik*r2 - 3*lik*sk2+ 15*(lik2*r+r3-r*sk2))/lik6;\n- dl = (atom1.radius > (r-sk)) || (rmax < rmixh) ? -dl1 : dl2;\n-\n- du = -(5*uik3 - 33*uik*r2 - 3*uik*sk2 + 15*(uik2*r+r3-r*sk2))/uik6;\n-\n- real rmixh7 = rmixh*rmixh*rmixh;\n- rmixh7 = rmixh7*rmixh7*rmixh;\n- real ah = emixh*rmixh7;\n-\n- idisp = -4*ah*term;\n-\n- mask2 = uik > rmixh ? 1 : 0;\n- de -= mask2*(4*ah*M_PI*(dl + du)/(15*r2));\n-\n- term = 4*M_PI / (2640*r*lik12*uik12) * (120*uik*lik*r*(uik11-lik11) - 66*uik2*lik2*(uik10-lik10) + 55*(sk2-r2)*(uik12-lik12));\n-\n- dl1 = -(-6*lik2 + 5*r2 + 5*sk2)/lik12;\n- dl2 = (6*lik3 - 125*lik*r2 - 5*lik*sk2 + 60*(lik2*r+r3-r*sk2))/lik13;\n- dl = ((atom1.radius > (r-sk)) || (rmax < rmixh)) ? dl1 : dl2;\n-\n- du = -(6*uik3 - 125*uik*r2 -5*uik*sk2 + 60*(uik2*r+r3-r*sk2))/uik13;\n- irep = 2*ah*rmixh7*term;\n-\n- de += mask2*(ah*rmixh7*M_PI*(dl+du)/(30*r2));\n- sum += mask2*(irep+idisp);\n-\n- *energy = sum;\n- de *= -AWATER*rI;\n- *force *= de;\n+ (*force).x *= AWATER * xr;\n+ (*force).y *= AWATER * yr;\n+ (*force).z *= AWATER * zr;\n }\n \n /**\n@@ -263,4 +274,4 @@ KERNEL void computeWCAForce(GLOBAL mm_ulong* RESTRICT forceBuffers, GLOBAL mixed\n pos++;\n } while (pos < end);\n energyBuffer[GLOBAL_ID] -= AWATER*energy;\n-}\n\\ No newline at end of file\n+}\ndiff --git a/plugins/amoeba/platforms/reference/src/AmoebaReferenceKernels.cpp b/plugins/amoeba/platforms/reference/src/AmoebaReferenceKernels.cpp\nindex f2ce6e8c41..af2c258705 100644\n--- a/plugins/amoeba/platforms/reference/src/AmoebaReferenceKernels.cpp\n+++ b/plugins/amoeba/platforms/reference/src/AmoebaReferenceKernels.cpp\n@@ -294,19 +294,18 @@ AmoebaReferenceMultipoleForce* ReferenceCalcAmoebaMultipoleForceKernel::setupAmo\n amoebaReferenceGeneralizedKirkwoodForce->setSurfaceAreaFactor(gkKernel->getSurfaceAreaFactor());\n amoebaReferenceGeneralizedKirkwoodForce->setIncludeCavityTerm(gkKernel->getIncludeCavityTerm());\n amoebaReferenceGeneralizedKirkwoodForce->setDirectPolarization(gkKernel->getDirectPolarization());\n-\n- vector<double> parameters; \n- gkKernel->getAtomicRadii(parameters);\n- amoebaReferenceGeneralizedKirkwoodForce->setAtomicRadii(parameters);\n-\n- gkKernel->getScaleFactors(parameters);\n- amoebaReferenceGeneralizedKirkwoodForce->setScaleFactors(parameters);\n-\n- gkKernel->getCharges(parameters);\n- amoebaReferenceGeneralizedKirkwoodForce->setCharges(parameters);\n+ amoebaReferenceGeneralizedKirkwoodForce->setTanhRescaling(gkKernel->getTanhRescaling());\n+ double beta0, beta1, beta2;\n+ gkKernel->getTanhParameters(beta0, beta1, beta2);\n+ amoebaReferenceGeneralizedKirkwoodForce->setTanhParameters(beta0, beta1, beta2);\n+ amoebaReferenceGeneralizedKirkwoodForce->setDescreenOffset(gkKernel->getDescreenOffset());\n+ amoebaReferenceGeneralizedKirkwoodForce->setAtomicRadii(gkKernel->getAtomicRadii());\n+ amoebaReferenceGeneralizedKirkwoodForce->setScaleFactors(gkKernel->getScaleFactors());\n+ amoebaReferenceGeneralizedKirkwoodForce->setCharges(gkKernel->getCharges());\n+ amoebaReferenceGeneralizedKirkwoodForce->setDescreenRadii(gkKernel->getDescreenRadii());\n+ amoebaReferenceGeneralizedKirkwoodForce->setNeckFactors(gkKernel->getNeckFactors());\n \n // calculate Grycuk Born radii\n-\n vector<Vec3>& posData = extractPositions(context);\n amoebaReferenceGeneralizedKirkwoodForce->calculateGrycukBornRadii(posData);\n \n@@ -534,6 +533,20 @@ int ReferenceCalcAmoebaGeneralizedKirkwoodForceKernel::getIncludeCavityTerm() co\n return includeCavityTerm;\n }\n \n+bool ReferenceCalcAmoebaGeneralizedKirkwoodForceKernel::getTanhRescaling() const {\n+ return tanhRescaling;\n+}\n+\n+void ReferenceCalcAmoebaGeneralizedKirkwoodForceKernel::getTanhParameters(double &b0, double &b1, double &b2) const {\n+ b0 = beta0;\n+ b1 = beta1;\n+ b2 = beta2;\n+}\n+\n+double ReferenceCalcAmoebaGeneralizedKirkwoodForceKernel::getDescreenOffset() const {\n+ return descreenOffset;\n+}\n+\n int ReferenceCalcAmoebaGeneralizedKirkwoodForceKernel::getDirectPolarization() const {\n return directPolarization;\n }\n@@ -558,19 +571,24 @@ double ReferenceCalcAmoebaGeneralizedKirkwoodForceKernel::getSurfaceAreaFactor()\n return surfaceAreaFactor;\n }\n \n-void ReferenceCalcAmoebaGeneralizedKirkwoodForceKernel::getAtomicRadii(vector<double>& outputAtomicRadii) const {\n- outputAtomicRadii.resize(atomicRadii.size());\n- copy(atomicRadii.begin(), atomicRadii.end(), outputAtomicRadii.begin());\n+const vector<double>& ReferenceCalcAmoebaGeneralizedKirkwoodForceKernel::getAtomicRadii() const {\n+ return atomicRadii;\n+}\n+\n+const vector<double>& ReferenceCalcAmoebaGeneralizedKirkwoodForceKernel::getCharges() const {\n+ return charges;\n+}\n+\n+const vector<double>& ReferenceCalcAmoebaGeneralizedKirkwoodForceKernel::getScaleFactors() const {\n+ return scaleFactors;\n }\n \n-void ReferenceCalcAmoebaGeneralizedKirkwoodForceKernel::getScaleFactors(vector<double>& outputScaleFactors) const {\n- outputScaleFactors.resize(scaleFactors.size());\n- copy(scaleFactors.begin(), scaleFactors.end(), outputScaleFactors.begin());\n+const vector<double>& ReferenceCalcAmoebaGeneralizedKirkwoodForceKernel::getDescreenRadii() const {\n+ return descreenRadii;\n }\n \n-void ReferenceCalcAmoebaGeneralizedKirkwoodForceKernel::getCharges(vector<double>& outputCharges) const {\n- outputCharges.resize(charges.size());\n- copy(charges.begin(), charges.end(), outputCharges.begin());\n+const vector<double>& ReferenceCalcAmoebaGeneralizedKirkwoodForceKernel::getNeckFactors() const {\n+ return neckFactors;\n }\n \n void ReferenceCalcAmoebaGeneralizedKirkwoodForceKernel::initialize(const System& system, const AmoebaGeneralizedKirkwoodForce& force) {\n@@ -593,13 +611,13 @@ void ReferenceCalcAmoebaGeneralizedKirkwoodForceKernel::initialize(const System&\n numParticles = system.getNumParticles();\n \n for (int ii = 0; ii < numParticles; ii++) {\n-\n- double particleCharge, particleRadius, scalingFactor;\n- force.getParticleParameters(ii, particleCharge, particleRadius, scalingFactor);\n+ double particleCharge, particleRadius, scalingFactor, descreenRadius, neckFactor;\n+ force.getParticleParameters(ii, particleCharge, particleRadius, scalingFactor, descreenRadius, neckFactor);\n atomicRadii.push_back(particleRadius);\n scaleFactors.push_back(scalingFactor);\n charges.push_back(particleCharge);\n-\n+ descreenRadii.push_back(descreenRadius);\n+ neckFactors.push_back(neckFactor);\n // Make sure the charge matches the one specified by the AmoebaMultipoleForce.\n \n double charge2, thole, damping, polarity;\n@@ -610,13 +628,20 @@ void ReferenceCalcAmoebaGeneralizedKirkwoodForceKernel::initialize(const System&\n throw OpenMMException(\"AmoebaGeneralizedKirkwoodForce and AmoebaMultipoleForce must specify the same charge for every atom.\");\n }\n \n- } \n+ }\n includeCavityTerm = force.getIncludeCavityTerm();\n+ tanhRescaling = force.getTanhRescaling();\n+ double b0, b1, b2;\n+ force.getTanhParameters(b0, b1, b2);\n+ beta0 = b0;\n+ beta1 = b1;\n+ beta2 = b2;\n+ descreenOffset = force.getDescreenOffset();\n soluteDielectric = force.getSoluteDielectric();\n solventDielectric = force.getSolventDielectric();\n- dielectricOffset = 0.009;\n- probeRadius = force.getProbeRadius(), \n- surfaceAreaFactor = force.getSurfaceAreaFactor(); \n+ dielectricOffset = force.getDielectricOffset();\n+ probeRadius = force.getProbeRadius();\n+ surfaceAreaFactor = force.getSurfaceAreaFactor();\n directPolarization = amoebaMultipoleForce->getPolarizationType() == AmoebaMultipoleForce::Direct ? 1 : 0;\n }\n \n@@ -632,11 +657,13 @@ void ReferenceCalcAmoebaGeneralizedKirkwoodForceKernel::copyParametersToContext(\n // Record the values.\n \n for (int i = 0; i < numParticles; ++i) {\n- double particleCharge, particleRadius, scalingFactor;\n- force.getParticleParameters(i, particleCharge, particleRadius, scalingFactor);\n+ double particleCharge, particleRadius, scalingFactor, descreenRadius, neckFactor;\n+ force.getParticleParameters(i, particleCharge, particleRadius, scalingFactor, descreenRadius, neckFactor);\n atomicRadii[i] = particleRadius;\n scaleFactors[i] = scalingFactor;\n charges[i] = particleCharge;\n+ descreenRadii[i] = descreenRadius;\n+ neckFactors[i] = neckFactor;\n }\n }\n \ndiff --git a/plugins/amoeba/platforms/reference/src/AmoebaReferenceKernels.h b/plugins/amoeba/platforms/reference/src/AmoebaReferenceKernels.h\nindex 4fb401eeba..5c0b9f6119 100644\n--- a/plugins/amoeba/platforms/reference/src/AmoebaReferenceKernels.h\n+++ b/plugins/amoeba/platforms/reference/src/AmoebaReferenceKernels.h\n@@ -318,6 +318,25 @@ class ReferenceCalcAmoebaGeneralizedKirkwoodForceKernel : public CalcAmoebaGener\n */\n int getIncludeCavityTerm() const;\n \n+ /**\n+ * Get the 'tanh rescaling' flag.\n+ *\n+ * @return tanhRescaling\n+ */\n+ bool getTanhRescaling() const;\n+\n+ /**\n+ * Get Tanh parameters beta0, beta1 and beta2.\n+ */\n+ void getTanhParameters(double& b0, double& b1, double& b2) const;\n+\n+ /**\n+ * Get the descreen offset for computing effective Born radii.\n+ *\n+ * @return descreenOffset\n+ */\n+ double getDescreenOffset() const;\n+\n /**\n * Get the number of particles.\n *\n@@ -350,10 +369,9 @@ class ReferenceCalcAmoebaGeneralizedKirkwoodForceKernel : public CalcAmoebaGener\n double getSolventDielectric() const;\n \n /**\n- * Get the dielectric offset.\n+ * Get the dielectric offset for the cavity term.\n *\n * @return dielectricOffset\n- *\n */\n double getDielectricOffset() const;\n \n@@ -375,27 +393,28 @@ class ReferenceCalcAmoebaGeneralizedKirkwoodForceKernel : public CalcAmoebaGener\n \n /**\n * Get the vector of particle radii.\n- *\n- * @param atomicRadii vector of atomic radii\n- *\n */\n- void getAtomicRadii(std::vector<double>& atomicRadii) const;\n+ const vector<double>& getAtomicRadii() const;\n \n /**\n * Get the vector of scale factors.\n- *\n- * @param scaleFactors vector of scale factors\n- *\n */\n- void getScaleFactors(std::vector<double>& scaleFactors) const;\n+ const vector<double>& getScaleFactors() const;\n \n /**\n * Get the vector of charges.\n- *\n- * @param charges vector of charges\n- *\n */\n- void getCharges(std::vector<double>& charges) const;\n+ const vector<double>& getCharges() const;\n+\n+ /**\n+ * Get the vector of descreening radii.\n+ */\n+ const vector<double>& getDescreenRadii() const;\n+\n+ /**\n+ * Get the vector of neck scaling factors.\n+ */\n+ const vector<double>& getNeckFactors() const;\n \n /**\n * Copy changed parameters over to a context.\n@@ -411,12 +430,19 @@ class ReferenceCalcAmoebaGeneralizedKirkwoodForceKernel : public CalcAmoebaGener\n std::vector<double> atomicRadii;\n std::vector<double> scaleFactors;\n std::vector<double> charges;\n+ std::vector<double> descreenRadii;\n+ std::vector<double> neckFactors;\n double soluteDielectric;\n double solventDielectric;\n double dielectricOffset;\n double probeRadius;\n double surfaceAreaFactor;\n int includeCavityTerm;\n+ bool tanhRescaling;\n+ double beta0;\n+ double beta1;\n+ double beta2;\n+ double descreenOffset;\n int directPolarization;\n const System& system;\n };\ndiff --git a/plugins/amoeba/platforms/reference/src/SimTKReference/AmoebaReferenceGeneralizedKirkwoodForce.cpp b/plugins/amoeba/platforms/reference/src/SimTKReference/AmoebaReferenceGeneralizedKirkwoodForce.cpp\nindex 91ae280569..87dd1ab107 100644\n--- a/plugins/amoeba/platforms/reference/src/SimTKReference/AmoebaReferenceGeneralizedKirkwoodForce.cpp\n+++ b/plugins/amoeba/platforms/reference/src/SimTKReference/AmoebaReferenceGeneralizedKirkwoodForce.cpp\n@@ -22,20 +22,25 @@\n */\n \n #include \"AmoebaReferenceGeneralizedKirkwoodForce.h\"\n+#include \"openmm/internal/AmoebaGeneralizedKirkwoodForceImpl.h\"\n #include <cmath>\n \n using std::vector;\n using namespace OpenMM;\n \n AmoebaReferenceGeneralizedKirkwoodForce::AmoebaReferenceGeneralizedKirkwoodForce() : _numParticles(0),\n- _includeCavityTerm(1),\n- _directPolarization(0),\n- _soluteDielectric(1.0),\n- _solventDielectric(78.3),\n- _dielectricOffset(0.009),\n- _probeRadius(0.14),\n- _surfaceAreaFactor(0.0054) {\n-\n+ _includeCavityTerm(1),\n+ _directPolarization(0),\n+ _soluteDielectric(1.0),\n+ _solventDielectric(78.3),\n+ _dielectricOffset(0.009),\n+ _probeRadius(0.14),\n+ _surfaceAreaFactor(0.0054),\n+ _tanhRescaling(false),\n+ _beta0(0.9563),\n+ _beta1(0.2578),\n+ _beta2(0.0810),\n+ _descreenOffset(0.0) {\n }\n \n void AmoebaReferenceGeneralizedKirkwoodForce::setNumParticles(int numParticles) {\n@@ -54,6 +59,41 @@ int AmoebaReferenceGeneralizedKirkwoodForce::getIncludeCavityTerm() const {\n return _includeCavityTerm;\n }\n \n+void AmoebaReferenceGeneralizedKirkwoodForce::setTanhRescaling(bool tanhRescaling) {\n+ _tanhRescaling = tanhRescaling;\n+}\n+\n+bool AmoebaReferenceGeneralizedKirkwoodForce::getTanhRescaling() const {\n+ return _tanhRescaling;\n+}\n+\n+/**\n+ * Get Tanh parameters beta0, beta1 and beta2.\n+ */\n+void AmoebaReferenceGeneralizedKirkwoodForce::getTanhParameters(double& b0, double& b1, double& b2) const {\n+ b0 = _beta0;\n+ b1 = _beta1;\n+ b2 = _beta2;\n+}\n+\n+/**\n+ * Set the flag signaling whether the solute integral is rescaled by a Tanh function\n+ * to account for interstitial spaces.\n+*/\n+void AmoebaReferenceGeneralizedKirkwoodForce::setTanhParameters(double b0, double b1, double b2) {\n+ _beta0 = b0;\n+ _beta1 = b1;\n+ _beta2 = b2;\n+}\n+\n+void AmoebaReferenceGeneralizedKirkwoodForce::setDescreenOffset(double descreenOffset) {\n+ _descreenOffset = descreenOffset;\n+}\n+\n+double AmoebaReferenceGeneralizedKirkwoodForce::getDescreenOffset() const {\n+ return _descreenOffset;\n+}\n+\n void AmoebaReferenceGeneralizedKirkwoodForce::setDirectPolarization(int directPolarization) {\n _directPolarization = directPolarization;\n }\n@@ -127,77 +167,145 @@ void AmoebaReferenceGeneralizedKirkwoodForce::setCharges(const vector<double>& c\n copy(charges.begin(), charges.end(), _charges.begin());\n }\n \n+void AmoebaReferenceGeneralizedKirkwoodForce::setDescreenRadii(const vector<double> &descreenRadii) {\n+ _descreenRadii.resize(descreenRadii.size());\n+ copy(descreenRadii.begin(), descreenRadii.end(), _descreenRadii.begin());\n+}\n+\n+void AmoebaReferenceGeneralizedKirkwoodForce::getDescreenRadii(vector<double> &descreenRadii) const {\n+ descreenRadii.resize(_atomicRadii.size());\n+ copy(_descreenRadii.begin(), _descreenRadii.end(), descreenRadii.begin());\n+}\n+\n+void AmoebaReferenceGeneralizedKirkwoodForce::setNeckFactors(const vector<double> &neckFactors) {\n+ _neckFactors.resize(neckFactors.size());\n+ copy(neckFactors.begin(), neckFactors.end(), _neckFactors.begin());\n+}\n+\n+void AmoebaReferenceGeneralizedKirkwoodForce::getNeckFactors(vector<double> &neckFactors) const {\n+ neckFactors.resize(_neckFactors.size());\n+ copy(_neckFactors.begin(), _neckFactors.end(), neckFactors.begin());\n+}\n+\n void AmoebaReferenceGeneralizedKirkwoodForce::getGrycukBornRadii(vector<double>& bornRadii) const {\n bornRadii.resize(_bornRadii.size());\n copy(_bornRadii.begin(), _bornRadii.end(), bornRadii.begin());\n }\n \n-void AmoebaReferenceGeneralizedKirkwoodForce::calculateGrycukBornRadii(const vector<Vec3>& particlePositions) {\n+void AmoebaReferenceGeneralizedKirkwoodForce::getSoluteIntegral(vector<double> &soluteIntegral) const {\n+ soluteIntegral.resize(_soluteIntegral.size());\n+ copy(_soluteIntegral.begin(), _soluteIntegral.end(), soluteIntegral.begin());\n+}\n \n- const double bigRadius = 1000.0;\n+void AmoebaReferenceGeneralizedKirkwoodForce::calculateGrycukBornRadii(const vector<Vec3> &particlePositions) {\n+\n+ // Set the radius to 30 Angstroms (3 nm) if either the base radius is zero, or the\n+ // descreening integral is negative.\n+ const double MAX_RADIUS = 3.0;\n+ const double RECIP_MAX_RADIUS3 = pow(MAX_RADIUS, -3.0);\n+ const double PI4_3 = 4.0 / 3.0 * M_PI;\n+ const double INVERSE_PI4_3 = 1.0 / PI4_3;\n+ const double ONE_THIRD = 1.0 / 3.0;\n \n _bornRadii.resize(_numParticles);\n+ _soluteIntegral.resize(_numParticles);\n+\n for (unsigned int ii = 0; ii < _numParticles; ii++) {\n \n if (_atomicRadii[ii] <= 0.0) {\n- _bornRadii[ii] = bigRadius;\n+ _bornRadii[ii] = MAX_RADIUS;\n continue;\n }\n \n+ double integralStartI = max(_atomicRadii[ii], _descreenRadii[ii]) + _descreenOffset;\n+\n double bornSum = 0.0;\n+ double neckSum = 0.0;\n for (unsigned int jj = 0; jj < _numParticles; jj++) {\n \n- if (ii == jj || _atomicRadii[jj] < 0.0)continue;\n- \n- double xr = particlePositions[jj][0] - particlePositions[ii][0];\n- double yr = particlePositions[jj][1] - particlePositions[ii][1];\n- double zr = particlePositions[jj][2] - particlePositions[ii][2];\n+ double sk = _descreenRadii[jj] * _scaleFactors[jj];\n+\n+ if (ii == jj || integralStartI <= 0.0 || sk <= 0.0) continue;\n \n- double r2 = xr*xr + yr*yr + zr*zr;\n- double r = sqrt(r2);\n+ double xr = particlePositions[jj][0] - particlePositions[ii][0];\n+ double yr = particlePositions[jj][1] - particlePositions[ii][1];\n+ double zr = particlePositions[jj][2] - particlePositions[ii][2];\n \n- double sk = _atomicRadii[jj]*_scaleFactors[jj];\n+ double r2 = xr * xr + yr * yr + zr * zr;\n+ double r = sqrt(r2);\n \n // If atom ii engulfs the descreening atom, then continue.\n- if (_atomicRadii[ii] > r + sk) continue;\n-\n- double sk2 = sk*sk;\n-\n- if ((_atomicRadii[ii] + r) < sk) {\n- double lik = _atomicRadii[ii];\n- double uik = sk - r; \n- double lik3 = lik*lik*lik;\n- double uik3 = uik*uik*uik;\n- bornSum -= (1.0/uik3 - 1.0/lik3);\n- } \n- \n- double uik = r + sk; \n+ if (integralStartI > r + sk) continue;\n+\n+ double sk2 = sk * sk;\n+\n+ if ((integralStartI + r) < sk) {\n+ double lik = integralStartI;\n+ double uik = sk - r;\n+ double lik3 = lik * lik * lik;\n+ double uik3 = uik * uik * uik;\n+ bornSum -= (1.0 / uik3 - 1.0 / lik3);\n+ }\n+\n+ double uik = r + sk;\n double lik;\n- if ((_atomicRadii[ii] + r) < sk) {\n- lik = sk - r; \n- } else if (r < (_atomicRadii[ii] + sk)) {\n- lik = _atomicRadii[ii];\n+ if ((integralStartI + r) < sk) {\n+ lik = sk - r;\n+ } else if (r < (integralStartI + sk)) {\n+ lik = integralStartI;\n } else {\n- lik = r - sk; \n- } \n- \n- double l2 = lik*lik; \n- double l4 = l2*l2;\n- double lr = lik*r;\n- double l4r = l4*r;\n- \n- double u2 = uik*uik;\n- double u4 = u2*u2;\n- double ur = uik*r;\n- double u4r = u4*r;\n- \n- double term = (3.0*(r2-sk2) + 6.0*u2 - 8.0*ur)/u4r - (3.0*(r2-sk2) + 6.0*l2 - 8.0*lr)/l4r;\n- bornSum += term/16.0;\n- \n+ lik = r - sk;\n+ }\n+\n+ double l2 = lik * lik;\n+ double l4 = l2 * l2;\n+ double lr = lik * r;\n+ double l4r = l4 * r;\n+\n+ double u2 = uik * uik;\n+ double u4 = u2 * u2;\n+ double ur = uik * r;\n+ double u4r = u4 * r;\n+\n+ double term =\n+ (3.0 * (r2 - sk2) + 6.0 * u2 - 8.0 * ur) / u4r\n+ - (3.0 * (r2 - sk2) + 6.0 * l2 - 8.0 * lr) / l4r;\n+ bornSum += term / 16.0;\n+\n+ double mixedNeckScale = 0.5 * (_neckFactors[ii] + _neckFactors[jj]);\n+ if (mixedNeckScale > 0.0) {\n+ neckSum += AmoebaGeneralizedKirkwoodForceImpl::neckDescreen(r, integralStartI, _descreenRadii[jj], mixedNeckScale);\n+ }\n+ }\n+\n+ bornSum = bornSum * PI4_3 + neckSum;\n+ _soluteIntegral[ii] = bornSum;\n+\n+ double baseRadiusI3 = _atomicRadii[ii] * _atomicRadii[ii] * _atomicRadii[ii];\n+\n+ if (_tanhRescaling) {\n+ // Set up tanh function components\n+ double rhoi3Psi = baseRadiusI3 * _soluteIntegral[ii];\n+ double rhoi6Psi2 = rhoi3Psi * rhoi3Psi;\n+ double rhoi9Psi3 = rhoi6Psi2 * rhoi3Psi;\n+ // If the output of the tanh function is 1.0, then the Born radius will be MaxBornRadius\n+ double tanh_constant = PI4_3 * ((1.0 / baseRadiusI3) - RECIP_MAX_RADIUS3);\n+ bornSum = tanh_constant * tanh(_beta0 * rhoi3Psi - _beta1 * rhoi6Psi2 + _beta2 * rhoi9Psi3);\n+ }\n+\n+ bornSum = PI4_3 / baseRadiusI3 - bornSum;\n+\n+ _bornRadii[ii] = (bornSum <= 0.0) ? MAX_RADIUS : pow(INVERSE_PI4_3 * bornSum, -ONE_THIRD);\n+\n+ // Born radius must be at least as large as its base radius.\n+ if (_bornRadii[ii] < _atomicRadii[ii]) {\n+ _bornRadii[ii] = _atomicRadii[ii];\n+ }\n+\n+ // Maximum Born radius is 30.0 Angstroms.\n+ if (_bornRadii[ii] > MAX_RADIUS) {\n+ _bornRadii[ii] = MAX_RADIUS;\n }\n- bornSum = 1.0/(_atomicRadii[ii]*_atomicRadii[ii]*_atomicRadii[ii]) - bornSum;\n- _bornRadii[ii] = (bornSum <= 0.0) ? bigRadius : pow(bornSum, -1.0/3.0);\n }\n \n- return;\n }\ndiff --git a/plugins/amoeba/platforms/reference/src/SimTKReference/AmoebaReferenceGeneralizedKirkwoodForce.h b/plugins/amoeba/platforms/reference/src/SimTKReference/AmoebaReferenceGeneralizedKirkwoodForce.h\nindex 8debaaf2b0..70a36ffff3 100644\n--- a/plugins/amoeba/platforms/reference/src/SimTKReference/AmoebaReferenceGeneralizedKirkwoodForce.h\n+++ b/plugins/amoeba/platforms/reference/src/SimTKReference/AmoebaReferenceGeneralizedKirkwoodForce.h\n@@ -81,6 +81,53 @@ class AmoebaReferenceGeneralizedKirkwoodForce {\n */\n void setIncludeCavityTerm(int includeCavityTerm);\n \n+ /**\n+ * Get the tanhRescaling flag, which controls whether tanh rescaling of the solute integral is performed.\n+ *\n+ * @return tanhRescaling The value tanhRescaling flag.\n+ */\n+ bool getTanhRescaling() const;\n+\n+ /**\n+ * Set the tanhRescaling flag.\n+ *\n+ * @param tanhRescaling if true, tanh rescaling of the solute integral is performed.\n+ */\n+ void setTanhRescaling(bool tanhRescaling);\n+\n+ /**\n+ * Get Tanh parameters b0, b1 and b2.\n+ *\n+ * @param b0 The first tanh parameter.\n+ * @param b1 The second tanh parameter.\n+ * @param b2 The third tanh parameter.\n+ */\n+ void getTanhParameters(double& b0, double& b1, double& b2) const;\n+\n+ /**\n+ * Set the the Tanh function parameters that account for interstitial spaces.\n+ *\n+ * @param b0 The first tanh parameter.\n+ * @param b1 The second tanh parameter.\n+ * @param b2 The third tanh parameter.\n+ */\n+ void setTanhParameters(double b0, double b1, double b2);\n+\n+ /**\n+ * Get the descreen offset for calculating Born radii.\n+ *\n+ * @return descreenOffset\n+ */\n+ double getDescreenOffset() const;\n+\n+ /**\n+ * Set descreen offset for calculating Born radii.\n+ *\n+ * @param descreenOffset descreen offset\n+ *\n+ */\n+ void setDescreenOffset(double descreenOffset);\n+\n /**\n * Get directPolarization flag \n *\n@@ -128,7 +175,7 @@ class AmoebaReferenceGeneralizedKirkwoodForce {\n void setSolventDielectric(double solventDielectric);\n \n /**\n- * Get dielectric offset\n+ * Get dielectric offset for the cavity term.\n *\n * @return dielectricOffset\n *\n@@ -136,7 +183,7 @@ class AmoebaReferenceGeneralizedKirkwoodForce {\n double getDielectricOffset() const;\n \n /**\n- * Set dielectric offset\n+ * Set dielectric offset for the cavity term.\n *\n * @param dielectricOffset dielectric offset\n *\n@@ -215,6 +262,36 @@ class AmoebaReferenceGeneralizedKirkwoodForce {\n */\n void setCharges(const vector<double>& charges);\n \n+ /**\n+ * Set descreen radii\n+ *\n+ * @param descreenRadii input vector of descreen radii\n+ *\n+ */\n+ void setDescreenRadii(const vector<double>& descreenRadii);\n+\n+ /**\n+ * Get descreen radii\n+ *\n+ * @param descreenRadii output vector of descreen radii\n+ *\n+ */\n+ void getDescreenRadii(vector<double>& descreenRadii) const;\n+\n+ /**\n+ * Set neck scale factors\n+ *\n+ * @param neckFactors input vector of neck scale factors\n+ */\n+ void setNeckFactors(const vector<double>& neckFactors);\n+\n+ /**\n+ * Get neck scale factors\n+ *\n+ * @param neckFactors output vector of neck scale factors\n+ */\n+ void getNeckFactors(vector<double>& neckFactors) const;\n+\n /**\n * Calculate Grycuk Born radii\n *\n@@ -229,13 +306,23 @@ class AmoebaReferenceGeneralizedKirkwoodForce {\n * @param bornRadii vector of Born radii\n *\n */\n- void getGrycukBornRadii(vector<double>& bornRadii) const; \n+ void getGrycukBornRadii(vector<double>& bornRadii) const;\n+\n+ /**\n+ * Get Grycik Solute Integral (must have called calculateGrycukBornRadii())\n+ *\n+ * @param bornRadii vector of Born radii\n+ *\n+ */\n+ void getSoluteIntegral(vector<double>& soluteIntegral) const;\n \n private:\n \n int _numParticles;\n int _includeCavityTerm;\n int _directPolarization;\n+ bool _tanhRescaling;\n+ double _descreenOffset;\n \n double _soluteDielectric;\n double _solventDielectric;\n@@ -243,10 +330,17 @@ class AmoebaReferenceGeneralizedKirkwoodForce {\n double _probeRadius;\n double _surfaceAreaFactor;\n \n+ double _beta0;\n+ double _beta1;\n+ double _beta2;\n+\n std::vector<double> _atomicRadii;\n std::vector<double> _scaleFactors;\n std::vector<double> _charges;\n+ std::vector<double> _descreenRadii;\n+ std::vector<double> _neckFactors;\n \n+ std::vector<double> _soluteIntegral;\n std::vector<double> _bornRadii;\n \n };\ndiff --git a/plugins/amoeba/platforms/reference/src/SimTKReference/AmoebaReferenceMultipoleForce.cpp b/plugins/amoeba/platforms/reference/src/SimTKReference/AmoebaReferenceMultipoleForce.cpp\nindex a464d2b8e0..3e333b534a 100644\n--- a/plugins/amoeba/platforms/reference/src/SimTKReference/AmoebaReferenceMultipoleForce.cpp\n+++ b/plugins/amoeba/platforms/reference/src/SimTKReference/AmoebaReferenceMultipoleForce.cpp\n@@ -23,6 +23,7 @@\n */\n \n #include \"AmoebaReferenceMultipoleForce.h\"\n+#include \"openmm/internal/AmoebaGeneralizedKirkwoodForceImpl.h\"\n #include \"SimTKOpenMMRealType.h\"\n #include \"jama_svd.h\"\n #include <algorithm>\n@@ -35,6 +36,7 @@\n // make sure that erf() and erfc() are defined.\n #include \"openmm/internal/MSVC_erfc.h\"\n \n+\n using std::vector;\n using namespace OpenMM;\n \n@@ -2117,8 +2119,7 @@ AmoebaReferenceMultipoleForce::UpdateInducedDipoleFieldStruct::UpdateInducedDipo\n AmoebaReferenceGeneralizedKirkwoodMultipoleForce::AmoebaReferenceGeneralizedKirkwoodMultipoleForce(AmoebaReferenceGeneralizedKirkwoodForce* amoebaReferenceGeneralizedKirkwoodForce) :\n AmoebaReferenceMultipoleForce(NoCutoff),\n _amoebaReferenceGeneralizedKirkwoodForce(amoebaReferenceGeneralizedKirkwoodForce),\n- _gkc(2.455)\n-{\n+ _gkc(2.455), _beta0(0.9563), _beta1(0.2578), _beta2(0.0810) {\n \n double solventDielectric = _amoebaReferenceGeneralizedKirkwoodForce->getSolventDielectric();\n \n@@ -2127,17 +2128,19 @@ AmoebaReferenceGeneralizedKirkwoodMultipoleForce::AmoebaReferenceGeneralizedKirk\n _fq = 3.0*(1.0 - solventDielectric)/(2.0 + 3.0*solventDielectric);\n \n _amoebaReferenceGeneralizedKirkwoodForce->getGrycukBornRadii(_bornRadii);\n+ _amoebaReferenceGeneralizedKirkwoodForce->getSoluteIntegral(_soluteIntegral);\n _amoebaReferenceGeneralizedKirkwoodForce->getAtomicRadii(_atomicRadii);\n- _amoebaReferenceGeneralizedKirkwoodForce->getScaleFactors(_scaledRadii);\n-\n- _includeCavityTerm = _amoebaReferenceGeneralizedKirkwoodForce->getIncludeCavityTerm();\n- _probeRadius = _amoebaReferenceGeneralizedKirkwoodForce->getProbeRadius();\n- _surfaceAreaFactor = _amoebaReferenceGeneralizedKirkwoodForce->getSurfaceAreaFactor();\n- _dielectricOffset = _amoebaReferenceGeneralizedKirkwoodForce->getDielectricOffset();\n-\n- for (unsigned int ii = 0; ii < _scaledRadii.size(); ii++) {\n- _scaledRadii[ii] *= _atomicRadii[ii];\n- }\n+ _amoebaReferenceGeneralizedKirkwoodForce->getScaleFactors(_scaleFactors);\n+ _amoebaReferenceGeneralizedKirkwoodForce->getDescreenRadii(_descreenRadii);\n+ _amoebaReferenceGeneralizedKirkwoodForce->getNeckFactors(_neckFactors);\n+\n+ _includeCavityTerm = _amoebaReferenceGeneralizedKirkwoodForce->getIncludeCavityTerm();\n+ _probeRadius = _amoebaReferenceGeneralizedKirkwoodForce->getProbeRadius();\n+ _surfaceAreaFactor = _amoebaReferenceGeneralizedKirkwoodForce->getSurfaceAreaFactor();\n+ _dielectricOffset = _amoebaReferenceGeneralizedKirkwoodForce->getDielectricOffset();\n+ _tanhRescaling = _amoebaReferenceGeneralizedKirkwoodForce->getTanhRescaling();\n+ _amoebaReferenceGeneralizedKirkwoodForce->getTanhParameters(_beta0, _beta1, _beta2);\n+ _descreenOffset = _amoebaReferenceGeneralizedKirkwoodForce->getDescreenOffset();\n }\n \n AmoebaReferenceGeneralizedKirkwoodMultipoleForce::~AmoebaReferenceGeneralizedKirkwoodMultipoleForce()\n@@ -2165,6 +2168,12 @@ double AmoebaReferenceGeneralizedKirkwoodMultipoleForce::getDielectricOffset() c\n return _dielectricOffset;\n };\n \n+double AmoebaReferenceGeneralizedKirkwoodMultipoleForce::getDescreenOffset() const\n+{\n+ return _descreenOffset;\n+};\n+\n+\n void AmoebaReferenceGeneralizedKirkwoodMultipoleForce::zeroFixedMultipoleFields()\n {\n this->AmoebaReferenceMultipoleForce::zeroFixedMultipoleFields();\n@@ -4060,67 +4069,125 @@ double AmoebaReferenceGeneralizedKirkwoodMultipoleForce::calculateElectrostatic(\n return energy;\n }\n \n-void AmoebaReferenceGeneralizedKirkwoodMultipoleForce::calculateGrycukChainRulePairIxn(const MultipoleParticleData& particleI, const MultipoleParticleData& particleJ,\n- const vector<double>& dBorn, vector<Vec3>& forces) const\n-{\n- unsigned int iIndex = particleI.particleIndex;\n- unsigned int jIndex = particleJ.particleIndex;\n+static double neckDescreenDerivative(double r, double radius, double radiusK, double sneck) {\n+ // Radius of water in nm.\n+ double radiusWater = 0.14;\n+\n+ if (r > radius + radiusK + 2 * radiusWater) {\n+ return 0.0;\n+ }\n \n- double pi43 = (4.0/3.0)*M_PI;\n+ // Get Aij and Bij\n+ double Aij, Bij;\n+ AmoebaGeneralizedKirkwoodForceImpl::getNeckConstants(radius, radiusK, Aij, Bij);\n+ // Use Aij and Bij to get neck value using derivative of Equation 13 from Aguilar/Onufriev 2010 paper\n+ double rMinusBij = r - Bij;\n+ double rMinusBij3 = rMinusBij * rMinusBij * rMinusBij;\n+ double rMinusBij4 = rMinusBij3 * rMinusBij;\n+ double radiiMinusr = radius + radiusK + 2.0 * radiusWater - r;\n+ double radiiMinusr3 = radiiMinusr * radiiMinusr * radiiMinusr;\n+ double radiiMinusr4 = radiiMinusr3 * radiiMinusr;\n+\n+ double PI4_3 = 4.0 * M_PI / 3.0;\n+ return 4.0 * PI4_3 * (sneck * Aij * rMinusBij3 * radiiMinusr4 - sneck * Aij * rMinusBij4 * radiiMinusr3);\n+}\n+\n+void AmoebaReferenceGeneralizedKirkwoodMultipoleForce::calculateGrycukChainRulePairIxn(\n+ const MultipoleParticleData &particleI, const MultipoleParticleData &particleJ,\n+ const vector<double> &dBorn, vector<Vec3> &forces) const {\n+ unsigned int iIndex = particleI.particleIndex;\n+ unsigned int jIndex = particleJ.particleIndex;\n+\n+ if (iIndex == jIndex) return;\n+\n+ double bornRadiusI = _bornRadii[iIndex];\n+\n+ const double bigRadius = 3.0;\n+ if (bornRadiusI >= bigRadius) return;\n+\n+ double third = 1.0 / 3.0;\n+ double pi43 = 4.0 * third * M_PI;\n \n double lik, uik;\n double lik4, uik4;\n- double factor = -pow(M_PI, (1.0/3.0))*pow(6.0,(2.0/3.0))/9.0;\n- double term = pi43/(_bornRadii[iIndex]*_bornRadii[iIndex]*_bornRadii[iIndex]);\n- term = factor/pow(term, (4.0/3.0));\n-\n- Vec3 deltaR = particleJ.position - particleI.position;\n+ double factor = -pow(M_PI, third) * pow(6.0, 2.0 * third) / 9.0;\n+ double term = pi43 / (_bornRadii[iIndex] * _bornRadii[iIndex] * _bornRadii[iIndex]);\n+ term = factor / pow(term, 4.0 * third);\n+ if (_tanhRescaling) {\n+ double rhoi = _atomicRadii[iIndex];\n+ double rhoi3 = rhoi * rhoi * rhoi;\n+ double rhoi3Psi = rhoi3 * _soluteIntegral[iIndex];\n+ double rhoi6Psi2 = rhoi3Psi * rhoi3Psi;\n+ double rhoi9Psi3 = rhoi6Psi2 * rhoi3Psi;\n+ double rhoi6Psi = rhoi3 * rhoi3 * _soluteIntegral[iIndex];\n+ double rhoi9Psi2 = rhoi6Psi2 * rhoi3;\n+ double tanhTerm = tanh(_beta0 * rhoi3Psi - _beta1 * rhoi6Psi2 + _beta2 * rhoi9Psi3);\n+ double tanh2 = tanhTerm * tanhTerm;\n+ double chainRuleTerm = _beta0 * rhoi3 - 2.0 * _beta1 * rhoi6Psi + 3.0 * _beta2 * rhoi9Psi2;\n+ double recipBigRad = 1.0 / bigRadius;\n+ double recipBigRad3 = recipBigRad * recipBigRad * recipBigRad;\n+ double tanh_constant = pi43 * ((1.0 / rhoi3) - recipBigRad3);\n+ term = term * tanh_constant * chainRuleTerm * (1.0 - tanh2);\n+ }\n \n- double sk = _scaledRadii[jIndex];\n- double sk2 = sk*sk;\n- double r2 = deltaR.dot(deltaR);\n- double r = sqrt(r2);\n- double de = 0.0;\n+ Vec3 deltaR = particleJ.position - particleI.position;\n+ double sk = _scaleFactors[jIndex] * _descreenRadii[jIndex];\n+ if (sk <= 0.0) return;\n+ double sk2 = sk * sk;\n+ double r2 = deltaR.dot(deltaR);\n+ double r = sqrt(r2);\n+ double de = 0.0;\n \n- // If atom index engulfs the descreening atom, then there is no descreening. \n- if (_atomicRadii[iIndex] > r + sk) return;\n+ double baseRadiusI = max(_atomicRadii[iIndex], _descreenRadii[iIndex]) + _descreenOffset;\n+ // If atom index engulfs the descreening atom, then there is no descreening.\n+ if (baseRadiusI > r + sk) return;\n \n- if ((_atomicRadii[iIndex] + r) < sk) {\n+ if ((baseRadiusI + r) < sk) {\n double uik4;\n- uik = sk - r;\n- uik4 = uik*uik;\n- uik4 = uik4*uik4;\n- de = -4.0*M_PI/uik4;\n+ uik = sk - r;\n+ uik4 = uik * uik;\n+ uik4 = uik4 * uik4;\n+ de = -4.0 * M_PI / uik4;\n }\n \n- if ((_atomicRadii[iIndex] + r) < sk) {\n- lik = sk - r;\n- lik4 = lik*lik;\n- lik4 = lik4*lik4;\n- de += 0.25*M_PI*(sk2-4.0*sk*r+17.0*r2)/ (r2*lik4);\n- } else if (r < (_atomicRadii[iIndex] +sk)) {\n- lik = _atomicRadii[iIndex];\n- lik4 = lik*lik;\n- lik4 = lik4*lik4;\n- de += 0.25*M_PI*(2.0*_atomicRadii[iIndex]*_atomicRadii[iIndex]-sk2-r2)/ (r2*lik4);\n+ if ((baseRadiusI + r) < sk) {\n+ lik = sk - r;\n+ lik4 = lik * lik;\n+ lik4 = lik4 * lik4;\n+ de += 0.25 * M_PI * (sk2 - 4.0 * sk * r + 17.0 * r2) / (r2 * lik4);\n+ } else if (r < (baseRadiusI + sk)) {\n+ lik = baseRadiusI;\n+ lik4 = lik * lik;\n+ lik4 = lik4 * lik4;\n+ de += 0.25 * M_PI * (2.0 * baseRadiusI * baseRadiusI - sk2 - r2) / (r2 * lik4);\n } else {\n- lik = r - sk;\n- lik4 = lik*lik;\n- lik4 = lik4*lik4;\n- de += 0.25*M_PI*(sk2-4.0*sk*r+r2)/ (r2*lik4);\n+ lik = r - sk;\n+ lik4 = lik * lik;\n+ lik4 = lik4 * lik4;\n+ de += 0.25 * M_PI * (sk2 - 4.0 * sk * r + r2) / (r2 * lik4);\n+ }\n+ uik = r + sk;\n+ uik4 = uik * uik;\n+ uik4 = uik4 * uik4;\n+\n+ de -= 0.25 * M_PI * (sk2 + 4.0 * sk * r + r2) / (r2 * uik4);\n+\n+ double mixedNeckScale = 0.5 * (_neckFactors[iIndex] + _neckFactors[jIndex]);\n+ if (mixedNeckScale > 0.0) {\n+ de += neckDescreenDerivative(r, baseRadiusI, _descreenRadii[jIndex], mixedNeckScale);\n }\n- uik = r + sk;\n- uik4 = uik*uik;\n- uik4 = uik4*uik4;\n \n- de -= 0.25*M_PI*(sk2+4.0*sk*r+r2)/ (r2*uik4);\n- double dbr = term*de/r;\n- de = dbr*dBorn[iIndex];\n+ double dbr = term * de / r;\n+ de = dbr * dBorn[iIndex];\n+\n+ forces[iIndex] -= deltaR * de;\n+ forces[jIndex] += deltaR * de;\n \n- forces[iIndex] -= deltaR*de;\n- forces[jIndex] += deltaR*de;\n }\n \n+\n+\n+\n double AmoebaReferenceGeneralizedKirkwoodMultipoleForce::calculateCavityTermEnergyAndForces(vector<double>& dBorn) const\n {\n \ndiff --git a/plugins/amoeba/platforms/reference/src/SimTKReference/AmoebaReferenceMultipoleForce.h b/plugins/amoeba/platforms/reference/src/SimTKReference/AmoebaReferenceMultipoleForce.h\nindex 8ef6393282..1f1a92541d 100644\n--- a/plugins/amoeba/platforms/reference/src/SimTKReference/AmoebaReferenceMultipoleForce.h\n+++ b/plugins/amoeba/platforms/reference/src/SimTKReference/AmoebaReferenceMultipoleForce.h\n@@ -1239,10 +1239,16 @@ class AmoebaReferenceGeneralizedKirkwoodMultipoleForce : public AmoebaReferenceM\n * Get dielectric offset.\n *\n * @return dielectric offset\n- *\n */\n double getDielectricOffset() const;\n \n+ /**\n+ * Get the descreen offset.\n+ *\n+ * @return descreen offset.\n+ */\n+ double getDescreenOffset() const;\n+\n private:\n \n AmoebaReferenceGeneralizedKirkwoodForce* _amoebaReferenceGeneralizedKirkwoodForce;\n@@ -1252,10 +1258,17 @@ class AmoebaReferenceGeneralizedKirkwoodMultipoleForce : public AmoebaReferenceM\n double _fd;\n double _fq;\n \n+ double _beta0;\n+ double _beta1;\n+ double _beta2;\n+\n std::vector<double> _atomicRadii;\n- std::vector<double> _scaledRadii;\n+ std::vector<double> _scaleFactors;\n+ std::vector<double> _descreenRadii;\n+ std::vector<double> _neckFactors;\n+\n std::vector<double> _bornRadii;\n- std::vector<double> _bornForce;\n+ std::vector<double> _soluteIntegral;\n \n std::vector<Vec3> _gkField;\n std::vector<Vec3> _inducedDipoleS;\n@@ -1269,6 +1282,8 @@ class AmoebaReferenceGeneralizedKirkwoodMultipoleForce : public AmoebaReferenceM\n double _probeRadius;\n double _surfaceAreaFactor;\n double _dielectricOffset;\n+ double _tanhRescaling;\n+ double _descreenOffset;\n \n /**\n * Zero fixed multipole fields.\ndiff --git a/plugins/amoeba/platforms/reference/src/SimTKReference/AmoebaReferenceVdwForce.cpp b/plugins/amoeba/platforms/reference/src/SimTKReference/AmoebaReferenceVdwForce.cpp\nindex 8e8d2b7308..4141a7fcff 100644\n--- a/plugins/amoeba/platforms/reference/src/SimTKReference/AmoebaReferenceVdwForce.cpp\n+++ b/plugins/amoeba/platforms/reference/src/SimTKReference/AmoebaReferenceVdwForce.cpp\n@@ -49,6 +49,7 @@ void AmoebaReferenceVdwForce::initialize(const AmoebaVdwForce& force) {\n int numParticles = force.getNumParticles();\n indexIVs.resize(numParticles);\n reductions.resize(numParticles);\n+ scaleFactors.resize(numParticles);\n isAlchemical.resize(numParticles);\n allExclusions.clear();\n allExclusions.resize(numParticles);\n@@ -57,7 +58,7 @@ void AmoebaReferenceVdwForce::initialize(const AmoebaVdwForce& force) {\n double sigma, epsilon;\n bool alchemical;\n vector<int> exclusions;\n- force.getParticleParameters(i, indexIVs[i], sigma, epsilon, reductions[i], alchemical, type);\n+ force.getParticleParameters(i, indexIVs[i], sigma, epsilon, reductions[i], alchemical, type, scaleFactors[i]);\n isAlchemical[i] = alchemical;\n force.getParticleExclusions(i, exclusions);\n for (unsigned int j = 0; j < exclusions.size(); j++)\n@@ -224,6 +225,9 @@ double AmoebaReferenceVdwForce::calculateForceAndEnergy(int numParticles, double\n double combinedEpsilon = epsilonMatrix[particleType[ii]][particleType[jj]];\n double softcore = 0.0;\n \n+ // Apply per particle scale factors (for CpHMD).\n+ combinedEpsilon *= scaleFactors[ii] * scaleFactors[jj];\n+\n if (this->_alchemicalMethod == AmoebaVdwForce::Decouple && (isAlchemicalI != isAlchemical[jj])) {\n combinedEpsilon *= pow(lambda, this->_n);\n softcore = this->_alpha * pow(1.0 - lambda, 2);\n@@ -287,6 +291,9 @@ double AmoebaReferenceVdwForce::calculateForceAndEnergy(int numParticles, double\n double combinedSigma = sigmaMatrix[particleType[siteI]][particleType[siteJ]];\n double combinedEpsilon = epsilonMatrix[particleType[siteI]][particleType[siteJ]];\n \n+ // Apply per particle scale factors (for CpHMD).\n+ combinedEpsilon *= scaleFactors[siteI] * scaleFactors[siteJ];\n+\n double softcore = 0.0;\n int isAlchemicalI = isAlchemical[siteI];\n int isAlchemicalJ = isAlchemical[siteJ];\ndiff --git a/plugins/amoeba/platforms/reference/src/SimTKReference/AmoebaReferenceVdwForce.h b/plugins/amoeba/platforms/reference/src/SimTKReference/AmoebaReferenceVdwForce.h\nindex e51c799770..d14ee4aa42 100644\n--- a/plugins/amoeba/platforms/reference/src/SimTKReference/AmoebaReferenceVdwForce.h\n+++ b/plugins/amoeba/platforms/reference/src/SimTKReference/AmoebaReferenceVdwForce.h\n@@ -135,6 +135,7 @@ class AmoebaReferenceVdwForce {\n std::vector<std::vector<double> > epsilonMatrix;\n std::vector<int> indexIVs;\n std::vector<double> reductions;\n+ std::vector<double> scaleFactors;\n std::vector<bool> isAlchemical;\n std::vector<std::set<int> > allExclusions;\n Vec3 _periodicBoxVectors[3];\ndiff --git a/plugins/amoeba/platforms/reference/src/SimTKReference/AmoebaReferenceWcaDispersionForce.cpp b/plugins/amoeba/platforms/reference/src/SimTKReference/AmoebaReferenceWcaDispersionForce.cpp\nindex a3fb8c33bb..1fcd099294 100644\n--- a/plugins/amoeba/platforms/reference/src/SimTKReference/AmoebaReferenceWcaDispersionForce.cpp\n+++ b/plugins/amoeba/platforms/reference/src/SimTKReference/AmoebaReferenceWcaDispersionForce.cpp\n@@ -23,8 +23,9 @@\n */\n \n #ifdef WIN32\n- #define _USE_MATH_DEFINES // Needed to get M_PI\n+#define _USE_MATH_DEFINES // Needed to get M_PI\n #endif\n+\n #include \"AmoebaReferenceForce.h\"\n #include \"AmoebaReferenceWcaDispersionForce.h\"\n #include <cmath>\n@@ -32,280 +33,240 @@\n using std::vector;\n using namespace OpenMM;\n \n-AmoebaReferenceWcaDispersionForce::AmoebaReferenceWcaDispersionForce(double epso, double epsh, double rmino, double rminh, \n- double awater, double shctd, double dispoff, double slevy) :\n- _epso(epso), _epsh(epsh), _rmino(rmino), _rminh(rminh), _awater(awater), _shctd(shctd), _dispoff(dispoff), _slevy(slevy) {\n-} \n-\n-\n-double AmoebaReferenceWcaDispersionForce::calculatePairIxn(double radiusI, double radiusK, \n- const Vec3& particleIPosition,\n- const Vec3& particleJPosition,\n- const double* const intermediateValues,\n- Vec3& force) const {\n-\n- static const double PI = M_PI;\n-\n- double xr = particleIPosition[0] - particleJPosition[0];\n- double yr = particleIPosition[1] - particleJPosition[1];\n- double zr = particleIPosition[2] - particleJPosition[2];\n-\n- double r2 = xr*xr + yr*yr + zr*zr;\n- double r = sqrt(r2);\n- double r3 = r2*r;\n-\n- double sK = radiusK*_shctd;\n- double sK2 = sK*sK;\n-\n- double rmixo = intermediateValues[RMIXO];\n- double rmixo7 = intermediateValues[RMIXO7];\n-\n- double emixo = intermediateValues[EMIXO];\n-\n- double rmixh = intermediateValues[RMIXH];\n- double rmixh7 = intermediateValues[RMIXH7];\n-\n- double emixh = intermediateValues[EMIXH];\n-\n- double ao = intermediateValues[AO];\n- double ah = intermediateValues[AH];\n-\n- double sum = 0.0;\n- double de = 0.0;\n-\n- if (radiusI < (r + sK)) {\n-\n- double rmax = (radiusI > (r - sK)) ? radiusI : (r - sK);\n-\n- double lik = rmax;\n- double lik2 = lik*lik;\n- double lik3 = lik2*lik;\n- double lik4 = lik2*lik2;\n+AmoebaReferenceWcaDispersionForce::AmoebaReferenceWcaDispersionForce(double epso, double epsh, double rmino,\n+ double rminh, double awater, double shctd,\n+ double dispoff, double slevy) :\n+ _epso(epso), _epsh(epsh), _rmino(rmino), _rminh(rminh), _awater(awater), _shctd(shctd), _dispoff(dispoff),\n+ _slevy(slevy) {\n+}\n \n- if (lik < rmixo) { \n+static double integralBeforeRMin(double eps, double r, double r2, double sk2,\n+ double lik2, double lik3, double lik4,\n+ double uik2, double uik3, double uik4) {\n+ return -eps * (4.0e0 * M_PI / (48.0e0 * r) *\n+ (3.0e0 * (lik4 - uik4) - 8.0e0 * r * (lik3 - uik3) + 6.0e0 * (r2 - sk2) * (lik2 - uik2)));\n+}\n \n- double uik = (r + sK) < rmixo ? (r + sK) : rmixo;\n- double uik2 = uik*uik;\n- double uik3 = uik2*uik;\n- double uik4 = uik2*uik2;\n+static double\n+integralBeforeRminDerivative(double ri, double eps, double rmin, double r, double r2, double r3, double sk, double sk2,\n+ double lik, double lik2, double lik3, double uik, double uik2, double uik3) {\n+ double dl;\n+ if (ri > r - sk) {\n+ dl = (-lik2 + 2.0 * r2 + 2.0 * sk2) * lik2;\n+ } else {\n+ dl = (-lik3 + 4.0 * lik2 * r - 6.0 * lik * r2 + 2.0 * lik * sk2 + 4.0 * r3 - 4.0 * r * sk2) * lik;\n+ }\n+ double du;\n+ if (r + sk > rmin) {\n+ du = -(-uik2 + 2.0 * r2 + 2.0 * sk2) * uik2;\n+ } else {\n+ du = -(-uik3 + 4.0 * uik2 * r - 6.0 * uik * r2 + 2.0 * uik * sk2 + 4.0 * r3 - 4.0 * r * sk2) * uik;\n+ }\n+ return -eps * M_PI * (dl + du) / (4.0 * r2);\n+}\n \n- double term = 4.0*PI/(48.0*r)* (3.0*(lik4-uik4) - 8.0*r*(lik3-uik3) + 6.0*(r2-sK2)*(lik2-uik2));\n+static double integralAfterRmin(double eps, double rmin7, double r, double r2, double sk2,\n+ double lik, double lik2, double lik3, double lik4, double lik5, double lik10,\n+ double lik11, double lik12, double uik, double uik2, double uik3, double uik4,\n+ double uik5, double uik10, double uik11, double uik12) {\n+ double er7 = eps * rmin7;\n+ double term = 4.0 * M_PI / (120.0 * r * lik5 * uik5)\n+ * (15.0 * uik * lik * r * (uik4 - lik4)\n+ - 10.0 * uik2 * lik2 * (uik3 - lik3)\n+ + 6.0 * (sk2 - r2) * (uik5 - lik5));\n+ double term2 = 4.0 * M_PI / (2640.0 * r * lik12 * uik12)\n+ * (120.0 * uik * lik * r * (uik11 - lik11)\n+ - 66.0 * uik2 * lik2 * (uik10 - lik10)\n+ + 55.0 * (sk2 - r2) * (uik12 - lik12));\n+ double idisp = -2.0 * er7 * term;\n+ double irep = er7 * rmin7 * term2;\n+ return irep + idisp;\n+}\n \n- double dl;\n- if (radiusI > (r - sK)) {\n- dl = -lik2 + 2.0*(r2 + sK2);\n- dl *= lik2;\n- } else {\n- dl = -lik3 + 4.0*lik2*r - 6.0*lik*r2 + 2.0*lik*sK2 + 4.0*r*(r2 - sK2);\n- dl *= lik;\n- }\n+static double integralAfterRminDerivative(double ri, double eps, double rmin, double rmin7, double rmax,\n+ double r, double r2, double r3, double sk, double sk2, double lik,\n+ double lik2, double lik3, double lik5, double lik6, double lik12,\n+ double lik13, double uik, double uik2, double uik3, double uik6,\n+ double uik13) {\n+ double er7 = eps * rmin7;\n+ double lowerTerm = lik2 * r + r3 - r * sk2;\n+ double upperTerm = uik2 * r + r3 - r * sk2;\n+\n+ double dl;\n+ if (ri > r - sk || rmax < rmin) {\n+ dl = -(-5.0 * lik2 + 3.0 * r2 + 3.0 * sk2) / lik5;\n+ } else {\n+ dl = (5.0 * lik3 - 33.0 * lik * r2 - 3.0 * lik * sk2 + 15.0 * lowerTerm) / lik6;\n+ }\n+ double du = -(5.0 * uik3 - 33.0 * uik * r2 - 3.0 * uik * sk2 + 15.0 * upperTerm) / uik6;\n+ double de = -2.0 * M_PI * er7 * (dl + du) / (15.0 * r2);\n \n- double du;\n- if ((r+sK) > rmixo) {\n- du = -uik2 + 2.0*(r2 + sK2);\n- du *= -uik2;\n- } else {\n- du = -uik3 + 4.0*uik2*r - 6.0*uik*r2 + 2.0*uik*sK2 + 4.0*r*(r2 - sK2);\n- du *= -uik;\n- }\n- de = -emixo*PI*(dl+du)/(4.0*r2);\n- sum += -emixo*term;\n- }\n+ if (ri > r - sk || rmax < rmin) {\n+ dl = -(-6.0 * lik2 + 5.0 * r2 + 5.0 * sk2) / lik12;\n+ } else {\n+ dl = (6.0 * lik3 - 125.0 * lik * r2 - 5.0 * lik * sk2 + 60.0 * lowerTerm) / lik13;\n+ }\n+ du = -(6.0 * uik3 - 125.0 * uik * r2 - 5.0 * uik * sk2 + 60.0 * upperTerm) / uik13;\n+ de += M_PI * er7 * rmin7 * (dl + du) / (60.0 * r2);\n \n- if (lik < rmixh) {\n-\n- double uik = (r + sK) < rmixh ? (r + sK) : rmixh;\n- double uik2 = uik*uik;\n- double uik3 = uik2*uik;\n- double uik4 = uik2*uik2;\n- double term = 4.0*PI / (48.0*r)*(3.0*(lik4-uik4) - 8.0*r*(lik3-uik3) + 6.0*(r2-sK2)*(lik2-uik2));\n- double dl;\n- if (radiusI > (r-sK)) {\n- dl = -lik2 + 2.0*(r2 + sK2);\n- dl *= lik2;\n- } else {\n- dl = -lik3 + 4.0*lik2*r - 6.0*lik*r2 + 2.0*lik*sK2 + 4.0*r*(r2 -sK2);\n- dl *= lik;\n- }\n- \n- double du;\n- if (r+sK > rmixh) {\n- du = -uik2 + 2.0*(r2 + sK2);\n- du *= -uik2;\n- } else {\n- du = -uik3 +4.0*uik2*r - 6.0*uik*r2 + 2.0*uik*sK2 +4.0*r*(r2 - sK2);\n- du *= -uik;\n- }\n- de -= 2.0*emixh*PI*(dl+du)/(4.0*r2);\n- sum -= 2.0*emixh*term;\n- }\n+ return de;\n+}\n \n- double uik = r + sK;\n- double uik2 = uik * uik;\n- double uik3 = uik2 * uik;\n- double uik4 = uik2 * uik2;\n- double uik5 = uik3 * uik2;\n- double uik6 = uik3 * uik3;\n- double uik10 = uik5 * uik5;\n- double uik11 = uik5 * uik6;\n- double uik12 = uik6 * uik6;\n- double uik13 = uik10 * uik3;\n-\n- if (uik > rmixo) {\n-\n- double lik = rmax > rmixo ? rmax : rmixo;\n- double lik2 = lik * lik;\n- double lik3 = lik2 * lik;\n- double lik4 = lik2 * lik2;\n- double lik5 = lik2 * lik3;\n- double lik6 = lik3 * lik3;\n- double lik10 = lik5 * lik5;\n- double lik11 = lik5 * lik6;\n- double lik12 = lik6 * lik6;\n- double lik13 = lik10 * lik3;\n-\n- double term = 4.0*PI/(120.0*r*lik5*uik5)*(15.0*uik*lik*r*(uik4-lik4) - 10.0*uik2*lik2*(uik3-lik3) + 6.0*(sK2-r2)*(uik5-lik5));\n- double dl;\n- if (radiusI > (r-sK) || rmax < rmixo) {\n- dl = -5.0*lik2 + 3.0*(r2 + sK2);\n- dl /= -lik5;\n- } else {\n- dl = 5.0*lik3 - 33.0*lik*r2 - 3.0*lik*sK2 + 15.0*(lik2*r+r3-r*sK2);\n- dl /= lik6;\n- }\n- double du = 5.0*uik3 - 33.0*uik*r2 - 3.0*uik*sK2 + 15.0*(uik2*r+r3-r*sK2);\n- du /= -uik6;\n- double idisp = -2.0*ao*term;\n- de -= 2.0*ao*PI*(dl + du)/(15.0*r2);\n- term = 4.0*PI/(2640.0*r*lik12*uik12) * (120.0*uik*lik*r*(uik11-lik11) - 66.0*uik2*lik2*(uik10-lik10) + 55.0*(sK2-r2)*(uik12-lik12));\n- if (radiusI > (r-sK) || rmax < rmixo) {\n- dl = -6.0*lik2 + 5.0*r2 + 5.0*sK2;\n- dl /= -lik12;\n- } else {\n- dl = 6.0*lik3 - 125.0*lik*r2 - 5.0*lik*sK2 + 60.0*(lik2*r+r3-r*sK2);\n- dl /= lik13;\n- }\n- du = 6.0*uik3 - 125.0*uik*r2 - 5.0*uik*sK2 + 60.0*(uik2*r+r3-r*sK2);\n- du /= -uik13;\n- de += ao*rmixo7*PI*(dl + du)/(60.0*r2);\n- sum += ao*rmixo7*term + idisp;\n+static double interact(double factor, double ri, double sk, double rmix, double emix,\n+ double r, double r2, double r3, Vec3 &force) {\n+ double sum = 0.0;\n+ // Nothing to do if the integral begins beyond r + sk (i.e. atom k does not exclude solvent)\n+ if (ri < r + sk) {\n+ // Zero out the derivative contribution of atom k.\n+ double de = 0.0;\n+ double sk2 = sk * sk;\n+ // Compute the maximum of 1) the beginning of the integral and 2) closest edge of atom K.\n+ double iStart = ri > r - sk ? ri : r - sk;\n+ // Use this as the lower limit for integrating the constant eps value below Rmin.\n+ double lik = iStart;\n+ // Interaction with water from lik to Rmin; nothing to do if the lower limit is greater than Rmin.\n+ if (lik < rmix) {\n+ double lik2 = lik * lik;\n+ double lik3 = lik2 * lik;\n+ double lik4 = lik3 * lik;\n+ // Upper limit is the minimum of Rmin and the farthest edge of atom K.\n+ double uik = r + sk < rmix ? r + sk : rmix;\n+ double uik2 = uik * uik;\n+ double uik3 = uik2 * uik;\n+ double uik4 = uik3 * uik;\n+ sum = integralBeforeRMin(emix, r, r2, sk2, lik2, lik3, lik4, uik2, uik3, uik4);\n+ de = integralBeforeRminDerivative(ri, emix, rmix, r, r2, r3, sk, sk2, lik, lik2, lik3, uik, uik2, uik3);\n }\n- if (uik > rmixh) {\n- lik = rmax > rmixh ? rmax : rmixh;\n- lik2 = lik * lik;\n- lik3 = lik2 * lik;\n- lik4 = lik2 * lik2;\n- double lik5 = lik2 * lik3;\n- double lik6 = lik3 * lik3;\n+ // Upper limit the variable part of Uwca always the farthest edge of atom K.\n+ double uik = r + sk;\n+ // Interaction with water beyond Rmin, from lik to uik = r + sk.\n+ if (uik > rmix) {\n+ // Start the integral at the max of 1) iStart and 2) Rmin.\n+ lik = iStart > rmix ? iStart : rmix;\n+ double lik2 = lik * lik;\n+ double lik3 = lik2 * lik;\n+ double lik4 = lik3 * lik;\n+ double lik5 = lik4 * lik;\n+ double lik6 = lik5 * lik;\n double lik10 = lik5 * lik5;\n- double lik11 = lik5 * lik6;\n- double lik12 = lik6 * lik6;\n- double lik13 = lik3 * lik10;\n-\n- double term = 4.0*PI / (120.0*r*lik5*uik5)*(15.0*uik*lik*r*(uik4-lik4) - 10.0*uik2*lik2*(uik3-lik3) + 6.0*(sK2-r2)*(uik5-lik5));\n- double dl;\n- if (radiusI > (r-sK) || rmax < rmixh) {\n- dl = -5.0*lik2 + 3.0*(r2 + sK2);\n- dl /= -lik5;\n- } else {\n- dl = 5.0*lik3 - 33.0*lik*r2 - 3.0*lik*sK2 + 15.0*(lik2*r+r3-r*sK2);\n- dl /= lik6;\n- }\n- double du = 5.0*uik3 - 33.0*uik*r2 - 3.0*uik*sK2 + 15.0*(uik2*r+r3-r*sK2);\n- du /= -uik6;\n- double idisp = -4.0*ah*term;\n- de = de - 4.0*ah*PI*(dl + du)/(15.0*r2);\n- term = 4.0*PI / (2640.0*r*lik12*uik12)* (120.0*uik*lik*r*(uik11-lik11)- 66.0*uik2*lik2*(uik10-lik10)+ 55.0*(sK2-r2)*(uik12-lik12));\n- if (radiusI > (r-sK) || rmax < rmixh) {\n- dl = -6.0*lik2 + 5.0*r2 + 5.0*sK2;\n- dl = -dl / lik12;\n- } else {;\n- dl = 6.0*lik3 - 125.0*lik*r2 - 5.0*lik*sK2 + 60.0*(lik2*r+r3-r*sK2);\n- dl = dl / lik13;\n- }\n- du = 6.0*uik3 - 125.0*uik*r2 - 5.0*uik*sK2 + 60.0*(uik2*r+r3-r*sK2);\n- du /= -uik13;\n- double irep = 2.0*ah*rmixh7*term;\n- de += ah*rmixh7*PI*(dl+du)/(30.0*r2);\n- sum += irep + idisp;\n+ double lik11 = lik10 * lik;\n+ double lik12 = lik11 * lik;\n+ double uik2 = uik * uik;\n+ double uik3 = uik2 * uik;\n+ double uik4 = uik3 * uik;\n+ double uik5 = uik4 * uik;\n+ double uik10 = uik5 * uik5;\n+ double uik11 = uik10 * uik;\n+ double uik12 = uik11 * uik;\n+ double rmix3 = rmix * rmix * rmix;\n+ double rmix7 = rmix3 * rmix3 * rmix;\n+ sum += integralAfterRmin(emix, rmix7, r, r2, sk2, lik, lik2, lik3, lik4, lik5, lik10, lik11, lik12, uik,\n+ uik2, uik3, uik4, uik5, uik10, uik11, uik12);\n+ double lik13 = lik12 * lik;\n+ double uik6 = uik5 * uik;\n+ double uik13 = uik12 * uik;\n+ de += integralAfterRminDerivative(ri, emix, rmix, rmix7, iStart, r, r2, r3, sk, sk2, lik, lik2, lik3,\n+ lik5, lik6, lik12, lik13, uik, uik2, uik3, uik6, uik13);\n }\n+ // Increment the individual dispersion gradient components.\n+ de *= factor / r;\n+ force[0] += de;\n+ force[1] += de;\n+ force[2] += de;\n }\n+ return factor * sum;\n+}\n \n- // increment the individual dispersion gradient components\n-\n- de *= (_slevy*_awater)/r;\n-\n- force[0] = de*xr;\n- force[1] = de*yr;\n- force[2] = de*zr;\n+double AmoebaReferenceWcaDispersionForce::calculatePairIxn(double radiusJ,\n+ const Vec3 &particleIPosition,\n+ const Vec3 &particleJPosition,\n+ const double *const intermediateValues,\n+ Vec3 &force) const {\n+ // Atomic separation\n+ double xr = particleIPosition[0] - particleJPosition[0];\n+ double yr = particleIPosition[1] - particleJPosition[1];\n+ double zr = particleIPosition[2] - particleJPosition[2];\n+ double r2 = xr * xr + yr * yr + zr * zr;\n+ double r = sqrt(r2);\n+ double r3 = r2 * r;\n+\n+ // Parameters for atom i with water oxygen.\n+ double rmixo = intermediateValues[RMIXO];\n+ double emixo = intermediateValues[EMIXO];\n+\n+ // Parameters for atom i with water hydrogen.\n+ double rmixh = intermediateValues[RMIXH];\n+ double emixh = intermediateValues[EMIXH];\n+\n+ // Start of integration of dispersion for atom i with water oxygen.\n+ double riO = rmixo / 2.0e0 + _dispoff;\n+ double nO = 1.0e0;\n+\n+ // Start of integration of dispersion for atom i with water hydrogen.\n+ double riH = rmixh / 2.0e0 + _dispoff;\n+ double nH = 2.0e0;\n+\n+ // Atom k blocks the interaction of atom i with solvent.\n+ double sJ = radiusJ * _shctd;\n+\n+ double sum = interact(nO, riO, sJ, rmixo, emixo, r, r2, r3, force) +\n+ interact(nH, riH, sJ, rmixh, emixh, r, r2, r3, force);\n+\n+ force[0] *= xr;\n+ force[1] *= yr;\n+ force[2] *= zr;\n \n return sum;\n-\n }\n \n double AmoebaReferenceWcaDispersionForce::calculateForceAndEnergy(int numParticles,\n- const vector<Vec3>& particlePositions,\n- const std::vector<double>& radii,\n- const std::vector<double>& epsilons,\n+ const vector<Vec3> &particlePositions,\n+ const std::vector<double> &radii,\n+ const std::vector<double> &epsilons,\n double totalMaximumDispersionEnergy,\n- vector<Vec3>& forces) const {\n-\n- // loop over all ixns\n-\n- double energy = 0.0;\n-\n- double rmino2 = _rmino*_rmino;\n- double rmino3 = rmino2*_rmino;\n-\n- double rminh2 = _rminh*_rminh;\n- double rminh3 = rminh2*_rminh;\n-\n+ vector<Vec3> &forces) const {\n+ double energy = 0.0;\n+ double rmino2 = _rmino * _rmino;\n+ double rmino3 = rmino2 * _rmino;\n+ double rminh2 = _rminh * _rminh;\n+ double rminh3 = rminh2 * _rminh;\n double intermediateValues[LastIntermediateValueIndex];\n \n+ // loop over all ixns\n for (unsigned int ii = 0; ii < static_cast<unsigned int>(numParticles); ii++) {\n- \n- double epsi = epsilons[ii];\n- double rmini = radii[ii];\n-\n- double denominator = sqrt(_epso) + sqrt(epsi);\n- double emixo = 4.0*_epso*epsi/(denominator*denominator);\n- intermediateValues[EMIXO] = emixo;\n-\n- double rminI2 = rmini*rmini;\n- double rminI3 = rminI2*rmini;\n- \n- double rmixo = 2.0*(rmino3 + rminI3) / (rmino2 + rminI2);\n- intermediateValues[RMIXO] = rmixo;\n \n- double rmixo7 = rmixo*rmixo*rmixo;\n- rmixo7 = rmixo7*rmixo7*rmixo;\n- intermediateValues[RMIXO7] = rmixo7;\n+ double epsi = epsilons[ii];\n+ double rmini = radii[ii];\n+ double rminI2 = rmini * rmini;\n+ double rminI3 = rminI2 * rmini;\n \n- intermediateValues[AO] = emixo*rmixo7;\n+ double denominator = sqrt(_epso) + sqrt(epsi);\n+ double emixo = 4.0 * _epso * epsi / (denominator * denominator);\n+ intermediateValues[EMIXO] = emixo;\n \n- denominator = sqrt(_epsh) + sqrt(epsi);\n+ double rmixo = 2.0 * (rmino3 + rminI3) / (rmino2 + rminI2);\n+ intermediateValues[RMIXO] = rmixo;\n \n- double emixh = 4.0*_epsh*epsi/ (denominator*denominator);\n+ denominator = sqrt(_epsh) + sqrt(epsi);\n+ double emixh = 4.0 * _epsh * epsi / (denominator * denominator);\n intermediateValues[EMIXH] = emixh;\n \n- double rmixh = 2.0 * (rminh3 + rminI3) / (rminh2 + rminI2);\n+ double rmixh = 2.0 * (rminh3 + rminI3) / (rminh2 + rminI2);\n intermediateValues[RMIXH] = rmixh;\n \n- double rmixh7 = rmixh*rmixh*rmixh;\n- rmixh7 = rmixh7*rmixh7*rmixh;\n- intermediateValues[RMIXH7] = rmixh7;\n-\n- intermediateValues[AH] = emixh*rmixh7;\n-\n+ // Remove dispersion for atom i by atom j.\n for (unsigned int jj = 0; jj < static_cast<unsigned int>(numParticles); jj++) {\n \n- if (ii == jj)continue;\n+ if (ii == jj) continue;\n \n- Vec3 force;\n- energy += calculatePairIxn(rmini, radii[jj],\n- particlePositions[ii], particlePositions[jj],\n+ Vec3 force = Vec3();\n+ energy += calculatePairIxn(radii[jj], particlePositions[ii], particlePositions[jj],\n intermediateValues, force);\n- \n+\n+ force[0] *= _slevy * _awater;\n+ force[1] *= _slevy * _awater;\n+ force[2] *= _slevy * _awater;\n+\n forces[ii][0] += force[0];\n forces[ii][1] += force[1];\n forces[ii][2] += force[2];\n@@ -313,11 +274,12 @@ double AmoebaReferenceWcaDispersionForce::calculateForceAndEnergy(int numParticl\n forces[jj][0] -= force[0];\n forces[jj][1] -= force[1];\n forces[jj][2] -= force[2];\n+\n }\n \n }\n \n- energy = totalMaximumDispersionEnergy - _slevy*_awater*energy;\n+ energy = totalMaximumDispersionEnergy - _slevy * _awater * energy;\n \n return energy;\n }\ndiff --git a/plugins/amoeba/platforms/reference/src/SimTKReference/AmoebaReferenceWcaDispersionForce.h b/plugins/amoeba/platforms/reference/src/SimTKReference/AmoebaReferenceWcaDispersionForce.h\nindex 5f2f3cd48e..4a8838d0ed 100644\n--- a/plugins/amoeba/platforms/reference/src/SimTKReference/AmoebaReferenceWcaDispersionForce.h\n+++ b/plugins/amoeba/platforms/reference/src/SimTKReference/AmoebaReferenceWcaDispersionForce.h\n@@ -91,13 +91,12 @@ class AmoebaReferenceWcaDispersionForce {\n double _dispoff;\n double _slevy;\n \n- enum { EMIXO, RMIXO, RMIXO7, AO, EMIXH, RMIXH, RMIXH7, AH, LastIntermediateValueIndex }; \n+ enum { EMIXO, RMIXO, EMIXH, RMIXH, LastIntermediateValueIndex };\n \n /**---------------------------------------------------------------------------------------\n \n Calculate pair ixn\n- \n- @param radiusI radius of particle I\n+\n @param radiusJ radius of particle J\n @param particleIPosition particle I position \n @param particleJPosition particle J position \n@@ -108,7 +107,7 @@ class AmoebaReferenceWcaDispersionForce {\n \n --------------------------------------------------------------------------------------- */\n \n- double calculatePairIxn(double radiusI, double radiusJ,\n+ double calculatePairIxn(double radiusJ,\n const OpenMM::Vec3& particleIPosition, const OpenMM::Vec3& particleJPosition,\n const double* const intermediateValues,\n Vec3& force) const;\ndiff --git a/plugins/amoeba/serialization/src/AmoebaGeneralizedKirkwoodForceProxy.cpp b/plugins/amoeba/serialization/src/AmoebaGeneralizedKirkwoodForceProxy.cpp\nindex 13f7099c01..31395b3421 100644\n--- a/plugins/amoeba/serialization/src/AmoebaGeneralizedKirkwoodForceProxy.cpp\n+++ b/plugins/amoeba/serialization/src/AmoebaGeneralizedKirkwoodForceProxy.cpp\n@@ -42,46 +42,70 @@ AmoebaGeneralizedKirkwoodForceProxy::AmoebaGeneralizedKirkwoodForceProxy() : Ser\n }\n \n void AmoebaGeneralizedKirkwoodForceProxy::serialize(const void* object, SerializationNode& node) const {\n- node.setIntProperty(\"version\", 2);\n+ node.setIntProperty(\"version\", 3);\n const AmoebaGeneralizedKirkwoodForce& force = *reinterpret_cast<const AmoebaGeneralizedKirkwoodForce*>(object);\n \n node.setIntProperty(\"forceGroup\", force.getForceGroup());\n node.setStringProperty(\"name\", force.getName());\n node.setDoubleProperty(\"GeneralizedKirkwoodSolventDielectric\", force.getSolventDielectric());\n node.setDoubleProperty(\"GeneralizedKirkwoodSoluteDielectric\", force.getSoluteDielectric());\n- //node.setDoubleProperty(\"GeneralizedKirkwoodDielectricOffset\", force.getDielectricOffset());\n+ node.setDoubleProperty(\"GeneralizedKirkwoodDielectricOffset\", force.getDielectricOffset());\n node.setDoubleProperty(\"GeneralizedKirkwoodProbeRadius\", force.getProbeRadius());\n node.setDoubleProperty(\"GeneralizedKirkwoodSurfaceAreaFactor\", force.getSurfaceAreaFactor());\n node.setIntProperty( \"GeneralizedKirkwoodIncludeCavityTerm\", force.getIncludeCavityTerm());\n-\n+ node.setBoolProperty(\"GeneralizedKirkwoodTanhRescaling\", force.getTanhRescaling());\n+ double b0, b1, b2;\n+ force.getTanhParameters(b0, b1, b2);\n+ node.setDoubleProperty(\"GeneralizedKirkwoodTanhB0\", b0);\n+ node.setDoubleProperty(\"GeneralizedKirkwoodTanhB1\", b1);\n+ node.setDoubleProperty(\"GeneralizedKirkwoodTanhB2\", b2);\n+ node.setDoubleProperty(\"GeneralizedKirkwoodDescreenOffset\", force.getDescreenOffset());\n SerializationNode& particles = node.createChildNode(\"GeneralizedKirkwoodParticles\");\n for (unsigned int ii = 0; ii < static_cast<unsigned int>(force.getNumParticles()); ii++) {\n- double radius, charge, scalingFactor;\n- force.getParticleParameters(ii, charge, radius, scalingFactor);\n- particles.createChildNode(\"Particle\").setDoubleProperty(\"charge\", charge).setDoubleProperty(\"radius\", radius).setDoubleProperty(\"scaleFactor\", scalingFactor);\n+ double radius, charge, scalingFactor, descreenRadius, neckFactor;\n+ force.getParticleParameters(ii, charge, radius, scalingFactor, descreenRadius, neckFactor);\n+ particles.createChildNode(\"Particle\").setDoubleProperty(\"charge\", charge).setDoubleProperty(\"radius\", radius).setDoubleProperty(\"scaleFactor\", scalingFactor).setDoubleProperty(\"descreenRadius\", descreenRadius).setDoubleProperty(\"neckFactor\", neckFactor);\n }\n \n }\n \n void* AmoebaGeneralizedKirkwoodForceProxy::deserialize(const SerializationNode& node) const {\n int version = node.getIntProperty(\"version\");\n- if (version < 1 || version > 2)\n+ if (version < 1 || version > 3)\n throw OpenMMException(\"Unsupported version number\");\n AmoebaGeneralizedKirkwoodForce* force = new AmoebaGeneralizedKirkwoodForce();\n try {\n force->setForceGroup(node.getIntProperty(\"forceGroup\", 0));\n force->setName(node.getStringProperty(\"name\", force->getName()));\n- force->setSolventDielectric( node.getDoubleProperty(\"GeneralizedKirkwoodSolventDielectric\"));\n- force->setSoluteDielectric( node.getDoubleProperty(\"GeneralizedKirkwoodSoluteDielectric\"));\n- //force->setDielectricOffset( node.getDoubleProperty(\"GeneralizedKirkwoodDielectricOffset\"));\n- force->setProbeRadius( node.getDoubleProperty(\"GeneralizedKirkwoodProbeRadius\"));\n- force->setSurfaceAreaFactor( node.getDoubleProperty(\"GeneralizedKirkwoodSurfaceAreaFactor\"));\n- force->setIncludeCavityTerm( node.getIntProperty( \"GeneralizedKirkwoodIncludeCavityTerm\"));\n+ force->setSolventDielectric(node.getDoubleProperty(\"GeneralizedKirkwoodSolventDielectric\"));\n+ force->setSoluteDielectric(node.getDoubleProperty(\"GeneralizedKirkwoodSoluteDielectric\"));\n+ force->setProbeRadius(node.getDoubleProperty(\"GeneralizedKirkwoodProbeRadius\"));\n+ force->setSurfaceAreaFactor(node.getDoubleProperty(\"GeneralizedKirkwoodSurfaceAreaFactor\"));\n+ force->setIncludeCavityTerm(node.getIntProperty(\"GeneralizedKirkwoodIncludeCavityTerm\"));\n+ if (version > 2) {\n+ force->setDielectricOffset(node.getDoubleProperty(\"GeneralizedKirkwoodDielectricOffset\"));\n+ force->setTanhRescaling(node.getBoolProperty(\"GeneralizedKirkwoodTanhRescaling\"));\n+ double b0 = node.getDoubleProperty(\"GeneralizedKirkwoodTanhB0\");\n+ double b1 = node.getDoubleProperty(\"GeneralizedKirkwoodTanhB1\");\n+ double b2 = node.getDoubleProperty(\"GeneralizedKirkwoodTanhB2\");\n+ force->setTanhParameters(b0, b1, b2);\n+ force->setDescreenOffset(node.getDoubleProperty(\"GeneralizedKirkwoodDescreenOffset\"));\n+\n+ }\n \n const SerializationNode& particles = node.getChildNode(\"GeneralizedKirkwoodParticles\");\n for (unsigned int ii = 0; ii < particles.getChildren().size(); ii++) {\n const SerializationNode& particle = particles.getChildren()[ii];\n- force->addParticle(particle.getDoubleProperty(\"charge\"), particle.getDoubleProperty(\"radius\"), particle.getDoubleProperty(\"scaleFactor\"));\n+ double charge = particle.getDoubleProperty(\"charge\");\n+ double radius = particle.getDoubleProperty(\"radius\");\n+ double scaleFactor = particle.getDoubleProperty(\"scaleFactor\");\n+ double descreenRadius = radius;\n+ double neckFactor = 0.0;\n+ if (version > 2) {\n+ descreenRadius = particle.getDoubleProperty(\"descreenRadius\");\n+ neckFactor = particle.getDoubleProperty(\"neckFactor\");\n+ }\n+ force->addParticle(charge, radius, scaleFactor, descreenRadius, neckFactor);\n }\n }\n catch (...) {\ndiff --git a/plugins/amoeba/serialization/src/AmoebaVdwForceProxy.cpp b/plugins/amoeba/serialization/src/AmoebaVdwForceProxy.cpp\nindex b52b6092eb..f51985f797 100644\n--- a/plugins/amoeba/serialization/src/AmoebaVdwForceProxy.cpp\n+++ b/plugins/amoeba/serialization/src/AmoebaVdwForceProxy.cpp\n@@ -42,7 +42,7 @@ AmoebaVdwForceProxy::AmoebaVdwForceProxy() : SerializationProxy(\"AmoebaVdwForce\"\n }\n \n void AmoebaVdwForceProxy::serialize(const void* object, SerializationNode& node) const {\n- node.setIntProperty(\"version\", 4);\n+ node.setIntProperty(\"version\", 5);\n const AmoebaVdwForce& force = *reinterpret_cast<const AmoebaVdwForce*>(object);\n bool useTypes = force.getUseParticleTypes();\n \n@@ -62,14 +62,14 @@ void AmoebaVdwForceProxy::serialize(const void* object, SerializationNode& node)\n SerializationNode& particles = node.createChildNode(\"VdwParticles\");\n for (int i = 0; i < force.getNumParticles(); i++) {\n int ivIndex, typeIndex;\n- double sigma, epsilon, reductionFactor;\n+ double sigma, epsilon, reductionFactor, scaleFactor;\n bool isAlchemical;\n- force.getParticleParameters(i, ivIndex, sigma, epsilon, reductionFactor, isAlchemical, typeIndex);\n+ force.getParticleParameters(i, ivIndex, sigma, epsilon, reductionFactor, isAlchemical, typeIndex, scaleFactor);\n SerializationNode& particle = particles.createChildNode(\"Particle\");\n if (useTypes)\n- particle.setIntProperty(\"ivIndex\", ivIndex).setIntProperty(\"type\", typeIndex).setDoubleProperty(\"reductionFactor\", reductionFactor).setBoolProperty(\"isAlchemical\", isAlchemical);\n+ particle.setIntProperty(\"ivIndex\", ivIndex).setIntProperty(\"type\", typeIndex).setDoubleProperty(\"reductionFactor\", reductionFactor).setBoolProperty(\"isAlchemical\", isAlchemical).setDoubleProperty(\"scaleFactor\", scaleFactor);\n else\n- particle.setIntProperty(\"ivIndex\", ivIndex).setDoubleProperty(\"sigma\", sigma).setDoubleProperty(\"epsilon\", epsilon).setDoubleProperty(\"reductionFactor\", reductionFactor).setBoolProperty(\"isAlchemical\", isAlchemical); \n+ particle.setIntProperty(\"ivIndex\", ivIndex).setDoubleProperty(\"sigma\", sigma).setDoubleProperty(\"epsilon\", epsilon).setDoubleProperty(\"reductionFactor\", reductionFactor).setBoolProperty(\"isAlchemical\", isAlchemical).setDoubleProperty(\"scaleFactor\", scaleFactor);\n \n std::vector< int > exclusions;\n force.getParticleExclusions(i, exclusions);\n@@ -98,7 +98,7 @@ void AmoebaVdwForceProxy::serialize(const void* object, SerializationNode& node)\n \n void* AmoebaVdwForceProxy::deserialize(const SerializationNode& node) const {\n int version = node.getIntProperty(\"version\");\n- if (version < 1 || version > 4)\n+ if (version < 1 || version > 5)\n throw OpenMMException(\"Unsupported version number\");\n AmoebaVdwForce* force = new AmoebaVdwForce();\n try {\n@@ -128,16 +128,30 @@ void* AmoebaVdwForceProxy::deserialize(const SerializationNode& node) const {\n if (version < 3) \n force->addParticle(particle.getIntProperty(\"ivIndex\"), particle.getDoubleProperty(\"sigma\"), \n particle.getDoubleProperty(\"epsilon\"), particle.getDoubleProperty(\"reductionFactor\"));\n- else if (useTypes)\n- force->addParticle(particle.getIntProperty(\"ivIndex\"), particle.getIntProperty(\"type\"), \n- particle.getDoubleProperty(\"reductionFactor\"), particle.getBoolProperty(\"isAlchemical\"));\n- else\n- force->addParticle(particle.getIntProperty(\"ivIndex\"), particle.getDoubleProperty(\"sigma\"), \n- particle.getDoubleProperty(\"epsilon\"), particle.getDoubleProperty(\"reductionFactor\"), \n- particle.getBoolProperty(\"isAlchemical\"));\n+ else if (version == 4) {\n+ if (useTypes)\n+ force->addParticle(particle.getIntProperty(\"ivIndex\"), particle.getIntProperty(\"type\"),\n+ particle.getDoubleProperty(\"reductionFactor\"),\n+ particle.getBoolProperty(\"isAlchemical\"));\n+ else\n+ force->addParticle(particle.getIntProperty(\"ivIndex\"), particle.getDoubleProperty(\"sigma\"),\n+ particle.getDoubleProperty(\"epsilon\"),\n+ particle.getDoubleProperty(\"reductionFactor\"),\n+ particle.getBoolProperty(\"isAlchemical\"));\n+ } else {\n+ // Version 5 includes per particle scale factor for CpHMD.\n+ if (useTypes)\n+ force->addParticle(particle.getIntProperty(\"ivIndex\"), particle.getIntProperty(\"type\"),\n+ particle.getDoubleProperty(\"reductionFactor\"),\n+ particle.getBoolProperty(\"isAlchemical\"), particle.getDoubleProperty(\"scaleFactor\"));\n+ else\n+ force->addParticle(particle.getIntProperty(\"ivIndex\"), particle.getDoubleProperty(\"sigma\"),\n+ particle.getDoubleProperty(\"epsilon\"),\n+ particle.getDoubleProperty(\"reductionFactor\"),\n+ particle.getBoolProperty(\"isAlchemical\"), particle.getDoubleProperty(\"scaleFactor\"));\n+ }\n \n // exclusions\n-\n const SerializationNode& particleExclusions = particle.getChildNode(\"ParticleExclusions\");\n std::vector<int> exclusions;\n for (int j = 0; j < particleExclusions.getChildren().size(); j++)\ndiff --git a/wrappers/python/src/swig_doxygen/swigInputConfig.py b/wrappers/python/src/swig_doxygen/swigInputConfig.py\nindex 4b0b80b53f..c8d2875ac2 100755\n--- a/wrappers/python/src/swig_doxygen/swigInputConfig.py\n+++ b/wrappers/python/src/swig_doxygen/swigInputConfig.py\n@@ -240,12 +240,18 @@\n (\"SerializationProxy\", \"getTypeName\") : (None, ()),\n \n # check getSurfaceAreaFactor\n-(\"AmoebaGeneralizedKirkwoodForce\", \"getParticleParameters\") : (None, ('unit.elementary_charge', 'unit.nanometer', None)),\n+(\"AmoebaGeneralizedKirkwoodForce\", \"getParticleParameters\") : (None, ('unit.elementary_charge', 'unit.nanometer', None, 'unit.nanometer', None)),\n (\"AmoebaGeneralizedKirkwoodForce\", \"getDielectricOffset\") : ( 'unit.nanometer', ()),\n+(\"AmoebaGeneralizedKirkwoodForce\", \"getSolventDielectric\") : (None, ()),\n+(\"AmoebaGeneralizedKirkwoodForce\", \"getSoluteDielectric\") : (None, ()),\n (\"AmoebaGeneralizedKirkwoodForce\", \"getIncludeCavityTerm\") : ( None,()),\n+(\"AmoebaGeneralizedKirkwoodForce\", \"getTanhRescaling\") : ( None,()),\n+(\"AmoebaGeneralizedKirkwoodForce\", \"getTanhParameters\") : ( None,(None, None, None)),\n+(\"AmoebaGeneralizedKirkwoodForce\", \"getDescreenOffset\") : ( 'unit.nanometer', ()),\n (\"AmoebaGeneralizedKirkwoodForce\", \"getProbeRadius\") : ( 'unit.nanometer', ()),\n (\"AmoebaGeneralizedKirkwoodForce\", \"getSurfaceAreaFactor\") : ( 'unit.kilojoule_per_mole/(unit.nanometer*unit.nanometer)',()),\n \n+\n (\"AmoebaMultipoleForce\", \"getNumMultipoles\") : ( None,()),\n (\"AmoebaMultipoleForce\", \"getPolarizationType\") : ( None,()),\n (\"AmoebaMultipoleForce\", \"getCutoffDistance\") : ( 'unit.nanometer',()),\n@@ -297,7 +303,7 @@\n (\"AmoebaVdwForce\", \"getSoftcorePower\") : ( None, ()),\n (\"AmoebaVdwForce\", \"getSoftcoreAlpha\") : ( None, ()),\n (\"AmoebaVdwForce\", \"getCutoff\") : ( 'unit.nanometer', ()),\n-(\"AmoebaVdwForce\", \"getParticleParameters\") : ( None, (None, 'unit.nanometer', 'unit.kilojoule_per_mole', None, None, None)),\n+(\"AmoebaVdwForce\", \"getParticleParameters\") : ( None, (None, 'unit.nanometer', 'unit.kilojoule_per_mole', None, None, None, None)),\n (\"AmoebaVdwForce\", \"getParticleTypeParameters\") : ( None, ('unit.nanometer', 'unit.kilojoule_per_mole')),\n (\"AmoebaVdwForce\", \"getTypePairParameters\") : ( None, (None, None, 'unit.nanometer', 'unit.kilojoule_per_mole')),\n \n"}, "test": {"test_patch": "diff --git a/plugins/amoeba/serialization/tests/TestSerializeAmoebaGeneralizedKirkwoodForce.cpp b/plugins/amoeba/serialization/tests/TestSerializeAmoebaGeneralizedKirkwoodForce.cpp\nindex 4447c9fd5f..0a8a1a57f4 100644\n--- a/plugins/amoeba/serialization/tests/TestSerializeAmoebaGeneralizedKirkwoodForce.cpp\n+++ b/plugins/amoeba/serialization/tests/TestSerializeAmoebaGeneralizedKirkwoodForce.cpp\n@@ -47,46 +47,48 @@ void testSerialization() {\n AmoebaGeneralizedKirkwoodForce force1;\n force1.setForceGroup(3);\n force1.setName(\"custom name\");\n- force1.setSolventDielectric( 80.0);\n- force1.setSoluteDielectric( 1.0);\n- //force1.setDielectricOffset( 0.09);\n- force1.setProbeRadius( 1.40);\n- force1.setSurfaceAreaFactor( 0.888);\n- force1.setIncludeCavityTerm( 1);\n+ force1.setSolventDielectric(80.0);\n+ force1.setSoluteDielectric(1.0);\n+ force1.setDielectricOffset( 0.09);\n+ force1.setProbeRadius(1.40);\n+ force1.setSurfaceAreaFactor(0.888);\n+ force1.setIncludeCavityTerm(1);\n+ force1.setTanhRescaling(0);\n \n- force1.addParticle(1.0, 2.0, 0.9);\n- force1.addParticle(-1.1,2.1, 0.8);\n- force1.addParticle(0.1, 2.2, 0.7);\n+ force1.addParticle(1.0, 2.0, 0.9, 2.0, 0.0);\n+ force1.addParticle(-1.1, 2.1, 0.8, 2.1, 0.0);\n+ force1.addParticle(0.1, 2.2, 0.7, 2.2, 0.0);\n \n // Serialize and then deserialize it.\n \n stringstream buffer;\n XmlSerializer::serialize<AmoebaGeneralizedKirkwoodForce>(&force1, \"Force\", buffer);\n- AmoebaGeneralizedKirkwoodForce* copy = XmlSerializer::deserialize<AmoebaGeneralizedKirkwoodForce>(buffer);\n+ AmoebaGeneralizedKirkwoodForce *copy = XmlSerializer::deserialize<AmoebaGeneralizedKirkwoodForce>(buffer);\n \n // Compare the two forces to see if they are identical. \n- AmoebaGeneralizedKirkwoodForce& force2 = *copy;\n+ AmoebaGeneralizedKirkwoodForce &force2 = *copy;\n ASSERT_EQUAL(force1.getForceGroup(), force2.getForceGroup());\n ASSERT_EQUAL(force1.getName(), force2.getName());\n- ASSERT_EQUAL(force1.getSolventDielectric(), force2.getSolventDielectric());\n- ASSERT_EQUAL(force1.getSoluteDielectric(), force2.getSoluteDielectric());\n- //ASSERT_EQUAL(force1.getDielectricOffset(), force2.getDielectricOffset());\n- ASSERT_EQUAL(force1.getProbeRadius(), force2.getProbeRadius());\n- ASSERT_EQUAL(force1.getSurfaceAreaFactor(), force2.getSurfaceAreaFactor());\n- ASSERT_EQUAL(force1.getIncludeCavityTerm(), force2.getIncludeCavityTerm());\n+ ASSERT_EQUAL(force1.getSolventDielectric(), force2.getSolventDielectric());\n+ ASSERT_EQUAL(force1.getSoluteDielectric(), force2.getSoluteDielectric());\n+ ASSERT_EQUAL(force1.getDielectricOffset(), force2.getDielectricOffset());\n+ ASSERT_EQUAL(force1.getProbeRadius(), force2.getProbeRadius());\n+ ASSERT_EQUAL(force1.getSurfaceAreaFactor(), force2.getSurfaceAreaFactor());\n+ ASSERT_EQUAL(force1.getIncludeCavityTerm(), force2.getIncludeCavityTerm());\n \n ASSERT_EQUAL(force1.getNumParticles(), force2.getNumParticles());\n for (unsigned int ii = 0; ii < static_cast<unsigned int>(force1.getNumParticles()); ii++) {\n \n- double radius1, charge1, scaleFactor1;\n- double radius2, charge2, scaleFactor2;\n+ double radius1, charge1, scaleFactor1, descreen1, neckFactor1;\n+ double radius2, charge2, scaleFactor2, descreen2, neckFactor2;\n \n- force1.getParticleParameters(ii, charge1, radius1, scaleFactor1);\n- force2.getParticleParameters(ii, charge2, radius2, scaleFactor2);\n+ force1.getParticleParameters(ii, charge1, radius1, scaleFactor1, descreen1, neckFactor1);\n+ force2.getParticleParameters(ii, charge2, radius2, scaleFactor2, descreen2, neckFactor2);\n \n- ASSERT_EQUAL(charge1, charge2);\n- ASSERT_EQUAL(radius1, radius2);\n- ASSERT_EQUAL(scaleFactor1, scaleFactor2);\n+ ASSERT_EQUAL(charge1, charge2)\n+ ASSERT_EQUAL(radius1, radius2)\n+ ASSERT_EQUAL(scaleFactor1, scaleFactor2)\n+ ASSERT_EQUAL(descreen1, descreen2)\n }\n }\n \n@@ -95,7 +97,7 @@ int main() {\n registerAmoebaSerializationProxies();\n testSerialization();\n }\n- catch(const exception& e) {\n+ catch (const exception &e) {\n cout << \"exception: \" << e.what() << endl;\n return 1;\n }\ndiff --git a/plugins/amoeba/serialization/tests/TestSerializeAmoebaVdwForce.cpp b/plugins/amoeba/serialization/tests/TestSerializeAmoebaVdwForce.cpp\nindex 9a24a0187e..fa80fd5f66 100644\n--- a/plugins/amoeba/serialization/tests/TestSerializeAmoebaVdwForce.cpp\n+++ b/plugins/amoeba/serialization/tests/TestSerializeAmoebaVdwForce.cpp\n@@ -54,9 +54,9 @@ void testSerialization() {\n force1.setAlchemicalMethod(AmoebaVdwForce::None);\n force1.setPotentialFunction(AmoebaVdwForce::Buffered147);\n \n- force1.addParticle(0, 1.0, 2.0, 0.9, false);\n- force1.addParticle(1, 1.1, 2.1, 0.9, true);\n- force1.addParticle(2, 1.3, 4.1, 0.9, false);\n+ force1.addParticle(0, 1.0, 2.0, 0.9, false, 1.0);\n+ force1.addParticle(1, 1.1, 2.1, 0.9, true, 0.9);\n+ force1.addParticle(2, 1.3, 4.1, 0.9, false, 1.0);\n for (int i = 0; i < 3; i++) {\n std::vector< int > exclusions;\n exclusions.push_back(i);\n@@ -90,14 +90,14 @@ void testSerialization() {\n int ivIndex1, type1;\n int ivIndex2, type2;\n \n- double sigma1, epsilon1, reductionFactor1;\n- double sigma2, epsilon2, reductionFactor2;\n+ double sigma1, epsilon1, reductionFactor1, scaleFactor1;\n+ double sigma2, epsilon2, reductionFactor2, scaleFactor2;\n \n bool isAlchemical1;\n bool isAlchemical2;\n \n- force1.getParticleParameters(i, ivIndex1, sigma1, epsilon1, reductionFactor1, isAlchemical1, type1);\n- force2.getParticleParameters(i, ivIndex2, sigma2, epsilon2, reductionFactor2, isAlchemical2, type2);\n+ force1.getParticleParameters(i, ivIndex1, sigma1, epsilon1, reductionFactor1, isAlchemical1, type1, scaleFactor1);\n+ force2.getParticleParameters(i, ivIndex2, sigma2, epsilon2, reductionFactor2, isAlchemical2, type2, scaleFactor2);\n \n ASSERT_EQUAL(ivIndex1, ivIndex2);\n ASSERT_EQUAL(sigma1, sigma2);\n@@ -105,6 +105,7 @@ void testSerialization() {\n ASSERT_EQUAL(reductionFactor1, reductionFactor2);\n ASSERT_EQUAL(isAlchemical1, isAlchemical2);\n ASSERT_EQUAL(type1, type2);\n+ ASSERT_EQUAL(scaleFactor1, scaleFactor2);\n }\n for (int i = 0; i < force1.getNumParticles(); i++) {\n \n@@ -131,10 +132,10 @@ void testSerializeTypes() {\n AmoebaVdwForce force1;\n force1.setPotentialFunction(AmoebaVdwForce::LennardJones);\n \n- force1.addParticle(0, 2, 1.0, false);\n- force1.addParticle(1, 2, 0.9, true);\n- force1.addParticle(2, 0, 1.0, false);\n- force1.addParticle(3, 1, 0.9, false);\n+ force1.addParticle(0, 2, 1.0, false, 1.0);\n+ force1.addParticle(1, 2, 0.9, true, 0.0);\n+ force1.addParticle(2, 0, 1.0, false, 0.5);\n+ force1.addParticle(3, 1, 0.9, false, 0.9);\n force1.addParticleType(1.1, 2.0);\n force1.addParticleType(1.2, 2.1);\n force1.addParticleType(1.3, 2.2);\n@@ -158,14 +159,14 @@ void testSerializeTypes() {\n int ivIndex1, type1;\n int ivIndex2, type2;\n \n- double sigma1, epsilon1, reductionFactor1;\n- double sigma2, epsilon2, reductionFactor2;\n+ double sigma1, epsilon1, reductionFactor1, scaleFactor1;\n+ double sigma2, epsilon2, reductionFactor2, scaleFactor2;\n \n bool isAlchemical1;\n bool isAlchemical2;\n \n- force1.getParticleParameters(i, ivIndex1, sigma1, epsilon1, reductionFactor1, isAlchemical1, type1);\n- force2.getParticleParameters(i, ivIndex2, sigma2, epsilon2, reductionFactor2, isAlchemical2, type2);\n+ force1.getParticleParameters(i, ivIndex1, sigma1, epsilon1, reductionFactor1, isAlchemical1, type1, scaleFactor1);\n+ force2.getParticleParameters(i, ivIndex2, sigma2, epsilon2, reductionFactor2, isAlchemical2, type2, scaleFactor2);\n \n ASSERT_EQUAL(ivIndex1, ivIndex2);\n ASSERT_EQUAL(sigma1, sigma2);\n@@ -173,6 +174,7 @@ void testSerializeTypes() {\n ASSERT_EQUAL(reductionFactor1, reductionFactor2);\n ASSERT_EQUAL(isAlchemical1, isAlchemical2);\n ASSERT_EQUAL(type1, type2);\n+ ASSERT_EQUAL(scaleFactor1, scaleFactor2);\n }\n for (int i = 0; i < force1.getNumParticleTypes(); i++) {\n double sigma1, epsilon1;\ndiff --git a/plugins/amoeba/tests/TestAmoebaGeneralizedKirkwoodForce.h b/plugins/amoeba/tests/TestAmoebaGeneralizedKirkwoodForce.h\nindex da86f818b2..fcd477a429 100644\n--- a/plugins/amoeba/tests/TestAmoebaGeneralizedKirkwoodForce.h\n+++ b/plugins/amoeba/tests/TestAmoebaGeneralizedKirkwoodForce.h\n@@ -289,10 +289,10 @@ static void setupMultipoleAmmonia(System& system, AmoebaGeneralizedKirkwoodForce\n // addParticle: charge, radius, scalingFactor\n \n for (unsigned int ii = 0; ii < 2; ii++) {\n- amoebaGeneralizedKirkwoodForce->addParticle( -5.7960000e-01, 1.5965000e-01, 6.9000000e-01);\n- amoebaGeneralizedKirkwoodForce->addParticle( 1.9320000e-01, 1.2360000e-01, 6.9000000e-01);\n- amoebaGeneralizedKirkwoodForce->addParticle( 1.9320000e-01, 1.2360000e-01, 6.9000000e-01);\n- amoebaGeneralizedKirkwoodForce->addParticle( 1.9320000e-01, 1.2360000e-01, 6.9000000e-01);\n+ amoebaGeneralizedKirkwoodForce->addParticle( -5.7960000e-01, 1.5965000e-01, 6.9000000e-01, 1.5965000e-01, 0.0f);\n+ amoebaGeneralizedKirkwoodForce->addParticle( 1.9320000e-01, 1.2360000e-01, 6.9000000e-01, 1.2360000e-01, 0.0f);\n+ amoebaGeneralizedKirkwoodForce->addParticle( 1.9320000e-01, 1.2360000e-01, 6.9000000e-01, 1.2360000e-01, 0.0f);\n+ amoebaGeneralizedKirkwoodForce->addParticle( 1.9320000e-01, 1.2360000e-01, 6.9000000e-01, 1.2360000e-01, 0.0f);\n }\n system.addForce(amoebaGeneralizedKirkwoodForce);\n }\n@@ -7167,9 +7167,9 @@ static void testGeneralizedKirkwoodAmmoniaMutualPolarizationWithCavityTerm() {\n // Try changing the particle parameters and make sure it's still correct.\n \n for (int i = 0; i < numberOfParticles; i++) {\n- double charge, radius, scale;\n- amoebaGeneralizedKirkwoodForce->getParticleParameters(i, charge, radius, scale);\n- amoebaGeneralizedKirkwoodForce->setParticleParameters(i, charge, 0.9*radius, 1.1*scale);\n+ double charge, radius, scale, descreenRadius, neckscale;\n+ amoebaGeneralizedKirkwoodForce->getParticleParameters(i, charge, radius, scale, descreenRadius, neckscale);\n+ amoebaGeneralizedKirkwoodForce->setParticleParameters(i, charge, 0.9*radius, 1.1*scale, 1.2*descreenRadius, 1.3*neckscale);\n }\n LangevinIntegrator integrator2(0.0, 0.1, 0.01);\n Context context2(system, integrator2, context.getPlatform());\ndiff --git a/plugins/amoeba/tests/TestAmoebaVdwForce.h b/plugins/amoeba/tests/TestAmoebaVdwForce.h\nindex 3500eae8f4..d6f7090c0d 100644\n--- a/plugins/amoeba/tests/TestAmoebaVdwForce.h\n+++ b/plugins/amoeba/tests/TestAmoebaVdwForce.h\n@@ -133,12 +133,12 @@ void testVdw() {\n }\n for (int ii = 0; ii < amoebaVdwForce->getNumParticles(); ii++) {\n int indexIV, type;\n- double sigma, epsilon, reduction;\n+ double sigma, epsilon, reduction, scaleFactor;\n bool isAlchemical;\n- amoebaVdwForce->getParticleParameters(ii, indexIV, sigma, epsilon, reduction, isAlchemical, type);\n+ amoebaVdwForce->getParticleParameters(ii, indexIV, sigma, epsilon, reduction, isAlchemical, type, scaleFactor);\n sigma *= AngstromToNm;\n epsilon *= CalToJoule;\n- amoebaVdwForce->setParticleParameters(ii, indexIV, sigma, epsilon, reduction, isAlchemical, type);\n+ amoebaVdwForce->setParticleParameters(ii, indexIV, sigma, epsilon, reduction, isAlchemical, type, scaleFactor);\n }\n Context context(system, integrator, platform);\n \n@@ -163,10 +163,10 @@ void testVdw() {\n \n for (int i = 0; i < numberOfParticles; i++) {\n int indexIV, type;\n- double mass, sigma, epsilon, reduction;\n+ double mass, sigma, epsilon, reduction, scaleFactor;\n bool isAlchemical;\n- amoebaVdwForce->getParticleParameters(i, indexIV, sigma, epsilon, reduction, isAlchemical, type);\n- amoebaVdwForce->setParticleParameters(i, indexIV, 0.9*sigma, 2.0*epsilon, 0.95*reduction, isAlchemical, type);\n+ amoebaVdwForce->getParticleParameters(i, indexIV, sigma, epsilon, reduction, isAlchemical, type, scaleFactor);\n+ amoebaVdwForce->setParticleParameters(i, indexIV, 0.9*sigma, 2.0*epsilon, 0.95*reduction, isAlchemical, type, scaleFactor);\n }\n LangevinIntegrator integrator2(0.0, 0.1, 0.01);\n Context context2(system, integrator2, platform);\ndiff --git a/plugins/amoeba/tests/TestWcaDispersionForce.h b/plugins/amoeba/tests/TestWcaDispersionForce.h\nindex 899b247955..b82129b924 100644\n--- a/plugins/amoeba/tests/TestWcaDispersionForce.h\n+++ b/plugins/amoeba/tests/TestWcaDispersionForce.h\n@@ -42,103 +42,122 @@\n \n #define ASSERT_EQUAL_TOL_MOD(expected, found, tol, testname) {double _scale_ = std::abs(expected) > 1.0 ? std::abs(expected) : 1.0; if (!(std::abs((expected)-(found))/_scale_ <= (tol))) {std::stringstream details; details << testname << \" Expected \"<<(expected)<<\", found \"<<(found); throwException(__FILE__, __LINE__, details.str());}};\n \n-#define ASSERT_EQUAL_VEC_MOD(expected, found, tol,testname) {ASSERT_EQUAL_TOL_MOD((expected)[0], (found)[0], (tol),(testname)); ASSERT_EQUAL_TOL_MOD((expected)[1], (found)[1], (tol),(testname)); ASSERT_EQUAL_TOL_MOD((expected)[2], (found)[2], (tol),(testname));};\n+#define ASSERT_EQUAL_VEC_MOD(expected, found, tol, testname) {ASSERT_EQUAL_TOL_MOD((expected)[0], (found)[0], (tol),(testname)); ASSERT_EQUAL_TOL_MOD((expected)[1], (found)[1], (tol),(testname)); ASSERT_EQUAL_TOL_MOD((expected)[2], (found)[2], (tol),(testname));};\n \n \n using namespace OpenMM;\n const double TOL = 1e-4;\n \n-void compareForcesEnergy(std::string& testName, double expectedEnergy, double energy,\n- const std::vector<Vec3>& expectedForces,\n- const std::vector<Vec3>& forces, double tolerance) {\n+void compareForcesEnergy(std::string &testName, double expectedEnergy, double energy,\n+ const std::vector<Vec3> &expectedForces,\n+ const std::vector<Vec3> &forces, double tolerance) {\n+\n for (unsigned int ii = 0; ii < forces.size(); ii++) {\n- ASSERT_EQUAL_VEC_MOD(expectedForces[ii], forces[ii], tolerance, testName);\n+ ASSERT_EQUAL_VEC_MOD(expectedForces[ii], forces[ii], tolerance, testName)\n }\n- ASSERT_EQUAL_TOL_MOD(expectedEnergy, energy, tolerance, testName);\n+ ASSERT_EQUAL_TOL_MOD(expectedEnergy, energy, tolerance, testName)\n }\n \n-// test Wca dispersion\n-\n+// Test Wca Dispersion\n void testWcaDispersionAmmonia() {\n \n- std::string testName = \"testWcaDispersionAmmonia\";\n-\n- int numberOfParticles = 8;\n+ std::string testName = \"testWcaDispersionAmmonia\";\n+ int numberOfParticles = 8;\n \n // Create the system.\n- \n+\n System system;\n- AmoebaWcaDispersionForce* amoebaWcaDispersionForce = new AmoebaWcaDispersionForce();;\n+ AmoebaWcaDispersionForce *amoebaWcaDispersionForce = new AmoebaWcaDispersionForce();\n+\n+ // Convert kcal/mol to kJ/mol\n+ double epso = 0.1100e0 * 4.184e0;\n+ double epsh = 0.0135e0 * 4.184e0;\n+ // Convert A to nm.\n+ double rmino = 1.7025e-01;\n+ double rminh = 1.3275e-01;\n+ double dispoff = 1.056e-01;\n+ // Convert water number density from water / A^3 to water / nm^3.\n+ double awater = 0.033428e03;\n+ // No units.\n+ double slevy = 1.0e0;\n+ double shctd = 0.75e0;\n+\n+ amoebaWcaDispersionForce->setEpso(epso);\n+ amoebaWcaDispersionForce->setEpsh(epsh);\n+ amoebaWcaDispersionForce->setRmino(rmino);\n+ amoebaWcaDispersionForce->setRminh(rminh);\n+ amoebaWcaDispersionForce->setDispoff(dispoff);\n+ amoebaWcaDispersionForce->setAwater(awater);\n+ amoebaWcaDispersionForce->setSlevy(slevy);\n+ amoebaWcaDispersionForce->setShctd(shctd);\n+\n+ // Amoeba 2009\n+ // vdwtype BUFFERED-14-7\n+ // radiusrule CUBIC-MEAN\n+ // radiustype R-MIN\n+ // radiussize DIAMETER\n+ // epsilonrule HHG\n+ // vdw 45 3.710000000 0.105000000\n+ // vdw 46 2.700000000 0.020000000 0.910\n \n- amoebaWcaDispersionForce->setEpso( 4.6024000e-01);\n- amoebaWcaDispersionForce->setEpsh( 5.6484000e-02);\n- amoebaWcaDispersionForce->setRmino( 1.7025000e-01);\n- amoebaWcaDispersionForce->setRminh( 1.3275000e-01);\n- amoebaWcaDispersionForce->setDispoff(2.6000000e-02);\n- amoebaWcaDispersionForce->setAwater( 3.3428000e+01);\n- amoebaWcaDispersionForce->setSlevy( 1.0000000e+00);\n- amoebaWcaDispersionForce->setShctd( 8.1000000e-01);\n+ for (unsigned int ii = 0; ii < 2; ii++) {\n+ system.addParticle(1.4007000e+01);\n+ amoebaWcaDispersionForce->addParticle(3.71e-01 / 2.0e0, 0.105e0 * 4.184e0);\n \n- // addParticle: radius, epsilon\n+ system.addParticle(1.0080000e+00);\n+ amoebaWcaDispersionForce->addParticle(2.7e-01 / 2.0e0, 0.02e0 * 4.184e0);\n \n- for (unsigned int ii = 0; ii < 2; ii++) {\n- system.addParticle( 1.4007000e+01);\n- amoebaWcaDispersionForce->addParticle( 1.8550000e-01, 4.3932000e-01);\n- \n- system.addParticle( 1.0080000e+00);\n- amoebaWcaDispersionForce->addParticle( 1.3500000e-01, 8.3680000e-02);\n- \n- system.addParticle( 1.0080000e+00);\n- amoebaWcaDispersionForce->addParticle( 1.3500000e-01, 8.3680000e-02);\n- \n- system.addParticle( 1.0080000e+00);\n- amoebaWcaDispersionForce->addParticle( 1.3500000e-01, 8.3680000e-02);\n+ system.addParticle(1.0080000e+00);\n+ amoebaWcaDispersionForce->addParticle(2.7e-01 / 2.0e0, 0.02e0 * 4.184e0);\n+\n+ system.addParticle(1.0080000e+00);\n+ amoebaWcaDispersionForce->addParticle(2.7e-01 / 2.0e0, 0.02e0 * 4.184e0);\n }\n \n std::vector<Vec3> positions(numberOfParticles);\n \n- positions[0] = Vec3( 1.5927280e-01, 1.7000000e-06, 1.6491000e-03);\n- positions[1] = Vec3( 2.0805540e-01, -8.1258800e-02, 3.7282500e-02);\n- positions[2] = Vec3( 2.0843610e-01, 8.0953200e-02, 3.7462200e-02);\n- positions[3] = Vec3( 1.7280780e-01, 2.0730000e-04, -9.8741700e-02);\n- positions[4] = Vec3( -1.6743680e-01, 1.5900000e-05, -6.6149000e-03);\n- positions[5] = Vec3( -2.0428260e-01, 8.1071500e-02, 4.1343900e-02);\n- positions[6] = Vec3( -6.7308300e-02, 1.2800000e-05, 1.0623300e-02);\n- positions[7] = Vec3( -2.0426290e-01, -8.1231400e-02, 4.1033500e-02);\n+ positions[0] = Vec3(1.57493055e-01, 0.00085545e-01, 0.12707740e-01);\n+ positions[1] = Vec3(1.94285651e-01, -0.81095826e-01, 0.60622179e-01);\n+ positions[2] = Vec3(1.95030610e-01, 0.80808023e-01, 0.60809749e-01);\n+ positions[3] = Vec3(1.99309092e-01, -0.00015413e-01, -0.79434283e-01);\n+ positions[4] = Vec3(-1.65212994e-01, 0.02174061e-01, -0.04650966e-01);\n+ positions[5] = Vec3(-1.97210029e-01, 0.82501943e-01, 0.47898953e-01);\n+ positions[6] = Vec3(-0.64164714e-01, 0.01492667e-01, 0.03495515e-01);\n+ positions[7] = Vec3(-1.98070588e-01, -0.79434787e-01, 0.45336787e-01);\n \n system.addForce(amoebaWcaDispersionForce);\n+ ASSERT(!amoebaWcaDispersionForce->usesPeriodicBoundaryConditions());\n+ ASSERT(!system.usesPeriodicBoundaryConditions());\n \n LangevinIntegrator integrator(0.0, 0.1, 0.01);\n Context context(system, integrator, platform);\n \n context.setPositions(positions);\n State state = context.getState(State::Forces | State::Energy);\n- std::vector<Vec3> forces = state.getForces();\n+ const std::vector<Vec3> &forces = state.getForces();\n double energy = state.getPotentialEnergy();\n \n- // TINKER-computed values\n-\n+ // Force Field X / Tinker expected energy -5.55412658 * 4.184 and forces.\n+ double expectedEnergy = -5.55412658 * 4.184;\n std::vector<Vec3> expectedForces(numberOfParticles);\n- double expectedEnergy = -2.6981209e+01;\n-\n- expectedForces[0] = Vec3( 4.7839388e+00, -7.3510133e-04, -5.0382764e-01);\n- expectedForces[1] = Vec3( 1.4657758e+00, 1.2431003e+00, -6.7075886e-01);\n- expectedForces[2] = Vec3( 1.4563936e+00, -1.2399917e+00, -6.7443841e-01);\n- expectedForces[3] = Vec3( 2.1116744e+00, -2.7407512e-03, 1.3271245e+00);\n- expectedForces[4] = Vec3( -4.7528440e+00, -1.5148066e-03, 1.2653813e+00);\n- expectedForces[5] = Vec3( -1.1875619e+00, -1.2866678e+00, -3.9109060e-01);\n- expectedForces[6] = Vec3( -2.6885679e+00, -4.3038639e-04, 3.3763583e-02);\n- expectedForces[7] = Vec3( -1.1888087e+00, 1.2889802e+00, -3.8615387e-01);\n-\n- double tolerance = 1.0e-04;\n+\n+ expectedForces[0] = Vec3(-0.33370779, 0.00478895, -0.18780836);\n+ expectedForces[1] = Vec3(1.15078615, 0.07363123, -0.04881103);\n+ expectedForces[2] = Vec3(1.14509754, -0.08727205, -0.05086123);\n+ expectedForces[3] = Vec3(0.97122614, -0.00473535, 0.09417216);\n+ expectedForces[4] = Vec3(-1.64874538, 0.01074006, -0.08477238);\n+ expectedForces[5] = Vec3(-1.28585908, 0.00494013, 0.05864744);\n+ expectedForces[6] = Vec3(1.28677671, -0.00915430, 0.16081161);\n+ expectedForces[7] = Vec3(-1.28557430, 0.00706132, 0.05862179);\n+\n+ double tolerance = 1.0e-04;\n compareForcesEnergy(testName, expectedEnergy, energy, expectedForces, forces, tolerance);\n- \n+\n // Try changing the particle parameters and make sure it's still correct.\n- \n for (int i = 0; i < numberOfParticles; i++) {\n double radius, epsilon;\n amoebaWcaDispersionForce->getParticleParameters(i, radius, epsilon);\n- amoebaWcaDispersionForce->setParticleParameters(i, 0.9*radius, 2.0*epsilon);\n+ amoebaWcaDispersionForce->setParticleParameters(i, 0.9 * radius, 2.0 * epsilon);\n }\n LangevinIntegrator integrator2(0.0, 0.1, 0.01);\n Context context2(system, integrator2, platform);\n@@ -148,7 +167,8 @@ void testWcaDispersionAmmonia() {\n bool exceptionThrown = false;\n try {\n // This should throw an exception.\n- compareForcesEnergy(testName, state1.getPotentialEnergy(), state2.getPotentialEnergy(), state1.getForces(), state2.getForces(), tolerance);\n+ compareForcesEnergy(testName, state1.getPotentialEnergy(), state2.getPotentialEnergy(), state1.getForces(),\n+ state2.getForces(), tolerance);\n }\n catch (std::exception ex) {\n exceptionThrown = true;\n@@ -156,7 +176,8 @@ void testWcaDispersionAmmonia() {\n ASSERT(exceptionThrown);\n amoebaWcaDispersionForce->updateParametersInContext(context);\n state1 = context.getState(State::Forces | State::Energy);\n- compareForcesEnergy(testName, state1.getPotentialEnergy(), state2.getPotentialEnergy(), state1.getForces(), state2.getForces(), tolerance);\n+ compareForcesEnergy(testName, state1.getPotentialEnergy(), state2.getPotentialEnergy(), state1.getForces(),\n+ state2.getForces(), tolerance);\n }\n \n void setupKernels(int argc, char* argv[]);\ndiff --git a/wrappers/python/tests/TestAPIUnits.py b/wrappers/python/tests/TestAPIUnits.py\nindex 715c2bc64b..63c877bbbb 100644\n--- a/wrappers/python/tests/TestAPIUnits.py\n+++ b/wrappers/python/tests/TestAPIUnits.py\n@@ -639,14 +639,14 @@ def testGeneralizedKirkwood(self):\n \n self.assertEqual(force.getNumParticles(), 2)\n \n- q, r, s = force.getParticleParameters(0)\n+ q, r, s, d, k = force.getParticleParameters(0)\n self.assertAlmostEqualUnit(q, 1.0*coulomb)\n self.assertIs(q.unit, elementary_charge)\n self.assertEqual(r, 1.0*angstroms)\n self.assertIs(r.unit, nanometer)\n self.assertEqual(s, 0.5)\n \n- q, r, s = force.getParticleParameters(1)\n+ q, r, s, d, k = force.getParticleParameters(1)\n self.assertAlmostEqualUnit(q, 1.0*elementary_charge)\n self.assertIs(q.unit, elementary_charge)\n self.assertEqual(r, 1.0*nanometer)\n@@ -759,44 +759,47 @@ def testAmoebaVdwForce(self):\n \n self.assertEqual(force.getNumParticles(), 3)\n \n- p, sig, eps, scale, alchemical, type = force.getParticleParameters(0)\n+ p, sig, eps, reduction, alchemical, type, scale = force.getParticleParameters(0)\n self.assertEqual(p, 0)\n self.assertEqual(sig, 0.1*nanometers)\n self.assertIs(sig.unit, nanometers)\n self.assertEqual(eps, 1.0*kilojoules_per_mole)\n self.assertIs(eps.unit, kilojoules_per_mole)\n- self.assertEqual(scale, 1.0)\n+ self.assertEqual(reduction, 1.0)\n self.assertEqual(type, -1)\n+ self.assertEqual(scale, 1.0)\n \n- p, sig, eps, scale, alchemical, type = force.getParticleParameters(1)\n+ p, sig, eps, reduction, alchemical, type, scale = force.getParticleParameters(1)\n self.assertEqual(p, 1)\n self.assertEqual(sig, 1.0*angstroms)\n self.assertIs(sig.unit, nanometers)\n self.assertEqual(eps, 1.0*kilocalories_per_mole)\n self.assertIs(eps.unit, kilojoules_per_mole)\n- self.assertEqual(scale, 0.5)\n+ self.assertEqual(reduction, 0.5)\n self.assertEqual(type, -1)\n+ self.assertEqual(scale, 1.0)\n \n- p, sig, eps, scale, alchemical, type = force.getParticleParameters(2)\n+ p, sig, eps, reduction, alchemical, type, scale = force.getParticleParameters(2)\n self.assertEqual(p, 1)\n self.assertAlmostEqualUnit(sig, 0.8*angstroms)\n self.assertIs(sig.unit, nanometers)\n self.assertEqual(eps, 2.0*kilocalories_per_mole)\n self.assertIs(eps.unit, kilojoules_per_mole)\n- self.assertEqual(scale, 0.25)\n+ self.assertEqual(reduction, 0.25)\n self.assertEqual(type, -1)\n+ self.assertEqual(scale, 1.0)\n \n def testAmoebaWcaDispersionForce(self):\n \"\"\" Tests the AmoebaWcaDispersionForce API features \"\"\"\n force = AmoebaWcaDispersionForce()\n \n- self.assertEqual(force.getDispoff(), 0.26*nanometer)\n- self.assertEqual(force.getAwater(), 0.033428*nanometer**-3)\n- self.assertEqual(force.getEpsh(), 0.0135*kilojoule_per_mole)\n- self.assertEqual(force.getEpso(), 0.11*kilojoule_per_mole)\n- self.assertEqual(force.getRminh(), 1.3275*nanometer)\n- self.assertEqual(force.getRmino(), 1.7025*nanometer)\n- self.assertEqual(force.getShctd(), 0.81)\n+ self.assertEqual(force.getDispoff(), 0.1056*nanometer)\n+ self.assertEqual(force.getAwater(), 33.428*nanometer**-3)\n+ self.assertEqual(force.getEpsh(), 0.056484*kilojoule_per_mole)\n+ self.assertEqual(force.getEpso(), 0.46024000000000004*kilojoule_per_mole)\n+ self.assertEqual(force.getRminh(), 0.13275*nanometer)\n+ self.assertEqual(force.getRmino(), 0.17025*nanometer)\n+ self.assertEqual(force.getShctd(), 0.82)\n self.assertEqual(force.getSlevy(), 1.0)\n \n force.setDispoff(3*angstroms)\ndiff --git a/wrappers/python/tests/systems/alanine-dipeptide-amoeba-forces.xml b/wrappers/python/tests/systems/alanine-dipeptide-amoeba-forces.xml\nindex f2e436ed0c..e7e22ded05 100644\n--- a/wrappers/python/tests/systems/alanine-dipeptide-amoeba-forces.xml\n+++ b/wrappers/python/tests/systems/alanine-dipeptide-amoeba-forces.xml\n@@ -1,32 +1,32 @@\n <?xml version=\"1.0\" ?>\n-<State time=\"0\" type=\"State\" version=\"1\">\n+<State openmmVersion=\"8.1\" stepCount=\"0\" time=\"0\" type=\"State\" version=\"1\">\n \t<PeriodicBoxVectors>\n \t\t<A x=\"2\" y=\"0\" z=\"0\"/>\n \t\t<B x=\"0\" y=\"2\" z=\"0\"/>\n \t\t<C x=\"0\" y=\"0\" z=\"2\"/>\n \t</PeriodicBoxVectors>\n \t<Forces>\n-\t\t<Force x=\"-60.899006905648534\" y=\"-704.8991281062977\" z=\".0364180169671772\"/>\n-\t\t<Force x=\"1179.7263311404506\" y=\"629.2168542831286\" z=\"1.563821009034657\"/>\n-\t\t<Force x=\"-484.4401097634541\" y=\"135.94210610096957\" z=\"558.0155391926069\"/>\n-\t\t<Force x=\"-484.1625627429897\" y=\"136.02915381525668\" z=\"-557.7203977673528\"/>\n-\t\t<Force x=\"-804.8403408476064\" y=\"-857.579131840898\" z=\"118.43755474210333\"/>\n-\t\t<Force x=\"84.24441920455223\" y=\"-421.86322192608037\" z=\"120.734742628977\"/>\n-\t\t<Force x=\"666.4942549112259\" y=\"-479.03339298154526\" z=\"19.66166555862896\"/>\n-\t\t<Force x=\"-518.9062723002917\" y=\"686.3850843706331\" z=\".7311137123231983\"/>\n-\t\t<Force x=\"-105.62094199225953\" y=\"710.9845370176521\" z=\"-508.0677463920413\"/>\n-\t\t<Force x=\"285.6690654282444\" y=\"-111.35548608152155\" z=\"847.8096733172159\"/>\n-\t\t<Force x=\"-396.4822698774795\" y=\"24.462223992557014\" z=\"297.9581483103431\"/>\n-\t\t<Force x=\"-168.22340166944585\" y=\"110.99779797739818\" z=\"-824.0916382722021\"/>\n-\t\t<Force x=\"805.7023041833917\" y=\"15.738288953519556\" z=\"-340.2263402925698\"/>\n-\t\t<Force x=\"366.3025998383222\" y=\"-647.7535895818237\" z=\"-273.83047817845636\"/>\n-\t\t<Force x=\"-649.7310636705703\" y=\"-495.52797252280067\" z=\"317.36013856851315\"/>\n-\t\t<Force x=\"-480.120788018345\" y=\"172.44477988154952\" z=\"-16.235455767965004\"/>\n-\t\t<Force x=\"-486.20230228601736\" y=\"982.6376366390087\" z=\"127.20818643942287\"/>\n-\t\t<Force x=\"820.5730252078641\" y=\"-78.71234329038225\" z=\"109.31395566365498\"/>\n-\t\t<Force x=\"355.03388135028814\" y=\"-1391.2776654673507\" z=\".9942543092954484\"/>\n-\t\t<Force x=\"-511.3467906691061\" y=\"677.7717086552518\" z=\".008253291392112616\"/>\n-\t\t<Force x=\"293.66157422204157\" y=\"452.68343054060256\" z=\"502.83463917630775\"/>\n-\t\t<Force x=\"293.5683952568295\" y=\"452.70832957117113\" z=\"-502.49604726620026\"/>\n+\t\t<Force x=\"-60.48934767780512\" y=\"-704.2905908945154\" z=\".03641801581402149\"/>\n+\t\t<Force x=\"1180.5929374826017\" y=\"629.7947038764579\" z=\"1.563821030008981\"/>\n+\t\t<Force x=\"-483.76818418432686\" y=\"136.17122858237818\" z=\"557.445557397338\"/>\n+\t\t<Force x=\"-483.4906371562492\" y=\"136.2582762991838\" z=\"-557.1504159715371\"/>\n+\t\t<Force x=\"-804.7241107189593\" y=\"-856.9162372174255\" z=\"118.25073365873143\"/>\n+\t\t<Force x=\"83.81135991157873\" y=\"-420.22160214948235\" z=\"120.49617758444118\"/>\n+\t\t<Force x=\"667.2849511622113\" y=\"-479.3499008055406\" z=\"19.235509803262467\"/>\n+\t\t<Force x=\"-518.4733820988154\" y=\"686.0855400714895\" z=\".7330333001425071\"/>\n+\t\t<Force x=\"-105.72909078977926\" y=\"711.0668343181237\" z=\"-508.83224725862544\"/>\n+\t\t<Force x=\"285.3169350792583\" y=\"-111.3017080984095\" z=\"846.4662870215625\"/>\n+\t\t<Force x=\"-397.35954566696427\" y=\"24.822763038626682\" z=\"299.33941483017065\"/>\n+\t\t<Force x=\"-168.27998965108577\" y=\"111.03576033655848\" z=\"-823.1461667946043\"/>\n+\t\t<Force x=\"804.8766900716053\" y=\"16.1343934366816\" z=\"-339.5169767615949\"/>\n+\t\t<Force x=\"365.43779472611493\" y=\"-647.3449172328129\" z=\"-273.0689393022661\"/>\n+\t\t<Force x=\"-649.0369250626607\" y=\"-495.932522816643\" z=\"316.96471153570917\"/>\n+\t\t<Force x=\"-479.0134208353095\" y=\"171.79575146148863\" z=\"-16.236401291749388\"/>\n+\t\t<Force x=\"-486.9195278219171\" y=\"982.2625867919138\" z=\"126.98779152341059\"/>\n+\t\t<Force x=\"819.7259822269968\" y=\"-78.87846748631466\" z=\"109.09059215425442\"/>\n+\t\t<Force x=\"354.68327095554434\" y=\"-1392.2195705508666\" z=\".9942543256763656\"/>\n+\t\t<Force x=\"-511.1150957463999\" y=\"676.962020571201\" z=\".008253289146054499\"/>\n+\t\t<Force x=\"293.38125738064446\" y=\"452.02037971976495\" z=\"502.28873599651723\"/>\n+\t\t<Force x=\"293.2880784137142\" y=\"452.0452787481405\" z=\"-501.95014408580874\"/>\n \t</Forces>\n </State>\n", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}89{"question_id": "MSB_openmm_openmm_pr4671", "question_type": "multi_swe_bench", "description": "Increase describeNextReport readability and allow requesting more values (openmm/openmm#4671)", "content": {"org": "openmm", "repo": "openmm", "pr_number": 4671, "issue_title": "Increase describeNextReport readability and allow requesting more values", "issue_body": "Fixes #4663 \r\nAlso harmonizes _generate_reports with #4437 \r\n\r\ndescribeNextReport can now return a dict instead of a tuple with the format\r\n`return {'steps':steps, 'periodic':False, 'include':['positions', 'forces']}`\r\n\r\nThe old tuple format is still supported.\r\n\r\nThis makes it mainly possible to also request parameterDerivatives for TI calculations without having to get the state for that reporter separately.\r\nIt also makes the output of describeNextReport much more readable than the previous tuple.\r\n\r\n---\r\n# Example\r\nFollowing is an example reporter utilizing the new format\r\n\r\n```python\r\nclass dUdLReporter(object):\r\n \"\"\"\r\n Reporter for printing out current dUdL values.\r\n\r\n Calculate derivative needs to be set for this to work.\r\n\r\n Based on openMM source code for StateDataReporter, and openMM user guide http://docs.openmm.org/latest/userguide/application/04_advanced_sim_examples.html#extracting-and-reporting-forces-and-other-data\r\n\r\n Args:\r\n object (_type_): _description_\r\n \"\"\"\r\n def __init__(self, file, reportInterval: int, derivativeNames: list, append: bool =False, timeUnit: unit = picosecond):\r\n \"\"\"\r\n Create reporter for writing out energies of individual force groups\r\n\r\n Args:\r\n file (str or stdout): where to print the values\r\n reportInterval (int): report every n steps\r\n derivativeNames (list, optional): List of str defining the names of derivatives to report.\r\n append (bool, optional): append to file. Defaults to False.\r\n timeUnit (mm.unit, optional): time unit to use. Defaults to unit.picosecond.\r\n \"\"\"\r\n\r\n self._append = append\r\n self._derivativeNames = derivativeNames\r\n self._reportInterval = reportInterval\r\n self._timeUnit = timeUnit\r\n\r\n # Open the file if it is a file, otherwise write directly to it (probably stdout)\r\n self._openedFile = isinstance(file, str)\r\n if self._openedFile:\r\n self._out = open(file, 'a' if append else 'w')\r\n else:\r\n self._out = file\r\n\r\n self._hasInitialized = False\r\n\r\n def __del__(self):\r\n # Close the file upon deletion\r\n if self._openedFile:\r\n self._out.close()\r\n\r\n def describeNextReport(self, simulation):\r\n # returns in how many steps the next report is due, and which kind of data it needs\r\n steps = self._reportInterval - simulation.currentStep%self._reportInterval\r\n return {'steps': steps, 'periodic': None, 'include':['parameterDerivatives']}\r\n\r\n def report(self, simulation, state=None):\r\n # Generates the report. Simulation and state is passed through by the openMM engine.\r\n\r\n # print header if it is the first time this object has been called and is not set to append.\r\n if not self._hasInitialized:\r\n self._hasInitialized = True\r\n if not self._append:\r\n header = ','.join(self._derivativeNames)\r\n header = \"time,\" + header\r\n\r\n print(header, file=self._out)\r\n try:\r\n self._out.flush()\r\n except AttributeError:\r\n pass\r\n\r\n derivatives = []\r\n if state is None:\r\n state = simulation.context.getState(getParameterDerivatives=True)\r\n \r\n for derivativeName in self._derivativeNames:\r\n derivatives.append(f\"{state.getEnergyParameterDerivatives()[derivativeName]: .8f}\")\r\n\r\n values = ','.join(derivatives)\r\n values = f\"{state.getTime().value_in_unit(self._timeUnit): .2f},{values}\"\r\n\r\n print(values, file=self._out)\r\n try:\r\n self._out.flush()\r\n except AttributeError:\r\n pass\r\n```\r\n\r\n---\r\n# Todo\r\n\r\n- [x] write documentation\r\n\r\n---\r\n# Additional thoughts\r\n\r\nIt might also make sense to include a reporter similar as the one above.\r\n\r\nShould existing reporters be adjusted to match the proposed format?\r\n", "base_commit": "bcc3442ee0a2594247c1bb305b327992db2c4779", "resolved_issues": [{"number": 4663, "title": "Allow to request all parameters context.getState hast to offer from a reporters describeNextReport() function", "body": "At the moment, custom reporters are not able to request parameter derivatives or integrator parameters for their next report.\r\n\r\nhttps://github.com/openmm/openmm/blob/fed44c579e9ac3136fe38056968a9c6dc1b6931e/wrappers/python/openmm/app/simulation.py#L254-L272\r\n\r\nCurrently, to get parameter derivatives using a custom reporter, the state needs to be fetched separately.\r\n\r\nI can make the changes and create a pull request if desired.\n\n## IMPORTANT INSTRUCTIONS\n\n1. If you edit a python file, you MUST run 'make PythonInstall' inside the build directory\n2. If you edit a c++ file, you MUST run 'make -j4 && make install\" inside the build directory"}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/openmm_m_openmm:pr-4671", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/docs-source/usersguide/application/04_advanced_sim_examples.rst b/docs-source/usersguide/application/04_advanced_sim_examples.rst\nindex 88e550caf3..88f49959e3 100644\n--- a/docs-source/usersguide/application/04_advanced_sim_examples.rst\n+++ b/docs-source/usersguide/application/04_advanced_sim_examples.rst\n@@ -137,7 +137,7 @@ Here is the definition of the :class:`ForceReporter` class:\n \n def describeNextReport(self, simulation):\n steps = self._reportInterval - simulation.currentStep%self._reportInterval\n- return (steps, False, False, True, False, None)\n+ return = {'steps': steps, 'periodic': None, 'include':['forces']}\n \n def report(self, simulation, state):\n forces = state.getForces().value_in_unit(kilojoules/mole/nanometer)\n@@ -157,18 +157,14 @@ We then have two methods that every reporter must implement:\n :meth:`describeNextReport()` and :meth:`report()`. A Simulation object\n periodically calls :meth:`describeNextReport()` on each of its reporters to\n find out when that reporter will next generate a report, and what information\n-will be needed to generate it. The return value should be a six element tuple,\n-whose elements are as follows:\n+will be needed to generate it. The return value should be a dictionary with the following content:\n \n-* The number of time steps until the next report. We calculate this as\n+* :code:`steps` (int): The number of time steps until the next report. We calculate this as\n *(report interval)*\\ -\\ *(current step)*\\ %\\ *(report interval)*\\ . For\n example, if we want a report every 100 steps and the simulation is currently on\n step 530, we will return 100-(530%100) = 70.\n-* Whether the next report will need particle positions.\n-* Whether the next report will need particle velocities.\n-* Whether the next report will need forces.\n-* Whether the next report will need energies.\n-* Whether the positions should be wrapped to the periodic box. If None, it will\n+* :code:`include` (list of strings): The types of information that need to be included in the next report. The values in the list correspond to arguments to :meth:`Context.getState()`. Allowed values include :code:`'positions'`, :code:`'velocities'`, :code:`'forces'`, :code:`'energy'`, :code:`'parameters'`, :code:`'parameterDerivatives'`, and :code:`'integratorParameters'`.\n+* :code:`periodic` (bool, optional): Whether the positions should be wrapped to the periodic box. If None or not set, it will\n automatically decide whether to wrap positions based on whether the System uses\n periodic boundary conditions.\n \ndiff --git a/wrappers/python/openmm/app/checkpointreporter.py b/wrappers/python/openmm/app/checkpointreporter.py\nindex 9177d2c17e..ebff7e8645 100644\n--- a/wrappers/python/openmm/app/checkpointreporter.py\n+++ b/wrappers/python/openmm/app/checkpointreporter.py\n@@ -110,14 +110,11 @@ def describeNextReport(self, simulation):\n \n Returns\n -------\n- tuple\n- A five element tuple. The first element is the number of steps\n- until the next report. The remaining elements specify whether\n- that report will require positions, velocities, forces, and\n- energies respectively.\n+ dict\n+ A dictionary describing the required information for the next report\n \"\"\"\n steps = self._reportInterval - simulation.currentStep%self._reportInterval\n- return (steps, False, False, False, False)\n+ return {'steps':steps, 'periodic':None, 'include':[]}\n \n def report(self, simulation, state):\n \"\"\"Generate a report.\ndiff --git a/wrappers/python/openmm/app/dcdreporter.py b/wrappers/python/openmm/app/dcdreporter.py\nindex f9020a6a82..09b1d9439a 100644\n--- a/wrappers/python/openmm/app/dcdreporter.py\n+++ b/wrappers/python/openmm/app/dcdreporter.py\n@@ -78,15 +78,11 @@ def describeNextReport(self, simulation):\n \n Returns\n -------\n- tuple\n- A six element tuple. The first element is the number of steps\n- until the next report. The next four elements specify whether\n- that report will require positions, velocities, forces, and\n- energies respectively. The final element specifies whether\n- positions should be wrapped to lie in a single periodic box.\n+ dict\n+ A dictionary describing the required information for the next report\n \"\"\"\n steps = self._reportInterval - simulation.currentStep%self._reportInterval\n- return (steps, True, False, False, False, self._enforcePeriodicBox)\n+ return {'steps':steps, 'periodic':self._enforcePeriodicBox, 'include':['positions']}\n \n def report(self, simulation, state):\n \"\"\"Generate a report.\ndiff --git a/wrappers/python/openmm/app/internal/debuggingreporter.py b/wrappers/python/openmm/app/internal/debuggingreporter.py\nindex 2889b4dfd8..05eebf3a4c 100644\n--- a/wrappers/python/openmm/app/internal/debuggingreporter.py\n+++ b/wrappers/python/openmm/app/internal/debuggingreporter.py\n@@ -67,14 +67,10 @@ def describeNextReport(self, simulation):\n \n Returns\n -------\n- tuple\n- A six element tuple. The first element is the number of steps\n- until the next report. The next four elements specify whether\n- that report will require positions, velocities, forces, and\n- energies respectively. The final element specifies whether\n- positions should be wrapped to lie in a single periodic box.\n+ dict\n+ A dictionary describing the required information for the next report\n \"\"\"\n- return (1, True, True, True, False, False)\n+ return {'steps':1, 'periodic':False, 'include':['positions', 'velocities', 'forces']}\n \n def report(self, simulation, state):\n \"\"\"Generate a report.\ndiff --git a/wrappers/python/openmm/app/pdbreporter.py b/wrappers/python/openmm/app/pdbreporter.py\nindex d9b6c7593c..256ed36f17 100644\n--- a/wrappers/python/openmm/app/pdbreporter.py\n+++ b/wrappers/python/openmm/app/pdbreporter.py\n@@ -77,15 +77,11 @@ def describeNextReport(self, simulation):\n \n Returns\n -------\n- tuple\n- A six element tuple. The first element is the number of steps\n- until the next report. The next four elements specify whether\n- that report will require positions, velocities, forces, and\n- energies respectively. The final element specifies whether\n- positions should be wrapped to lie in a single periodic box.\n+ dict\n+ A dictionary describing the required information for the next report\n \"\"\"\n steps = self._reportInterval - simulation.currentStep%self._reportInterval\n- return (steps, True, False, False, False, self._enforcePeriodicBox)\n+ return {'steps':steps, 'periodic':self._enforcePeriodicBox, 'include':['positions']}\n \n def report(self, simulation, state):\n \"\"\"Generate a report.\ndiff --git a/wrappers/python/openmm/app/simulatedtempering.py b/wrappers/python/openmm/app/simulatedtempering.py\nindex 1451b69b91..b4a23fafa4 100644\n--- a/wrappers/python/openmm/app/simulatedtempering.py\n+++ b/wrappers/python/openmm/app/simulatedtempering.py\n@@ -176,7 +176,10 @@ def describeNextReport(self, simulation):\n steps2 = st.reportInterval - simulation.currentStep%st.reportInterval\n steps = min(steps1, steps2)\n isUpdateAttempt = (steps1 == steps)\n- return (steps, False, isUpdateAttempt, False, isUpdateAttempt)\n+ if isUpdateAttempt:\n+ return {'steps': steps, 'periodic':None, 'include':['velocities', 'energy']}\n+ else:\n+ return {'steps': steps, 'periodic':None, 'include':[]}\n \n def report(self, simulation, state):\n st = self.st\ndiff --git a/wrappers/python/openmm/app/simulation.py b/wrappers/python/openmm/app/simulation.py\nindex 3270f6f785..4e7b78f628 100644\n--- a/wrappers/python/openmm/app/simulation.py\n+++ b/wrappers/python/openmm/app/simulation.py\n@@ -206,9 +206,23 @@ def _simulate(self, endStep=None, endTime=None):\n \n anyReport = False\n for i, reporter in enumerate(self.reporters):\n- nextReport[i] = reporter.describeNextReport(self)\n- if nextReport[i][0] > 0 and nextReport[i][0] <= nextSteps:\n- nextSteps = nextReport[i][0]\n+ report = reporter.describeNextReport(self)\n+ # convert to new dict format if the report is in the old tuple format\n+ if isinstance(report, tuple):\n+ report_dict = {'steps': report[0]}\n+\n+ if len(report) > 5:\n+ report_dict['periodic'] = report[5]\n+\n+ includes = ['positions', 'velocities', 'forces', 'energy']\n+ report_dict['include'] = [includes[i] for i in range(4) if report[i+1]]\n+ report = report_dict\n+ nextReport[i] = report\n+ \n+ steps = nextReport[i]['steps']\n+\n+ if steps > 0 and steps <= nextSteps:\n+ nextSteps = steps\n anyReport = True\n stepsToGo = nextSteps\n while stepsToGo > 10:\n@@ -226,19 +240,16 @@ def _simulate(self, endStep=None, endTime=None):\n unwrapped = []\n either = []\n for reporter, report in zip(self.reporters, nextReport):\n- if report[0] == nextSteps:\n- if len(report) > 5:\n- wantWrap = report[5]\n- if wantWrap is None:\n- wantWrap = self._usesPBC\n- else:\n- wantWrap = self._usesPBC\n- if not report[1]:\n+ if report['steps'] == nextSteps:\n+ wantWrap = self._usesPBC if report.get('periodic') is None else report['periodic']\n+\n+ if not 'positions' in report['include']: # if no positions are requested, we don't care about pbc\n either.append((reporter, report))\n elif wantWrap:\n wrapped.append((reporter, report))\n else:\n unwrapped.append((reporter, report))\n+\n if len(wrapped) > len(unwrapped):\n wrapped += either\n else:\n@@ -252,23 +263,22 @@ def _simulate(self, endStep=None, endTime=None):\n self._generate_reports(unwrapped, False)\n \n def _generate_reports(self, reports, periodic):\n- getPositions = False\n- getVelocities = False\n- getForces = False\n- getEnergy = False\n- for reporter, next in reports:\n- if next[1]:\n- getPositions = True\n- if next[2]:\n- getVelocities = True\n- if next[3]:\n- getForces = True\n- if next[4]:\n- getEnergy = True\n- state = self.context.getState(positions=getPositions, velocities=getVelocities, forces=getForces,\n- energy=getEnergy, parameters=True, enforcePeriodicBox=periodic,\n- groups=self.context.getIntegrator().getIntegrationForceGroups())\n- for reporter, next in reports:\n+ '''Generate reports for all requested reporters\n+\n+ Parameters\n+ ----------\n+ reports : list of tuples\n+ each tuple in the list contains a reporter object and a description of the next report produced by reporter.describeNextReport().\n+ Note that the old format of returning a tuple from reporter.describeNextReport() is not supported in this function.\n+ periodic : bool\n+ Specifies whether particle positions should be translated so the center of every molecule lies in the same periodic box.\n+ '''\n+ \n+ includes = set.union(*[set(report[1]['include']) for report in reports])\n+ includeArgs = {property:True for property in includes}\n+\n+ state = self.context.getState(groups=self.context.getIntegrator().getIntegrationForceGroups(), enforcePeriodicBox=periodic, parameters=True, **includeArgs)\n+ for reporter, nextReport in reports:\n reporter.report(self, state)\n \n def saveCheckpoint(self, file):\ndiff --git a/wrappers/python/openmm/app/statedatareporter.py b/wrappers/python/openmm/app/statedatareporter.py\nindex 64b3b14a79..9ea620bb23 100644\n--- a/wrappers/python/openmm/app/statedatareporter.py\n+++ b/wrappers/python/openmm/app/statedatareporter.py\n@@ -158,6 +158,7 @@ def __init__(self, file, reportInterval, step=False, time=False, potentialEnergy\n self._needsVelocities = False\n self._needsForces = False\n self._needEnergy = potentialEnergy or kineticEnergy or totalEnergy or temperature\n+ self._includes = ['energy'] if self._needEnergy else []\n \n def describeNextReport(self, simulation):\n \"\"\"Get information about the next report this object will generate.\n@@ -169,14 +170,11 @@ def describeNextReport(self, simulation):\n \n Returns\n -------\n- tuple\n- A five element tuple. The first element is the number of steps\n- until the next report. The remaining elements specify whether\n- that report will require positions, velocities, forces, and\n- energies respectively.\n+ dict\n+ A dictionary describing the required information for the next report\n \"\"\"\n steps = self._reportInterval - simulation.currentStep%self._reportInterval\n- return (steps, self._needsPositions, self._needsVelocities, self._needsForces, self._needEnergy)\n+ return {'steps':steps, 'periodic':None, 'include':self._includes}\n \n def report(self, simulation, state):\n \"\"\"Generate a report.\ndiff --git a/wrappers/python/openmm/app/xtcreporter.py b/wrappers/python/openmm/app/xtcreporter.py\nindex c37d15e08a..38ef3b4d2d 100644\n--- a/wrappers/python/openmm/app/xtcreporter.py\n+++ b/wrappers/python/openmm/app/xtcreporter.py\n@@ -42,15 +42,11 @@ def describeNextReport(self, simulation):\n \n Returns\n -------\n- tuple\n- A six element tuple. The first element is the number of steps\n- until the next report. The next four elements specify whether\n- that report will require positions, velocities, forces, and\n- energies respectively. The final element specifies whether\n- positions should be wrapped to lie in a single periodic box.\n+ dict\n+ A dictionary describing the required information for the next report\n \"\"\"\n- steps = self._reportInterval - simulation.currentStep % self._reportInterval\n- return (steps, True, False, False, False, self._enforcePeriodicBox)\n+ steps = self._reportInterval - simulation.currentStep%self._reportInterval\n+ return {'steps':steps, 'periodic':self._enforcePeriodicBox, 'include':['positions']}\n \n def report(self, simulation, state):\n \"\"\"Generate a report.\n"}, "test": {"test_patch": "diff --git a/wrappers/python/tests/TestSimulation.py b/wrappers/python/tests/TestSimulation.py\nindex aa26895634..68ba979670 100644\n--- a/wrappers/python/tests/TestSimulation.py\n+++ b/wrappers/python/tests/TestSimulation.py\n@@ -179,7 +179,7 @@ def __init__(self, periodic):\n \n def describeNextReport(self, simulation):\n steps = self.interval - simulation.currentStep%self.interval\n- return (steps, True, False, False, False, self.periodic)\n+ return {'steps':steps, 'periodic':self.periodic, 'include':['positions']}\n \n def report(self, simulation, state):\n state2 = simulation.context.getState(getPositions=True, enforcePeriodicBox=self.periodic)\n", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}90{"question_id": "MSB_openmm_openmm_pr4732", "question_type": "multi_swe_bench", "description": "updateParametersInContext() can modify parameter offsets (openmm/openmm#4732)", "content": {"org": "openmm", "repo": "openmm", "pr_number": 4732, "issue_title": "updateParametersInContext() can modify parameter offsets", "issue_body": "Fixes #4724.", "base_commit": "027fed2a57a55b1e0c74dad3e8d565dd3d5be1e7", "resolved_issues": [{"number": 4724, "title": "Update offset parameters in context?", "body": "Dear Devs, \r\n\r\nWas playing around with particle offsets and realised that you cannot update them in context without reinitializing.\r\n\r\nDoes it make sense that `updateParametersInContext` should also be suitable for updating offset parameters such as `chargeScale`?\r\n\r\nSmall example extended from #3054\r\n```\r\nimport openmm\r\nfrom openmm import unit\r\n\r\ndef generateSystem():\r\n system = openmm.System()\r\n system.addParticle(1)\r\n system.addParticle(1)\r\n return system\r\n\r\ndef generateContext(system):\r\n context = openmm.Context(system, openmm.LangevinIntegrator(298 * unit.kelvin, 1 / unit.picosecond, 2 * unit.femtosecond))\r\n context.setPeriodicBoxVectors(openmm.Vec3(1, 0, 0), openmm.Vec3(0, 1, 0), openmm.Vec3(0, 0, 1))\r\n context.setPositions([openmm.Vec3(0, 0, 0), openmm.Vec3(0.4, 0, 0)])\r\n return context\r\n\r\n# generate a simple system of two Lennard-Jones particles\r\nsystem = generateSystem()\r\nforce = openmm.NonbondedForce()\r\nsystem.addForce(force)\r\nforce.addParticle(5 * unit.elementary_charge, 1 * unit.nanometer, 0 * unit.kilocalories_per_mole)\r\nforce.addParticle(-5 * unit.elementary_charge, 1 * unit.nanometer, 0 * unit.kilocalories_per_mole)\r\nforce.addGlobalParameter(\"lambda\", 0)\r\nforce.setNonbondedMethod(openmm.NonbondedForce.CutoffPeriodic)\r\nforce.setCutoffDistance(0.5 * unit.nanometer)\r\ncontext = generateContext(system)\r\n\r\nprint(\"Unperturbed:\", context.getState(getEnergy=True).getPotentialEnergy())\r\n\r\noffset_id = force.addParticleParameterOffset(\"lambda\", 1, 0, 0, 0) # Charge scale is 0 so will not impact the energy regardless lamba\r\ncontext = generateContext(system)\r\nprint(\"Should be the same:\", context.getState(getEnergy=True).getPotentialEnergy())\r\n\r\ncontext.setParameter('lambda', 1)\r\nprint(\"Should still be the same:\", context.getState(getEnergy=True).getPotentialEnergy())\r\n\r\nforce.setParticleParameterOffset(offset_id, \"lambda\", 1, 100, 0, 0) # Change charge scale to something a bit crazy\r\nforce.updateParametersInContext(context)\r\nprint(\"Should be different:\", context.getState(getEnergy=True).getPotentialEnergy())\r\n\r\ncontext.setParameter('lambda', 0.5)\r\nprint(\"Should be different again:\", context.getState(getEnergy=True).getPotentialEnergy())\r\n\r\ncontext.reinitialize(preserveState=True)\r\nprint(\"Does this work?:\", context.getState(getEnergy=True).getPotentialEnergy())\r\n```\r\n\r\nMany thanks as always!\n\n## IMPORTANT INSTRUCTIONS\n\n1. If you edit a python file, you MUST run 'make PythonInstall' inside the build directory\n2. If you edit a c++ file, you MUST run 'make -j4 && make install\" inside the build directory"}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/openmm_m_openmm:pr-4732", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/openmmapi/include/openmm/NonbondedForce.h b/openmmapi/include/openmm/NonbondedForce.h\nindex f320b611ce..cec596e28d 100644\n--- a/openmmapi/include/openmm/NonbondedForce.h\n+++ b/openmmapi/include/openmm/NonbondedForce.h\n@@ -572,11 +572,13 @@ class OPENMM_EXPORT NonbondedForce : public Force {\n * Simply call setParticleParameters() and setExceptionParameters() to modify this object's parameters, then call\n * updateParametersInContext() to copy them over to the Context.\n *\n- * This method has several limitations. The only information it updates is the parameters of particles and exceptions.\n- * All other aspects of the Force (the nonbonded method, the cutoff distance, etc.) are unaffected and can only be\n- * changed by reinitializing the Context. Furthermore, only the chargeProd, sigma, and epsilon values of an exception\n- * can be changed; the pair of particles involved in the exception cannot change. Finally, this method cannot be used\n- * to add new particles or exceptions, only to change the parameters of existing ones.\n+ * This method has several limitations. The only information it updates is the parameters of particles and exceptions,\n+ * as well as parameter offsets for particles and exceptions. All other aspects of the Force (the nonbonded method,\n+ * the cutoff distance, etc.) are unaffected and can only be changed by reinitializing the Context. Furthermore,\n+ * only the chargeProd, sigma, and epsilon values of an exception can be changed; the pair of particles involved in the\n+ * exception cannot change. Likewise, it can update charge, sigma and epsilon for a parameter offset, but not the\n+ * identify of the particle or exception the offset is applied to, or which global parameter it is based on. Finally,\n+ * this method cannot be used to add new particles or exceptions, only to change the parameters of existing ones.\n */\n void updateParametersInContext(Context& context);\n /**\ndiff --git a/platforms/cpu/include/CpuKernels.h b/platforms/cpu/include/CpuKernels.h\nindex 80ed68cfdb..c51e7594d1 100644\n--- a/platforms/cpu/include/CpuKernels.h\n+++ b/platforms/cpu/include/CpuKernels.h\n@@ -278,6 +278,7 @@ class CpuCalcNonbondedForceKernel : public CalcNonbondedForceKernel {\n int numParticles, num14, chargePosqIndex, ljPosqIndex;\n std::vector<std::vector<int> > bonded14IndexArray;\n std::vector<std::vector<double> > bonded14ParamArray;\n+ std::map<int, int> nb14Index;\n double nonbondedCutoff, switchingDistance, rfDielectric, ewaldAlpha, ewaldDispersionAlpha, ewaldSelfEnergy, dispersionCoefficient;\n int kmax[3], gridSize[3], dispersionGridSize[3];\n bool useSwitchingFunction, exceptionsArePeriodic, useOptimizedPme, hasInitializedPme, hasInitializedDispersionPme, hasParticleOffsets, hasExceptionOffsets;\ndiff --git a/platforms/cpu/src/CpuKernels.cpp b/platforms/cpu/src/CpuKernels.cpp\nindex 0d642adba4..d4d2a78096 100644\n--- a/platforms/cpu/src/CpuKernels.cpp\n+++ b/platforms/cpu/src/CpuKernels.cpp\n@@ -506,7 +506,6 @@ void CpuCalcNonbondedForceKernel::initialize(const System& system, const Nonbond\n numParticles = force.getNumParticles();\n exclusions.resize(numParticles);\n vector<int> nb14s;\n- map<int, int> nb14Index;\n for (int i = 0; i < force.getNumExceptions(); i++) {\n int particle1, particle2;\n double chargeProd, sigma, epsilon;\n@@ -753,6 +752,32 @@ void CpuCalcNonbondedForceKernel::copyParametersToContext(ContextImpl& context,\n bonded14IndexArray[i][0] = particle1;\n bonded14IndexArray[i][1] = particle2;\n }\n+ particleParamOffsets.clear();\n+ exceptionParamOffsets.clear();\n+ particleParamOffsets.resize(force.getNumParticles());\n+ exceptionParamOffsets.resize(force.getNumExceptions());\n+ for (int i = 0; i < force.getNumParticleParameterOffsets(); i++) {\n+ string param;\n+ int particle;\n+ double charge, sigma, epsilon;\n+ force.getParticleParameterOffset(i, param, particle, charge, sigma, epsilon);\n+ auto paramPos = find(paramNames.begin(), paramNames.end(), param);\n+ if (paramPos == paramNames.end())\n+ throw OpenMMException(\"updateParametersInContext: The parameter of a particle parameter offset has changed\");\n+ int paramIndex = paramPos-paramNames.begin();\n+ particleParamOffsets[particle].push_back(make_tuple(charge, sigma, epsilon, paramIndex));\n+ }\n+ for (int i = 0; i < force.getNumExceptionParameterOffsets(); i++) {\n+ string param;\n+ int exception;\n+ double charge, sigma, epsilon;\n+ force.getExceptionParameterOffset(i, param, exception, charge, sigma, epsilon);\n+ auto paramPos = find(paramNames.begin(), paramNames.end(), param);\n+ if (paramPos == paramNames.end())\n+ throw OpenMMException(\"updateParametersInContext: The parameter of an exception parameter offset has changed\");\n+ int paramIndex = paramPos-paramNames.begin();\n+ exceptionParamOffsets[nb14Index[exception]].push_back(make_tuple(charge, sigma, epsilon, paramIndex));\n+ }\n computeParameters(context, false);\n \n // Recompute the coefficient for the dispersion correction.\ndiff --git a/platforms/cuda/include/CudaKernels.h b/platforms/cuda/include/CudaKernels.h\nindex 4f4c8587ff..968bb38192 100644\n--- a/platforms/cuda/include/CudaKernels.h\n+++ b/platforms/cuda/include/CudaKernels.h\n@@ -211,6 +211,7 @@ class CudaCalcNonbondedForceKernel : public CalcNonbondedForceKernel {\n std::vector<std::pair<int, int> > exceptionAtoms;\n std::vector<std::string> paramNames;\n std::vector<double> paramValues;\n+ std::map<int, int> exceptionIndex;\n double ewaldSelfEnergy, dispersionCoefficient, alpha, dispersionAlpha;\n int interpolateForceThreads;\n int gridSizeX, gridSizeY, gridSizeZ;\ndiff --git a/platforms/cuda/src/CudaKernels.cpp b/platforms/cuda/src/CudaKernels.cpp\nindex 224e18c68a..a807716c29 100644\n--- a/platforms/cuda/src/CudaKernels.cpp\n+++ b/platforms/cuda/src/CudaKernels.cpp\n@@ -89,8 +89,35 @@ double CudaCalcForcesAndEnergyKernel::finishComputation(ContextImpl& context, bo\n class CudaCalcNonbondedForceKernel::ForceInfo : public CudaForceInfo {\n public:\n ForceInfo(const NonbondedForce& force) : force(force) {\n+ particleOffset.resize(force.getNumParticles(), -1);\n+ exceptionOffset.resize(force.getNumExceptions(), -1);\n+ for (int i = 0; i < force.getNumParticleParameterOffsets(); i++) {\n+ string parameter;\n+ int particleIndex;\n+ double chargeScale, sigmaScale, epsilonScale;\n+ force.getParticleParameterOffset(i, parameter, particleIndex, chargeScale, sigmaScale, epsilonScale);\n+ particleOffset[particleIndex] = i;\n+ }\n+ for (int i = 0; i < force.getNumExceptionParameterOffsets(); i++) {\n+ string parameter;\n+ int exceptionIndex;\n+ double chargeProdScale, sigmaScale, epsilonScale;\n+ force.getExceptionParameterOffset(i, parameter, exceptionIndex, chargeProdScale, sigmaScale, epsilonScale);\n+ exceptionOffset[exceptionIndex] = i;\n+ }\n }\n bool areParticlesIdentical(int particle1, int particle2) {\n+ if (particleOffset[particle1] != -1 || particleOffset[particle2] != -1) {\n+ if (particleOffset[particle1] == -1 || particleOffset[particle2] == -1)\n+ return false;\n+ string parameter1, parameter2;\n+ int particleIndex1, particleIndex2;\n+ double chargeScale1, sigmaScale1, epsilonScale1, chargeScale2, sigmaScale2, epsilonScale2;\n+ force.getParticleParameterOffset(particleOffset[particle1], parameter1, particleIndex1, chargeScale1, sigmaScale1, epsilonScale1);\n+ force.getParticleParameterOffset(particleOffset[particle2], parameter2, particleIndex2, chargeScale2, sigmaScale2, epsilonScale2);\n+ if (parameter1 != parameter2 || chargeScale1 != chargeScale2 || sigmaScale1 != sigmaScale2 || epsilonScale1 != epsilonScale2)\n+ return false;\n+ }\n double charge1, charge2, sigma1, sigma2, epsilon1, epsilon2;\n force.getParticleParameters(particle1, charge1, sigma1, epsilon1);\n force.getParticleParameters(particle2, charge2, sigma2, epsilon2);\n@@ -108,6 +135,17 @@ class CudaCalcNonbondedForceKernel::ForceInfo : public CudaForceInfo {\n particles[1] = particle2;\n }\n bool areGroupsIdentical(int group1, int group2) {\n+ if (exceptionOffset[group1] != -1 || exceptionOffset[group2] != -1) {\n+ if (exceptionOffset[group1] == -1 || exceptionOffset[group2] == -1)\n+ return false;\n+ string parameter1, parameter2;\n+ int exceptionIndex1, exceptionIndex2;\n+ double chargeProdScale1, sigmaScale1, epsilonScale1, chargeProdScale2, sigmaScale2, epsilonScale2;\n+ force.getExceptionParameterOffset(exceptionOffset[group1], parameter1, exceptionIndex1, chargeProdScale1, sigmaScale1, epsilonScale1);\n+ force.getExceptionParameterOffset(exceptionOffset[group2], parameter2, exceptionIndex2, chargeProdScale2, sigmaScale2, epsilonScale2);\n+ if (parameter1 != parameter2 || chargeProdScale1 != chargeProdScale2 || sigmaScale1 != sigmaScale2 || epsilonScale1 != epsilonScale2)\n+ return false;\n+ }\n int particle1, particle2;\n double chargeProd1, chargeProd2, sigma1, sigma2, epsilon1, epsilon2;\n force.getExceptionParameters(group1, particle1, particle2, chargeProd1, sigma1, epsilon1);\n@@ -116,6 +154,7 @@ class CudaCalcNonbondedForceKernel::ForceInfo : public CudaForceInfo {\n }\n private:\n const NonbondedForce& force;\n+ vector<int> particleOffset, exceptionOffset;\n };\n \n class CudaCalcNonbondedForceKernel::PmeIO : public CalcPmeReciprocalForceKernel::IO {\n@@ -253,7 +292,6 @@ void CudaCalcNonbondedForceKernel::initialize(const System& system, const Nonbon\n }\n vector<pair<int, int> > exclusions;\n vector<int> exceptions;\n- map<int, int> exceptionIndex;\n for (int i = 0; i < force.getNumExceptions(); i++) {\n int particle1, particle2;\n double chargeProd, sigma, epsilon;\n@@ -1126,12 +1164,58 @@ void CudaCalcNonbondedForceKernel::copyParametersToContext(ContextImpl& context,\n }\n baseExceptionParams.upload(baseExceptionParamsVec);\n }\n- \n+\n+ // Record parameter offsets.\n+\n+ vector<vector<mm_float4> > particleOffsetVec(force.getNumParticles());\n+ vector<vector<mm_float4> > exceptionOffsetVec(numExceptions);\n+ for (int i = 0; i < force.getNumParticleParameterOffsets(); i++) {\n+ string param;\n+ int particle;\n+ double charge, sigma, epsilon;\n+ force.getParticleParameterOffset(i, param, particle, charge, sigma, epsilon);\n+ auto paramPos = find(paramNames.begin(), paramNames.end(), param);\n+ if (paramPos == paramNames.end())\n+ throw OpenMMException(\"updateParametersInContext: The parameter of a particle parameter offset has changed\");\n+ int paramIndex = paramPos-paramNames.begin();\n+ particleOffsetVec[particle].push_back(mm_float4(charge, sigma, epsilon, paramIndex));\n+ }\n+ for (int i = 0; i < force.getNumExceptionParameterOffsets(); i++) {\n+ string param;\n+ int exception;\n+ double charge, sigma, epsilon;\n+ force.getExceptionParameterOffset(i, param, exception, charge, sigma, epsilon);\n+ int index = exceptionIndex[exception];\n+ if (index < startIndex || index >= endIndex)\n+ continue;\n+ auto paramPos = find(paramNames.begin(), paramNames.end(), param);\n+ if (paramPos == paramNames.end())\n+ throw OpenMMException(\"updateParametersInContext: The parameter of an exception parameter offset has changed\");\n+ int paramIndex = paramPos-paramNames.begin();\n+ exceptionOffsetVec[index-startIndex].push_back(mm_float4(charge, sigma, epsilon, paramIndex));\n+ }\n+ if (max(force.getNumParticleParameterOffsets(), 1) != particleParamOffsets.getSize())\n+ throw OpenMMException(\"updateParametersInContext: The number of particle parameter offsets has changed\");\n+ vector<mm_float4> p, e;\n+ for (int i = 0; i < particleOffsetVec.size(); i++)\n+ for (int j = 0; j < particleOffsetVec[i].size(); j++)\n+ p.push_back(particleOffsetVec[i][j]);\n+ for (int i = 0; i < exceptionOffsetVec.size(); i++)\n+ for (int j = 0; j < exceptionOffsetVec[i].size(); j++)\n+ e.push_back(exceptionOffsetVec[i][j]);\n+ if (force.getNumParticleParameterOffsets() > 0)\n+ particleParamOffsets.upload(p);\n+ if (max((int) e.size(), 1) != exceptionParamOffsets.getSize())\n+ throw OpenMMException(\"updateParametersInContext: The number of exception parameter offsets has changed\");\n+ if (e.size() > 0)\n+ exceptionParamOffsets.upload(e);\n+\n // Compute other values.\n- \n+\n if (force.getUseDispersionCorrection() && cu.getContextIndex() == 0 && (nonbondedMethod == CutoffPeriodic || nonbondedMethod == Ewald || nonbondedMethod == PME))\n dispersionCoefficient = NonbondedForceImpl::calcDispersionCorrection(context.getSystem(), force);\n- cu.invalidateMolecules(info, firstParticle <= lastParticle, firstException <= lastException);\n+ cu.invalidateMolecules(info, firstParticle <= lastParticle || force.getNumParticleParameterOffsets() > 0,\n+ firstException <= lastException || force.getNumExceptionParameterOffsets() > 0);\n recomputeParams = true;\n }\n \ndiff --git a/platforms/hip/include/HipKernels.h b/platforms/hip/include/HipKernels.h\nindex 3931fad4f1..37b0ea040f 100644\n--- a/platforms/hip/include/HipKernels.h\n+++ b/platforms/hip/include/HipKernels.h\n@@ -207,6 +207,7 @@ class HipCalcNonbondedForceKernel : public CalcNonbondedForceKernel {\n std::vector<std::pair<int, int> > exceptionAtoms;\n std::vector<std::string> paramNames;\n std::vector<double> paramValues;\n+ std::map<int, int> exceptionIndex;\n double ewaldSelfEnergy, dispersionCoefficient, alpha, dispersionAlpha;\n int interpolateForceThreads;\n int gridSizeX, gridSizeY, gridSizeZ;\ndiff --git a/platforms/hip/src/HipKernels.cpp b/platforms/hip/src/HipKernels.cpp\nindex edb46c0ac8..ebaa672d62 100644\n--- a/platforms/hip/src/HipKernels.cpp\n+++ b/platforms/hip/src/HipKernels.cpp\n@@ -91,8 +91,35 @@ double HipCalcForcesAndEnergyKernel::finishComputation(ContextImpl& context, boo\n class HipCalcNonbondedForceKernel::ForceInfo : public HipForceInfo {\n public:\n ForceInfo(const NonbondedForce& force) : force(force) {\n+ particleOffset.resize(force.getNumParticles(), -1);\n+ exceptionOffset.resize(force.getNumExceptions(), -1);\n+ for (int i = 0; i < force.getNumParticleParameterOffsets(); i++) {\n+ string parameter;\n+ int particleIndex;\n+ double chargeScale, sigmaScale, epsilonScale;\n+ force.getParticleParameterOffset(i, parameter, particleIndex, chargeScale, sigmaScale, epsilonScale);\n+ particleOffset[particleIndex] = i;\n+ }\n+ for (int i = 0; i < force.getNumExceptionParameterOffsets(); i++) {\n+ string parameter;\n+ int exceptionIndex;\n+ double chargeProdScale, sigmaScale, epsilonScale;\n+ force.getExceptionParameterOffset(i, parameter, exceptionIndex, chargeProdScale, sigmaScale, epsilonScale);\n+ exceptionOffset[exceptionIndex] = i;\n+ }\n }\n bool areParticlesIdentical(int particle1, int particle2) {\n+ if (particleOffset[particle1] != -1 || particleOffset[particle2] != -1) {\n+ if (particleOffset[particle1] == -1 || particleOffset[particle2] == -1)\n+ return false;\n+ string parameter1, parameter2;\n+ int particleIndex1, particleIndex2;\n+ double chargeScale1, sigmaScale1, epsilonScale1, chargeScale2, sigmaScale2, epsilonScale2;\n+ force.getParticleParameterOffset(particleOffset[particle1], parameter1, particleIndex1, chargeScale1, sigmaScale1, epsilonScale1);\n+ force.getParticleParameterOffset(particleOffset[particle2], parameter2, particleIndex2, chargeScale2, sigmaScale2, epsilonScale2);\n+ if (parameter1 != parameter2 || chargeScale1 != chargeScale2 || sigmaScale1 != sigmaScale2 || epsilonScale1 != epsilonScale2)\n+ return false;\n+ }\n double charge1, charge2, sigma1, sigma2, epsilon1, epsilon2;\n force.getParticleParameters(particle1, charge1, sigma1, epsilon1);\n force.getParticleParameters(particle2, charge2, sigma2, epsilon2);\n@@ -110,6 +137,17 @@ class HipCalcNonbondedForceKernel::ForceInfo : public HipForceInfo {\n particles[1] = particle2;\n }\n bool areGroupsIdentical(int group1, int group2) {\n+ if (exceptionOffset[group1] != -1 || exceptionOffset[group2] != -1) {\n+ if (exceptionOffset[group1] == -1 || exceptionOffset[group2] == -1)\n+ return false;\n+ string parameter1, parameter2;\n+ int exceptionIndex1, exceptionIndex2;\n+ double chargeProdScale1, sigmaScale1, epsilonScale1, chargeProdScale2, sigmaScale2, epsilonScale2;\n+ force.getExceptionParameterOffset(exceptionOffset[group1], parameter1, exceptionIndex1, chargeProdScale1, sigmaScale1, epsilonScale1);\n+ force.getExceptionParameterOffset(exceptionOffset[group2], parameter2, exceptionIndex2, chargeProdScale2, sigmaScale2, epsilonScale2);\n+ if (parameter1 != parameter2 || chargeProdScale1 != chargeProdScale2 || sigmaScale1 != sigmaScale2 || epsilonScale1 != epsilonScale2)\n+ return false;\n+ }\n int particle1, particle2;\n double chargeProd1, chargeProd2, sigma1, sigma2, epsilon1, epsilon2;\n force.getExceptionParameters(group1, particle1, particle2, chargeProd1, sigma1, epsilon1);\n@@ -118,6 +156,7 @@ class HipCalcNonbondedForceKernel::ForceInfo : public HipForceInfo {\n }\n private:\n const NonbondedForce& force;\n+ vector<int> particleOffset, exceptionOffset;\n };\n \n class HipCalcNonbondedForceKernel::PmeIO : public CalcPmeReciprocalForceKernel::IO {\n@@ -247,7 +286,6 @@ void HipCalcNonbondedForceKernel::initialize(const System& system, const Nonbond\n }\n vector<pair<int, int> > exclusions;\n vector<int> exceptions;\n- map<int, int> exceptionIndex;\n for (int i = 0; i < force.getNumExceptions(); i++) {\n int particle1, particle2;\n double chargeProd, sigma, epsilon;\n@@ -1035,11 +1073,57 @@ void HipCalcNonbondedForceKernel::copyParametersToContext(ContextImpl& context,\n baseExceptionParams.upload(baseExceptionParamsVec);\n }\n \n+ // Record parameter offsets.\n+\n+ vector<vector<mm_float4> > particleOffsetVec(force.getNumParticles());\n+ vector<vector<mm_float4> > exceptionOffsetVec(numExceptions);\n+ for (int i = 0; i < force.getNumParticleParameterOffsets(); i++) {\n+ string param;\n+ int particle;\n+ double charge, sigma, epsilon;\n+ force.getParticleParameterOffset(i, param, particle, charge, sigma, epsilon);\n+ auto paramPos = find(paramNames.begin(), paramNames.end(), param);\n+ if (paramPos == paramNames.end())\n+ throw OpenMMException(\"updateParametersInContext: The parameter of a particle parameter offset has changed\");\n+ int paramIndex = paramPos-paramNames.begin();\n+ particleOffsetVec[particle].push_back(mm_float4(charge, sigma, epsilon, paramIndex));\n+ }\n+ for (int i = 0; i < force.getNumExceptionParameterOffsets(); i++) {\n+ string param;\n+ int exception;\n+ double charge, sigma, epsilon;\n+ force.getExceptionParameterOffset(i, param, exception, charge, sigma, epsilon);\n+ int index = exceptionIndex[exception];\n+ if (index < startIndex || index >= endIndex)\n+ continue;\n+ auto paramPos = find(paramNames.begin(), paramNames.end(), param);\n+ if (paramPos == paramNames.end())\n+ throw OpenMMException(\"updateParametersInContext: The parameter of an exception parameter offset has changed\");\n+ int paramIndex = paramPos-paramNames.begin();\n+ exceptionOffsetVec[index-startIndex].push_back(mm_float4(charge, sigma, epsilon, paramIndex));\n+ }\n+ if (max(force.getNumParticleParameterOffsets(), 1) != particleParamOffsets.getSize())\n+ throw OpenMMException(\"updateParametersInContext: The number of particle parameter offsets has changed\");\n+ vector<mm_float4> p, e;\n+ for (int i = 0; i < particleOffsetVec.size(); i++)\n+ for (int j = 0; j < particleOffsetVec[i].size(); j++)\n+ p.push_back(particleOffsetVec[i][j]);\n+ for (int i = 0; i < exceptionOffsetVec.size(); i++)\n+ for (int j = 0; j < exceptionOffsetVec[i].size(); j++)\n+ e.push_back(exceptionOffsetVec[i][j]);\n+ if (force.getNumParticleParameterOffsets() > 0)\n+ particleParamOffsets.upload(p);\n+ if (max((int) e.size(), 1) != exceptionParamOffsets.getSize())\n+ throw OpenMMException(\"updateParametersInContext: The number of exception parameter offsets has changed\");\n+ if (e.size() > 0)\n+ exceptionParamOffsets.upload(e);\n+\n // Compute other values.\n \n if (force.getUseDispersionCorrection() && cu.getContextIndex() == 0 && (nonbondedMethod == CutoffPeriodic || nonbondedMethod == Ewald || nonbondedMethod == PME))\n dispersionCoefficient = NonbondedForceImpl::calcDispersionCorrection(context.getSystem(), force);\n- cu.invalidateMolecules(info, firstParticle <= lastParticle, firstException <= lastException);\n+ cu.invalidateMolecules(info, firstParticle <= lastParticle || force.getNumParticleParameterOffsets() > 0,\n+ firstException <= lastException || force.getNumExceptionParameterOffsets() > 0);\n recomputeParams = true;\n }\n \ndiff --git a/platforms/opencl/include/OpenCLKernels.h b/platforms/opencl/include/OpenCLKernels.h\nindex afd17f3a49..286089b9ef 100644\n--- a/platforms/opencl/include/OpenCLKernels.h\n+++ b/platforms/opencl/include/OpenCLKernels.h\n@@ -214,6 +214,7 @@ class OpenCLCalcNonbondedForceKernel : public CalcNonbondedForceKernel {\n std::vector<std::pair<int, int> > exceptionAtoms;\n std::vector<std::string> paramNames;\n std::vector<double> paramValues;\n+ std::map<int, int> exceptionIndex;\n double ewaldSelfEnergy, dispersionCoefficient, alpha, dispersionAlpha;\n int gridSizeX, gridSizeY, gridSizeZ;\n int dispersionGridSizeX, dispersionGridSizeY, dispersionGridSizeZ;\ndiff --git a/platforms/opencl/src/OpenCLKernels.cpp b/platforms/opencl/src/OpenCLKernels.cpp\nindex 38a9ceff87..00cdbaa570 100644\n--- a/platforms/opencl/src/OpenCLKernels.cpp\n+++ b/platforms/opencl/src/OpenCLKernels.cpp\n@@ -104,8 +104,35 @@ double OpenCLCalcForcesAndEnergyKernel::finishComputation(ContextImpl& context,\n class OpenCLCalcNonbondedForceKernel::ForceInfo : public OpenCLForceInfo {\n public:\n ForceInfo(int requiredBuffers, const NonbondedForce& force) : OpenCLForceInfo(requiredBuffers), force(force) {\n+ particleOffset.resize(force.getNumParticles(), -1);\n+ exceptionOffset.resize(force.getNumExceptions(), -1);\n+ for (int i = 0; i < force.getNumParticleParameterOffsets(); i++) {\n+ string parameter;\n+ int particleIndex;\n+ double chargeScale, sigmaScale, epsilonScale;\n+ force.getParticleParameterOffset(i, parameter, particleIndex, chargeScale, sigmaScale, epsilonScale);\n+ particleOffset[particleIndex] = i;\n+ }\n+ for (int i = 0; i < force.getNumExceptionParameterOffsets(); i++) {\n+ string parameter;\n+ int exceptionIndex;\n+ double chargeProdScale, sigmaScale, epsilonScale;\n+ force.getExceptionParameterOffset(i, parameter, exceptionIndex, chargeProdScale, sigmaScale, epsilonScale);\n+ exceptionOffset[exceptionIndex] = i;\n+ }\n }\n bool areParticlesIdentical(int particle1, int particle2) {\n+ if (particleOffset[particle1] != -1 || particleOffset[particle2] != -1) {\n+ if (particleOffset[particle1] == -1 || particleOffset[particle2] == -1)\n+ return false;\n+ string parameter1, parameter2;\n+ int particleIndex1, particleIndex2;\n+ double chargeScale1, sigmaScale1, epsilonScale1, chargeScale2, sigmaScale2, epsilonScale2;\n+ force.getParticleParameterOffset(particleOffset[particle1], parameter1, particleIndex1, chargeScale1, sigmaScale1, epsilonScale1);\n+ force.getParticleParameterOffset(particleOffset[particle2], parameter2, particleIndex2, chargeScale2, sigmaScale2, epsilonScale2);\n+ if (parameter1 != parameter2 || chargeScale1 != chargeScale2 || sigmaScale1 != sigmaScale2 || epsilonScale1 != epsilonScale2)\n+ return false;\n+ }\n double charge1, charge2, sigma1, sigma2, epsilon1, epsilon2;\n force.getParticleParameters(particle1, charge1, sigma1, epsilon1);\n force.getParticleParameters(particle2, charge2, sigma2, epsilon2);\n@@ -123,6 +150,17 @@ class OpenCLCalcNonbondedForceKernel::ForceInfo : public OpenCLForceInfo {\n particles[1] = particle2;\n }\n bool areGroupsIdentical(int group1, int group2) {\n+ if (exceptionOffset[group1] != -1 || exceptionOffset[group2] != -1) {\n+ if (exceptionOffset[group1] == -1 || exceptionOffset[group2] == -1)\n+ return false;\n+ string parameter1, parameter2;\n+ int exceptionIndex1, exceptionIndex2;\n+ double chargeProdScale1, sigmaScale1, epsilonScale1, chargeProdScale2, sigmaScale2, epsilonScale2;\n+ force.getExceptionParameterOffset(exceptionOffset[group1], parameter1, exceptionIndex1, chargeProdScale1, sigmaScale1, epsilonScale1);\n+ force.getExceptionParameterOffset(exceptionOffset[group2], parameter2, exceptionIndex2, chargeProdScale2, sigmaScale2, epsilonScale2);\n+ if (parameter1 != parameter2 || chargeProdScale1 != chargeProdScale2 || sigmaScale1 != sigmaScale2 || epsilonScale1 != epsilonScale2)\n+ return false;\n+ }\n int particle1, particle2;\n double chargeProd1, chargeProd2, sigma1, sigma2, epsilon1, epsilon2;\n force.getExceptionParameters(group1, particle1, particle2, chargeProd1, sigma1, epsilon1);\n@@ -131,6 +169,7 @@ class OpenCLCalcNonbondedForceKernel::ForceInfo : public OpenCLForceInfo {\n }\n private:\n const NonbondedForce& force;\n+ vector<int> particleOffset, exceptionOffset;\n };\n \n class OpenCLCalcNonbondedForceKernel::PmeIO : public CalcPmeReciprocalForceKernel::IO {\n@@ -257,7 +296,6 @@ void OpenCLCalcNonbondedForceKernel::initialize(const System& system, const Nonb\n }\n vector<pair<int, int> > exclusions;\n vector<int> exceptions;\n- map<int, int> exceptionIndex;\n for (int i = 0; i < force.getNumExceptions(); i++) {\n int particle1, particle2;\n double chargeProd, sigma, epsilon;\n@@ -1146,12 +1184,58 @@ void OpenCLCalcNonbondedForceKernel::copyParametersToContext(ContextImpl& contex\n }\n baseExceptionParams.upload(baseExceptionParamsVec);\n }\n- \n+\n+ // Record parameter offsets.\n+\n+ vector<vector<mm_float4> > particleOffsetVec(force.getNumParticles());\n+ vector<vector<mm_float4> > exceptionOffsetVec(numExceptions);\n+ for (int i = 0; i < force.getNumParticleParameterOffsets(); i++) {\n+ string param;\n+ int particle;\n+ double charge, sigma, epsilon;\n+ force.getParticleParameterOffset(i, param, particle, charge, sigma, epsilon);\n+ auto paramPos = find(paramNames.begin(), paramNames.end(), param);\n+ if (paramPos == paramNames.end())\n+ throw OpenMMException(\"updateParametersInContext: The parameter of a particle parameter offset has changed\");\n+ int paramIndex = paramPos-paramNames.begin();\n+ particleOffsetVec[particle].push_back(mm_float4(charge, sigma, epsilon, paramIndex));\n+ }\n+ for (int i = 0; i < force.getNumExceptionParameterOffsets(); i++) {\n+ string param;\n+ int exception;\n+ double charge, sigma, epsilon;\n+ force.getExceptionParameterOffset(i, param, exception, charge, sigma, epsilon);\n+ int index = exceptionIndex[exception];\n+ if (index < startIndex || index >= endIndex)\n+ continue;\n+ auto paramPos = find(paramNames.begin(), paramNames.end(), param);\n+ if (paramPos == paramNames.end())\n+ throw OpenMMException(\"updateParametersInContext: The parameter of an exception parameter offset has changed\");\n+ int paramIndex = paramPos-paramNames.begin();\n+ exceptionOffsetVec[index-startIndex].push_back(mm_float4(charge, sigma, epsilon, paramIndex));\n+ }\n+ if (max(force.getNumParticleParameterOffsets(), 1) != particleParamOffsets.getSize())\n+ throw OpenMMException(\"updateParametersInContext: The number of particle parameter offsets has changed\");\n+ vector<mm_float4> p, e;\n+ for (int i = 0; i < particleOffsetVec.size(); i++)\n+ for (int j = 0; j < particleOffsetVec[i].size(); j++)\n+ p.push_back(particleOffsetVec[i][j]);\n+ for (int i = 0; i < exceptionOffsetVec.size(); i++)\n+ for (int j = 0; j < exceptionOffsetVec[i].size(); j++)\n+ e.push_back(exceptionOffsetVec[i][j]);\n+ if (force.getNumParticleParameterOffsets() > 0)\n+ particleParamOffsets.upload(p);\n+ if (max((int) e.size(), 1) != exceptionParamOffsets.getSize())\n+ throw OpenMMException(\"updateParametersInContext: The number of exception parameter offsets has changed\");\n+ if (e.size() > 0)\n+ exceptionParamOffsets.upload(e);\n+\n // Compute other values.\n- \n+\n if (force.getUseDispersionCorrection() && cl.getContextIndex() == 0 && (nonbondedMethod == CutoffPeriodic || nonbondedMethod == Ewald || nonbondedMethod == PME))\n dispersionCoefficient = NonbondedForceImpl::calcDispersionCorrection(context.getSystem(), force);\n- cl.invalidateMolecules(info, firstParticle <= lastParticle, firstException <= lastException);\n+ cl.invalidateMolecules(info, firstParticle <= lastParticle || force.getNumParticleParameterOffsets() > 0,\n+ firstException <= lastException || force.getNumExceptionParameterOffsets() > 0);\n recomputeParams = true;\n }\n \ndiff --git a/platforms/reference/include/ReferenceKernels.h b/platforms/reference/include/ReferenceKernels.h\nindex bb2289e3d0..2c73542c8a 100644\n--- a/platforms/reference/include/ReferenceKernels.h\n+++ b/platforms/reference/include/ReferenceKernels.h\n@@ -662,6 +662,7 @@ class ReferenceCalcNonbondedForceKernel : public CalcNonbondedForceKernel {\n std::vector<std::vector<double> > particleParamArray, bonded14ParamArray;\n std::vector<std::array<double, 3> > baseParticleParams, baseExceptionParams;\n std::map<std::pair<std::string, int>, std::array<double, 3> > particleParamOffsets, exceptionParamOffsets;\n+ std::map<int, int> nb14Index;\n double nonbondedCutoff, switchingDistance, rfDielectric, ewaldAlpha, ewaldDispersionAlpha, dispersionCoefficient;\n int kmax[3], gridSize[3], dispersionGridSize[3];\n bool useSwitchingFunction, exceptionsArePeriodic;\ndiff --git a/platforms/reference/src/ReferenceKernels.cpp b/platforms/reference/src/ReferenceKernels.cpp\nindex c04ea01910..3b8dc89418 100644\n--- a/platforms/reference/src/ReferenceKernels.cpp\n+++ b/platforms/reference/src/ReferenceKernels.cpp\n@@ -903,7 +903,6 @@ void ReferenceCalcNonbondedForceKernel::initialize(const System& system, const N\n numParticles = force.getNumParticles();\n exclusions.resize(numParticles);\n vector<int> nb14s;\n- map<int, int> nb14Index;\n for (int i = 0; i < force.getNumExceptions(); i++) {\n int particle1, particle2;\n double chargeProd, sigma, epsilon;\n@@ -1038,6 +1037,18 @@ double ReferenceCalcNonbondedForceKernel::execute(ContextImpl& context, bool inc\n void ReferenceCalcNonbondedForceKernel::copyParametersToContext(ContextImpl& context, const NonbondedForce& force, int firstParticle, int lastParticle, int firstException, int lastException) {\n if (force.getNumParticles() != numParticles)\n throw OpenMMException(\"updateParametersInContext: The number of particles has changed\");\n+ if (force.getNumParticleParameterOffsets() != particleParamOffsets.size())\n+ throw OpenMMException(\"updateParametersInContext: The number of particle parameter offsets has changed\");\n+ if (force.getNumExceptionParameterOffsets() != exceptionParamOffsets.size())\n+ throw OpenMMException(\"updateParametersInContext: The number of exception parameter offsets has changed\");\n+ for (int i = 0; i < force.getNumParticleParameterOffsets(); i++) {\n+ string param;\n+ int particle;\n+ double charge, sigma, epsilon;\n+ force.getParticleParameterOffset(i, param, particle, charge, sigma, epsilon);\n+ if (particleParamOffsets.find(make_pair(param, particle)) == particleParamOffsets.end())\n+ throw OpenMMException(\"updateParametersInContext: The parameter or particle index of a particle parameter offset has changed\");\n+ }\n \n // Identify which exceptions are 1-4 interactions.\n \n@@ -1048,6 +1059,8 @@ void ReferenceCalcNonbondedForceKernel::copyParametersToContext(ContextImpl& con\n double charge, sigma, epsilon;\n force.getExceptionParameterOffset(i, param, exception, charge, sigma, epsilon);\n exceptionsWithOffsets.insert(exception);\n+ if (exceptionParamOffsets.find(make_pair(param, nb14Index[exception])) == exceptionParamOffsets.end())\n+ throw OpenMMException(\"updateParametersInContext: The parameter or exception index of an exception parameter offset has changed\");\n }\n vector<int> nb14s;\n for (int i = 0; i < force.getNumExceptions(); i++) {\n@@ -1070,6 +1083,22 @@ void ReferenceCalcNonbondedForceKernel::copyParametersToContext(ContextImpl& con\n bonded14IndexArray[i][0] = particle1;\n bonded14IndexArray[i][1] = particle2;\n }\n+ particleParamOffsets.clear();\n+ exceptionParamOffsets.clear();\n+ for (int i = 0; i < force.getNumParticleParameterOffsets(); i++) {\n+ string param;\n+ int particle;\n+ double charge, sigma, epsilon;\n+ force.getParticleParameterOffset(i, param, particle, charge, sigma, epsilon);\n+ particleParamOffsets[make_pair(param, particle)] = {charge, sigma, epsilon};\n+ }\n+ for (int i = 0; i < force.getNumExceptionParameterOffsets(); i++) {\n+ string param;\n+ int exception;\n+ double charge, sigma, epsilon;\n+ force.getExceptionParameterOffset(i, param, exception, charge, sigma, epsilon);\n+ exceptionParamOffsets[make_pair(param, nb14Index[exception])] = {charge, sigma, epsilon};\n+ }\n \n // Recompute the coefficient for the dispersion correction.\n \n"}, "test": {"test_patch": "diff --git a/tests/TestNonbondedForce.h b/tests/TestNonbondedForce.h\nindex 1efaefdfde..e1d5aed87d 100644\n--- a/tests/TestNonbondedForce.h\n+++ b/tests/TestNonbondedForce.h\n@@ -901,6 +901,39 @@ void testParameterOffsets() {\n energy += ONE_4PI_EPS0*pairChargeProd[i][j]/dist + 4.0*pairEpsilon[i][j]*(pow(x, 12.0)-pow(x, 6.0));\n }\n ASSERT_EQUAL_TOL(energy, context.getState(State::Energy).getPotentialEnergy(), 1e-5);\n+\n+ // Update the offsets and see if the energy is still correct.\n+\n+ force->setParticleParameterOffset(0, \"p1\", 0, 2.0, 0.6, 0.6);\n+ force->setParticleParameterOffset(1, \"p2\", 1, 1.1, 1.1, 2.1);\n+ force->setExceptionParameterOffset(0, \"p1\", 1, 0.4, 0.4, 1.4);\n+ force->updateParametersInContext(context);\n+ particleCharge = {0.0+2.0*0.5, 1.0+1.1*1.5, -1.0, 0.5};\n+ particleSigma = {1.0+0.6*0.5, 0.5+1.1*1.5, 2.0, 2.0};\n+ particleEpsilon = {0.5+0.6*0.5, 0.6+2.1*1.5, 0.7, 0.8};\n+ for (int i = 0; i < 4; i++)\n+ for (int j = i+1; j < 4; j++) {\n+ pairChargeProd[i][j] = particleCharge[i]*particleCharge[j];\n+ pairSigma[i][j] = 0.5*(particleSigma[i]+particleSigma[j]);\n+ pairEpsilon[i][j] = sqrt(particleEpsilon[i]*particleEpsilon[j]);\n+ }\n+ pairChargeProd[0][3] = 0.0;\n+ pairSigma[0][3] = 1.0;\n+ pairEpsilon[0][3] = 0.0;\n+ pairChargeProd[2][3] = 0.5+0.4*0.5;\n+ pairSigma[2][3] = 1.0+0.4*0.5;\n+ pairEpsilon[2][3] = 1.5+1.4*0.5;\n+ pairChargeProd[0][1] = 1.0;\n+ pairSigma[0][1] = 1.5;\n+ pairEpsilon[0][1] = 1.0;\n+ energy = 0.0;\n+ for (int i = 0; i < 4; i++)\n+ for (int j = i+1; j < 4; j++) {\n+ double dist = j-i;\n+ double x = pairSigma[i][j]/dist;\n+ energy += ONE_4PI_EPS0*pairChargeProd[i][j]/dist + 4.0*pairEpsilon[i][j]*(pow(x, 12.0)-pow(x, 6.0));\n+ }\n+ ASSERT_EQUAL_TOL(energy, context.getState(State::Energy).getPotentialEnergy(), 1e-5);\n }\n \n void testEwaldExceptions() {\n", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}91{"question_id": "MSB_openmm_openmm_pr4734", "question_type": "multi_swe_bench", "description": "Serialization records integration force groups (openmm/openmm#4734)", "content": {"org": "openmm", "repo": "openmm", "pr_number": 4734, "issue_title": "Serialization records integration force groups", "issue_body": "Fixes #4730.\r\n\r\nWhile fixing this, I realized our handling of force groups for CompoundIntegrator was inconsistent. The CompoundIntegrator stored a list of force groups, and so did each integrator it contained. They were set independently and used inconsistently. Performing integration would use the groups for the currently selected integrator. Energy minimization would use the groups for the CompoundIntegrator itself.\r\n\r\nI therefore changed the behavior so the CompoundIntegrator doesn't have its own independent set of force groups. `getIntegrationForceGroups()` returns the groups for the currently selected integrator. `setIntegrationForceGroups()` sets the groups for *all* contained integrators.", "base_commit": "ecbe32b026547d841b4ddc472ef81fae36275f67", "resolved_issues": [{"number": 4730, "title": "Deepcopying integrators resets integration force groups", "body": "It seems that serializing an integrator doesn't record the integration force group, which means any deepcopy of an integrator will have them reset to the default (all force groups).\r\n\r\n```\r\nimport openmm as mm\r\nfrom openmm import unit as u\r\nfrom copy import deepcopy\r\n\r\nintegrator = mm.LangevinMiddleIntegrator(300*u.kelvin, 1/u.picosecond, 0.002*u.picosecond)\r\nintegrator.setIntegrationForceGroups({0})\r\nintegrator_copy = deepcopy(integrator)\r\nprint(integrator.getIntegrationForceGroups())\r\nprint(integrator_copy.getIntegrationForceGroups())\r\n```\r\n1\r\n-1\r\n\r\nCould this be an oversight?\n\n### Minimal API referenced by tests (typed signatures)\n_Added only when tests call brand\u2011new symbols introduced by the fix; types reflect annotations present in the repo or `Unknown` if not annotated._\n\n- Function in `openmmapi/src/CompoundIntegrator.cpp`: `def int CompoundIntegrator::getIntegrationForceGroups() -> int: ...`\n **Output:** int\n\n- Function in `openmmapi/src/CompoundIntegrator.cpp`: `def void CompoundIntegrator::setIntegrationForceGroups(groups: int) -> void: ...`\n **Inputs:** groups: int\n **Output:** void\n\n\n```python\ndef int CompoundIntegrator::getIntegrationForceGroups() -> int: ...\ndef void CompoundIntegrator::setIntegrationForceGroups(groups) -> void: ...\n```\n\n## IMPORTANT INSTRUCTIONS\n\n1. If you edit a python file, you MUST run 'make PythonInstall' inside the build directory\n2. If you edit a c++ file, you MUST run 'make -j4 && make install\" inside the build directory"}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/openmm_m_openmm:pr-4734", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/openmmapi/include/openmm/CompoundIntegrator.h b/openmmapi/include/openmm/CompoundIntegrator.h\nindex 3839648988..dea22f1fbc 100644\n--- a/openmmapi/include/openmm/CompoundIntegrator.h\n+++ b/openmmapi/include/openmm/CompoundIntegrator.h\n@@ -9,7 +9,7 @@\n * Biological Structures at Stanford, funded under the NIH Roadmap for *\n * Medical Research, grant U54 GM072970. See https://simtk.org. *\n * *\n- * Portions copyright (c) 2015-2020 Stanford University and the Authors. *\n+ * Portions copyright (c) 2015-2024 Stanford University and the Authors. *\n * Authors: Peter Eastman *\n * Contributors: *\n * *\n@@ -158,6 +158,23 @@ class OPENMM_EXPORT CompoundIntegrator : public Integrator {\n * @param steps the number of time steps to take\n */\n void step(int steps);\n+ /**\n+ * Get which force groups to use for integration. By default, all force groups\n+ * are included. This is interpreted as a set of bit flags: the forces from group i\n+ * will be included if (groups&(1<<i)) != 0.\n+ * \n+ * This method returns the integration force groups for the current Integator.\n+ */\n+ int getIntegrationForceGroups() const;\n+ /**\n+ * Set which force groups to use for integration. By default, all force groups\n+ * are included. This is interpreted as a set of bit flags: the forces from group i\n+ * will be included if (groups&(1<<i)) != 0.\n+ * \n+ * Calling this method sets the integration force groups for all Integrators\n+ * containined in this CompoundIntegrator.\n+ */\n+ void setIntegrationForceGroups(int groups);\n protected:\n /**\n * This will be called by the Context when it is created. It informs the Integrator\ndiff --git a/openmmapi/src/CompoundIntegrator.cpp b/openmmapi/src/CompoundIntegrator.cpp\nindex d75760276d..aa22a245ab 100644\n--- a/openmmapi/src/CompoundIntegrator.cpp\n+++ b/openmmapi/src/CompoundIntegrator.cpp\n@@ -6,7 +6,7 @@\n * Biological Structures at Stanford, funded under the NIH Roadmap for *\n * Medical Research, grant U54 GM072970. See https://simtk.org. *\n * *\n- * Portions copyright (c) 2015-2020 Stanford University and the Authors. *\n+ * Portions copyright (c) 2015-2024 Stanford University and the Authors. *\n * Authors: Peter Eastman *\n * Contributors: *\n * *\n@@ -99,6 +99,15 @@ void CompoundIntegrator::step(int steps) {\n integrators[currentIntegrator]->step(steps);\n }\n \n+int CompoundIntegrator::getIntegrationForceGroups() const {\n+ return integrators[currentIntegrator]->getIntegrationForceGroups();\n+}\n+\n+void CompoundIntegrator::setIntegrationForceGroups(int groups) {\n+ for (int i = 0; i < integrators.size(); i++)\n+ integrators[i]->setIntegrationForceGroups(groups);\n+}\n+\n void CompoundIntegrator::initialize(ContextImpl& context) {\n if (integrators.size() == 0)\n throw OpenMMException(\"CompoundIntegrator must contain at least one Integrator\");\ndiff --git a/plugins/drude/serialization/src/DrudeLangevinIntegratorProxy.cpp b/plugins/drude/serialization/src/DrudeLangevinIntegratorProxy.cpp\nindex 1952ab05b4..ddf3d3f49c 100644\n--- a/plugins/drude/serialization/src/DrudeLangevinIntegratorProxy.cpp\n+++ b/plugins/drude/serialization/src/DrudeLangevinIntegratorProxy.cpp\n@@ -6,7 +6,7 @@\n * Biological Structures at Stanford, funded under the NIH Roadmap for *\n * Medical Research, grant U54 GM072970. See https://simtk.org. *\n * *\n- * Portions copyright (c) 2013 Stanford University and the Authors. *\n+ * Portions copyright (c) 2013-2024 Stanford University and the Authors. *\n * Authors: Peter Eastman *\n * Contributors: *\n * *\n@@ -50,6 +50,7 @@ void DrudeLangevinIntegratorProxy::serialize(const void* object, SerializationNo\n node.setDoubleProperty(\"drudeTemperature\", integrator.getDrudeTemperature());\n node.setDoubleProperty(\"drudeFriction\", integrator.getDrudeFriction());\n node.setIntProperty(\"randomSeed\", integrator.getRandomNumberSeed());\n+ node.setIntProperty(\"integrationForceGroups\", integrator.getIntegrationForceGroups());\n }\n \n void* DrudeLangevinIntegratorProxy::deserialize(const SerializationNode& node) const {\n@@ -60,5 +61,6 @@ void* DrudeLangevinIntegratorProxy::deserialize(const SerializationNode& node) c\n node.getDoubleProperty(\"drudeFriction\"), node.getDoubleProperty(\"stepSize\"));\n integrator->setConstraintTolerance(node.getDoubleProperty(\"constraintTolerance\"));\n integrator->setRandomNumberSeed(node.getIntProperty(\"randomSeed\"));\n+ integrator->setIntegrationForceGroups(node.getIntProperty(\"integrationForceGroups\", 0xFFFFFFFF));\n return integrator;\n }\n\\ No newline at end of file\ndiff --git a/plugins/drude/serialization/src/DrudeNoseHooverIntegratorProxy.cpp b/plugins/drude/serialization/src/DrudeNoseHooverIntegratorProxy.cpp\nindex 452d16d136..62a745913f 100644\n--- a/plugins/drude/serialization/src/DrudeNoseHooverIntegratorProxy.cpp\n+++ b/plugins/drude/serialization/src/DrudeNoseHooverIntegratorProxy.cpp\n@@ -6,7 +6,7 @@\n * Biological Structures at Stanford, funded under the NIH Roadmap for *\r\n * Medical Research, grant U54 GM072970. See https://simtk.org. *\r\n * *\r\n- * Portions copyright (c) 2010 Stanford University and the Authors. *\r\n+ * Portions copyright (c) 2010-2024 Stanford University and the Authors. *\r\n * Authors: Andrew C. Simmonett, Andreas Kr\u00e4mer *\r\n * Contributors: *\r\n * *\r\n@@ -57,6 +57,7 @@ void DrudeNoseHooverIntegratorProxy::serialize(const void* object, Serialization\n node.setIntProperty(\"chainLength\", integrator.getThermostat().getChainLength());\r\n node.setIntProperty(\"numMTS\", integrator.getThermostat().getNumMultiTimeSteps());\r\n node.setIntProperty(\"numYS\", integrator.getThermostat().getNumYoshidaSuzukiTimeSteps());\r\n+ node.setIntProperty(\"integrationForceGroups\", integrator.getIntegrationForceGroups());\r\n }\r\n \r\n void* DrudeNoseHooverIntegratorProxy::deserialize(const SerializationNode& node) const {\r\n@@ -75,6 +76,7 @@ void* DrudeNoseHooverIntegratorProxy::deserialize(const SerializationNode& node)\n );\r\n integrator->setConstraintTolerance(node.getDoubleProperty(\"constraintTolerance\"));\r\n integrator->setMaximumPairDistance(node.getDoubleProperty(\"maximumPairDistance\"));\r\n+ integrator->setIntegrationForceGroups(node.getIntProperty(\"integrationForceGroups\", 0xFFFFFFFF));\r\n \r\n return integrator;\r\n }\r\ndiff --git a/serialization/src/BrownianIntegratorProxy.cpp b/serialization/src/BrownianIntegratorProxy.cpp\nindex 132d00e9f3..725305b13e 100644\n--- a/serialization/src/BrownianIntegratorProxy.cpp\n+++ b/serialization/src/BrownianIntegratorProxy.cpp\n@@ -6,7 +6,7 @@\n * Biological Structures at Stanford, funded under the NIH Roadmap for *\r\n * Medical Research, grant U54 GM072970. See https://simtk.org. *\r\n * *\r\n- * Portions copyright (c) 2010 Stanford University and the Authors. *\r\n+ * Portions copyright (c) 2010-2024 Stanford University and the Authors. *\r\n * Authors: Peter Eastman, Yutong Zhao *\r\n * Contributors: *\r\n * *\r\n@@ -47,6 +47,7 @@ void BrownianIntegratorProxy::serialize(const void* object, SerializationNode& n\n node.setDoubleProperty(\"temperature\", integrator.getTemperature());\r\n node.setDoubleProperty(\"friction\", integrator.getFriction());\r\n node.setIntProperty(\"randomSeed\", integrator.getRandomNumberSeed());\r\n+ node.setIntProperty(\"integrationForceGroups\", integrator.getIntegrationForceGroups());\r\n }\r\n \r\n void* BrownianIntegratorProxy::deserialize(const SerializationNode& node) const {\r\n@@ -57,5 +58,6 @@ void* BrownianIntegratorProxy::deserialize(const SerializationNode& node) const\n node.getDoubleProperty(\"stepSize\"));\r\n integrator->setConstraintTolerance(node.getDoubleProperty(\"constraintTolerance\"));\r\n integrator->setRandomNumberSeed(node.getIntProperty(\"randomSeed\"));\r\n+ integrator->setIntegrationForceGroups(node.getIntProperty(\"integrationForceGroups\", 0xFFFFFFFF));\r\n return integrator;\r\n }\n\\ No newline at end of file\ndiff --git a/serialization/src/CustomIntegratorProxy.cpp b/serialization/src/CustomIntegratorProxy.cpp\nindex 86ab647835..ca370fb5a5 100644\n--- a/serialization/src/CustomIntegratorProxy.cpp\n+++ b/serialization/src/CustomIntegratorProxy.cpp\n@@ -65,6 +65,7 @@ void CustomIntegratorProxy::serialize(const void* object, SerializationNode& nod\n functions.createChildNode(\"Function\", &integrator.getTabulatedFunction(i)).setStringProperty(\"name\", integrator.getTabulatedFunctionName(i));\r\n node.setStringProperty(\"kineticEnergyExpression\", integrator.getKineticEnergyExpression());\r\n node.setIntProperty(\"randomSeed\", integrator.getRandomNumberSeed());\r\n+ node.setIntProperty(\"integrationForceGroups\", integrator.getIntegrationForceGroups());\r\n node.setDoubleProperty(\"stepSize\", integrator.getStepSize());\r\n node.setDoubleProperty(\"constraintTolerance\", integrator.getConstraintTolerance());\r\n }\r\n@@ -124,6 +125,7 @@ void* CustomIntegratorProxy::deserialize(const SerializationNode& node) const {\n }\r\n integrator->setKineticEnergyExpression(node.getStringProperty(\"kineticEnergyExpression\"));\r\n integrator->setRandomNumberSeed(node.getIntProperty(\"randomSeed\"));\r\n+ integrator->setIntegrationForceGroups(node.getIntProperty(\"integrationForceGroups\", 0xFFFFFFFF));\r\n integrator->setConstraintTolerance(node.getDoubleProperty(\"constraintTolerance\"));\r\n return integrator;\r\n }\r\ndiff --git a/serialization/src/LangevinIntegratorProxy.cpp b/serialization/src/LangevinIntegratorProxy.cpp\nindex e978b6ea17..0773503eb9 100644\n--- a/serialization/src/LangevinIntegratorProxy.cpp\n+++ b/serialization/src/LangevinIntegratorProxy.cpp\n@@ -6,7 +6,7 @@\n * Biological Structures at Stanford, funded under the NIH Roadmap for *\r\n * Medical Research, grant U54 GM072970. See https://simtk.org. *\r\n * *\r\n- * Portions copyright (c) 2010 Stanford University and the Authors. *\r\n+ * Portions copyright (c) 2010-2024 Stanford University and the Authors. *\r\n * Authors: Peter Eastman, Yutong Zhao *\r\n * Contributors: *\r\n * *\r\n@@ -47,6 +47,7 @@ void LangevinIntegratorProxy::serialize(const void* object, SerializationNode& n\n node.setDoubleProperty(\"temperature\", integrator.getTemperature());\r\n node.setDoubleProperty(\"friction\", integrator.getFriction());\r\n node.setIntProperty(\"randomSeed\", integrator.getRandomNumberSeed());\r\n+ node.setIntProperty(\"integrationForceGroups\", integrator.getIntegrationForceGroups());\r\n }\r\n \r\n void* LangevinIntegratorProxy::deserialize(const SerializationNode& node) const {\r\n@@ -57,5 +58,6 @@ void* LangevinIntegratorProxy::deserialize(const SerializationNode& node) const\n node.getDoubleProperty(\"stepSize\"));\r\n integrator->setConstraintTolerance(node.getDoubleProperty(\"constraintTolerance\"));\r\n integrator->setRandomNumberSeed(node.getIntProperty(\"randomSeed\"));\r\n+ integrator->setIntegrationForceGroups(node.getIntProperty(\"integrationForceGroups\", 0xFFFFFFFF));\r\n return integrator;\r\n }\n\\ No newline at end of file\ndiff --git a/serialization/src/LangevinMiddleIntegratorProxy.cpp b/serialization/src/LangevinMiddleIntegratorProxy.cpp\nindex 4d6d664e20..7516df850f 100644\n--- a/serialization/src/LangevinMiddleIntegratorProxy.cpp\n+++ b/serialization/src/LangevinMiddleIntegratorProxy.cpp\n@@ -6,7 +6,7 @@\n * Biological Structures at Stanford, funded under the NIH Roadmap for *\n * Medical Research, grant U54 GM072970. See https://simtk.org. *\n * *\n- * Portions copyright (c) 2010-2019 Stanford University and the Authors. *\n+ * Portions copyright (c) 2010-2024 Stanford University and the Authors. *\n * Authors: Peter Eastman, Yutong Zhao *\n * Contributors: *\n * *\n@@ -47,6 +47,7 @@ void LangevinMiddleIntegratorProxy::serialize(const void* object, SerializationN\n node.setDoubleProperty(\"temperature\", integrator.getTemperature());\n node.setDoubleProperty(\"friction\", integrator.getFriction());\n node.setIntProperty(\"randomSeed\", integrator.getRandomNumberSeed());\n+ node.setIntProperty(\"integrationForceGroups\", integrator.getIntegrationForceGroups());\n }\n \n void* LangevinMiddleIntegratorProxy::deserialize(const SerializationNode& node) const {\n@@ -56,5 +57,6 @@ void* LangevinMiddleIntegratorProxy::deserialize(const SerializationNode& node)\n node.getDoubleProperty(\"friction\"), node.getDoubleProperty(\"stepSize\"));\n integrator->setConstraintTolerance(node.getDoubleProperty(\"constraintTolerance\"));\n integrator->setRandomNumberSeed(node.getIntProperty(\"randomSeed\"));\n+ integrator->setIntegrationForceGroups(node.getIntProperty(\"integrationForceGroups\", 0xFFFFFFFF));\n return integrator;\n }\n\\ No newline at end of file\ndiff --git a/serialization/src/NoseHooverIntegratorProxy.cpp b/serialization/src/NoseHooverIntegratorProxy.cpp\nindex a181d09bef..620281e02d 100644\n--- a/serialization/src/NoseHooverIntegratorProxy.cpp\n+++ b/serialization/src/NoseHooverIntegratorProxy.cpp\n@@ -6,7 +6,7 @@\n * Biological Structures at Stanford, funded under the NIH Roadmap for *\r\n * Medical Research, grant U54 GM072970. See https://simtk.org. *\r\n * *\r\n- * Portions copyright (c) 2010 Stanford University and the Authors. *\r\n+ * Portions copyright (c) 2010-2024 Stanford University and the Authors. *\r\n * Authors: Andrew C. Simmonett, Andreas Kr\u00e4mer *\r\n * Contributors: *\r\n * *\r\n@@ -47,6 +47,7 @@ void NoseHooverIntegratorProxy::serialize(const void* object, SerializationNode&\n node.setDoubleProperty(\"constraintTolerance\", integrator.getConstraintTolerance());\r\n node.setDoubleProperty(\"maximumPairDistance\", integrator.getMaximumPairDistance());\r\n node.setBoolProperty(\"hasSubsystemThermostats\", integrator.hasSubsystemThermostats());\r\n+ node.setIntProperty(\"integrationForceGroups\", integrator.getIntegrationForceGroups());\r\n if (integrator.hasSubsystemThermostats()) {\r\n // Serialize all thermostats separately\r\n for (int i = 0; i < integrator.getNumThermostats(); i++){\r\n@@ -123,6 +124,7 @@ void* NoseHooverIntegratorProxy::deserialize(const SerializationNode& node) cons\n }\r\n integrator->setConstraintTolerance(node.getDoubleProperty(\"constraintTolerance\"));\r\n integrator->setMaximumPairDistance(node.getDoubleProperty(\"maximumPairDistance\"));\r\n+ integrator->setIntegrationForceGroups(node.getIntProperty(\"integrationForceGroups\", 0xFFFFFFFF));\r\n \r\n return integrator;\r\n }\r\ndiff --git a/serialization/src/VariableLangevinIntegratorProxy.cpp b/serialization/src/VariableLangevinIntegratorProxy.cpp\nindex 079cd54636..6a7c8c3389 100644\n--- a/serialization/src/VariableLangevinIntegratorProxy.cpp\n+++ b/serialization/src/VariableLangevinIntegratorProxy.cpp\n@@ -6,7 +6,7 @@\n * Biological Structures at Stanford, funded under the NIH Roadmap for *\r\n * Medical Research, grant U54 GM072970. See https://simtk.org. *\r\n * *\r\n- * Portions copyright (c) 2010-2019 Stanford University and the Authors. *\r\n+ * Portions copyright (c) 2010-2024 Stanford University and the Authors. *\r\n * Authors: Peter Eastman, Yutong Zhao *\r\n * Contributors: *\r\n * *\r\n@@ -48,6 +48,7 @@ void VariableLangevinIntegratorProxy::serialize(const void* object, Serializatio\n node.setDoubleProperty(\"errorTol\", integrator.getErrorTolerance());\r\n node.setDoubleProperty(\"maxStepSize\", integrator.getMaximumStepSize());\r\n node.setIntProperty(\"randomSeed\", integrator.getRandomNumberSeed());\r\n+ node.setIntProperty(\"integrationForceGroups\", integrator.getIntegrationForceGroups());\r\n }\r\n \r\n void* VariableLangevinIntegratorProxy::deserialize(const SerializationNode& node) const {\r\n@@ -60,6 +61,7 @@ void* VariableLangevinIntegratorProxy::deserialize(const SerializationNode& node\n integrator->setStepSize(node.getDoubleProperty(\"stepSize\"));\r\n integrator->setConstraintTolerance(node.getDoubleProperty(\"constraintTolerance\"));\r\n integrator->setRandomNumberSeed(node.getIntProperty(\"randomSeed\"));\r\n+ integrator->setIntegrationForceGroups(node.getIntProperty(\"integrationForceGroups\", 0xFFFFFFFF));\r\n if (version > 1)\r\n integrator->setMaximumStepSize(node.getDoubleProperty(\"maxStepSize\"));\r\n return integrator;\r\ndiff --git a/serialization/src/VariableVerletIntegratorProxy.cpp b/serialization/src/VariableVerletIntegratorProxy.cpp\nindex 957db3eaad..a6162d1e1a 100644\n--- a/serialization/src/VariableVerletIntegratorProxy.cpp\n+++ b/serialization/src/VariableVerletIntegratorProxy.cpp\n@@ -6,7 +6,7 @@\n * Biological Structures at Stanford, funded under the NIH Roadmap for *\r\n * Medical Research, grant U54 GM072970. See https://simtk.org. *\r\n * *\r\n- * Portions copyright (c) 2010-2019 Stanford University and the Authors. *\r\n+ * Portions copyright (c) 2010-2024 Stanford University and the Authors. *\r\n * Authors: Peter Eastman, Yutong Zhao *\r\n * Contributors: *\r\n * *\r\n@@ -45,6 +45,7 @@ void VariableVerletIntegratorProxy::serialize(const void* object, SerializationN\n node.setDoubleProperty(\"maxStepSize\", integrator.getMaximumStepSize());\r\n node.setDoubleProperty(\"stepSize\", integrator.getStepSize());\r\n node.setDoubleProperty(\"constraintTolerance\", integrator.getConstraintTolerance());\r\n+ node.setIntProperty(\"integrationForceGroups\", integrator.getIntegrationForceGroups());\r\n }\r\n \r\n void* VariableVerletIntegratorProxy::deserialize(const SerializationNode& node) const {\r\n@@ -54,6 +55,7 @@ void* VariableVerletIntegratorProxy::deserialize(const SerializationNode& node)\n VariableVerletIntegrator *integrator = new VariableVerletIntegrator(node.getDoubleProperty(\"errorTol\"));\r\n integrator->setStepSize(node.getDoubleProperty(\"stepSize\"));\r\n integrator->setConstraintTolerance(node.getDoubleProperty(\"constraintTolerance\"));\r\n+ integrator->setIntegrationForceGroups(node.getIntProperty(\"integrationForceGroups\", 0xFFFFFFFF));\r\n if (version > 1)\r\n integrator->setMaximumStepSize(node.getDoubleProperty(\"maxStepSize\"));\r\n return integrator;\r\ndiff --git a/serialization/src/VerletIntegratorProxy.cpp b/serialization/src/VerletIntegratorProxy.cpp\nindex 53f7f77fe8..c3e4a35e98 100644\n--- a/serialization/src/VerletIntegratorProxy.cpp\n+++ b/serialization/src/VerletIntegratorProxy.cpp\n@@ -6,7 +6,7 @@\n * Biological Structures at Stanford, funded under the NIH Roadmap for *\r\n * Medical Research, grant U54 GM072970. See https://simtk.org. *\r\n * *\r\n- * Portions copyright (c) 2010 Stanford University and the Authors. *\r\n+ * Portions copyright (c) 2010-2024 Stanford University and the Authors. *\r\n * Authors: Peter Eastman, Yutong Zhao *\r\n * Contributors: *\r\n * *\r\n@@ -44,6 +44,7 @@ void VerletIntegratorProxy::serialize(const void* object, SerializationNode& nod\n const VerletIntegrator& integrator = *reinterpret_cast<const VerletIntegrator*>(object);\r\n node.setDoubleProperty(\"stepSize\", integrator.getStepSize());\r\n node.setDoubleProperty(\"constraintTolerance\", integrator.getConstraintTolerance());\r\n+ node.setIntProperty(\"integrationForceGroups\", integrator.getIntegrationForceGroups());\r\n }\r\n \r\n void* VerletIntegratorProxy::deserialize(const SerializationNode& node) const {\r\n@@ -51,5 +52,6 @@ void* VerletIntegratorProxy::deserialize(const SerializationNode& node) const {\n throw OpenMMException(\"Unsupported version number\");\r\n VerletIntegrator *integrator = new VerletIntegrator(node.getDoubleProperty(\"stepSize\"));\r\n integrator->setConstraintTolerance(node.getDoubleProperty(\"constraintTolerance\"));\r\n+ integrator->setIntegrationForceGroups(node.getIntProperty(\"integrationForceGroups\", 0xFFFFFFFF));\r\n return integrator;\r\n }\n\\ No newline at end of file\n"}, "test": {"test_patch": "diff --git a/plugins/drude/serialization/tests/TestSerializeDrudeLangevinIntegrator.cpp b/plugins/drude/serialization/tests/TestSerializeDrudeLangevinIntegrator.cpp\nindex d11e4f4fca..df366aabce 100644\n--- a/plugins/drude/serialization/tests/TestSerializeDrudeLangevinIntegrator.cpp\n+++ b/plugins/drude/serialization/tests/TestSerializeDrudeLangevinIntegrator.cpp\n@@ -6,7 +6,7 @@\n * Biological Structures at Stanford, funded under the NIH Roadmap for *\n * Medical Research, grant U54 GM072970. See https://simtk.org. *\n * *\n- * Portions copyright (c) 2013 Stanford University and the Authors. *\n+ * Portions copyright (c) 2013-2024 Stanford University and the Authors. *\n * Authors: Peter Eastman *\n * Contributors: *\n * *\n@@ -46,6 +46,7 @@ void testSerialization() {\n \n DrudeLangevinIntegrator integ1(301.1, 0.95, 10.5, 1.2, 0.001);\n integ1.setRandomNumberSeed(18);\n+ integ1.setIntegrationForceGroups(3);\n \n // Serialize and then deserialize it.\n \n@@ -61,6 +62,7 @@ void testSerialization() {\n ASSERT_EQUAL(integ1.getDrudeTemperature(), integ2.getDrudeTemperature());\n ASSERT_EQUAL(integ1.getDrudeFriction(), integ2.getDrudeFriction());\n ASSERT_EQUAL(integ1.getRandomNumberSeed(), integ2.getRandomNumberSeed());\n+ ASSERT_EQUAL(integ1.getIntegrationForceGroups(), integ2.getIntegrationForceGroups());\n }\n \n int main() {\ndiff --git a/plugins/drude/serialization/tests/TestSerializeDrudeNoseHooverIntegrator.cpp b/plugins/drude/serialization/tests/TestSerializeDrudeNoseHooverIntegrator.cpp\nindex fd6859c35b..696f89a612 100644\n--- a/plugins/drude/serialization/tests/TestSerializeDrudeNoseHooverIntegrator.cpp\n+++ b/plugins/drude/serialization/tests/TestSerializeDrudeNoseHooverIntegrator.cpp\n@@ -6,7 +6,7 @@\n * Biological Structures at Stanford, funded under the NIH Roadmap for *\n * Medical Research, grant U54 GM072970. See https://simtk.org. *\n * *\n- * Portions copyright (c) 2010-2014 Stanford University and the Authors. *\n+ * Portions copyright (c) 2010-2024 Stanford University and the Authors. *\n * Authors: Andrew C. Simmonett and Andreas Kraemer\n * Contributors: *\n * *\n@@ -51,6 +51,7 @@ void assertIntegratorsEqual(const DrudeNoseHooverIntegrator& integrator1, const\n ASSERT_EQUAL(integrator1.getConstraintTolerance(), integrator2.getConstraintTolerance());\n ASSERT_EQUAL(integrator1.getMaximumPairDistance(), integrator2.getMaximumPairDistance());\n ASSERT_EQUAL(integrator1.getNumThermostats(), integrator2.getNumThermostats());\n+ ASSERT_EQUAL(integrator1.getIntegrationForceGroups(), integrator2.getIntegrationForceGroups());\n for (int i = 0; i < integrator1.getNumThermostats(); i++) {\n const auto &thermostat1 = integrator1.getThermostat(i);\n const auto &thermostat2 = integrator2.getThermostat(i);\n@@ -84,6 +85,7 @@ void testSerialization() {\n system.addForce(new DrudeForce());\n for (int i=0; i<10; i++) system.addParticle(1.0);\n DrudeNoseHooverIntegrator integrator(331, 0.21, 1.1, 0.1, 0.004, 5, 5, 5);\n+ integrator.setIntegrationForceGroups(3);\n \n // Serialize and then deserialize it.\n stringstream buffer2;\ndiff --git a/serialization/tests/TestSerializeIntegrator.cpp b/serialization/tests/TestSerializeIntegrator.cpp\nindex 2663de097a..4bafd0377f 100644\n--- a/serialization/tests/TestSerializeIntegrator.cpp\n+++ b/serialization/tests/TestSerializeIntegrator.cpp\n@@ -52,17 +52,21 @@ using namespace std;\n \n void testSerializeVerletIntegrator() {\n VerletIntegrator *intg = new VerletIntegrator(0.00342);\n+ intg->setIntegrationForceGroups(3);\n stringstream ss;\n XmlSerializer::serialize<Integrator>(intg, \"VerletIntegrator\", ss);\n VerletIntegrator *intg2 = dynamic_cast<VerletIntegrator*>(XmlSerializer::deserialize<Integrator>(ss));\n ASSERT_EQUAL(intg->getConstraintTolerance(), intg2->getConstraintTolerance());\n ASSERT_EQUAL(intg->getStepSize(), intg2->getStepSize());\n+ ASSERT_EQUAL(intg->getIntegrationForceGroups(), intg2->getIntegrationForceGroups());\n delete intg;\n delete intg2;\n }\n \n void testSerializeLangevinIntegrator() {\n LangevinIntegrator *intg = new LangevinIntegrator(372.4, 1.234, 0.0018);\n+ intg->setRandomNumberSeed(10);\n+ intg->setIntegrationForceGroups(3);\n stringstream ss;\n XmlSerializer::serialize<Integrator>(intg, \"LangevinIntegrator\", ss);\n LangevinIntegrator *intg2 = dynamic_cast<LangevinIntegrator*>(XmlSerializer::deserialize<Integrator>(ss));\n@@ -71,12 +75,15 @@ void testSerializeLangevinIntegrator() {\n ASSERT_EQUAL(intg->getTemperature(), intg2->getTemperature());\n ASSERT_EQUAL(intg->getFriction(), intg2->getFriction());\n ASSERT_EQUAL(intg->getRandomNumberSeed(), intg2->getRandomNumberSeed());\n+ ASSERT_EQUAL(intg->getIntegrationForceGroups(), intg2->getIntegrationForceGroups());\n delete intg;\n delete intg2;\n }\n \n void testSerializeLangevinMiddleIntegrator() {\n LangevinMiddleIntegrator *intg = new LangevinMiddleIntegrator(372.4, 1.234, 0.0018);\n+ intg->setRandomNumberSeed(10);\n+ intg->setIntegrationForceGroups(3);\n stringstream ss;\n XmlSerializer::serialize<Integrator>(intg, \"LangevinMiddleIntegrator\", ss);\n LangevinMiddleIntegrator *intg2 = dynamic_cast<LangevinMiddleIntegrator*>(XmlSerializer::deserialize<Integrator>(ss));\n@@ -85,12 +92,15 @@ void testSerializeLangevinMiddleIntegrator() {\n ASSERT_EQUAL(intg->getTemperature(), intg2->getTemperature());\n ASSERT_EQUAL(intg->getFriction(), intg2->getFriction());\n ASSERT_EQUAL(intg->getRandomNumberSeed(), intg2->getRandomNumberSeed());\n+ ASSERT_EQUAL(intg->getIntegrationForceGroups(), intg2->getIntegrationForceGroups());\n delete intg;\n delete intg2;\n }\n \n void testSerializeBrownianIntegrator() {\n BrownianIntegrator *intg = new BrownianIntegrator(243.1, 3.234, 0.0021);\n+ intg->setRandomNumberSeed(10);\n+ intg->setIntegrationForceGroups(3);\n stringstream ss;\n XmlSerializer::serialize<Integrator>(intg, \"BrownianIntegrator\", ss);\n BrownianIntegrator *intg2 = dynamic_cast<BrownianIntegrator*>(XmlSerializer::deserialize<Integrator>(ss));\n@@ -99,6 +109,7 @@ void testSerializeBrownianIntegrator() {\n ASSERT_EQUAL(intg->getTemperature(), intg2->getTemperature());\n ASSERT_EQUAL(intg->getFriction(), intg2->getFriction());\n ASSERT_EQUAL(intg->getRandomNumberSeed(), intg2->getRandomNumberSeed());\n+ ASSERT_EQUAL(intg->getIntegrationForceGroups(), intg2->getIntegrationForceGroups());\n delete intg;\n delete intg2;\n }\n@@ -106,6 +117,7 @@ void testSerializeBrownianIntegrator() {\n void testSerializeVariableVerletIntegrator() {\n VariableVerletIntegrator intg(0.04234);\n intg.setMaximumStepSize(0.32);\n+ intg.setIntegrationForceGroups(3);\n stringstream ss;\n XmlSerializer::serialize<Integrator>(&intg, \"VariableVerletIntegrator\", ss);\n VariableVerletIntegrator *intg2 = dynamic_cast<VariableVerletIntegrator*>(XmlSerializer::deserialize<Integrator>(ss));\n@@ -113,12 +125,15 @@ void testSerializeVariableVerletIntegrator() {\n ASSERT_EQUAL(intg.getStepSize(), intg2->getStepSize());\n ASSERT_EQUAL(intg.getErrorTolerance(), intg2->getErrorTolerance());\n ASSERT_EQUAL(intg.getMaximumStepSize(), intg2->getMaximumStepSize());\n+ ASSERT_EQUAL(intg.getIntegrationForceGroups(), intg2->getIntegrationForceGroups());\n delete intg2;\n }\n \n void testSerializeVariableLangevinIntegrator() {\n VariableLangevinIntegrator intg(243.1, 3.234, 0.0021);\n intg.setMaximumStepSize(0.32);\n+ intg.setRandomNumberSeed(10);\n+ intg.setIntegrationForceGroups(3);\n stringstream ss;\n XmlSerializer::serialize<Integrator>(&intg, \"VariableLangevinIntegrator\", ss);\n VariableLangevinIntegrator *intg2 = dynamic_cast<VariableLangevinIntegrator*>(XmlSerializer::deserialize<Integrator>(ss));\n@@ -129,11 +144,14 @@ void testSerializeVariableLangevinIntegrator() {\n ASSERT_EQUAL(intg.getTemperature(), intg2->getTemperature());\n ASSERT_EQUAL(intg.getRandomNumberSeed(), intg2->getRandomNumberSeed());\n ASSERT_EQUAL(intg.getMaximumStepSize(), intg2->getMaximumStepSize());\n+ ASSERT_EQUAL(intg.getIntegrationForceGroups(), intg2->getIntegrationForceGroups());\n delete intg2;\n }\n \n void testSerializeCustomIntegrator() {\n CustomIntegrator *intg = new CustomIntegrator(0.002234);\n+ intg->setRandomNumberSeed(10);\n+ intg->setIntegrationForceGroups(3);\n intg->addPerDofVariable(\"temp\",0);\n vector<Vec3> initialValues(123);\n for(int i = 0; i < 123; i++)\n@@ -209,6 +227,7 @@ void testSerializeCustomIntegrator() {\n }\n ASSERT_EQUAL(intg->getKineticEnergyExpression(), intg2->getKineticEnergyExpression());\n ASSERT_EQUAL(intg->getRandomNumberSeed(), intg2->getRandomNumberSeed());\n+ ASSERT_EQUAL(intg->getIntegrationForceGroups(), intg2->getIntegrationForceGroups());\n ASSERT_EQUAL(intg->getStepSize(), intg2->getStepSize());\n ASSERT_EQUAL(intg->getConstraintTolerance(), intg2->getConstraintTolerance());\n ASSERT_EQUAL(intg->getNumTabulatedFunctions(), intg2->getNumTabulatedFunctions());\n@@ -233,10 +252,12 @@ void testSerializeCompoundIntegrator() {\n integ.addIntegrator(new LangevinIntegrator(372.4, 1.234, 0.0018));\n integ.addIntegrator(new VerletIntegrator(0.002));\n integ.setCurrentIntegrator(1);\n+ integ.setIntegrationForceGroups(3);\n stringstream ss;\n XmlSerializer::serialize<Integrator>(&integ, \"CompoundIntegrator\", ss);\n CompoundIntegrator *integ2 = dynamic_cast<CompoundIntegrator*>(XmlSerializer::deserialize<Integrator>(ss));\n ASSERT_EQUAL(integ.getCurrentIntegrator(), integ2->getCurrentIntegrator());\n+ ASSERT_EQUAL(integ.getIntegrationForceGroups(), integ2->getIntegrationForceGroups());\n LangevinIntegrator& langevin1 = dynamic_cast<LangevinIntegrator&>(integ.getIntegrator(0));\n LangevinIntegrator& langevin2 = dynamic_cast<LangevinIntegrator&>(integ2->getIntegrator(0));\n ASSERT_EQUAL(langevin1.getConstraintTolerance(), langevin2.getConstraintTolerance());\ndiff --git a/serialization/tests/TestSerializeNoseHooverIntegrator.cpp b/serialization/tests/TestSerializeNoseHooverIntegrator.cpp\nindex 4a244b5be0..ef23e036c3 100644\n--- a/serialization/tests/TestSerializeNoseHooverIntegrator.cpp\n+++ b/serialization/tests/TestSerializeNoseHooverIntegrator.cpp\n@@ -45,6 +45,7 @@ void assertIntegratorsEqual(const NoseHooverIntegrator& integrator1, const NoseH\n ASSERT_EQUAL(integrator1.getConstraintTolerance(), integrator2.getConstraintTolerance());\n ASSERT_EQUAL(integrator1.getMaximumPairDistance(), integrator2.getMaximumPairDistance());\n ASSERT_EQUAL(integrator1.getNumThermostats(), integrator2.getNumThermostats());\n+ ASSERT_EQUAL(integrator1.getIntegrationForceGroups(), integrator2.getIntegrationForceGroups());\n for (int i = 0; i < integrator1.getNumThermostats(); i++) {\n const auto &thermostat1 = integrator1.getThermostat(i);\n const auto &thermostat2 = integrator2.getThermostat(i);\n@@ -82,6 +83,7 @@ void testSerialization() {\n integrator_sub.addSubsystemThermostat(\n {0,1,2,3,4,7}, {{0,7}}, 301.1, 1.1, 1.2, 1.3, 9, 2, 5\n );\n+ integrator_sub.setIntegrationForceGroups(3);\n \n // Serialize and then deserialize it.\n \n", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}92{"question_id": "MSB_openmm_openmm_pr4741", "question_type": "multi_swe_bench", "description": "Added atomSubset option to DCDReporter and XTCReporter (openmm/openmm#4741)", "content": {"org": "openmm", "repo": "openmm", "pr_number": 4741, "issue_title": "Added atomSubset option to DCDReporter and XTCReporter", "issue_body": "When saving a trajectory to a DCD or XTC file, you can specify a subset of atoms to write. Fixes #4564.", "base_commit": "9fe1bae6efa18a55994522a8aac4f24338a2894e", "resolved_issues": [{"number": 4564, "title": "Recommended approach to writing out a subset of atoms with XTCReporter/DCDReporter?", "body": "I was going through the docs about [XTCReporter](https://docs.openmm.org/latest/api-python/generated/openmm.app.xtcreporter.XTCReporter.html) and [DCDReporter](https://docs.openmm.org/latest/api-python/generated/openmm.app.dcdreporter.DCDReporter.html) and I realized there's not really a well-documented way to use these reporters to save out a subset of atoms (or maybe I'm missing it somewhere else?). \r\n\r\nIs there a general recommended way to achieve this \"writing out a subset of atoms\" if we're writing out into XTC or DCD files? I'm imagining a basic scenario where it is known which atom indicies are desired to be saved, but the rest do not need to be written out. I'm currently envisioning having to write some kind of `subsetXTCReporter` or the like - would this be the best way to go about this?Just looking for any guidance here!\r\n\r\nAddendum: You can do this subsetting of atoms using the [XTCReporter](https://github.com/mdtraj/mdtraj/blob/ccd0c874361e4e31127e3803d3670d08d57f7933/mdtraj/reporters/xtcreporter.py#L42-L68) and [DCDReporter](https://mdtraj.readthedocs.io/en/latest/api/generated/mdtraj.reporters.DCDReporter.html#mdtraj.reporters.DCDReporter) in MDTraj - I'm just wondering if there are alternative approaches now that OpenMM has it's own native XTCReporter\n\n## IMPORTANT INSTRUCTIONS\n\n1. If you edit a python file, you MUST run 'make PythonInstall' inside the build directory\n2. If you edit a c++ file, you MUST run 'make -j4 && make install\" inside the build directory"}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/openmm_m_openmm:pr-4741", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/wrappers/python/openmm/app/dcdfile.py b/wrappers/python/openmm/app/dcdfile.py\nindex 53aeaafec6..335cdc0b79 100644\n--- a/wrappers/python/openmm/app/dcdfile.py\n+++ b/wrappers/python/openmm/app/dcdfile.py\n@@ -88,14 +88,14 @@ def __init__(self, file, topology, dt, firstStep=0, interval=1, append=False):\n self._modelCount = struct.unpack('<i', file.read(4))[0]\n file.seek(268, os.SEEK_SET)\n numAtoms = struct.unpack('<i', file.read(4))[0]\n- if numAtoms != len(list(topology.atoms())):\n+ if numAtoms != topology.getNumAtoms():\n raise ValueError('Cannot append to a DCD file that contains a different number of atoms')\n else:\n header = struct.pack('<i4c9if', 84, b'C', b'O', b'R', b'D', 0, firstStep, interval, 0, 0, 0, 0, 0, 0, dt)\n header += struct.pack('<13i', boxFlag, 0, 0, 0, 0, 0, 0, 0, 0, 24, 84, 164, 2)\n header += struct.pack('<80s', b'Created by OpenMM')\n header += struct.pack('<80s', b'Created '+time.asctime(time.localtime(time.time())).encode('ascii'))\n- header += struct.pack('<4i', 164, 4, len(list(topology.atoms())), 4)\n+ header += struct.pack('<4i', 164, 4, topology.getNumAtoms(), 4)\n file.write(header)\n \n def writeModel(self, positions, unitCellDimensions=None, periodicBoxVectors=None):\ndiff --git a/wrappers/python/openmm/app/dcdreporter.py b/wrappers/python/openmm/app/dcdreporter.py\nindex 09b1d9439a..d09d5c149c 100644\n--- a/wrappers/python/openmm/app/dcdreporter.py\n+++ b/wrappers/python/openmm/app/dcdreporter.py\n@@ -6,7 +6,7 @@\n Biological Structures at Stanford, funded under the NIH Roadmap for\n Medical Research, grant U54 GM072970. See https://simtk.org.\n \n-Portions copyright (c) 2012 Stanford University and the Authors.\n+Portions copyright (c) 2012-2024 Stanford University and the Authors.\n Authors: Peter Eastman\n Contributors:\n \n@@ -32,8 +32,7 @@\n __author__ = \"Peter Eastman\"\n __version__ = \"1.0\"\n \n-from openmm.app import DCDFile\n-from openmm.unit import nanometer\n+from openmm.app import DCDFile, Topology\n \n class DCDReporter(object):\n \"\"\"DCDReporter outputs a series of frames from a Simulation to a DCD file.\n@@ -41,7 +40,7 @@ class DCDReporter(object):\n To use it, create a DCDReporter, then add it to the Simulation's list of reporters.\n \"\"\"\n \n- def __init__(self, file, reportInterval, append=False, enforcePeriodicBox=None):\n+ def __init__(self, file, reportInterval, append=False, enforcePeriodicBox=None, atomSubset=None):\n \"\"\"Create a DCDReporter.\n \n Parameters\n@@ -57,10 +56,13 @@ def __init__(self, file, reportInterval, append=False, enforcePeriodicBox=None):\n lies in the same periodic box. If None (the default), it will automatically decide whether\n to translate molecules based on whether the system being simulated uses periodic boundary\n conditions.\n+ atomSubset: list\n+ Atom indices (zero indexed) of the particles to output. If None (the default), all particles will be output.\n \"\"\"\n self._reportInterval = reportInterval\n self._append = append\n self._enforcePeriodicBox = enforcePeriodicBox\n+ self._atomSubset = atomSubset\n if append:\n mode = 'r+b'\n else:\n@@ -96,11 +98,24 @@ def report(self, simulation, state):\n \"\"\"\n \n if self._dcd is None:\n+ if self._atomSubset is None:\n+ topology = simulation.topology\n+ else:\n+ topology = Topology()\n+ topology.setPeriodicBoxVectors(simulation.topology.getPeriodicBoxVectors())\n+ atoms = list(simulation.topology.atoms())\n+ chain = topology.addChain()\n+ residue = topology.addResidue('', chain)\n+ for i in self._atomSubset:\n+ topology.addAtom(atoms[i].name, atoms[i].element, residue)\n self._dcd = DCDFile(\n- self._out, simulation.topology, simulation.integrator.getStepSize(),\n+ self._out, topology, simulation.integrator.getStepSize(),\n simulation.currentStep, self._reportInterval, self._append\n )\n- self._dcd.writeModel(state.getPositions(asNumpy=True), periodicBoxVectors=state.getPeriodicBoxVectors())\n+ positions = state.getPositions(asNumpy=True)\n+ if self._atomSubset is not None:\n+ positions = [positions[i] for i in self._atomSubset]\n+ self._dcd.writeModel(positions, periodicBoxVectors=state.getPeriodicBoxVectors())\n \n def __del__(self):\n self._out.close()\ndiff --git a/wrappers/python/openmm/app/xtcfile.py b/wrappers/python/openmm/app/xtcfile.py\nindex 39fc5226eb..3fb821eb5f 100644\n--- a/wrappers/python/openmm/app/xtcfile.py\n+++ b/wrappers/python/openmm/app/xtcfile.py\n@@ -56,9 +56,9 @@ def __init__(self, fileName, topology, dt, firstStep=0, interval=1, append=False\n raise FileNotFoundError(f\"The file '{self._filename}' does not exist.\")\n self._modelCount = get_xtc_nframes(self._filename.encode(\"utf-8\"))\n natoms = get_xtc_natoms(self._filename.encode(\"utf-8\"))\n- if natoms != len(list(topology.atoms())):\n+ if natoms != topology.getNumAtoms():\n raise ValueError(\n- f\"The number of atoms in the topology ({len(list(topology.atoms()))}) does not match the number of atoms in the XTC file ({natoms})\"\n+ f\"The number of atoms in the topology ({topology.getNumAtoms()}) does not match the number of atoms in the XTC file ({natoms})\"\n )\n else:\n if os.path.isfile(self._filename) and os.path.getsize(self._filename) > 0:\ndiff --git a/wrappers/python/openmm/app/xtcreporter.py b/wrappers/python/openmm/app/xtcreporter.py\nindex 38ef3b4d2d..0a05e59ad6 100644\n--- a/wrappers/python/openmm/app/xtcreporter.py\n+++ b/wrappers/python/openmm/app/xtcreporter.py\n@@ -1,5 +1,35 @@\n+\"\"\"\n+xtcreporter.py: Outputs simulation trajectories in XTC format\n+\n+This is part of the OpenMM molecular simulation toolkit originating from\n+Simbios, the NIH National Center for Physics-Based Simulation of\n+Biological Structures at Stanford, funded under the NIH Roadmap for\n+Medical Research, grant U54 GM072970. See https://simtk.org.\n+\n+Portions copyright (c) 2024 Stanford University and the Authors.\n+Authors: Raul P. Pelaez\n+Contributors: Peter Eastman\n+\n+Permission is hereby granted, free of charge, to any person obtaining a\n+copy of this software and associated documentation files (the \"Software\"),\n+to deal in the Software without restriction, including without limitation\n+the rights to use, copy, modify, merge, publish, distribute, sublicense,\n+and/or sell copies of the Software, and to permit persons to whom the\n+Software is furnished to do so, subject to the following conditions:\n+\n+The above copyright notice and this permission notice shall be included in\n+all copies or substantial portions of the Software.\n+\n+THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL\n+THE AUTHORS, CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n+DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n+OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n+USE OR OTHER DEALINGS IN THE SOFTWARE.\n+\"\"\"\n __author__ = \"Raul P. Pelaez\"\n-from openmm.app import XTCFile\n+from openmm.app import Topology, XTCFile\n \n class XTCReporter(object):\n \"\"\"XTCReporter outputs a series of frames from a Simulation to a XTC file.\n@@ -7,7 +37,7 @@ class XTCReporter(object):\n To use it, create a XTCReporter, then add it to the Simulation's list of reporters.\n \"\"\"\n \n- def __init__(self, file, reportInterval, append=False, enforcePeriodicBox=None):\n+ def __init__(self, file, reportInterval, append=False, enforcePeriodicBox=None, atomSubset=None):\n \"\"\"Create a XTCReporter.\n \n Parameters\n@@ -23,10 +53,13 @@ def __init__(self, file, reportInterval, append=False, enforcePeriodicBox=None):\n lies in the same periodic box. If None (the default), it will automatically decide whether\n to translate molecules based on whether the system being simulated uses periodic boundary\n conditions.\n+ atomSubset: list\n+ Atom indices (zero indexed) of the particles to output. If None (the default), all particles will be output.\n \"\"\"\n self._reportInterval = reportInterval\n self._append = append\n self._enforcePeriodicBox = enforcePeriodicBox\n+ self._atomSubset = atomSubset\n self._fileName = file\n self._xtc = None\n if not append:\n@@ -60,14 +93,25 @@ def report(self, simulation, state):\n \"\"\"\n \n if self._xtc is None:\n+ if self._atomSubset is None:\n+ topology = simulation.topology\n+ else:\n+ topology = Topology()\n+ topology.setPeriodicBoxVectors(simulation.topology.getPeriodicBoxVectors())\n+ atoms = list(simulation.topology.atoms())\n+ chain = topology.addChain()\n+ residue = topology.addResidue('', chain)\n+ for i in self._atomSubset:\n+ topology.addAtom(atoms[i].name, atoms[i].element, residue)\n self._xtc = XTCFile(\n self._fileName,\n- simulation.topology,\n+ topology,\n simulation.integrator.getStepSize(),\n simulation.currentStep,\n self._reportInterval,\n self._append,\n )\n- self._xtc.writeModel(\n- state.getPositions(asNumpy=True), periodicBoxVectors=state.getPeriodicBoxVectors()\n- )\n+ positions = state.getPositions(asNumpy=True)\n+ if self._atomSubset is not None:\n+ positions = [positions[i] for i in self._atomSubset]\n+ self._xtc.writeModel(positions, periodicBoxVectors=state.getPeriodicBoxVectors())\n"}, "test": {"test_patch": "diff --git a/wrappers/python/tests/TestDcdFile.py b/wrappers/python/tests/TestDcdFile.py\nindex 73af629eff..1ce1cbdeaf 100644\n--- a/wrappers/python/tests/TestDcdFile.py\n+++ b/wrappers/python/tests/TestDcdFile.py\n@@ -66,6 +66,44 @@ def testAppend(self):\n del dcd\n os.remove(fname)\n \n+ def testAtomSubset(self):\n+ \"\"\"Test writing a DCD file containing a subset of atoms\"\"\"\n+ fname = tempfile.mktemp(suffix='.dcd')\n+ pdb = app.PDBFile('systems/alanine-dipeptide-explicit.pdb')\n+ ff = app.ForceField('amber99sb.xml', 'tip3p.xml')\n+ system = ff.createSystem(pdb.topology)\n+\n+ # Create a simulation and write some frames to a DCD file.\n+\n+ integrator = mm.VerletIntegrator(0.001*unit.picoseconds)\n+ simulation = app.Simulation(pdb.topology, system, integrator, mm.Platform.getPlatform('Reference'))\n+ atomSubset = [atom.index for atom in next(pdb.topology.chains()).atoms()]\n+ dcd = app.DCDReporter(fname, 2, atomSubset=atomSubset)\n+ simulation.reporters.append(dcd)\n+ simulation.context.setPositions(pdb.positions)\n+ simulation.context.setVelocitiesToTemperature(300*unit.kelvin)\n+ simulation.step(10)\n+ self.assertEqual(5, dcd._dcd._modelCount)\n+ del simulation\n+ del dcd\n+ len1 = os.stat(fname).st_size\n+\n+ # Create a new simulation and have it append some more frames.\n+\n+ integrator = mm.VerletIntegrator(0.001*unit.picoseconds)\n+ simulation = app.Simulation(pdb.topology, system, integrator, mm.Platform.getPlatform('Reference'))\n+ dcd = app.DCDReporter(fname, 2, append=True, atomSubset=atomSubset)\n+ simulation.reporters.append(dcd)\n+ simulation.context.setPositions(pdb.positions)\n+ simulation.context.setVelocitiesToTemperature(300*unit.kelvin)\n+ simulation.step(10)\n+ self.assertEqual(10, dcd._dcd._modelCount)\n+ len2 = os.stat(fname).st_size\n+ self.assertTrue(len2-len1 > 3*4*5*len(atomSubset))\n+ del simulation\n+ del dcd\n+ os.remove(fname)\n+\n \n if __name__ == '__main__':\n unittest.main()\ndiff --git a/wrappers/python/tests/TestXtcFile.py b/wrappers/python/tests/TestXtcFile.py\nindex e9eb954547..a66c6a2a3f 100644\n--- a/wrappers/python/tests/TestXtcFile.py\n+++ b/wrappers/python/tests/TestXtcFile.py\n@@ -194,6 +194,43 @@ def testAppend(self):\n del simulation\n del xtc\n \n+ def testAtomSubset(self):\n+ \"\"\"Test writing an XTC file containing a subset of atoms\"\"\"\n+ with tempfile.TemporaryDirectory() as temp:\n+ fname = os.path.join(temp, 'traj.xtc')\n+ pdb = app.PDBFile(\"systems/alanine-dipeptide-explicit.pdb\")\n+ ff = app.ForceField(\"amber99sb.xml\", \"tip3p.xml\")\n+ system = ff.createSystem(pdb.topology)\n+\n+ # Create a simulation and write some frames to a XTC file.\n+\n+ integrator = mm.VerletIntegrator(1e-10 * unit.picoseconds)\n+ simulation = app.Simulation(\n+ pdb.topology,\n+ system,\n+ integrator,\n+ mm.Platform.getPlatform(\"Reference\"),\n+ )\n+ atomSubset = [atom.index for atom in next(pdb.topology.chains()).atoms()]\n+ xtc = app.XTCReporter(fname, 2, atomSubset=atomSubset)\n+ simulation.reporters.append(xtc)\n+ simulation.context.setPositions(pdb.positions)\n+ simulation.context.setVelocitiesToTemperature(300 * unit.kelvin)\n+ simulation.step(10)\n+ self.assertEqual(5, xtc._xtc._modelCount)\n+ self.assertEqual(5, xtc._xtc._getNumFrames())\n+\n+ # The XTCFile class does not provide a way to read the\n+ # trajectory back, but the underlying XTC library does\n+ coords_read, box_read, time, step = read_xtc(fname.encode(\"utf-8\"))\n+ self.assertEqual(coords_read.shape, (22, 3, 5))\n+ self.assertEqual(box_read.shape, (3, 3, 5))\n+ self.assertEqual(len(time), 5)\n+ self.assertEqual(len(step), 5)\n+ coords = [pdb.positions[i].value_in_unit(unit.nanometers) for i in atomSubset]\n+ self.assertTrue(np.allclose(coords_read[:,:,0], coords, atol=1e-3))\n+ self.assertTrue(np.allclose(box_read[:,:,0], pdb.topology.getPeriodicBoxVectors().value_in_unit(unit.nanometers), atol=1e-3))\n+\n \n if __name__ == \"__main__\":\n unittest.main()\n", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}93{"question_id": "MSB_openmm_openmm_pr4767", "question_type": "multi_swe_bench", "description": "Cleaner printing of units (openmm/openmm#4767)", "content": {"org": "openmm", "repo": "openmm", "pr_number": 4767, "issue_title": "Cleaner printing of units", "issue_body": "This changes the default string representation of Quantities to print values with units in a simpler form. With the current code:\r\n\r\n```python\r\n>>> 1.5*nanometers\r\nQuantity(value=1.5, unit=nanometer)\r\n```\r\n\r\nWith this PR:\r\n\r\n```python\r\n>>> 1.5*nanometers\r\n1.5 nm\r\n```", "base_commit": "a3628b48bd68e93d2cd797cb11fa5c1eacce5261", "resolved_issues": [{"number": null, "title": "Cleaner printing of units", "body": "The current string representation of quantities in the library is verbose and not user-friendly. When a quantity is printed, it displays the value and unit in a detailed format, such as `Quantity(value=1.5, unit=nanometer)`. This format is unnecessarily complex and can make the output harder to read, especially when working with a large number of quantities.\n\nThe expected behavior is for quantities to be displayed in a cleaner and more concise format, showing only the numeric value followed by the unit symbol. For example, `1.5*nanometers` should be represented as `1.5 nm`. This would improve readability and make the output more intuitive for users.\n\n## IMPORTANT INSTRUCTIONS\n\n1. If you edit a python file, you MUST run 'make PythonInstall' inside the build directory\n2. If you edit a c++ file, you MUST run 'make -j4 && make install\" inside the build directory"}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/openmm_m_openmm:pr-4767", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/wrappers/python/openmm/unit/quantity.py b/wrappers/python/openmm/unit/quantity.py\nindex d93283c7f9..0559c145cd 100644\n--- a/wrappers/python/openmm/unit/quantity.py\n+++ b/wrappers/python/openmm/unit/quantity.py\n@@ -215,8 +215,7 @@ def __str__(self):\n def __repr__(self):\n \"\"\"\n \"\"\"\n- return (Quantity.__name__ + '(value=' + repr(self._value) + ', unit=' +\n- str(self.unit) + ')')\n+ return str(self)\n \n def format(self, format_spec):\n return format_spec % self._value + ' ' + str(self.unit.get_symbol())\n"}, "test": {"test_patch": "diff --git a/wrappers/python/tests/TestUnits.py b/wrappers/python/tests/TestUnits.py\nindex 5bbda4fb66..9c7712db8d 100644\n--- a/wrappers/python/tests/TestUnits.py\n+++ b/wrappers/python/tests/TestUnits.py\n@@ -630,7 +630,7 @@ def testMisc(self):\n \"\"\" Miscellaneous tests for the unit package \"\"\"\n self.assertTrue(u.meter is not None)\n self.assertFalse(u.meter is None)\n- self.assertEqual(repr(1.2*u.meters), 'Quantity(value=1.2, unit=meter)')\n+ self.assertEqual(repr(1.2*u.meters), '1.2 m')\n class Foo(object):\n def bar(self):\n return 'bar'\n", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}94{"question_id": "MSB_openmm_openmm_pr4794", "question_type": "multi_swe_bench", "description": "Fixes precision mismatch when appending to an XTC file with 9 atoms or less (openmm/openmm#4794)", "content": {"org": "openmm", "repo": "openmm", "pr_number": 4794, "issue_title": "Fixes precision mismatch when appending to an XTC file with 9 atoms or less", "issue_body": "Should fix #4793. Note that this issue in the reading code is triggered by attempting to append to an XTC because the XTC writer reads before appending to check that the number of atoms is consistent.", "base_commit": "39808f12cb7dc0465748cc3884b50594ef568523", "resolved_issues": [{"number": 4793, "title": "\"xtc_read(): precision mismatch\" when creating a new reporter appending to an existing file", "body": "Hi,\n\nI encountered an error of which I could find no information anywhere else. When running the following code with some dummy systems with the same atoms, I get an error as soon as I end up on the last step. I am running a Free Energy Perturbation, using a range of different systems forming one trajectory. This error seems to be caused by using a new xtc reporter on the same file. If I use the same xtc reporter, I get the correct results.\n\n```\nwith open('system1.xml') as f:\n str = f.read()\nsystem1 = mm.XmlSerializer.deserialize(str)\nwith open('system2.xml') as f:\n str = f.read()\nsystem2 = mm.XmlSerializer.deserialize(str)\npdb = mmapp.PDBFile('topology.pdb')\ntopology = pdb.topology\npositions = pdb.positions\n\nintegrator1 = mm.VerletIntegrator(1.0*mmunit.femtoseconds)\nsimulation1 = mmapp.Simulation(topology, system1, integrator1)\nsimulation1.context.setPositions(positions)\nxtcrep1 = mmapp.XTCReporter('traj.xtc',1)\nsimulation1.reporters.append(xtcrep1)\nsimulation1.step(10)\npositions1 = simulation1.context.getState(getPositions=True).getPositions()\n\nintegrator2 = mm.VerletIntegrator(1.0*mmunit.femtoseconds)\nsimulation2 = mmapp.Simulation(topology, system2, integrator2)\nsimulation2.context.setPositions(positions1)\nxtcrep2 = mmapp.XTCReporter('traj.xtc',1,append=True)\nsimulation2.reporters.append(xtcrep2)\nsimulation2.step(10)\n```\n\n## IMPORTANT INSTRUCTIONS\n\n1. If you edit a python file, you MUST run 'make PythonInstall' inside the build directory\n2. If you edit a c++ file, you MUST run 'make -j4 && make install\" inside the build directory"}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/openmm_m_openmm:pr-4794", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/wrappers/python/openmm/app/internal/xtc_utils/src/xtc.cpp b/wrappers/python/openmm/app/internal/xtc_utils/src/xtc.cpp\nindex 838e3709df..de65c83fef 100644\n--- a/wrappers/python/openmm/app/internal/xtc_utils/src/xtc.cpp\n+++ b/wrappers/python/openmm/app/internal/xtc_utils/src/xtc.cpp\n@@ -81,7 +81,9 @@ struct XTCFrame {\n \n // Read the next frame from the XTC file and store it in this object\n int readNextFrame(XDRFILE* xd) {\n- float in_prec;\n+ // Preinitialize in_prec for the precision check below since it may not\n+ // be modified by read_xtc if the coordinates to read are not compressed\n+ float in_prec = prec;\n auto* p_ptr = reinterpret_cast<rvec*>(positions.data());\n int status = read_xtc(xd, natoms, &step, &time, box, p_ptr, &in_prec);\n if (status == exdrOK && prec != in_prec) {\n"}, "test": {"test_patch": "diff --git a/wrappers/python/tests/TestXtcFile.py b/wrappers/python/tests/TestXtcFile.py\nindex a66c6a2a3f..dbbb93cc7a 100644\n--- a/wrappers/python/tests/TestXtcFile.py\n+++ b/wrappers/python/tests/TestXtcFile.py\n@@ -135,6 +135,48 @@ def test_xtc_box_from_topology(self):\n )\n self.assertTrue(np.allclose(step, np.arange(0, nframes), atol=1e-5))\n \n+ def test_xtc_small(self):\n+ \"\"\"Test the XTC file by writing a trajectory and reading it back. Using a system size below the compression threshold\"\"\"\n+ with tempfile.TemporaryDirectory() as temp:\n+ fname = os.path.join(temp, 'traj.xtc')\n+ pdbfile = app.PDBFile(\"systems/ions.pdb\")\n+ # Set some arbitrary size for the unit cell so that a box is included in the trajectory\n+ pdbfile.topology.setUnitCellDimensions([10, 10, 10])\n+ natom = len(list(pdbfile.topology.atoms()))\n+ nframes = 20\n+ xtc = app.XTCFile(fname, pdbfile.topology, 0.001)\n+ coords = []\n+ box = []\n+ for i in range(nframes):\n+ coords.append(\n+ [mm.Vec3(random(), random(), random()) for j in range(natom)]\n+ * unit.nanometers\n+ )\n+ box_i = (\n+ mm.Vec3(random(), random(), random()) * unit.nanometers,\n+ mm.Vec3(random(), random(), random()) * unit.nanometers,\n+ mm.Vec3(random(), random(), random()) * unit.nanometers,\n+ )\n+ box.append(np.array([[vec.x, vec.y, vec.z] for vec in box_i]))\n+ xtc.writeModel(coords[i], periodicBoxVectors=box_i)\n+ # The XTCFile class does not provide a way to read the\n+ # trajectory back, but the underlying XTC library does\n+ coords_read, box_read, time, step = read_xtc(fname.encode(\"utf-8\"))\n+ self.assertEqual(coords_read.shape, (natom, 3, nframes))\n+ self.assertEqual(box_read.shape, (3, 3, nframes))\n+ self.assertEqual(len(time), nframes)\n+ self.assertEqual(len(step), nframes)\n+ coords = np.array(\n+ [c.value_in_unit(unit.nanometers) for c in coords]\n+ ).transpose(1, 2, 0)\n+ self.assertTrue(np.allclose(coords_read, coords, atol=1e-3))\n+ box = np.array(box).transpose(1, 2, 0)\n+ self.assertTrue(np.allclose(box_read, box, atol=1e-3))\n+ self.assertTrue(\n+ np.allclose(time, np.arange(0, nframes) * 0.001, atol=1e-5)\n+ )\n+ self.assertTrue(np.allclose(step, np.arange(0, nframes), atol=1e-5))\n+\n def testLongTrajectory(self):\n \"\"\"Test writing a trajectory that has more than 2^31 steps.\"\"\"\n with tempfile.TemporaryDirectory() as temp:\n", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}95{"question_id": "MSB_openmm_openmm_pr4795", "question_type": "multi_swe_bench", "description": "Properly handle and test multiple registration of atom types without elements (openmm/openmm#4795)", "content": {"org": "openmm", "repo": "openmm", "pr_number": 4795, "issue_title": "Properly handle and test multiple registration of atom types without elements", "issue_body": "`ForceField` allows multiple atom type definitions with the same name if their parameters are identical and forbids them if they differ. `registerAtomType()` allows atom types' elements to be `None` (by not specifying an `element` attribute in the `<Type>`): https://github.com/openmm/openmm/blob/39808f12cb7dc0465748cc3884b50594ef568523/wrappers/python/openmm/app/forcefield.py#L452-L456 but this is not handled correctly in the duplicate checking code, which assumes that the element is not `None` and that the attribute is always present:\r\nhttps://github.com/openmm/openmm/blob/39808f12cb7dc0465748cc3884b50594ef568523/wrappers/python/openmm/app/forcefield.py#L447-L449 This came up in trying to split a Drude force field, which uses atom types without elements for the Drude particles, into multiple files.\r\n\r\nThe change here should fix this problem. It also adds several tests for the duplicate checking functionality, which was not previously covered by the test suite. Do the tests make sense (do they match the expected behavior)?", "base_commit": "39808f12cb7dc0465748cc3884b50594ef568523", "resolved_issues": [{"number": null, "title": "Properly handle and test multiple registration of atom types without elements", "body": "When using the `ForceField` functionality, multiple registrations of atom types with the same name are allowed only if their parameters are identical. However, the current implementation does not correctly handle cases where the `element` attribute is absent or set to `None`. This leads to incorrect duplicate checking behavior, particularly for atom types without elements, such as those used for Drude particles in specialized force fields. \n\nThe expected behavior is that the system should allow multiple registrations of atom types with identical definitions, even when the `element` attribute is not specified or is set to `None`. Duplicate registrations with differing parameters should still be disallowed. Additionally, the duplicate checking functionality should be robust and consistently enforce these rules.\n\n## IMPORTANT INSTRUCTIONS\n\n1. If you edit a python file, you MUST run 'make PythonInstall' inside the build directory\n2. If you edit a c++ file, you MUST run 'make -j4 && make install\" inside the build directory"}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/openmm_m_openmm:pr-4795", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/.github/workflows/CI.yml b/.github/workflows/CI.yml\nindex f5b240ee6b..decb51552c 100644\n--- a/.github/workflows/CI.yml\n+++ b/.github/workflows/CI.yml\n@@ -212,7 +212,7 @@ jobs:\n ccache -z\n \n - name: \"Restore ccache\"\n- uses: actions/cache@v3.3.2\n+ uses: actions/cache@v4\n with:\n path: .ccache\n key: ccache-${{ secrets.CACHE_VERSION }}-${{ steps.prepare-ccache.outputs.key }}-${{ steps.prepare-ccache.outputs.timestamp }}\n@@ -354,7 +354,7 @@ jobs:\n ccache -z\n \n - name: \"Restore ccache\"\n- uses: actions/cache@v3.3.2\n+ uses: actions/cache@v4\n with:\n path: .ccache\n key: ccache-${{ secrets.CACHE_VERSION }}-${{ steps.prepare-ccache.outputs.key }}-${{ steps.prepare-ccache.outputs.timestamp }}\n@@ -495,7 +495,7 @@ jobs:\n echo \"timestamp=$(date +%Y%m%d-%H%M%S)\" >> $GITHUB_OUTPUT\n \n - name: \"Restore ccache\"\n- uses: actions/cache@v3.3.2\n+ uses: actions/cache@v4\n with:\n path: .ccache\n key: ccache-${{ secrets.CACHE_VERSION }}-${{ steps.prepare-ccache.outputs.key }}-${{ steps.prepare-ccache.outputs.timestamp }}\n@@ -567,7 +567,7 @@ jobs:\n ccache -z\n \n - name: \"Restore ccache\"\n- uses: actions/cache@v3.3.2\n+ uses: actions/cache@v4\n with:\n path: .ccache\n key: ccache-${{ secrets.CACHE_VERSION }}-${{ steps.prepare-ccache.outputs.key }}-${{ steps.prepare-ccache.outputs.timestamp }}\ndiff --git a/wrappers/python/openmm/app/forcefield.py b/wrappers/python/openmm/app/forcefield.py\nindex c33446d53f..40364aef07 100644\n--- a/wrappers/python/openmm/app/forcefield.py\n+++ b/wrappers/python/openmm/app/forcefield.py\n@@ -444,7 +444,8 @@ def registerAtomType(self, parameters):\n if name in self._atomTypes:\n # allow multiple registrations of the same atom type provided the definitions are identical\n existing = self._atomTypes[name]\n- if existing.atomClass == parameters['class'] and existing.mass == float(parameters['mass']) and existing.element.symbol == parameters['element']:\n+ elementsMatch = ((existing.element is None and 'element' not in parameters) or (existing.element is not None and 'element' in parameters and existing.element.symbol == parameters['element']))\n+ if existing.atomClass == parameters['class'] and existing.mass == float(parameters['mass']) and elementsMatch:\n return\n raise ValueError('Found multiple definitions for atom type: '+name)\n atomClass = parameters['class']\n"}, "test": {"test_patch": "diff --git a/wrappers/python/tests/TestForceField.py b/wrappers/python/tests/TestForceField.py\nindex 35707f05ec..e37ac7df08 100644\n--- a/wrappers/python/tests/TestForceField.py\n+++ b/wrappers/python/tests/TestForceField.py\n@@ -379,6 +379,156 @@ def test_PeriodicBoxVectors(self):\n self.assertEqual(vectors[i], self.pdb1.topology.getPeriodicBoxVectors()[i])\n self.assertEqual(vectors[i], system.getDefaultPeriodicBoxVectors()[i])\n \n+ def test_duplicateAtomTypeAllowed(self):\n+ \"\"\"Test that multiple registrations of the same atom type with identical definitions are allowed.\"\"\"\n+\n+ xml1 = \"\"\"\n+<ForceField>\n+ <AtomTypes>\n+ <Type name=\"test-name\" class=\"test\" element=\"H\" mass=\"1.007947\"/>\n+ </AtomTypes>\n+</ForceField>\"\"\"\n+\n+ xml2 = \"\"\"\n+<ForceField>\n+ <AtomTypes>\n+ <Type name=\"test-name\" class=\"test\" element=\"H\" mass=\"1.007947\"/>\n+ </AtomTypes>\n+</ForceField>\"\"\"\n+\n+ ff = ForceField(StringIO(xml1), StringIO(xml2))\n+\n+ self.assertTrue(\"test-name\" in ff._atomTypes)\n+ at = ff._atomTypes[\"test-name\"]\n+ self.assertEqual(at.atomClass, \"test\")\n+ self.assertEqual(at.element, elem.hydrogen)\n+ self.assertEqual(at.mass, 1.007947)\n+\n+ def test_duplicateAtomTypeAllowedNoElement(self):\n+ \"\"\"Test that multiple registrations of the same atom type with identical definitions and without elements are allowed.\"\"\"\n+\n+ xml1 = \"\"\"\n+<ForceField>\n+ <AtomTypes>\n+ <Type name=\"test-name\" class=\"test\" mass=\"0.0\"/>\n+ </AtomTypes>\n+</ForceField>\"\"\"\n+\n+ xml2 = \"\"\"\n+<ForceField>\n+ <AtomTypes>\n+ <Type name=\"test-name\" class=\"test\" mass=\"0.0\"/>\n+ </AtomTypes>\n+</ForceField>\"\"\"\n+\n+ ff = ForceField(StringIO(xml1), StringIO(xml2))\n+\n+ self.assertTrue(\"test-name\" in ff._atomTypes)\n+ at = ff._atomTypes[\"test-name\"]\n+ self.assertEqual(at.atomClass, \"test\")\n+ self.assertEqual(at.element, None)\n+ self.assertEqual(at.mass, 0.0)\n+\n+ def test_duplicateAtomTypeForbiddenClass(self):\n+ \"\"\"Test that multiple registrations of the same atom type with different classes are forbidden.\"\"\"\n+\n+ xml1 = \"\"\"\n+<ForceField>\n+ <AtomTypes>\n+ <Type name=\"test-name\" class=\"test-1\" element=\"H\" mass=\"1.007947\"/>\n+ </AtomTypes>\n+</ForceField>\"\"\"\n+\n+ xml2 = \"\"\"\n+<ForceField>\n+ <AtomTypes>\n+ <Type name=\"test-name\" class=\"test-2\" element=\"H\" mass=\"1.007947\"/>\n+ </AtomTypes>\n+</ForceField>\"\"\"\n+\n+ with self.assertRaises(ValueError):\n+ ff = ForceField(StringIO(xml1), StringIO(xml2))\n+\n+ def test_duplicateAtomTypeForbiddenElement(self):\n+ \"\"\"Test that multiple registrations of the same atom type with different elements are forbidden.\"\"\"\n+\n+ xml1 = \"\"\"\n+<ForceField>\n+ <AtomTypes>\n+ <Type name=\"test-name\" class=\"test\" element=\"H\" mass=\"1.007947\"/>\n+ </AtomTypes>\n+</ForceField>\"\"\"\n+\n+ xml2 = \"\"\"\n+<ForceField>\n+ <AtomTypes>\n+ <Type name=\"test-name\" class=\"test\" element=\"C\" mass=\"1.007947\"/>\n+ </AtomTypes>\n+</ForceField>\"\"\"\n+\n+ with self.assertRaises(ValueError):\n+ ff = ForceField(StringIO(xml1), StringIO(xml2))\n+\n+ def test_duplicateAtomTypeForbiddenElementAdded(self):\n+ \"\"\"Test that multiple registrations of the same atom type, the first without and the second with an element, are forbidden.\"\"\"\n+\n+ xml1 = \"\"\"\n+<ForceField>\n+ <AtomTypes>\n+ <Type name=\"test-name\" class=\"test\" mass=\"1.007947\"/>\n+ </AtomTypes>\n+</ForceField>\"\"\"\n+\n+ xml2 = \"\"\"\n+<ForceField>\n+ <AtomTypes>\n+ <Type name=\"test-name\" class=\"test\" element=\"H\" mass=\"1.007947\"/>\n+ </AtomTypes>\n+</ForceField>\"\"\"\n+\n+ with self.assertRaises(ValueError):\n+ ff = ForceField(StringIO(xml1), StringIO(xml2))\n+\n+ def test_duplicateAtomTypeForbiddenElementRemoved(self):\n+ \"\"\"Test that multiple registrations of the same atom type, the first with and the second without an element, are forbidden.\"\"\"\n+\n+ xml1 = \"\"\"\n+<ForceField>\n+ <AtomTypes>\n+ <Type name=\"test-name\" class=\"test\" element=\"H\" mass=\"1.007947\"/>\n+ </AtomTypes>\n+</ForceField>\"\"\"\n+\n+ xml2 = \"\"\"\n+<ForceField>\n+ <AtomTypes>\n+ <Type name=\"test-name\" class=\"test\" mass=\"1.007947\"/>\n+ </AtomTypes>\n+</ForceField>\"\"\"\n+\n+ with self.assertRaises(ValueError):\n+ ff = ForceField(StringIO(xml1), StringIO(xml2))\n+\n+ def test_duplicateAtomTypeForbiddenMass(self):\n+ \"\"\"Test that multiple registrations of the same atom type with different masses are forbidden.\"\"\"\n+\n+ xml1 = \"\"\"\n+<ForceField>\n+ <AtomTypes>\n+ <Type name=\"test-name\" class=\"test\" element=\"H\" mass=\"1.007947\"/>\n+ </AtomTypes>\n+</ForceField>\"\"\"\n+\n+ xml2 = \"\"\"\n+<ForceField>\n+ <AtomTypes>\n+ <Type name=\"test-name\" class=\"test\" element=\"H\" mass=\"12.01078\"/>\n+ </AtomTypes>\n+</ForceField>\"\"\"\n+\n+ with self.assertRaises(ValueError):\n+ ff = ForceField(StringIO(xml1), StringIO(xml2))\n+\n def test_ResidueAttributes(self):\n \"\"\"Test a ForceField that gets per-particle parameters from residue attributes.\"\"\"\n \n", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}96{"question_id": "MSB_openmm_openmm_pr4830", "question_type": "multi_swe_bench", "description": "Check all wildcard combinations for dihedrals and impropers (openmm/openmm#4830)", "content": {"org": "openmm", "repo": "openmm", "pr_number": 4830, "issue_title": "Check all wildcard combinations for dihedrals and impropers", "issue_body": "Addresses #4828. Allows up to 3 wildcards in any positions for dihedrals and impropers. 4 out of 4 wildcards in a parameter file shouldn't happen so that isn't checked (it won't match and an error will be raised unless there were other matching entries). The maximum number of wildcards is just the `max_wc_count` argument to `_match_with_wildcards` though so it can be changed if we want.\r\n\r\nParmEd seems to go further in its handling of these wildcards for impropers and considers other permutations by sorting the atom types, but that doesn't seem consistent with what CHARMM actually does as far as I can tell.\r\n\r\nThe test generates some PSF files, and PRM files with wildcards, and makes sure that the dihedrals or impropers match (or don't).", "base_commit": "bda67c677a30e66f433ea48ae69bbc377c25fa2e", "resolved_issues": [{"number": null, "title": "Check all wildcard combinations for dihedrals and impropers", "body": "### Issue Description\n\n**Problem:** \nThe current implementation of dihedral and improper parameter matching does not fully support the use of wildcard atom types in all possible positions. This limitation can lead to cases where valid dihedral or improper parameters are not matched, resulting in errors when generating molecular systems. Additionally, the handling of wildcards for impropers is inconsistent with the expected behavior based on CHARMM conventions.\n\n**Expected Behavior:** \nThe parameter matching process should allow up to three wildcard atom types in any position for dihedrals and impropers. This ensures that valid parameters are matched correctly, reducing errors during system generation. For impropers, the handling of wildcards should align with CHARMM conventions, ensuring consistency in parameter matching.\n\n## IMPORTANT INSTRUCTIONS\n\n1. If you edit a python file, you MUST run 'make PythonInstall' inside the build directory\n2. If you edit a c++ file, you MUST run 'make -j4 && make install\" inside the build directory"}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/openmm_m_openmm:pr-4830", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/wrappers/python/openmm/app/charmmpsffile.py b/wrappers/python/openmm/app/charmmpsffile.py\nindex ab57331c97..46f9a176ac 100644\n--- a/wrappers/python/openmm/app/charmmpsffile.py\n+++ b/wrappers/python/openmm/app/charmmpsffile.py\n@@ -34,6 +34,7 @@\n from __future__ import division, absolute_import, print_function\n \n from functools import wraps\n+from itertools import combinations\n from math import pi, cos, sin, sqrt\n import os\n import re\n@@ -603,9 +604,9 @@ def loadParameters(self, parmset):\n - If any parameters that are necessary cannot be found, a\n MissingParameter exception is raised.\n - If any dihedral or improper parameters cannot be found, I will try\n- inserting wildcards (at either end for dihedrals and as the two\n- central atoms in impropers) and see if that matches. Wild-cards\n- will apply ONLY if specific parameters cannot be found.\n+ inserting wildcards (in up to three positions) and see if that\n+ matches. Wild-cards will apply ONLY if specific parameters cannot be\n+ found.\n - This method will expand the dihedral_parameter_list attribute by\n adding a separate Dihedral object for each term for types that\n have a multi-term expansion\n@@ -655,16 +656,11 @@ def loadParameters(self, parmset):\n for dih in self.dihedral_list:\n # Store the atoms\n a1, a2, a3, a4 = dih.atom1, dih.atom2, dih.atom3, dih.atom4\n- at1, at2, at3, at4 = a1.attype, a2.attype, a3.attype, a4.attype\n- # First see if the exact dihedral is specified\n- key = min((at1,at2,at3,at4), (at4,at3,at2,at1))\n- if not key in parmset.dihedral_types:\n- # Check for wild-cards\n- key = min(('X',at2,at3,'X'), ('X',at3,at2,'X'))\n- if not key in parmset.dihedral_types:\n- raise MissingParameter('No dihedral parameters found for '\n- '%r' % dih)\n- dtlist = parmset.dihedral_types[key]\n+ try:\n+ at_list = [a1.attype, a2.attype, a3.attype, a4.attype]\n+ dtlist = _match_with_wildcards(at_list, parmset.dihedral_types, 3)\n+ except KeyError:\n+ raise MissingParameter('No dihedral parameters found for %r' % dih)\n for i, dt in enumerate(dtlist):\n self.dihedral_parameter_list.append(Dihedral(a1,a2,a3,a4,dt))\n # See if we include the end-group interactions for this\n@@ -678,18 +674,11 @@ def loadParameters(self, parmset):\n for imp in self.improper_list:\n # Store the atoms\n a1, a2, a3, a4 = imp.atom1, imp.atom2, imp.atom3, imp.atom4\n- at1, at2, at3, at4 = a1.attype, a2.attype, a3.attype, a4.attype\n- key = min((at1,at2,at3,at4), (at4,at3,at2,at1))\n- if not key in parmset.improper_types:\n- key = min((at1,'X', 'X',at4),(at4,'X','X',at1))\n- if not key in parmset.improper_types:\n- raise MissingParameter('No improper dihedral parameters found for '\n- '%r' % imp)\n try:\n- imp.improper_type = parmset.improper_types[key]\n+ at_list = [a1.attype, a2.attype, a3.attype, a4.attype]\n+ imp.improper_type = _match_with_wildcards(at_list, parmset.improper_types, 3)\n except KeyError:\n- raise MissingParameter('No improper parameters found for %r' %\n- imp)\n+ raise MissingParameter('No improper parameters found for %r' % imp)\n # Now do the cmaps. These will not have wild-cards\n for cmap in self.cmap_list:\n # Store the atoms for easy reference\n@@ -1854,6 +1843,26 @@ def _mbondi3_radii(atom_list):\n \n # ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n \n+def _match_with_wildcards(at_list, type_dict, max_wc_count):\n+ \"\"\"\n+ Tries to find a match for at_list in type_dict. If one can't be found,\n+ tries to insert up to max_wc_count wildcards in different combinations.\n+ Assumes that for a given key, min(key, key[::-1]) is the one in type_dict.\n+ \"\"\"\n+\n+ for wc_count in range(max_wc_count + 1):\n+ for wc_indices in combinations(range(len(at_list)), wc_count):\n+ key = list(at_list)\n+ for wc_index in wc_indices:\n+ key[wc_index] = 'X'\n+ key = tuple(key)\n+ key = min(key, key[::-1])\n+ if key in type_dict:\n+ return type_dict[key]\n+ raise KeyError(key)\n+\n+# ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n+\n if __name__ == '__main__':\n import doctest\n doctest.testmod()\n"}, "test": {"test_patch": "diff --git a/wrappers/python/tests/TestCharmmFiles.py b/wrappers/python/tests/TestCharmmFiles.py\nindex ebf24874d9..7ac43e13a4 100644\n--- a/wrappers/python/tests/TestCharmmFiles.py\n+++ b/wrappers/python/tests/TestCharmmFiles.py\n@@ -4,6 +4,7 @@\n from openmm import *\n from openmm.unit import *\n import openmm.app.element as elem\n+import itertools\n import math\n import os\n import tempfile\n@@ -382,6 +383,122 @@ def test_Impropers(self):\n dtheta = math.pi-angle\n self.assertAlmostEqual(energy, dtheta**2, delta=1e-5)\n \n+ def test_TorsionWildcards(self):\n+ \"\"\"Test matching of dihedrals and impropers with wildcards.\"\"\"\n+ for test_improper, wild_1, wild_2, wild_3, wild_4, reverse, want_mismatch in itertools.product((False, True), repeat=7):\n+ # Test with up to 3 wildcards.\n+ if wild_1 and wild_2 and wild_3 and wild_4:\n+ continue\n+\n+ # Test both dihedrals and impropers. If want_mismatch is set, make\n+ # sure that the non-wildcard atoms ensure no match to the torsion.\n+ prm_header = 'IMPH' if test_improper else 'DIHE'\n+ type_1 = 'X' if wild_1 else ('C2' if want_mismatch else 'C1')\n+ type_2 = 'X' if wild_2 else ('C1' if want_mismatch else 'C2')\n+ type_3 = 'X' if wild_3 else ('C4' if want_mismatch else 'C3')\n+ type_4 = 'X' if wild_4 else ('C3' if want_mismatch else 'C4')\n+\n+ if reverse:\n+ type_1, type_2, type_3, type_4 = type_4, type_3, type_2, type_1\n+\n+ psf_dihedral = '' if test_improper else f'{1:10}{2:10}{3:10}{4:10}'\n+ psf_improper = f'{1:10}{2:10}{3:10}{4:10}' if test_improper else ''\n+\n+ with tempfile.TemporaryDirectory() as temp_path:\n+ prm_path = os.path.join(temp_path, 'test.prm')\n+ psf_path = os.path.join(temp_path, 'test.psf')\n+\n+ # Write a sample PRM file.\n+ with open(prm_path, 'w') as prm_file:\n+ print(f\"\"\"*TEST\n+*\n+\n+ATOMS\n+MASS -1 C1 12.0110\n+MASS -1 C2 12.0110\n+MASS -1 C3 12.0110\n+MASS -1 C4 12.0110\n+\n+BOND\n+C1 C2 1 1\n+C{1 if test_improper else 2} C3 1 1\n+C{1 if test_improper else 3} C4 1 1\n+\n+{prm_header}\n+{type_1} {type_2} {type_3} {type_4} 1 1 0\n+\n+NBON\n+C1 0 0 1\n+C2 0 0 1\n+C3 0 0 1\n+C4 0 0 1\n+\n+END\"\"\", file=prm_file)\n+\n+ # Write a sample PSF file.\n+ with open(psf_path, 'w') as psf_file:\n+ print(f\"\"\"PSF EXT CMAP CHEQ XPLOR\n+\n+ 1 !NTITLE\n+* TEST\n+\n+ 4 !NATOM\n+ 1 TEST 1 TEST1 C1 C1 0.000000 12.0110 0\n+ 2 TEST 1 TEST1 C2 C2 0.000000 12.0110 0\n+ 3 TEST 1 TEST1 C3 C3 0.000000 12.0110 0\n+ 4 TEST 1 TEST1 C4 C4 0.000000 12.0110 0\n+\n+ 3 !NBOND: bonds\n+{1:10}{2:10}{1 if test_improper else 2:10}{3:10}{1 if test_improper else 3:10}{4:10}\n+\n+ 0 !NTHETA: angles\n+\n+\n+{0 if test_improper else 1:10} !NPHI: dihedrals\n+{psf_dihedral}\n+\n+{1 if test_improper else 0:10} !NIMPHI: impropers\n+{psf_improper}\n+\n+ 0 !NDON: donors\n+\n+\n+ 0 !NACC: acceptors\n+\n+\n+ 0 !NNB\n+\n+ 0 0 0 0\n+\n+ 1 0 !NGRP NST2\n+ 0 0 0\n+\n+ 1 !MOLNT\n+ 1 1 1 1\n+\n+ 0 0 !NUMLP NUMLPH\n+\n+ 0 !NCRTERM\n+\n+\n+\"\"\", file=psf_file)\n+\n+ prm = CharmmParameterSet(prm_path)\n+ psf = CharmmPsfFile(psf_path)\n+\n+ if want_mismatch:\n+ # Make sure that the system doesn't get parameterized.\n+ with self.assertRaises(internal.charmm.exceptions.MissingParameter):\n+ system = psf.createSystem(prm)\n+\n+ else:\n+ # Make sure that one dihedral or improper gets added.\n+ system = psf.createSystem(prm)\n+ force_type = CustomTorsionForce if test_improper else PeriodicTorsionForce\n+ force, = (force for force in system.getForces() if isinstance(force, force_type))\n+ self.assertEqual(force.getNumTorsions(), 1)\n+ self.assertEqual(force.getTorsionParameters(0)[:4], [0, 1, 2, 3])\n+\n def test_Residues(self):\n \"\"\"Test that residues are read correctly, even if they have the same RESID while being in separate segments.\"\"\"\n m14 = ([\"C{}\".format(i) for i in range(1,14)]\n", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}97{"question_id": "MSB_openmm_openmm_pr4832", "question_type": "multi_swe_bench", "description": "flexibleConstraints option for AmberPrmtopFile (openmm/openmm#4832)", "content": {"org": "openmm", "repo": "openmm", "pr_number": 4832, "issue_title": "flexibleConstraints option for AmberPrmtopFile", "issue_body": "Fixes #4827.", "base_commit": "91966dc8eb976fadc206e8a345470a737c09fd8b", "resolved_issues": [{"number": 4827, "title": "Why no flexibleConstraints option in Amber createSystem?", "body": "Not necessarily a bug report but I was wondering why there is no `flexibleConstraints` option in the `createSystem` method of the `AmberPrmtopFile` class https://github.com/openmm/openmm/blob/master/wrappers/python/openmm/app/amberprmtopfile.py#L179\n\nIt's explicitly set to False here: https://github.com/openmm/openmm/blob/master/wrappers/python/openmm/app/amberprmtopfile.py#L297\n\nThe option exists though in the `CharmmPsfFile` class https://github.com/openmm/openmm/blob/master/wrappers/python/openmm/app/charmmpsffile.py#L795 Also by default it's on in CHARMM and off in AMBER which is a bit weird.\n\nI need flexibleConstraints for my minimizer to work since I don't go through the same process of adding back in harmonic forces just for the minimization https://github.com/openmm/openmm/blob/master/openmmapi/src/LocalEnergyMinimizer.cpp#L127\nI practically just remove the bonded terms of the constrained atoms after the minimization.\n\n## IMPORTANT INSTRUCTIONS\n\n1. If you edit a python file, you MUST run 'make PythonInstall' inside the build directory\n2. If you edit a c++ file, you MUST run 'make -j4 && make install\" inside the build directory"}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/openmm_m_openmm:pr-4832", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/wrappers/python/openmm/app/amberprmtopfile.py b/wrappers/python/openmm/app/amberprmtopfile.py\nindex 84dac43b55..5512a19918 100644\n--- a/wrappers/python/openmm/app/amberprmtopfile.py\n+++ b/wrappers/python/openmm/app/amberprmtopfile.py\n@@ -6,7 +6,7 @@\n Biological Structures at Stanford, funded under the NIH Roadmap for\n Medical Research, grant U54 GM072970. See https://simtk.org.\n \n-Portions copyright (c) 2012-2022 Stanford University and the Authors.\n+Portions copyright (c) 2012-2025 Stanford University and the Authors.\n Authors: Peter Eastman\n Contributors:\n \n@@ -182,7 +182,7 @@ def createSystem(self, nonbondedMethod=ff.NoCutoff, nonbondedCutoff=1.0*u.nanome\n implicitSolventKappa=None, temperature=298.15*u.kelvin,\n soluteDielectric=1.0, solventDielectric=78.5,\n removeCMMotion=True, hydrogenMass=None, ewaldErrorTolerance=0.0005,\n- switchDistance=0.0*u.nanometer, gbsaModel='ACE'):\n+ switchDistance=0.0*u.nanometer, flexibleConstraints=False, gbsaModel='ACE'):\n \"\"\"Construct an OpenMM System representing the topology described by this\n prmtop file.\n \n@@ -230,6 +230,8 @@ def createSystem(self, nonbondedMethod=ff.NoCutoff, nonbondedCutoff=1.0*u.nanome\n turned on for Lennard-Jones interactions. If the switchDistance is 0\n or evaluates to boolean False, no switching function will be used.\n Values greater than nonbondedCutoff or less than 0 raise ValueError\n+ flexibleConstraints : boolean=False\n+ If True, parameters for constrained degrees of freedom will be added to the System\n gbsaModel : str='ACE'\n The SA model used to model the nonpolar solvation component of GB\n implicit solvent models. If GB is active, this must be 'ACE' or None\n@@ -294,7 +296,7 @@ def createSystem(self, nonbondedMethod=ff.NoCutoff, nonbondedCutoff=1.0*u.nanome\n \n sys = amber_file_parser.readAmberSystem(self.topology, prmtop_loader=self._prmtop, shake=constraintString,\n nonbondedCutoff=nonbondedCutoff, nonbondedMethod=methodMap[nonbondedMethod],\n- flexibleConstraints=False, gbmodel=implicitString, soluteDielectric=soluteDielectric,\n+ flexibleConstraints=flexibleConstraints, gbmodel=implicitString, soluteDielectric=soluteDielectric,\n solventDielectric=solventDielectric, implicitSolventKappa=implicitSolventKappa,\n rigidWater=rigidWater, elements=self.elements, gbsaModel=gbsaModel)\n \n"}, "test": {"test_patch": "diff --git a/wrappers/python/tests/TestAmberPrmtopFile.py b/wrappers/python/tests/TestAmberPrmtopFile.py\nindex 0e7d7da3bf..5f8678542d 100644\n--- a/wrappers/python/tests/TestAmberPrmtopFile.py\n+++ b/wrappers/python/tests/TestAmberPrmtopFile.py\n@@ -7,6 +7,7 @@\n from openmm.unit import *\n import openmm.app.element as elem\n \n+inpcrd1 = AmberInpcrdFile('systems/alanine-dipeptide-explicit.inpcrd')\n inpcrd3 = AmberInpcrdFile('systems/ff14ipq.rst7')\n inpcrd4 = AmberInpcrdFile('systems/Mg_water.inpcrd')\n inpcrd7 = AmberInpcrdFile('systems/18protein.rst7')\n@@ -473,5 +474,27 @@ def testWaterBonds(self):\n self.assertTrue(a1.element == elem.oxygen or a2.element == elem.oxygen)\n self.assertTrue(a1.element == elem.hydrogen or a2.element == elem.hydrogen)\n \n+ def testFlexibleConstraints(self):\n+ \"\"\"Test the flexibleConstraints option\"\"\"\n+ energies = {}\n+ forces = {}\n+ for flexibleConstraints in [False, True]:\n+ system = prmtop1.createSystem(nonbondedMethod=PME, constraints=HAngles, flexibleConstraints=flexibleConstraints)\n+ for i, f in enumerate(system.getForces()):\n+ f.setForceGroup(i)\n+ integrator = VerletIntegrator(1.0*femtoseconds)\n+ sim = Simulation(prmtop1.topology, system, integrator, Platform.getPlatform('Reference'))\n+ sim.context.setPositions(inpcrd1.positions)\n+ energies[flexibleConstraints] = {}\n+ for i, f in enumerate(system.getForces()):\n+ forces[i] = f\n+ energies[flexibleConstraints][i] = sim.context.getState(getEnergy=True, groups={i}).getPotentialEnergy().value_in_unit(kilojoules_per_mole)\n+ for i, f in forces.items():\n+ delta = 1e-5*abs(energies[True][i])\n+ if isinstance(f, HarmonicBondForce) or isinstance(f, HarmonicAngleForce):\n+ self.assertNotAlmostEqual(energies[True][i], energies[False][i], delta=delta)\n+ else:\n+ self.assertAlmostEqual(energies[True][i], energies[False][i], delta=delta)\n+\n if __name__ == '__main__':\n unittest.main()\n", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}98{"question_id": "MSB_openmm_openmm_pr4852", "question_type": "multi_swe_bench", "description": "Correctly assign CMAPs to torsions across multiple CMAPTorsionForce sections (openmm/openmm#4852)", "content": {"org": "openmm", "repo": "openmm", "pr_number": 4852, "issue_title": "Correctly assign CMAPs to torsions across multiple CMAPTorsionForce sections", "issue_body": "Should fix #4850. Adds a test that would have caught the issue.", "base_commit": "dde4228b337b7494e23ec913f4dc65f16fee6d08", "resolved_issues": [{"number": 4850, "title": "Multiple CMAPTorsionForce sections result in incorrect map assignment", "body": "Currently, if two separate `<CMAPTorsionForce>` sections are present in a force field, as can happen if two force field files with CMAPs are being combined, OpenMM will create a single `CMAPTorsionForce` in resulting systems. However, the indices of `map` attributes of any `<Torsion>` tags in `<CMAPTorsionForce>` sections other than the first will point to `<Map>` entries starting from the first section instead of the section that they are a part of. For example, if\n```\n<CMAPTorsionForce>\n <Map>1 2 3 4</Map>\n <Torsion map=\"0\" class1=\"A\" class2=\"A\" class3=\"A\" class4=\"A\" class5=\"B\" />\n</CMAPTorsionForce>\n```\nis followed by\n```\n<CMAPTorsionForce>\n <Map>5 6 7 8</Map>\n <Torsion map=\"0\" class1=\"A\" class2=\"A\" class3=\"A\" class4=\"B\" class5=\"B\" />\n</CMAPTorsionForce>\n```\nthen the `<Torsion>` in the second section points to the `<Map>` in the first section. I would expect this `<Torsion>` to refer to the `<Map>` in *its own* section. If that is the desired behavior, I will submit a PR with a fix (just an offset of the map index to point to the start of a section's own maps) and a new test case. I wanted to check because CMAPs work differently from other bonded forces in that the parameters are defined \"out-of-band\" rather than with each entry, and I don't know if we want to provide any facility for a `<Torsion>` to refer to a `<Map>` in another section.\n\n## IMPORTANT INSTRUCTIONS\n\n1. If you edit a python file, you MUST run 'make PythonInstall' inside the build directory\n2. If you edit a c++ file, you MUST run 'make -j4 && make install\" inside the build directory"}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/openmm_m_openmm:pr-4852", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/wrappers/python/openmm/app/forcefield.py b/wrappers/python/openmm/app/forcefield.py\nindex a222355f85..79f21f22ab 100644\n--- a/wrappers/python/openmm/app/forcefield.py\n+++ b/wrappers/python/openmm/app/forcefield.py\n@@ -2392,6 +2392,7 @@ def parseElement(element, ff):\n ff.registerGenerator(generator)\n else:\n generator = existing[0]\n+ mapOffset = len(generator.maps)\n for map in element.findall('Map'):\n values = [float(x) for x in map.text.split()]\n size = sqrt(len(values))\n@@ -2401,7 +2402,7 @@ def parseElement(element, ff):\n for torsion in element.findall('Torsion'):\n types = ff._findAtomTypes(torsion.attrib, 5)\n if None not in types:\n- generator.torsions.append(CMAPTorsion(types, int(torsion.attrib['map'])))\n+ generator.torsions.append(CMAPTorsion(types, int(torsion.attrib['map']) + mapOffset))\n \n def createForce(self, sys, data, nonbondedMethod, nonbondedCutoff, args):\n existing = [f for f in sys.getForces() if type(f) == mm.CMAPTorsionForce]\n"}, "test": {"test_patch": "diff --git a/wrappers/python/tests/TestForceField.py b/wrappers/python/tests/TestForceField.py\nindex e37ac7df08..3b0376bf95 100644\n--- a/wrappers/python/tests/TestForceField.py\n+++ b/wrappers/python/tests/TestForceField.py\n@@ -1006,6 +1006,100 @@ def test_ResidueOverriding(self):\n self.assertEqual(ff._templates['FE2'].atoms[0].type, 'Fe2+_tip3p_standard')\n ff.createSystem(pdb.topology)\n \n+ def test_CMAPTorsionGeneratorMapAssignment(self):\n+ \"\"\"Tests assignment of the correct maps when multiple CMAPTorsionGenerators are present\"\"\"\n+\n+ ffxml_1 = \"\"\"\n+<ForceField>\n+ <AtomTypes>\n+ <Type name=\"A\" class=\"A\" element=\"C\" mass=\"12\" />\n+ <Type name=\"B\" class=\"B\" element=\"N\" mass=\"14\" />\n+ </AtomTypes>\n+ <Residues>\n+ <Residue name=\"X\">\n+ <Atom name=\"X1\" type=\"A\" />\n+ <Atom name=\"X2\" type=\"A\" />\n+ <Atom name=\"X3\" type=\"A\" />\n+ <Atom name=\"X4\" type=\"A\" />\n+ <Atom name=\"X5\" type=\"B\" />\n+ <Bond atomName1=\"X1\" atomName2=\"X2\" />\n+ <Bond atomName1=\"X2\" atomName2=\"X3\" />\n+ <Bond atomName1=\"X3\" atomName2=\"X4\" />\n+ <Bond atomName1=\"X4\" atomName2=\"X5\" />\n+ </Residue>\n+ <Residue name=\"Y\">\n+ <Atom name=\"Y1\" type=\"A\" />\n+ <Atom name=\"Y2\" type=\"A\" />\n+ <Atom name=\"Y3\" type=\"A\" />\n+ <Atom name=\"Y4\" type=\"B\" />\n+ <Atom name=\"Y5\" type=\"B\" />\n+ <Bond atomName1=\"Y1\" atomName2=\"Y2\" />\n+ <Bond atomName1=\"Y2\" atomName2=\"Y3\" />\n+ <Bond atomName1=\"Y3\" atomName2=\"Y4\" />\n+ <Bond atomName1=\"Y4\" atomName2=\"Y5\" />\n+ </Residue>\n+ </Residues>\n+ <CMAPTorsionForce>\n+ <Map>10 11 12 13</Map>\n+ <Torsion map=\"0\" class1=\"A\" class2=\"A\" class3=\"A\" class4=\"A\" class5=\"B\" />\n+ </CMAPTorsionForce>\n+</ForceField>\n+\"\"\"\n+\n+ ffxml_2 = \"\"\"\n+<ForceField>\n+ <CMAPTorsionForce>\n+ <Map>14 15 16 17</Map>\n+ <Torsion map=\"0\" class1=\"A\" class2=\"A\" class3=\"A\" class4=\"B\" class5=\"B\" />\n+ </CMAPTorsionForce>\n+</ForceField>\n+\"\"\"\n+\n+ ff = ForceField(StringIO(ffxml_1), StringIO(ffxml_2))\n+\n+ topology = Topology()\n+\n+ x = topology.addResidue(\"X\", topology.addChain())\n+ x1 = topology.addAtom(\"X1\", elem.carbon, x)\n+ x2 = topology.addAtom(\"X2\", elem.carbon, x)\n+ x3 = topology.addAtom(\"X3\", elem.carbon, x)\n+ x4 = topology.addAtom(\"X4\", elem.carbon, x)\n+ x5 = topology.addAtom(\"X5\", elem.nitrogen, x)\n+ topology.addBond(x1, x2)\n+ topology.addBond(x2, x3)\n+ topology.addBond(x3, x4)\n+ topology.addBond(x4, x5)\n+\n+ y = topology.addResidue(\"Y\", topology.addChain())\n+ y1 = topology.addAtom(\"Y1\", elem.carbon, y)\n+ y2 = topology.addAtom(\"Y2\", elem.carbon, y)\n+ y3 = topology.addAtom(\"Y3\", elem.carbon, y)\n+ y4 = topology.addAtom(\"Y4\", elem.nitrogen, y)\n+ y5 = topology.addAtom(\"Y5\", elem.nitrogen, y)\n+ topology.addBond(y1, y2)\n+ topology.addBond(y2, y3)\n+ topology.addBond(y3, y4)\n+ topology.addBond(y4, y5)\n+\n+ system = ff.createSystem(topology)\n+ cmap, = (force for force in system.getForces() if isinstance(force, openmm.CMAPTorsionForce))\n+\n+ torsionCount = cmap.getNumTorsions()\n+ assert torsionCount == 2\n+\n+ for torsionIndex in range(torsionCount):\n+ mapIndex, *atomIndices = cmap.getTorsionParameters(torsionIndex)\n+ mapSize, energy = cmap.getMapParameters(mapIndex)\n+\n+ if atomIndices == [0, 1, 2, 3, 1, 2, 3, 4]:\n+ expectedEnergy = (10.0, 11.0, 12.0, 13.0) * kilojoule_per_mole\n+ elif atomIndices == [5, 6, 7, 8, 6, 7, 8, 9]:\n+ expectedEnergy = (14.0, 15.0, 16.0, 17.0) * kilojoule_per_mole\n+ else:\n+ raise ValueError(\"unexpected torsion\")\n+\n+ assert energy == expectedEnergy\n+\n def test_LennardJonesGenerator(self):\n \"\"\" Test the LennardJones generator\"\"\"\n warnings.filterwarnings('ignore', category=CharmmPSFWarning)\n", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}99{"question_id": "MSB_openmm_openmm_pr4875", "question_type": "multi_swe_bench", "description": "Attempting to fix XTC/DCD restarting (openmm/openmm#4875)", "content": {"org": "openmm", "repo": "openmm", "pr_number": 4875, "issue_title": "Attempting to fix XTC/DCD restarting", "issue_body": "Fixes #4873 by writing directly the simulation.currentStep into the XTC and DCD files.\r\n\r\nI'm making here some assumptions that the first step written in a file will be at `step=interval` but I think this is a valid assumption?\r\n\r\nAlso assuming that you would only append to an XTC/DCD file if you were resuming a previous simulation (i.e. via a checkpoint) and not creating a new Simulation from scratch which would set the currentStep to 0", "base_commit": "adf1843f8d2bdcc8bcb32ebefa337d03d471a0ac", "resolved_issues": [{"number": 4873, "title": "Wrong step in DCD/XTCreporter when restarting simulations", "body": "Hi, I just noticed what I assume is a bug in the XTCreporter and DCDreporter class\n\nhttps://github.com/openmm/openmm/blob/master/wrappers/python/openmm/app/xtcfile.py#L146\n\nIf you look at how the step is calculated\n\n```py\nstep = (self._modelCount - 1) * self._interval + self._firstStep\n```\n\nWhen appending, the `_modelCount` variable is overwritten here: https://github.com/openmm/openmm/blob/master/wrappers/python/openmm/app/xtcfile.py#L57\n\nAnd the `_firstStep` value is passed here: https://github.com/openmm/openmm/blob/master/wrappers/python/openmm/app/xtcreporter.py#L110 directly from the `simulation.currentStep`\n\nThis leads to the following behaviour if I add a `print(\"STEP\", step, \"TIME\", time, self._modelCount, self._interval, self._firstStep, self._dt)` right before writing the XTC frame\n```\nSTEP 50 TIME 0.2 1 50 50 0.004\nSTEP 100 TIME 0.4 2 50 50 0.004\nSTEP 150 TIME 0.6 3 50 50 0.004\nSTEP 200 TIME 0.8 4 50 50 0.004\nSTEP 250 TIME 1.0 5 50 50 0.004\nRESTART\nSTEP 550 TIME 2.2 6 50 300 0.004\nSTEP 600 TIME 2.4 7 50 300 0.004\nSTEP 650 TIME 2.6 8 50 300 0.004\nSTEP 700 TIME 2.8 9 50 300 0.004\nSTEP 750 TIME 3.0 10 50 300 0.004\n```\nAs you can see, after the restart, the `_firstStep` is 300 since that indeed is the currentStep of the simulation, but also the `_modelCount` is 6. This means that it calculates wrongly the step as 550 instead of 300 which it should.\n\nI took a look at the DCDreporter and it does nearly the same, but with an offset of +50 compared to XTCreporter, so after the restart it calculates the step as 600 instead of 300.\n\n## IMPORTANT INSTRUCTIONS\n\n1. If you edit a python file, you MUST run 'make PythonInstall' inside the build directory\n2. If you edit a c++ file, you MUST run 'make -j4 && make install\" inside the build directory"}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/openmm_m_openmm:pr-4875", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/wrappers/python/openmm/app/dcdfile.py b/wrappers/python/openmm/app/dcdfile.py\nindex 335cdc0b79..c886527da9 100644\n--- a/wrappers/python/openmm/app/dcdfile.py\n+++ b/wrappers/python/openmm/app/dcdfile.py\n@@ -75,7 +75,6 @@ def __init__(self, file, topology, dt, firstStep=0, interval=1, append=False):\n self._topology = topology\n self._firstStep = firstStep\n self._interval = interval\n- self._modelCount = 0\n if is_quantity(dt):\n dt = dt.value_in_unit(picoseconds)\n dt /= 0.04888821\n@@ -84,8 +83,6 @@ def __init__(self, file, topology, dt, firstStep=0, interval=1, append=False):\n if topology.getUnitCellDimensions() is not None:\n boxFlag = 1\n if append:\n- file.seek(8, os.SEEK_SET)\n- self._modelCount = struct.unpack('<i', file.read(4))[0]\n file.seek(268, os.SEEK_SET)\n numAtoms = struct.unpack('<i', file.read(4))[0]\n if numAtoms != topology.getNumAtoms():\n@@ -98,7 +95,7 @@ def __init__(self, file, topology, dt, firstStep=0, interval=1, append=False):\n header += struct.pack('<4i', 164, 4, topology.getNumAtoms(), 4)\n file.write(header)\n \n- def writeModel(self, positions, unitCellDimensions=None, periodicBoxVectors=None):\n+ def writeModel(self, positions, unitCellDimensions=None, periodicBoxVectors=None, currentStep=0):\n \"\"\"Write out a model to the DCD file.\n \n The periodic box can be specified either by the unit cell dimensions\n@@ -116,6 +113,8 @@ def writeModel(self, positions, unitCellDimensions=None, periodicBoxVectors=None\n The dimensions of the crystallographic unit cell.\n periodicBoxVectors : tuple of Vec3=None\n The vectors defining the periodic box.\n+ currentStep : int=0\n+ The current step of the simulation.\n \"\"\"\n if self._topology.getNumAtoms() != len(positions):\n raise ValueError('The number of positions must match the number of atoms')\n@@ -129,23 +128,21 @@ def writeModel(self, positions, unitCellDimensions=None, periodicBoxVectors=None\n raise ValueError('Particle position is infinite. For more information, see https://github.com/openmm/openmm/wiki/Frequently-Asked-Questions#nan')\n file = self._file\n \n- self._modelCount += 1\n- if self._interval > 1 and self._firstStep+self._modelCount*self._interval > 1<<31:\n+ if self._interval > 1 and currentStep + self._interval > 1<<31:\n # This will exceed the range of a 32 bit integer. To avoid crashing or producing a corrupt file,\n # update the header to say the trajectory consisted of a smaller number of larger steps (so the\n # total trajectory length remains correct).\n- self._firstStep //= self._interval\n self._dt *= self._interval\n self._interval = 1\n file.seek(0, os.SEEK_SET)\n- file.write(struct.pack('<i4c9if', 84, b'C', b'O', b'R', b'D', 0, self._firstStep, self._interval, 0, 0, 0, 0, 0, 0, self._dt))\n+ file.write(struct.pack('<i4c9if', 84, b'C', b'O', b'R', b'D', 0, 1, self._interval, 0, 0, 0, 0, 0, 0, self._dt))\n \n # Update the header.\n \n file.seek(8, os.SEEK_SET)\n- file.write(struct.pack('<i', self._modelCount))\n+ file.write(struct.pack('<i', currentStep // self._interval))\n file.seek(20, os.SEEK_SET)\n- file.write(struct.pack('<i', self._firstStep+self._modelCount*self._interval))\n+ file.write(struct.pack('<i', currentStep))\n \n # Write the data.\n \ndiff --git a/wrappers/python/openmm/app/dcdreporter.py b/wrappers/python/openmm/app/dcdreporter.py\nindex d09d5c149c..4626e1f225 100644\n--- a/wrappers/python/openmm/app/dcdreporter.py\n+++ b/wrappers/python/openmm/app/dcdreporter.py\n@@ -115,7 +115,7 @@ def report(self, simulation, state):\n positions = state.getPositions(asNumpy=True)\n if self._atomSubset is not None:\n positions = [positions[i] for i in self._atomSubset]\n- self._dcd.writeModel(positions, periodicBoxVectors=state.getPeriodicBoxVectors())\n+ self._dcd.writeModel(positions, periodicBoxVectors=state.getPeriodicBoxVectors(), currentStep=simulation.currentStep)\n \n def __del__(self):\n self._out.close()\ndiff --git a/wrappers/python/openmm/app/xtcfile.py b/wrappers/python/openmm/app/xtcfile.py\nindex 3fb821eb5f..1852c72265 100644\n--- a/wrappers/python/openmm/app/xtcfile.py\n+++ b/wrappers/python/openmm/app/xtcfile.py\n@@ -22,7 +22,7 @@ class XTCFile(object):\n To use this class, create a XTCFile object, then call writeModel() once for each model in the file.\n \"\"\"\n \n- def __init__(self, fileName, topology, dt, firstStep=0, interval=1, append=False):\n+ def __init__(self, fileName, topology, dt, interval=1, append=False):\n \"\"\"Create a XTC file, or open an existing file to append.\n \n Parameters\n@@ -33,8 +33,6 @@ def __init__(self, fileName, topology, dt, firstStep=0, interval=1, append=False\n The Topology defining the molecular system being written\n dt : time\n The time step used in the trajectory\n- firstStep : int=0\n- The index of the first step in the trajectory\n interval : int=1\n The frequency (measured in time steps) at which states are written\n to the trajectory\n@@ -45,16 +43,13 @@ def __init__(self, fileName, topology, dt, firstStep=0, interval=1, append=False\n raise TypeError(\"fileName must be a string\")\n self._filename = fileName\n self._topology = topology\n- self._firstStep = firstStep\n self._interval = interval\n- self._modelCount = 0\n if is_quantity(dt):\n dt = dt.value_in_unit(picoseconds)\n self._dt = dt\n if append:\n if not os.path.isfile(self._filename):\n raise FileNotFoundError(f\"The file '{self._filename}' does not exist.\")\n- self._modelCount = get_xtc_nframes(self._filename.encode(\"utf-8\"))\n natoms = get_xtc_natoms(self._filename.encode(\"utf-8\"))\n if natoms != topology.getNumAtoms():\n raise ValueError(\n@@ -67,7 +62,7 @@ def __init__(self, fileName, topology, dt, firstStep=0, interval=1, append=False\n def _getNumFrames(self):\n return get_xtc_nframes(self._filename.encode(\"utf-8\"))\n \n- def writeModel(self, positions, unitCellDimensions=None, periodicBoxVectors=None):\n+ def writeModel(self, positions, unitCellDimensions=None, periodicBoxVectors=None, currentStep=0):\n \"\"\"Write out a model to the XTC file.\n \n The periodic box can be specified either by the unit cell dimensions\n@@ -85,6 +80,8 @@ def writeModel(self, positions, unitCellDimensions=None, periodicBoxVectors=None\n The dimensions of the crystallographic unit cell.\n periodicBoxVectors : tuple of Vec3=None\n The vectors defining the periodic box.\n+ currentStep : int=0\n+ The current step in the trajectory\n \"\"\"\n if self._topology.getNumAtoms() != len(positions):\n raise ValueError(\"The number of positions must match the number of atoms\")\n@@ -103,15 +100,14 @@ def writeModel(self, positions, unitCellDimensions=None, periodicBoxVectors=None\n if (np.abs(positions * 1000) > (2 ** 31 - 1)).any():\n raise ValueError(\"Particle position is too large for XTC format\")\n \n- self._modelCount += 1\n if (\n self._interval > 1\n- and self._firstStep + self._modelCount * self._interval > 1 << 31\n+ and currentStep + self._interval > 1 << 31\n ):\n # This will exceed the range of a 32 bit integer. To avoid crashing or producing a corrupt file,\n # update the file to say the trajectory consisted of a smaller number of larger steps (so the\n # total trajectory length remains correct).\n- self._firstStep //= self._interval\n+ currentStep //= self._interval\n self._dt *= self._interval\n self._interval = 1\n with tempfile.TemporaryDirectory() as temp:\n@@ -119,7 +115,7 @@ def writeModel(self, positions, unitCellDimensions=None, periodicBoxVectors=None\n xtc_rewrite_with_new_timestep(\n self._filename.encode(\"utf-8\"),\n fname.encode(\"utf-8\"),\n- self._firstStep,\n+ 1,\n self._interval,\n self._dt,\n )\n@@ -143,12 +139,12 @@ def writeModel(self, positions, unitCellDimensions=None, periodicBoxVectors=None\n )\n else:\n boxVectors = np.zeros((3, 3)).astype(np.float32)\n- step = (self._modelCount - 1) * self._interval + self._firstStep\n- time = step * self._dt\n+\n+ time = currentStep * self._dt\n xtc_write_frame(\n self._filename.encode(\"utf-8\"),\n np.array(positions, dtype=np.float32),\n boxVectors,\n np.float32(time),\n- np.int32(step),\n+ np.int32(currentStep),\n )\ndiff --git a/wrappers/python/openmm/app/xtcreporter.py b/wrappers/python/openmm/app/xtcreporter.py\nindex 0a05e59ad6..9642e54666 100644\n--- a/wrappers/python/openmm/app/xtcreporter.py\n+++ b/wrappers/python/openmm/app/xtcreporter.py\n@@ -107,11 +107,10 @@ def report(self, simulation, state):\n self._fileName,\n topology,\n simulation.integrator.getStepSize(),\n- simulation.currentStep,\n self._reportInterval,\n self._append,\n )\n positions = state.getPositions(asNumpy=True)\n if self._atomSubset is not None:\n positions = [positions[i] for i in self._atomSubset]\n- self._xtc.writeModel(positions, periodicBoxVectors=state.getPeriodicBoxVectors())\n+ self._xtc.writeModel(positions, periodicBoxVectors=state.getPeriodicBoxVectors(), currentStep=simulation.currentStep)\n"}, "test": {"test_patch": "diff --git a/wrappers/python/tests/TestDcdFile.py b/wrappers/python/tests/TestDcdFile.py\nindex 1ce1cbdeaf..a2bd280bce 100644\n--- a/wrappers/python/tests/TestDcdFile.py\n+++ b/wrappers/python/tests/TestDcdFile.py\n@@ -6,6 +6,13 @@\n from random import random\n import os\n \n+def _readModelCount(file):\n+ import struct\n+\n+ with open(file, \"r+b\") as f:\n+ f.seek(8, os.SEEK_SET)\n+ return struct.unpack('<i', f.read(4))[0]\n+\n class TestDCDFile(unittest.TestCase):\n def test_dcd(self):\n \"\"\" Test the DCD file \"\"\"\n@@ -15,7 +22,7 @@ def test_dcd(self):\n with open(fname, 'wb') as f:\n dcd = app.DCDFile(f, pdbfile.topology, 0.001)\n for i in range(5):\n- dcd.writeModel([mm.Vec3(random(), random(), random()) for j in range(natom)]*unit.angstroms)\n+ dcd.writeModel([mm.Vec3(random(), random(), random()) for j in range(natom)]*unit.angstroms, currentStep=i)\n os.remove(fname)\n \n def testLongTrajectory(self):\n@@ -26,7 +33,7 @@ def testLongTrajectory(self):\n with open(fname, 'wb') as f:\n dcd = app.DCDFile(f, pdbfile.topology, 0.001, interval=1000000000)\n for i in range(5):\n- dcd.writeModel([mm.Vec3(random(), random(), random()) for j in range(natom)]*unit.angstroms)\n+ dcd.writeModel([mm.Vec3(random(), random(), random()) for j in range(natom)]*unit.angstroms, currentStep=i)\n os.remove(fname)\n \n def testAppend(self):\n@@ -45,7 +52,7 @@ def testAppend(self):\n simulation.context.setPositions(pdb.positions)\n simulation.context.setVelocitiesToTemperature(300*unit.kelvin)\n simulation.step(10)\n- self.assertEqual(5, dcd._dcd._modelCount)\n+ self.assertEqual(5, _readModelCount(fname))\n del simulation\n del dcd\n len1 = os.stat(fname).st_size\n@@ -54,12 +61,13 @@ def testAppend(self):\n \n integrator = mm.VerletIntegrator(0.001*unit.picoseconds)\n simulation = app.Simulation(pdb.topology, system, integrator, mm.Platform.getPlatform('Reference'))\n+ simulation.currentStep = 10\n dcd = app.DCDReporter(fname, 2, append=True)\n simulation.reporters.append(dcd)\n simulation.context.setPositions(pdb.positions)\n simulation.context.setVelocitiesToTemperature(300*unit.kelvin)\n simulation.step(10)\n- self.assertEqual(10, dcd._dcd._modelCount)\n+ self.assertEqual(10, _readModelCount(fname))\n len2 = os.stat(fname).st_size\n self.assertTrue(len2-len1 > 3*4*5*system.getNumParticles())\n del simulation\n@@ -83,7 +91,7 @@ def testAtomSubset(self):\n simulation.context.setPositions(pdb.positions)\n simulation.context.setVelocitiesToTemperature(300*unit.kelvin)\n simulation.step(10)\n- self.assertEqual(5, dcd._dcd._modelCount)\n+ self.assertEqual(5, _readModelCount(fname))\n del simulation\n del dcd\n len1 = os.stat(fname).st_size\n@@ -92,12 +100,13 @@ def testAtomSubset(self):\n \n integrator = mm.VerletIntegrator(0.001*unit.picoseconds)\n simulation = app.Simulation(pdb.topology, system, integrator, mm.Platform.getPlatform('Reference'))\n+ simulation.currentStep = 10\n dcd = app.DCDReporter(fname, 2, append=True, atomSubset=atomSubset)\n simulation.reporters.append(dcd)\n simulation.context.setPositions(pdb.positions)\n simulation.context.setVelocitiesToTemperature(300*unit.kelvin)\n simulation.step(10)\n- self.assertEqual(10, dcd._dcd._modelCount)\n+ self.assertEqual(10, _readModelCount(fname))\n len2 = os.stat(fname).st_size\n self.assertTrue(len2-len1 > 3*4*5*len(atomSubset))\n del simulation\ndiff --git a/wrappers/python/tests/TestXtcFile.py b/wrappers/python/tests/TestXtcFile.py\nindex dbbb93cc7a..aa59b446fb 100644\n--- a/wrappers/python/tests/TestXtcFile.py\n+++ b/wrappers/python/tests/TestXtcFile.py\n@@ -34,7 +34,7 @@ def test_xtc_triclinic(self):\n mm.Vec3(random(), random(), random()) * unit.nanometers,\n )\n box.append(np.array([[vec.x, vec.y, vec.z] for vec in box_i]))\n- xtc.writeModel(coords[i], periodicBoxVectors=box_i)\n+ xtc.writeModel(coords[i], periodicBoxVectors=box_i, currentStep=i)\n # The XTCFile class does not provide a way to read the\n # trajectory back, but the underlying XTC library does\n coords_read, box_read, time, step = read_xtc(fname.encode(\"utf-8\"))\n@@ -72,7 +72,7 @@ def test_xtc_cubic(self):\n )\n box_i = mm.Vec3(random(), random(), random()) * unit.nanometers\n box.append(np.diag(box_i[:3].value_in_unit(unit.nanometers)))\n- xtc.writeModel(coords[i], unitCellDimensions=box_i)\n+ xtc.writeModel(coords[i], unitCellDimensions=box_i, currentStep=i)\n #The XTCFile class does not provide a way to read the\n #trajectory back, but the underlying XTC library does\n coords_read, box_read, time, step = read_xtc(fname.encode(\"utf-8\"))\n@@ -108,7 +108,7 @@ def test_xtc_box_from_topology(self):\n [mm.Vec3(random(), random(), random()) for j in range(natom)]\n * unit.nanometers\n )\n- xtc.writeModel(coords[i])\n+ xtc.writeModel(coords[i], currentStep=i)\n # The XTCFile class does not provide a way to read the\n # trajectory back, but the underlying XTC library does\n coords_read, box_read, time, step = read_xtc(fname.encode(\"utf-8\"))\n@@ -158,7 +158,7 @@ def test_xtc_small(self):\n mm.Vec3(random(), random(), random()) * unit.nanometers,\n )\n box.append(np.array([[vec.x, vec.y, vec.z] for vec in box_i]))\n- xtc.writeModel(coords[i], periodicBoxVectors=box_i)\n+ xtc.writeModel(coords[i], periodicBoxVectors=box_i, currentStep=i)\n # The XTCFile class does not provide a way to read the\n # trajectory back, but the underlying XTC library does\n coords_read, box_read, time, step = read_xtc(fname.encode(\"utf-8\"))\n@@ -187,7 +187,8 @@ def testLongTrajectory(self):\n for i in range(5):\n xtc.writeModel(\n [mm.Vec3(random(), random(), random()) for j in range(natom)]\n- * unit.angstroms\n+ * unit.angstroms,\n+ currentStep=i\n )\n \n def testAppend(self):\n@@ -212,7 +213,6 @@ def testAppend(self):\n simulation.context.setPositions(pdb.positions)\n simulation.context.setVelocitiesToTemperature(300 * unit.kelvin)\n simulation.step(10)\n- self.assertEqual(5, xtc._xtc._modelCount)\n self.assertEqual(5, xtc._xtc._getNumFrames())\n del simulation\n del xtc\n@@ -226,12 +226,12 @@ def testAppend(self):\n integrator,\n mm.Platform.getPlatform(\"Reference\"),\n )\n+ simulation.currentStep = 10\n xtc = app.XTCReporter(fname, 2, append=True)\n simulation.reporters.append(xtc)\n simulation.context.setPositions(pdb.positions)\n simulation.context.setVelocitiesToTemperature(300 * unit.kelvin)\n simulation.step(10)\n- self.assertEqual(10, xtc._xtc._modelCount)\n self.assertEqual(10, xtc._xtc._getNumFrames())\n del simulation\n del xtc\n@@ -259,7 +259,6 @@ def testAtomSubset(self):\n simulation.context.setPositions(pdb.positions)\n simulation.context.setVelocitiesToTemperature(300 * unit.kelvin)\n simulation.step(10)\n- self.assertEqual(5, xtc._xtc._modelCount)\n self.assertEqual(5, xtc._xtc._getNumFrames())\n \n # The XTCFile class does not provide a way to read the\n", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}100{"question_id": "MSB_openmm_openmm_pr4879", "question_type": "multi_swe_bench", "description": "Fixing XTC/DCD time and step writing (openmm/openmm#4879)", "content": {"org": "openmm", "repo": "openmm", "pr_number": 4879, "issue_title": "Fixing XTC/DCD time and step writing", "issue_body": "Fixes https://github.com/openmm/openmm/issues/4873 ", "base_commit": "adf1843f8d2bdcc8bcb32ebefa337d03d471a0ac", "resolved_issues": [{"number": null, "title": "Fixing XTC/DCD time and step writing", "body": "The issue involves incorrect time step and frame indexing when writing simulation trajectories in XTC and DCD file formats. Specifically, the current implementation writes inaccurate values for the current simulation step and frame intervals, leading to inconsistencies in the trajectory metadata. This can result in downstream issues when analyzing or appending to these files, as the metadata does not accurately reflect the simulation state.\n\nExpected behavior: The time step and frame indexing in XTC and DCD trajectory files should correctly reflect the simulation's current step and reporting interval. This ensures that the trajectory metadata is accurate and consistent, enabling proper analysis and seamless appending of additional frames to existing files.\n\n## IMPORTANT INSTRUCTIONS\n\n1. If you edit a python file, you MUST run 'make PythonInstall' inside the build directory\n2. If you edit a c++ file, you MUST run 'make -j4 && make install\" inside the build directory"}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/openmm_m_openmm:pr-4879", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/wrappers/python/openmm/app/dcdfile.py b/wrappers/python/openmm/app/dcdfile.py\nindex 335cdc0b79..af65894f62 100644\n--- a/wrappers/python/openmm/app/dcdfile.py\n+++ b/wrappers/python/openmm/app/dcdfile.py\n@@ -145,8 +145,7 @@ def writeModel(self, positions, unitCellDimensions=None, periodicBoxVectors=None\n file.seek(8, os.SEEK_SET)\n file.write(struct.pack('<i', self._modelCount))\n file.seek(20, os.SEEK_SET)\n- file.write(struct.pack('<i', self._firstStep+self._modelCount*self._interval))\n-\n+ file.write(struct.pack('<i', self._firstStep+(self._modelCount-1)*self._interval))\n # Write the data.\n \n file.seek(0, os.SEEK_END)\ndiff --git a/wrappers/python/openmm/app/dcdreporter.py b/wrappers/python/openmm/app/dcdreporter.py\nindex d09d5c149c..0e97bc9660 100644\n--- a/wrappers/python/openmm/app/dcdreporter.py\n+++ b/wrappers/python/openmm/app/dcdreporter.py\n@@ -110,7 +110,7 @@ def report(self, simulation, state):\n topology.addAtom(atoms[i].name, atoms[i].element, residue)\n self._dcd = DCDFile(\n self._out, topology, simulation.integrator.getStepSize(),\n- simulation.currentStep, self._reportInterval, self._append\n+ self._reportInterval, self._reportInterval, self._append\n )\n positions = state.getPositions(asNumpy=True)\n if self._atomSubset is not None:\ndiff --git a/wrappers/python/openmm/app/xtcreporter.py b/wrappers/python/openmm/app/xtcreporter.py\nindex 0a05e59ad6..bace7d98cb 100644\n--- a/wrappers/python/openmm/app/xtcreporter.py\n+++ b/wrappers/python/openmm/app/xtcreporter.py\n@@ -107,7 +107,7 @@ def report(self, simulation, state):\n self._fileName,\n topology,\n simulation.integrator.getStepSize(),\n- simulation.currentStep,\n+ self._reportInterval,\n self._reportInterval,\n self._append,\n )\n"}, "test": {"test_patch": "diff --git a/wrappers/python/tests/TestDcdFile.py b/wrappers/python/tests/TestDcdFile.py\nindex 1ce1cbdeaf..048da3af73 100644\n--- a/wrappers/python/tests/TestDcdFile.py\n+++ b/wrappers/python/tests/TestDcdFile.py\n@@ -6,6 +6,17 @@\n from random import random\n import os\n \n+\n+def _read_dcd_header(file):\n+ import struct\n+ \n+ with open(file, \"r+b\") as f:\n+ f.seek(8, os.SEEK_SET)\n+ modelCount = struct.unpack(\"<i\", f.read(4))[0]\n+ f.seek(20, os.SEEK_SET)\n+ currStep = struct.unpack(\"<i\", f.read(4))[0]\n+ return modelCount, currStep\n+\n class TestDCDFile(unittest.TestCase):\n def test_dcd(self):\n \"\"\" Test the DCD file \"\"\"\n@@ -49,11 +60,15 @@ def testAppend(self):\n del simulation\n del dcd\n len1 = os.stat(fname).st_size\n+ modelCount, currStep = _read_dcd_header(fname)\n+ self.assertEqual(5, modelCount)\n+ self.assertEqual(10, currStep)\n \n # Create a new simulation and have it append some more frames.\n \n integrator = mm.VerletIntegrator(0.001*unit.picoseconds)\n simulation = app.Simulation(pdb.topology, system, integrator, mm.Platform.getPlatform('Reference'))\n+ simulation.currentStep = 10\n dcd = app.DCDReporter(fname, 2, append=True)\n simulation.reporters.append(dcd)\n simulation.context.setPositions(pdb.positions)\n@@ -64,6 +79,9 @@ def testAppend(self):\n self.assertTrue(len2-len1 > 3*4*5*system.getNumParticles())\n del simulation\n del dcd\n+ modelCount, currStep = _read_dcd_header(fname)\n+ self.assertEqual(10, modelCount)\n+ self.assertEqual(20, currStep)\n os.remove(fname)\n \n def testAtomSubset(self):\n@@ -87,11 +105,15 @@ def testAtomSubset(self):\n del simulation\n del dcd\n len1 = os.stat(fname).st_size\n+ modelCount, currStep = _read_dcd_header(fname)\n+ self.assertEqual(5, modelCount)\n+ self.assertEqual(10, currStep)\n \n # Create a new simulation and have it append some more frames.\n \n integrator = mm.VerletIntegrator(0.001*unit.picoseconds)\n simulation = app.Simulation(pdb.topology, system, integrator, mm.Platform.getPlatform('Reference'))\n+ simulation.currentStep = 10\n dcd = app.DCDReporter(fname, 2, append=True, atomSubset=atomSubset)\n simulation.reporters.append(dcd)\n simulation.context.setPositions(pdb.positions)\n@@ -102,6 +124,9 @@ def testAtomSubset(self):\n self.assertTrue(len2-len1 > 3*4*5*len(atomSubset))\n del simulation\n del dcd\n+ modelCount, currStep = _read_dcd_header(fname)\n+ self.assertEqual(10, modelCount)\n+ self.assertEqual(20, currStep)\n os.remove(fname)\n \n \ndiff --git a/wrappers/python/tests/TestXtcFile.py b/wrappers/python/tests/TestXtcFile.py\nindex dbbb93cc7a..2d905ccf14 100644\n--- a/wrappers/python/tests/TestXtcFile.py\n+++ b/wrappers/python/tests/TestXtcFile.py\n@@ -191,6 +191,8 @@ def testLongTrajectory(self):\n )\n \n def testAppend(self):\n+ from openmm.app.internal.xtc_utils import read_xtc\n+\n \"\"\"Test appending to an existing trajectory.\"\"\"\n with tempfile.TemporaryDirectory() as temp:\n fname = os.path.join(temp, 'traj.xtc')\n@@ -214,6 +216,9 @@ def testAppend(self):\n simulation.step(10)\n self.assertEqual(5, xtc._xtc._modelCount)\n self.assertEqual(5, xtc._xtc._getNumFrames())\n+ _, _, time, step = read_xtc(fname.encode(\"utf-8\"))\n+ self.assertTrue(np.allclose(np.arange(2, 11, 2) * 0.001, time))\n+ self.assertTrue(np.array_equal(np.arange(2, 11, 2), step))\n del simulation\n del xtc\n \n@@ -226,6 +231,7 @@ def testAppend(self):\n integrator,\n mm.Platform.getPlatform(\"Reference\"),\n )\n+ simulation.currentStep = 10\n xtc = app.XTCReporter(fname, 2, append=True)\n simulation.reporters.append(xtc)\n simulation.context.setPositions(pdb.positions)\n@@ -233,6 +239,9 @@ def testAppend(self):\n simulation.step(10)\n self.assertEqual(10, xtc._xtc._modelCount)\n self.assertEqual(10, xtc._xtc._getNumFrames())\n+ _, _, time, step = read_xtc(fname.encode(\"utf-8\"))\n+ self.assertTrue(np.allclose(np.arange(2, 21, 2) * 0.001, time))\n+ self.assertTrue(np.array_equal(np.arange(2, 21, 2), step))\n del simulation\n del xtc\n \n@@ -269,6 +278,8 @@ def testAtomSubset(self):\n self.assertEqual(box_read.shape, (3, 3, 5))\n self.assertEqual(len(time), 5)\n self.assertEqual(len(step), 5)\n+ self.assertTrue(np.allclose(np.arange(2, 11, 2) * 1e-10, time))\n+ self.assertTrue(np.array_equal(np.arange(2, 11, 2), step))\n coords = [pdb.positions[i].value_in_unit(unit.nanometers) for i in atomSubset]\n self.assertTrue(np.allclose(coords_read[:,:,0], coords, atol=1e-3))\n self.assertTrue(np.allclose(box_read[:,:,0], pdb.topology.getPeriodicBoxVectors().value_in_unit(unit.nanometers), atol=1e-3))\n", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}101{"question_id": "MSB_openmm_openmm_pr4898", "question_type": "multi_swe_bench", "description": "Fixed error adding vsites that depend on other vsites (openmm/openmm#4898)", "content": {"org": "openmm", "repo": "openmm", "pr_number": 4898, "issue_title": "Fixed error adding vsites that depend on other vsites", "issue_body": "Fixes #4892.", "base_commit": "de180e4e94814ee2c83fde13b0f60e3836b43d2f", "resolved_issues": [{"number": 4892, "title": "modeller.addExtraParticles is not working when the position of virtual site depends on another virtual site", "body": "Hi OpenMM Devs. I've found that in OpenMM8.2 the position of a virtual site is now permitted to depend on another virtual site, a feature required for certain force fields. A minor issue is that if one tries to add V1 (which depends on real particle only) and V2 (which depends on virtual site V1) simultaneously via `modeller.addExtraParticles()`, TypeError occurs as follows:\n\n```\norigin = unit.sum([templateAtomPositions[atom]*weight for atom, weight in zip(site.atoms, site.originWeights)])\n ~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~\nTypeError: unsupported operand type(s) for *: 'NoneType' and 'float'\n```\n\nAdding V2 virtual site position manually would work anyway and simulation is running seamlessly, but I believe `modeller.addExtraParticles()` should handle this case.\n\n\n## IMPORTANT INSTRUCTIONS\n\n1. If you edit a python file, you MUST run 'make PythonInstall' inside the build directory\n2. If you edit a c++ file, you MUST run 'make -j4 && make install\" inside the build directory"}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/openmm_m_openmm:pr-4898", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/wrappers/python/openmm/app/modeller.py b/wrappers/python/openmm/app/modeller.py\nindex 23e6ee6ff4..441a0813d5 100644\n--- a/wrappers/python/openmm/app/modeller.py\n+++ b/wrappers/python/openmm/app/modeller.py\n@@ -1208,24 +1208,31 @@ def addExtraParticles(self, forcefield, ignoreExternalBonds=False, residueTempla\n if site.index == index:\n # This is a virtual site. Compute its position by the correct rule.\n \n- if site.type == 'average2':\n- position = site.weights[0]*templateAtomPositions[site.atoms[0]] + site.weights[1]*templateAtomPositions[site.atoms[1]]\n- elif site.type == 'average3':\n- position = site.weights[0]*templateAtomPositions[site.atoms[0]] + site.weights[1]*templateAtomPositions[site.atoms[1]] + site.weights[2]*templateAtomPositions[site.atoms[2]]\n- elif site.type == 'outOfPlane':\n- v1 = templateAtomPositions[site.atoms[1]] - templateAtomPositions[site.atoms[0]]\n- v2 = templateAtomPositions[site.atoms[2]] - templateAtomPositions[site.atoms[0]]\n- cross = Vec3(v1[1]*v2[2]-v1[2]*v2[1], v1[2]*v2[0]-v1[0]*v2[2], v1[0]*v2[1]-v1[1]*v2[0])\n- position = templateAtomPositions[site.atoms[0]] + site.weights[0]*v1 + site.weights[1]*v2 + site.weights[2]*cross\n- elif site.type == 'localCoords':\n- origin = unit.sum([templateAtomPositions[atom]*weight for atom, weight in zip(site.atoms, site.originWeights)])\n- xdir = unit.sum([templateAtomPositions[atom]*weight for atom, weight in zip(site.atoms, site.xWeights)])\n- ydir = unit.sum([templateAtomPositions[atom]*weight for atom, weight in zip(site.atoms, site.yWeights)])\n- zdir = Vec3(xdir[1]*ydir[2]-xdir[2]*ydir[1], xdir[2]*ydir[0]-xdir[0]*ydir[2], xdir[0]*ydir[1]-xdir[1]*ydir[0])\n- xdir /= norm(xdir);\n- zdir /= norm(zdir);\n- ydir = Vec3(zdir[1]*xdir[2]-zdir[2]*xdir[1], zdir[2]*xdir[0]-zdir[0]*xdir[2], zdir[0]*xdir[1]-zdir[1]*xdir[0])\n- position = origin + xdir*site.localPos[0] + ydir*site.localPos[1] + zdir*site.localPos[2];\n+ try:\n+ if site.type == 'average2':\n+ position = site.weights[0]*templateAtomPositions[site.atoms[0]] + site.weights[1]*templateAtomPositions[site.atoms[1]]\n+ elif site.type == 'average3':\n+ position = site.weights[0]*templateAtomPositions[site.atoms[0]] + site.weights[1]*templateAtomPositions[site.atoms[1]] + site.weights[2]*templateAtomPositions[site.atoms[2]]\n+ elif site.type == 'outOfPlane':\n+ v1 = templateAtomPositions[site.atoms[1]] - templateAtomPositions[site.atoms[0]]\n+ v2 = templateAtomPositions[site.atoms[2]] - templateAtomPositions[site.atoms[0]]\n+ cross = Vec3(v1[1]*v2[2]-v1[2]*v2[1], v1[2]*v2[0]-v1[0]*v2[2], v1[0]*v2[1]-v1[1]*v2[0])\n+ position = templateAtomPositions[site.atoms[0]] + site.weights[0]*v1 + site.weights[1]*v2 + site.weights[2]*cross\n+ elif site.type == 'localCoords':\n+ origin = unit.sum([templateAtomPositions[atom]*weight for atom, weight in zip(site.atoms, site.originWeights)])\n+ xdir = unit.sum([templateAtomPositions[atom]*weight for atom, weight in zip(site.atoms, site.xWeights)])\n+ ydir = unit.sum([templateAtomPositions[atom]*weight for atom, weight in zip(site.atoms, site.yWeights)])\n+ zdir = Vec3(xdir[1]*ydir[2]-xdir[2]*ydir[1], xdir[2]*ydir[0]-xdir[0]*ydir[2], xdir[0]*ydir[1]-xdir[1]*ydir[0])\n+ xdir /= norm(xdir)\n+ zdir /= norm(zdir)\n+ ydir = Vec3(zdir[1]*xdir[2]-zdir[2]*xdir[1], zdir[2]*xdir[0]-zdir[0]*xdir[2], zdir[0]*xdir[1]-zdir[1]*xdir[0])\n+ position = origin + xdir*site.localPos[0] + ydir*site.localPos[1] + zdir*site.localPos[2]\n+ except:\n+ # This can happen if the virtual site depends on another virtual site whose position\n+ # hasn't been set yet. Ignore the error. We'll put it at a random position (see below),\n+ # which will get replaced with the correct position at the start of the simulation.\n+\n+ pass\n if position is None and atom.type in drudeTypeMap:\n # This is a Drude particle. Put it on top of its parent atom.\n \n"}, "test": {"test_patch": "diff --git a/wrappers/python/tests/TestModeller.py b/wrappers/python/tests/TestModeller.py\nindex 33d085a715..068cfcc1ad 100644\n--- a/wrappers/python/tests/TestModeller.py\n+++ b/wrappers/python/tests/TestModeller.py\n@@ -1087,7 +1087,7 @@ def test_addVirtualSites(self):\n residue = topology.addResidue('Test', chain)\n topology.addAtom('C', element.carbon, residue)\n topology.addAtom('N', element.nitrogen, residue)\n- topology.addAtom('V', element.oxygen, residue)\n+ topology.addAtom('O', element.oxygen, residue)\n \n \n # Add the virtual sites.\n@@ -1115,6 +1115,54 @@ def test_addVirtualSites(self):\n self.assertVecAlmostEqual(p1.value_in_unit(nanometers), p2.value_in_unit(nanometers), 1e-6)\n \n \n+ def testNestedVirtualSites(self):\n+ \"\"\"Test adding virtual sites that depend on other virtual sites.\"\"\"\n+ xml = \"\"\"\n+ <ForceField>\n+ <AtomTypes>\n+ <Type name=\"C\" class=\"C\" element=\"C\" mass=\"10\"/>\n+ <Type name=\"N\" class=\"N\" element=\"N\" mass=\"10\"/>\n+ <Type name=\"V\" class=\"V\" mass=\"0.0\"/>\n+ </AtomTypes>\n+ <Residues>\n+ <Residue name=\"Test\">\n+ <Atom name=\"C\" type=\"C\"/>\n+ <Atom name=\"N\" type=\"N\"/>\n+ <Atom name=\"V1\" type=\"V\"/>\n+ <Atom name=\"V2\" type=\"V\"/>\n+ <VirtualSite type=\"average2\" index=\"2\" atom1=\"0\" atom2=\"1\" weight1=\"0.5\" weight2=\"0.5\"/>\n+ <VirtualSite type=\"average2\" index=\"3\" atom1=\"0\" atom2=\"2\" weight1=\"0.5\" weight2=\"0.5\"/>\n+ </Residue>\n+ </Residues>\n+ </ForceField>\"\"\"\n+ ff = ForceField(StringIO(xml))\n+\n+ # Create the three real atoms.\n+\n+ topology = Topology()\n+ chain = topology.addChain()\n+ residue = topology.addResidue('Test', chain)\n+ topology.addAtom('C', element.carbon, residue)\n+ topology.addAtom('N', element.nitrogen, residue)\n+\n+ # Add the virtual sites.\n+\n+ modeller = Modeller(topology, [Vec3(0.0, 0.0, 0.0), Vec3(1.0, 0.0, 0.0)]*nanometers)\n+ modeller.addExtraParticles(ff)\n+ top = modeller.topology\n+ pos = modeller.positions\n+\n+ # Check that the correct particles were added.\n+\n+ self.assertEqual(len(pos), 4)\n+ for atom, elem in zip(top.atoms(), [element.carbon, element.nitrogen, None, None]):\n+ self.assertEqual(elem, atom.element)\n+\n+ # The positions of the first virtual site should be correct, but the second one won't be.\n+\n+ self.assertVecAlmostEqual(Vec3(0.5, 0.0, 0.0), pos[2].value_in_unit(nanometers), 1e-6)\n+\n+\n def test_multiSiteIon(self):\n \"\"\"Test adding extra particles whose positions are determined based on bonds.\"\"\"\n xml = \"\"\"\n", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}102{"question_id": "MSB_openmm_openmm_pr4907", "question_type": "multi_swe_bench", "description": "Add correction for self energy of neutralizing plasma (openmm/openmm#4907)", "content": {"org": "openmm", "repo": "openmm", "pr_number": 4907, "issue_title": "Add correction for self energy of neutralizing plasma", "issue_body": "Fixes #4905. When simulating a charged system with Ewald or PME, the self energy should include a term for the neutralizing plasma. We were missing that term. It's just a shift in the energy, so it doesn't affect forces. It does depend on periodic box volume, though, which means it could affect the behavior of barostats.\r\n\r\nThis is only relevant to charged systems. When a system has zero net charge the term vanishes.", "base_commit": "1767ffeed83fa15d6de91e797a4f7ae482eb8413", "resolved_issues": [{"number": 4905, "title": "Long-range electrostatics methods should include net charge correction", "body": "Methods for calculating long-range electrostatic interactions (standard Ewald summation and PME) should include a correction term $\\Delta U_{\\mathrm{bkgd}}=-(\\sum_{i=1}^nq_i)^2/8\\epsilon_0V\\alpha^2$ to the total energy that accounts for the implicit presence of a uniform neutralizing background charge density. This is discussed in:\n\n- [Figueirido *et al.*, *J. Chem. Phys.* 103, 6133 (1995)](https://doi.org/10.1063/1.470721).\n- [Hub *et al.*, *J. Chem. Theory Comput.* 10, 381 (2014)](https://doi.org/10.1021/ct400626b). \n- Allen and Tildesley, *Computer Simulation of Liquids*, 2nd ed. (2017)\n\nNote that if the system is charge-neutral overall, this term is zero and has no effect. If it is not charge-neutral, and the total charge is fixed, this term has no effect on forces, but it does affect the dependence of the energy on the volume. For the constant potential method #4870 that we are developing, it will affect the charges we solve for if a total charge constraint is not in use.\n\nThe term appears important to include, as without it, the Ewald energy will have a dependence on the Ewald parameter $\\alpha$ (that has no direct physical significance and is supposed to serve only as a numerical tuning parameter). The term listed above should be the exact correction for this $\\alpha$-dependence. For example, here's a system of 2 positive unit charges separated by 1.5 nm along one axis of a 3-nm cube (net charge +2):\n<img width=\"384\" alt=\"Image\" src=\"https://github.com/user-attachments/assets/e61c2437-6f6b-4396-91f5-f7d82858a691\" />\nHere's OpenMM's explicit solvent DHFR benchmark test system with ff99SB/TIP3P (net charge -11):\n<img width=\"384\" alt=\"Image\" src=\"https://github.com/user-attachments/assets/95816ab1-c8d0-405f-b6dc-92be2825acb1\" />\n\n## IMPORTANT INSTRUCTIONS\n\n1. If you edit a python file, you MUST run 'make PythonInstall' inside the build directory\n2. If you edit a c++ file, you MUST run 'make -j4 && make install\" inside the build directory"}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/openmm_m_openmm:pr-4907", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/platforms/common/src/kernels/nonbondedParameters.cc b/platforms/common/src/kernels/nonbondedParameters.cc\nindex 408269b36b..b30cb03f05 100644\n--- a/platforms/common/src/kernels/nonbondedParameters.cc\n+++ b/platforms/common/src/kernels/nonbondedParameters.cc\n@@ -3,13 +3,15 @@\n */\n KERNEL void computeParameters(GLOBAL mixed* RESTRICT energyBuffer, int includeSelfEnergy, GLOBAL real* RESTRICT globalParams,\n int numAtoms, GLOBAL const float4* RESTRICT baseParticleParams, GLOBAL real4* RESTRICT posq, GLOBAL real* RESTRICT charge,\n- GLOBAL float2* RESTRICT sigmaEpsilon, GLOBAL float4* RESTRICT particleParamOffsets, GLOBAL int* RESTRICT particleOffsetIndices\n+ GLOBAL float2* RESTRICT sigmaEpsilon, GLOBAL float4* RESTRICT particleParamOffsets, GLOBAL int* RESTRICT particleOffsetIndices,\n+ GLOBAL real* RESTRICT chargeBuffer\n #ifdef HAS_EXCEPTIONS\n , int numExceptions, GLOBAL const float4* RESTRICT baseExceptionParams, GLOBAL float4* RESTRICT exceptionParams,\n GLOBAL float4* RESTRICT exceptionParamOffsets, GLOBAL int* RESTRICT exceptionOffsetIndices\n #endif\n ) {\n mixed energy = 0;\n+ real totalCharge = 0;\n \n // Compute particle parameters.\n \n@@ -31,6 +33,7 @@ KERNEL void computeParameters(GLOBAL mixed* RESTRICT energyBuffer, int includeSe\n charge[i] = params.x;\n #endif\n sigmaEpsilon[i] = make_float2(0.5f*params.y, 2*SQRT(params.z));\n+ totalCharge += params.x;\n #ifdef HAS_OFFSETS\n #ifdef INCLUDE_EWALD\n energy -= EWALD_SELF_ENERGY_SCALE*params.x*params.x;\n@@ -62,6 +65,20 @@ KERNEL void computeParameters(GLOBAL mixed* RESTRICT energyBuffer, int includeSe\n #endif\n if (includeSelfEnergy)\n energyBuffer[GLOBAL_ID] += energy;\n+\n+ // Record the total charge from particles processed by this block.\n+\n+#if defined(HAS_OFFSETS) && defined(INCLUDE_EWALD)\n+ LOCAL real temp[WORK_GROUP_SIZE];\n+ temp[LOCAL_ID] = totalCharge;\n+ for (int i = 1; i < WORK_GROUP_SIZE; i *= 2) {\n+ SYNC_THREADS;\n+ if (LOCAL_ID%(i*2) == 0 && LOCAL_ID+i < WORK_GROUP_SIZE)\n+ temp[LOCAL_ID] += temp[LOCAL_ID+i];\n+ }\n+ if (LOCAL_ID == 0)\n+ chargeBuffer[GROUP_ID] = temp[0];\n+#endif\n }\n \n /**\n@@ -87,4 +104,27 @@ KERNEL void computeExclusionParameters(GLOBAL real4* RESTRICT posq, GLOBAL real*\n #endif\n exclusionParams[i] = make_float4((float) (ONE_4PI_EPS0*chargeProd), sigma, epsilon, 0);\n }\n+}\n+\n+/**\n+ * When using Ewald or PME with parameter offsets, the total charge can change each step.\n+ * We therefore need to compute the correction for the neutralizing plasma on the GPU.\n+ * This kernel is executed by a single thread block.\n+ */\n+KERNEL void computePlasmaCorrection(GLOBAL real* RESTRICT chargeBuffer, GLOBAL mixed* RESTRICT energyBuffer,\n+ real alpha, real volume) {\n+ LOCAL real temp[WORK_GROUP_SIZE];\n+ real sum = 0;\n+ for (unsigned int index = LOCAL_ID; index < NUM_GROUPS; index += LOCAL_SIZE)\n+ sum += chargeBuffer[index];\n+ temp[LOCAL_ID] = sum;\n+ for (int i = 1; i < WORK_GROUP_SIZE; i *= 2) {\n+ SYNC_THREADS;\n+ if (LOCAL_ID%(i*2) == 0 && LOCAL_ID+i < WORK_GROUP_SIZE)\n+ temp[LOCAL_ID] += temp[LOCAL_ID+i];\n+ }\n+ if (LOCAL_ID == 0) {\n+ real totalCharge = temp[0];\n+ energyBuffer[0] -= totalCharge*totalCharge/(8*EPSILON0*volume*alpha*alpha);\n+ }\n }\n\\ No newline at end of file\ndiff --git a/platforms/cpu/include/CpuKernels.h b/platforms/cpu/include/CpuKernels.h\nindex 8f1197b4c7..ae69c814b1 100644\n--- a/platforms/cpu/include/CpuKernels.h\n+++ b/platforms/cpu/include/CpuKernels.h\n@@ -305,7 +305,7 @@ class CpuCalcNonbondedForceKernel : public CalcNonbondedForceKernel {\n std::vector<std::vector<int> > bonded14IndexArray;\n std::vector<std::vector<double> > bonded14ParamArray;\n std::map<int, int> nb14Index;\n- double nonbondedCutoff, switchingDistance, rfDielectric, ewaldAlpha, ewaldDispersionAlpha, ewaldSelfEnergy, dispersionCoefficient;\n+ double nonbondedCutoff, switchingDistance, rfDielectric, ewaldAlpha, ewaldDispersionAlpha, ewaldSelfEnergy, dispersionCoefficient, totalCharge;\n int kmax[3], gridSize[3], dispersionGridSize[3];\n bool useSwitchingFunction, exceptionsArePeriodic, useOptimizedPme, hasInitializedPme, hasInitializedDispersionPme, hasParticleOffsets, hasExceptionOffsets;\n std::vector<std::set<int> > exclusions;\ndiff --git a/platforms/cpu/src/CpuKernels.cpp b/platforms/cpu/src/CpuKernels.cpp\nindex aaf4cbf7e3..b9cad4de1f 100644\n--- a/platforms/cpu/src/CpuKernels.cpp\n+++ b/platforms/cpu/src/CpuKernels.cpp\n@@ -712,6 +712,12 @@ double CpuCalcNonbondedForceKernel::execute(ContextImpl& context, bool includeFo\n }\n else\n nonbonded->calculateReciprocalIxn(numParticles, &posq[0], posData, particleParams, C6params, exclusions, forceData, includeEnergy ? &nonbondedEnergy : NULL);\n+ if (ewald || pme || ljpme) {\n+ // Add the correction for the neutralizing plasma.\n+\n+ double volume = boxVectors[0][0]*boxVectors[1][1]*boxVectors[2][2];\n+ energy -= totalCharge*totalCharge/(8*EPSILON0*volume*ewaldAlpha*ewaldAlpha);\n+ }\n }\n energy += nonbondedEnergy;\n if (includeDirect) {\n@@ -843,6 +849,7 @@ void CpuCalcNonbondedForceKernel::computeParameters(ContextImpl& context, bool o\n \n if (hasParticleOffsets || !offsetsOnly) {\n double sumSquaredCharges = 0.0;\n+ totalCharge = 0.0;\n for (int i = 0; i < numParticles; i++) {\n double charge = baseParticleParams[i][0];\n double sigma = baseParticleParams[i][1];\n@@ -857,6 +864,7 @@ void CpuCalcNonbondedForceKernel::computeParameters(ContextImpl& context, bool o\n particleParams[i] = make_pair((float) (0.5*sigma), (float) (2.0*sqrt(epsilon)));\n C6params[i] = 8.0*pow(particleParams[i].first, 3.0) * particleParams[i].second;\n sumSquaredCharges += charge*charge;\n+ totalCharge += charge;\n }\n if (nonbondedMethod == Ewald || nonbondedMethod == PME || nonbondedMethod == LJPME) {\n ewaldSelfEnergy = -ONE_4PI_EPS0*ewaldAlpha*sumSquaredCharges/sqrt(M_PI);\ndiff --git a/platforms/cuda/include/CudaKernels.h b/platforms/cuda/include/CudaKernels.h\nindex 968bb38192..8771461ca5 100644\n--- a/platforms/cuda/include/CudaKernels.h\n+++ b/platforms/cuda/include/CudaKernels.h\n@@ -9,7 +9,7 @@\n * Biological Structures at Stanford, funded under the NIH Roadmap for *\n * Medical Research, grant U54 GM072970. See https://simtk.org. *\n * *\n- * Portions copyright (c) 2008-2024 Stanford University and the Authors. *\n+ * Portions copyright (c) 2008-2025 Stanford University and the Authors. *\n * Authors: Peter Eastman *\n * Contributors: *\n * *\n@@ -182,6 +182,7 @@ class CudaCalcNonbondedForceKernel : public CalcNonbondedForceKernel {\n CudaArray pmeDispersionBsplineModuliZ;\n CudaArray pmeAtomGridIndex;\n CudaArray pmeEnergyBuffer;\n+ CudaArray chargeBuffer;\n CudaSort* sort;\n Kernel cpuPme;\n PmeIO* pmeio;\n@@ -193,7 +194,7 @@ class CudaCalcNonbondedForceKernel : public CalcNonbondedForceKernel {\n CudaFFT3D* dispersionFft;\n cufftHandle dispersionFftForward;\n cufftHandle dispersionFftBackward;\n- CUfunction computeParamsKernel, computeExclusionParamsKernel;\n+ CUfunction computeParamsKernel, computeExclusionParamsKernel, computePlasmaCorrectionKernel;\n CUfunction ewaldSumsKernel;\n CUfunction ewaldForcesKernel;\n CUfunction pmeGridIndexKernel;\n@@ -212,7 +213,7 @@ class CudaCalcNonbondedForceKernel : public CalcNonbondedForceKernel {\n std::vector<std::string> paramNames;\n std::vector<double> paramValues;\n std::map<int, int> exceptionIndex;\n- double ewaldSelfEnergy, dispersionCoefficient, alpha, dispersionAlpha;\n+ double ewaldSelfEnergy, dispersionCoefficient, alpha, dispersionAlpha, totalCharge;\n int interpolateForceThreads;\n int gridSizeX, gridSizeY, gridSizeZ;\n int dispersionGridSizeX, dispersionGridSizeY, dispersionGridSizeZ;\ndiff --git a/platforms/cuda/src/CudaKernels.cpp b/platforms/cuda/src/CudaKernels.cpp\nindex aef2a14d05..fc2aab5d37 100644\n--- a/platforms/cuda/src/CudaKernels.cpp\n+++ b/platforms/cuda/src/CudaKernels.cpp\n@@ -367,8 +367,11 @@ void CudaCalcNonbondedForceKernel::initialize(const System& system, const Nonbon\n dispersionCoefficient = 0.0;\n alpha = 0;\n ewaldSelfEnergy = 0.0;\n+ totalCharge = 0.0;\n map<string, string> paramsDefines;\n paramsDefines[\"ONE_4PI_EPS0\"] = cu.doubleToString(ONE_4PI_EPS0);\n+ paramsDefines[\"EPSILON0\"] = cu.doubleToString(EPSILON0);\n+ paramsDefines[\"WORK_GROUP_SIZE\"] = cu.intToString(CudaContext::ThreadBlockSize);\n hasOffsets = (force.getNumParticleParameterOffsets() > 0 || force.getNumExceptionParameterOffsets() > 0);\n if (hasOffsets)\n paramsDefines[\"HAS_OFFSETS\"] = \"1\";\n@@ -391,8 +394,10 @@ void CudaCalcNonbondedForceKernel::initialize(const System& system, const Nonbon\n if (cu.getContextIndex() == 0) {\n paramsDefines[\"INCLUDE_EWALD\"] = \"1\";\n paramsDefines[\"EWALD_SELF_ENERGY_SCALE\"] = cu.doubleToString(ONE_4PI_EPS0*alpha/sqrt(M_PI));\n- for (int i = 0; i < numParticles; i++)\n+ for (int i = 0; i < numParticles; i++) {\n ewaldSelfEnergy -= baseParticleParamVec[i].x*baseParticleParamVec[i].x*ONE_4PI_EPS0*alpha/sqrt(M_PI);\n+ totalCharge += baseParticleParamVec[i].x;\n+ }\n \n // Create the reciprocal space kernels.\n \n@@ -444,8 +449,10 @@ void CudaCalcNonbondedForceKernel::initialize(const System& system, const Nonbon\n if (cu.getContextIndex() == 0) {\n paramsDefines[\"INCLUDE_EWALD\"] = \"1\";\n paramsDefines[\"EWALD_SELF_ENERGY_SCALE\"] = cu.doubleToString(ONE_4PI_EPS0*alpha/sqrt(M_PI));\n- for (int i = 0; i < numParticles; i++)\n+ for (int i = 0; i < numParticles; i++) {\n ewaldSelfEnergy -= baseParticleParamVec[i].x*baseParticleParamVec[i].x*ONE_4PI_EPS0*alpha/sqrt(M_PI);\n+ totalCharge += baseParticleParamVec[i].x;\n+ }\n if (doLJPME) {\n paramsDefines[\"INCLUDE_LJPME\"] = \"1\";\n paramsDefines[\"LJPME_SELF_ENERGY_SCALE\"] = cu.doubleToString(pow(dispersionAlpha, 6)/3.0);\n@@ -831,6 +838,8 @@ void CudaCalcNonbondedForceKernel::initialize(const System& system, const Nonbon\n globalParams.initialize(cu, max((int) paramValues.size(), 1), cu.getUseDoublePrecision() ? sizeof(double) : sizeof(float), \"globalParams\");\n if (paramValues.size() > 0)\n globalParams.upload(paramValues, true);\n+ chargeBuffer.initialize(cu, cu.getNumThreadBlocks(), cu.getUseDoublePrecision() ? sizeof(double) : sizeof(float), \"chargeBuffer\");\n+ cu.clearBuffer(chargeBuffer);\n recomputeParams = true;\n \n // Initialize the kernel for updating parameters.\n@@ -838,6 +847,7 @@ void CudaCalcNonbondedForceKernel::initialize(const System& system, const Nonbon\n CUmodule module = cu.createModule(CommonKernelSources::nonbondedParameters, paramsDefines);\n computeParamsKernel = cu.getKernel(module, \"computeParameters\");\n computeExclusionParamsKernel = cu.getKernel(module, \"computeExclusionParameters\");\n+ computePlasmaCorrectionKernel = cu.getKernel(module, \"computePlasmaCorrection\");\n info = new ForceInfo(force);\n cu.addForce(info);\n }\n@@ -858,13 +868,18 @@ double CudaCalcNonbondedForceKernel::execute(ContextImpl& context, bool includeF\n recomputeParams = true;\n globalParams.upload(paramValues, true);\n }\n- double energy = (includeReciprocal ? ewaldSelfEnergy : 0.0);\n+ double energy = 0.0;\n+ if (includeReciprocal && (pmeGrid1.isInitialized() || cosSinSums.isInitialized())) {\n+ double4 boxSize = cu.getPeriodicBoxSize();\n+ double volume = boxSize.x*boxSize.y*boxSize.z;\n+ energy = ewaldSelfEnergy - totalCharge*totalCharge/(8*EPSILON0*volume*alpha*alpha);\n+ }\n if (recomputeParams || hasOffsets) {\n int computeSelfEnergy = (includeEnergy && includeReciprocal);\n- int numAtoms = cu.getPaddedNumAtoms();\n+ int numAtoms = cu.getNumAtoms();\n vector<void*> paramsArgs = {&cu.getEnergyBuffer().getDevicePointer(), &computeSelfEnergy, &globalParams.getDevicePointer(), &numAtoms,\n &baseParticleParams.getDevicePointer(), &cu.getPosq().getDevicePointer(), &charges.getDevicePointer(), &sigmaEpsilon.getDevicePointer(),\n- &particleParamOffsets.getDevicePointer(), &particleOffsetIndices.getDevicePointer()};\n+ &particleParamOffsets.getDevicePointer(), &particleOffsetIndices.getDevicePointer(), &chargeBuffer.getDevicePointer()};\n int numExceptions;\n if (exceptionParams.isInitialized()) {\n numExceptions = exceptionParams.getSize();\n@@ -885,8 +900,27 @@ double CudaCalcNonbondedForceKernel::execute(ContextImpl& context, bool includeF\n cuEventRecord(paramsSyncEvent, cu.getCurrentStream());\n cuStreamWaitEvent(pmeStream, paramsSyncEvent, 0);\n }\n- if (hasOffsets)\n- energy = 0.0; // The Ewald self energy was computed in the kernel.\n+ if (hasOffsets) {\n+ // The Ewald self energy was computed in the kernel.\n+\n+ energy = 0.0;\n+ if (pmeGrid1.isInitialized() || cosSinSums.isInitialized()) {\n+ // Invoke a kernel to compute the correction for the neutralizing plasma.\n+\n+ double4 boxSize = cu.getPeriodicBoxSize();\n+ if (cu.getUseDoublePrecision()) {\n+ double volume = boxSize.x*boxSize.y*boxSize.z;\n+ vector<void*> correctionArgs = {&chargeBuffer.getDevicePointer(), &cu.getEnergyBuffer().getDevicePointer(), &alpha, &volume};\n+ cu.executeKernel(computePlasmaCorrectionKernel, &correctionArgs[0], CudaContext::ThreadBlockSize, CudaContext::ThreadBlockSize);\n+ }\n+ else {\n+ float alphaFloat = (float) alpha;\n+ float volume = boxSize.x*boxSize.y*boxSize.z;\n+ vector<void*> correctionArgs = {&chargeBuffer.getDevicePointer(), &cu.getEnergyBuffer().getDevicePointer(), &alphaFloat, &volume};\n+ cu.executeKernel(computePlasmaCorrectionKernel, &correctionArgs[0], CudaContext::ThreadBlockSize, CudaContext::ThreadBlockSize);\n+ }\n+ }\n+ }\n recomputeParams = false;\n }\n \n@@ -1143,10 +1177,12 @@ void CudaCalcNonbondedForceKernel::copyParametersToContext(ContextImpl& context,\n // Compute the self energy.\n \n ewaldSelfEnergy = 0.0;\n+ totalCharge = 0.0;\n if (nonbondedMethod == Ewald || nonbondedMethod == PME || nonbondedMethod == LJPME) {\n if (cu.getContextIndex() == 0) {\n for (int i = 0; i < force.getNumParticles(); i++) {\n ewaldSelfEnergy -= baseParticleParamVec[i].x*baseParticleParamVec[i].x*ONE_4PI_EPS0*alpha/sqrt(M_PI);\n+ totalCharge += baseParticleParamVec[i].x;\n if (doLJPME)\n ewaldSelfEnergy += baseParticleParamVec[i].z*pow(baseParticleParamVec[i].y*dispersionAlpha, 6)/3.0;\n }\ndiff --git a/platforms/hip/include/HipKernels.h b/platforms/hip/include/HipKernels.h\nindex 37b0ea040f..0e3b8fbe69 100644\n--- a/platforms/hip/include/HipKernels.h\n+++ b/platforms/hip/include/HipKernels.h\n@@ -9,7 +9,7 @@\n * Biological Structures at Stanford, funded under the NIH Roadmap for *\n * Medical Research, grant U54 GM072970. See https://simtk.org. *\n * *\n- * Portions copyright (c) 2008-2024 Stanford University and the Authors. *\n+ * Portions copyright (c) 2008-2025 Stanford University and the Authors. *\n * Portions copyright (c) 2020-2022 Advanced Micro Devices, Inc. *\n * Authors: Peter Eastman, Nicholas Curtis *\n * Contributors: *\n@@ -182,6 +182,7 @@ class HipCalcNonbondedForceKernel : public CalcNonbondedForceKernel {\n HipArray pmeDispersionBsplineModuliZ;\n HipArray pmeAtomGridIndex;\n HipArray pmeEnergyBuffer;\n+ HipArray chargeBuffer;\n HipSort* sort;\n Kernel cpuPme;\n PmeIO* pmeio;\n@@ -189,7 +190,7 @@ class HipCalcNonbondedForceKernel : public CalcNonbondedForceKernel {\n hipEvent_t pmeSyncEvent, paramsSyncEvent;\n HipFFT3D* fft;\n HipFFT3D* dispersionFft;\n- hipFunction_t computeParamsKernel, computeExclusionParamsKernel;\n+ hipFunction_t computeParamsKernel, computeExclusionParamsKernel, computePlasmaCorrectionKernel;\n hipFunction_t ewaldSumsKernel;\n hipFunction_t ewaldForcesKernel;\n hipFunction_t pmeGridIndexKernel;\n@@ -208,7 +209,7 @@ class HipCalcNonbondedForceKernel : public CalcNonbondedForceKernel {\n std::vector<std::string> paramNames;\n std::vector<double> paramValues;\n std::map<int, int> exceptionIndex;\n- double ewaldSelfEnergy, dispersionCoefficient, alpha, dispersionAlpha;\n+ double ewaldSelfEnergy, dispersionCoefficient, alpha, dispersionAlpha, totalCharge;\n int interpolateForceThreads;\n int gridSizeX, gridSizeY, gridSizeZ;\n int dispersionGridSizeX, dispersionGridSizeY, dispersionGridSizeZ;\ndiff --git a/platforms/hip/src/HipKernels.cpp b/platforms/hip/src/HipKernels.cpp\nindex d1297048e6..c8a4bd1162 100644\n--- a/platforms/hip/src/HipKernels.cpp\n+++ b/platforms/hip/src/HipKernels.cpp\n@@ -361,8 +361,11 @@ void HipCalcNonbondedForceKernel::initialize(const System& system, const Nonbond\n dispersionCoefficient = 0.0;\n alpha = 0;\n ewaldSelfEnergy = 0.0;\n+ totalCharge = 0.0;\n map<string, string> paramsDefines;\n paramsDefines[\"ONE_4PI_EPS0\"] = cu.doubleToString(ONE_4PI_EPS0);\n+ paramsDefines[\"EPSILON0\"] = cu.doubleToString(EPSILON0);\n+ paramsDefines[\"WORK_GROUP_SIZE\"] = cu.intToString(HipContext::ThreadBlockSize);\n hasOffsets = (force.getNumParticleParameterOffsets() > 0 || force.getNumExceptionParameterOffsets() > 0);\n if (hasOffsets)\n paramsDefines[\"HAS_OFFSETS\"] = \"1\";\n@@ -385,8 +388,10 @@ void HipCalcNonbondedForceKernel::initialize(const System& system, const Nonbond\n if (cu.getContextIndex() == 0) {\n paramsDefines[\"INCLUDE_EWALD\"] = \"1\";\n paramsDefines[\"EWALD_SELF_ENERGY_SCALE\"] = cu.doubleToString(ONE_4PI_EPS0*alpha/sqrt(M_PI));\n- for (int i = 0; i < numParticles; i++)\n+ for (int i = 0; i < numParticles; i++) {\n ewaldSelfEnergy -= baseParticleParamVec[i].x*baseParticleParamVec[i].x*ONE_4PI_EPS0*alpha/sqrt(M_PI);\n+ totalCharge += baseParticleParamVec[i].x;\n+ }\n \n // Create the reciprocal space kernels.\n \n@@ -438,8 +443,10 @@ void HipCalcNonbondedForceKernel::initialize(const System& system, const Nonbond\n if (cu.getContextIndex() == 0) {\n paramsDefines[\"INCLUDE_EWALD\"] = \"1\";\n paramsDefines[\"EWALD_SELF_ENERGY_SCALE\"] = cu.doubleToString(ONE_4PI_EPS0*alpha/sqrt(M_PI));\n- for (int i = 0; i < numParticles; i++)\n+ for (int i = 0; i < numParticles; i++) {\n ewaldSelfEnergy -= baseParticleParamVec[i].x*baseParticleParamVec[i].x*ONE_4PI_EPS0*alpha/sqrt(M_PI);\n+ totalCharge += baseParticleParamVec[i].x;\n+ }\n if (doLJPME) {\n paramsDefines[\"INCLUDE_LJPME\"] = \"1\";\n paramsDefines[\"LJPME_SELF_ENERGY_SCALE\"] = cu.doubleToString(pow(dispersionAlpha, 6)/3.0);\n@@ -791,6 +798,8 @@ void HipCalcNonbondedForceKernel::initialize(const System& system, const Nonbond\n globalParams.initialize(cu, max((int) paramValues.size(), 1), cu.getUseDoublePrecision() ? sizeof(double) : sizeof(float), \"globalParams\");\n if (paramValues.size() > 0)\n globalParams.upload(paramValues, true);\n+ chargeBuffer.initialize(cu, cu.getNumThreadBlocks(), cu.getUseDoublePrecision() ? sizeof(double) : sizeof(float), \"chargeBuffer\");\n+ cu.clearBuffer(chargeBuffer);\n recomputeParams = true;\n \n // Initialize the kernel for updating parameters.\n@@ -798,6 +807,7 @@ void HipCalcNonbondedForceKernel::initialize(const System& system, const Nonbond\n hipModule_t module = cu.createModule(CommonKernelSources::nonbondedParameters, paramsDefines);\n computeParamsKernel = cu.getKernel(module, \"computeParameters\");\n computeExclusionParamsKernel = cu.getKernel(module, \"computeExclusionParameters\");\n+ computePlasmaCorrectionKernel = cu.getKernel(module, \"computePlasmaCorrection\");\n info = new ForceInfo(force);\n cu.addForce(info);\n }\n@@ -818,13 +828,18 @@ double HipCalcNonbondedForceKernel::execute(ContextImpl& context, bool includeFo\n recomputeParams = true;\n globalParams.upload(paramValues, true);\n }\n- double energy = (includeReciprocal ? ewaldSelfEnergy : 0.0);\n+ double energy = 0.0;\n+ if (includeReciprocal && (pmeGrid1.isInitialized() || cosSinSums.isInitialized())) {\n+ double4 boxSize = cu.getPeriodicBoxSize();\n+ double volume = boxSize.x*boxSize.y*boxSize.z;\n+ energy = ewaldSelfEnergy - totalCharge*totalCharge/(8*EPSILON0*volume*alpha*alpha);\n+ }\n if (recomputeParams || hasOffsets) {\n int computeSelfEnergy = (includeEnergy && includeReciprocal);\n- int numAtoms = cu.getPaddedNumAtoms();\n+ int numAtoms = cu.getNumAtoms();\n vector<void*> paramsArgs = {&cu.getEnergyBuffer().getDevicePointer(), &computeSelfEnergy, &globalParams.getDevicePointer(), &numAtoms,\n &baseParticleParams.getDevicePointer(), &cu.getPosq().getDevicePointer(), &charges.getDevicePointer(), &sigmaEpsilon.getDevicePointer(),\n- &particleParamOffsets.getDevicePointer(), &particleOffsetIndices.getDevicePointer()};\n+ &particleParamOffsets.getDevicePointer(), &particleOffsetIndices.getDevicePointer(), &chargeBuffer.getDevicePointer()};\n int numExceptions;\n if (exceptionParams.isInitialized()) {\n numExceptions = exceptionParams.getSize();\n@@ -845,8 +860,27 @@ double HipCalcNonbondedForceKernel::execute(ContextImpl& context, bool includeFo\n hipEventRecord(paramsSyncEvent, cu.getCurrentStream());\n hipStreamWaitEvent(pmeStream, paramsSyncEvent, 0);\n }\n- if (hasOffsets)\n- energy = 0.0; // The Ewald self energy was computed in the kernel.\n+ if (hasOffsets) {\n+ // The Ewald self energy was computed in the kernel.\n+\n+ energy = 0.0;\n+ if (pmeGrid1.isInitialized() || cosSinSums.isInitialized()) {\n+ // Invoke a kernel to compute the correction for the neutralizing plasma.\n+\n+ double4 boxSize = cu.getPeriodicBoxSize();\n+ if (cu.getUseDoublePrecision()) {\n+ double volume = boxSize.x*boxSize.y*boxSize.z;\n+ vector<void*> correctionArgs = {&chargeBuffer.getDevicePointer(), &cu.getEnergyBuffer().getDevicePointer(), &alpha, &volume};\n+ cu.executeKernel(computePlasmaCorrectionKernel, &correctionArgs[0], HipContext::ThreadBlockSize, HipContext::ThreadBlockSize);\n+ }\n+ else {\n+ float alphaFloat = (float) alpha;\n+ float volume = boxSize.x*boxSize.y*boxSize.z;\n+ vector<void*> correctionArgs = {&chargeBuffer.getDevicePointer(), &cu.getEnergyBuffer().getDevicePointer(), &alphaFloat, &volume};\n+ cu.executeKernel(computePlasmaCorrectionKernel, &correctionArgs[0], HipContext::ThreadBlockSize, HipContext::ThreadBlockSize);\n+ }\n+ }\n+ }\n recomputeParams = false;\n }\n \n@@ -1051,10 +1085,12 @@ void HipCalcNonbondedForceKernel::copyParametersToContext(ContextImpl& context,\n // Compute the self energy.\n \n ewaldSelfEnergy = 0.0;\n+ totalCharge = 0.0;\n if (nonbondedMethod == Ewald || nonbondedMethod == PME || nonbondedMethod == LJPME) {\n if (cu.getContextIndex() == 0) {\n for (int i = 0; i < force.getNumParticles(); i++) {\n ewaldSelfEnergy -= baseParticleParamVec[i].x*baseParticleParamVec[i].x*ONE_4PI_EPS0*alpha/sqrt(M_PI);\n+ totalCharge += baseParticleParamVec[i].x;\n if (doLJPME)\n ewaldSelfEnergy += baseParticleParamVec[i].z*pow(baseParticleParamVec[i].y*dispersionAlpha, 6)/3.0;\n }\ndiff --git a/platforms/opencl/include/OpenCLKernels.h b/platforms/opencl/include/OpenCLKernels.h\nindex 286089b9ef..759ae692dd 100644\n--- a/platforms/opencl/include/OpenCLKernels.h\n+++ b/platforms/opencl/include/OpenCLKernels.h\n@@ -9,7 +9,7 @@\n * Biological Structures at Stanford, funded under the NIH Roadmap for *\n * Medical Research, grant U54 GM072970. See https://simtk.org. *\n * *\n- * Portions copyright (c) 2008-2024 Stanford University and the Authors. *\n+ * Portions copyright (c) 2008-2025 Stanford University and the Authors. *\n * Authors: Peter Eastman *\n * Contributors: *\n * *\n@@ -183,6 +183,7 @@ class OpenCLCalcNonbondedForceKernel : public CalcNonbondedForceKernel {\n OpenCLArray pmeAtomRange;\n OpenCLArray pmeAtomGridIndex;\n OpenCLArray pmeEnergyBuffer;\n+ OpenCLArray chargeBuffer;\n OpenCLSort* sort;\n cl::CommandQueue pmeQueue;\n cl::Event pmeSyncEvent;\n@@ -191,7 +192,7 @@ class OpenCLCalcNonbondedForceKernel : public CalcNonbondedForceKernel {\n Kernel cpuPme;\n PmeIO* pmeio;\n SyncQueuePostComputation* syncQueue;\n- cl::Kernel computeParamsKernel, computeExclusionParamsKernel;\n+ cl::Kernel computeParamsKernel, computeExclusionParamsKernel, computePlasmaCorrectionKernel;\n cl::Kernel ewaldSumsKernel;\n cl::Kernel ewaldForcesKernel;\n cl::Kernel pmeAtomRangeKernel;\n@@ -215,7 +216,7 @@ class OpenCLCalcNonbondedForceKernel : public CalcNonbondedForceKernel {\n std::vector<std::string> paramNames;\n std::vector<double> paramValues;\n std::map<int, int> exceptionIndex;\n- double ewaldSelfEnergy, dispersionCoefficient, alpha, dispersionAlpha;\n+ double ewaldSelfEnergy, dispersionCoefficient, alpha, dispersionAlpha, totalCharge;\n int gridSizeX, gridSizeY, gridSizeZ;\n int dispersionGridSizeX, dispersionGridSizeY, dispersionGridSizeZ;\n bool hasCoulomb, hasLJ, usePmeQueue, doLJPME, usePosqCharges, recomputeParams, hasOffsets;\ndiff --git a/platforms/opencl/src/OpenCLKernels.cpp b/platforms/opencl/src/OpenCLKernels.cpp\nindex dd48d6abd2..5d49a08dab 100644\n--- a/platforms/opencl/src/OpenCLKernels.cpp\n+++ b/platforms/opencl/src/OpenCLKernels.cpp\n@@ -370,8 +370,10 @@ void OpenCLCalcNonbondedForceKernel::initialize(const System& system, const Nonb\n dispersionCoefficient = 0.0;\n alpha = 0;\n ewaldSelfEnergy = 0.0;\n+ totalCharge = 0.0;\n map<string, string> paramsDefines;\n paramsDefines[\"ONE_4PI_EPS0\"] = cl.doubleToString(ONE_4PI_EPS0);\n+ paramsDefines[\"EPSILON0\"] = cl.doubleToString(EPSILON0);\n hasOffsets = (force.getNumParticleParameterOffsets() > 0 || force.getNumExceptionParameterOffsets() > 0);\n if (hasOffsets)\n paramsDefines[\"HAS_OFFSETS\"] = \"1\";\n@@ -394,8 +396,10 @@ void OpenCLCalcNonbondedForceKernel::initialize(const System& system, const Nonb\n if (cl.getContextIndex() == 0) {\n paramsDefines[\"INCLUDE_EWALD\"] = \"1\";\n paramsDefines[\"EWALD_SELF_ENERGY_SCALE\"] = cl.doubleToString(ONE_4PI_EPS0*alpha/sqrt(M_PI));\n- for (int i = 0; i < numParticles; i++)\n+ for (int i = 0; i < numParticles; i++) {\n ewaldSelfEnergy -= baseParticleParamVec[i].x*baseParticleParamVec[i].x*ONE_4PI_EPS0*alpha/sqrt(M_PI);\n+ totalCharge += baseParticleParamVec[i].x;\n+ }\n \n // Create the reciprocal space kernels.\n \n@@ -446,8 +450,10 @@ void OpenCLCalcNonbondedForceKernel::initialize(const System& system, const Nonb\n if (cl.getContextIndex() == 0) {\n paramsDefines[\"INCLUDE_EWALD\"] = \"1\";\n paramsDefines[\"EWALD_SELF_ENERGY_SCALE\"] = cl.doubleToString(ONE_4PI_EPS0*alpha/sqrt(M_PI));\n- for (int i = 0; i < numParticles; i++)\n+ for (int i = 0; i < numParticles; i++) {\n ewaldSelfEnergy -= baseParticleParamVec[i].x*baseParticleParamVec[i].x*ONE_4PI_EPS0*alpha/sqrt(M_PI);\n+ totalCharge += baseParticleParamVec[i].x;\n+ }\n if (doLJPME) {\n paramsDefines[\"INCLUDE_LJPME\"] = \"1\";\n paramsDefines[\"LJPME_SELF_ENERGY_SCALE\"] = cl.doubleToString(pow(dispersionAlpha, 6)/3.0);\n@@ -766,6 +772,8 @@ void OpenCLCalcNonbondedForceKernel::initialize(const System& system, const Nonb\n globalParams.initialize(cl, max((int) paramValues.size(), 1), cl.getUseDoublePrecision() ? sizeof(double) : sizeof(float), \"globalParams\");\n if (paramValues.size() > 0)\n globalParams.upload(paramValues, true);\n+ chargeBuffer.initialize(cl, cl.getNumThreadBlocks(), cl.getUseDoublePrecision() ? sizeof(double) : sizeof(float), \"chargeBuffer\");\n+ cl.clearBuffer(chargeBuffer);\n recomputeParams = true;\n \n // Initialize the kernel for updating parameters.\n@@ -773,6 +781,7 @@ void OpenCLCalcNonbondedForceKernel::initialize(const System& system, const Nonb\n cl::Program program = cl.createProgram(CommonKernelSources::nonbondedParameters, paramsDefines);\n computeParamsKernel = cl::Kernel(program, \"computeParameters\");\n computeExclusionParamsKernel = cl::Kernel(program, \"computeExclusionParameters\");\n+ computePlasmaCorrectionKernel = cl::Kernel(program, \"computePlasmaCorrection\");\n info = new ForceInfo(0, force);\n cl.addForce(info);\n }\n@@ -792,6 +801,7 @@ double OpenCLCalcNonbondedForceKernel::execute(ContextImpl& context, bool includ\n computeParamsKernel.setArg<cl::Buffer>(index++, sigmaEpsilon.getDeviceBuffer());\n computeParamsKernel.setArg<cl::Buffer>(index++, particleParamOffsets.getDeviceBuffer());\n computeParamsKernel.setArg<cl::Buffer>(index++, particleOffsetIndices.getDeviceBuffer());\n+ computeParamsKernel.setArg<cl::Buffer>(index++, chargeBuffer.getDeviceBuffer());\n if (exceptionParams.isInitialized()) {\n computeParamsKernel.setArg<cl_int>(index++, exceptionParams.getSize());\n computeParamsKernel.setArg<cl::Buffer>(index++, baseExceptionParams.getDeviceBuffer());\n@@ -807,6 +817,12 @@ double OpenCLCalcNonbondedForceKernel::execute(ContextImpl& context, bool includ\n computeExclusionParamsKernel.setArg<cl::Buffer>(4, exclusionAtoms.getDeviceBuffer());\n computeExclusionParamsKernel.setArg<cl::Buffer>(5, exclusionParams.getDeviceBuffer());\n }\n+ computePlasmaCorrectionKernel.setArg<cl::Buffer>(0, chargeBuffer.getDeviceBuffer());\n+ computePlasmaCorrectionKernel.setArg<cl::Buffer>(1, cl.getEnergyBuffer().getDeviceBuffer());\n+ if (cl.getUseDoublePrecision())\n+ computePlasmaCorrectionKernel.setArg<double>(2, alpha);\n+ else\n+ computePlasmaCorrectionKernel.setArg<float>(2, alpha);\n if (cosSinSums.isInitialized()) {\n ewaldSumsKernel.setArg<cl::Buffer>(0, cl.getEnergyBuffer().getDeviceBuffer());\n ewaldSumsKernel.setArg<cl::Buffer>(1, cl.getPosq().getDeviceBuffer());\n@@ -911,10 +927,15 @@ double OpenCLCalcNonbondedForceKernel::execute(ContextImpl& context, bool includ\n recomputeParams = true;\n globalParams.upload(paramValues, true);\n }\n- double energy = (includeReciprocal ? ewaldSelfEnergy : 0.0);\n+ double energy = 0.0;\n+ if (includeReciprocal && (pmeGrid1.isInitialized() || cosSinSums.isInitialized())) {\n+ mm_double4 boxSize = cl.getPeriodicBoxSizeDouble();\n+ double volume = boxSize.x*boxSize.y*boxSize.z;\n+ energy = ewaldSelfEnergy - totalCharge*totalCharge/(8*EPSILON0*volume*alpha*alpha);\n+ }\n if (recomputeParams || hasOffsets) {\n computeParamsKernel.setArg<cl_int>(1, includeEnergy && includeReciprocal);\n- cl.executeKernel(computeParamsKernel, cl.getPaddedNumAtoms());\n+ cl.executeKernel(computeParamsKernel, cl.getNumAtoms());\n if (exclusionParams.isInitialized())\n cl.executeKernel(computeExclusionParamsKernel, exclusionParams.getSize());\n if (usePmeQueue) {\n@@ -922,8 +943,22 @@ double OpenCLCalcNonbondedForceKernel::execute(ContextImpl& context, bool includ\n cl.getQueue().enqueueMarkerWithWaitList(NULL, &events[0]);\n pmeQueue.enqueueBarrierWithWaitList(&events);\n }\n- if (hasOffsets)\n- energy = 0.0; // The Ewald self energy was computed in the kernel.\n+ if (hasOffsets) {\n+ // The Ewald self energy was computed in the kernel.\n+\n+ energy = 0.0;\n+ if (pmeGrid1.isInitialized() || cosSinSums.isInitialized()) {\n+ // Invoke a kernel to compute the correction for the neutralizing plasma.\n+\n+ mm_double4 boxSize = cl.getPeriodicBoxSizeDouble();\n+ double volume = boxSize.x*boxSize.y*boxSize.z;\n+ if (cl.getUseDoublePrecision())\n+ computePlasmaCorrectionKernel.setArg<double>(3, volume);\n+ else\n+ computePlasmaCorrectionKernel.setArg<float>(3, volume);\n+ cl.executeKernel(computePlasmaCorrectionKernel, OpenCLContext::ThreadBlockSize, OpenCLContext::ThreadBlockSize);\n+ }\n+ }\n recomputeParams = false;\n }\n \n@@ -1163,10 +1198,12 @@ void OpenCLCalcNonbondedForceKernel::copyParametersToContext(ContextImpl& contex\n // Compute the self energy.\n \n ewaldSelfEnergy = 0.0;\n+ totalCharge = 0.0;\n if (nonbondedMethod == Ewald || nonbondedMethod == PME || nonbondedMethod == LJPME) {\n if (cl.getContextIndex() == 0) {\n for (int i = 0; i < force.getNumParticles(); i++) {\n ewaldSelfEnergy -= baseParticleParamVec[i].x*baseParticleParamVec[i].x*ONE_4PI_EPS0*alpha/sqrt(M_PI);\n+ totalCharge += baseParticleParamVec[i].x;\n if (doLJPME)\n ewaldSelfEnergy += baseParticleParamVec[i].z*pow(baseParticleParamVec[i].y*dispersionAlpha, 6)/3.0;\n }\ndiff --git a/platforms/reference/src/SimTKReference/ReferenceLJCoulombIxn.cpp b/platforms/reference/src/SimTKReference/ReferenceLJCoulombIxn.cpp\nindex 86cab2ec15..e9a79915b2 100644\n--- a/platforms/reference/src/SimTKReference/ReferenceLJCoulombIxn.cpp\n+++ b/platforms/reference/src/SimTKReference/ReferenceLJCoulombIxn.cpp\n@@ -218,14 +218,19 @@ void ReferenceLJCoulombIxn::calculateEwaldIxn(int numberOfAtoms, vector<Vec3>& a\n // **************************************************************************************\n \n if (includeReciprocal) {\n+ double totalCharge = 0.0;\n for (int atomID = 0; atomID < numberOfAtoms; atomID++) {\n- double selfEwaldEnergy = ONE_4PI_EPS0*atomParameters[atomID][QIndex]*atomParameters[atomID][QIndex] * alphaEwald/SQRT_PI;\n- if(ljpme) {\n+ double selfEwaldEnergy = ONE_4PI_EPS0*atomParameters[atomID][QIndex]*atomParameters[atomID][QIndex] * alphaEwald/SQRT_PI;\n+ totalCharge += atomParameters[atomID][QIndex];\n+ if (ljpme) {\n // Dispersion self term\n selfEwaldEnergy -= pow(alphaDispersionEwald, 6.0) * 64.0*pow(atomParameters[atomID][SigIndex], 6.0) * pow(atomParameters[atomID][EpsIndex], 2.0) / 12.0;\n }\n- totalSelfEwaldEnergy -= selfEwaldEnergy;\n+ totalSelfEwaldEnergy -= selfEwaldEnergy;\n }\n+ // Correction for the neutralizing plasma.\n+ double volume = periodicBoxVectors[0][0] * periodicBoxVectors[1][1] * periodicBoxVectors[2][2];\n+ totalSelfEwaldEnergy -= totalCharge*totalCharge/(8*EPSILON0*volume*alphaEwald*alphaEwald);\n }\n \n if (totalEnergy) {\n"}, "test": {"test_patch": "diff --git a/tests/TestEwald.h b/tests/TestEwald.h\nindex 2b81f46201..fe03dff65e 100644\n--- a/tests/TestEwald.h\n+++ b/tests/TestEwald.h\n@@ -6,7 +6,7 @@\n * Biological Structures at Stanford, funded under the NIH Roadmap for *\n * Medical Research, grant U54 GM072970. See https://simtk.org. *\n * *\n- * Portions copyright (c) 2008-2015 Stanford University and the Authors. *\n+ * Portions copyright (c) 2008-2025 Stanford University and the Authors. *\n * Authors: Peter Eastman *\n * Contributors: *\n * *\n@@ -425,6 +425,51 @@ void testPMEParameters() {\n ASSERT(fabs((energy1-energy2)/energy1) > 1e-5);\n }\n \n+void testNeutralizingPlasmaCorrection(NonbondedForce::NonbondedMethod method, bool includeOffset) {\n+ // Verify that the energy of a system with nonzero charge doesn't depend on alpha.\n+\n+ System system;\n+ NonbondedForce* force = new NonbondedForce();\n+ force->setNonbondedMethod(method);\n+ system.addForce(force);\n+ for (int i = 0; i < 2; i++) {\n+ system.addParticle(1.0);\n+ force->addParticle(1.0, 0.3, 1.0);\n+ }\n+ if (includeOffset) {\n+ force->addGlobalParameter(\"a\", 0.1);\n+ force->addParticleParameterOffset(\"a\", 0, 1.0, 0.1, 0.1);\n+ }\n+ vector<Vec3> positions(2);\n+ positions[0] = Vec3();\n+ positions[1] = Vec3(0.3, 0.4, 0.0);\n+\n+ // Compute the energy.\n+\n+ VerletIntegrator integrator(0.01);\n+ Context context(system, integrator, platform);\n+ context.setPositions(positions);\n+ double energy1 = context.getState(State::Energy).getPotentialEnergy();\n+\n+ // Change the cutoff distance, which will change alpha, and see if the energy is the same.\n+\n+ force->setCutoffDistance(0.7);\n+ context.reinitialize(true);\n+ double energy2 = context.getState(State::Energy).getPotentialEnergy();\n+ ASSERT_EQUAL_TOL(energy1, energy2, 1e-4);\n+\n+ // Try changing a particle charge with updateParametersInContext() and make sure the\n+ // energy changes by the correct amount.\n+\n+ force->setParticleParameters(0, 2.0, 0.3, 1.0);\n+ force->updateParametersInContext(context);\n+ double energy3 = context.getState(State::Energy).getPotentialEnergy();\n+ force->setCutoffDistance(1.0);\n+ context.reinitialize(true);\n+ double energy4 = context.getState(State::Energy).getPotentialEnergy();\n+ ASSERT_EQUAL_TOL(energy3, energy4, 1e-4);\n+}\n+\n void runPlatformTests();\n \n int main(int argc, char* argv[]) {\n@@ -438,6 +483,11 @@ int main(int argc, char* argv[]) {\n testErrorTolerance(NonbondedForce::Ewald);\n testErrorTolerance(NonbondedForce::PME);\n testPMEParameters();\n+ for (bool offset : {false, true}) {\n+ testNeutralizingPlasmaCorrection(NonbondedForce::Ewald, offset);\n+ testNeutralizingPlasmaCorrection(NonbondedForce::PME, offset);\n+ testNeutralizingPlasmaCorrection(NonbondedForce::LJPME, offset);\n+ }\n runPlatformTests();\n }\n catch(const exception& e) {\n", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}103{"question_id": "MSB_openmm_openmm_pr4920", "question_type": "multi_swe_bench", "description": "Neutralizing plasma self energy for AMOEBA (openmm/openmm#4920)", "content": {"org": "openmm", "repo": "openmm", "pr_number": 4920, "issue_title": "Neutralizing plasma self energy for AMOEBA", "issue_body": "See #4907. This adds the same correction for AmoebaMultipoleForce and HippoNonbondedForce.", "base_commit": "dd320bcf06b4fff6db0f00798e0fce3a2f1e1f7e", "resolved_issues": [{"number": null, "title": "Neutralizing plasma self energy for AMOEBA", "body": "### Issue Description\n\n**Problem:**\nThe energy calculations for systems using the AMOEBA and HIPPO force fields do not account for the correction due to the neutralizing plasma in periodic boundary conditions. This omission can lead to inaccuracies in the computed potential energy for systems with a net nonzero charge, particularly when using Particle Mesh Ewald (PME) for long-range electrostatics.\n\n**Expected Behavior:**\nThe energy calculations should include a correction term for the neutralizing plasma when PME is used. This ensures that the potential energy of systems with a net charge is accurately computed, consistent with the physical behavior of periodic systems. The energy should also remain consistent across different PME parameters, such as the alpha value, for systems with nonzero net charge.\n\n## IMPORTANT INSTRUCTIONS\n\n1. If you edit a python file, you MUST run 'make PythonInstall' inside the build directory\n2. If you edit a c++ file, you MUST run 'make -j4 && make install\" inside the build directory"}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/openmm_m_openmm:pr-4920", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/plugins/amoeba/platforms/common/src/AmoebaCommonKernels.cpp b/plugins/amoeba/platforms/common/src/AmoebaCommonKernels.cpp\nindex a718c9c286..b0f8373efd 100644\n--- a/plugins/amoeba/platforms/common/src/AmoebaCommonKernels.cpp\n+++ b/plugins/amoeba/platforms/common/src/AmoebaCommonKernels.cpp\n@@ -233,11 +233,13 @@ void CommonCalcAmoebaMultipoleForceKernel::initialize(const System& system, cons\n vector<float> localDipolesVec;\n vector<float> localQuadrupolesVec;\n vector<mm_int4> multipoleParticlesVec;\n+ totalCharge = 0.0;\n for (int i = 0; i < numMultipoles; i++) {\n double charge, thole, damping, polarity;\n int axisType, atomX, atomY, atomZ;\n vector<double> dipole, quadrupole;\n force.getMultipoleParameters(i, charge, dipole, quadrupole, axisType, atomZ, atomX, atomY, thole, damping, polarity);\n+ totalCharge += charge;\n if (cc.getUseDoublePrecision())\n posqd[i] = mm_double4(0, 0, 0, charge);\n else\n@@ -1228,7 +1230,17 @@ double CommonCalcAmoebaMultipoleForceKernel::execute(ContextImpl& context, bool\n \n cc.getPosq().copyTo(lastPositions);\n multipolesAreValid = true;\n- return 0.0;\n+\n+ // Correction for the neutralizing plasma.\n+\n+ if (usePME) {\n+ Vec3 a, b, c;\n+ cc.getPeriodicBoxVectors(a, b, c);\n+ double volume = a[0] * b[1] * c[2];\n+ return -totalCharge*totalCharge/(8*EPSILON0*volume*pmeAlpha*pmeAlpha);\n+ }\n+ else\n+ return 0.0;\n }\n \n void CommonCalcAmoebaMultipoleForceKernel::computeInducedField() {\n@@ -1664,11 +1676,13 @@ void CommonCalcAmoebaMultipoleForceKernel::copyParametersToContext(ContextImpl&\n vector<float> localDipolesVec;\n vector<float> localQuadrupolesVec;\n vector<mm_int4> multipoleParticlesVec;\n+ totalCharge = 0.0;\n for (int i = 0; i < force.getNumMultipoles(); i++) {\n double charge, thole, damping, polarity;\n int axisType, atomX, atomY, atomZ;\n vector<double> dipole, quadrupole;\n force.getMultipoleParameters(i, charge, dipole, quadrupole, axisType, atomZ, atomX, atomY, thole, damping, polarity);\n+ totalCharge += charge;\n if (cc.getUseDoublePrecision())\n posqd[i].w = charge;\n else\n@@ -2424,12 +2438,14 @@ void CommonCalcHippoNonbondedForceKernel::initialize(const System& system, const\n vector<double> localDipolesVec, localQuadrupolesVec;\n vector<mm_int4> multipoleParticlesVec;\n vector<vector<int> > exclusions(numParticles);\n+ totalCharge = 0.0;\n for (int i = 0; i < numParticles; i++) {\n double charge, coreCharge, alpha, epsilon, damping, c6, pauliK, pauliQ, pauliAlpha, polarizability;\n int axisType, atomX, atomY, atomZ;\n vector<double> dipole, quadrupole;\n force.getParticleParameters(i, charge, dipole, quadrupole, coreCharge, alpha, epsilon, damping, c6, pauliK, pauliQ, pauliAlpha,\n polarizability, axisType, atomZ, atomX, atomY);\n+ totalCharge += charge;\n coreChargeVec.push_back(coreCharge);\n valenceChargeVec.push_back(charge-coreCharge);\n alphaVec.push_back(alpha);\n@@ -3378,7 +3394,17 @@ double CommonCalcHippoNonbondedForceKernel::execute(ContextImpl& context, bool i\n \n cc.getPosq().copyTo(lastPositions);\n multipolesAreValid = true;\n- return 0.0;\n+\n+ // Correction for the neutralizing plasma.\n+\n+ if (usePME) {\n+ Vec3 a, b, c;\n+ cc.getPeriodicBoxVectors(a, b, c);\n+ double volume = a[0] * b[1] * c[2];\n+ return -totalCharge*totalCharge/(8*EPSILON0*volume*pmeAlpha*pmeAlpha);\n+ }\n+ else\n+ return 0.0;\n }\n \n void CommonCalcHippoNonbondedForceKernel::computeInducedField(int optOrder) {\n@@ -3513,12 +3539,14 @@ void CommonCalcHippoNonbondedForceKernel::copyParametersToContext(ContextImpl& c\n vector<double> coreChargeVec, valenceChargeVec, alphaVec, epsilonVec, dampingVec, c6Vec, pauliKVec, pauliQVec, pauliAlphaVec, polarizabilityVec;\n vector<double> localDipolesVec, localQuadrupolesVec;\n vector<mm_int4> multipoleParticlesVec;\n+ totalCharge = 0.0;\n for (int i = 0; i < numParticles; i++) {\n double charge, coreCharge, alpha, epsilon, damping, c6, pauliK, pauliQ, pauliAlpha, polarizability;\n int axisType, atomX, atomY, atomZ;\n vector<double> dipole, quadrupole;\n force.getParticleParameters(i, charge, dipole, quadrupole, coreCharge, alpha, epsilon, damping, c6, pauliK, pauliQ, pauliAlpha,\n polarizability, axisType, atomZ, atomX, atomY);\n+ totalCharge += charge;\n coreChargeVec.push_back(coreCharge);\n valenceChargeVec.push_back(charge-coreCharge);\n alphaVec.push_back(alpha);\ndiff --git a/plugins/amoeba/platforms/common/src/AmoebaCommonKernels.h b/plugins/amoeba/platforms/common/src/AmoebaCommonKernels.h\nindex ecf63cac83..f359013695 100644\n--- a/plugins/amoeba/platforms/common/src/AmoebaCommonKernels.h\n+++ b/plugins/amoeba/platforms/common/src/AmoebaCommonKernels.h\n@@ -168,7 +168,7 @@ class CommonCalcAmoebaMultipoleForceKernel : public CalcAmoebaMultipoleForceKern\n int numMultipoles, maxInducedIterations, maxExtrapolationOrder;\n int fixedFieldThreads, inducedFieldThreads, electrostaticsThreads;\n int gridSizeX, gridSizeY, gridSizeZ;\n- double pmeAlpha, inducedEpsilon;\n+ double pmeAlpha, inducedEpsilon, totalCharge;\n bool usePME, hasQuadrupoles, hasInitializedScaleFactors, multipolesAreValid, hasCreatedEvent;\n AmoebaMultipoleForce::PolarizationType polarizationType;\n ComputeContext& cc;\n@@ -507,7 +507,7 @@ class CommonCalcHippoNonbondedForceKernel : public CalcHippoNonbondedForceKernel\n int numParticles, maxExtrapolationOrder, maxTiles, fieldThreadBlockSize;\n int gridSizeX, gridSizeY, gridSizeZ;\n int dispersionGridSizeX, dispersionGridSizeY, dispersionGridSizeZ;\n- double pmeAlpha, dpmeAlpha, cutoff;\n+ double pmeAlpha, dpmeAlpha, cutoff, totalCharge;\n bool usePME, hasInitializedKernels, multipolesAreValid;\n std::vector<double> extrapolationCoefficients;\n ComputeContext& cc;\ndiff --git a/plugins/amoeba/platforms/reference/src/SimTKReference/AmoebaReferenceHippoNonbondedForce.cpp b/plugins/amoeba/platforms/reference/src/SimTKReference/AmoebaReferenceHippoNonbondedForce.cpp\nindex a4cd0e8113..2f53d854d2 100644\n--- a/plugins/amoeba/platforms/reference/src/SimTKReference/AmoebaReferenceHippoNonbondedForce.cpp\n+++ b/plugins/amoeba/platforms/reference/src/SimTKReference/AmoebaReferenceHippoNonbondedForce.cpp\n@@ -1,5 +1,5 @@\n \n-/* Portions copyright (c) 2006-2022 Stanford University and Simbios.\n+/* Portions copyright (c) 2006-2025 Stanford University and Simbios.\n * Contributors: Pande Group\n *\n * Permission is hereby granted, free of charge, to any person obtaining\n@@ -2503,9 +2503,11 @@ double AmoebaReferencePmeHippoNonbondedForce::calculatePmeSelfEnergy(const vecto\n double dii = 0.0;\n double qii = 0.0;\n double c6ii = 0.0;\n+ double totalCharge = 0.0;\n for (int i = 0; i < _numParticles; i++) {\n const MultipoleParticleData& particleI = particleData[i];\n double charge = particleI.coreCharge + particleI.valenceCharge;\n+ totalCharge += charge;\n cii += charge*charge;\n dii += particleI.dipole.dot(particleI.dipole);\n qii += particleI.quadrupole[QXX]*particleI.quadrupole[QXX] +\n@@ -2519,7 +2521,11 @@ double AmoebaReferencePmeHippoNonbondedForce::calculatePmeSelfEnergy(const vecto\n double term = 2*_alphaEwald*_alphaEwald;\n double fterm = -_electric*_alphaEwald/SQRT_PI;\n double alpha3 = _dalphaEwald*_dalphaEwald*_dalphaEwald;\n- return fterm*(cii + term*(dii/3+2*term*qii/5)) + alpha3*alpha3*c6ii/12;\n+ double energy = fterm*(cii + term*(dii/3+2*term*qii/5)) + alpha3*alpha3*c6ii/12;\n+ // Correction for the neutralizing plasma.\n+ double volume = _periodicBoxVectors[0][0] * _periodicBoxVectors[1][1] * _periodicBoxVectors[2][2];\n+ energy -= totalCharge*totalCharge/(8*EPSILON0*volume*_alphaEwald*_alphaEwald);\n+ return energy;\n }\n \n void AmoebaReferencePmeHippoNonbondedForce::calculatePmeSelfTorque(const vector<MultipoleParticleData>& particleData,\ndiff --git a/plugins/amoeba/platforms/reference/src/SimTKReference/AmoebaReferenceMultipoleForce.cpp b/plugins/amoeba/platforms/reference/src/SimTKReference/AmoebaReferenceMultipoleForce.cpp\nindex c4515e573a..2a5e1e13a4 100644\n--- a/plugins/amoeba/platforms/reference/src/SimTKReference/AmoebaReferenceMultipoleForce.cpp\n+++ b/plugins/amoeba/platforms/reference/src/SimTKReference/AmoebaReferenceMultipoleForce.cpp\n@@ -1,5 +1,5 @@\n \n-/* Portions copyright (c) 2006-222 Stanford University and Simbios.\n+/* Portions copyright (c) 2006-2025 Stanford University and Simbios.\n * Contributors: Pande Group\n *\n * Permission is hereby granted, free of charge, to any person obtaining\n@@ -6370,10 +6370,12 @@ double AmoebaReferencePmeMultipoleForce::calculatePmeSelfEnergy(const vector<Mul\n double cii = 0.0;\n double dii = 0.0;\n double qii = 0.0;\n+ double totalCharge = 0.0;\n for (unsigned int ii = 0; ii < _numParticles; ii++) {\n \n const MultipoleParticleData& particleI = particleData[ii];\n \n+ totalCharge += particleI.charge;\n cii += particleI.charge*particleI.charge;\n \n Vec3 dipole(particleI.sphericalDipole[1], particleI.sphericalDipole[2], particleI.sphericalDipole[0]);\n@@ -6389,6 +6391,9 @@ double AmoebaReferencePmeMultipoleForce::calculatePmeSelfEnergy(const vector<Mul\n double a2 = _alphaEwald * _alphaEwald;\n double a4 = a2*a2;\n double energy = prefac*(cii + twoThirds*a2*dii + fourOverFifteen*a4*qii);\n+ // Correction for the neutralizing plasma.\n+ double volume = _periodicBoxVectors[0][0] * _periodicBoxVectors[1][1] * _periodicBoxVectors[2][2];\n+ energy -= totalCharge*totalCharge/(8*EPSILON0*volume*_alphaEwald*_alphaEwald);\n return energy;\n }\n \n"}, "test": {"test_patch": "diff --git a/plugins/amoeba/tests/TestAmoebaMultipoleForce.h b/plugins/amoeba/tests/TestAmoebaMultipoleForce.h\nindex eade4a17d0..c4a7b4c21f 100644\n--- a/plugins/amoeba/tests/TestAmoebaMultipoleForce.h\n+++ b/plugins/amoeba/tests/TestAmoebaMultipoleForce.h\n@@ -6,7 +6,7 @@\n * Biological Structures at Stanford, funded under the NIH Roadmap for *\n * Medical Research, grant U54 GM072970. See https://simtk.org. *\n * *\n- * Portions copyright (c) 2008-2012 Stanford University and the Authors. *\n+ * Portions copyright (c) 2008-2025 Stanford University and the Authors. *\n * Authors: Mark Friedrichs *\n * Contributors: *\n * *\n@@ -3261,6 +3261,48 @@ void testZOnly() {\n ASSERT_EQUAL_TOL(state2.getPotentialEnergy(), state3.getPotentialEnergy()+norm*delta, 1e-3)\n }\n \n+void testNeutralizingPlasmaCorrection() {\n+ // Verify that the energy of a system with nonzero charge doesn't depend on alpha.\n+\n+ System system;\n+ AmoebaMultipoleForce* force = new AmoebaMultipoleForce();\n+ force->setNonbondedMethod(AmoebaMultipoleForce::PME);\n+ system.addForce(force);\n+ vector<double> d(3, -.0), q(9, 0.0);\n+ for (int i = 0; i < 2; i++) {\n+ system.addParticle(1.0);\n+ force->addMultipole(1.0, d, q, AmoebaMultipoleForce::NoAxisType, 0, 0, 0, 0.39, 0.33, 0.001);\n+ }\n+ vector<Vec3> positions(2);\n+ positions[0] = Vec3();\n+ positions[1] = Vec3(0.3, 0.4, 0.0);\n+\n+ // Compute the energy.\n+\n+ LangevinIntegrator integrator(0.0, 0.1, 0.01);\n+ Context context(system, integrator, platform);\n+ context.setPositions(positions);\n+ double energy1 = context.getState(State::Energy).getPotentialEnergy();\n+\n+ // Change the cutoff distance, which will change alpha, and see if the energy is the same.\n+\n+ force->setCutoffDistance(0.7);\n+ context.reinitialize(true);\n+ double energy2 = context.getState(State::Energy).getPotentialEnergy();\n+ ASSERT_EQUAL_TOL(energy1, energy2, 1e-4);\n+\n+ // Try changing a particle charge with updateParametersInContext() and make sure the\n+ // energy changes by the correct amount.\n+\n+ force->setMultipoleParameters(0, 2.0, d, q, AmoebaMultipoleForce::NoAxisType, 0, 0, 0, 0.39, 0.33, 0.001);\n+ force->updateParametersInContext(context);\n+ double energy3 = context.getState(State::Energy).getPotentialEnergy();\n+ force->setCutoffDistance(1.0);\n+ context.reinitialize(true);\n+ double energy4 = context.getState(State::Energy).getPotentialEnergy();\n+ ASSERT_EQUAL_TOL(energy3, energy4, 1e-4);\n+}\n+\n void setupKernels(int argc, char* argv[]);\n void runPlatformTests();\n \n@@ -3318,6 +3360,7 @@ int main(int argc, char* argv[]) {\n // test the ZOnly axis type.\n \n testZOnly();\n+ testNeutralizingPlasmaCorrection();\n \n runPlatformTests();\n }\ndiff --git a/plugins/amoeba/tests/TestHippoNonbondedForce.h b/plugins/amoeba/tests/TestHippoNonbondedForce.h\nindex 28f69d7265..31c2ad9652 100644\n--- a/plugins/amoeba/tests/TestHippoNonbondedForce.h\n+++ b/plugins/amoeba/tests/TestHippoNonbondedForce.h\n@@ -6,7 +6,7 @@\n * Biological Structures at Stanford, funded under the NIH Roadmap for *\n * Medical Research, grant U54 GM072970. See https://simtk.org. *\n * *\n- * Portions copyright (c) 2019 Stanford University and the Authors. *\n+ * Portions copyright (c) 2019-2025 Stanford University and the Authors. *\n * Authors: Peter Eastman *\n * Contributors: *\n * *\n@@ -1542,6 +1542,48 @@ void testChangingParameters() {\n ASSERT_EQUAL_VEC(state2.getForces()[i], state3.getForces()[i], 1e-5);\n }\n \n+void testNeutralizingPlasmaCorrection() {\n+ // Verify that the energy of a system with nonzero charge doesn't depend on alpha.\n+\n+ System system;\n+ HippoNonbondedForce* force = new HippoNonbondedForce();\n+ force->setNonbondedMethod(HippoNonbondedForce::PME);\n+ system.addForce(force);\n+ vector<double> d(3, 0.0), q(9, 0.0);\n+ for (int i = 0; i < 2; i++) {\n+ system.addParticle(1.0);\n+ force->addParticle(1.0, d, q, 6.0, 50.0, 5000.0, 400.0, 0.04, 1.5, -2.4233, 40.0, 0.001, HippoNonbondedForce::NoAxisType, -1, -1, -1);\n+ }\n+ vector<Vec3> positions(2);\n+ positions[0] = Vec3();\n+ positions[1] = Vec3(0.3, 0.4, 0.0);\n+\n+ // Compute the energy.\n+\n+ VerletIntegrator integrator(0.001);\n+ Context context(system, integrator, platform);\n+ context.setPositions(positions);\n+ double energy1 = context.getState(State::Energy).getPotentialEnergy();\n+\n+ // Change the cutoff distance, which will change alpha, and see if the energy is the same.\n+\n+ force->setCutoffDistance(0.7);\n+ context.reinitialize(true);\n+ double energy2 = context.getState(State::Energy).getPotentialEnergy();\n+ ASSERT_EQUAL_TOL(energy1, energy2, 1e-4);\n+\n+ // Try changing a particle charge with updateParametersInContext() and make sure the\n+ // energy changes by the correct amount.\n+\n+ force->setParticleParameters(0, 2.0, d, q, 6.0, 50.0, 5000.0, 400.0, 0.04, 1.5, -2.4233, 40.0, 0.001, HippoNonbondedForce::NoAxisType, -1, -1, -1);\n+ force->updateParametersInContext(context);\n+ double energy3 = context.getState(State::Energy).getPotentialEnergy();\n+ force->setCutoffDistance(1.0);\n+ context.reinitialize(true);\n+ double energy4 = context.getState(State::Energy).getPotentialEnergy();\n+ ASSERT_EQUAL_TOL(energy3, energy4, 1e-4);\n+}\n+\n int main(int argc, char* argv[]) {\n try {\n setupKernels(argc, argv);\n@@ -1562,6 +1604,7 @@ int main(int argc, char* argv[]) {\n testWaterDimer();\n testWaterBox();\n testChangingParameters();\n+ testNeutralizingPlasmaCorrection();\n }\n catch (const std::exception& e) {\n std::cout << \"exception: \" << e.what() << std::endl;\n", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}104{"question_id": "MSB_openmm_openmm_pr4956", "question_type": "multi_swe_bench", "description": "Handle relative include paths from force fields in data directories (openmm/openmm#4956)", "content": {"org": "openmm", "repo": "openmm", "pr_number": 4956, "issue_title": "Handle relative include paths from force fields in data directories", "issue_body": "For `<Include>` in force field files, the user manual states that\r\n\r\n> The file attribute gives the path of the file to include. It may be relative either to the directory containing the parent XML file (the one with the <Include> tag) or the OpenMM data directory (the one containing built in force fields).\r\n\r\nHowever, this doesn't work if the including file is in a subdirectory of a data directory and points to the included file in that subdirectory using a relative path, *e.g.*, if `data/a/b.xml` includes `data/a/c.xml`, `<Include file=\"c.xml\" />` doesn't work, so `<Include file=\"a/c.xml\" />` is needed. It seems like the test https://github.com/openmm/openmm/blob/2b8ad70394f38d296497215da757aa31ac36b87b/wrappers/python/openmm/app/forcefield.py#L283-L285 doesn't work here since `parentDir` is that of `file`, but if the including file is in a data directory, `f` ends up being its path instead.\r\n\r\nThis change ensures that `file` will contain a resolved path to the force field if it is in some data directory, so the relative path lookup will find files correctly. This fixes an issue with some openmmforcefields files that rely on it working. It also allows more cleanly reporting errors in loading force fields in data directories, since we don't actually always control such files (any package can register an entry point).\r\n\r\nDoes this behavior make sense? If not, and includes from data directories aren't supposed to be able to do relative path lookups, I will make changes in openmmforcefields instead. (This shouldn't affect any of the OpenMM-distributed force fields.)", "base_commit": "2b8ad70394f38d296497215da757aa31ac36b87b", "resolved_issues": [{"number": null, "title": "Handle relative include paths from force fields in data directories", "body": "### Issue Description\n\n**Problem:** \nRelative file paths specified in `<Include>` tags within force field XML files do not behave as described in the user manual when the including file is located in a subdirectory of a registered data directory. Specifically, if a file in a subdirectory includes another file from the same subdirectory using a relative path, the inclusion fails unless the path is explicitly adjusted to include the subdirectory. This discrepancy causes issues for force field files that rely on relative path functionality as documented.\n\n**Expected Behavior:** \nRelative paths in `<Include>` tags should work as described in the user manual, allowing files in subdirectories of data directories to include other files from the same subdirectory without requiring explicit adjustments to the path. This ensures consistency with the documented behavior and improves compatibility with force field files that depend on this functionality.\n\n## IMPORTANT INSTRUCTIONS\n\n1. If you edit a python file, you MUST run 'make PythonInstall' inside the build directory\n2. If you edit a c++ file, you MUST run 'make -j4 && make install\" inside the build directory"}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/openmm_m_openmm:pr-4956", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/wrappers/python/openmm/app/forcefield.py b/wrappers/python/openmm/app/forcefield.py\nindex e470a5fd5f..9a7a7021af 100644\n--- a/wrappers/python/openmm/app/forcefield.py\n+++ b/wrappers/python/openmm/app/forcefield.py\n@@ -245,29 +245,24 @@ def loadFile(self, files, resname_prefix=''):\n i = 0\n while i < len(files):\n file = files[i]\n- tree = None\n- try:\n- # this handles either filenames or open file-like objects\n- tree = etree.parse(file)\n- except IOError:\n+ # this handles either filenames or open file-like objects\n+ if isinstance(file, str) and not os.path.isfile(file):\n for dataDir in _getDataDirectories():\n f = os.path.join(dataDir, file)\n if os.path.isfile(f):\n- tree = etree.parse(f)\n+ file = f\n break\n+ try:\n+ tree = etree.parse(file)\n+ except FileNotFoundError:\n+ raise ValueError('Could not locate file \"%s\"' % file)\n except Exception as e:\n # Fail with an error message about which file could not be read.\n- # TODO: Also handle case where fallback to 'data' directory encounters problems,\n- # but this is much less worrisome because we control those files.\n- msg = str(e) + '\\n'\n if hasattr(file, 'name'):\n filename = file.name\n else:\n filename = str(file)\n- msg += \"ForceField.loadFile() encountered an error reading file '%s'\\n\" % filename\n- raise Exception(msg)\n- if tree is None:\n- raise ValueError('Could not locate file \"%s\"' % file)\n+ raise Exception('ForceField.loadFile() encountered an error reading file \"%s\": %s' % (filename, e))\n \n trees.append(tree)\n i += 1\n"}, "test": {"test_patch": "diff --git a/wrappers/python/tests/TestForceField.py b/wrappers/python/tests/TestForceField.py\nindex 009811807f..fe32e92def 100644\n--- a/wrappers/python/tests/TestForceField.py\n+++ b/wrappers/python/tests/TestForceField.py\n@@ -6,6 +6,8 @@\n import openmm.app.element as elem\n import openmm.app.forcefield as forcefield\n import math\n+import shutil\n+import tempfile\n import textwrap\n try:\n from cStringIO import StringIO\n@@ -1254,6 +1256,23 @@ def test_Includes(self):\n self.assertTrue('spce-O' in forcefield._atomTypes)\n self.assertTrue('HOH' in forcefield._templates)\n \n+ def test_IncludesFromDataDirectory(self):\n+ \"\"\"Test relative include paths from subdirectories of the data directory.\"\"\"\n+\n+ oldDataDirs = forcefield._dataDirectories\n+ try:\n+ with tempfile.TemporaryDirectory() as tempDataDir:\n+ forcefield._dataDirectories = forcefield._getDataDirectories() + [tempDataDir]\n+ os.mkdir(os.path.join(tempDataDir, 'subdir'))\n+ for testFileName in ['ff_with_includes.xml', 'test_amber_ff.xml']:\n+ shutil.copyfile(os.path.join('systems', testFileName), os.path.join(tempDataDir, 'subdir', testFileName))\n+ ff = ForceField(os.path.join('subdir', 'ff_with_includes.xml'))\n+ self.assertTrue(len(ff._atomTypes) > 10)\n+ self.assertTrue('spce-O' in ff._atomTypes)\n+ self.assertTrue('HOH' in ff._templates)\n+ finally:\n+ forcefield._dataDirectories = oldDataDirs\n+\n def test_ImpropersOrdering(self):\n \"\"\"Test correctness of the ordering of atom indexes in improper torsions\n and the torsion.ordering parameter.\n", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}105{"question_id": "MSB_openmm_openmm_pr4980", "question_type": "multi_swe_bench", "description": "Fixed bug in computing pressure (openmm/openmm#4980)", "content": {"org": "openmm", "repo": "openmm", "pr_number": 4980, "issue_title": "Fixed bug in computing pressure", "issue_body": "This fixes a bug that caused `computeCurrentPressure()` to return an incorrect value. The tests were passing only because they happened to set all particle masses to 1. See https://github.com/openmm/openmm/discussions/4926#discussioncomment-13503249.", "base_commit": "643473cee91fbf8e232d485012f7b8cf13d68829", "resolved_issues": [{"number": null, "title": "Fixed bug in computing pressure", "body": "The `computeCurrentPressure()` function was returning incorrect pressure values due to an error in how molecular velocities were calculated. This issue was not detected by existing tests because they used a simplified setup where all particle masses were set to 1, masking the problem. \n\nThe expected behavior is that the pressure calculation should correctly account for the masses of particles in the system, ensuring accurate results regardless of the mass distribution. This is critical for simulations involving systems with varying particle masses, where accurate pressure computation is essential for reliable results.\n\n## IMPORTANT INSTRUCTIONS\n\n1. If you edit a python file, you MUST run 'make PythonInstall' inside the build directory\n2. If you edit a c++ file, you MUST run 'make -j4 && make install\" inside the build directory"}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/openmm_m_openmm:pr-4980", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/platforms/common/src/kernels/monteCarloBarostat.cc b/platforms/common/src/kernels/monteCarloBarostat.cc\nindex 2d6493fe52..12c739d892 100644\n--- a/platforms/common/src/kernels/monteCarloBarostat.cc\n+++ b/platforms/common/src/kernels/monteCarloBarostat.cc\n@@ -79,7 +79,7 @@ KERNEL void computeMolecularKineticEnergy(int numMolecules, GLOBAL mixed4* RESTR\n molVel += mass*trimTo3(v);\n molMass += mass;\n }\n- molVel *= RECIP((mixed) numAtoms);\n+ molVel *= RECIP((mixed) molMass);\n #if COMPONENTS == 1\n ke[0] += 0.5f*molMass*dot(molVel, molVel);\n #else\ndiff --git a/platforms/reference/src/SimTKReference/ReferenceMonteCarloBarostat.cpp b/platforms/reference/src/SimTKReference/ReferenceMonteCarloBarostat.cpp\nindex 3d3e536221..ba80d297ff 100644\n--- a/platforms/reference/src/SimTKReference/ReferenceMonteCarloBarostat.cpp\n+++ b/platforms/reference/src/SimTKReference/ReferenceMonteCarloBarostat.cpp\n@@ -133,7 +133,7 @@ void ReferenceMonteCarloBarostat::computeMolecularKineticEnergy(const vector<Vec\n molVel += masses[atom]*velocities[atom];\n molMass += masses[atom];\n }\n- molVel /= molecule.size();\n+ molVel /= molMass;\n if (components == 1)\n ke[0] += 0.5*molMass*molVel.dot(molVel);\n else {\n"}, "test": {"test_patch": "diff --git a/tests/TestMonteCarloBarostat.h b/tests/TestMonteCarloBarostat.h\nindex 2f23f19d65..9f317c94b1 100644\n--- a/tests/TestMonteCarloBarostat.h\n+++ b/tests/TestMonteCarloBarostat.h\n@@ -167,8 +167,8 @@ void testMolecularGas() {\n init_gen_rand(0, sfmt);\n for (int i = 0; i < numMolecules; ++i) {\n system.addParticle(1.0);\n- system.addParticle(1.0);\n- system.addParticle(1.0);\n+ system.addParticle(2.0);\n+ system.addParticle(3.0);\n Vec3 pos(initialLength*genrand_real2(sfmt), 0.5*initialLength*genrand_real2(sfmt), 2*initialLength*genrand_real2(sfmt));\n bonds->addBond(positions.size(), positions.size()+1, 0.1, 10.0);\n system.addConstraint(positions.size(), positions.size()+2, 0.1);\n", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}106{"question_id": "MSB_openmm_openmm_pr4989", "question_type": "multi_swe_bench", "description": "Update CHARMM36 2024 and add water models (openmm/openmm#4989)", "content": {"org": "openmm", "repo": "openmm", "pr_number": 4989, "issue_title": "Update CHARMM36 2024 and add water models", "issue_body": "Include fixes and improvements from openmm/openmmforcefields#386, and add solvent XML files specifically intended for use with the 2024 release of CHARMM36 (differences include new NBFIXes and changed NBFIX parameters). Fixes #4976.", "base_commit": "ebde66b47b90bd0828044e7e282d3466325df66e", "resolved_issues": [{"number": 4976, "title": "Issues with the new charmm36_2024.xml and water", "body": "I am getting an error adding water using the new charm forcefield. \nI modified the modeller to print out the script that causes the issue of self._scripts (code attached), hope that helps to fix it.\n\n```\npdb = PDBFile(pdb_file)\nforcefield = ForceField('charmm36_2024.xml',\"charmm36/water.xml\")\nmodeller = Modeller(fixer.topology, fixer.positions)\nmodeller.addSolvent(forcefield, padding=5.0*unit.nanometers)\n```\n\n[script_causing_the_crash.txt](https://github.com/user-attachments/files/20847095/script_causing_the_crash.txt)\n\nTraceback (most recent call last):\n File \"/home/ubuntu/test.py\", line 34, in <module>\n modeller.addSolvent(forcefield, padding=5.0*unit.nanometers)\n File \"/venv/lib/python3.11/site-packages/openmm/app/modeller.py\", line 662, in addSolvent\n self._addIons(forcefield, numTotalWaters, waterPos, positiveIon=positiveIon, negativeIon=negativeIon, ionicStrength=ionicStrength, neutralize=neutralize, residueTemplates=newResidueTemplates)\n File \"/venv/lib/python3.11/site-packages/openmm/app/modeller.py\", line 311, in _addIons\n system = forcefield.createSystem(self.topology, residueTemplates=residueTemplates)\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"/venv/lib/python3.11/site-packages/openmm/app/forcefield.py\", line 1433, in createSystem\n exec(script, locals())\n File \"<string>\", line 49, in <module>\nIndexError: list index out of range\n\n\n## IMPORTANT INSTRUCTIONS\n\n1. If you edit a python file, you MUST run 'make PythonInstall' inside the build directory\n2. If you edit a c++ file, you MUST run 'make -j4 && make install\" inside the build directory"}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/openmm_m_openmm:pr-4989", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/docs-source/usersguide/application/02_running_sims.rst b/docs-source/usersguide/application/02_running_sims.rst\nindex 06414e3550..1485c9f8a8 100644\n--- a/docs-source/usersguide/application/02_running_sims.rst\n+++ b/docs-source/usersguide/application/02_running_sims.rst\n@@ -590,31 +590,31 @@ for full references).\n \n .. tabularcolumns:: |l|L|\n \n-================================= ============================================\n-File Parameters\n-================================= ============================================\n-:file:`charmm36_2024.xml` Protein, DNA, RNA, lipids, carbohydrates, and small molecules\n-:file:`charmm36/water.xml` Default CHARMM water model (a modified version of TIP3P\\ :cite:`Jorgensen1983`) and ions\n-:file:`charmm36/spce.xml` SPC/E water model\\ :cite:`Berendsen1987` and ions\n-:file:`charmm36/tip3p-pme-b.xml` TIP3P-PME-B water model\\ :cite:`Price2004` and ions\n-:file:`charmm36/tip3p-pme-f.xml` TIP3P-PME-F water model\\ :cite:`Price2004` and ions\n-:file:`charmm36/tip4pew.xml` TIP4P-Ew water model\\ :cite:`Horn2004` and ions\n-:file:`charmm36/tip4p2005.xml` TIP4P-2005 water model\\ :cite:`Abascal2005` and ions\n-:file:`charmm36/tip5p.xml` TIP5P water model\\ :cite:`Mahoney2000` and ions\n-:file:`charmm36/tip5pew.xml` TIP5P-Ew water model\\ :cite:`Rick2004` and ions\n-================================= ============================================\n+===================================== =========================================\n+File Parameters\n+===================================== =========================================\n+:file:`charmm36_2024.xml` Protein, DNA, RNA, lipids, carbohydrates, and small molecules\n+:file:`charmm36_2024/water.xml` Default CHARMM water model (a modified version of TIP3P\\ :cite:`Jorgensen1983`) and ions\n+:file:`charmm36_2024/spce.xml` SPC/E water model\\ :cite:`Berendsen1987` and ions\n+:file:`charmm36_2024/tip3p-pme-b.xml` TIP3P-PME-B water model\\ :cite:`Price2004` and ions\n+:file:`charmm36_2024/tip3p-pme-f.xml` TIP3P-PME-F water model\\ :cite:`Price2004` and ions\n+:file:`charmm36_2024/tip4pew.xml` TIP4P-Ew water model\\ :cite:`Horn2004` and ions\n+:file:`charmm36_2024/tip4p2005.xml` TIP4P-2005 water model\\ :cite:`Abascal2005` and ions\n+:file:`charmm36_2024/tip5p.xml` TIP5P water model\\ :cite:`Mahoney2000` and ions\n+:file:`charmm36_2024/tip5pew.xml` TIP5P-Ew water model\\ :cite:`Rick2004` and ions\n+===================================== =========================================\n \n The file :file:`charmm36_2024.xml` bundles everything but the water and ions into a single\n file. In most cases, you can simply include that file, plus one of the water models,\n-such as :file:`charmm36/water.xml`, which specifies the default CHARMM water model\n+such as :file:`charmm36_2024/water.xml`, which specifies the default CHARMM water model\n (a modified version of TIP3P\\ :cite:`Jorgensen1983`) and ions:\n ::\n \n- forcefield = ForceField('charmm36_2024.xml', 'charmm36/water.xml')\n+ forcefield = ForceField('charmm36_2024.xml', 'charmm36_2024/water.xml')\n \n-.. tip:: The solvent model XML files included under the :file:`charmm36/` directory\n+.. tip:: The solvent model XML files included under the :file:`charmm36_2024/` directory\n include both water *and* ions compatible with that water model, so if you\n- mistakenly specify :file:`tip3p.xml` instead of :file:`charmm36/water.xml`,\n+ mistakenly specify :file:`tip3p.xml` instead of :file:`charmm36_2024/water.xml`,\n you run the risk of having :class:`ForceField` raise an exception due to\n missing parameters for ions in your system.\n \n@@ -641,6 +641,13 @@ such as :file:`charmm36/water.xml`, which specifies the default CHARMM water mod\n `CHARMM-GUI <http://charmm-gui.org/>`_, it's easiest to load\n the PSF file directly, as discussed in Section :numref:`using-charmm-files`.\n \n+.. warning:: Solvent model files in the :file:`charmm36_2024/` directory are\n+ designed for use with :file:`charmm36_2024.xml`, and those in the\n+ :file:`charmm36/` directory are designed for use with an older\n+ release of the CHARMM force field found in :file:`charmm36.xml` and\n+ described below. Be sure to load the correct version of the\n+ solvent model you wish to use along with the main force field file.\n+\n .. warning:: Some residues and patches are not included in this port of\n CHARMM36, either due to a lack of support for certain CHARMM\n features in `ParmEd <https://github.com/parmed/parmed>`_, or\n@@ -764,6 +771,7 @@ File Force Field\n :code:`amber03.xml` Amber03\\ :cite:`Duan2003`\n :code:`amber10.xml` Amber10 (documented in the AmberTools_ manual as `ff10`)\n :code:`charmm36.xml` July 2017 release of the CHARMM36 force field without CHARMM36m protein parameters\n+:code:`charmm36/*.xml` Parameters for water models and ions specifically for use with :code:`charmm36.xml`\n :code:`charmm_polar_2013.xml` 2013 version of the CHARMM polarizable force field\\ :cite:`Lopes2013`\n :code:`charmm_polar_2019.xml` 2019 version of the CHARMM polarizable force field\\ :cite:`Lopes2013`\n ============================= ==================================================================================\ndiff --git a/wrappers/python/openmm/app/data/charmm36.xml b/wrappers/python/openmm/app/data/charmm36.xml\nindex 99085f10ce..d98e27011c 100644\n--- a/wrappers/python/openmm/app/data/charmm36.xml\n+++ b/wrappers/python/openmm/app/data/charmm36.xml\n@@ -103763,4 +103763,12 @@\n <NBFixPair epsilon=\"0.8631592000000001\" sigma=\"0.25134925534893393\" type1=\"MG\" type2=\"SO\"/>\n <NBFixPair epsilon=\"0.8414024\" sigma=\"0.25219560913116723\" type1=\"MG\" type2=\"SS1\"/>\n </LennardJonesForce>\n+ <InitializationScript>\n+EXPECTED_VERSION = \"charmm36\"\n+if hasattr(self, \"_charmm_ff_version\"):\n+ if self._charmm_ff_version != EXPECTED_VERSION:\n+ raise RuntimeError(f\"CHARMM force field versions ({self._charmm_ff_version} and {EXPECTED_VERSION}) incompatible\")\n+else:\n+ self._charmm_ff_version = EXPECTED_VERSION\n+ </InitializationScript>\n </ForceField>\ndiff --git a/wrappers/python/openmm/app/data/charmm36/spce.xml b/wrappers/python/openmm/app/data/charmm36/spce.xml\nindex 475dca6ffb..7160a613ab 100644\n--- a/wrappers/python/openmm/app/data/charmm36/spce.xml\n+++ b/wrappers/python/openmm/app/data/charmm36/spce.xml\n@@ -121,4 +121,12 @@\n <NBFixPair epsilon=\"0.31388368000000005\" sigma=\"0.28419669108676826\" type1=\"OC2D2\" type2=\"SOD\"/>\n <NBFixPair epsilon=\"0.31388368000000005\" sigma=\"0.28419669108676826\" type1=\"OG2D2\" type2=\"SOD\"/>\n </LennardJonesForce>\n+ <InitializationScript>\n+EXPECTED_VERSION = \"charmm36\"\n+if hasattr(self, \"_charmm_ff_version\"):\n+ if self._charmm_ff_version != EXPECTED_VERSION:\n+ raise RuntimeError(f\"CHARMM force field versions ({self._charmm_ff_version} and {EXPECTED_VERSION}) incompatible\")\n+else:\n+ self._charmm_ff_version = EXPECTED_VERSION\n+ </InitializationScript>\n </ForceField>\ndiff --git a/wrappers/python/openmm/app/data/charmm36/tip3p-pme-b.xml b/wrappers/python/openmm/app/data/charmm36/tip3p-pme-b.xml\nindex 64e993e9fd..eeeef0cc8b 100644\n--- a/wrappers/python/openmm/app/data/charmm36/tip3p-pme-b.xml\n+++ b/wrappers/python/openmm/app/data/charmm36/tip3p-pme-b.xml\n@@ -121,4 +121,12 @@\n <NBFixPair epsilon=\"0.31388368000000005\" sigma=\"0.28419669108676826\" type1=\"OC2D2\" type2=\"SOD\"/>\n <NBFixPair epsilon=\"0.31388368000000005\" sigma=\"0.28419669108676826\" type1=\"OG2D2\" type2=\"SOD\"/>\n </LennardJonesForce>\n+ <InitializationScript>\n+EXPECTED_VERSION = \"charmm36\"\n+if hasattr(self, \"_charmm_ff_version\"):\n+ if self._charmm_ff_version != EXPECTED_VERSION:\n+ raise RuntimeError(f\"CHARMM force field versions ({self._charmm_ff_version} and {EXPECTED_VERSION}) incompatible\")\n+else:\n+ self._charmm_ff_version = EXPECTED_VERSION\n+ </InitializationScript>\n </ForceField>\ndiff --git a/wrappers/python/openmm/app/data/charmm36/tip3p-pme-f.xml b/wrappers/python/openmm/app/data/charmm36/tip3p-pme-f.xml\nindex ed4083e6d8..b6cdbdb0b6 100644\n--- a/wrappers/python/openmm/app/data/charmm36/tip3p-pme-f.xml\n+++ b/wrappers/python/openmm/app/data/charmm36/tip3p-pme-f.xml\n@@ -121,4 +121,12 @@\n <NBFixPair epsilon=\"0.31388368000000005\" sigma=\"0.28419669108676826\" type1=\"OC2D2\" type2=\"SOD\"/>\n <NBFixPair epsilon=\"0.31388368000000005\" sigma=\"0.28419669108676826\" type1=\"OG2D2\" type2=\"SOD\"/>\n </LennardJonesForce>\n+ <InitializationScript>\n+EXPECTED_VERSION = \"charmm36\"\n+if hasattr(self, \"_charmm_ff_version\"):\n+ if self._charmm_ff_version != EXPECTED_VERSION:\n+ raise RuntimeError(f\"CHARMM force field versions ({self._charmm_ff_version} and {EXPECTED_VERSION}) incompatible\")\n+else:\n+ self._charmm_ff_version = EXPECTED_VERSION\n+ </InitializationScript>\n </ForceField>\ndiff --git a/wrappers/python/openmm/app/data/charmm36/tip4p2005.xml b/wrappers/python/openmm/app/data/charmm36/tip4p2005.xml\nindex 3c9a57eded..6fe5f095a1 100644\n--- a/wrappers/python/openmm/app/data/charmm36/tip4p2005.xml\n+++ b/wrappers/python/openmm/app/data/charmm36/tip4p2005.xml\n@@ -127,4 +127,12 @@\n <NBFixPair epsilon=\"0.31388368000000005\" sigma=\"0.28419669108676826\" type1=\"OC2D2\" type2=\"SOD\"/>\n <NBFixPair epsilon=\"0.31388368000000005\" sigma=\"0.28419669108676826\" type1=\"OG2D2\" type2=\"SOD\"/>\n </LennardJonesForce>\n+ <InitializationScript>\n+EXPECTED_VERSION = \"charmm36\"\n+if hasattr(self, \"_charmm_ff_version\"):\n+ if self._charmm_ff_version != EXPECTED_VERSION:\n+ raise RuntimeError(f\"CHARMM force field versions ({self._charmm_ff_version} and {EXPECTED_VERSION}) incompatible\")\n+else:\n+ self._charmm_ff_version = EXPECTED_VERSION\n+ </InitializationScript>\n </ForceField>\ndiff --git a/wrappers/python/openmm/app/data/charmm36/tip4pew.xml b/wrappers/python/openmm/app/data/charmm36/tip4pew.xml\nindex 1c6a1f08ff..026353640f 100644\n--- a/wrappers/python/openmm/app/data/charmm36/tip4pew.xml\n+++ b/wrappers/python/openmm/app/data/charmm36/tip4pew.xml\n@@ -127,4 +127,12 @@\n <NBFixPair epsilon=\"0.31388368000000005\" sigma=\"0.28419669108676826\" type1=\"OC2D2\" type2=\"SOD\"/>\n <NBFixPair epsilon=\"0.31388368000000005\" sigma=\"0.28419669108676826\" type1=\"OG2D2\" type2=\"SOD\"/>\n </LennardJonesForce>\n+ <InitializationScript>\n+EXPECTED_VERSION = \"charmm36\"\n+if hasattr(self, \"_charmm_ff_version\"):\n+ if self._charmm_ff_version != EXPECTED_VERSION:\n+ raise RuntimeError(f\"CHARMM force field versions ({self._charmm_ff_version} and {EXPECTED_VERSION}) incompatible\")\n+else:\n+ self._charmm_ff_version = EXPECTED_VERSION\n+ </InitializationScript>\n </ForceField>\ndiff --git a/wrappers/python/openmm/app/data/charmm36/tip5p.xml b/wrappers/python/openmm/app/data/charmm36/tip5p.xml\nindex 57f09d98fe..e13fdeead6 100644\n--- a/wrappers/python/openmm/app/data/charmm36/tip5p.xml\n+++ b/wrappers/python/openmm/app/data/charmm36/tip5p.xml\n@@ -129,4 +129,12 @@\n <NBFixPair epsilon=\"0.31388368000000005\" sigma=\"0.28419669108676826\" type1=\"OC2D2\" type2=\"SOD\"/>\n <NBFixPair epsilon=\"0.31388368000000005\" sigma=\"0.28419669108676826\" type1=\"OG2D2\" type2=\"SOD\"/>\n </LennardJonesForce>\n+ <InitializationScript>\n+EXPECTED_VERSION = \"charmm36\"\n+if hasattr(self, \"_charmm_ff_version\"):\n+ if self._charmm_ff_version != EXPECTED_VERSION:\n+ raise RuntimeError(f\"CHARMM force field versions ({self._charmm_ff_version} and {EXPECTED_VERSION}) incompatible\")\n+else:\n+ self._charmm_ff_version = EXPECTED_VERSION\n+ </InitializationScript>\n </ForceField>\ndiff --git a/wrappers/python/openmm/app/data/charmm36/tip5pew.xml b/wrappers/python/openmm/app/data/charmm36/tip5pew.xml\nindex 7696af7450..d21cc20e40 100644\n--- a/wrappers/python/openmm/app/data/charmm36/tip5pew.xml\n+++ b/wrappers/python/openmm/app/data/charmm36/tip5pew.xml\n@@ -129,4 +129,12 @@\n <NBFixPair epsilon=\"0.31388368000000005\" sigma=\"0.28419669108676826\" type1=\"OC2D2\" type2=\"SOD\"/>\n <NBFixPair epsilon=\"0.31388368000000005\" sigma=\"0.28419669108676826\" type1=\"OG2D2\" type2=\"SOD\"/>\n </LennardJonesForce>\n+ <InitializationScript>\n+EXPECTED_VERSION = \"charmm36\"\n+if hasattr(self, \"_charmm_ff_version\"):\n+ if self._charmm_ff_version != EXPECTED_VERSION:\n+ raise RuntimeError(f\"CHARMM force field versions ({self._charmm_ff_version} and {EXPECTED_VERSION}) incompatible\")\n+else:\n+ self._charmm_ff_version = EXPECTED_VERSION\n+ </InitializationScript>\n </ForceField>\ndiff --git a/wrappers/python/openmm/app/data/charmm36/water.xml b/wrappers/python/openmm/app/data/charmm36/water.xml\nindex 73828b013c..1310ee096c 100644\n--- a/wrappers/python/openmm/app/data/charmm36/water.xml\n+++ b/wrappers/python/openmm/app/data/charmm36/water.xml\n@@ -127,4 +127,12 @@\n <NBFixPair epsilon=\"0.31388368000000005\" sigma=\"0.2877602859593296\" type1=\"OG2D2\" type2=\"SOD\"/>\n <NBFixPair epsilon=\"0.31388368000000005\" sigma=\"0.28152399493234725\" type1=\"OG2P1\" type2=\"SOD\"/>\n </LennardJonesForce>\n+ <InitializationScript>\n+EXPECTED_VERSION = \"charmm36\"\n+if hasattr(self, \"_charmm_ff_version\"):\n+ if self._charmm_ff_version != EXPECTED_VERSION:\n+ raise RuntimeError(f\"CHARMM force field versions ({self._charmm_ff_version} and {EXPECTED_VERSION}) incompatible\")\n+else:\n+ self._charmm_ff_version = EXPECTED_VERSION\n+ </InitializationScript>\n </ForceField>\ndiff --git a/wrappers/python/openmm/app/data/charmm36_2024.xml b/wrappers/python/openmm/app/data/charmm36_2024.xml\nindex e4d3f4f6ea..e8a09317b6 100644\n--- a/wrappers/python/openmm/app/data/charmm36_2024.xml\n+++ b/wrappers/python/openmm/app/data/charmm36_2024.xml\n@@ -1,6 +1,6 @@\n <ForceField>\n <Info>\n- <DateGenerated>2025-05-02</DateGenerated>\n+ <DateGenerated>2025-06-23</DateGenerated>\n <Source Source=\"toppar/top_all36_prot.rtf\" md5hash=\"4e53dc8450d0533691e95e37c2648d20\" sourcePackage=\"charmm36\" sourcePackageVersion=\"toppar_c36_jul24.tgz\">toppar/top_all36_prot.rtf</Source>\n <Source Source=\"toppar/par_all36m_prot.prm\" md5hash=\"ff62b63c74f62fde2e1a458c0eaa29c9\" sourcePackage=\"charmm36\" sourcePackageVersion=\"toppar_c36_jul24.tgz\">toppar/par_all36m_prot.prm</Source>\n <Source Source=\"toppar/top_all36_na.rtf\" md5hash=\"ffd9d681ff73591157e2458e336ab4a3\" sourcePackage=\"charmm36\" sourcePackageVersion=\"toppar_c36_jul24.tgz\">toppar/top_all36_na.rtf</Source>\n@@ -60776,183 +60776,6 @@\n <Type class=\"HAL3\" element=\"H\" mass=\"1.008\" name=\"LPC14-H14X\" />\n <Type class=\"HAL3\" element=\"H\" mass=\"1.008\" name=\"LPC14-H14Y\" />\n <Type class=\"HAL3\" element=\"H\" mass=\"1.008\" name=\"LPC14-H14Z\" />\n- <Type class=\"SL\" element=\"S\" mass=\"32.06\" name=\"SB3-10-S\" />\n- <Type class=\"OSL\" element=\"O\" mass=\"15.9994\" name=\"SB3-10-O1\" />\n- <Type class=\"OSL\" element=\"O\" mass=\"15.9994\" name=\"SB3-10-O2\" />\n- <Type class=\"OSL\" element=\"O\" mass=\"15.9994\" name=\"SB3-10-O3\" />\n- <Type class=\"CTL2\" element=\"C\" mass=\"12.011\" name=\"SB3-10-C25\" />\n- <Type class=\"HAL2\" element=\"H\" mass=\"1.008\" name=\"SB3-10-H25A\" />\n- <Type class=\"HAL2\" element=\"H\" mass=\"1.008\" name=\"SB3-10-H25B\" />\n- <Type class=\"CTL2\" element=\"C\" mass=\"12.011\" name=\"SB3-10-C24\" />\n- <Type class=\"HAL2\" element=\"H\" mass=\"1.008\" name=\"SB3-10-H24A\" />\n- <Type class=\"HAL2\" element=\"H\" mass=\"1.008\" name=\"SB3-10-H24B\" />\n- <Type class=\"NTL\" element=\"N\" mass=\"14.007\" name=\"SB3-10-N\" />\n- <Type class=\"CTL2\" element=\"C\" mass=\"12.011\" name=\"SB3-10-C1\" />\n- <Type class=\"CTL5\" element=\"C\" mass=\"12.011\" name=\"SB3-10-C21\" />\n- <Type class=\"CTL5\" element=\"C\" mass=\"12.011\" name=\"SB3-10-C22\" />\n- <Type class=\"CTL2\" element=\"C\" mass=\"12.011\" name=\"SB3-10-C23\" />\n- <Type class=\"HL\" element=\"H\" mass=\"1.008\" name=\"SB3-10-H1A\" />\n- <Type class=\"HL\" element=\"H\" mass=\"1.008\" name=\"SB3-10-H1B\" />\n- <Type class=\"HL\" element=\"H\" mass=\"1.008\" name=\"SB3-10-H21A\" />\n- <Type class=\"HL\" element=\"H\" mass=\"1.008\" name=\"SB3-10-H21B\" />\n- <Type class=\"HL\" element=\"H\" mass=\"1.008\" name=\"SB3-10-H21C\" />\n- <Type class=\"HL\" element=\"H\" mass=\"1.008\" name=\"SB3-10-H22A\" />\n- <Type class=\"HL\" element=\"H\" mass=\"1.008\" name=\"SB3-10-H22B\" />\n- <Type class=\"HL\" element=\"H\" mass=\"1.008\" name=\"SB3-10-H22C\" />\n- <Type class=\"HL\" element=\"H\" mass=\"1.008\" name=\"SB3-10-H23A\" />\n- <Type class=\"HL\" element=\"H\" mass=\"1.008\" name=\"SB3-10-H23B\" />\n- <Type class=\"CTL2\" element=\"C\" mass=\"12.011\" name=\"SB3-10-C2\" />\n- <Type class=\"HAL2\" element=\"H\" mass=\"1.008\" name=\"SB3-10-H2A\" />\n- <Type class=\"HAL2\" element=\"H\" mass=\"1.008\" name=\"SB3-10-H2B\" />\n- <Type class=\"CTL2\" element=\"C\" mass=\"12.011\" name=\"SB3-10-C3\" />\n- <Type class=\"HAL2\" element=\"H\" mass=\"1.008\" name=\"SB3-10-H3A\" />\n- <Type class=\"HAL2\" element=\"H\" mass=\"1.008\" name=\"SB3-10-H3B\" />\n- <Type class=\"CTL2\" element=\"C\" mass=\"12.011\" name=\"SB3-10-C4\" />\n- <Type class=\"HAL2\" element=\"H\" mass=\"1.008\" name=\"SB3-10-H4A\" />\n- <Type class=\"HAL2\" element=\"H\" mass=\"1.008\" name=\"SB3-10-H4B\" />\n- <Type class=\"CTL2\" element=\"C\" mass=\"12.011\" name=\"SB3-10-C5\" />\n- <Type class=\"HAL2\" element=\"H\" mass=\"1.008\" name=\"SB3-10-H5A\" />\n- <Type class=\"HAL2\" element=\"H\" mass=\"1.008\" name=\"SB3-10-H5B\" />\n- <Type class=\"CTL2\" element=\"C\" mass=\"12.011\" name=\"SB3-10-C6\" />\n- <Type class=\"HAL2\" element=\"H\" mass=\"1.008\" name=\"SB3-10-H6A\" />\n- <Type class=\"HAL2\" element=\"H\" mass=\"1.008\" name=\"SB3-10-H6B\" />\n- <Type class=\"CTL2\" element=\"C\" mass=\"12.011\" name=\"SB3-10-C7\" />\n- <Type class=\"HAL2\" element=\"H\" mass=\"1.008\" name=\"SB3-10-H7A\" />\n- <Type class=\"HAL2\" element=\"H\" mass=\"1.008\" name=\"SB3-10-H7B\" />\n- <Type class=\"CTL2\" element=\"C\" mass=\"12.011\" name=\"SB3-10-C8\" />\n- <Type class=\"HAL2\" element=\"H\" mass=\"1.008\" name=\"SB3-10-H8A\" />\n- <Type class=\"HAL2\" element=\"H\" mass=\"1.008\" name=\"SB3-10-H8B\" />\n- <Type class=\"CTL2\" element=\"C\" mass=\"12.011\" name=\"SB3-10-C9\" />\n- <Type class=\"HAL2\" element=\"H\" mass=\"1.008\" name=\"SB3-10-H9A\" />\n- <Type class=\"HAL2\" element=\"H\" mass=\"1.008\" name=\"SB3-10-H9B\" />\n- <Type class=\"CTL3\" element=\"C\" mass=\"12.011\" name=\"SB3-10-C10\" />\n- <Type class=\"HAL3\" element=\"H\" mass=\"1.008\" name=\"SB3-10-H10A\" />\n- <Type class=\"HAL3\" element=\"H\" mass=\"1.008\" name=\"SB3-10-H10B\" />\n- <Type class=\"HAL3\" element=\"H\" mass=\"1.008\" name=\"SB3-10-H10C\" />\n- <Type class=\"SL\" element=\"S\" mass=\"32.06\" name=\"SB3-12-S\" />\n- <Type class=\"OSL\" element=\"O\" mass=\"15.9994\" name=\"SB3-12-O1\" />\n- <Type class=\"OSL\" element=\"O\" mass=\"15.9994\" name=\"SB3-12-O2\" />\n- <Type class=\"OSL\" element=\"O\" mass=\"15.9994\" name=\"SB3-12-O3\" />\n- <Type class=\"CTL2\" element=\"C\" mass=\"12.011\" name=\"SB3-12-C25\" />\n- <Type class=\"HAL2\" element=\"H\" mass=\"1.008\" name=\"SB3-12-H25A\" />\n- <Type class=\"HAL2\" element=\"H\" mass=\"1.008\" name=\"SB3-12-H25B\" />\n- <Type class=\"CTL2\" element=\"C\" mass=\"12.011\" name=\"SB3-12-C24\" />\n- <Type class=\"HAL2\" element=\"H\" mass=\"1.008\" name=\"SB3-12-H24A\" />\n- <Type class=\"HAL2\" element=\"H\" mass=\"1.008\" name=\"SB3-12-H24B\" />\n- <Type class=\"NTL\" element=\"N\" mass=\"14.007\" name=\"SB3-12-N\" />\n- <Type class=\"CTL2\" element=\"C\" mass=\"12.011\" name=\"SB3-12-C1\" />\n- <Type class=\"CTL5\" element=\"C\" mass=\"12.011\" name=\"SB3-12-C21\" />\n- <Type class=\"CTL5\" element=\"C\" mass=\"12.011\" name=\"SB3-12-C22\" />\n- <Type class=\"CTL2\" element=\"C\" mass=\"12.011\" name=\"SB3-12-C23\" />\n- <Type class=\"HL\" element=\"H\" mass=\"1.008\" name=\"SB3-12-H1A\" />\n- <Type class=\"HL\" element=\"H\" mass=\"1.008\" name=\"SB3-12-H1B\" />\n- <Type class=\"HL\" element=\"H\" mass=\"1.008\" name=\"SB3-12-H21A\" />\n- <Type class=\"HL\" element=\"H\" mass=\"1.008\" name=\"SB3-12-H21B\" />\n- <Type class=\"HL\" element=\"H\" mass=\"1.008\" name=\"SB3-12-H21C\" />\n- <Type class=\"HL\" element=\"H\" mass=\"1.008\" name=\"SB3-12-H22A\" />\n- <Type class=\"HL\" element=\"H\" mass=\"1.008\" name=\"SB3-12-H22B\" />\n- <Type class=\"HL\" element=\"H\" mass=\"1.008\" name=\"SB3-12-H22C\" />\n- <Type class=\"HL\" element=\"H\" mass=\"1.008\" name=\"SB3-12-H23A\" />\n- <Type class=\"HL\" element=\"H\" mass=\"1.008\" name=\"SB3-12-H23B\" />\n- <Type class=\"CTL2\" element=\"C\" mass=\"12.011\" name=\"SB3-12-C2\" />\n- <Type class=\"HAL2\" element=\"H\" mass=\"1.008\" name=\"SB3-12-H2A\" />\n- <Type class=\"HAL2\" element=\"H\" mass=\"1.008\" name=\"SB3-12-H2B\" />\n- <Type class=\"CTL2\" element=\"C\" mass=\"12.011\" name=\"SB3-12-C3\" />\n- <Type class=\"HAL2\" element=\"H\" mass=\"1.008\" name=\"SB3-12-H3A\" />\n- <Type class=\"HAL2\" element=\"H\" mass=\"1.008\" name=\"SB3-12-H3B\" />\n- <Type class=\"CTL2\" element=\"C\" mass=\"12.011\" name=\"SB3-12-C4\" />\n- <Type class=\"HAL2\" element=\"H\" mass=\"1.008\" name=\"SB3-12-H4A\" />\n- <Type class=\"HAL2\" element=\"H\" mass=\"1.008\" name=\"SB3-12-H4B\" />\n- <Type class=\"CTL2\" element=\"C\" mass=\"12.011\" name=\"SB3-12-C5\" />\n- <Type class=\"HAL2\" element=\"H\" mass=\"1.008\" name=\"SB3-12-H5A\" />\n- <Type class=\"HAL2\" element=\"H\" mass=\"1.008\" name=\"SB3-12-H5B\" />\n- <Type class=\"CTL2\" element=\"C\" mass=\"12.011\" name=\"SB3-12-C6\" />\n- <Type class=\"HAL2\" element=\"H\" mass=\"1.008\" name=\"SB3-12-H6A\" />\n- <Type class=\"HAL2\" element=\"H\" mass=\"1.008\" name=\"SB3-12-H6B\" />\n- <Type class=\"CTL2\" element=\"C\" mass=\"12.011\" name=\"SB3-12-C7\" />\n- <Type class=\"HAL2\" element=\"H\" mass=\"1.008\" name=\"SB3-12-H7A\" />\n- <Type class=\"HAL2\" element=\"H\" mass=\"1.008\" name=\"SB3-12-H7B\" />\n- <Type class=\"CTL2\" element=\"C\" mass=\"12.011\" name=\"SB3-12-C8\" />\n- <Type class=\"HAL2\" element=\"H\" mass=\"1.008\" name=\"SB3-12-H8A\" />\n- <Type class=\"HAL2\" element=\"H\" mass=\"1.008\" name=\"SB3-12-H8B\" />\n- <Type class=\"CTL2\" element=\"C\" mass=\"12.011\" name=\"SB3-12-C9\" />\n- <Type class=\"HAL2\" element=\"H\" mass=\"1.008\" name=\"SB3-12-H9A\" />\n- <Type class=\"HAL2\" element=\"H\" mass=\"1.008\" name=\"SB3-12-H9B\" />\n- <Type class=\"CTL2\" element=\"C\" mass=\"12.011\" name=\"SB3-12-C10\" />\n- <Type class=\"HAL2\" element=\"H\" mass=\"1.008\" name=\"SB3-12-H10A\" />\n- <Type class=\"HAL2\" element=\"H\" mass=\"1.008\" name=\"SB3-12-H10B\" />\n- <Type class=\"CTL2\" element=\"C\" mass=\"12.011\" name=\"SB3-12-C11\" />\n- <Type class=\"HAL2\" element=\"H\" mass=\"1.008\" name=\"SB3-12-H11A\" />\n- <Type class=\"HAL2\" element=\"H\" mass=\"1.008\" name=\"SB3-12-H11B\" />\n- <Type class=\"CTL3\" element=\"C\" mass=\"12.011\" name=\"SB3-12-C12\" />\n- <Type class=\"HAL3\" element=\"H\" mass=\"1.008\" name=\"SB3-12-H12A\" />\n- <Type class=\"HAL3\" element=\"H\" mass=\"1.008\" name=\"SB3-12-H12B\" />\n- <Type class=\"HAL3\" element=\"H\" mass=\"1.008\" name=\"SB3-12-H12C\" />\n- <Type class=\"SL\" element=\"S\" mass=\"32.06\" name=\"SB3-14-S\" />\n- <Type class=\"OSL\" element=\"O\" mass=\"15.9994\" name=\"SB3-14-O1\" />\n- <Type class=\"OSL\" element=\"O\" mass=\"15.9994\" name=\"SB3-14-O2\" />\n- <Type class=\"OSL\" element=\"O\" mass=\"15.9994\" name=\"SB3-14-O3\" />\n- <Type class=\"CTL2\" element=\"C\" mass=\"12.011\" name=\"SB3-14-C25\" />\n- <Type class=\"HAL2\" element=\"H\" mass=\"1.008\" name=\"SB3-14-H25A\" />\n- <Type class=\"HAL2\" element=\"H\" mass=\"1.008\" name=\"SB3-14-H25B\" />\n- <Type class=\"CTL2\" element=\"C\" mass=\"12.011\" name=\"SB3-14-C24\" />\n- <Type class=\"HAL2\" element=\"H\" mass=\"1.008\" name=\"SB3-14-H24A\" />\n- <Type class=\"HAL2\" element=\"H\" mass=\"1.008\" name=\"SB3-14-H24B\" />\n- <Type class=\"NTL\" element=\"N\" mass=\"14.007\" name=\"SB3-14-N\" />\n- <Type class=\"CTL2\" element=\"C\" mass=\"12.011\" name=\"SB3-14-C1\" />\n- <Type class=\"CTL5\" element=\"C\" mass=\"12.011\" name=\"SB3-14-C21\" />\n- <Type class=\"CTL5\" element=\"C\" mass=\"12.011\" name=\"SB3-14-C22\" />\n- <Type class=\"CTL2\" element=\"C\" mass=\"12.011\" name=\"SB3-14-C23\" />\n- <Type class=\"HL\" element=\"H\" mass=\"1.008\" name=\"SB3-14-H1A\" />\n- <Type class=\"HL\" element=\"H\" mass=\"1.008\" name=\"SB3-14-H1B\" />\n- <Type class=\"HL\" element=\"H\" mass=\"1.008\" name=\"SB3-14-H21A\" />\n- <Type class=\"HL\" element=\"H\" mass=\"1.008\" name=\"SB3-14-H21B\" />\n- <Type class=\"HL\" element=\"H\" mass=\"1.008\" name=\"SB3-14-H21C\" />\n- <Type class=\"HL\" element=\"H\" mass=\"1.008\" name=\"SB3-14-H22A\" />\n- <Type class=\"HL\" element=\"H\" mass=\"1.008\" name=\"SB3-14-H22B\" />\n- <Type class=\"HL\" element=\"H\" mass=\"1.008\" name=\"SB3-14-H22C\" />\n- <Type class=\"HL\" element=\"H\" mass=\"1.008\" name=\"SB3-14-H23A\" />\n- <Type class=\"HL\" element=\"H\" mass=\"1.008\" name=\"SB3-14-H23B\" />\n- <Type class=\"CTL2\" element=\"C\" mass=\"12.011\" name=\"SB3-14-C2\" />\n- <Type class=\"HAL2\" element=\"H\" mass=\"1.008\" name=\"SB3-14-H2A\" />\n- <Type class=\"HAL2\" element=\"H\" mass=\"1.008\" name=\"SB3-14-H2B\" />\n- <Type class=\"CTL2\" element=\"C\" mass=\"12.011\" name=\"SB3-14-C3\" />\n- <Type class=\"HAL2\" element=\"H\" mass=\"1.008\" name=\"SB3-14-H3A\" />\n- <Type class=\"HAL2\" element=\"H\" mass=\"1.008\" name=\"SB3-14-H3B\" />\n- <Type class=\"CTL2\" element=\"C\" mass=\"12.011\" name=\"SB3-14-C4\" />\n- <Type class=\"HAL2\" element=\"H\" mass=\"1.008\" name=\"SB3-14-H4A\" />\n- <Type class=\"HAL2\" element=\"H\" mass=\"1.008\" name=\"SB3-14-H4B\" />\n- <Type class=\"CTL2\" element=\"C\" mass=\"12.011\" name=\"SB3-14-C5\" />\n- <Type class=\"HAL2\" element=\"H\" mass=\"1.008\" name=\"SB3-14-H5A\" />\n- <Type class=\"HAL2\" element=\"H\" mass=\"1.008\" name=\"SB3-14-H5B\" />\n- <Type class=\"CTL2\" element=\"C\" mass=\"12.011\" name=\"SB3-14-C6\" />\n- <Type class=\"HAL2\" element=\"H\" mass=\"1.008\" name=\"SB3-14-H6A\" />\n- <Type class=\"HAL2\" element=\"H\" mass=\"1.008\" name=\"SB3-14-H6B\" />\n- <Type class=\"CTL2\" element=\"C\" mass=\"12.011\" name=\"SB3-14-C7\" />\n- <Type class=\"HAL2\" element=\"H\" mass=\"1.008\" name=\"SB3-14-H7A\" />\n- <Type class=\"HAL2\" element=\"H\" mass=\"1.008\" name=\"SB3-14-H7B\" />\n- <Type class=\"CTL2\" element=\"C\" mass=\"12.011\" name=\"SB3-14-C8\" />\n- <Type class=\"HAL2\" element=\"H\" mass=\"1.008\" name=\"SB3-14-H8A\" />\n- <Type class=\"HAL2\" element=\"H\" mass=\"1.008\" name=\"SB3-14-H8B\" />\n- <Type class=\"CTL2\" element=\"C\" mass=\"12.011\" name=\"SB3-14-C9\" />\n- <Type class=\"HAL2\" element=\"H\" mass=\"1.008\" name=\"SB3-14-H9A\" />\n- <Type class=\"HAL2\" element=\"H\" mass=\"1.008\" name=\"SB3-14-H9B\" />\n- <Type class=\"CTL2\" element=\"C\" mass=\"12.011\" name=\"SB3-14-C10\" />\n- <Type class=\"HAL2\" element=\"H\" mass=\"1.008\" name=\"SB3-14-H10A\" />\n- <Type class=\"HAL2\" element=\"H\" mass=\"1.008\" name=\"SB3-14-H10B\" />\n- <Type class=\"CTL2\" element=\"C\" mass=\"12.011\" name=\"SB3-14-C11\" />\n- <Type class=\"HAL2\" element=\"H\" mass=\"1.008\" name=\"SB3-14-H11A\" />\n- <Type class=\"HAL2\" element=\"H\" mass=\"1.008\" name=\"SB3-14-H11B\" />\n- <Type class=\"CTL2\" element=\"C\" mass=\"12.011\" name=\"SB3-14-C12\" />\n- <Type class=\"HAL2\" element=\"H\" mass=\"1.008\" name=\"SB3-14-H12A\" />\n- <Type class=\"HAL2\" element=\"H\" mass=\"1.008\" name=\"SB3-14-H12B\" />\n- <Type class=\"CTL2\" element=\"C\" mass=\"12.011\" name=\"SB3-14-C13\" />\n- <Type class=\"HAL2\" element=\"H\" mass=\"1.008\" name=\"SB3-14-H13A\" />\n- <Type class=\"HAL2\" element=\"H\" mass=\"1.008\" name=\"SB3-14-H13B\" />\n- <Type class=\"CTL3\" element=\"C\" mass=\"12.011\" name=\"SB3-14-C14\" />\n- <Type class=\"HAL3\" element=\"H\" mass=\"1.008\" name=\"SB3-14-H14A\" />\n- <Type class=\"HAL3\" element=\"H\" mass=\"1.008\" name=\"SB3-14-H14B\" />\n- <Type class=\"HAL3\" element=\"H\" mass=\"1.008\" name=\"SB3-14-H14C\" />\n <Type class=\"NTL\" element=\"N\" mass=\"14.007\" name=\"LAPAO-N\" />\n <Type class=\"CTL5\" element=\"C\" mass=\"12.011\" name=\"LAPAO-C13\" />\n <Type class=\"HL\" element=\"H\" mass=\"1.008\" name=\"LAPAO-H13A\" />\n@@ -157358,369 +157181,6 @@\n <Bond atomName1=\"C314\" atomName2=\"H14Z\" />\n <AllowPatch name=\"ACE_0\" />\n </Residue>\n- <Residue name=\"SB3-10\">\n- <Atom charge=\"0.73\" name=\"S\" type=\"SB3-10-S\" />\n- <Atom charge=\"-0.55\" name=\"O1\" type=\"SB3-10-O1\" />\n- <Atom charge=\"-0.55\" name=\"O2\" type=\"SB3-10-O2\" />\n- <Atom charge=\"-0.55\" name=\"O3\" type=\"SB3-10-O3\" />\n- <Atom charge=\"-0.26\" name=\"C25\" type=\"SB3-10-C25\" />\n- <Atom charge=\"0.09\" name=\"H25A\" type=\"SB3-10-H25A\" />\n- <Atom charge=\"0.09\" name=\"H25B\" type=\"SB3-10-H25B\" />\n- <Atom charge=\"-0.18\" name=\"C24\" type=\"SB3-10-C24\" />\n- <Atom charge=\"0.09\" name=\"H24A\" type=\"SB3-10-H24A\" />\n- <Atom charge=\"0.09\" name=\"H24B\" type=\"SB3-10-H24B\" />\n- <Atom charge=\"-0.6\" name=\"N\" type=\"SB3-10-N\" />\n- <Atom charge=\"-0.1\" name=\"C1\" type=\"SB3-10-C1\" />\n- <Atom charge=\"-0.35\" name=\"C21\" type=\"SB3-10-C21\" />\n- <Atom charge=\"-0.35\" name=\"C22\" type=\"SB3-10-C22\" />\n- <Atom charge=\"-0.1\" name=\"C23\" type=\"SB3-10-C23\" />\n- <Atom charge=\"0.25\" name=\"H1A\" type=\"SB3-10-H1A\" />\n- <Atom charge=\"0.25\" name=\"H1B\" type=\"SB3-10-H1B\" />\n- <Atom charge=\"0.25\" name=\"H21A\" type=\"SB3-10-H21A\" />\n- <Atom charge=\"0.25\" name=\"H21B\" type=\"SB3-10-H21B\" />\n- <Atom charge=\"0.25\" name=\"H21C\" type=\"SB3-10-H21C\" />\n- <Atom charge=\"0.25\" name=\"H22A\" type=\"SB3-10-H22A\" />\n- <Atom charge=\"0.25\" name=\"H22B\" type=\"SB3-10-H22B\" />\n- <Atom charge=\"0.25\" name=\"H22C\" type=\"SB3-10-H22C\" />\n- <Atom charge=\"0.25\" name=\"H23A\" type=\"SB3-10-H23A\" />\n- <Atom charge=\"0.25\" name=\"H23B\" type=\"SB3-10-H23B\" />\n- <Atom charge=\"-0.18\" name=\"C2\" type=\"SB3-10-C2\" />\n- <Atom charge=\"0.09\" name=\"H2A\" type=\"SB3-10-H2A\" />\n- <Atom charge=\"0.09\" name=\"H2B\" type=\"SB3-10-H2B\" />\n- <Atom charge=\"-0.18\" name=\"C3\" type=\"SB3-10-C3\" />\n- <Atom charge=\"0.09\" name=\"H3A\" type=\"SB3-10-H3A\" />\n- <Atom charge=\"0.09\" name=\"H3B\" type=\"SB3-10-H3B\" />\n- <Atom charge=\"-0.18\" name=\"C4\" type=\"SB3-10-C4\" />\n- <Atom charge=\"0.09\" name=\"H4A\" type=\"SB3-10-H4A\" />\n- <Atom charge=\"0.09\" name=\"H4B\" type=\"SB3-10-H4B\" />\n- <Atom charge=\"-0.18\" name=\"C5\" type=\"SB3-10-C5\" />\n- <Atom charge=\"0.09\" name=\"H5A\" type=\"SB3-10-H5A\" />\n- <Atom charge=\"0.09\" name=\"H5B\" type=\"SB3-10-H5B\" />\n- <Atom charge=\"-0.18\" name=\"C6\" type=\"SB3-10-C6\" />\n- <Atom charge=\"0.09\" name=\"H6A\" type=\"SB3-10-H6A\" />\n- <Atom charge=\"0.09\" name=\"H6B\" type=\"SB3-10-H6B\" />\n- <Atom charge=\"-0.18\" name=\"C7\" type=\"SB3-10-C7\" />\n- <Atom charge=\"0.09\" name=\"H7A\" type=\"SB3-10-H7A\" />\n- <Atom charge=\"0.09\" name=\"H7B\" type=\"SB3-10-H7B\" />\n- <Atom charge=\"-0.18\" name=\"C8\" type=\"SB3-10-C8\" />\n- <Atom charge=\"0.09\" name=\"H8A\" type=\"SB3-10-H8A\" />\n- <Atom charge=\"0.09\" name=\"H8B\" type=\"SB3-10-H8B\" />\n- <Atom charge=\"-0.18\" name=\"C9\" type=\"SB3-10-C9\" />\n- <Atom charge=\"0.09\" name=\"H9A\" type=\"SB3-10-H9A\" />\n- <Atom charge=\"0.09\" name=\"H9B\" type=\"SB3-10-H9B\" />\n- <Atom charge=\"-0.27\" name=\"C10\" type=\"SB3-10-C10\" />\n- <Atom charge=\"0.09\" name=\"H10A\" type=\"SB3-10-H10A\" />\n- <Atom charge=\"0.09\" name=\"H10B\" type=\"SB3-10-H10B\" />\n- <Atom charge=\"0.09\" name=\"H10C\" type=\"SB3-10-H10C\" />\n- <Bond atomName1=\"S\" atomName2=\"O1\" />\n- <Bond atomName1=\"S\" atomName2=\"O2\" />\n- <Bond atomName1=\"S\" atomName2=\"O3\" />\n- <Bond atomName1=\"S\" atomName2=\"C25\" />\n- <Bond atomName1=\"C25\" atomName2=\"H25A\" />\n- <Bond atomName1=\"C25\" atomName2=\"H25B\" />\n- <Bond atomName1=\"C25\" atomName2=\"C24\" />\n- <Bond atomName1=\"C24\" atomName2=\"H24A\" />\n- <Bond atomName1=\"C24\" atomName2=\"H24B\" />\n- <Bond atomName1=\"C24\" atomName2=\"C23\" />\n- <Bond atomName1=\"C23\" atomName2=\"H23A\" />\n- <Bond atomName1=\"C23\" atomName2=\"H23B\" />\n- <Bond atomName1=\"N\" atomName2=\"C1\" />\n- <Bond atomName1=\"N\" atomName2=\"C21\" />\n- <Bond atomName1=\"N\" atomName2=\"C22\" />\n- <Bond atomName1=\"N\" atomName2=\"C23\" />\n- <Bond atomName1=\"C21\" atomName2=\"H21A\" />\n- <Bond atomName1=\"C21\" atomName2=\"H21B\" />\n- <Bond atomName1=\"C21\" atomName2=\"H21C\" />\n- <Bond atomName1=\"C22\" atomName2=\"H22A\" />\n- <Bond atomName1=\"C22\" atomName2=\"H22B\" />\n- <Bond atomName1=\"C22\" atomName2=\"H22C\" />\n- <Bond atomName1=\"C1\" atomName2=\"H1A\" />\n- <Bond atomName1=\"C1\" atomName2=\"H1B\" />\n- <Bond atomName1=\"C1\" atomName2=\"C2\" />\n- <Bond atomName1=\"C2\" atomName2=\"H2A\" />\n- <Bond atomName1=\"C2\" atomName2=\"H2B\" />\n- <Bond atomName1=\"C2\" atomName2=\"C3\" />\n- <Bond atomName1=\"C3\" atomName2=\"H3A\" />\n- <Bond atomName1=\"C3\" atomName2=\"H3B\" />\n- <Bond atomName1=\"C3\" atomName2=\"C4\" />\n- <Bond atomName1=\"C4\" atomName2=\"H4A\" />\n- <Bond atomName1=\"C4\" atomName2=\"H4B\" />\n- <Bond atomName1=\"C4\" atomName2=\"C5\" />\n- <Bond atomName1=\"C5\" atomName2=\"H5A\" />\n- <Bond atomName1=\"C5\" atomName2=\"H5B\" />\n- <Bond atomName1=\"C5\" atomName2=\"C6\" />\n- <Bond atomName1=\"C6\" atomName2=\"H6A\" />\n- <Bond atomName1=\"C6\" atomName2=\"H6B\" />\n- <Bond atomName1=\"C6\" atomName2=\"C7\" />\n- <Bond atomName1=\"C7\" atomName2=\"H7A\" />\n- <Bond atomName1=\"C7\" atomName2=\"H7B\" />\n- <Bond atomName1=\"C7\" atomName2=\"C8\" />\n- <Bond atomName1=\"C8\" atomName2=\"H8A\" />\n- <Bond atomName1=\"C8\" atomName2=\"H8B\" />\n- <Bond atomName1=\"C8\" atomName2=\"C9\" />\n- <Bond atomName1=\"C9\" atomName2=\"H9A\" />\n- <Bond atomName1=\"C9\" atomName2=\"H9B\" />\n- <Bond atomName1=\"C9\" atomName2=\"C10\" />\n- <Bond atomName1=\"C10\" atomName2=\"H10A\" />\n- <Bond atomName1=\"C10\" atomName2=\"H10B\" />\n- <Bond atomName1=\"C10\" atomName2=\"H10C\" />\n- <AllowPatch name=\"ACE_0\" />\n- <AllowPatch name=\"OMEF_0\" />\n- </Residue>\n- <Residue name=\"SB3-12\">\n- <Atom charge=\"0.73\" name=\"S\" type=\"SB3-12-S\" />\n- <Atom charge=\"-0.55\" name=\"O1\" type=\"SB3-12-O1\" />\n- <Atom charge=\"-0.55\" name=\"O2\" type=\"SB3-12-O2\" />\n- <Atom charge=\"-0.55\" name=\"O3\" type=\"SB3-12-O3\" />\n- <Atom charge=\"-0.26\" name=\"C25\" type=\"SB3-12-C25\" />\n- <Atom charge=\"0.09\" name=\"H25A\" type=\"SB3-12-H25A\" />\n- <Atom charge=\"0.09\" name=\"H25B\" type=\"SB3-12-H25B\" />\n- <Atom charge=\"-0.18\" name=\"C24\" type=\"SB3-12-C24\" />\n- <Atom charge=\"0.09\" name=\"H24A\" type=\"SB3-12-H24A\" />\n- <Atom charge=\"0.09\" name=\"H24B\" type=\"SB3-12-H24B\" />\n- <Atom charge=\"-0.6\" name=\"N\" type=\"SB3-12-N\" />\n- <Atom charge=\"-0.1\" name=\"C1\" type=\"SB3-12-C1\" />\n- <Atom charge=\"-0.35\" name=\"C21\" type=\"SB3-12-C21\" />\n- <Atom charge=\"-0.35\" name=\"C22\" type=\"SB3-12-C22\" />\n- <Atom charge=\"-0.1\" name=\"C23\" type=\"SB3-12-C23\" />\n- <Atom charge=\"0.25\" name=\"H1A\" type=\"SB3-12-H1A\" />\n- <Atom charge=\"0.25\" name=\"H1B\" type=\"SB3-12-H1B\" />\n- <Atom charge=\"0.25\" name=\"H21A\" type=\"SB3-12-H21A\" />\n- <Atom charge=\"0.25\" name=\"H21B\" type=\"SB3-12-H21B\" />\n- <Atom charge=\"0.25\" name=\"H21C\" type=\"SB3-12-H21C\" />\n- <Atom charge=\"0.25\" name=\"H22A\" type=\"SB3-12-H22A\" />\n- <Atom charge=\"0.25\" name=\"H22B\" type=\"SB3-12-H22B\" />\n- <Atom charge=\"0.25\" name=\"H22C\" type=\"SB3-12-H22C\" />\n- <Atom charge=\"0.25\" name=\"H23A\" type=\"SB3-12-H23A\" />\n- <Atom charge=\"0.25\" name=\"H23B\" type=\"SB3-12-H23B\" />\n- <Atom charge=\"-0.18\" name=\"C2\" type=\"SB3-12-C2\" />\n- <Atom charge=\"0.09\" name=\"H2A\" type=\"SB3-12-H2A\" />\n- <Atom charge=\"0.09\" name=\"H2B\" type=\"SB3-12-H2B\" />\n- <Atom charge=\"-0.18\" name=\"C3\" type=\"SB3-12-C3\" />\n- <Atom charge=\"0.09\" name=\"H3A\" type=\"SB3-12-H3A\" />\n- <Atom charge=\"0.09\" name=\"H3B\" type=\"SB3-12-H3B\" />\n- <Atom charge=\"-0.18\" name=\"C4\" type=\"SB3-12-C4\" />\n- <Atom charge=\"0.09\" name=\"H4A\" type=\"SB3-12-H4A\" />\n- <Atom charge=\"0.09\" name=\"H4B\" type=\"SB3-12-H4B\" />\n- <Atom charge=\"-0.18\" name=\"C5\" type=\"SB3-12-C5\" />\n- <Atom charge=\"0.09\" name=\"H5A\" type=\"SB3-12-H5A\" />\n- <Atom charge=\"0.09\" name=\"H5B\" type=\"SB3-12-H5B\" />\n- <Atom charge=\"-0.18\" name=\"C6\" type=\"SB3-12-C6\" />\n- <Atom charge=\"0.09\" name=\"H6A\" type=\"SB3-12-H6A\" />\n- <Atom charge=\"0.09\" name=\"H6B\" type=\"SB3-12-H6B\" />\n- <Atom charge=\"-0.18\" name=\"C7\" type=\"SB3-12-C7\" />\n- <Atom charge=\"0.09\" name=\"H7A\" type=\"SB3-12-H7A\" />\n- <Atom charge=\"0.09\" name=\"H7B\" type=\"SB3-12-H7B\" />\n- <Atom charge=\"-0.18\" name=\"C8\" type=\"SB3-12-C8\" />\n- <Atom charge=\"0.09\" name=\"H8A\" type=\"SB3-12-H8A\" />\n- <Atom charge=\"0.09\" name=\"H8B\" type=\"SB3-12-H8B\" />\n- <Atom charge=\"-0.18\" name=\"C9\" type=\"SB3-12-C9\" />\n- <Atom charge=\"0.09\" name=\"H9A\" type=\"SB3-12-H9A\" />\n- <Atom charge=\"0.09\" name=\"H9B\" type=\"SB3-12-H9B\" />\n- <Atom charge=\"-0.18\" name=\"C10\" type=\"SB3-12-C10\" />\n- <Atom charge=\"0.09\" name=\"H10A\" type=\"SB3-12-H10A\" />\n- <Atom charge=\"0.09\" name=\"H10B\" type=\"SB3-12-H10B\" />\n- <Atom charge=\"-0.18\" name=\"C11\" type=\"SB3-12-C11\" />\n- <Atom charge=\"0.09\" name=\"H11A\" type=\"SB3-12-H11A\" />\n- <Atom charge=\"0.09\" name=\"H11B\" type=\"SB3-12-H11B\" />\n- <Atom charge=\"-0.27\" name=\"C12\" type=\"SB3-12-C12\" />\n- <Atom charge=\"0.09\" name=\"H12A\" type=\"SB3-12-H12A\" />\n- <Atom charge=\"0.09\" name=\"H12B\" type=\"SB3-12-H12B\" />\n- <Atom charge=\"0.09\" name=\"H12C\" type=\"SB3-12-H12C\" />\n- <Bond atomName1=\"S\" atomName2=\"O1\" />\n- <Bond atomName1=\"S\" atomName2=\"O2\" />\n- <Bond atomName1=\"S\" atomName2=\"O3\" />\n- <Bond atomName1=\"S\" atomName2=\"C25\" />\n- <Bond atomName1=\"C25\" atomName2=\"H25A\" />\n- <Bond atomName1=\"C25\" atomName2=\"H25B\" />\n- <Bond atomName1=\"C25\" atomName2=\"C24\" />\n- <Bond atomName1=\"C24\" atomName2=\"H24A\" />\n- <Bond atomName1=\"C24\" atomName2=\"H24B\" />\n- <Bond atomName1=\"C24\" atomName2=\"C23\" />\n- <Bond atomName1=\"C23\" atomName2=\"H23A\" />\n- <Bond atomName1=\"C23\" atomName2=\"H23B\" />\n- <Bond atomName1=\"N\" atomName2=\"C1\" />\n- <Bond atomName1=\"N\" atomName2=\"C21\" />\n- <Bond atomName1=\"N\" atomName2=\"C22\" />\n- <Bond atomName1=\"N\" atomName2=\"C23\" />\n- <Bond atomName1=\"C21\" atomName2=\"H21A\" />\n- <Bond atomName1=\"C21\" atomName2=\"H21B\" />\n- <Bond atomName1=\"C21\" atomName2=\"H21C\" />\n- <Bond atomName1=\"C22\" atomName2=\"H22A\" />\n- <Bond atomName1=\"C22\" atomName2=\"H22B\" />\n- <Bond atomName1=\"C22\" atomName2=\"H22C\" />\n- <Bond atomName1=\"C1\" atomName2=\"H1A\" />\n- <Bond atomName1=\"C1\" atomName2=\"H1B\" />\n- <Bond atomName1=\"C1\" atomName2=\"C2\" />\n- <Bond atomName1=\"C2\" atomName2=\"H2A\" />\n- <Bond atomName1=\"C2\" atomName2=\"H2B\" />\n- <Bond atomName1=\"C2\" atomName2=\"C3\" />\n- <Bond atomName1=\"C3\" atomName2=\"H3A\" />\n- <Bond atomName1=\"C3\" atomName2=\"H3B\" />\n- <Bond atomName1=\"C3\" atomName2=\"C4\" />\n- <Bond atomName1=\"C4\" atomName2=\"H4A\" />\n- <Bond atomName1=\"C4\" atomName2=\"H4B\" />\n- <Bond atomName1=\"C4\" atomName2=\"C5\" />\n- <Bond atomName1=\"C5\" atomName2=\"H5A\" />\n- <Bond atomName1=\"C5\" atomName2=\"H5B\" />\n- <Bond atomName1=\"C5\" atomName2=\"C6\" />\n- <Bond atomName1=\"C6\" atomName2=\"H6A\" />\n- <Bond atomName1=\"C6\" atomName2=\"H6B\" />\n- <Bond atomName1=\"C6\" atomName2=\"C7\" />\n- <Bond atomName1=\"C7\" atomName2=\"H7A\" />\n- <Bond atomName1=\"C7\" atomName2=\"H7B\" />\n- <Bond atomName1=\"C7\" atomName2=\"C8\" />\n- <Bond atomName1=\"C8\" atomName2=\"H8A\" />\n- <Bond atomName1=\"C8\" atomName2=\"H8B\" />\n- <Bond atomName1=\"C8\" atomName2=\"C9\" />\n- <Bond atomName1=\"C9\" atomName2=\"H9A\" />\n- <Bond atomName1=\"C9\" atomName2=\"H9B\" />\n- <Bond atomName1=\"C9\" atomName2=\"C10\" />\n- <Bond atomName1=\"C10\" atomName2=\"H10A\" />\n- <Bond atomName1=\"C10\" atomName2=\"H10B\" />\n- <Bond atomName1=\"C10\" atomName2=\"C11\" />\n- <Bond atomName1=\"C11\" atomName2=\"H11A\" />\n- <Bond atomName1=\"C11\" atomName2=\"H11B\" />\n- <Bond atomName1=\"C11\" atomName2=\"C12\" />\n- <Bond atomName1=\"C12\" atomName2=\"H12A\" />\n- <Bond atomName1=\"C12\" atomName2=\"H12B\" />\n- <Bond atomName1=\"C12\" atomName2=\"H12C\" />\n- <AllowPatch name=\"ACE_0\" />\n- <AllowPatch name=\"OMEF_0\" />\n- </Residue>\n- <Residue name=\"SB3-14\">\n- <Atom charge=\"0.73\" name=\"S\" type=\"SB3-14-S\" />\n- <Atom charge=\"-0.55\" name=\"O1\" type=\"SB3-14-O1\" />\n- <Atom charge=\"-0.55\" name=\"O2\" type=\"SB3-14-O2\" />\n- <Atom charge=\"-0.55\" name=\"O3\" type=\"SB3-14-O3\" />\n- <Atom charge=\"-0.26\" name=\"C25\" type=\"SB3-14-C25\" />\n- <Atom charge=\"0.09\" name=\"H25A\" type=\"SB3-14-H25A\" />\n- <Atom charge=\"0.09\" name=\"H25B\" type=\"SB3-14-H25B\" />\n- <Atom charge=\"-0.18\" name=\"C24\" type=\"SB3-14-C24\" />\n- <Atom charge=\"0.09\" name=\"H24A\" type=\"SB3-14-H24A\" />\n- <Atom charge=\"0.09\" name=\"H24B\" type=\"SB3-14-H24B\" />\n- <Atom charge=\"-0.6\" name=\"N\" type=\"SB3-14-N\" />\n- <Atom charge=\"-0.1\" name=\"C1\" type=\"SB3-14-C1\" />\n- <Atom charge=\"-0.35\" name=\"C21\" type=\"SB3-14-C21\" />\n- <Atom charge=\"-0.35\" name=\"C22\" type=\"SB3-14-C22\" />\n- <Atom charge=\"-0.1\" name=\"C23\" type=\"SB3-14-C23\" />\n- <Atom charge=\"0.25\" name=\"H1A\" type=\"SB3-14-H1A\" />\n- <Atom charge=\"0.25\" name=\"H1B\" type=\"SB3-14-H1B\" />\n- <Atom charge=\"0.25\" name=\"H21A\" type=\"SB3-14-H21A\" />\n- <Atom charge=\"0.25\" name=\"H21B\" type=\"SB3-14-H21B\" />\n- <Atom charge=\"0.25\" name=\"H21C\" type=\"SB3-14-H21C\" />\n- <Atom charge=\"0.25\" name=\"H22A\" type=\"SB3-14-H22A\" />\n- <Atom charge=\"0.25\" name=\"H22B\" type=\"SB3-14-H22B\" />\n- <Atom charge=\"0.25\" name=\"H22C\" type=\"SB3-14-H22C\" />\n- <Atom charge=\"0.25\" name=\"H23A\" type=\"SB3-14-H23A\" />\n- <Atom charge=\"0.25\" name=\"H23B\" type=\"SB3-14-H23B\" />\n- <Atom charge=\"-0.18\" name=\"C2\" type=\"SB3-14-C2\" />\n- <Atom charge=\"0.09\" name=\"H2A\" type=\"SB3-14-H2A\" />\n- <Atom charge=\"0.09\" name=\"H2B\" type=\"SB3-14-H2B\" />\n- <Atom charge=\"-0.18\" name=\"C3\" type=\"SB3-14-C3\" />\n- <Atom charge=\"0.09\" name=\"H3A\" type=\"SB3-14-H3A\" />\n- <Atom charge=\"0.09\" name=\"H3B\" type=\"SB3-14-H3B\" />\n- <Atom charge=\"-0.18\" name=\"C4\" type=\"SB3-14-C4\" />\n- <Atom charge=\"0.09\" name=\"H4A\" type=\"SB3-14-H4A\" />\n- <Atom charge=\"0.09\" name=\"H4B\" type=\"SB3-14-H4B\" />\n- <Atom charge=\"-0.18\" name=\"C5\" type=\"SB3-14-C5\" />\n- <Atom charge=\"0.09\" name=\"H5A\" type=\"SB3-14-H5A\" />\n- <Atom charge=\"0.09\" name=\"H5B\" type=\"SB3-14-H5B\" />\n- <Atom charge=\"-0.18\" name=\"C6\" type=\"SB3-14-C6\" />\n- <Atom charge=\"0.09\" name=\"H6A\" type=\"SB3-14-H6A\" />\n- <Atom charge=\"0.09\" name=\"H6B\" type=\"SB3-14-H6B\" />\n- <Atom charge=\"-0.18\" name=\"C7\" type=\"SB3-14-C7\" />\n- <Atom charge=\"0.09\" name=\"H7A\" type=\"SB3-14-H7A\" />\n- <Atom charge=\"0.09\" name=\"H7B\" type=\"SB3-14-H7B\" />\n- <Atom charge=\"-0.18\" name=\"C8\" type=\"SB3-14-C8\" />\n- <Atom charge=\"0.09\" name=\"H8A\" type=\"SB3-14-H8A\" />\n- <Atom charge=\"0.09\" name=\"H8B\" type=\"SB3-14-H8B\" />\n- <Atom charge=\"-0.18\" name=\"C9\" type=\"SB3-14-C9\" />\n- <Atom charge=\"0.09\" name=\"H9A\" type=\"SB3-14-H9A\" />\n- <Atom charge=\"0.09\" name=\"H9B\" type=\"SB3-14-H9B\" />\n- <Atom charge=\"-0.18\" name=\"C10\" type=\"SB3-14-C10\" />\n- <Atom charge=\"0.09\" name=\"H10A\" type=\"SB3-14-H10A\" />\n- <Atom charge=\"0.09\" name=\"H10B\" type=\"SB3-14-H10B\" />\n- <Atom charge=\"-0.18\" name=\"C11\" type=\"SB3-14-C11\" />\n- <Atom charge=\"0.09\" name=\"H11A\" type=\"SB3-14-H11A\" />\n- <Atom charge=\"0.09\" name=\"H11B\" type=\"SB3-14-H11B\" />\n- <Atom charge=\"-0.18\" name=\"C12\" type=\"SB3-14-C12\" />\n- <Atom charge=\"0.09\" name=\"H12A\" type=\"SB3-14-H12A\" />\n- <Atom charge=\"0.09\" name=\"H12B\" type=\"SB3-14-H12B\" />\n- <Atom charge=\"-0.18\" name=\"C13\" type=\"SB3-14-C13\" />\n- <Atom charge=\"0.09\" name=\"H13A\" type=\"SB3-14-H13A\" />\n- <Atom charge=\"0.09\" name=\"H13B\" type=\"SB3-14-H13B\" />\n- <Atom charge=\"-0.27\" name=\"C14\" type=\"SB3-14-C14\" />\n- <Atom charge=\"0.09\" name=\"H14A\" type=\"SB3-14-H14A\" />\n- <Atom charge=\"0.09\" name=\"H14B\" type=\"SB3-14-H14B\" />\n- <Atom charge=\"0.09\" name=\"H14C\" type=\"SB3-14-H14C\" />\n- <Bond atomName1=\"S\" atomName2=\"O1\" />\n- <Bond atomName1=\"S\" atomName2=\"O2\" />\n- <Bond atomName1=\"S\" atomName2=\"O3\" />\n- <Bond atomName1=\"S\" atomName2=\"C25\" />\n- <Bond atomName1=\"C25\" atomName2=\"H25A\" />\n- <Bond atomName1=\"C25\" atomName2=\"H25B\" />\n- <Bond atomName1=\"C25\" atomName2=\"C24\" />\n- <Bond atomName1=\"C24\" atomName2=\"H24A\" />\n- <Bond atomName1=\"C24\" atomName2=\"H24B\" />\n- <Bond atomName1=\"C24\" atomName2=\"C23\" />\n- <Bond atomName1=\"C23\" atomName2=\"H23A\" />\n- <Bond atomName1=\"C23\" atomName2=\"H23B\" />\n- <Bond atomName1=\"N\" atomName2=\"C1\" />\n- <Bond atomName1=\"N\" atomName2=\"C21\" />\n- <Bond atomName1=\"N\" atomName2=\"C22\" />\n- <Bond atomName1=\"N\" atomName2=\"C23\" />\n- <Bond atomName1=\"C21\" atomName2=\"H21A\" />\n- <Bond atomName1=\"C21\" atomName2=\"H21B\" />\n- <Bond atomName1=\"C21\" atomName2=\"H21C\" />\n- <Bond atomName1=\"C22\" atomName2=\"H22A\" />\n- <Bond atomName1=\"C22\" atomName2=\"H22B\" />\n- <Bond atomName1=\"C22\" atomName2=\"H22C\" />\n- <Bond atomName1=\"C1\" atomName2=\"H1A\" />\n- <Bond atomName1=\"C1\" atomName2=\"H1B\" />\n- <Bond atomName1=\"C1\" atomName2=\"C2\" />\n- <Bond atomName1=\"C2\" atomName2=\"H2A\" />\n- <Bond atomName1=\"C2\" atomName2=\"H2B\" />\n- <Bond atomName1=\"C2\" atomName2=\"C3\" />\n- <Bond atomName1=\"C3\" atomName2=\"H3A\" />\n- <Bond atomName1=\"C3\" atomName2=\"H3B\" />\n- <Bond atomName1=\"C3\" atomName2=\"C4\" />\n- <Bond atomName1=\"C4\" atomName2=\"H4A\" />\n- <Bond atomName1=\"C4\" atomName2=\"H4B\" />\n- <Bond atomName1=\"C4\" atomName2=\"C5\" />\n- <Bond atomName1=\"C5\" atomName2=\"H5A\" />\n- <Bond atomName1=\"C5\" atomName2=\"H5B\" />\n- <Bond atomName1=\"C5\" atomName2=\"C6\" />\n- <Bond atomName1=\"C6\" atomName2=\"H6A\" />\n- <Bond atomName1=\"C6\" atomName2=\"H6B\" />\n- <Bond atomName1=\"C6\" atomName2=\"C7\" />\n- <Bond atomName1=\"C7\" atomName2=\"H7A\" />\n- <Bond atomName1=\"C7\" atomName2=\"H7B\" />\n- <Bond atomName1=\"C7\" atomName2=\"C8\" />\n- <Bond atomName1=\"C8\" atomName2=\"H8A\" />\n- <Bond atomName1=\"C8\" atomName2=\"H8B\" />\n- <Bond atomName1=\"C8\" atomName2=\"C9\" />\n- <Bond atomName1=\"C9\" atomName2=\"H9A\" />\n- <Bond atomName1=\"C9\" atomName2=\"H9B\" />\n- <Bond atomName1=\"C9\" atomName2=\"C10\" />\n- <Bond atomName1=\"C10\" atomName2=\"H10A\" />\n- <Bond atomName1=\"C10\" atomName2=\"H10B\" />\n- <Bond atomName1=\"C10\" atomName2=\"C11\" />\n- <Bond atomName1=\"C11\" atomName2=\"H11A\" />\n- <Bond atomName1=\"C11\" atomName2=\"H11B\" />\n- <Bond atomName1=\"C11\" atomName2=\"C12\" />\n- <Bond atomName1=\"C12\" atomName2=\"H12A\" />\n- <Bond atomName1=\"C12\" atomName2=\"H12B\" />\n- <Bond atomName1=\"C12\" atomName2=\"C13\" />\n- <Bond atomName1=\"C13\" atomName2=\"H13A\" />\n- <Bond atomName1=\"C13\" atomName2=\"H13B\" />\n- <Bond atomName1=\"C13\" atomName2=\"C14\" />\n- <Bond atomName1=\"C14\" atomName2=\"H14A\" />\n- <Bond atomName1=\"C14\" atomName2=\"H14B\" />\n- <Bond atomName1=\"C14\" atomName2=\"H14C\" />\n- <AllowPatch name=\"ACE_0\" />\n- <AllowPatch name=\"OMEF_0\" />\n- </Residue>\n <Residue name=\"LAPAO\">\n <Atom charge=\"-0.83\" name=\"N\" type=\"LAPAO-N\" />\n <Atom charge=\"-0.35\" name=\"C13\" type=\"LAPAO-C13\" />\n@@ -255578,15 +255038,4231 @@\n import math\n import openmm\n \n-residue_impropers = {'ALA': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'ARG': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O')), ((0, 'CZ'), (0, 'NH1'), (0, 'NH2'), (0, 'NE')), ((0, 'NH1'), (0, 'HH11'), (0, 'HH12'), (0, 'CZ')), ((0, 'NH2'), (0, 'HH21'), (0, 'HH22'), (0, 'CZ'))), 'ASN': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O')), ((0, 'CG'), (0, 'ND2'), (0, 'CB'), (0, 'OD1')), ((0, 'CG'), (0, 'CB'), (0, 'ND2'), (0, 'OD1')), ((0, 'ND2'), (0, 'CG'), (0, 'HD21'), (0, 'HD22')), ((0, 'ND2'), (0, 'CG'), (0, 'HD22'), (0, 'HD21'))), 'ASP': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O')), ((0, 'CG'), (0, 'CB'), (0, 'OD2'), (0, 'OD1'))), 'CYS': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'GLN': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O')), ((0, 'CD'), (0, 'NE2'), (0, 'CG'), (0, 'OE1')), ((0, 'CD'), (0, 'CG'), (0, 'NE2'), (0, 'OE1')), ((0, 'NE2'), (0, 'CD'), (0, 'HE21'), (0, 'HE22')), ((0, 'NE2'), (0, 'CD'), (0, 'HE22'), (0, 'HE21'))), 'GLU': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O')), ((0, 'CD'), (0, 'CG'), (0, 'OE2'), (0, 'OE1'))), 'GLY': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'HSD': (((0, 'ND1'), (0, 'CG'), (0, 'CE1'), (0, 'HD1')), ((0, 'CD2'), (0, 'CG'), (0, 'NE2'), (0, 'HD2')), ((0, 'CE1'), (0, 'ND1'), (0, 'NE2'), (0, 'HE1')), ((0, 'ND1'), (0, 'CE1'), (0, 'CG'), (0, 'HD1')), ((0, 'CD2'), (0, 'NE2'), (0, 'CG'), (0, 'HD2')), ((0, 'CE1'), (0, 'NE2'), (0, 'ND1'), (0, 'HE1')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'HSE': (((0, 'NE2'), (0, 'CD2'), (0, 'CE1'), (0, 'HE2')), ((0, 'CD2'), (0, 'CG'), (0, 'NE2'), (0, 'HD2')), ((0, 'CE1'), (0, 'ND1'), (0, 'NE2'), (0, 'HE1')), ((0, 'NE2'), (0, 'CE1'), (0, 'CD2'), (0, 'HE2')), ((0, 'CD2'), (0, 'NE2'), (0, 'CG'), (0, 'HD2')), ((0, 'CE1'), (0, 'NE2'), (0, 'ND1'), (0, 'HE1')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'HSP': (((0, 'ND1'), (0, 'CG'), (0, 'CE1'), (0, 'HD1')), ((0, 'ND1'), (0, 'CE1'), (0, 'CG'), (0, 'HD1')), ((0, 'NE2'), (0, 'CD2'), (0, 'CE1'), (0, 'HE2')), ((0, 'NE2'), (0, 'CE1'), (0, 'CD2'), (0, 'HE2')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'ILE': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'LEU': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'LYS': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'MET': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'PHE': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'PRO': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'CD')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'SER': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'THR': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'TRP': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'TYR': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'VAL': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'ALAD': (((0, 'CLP'), (0, 'CL'), (0, 'NL'), (0, 'OL')), ((0, 'NL'), (0, 'CLP'), (0, 'CA'), (0, 'HL')), ((0, 'CRP'), (0, 'CA'), (0, 'NR'), (0, 'OR')), ((0, 'NR'), (0, 'CRP'), (0, 'CR'), (0, 'HR'))), 'CYM': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'GUA': (((0, 'C2'), (0, 'N3'), (0, 'N1'), (0, 'N2')), ((0, 'C6'), (0, 'N1'), (0, 'C5'), (0, 'O6')), ((0, 'N2'), (0, 'H21'), (0, 'C2'), (0, 'H22'))), 'ADE': (((0, 'N6'), (0, 'C6'), (0, 'H61'), (0, 'H62')), ((0, 'C6'), (0, 'N1'), (0, 'C5'), (0, 'N6'))), 'CYT': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'O2')), ((0, 'C4'), (0, 'N3'), (0, 'C5'), (0, 'N4')), ((0, 'N4'), (0, 'C4'), (0, 'H41'), (0, 'H42'))), 'THY': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'O2')), ((0, 'C4'), (0, 'N3'), (0, 'C5'), (0, 'O4')), ((0, 'C5'), (0, 'C4'), (0, 'C6'), (0, 'C5M'))), 'URA': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'O2')), ((0, 'C4'), (0, 'N3'), (0, 'C5'), (0, 'O4'))), 'AGLCA': (((0, 'C6'), (0, 'C5'), (0, 'O62'), (0, 'O61')),), 'BGLCA': (((0, 'C6'), (0, 'C5'), (0, 'O62'), (0, 'O61')),), 'BGLCA0': (((0, 'C6'), (0, 'C5'), (0, 'O62'), (0, 'O61')),), 'AIDOA': (((0, 'C6'), (0, 'C5'), (0, 'O62'), (0, 'O61')),), 'BIDOA': (((0, 'C6'), (0, 'C5'), (0, 'O62'), (0, 'O61')),), 'AGLCNA': (((0, 'C'), (0, 'CT'), (0, 'N'), (0, 'O')), ((0, 'N'), (0, 'C'), (0, 'C2'), (0, 'HN'))), 'BGLCNA': (((0, 'C'), (0, 'CT'), (0, 'N'), (0, 'O')), ((0, 'N'), (0, 'C'), (0, 'C2'), (0, 'HN'))), 'BGLCN0': (((0, 'C'), (0, 'CT'), (0, 'N'), (0, 'O')), ((0, 'N'), (0, 'C'), (0, 'C2'), (0, 'HN'))), 'AGALNA': (((0, 'C'), (0, 'CT'), (0, 'N'), (0, 'O')), ((0, 'N'), (0, 'C'), (0, 'C2'), (0, 'HN'))), 'BGALNA': (((0, 'C'), (0, 'CT'), (0, 'N'), (0, 'O')), ((0, 'N'), (0, 'C'), (0, 'C2'), (0, 'HN'))), 'ANE5AC': (((0, 'C'), (0, 'CT'), (0, 'N'), (0, 'O')), ((0, 'N'), (0, 'C'), (0, 'C5'), (0, 'HN')), ((0, 'C1'), (0, 'C2'), (0, 'O12'), (0, 'O11'))), 'BNE5AC': (((0, 'C'), (0, 'CT'), (0, 'N'), (0, 'O')), ((0, 'N'), (0, 'C'), (0, 'C5'), (0, 'HN')), ((0, 'C1'), (0, 'C2'), (0, 'O12'), (0, 'O11'))), 'ALLOSE': (((0, 'C1'), (0, 'C2'), (0, 'O1'), (0, 'H1')),), 'PSICOS': (((0, 'C2'), (0, 'C1'), (0, 'C3'), (0, 'O2')),), 'LPPC': (((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32')),), 'DLPC': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))), 'DLPE': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))), 'DLPS': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32')), ((0, 'C13'), (0, 'C12'), (0, 'O13B'), (0, 'O13A'))), 'DLPA': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))), 'DLPG': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))), 'DMPC': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))), 'DMPE': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))), 'DMPS': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32')), ((0, 'C13'), (0, 'C12'), (0, 'O13B'), (0, 'O13A'))), 'DMPA': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))), 'DMPG': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))), 'DPPC': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))), 'DPPE': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))), 'DPPS': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32')), ((0, 'C13'), (0, 'C12'), (0, 'O13B'), (0, 'O13A'))), 'DPPA': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))), 'DPPG': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))), 'DSPC': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))), 'DSPE': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))), 'DSPS': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32')), ((0, 'C13'), (0, 'C12'), (0, 'O13B'), (0, 'O13A'))), 'DSPA': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))), 'DSPG': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))), 'DOPC': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))), 'DOPE': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))), 'DOPS': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32')), ((0, 'C13'), (0, 'C12'), (0, 'O13B'), (0, 'O13A'))), 'DOPA': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))), 'DOPG': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))), 'POPC': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))), 'POPE': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))), 'POPS': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32')), ((0, 'C13'), (0, 'C12'), (0, 'O13B'), (0, 'O13A'))), 'POPA': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))), 'POPG': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))), 'SAPC': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))), 'SDPC': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))), 'SOPC': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))), 'DAPC': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))), 'ACET': (((0, 'C2'), (0, 'O2'), (0, 'O1'), (0, 'C1')),), 'PROA': (((0, 'C1'), (0, 'O2'), (0, 'O1'), (0, 'C2')),), 'GUAN': (((0, 'C'), (0, 'N2'), (0, 'N3'), (0, 'N1')),), 'MGUA': (((0, 'C'), (0, 'N2'), (0, 'N3'), (0, 'N1')),), 'GLYN': (((0, 'C'), (0, 'CA'), (0, 'OT1'), (0, 'OT2')),), 'ACEH': (((0, 'C1'), (0, 'C2'), (0, 'O2'), (0, 'O1')),), 'FORM': (((0, 'C'), (0, 'N'), (0, 'O'), (0, 'HA')),), 'ACEM': (((0, 'C'), (0, 'CC'), (0, 'N'), (0, 'O')),), 'PRAM': (((0, 'C'), (0, 'CC'), (0, 'N'), (0, 'O')),), 'NMA': (((0, 'C'), (0, 'CL'), (0, 'N'), (0, 'O')),), 'AANM': (((0, 'CLP'), (0, 'CL'), (0, 'NL'), (0, 'OL')), ((0, 'CRP'), (0, 'CA'), (0, 'NR'), (0, 'OR'))), 'APNH': (((0, 'CY'), (0, 'CAY'), (0, 'N'), (0, 'OY')), ((0, 'C'), (0, 'CA'), (0, 'NT'), (0, 'O'))), 'PDIP': (((0, 'CY'), (0, 'CAY'), (0, 'N'), (0, 'OY')), ((0, 'C'), (0, 'CA'), (0, 'NT'), (0, 'O'))), 'PNH2': (((0, 'C'), (0, 'CA'), (0, 'NT'), (0, 'O')),), 'CO3': (((0, 'C1'), (0, 'O1'), (0, 'O2'), (0, 'O3')),), 'AALD': (((0, 'CB'), (0, 'C'), (0, 'O'), (0, 'HA')),), 'PALD': (((0, 'CB'), (0, 'C'), (0, 'O'), (0, 'HA')),), 'CALD': (((0, 'CB'), (0, 'C'), (0, 'O'), (0, 'HA')),), 'BALD': (((0, 'CG'), (0, 'C'), (0, 'O'), (0, 'HA')),), '4AP2': (((0, 'HE1'), (0, 'NZ'), (0, 'CD1'), (0, 'CE1')), ((0, 'HD1'), (0, 'CE1'), (0, 'CG'), (0, 'CD1')), ((0, 'HE2'), (0, 'NZ'), (0, 'CD2'), (0, 'CE2')), ((0, 'HD2'), (0, 'CE2'), (0, 'CG'), (0, 'CD2')), ((0, 'NG'), (0, 'CD1'), (0, 'CD2'), (0, 'CG')), ((0, 'HG11'), (0, 'CG'), (0, 'HG12'), (0, 'NG'))), '3APY': (((0, 'HE1'), (0, 'NZ'), (0, 'CD1'), (0, 'CE1')), ((0, 'HE2'), (0, 'NZ'), (0, 'CD2'), (0, 'CE2')), ((0, 'HD2'), (0, 'CE2'), (0, 'CG'), (0, 'CD2')), ((0, 'HG'), (0, 'CD1'), (0, 'CD2'), (0, 'CG')), ((0, 'ND1'), (0, 'CG'), (0, 'CE1'), (0, 'CD1')), ((0, 'HD11'), (0, 'CD1'), (0, 'HD12'), (0, 'ND1'))), '34AP': (((0, 'HE1'), (0, 'NZ'), (0, 'CD1'), (0, 'CE1')), ((0, 'HE2'), (0, 'NZ'), (0, 'CD2'), (0, 'CE2')), ((0, 'HD2'), (0, 'CE2'), (0, 'CG'), (0, 'CD2')), ((0, 'ND1'), (0, 'CG'), (0, 'CE1'), (0, 'CD1')), ((0, 'HD11'), (0, 'CD1'), (0, 'HD12'), (0, 'ND1')), ((0, 'NG'), (0, 'CD1'), (0, 'CD2'), (0, 'CG')), ((0, 'HG11'), (0, 'CG'), (0, 'HG12'), (0, 'NG'))), '3CPY': (((0, 'HE1'), (0, 'NZ'), (0, 'CD1'), (0, 'CE1')), ((0, 'HE2'), (0, 'NZ'), (0, 'CD2'), (0, 'CE2')), ((0, 'HD2'), (0, 'CE2'), (0, 'CG'), (0, 'CD2')), ((0, 'HG'), (0, 'CD1'), (0, 'CD2'), (0, 'CG'))), '3FLP': (((0, 'HE1'), (0, 'NZ'), (0, 'CD1'), (0, 'CE1')), ((0, 'F1'), (0, 'CE1'), (0, 'CG'), (0, 'CD1')), ((0, 'HE2'), (0, 'NZ'), (0, 'CD2'), (0, 'CE2')), ((0, 'HD2'), (0, 'CE2'), (0, 'CG'), (0, 'CD2')), ((0, 'HG'), (0, 'CD1'), (0, 'CD2'), (0, 'CG'))), '3ALP': (((0, 'HE1'), (0, 'NZ'), (0, 'CD1'), (0, 'CE1')), ((0, 'HE2'), (0, 'NZ'), (0, 'CD2'), (0, 'CE2')), ((0, 'HD2'), (0, 'CE2'), (0, 'CG'), (0, 'CD2')), ((0, 'HG'), (0, 'CD1'), (0, 'CD2'), (0, 'CG')), ((0, 'CD1'), (0, 'CD3'), (0, 'O1'), (0, 'H3'))), '3HOP': (((0, 'HE1'), (0, 'NZ'), (0, 'CD1'), (0, 'CE1')), ((0, 'HE2'), (0, 'NZ'), (0, 'CD2'), (0, 'CE2')), ((0, 'HD2'), (0, 'CE2'), (0, 'CG'), (0, 'CD2')), ((0, 'HG'), (0, 'CD1'), (0, 'CD2'), (0, 'CG'))), '3MEP': (((0, 'HE1'), (0, 'NZ'), (0, 'CD1'), (0, 'CE1')), ((0, 'HE2'), (0, 'NZ'), (0, 'CD2'), (0, 'CE2')), ((0, 'HD2'), (0, 'CE2'), (0, 'CG'), (0, 'CD2')), ((0, 'HG'), (0, 'CD1'), (0, 'CD2'), (0, 'CG')), ((0, 'CD1'), (0, 'CE1'), (0, 'CG'), (0, 'CD3'))), '3ETP': (((0, 'HE1'), (0, 'NZ'), (0, 'CD1'), (0, 'CE1')), ((0, 'HE2'), (0, 'NZ'), (0, 'CD2'), (0, 'CE2')), ((0, 'HD2'), (0, 'CE2'), (0, 'CG'), (0, 'CD2')), ((0, 'HG'), (0, 'CD1'), (0, 'CD2'), (0, 'CG')), ((0, 'CD1'), (0, 'CE1'), (0, 'CG'), (0, 'CD3'))), '3BPY': (((0, 'HE1'), (0, 'NZ'), (0, 'CD1'), (0, 'CE1')), ((0, 'HG'), (0, 'CD1'), (0, 'CD2'), (0, 'CG')), ((0, 'HE2'), (0, 'NZ'), (0, 'CD2'), (0, 'CE2')), ((0, 'HD2'), (0, 'CE2'), (0, 'CG'), (0, 'CD2')), ((0, 'CD1'), (0, 'CE1'), (0, 'CG'), (0, 'CD3'))), '3CYP': (((0, 'HE1'), (0, 'NZ'), (0, 'CD1'), (0, 'CE1')), ((0, 'HE2'), (0, 'NZ'), (0, 'CD2'), (0, 'CE2')), ((0, 'HD2'), (0, 'CE2'), (0, 'CG'), (0, 'CD2')), ((0, 'HG'), (0, 'CD1'), (0, 'CD2'), (0, 'CG')), ((0, 'CD1'), (0, 'CE1'), (0, 'CG'), (0, 'C3N'))), '3ACP': (((0, 'HE1'), (0, 'NZ'), (0, 'CD1'), (0, 'CE1')), ((0, 'HE2'), (0, 'NZ'), (0, 'CD2'), (0, 'CE2')), ((0, 'HD2'), (0, 'CE2'), (0, 'CG'), (0, 'CD2')), ((0, 'HG'), (0, 'CD1'), (0, 'CD2'), (0, 'CG')), ((0, 'CD1'), (0, 'CE1'), (0, 'CG'), (0, 'C')), ((0, 'C'), (0, 'CD1'), (0, 'CH3'), (0, 'O'))), '3NAP': (((0, 'HE1'), (0, 'NZ'), (0, 'CD1'), (0, 'CE1')), ((0, 'HE2'), (0, 'NZ'), (0, 'CD2'), (0, 'CE2')), ((0, 'HD2'), (0, 'CE2'), (0, 'CG'), (0, 'CD2')), ((0, 'HG'), (0, 'CD1'), (0, 'CD2'), (0, 'CG')), ((0, 'CD1'), (0, 'CE1'), (0, 'CG'), (0, 'C')), ((0, 'C'), (0, 'CD1'), (0, 'N'), (0, 'O'))), '3CAP': (((0, 'HE1'), (0, 'NZ'), (0, 'CD1'), (0, 'CE1')), ((0, 'HE2'), (0, 'NZ'), (0, 'CD2'), (0, 'CE2')), ((0, 'HD2'), (0, 'CE2'), (0, 'CG'), (0, 'CD2')), ((0, 'HG'), (0, 'CD1'), (0, 'CD2'), (0, 'CG')), ((0, 'CD1'), (0, 'CE1'), (0, 'CG'), (0, 'CD3'))), '3PHP': (((0, 'HE1'), (0, 'NZ'), (0, 'CD1'), (0, 'CE1')), ((0, 'HE2'), (0, 'NZ'), (0, 'CD2'), (0, 'CE2')), ((0, 'HD2'), (0, 'CE2'), (0, 'CG'), (0, 'CD2')), ((0, 'HG'), (0, 'CD1'), (0, 'CD2'), (0, 'CG')), ((0, 'CD1'), (0, 'CE1'), (0, 'CG'), (0, 'CA1'))), '3BNP': (((0, 'HE1'), (0, 'NZ'), (0, 'CD1'), (0, 'CE1')), ((0, 'HE2'), (0, 'NZ'), (0, 'CD2'), (0, 'CE2')), ((0, 'HD2'), (0, 'CE2'), (0, 'CG'), (0, 'CD2')), ((0, 'HG'), (0, 'CD1'), (0, 'CD2'), (0, 'CG')), ((0, 'CD1'), (0, 'CE1'), (0, 'CG'), (0, 'C'))), 'MAS': (((0, 'C'), (0, 'C1'), (0, 'O'), (0, 'OM')),), 'ETAC': (((0, 'C'), (0, 'C1'), (0, 'O'), (0, 'OM')),), 'MPRO': (((0, 'C'), (0, 'C1'), (0, 'O'), (0, 'OM')),), 'ACHO': (((0, 'C'), (0, 'C7'), (0, 'O'), (0, 'OM')),), 'GLYC': (((0, 'C5'), (0, 'C7'), (0, 'O6'), (0, 'O4')), ((0, 'C9'), (0, 'C11'), (0, 'O10'), (0, 'O8'))), 'AAPM': (((0, 'C5'), (0, 'C7'), (0, 'O6'), (0, 'O4')), ((0, 'C9'), (0, 'C11'), (0, 'O10'), (0, 'O8'))), 'MBUT': (((0, 'C1'), (0, 'C2'), (0, 'O1'), (0, 'OM')),), 'CSAD': (((0, 'H62'), (0, 'C6'), (0, 'H61'), (0, 'N6')), ((0, 'N6'), (0, 'N1'), (0, 'C5'), (0, 'C6'))), 'CSGU': (((0, 'N2'), (0, 'N3'), (0, 'N1'), (0, 'C2')), ((0, 'O6'), (0, 'N1'), (0, 'C5'), (0, 'C6')), ((0, 'H22'), (0, 'H21'), (0, 'C2'), (0, 'N2'))), 'CSTH': (((0, 'O2'), (0, 'N1'), (0, 'N3'), (0, 'C2')), ((0, 'O4'), (0, 'N3'), (0, 'C5'), (0, 'C4')), ((0, 'C5M'), (0, 'C4'), (0, 'C6'), (0, 'C5'))), 'CSCY': (((0, 'O2'), (0, 'N1'), (0, 'N3'), (0, 'C2')), ((0, 'N4'), (0, 'N3'), (0, 'C5'), (0, 'C4')), ((0, 'H42'), (0, 'C4'), (0, 'H41'), (0, 'N4'))), 'CNAD': (((0, 'H62'), (0, 'C6'), (0, 'H61'), (0, 'N6')), ((0, 'N6'), (0, 'N1'), (0, 'C5'), (0, 'C6'))), 'CNGU': (((0, 'N2'), (0, 'N3'), (0, 'N1'), (0, 'C2')), ((0, 'O6'), (0, 'N1'), (0, 'C5'), (0, 'C6')), ((0, 'H22'), (0, 'H21'), (0, 'C2'), (0, 'N2'))), 'CNTH': (((0, 'O2'), (0, 'N1'), (0, 'N3'), (0, 'C2')), ((0, 'O4'), (0, 'N3'), (0, 'C5'), (0, 'C4')), ((0, 'C5M'), (0, 'C4'), (0, 'C6'), (0, 'C5'))), 'CNT1': (((0, 'O2'), (0, 'N1'), (0, 'N3'), (0, 'C2')), ((0, 'O4'), (0, 'N3'), (0, 'C5'), (0, 'C4')), ((0, 'C5M'), (0, 'C4'), (0, 'C6'), (0, 'C5'))), 'CNT2': (((0, 'O2'), (0, 'N1'), (0, 'N3'), (0, 'C2')), ((0, 'O4'), (0, 'N3'), (0, 'C5'), (0, 'C4')), ((0, 'C5M'), (0, 'C4'), (0, 'C6'), (0, 'C5'))), 'CNT3': (((0, 'O2'), (0, 'N1'), (0, 'N3'), (0, 'C2')), ((0, 'O4'), (0, 'N3'), (0, 'C5'), (0, 'C4')), ((0, 'C5M'), (0, 'C4'), (0, 'C6'), (0, 'C5'))), 'CNCY': (((0, 'O2'), (0, 'N1'), (0, 'N3'), (0, 'C2')), ((0, 'N4'), (0, 'N3'), (0, 'C5'), (0, 'C4')), ((0, 'H42'), (0, 'C4'), (0, 'H41'), (0, 'N4'))), 'THFI': (((0, 'ND1'), (0, 'CG'), (0, 'CE1'), (0, \"C1'\")), ((0, 'ND1'), (0, 'CE1'), (0, 'CG'), (0, \"C1'\")), ((0, 'CD2'), (0, 'CG'), (0, 'NE2'), (0, 'HD2')), ((0, 'CD2'), (0, 'NE2'), (0, 'CG'), (0, 'HD2')), ((0, 'CE1'), (0, 'ND1'), (0, 'NE2'), (0, 'HE1')), ((0, 'CE1'), (0, 'NE2'), (0, 'ND1'), (0, 'HE1')), ((0, 'CG'), (0, 'CD2'), (0, 'ND1'), (0, 'HG')), ((0, 'CG'), (0, 'ND1'), (0, 'CD2'), (0, 'HG'))), 'THMI': (((0, 'ND1'), (0, 'CG'), (0, 'CE1'), (0, \"C1'\")), ((0, 'ND1'), (0, 'CE1'), (0, 'CG'), (0, \"C1'\")), ((0, 'CD2'), (0, 'CG'), (0, 'NE2'), (0, 'HD2')), ((0, 'CD2'), (0, 'NE2'), (0, 'CG'), (0, 'HD2')), ((0, 'CE1'), (0, 'ND1'), (0, 'NE2'), (0, 'HE1')), ((0, 'CE1'), (0, 'NE2'), (0, 'ND1'), (0, 'HE1')), ((0, 'CG'), (0, 'CD2'), (0, 'ND1'), (0, 'HG')), ((0, 'CG'), (0, 'ND1'), (0, 'CD2'), (0, 'HG'))), 'TADE': (((0, 'C6'), (0, 'C5'), (0, 'N1'), (0, 'N6')), ((0, 'N6'), (0, 'H62'), (0, 'H61'), (0, 'C6'))), 'TCYT': (((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'N4')), ((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'O2')), ((0, 'N4'), (0, 'H42'), (0, 'H41'), (0, 'C4'))), 'TGUA': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'N2')), ((0, 'N2'), (0, 'H22'), (0, 'H21'), (0, 'C2')), ((0, 'C6'), (0, 'C5'), (0, 'N1'), (0, 'O6'))), 'TTHY': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'O2')), ((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'O4'))), 'TURA': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'O2')), ((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'O4'))), 'THAO': (((0, 'ND1'), (0, 'CG'), (0, 'CE1'), (0, \"C1'\")), ((0, 'ND1'), (0, 'CE1'), (0, 'CG'), (0, \"C1'\")), ((0, 'CD2'), (0, 'CG'), (0, 'NE2'), (0, 'HD2')), ((0, 'CD2'), (0, 'NE2'), (0, 'CG'), (0, 'HD2')), ((0, 'CE1'), (0, 'ND1'), (0, 'NE2'), (0, 'HE1')), ((0, 'CE1'), (0, 'NE2'), (0, 'ND1'), (0, 'HE1')), ((0, 'CG'), (0, 'CD2'), (0, 'ND1'), (0, 'HG')), ((0, 'CG'), (0, 'ND1'), (0, 'CD2'), (0, 'HG'))), 'NUSA': (((0, 'C6'), (0, 'C5'), (0, 'N1'), (0, 'N6')), ((0, 'N6'), (0, 'H62'), (0, 'H61'), (0, 'C6'))), 'NUSG': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'N2')), ((0, 'N2'), (0, 'H22'), (0, 'H21'), (0, 'C2')), ((0, 'C6'), (0, 'C5'), (0, 'N1'), (0, 'O6'))), 'NUSC': (((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'N4')), ((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'O2')), ((0, 'N4'), (0, 'H42'), (0, 'H41'), (0, 'C4'))), 'NUST': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'O2')), ((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'O4'))), 'NUSU': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'O2')), ((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'O4'))), 'RNUS': (((0, 'ND1'), (0, 'CG'), (0, 'CE1'), (0, \"C1'\")), ((0, 'ND1'), (0, 'CE1'), (0, 'CG'), (0, \"C1'\")), ((0, 'CD2'), (0, 'CG'), (0, 'NE2'), (0, 'HD2')), ((0, 'CD2'), (0, 'NE2'), (0, 'CG'), (0, 'HD2')), ((0, 'CE1'), (0, 'ND1'), (0, 'NE2'), (0, 'HE1')), ((0, 'CE1'), (0, 'NE2'), (0, 'ND1'), (0, 'HE1')), ((0, 'CG'), (0, 'CD2'), (0, 'ND1'), (0, 'HG')), ((0, 'CG'), (0, 'ND1'), (0, 'CD2'), (0, 'HG'))), 'RNUA': (((0, 'C6'), (0, 'C5'), (0, 'N1'), (0, 'N6')), ((0, 'N6'), (0, 'H62'), (0, 'H61'), (0, 'C6'))), 'RNUG': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'N2')), ((0, 'N2'), (0, 'H22'), (0, 'H21'), (0, 'C2')), ((0, 'C6'), (0, 'C5'), (0, 'N1'), (0, 'O6'))), 'RNUC': (((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'N4')), ((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'O2')), ((0, 'N4'), (0, 'H42'), (0, 'H41'), (0, 'C4'))), 'NUCL': (((0, 'ND1'), (0, 'CG'), (0, 'CE1'), (0, \"C1'\")), ((0, 'ND1'), (0, 'CE1'), (0, 'CG'), (0, \"C1'\")), ((0, 'CD2'), (0, 'CG'), (0, 'NE2'), (0, 'HD2')), ((0, 'CD2'), (0, 'NE2'), (0, 'CG'), (0, 'HD2')), ((0, 'CE1'), (0, 'ND1'), (0, 'NE2'), (0, 'HE1')), ((0, 'CE1'), (0, 'NE2'), (0, 'ND1'), (0, 'HE1')), ((0, 'CG'), (0, 'CD2'), (0, 'ND1'), (0, 'HG')), ((0, 'CG'), (0, 'ND1'), (0, 'CD2'), (0, 'HG'))), 'NADE': (((0, 'C6'), (0, 'C5'), (0, 'N1'), (0, 'N6')), ((0, 'N6'), (0, 'H62'), (0, 'H61'), (0, 'C6'))), 'NTHY': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'O2')), ((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'O4'))), 'NIC': (((0, 'C12'), (0, 'N14'), (0, 'C9'), (0, 'O13')), ((0, 'C12'), (0, 'C9'), (0, 'N14'), (0, 'O13')), ((0, 'N14'), (0, 'C12'), (0, 'H16'), (0, 'H15')), ((0, 'N14'), (0, 'C12'), (0, 'H15'), (0, 'H16')), ((0, 'N2'), (0, 'C10'), (0, 'C3'), (0, 'H1')), ((0, 'C3'), (0, 'N2'), (0, 'C5'), (0, 'H4')), ((0, 'C5'), (0, 'C3'), (0, 'C7'), (0, 'H6')), ((0, 'C7'), (0, 'C5'), (0, 'C9'), (0, 'H8')), ((0, 'C10'), (0, 'C9'), (0, 'N2'), (0, 'H11'))), 'NICH': (((0, 'C12'), (0, 'N14'), (0, 'C9'), (0, 'O13')), ((0, 'C12'), (0, 'C9'), (0, 'N14'), (0, 'O13')), ((0, 'N14'), (0, 'C12'), (0, 'H16'), (0, 'H15')), ((0, 'N14'), (0, 'C12'), (0, 'H15'), (0, 'H16')), ((0, 'N2'), (0, 'C10'), (0, 'C3'), (0, 'H1')), ((0, 'C3'), (0, 'N2'), (0, 'C5'), (0, 'H4')), ((0, 'C5'), (0, 'C3'), (0, 'C7'), (0, 'H6')), ((0, 'C10'), (0, 'C9'), (0, 'N2'), (0, 'H11'))), 'AMP': (((0, 'N6'), (0, 'C6'), (0, 'H61'), (0, 'H62')), ((0, 'C6'), (0, 'N1'), (0, 'C5'), (0, 'N6'))), 'ADP': (((0, 'N6'), (0, 'C6'), (0, 'H61'), (0, 'H62')), ((0, 'C6'), (0, 'N1'), (0, 'C5'), (0, 'N6'))), 'ATP': (((0, 'N6'), (0, 'C6'), (0, 'H61'), (0, 'H62')), ((0, 'C6'), (0, 'N1'), (0, 'C5'), (0, 'N6'))), 'NAD': (((0, 'N6A'), (0, 'C6A'), (0, 'H61A'), (0, 'H62A')), ((0, 'C6A'), (0, 'N1A'), (0, 'C5A'), (0, 'N6A')), ((0, 'C7N'), (0, 'N7N'), (0, 'C3N'), (0, 'O7N')), ((0, 'C7N'), (0, 'C3N'), (0, 'N7N'), (0, 'O7N')), ((0, 'N7N'), (0, 'C7N'), (0, 'H71N'), (0, 'H72N')), ((0, 'N7N'), (0, 'C7N'), (0, 'H72N'), (0, 'H71N')), ((0, 'C6N'), (0, 'N1N'), (0, 'C5N'), (0, 'HN6')), ((0, 'C5N'), (0, 'C6N'), (0, 'C4N'), (0, 'H5N')), ((0, 'C4N'), (0, 'C5N'), (0, 'C3N'), (0, 'H41N')), ((0, 'C2N'), (0, 'C3N'), (0, 'N1N'), (0, 'H2N'))), 'NADH': (((0, 'AN6'), (0, 'AC6'), (0, 'AH61'), (0, 'AH62')), ((0, 'AC6'), (0, 'AN1'), (0, 'AC5'), (0, 'AN6')), ((0, 'NC7'), (0, 'NN7'), (0, 'NC3'), (0, 'NO7')), ((0, 'NC7'), (0, 'NC3'), (0, 'NN7'), (0, 'NO7')), ((0, 'NN7'), (0, 'NC7'), (0, 'NH71'), (0, 'NH72')), ((0, 'NN7'), (0, 'NC7'), (0, 'NH72'), (0, 'NH71')), ((0, 'NC6'), (0, 'NN1'), (0, 'NC5'), (0, 'NH6')), ((0, 'NC5'), (0, 'NC6'), (0, 'NC4'), (0, 'NH5')), ((0, 'NC4'), (0, 'NC5'), (0, 'NC3'), (0, 'NH4')), ((0, 'NC2'), (0, 'NC3'), (0, 'NN1'), (0, 'NH2'))), 'NADP': (((0, 'AN6'), (0, 'AC6'), (0, 'AH61'), (0, 'AH62')), ((0, 'AC6'), (0, 'AN1'), (0, 'AC5'), (0, 'AN6')), ((0, 'NC7'), (0, 'NN7'), (0, 'NC3'), (0, 'NO7')), ((0, 'NC7'), (0, 'NC3'), (0, 'NN7'), (0, 'NO7')), ((0, 'NN7'), (0, 'NC7'), (0, 'NH71'), (0, 'NH72')), ((0, 'NN7'), (0, 'NC7'), (0, 'NH72'), (0, 'NH71')), ((0, 'NC6'), (0, 'NN1'), (0, 'NC5'), (0, 'NH6')), ((0, 'NC5'), (0, 'NC6'), (0, 'NC4'), (0, 'NH5')), ((0, 'NC4'), (0, 'NC5'), (0, 'NC3'), (0, 'NH4')), ((0, 'NC2'), (0, 'NC3'), (0, 'NN1'), (0, 'NH2'))), 'NDPH': (((0, 'AN6'), (0, 'AC6'), (0, 'AH61'), (0, 'AH62')), ((0, 'AC6'), (0, 'AN1'), (0, 'AC5'), (0, 'AN6')), ((0, 'NC7'), (0, 'NN7'), (0, 'NC3'), (0, 'NO7')), ((0, 'NC7'), (0, 'NC3'), (0, 'NN7'), (0, 'NO7')), ((0, 'NN7'), (0, 'NC7'), (0, 'NH71'), (0, 'NH72')), ((0, 'NN7'), (0, 'NC7'), (0, 'NH72'), (0, 'NH71')), ((0, 'NC6'), (0, 'NN1'), (0, 'NC5'), (0, 'NH6')), ((0, 'NC5'), (0, 'NC6'), (0, 'NC4'), (0, 'NH5')), ((0, 'NC4'), (0, 'NC5'), (0, 'NC3'), (0, 'NH4')), ((0, 'NC2'), (0, 'NC3'), (0, 'NN1'), (0, 'NH2'))), 'MAM1': (((0, 'N1'), (0, 'HN2'), (0, 'HN1'), (0, 'C1')),), 'SAH': (((0, 'N6'), (0, 'H62'), (0, 'H61'), (0, 'C6')), ((0, 'C6'), (0, 'C5'), (0, 'N1'), (0, 'N6')), ((0, 'C'), (0, 'OT1'), (0, 'OT2'), (0, 'CA'))), 'BF6': (((0, 'C1'), (0, 'CZ1'), (0, 'C2'), (0, 'O1')), ((0, 'C3'), (0, 'CZ2'), (0, 'C4'), (0, 'O3'))), 'BF7': (((0, 'C1'), (0, 'C2'), (0, 'CZ1'), (0, 'O1')), ((0, 'C2'), (0, 'O2B'), (0, 'O2A'), (0, 'C1')), ((0, 'C3'), (0, 'C4'), (0, 'CZ2'), (0, 'O3')), ((0, 'C4'), (0, 'O4B'), (0, 'O4A'), (0, 'C3'))), 'BCA': (((0, 'C1'), (0, 'O1B'), (0, 'O1A'), (0, 'CZ1')), ((0, 'C2'), (0, 'O2B'), (0, 'O2A'), (0, 'CZ2'))), 'C36': (((0, 'C1'), (0, 'CZ1'), (0, 'C2'), (0, 'O1')), ((0, 'C3'), (0, 'CZ2'), (0, 'C4'), (0, 'O3'))), 'C37': (((0, 'C1'), (0, 'C2'), (0, 'CZ1'), (0, 'O1')), ((0, 'C2'), (0, 'O2B'), (0, 'O2A'), (0, 'C1')), ((0, 'C3'), (0, 'C4'), (0, 'CZ2'), (0, 'O3')), ((0, 'C4'), (0, 'O4B'), (0, 'O4A'), (0, 'C3'))), 'C3C': (((0, 'C1'), (0, 'O1B'), (0, 'O1A'), (0, 'CZ1')), ((0, 'C2'), (0, 'O2B'), (0, 'O2A'), (0, 'CZ2'))), 'PRAL': (((0, 'CG'), (0, 'C2'), (0, 'OD1'), (0, 'H')),), 'UREA': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'O2')),), 'MGU1': (((0, 'C'), (0, 'N2'), (0, 'N1'), (0, 'N3')), ((0, 'N1'), (0, 'H11'), (0, 'H12'), (0, 'C')), ((0, 'N2'), (0, 'H21'), (0, 'H22'), (0, 'C'))), 'MGU2': (((0, 'C'), (0, 'N2'), (0, 'N1'), (0, 'N3')), ((0, 'N3'), (0, 'C4'), (0, 'C'), (0, 'H31')), ((0, 'N2'), (0, 'H21'), (0, 'H22'), (0, 'C'))), 'HDZ1': (((0, 'C2'), (0, 'C1'), (0, 'N3'), (0, 'O2')), ((0, 'C5'), (0, 'C6'), (0, 'N4'), (0, 'H5'))), 'HDZ2': (((0, 'C2'), (0, 'CZ2'), (0, 'N3'), (0, 'O2')), ((0, 'C5'), (0, 'CPG'), (0, 'N4'), (0, 'H5'))), 'CA': (((0, 'CD'), (0, 'OE2'), (0, 'OE1'), (0, 'C23')),), 'DCA': (((0, 'CD'), (0, 'OE2'), (0, 'OE1'), (0, 'C23')),), 'LCA': (((0, 'CD'), (0, 'OE2'), (0, 'OE1'), (0, 'C23')),), 'CDCA': (((0, 'CD'), (0, 'OE2'), (0, 'OE1'), (0, 'C23')),), 'UDCA': (((0, 'CD'), (0, 'OE2'), (0, 'OE1'), (0, 'C23')),), 'GA': (((0, 'C24'), (0, 'C23'), (0, 'N'), (0, 'O24')), ((0, 'CA'), (0, 'OA2'), (0, 'OA1'), (0, 'CC1')), ((0, 'CG'), (0, 'OG2'), (0, 'OG1'), (0, 'CC3'))), 'BAB1': (((0, 'C24'), (0, 'C23'), (0, 'N'), (0, 'O24')), ((0, 'CA'), (0, 'OA2'), (0, 'OA1'), (0, 'CC1')), ((0, 'CG'), (0, 'CC3'), (0, 'NT'), (0, 'OG'))), 'FBIB': (((0, 'CD'), (0, 'OD2'), (0, 'OD1'), (0, 'CA')),), '2PDO': (((0, 'C2'), (0, 'C3'), (0, 'N1'), (0, 'O2')),), 'ACO': (((0, 'C1'), (0, 'C2'), (0, 'C3'), (0, 'O1')),), 'IPAA': (((0, 'C'), (0, 'CL'), (0, 'N'), (0, 'O')),), 'AMOP': (((0, 'C2'), (0, 'O2'), (0, 'O1'), (0, 'C1')),), '2MPA': (((0, 'CG'), (0, 'CM'), (0, 'NT'), (0, 'OG')),), '2AMP': (((0, 'C'), (0, 'CM'), (0, 'NE'), (0, 'O')), ((0, 'CE1'), (0, 'CD1'), (0, 'NZ'), (0, 'NE'))), '3AMP': (((0, 'C'), (0, 'CM'), (0, 'ND'), (0, 'O')),), '2AMF': (((0, 'C'), (0, 'CM'), (0, 'N'), (0, 'O')),), 'GABD': (((0, 'C24'), (0, 'C23'), (0, 'N'), (0, 'O24')), ((0, 'CA'), (0, 'OA2'), (0, 'OA1'), (0, 'CC1')), ((0, 'CG'), (0, 'CC3'), (0, 'NG'), (0, 'OG'))), 'AMOL': (((0, 'C2'), (0, 'O2'), (0, 'O1'), (0, 'C1')),), '9MAD': (((0, 'C6'), (0, 'C5'), (0, 'N1'), (0, 'N6')), ((0, 'N6'), (0, 'H62'), (0, 'H61'), (0, 'C6'))), '1MTH': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'O2')), ((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'O4'))), 'FORA': (((0, 'C1'), (0, 'O2'), (0, 'O3'), (0, 'H4')),), 'BTON': (((0, 'C1'), (0, 'C3'), (0, 'C2'), (0, 'O1')),), 'CHON': (((0, 'C1'), (0, 'C2'), (0, 'C6'), (0, 'O1')),), 'DMTT': (((0, 'C'), (0, 'S1'), (0, 'S2'), (0, 'S')),), 'DMCB': (((0, 'C3'), (0, 'N2'), (0, 'O31'), (0, 'O32')),), 'DECB': (((0, 'C4'), (0, 'N3'), (0, 'O41'), (0, 'O42')),), 'FORH': (((0, 'C'), (0, 'O2'), (0, 'O1'), (0, 'H')),), 'DMA': (((0, 'C'), (0, 'C1'), (0, 'N'), (0, 'O')),), 'DMF': (((0, 'C'), (0, 'N'), (0, 'O'), (0, 'HA')),), 'MRDN': (((0, 'C2'), (0, 'N3'), (0, 'S2'), (0, 'S1')), ((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'O4'))), 'MEOI': (((0, 'C7'), (0, 'C6'), (0, 'N8'), (0, 'O7')),), 'OIRD': (((0, 'C2'), (0, 'N3'), (0, 'S2'), (0, 'S1')), ((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'O4')), ((0, 'C7'), (0, 'C6'), (0, 'N8'), (0, 'O7'))), 'BAB2': (((0, 'C24'), (0, 'C23'), (0, 'N'), (0, 'O24')), ((0, 'CA'), (0, 'OA2'), (0, 'OA1'), (0, 'CC1')), ((0, 'CG'), (0, 'CC3'), (0, 'NT'), (0, 'OG'))), 'DMCA': (((0, 'C'), (0, 'O1'), (0, 'O2'), (0, 'O')),), 'DECA': (((0, 'C'), (0, 'O1'), (0, 'O2'), (0, 'O')),), 'URAC': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'O2')), ((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'O4'))), '2PYO': (((0, 'C2'), (0, 'C3'), (0, 'N1'), (0, 'O2')),), 'HDZ1B': (((0, 'C2'), (0, 'C1'), (0, 'N3'), (0, 'O2')), ((0, 'C5'), (0, 'C6G'), (0, 'N4'), (0, 'H5'))), 'PHMK': (((0, 'C2'), (0, 'C3'), (0, 'C1'), (0, 'O2')),), 'PHEK': (((0, 'C3'), (0, 'C4'), (0, 'C2'), (0, 'O3')),), 'BEON': (((0, 'C2'), (0, 'C3'), (0, 'C1'), (0, 'O2')),), 'AMDN': (((0, 'C1'), (0, 'N9'), (0, 'N6'), (0, 'C2')),), 'BAMI': (((0, 'C12'), (0, 'N16'), (0, 'N13'), (0, 'C11')),), 'PNTM': (((0, 'C24'), (0, 'N28'), (0, 'N25'), (0, 'C23')), ((0, 'C45'), (0, 'N49'), (0, 'N46'), (0, 'C44'))), 'MHYO': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'O2')), ((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'O4'))), 'OIHY': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'O2')), ((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'O4')), ((0, 'C7'), (0, 'C6'), (0, 'N8'), (0, 'O7'))), 'MOET': (((0, 'C2'), (0, 'C1'), (0, 'O3'), (0, 'H21')),), 'MOBU': (((0, 'C1'), (0, 'C2'), (0, 'O1'), (0, 'H11')),), 'MTDO': (((0, 'C2'), (0, 'N3'), (0, 'O2'), (0, 'S1')), ((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'O4'))), 'AMET': (((0, 'C4'), (0, 'C1'), (0, 'N6'), (0, 'H5')),), 'NIME': (((0, 'N2'), (0, 'O21'), (0, 'O22'), (0, 'C1')),), 'NIPR': (((0, 'N1'), (0, 'O11'), (0, 'O12'), (0, 'C1')),), 'AZDO': (((0, 'C2'), (0, 'C3'), (0, 'N1'), (0, 'O2')),), 'ZOIC': (((0, 'C7'), (0, 'C1'), (0, 'O7'), (0, 'O8')),), 'MBOA': (((0, 'C7'), (0, 'C1'), (0, 'O7'), (0, 'O8')),), 'YTHY': (((0, 'C8'), (0, 'C5'), (0, 'N9'), (0, 'O8')), ((0, 'C10'), (0, 'N9'), (0, 'N11'), (0, 'O10'))), 'RIN': (((0, 'C2'), (0, 'C3'), (0, 'O2'), (0, 'O1')),), 'YTS2': (((0, 'C8'), (0, 'C5'), (0, 'N9'), (0, 'S8')), ((0, 'C10'), (0, 'N9'), (0, 'N11'), (0, 'S10'))), 'YT4S': (((0, 'C8'), (0, 'C5'), (0, 'N9'), (0, 'O8')), ((0, 'C10'), (0, 'N11'), (0, 'N9'), (0, 'S10'))), 'YT2S': (((0, 'C8'), (0, 'C5'), (0, 'N9'), (0, 'S8')), ((0, 'C10'), (0, 'N9'), (0, 'N11'), (0, 'O10'))), 'TC243C': (((0, 'C8'), (0, 'C5'), (0, 'N9'), (0, 'O8')),), '4PYO': (((0, 'C1'), (0, 'C21'), (0, 'C22'), (0, 'O1')),), '1PH4PO': (((0, 'C4'), (0, 'C3'), (0, 'C5'), (0, 'O4')),), '21QU': (((0, 'C10'), (0, 'C9'), (0, 'N11'), (0, 'O10')),), '1PH2PO': (((0, 'C2'), (0, 'C3'), (0, 'N1'), (0, 'O2')),), '3PHURA': (((0, 'C2'), (0, 'C3'), (0, 'N1'), (0, 'O2')), ((0, 'C6'), (0, 'N5'), (0, 'N1'), (0, 'O6'))), 'URA2S': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'S2')), ((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'O4'))), '3PH2SR': (((0, 'C2'), (0, 'C3'), (0, 'N1'), (0, 'O2')), ((0, 'C6'), (0, 'N5'), (0, 'N1'), (0, 'S6'))), 'URA4S': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'O2')), ((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'S4'))), '3PH4SR': (((0, 'C2'), (0, 'C3'), (0, 'N1'), (0, 'S2')), ((0, 'C6'), (0, 'N5'), (0, 'N1'), (0, 'O6'))), 'URA24S': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'S2')), ((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'S4'))), '3PH24S': (((0, 'C2'), (0, 'C3'), (0, 'N1'), (0, 'S2')), ((0, 'C6'), (0, 'N5'), (0, 'N1'), (0, 'S6'))), '43HPY': (((0, 'C1'), (0, 'C6'), (0, 'N2'), (0, 'O1')),), '43PPY': (((0, 'C2'), (0, 'C3'), (0, 'N1'), (0, 'O2')),), '43HSPY': (((0, 'C1'), (0, 'C6'), (0, 'N2'), (0, 'S1')),), '43HSPP': (((0, 'C2'), (0, 'C3'), (0, 'N1'), (0, 'S2')),), '4O2SM': (((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'O4')),), 'NZAD': (((0, 'C9'), (0, 'C10'), (0, 'N8'), (0, 'O9')),), 'NACT': (((0, 'C'), (0, 'C3'), (0, 'N'), (0, 'O')),), 'CO31': (((0, 'C'), (0, 'O1'), (0, 'O2'), (0, 'O3')),), 'GBL': (((0, 'C2'), (0, 'C3'), (0, 'O2'), (0, 'O1')),), 'B2FO': (((0, 'C2'), (0, 'C3'), (0, 'O6'), (0, 'O1')),), 'A2FO': (((0, 'C2'), (0, 'C3'), (0, 'O6'), (0, 'O1')),), 'MT2A': (((0, 'C3'), (0, 'N5'), (0, 'N4'), (0, 'S2')),), 'DH3T': (((0, 'C2'), (0, 'N4'), (0, 'N3'), (0, 'S1')),), 'EEPI': (((0, 'C5'), (0, 'C6'), (0, 'N4'), (0, 'H51')),), 'PYO2B': (((0, 'C1'), (0, 'C2'), (0, 'N6'), (0, 'O7')),), 'PYO3B': (((0, 'C6'), (0, 'C5'), (0, 'N1'), (0, 'O7')),), 'PYO2F': (((0, 'C1'), (0, 'C2'), (0, 'N6'), (0, 'O7')),), 'PYO3F': (((0, 'C6'), (0, 'C5'), (0, 'N1'), (0, 'O7')),), 'BTMC': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'O2')), ((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'N4'))), 'BM6A': (((0, 'C6'), (0, 'C5'), (0, 'N1'), (0, 'N6')),), 'CBHH': (((0, 'C7'), (0, 'N3'), (0, 'N4'), (0, 'O9')), ((0, 'C8'), (0, 'N5'), (0, 'N6'), (0, 'O10'))), 'WEI1': (((0, 'C13'), (0, 'C6'), (0, 'N4'), (0, 'O3')),), 'WEI2': (((0, 'C14'), (0, 'N2'), (0, 'N3'), (0, 'O3')),), 'MSCH': (((0, 'C8'), (0, 'C9'), (0, 'N'), (0, 'O')),), 'WEI3': (((0, 'C8'), (0, 'C9'), (0, 'N1'), (0, 'O1')),), 'INCA': (((0, 'C9'), (0, 'C8'), (0, 'N3'), (0, 'O')),), 'TICA': (((0, 'C9'), (0, 'N1'), (0, 'N2'), (0, 'O')),), 'GTPG': (((0, 'N2'), (0, 'H22'), (0, 'H21'), (0, 'C2')), ((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'N2')), ((0, 'C6'), (0, 'C5'), (0, 'N1'), (0, 'O6'))), 'GTGN': (((0, 'N2'), (0, 'H22'), (0, 'H21'), (0, 'C2')), ((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'N2')), ((0, 'C6'), (0, 'C5'), (0, 'N1'), (0, 'O6'))), 'GTSS': (((0, 'N2'), (0, 'H22'), (0, 'H21'), (0, 'C2')), ((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'N2')), ((0, 'C6'), (0, 'C5'), (0, 'N1'), (0, 'O6'))), 'GTNS': (((0, 'N2'), (0, 'H22'), (0, 'H21'), (0, 'C2')), ((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'N2')), ((0, 'C6'), (0, 'C5'), (0, 'N1'), (0, 'O6'))), '2OXT': (((0, 'C2'), (0, 'C3'), (0, 'O2'), (0, 'O1')),), '3OXT': (((0, 'C3'), (0, 'C1'), (0, 'C2'), (0, 'O2')), ((0, 'C3'), (0, 'C2'), (0, 'C1'), (0, 'O2'))), 'PRF': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'N2')), ((0, 'C6'), (0, 'C5'), (0, 'N1'), (0, 'O6')), ((0, 'N2'), (0, 'H10'), (0, 'H9'), (0, 'C2'))), 'B2SU': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'S2')), ((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'O4'))), 'B4SU': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'O2')), ((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'S4'))), 'B52U': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'S2')), ((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'O4'))), 'BH2U': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'O2')), ((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'O4'))), 'BMDU': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'O2')), ((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'O4'))), 'B5HU': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'O2')), ((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'O4'))), 'BMOU': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'O2')), ((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'O4'))), 'B3MU': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'O2')), ((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'O4'))), 'BCYU': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'O2')), ((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'O4'))), 'BPSU': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'O2')), ((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'O4'))), 'B1MP': (((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'O4')), ((0, 'C2'), (0, 'N3'), (0, 'N1'), (0, 'O2'))), 'B3MP': (((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'O4')), ((0, 'C2'), (0, 'N3'), (0, 'N1'), (0, 'O2'))), 'BSAU': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'S2')), ((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'O4'))), 'B5AU': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'O2')), ((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'O4'))), 'BU8U': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'S2')), ((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'O4'))), 'BSEU': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'SE2')), ((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'O4'))), 'B5DU': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'O2')), ((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'O4')), ((0, 'C10'), (0, 'O11'), (0, 'O12'), (0, 'C9'))), 'BSCU': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'S2')), ((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'O4')), ((0, 'C10'), (0, 'O11'), (0, 'O12'), (0, 'C9'))), 'BIAU': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'O2')), ((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'O4'))), 'BISU': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'S2')), ((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'O4'))), 'B5CU': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'O2')), ((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'O4')), ((0, 'C8'), (0, 'O82'), (0, 'O81'), (0, 'C7'))), 'BOCU': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'O2')), ((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'O4')), ((0, 'C8'), (0, 'C7'), (0, 'O8'), (0, 'O9'))), 'B70U': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'S2')), ((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'O4')), ((0, 'C8'), (0, 'C5M'), (0, 'O8'), (0, 'O9'))), 'BBCU': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'O2')), ((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'O4')), ((0, 'C8'), (0, 'C7'), (0, 'N8'), (0, 'O8'))), 'BHCU': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'O2')), ((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'O4')), ((0, 'C8'), (0, 'O82'), (0, 'O81'), (0, 'C7'))), 'BCMU': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'O2')), ((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'O4')), ((0, 'C8'), (0, 'C7'), (0, 'O8'), (0, 'O9'))), 'BOAU': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'O2')), ((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'O4')), ((0, 'C9'), (0, 'O92'), (0, 'O91'), (0, 'C8'))), 'BOEU': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'O2')), ((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'O4')), ((0, 'C9'), (0, 'C8'), (0, 'O9'), (0, 'O10'))), 'B3AU': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'O2')), ((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'O4')), ((0, 'C13'), (0, 'O30'), (0, 'O31'), (0, 'C12'))), 'B13P': (((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'O4')), ((0, 'C2'), (0, 'N3'), (0, 'N1'), (0, 'O2')), ((0, 'C13'), (0, 'O31'), (0, 'O30'), (0, 'C12'))), 'B5TU': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'O2')), ((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'O4'))), 'BSTU': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'S2')), ((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'O4'))), 'BGAU': (((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'O4')),), 'BGCU': (((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'O4')), ((0, 'C10'), (0, 'O11'), (0, 'O12'), (0, 'C9'))), 'B2SC': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'S2')), ((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'N4')), ((0, 'N4'), (0, 'H41'), (0, 'H42'), (0, 'C4'))), 'B5MC': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'O2')), ((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'N4')), ((0, 'N4'), (0, 'H41'), (0, 'H42'), (0, 'C4'))), 'BHMC': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'O2')), ((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'N4')), ((0, 'N4'), (0, 'H41'), (0, 'H42'), (0, 'C4'))), 'B5FC': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'O2')), ((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'N4')), ((0, 'N4'), (0, 'H41'), (0, 'H42'), (0, 'C4')), ((0, 'C7'), (0, 'C5'), (0, 'O7'), (0, 'H7'))), 'B4MC': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'O2')), ((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'N4'))), 'B4AC': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'O2')), ((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'N4')), ((0, 'C7'), (0, 'C8'), (0, 'N4'), (0, 'O7'))), 'B3MC': (((0, 'C2'), (0, 'N3'), (0, 'N1'), (0, 'O2')), ((0, 'C4'), (0, 'N3'), (0, 'N4'), (0, 'C5')), ((0, 'N4'), (0, 'H41'), (0, 'H42'), (0, 'C4'))), 'B1PC': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'N2')), ((0, 'N2'), (0, 'H22'), (0, 'H21'), (0, 'C2')), ((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'O4'))), 'B3PC': (((0, 'C2'), (0, 'N3'), (0, 'N1'), (0, 'N2')), ((0, 'N2'), (0, 'H22'), (0, 'H21'), (0, 'C2')), ((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'O4'))), 'B6MA': (((0, 'C6'), (0, 'C5'), (0, 'N1'), (0, 'N6')),), 'B2MA': (((0, 'N6'), (0, 'H61'), (0, 'H62'), (0, 'C6')), ((0, 'C6'), (0, 'C5'), (0, 'N1'), (0, 'N6'))), 'B8MA': (((0, 'N6'), (0, 'H61'), (0, 'H62'), (0, 'C6')), ((0, 'C6'), (0, 'C5'), (0, 'N1'), (0, 'N6'))), 'BINO': (((0, 'C6'), (0, 'C5'), (0, 'N1'), (0, 'O6')),), 'B1MI': (((0, 'C6'), (0, 'C5'), (0, 'N1'), (0, 'O6')),), 'BSMA': (((0, 'C6'), (0, 'C5'), (0, 'N1'), (0, 'N6')),), 'B6AA': (((0, 'C10'), (0, 'C11'), (0, 'N6'), (0, 'O10')), ((0, 'C6'), (0, 'C5'), (0, 'N1'), (0, 'N6'))), 'B1MA': (((0, 'C6'), (0, 'N1'), (0, 'N6'), (0, 'C5')), ((0, 'N6'), (0, 'H62'), (0, 'H61'), (0, 'C6'))), 'B6IA': (((0, 'C6'), (0, 'C5'), (0, 'N1'), (0, 'N6')),), 'BHIA': (((0, 'C6'), (0, 'C5'), (0, 'N1'), (0, 'N6')),), 'BMIA': (((0, 'C6'), (0, 'C5'), (0, 'N1'), (0, 'N6')),), 'BSIA': (((0, 'C6'), (0, 'C5'), (0, 'N1'), (0, 'N6')),), 'BHNA': (((0, 'C10'), (0, 'N6'), (0, 'N11'), (0, 'O10')), ((0, 'C13'), (0, 'ODB'), (0, 'ODA'), (0, 'C12')), ((0, 'C6'), (0, 'C5'), (0, 'N1'), (0, 'N6'))), 'B26A': (((0, 'C10'), (0, 'N6'), (0, 'N11'), (0, 'O10')), ((0, 'C13'), (0, 'ODB'), (0, 'ODA'), (0, 'C12')), ((0, 'C6'), (0, 'C5'), (0, 'N1'), (0, 'N6'))), 'B66A': (((0, 'C10'), (0, 'N6'), (0, 'N11'), (0, 'O10')), ((0, 'C13'), (0, 'ODB'), (0, 'ODA'), (0, 'C12')), ((0, 'C6'), (0, 'C5'), (0, 'N1'), (0, 'N6'))), 'BT6A': (((0, 'C10'), (0, 'N6'), (0, 'N11'), (0, 'O10')), ((0, 'C13'), (0, 'ODB'), (0, 'ODA'), (0, 'C12')), ((0, 'C6'), (0, 'C5'), (0, 'N1'), (0, 'N6'))), 'B12A': (((0, 'C10'), (0, 'N6'), (0, 'N11'), (0, 'O10')), ((0, 'C13'), (0, 'ODB'), (0, 'ODA'), (0, 'C12')), ((0, 'C6'), (0, 'C5'), (0, 'N1'), (0, 'N6'))), 'B6GA': (((0, 'C10'), (0, 'N6'), (0, 'N11'), (0, 'O10')), ((0, 'C13'), (0, 'ODB'), (0, 'ODA'), (0, 'C12')), ((0, 'C6'), (0, 'C5'), (0, 'N1'), (0, 'N6'))), 'B1MG': (((0, 'C6'), (0, 'C5'), (0, 'N1'), (0, 'O6')), ((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'N2')), ((0, 'N2'), (0, 'H22'), (0, 'H21'), (0, 'C2'))), 'B2MG': (((0, 'C6'), (0, 'C5'), (0, 'N1'), (0, 'O6')), ((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'N2'))), 'B7MG': (((0, 'C6'), (0, 'C5'), (0, 'N1'), (0, 'O6')), ((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'N2')), ((0, 'N2'), (0, 'H22'), (0, 'H21'), (0, 'C2'))), 'B27G': (((0, 'C6'), (0, 'C5'), (0, 'N1'), (0, 'O6')), ((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'N2'))), 'BDCG': (((0, 'C6'), (0, 'C5'), (0, 'N1'), (0, 'O6')), ((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'N2')), ((0, 'N2'), (0, 'H22'), (0, 'H21'), (0, 'C2'))), 'BRCG': (((0, 'C6'), (0, 'C5'), (0, 'N1'), (0, 'O6')), ((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'N2')), ((0, 'N2'), (0, 'H22'), (0, 'H21'), (0, 'C2')), ((0, 'C10'), (0, 'N12'), (0, 'N11'), (0, 'C7'))), 'BDAG': (((0, 'C6'), (0, 'C5'), (0, 'N1'), (0, 'O6')), ((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'N2')), ((0, 'N2'), (0, 'H22'), (0, 'H21'), (0, 'C2'))), 'BQUG': (((0, 'C6'), (0, 'C5'), (0, 'N1'), (0, 'O6')), ((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'N2')), ((0, 'N2'), (0, 'H22'), (0, 'H21'), (0, 'C2'))), 'BEQG': (((0, 'C6'), (0, 'C5'), (0, 'N1'), (0, 'O6')), ((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'N2')), ((0, 'N2'), (0, 'H22'), (0, 'H21'), (0, 'C2'))), 'BDWG': (((0, 'C6'), (0, 'C5'), (0, 'N1'), (0, 'O6')),), 'BIMG': (((0, 'C6'), (0, 'C5'), (0, 'N1'), (0, 'O6')),), 'BIWG': (((0, 'C6'), (0, 'C5'), (0, 'N1'), (0, 'O6')),), 'BMWG': (((0, 'C6'), (0, 'C5'), (0, 'N1'), (0, 'O6')),), 'BYYG': (((0, 'C6'), (0, 'C5'), (0, 'N1'), (0, 'O6')), ((0, 'C16'), (0, 'C15'), (0, 'O17'), (0, 'O18')), ((0, 'C21'), (0, 'N20'), (0, 'O22'), (0, 'O23'))), 'BHWG': (((0, 'C6'), (0, 'C5'), (0, 'N1'), (0, 'O6')), ((0, 'C16'), (0, 'C15'), (0, 'O17'), (0, 'O18')), ((0, 'C21'), (0, 'N20'), (0, 'O22'), (0, 'O23'))), 'BPBG': (((0, 'C6'), (0, 'C5'), (0, 'N1'), (0, 'O6')), ((0, 'C17'), (0, 'C16'), (0, 'O17'), (0, 'O18')), ((0, 'C21'), (0, 'N20'), (0, 'O22'), (0, 'O23'))), 'BBUG': (((0, 'C6'), (0, 'C5'), (0, 'N1'), (0, 'O6')), ((0, 'C17'), (0, 'O17'), (0, 'O18'), (0, 'C15'))), '7MIP': (((0, 'C10'), (0, 'N12'), (0, 'N11'), (0, 'C7')),), 'M6PA': (((0, 'C6'), (0, 'C5'), (0, 'N1'), (0, 'N6')), ((0, 'C10'), (0, 'C11'), (0, 'N6'), (0, 'O10'))), 'MOAC': (((0, 'C8'), (0, 'C7'), (0, 'O8'), (0, 'O9')),), '5FOP': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'O2')), ((0, 'C7'), (0, 'C5'), (0, 'O7'), (0, 'H7'))), 'PESU': (((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'O4')),), 'CMBZ': (((0, 'C8'), (0, 'C7'), (0, 'O8'), (0, 'O9')),), 'PRNC': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'N2')), ((0, 'C4'), (0, 'C5'), (0, 'N4'), (0, 'N3'))), 'BZHA': (((0, 'C8'), (0, 'O82'), (0, 'O81'), (0, 'C7')),), 'MOAT': (((0, 'C8'), (0, 'O82'), (0, 'O81'), (0, 'C7')),), 'MOAE': (((0, 'C8'), (0, 'C7'), (0, 'O8'), (0, 'O9')),), 'MPYU': (((0, 'C7'), (0, 'N8'), (0, 'N6'), (0, 'O7')),), 'HPAT': (((0, 'C8'), (0, 'O82'), (0, 'O81'), (0, 'C7')),), 'BZAC': (((0, 'C8'), (0, 'O81'), (0, 'O82'), (0, 'C7')),), '3PRU': (((0, 'C2'), (0, 'N3'), (0, 'N1'), (0, 'O2')), ((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'O4'))), 'PMMU': (((0, 'C7'), (0, 'N6'), (0, 'N8'), (0, 'O7')),), 'BZAA': (((0, 'C8'), (0, 'C7'), (0, 'O8'), (0, 'O9')),), '12MU': (((0, 'C'), (0, 'N1'), (0, 'N2'), (0, 'O')),), 'HPME': (((0, 'C8'), (0, 'C7'), (0, 'O8'), (0, 'O9')),), 'OEBZ': (((0, 'C8'), (0, 'C7'), (0, 'O8'), (0, 'O9')),), 'ATBZ': (((0, 'C8'), (0, 'O82'), (0, 'O81'), (0, 'C7')),), 'PYMU': (((0, 'C7'), (0, 'N8'), (0, 'N6'), (0, 'O7')),), 'ACBZ': (((0, 'C8'), (0, 'C7'), (0, 'N8'), (0, 'O8')),), 'NMGN': (((0, 'C4'), (0, 'C3'), (0, 'O4'), (0, 'O5')),), 'NMCY': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'N2')), ((0, 'C4'), (0, 'C5'), (0, 'N4'), (0, 'N3'))), 'MMMU': (((0, 'C'), (0, 'N2'), (0, 'N1'), (0, 'O')),), 'NMGI': (((0, 'C10'), (0, 'O102'), (0, 'O101'), (0, 'C9')),), 'MEBZ': (((0, 'C8'), (0, 'C7'), (0, 'O8'), (0, 'O9')),), 'AMBA': (((0, 'C9'), (0, 'N8'), (0, 'O9'), (0, 'H9')), ((0, 'C10'), (0, 'C7'), (0, 'O10'), (0, 'H10'))), 'NCYP': (((0, 'C2'), (0, 'N1'), (0, 'N2'), (0, 'N3')), ((0, 'C4'), (0, 'C5'), (0, 'N4'), (0, 'N3'))), 'PNCP': (((0, 'C2'), (0, 'N1'), (0, 'N2'), (0, 'N3')), ((0, 'C4'), (0, 'C5'), (0, 'N4'), (0, 'N3'))), 'BK2C': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'N2')), ((0, 'C4'), (0, 'C5'), (0, 'N4'), (0, 'N3')), ((0, 'C13'), (0, 'O31'), (0, 'O30'), (0, 'C12'))), 'BR2C': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'N2')), ((0, 'C4'), (0, 'C5'), (0, 'N4'), (0, 'N3')), ((0, 'CZ'), (0, 'NE'), (0, 'NH1'), (0, 'NH2'))), 'BM2G': (((0, 'C6'), (0, 'C5'), (0, 'N1'), (0, 'O6')), ((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'N2'))), 'BN2G': (((0, 'C6'), (0, 'C5'), (0, 'N1'), (0, 'O6')), ((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'N2'))), 'FLMO': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'O2')), ((0, 'C4'), (0, 'C4A'), (0, 'N3'), (0, 'O4'))), 'FLMR': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'O2')), ((0, 'C4'), (0, 'C4A'), (0, 'N3'), (0, 'O4'))), 'FLVO': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'O2')), ((0, 'C4'), (0, 'C4A'), (0, 'N3'), (0, 'O4'))), 'FLVR': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'O2')), ((0, 'C4'), (0, 'C4A'), (0, 'N3'), (0, 'O4'))), 'RFVO': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'O2')), ((0, 'C4'), (0, 'C4A'), (0, 'N3'), (0, 'O4'))), 'RFVR': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'O2')), ((0, 'C4'), (0, 'C4A'), (0, 'N3'), (0, 'O4'))), 'FMNO': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'O2')), ((0, 'C4'), (0, 'C4A'), (0, 'N3'), (0, 'O4'))), 'FMNR': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'O2')), ((0, 'C4'), (0, 'C4A'), (0, 'N3'), (0, 'O4'))), 'FAD': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'O2')), ((0, 'C4'), (0, 'C4X'), (0, 'N3'), (0, 'O4')), ((0, 'N6A'), (0, 'H62'), (0, 'H61'), (0, 'C6A'))), 'FADR': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'O2')), ((0, 'C4'), (0, 'C4X'), (0, 'N3'), (0, 'O4')), ((0, 'N6A'), (0, 'H62'), (0, 'H61'), (0, 'C6A'))), 'ABMB': (((0, 'C12'), (0, 'C1'), (0, 'N1'), (0, 'O')),), 'ABEB': (((0, 'C12'), (0, 'C2'), (0, 'N1'), (0, 'O')),), 'ABBM': (((0, 'C12'), (0, 'C2'), (0, 'N1'), (0, 'O')),), 'ABNB': (((0, 'C12'), (0, 'C2'), (0, 'N1'), (0, 'O')),), 'ABSB': (((0, 'C12'), (0, 'C2'), (0, 'N1'), (0, 'O')), ((0, 'C1'), (0, 'N1'), (0, 'N2'), (0, 'S')), ((0, 'C3'), (0, 'C2'), (0, 'N2'), (0, 'HC3'))), 'ASBB': (((0, 'C16'), (0, 'C17'), (0, 'O34'), (0, 'S15')),), 'SM002': (((0, 'CG'), (0, 'OD2'), (0, 'OD1'), (0, 'CB')),), 'SM005': (((0, 'CE'), (0, 'CZ'), (0, 'CD'), (0, 'OE')), ((0, 'CZ'), (0, 'OZ1'), (0, 'OZ2'), (0, 'CE'))), 'SM011': (((0, 'CZ1'), (0, 'OJ2'), (0, 'OJ1'), (0, 'CE')),), 'SM013': (((0, 'CD'), (0, 'OE1'), (0, 'OE2'), (0, 'CG')),), 'SM016': (((0, 'CL3'), (0, 'CM'), (0, 'NN'), (0, 'ON')),), 'SM018': (((0, 'NZ1'), (0, 'HZ12'), (0, 'HZ11'), (0, 'CE3')),), 'SM019': (((0, 'CJ'), (0, 'OJ2'), (0, 'OJ1'), (0, 'CI')),), 'SM021': (((0, 'CZ'), (0, 'OH2'), (0, 'OH1'), (0, 'CE')),), 'SM022': (((0, 'C2'), (0, 'C1'), (0, 'N3'), (0, 'O7')), ((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'O8'))), 'SM025': (((0, 'CZ'), (0, 'NH1'), (0, 'NE1'), (0, 'NH2')),), 'SM027': (((0, 'CG'), (0, 'CB'), (0, 'ND2'), (0, 'OD1')),), 'SM030': (((0, 'CZ'), (0, 'NH1'), (0, 'NH2'), (0, 'NE')),), 'SM031': (((0, 'CG'), (0, 'CB'), (0, 'OD2'), (0, 'OD1')), ((0, 'C1'), (0, 'O1'), (0, 'O2'), (0, 'C2'))), 'SM038': (((0, 'CG'), (0, 'OD2'), (0, 'OD1'), (0, 'CB')),), 'SM040': (((0, 'C1'), (0, 'N3'), (0, 'O2'), (0, 'OG')),), 'SM041': (((0, 'C3'), (0, 'CA3'), (0, 'O3'), (0, 'H3')),), 'SM043': (((0, 'CE'), (0, 'OZ1'), (0, 'OZ2'), (0, 'CD')),), 'SM044': (((0, 'CD1'), (0, 'OE12'), (0, 'OE11'), (0, 'CG')), ((0, 'CD2'), (0, 'CG'), (0, 'OE21'), (0, 'OE22'))), 'SM045': (((0, 'CD1'), (0, 'OE12'), (0, 'OE11'), (0, 'CG')), ((0, 'CD2'), (0, 'OE21'), (0, 'OE22'), (0, 'CG'))), 'SM046': (((0, 'CE1'), (0, 'OZ3'), (0, 'OZ2'), (0, 'CD1')),), 'SM047': (((0, 'CZ'), (0, 'NE'), (0, 'NH'), (0, 'OH')),), 'SM049': (((0, 'C1'), (0, 'O2'), (0, 'O1'), (0, 'C2')), ((0, 'C4'), (0, 'O5'), (0, 'O4'), (0, 'C3'))), 'SM050': (((0, 'C1'), (0, 'C2'), (0, 'C4'), (0, 'O3')),), 'SM051': (((0, 'CE'), (0, 'CD'), (0, 'CZ'), (0, 'OE')),), 'SM057': (((0, 'C2'), (0, 'C1'), (0, 'C3'), (0, 'O1')),), 'SM058': (((0, 'CL'), (0, 'CAL'), (0, 'NL'), (0, 'OL')),), 'SM060': (((0, 'CD1'), (0, 'CG1'), (0, 'OE2'), (0, 'SG')),), 'SM061': (((0, 'C1'), (0, 'O2'), (0, 'O1'), (0, 'CA1')),), 'SM064': (((0, 'CD2'), (0, 'C1'), (0, 'NG'), (0, 'OD2')),), 'SM068': (((0, 'CBI'), (0, 'CBW'), (0, 'NAD'), (0, 'OAG')),), 'SM072': (((0, 'C2'), (0, 'CA2'), (0, 'N3'), (0, 'O2')),), 'SM075': (((0, 'CD'), (0, 'OE2'), (0, 'OE1'), (0, 'CG')),), 'SM077': (((0, 'CZ'), (0, 'NE'), (0, 'OH'), (0, 'HZ')),), 'SM084': (((0, 'C6'), (0, 'C7'), (0, 'N2'), (0, 'S1')),), 'SM085': (((0, 'C6'), (0, 'C7'), (0, 'N2'), (0, 'S1')),), 'SM086': (((0, 'CZ'), (0, 'NH2'), (0, 'NH1'), (0, 'NE')),), 'SM087': (((0, 'CD'), (0, 'CG'), (0, 'NE2'), (0, 'OE1')),), 'SM088': (((0, 'CD'), (0, 'CG'), (0, 'NE2'), (0, 'OE1')),), 'SM092': (((0, 'NH'), (0, 'HH2'), (0, 'HH1'), (0, 'CZ')),), 'SM098': (((0, 'C4A'), (0, 'C4'), (0, 'NZ'), (0, 'H4A')),), 'SM099': (((0, 'C7'), (0, 'C3'), (0, 'O7'), (0, 'SG')),), 'SM100': (((0, 'CH'), (0, 'CX'), (0, 'NZ'), (0, 'OH')),), 'SM101': (((0, 'CX'), (0, 'OQ1'), (0, 'OQ2'), (0, 'NZ')),), 'SM102': (((0, 'CX1'), (0, 'CX2'), (0, 'C1'), (0, 'NZ')), ((0, 'CX2'), (0, 'O2'), (0, 'O1'), (0, 'CX1'))), 'SM103': (((0, 'CG'), (0, 'CD'), (0, 'CB'), (0, 'OG')), ((0, 'NE2'), (0, 'HE22'), (0, 'HE21'), (0, 'CE2'))), 'SM106': (((0, 'CD2'), (0, 'CG'), (0, 'OE'), (0, 'HD2')),), 'SM108': (((0, 'C4P'), (0, 'C4'), (0, 'NZ'), (0, 'H4P')),), 'SM109': (((0, 'CD'), (0, 'OE2'), (0, 'OE1'), (0, 'CG1')),), 'SM110': (((0, 'CG1'), (0, 'CB'), (0, 'OG1'), (0, 'HG11')),), 'SM111': (((0, 'C23'), (0, 'C21'), (0, 'NZ'), (0, 'O33')),), 'SM116': (((0, 'CX1'), (0, 'CX2'), (0, 'C1'), (0, 'NZ')), ((0, 'CX2'), (0, 'O2'), (0, 'O1'), (0, 'CX1'))), 'SM117': (((0, 'CAK'), (0, 'CAG'), (0, 'OAC'), (0, 'SAI')), ((0, 'CAJ'), (0, 'OAB'), (0, 'OAE'), (0, 'CAG'))), 'SM118': (((0, 'C2'), (0, 'CA2'), (0, 'N3'), (0, 'O2')),), 'SM127': (((0, 'CLP'), (0, 'CL'), (0, 'N1'), (0, 'OL')), ((0, 'CA1'), (0, 'C1'), (0, 'CB1'), (0, 'N1')), ((0, 'C2'), (0, 'CA2'), (0, 'N3'), (0, 'O2'))), 'SM128': (((0, 'C2'), (0, 'CA2'), (0, 'N3'), (0, 'O2')),), 'SM132': (((0, 'CF'), (0, 'CZ'), (0, 'CJ'), (0, 'OF')),), 'SM134': (((0, 'CG'), (0, 'CB'), (0, 'OD2'), (0, 'OD1')),), 'SM135': (((0, 'CG'), (0, 'CB'), (0, 'OD2'), (0, 'OD1')),), 'SM137': (((0, 'CAD'), (0, 'OAE'), (0, 'OAF'), (0, 'CAC')),), 'SM143': (((0, 'CD'), (0, 'NE2'), (0, 'OE1'), (0, 'SG')),), 'SM144': (((0, 'C10'), (0, 'O10'), (0, 'O9'), (0, 'C8')),), 'SM169': (((0, 'CZ'), (0, 'NE'), (0, 'NH'), (0, 'SZ')),), 'SM172': (((0, 'C2'), (0, 'C1'), (0, 'C3'), (0, 'O2')), ((0, 'C5'), (0, 'C4'), (0, 'C6'), (0, 'O5'))), 'SM173': (((0, 'C2'), (0, 'C1'), (0, 'C3'), (0, 'O2')), ((0, 'C5'), (0, 'C4'), (0, 'C6'), (0, 'O5'))), 'SM174': (((0, 'CZ2'), (0, 'CH2'), (0, 'CE2'), (0, 'O2')), ((0, 'CH2'), (0, 'CZ3'), (0, 'CZ2'), (0, 'N2'))), 'SM176': (((0, 'CZ2'), (0, 'CH2'), (0, 'CE2'), (0, 'O7')), ((0, 'CH2'), (0, 'CZ3'), (0, 'CZ2'), (0, 'O6'))), 'SM179': (((0, 'N2'), (0, 'H22'), (0, 'H21'), (0, 'CH2')),), 'SM180': (((0, 'NE1'), (0, 'HE11'), (0, 'HE12'), (0, 'CE1')),), 'SM181': (((0, 'NE2'), (0, 'HE21'), (0, 'HE22'), (0, 'CE2')),), 'SM185': (((0, 'CE'), (0, 'CD'), (0, 'NZ2'), (0, 'OZ1')),), 'SM187': (((0, 'C1'), (0, 'O2'), (0, 'O1'), (0, 'C2')),), 'SM189': (((0, 'CZ'), (0, 'NH1'), (0, 'NE'), (0, 'NH2')),), 'SM194': (((0, 'CH'), (0, 'CX'), (0, 'NZ'), (0, 'OH')),), 'SM199': (((0, 'CG'), (0, 'CB'), (0, 'OD2'), (0, 'OD1')), ((0, 'C1'), (0, 'O2'), (0, 'O1'), (0, 'C2'))), 'SM213': (((0, 'CLP'), (0, 'CL'), (0, 'N'), (0, 'OL')), ((0, 'CA'), (0, 'CB'), (0, 'C'), (0, 'N')), ((0, 'CG'), (0, 'CB'), (0, 'OD1'), (0, 'OD2')), ((0, 'C'), (0, 'CA'), (0, 'NR'), (0, 'O'))), 'SM214': (((0, 'C2'), (0, 'C1'), (0, 'C3'), (0, 'O2')), ((0, 'C5'), (0, 'C4'), (0, 'C6'), (0, 'O5'))), 'SM215': (((0, 'C2'), (0, 'CA2'), (0, 'N3'), (0, 'O2')), ((0, 'C3'), (0, 'CA3'), (0, 'N2AL'), (0, 'O3'))), 'SM216': (((0, 'C2'), (0, 'CA2'), (0, 'N3'), (0, 'O2')),), 'SM218': (((0, 'C11'), (0, 'C1AL'), (0, 'N1'), (0, 'O11')), ((0, 'C2'), (0, 'CA2'), (0, 'N3'), (0, 'O2')), ((0, 'C1'), (0, 'CA1'), (0, 'N2'), (0, 'N3'))), 'SM221': (((0, 'CD1'), (0, 'CG1'), (0, 'OE2'), (0, 'SG')),), 'SM224': (((0, 'C11'), (0, 'C1AL'), (0, 'N1'), (0, 'O11')), ((0, 'CY'), (0, 'CAY'), (0, 'N1AL'), (0, 'OY'))), 'SM227': (((0, 'CLP'), (0, 'CL'), (0, 'N'), (0, 'OL')), ((0, 'C'), (0, 'CA'), (0, 'NR'), (0, 'O'))), 'SM233': (((0, 'C3'), (0, 'CA3'), (0, 'N2AL'), (0, 'O3')),), 'SM234': (((0, 'CJ'), (0, 'OJ1'), (0, 'OJ2'), (0, 'CI')),), 'SM237': (((0, 'C11'), (0, 'C1AL'), (0, 'N'), (0, 'O11')), ((0, 'C'), (0, 'CA'), (0, 'N2AL'), (0, 'O'))), 'SM238': (((0, 'C11'), (0, 'C1AL'), (0, 'N'), (0, 'O11')), ((0, 'C'), (0, 'CA'), (0, 'N2AL'), (0, 'O'))), 'SM239': (((0, 'C11'), (0, 'C1AL'), (0, 'N'), (0, 'O11')), ((0, 'C'), (0, 'CA'), (0, 'N2AL'), (0, 'O'))), 'SM240': (((0, 'C11'), (0, 'C1AL'), (0, 'N'), (0, 'O11')), ((0, 'C'), (0, 'CA'), (0, 'N2AL'), (0, 'S'))), 'SM241': (((0, 'C11'), (0, 'C1AL'), (0, 'N'), (0, 'O11')), ((0, 'C'), (0, 'CA'), (0, 'N2AL'), (0, 'O'))), 'SM242': (((0, 'CLP'), (0, 'CL'), (0, 'N1'), (0, 'OL')), ((0, 'CA1'), (0, 'CB1'), (0, 'C1'), (0, 'N1'))), 'MGU3': (((0, 'C'), (0, 'N2'), (0, 'N1'), (0, 'N3')), ((0, 'N2'), (0, 'H21'), (0, 'H22'), (0, 'C'))), 'PGUN': (((0, 'CZ'), (0, 'NH1'), (0, 'NH2'), (0, 'NE')), ((0, 'NH1'), (0, 'HH11'), (0, 'HH12'), (0, 'CZ')), ((0, 'NH2'), (0, 'HH21'), (0, 'HH22'), (0, 'CZ'))), 'MGUN': (((0, 'CZ'), (0, 'NH1'), (0, 'NH2'), (0, 'NE')), ((0, 'NH1'), (0, 'HH11'), (0, 'HH12'), (0, 'CZ')), ((0, 'NH2'), (0, 'HH21'), (0, 'HH22'), (0, 'CZ'))), 'ALDD': (((0, 'CLP'), (0, 'CL'), (0, 'NL'), (0, 'OL')), ((0, 'NL'), (0, 'CLP'), (0, 'CA'), (0, 'HL')), ((0, 'CRP'), (0, 'CA'), (0, 'NR'), (0, 'OR')), ((0, 'NR'), (0, 'CRP'), (0, 'CR'), (0, 'HR'))), 'DALA': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'DARG': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O')), ((0, 'CZ'), (0, 'NH1'), (0, 'NH2'), (0, 'NE')), ((0, 'NH1'), (0, 'HH11'), (0, 'HH12'), (0, 'CZ')), ((0, 'NH2'), (0, 'HH21'), (0, 'HH22'), (0, 'CZ'))), 'DASN': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O')), ((0, 'CG'), (0, 'ND2'), (0, 'CB'), (0, 'OD1')), ((0, 'CG'), (0, 'CB'), (0, 'ND2'), (0, 'OD1')), ((0, 'ND2'), (0, 'CG'), (0, 'HD21'), (0, 'HD22')), ((0, 'ND2'), (0, 'CG'), (0, 'HD22'), (0, 'HD21'))), 'DASP': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O')), ((0, 'CG'), (0, 'CB'), (0, 'OD2'), (0, 'OD1'))), 'DCYS': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'DGLN': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O')), ((0, 'CD'), (0, 'NE2'), (0, 'CG'), (0, 'OE1')), ((0, 'CD'), (0, 'CG'), (0, 'NE2'), (0, 'OE1')), ((0, 'NE2'), (0, 'CD'), (0, 'HE21'), (0, 'HE22')), ((0, 'NE2'), (0, 'CD'), (0, 'HE22'), (0, 'HE21'))), 'DGLU': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O')), ((0, 'CD'), (0, 'CG'), (0, 'OE2'), (0, 'OE1'))), 'DGLY': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'DHSD': (((0, 'ND1'), (0, 'CG'), (0, 'CE1'), (0, 'HD1')), ((0, 'CD2'), (0, 'CG'), (0, 'NE2'), (0, 'HD2')), ((0, 'CE1'), (0, 'ND1'), (0, 'NE2'), (0, 'HE1')), ((0, 'ND1'), (0, 'CE1'), (0, 'CG'), (0, 'HD1')), ((0, 'CD2'), (0, 'NE2'), (0, 'CG'), (0, 'HD2')), ((0, 'CE1'), (0, 'NE2'), (0, 'ND1'), (0, 'HE1')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'DHSE': (((0, 'NE2'), (0, 'CD2'), (0, 'CE1'), (0, 'HE2')), ((0, 'CD2'), (0, 'CG'), (0, 'NE2'), (0, 'HD2')), ((0, 'CE1'), (0, 'ND1'), (0, 'NE2'), (0, 'HE1')), ((0, 'NE2'), (0, 'CE1'), (0, 'CD2'), (0, 'HE2')), ((0, 'CD2'), (0, 'NE2'), (0, 'CG'), (0, 'HD2')), ((0, 'CE1'), (0, 'NE2'), (0, 'ND1'), (0, 'HE1')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'DHSP': (((0, 'ND1'), (0, 'CG'), (0, 'CE1'), (0, 'HD1')), ((0, 'ND1'), (0, 'CE1'), (0, 'CG'), (0, 'HD1')), ((0, 'NE2'), (0, 'CD2'), (0, 'CE1'), (0, 'HE2')), ((0, 'NE2'), (0, 'CE1'), (0, 'CD2'), (0, 'HE2')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'DILE': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'DLEU': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'DLYS': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'DMET': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'DPHE': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'DPRO': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'CD')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'DSER': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'DTHR': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'DTRP': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'DTYR': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'DVAL': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'LYR': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'HEME': (((0, 'C2A'), (0, 'C1A'), (0, 'C3A'), (0, 'CAA')), ((0, 'C3A'), (0, 'C2A'), (0, 'C4A'), (0, 'CMA')), ((0, 'C2B'), (0, 'C1B'), (0, 'C3B'), (0, 'CMB')), ((0, 'C3B'), (0, 'C2B'), (0, 'C4B'), (0, 'CAB')), ((0, 'C2C'), (0, 'C1C'), (0, 'C3C'), (0, 'CMC')), ((0, 'C3C'), (0, 'C2C'), (0, 'C4C'), (0, 'CAC')), ((0, 'C2D'), (0, 'C1D'), (0, 'C3D'), (0, 'CMD')), ((0, 'C3D'), (0, 'C2D'), (0, 'C4D'), (0, 'CAD')), ((0, 'CGA'), (0, 'CBA'), (0, 'O2A'), (0, 'O1A')), ((0, 'CGD'), (0, 'CBD'), (0, 'O2D'), (0, 'O1D')), ((0, 'C4A'), (0, 'NA'), (0, 'C1A'), (0, 'C2A')), ((0, 'C1A'), (0, 'NA'), (0, 'C4A'), (0, 'C3A')), ((0, 'C4B'), (0, 'NB'), (0, 'C1B'), (0, 'C2B')), ((0, 'C1B'), (0, 'NB'), (0, 'C4B'), (0, 'C3B')), ((0, 'C4C'), (0, 'NC'), (0, 'C1C'), (0, 'C2C')), ((0, 'C1C'), (0, 'NC'), (0, 'C4C'), (0, 'C3C')), ((0, 'C4D'), (0, 'ND'), (0, 'C1D'), (0, 'C2D')), ((0, 'C1D'), (0, 'ND'), (0, 'C4D'), (0, 'C3D')), ((0, 'NA'), (0, 'C1A'), (0, 'C2A'), (0, 'C3A')), ((0, 'NA'), (0, 'C4A'), (0, 'C3A'), (0, 'C2A')), ((0, 'NB'), (0, 'C1B'), (0, 'C2B'), (0, 'C3B')), ((0, 'NB'), (0, 'C4B'), (0, 'C3B'), (0, 'C2B')), ((0, 'NC'), (0, 'C1C'), (0, 'C2C'), (0, 'C3C')), ((0, 'NC'), (0, 'C4C'), (0, 'C3C'), (0, 'C2C')), ((0, 'ND'), (0, 'C1D'), (0, 'C2D'), (0, 'C3D')), ((0, 'ND'), (0, 'C4D'), (0, 'C3D'), (0, 'C2D')), ((0, 'NA'), (0, 'C1A'), (0, 'CHA'), (0, 'C4D')), ((0, 'NA'), (0, 'C4A'), (0, 'CHB'), (0, 'C1B')), ((0, 'NB'), (0, 'C1B'), (0, 'CHB'), (0, 'C4A')), ((0, 'NB'), (0, 'C4B'), (0, 'CHC'), (0, 'C1C')), ((0, 'NC'), (0, 'C1C'), (0, 'CHC'), (0, 'C4B')), ((0, 'NC'), (0, 'C4C'), (0, 'CHD'), (0, 'C1D')), ((0, 'ND'), (0, 'C1D'), (0, 'CHD'), (0, 'C4C')), ((0, 'ND'), (0, 'C4D'), (0, 'CHA'), (0, 'C1A')), ((0, 'CHA'), (0, 'C1A'), (0, 'C4D'), (0, 'HA')), ((0, 'CHB'), (0, 'C1B'), (0, 'C4A'), (0, 'HB')), ((0, 'CHC'), (0, 'C1C'), (0, 'C4B'), (0, 'HC')), ((0, 'CHD'), (0, 'C1D'), (0, 'C4C'), (0, 'HD')), ((0, 'C1A'), (0, 'C2A'), (0, 'CHA'), (0, 'NA')), ((0, 'C4A'), (0, 'C3A'), (0, 'CHB'), (0, 'NA')), ((0, 'C1B'), (0, 'C2B'), (0, 'CHB'), (0, 'NB')), ((0, 'C4B'), (0, 'C3B'), (0, 'CHC'), (0, 'NB')), ((0, 'C1C'), (0, 'C2C'), (0, 'CHC'), (0, 'NC')), ((0, 'C4C'), (0, 'C3C'), (0, 'CHD'), (0, 'NC')), ((0, 'C1D'), (0, 'C2D'), (0, 'CHD'), (0, 'ND')), ((0, 'C4D'), (0, 'C3D'), (0, 'CHA'), (0, 'ND')), ((0, 'NA'), (0, 'C1A'), (0, 'C4A'), (0, 'FE')), ((0, 'NB'), (0, 'C1B'), (0, 'C4B'), (0, 'FE')), ((0, 'NC'), (0, 'C1C'), (0, 'C4C'), (0, 'FE')), ((0, 'ND'), (0, 'C1D'), (0, 'C4D'), (0, 'FE'))), 'LFN': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'O2')), ((0, 'C4'), (0, 'C4A'), (0, 'N3'), (0, 'O4'))), 'LFNR': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'O2')), ((0, 'C4'), (0, 'C4A'), (0, 'N3'), (0, 'O4'))), 'RBF': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'O2')), ((0, 'C4'), (0, 'C4A'), (0, 'N3'), (0, 'O4'))), 'RBFR': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'O2')), ((0, 'C4'), (0, 'C4A'), (0, 'N3'), (0, 'O4'))), 'FMN': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'O2')), ((0, 'C4'), (0, 'C4A'), (0, 'N3'), (0, 'O4'))), 'FOL': (((0, 'C2'), (0, 'N3'), (0, 'N1'), (0, 'NA2')), ((0, 'NA2'), (0, 'HN21'), (0, 'HN22'), (0, 'C2')), ((0, 'C4'), (0, 'C4A'), (0, 'N3'), (0, 'O4')), ((0, 'C'), (0, 'C11'), (0, 'N'), (0, 'O')), ((0, 'CD'), (0, 'OE1'), (0, 'OE2'), (0, 'CG')), ((0, 'CT'), (0, 'O2'), (0, 'O1'), (0, 'CA'))), 'FOLN1': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'NA2')), ((0, 'NA2'), (0, 'HN21'), (0, 'HN22'), (0, 'C2')), ((0, 'C4'), (0, 'C4A'), (0, 'N3'), (0, 'O4')), ((0, 'C'), (0, 'C11'), (0, 'N'), (0, 'O')), ((0, 'CD'), (0, 'OE1'), (0, 'OE2'), (0, 'CG')), ((0, 'CT'), (0, 'O2'), (0, 'O1'), (0, 'CA'))), 'FOLDPR': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'NA2')), ((0, 'C'), (0, 'C11'), (0, 'N'), (0, 'O')), ((0, 'CD'), (0, 'OE1'), (0, 'OE2'), (0, 'CG')), ((0, 'CT'), (0, 'O2'), (0, 'O1'), (0, 'CA'))), 'PTM6N3': (((0, 'C2'), (0, 'N3'), (0, 'N1'), (0, 'NA2')), ((0, 'NA2'), (0, 'HN21'), (0, 'HN22'), (0, 'C2')), ((0, 'C4'), (0, 'C4A'), (0, 'N3'), (0, 'O4'))), 'PTM6N1': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'NA2')), ((0, 'NA2'), (0, 'HN21'), (0, 'HN22'), (0, 'C2')), ((0, 'C4'), (0, 'C4A'), (0, 'N3'), (0, 'O4'))), 'PTRN1': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'NA2')), ((0, 'NA2'), (0, 'HN21'), (0, 'HN22'), (0, 'C2')), ((0, 'C4'), (0, 'C4A'), (0, 'N3'), (0, 'O4'))), 'PE0': (((0, 'C2'), (0, 'N3'), (0, 'N1'), (0, 'NA2')), ((0, 'NA2'), (0, 'HN21'), (0, 'HN22'), (0, 'C2')), ((0, 'C4'), (0, 'C4A'), (0, 'N3'), (0, 'O4'))), 'DPRPTR': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'NA2')),), 'THG': (((0, 'C2'), (0, 'N3'), (0, 'N1'), (0, 'NA2')), ((0, 'NA2'), (0, 'HN22'), (0, 'HN21'), (0, 'C2')), ((0, 'C4'), (0, 'C4A'), (0, 'N3'), (0, 'O4')), ((0, 'C'), (0, 'C11'), (0, 'N'), (0, 'O')), ((0, 'CD'), (0, 'OE1'), (0, 'OE2'), (0, 'CG')), ((0, 'CT'), (0, 'O2'), (0, 'O1'), (0, 'CA'))), 'THGN1': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'NA2')), ((0, 'NA2'), (0, 'HN22'), (0, 'HN21'), (0, 'C2')), ((0, 'C4'), (0, 'C4A'), (0, 'N3'), (0, 'O4')), ((0, 'C'), (0, 'C11'), (0, 'N'), (0, 'O')), ((0, 'CD'), (0, 'OE1'), (0, 'OE2'), (0, 'CG')), ((0, 'CT'), (0, 'O2'), (0, 'O1'), (0, 'CA'))), 'DHF': (((0, 'C2'), (0, 'N3'), (0, 'N1'), (0, 'NA2')), ((0, 'NA2'), (0, 'HN22'), (0, 'HN21'), (0, 'C2')), ((0, 'C4'), (0, 'C4A'), (0, 'N3'), (0, 'O4')), ((0, 'C6'), (0, 'C9'), (0, 'C7'), (0, 'N5')), ((0, 'C'), (0, 'C11'), (0, 'N'), (0, 'O')), ((0, 'CD'), (0, 'OE1'), (0, 'OE2'), (0, 'CG')), ((0, 'CT'), (0, 'O2'), (0, 'O1'), (0, 'CA'))), 'DHFN1': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'NA2')), ((0, 'NA2'), (0, 'HN22'), (0, 'HN21'), (0, 'C2')), ((0, 'C4'), (0, 'C4A'), (0, 'N3'), (0, 'O4')), ((0, 'C6'), (0, 'C9'), (0, 'C7'), (0, 'N5')), ((0, 'C'), (0, 'C11'), (0, 'N'), (0, 'O')), ((0, 'CD'), (0, 'OE1'), (0, 'OE2'), (0, 'CG')), ((0, 'CT'), (0, 'O2'), (0, 'O1'), (0, 'CA'))), 'TPT358': (((0, 'C2'), (0, 'N3'), (0, 'N1'), (0, 'NA2')), ((0, 'NA2'), (0, 'HN22'), (0, 'HN21'), (0, 'C2')), ((0, 'C4'), (0, 'C4A'), (0, 'N3'), (0, 'O4'))), 'TPT158': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'NA2')), ((0, 'NA2'), (0, 'HN21'), (0, 'HN22'), (0, 'C2')), ((0, 'C4'), (0, 'C4A'), (0, 'N3'), (0, 'O4'))), 'DPTN38': (((0, 'C2'), (0, 'N3'), (0, 'N1'), (0, 'NA2')), ((0, 'NA2'), (0, 'HN21'), (0, 'HN22'), (0, 'C2')), ((0, 'C4'), (0, 'C4A'), (0, 'N3'), (0, 'O4')), ((0, 'C6'), (0, 'C7'), (0, 'N5'), (0, 'H6'))), 'DPTN18': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'NA2')), ((0, 'NA2'), (0, 'HN22'), (0, 'HN21'), (0, 'C2')), ((0, 'C4'), (0, 'C4A'), (0, 'N3'), (0, 'O4')), ((0, 'C6'), (0, 'C7'), (0, 'N5'), (0, 'H6'))), 'H4B': (((0, 'C2'), (0, 'N3'), (0, 'N1'), (0, 'NA2')), ((0, 'NA2'), (0, 'HN22'), (0, 'HN21'), (0, 'C2')), ((0, 'C4'), (0, 'C4A'), (0, 'N3'), (0, 'O4'))), 'H4BN1': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'NA2')), ((0, 'NA2'), (0, 'HN21'), (0, 'HN22'), (0, 'C2')), ((0, 'C4'), (0, 'C4A'), (0, 'N3'), (0, 'O4'))), 'COB': (((0, 'C'), (0, 'OD1'), (0, 'OD2'), (0, 'CA')),), 'F430': (((0, 'C3'), (0, 'O1'), (0, 'O12'), (0, 'C39')), ((0, 'C4'), (0, 'O13'), (0, 'O2'), (0, 'C40')), ((0, 'C30'), (0, 'C27'), (0, 'N5'), (0, 'O7')), ((0, 'C31'), (0, 'C35'), (0, 'N4'), (0, 'O8')), ((0, 'C32'), (0, 'O10'), (0, 'O9'), (0, 'C28')), ((0, 'C34'), (0, 'C10'), (0, 'C33'), (0, 'O11')), ((0, 'C41'), (0, 'O5'), (0, 'O3'), (0, 'C5')), ((0, 'C42'), (0, 'O6'), (0, 'O4'), (0, 'C6')), ((0, 'N1'), (0, 'C23'), (0, 'C11'), (0, 'NI')), ((0, 'N3'), (0, 'C26'), (0, 'C14'), (0, 'NI')), ((0, 'N2'), (0, 'C24'), (0, 'C12'), (0, 'NI')), ((0, 'N6'), (0, 'C25'), (0, 'C13'), (0, 'NI'))), 'F43T': (((0, 'C3'), (0, 'O1'), (0, 'O12'), (0, 'C39')), ((0, 'C4'), (0, 'O13'), (0, 'O2'), (0, 'C40')), ((0, 'C30'), (0, 'C27'), (0, 'N5'), (0, 'O7')), ((0, 'C31'), (0, 'C35'), (0, 'N4'), (0, 'O8')), ((0, 'C32'), (0, 'O10'), (0, 'O9'), (0, 'C28')), ((0, 'C34'), (0, 'C10'), (0, 'C33'), (0, 'O11')), ((0, 'C41'), (0, 'O5'), (0, 'O3'), (0, 'C5')), ((0, 'C42'), (0, 'O6'), (0, 'O4'), (0, 'C6')), ((0, 'N1'), (0, 'C23'), (0, 'C11'), (0, 'NI')), ((0, 'N3'), (0, 'C26'), (0, 'C14'), (0, 'NI')), ((0, 'N2'), (0, 'C24'), (0, 'C12'), (0, 'NI')), ((0, 'N6'), (0, 'C25'), (0, 'C13'), (0, 'NI'))), 'F43A': (((0, 'C3'), (0, 'O1'), (0, 'O12'), (0, 'C39')), ((0, 'C4'), (0, 'O13'), (0, 'O2'), (0, 'C40')), ((0, 'C30'), (0, 'C27'), (0, 'N5'), (0, 'O7')), ((0, 'C31'), (0, 'C35'), (0, 'N4'), (0, 'O8')), ((0, 'C32'), (0, 'O10'), (0, 'O9'), (0, 'C28')), ((0, 'C34'), (0, 'C10'), (0, 'C33'), (0, 'O11')), ((0, 'C41'), (0, 'O5'), (0, 'O3'), (0, 'C5')), ((0, 'C42'), (0, 'O6'), (0, 'O4'), (0, 'C6')), ((0, 'C45'), (0, 'C44'), (0, 'N7'), (0, 'O14')), ((0, 'N1'), (0, 'C23'), (0, 'C11'), (0, 'NI')), ((0, 'N3'), (0, 'C26'), (0, 'C14'), (0, 'NI')), ((0, 'N2'), (0, 'C24'), (0, 'C12'), (0, 'NI')), ((0, 'N6'), (0, 'C25'), (0, 'C13'), (0, 'NI'))), 'ALY': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O')), ((0, 'NZ'), (0, 'CH'), (0, 'CE'), (0, 'HZ1')), ((0, 'CH'), (0, 'CH3'), (0, 'NZ'), (0, 'OH'))), 'DORN': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CD'), (1, 'N'), (0, 'O'))), 'NLE': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'AIBD': (((0, 'C2'), (0, 'C1'), (0, 'N3'), (0, 'O2')), ((0, 'N3'), (0, 'C2'), (0, 'C4'), (0, 'H3')), ((0, 'C5'), (0, 'C4'), (0, 'N6'), (0, 'O5')), ((0, 'N6'), (0, 'C5'), (0, 'C7'), (0, 'H6'))), 'AIB': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'ASPM': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O')), ((0, 'CG'), (0, 'CB2'), (0, 'OD2'), (0, 'OD1'))), 'LEM': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'LYM': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'NMGLYD': (((0, 'C2'), (0, 'C1'), (0, 'N3'), (0, 'O2')), ((0, 'C5'), (0, 'C4'), (0, 'N6'), (0, 'O5'))), 'MGY': (((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O')),), 'HYP': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'CD')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'HIC': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'HICP': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'NAPH': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), '143': (((0, 'CJ'), (0, 'OJ2'), (0, 'OJ1'), (0, 'CI')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), '0TD': (((0, 'CG'), (0, 'OD2'), (0, 'OD1'), (0, 'CB')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), '2CO': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), '4HH': (((0, 'CL3'), (0, 'CM'), (0, 'NN'), (0, 'ON')), ((0, 'CQ'), (0, 'CP'), (0, 'NR'), (0, 'OR')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), '5CS': (((0, 'CJ'), (0, 'OJ2'), (0, 'OJ1'), (0, 'CI')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), '6V1': (((0, 'C2'), (0, 'C1'), (0, 'N3'), (0, 'O7')), ((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'O8')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'AGT': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'ALS': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'APK': (((0, 'C6'), (0, 'C5'), (0, 'N1'), (0, 'N6')), ((0, 'N6'), (0, 'HN62'), (0, 'HN61'), (0, 'C6')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'ASB': (((0, 'CG'), (0, 'CB'), (0, 'OD2'), (0, 'OD1')), ((0, 'C1'), (0, 'O1'), (0, 'O2'), (0, 'C2')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'BXT': (((0, 'C1'), (0, 'N3'), (0, 'O2'), (0, 'OG')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'CGU': (((0, 'CD1'), (0, 'OE12'), (0, 'OE11'), (0, 'CG')), ((0, 'CD2'), (0, 'OE21'), (0, 'OE22'), (0, 'CG')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'CGV': (((0, 'CE1'), (0, 'OZ3'), (0, 'OZ2'), (0, 'CD1')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'CME': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'CML': (((0, 'C1'), (0, 'O2'), (0, 'O1'), (0, 'C2')), ((0, 'C4'), (0, 'O5'), (0, 'O4'), (0, 'C3')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'CSO': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'CSS': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'CSU': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'CSX': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'CYD': (((0, 'C2'), (0, 'C1'), (0, 'C3'), (0, 'O1')), ((0, 'C6'), (0, 'OT3'), (0, 'OT4'), (0, 'C5')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'CYF': (((0, 'CL'), (0, 'CAL'), (0, 'NL'), (0, 'OL')), ((0, 'C20'), (0, 'O5'), (0, 'O4'), (0, 'C19')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'CYG': (((0, 'CD1'), (0, 'CG1'), (0, 'OE2'), (0, 'SG')), ((0, 'C1'), (0, 'O2'), (0, 'O1'), (0, 'CA1')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'CYQP': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'DBZ': (((0, 'CD2'), (0, 'C1'), (0, 'NG'), (0, 'OD2')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'DDE': (((0, 'CBI'), (0, 'CBW'), (0, 'NAD'), (0, 'OAG')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'FHO': (((0, 'CZ'), (0, 'NE'), (0, 'OH'), (0, 'HZ')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'FZN': (((0, 'C6'), (0, 'C7'), (0, 'N2'), (0, 'S1')), ((0, 'C15'), (0, 'C14'), (0, 'N12'), (0, 'N11')), ((0, 'N11'), (0, 'HN12'), (0, 'HN11'), (0, 'C15')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'HIP': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'HIX': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'HTI': (((0, 'CAM'), (0, 'OA1'), (0, 'OA2'), (0, 'CAK')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'IAM': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'IT1': (((0, 'C4A'), (0, 'C4'), (0, 'NZ'), (0, 'H4A')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'IT1P': (((0, 'C4A'), (0, 'C4'), (0, 'NZ'), (0, 'H4A')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'JJJ': (((0, 'C7'), (0, 'C3'), (0, 'O7'), (0, 'SG')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'KCR': (((0, 'CH'), (0, 'CX'), (0, 'NZ'), (0, 'OH')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'KCX': (((0, 'CX'), (0, 'OQ1'), (0, 'OQ2'), (0, 'NZ')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'KPI': (((0, 'CX1'), (0, 'CX2'), (0, 'C1'), (0, 'NZ')), ((0, 'CX2'), (0, 'O2'), (0, 'O1'), (0, 'CX1')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'LA2': (((0, 'C1'), (0, 'C2'), (0, 'NZ'), (0, 'O1')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'LLP': (((0, \"C4'\"), (0, 'C4'), (0, 'NZ'), (0, \"H4'\")), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'LLPP': (((0, \"C4'\"), (0, 'C4'), (0, 'NZ'), (0, \"H4'\")), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'M0H': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'MCL': (((0, 'CX1'), (0, 'CX2'), (0, 'C1'), (0, 'NZ')), ((0, 'CX2'), (0, 'O2'), (0, 'O1'), (0, 'CX1')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'MCS': (((0, 'CAK'), (0, 'CAG'), (0, 'OAC'), (0, 'SAI')), ((0, 'CAJ'), (0, 'OAB'), (0, 'OAE'), (0, 'CAG')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'MHS': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'MLZ': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'NEP': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'PRV': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'QCS': (((0, 'CD'), (0, 'NE2'), (0, 'OE1'), (0, 'SG')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'QPA': (((0, 'C10'), (0, 'O10'), (0, 'O9'), (0, 'C8')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'R1A': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'SDP': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'SEB': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'SEN': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'SGB': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'SNC': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'SUN': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'SVX': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'SVY': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'TOX': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'TPQ': (((0, 'C2'), (0, 'C1'), (0, 'C3'), (0, 'O2')), ((0, 'C5'), (0, 'C4'), (0, 'C6'), (0, 'O5')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'TQQ': (((0, 'CZ2'), (0, 'CH2'), (0, 'CE2'), (0, 'O2')), ((0, 'CH2'), (0, 'CZ3'), (0, 'CZ2'), (0, 'N2')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'TRQ': (((0, 'CZ2'), (0, 'CH2'), (0, 'CE2'), (0, 'O7')), ((0, 'CH2'), (0, 'CZ3'), (0, 'CZ2'), (0, 'O6')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'TRW': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'TS9': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'TYS': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'XCN': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), '0AF': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), '26P': (((0, 'CE'), (0, 'CZ'), (0, 'CD'), (0, 'OE')), ((0, 'CZ'), (0, 'OZ1'), (0, 'OZ2'), (0, 'CE')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), '2FM': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), '2HF': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), '2HFD': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), '2HFE': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), '2NP': (((0, 'CZ1'), (0, 'OJ2'), (0, 'OJ1'), (0, 'CE')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), '32T': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), '3GL': (((0, 'CD'), (0, 'OE1'), (0, 'OE2'), (0, 'CG')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), '4FW': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), '4HT': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), '4IN': (((0, 'NZ1'), (0, 'HZ12'), (0, 'HZ11'), (0, 'CE3')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), '6CL': (((0, 'CZ'), (0, 'OH2'), (0, 'OH1'), (0, 'CE')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'ACZ': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'AGM': (((0, 'CZ'), (0, 'NH1'), (0, 'NE1'), (0, 'NH2')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'AHB': (((0, 'CG'), (0, 'CB'), (0, 'ND2'), (0, 'OD1')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'ARO': (((0, 'CZ'), (0, 'NH1'), (0, 'NH2'), (0, 'NE')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'AZDA': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'DAZDA': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'BB8': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'BCS': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'BHD': (((0, 'CG'), (0, 'OD2'), (0, 'OD1'), (0, 'CB')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'BTH3': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'DBTH3': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'CAN': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'CCS': (((0, 'CE'), (0, 'OZ1'), (0, 'OZ2'), (0, 'CD')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'CIR': (((0, 'CZ'), (0, 'NE'), (0, 'NH'), (0, 'OH')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'CSA': (((0, 'CE'), (0, 'CD'), (0, 'CZ'), (0, 'OE')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'DDZ': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'ESC': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'F2F': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'FGA4': (((0, 'CD'), (0, 'OE2'), (0, 'OE1'), (0, 'CG')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'DFGA4': (((0, 'CD'), (0, 'OE2'), (0, 'OE1'), (0, 'CG')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'FPH2': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'DFPH2': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'FT6': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'FTR': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'FUA2': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'DFUA2': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'FVAL': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'DFVAL': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'GDPR': (((0, 'CD'), (0, 'NE2'), (0, 'NG'), (0, 'NE1')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'DGDPR': (((0, 'CD'), (0, 'NE2'), (0, 'NG'), (0, 'NE1')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'GGB': (((0, 'CZ'), (0, 'NH2'), (0, 'NH1'), (0, 'NE')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'GGBP': (((0, 'CZ'), (0, 'NH2'), (0, 'NH1'), (0, 'NE')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'GHG': (((0, 'CD'), (0, 'CG'), (0, 'NE2'), (0, 'OE1')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'HGA': (((0, 'CD'), (0, 'CG'), (0, 'NE2'), (0, 'OE1')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'HOX': (((0, 'NH'), (0, 'HH2'), (0, 'HH1'), (0, 'CZ')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'HTR': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'IGL': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'KYN': (((0, 'CG'), (0, 'CD'), (0, 'CB'), (0, 'OG')), ((0, 'NE2'), (0, 'HE22'), (0, 'HE21'), (0, 'CE2')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'LE1': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'LED': (((0, 'CD2'), (0, 'CG'), (0, 'OE'), (0, 'HD2')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'LEF': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'LME': (((0, 'CD'), (0, 'OE2'), (0, 'OE1'), (0, 'CG1')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'LVN': (((0, 'CG1'), (0, 'CB'), (0, 'OG1'), (0, 'HG11')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'M2S': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'ME0': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'NIY': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'OBF': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'OCY': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'OMX': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'PBF': (((0, 'CF'), (0, 'CZ'), (0, 'CJ'), (0, 'OF')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'PF5': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'PYR2': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'DPYR2': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'PYZ1': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'DPYZ1': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'QU32': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'DQU32': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'QX32': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'DQX32': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'STYA': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'DSTYA': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'TEZA': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'DTEZA': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'TFG2': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'DTFG2': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'TFG3': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'DTFG3': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'TFG4': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'DTFG4': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'TFLE': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'DTFLE': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'TFP2': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'DTFP2': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'TFP3': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'DTFP3': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'TFP4': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'DTFP4': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'THG2': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'DTHG2': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'THG3': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'DTHG3': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'THIC': (((0, 'CZ'), (0, 'NE'), (0, 'NH'), (0, 'SZ')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'DTHIC': (((0, 'CZ'), (0, 'NE'), (0, 'NH'), (0, 'SZ')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'TIH': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'TRO': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'TTQ': (((0, 'N2'), (0, 'H22'), (0, 'H21'), (0, 'CH2')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'TY2': (((0, 'NE1'), (0, 'HE11'), (0, 'HE12'), (0, 'CE1')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'TYQ': (((0, 'NE2'), (0, 'HE21'), (0, 'HE22'), (0, 'CE2')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'TZA4': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'DTZA4': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'YCM': (((0, 'CE'), (0, 'CD'), (0, 'NZ2'), (0, 'OZ1')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'YOF': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), '004': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), '0A1': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), '0BN': (((0, 'CH'), (0, 'NJ2'), (0, 'NJ1'), (0, 'CZ')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), '2AG': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), '2AS': (((0, 'CG1'), (0, 'OD1'), (0, 'OD2'), (0, 'CB')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), '3CF': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), '3FG': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), '4CF': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), '4CY': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), '4HMP': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'D4HMP': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), '4PH': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'AA4': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'ABA': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'AHP': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'ALC': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'ALN': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'ALO': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'ANTH': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'DANTH': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'APD': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'APM': (((0, 'CH'), (0, 'NJ1'), (0, 'NJ2'), (0, 'CE1')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'AS2': (((0, 'CG'), (0, 'CB'), (0, 'OG'), (0, 'HG')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'BIF': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'BUG': (((0, 'C6'), (0, 'C5'), (0, 'N1'), (0, 'O6')), ((0, 'C17'), (0, 'O17'), (0, 'O18'), (0, 'C15'))), 'CHG': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'CNP2': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'DCNP2': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'CPA3': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'DCPA3': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'D4P': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'DAB': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'DAH': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'DIAL': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'DDILE': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'DIPH': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'DDIPH': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'DMK': (((0, 'CG1'), (0, 'OD2'), (0, 'OD1'), (0, 'CB')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'DMP3': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'DDMP3': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'DPP': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'FPG2': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'DFPG2': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'FPG3': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'DFPG3': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'FPG4': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'DFPG4': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'FPH3': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'DFPH3': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'GBUT': (((0, 'CE'), (0, 'NZ1'), (0, 'NZ2'), (0, 'ND')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'DGBUT': (((0, 'CE'), (0, 'NZ1'), (0, 'NZ2'), (0, 'ND')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'GME': (((0, 'CD'), (0, 'CG'), (0, 'OE1'), (0, 'OE2')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'HCS': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'HHK': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'HIL4': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'DHIL4': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'HL2': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'HLEU': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'DHLEU': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'HLU': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'HPE': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'HQA': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'HRG': (((0, 'CH'), (0, 'NJ1'), (0, 'NZ'), (0, 'NJ2')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'HRP': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'HSER': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'DHSER': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'HVA': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'I2M': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'IIL': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'ILX': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'LDO': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'LMQ': (((0, 'CD'), (0, 'CG1'), (0, 'NE2'), (0, 'OE1')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'LVG': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'MEG': (((0, 'CD'), (0, 'OE2'), (0, 'OE1'), (0, 'CG1')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'MEN': (((0, 'CG'), (0, 'CB'), (0, 'ND'), (0, 'OD1')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'MEQ': (((0, 'CD'), (0, 'CG'), (0, 'NE2'), (0, 'OE1')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'MHO': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'MOT5': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'DMOT5': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'MP34': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'DMP34': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'MPH2': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'DMPH2': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'MTR5': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'DMTR5': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'MTR6': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'DMTR6': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'MTY': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'NAL': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'NAO1': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'DNAO1': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'NAO2': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'DNAO2': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'NVA': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'OAS': (((0, 'CD'), (0, 'CE'), (0, 'OD'), (0, 'OG')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'OLT': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'OMT': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'ONL': (((0, 'CD'), (0, 'CG'), (0, 'CE'), (0, 'OD')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'ORN': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'OTYR': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'DOTYR': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'PFF': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'PPN': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'PYR3': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'DPYR3': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'PYR4': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'DPYR4': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'QU33': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'DQU33': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'QU34': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'DQU34': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'QU35': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'DQU35': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'QU36': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'DQU36': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'SLZ': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'SME': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'SYM': (((0, 'CD1'), (0, 'OE1'), (0, 'OE2'), (0, 'CG')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'TBP4': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'DTBP4': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'TH6': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'THA3': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'DTHA3': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'TRX': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'UN1': (((0, 'CE'), (0, 'OZ1'), (0, 'OZ2'), (0, 'CD')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'VAH': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'WFP': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), '2GX': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), '2MR': (((0, 'CZ'), (0, 'NH1'), (0, 'NH2'), (0, 'NE')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), '5CT': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), '9R1': (((0, 'CN'), (0, 'ON2'), (0, 'ON1'), (0, 'CZ')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'ASL': (((0, 'CG'), (0, 'CB'), (0, 'OD2'), (0, 'OD1')), ((0, 'C1'), (0, 'O2'), (0, 'O1'), (0, 'C2')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'AZH': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'CGUP': (((0, 'CD1'), (0, 'OE12'), (0, 'OE11'), (0, 'CG')), ((0, 'CD2'), (0, 'CG'), (0, 'OE21'), (0, 'OE22')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'CYQ': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'DA2': (((0, 'CZ'), (0, 'NH1'), (0, 'NE'), (0, 'NH2')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'DBB': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'DDEP': (((0, 'CBI'), (0, 'CBW'), (0, 'NAD'), (0, 'OAG')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'DNP': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'GPL': (((0, 'C6'), (0, 'C5'), (0, 'N1'), (0, 'O6')), ((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'N2')), ((0, 'N2'), (0, 'H22'), (0, 'H21'), (0, 'C2')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'IAS': (((0, 'CG'), (0, 'OD2'), (0, 'OD1'), (0, 'CB')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'KHB': (((0, 'C1'), (0, 'C2'), (0, 'NZ'), (0, 'O1')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'LYX': (((0, 'C23'), (0, 'C21'), (0, 'NZ'), (0, 'O33')), ((0, 'C16'), (0, 'C15'), (0, 'N17'), (0, 'O34')), ((0, 'C12'), (0, 'C10'), (0, 'N13'), (0, 'O35')), ((0, 'C59'), (0, 'C54'), (0, 'N58'), (0, 'N60')), ((0, 'N60'), (0, 'H601'), (0, 'H602'), (0, 'C59')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'LYZ': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'M3L': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'MHSP': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'MIR': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'MLY': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'NMM': (((0, 'CZ'), (0, 'NH2'), (0, 'NE'), (0, 'NH1')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'OCS': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'OSE': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'PHD': (((0, 'CG'), (0, 'CB'), (0, 'OD2'), (0, 'OD1')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'PHDP': (((0, 'CG'), (0, 'CB'), (0, 'OD2'), (0, 'OD1')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'PM3': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'PR3': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'PRK': (((0, 'CAL'), (0, 'CAF'), (0, 'NZ'), (0, 'OAD')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'SBG': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'SCH': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'SCS': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'SMC': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'SVV': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'TPQP': (((0, 'C2'), (0, 'C1'), (0, 'C3'), (0, 'O2')), ((0, 'C5'), (0, 'C4'), (0, 'C6'), (0, 'O5')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), '4FB': (((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'CDX'))), '8LJ': (((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'CD'))), 'AYA': (((0, 'CT'), (0, 'CM'), (0, 'N'), (0, 'OT')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'B2H': (((0, 'C'), (0, 'CA3'), (1, 'N'), (0, 'O')), ((0, 'N'), (-1, 'C'), (0, 'CA1'), (0, 'HN'))), 'B3A': (((0, 'C'), (0, 'CA1'), (1, 'N'), (0, 'O')), ((0, 'N'), (-1, 'C'), (0, 'CB'), (0, 'HN'))), 'B3E': (((0, 'CE'), (0, 'OF1'), (0, 'OF2'), (0, 'CD')), ((0, 'C'), (0, 'CA1'), (1, 'N'), (0, 'O')), ((0, 'N'), (-1, 'C'), (0, 'CB'), (0, 'HN'))), 'B3K': (((0, 'C'), (0, 'CA1'), (1, 'N'), (0, 'O')), ((0, 'N'), (-1, 'C'), (0, 'CB'), (0, 'HN'))), 'B3S': (((0, 'C'), (0, 'CA1'), (1, 'N'), (0, 'O')), ((0, 'N'), (-1, 'C'), (0, 'CB'), (0, 'HN'))), 'B3X': (((0, 'CD'), (0, 'CG'), (0, 'NE2'), (0, 'OE1')), ((0, 'C'), (0, 'CA1'), (1, 'N'), (0, 'O')), ((0, 'N'), (-1, 'C'), (0, 'CB'), (0, 'HN'))), 'B3Y': (((0, 'C'), (0, 'CA1'), (1, 'N'), (0, 'O')), ((0, 'N'), (-1, 'C'), (0, 'CB'), (0, 'HN'))), 'CH6': (((0, 'C2'), (0, 'CA2'), (0, 'N3'), (0, 'O2')), ((0, 'C'), (0, 'CA3'), (1, 'N'), (0, 'O')), ((0, 'N'), (-1, 'C'), (0, 'CA1'), (0, 'HN'))), 'CR2': (((0, 'C2'), (0, 'CA2'), (0, 'N3'), (0, 'O2')), ((0, 'C'), (0, 'CA3'), (1, 'N'), (0, 'O')), ((0, 'N'), (-1, 'C'), (0, 'CA1'), (0, 'H'))), 'CR8D': (((0, 'C1'), (0, 'C2'), (0, 'C4'), (0, 'O3')), ((0, 'C'), (0, 'C17'), (1, 'N'), (0, 'O')), ((0, 'N'), (-1, 'C'), (0, 'C16'), (0, 'H1'))), 'CRF': (((0, 'C'), (0, 'CA3'), (1, 'N'), (0, 'O')), ((0, 'N'), (-1, 'C'), (0, 'CA1'), (0, 'HN'))), 'CRO': (((0, 'C'), (0, 'CA3'), (1, 'N'), (0, 'O')), ((0, 'N'), (-1, 'C'), (0, 'CA1'), (0, 'HN'))), 'CRQ': (((0, 'CA1'), (0, 'C1'), (0, 'CB1'), (0, 'N')), ((0, 'CD3'), (0, 'CG1'), (0, 'NE1'), (0, 'OE1')), ((0, 'C2'), (0, 'CA2'), (0, 'N3'), (0, 'O2')), ((0, 'C'), (0, 'CA3'), (1, 'N'), (0, 'O'))), 'CXM': (((0, 'CN'), (0, 'ON1'), (0, 'ON2'), (0, 'N')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'DYA': (((0, 'CA'), (0, 'CB'), (0, 'C'), (0, 'N')), ((0, 'CG'), (0, 'OD1'), (0, 'OD2'), (0, 'CB')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'H'))), 'DYG': (((0, 'CG1'), (0, 'OD2'), (0, 'OD1'), (0, 'CB1')), ((0, 'C2'), (0, 'CA2'), (0, 'N3'), (0, 'O2')), ((0, 'C'), (0, 'CA3'), (1, 'N'), (0, 'O')), ((0, 'N'), (-1, 'C'), (0, 'CA1'), (0, 'HN'))), 'FGL': (((0, 'CB'), (0, 'OG2'), (0, 'OG1'), (0, 'CA')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN'))), 'FLA': (((0, 'C'), (0, 'OXT'), (0, 'O'), (0, 'CA')),), 'FME': (((0, 'CN'), (0, 'N'), (0, 'O1'), (0, 'HCN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'FP9': (((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'CDX'))), 'GL3': (((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'S')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN'))), 'GYS': (((0, 'C2'), (0, 'CA2'), (0, 'N3'), (0, 'O2')), ((0, 'C'), (0, 'CA3'), (1, 'N'), (0, 'O')), ((0, 'N'), (-1, 'C'), (0, 'CA1'), (0, 'HN'))), 'HMR': (((0, 'CZ'), (0, 'NH2'), (0, 'NE'), (0, 'NH1')), ((0, 'C'), (0, 'CH2'), (1, 'N'), (0, 'O')), ((0, 'N'), (-1, 'C'), (0, 'CA1'), (0, 'HN'))), 'HT7': (((0, 'C'), (0, 'CA1'), (1, 'N'), (0, 'O')), ((0, 'N'), (-1, 'C'), (0, 'CB'), (0, 'HN'))), 'HZP': (((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'CD'))), 'I4G': (((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'CB'))), 'MAA': (((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'CM'))), 'MDO': (((0, 'C2'), (0, 'CA2'), (0, 'N3'), (0, 'O2')), ((0, 'C'), (0, 'CA3'), (1, 'N'), (0, 'O')), ((0, 'N'), (-1, 'C'), (0, 'CA1'), (0, 'HN'))), 'MP8': (((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'CD'))), 'NRQ': (((0, 'CA1'), (0, 'C1'), (0, 'CB1'), (0, 'N')), ((0, 'C2'), (0, 'CA2'), (0, 'N3'), (0, 'O2')), ((0, 'C'), (0, 'CA3'), (1, 'N'), (0, 'O'))), 'PIA': (((0, 'C2'), (0, 'CA2'), (0, 'N3'), (0, 'O2')), ((0, 'C'), (0, 'CA3'), (1, 'N'), (0, 'O')), ((0, 'N'), (-1, 'C'), (0, 'CA1'), (0, 'HN'))), 'PR4': (((0, 'CAD'), (0, 'OAE'), (0, 'OAF'), (0, 'CAC')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'PRS': (((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'CD'))), 'PXU': (((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'CD'))), 'SUI': (((0, 'CG'), (0, 'CB'), (0, 'N2'), (0, 'OD')), ((0, 'C1'), (0, 'C1A'), (0, 'N2'), (0, 'O1')), ((0, 'C'), (0, 'C2A'), (1, 'N'), (0, 'O')), ((0, 'N'), (-1, 'C'), (0, 'C1A'), (0, 'HN'))), 'SWG': (((0, 'C2'), (0, 'CA2'), (0, 'N3'), (0, 'O2')), ((0, 'C'), (0, 'CA3'), (1, 'N'), (0, 'O')), ((0, 'N'), (-1, 'C'), (0, 'CA1'), (0, 'HN'))), 'XYG': (((0, 'CA1'), (0, 'C1'), (0, 'CB1'), (0, 'N')), ((0, 'C2'), (0, 'CA2'), (0, 'N3'), (0, 'O2')), ((0, 'C'), (0, 'CA3'), (1, 'N'), (0, 'O'))), 'SM014': (((0, 'CLP'), (0, 'CL'), (0, 'N'), (0, 'OL')), ((0, 'C'), (0, 'CA'), (0, 'NR'), (0, 'O'))), 'SM023': (((0, 'CLP'), (0, 'CL'), (0, 'N'), (0, 'OL')), ((0, 'C'), (0, 'CA'), (0, 'NR'), (0, 'O'))), 'SM032': (((0, 'CT'), (0, 'CM'), (0, 'N'), (0, 'OT')), ((0, 'C'), (0, 'CA'), (0, 'NR'), (0, 'O'))), 'SM035': (((0, 'CLP'), (0, 'CL'), (0, 'N'), (0, 'OL')), ((0, 'CB'), (0, 'CG'), (0, 'CA'), (0, 'N'))), 'SM056': (((0, 'CN'), (0, 'ON1'), (0, 'ON2'), (0, 'N')), ((0, 'C'), (0, 'CA'), (0, 'NR'), (0, 'O'))), 'SM070': (((0, 'CLP'), (0, 'CL'), (0, 'N'), (0, 'OL')), ((0, 'CA'), (0, 'CB'), (0, 'C'), (0, 'N')), ((0, 'CG'), (0, 'OD1'), (0, 'OD2'), (0, 'CB')), ((0, 'C'), (0, 'CA'), (0, 'NR'), (0, 'O'))), 'SM071': (((0, 'CLP'), (0, 'CL'), (0, 'N'), (0, 'OL')), ((0, 'CA'), (0, 'CB'), (0, 'C'), (0, 'N')), ((0, 'C'), (0, 'CA'), (0, 'NR'), (0, 'O'))), 'SM076': (((0, 'CLP'), (0, 'CL'), (0, 'N'), (0, 'OL')), ((0, 'CB'), (0, 'OG2'), (0, 'OG1'), (0, 'CA')), ((0, 'C'), (0, 'CA'), (0, 'NR'), (0, 'O'))), 'SM078': (((0, 'CN'), (0, 'N'), (0, 'O1'), (0, 'HCN')), ((0, 'C'), (0, 'CA'), (0, 'NR'), (0, 'O'))), 'SM095': (((0, 'CLP'), (0, 'CL'), (0, 'N'), (0, 'OL')),), 'SM114': (((0, 'CLP'), (0, 'CL'), (0, 'N'), (0, 'OL')), ((0, 'C'), (0, 'CA'), (0, 'NR'), (0, 'O'))), 'SM115': (((0, 'CLP'), (0, 'CL'), (0, 'N'), (0, 'OL')),), 'SM119': (((0, 'CLP'), (0, 'CL'), (0, 'N'), (0, 'OL')), ((0, 'C2'), (0, 'CA2'), (0, 'N3'), (0, 'O2'))), 'SM120': (((0, 'C2'), (0, 'CA2'), (0, 'N3'), (0, 'O2')), ((0, 'C'), (0, 'CA3'), (0, 'NR'), (0, 'O'))), 'SM136': (((0, 'C'), (0, 'CA'), (0, 'NR'), (0, 'O')),), 'SM138': (((0, 'CLP'), (0, 'CL'), (0, 'N'), (0, 'OL')), ((0, 'C'), (0, 'CA'), (0, 'NR'), (0, 'O'))), 'SM140': (((0, 'CLP'), (0, 'CL'), (0, 'N'), (0, 'OL')), ((0, 'C'), (0, 'CA'), (0, 'NR'), (0, 'O'))), 'SM154': (((0, 'CLP'), (0, 'CL'), (0, 'N'), (0, 'OL')), ((0, 'CG'), (0, 'CB'), (0, 'N2'), (0, 'OD')), ((0, 'C1'), (0, 'C1A'), (0, 'N2'), (0, 'O1')), ((0, 'C'), (0, 'C2A'), (0, 'NR'), (0, 'O'))), 'SM155': (((0, 'CLP'), (0, 'CL'), (0, 'N'), (0, 'OL')), ((0, 'CG'), (0, 'CB'), (0, 'N2'), (0, 'OD')), ((0, 'C1'), (0, 'C1A'), (0, 'N2'), (0, 'O1'))), 'SM190': (((0, 'C'), (0, 'CA'), (0, 'NT'), (0, 'O')), ((0, 'CY'), (0, 'CAY'), (0, 'N'), (0, 'OY'))), 'SM191': (((0, 'CAD'), (0, 'OAE'), (0, 'OAF'), (0, 'CAC')), ((0, 'C'), (0, 'CA'), (0, 'NR'), (0, 'O'))), 'SM192': (((0, 'C'), (0, 'CA'), (0, 'NT'), (0, 'O')), ((0, 'CY'), (0, 'CAY'), (0, 'N'), (0, 'OY'))), 'SM195': (((0, 'C'), (0, 'CA'), (0, 'NT'), (0, 'O')), ((0, 'CY'), (0, 'CAY'), (0, 'N'), (0, 'OY'))), 'SM206': (((0, 'CD'), (0, 'NE2'), (0, 'NG'), (0, 'NE1')), ((0, 'C'), (0, 'CA'), (0, 'NT'), (0, 'O')), ((0, 'CY'), (0, 'CAY'), (0, 'N'), (0, 'OY'))), 'SM209': (((0, 'CD'), (0, 'CE'), (0, 'OD'), (0, 'OG')), ((0, 'C'), (0, 'CA'), (0, 'NT'), (0, 'O')), ((0, 'CY'), (0, 'CAY'), (0, 'N'), (0, 'OY'))), 'SM210': (((0, 'C'), (0, 'CA'), (0, 'NT'), (0, 'O')), ((0, 'CY'), (0, 'CAY'), (0, 'N'), (0, 'OY'))), 'SM222': (((0, 'C'), (0, 'CA'), (0, 'NT'), (0, 'O')), ((0, 'CY'), (0, 'CAY'), (0, 'N'), (0, 'OY'))), 'SM223': (((0, 'C'), (0, 'CA'), (0, 'NT'), (0, 'O')), ((0, 'CY'), (0, 'CAY'), (0, 'N'), (0, 'OY'))), 'SM226': (((0, 'CD2'), (0, 'C1'), (0, 'NG'), (0, 'OD2')), ((0, 'C'), (0, 'CA'), (0, 'NT'), (0, 'O')), ((0, 'CY'), (0, 'CAY'), (0, 'N'), (0, 'OY'))), 'SM228': (((0, 'C'), (0, 'CA'), (0, 'NT'), (0, 'O')), ((0, 'CY'), (0, 'CAY'), (0, 'N'), (0, 'OY'))), 'SM229': (((0, 'C'), (0, 'CA'), (0, 'NT'), (0, 'O')), ((0, 'CY'), (0, 'CAY'), (0, 'N'), (0, 'OY'))), 'SM230': (((0, 'C'), (0, 'CA'), (0, 'NT'), (0, 'O')), ((0, 'CY'), (0, 'CAY'), (0, 'N'), (0, 'OY'))), 'SM231': (((0, 'C'), (0, 'CA'), (0, 'NT'), (0, 'O')), ((0, 'CY'), (0, 'CAY'), (0, 'N'), (0, 'OY'))), 'SM232': (((0, 'C'), (0, 'CA'), (0, 'NT'), (0, 'O')), ((0, 'CY'), (0, 'CAY'), (0, 'N'), (0, 'OY'))), 'SM235': (((0, 'C'), (0, 'CA'), (0, 'NT'), (0, 'O')), ((0, 'CY'), (0, 'CAY'), (0, 'N'), (0, 'OY'))), 'SM236': (((0, 'C'), (0, 'CA'), (0, 'NT'), (0, 'O')), ((0, 'CY'), (0, 'CAY'), (0, 'N'), (0, 'OY'))), 'PYRE': (((0, 'HE1'), (0, 'NZ'), (0, 'CD1'), (0, 'CE1')), ((0, 'HD1'), (0, 'CE1'), (0, 'CG'), (0, 'CD1')), ((0, 'HE2'), (0, 'NZ'), (0, 'CD2'), (0, 'CE2')), ((0, 'HD2'), (0, 'CE2'), (0, 'CG'), (0, 'CD2')), ((0, 'HG'), (0, 'CD1'), (0, 'CD2'), (0, 'CG'))), '3AP2': (((0, 'HE1'), (0, 'NZ'), (0, 'CD1'), (0, 'CE1')), ((0, 'HE2'), (0, 'NZ'), (0, 'CD2'), (0, 'CE2')), ((0, 'HD2'), (0, 'CE2'), (0, 'CG'), (0, 'CD2')), ((0, 'HG'), (0, 'CD1'), (0, 'CD2'), (0, 'CG')), ((0, 'ND1'), (0, 'CG'), (0, 'CE1'), (0, 'CD1')), ((0, 'HD11'), (0, 'HD12'), (0, 'ND1'), (0, 'CD1'))), 'PTR': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'SEP': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'TPO': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'SAM': (((0, 'O'), (0, 'CA'), (0, 'OXT'), (0, 'C')), ((0, 'N6'), (0, 'C6'), (0, 'HN61'), (0, 'HN62')), ((0, 'C6'), (0, 'N1'), (0, 'C5'), (0, 'N6'))), 'CYPR': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'O2')), ((0, 'C4'), (0, 'N3'), (0, 'C5'), (0, 'N4')), ((0, 'N4'), (0, 'C4'), (0, 'H41'), (0, 'H42'))), 'CYTH': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'O2')), ((0, 'C4'), (0, 'N3'), (0, 'C5'), (0, 'N4')), ((0, 'N4'), (0, 'C4'), (0, 'H41'), (0, 'H42'))), 'N4EM': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'O2')), ((0, 'C4'), (0, 'N3'), (0, 'C5'), (0, 'N4')), ((0, 'N4'), (0, 'C4'), (0, 'C41'), (0, 'H42'))), 'XPN': (((0, 'C'), (0, \"O1'\"), (0, \"C2'\"), (1, 'N')), ((0, \"C3'\"), (0, \"O3'\"), (0, \"C4'\"), (0, \"N2'\")), ((0, \"N2'\"), (0, \"C2'\"), (0, \"C5'\"), (0, \"C3'\"))), 'YPN': (((0, 'N'), (-1, 'C'), (0, \"C6'\"), (0, \"H1'\")), ((0, \"C3'\"), (0, \"O3'\"), (0, \"C4'\"), (0, \"N2'\")), ((0, \"N2'\"), (0, \"C2'\"), (0, \"C5'\"), (0, \"C3'\"))), 'GPN': (((0, 'C2'), (0, 'N3'), (0, 'N1'), (0, 'N2')), ((0, 'C6'), (0, 'N1'), (0, 'C5'), (0, 'O6')), ((0, 'N2'), (0, 'H21'), (0, 'C2'), (0, 'H22')), ((0, 'N'), (-1, 'C'), (0, \"C6'\"), (0, \"H1'\")), ((0, 'C'), (0, \"O1'\"), (0, \"C2'\"), (1, 'N')), ((0, \"C3'\"), (0, \"O3'\"), (0, \"C4'\"), (0, \"N2'\")), ((0, \"N2'\"), (0, \"C2'\"), (0, \"C5'\"), (0, \"C3'\"))), 'CPN': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'O2')), ((0, 'C4'), (0, 'N3'), (0, 'C5'), (0, 'N4')), ((0, 'N'), (-1, 'C'), (0, \"C6'\"), (0, \"H1'\")), ((0, 'C'), (0, \"O1'\"), (0, \"C2'\"), (1, 'N')), ((0, \"C3'\"), (0, \"O3'\"), (0, \"C4'\"), (0, \"N2'\")), ((0, \"N2'\"), (0, \"C2'\"), (0, \"C5'\"), (0, \"C3'\"))), 'TPN': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'O2')), ((0, 'C4'), (0, 'N3'), (0, 'C5'), (0, 'O4')), ((0, 'C5'), (0, 'C4'), (0, 'C6'), (0, 'C5M')), ((0, 'N'), (-1, 'C'), (0, \"C6'\"), (0, \"H1'\")), ((0, 'C'), (0, \"O1'\"), (0, \"C2'\"), (1, 'N')), ((0, \"C3'\"), (0, \"O3'\"), (0, \"C4'\"), (0, \"N2'\")), ((0, \"N2'\"), (0, \"C2'\"), (0, \"C5'\"), (0, \"C3'\"))), 'UPN': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'O2')), ((0, 'C4'), (0, 'N3'), (0, 'C5'), (0, 'O4')), ((0, 'N'), (-1, 'C'), (0, \"C6'\"), (0, \"H1'\")), ((0, 'C'), (0, \"O1'\"), (0, \"C2'\"), (1, 'N')), ((0, \"C3'\"), (0, \"O3'\"), (0, \"C4'\"), (0, \"N2'\")), ((0, \"N2'\"), (0, \"C2'\"), (0, \"C5'\"), (0, \"C3'\"))), 'APN': (((0, 'N6'), (0, 'C6'), (0, 'H61'), (0, 'H62')), ((0, 'C6'), (0, 'N1'), (0, 'C5'), (0, 'N6')), ((0, 'N'), (-1, 'C'), (0, \"C6'\"), (0, \"H1'\")), ((0, 'C'), (0, \"O1'\"), (0, \"C2'\"), (1, 'N')), ((0, \"C3'\"), (0, \"O3'\"), (0, \"C4'\"), (0, \"N2'\")), ((0, \"N2'\"), (0, \"C2'\"), (0, \"C5'\"), (0, \"C3'\"))), 'E1XM': (((0, 'C2'), (0, 'N3'), (0, 'N1'), (0, 'O2')), ((0, 'C6'), (0, 'N1'), (0, 'C5'), (0, 'O6'))), 'E1XE': (((0, 'C2'), (0, 'N3'), (0, 'N1'), (0, 'O2')), ((0, 'C6'), (0, 'N1'), (0, 'C5'), (0, 'O6'))), 'E1X': (((0, 'C2'), (0, 'N3'), (0, 'N1'), (0, 'O2')), ((0, 'C6'), (0, 'N1'), (0, 'C5'), (0, 'O6'))), 'OMU': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'O2')), ((0, 'C4'), (0, 'N3'), (0, 'C5'), (0, 'O4'))), '2SU': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'S2')), ((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'O4'))), 'MSU': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'S2')), ((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'O4'))), '4SU': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'O2')), ((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'S4'))), '52U': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'S2')), ((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'O4'))), '5MU': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'O2')), ((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'O4')), ((0, 'C5'), (0, 'C4'), (0, 'C6'), (0, 'C5M'))), '2MU': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'O2')), ((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'O4')), ((0, 'C5'), (0, 'C4'), (0, 'C6'), (0, 'C5M'))), 'H2U': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'O2')), ((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'O4'))), 'MDU': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'O2')), ((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'O4'))), '5HU': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'O2')), ((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'O4'))), 'MOU': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'O2')), ((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'O4'))), '3MU': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'O2')), ((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'O4'))), 'M3U': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'O2')), ((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'O4'))), 'CYU': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'O2')), ((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'O4'))), 'PSU': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'O2')), ((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'O4'))), 'OMP': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'O2')), ((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'O4'))), '1MP': (((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'O4')), ((0, 'C2'), (0, 'N3'), (0, 'N1'), (0, 'O2'))), '3MP': (((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'O4')), ((0, 'C2'), (0, 'N3'), (0, 'N1'), (0, 'O2'))), 'SAU': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'S2')), ((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'O4'))), '5AU': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'O2')), ((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'O4'))), 'U8U': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'S2')), ((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'O4'))), 'SEU': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'SE2')), ((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'O4'))), '5DU': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'O2')), ((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'O4')), ((0, 'C10'), (0, 'O11'), (0, 'O12'), (0, 'C9'))), 'MAU': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'O2')), ((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'O4')), ((0, 'C10'), (0, 'O11'), (0, 'O12'), (0, 'C9'))), 'SCU': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'S2')), ((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'O4')), ((0, 'C10'), (0, 'O11'), (0, 'O12'), (0, 'C9'))), 'IAU': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'O2')), ((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'O4'))), 'MIU': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'O2')), ((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'O4'))), 'ISU': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'S2')), ((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'O4'))), '5CU': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'O2')), ((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'O4')), ((0, 'C8'), (0, 'O82'), (0, 'O81'), (0, 'C7'))), 'OCU': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'O2')), ((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'O4')), ((0, 'C8'), (0, 'C7'), (0, 'O8'), (0, 'O9'))), 'MEU': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'O2')), ((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'O4')), ((0, 'C8'), (0, 'C7'), (0, 'O8'), (0, 'O9'))), '70U': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'S2')), ((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'O4')), ((0, 'C8'), (0, 'C5M'), (0, 'O8'), (0, 'O9'))), 'BCU': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'O2')), ((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'O4')), ((0, 'C8'), (0, 'C7'), (0, 'N8'), (0, 'O8'))), 'MCU': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'O2')), ((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'O4')), ((0, 'C8'), (0, 'C7'), (0, 'N8'), (0, 'O8'))), 'HCU': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'O2')), ((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'O4')), ((0, 'C8'), (0, 'O82'), (0, 'O81'), (0, 'C7'))), 'CMU': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'O2')), ((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'O4')), ((0, 'C8'), (0, 'C7'), (0, 'O8'), (0, 'O9'))), 'OAU': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'O2')), ((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'O4')), ((0, 'C9'), (0, 'O92'), (0, 'O91'), (0, 'C8'))), 'OEU': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'O2')), ((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'O4')), ((0, 'C9'), (0, 'C8'), (0, 'O9'), (0, 'O10'))), '3AU': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'O2')), ((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'O4')), ((0, 'C13'), (0, 'O30'), (0, 'O31'), (0, 'C12'))), '13P': (((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'O4')), ((0, 'C2'), (0, 'N3'), (0, 'N1'), (0, 'O2')), ((0, 'C13'), (0, 'O30'), (0, 'O31'), (0, 'C12'))), '5TU': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'O2')), ((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'O4'))), 'STU': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'S2')), ((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'O4'))), 'GAU': (((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'O4')),), 'GCU': (((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'O4')), ((0, 'C10'), (0, 'O11'), (0, 'O12'), (0, 'C9'))), 'OMC': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'O2')), ((0, 'C4'), (0, 'N3'), (0, 'C5'), (0, 'N4')), ((0, 'N4'), (0, 'C4'), (0, 'H41'), (0, 'H42'))), '2SC': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'S2')), ((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'N4')), ((0, 'N4'), (0, 'H41'), (0, 'H42'), (0, 'C4'))), '5MC': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'O2')), ((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'N4')), ((0, 'N4'), (0, 'H41'), (0, 'H42'), (0, 'C4'))), 'MMC': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'O2')), ((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'N4')), ((0, 'N4'), (0, 'H41'), (0, 'H42'), (0, 'C4'))), 'HMC': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'O2')), ((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'N4')), ((0, 'N4'), (0, 'H41'), (0, 'H42'), (0, 'C4'))), '5FC': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'O2')), ((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'N4')), ((0, 'N4'), (0, 'H41'), (0, 'H42'), (0, 'C4')), ((0, 'C7'), (0, 'C5'), (0, 'O7'), (0, 'H7'))), 'MFC': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'O2')), ((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'N4')), ((0, 'N4'), (0, 'H41'), (0, 'H42'), (0, 'C4')), ((0, 'C7'), (0, 'C5'), (0, 'O7'), (0, 'H7'))), '4MC': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'O2')), ((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'N4'))), '4OC': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'O2')), ((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'N4'))), '4AC': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'O2')), ((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'N4')), ((0, 'C7'), (0, 'C8'), (0, 'N4'), (0, 'O7'))), 'MAC': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'O2')), ((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'N4')), ((0, 'C7'), (0, 'C8'), (0, 'N4'), (0, 'O7'))), 'TMC': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'O2')), ((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'N4'))), '3MC': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'O2')), ((0, 'C4'), (0, 'N3'), (0, 'N4'), (0, 'C5')), ((0, 'N4'), (0, 'H41'), (0, 'H42'), (0, 'C4'))), 'K2C': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'N2')), ((0, 'C4'), (0, 'C5'), (0, 'N4'), (0, 'N3')), ((0, 'C13'), (0, 'O30'), (0, 'O31'), (0, 'C12'))), 'R2C': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'N2')), ((0, 'C4'), (0, 'C5'), (0, 'N4'), (0, 'N3')), ((0, 'CZ'), (0, 'NE'), (0, 'NH1'), (0, 'NH2'))), '1PC': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'N2')), ((0, 'N2'), (0, 'H22'), (0, 'H21'), (0, 'C2')), ((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'O4'))), '3PC': (((0, 'C2'), (0, 'N3'), (0, 'N1'), (0, 'N2')), ((0, 'N2'), (0, 'H22'), (0, 'H21'), (0, 'C2')), ((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'O4'))), 'OMA': (((0, 'N6'), (0, 'C6'), (0, 'H61'), (0, 'H62')), ((0, 'C6'), (0, 'N1'), (0, 'C5'), (0, 'N6'))), 'RIA': (((0, 'N6'), (0, 'C6'), (0, 'H61'), (0, 'H62')), ((0, 'C6'), (0, 'N1'), (0, 'C5'), (0, 'N6'))), '6MA': (((0, 'C6'), (0, 'C5'), (0, 'N1'), (0, 'N6')),), 'MMA': (((0, 'C6'), (0, 'C5'), (0, 'N1'), (0, 'N6')),), 'M6A': (((0, 'C6'), (0, 'C5'), (0, 'N1'), (0, 'N6')),), 'MTA': (((0, 'C6'), (0, 'C5'), (0, 'N1'), (0, 'N6')),), '2MA': (((0, 'N6'), (0, 'H61'), (0, 'H62'), (0, 'C6')), ((0, 'C6'), (0, 'C5'), (0, 'N1'), (0, 'N6'))), '8MA': (((0, 'N6'), (0, 'H61'), (0, 'H62'), (0, 'C6')), ((0, 'C6'), (0, 'C5'), (0, 'N1'), (0, 'N6'))), 'INO': (((0, 'C6'), (0, 'C5'), (0, 'N1'), (0, 'O6')),), 'OMI': (((0, 'C6'), (0, 'C5'), (0, 'N1'), (0, 'O6')),), '1MI': (((0, 'C6'), (0, 'C5'), (0, 'N1'), (0, 'O6')),), 'MMI': (((0, 'C6'), (0, 'C5'), (0, 'N1'), (0, 'O6')),), 'SMA': (((0, 'C6'), (0, 'C5'), (0, 'N1'), (0, 'N6')),), '6AA': (((0, 'C10'), (0, 'C11'), (0, 'N6'), (0, 'O10')), ((0, 'C6'), (0, 'C5'), (0, 'N1'), (0, 'N6'))), '1MA': (((0, 'C6'), (0, 'N1'), (0, 'N6'), (0, 'C5')), ((0, 'N6'), (0, 'H62'), (0, 'H61'), (0, 'C6'))), 'M2A': (((0, 'C6'), (0, 'N1'), (0, 'N6'), (0, 'C5')), ((0, 'N6'), (0, 'H62'), (0, 'H61'), (0, 'C6'))), '6IA': (((0, 'C6'), (0, 'C5'), (0, 'N1'), (0, 'N6')),), 'HIA': (((0, 'C6'), (0, 'C5'), (0, 'N1'), (0, 'N6')),), 'MIA': (((0, 'C6'), (0, 'C5'), (0, 'N1'), (0, 'N6')),), 'SIA': (((0, 'C6'), (0, 'C5'), (0, 'N1'), (0, 'N6')),), 'HNA': (((0, 'C10'), (0, 'N6'), (0, 'N11'), (0, 'O10')), ((0, 'C13'), (0, 'ODB'), (0, 'ODA'), (0, 'C12')), ((0, 'C6'), (0, 'C5'), (0, 'N1'), (0, 'N6'))), '26A': (((0, 'C10'), (0, 'N6'), (0, 'N11'), (0, 'O10')), ((0, 'C13'), (0, 'ODB'), (0, 'ODA'), (0, 'C12')), ((0, 'C6'), (0, 'C5'), (0, 'N1'), (0, 'N6'))), '66A': (((0, 'C10'), (0, 'N6'), (0, 'N11'), (0, 'O10')), ((0, 'C13'), (0, 'ODB'), (0, 'ODA'), (0, 'C12')), ((0, 'C6'), (0, 'C5'), (0, 'N1'), (0, 'N6'))), 'T6A': (((0, 'C10'), (0, 'N6'), (0, 'N11'), (0, 'O10')), ((0, 'C13'), (0, 'ODB'), (0, 'ODA'), (0, 'C12')), ((0, 'C6'), (0, 'C5'), (0, 'N1'), (0, 'N6'))), '12A': (((0, 'C10'), (0, 'N6'), (0, 'N11'), (0, 'O10')), ((0, 'C13'), (0, 'ODB'), (0, 'ODA'), (0, 'C12')), ((0, 'C6'), (0, 'C5'), (0, 'N1'), (0, 'N6'))), '6GA': (((0, 'C10'), (0, 'N6'), (0, 'N11'), (0, 'O10')), ((0, 'C13'), (0, 'ODB'), (0, 'ODA'), (0, 'C12')), ((0, 'C6'), (0, 'C5'), (0, 'N1'), (0, 'N6'))), 'OMG': (((0, 'C2'), (0, 'N3'), (0, 'N1'), (0, 'N2')), ((0, 'C6'), (0, 'N1'), (0, 'C5'), (0, 'O6')), ((0, 'N2'), (0, 'H21'), (0, 'C2'), (0, 'H22'))), 'RIG': (((0, 'C2'), (0, 'N3'), (0, 'N1'), (0, 'N2')), ((0, 'C6'), (0, 'N1'), (0, 'C5'), (0, 'O6')), ((0, 'N2'), (0, 'H21'), (0, 'C2'), (0, 'H22'))), '1MG': (((0, 'C6'), (0, 'C5'), (0, 'N1'), (0, 'O6')), ((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'N2')), ((0, 'N2'), (0, 'H22'), (0, 'H21'), (0, 'C2'))), 'M1G': (((0, 'C6'), (0, 'C5'), (0, 'N1'), (0, 'O6')), ((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'N2')), ((0, 'N2'), (0, 'H22'), (0, 'H21'), (0, 'C2'))), '2MG': (((0, 'C6'), (0, 'C5'), (0, 'N1'), (0, 'O6')), ((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'N2'))), 'MMG': (((0, 'C6'), (0, 'C5'), (0, 'N1'), (0, 'O6')), ((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'N2'))), '7MG': (((0, 'C6'), (0, 'C5'), (0, 'N1'), (0, 'O6')), ((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'N2')), ((0, 'N2'), (0, 'H22'), (0, 'H21'), (0, 'C2'))), '27G': (((0, 'C6'), (0, 'C5'), (0, 'N1'), (0, 'O6')), ((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'N2'))), 'M7G': (((0, 'C6'), (0, 'C5'), (0, 'N1'), (0, 'O6')), ((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'N2'))), 'M2G': (((0, 'C6'), (0, 'C5'), (0, 'N1'), (0, 'O6')), ((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'N2'))), 'MTG': (((0, 'C6'), (0, 'C5'), (0, 'N1'), (0, 'O6')), ((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'N2'))), 'N2G': (((0, 'C6'), (0, 'C5'), (0, 'N1'), (0, 'O6')), ((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'N2'))), 'DCG': (((0, 'C6'), (0, 'C5'), (0, 'N1'), (0, 'O6')), ((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'N2')), ((0, 'N2'), (0, 'H22'), (0, 'H21'), (0, 'C2'))), 'RCG': (((0, 'C6'), (0, 'C5'), (0, 'N1'), (0, 'O6')), ((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'N2')), ((0, 'N2'), (0, 'H22'), (0, 'H21'), (0, 'C2')), ((0, 'C10'), (0, 'N12'), (0, 'N11'), (0, 'C7'))), 'DAG': (((0, 'C6'), (0, 'C5'), (0, 'N1'), (0, 'O6')), ((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'N2')), ((0, 'N2'), (0, 'H22'), (0, 'H21'), (0, 'C2'))), 'QUG': (((0, 'C6'), (0, 'C5'), (0, 'N1'), (0, 'O6')), ((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'N2')), ((0, 'N2'), (0, 'H22'), (0, 'H21'), (0, 'C2'))), 'EQG': (((0, 'C6'), (0, 'C5'), (0, 'N1'), (0, 'O6')), ((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'N2')), ((0, 'N2'), (0, 'H22'), (0, 'H21'), (0, 'C2'))), 'MQG': (((0, 'C6'), (0, 'C5'), (0, 'N1'), (0, 'O6')), ((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'N2')), ((0, 'N2'), (0, 'H22'), (0, 'H21'), (0, 'C2'))), 'GQG': (((0, 'C6'), (0, 'C5'), (0, 'N1'), (0, 'O6')), ((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'N2')), ((0, 'N2'), (0, 'H22'), (0, 'H21'), (0, 'C2'))), 'DWG': (((0, 'C6'), (0, 'C5'), (0, 'N1'), (0, 'O6')),), 'IMG': (((0, 'C6'), (0, 'C5'), (0, 'N1'), (0, 'O6')),), 'IWG': (((0, 'C6'), (0, 'C5'), (0, 'N1'), (0, 'O6')),), 'MWG': (((0, 'C6'), (0, 'C5'), (0, 'N1'), (0, 'O6')),), 'YYG': (((0, 'C6'), (0, 'C5'), (0, 'N1'), (0, 'O6')), ((0, 'C16'), (0, 'C15'), (0, 'O17'), (0, 'O18')), ((0, 'C21'), (0, 'N20'), (0, 'O22'), (0, 'O23'))), 'HWG': (((0, 'C6'), (0, 'C5'), (0, 'N1'), (0, 'O6')), ((0, 'C16'), (0, 'C15'), (0, 'O17'), (0, 'O18')), ((0, 'C21'), (0, 'N20'), (0, 'O22'), (0, 'O23'))), 'PBG': (((0, 'C6'), (0, 'C5'), (0, 'N1'), (0, 'O6')), ((0, 'C17'), (0, 'C16'), (0, 'O17'), (0, 'O18')), ((0, 'C21'), (0, 'N20'), (0, 'O22'), (0, 'O23'))), 'BMQG': (((0, 'C6'), (0, 'C5'), (0, 'N1'), (0, 'O6')), ((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'N2')), ((0, 'N2'), (0, 'H22'), (0, 'H21'), (0, 'C2'))), 'BGQG': (((0, 'C6'), (0, 'C5'), (0, 'N1'), (0, 'O6')), ((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'N2')), ((0, 'N2'), (0, 'H22'), (0, 'H21'), (0, 'C2'))), 'GMP': (((0, 'C2'), (0, 'N3'), (0, 'N1'), (0, 'N2')), ((0, 'C6'), (0, 'N1'), (0, 'C5'), (0, 'O6')), ((0, 'N2'), (0, 'H21'), (0, 'C2'), (0, 'H22'))), 'GDP': (((0, 'C2'), (0, 'N3'), (0, 'N1'), (0, 'N2')), ((0, 'C6'), (0, 'N1'), (0, 'C5'), (0, 'O6')), ((0, 'N2'), (0, 'H21'), (0, 'C2'), (0, 'H22'))), 'GTP': (((0, 'C2'), (0, 'N3'), (0, 'N1'), (0, 'N2')), ((0, 'C6'), (0, 'N1'), (0, 'C5'), (0, 'O6')), ((0, 'N2'), (0, 'H21'), (0, 'C2'), (0, 'H22'))), 'CMP': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'O2')), ((0, 'C4'), (0, 'N3'), (0, 'C5'), (0, 'N4')), ((0, 'N4'), (0, 'C4'), (0, 'H41'), (0, 'H42'))), 'CDP': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'O2')), ((0, 'C4'), (0, 'N3'), (0, 'C5'), (0, 'N4')), ((0, 'N4'), (0, 'C4'), (0, 'H41'), (0, 'H42'))), 'CTP': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'O2')), ((0, 'C4'), (0, 'N3'), (0, 'C5'), (0, 'N4')), ((0, 'N4'), (0, 'C4'), (0, 'H41'), (0, 'H42'))), 'TMP': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'O2')), ((0, 'C4'), (0, 'N3'), (0, 'C5'), (0, 'O4')), ((0, 'C5'), (0, 'C4'), (0, 'C6'), (0, 'C5M'))), 'TDP': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'O2')), ((0, 'C4'), (0, 'N3'), (0, 'C5'), (0, 'O4')), ((0, 'C5'), (0, 'C4'), (0, 'C6'), (0, 'C5M'))), 'TTP': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'O2')), ((0, 'C4'), (0, 'N3'), (0, 'C5'), (0, 'O4')), ((0, 'C5'), (0, 'C4'), (0, 'C6'), (0, 'C5M'))), 'UMP': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'O2')), ((0, 'C4'), (0, 'N3'), (0, 'C5'), (0, 'O4'))), 'UDP': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'O2')), ((0, 'C4'), (0, 'N3'), (0, 'C5'), (0, 'O4'))), 'UTP': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'O2')), ((0, 'C4'), (0, 'N3'), (0, 'C5'), (0, 'O4'))), 'NAI': (((0, 'N6A'), (0, 'C6A'), (0, 'H61A'), (0, 'H62A')), ((0, 'C6A'), (0, 'N1A'), (0, 'C5A'), (0, 'N6A')), ((0, 'C7N'), (0, 'N7N'), (0, 'C3N'), (0, 'O7N')), ((0, 'C7N'), (0, 'C3N'), (0, 'N7N'), (0, 'O7N')), ((0, 'N7N'), (0, 'C7N'), (0, 'H71N'), (0, 'H72N')), ((0, 'N7N'), (0, 'C7N'), (0, 'H72N'), (0, 'H71N')), ((0, 'C6N'), (0, 'N1N'), (0, 'C5N'), (0, 'HN6')), ((0, 'C5N'), (0, 'C6N'), (0, 'C4N'), (0, 'H5N')), ((0, 'C4N'), (0, 'C5N'), (0, 'C3N'), (0, 'H41N')), ((0, 'C2N'), (0, 'C3N'), (0, 'N1N'), (0, 'H2N'))), 'NAP': (((0, 'N6A'), (0, 'C6A'), (0, 'H61A'), (0, 'H62A')), ((0, 'C6A'), (0, 'N1A'), (0, 'C5A'), (0, 'N6A')), ((0, 'C7N'), (0, 'N7N'), (0, 'C3N'), (0, 'O7N')), ((0, 'C7N'), (0, 'C3N'), (0, 'N7N'), (0, 'O7N')), ((0, 'N7N'), (0, 'C7N'), (0, 'H71N'), (0, 'H72N')), ((0, 'N7N'), (0, 'C7N'), (0, 'H72N'), (0, 'H71N')), ((0, 'C6N'), (0, 'N1N'), (0, 'C5N'), (0, 'HN6')), ((0, 'C5N'), (0, 'C6N'), (0, 'C4N'), (0, 'H5N')), ((0, 'C4N'), (0, 'C5N'), (0, 'C3N'), (0, 'H41N')), ((0, 'C2N'), (0, 'C3N'), (0, 'N1N'), (0, 'H2N'))), 'NDP': (((0, 'N6A'), (0, 'C6A'), (0, 'H61A'), (0, 'H62A')), ((0, 'C6A'), (0, 'N1A'), (0, 'C5A'), (0, 'N6A')), ((0, 'C7N'), (0, 'N7N'), (0, 'C3N'), (0, 'O7N')), ((0, 'C7N'), (0, 'C3N'), (0, 'N7N'), (0, 'O7N')), ((0, 'N7N'), (0, 'C7N'), (0, 'H71N'), (0, 'H72N')), ((0, 'N7N'), (0, 'C7N'), (0, 'H72N'), (0, 'H71N')), ((0, 'C6N'), (0, 'N1N'), (0, 'C5N'), (0, 'HN6')), ((0, 'C5N'), (0, 'C6N'), (0, 'C4N'), (0, 'H5N')), ((0, 'C4N'), (0, 'C5N'), (0, 'C3N'), (0, 'H41N')), ((0, 'C2N'), (0, 'C3N'), (0, 'N1N'), (0, 'H2N'))), 'NAD1': (((0, 'AN6'), (0, 'AC6'), (0, 'AH61'), (0, 'AH62')), ((0, 'AC6'), (0, 'AN1'), (0, 'AC5'), (0, 'AN6')), ((0, 'NC7'), (0, 'NN7'), (0, 'NC3'), (0, 'NO7')), ((0, 'NC7'), (0, 'NC3'), (0, 'NN7'), (0, 'NO7')), ((0, 'NN7'), (0, 'NC7'), (0, 'NH71'), (0, 'NH72')), ((0, 'NN7'), (0, 'NC7'), (0, 'NH72'), (0, 'NH71')), ((0, 'NC6'), (0, 'NN1'), (0, 'NC5'), (0, 'NH6')), ((0, 'NC5'), (0, 'NC6'), (0, 'NC4'), (0, 'NH5')), ((0, 'NC4'), (0, 'NC5'), (0, 'NC3'), (0, 'NH4')), ((0, 'NC2'), (0, 'NC3'), (0, 'NN1'), (0, 'NH2'))), 'PTS': (((0, 'PX'), (0, 'O1X'), (0, 'O2X'), (0, \"O3'\")),), 'ANE5GC': (((0, 'C'), (0, 'C10'), (0, 'N'), (0, 'O')), ((0, 'N'), (0, 'C'), (0, 'C5'), (0, 'HN'))), 'BNE5GC': (((0, 'C'), (0, 'C10'), (0, 'N'), (0, 'O')), ((0, 'N'), (0, 'C'), (0, 'C5'), (0, 'HN'))), 'AMANNA': (((0, 'C'), (0, 'CT'), (0, 'N'), (0, 'O')), ((0, 'N'), (0, 'C'), (0, 'C2'), (0, 'HN'))), 'BMANNA': (((0, 'C'), (0, 'CT'), (0, 'N'), (0, 'O')), ((0, 'N'), (0, 'C'), (0, 'C2'), (0, 'HN'))), 'AGULNA': (((0, 'C'), (0, 'CT'), (0, 'N'), (0, 'O')), ((0, 'N'), (0, 'C'), (0, 'C2'), (0, 'HN'))), 'BGULNA': (((0, 'C'), (0, 'CT'), (0, 'N'), (0, 'O')), ((0, 'N'), (0, 'C'), (0, 'C2'), (0, 'HN'))), 'AALTNA': (((0, 'C'), (0, 'CT'), (0, 'N'), (0, 'O')), ((0, 'N'), (0, 'C'), (0, 'C2'), (0, 'HN'))), 'BALTNA': (((0, 'C'), (0, 'CT'), (0, 'N'), (0, 'O')), ((0, 'N'), (0, 'C'), (0, 'C2'), (0, 'HN'))), 'ALGLNA': (((0, 'C'), (0, 'CT'), (0, 'N'), (0, 'O')), ((0, 'N'), (0, 'C'), (0, 'C2'), (0, 'HN'))), 'BLGLNA': (((0, 'C'), (0, 'CT'), (0, 'N'), (0, 'O')), ((0, 'N'), (0, 'C'), (0, 'C2'), (0, 'HN'))), 'ALMANA': (((0, 'C'), (0, 'CT'), (0, 'N'), (0, 'O')), ((0, 'N'), (0, 'C'), (0, 'C2'), (0, 'HN'))), 'BLMANA': (((0, 'C'), (0, 'CT'), (0, 'N'), (0, 'O')), ((0, 'N'), (0, 'C'), (0, 'C2'), (0, 'HN'))), 'ALGANA': (((0, 'C'), (0, 'CT'), (0, 'N'), (0, 'O')), ((0, 'N'), (0, 'C'), (0, 'C2'), (0, 'HN'))), 'BLGANA': (((0, 'C'), (0, 'CT'), (0, 'N'), (0, 'O')), ((0, 'N'), (0, 'C'), (0, 'C2'), (0, 'HN'))), 'ALGUNA': (((0, 'C'), (0, 'CT'), (0, 'N'), (0, 'O')), ((0, 'N'), (0, 'C'), (0, 'C2'), (0, 'HN'))), 'BLGUNA': (((0, 'C'), (0, 'CT'), (0, 'N'), (0, 'O')), ((0, 'N'), (0, 'C'), (0, 'C2'), (0, 'HN'))), 'ALALNA': (((0, 'C'), (0, 'CT'), (0, 'N'), (0, 'O')), ((0, 'N'), (0, 'C'), (0, 'C2'), (0, 'HN'))), 'BLALNA': (((0, 'C'), (0, 'CT'), (0, 'N'), (0, 'O')), ((0, 'N'), (0, 'C'), (0, 'C2'), (0, 'HN'))), 'ALTANA': (((0, 'C'), (0, 'CT'), (0, 'N'), (0, 'O')), ((0, 'N'), (0, 'C'), (0, 'C2'), (0, 'HN'))), 'BLTANA': (((0, 'C'), (0, 'CT'), (0, 'N'), (0, 'O')), ((0, 'N'), (0, 'C'), (0, 'C2'), (0, 'HN'))), 'ALIDNA': (((0, 'C'), (0, 'CT'), (0, 'N'), (0, 'O')), ((0, 'N'), (0, 'C'), (0, 'C2'), (0, 'HN'))), 'BLIDNA': (((0, 'C'), (0, 'CT'), (0, 'N'), (0, 'O')), ((0, 'N'), (0, 'C'), (0, 'C2'), (0, 'HN'))), 'AALLNA': (((0, 'C'), (0, 'CT'), (0, 'N'), (0, 'O')), ((0, 'N'), (0, 'C'), (0, 'C2'), (0, 'HN'))), 'BALLNA': (((0, 'C'), (0, 'CT'), (0, 'N'), (0, 'O')), ((0, 'N'), (0, 'C'), (0, 'C2'), (0, 'HN'))), 'ATALNA': (((0, 'C'), (0, 'CT'), (0, 'N'), (0, 'O')), ((0, 'N'), (0, 'C'), (0, 'C2'), (0, 'HN'))), 'BTALNA': (((0, 'C'), (0, 'CT'), (0, 'N'), (0, 'O')), ((0, 'N'), (0, 'C'), (0, 'C2'), (0, 'HN'))), 'AIDONA': (((0, 'C'), (0, 'CT'), (0, 'N'), (0, 'O')), ((0, 'N'), (0, 'C'), (0, 'C2'), (0, 'HN'))), 'BIDONA': (((0, 'C'), (0, 'CT'), (0, 'N'), (0, 'O')), ((0, 'N'), (0, 'C'), (0, 'C2'), (0, 'HN'))), 'AMANA': (((0, 'C6'), (0, 'C5'), (0, 'O62'), (0, 'O61')),), 'BMANA': (((0, 'C6'), (0, 'C5'), (0, 'O62'), (0, 'O61')),), 'AGULA': (((0, 'C6'), (0, 'C5'), (0, 'O62'), (0, 'O61')),), 'BGULA': (((0, 'C6'), (0, 'C5'), (0, 'O62'), (0, 'O61')),), 'AALTA': (((0, 'C6'), (0, 'C5'), (0, 'O62'), (0, 'O61')),), 'BALTA': (((0, 'C6'), (0, 'C5'), (0, 'O62'), (0, 'O61')),), 'AALLA': (((0, 'C6'), (0, 'C5'), (0, 'O62'), (0, 'O61')),), 'BALLA': (((0, 'C6'), (0, 'C5'), (0, 'O62'), (0, 'O61')),), 'ATALA': (((0, 'C6'), (0, 'C5'), (0, 'O62'), (0, 'O61')),), 'BTALA': (((0, 'C6'), (0, 'C5'), (0, 'O62'), (0, 'O61')),), 'ARHMNA': (((0, 'C'), (0, 'CT'), (0, 'N'), (0, 'O')), ((0, 'N'), (0, 'C'), (0, 'C2'), (0, 'HN'))), 'BRHMNA': (((0, 'C'), (0, 'CT'), (0, 'N'), (0, 'O')), ((0, 'N'), (0, 'C'), (0, 'C2'), (0, 'HN'))), 'AFUCNA': (((0, 'C'), (0, 'CT'), (0, 'N'), (0, 'O')), ((0, 'N'), (0, 'C'), (0, 'C2'), (0, 'HN'))), 'BFUCNA': (((0, 'C'), (0, 'CT'), (0, 'N'), (0, 'O')), ((0, 'N'), (0, 'C'), (0, 'C2'), (0, 'HN'))), 'ANEU': (((0, 'C1'), (0, 'C2'), (0, 'O12'), (0, 'O11')),), 'BNEU': (((0, 'C1'), (0, 'C2'), (0, 'O12'), (0, 'O11')),), 'ADHA': (((0, 'C7'), (0, 'C6'), (0, 'O72'), (0, 'O71')),), 'BDHA': (((0, 'C7'), (0, 'C6'), (0, 'O72'), (0, 'O71')),), 'ALGULA': (((0, 'C6'), (0, 'C5'), (0, 'O62'), (0, 'O61')),), 'BLGULA': (((0, 'C6'), (0, 'C5'), (0, 'O62'), (0, 'O61')),), 'ALALTA': (((0, 'C6'), (0, 'C5'), (0, 'O62'), (0, 'O61')),), 'BLALTA': (((0, 'C6'), (0, 'C5'), (0, 'O62'), (0, 'O61')),), 'AMU2AC': (((0, 'C'), (0, 'CT'), (0, 'N2'), (0, 'O')), ((0, 'N2'), (0, 'C'), (0, 'C2'), (0, 'HN2'))), 'BMU2AC': (((0, 'C'), (0, 'CT'), (0, 'N2'), (0, 'O')), ((0, 'N2'), (0, 'C'), (0, 'C2'), (0, 'HN2'))), 'AMU2GC': (((0, 'C'), (0, 'C10'), (0, 'N2'), (0, 'O')), ((0, 'N2'), (0, 'C'), (0, 'C2'), (0, 'HN2'))), 'BMU2GC': (((0, 'C'), (0, 'C10'), (0, 'N2'), (0, 'O')), ((0, 'N2'), (0, 'C'), (0, 'C2'), (0, 'HN2'))), 'BKDN': (((0, 'C1'), (0, 'C2'), (0, 'O12'), (0, 'O11')),), 'AKDN': (((0, 'C1'), (0, 'C2'), (0, 'O12'), (0, 'O11')),), 'QUITA': (((0, 'C'), (0, 'CT'), (0, 'N'), (0, 'O')), ((0, 'N'), (0, 'C'), (0, 'C3'), (0, 'HN'))), 'BGLGL': (((0, 'CT'), (0, 'CA'), (0, 'OT2'), (0, 'OT1')),), 'AQUINA': (((0, 'C'), (0, 'CT'), (0, 'N'), (0, 'O')), ((0, 'N'), (0, 'C'), (0, 'C2'), (0, 'HN'))), 'BQUINA': (((0, 'C'), (0, 'CT'), (0, 'N'), (0, 'O')), ((0, 'N'), (0, 'C'), (0, 'C2'), (0, 'HN'))), 'AGALAA': (((0, 'C'), (0, 'CA'), (0, 'N'), (0, 'O')), ((0, 'N'), (0, 'C'), (0, 'C2'), (0, 'HN'))), 'AGLAA': (((0, 'C'), (0, 'CT'), (0, 'N'), (0, 'O')), ((0, 'N'), (0, 'C'), (0, 'C2'), (0, 'HN')), ((0, 'C6'), (0, 'C5'), (0, 'O62'), (0, 'O61'))), 'ALGLAA': (((0, 'C'), (0, 'CT'), (0, 'N'), (0, 'O')), ((0, 'N'), (0, 'C'), (0, 'C2'), (0, 'HN')), ((0, 'C6'), (0, 'C5'), (0, 'O62'), (0, 'O61'))), 'BLEG': (((0, 'C51'), (0, 'CT51'), (0, 'N51'), (0, 'O51')), ((0, 'N51'), (0, 'C51'), (0, 'C5'), (0, 'HN51')), ((0, 'C71'), (0, 'CT71'), (0, 'N71'), (0, 'O71')), ((0, 'N71'), (0, 'C71'), (0, 'C7'), (0, 'HN71'))), 'ALEG': (((0, 'C51'), (0, 'CT51'), (0, 'N51'), (0, 'O51')), ((0, 'N51'), (0, 'C51'), (0, 'C5'), (0, 'HN51')), ((0, 'C71'), (0, 'CT71'), (0, 'N71'), (0, 'O71')), ((0, 'N71'), (0, 'C71'), (0, 'C7'), (0, 'HN71'))), 'A8LEG': (((0, 'C51'), (0, 'CT51'), (0, 'N51'), (0, 'O51')), ((0, 'N51'), (0, 'C51'), (0, 'C5'), (0, 'HN51')), ((0, 'C71'), (0, 'CT71'), (0, 'N71'), (0, 'O71')), ((0, 'N71'), (0, 'C71'), (0, 'C7'), (0, 'HN71'))), 'B8LEG': (((0, 'C51'), (0, 'CT51'), (0, 'N51'), (0, 'O51')), ((0, 'N51'), (0, 'C51'), (0, 'C5'), (0, 'HN51')), ((0, 'C71'), (0, 'CT71'), (0, 'N71'), (0, 'O71')), ((0, 'N71'), (0, 'C71'), (0, 'C7'), (0, 'HN71'))), 'APSE': (((0, 'C51'), (0, 'CT51'), (0, 'N51'), (0, 'O51')), ((0, 'N51'), (0, 'C51'), (0, 'C5'), (0, 'HN51')), ((0, 'C71'), (0, 'CT71'), (0, 'N71'), (0, 'O71')), ((0, 'N71'), (0, 'C71'), (0, 'C7'), (0, 'HN71'))), 'BPSE': (((0, 'C51'), (0, 'CT51'), (0, 'N51'), (0, 'O51')), ((0, 'N51'), (0, 'C51'), (0, 'C5'), (0, 'HN51')), ((0, 'C71'), (0, 'CT71'), (0, 'N71'), (0, 'O71')), ((0, 'N71'), (0, 'C71'), (0, 'C7'), (0, 'HN71'))), 'DGLYA': (((0, 'C1'), (0, 'C2'), (0, 'O1B'), (0, 'O1A')),), 'SAPI': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))), 'SAPI13': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))), 'SAPI14': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))), 'SAPI15': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))), 'SAPI24': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))), 'SAPI25': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))), 'SAPI2A': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))), 'SAPI2B': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))), 'SAPI2C': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))), 'SAPI2D': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))), 'SAPI33': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))), 'SAPI34': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))), 'SAPI35': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))), 'DMPI': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))), 'DMPI13': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))), 'DMPI14': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))), 'DMPI15': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))), 'DMPI24': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))), 'DMPI25': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))), 'DMPI2A': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))), 'DMPI2B': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))), 'DMPI2C': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))), 'DMPI2D': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))), 'DMPI33': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))), 'DMPI34': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))), 'DMPI35': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))), 'DLIPI': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))), 'POPI': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))), 'POPI13': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))), 'POPI14': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))), 'POPI15': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))), 'POPI24': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))), 'POPI25': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))), 'POPI2A': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))), 'POPI2B': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))), 'POPI2D': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))), 'POPI2C': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))), 'POPI33': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))), 'POPI34': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))), 'POPI35': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))), 'PNPI': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))), 'PNPI13': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))), 'PNPI14': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))), 'PNPI15': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))), 'PNPI24': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))), 'PNPI25': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))), 'PNPI2A': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))), 'PNPI2B': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))), 'PNPI2C': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))), 'PNPI2D': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))), 'PNPI33': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))), 'PNPI34': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))), 'PNPI35': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))), 'PLPI': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))), 'PLPI13': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))), 'PLPI14': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))), 'PLPI15': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))), 'PLPI24': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))), 'PLPI25': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))), 'PLPI2A': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))), 'PLPI2B': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))), 'PLPI2C': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))), 'PLPI2D': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))), 'PLPI33': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))), 'PLPI34': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))), 'PLPI35': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))), 'PYPI': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))), 'PSM': (((0, 'C1F'), (0, 'C2F'), (0, 'NF'), (0, 'OF')), ((0, 'NF'), (0, 'C1F'), (0, 'C2S'), (0, 'HNF'))), 'SSM': (((0, 'C1F'), (0, 'C2F'), (0, 'NF'), (0, 'OF')), ((0, 'NF'), (0, 'C1F'), (0, 'C2S'), (0, 'HNF'))), 'OSM': (((0, 'C1F'), (0, 'C2F'), (0, 'NF'), (0, 'OF')), ((0, 'NF'), (0, 'C1F'), (0, 'C2S'), (0, 'HNF'))), 'ASM': (((0, 'C1F'), (0, 'C2F'), (0, 'NF'), (0, 'OF')), ((0, 'NF'), (0, 'C1F'), (0, 'C2S'), (0, 'HNF'))), 'BSM': (((0, 'C1F'), (0, 'C2F'), (0, 'NF'), (0, 'OF')), ((0, 'NF'), (0, 'C1F'), (0, 'C2S'), (0, 'HNF'))), '23SM': (((0, 'C1F'), (0, 'C2F'), (0, 'NF'), (0, 'OF')), ((0, 'NF'), (0, 'C1F'), (0, 'C2S'), (0, 'HNF'))), 'LSM': (((0, 'C1F'), (0, 'C2F'), (0, 'NF'), (0, 'OF')), ((0, 'NF'), (0, 'C1F'), (0, 'C2S'), (0, 'HNF'))), 'NSM': (((0, 'C1F'), (0, 'C2F'), (0, 'NF'), (0, 'OF')), ((0, 'NF'), (0, 'C1F'), (0, 'C2S'), (0, 'HNF'))), 'CER2': (((0, 'C1F'), (0, 'C2F'), (0, 'NF'), (0, 'OF')), ((0, 'NF'), (0, 'C1F'), (0, 'C2S'), (0, 'HNF'))), 'CER160': (((0, 'C1F'), (0, 'C2F'), (0, 'NF'), (0, 'OF')), ((0, 'NF'), (0, 'C1F'), (0, 'C2S'), (0, 'HNF'))), 'CER180': (((0, 'C1F'), (0, 'C2F'), (0, 'NF'), (0, 'OF')), ((0, 'NF'), (0, 'C1F'), (0, 'C2S'), (0, 'HNF'))), 'CER181': (((0, 'C1F'), (0, 'C2F'), (0, 'NF'), (0, 'OF')), ((0, 'NF'), (0, 'C1F'), (0, 'C2S'), (0, 'HNF'))), 'CER200': (((0, 'C1F'), (0, 'C2F'), (0, 'NF'), (0, 'OF')), ((0, 'NF'), (0, 'C1F'), (0, 'C2S'), (0, 'HNF'))), 'CER220': (((0, 'C1F'), (0, 'C2F'), (0, 'NF'), (0, 'OF')), ((0, 'NF'), (0, 'C1F'), (0, 'C2S'), (0, 'HNF'))), 'CER240': (((0, 'C1F'), (0, 'C2F'), (0, 'NF'), (0, 'OF')), ((0, 'NF'), (0, 'C1F'), (0, 'C2S'), (0, 'HNF'))), 'CER241': (((0, 'C1F'), (0, 'C2F'), (0, 'NF'), (0, 'OF')), ((0, 'NF'), (0, 'C1F'), (0, 'C2S'), (0, 'HNF'))), 'CER3E': (((0, 'C1F'), (0, 'C2F'), (0, 'NF'), (0, 'OF')), ((0, 'NF'), (0, 'C1F'), (0, 'C2S'), (0, 'HNF'))), 'PYPE': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))), 'YOPA': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))), 'DYPC': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))), 'YOPC': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))), 'DYPE': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))), 'YOPE': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))), 'YOPS': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32')), ((0, 'C13'), (0, 'C12'), (0, 'O13B'), (0, 'O13A'))), 'C7DHPC': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))), 'C6DHPC': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))), 'LMPG': (((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32')),), 'LPPG': (((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32')),), 'LPC12': (((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32')),), 'LPC14': (((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32')),), 'MYR': (((0, 'C1'), (0, 'O1'), (0, 'C2'), (0, 'O2')),), 'PAL': (((0, 'C1'), (0, 'O1'), (0, 'C2'), (0, 'O2')),), 'STE': (((0, 'C1'), (0, 'O1'), (0, 'C2'), (0, 'O2')),), 'ARA': (((0, 'C1'), (0, 'O1'), (0, 'C2'), (0, 'O2')),), 'BEH': (((0, 'C1'), (0, 'O1'), (0, 'C2'), (0, 'O2')),), 'TRI': (((0, 'C1'), (0, 'O1'), (0, 'C2'), (0, 'O2')),), 'LIGN': (((0, 'C1'), (0, 'O1'), (0, 'C2'), (0, 'O2')),), 'MYRO': (((0, 'C1'), (0, 'O1'), (0, 'C2'), (0, 'O2')),), 'PALO': (((0, 'C1'), (0, 'O1'), (0, 'C2'), (0, 'O2')),), 'HTA': (((0, 'C1'), (0, 'O1'), (0, 'C2'), (0, 'O2')),), 'OLE': (((0, 'C1'), (0, 'O1'), (0, 'C2'), (0, 'O2')),), 'LIN': (((0, 'C1'), (0, 'O1'), (0, 'C2'), (0, 'O2')),), 'ALIN': (((0, 'C1'), (0, 'O1'), (0, 'C2'), (0, 'O2')),), 'SDA': (((0, 'C1'), (0, 'O1'), (0, 'C2'), (0, 'O2')),), 'GLA': (((0, 'C1'), (0, 'O1'), (0, 'C2'), (0, 'O2')),), 'EICO': (((0, 'C1'), (0, 'O1'), (0, 'C2'), (0, 'O2')),), 'EDA': (((0, 'C1'), (0, 'O1'), (0, 'C2'), (0, 'O2')),), 'MEA': (((0, 'C1'), (0, 'O1'), (0, 'C2'), (0, 'O2')),), 'DGLA': (((0, 'C1'), (0, 'O1'), (0, 'C2'), (0, 'O2')),), 'ETE': (((0, 'C1'), (0, 'O1'), (0, 'C2'), (0, 'O2')),), 'ETA': (((0, 'C1'), (0, 'O1'), (0, 'C2'), (0, 'O2')),), 'EPA': (((0, 'C1'), (0, 'O1'), (0, 'C2'), (0, 'O2')),), 'ARAN': (((0, 'C1'), (0, 'O1'), (0, 'C2'), (0, 'O2')),), 'HPA': (((0, 'C1'), (0, 'O1'), (0, 'C2'), (0, 'O2')),), 'ERU': (((0, 'C1'), (0, 'O1'), (0, 'C2'), (0, 'O2')),), 'DDA': (((0, 'C1'), (0, 'O1'), (0, 'C2'), (0, 'O2')),), 'ADR': (((0, 'C1'), (0, 'O1'), (0, 'C2'), (0, 'O2')),), 'DPT': (((0, 'C1'), (0, 'O1'), (0, 'C2'), (0, 'O2')),), 'DPA': (((0, 'C1'), (0, 'O1'), (0, 'C2'), (0, 'O2')),), 'DHA': (((0, 'C1'), (0, 'O1'), (0, 'C2'), (0, 'O2')),), 'NER': (((0, 'C1'), (0, 'O1'), (0, 'C2'), (0, 'O2')),), 'TTA': (((0, 'C1'), (0, 'O1'), (0, 'C2'), (0, 'O2')),), 'TPT': (((0, 'C1'), (0, 'O1'), (0, 'C2'), (0, 'O2')),), 'TPA': (((0, 'C1'), (0, 'O1'), (0, 'C2'), (0, 'O2')),), 'THA': (((0, 'C1'), (0, 'O1'), (0, 'C2'), (0, 'O2')),), 'MYRP': (((0, 'C1'), (0, 'O1'), (0, 'C2'), (0, 'O2')),), 'PALP': (((0, 'C1'), (0, 'O1'), (0, 'C2'), (0, 'O2')),), 'STEP': (((0, 'C1'), (0, 'O1'), (0, 'C2'), (0, 'O2')),), 'ARAP': (((0, 'C1'), (0, 'O1'), (0, 'C2'), (0, 'O2')),), 'BEHP': (((0, 'C1'), (0, 'O1'), (0, 'C2'), (0, 'O2')),), 'TRIP': (((0, 'C1'), (0, 'O1'), (0, 'C2'), (0, 'O2')),), 'LIGNP': (((0, 'C1'), (0, 'O1'), (0, 'C2'), (0, 'O2')),), 'MYROP': (((0, 'C1'), (0, 'O1'), (0, 'C2'), (0, 'O2')),), 'PALOP': (((0, 'C1'), (0, 'O1'), (0, 'C2'), (0, 'O2')),), 'HTAP': (((0, 'C1'), (0, 'O1'), (0, 'C2'), (0, 'O2')),), 'OLEP': (((0, 'C1'), (0, 'O1'), (0, 'C2'), (0, 'O2')),), 'LINP': (((0, 'C1'), (0, 'O1'), (0, 'C2'), (0, 'O2')),), 'ALINP': (((0, 'C1'), (0, 'O1'), (0, 'C2'), (0, 'O2')),), 'SDAP': (((0, 'C1'), (0, 'O1'), (0, 'C2'), (0, 'O2')),), 'GLAP': (((0, 'C1'), (0, 'O1'), (0, 'C2'), (0, 'O2')),), 'EICOP': (((0, 'C1'), (0, 'O1'), (0, 'C2'), (0, 'O2')),), 'EDAP': (((0, 'C1'), (0, 'O1'), (0, 'C2'), (0, 'O2')),), 'MEAP': (((0, 'C1'), (0, 'O1'), (0, 'C2'), (0, 'O2')),), 'DGLAP': (((0, 'C1'), (0, 'O1'), (0, 'C2'), (0, 'O2')),), 'ETEP': (((0, 'C1'), (0, 'O1'), (0, 'C2'), (0, 'O2')),), 'ETAP': (((0, 'C1'), (0, 'O1'), (0, 'C2'), (0, 'O2')),), 'EPAP': (((0, 'C1'), (0, 'O1'), (0, 'C2'), (0, 'O2')),), 'ARANP': (((0, 'C1'), (0, 'O1'), (0, 'C2'), (0, 'O2')),), 'HPAP': (((0, 'C1'), (0, 'O1'), (0, 'C2'), (0, 'O2')),), 'ERUP': (((0, 'C1'), (0, 'O1'), (0, 'C2'), (0, 'O2')),), 'DDAP': (((0, 'C1'), (0, 'O1'), (0, 'C2'), (0, 'O2')),), 'ADRP': (((0, 'C1'), (0, 'O1'), (0, 'C2'), (0, 'O2')),), 'DPTP': (((0, 'C1'), (0, 'O1'), (0, 'C2'), (0, 'O2')),), 'DPAP': (((0, 'C1'), (0, 'O1'), (0, 'C2'), (0, 'O2')),), 'DHAP': (((0, 'C1'), (0, 'O1'), (0, 'C2'), (0, 'O2')),), 'NERP': (((0, 'C1'), (0, 'O1'), (0, 'C2'), (0, 'O2')),), 'TTAP': (((0, 'C1'), (0, 'O1'), (0, 'C2'), (0, 'O2')),), 'TPTP': (((0, 'C1'), (0, 'O1'), (0, 'C2'), (0, 'O2')),), 'TPAP': (((0, 'C1'), (0, 'O1'), (0, 'C2'), (0, 'O2')),), 'THAP': (((0, 'C1'), (0, 'O1'), (0, 'C2'), (0, 'O2')),), 'THDPPC': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))), 'CYSP': (((0, 'C1'), (0, 'O1'), (0, 'SG'), (0, 'C2')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'GLYM': (((0, 'C1'), (0, 'O1'), (0, 'N'), (0, 'C2')), ((0, 'N'), (0, 'C1'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'LYSM': (((0, 'C1'), (0, 'O1'), (0, 'N'), (0, 'C2')), ((0, 'N'), (0, 'C1'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))), 'CYSL': (((0, 'CA1'), (0, 'OA1'), (0, 'N'), (0, 'CA2')), ((0, 'N'), (0, 'CA1'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O')), ((0, 'CD1'), (0, 'O12'), (0, 'CD2'), (0, 'OD1')), ((0, 'CX1'), (0, 'O11'), (0, 'CX2'), (0, 'OX1'))), 'ABLIPA': (((0, 'C11'), (0, 'C12'), (0, 'NA2'), (0, 'O11')), ((0, 'NA2'), (0, 'C11'), (0, 'CA2'), (0, 'HNA2')), ((0, 'C51'), (0, 'C52'), (0, 'NB2'), (0, 'O51')), ((0, 'NB2'), (0, 'C51'), (0, 'CB2'), (0, 'HNB2'))), 'ABLIPB': (((0, 'C11'), (0, 'C12'), (0, 'NA2'), (0, 'O11')), ((0, 'NA2'), (0, 'C11'), (0, 'CA2'), (0, 'HNA2')), ((0, 'C51'), (0, 'C52'), (0, 'NB2'), (0, 'O51')), ((0, 'NB2'), (0, 'C51'), (0, 'CB2'), (0, 'HNB2'))), 'BCLIPA': (((0, 'C11'), (0, 'C12'), (0, 'NA2'), (0, 'O11')), ((0, 'NA2'), (0, 'C11'), (0, 'CA2'), (0, 'HNA2')), ((0, 'C51'), (0, 'C52'), (0, 'NB2'), (0, 'O51')), ((0, 'NB2'), (0, 'C51'), (0, 'CB2'), (0, 'HNB2'))), 'BCLIPB': (((0, 'C11'), (0, 'C12'), (0, 'NA2'), (0, 'O11')), ((0, 'NA2'), (0, 'C11'), (0, 'CA2'), (0, 'HNA2')), ((0, 'C51'), (0, 'C52'), (0, 'NB2'), (0, 'O51')), ((0, 'NB2'), (0, 'C51'), (0, 'CB2'), (0, 'HNB2'))), 'BCLIPC': (((0, 'C11'), (0, 'C12'), (0, 'NA2'), (0, 'O11')), ((0, 'NA2'), (0, 'C11'), (0, 'CA2'), (0, 'HNA2')), ((0, 'C51'), (0, 'C52'), (0, 'NB2'), (0, 'O51')), ((0, 'NB2'), (0, 'C51'), (0, 'CB2'), (0, 'HNB2'))), 'CJLIPA': (((0, 'C11'), (0, 'C12'), (0, 'NA2'), (0, 'O11')), ((0, 'NA2'), (0, 'C11'), (0, 'CA2'), (0, 'HNA2')), ((0, 'C51'), (0, 'C52'), (0, 'NB2'), (0, 'O51')), ((0, 'NB2'), (0, 'C51'), (0, 'CB2'), (0, 'HNB2'))), 'CTLIPA': (((0, 'C11'), (0, 'C12'), (0, 'NA2'), (0, 'O11')), ((0, 'NA2'), (0, 'C11'), (0, 'CA2'), (0, 'HNA2')), ((0, 'C51'), (0, 'C52'), (0, 'NB2'), (0, 'O51')), ((0, 'NB2'), (0, 'C51'), (0, 'CB2'), (0, 'HNB2'))), 'ECLIPA': (((0, 'C11'), (0, 'C12'), (0, 'NA2'), (0, 'O11')), ((0, 'NA2'), (0, 'C11'), (0, 'CA2'), (0, 'HNA2')), ((0, 'C51'), (0, 'C52'), (0, 'NB2'), (0, 'O51')), ((0, 'NB2'), (0, 'C51'), (0, 'CB2'), (0, 'HNB2'))), 'ECLIPB': (((0, 'C11'), (0, 'C12'), (0, 'NA2'), (0, 'O11')), ((0, 'NA2'), (0, 'C11'), (0, 'CA2'), (0, 'HNA2')), ((0, 'C51'), (0, 'C52'), (0, 'NB2'), (0, 'O51')), ((0, 'NB2'), (0, 'C51'), (0, 'CB2'), (0, 'HNB2'))), 'ECLIPC': (((0, 'C11'), (0, 'C12'), (0, 'NA2'), (0, 'O11')), ((0, 'NA2'), (0, 'C11'), (0, 'CA2'), (0, 'HNA2')), ((0, 'C51'), (0, 'C52'), (0, 'NB2'), (0, 'O51')), ((0, 'NB2'), (0, 'C51'), (0, 'CB2'), (0, 'HNB2'))), 'HPLIPA': (((0, 'C11'), (0, 'C12'), (0, 'NA2'), (0, 'O11')), ((0, 'NA2'), (0, 'C11'), (0, 'CA2'), (0, 'HNA2')), ((0, 'C51'), (0, 'C52'), (0, 'NB2'), (0, 'O51')), ((0, 'NB2'), (0, 'C51'), (0, 'CB2'), (0, 'HNB2'))), 'HPLIPB': (((0, 'C11'), (0, 'C12'), (0, 'NA2'), (0, 'O11')), ((0, 'NA2'), (0, 'C11'), (0, 'CA2'), (0, 'HNA2')), ((0, 'C51'), (0, 'C52'), (0, 'NB2'), (0, 'O51')), ((0, 'NB2'), (0, 'C51'), (0, 'CB2'), (0, 'HNB2'))), 'KPLIPA': (((0, 'C11'), (0, 'C12'), (0, 'NA2'), (0, 'O11')), ((0, 'NA2'), (0, 'C11'), (0, 'CA2'), (0, 'HNA2')), ((0, 'C51'), (0, 'C52'), (0, 'NB2'), (0, 'O51')), ((0, 'NB2'), (0, 'C51'), (0, 'CB2'), (0, 'HNB2'))), 'KPLIPB': (((0, 'C11'), (0, 'C12'), (0, 'NA2'), (0, 'O11')), ((0, 'NA2'), (0, 'C11'), (0, 'CA2'), (0, 'HNA2')), ((0, 'C51'), (0, 'C52'), (0, 'NB2'), (0, 'O51')), ((0, 'NB2'), (0, 'C51'), (0, 'CB2'), (0, 'HNB2'))), 'KPLIPC': (((0, 'C11'), (0, 'C12'), (0, 'NA2'), (0, 'O11')), ((0, 'NA2'), (0, 'C11'), (0, 'CA2'), (0, 'HNA2')), ((0, 'C51'), (0, 'C52'), (0, 'NB2'), (0, 'O51')), ((0, 'NB2'), (0, 'C51'), (0, 'CB2'), (0, 'HNB2'))), 'LILIPA': (((0, 'C11'), (0, 'C12'), (0, 'NA2'), (0, 'O11')), ((0, 'NA2'), (0, 'C11'), (0, 'CA2'), (0, 'HNA2')), ((0, 'C51'), (0, 'C52'), (0, 'NB2'), (0, 'O51')), ((0, 'NB2'), (0, 'C51'), (0, 'CB2'), (0, 'HNB2'))), 'MCLIPA': (((0, 'C11'), (0, 'C12'), (0, 'NA2'), (0, 'O11')), ((0, 'NA2'), (0, 'C11'), (0, 'CA2'), (0, 'HNA2')), ((0, 'C51'), (0, 'C52'), (0, 'NB2'), (0, 'O51')), ((0, 'NB2'), (0, 'C51'), (0, 'CB2'), (0, 'HNB2'))), 'NGLIPA': (((0, 'C11'), (0, 'C12'), (0, 'NA2'), (0, 'O11')), ((0, 'NA2'), (0, 'C11'), (0, 'CA2'), (0, 'HNA2')), ((0, 'C51'), (0, 'C52'), (0, 'NB2'), (0, 'O51')), ((0, 'NB2'), (0, 'C51'), (0, 'CB2'), (0, 'HNB2'))), 'NGLIPB': (((0, 'C11'), (0, 'C12'), (0, 'NA2'), (0, 'O11')), ((0, 'NA2'), (0, 'C11'), (0, 'CA2'), (0, 'HNA2')), ((0, 'C51'), (0, 'C52'), (0, 'NB2'), (0, 'O51')), ((0, 'NB2'), (0, 'C51'), (0, 'CB2'), (0, 'HNB2'))), 'NGLIPC': (((0, 'C11'), (0, 'C12'), (0, 'NA2'), (0, 'O11')), ((0, 'NA2'), (0, 'C11'), (0, 'CA2'), (0, 'HNA2')), ((0, 'C51'), (0, 'C52'), (0, 'NB2'), (0, 'O51')), ((0, 'NB2'), (0, 'C51'), (0, 'CB2'), (0, 'HNB2'))), 'PALIPA': (((0, 'C11'), (0, 'C12'), (0, 'NA2'), (0, 'O11')), ((0, 'NA2'), (0, 'C11'), (0, 'CA2'), (0, 'HNA2')), ((0, 'C51'), (0, 'C52'), (0, 'NB2'), (0, 'O51')), ((0, 'NB2'), (0, 'C51'), (0, 'CB2'), (0, 'HNB2'))), 'PALIPB': (((0, 'C11'), (0, 'C12'), (0, 'NA2'), (0, 'O11')), ((0, 'NA2'), (0, 'C11'), (0, 'CA2'), (0, 'HNA2')), ((0, 'C51'), (0, 'C52'), (0, 'NB2'), (0, 'O51')), ((0, 'NB2'), (0, 'C51'), (0, 'CB2'), (0, 'HNB2'))), 'PALIPC': (((0, 'C11'), (0, 'C12'), (0, 'NA2'), (0, 'O11')), ((0, 'NA2'), (0, 'C11'), (0, 'CA2'), (0, 'HNA2')), ((0, 'C51'), (0, 'C52'), (0, 'NB2'), (0, 'O51')), ((0, 'NB2'), (0, 'C51'), (0, 'CB2'), (0, 'HNB2'))), 'PALIPD': (((0, 'C11'), (0, 'C12'), (0, 'NA2'), (0, 'O11')), ((0, 'NA2'), (0, 'C11'), (0, 'CA2'), (0, 'HNA2')), ((0, 'C51'), (0, 'C52'), (0, 'NB2'), (0, 'O51')), ((0, 'NB2'), (0, 'C51'), (0, 'CB2'), (0, 'HNB2'))), 'PALIPE': (((0, 'C11'), (0, 'C12'), (0, 'NA2'), (0, 'O11')), ((0, 'NA2'), (0, 'C11'), (0, 'CA2'), (0, 'HNA2')), ((0, 'C51'), (0, 'C52'), (0, 'NB2'), (0, 'O51')), ((0, 'NB2'), (0, 'C51'), (0, 'CB2'), (0, 'HNB2'))), 'SFLIPA': (((0, 'C11'), (0, 'C12'), (0, 'NA2'), (0, 'O11')), ((0, 'NA2'), (0, 'C11'), (0, 'CA2'), (0, 'HNA2')), ((0, 'C51'), (0, 'C52'), (0, 'NB2'), (0, 'O51')), ((0, 'NB2'), (0, 'C51'), (0, 'CB2'), (0, 'HNB2'))), 'SELIPA': (((0, 'C11'), (0, 'C12'), (0, 'NA2'), (0, 'O11')), ((0, 'NA2'), (0, 'C11'), (0, 'CA2'), (0, 'HNA2')), ((0, 'C51'), (0, 'C52'), (0, 'NB2'), (0, 'O51')), ((0, 'NB2'), (0, 'C51'), (0, 'CB2'), (0, 'HNB2'))), 'SELIPB': (((0, 'C11'), (0, 'C12'), (0, 'NA2'), (0, 'O11')), ((0, 'NA2'), (0, 'C11'), (0, 'CA2'), (0, 'HNA2')), ((0, 'C51'), (0, 'C52'), (0, 'NB2'), (0, 'O51')), ((0, 'NB2'), (0, 'C51'), (0, 'CB2'), (0, 'HNB2'))), 'SELIPC': (((0, 'C11'), (0, 'C12'), (0, 'NA2'), (0, 'O11')), ((0, 'NA2'), (0, 'C11'), (0, 'CA2'), (0, 'HNA2')), ((0, 'C51'), (0, 'C52'), (0, 'NB2'), (0, 'O51')), ((0, 'NB2'), (0, 'C51'), (0, 'CB2'), (0, 'HNB2'))), 'VCLIPA': (((0, 'C11'), (0, 'C12'), (0, 'NA2'), (0, 'O11')), ((0, 'NA2'), (0, 'C11'), (0, 'CA2'), (0, 'HNA2')), ((0, 'C51'), (0, 'C52'), (0, 'NB2'), (0, 'O51')), ((0, 'NB2'), (0, 'C51'), (0, 'CB2'), (0, 'HNB2'))), 'VCLIPB': (((0, 'C11'), (0, 'C12'), (0, 'NA2'), (0, 'O11')), ((0, 'NA2'), (0, 'C11'), (0, 'CA2'), (0, 'HNA2')), ((0, 'C51'), (0, 'C52'), (0, 'NB2'), (0, 'O51')), ((0, 'NB2'), (0, 'C51'), (0, 'CB2'), (0, 'HNB2'))), 'VCLIPC': (((0, 'C11'), (0, 'C12'), (0, 'NA2'), (0, 'O11')), ((0, 'NA2'), (0, 'C11'), (0, 'CA2'), (0, 'HNA2')), ((0, 'C51'), (0, 'C52'), (0, 'NB2'), (0, 'O51')), ((0, 'NB2'), (0, 'C51'), (0, 'CB2'), (0, 'HNB2'))), 'VCLIPD': (((0, 'C11'), (0, 'C12'), (0, 'NA2'), (0, 'O11')), ((0, 'NA2'), (0, 'C11'), (0, 'CA2'), (0, 'HNA2')), ((0, 'C51'), (0, 'C52'), (0, 'NB2'), (0, 'O51')), ((0, 'NB2'), (0, 'C51'), (0, 'CB2'), (0, 'HNB2'))), 'VCLIPE': (((0, 'C11'), (0, 'C12'), (0, 'NA2'), (0, 'O11')), ((0, 'NA2'), (0, 'C11'), (0, 'CA2'), (0, 'HNA2')), ((0, 'C51'), (0, 'C52'), (0, 'NB2'), (0, 'O51')), ((0, 'NB2'), (0, 'C51'), (0, 'CB2'), (0, 'HNB2'))), 'YPLIPA': (((0, 'C11'), (0, 'C12'), (0, 'NA2'), (0, 'O11')), ((0, 'NA2'), (0, 'C11'), (0, 'CA2'), (0, 'HNA2')), ((0, 'C51'), (0, 'C52'), (0, 'NB2'), (0, 'O51')), ((0, 'NB2'), (0, 'C51'), (0, 'CB2'), (0, 'HNB2'))), 'YPLIPB': (((0, 'C11'), (0, 'C12'), (0, 'NA2'), (0, 'O11')), ((0, 'NA2'), (0, 'C11'), (0, 'CA2'), (0, 'HNA2')), ((0, 'C51'), (0, 'C52'), (0, 'NB2'), (0, 'O51')), ((0, 'NB2'), (0, 'C51'), (0, 'CB2'), (0, 'HNB2'))), 'PVPG': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))), 'PVPE': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))), 'PPPE': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))), 'PMPE': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))), 'QMPE': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))), 'OYPE': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))), 'PYPG': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))), 'IPPC': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))), 'APPC': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))), 'PHPC': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))), 'PMPG': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))), 'PVCL2': (((0, 'CB1'), (0, 'O13'), (0, 'CB2'), (0, 'OB1')), ((0, 'CA1'), (0, 'O12'), (0, 'CA2'), (0, 'OA1')), ((0, 'CD1'), (0, 'O33'), (0, 'CD2'), (0, 'OD1')), ((0, 'CC1'), (0, 'O32'), (0, 'CC2'), (0, 'OC1'))), 'DPPGK': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))), 'TOCL1': (((0, 'CB1'), (0, 'O13'), (0, 'CB2'), (0, 'OB1')), ((0, 'CA1'), (0, 'O12'), (0, 'CA2'), (0, 'OA1')), ((0, 'CD1'), (0, 'O33'), (0, 'CD2'), (0, 'OD1')), ((0, 'CC1'), (0, 'O32'), (0, 'CC2'), (0, 'OC1'))), 'TOCL2': (((0, 'CB1'), (0, 'O13'), (0, 'CB2'), (0, 'OB1')), ((0, 'CA1'), (0, 'O12'), (0, 'CA2'), (0, 'OA1')), ((0, 'CD1'), (0, 'O33'), (0, 'CD2'), (0, 'OD1')), ((0, 'CC1'), (0, 'O32'), (0, 'CC2'), (0, 'OC1'))), 'TMCL1': (((0, 'CB1'), (0, 'O13'), (0, 'CB2'), (0, 'OB1')), ((0, 'CA1'), (0, 'O12'), (0, 'CA2'), (0, 'OA1')), ((0, 'CD1'), (0, 'O33'), (0, 'CD2'), (0, 'OD1')), ((0, 'CC1'), (0, 'O32'), (0, 'CC2'), (0, 'OC1'))), 'TMCL2': (((0, 'CB1'), (0, 'O13'), (0, 'CB2'), (0, 'OB1')), ((0, 'CA1'), (0, 'O12'), (0, 'CA2'), (0, 'OA1')), ((0, 'CD1'), (0, 'O33'), (0, 'CD2'), (0, 'OD1')), ((0, 'CC1'), (0, 'O32'), (0, 'CC2'), (0, 'OC1'))), 'TLCL1': (((0, 'CB1'), (0, 'O13'), (0, 'CB2'), (0, 'OB1')), ((0, 'CA1'), (0, 'O12'), (0, 'CA2'), (0, 'OA1')), ((0, 'CD1'), (0, 'O33'), (0, 'CD2'), (0, 'OD1')), ((0, 'CC1'), (0, 'O32'), (0, 'CC2'), (0, 'OC1'))), 'TLCL2': (((0, 'CB1'), (0, 'O13'), (0, 'CB2'), (0, 'OB1')), ((0, 'CA1'), (0, 'O12'), (0, 'CA2'), (0, 'OA1')), ((0, 'CD1'), (0, 'O33'), (0, 'CD2'), (0, 'OD1')), ((0, 'CC1'), (0, 'O32'), (0, 'CC2'), (0, 'OC1'))), 'PMCL1': (((0, 'CB1'), (0, 'O13'), (0, 'CB2'), (0, 'OB1')), ((0, 'CA1'), (0, 'O12'), (0, 'CA2'), (0, 'OA1')), ((0, 'CD1'), (0, 'O33'), (0, 'CD2'), (0, 'OD1')), ((0, 'CC1'), (0, 'O32'), (0, 'CC2'), (0, 'OC1'))), 'PMCL2': (((0, 'CB1'), (0, 'O13'), (0, 'CB2'), (0, 'OB1')), ((0, 'CA1'), (0, 'O12'), (0, 'CA2'), (0, 'OA1')), ((0, 'CD1'), (0, 'O33'), (0, 'CD2'), (0, 'OD1')), ((0, 'CC1'), (0, 'O32'), (0, 'CC2'), (0, 'OC1'))), 'TYCL1': (((0, 'CB1'), (0, 'O13'), (0, 'CB2'), (0, 'OB1')), ((0, 'CA1'), (0, 'O12'), (0, 'CA2'), (0, 'OA1')), ((0, 'CD1'), (0, 'O33'), (0, 'CD2'), (0, 'OD1')), ((0, 'CC1'), (0, 'O32'), (0, 'CC2'), (0, 'OC1'))), 'TYCL2': (((0, 'CB1'), (0, 'O13'), (0, 'CB2'), (0, 'OB1')), ((0, 'CA1'), (0, 'O12'), (0, 'CA2'), (0, 'OA1')), ((0, 'CD1'), (0, 'O33'), (0, 'CD2'), (0, 'OD1')), ((0, 'CC1'), (0, 'O32'), (0, 'CC2'), (0, 'OC1'))), 'LOACL1': (((0, 'CB1'), (0, 'O13'), (0, 'CB2'), (0, 'OB1')), ((0, 'CA1'), (0, 'O12'), (0, 'CA2'), (0, 'OA1')), ((0, 'CD1'), (0, 'O33'), (0, 'CD2'), (0, 'OD1')), ((0, 'CC1'), (0, 'O32'), (0, 'CC2'), (0, 'OC1'))), 'LOACL2': (((0, 'CB1'), (0, 'O13'), (0, 'CB2'), (0, 'OB1')), ((0, 'CA1'), (0, 'O12'), (0, 'CA2'), (0, 'OA1')), ((0, 'CD1'), (0, 'O33'), (0, 'CD2'), (0, 'OD1')), ((0, 'CC1'), (0, 'O32'), (0, 'CC2'), (0, 'OC1'))), 'LOCCL1': (((0, 'CB1'), (0, 'O13'), (0, 'CB2'), (0, 'OB1')), ((0, 'CA1'), (0, 'O12'), (0, 'CA2'), (0, 'OA1')), ((0, 'CD1'), (0, 'O33'), (0, 'CD2'), (0, 'OD1')), ((0, 'CC1'), (0, 'O32'), (0, 'CC2'), (0, 'OC1'))), 'LOCCL2': (((0, 'CB1'), (0, 'O13'), (0, 'CB2'), (0, 'OB1')), ((0, 'CA1'), (0, 'O12'), (0, 'CA2'), (0, 'OA1')), ((0, 'CD1'), (0, 'O33'), (0, 'CD2'), (0, 'OD1')), ((0, 'CC1'), (0, 'O32'), (0, 'CC2'), (0, 'OC1'))), 'LNACL1': (((0, 'CB1'), (0, 'O13'), (0, 'CB2'), (0, 'OB1')), ((0, 'CA1'), (0, 'O12'), (0, 'CA2'), (0, 'OA1')), ((0, 'CD1'), (0, 'O33'), (0, 'CD2'), (0, 'OD1')), ((0, 'CC1'), (0, 'O32'), (0, 'CC2'), (0, 'OC1'))), 'LNACL2': (((0, 'CB1'), (0, 'O13'), (0, 'CB2'), (0, 'OB1')), ((0, 'CA1'), (0, 'O12'), (0, 'CA2'), (0, 'OA1')), ((0, 'CD1'), (0, 'O33'), (0, 'CD2'), (0, 'OD1')), ((0, 'CC1'), (0, 'O32'), (0, 'CC2'), (0, 'OC1'))), 'LNBCL1': (((0, 'CB1'), (0, 'O13'), (0, 'CB2'), (0, 'OB1')), ((0, 'CA1'), (0, 'O12'), (0, 'CA2'), (0, 'OA1')), ((0, 'CD1'), (0, 'O33'), (0, 'CD2'), (0, 'OD1')), ((0, 'CC1'), (0, 'O32'), (0, 'CC2'), (0, 'OC1'))), 'LNBCL2': (((0, 'CB1'), (0, 'O13'), (0, 'CB2'), (0, 'OB1')), ((0, 'CA1'), (0, 'O12'), (0, 'CA2'), (0, 'OA1')), ((0, 'CD1'), (0, 'O33'), (0, 'CD2'), (0, 'OD1')), ((0, 'CC1'), (0, 'O32'), (0, 'CC2'), (0, 'OC1'))), 'LNCCL1': (((0, 'CB1'), (0, 'O13'), (0, 'CB2'), (0, 'OB1')), ((0, 'CA1'), (0, 'O12'), (0, 'CA2'), (0, 'OA1')), ((0, 'CD1'), (0, 'O33'), (0, 'CD2'), (0, 'OD1')), ((0, 'CC1'), (0, 'O32'), (0, 'CC2'), (0, 'OC1'))), 'LNCCL2': (((0, 'CB1'), (0, 'O13'), (0, 'CB2'), (0, 'OB1')), ((0, 'CA1'), (0, 'O12'), (0, 'CA2'), (0, 'OA1')), ((0, 'CD1'), (0, 'O33'), (0, 'CD2'), (0, 'OD1')), ((0, 'CC1'), (0, 'O32'), (0, 'CC2'), (0, 'OC1'))), 'LNDCL1': (((0, 'CB1'), (0, 'O13'), (0, 'CB2'), (0, 'OB1')), ((0, 'CA1'), (0, 'O12'), (0, 'CA2'), (0, 'OA1')), ((0, 'CD1'), (0, 'O33'), (0, 'CD2'), (0, 'OD1')), ((0, 'CC1'), (0, 'O32'), (0, 'CC2'), (0, 'OC1'))), 'LNDCL2': (((0, 'CB1'), (0, 'O13'), (0, 'CB2'), (0, 'OB1')), ((0, 'CA1'), (0, 'O12'), (0, 'CA2'), (0, 'OA1')), ((0, 'CD1'), (0, 'O33'), (0, 'CD2'), (0, 'OD1')), ((0, 'CC1'), (0, 'O32'), (0, 'CC2'), (0, 'OC1'))), 'DDPC': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))), 'DCPC': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))), 'DXPC': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))), 'DGPC': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))), 'DEPC': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))), 'DNPC': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))), 'DXPE': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))), 'DGPE': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))), 'DEPE': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))), 'DNPE': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))), 'SAPE': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))), 'SLPE': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))), 'PLPE': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))), 'SLPC': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))), 'PLPC': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))), 'DYPS': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32')), ((0, 'C13'), (0, 'C12'), (0, 'O13B'), (0, 'O13A'))), 'DGPS': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32')), ((0, 'C13'), (0, 'C12'), (0, 'O13B'), (0, 'O13A'))), 'DEPS': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32')), ((0, 'C13'), (0, 'C12'), (0, 'O13B'), (0, 'O13A'))), 'DNPS': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32')), ((0, 'C13'), (0, 'C12'), (0, 'O13B'), (0, 'O13A'))), 'SAPS': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32')), ((0, 'C13'), (0, 'C12'), (0, 'O13B'), (0, 'O13A'))), 'SLPS': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32')), ((0, 'C13'), (0, 'C12'), (0, 'O13B'), (0, 'O13A'))), 'PLPS': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32')), ((0, 'C13'), (0, 'C12'), (0, 'O13B'), (0, 'O13A'))), 'DYPA': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))), 'DGPA': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))), 'DEPA': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))), 'DNPA': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))), 'SAPA': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))), 'SLPA': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))), 'PLPA': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))), 'DYPG': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))), 'DGPG': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))), 'DEPG': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))), 'DNPG': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))), 'SAPG': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))), 'PLPG': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))), 'SDPE': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))), 'SOPE': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))), 'DAPE': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))), 'SDPS': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32')), ((0, 'C13'), (0, 'C12'), (0, 'O13B'), (0, 'O13A'))), 'SOPS': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32')), ((0, 'C13'), (0, 'C12'), (0, 'O13B'), (0, 'O13A'))), 'DAPS': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32')), ((0, 'C13'), (0, 'C12'), (0, 'O13B'), (0, 'O13A'))), 'SDPA': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))), 'SOPA': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))), 'DAPA': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))), 'SDPG': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))), 'SOPG': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))), 'DAPG': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))), 'DIPA': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))), 'TIPA': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))), 'DTPA': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))), 'DUPC': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))), 'DLIPC': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))), 'DLIPE': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))), 'LLPA': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))), 'LLPC': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))), 'LLPE': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))), 'LLPS': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32')), ((0, 'C13'), (0, 'C12'), (0, 'O13B'), (0, 'O13A'))), 'TSPC': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))), 'DDOPC': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))), 'DDOPE': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))), 'DDOPS': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32')), ((0, 'C13'), (0, 'C12'), (0, 'O13B'), (0, 'O13A'))), 'PDOPC': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))), 'PDOPE': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))), 'DOPP1': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))), 'DOPP2': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))), 'DOPP3': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))), 'POPP1': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))), 'POPP2': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))), 'POPP3': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32')))}\n-patch_impropers = {'ACE': (((0, 'CY'), (0, 'CAY'), (0, 'N'), (0, 'OY')), ((0, 'N'), (0, 'CY'), (0, 'CA'), (0, 'HN'))), 'ACED': (((0, 'CY'), (0, 'CAY'), (0, 'N'), (0, 'OY')), ((0, 'N'), (0, 'CY'), (0, 'CA'), (0, 'HN'))), 'ACP': (((0, 'CY'), (0, 'CAY'), (0, 'N'), (0, 'OY')), ((0, 'N'), (0, 'CY'), (0, 'CA'), (0, 'CD'))), 'ACPD': (((0, 'CY'), (0, 'CAY'), (0, 'N'), (0, 'OY')), ((0, 'N'), (0, 'CY'), (0, 'CA'), (0, 'CD'))), 'CTER': (((0, 'C'), (0, 'CA'), (0, 'OT2'), (0, 'OT1')),), 'CNEU': (((0, 'C'), (0, 'CA'), (0, 'OT2'), (0, 'OT1')),), 'PCTE': (((0, 'C'), (0, 'CA'), (0, 'OT2'), (0, 'OT1')),), 'CT1': (((0, 'C'), (0, 'CA'), (0, 'OT2'), (0, 'OT1')),), 'CT2': (((0, 'C'), (0, 'NT'), (0, 'CA'), (0, 'O')), ((0, 'C'), (0, 'CA'), (0, 'NT'), (0, 'O')), ((0, 'NT'), (0, 'C'), (0, 'HT1'), (0, 'HT2')), ((0, 'NT'), (0, 'C'), (0, 'HT2'), (0, 'HT1'))), 'CT3': (((0, 'NT'), (0, 'C'), (0, 'CAT'), (0, 'HNT')), ((0, 'C'), (0, 'CA'), (0, 'NT'), (0, 'O'))), 'HS2': (((0, 'NE2'), (0, 'CD2'), (0, 'CE1'), (0, 'HE2')), ((0, 'NE2'), (0, 'CE1'), (0, 'CD2'), (0, 'HE2'))), 'LIG1': (((0, '3N'), (0, '2C'), (0, '3CA'), (0, '3HN')), ((0, '2C'), (0, '2CA'), (0, '3N'), (0, '2O'))), 'LINK': (((0, '3N'), (0, '2C'), (0, '3CA'), (0, '3HN')), ((0, '2C'), (0, '2CA'), (0, '3N'), (0, '2O'))), 'SAHP': (((0, 'C'), (0, 'OT1'), (0, 'OT2'), (0, 'CA')),), 'GYCO': (((0, 'CD'), (0, 'C23'), (0, 'N'), (0, 'OE1')), ((0, 'CDG'), (0, 'OEG1'), (0, 'OEG2'), (0, 'CG'))), 'AMGA': (((0, 'CA'), (0, 'CC1'), (0, 'OA1'), (0, 'OA2')),), 'GMGA': (((0, 'CG'), (0, 'CC3'), (0, 'OG1'), (0, 'OG2')),), 'DMGA': (((0, 'CA'), (0, 'CC1'), (0, 'OA1'), (0, 'OA2')), ((0, 'CG'), (0, 'CC3'), (0, 'OG1'), (0, 'OG2'))), 'AMGT': (((0, 'CA'), (0, 'CC1'), (0, 'OA1'), (0, 'OA2')), ((0, 'CG'), (0, 'CC3'), (0, 'OG1'), (0, 'OG2'))), 'ATGM': (((0, 'CA'), (0, 'CC1'), (0, 'OA1'), (0, 'OA2')), ((0, 'CG'), (0, 'CC3'), (0, 'OG1'), (0, 'OG2'))), 'ABGA': (((0, 'CA'), (0, 'CC1'), (0, 'OA1'), (0, 'OA2')),), 'GBGA': (((0, 'CG'), (0, 'CC3'), (0, 'OG1'), (0, 'OG2')),), 'DBGA': (((0, 'CA'), (0, 'CC1'), (0, 'OA1'), (0, 'OA2')), ((0, 'CG'), (0, 'CC3'), (0, 'OG1'), (0, 'OG2'))), 'ALME': (((0, 'CA'), (0, 'CC1'), (0, 'OA1'), (0, 'OA2')),), 'G4MPAB': (((0, 'CA'), (0, 'CC1'), (0, 'OA1'), (0, 'OA2')),), 'G4PAB': (((0, 'CA'), (0, 'CC1'), (0, 'OA1'), (0, 'OA2')),), 'G3PABR': (((0, 'CA'), (0, 'CC1'), (0, 'OA1'), (0, 'OA2')),), 'G3PABS': (((0, 'CA'), (0, 'CC1'), (0, 'OA1'), (0, 'OA2')),), 'BPAB': (((0, 'CA'), (0, 'CC1'), (0, 'OA1'), (0, 'OA2')),), 'BPAT': (((0, 'CA'), (0, 'CC1'), (0, 'OA1'), (0, 'OA2')),), '3MSB': (((0, 'CA'), (0, 'CC1'), (0, 'OA1'), (0, 'OA2')),), '2MRB': (((0, 'CA'), (0, 'CC1'), (0, 'OA1'), (0, 'OA2')),), '2APP': (((0, 'CA'), (0, 'CC1'), (0, 'OA1'), (0, 'OA2')), ((0, 'CG'), (0, 'CC3'), (0, 'NG'), (0, 'OG')), ((0, 'CZ'), (0, 'CD1'), (0, 'NZ'), (0, 'NG'))), '3APP': (((0, 'CA'), (0, 'CC1'), (0, 'OA1'), (0, 'OA2')), ((0, 'CG'), (0, 'CC3'), (0, 'NG'), (0, 'OG'))), '4APP': (((0, 'CA'), (0, 'CC1'), (0, 'OA1'), (0, 'OA2')), ((0, 'CG'), (0, 'CC3'), (0, 'NG'), (0, 'OG'))), '2APD': (((0, 'CG'), (0, 'CC3'), (0, 'NG'), (0, 'OG')), ((0, 'CZ'), (0, 'CD1'), (0, 'NZ'), (0, 'NG'))), '3APD': (((0, 'CG'), (0, 'CC3'), (0, 'NG'), (0, 'OG')),), '4APD': (((0, 'CG'), (0, 'CC3'), (0, 'NG'), (0, 'OG')),), '2AFP': (((0, 'CA'), (0, 'CC1'), (0, 'OA1'), (0, 'OA2')), ((0, 'CG'), (0, 'CC3'), (0, 'NG'), (0, 'OG'))), '3AFP': (((0, 'CA'), (0, 'CC1'), (0, 'OA1'), (0, 'OA2')), ((0, 'CG'), (0, 'CC3'), (0, 'NG'), (0, 'OG'))), '4AFP': (((0, 'CA'), (0, 'CC1'), (0, 'OA1'), (0, 'OA2')), ((0, 'CG'), (0, 'CC3'), (0, 'NG'), (0, 'OG'))), '2AFD': (((0, 'CG'), (0, 'CC3'), (0, 'NG'), (0, 'OG')),), '3AFD': (((0, 'CG'), (0, 'CC3'), (0, 'NG'), (0, 'OG')),), '4AFD': (((0, 'CG'), (0, 'CC3'), (0, 'NG'), (0, 'OG')),), '4FBP': (((0, 'CA'), (0, 'CC1'), (0, 'OA1'), (0, 'OA2')),), '3FBP': (((0, 'CA'), (0, 'CC1'), (0, 'OA1'), (0, 'OA2')),), '2FBP': (((0, 'CA'), (0, 'CC1'), (0, 'OA1'), (0, 'OA2')),), 'FBIFR': (((0, 'CD'), (0, 'OD1'), (0, 'OD2'), (0, 'CBG')),), 'FBIFS': (((0, 'CD'), (0, 'OD1'), (0, 'OD2'), (0, 'CBG')),), '3MRB': (((0, 'CA'), (0, 'CC1'), (0, 'OA1'), (0, 'OA2')),), '2MSB': (((0, 'CA'), (0, 'CC1'), (0, 'OA1'), (0, 'OA2')),), '3A2MPD': (((0, 'CG'), (0, 'CC3'), (0, 'NG'), (0, 'OG')),), '3A2MPP': (((0, 'CA'), (0, 'CC1'), (0, 'OA1'), (0, 'OA2')), ((0, 'CG'), (0, 'CC3'), (0, 'NG'), (0, 'OG'))), '3A4MPD': (((0, 'CG'), (0, 'CC3'), (0, 'NG'), (0, 'OG')),), '3A5MPD': (((0, 'CG'), (0, 'CC3'), (0, 'NG'), (0, 'OG')),), '3A6MPD': (((0, 'CG'), (0, 'CC3'), (0, 'NG'), (0, 'OG')),), '4A2MPD': (((0, 'CG'), (0, 'CC3'), (0, 'NG'), (0, 'OG')),), '4A2MPP': (((0, 'CA'), (0, 'CC1'), (0, 'OA1'), (0, 'OA2')), ((0, 'CG'), (0, 'CC3'), (0, 'NG'), (0, 'OG'))), '3CPD': (((0, 'CC'), (0, 'CZ'), (0, 'NG'), (0, 'OC')),), '3A46PD': (((0, 'CG'), (0, 'CC3'), (0, 'NG'), (0, 'OG')),), '2AEPD': (((0, 'CG'), (0, 'CC3'), (0, 'NG'), (0, 'OG')),), '2XBD': (((0, 'CX'), (0, 'OX1'), (0, 'OX2'), (0, 'CD2')),), '3XBD': (((0, 'CX'), (0, 'OX1'), (0, 'OX2'), (0, 'CE1')),), '4XBD': (((0, 'CX'), (0, 'OX1'), (0, 'OX2'), (0, 'CP')),), '4XEBD': (((0, 'CX'), (0, 'OX1'), (0, 'OX2'), (0, 'CQ')),), '3XBP': (((0, 'CA'), (0, 'CC1'), (0, 'OA1'), (0, 'OA2')), ((0, 'CX'), (0, 'OX1'), (0, 'OX2'), (0, 'CE1'))), 'B5H6': (((0, 'C34'), (0, 'O34A'), (0, 'O34B'), (0, 'C31')), ((0, 'C33'), (0, 'O33A'), (0, 'O33B'), (0, 'C32'))), 'B5HE': (((0, 'C34'), (0, 'C31'), (0, 'O34A'), (0, 'O34B')), ((0, 'C33'), (0, 'C32'), (0, 'O33A'), (0, 'O33B'))), 'TAUR': (((0, 'CD'), (0, 'C23'), (0, 'N'), (0, 'OE1')),), 'RN1': (((0, 'NH1'), (0, 'HH11'), (0, 'HH12'), (0, 'CZ')), ((0, 'NH2'), (0, 'HH21'), (0, 'HH22'), (0, 'CZ'))), 'RN2': (((0, 'NE'), (0, 'CD'), (0, 'CZ'), (0, 'HE')), ((0, 'NH2'), (0, 'HH21'), (0, 'HH22'), (0, 'CZ'))), 'RN3': (((0, 'NH2'), (0, 'HH21'), (0, 'HH22'), (0, 'CZ')),), 'KAC': (((0, 'NZ'), (0, 'CH'), (0, 'CE'), (0, 'HZ1')), ((0, 'CH'), (0, 'CH3'), (0, 'NZ'), (0, 'OH'))), 'AMGY': (((0, 'CY'), (0, 'CAY'), (0, 'N'), (0, 'OY')),), 'DMCT': (((0, 'C'), (0, 'CA'), (0, 'NT'), (0, 'O')),), 'SAHC': (((0, 'OT1'), (0, 'CA'), (0, 'OT2'), (0, 'C')),), 'PSAM': (((0, 'O'), (0, 'CA'), (0, 'OXT'), (0, 'C')),), '5MC1': (((0, 'N1'), (0, 'C6'), (0, 'C2'), (0, 'H1')),), 'INO1': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'H2')),), '4EG1': (((0, 'N4'), (0, 'C4'), (0, 'C41'), (0, 'H42')),), 'CT': (((0, 'C'), (0, \"C2'\"), (0, 'OT2'), (0, 'OT1')),), 'CTN': (((0, 'C'), (0, 'NT'), (0, \"C2'\"), (0, \"O1'\")), ((0, 'C'), (0, \"C2'\"), (0, 'NT'), (0, \"O1'\")), ((0, 'NT'), (0, 'C'), (0, 'HT1'), (0, 'HT2')), ((0, 'NT'), (0, 'C'), (0, 'HT2'), (0, 'HT1'))), 'PACE': (((0, 'CY'), (0, 'CAY'), (0, 'N'), (0, 'OY')), ((0, 'N'), (0, 'CY'), (0, \"C6'\"), (0, \"H1'\"))), '5UHG': (((0, 'C10'), (0, 'C9'), (0, 'O11'), (0, 'O12')),), '5UHC': (((0, 'C8'), (0, 'C7'), (0, 'O8'), (0, 'O9')),), '5UHO': (((0, 'C9'), (0, 'C8'), (0, 'O9'), (0, 'O10')),), '5UHA': (((0, 'C13'), (0, 'C12'), (0, 'O30'), (0, 'O31')),), 'CYTP': (((0, 'N4'), (0, 'H41'), (0, 'H42'), (0, 'C4')), ((0, 'C4'), (0, 'N3'), (0, 'N4'), (0, 'C5'))), '3MCN': (((0, 'C4'), (0, 'C5'), (0, 'N4'), (0, 'N3')),), 'ADEP': (((0, 'C6'), (0, 'N1'), (0, 'N6'), (0, 'C5')), ((0, 'N6'), (0, 'H61'), (0, 'H62'), (0, 'C6'))), 'ADEI': (((0, 'C6'), (0, 'C5'), (0, 'N6'), (0, 'N1')),), '1MAN': (((0, 'C6'), (0, 'C5'), (0, 'N6'), (0, 'N1')),), '6AH': (((0, 'C13'), (0, 'C12'), (0, 'ODA'), (0, 'ODB')),), 'GENO': (((0, 'N2'), (0, 'H21'), (0, 'H22'), (0, 'C2')),), 'BUGN': (((0, 'C17'), (0, 'C15'), (0, 'O17'), (0, 'O18')),), 'PTSR': (((0, 'PX'), (0, 'O1X'), (0, 'S2X'), (0, \"O3'\")),), 'PTSS': (((0, 'PX'), (0, 'S1X'), (0, 'O2X'), (0, \"O3'\")),), 'PTSD': (((0, 'PX'), (0, 'S1X'), (0, 'S2X'), (0, \"O3'\")),), 'P6EN': (((0, 'C'), (0, 'OT2'), (0, 'NT'), (0, 'OT1')),), '2ANAM': (((0, 'C22'), (0, 'CT22'), (0, 'N22'), (0, 'N2A')), ((0, 'N22'), (0, 'C22'), (0, 'C2'), (0, 'HN22'))), '2BNAM': (((0, 'C22'), (0, 'CT22'), (0, 'N22'), (0, 'N2A')), ((0, 'N22'), (0, 'C22'), (0, 'C2'), (0, 'HN22'))), '3ANAM': (((0, 'C33'), (0, 'CT33'), (0, 'N33'), (0, 'N3A')), ((0, 'N33'), (0, 'C33'), (0, 'C3'), (0, 'HN33'))), '3BNAM': (((0, 'C33'), (0, 'CT33'), (0, 'N33'), (0, 'N3A')), ((0, 'N33'), (0, 'C33'), (0, 'C3'), (0, 'HN33'))), '5BNAM2': (((0, 'C55'), (0, 'CT55'), (0, 'N55'), (0, 'N5A')), ((0, 'N55'), (0, 'C55'), (0, 'C5'), (0, 'HN55'))), '1ANAC': (((0, 'C11'), (0, 'CT11'), (0, 'N11'), (0, 'O11')), ((0, 'N11'), (0, 'C11'), (0, 'C1'), (0, 'HN11'))), '1BNAC': (((0, 'C11'), (0, 'CT11'), (0, 'N11'), (0, 'O11')), ((0, 'N11'), (0, 'C11'), (0, 'C1'), (0, 'HN11'))), '2ANAC': (((0, 'C22'), (0, 'CT22'), (0, 'N22'), (0, 'O22')), ((0, 'N22'), (0, 'C22'), (0, 'C2'), (0, 'HN22'))), '2BNAC': (((0, 'C22'), (0, 'CT22'), (0, 'N22'), (0, 'O22')), ((0, 'N22'), (0, 'C22'), (0, 'C2'), (0, 'HN22'))), '3ANAC': (((0, 'C33'), (0, 'CT33'), (0, 'N33'), (0, 'O33')), ((0, 'N33'), (0, 'C33'), (0, 'C3'), (0, 'HN33'))), '3BNAC': (((0, 'C33'), (0, 'CT33'), (0, 'N33'), (0, 'O33')), ((0, 'N33'), (0, 'C33'), (0, 'C3'), (0, 'HN33'))), '4ANAC': (((0, 'C44'), (0, 'CT44'), (0, 'N44'), (0, 'O44')), ((0, 'N44'), (0, 'C44'), (0, 'C4'), (0, 'HN44'))), '4BNAC': (((0, 'C44'), (0, 'CT44'), (0, 'N44'), (0, 'O44')), ((0, 'N44'), (0, 'C44'), (0, 'C4'), (0, 'HN44'))), '9TNAC': (((0, 'CN'), (0, 'CT9'), (0, 'N9'), (0, 'ON')), ((0, 'N9'), (0, 'CN'), (0, 'C9'), (0, 'HN9'))), '2BNFO': (((0, 'C22'), (0, 'H22'), (0, 'N22'), (0, 'O22')), ((0, 'N22'), (0, 'C22'), (0, 'C2'), (0, 'HN22'))), '3ANFO': (((0, 'C33'), (0, 'H33'), (0, 'N33'), (0, 'O33')), ((0, 'N33'), (0, 'C33'), (0, 'C3'), (0, 'HN33'))), '3BNFO': (((0, 'C33'), (0, 'H33'), (0, 'N33'), (0, 'O33')), ((0, 'N33'), (0, 'C33'), (0, 'C3'), (0, 'HN33'))), '7BNFO': (((0, 'C77'), (0, 'H77'), (0, 'N77'), (0, 'O77')), ((0, 'N77'), (0, 'C77'), (0, 'C7'), (0, 'HN77'))), '2ANSB': (((0, 'C22'), (0, 'CT22'), (0, 'N22'), (0, 'O22')), ((0, 'N22'), (0, 'C22'), (0, 'C2'), (0, 'HN22'))), '2BNSB': (((0, 'C22'), (0, 'CT22'), (0, 'N22'), (0, 'O22')), ((0, 'N22'), (0, 'C22'), (0, 'C2'), (0, 'HN22'))), '3BNRB': (((0, 'C33'), (0, 'CT33'), (0, 'N33'), (0, 'O33')), ((0, 'N33'), (0, 'C33'), (0, 'C3'), (0, 'HN33'))), '5BNRB2': (((0, 'C55'), (0, 'CT55'), (0, 'N55'), (0, 'O55')), ((0, 'N55'), (0, 'C55'), (0, 'C5'), (0, 'HN55'))), '5ANRB2': (((0, 'C55'), (0, 'CT55'), (0, 'N55'), (0, 'O55')), ((0, 'N55'), (0, 'C55'), (0, 'C5'), (0, 'HN55'))), '7BNRB': (((0, 'C77'), (0, 'CT77'), (0, 'N77'), (0, 'O77')), ((0, 'N77'), (0, 'C77'), (0, 'C7'), (0, 'HN77'))), '3BNSB': (((0, 'C33'), (0, 'CT33'), (0, 'N33'), (0, 'O33')), ((0, 'N33'), (0, 'C33'), (0, 'C3'), (0, 'HN33'))), '4BNRB': (((0, 'C44'), (0, 'CT44'), (0, 'N44'), (0, 'O44')), ((0, 'N44'), (0, 'C44'), (0, 'C4'), (0, 'HN44'))), '4ANRB': (((0, 'C44'), (0, 'CT44'), (0, 'N44'), (0, 'O44')), ((0, 'N44'), (0, 'C44'), (0, 'C4'), (0, 'HN44'))), '4BNSB': (((0, 'C44'), (0, 'CT44'), (0, 'N44'), (0, 'O44')), ((0, 'N44'), (0, 'C44'), (0, 'C4'), (0, 'HN44'))), '4BNASB': (((0, 'CN'), (0, 'CA'), (0, 'N4'), (0, 'ON')), ((0, 'N4'), (0, 'CN'), (0, 'C4'), (0, 'HN4')), ((0, 'C42'), (0, 'CT42'), (0, 'N42'), (0, 'O42'))), '4BDASB': (((0, 'CN'), (0, 'CA'), (0, 'N4'), (0, 'ON')), ((0, 'N4'), (0, 'CN'), (0, 'C4'), (0, 'HN4')), ((0, 'C42'), (0, 'CT42'), (0, 'N42'), (0, 'O42'))), '3BNANA': (((0, 'CLP3'), (0, 'CL3'), (0, 'NL3'), (0, 'OL3')), ((0, 'NL3'), (0, 'CLP3'), (0, 'CA3'), (0, 'HL3')), ((0, 'CRP3'), (0, 'CA3'), (0, 'NR3'), (0, 'OR3')), ((0, 'NR3'), (0, 'CRP3'), (0, 'C3'), (0, 'HR3'))), '3ANANA': (((0, 'CLP3'), (0, 'CL3'), (0, 'NL3'), (0, 'OL3')), ((0, 'NL3'), (0, 'CLP3'), (0, 'CA3'), (0, 'HL3')), ((0, 'CRP3'), (0, 'CA3'), (0, 'NR3'), (0, 'OR3')), ((0, 'NR3'), (0, 'CRP3'), (0, 'C3'), (0, 'HR3'))), '4BNANA': (((0, 'CLP4'), (0, 'CL4'), (0, 'NL4'), (0, 'OL4')), ((0, 'NL4'), (0, 'CLP4'), (0, 'CA4'), (0, 'HL4')), ((0, 'CRP4'), (0, 'CA4'), (0, 'NR4'), (0, 'OR4')), ((0, 'NR4'), (0, 'CRP4'), (0, 'C4'), (0, 'HR4'))), '4ANANA': (((0, 'CLP4'), (0, 'CL4'), (0, 'NL4'), (0, 'OL4')), ((0, 'NL4'), (0, 'CLP4'), (0, 'CA4'), (0, 'HL4')), ((0, 'CRP4'), (0, 'CA4'), (0, 'NR4'), (0, 'OR4')), ((0, 'NR4'), (0, 'CRP4'), (0, 'C4'), (0, 'HR4'))), '4BNSNA': (((0, 'CLP4'), (0, 'CL4'), (0, 'NL4'), (0, 'OL4')), ((0, 'NL4'), (0, 'CLP4'), (0, 'CA4'), (0, 'HL4')), ((0, 'CRP4'), (0, 'CA4'), (0, 'NR4'), (0, 'OR4')), ((0, 'NR4'), (0, 'CRP4'), (0, 'C4'), (0, 'HR4'))), '3BNSNA': (((0, 'CLP3'), (0, 'CL3'), (0, 'NL3'), (0, 'OL3')), ((0, 'NL3'), (0, 'CLP3'), (0, 'CA3'), (0, 'HL3')), ((0, 'CRP3'), (0, 'CA3'), (0, 'NR3'), (0, 'OR3')), ((0, 'NR3'), (0, 'CRP3'), (0, 'C3'), (0, 'HR3'))), '4ANTNA': (((0, 'CLP4'), (0, 'CL4'), (0, 'NL4'), (0, 'OL4')), ((0, 'NL4'), (0, 'CLP4'), (0, 'CA4'), (0, 'HL4')), ((0, 'CRP4'), (0, 'CA4'), (0, 'NR4'), (0, 'OR4')), ((0, 'NR4'), (0, 'CRP4'), (0, 'C4'), (0, 'HR4'))), '4BNTNA': (((0, 'CLP4'), (0, 'CL4'), (0, 'NL4'), (0, 'OL4')), ((0, 'NL4'), (0, 'CLP4'), (0, 'CA4'), (0, 'HL4')), ((0, 'CRP4'), (0, 'CA4'), (0, 'NR4'), (0, 'OR4')), ((0, 'NR4'), (0, 'CRP4'), (0, 'C4'), (0, 'H4'))), '4ANGNA': (((0, 'CLP4'), (0, 'CL4'), (0, 'NL4'), (0, 'OL4')), ((0, 'NL4'), (0, 'CLP4'), (0, 'CA4'), (0, 'HL4')), ((0, 'CRP4'), (0, 'CA4'), (0, 'NR4'), (0, 'OR4')), ((0, 'NR4'), (0, 'CRP4'), (0, 'C4'), (0, 'HR4'))), '4BNGNA': (((0, 'CLP4'), (0, 'CL4'), (0, 'NL4'), (0, 'OL4')), ((0, 'NL4'), (0, 'CLP4'), (0, 'CA4'), (0, 'HL4')), ((0, 'CRP4'), (0, 'CA4'), (0, 'NR4'), (0, 'OR4')), ((0, 'NR4'), (0, 'CRP4'), (0, 'C4'), (0, 'HR4'))), '6TNG2': (((0, 'CT6'), (0, 'CA6'), (0, 'OT62'), (0, 'OT61')),), '6TNG': (((0, 'CT6'), (0, 'CA6'), (0, 'OT62'), (0, 'OT61')),), '7TNG': (((0, 'CT7'), (0, 'CA7'), (0, 'OT72'), (0, 'OT71')),), '2ANA': (((0, 'CRP2'), (0, 'CA2'), (0, 'NR2'), (0, 'OR2')), ((0, 'NR2'), (0, 'CRP2'), (0, 'C2'), (0, 'HR2'))), '2BNA': (((0, 'CRP2'), (0, 'CA2'), (0, 'NR2'), (0, 'OR2')), ((0, 'NR2'), (0, 'CRP2'), (0, 'C2'), (0, 'HR2'))), '6TCOO': (((0, 'C6'), (0, 'C5'), (0, 'O62'), (0, 'O61')),), '3BMDP': (((0, 'NX'), (0, 'CE3'), (0, 'CAX'), (0, 'HNX')), ((0, 'CX'), (0, 'CAX'), (0, 'NY'), (0, 'OX')), ((0, 'NY'), (0, 'CX'), (0, 'CAY'), (0, 'HNY')), ((0, 'CY'), (0, 'CGY'), (0, 'NT'), (0, 'OY')), ((0, 'CD'), (0, 'CA'), (0, 'OE2'), (0, 'OE1')), ((0, 'CY'), (0, 'NT'), (0, 'CAY'), (0, 'OY')), ((0, 'CY'), (0, 'CAY'), (0, 'NT'), (0, 'OY')), ((0, 'NT'), (0, 'C'), (0, 'HT21'), (0, 'HT2')), ((0, 'NT'), (0, 'C'), (0, 'HT2'), (0, 'HT21'))), '6COOME': (((0, 'C6'), (0, 'C5'), (0, 'O62'), (0, 'O61')),), '1AGLYA': (((0, 'C7'), (0, 'C8'), (0, 'O7B'), (0, 'O7A')),), '1BGLYA': (((0, 'C7'), (0, 'C8'), (0, 'O7B'), (0, 'O7A')),), '1AOS': (((0, 'CP'), (0, 'CA1'), (0, 'OT2'), (0, 'OT1')),), '1ANGF': (((0, 'C'), (0, 'CA'), (0, 'N1'), (0, 'O')), ((0, 'N1'), (0, 'C'), (0, 'C1'), (0, 'HN1'))), '1BNGF': (((0, 'C'), (0, 'CA'), (0, 'N1'), (0, 'O')), ((0, 'N1'), (0, 'C'), (0, 'C1'), (0, 'HN1'))), 'LIPAN1': (((0, 'C11'), (0, 'C12'), (0, 'N'), (0, 'O11')), ((0, 'N'), (0, 'C11'), (0, 'C2'), (0, 'HN2'))), 'LIPAN2': (((0, 'C31'), (0, 'C32'), (0, 'N'), (0, 'O31')), ((0, 'N'), (0, 'C31'), (0, 'C2'), (0, 'HN2'))), '4ANSDB': (((0, 'C44'), (0, 'CT44'), (0, 'N44'), (0, 'O44')), ((0, 'N44'), (0, 'C44'), (0, 'C4'), (0, 'HN44'))), '4BNSDB': (((0, 'C44'), (0, 'CT44'), (0, 'N44'), (0, 'O44')), ((0, 'N44'), (0, 'C44'), (0, 'C4'), (0, 'HN44'))), '4ANDHH': (((0, 'C44'), (0, 'CT44'), (0, 'N44'), (0, 'O44')), ((0, 'N44'), (0, 'C44'), (0, 'C4'), (0, 'HN44'))), '4BNDHH': (((0, 'C44'), (0, 'CT44'), (0, 'N44'), (0, 'O44')), ((0, 'N44'), (0, 'C44'), (0, 'C4'), (0, 'HN44'))), '4ANRHP': (((0, 'C44'), (0, 'CT44'), (0, 'N44'), (0, 'O44')), ((0, 'N44'), (0, 'C44'), (0, 'C4'), (0, 'HN44'))), '4BNRHP': (((0, 'C44'), (0, 'CT44'), (0, 'N44'), (0, 'O44')), ((0, 'N44'), (0, 'C44'), (0, 'C4'), (0, 'HN44'))), '4ANSHP': (((0, 'C44'), (0, 'CT44'), (0, 'N44'), (0, 'O44')), ((0, 'N44'), (0, 'C44'), (0, 'C4'), (0, 'HN44'))), '4BNSHP': (((0, 'C44'), (0, 'CT44'), (0, 'N44'), (0, 'O44')), ((0, 'N44'), (0, 'C44'), (0, 'C4'), (0, 'HN44'))), '3AALAF': (((0, 'CN'), (0, 'CA'), (0, 'N3'), (0, 'ON')), ((0, 'N3'), (0, 'CN'), (0, 'C3'), (0, 'HN3')), ((0, 'CF'), (0, 'HF1'), (0, 'NF'), (0, 'OF'))), '3BALAF': (((0, 'CN'), (0, 'CA'), (0, 'N3'), (0, 'ON')), ((0, 'N3'), (0, 'CN'), (0, 'C3'), (0, 'HN3')), ((0, 'CF'), (0, 'HF1'), (0, 'NF'), (0, 'OF'))), '3ANOPR': (((0, 'C'), (0, 'CA'), (0, 'N3'), (0, 'O')), ((0, 'CD'), (0, 'N'), (0, 'CG'), (0, 'OE')))}\n-delete_impropers = {'AMGA': (((0, 'CA'), (0, 'OA2'), (0, 'OA1'), (0, 'CC1')),), 'GMGA': (((0, 'CG'), (0, 'OG2'), (0, 'OG1'), (0, 'CC3')),), 'DMGA': (((0, 'CA'), (0, 'OA2'), (0, 'OA1'), (0, 'CC1')), ((0, 'CG'), (0, 'OG2'), (0, 'OG1'), (0, 'CC3'))), 'AMGT': (((0, 'CA'), (0, 'OA2'), (0, 'OA1'), (0, 'CC1')), ((0, 'CG'), (0, 'OG2'), (0, 'OG1'), (0, 'CC3'))), 'ATGM': (((0, 'CA'), (0, 'OA2'), (0, 'OA1'), (0, 'CC1')), ((0, 'CG'), (0, 'OG2'), (0, 'OG1'), (0, 'CC3'))), 'ABGA': (((0, 'CA'), (0, 'OA2'), (0, 'OA1'), (0, 'CC1')),), 'GBGA': (((0, 'CG'), (0, 'OG2'), (0, 'OG1'), (0, 'CC3')),), 'DBGA': (((0, 'CA'), (0, 'OA2'), (0, 'OA1'), (0, 'CC1')), ((0, 'CG'), (0, 'OG2'), (0, 'OG1'), (0, 'CC3'))), 'ALME': (((0, 'CA'), (0, 'OA2'), (0, 'OA1'), (0, 'CC1')),), 'G4MPAB': (((0, 'CA'), (0, 'OA2'), (0, 'OA1'), (0, 'CC1')),), 'G4PAB': (((0, 'CA'), (0, 'OA2'), (0, 'OA1'), (0, 'CC1')),), 'G3PABR': (((0, 'CA'), (0, 'OA2'), (0, 'OA1'), (0, 'CC1')),), 'G3PABS': (((0, 'CA'), (0, 'OA2'), (0, 'OA1'), (0, 'CC1')),), 'BPAB': (((0, 'CA'), (0, 'OA2'), (0, 'OA1'), (0, 'CC1')),), 'BPAT': (((0, 'CA'), (0, 'OA2'), (0, 'OA1'), (0, 'CC1')),), '3MSB': (((0, 'CA'), (0, 'OA2'), (0, 'OA1'), (0, 'CC1')),), '2MRB': (((0, 'CA'), (0, 'OA2'), (0, 'OA1'), (0, 'CC1')),), '2APP': (((0, 'CA'), (0, 'OA2'), (0, 'OA1'), (0, 'CC1')),), '3APP': (((0, 'CA'), (0, 'OA2'), (0, 'OA1'), (0, 'CC1')),), '4APP': (((0, 'CA'), (0, 'OA2'), (0, 'OA1'), (0, 'CC1')),), '2AFP': (((0, 'CA'), (0, 'OA2'), (0, 'OA1'), (0, 'CC1')),), '3AFP': (((0, 'CA'), (0, 'OA2'), (0, 'OA1'), (0, 'CC1')),), '4AFP': (((0, 'CA'), (0, 'OA2'), (0, 'OA1'), (0, 'CC1')),), '4FBP': (((0, 'CA'), (0, 'OA2'), (0, 'OA1'), (0, 'CC1')),), '3FBP': (((0, 'CA'), (0, 'OA2'), (0, 'OA1'), (0, 'CC1')),), '2FBP': (((0, 'CA'), (0, 'OA2'), (0, 'OA1'), (0, 'CC1')),), '3MRB': (((0, 'CA'), (0, 'OA2'), (0, 'OA1'), (0, 'CC1')),), '2MSB': (((0, 'CA'), (0, 'OA2'), (0, 'OA1'), (0, 'CC1')),), '3A2MPP': (((0, 'CA'), (0, 'OA2'), (0, 'OA1'), (0, 'CC1')),), '4A2MPP': (((0, 'CA'), (0, 'OA2'), (0, 'OA1'), (0, 'CC1')),), '3XBP': (((0, 'CA'), (0, 'OA2'), (0, 'OA1'), (0, 'CC1')),), 'DFTO': (((0, 'C5'), (0, 'C4'), (0, 'C6'), (0, 'C5M')), ((0, 'C4'), (0, 'C3'), (0, 'C5'), (0, 'F4')), ((0, 'C2'), (0, 'C1'), (0, 'C3'), (0, 'F2'))), 'ENOU': (((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'O4')),), 'UENO': (((0, 'C4'), (0, 'N3'), (0, 'C5'), (0, 'O4')),), '5UHG': (((0, 'C10'), (0, 'O11'), (0, 'O12'), (0, 'C9')),), '5UHA': (((0, 'C13'), (0, 'O30'), (0, 'O31'), (0, 'C12')),), 'CYTP': (((0, 'N4'), (0, 'C4'), (0, 'H41'), (0, 'H42')), ((0, 'C4'), (0, 'N3'), (0, 'C5'), (0, 'N4'))), '3MCN': (((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'N4')),), 'ADEP': (((0, 'N6'), (0, 'C6'), (0, 'H61'), (0, 'H62')), ((0, 'C6'), (0, 'N1'), (0, 'C5'), (0, 'N6'))), 'ADEI': (((0, 'C6'), (0, 'N1'), (0, 'C5'), (0, 'N6')),), '1MAN': (((0, 'C6'), (0, 'C5'), (0, 'N1'), (0, 'N6')),), '6AH': (((0, 'C13'), (0, 'ODB'), (0, 'ODA'), (0, 'C12')),), 'GENO': (((0, 'C6'), (0, 'N1'), (0, 'C5'), (0, 'O6')), ((0, 'N2'), (0, 'H21'), (0, 'C2'), (0, 'H22'))), '7MGE': (((0, 'C6'), (0, 'C5'), (0, 'N1'), (0, 'O6')),), 'BUGN': (((0, 'C17'), (0, 'O17'), (0, 'O18'), (0, 'C15')),)}\n+residue_impropers = {\n+ 'ALA': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'ARG': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O')), ((0, 'CZ'), (0, 'NH1'), (0, 'NH2'), (0, 'NE')), ((0, 'NH1'), (0, 'HH11'), (0, 'HH12'), (0, 'CZ')), ((0, 'NH2'), (0, 'HH21'), (0, 'HH22'), (0, 'CZ'))),\n+ 'ASN': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O')), ((0, 'CG'), (0, 'ND2'), (0, 'CB'), (0, 'OD1')), ((0, 'CG'), (0, 'CB'), (0, 'ND2'), (0, 'OD1')), ((0, 'ND2'), (0, 'CG'), (0, 'HD21'), (0, 'HD22')), ((0, 'ND2'), (0, 'CG'), (0, 'HD22'), (0, 'HD21'))),\n+ 'ASP': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O')), ((0, 'CG'), (0, 'CB'), (0, 'OD2'), (0, 'OD1'))),\n+ 'CYS': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'GLN': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O')), ((0, 'CD'), (0, 'NE2'), (0, 'CG'), (0, 'OE1')), ((0, 'CD'), (0, 'CG'), (0, 'NE2'), (0, 'OE1')), ((0, 'NE2'), (0, 'CD'), (0, 'HE21'), (0, 'HE22')), ((0, 'NE2'), (0, 'CD'), (0, 'HE22'), (0, 'HE21'))),\n+ 'GLU': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O')), ((0, 'CD'), (0, 'CG'), (0, 'OE2'), (0, 'OE1'))),\n+ 'GLY': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'HSD': (((0, 'ND1'), (0, 'CG'), (0, 'CE1'), (0, 'HD1')), ((0, 'CD2'), (0, 'CG'), (0, 'NE2'), (0, 'HD2')), ((0, 'CE1'), (0, 'ND1'), (0, 'NE2'), (0, 'HE1')), ((0, 'ND1'), (0, 'CE1'), (0, 'CG'), (0, 'HD1')), ((0, 'CD2'), (0, 'NE2'), (0, 'CG'), (0, 'HD2')), ((0, 'CE1'), (0, 'NE2'), (0, 'ND1'), (0, 'HE1')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'HSE': (((0, 'NE2'), (0, 'CD2'), (0, 'CE1'), (0, 'HE2')), ((0, 'CD2'), (0, 'CG'), (0, 'NE2'), (0, 'HD2')), ((0, 'CE1'), (0, 'ND1'), (0, 'NE2'), (0, 'HE1')), ((0, 'NE2'), (0, 'CE1'), (0, 'CD2'), (0, 'HE2')), ((0, 'CD2'), (0, 'NE2'), (0, 'CG'), (0, 'HD2')), ((0, 'CE1'), (0, 'NE2'), (0, 'ND1'), (0, 'HE1')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'HSP': (((0, 'ND1'), (0, 'CG'), (0, 'CE1'), (0, 'HD1')), ((0, 'ND1'), (0, 'CE1'), (0, 'CG'), (0, 'HD1')), ((0, 'NE2'), (0, 'CD2'), (0, 'CE1'), (0, 'HE2')), ((0, 'NE2'), (0, 'CE1'), (0, 'CD2'), (0, 'HE2')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'ILE': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'LEU': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'LYS': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'MET': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'PHE': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'PRO': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'CD')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'SER': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'THR': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'TRP': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'TYR': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'VAL': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'ALAD': (((0, 'CLP'), (0, 'CL'), (0, 'NL'), (0, 'OL')), ((0, 'NL'), (0, 'CLP'), (0, 'CA'), (0, 'HL')), ((0, 'CRP'), (0, 'CA'), (0, 'NR'), (0, 'OR')), ((0, 'NR'), (0, 'CRP'), (0, 'CR'), (0, 'HR'))),\n+ 'CYM': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'GUA': (((0, 'C2'), (0, 'N3'), (0, 'N1'), (0, 'N2')), ((0, 'C6'), (0, 'N1'), (0, 'C5'), (0, 'O6')), ((0, 'N2'), (0, 'H21'), (0, 'C2'), (0, 'H22'))),\n+ 'ADE': (((0, 'N6'), (0, 'C6'), (0, 'H61'), (0, 'H62')), ((0, 'C6'), (0, 'N1'), (0, 'C5'), (0, 'N6'))),\n+ 'CYT': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'O2')), ((0, 'C4'), (0, 'N3'), (0, 'C5'), (0, 'N4')), ((0, 'N4'), (0, 'C4'), (0, 'H41'), (0, 'H42'))),\n+ 'THY': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'O2')), ((0, 'C4'), (0, 'N3'), (0, 'C5'), (0, 'O4')), ((0, 'C5'), (0, 'C4'), (0, 'C6'), (0, 'C5M'))),\n+ 'URA': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'O2')), ((0, 'C4'), (0, 'N3'), (0, 'C5'), (0, 'O4'))),\n+ 'AGLCA': (((0, 'C6'), (0, 'C5'), (0, 'O62'), (0, 'O61')),),\n+ 'BGLCA': (((0, 'C6'), (0, 'C5'), (0, 'O62'), (0, 'O61')),),\n+ 'BGLCA0': (((0, 'C6'), (0, 'C5'), (0, 'O62'), (0, 'O61')),),\n+ 'AIDOA': (((0, 'C6'), (0, 'C5'), (0, 'O62'), (0, 'O61')),),\n+ 'BIDOA': (((0, 'C6'), (0, 'C5'), (0, 'O62'), (0, 'O61')),),\n+ 'AGLCNA': (((0, 'C'), (0, 'CT'), (0, 'N'), (0, 'O')), ((0, 'N'), (0, 'C'), (0, 'C2'), (0, 'HN'))),\n+ 'BGLCNA': (((0, 'C'), (0, 'CT'), (0, 'N'), (0, 'O')), ((0, 'N'), (0, 'C'), (0, 'C2'), (0, 'HN'))),\n+ 'BGLCN0': (((0, 'C'), (0, 'CT'), (0, 'N'), (0, 'O')), ((0, 'N'), (0, 'C'), (0, 'C2'), (0, 'HN'))),\n+ 'AGALNA': (((0, 'C'), (0, 'CT'), (0, 'N'), (0, 'O')), ((0, 'N'), (0, 'C'), (0, 'C2'), (0, 'HN'))),\n+ 'BGALNA': (((0, 'C'), (0, 'CT'), (0, 'N'), (0, 'O')), ((0, 'N'), (0, 'C'), (0, 'C2'), (0, 'HN'))),\n+ 'ANE5AC': (((0, 'C'), (0, 'CT'), (0, 'N'), (0, 'O')), ((0, 'N'), (0, 'C'), (0, 'C5'), (0, 'HN')), ((0, 'C1'), (0, 'C2'), (0, 'O12'), (0, 'O11'))),\n+ 'BNE5AC': (((0, 'C'), (0, 'CT'), (0, 'N'), (0, 'O')), ((0, 'N'), (0, 'C'), (0, 'C5'), (0, 'HN')), ((0, 'C1'), (0, 'C2'), (0, 'O12'), (0, 'O11'))),\n+ 'ALLOSE': (((0, 'C1'), (0, 'C2'), (0, 'O1'), (0, 'H1')),),\n+ 'PSICOS': (((0, 'C2'), (0, 'C1'), (0, 'C3'), (0, 'O2')),),\n+ 'LPPC': (((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32')),),\n+ 'DLPC': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))),\n+ 'DLPE': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))),\n+ 'DLPS': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32')), ((0, 'C13'), (0, 'C12'), (0, 'O13B'), (0, 'O13A'))),\n+ 'DLPA': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))),\n+ 'DLPG': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))),\n+ 'DMPC': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))),\n+ 'DMPE': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))),\n+ 'DMPS': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32')), ((0, 'C13'), (0, 'C12'), (0, 'O13B'), (0, 'O13A'))),\n+ 'DMPA': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))),\n+ 'DMPG': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))),\n+ 'DPPC': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))),\n+ 'DPPE': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))),\n+ 'DPPS': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32')), ((0, 'C13'), (0, 'C12'), (0, 'O13B'), (0, 'O13A'))),\n+ 'DPPA': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))),\n+ 'DPPG': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))),\n+ 'DSPC': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))),\n+ 'DSPE': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))),\n+ 'DSPS': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32')), ((0, 'C13'), (0, 'C12'), (0, 'O13B'), (0, 'O13A'))),\n+ 'DSPA': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))),\n+ 'DSPG': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))),\n+ 'DOPC': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))),\n+ 'DOPE': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))),\n+ 'DOPS': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32')), ((0, 'C13'), (0, 'C12'), (0, 'O13B'), (0, 'O13A'))),\n+ 'DOPA': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))),\n+ 'DOPG': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))),\n+ 'POPC': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))),\n+ 'POPE': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))),\n+ 'POPS': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32')), ((0, 'C13'), (0, 'C12'), (0, 'O13B'), (0, 'O13A'))),\n+ 'POPA': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))),\n+ 'POPG': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))),\n+ 'SAPC': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))),\n+ 'SDPC': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))),\n+ 'SOPC': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))),\n+ 'DAPC': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))),\n+ 'ACET': (((0, 'C2'), (0, 'O2'), (0, 'O1'), (0, 'C1')),),\n+ 'PROA': (((0, 'C1'), (0, 'O2'), (0, 'O1'), (0, 'C2')),),\n+ 'GUAN': (((0, 'C'), (0, 'N2'), (0, 'N3'), (0, 'N1')),),\n+ 'MGUA': (((0, 'C'), (0, 'N2'), (0, 'N3'), (0, 'N1')),),\n+ 'GLYN': (((0, 'C'), (0, 'CA'), (0, 'OT1'), (0, 'OT2')),),\n+ 'ACEH': (((0, 'C1'), (0, 'C2'), (0, 'O2'), (0, 'O1')),),\n+ 'FORM': (((0, 'C'), (0, 'N'), (0, 'O'), (0, 'HA')),),\n+ 'ACEM': (((0, 'C'), (0, 'CC'), (0, 'N'), (0, 'O')),),\n+ 'PRAM': (((0, 'C'), (0, 'CC'), (0, 'N'), (0, 'O')),),\n+ 'NMA': (((0, 'C'), (0, 'CL'), (0, 'N'), (0, 'O')),),\n+ 'AANM': (((0, 'CLP'), (0, 'CL'), (0, 'NL'), (0, 'OL')), ((0, 'CRP'), (0, 'CA'), (0, 'NR'), (0, 'OR'))),\n+ 'APNH': (((0, 'CY'), (0, 'CAY'), (0, 'N'), (0, 'OY')), ((0, 'C'), (0, 'CA'), (0, 'NT'), (0, 'O'))),\n+ 'PDIP': (((0, 'CY'), (0, 'CAY'), (0, 'N'), (0, 'OY')), ((0, 'C'), (0, 'CA'), (0, 'NT'), (0, 'O'))),\n+ 'PNH2': (((0, 'C'), (0, 'CA'), (0, 'NT'), (0, 'O')),),\n+ 'CO3': (((0, 'C1'), (0, 'O1'), (0, 'O2'), (0, 'O3')),),\n+ 'AALD': (((0, 'CB'), (0, 'C'), (0, 'O'), (0, 'HA')),),\n+ 'PALD': (((0, 'CB'), (0, 'C'), (0, 'O'), (0, 'HA')),),\n+ 'CALD': (((0, 'CB'), (0, 'C'), (0, 'O'), (0, 'HA')),),\n+ 'BALD': (((0, 'CG'), (0, 'C'), (0, 'O'), (0, 'HA')),),\n+ '4AP2': (((0, 'HE1'), (0, 'NZ'), (0, 'CD1'), (0, 'CE1')), ((0, 'HD1'), (0, 'CE1'), (0, 'CG'), (0, 'CD1')), ((0, 'HE2'), (0, 'NZ'), (0, 'CD2'), (0, 'CE2')), ((0, 'HD2'), (0, 'CE2'), (0, 'CG'), (0, 'CD2')), ((0, 'NG'), (0, 'CD1'), (0, 'CD2'), (0, 'CG')), ((0, 'HG11'), (0, 'CG'), (0, 'HG12'), (0, 'NG'))),\n+ '3APY': (((0, 'HE1'), (0, 'NZ'), (0, 'CD1'), (0, 'CE1')), ((0, 'HE2'), (0, 'NZ'), (0, 'CD2'), (0, 'CE2')), ((0, 'HD2'), (0, 'CE2'), (0, 'CG'), (0, 'CD2')), ((0, 'HG'), (0, 'CD1'), (0, 'CD2'), (0, 'CG')), ((0, 'ND1'), (0, 'CG'), (0, 'CE1'), (0, 'CD1')), ((0, 'HD11'), (0, 'CD1'), (0, 'HD12'), (0, 'ND1'))),\n+ '34AP': (((0, 'HE1'), (0, 'NZ'), (0, 'CD1'), (0, 'CE1')), ((0, 'HE2'), (0, 'NZ'), (0, 'CD2'), (0, 'CE2')), ((0, 'HD2'), (0, 'CE2'), (0, 'CG'), (0, 'CD2')), ((0, 'ND1'), (0, 'CG'), (0, 'CE1'), (0, 'CD1')), ((0, 'HD11'), (0, 'CD1'), (0, 'HD12'), (0, 'ND1')), ((0, 'NG'), (0, 'CD1'), (0, 'CD2'), (0, 'CG')), ((0, 'HG11'), (0, 'CG'), (0, 'HG12'), (0, 'NG'))),\n+ '3CPY': (((0, 'HE1'), (0, 'NZ'), (0, 'CD1'), (0, 'CE1')), ((0, 'HE2'), (0, 'NZ'), (0, 'CD2'), (0, 'CE2')), ((0, 'HD2'), (0, 'CE2'), (0, 'CG'), (0, 'CD2')), ((0, 'HG'), (0, 'CD1'), (0, 'CD2'), (0, 'CG'))),\n+ '3FLP': (((0, 'HE1'), (0, 'NZ'), (0, 'CD1'), (0, 'CE1')), ((0, 'F1'), (0, 'CE1'), (0, 'CG'), (0, 'CD1')), ((0, 'HE2'), (0, 'NZ'), (0, 'CD2'), (0, 'CE2')), ((0, 'HD2'), (0, 'CE2'), (0, 'CG'), (0, 'CD2')), ((0, 'HG'), (0, 'CD1'), (0, 'CD2'), (0, 'CG'))),\n+ '3ALP': (((0, 'HE1'), (0, 'NZ'), (0, 'CD1'), (0, 'CE1')), ((0, 'HE2'), (0, 'NZ'), (0, 'CD2'), (0, 'CE2')), ((0, 'HD2'), (0, 'CE2'), (0, 'CG'), (0, 'CD2')), ((0, 'HG'), (0, 'CD1'), (0, 'CD2'), (0, 'CG')), ((0, 'CD1'), (0, 'CD3'), (0, 'O1'), (0, 'H3'))),\n+ '3HOP': (((0, 'HE1'), (0, 'NZ'), (0, 'CD1'), (0, 'CE1')), ((0, 'HE2'), (0, 'NZ'), (0, 'CD2'), (0, 'CE2')), ((0, 'HD2'), (0, 'CE2'), (0, 'CG'), (0, 'CD2')), ((0, 'HG'), (0, 'CD1'), (0, 'CD2'), (0, 'CG'))),\n+ '3MEP': (((0, 'HE1'), (0, 'NZ'), (0, 'CD1'), (0, 'CE1')), ((0, 'HE2'), (0, 'NZ'), (0, 'CD2'), (0, 'CE2')), ((0, 'HD2'), (0, 'CE2'), (0, 'CG'), (0, 'CD2')), ((0, 'HG'), (0, 'CD1'), (0, 'CD2'), (0, 'CG')), ((0, 'CD1'), (0, 'CE1'), (0, 'CG'), (0, 'CD3'))),\n+ '3ETP': (((0, 'HE1'), (0, 'NZ'), (0, 'CD1'), (0, 'CE1')), ((0, 'HE2'), (0, 'NZ'), (0, 'CD2'), (0, 'CE2')), ((0, 'HD2'), (0, 'CE2'), (0, 'CG'), (0, 'CD2')), ((0, 'HG'), (0, 'CD1'), (0, 'CD2'), (0, 'CG')), ((0, 'CD1'), (0, 'CE1'), (0, 'CG'), (0, 'CD3'))),\n+ '3BPY': (((0, 'HE1'), (0, 'NZ'), (0, 'CD1'), (0, 'CE1')), ((0, 'HG'), (0, 'CD1'), (0, 'CD2'), (0, 'CG')), ((0, 'HE2'), (0, 'NZ'), (0, 'CD2'), (0, 'CE2')), ((0, 'HD2'), (0, 'CE2'), (0, 'CG'), (0, 'CD2')), ((0, 'CD1'), (0, 'CE1'), (0, 'CG'), (0, 'CD3'))),\n+ '3CYP': (((0, 'HE1'), (0, 'NZ'), (0, 'CD1'), (0, 'CE1')), ((0, 'HE2'), (0, 'NZ'), (0, 'CD2'), (0, 'CE2')), ((0, 'HD2'), (0, 'CE2'), (0, 'CG'), (0, 'CD2')), ((0, 'HG'), (0, 'CD1'), (0, 'CD2'), (0, 'CG')), ((0, 'CD1'), (0, 'CE1'), (0, 'CG'), (0, 'C3N'))),\n+ '3ACP': (((0, 'HE1'), (0, 'NZ'), (0, 'CD1'), (0, 'CE1')), ((0, 'HE2'), (0, 'NZ'), (0, 'CD2'), (0, 'CE2')), ((0, 'HD2'), (0, 'CE2'), (0, 'CG'), (0, 'CD2')), ((0, 'HG'), (0, 'CD1'), (0, 'CD2'), (0, 'CG')), ((0, 'CD1'), (0, 'CE1'), (0, 'CG'), (0, 'C')), ((0, 'C'), (0, 'CD1'), (0, 'CH3'), (0, 'O'))),\n+ '3NAP': (((0, 'HE1'), (0, 'NZ'), (0, 'CD1'), (0, 'CE1')), ((0, 'HE2'), (0, 'NZ'), (0, 'CD2'), (0, 'CE2')), ((0, 'HD2'), (0, 'CE2'), (0, 'CG'), (0, 'CD2')), ((0, 'HG'), (0, 'CD1'), (0, 'CD2'), (0, 'CG')), ((0, 'CD1'), (0, 'CE1'), (0, 'CG'), (0, 'C')), ((0, 'C'), (0, 'CD1'), (0, 'N'), (0, 'O'))),\n+ '3CAP': (((0, 'HE1'), (0, 'NZ'), (0, 'CD1'), (0, 'CE1')), ((0, 'HE2'), (0, 'NZ'), (0, 'CD2'), (0, 'CE2')), ((0, 'HD2'), (0, 'CE2'), (0, 'CG'), (0, 'CD2')), ((0, 'HG'), (0, 'CD1'), (0, 'CD2'), (0, 'CG')), ((0, 'CD1'), (0, 'CE1'), (0, 'CG'), (0, 'CD3'))),\n+ '3PHP': (((0, 'HE1'), (0, 'NZ'), (0, 'CD1'), (0, 'CE1')), ((0, 'HE2'), (0, 'NZ'), (0, 'CD2'), (0, 'CE2')), ((0, 'HD2'), (0, 'CE2'), (0, 'CG'), (0, 'CD2')), ((0, 'HG'), (0, 'CD1'), (0, 'CD2'), (0, 'CG')), ((0, 'CD1'), (0, 'CE1'), (0, 'CG'), (0, 'CA1'))),\n+ '3BNP': (((0, 'HE1'), (0, 'NZ'), (0, 'CD1'), (0, 'CE1')), ((0, 'HE2'), (0, 'NZ'), (0, 'CD2'), (0, 'CE2')), ((0, 'HD2'), (0, 'CE2'), (0, 'CG'), (0, 'CD2')), ((0, 'HG'), (0, 'CD1'), (0, 'CD2'), (0, 'CG')), ((0, 'CD1'), (0, 'CE1'), (0, 'CG'), (0, 'C'))),\n+ 'MAS': (((0, 'C'), (0, 'C1'), (0, 'O'), (0, 'OM')),),\n+ 'ETAC': (((0, 'C'), (0, 'C1'), (0, 'O'), (0, 'OM')),),\n+ 'MPRO': (((0, 'C'), (0, 'C1'), (0, 'O'), (0, 'OM')),),\n+ 'ACHO': (((0, 'C'), (0, 'C7'), (0, 'O'), (0, 'OM')),),\n+ 'GLYC': (((0, 'C5'), (0, 'C7'), (0, 'O6'), (0, 'O4')), ((0, 'C9'), (0, 'C11'), (0, 'O10'), (0, 'O8'))),\n+ 'AAPM': (((0, 'C5'), (0, 'C7'), (0, 'O6'), (0, 'O4')), ((0, 'C9'), (0, 'C11'), (0, 'O10'), (0, 'O8'))),\n+ 'MBUT': (((0, 'C1'), (0, 'C2'), (0, 'O1'), (0, 'OM')),),\n+ 'CSAD': (((0, 'H62'), (0, 'C6'), (0, 'H61'), (0, 'N6')), ((0, 'N6'), (0, 'N1'), (0, 'C5'), (0, 'C6'))),\n+ 'CSGU': (((0, 'N2'), (0, 'N3'), (0, 'N1'), (0, 'C2')), ((0, 'O6'), (0, 'N1'), (0, 'C5'), (0, 'C6')), ((0, 'H22'), (0, 'H21'), (0, 'C2'), (0, 'N2'))),\n+ 'CSTH': (((0, 'O2'), (0, 'N1'), (0, 'N3'), (0, 'C2')), ((0, 'O4'), (0, 'N3'), (0, 'C5'), (0, 'C4')), ((0, 'C5M'), (0, 'C4'), (0, 'C6'), (0, 'C5'))),\n+ 'CSCY': (((0, 'O2'), (0, 'N1'), (0, 'N3'), (0, 'C2')), ((0, 'N4'), (0, 'N3'), (0, 'C5'), (0, 'C4')), ((0, 'H42'), (0, 'C4'), (0, 'H41'), (0, 'N4'))),\n+ 'CNAD': (((0, 'H62'), (0, 'C6'), (0, 'H61'), (0, 'N6')), ((0, 'N6'), (0, 'N1'), (0, 'C5'), (0, 'C6'))),\n+ 'CNGU': (((0, 'N2'), (0, 'N3'), (0, 'N1'), (0, 'C2')), ((0, 'O6'), (0, 'N1'), (0, 'C5'), (0, 'C6')), ((0, 'H22'), (0, 'H21'), (0, 'C2'), (0, 'N2'))),\n+ 'CNTH': (((0, 'O2'), (0, 'N1'), (0, 'N3'), (0, 'C2')), ((0, 'O4'), (0, 'N3'), (0, 'C5'), (0, 'C4')), ((0, 'C5M'), (0, 'C4'), (0, 'C6'), (0, 'C5'))),\n+ 'CNT1': (((0, 'O2'), (0, 'N1'), (0, 'N3'), (0, 'C2')), ((0, 'O4'), (0, 'N3'), (0, 'C5'), (0, 'C4')), ((0, 'C5M'), (0, 'C4'), (0, 'C6'), (0, 'C5'))),\n+ 'CNT2': (((0, 'O2'), (0, 'N1'), (0, 'N3'), (0, 'C2')), ((0, 'O4'), (0, 'N3'), (0, 'C5'), (0, 'C4')), ((0, 'C5M'), (0, 'C4'), (0, 'C6'), (0, 'C5'))),\n+ 'CNT3': (((0, 'O2'), (0, 'N1'), (0, 'N3'), (0, 'C2')), ((0, 'O4'), (0, 'N3'), (0, 'C5'), (0, 'C4')), ((0, 'C5M'), (0, 'C4'), (0, 'C6'), (0, 'C5'))),\n+ 'CNCY': (((0, 'O2'), (0, 'N1'), (0, 'N3'), (0, 'C2')), ((0, 'N4'), (0, 'N3'), (0, 'C5'), (0, 'C4')), ((0, 'H42'), (0, 'C4'), (0, 'H41'), (0, 'N4'))),\n+ 'THFI': (((0, 'ND1'), (0, 'CG'), (0, 'CE1'), (0, \"C1'\")), ((0, 'ND1'), (0, 'CE1'), (0, 'CG'), (0, \"C1'\")), ((0, 'CD2'), (0, 'CG'), (0, 'NE2'), (0, 'HD2')), ((0, 'CD2'), (0, 'NE2'), (0, 'CG'), (0, 'HD2')), ((0, 'CE1'), (0, 'ND1'), (0, 'NE2'), (0, 'HE1')), ((0, 'CE1'), (0, 'NE2'), (0, 'ND1'), (0, 'HE1')), ((0, 'CG'), (0, 'CD2'), (0, 'ND1'), (0, 'HG')), ((0, 'CG'), (0, 'ND1'), (0, 'CD2'), (0, 'HG'))),\n+ 'THMI': (((0, 'ND1'), (0, 'CG'), (0, 'CE1'), (0, \"C1'\")), ((0, 'ND1'), (0, 'CE1'), (0, 'CG'), (0, \"C1'\")), ((0, 'CD2'), (0, 'CG'), (0, 'NE2'), (0, 'HD2')), ((0, 'CD2'), (0, 'NE2'), (0, 'CG'), (0, 'HD2')), ((0, 'CE1'), (0, 'ND1'), (0, 'NE2'), (0, 'HE1')), ((0, 'CE1'), (0, 'NE2'), (0, 'ND1'), (0, 'HE1')), ((0, 'CG'), (0, 'CD2'), (0, 'ND1'), (0, 'HG')), ((0, 'CG'), (0, 'ND1'), (0, 'CD2'), (0, 'HG'))),\n+ 'TADE': (((0, 'C6'), (0, 'C5'), (0, 'N1'), (0, 'N6')), ((0, 'N6'), (0, 'H62'), (0, 'H61'), (0, 'C6'))),\n+ 'TCYT': (((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'N4')), ((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'O2')), ((0, 'N4'), (0, 'H42'), (0, 'H41'), (0, 'C4'))),\n+ 'TGUA': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'N2')), ((0, 'N2'), (0, 'H22'), (0, 'H21'), (0, 'C2')), ((0, 'C6'), (0, 'C5'), (0, 'N1'), (0, 'O6'))),\n+ 'TTHY': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'O2')), ((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'O4'))),\n+ 'TURA': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'O2')), ((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'O4'))),\n+ 'THAO': (((0, 'ND1'), (0, 'CG'), (0, 'CE1'), (0, \"C1'\")), ((0, 'ND1'), (0, 'CE1'), (0, 'CG'), (0, \"C1'\")), ((0, 'CD2'), (0, 'CG'), (0, 'NE2'), (0, 'HD2')), ((0, 'CD2'), (0, 'NE2'), (0, 'CG'), (0, 'HD2')), ((0, 'CE1'), (0, 'ND1'), (0, 'NE2'), (0, 'HE1')), ((0, 'CE1'), (0, 'NE2'), (0, 'ND1'), (0, 'HE1')), ((0, 'CG'), (0, 'CD2'), (0, 'ND1'), (0, 'HG')), ((0, 'CG'), (0, 'ND1'), (0, 'CD2'), (0, 'HG'))),\n+ 'NUSA': (((0, 'C6'), (0, 'C5'), (0, 'N1'), (0, 'N6')), ((0, 'N6'), (0, 'H62'), (0, 'H61'), (0, 'C6'))),\n+ 'NUSG': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'N2')), ((0, 'N2'), (0, 'H22'), (0, 'H21'), (0, 'C2')), ((0, 'C6'), (0, 'C5'), (0, 'N1'), (0, 'O6'))),\n+ 'NUSC': (((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'N4')), ((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'O2')), ((0, 'N4'), (0, 'H42'), (0, 'H41'), (0, 'C4'))),\n+ 'NUST': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'O2')), ((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'O4'))),\n+ 'NUSU': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'O2')), ((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'O4'))),\n+ 'RNUS': (((0, 'ND1'), (0, 'CG'), (0, 'CE1'), (0, \"C1'\")), ((0, 'ND1'), (0, 'CE1'), (0, 'CG'), (0, \"C1'\")), ((0, 'CD2'), (0, 'CG'), (0, 'NE2'), (0, 'HD2')), ((0, 'CD2'), (0, 'NE2'), (0, 'CG'), (0, 'HD2')), ((0, 'CE1'), (0, 'ND1'), (0, 'NE2'), (0, 'HE1')), ((0, 'CE1'), (0, 'NE2'), (0, 'ND1'), (0, 'HE1')), ((0, 'CG'), (0, 'CD2'), (0, 'ND1'), (0, 'HG')), ((0, 'CG'), (0, 'ND1'), (0, 'CD2'), (0, 'HG'))),\n+ 'RNUA': (((0, 'C6'), (0, 'C5'), (0, 'N1'), (0, 'N6')), ((0, 'N6'), (0, 'H62'), (0, 'H61'), (0, 'C6'))),\n+ 'RNUG': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'N2')), ((0, 'N2'), (0, 'H22'), (0, 'H21'), (0, 'C2')), ((0, 'C6'), (0, 'C5'), (0, 'N1'), (0, 'O6'))),\n+ 'RNUC': (((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'N4')), ((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'O2')), ((0, 'N4'), (0, 'H42'), (0, 'H41'), (0, 'C4'))),\n+ 'NUCL': (((0, 'ND1'), (0, 'CG'), (0, 'CE1'), (0, \"C1'\")), ((0, 'ND1'), (0, 'CE1'), (0, 'CG'), (0, \"C1'\")), ((0, 'CD2'), (0, 'CG'), (0, 'NE2'), (0, 'HD2')), ((0, 'CD2'), (0, 'NE2'), (0, 'CG'), (0, 'HD2')), ((0, 'CE1'), (0, 'ND1'), (0, 'NE2'), (0, 'HE1')), ((0, 'CE1'), (0, 'NE2'), (0, 'ND1'), (0, 'HE1')), ((0, 'CG'), (0, 'CD2'), (0, 'ND1'), (0, 'HG')), ((0, 'CG'), (0, 'ND1'), (0, 'CD2'), (0, 'HG'))),\n+ 'NADE': (((0, 'C6'), (0, 'C5'), (0, 'N1'), (0, 'N6')), ((0, 'N6'), (0, 'H62'), (0, 'H61'), (0, 'C6'))),\n+ 'NTHY': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'O2')), ((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'O4'))),\n+ 'NIC': (((0, 'C12'), (0, 'N14'), (0, 'C9'), (0, 'O13')), ((0, 'C12'), (0, 'C9'), (0, 'N14'), (0, 'O13')), ((0, 'N14'), (0, 'C12'), (0, 'H16'), (0, 'H15')), ((0, 'N14'), (0, 'C12'), (0, 'H15'), (0, 'H16')), ((0, 'N2'), (0, 'C10'), (0, 'C3'), (0, 'H1')), ((0, 'C3'), (0, 'N2'), (0, 'C5'), (0, 'H4')), ((0, 'C5'), (0, 'C3'), (0, 'C7'), (0, 'H6')), ((0, 'C7'), (0, 'C5'), (0, 'C9'), (0, 'H8')), ((0, 'C10'), (0, 'C9'), (0, 'N2'), (0, 'H11'))),\n+ 'NICH': (((0, 'C12'), (0, 'N14'), (0, 'C9'), (0, 'O13')), ((0, 'C12'), (0, 'C9'), (0, 'N14'), (0, 'O13')), ((0, 'N14'), (0, 'C12'), (0, 'H16'), (0, 'H15')), ((0, 'N14'), (0, 'C12'), (0, 'H15'), (0, 'H16')), ((0, 'N2'), (0, 'C10'), (0, 'C3'), (0, 'H1')), ((0, 'C3'), (0, 'N2'), (0, 'C5'), (0, 'H4')), ((0, 'C5'), (0, 'C3'), (0, 'C7'), (0, 'H6')), ((0, 'C10'), (0, 'C9'), (0, 'N2'), (0, 'H11'))),\n+ 'AMP': (((0, 'N6'), (0, 'C6'), (0, 'H61'), (0, 'H62')), ((0, 'C6'), (0, 'N1'), (0, 'C5'), (0, 'N6'))),\n+ 'ADP': (((0, 'N6'), (0, 'C6'), (0, 'H61'), (0, 'H62')), ((0, 'C6'), (0, 'N1'), (0, 'C5'), (0, 'N6'))),\n+ 'ATP': (((0, 'N6'), (0, 'C6'), (0, 'H61'), (0, 'H62')), ((0, 'C6'), (0, 'N1'), (0, 'C5'), (0, 'N6'))),\n+ 'NAD': (((0, 'N6A'), (0, 'C6A'), (0, 'H61A'), (0, 'H62A')), ((0, 'C6A'), (0, 'N1A'), (0, 'C5A'), (0, 'N6A')), ((0, 'C7N'), (0, 'N7N'), (0, 'C3N'), (0, 'O7N')), ((0, 'C7N'), (0, 'C3N'), (0, 'N7N'), (0, 'O7N')), ((0, 'N7N'), (0, 'C7N'), (0, 'H71N'), (0, 'H72N')), ((0, 'N7N'), (0, 'C7N'), (0, 'H72N'), (0, 'H71N')), ((0, 'C6N'), (0, 'N1N'), (0, 'C5N'), (0, 'HN6')), ((0, 'C5N'), (0, 'C6N'), (0, 'C4N'), (0, 'H5N')), ((0, 'C4N'), (0, 'C5N'), (0, 'C3N'), (0, 'H41N')), ((0, 'C2N'), (0, 'C3N'), (0, 'N1N'), (0, 'H2N'))),\n+ 'NADH': (((0, 'AN6'), (0, 'AC6'), (0, 'AH61'), (0, 'AH62')), ((0, 'AC6'), (0, 'AN1'), (0, 'AC5'), (0, 'AN6')), ((0, 'NC7'), (0, 'NN7'), (0, 'NC3'), (0, 'NO7')), ((0, 'NC7'), (0, 'NC3'), (0, 'NN7'), (0, 'NO7')), ((0, 'NN7'), (0, 'NC7'), (0, 'NH71'), (0, 'NH72')), ((0, 'NN7'), (0, 'NC7'), (0, 'NH72'), (0, 'NH71')), ((0, 'NC6'), (0, 'NN1'), (0, 'NC5'), (0, 'NH6')), ((0, 'NC5'), (0, 'NC6'), (0, 'NC4'), (0, 'NH5')), ((0, 'NC4'), (0, 'NC5'), (0, 'NC3'), (0, 'NH4')), ((0, 'NC2'), (0, 'NC3'), (0, 'NN1'), (0, 'NH2'))),\n+ 'NADP': (((0, 'AN6'), (0, 'AC6'), (0, 'AH61'), (0, 'AH62')), ((0, 'AC6'), (0, 'AN1'), (0, 'AC5'), (0, 'AN6')), ((0, 'NC7'), (0, 'NN7'), (0, 'NC3'), (0, 'NO7')), ((0, 'NC7'), (0, 'NC3'), (0, 'NN7'), (0, 'NO7')), ((0, 'NN7'), (0, 'NC7'), (0, 'NH71'), (0, 'NH72')), ((0, 'NN7'), (0, 'NC7'), (0, 'NH72'), (0, 'NH71')), ((0, 'NC6'), (0, 'NN1'), (0, 'NC5'), (0, 'NH6')), ((0, 'NC5'), (0, 'NC6'), (0, 'NC4'), (0, 'NH5')), ((0, 'NC4'), (0, 'NC5'), (0, 'NC3'), (0, 'NH4')), ((0, 'NC2'), (0, 'NC3'), (0, 'NN1'), (0, 'NH2'))),\n+ 'NDPH': (((0, 'AN6'), (0, 'AC6'), (0, 'AH61'), (0, 'AH62')), ((0, 'AC6'), (0, 'AN1'), (0, 'AC5'), (0, 'AN6')), ((0, 'NC7'), (0, 'NN7'), (0, 'NC3'), (0, 'NO7')), ((0, 'NC7'), (0, 'NC3'), (0, 'NN7'), (0, 'NO7')), ((0, 'NN7'), (0, 'NC7'), (0, 'NH71'), (0, 'NH72')), ((0, 'NN7'), (0, 'NC7'), (0, 'NH72'), (0, 'NH71')), ((0, 'NC6'), (0, 'NN1'), (0, 'NC5'), (0, 'NH6')), ((0, 'NC5'), (0, 'NC6'), (0, 'NC4'), (0, 'NH5')), ((0, 'NC4'), (0, 'NC5'), (0, 'NC3'), (0, 'NH4')), ((0, 'NC2'), (0, 'NC3'), (0, 'NN1'), (0, 'NH2'))),\n+ 'MAM1': (((0, 'N1'), (0, 'HN2'), (0, 'HN1'), (0, 'C1')),),\n+ 'SAH': (((0, 'N6'), (0, 'H62'), (0, 'H61'), (0, 'C6')), ((0, 'C6'), (0, 'C5'), (0, 'N1'), (0, 'N6')), ((0, 'C'), (0, 'OT1'), (0, 'OT2'), (0, 'CA'))),\n+ 'BF6': (((0, 'C1'), (0, 'CZ1'), (0, 'C2'), (0, 'O1')), ((0, 'C3'), (0, 'CZ2'), (0, 'C4'), (0, 'O3'))),\n+ 'BF7': (((0, 'C1'), (0, 'C2'), (0, 'CZ1'), (0, 'O1')), ((0, 'C2'), (0, 'O2B'), (0, 'O2A'), (0, 'C1')), ((0, 'C3'), (0, 'C4'), (0, 'CZ2'), (0, 'O3')), ((0, 'C4'), (0, 'O4B'), (0, 'O4A'), (0, 'C3'))),\n+ 'BCA': (((0, 'C1'), (0, 'O1B'), (0, 'O1A'), (0, 'CZ1')), ((0, 'C2'), (0, 'O2B'), (0, 'O2A'), (0, 'CZ2'))),\n+ 'C36': (((0, 'C1'), (0, 'CZ1'), (0, 'C2'), (0, 'O1')), ((0, 'C3'), (0, 'CZ2'), (0, 'C4'), (0, 'O3'))),\n+ 'C37': (((0, 'C1'), (0, 'C2'), (0, 'CZ1'), (0, 'O1')), ((0, 'C2'), (0, 'O2B'), (0, 'O2A'), (0, 'C1')), ((0, 'C3'), (0, 'C4'), (0, 'CZ2'), (0, 'O3')), ((0, 'C4'), (0, 'O4B'), (0, 'O4A'), (0, 'C3'))),\n+ 'C3C': (((0, 'C1'), (0, 'O1B'), (0, 'O1A'), (0, 'CZ1')), ((0, 'C2'), (0, 'O2B'), (0, 'O2A'), (0, 'CZ2'))),\n+ 'PRAL': (((0, 'CG'), (0, 'C2'), (0, 'OD1'), (0, 'H')),),\n+ 'UREA': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'O2')),),\n+ 'MGU1': (((0, 'C'), (0, 'N2'), (0, 'N1'), (0, 'N3')), ((0, 'N1'), (0, 'H11'), (0, 'H12'), (0, 'C')), ((0, 'N2'), (0, 'H21'), (0, 'H22'), (0, 'C'))),\n+ 'MGU2': (((0, 'C'), (0, 'N2'), (0, 'N1'), (0, 'N3')), ((0, 'N3'), (0, 'C4'), (0, 'C'), (0, 'H31')), ((0, 'N2'), (0, 'H21'), (0, 'H22'), (0, 'C'))),\n+ 'HDZ1': (((0, 'C2'), (0, 'C1'), (0, 'N3'), (0, 'O2')), ((0, 'C5'), (0, 'C6'), (0, 'N4'), (0, 'H5'))),\n+ 'HDZ2': (((0, 'C2'), (0, 'CZ2'), (0, 'N3'), (0, 'O2')), ((0, 'C5'), (0, 'CPG'), (0, 'N4'), (0, 'H5'))),\n+ 'CA': (((0, 'CD'), (0, 'OE2'), (0, 'OE1'), (0, 'C23')),),\n+ 'DCA': (((0, 'CD'), (0, 'OE2'), (0, 'OE1'), (0, 'C23')),),\n+ 'LCA': (((0, 'CD'), (0, 'OE2'), (0, 'OE1'), (0, 'C23')),),\n+ 'CDCA': (((0, 'CD'), (0, 'OE2'), (0, 'OE1'), (0, 'C23')),),\n+ 'UDCA': (((0, 'CD'), (0, 'OE2'), (0, 'OE1'), (0, 'C23')),),\n+ 'GA': (((0, 'C24'), (0, 'C23'), (0, 'N'), (0, 'O24')), ((0, 'CA'), (0, 'OA2'), (0, 'OA1'), (0, 'CC1')), ((0, 'CG'), (0, 'OG2'), (0, 'OG1'), (0, 'CC3'))),\n+ 'BAB1': (((0, 'C24'), (0, 'C23'), (0, 'N'), (0, 'O24')), ((0, 'CA'), (0, 'OA2'), (0, 'OA1'), (0, 'CC1')), ((0, 'CG'), (0, 'CC3'), (0, 'NT'), (0, 'OG'))),\n+ 'FBIB': (((0, 'CD'), (0, 'OD2'), (0, 'OD1'), (0, 'CA')),),\n+ '2PDO': (((0, 'C2'), (0, 'C3'), (0, 'N1'), (0, 'O2')),),\n+ 'ACO': (((0, 'C1'), (0, 'C2'), (0, 'C3'), (0, 'O1')),),\n+ 'IPAA': (((0, 'C'), (0, 'CL'), (0, 'N'), (0, 'O')),),\n+ 'AMOP': (((0, 'C2'), (0, 'O2'), (0, 'O1'), (0, 'C1')),),\n+ '2MPA': (((0, 'CG'), (0, 'CM'), (0, 'NT'), (0, 'OG')),),\n+ '2AMP': (((0, 'C'), (0, 'CM'), (0, 'NE'), (0, 'O')), ((0, 'CE1'), (0, 'CD1'), (0, 'NZ'), (0, 'NE'))),\n+ '3AMP': (((0, 'C'), (0, 'CM'), (0, 'ND'), (0, 'O')),),\n+ '2AMF': (((0, 'C'), (0, 'CM'), (0, 'N'), (0, 'O')),),\n+ 'GABD': (((0, 'C24'), (0, 'C23'), (0, 'N'), (0, 'O24')), ((0, 'CA'), (0, 'OA2'), (0, 'OA1'), (0, 'CC1')), ((0, 'CG'), (0, 'CC3'), (0, 'NG'), (0, 'OG'))),\n+ 'AMOL': (((0, 'C2'), (0, 'O2'), (0, 'O1'), (0, 'C1')),),\n+ '9MAD': (((0, 'C6'), (0, 'C5'), (0, 'N1'), (0, 'N6')), ((0, 'N6'), (0, 'H62'), (0, 'H61'), (0, 'C6'))),\n+ '1MTH': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'O2')), ((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'O4'))),\n+ 'FORA': (((0, 'C1'), (0, 'O2'), (0, 'O3'), (0, 'H4')),),\n+ 'BTON': (((0, 'C1'), (0, 'C3'), (0, 'C2'), (0, 'O1')),),\n+ 'CHON': (((0, 'C1'), (0, 'C2'), (0, 'C6'), (0, 'O1')),),\n+ 'DMTT': (((0, 'C'), (0, 'S1'), (0, 'S2'), (0, 'S')),),\n+ 'DMCB': (((0, 'C3'), (0, 'N2'), (0, 'O31'), (0, 'O32')),),\n+ 'DECB': (((0, 'C4'), (0, 'N3'), (0, 'O41'), (0, 'O42')),),\n+ 'FORH': (((0, 'C'), (0, 'O2'), (0, 'O1'), (0, 'H')),),\n+ 'DMA': (((0, 'C'), (0, 'C1'), (0, 'N'), (0, 'O')),),\n+ 'DMF': (((0, 'C'), (0, 'N'), (0, 'O'), (0, 'HA')),),\n+ 'MRDN': (((0, 'C2'), (0, 'N3'), (0, 'S2'), (0, 'S1')), ((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'O4'))),\n+ 'MEOI': (((0, 'C7'), (0, 'C6'), (0, 'N8'), (0, 'O7')),),\n+ 'OIRD': (((0, 'C2'), (0, 'N3'), (0, 'S2'), (0, 'S1')), ((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'O4')), ((0, 'C7'), (0, 'C6'), (0, 'N8'), (0, 'O7'))),\n+ 'BAB2': (((0, 'C24'), (0, 'C23'), (0, 'N'), (0, 'O24')), ((0, 'CA'), (0, 'OA2'), (0, 'OA1'), (0, 'CC1')), ((0, 'CG'), (0, 'CC3'), (0, 'NT'), (0, 'OG'))),\n+ 'DMCA': (((0, 'C'), (0, 'O1'), (0, 'O2'), (0, 'O')),),\n+ 'DECA': (((0, 'C'), (0, 'O1'), (0, 'O2'), (0, 'O')),),\n+ 'URAC': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'O2')), ((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'O4'))),\n+ '2PYO': (((0, 'C2'), (0, 'C3'), (0, 'N1'), (0, 'O2')),),\n+ 'HDZ1B': (((0, 'C2'), (0, 'C1'), (0, 'N3'), (0, 'O2')), ((0, 'C5'), (0, 'C6G'), (0, 'N4'), (0, 'H5'))),\n+ 'PHMK': (((0, 'C2'), (0, 'C3'), (0, 'C1'), (0, 'O2')),),\n+ 'PHEK': (((0, 'C3'), (0, 'C4'), (0, 'C2'), (0, 'O3')),),\n+ 'BEON': (((0, 'C2'), (0, 'C3'), (0, 'C1'), (0, 'O2')),),\n+ 'AMDN': (((0, 'C1'), (0, 'N9'), (0, 'N6'), (0, 'C2')),),\n+ 'BAMI': (((0, 'C12'), (0, 'N16'), (0, 'N13'), (0, 'C11')),),\n+ 'PNTM': (((0, 'C24'), (0, 'N28'), (0, 'N25'), (0, 'C23')), ((0, 'C45'), (0, 'N49'), (0, 'N46'), (0, 'C44'))),\n+ 'MHYO': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'O2')), ((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'O4'))),\n+ 'OIHY': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'O2')), ((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'O4')), ((0, 'C7'), (0, 'C6'), (0, 'N8'), (0, 'O7'))),\n+ 'MOET': (((0, 'C2'), (0, 'C1'), (0, 'O3'), (0, 'H21')),),\n+ 'MOBU': (((0, 'C1'), (0, 'C2'), (0, 'O1'), (0, 'H11')),),\n+ 'MTDO': (((0, 'C2'), (0, 'N3'), (0, 'O2'), (0, 'S1')), ((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'O4'))),\n+ 'AMET': (((0, 'C4'), (0, 'C1'), (0, 'N6'), (0, 'H5')),),\n+ 'NIME': (((0, 'N2'), (0, 'O21'), (0, 'O22'), (0, 'C1')),),\n+ 'NIPR': (((0, 'N1'), (0, 'O11'), (0, 'O12'), (0, 'C1')),),\n+ 'AZDO': (((0, 'C2'), (0, 'C3'), (0, 'N1'), (0, 'O2')),),\n+ 'ZOIC': (((0, 'C7'), (0, 'C1'), (0, 'O7'), (0, 'O8')),),\n+ 'MBOA': (((0, 'C7'), (0, 'C1'), (0, 'O7'), (0, 'O8')),),\n+ 'YTHY': (((0, 'C8'), (0, 'C5'), (0, 'N9'), (0, 'O8')), ((0, 'C10'), (0, 'N9'), (0, 'N11'), (0, 'O10'))),\n+ 'RIN': (((0, 'C2'), (0, 'C3'), (0, 'O2'), (0, 'O1')),),\n+ 'YTS2': (((0, 'C8'), (0, 'C5'), (0, 'N9'), (0, 'S8')), ((0, 'C10'), (0, 'N9'), (0, 'N11'), (0, 'S10'))),\n+ 'YT4S': (((0, 'C8'), (0, 'C5'), (0, 'N9'), (0, 'O8')), ((0, 'C10'), (0, 'N11'), (0, 'N9'), (0, 'S10'))),\n+ 'YT2S': (((0, 'C8'), (0, 'C5'), (0, 'N9'), (0, 'S8')), ((0, 'C10'), (0, 'N9'), (0, 'N11'), (0, 'O10'))),\n+ 'TC243C': (((0, 'C8'), (0, 'C5'), (0, 'N9'), (0, 'O8')),),\n+ '4PYO': (((0, 'C1'), (0, 'C21'), (0, 'C22'), (0, 'O1')),),\n+ '1PH4PO': (((0, 'C4'), (0, 'C3'), (0, 'C5'), (0, 'O4')),),\n+ '21QU': (((0, 'C10'), (0, 'C9'), (0, 'N11'), (0, 'O10')),),\n+ '1PH2PO': (((0, 'C2'), (0, 'C3'), (0, 'N1'), (0, 'O2')),),\n+ '3PHURA': (((0, 'C2'), (0, 'C3'), (0, 'N1'), (0, 'O2')), ((0, 'C6'), (0, 'N5'), (0, 'N1'), (0, 'O6'))),\n+ 'URA2S': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'S2')), ((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'O4'))),\n+ '3PH2SR': (((0, 'C2'), (0, 'C3'), (0, 'N1'), (0, 'O2')), ((0, 'C6'), (0, 'N5'), (0, 'N1'), (0, 'S6'))),\n+ 'URA4S': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'O2')), ((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'S4'))),\n+ '3PH4SR': (((0, 'C2'), (0, 'C3'), (0, 'N1'), (0, 'S2')), ((0, 'C6'), (0, 'N5'), (0, 'N1'), (0, 'O6'))),\n+ 'URA24S': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'S2')), ((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'S4'))),\n+ '3PH24S': (((0, 'C2'), (0, 'C3'), (0, 'N1'), (0, 'S2')), ((0, 'C6'), (0, 'N5'), (0, 'N1'), (0, 'S6'))),\n+ '43HPY': (((0, 'C1'), (0, 'C6'), (0, 'N2'), (0, 'O1')),),\n+ '43PPY': (((0, 'C2'), (0, 'C3'), (0, 'N1'), (0, 'O2')),),\n+ '43HSPY': (((0, 'C1'), (0, 'C6'), (0, 'N2'), (0, 'S1')),),\n+ '43HSPP': (((0, 'C2'), (0, 'C3'), (0, 'N1'), (0, 'S2')),),\n+ '4O2SM': (((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'O4')),),\n+ 'NZAD': (((0, 'C9'), (0, 'C10'), (0, 'N8'), (0, 'O9')),),\n+ 'NACT': (((0, 'C'), (0, 'C3'), (0, 'N'), (0, 'O')),),\n+ 'CO31': (((0, 'C'), (0, 'O1'), (0, 'O2'), (0, 'O3')),),\n+ 'GBL': (((0, 'C2'), (0, 'C3'), (0, 'O2'), (0, 'O1')),),\n+ 'B2FO': (((0, 'C2'), (0, 'C3'), (0, 'O6'), (0, 'O1')),),\n+ 'A2FO': (((0, 'C2'), (0, 'C3'), (0, 'O6'), (0, 'O1')),),\n+ 'MT2A': (((0, 'C3'), (0, 'N5'), (0, 'N4'), (0, 'S2')),),\n+ 'DH3T': (((0, 'C2'), (0, 'N4'), (0, 'N3'), (0, 'S1')),),\n+ 'EEPI': (((0, 'C5'), (0, 'C6'), (0, 'N4'), (0, 'H51')),),\n+ 'PYO2B': (((0, 'C1'), (0, 'C2'), (0, 'N6'), (0, 'O7')),),\n+ 'PYO3B': (((0, 'C6'), (0, 'C5'), (0, 'N1'), (0, 'O7')),),\n+ 'PYO2F': (((0, 'C1'), (0, 'C2'), (0, 'N6'), (0, 'O7')),),\n+ 'PYO3F': (((0, 'C6'), (0, 'C5'), (0, 'N1'), (0, 'O7')),),\n+ 'BTMC': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'O2')), ((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'N4'))),\n+ 'BM6A': (((0, 'C6'), (0, 'C5'), (0, 'N1'), (0, 'N6')),),\n+ 'CBHH': (((0, 'C7'), (0, 'N3'), (0, 'N4'), (0, 'O9')), ((0, 'C8'), (0, 'N5'), (0, 'N6'), (0, 'O10'))),\n+ 'WEI1': (((0, 'C13'), (0, 'C6'), (0, 'N4'), (0, 'O3')),),\n+ 'WEI2': (((0, 'C14'), (0, 'N2'), (0, 'N3'), (0, 'O3')),),\n+ 'MSCH': (((0, 'C8'), (0, 'C9'), (0, 'N'), (0, 'O')),),\n+ 'WEI3': (((0, 'C8'), (0, 'C9'), (0, 'N1'), (0, 'O1')),),\n+ 'INCA': (((0, 'C9'), (0, 'C8'), (0, 'N3'), (0, 'O')),),\n+ 'TICA': (((0, 'C9'), (0, 'N1'), (0, 'N2'), (0, 'O')),),\n+ 'GTPG': (((0, 'N2'), (0, 'H22'), (0, 'H21'), (0, 'C2')), ((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'N2')), ((0, 'C6'), (0, 'C5'), (0, 'N1'), (0, 'O6'))),\n+ 'GTGN': (((0, 'N2'), (0, 'H22'), (0, 'H21'), (0, 'C2')), ((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'N2')), ((0, 'C6'), (0, 'C5'), (0, 'N1'), (0, 'O6'))),\n+ 'GTSS': (((0, 'N2'), (0, 'H22'), (0, 'H21'), (0, 'C2')), ((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'N2')), ((0, 'C6'), (0, 'C5'), (0, 'N1'), (0, 'O6'))),\n+ 'GTNS': (((0, 'N2'), (0, 'H22'), (0, 'H21'), (0, 'C2')), ((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'N2')), ((0, 'C6'), (0, 'C5'), (0, 'N1'), (0, 'O6'))),\n+ '2OXT': (((0, 'C2'), (0, 'C3'), (0, 'O2'), (0, 'O1')),),\n+ '3OXT': (((0, 'C3'), (0, 'C1'), (0, 'C2'), (0, 'O2')), ((0, 'C3'), (0, 'C2'), (0, 'C1'), (0, 'O2'))),\n+ 'PRF': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'N2')), ((0, 'C6'), (0, 'C5'), (0, 'N1'), (0, 'O6')), ((0, 'N2'), (0, 'H10'), (0, 'H9'), (0, 'C2'))),\n+ 'B2SU': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'S2')), ((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'O4'))),\n+ 'B4SU': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'O2')), ((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'S4'))),\n+ 'B52U': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'S2')), ((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'O4'))),\n+ 'BH2U': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'O2')), ((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'O4'))),\n+ 'BMDU': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'O2')), ((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'O4'))),\n+ 'B5HU': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'O2')), ((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'O4'))),\n+ 'BMOU': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'O2')), ((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'O4'))),\n+ 'B3MU': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'O2')), ((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'O4'))),\n+ 'BCYU': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'O2')), ((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'O4'))),\n+ 'BPSU': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'O2')), ((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'O4'))),\n+ 'B1MP': (((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'O4')), ((0, 'C2'), (0, 'N3'), (0, 'N1'), (0, 'O2'))),\n+ 'B3MP': (((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'O4')), ((0, 'C2'), (0, 'N3'), (0, 'N1'), (0, 'O2'))),\n+ 'BSAU': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'S2')), ((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'O4'))),\n+ 'B5AU': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'O2')), ((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'O4'))),\n+ 'BU8U': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'S2')), ((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'O4'))),\n+ 'BSEU': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'SE2')), ((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'O4'))),\n+ 'B5DU': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'O2')), ((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'O4')), ((0, 'C10'), (0, 'O11'), (0, 'O12'), (0, 'C9'))),\n+ 'BSCU': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'S2')), ((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'O4')), ((0, 'C10'), (0, 'O11'), (0, 'O12'), (0, 'C9'))),\n+ 'BIAU': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'O2')), ((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'O4'))),\n+ 'BISU': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'S2')), ((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'O4'))),\n+ 'B5CU': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'O2')), ((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'O4')), ((0, 'C8'), (0, 'O82'), (0, 'O81'), (0, 'C7'))),\n+ 'BOCU': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'O2')), ((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'O4')), ((0, 'C8'), (0, 'C7'), (0, 'O8'), (0, 'O9'))),\n+ 'B70U': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'S2')), ((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'O4')), ((0, 'C8'), (0, 'C5M'), (0, 'O8'), (0, 'O9'))),\n+ 'BBCU': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'O2')), ((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'O4')), ((0, 'C8'), (0, 'C7'), (0, 'N8'), (0, 'O8'))),\n+ 'BHCU': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'O2')), ((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'O4')), ((0, 'C8'), (0, 'O82'), (0, 'O81'), (0, 'C7'))),\n+ 'BCMU': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'O2')), ((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'O4')), ((0, 'C8'), (0, 'C7'), (0, 'O8'), (0, 'O9'))),\n+ 'BOAU': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'O2')), ((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'O4')), ((0, 'C9'), (0, 'O92'), (0, 'O91'), (0, 'C8'))),\n+ 'BOEU': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'O2')), ((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'O4')), ((0, 'C9'), (0, 'C8'), (0, 'O9'), (0, 'O10'))),\n+ 'B3AU': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'O2')), ((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'O4')), ((0, 'C13'), (0, 'O30'), (0, 'O31'), (0, 'C12'))),\n+ 'B13P': (((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'O4')), ((0, 'C2'), (0, 'N3'), (0, 'N1'), (0, 'O2')), ((0, 'C13'), (0, 'O31'), (0, 'O30'), (0, 'C12'))),\n+ 'B5TU': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'O2')), ((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'O4'))),\n+ 'BSTU': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'S2')), ((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'O4'))),\n+ 'BGAU': (((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'O4')),),\n+ 'BGCU': (((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'O4')), ((0, 'C10'), (0, 'O11'), (0, 'O12'), (0, 'C9'))),\n+ 'B2SC': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'S2')), ((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'N4')), ((0, 'N4'), (0, 'H41'), (0, 'H42'), (0, 'C4'))),\n+ 'B5MC': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'O2')), ((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'N4')), ((0, 'N4'), (0, 'H41'), (0, 'H42'), (0, 'C4'))),\n+ 'BHMC': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'O2')), ((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'N4')), ((0, 'N4'), (0, 'H41'), (0, 'H42'), (0, 'C4'))),\n+ 'B5FC': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'O2')), ((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'N4')), ((0, 'N4'), (0, 'H41'), (0, 'H42'), (0, 'C4')), ((0, 'C7'), (0, 'C5'), (0, 'O7'), (0, 'H7'))),\n+ 'B4MC': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'O2')), ((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'N4'))),\n+ 'B4AC': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'O2')), ((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'N4')), ((0, 'C7'), (0, 'C8'), (0, 'N4'), (0, 'O7'))),\n+ 'B3MC': (((0, 'C2'), (0, 'N3'), (0, 'N1'), (0, 'O2')), ((0, 'C4'), (0, 'N3'), (0, 'N4'), (0, 'C5')), ((0, 'N4'), (0, 'H41'), (0, 'H42'), (0, 'C4'))),\n+ 'B1PC': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'N2')), ((0, 'N2'), (0, 'H22'), (0, 'H21'), (0, 'C2')), ((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'O4'))),\n+ 'B3PC': (((0, 'C2'), (0, 'N3'), (0, 'N1'), (0, 'N2')), ((0, 'N2'), (0, 'H22'), (0, 'H21'), (0, 'C2')), ((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'O4'))),\n+ 'B6MA': (((0, 'C6'), (0, 'C5'), (0, 'N1'), (0, 'N6')),),\n+ 'B2MA': (((0, 'N6'), (0, 'H61'), (0, 'H62'), (0, 'C6')), ((0, 'C6'), (0, 'C5'), (0, 'N1'), (0, 'N6'))),\n+ 'B8MA': (((0, 'N6'), (0, 'H61'), (0, 'H62'), (0, 'C6')), ((0, 'C6'), (0, 'C5'), (0, 'N1'), (0, 'N6'))),\n+ 'BINO': (((0, 'C6'), (0, 'C5'), (0, 'N1'), (0, 'O6')),),\n+ 'B1MI': (((0, 'C6'), (0, 'C5'), (0, 'N1'), (0, 'O6')),),\n+ 'BSMA': (((0, 'C6'), (0, 'C5'), (0, 'N1'), (0, 'N6')),),\n+ 'B6AA': (((0, 'C10'), (0, 'C11'), (0, 'N6'), (0, 'O10')), ((0, 'C6'), (0, 'C5'), (0, 'N1'), (0, 'N6'))),\n+ 'B1MA': (((0, 'C6'), (0, 'N1'), (0, 'N6'), (0, 'C5')), ((0, 'N6'), (0, 'H62'), (0, 'H61'), (0, 'C6'))),\n+ 'B6IA': (((0, 'C6'), (0, 'C5'), (0, 'N1'), (0, 'N6')),),\n+ 'BHIA': (((0, 'C6'), (0, 'C5'), (0, 'N1'), (0, 'N6')),),\n+ 'BMIA': (((0, 'C6'), (0, 'C5'), (0, 'N1'), (0, 'N6')),),\n+ 'BSIA': (((0, 'C6'), (0, 'C5'), (0, 'N1'), (0, 'N6')),),\n+ 'BHNA': (((0, 'C10'), (0, 'N6'), (0, 'N11'), (0, 'O10')), ((0, 'C13'), (0, 'ODB'), (0, 'ODA'), (0, 'C12')), ((0, 'C6'), (0, 'C5'), (0, 'N1'), (0, 'N6'))),\n+ 'B26A': (((0, 'C10'), (0, 'N6'), (0, 'N11'), (0, 'O10')), ((0, 'C13'), (0, 'ODB'), (0, 'ODA'), (0, 'C12')), ((0, 'C6'), (0, 'C5'), (0, 'N1'), (0, 'N6'))),\n+ 'B66A': (((0, 'C10'), (0, 'N6'), (0, 'N11'), (0, 'O10')), ((0, 'C13'), (0, 'ODB'), (0, 'ODA'), (0, 'C12')), ((0, 'C6'), (0, 'C5'), (0, 'N1'), (0, 'N6'))),\n+ 'BT6A': (((0, 'C10'), (0, 'N6'), (0, 'N11'), (0, 'O10')), ((0, 'C13'), (0, 'ODB'), (0, 'ODA'), (0, 'C12')), ((0, 'C6'), (0, 'C5'), (0, 'N1'), (0, 'N6'))),\n+ 'B12A': (((0, 'C10'), (0, 'N6'), (0, 'N11'), (0, 'O10')), ((0, 'C13'), (0, 'ODB'), (0, 'ODA'), (0, 'C12')), ((0, 'C6'), (0, 'C5'), (0, 'N1'), (0, 'N6'))),\n+ 'B6GA': (((0, 'C10'), (0, 'N6'), (0, 'N11'), (0, 'O10')), ((0, 'C13'), (0, 'ODB'), (0, 'ODA'), (0, 'C12')), ((0, 'C6'), (0, 'C5'), (0, 'N1'), (0, 'N6'))),\n+ 'B1MG': (((0, 'C6'), (0, 'C5'), (0, 'N1'), (0, 'O6')), ((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'N2')), ((0, 'N2'), (0, 'H22'), (0, 'H21'), (0, 'C2'))),\n+ 'B2MG': (((0, 'C6'), (0, 'C5'), (0, 'N1'), (0, 'O6')), ((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'N2'))),\n+ 'B7MG': (((0, 'C6'), (0, 'C5'), (0, 'N1'), (0, 'O6')), ((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'N2')), ((0, 'N2'), (0, 'H22'), (0, 'H21'), (0, 'C2'))),\n+ 'B27G': (((0, 'C6'), (0, 'C5'), (0, 'N1'), (0, 'O6')), ((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'N2'))),\n+ 'BDCG': (((0, 'C6'), (0, 'C5'), (0, 'N1'), (0, 'O6')), ((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'N2')), ((0, 'N2'), (0, 'H22'), (0, 'H21'), (0, 'C2'))),\n+ 'BRCG': (((0, 'C6'), (0, 'C5'), (0, 'N1'), (0, 'O6')), ((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'N2')), ((0, 'N2'), (0, 'H22'), (0, 'H21'), (0, 'C2')), ((0, 'C10'), (0, 'N12'), (0, 'N11'), (0, 'C7'))),\n+ 'BDAG': (((0, 'C6'), (0, 'C5'), (0, 'N1'), (0, 'O6')), ((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'N2')), ((0, 'N2'), (0, 'H22'), (0, 'H21'), (0, 'C2'))),\n+ 'BQUG': (((0, 'C6'), (0, 'C5'), (0, 'N1'), (0, 'O6')), ((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'N2')), ((0, 'N2'), (0, 'H22'), (0, 'H21'), (0, 'C2'))),\n+ 'BEQG': (((0, 'C6'), (0, 'C5'), (0, 'N1'), (0, 'O6')), ((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'N2')), ((0, 'N2'), (0, 'H22'), (0, 'H21'), (0, 'C2'))),\n+ 'BDWG': (((0, 'C6'), (0, 'C5'), (0, 'N1'), (0, 'O6')),),\n+ 'BIMG': (((0, 'C6'), (0, 'C5'), (0, 'N1'), (0, 'O6')),),\n+ 'BIWG': (((0, 'C6'), (0, 'C5'), (0, 'N1'), (0, 'O6')),),\n+ 'BMWG': (((0, 'C6'), (0, 'C5'), (0, 'N1'), (0, 'O6')),),\n+ 'BYYG': (((0, 'C6'), (0, 'C5'), (0, 'N1'), (0, 'O6')), ((0, 'C16'), (0, 'C15'), (0, 'O17'), (0, 'O18')), ((0, 'C21'), (0, 'N20'), (0, 'O22'), (0, 'O23'))),\n+ 'BHWG': (((0, 'C6'), (0, 'C5'), (0, 'N1'), (0, 'O6')), ((0, 'C16'), (0, 'C15'), (0, 'O17'), (0, 'O18')), ((0, 'C21'), (0, 'N20'), (0, 'O22'), (0, 'O23'))),\n+ 'BPBG': (((0, 'C6'), (0, 'C5'), (0, 'N1'), (0, 'O6')), ((0, 'C17'), (0, 'C16'), (0, 'O17'), (0, 'O18')), ((0, 'C21'), (0, 'N20'), (0, 'O22'), (0, 'O23'))),\n+ 'BBUG': (((0, 'C6'), (0, 'C5'), (0, 'N1'), (0, 'O6')), ((0, 'C17'), (0, 'O17'), (0, 'O18'), (0, 'C15'))),\n+ '7MIP': (((0, 'C10'), (0, 'N12'), (0, 'N11'), (0, 'C7')),),\n+ 'M6PA': (((0, 'C6'), (0, 'C5'), (0, 'N1'), (0, 'N6')), ((0, 'C10'), (0, 'C11'), (0, 'N6'), (0, 'O10'))),\n+ 'MOAC': (((0, 'C8'), (0, 'C7'), (0, 'O8'), (0, 'O9')),),\n+ '5FOP': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'O2')), ((0, 'C7'), (0, 'C5'), (0, 'O7'), (0, 'H7'))),\n+ 'PESU': (((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'O4')),),\n+ 'CMBZ': (((0, 'C8'), (0, 'C7'), (0, 'O8'), (0, 'O9')),),\n+ 'PRNC': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'N2')), ((0, 'C4'), (0, 'C5'), (0, 'N4'), (0, 'N3'))),\n+ 'BZHA': (((0, 'C8'), (0, 'O82'), (0, 'O81'), (0, 'C7')),),\n+ 'MOAT': (((0, 'C8'), (0, 'O82'), (0, 'O81'), (0, 'C7')),),\n+ 'MOAE': (((0, 'C8'), (0, 'C7'), (0, 'O8'), (0, 'O9')),),\n+ 'MPYU': (((0, 'C7'), (0, 'N8'), (0, 'N6'), (0, 'O7')),),\n+ 'HPAT': (((0, 'C8'), (0, 'O82'), (0, 'O81'), (0, 'C7')),),\n+ 'BZAC': (((0, 'C8'), (0, 'O81'), (0, 'O82'), (0, 'C7')),),\n+ '3PRU': (((0, 'C2'), (0, 'N3'), (0, 'N1'), (0, 'O2')), ((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'O4'))),\n+ 'PMMU': (((0, 'C7'), (0, 'N6'), (0, 'N8'), (0, 'O7')),),\n+ 'BZAA': (((0, 'C8'), (0, 'C7'), (0, 'O8'), (0, 'O9')),),\n+ '12MU': (((0, 'C'), (0, 'N1'), (0, 'N2'), (0, 'O')),),\n+ 'HPME': (((0, 'C8'), (0, 'C7'), (0, 'O8'), (0, 'O9')),),\n+ 'OEBZ': (((0, 'C8'), (0, 'C7'), (0, 'O8'), (0, 'O9')),),\n+ 'ATBZ': (((0, 'C8'), (0, 'O82'), (0, 'O81'), (0, 'C7')),),\n+ 'PYMU': (((0, 'C7'), (0, 'N8'), (0, 'N6'), (0, 'O7')),),\n+ 'ACBZ': (((0, 'C8'), (0, 'C7'), (0, 'N8'), (0, 'O8')),),\n+ 'NMGN': (((0, 'C4'), (0, 'C3'), (0, 'O4'), (0, 'O5')),),\n+ 'NMCY': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'N2')), ((0, 'C4'), (0, 'C5'), (0, 'N4'), (0, 'N3'))),\n+ 'MMMU': (((0, 'C'), (0, 'N2'), (0, 'N1'), (0, 'O')),),\n+ 'NMGI': (((0, 'C10'), (0, 'O102'), (0, 'O101'), (0, 'C9')),),\n+ 'MEBZ': (((0, 'C8'), (0, 'C7'), (0, 'O8'), (0, 'O9')),),\n+ 'AMBA': (((0, 'C9'), (0, 'N8'), (0, 'O9'), (0, 'H9')), ((0, 'C10'), (0, 'C7'), (0, 'O10'), (0, 'H10'))),\n+ 'NCYP': (((0, 'C2'), (0, 'N1'), (0, 'N2'), (0, 'N3')), ((0, 'C4'), (0, 'C5'), (0, 'N4'), (0, 'N3'))),\n+ 'PNCP': (((0, 'C2'), (0, 'N1'), (0, 'N2'), (0, 'N3')), ((0, 'C4'), (0, 'C5'), (0, 'N4'), (0, 'N3'))),\n+ 'BK2C': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'N2')), ((0, 'C4'), (0, 'C5'), (0, 'N4'), (0, 'N3')), ((0, 'C13'), (0, 'O31'), (0, 'O30'), (0, 'C12'))),\n+ 'BR2C': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'N2')), ((0, 'C4'), (0, 'C5'), (0, 'N4'), (0, 'N3')), ((0, 'CZ'), (0, 'NE'), (0, 'NH1'), (0, 'NH2'))),\n+ 'BM2G': (((0, 'C6'), (0, 'C5'), (0, 'N1'), (0, 'O6')), ((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'N2'))),\n+ 'BN2G': (((0, 'C6'), (0, 'C5'), (0, 'N1'), (0, 'O6')), ((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'N2'))),\n+ 'FLMO': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'O2')), ((0, 'C4'), (0, 'C4A'), (0, 'N3'), (0, 'O4'))),\n+ 'FLMR': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'O2')), ((0, 'C4'), (0, 'C4A'), (0, 'N3'), (0, 'O4'))),\n+ 'FLVO': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'O2')), ((0, 'C4'), (0, 'C4A'), (0, 'N3'), (0, 'O4'))),\n+ 'FLVR': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'O2')), ((0, 'C4'), (0, 'C4A'), (0, 'N3'), (0, 'O4'))),\n+ 'RFVO': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'O2')), ((0, 'C4'), (0, 'C4A'), (0, 'N3'), (0, 'O4'))),\n+ 'RFVR': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'O2')), ((0, 'C4'), (0, 'C4A'), (0, 'N3'), (0, 'O4'))),\n+ 'FMNO': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'O2')), ((0, 'C4'), (0, 'C4A'), (0, 'N3'), (0, 'O4'))),\n+ 'FMNR': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'O2')), ((0, 'C4'), (0, 'C4A'), (0, 'N3'), (0, 'O4'))),\n+ 'FAD': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'O2')), ((0, 'C4'), (0, 'C4X'), (0, 'N3'), (0, 'O4')), ((0, 'N6A'), (0, 'H62'), (0, 'H61'), (0, 'C6A'))),\n+ 'FADR': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'O2')), ((0, 'C4'), (0, 'C4X'), (0, 'N3'), (0, 'O4')), ((0, 'N6A'), (0, 'H62'), (0, 'H61'), (0, 'C6A'))),\n+ 'ABMB': (((0, 'C12'), (0, 'C1'), (0, 'N1'), (0, 'O')),),\n+ 'ABEB': (((0, 'C12'), (0, 'C2'), (0, 'N1'), (0, 'O')),),\n+ 'ABBM': (((0, 'C12'), (0, 'C2'), (0, 'N1'), (0, 'O')),),\n+ 'ABNB': (((0, 'C12'), (0, 'C2'), (0, 'N1'), (0, 'O')),),\n+ 'ABSB': (((0, 'C12'), (0, 'C2'), (0, 'N1'), (0, 'O')), ((0, 'C1'), (0, 'N1'), (0, 'N2'), (0, 'S')), ((0, 'C3'), (0, 'C2'), (0, 'N2'), (0, 'HC3'))),\n+ 'ASBB': (((0, 'C16'), (0, 'C17'), (0, 'O34'), (0, 'S15')),),\n+ 'SM002': (((0, 'CG'), (0, 'OD2'), (0, 'OD1'), (0, 'CB')),),\n+ 'SM005': (((0, 'CE'), (0, 'CZ'), (0, 'CD'), (0, 'OE')), ((0, 'CZ'), (0, 'OZ1'), (0, 'OZ2'), (0, 'CE'))),\n+ 'SM011': (((0, 'CZ1'), (0, 'OJ2'), (0, 'OJ1'), (0, 'CE')),),\n+ 'SM013': (((0, 'CD'), (0, 'OE1'), (0, 'OE2'), (0, 'CG')),),\n+ 'SM016': (((0, 'CL3'), (0, 'CM'), (0, 'NN'), (0, 'ON')),),\n+ 'SM018': (((0, 'NZ1'), (0, 'HZ12'), (0, 'HZ11'), (0, 'CE3')),),\n+ 'SM019': (((0, 'CJ'), (0, 'OJ2'), (0, 'OJ1'), (0, 'CI')),),\n+ 'SM021': (((0, 'CZ'), (0, 'OH2'), (0, 'OH1'), (0, 'CE')),),\n+ 'SM022': (((0, 'C2'), (0, 'C1'), (0, 'N3'), (0, 'O7')), ((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'O8'))),\n+ 'SM025': (((0, 'CZ'), (0, 'NH1'), (0, 'NE1'), (0, 'NH2')),),\n+ 'SM027': (((0, 'CG'), (0, 'CB'), (0, 'ND2'), (0, 'OD1')),),\n+ 'SM030': (((0, 'CZ'), (0, 'NH1'), (0, 'NH2'), (0, 'NE')),),\n+ 'SM031': (((0, 'CG'), (0, 'CB'), (0, 'OD2'), (0, 'OD1')), ((0, 'C1'), (0, 'O1'), (0, 'O2'), (0, 'C2'))),\n+ 'SM038': (((0, 'CG'), (0, 'OD2'), (0, 'OD1'), (0, 'CB')),),\n+ 'SM040': (((0, 'C1'), (0, 'N3'), (0, 'O2'), (0, 'OG')),),\n+ 'SM041': (((0, 'C3'), (0, 'CA3'), (0, 'O3'), (0, 'H3')),),\n+ 'SM043': (((0, 'CE'), (0, 'OZ1'), (0, 'OZ2'), (0, 'CD')),),\n+ 'SM044': (((0, 'CD1'), (0, 'OE12'), (0, 'OE11'), (0, 'CG')), ((0, 'CD2'), (0, 'CG'), (0, 'OE21'), (0, 'OE22'))),\n+ 'SM045': (((0, 'CD1'), (0, 'OE12'), (0, 'OE11'), (0, 'CG')), ((0, 'CD2'), (0, 'OE21'), (0, 'OE22'), (0, 'CG'))),\n+ 'SM046': (((0, 'CE1'), (0, 'OZ3'), (0, 'OZ2'), (0, 'CD1')),),\n+ 'SM047': (((0, 'CZ'), (0, 'NE'), (0, 'NH'), (0, 'OH')),),\n+ 'SM049': (((0, 'C1'), (0, 'O2'), (0, 'O1'), (0, 'C2')), ((0, 'C4'), (0, 'O5'), (0, 'O4'), (0, 'C3'))),\n+ 'SM050': (((0, 'C1'), (0, 'C2'), (0, 'C4'), (0, 'O3')),),\n+ 'SM051': (((0, 'CE'), (0, 'CD'), (0, 'CZ'), (0, 'OE')),),\n+ 'SM057': (((0, 'C2'), (0, 'C1'), (0, 'C3'), (0, 'O1')),),\n+ 'SM058': (((0, 'CL'), (0, 'CAL'), (0, 'NL'), (0, 'OL')),),\n+ 'SM060': (((0, 'CD1'), (0, 'CG1'), (0, 'OE2'), (0, 'SG')),),\n+ 'SM061': (((0, 'C1'), (0, 'O2'), (0, 'O1'), (0, 'CA1')),),\n+ 'SM064': (((0, 'CD2'), (0, 'C1'), (0, 'NG'), (0, 'OD2')),),\n+ 'SM068': (((0, 'CBI'), (0, 'CBW'), (0, 'NAD'), (0, 'OAG')),),\n+ 'SM072': (((0, 'C2'), (0, 'CA2'), (0, 'N3'), (0, 'O2')),),\n+ 'SM075': (((0, 'CD'), (0, 'OE2'), (0, 'OE1'), (0, 'CG')),),\n+ 'SM077': (((0, 'CZ'), (0, 'NE'), (0, 'OH'), (0, 'HZ')),),\n+ 'SM084': (((0, 'C6'), (0, 'C7'), (0, 'N2'), (0, 'S1')),),\n+ 'SM085': (((0, 'C6'), (0, 'C7'), (0, 'N2'), (0, 'S1')),),\n+ 'SM086': (((0, 'CZ'), (0, 'NH2'), (0, 'NH1'), (0, 'NE')),),\n+ 'SM087': (((0, 'CD'), (0, 'CG'), (0, 'NE2'), (0, 'OE1')),),\n+ 'SM088': (((0, 'CD'), (0, 'CG'), (0, 'NE2'), (0, 'OE1')),),\n+ 'SM092': (((0, 'NH'), (0, 'HH2'), (0, 'HH1'), (0, 'CZ')),),\n+ 'SM098': (((0, 'C4A'), (0, 'C4'), (0, 'NZ'), (0, 'H4A')),),\n+ 'SM099': (((0, 'C7'), (0, 'C3'), (0, 'O7'), (0, 'SG')),),\n+ 'SM100': (((0, 'CH'), (0, 'CX'), (0, 'NZ'), (0, 'OH')),),\n+ 'SM101': (((0, 'CX'), (0, 'OQ1'), (0, 'OQ2'), (0, 'NZ')),),\n+ 'SM102': (((0, 'CX1'), (0, 'CX2'), (0, 'C1'), (0, 'NZ')), ((0, 'CX2'), (0, 'O2'), (0, 'O1'), (0, 'CX1'))),\n+ 'SM103': (((0, 'CG'), (0, 'CD'), (0, 'CB'), (0, 'OG')), ((0, 'NE2'), (0, 'HE22'), (0, 'HE21'), (0, 'CE2'))),\n+ 'SM106': (((0, 'CD2'), (0, 'CG'), (0, 'OE'), (0, 'HD2')),),\n+ 'SM108': (((0, 'C4P'), (0, 'C4'), (0, 'NZ'), (0, 'H4P')),),\n+ 'SM109': (((0, 'CD'), (0, 'OE2'), (0, 'OE1'), (0, 'CG1')),),\n+ 'SM110': (((0, 'CG1'), (0, 'CB'), (0, 'OG1'), (0, 'HG11')),),\n+ 'SM111': (((0, 'C23'), (0, 'C21'), (0, 'NZ'), (0, 'O33')),),\n+ 'SM116': (((0, 'CX1'), (0, 'CX2'), (0, 'C1'), (0, 'NZ')), ((0, 'CX2'), (0, 'O2'), (0, 'O1'), (0, 'CX1'))),\n+ 'SM117': (((0, 'CAK'), (0, 'CAG'), (0, 'OAC'), (0, 'SAI')), ((0, 'CAJ'), (0, 'OAB'), (0, 'OAE'), (0, 'CAG'))),\n+ 'SM118': (((0, 'C2'), (0, 'CA2'), (0, 'N3'), (0, 'O2')),),\n+ 'SM127': (((0, 'CLP'), (0, 'CL'), (0, 'N1'), (0, 'OL')), ((0, 'CA1'), (0, 'C1'), (0, 'CB1'), (0, 'N1')), ((0, 'C2'), (0, 'CA2'), (0, 'N3'), (0, 'O2'))),\n+ 'SM128': (((0, 'C2'), (0, 'CA2'), (0, 'N3'), (0, 'O2')),),\n+ 'SM132': (((0, 'CF'), (0, 'CZ'), (0, 'CJ'), (0, 'OF')),),\n+ 'SM134': (((0, 'CG'), (0, 'CB'), (0, 'OD2'), (0, 'OD1')),),\n+ 'SM135': (((0, 'CG'), (0, 'CB'), (0, 'OD2'), (0, 'OD1')),),\n+ 'SM137': (((0, 'CAD'), (0, 'OAE'), (0, 'OAF'), (0, 'CAC')),),\n+ 'SM143': (((0, 'CD'), (0, 'NE2'), (0, 'OE1'), (0, 'SG')),),\n+ 'SM144': (((0, 'C10'), (0, 'O10'), (0, 'O9'), (0, 'C8')),),\n+ 'SM169': (((0, 'CZ'), (0, 'NE'), (0, 'NH'), (0, 'SZ')),),\n+ 'SM172': (((0, 'C2'), (0, 'C1'), (0, 'C3'), (0, 'O2')), ((0, 'C5'), (0, 'C4'), (0, 'C6'), (0, 'O5'))),\n+ 'SM173': (((0, 'C2'), (0, 'C1'), (0, 'C3'), (0, 'O2')), ((0, 'C5'), (0, 'C4'), (0, 'C6'), (0, 'O5'))),\n+ 'SM174': (((0, 'CZ2'), (0, 'CH2'), (0, 'CE2'), (0, 'O2')), ((0, 'CH2'), (0, 'CZ3'), (0, 'CZ2'), (0, 'N2'))),\n+ 'SM176': (((0, 'CZ2'), (0, 'CH2'), (0, 'CE2'), (0, 'O7')), ((0, 'CH2'), (0, 'CZ3'), (0, 'CZ2'), (0, 'O6'))),\n+ 'SM179': (((0, 'N2'), (0, 'H22'), (0, 'H21'), (0, 'CH2')),),\n+ 'SM180': (((0, 'NE1'), (0, 'HE11'), (0, 'HE12'), (0, 'CE1')),),\n+ 'SM181': (((0, 'NE2'), (0, 'HE21'), (0, 'HE22'), (0, 'CE2')),),\n+ 'SM185': (((0, 'CE'), (0, 'CD'), (0, 'NZ2'), (0, 'OZ1')),),\n+ 'SM187': (((0, 'C1'), (0, 'O2'), (0, 'O1'), (0, 'C2')),),\n+ 'SM189': (((0, 'CZ'), (0, 'NH1'), (0, 'NE'), (0, 'NH2')),),\n+ 'SM194': (((0, 'CH'), (0, 'CX'), (0, 'NZ'), (0, 'OH')),),\n+ 'SM199': (((0, 'CG'), (0, 'CB'), (0, 'OD2'), (0, 'OD1')), ((0, 'C1'), (0, 'O2'), (0, 'O1'), (0, 'C2'))),\n+ 'SM213': (((0, 'CLP'), (0, 'CL'), (0, 'N'), (0, 'OL')), ((0, 'CA'), (0, 'CB'), (0, 'C'), (0, 'N')), ((0, 'CG'), (0, 'CB'), (0, 'OD1'), (0, 'OD2')), ((0, 'C'), (0, 'CA'), (0, 'NR'), (0, 'O'))),\n+ 'SM214': (((0, 'C2'), (0, 'C1'), (0, 'C3'), (0, 'O2')), ((0, 'C5'), (0, 'C4'), (0, 'C6'), (0, 'O5'))),\n+ 'SM215': (((0, 'C2'), (0, 'CA2'), (0, 'N3'), (0, 'O2')), ((0, 'C3'), (0, 'CA3'), (0, 'N2AL'), (0, 'O3'))),\n+ 'SM216': (((0, 'C2'), (0, 'CA2'), (0, 'N3'), (0, 'O2')),),\n+ 'SM218': (((0, 'C11'), (0, 'C1AL'), (0, 'N1'), (0, 'O11')), ((0, 'C2'), (0, 'CA2'), (0, 'N3'), (0, 'O2')), ((0, 'C1'), (0, 'CA1'), (0, 'N2'), (0, 'N3'))),\n+ 'SM221': (((0, 'CD1'), (0, 'CG1'), (0, 'OE2'), (0, 'SG')),),\n+ 'SM224': (((0, 'C11'), (0, 'C1AL'), (0, 'N1'), (0, 'O11')), ((0, 'CY'), (0, 'CAY'), (0, 'N1AL'), (0, 'OY'))),\n+ 'SM227': (((0, 'CLP'), (0, 'CL'), (0, 'N'), (0, 'OL')), ((0, 'C'), (0, 'CA'), (0, 'NR'), (0, 'O'))),\n+ 'SM233': (((0, 'C3'), (0, 'CA3'), (0, 'N2AL'), (0, 'O3')),),\n+ 'SM234': (((0, 'CJ'), (0, 'OJ1'), (0, 'OJ2'), (0, 'CI')),),\n+ 'SM237': (((0, 'C11'), (0, 'C1AL'), (0, 'N'), (0, 'O11')), ((0, 'C'), (0, 'CA'), (0, 'N2AL'), (0, 'O'))),\n+ 'SM238': (((0, 'C11'), (0, 'C1AL'), (0, 'N'), (0, 'O11')), ((0, 'C'), (0, 'CA'), (0, 'N2AL'), (0, 'O'))),\n+ 'SM239': (((0, 'C11'), (0, 'C1AL'), (0, 'N'), (0, 'O11')), ((0, 'C'), (0, 'CA'), (0, 'N2AL'), (0, 'O'))),\n+ 'SM240': (((0, 'C11'), (0, 'C1AL'), (0, 'N'), (0, 'O11')), ((0, 'C'), (0, 'CA'), (0, 'N2AL'), (0, 'S'))),\n+ 'SM241': (((0, 'C11'), (0, 'C1AL'), (0, 'N'), (0, 'O11')), ((0, 'C'), (0, 'CA'), (0, 'N2AL'), (0, 'O'))),\n+ 'SM242': (((0, 'CLP'), (0, 'CL'), (0, 'N1'), (0, 'OL')), ((0, 'CA1'), (0, 'CB1'), (0, 'C1'), (0, 'N1'))),\n+ 'MGU3': (((0, 'C'), (0, 'N2'), (0, 'N1'), (0, 'N3')), ((0, 'N2'), (0, 'H21'), (0, 'H22'), (0, 'C'))),\n+ 'PGUN': (((0, 'CZ'), (0, 'NH1'), (0, 'NH2'), (0, 'NE')), ((0, 'NH1'), (0, 'HH11'), (0, 'HH12'), (0, 'CZ')), ((0, 'NH2'), (0, 'HH21'), (0, 'HH22'), (0, 'CZ'))),\n+ 'MGUN': (((0, 'CZ'), (0, 'NH1'), (0, 'NH2'), (0, 'NE')), ((0, 'NH1'), (0, 'HH11'), (0, 'HH12'), (0, 'CZ')), ((0, 'NH2'), (0, 'HH21'), (0, 'HH22'), (0, 'CZ'))),\n+ 'ALDD': (((0, 'CLP'), (0, 'CL'), (0, 'NL'), (0, 'OL')), ((0, 'NL'), (0, 'CLP'), (0, 'CA'), (0, 'HL')), ((0, 'CRP'), (0, 'CA'), (0, 'NR'), (0, 'OR')), ((0, 'NR'), (0, 'CRP'), (0, 'CR'), (0, 'HR'))),\n+ 'DALA': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'DARG': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O')), ((0, 'CZ'), (0, 'NH1'), (0, 'NH2'), (0, 'NE')), ((0, 'NH1'), (0, 'HH11'), (0, 'HH12'), (0, 'CZ')), ((0, 'NH2'), (0, 'HH21'), (0, 'HH22'), (0, 'CZ'))),\n+ 'DASN': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O')), ((0, 'CG'), (0, 'ND2'), (0, 'CB'), (0, 'OD1')), ((0, 'CG'), (0, 'CB'), (0, 'ND2'), (0, 'OD1')), ((0, 'ND2'), (0, 'CG'), (0, 'HD21'), (0, 'HD22')), ((0, 'ND2'), (0, 'CG'), (0, 'HD22'), (0, 'HD21'))),\n+ 'DASP': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O')), ((0, 'CG'), (0, 'CB'), (0, 'OD2'), (0, 'OD1'))),\n+ 'DCYS': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'DGLN': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O')), ((0, 'CD'), (0, 'NE2'), (0, 'CG'), (0, 'OE1')), ((0, 'CD'), (0, 'CG'), (0, 'NE2'), (0, 'OE1')), ((0, 'NE2'), (0, 'CD'), (0, 'HE21'), (0, 'HE22')), ((0, 'NE2'), (0, 'CD'), (0, 'HE22'), (0, 'HE21'))),\n+ 'DGLU': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O')), ((0, 'CD'), (0, 'CG'), (0, 'OE2'), (0, 'OE1'))),\n+ 'DGLY': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'DHSD': (((0, 'ND1'), (0, 'CG'), (0, 'CE1'), (0, 'HD1')), ((0, 'CD2'), (0, 'CG'), (0, 'NE2'), (0, 'HD2')), ((0, 'CE1'), (0, 'ND1'), (0, 'NE2'), (0, 'HE1')), ((0, 'ND1'), (0, 'CE1'), (0, 'CG'), (0, 'HD1')), ((0, 'CD2'), (0, 'NE2'), (0, 'CG'), (0, 'HD2')), ((0, 'CE1'), (0, 'NE2'), (0, 'ND1'), (0, 'HE1')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'DHSE': (((0, 'NE2'), (0, 'CD2'), (0, 'CE1'), (0, 'HE2')), ((0, 'CD2'), (0, 'CG'), (0, 'NE2'), (0, 'HD2')), ((0, 'CE1'), (0, 'ND1'), (0, 'NE2'), (0, 'HE1')), ((0, 'NE2'), (0, 'CE1'), (0, 'CD2'), (0, 'HE2')), ((0, 'CD2'), (0, 'NE2'), (0, 'CG'), (0, 'HD2')), ((0, 'CE1'), (0, 'NE2'), (0, 'ND1'), (0, 'HE1')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'DHSP': (((0, 'ND1'), (0, 'CG'), (0, 'CE1'), (0, 'HD1')), ((0, 'ND1'), (0, 'CE1'), (0, 'CG'), (0, 'HD1')), ((0, 'NE2'), (0, 'CD2'), (0, 'CE1'), (0, 'HE2')), ((0, 'NE2'), (0, 'CE1'), (0, 'CD2'), (0, 'HE2')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'DILE': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'DLEU': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'DLYS': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'DMET': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'DPHE': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'DPRO': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'CD')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'DSER': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'DTHR': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'DTRP': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'DTYR': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'DVAL': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'LYR': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'HEME': (((0, 'C2A'), (0, 'C1A'), (0, 'C3A'), (0, 'CAA')), ((0, 'C3A'), (0, 'C2A'), (0, 'C4A'), (0, 'CMA')), ((0, 'C2B'), (0, 'C1B'), (0, 'C3B'), (0, 'CMB')), ((0, 'C3B'), (0, 'C2B'), (0, 'C4B'), (0, 'CAB')), ((0, 'C2C'), (0, 'C1C'), (0, 'C3C'), (0, 'CMC')), ((0, 'C3C'), (0, 'C2C'), (0, 'C4C'), (0, 'CAC')), ((0, 'C2D'), (0, 'C1D'), (0, 'C3D'), (0, 'CMD')), ((0, 'C3D'), (0, 'C2D'), (0, 'C4D'), (0, 'CAD')), ((0, 'CGA'), (0, 'CBA'), (0, 'O2A'), (0, 'O1A')), ((0, 'CGD'), (0, 'CBD'), (0, 'O2D'), (0, 'O1D')), ((0, 'C4A'), (0, 'NA'), (0, 'C1A'), (0, 'C2A')), ((0, 'C1A'), (0, 'NA'), (0, 'C4A'), (0, 'C3A')), ((0, 'C4B'), (0, 'NB'), (0, 'C1B'), (0, 'C2B')), ((0, 'C1B'), (0, 'NB'), (0, 'C4B'), (0, 'C3B')), ((0, 'C4C'), (0, 'NC'), (0, 'C1C'), (0, 'C2C')), ((0, 'C1C'), (0, 'NC'), (0, 'C4C'), (0, 'C3C')), ((0, 'C4D'), (0, 'ND'), (0, 'C1D'), (0, 'C2D')), ((0, 'C1D'), (0, 'ND'), (0, 'C4D'), (0, 'C3D')), ((0, 'NA'), (0, 'C1A'), (0, 'C2A'), (0, 'C3A')), ((0, 'NA'), (0, 'C4A'), (0, 'C3A'), (0, 'C2A')), ((0, 'NB'), (0, 'C1B'), (0, 'C2B'), (0, 'C3B')), ((0, 'NB'), (0, 'C4B'), (0, 'C3B'), (0, 'C2B')), ((0, 'NC'), (0, 'C1C'), (0, 'C2C'), (0, 'C3C')), ((0, 'NC'), (0, 'C4C'), (0, 'C3C'), (0, 'C2C')), ((0, 'ND'), (0, 'C1D'), (0, 'C2D'), (0, 'C3D')), ((0, 'ND'), (0, 'C4D'), (0, 'C3D'), (0, 'C2D')), ((0, 'NA'), (0, 'C1A'), (0, 'CHA'), (0, 'C4D')), ((0, 'NA'), (0, 'C4A'), (0, 'CHB'), (0, 'C1B')), ((0, 'NB'), (0, 'C1B'), (0, 'CHB'), (0, 'C4A')), ((0, 'NB'), (0, 'C4B'), (0, 'CHC'), (0, 'C1C')), ((0, 'NC'), (0, 'C1C'), (0, 'CHC'), (0, 'C4B')), ((0, 'NC'), (0, 'C4C'), (0, 'CHD'), (0, 'C1D')), ((0, 'ND'), (0, 'C1D'), (0, 'CHD'), (0, 'C4C')), ((0, 'ND'), (0, 'C4D'), (0, 'CHA'), (0, 'C1A')), ((0, 'CHA'), (0, 'C1A'), (0, 'C4D'), (0, 'HA')), ((0, 'CHB'), (0, 'C1B'), (0, 'C4A'), (0, 'HB')), ((0, 'CHC'), (0, 'C1C'), (0, 'C4B'), (0, 'HC')), ((0, 'CHD'), (0, 'C1D'), (0, 'C4C'), (0, 'HD')), ((0, 'C1A'), (0, 'C2A'), (0, 'CHA'), (0, 'NA')), ((0, 'C4A'), (0, 'C3A'), (0, 'CHB'), (0, 'NA')), ((0, 'C1B'), (0, 'C2B'), (0, 'CHB'), (0, 'NB')), ((0, 'C4B'), (0, 'C3B'), (0, 'CHC'), (0, 'NB')), ((0, 'C1C'), (0, 'C2C'), (0, 'CHC'), (0, 'NC')), ((0, 'C4C'), (0, 'C3C'), (0, 'CHD'), (0, 'NC')), ((0, 'C1D'), (0, 'C2D'), (0, 'CHD'), (0, 'ND')), ((0, 'C4D'), (0, 'C3D'), (0, 'CHA'), (0, 'ND')), ((0, 'NA'), (0, 'C1A'), (0, 'C4A'), (0, 'FE')), ((0, 'NB'), (0, 'C1B'), (0, 'C4B'), (0, 'FE')), ((0, 'NC'), (0, 'C1C'), (0, 'C4C'), (0, 'FE')), ((0, 'ND'), (0, 'C1D'), (0, 'C4D'), (0, 'FE'))),\n+ 'LFN': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'O2')), ((0, 'C4'), (0, 'C4A'), (0, 'N3'), (0, 'O4'))),\n+ 'LFNR': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'O2')), ((0, 'C4'), (0, 'C4A'), (0, 'N3'), (0, 'O4'))),\n+ 'RBF': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'O2')), ((0, 'C4'), (0, 'C4A'), (0, 'N3'), (0, 'O4'))),\n+ 'RBFR': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'O2')), ((0, 'C4'), (0, 'C4A'), (0, 'N3'), (0, 'O4'))),\n+ 'FMN': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'O2')), ((0, 'C4'), (0, 'C4A'), (0, 'N3'), (0, 'O4'))),\n+ 'FOL': (((0, 'C2'), (0, 'N3'), (0, 'N1'), (0, 'NA2')), ((0, 'NA2'), (0, 'HN21'), (0, 'HN22'), (0, 'C2')), ((0, 'C4'), (0, 'C4A'), (0, 'N3'), (0, 'O4')), ((0, 'C'), (0, 'C11'), (0, 'N'), (0, 'O')), ((0, 'CD'), (0, 'OE1'), (0, 'OE2'), (0, 'CG')), ((0, 'CT'), (0, 'O2'), (0, 'O1'), (0, 'CA'))),\n+ 'FOLN1': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'NA2')), ((0, 'NA2'), (0, 'HN21'), (0, 'HN22'), (0, 'C2')), ((0, 'C4'), (0, 'C4A'), (0, 'N3'), (0, 'O4')), ((0, 'C'), (0, 'C11'), (0, 'N'), (0, 'O')), ((0, 'CD'), (0, 'OE1'), (0, 'OE2'), (0, 'CG')), ((0, 'CT'), (0, 'O2'), (0, 'O1'), (0, 'CA'))),\n+ 'FOLDPR': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'NA2')), ((0, 'C'), (0, 'C11'), (0, 'N'), (0, 'O')), ((0, 'CD'), (0, 'OE1'), (0, 'OE2'), (0, 'CG')), ((0, 'CT'), (0, 'O2'), (0, 'O1'), (0, 'CA'))),\n+ 'PTM6N3': (((0, 'C2'), (0, 'N3'), (0, 'N1'), (0, 'NA2')), ((0, 'NA2'), (0, 'HN21'), (0, 'HN22'), (0, 'C2')), ((0, 'C4'), (0, 'C4A'), (0, 'N3'), (0, 'O4'))),\n+ 'PTM6N1': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'NA2')), ((0, 'NA2'), (0, 'HN21'), (0, 'HN22'), (0, 'C2')), ((0, 'C4'), (0, 'C4A'), (0, 'N3'), (0, 'O4'))),\n+ 'PTRN1': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'NA2')), ((0, 'NA2'), (0, 'HN21'), (0, 'HN22'), (0, 'C2')), ((0, 'C4'), (0, 'C4A'), (0, 'N3'), (0, 'O4'))),\n+ 'PE0': (((0, 'C2'), (0, 'N3'), (0, 'N1'), (0, 'NA2')), ((0, 'NA2'), (0, 'HN21'), (0, 'HN22'), (0, 'C2')), ((0, 'C4'), (0, 'C4A'), (0, 'N3'), (0, 'O4'))),\n+ 'DPRPTR': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'NA2')),),\n+ 'THG': (((0, 'C2'), (0, 'N3'), (0, 'N1'), (0, 'NA2')), ((0, 'NA2'), (0, 'HN22'), (0, 'HN21'), (0, 'C2')), ((0, 'C4'), (0, 'C4A'), (0, 'N3'), (0, 'O4')), ((0, 'C'), (0, 'C11'), (0, 'N'), (0, 'O')), ((0, 'CD'), (0, 'OE1'), (0, 'OE2'), (0, 'CG')), ((0, 'CT'), (0, 'O2'), (0, 'O1'), (0, 'CA'))),\n+ 'THGN1': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'NA2')), ((0, 'NA2'), (0, 'HN22'), (0, 'HN21'), (0, 'C2')), ((0, 'C4'), (0, 'C4A'), (0, 'N3'), (0, 'O4')), ((0, 'C'), (0, 'C11'), (0, 'N'), (0, 'O')), ((0, 'CD'), (0, 'OE1'), (0, 'OE2'), (0, 'CG')), ((0, 'CT'), (0, 'O2'), (0, 'O1'), (0, 'CA'))),\n+ 'DHF': (((0, 'C2'), (0, 'N3'), (0, 'N1'), (0, 'NA2')), ((0, 'NA2'), (0, 'HN22'), (0, 'HN21'), (0, 'C2')), ((0, 'C4'), (0, 'C4A'), (0, 'N3'), (0, 'O4')), ((0, 'C6'), (0, 'C9'), (0, 'C7'), (0, 'N5')), ((0, 'C'), (0, 'C11'), (0, 'N'), (0, 'O')), ((0, 'CD'), (0, 'OE1'), (0, 'OE2'), (0, 'CG')), ((0, 'CT'), (0, 'O2'), (0, 'O1'), (0, 'CA'))),\n+ 'DHFN1': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'NA2')), ((0, 'NA2'), (0, 'HN22'), (0, 'HN21'), (0, 'C2')), ((0, 'C4'), (0, 'C4A'), (0, 'N3'), (0, 'O4')), ((0, 'C6'), (0, 'C9'), (0, 'C7'), (0, 'N5')), ((0, 'C'), (0, 'C11'), (0, 'N'), (0, 'O')), ((0, 'CD'), (0, 'OE1'), (0, 'OE2'), (0, 'CG')), ((0, 'CT'), (0, 'O2'), (0, 'O1'), (0, 'CA'))),\n+ 'TPT358': (((0, 'C2'), (0, 'N3'), (0, 'N1'), (0, 'NA2')), ((0, 'NA2'), (0, 'HN22'), (0, 'HN21'), (0, 'C2')), ((0, 'C4'), (0, 'C4A'), (0, 'N3'), (0, 'O4'))),\n+ 'TPT158': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'NA2')), ((0, 'NA2'), (0, 'HN21'), (0, 'HN22'), (0, 'C2')), ((0, 'C4'), (0, 'C4A'), (0, 'N3'), (0, 'O4'))),\n+ 'DPTN38': (((0, 'C2'), (0, 'N3'), (0, 'N1'), (0, 'NA2')), ((0, 'NA2'), (0, 'HN21'), (0, 'HN22'), (0, 'C2')), ((0, 'C4'), (0, 'C4A'), (0, 'N3'), (0, 'O4')), ((0, 'C6'), (0, 'C7'), (0, 'N5'), (0, 'H6'))),\n+ 'DPTN18': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'NA2')), ((0, 'NA2'), (0, 'HN22'), (0, 'HN21'), (0, 'C2')), ((0, 'C4'), (0, 'C4A'), (0, 'N3'), (0, 'O4')), ((0, 'C6'), (0, 'C7'), (0, 'N5'), (0, 'H6'))),\n+ 'H4B': (((0, 'C2'), (0, 'N3'), (0, 'N1'), (0, 'NA2')), ((0, 'NA2'), (0, 'HN22'), (0, 'HN21'), (0, 'C2')), ((0, 'C4'), (0, 'C4A'), (0, 'N3'), (0, 'O4'))),\n+ 'H4BN1': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'NA2')), ((0, 'NA2'), (0, 'HN21'), (0, 'HN22'), (0, 'C2')), ((0, 'C4'), (0, 'C4A'), (0, 'N3'), (0, 'O4'))),\n+ 'COB': (((0, 'C'), (0, 'OD1'), (0, 'OD2'), (0, 'CA')),),\n+ 'F430': (((0, 'C3'), (0, 'O1'), (0, 'O12'), (0, 'C39')), ((0, 'C4'), (0, 'O13'), (0, 'O2'), (0, 'C40')), ((0, 'C30'), (0, 'C27'), (0, 'N5'), (0, 'O7')), ((0, 'C31'), (0, 'C35'), (0, 'N4'), (0, 'O8')), ((0, 'C32'), (0, 'O10'), (0, 'O9'), (0, 'C28')), ((0, 'C34'), (0, 'C10'), (0, 'C33'), (0, 'O11')), ((0, 'C41'), (0, 'O5'), (0, 'O3'), (0, 'C5')), ((0, 'C42'), (0, 'O6'), (0, 'O4'), (0, 'C6')), ((0, 'N1'), (0, 'C23'), (0, 'C11'), (0, 'NI')), ((0, 'N3'), (0, 'C26'), (0, 'C14'), (0, 'NI')), ((0, 'N2'), (0, 'C24'), (0, 'C12'), (0, 'NI')), ((0, 'N6'), (0, 'C25'), (0, 'C13'), (0, 'NI'))),\n+ 'F43T': (((0, 'C3'), (0, 'O1'), (0, 'O12'), (0, 'C39')), ((0, 'C4'), (0, 'O13'), (0, 'O2'), (0, 'C40')), ((0, 'C30'), (0, 'C27'), (0, 'N5'), (0, 'O7')), ((0, 'C31'), (0, 'C35'), (0, 'N4'), (0, 'O8')), ((0, 'C32'), (0, 'O10'), (0, 'O9'), (0, 'C28')), ((0, 'C34'), (0, 'C10'), (0, 'C33'), (0, 'O11')), ((0, 'C41'), (0, 'O5'), (0, 'O3'), (0, 'C5')), ((0, 'C42'), (0, 'O6'), (0, 'O4'), (0, 'C6')), ((0, 'N1'), (0, 'C23'), (0, 'C11'), (0, 'NI')), ((0, 'N3'), (0, 'C26'), (0, 'C14'), (0, 'NI')), ((0, 'N2'), (0, 'C24'), (0, 'C12'), (0, 'NI')), ((0, 'N6'), (0, 'C25'), (0, 'C13'), (0, 'NI'))),\n+ 'F43A': (((0, 'C3'), (0, 'O1'), (0, 'O12'), (0, 'C39')), ((0, 'C4'), (0, 'O13'), (0, 'O2'), (0, 'C40')), ((0, 'C30'), (0, 'C27'), (0, 'N5'), (0, 'O7')), ((0, 'C31'), (0, 'C35'), (0, 'N4'), (0, 'O8')), ((0, 'C32'), (0, 'O10'), (0, 'O9'), (0, 'C28')), ((0, 'C34'), (0, 'C10'), (0, 'C33'), (0, 'O11')), ((0, 'C41'), (0, 'O5'), (0, 'O3'), (0, 'C5')), ((0, 'C42'), (0, 'O6'), (0, 'O4'), (0, 'C6')), ((0, 'C45'), (0, 'C44'), (0, 'N7'), (0, 'O14')), ((0, 'N1'), (0, 'C23'), (0, 'C11'), (0, 'NI')), ((0, 'N3'), (0, 'C26'), (0, 'C14'), (0, 'NI')), ((0, 'N2'), (0, 'C24'), (0, 'C12'), (0, 'NI')), ((0, 'N6'), (0, 'C25'), (0, 'C13'), (0, 'NI'))),\n+ 'ALY': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O')), ((0, 'NZ'), (0, 'CH'), (0, 'CE'), (0, 'HZ1')), ((0, 'CH'), (0, 'CH3'), (0, 'NZ'), (0, 'OH'))),\n+ 'DORN': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CD'), (1, 'N'), (0, 'O'))),\n+ 'NLE': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'AIBD': (((0, 'C2'), (0, 'C1'), (0, 'N3'), (0, 'O2')), ((0, 'N3'), (0, 'C2'), (0, 'C4'), (0, 'H3')), ((0, 'C5'), (0, 'C4'), (0, 'N6'), (0, 'O5')), ((0, 'N6'), (0, 'C5'), (0, 'C7'), (0, 'H6'))),\n+ 'AIB': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'ASPM': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O')), ((0, 'CG'), (0, 'CB2'), (0, 'OD2'), (0, 'OD1'))),\n+ 'LEM': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'LYM': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'NMGLYD': (((0, 'C2'), (0, 'C1'), (0, 'N3'), (0, 'O2')), ((0, 'C5'), (0, 'C4'), (0, 'N6'), (0, 'O5'))),\n+ 'MGY': (((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O')),),\n+ 'HYP': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'CD')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'HIC': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'HICP': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'NAPH': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ '143': (((0, 'CJ'), (0, 'OJ2'), (0, 'OJ1'), (0, 'CI')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ '0TD': (((0, 'CG'), (0, 'OD2'), (0, 'OD1'), (0, 'CB')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ '2CO': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ '4HH': (((0, 'CL3'), (0, 'CM'), (0, 'NN'), (0, 'ON')), ((0, 'CQ'), (0, 'CP'), (0, 'NR'), (0, 'OR')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ '5CS': (((0, 'CJ'), (0, 'OJ2'), (0, 'OJ1'), (0, 'CI')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ '6V1': (((0, 'C2'), (0, 'C1'), (0, 'N3'), (0, 'O7')), ((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'O8')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'AGT': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'ALS': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'APK': (((0, 'C6'), (0, 'C5'), (0, 'N1'), (0, 'N6')), ((0, 'N6'), (0, 'HN62'), (0, 'HN61'), (0, 'C6')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'ASB': (((0, 'CG'), (0, 'CB'), (0, 'OD2'), (0, 'OD1')), ((0, 'C1'), (0, 'O1'), (0, 'O2'), (0, 'C2')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'BXT': (((0, 'C1'), (0, 'N3'), (0, 'O2'), (0, 'OG')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'CGU': (((0, 'CD1'), (0, 'OE12'), (0, 'OE11'), (0, 'CG')), ((0, 'CD2'), (0, 'OE21'), (0, 'OE22'), (0, 'CG')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'CGV': (((0, 'CE1'), (0, 'OZ3'), (0, 'OZ2'), (0, 'CD1')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'CME': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'CML': (((0, 'C1'), (0, 'O2'), (0, 'O1'), (0, 'C2')), ((0, 'C4'), (0, 'O5'), (0, 'O4'), (0, 'C3')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'CSO': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'CSS': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'CSU': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'CSX': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'CYD': (((0, 'C2'), (0, 'C1'), (0, 'C3'), (0, 'O1')), ((0, 'C6'), (0, 'OT3'), (0, 'OT4'), (0, 'C5')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'CYF': (((0, 'CL'), (0, 'CAL'), (0, 'NL'), (0, 'OL')), ((0, 'C20'), (0, 'O5'), (0, 'O4'), (0, 'C19')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'CYG': (((0, 'CD1'), (0, 'CG1'), (0, 'OE2'), (0, 'SG')), ((0, 'C1'), (0, 'O2'), (0, 'O1'), (0, 'CA1')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'CYQP': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'DBZ': (((0, 'CD2'), (0, 'C1'), (0, 'NG'), (0, 'OD2')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'DDE': (((0, 'CBI'), (0, 'CBW'), (0, 'NAD'), (0, 'OAG')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'FHO': (((0, 'CZ'), (0, 'NE'), (0, 'OH'), (0, 'HZ')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'FZN': (((0, 'C6'), (0, 'C7'), (0, 'N2'), (0, 'S1')), ((0, 'C15'), (0, 'C14'), (0, 'N12'), (0, 'N11')), ((0, 'N11'), (0, 'HN12'), (0, 'HN11'), (0, 'C15')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'HIP': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'HIX': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'HTI': (((0, 'CAM'), (0, 'OA1'), (0, 'OA2'), (0, 'CAK')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'IAM': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'IT1': (((0, 'C4A'), (0, 'C4'), (0, 'NZ'), (0, 'H4A')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'IT1P': (((0, 'C4A'), (0, 'C4'), (0, 'NZ'), (0, 'H4A')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'JJJ': (((0, 'C7'), (0, 'C3'), (0, 'O7'), (0, 'SG')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'KCR': (((0, 'CH'), (0, 'CX'), (0, 'NZ'), (0, 'OH')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'KCX': (((0, 'CX'), (0, 'OQ1'), (0, 'OQ2'), (0, 'NZ')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'KPI': (((0, 'CX1'), (0, 'CX2'), (0, 'C1'), (0, 'NZ')), ((0, 'CX2'), (0, 'O2'), (0, 'O1'), (0, 'CX1')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'LA2': (((0, 'C1'), (0, 'C2'), (0, 'NZ'), (0, 'O1')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'LLP': (((0, \"C4'\"), (0, 'C4'), (0, 'NZ'), (0, \"H4'\")), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'LLPP': (((0, \"C4'\"), (0, 'C4'), (0, 'NZ'), (0, \"H4'\")), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'M0H': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'MCL': (((0, 'CX1'), (0, 'CX2'), (0, 'C1'), (0, 'NZ')), ((0, 'CX2'), (0, 'O2'), (0, 'O1'), (0, 'CX1')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'MCS': (((0, 'CAK'), (0, 'CAG'), (0, 'OAC'), (0, 'SAI')), ((0, 'CAJ'), (0, 'OAB'), (0, 'OAE'), (0, 'CAG')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'MHS': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'MLZ': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'NEP': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'PRV': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'QCS': (((0, 'CD'), (0, 'NE2'), (0, 'OE1'), (0, 'SG')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'QPA': (((0, 'C10'), (0, 'O10'), (0, 'O9'), (0, 'C8')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'R1A': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'SDP': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'SEB': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'SEN': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'SGB': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'SNC': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'SUN': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'SVX': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'SVY': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'TOX': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'TPQ': (((0, 'C2'), (0, 'C1'), (0, 'C3'), (0, 'O2')), ((0, 'C5'), (0, 'C4'), (0, 'C6'), (0, 'O5')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'TQQ': (((0, 'CZ2'), (0, 'CH2'), (0, 'CE2'), (0, 'O2')), ((0, 'CH2'), (0, 'CZ3'), (0, 'CZ2'), (0, 'N2')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'TRQ': (((0, 'CZ2'), (0, 'CH2'), (0, 'CE2'), (0, 'O7')), ((0, 'CH2'), (0, 'CZ3'), (0, 'CZ2'), (0, 'O6')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'TRW': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'TS9': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'TYS': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'XCN': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ '0AF': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ '26P': (((0, 'CE'), (0, 'CZ'), (0, 'CD'), (0, 'OE')), ((0, 'CZ'), (0, 'OZ1'), (0, 'OZ2'), (0, 'CE')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ '2FM': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ '2HF': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ '2HFD': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ '2HFE': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ '2NP': (((0, 'CZ1'), (0, 'OJ2'), (0, 'OJ1'), (0, 'CE')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ '32T': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ '3GL': (((0, 'CD'), (0, 'OE1'), (0, 'OE2'), (0, 'CG')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ '4FW': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ '4HT': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ '4IN': (((0, 'NZ1'), (0, 'HZ12'), (0, 'HZ11'), (0, 'CE3')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ '6CL': (((0, 'CZ'), (0, 'OH2'), (0, 'OH1'), (0, 'CE')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'ACZ': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'AGM': (((0, 'CZ'), (0, 'NH1'), (0, 'NE1'), (0, 'NH2')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'AHB': (((0, 'CG'), (0, 'CB'), (0, 'ND2'), (0, 'OD1')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'ARO': (((0, 'CZ'), (0, 'NH1'), (0, 'NH2'), (0, 'NE')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'AZDA': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'DAZDA': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'BB8': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'BCS': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'BHD': (((0, 'CG'), (0, 'OD2'), (0, 'OD1'), (0, 'CB')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'BTH3': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'DBTH3': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'CAN': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'CCS': (((0, 'CE'), (0, 'OZ1'), (0, 'OZ2'), (0, 'CD')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'CIR': (((0, 'CZ'), (0, 'NE'), (0, 'NH'), (0, 'OH')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'CSA': (((0, 'CE'), (0, 'CD'), (0, 'CZ'), (0, 'OE')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'DDZ': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'ESC': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'F2F': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'FGA4': (((0, 'CD'), (0, 'OE2'), (0, 'OE1'), (0, 'CG')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'DFGA4': (((0, 'CD'), (0, 'OE2'), (0, 'OE1'), (0, 'CG')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'FPH2': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'DFPH2': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'FT6': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'FTR': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'FUA2': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'DFUA2': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'FVAL': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'DFVAL': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'GDPR': (((0, 'CD'), (0, 'NE2'), (0, 'NG'), (0, 'NE1')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'DGDPR': (((0, 'CD'), (0, 'NE2'), (0, 'NG'), (0, 'NE1')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'GGB': (((0, 'CZ'), (0, 'NH2'), (0, 'NH1'), (0, 'NE')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'GGBP': (((0, 'CZ'), (0, 'NH2'), (0, 'NH1'), (0, 'NE')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'GHG': (((0, 'CD'), (0, 'CG'), (0, 'NE2'), (0, 'OE1')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'HGA': (((0, 'CD'), (0, 'CG'), (0, 'NE2'), (0, 'OE1')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'HOX': (((0, 'NH'), (0, 'HH2'), (0, 'HH1'), (0, 'CZ')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'HTR': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'IGL': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'KYN': (((0, 'CG'), (0, 'CD'), (0, 'CB'), (0, 'OG')), ((0, 'NE2'), (0, 'HE22'), (0, 'HE21'), (0, 'CE2')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'LE1': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'LED': (((0, 'CD2'), (0, 'CG'), (0, 'OE'), (0, 'HD2')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'LEF': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'LME': (((0, 'CD'), (0, 'OE2'), (0, 'OE1'), (0, 'CG1')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'LVN': (((0, 'CG1'), (0, 'CB'), (0, 'OG1'), (0, 'HG11')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'M2S': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'ME0': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'NIY': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'OBF': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'OCY': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'OMX': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'PBF': (((0, 'CF'), (0, 'CZ'), (0, 'CJ'), (0, 'OF')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'PF5': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'PYR2': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'DPYR2': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'PYZ1': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'DPYZ1': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'QU32': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'DQU32': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'QX32': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'DQX32': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'STYA': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'DSTYA': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'TEZA': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'DTEZA': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'TFG2': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'DTFG2': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'TFG3': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'DTFG3': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'TFG4': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'DTFG4': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'TFLE': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'DTFLE': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'TFP2': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'DTFP2': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'TFP3': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'DTFP3': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'TFP4': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'DTFP4': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'THG2': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'DTHG2': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'THG3': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'DTHG3': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'THIC': (((0, 'CZ'), (0, 'NE'), (0, 'NH'), (0, 'SZ')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'DTHIC': (((0, 'CZ'), (0, 'NE'), (0, 'NH'), (0, 'SZ')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'TIH': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'TRO': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'TTQ': (((0, 'N2'), (0, 'H22'), (0, 'H21'), (0, 'CH2')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'TY2': (((0, 'NE1'), (0, 'HE11'), (0, 'HE12'), (0, 'CE1')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'TYQ': (((0, 'NE2'), (0, 'HE21'), (0, 'HE22'), (0, 'CE2')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'TZA4': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'DTZA4': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'YCM': (((0, 'CE'), (0, 'CD'), (0, 'NZ2'), (0, 'OZ1')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'YOF': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ '004': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ '0A1': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ '0BN': (((0, 'CH'), (0, 'NJ2'), (0, 'NJ1'), (0, 'CZ')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ '2AG': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ '2AS': (((0, 'CG1'), (0, 'OD1'), (0, 'OD2'), (0, 'CB')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ '3CF': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ '3FG': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ '4CF': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ '4CY': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ '4HMP': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'D4HMP': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ '4PH': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'AA4': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'ABA': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'AHP': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'ALC': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'ALN': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'ALO': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'ANTH': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'DANTH': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'APD': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'APM': (((0, 'CH'), (0, 'NJ1'), (0, 'NJ2'), (0, 'CE1')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'AS2': (((0, 'CG'), (0, 'CB'), (0, 'OG'), (0, 'HG')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'BIF': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'BUG': (((0, 'C6'), (0, 'C5'), (0, 'N1'), (0, 'O6')), ((0, 'C17'), (0, 'O17'), (0, 'O18'), (0, 'C15'))),\n+ 'CHG': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'CNP2': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'DCNP2': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'CPA3': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'DCPA3': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'D4P': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'DAB': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'DAH': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'DIAL': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'DDILE': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'DIPH': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'DDIPH': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'DMK': (((0, 'CG1'), (0, 'OD2'), (0, 'OD1'), (0, 'CB')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'DMP3': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'DDMP3': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'DPP': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'FPG2': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'DFPG2': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'FPG3': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'DFPG3': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'FPG4': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'DFPG4': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'FPH3': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'DFPH3': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'GBUT': (((0, 'CE'), (0, 'NZ1'), (0, 'NZ2'), (0, 'ND')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'DGBUT': (((0, 'CE'), (0, 'NZ1'), (0, 'NZ2'), (0, 'ND')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'GME': (((0, 'CD'), (0, 'CG'), (0, 'OE1'), (0, 'OE2')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'HCS': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'HHK': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'HIL4': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'DHIL4': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'HL2': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'HLEU': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'DHLEU': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'HLU': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'HPE': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'HQA': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'HRG': (((0, 'CH'), (0, 'NJ1'), (0, 'NZ'), (0, 'NJ2')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'HRP': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'HSER': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'DHSER': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'HVA': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'I2M': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'IIL': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'ILX': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'LDO': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'LMQ': (((0, 'CD'), (0, 'CG1'), (0, 'NE2'), (0, 'OE1')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'LVG': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'MEG': (((0, 'CD'), (0, 'OE2'), (0, 'OE1'), (0, 'CG1')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'MEN': (((0, 'CG'), (0, 'CB'), (0, 'ND'), (0, 'OD1')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'MEQ': (((0, 'CD'), (0, 'CG'), (0, 'NE2'), (0, 'OE1')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'MHO': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'MOT5': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'DMOT5': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'MP34': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'DMP34': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'MPH2': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'DMPH2': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'MTR5': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'DMTR5': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'MTR6': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'DMTR6': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'MTY': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'NAL': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'NAO1': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'DNAO1': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'NAO2': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'DNAO2': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'NVA': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'OAS': (((0, 'CD'), (0, 'CE'), (0, 'OD'), (0, 'OG')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'OLT': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'OMT': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'ONL': (((0, 'CD'), (0, 'CG'), (0, 'CE'), (0, 'OD')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'ORN': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'OTYR': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'DOTYR': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'PFF': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'PPN': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'PYR3': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'DPYR3': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'PYR4': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'DPYR4': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'QU33': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'DQU33': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'QU34': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'DQU34': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'QU35': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'DQU35': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'QU36': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'DQU36': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'SLZ': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'SME': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'SYM': (((0, 'CD1'), (0, 'OE1'), (0, 'OE2'), (0, 'CG')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'TBP4': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'DTBP4': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'TH6': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'THA3': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'DTHA3': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'TRX': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'UN1': (((0, 'CE'), (0, 'OZ1'), (0, 'OZ2'), (0, 'CD')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'VAH': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'WFP': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ '2GX': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ '2MR': (((0, 'CZ'), (0, 'NH1'), (0, 'NH2'), (0, 'NE')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ '5CT': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ '9R1': (((0, 'CN'), (0, 'ON2'), (0, 'ON1'), (0, 'CZ')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'ASL': (((0, 'CG'), (0, 'CB'), (0, 'OD2'), (0, 'OD1')), ((0, 'C1'), (0, 'O2'), (0, 'O1'), (0, 'C2')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'AZH': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'CGUP': (((0, 'CD1'), (0, 'OE12'), (0, 'OE11'), (0, 'CG')), ((0, 'CD2'), (0, 'CG'), (0, 'OE21'), (0, 'OE22')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'CYQ': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'DA2': (((0, 'CZ'), (0, 'NH1'), (0, 'NE'), (0, 'NH2')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'DBB': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'DDEP': (((0, 'CBI'), (0, 'CBW'), (0, 'NAD'), (0, 'OAG')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'DNP': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'GPL': (((0, 'C6'), (0, 'C5'), (0, 'N1'), (0, 'O6')), ((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'N2')), ((0, 'N2'), (0, 'H22'), (0, 'H21'), (0, 'C2')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'IAS': (((0, 'CG'), (0, 'OD2'), (0, 'OD1'), (0, 'CB')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'KHB': (((0, 'C1'), (0, 'C2'), (0, 'NZ'), (0, 'O1')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'LYX': (((0, 'C23'), (0, 'C21'), (0, 'NZ'), (0, 'O33')), ((0, 'C16'), (0, 'C15'), (0, 'N17'), (0, 'O34')), ((0, 'C12'), (0, 'C10'), (0, 'N13'), (0, 'O35')), ((0, 'C59'), (0, 'C54'), (0, 'N58'), (0, 'N60')), ((0, 'N60'), (0, 'H601'), (0, 'H602'), (0, 'C59')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'LYZ': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'M3L': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'MHSP': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'MIR': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'MLY': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'NMM': (((0, 'CZ'), (0, 'NH2'), (0, 'NE'), (0, 'NH1')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'OCS': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'OSE': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'PHD': (((0, 'CG'), (0, 'CB'), (0, 'OD2'), (0, 'OD1')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'PHDP': (((0, 'CG'), (0, 'CB'), (0, 'OD2'), (0, 'OD1')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'PM3': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'PR3': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'PRK': (((0, 'CAL'), (0, 'CAF'), (0, 'NZ'), (0, 'OAD')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'SBG': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'SCH': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'SCS': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'SMC': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'SVV': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'TPQP': (((0, 'C2'), (0, 'C1'), (0, 'C3'), (0, 'O2')), ((0, 'C5'), (0, 'C4'), (0, 'C6'), (0, 'O5')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ '4FB': (((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'CDX'))),\n+ '8LJ': (((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'CD'))),\n+ 'AYA': (((0, 'CT'), (0, 'CM'), (0, 'N'), (0, 'OT')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'B2H': (((0, 'C'), (0, 'CA3'), (1, 'N'), (0, 'O')), ((0, 'N'), (-1, 'C'), (0, 'CA1'), (0, 'HN'))),\n+ 'B3A': (((0, 'C'), (0, 'CA1'), (1, 'N'), (0, 'O')), ((0, 'N'), (-1, 'C'), (0, 'CB'), (0, 'HN'))),\n+ 'B3E': (((0, 'CE'), (0, 'OF1'), (0, 'OF2'), (0, 'CD')), ((0, 'C'), (0, 'CA1'), (1, 'N'), (0, 'O')), ((0, 'N'), (-1, 'C'), (0, 'CB'), (0, 'HN'))),\n+ 'B3K': (((0, 'C'), (0, 'CA1'), (1, 'N'), (0, 'O')), ((0, 'N'), (-1, 'C'), (0, 'CB'), (0, 'HN'))),\n+ 'B3S': (((0, 'C'), (0, 'CA1'), (1, 'N'), (0, 'O')), ((0, 'N'), (-1, 'C'), (0, 'CB'), (0, 'HN'))),\n+ 'B3X': (((0, 'CD'), (0, 'CG'), (0, 'NE2'), (0, 'OE1')), ((0, 'C'), (0, 'CA1'), (1, 'N'), (0, 'O')), ((0, 'N'), (-1, 'C'), (0, 'CB'), (0, 'HN'))),\n+ 'B3Y': (((0, 'C'), (0, 'CA1'), (1, 'N'), (0, 'O')), ((0, 'N'), (-1, 'C'), (0, 'CB'), (0, 'HN'))),\n+ 'CH6': (((0, 'C2'), (0, 'CA2'), (0, 'N3'), (0, 'O2')), ((0, 'C'), (0, 'CA3'), (1, 'N'), (0, 'O')), ((0, 'N'), (-1, 'C'), (0, 'CA1'), (0, 'HN'))),\n+ 'CR2': (((0, 'C2'), (0, 'CA2'), (0, 'N3'), (0, 'O2')), ((0, 'C'), (0, 'CA3'), (1, 'N'), (0, 'O')), ((0, 'N'), (-1, 'C'), (0, 'CA1'), (0, 'H'))),\n+ 'CR8D': (((0, 'C1'), (0, 'C2'), (0, 'C4'), (0, 'O3')), ((0, 'C'), (0, 'C17'), (1, 'N'), (0, 'O')), ((0, 'N'), (-1, 'C'), (0, 'C16'), (0, 'H1'))),\n+ 'CRF': (((0, 'C'), (0, 'CA3'), (1, 'N'), (0, 'O')), ((0, 'N'), (-1, 'C'), (0, 'CA1'), (0, 'HN'))),\n+ 'CRO': (((0, 'C'), (0, 'CA3'), (1, 'N'), (0, 'O')), ((0, 'N'), (-1, 'C'), (0, 'CA1'), (0, 'HN'))),\n+ 'CRQ': (((0, 'CA1'), (0, 'C1'), (0, 'CB1'), (0, 'N')), ((0, 'CD3'), (0, 'CG1'), (0, 'NE1'), (0, 'OE1')), ((0, 'C2'), (0, 'CA2'), (0, 'N3'), (0, 'O2')), ((0, 'C'), (0, 'CA3'), (1, 'N'), (0, 'O'))),\n+ 'CXM': (((0, 'CN'), (0, 'ON1'), (0, 'ON2'), (0, 'N')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'DYA': (((0, 'CA'), (0, 'CB'), (0, 'C'), (0, 'N')), ((0, 'CG'), (0, 'OD1'), (0, 'OD2'), (0, 'CB')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'H'))),\n+ 'DYG': (((0, 'CG1'), (0, 'OD2'), (0, 'OD1'), (0, 'CB1')), ((0, 'C2'), (0, 'CA2'), (0, 'N3'), (0, 'O2')), ((0, 'C'), (0, 'CA3'), (1, 'N'), (0, 'O')), ((0, 'N'), (-1, 'C'), (0, 'CA1'), (0, 'HN'))),\n+ 'FGL': (((0, 'CB'), (0, 'OG2'), (0, 'OG1'), (0, 'CA')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN'))),\n+ 'FLA': (((0, 'C'), (0, 'OXT'), (0, 'O'), (0, 'CA')),),\n+ 'FME': (((0, 'CN'), (0, 'N'), (0, 'O1'), (0, 'HCN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'FP9': (((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'CDX'))),\n+ 'GL3': (((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'S')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN'))),\n+ 'GYS': (((0, 'C2'), (0, 'CA2'), (0, 'N3'), (0, 'O2')), ((0, 'C'), (0, 'CA3'), (1, 'N'), (0, 'O')), ((0, 'N'), (-1, 'C'), (0, 'CA1'), (0, 'HN'))),\n+ 'HMR': (((0, 'CZ'), (0, 'NH2'), (0, 'NE'), (0, 'NH1')), ((0, 'C'), (0, 'CH2'), (1, 'N'), (0, 'O')), ((0, 'N'), (-1, 'C'), (0, 'CA1'), (0, 'HN'))),\n+ 'HT7': (((0, 'C'), (0, 'CA1'), (1, 'N'), (0, 'O')), ((0, 'N'), (-1, 'C'), (0, 'CB'), (0, 'HN'))),\n+ 'HZP': (((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'CD'))),\n+ 'I4G': (((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'CB'))),\n+ 'MAA': (((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'CM'))),\n+ 'MDO': (((0, 'C2'), (0, 'CA2'), (0, 'N3'), (0, 'O2')), ((0, 'C'), (0, 'CA3'), (1, 'N'), (0, 'O')), ((0, 'N'), (-1, 'C'), (0, 'CA1'), (0, 'HN'))),\n+ 'MP8': (((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'CD'))),\n+ 'NRQ': (((0, 'CA1'), (0, 'C1'), (0, 'CB1'), (0, 'N')), ((0, 'C2'), (0, 'CA2'), (0, 'N3'), (0, 'O2')), ((0, 'C'), (0, 'CA3'), (1, 'N'), (0, 'O'))),\n+ 'PIA': (((0, 'C2'), (0, 'CA2'), (0, 'N3'), (0, 'O2')), ((0, 'C'), (0, 'CA3'), (1, 'N'), (0, 'O')), ((0, 'N'), (-1, 'C'), (0, 'CA1'), (0, 'HN'))),\n+ 'PR4': (((0, 'CAD'), (0, 'OAE'), (0, 'OAF'), (0, 'CAC')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'PRS': (((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'CD'))),\n+ 'PXU': (((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'CD'))),\n+ 'SUI': (((0, 'CG'), (0, 'CB'), (0, 'N2'), (0, 'OD')), ((0, 'C1'), (0, 'C1A'), (0, 'N2'), (0, 'O1')), ((0, 'C'), (0, 'C2A'), (1, 'N'), (0, 'O')), ((0, 'N'), (-1, 'C'), (0, 'C1A'), (0, 'HN'))),\n+ 'SWG': (((0, 'C2'), (0, 'CA2'), (0, 'N3'), (0, 'O2')), ((0, 'C'), (0, 'CA3'), (1, 'N'), (0, 'O')), ((0, 'N'), (-1, 'C'), (0, 'CA1'), (0, 'HN'))),\n+ 'XYG': (((0, 'CA1'), (0, 'C1'), (0, 'CB1'), (0, 'N')), ((0, 'C2'), (0, 'CA2'), (0, 'N3'), (0, 'O2')), ((0, 'C'), (0, 'CA3'), (1, 'N'), (0, 'O'))),\n+ 'SM014': (((0, 'CLP'), (0, 'CL'), (0, 'N'), (0, 'OL')), ((0, 'C'), (0, 'CA'), (0, 'NR'), (0, 'O'))),\n+ 'SM023': (((0, 'CLP'), (0, 'CL'), (0, 'N'), (0, 'OL')), ((0, 'C'), (0, 'CA'), (0, 'NR'), (0, 'O'))),\n+ 'SM032': (((0, 'CT'), (0, 'CM'), (0, 'N'), (0, 'OT')), ((0, 'C'), (0, 'CA'), (0, 'NR'), (0, 'O'))),\n+ 'SM035': (((0, 'CLP'), (0, 'CL'), (0, 'N'), (0, 'OL')), ((0, 'CB'), (0, 'CG'), (0, 'CA'), (0, 'N'))),\n+ 'SM056': (((0, 'CN'), (0, 'ON1'), (0, 'ON2'), (0, 'N')), ((0, 'C'), (0, 'CA'), (0, 'NR'), (0, 'O'))),\n+ 'SM070': (((0, 'CLP'), (0, 'CL'), (0, 'N'), (0, 'OL')), ((0, 'CA'), (0, 'CB'), (0, 'C'), (0, 'N')), ((0, 'CG'), (0, 'OD1'), (0, 'OD2'), (0, 'CB')), ((0, 'C'), (0, 'CA'), (0, 'NR'), (0, 'O'))),\n+ 'SM071': (((0, 'CLP'), (0, 'CL'), (0, 'N'), (0, 'OL')), ((0, 'CA'), (0, 'CB'), (0, 'C'), (0, 'N')), ((0, 'C'), (0, 'CA'), (0, 'NR'), (0, 'O'))),\n+ 'SM076': (((0, 'CLP'), (0, 'CL'), (0, 'N'), (0, 'OL')), ((0, 'CB'), (0, 'OG2'), (0, 'OG1'), (0, 'CA')), ((0, 'C'), (0, 'CA'), (0, 'NR'), (0, 'O'))),\n+ 'SM078': (((0, 'CN'), (0, 'N'), (0, 'O1'), (0, 'HCN')), ((0, 'C'), (0, 'CA'), (0, 'NR'), (0, 'O'))),\n+ 'SM095': (((0, 'CLP'), (0, 'CL'), (0, 'N'), (0, 'OL')),),\n+ 'SM114': (((0, 'CLP'), (0, 'CL'), (0, 'N'), (0, 'OL')), ((0, 'C'), (0, 'CA'), (0, 'NR'), (0, 'O'))),\n+ 'SM115': (((0, 'CLP'), (0, 'CL'), (0, 'N'), (0, 'OL')),),\n+ 'SM119': (((0, 'CLP'), (0, 'CL'), (0, 'N'), (0, 'OL')), ((0, 'C2'), (0, 'CA2'), (0, 'N3'), (0, 'O2'))),\n+ 'SM120': (((0, 'C2'), (0, 'CA2'), (0, 'N3'), (0, 'O2')), ((0, 'C'), (0, 'CA3'), (0, 'NR'), (0, 'O'))),\n+ 'SM136': (((0, 'C'), (0, 'CA'), (0, 'NR'), (0, 'O')),),\n+ 'SM138': (((0, 'CLP'), (0, 'CL'), (0, 'N'), (0, 'OL')), ((0, 'C'), (0, 'CA'), (0, 'NR'), (0, 'O'))),\n+ 'SM140': (((0, 'CLP'), (0, 'CL'), (0, 'N'), (0, 'OL')), ((0, 'C'), (0, 'CA'), (0, 'NR'), (0, 'O'))),\n+ 'SM154': (((0, 'CLP'), (0, 'CL'), (0, 'N'), (0, 'OL')), ((0, 'CG'), (0, 'CB'), (0, 'N2'), (0, 'OD')), ((0, 'C1'), (0, 'C1A'), (0, 'N2'), (0, 'O1')), ((0, 'C'), (0, 'C2A'), (0, 'NR'), (0, 'O'))),\n+ 'SM155': (((0, 'CLP'), (0, 'CL'), (0, 'N'), (0, 'OL')), ((0, 'CG'), (0, 'CB'), (0, 'N2'), (0, 'OD')), ((0, 'C1'), (0, 'C1A'), (0, 'N2'), (0, 'O1'))),\n+ 'SM190': (((0, 'C'), (0, 'CA'), (0, 'NT'), (0, 'O')), ((0, 'CY'), (0, 'CAY'), (0, 'N'), (0, 'OY'))),\n+ 'SM191': (((0, 'CAD'), (0, 'OAE'), (0, 'OAF'), (0, 'CAC')), ((0, 'C'), (0, 'CA'), (0, 'NR'), (0, 'O'))),\n+ 'SM192': (((0, 'C'), (0, 'CA'), (0, 'NT'), (0, 'O')), ((0, 'CY'), (0, 'CAY'), (0, 'N'), (0, 'OY'))),\n+ 'SM195': (((0, 'C'), (0, 'CA'), (0, 'NT'), (0, 'O')), ((0, 'CY'), (0, 'CAY'), (0, 'N'), (0, 'OY'))),\n+ 'SM206': (((0, 'CD'), (0, 'NE2'), (0, 'NG'), (0, 'NE1')), ((0, 'C'), (0, 'CA'), (0, 'NT'), (0, 'O')), ((0, 'CY'), (0, 'CAY'), (0, 'N'), (0, 'OY'))),\n+ 'SM209': (((0, 'CD'), (0, 'CE'), (0, 'OD'), (0, 'OG')), ((0, 'C'), (0, 'CA'), (0, 'NT'), (0, 'O')), ((0, 'CY'), (0, 'CAY'), (0, 'N'), (0, 'OY'))),\n+ 'SM210': (((0, 'C'), (0, 'CA'), (0, 'NT'), (0, 'O')), ((0, 'CY'), (0, 'CAY'), (0, 'N'), (0, 'OY'))),\n+ 'SM222': (((0, 'C'), (0, 'CA'), (0, 'NT'), (0, 'O')), ((0, 'CY'), (0, 'CAY'), (0, 'N'), (0, 'OY'))),\n+ 'SM223': (((0, 'C'), (0, 'CA'), (0, 'NT'), (0, 'O')), ((0, 'CY'), (0, 'CAY'), (0, 'N'), (0, 'OY'))),\n+ 'SM226': (((0, 'CD2'), (0, 'C1'), (0, 'NG'), (0, 'OD2')), ((0, 'C'), (0, 'CA'), (0, 'NT'), (0, 'O')), ((0, 'CY'), (0, 'CAY'), (0, 'N'), (0, 'OY'))),\n+ 'SM228': (((0, 'C'), (0, 'CA'), (0, 'NT'), (0, 'O')), ((0, 'CY'), (0, 'CAY'), (0, 'N'), (0, 'OY'))),\n+ 'SM229': (((0, 'C'), (0, 'CA'), (0, 'NT'), (0, 'O')), ((0, 'CY'), (0, 'CAY'), (0, 'N'), (0, 'OY'))),\n+ 'SM230': (((0, 'C'), (0, 'CA'), (0, 'NT'), (0, 'O')), ((0, 'CY'), (0, 'CAY'), (0, 'N'), (0, 'OY'))),\n+ 'SM231': (((0, 'C'), (0, 'CA'), (0, 'NT'), (0, 'O')), ((0, 'CY'), (0, 'CAY'), (0, 'N'), (0, 'OY'))),\n+ 'SM232': (((0, 'C'), (0, 'CA'), (0, 'NT'), (0, 'O')), ((0, 'CY'), (0, 'CAY'), (0, 'N'), (0, 'OY'))),\n+ 'SM235': (((0, 'C'), (0, 'CA'), (0, 'NT'), (0, 'O')), ((0, 'CY'), (0, 'CAY'), (0, 'N'), (0, 'OY'))),\n+ 'SM236': (((0, 'C'), (0, 'CA'), (0, 'NT'), (0, 'O')), ((0, 'CY'), (0, 'CAY'), (0, 'N'), (0, 'OY'))),\n+ 'PYRE': (((0, 'HE1'), (0, 'NZ'), (0, 'CD1'), (0, 'CE1')), ((0, 'HD1'), (0, 'CE1'), (0, 'CG'), (0, 'CD1')), ((0, 'HE2'), (0, 'NZ'), (0, 'CD2'), (0, 'CE2')), ((0, 'HD2'), (0, 'CE2'), (0, 'CG'), (0, 'CD2')), ((0, 'HG'), (0, 'CD1'), (0, 'CD2'), (0, 'CG'))),\n+ '3AP2': (((0, 'HE1'), (0, 'NZ'), (0, 'CD1'), (0, 'CE1')), ((0, 'HE2'), (0, 'NZ'), (0, 'CD2'), (0, 'CE2')), ((0, 'HD2'), (0, 'CE2'), (0, 'CG'), (0, 'CD2')), ((0, 'HG'), (0, 'CD1'), (0, 'CD2'), (0, 'CG')), ((0, 'ND1'), (0, 'CG'), (0, 'CE1'), (0, 'CD1')), ((0, 'HD11'), (0, 'HD12'), (0, 'ND1'), (0, 'CD1'))),\n+ 'PTR': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'SEP': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'TPO': (((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'SAM': (((0, 'O'), (0, 'CA'), (0, 'OXT'), (0, 'C')), ((0, 'N6'), (0, 'C6'), (0, 'HN61'), (0, 'HN62')), ((0, 'C6'), (0, 'N1'), (0, 'C5'), (0, 'N6'))),\n+ 'CYPR': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'O2')), ((0, 'C4'), (0, 'N3'), (0, 'C5'), (0, 'N4')), ((0, 'N4'), (0, 'C4'), (0, 'H41'), (0, 'H42'))),\n+ 'CYTH': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'O2')), ((0, 'C4'), (0, 'N3'), (0, 'C5'), (0, 'N4')), ((0, 'N4'), (0, 'C4'), (0, 'H41'), (0, 'H42'))),\n+ 'N4EM': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'O2')), ((0, 'C4'), (0, 'N3'), (0, 'C5'), (0, 'N4')), ((0, 'N4'), (0, 'C4'), (0, 'C41'), (0, 'H42'))),\n+ 'XPN': (((0, 'C'), (0, \"O1'\"), (0, \"C2'\"), (1, 'N')), ((0, \"C3'\"), (0, \"O3'\"), (0, \"C4'\"), (0, \"N2'\")), ((0, \"N2'\"), (0, \"C2'\"), (0, \"C5'\"), (0, \"C3'\"))),\n+ 'YPN': (((0, 'N'), (-1, 'C'), (0, \"C6'\"), (0, \"H1'\")), ((0, \"C3'\"), (0, \"O3'\"), (0, \"C4'\"), (0, \"N2'\")), ((0, \"N2'\"), (0, \"C2'\"), (0, \"C5'\"), (0, \"C3'\"))),\n+ 'GPN': (((0, 'C2'), (0, 'N3'), (0, 'N1'), (0, 'N2')), ((0, 'C6'), (0, 'N1'), (0, 'C5'), (0, 'O6')), ((0, 'N2'), (0, 'H21'), (0, 'C2'), (0, 'H22')), ((0, 'N'), (-1, 'C'), (0, \"C6'\"), (0, \"H1'\")), ((0, 'C'), (0, \"O1'\"), (0, \"C2'\"), (1, 'N')), ((0, \"C3'\"), (0, \"O3'\"), (0, \"C4'\"), (0, \"N2'\")), ((0, \"N2'\"), (0, \"C2'\"), (0, \"C5'\"), (0, \"C3'\"))),\n+ 'CPN': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'O2')), ((0, 'C4'), (0, 'N3'), (0, 'C5'), (0, 'N4')), ((0, 'N'), (-1, 'C'), (0, \"C6'\"), (0, \"H1'\")), ((0, 'C'), (0, \"O1'\"), (0, \"C2'\"), (1, 'N')), ((0, \"C3'\"), (0, \"O3'\"), (0, \"C4'\"), (0, \"N2'\")), ((0, \"N2'\"), (0, \"C2'\"), (0, \"C5'\"), (0, \"C3'\"))),\n+ 'TPN': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'O2')), ((0, 'C4'), (0, 'N3'), (0, 'C5'), (0, 'O4')), ((0, 'C5'), (0, 'C4'), (0, 'C6'), (0, 'C5M')), ((0, 'N'), (-1, 'C'), (0, \"C6'\"), (0, \"H1'\")), ((0, 'C'), (0, \"O1'\"), (0, \"C2'\"), (1, 'N')), ((0, \"C3'\"), (0, \"O3'\"), (0, \"C4'\"), (0, \"N2'\")), ((0, \"N2'\"), (0, \"C2'\"), (0, \"C5'\"), (0, \"C3'\"))),\n+ 'UPN': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'O2')), ((0, 'C4'), (0, 'N3'), (0, 'C5'), (0, 'O4')), ((0, 'N'), (-1, 'C'), (0, \"C6'\"), (0, \"H1'\")), ((0, 'C'), (0, \"O1'\"), (0, \"C2'\"), (1, 'N')), ((0, \"C3'\"), (0, \"O3'\"), (0, \"C4'\"), (0, \"N2'\")), ((0, \"N2'\"), (0, \"C2'\"), (0, \"C5'\"), (0, \"C3'\"))),\n+ 'APN': (((0, 'N6'), (0, 'C6'), (0, 'H61'), (0, 'H62')), ((0, 'C6'), (0, 'N1'), (0, 'C5'), (0, 'N6')), ((0, 'N'), (-1, 'C'), (0, \"C6'\"), (0, \"H1'\")), ((0, 'C'), (0, \"O1'\"), (0, \"C2'\"), (1, 'N')), ((0, \"C3'\"), (0, \"O3'\"), (0, \"C4'\"), (0, \"N2'\")), ((0, \"N2'\"), (0, \"C2'\"), (0, \"C5'\"), (0, \"C3'\"))),\n+ 'E1XM': (((0, 'C2'), (0, 'N3'), (0, 'N1'), (0, 'O2')), ((0, 'C6'), (0, 'N1'), (0, 'C5'), (0, 'O6'))),\n+ 'E1XE': (((0, 'C2'), (0, 'N3'), (0, 'N1'), (0, 'O2')), ((0, 'C6'), (0, 'N1'), (0, 'C5'), (0, 'O6'))),\n+ 'E1X': (((0, 'C2'), (0, 'N3'), (0, 'N1'), (0, 'O2')), ((0, 'C6'), (0, 'N1'), (0, 'C5'), (0, 'O6'))),\n+ 'OMU': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'O2')), ((0, 'C4'), (0, 'N3'), (0, 'C5'), (0, 'O4'))),\n+ '2SU': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'S2')), ((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'O4'))),\n+ 'MSU': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'S2')), ((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'O4'))),\n+ '4SU': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'O2')), ((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'S4'))),\n+ '52U': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'S2')), ((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'O4'))),\n+ '5MU': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'O2')), ((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'O4')), ((0, 'C5'), (0, 'C4'), (0, 'C6'), (0, 'C5M'))),\n+ '2MU': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'O2')), ((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'O4')), ((0, 'C5'), (0, 'C4'), (0, 'C6'), (0, 'C5M'))),\n+ 'H2U': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'O2')), ((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'O4'))),\n+ 'MDU': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'O2')), ((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'O4'))),\n+ '5HU': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'O2')), ((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'O4'))),\n+ 'MOU': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'O2')), ((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'O4'))),\n+ '3MU': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'O2')), ((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'O4'))),\n+ 'M3U': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'O2')), ((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'O4'))),\n+ 'CYU': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'O2')), ((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'O4'))),\n+ 'PSU': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'O2')), ((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'O4'))),\n+ 'OMP': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'O2')), ((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'O4'))),\n+ '1MP': (((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'O4')), ((0, 'C2'), (0, 'N3'), (0, 'N1'), (0, 'O2'))),\n+ '3MP': (((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'O4')), ((0, 'C2'), (0, 'N3'), (0, 'N1'), (0, 'O2'))),\n+ 'SAU': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'S2')), ((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'O4'))),\n+ '5AU': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'O2')), ((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'O4'))),\n+ 'U8U': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'S2')), ((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'O4'))),\n+ 'SEU': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'SE2')), ((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'O4'))),\n+ '5DU': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'O2')), ((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'O4')), ((0, 'C10'), (0, 'O11'), (0, 'O12'), (0, 'C9'))),\n+ 'MAU': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'O2')), ((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'O4')), ((0, 'C10'), (0, 'O11'), (0, 'O12'), (0, 'C9'))),\n+ 'SCU': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'S2')), ((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'O4')), ((0, 'C10'), (0, 'O11'), (0, 'O12'), (0, 'C9'))),\n+ 'IAU': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'O2')), ((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'O4'))),\n+ 'MIU': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'O2')), ((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'O4'))),\n+ 'ISU': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'S2')), ((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'O4'))),\n+ '5CU': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'O2')), ((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'O4')), ((0, 'C8'), (0, 'O82'), (0, 'O81'), (0, 'C7'))),\n+ 'OCU': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'O2')), ((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'O4')), ((0, 'C8'), (0, 'C7'), (0, 'O8'), (0, 'O9'))),\n+ 'MEU': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'O2')), ((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'O4')), ((0, 'C8'), (0, 'C7'), (0, 'O8'), (0, 'O9'))),\n+ '70U': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'S2')), ((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'O4')), ((0, 'C8'), (0, 'C5M'), (0, 'O8'), (0, 'O9'))),\n+ 'BCU': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'O2')), ((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'O4')), ((0, 'C8'), (0, 'C7'), (0, 'N8'), (0, 'O8'))),\n+ 'MCU': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'O2')), ((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'O4')), ((0, 'C8'), (0, 'C7'), (0, 'N8'), (0, 'O8'))),\n+ 'HCU': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'O2')), ((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'O4')), ((0, 'C8'), (0, 'O82'), (0, 'O81'), (0, 'C7'))),\n+ 'CMU': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'O2')), ((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'O4')), ((0, 'C8'), (0, 'C7'), (0, 'O8'), (0, 'O9'))),\n+ 'OAU': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'O2')), ((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'O4')), ((0, 'C9'), (0, 'O92'), (0, 'O91'), (0, 'C8'))),\n+ 'OEU': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'O2')), ((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'O4')), ((0, 'C9'), (0, 'C8'), (0, 'O9'), (0, 'O10'))),\n+ '3AU': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'O2')), ((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'O4')), ((0, 'C13'), (0, 'O30'), (0, 'O31'), (0, 'C12'))),\n+ '13P': (((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'O4')), ((0, 'C2'), (0, 'N3'), (0, 'N1'), (0, 'O2')), ((0, 'C13'), (0, 'O30'), (0, 'O31'), (0, 'C12'))),\n+ '5TU': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'O2')), ((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'O4'))),\n+ 'STU': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'S2')), ((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'O4'))),\n+ 'GAU': (((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'O4')),),\n+ 'GCU': (((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'O4')), ((0, 'C10'), (0, 'O11'), (0, 'O12'), (0, 'C9'))),\n+ 'OMC': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'O2')), ((0, 'C4'), (0, 'N3'), (0, 'C5'), (0, 'N4')), ((0, 'N4'), (0, 'C4'), (0, 'H41'), (0, 'H42'))),\n+ '2SC': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'S2')), ((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'N4')), ((0, 'N4'), (0, 'H41'), (0, 'H42'), (0, 'C4'))),\n+ '5MC': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'O2')), ((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'N4')), ((0, 'N4'), (0, 'H41'), (0, 'H42'), (0, 'C4'))),\n+ 'MMC': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'O2')), ((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'N4')), ((0, 'N4'), (0, 'H41'), (0, 'H42'), (0, 'C4'))),\n+ 'HMC': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'O2')), ((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'N4')), ((0, 'N4'), (0, 'H41'), (0, 'H42'), (0, 'C4'))),\n+ '5FC': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'O2')), ((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'N4')), ((0, 'N4'), (0, 'H41'), (0, 'H42'), (0, 'C4')), ((0, 'C7'), (0, 'C5'), (0, 'O7'), (0, 'H7'))),\n+ 'MFC': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'O2')), ((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'N4')), ((0, 'N4'), (0, 'H41'), (0, 'H42'), (0, 'C4')), ((0, 'C7'), (0, 'C5'), (0, 'O7'), (0, 'H7'))),\n+ '4MC': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'O2')), ((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'N4'))),\n+ '4OC': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'O2')), ((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'N4'))),\n+ '4AC': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'O2')), ((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'N4')), ((0, 'C7'), (0, 'C8'), (0, 'N4'), (0, 'O7'))),\n+ 'MAC': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'O2')), ((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'N4')), ((0, 'C7'), (0, 'C8'), (0, 'N4'), (0, 'O7'))),\n+ 'TMC': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'O2')), ((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'N4'))),\n+ '3MC': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'O2')), ((0, 'C4'), (0, 'N3'), (0, 'N4'), (0, 'C5')), ((0, 'N4'), (0, 'H41'), (0, 'H42'), (0, 'C4'))),\n+ 'K2C': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'N2')), ((0, 'C4'), (0, 'C5'), (0, 'N4'), (0, 'N3')), ((0, 'C13'), (0, 'O30'), (0, 'O31'), (0, 'C12'))),\n+ 'R2C': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'N2')), ((0, 'C4'), (0, 'C5'), (0, 'N4'), (0, 'N3')), ((0, 'CZ'), (0, 'NE'), (0, 'NH1'), (0, 'NH2'))),\n+ '1PC': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'N2')), ((0, 'N2'), (0, 'H22'), (0, 'H21'), (0, 'C2')), ((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'O4'))),\n+ '3PC': (((0, 'C2'), (0, 'N3'), (0, 'N1'), (0, 'N2')), ((0, 'N2'), (0, 'H22'), (0, 'H21'), (0, 'C2')), ((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'O4'))),\n+ 'OMA': (((0, 'N6'), (0, 'C6'), (0, 'H61'), (0, 'H62')), ((0, 'C6'), (0, 'N1'), (0, 'C5'), (0, 'N6'))),\n+ 'RIA': (((0, 'N6'), (0, 'C6'), (0, 'H61'), (0, 'H62')), ((0, 'C6'), (0, 'N1'), (0, 'C5'), (0, 'N6'))),\n+ '6MA': (((0, 'C6'), (0, 'C5'), (0, 'N1'), (0, 'N6')),),\n+ 'MMA': (((0, 'C6'), (0, 'C5'), (0, 'N1'), (0, 'N6')),),\n+ 'M6A': (((0, 'C6'), (0, 'C5'), (0, 'N1'), (0, 'N6')),),\n+ 'MTA': (((0, 'C6'), (0, 'C5'), (0, 'N1'), (0, 'N6')),),\n+ '2MA': (((0, 'N6'), (0, 'H61'), (0, 'H62'), (0, 'C6')), ((0, 'C6'), (0, 'C5'), (0, 'N1'), (0, 'N6'))),\n+ '8MA': (((0, 'N6'), (0, 'H61'), (0, 'H62'), (0, 'C6')), ((0, 'C6'), (0, 'C5'), (0, 'N1'), (0, 'N6'))),\n+ 'INO': (((0, 'C6'), (0, 'C5'), (0, 'N1'), (0, 'O6')),),\n+ 'OMI': (((0, 'C6'), (0, 'C5'), (0, 'N1'), (0, 'O6')),),\n+ '1MI': (((0, 'C6'), (0, 'C5'), (0, 'N1'), (0, 'O6')),),\n+ 'MMI': (((0, 'C6'), (0, 'C5'), (0, 'N1'), (0, 'O6')),),\n+ 'SMA': (((0, 'C6'), (0, 'C5'), (0, 'N1'), (0, 'N6')),),\n+ '6AA': (((0, 'C10'), (0, 'C11'), (0, 'N6'), (0, 'O10')), ((0, 'C6'), (0, 'C5'), (0, 'N1'), (0, 'N6'))),\n+ '1MA': (((0, 'C6'), (0, 'N1'), (0, 'N6'), (0, 'C5')), ((0, 'N6'), (0, 'H62'), (0, 'H61'), (0, 'C6'))),\n+ 'M2A': (((0, 'C6'), (0, 'N1'), (0, 'N6'), (0, 'C5')), ((0, 'N6'), (0, 'H62'), (0, 'H61'), (0, 'C6'))),\n+ '6IA': (((0, 'C6'), (0, 'C5'), (0, 'N1'), (0, 'N6')),),\n+ 'HIA': (((0, 'C6'), (0, 'C5'), (0, 'N1'), (0, 'N6')),),\n+ 'MIA': (((0, 'C6'), (0, 'C5'), (0, 'N1'), (0, 'N6')),),\n+ 'SIA': (((0, 'C6'), (0, 'C5'), (0, 'N1'), (0, 'N6')),),\n+ 'HNA': (((0, 'C10'), (0, 'N6'), (0, 'N11'), (0, 'O10')), ((0, 'C13'), (0, 'ODB'), (0, 'ODA'), (0, 'C12')), ((0, 'C6'), (0, 'C5'), (0, 'N1'), (0, 'N6'))),\n+ '26A': (((0, 'C10'), (0, 'N6'), (0, 'N11'), (0, 'O10')), ((0, 'C13'), (0, 'ODB'), (0, 'ODA'), (0, 'C12')), ((0, 'C6'), (0, 'C5'), (0, 'N1'), (0, 'N6'))),\n+ '66A': (((0, 'C10'), (0, 'N6'), (0, 'N11'), (0, 'O10')), ((0, 'C13'), (0, 'ODB'), (0, 'ODA'), (0, 'C12')), ((0, 'C6'), (0, 'C5'), (0, 'N1'), (0, 'N6'))),\n+ 'T6A': (((0, 'C10'), (0, 'N6'), (0, 'N11'), (0, 'O10')), ((0, 'C13'), (0, 'ODB'), (0, 'ODA'), (0, 'C12')), ((0, 'C6'), (0, 'C5'), (0, 'N1'), (0, 'N6'))),\n+ '12A': (((0, 'C10'), (0, 'N6'), (0, 'N11'), (0, 'O10')), ((0, 'C13'), (0, 'ODB'), (0, 'ODA'), (0, 'C12')), ((0, 'C6'), (0, 'C5'), (0, 'N1'), (0, 'N6'))),\n+ '6GA': (((0, 'C10'), (0, 'N6'), (0, 'N11'), (0, 'O10')), ((0, 'C13'), (0, 'ODB'), (0, 'ODA'), (0, 'C12')), ((0, 'C6'), (0, 'C5'), (0, 'N1'), (0, 'N6'))),\n+ 'OMG': (((0, 'C2'), (0, 'N3'), (0, 'N1'), (0, 'N2')), ((0, 'C6'), (0, 'N1'), (0, 'C5'), (0, 'O6')), ((0, 'N2'), (0, 'H21'), (0, 'C2'), (0, 'H22'))),\n+ 'RIG': (((0, 'C2'), (0, 'N3'), (0, 'N1'), (0, 'N2')), ((0, 'C6'), (0, 'N1'), (0, 'C5'), (0, 'O6')), ((0, 'N2'), (0, 'H21'), (0, 'C2'), (0, 'H22'))),\n+ '1MG': (((0, 'C6'), (0, 'C5'), (0, 'N1'), (0, 'O6')), ((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'N2')), ((0, 'N2'), (0, 'H22'), (0, 'H21'), (0, 'C2'))),\n+ 'M1G': (((0, 'C6'), (0, 'C5'), (0, 'N1'), (0, 'O6')), ((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'N2')), ((0, 'N2'), (0, 'H22'), (0, 'H21'), (0, 'C2'))),\n+ '2MG': (((0, 'C6'), (0, 'C5'), (0, 'N1'), (0, 'O6')), ((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'N2'))),\n+ 'MMG': (((0, 'C6'), (0, 'C5'), (0, 'N1'), (0, 'O6')), ((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'N2'))),\n+ '7MG': (((0, 'C6'), (0, 'C5'), (0, 'N1'), (0, 'O6')), ((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'N2')), ((0, 'N2'), (0, 'H22'), (0, 'H21'), (0, 'C2'))),\n+ '27G': (((0, 'C6'), (0, 'C5'), (0, 'N1'), (0, 'O6')), ((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'N2'))),\n+ 'M7G': (((0, 'C6'), (0, 'C5'), (0, 'N1'), (0, 'O6')), ((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'N2'))),\n+ 'M2G': (((0, 'C6'), (0, 'C5'), (0, 'N1'), (0, 'O6')), ((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'N2'))),\n+ 'MTG': (((0, 'C6'), (0, 'C5'), (0, 'N1'), (0, 'O6')), ((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'N2'))),\n+ 'N2G': (((0, 'C6'), (0, 'C5'), (0, 'N1'), (0, 'O6')), ((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'N2'))),\n+ 'DCG': (((0, 'C6'), (0, 'C5'), (0, 'N1'), (0, 'O6')), ((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'N2')), ((0, 'N2'), (0, 'H22'), (0, 'H21'), (0, 'C2'))),\n+ 'RCG': (((0, 'C6'), (0, 'C5'), (0, 'N1'), (0, 'O6')), ((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'N2')), ((0, 'N2'), (0, 'H22'), (0, 'H21'), (0, 'C2')), ((0, 'C10'), (0, 'N12'), (0, 'N11'), (0, 'C7'))),\n+ 'DAG': (((0, 'C6'), (0, 'C5'), (0, 'N1'), (0, 'O6')), ((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'N2')), ((0, 'N2'), (0, 'H22'), (0, 'H21'), (0, 'C2'))),\n+ 'QUG': (((0, 'C6'), (0, 'C5'), (0, 'N1'), (0, 'O6')), ((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'N2')), ((0, 'N2'), (0, 'H22'), (0, 'H21'), (0, 'C2'))),\n+ 'EQG': (((0, 'C6'), (0, 'C5'), (0, 'N1'), (0, 'O6')), ((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'N2')), ((0, 'N2'), (0, 'H22'), (0, 'H21'), (0, 'C2'))),\n+ 'MQG': (((0, 'C6'), (0, 'C5'), (0, 'N1'), (0, 'O6')), ((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'N2')), ((0, 'N2'), (0, 'H22'), (0, 'H21'), (0, 'C2'))),\n+ 'GQG': (((0, 'C6'), (0, 'C5'), (0, 'N1'), (0, 'O6')), ((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'N2')), ((0, 'N2'), (0, 'H22'), (0, 'H21'), (0, 'C2'))),\n+ 'DWG': (((0, 'C6'), (0, 'C5'), (0, 'N1'), (0, 'O6')),),\n+ 'IMG': (((0, 'C6'), (0, 'C5'), (0, 'N1'), (0, 'O6')),),\n+ 'IWG': (((0, 'C6'), (0, 'C5'), (0, 'N1'), (0, 'O6')),),\n+ 'MWG': (((0, 'C6'), (0, 'C5'), (0, 'N1'), (0, 'O6')),),\n+ 'YYG': (((0, 'C6'), (0, 'C5'), (0, 'N1'), (0, 'O6')), ((0, 'C16'), (0, 'C15'), (0, 'O17'), (0, 'O18')), ((0, 'C21'), (0, 'N20'), (0, 'O22'), (0, 'O23'))),\n+ 'HWG': (((0, 'C6'), (0, 'C5'), (0, 'N1'), (0, 'O6')), ((0, 'C16'), (0, 'C15'), (0, 'O17'), (0, 'O18')), ((0, 'C21'), (0, 'N20'), (0, 'O22'), (0, 'O23'))),\n+ 'PBG': (((0, 'C6'), (0, 'C5'), (0, 'N1'), (0, 'O6')), ((0, 'C17'), (0, 'C16'), (0, 'O17'), (0, 'O18')), ((0, 'C21'), (0, 'N20'), (0, 'O22'), (0, 'O23'))),\n+ 'BMQG': (((0, 'C6'), (0, 'C5'), (0, 'N1'), (0, 'O6')), ((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'N2')), ((0, 'N2'), (0, 'H22'), (0, 'H21'), (0, 'C2'))),\n+ 'BGQG': (((0, 'C6'), (0, 'C5'), (0, 'N1'), (0, 'O6')), ((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'N2')), ((0, 'N2'), (0, 'H22'), (0, 'H21'), (0, 'C2'))),\n+ 'GMP': (((0, 'C2'), (0, 'N3'), (0, 'N1'), (0, 'N2')), ((0, 'C6'), (0, 'N1'), (0, 'C5'), (0, 'O6')), ((0, 'N2'), (0, 'H21'), (0, 'C2'), (0, 'H22'))),\n+ 'GDP': (((0, 'C2'), (0, 'N3'), (0, 'N1'), (0, 'N2')), ((0, 'C6'), (0, 'N1'), (0, 'C5'), (0, 'O6')), ((0, 'N2'), (0, 'H21'), (0, 'C2'), (0, 'H22'))),\n+ 'GTP': (((0, 'C2'), (0, 'N3'), (0, 'N1'), (0, 'N2')), ((0, 'C6'), (0, 'N1'), (0, 'C5'), (0, 'O6')), ((0, 'N2'), (0, 'H21'), (0, 'C2'), (0, 'H22'))),\n+ 'CMP': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'O2')), ((0, 'C4'), (0, 'N3'), (0, 'C5'), (0, 'N4')), ((0, 'N4'), (0, 'C4'), (0, 'H41'), (0, 'H42'))),\n+ 'CDP': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'O2')), ((0, 'C4'), (0, 'N3'), (0, 'C5'), (0, 'N4')), ((0, 'N4'), (0, 'C4'), (0, 'H41'), (0, 'H42'))),\n+ 'CTP': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'O2')), ((0, 'C4'), (0, 'N3'), (0, 'C5'), (0, 'N4')), ((0, 'N4'), (0, 'C4'), (0, 'H41'), (0, 'H42'))),\n+ 'TMP': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'O2')), ((0, 'C4'), (0, 'N3'), (0, 'C5'), (0, 'O4')), ((0, 'C5'), (0, 'C4'), (0, 'C6'), (0, 'C5M'))),\n+ 'TDP': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'O2')), ((0, 'C4'), (0, 'N3'), (0, 'C5'), (0, 'O4')), ((0, 'C5'), (0, 'C4'), (0, 'C6'), (0, 'C5M'))),\n+ 'TTP': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'O2')), ((0, 'C4'), (0, 'N3'), (0, 'C5'), (0, 'O4')), ((0, 'C5'), (0, 'C4'), (0, 'C6'), (0, 'C5M'))),\n+ 'UMP': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'O2')), ((0, 'C4'), (0, 'N3'), (0, 'C5'), (0, 'O4'))),\n+ 'UDP': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'O2')), ((0, 'C4'), (0, 'N3'), (0, 'C5'), (0, 'O4'))),\n+ 'UTP': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'O2')), ((0, 'C4'), (0, 'N3'), (0, 'C5'), (0, 'O4'))),\n+ 'NAI': (((0, 'N6A'), (0, 'C6A'), (0, 'H61A'), (0, 'H62A')), ((0, 'C6A'), (0, 'N1A'), (0, 'C5A'), (0, 'N6A')), ((0, 'C7N'), (0, 'N7N'), (0, 'C3N'), (0, 'O7N')), ((0, 'C7N'), (0, 'C3N'), (0, 'N7N'), (0, 'O7N')), ((0, 'N7N'), (0, 'C7N'), (0, 'H71N'), (0, 'H72N')), ((0, 'N7N'), (0, 'C7N'), (0, 'H72N'), (0, 'H71N')), ((0, 'C6N'), (0, 'N1N'), (0, 'C5N'), (0, 'HN6')), ((0, 'C5N'), (0, 'C6N'), (0, 'C4N'), (0, 'H5N')), ((0, 'C4N'), (0, 'C5N'), (0, 'C3N'), (0, 'H41N')), ((0, 'C2N'), (0, 'C3N'), (0, 'N1N'), (0, 'H2N'))),\n+ 'NAP': (((0, 'N6A'), (0, 'C6A'), (0, 'H61A'), (0, 'H62A')), ((0, 'C6A'), (0, 'N1A'), (0, 'C5A'), (0, 'N6A')), ((0, 'C7N'), (0, 'N7N'), (0, 'C3N'), (0, 'O7N')), ((0, 'C7N'), (0, 'C3N'), (0, 'N7N'), (0, 'O7N')), ((0, 'N7N'), (0, 'C7N'), (0, 'H71N'), (0, 'H72N')), ((0, 'N7N'), (0, 'C7N'), (0, 'H72N'), (0, 'H71N')), ((0, 'C6N'), (0, 'N1N'), (0, 'C5N'), (0, 'HN6')), ((0, 'C5N'), (0, 'C6N'), (0, 'C4N'), (0, 'H5N')), ((0, 'C4N'), (0, 'C5N'), (0, 'C3N'), (0, 'H41N')), ((0, 'C2N'), (0, 'C3N'), (0, 'N1N'), (0, 'H2N'))),\n+ 'NDP': (((0, 'N6A'), (0, 'C6A'), (0, 'H61A'), (0, 'H62A')), ((0, 'C6A'), (0, 'N1A'), (0, 'C5A'), (0, 'N6A')), ((0, 'C7N'), (0, 'N7N'), (0, 'C3N'), (0, 'O7N')), ((0, 'C7N'), (0, 'C3N'), (0, 'N7N'), (0, 'O7N')), ((0, 'N7N'), (0, 'C7N'), (0, 'H71N'), (0, 'H72N')), ((0, 'N7N'), (0, 'C7N'), (0, 'H72N'), (0, 'H71N')), ((0, 'C6N'), (0, 'N1N'), (0, 'C5N'), (0, 'HN6')), ((0, 'C5N'), (0, 'C6N'), (0, 'C4N'), (0, 'H5N')), ((0, 'C4N'), (0, 'C5N'), (0, 'C3N'), (0, 'H41N')), ((0, 'C2N'), (0, 'C3N'), (0, 'N1N'), (0, 'H2N'))),\n+ 'NAD1': (((0, 'AN6'), (0, 'AC6'), (0, 'AH61'), (0, 'AH62')), ((0, 'AC6'), (0, 'AN1'), (0, 'AC5'), (0, 'AN6')), ((0, 'NC7'), (0, 'NN7'), (0, 'NC3'), (0, 'NO7')), ((0, 'NC7'), (0, 'NC3'), (0, 'NN7'), (0, 'NO7')), ((0, 'NN7'), (0, 'NC7'), (0, 'NH71'), (0, 'NH72')), ((0, 'NN7'), (0, 'NC7'), (0, 'NH72'), (0, 'NH71')), ((0, 'NC6'), (0, 'NN1'), (0, 'NC5'), (0, 'NH6')), ((0, 'NC5'), (0, 'NC6'), (0, 'NC4'), (0, 'NH5')), ((0, 'NC4'), (0, 'NC5'), (0, 'NC3'), (0, 'NH4')), ((0, 'NC2'), (0, 'NC3'), (0, 'NN1'), (0, 'NH2'))),\n+ 'PTS': (((0, 'PX'), (0, 'O1X'), (0, 'O2X'), (0, \"O3'\")),),\n+ 'ANE5GC': (((0, 'C'), (0, 'C10'), (0, 'N'), (0, 'O')), ((0, 'N'), (0, 'C'), (0, 'C5'), (0, 'HN'))),\n+ 'BNE5GC': (((0, 'C'), (0, 'C10'), (0, 'N'), (0, 'O')), ((0, 'N'), (0, 'C'), (0, 'C5'), (0, 'HN'))),\n+ 'AMANNA': (((0, 'C'), (0, 'CT'), (0, 'N'), (0, 'O')), ((0, 'N'), (0, 'C'), (0, 'C2'), (0, 'HN'))),\n+ 'BMANNA': (((0, 'C'), (0, 'CT'), (0, 'N'), (0, 'O')), ((0, 'N'), (0, 'C'), (0, 'C2'), (0, 'HN'))),\n+ 'AGULNA': (((0, 'C'), (0, 'CT'), (0, 'N'), (0, 'O')), ((0, 'N'), (0, 'C'), (0, 'C2'), (0, 'HN'))),\n+ 'BGULNA': (((0, 'C'), (0, 'CT'), (0, 'N'), (0, 'O')), ((0, 'N'), (0, 'C'), (0, 'C2'), (0, 'HN'))),\n+ 'AALTNA': (((0, 'C'), (0, 'CT'), (0, 'N'), (0, 'O')), ((0, 'N'), (0, 'C'), (0, 'C2'), (0, 'HN'))),\n+ 'BALTNA': (((0, 'C'), (0, 'CT'), (0, 'N'), (0, 'O')), ((0, 'N'), (0, 'C'), (0, 'C2'), (0, 'HN'))),\n+ 'ALGLNA': (((0, 'C'), (0, 'CT'), (0, 'N'), (0, 'O')), ((0, 'N'), (0, 'C'), (0, 'C2'), (0, 'HN'))),\n+ 'BLGLNA': (((0, 'C'), (0, 'CT'), (0, 'N'), (0, 'O')), ((0, 'N'), (0, 'C'), (0, 'C2'), (0, 'HN'))),\n+ 'ALMANA': (((0, 'C'), (0, 'CT'), (0, 'N'), (0, 'O')), ((0, 'N'), (0, 'C'), (0, 'C2'), (0, 'HN'))),\n+ 'BLMANA': (((0, 'C'), (0, 'CT'), (0, 'N'), (0, 'O')), ((0, 'N'), (0, 'C'), (0, 'C2'), (0, 'HN'))),\n+ 'ALGANA': (((0, 'C'), (0, 'CT'), (0, 'N'), (0, 'O')), ((0, 'N'), (0, 'C'), (0, 'C2'), (0, 'HN'))),\n+ 'BLGANA': (((0, 'C'), (0, 'CT'), (0, 'N'), (0, 'O')), ((0, 'N'), (0, 'C'), (0, 'C2'), (0, 'HN'))),\n+ 'ALGUNA': (((0, 'C'), (0, 'CT'), (0, 'N'), (0, 'O')), ((0, 'N'), (0, 'C'), (0, 'C2'), (0, 'HN'))),\n+ 'BLGUNA': (((0, 'C'), (0, 'CT'), (0, 'N'), (0, 'O')), ((0, 'N'), (0, 'C'), (0, 'C2'), (0, 'HN'))),\n+ 'ALALNA': (((0, 'C'), (0, 'CT'), (0, 'N'), (0, 'O')), ((0, 'N'), (0, 'C'), (0, 'C2'), (0, 'HN'))),\n+ 'BLALNA': (((0, 'C'), (0, 'CT'), (0, 'N'), (0, 'O')), ((0, 'N'), (0, 'C'), (0, 'C2'), (0, 'HN'))),\n+ 'ALTANA': (((0, 'C'), (0, 'CT'), (0, 'N'), (0, 'O')), ((0, 'N'), (0, 'C'), (0, 'C2'), (0, 'HN'))),\n+ 'BLTANA': (((0, 'C'), (0, 'CT'), (0, 'N'), (0, 'O')), ((0, 'N'), (0, 'C'), (0, 'C2'), (0, 'HN'))),\n+ 'ALIDNA': (((0, 'C'), (0, 'CT'), (0, 'N'), (0, 'O')), ((0, 'N'), (0, 'C'), (0, 'C2'), (0, 'HN'))),\n+ 'BLIDNA': (((0, 'C'), (0, 'CT'), (0, 'N'), (0, 'O')), ((0, 'N'), (0, 'C'), (0, 'C2'), (0, 'HN'))),\n+ 'AALLNA': (((0, 'C'), (0, 'CT'), (0, 'N'), (0, 'O')), ((0, 'N'), (0, 'C'), (0, 'C2'), (0, 'HN'))),\n+ 'BALLNA': (((0, 'C'), (0, 'CT'), (0, 'N'), (0, 'O')), ((0, 'N'), (0, 'C'), (0, 'C2'), (0, 'HN'))),\n+ 'ATALNA': (((0, 'C'), (0, 'CT'), (0, 'N'), (0, 'O')), ((0, 'N'), (0, 'C'), (0, 'C2'), (0, 'HN'))),\n+ 'BTALNA': (((0, 'C'), (0, 'CT'), (0, 'N'), (0, 'O')), ((0, 'N'), (0, 'C'), (0, 'C2'), (0, 'HN'))),\n+ 'AIDONA': (((0, 'C'), (0, 'CT'), (0, 'N'), (0, 'O')), ((0, 'N'), (0, 'C'), (0, 'C2'), (0, 'HN'))),\n+ 'BIDONA': (((0, 'C'), (0, 'CT'), (0, 'N'), (0, 'O')), ((0, 'N'), (0, 'C'), (0, 'C2'), (0, 'HN'))),\n+ 'AMANA': (((0, 'C6'), (0, 'C5'), (0, 'O62'), (0, 'O61')),),\n+ 'BMANA': (((0, 'C6'), (0, 'C5'), (0, 'O62'), (0, 'O61')),),\n+ 'AGULA': (((0, 'C6'), (0, 'C5'), (0, 'O62'), (0, 'O61')),),\n+ 'BGULA': (((0, 'C6'), (0, 'C5'), (0, 'O62'), (0, 'O61')),),\n+ 'AALTA': (((0, 'C6'), (0, 'C5'), (0, 'O62'), (0, 'O61')),),\n+ 'BALTA': (((0, 'C6'), (0, 'C5'), (0, 'O62'), (0, 'O61')),),\n+ 'AALLA': (((0, 'C6'), (0, 'C5'), (0, 'O62'), (0, 'O61')),),\n+ 'BALLA': (((0, 'C6'), (0, 'C5'), (0, 'O62'), (0, 'O61')),),\n+ 'ATALA': (((0, 'C6'), (0, 'C5'), (0, 'O62'), (0, 'O61')),),\n+ 'BTALA': (((0, 'C6'), (0, 'C5'), (0, 'O62'), (0, 'O61')),),\n+ 'ARHMNA': (((0, 'C'), (0, 'CT'), (0, 'N'), (0, 'O')), ((0, 'N'), (0, 'C'), (0, 'C2'), (0, 'HN'))),\n+ 'BRHMNA': (((0, 'C'), (0, 'CT'), (0, 'N'), (0, 'O')), ((0, 'N'), (0, 'C'), (0, 'C2'), (0, 'HN'))),\n+ 'AFUCNA': (((0, 'C'), (0, 'CT'), (0, 'N'), (0, 'O')), ((0, 'N'), (0, 'C'), (0, 'C2'), (0, 'HN'))),\n+ 'BFUCNA': (((0, 'C'), (0, 'CT'), (0, 'N'), (0, 'O')), ((0, 'N'), (0, 'C'), (0, 'C2'), (0, 'HN'))),\n+ 'ANEU': (((0, 'C1'), (0, 'C2'), (0, 'O12'), (0, 'O11')),),\n+ 'BNEU': (((0, 'C1'), (0, 'C2'), (0, 'O12'), (0, 'O11')),),\n+ 'ADHA': (((0, 'C7'), (0, 'C6'), (0, 'O72'), (0, 'O71')),),\n+ 'BDHA': (((0, 'C7'), (0, 'C6'), (0, 'O72'), (0, 'O71')),),\n+ 'ALGULA': (((0, 'C6'), (0, 'C5'), (0, 'O62'), (0, 'O61')),),\n+ 'BLGULA': (((0, 'C6'), (0, 'C5'), (0, 'O62'), (0, 'O61')),),\n+ 'ALALTA': (((0, 'C6'), (0, 'C5'), (0, 'O62'), (0, 'O61')),),\n+ 'BLALTA': (((0, 'C6'), (0, 'C5'), (0, 'O62'), (0, 'O61')),),\n+ 'AMU2AC': (((0, 'C'), (0, 'CT'), (0, 'N2'), (0, 'O')), ((0, 'N2'), (0, 'C'), (0, 'C2'), (0, 'HN2'))),\n+ 'BMU2AC': (((0, 'C'), (0, 'CT'), (0, 'N2'), (0, 'O')), ((0, 'N2'), (0, 'C'), (0, 'C2'), (0, 'HN2'))),\n+ 'AMU2GC': (((0, 'C'), (0, 'C10'), (0, 'N2'), (0, 'O')), ((0, 'N2'), (0, 'C'), (0, 'C2'), (0, 'HN2'))),\n+ 'BMU2GC': (((0, 'C'), (0, 'C10'), (0, 'N2'), (0, 'O')), ((0, 'N2'), (0, 'C'), (0, 'C2'), (0, 'HN2'))),\n+ 'BKDN': (((0, 'C1'), (0, 'C2'), (0, 'O12'), (0, 'O11')),),\n+ 'AKDN': (((0, 'C1'), (0, 'C2'), (0, 'O12'), (0, 'O11')),),\n+ 'QUITA': (((0, 'C'), (0, 'CT'), (0, 'N'), (0, 'O')), ((0, 'N'), (0, 'C'), (0, 'C3'), (0, 'HN'))),\n+ 'BGLGL': (((0, 'CT'), (0, 'CA'), (0, 'OT2'), (0, 'OT1')),),\n+ 'AQUINA': (((0, 'C'), (0, 'CT'), (0, 'N'), (0, 'O')), ((0, 'N'), (0, 'C'), (0, 'C2'), (0, 'HN'))),\n+ 'BQUINA': (((0, 'C'), (0, 'CT'), (0, 'N'), (0, 'O')), ((0, 'N'), (0, 'C'), (0, 'C2'), (0, 'HN'))),\n+ 'AGALAA': (((0, 'C'), (0, 'CA'), (0, 'N'), (0, 'O')), ((0, 'N'), (0, 'C'), (0, 'C2'), (0, 'HN'))),\n+ 'AGLAA': (((0, 'C'), (0, 'CT'), (0, 'N'), (0, 'O')), ((0, 'N'), (0, 'C'), (0, 'C2'), (0, 'HN')), ((0, 'C6'), (0, 'C5'), (0, 'O62'), (0, 'O61'))),\n+ 'ALGLAA': (((0, 'C'), (0, 'CT'), (0, 'N'), (0, 'O')), ((0, 'N'), (0, 'C'), (0, 'C2'), (0, 'HN')), ((0, 'C6'), (0, 'C5'), (0, 'O62'), (0, 'O61'))),\n+ 'BLEG': (((0, 'C51'), (0, 'CT51'), (0, 'N51'), (0, 'O51')), ((0, 'N51'), (0, 'C51'), (0, 'C5'), (0, 'HN51')), ((0, 'C71'), (0, 'CT71'), (0, 'N71'), (0, 'O71')), ((0, 'N71'), (0, 'C71'), (0, 'C7'), (0, 'HN71'))),\n+ 'ALEG': (((0, 'C51'), (0, 'CT51'), (0, 'N51'), (0, 'O51')), ((0, 'N51'), (0, 'C51'), (0, 'C5'), (0, 'HN51')), ((0, 'C71'), (0, 'CT71'), (0, 'N71'), (0, 'O71')), ((0, 'N71'), (0, 'C71'), (0, 'C7'), (0, 'HN71'))),\n+ 'A8LEG': (((0, 'C51'), (0, 'CT51'), (0, 'N51'), (0, 'O51')), ((0, 'N51'), (0, 'C51'), (0, 'C5'), (0, 'HN51')), ((0, 'C71'), (0, 'CT71'), (0, 'N71'), (0, 'O71')), ((0, 'N71'), (0, 'C71'), (0, 'C7'), (0, 'HN71'))),\n+ 'B8LEG': (((0, 'C51'), (0, 'CT51'), (0, 'N51'), (0, 'O51')), ((0, 'N51'), (0, 'C51'), (0, 'C5'), (0, 'HN51')), ((0, 'C71'), (0, 'CT71'), (0, 'N71'), (0, 'O71')), ((0, 'N71'), (0, 'C71'), (0, 'C7'), (0, 'HN71'))),\n+ 'APSE': (((0, 'C51'), (0, 'CT51'), (0, 'N51'), (0, 'O51')), ((0, 'N51'), (0, 'C51'), (0, 'C5'), (0, 'HN51')), ((0, 'C71'), (0, 'CT71'), (0, 'N71'), (0, 'O71')), ((0, 'N71'), (0, 'C71'), (0, 'C7'), (0, 'HN71'))),\n+ 'BPSE': (((0, 'C51'), (0, 'CT51'), (0, 'N51'), (0, 'O51')), ((0, 'N51'), (0, 'C51'), (0, 'C5'), (0, 'HN51')), ((0, 'C71'), (0, 'CT71'), (0, 'N71'), (0, 'O71')), ((0, 'N71'), (0, 'C71'), (0, 'C7'), (0, 'HN71'))),\n+ 'DGLYA': (((0, 'C1'), (0, 'C2'), (0, 'O1B'), (0, 'O1A')),),\n+ 'SAPI': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))),\n+ 'SAPI13': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))),\n+ 'SAPI14': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))),\n+ 'SAPI15': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))),\n+ 'SAPI24': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))),\n+ 'SAPI25': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))),\n+ 'SAPI2A': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))),\n+ 'SAPI2B': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))),\n+ 'SAPI2C': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))),\n+ 'SAPI2D': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))),\n+ 'SAPI33': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))),\n+ 'SAPI34': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))),\n+ 'SAPI35': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))),\n+ 'DMPI': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))),\n+ 'DMPI13': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))),\n+ 'DMPI14': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))),\n+ 'DMPI15': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))),\n+ 'DMPI24': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))),\n+ 'DMPI25': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))),\n+ 'DMPI2A': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))),\n+ 'DMPI2B': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))),\n+ 'DMPI2C': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))),\n+ 'DMPI2D': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))),\n+ 'DMPI33': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))),\n+ 'DMPI34': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))),\n+ 'DMPI35': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))),\n+ 'DLIPI': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))),\n+ 'POPI': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))),\n+ 'POPI13': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))),\n+ 'POPI14': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))),\n+ 'POPI15': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))),\n+ 'POPI24': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))),\n+ 'POPI25': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))),\n+ 'POPI2A': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))),\n+ 'POPI2B': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))),\n+ 'POPI2D': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))),\n+ 'POPI2C': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))),\n+ 'POPI33': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))),\n+ 'POPI34': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))),\n+ 'POPI35': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))),\n+ 'PNPI': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))),\n+ 'PNPI13': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))),\n+ 'PNPI14': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))),\n+ 'PNPI15': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))),\n+ 'PNPI24': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))),\n+ 'PNPI25': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))),\n+ 'PNPI2A': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))),\n+ 'PNPI2B': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))),\n+ 'PNPI2C': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))),\n+ 'PNPI2D': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))),\n+ 'PNPI33': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))),\n+ 'PNPI34': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))),\n+ 'PNPI35': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))),\n+ 'PLPI': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))),\n+ 'PLPI13': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))),\n+ 'PLPI14': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))),\n+ 'PLPI15': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))),\n+ 'PLPI24': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))),\n+ 'PLPI25': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))),\n+ 'PLPI2A': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))),\n+ 'PLPI2B': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))),\n+ 'PLPI2C': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))),\n+ 'PLPI2D': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))),\n+ 'PLPI33': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))),\n+ 'PLPI34': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))),\n+ 'PLPI35': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))),\n+ 'PYPI': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))),\n+ 'PSM': (((0, 'C1F'), (0, 'C2F'), (0, 'NF'), (0, 'OF')), ((0, 'NF'), (0, 'C1F'), (0, 'C2S'), (0, 'HNF'))),\n+ 'SSM': (((0, 'C1F'), (0, 'C2F'), (0, 'NF'), (0, 'OF')), ((0, 'NF'), (0, 'C1F'), (0, 'C2S'), (0, 'HNF'))),\n+ 'OSM': (((0, 'C1F'), (0, 'C2F'), (0, 'NF'), (0, 'OF')), ((0, 'NF'), (0, 'C1F'), (0, 'C2S'), (0, 'HNF'))),\n+ 'ASM': (((0, 'C1F'), (0, 'C2F'), (0, 'NF'), (0, 'OF')), ((0, 'NF'), (0, 'C1F'), (0, 'C2S'), (0, 'HNF'))),\n+ 'BSM': (((0, 'C1F'), (0, 'C2F'), (0, 'NF'), (0, 'OF')), ((0, 'NF'), (0, 'C1F'), (0, 'C2S'), (0, 'HNF'))),\n+ '23SM': (((0, 'C1F'), (0, 'C2F'), (0, 'NF'), (0, 'OF')), ((0, 'NF'), (0, 'C1F'), (0, 'C2S'), (0, 'HNF'))),\n+ 'LSM': (((0, 'C1F'), (0, 'C2F'), (0, 'NF'), (0, 'OF')), ((0, 'NF'), (0, 'C1F'), (0, 'C2S'), (0, 'HNF'))),\n+ 'NSM': (((0, 'C1F'), (0, 'C2F'), (0, 'NF'), (0, 'OF')), ((0, 'NF'), (0, 'C1F'), (0, 'C2S'), (0, 'HNF'))),\n+ 'CER2': (((0, 'C1F'), (0, 'C2F'), (0, 'NF'), (0, 'OF')), ((0, 'NF'), (0, 'C1F'), (0, 'C2S'), (0, 'HNF'))),\n+ 'CER160': (((0, 'C1F'), (0, 'C2F'), (0, 'NF'), (0, 'OF')), ((0, 'NF'), (0, 'C1F'), (0, 'C2S'), (0, 'HNF'))),\n+ 'CER180': (((0, 'C1F'), (0, 'C2F'), (0, 'NF'), (0, 'OF')), ((0, 'NF'), (0, 'C1F'), (0, 'C2S'), (0, 'HNF'))),\n+ 'CER181': (((0, 'C1F'), (0, 'C2F'), (0, 'NF'), (0, 'OF')), ((0, 'NF'), (0, 'C1F'), (0, 'C2S'), (0, 'HNF'))),\n+ 'CER200': (((0, 'C1F'), (0, 'C2F'), (0, 'NF'), (0, 'OF')), ((0, 'NF'), (0, 'C1F'), (0, 'C2S'), (0, 'HNF'))),\n+ 'CER220': (((0, 'C1F'), (0, 'C2F'), (0, 'NF'), (0, 'OF')), ((0, 'NF'), (0, 'C1F'), (0, 'C2S'), (0, 'HNF'))),\n+ 'CER240': (((0, 'C1F'), (0, 'C2F'), (0, 'NF'), (0, 'OF')), ((0, 'NF'), (0, 'C1F'), (0, 'C2S'), (0, 'HNF'))),\n+ 'CER241': (((0, 'C1F'), (0, 'C2F'), (0, 'NF'), (0, 'OF')), ((0, 'NF'), (0, 'C1F'), (0, 'C2S'), (0, 'HNF'))),\n+ 'CER3E': (((0, 'C1F'), (0, 'C2F'), (0, 'NF'), (0, 'OF')), ((0, 'NF'), (0, 'C1F'), (0, 'C2S'), (0, 'HNF'))),\n+ 'PYPE': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))),\n+ 'YOPA': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))),\n+ 'DYPC': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))),\n+ 'YOPC': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))),\n+ 'DYPE': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))),\n+ 'YOPE': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))),\n+ 'YOPS': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32')), ((0, 'C13'), (0, 'C12'), (0, 'O13B'), (0, 'O13A'))),\n+ 'C7DHPC': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))),\n+ 'C6DHPC': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))),\n+ 'LMPG': (((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32')),),\n+ 'LPPG': (((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32')),),\n+ 'LPC12': (((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32')),),\n+ 'LPC14': (((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32')),),\n+ 'MYR': (((0, 'C1'), (0, 'O1'), (0, 'C2'), (0, 'O2')),),\n+ 'PAL': (((0, 'C1'), (0, 'O1'), (0, 'C2'), (0, 'O2')),),\n+ 'STE': (((0, 'C1'), (0, 'O1'), (0, 'C2'), (0, 'O2')),),\n+ 'ARA': (((0, 'C1'), (0, 'O1'), (0, 'C2'), (0, 'O2')),),\n+ 'BEH': (((0, 'C1'), (0, 'O1'), (0, 'C2'), (0, 'O2')),),\n+ 'TRI': (((0, 'C1'), (0, 'O1'), (0, 'C2'), (0, 'O2')),),\n+ 'LIGN': (((0, 'C1'), (0, 'O1'), (0, 'C2'), (0, 'O2')),),\n+ 'MYRO': (((0, 'C1'), (0, 'O1'), (0, 'C2'), (0, 'O2')),),\n+ 'PALO': (((0, 'C1'), (0, 'O1'), (0, 'C2'), (0, 'O2')),),\n+ 'HTA': (((0, 'C1'), (0, 'O1'), (0, 'C2'), (0, 'O2')),),\n+ 'OLE': (((0, 'C1'), (0, 'O1'), (0, 'C2'), (0, 'O2')),),\n+ 'LIN': (((0, 'C1'), (0, 'O1'), (0, 'C2'), (0, 'O2')),),\n+ 'ALIN': (((0, 'C1'), (0, 'O1'), (0, 'C2'), (0, 'O2')),),\n+ 'SDA': (((0, 'C1'), (0, 'O1'), (0, 'C2'), (0, 'O2')),),\n+ 'GLA': (((0, 'C1'), (0, 'O1'), (0, 'C2'), (0, 'O2')),),\n+ 'EICO': (((0, 'C1'), (0, 'O1'), (0, 'C2'), (0, 'O2')),),\n+ 'EDA': (((0, 'C1'), (0, 'O1'), (0, 'C2'), (0, 'O2')),),\n+ 'MEA': (((0, 'C1'), (0, 'O1'), (0, 'C2'), (0, 'O2')),),\n+ 'DGLA': (((0, 'C1'), (0, 'O1'), (0, 'C2'), (0, 'O2')),),\n+ 'ETE': (((0, 'C1'), (0, 'O1'), (0, 'C2'), (0, 'O2')),),\n+ 'ETA': (((0, 'C1'), (0, 'O1'), (0, 'C2'), (0, 'O2')),),\n+ 'EPA': (((0, 'C1'), (0, 'O1'), (0, 'C2'), (0, 'O2')),),\n+ 'ARAN': (((0, 'C1'), (0, 'O1'), (0, 'C2'), (0, 'O2')),),\n+ 'HPA': (((0, 'C1'), (0, 'O1'), (0, 'C2'), (0, 'O2')),),\n+ 'ERU': (((0, 'C1'), (0, 'O1'), (0, 'C2'), (0, 'O2')),),\n+ 'DDA': (((0, 'C1'), (0, 'O1'), (0, 'C2'), (0, 'O2')),),\n+ 'ADR': (((0, 'C1'), (0, 'O1'), (0, 'C2'), (0, 'O2')),),\n+ 'DPT': (((0, 'C1'), (0, 'O1'), (0, 'C2'), (0, 'O2')),),\n+ 'DPA': (((0, 'C1'), (0, 'O1'), (0, 'C2'), (0, 'O2')),),\n+ 'DHA': (((0, 'C1'), (0, 'O1'), (0, 'C2'), (0, 'O2')),),\n+ 'NER': (((0, 'C1'), (0, 'O1'), (0, 'C2'), (0, 'O2')),),\n+ 'TTA': (((0, 'C1'), (0, 'O1'), (0, 'C2'), (0, 'O2')),),\n+ 'TPT': (((0, 'C1'), (0, 'O1'), (0, 'C2'), (0, 'O2')),),\n+ 'TPA': (((0, 'C1'), (0, 'O1'), (0, 'C2'), (0, 'O2')),),\n+ 'THA': (((0, 'C1'), (0, 'O1'), (0, 'C2'), (0, 'O2')),),\n+ 'MYRP': (((0, 'C1'), (0, 'O1'), (0, 'C2'), (0, 'O2')),),\n+ 'PALP': (((0, 'C1'), (0, 'O1'), (0, 'C2'), (0, 'O2')),),\n+ 'STEP': (((0, 'C1'), (0, 'O1'), (0, 'C2'), (0, 'O2')),),\n+ 'ARAP': (((0, 'C1'), (0, 'O1'), (0, 'C2'), (0, 'O2')),),\n+ 'BEHP': (((0, 'C1'), (0, 'O1'), (0, 'C2'), (0, 'O2')),),\n+ 'TRIP': (((0, 'C1'), (0, 'O1'), (0, 'C2'), (0, 'O2')),),\n+ 'LIGNP': (((0, 'C1'), (0, 'O1'), (0, 'C2'), (0, 'O2')),),\n+ 'MYROP': (((0, 'C1'), (0, 'O1'), (0, 'C2'), (0, 'O2')),),\n+ 'PALOP': (((0, 'C1'), (0, 'O1'), (0, 'C2'), (0, 'O2')),),\n+ 'HTAP': (((0, 'C1'), (0, 'O1'), (0, 'C2'), (0, 'O2')),),\n+ 'OLEP': (((0, 'C1'), (0, 'O1'), (0, 'C2'), (0, 'O2')),),\n+ 'LINP': (((0, 'C1'), (0, 'O1'), (0, 'C2'), (0, 'O2')),),\n+ 'ALINP': (((0, 'C1'), (0, 'O1'), (0, 'C2'), (0, 'O2')),),\n+ 'SDAP': (((0, 'C1'), (0, 'O1'), (0, 'C2'), (0, 'O2')),),\n+ 'GLAP': (((0, 'C1'), (0, 'O1'), (0, 'C2'), (0, 'O2')),),\n+ 'EICOP': (((0, 'C1'), (0, 'O1'), (0, 'C2'), (0, 'O2')),),\n+ 'EDAP': (((0, 'C1'), (0, 'O1'), (0, 'C2'), (0, 'O2')),),\n+ 'MEAP': (((0, 'C1'), (0, 'O1'), (0, 'C2'), (0, 'O2')),),\n+ 'DGLAP': (((0, 'C1'), (0, 'O1'), (0, 'C2'), (0, 'O2')),),\n+ 'ETEP': (((0, 'C1'), (0, 'O1'), (0, 'C2'), (0, 'O2')),),\n+ 'ETAP': (((0, 'C1'), (0, 'O1'), (0, 'C2'), (0, 'O2')),),\n+ 'EPAP': (((0, 'C1'), (0, 'O1'), (0, 'C2'), (0, 'O2')),),\n+ 'ARANP': (((0, 'C1'), (0, 'O1'), (0, 'C2'), (0, 'O2')),),\n+ 'HPAP': (((0, 'C1'), (0, 'O1'), (0, 'C2'), (0, 'O2')),),\n+ 'ERUP': (((0, 'C1'), (0, 'O1'), (0, 'C2'), (0, 'O2')),),\n+ 'DDAP': (((0, 'C1'), (0, 'O1'), (0, 'C2'), (0, 'O2')),),\n+ 'ADRP': (((0, 'C1'), (0, 'O1'), (0, 'C2'), (0, 'O2')),),\n+ 'DPTP': (((0, 'C1'), (0, 'O1'), (0, 'C2'), (0, 'O2')),),\n+ 'DPAP': (((0, 'C1'), (0, 'O1'), (0, 'C2'), (0, 'O2')),),\n+ 'DHAP': (((0, 'C1'), (0, 'O1'), (0, 'C2'), (0, 'O2')),),\n+ 'NERP': (((0, 'C1'), (0, 'O1'), (0, 'C2'), (0, 'O2')),),\n+ 'TTAP': (((0, 'C1'), (0, 'O1'), (0, 'C2'), (0, 'O2')),),\n+ 'TPTP': (((0, 'C1'), (0, 'O1'), (0, 'C2'), (0, 'O2')),),\n+ 'TPAP': (((0, 'C1'), (0, 'O1'), (0, 'C2'), (0, 'O2')),),\n+ 'THAP': (((0, 'C1'), (0, 'O1'), (0, 'C2'), (0, 'O2')),),\n+ 'THDPPC': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))),\n+ 'CYSP': (((0, 'C1'), (0, 'O1'), (0, 'SG'), (0, 'C2')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'GLYM': (((0, 'C1'), (0, 'O1'), (0, 'N'), (0, 'C2')), ((0, 'N'), (0, 'C1'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'LYSM': (((0, 'C1'), (0, 'O1'), (0, 'N'), (0, 'C2')), ((0, 'N'), (0, 'C1'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O'))),\n+ 'CYSL': (((0, 'CA1'), (0, 'OA1'), (0, 'N'), (0, 'CA2')), ((0, 'N'), (0, 'CA1'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O')), ((0, 'CD1'), (0, 'O12'), (0, 'CD2'), (0, 'OD1')), ((0, 'CX1'), (0, 'O11'), (0, 'CX2'), (0, 'OX1'))),\n+ 'ABLIPA': (((0, 'C11'), (0, 'C12'), (0, 'NA2'), (0, 'O11')), ((0, 'NA2'), (0, 'C11'), (0, 'CA2'), (0, 'HNA2')), ((0, 'C51'), (0, 'C52'), (0, 'NB2'), (0, 'O51')), ((0, 'NB2'), (0, 'C51'), (0, 'CB2'), (0, 'HNB2'))),\n+ 'ABLIPB': (((0, 'C11'), (0, 'C12'), (0, 'NA2'), (0, 'O11')), ((0, 'NA2'), (0, 'C11'), (0, 'CA2'), (0, 'HNA2')), ((0, 'C51'), (0, 'C52'), (0, 'NB2'), (0, 'O51')), ((0, 'NB2'), (0, 'C51'), (0, 'CB2'), (0, 'HNB2'))),\n+ 'BCLIPA': (((0, 'C11'), (0, 'C12'), (0, 'NA2'), (0, 'O11')), ((0, 'NA2'), (0, 'C11'), (0, 'CA2'), (0, 'HNA2')), ((0, 'C51'), (0, 'C52'), (0, 'NB2'), (0, 'O51')), ((0, 'NB2'), (0, 'C51'), (0, 'CB2'), (0, 'HNB2'))),\n+ 'BCLIPB': (((0, 'C11'), (0, 'C12'), (0, 'NA2'), (0, 'O11')), ((0, 'NA2'), (0, 'C11'), (0, 'CA2'), (0, 'HNA2')), ((0, 'C51'), (0, 'C52'), (0, 'NB2'), (0, 'O51')), ((0, 'NB2'), (0, 'C51'), (0, 'CB2'), (0, 'HNB2'))),\n+ 'BCLIPC': (((0, 'C11'), (0, 'C12'), (0, 'NA2'), (0, 'O11')), ((0, 'NA2'), (0, 'C11'), (0, 'CA2'), (0, 'HNA2')), ((0, 'C51'), (0, 'C52'), (0, 'NB2'), (0, 'O51')), ((0, 'NB2'), (0, 'C51'), (0, 'CB2'), (0, 'HNB2'))),\n+ 'CJLIPA': (((0, 'C11'), (0, 'C12'), (0, 'NA2'), (0, 'O11')), ((0, 'NA2'), (0, 'C11'), (0, 'CA2'), (0, 'HNA2')), ((0, 'C51'), (0, 'C52'), (0, 'NB2'), (0, 'O51')), ((0, 'NB2'), (0, 'C51'), (0, 'CB2'), (0, 'HNB2'))),\n+ 'CTLIPA': (((0, 'C11'), (0, 'C12'), (0, 'NA2'), (0, 'O11')), ((0, 'NA2'), (0, 'C11'), (0, 'CA2'), (0, 'HNA2')), ((0, 'C51'), (0, 'C52'), (0, 'NB2'), (0, 'O51')), ((0, 'NB2'), (0, 'C51'), (0, 'CB2'), (0, 'HNB2'))),\n+ 'ECLIPA': (((0, 'C11'), (0, 'C12'), (0, 'NA2'), (0, 'O11')), ((0, 'NA2'), (0, 'C11'), (0, 'CA2'), (0, 'HNA2')), ((0, 'C51'), (0, 'C52'), (0, 'NB2'), (0, 'O51')), ((0, 'NB2'), (0, 'C51'), (0, 'CB2'), (0, 'HNB2'))),\n+ 'ECLIPB': (((0, 'C11'), (0, 'C12'), (0, 'NA2'), (0, 'O11')), ((0, 'NA2'), (0, 'C11'), (0, 'CA2'), (0, 'HNA2')), ((0, 'C51'), (0, 'C52'), (0, 'NB2'), (0, 'O51')), ((0, 'NB2'), (0, 'C51'), (0, 'CB2'), (0, 'HNB2'))),\n+ 'ECLIPC': (((0, 'C11'), (0, 'C12'), (0, 'NA2'), (0, 'O11')), ((0, 'NA2'), (0, 'C11'), (0, 'CA2'), (0, 'HNA2')), ((0, 'C51'), (0, 'C52'), (0, 'NB2'), (0, 'O51')), ((0, 'NB2'), (0, 'C51'), (0, 'CB2'), (0, 'HNB2'))),\n+ 'HPLIPA': (((0, 'C11'), (0, 'C12'), (0, 'NA2'), (0, 'O11')), ((0, 'NA2'), (0, 'C11'), (0, 'CA2'), (0, 'HNA2')), ((0, 'C51'), (0, 'C52'), (0, 'NB2'), (0, 'O51')), ((0, 'NB2'), (0, 'C51'), (0, 'CB2'), (0, 'HNB2'))),\n+ 'HPLIPB': (((0, 'C11'), (0, 'C12'), (0, 'NA2'), (0, 'O11')), ((0, 'NA2'), (0, 'C11'), (0, 'CA2'), (0, 'HNA2')), ((0, 'C51'), (0, 'C52'), (0, 'NB2'), (0, 'O51')), ((0, 'NB2'), (0, 'C51'), (0, 'CB2'), (0, 'HNB2'))),\n+ 'KPLIPA': (((0, 'C11'), (0, 'C12'), (0, 'NA2'), (0, 'O11')), ((0, 'NA2'), (0, 'C11'), (0, 'CA2'), (0, 'HNA2')), ((0, 'C51'), (0, 'C52'), (0, 'NB2'), (0, 'O51')), ((0, 'NB2'), (0, 'C51'), (0, 'CB2'), (0, 'HNB2'))),\n+ 'KPLIPB': (((0, 'C11'), (0, 'C12'), (0, 'NA2'), (0, 'O11')), ((0, 'NA2'), (0, 'C11'), (0, 'CA2'), (0, 'HNA2')), ((0, 'C51'), (0, 'C52'), (0, 'NB2'), (0, 'O51')), ((0, 'NB2'), (0, 'C51'), (0, 'CB2'), (0, 'HNB2'))),\n+ 'KPLIPC': (((0, 'C11'), (0, 'C12'), (0, 'NA2'), (0, 'O11')), ((0, 'NA2'), (0, 'C11'), (0, 'CA2'), (0, 'HNA2')), ((0, 'C51'), (0, 'C52'), (0, 'NB2'), (0, 'O51')), ((0, 'NB2'), (0, 'C51'), (0, 'CB2'), (0, 'HNB2'))),\n+ 'LILIPA': (((0, 'C11'), (0, 'C12'), (0, 'NA2'), (0, 'O11')), ((0, 'NA2'), (0, 'C11'), (0, 'CA2'), (0, 'HNA2')), ((0, 'C51'), (0, 'C52'), (0, 'NB2'), (0, 'O51')), ((0, 'NB2'), (0, 'C51'), (0, 'CB2'), (0, 'HNB2'))),\n+ 'MCLIPA': (((0, 'C11'), (0, 'C12'), (0, 'NA2'), (0, 'O11')), ((0, 'NA2'), (0, 'C11'), (0, 'CA2'), (0, 'HNA2')), ((0, 'C51'), (0, 'C52'), (0, 'NB2'), (0, 'O51')), ((0, 'NB2'), (0, 'C51'), (0, 'CB2'), (0, 'HNB2'))),\n+ 'NGLIPA': (((0, 'C11'), (0, 'C12'), (0, 'NA2'), (0, 'O11')), ((0, 'NA2'), (0, 'C11'), (0, 'CA2'), (0, 'HNA2')), ((0, 'C51'), (0, 'C52'), (0, 'NB2'), (0, 'O51')), ((0, 'NB2'), (0, 'C51'), (0, 'CB2'), (0, 'HNB2'))),\n+ 'NGLIPB': (((0, 'C11'), (0, 'C12'), (0, 'NA2'), (0, 'O11')), ((0, 'NA2'), (0, 'C11'), (0, 'CA2'), (0, 'HNA2')), ((0, 'C51'), (0, 'C52'), (0, 'NB2'), (0, 'O51')), ((0, 'NB2'), (0, 'C51'), (0, 'CB2'), (0, 'HNB2'))),\n+ 'NGLIPC': (((0, 'C11'), (0, 'C12'), (0, 'NA2'), (0, 'O11')), ((0, 'NA2'), (0, 'C11'), (0, 'CA2'), (0, 'HNA2')), ((0, 'C51'), (0, 'C52'), (0, 'NB2'), (0, 'O51')), ((0, 'NB2'), (0, 'C51'), (0, 'CB2'), (0, 'HNB2'))),\n+ 'PALIPA': (((0, 'C11'), (0, 'C12'), (0, 'NA2'), (0, 'O11')), ((0, 'NA2'), (0, 'C11'), (0, 'CA2'), (0, 'HNA2')), ((0, 'C51'), (0, 'C52'), (0, 'NB2'), (0, 'O51')), ((0, 'NB2'), (0, 'C51'), (0, 'CB2'), (0, 'HNB2'))),\n+ 'PALIPB': (((0, 'C11'), (0, 'C12'), (0, 'NA2'), (0, 'O11')), ((0, 'NA2'), (0, 'C11'), (0, 'CA2'), (0, 'HNA2')), ((0, 'C51'), (0, 'C52'), (0, 'NB2'), (0, 'O51')), ((0, 'NB2'), (0, 'C51'), (0, 'CB2'), (0, 'HNB2'))),\n+ 'PALIPC': (((0, 'C11'), (0, 'C12'), (0, 'NA2'), (0, 'O11')), ((0, 'NA2'), (0, 'C11'), (0, 'CA2'), (0, 'HNA2')), ((0, 'C51'), (0, 'C52'), (0, 'NB2'), (0, 'O51')), ((0, 'NB2'), (0, 'C51'), (0, 'CB2'), (0, 'HNB2'))),\n+ 'PALIPD': (((0, 'C11'), (0, 'C12'), (0, 'NA2'), (0, 'O11')), ((0, 'NA2'), (0, 'C11'), (0, 'CA2'), (0, 'HNA2')), ((0, 'C51'), (0, 'C52'), (0, 'NB2'), (0, 'O51')), ((0, 'NB2'), (0, 'C51'), (0, 'CB2'), (0, 'HNB2'))),\n+ 'PALIPE': (((0, 'C11'), (0, 'C12'), (0, 'NA2'), (0, 'O11')), ((0, 'NA2'), (0, 'C11'), (0, 'CA2'), (0, 'HNA2')), ((0, 'C51'), (0, 'C52'), (0, 'NB2'), (0, 'O51')), ((0, 'NB2'), (0, 'C51'), (0, 'CB2'), (0, 'HNB2'))),\n+ 'SFLIPA': (((0, 'C11'), (0, 'C12'), (0, 'NA2'), (0, 'O11')), ((0, 'NA2'), (0, 'C11'), (0, 'CA2'), (0, 'HNA2')), ((0, 'C51'), (0, 'C52'), (0, 'NB2'), (0, 'O51')), ((0, 'NB2'), (0, 'C51'), (0, 'CB2'), (0, 'HNB2'))),\n+ 'SELIPA': (((0, 'C11'), (0, 'C12'), (0, 'NA2'), (0, 'O11')), ((0, 'NA2'), (0, 'C11'), (0, 'CA2'), (0, 'HNA2')), ((0, 'C51'), (0, 'C52'), (0, 'NB2'), (0, 'O51')), ((0, 'NB2'), (0, 'C51'), (0, 'CB2'), (0, 'HNB2'))),\n+ 'SELIPB': (((0, 'C11'), (0, 'C12'), (0, 'NA2'), (0, 'O11')), ((0, 'NA2'), (0, 'C11'), (0, 'CA2'), (0, 'HNA2')), ((0, 'C51'), (0, 'C52'), (0, 'NB2'), (0, 'O51')), ((0, 'NB2'), (0, 'C51'), (0, 'CB2'), (0, 'HNB2'))),\n+ 'SELIPC': (((0, 'C11'), (0, 'C12'), (0, 'NA2'), (0, 'O11')), ((0, 'NA2'), (0, 'C11'), (0, 'CA2'), (0, 'HNA2')), ((0, 'C51'), (0, 'C52'), (0, 'NB2'), (0, 'O51')), ((0, 'NB2'), (0, 'C51'), (0, 'CB2'), (0, 'HNB2'))),\n+ 'VCLIPA': (((0, 'C11'), (0, 'C12'), (0, 'NA2'), (0, 'O11')), ((0, 'NA2'), (0, 'C11'), (0, 'CA2'), (0, 'HNA2')), ((0, 'C51'), (0, 'C52'), (0, 'NB2'), (0, 'O51')), ((0, 'NB2'), (0, 'C51'), (0, 'CB2'), (0, 'HNB2'))),\n+ 'VCLIPB': (((0, 'C11'), (0, 'C12'), (0, 'NA2'), (0, 'O11')), ((0, 'NA2'), (0, 'C11'), (0, 'CA2'), (0, 'HNA2')), ((0, 'C51'), (0, 'C52'), (0, 'NB2'), (0, 'O51')), ((0, 'NB2'), (0, 'C51'), (0, 'CB2'), (0, 'HNB2'))),\n+ 'VCLIPC': (((0, 'C11'), (0, 'C12'), (0, 'NA2'), (0, 'O11')), ((0, 'NA2'), (0, 'C11'), (0, 'CA2'), (0, 'HNA2')), ((0, 'C51'), (0, 'C52'), (0, 'NB2'), (0, 'O51')), ((0, 'NB2'), (0, 'C51'), (0, 'CB2'), (0, 'HNB2'))),\n+ 'VCLIPD': (((0, 'C11'), (0, 'C12'), (0, 'NA2'), (0, 'O11')), ((0, 'NA2'), (0, 'C11'), (0, 'CA2'), (0, 'HNA2')), ((0, 'C51'), (0, 'C52'), (0, 'NB2'), (0, 'O51')), ((0, 'NB2'), (0, 'C51'), (0, 'CB2'), (0, 'HNB2'))),\n+ 'VCLIPE': (((0, 'C11'), (0, 'C12'), (0, 'NA2'), (0, 'O11')), ((0, 'NA2'), (0, 'C11'), (0, 'CA2'), (0, 'HNA2')), ((0, 'C51'), (0, 'C52'), (0, 'NB2'), (0, 'O51')), ((0, 'NB2'), (0, 'C51'), (0, 'CB2'), (0, 'HNB2'))),\n+ 'YPLIPA': (((0, 'C11'), (0, 'C12'), (0, 'NA2'), (0, 'O11')), ((0, 'NA2'), (0, 'C11'), (0, 'CA2'), (0, 'HNA2')), ((0, 'C51'), (0, 'C52'), (0, 'NB2'), (0, 'O51')), ((0, 'NB2'), (0, 'C51'), (0, 'CB2'), (0, 'HNB2'))),\n+ 'YPLIPB': (((0, 'C11'), (0, 'C12'), (0, 'NA2'), (0, 'O11')), ((0, 'NA2'), (0, 'C11'), (0, 'CA2'), (0, 'HNA2')), ((0, 'C51'), (0, 'C52'), (0, 'NB2'), (0, 'O51')), ((0, 'NB2'), (0, 'C51'), (0, 'CB2'), (0, 'HNB2'))),\n+ 'PVPG': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))),\n+ 'PVPE': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))),\n+ 'PPPE': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))),\n+ 'PMPE': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))),\n+ 'QMPE': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))),\n+ 'OYPE': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))),\n+ 'PYPG': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))),\n+ 'IPPC': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))),\n+ 'APPC': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))),\n+ 'PHPC': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))),\n+ 'PMPG': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))),\n+ 'PVCL2': (((0, 'CB1'), (0, 'O13'), (0, 'CB2'), (0, 'OB1')), ((0, 'CA1'), (0, 'O12'), (0, 'CA2'), (0, 'OA1')), ((0, 'CD1'), (0, 'O33'), (0, 'CD2'), (0, 'OD1')), ((0, 'CC1'), (0, 'O32'), (0, 'CC2'), (0, 'OC1'))),\n+ 'DPPGK': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))),\n+ 'TOCL1': (((0, 'CB1'), (0, 'O13'), (0, 'CB2'), (0, 'OB1')), ((0, 'CA1'), (0, 'O12'), (0, 'CA2'), (0, 'OA1')), ((0, 'CD1'), (0, 'O33'), (0, 'CD2'), (0, 'OD1')), ((0, 'CC1'), (0, 'O32'), (0, 'CC2'), (0, 'OC1'))),\n+ 'TOCL2': (((0, 'CB1'), (0, 'O13'), (0, 'CB2'), (0, 'OB1')), ((0, 'CA1'), (0, 'O12'), (0, 'CA2'), (0, 'OA1')), ((0, 'CD1'), (0, 'O33'), (0, 'CD2'), (0, 'OD1')), ((0, 'CC1'), (0, 'O32'), (0, 'CC2'), (0, 'OC1'))),\n+ 'TMCL1': (((0, 'CB1'), (0, 'O13'), (0, 'CB2'), (0, 'OB1')), ((0, 'CA1'), (0, 'O12'), (0, 'CA2'), (0, 'OA1')), ((0, 'CD1'), (0, 'O33'), (0, 'CD2'), (0, 'OD1')), ((0, 'CC1'), (0, 'O32'), (0, 'CC2'), (0, 'OC1'))),\n+ 'TMCL2': (((0, 'CB1'), (0, 'O13'), (0, 'CB2'), (0, 'OB1')), ((0, 'CA1'), (0, 'O12'), (0, 'CA2'), (0, 'OA1')), ((0, 'CD1'), (0, 'O33'), (0, 'CD2'), (0, 'OD1')), ((0, 'CC1'), (0, 'O32'), (0, 'CC2'), (0, 'OC1'))),\n+ 'TLCL1': (((0, 'CB1'), (0, 'O13'), (0, 'CB2'), (0, 'OB1')), ((0, 'CA1'), (0, 'O12'), (0, 'CA2'), (0, 'OA1')), ((0, 'CD1'), (0, 'O33'), (0, 'CD2'), (0, 'OD1')), ((0, 'CC1'), (0, 'O32'), (0, 'CC2'), (0, 'OC1'))),\n+ 'TLCL2': (((0, 'CB1'), (0, 'O13'), (0, 'CB2'), (0, 'OB1')), ((0, 'CA1'), (0, 'O12'), (0, 'CA2'), (0, 'OA1')), ((0, 'CD1'), (0, 'O33'), (0, 'CD2'), (0, 'OD1')), ((0, 'CC1'), (0, 'O32'), (0, 'CC2'), (0, 'OC1'))),\n+ 'PMCL1': (((0, 'CB1'), (0, 'O13'), (0, 'CB2'), (0, 'OB1')), ((0, 'CA1'), (0, 'O12'), (0, 'CA2'), (0, 'OA1')), ((0, 'CD1'), (0, 'O33'), (0, 'CD2'), (0, 'OD1')), ((0, 'CC1'), (0, 'O32'), (0, 'CC2'), (0, 'OC1'))),\n+ 'PMCL2': (((0, 'CB1'), (0, 'O13'), (0, 'CB2'), (0, 'OB1')), ((0, 'CA1'), (0, 'O12'), (0, 'CA2'), (0, 'OA1')), ((0, 'CD1'), (0, 'O33'), (0, 'CD2'), (0, 'OD1')), ((0, 'CC1'), (0, 'O32'), (0, 'CC2'), (0, 'OC1'))),\n+ 'TYCL1': (((0, 'CB1'), (0, 'O13'), (0, 'CB2'), (0, 'OB1')), ((0, 'CA1'), (0, 'O12'), (0, 'CA2'), (0, 'OA1')), ((0, 'CD1'), (0, 'O33'), (0, 'CD2'), (0, 'OD1')), ((0, 'CC1'), (0, 'O32'), (0, 'CC2'), (0, 'OC1'))),\n+ 'TYCL2': (((0, 'CB1'), (0, 'O13'), (0, 'CB2'), (0, 'OB1')), ((0, 'CA1'), (0, 'O12'), (0, 'CA2'), (0, 'OA1')), ((0, 'CD1'), (0, 'O33'), (0, 'CD2'), (0, 'OD1')), ((0, 'CC1'), (0, 'O32'), (0, 'CC2'), (0, 'OC1'))),\n+ 'LOACL1': (((0, 'CB1'), (0, 'O13'), (0, 'CB2'), (0, 'OB1')), ((0, 'CA1'), (0, 'O12'), (0, 'CA2'), (0, 'OA1')), ((0, 'CD1'), (0, 'O33'), (0, 'CD2'), (0, 'OD1')), ((0, 'CC1'), (0, 'O32'), (0, 'CC2'), (0, 'OC1'))),\n+ 'LOACL2': (((0, 'CB1'), (0, 'O13'), (0, 'CB2'), (0, 'OB1')), ((0, 'CA1'), (0, 'O12'), (0, 'CA2'), (0, 'OA1')), ((0, 'CD1'), (0, 'O33'), (0, 'CD2'), (0, 'OD1')), ((0, 'CC1'), (0, 'O32'), (0, 'CC2'), (0, 'OC1'))),\n+ 'LOCCL1': (((0, 'CB1'), (0, 'O13'), (0, 'CB2'), (0, 'OB1')), ((0, 'CA1'), (0, 'O12'), (0, 'CA2'), (0, 'OA1')), ((0, 'CD1'), (0, 'O33'), (0, 'CD2'), (0, 'OD1')), ((0, 'CC1'), (0, 'O32'), (0, 'CC2'), (0, 'OC1'))),\n+ 'LOCCL2': (((0, 'CB1'), (0, 'O13'), (0, 'CB2'), (0, 'OB1')), ((0, 'CA1'), (0, 'O12'), (0, 'CA2'), (0, 'OA1')), ((0, 'CD1'), (0, 'O33'), (0, 'CD2'), (0, 'OD1')), ((0, 'CC1'), (0, 'O32'), (0, 'CC2'), (0, 'OC1'))),\n+ 'LNACL1': (((0, 'CB1'), (0, 'O13'), (0, 'CB2'), (0, 'OB1')), ((0, 'CA1'), (0, 'O12'), (0, 'CA2'), (0, 'OA1')), ((0, 'CD1'), (0, 'O33'), (0, 'CD2'), (0, 'OD1')), ((0, 'CC1'), (0, 'O32'), (0, 'CC2'), (0, 'OC1'))),\n+ 'LNACL2': (((0, 'CB1'), (0, 'O13'), (0, 'CB2'), (0, 'OB1')), ((0, 'CA1'), (0, 'O12'), (0, 'CA2'), (0, 'OA1')), ((0, 'CD1'), (0, 'O33'), (0, 'CD2'), (0, 'OD1')), ((0, 'CC1'), (0, 'O32'), (0, 'CC2'), (0, 'OC1'))),\n+ 'LNBCL1': (((0, 'CB1'), (0, 'O13'), (0, 'CB2'), (0, 'OB1')), ((0, 'CA1'), (0, 'O12'), (0, 'CA2'), (0, 'OA1')), ((0, 'CD1'), (0, 'O33'), (0, 'CD2'), (0, 'OD1')), ((0, 'CC1'), (0, 'O32'), (0, 'CC2'), (0, 'OC1'))),\n+ 'LNBCL2': (((0, 'CB1'), (0, 'O13'), (0, 'CB2'), (0, 'OB1')), ((0, 'CA1'), (0, 'O12'), (0, 'CA2'), (0, 'OA1')), ((0, 'CD1'), (0, 'O33'), (0, 'CD2'), (0, 'OD1')), ((0, 'CC1'), (0, 'O32'), (0, 'CC2'), (0, 'OC1'))),\n+ 'LNCCL1': (((0, 'CB1'), (0, 'O13'), (0, 'CB2'), (0, 'OB1')), ((0, 'CA1'), (0, 'O12'), (0, 'CA2'), (0, 'OA1')), ((0, 'CD1'), (0, 'O33'), (0, 'CD2'), (0, 'OD1')), ((0, 'CC1'), (0, 'O32'), (0, 'CC2'), (0, 'OC1'))),\n+ 'LNCCL2': (((0, 'CB1'), (0, 'O13'), (0, 'CB2'), (0, 'OB1')), ((0, 'CA1'), (0, 'O12'), (0, 'CA2'), (0, 'OA1')), ((0, 'CD1'), (0, 'O33'), (0, 'CD2'), (0, 'OD1')), ((0, 'CC1'), (0, 'O32'), (0, 'CC2'), (0, 'OC1'))),\n+ 'LNDCL1': (((0, 'CB1'), (0, 'O13'), (0, 'CB2'), (0, 'OB1')), ((0, 'CA1'), (0, 'O12'), (0, 'CA2'), (0, 'OA1')), ((0, 'CD1'), (0, 'O33'), (0, 'CD2'), (0, 'OD1')), ((0, 'CC1'), (0, 'O32'), (0, 'CC2'), (0, 'OC1'))),\n+ 'LNDCL2': (((0, 'CB1'), (0, 'O13'), (0, 'CB2'), (0, 'OB1')), ((0, 'CA1'), (0, 'O12'), (0, 'CA2'), (0, 'OA1')), ((0, 'CD1'), (0, 'O33'), (0, 'CD2'), (0, 'OD1')), ((0, 'CC1'), (0, 'O32'), (0, 'CC2'), (0, 'OC1'))),\n+ 'DDPC': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))),\n+ 'DCPC': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))),\n+ 'DXPC': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))),\n+ 'DGPC': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))),\n+ 'DEPC': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))),\n+ 'DNPC': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))),\n+ 'DXPE': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))),\n+ 'DGPE': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))),\n+ 'DEPE': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))),\n+ 'DNPE': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))),\n+ 'SAPE': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))),\n+ 'SLPE': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))),\n+ 'PLPE': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))),\n+ 'SLPC': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))),\n+ 'PLPC': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))),\n+ 'DYPS': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32')), ((0, 'C13'), (0, 'C12'), (0, 'O13B'), (0, 'O13A'))),\n+ 'DGPS': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32')), ((0, 'C13'), (0, 'C12'), (0, 'O13B'), (0, 'O13A'))),\n+ 'DEPS': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32')), ((0, 'C13'), (0, 'C12'), (0, 'O13B'), (0, 'O13A'))),\n+ 'DNPS': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32')), ((0, 'C13'), (0, 'C12'), (0, 'O13B'), (0, 'O13A'))),\n+ 'SAPS': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32')), ((0, 'C13'), (0, 'C12'), (0, 'O13B'), (0, 'O13A'))),\n+ 'SLPS': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32')), ((0, 'C13'), (0, 'C12'), (0, 'O13B'), (0, 'O13A'))),\n+ 'PLPS': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32')), ((0, 'C13'), (0, 'C12'), (0, 'O13B'), (0, 'O13A'))),\n+ 'DYPA': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))),\n+ 'DGPA': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))),\n+ 'DEPA': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))),\n+ 'DNPA': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))),\n+ 'SAPA': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))),\n+ 'SLPA': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))),\n+ 'PLPA': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))),\n+ 'DYPG': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))),\n+ 'DGPG': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))),\n+ 'DEPG': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))),\n+ 'DNPG': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))),\n+ 'SAPG': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))),\n+ 'PLPG': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))),\n+ 'SDPE': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))),\n+ 'SOPE': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))),\n+ 'DAPE': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))),\n+ 'SDPS': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32')), ((0, 'C13'), (0, 'C12'), (0, 'O13B'), (0, 'O13A'))),\n+ 'SOPS': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32')), ((0, 'C13'), (0, 'C12'), (0, 'O13B'), (0, 'O13A'))),\n+ 'DAPS': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32')), ((0, 'C13'), (0, 'C12'), (0, 'O13B'), (0, 'O13A'))),\n+ 'SDPA': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))),\n+ 'SOPA': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))),\n+ 'DAPA': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))),\n+ 'SDPG': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))),\n+ 'SOPG': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))),\n+ 'DAPG': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))),\n+ 'DIPA': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))),\n+ 'TIPA': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))),\n+ 'DTPA': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))),\n+ 'DUPC': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))),\n+ 'DLIPC': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))),\n+ 'DLIPE': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))),\n+ 'LLPA': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))),\n+ 'LLPC': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))),\n+ 'LLPE': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))),\n+ 'LLPS': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32')), ((0, 'C13'), (0, 'C12'), (0, 'O13B'), (0, 'O13A'))),\n+ 'TSPC': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))),\n+ 'DDOPC': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))),\n+ 'DDOPE': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))),\n+ 'DDOPS': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32')), ((0, 'C13'), (0, 'C12'), (0, 'O13B'), (0, 'O13A'))),\n+ 'PDOPC': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))),\n+ 'PDOPE': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))),\n+ 'DOPP1': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))),\n+ 'DOPP2': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))),\n+ 'DOPP3': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))),\n+ 'POPP1': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))),\n+ 'POPP2': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))),\n+ 'POPP3': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))),\n+}\n+patch_impropers = {\n+ 'ACE': (((0, 'CY'), (0, 'CAY'), (0, 'N'), (0, 'OY')), ((0, 'N'), (0, 'CY'), (0, 'CA'), (0, 'HN'))),\n+ 'ACED': (((0, 'CY'), (0, 'CAY'), (0, 'N'), (0, 'OY')), ((0, 'N'), (0, 'CY'), (0, 'CA'), (0, 'HN'))),\n+ 'ACP': (((0, 'CY'), (0, 'CAY'), (0, 'N'), (0, 'OY')), ((0, 'N'), (0, 'CY'), (0, 'CA'), (0, 'CD'))),\n+ 'ACPD': (((0, 'CY'), (0, 'CAY'), (0, 'N'), (0, 'OY')), ((0, 'N'), (0, 'CY'), (0, 'CA'), (0, 'CD'))),\n+ 'CTER': (((0, 'C'), (0, 'CA'), (0, 'OT2'), (0, 'OT1')),),\n+ 'CNEU': (((0, 'C'), (0, 'CA'), (0, 'OT2'), (0, 'OT1')),),\n+ 'PCTE': (((0, 'C'), (0, 'CA'), (0, 'OT2'), (0, 'OT1')),),\n+ 'CT1': (((0, 'C'), (0, 'CA'), (0, 'OT2'), (0, 'OT1')),),\n+ 'CT2': (((0, 'C'), (0, 'NT'), (0, 'CA'), (0, 'O')), ((0, 'C'), (0, 'CA'), (0, 'NT'), (0, 'O')), ((0, 'NT'), (0, 'C'), (0, 'HT1'), (0, 'HT2')), ((0, 'NT'), (0, 'C'), (0, 'HT2'), (0, 'HT1'))),\n+ 'CT3': (((0, 'NT'), (0, 'C'), (0, 'CAT'), (0, 'HNT')), ((0, 'C'), (0, 'CA'), (0, 'NT'), (0, 'O'))),\n+ 'HS2': (((0, 'NE2'), (0, 'CD2'), (0, 'CE1'), (0, 'HE2')), ((0, 'NE2'), (0, 'CE1'), (0, 'CD2'), (0, 'HE2'))),\n+ 'LIG1': (((0, '3N'), (0, '2C'), (0, '3CA'), (0, '3HN')), ((0, '2C'), (0, '2CA'), (0, '3N'), (0, '2O'))),\n+ 'LINK': (((0, '3N'), (0, '2C'), (0, '3CA'), (0, '3HN')), ((0, '2C'), (0, '2CA'), (0, '3N'), (0, '2O'))),\n+ 'SAHP': (((0, 'C'), (0, 'OT1'), (0, 'OT2'), (0, 'CA')),),\n+ 'GYCO': (((0, 'CD'), (0, 'C23'), (0, 'N'), (0, 'OE1')), ((0, 'CDG'), (0, 'OEG1'), (0, 'OEG2'), (0, 'CG'))),\n+ 'AMGA': (((0, 'CA'), (0, 'CC1'), (0, 'OA1'), (0, 'OA2')),),\n+ 'GMGA': (((0, 'CG'), (0, 'CC3'), (0, 'OG1'), (0, 'OG2')),),\n+ 'DMGA': (((0, 'CA'), (0, 'CC1'), (0, 'OA1'), (0, 'OA2')), ((0, 'CG'), (0, 'CC3'), (0, 'OG1'), (0, 'OG2'))),\n+ 'AMGT': (((0, 'CA'), (0, 'CC1'), (0, 'OA1'), (0, 'OA2')), ((0, 'CG'), (0, 'CC3'), (0, 'OG1'), (0, 'OG2'))),\n+ 'ATGM': (((0, 'CA'), (0, 'CC1'), (0, 'OA1'), (0, 'OA2')), ((0, 'CG'), (0, 'CC3'), (0, 'OG1'), (0, 'OG2'))),\n+ 'ABGA': (((0, 'CA'), (0, 'CC1'), (0, 'OA1'), (0, 'OA2')),),\n+ 'GBGA': (((0, 'CG'), (0, 'CC3'), (0, 'OG1'), (0, 'OG2')),),\n+ 'DBGA': (((0, 'CA'), (0, 'CC1'), (0, 'OA1'), (0, 'OA2')), ((0, 'CG'), (0, 'CC3'), (0, 'OG1'), (0, 'OG2'))),\n+ 'ALME': (((0, 'CA'), (0, 'CC1'), (0, 'OA1'), (0, 'OA2')),),\n+ 'G4MPAB': (((0, 'CA'), (0, 'CC1'), (0, 'OA1'), (0, 'OA2')),),\n+ 'G4PAB': (((0, 'CA'), (0, 'CC1'), (0, 'OA1'), (0, 'OA2')),),\n+ 'G3PABR': (((0, 'CA'), (0, 'CC1'), (0, 'OA1'), (0, 'OA2')),),\n+ 'G3PABS': (((0, 'CA'), (0, 'CC1'), (0, 'OA1'), (0, 'OA2')),),\n+ 'BPAB': (((0, 'CA'), (0, 'CC1'), (0, 'OA1'), (0, 'OA2')),),\n+ 'BPAT': (((0, 'CA'), (0, 'CC1'), (0, 'OA1'), (0, 'OA2')),),\n+ '3MSB': (((0, 'CA'), (0, 'CC1'), (0, 'OA1'), (0, 'OA2')),),\n+ '2MRB': (((0, 'CA'), (0, 'CC1'), (0, 'OA1'), (0, 'OA2')),),\n+ '2APP': (((0, 'CA'), (0, 'CC1'), (0, 'OA1'), (0, 'OA2')), ((0, 'CG'), (0, 'CC3'), (0, 'NG'), (0, 'OG')), ((0, 'CZ'), (0, 'CD1'), (0, 'NZ'), (0, 'NG'))),\n+ '3APP': (((0, 'CA'), (0, 'CC1'), (0, 'OA1'), (0, 'OA2')), ((0, 'CG'), (0, 'CC3'), (0, 'NG'), (0, 'OG'))),\n+ '4APP': (((0, 'CA'), (0, 'CC1'), (0, 'OA1'), (0, 'OA2')), ((0, 'CG'), (0, 'CC3'), (0, 'NG'), (0, 'OG'))),\n+ '2APD': (((0, 'CG'), (0, 'CC3'), (0, 'NG'), (0, 'OG')), ((0, 'CZ'), (0, 'CD1'), (0, 'NZ'), (0, 'NG'))),\n+ '3APD': (((0, 'CG'), (0, 'CC3'), (0, 'NG'), (0, 'OG')),),\n+ '4APD': (((0, 'CG'), (0, 'CC3'), (0, 'NG'), (0, 'OG')),),\n+ '2AFP': (((0, 'CA'), (0, 'CC1'), (0, 'OA1'), (0, 'OA2')), ((0, 'CG'), (0, 'CC3'), (0, 'NG'), (0, 'OG'))),\n+ '3AFP': (((0, 'CA'), (0, 'CC1'), (0, 'OA1'), (0, 'OA2')), ((0, 'CG'), (0, 'CC3'), (0, 'NG'), (0, 'OG'))),\n+ '4AFP': (((0, 'CA'), (0, 'CC1'), (0, 'OA1'), (0, 'OA2')), ((0, 'CG'), (0, 'CC3'), (0, 'NG'), (0, 'OG'))),\n+ '2AFD': (((0, 'CG'), (0, 'CC3'), (0, 'NG'), (0, 'OG')),),\n+ '3AFD': (((0, 'CG'), (0, 'CC3'), (0, 'NG'), (0, 'OG')),),\n+ '4AFD': (((0, 'CG'), (0, 'CC3'), (0, 'NG'), (0, 'OG')),),\n+ '4FBP': (((0, 'CA'), (0, 'CC1'), (0, 'OA1'), (0, 'OA2')),),\n+ '3FBP': (((0, 'CA'), (0, 'CC1'), (0, 'OA1'), (0, 'OA2')),),\n+ '2FBP': (((0, 'CA'), (0, 'CC1'), (0, 'OA1'), (0, 'OA2')),),\n+ 'FBIFR': (((0, 'CD'), (0, 'OD1'), (0, 'OD2'), (0, 'CBG')),),\n+ 'FBIFS': (((0, 'CD'), (0, 'OD1'), (0, 'OD2'), (0, 'CBG')),),\n+ '3MRB': (((0, 'CA'), (0, 'CC1'), (0, 'OA1'), (0, 'OA2')),),\n+ '2MSB': (((0, 'CA'), (0, 'CC1'), (0, 'OA1'), (0, 'OA2')),),\n+ '3A2MPD': (((0, 'CG'), (0, 'CC3'), (0, 'NG'), (0, 'OG')),),\n+ '3A2MPP': (((0, 'CA'), (0, 'CC1'), (0, 'OA1'), (0, 'OA2')), ((0, 'CG'), (0, 'CC3'), (0, 'NG'), (0, 'OG'))),\n+ '3A4MPD': (((0, 'CG'), (0, 'CC3'), (0, 'NG'), (0, 'OG')),),\n+ '3A5MPD': (((0, 'CG'), (0, 'CC3'), (0, 'NG'), (0, 'OG')),),\n+ '3A6MPD': (((0, 'CG'), (0, 'CC3'), (0, 'NG'), (0, 'OG')),),\n+ '4A2MPD': (((0, 'CG'), (0, 'CC3'), (0, 'NG'), (0, 'OG')),),\n+ '4A2MPP': (((0, 'CA'), (0, 'CC1'), (0, 'OA1'), (0, 'OA2')), ((0, 'CG'), (0, 'CC3'), (0, 'NG'), (0, 'OG'))),\n+ '3CPD': (((0, 'CC'), (0, 'CZ'), (0, 'NG'), (0, 'OC')),),\n+ '3A46PD': (((0, 'CG'), (0, 'CC3'), (0, 'NG'), (0, 'OG')),),\n+ '2AEPD': (((0, 'CG'), (0, 'CC3'), (0, 'NG'), (0, 'OG')),),\n+ '2XBD': (((0, 'CX'), (0, 'OX1'), (0, 'OX2'), (0, 'CD2')),),\n+ '3XBD': (((0, 'CX'), (0, 'OX1'), (0, 'OX2'), (0, 'CE1')),),\n+ '4XBD': (((0, 'CX'), (0, 'OX1'), (0, 'OX2'), (0, 'CP')),),\n+ '4XEBD': (((0, 'CX'), (0, 'OX1'), (0, 'OX2'), (0, 'CQ')),),\n+ '3XBP': (((0, 'CA'), (0, 'CC1'), (0, 'OA1'), (0, 'OA2')), ((0, 'CX'), (0, 'OX1'), (0, 'OX2'), (0, 'CE1'))),\n+ 'B5H6': (((0, 'C34'), (0, 'O34A'), (0, 'O34B'), (0, 'C31')), ((0, 'C33'), (0, 'O33A'), (0, 'O33B'), (0, 'C32'))),\n+ 'B5HE': (((0, 'C34'), (0, 'C31'), (0, 'O34A'), (0, 'O34B')), ((0, 'C33'), (0, 'C32'), (0, 'O33A'), (0, 'O33B'))),\n+ 'TAUR': (((0, 'CD'), (0, 'C23'), (0, 'N'), (0, 'OE1')),),\n+ 'RN1': (((0, 'NH1'), (0, 'HH11'), (0, 'HH12'), (0, 'CZ')), ((0, 'NH2'), (0, 'HH21'), (0, 'HH22'), (0, 'CZ'))),\n+ 'RN2': (((0, 'NE'), (0, 'CD'), (0, 'CZ'), (0, 'HE')), ((0, 'NH2'), (0, 'HH21'), (0, 'HH22'), (0, 'CZ'))),\n+ 'RN3': (((0, 'NH2'), (0, 'HH21'), (0, 'HH22'), (0, 'CZ')),),\n+ 'KAC': (((0, 'NZ'), (0, 'CH'), (0, 'CE'), (0, 'HZ1')), ((0, 'CH'), (0, 'CH3'), (0, 'NZ'), (0, 'OH'))),\n+ 'AMGY': (((0, 'CY'), (0, 'CAY'), (0, 'N'), (0, 'OY')),),\n+ 'DMCT': (((0, 'C'), (0, 'CA'), (0, 'NT'), (0, 'O')),),\n+ 'SAHC': (((0, 'OT1'), (0, 'CA'), (0, 'OT2'), (0, 'C')),),\n+ 'PSAM': (((0, 'O'), (0, 'CA'), (0, 'OXT'), (0, 'C')),),\n+ '5MC1': (((0, 'N1'), (0, 'C6'), (0, 'C2'), (0, 'H1')),),\n+ 'INO1': (((0, 'C2'), (0, 'N1'), (0, 'N3'), (0, 'H2')),),\n+ '4EG1': (((0, 'N4'), (0, 'C4'), (0, 'C41'), (0, 'H42')),),\n+ 'CT': (((0, 'C'), (0, \"C2'\"), (0, 'OT2'), (0, 'OT1')),),\n+ 'CTN': (((0, 'C'), (0, 'NT'), (0, \"C2'\"), (0, \"O1'\")), ((0, 'C'), (0, \"C2'\"), (0, 'NT'), (0, \"O1'\")), ((0, 'NT'), (0, 'C'), (0, 'HT1'), (0, 'HT2')), ((0, 'NT'), (0, 'C'), (0, 'HT2'), (0, 'HT1'))),\n+ 'PACE': (((0, 'CY'), (0, 'CAY'), (0, 'N'), (0, 'OY')), ((0, 'N'), (0, 'CY'), (0, \"C6'\"), (0, \"H1'\"))),\n+ '5UHG': (((0, 'C10'), (0, 'C9'), (0, 'O11'), (0, 'O12')),),\n+ '5UHC': (((0, 'C8'), (0, 'C7'), (0, 'O8'), (0, 'O9')),),\n+ '5UHO': (((0, 'C9'), (0, 'C8'), (0, 'O9'), (0, 'O10')),),\n+ '5UHA': (((0, 'C13'), (0, 'C12'), (0, 'O30'), (0, 'O31')),),\n+ 'CYTP': (((0, 'N4'), (0, 'H41'), (0, 'H42'), (0, 'C4')), ((0, 'C4'), (0, 'N3'), (0, 'N4'), (0, 'C5'))),\n+ '3MCN': (((0, 'C4'), (0, 'C5'), (0, 'N4'), (0, 'N3')),),\n+ 'ADEP': (((0, 'C6'), (0, 'N1'), (0, 'N6'), (0, 'C5')), ((0, 'N6'), (0, 'H61'), (0, 'H62'), (0, 'C6'))),\n+ 'ADEI': (((0, 'C6'), (0, 'C5'), (0, 'N6'), (0, 'N1')),),\n+ '1MAN': (((0, 'C6'), (0, 'C5'), (0, 'N6'), (0, 'N1')),),\n+ '6AH': (((0, 'C13'), (0, 'C12'), (0, 'ODA'), (0, 'ODB')),),\n+ 'GENO': (((0, 'N2'), (0, 'H21'), (0, 'H22'), (0, 'C2')),),\n+ 'BUGN': (((0, 'C17'), (0, 'C15'), (0, 'O17'), (0, 'O18')),),\n+ 'PTSR': (((0, 'PX'), (0, 'O1X'), (0, 'S2X'), (0, \"O3'\")),),\n+ 'PTSS': (((0, 'PX'), (0, 'S1X'), (0, 'O2X'), (0, \"O3'\")),),\n+ 'PTSD': (((0, 'PX'), (0, 'S1X'), (0, 'S2X'), (0, \"O3'\")),),\n+ 'P6EN': (((0, 'C'), (0, 'OT2'), (0, 'NT'), (0, 'OT1')),),\n+ '2ANAM': (((0, 'C22'), (0, 'CT22'), (0, 'N22'), (0, 'N2A')), ((0, 'N22'), (0, 'C22'), (0, 'C2'), (0, 'HN22'))),\n+ '2BNAM': (((0, 'C22'), (0, 'CT22'), (0, 'N22'), (0, 'N2A')), ((0, 'N22'), (0, 'C22'), (0, 'C2'), (0, 'HN22'))),\n+ '3ANAM': (((0, 'C33'), (0, 'CT33'), (0, 'N33'), (0, 'N3A')), ((0, 'N33'), (0, 'C33'), (0, 'C3'), (0, 'HN33'))),\n+ '3BNAM': (((0, 'C33'), (0, 'CT33'), (0, 'N33'), (0, 'N3A')), ((0, 'N33'), (0, 'C33'), (0, 'C3'), (0, 'HN33'))),\n+ '5BNAM2': (((0, 'C55'), (0, 'CT55'), (0, 'N55'), (0, 'N5A')), ((0, 'N55'), (0, 'C55'), (0, 'C5'), (0, 'HN55'))),\n+ '1ANAC': (((0, 'C11'), (0, 'CT11'), (0, 'N11'), (0, 'O11')), ((0, 'N11'), (0, 'C11'), (0, 'C1'), (0, 'HN11'))),\n+ '1BNAC': (((0, 'C11'), (0, 'CT11'), (0, 'N11'), (0, 'O11')), ((0, 'N11'), (0, 'C11'), (0, 'C1'), (0, 'HN11'))),\n+ '2ANAC': (((0, 'C22'), (0, 'CT22'), (0, 'N22'), (0, 'O22')), ((0, 'N22'), (0, 'C22'), (0, 'C2'), (0, 'HN22'))),\n+ '2BNAC': (((0, 'C22'), (0, 'CT22'), (0, 'N22'), (0, 'O22')), ((0, 'N22'), (0, 'C22'), (0, 'C2'), (0, 'HN22'))),\n+ '3ANAC': (((0, 'C33'), (0, 'CT33'), (0, 'N33'), (0, 'O33')), ((0, 'N33'), (0, 'C33'), (0, 'C3'), (0, 'HN33'))),\n+ '3BNAC': (((0, 'C33'), (0, 'CT33'), (0, 'N33'), (0, 'O33')), ((0, 'N33'), (0, 'C33'), (0, 'C3'), (0, 'HN33'))),\n+ '4ANAC': (((0, 'C44'), (0, 'CT44'), (0, 'N44'), (0, 'O44')), ((0, 'N44'), (0, 'C44'), (0, 'C4'), (0, 'HN44'))),\n+ '4BNAC': (((0, 'C44'), (0, 'CT44'), (0, 'N44'), (0, 'O44')), ((0, 'N44'), (0, 'C44'), (0, 'C4'), (0, 'HN44'))),\n+ '9TNAC': (((0, 'CN'), (0, 'CT9'), (0, 'N9'), (0, 'ON')), ((0, 'N9'), (0, 'CN'), (0, 'C9'), (0, 'HN9'))),\n+ '2BNFO': (((0, 'C22'), (0, 'H22'), (0, 'N22'), (0, 'O22')), ((0, 'N22'), (0, 'C22'), (0, 'C2'), (0, 'HN22'))),\n+ '3ANFO': (((0, 'C33'), (0, 'H33'), (0, 'N33'), (0, 'O33')), ((0, 'N33'), (0, 'C33'), (0, 'C3'), (0, 'HN33'))),\n+ '3BNFO': (((0, 'C33'), (0, 'H33'), (0, 'N33'), (0, 'O33')), ((0, 'N33'), (0, 'C33'), (0, 'C3'), (0, 'HN33'))),\n+ '7BNFO': (((0, 'C77'), (0, 'H77'), (0, 'N77'), (0, 'O77')), ((0, 'N77'), (0, 'C77'), (0, 'C7'), (0, 'HN77'))),\n+ '2ANSB': (((0, 'C22'), (0, 'CT22'), (0, 'N22'), (0, 'O22')), ((0, 'N22'), (0, 'C22'), (0, 'C2'), (0, 'HN22'))),\n+ '2BNSB': (((0, 'C22'), (0, 'CT22'), (0, 'N22'), (0, 'O22')), ((0, 'N22'), (0, 'C22'), (0, 'C2'), (0, 'HN22'))),\n+ '3BNRB': (((0, 'C33'), (0, 'CT33'), (0, 'N33'), (0, 'O33')), ((0, 'N33'), (0, 'C33'), (0, 'C3'), (0, 'HN33'))),\n+ '5BNRB2': (((0, 'C55'), (0, 'CT55'), (0, 'N55'), (0, 'O55')), ((0, 'N55'), (0, 'C55'), (0, 'C5'), (0, 'HN55'))),\n+ '5ANRB2': (((0, 'C55'), (0, 'CT55'), (0, 'N55'), (0, 'O55')), ((0, 'N55'), (0, 'C55'), (0, 'C5'), (0, 'HN55'))),\n+ '7BNRB': (((0, 'C77'), (0, 'CT77'), (0, 'N77'), (0, 'O77')), ((0, 'N77'), (0, 'C77'), (0, 'C7'), (0, 'HN77'))),\n+ '3BNSB': (((0, 'C33'), (0, 'CT33'), (0, 'N33'), (0, 'O33')), ((0, 'N33'), (0, 'C33'), (0, 'C3'), (0, 'HN33'))),\n+ '4BNRB': (((0, 'C44'), (0, 'CT44'), (0, 'N44'), (0, 'O44')), ((0, 'N44'), (0, 'C44'), (0, 'C4'), (0, 'HN44'))),\n+ '4ANRB': (((0, 'C44'), (0, 'CT44'), (0, 'N44'), (0, 'O44')), ((0, 'N44'), (0, 'C44'), (0, 'C4'), (0, 'HN44'))),\n+ '4BNSB': (((0, 'C44'), (0, 'CT44'), (0, 'N44'), (0, 'O44')), ((0, 'N44'), (0, 'C44'), (0, 'C4'), (0, 'HN44'))),\n+ '4BNASB': (((0, 'CN'), (0, 'CA'), (0, 'N4'), (0, 'ON')), ((0, 'N4'), (0, 'CN'), (0, 'C4'), (0, 'HN4')), ((0, 'C42'), (0, 'CT42'), (0, 'N42'), (0, 'O42'))),\n+ '4BDASB': (((0, 'CN'), (0, 'CA'), (0, 'N4'), (0, 'ON')), ((0, 'N4'), (0, 'CN'), (0, 'C4'), (0, 'HN4')), ((0, 'C42'), (0, 'CT42'), (0, 'N42'), (0, 'O42'))),\n+ '3BNANA': (((0, 'CLP3'), (0, 'CL3'), (0, 'NL3'), (0, 'OL3')), ((0, 'NL3'), (0, 'CLP3'), (0, 'CA3'), (0, 'HL3')), ((0, 'CRP3'), (0, 'CA3'), (0, 'NR3'), (0, 'OR3')), ((0, 'NR3'), (0, 'CRP3'), (0, 'C3'), (0, 'HR3'))),\n+ '3ANANA': (((0, 'CLP3'), (0, 'CL3'), (0, 'NL3'), (0, 'OL3')), ((0, 'NL3'), (0, 'CLP3'), (0, 'CA3'), (0, 'HL3')), ((0, 'CRP3'), (0, 'CA3'), (0, 'NR3'), (0, 'OR3')), ((0, 'NR3'), (0, 'CRP3'), (0, 'C3'), (0, 'HR3'))),\n+ '4BNANA': (((0, 'CLP4'), (0, 'CL4'), (0, 'NL4'), (0, 'OL4')), ((0, 'NL4'), (0, 'CLP4'), (0, 'CA4'), (0, 'HL4')), ((0, 'CRP4'), (0, 'CA4'), (0, 'NR4'), (0, 'OR4')), ((0, 'NR4'), (0, 'CRP4'), (0, 'C4'), (0, 'HR4'))),\n+ '4ANANA': (((0, 'CLP4'), (0, 'CL4'), (0, 'NL4'), (0, 'OL4')), ((0, 'NL4'), (0, 'CLP4'), (0, 'CA4'), (0, 'HL4')), ((0, 'CRP4'), (0, 'CA4'), (0, 'NR4'), (0, 'OR4')), ((0, 'NR4'), (0, 'CRP4'), (0, 'C4'), (0, 'HR4'))),\n+ '4BNSNA': (((0, 'CLP4'), (0, 'CL4'), (0, 'NL4'), (0, 'OL4')), ((0, 'NL4'), (0, 'CLP4'), (0, 'CA4'), (0, 'HL4')), ((0, 'CRP4'), (0, 'CA4'), (0, 'NR4'), (0, 'OR4')), ((0, 'NR4'), (0, 'CRP4'), (0, 'C4'), (0, 'HR4'))),\n+ '3BNSNA': (((0, 'CLP3'), (0, 'CL3'), (0, 'NL3'), (0, 'OL3')), ((0, 'NL3'), (0, 'CLP3'), (0, 'CA3'), (0, 'HL3')), ((0, 'CRP3'), (0, 'CA3'), (0, 'NR3'), (0, 'OR3')), ((0, 'NR3'), (0, 'CRP3'), (0, 'C3'), (0, 'HR3'))),\n+ '4ANTNA': (((0, 'CLP4'), (0, 'CL4'), (0, 'NL4'), (0, 'OL4')), ((0, 'NL4'), (0, 'CLP4'), (0, 'CA4'), (0, 'HL4')), ((0, 'CRP4'), (0, 'CA4'), (0, 'NR4'), (0, 'OR4')), ((0, 'NR4'), (0, 'CRP4'), (0, 'C4'), (0, 'HR4'))),\n+ '4BNTNA': (((0, 'CLP4'), (0, 'CL4'), (0, 'NL4'), (0, 'OL4')), ((0, 'NL4'), (0, 'CLP4'), (0, 'CA4'), (0, 'HL4')), ((0, 'CRP4'), (0, 'CA4'), (0, 'NR4'), (0, 'OR4')), ((0, 'NR4'), (0, 'CRP4'), (0, 'C4'), (0, 'H4'))),\n+ '4ANGNA': (((0, 'CLP4'), (0, 'CL4'), (0, 'NL4'), (0, 'OL4')), ((0, 'NL4'), (0, 'CLP4'), (0, 'CA4'), (0, 'HL4')), ((0, 'CRP4'), (0, 'CA4'), (0, 'NR4'), (0, 'OR4')), ((0, 'NR4'), (0, 'CRP4'), (0, 'C4'), (0, 'HR4'))),\n+ '4BNGNA': (((0, 'CLP4'), (0, 'CL4'), (0, 'NL4'), (0, 'OL4')), ((0, 'NL4'), (0, 'CLP4'), (0, 'CA4'), (0, 'HL4')), ((0, 'CRP4'), (0, 'CA4'), (0, 'NR4'), (0, 'OR4')), ((0, 'NR4'), (0, 'CRP4'), (0, 'C4'), (0, 'HR4'))),\n+ '6TNG2': (((0, 'CT6'), (0, 'CA6'), (0, 'OT62'), (0, 'OT61')),),\n+ '6TNG': (((0, 'CT6'), (0, 'CA6'), (0, 'OT62'), (0, 'OT61')),),\n+ '7TNG': (((0, 'CT7'), (0, 'CA7'), (0, 'OT72'), (0, 'OT71')),),\n+ '2ANA': (((0, 'CRP2'), (0, 'CA2'), (0, 'NR2'), (0, 'OR2')), ((0, 'NR2'), (0, 'CRP2'), (0, 'C2'), (0, 'HR2'))),\n+ '2BNA': (((0, 'CRP2'), (0, 'CA2'), (0, 'NR2'), (0, 'OR2')), ((0, 'NR2'), (0, 'CRP2'), (0, 'C2'), (0, 'HR2'))),\n+ '6TCOO': (((0, 'C6'), (0, 'C5'), (0, 'O62'), (0, 'O61')),),\n+ '3BMDP': (((0, 'NX'), (0, 'CE3'), (0, 'CAX'), (0, 'HNX')), ((0, 'CX'), (0, 'CAX'), (0, 'NY'), (0, 'OX')), ((0, 'NY'), (0, 'CX'), (0, 'CAY'), (0, 'HNY')), ((0, 'CY'), (0, 'CGY'), (0, 'NT'), (0, 'OY')), ((0, 'CD'), (0, 'CA'), (0, 'OE2'), (0, 'OE1')), ((0, 'CY'), (0, 'NT'), (0, 'CAY'), (0, 'OY')), ((0, 'CY'), (0, 'CAY'), (0, 'NT'), (0, 'OY')), ((0, 'NT'), (0, 'C'), (0, 'HT21'), (0, 'HT2')), ((0, 'NT'), (0, 'C'), (0, 'HT2'), (0, 'HT21'))),\n+ '6COOME': (((0, 'C6'), (0, 'C5'), (0, 'O62'), (0, 'O61')),),\n+ '1AGLYA': (((0, 'C7'), (0, 'C8'), (0, 'O7B'), (0, 'O7A')),),\n+ '1BGLYA': (((0, 'C7'), (0, 'C8'), (0, 'O7B'), (0, 'O7A')),),\n+ '1AOS': (((0, 'CP'), (0, 'CA1'), (0, 'OT2'), (0, 'OT1')),),\n+ '1ANGF': (((0, 'C'), (0, 'CA'), (0, 'N1'), (0, 'O')), ((0, 'N1'), (0, 'C'), (0, 'C1'), (0, 'HN1'))),\n+ '1BNGF': (((0, 'C'), (0, 'CA'), (0, 'N1'), (0, 'O')), ((0, 'N1'), (0, 'C'), (0, 'C1'), (0, 'HN1'))),\n+ 'LIPAN1': (((0, 'C11'), (0, 'C12'), (0, 'N'), (0, 'O11')), ((0, 'N'), (0, 'C11'), (0, 'C2'), (0, 'HN2'))),\n+ 'LIPAN2': (((0, 'C31'), (0, 'C32'), (0, 'N'), (0, 'O31')), ((0, 'N'), (0, 'C31'), (0, 'C2'), (0, 'HN2'))),\n+ '4ANSDB': (((0, 'C44'), (0, 'CT44'), (0, 'N44'), (0, 'O44')), ((0, 'N44'), (0, 'C44'), (0, 'C4'), (0, 'HN44'))),\n+ '4BNSDB': (((0, 'C44'), (0, 'CT44'), (0, 'N44'), (0, 'O44')), ((0, 'N44'), (0, 'C44'), (0, 'C4'), (0, 'HN44'))),\n+ '4ANDHH': (((0, 'C44'), (0, 'CT44'), (0, 'N44'), (0, 'O44')), ((0, 'N44'), (0, 'C44'), (0, 'C4'), (0, 'HN44'))),\n+ '4BNDHH': (((0, 'C44'), (0, 'CT44'), (0, 'N44'), (0, 'O44')), ((0, 'N44'), (0, 'C44'), (0, 'C4'), (0, 'HN44'))),\n+ '4ANRHP': (((0, 'C44'), (0, 'CT44'), (0, 'N44'), (0, 'O44')), ((0, 'N44'), (0, 'C44'), (0, 'C4'), (0, 'HN44'))),\n+ '4BNRHP': (((0, 'C44'), (0, 'CT44'), (0, 'N44'), (0, 'O44')), ((0, 'N44'), (0, 'C44'), (0, 'C4'), (0, 'HN44'))),\n+ '4ANSHP': (((0, 'C44'), (0, 'CT44'), (0, 'N44'), (0, 'O44')), ((0, 'N44'), (0, 'C44'), (0, 'C4'), (0, 'HN44'))),\n+ '4BNSHP': (((0, 'C44'), (0, 'CT44'), (0, 'N44'), (0, 'O44')), ((0, 'N44'), (0, 'C44'), (0, 'C4'), (0, 'HN44'))),\n+ '3AALAF': (((0, 'CN'), (0, 'CA'), (0, 'N3'), (0, 'ON')), ((0, 'N3'), (0, 'CN'), (0, 'C3'), (0, 'HN3')), ((0, 'CF'), (0, 'HF1'), (0, 'NF'), (0, 'OF'))),\n+ '3BALAF': (((0, 'CN'), (0, 'CA'), (0, 'N3'), (0, 'ON')), ((0, 'N3'), (0, 'CN'), (0, 'C3'), (0, 'HN3')), ((0, 'CF'), (0, 'HF1'), (0, 'NF'), (0, 'OF'))),\n+ '3ANOPR': (((0, 'C'), (0, 'CA'), (0, 'N3'), (0, 'O')), ((0, 'CD'), (0, 'N'), (0, 'CG'), (0, 'OE'))),\n+}\n+delete_impropers = {\n+ 'AMGA': (((0, 'CA'), (0, 'OA2'), (0, 'OA1'), (0, 'CC1')),),\n+ 'GMGA': (((0, 'CG'), (0, 'OG2'), (0, 'OG1'), (0, 'CC3')),),\n+ 'DMGA': (((0, 'CA'), (0, 'OA2'), (0, 'OA1'), (0, 'CC1')), ((0, 'CG'), (0, 'OG2'), (0, 'OG1'), (0, 'CC3'))),\n+ 'AMGT': (((0, 'CA'), (0, 'OA2'), (0, 'OA1'), (0, 'CC1')), ((0, 'CG'), (0, 'OG2'), (0, 'OG1'), (0, 'CC3'))),\n+ 'ATGM': (((0, 'CA'), (0, 'OA2'), (0, 'OA1'), (0, 'CC1')), ((0, 'CG'), (0, 'OG2'), (0, 'OG1'), (0, 'CC3'))),\n+ 'ABGA': (((0, 'CA'), (0, 'OA2'), (0, 'OA1'), (0, 'CC1')),),\n+ 'GBGA': (((0, 'CG'), (0, 'OG2'), (0, 'OG1'), (0, 'CC3')),),\n+ 'DBGA': (((0, 'CA'), (0, 'OA2'), (0, 'OA1'), (0, 'CC1')), ((0, 'CG'), (0, 'OG2'), (0, 'OG1'), (0, 'CC3'))),\n+ 'ALME': (((0, 'CA'), (0, 'OA2'), (0, 'OA1'), (0, 'CC1')),),\n+ 'G4MPAB': (((0, 'CA'), (0, 'OA2'), (0, 'OA1'), (0, 'CC1')),),\n+ 'G4PAB': (((0, 'CA'), (0, 'OA2'), (0, 'OA1'), (0, 'CC1')),),\n+ 'G3PABR': (((0, 'CA'), (0, 'OA2'), (0, 'OA1'), (0, 'CC1')),),\n+ 'G3PABS': (((0, 'CA'), (0, 'OA2'), (0, 'OA1'), (0, 'CC1')),),\n+ 'BPAB': (((0, 'CA'), (0, 'OA2'), (0, 'OA1'), (0, 'CC1')),),\n+ 'BPAT': (((0, 'CA'), (0, 'OA2'), (0, 'OA1'), (0, 'CC1')),),\n+ '3MSB': (((0, 'CA'), (0, 'OA2'), (0, 'OA1'), (0, 'CC1')),),\n+ '2MRB': (((0, 'CA'), (0, 'OA2'), (0, 'OA1'), (0, 'CC1')),),\n+ '2APP': (((0, 'CA'), (0, 'OA2'), (0, 'OA1'), (0, 'CC1')),),\n+ '3APP': (((0, 'CA'), (0, 'OA2'), (0, 'OA1'), (0, 'CC1')),),\n+ '4APP': (((0, 'CA'), (0, 'OA2'), (0, 'OA1'), (0, 'CC1')),),\n+ '2AFP': (((0, 'CA'), (0, 'OA2'), (0, 'OA1'), (0, 'CC1')),),\n+ '3AFP': (((0, 'CA'), (0, 'OA2'), (0, 'OA1'), (0, 'CC1')),),\n+ '4AFP': (((0, 'CA'), (0, 'OA2'), (0, 'OA1'), (0, 'CC1')),),\n+ '4FBP': (((0, 'CA'), (0, 'OA2'), (0, 'OA1'), (0, 'CC1')),),\n+ '3FBP': (((0, 'CA'), (0, 'OA2'), (0, 'OA1'), (0, 'CC1')),),\n+ '2FBP': (((0, 'CA'), (0, 'OA2'), (0, 'OA1'), (0, 'CC1')),),\n+ '3MRB': (((0, 'CA'), (0, 'OA2'), (0, 'OA1'), (0, 'CC1')),),\n+ '2MSB': (((0, 'CA'), (0, 'OA2'), (0, 'OA1'), (0, 'CC1')),),\n+ '3A2MPP': (((0, 'CA'), (0, 'OA2'), (0, 'OA1'), (0, 'CC1')),),\n+ '4A2MPP': (((0, 'CA'), (0, 'OA2'), (0, 'OA1'), (0, 'CC1')),),\n+ '3XBP': (((0, 'CA'), (0, 'OA2'), (0, 'OA1'), (0, 'CC1')),),\n+ 'DFTO': (((0, 'C5'), (0, 'C4'), (0, 'C6'), (0, 'C5M')), ((0, 'C4'), (0, 'C3'), (0, 'C5'), (0, 'F4')), ((0, 'C2'), (0, 'C1'), (0, 'C3'), (0, 'F2'))),\n+ 'ENOU': (((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'O4')),),\n+ 'UENO': (((0, 'C4'), (0, 'N3'), (0, 'C5'), (0, 'O4')),),\n+ '5UHG': (((0, 'C10'), (0, 'O11'), (0, 'O12'), (0, 'C9')),),\n+ '5UHA': (((0, 'C13'), (0, 'O30'), (0, 'O31'), (0, 'C12')),),\n+ 'CYTP': (((0, 'N4'), (0, 'C4'), (0, 'H41'), (0, 'H42')), ((0, 'C4'), (0, 'N3'), (0, 'C5'), (0, 'N4'))),\n+ '3MCN': (((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'N4')),),\n+ 'ADEP': (((0, 'N6'), (0, 'C6'), (0, 'H61'), (0, 'H62')), ((0, 'C6'), (0, 'N1'), (0, 'C5'), (0, 'N6'))),\n+ 'ADEI': (((0, 'C6'), (0, 'N1'), (0, 'C5'), (0, 'N6')),),\n+ '1MAN': (((0, 'C6'), (0, 'C5'), (0, 'N1'), (0, 'N6')),),\n+ '6AH': (((0, 'C13'), (0, 'ODB'), (0, 'ODA'), (0, 'C12')),),\n+ 'GENO': (((0, 'C6'), (0, 'N1'), (0, 'C5'), (0, 'O6')), ((0, 'N2'), (0, 'H21'), (0, 'C2'), (0, 'H22'))),\n+ '7MGE': (((0, 'C6'), (0, 'C5'), (0, 'N1'), (0, 'O6')),),\n+ 'BUGN': (((0, 'C17'), (0, 'O17'), (0, 'O18'), (0, 'C15')),),\n+}\n+\n+residue_order = {\n+ 'ALA': 0,\n+ 'ARG': 1,\n+ 'ASN': 2,\n+ 'ASP': 3,\n+ 'CYS': 4,\n+ 'GLN': 5,\n+ 'GLU': 6,\n+ 'GLY': 7,\n+ 'HSD': 8,\n+ 'HSE': 9,\n+ 'HSP': 10,\n+ 'ILE': 11,\n+ 'LEU': 12,\n+ 'LYS': 13,\n+ 'MET': 14,\n+ 'PHE': 15,\n+ 'PRO': 16,\n+ 'SER': 17,\n+ 'THR': 18,\n+ 'TRP': 19,\n+ 'TYR': 20,\n+ 'VAL': 21,\n+ 'ALAD': 22,\n+ 'CYM': 23,\n+ 'GUA': 24,\n+ 'ADE': 25,\n+ 'CYT': 26,\n+ 'THY': 27,\n+ 'URA': 28,\n+ 'AGLCA': 29,\n+ 'BGLCA': 30,\n+ 'BGLCA0': 31,\n+ 'AIDOA': 32,\n+ 'BIDOA': 33,\n+ 'AGLCNA': 34,\n+ 'BGLCNA': 35,\n+ 'BGLCN0': 36,\n+ 'AGALNA': 37,\n+ 'BGALNA': 38,\n+ 'ANE5AC': 39,\n+ 'BNE5AC': 40,\n+ 'ALLOSE': 41,\n+ 'PSICOS': 42,\n+ 'LPPC': 43,\n+ 'DLPC': 44,\n+ 'DLPE': 45,\n+ 'DLPS': 46,\n+ 'DLPA': 47,\n+ 'DLPG': 48,\n+ 'DMPC': 49,\n+ 'DMPE': 50,\n+ 'DMPS': 51,\n+ 'DMPA': 52,\n+ 'DMPG': 53,\n+ 'DPPC': 54,\n+ 'DPPE': 55,\n+ 'DPPS': 56,\n+ 'DPPA': 57,\n+ 'DPPG': 58,\n+ 'DSPC': 59,\n+ 'DSPE': 60,\n+ 'DSPS': 61,\n+ 'DSPA': 62,\n+ 'DSPG': 63,\n+ 'DOPC': 64,\n+ 'DOPE': 65,\n+ 'DOPS': 66,\n+ 'DOPA': 67,\n+ 'DOPG': 68,\n+ 'POPC': 69,\n+ 'POPE': 70,\n+ 'POPS': 71,\n+ 'POPA': 72,\n+ 'POPG': 73,\n+ 'SAPC': 74,\n+ 'SDPC': 75,\n+ 'SOPC': 76,\n+ 'DAPC': 77,\n+ 'ACET': 78,\n+ 'PROA': 79,\n+ 'GUAN': 80,\n+ 'MGUA': 81,\n+ 'GLYN': 82,\n+ 'ACEH': 83,\n+ 'FORM': 84,\n+ 'ACEM': 85,\n+ 'PRAM': 86,\n+ 'NMA': 87,\n+ 'AANM': 88,\n+ 'APNH': 89,\n+ 'PDIP': 90,\n+ 'PNH2': 91,\n+ 'CO3': 92,\n+ 'AALD': 93,\n+ 'PALD': 94,\n+ 'CALD': 95,\n+ 'BALD': 96,\n+ '4AP2': 97,\n+ '3APY': 98,\n+ '34AP': 99,\n+ '3CPY': 100,\n+ '3FLP': 101,\n+ '3ALP': 102,\n+ '3HOP': 103,\n+ '3MEP': 104,\n+ '3ETP': 105,\n+ '3BPY': 106,\n+ '3CYP': 107,\n+ '3ACP': 108,\n+ '3NAP': 109,\n+ '3CAP': 110,\n+ '3PHP': 111,\n+ '3BNP': 112,\n+ 'MAS': 113,\n+ 'ETAC': 114,\n+ 'MPRO': 115,\n+ 'ACHO': 116,\n+ 'GLYC': 117,\n+ 'AAPM': 118,\n+ 'MBUT': 119,\n+ 'CSAD': 120,\n+ 'CSGU': 121,\n+ 'CSTH': 122,\n+ 'CSCY': 123,\n+ 'CNAD': 124,\n+ 'CNGU': 125,\n+ 'CNTH': 126,\n+ 'CNT1': 127,\n+ 'CNT2': 128,\n+ 'CNT3': 129,\n+ 'CNCY': 130,\n+ 'THFI': 131,\n+ 'THMI': 132,\n+ 'TADE': 133,\n+ 'TCYT': 134,\n+ 'TGUA': 135,\n+ 'TTHY': 136,\n+ 'TURA': 137,\n+ 'THAO': 138,\n+ 'NUSA': 139,\n+ 'NUSG': 140,\n+ 'NUSC': 141,\n+ 'NUST': 142,\n+ 'NUSU': 143,\n+ 'RNUS': 144,\n+ 'RNUA': 145,\n+ 'RNUG': 146,\n+ 'RNUC': 147,\n+ 'NUCL': 148,\n+ 'NADE': 149,\n+ 'NTHY': 150,\n+ 'NIC': 151,\n+ 'NICH': 152,\n+ 'AMP': 153,\n+ 'ADP': 154,\n+ 'ATP': 155,\n+ 'NAD': 156,\n+ 'NADH': 157,\n+ 'NADP': 158,\n+ 'NDPH': 159,\n+ 'MAM1': 160,\n+ 'SAH': 161,\n+ 'BF6': 162,\n+ 'BF7': 163,\n+ 'BCA': 164,\n+ 'C36': 165,\n+ 'C37': 166,\n+ 'C3C': 167,\n+ 'PRAL': 168,\n+ 'UREA': 169,\n+ 'MGU1': 170,\n+ 'MGU2': 171,\n+ 'HDZ1': 172,\n+ 'HDZ2': 173,\n+ 'CA': 174,\n+ 'DCA': 175,\n+ 'LCA': 176,\n+ 'CDCA': 177,\n+ 'UDCA': 178,\n+ 'GA': 179,\n+ 'BAB1': 180,\n+ 'FBIB': 181,\n+ '2PDO': 182,\n+ 'ACO': 183,\n+ 'IPAA': 184,\n+ 'AMOP': 185,\n+ '2MPA': 186,\n+ '2AMP': 187,\n+ '3AMP': 188,\n+ '2AMF': 189,\n+ 'GABD': 190,\n+ 'AMOL': 191,\n+ '9MAD': 192,\n+ '1MTH': 193,\n+ 'FORA': 194,\n+ 'BTON': 195,\n+ 'CHON': 196,\n+ 'DMTT': 197,\n+ 'DMCB': 198,\n+ 'DECB': 199,\n+ 'FORH': 200,\n+ 'DMA': 201,\n+ 'DMF': 202,\n+ 'MRDN': 203,\n+ 'MEOI': 204,\n+ 'OIRD': 205,\n+ 'BAB2': 206,\n+ 'DMCA': 207,\n+ 'DECA': 208,\n+ 'URAC': 209,\n+ '2PYO': 210,\n+ 'HDZ1B': 211,\n+ 'PHMK': 212,\n+ 'PHEK': 213,\n+ 'BEON': 214,\n+ 'AMDN': 215,\n+ 'BAMI': 216,\n+ 'PNTM': 217,\n+ 'MHYO': 218,\n+ 'OIHY': 219,\n+ 'MOET': 220,\n+ 'MOBU': 221,\n+ 'MTDO': 222,\n+ 'AMET': 223,\n+ 'NIME': 224,\n+ 'NIPR': 225,\n+ 'AZDO': 226,\n+ 'ZOIC': 227,\n+ 'MBOA': 228,\n+ 'YTHY': 229,\n+ 'RIN': 230,\n+ 'YTS2': 231,\n+ 'YT4S': 232,\n+ 'YT2S': 233,\n+ 'TC243C': 234,\n+ '4PYO': 235,\n+ '1PH4PO': 236,\n+ '21QU': 237,\n+ '1PH2PO': 238,\n+ '3PHURA': 239,\n+ 'URA2S': 240,\n+ '3PH2SR': 241,\n+ 'URA4S': 242,\n+ '3PH4SR': 243,\n+ 'URA24S': 244,\n+ '3PH24S': 245,\n+ '43HPY': 246,\n+ '43PPY': 247,\n+ '43HSPY': 248,\n+ '43HSPP': 249,\n+ '4O2SM': 250,\n+ 'NZAD': 251,\n+ 'NACT': 252,\n+ 'CO31': 253,\n+ 'GBL': 254,\n+ 'B2FO': 255,\n+ 'A2FO': 256,\n+ 'MT2A': 257,\n+ 'DH3T': 258,\n+ 'EEPI': 259,\n+ 'PYO2B': 260,\n+ 'PYO3B': 261,\n+ 'PYO2F': 262,\n+ 'PYO3F': 263,\n+ 'BTMC': 264,\n+ 'BM6A': 265,\n+ 'CBHH': 266,\n+ 'WEI1': 267,\n+ 'WEI2': 268,\n+ 'MSCH': 269,\n+ 'WEI3': 270,\n+ 'INCA': 271,\n+ 'TICA': 272,\n+ 'GTPG': 273,\n+ 'GTGN': 274,\n+ 'GTSS': 275,\n+ 'GTNS': 276,\n+ '2OXT': 277,\n+ '3OXT': 278,\n+ 'PRF': 279,\n+ 'B2SU': 280,\n+ 'B4SU': 281,\n+ 'B52U': 282,\n+ 'BH2U': 283,\n+ 'BMDU': 284,\n+ 'B5HU': 285,\n+ 'BMOU': 286,\n+ 'B3MU': 287,\n+ 'BCYU': 288,\n+ 'BPSU': 289,\n+ 'B1MP': 290,\n+ 'B3MP': 291,\n+ 'BSAU': 292,\n+ 'B5AU': 293,\n+ 'BU8U': 294,\n+ 'BSEU': 295,\n+ 'B5DU': 296,\n+ 'BSCU': 297,\n+ 'BIAU': 298,\n+ 'BISU': 299,\n+ 'B5CU': 300,\n+ 'BOCU': 301,\n+ 'B70U': 302,\n+ 'BBCU': 303,\n+ 'BHCU': 304,\n+ 'BCMU': 305,\n+ 'BOAU': 306,\n+ 'BOEU': 307,\n+ 'B3AU': 308,\n+ 'B13P': 309,\n+ 'B5TU': 310,\n+ 'BSTU': 311,\n+ 'BGAU': 312,\n+ 'BGCU': 313,\n+ 'B2SC': 314,\n+ 'B5MC': 315,\n+ 'BHMC': 316,\n+ 'B5FC': 317,\n+ 'B4MC': 318,\n+ 'B4AC': 319,\n+ 'B3MC': 320,\n+ 'B1PC': 321,\n+ 'B3PC': 322,\n+ 'B6MA': 323,\n+ 'B2MA': 324,\n+ 'B8MA': 325,\n+ 'BINO': 326,\n+ 'B1MI': 327,\n+ 'BSMA': 328,\n+ 'B6AA': 329,\n+ 'B1MA': 330,\n+ 'B6IA': 331,\n+ 'BHIA': 332,\n+ 'BMIA': 333,\n+ 'BSIA': 334,\n+ 'BHNA': 335,\n+ 'B26A': 336,\n+ 'B66A': 337,\n+ 'BT6A': 338,\n+ 'B12A': 339,\n+ 'B6GA': 340,\n+ 'B1MG': 341,\n+ 'B2MG': 342,\n+ 'B7MG': 343,\n+ 'B27G': 344,\n+ 'BDCG': 345,\n+ 'BRCG': 346,\n+ 'BDAG': 347,\n+ 'BQUG': 348,\n+ 'BEQG': 349,\n+ 'BDWG': 350,\n+ 'BIMG': 351,\n+ 'BIWG': 352,\n+ 'BMWG': 353,\n+ 'BYYG': 354,\n+ 'BHWG': 355,\n+ 'BPBG': 356,\n+ 'BBUG': 357,\n+ '7MIP': 358,\n+ 'M6PA': 359,\n+ 'MOAC': 360,\n+ '5FOP': 361,\n+ 'PESU': 362,\n+ 'CMBZ': 363,\n+ 'PRNC': 364,\n+ 'BZHA': 365,\n+ 'MOAT': 366,\n+ 'MOAE': 367,\n+ 'MPYU': 368,\n+ 'HPAT': 369,\n+ 'BZAC': 370,\n+ '3PRU': 371,\n+ 'PMMU': 372,\n+ 'BZAA': 373,\n+ '12MU': 374,\n+ 'HPME': 375,\n+ 'OEBZ': 376,\n+ 'ATBZ': 377,\n+ 'PYMU': 378,\n+ 'ACBZ': 379,\n+ 'NMGN': 380,\n+ 'NMCY': 381,\n+ 'MMMU': 382,\n+ 'NMGI': 383,\n+ 'MEBZ': 384,\n+ 'AMBA': 385,\n+ 'NCYP': 386,\n+ 'PNCP': 387,\n+ 'BK2C': 388,\n+ 'BR2C': 389,\n+ 'BM2G': 390,\n+ 'BN2G': 391,\n+ 'FLMO': 392,\n+ 'FLMR': 393,\n+ 'FLVO': 394,\n+ 'FLVR': 395,\n+ 'RFVO': 396,\n+ 'RFVR': 397,\n+ 'FMNO': 398,\n+ 'FMNR': 399,\n+ 'FAD': 400,\n+ 'FADR': 401,\n+ 'ABMB': 402,\n+ 'ABEB': 403,\n+ 'ABBM': 404,\n+ 'ABNB': 405,\n+ 'ABSB': 406,\n+ 'ASBB': 407,\n+ 'SM002': 408,\n+ 'SM005': 409,\n+ 'SM011': 410,\n+ 'SM013': 411,\n+ 'SM016': 412,\n+ 'SM018': 413,\n+ 'SM019': 414,\n+ 'SM021': 415,\n+ 'SM022': 416,\n+ 'SM025': 417,\n+ 'SM027': 418,\n+ 'SM030': 419,\n+ 'SM031': 420,\n+ 'SM038': 421,\n+ 'SM040': 422,\n+ 'SM041': 423,\n+ 'SM043': 424,\n+ 'SM044': 425,\n+ 'SM045': 426,\n+ 'SM046': 427,\n+ 'SM047': 428,\n+ 'SM049': 429,\n+ 'SM050': 430,\n+ 'SM051': 431,\n+ 'SM057': 432,\n+ 'SM058': 433,\n+ 'SM060': 434,\n+ 'SM061': 435,\n+ 'SM064': 436,\n+ 'SM068': 437,\n+ 'SM072': 438,\n+ 'SM075': 439,\n+ 'SM077': 440,\n+ 'SM084': 441,\n+ 'SM085': 442,\n+ 'SM086': 443,\n+ 'SM087': 444,\n+ 'SM088': 445,\n+ 'SM092': 446,\n+ 'SM098': 447,\n+ 'SM099': 448,\n+ 'SM100': 449,\n+ 'SM101': 450,\n+ 'SM102': 451,\n+ 'SM103': 452,\n+ 'SM106': 453,\n+ 'SM108': 454,\n+ 'SM109': 455,\n+ 'SM110': 456,\n+ 'SM111': 457,\n+ 'SM116': 458,\n+ 'SM117': 459,\n+ 'SM118': 460,\n+ 'SM127': 461,\n+ 'SM128': 462,\n+ 'SM132': 463,\n+ 'SM134': 464,\n+ 'SM135': 465,\n+ 'SM137': 466,\n+ 'SM143': 467,\n+ 'SM144': 468,\n+ 'SM169': 469,\n+ 'SM172': 470,\n+ 'SM173': 471,\n+ 'SM174': 472,\n+ 'SM176': 473,\n+ 'SM179': 474,\n+ 'SM180': 475,\n+ 'SM181': 476,\n+ 'SM185': 477,\n+ 'SM187': 478,\n+ 'SM189': 479,\n+ 'SM194': 480,\n+ 'SM199': 481,\n+ 'SM213': 482,\n+ 'SM214': 483,\n+ 'SM215': 484,\n+ 'SM216': 485,\n+ 'SM218': 486,\n+ 'SM221': 487,\n+ 'SM224': 488,\n+ 'SM227': 489,\n+ 'SM233': 490,\n+ 'SM234': 491,\n+ 'SM237': 492,\n+ 'SM238': 493,\n+ 'SM239': 494,\n+ 'SM240': 495,\n+ 'SM241': 496,\n+ 'SM242': 497,\n+ 'MGU3': 498,\n+ 'PGUN': 499,\n+ 'MGUN': 500,\n+ 'ALDD': 501,\n+ 'DALA': 502,\n+ 'DARG': 503,\n+ 'DASN': 504,\n+ 'DASP': 505,\n+ 'DCYS': 506,\n+ 'DGLN': 507,\n+ 'DGLU': 508,\n+ 'DGLY': 509,\n+ 'DHSD': 510,\n+ 'DHSE': 511,\n+ 'DHSP': 512,\n+ 'DILE': 513,\n+ 'DLEU': 514,\n+ 'DLYS': 515,\n+ 'DMET': 516,\n+ 'DPHE': 517,\n+ 'DPRO': 518,\n+ 'DSER': 519,\n+ 'DTHR': 520,\n+ 'DTRP': 521,\n+ 'DTYR': 522,\n+ 'DVAL': 523,\n+ 'LYR': 524,\n+ 'HEME': 525,\n+ 'LFN': 526,\n+ 'LFNR': 527,\n+ 'RBF': 528,\n+ 'RBFR': 529,\n+ 'FMN': 530,\n+ 'FOL': 531,\n+ 'FOLN1': 532,\n+ 'FOLDPR': 533,\n+ 'PTM6N3': 534,\n+ 'PTM6N1': 535,\n+ 'PTRN1': 536,\n+ 'PE0': 537,\n+ 'DPRPTR': 538,\n+ 'THG': 539,\n+ 'THGN1': 540,\n+ 'DHF': 541,\n+ 'DHFN1': 542,\n+ 'TPT358': 543,\n+ 'TPT158': 544,\n+ 'DPTN38': 545,\n+ 'DPTN18': 546,\n+ 'H4B': 547,\n+ 'H4BN1': 548,\n+ 'COB': 549,\n+ 'F430': 550,\n+ 'F43T': 551,\n+ 'F43A': 552,\n+ 'ALY': 553,\n+ 'DORN': 554,\n+ 'NLE': 555,\n+ 'AIBD': 556,\n+ 'AIB': 557,\n+ 'ASPM': 558,\n+ 'LEM': 559,\n+ 'LYM': 560,\n+ 'NMGLYD': 561,\n+ 'MGY': 562,\n+ 'HYP': 563,\n+ 'HIC': 564,\n+ 'HICP': 565,\n+ 'NAPH': 566,\n+ '143': 567,\n+ '0TD': 568,\n+ '2CO': 569,\n+ '4HH': 570,\n+ '5CS': 571,\n+ '6V1': 572,\n+ 'AGT': 573,\n+ 'ALS': 574,\n+ 'APK': 575,\n+ 'ASB': 576,\n+ 'BXT': 577,\n+ 'CGU': 578,\n+ 'CGV': 579,\n+ 'CME': 580,\n+ 'CML': 581,\n+ 'CSO': 582,\n+ 'CSS': 583,\n+ 'CSU': 584,\n+ 'CSX': 585,\n+ 'CYD': 586,\n+ 'CYF': 587,\n+ 'CYG': 588,\n+ 'CYQP': 589,\n+ 'DBZ': 590,\n+ 'DDE': 591,\n+ 'FHO': 592,\n+ 'FZN': 593,\n+ 'HIP': 594,\n+ 'HIX': 595,\n+ 'HTI': 596,\n+ 'IAM': 597,\n+ 'IT1': 598,\n+ 'IT1P': 599,\n+ 'JJJ': 600,\n+ 'KCR': 601,\n+ 'KCX': 602,\n+ 'KPI': 603,\n+ 'LA2': 604,\n+ 'LLP': 605,\n+ 'LLPP': 606,\n+ 'M0H': 607,\n+ 'MCL': 608,\n+ 'MCS': 609,\n+ 'MHS': 610,\n+ 'MLZ': 611,\n+ 'NEP': 612,\n+ 'PRV': 613,\n+ 'QCS': 614,\n+ 'QPA': 615,\n+ 'R1A': 616,\n+ 'SDP': 617,\n+ 'SEB': 618,\n+ 'SEN': 619,\n+ 'SGB': 620,\n+ 'SNC': 621,\n+ 'SUN': 622,\n+ 'SVX': 623,\n+ 'SVY': 624,\n+ 'TOX': 625,\n+ 'TPQ': 626,\n+ 'TQQ': 627,\n+ 'TRQ': 628,\n+ 'TRW': 629,\n+ 'TS9': 630,\n+ 'TYS': 631,\n+ 'XCN': 632,\n+ '0AF': 633,\n+ '26P': 634,\n+ '2FM': 635,\n+ '2HF': 636,\n+ '2HFD': 637,\n+ '2HFE': 638,\n+ '2NP': 639,\n+ '32T': 640,\n+ '3GL': 641,\n+ '4FW': 642,\n+ '4HT': 643,\n+ '4IN': 644,\n+ '6CL': 645,\n+ 'ACZ': 646,\n+ 'AGM': 647,\n+ 'AHB': 648,\n+ 'ARO': 649,\n+ 'AZDA': 650,\n+ 'DAZDA': 651,\n+ 'BB8': 652,\n+ 'BCS': 653,\n+ 'BHD': 654,\n+ 'BTH3': 655,\n+ 'DBTH3': 656,\n+ 'CAN': 657,\n+ 'CCS': 658,\n+ 'CIR': 659,\n+ 'CSA': 660,\n+ 'DDZ': 661,\n+ 'ESC': 662,\n+ 'F2F': 663,\n+ 'FGA4': 664,\n+ 'DFGA4': 665,\n+ 'FPH2': 666,\n+ 'DFPH2': 667,\n+ 'FT6': 668,\n+ 'FTR': 669,\n+ 'FUA2': 670,\n+ 'DFUA2': 671,\n+ 'FVAL': 672,\n+ 'DFVAL': 673,\n+ 'GDPR': 674,\n+ 'DGDPR': 675,\n+ 'GGB': 676,\n+ 'GGBP': 677,\n+ 'GHG': 678,\n+ 'HGA': 679,\n+ 'HOX': 680,\n+ 'HTR': 681,\n+ 'IGL': 682,\n+ 'KYN': 683,\n+ 'LE1': 684,\n+ 'LED': 685,\n+ 'LEF': 686,\n+ 'LME': 687,\n+ 'LVN': 688,\n+ 'M2S': 689,\n+ 'ME0': 690,\n+ 'NIY': 691,\n+ 'OBF': 692,\n+ 'OCY': 693,\n+ 'OMX': 694,\n+ 'PBF': 695,\n+ 'PF5': 696,\n+ 'PYR2': 697,\n+ 'DPYR2': 698,\n+ 'PYZ1': 699,\n+ 'DPYZ1': 700,\n+ 'QU32': 701,\n+ 'DQU32': 702,\n+ 'QX32': 703,\n+ 'DQX32': 704,\n+ 'STYA': 705,\n+ 'DSTYA': 706,\n+ 'TEZA': 707,\n+ 'DTEZA': 708,\n+ 'TFG2': 709,\n+ 'DTFG2': 710,\n+ 'TFG3': 711,\n+ 'DTFG3': 712,\n+ 'TFG4': 713,\n+ 'DTFG4': 714,\n+ 'TFLE': 715,\n+ 'DTFLE': 716,\n+ 'TFP2': 717,\n+ 'DTFP2': 718,\n+ 'TFP3': 719,\n+ 'DTFP3': 720,\n+ 'TFP4': 721,\n+ 'DTFP4': 722,\n+ 'THG2': 723,\n+ 'DTHG2': 724,\n+ 'THG3': 725,\n+ 'DTHG3': 726,\n+ 'THIC': 727,\n+ 'DTHIC': 728,\n+ 'TIH': 729,\n+ 'TRO': 730,\n+ 'TTQ': 731,\n+ 'TY2': 732,\n+ 'TYQ': 733,\n+ 'TZA4': 734,\n+ 'DTZA4': 735,\n+ 'YCM': 736,\n+ 'YOF': 737,\n+ '004': 738,\n+ '0A1': 739,\n+ '0BN': 740,\n+ '2AG': 741,\n+ '2AS': 742,\n+ '3CF': 743,\n+ '3FG': 744,\n+ '4CF': 745,\n+ '4CY': 746,\n+ '4HMP': 747,\n+ 'D4HMP': 748,\n+ '4PH': 749,\n+ 'AA4': 750,\n+ 'ABA': 751,\n+ 'AHP': 752,\n+ 'ALC': 753,\n+ 'ALN': 754,\n+ 'ALO': 755,\n+ 'ANTH': 756,\n+ 'DANTH': 757,\n+ 'APD': 758,\n+ 'APM': 759,\n+ 'AS2': 760,\n+ 'BIF': 761,\n+ 'BUG': 762,\n+ 'CHG': 763,\n+ 'CNP2': 764,\n+ 'DCNP2': 765,\n+ 'CPA3': 766,\n+ 'DCPA3': 767,\n+ 'D4P': 768,\n+ 'DAB': 769,\n+ 'DAH': 770,\n+ 'DIAL': 771,\n+ 'DDILE': 772,\n+ 'DIPH': 773,\n+ 'DDIPH': 774,\n+ 'DMK': 775,\n+ 'DMP3': 776,\n+ 'DDMP3': 777,\n+ 'DPP': 778,\n+ 'FPG2': 779,\n+ 'DFPG2': 780,\n+ 'FPG3': 781,\n+ 'DFPG3': 782,\n+ 'FPG4': 783,\n+ 'DFPG4': 784,\n+ 'FPH3': 785,\n+ 'DFPH3': 786,\n+ 'GBUT': 787,\n+ 'DGBUT': 788,\n+ 'GME': 789,\n+ 'HCS': 790,\n+ 'HHK': 791,\n+ 'HIL4': 792,\n+ 'DHIL4': 793,\n+ 'HL2': 794,\n+ 'HLEU': 795,\n+ 'DHLEU': 796,\n+ 'HLU': 797,\n+ 'HPE': 798,\n+ 'HQA': 799,\n+ 'HRG': 800,\n+ 'HRP': 801,\n+ 'HSER': 802,\n+ 'DHSER': 803,\n+ 'HVA': 804,\n+ 'I2M': 805,\n+ 'IIL': 806,\n+ 'ILX': 807,\n+ 'LDO': 808,\n+ 'LMQ': 809,\n+ 'LVG': 810,\n+ 'MEG': 811,\n+ 'MEN': 812,\n+ 'MEQ': 813,\n+ 'MHO': 814,\n+ 'MOT5': 815,\n+ 'DMOT5': 816,\n+ 'MP34': 817,\n+ 'DMP34': 818,\n+ 'MPH2': 819,\n+ 'DMPH2': 820,\n+ 'MTR5': 821,\n+ 'DMTR5': 822,\n+ 'MTR6': 823,\n+ 'DMTR6': 824,\n+ 'MTY': 825,\n+ 'NAL': 826,\n+ 'NAO1': 827,\n+ 'DNAO1': 828,\n+ 'NAO2': 829,\n+ 'DNAO2': 830,\n+ 'NVA': 831,\n+ 'OAS': 832,\n+ 'OLT': 833,\n+ 'OMT': 834,\n+ 'ONL': 835,\n+ 'ORN': 836,\n+ 'OTYR': 837,\n+ 'DOTYR': 838,\n+ 'PFF': 839,\n+ 'PPN': 840,\n+ 'PYR3': 841,\n+ 'DPYR3': 842,\n+ 'PYR4': 843,\n+ 'DPYR4': 844,\n+ 'QU33': 845,\n+ 'DQU33': 846,\n+ 'QU34': 847,\n+ 'DQU34': 848,\n+ 'QU35': 849,\n+ 'DQU35': 850,\n+ 'QU36': 851,\n+ 'DQU36': 852,\n+ 'SLZ': 853,\n+ 'SME': 854,\n+ 'SYM': 855,\n+ 'TBP4': 856,\n+ 'DTBP4': 857,\n+ 'TH6': 858,\n+ 'THA3': 859,\n+ 'DTHA3': 860,\n+ 'TRX': 861,\n+ 'UN1': 862,\n+ 'VAH': 863,\n+ 'WFP': 864,\n+ '2GX': 865,\n+ '2MR': 866,\n+ '5CT': 867,\n+ '9R1': 868,\n+ 'ASL': 869,\n+ 'AZH': 870,\n+ 'CGUP': 871,\n+ 'CYQ': 872,\n+ 'DA2': 873,\n+ 'DBB': 874,\n+ 'DDEP': 875,\n+ 'DNP': 876,\n+ 'GPL': 877,\n+ 'IAS': 878,\n+ 'KHB': 879,\n+ 'LYX': 880,\n+ 'LYZ': 881,\n+ 'M3L': 882,\n+ 'MHSP': 883,\n+ 'MIR': 884,\n+ 'MLY': 885,\n+ 'NMM': 886,\n+ 'OCS': 887,\n+ 'OSE': 888,\n+ 'PHD': 889,\n+ 'PHDP': 890,\n+ 'PM3': 891,\n+ 'PR3': 892,\n+ 'PRK': 893,\n+ 'SBG': 894,\n+ 'SCH': 895,\n+ 'SCS': 896,\n+ 'SMC': 897,\n+ 'SVV': 898,\n+ 'TPQP': 899,\n+ '4FB': 900,\n+ '8LJ': 901,\n+ 'AYA': 902,\n+ 'B2H': 903,\n+ 'B3A': 904,\n+ 'B3E': 905,\n+ 'B3K': 906,\n+ 'B3S': 907,\n+ 'B3X': 908,\n+ 'B3Y': 909,\n+ 'CH6': 910,\n+ 'CR2': 911,\n+ 'CR8D': 912,\n+ 'CRF': 913,\n+ 'CRO': 914,\n+ 'CRQ': 915,\n+ 'CXM': 916,\n+ 'DYA': 917,\n+ 'DYG': 918,\n+ 'FGL': 919,\n+ 'FLA': 920,\n+ 'FME': 921,\n+ 'FP9': 922,\n+ 'GL3': 923,\n+ 'GYS': 924,\n+ 'HMR': 925,\n+ 'HT7': 926,\n+ 'HZP': 927,\n+ 'I4G': 928,\n+ 'MAA': 929,\n+ 'MDO': 930,\n+ 'MP8': 931,\n+ 'NRQ': 932,\n+ 'PIA': 933,\n+ 'PR4': 934,\n+ 'PRS': 935,\n+ 'PXU': 936,\n+ 'SUI': 937,\n+ 'SWG': 938,\n+ 'XYG': 939,\n+ 'SM014': 940,\n+ 'SM023': 941,\n+ 'SM032': 942,\n+ 'SM035': 943,\n+ 'SM056': 944,\n+ 'SM070': 945,\n+ 'SM071': 946,\n+ 'SM076': 947,\n+ 'SM078': 948,\n+ 'SM095': 949,\n+ 'SM114': 950,\n+ 'SM115': 951,\n+ 'SM119': 952,\n+ 'SM120': 953,\n+ 'SM136': 954,\n+ 'SM138': 955,\n+ 'SM140': 956,\n+ 'SM154': 957,\n+ 'SM155': 958,\n+ 'SM190': 959,\n+ 'SM191': 960,\n+ 'SM192': 961,\n+ 'SM195': 962,\n+ 'SM206': 963,\n+ 'SM209': 964,\n+ 'SM210': 965,\n+ 'SM222': 966,\n+ 'SM223': 967,\n+ 'SM226': 968,\n+ 'SM228': 969,\n+ 'SM229': 970,\n+ 'SM230': 971,\n+ 'SM231': 972,\n+ 'SM232': 973,\n+ 'SM235': 974,\n+ 'SM236': 975,\n+ 'PYRE': 976,\n+ '3AP2': 977,\n+ 'PTR': 978,\n+ 'SEP': 979,\n+ 'TPO': 980,\n+ 'SAM': 981,\n+ 'CYPR': 982,\n+ 'CYTH': 983,\n+ 'N4EM': 984,\n+ 'XPN': 985,\n+ 'YPN': 986,\n+ 'GPN': 987,\n+ 'CPN': 988,\n+ 'TPN': 989,\n+ 'UPN': 990,\n+ 'APN': 991,\n+ 'E1XM': 992,\n+ 'E1XE': 993,\n+ 'E1X': 994,\n+ 'OMU': 995,\n+ '2SU': 996,\n+ 'MSU': 997,\n+ '4SU': 998,\n+ '52U': 999,\n+ '5MU': 1000,\n+ '2MU': 1001,\n+ 'H2U': 1002,\n+ 'MDU': 1003,\n+ '5HU': 1004,\n+ 'MOU': 1005,\n+ '3MU': 1006,\n+ 'M3U': 1007,\n+ 'CYU': 1008,\n+ 'PSU': 1009,\n+ 'OMP': 1010,\n+ '1MP': 1011,\n+ '3MP': 1012,\n+ 'SAU': 1013,\n+ '5AU': 1014,\n+ 'U8U': 1015,\n+ 'SEU': 1016,\n+ '5DU': 1017,\n+ 'MAU': 1018,\n+ 'SCU': 1019,\n+ 'IAU': 1020,\n+ 'MIU': 1021,\n+ 'ISU': 1022,\n+ '5CU': 1023,\n+ 'OCU': 1024,\n+ 'MEU': 1025,\n+ '70U': 1026,\n+ 'BCU': 1027,\n+ 'MCU': 1028,\n+ 'HCU': 1029,\n+ 'CMU': 1030,\n+ 'OAU': 1031,\n+ 'OEU': 1032,\n+ '3AU': 1033,\n+ '13P': 1034,\n+ '5TU': 1035,\n+ 'STU': 1036,\n+ 'GAU': 1037,\n+ 'GCU': 1038,\n+ 'OMC': 1039,\n+ '2SC': 1040,\n+ '5MC': 1041,\n+ 'MMC': 1042,\n+ 'HMC': 1043,\n+ '5FC': 1044,\n+ 'MFC': 1045,\n+ '4MC': 1046,\n+ '4OC': 1047,\n+ '4AC': 1048,\n+ 'MAC': 1049,\n+ 'TMC': 1050,\n+ '3MC': 1051,\n+ 'K2C': 1052,\n+ 'R2C': 1053,\n+ '1PC': 1054,\n+ '3PC': 1055,\n+ 'OMA': 1056,\n+ 'RIA': 1057,\n+ '6MA': 1058,\n+ 'MMA': 1059,\n+ 'M6A': 1060,\n+ 'MTA': 1061,\n+ '2MA': 1062,\n+ '8MA': 1063,\n+ 'INO': 1064,\n+ 'OMI': 1065,\n+ '1MI': 1066,\n+ 'MMI': 1067,\n+ 'SMA': 1068,\n+ '6AA': 1069,\n+ '1MA': 1070,\n+ 'M2A': 1071,\n+ '6IA': 1072,\n+ 'HIA': 1073,\n+ 'MIA': 1074,\n+ 'SIA': 1075,\n+ 'HNA': 1076,\n+ '26A': 1077,\n+ '66A': 1078,\n+ 'T6A': 1079,\n+ '12A': 1080,\n+ '6GA': 1081,\n+ 'OMG': 1082,\n+ 'RIG': 1083,\n+ '1MG': 1084,\n+ 'M1G': 1085,\n+ '2MG': 1086,\n+ 'MMG': 1087,\n+ '7MG': 1088,\n+ '27G': 1089,\n+ 'M7G': 1090,\n+ 'M2G': 1091,\n+ 'MTG': 1092,\n+ 'N2G': 1093,\n+ 'DCG': 1094,\n+ 'RCG': 1095,\n+ 'DAG': 1096,\n+ 'QUG': 1097,\n+ 'EQG': 1098,\n+ 'MQG': 1099,\n+ 'GQG': 1100,\n+ 'DWG': 1101,\n+ 'IMG': 1102,\n+ 'IWG': 1103,\n+ 'MWG': 1104,\n+ 'YYG': 1105,\n+ 'HWG': 1106,\n+ 'PBG': 1107,\n+ 'BMQG': 1108,\n+ 'BGQG': 1109,\n+ 'GMP': 1110,\n+ 'GDP': 1111,\n+ 'GTP': 1112,\n+ 'CMP': 1113,\n+ 'CDP': 1114,\n+ 'CTP': 1115,\n+ 'TMP': 1116,\n+ 'TDP': 1117,\n+ 'TTP': 1118,\n+ 'UMP': 1119,\n+ 'UDP': 1120,\n+ 'UTP': 1121,\n+ 'NAI': 1122,\n+ 'NAP': 1123,\n+ 'NDP': 1124,\n+ 'NAD1': 1125,\n+ 'PTS': 1126,\n+ 'ANE5GC': 1127,\n+ 'BNE5GC': 1128,\n+ 'AMANNA': 1129,\n+ 'BMANNA': 1130,\n+ 'AGULNA': 1131,\n+ 'BGULNA': 1132,\n+ 'AALTNA': 1133,\n+ 'BALTNA': 1134,\n+ 'ALGLNA': 1135,\n+ 'BLGLNA': 1136,\n+ 'ALMANA': 1137,\n+ 'BLMANA': 1138,\n+ 'ALGANA': 1139,\n+ 'BLGANA': 1140,\n+ 'ALGUNA': 1141,\n+ 'BLGUNA': 1142,\n+ 'ALALNA': 1143,\n+ 'BLALNA': 1144,\n+ 'ALTANA': 1145,\n+ 'BLTANA': 1146,\n+ 'ALIDNA': 1147,\n+ 'BLIDNA': 1148,\n+ 'AALLNA': 1149,\n+ 'BALLNA': 1150,\n+ 'ATALNA': 1151,\n+ 'BTALNA': 1152,\n+ 'AIDONA': 1153,\n+ 'BIDONA': 1154,\n+ 'AMANA': 1155,\n+ 'BMANA': 1156,\n+ 'AGULA': 1157,\n+ 'BGULA': 1158,\n+ 'AALTA': 1159,\n+ 'BALTA': 1160,\n+ 'AALLA': 1161,\n+ 'BALLA': 1162,\n+ 'ATALA': 1163,\n+ 'BTALA': 1164,\n+ 'ARHMNA': 1165,\n+ 'BRHMNA': 1166,\n+ 'AFUCNA': 1167,\n+ 'BFUCNA': 1168,\n+ 'ANEU': 1169,\n+ 'BNEU': 1170,\n+ 'ADHA': 1171,\n+ 'BDHA': 1172,\n+ 'ALGULA': 1173,\n+ 'BLGULA': 1174,\n+ 'ALALTA': 1175,\n+ 'BLALTA': 1176,\n+ 'AMU2AC': 1177,\n+ 'BMU2AC': 1178,\n+ 'AMU2GC': 1179,\n+ 'BMU2GC': 1180,\n+ 'BKDN': 1181,\n+ 'AKDN': 1182,\n+ 'QUITA': 1183,\n+ 'BGLGL': 1184,\n+ 'AQUINA': 1185,\n+ 'BQUINA': 1186,\n+ 'AGALAA': 1187,\n+ 'AGLAA': 1188,\n+ 'ALGLAA': 1189,\n+ 'BLEG': 1190,\n+ 'ALEG': 1191,\n+ 'A8LEG': 1192,\n+ 'B8LEG': 1193,\n+ 'APSE': 1194,\n+ 'BPSE': 1195,\n+ 'DGLYA': 1196,\n+ 'SAPI': 1197,\n+ 'SAPI13': 1198,\n+ 'SAPI14': 1199,\n+ 'SAPI15': 1200,\n+ 'SAPI24': 1201,\n+ 'SAPI25': 1202,\n+ 'SAPI2A': 1203,\n+ 'SAPI2B': 1204,\n+ 'SAPI2C': 1205,\n+ 'SAPI2D': 1206,\n+ 'SAPI33': 1207,\n+ 'SAPI34': 1208,\n+ 'SAPI35': 1209,\n+ 'DMPI': 1210,\n+ 'DMPI13': 1211,\n+ 'DMPI14': 1212,\n+ 'DMPI15': 1213,\n+ 'DMPI24': 1214,\n+ 'DMPI25': 1215,\n+ 'DMPI2A': 1216,\n+ 'DMPI2B': 1217,\n+ 'DMPI2C': 1218,\n+ 'DMPI2D': 1219,\n+ 'DMPI33': 1220,\n+ 'DMPI34': 1221,\n+ 'DMPI35': 1222,\n+ 'DLIPI': 1223,\n+ 'POPI': 1224,\n+ 'POPI13': 1225,\n+ 'POPI14': 1226,\n+ 'POPI15': 1227,\n+ 'POPI24': 1228,\n+ 'POPI25': 1229,\n+ 'POPI2A': 1230,\n+ 'POPI2B': 1231,\n+ 'POPI2D': 1232,\n+ 'POPI2C': 1233,\n+ 'POPI33': 1234,\n+ 'POPI34': 1235,\n+ 'POPI35': 1236,\n+ 'PNPI': 1237,\n+ 'PNPI13': 1238,\n+ 'PNPI14': 1239,\n+ 'PNPI15': 1240,\n+ 'PNPI24': 1241,\n+ 'PNPI25': 1242,\n+ 'PNPI2A': 1243,\n+ 'PNPI2B': 1244,\n+ 'PNPI2C': 1245,\n+ 'PNPI2D': 1246,\n+ 'PNPI33': 1247,\n+ 'PNPI34': 1248,\n+ 'PNPI35': 1249,\n+ 'PLPI': 1250,\n+ 'PLPI13': 1251,\n+ 'PLPI14': 1252,\n+ 'PLPI15': 1253,\n+ 'PLPI24': 1254,\n+ 'PLPI25': 1255,\n+ 'PLPI2A': 1256,\n+ 'PLPI2B': 1257,\n+ 'PLPI2C': 1258,\n+ 'PLPI2D': 1259,\n+ 'PLPI33': 1260,\n+ 'PLPI34': 1261,\n+ 'PLPI35': 1262,\n+ 'PYPI': 1263,\n+ 'PSM': 1264,\n+ 'SSM': 1265,\n+ 'OSM': 1266,\n+ 'ASM': 1267,\n+ 'BSM': 1268,\n+ '23SM': 1269,\n+ 'LSM': 1270,\n+ 'NSM': 1271,\n+ 'CER2': 1272,\n+ 'CER160': 1273,\n+ 'CER180': 1274,\n+ 'CER181': 1275,\n+ 'CER200': 1276,\n+ 'CER220': 1277,\n+ 'CER240': 1278,\n+ 'CER241': 1279,\n+ 'CER3E': 1280,\n+ 'PYPE': 1281,\n+ 'YOPA': 1282,\n+ 'DYPC': 1283,\n+ 'YOPC': 1284,\n+ 'DYPE': 1285,\n+ 'YOPE': 1286,\n+ 'YOPS': 1287,\n+ 'C7DHPC': 1288,\n+ 'C6DHPC': 1289,\n+ 'LMPG': 1290,\n+ 'LPPG': 1291,\n+ 'LPC12': 1292,\n+ 'LPC14': 1293,\n+ 'MYR': 1294,\n+ 'PAL': 1295,\n+ 'STE': 1296,\n+ 'ARA': 1297,\n+ 'BEH': 1298,\n+ 'TRI': 1299,\n+ 'LIGN': 1300,\n+ 'MYRO': 1301,\n+ 'PALO': 1302,\n+ 'HTA': 1303,\n+ 'OLE': 1304,\n+ 'LIN': 1305,\n+ 'ALIN': 1306,\n+ 'SDA': 1307,\n+ 'GLA': 1308,\n+ 'EICO': 1309,\n+ 'EDA': 1310,\n+ 'MEA': 1311,\n+ 'DGLA': 1312,\n+ 'ETE': 1313,\n+ 'ETA': 1314,\n+ 'EPA': 1315,\n+ 'ARAN': 1316,\n+ 'HPA': 1317,\n+ 'ERU': 1318,\n+ 'DDA': 1319,\n+ 'ADR': 1320,\n+ 'DPT': 1321,\n+ 'DPA': 1322,\n+ 'DHA': 1323,\n+ 'NER': 1324,\n+ 'TTA': 1325,\n+ 'TPT': 1326,\n+ 'TPA': 1327,\n+ 'THA': 1328,\n+ 'MYRP': 1329,\n+ 'PALP': 1330,\n+ 'STEP': 1331,\n+ 'ARAP': 1332,\n+ 'BEHP': 1333,\n+ 'TRIP': 1334,\n+ 'LIGNP': 1335,\n+ 'MYROP': 1336,\n+ 'PALOP': 1337,\n+ 'HTAP': 1338,\n+ 'OLEP': 1339,\n+ 'LINP': 1340,\n+ 'ALINP': 1341,\n+ 'SDAP': 1342,\n+ 'GLAP': 1343,\n+ 'EICOP': 1344,\n+ 'EDAP': 1345,\n+ 'MEAP': 1346,\n+ 'DGLAP': 1347,\n+ 'ETEP': 1348,\n+ 'ETAP': 1349,\n+ 'EPAP': 1350,\n+ 'ARANP': 1351,\n+ 'HPAP': 1352,\n+ 'ERUP': 1353,\n+ 'DDAP': 1354,\n+ 'ADRP': 1355,\n+ 'DPTP': 1356,\n+ 'DPAP': 1357,\n+ 'DHAP': 1358,\n+ 'NERP': 1359,\n+ 'TTAP': 1360,\n+ 'TPTP': 1361,\n+ 'TPAP': 1362,\n+ 'THAP': 1363,\n+ 'THDPPC': 1364,\n+ 'CYSP': 1365,\n+ 'GLYM': 1366,\n+ 'LYSM': 1367,\n+ 'CYSL': 1368,\n+ 'ABLIPA': 1369,\n+ 'ABLIPB': 1370,\n+ 'BCLIPA': 1371,\n+ 'BCLIPB': 1372,\n+ 'BCLIPC': 1373,\n+ 'CJLIPA': 1374,\n+ 'CTLIPA': 1375,\n+ 'ECLIPA': 1376,\n+ 'ECLIPB': 1377,\n+ 'ECLIPC': 1378,\n+ 'HPLIPA': 1379,\n+ 'HPLIPB': 1380,\n+ 'KPLIPA': 1381,\n+ 'KPLIPB': 1382,\n+ 'KPLIPC': 1383,\n+ 'LILIPA': 1384,\n+ 'MCLIPA': 1385,\n+ 'NGLIPA': 1386,\n+ 'NGLIPB': 1387,\n+ 'NGLIPC': 1388,\n+ 'PALIPA': 1389,\n+ 'PALIPB': 1390,\n+ 'PALIPC': 1391,\n+ 'PALIPD': 1392,\n+ 'PALIPE': 1393,\n+ 'SFLIPA': 1394,\n+ 'SELIPA': 1395,\n+ 'SELIPB': 1396,\n+ 'SELIPC': 1397,\n+ 'VCLIPA': 1398,\n+ 'VCLIPB': 1399,\n+ 'VCLIPC': 1400,\n+ 'VCLIPD': 1401,\n+ 'VCLIPE': 1402,\n+ 'YPLIPA': 1403,\n+ 'YPLIPB': 1404,\n+ 'PVPG': 1405,\n+ 'PVPE': 1406,\n+ 'PPPE': 1407,\n+ 'PMPE': 1408,\n+ 'QMPE': 1409,\n+ 'OYPE': 1410,\n+ 'PYPG': 1411,\n+ 'IPPC': 1412,\n+ 'APPC': 1413,\n+ 'PHPC': 1414,\n+ 'PMPG': 1415,\n+ 'PVCL2': 1416,\n+ 'DPPGK': 1417,\n+ 'TOCL1': 1418,\n+ 'TOCL2': 1419,\n+ 'TMCL1': 1420,\n+ 'TMCL2': 1421,\n+ 'TLCL1': 1422,\n+ 'TLCL2': 1423,\n+ 'PMCL1': 1424,\n+ 'PMCL2': 1425,\n+ 'TYCL1': 1426,\n+ 'TYCL2': 1427,\n+ 'LOACL1': 1428,\n+ 'LOACL2': 1429,\n+ 'LOCCL1': 1430,\n+ 'LOCCL2': 1431,\n+ 'LNACL1': 1432,\n+ 'LNACL2': 1433,\n+ 'LNBCL1': 1434,\n+ 'LNBCL2': 1435,\n+ 'LNCCL1': 1436,\n+ 'LNCCL2': 1437,\n+ 'LNDCL1': 1438,\n+ 'LNDCL2': 1439,\n+ 'DDPC': 1440,\n+ 'DCPC': 1441,\n+ 'DXPC': 1442,\n+ 'DGPC': 1443,\n+ 'DEPC': 1444,\n+ 'DNPC': 1445,\n+ 'DXPE': 1446,\n+ 'DGPE': 1447,\n+ 'DEPE': 1448,\n+ 'DNPE': 1449,\n+ 'SAPE': 1450,\n+ 'SLPE': 1451,\n+ 'PLPE': 1452,\n+ 'SLPC': 1453,\n+ 'PLPC': 1454,\n+ 'DYPS': 1455,\n+ 'DGPS': 1456,\n+ 'DEPS': 1457,\n+ 'DNPS': 1458,\n+ 'SAPS': 1459,\n+ 'SLPS': 1460,\n+ 'PLPS': 1461,\n+ 'DYPA': 1462,\n+ 'DGPA': 1463,\n+ 'DEPA': 1464,\n+ 'DNPA': 1465,\n+ 'SAPA': 1466,\n+ 'SLPA': 1467,\n+ 'PLPA': 1468,\n+ 'DYPG': 1469,\n+ 'DGPG': 1470,\n+ 'DEPG': 1471,\n+ 'DNPG': 1472,\n+ 'SAPG': 1473,\n+ 'PLPG': 1474,\n+ 'SDPE': 1475,\n+ 'SOPE': 1476,\n+ 'DAPE': 1477,\n+ 'SDPS': 1478,\n+ 'SOPS': 1479,\n+ 'DAPS': 1480,\n+ 'SDPA': 1481,\n+ 'SOPA': 1482,\n+ 'DAPA': 1483,\n+ 'SDPG': 1484,\n+ 'SOPG': 1485,\n+ 'DAPG': 1486,\n+ 'DIPA': 1487,\n+ 'TIPA': 1488,\n+ 'DTPA': 1489,\n+ 'DUPC': 1490,\n+ 'DLIPC': 1491,\n+ 'DLIPE': 1492,\n+ 'LLPA': 1493,\n+ 'LLPC': 1494,\n+ 'LLPE': 1495,\n+ 'LLPS': 1496,\n+ 'TSPC': 1497,\n+ 'DDOPC': 1498,\n+ 'DDOPE': 1499,\n+ 'DDOPS': 1500,\n+ 'PDOPC': 1501,\n+ 'PDOPE': 1502,\n+ 'DOPP1': 1503,\n+ 'DOPP2': 1504,\n+ 'DOPP3': 1505,\n+ 'POPP1': 1506,\n+ 'POPP2': 1507,\n+ 'POPP3': 1508,\n+}\n+patch_order = {\n+ 'ACE': 0,\n+ 'ACED': 1,\n+ 'ACP': 2,\n+ 'ACPD': 3,\n+ 'CTER': 4,\n+ 'CNEU': 5,\n+ 'PCTE': 6,\n+ 'CT1': 7,\n+ 'CT2': 8,\n+ 'CT3': 9,\n+ 'HS2': 10,\n+ 'LIG1': 11,\n+ 'LINK': 12,\n+ 'SAHP': 13,\n+ 'GYCO': 14,\n+ 'AMGA': 15,\n+ 'GMGA': 16,\n+ 'DMGA': 17,\n+ 'AMGT': 18,\n+ 'ATGM': 19,\n+ 'ABGA': 20,\n+ 'GBGA': 21,\n+ 'DBGA': 22,\n+ 'ALME': 23,\n+ 'G4MPAB': 24,\n+ 'G4PAB': 25,\n+ 'G3PABR': 26,\n+ 'G3PABS': 27,\n+ 'BPAB': 28,\n+ 'BPAT': 29,\n+ '3MSB': 30,\n+ '2MRB': 31,\n+ '2APP': 32,\n+ '3APP': 33,\n+ '4APP': 34,\n+ '2APD': 35,\n+ '3APD': 36,\n+ '4APD': 37,\n+ '2AFP': 38,\n+ '3AFP': 39,\n+ '4AFP': 40,\n+ '2AFD': 41,\n+ '3AFD': 42,\n+ '4AFD': 43,\n+ '4FBP': 44,\n+ '3FBP': 45,\n+ '2FBP': 46,\n+ 'FBIFR': 47,\n+ 'FBIFS': 48,\n+ '3MRB': 49,\n+ '2MSB': 50,\n+ '3A2MPD': 51,\n+ '3A2MPP': 52,\n+ '3A4MPD': 53,\n+ '3A5MPD': 54,\n+ '3A6MPD': 55,\n+ '4A2MPD': 56,\n+ '4A2MPP': 57,\n+ '3CPD': 58,\n+ '3A46PD': 59,\n+ '2AEPD': 60,\n+ '2XBD': 61,\n+ '3XBD': 62,\n+ '4XBD': 63,\n+ '4XEBD': 64,\n+ '3XBP': 65,\n+ 'B5H6': 66,\n+ 'B5HE': 67,\n+ 'TAUR': 68,\n+ 'RN1': 69,\n+ 'RN2': 70,\n+ 'RN3': 71,\n+ 'KAC': 72,\n+ 'AMGY': 73,\n+ 'DMCT': 74,\n+ 'SAHC': 75,\n+ 'PSAM': 76,\n+ '5MC1': 77,\n+ 'INO1': 78,\n+ '4EG1': 79,\n+ 'CT': 80,\n+ 'CTN': 81,\n+ 'PACE': 82,\n+ '5UHG': 83,\n+ '5UHC': 84,\n+ '5UHO': 85,\n+ '5UHA': 86,\n+ 'CYTP': 87,\n+ '3MCN': 88,\n+ 'ADEP': 89,\n+ 'ADEI': 90,\n+ '1MAN': 91,\n+ '6AH': 92,\n+ 'GENO': 93,\n+ 'BUGN': 94,\n+ 'PTSR': 95,\n+ 'PTSS': 96,\n+ 'PTSD': 97,\n+ 'P6EN': 98,\n+ '2ANAM': 99,\n+ '2BNAM': 100,\n+ '3ANAM': 101,\n+ '3BNAM': 102,\n+ '5BNAM2': 103,\n+ '1ANAC': 104,\n+ '1BNAC': 105,\n+ '2ANAC': 106,\n+ '2BNAC': 107,\n+ '3ANAC': 108,\n+ '3BNAC': 109,\n+ '4ANAC': 110,\n+ '4BNAC': 111,\n+ '9TNAC': 112,\n+ '2BNFO': 113,\n+ '3ANFO': 114,\n+ '3BNFO': 115,\n+ '7BNFO': 116,\n+ '2ANSB': 117,\n+ '2BNSB': 118,\n+ '3BNRB': 119,\n+ '5BNRB2': 120,\n+ '5ANRB2': 121,\n+ '7BNRB': 122,\n+ '3BNSB': 123,\n+ '4BNRB': 124,\n+ '4ANRB': 125,\n+ '4BNSB': 126,\n+ '4BNASB': 127,\n+ '4BDASB': 128,\n+ '3BNANA': 129,\n+ '3ANANA': 130,\n+ '4BNANA': 131,\n+ '4ANANA': 132,\n+ '4BNSNA': 133,\n+ '3BNSNA': 134,\n+ '4ANTNA': 135,\n+ '4BNTNA': 136,\n+ '4ANGNA': 137,\n+ '4BNGNA': 138,\n+ '6TNG2': 139,\n+ '6TNG': 140,\n+ '7TNG': 141,\n+ '2ANA': 142,\n+ '2BNA': 143,\n+ '6TCOO': 144,\n+ '3BMDP': 145,\n+ '6COOME': 146,\n+ '1AGLYA': 147,\n+ '1BGLYA': 148,\n+ '1AOS': 149,\n+ '1ANGF': 150,\n+ '1BNGF': 151,\n+ 'LIPAN1': 152,\n+ 'LIPAN2': 153,\n+ '4ANSDB': 154,\n+ '4BNSDB': 155,\n+ '4ANDHH': 156,\n+ '4BNDHH': 157,\n+ '4ANRHP': 158,\n+ '4BNRHP': 159,\n+ '4ANSHP': 160,\n+ '4BNSHP': 161,\n+ '3AALAF': 162,\n+ '3BALAF': 163,\n+ '3ANOPR': 164,\n+}\n+\n+periodic_improper_types = {\n+ ('CRN1', 'NRN2', 'NRN2', 'NRC4'): (1, 3.141592653589793, 711.28),\n+ ('NRC4', 'NRN2', 'NRN2', 'CRN1'): (1, 3.141592653589793, 711.28),\n+ ('NRN2', 'HRM2', 'HRM2', 'CRN1'): (1, 3.141592653589793, 167.36),\n+ ('CRN1', 'HRM2', 'HRM2', 'NRN2'): (1, 3.141592653589793, 167.36),\n+ ('CRN1', 'NRN2', 'NRC4', 'NRN1'): (1, 3.141592653589793, 711.28),\n+ ('NRN1', 'NRC4', 'NRN2', 'CRN1'): (1, 3.141592653589793, 711.28),\n+ ('NRN1', 'CR33', 'CRN1', 'HRM1'): (1, 3.141592653589793, 251.04000000000002),\n+ ('HRM1', 'CRN1', 'CR33', 'NRN1'): (1, 3.141592653589793, 251.04000000000002),\n+ ('CRN1', 'NRC4', 'NRN2', 'NRN1'): (1, 3.141592653589793, 711.28),\n+ ('NRN1', 'NRN2', 'NRC4', 'CRN1'): (1, 3.141592653589793, 711.28),\n+ ('NRN1', 'CT2', 'CRN1', 'HRM1'): (1, 3.141592653589793, 251.04000000000002),\n+ ('HRM1', 'CRN1', 'CT2', 'NRN1'): (1, 3.141592653589793, 251.04000000000002),\n+ ('NN2G', 'CN1', 'CN2', 'HN2'): (1, 3.141592653589793, 0.0),\n+ ('HN2', 'CN2', 'CN1', 'NN2G'): (1, 3.141592653589793, 0.0),\n+}\n+harmonic_improper_types = {\n+ ('HE2', 'HE2', 'CE2', 'CE2'): ((12.552, 0.0),),\n+ ('CE2', 'CE2', 'HE2', 'HE2'): ((12.552, 0.0),),\n+ ('HR1', 'NR1', 'NR2', 'CPH2'): ((2.092, 0.0),),\n+ ('CPH2', 'NR2', 'NR1', 'HR1'): ((2.092, 0.0),),\n+ ('HR1', 'NR2', 'NR1', 'CPH2'): ((2.092, 0.0),),\n+ ('CPH2', 'NR1', 'NR2', 'HR1'): ((2.092, 0.0),),\n+ ('HR3', 'CPH1', 'NR1', 'CPH1'): ((2.092, 0.0),),\n+ ('CPH1', 'NR1', 'CPH1', 'HR3'): ((2.092, 0.0),),\n+ ('HR3', 'CPH1', 'NR2', 'CPH1'): ((2.092, 0.0),),\n+ ('CPH1', 'NR2', 'CPH1', 'HR3'): ((2.092, 0.0),),\n+ ('HR3', 'CPH1', 'NR3', 'CPH1'): ((4.184, 0.0),),\n+ ('CPH1', 'NR3', 'CPH1', 'HR3'): ((4.184, 0.0),),\n+ ('HR3', 'NR1', 'CPH1', 'CPH1'): ((2.092, 0.0),),\n+ ('CPH1', 'CPH1', 'NR1', 'HR3'): ((2.092, 0.0),),\n+ ('HR3', 'NR2', 'CPH1', 'CPH1'): ((2.092, 0.0),),\n+ ('CPH1', 'CPH1', 'NR2', 'HR3'): ((2.092, 0.0),),\n+ ('N', 'C', 'CP1', 'CP3'): ((0.0, 0.0),),\n+ ('CP3', 'CP1', 'C', 'N'): ((0.0, 0.0),),\n+ ('NC2', None, None, 'C'): ((188.28, 0.0),),\n+ ('C', None, None, 'NC2'): ((188.28, 0.0),),\n+ ('C', 'HC', 'HC', 'NC2'): ((0.0, 0.0),),\n+ ('NC2', 'HC', 'HC', 'C'): ((0.0, 0.0),),\n+ ('NC2', None, None, 'HC'): ((-8.368, 0.0),),\n+ ('HC', None, None, 'NC2'): ((-8.368, 0.0),),\n+ ('NH1', None, None, 'H'): ((83.68, 0.0),),\n+ ('H', None, None, 'NH1'): ((83.68, 0.0),),\n+ ('NH2', None, None, 'H'): ((16.736, 0.0),),\n+ ('H', None, None, 'NH2'): ((16.736, 0.0),),\n+ ('NR1', 'CPH1', 'CPH2', 'H'): ((1.8828, 0.0),),\n+ ('H', 'CPH2', 'CPH1', 'NR1'): ((1.8828, 0.0),),\n+ ('NR1', 'CPH2', 'CPH1', 'H'): ((1.8828, 0.0),),\n+ ('H', 'CPH1', 'CPH2', 'NR1'): ((1.8828, 0.0),),\n+ ('NR3', 'CPH1', 'CPH2', 'H'): ((5.0208, 0.0),),\n+ ('H', 'CPH2', 'CPH1', 'NR3'): ((5.0208, 0.0),),\n+ ('NR3', 'CPH2', 'CPH1', 'H'): ((5.0208, 0.0),),\n+ ('H', 'CPH1', 'CPH2', 'NR3'): ((5.0208, 0.0),),\n+ ('O', 'CP1', 'NH2', 'CC'): ((188.28, 0.0),),\n+ ('CC', 'NH2', 'CP1', 'O'): ((188.28, 0.0),),\n+ ('O', 'CT1', 'NH2', 'CC'): ((188.28, 0.0),),\n+ ('CC', 'NH2', 'CT1', 'O'): ((188.28, 0.0),),\n+ ('O', 'CT2', 'NH2', 'CC'): ((188.28, 0.0),),\n+ ('CC', 'NH2', 'CT2', 'O'): ((188.28, 0.0),),\n+ ('O', 'CT3', 'NH2', 'CC'): ((188.28, 0.0),),\n+ ('CC', 'NH2', 'CT3', 'O'): ((188.28, 0.0),),\n+ ('O', 'HA1', 'NH2', 'CC'): ((188.28, 0.0),),\n+ ('CC', 'NH2', 'HA1', 'O'): ((188.28, 0.0),),\n+ ('O', 'N', 'CT2', 'CC'): ((502.08000000000004, 0.0),),\n+ ('CC', 'CT2', 'N', 'O'): ((502.08000000000004, 0.0),),\n+ ('O', 'NH2', 'CP1', 'CC'): ((188.28, 0.0),),\n+ ('CC', 'CP1', 'NH2', 'O'): ((188.28, 0.0),),\n+ ('O', 'NH2', 'CT1', 'CC'): ((188.28, 0.0),),\n+ ('CC', 'CT1', 'NH2', 'O'): ((188.28, 0.0),),\n+ ('O', 'NH2', 'CT2', 'CC'): ((188.28, 0.0),),\n+ ('CC', 'CT2', 'NH2', 'O'): ((188.28, 0.0),),\n+ ('O', 'NH2', 'CT3', 'CC'): ((188.28, 0.0),),\n+ ('CC', 'CT3', 'NH2', 'O'): ((188.28, 0.0),),\n+ ('O', 'NH2', 'HA1', 'CC'): ((188.28, 0.0),),\n+ ('CC', 'HA1', 'NH2', 'O'): ((188.28, 0.0),),\n+ ('O', None, None, 'C'): ((502.08000000000004, 0.0),),\n+ ('C', None, None, 'O'): ((502.08000000000004, 0.0),),\n+ ('OB', None, None, 'CD'): ((418.40000000000003, 0.0),),\n+ ('CD', None, None, 'OB'): ((418.40000000000003, 0.0),),\n+ ('OC', None, None, 'CC'): ((401.664, 0.0),),\n+ ('CC', None, None, 'OC'): ((401.664, 0.0),),\n+ ('CC', None, None, 'CT1'): ((401.664, 0.0),),\n+ ('CT1', None, None, 'CC'): ((401.664, 0.0),),\n+ ('CC', None, None, 'CT2'): ((401.664, 0.0),),\n+ ('CT2', None, None, 'CC'): ((401.664, 0.0),),\n+ ('CC', None, None, 'CT3'): ((401.664, 0.0),),\n+ ('CT3', None, None, 'CC'): ((401.664, 0.0),),\n+ ('HN2', None, None, 'NN2'): ((4.184, 0.0),),\n+ ('NN2', None, None, 'HN2'): ((4.184, 0.0),),\n+ ('NN2B', 'CN4', 'CN5', 'HN2'): ((29.288, 0.0),),\n+ ('HN2', 'CN5', 'CN4', 'NN2B'): ((29.288, 0.0),),\n+ ('HN1', None, None, 'NN1'): ((16.736, 0.0),),\n+ ('NN1', None, None, 'HN1'): ((16.736, 0.0),),\n+ ('NN1', 'CN2', 'HN1', 'HN1'): ((25.104, 0.0),),\n+ ('HN1', 'HN1', 'CN2', 'NN1'): ((25.104, 0.0),),\n+ ('CN1', None, None, 'ON1'): ((376.56, 0.0),),\n+ ('ON1', None, None, 'CN1'): ((376.56, 0.0),),\n+ ('CN1T', None, None, 'ON1'): ((376.56, 0.0),),\n+ ('ON1', None, None, 'CN1T'): ((376.56, 0.0),),\n+ ('CN1', 'NN2G', 'CN5G', 'ON1'): ((376.56, 0.0),),\n+ ('ON1', 'CN5G', 'NN2G', 'CN1'): ((376.56, 0.0),),\n+ ('CN1T', 'NN2B', 'NN2U', 'ON1'): ((460.24, 0.0),),\n+ ('ON1', 'NN2U', 'NN2B', 'CN1T'): ((460.24, 0.0),),\n+ ('CN1', 'NN2U', 'CN3T', 'ON1'): ((376.56, 0.0),),\n+ ('ON1', 'CN3T', 'NN2U', 'CN1'): ((376.56, 0.0),),\n+ ('CN1', None, None, 'ON1C'): ((334.72, 0.0),),\n+ ('ON1C', None, None, 'CN1'): ((334.72, 0.0),),\n+ ('CN2', None, None, 'NN1'): ((376.56, 0.0),),\n+ ('NN1', None, None, 'CN2'): ((376.56, 0.0),),\n+ ('CN2', 'NN3G', 'NN2G', 'NN1'): ((167.36, 0.0),),\n+ ('NN1', 'NN2G', 'NN3G', 'CN2'): ((167.36, 0.0),),\n+ ('CN2', 'NN3A', 'CN5', 'NN1'): ((167.36, 0.0),),\n+ ('NN1', 'CN5', 'NN3A', 'CN2'): ((167.36, 0.0),),\n+ ('CN2', 'NN3', 'CN3', 'NN1'): ((251.04000000000002, 0.0),),\n+ ('NN1', 'CN3', 'NN3', 'CN2'): ((251.04000000000002, 0.0),),\n+ ('CN9', None, None, 'CN3T'): ((58.576, 0.0),),\n+ ('CN3T', None, None, 'CN9'): ((58.576, 0.0),),\n+ ('CC2O1', 'CC331', 'NC2D1', 'OC2D1'): ((502.08000000000004, 0.0),),\n+ ('OC2D1', 'NC2D1', 'CC331', 'CC2O1'): ((502.08000000000004, 0.0),),\n+ ('NC2D1', 'CC2O1', 'CC3161', 'HCP1'): ((83.68, 0.0),),\n+ ('HCP1', 'CC3161', 'CC2O1', 'NC2D1'): ((83.68, 0.0),),\n+ ('NC2D1', 'CC2O1', 'CC3062', 'HCP1'): ((83.68, 0.0),),\n+ ('HCP1', 'CC3062', 'CC2O1', 'NC2D1'): ((83.68, 0.0),),\n+ ('CC2O2', 'CC311', 'OC2D2', 'OC2D2'): ((401.664, 0.0),),\n+ ('OC2D2', 'OC2D2', 'CC311', 'CC2O2'): ((401.664, 0.0),),\n+ ('CC2O2', 'CC301', 'OC2D2', 'OC2D2'): ((401.664, 0.0),),\n+ ('OC2D2', 'OC2D2', 'CC301', 'CC2O2'): ((401.664, 0.0),),\n+ ('CC2O2', 'CC3163', 'OC2D2', 'OC2D2'): ((401.664, 0.0),),\n+ ('OC2D2', 'OC2D2', 'CC3163', 'CC2O2'): ((401.664, 0.0),),\n+ ('CC2O2', 'CC3062', 'OC2D2', 'OC2D2'): ((401.664, 0.0),),\n+ ('OC2D2', 'OC2D2', 'CC3062', 'CC2O2'): ((401.664, 0.0),),\n+ ('CC2O2', 'CC321', 'OC2D2', 'OC2D2'): ((401.664, 0.0),),\n+ ('OC2D2', 'OC2D2', 'CC321', 'CC2O2'): ((401.664, 0.0),),\n+ ('NC2D1', 'CC2O1', 'CC331', 'HCP1'): ((83.68, 0.0),),\n+ ('HCP1', 'CC331', 'CC2O1', 'NC2D1'): ((83.68, 0.0),),\n+ ('NC2D1', 'CC2O1', 'CC311', 'HCP1'): ((83.68, 0.0),),\n+ ('HCP1', 'CC311', 'CC2O1', 'NC2D1'): ((83.68, 0.0),),\n+ ('CC2O4', 'CC331', 'OC2D4', 'HCR1'): ((209.20000000000002, 0.0),),\n+ ('HCR1', 'OC2D4', 'CC331', 'CC2O4'): ((209.20000000000002, 0.0),),\n+ ('CC2O4', 'CC312', 'OC2D4', 'HCR1'): ((209.20000000000002, 0.0),),\n+ ('HCR1', 'OC2D4', 'CC312', 'CC2O4'): ((209.20000000000002, 0.0),),\n+ ('OC2D3', 'CC331', 'CC331', 'CC2O3'): ((292.88, 0.0),),\n+ ('CC2O3', 'CC331', 'CC331', 'OC2D3'): ((292.88, 0.0),),\n+ ('OC2D3', 'CC312', 'CC322', 'CC2O3'): ((292.88, 0.0),),\n+ ('CC2O3', 'CC322', 'CC312', 'OC2D3'): ((292.88, 0.0),),\n+ ('OBL', None, None, 'CL'): ((418.40000000000003, 0.0),),\n+ ('CL', None, None, 'OBL'): ((418.40000000000003, 0.0),),\n+ ('HEL2', 'HEL2', 'CEL2', 'CEL2'): ((12.552, 0.0),),\n+ ('CEL2', 'CEL2', 'HEL2', 'HEL2'): ((12.552, 0.0),),\n+ ('OCL', None, None, 'CL'): ((401.664, 0.0),),\n+ ('CL', None, None, 'OCL'): ((401.664, 0.0),),\n+ ('OCL', None, None, 'CCL'): ((401.664, 0.0),),\n+ ('CCL', None, None, 'OCL'): ((401.664, 0.0),),\n+ ('CG2D1', 'CG331', 'NG2D1', 'HGA4'): ((104.60000000000001, 0.0),),\n+ ('HGA4', 'NG2D1', 'CG331', 'CG2D1'): ((104.60000000000001, 0.0),),\n+ ('CG2D1', 'CG331', 'NG2P1', 'HGR52'): ((75.312, 0.0),),\n+ ('HGR52', 'NG2P1', 'CG331', 'CG2D1'): ((75.312, 0.0),),\n+ ('CG2D1O', 'CG2DC1', 'CG2O1', 'NG2S1'): ((118.41766, 0.0),),\n+ ('NG2S1', 'CG2O1', 'CG2DC1', 'CG2D1O'): ((118.41766, 0.0),),\n+ ('CG2D1O', 'CG331', 'NG2D1', 'SG311'): ((78.66966, 0.0),),\n+ ('SG311', 'NG2D1', 'CG331', 'CG2D1O'): ((78.66966, 0.0),),\n+ ('CG2D1O', 'CG2D1', 'NG301', 'HGA4'): ((221.752, 0.0),),\n+ ('HGA4', 'NG301', 'CG2D1', 'CG2D1O'): ((221.752, 0.0),),\n+ ('CG2D1O', 'CG2D1', 'NG311', 'HGA4'): ((221.752, 0.0),),\n+ ('HGA4', 'NG311', 'CG2D1', 'CG2D1O'): ((221.752, 0.0),),\n+ ('CG2D1O', 'CG2D2', 'NG321', 'HGA4'): ((221.752, 0.0),),\n+ ('HGA4', 'NG321', 'CG2D2', 'CG2D1O'): ((221.752, 0.0),),\n+ ('CG2D1O', 'CG2D2', 'OG301', 'HGA4'): ((96.232, 0.0),),\n+ ('HGA4', 'OG301', 'CG2D2', 'CG2D1O'): ((96.232, 0.0),),\n+ ('CG2D1O', 'CG2DC1', 'NG2D1', 'HGA4'): ((125.52000000000001, 0.0),),\n+ ('HGA4', 'NG2D1', 'CG2DC1', 'CG2D1O'): ((125.52000000000001, 0.0),),\n+ ('CG2D1O', 'CG2DC1', 'NG301', 'HGA4'): ((221.752, 0.0),),\n+ ('HGA4', 'NG301', 'CG2DC1', 'CG2D1O'): ((221.752, 0.0),),\n+ ('CG2D1O', 'CG2DC1', 'NG311', 'HGA4'): ((221.752, 0.0),),\n+ ('HGA4', 'NG311', 'CG2DC1', 'CG2D1O'): ((221.752, 0.0),),\n+ ('CG2D1O', 'CG2DC1', 'OG301', 'HGA4'): ((41.84, 0.0),),\n+ ('HGA4', 'OG301', 'CG2DC1', 'CG2D1O'): ((41.84, 0.0),),\n+ ('CG2D2O', 'CG2D1', 'NG301', 'HGA4'): ((221.752, 0.0),),\n+ ('HGA4', 'NG301', 'CG2D1', 'CG2D2O'): ((221.752, 0.0),),\n+ ('CG2D2O', 'CG2D1', 'NG311', 'HGA4'): ((221.752, 0.0),),\n+ ('HGA4', 'NG311', 'CG2D1', 'CG2D2O'): ((221.752, 0.0),),\n+ ('CG2D2O', 'CG2D2', 'NG321', 'HGA4'): ((221.752, 0.0),),\n+ ('HGA4', 'NG321', 'CG2D2', 'CG2D2O'): ((221.752, 0.0),),\n+ ('CG2D2O', 'CG2D2', 'OG301', 'HGA4'): ((96.232, 0.0),),\n+ ('HGA4', 'OG301', 'CG2D2', 'CG2D2O'): ((96.232, 0.0),),\n+ ('CG2D2O', 'CG2DC2', 'NG301', 'HGA4'): ((221.752, 0.0),),\n+ ('HGA4', 'NG301', 'CG2DC2', 'CG2D2O'): ((221.752, 0.0),),\n+ ('CG2D2O', 'CG2DC2', 'NG311', 'HGA4'): ((221.752, 0.0),),\n+ ('HGA4', 'NG311', 'CG2DC2', 'CG2D2O'): ((221.752, 0.0),),\n+ ('CG2D2O', 'CG2DC2', 'OG301', 'HGA4'): ((41.84, 0.0),),\n+ ('HGA4', 'OG301', 'CG2DC2', 'CG2D2O'): ((41.84, 0.0),),\n+ ('CG2DC1', 'CG2O3', 'CG331', 'NG2D1'): ((66.81806160000001, 0.0),),\n+ ('NG2D1', 'CG331', 'CG2O3', 'CG2DC1'): ((66.81806160000001, 0.0),),\n+ ('CG2DC1', 'CG2R53', 'CG321', 'NG2D1'): ((269.070948, 0.0),),\n+ ('NG2D1', 'CG321', 'CG2R53', 'CG2DC1'): ((269.070948, 0.0),),\n+ ('CG2DC1', 'CG2R53', 'CG331', 'NG2D1'): ((269.070948, 0.0),),\n+ ('NG2D1', 'CG331', 'CG2R53', 'CG2DC1'): ((269.070948, 0.0),),\n+ ('CG2DC1', 'CG321', 'CG331', 'NG2D1'): ((502.1138904, 0.0),),\n+ ('NG2D1', 'CG331', 'CG321', 'CG2DC1'): ((502.1138904, 0.0),),\n+ ('CG2DC1', 'CG331', 'CG331', 'NG2D1'): ((502.1138904, 0.0),),\n+ ('NG2D1', 'CG331', 'CG331', 'CG2DC1'): ((502.1138904, 0.0),),\n+ ('CG2DC1', 'CG2R61', 'NG2D1', 'HGA4'): ((125.52000000000001, 0.0),),\n+ ('HGA4', 'NG2D1', 'CG2R61', 'CG2DC1'): ((125.52000000000001, 0.0),),\n+ ('CG2DC1', 'CG2DC2', 'NG2P1', 'HGR52'): ((54.392, 0.0),),\n+ ('HGR52', 'NG2P1', 'CG2DC2', 'CG2DC1'): ((54.392, 0.0),),\n+ ('CG2DC2', 'CG2DC1', 'CG2O5', 'NG2D1'): ((4.184, 0.0),),\n+ ('NG2D1', 'CG2O5', 'CG2DC1', 'CG2DC2'): ((4.184, 0.0),),\n+ ('CG2DC2', 'CG2R61', 'NG2D1', 'HGA4'): ((125.52000000000001, 0.0),),\n+ ('HGA4', 'NG2D1', 'CG2R61', 'CG2DC2'): ((125.52000000000001, 0.0),),\n+ ('CG2DC2', 'CG2DC1', 'NG2P1', 'HGR52'): ((54.392, 0.0),),\n+ ('HGR52', 'NG2P1', 'CG2DC1', 'CG2DC2'): ((54.392, 0.0),),\n+ ('CG2N1', 'NG321', 'NG321', 'NG2D1'): ((355.64, 0.0),),\n+ ('NG2D1', 'NG321', 'NG321', 'CG2N1'): ((355.64, 0.0),),\n+ ('CG2N1', 'NG2P1', 'NG2P1', 'NG2P1'): ((167.36, 0.0),),\n+ ('NG2P1', 'NG2P1', 'NG2P1', 'CG2N1'): ((167.36, 0.0),),\n+ ('CG2N1', 'NG2D1', 'NG311', 'NG321'): ((355.64, 0.0),),\n+ ('NG321', 'NG311', 'NG2D1', 'CG2N1'): ((355.64, 0.0),),\n+ ('CG2N2', 'NG2P1', 'NG2P1', 'CG2R51'): ((108.784, 0.0),),\n+ ('CG2R51', 'NG2P1', 'NG2P1', 'CG2N2'): ((108.784, 0.0),),\n+ ('CG2N2', 'NG2P1', 'NG2P1', 'CG2R61'): ((125.52000000000001, 0.0),),\n+ ('CG2R61', 'NG2P1', 'NG2P1', 'CG2N2'): ((125.52000000000001, 0.0),),\n+ ('CG2N2', 'NG2P1', 'NG2P1', 'CG331'): ((125.52000000000001, 0.0),),\n+ ('CG331', 'NG2P1', 'NG2P1', 'CG2N2'): ((125.52000000000001, 0.0),),\n+ ('CG2N2', 'NG2D1', 'NG2D1', 'SG311'): ((125.52000000000001, 0.0),),\n+ ('SG311', 'NG2D1', 'NG2D1', 'CG2N2'): ((125.52000000000001, 0.0),),\n+ ('CG2N2', 'NG2D1', 'NG321', 'SG311'): ((133.888, 0.0),),\n+ ('SG311', 'NG321', 'NG2D1', 'CG2N2'): ((133.888, 0.0),),\n+ ('CG2O1', 'CG2D1O', 'NG2S1', 'OG2D1'): ((502.08000000000004, 0.0),),\n+ ('OG2D1', 'NG2S1', 'CG2D1O', 'CG2O1'): ((502.08000000000004, 0.0),),\n+ ('CG2O1', 'CG2DC1', 'NG2D1', 'OG2D1'): ((502.08000000000004, 0.0),),\n+ ('OG2D1', 'NG2D1', 'CG2DC1', 'CG2O1'): ((502.08000000000004, 0.0),),\n+ ('CG2O1', 'CG2DC1', 'NG2S1', 'OG2D1'): ((502.08000000000004, 0.0),),\n+ ('OG2D1', 'NG2S1', 'CG2DC1', 'CG2O1'): ((502.08000000000004, 0.0),),\n+ ('CG2O1', 'CG2DC1', 'NG2S2', 'OG2D1'): ((502.08000000000004, 0.0),),\n+ ('OG2D1', 'NG2S2', 'CG2DC1', 'CG2O1'): ((502.08000000000004, 0.0),),\n+ ('CG2O1', 'CG2DC2', 'NG2S1', 'OG2D1'): ((502.08000000000004, 0.0),),\n+ ('OG2D1', 'NG2S1', 'CG2DC2', 'CG2O1'): ((502.08000000000004, 0.0),),\n+ ('CG2O1', 'CG2DC2', 'NG2S2', 'OG2D1'): ((502.08000000000004, 0.0),),\n+ ('OG2D1', 'NG2S2', 'CG2DC2', 'CG2O1'): ((502.08000000000004, 0.0),),\n+ ('CG2O1', 'CG2R51', 'NG2S1', 'OG2D1'): ((292.88, 0.0),),\n+ ('OG2D1', 'NG2S1', 'CG2R51', 'CG2O1'): ((292.88, 0.0),),\n+ ('CG2O1', 'CG2R61', 'NG2D1', 'OG2D1'): ((502.08000000000004, 0.0),),\n+ ('OG2D1', 'NG2D1', 'CG2R61', 'CG2O1'): ((502.08000000000004, 0.0),),\n+ ('CG2O1', 'CG2R61', 'NG2S1', 'OG2D1'): ((502.08000000000004, 0.0),),\n+ ('OG2D1', 'NG2S1', 'CG2R61', 'CG2O1'): ((502.08000000000004, 0.0),),\n+ ('CG2O1', 'CG2R61', 'NG2S2', 'OG2D1'): ((502.08000000000004, 0.0),),\n+ ('OG2D1', 'NG2S2', 'CG2R61', 'CG2O1'): ((502.08000000000004, 0.0),),\n+ ('CG2O1', 'CG2R62', 'NG2S2', 'OG2D1'): ((502.08000000000004, 0.0),),\n+ ('OG2D1', 'NG2S2', 'CG2R62', 'CG2O1'): ((502.08000000000004, 0.0),),\n+ ('CG2O1', 'CG311', 'NG2D1', 'OG2D1'): ((184.10436800000002, 0.0),),\n+ ('OG2D1', 'NG2D1', 'CG311', 'CG2O1'): ((184.10436800000002, 0.0),),\n+ ('CG2O1', 'CG311', 'NG2S0', 'OG2D1'): ((502.08000000000004, 0.0),),\n+ ('OG2D1', 'NG2S0', 'CG311', 'CG2O1'): ((502.08000000000004, 0.0),),\n+ ('CG2O1', 'CG311', 'NG2S1', 'OG2D1'): ((502.08000000000004, 0.0),),\n+ ('OG2D1', 'NG2S1', 'CG311', 'CG2O1'): ((502.08000000000004, 0.0),),\n+ ('CG2O1', 'CG311', 'NG2S2', 'OG2D1'): ((502.08000000000004, 0.0),),\n+ ('OG2D1', 'NG2S2', 'CG311', 'CG2O1'): ((502.08000000000004, 0.0),),\n+ ('CG2O1', 'CG311', 'NG311', 'OG2D1'): ((502.08000000000004, 0.0),),\n+ ('OG2D1', 'NG311', 'CG311', 'CG2O1'): ((502.08000000000004, 0.0),),\n+ ('CG2O1', 'CG314', 'NG2S2', 'OG2D1'): ((502.08000000000004, 0.0),),\n+ ('OG2D1', 'NG2S2', 'CG314', 'CG2O1'): ((502.08000000000004, 0.0),),\n+ ('CG2O1', 'CG321', 'NG2S0', 'OG2D1'): ((502.08000000000004, 0.0),),\n+ ('OG2D1', 'NG2S0', 'CG321', 'CG2O1'): ((502.08000000000004, 0.0),),\n+ ('CG2O1', 'CG321', 'NG2S1', 'OG2D1'): ((502.08000000000004, 0.0),),\n+ ('OG2D1', 'NG2S1', 'CG321', 'CG2O1'): ((502.08000000000004, 0.0),),\n+ ('CG2O1', 'CG321', 'NG2S2', 'OG2D1'): ((502.08000000000004, 0.0),),\n+ ('OG2D1', 'NG2S2', 'CG321', 'CG2O1'): ((502.08000000000004, 0.0),),\n+ ('CG2O1', 'CG331', 'NG2D1', 'OG2D1'): ((237.0223448, 0.0),),\n+ ('OG2D1', 'NG2D1', 'CG331', 'CG2O1'): ((237.0223448, 0.0),),\n+ ('CG2O1', 'CG331', 'NG2S0', 'OG2D1'): ((297.064, 0.0),),\n+ ('OG2D1', 'NG2S0', 'CG331', 'CG2O1'): ((297.064, 0.0),),\n+ ('CG2O1', 'CG331', 'NG2S1', 'OG2D1'): ((502.08000000000004, 0.0),),\n+ ('OG2D1', 'NG2S1', 'CG331', 'CG2O1'): ((502.08000000000004, 0.0),),\n+ ('CG2O1', 'CG331', 'NG2S2', 'OG2D1'): ((502.08000000000004, 0.0),),\n+ ('OG2D1', 'NG2S2', 'CG331', 'CG2O1'): ((502.08000000000004, 0.0),),\n+ ('CG2O1', 'CG3C50', 'NG2S1', 'OG2D1'): ((502.08000000000004, 0.0),),\n+ ('OG2D1', 'NG2S1', 'CG3C50', 'CG2O1'): ((502.08000000000004, 0.0),),\n+ ('CG2O1', 'CG3C51', 'NG2S0', 'OG2D1'): ((502.08000000000004, 0.0),),\n+ ('OG2D1', 'NG2S0', 'CG3C51', 'CG2O1'): ((502.08000000000004, 0.0),),\n+ ('CG2O1', 'CG3C51', 'NG2S1', 'OG2D1'): ((502.08000000000004, 0.0),),\n+ ('OG2D1', 'NG2S1', 'CG3C51', 'CG2O1'): ((502.08000000000004, 0.0),),\n+ ('CG2O1', 'CG3C51', 'NG2S2', 'OG2D1'): ((502.08000000000004, 0.0),),\n+ ('OG2D1', 'NG2S2', 'CG3C51', 'CG2O1'): ((502.08000000000004, 0.0),),\n+ ('CG2O1', 'CG3C53', 'NG2S0', 'OG2D1'): ((502.08000000000004, 0.0),),\n+ ('OG2D1', 'NG2S0', 'CG3C53', 'CG2O1'): ((502.08000000000004, 0.0),),\n+ ('CG2O1', 'CG3C53', 'NG2S1', 'OG2D1'): ((502.08000000000004, 0.0),),\n+ ('OG2D1', 'NG2S1', 'CG3C53', 'CG2O1'): ((502.08000000000004, 0.0),),\n+ ('CG2O1', 'CG3C53', 'NG2S2', 'OG2D1'): ((502.08000000000004, 0.0),),\n+ ('OG2D1', 'NG2S2', 'CG3C53', 'CG2O1'): ((502.08000000000004, 0.0),),\n+ ('CG2O1', 'CG321', 'NG2S1', 'SG2D1'): ((277.7330832, 0.0),),\n+ ('SG2D1', 'NG2S1', 'CG321', 'CG2O1'): ((277.7330832, 0.0),),\n+ ('CG2O1', 'NG2S0', 'OG2D1', 'HGR52'): ((209.20000000000002, 0.0),),\n+ ('HGR52', 'OG2D1', 'NG2S0', 'CG2O1'): ((209.20000000000002, 0.0),),\n+ ('CG2O1', 'NG2S1', 'OG2D1', 'HGR52'): ((276.144, 0.0),),\n+ ('HGR52', 'OG2D1', 'NG2S1', 'CG2O1'): ((276.144, 0.0),),\n+ ('CG2O1', 'NG2S2', 'OG2D1', 'HGR52'): ((276.144, 0.0),),\n+ ('HGR52', 'OG2D1', 'NG2S2', 'CG2O1'): ((276.144, 0.0),),\n+ ('CG2O2', 'CG2R61', 'OG2D1', 'OG302'): ((301.248, 0.0),),\n+ ('OG302', 'OG2D1', 'CG2R61', 'CG2O2'): ((301.248, 0.0),),\n+ ('CG2O2', 'CG311', 'OG2D1', 'OG302'): ((259.408, 0.0),),\n+ ('OG302', 'OG2D1', 'CG311', 'CG2O2'): ((259.408, 0.0),),\n+ ('CG2O2', 'CG321', 'OG2D1', 'OG302'): ((259.408, 0.0),),\n+ ('OG302', 'OG2D1', 'CG321', 'CG2O2'): ((259.408, 0.0),),\n+ ('CG2O2', 'CG331', 'OG2D1', 'OG302'): ((259.408, 0.0),),\n+ ('OG302', 'OG2D1', 'CG331', 'CG2O2'): ((259.408, 0.0),),\n+ ('CG2O2', 'CG321', 'OG2D1', 'OG303'): ((259.408, 0.0),),\n+ ('OG303', 'OG2D1', 'CG321', 'CG2O2'): ((259.408, 0.0),),\n+ ('CG2O2', 'CG2DC1', 'OG2D1', 'OG311'): ((225.8744952, 0.0),),\n+ ('OG311', 'OG2D1', 'CG2DC1', 'CG2O2'): ((225.8744952, 0.0),),\n+ ('CG2O2', 'CG2R61', 'OG2D1', 'OG311'): ((221.752, 0.0),),\n+ ('OG311', 'OG2D1', 'CG2R61', 'CG2O2'): ((221.752, 0.0),),\n+ ('CG2O2', 'CG311', 'OG2D1', 'OG311'): ((271.96000000000004, 0.0),),\n+ ('OG311', 'OG2D1', 'CG311', 'CG2O2'): ((271.96000000000004, 0.0),),\n+ ('CG2O2', 'CG321', 'OG2D1', 'OG311'): ((271.96000000000004, 0.0),),\n+ ('OG311', 'OG2D1', 'CG321', 'CG2O2'): ((271.96000000000004, 0.0),),\n+ ('CG2O2', 'CG331', 'OG2D1', 'OG311'): ((271.96000000000004, 0.0),),\n+ ('OG311', 'OG2D1', 'CG331', 'CG2O2'): ((271.96000000000004, 0.0),),\n+ ('CG2O2', 'CG2R61', 'OG2D1', 'SG311'): ((258.9444128, 0.0),),\n+ ('SG311', 'OG2D1', 'CG2R61', 'CG2O2'): ((258.9444128, 0.0),),\n+ ('CG2O2', 'CG321', 'OG2D1', 'SG311'): ((277.3745144, 0.0),),\n+ ('SG311', 'OG2D1', 'CG321', 'CG2O2'): ((277.3745144, 0.0),),\n+ ('CG2O2', 'CG331', 'OG2D1', 'SG311'): ((204.02899440000002, 0.0),),\n+ ('SG311', 'OG2D1', 'CG331', 'CG2O2'): ((204.02899440000002, 0.0),),\n+ ('CG2O2', 'OG2D1', 'OG311', 'HGR52'): ((313.8, 0.0),),\n+ ('HGR52', 'OG311', 'OG2D1', 'CG2O2'): ((313.8, 0.0),),\n+ ('CG2O3', 'OG2D2', 'OG2D2', 'CG2DC1'): ((401.664, 0.0),),\n+ ('CG2DC1', 'OG2D2', 'OG2D2', 'CG2O3'): ((401.664, 0.0),),\n+ ('CG2O3', 'OG2D2', 'OG2D2', 'CG2DC2'): ((401.664, 0.0),),\n+ ('CG2DC2', 'OG2D2', 'OG2D2', 'CG2O3'): ((401.664, 0.0),),\n+ ('CG2O3', 'OG2D2', 'OG2D2', 'CG2O5'): ((401.664, 0.0),),\n+ ('CG2O5', 'OG2D2', 'OG2D2', 'CG2O3'): ((401.664, 0.0),),\n+ ('CG2O3', 'OG2D2', 'OG2D2', 'CG2R61'): ((401.664, 0.0),),\n+ ('CG2R61', 'OG2D2', 'OG2D2', 'CG2O3'): ((401.664, 0.0),),\n+ ('CG2O3', 'OG2D2', 'OG2D2', 'CG301'): ((401.664, 0.0),),\n+ ('CG301', 'OG2D2', 'OG2D2', 'CG2O3'): ((401.664, 0.0),),\n+ ('CG2O3', 'OG2D2', 'OG2D2', 'CG311'): ((401.664, 0.0),),\n+ ('CG311', 'OG2D2', 'OG2D2', 'CG2O3'): ((401.664, 0.0),),\n+ ('CG2O3', 'OG2D2', 'OG2D2', 'CG314'): ((401.664, 0.0),),\n+ ('CG314', 'OG2D2', 'OG2D2', 'CG2O3'): ((401.664, 0.0),),\n+ ('CG2O3', 'OG2D2', 'OG2D2', 'CG321'): ((401.664, 0.0),),\n+ ('CG321', 'OG2D2', 'OG2D2', 'CG2O3'): ((401.664, 0.0),),\n+ ('CG2O3', 'OG2D2', 'OG2D2', 'CG322'): ((401.664, 0.0),),\n+ ('CG322', 'OG2D2', 'OG2D2', 'CG2O3'): ((401.664, 0.0),),\n+ ('CG2O3', 'OG2D2', 'OG2D2', 'CG324'): ((401.664, 0.0),),\n+ ('CG324', 'OG2D2', 'OG2D2', 'CG2O3'): ((401.664, 0.0),),\n+ ('CG2O3', 'OG2D2', 'OG2D2', 'CG331'): ((401.664, 0.0),),\n+ ('CG331', 'OG2D2', 'OG2D2', 'CG2O3'): ((401.664, 0.0),),\n+ ('CG2O3', 'OG2D2', 'OG2D2', 'NG2S1'): ((230.5145512, 0.0),),\n+ ('NG2S1', 'OG2D2', 'OG2D2', 'CG2O3'): ((230.5145512, 0.0),),\n+ ('CG2O3', 'OG2D2', 'OG2D2', 'HGR52'): ((280.32800000000003, 0.0),),\n+ ('HGR52', 'OG2D2', 'OG2D2', 'CG2O3'): ((280.32800000000003, 0.0),),\n+ ('CG2O4', 'CG3C41', 'CG3C41', 'OG2D3'): ((83.68, 0.0),),\n+ ('OG2D3', 'CG3C41', 'CG3C41', 'CG2O4'): ((83.68, 0.0),),\n+ ('CG2O4', 'CG3C41', 'OG2D1', 'OG3C51'): ((251.04000000000002, 0.0),),\n+ ('OG3C51', 'OG2D1', 'CG3C41', 'CG2O4'): ((251.04000000000002, 0.0),),\n+ ('CG2O4', 'CG2DC1', 'OG2D1', 'HGR52'): ((58.576, 0.0),),\n+ ('HGR52', 'OG2D1', 'CG2DC1', 'CG2O4'): ((58.576, 0.0),),\n+ ('CG2O4', 'CG2DC2', 'OG2D1', 'HGR52'): ((58.576, 0.0),),\n+ ('HGR52', 'OG2D1', 'CG2DC2', 'CG2O4'): ((58.576, 0.0),),\n+ ('CG2O4', 'CG2R61', 'OG2D1', 'HGR52'): ((221.752, 0.0),),\n+ ('HGR52', 'OG2D1', 'CG2R61', 'CG2O4'): ((221.752, 0.0),),\n+ ('CG2O4', 'CG2R62', 'OG2D1', 'HGR52'): ((221.752, 0.0),),\n+ ('HGR52', 'OG2D1', 'CG2R62', 'CG2O4'): ((221.752, 0.0),),\n+ ('CG2O4', 'CG311', 'OG2D1', 'HGR52'): ((209.20000000000002, 0.0),),\n+ ('HGR52', 'OG2D1', 'CG311', 'CG2O4'): ((209.20000000000002, 0.0),),\n+ ('CG2O4', 'CG321', 'OG2D1', 'HGR52'): ((209.20000000000002, 0.0),),\n+ ('HGR52', 'OG2D1', 'CG321', 'CG2O4'): ((209.20000000000002, 0.0),),\n+ ('CG2O4', 'CG331', 'OG2D1', 'HGR52'): ((209.20000000000002, 0.0),),\n+ ('HGR52', 'OG2D1', 'CG331', 'CG2O4'): ((209.20000000000002, 0.0),),\n+ ('CG2O5', 'CG2D1O', 'CG2DC1', 'OG2D3'): ((207.1803832, 0.0),),\n+ ('OG2D3', 'CG2DC1', 'CG2D1O', 'CG2O5'): ((207.1803832, 0.0),),\n+ ('CG2O5', 'CG2DC1', 'CG2DC1', 'OG2D3'): ((170.93606480000003, 0.0),),\n+ ('OG2D3', 'CG2DC1', 'CG2DC1', 'CG2O5'): ((170.93606480000003, 0.0),),\n+ ('CG2O5', 'CG2DC1', 'CG2O5', 'OG2D3'): ((301.248, 0.0),),\n+ ('OG2D3', 'CG2O5', 'CG2DC1', 'CG2O5'): ((301.248, 0.0),),\n+ ('CG2O5', 'CG2DC1', 'CG331', 'OG2D3'): ((368.192, 0.0),),\n+ ('OG2D3', 'CG331', 'CG2DC1', 'CG2O5'): ((368.192, 0.0),),\n+ ('CG2O5', 'CG2DC2', 'CG2DC2', 'OG2D3'): ((365.5426912, 0.0),),\n+ ('OG2D3', 'CG2DC2', 'CG2DC2', 'CG2O5'): ((365.5426912, 0.0),),\n+ ('CG2O5', 'CG2DC2', 'CG2R51', 'OG2D3'): ((287.3115144, 0.0),),\n+ ('OG2D3', 'CG2R51', 'CG2DC2', 'CG2O5'): ((287.3115144, 0.0),),\n+ ('CG2O5', 'CG2DC2', 'CG331', 'OG2D3'): ((368.192, 0.0),),\n+ ('OG2D3', 'CG331', 'CG2DC2', 'CG2O5'): ((368.192, 0.0),),\n+ ('CG2O5', 'CG2O3', 'CG2R61', 'OG2D3'): ((301.248, 0.0),),\n+ ('OG2D3', 'CG2R61', 'CG2O3', 'CG2O5'): ((301.248, 0.0),),\n+ ('CG2O5', 'CG2O3', 'CG321', 'OG2D3'): ((368.192, 0.0),),\n+ ('OG2D3', 'CG321', 'CG2O3', 'CG2O5'): ((368.192, 0.0),),\n+ ('CG2O5', 'CG2O5', 'CG2R51', 'OG2D3'): ((301.248, 0.0),),\n+ ('OG2D3', 'CG2R51', 'CG2O5', 'CG2O5'): ((301.248, 0.0),),\n+ ('CG2O5', 'CG2R61', 'CG2R61', 'OG2D3'): ((389.27726800000005, 0.0),),\n+ ('OG2D3', 'CG2R61', 'CG2R61', 'CG2O5'): ((389.27726800000005, 0.0),),\n+ ('CG2O5', 'CG2R61', 'CG311', 'OG2D3'): ((301.248, 0.0),),\n+ ('OG2D3', 'CG311', 'CG2R61', 'CG2O5'): ((301.248, 0.0),),\n+ ('CG2O5', 'CG2R61', 'CG321', 'OG2D3'): ((301.248, 0.0),),\n+ ('OG2D3', 'CG321', 'CG2R61', 'CG2O5'): ((301.248, 0.0),),\n+ ('CG2O5', 'CG2R61', 'CG331', 'OG2D3'): ((251.04000000000002, 0.0),),\n+ ('OG2D3', 'CG331', 'CG2R61', 'CG2O5'): ((251.04000000000002, 0.0),),\n+ ('CG2O5', 'CG321', 'CG321', 'OG2D3'): ((292.88, 0.0),),\n+ ('OG2D3', 'CG321', 'CG321', 'CG2O5'): ((292.88, 0.0),),\n+ ('CG2O5', 'CG321', 'CG331', 'OG2D3'): ((292.88, 0.0),),\n+ ('OG2D3', 'CG331', 'CG321', 'CG2O5'): ((292.88, 0.0),),\n+ ('CG2O5', 'CG331', 'CG331', 'OG2D3'): ((292.88, 0.0),),\n+ ('OG2D3', 'CG331', 'CG331', 'CG2O5'): ((292.88, 0.0),),\n+ ('CG2O6', 'NG2D1', 'NG2S1', 'OG2D1'): ((410.03200000000004, 0.0),),\n+ ('OG2D1', 'NG2S1', 'NG2D1', 'CG2O6'): ((410.03200000000004, 0.0),),\n+ ('CG2O6', 'NG2R51', 'NG2S1', 'OG2D1'): ((251.04000000000002, 0.0),),\n+ ('OG2D1', 'NG2S1', 'NG2R51', 'CG2O6'): ((251.04000000000002, 0.0),),\n+ ('CG2O6', 'NG2S0', 'NG2S1', 'OG2D1'): ((361.916, 0.0),),\n+ ('OG2D1', 'NG2S1', 'NG2S0', 'CG2O6'): ((361.916, 0.0),),\n+ ('CG2O6', 'NG2S1', 'NG2S1', 'OG2D1'): ((334.72, 0.0),),\n+ ('OG2D1', 'NG2S1', 'NG2S1', 'CG2O6'): ((334.72, 0.0),),\n+ ('CG2O6', 'NG2S1', 'NG2S2', 'OG2D1'): ((334.72, 0.0),),\n+ ('OG2D1', 'NG2S2', 'NG2S1', 'CG2O6'): ((334.72, 0.0),),\n+ ('CG2O6', 'NG2S2', 'NG2S2', 'OG2D1'): ((334.72, 0.0),),\n+ ('OG2D1', 'NG2S2', 'NG2S2', 'CG2O6'): ((334.72, 0.0),),\n+ ('CG2O6', 'OG302', 'OG302', 'OG2D1'): ((606.6800000000001, 0.0),),\n+ ('OG2D1', 'OG302', 'OG302', 'CG2O6'): ((606.6800000000001, 0.0),),\n+ ('CG2O6', 'OG2D2', 'OG2D2', 'OG2D2'): ((447.68800000000005, 0.0),),\n+ ('OG2D2', 'OG2D2', 'OG2D2', 'CG2O6'): ((447.68800000000005, 0.0),),\n+ ('CG2O6', 'NG2S0', 'OG2D1', 'OG302'): ((259.408, 0.0),),\n+ ('OG302', 'OG2D1', 'NG2S0', 'CG2O6'): ((259.408, 0.0),),\n+ ('CG2O6', 'NG2S1', 'OG2D1', 'OG302'): ((259.408, 0.0),),\n+ ('OG302', 'OG2D1', 'NG2S1', 'CG2O6'): ((259.408, 0.0),),\n+ ('CG2O6', 'OG2D2', 'OG2D2', 'OG311'): ((355.64, 0.0),),\n+ ('OG311', 'OG2D2', 'OG2D2', 'CG2O6'): ((355.64, 0.0),),\n+ ('CG2O6', 'NG2S1', 'NG2S2', 'SG2D1'): ((348.0995952, 0.0),),\n+ ('SG2D1', 'NG2S2', 'NG2S1', 'CG2O6'): ((348.0995952, 0.0),),\n+ ('CG2O6', 'SG311', 'SG311', 'SG2D1'): ((334.72, 0.0),),\n+ ('SG2D1', 'SG311', 'SG311', 'CG2O6'): ((334.72, 0.0),),\n+ ('CG2O6', 'NG2S2', 'OG2D1', 'SG311'): ((189.4247424, 0.0),),\n+ ('SG311', 'OG2D1', 'NG2S2', 'CG2O6'): ((189.4247424, 0.0),),\n+ ('CG2R53', 'CG311', 'NG2R50', 'NG2R51'): ((4.184, 0.0),),\n+ ('NG2R51', 'NG2R50', 'CG311', 'CG2R53'): ((4.184, 0.0),),\n+ ('CG2R53', 'CG251O', 'NG2R51', 'OG2D1'): ((376.56, 0.0),),\n+ ('OG2D1', 'NG2R51', 'CG251O', 'CG2R53'): ((376.56, 0.0),),\n+ ('CG2R53', 'CG251O', 'NG2R53', 'OG2D1'): ((376.56, 0.0),),\n+ ('OG2D1', 'NG2R53', 'CG251O', 'CG2R53'): ((376.56, 0.0),),\n+ ('CG2R53', 'CG252O', 'NG2R53', 'OG2D1'): ((376.56, 0.0),),\n+ ('OG2D1', 'NG2R53', 'CG252O', 'CG2R53'): ((376.56, 0.0),),\n+ ('CG2R53', 'CG25C1', 'NG2R51', 'OG2D1'): ((376.56, 0.0),),\n+ ('OG2D1', 'NG2R51', 'CG25C1', 'CG2R53'): ((376.56, 0.0),),\n+ ('CG2R53', 'CG25C2', 'NG2R51', 'OG2D1'): ((376.56, 0.0),),\n+ ('OG2D1', 'NG2R51', 'CG25C2', 'CG2R53'): ((376.56, 0.0),),\n+ ('CG2R53', 'CG3C41', 'NG2R43', 'OG2D1'): ((502.08000000000004, 0.0),),\n+ ('OG2D1', 'NG2R43', 'CG3C41', 'CG2R53'): ((502.08000000000004, 0.0),),\n+ ('CG2R53', 'CG3C50', 'NG2R53', 'OG2D1'): ((460.24, 0.0),),\n+ ('OG2D1', 'NG2R53', 'CG3C50', 'CG2R53'): ((460.24, 0.0),),\n+ ('CG2R53', 'CG3C51', 'NG2R53', 'OG2D1'): ((376.56, 0.0),),\n+ ('OG2D1', 'NG2R53', 'CG3C51', 'CG2R53'): ((376.56, 0.0),),\n+ ('CG2R53', 'CG3C52', 'NG2R53', 'OG2D1'): ((376.56, 0.0),),\n+ ('OG2D1', 'NG2R53', 'CG3C52', 'CG2R53'): ((376.56, 0.0),),\n+ ('CG2R53', 'NG2R53', 'NG2R53', 'OG2D1'): ((376.56, 0.0),),\n+ ('OG2D1', 'NG2R53', 'NG2R53', 'CG2R53'): ((376.56, 0.0),),\n+ ('CG2R53', 'CG2R51', 'OG2D1', 'OG3C51'): ((119.6624, 0.0),),\n+ ('OG3C51', 'OG2D1', 'CG2R51', 'CG2R53'): ((119.6624, 0.0),),\n+ ('CG2R53', 'CG3C52', 'OG2D1', 'OG3C51'): ((188.28, 0.0),),\n+ ('OG3C51', 'OG2D1', 'CG3C52', 'CG2R53'): ((188.28, 0.0),),\n+ ('CG2R53', 'NG2R53', 'OG2D1', 'SG311'): ((179.912, 0.0),),\n+ ('SG311', 'OG2D1', 'NG2R53', 'CG2R53'): ((179.912, 0.0),),\n+ ('CG2R53', 'NG2R53', 'SG2D1', 'SG311'): ((179.912, 0.0),),\n+ ('SG311', 'SG2D1', 'NG2R53', 'CG2R53'): ((179.912, 0.0),),\n+ ('CG2R62', 'CG2R62', 'NG2R62', 'OG311'): ((0.0, 0.0),),\n+ ('OG311', 'NG2R62', 'CG2R62', 'CG2R62'): ((0.0, 0.0),),\n+ ('CG2R63', 'CG2R62', 'CG2R62', 'OG2D4'): ((62.760000000000005, 0.0),),\n+ ('OG2D4', 'CG2R62', 'CG2R62', 'CG2R63'): ((62.760000000000005, 0.0),),\n+ ('CG2R63', 'CG2R62', 'NG2R61', 'OG2D4'): ((376.56, 0.0),),\n+ ('OG2D4', 'NG2R61', 'CG2R62', 'CG2R63'): ((376.56, 0.0),),\n+ ('CG2R63', 'CG2R62', 'NG2R62', 'OG2D4'): ((251.04000000000002, 0.0),),\n+ ('OG2D4', 'NG2R62', 'CG2R62', 'CG2R63'): ((251.04000000000002, 0.0),),\n+ ('CG2R63', 'CG2R62', 'NG2R67', 'OG2D4'): ((376.56, 0.0),),\n+ ('OG2D4', 'NG2R67', 'CG2R62', 'CG2R63'): ((376.56, 0.0),),\n+ ('CG2R63', 'CG2RC0', 'NG2R61', 'OG2D4'): ((376.56, 0.0),),\n+ ('OG2D4', 'NG2R61', 'CG2RC0', 'CG2R63'): ((376.56, 0.0),),\n+ ('CG2R63', 'CG2RC0', 'NG2RC0', 'OG2D4'): ((217.568, 0.0),),\n+ ('OG2D4', 'NG2RC0', 'CG2RC0', 'CG2R63'): ((217.568, 0.0),),\n+ ('CG2R63', 'NG2P1', 'NG2R61', 'OG2D4'): ((326.35200000000003, 0.0),),\n+ ('OG2D4', 'NG2R61', 'NG2P1', 'CG2R63'): ((326.35200000000003, 0.0),),\n+ ('CG2R63', 'NG2R61', 'NG2R61', 'OG2D4'): ((376.56, 0.0),),\n+ ('OG2D4', 'NG2R61', 'NG2R61', 'CG2R63'): ((376.56, 0.0),),\n+ ('CG2R63', 'NG2R61', 'NG2R62', 'OG2D4'): ((376.56, 0.0),),\n+ ('OG2D4', 'NG2R62', 'NG2R61', 'CG2R63'): ((376.56, 0.0),),\n+ ('CG2R63', 'NG2R61', 'NG2R67', 'OG2D4'): ((376.56, 0.0),),\n+ ('OG2D4', 'NG2R67', 'NG2R61', 'CG2R63'): ((376.56, 0.0),),\n+ ('CG2R63', 'CG2R62', 'OG2D4', 'OG3R60'): ((213.38400000000001, 0.0),),\n+ ('OG3R60', 'OG2D4', 'CG2R62', 'CG2R63'): ((213.38400000000001, 0.0),),\n+ ('CG2R63', 'CG2R61', 'NG2R61', 'SG2D1'): ((129.704, 0.0),),\n+ ('SG2D1', 'NG2R61', 'CG2R61', 'CG2R63'): ((129.704, 0.0),),\n+ ('CG2R63', 'CG2R61', 'NG2R67', 'SG2D1'): ((163.17600000000002, 0.0),),\n+ ('SG2D1', 'NG2R67', 'CG2R61', 'CG2R63'): ((163.17600000000002, 0.0),),\n+ ('CG2R63', 'CG2R62', 'NG2R61', 'SG2D1'): ((163.17600000000002, 0.0),),\n+ ('SG2D1', 'NG2R61', 'CG2R62', 'CG2R63'): ((163.17600000000002, 0.0),),\n+ ('CG2R63', 'CG2R62', 'NG2R67', 'SG2D1'): ((163.17600000000002, 0.0),),\n+ ('SG2D1', 'NG2R67', 'CG2R62', 'CG2R63'): ((163.17600000000002, 0.0),),\n+ ('CG2R63', 'NG2R61', 'NG2R61', 'SG2D1'): ((351.456, 0.0),),\n+ ('SG2D1', 'NG2R61', 'NG2R61', 'CG2R63'): ((351.456, 0.0),),\n+ ('CG2R63', 'NG2R61', 'NG2R62', 'SG2D1'): ((242.672, 0.0),),\n+ ('SG2D1', 'NG2R62', 'NG2R61', 'CG2R63'): ((242.672, 0.0),),\n+ ('CG2R63', 'NG2R61', 'NG2R67', 'SG2D1'): ((351.456, 0.0),),\n+ ('SG2D1', 'NG2R67', 'NG2R61', 'CG2R63'): ((351.456, 0.0),),\n+ ('CG2R63', 'NG2R61', 'NG2R61', 'SEGD1'): ((242.672, 0.0),),\n+ ('SEGD1', 'NG2R61', 'NG2R61', 'CG2R63'): ((242.672, 0.0),),\n+ ('CG2R64', 'NG2P1', 'NG2P1', 'CG2R61'): ((217.568, 0.0),),\n+ ('CG2R61', 'NG2P1', 'NG2P1', 'CG2R64'): ((217.568, 0.0),),\n+ ('CG2R64', 'NG2P1', 'NG2P1', 'CG2R62'): ((217.568, 0.0),),\n+ ('CG2R62', 'NG2P1', 'NG2P1', 'CG2R64'): ((217.568, 0.0),),\n+ ('CG2R64', 'NG2P1', 'NG2P1', 'CG2RC0'): ((217.568, 0.0),),\n+ ('CG2RC0', 'NG2P1', 'NG2P1', 'CG2R64'): ((217.568, 0.0),),\n+ ('CG2R64', 'CG2R61', 'NG2D1', 'NG2P1'): ((117.152, 0.0),),\n+ ('NG2P1', 'NG2D1', 'CG2R61', 'CG2R64'): ((117.152, 0.0),),\n+ ('CG2R64', 'NG2P1', 'NG2P1', 'NG2P1'): ((196.648, 0.0),),\n+ ('NG2P1', 'NG2P1', 'NG2P1', 'CG2R64'): ((196.648, 0.0),),\n+ ('CG2R64', 'HGP2', 'HGP2', 'NG2P1'): ((-4.184, 0.0),),\n+ ('NG2P1', 'HGP2', 'HGP2', 'CG2R64'): ((-4.184, 0.0),),\n+ ('CG2R64', 'CG2R62', 'NG2D1', 'NG2R61'): ((175.728, 0.0),),\n+ ('NG2R61', 'NG2D1', 'CG2R62', 'CG2R64'): ((175.728, 0.0),),\n+ ('CG2R64', 'CG2RC0', 'NG2D1', 'NG2R61'): ((175.728, 0.0),),\n+ ('NG2R61', 'NG2D1', 'CG2RC0', 'CG2R64'): ((175.728, 0.0),),\n+ ('CG2R64', 'CG2R61', 'NG2D1', 'NG2R62'): ((175.728, 0.0),),\n+ ('NG2R62', 'NG2D1', 'CG2R61', 'CG2R64'): ((175.728, 0.0),),\n+ ('CG2R64', 'CG2R61', 'NG2P1', 'NG2R62'): ((175.728, 0.0),),\n+ ('NG2R62', 'NG2P1', 'CG2R61', 'CG2R64'): ((175.728, 0.0),),\n+ ('CG2R64', 'CG2RC0', 'NG2R62', 'NG2S0'): ((92.048, 0.0),),\n+ ('NG2S0', 'NG2R62', 'CG2RC0', 'CG2R64'): ((92.048, 0.0),),\n+ ('CG2R64', 'CG2R61', 'NG2R60', 'NG2S1'): ((79.49600000000001, 0.0),),\n+ ('NG2S1', 'NG2R60', 'CG2R61', 'CG2R64'): ((79.49600000000001, 0.0),),\n+ ('CG2R64', 'CG2R62', 'NG2R62', 'NG2S1'): ((79.49600000000001, 0.0),),\n+ ('NG2S1', 'NG2R62', 'CG2R62', 'CG2R64'): ((79.49600000000001, 0.0),),\n+ ('CG2R64', 'CG2RC0', 'NG2R62', 'NG2S1'): ((167.36, 0.0),),\n+ ('NG2S1', 'NG2R62', 'CG2RC0', 'CG2R64'): ((167.36, 0.0),),\n+ ('CG2R64', 'CG2R61', 'NG2R62', 'NG2S3'): ((251.04000000000002, 0.0),),\n+ ('NG2S3', 'NG2R62', 'CG2R61', 'CG2R64'): ((251.04000000000002, 0.0),),\n+ ('CG2R64', 'CG2R62', 'NG2R62', 'NG2S3'): ((251.04000000000002, 0.0),),\n+ ('NG2S3', 'NG2R62', 'CG2R62', 'CG2R64'): ((251.04000000000002, 0.0),),\n+ ('CG2R64', 'CG2RC0', 'NG2R62', 'NG2S3'): ((167.36, 0.0),),\n+ ('NG2S3', 'NG2R62', 'CG2RC0', 'CG2R64'): ((167.36, 0.0),),\n+ ('CG2R64', 'NG2R61', 'NG2R62', 'NG2S3'): ((167.36, 0.0),),\n+ ('NG2S3', 'NG2R62', 'NG2R61', 'CG2R64'): ((167.36, 0.0),),\n+ ('CG2R64', 'NG2R62', 'NG2R62', 'NG2S3'): ((167.36, 0.0),),\n+ ('NG2S3', 'NG2R62', 'NG2R62', 'CG2R64'): ((167.36, 0.0),),\n+ ('CG2R64', 'CG2R62', 'NG2R62', 'NG301'): ((167.36, 0.0),),\n+ ('NG301', 'NG2R62', 'CG2R62', 'CG2R64'): ((167.36, 0.0),),\n+ ('CG2R64', 'CG2RC0', 'NG2R62', 'NG301'): ((167.36, 0.0),),\n+ ('NG301', 'NG2R62', 'CG2RC0', 'CG2R64'): ((167.36, 0.0),),\n+ ('CG2R64', 'NG2R61', 'NG2R62', 'NG301'): ((167.36, 0.0),),\n+ ('NG301', 'NG2R62', 'NG2R61', 'CG2R64'): ((167.36, 0.0),),\n+ ('CG2R64', 'CG2R62', 'NG2R62', 'NG311'): ((200.832, 0.0),),\n+ ('NG311', 'NG2R62', 'CG2R62', 'CG2R64'): ((200.832, 0.0),),\n+ ('CG2R64', 'CG2RC0', 'NG2R62', 'NG311'): ((209.20000000000002, 0.0),),\n+ ('NG311', 'NG2R62', 'CG2RC0', 'CG2R64'): ((209.20000000000002, 0.0),),\n+ ('CG2R64', 'NG2R61', 'NG2R62', 'NG311'): ((167.36, 0.0),),\n+ ('NG311', 'NG2R62', 'NG2R61', 'CG2R64'): ((167.36, 0.0),),\n+ ('NG2O1', 'OG2N1', 'OG2N1', 'CG324'): ((224.2624, 0.0),),\n+ ('CG324', 'OG2N1', 'OG2N1', 'NG2O1'): ((224.2624, 0.0),),\n+ ('NG2O1', 'OG2N1', 'OG2N1', 'CG334'): ((212.5472, 0.0),),\n+ ('CG334', 'OG2N1', 'OG2N1', 'NG2O1'): ((212.5472, 0.0),),\n+ ('NG2S3', 'HGP4', 'HGP4', 'CG2R61'): ((-10.46, 0.0),),\n+ ('CG2R61', 'HGP4', 'HGP4', 'NG2S3'): ((-10.46, 0.0),),\n+ ('NG2S3', 'HGP4', 'HGP4', 'CG2R64'): ((37.656, 0.0),),\n+ ('CG2R64', 'HGP4', 'HGP4', 'NG2S3'): ((37.656, 0.0),),\n+ ('CC', None, None, 'CTD1'): ((401.664, 0.0),),\n+ ('CTD1', None, None, 'CC'): ((401.664, 0.0),),\n+ ('O', 'CTD1', 'NH2', 'CC'): ((188.28, 0.0),),\n+ ('CC', 'NH2', 'CTD1', 'O'): ((188.28, 0.0),),\n+ ('O', 'NH2', 'CTD1', 'CC'): ((188.28, 0.0),),\n+ ('CC', 'CTD1', 'NH2', 'O'): ((188.28, 0.0),),\n+ ('N', 'C', 'CPD1', 'CP3'): ((0.0, 0.0),),\n+ ('CP3', 'CPD1', 'C', 'N'): ((0.0, 0.0),),\n+ ('O', 'CPD1', 'NH2', 'CC'): ((188.28, 0.0),),\n+ ('CC', 'NH2', 'CPD1', 'O'): ((188.28, 0.0),),\n+ ('O', 'NH2', 'CPD1', 'CC'): ((188.28, 0.0),),\n+ ('CC', 'CPD1', 'NH2', 'O'): ((188.28, 0.0),),\n+ ('CD', 'CC1A', 'O', 'HR1'): ((58.576, 0.0),),\n+ ('HR1', 'O', 'CC1A', 'CD'): ((58.576, 0.0),),\n+ ('CPB', 'CPA', 'NPH', 'CPA'): ((87.02720000000001, 0.0),),\n+ ('CPA', 'NPH', 'CPA', 'CPB'): ((87.02720000000001, 0.0),),\n+ ('CPB', None, None, 'CE1'): ((376.56, 0.0),),\n+ ('CE1', None, None, 'CPB'): ((376.56, 0.0),),\n+ ('CT2', None, None, 'CPB'): ((376.56, 0.0),),\n+ ('CPB', None, None, 'CT2'): ((376.56, 0.0),),\n+ ('CT3', None, None, 'CPB'): ((376.56, 0.0),),\n+ ('CPB', None, None, 'CT3'): ((376.56, 0.0),),\n+ ('HA', 'CPA', 'CPA', 'CPM'): ((123.00959999999999, 0.0),),\n+ ('CPM', 'CPA', 'CPA', 'HA'): ((123.00959999999999, 0.0),),\n+ ('NPH', 'CPA', 'CPA', 'FE'): ((574.8816, 0.0),),\n+ ('FE', 'CPA', 'CPA', 'NPH'): ((574.8816, 0.0),),\n+ ('NPH', 'CPA', 'CPB', 'CPB'): ((169.87040000000002, 0.0),),\n+ ('CPB', 'CPB', 'CPA', 'NPH'): ((169.87040000000002, 0.0),),\n+ ('NPH', 'CPA', 'CPM', 'CPA'): ((76.5672, 0.0),),\n+ ('CPA', 'CPM', 'CPA', 'NPH'): ((76.5672, 0.0),),\n+ ('NPH', 'CPM', 'CPB', 'CPA'): ((136.81680000000003, 0.0),),\n+ ('CPA', 'CPB', 'CPM', 'NPH'): ((136.81680000000003, 0.0),),\n+ ('CT3', 'CD', 'O', 'HR1'): ((117.152, 3.141592653589793),),\n+ ('HR1', 'O', 'CD', 'CT3'): ((117.152, 3.141592653589793),),\n+ ('CT2', 'CD', 'O', 'HR1'): ((117.152, 3.141592653589793),),\n+ ('HR1', 'O', 'CD', 'CT2'): ((117.152, 3.141592653589793),),\n+ ('CA', 'CD', 'O', 'HR1'): ((58.576, 3.141592653589793),),\n+ ('HR1', 'O', 'CD', 'CA'): ((58.576, 3.141592653589793),),\n+ ('CG2D1O', 'CG2D1O', 'NG311', 'HGA4'): ((-10.75288, 0.0),),\n+ ('HGA4', 'NG311', 'CG2D1O', 'CG2D1O'): ((-10.75288, 0.0),),\n+ ('CG2D1O', 'CG2D1O', 'NG2D1', 'HGA4'): ((57.57184, 0.0),),\n+ ('HGA4', 'NG2D1', 'CG2D1O', 'CG2D1O'): ((57.57184, 0.0),),\n+ ('CG2DC1', 'CG321', 'NG2D1', 'HGA4'): ((29.371679999999998, 0.0),),\n+ ('HGA4', 'NG2D1', 'CG321', 'CG2DC1'): ((29.371679999999998, 0.0),),\n+ ('CG2DC1', 'CG321', 'CG321', 'NG2D1'): ((502.08000000000004, 0.0),),\n+ ('NG2D1', 'CG321', 'CG321', 'CG2DC1'): ((502.08000000000004, 0.0),),\n+ ('CG2O5', 'CG2DC1', 'CG321', 'OG2D3'): ((368.192, 0.0),),\n+ ('OG2D3', 'CG321', 'CG2DC1', 'CG2O5'): ((368.192, 0.0),),\n+ ('CG2O5', 'CG2DC1', 'CG311', 'OG2D3'): ((368.192, 0.0),),\n+ ('OG2D3', 'CG311', 'CG2DC1', 'CG2O5'): ((368.192, 0.0),),\n+ ('CG2O3', 'OG2D2', 'OG2D2', 'CG3C51'): ((401.664, 0.0),),\n+ ('CG3C51', 'OG2D2', 'OG2D2', 'CG2O3'): ((401.664, 0.0),),\n+ ('CG2DC1', 'CG2O5', 'CG2R52', 'CG251O'): ((401.664, 0.0),),\n+ ('CG251O', 'CG2R52', 'CG2O5', 'CG2DC1'): ((401.664, 0.0),),\n+ ('CG251O', 'NG2D1', 'CG3C51', 'CG2R53'): ((368.192, 0.0),),\n+ ('CG2R53', 'CG3C51', 'NG2D1', 'CG251O'): ((368.192, 0.0),),\n+ ('CG2R52', 'NG2R50', 'CG3C50', 'CG321'): ((368.192, 0.0),),\n+ ('CG321', 'CG3C50', 'NG2R50', 'CG2R52'): ((368.192, 0.0),),\n+ ('CG2R52', 'NG2R50', 'CG3RC1', 'CG2DC1'): ((368.192, 0.0),),\n+ ('CG2DC1', 'CG3RC1', 'NG2R50', 'CG2R52'): ((368.192, 0.0),),\n+ ('CG2R52', 'NG2R50', 'CG3C51', 'CG2DC1'): ((368.192, 0.0),),\n+ ('CG2DC1', 'CG3C51', 'NG2R50', 'CG2R52'): ((368.192, 0.0),),\n+ ('NG2R50', 'CG2R52', 'CG3RC1', 'NI1P'): ((574.8816, 0.0),),\n+ ('NI1P', 'CG3RC1', 'CG2R52', 'NG2R50'): ((574.8816, 0.0),),\n+ ('NG2R50', 'CG3C51', 'CG2R52', 'NI1P'): ((574.8816, 0.0),),\n+ ('NI1P', 'CG2R52', 'CG3C51', 'NG2R50'): ((574.8816, 0.0),),\n+ ('NG2D1', 'CG251O', 'CG251O', 'NI1P'): ((574.8816, 0.0),),\n+ ('NI1P', 'CG251O', 'CG251O', 'NG2D1'): ((574.8816, 0.0),),\n+ ('C', 'CT3', 'N', 'O'): ((297.064, 0.0),),\n+ ('O', 'N', 'CT3', 'C'): ((297.064, 0.0),),\n+ ('CG2O1', 'CG321', 'NH1', 'OG2D1'): ((502.08000000000004, 0.0),),\n+ ('OG2D1', 'NH1', 'CG321', 'CG2O1'): ((502.08000000000004, 0.0),),\n+ ('CG2O1', 'CG2D1O', 'NH1', 'OG2D1'): ((502.08000000000004, 0.0),),\n+ ('OG2D1', 'NH1', 'CG2D1O', 'CG2O1'): ((502.08000000000004, 0.0),),\n+ ('CG2O1', 'CG3C51', 'NH1', 'OG2D1'): ((502.08000000000004, 0.0),),\n+ ('OG2D1', 'NH1', 'CG3C51', 'CG2O1'): ((502.08000000000004, 0.0),),\n+ ('CG2O1', 'CG311', 'NH1', 'OG2D1'): ((502.08000000000004, 0.0),),\n+ ('OG2D1', 'NH1', 'CG311', 'CG2O1'): ((502.08000000000004, 0.0),),\n+ ('CG2O1', 'CG3C50', 'NH1', 'OG2D1'): ((502.08000000000004, 0.0),),\n+ ('OG2D1', 'NH1', 'CG3C50', 'CG2O1'): ((502.08000000000004, 0.0),),\n+ ('CG2O1', 'CG321', 'NH1', 'SG2D1'): ((277.7330832, 0.0),),\n+ ('SG2D1', 'NH1', 'CG321', 'CG2O1'): ((277.7330832, 0.0),),\n+ ('CG2O1', 'CG3C51', 'N', 'OG2D1'): ((502.08000000000004, 0.0),),\n+ ('OG2D1', 'N', 'CG3C51', 'CG2O1'): ((502.08000000000004, 0.0),),\n+ ('N', 'CG2O1', 'CP1', 'CP3'): ((0.0, 0.0),),\n+ ('CP3', 'CP1', 'CG2O1', 'N'): ((0.0, 0.0),),\n+ ('CG2O1', 'CG311', 'N', 'OG2D1'): ((502.08000000000004, 0.0),),\n+ ('OG2D1', 'N', 'CG311', 'CG2O1'): ((502.08000000000004, 0.0),),\n+ ('CG2O1', 'CG321', 'N', 'OG2D1'): ((502.08000000000004, 0.0),),\n+ ('OG2D1', 'N', 'CG321', 'CG2O1'): ((502.08000000000004, 0.0),),\n+ ('CG2O1', 'CG2D1O', 'N', 'OG2D1'): ((502.08000000000004, 0.0),),\n+ ('OG2D1', 'N', 'CG2D1O', 'CG2O1'): ((502.08000000000004, 0.0),),\n+ ('CG2O1', 'CG321', 'N', 'SG2D1'): ((502.08000000000004, 0.0),),\n+ ('SG2D1', 'N', 'CG321', 'CG2O1'): ((502.08000000000004, 0.0),),\n+ ('CG2O1', 'CG3C50', 'N', 'OG2D1'): ((502.08000000000004, 0.0),),\n+ ('OG2D1', 'N', 'CG3C50', 'CG2O1'): ((502.08000000000004, 0.0),),\n+ ('NG2S0', 'C', 'CG3C51', 'CG3C52'): ((0.0, 0.0),),\n+ ('CG3C52', 'CG3C51', 'C', 'NG2S0'): ((0.0, 0.0),),\n+ ('NG2S0', 'C', 'CG3C50', 'CG3C52'): ((0.0, 0.0),),\n+ ('CG3C52', 'CG3C50', 'C', 'NG2S0'): ((0.0, 0.0),),\n+ ('NG2S1', 'C', 'CG311', 'HGP1'): ((83.68, 0.0),),\n+ ('HGP1', 'CG311', 'C', 'NG2S1'): ((83.68, 0.0),),\n+ ('NG2S1', 'C', 'CG2D1O', 'HGP1'): ((83.68, 0.0),),\n+ ('HGP1', 'CG2D1O', 'C', 'NG2S1'): ((83.68, 0.0),),\n+ ('NG2S1', 'C', 'CG3C51', 'HGP1'): ((83.68, 0.0),),\n+ ('HGP1', 'CG3C51', 'C', 'NG2S1'): ((83.68, 0.0),),\n+ ('NG2S0', 'C', 'CG321', 'CG321'): ((0.0, 0.0),),\n+ ('CG321', 'CG321', 'C', 'NG2S0'): ((0.0, 0.0),),\n+ ('NG2S0', 'C', 'CG311', 'CG331'): ((0.0, 0.0),),\n+ ('CG331', 'CG311', 'C', 'NG2S0'): ((0.0, 0.0),),\n+ ('CAP', None, None, 'NH2'): ((41.84, 0.0),),\n+ ('NH2', None, None, 'CAP'): ((41.84, 0.0),),\n+ ('H', 'H', 'NH2', 'CAP'): ((7.9496, 3.141592653589793),),\n+ ('CAP', 'NH2', 'H', 'H'): ((7.9496, 3.141592653589793),),\n+ ('HP', None, None, 'CAP'): ((62.760000000000005, 0.0),),\n+ ('CAP', None, None, 'HP'): ((62.760000000000005, 0.0),),\n+ ('FA', 'CAP', 'CAP', 'CAP'): ((7.9496, 0.0),),\n+ ('CAP', 'CAP', 'CAP', 'FA'): ((7.9496, 0.0),),\n+ ('CT3', 'CAP', 'CAP', 'CAP'): ((7.9496, 0.0),),\n+ ('CAP', 'CAP', 'CAP', 'CT3'): ((7.9496, 0.0),),\n+ ('CT2', 'CAP', 'CAP', 'CAP'): ((7.9496, 0.0),),\n+ ('CAP', 'CAP', 'CAP', 'CT2'): ((7.9496, 0.0),),\n+ ('CAP', 'CD', 'O', 'HR1'): ((58.576, 3.141592653589793),),\n+ ('HR1', 'O', 'CD', 'CAP'): ((58.576, 3.141592653589793),),\n+ ('COA', 'CAP', 'CT3', 'OCA'): ((125.52000000000001, 0.0),),\n+ ('OCA', 'CT3', 'CAP', 'COA'): ((125.52000000000001, 0.0),),\n+ ('COA', 'CAP', 'NH2', 'OCA'): ((125.52000000000001, 0.0),),\n+ ('OCA', 'NH2', 'CAP', 'COA'): ((125.52000000000001, 0.0),),\n+ ('CAP', 'CAP', 'CAP', 'COA'): ((125.52000000000001, 0.0),),\n+ ('COA', 'CAP', 'CAP', 'CAP'): ((125.52000000000001, 0.0),),\n+ ('CAP', 'CAP', 'CAP', 'CA'): ((125.52000000000001, 0.0),),\n+ ('CA', 'CAP', 'CAP', 'CAP'): ((125.52000000000001, 0.0),),\n+ ('CAP', 'CAP', 'CAP', 'CN'): ((125.52000000000001, 0.0),),\n+ ('CN', 'CAP', 'CAP', 'CAP'): ((125.52000000000001, 0.0),),\n+ ('NR1', 'CPH1', 'CPH2', 'CN7B'): ((2.5104, 0.0),),\n+ ('CN7B', 'CPH2', 'CPH1', 'NR1'): ((2.5104, 0.0),),\n+ ('NR1', 'CPH2', 'CPH1', 'CN7B'): ((2.5104, 0.0),),\n+ ('CN7B', 'CPH1', 'CPH2', 'NR1'): ((2.5104, 0.0),),\n+ ('NN2G', 'CN4', 'CN1', 'HN2'): ((3.3472000000000004, 0.0),),\n+ ('HN2', 'CN1', 'CN4', 'NN2G'): ((3.3472000000000004, 0.0),),\n+ ('CN4', 'NN2G', 'NN3I', 'HN3'): ((163.17600000000002, 0.0),),\n+ ('HN3', 'NN3I', 'NN2G', 'CN4'): ((163.17600000000002, 0.0),),\n+ ('CN1', 'NN3G', 'CN5G', 'ON5'): ((230.12, 0.0),),\n+ ('ON5', 'CN5G', 'NN3G', 'CN1'): ((230.12, 0.0),),\n+ ('CN2', 'NN2C', 'CN3', 'NN1C'): ((376.56, 0.0),),\n+ ('NN1C', 'CN3', 'NN2C', 'CN2'): ((376.56, 0.0),),\n+ ('NNG', None, None, 'CNG'): ((167.36, 0.0),),\n+ ('CNG', None, None, 'NNG'): ((167.36, 0.0),),\n+ ('C', 'O', 'CT2', 'NH1'): ((502.08000000000004, 0.0),),\n+ ('NH1', 'CT2', 'O', 'C'): ((502.08000000000004, 0.0),),\n+ ('CC', 'O', 'CT2', 'N'): ((502.08000000000004, 0.0),),\n+ ('N', 'CT2', 'O', 'CC'): ((502.08000000000004, 0.0),),\n+ ('N', 'CT2', 'CT2', 'CC'): ((0.0, 0.0),),\n+ ('CC', 'CT2', 'CT2', 'N'): ((0.0, 0.0),),\n+ ('N', 'CT2', 'CT2P', 'CC'): ((0.0, 0.0),),\n+ ('CC', 'CT2P', 'CT2', 'N'): ((0.0, 0.0),),\n+ ('CN3', 'CN3C', 'CN8', 'HN6'): ((62.760000000000005, 0.0),),\n+ ('HN6', 'CN8', 'CN3C', 'CN3'): ((62.760000000000005, 0.0),),\n+ ('HN3B', None, None, 'CN3'): ((62.760000000000005, 0.0),),\n+ ('CN3', None, None, 'HN3B'): ((62.760000000000005, 0.0),),\n+ ('HN3B', None, None, 'CN3A'): ((54.392, 0.0),),\n+ ('CN3A', None, None, 'HN3B'): ((54.392, 0.0),),\n+ ('HN3B', None, None, 'CN3B'): ((54.392, 0.0),),\n+ ('CN3B', None, None, 'HN3B'): ((54.392, 0.0),),\n+ ('HN2', 'CN3', 'CN3B', 'NN2'): ((209.20000000000002, 0.0),),\n+ ('NN2', 'CN3B', 'CN3', 'HN2'): ((209.20000000000002, 0.0),),\n+ ('HN1', 'HN1', 'CN1A', 'NN1'): ((-20.92, 0.0),),\n+ ('NN1', 'CN1A', 'HN1', 'HN1'): ((-20.92, 0.0),),\n+ ('ON1', None, None, 'CN1A'): ((167.36, 0.0),),\n+ ('CN1A', None, None, 'ON1'): ((167.36, 0.0),),\n+ ('HN3', None, None, 'CN3C'): ((221.752, 0.0),),\n+ ('CN3C', None, None, 'HN3'): ((221.752, 0.0),),\n+ ('HN6', None, None, 'CN3C'): ((221.752, 0.0),),\n+ ('CN3C', None, None, 'HN6'): ((221.752, 0.0),),\n+ ('HN8', 'CN3', 'CN3', 'CN8'): ((75.312, 0.0),),\n+ ('CN8', 'CN3', 'CN3', 'HN8'): ((75.312, 0.0),),\n+ ('PX', 'OX1', 'OX1', 'ON2'): ((334.72, 0.0),),\n+ ('ON2', 'OX1', 'OX1', 'PX'): ((334.72, 0.0),),\n+ ('PX', 'OX1', 'SX', 'ON2'): ((334.72, 0.0),),\n+ ('ON2', 'SX', 'OX1', 'PX'): ((334.72, 0.0),),\n+ ('PX', 'SX', 'OX1', 'ON2'): ((334.72, 0.0),),\n+ ('ON2', 'OX1', 'SX', 'PX'): ((334.72, 0.0),),\n+ ('PX', 'SX', 'SX', 'ON2'): ((334.72, 0.0),),\n+ ('ON2', 'SX', 'SX', 'PX'): ((334.72, 0.0),),\n+ ('NN3A', 'CN2D', 'NN3A', 'CN2'): ((334.72, 0.0),),\n+ ('CN2', 'NN3A', 'CN2D', 'NN3A'): ((334.72, 0.0),),\n+ ('NN3A', 'CN2D', 'NN3A', 'CN5'): ((334.72, 0.0),),\n+ ('CN5', 'NN3A', 'CN2D', 'NN3A'): ((334.72, 0.0),),\n+ ('CN5', 'CN2', 'NN3A', 'CN2D'): ((334.72, 0.0),),\n+ ('CN2D', 'NN3A', 'CN2', 'CN5'): ((334.72, 0.0),),\n+ ('NG2S1', 'C', 'CG321', 'HGP1'): ((83.68, 0.0),),\n+ ('HGP1', 'CG321', 'C', 'NG2S1'): ((83.68, 0.0),),\n+ ('CC2O1', 'CT1', 'NC2D1', 'OC2D1'): ((502.08000000000004, 0.0),),\n+ ('OC2D1', 'NC2D1', 'CT1', 'CC2O1'): ((502.08000000000004, 0.0),),\n+ ('CC', 'OS', 'NH2', 'OB'): ((502.08000000000004, 0.0),),\n+ ('OB', 'NH2', 'OS', 'CC'): ((502.08000000000004, 0.0),),\n+ ('CC2O2', 'CC312', 'OC2D2', 'OC2D2'): ((401.664, 0.0),),\n+ ('OC2D2', 'OC2D2', 'CC312', 'CC2O2'): ((401.664, 0.0),),\n+ ('CC2O1', 'CT3', 'NC2D1', 'OC2D1'): ((502.08000000000004, 0.0),),\n+ ('OC2D1', 'NC2D1', 'CT3', 'CC2O1'): ((502.08000000000004, 0.0),),\n+ ('CC2O1', 'CC331', 'NC2D1', 'NC2'): ((188.28, 0.0),),\n+ ('NC2', 'NC2D1', 'CC331', 'CC2O1'): ((188.28, 0.0),),\n+ ('CC2O1', 'HCR1', 'NC2D1', 'OC2D1'): ((188.28, 0.0),),\n+ ('OC2D1', 'NC2D1', 'HCR1', 'CC2O1'): ((188.28, 0.0),),\n+ ('CC2O1', 'CT2', 'NC2D1', 'OC2D1'): ((188.28, 0.0),),\n+ ('OC2D1', 'NC2D1', 'CT2', 'CC2O1'): ((188.28, 0.0),),\n+ ('NC2D1', 'CC2O1', 'CC3152', 'HCP1'): ((83.68, 0.0),),\n+ ('HCP1', 'CC3152', 'CC2O1', 'NC2D1'): ((83.68, 0.0),),\n+ ('NC2D1', 'CC2O1', 'CC322', 'HCP1'): ((83.68, 0.0),),\n+ ('HCP1', 'CC322', 'CC2O1', 'NC2D1'): ((83.68, 0.0),),\n+ ('CC2O2', 'CC3163', 'OC301', 'OC2D2'): ((259.408, 0.0),),\n+ ('OC2D2', 'OC301', 'CC3163', 'CC2O2'): ((259.408, 0.0),),\n+ ('CC2O2', 'CC3261', 'OC2D2', 'OC2D2'): ((401.664, 0.0),),\n+ ('OC2D2', 'OC2D2', 'CC3261', 'CC2O2'): ((401.664, 0.0),),\n+ ('CC2O1', 'CC312', 'NC2D1', 'OC2D1'): ((188.28, 0.0),),\n+ ('OC2D1', 'NC2D1', 'CC312', 'CC2O1'): ((188.28, 0.0),),\n+ ('CC2O1', 'CC322', 'NC2D1', 'OC2D1'): ((188.28, 0.0),),\n+ ('OC2D1', 'NC2D1', 'CC322', 'CC2O1'): ((188.28, 0.0),),\n+ ('CC2O1', 'CP1', 'NC2D1', 'OC2D1'): ((188.28, 0.0),),\n+ ('OC2D1', 'NC2D1', 'CP1', 'CC2O1'): ((188.28, 0.0),),\n+ ('CC', 'NH1', 'CP2', 'O'): ((376.56, 0.0),),\n+ ('O', 'CP2', 'NH1', 'CC'): ((376.56, 0.0),),\n+ ('NH1', None, None, 'HCA1'): ((83.68, 0.0),),\n+ ('HCA1', None, None, 'NH1'): ((83.68, 0.0),),\n+ ('NC2D1', 'CC2O1', 'CC311D', 'HCP1'): ((83.68, 0.0),),\n+ ('HCP1', 'CC311D', 'CC2O1', 'NC2D1'): ((83.68, 0.0),),\n+ ('NC2D1', 'CC2O1', 'CC3162', 'HCP1'): ((83.68, 0.0),),\n+ ('HCP1', 'CC3162', 'CC2O1', 'NC2D1'): ((83.68, 0.0),),\n+ ('CC2O1', 'NC2D1', 'CC321', 'OC2D1'): ((188.28, 0.0),),\n+ ('OC2D1', 'CC321', 'NC2D1', 'CC2O1'): ((188.28, 0.0),),\n+ ('CC2O1', 'CC321', 'NC2D1', 'OC2D1'): ((188.28, 0.0),),\n+ ('OC2D1', 'NC2D1', 'CC321', 'CC2O1'): ((188.28, 0.0),),\n+ ('NHL', None, None, 'H'): ((83.68, 0.0),),\n+ ('H', None, None, 'NHL'): ((83.68, 0.0),),\n+ ('CL', None, None, 'CTL2'): ((401.664, 0.0),),\n+ ('CTL2', None, None, 'CL'): ((401.664, 0.0),),\n+ ('C', 'O', 'NH1', 'CTL2'): ((401.664, 0.0),),\n+ ('CTL2', 'NH1', 'O', 'C'): ((401.664, 0.0),),\n+ ('CC2O1', 'CTL2', 'NC2D1', 'OC2D1'): ((502.08000000000004, 0.0),),\n+ ('OC2D1', 'NC2D1', 'CTL2', 'CC2O1'): ((502.08000000000004, 0.0),),\n+ ('C', 'CT1', 'O', 'OSL'): ((259.408, 0.0),),\n+ ('OSL', 'O', 'CT1', 'C'): ((259.408, 0.0),),\n+ ('C', 'CTL2', 'O', 'OSL'): ((259.408, 0.0),),\n+ ('OSL', 'O', 'CTL2', 'C'): ((259.408, 0.0),),\n+ ('N1', 'HNT1', 'HNT1', 'CNT1'): ((145.6032, 0.0),),\n+ ('CNT1', 'HNT1', 'HNT1', 'N1'): ((145.6032, 0.0),),\n+}\n \n-residue_order = {'ALA': 0, 'ARG': 1, 'ASN': 2, 'ASP': 3, 'CYS': 4, 'GLN': 5, 'GLU': 6, 'GLY': 7, 'HSD': 8, 'HSE': 9, 'HSP': 10, 'ILE': 11, 'LEU': 12, 'LYS': 13, 'MET': 14, 'PHE': 15, 'PRO': 16, 'SER': 17, 'THR': 18, 'TRP': 19, 'TYR': 20, 'VAL': 21, 'ALAD': 22, 'CYM': 23, 'GUA': 24, 'ADE': 25, 'CYT': 26, 'THY': 27, 'URA': 28, 'AGLCA': 29, 'BGLCA': 30, 'BGLCA0': 31, 'AIDOA': 32, 'BIDOA': 33, 'AGLCNA': 34, 'BGLCNA': 35, 'BGLCN0': 36, 'AGALNA': 37, 'BGALNA': 38, 'ANE5AC': 39, 'BNE5AC': 40, 'ALLOSE': 41, 'PSICOS': 42, 'LPPC': 43, 'DLPC': 44, 'DLPE': 45, 'DLPS': 46, 'DLPA': 47, 'DLPG': 48, 'DMPC': 49, 'DMPE': 50, 'DMPS': 51, 'DMPA': 52, 'DMPG': 53, 'DPPC': 54, 'DPPE': 55, 'DPPS': 56, 'DPPA': 57, 'DPPG': 58, 'DSPC': 59, 'DSPE': 60, 'DSPS': 61, 'DSPA': 62, 'DSPG': 63, 'DOPC': 64, 'DOPE': 65, 'DOPS': 66, 'DOPA': 67, 'DOPG': 68, 'POPC': 69, 'POPE': 70, 'POPS': 71, 'POPA': 72, 'POPG': 73, 'SAPC': 74, 'SDPC': 75, 'SOPC': 76, 'DAPC': 77, 'ACET': 78, 'PROA': 79, 'GUAN': 80, 'MGUA': 81, 'GLYN': 82, 'ACEH': 83, 'FORM': 84, 'ACEM': 85, 'PRAM': 86, 'NMA': 87, 'AANM': 88, 'APNH': 89, 'PDIP': 90, 'PNH2': 91, 'CO3': 92, 'AALD': 93, 'PALD': 94, 'CALD': 95, 'BALD': 96, '4AP2': 97, '3APY': 98, '34AP': 99, '3CPY': 100, '3FLP': 101, '3ALP': 102, '3HOP': 103, '3MEP': 104, '3ETP': 105, '3BPY': 106, '3CYP': 107, '3ACP': 108, '3NAP': 109, '3CAP': 110, '3PHP': 111, '3BNP': 112, 'MAS': 113, 'ETAC': 114, 'MPRO': 115, 'ACHO': 116, 'GLYC': 117, 'AAPM': 118, 'MBUT': 119, 'CSAD': 120, 'CSGU': 121, 'CSTH': 122, 'CSCY': 123, 'CNAD': 124, 'CNGU': 125, 'CNTH': 126, 'CNT1': 127, 'CNT2': 128, 'CNT3': 129, 'CNCY': 130, 'THFI': 131, 'THMI': 132, 'TADE': 133, 'TCYT': 134, 'TGUA': 135, 'TTHY': 136, 'TURA': 137, 'THAO': 138, 'NUSA': 139, 'NUSG': 140, 'NUSC': 141, 'NUST': 142, 'NUSU': 143, 'RNUS': 144, 'RNUA': 145, 'RNUG': 146, 'RNUC': 147, 'NUCL': 148, 'NADE': 149, 'NTHY': 150, 'NIC': 151, 'NICH': 152, 'AMP': 153, 'ADP': 154, 'ATP': 155, 'NAD': 156, 'NADH': 157, 'NADP': 158, 'NDPH': 159, 'MAM1': 160, 'SAH': 161, 'BF6': 162, 'BF7': 163, 'BCA': 164, 'C36': 165, 'C37': 166, 'C3C': 167, 'PRAL': 168, 'UREA': 169, 'MGU1': 170, 'MGU2': 171, 'HDZ1': 172, 'HDZ2': 173, 'CA': 174, 'DCA': 175, 'LCA': 176, 'CDCA': 177, 'UDCA': 178, 'GA': 179, 'BAB1': 180, 'FBIB': 181, '2PDO': 182, 'ACO': 183, 'IPAA': 184, 'AMOP': 185, '2MPA': 186, '2AMP': 187, '3AMP': 188, '2AMF': 189, 'GABD': 190, 'AMOL': 191, '9MAD': 192, '1MTH': 193, 'FORA': 194, 'BTON': 195, 'CHON': 196, 'DMTT': 197, 'DMCB': 198, 'DECB': 199, 'FORH': 200, 'DMA': 201, 'DMF': 202, 'MRDN': 203, 'MEOI': 204, 'OIRD': 205, 'BAB2': 206, 'DMCA': 207, 'DECA': 208, 'URAC': 209, '2PYO': 210, 'HDZ1B': 211, 'PHMK': 212, 'PHEK': 213, 'BEON': 214, 'AMDN': 215, 'BAMI': 216, 'PNTM': 217, 'MHYO': 218, 'OIHY': 219, 'MOET': 220, 'MOBU': 221, 'MTDO': 222, 'AMET': 223, 'NIME': 224, 'NIPR': 225, 'AZDO': 226, 'ZOIC': 227, 'MBOA': 228, 'YTHY': 229, 'RIN': 230, 'YTS2': 231, 'YT4S': 232, 'YT2S': 233, 'TC243C': 234, '4PYO': 235, '1PH4PO': 236, '21QU': 237, '1PH2PO': 238, '3PHURA': 239, 'URA2S': 240, '3PH2SR': 241, 'URA4S': 242, '3PH4SR': 243, 'URA24S': 244, '3PH24S': 245, '43HPY': 246, '43PPY': 247, '43HSPY': 248, '43HSPP': 249, '4O2SM': 250, 'NZAD': 251, 'NACT': 252, 'CO31': 253, 'GBL': 254, 'B2FO': 255, 'A2FO': 256, 'MT2A': 257, 'DH3T': 258, 'EEPI': 259, 'PYO2B': 260, 'PYO3B': 261, 'PYO2F': 262, 'PYO3F': 263, 'BTMC': 264, 'BM6A': 265, 'CBHH': 266, 'WEI1': 267, 'WEI2': 268, 'MSCH': 269, 'WEI3': 270, 'INCA': 271, 'TICA': 272, 'GTPG': 273, 'GTGN': 274, 'GTSS': 275, 'GTNS': 276, '2OXT': 277, '3OXT': 278, 'PRF': 279, 'B2SU': 280, 'B4SU': 281, 'B52U': 282, 'BH2U': 283, 'BMDU': 284, 'B5HU': 285, 'BMOU': 286, 'B3MU': 287, 'BCYU': 288, 'BPSU': 289, 'B1MP': 290, 'B3MP': 291, 'BSAU': 292, 'B5AU': 293, 'BU8U': 294, 'BSEU': 295, 'B5DU': 296, 'BSCU': 297, 'BIAU': 298, 'BISU': 299, 'B5CU': 300, 'BOCU': 301, 'B70U': 302, 'BBCU': 303, 'BHCU': 304, 'BCMU': 305, 'BOAU': 306, 'BOEU': 307, 'B3AU': 308, 'B13P': 309, 'B5TU': 310, 'BSTU': 311, 'BGAU': 312, 'BGCU': 313, 'B2SC': 314, 'B5MC': 315, 'BHMC': 316, 'B5FC': 317, 'B4MC': 318, 'B4AC': 319, 'B3MC': 320, 'B1PC': 321, 'B3PC': 322, 'B6MA': 323, 'B2MA': 324, 'B8MA': 325, 'BINO': 326, 'B1MI': 327, 'BSMA': 328, 'B6AA': 329, 'B1MA': 330, 'B6IA': 331, 'BHIA': 332, 'BMIA': 333, 'BSIA': 334, 'BHNA': 335, 'B26A': 336, 'B66A': 337, 'BT6A': 338, 'B12A': 339, 'B6GA': 340, 'B1MG': 341, 'B2MG': 342, 'B7MG': 343, 'B27G': 344, 'BDCG': 345, 'BRCG': 346, 'BDAG': 347, 'BQUG': 348, 'BEQG': 349, 'BDWG': 350, 'BIMG': 351, 'BIWG': 352, 'BMWG': 353, 'BYYG': 354, 'BHWG': 355, 'BPBG': 356, 'BBUG': 357, '7MIP': 358, 'M6PA': 359, 'MOAC': 360, '5FOP': 361, 'PESU': 362, 'CMBZ': 363, 'PRNC': 364, 'BZHA': 365, 'MOAT': 366, 'MOAE': 367, 'MPYU': 368, 'HPAT': 369, 'BZAC': 370, '3PRU': 371, 'PMMU': 372, 'BZAA': 373, '12MU': 374, 'HPME': 375, 'OEBZ': 376, 'ATBZ': 377, 'PYMU': 378, 'ACBZ': 379, 'NMGN': 380, 'NMCY': 381, 'MMMU': 382, 'NMGI': 383, 'MEBZ': 384, 'AMBA': 385, 'NCYP': 386, 'PNCP': 387, 'BK2C': 388, 'BR2C': 389, 'BM2G': 390, 'BN2G': 391, 'FLMO': 392, 'FLMR': 393, 'FLVO': 394, 'FLVR': 395, 'RFVO': 396, 'RFVR': 397, 'FMNO': 398, 'FMNR': 399, 'FAD': 400, 'FADR': 401, 'ABMB': 402, 'ABEB': 403, 'ABBM': 404, 'ABNB': 405, 'ABSB': 406, 'ASBB': 407, 'SM002': 408, 'SM005': 409, 'SM011': 410, 'SM013': 411, 'SM016': 412, 'SM018': 413, 'SM019': 414, 'SM021': 415, 'SM022': 416, 'SM025': 417, 'SM027': 418, 'SM030': 419, 'SM031': 420, 'SM038': 421, 'SM040': 422, 'SM041': 423, 'SM043': 424, 'SM044': 425, 'SM045': 426, 'SM046': 427, 'SM047': 428, 'SM049': 429, 'SM050': 430, 'SM051': 431, 'SM057': 432, 'SM058': 433, 'SM060': 434, 'SM061': 435, 'SM064': 436, 'SM068': 437, 'SM072': 438, 'SM075': 439, 'SM077': 440, 'SM084': 441, 'SM085': 442, 'SM086': 443, 'SM087': 444, 'SM088': 445, 'SM092': 446, 'SM098': 447, 'SM099': 448, 'SM100': 449, 'SM101': 450, 'SM102': 451, 'SM103': 452, 'SM106': 453, 'SM108': 454, 'SM109': 455, 'SM110': 456, 'SM111': 457, 'SM116': 458, 'SM117': 459, 'SM118': 460, 'SM127': 461, 'SM128': 462, 'SM132': 463, 'SM134': 464, 'SM135': 465, 'SM137': 466, 'SM143': 467, 'SM144': 468, 'SM169': 469, 'SM172': 470, 'SM173': 471, 'SM174': 472, 'SM176': 473, 'SM179': 474, 'SM180': 475, 'SM181': 476, 'SM185': 477, 'SM187': 478, 'SM189': 479, 'SM194': 480, 'SM199': 481, 'SM213': 482, 'SM214': 483, 'SM215': 484, 'SM216': 485, 'SM218': 486, 'SM221': 487, 'SM224': 488, 'SM227': 489, 'SM233': 490, 'SM234': 491, 'SM237': 492, 'SM238': 493, 'SM239': 494, 'SM240': 495, 'SM241': 496, 'SM242': 497, 'MGU3': 498, 'PGUN': 499, 'MGUN': 500, 'ALDD': 501, 'DALA': 502, 'DARG': 503, 'DASN': 504, 'DASP': 505, 'DCYS': 506, 'DGLN': 507, 'DGLU': 508, 'DGLY': 509, 'DHSD': 510, 'DHSE': 511, 'DHSP': 512, 'DILE': 513, 'DLEU': 514, 'DLYS': 515, 'DMET': 516, 'DPHE': 517, 'DPRO': 518, 'DSER': 519, 'DTHR': 520, 'DTRP': 521, 'DTYR': 522, 'DVAL': 523, 'LYR': 524, 'HEME': 525, 'LFN': 526, 'LFNR': 527, 'RBF': 528, 'RBFR': 529, 'FMN': 530, 'FOL': 531, 'FOLN1': 532, 'FOLDPR': 533, 'PTM6N3': 534, 'PTM6N1': 535, 'PTRN1': 536, 'PE0': 537, 'DPRPTR': 538, 'THG': 539, 'THGN1': 540, 'DHF': 541, 'DHFN1': 542, 'TPT358': 543, 'TPT158': 544, 'DPTN38': 545, 'DPTN18': 546, 'H4B': 547, 'H4BN1': 548, 'COB': 549, 'F430': 550, 'F43T': 551, 'F43A': 552, 'ALY': 553, 'DORN': 554, 'NLE': 555, 'AIBD': 556, 'AIB': 557, 'ASPM': 558, 'LEM': 559, 'LYM': 560, 'NMGLYD': 561, 'MGY': 562, 'HYP': 563, 'HIC': 564, 'HICP': 565, 'NAPH': 566, '143': 567, '0TD': 568, '2CO': 569, '4HH': 570, '5CS': 571, '6V1': 572, 'AGT': 573, 'ALS': 574, 'APK': 575, 'ASB': 576, 'BXT': 577, 'CGU': 578, 'CGV': 579, 'CME': 580, 'CML': 581, 'CSO': 582, 'CSS': 583, 'CSU': 584, 'CSX': 585, 'CYD': 586, 'CYF': 587, 'CYG': 588, 'CYQP': 589, 'DBZ': 590, 'DDE': 591, 'FHO': 592, 'FZN': 593, 'HIP': 594, 'HIX': 595, 'HTI': 596, 'IAM': 597, 'IT1': 598, 'IT1P': 599, 'JJJ': 600, 'KCR': 601, 'KCX': 602, 'KPI': 603, 'LA2': 604, 'LLP': 605, 'LLPP': 606, 'M0H': 607, 'MCL': 608, 'MCS': 609, 'MHS': 610, 'MLZ': 611, 'NEP': 612, 'PRV': 613, 'QCS': 614, 'QPA': 615, 'R1A': 616, 'SDP': 617, 'SEB': 618, 'SEN': 619, 'SGB': 620, 'SNC': 621, 'SUN': 622, 'SVX': 623, 'SVY': 624, 'TOX': 625, 'TPQ': 626, 'TQQ': 627, 'TRQ': 628, 'TRW': 629, 'TS9': 630, 'TYS': 631, 'XCN': 632, '0AF': 633, '26P': 634, '2FM': 635, '2HF': 636, '2HFD': 637, '2HFE': 638, '2NP': 639, '32T': 640, '3GL': 641, '4FW': 642, '4HT': 643, '4IN': 644, '6CL': 645, 'ACZ': 646, 'AGM': 647, 'AHB': 648, 'ARO': 649, 'AZDA': 650, 'DAZDA': 651, 'BB8': 652, 'BCS': 653, 'BHD': 654, 'BTH3': 655, 'DBTH3': 656, 'CAN': 657, 'CCS': 658, 'CIR': 659, 'CSA': 660, 'DDZ': 661, 'ESC': 662, 'F2F': 663, 'FGA4': 664, 'DFGA4': 665, 'FPH2': 666, 'DFPH2': 667, 'FT6': 668, 'FTR': 669, 'FUA2': 670, 'DFUA2': 671, 'FVAL': 672, 'DFVAL': 673, 'GDPR': 674, 'DGDPR': 675, 'GGB': 676, 'GGBP': 677, 'GHG': 678, 'HGA': 679, 'HOX': 680, 'HTR': 681, 'IGL': 682, 'KYN': 683, 'LE1': 684, 'LED': 685, 'LEF': 686, 'LME': 687, 'LVN': 688, 'M2S': 689, 'ME0': 690, 'NIY': 691, 'OBF': 692, 'OCY': 693, 'OMX': 694, 'PBF': 695, 'PF5': 696, 'PYR2': 697, 'DPYR2': 698, 'PYZ1': 699, 'DPYZ1': 700, 'QU32': 701, 'DQU32': 702, 'QX32': 703, 'DQX32': 704, 'STYA': 705, 'DSTYA': 706, 'TEZA': 707, 'DTEZA': 708, 'TFG2': 709, 'DTFG2': 710, 'TFG3': 711, 'DTFG3': 712, 'TFG4': 713, 'DTFG4': 714, 'TFLE': 715, 'DTFLE': 716, 'TFP2': 717, 'DTFP2': 718, 'TFP3': 719, 'DTFP3': 720, 'TFP4': 721, 'DTFP4': 722, 'THG2': 723, 'DTHG2': 724, 'THG3': 725, 'DTHG3': 726, 'THIC': 727, 'DTHIC': 728, 'TIH': 729, 'TRO': 730, 'TTQ': 731, 'TY2': 732, 'TYQ': 733, 'TZA4': 734, 'DTZA4': 735, 'YCM': 736, 'YOF': 737, '004': 738, '0A1': 739, '0BN': 740, '2AG': 741, '2AS': 742, '3CF': 743, '3FG': 744, '4CF': 745, '4CY': 746, '4HMP': 747, 'D4HMP': 748, '4PH': 749, 'AA4': 750, 'ABA': 751, 'AHP': 752, 'ALC': 753, 'ALN': 754, 'ALO': 755, 'ANTH': 756, 'DANTH': 757, 'APD': 758, 'APM': 759, 'AS2': 760, 'BIF': 761, 'BUG': 762, 'CHG': 763, 'CNP2': 764, 'DCNP2': 765, 'CPA3': 766, 'DCPA3': 767, 'D4P': 768, 'DAB': 769, 'DAH': 770, 'DIAL': 771, 'DDILE': 772, 'DIPH': 773, 'DDIPH': 774, 'DMK': 775, 'DMP3': 776, 'DDMP3': 777, 'DPP': 778, 'FPG2': 779, 'DFPG2': 780, 'FPG3': 781, 'DFPG3': 782, 'FPG4': 783, 'DFPG4': 784, 'FPH3': 785, 'DFPH3': 786, 'GBUT': 787, 'DGBUT': 788, 'GME': 789, 'HCS': 790, 'HHK': 791, 'HIL4': 792, 'DHIL4': 793, 'HL2': 794, 'HLEU': 795, 'DHLEU': 796, 'HLU': 797, 'HPE': 798, 'HQA': 799, 'HRG': 800, 'HRP': 801, 'HSER': 802, 'DHSER': 803, 'HVA': 804, 'I2M': 805, 'IIL': 806, 'ILX': 807, 'LDO': 808, 'LMQ': 809, 'LVG': 810, 'MEG': 811, 'MEN': 812, 'MEQ': 813, 'MHO': 814, 'MOT5': 815, 'DMOT5': 816, 'MP34': 817, 'DMP34': 818, 'MPH2': 819, 'DMPH2': 820, 'MTR5': 821, 'DMTR5': 822, 'MTR6': 823, 'DMTR6': 824, 'MTY': 825, 'NAL': 826, 'NAO1': 827, 'DNAO1': 828, 'NAO2': 829, 'DNAO2': 830, 'NVA': 831, 'OAS': 832, 'OLT': 833, 'OMT': 834, 'ONL': 835, 'ORN': 836, 'OTYR': 837, 'DOTYR': 838, 'PFF': 839, 'PPN': 840, 'PYR3': 841, 'DPYR3': 842, 'PYR4': 843, 'DPYR4': 844, 'QU33': 845, 'DQU33': 846, 'QU34': 847, 'DQU34': 848, 'QU35': 849, 'DQU35': 850, 'QU36': 851, 'DQU36': 852, 'SLZ': 853, 'SME': 854, 'SYM': 855, 'TBP4': 856, 'DTBP4': 857, 'TH6': 858, 'THA3': 859, 'DTHA3': 860, 'TRX': 861, 'UN1': 862, 'VAH': 863, 'WFP': 864, '2GX': 865, '2MR': 866, '5CT': 867, '9R1': 868, 'ASL': 869, 'AZH': 870, 'CGUP': 871, 'CYQ': 872, 'DA2': 873, 'DBB': 874, 'DDEP': 875, 'DNP': 876, 'GPL': 877, 'IAS': 878, 'KHB': 879, 'LYX': 880, 'LYZ': 881, 'M3L': 882, 'MHSP': 883, 'MIR': 884, 'MLY': 885, 'NMM': 886, 'OCS': 887, 'OSE': 888, 'PHD': 889, 'PHDP': 890, 'PM3': 891, 'PR3': 892, 'PRK': 893, 'SBG': 894, 'SCH': 895, 'SCS': 896, 'SMC': 897, 'SVV': 898, 'TPQP': 899, '4FB': 900, '8LJ': 901, 'AYA': 902, 'B2H': 903, 'B3A': 904, 'B3E': 905, 'B3K': 906, 'B3S': 907, 'B3X': 908, 'B3Y': 909, 'CH6': 910, 'CR2': 911, 'CR8D': 912, 'CRF': 913, 'CRO': 914, 'CRQ': 915, 'CXM': 916, 'DYA': 917, 'DYG': 918, 'FGL': 919, 'FLA': 920, 'FME': 921, 'FP9': 922, 'GL3': 923, 'GYS': 924, 'HMR': 925, 'HT7': 926, 'HZP': 927, 'I4G': 928, 'MAA': 929, 'MDO': 930, 'MP8': 931, 'NRQ': 932, 'PIA': 933, 'PR4': 934, 'PRS': 935, 'PXU': 936, 'SUI': 937, 'SWG': 938, 'XYG': 939, 'SM014': 940, 'SM023': 941, 'SM032': 942, 'SM035': 943, 'SM056': 944, 'SM070': 945, 'SM071': 946, 'SM076': 947, 'SM078': 948, 'SM095': 949, 'SM114': 950, 'SM115': 951, 'SM119': 952, 'SM120': 953, 'SM136': 954, 'SM138': 955, 'SM140': 956, 'SM154': 957, 'SM155': 958, 'SM190': 959, 'SM191': 960, 'SM192': 961, 'SM195': 962, 'SM206': 963, 'SM209': 964, 'SM210': 965, 'SM222': 966, 'SM223': 967, 'SM226': 968, 'SM228': 969, 'SM229': 970, 'SM230': 971, 'SM231': 972, 'SM232': 973, 'SM235': 974, 'SM236': 975, 'PYRE': 976, '3AP2': 977, 'PTR': 978, 'SEP': 979, 'TPO': 980, 'SAM': 981, 'CYPR': 982, 'CYTH': 983, 'N4EM': 984, 'XPN': 985, 'YPN': 986, 'GPN': 987, 'CPN': 988, 'TPN': 989, 'UPN': 990, 'APN': 991, 'E1XM': 992, 'E1XE': 993, 'E1X': 994, 'OMU': 995, '2SU': 996, 'MSU': 997, '4SU': 998, '52U': 999, '5MU': 1000, '2MU': 1001, 'H2U': 1002, 'MDU': 1003, '5HU': 1004, 'MOU': 1005, '3MU': 1006, 'M3U': 1007, 'CYU': 1008, 'PSU': 1009, 'OMP': 1010, '1MP': 1011, '3MP': 1012, 'SAU': 1013, '5AU': 1014, 'U8U': 1015, 'SEU': 1016, '5DU': 1017, 'MAU': 1018, 'SCU': 1019, 'IAU': 1020, 'MIU': 1021, 'ISU': 1022, '5CU': 1023, 'OCU': 1024, 'MEU': 1025, '70U': 1026, 'BCU': 1027, 'MCU': 1028, 'HCU': 1029, 'CMU': 1030, 'OAU': 1031, 'OEU': 1032, '3AU': 1033, '13P': 1034, '5TU': 1035, 'STU': 1036, 'GAU': 1037, 'GCU': 1038, 'OMC': 1039, '2SC': 1040, '5MC': 1041, 'MMC': 1042, 'HMC': 1043, '5FC': 1044, 'MFC': 1045, '4MC': 1046, '4OC': 1047, '4AC': 1048, 'MAC': 1049, 'TMC': 1050, '3MC': 1051, 'K2C': 1052, 'R2C': 1053, '1PC': 1054, '3PC': 1055, 'OMA': 1056, 'RIA': 1057, '6MA': 1058, 'MMA': 1059, 'M6A': 1060, 'MTA': 1061, '2MA': 1062, '8MA': 1063, 'INO': 1064, 'OMI': 1065, '1MI': 1066, 'MMI': 1067, 'SMA': 1068, '6AA': 1069, '1MA': 1070, 'M2A': 1071, '6IA': 1072, 'HIA': 1073, 'MIA': 1074, 'SIA': 1075, 'HNA': 1076, '26A': 1077, '66A': 1078, 'T6A': 1079, '12A': 1080, '6GA': 1081, 'OMG': 1082, 'RIG': 1083, '1MG': 1084, 'M1G': 1085, '2MG': 1086, 'MMG': 1087, '7MG': 1088, '27G': 1089, 'M7G': 1090, 'M2G': 1091, 'MTG': 1092, 'N2G': 1093, 'DCG': 1094, 'RCG': 1095, 'DAG': 1096, 'QUG': 1097, 'EQG': 1098, 'MQG': 1099, 'GQG': 1100, 'DWG': 1101, 'IMG': 1102, 'IWG': 1103, 'MWG': 1104, 'YYG': 1105, 'HWG': 1106, 'PBG': 1107, 'BMQG': 1108, 'BGQG': 1109, 'GMP': 1110, 'GDP': 1111, 'GTP': 1112, 'CMP': 1113, 'CDP': 1114, 'CTP': 1115, 'TMP': 1116, 'TDP': 1117, 'TTP': 1118, 'UMP': 1119, 'UDP': 1120, 'UTP': 1121, 'NAI': 1122, 'NAP': 1123, 'NDP': 1124, 'NAD1': 1125, 'PTS': 1126, 'ANE5GC': 1127, 'BNE5GC': 1128, 'AMANNA': 1129, 'BMANNA': 1130, 'AGULNA': 1131, 'BGULNA': 1132, 'AALTNA': 1133, 'BALTNA': 1134, 'ALGLNA': 1135, 'BLGLNA': 1136, 'ALMANA': 1137, 'BLMANA': 1138, 'ALGANA': 1139, 'BLGANA': 1140, 'ALGUNA': 1141, 'BLGUNA': 1142, 'ALALNA': 1143, 'BLALNA': 1144, 'ALTANA': 1145, 'BLTANA': 1146, 'ALIDNA': 1147, 'BLIDNA': 1148, 'AALLNA': 1149, 'BALLNA': 1150, 'ATALNA': 1151, 'BTALNA': 1152, 'AIDONA': 1153, 'BIDONA': 1154, 'AMANA': 1155, 'BMANA': 1156, 'AGULA': 1157, 'BGULA': 1158, 'AALTA': 1159, 'BALTA': 1160, 'AALLA': 1161, 'BALLA': 1162, 'ATALA': 1163, 'BTALA': 1164, 'ARHMNA': 1165, 'BRHMNA': 1166, 'AFUCNA': 1167, 'BFUCNA': 1168, 'ANEU': 1169, 'BNEU': 1170, 'ADHA': 1171, 'BDHA': 1172, 'ALGULA': 1173, 'BLGULA': 1174, 'ALALTA': 1175, 'BLALTA': 1176, 'AMU2AC': 1177, 'BMU2AC': 1178, 'AMU2GC': 1179, 'BMU2GC': 1180, 'BKDN': 1181, 'AKDN': 1182, 'QUITA': 1183, 'BGLGL': 1184, 'AQUINA': 1185, 'BQUINA': 1186, 'AGALAA': 1187, 'AGLAA': 1188, 'ALGLAA': 1189, 'BLEG': 1190, 'ALEG': 1191, 'A8LEG': 1192, 'B8LEG': 1193, 'APSE': 1194, 'BPSE': 1195, 'DGLYA': 1196, 'SAPI': 1197, 'SAPI13': 1198, 'SAPI14': 1199, 'SAPI15': 1200, 'SAPI24': 1201, 'SAPI25': 1202, 'SAPI2A': 1203, 'SAPI2B': 1204, 'SAPI2C': 1205, 'SAPI2D': 1206, 'SAPI33': 1207, 'SAPI34': 1208, 'SAPI35': 1209, 'DMPI': 1210, 'DMPI13': 1211, 'DMPI14': 1212, 'DMPI15': 1213, 'DMPI24': 1214, 'DMPI25': 1215, 'DMPI2A': 1216, 'DMPI2B': 1217, 'DMPI2C': 1218, 'DMPI2D': 1219, 'DMPI33': 1220, 'DMPI34': 1221, 'DMPI35': 1222, 'DLIPI': 1223, 'POPI': 1224, 'POPI13': 1225, 'POPI14': 1226, 'POPI15': 1227, 'POPI24': 1228, 'POPI25': 1229, 'POPI2A': 1230, 'POPI2B': 1231, 'POPI2D': 1232, 'POPI2C': 1233, 'POPI33': 1234, 'POPI34': 1235, 'POPI35': 1236, 'PNPI': 1237, 'PNPI13': 1238, 'PNPI14': 1239, 'PNPI15': 1240, 'PNPI24': 1241, 'PNPI25': 1242, 'PNPI2A': 1243, 'PNPI2B': 1244, 'PNPI2C': 1245, 'PNPI2D': 1246, 'PNPI33': 1247, 'PNPI34': 1248, 'PNPI35': 1249, 'PLPI': 1250, 'PLPI13': 1251, 'PLPI14': 1252, 'PLPI15': 1253, 'PLPI24': 1254, 'PLPI25': 1255, 'PLPI2A': 1256, 'PLPI2B': 1257, 'PLPI2C': 1258, 'PLPI2D': 1259, 'PLPI33': 1260, 'PLPI34': 1261, 'PLPI35': 1262, 'PYPI': 1263, 'PSM': 1264, 'SSM': 1265, 'OSM': 1266, 'ASM': 1267, 'BSM': 1268, '23SM': 1269, 'LSM': 1270, 'NSM': 1271, 'CER2': 1272, 'CER160': 1273, 'CER180': 1274, 'CER181': 1275, 'CER200': 1276, 'CER220': 1277, 'CER240': 1278, 'CER241': 1279, 'CER3E': 1280, 'PYPE': 1281, 'YOPA': 1282, 'DYPC': 1283, 'YOPC': 1284, 'DYPE': 1285, 'YOPE': 1286, 'YOPS': 1287, 'C7DHPC': 1288, 'C6DHPC': 1289, 'LMPG': 1290, 'LPPG': 1291, 'LPC12': 1292, 'LPC14': 1293, 'MYR': 1294, 'PAL': 1295, 'STE': 1296, 'ARA': 1297, 'BEH': 1298, 'TRI': 1299, 'LIGN': 1300, 'MYRO': 1301, 'PALO': 1302, 'HTA': 1303, 'OLE': 1304, 'LIN': 1305, 'ALIN': 1306, 'SDA': 1307, 'GLA': 1308, 'EICO': 1309, 'EDA': 1310, 'MEA': 1311, 'DGLA': 1312, 'ETE': 1313, 'ETA': 1314, 'EPA': 1315, 'ARAN': 1316, 'HPA': 1317, 'ERU': 1318, 'DDA': 1319, 'ADR': 1320, 'DPT': 1321, 'DPA': 1322, 'DHA': 1323, 'NER': 1324, 'TTA': 1325, 'TPT': 1326, 'TPA': 1327, 'THA': 1328, 'MYRP': 1329, 'PALP': 1330, 'STEP': 1331, 'ARAP': 1332, 'BEHP': 1333, 'TRIP': 1334, 'LIGNP': 1335, 'MYROP': 1336, 'PALOP': 1337, 'HTAP': 1338, 'OLEP': 1339, 'LINP': 1340, 'ALINP': 1341, 'SDAP': 1342, 'GLAP': 1343, 'EICOP': 1344, 'EDAP': 1345, 'MEAP': 1346, 'DGLAP': 1347, 'ETEP': 1348, 'ETAP': 1349, 'EPAP': 1350, 'ARANP': 1351, 'HPAP': 1352, 'ERUP': 1353, 'DDAP': 1354, 'ADRP': 1355, 'DPTP': 1356, 'DPAP': 1357, 'DHAP': 1358, 'NERP': 1359, 'TTAP': 1360, 'TPTP': 1361, 'TPAP': 1362, 'THAP': 1363, 'THDPPC': 1364, 'CYSP': 1365, 'GLYM': 1366, 'LYSM': 1367, 'CYSL': 1368, 'ABLIPA': 1369, 'ABLIPB': 1370, 'BCLIPA': 1371, 'BCLIPB': 1372, 'BCLIPC': 1373, 'CJLIPA': 1374, 'CTLIPA': 1375, 'ECLIPA': 1376, 'ECLIPB': 1377, 'ECLIPC': 1378, 'HPLIPA': 1379, 'HPLIPB': 1380, 'KPLIPA': 1381, 'KPLIPB': 1382, 'KPLIPC': 1383, 'LILIPA': 1384, 'MCLIPA': 1385, 'NGLIPA': 1386, 'NGLIPB': 1387, 'NGLIPC': 1388, 'PALIPA': 1389, 'PALIPB': 1390, 'PALIPC': 1391, 'PALIPD': 1392, 'PALIPE': 1393, 'SFLIPA': 1394, 'SELIPA': 1395, 'SELIPB': 1396, 'SELIPC': 1397, 'VCLIPA': 1398, 'VCLIPB': 1399, 'VCLIPC': 1400, 'VCLIPD': 1401, 'VCLIPE': 1402, 'YPLIPA': 1403, 'YPLIPB': 1404, 'PVPG': 1405, 'PVPE': 1406, 'PPPE': 1407, 'PMPE': 1408, 'QMPE': 1409, 'OYPE': 1410, 'PYPG': 1411, 'IPPC': 1412, 'APPC': 1413, 'PHPC': 1414, 'PMPG': 1415, 'PVCL2': 1416, 'DPPGK': 1417, 'TOCL1': 1418, 'TOCL2': 1419, 'TMCL1': 1420, 'TMCL2': 1421, 'TLCL1': 1422, 'TLCL2': 1423, 'PMCL1': 1424, 'PMCL2': 1425, 'TYCL1': 1426, 'TYCL2': 1427, 'LOACL1': 1428, 'LOACL2': 1429, 'LOCCL1': 1430, 'LOCCL2': 1431, 'LNACL1': 1432, 'LNACL2': 1433, 'LNBCL1': 1434, 'LNBCL2': 1435, 'LNCCL1': 1436, 'LNCCL2': 1437, 'LNDCL1': 1438, 'LNDCL2': 1439, 'DDPC': 1440, 'DCPC': 1441, 'DXPC': 1442, 'DGPC': 1443, 'DEPC': 1444, 'DNPC': 1445, 'DXPE': 1446, 'DGPE': 1447, 'DEPE': 1448, 'DNPE': 1449, 'SAPE': 1450, 'SLPE': 1451, 'PLPE': 1452, 'SLPC': 1453, 'PLPC': 1454, 'DYPS': 1455, 'DGPS': 1456, 'DEPS': 1457, 'DNPS': 1458, 'SAPS': 1459, 'SLPS': 1460, 'PLPS': 1461, 'DYPA': 1462, 'DGPA': 1463, 'DEPA': 1464, 'DNPA': 1465, 'SAPA': 1466, 'SLPA': 1467, 'PLPA': 1468, 'DYPG': 1469, 'DGPG': 1470, 'DEPG': 1471, 'DNPG': 1472, 'SAPG': 1473, 'PLPG': 1474, 'SDPE': 1475, 'SOPE': 1476, 'DAPE': 1477, 'SDPS': 1478, 'SOPS': 1479, 'DAPS': 1480, 'SDPA': 1481, 'SOPA': 1482, 'DAPA': 1483, 'SDPG': 1484, 'SOPG': 1485, 'DAPG': 1486, 'DIPA': 1487, 'TIPA': 1488, 'DTPA': 1489, 'DUPC': 1490, 'DLIPC': 1491, 'DLIPE': 1492, 'LLPA': 1493, 'LLPC': 1494, 'LLPE': 1495, 'LLPS': 1496, 'TSPC': 1497, 'DDOPC': 1498, 'DDOPE': 1499, 'DDOPS': 1500, 'PDOPC': 1501, 'PDOPE': 1502, 'DOPP1': 1503, 'DOPP2': 1504, 'DOPP3': 1505, 'POPP1': 1506, 'POPP2': 1507, 'POPP3': 1508}\n-patch_order = {'ACE': 0, 'ACED': 1, 'ACP': 2, 'ACPD': 3, 'CTER': 4, 'CNEU': 5, 'PCTE': 6, 'CT1': 7, 'CT2': 8, 'CT3': 9, 'HS2': 10, 'LIG1': 11, 'LINK': 12, 'SAHP': 13, 'GYCO': 14, 'AMGA': 15, 'GMGA': 16, 'DMGA': 17, 'AMGT': 18, 'ATGM': 19, 'ABGA': 20, 'GBGA': 21, 'DBGA': 22, 'ALME': 23, 'G4MPAB': 24, 'G4PAB': 25, 'G3PABR': 26, 'G3PABS': 27, 'BPAB': 28, 'BPAT': 29, '3MSB': 30, '2MRB': 31, '2APP': 32, '3APP': 33, '4APP': 34, '2APD': 35, '3APD': 36, '4APD': 37, '2AFP': 38, '3AFP': 39, '4AFP': 40, '2AFD': 41, '3AFD': 42, '4AFD': 43, '4FBP': 44, '3FBP': 45, '2FBP': 46, 'FBIFR': 47, 'FBIFS': 48, '3MRB': 49, '2MSB': 50, '3A2MPD': 51, '3A2MPP': 52, '3A4MPD': 53, '3A5MPD': 54, '3A6MPD': 55, '4A2MPD': 56, '4A2MPP': 57, '3CPD': 58, '3A46PD': 59, '2AEPD': 60, '2XBD': 61, '3XBD': 62, '4XBD': 63, '4XEBD': 64, '3XBP': 65, 'B5H6': 66, 'B5HE': 67, 'TAUR': 68, 'RN1': 69, 'RN2': 70, 'RN3': 71, 'KAC': 72, 'AMGY': 73, 'DMCT': 74, 'SAHC': 75, 'PSAM': 76, '5MC1': 77, 'INO1': 78, '4EG1': 79, 'CT': 80, 'CTN': 81, 'PACE': 82, '5UHG': 83, '5UHC': 84, '5UHO': 85, '5UHA': 86, 'CYTP': 87, '3MCN': 88, 'ADEP': 89, 'ADEI': 90, '1MAN': 91, '6AH': 92, 'GENO': 93, 'BUGN': 94, 'PTSR': 95, 'PTSS': 96, 'PTSD': 97, 'P6EN': 98, '2ANAM': 99, '2BNAM': 100, '3ANAM': 101, '3BNAM': 102, '5BNAM2': 103, '1ANAC': 104, '1BNAC': 105, '2ANAC': 106, '2BNAC': 107, '3ANAC': 108, '3BNAC': 109, '4ANAC': 110, '4BNAC': 111, '9TNAC': 112, '2BNFO': 113, '3ANFO': 114, '3BNFO': 115, '7BNFO': 116, '2ANSB': 117, '2BNSB': 118, '3BNRB': 119, '5BNRB2': 120, '5ANRB2': 121, '7BNRB': 122, '3BNSB': 123, '4BNRB': 124, '4ANRB': 125, '4BNSB': 126, '4BNASB': 127, '4BDASB': 128, '3BNANA': 129, '3ANANA': 130, '4BNANA': 131, '4ANANA': 132, '4BNSNA': 133, '3BNSNA': 134, '4ANTNA': 135, '4BNTNA': 136, '4ANGNA': 137, '4BNGNA': 138, '6TNG2': 139, '6TNG': 140, '7TNG': 141, '2ANA': 142, '2BNA': 143, '6TCOO': 144, '3BMDP': 145, '6COOME': 146, '1AGLYA': 147, '1BGLYA': 148, '1AOS': 149, '1ANGF': 150, '1BNGF': 151, 'LIPAN1': 152, 'LIPAN2': 153, '4ANSDB': 154, '4BNSDB': 155, '4ANDHH': 156, '4BNDHH': 157, '4ANRHP': 158, '4BNRHP': 159, '4ANSHP': 160, '4BNSHP': 161, '3AALAF': 162, '3BALAF': 163, '3ANOPR': 164}\n+def extract_atom_name(raw_atom_name, templates):\n+ # Process Drude particles.\n+ atom_name_prefix = \"\"\n+ if raw_atom_name.startswith(\"Drude-\"):\n+ raw_atom_name = raw_atom_name[len(\"Drude-\"):]\n+ atom_name_prefix = \"D\"\n \n-periodic_improper_types = {('CRN1', 'NRN2', 'NRN2', 'NRC4'): (1, 3.141592653589793, 711.28), ('NRC4', 'NRN2', 'NRN2', 'CRN1'): (1, 3.141592653589793, 711.28), ('NRN2', 'HRM2', 'HRM2', 'CRN1'): (1, 3.141592653589793, 167.36), ('CRN1', 'HRM2', 'HRM2', 'NRN2'): (1, 3.141592653589793, 167.36), ('CRN1', 'NRN2', 'NRC4', 'NRN1'): (1, 3.141592653589793, 711.28), ('NRN1', 'NRC4', 'NRN2', 'CRN1'): (1, 3.141592653589793, 711.28), ('NRN1', 'CR33', 'CRN1', 'HRM1'): (1, 3.141592653589793, 251.04000000000002), ('HRM1', 'CRN1', 'CR33', 'NRN1'): (1, 3.141592653589793, 251.04000000000002), ('CRN1', 'NRC4', 'NRN2', 'NRN1'): (1, 3.141592653589793, 711.28), ('NRN1', 'NRN2', 'NRC4', 'CRN1'): (1, 3.141592653589793, 711.28), ('NRN1', 'CT2', 'CRN1', 'HRM1'): (1, 3.141592653589793, 251.04000000000002), ('HRM1', 'CRN1', 'CT2', 'NRN1'): (1, 3.141592653589793, 251.04000000000002), ('NN2G', 'CN1', 'CN2', 'HN2'): (1, 3.141592653589793, 0.0), ('HN2', 'CN2', 'CN1', 'NN2G'): (1, 3.141592653589793, 0.0)}\n-harmonic_improper_types = {('HE2', 'HE2', 'CE2', 'CE2'): ((12.552, 0.0),), ('CE2', 'CE2', 'HE2', 'HE2'): ((12.552, 0.0),), ('HR1', 'NR1', 'NR2', 'CPH2'): ((2.092, 0.0),), ('CPH2', 'NR2', 'NR1', 'HR1'): ((2.092, 0.0),), ('HR1', 'NR2', 'NR1', 'CPH2'): ((2.092, 0.0),), ('CPH2', 'NR1', 'NR2', 'HR1'): ((2.092, 0.0),), ('HR3', 'CPH1', 'NR1', 'CPH1'): ((2.092, 0.0),), ('CPH1', 'NR1', 'CPH1', 'HR3'): ((2.092, 0.0),), ('HR3', 'CPH1', 'NR2', 'CPH1'): ((2.092, 0.0),), ('CPH1', 'NR2', 'CPH1', 'HR3'): ((2.092, 0.0),), ('HR3', 'CPH1', 'NR3', 'CPH1'): ((4.184, 0.0),), ('CPH1', 'NR3', 'CPH1', 'HR3'): ((4.184, 0.0),), ('HR3', 'NR1', 'CPH1', 'CPH1'): ((2.092, 0.0),), ('CPH1', 'CPH1', 'NR1', 'HR3'): ((2.092, 0.0),), ('HR3', 'NR2', 'CPH1', 'CPH1'): ((2.092, 0.0),), ('CPH1', 'CPH1', 'NR2', 'HR3'): ((2.092, 0.0),), ('N', 'C', 'CP1', 'CP3'): ((0.0, 0.0),), ('CP3', 'CP1', 'C', 'N'): ((0.0, 0.0),), ('NC2', None, None, 'C'): ((188.28, 0.0),), ('C', None, None, 'NC2'): ((188.28, 0.0),), ('C', 'HC', 'HC', 'NC2'): ((0.0, 0.0),), ('NC2', 'HC', 'HC', 'C'): ((0.0, 0.0),), ('NC2', None, None, 'HC'): ((-8.368, 0.0),), ('HC', None, None, 'NC2'): ((-8.368, 0.0),), ('NH1', None, None, 'H'): ((83.68, 0.0),), ('H', None, None, 'NH1'): ((83.68, 0.0),), ('NH2', None, None, 'H'): ((16.736, 0.0),), ('H', None, None, 'NH2'): ((16.736, 0.0),), ('NR1', 'CPH1', 'CPH2', 'H'): ((1.8828, 0.0),), ('H', 'CPH2', 'CPH1', 'NR1'): ((1.8828, 0.0),), ('NR1', 'CPH2', 'CPH1', 'H'): ((1.8828, 0.0),), ('H', 'CPH1', 'CPH2', 'NR1'): ((1.8828, 0.0),), ('NR3', 'CPH1', 'CPH2', 'H'): ((5.0208, 0.0),), ('H', 'CPH2', 'CPH1', 'NR3'): ((5.0208, 0.0),), ('NR3', 'CPH2', 'CPH1', 'H'): ((5.0208, 0.0),), ('H', 'CPH1', 'CPH2', 'NR3'): ((5.0208, 0.0),), ('O', 'CP1', 'NH2', 'CC'): ((188.28, 0.0),), ('CC', 'NH2', 'CP1', 'O'): ((188.28, 0.0),), ('O', 'CT1', 'NH2', 'CC'): ((188.28, 0.0),), ('CC', 'NH2', 'CT1', 'O'): ((188.28, 0.0),), ('O', 'CT2', 'NH2', 'CC'): ((188.28, 0.0),), ('CC', 'NH2', 'CT2', 'O'): ((188.28, 0.0),), ('O', 'CT3', 'NH2', 'CC'): ((188.28, 0.0),), ('CC', 'NH2', 'CT3', 'O'): ((188.28, 0.0),), ('O', 'HA1', 'NH2', 'CC'): ((188.28, 0.0),), ('CC', 'NH2', 'HA1', 'O'): ((188.28, 0.0),), ('O', 'N', 'CT2', 'CC'): ((502.08000000000004, 0.0),), ('CC', 'CT2', 'N', 'O'): ((502.08000000000004, 0.0),), ('O', 'NH2', 'CP1', 'CC'): ((188.28, 0.0),), ('CC', 'CP1', 'NH2', 'O'): ((188.28, 0.0),), ('O', 'NH2', 'CT1', 'CC'): ((188.28, 0.0),), ('CC', 'CT1', 'NH2', 'O'): ((188.28, 0.0),), ('O', 'NH2', 'CT2', 'CC'): ((188.28, 0.0),), ('CC', 'CT2', 'NH2', 'O'): ((188.28, 0.0),), ('O', 'NH2', 'CT3', 'CC'): ((188.28, 0.0),), ('CC', 'CT3', 'NH2', 'O'): ((188.28, 0.0),), ('O', 'NH2', 'HA1', 'CC'): ((188.28, 0.0),), ('CC', 'HA1', 'NH2', 'O'): ((188.28, 0.0),), ('O', None, None, 'C'): ((502.08000000000004, 0.0),), ('C', None, None, 'O'): ((502.08000000000004, 0.0),), ('OB', None, None, 'CD'): ((418.40000000000003, 0.0),), ('CD', None, None, 'OB'): ((418.40000000000003, 0.0),), ('OC', None, None, 'CC'): ((401.664, 0.0),), ('CC', None, None, 'OC'): ((401.664, 0.0),), ('CC', None, None, 'CT1'): ((401.664, 0.0),), ('CT1', None, None, 'CC'): ((401.664, 0.0),), ('CC', None, None, 'CT2'): ((401.664, 0.0),), ('CT2', None, None, 'CC'): ((401.664, 0.0),), ('CC', None, None, 'CT3'): ((401.664, 0.0),), ('CT3', None, None, 'CC'): ((401.664, 0.0),), ('HN2', None, None, 'NN2'): ((4.184, 0.0),), ('NN2', None, None, 'HN2'): ((4.184, 0.0),), ('NN2B', 'CN4', 'CN5', 'HN2'): ((29.288, 0.0),), ('HN2', 'CN5', 'CN4', 'NN2B'): ((29.288, 0.0),), ('HN1', None, None, 'NN1'): ((16.736, 0.0),), ('NN1', None, None, 'HN1'): ((16.736, 0.0),), ('NN1', 'CN2', 'HN1', 'HN1'): ((25.104, 0.0),), ('HN1', 'HN1', 'CN2', 'NN1'): ((25.104, 0.0),), ('CN1', None, None, 'ON1'): ((376.56, 0.0),), ('ON1', None, None, 'CN1'): ((376.56, 0.0),), ('CN1T', None, None, 'ON1'): ((376.56, 0.0),), ('ON1', None, None, 'CN1T'): ((376.56, 0.0),), ('CN1', 'NN2G', 'CN5G', 'ON1'): ((376.56, 0.0),), ('ON1', 'CN5G', 'NN2G', 'CN1'): ((376.56, 0.0),), ('CN1T', 'NN2B', 'NN2U', 'ON1'): ((460.24, 0.0),), ('ON1', 'NN2U', 'NN2B', 'CN1T'): ((460.24, 0.0),), ('CN1', 'NN2U', 'CN3T', 'ON1'): ((376.56, 0.0),), ('ON1', 'CN3T', 'NN2U', 'CN1'): ((376.56, 0.0),), ('CN1', None, None, 'ON1C'): ((334.72, 0.0),), ('ON1C', None, None, 'CN1'): ((334.72, 0.0),), ('CN2', None, None, 'NN1'): ((376.56, 0.0),), ('NN1', None, None, 'CN2'): ((376.56, 0.0),), ('CN2', 'NN3G', 'NN2G', 'NN1'): ((167.36, 0.0),), ('NN1', 'NN2G', 'NN3G', 'CN2'): ((167.36, 0.0),), ('CN2', 'NN3A', 'CN5', 'NN1'): ((167.36, 0.0),), ('NN1', 'CN5', 'NN3A', 'CN2'): ((167.36, 0.0),), ('CN2', 'NN3', 'CN3', 'NN1'): ((251.04000000000002, 0.0),), ('NN1', 'CN3', 'NN3', 'CN2'): ((251.04000000000002, 0.0),), ('CN9', None, None, 'CN3T'): ((58.576, 0.0),), ('CN3T', None, None, 'CN9'): ((58.576, 0.0),), ('CC2O1', 'CC331', 'NC2D1', 'OC2D1'): ((502.08000000000004, 0.0),), ('OC2D1', 'NC2D1', 'CC331', 'CC2O1'): ((502.08000000000004, 0.0),), ('NC2D1', 'CC2O1', 'CC3161', 'HCP1'): ((83.68, 0.0),), ('HCP1', 'CC3161', 'CC2O1', 'NC2D1'): ((83.68, 0.0),), ('NC2D1', 'CC2O1', 'CC3062', 'HCP1'): ((83.68, 0.0),), ('HCP1', 'CC3062', 'CC2O1', 'NC2D1'): ((83.68, 0.0),), ('CC2O2', 'CC311', 'OC2D2', 'OC2D2'): ((401.664, 0.0),), ('OC2D2', 'OC2D2', 'CC311', 'CC2O2'): ((401.664, 0.0),), ('CC2O2', 'CC301', 'OC2D2', 'OC2D2'): ((401.664, 0.0),), ('OC2D2', 'OC2D2', 'CC301', 'CC2O2'): ((401.664, 0.0),), ('CC2O2', 'CC3163', 'OC2D2', 'OC2D2'): ((401.664, 0.0),), ('OC2D2', 'OC2D2', 'CC3163', 'CC2O2'): ((401.664, 0.0),), ('CC2O2', 'CC3062', 'OC2D2', 'OC2D2'): ((401.664, 0.0),), ('OC2D2', 'OC2D2', 'CC3062', 'CC2O2'): ((401.664, 0.0),), ('CC2O2', 'CC321', 'OC2D2', 'OC2D2'): ((401.664, 0.0),), ('OC2D2', 'OC2D2', 'CC321', 'CC2O2'): ((401.664, 0.0),), ('NC2D1', 'CC2O1', 'CC331', 'HCP1'): ((83.68, 0.0),), ('HCP1', 'CC331', 'CC2O1', 'NC2D1'): ((83.68, 0.0),), ('NC2D1', 'CC2O1', 'CC311', 'HCP1'): ((83.68, 0.0),), ('HCP1', 'CC311', 'CC2O1', 'NC2D1'): ((83.68, 0.0),), ('CC2O4', 'CC331', 'OC2D4', 'HCR1'): ((209.20000000000002, 0.0),), ('HCR1', 'OC2D4', 'CC331', 'CC2O4'): ((209.20000000000002, 0.0),), ('CC2O4', 'CC312', 'OC2D4', 'HCR1'): ((209.20000000000002, 0.0),), ('HCR1', 'OC2D4', 'CC312', 'CC2O4'): ((209.20000000000002, 0.0),), ('OC2D3', 'CC331', 'CC331', 'CC2O3'): ((292.88, 0.0),), ('CC2O3', 'CC331', 'CC331', 'OC2D3'): ((292.88, 0.0),), ('OC2D3', 'CC312', 'CC322', 'CC2O3'): ((292.88, 0.0),), ('CC2O3', 'CC322', 'CC312', 'OC2D3'): ((292.88, 0.0),), ('OBL', None, None, 'CL'): ((418.40000000000003, 0.0),), ('CL', None, None, 'OBL'): ((418.40000000000003, 0.0),), ('HEL2', 'HEL2', 'CEL2', 'CEL2'): ((12.552, 0.0),), ('CEL2', 'CEL2', 'HEL2', 'HEL2'): ((12.552, 0.0),), ('OCL', None, None, 'CL'): ((401.664, 0.0),), ('CL', None, None, 'OCL'): ((401.664, 0.0),), ('OCL', None, None, 'CCL'): ((401.664, 0.0),), ('CCL', None, None, 'OCL'): ((401.664, 0.0),), ('CG2D1', 'CG331', 'NG2D1', 'HGA4'): ((104.60000000000001, 0.0),), ('HGA4', 'NG2D1', 'CG331', 'CG2D1'): ((104.60000000000001, 0.0),), ('CG2D1', 'CG331', 'NG2P1', 'HGR52'): ((75.312, 0.0),), ('HGR52', 'NG2P1', 'CG331', 'CG2D1'): ((75.312, 0.0),), ('CG2D1O', 'CG2DC1', 'CG2O1', 'NG2S1'): ((118.41766, 0.0),), ('NG2S1', 'CG2O1', 'CG2DC1', 'CG2D1O'): ((118.41766, 0.0),), ('CG2D1O', 'CG331', 'NG2D1', 'SG311'): ((78.66966, 0.0),), ('SG311', 'NG2D1', 'CG331', 'CG2D1O'): ((78.66966, 0.0),), ('CG2D1O', 'CG2D1', 'NG301', 'HGA4'): ((221.752, 0.0),), ('HGA4', 'NG301', 'CG2D1', 'CG2D1O'): ((221.752, 0.0),), ('CG2D1O', 'CG2D1', 'NG311', 'HGA4'): ((221.752, 0.0),), ('HGA4', 'NG311', 'CG2D1', 'CG2D1O'): ((221.752, 0.0),), ('CG2D1O', 'CG2D2', 'NG321', 'HGA4'): ((221.752, 0.0),), ('HGA4', 'NG321', 'CG2D2', 'CG2D1O'): ((221.752, 0.0),), ('CG2D1O', 'CG2D2', 'OG301', 'HGA4'): ((96.232, 0.0),), ('HGA4', 'OG301', 'CG2D2', 'CG2D1O'): ((96.232, 0.0),), ('CG2D1O', 'CG2DC1', 'NG2D1', 'HGA4'): ((125.52000000000001, 0.0),), ('HGA4', 'NG2D1', 'CG2DC1', 'CG2D1O'): ((125.52000000000001, 0.0),), ('CG2D1O', 'CG2DC1', 'NG301', 'HGA4'): ((221.752, 0.0),), ('HGA4', 'NG301', 'CG2DC1', 'CG2D1O'): ((221.752, 0.0),), ('CG2D1O', 'CG2DC1', 'NG311', 'HGA4'): ((221.752, 0.0),), ('HGA4', 'NG311', 'CG2DC1', 'CG2D1O'): ((221.752, 0.0),), ('CG2D1O', 'CG2DC1', 'OG301', 'HGA4'): ((41.84, 0.0),), ('HGA4', 'OG301', 'CG2DC1', 'CG2D1O'): ((41.84, 0.0),), ('CG2D2O', 'CG2D1', 'NG301', 'HGA4'): ((221.752, 0.0),), ('HGA4', 'NG301', 'CG2D1', 'CG2D2O'): ((221.752, 0.0),), ('CG2D2O', 'CG2D1', 'NG311', 'HGA4'): ((221.752, 0.0),), ('HGA4', 'NG311', 'CG2D1', 'CG2D2O'): ((221.752, 0.0),), ('CG2D2O', 'CG2D2', 'NG321', 'HGA4'): ((221.752, 0.0),), ('HGA4', 'NG321', 'CG2D2', 'CG2D2O'): ((221.752, 0.0),), ('CG2D2O', 'CG2D2', 'OG301', 'HGA4'): ((96.232, 0.0),), ('HGA4', 'OG301', 'CG2D2', 'CG2D2O'): ((96.232, 0.0),), ('CG2D2O', 'CG2DC2', 'NG301', 'HGA4'): ((221.752, 0.0),), ('HGA4', 'NG301', 'CG2DC2', 'CG2D2O'): ((221.752, 0.0),), ('CG2D2O', 'CG2DC2', 'NG311', 'HGA4'): ((221.752, 0.0),), ('HGA4', 'NG311', 'CG2DC2', 'CG2D2O'): ((221.752, 0.0),), ('CG2D2O', 'CG2DC2', 'OG301', 'HGA4'): ((41.84, 0.0),), ('HGA4', 'OG301', 'CG2DC2', 'CG2D2O'): ((41.84, 0.0),), ('CG2DC1', 'CG2O3', 'CG331', 'NG2D1'): ((66.81806160000001, 0.0),), ('NG2D1', 'CG331', 'CG2O3', 'CG2DC1'): ((66.81806160000001, 0.0),), ('CG2DC1', 'CG2R53', 'CG321', 'NG2D1'): ((269.070948, 0.0),), ('NG2D1', 'CG321', 'CG2R53', 'CG2DC1'): ((269.070948, 0.0),), ('CG2DC1', 'CG2R53', 'CG331', 'NG2D1'): ((269.070948, 0.0),), ('NG2D1', 'CG331', 'CG2R53', 'CG2DC1'): ((269.070948, 0.0),), ('CG2DC1', 'CG321', 'CG331', 'NG2D1'): ((502.1138904, 0.0),), ('NG2D1', 'CG331', 'CG321', 'CG2DC1'): ((502.1138904, 0.0),), ('CG2DC1', 'CG331', 'CG331', 'NG2D1'): ((502.1138904, 0.0),), ('NG2D1', 'CG331', 'CG331', 'CG2DC1'): ((502.1138904, 0.0),), ('CG2DC1', 'CG2R61', 'NG2D1', 'HGA4'): ((125.52000000000001, 0.0),), ('HGA4', 'NG2D1', 'CG2R61', 'CG2DC1'): ((125.52000000000001, 0.0),), ('CG2DC1', 'CG2DC2', 'NG2P1', 'HGR52'): ((54.392, 0.0),), ('HGR52', 'NG2P1', 'CG2DC2', 'CG2DC1'): ((54.392, 0.0),), ('CG2DC2', 'CG2DC1', 'CG2O5', 'NG2D1'): ((4.184, 0.0),), ('NG2D1', 'CG2O5', 'CG2DC1', 'CG2DC2'): ((4.184, 0.0),), ('CG2DC2', 'CG2R61', 'NG2D1', 'HGA4'): ((125.52000000000001, 0.0),), ('HGA4', 'NG2D1', 'CG2R61', 'CG2DC2'): ((125.52000000000001, 0.0),), ('CG2DC2', 'CG2DC1', 'NG2P1', 'HGR52'): ((54.392, 0.0),), ('HGR52', 'NG2P1', 'CG2DC1', 'CG2DC2'): ((54.392, 0.0),), ('CG2N1', 'NG321', 'NG321', 'NG2D1'): ((355.64, 0.0),), ('NG2D1', 'NG321', 'NG321', 'CG2N1'): ((355.64, 0.0),), ('CG2N1', 'NG2P1', 'NG2P1', 'NG2P1'): ((167.36, 0.0),), ('NG2P1', 'NG2P1', 'NG2P1', 'CG2N1'): ((167.36, 0.0),), ('CG2N1', 'NG2D1', 'NG311', 'NG321'): ((355.64, 0.0),), ('NG321', 'NG311', 'NG2D1', 'CG2N1'): ((355.64, 0.0),), ('CG2N2', 'NG2P1', 'NG2P1', 'CG2R51'): ((108.784, 0.0),), ('CG2R51', 'NG2P1', 'NG2P1', 'CG2N2'): ((108.784, 0.0),), ('CG2N2', 'NG2P1', 'NG2P1', 'CG2R61'): ((125.52000000000001, 0.0),), ('CG2R61', 'NG2P1', 'NG2P1', 'CG2N2'): ((125.52000000000001, 0.0),), ('CG2N2', 'NG2P1', 'NG2P1', 'CG331'): ((125.52000000000001, 0.0),), ('CG331', 'NG2P1', 'NG2P1', 'CG2N2'): ((125.52000000000001, 0.0),), ('CG2N2', 'NG2D1', 'NG2D1', 'SG311'): ((125.52000000000001, 0.0),), ('SG311', 'NG2D1', 'NG2D1', 'CG2N2'): ((125.52000000000001, 0.0),), ('CG2N2', 'NG2D1', 'NG321', 'SG311'): ((133.888, 0.0),), ('SG311', 'NG321', 'NG2D1', 'CG2N2'): ((133.888, 0.0),), ('CG2O1', 'CG2D1O', 'NG2S1', 'OG2D1'): ((502.08000000000004, 0.0),), ('OG2D1', 'NG2S1', 'CG2D1O', 'CG2O1'): ((502.08000000000004, 0.0),), ('CG2O1', 'CG2DC1', 'NG2D1', 'OG2D1'): ((502.08000000000004, 0.0),), ('OG2D1', 'NG2D1', 'CG2DC1', 'CG2O1'): ((502.08000000000004, 0.0),), ('CG2O1', 'CG2DC1', 'NG2S1', 'OG2D1'): ((502.08000000000004, 0.0),), ('OG2D1', 'NG2S1', 'CG2DC1', 'CG2O1'): ((502.08000000000004, 0.0),), ('CG2O1', 'CG2DC1', 'NG2S2', 'OG2D1'): ((502.08000000000004, 0.0),), ('OG2D1', 'NG2S2', 'CG2DC1', 'CG2O1'): ((502.08000000000004, 0.0),), ('CG2O1', 'CG2DC2', 'NG2S1', 'OG2D1'): ((502.08000000000004, 0.0),), ('OG2D1', 'NG2S1', 'CG2DC2', 'CG2O1'): ((502.08000000000004, 0.0),), ('CG2O1', 'CG2DC2', 'NG2S2', 'OG2D1'): ((502.08000000000004, 0.0),), ('OG2D1', 'NG2S2', 'CG2DC2', 'CG2O1'): ((502.08000000000004, 0.0),), ('CG2O1', 'CG2R51', 'NG2S1', 'OG2D1'): ((292.88, 0.0),), ('OG2D1', 'NG2S1', 'CG2R51', 'CG2O1'): ((292.88, 0.0),), ('CG2O1', 'CG2R61', 'NG2D1', 'OG2D1'): ((502.08000000000004, 0.0),), ('OG2D1', 'NG2D1', 'CG2R61', 'CG2O1'): ((502.08000000000004, 0.0),), ('CG2O1', 'CG2R61', 'NG2S1', 'OG2D1'): ((502.08000000000004, 0.0),), ('OG2D1', 'NG2S1', 'CG2R61', 'CG2O1'): ((502.08000000000004, 0.0),), ('CG2O1', 'CG2R61', 'NG2S2', 'OG2D1'): ((502.08000000000004, 0.0),), ('OG2D1', 'NG2S2', 'CG2R61', 'CG2O1'): ((502.08000000000004, 0.0),), ('CG2O1', 'CG2R62', 'NG2S2', 'OG2D1'): ((502.08000000000004, 0.0),), ('OG2D1', 'NG2S2', 'CG2R62', 'CG2O1'): ((502.08000000000004, 0.0),), ('CG2O1', 'CG311', 'NG2D1', 'OG2D1'): ((184.10436800000002, 0.0),), ('OG2D1', 'NG2D1', 'CG311', 'CG2O1'): ((184.10436800000002, 0.0),), ('CG2O1', 'CG311', 'NG2S0', 'OG2D1'): ((502.08000000000004, 0.0),), ('OG2D1', 'NG2S0', 'CG311', 'CG2O1'): ((502.08000000000004, 0.0),), ('CG2O1', 'CG311', 'NG2S1', 'OG2D1'): ((502.08000000000004, 0.0),), ('OG2D1', 'NG2S1', 'CG311', 'CG2O1'): ((502.08000000000004, 0.0),), ('CG2O1', 'CG311', 'NG2S2', 'OG2D1'): ((502.08000000000004, 0.0),), ('OG2D1', 'NG2S2', 'CG311', 'CG2O1'): ((502.08000000000004, 0.0),), ('CG2O1', 'CG311', 'NG311', 'OG2D1'): ((502.08000000000004, 0.0),), ('OG2D1', 'NG311', 'CG311', 'CG2O1'): ((502.08000000000004, 0.0),), ('CG2O1', 'CG314', 'NG2S2', 'OG2D1'): ((502.08000000000004, 0.0),), ('OG2D1', 'NG2S2', 'CG314', 'CG2O1'): ((502.08000000000004, 0.0),), ('CG2O1', 'CG321', 'NG2S0', 'OG2D1'): ((502.08000000000004, 0.0),), ('OG2D1', 'NG2S0', 'CG321', 'CG2O1'): ((502.08000000000004, 0.0),), ('CG2O1', 'CG321', 'NG2S1', 'OG2D1'): ((502.08000000000004, 0.0),), ('OG2D1', 'NG2S1', 'CG321', 'CG2O1'): ((502.08000000000004, 0.0),), ('CG2O1', 'CG321', 'NG2S2', 'OG2D1'): ((502.08000000000004, 0.0),), ('OG2D1', 'NG2S2', 'CG321', 'CG2O1'): ((502.08000000000004, 0.0),), ('CG2O1', 'CG331', 'NG2D1', 'OG2D1'): ((237.0223448, 0.0),), ('OG2D1', 'NG2D1', 'CG331', 'CG2O1'): ((237.0223448, 0.0),), ('CG2O1', 'CG331', 'NG2S0', 'OG2D1'): ((297.064, 0.0),), ('OG2D1', 'NG2S0', 'CG331', 'CG2O1'): ((297.064, 0.0),), ('CG2O1', 'CG331', 'NG2S1', 'OG2D1'): ((502.08000000000004, 0.0),), ('OG2D1', 'NG2S1', 'CG331', 'CG2O1'): ((502.08000000000004, 0.0),), ('CG2O1', 'CG331', 'NG2S2', 'OG2D1'): ((502.08000000000004, 0.0),), ('OG2D1', 'NG2S2', 'CG331', 'CG2O1'): ((502.08000000000004, 0.0),), ('CG2O1', 'CG3C50', 'NG2S1', 'OG2D1'): ((502.08000000000004, 0.0),), ('OG2D1', 'NG2S1', 'CG3C50', 'CG2O1'): ((502.08000000000004, 0.0),), ('CG2O1', 'CG3C51', 'NG2S0', 'OG2D1'): ((502.08000000000004, 0.0),), ('OG2D1', 'NG2S0', 'CG3C51', 'CG2O1'): ((502.08000000000004, 0.0),), ('CG2O1', 'CG3C51', 'NG2S1', 'OG2D1'): ((502.08000000000004, 0.0),), ('OG2D1', 'NG2S1', 'CG3C51', 'CG2O1'): ((502.08000000000004, 0.0),), ('CG2O1', 'CG3C51', 'NG2S2', 'OG2D1'): ((502.08000000000004, 0.0),), ('OG2D1', 'NG2S2', 'CG3C51', 'CG2O1'): ((502.08000000000004, 0.0),), ('CG2O1', 'CG3C53', 'NG2S0', 'OG2D1'): ((502.08000000000004, 0.0),), ('OG2D1', 'NG2S0', 'CG3C53', 'CG2O1'): ((502.08000000000004, 0.0),), ('CG2O1', 'CG3C53', 'NG2S1', 'OG2D1'): ((502.08000000000004, 0.0),), ('OG2D1', 'NG2S1', 'CG3C53', 'CG2O1'): ((502.08000000000004, 0.0),), ('CG2O1', 'CG3C53', 'NG2S2', 'OG2D1'): ((502.08000000000004, 0.0),), ('OG2D1', 'NG2S2', 'CG3C53', 'CG2O1'): ((502.08000000000004, 0.0),), ('CG2O1', 'CG321', 'NG2S1', 'SG2D1'): ((277.7330832, 0.0),), ('SG2D1', 'NG2S1', 'CG321', 'CG2O1'): ((277.7330832, 0.0),), ('CG2O1', 'NG2S0', 'OG2D1', 'HGR52'): ((209.20000000000002, 0.0),), ('HGR52', 'OG2D1', 'NG2S0', 'CG2O1'): ((209.20000000000002, 0.0),), ('CG2O1', 'NG2S1', 'OG2D1', 'HGR52'): ((276.144, 0.0),), ('HGR52', 'OG2D1', 'NG2S1', 'CG2O1'): ((276.144, 0.0),), ('CG2O1', 'NG2S2', 'OG2D1', 'HGR52'): ((276.144, 0.0),), ('HGR52', 'OG2D1', 'NG2S2', 'CG2O1'): ((276.144, 0.0),), ('CG2O2', 'CG2R61', 'OG2D1', 'OG302'): ((301.248, 0.0),), ('OG302', 'OG2D1', 'CG2R61', 'CG2O2'): ((301.248, 0.0),), ('CG2O2', 'CG311', 'OG2D1', 'OG302'): ((259.408, 0.0),), ('OG302', 'OG2D1', 'CG311', 'CG2O2'): ((259.408, 0.0),), ('CG2O2', 'CG321', 'OG2D1', 'OG302'): ((259.408, 0.0),), ('OG302', 'OG2D1', 'CG321', 'CG2O2'): ((259.408, 0.0),), ('CG2O2', 'CG331', 'OG2D1', 'OG302'): ((259.408, 0.0),), ('OG302', 'OG2D1', 'CG331', 'CG2O2'): ((259.408, 0.0),), ('CG2O2', 'CG321', 'OG2D1', 'OG303'): ((259.408, 0.0),), ('OG303', 'OG2D1', 'CG321', 'CG2O2'): ((259.408, 0.0),), ('CG2O2', 'CG2DC1', 'OG2D1', 'OG311'): ((225.8744952, 0.0),), ('OG311', 'OG2D1', 'CG2DC1', 'CG2O2'): ((225.8744952, 0.0),), ('CG2O2', 'CG2R61', 'OG2D1', 'OG311'): ((221.752, 0.0),), ('OG311', 'OG2D1', 'CG2R61', 'CG2O2'): ((221.752, 0.0),), ('CG2O2', 'CG311', 'OG2D1', 'OG311'): ((271.96000000000004, 0.0),), ('OG311', 'OG2D1', 'CG311', 'CG2O2'): ((271.96000000000004, 0.0),), ('CG2O2', 'CG321', 'OG2D1', 'OG311'): ((271.96000000000004, 0.0),), ('OG311', 'OG2D1', 'CG321', 'CG2O2'): ((271.96000000000004, 0.0),), ('CG2O2', 'CG331', 'OG2D1', 'OG311'): ((271.96000000000004, 0.0),), ('OG311', 'OG2D1', 'CG331', 'CG2O2'): ((271.96000000000004, 0.0),), ('CG2O2', 'CG2R61', 'OG2D1', 'SG311'): ((258.9444128, 0.0),), ('SG311', 'OG2D1', 'CG2R61', 'CG2O2'): ((258.9444128, 0.0),), ('CG2O2', 'CG321', 'OG2D1', 'SG311'): ((277.3745144, 0.0),), ('SG311', 'OG2D1', 'CG321', 'CG2O2'): ((277.3745144, 0.0),), ('CG2O2', 'CG331', 'OG2D1', 'SG311'): ((204.02899440000002, 0.0),), ('SG311', 'OG2D1', 'CG331', 'CG2O2'): ((204.02899440000002, 0.0),), ('CG2O2', 'OG2D1', 'OG311', 'HGR52'): ((313.8, 0.0),), ('HGR52', 'OG311', 'OG2D1', 'CG2O2'): ((313.8, 0.0),), ('CG2O3', 'OG2D2', 'OG2D2', 'CG2DC1'): ((401.664, 0.0),), ('CG2DC1', 'OG2D2', 'OG2D2', 'CG2O3'): ((401.664, 0.0),), ('CG2O3', 'OG2D2', 'OG2D2', 'CG2DC2'): ((401.664, 0.0),), ('CG2DC2', 'OG2D2', 'OG2D2', 'CG2O3'): ((401.664, 0.0),), ('CG2O3', 'OG2D2', 'OG2D2', 'CG2O5'): ((401.664, 0.0),), ('CG2O5', 'OG2D2', 'OG2D2', 'CG2O3'): ((401.664, 0.0),), ('CG2O3', 'OG2D2', 'OG2D2', 'CG2R61'): ((401.664, 0.0),), ('CG2R61', 'OG2D2', 'OG2D2', 'CG2O3'): ((401.664, 0.0),), ('CG2O3', 'OG2D2', 'OG2D2', 'CG301'): ((401.664, 0.0),), ('CG301', 'OG2D2', 'OG2D2', 'CG2O3'): ((401.664, 0.0),), ('CG2O3', 'OG2D2', 'OG2D2', 'CG311'): ((401.664, 0.0),), ('CG311', 'OG2D2', 'OG2D2', 'CG2O3'): ((401.664, 0.0),), ('CG2O3', 'OG2D2', 'OG2D2', 'CG314'): ((401.664, 0.0),), ('CG314', 'OG2D2', 'OG2D2', 'CG2O3'): ((401.664, 0.0),), ('CG2O3', 'OG2D2', 'OG2D2', 'CG321'): ((401.664, 0.0),), ('CG321', 'OG2D2', 'OG2D2', 'CG2O3'): ((401.664, 0.0),), ('CG2O3', 'OG2D2', 'OG2D2', 'CG322'): ((401.664, 0.0),), ('CG322', 'OG2D2', 'OG2D2', 'CG2O3'): ((401.664, 0.0),), ('CG2O3', 'OG2D2', 'OG2D2', 'CG324'): ((401.664, 0.0),), ('CG324', 'OG2D2', 'OG2D2', 'CG2O3'): ((401.664, 0.0),), ('CG2O3', 'OG2D2', 'OG2D2', 'CG331'): ((401.664, 0.0),), ('CG331', 'OG2D2', 'OG2D2', 'CG2O3'): ((401.664, 0.0),), ('CG2O3', 'OG2D2', 'OG2D2', 'NG2S1'): ((230.5145512, 0.0),), ('NG2S1', 'OG2D2', 'OG2D2', 'CG2O3'): ((230.5145512, 0.0),), ('CG2O3', 'OG2D2', 'OG2D2', 'HGR52'): ((280.32800000000003, 0.0),), ('HGR52', 'OG2D2', 'OG2D2', 'CG2O3'): ((280.32800000000003, 0.0),), ('CG2O4', 'CG3C41', 'CG3C41', 'OG2D3'): ((83.68, 0.0),), ('OG2D3', 'CG3C41', 'CG3C41', 'CG2O4'): ((83.68, 0.0),), ('CG2O4', 'CG3C41', 'OG2D1', 'OG3C51'): ((251.04000000000002, 0.0),), ('OG3C51', 'OG2D1', 'CG3C41', 'CG2O4'): ((251.04000000000002, 0.0),), ('CG2O4', 'CG2DC1', 'OG2D1', 'HGR52'): ((58.576, 0.0),), ('HGR52', 'OG2D1', 'CG2DC1', 'CG2O4'): ((58.576, 0.0),), ('CG2O4', 'CG2DC2', 'OG2D1', 'HGR52'): ((58.576, 0.0),), ('HGR52', 'OG2D1', 'CG2DC2', 'CG2O4'): ((58.576, 0.0),), ('CG2O4', 'CG2R61', 'OG2D1', 'HGR52'): ((221.752, 0.0),), ('HGR52', 'OG2D1', 'CG2R61', 'CG2O4'): ((221.752, 0.0),), ('CG2O4', 'CG2R62', 'OG2D1', 'HGR52'): ((221.752, 0.0),), ('HGR52', 'OG2D1', 'CG2R62', 'CG2O4'): ((221.752, 0.0),), ('CG2O4', 'CG311', 'OG2D1', 'HGR52'): ((209.20000000000002, 0.0),), ('HGR52', 'OG2D1', 'CG311', 'CG2O4'): ((209.20000000000002, 0.0),), ('CG2O4', 'CG321', 'OG2D1', 'HGR52'): ((209.20000000000002, 0.0),), ('HGR52', 'OG2D1', 'CG321', 'CG2O4'): ((209.20000000000002, 0.0),), ('CG2O4', 'CG331', 'OG2D1', 'HGR52'): ((209.20000000000002, 0.0),), ('HGR52', 'OG2D1', 'CG331', 'CG2O4'): ((209.20000000000002, 0.0),), ('CG2O5', 'CG2D1O', 'CG2DC1', 'OG2D3'): ((207.1803832, 0.0),), ('OG2D3', 'CG2DC1', 'CG2D1O', 'CG2O5'): ((207.1803832, 0.0),), ('CG2O5', 'CG2DC1', 'CG2DC1', 'OG2D3'): ((170.93606480000003, 0.0),), ('OG2D3', 'CG2DC1', 'CG2DC1', 'CG2O5'): ((170.93606480000003, 0.0),), ('CG2O5', 'CG2DC1', 'CG2O5', 'OG2D3'): ((301.248, 0.0),), ('OG2D3', 'CG2O5', 'CG2DC1', 'CG2O5'): ((301.248, 0.0),), ('CG2O5', 'CG2DC1', 'CG331', 'OG2D3'): ((368.192, 0.0),), ('OG2D3', 'CG331', 'CG2DC1', 'CG2O5'): ((368.192, 0.0),), ('CG2O5', 'CG2DC2', 'CG2DC2', 'OG2D3'): ((365.5426912, 0.0),), ('OG2D3', 'CG2DC2', 'CG2DC2', 'CG2O5'): ((365.5426912, 0.0),), ('CG2O5', 'CG2DC2', 'CG2R51', 'OG2D3'): ((287.3115144, 0.0),), ('OG2D3', 'CG2R51', 'CG2DC2', 'CG2O5'): ((287.3115144, 0.0),), ('CG2O5', 'CG2DC2', 'CG331', 'OG2D3'): ((368.192, 0.0),), ('OG2D3', 'CG331', 'CG2DC2', 'CG2O5'): ((368.192, 0.0),), ('CG2O5', 'CG2O3', 'CG2R61', 'OG2D3'): ((301.248, 0.0),), ('OG2D3', 'CG2R61', 'CG2O3', 'CG2O5'): ((301.248, 0.0),), ('CG2O5', 'CG2O3', 'CG321', 'OG2D3'): ((368.192, 0.0),), ('OG2D3', 'CG321', 'CG2O3', 'CG2O5'): ((368.192, 0.0),), ('CG2O5', 'CG2O5', 'CG2R51', 'OG2D3'): ((301.248, 0.0),), ('OG2D3', 'CG2R51', 'CG2O5', 'CG2O5'): ((301.248, 0.0),), ('CG2O5', 'CG2R61', 'CG2R61', 'OG2D3'): ((389.27726800000005, 0.0),), ('OG2D3', 'CG2R61', 'CG2R61', 'CG2O5'): ((389.27726800000005, 0.0),), ('CG2O5', 'CG2R61', 'CG311', 'OG2D3'): ((301.248, 0.0),), ('OG2D3', 'CG311', 'CG2R61', 'CG2O5'): ((301.248, 0.0),), ('CG2O5', 'CG2R61', 'CG321', 'OG2D3'): ((301.248, 0.0),), ('OG2D3', 'CG321', 'CG2R61', 'CG2O5'): ((301.248, 0.0),), ('CG2O5', 'CG2R61', 'CG331', 'OG2D3'): ((251.04000000000002, 0.0),), ('OG2D3', 'CG331', 'CG2R61', 'CG2O5'): ((251.04000000000002, 0.0),), ('CG2O5', 'CG321', 'CG321', 'OG2D3'): ((292.88, 0.0),), ('OG2D3', 'CG321', 'CG321', 'CG2O5'): ((292.88, 0.0),), ('CG2O5', 'CG321', 'CG331', 'OG2D3'): ((292.88, 0.0),), ('OG2D3', 'CG331', 'CG321', 'CG2O5'): ((292.88, 0.0),), ('CG2O5', 'CG331', 'CG331', 'OG2D3'): ((292.88, 0.0),), ('OG2D3', 'CG331', 'CG331', 'CG2O5'): ((292.88, 0.0),), ('CG2O6', 'NG2D1', 'NG2S1', 'OG2D1'): ((410.03200000000004, 0.0),), ('OG2D1', 'NG2S1', 'NG2D1', 'CG2O6'): ((410.03200000000004, 0.0),), ('CG2O6', 'NG2R51', 'NG2S1', 'OG2D1'): ((251.04000000000002, 0.0),), ('OG2D1', 'NG2S1', 'NG2R51', 'CG2O6'): ((251.04000000000002, 0.0),), ('CG2O6', 'NG2S0', 'NG2S1', 'OG2D1'): ((361.916, 0.0),), ('OG2D1', 'NG2S1', 'NG2S0', 'CG2O6'): ((361.916, 0.0),), ('CG2O6', 'NG2S1', 'NG2S1', 'OG2D1'): ((334.72, 0.0),), ('OG2D1', 'NG2S1', 'NG2S1', 'CG2O6'): ((334.72, 0.0),), ('CG2O6', 'NG2S1', 'NG2S2', 'OG2D1'): ((334.72, 0.0),), ('OG2D1', 'NG2S2', 'NG2S1', 'CG2O6'): ((334.72, 0.0),), ('CG2O6', 'NG2S2', 'NG2S2', 'OG2D1'): ((334.72, 0.0),), ('OG2D1', 'NG2S2', 'NG2S2', 'CG2O6'): ((334.72, 0.0),), ('CG2O6', 'OG302', 'OG302', 'OG2D1'): ((606.6800000000001, 0.0),), ('OG2D1', 'OG302', 'OG302', 'CG2O6'): ((606.6800000000001, 0.0),), ('CG2O6', 'OG2D2', 'OG2D2', 'OG2D2'): ((447.68800000000005, 0.0),), ('OG2D2', 'OG2D2', 'OG2D2', 'CG2O6'): ((447.68800000000005, 0.0),), ('CG2O6', 'NG2S0', 'OG2D1', 'OG302'): ((259.408, 0.0),), ('OG302', 'OG2D1', 'NG2S0', 'CG2O6'): ((259.408, 0.0),), ('CG2O6', 'NG2S1', 'OG2D1', 'OG302'): ((259.408, 0.0),), ('OG302', 'OG2D1', 'NG2S1', 'CG2O6'): ((259.408, 0.0),), ('CG2O6', 'OG2D2', 'OG2D2', 'OG311'): ((355.64, 0.0),), ('OG311', 'OG2D2', 'OG2D2', 'CG2O6'): ((355.64, 0.0),), ('CG2O6', 'NG2S1', 'NG2S2', 'SG2D1'): ((348.0995952, 0.0),), ('SG2D1', 'NG2S2', 'NG2S1', 'CG2O6'): ((348.0995952, 0.0),), ('CG2O6', 'SG311', 'SG311', 'SG2D1'): ((334.72, 0.0),), ('SG2D1', 'SG311', 'SG311', 'CG2O6'): ((334.72, 0.0),), ('CG2O6', 'NG2S2', 'OG2D1', 'SG311'): ((189.4247424, 0.0),), ('SG311', 'OG2D1', 'NG2S2', 'CG2O6'): ((189.4247424, 0.0),), ('CG2R53', 'CG311', 'NG2R50', 'NG2R51'): ((4.184, 0.0),), ('NG2R51', 'NG2R50', 'CG311', 'CG2R53'): ((4.184, 0.0),), ('CG2R53', 'CG251O', 'NG2R51', 'OG2D1'): ((376.56, 0.0),), ('OG2D1', 'NG2R51', 'CG251O', 'CG2R53'): ((376.56, 0.0),), ('CG2R53', 'CG251O', 'NG2R53', 'OG2D1'): ((376.56, 0.0),), ('OG2D1', 'NG2R53', 'CG251O', 'CG2R53'): ((376.56, 0.0),), ('CG2R53', 'CG252O', 'NG2R53', 'OG2D1'): ((376.56, 0.0),), ('OG2D1', 'NG2R53', 'CG252O', 'CG2R53'): ((376.56, 0.0),), ('CG2R53', 'CG25C1', 'NG2R51', 'OG2D1'): ((376.56, 0.0),), ('OG2D1', 'NG2R51', 'CG25C1', 'CG2R53'): ((376.56, 0.0),), ('CG2R53', 'CG25C2', 'NG2R51', 'OG2D1'): ((376.56, 0.0),), ('OG2D1', 'NG2R51', 'CG25C2', 'CG2R53'): ((376.56, 0.0),), ('CG2R53', 'CG3C41', 'NG2R43', 'OG2D1'): ((502.08000000000004, 0.0),), ('OG2D1', 'NG2R43', 'CG3C41', 'CG2R53'): ((502.08000000000004, 0.0),), ('CG2R53', 'CG3C50', 'NG2R53', 'OG2D1'): ((460.24, 0.0),), ('OG2D1', 'NG2R53', 'CG3C50', 'CG2R53'): ((460.24, 0.0),), ('CG2R53', 'CG3C51', 'NG2R53', 'OG2D1'): ((376.56, 0.0),), ('OG2D1', 'NG2R53', 'CG3C51', 'CG2R53'): ((376.56, 0.0),), ('CG2R53', 'CG3C52', 'NG2R53', 'OG2D1'): ((376.56, 0.0),), ('OG2D1', 'NG2R53', 'CG3C52', 'CG2R53'): ((376.56, 0.0),), ('CG2R53', 'NG2R53', 'NG2R53', 'OG2D1'): ((376.56, 0.0),), ('OG2D1', 'NG2R53', 'NG2R53', 'CG2R53'): ((376.56, 0.0),), ('CG2R53', 'CG2R51', 'OG2D1', 'OG3C51'): ((119.6624, 0.0),), ('OG3C51', 'OG2D1', 'CG2R51', 'CG2R53'): ((119.6624, 0.0),), ('CG2R53', 'CG3C52', 'OG2D1', 'OG3C51'): ((188.28, 0.0),), ('OG3C51', 'OG2D1', 'CG3C52', 'CG2R53'): ((188.28, 0.0),), ('CG2R53', 'NG2R53', 'OG2D1', 'SG311'): ((179.912, 0.0),), ('SG311', 'OG2D1', 'NG2R53', 'CG2R53'): ((179.912, 0.0),), ('CG2R53', 'NG2R53', 'SG2D1', 'SG311'): ((179.912, 0.0),), ('SG311', 'SG2D1', 'NG2R53', 'CG2R53'): ((179.912, 0.0),), ('CG2R62', 'CG2R62', 'NG2R62', 'OG311'): ((0.0, 0.0),), ('OG311', 'NG2R62', 'CG2R62', 'CG2R62'): ((0.0, 0.0),), ('CG2R63', 'CG2R62', 'CG2R62', 'OG2D4'): ((62.760000000000005, 0.0),), ('OG2D4', 'CG2R62', 'CG2R62', 'CG2R63'): ((62.760000000000005, 0.0),), ('CG2R63', 'CG2R62', 'NG2R61', 'OG2D4'): ((376.56, 0.0),), ('OG2D4', 'NG2R61', 'CG2R62', 'CG2R63'): ((376.56, 0.0),), ('CG2R63', 'CG2R62', 'NG2R62', 'OG2D4'): ((251.04000000000002, 0.0),), ('OG2D4', 'NG2R62', 'CG2R62', 'CG2R63'): ((251.04000000000002, 0.0),), ('CG2R63', 'CG2R62', 'NG2R67', 'OG2D4'): ((376.56, 0.0),), ('OG2D4', 'NG2R67', 'CG2R62', 'CG2R63'): ((376.56, 0.0),), ('CG2R63', 'CG2RC0', 'NG2R61', 'OG2D4'): ((376.56, 0.0),), ('OG2D4', 'NG2R61', 'CG2RC0', 'CG2R63'): ((376.56, 0.0),), ('CG2R63', 'CG2RC0', 'NG2RC0', 'OG2D4'): ((217.568, 0.0),), ('OG2D4', 'NG2RC0', 'CG2RC0', 'CG2R63'): ((217.568, 0.0),), ('CG2R63', 'NG2P1', 'NG2R61', 'OG2D4'): ((326.35200000000003, 0.0),), ('OG2D4', 'NG2R61', 'NG2P1', 'CG2R63'): ((326.35200000000003, 0.0),), ('CG2R63', 'NG2R61', 'NG2R61', 'OG2D4'): ((376.56, 0.0),), ('OG2D4', 'NG2R61', 'NG2R61', 'CG2R63'): ((376.56, 0.0),), ('CG2R63', 'NG2R61', 'NG2R62', 'OG2D4'): ((376.56, 0.0),), ('OG2D4', 'NG2R62', 'NG2R61', 'CG2R63'): ((376.56, 0.0),), ('CG2R63', 'NG2R61', 'NG2R67', 'OG2D4'): ((376.56, 0.0),), ('OG2D4', 'NG2R67', 'NG2R61', 'CG2R63'): ((376.56, 0.0),), ('CG2R63', 'CG2R62', 'OG2D4', 'OG3R60'): ((213.38400000000001, 0.0),), ('OG3R60', 'OG2D4', 'CG2R62', 'CG2R63'): ((213.38400000000001, 0.0),), ('CG2R63', 'CG2R61', 'NG2R61', 'SG2D1'): ((129.704, 0.0),), ('SG2D1', 'NG2R61', 'CG2R61', 'CG2R63'): ((129.704, 0.0),), ('CG2R63', 'CG2R61', 'NG2R67', 'SG2D1'): ((163.17600000000002, 0.0),), ('SG2D1', 'NG2R67', 'CG2R61', 'CG2R63'): ((163.17600000000002, 0.0),), ('CG2R63', 'CG2R62', 'NG2R61', 'SG2D1'): ((163.17600000000002, 0.0),), ('SG2D1', 'NG2R61', 'CG2R62', 'CG2R63'): ((163.17600000000002, 0.0),), ('CG2R63', 'CG2R62', 'NG2R67', 'SG2D1'): ((163.17600000000002, 0.0),), ('SG2D1', 'NG2R67', 'CG2R62', 'CG2R63'): ((163.17600000000002, 0.0),), ('CG2R63', 'NG2R61', 'NG2R61', 'SG2D1'): ((351.456, 0.0),), ('SG2D1', 'NG2R61', 'NG2R61', 'CG2R63'): ((351.456, 0.0),), ('CG2R63', 'NG2R61', 'NG2R62', 'SG2D1'): ((242.672, 0.0),), ('SG2D1', 'NG2R62', 'NG2R61', 'CG2R63'): ((242.672, 0.0),), ('CG2R63', 'NG2R61', 'NG2R67', 'SG2D1'): ((351.456, 0.0),), ('SG2D1', 'NG2R67', 'NG2R61', 'CG2R63'): ((351.456, 0.0),), ('CG2R63', 'NG2R61', 'NG2R61', 'SEGD1'): ((242.672, 0.0),), ('SEGD1', 'NG2R61', 'NG2R61', 'CG2R63'): ((242.672, 0.0),), ('CG2R64', 'NG2P1', 'NG2P1', 'CG2R61'): ((217.568, 0.0),), ('CG2R61', 'NG2P1', 'NG2P1', 'CG2R64'): ((217.568, 0.0),), ('CG2R64', 'NG2P1', 'NG2P1', 'CG2R62'): ((217.568, 0.0),), ('CG2R62', 'NG2P1', 'NG2P1', 'CG2R64'): ((217.568, 0.0),), ('CG2R64', 'NG2P1', 'NG2P1', 'CG2RC0'): ((217.568, 0.0),), ('CG2RC0', 'NG2P1', 'NG2P1', 'CG2R64'): ((217.568, 0.0),), ('CG2R64', 'CG2R61', 'NG2D1', 'NG2P1'): ((117.152, 0.0),), ('NG2P1', 'NG2D1', 'CG2R61', 'CG2R64'): ((117.152, 0.0),), ('CG2R64', 'NG2P1', 'NG2P1', 'NG2P1'): ((196.648, 0.0),), ('NG2P1', 'NG2P1', 'NG2P1', 'CG2R64'): ((196.648, 0.0),), ('CG2R64', 'HGP2', 'HGP2', 'NG2P1'): ((-4.184, 0.0),), ('NG2P1', 'HGP2', 'HGP2', 'CG2R64'): ((-4.184, 0.0),), ('CG2R64', 'CG2R62', 'NG2D1', 'NG2R61'): ((175.728, 0.0),), ('NG2R61', 'NG2D1', 'CG2R62', 'CG2R64'): ((175.728, 0.0),), ('CG2R64', 'CG2RC0', 'NG2D1', 'NG2R61'): ((175.728, 0.0),), ('NG2R61', 'NG2D1', 'CG2RC0', 'CG2R64'): ((175.728, 0.0),), ('CG2R64', 'CG2R61', 'NG2D1', 'NG2R62'): ((175.728, 0.0),), ('NG2R62', 'NG2D1', 'CG2R61', 'CG2R64'): ((175.728, 0.0),), ('CG2R64', 'CG2R61', 'NG2P1', 'NG2R62'): ((175.728, 0.0),), ('NG2R62', 'NG2P1', 'CG2R61', 'CG2R64'): ((175.728, 0.0),), ('CG2R64', 'CG2RC0', 'NG2R62', 'NG2S0'): ((92.048, 0.0),), ('NG2S0', 'NG2R62', 'CG2RC0', 'CG2R64'): ((92.048, 0.0),), ('CG2R64', 'CG2R61', 'NG2R60', 'NG2S1'): ((79.49600000000001, 0.0),), ('NG2S1', 'NG2R60', 'CG2R61', 'CG2R64'): ((79.49600000000001, 0.0),), ('CG2R64', 'CG2R62', 'NG2R62', 'NG2S1'): ((79.49600000000001, 0.0),), ('NG2S1', 'NG2R62', 'CG2R62', 'CG2R64'): ((79.49600000000001, 0.0),), ('CG2R64', 'CG2RC0', 'NG2R62', 'NG2S1'): ((167.36, 0.0),), ('NG2S1', 'NG2R62', 'CG2RC0', 'CG2R64'): ((167.36, 0.0),), ('CG2R64', 'CG2R61', 'NG2R62', 'NG2S3'): ((251.04000000000002, 0.0),), ('NG2S3', 'NG2R62', 'CG2R61', 'CG2R64'): ((251.04000000000002, 0.0),), ('CG2R64', 'CG2R62', 'NG2R62', 'NG2S3'): ((251.04000000000002, 0.0),), ('NG2S3', 'NG2R62', 'CG2R62', 'CG2R64'): ((251.04000000000002, 0.0),), ('CG2R64', 'CG2RC0', 'NG2R62', 'NG2S3'): ((167.36, 0.0),), ('NG2S3', 'NG2R62', 'CG2RC0', 'CG2R64'): ((167.36, 0.0),), ('CG2R64', 'NG2R61', 'NG2R62', 'NG2S3'): ((167.36, 0.0),), ('NG2S3', 'NG2R62', 'NG2R61', 'CG2R64'): ((167.36, 0.0),), ('CG2R64', 'NG2R62', 'NG2R62', 'NG2S3'): ((167.36, 0.0),), ('NG2S3', 'NG2R62', 'NG2R62', 'CG2R64'): ((167.36, 0.0),), ('CG2R64', 'CG2R62', 'NG2R62', 'NG301'): ((167.36, 0.0),), ('NG301', 'NG2R62', 'CG2R62', 'CG2R64'): ((167.36, 0.0),), ('CG2R64', 'CG2RC0', 'NG2R62', 'NG301'): ((167.36, 0.0),), ('NG301', 'NG2R62', 'CG2RC0', 'CG2R64'): ((167.36, 0.0),), ('CG2R64', 'NG2R61', 'NG2R62', 'NG301'): ((167.36, 0.0),), ('NG301', 'NG2R62', 'NG2R61', 'CG2R64'): ((167.36, 0.0),), ('CG2R64', 'CG2R62', 'NG2R62', 'NG311'): ((200.832, 0.0),), ('NG311', 'NG2R62', 'CG2R62', 'CG2R64'): ((200.832, 0.0),), ('CG2R64', 'CG2RC0', 'NG2R62', 'NG311'): ((209.20000000000002, 0.0),), ('NG311', 'NG2R62', 'CG2RC0', 'CG2R64'): ((209.20000000000002, 0.0),), ('CG2R64', 'NG2R61', 'NG2R62', 'NG311'): ((167.36, 0.0),), ('NG311', 'NG2R62', 'NG2R61', 'CG2R64'): ((167.36, 0.0),), ('NG2O1', 'OG2N1', 'OG2N1', 'CG324'): ((224.2624, 0.0),), ('CG324', 'OG2N1', 'OG2N1', 'NG2O1'): ((224.2624, 0.0),), ('NG2O1', 'OG2N1', 'OG2N1', 'CG334'): ((212.5472, 0.0),), ('CG334', 'OG2N1', 'OG2N1', 'NG2O1'): ((212.5472, 0.0),), ('NG2S3', 'HGP4', 'HGP4', 'CG2R61'): ((-10.46, 0.0),), ('CG2R61', 'HGP4', 'HGP4', 'NG2S3'): ((-10.46, 0.0),), ('NG2S3', 'HGP4', 'HGP4', 'CG2R64'): ((37.656, 0.0),), ('CG2R64', 'HGP4', 'HGP4', 'NG2S3'): ((37.656, 0.0),), ('CC', None, None, 'CTD1'): ((401.664, 0.0),), ('CTD1', None, None, 'CC'): ((401.664, 0.0),), ('O', 'CTD1', 'NH2', 'CC'): ((188.28, 0.0),), ('CC', 'NH2', 'CTD1', 'O'): ((188.28, 0.0),), ('O', 'NH2', 'CTD1', 'CC'): ((188.28, 0.0),), ('CC', 'CTD1', 'NH2', 'O'): ((188.28, 0.0),), ('N', 'C', 'CPD1', 'CP3'): ((0.0, 0.0),), ('CP3', 'CPD1', 'C', 'N'): ((0.0, 0.0),), ('O', 'CPD1', 'NH2', 'CC'): ((188.28, 0.0),), ('CC', 'NH2', 'CPD1', 'O'): ((188.28, 0.0),), ('O', 'NH2', 'CPD1', 'CC'): ((188.28, 0.0),), ('CC', 'CPD1', 'NH2', 'O'): ((188.28, 0.0),), ('CD', 'CC1A', 'O', 'HR1'): ((58.576, 0.0),), ('HR1', 'O', 'CC1A', 'CD'): ((58.576, 0.0),), ('CPB', 'CPA', 'NPH', 'CPA'): ((87.02720000000001, 0.0),), ('CPA', 'NPH', 'CPA', 'CPB'): ((87.02720000000001, 0.0),), ('CPB', None, None, 'CE1'): ((376.56, 0.0),), ('CE1', None, None, 'CPB'): ((376.56, 0.0),), ('CT2', None, None, 'CPB'): ((376.56, 0.0),), ('CPB', None, None, 'CT2'): ((376.56, 0.0),), ('CT3', None, None, 'CPB'): ((376.56, 0.0),), ('CPB', None, None, 'CT3'): ((376.56, 0.0),), ('HA', 'CPA', 'CPA', 'CPM'): ((123.00959999999999, 0.0),), ('CPM', 'CPA', 'CPA', 'HA'): ((123.00959999999999, 0.0),), ('NPH', 'CPA', 'CPA', 'FE'): ((574.8816, 0.0),), ('FE', 'CPA', 'CPA', 'NPH'): ((574.8816, 0.0),), ('NPH', 'CPA', 'CPB', 'CPB'): ((169.87040000000002, 0.0),), ('CPB', 'CPB', 'CPA', 'NPH'): ((169.87040000000002, 0.0),), ('NPH', 'CPA', 'CPM', 'CPA'): ((76.5672, 0.0),), ('CPA', 'CPM', 'CPA', 'NPH'): ((76.5672, 0.0),), ('NPH', 'CPM', 'CPB', 'CPA'): ((136.81680000000003, 0.0),), ('CPA', 'CPB', 'CPM', 'NPH'): ((136.81680000000003, 0.0),), ('CT3', 'CD', 'O', 'HR1'): ((117.152, 3.141592653589793),), ('HR1', 'O', 'CD', 'CT3'): ((117.152, 3.141592653589793),), ('CT2', 'CD', 'O', 'HR1'): ((117.152, 3.141592653589793),), ('HR1', 'O', 'CD', 'CT2'): ((117.152, 3.141592653589793),), ('CA', 'CD', 'O', 'HR1'): ((58.576, 3.141592653589793),), ('HR1', 'O', 'CD', 'CA'): ((58.576, 3.141592653589793),), ('CG2D1O', 'CG2D1O', 'NG311', 'HGA4'): ((-10.75288, 0.0),), ('HGA4', 'NG311', 'CG2D1O', 'CG2D1O'): ((-10.75288, 0.0),), ('CG2D1O', 'CG2D1O', 'NG2D1', 'HGA4'): ((57.57184, 0.0),), ('HGA4', 'NG2D1', 'CG2D1O', 'CG2D1O'): ((57.57184, 0.0),), ('CG2DC1', 'CG321', 'NG2D1', 'HGA4'): ((29.371679999999998, 0.0),), ('HGA4', 'NG2D1', 'CG321', 'CG2DC1'): ((29.371679999999998, 0.0),), ('CG2DC1', 'CG321', 'CG321', 'NG2D1'): ((502.08000000000004, 0.0),), ('NG2D1', 'CG321', 'CG321', 'CG2DC1'): ((502.08000000000004, 0.0),), ('CG2O5', 'CG2DC1', 'CG321', 'OG2D3'): ((368.192, 0.0),), ('OG2D3', 'CG321', 'CG2DC1', 'CG2O5'): ((368.192, 0.0),), ('CG2O5', 'CG2DC1', 'CG311', 'OG2D3'): ((368.192, 0.0),), ('OG2D3', 'CG311', 'CG2DC1', 'CG2O5'): ((368.192, 0.0),), ('CG2O3', 'OG2D2', 'OG2D2', 'CG3C51'): ((401.664, 0.0),), ('CG3C51', 'OG2D2', 'OG2D2', 'CG2O3'): ((401.664, 0.0),), ('CG2DC1', 'CG2O5', 'CG2R52', 'CG251O'): ((401.664, 0.0),), ('CG251O', 'CG2R52', 'CG2O5', 'CG2DC1'): ((401.664, 0.0),), ('CG251O', 'NG2D1', 'CG3C51', 'CG2R53'): ((368.192, 0.0),), ('CG2R53', 'CG3C51', 'NG2D1', 'CG251O'): ((368.192, 0.0),), ('CG2R52', 'NG2R50', 'CG3C50', 'CG321'): ((368.192, 0.0),), ('CG321', 'CG3C50', 'NG2R50', 'CG2R52'): ((368.192, 0.0),), ('CG2R52', 'NG2R50', 'CG3RC1', 'CG2DC1'): ((368.192, 0.0),), ('CG2DC1', 'CG3RC1', 'NG2R50', 'CG2R52'): ((368.192, 0.0),), ('CG2R52', 'NG2R50', 'CG3C51', 'CG2DC1'): ((368.192, 0.0),), ('CG2DC1', 'CG3C51', 'NG2R50', 'CG2R52'): ((368.192, 0.0),), ('NG2R50', 'CG2R52', 'CG3RC1', 'NI1P'): ((574.8816, 0.0),), ('NI1P', 'CG3RC1', 'CG2R52', 'NG2R50'): ((574.8816, 0.0),), ('NG2R50', 'CG3C51', 'CG2R52', 'NI1P'): ((574.8816, 0.0),), ('NI1P', 'CG2R52', 'CG3C51', 'NG2R50'): ((574.8816, 0.0),), ('NG2D1', 'CG251O', 'CG251O', 'NI1P'): ((574.8816, 0.0),), ('NI1P', 'CG251O', 'CG251O', 'NG2D1'): ((574.8816, 0.0),), ('C', 'CT3', 'N', 'O'): ((297.064, 0.0),), ('O', 'N', 'CT3', 'C'): ((297.064, 0.0),), ('CG2O1', 'CG321', 'NH1', 'OG2D1'): ((502.08000000000004, 0.0),), ('OG2D1', 'NH1', 'CG321', 'CG2O1'): ((502.08000000000004, 0.0),), ('CG2O1', 'CG2D1O', 'NH1', 'OG2D1'): ((502.08000000000004, 0.0),), ('OG2D1', 'NH1', 'CG2D1O', 'CG2O1'): ((502.08000000000004, 0.0),), ('CG2O1', 'CG3C51', 'NH1', 'OG2D1'): ((502.08000000000004, 0.0),), ('OG2D1', 'NH1', 'CG3C51', 'CG2O1'): ((502.08000000000004, 0.0),), ('CG2O1', 'CG311', 'NH1', 'OG2D1'): ((502.08000000000004, 0.0),), ('OG2D1', 'NH1', 'CG311', 'CG2O1'): ((502.08000000000004, 0.0),), ('CG2O1', 'CG3C50', 'NH1', 'OG2D1'): ((502.08000000000004, 0.0),), ('OG2D1', 'NH1', 'CG3C50', 'CG2O1'): ((502.08000000000004, 0.0),), ('CG2O1', 'CG321', 'NH1', 'SG2D1'): ((277.7330832, 0.0),), ('SG2D1', 'NH1', 'CG321', 'CG2O1'): ((277.7330832, 0.0),), ('CG2O1', 'CG3C51', 'N', 'OG2D1'): ((502.08000000000004, 0.0),), ('OG2D1', 'N', 'CG3C51', 'CG2O1'): ((502.08000000000004, 0.0),), ('N', 'CG2O1', 'CP1', 'CP3'): ((0.0, 0.0),), ('CP3', 'CP1', 'CG2O1', 'N'): ((0.0, 0.0),), ('CG2O1', 'CG311', 'N', 'OG2D1'): ((502.08000000000004, 0.0),), ('OG2D1', 'N', 'CG311', 'CG2O1'): ((502.08000000000004, 0.0),), ('CG2O1', 'CG321', 'N', 'OG2D1'): ((502.08000000000004, 0.0),), ('OG2D1', 'N', 'CG321', 'CG2O1'): ((502.08000000000004, 0.0),), ('CG2O1', 'CG2D1O', 'N', 'OG2D1'): ((502.08000000000004, 0.0),), ('OG2D1', 'N', 'CG2D1O', 'CG2O1'): ((502.08000000000004, 0.0),), ('CG2O1', 'CG321', 'N', 'SG2D1'): ((502.08000000000004, 0.0),), ('SG2D1', 'N', 'CG321', 'CG2O1'): ((502.08000000000004, 0.0),), ('CG2O1', 'CG3C50', 'N', 'OG2D1'): ((502.08000000000004, 0.0),), ('OG2D1', 'N', 'CG3C50', 'CG2O1'): ((502.08000000000004, 0.0),), ('NG2S0', 'C', 'CG3C51', 'CG3C52'): ((0.0, 0.0),), ('CG3C52', 'CG3C51', 'C', 'NG2S0'): ((0.0, 0.0),), ('NG2S0', 'C', 'CG3C50', 'CG3C52'): ((0.0, 0.0),), ('CG3C52', 'CG3C50', 'C', 'NG2S0'): ((0.0, 0.0),), ('NG2S1', 'C', 'CG311', 'HGP1'): ((83.68, 0.0),), ('HGP1', 'CG311', 'C', 'NG2S1'): ((83.68, 0.0),), ('NG2S1', 'C', 'CG2D1O', 'HGP1'): ((83.68, 0.0),), ('HGP1', 'CG2D1O', 'C', 'NG2S1'): ((83.68, 0.0),), ('NG2S1', 'C', 'CG3C51', 'HGP1'): ((83.68, 0.0),), ('HGP1', 'CG3C51', 'C', 'NG2S1'): ((83.68, 0.0),), ('NG2S0', 'C', 'CG321', 'CG321'): ((0.0, 0.0),), ('CG321', 'CG321', 'C', 'NG2S0'): ((0.0, 0.0),), ('NG2S0', 'C', 'CG311', 'CG331'): ((0.0, 0.0),), ('CG331', 'CG311', 'C', 'NG2S0'): ((0.0, 0.0),), ('CAP', None, None, 'NH2'): ((41.84, 0.0),), ('NH2', None, None, 'CAP'): ((41.84, 0.0),), ('H', 'H', 'NH2', 'CAP'): ((7.9496, 3.141592653589793),), ('CAP', 'NH2', 'H', 'H'): ((7.9496, 3.141592653589793),), ('HP', None, None, 'CAP'): ((62.760000000000005, 0.0),), ('CAP', None, None, 'HP'): ((62.760000000000005, 0.0),), ('FA', 'CAP', 'CAP', 'CAP'): ((7.9496, 0.0),), ('CAP', 'CAP', 'CAP', 'FA'): ((7.9496, 0.0),), ('CT3', 'CAP', 'CAP', 'CAP'): ((7.9496, 0.0),), ('CAP', 'CAP', 'CAP', 'CT3'): ((7.9496, 0.0),), ('CT2', 'CAP', 'CAP', 'CAP'): ((7.9496, 0.0),), ('CAP', 'CAP', 'CAP', 'CT2'): ((7.9496, 0.0),), ('CAP', 'CD', 'O', 'HR1'): ((58.576, 3.141592653589793),), ('HR1', 'O', 'CD', 'CAP'): ((58.576, 3.141592653589793),), ('COA', 'CAP', 'CT3', 'OCA'): ((125.52000000000001, 0.0),), ('OCA', 'CT3', 'CAP', 'COA'): ((125.52000000000001, 0.0),), ('COA', 'CAP', 'NH2', 'OCA'): ((125.52000000000001, 0.0),), ('OCA', 'NH2', 'CAP', 'COA'): ((125.52000000000001, 0.0),), ('CAP', 'CAP', 'CAP', 'COA'): ((125.52000000000001, 0.0),), ('COA', 'CAP', 'CAP', 'CAP'): ((125.52000000000001, 0.0),), ('CAP', 'CAP', 'CAP', 'CA'): ((125.52000000000001, 0.0),), ('CA', 'CAP', 'CAP', 'CAP'): ((125.52000000000001, 0.0),), ('CAP', 'CAP', 'CAP', 'CN'): ((125.52000000000001, 0.0),), ('CN', 'CAP', 'CAP', 'CAP'): ((125.52000000000001, 0.0),), ('NR1', 'CPH1', 'CPH2', 'CN7B'): ((2.5104, 0.0),), ('CN7B', 'CPH2', 'CPH1', 'NR1'): ((2.5104, 0.0),), ('NR1', 'CPH2', 'CPH1', 'CN7B'): ((2.5104, 0.0),), ('CN7B', 'CPH1', 'CPH2', 'NR1'): ((2.5104, 0.0),), ('NN2G', 'CN4', 'CN1', 'HN2'): ((3.3472000000000004, 0.0),), ('HN2', 'CN1', 'CN4', 'NN2G'): ((3.3472000000000004, 0.0),), ('CN4', 'NN2G', 'NN3I', 'HN3'): ((163.17600000000002, 0.0),), ('HN3', 'NN3I', 'NN2G', 'CN4'): ((163.17600000000002, 0.0),), ('CN1', 'NN3G', 'CN5G', 'ON5'): ((230.12, 0.0),), ('ON5', 'CN5G', 'NN3G', 'CN1'): ((230.12, 0.0),), ('CN2', 'NN2C', 'CN3', 'NN1C'): ((376.56, 0.0),), ('NN1C', 'CN3', 'NN2C', 'CN2'): ((376.56, 0.0),), ('NNG', None, None, 'CNG'): ((167.36, 0.0),), ('CNG', None, None, 'NNG'): ((167.36, 0.0),), ('C', 'O', 'CT2', 'NH1'): ((502.08000000000004, 0.0),), ('NH1', 'CT2', 'O', 'C'): ((502.08000000000004, 0.0),), ('CC', 'O', 'CT2', 'N'): ((502.08000000000004, 0.0),), ('N', 'CT2', 'O', 'CC'): ((502.08000000000004, 0.0),), ('N', 'CT2', 'CT2', 'CC'): ((0.0, 0.0),), ('CC', 'CT2', 'CT2', 'N'): ((0.0, 0.0),), ('N', 'CT2', 'CT2P', 'CC'): ((0.0, 0.0),), ('CC', 'CT2P', 'CT2', 'N'): ((0.0, 0.0),), ('CN3', 'CN3C', 'CN8', 'HN6'): ((62.760000000000005, 0.0),), ('HN6', 'CN8', 'CN3C', 'CN3'): ((62.760000000000005, 0.0),), ('HN3B', None, None, 'CN3'): ((62.760000000000005, 0.0),), ('CN3', None, None, 'HN3B'): ((62.760000000000005, 0.0),), ('HN3B', None, None, 'CN3A'): ((54.392, 0.0),), ('CN3A', None, None, 'HN3B'): ((54.392, 0.0),), ('HN3B', None, None, 'CN3B'): ((54.392, 0.0),), ('CN3B', None, None, 'HN3B'): ((54.392, 0.0),), ('HN2', 'CN3', 'CN3B', 'NN2'): ((209.20000000000002, 0.0),), ('NN2', 'CN3B', 'CN3', 'HN2'): ((209.20000000000002, 0.0),), ('HN1', 'HN1', 'CN1A', 'NN1'): ((-20.92, 0.0),), ('NN1', 'CN1A', 'HN1', 'HN1'): ((-20.92, 0.0),), ('ON1', None, None, 'CN1A'): ((167.36, 0.0),), ('CN1A', None, None, 'ON1'): ((167.36, 0.0),), ('HN3', None, None, 'CN3C'): ((221.752, 0.0),), ('CN3C', None, None, 'HN3'): ((221.752, 0.0),), ('HN6', None, None, 'CN3C'): ((221.752, 0.0),), ('CN3C', None, None, 'HN6'): ((221.752, 0.0),), ('HN8', 'CN3', 'CN3', 'CN8'): ((75.312, 0.0),), ('CN8', 'CN3', 'CN3', 'HN8'): ((75.312, 0.0),), ('PX', 'OX1', 'OX1', 'ON2'): ((334.72, 0.0),), ('ON2', 'OX1', 'OX1', 'PX'): ((334.72, 0.0),), ('PX', 'OX1', 'SX', 'ON2'): ((334.72, 0.0),), ('ON2', 'SX', 'OX1', 'PX'): ((334.72, 0.0),), ('PX', 'SX', 'OX1', 'ON2'): ((334.72, 0.0),), ('ON2', 'OX1', 'SX', 'PX'): ((334.72, 0.0),), ('PX', 'SX', 'SX', 'ON2'): ((334.72, 0.0),), ('ON2', 'SX', 'SX', 'PX'): ((334.72, 0.0),), ('NN3A', 'CN2D', 'NN3A', 'CN2'): ((334.72, 0.0),), ('CN2', 'NN3A', 'CN2D', 'NN3A'): ((334.72, 0.0),), ('NN3A', 'CN2D', 'NN3A', 'CN5'): ((334.72, 0.0),), ('CN5', 'NN3A', 'CN2D', 'NN3A'): ((334.72, 0.0),), ('CN5', 'CN2', 'NN3A', 'CN2D'): ((334.72, 0.0),), ('CN2D', 'NN3A', 'CN2', 'CN5'): ((334.72, 0.0),), ('NG2S1', 'C', 'CG321', 'HGP1'): ((83.68, 0.0),), ('HGP1', 'CG321', 'C', 'NG2S1'): ((83.68, 0.0),), ('CC2O1', 'CT1', 'NC2D1', 'OC2D1'): ((502.08000000000004, 0.0),), ('OC2D1', 'NC2D1', 'CT1', 'CC2O1'): ((502.08000000000004, 0.0),), ('CC', 'OS', 'NH2', 'OB'): ((502.08000000000004, 0.0),), ('OB', 'NH2', 'OS', 'CC'): ((502.08000000000004, 0.0),), ('CC2O2', 'CC312', 'OC2D2', 'OC2D2'): ((401.664, 0.0),), ('OC2D2', 'OC2D2', 'CC312', 'CC2O2'): ((401.664, 0.0),), ('CC2O1', 'CT3', 'NC2D1', 'OC2D1'): ((502.08000000000004, 0.0),), ('OC2D1', 'NC2D1', 'CT3', 'CC2O1'): ((502.08000000000004, 0.0),), ('CC2O1', 'CC331', 'NC2D1', 'NC2'): ((188.28, 0.0),), ('NC2', 'NC2D1', 'CC331', 'CC2O1'): ((188.28, 0.0),), ('CC2O1', 'HCR1', 'NC2D1', 'OC2D1'): ((188.28, 0.0),), ('OC2D1', 'NC2D1', 'HCR1', 'CC2O1'): ((188.28, 0.0),), ('CC2O1', 'CT2', 'NC2D1', 'OC2D1'): ((188.28, 0.0),), ('OC2D1', 'NC2D1', 'CT2', 'CC2O1'): ((188.28, 0.0),), ('NC2D1', 'CC2O1', 'CC3152', 'HCP1'): ((83.68, 0.0),), ('HCP1', 'CC3152', 'CC2O1', 'NC2D1'): ((83.68, 0.0),), ('NC2D1', 'CC2O1', 'CC322', 'HCP1'): ((83.68, 0.0),), ('HCP1', 'CC322', 'CC2O1', 'NC2D1'): ((83.68, 0.0),), ('CC2O2', 'CC3163', 'OC301', 'OC2D2'): ((259.408, 0.0),), ('OC2D2', 'OC301', 'CC3163', 'CC2O2'): ((259.408, 0.0),), ('CC2O2', 'CC3261', 'OC2D2', 'OC2D2'): ((401.664, 0.0),), ('OC2D2', 'OC2D2', 'CC3261', 'CC2O2'): ((401.664, 0.0),), ('CC2O1', 'CC312', 'NC2D1', 'OC2D1'): ((188.28, 0.0),), ('OC2D1', 'NC2D1', 'CC312', 'CC2O1'): ((188.28, 0.0),), ('CC2O1', 'CC322', 'NC2D1', 'OC2D1'): ((188.28, 0.0),), ('OC2D1', 'NC2D1', 'CC322', 'CC2O1'): ((188.28, 0.0),), ('CC2O1', 'CP1', 'NC2D1', 'OC2D1'): ((188.28, 0.0),), ('OC2D1', 'NC2D1', 'CP1', 'CC2O1'): ((188.28, 0.0),), ('CC', 'NH1', 'CP2', 'O'): ((376.56, 0.0),), ('O', 'CP2', 'NH1', 'CC'): ((376.56, 0.0),), ('NH1', None, None, 'HCA1'): ((83.68, 0.0),), ('HCA1', None, None, 'NH1'): ((83.68, 0.0),), ('NC2D1', 'CC2O1', 'CC311D', 'HCP1'): ((83.68, 0.0),), ('HCP1', 'CC311D', 'CC2O1', 'NC2D1'): ((83.68, 0.0),), ('NC2D1', 'CC2O1', 'CC3162', 'HCP1'): ((83.68, 0.0),), ('HCP1', 'CC3162', 'CC2O1', 'NC2D1'): ((83.68, 0.0),), ('CC2O1', 'NC2D1', 'CC321', 'OC2D1'): ((188.28, 0.0),), ('OC2D1', 'CC321', 'NC2D1', 'CC2O1'): ((188.28, 0.0),), ('CC2O1', 'CC321', 'NC2D1', 'OC2D1'): ((188.28, 0.0),), ('OC2D1', 'NC2D1', 'CC321', 'CC2O1'): ((188.28, 0.0),), ('NHL', None, None, 'H'): ((83.68, 0.0),), ('H', None, None, 'NHL'): ((83.68, 0.0),), ('CL', None, None, 'CTL2'): ((401.664, 0.0),), ('CTL2', None, None, 'CL'): ((401.664, 0.0),), ('C', 'O', 'NH1', 'CTL2'): ((401.664, 0.0),), ('CTL2', 'NH1', 'O', 'C'): ((401.664, 0.0),), ('CC2O1', 'CTL2', 'NC2D1', 'OC2D1'): ((502.08000000000004, 0.0),), ('OC2D1', 'NC2D1', 'CTL2', 'CC2O1'): ((502.08000000000004, 0.0),), ('C', 'CT1', 'O', 'OSL'): ((259.408, 0.0),), ('OSL', 'O', 'CT1', 'C'): ((259.408, 0.0),), ('C', 'CTL2', 'O', 'OSL'): ((259.408, 0.0),), ('OSL', 'O', 'CTL2', 'C'): ((259.408, 0.0),), ('N1', 'HNT1', 'HNT1', 'CNT1'): ((145.6032, 0.0),), ('CNT1', 'HNT1', 'HNT1', 'N1'): ((145.6032, 0.0),)}\n+ # Return None to indicate an atom without template name information.\n+ atom_name_parts = raw_atom_name.rsplit(\"-\", maxsplit=1)\n+ if len(atom_name_parts) < 2:\n+ return None\n+ templates.add(atom_name_parts[0])\n+ return f\"{atom_name_prefix}{atom_name_parts[1]}\"\n \n def is_valid_improper(atom_indices):\n index_1, index_2, index_3, index_4 = atom_indices\n@@ -255610,23 +259286,38 @@ def find_improper(improper_types, atom_classes):\n \n residue_data = []\n \n-for residue in topology.residues():\n- # Extract the residue or patch names and atom names from the atom type names.\n- templates = []\n- atom_names = []\n- for atom in residue.atoms():\n- raw_atom_name = data.atomType[atom]\n- atom_is_drude = raw_atom_name.startswith(\"Drude-\")\n- if atom_is_drude:\n- atom_name_parts = raw_atom_name[len(\"Drude-\"):].rsplit(\"-\", maxsplit=1)\n- atom_names.append(f\"D{atom_name_parts[1]}\")\n- else:\n- atom_name_parts = raw_atom_name.rsplit(\"-\", maxsplit=1)\n- atom_names.append(atom_name_parts[1])\n- templates.append(atom_name_parts[0])\n+for residue_index, residue in enumerate(topology.residues()):\n+ # Extract the residue or patch names and atom names.\n+ template_data = templateForResidue[residue_index]\n+ templates = set()\n+ if template_data is None:\n+ # Multi-residue patch; fall back to parsing atom names because OpenMM\n+ # leaves None in templateForResidue in this case.\n+ atom_names = []\n+ skip_residue = False\n+ for atom in residue.atoms():\n+ atom_name = extract_atom_name(data.atomType[atom], templates)\n+ if atom_name is None:\n+ # Skip residues containing atoms without template name data\n+ # (they might be from, e.g., another solvent force field file).\n+ skip_residue = True\n+ break\n+ atom_names.append(atom_name)\n+ if skip_residue:\n+ residue_data.append(([], [], []))\n+ continue\n+ else:\n+ # Extract names from template name.\n+ for template_index, template_name in enumerate(template_data.name.split(\"-\")):\n+ if template_index:\n+ # Patch name.\n+ templates.add(template_name.rsplit(\"_\", maxsplit=1)[0])\n+ else:\n+ # Residue name.\n+ templates.add(template_name)\n+ atom_names = [template_data.atoms[data.atomTemplateIndexes[atom]].name for atom in residue.atoms()]\n \n # Get all unique residue or patch names that have impropers.\n- templates = set(templates)\n residue_templates = sorted(\n (template for template in templates if template in residue_impropers), key=residue_order.get\n )\n@@ -255727,4 +259418,12 @@ if harmonic_impropers:\n harmonic_force.addTorsion(*improper)\n \n sys.addForce(harmonic_force)</Script>\n+ <InitializationScript>\n+EXPECTED_VERSION = \"charmm36_2024\"\n+if hasattr(self, \"_charmm_ff_version\"):\n+ if self._charmm_ff_version != EXPECTED_VERSION:\n+ raise RuntimeError(f\"CHARMM force field versions ({self._charmm_ff_version} and {EXPECTED_VERSION}) incompatible\")\n+else:\n+ self._charmm_ff_version = EXPECTED_VERSION\n+ </InitializationScript>\n </ForceField>\n\\ No newline at end of file\ndiff --git a/wrappers/python/openmm/app/data/charmm36_2024/spce.xml b/wrappers/python/openmm/app/data/charmm36_2024/spce.xml\nnew file mode 100644\nindex 0000000000..d8cbca6a62\n--- /dev/null\n+++ b/wrappers/python/openmm/app/data/charmm36_2024/spce.xml\n@@ -0,0 +1,460 @@\n+<ForceField>\n+ <Info>\n+ <DateGenerated>2025-02-27</DateGenerated>\n+ <Source Source=\"toppar/non_charmm/toppar_water_ions_spc_e.str\" md5hash=\"5a43bf944d3d6bd537b50538ceb83560\" sourcePackage=\"charmm36\" sourcePackageVersion=\"toppar_c36_jul24.tgz\">toppar/non_charmm/toppar_water_ions_spc_e.str</Source>\n+ <Source Source=\"toppar/stream/misc/toppar_ions_won.str\" md5hash=\"f523f7727e7dfa25468cc75f9b880c5b\" sourcePackage=\"charmm36\" sourcePackageVersion=\"toppar_c36_jul24.tgz\">toppar/stream/misc/toppar_ions_won.str</Source>\n+ <Reference Reference=\"H.J.C. Berendsen, J. R. Grigera, and T. P. Straatsma. The Missing Term in Effective Pair Potentials. J. Phys. Chem 91:6269-6271, 1987.\" forcefield=\"spc-e\">H.J.C. Berendsen, J. R. Grigera, and T. P. Straatsma. The Missing Term in Effective Pair Potentials. J. Phys. Chem 91:6269-6271, 1987.</Reference>\n+ <Reference Reference=\"Beglov, D. and Roux, B., Finite Representation of an Infinite Bulk System: Solvent Boundary Potential for Computer Simulations, Journal of Chemical Physics, 1994, 100: 9050-9063\" forcefield=\"ions\">Beglov, D. and Roux, B., Finite Representation of an Infinite Bulk System: Solvent Boundary Potential for Computer Simulations, Journal of Chemical Physics, 1994, 100: 9050-9063</Reference>\n+ <Reference Reference=\"Stote, R.H. and Karplus, M. Zinc Binding in Proteins and Solution: A Simple but Accurate Nonbonded Representation, PROTEINS: Structure, Function, and Genetics 23:12-31 (1995)\" forcefield=\"ions\">Stote, R.H. and Karplus, M. Zinc Binding in Proteins and Solution: A Simple but Accurate Nonbonded Representation, PROTEINS: Structure, Function, and Genetics 23:12-31 (1995)</Reference>\n+ <Reference Reference=\"Won, Y., "Force Field for Monovalent, Divalent, and Trivalent Cations Developed under the Solvent Boundary Potential," Journal of Physical Chemistry A., 116: 11763-11767, 2012.\" forcefield=\"ions\">Won, Y., \"Force Field for Monovalent, Divalent, and Trivalent Cations Developed under the Solvent Boundary Potential,\" Journal of Physical Chemistry A., 116: 11763-11767, 2012.</Reference>\n+ </Info>\n+ <AtomTypes>\n+ <Type class=\"OT\" element=\"O\" mass=\"15.9994\" name=\"SPCE-OH2\" />\n+ <Type class=\"HT\" element=\"H\" mass=\"1.008\" name=\"SPCE-H1\" />\n+ <Type class=\"HT\" element=\"H\" mass=\"1.008\" name=\"SPCE-H2\" />\n+ <Type class=\"OX\" element=\"O\" mass=\"15.9994\" name=\"OH-O1\" />\n+ <Type class=\"HX\" element=\"H\" mass=\"1.008\" name=\"OH-H1\" />\n+ <Type class=\"LIT\" element=\"Li\" mass=\"6.941\" name=\"LIT-LIT\" />\n+ <Type class=\"SOD\" element=\"Na\" mass=\"22.98977\" name=\"SOD-SOD\" />\n+ <Type class=\"MG\" element=\"Mg\" mass=\"24.305\" name=\"MG-MG\" />\n+ <Type class=\"POT\" element=\"K\" mass=\"39.0983\" name=\"POT-POT\" />\n+ <Type class=\"CAL\" element=\"Ca\" mass=\"40.08\" name=\"CAL-CAL\" />\n+ <Type class=\"RUB\" element=\"Rb\" mass=\"85.4678\" name=\"RUB-RUB\" />\n+ <Type class=\"CES\" element=\"Cs\" mass=\"132.90545\" name=\"CES-CES\" />\n+ <Type class=\"BAR\" element=\"Ba\" mass=\"137.327\" name=\"BAR-BAR\" />\n+ <Type class=\"ZN\" element=\"Zn\" mass=\"65.37\" name=\"ZN2-ZN\" />\n+ <Type class=\"CAD\" element=\"Cd\" mass=\"112.411\" name=\"CD2-CD\" />\n+ <Type class=\"CLA\" element=\"Cl\" mass=\"35.45\" name=\"CLA-CLA\" />\n+ <Type class=\"CU1P\" element=\"Cu\" mass=\"63.546\" name=\"CU1P-CU1P\" />\n+ <Type class=\"AG1P\" element=\"Ag\" mass=\"107.87\" name=\"AG1P-AG1P\" />\n+ <Type class=\"AU1P\" element=\"Au\" mass=\"196.97\" name=\"AU1P-AU1P\" />\n+ <Type class=\"TI1P\" element=\"Ti\" mass=\"47.867\" name=\"TI1P-TI1P\" />\n+ <Type class=\"BE2P\" element=\"Be\" mass=\"9.0122\" name=\"BE2P-BE2P\" />\n+ <Type class=\"SR2P\" element=\"Sr\" mass=\"87.62\" name=\"SR2P-SR2P\" />\n+ <Type class=\"RA2P\" element=\"Ra\" mass=\"226.03\" name=\"RA2P-RA2P\" />\n+ <Type class=\"V2P\" element=\"V\" mass=\"50.942\" name=\"V2P-V2P\" />\n+ <Type class=\"CR2P\" element=\"Cr\" mass=\"51.996\" name=\"CR2P-CR2P\" />\n+ <Type class=\"MN2P\" element=\"Mn\" mass=\"54.938\" name=\"MN2P-MN2P\" />\n+ <Type class=\"FE2P\" element=\"Fe\" mass=\"55.854\" name=\"FE2P-FE2P\" />\n+ <Type class=\"CO2P\" element=\"Co\" mass=\"58.933\" name=\"CO2P-CO2P\" />\n+ <Type class=\"NI2P\" element=\"Ni\" mass=\"58.693\" name=\"NI2P-NI2P\" />\n+ <Type class=\"CU2P\" element=\"Cu\" mass=\"63.546\" name=\"CU2P-CU2P\" />\n+ <Type class=\"PD2P\" element=\"Pd\" mass=\"106.42\" name=\"PD2P-PD2P\" />\n+ <Type class=\"AG2P\" element=\"Ag\" mass=\"107.87\" name=\"AG2P-AG2P\" />\n+ <Type class=\"SN2P\" element=\"Sn\" mass=\"118.71\" name=\"SN2P-SN2P\" />\n+ <Type class=\"PT2P\" element=\"Pt\" mass=\"195.08\" name=\"PT2P-PT2P\" />\n+ <Type class=\"HG2P\" element=\"Hg\" mass=\"200.59\" name=\"HG2P-HG2P\" />\n+ <Type class=\"PB2P\" element=\"Pb\" mass=\"207.2\" name=\"PB2P-PB2P\" />\n+ <Type class=\"SM2P\" element=\"Sm\" mass=\"150.36\" name=\"SM2P-SM2P\" />\n+ <Type class=\"EU2P\" element=\"Eu\" mass=\"151.96\" name=\"EU2P-EU2P\" />\n+ <Type class=\"YB2P\" element=\"Yb\" mass=\"173.05\" name=\"YB2P-YB2P\" />\n+ <Type class=\"AL3P\" element=\"Al\" mass=\"26.982\" name=\"AL3P-AL3P\" />\n+ <Type class=\"SC3P\" element=\"Sc\" mass=\"44.956\" name=\"SC3P-SC3P\" />\n+ <Type class=\"Y3P\" element=\"Y\" mass=\"88.906\" name=\"Y3P-Y3P\" />\n+ <Type class=\"LA3P\" element=\"La\" mass=\"138.91\" name=\"LA3P-LA3P\" />\n+ <Type class=\"CE3P\" element=\"Ce\" mass=\"140.12\" name=\"CE3P-CE3P\" />\n+ <Type class=\"PR3P\" element=\"Pr\" mass=\"140.91\" name=\"PR3P-PR3P\" />\n+ <Type class=\"ND3P\" element=\"Nd\" mass=\"144.24\" name=\"ND3P-ND3P\" />\n+ <Type class=\"PM3P\" element=\"Pm\" mass=\"144.91\" name=\"PM3P-PM3P\" />\n+ <Type class=\"SM3P\" element=\"Sm\" mass=\"150.36\" name=\"SM3P-SM3P\" />\n+ <Type class=\"EU3P\" element=\"Eu\" mass=\"151.96\" name=\"EU3P-EU3P\" />\n+ <Type class=\"GD3P\" element=\"Gd\" mass=\"157.25\" name=\"GD3P-GD3P\" />\n+ <Type class=\"TB3P\" element=\"Tb\" mass=\"158.93\" name=\"TB3P-TB3P\" />\n+ <Type class=\"DY3P\" element=\"Dy\" mass=\"162.5\" name=\"DY3P-DY3P\" />\n+ <Type class=\"HO3P\" element=\"Ho\" mass=\"164.93\" name=\"HO3P-HO3P\" />\n+ <Type class=\"ER3P\" element=\"Er\" mass=\"167.28\" name=\"ER3P-ER3P\" />\n+ <Type class=\"YB3P\" element=\"Yb\" mass=\"173.05\" name=\"YB3P-YB3P\" />\n+ <Type class=\"LU3P\" element=\"Lu\" mass=\"174.97\" name=\"LU3P-LU3P\" />\n+ <Type class=\"U3P\" element=\"U\" mass=\"238.03\" name=\"U3P-U3P\" />\n+ <Type class=\"PU3P\" element=\"Pu\" mass=\"244.06\" name=\"PU3P-PU3P\" />\n+ <Type class=\"TI3P\" element=\"Ti\" mass=\"47.867\" name=\"TI3P-TI3P\" />\n+ <Type class=\"V3P\" element=\"V\" mass=\"50.942\" name=\"V3P-V3P\" />\n+ <Type class=\"CR3P\" element=\"Cr\" mass=\"51.996\" name=\"CR3P-CR3P\" />\n+ <Type class=\"MN3P\" element=\"Mn\" mass=\"54.938\" name=\"MN3P-MN3P\" />\n+ <Type class=\"FE3P\" element=\"Fe\" mass=\"55.854\" name=\"FE3P-FE3P\" />\n+ <Type class=\"CO3P\" element=\"Co\" mass=\"58.933\" name=\"CO3P-CO3P\" />\n+ <Type class=\"GA3P\" element=\"Ga\" mass=\"69.723\" name=\"GA3P-GA3P\" />\n+ <Type class=\"RH3P\" element=\"Rh\" mass=\"102.91\" name=\"RH3P-RH3P\" />\n+ <Type class=\"IN3P\" element=\"In\" mass=\"114.82\" name=\"IN3P-IN3P\" />\n+ <Type class=\"AU3P\" element=\"Au\" mass=\"196.97\" name=\"AU3P-AU3P\" />\n+ <Type class=\"TL3P\" element=\"Tl\" mass=\"204.38\" name=\"TL3P-TL3P\" />\n+ <Type class=\"BI3P\" element=\"Bi\" mass=\"208.98\" name=\"BI3P-BI3P\" />\n+ </AtomTypes>\n+ <Residues>\n+ <Residue name=\"SPCE\">\n+ <Atom charge=\"-0.8476\" name=\"OH2\" type=\"SPCE-OH2\" />\n+ <Atom charge=\"0.4238\" name=\"H1\" type=\"SPCE-H1\" />\n+ <Atom charge=\"0.4238\" name=\"H2\" type=\"SPCE-H2\" />\n+ <Bond atomName1=\"OH2\" atomName2=\"H1\" />\n+ <Bond atomName1=\"OH2\" atomName2=\"H2\" />\n+ </Residue>\n+ <Residue name=\"OH\">\n+ <Atom charge=\"-1.32\" name=\"O1\" type=\"OH-O1\" />\n+ <Atom charge=\"0.32\" name=\"H1\" type=\"OH-H1\" />\n+ <Bond atomName1=\"O1\" atomName2=\"H1\" />\n+ </Residue>\n+ <Residue name=\"LIT\">\n+ <Atom charge=\"1.0\" name=\"LIT\" type=\"LIT-LIT\" />\n+ </Residue>\n+ <Residue name=\"SOD\">\n+ <Atom charge=\"1.0\" name=\"SOD\" type=\"SOD-SOD\" />\n+ </Residue>\n+ <Residue name=\"MG\">\n+ <Atom charge=\"2.0\" name=\"MG\" type=\"MG-MG\" />\n+ </Residue>\n+ <Residue name=\"POT\">\n+ <Atom charge=\"1.0\" name=\"POT\" type=\"POT-POT\" />\n+ </Residue>\n+ <Residue name=\"CAL\">\n+ <Atom charge=\"2.0\" name=\"CAL\" type=\"CAL-CAL\" />\n+ </Residue>\n+ <Residue name=\"RUB\">\n+ <Atom charge=\"1.0\" name=\"RUB\" type=\"RUB-RUB\" />\n+ </Residue>\n+ <Residue name=\"CES\">\n+ <Atom charge=\"1.0\" name=\"CES\" type=\"CES-CES\" />\n+ </Residue>\n+ <Residue name=\"BAR\">\n+ <Atom charge=\"2.0\" name=\"BAR\" type=\"BAR-BAR\" />\n+ </Residue>\n+ <Residue name=\"ZN2\">\n+ <Atom charge=\"2.0\" name=\"ZN\" type=\"ZN2-ZN\" />\n+ </Residue>\n+ <Residue name=\"CD2\">\n+ <Atom charge=\"2.0\" name=\"CD\" type=\"CD2-CD\" />\n+ </Residue>\n+ <Residue name=\"CLA\">\n+ <Atom charge=\"-1.0\" name=\"CLA\" type=\"CLA-CLA\" />\n+ </Residue>\n+ <Residue name=\"CU1P\">\n+ <Atom charge=\"1.0\" name=\"CU1P\" type=\"CU1P-CU1P\" />\n+ </Residue>\n+ <Residue name=\"AG1P\">\n+ <Atom charge=\"1.0\" name=\"AG1P\" type=\"AG1P-AG1P\" />\n+ </Residue>\n+ <Residue name=\"AU1P\">\n+ <Atom charge=\"1.0\" name=\"AU1P\" type=\"AU1P-AU1P\" />\n+ </Residue>\n+ <Residue name=\"TI1P\">\n+ <Atom charge=\"1.0\" name=\"TI1P\" type=\"TI1P-TI1P\" />\n+ </Residue>\n+ <Residue name=\"BE2P\">\n+ <Atom charge=\"2.0\" name=\"BE2P\" type=\"BE2P-BE2P\" />\n+ </Residue>\n+ <Residue name=\"SR2P\">\n+ <Atom charge=\"2.0\" name=\"SR2P\" type=\"SR2P-SR2P\" />\n+ </Residue>\n+ <Residue name=\"RA2P\">\n+ <Atom charge=\"2.0\" name=\"RA2P\" type=\"RA2P-RA2P\" />\n+ </Residue>\n+ <Residue name=\"V2P\">\n+ <Atom charge=\"2.0\" name=\"V2P\" type=\"V2P-V2P\" />\n+ </Residue>\n+ <Residue name=\"CR2P\">\n+ <Atom charge=\"2.0\" name=\"CR2P\" type=\"CR2P-CR2P\" />\n+ </Residue>\n+ <Residue name=\"MN2P\">\n+ <Atom charge=\"2.0\" name=\"MN2P\" type=\"MN2P-MN2P\" />\n+ </Residue>\n+ <Residue name=\"FE2P\">\n+ <Atom charge=\"2.0\" name=\"FE2P\" type=\"FE2P-FE2P\" />\n+ </Residue>\n+ <Residue name=\"CO2P\">\n+ <Atom charge=\"2.0\" name=\"CO2P\" type=\"CO2P-CO2P\" />\n+ </Residue>\n+ <Residue name=\"NI2P\">\n+ <Atom charge=\"2.0\" name=\"NI2P\" type=\"NI2P-NI2P\" />\n+ </Residue>\n+ <Residue name=\"CU2P\">\n+ <Atom charge=\"2.0\" name=\"CU2P\" type=\"CU2P-CU2P\" />\n+ </Residue>\n+ <Residue name=\"PD2P\">\n+ <Atom charge=\"2.0\" name=\"PD2P\" type=\"PD2P-PD2P\" />\n+ </Residue>\n+ <Residue name=\"AG2P\">\n+ <Atom charge=\"2.0\" name=\"AG2P\" type=\"AG2P-AG2P\" />\n+ </Residue>\n+ <Residue name=\"SN2P\">\n+ <Atom charge=\"2.0\" name=\"SN2P\" type=\"SN2P-SN2P\" />\n+ </Residue>\n+ <Residue name=\"PT2P\">\n+ <Atom charge=\"2.0\" name=\"PT2P\" type=\"PT2P-PT2P\" />\n+ </Residue>\n+ <Residue name=\"HG2P\">\n+ <Atom charge=\"2.0\" name=\"HG2P\" type=\"HG2P-HG2P\" />\n+ </Residue>\n+ <Residue name=\"PB2P\">\n+ <Atom charge=\"2.0\" name=\"PB2P\" type=\"PB2P-PB2P\" />\n+ </Residue>\n+ <Residue name=\"SM2P\">\n+ <Atom charge=\"2.0\" name=\"SM2P\" type=\"SM2P-SM2P\" />\n+ </Residue>\n+ <Residue name=\"EU2P\">\n+ <Atom charge=\"2.0\" name=\"EU2P\" type=\"EU2P-EU2P\" />\n+ </Residue>\n+ <Residue name=\"YB2P\">\n+ <Atom charge=\"2.0\" name=\"YB2P\" type=\"YB2P-YB2P\" />\n+ </Residue>\n+ <Residue name=\"AL3P\">\n+ <Atom charge=\"3.0\" name=\"AL3P\" type=\"AL3P-AL3P\" />\n+ </Residue>\n+ <Residue name=\"SC3P\">\n+ <Atom charge=\"3.0\" name=\"SC3P\" type=\"SC3P-SC3P\" />\n+ </Residue>\n+ <Residue name=\"Y3P\">\n+ <Atom charge=\"3.0\" name=\"Y3P\" type=\"Y3P-Y3P\" />\n+ </Residue>\n+ <Residue name=\"LA3P\">\n+ <Atom charge=\"3.0\" name=\"LA3P\" type=\"LA3P-LA3P\" />\n+ </Residue>\n+ <Residue name=\"CE3P\">\n+ <Atom charge=\"3.0\" name=\"CE3P\" type=\"CE3P-CE3P\" />\n+ </Residue>\n+ <Residue name=\"PR3P\">\n+ <Atom charge=\"3.0\" name=\"PR3P\" type=\"PR3P-PR3P\" />\n+ </Residue>\n+ <Residue name=\"ND3P\">\n+ <Atom charge=\"3.0\" name=\"ND3P\" type=\"ND3P-ND3P\" />\n+ </Residue>\n+ <Residue name=\"PM3P\">\n+ <Atom charge=\"3.0\" name=\"PM3P\" type=\"PM3P-PM3P\" />\n+ </Residue>\n+ <Residue name=\"SM3P\">\n+ <Atom charge=\"3.0\" name=\"SM3P\" type=\"SM3P-SM3P\" />\n+ </Residue>\n+ <Residue name=\"EU3P\">\n+ <Atom charge=\"3.0\" name=\"EU3P\" type=\"EU3P-EU3P\" />\n+ </Residue>\n+ <Residue name=\"GD3P\">\n+ <Atom charge=\"3.0\" name=\"GD3P\" type=\"GD3P-GD3P\" />\n+ </Residue>\n+ <Residue name=\"TB3P\">\n+ <Atom charge=\"3.0\" name=\"TB3P\" type=\"TB3P-TB3P\" />\n+ </Residue>\n+ <Residue name=\"DY3P\">\n+ <Atom charge=\"3.0\" name=\"DY3P\" type=\"DY3P-DY3P\" />\n+ </Residue>\n+ <Residue name=\"HO3P\">\n+ <Atom charge=\"3.0\" name=\"HO3P\" type=\"HO3P-HO3P\" />\n+ </Residue>\n+ <Residue name=\"ER3P\">\n+ <Atom charge=\"3.0\" name=\"ER3P\" type=\"ER3P-ER3P\" />\n+ </Residue>\n+ <Residue name=\"YB3P\">\n+ <Atom charge=\"3.0\" name=\"YB3P\" type=\"YB3P-YB3P\" />\n+ </Residue>\n+ <Residue name=\"LU3P\">\n+ <Atom charge=\"3.0\" name=\"LU3P\" type=\"LU3P-LU3P\" />\n+ </Residue>\n+ <Residue name=\"U3P\">\n+ <Atom charge=\"3.0\" name=\"U3P\" type=\"U3P-U3P\" />\n+ </Residue>\n+ <Residue name=\"PU3P\">\n+ <Atom charge=\"3.0\" name=\"PU3P\" type=\"PU3P-PU3P\" />\n+ </Residue>\n+ <Residue name=\"TI3P\">\n+ <Atom charge=\"3.0\" name=\"TI3P\" type=\"TI3P-TI3P\" />\n+ </Residue>\n+ <Residue name=\"V3P\">\n+ <Atom charge=\"3.0\" name=\"V3P\" type=\"V3P-V3P\" />\n+ </Residue>\n+ <Residue name=\"CR3P\">\n+ <Atom charge=\"3.0\" name=\"CR3P\" type=\"CR3P-CR3P\" />\n+ </Residue>\n+ <Residue name=\"MN3P\">\n+ <Atom charge=\"3.0\" name=\"MN3P\" type=\"MN3P-MN3P\" />\n+ </Residue>\n+ <Residue name=\"FE3P\">\n+ <Atom charge=\"3.0\" name=\"FE3P\" type=\"FE3P-FE3P\" />\n+ </Residue>\n+ <Residue name=\"CO3P\">\n+ <Atom charge=\"3.0\" name=\"CO3P\" type=\"CO3P-CO3P\" />\n+ </Residue>\n+ <Residue name=\"GA3P\">\n+ <Atom charge=\"3.0\" name=\"GA3P\" type=\"GA3P-GA3P\" />\n+ </Residue>\n+ <Residue name=\"RH3P\">\n+ <Atom charge=\"3.0\" name=\"RH3P\" type=\"RH3P-RH3P\" />\n+ </Residue>\n+ <Residue name=\"IN3P\">\n+ <Atom charge=\"3.0\" name=\"IN3P\" type=\"IN3P-IN3P\" />\n+ </Residue>\n+ <Residue name=\"AU3P\">\n+ <Atom charge=\"3.0\" name=\"AU3P\" type=\"AU3P-AU3P\" />\n+ </Residue>\n+ <Residue name=\"TL3P\">\n+ <Atom charge=\"3.0\" name=\"TL3P\" type=\"TL3P-TL3P\" />\n+ </Residue>\n+ <Residue name=\"BI3P\">\n+ <Atom charge=\"3.0\" name=\"BI3P\" type=\"BI3P-BI3P\" />\n+ </Residue>\n+ </Residues>\n+ <HarmonicBondForce>\n+ <Bond class1=\"HT\" class2=\"HT\" k=\"0.0\" length=\"0.1633\" />\n+ <Bond class1=\"HT\" class2=\"OT\" k=\"376559.99999999994\" length=\"0.1\" />\n+ <Bond class1=\"OX\" class2=\"HX\" k=\"456055.99999999994\" length=\"0.097\" />\n+ </HarmonicBondForce>\n+ <HarmonicAngleForce>\n+ <Angle angle=\"1.9106119321581925\" class1=\"HT\" class2=\"OT\" class3=\"HT\" k=\"460.24\" />\n+ </HarmonicAngleForce>\n+ <AmoebaUreyBradleyForce />\n+ <NonbondedForce coulomb14scale=\"1.0\" lj14scale=\"1.0\">\n+ <UseAttributeFromResidue name=\"charge\" />\n+ <Atom class=\"HT\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"HX\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"OT\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"OX\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"LIT\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"SOD\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"MG\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"POT\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"CAL\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"RUB\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"CES\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"BAR\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"ZN\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"CAD\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"CLA\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"CU1P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"AG1P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"AU1P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"TI1P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"BE2P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"SR2P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"RA2P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"V2P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"CR2P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"MN2P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"FE2P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"CO2P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"NI2P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"CU2P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"PD2P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"AG2P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"SN2P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"PT2P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"HG2P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"PB2P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"SM2P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"EU2P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"YB2P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"AL3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"SC3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"Y3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"LA3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"CE3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"PR3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"ND3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"PM3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"SM3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"EU3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"GD3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"TB3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"DY3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"HO3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"ER3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"TM3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"YB3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"LU3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"U3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"PU3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"TI3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"V3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"CR3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"MN3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"FE3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"CO3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"GA3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"RH3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"IN3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"AU3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"TL3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"BI3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ </NonbondedForce>\n+ <LennardJonesForce lj14scale=\"1.0\">\n+ <Atom class=\"HT\" epsilon=\"4.184e-06\" sigma=\"1.7817974362806786e-05\" />\n+ <Atom class=\"HX\" epsilon=\"0.192464\" sigma=\"0.04000135244450124\" />\n+ <Atom class=\"OT\" epsilon=\"0.64973336\" sigma=\"0.3165541325296254\" />\n+ <Atom class=\"OX\" epsilon=\"0.50208\" sigma=\"0.30290556416771536\" />\n+ <Atom class=\"LIT\" epsilon=\"0.00974872\" sigma=\"0.23118821735741807\" />\n+ <Atom class=\"SOD\" epsilon=\"0.1962296\" sigma=\"0.2513670733232967\" />\n+ <Atom class=\"MG\" epsilon=\"0.06276\" sigma=\"0.2111429961992604\" />\n+ <Atom class=\"POT\" epsilon=\"0.364008\" sigma=\"0.3142645228240047\" />\n+ <Atom class=\"CAL\" epsilon=\"0.50208\" sigma=\"0.24357170953956878\" />\n+ <Atom class=\"RUB\" epsilon=\"0.6276\" sigma=\"0.3385415128933289\" />\n+ <Atom class=\"CES\" epsilon=\"0.79496\" sigma=\"0.37417746161894255\" />\n+ <Atom class=\"BAR\" epsilon=\"0.6276\" sigma=\"0.33675971545704825\" />\n+ <Atom class=\"ZN\" epsilon=\"1.046\" sigma=\"0.194215920554594\" />\n+ <Atom class=\"CAD\" epsilon=\"0.50208\" sigma=\"0.2417899121032881\" />\n+ <Atom class=\"CLA\" epsilon=\"0.6276\" sigma=\"0.4044680180357141\" />\n+ <Atom class=\"CU1P\" epsilon=\"0.7748768\" sigma=\"0.1535909390073945\" />\n+ <Atom class=\"AG1P\" epsilon=\"1.2008079999999999\" sigma=\"0.2163636626875628\" />\n+ <Atom class=\"AU1P\" epsilon=\"1.4907592\" sigma=\"0.11250269012676205\" />\n+ <Atom class=\"TI1P\" epsilon=\"1.7016328\" sigma=\"0.34401163102271065\" />\n+ <Atom class=\"BE2P\" epsilon=\"0.4250944\" sigma=\"0.007127189745122714\" />\n+ <Atom class=\"SR2P\" epsilon=\"0.9572992\" sigma=\"0.3306837861993312\" />\n+ <Atom class=\"RA2P\" epsilon=\"1.2631496\" sigma=\"0.37237784620829906\" />\n+ <Atom class=\"V2P\" epsilon=\"0.6732056\" sigma=\"0.1966569830422985\" />\n+ <Atom class=\"CR2P\" epsilon=\"0.6974728\" sigma=\"0.18872798445084948\" />\n+ <Atom class=\"MN2P\" epsilon=\"0.7050040000000001\" sigma=\"0.2144749574051053\" />\n+ <Atom class=\"FE2P\" epsilon=\"0.667348\" sigma=\"0.1924519410926761\" />\n+ <Atom class=\"CO2P\" epsilon=\"0.6439176000000001\" sigma=\"0.16527953018939576\" />\n+ <Atom class=\"NI2P\" epsilon=\"0.5999856\" sigma=\"0.13903365395298137\" />\n+ <Atom class=\"CU2P\" epsilon=\"0.629692\" sigma=\"0.129198132104712\" />\n+ <Atom class=\"PD2P\" epsilon=\"0.7288528\" sigma=\"0.16519044031758173\" />\n+ <Atom class=\"AG2P\" epsilon=\"0.7752952\" sigma=\"0.1869105510658432\" />\n+ <Atom class=\"SN2P\" epsilon=\"0.7861736\" sigma=\"0.29542201493533654\" />\n+ <Atom class=\"PT2P\" epsilon=\"0.6824104\" sigma=\"0.1420270736459329\" />\n+ <Atom class=\"HG2P\" epsilon=\"0.8593936\" sigma=\"0.2105728210196506\" />\n+ <Atom class=\"PB2P\" epsilon=\"1.0016496000000001\" sigma=\"0.3132399892981433\" />\n+ <Atom class=\"SM2P\" epsilon=\"1.0242432\" sigma=\"0.330790694045508\" />\n+ <Atom class=\"EU2P\" epsilon=\"0.9907712000000001\" sigma=\"0.3279220001730961\" />\n+ <Atom class=\"YB2P\" epsilon=\"0.8593936\" sigma=\"0.28669120749756116\" />\n+ <Atom class=\"AL3P\" epsilon=\"0.44601440000000003\" sigma=\"0.039377723341803\" />\n+ <Atom class=\"SC3P\" epsilon=\"0.5899439999999999\" sigma=\"0.19544536078562763\" />\n+ <Atom class=\"Y3P\" epsilon=\"0.6928704\" sigma=\"0.25183924964391113\" />\n+ <Atom class=\"LA3P\" epsilon=\"0.7932864\" sigma=\"0.3158592315294759\" />\n+ <Atom class=\"CE3P\" epsilon=\"0.7702744000000001\" sigma=\"0.30495463121943817\" />\n+ <Atom class=\"PR3P\" epsilon=\"0.7627432\" sigma=\"0.2956180126533274\" />\n+ <Atom class=\"ND3P\" epsilon=\"0.7497728\" sigma=\"0.2886333667031071\" />\n+ <Atom class=\"PM3P\" epsilon=\"0.74266\" sigma=\"0.29527947114043407\" />\n+ <Atom class=\"SM3P\" epsilon=\"0.7351288\" sigma=\"0.2791542043420939\" />\n+ <Atom class=\"EU3P\" epsilon=\"0.728016\" sigma=\"0.2713677495455473\" />\n+ <Atom class=\"GD3P\" epsilon=\"0.7209032000000001\" sigma=\"0.2681605141602421\" />\n+ <Atom class=\"TB3P\" epsilon=\"0.7083512000000001\" sigma=\"0.2628151218514001\" />\n+ <Atom class=\"DY3P\" epsilon=\"0.6999832\" sigma=\"0.2573628216963812\" />\n+ <Atom class=\"HO3P\" epsilon=\"0.6928704\" sigma=\"0.247794569463554\" />\n+ <Atom class=\"ER3P\" epsilon=\"0.6845024\" sigma=\"0.24362516346265717\" />\n+ <Atom class=\"TM3P\" epsilon=\"0.6778080000000001\" sigma=\"0.24029320225681233\" />\n+ <Atom class=\"YB3P\" epsilon=\"0.6711136\" sigma=\"0.23077840394707347\" />\n+ <Atom class=\"LU3P\" epsilon=\"0.6644192\" sigma=\"0.2407564695902453\" />\n+ <Atom class=\"U3P\" epsilon=\"0.7932864\" sigma=\"0.3031193798600691\" />\n+ <Atom class=\"PU3P\" epsilon=\"0.7702744000000001\" sigma=\"0.29750671793578487\" />\n+ <Atom class=\"TI3P\" epsilon=\"0.537644\" sigma=\"0.14769318949330543\" />\n+ <Atom class=\"V3P\" epsilon=\"0.5171424\" sigma=\"0.10943799853635927\" />\n+ <Atom class=\"CR3P\" epsilon=\"0.5045904\" sigma=\"0.15022334185282402\" />\n+ <Atom class=\"MN3P\" epsilon=\"0.5238368\" sigma=\"0.06849229345062928\" />\n+ <Atom class=\"FE3P\" epsilon=\"0.5238368\" sigma=\"0.10090318881657484\" />\n+ <Atom class=\"CO3P\" epsilon=\"0.4983144\" sigma=\"0.04598819183040431\" />\n+ <Atom class=\"GA3P\" epsilon=\"0.5045904\" sigma=\"0.04042898382920859\" />\n+ <Atom class=\"RH3P\" epsilon=\"0.537644\" sigma=\"0.0821943157356277\" />\n+ <Atom class=\"IN3P\" epsilon=\"0.6163031999999999\" sigma=\"0.15435711190499518\" />\n+ <Atom class=\"AU3P\" epsilon=\"0.5564720000000001\" sigma=\"0.065106878321696\" />\n+ <Atom class=\"TL3P\" epsilon=\"0.6815736\" sigma=\"0.15489165113587938\" />\n+ <Atom class=\"BI3P\" epsilon=\"0.7740400000000001\" sigma=\"0.24378552523192246\" />\n+ <NBFixPair class1=\"CLA\" class2=\"SOD\" epsilon=\"0.35093300000000005\" sigma=\"0.3323943117381606\" />\n+ <NBFixPair class1=\"CLA\" class2=\"POT\" epsilon=\"0.477963424\" sigma=\"0.3635757668730725\" />\n+ <NBFixPair class1=\"OC\" class2=\"SOD\" epsilon=\"0.31388368000000005\" sigma=\"0.28419669108676826\" />\n+ <NBFixPair class1=\"OCL\" class2=\"SOD\" epsilon=\"0.31388368000000005\" sigma=\"0.28419669108676826\" />\n+ <NBFixPair class1=\"OC2D2\" class2=\"SOD\" epsilon=\"0.31388368000000005\" sigma=\"0.28419669108676826\" />\n+ <NBFixPair class1=\"OG2D2\" class2=\"SOD\" epsilon=\"0.31388368000000005\" sigma=\"0.28419669108676826\" />\n+ </LennardJonesForce>\n+ <InitializationScript>\n+EXPECTED_VERSION = \"charmm36_2024\"\n+if hasattr(self, \"_charmm_ff_version\"):\n+ if self._charmm_ff_version != EXPECTED_VERSION:\n+ raise RuntimeError(f\"CHARMM force field versions ({self._charmm_ff_version} and {EXPECTED_VERSION}) incompatible\")\n+else:\n+ self._charmm_ff_version = EXPECTED_VERSION\n+ </InitializationScript>\n+</ForceField>\n\\ No newline at end of file\ndiff --git a/wrappers/python/openmm/app/data/charmm36_2024/tip3p-pme-b.xml b/wrappers/python/openmm/app/data/charmm36_2024/tip3p-pme-b.xml\nnew file mode 100644\nindex 0000000000..3c28f49935\n--- /dev/null\n+++ b/wrappers/python/openmm/app/data/charmm36_2024/tip3p-pme-b.xml\n@@ -0,0 +1,460 @@\n+<ForceField>\n+ <Info>\n+ <DateGenerated>2025-02-27</DateGenerated>\n+ <Source Source=\"toppar/non_charmm/toppar_water_ions_tip3p_pme_b.str\" md5hash=\"772b85f388766661707343bb1947dc1a\" sourcePackage=\"charmm36\" sourcePackageVersion=\"toppar_c36_jul24.tgz\">toppar/non_charmm/toppar_water_ions_tip3p_pme_b.str</Source>\n+ <Source Source=\"toppar/stream/misc/toppar_ions_won.str\" md5hash=\"f523f7727e7dfa25468cc75f9b880c5b\" sourcePackage=\"charmm36\" sourcePackageVersion=\"toppar_c36_jul24.tgz\">toppar/stream/misc/toppar_ions_won.str</Source>\n+ <Reference Reference=\"D.J. Price and C.L. Brooks III. A modified TIP3P water potential for simulation with Ewald summation. J. Chem. Phys. 121:10096-10103, 2004.\" forcefield=\"tip3p-pme-b\">D.J. Price and C.L. Brooks III. A modified TIP3P water potential for simulation with Ewald summation. J. Chem. Phys. 121:10096-10103, 2004.</Reference>\n+ <Reference Reference=\"Beglov, D. and Roux, B., Finite Representation of an Infinite Bulk System: Solvent Boundary Potential for Computer Simulations, Journal of Chemical Physics, 1994, 100: 9050-9063\" forcefield=\"ions\">Beglov, D. and Roux, B., Finite Representation of an Infinite Bulk System: Solvent Boundary Potential for Computer Simulations, Journal of Chemical Physics, 1994, 100: 9050-9063</Reference>\n+ <Reference Reference=\"Stote, R.H. and Karplus, M. Zinc Binding in Proteins and Solution: A Simple but Accurate Nonbonded Representation, PROTEINS: Structure, Function, and Genetics 23:12-31 (1995)\" forcefield=\"ions\">Stote, R.H. and Karplus, M. Zinc Binding in Proteins and Solution: A Simple but Accurate Nonbonded Representation, PROTEINS: Structure, Function, and Genetics 23:12-31 (1995)</Reference>\n+ <Reference Reference=\"Won, Y., "Force Field for Monovalent, Divalent, and Trivalent Cations Developed under the Solvent Boundary Potential," Journal of Physical Chemistry A., 116: 11763-11767, 2012.\" forcefield=\"ions\">Won, Y., \"Force Field for Monovalent, Divalent, and Trivalent Cations Developed under the Solvent Boundary Potential,\" Journal of Physical Chemistry A., 116: 11763-11767, 2012.</Reference>\n+ </Info>\n+ <AtomTypes>\n+ <Type class=\"OT\" element=\"O\" mass=\"15.9994\" name=\"TP3B-OH2\" />\n+ <Type class=\"HT\" element=\"H\" mass=\"1.008\" name=\"TP3B-H1\" />\n+ <Type class=\"HT\" element=\"H\" mass=\"1.008\" name=\"TP3B-H2\" />\n+ <Type class=\"OX\" element=\"O\" mass=\"15.9994\" name=\"OH-O1\" />\n+ <Type class=\"HX\" element=\"H\" mass=\"1.008\" name=\"OH-H1\" />\n+ <Type class=\"LIT\" element=\"Li\" mass=\"6.941\" name=\"LIT-LIT\" />\n+ <Type class=\"SOD\" element=\"Na\" mass=\"22.98977\" name=\"SOD-SOD\" />\n+ <Type class=\"MG\" element=\"Mg\" mass=\"24.305\" name=\"MG-MG\" />\n+ <Type class=\"POT\" element=\"K\" mass=\"39.0983\" name=\"POT-POT\" />\n+ <Type class=\"CAL\" element=\"Ca\" mass=\"40.08\" name=\"CAL-CAL\" />\n+ <Type class=\"RUB\" element=\"Rb\" mass=\"85.4678\" name=\"RUB-RUB\" />\n+ <Type class=\"CES\" element=\"Cs\" mass=\"132.90545\" name=\"CES-CES\" />\n+ <Type class=\"BAR\" element=\"Ba\" mass=\"137.327\" name=\"BAR-BAR\" />\n+ <Type class=\"ZN\" element=\"Zn\" mass=\"65.37\" name=\"ZN2-ZN\" />\n+ <Type class=\"CAD\" element=\"Cd\" mass=\"112.411\" name=\"CD2-CD\" />\n+ <Type class=\"CLA\" element=\"Cl\" mass=\"35.45\" name=\"CLA-CLA\" />\n+ <Type class=\"CU1P\" element=\"Cu\" mass=\"63.546\" name=\"CU1P-CU1P\" />\n+ <Type class=\"AG1P\" element=\"Ag\" mass=\"107.87\" name=\"AG1P-AG1P\" />\n+ <Type class=\"AU1P\" element=\"Au\" mass=\"196.97\" name=\"AU1P-AU1P\" />\n+ <Type class=\"TI1P\" element=\"Ti\" mass=\"47.867\" name=\"TI1P-TI1P\" />\n+ <Type class=\"BE2P\" element=\"Be\" mass=\"9.0122\" name=\"BE2P-BE2P\" />\n+ <Type class=\"SR2P\" element=\"Sr\" mass=\"87.62\" name=\"SR2P-SR2P\" />\n+ <Type class=\"RA2P\" element=\"Ra\" mass=\"226.03\" name=\"RA2P-RA2P\" />\n+ <Type class=\"V2P\" element=\"V\" mass=\"50.942\" name=\"V2P-V2P\" />\n+ <Type class=\"CR2P\" element=\"Cr\" mass=\"51.996\" name=\"CR2P-CR2P\" />\n+ <Type class=\"MN2P\" element=\"Mn\" mass=\"54.938\" name=\"MN2P-MN2P\" />\n+ <Type class=\"FE2P\" element=\"Fe\" mass=\"55.854\" name=\"FE2P-FE2P\" />\n+ <Type class=\"CO2P\" element=\"Co\" mass=\"58.933\" name=\"CO2P-CO2P\" />\n+ <Type class=\"NI2P\" element=\"Ni\" mass=\"58.693\" name=\"NI2P-NI2P\" />\n+ <Type class=\"CU2P\" element=\"Cu\" mass=\"63.546\" name=\"CU2P-CU2P\" />\n+ <Type class=\"PD2P\" element=\"Pd\" mass=\"106.42\" name=\"PD2P-PD2P\" />\n+ <Type class=\"AG2P\" element=\"Ag\" mass=\"107.87\" name=\"AG2P-AG2P\" />\n+ <Type class=\"SN2P\" element=\"Sn\" mass=\"118.71\" name=\"SN2P-SN2P\" />\n+ <Type class=\"PT2P\" element=\"Pt\" mass=\"195.08\" name=\"PT2P-PT2P\" />\n+ <Type class=\"HG2P\" element=\"Hg\" mass=\"200.59\" name=\"HG2P-HG2P\" />\n+ <Type class=\"PB2P\" element=\"Pb\" mass=\"207.2\" name=\"PB2P-PB2P\" />\n+ <Type class=\"SM2P\" element=\"Sm\" mass=\"150.36\" name=\"SM2P-SM2P\" />\n+ <Type class=\"EU2P\" element=\"Eu\" mass=\"151.96\" name=\"EU2P-EU2P\" />\n+ <Type class=\"YB2P\" element=\"Yb\" mass=\"173.05\" name=\"YB2P-YB2P\" />\n+ <Type class=\"AL3P\" element=\"Al\" mass=\"26.982\" name=\"AL3P-AL3P\" />\n+ <Type class=\"SC3P\" element=\"Sc\" mass=\"44.956\" name=\"SC3P-SC3P\" />\n+ <Type class=\"Y3P\" element=\"Y\" mass=\"88.906\" name=\"Y3P-Y3P\" />\n+ <Type class=\"LA3P\" element=\"La\" mass=\"138.91\" name=\"LA3P-LA3P\" />\n+ <Type class=\"CE3P\" element=\"Ce\" mass=\"140.12\" name=\"CE3P-CE3P\" />\n+ <Type class=\"PR3P\" element=\"Pr\" mass=\"140.91\" name=\"PR3P-PR3P\" />\n+ <Type class=\"ND3P\" element=\"Nd\" mass=\"144.24\" name=\"ND3P-ND3P\" />\n+ <Type class=\"PM3P\" element=\"Pm\" mass=\"144.91\" name=\"PM3P-PM3P\" />\n+ <Type class=\"SM3P\" element=\"Sm\" mass=\"150.36\" name=\"SM3P-SM3P\" />\n+ <Type class=\"EU3P\" element=\"Eu\" mass=\"151.96\" name=\"EU3P-EU3P\" />\n+ <Type class=\"GD3P\" element=\"Gd\" mass=\"157.25\" name=\"GD3P-GD3P\" />\n+ <Type class=\"TB3P\" element=\"Tb\" mass=\"158.93\" name=\"TB3P-TB3P\" />\n+ <Type class=\"DY3P\" element=\"Dy\" mass=\"162.5\" name=\"DY3P-DY3P\" />\n+ <Type class=\"HO3P\" element=\"Ho\" mass=\"164.93\" name=\"HO3P-HO3P\" />\n+ <Type class=\"ER3P\" element=\"Er\" mass=\"167.28\" name=\"ER3P-ER3P\" />\n+ <Type class=\"YB3P\" element=\"Yb\" mass=\"173.05\" name=\"YB3P-YB3P\" />\n+ <Type class=\"LU3P\" element=\"Lu\" mass=\"174.97\" name=\"LU3P-LU3P\" />\n+ <Type class=\"U3P\" element=\"U\" mass=\"238.03\" name=\"U3P-U3P\" />\n+ <Type class=\"PU3P\" element=\"Pu\" mass=\"244.06\" name=\"PU3P-PU3P\" />\n+ <Type class=\"TI3P\" element=\"Ti\" mass=\"47.867\" name=\"TI3P-TI3P\" />\n+ <Type class=\"V3P\" element=\"V\" mass=\"50.942\" name=\"V3P-V3P\" />\n+ <Type class=\"CR3P\" element=\"Cr\" mass=\"51.996\" name=\"CR3P-CR3P\" />\n+ <Type class=\"MN3P\" element=\"Mn\" mass=\"54.938\" name=\"MN3P-MN3P\" />\n+ <Type class=\"FE3P\" element=\"Fe\" mass=\"55.854\" name=\"FE3P-FE3P\" />\n+ <Type class=\"CO3P\" element=\"Co\" mass=\"58.933\" name=\"CO3P-CO3P\" />\n+ <Type class=\"GA3P\" element=\"Ga\" mass=\"69.723\" name=\"GA3P-GA3P\" />\n+ <Type class=\"RH3P\" element=\"Rh\" mass=\"102.91\" name=\"RH3P-RH3P\" />\n+ <Type class=\"IN3P\" element=\"In\" mass=\"114.82\" name=\"IN3P-IN3P\" />\n+ <Type class=\"AU3P\" element=\"Au\" mass=\"196.97\" name=\"AU3P-AU3P\" />\n+ <Type class=\"TL3P\" element=\"Tl\" mass=\"204.38\" name=\"TL3P-TL3P\" />\n+ <Type class=\"BI3P\" element=\"Bi\" mass=\"208.98\" name=\"BI3P-BI3P\" />\n+ </AtomTypes>\n+ <Residues>\n+ <Residue name=\"TP3B\">\n+ <Atom charge=\"-0.83\" name=\"OH2\" type=\"TP3B-OH2\" />\n+ <Atom charge=\"0.415\" name=\"H1\" type=\"TP3B-H1\" />\n+ <Atom charge=\"0.415\" name=\"H2\" type=\"TP3B-H2\" />\n+ <Bond atomName1=\"OH2\" atomName2=\"H1\" />\n+ <Bond atomName1=\"OH2\" atomName2=\"H2\" />\n+ </Residue>\n+ <Residue name=\"OH\">\n+ <Atom charge=\"-1.32\" name=\"O1\" type=\"OH-O1\" />\n+ <Atom charge=\"0.32\" name=\"H1\" type=\"OH-H1\" />\n+ <Bond atomName1=\"O1\" atomName2=\"H1\" />\n+ </Residue>\n+ <Residue name=\"LIT\">\n+ <Atom charge=\"1.0\" name=\"LIT\" type=\"LIT-LIT\" />\n+ </Residue>\n+ <Residue name=\"SOD\">\n+ <Atom charge=\"1.0\" name=\"SOD\" type=\"SOD-SOD\" />\n+ </Residue>\n+ <Residue name=\"MG\">\n+ <Atom charge=\"2.0\" name=\"MG\" type=\"MG-MG\" />\n+ </Residue>\n+ <Residue name=\"POT\">\n+ <Atom charge=\"1.0\" name=\"POT\" type=\"POT-POT\" />\n+ </Residue>\n+ <Residue name=\"CAL\">\n+ <Atom charge=\"2.0\" name=\"CAL\" type=\"CAL-CAL\" />\n+ </Residue>\n+ <Residue name=\"RUB\">\n+ <Atom charge=\"1.0\" name=\"RUB\" type=\"RUB-RUB\" />\n+ </Residue>\n+ <Residue name=\"CES\">\n+ <Atom charge=\"1.0\" name=\"CES\" type=\"CES-CES\" />\n+ </Residue>\n+ <Residue name=\"BAR\">\n+ <Atom charge=\"2.0\" name=\"BAR\" type=\"BAR-BAR\" />\n+ </Residue>\n+ <Residue name=\"ZN2\">\n+ <Atom charge=\"2.0\" name=\"ZN\" type=\"ZN2-ZN\" />\n+ </Residue>\n+ <Residue name=\"CD2\">\n+ <Atom charge=\"2.0\" name=\"CD\" type=\"CD2-CD\" />\n+ </Residue>\n+ <Residue name=\"CLA\">\n+ <Atom charge=\"-1.0\" name=\"CLA\" type=\"CLA-CLA\" />\n+ </Residue>\n+ <Residue name=\"CU1P\">\n+ <Atom charge=\"1.0\" name=\"CU1P\" type=\"CU1P-CU1P\" />\n+ </Residue>\n+ <Residue name=\"AG1P\">\n+ <Atom charge=\"1.0\" name=\"AG1P\" type=\"AG1P-AG1P\" />\n+ </Residue>\n+ <Residue name=\"AU1P\">\n+ <Atom charge=\"1.0\" name=\"AU1P\" type=\"AU1P-AU1P\" />\n+ </Residue>\n+ <Residue name=\"TI1P\">\n+ <Atom charge=\"1.0\" name=\"TI1P\" type=\"TI1P-TI1P\" />\n+ </Residue>\n+ <Residue name=\"BE2P\">\n+ <Atom charge=\"2.0\" name=\"BE2P\" type=\"BE2P-BE2P\" />\n+ </Residue>\n+ <Residue name=\"SR2P\">\n+ <Atom charge=\"2.0\" name=\"SR2P\" type=\"SR2P-SR2P\" />\n+ </Residue>\n+ <Residue name=\"RA2P\">\n+ <Atom charge=\"2.0\" name=\"RA2P\" type=\"RA2P-RA2P\" />\n+ </Residue>\n+ <Residue name=\"V2P\">\n+ <Atom charge=\"2.0\" name=\"V2P\" type=\"V2P-V2P\" />\n+ </Residue>\n+ <Residue name=\"CR2P\">\n+ <Atom charge=\"2.0\" name=\"CR2P\" type=\"CR2P-CR2P\" />\n+ </Residue>\n+ <Residue name=\"MN2P\">\n+ <Atom charge=\"2.0\" name=\"MN2P\" type=\"MN2P-MN2P\" />\n+ </Residue>\n+ <Residue name=\"FE2P\">\n+ <Atom charge=\"2.0\" name=\"FE2P\" type=\"FE2P-FE2P\" />\n+ </Residue>\n+ <Residue name=\"CO2P\">\n+ <Atom charge=\"2.0\" name=\"CO2P\" type=\"CO2P-CO2P\" />\n+ </Residue>\n+ <Residue name=\"NI2P\">\n+ <Atom charge=\"2.0\" name=\"NI2P\" type=\"NI2P-NI2P\" />\n+ </Residue>\n+ <Residue name=\"CU2P\">\n+ <Atom charge=\"2.0\" name=\"CU2P\" type=\"CU2P-CU2P\" />\n+ </Residue>\n+ <Residue name=\"PD2P\">\n+ <Atom charge=\"2.0\" name=\"PD2P\" type=\"PD2P-PD2P\" />\n+ </Residue>\n+ <Residue name=\"AG2P\">\n+ <Atom charge=\"2.0\" name=\"AG2P\" type=\"AG2P-AG2P\" />\n+ </Residue>\n+ <Residue name=\"SN2P\">\n+ <Atom charge=\"2.0\" name=\"SN2P\" type=\"SN2P-SN2P\" />\n+ </Residue>\n+ <Residue name=\"PT2P\">\n+ <Atom charge=\"2.0\" name=\"PT2P\" type=\"PT2P-PT2P\" />\n+ </Residue>\n+ <Residue name=\"HG2P\">\n+ <Atom charge=\"2.0\" name=\"HG2P\" type=\"HG2P-HG2P\" />\n+ </Residue>\n+ <Residue name=\"PB2P\">\n+ <Atom charge=\"2.0\" name=\"PB2P\" type=\"PB2P-PB2P\" />\n+ </Residue>\n+ <Residue name=\"SM2P\">\n+ <Atom charge=\"2.0\" name=\"SM2P\" type=\"SM2P-SM2P\" />\n+ </Residue>\n+ <Residue name=\"EU2P\">\n+ <Atom charge=\"2.0\" name=\"EU2P\" type=\"EU2P-EU2P\" />\n+ </Residue>\n+ <Residue name=\"YB2P\">\n+ <Atom charge=\"2.0\" name=\"YB2P\" type=\"YB2P-YB2P\" />\n+ </Residue>\n+ <Residue name=\"AL3P\">\n+ <Atom charge=\"3.0\" name=\"AL3P\" type=\"AL3P-AL3P\" />\n+ </Residue>\n+ <Residue name=\"SC3P\">\n+ <Atom charge=\"3.0\" name=\"SC3P\" type=\"SC3P-SC3P\" />\n+ </Residue>\n+ <Residue name=\"Y3P\">\n+ <Atom charge=\"3.0\" name=\"Y3P\" type=\"Y3P-Y3P\" />\n+ </Residue>\n+ <Residue name=\"LA3P\">\n+ <Atom charge=\"3.0\" name=\"LA3P\" type=\"LA3P-LA3P\" />\n+ </Residue>\n+ <Residue name=\"CE3P\">\n+ <Atom charge=\"3.0\" name=\"CE3P\" type=\"CE3P-CE3P\" />\n+ </Residue>\n+ <Residue name=\"PR3P\">\n+ <Atom charge=\"3.0\" name=\"PR3P\" type=\"PR3P-PR3P\" />\n+ </Residue>\n+ <Residue name=\"ND3P\">\n+ <Atom charge=\"3.0\" name=\"ND3P\" type=\"ND3P-ND3P\" />\n+ </Residue>\n+ <Residue name=\"PM3P\">\n+ <Atom charge=\"3.0\" name=\"PM3P\" type=\"PM3P-PM3P\" />\n+ </Residue>\n+ <Residue name=\"SM3P\">\n+ <Atom charge=\"3.0\" name=\"SM3P\" type=\"SM3P-SM3P\" />\n+ </Residue>\n+ <Residue name=\"EU3P\">\n+ <Atom charge=\"3.0\" name=\"EU3P\" type=\"EU3P-EU3P\" />\n+ </Residue>\n+ <Residue name=\"GD3P\">\n+ <Atom charge=\"3.0\" name=\"GD3P\" type=\"GD3P-GD3P\" />\n+ </Residue>\n+ <Residue name=\"TB3P\">\n+ <Atom charge=\"3.0\" name=\"TB3P\" type=\"TB3P-TB3P\" />\n+ </Residue>\n+ <Residue name=\"DY3P\">\n+ <Atom charge=\"3.0\" name=\"DY3P\" type=\"DY3P-DY3P\" />\n+ </Residue>\n+ <Residue name=\"HO3P\">\n+ <Atom charge=\"3.0\" name=\"HO3P\" type=\"HO3P-HO3P\" />\n+ </Residue>\n+ <Residue name=\"ER3P\">\n+ <Atom charge=\"3.0\" name=\"ER3P\" type=\"ER3P-ER3P\" />\n+ </Residue>\n+ <Residue name=\"YB3P\">\n+ <Atom charge=\"3.0\" name=\"YB3P\" type=\"YB3P-YB3P\" />\n+ </Residue>\n+ <Residue name=\"LU3P\">\n+ <Atom charge=\"3.0\" name=\"LU3P\" type=\"LU3P-LU3P\" />\n+ </Residue>\n+ <Residue name=\"U3P\">\n+ <Atom charge=\"3.0\" name=\"U3P\" type=\"U3P-U3P\" />\n+ </Residue>\n+ <Residue name=\"PU3P\">\n+ <Atom charge=\"3.0\" name=\"PU3P\" type=\"PU3P-PU3P\" />\n+ </Residue>\n+ <Residue name=\"TI3P\">\n+ <Atom charge=\"3.0\" name=\"TI3P\" type=\"TI3P-TI3P\" />\n+ </Residue>\n+ <Residue name=\"V3P\">\n+ <Atom charge=\"3.0\" name=\"V3P\" type=\"V3P-V3P\" />\n+ </Residue>\n+ <Residue name=\"CR3P\">\n+ <Atom charge=\"3.0\" name=\"CR3P\" type=\"CR3P-CR3P\" />\n+ </Residue>\n+ <Residue name=\"MN3P\">\n+ <Atom charge=\"3.0\" name=\"MN3P\" type=\"MN3P-MN3P\" />\n+ </Residue>\n+ <Residue name=\"FE3P\">\n+ <Atom charge=\"3.0\" name=\"FE3P\" type=\"FE3P-FE3P\" />\n+ </Residue>\n+ <Residue name=\"CO3P\">\n+ <Atom charge=\"3.0\" name=\"CO3P\" type=\"CO3P-CO3P\" />\n+ </Residue>\n+ <Residue name=\"GA3P\">\n+ <Atom charge=\"3.0\" name=\"GA3P\" type=\"GA3P-GA3P\" />\n+ </Residue>\n+ <Residue name=\"RH3P\">\n+ <Atom charge=\"3.0\" name=\"RH3P\" type=\"RH3P-RH3P\" />\n+ </Residue>\n+ <Residue name=\"IN3P\">\n+ <Atom charge=\"3.0\" name=\"IN3P\" type=\"IN3P-IN3P\" />\n+ </Residue>\n+ <Residue name=\"AU3P\">\n+ <Atom charge=\"3.0\" name=\"AU3P\" type=\"AU3P-AU3P\" />\n+ </Residue>\n+ <Residue name=\"TL3P\">\n+ <Atom charge=\"3.0\" name=\"TL3P\" type=\"TL3P-TL3P\" />\n+ </Residue>\n+ <Residue name=\"BI3P\">\n+ <Atom charge=\"3.0\" name=\"BI3P\" type=\"BI3P-BI3P\" />\n+ </Residue>\n+ </Residues>\n+ <HarmonicBondForce>\n+ <Bond class1=\"HT\" class2=\"HT\" k=\"0.0\" length=\"0.15139000000000002\" />\n+ <Bond class1=\"HT\" class2=\"OT\" k=\"376559.99999999994\" length=\"0.09572000000000001\" />\n+ <Bond class1=\"OX\" class2=\"HX\" k=\"456055.99999999994\" length=\"0.097\" />\n+ </HarmonicBondForce>\n+ <HarmonicAngleForce>\n+ <Angle angle=\"1.8242181341844732\" class1=\"HT\" class2=\"OT\" class3=\"HT\" k=\"460.24\" />\n+ </HarmonicAngleForce>\n+ <AmoebaUreyBradleyForce />\n+ <NonbondedForce coulomb14scale=\"1.0\" lj14scale=\"1.0\">\n+ <UseAttributeFromResidue name=\"charge\" />\n+ <Atom class=\"HT\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"HX\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"OT\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"OX\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"LIT\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"SOD\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"MG\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"POT\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"CAL\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"RUB\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"CES\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"BAR\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"ZN\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"CAD\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"CLA\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"CU1P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"AG1P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"AU1P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"TI1P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"BE2P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"SR2P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"RA2P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"V2P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"CR2P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"MN2P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"FE2P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"CO2P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"NI2P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"CU2P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"PD2P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"AG2P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"SN2P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"PT2P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"HG2P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"PB2P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"SM2P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"EU2P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"YB2P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"AL3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"SC3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"Y3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"LA3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"CE3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"PR3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"ND3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"PM3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"SM3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"EU3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"GD3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"TB3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"DY3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"HO3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"ER3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"TM3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"YB3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"LU3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"U3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"PU3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"TI3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"V3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"CR3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"MN3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"FE3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"CO3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"GA3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"RH3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"IN3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"AU3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"TL3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"BI3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ </NonbondedForce>\n+ <LennardJonesForce lj14scale=\"1.0\">\n+ <Atom class=\"HT\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"HX\" epsilon=\"0.192464\" sigma=\"0.04000135244450124\" />\n+ <Atom class=\"OT\" epsilon=\"0.426768\" sigma=\"0.31879919729933903\" />\n+ <Atom class=\"OX\" epsilon=\"0.50208\" sigma=\"0.30290556416771536\" />\n+ <Atom class=\"LIT\" epsilon=\"0.00974872\" sigma=\"0.23118821735741807\" />\n+ <Atom class=\"SOD\" epsilon=\"0.1962296\" sigma=\"0.2513670733232967\" />\n+ <Atom class=\"MG\" epsilon=\"0.06276\" sigma=\"0.2111429961992604\" />\n+ <Atom class=\"POT\" epsilon=\"0.364008\" sigma=\"0.3142645228240047\" />\n+ <Atom class=\"CAL\" epsilon=\"0.50208\" sigma=\"0.24357170953956878\" />\n+ <Atom class=\"RUB\" epsilon=\"0.6276\" sigma=\"0.3385415128933289\" />\n+ <Atom class=\"CES\" epsilon=\"0.79496\" sigma=\"0.37417746161894255\" />\n+ <Atom class=\"BAR\" epsilon=\"0.6276\" sigma=\"0.33675971545704825\" />\n+ <Atom class=\"ZN\" epsilon=\"1.046\" sigma=\"0.194215920554594\" />\n+ <Atom class=\"CAD\" epsilon=\"0.50208\" sigma=\"0.2417899121032881\" />\n+ <Atom class=\"CLA\" epsilon=\"0.6276\" sigma=\"0.4044680180357141\" />\n+ <Atom class=\"CU1P\" epsilon=\"0.7748768\" sigma=\"0.1535909390073945\" />\n+ <Atom class=\"AG1P\" epsilon=\"1.2008079999999999\" sigma=\"0.2163636626875628\" />\n+ <Atom class=\"AU1P\" epsilon=\"1.4907592\" sigma=\"0.11250269012676205\" />\n+ <Atom class=\"TI1P\" epsilon=\"1.7016328\" sigma=\"0.34401163102271065\" />\n+ <Atom class=\"BE2P\" epsilon=\"0.4250944\" sigma=\"0.007127189745122714\" />\n+ <Atom class=\"SR2P\" epsilon=\"0.9572992\" sigma=\"0.3306837861993312\" />\n+ <Atom class=\"RA2P\" epsilon=\"1.2631496\" sigma=\"0.37237784620829906\" />\n+ <Atom class=\"V2P\" epsilon=\"0.6732056\" sigma=\"0.1966569830422985\" />\n+ <Atom class=\"CR2P\" epsilon=\"0.6974728\" sigma=\"0.18872798445084948\" />\n+ <Atom class=\"MN2P\" epsilon=\"0.7050040000000001\" sigma=\"0.2144749574051053\" />\n+ <Atom class=\"FE2P\" epsilon=\"0.667348\" sigma=\"0.1924519410926761\" />\n+ <Atom class=\"CO2P\" epsilon=\"0.6439176000000001\" sigma=\"0.16527953018939576\" />\n+ <Atom class=\"NI2P\" epsilon=\"0.5999856\" sigma=\"0.13903365395298137\" />\n+ <Atom class=\"CU2P\" epsilon=\"0.629692\" sigma=\"0.129198132104712\" />\n+ <Atom class=\"PD2P\" epsilon=\"0.7288528\" sigma=\"0.16519044031758173\" />\n+ <Atom class=\"AG2P\" epsilon=\"0.7752952\" sigma=\"0.1869105510658432\" />\n+ <Atom class=\"SN2P\" epsilon=\"0.7861736\" sigma=\"0.29542201493533654\" />\n+ <Atom class=\"PT2P\" epsilon=\"0.6824104\" sigma=\"0.1420270736459329\" />\n+ <Atom class=\"HG2P\" epsilon=\"0.8593936\" sigma=\"0.2105728210196506\" />\n+ <Atom class=\"PB2P\" epsilon=\"1.0016496000000001\" sigma=\"0.3132399892981433\" />\n+ <Atom class=\"SM2P\" epsilon=\"1.0242432\" sigma=\"0.330790694045508\" />\n+ <Atom class=\"EU2P\" epsilon=\"0.9907712000000001\" sigma=\"0.3279220001730961\" />\n+ <Atom class=\"YB2P\" epsilon=\"0.8593936\" sigma=\"0.28669120749756116\" />\n+ <Atom class=\"AL3P\" epsilon=\"0.44601440000000003\" sigma=\"0.039377723341803\" />\n+ <Atom class=\"SC3P\" epsilon=\"0.5899439999999999\" sigma=\"0.19544536078562763\" />\n+ <Atom class=\"Y3P\" epsilon=\"0.6928704\" sigma=\"0.25183924964391113\" />\n+ <Atom class=\"LA3P\" epsilon=\"0.7932864\" sigma=\"0.3158592315294759\" />\n+ <Atom class=\"CE3P\" epsilon=\"0.7702744000000001\" sigma=\"0.30495463121943817\" />\n+ <Atom class=\"PR3P\" epsilon=\"0.7627432\" sigma=\"0.2956180126533274\" />\n+ <Atom class=\"ND3P\" epsilon=\"0.7497728\" sigma=\"0.2886333667031071\" />\n+ <Atom class=\"PM3P\" epsilon=\"0.74266\" sigma=\"0.29527947114043407\" />\n+ <Atom class=\"SM3P\" epsilon=\"0.7351288\" sigma=\"0.2791542043420939\" />\n+ <Atom class=\"EU3P\" epsilon=\"0.728016\" sigma=\"0.2713677495455473\" />\n+ <Atom class=\"GD3P\" epsilon=\"0.7209032000000001\" sigma=\"0.2681605141602421\" />\n+ <Atom class=\"TB3P\" epsilon=\"0.7083512000000001\" sigma=\"0.2628151218514001\" />\n+ <Atom class=\"DY3P\" epsilon=\"0.6999832\" sigma=\"0.2573628216963812\" />\n+ <Atom class=\"HO3P\" epsilon=\"0.6928704\" sigma=\"0.247794569463554\" />\n+ <Atom class=\"ER3P\" epsilon=\"0.6845024\" sigma=\"0.24362516346265717\" />\n+ <Atom class=\"TM3P\" epsilon=\"0.6778080000000001\" sigma=\"0.24029320225681233\" />\n+ <Atom class=\"YB3P\" epsilon=\"0.6711136\" sigma=\"0.23077840394707347\" />\n+ <Atom class=\"LU3P\" epsilon=\"0.6644192\" sigma=\"0.2407564695902453\" />\n+ <Atom class=\"U3P\" epsilon=\"0.7932864\" sigma=\"0.3031193798600691\" />\n+ <Atom class=\"PU3P\" epsilon=\"0.7702744000000001\" sigma=\"0.29750671793578487\" />\n+ <Atom class=\"TI3P\" epsilon=\"0.537644\" sigma=\"0.14769318949330543\" />\n+ <Atom class=\"V3P\" epsilon=\"0.5171424\" sigma=\"0.10943799853635927\" />\n+ <Atom class=\"CR3P\" epsilon=\"0.5045904\" sigma=\"0.15022334185282402\" />\n+ <Atom class=\"MN3P\" epsilon=\"0.5238368\" sigma=\"0.06849229345062928\" />\n+ <Atom class=\"FE3P\" epsilon=\"0.5238368\" sigma=\"0.10090318881657484\" />\n+ <Atom class=\"CO3P\" epsilon=\"0.4983144\" sigma=\"0.04598819183040431\" />\n+ <Atom class=\"GA3P\" epsilon=\"0.5045904\" sigma=\"0.04042898382920859\" />\n+ <Atom class=\"RH3P\" epsilon=\"0.537644\" sigma=\"0.0821943157356277\" />\n+ <Atom class=\"IN3P\" epsilon=\"0.6163031999999999\" sigma=\"0.15435711190499518\" />\n+ <Atom class=\"AU3P\" epsilon=\"0.5564720000000001\" sigma=\"0.065106878321696\" />\n+ <Atom class=\"TL3P\" epsilon=\"0.6815736\" sigma=\"0.15489165113587938\" />\n+ <Atom class=\"BI3P\" epsilon=\"0.7740400000000001\" sigma=\"0.24378552523192246\" />\n+ <NBFixPair class1=\"CLA\" class2=\"SOD\" epsilon=\"0.35093300000000005\" sigma=\"0.3323943117381606\" />\n+ <NBFixPair class1=\"CLA\" class2=\"POT\" epsilon=\"0.477963424\" sigma=\"0.3635757668730725\" />\n+ <NBFixPair class1=\"OC\" class2=\"SOD\" epsilon=\"0.31388368000000005\" sigma=\"0.28419669108676826\" />\n+ <NBFixPair class1=\"OCL\" class2=\"SOD\" epsilon=\"0.31388368000000005\" sigma=\"0.28419669108676826\" />\n+ <NBFixPair class1=\"OC2D2\" class2=\"SOD\" epsilon=\"0.31388368000000005\" sigma=\"0.28419669108676826\" />\n+ <NBFixPair class1=\"OG2D2\" class2=\"SOD\" epsilon=\"0.31388368000000005\" sigma=\"0.28419669108676826\" />\n+ </LennardJonesForce>\n+ <InitializationScript>\n+EXPECTED_VERSION = \"charmm36_2024\"\n+if hasattr(self, \"_charmm_ff_version\"):\n+ if self._charmm_ff_version != EXPECTED_VERSION:\n+ raise RuntimeError(f\"CHARMM force field versions ({self._charmm_ff_version} and {EXPECTED_VERSION}) incompatible\")\n+else:\n+ self._charmm_ff_version = EXPECTED_VERSION\n+ </InitializationScript>\n+</ForceField>\n\\ No newline at end of file\ndiff --git a/wrappers/python/openmm/app/data/charmm36_2024/tip3p-pme-f.xml b/wrappers/python/openmm/app/data/charmm36_2024/tip3p-pme-f.xml\nnew file mode 100644\nindex 0000000000..47657ea941\n--- /dev/null\n+++ b/wrappers/python/openmm/app/data/charmm36_2024/tip3p-pme-f.xml\n@@ -0,0 +1,460 @@\n+<ForceField>\n+ <Info>\n+ <DateGenerated>2025-02-27</DateGenerated>\n+ <Source Source=\"toppar/non_charmm/toppar_water_ions_tip3p_pme_f.str\" md5hash=\"2a6cb5826fd2c30b3430fa8b04f34ec8\" sourcePackage=\"charmm36\" sourcePackageVersion=\"toppar_c36_jul24.tgz\">toppar/non_charmm/toppar_water_ions_tip3p_pme_f.str</Source>\n+ <Source Source=\"toppar/stream/misc/toppar_ions_won.str\" md5hash=\"f523f7727e7dfa25468cc75f9b880c5b\" sourcePackage=\"charmm36\" sourcePackageVersion=\"toppar_c36_jul24.tgz\">toppar/stream/misc/toppar_ions_won.str</Source>\n+ <Reference Reference=\"D.J. Price and C.L. Brooks III. A modified TIP3P water potential for simulation with Ewald summation. J. Chem. Phys. 121:10096-10103, 2004.\" forcefield=\"tip3p-pme-f\">D.J. Price and C.L. Brooks III. A modified TIP3P water potential for simulation with Ewald summation. J. Chem. Phys. 121:10096-10103, 2004.</Reference>\n+ <Reference Reference=\"Beglov, D. and Roux, B., Finite Representation of an Infinite Bulk System: Solvent Boundary Potential for Computer Simulations, Journal of Chemical Physics, 1994, 100: 9050-9063\" forcefield=\"ions\">Beglov, D. and Roux, B., Finite Representation of an Infinite Bulk System: Solvent Boundary Potential for Computer Simulations, Journal of Chemical Physics, 1994, 100: 9050-9063</Reference>\n+ <Reference Reference=\"Stote, R.H. and Karplus, M. Zinc Binding in Proteins and Solution: A Simple but Accurate Nonbonded Representation, PROTEINS: Structure, Function, and Genetics 23:12-31 (1995)\" forcefield=\"ions\">Stote, R.H. and Karplus, M. Zinc Binding in Proteins and Solution: A Simple but Accurate Nonbonded Representation, PROTEINS: Structure, Function, and Genetics 23:12-31 (1995)</Reference>\n+ <Reference Reference=\"Won, Y., "Force Field for Monovalent, Divalent, and Trivalent Cations Developed under the Solvent Boundary Potential," Journal of Physical Chemistry A., 116: 11763-11767, 2012.\" forcefield=\"ions\">Won, Y., \"Force Field for Monovalent, Divalent, and Trivalent Cations Developed under the Solvent Boundary Potential,\" Journal of Physical Chemistry A., 116: 11763-11767, 2012.</Reference>\n+ </Info>\n+ <AtomTypes>\n+ <Type class=\"OT\" element=\"O\" mass=\"15.9994\" name=\"TP3F-OH2\" />\n+ <Type class=\"HT\" element=\"H\" mass=\"1.008\" name=\"TP3F-H1\" />\n+ <Type class=\"HT\" element=\"H\" mass=\"1.008\" name=\"TP3F-H2\" />\n+ <Type class=\"OX\" element=\"O\" mass=\"15.9994\" name=\"OH-O1\" />\n+ <Type class=\"HX\" element=\"H\" mass=\"1.008\" name=\"OH-H1\" />\n+ <Type class=\"LIT\" element=\"Li\" mass=\"6.941\" name=\"LIT-LIT\" />\n+ <Type class=\"SOD\" element=\"Na\" mass=\"22.98977\" name=\"SOD-SOD\" />\n+ <Type class=\"MG\" element=\"Mg\" mass=\"24.305\" name=\"MG-MG\" />\n+ <Type class=\"POT\" element=\"K\" mass=\"39.0983\" name=\"POT-POT\" />\n+ <Type class=\"CAL\" element=\"Ca\" mass=\"40.08\" name=\"CAL-CAL\" />\n+ <Type class=\"RUB\" element=\"Rb\" mass=\"85.4678\" name=\"RUB-RUB\" />\n+ <Type class=\"CES\" element=\"Cs\" mass=\"132.90545\" name=\"CES-CES\" />\n+ <Type class=\"BAR\" element=\"Ba\" mass=\"137.327\" name=\"BAR-BAR\" />\n+ <Type class=\"ZN\" element=\"Zn\" mass=\"65.37\" name=\"ZN2-ZN\" />\n+ <Type class=\"CAD\" element=\"Cd\" mass=\"112.411\" name=\"CD2-CD\" />\n+ <Type class=\"CLA\" element=\"Cl\" mass=\"35.45\" name=\"CLA-CLA\" />\n+ <Type class=\"CU1P\" element=\"Cu\" mass=\"63.546\" name=\"CU1P-CU1P\" />\n+ <Type class=\"AG1P\" element=\"Ag\" mass=\"107.87\" name=\"AG1P-AG1P\" />\n+ <Type class=\"AU1P\" element=\"Au\" mass=\"196.97\" name=\"AU1P-AU1P\" />\n+ <Type class=\"TI1P\" element=\"Ti\" mass=\"47.867\" name=\"TI1P-TI1P\" />\n+ <Type class=\"BE2P\" element=\"Be\" mass=\"9.0122\" name=\"BE2P-BE2P\" />\n+ <Type class=\"SR2P\" element=\"Sr\" mass=\"87.62\" name=\"SR2P-SR2P\" />\n+ <Type class=\"RA2P\" element=\"Ra\" mass=\"226.03\" name=\"RA2P-RA2P\" />\n+ <Type class=\"V2P\" element=\"V\" mass=\"50.942\" name=\"V2P-V2P\" />\n+ <Type class=\"CR2P\" element=\"Cr\" mass=\"51.996\" name=\"CR2P-CR2P\" />\n+ <Type class=\"MN2P\" element=\"Mn\" mass=\"54.938\" name=\"MN2P-MN2P\" />\n+ <Type class=\"FE2P\" element=\"Fe\" mass=\"55.854\" name=\"FE2P-FE2P\" />\n+ <Type class=\"CO2P\" element=\"Co\" mass=\"58.933\" name=\"CO2P-CO2P\" />\n+ <Type class=\"NI2P\" element=\"Ni\" mass=\"58.693\" name=\"NI2P-NI2P\" />\n+ <Type class=\"CU2P\" element=\"Cu\" mass=\"63.546\" name=\"CU2P-CU2P\" />\n+ <Type class=\"PD2P\" element=\"Pd\" mass=\"106.42\" name=\"PD2P-PD2P\" />\n+ <Type class=\"AG2P\" element=\"Ag\" mass=\"107.87\" name=\"AG2P-AG2P\" />\n+ <Type class=\"SN2P\" element=\"Sn\" mass=\"118.71\" name=\"SN2P-SN2P\" />\n+ <Type class=\"PT2P\" element=\"Pt\" mass=\"195.08\" name=\"PT2P-PT2P\" />\n+ <Type class=\"HG2P\" element=\"Hg\" mass=\"200.59\" name=\"HG2P-HG2P\" />\n+ <Type class=\"PB2P\" element=\"Pb\" mass=\"207.2\" name=\"PB2P-PB2P\" />\n+ <Type class=\"SM2P\" element=\"Sm\" mass=\"150.36\" name=\"SM2P-SM2P\" />\n+ <Type class=\"EU2P\" element=\"Eu\" mass=\"151.96\" name=\"EU2P-EU2P\" />\n+ <Type class=\"YB2P\" element=\"Yb\" mass=\"173.05\" name=\"YB2P-YB2P\" />\n+ <Type class=\"AL3P\" element=\"Al\" mass=\"26.982\" name=\"AL3P-AL3P\" />\n+ <Type class=\"SC3P\" element=\"Sc\" mass=\"44.956\" name=\"SC3P-SC3P\" />\n+ <Type class=\"Y3P\" element=\"Y\" mass=\"88.906\" name=\"Y3P-Y3P\" />\n+ <Type class=\"LA3P\" element=\"La\" mass=\"138.91\" name=\"LA3P-LA3P\" />\n+ <Type class=\"CE3P\" element=\"Ce\" mass=\"140.12\" name=\"CE3P-CE3P\" />\n+ <Type class=\"PR3P\" element=\"Pr\" mass=\"140.91\" name=\"PR3P-PR3P\" />\n+ <Type class=\"ND3P\" element=\"Nd\" mass=\"144.24\" name=\"ND3P-ND3P\" />\n+ <Type class=\"PM3P\" element=\"Pm\" mass=\"144.91\" name=\"PM3P-PM3P\" />\n+ <Type class=\"SM3P\" element=\"Sm\" mass=\"150.36\" name=\"SM3P-SM3P\" />\n+ <Type class=\"EU3P\" element=\"Eu\" mass=\"151.96\" name=\"EU3P-EU3P\" />\n+ <Type class=\"GD3P\" element=\"Gd\" mass=\"157.25\" name=\"GD3P-GD3P\" />\n+ <Type class=\"TB3P\" element=\"Tb\" mass=\"158.93\" name=\"TB3P-TB3P\" />\n+ <Type class=\"DY3P\" element=\"Dy\" mass=\"162.5\" name=\"DY3P-DY3P\" />\n+ <Type class=\"HO3P\" element=\"Ho\" mass=\"164.93\" name=\"HO3P-HO3P\" />\n+ <Type class=\"ER3P\" element=\"Er\" mass=\"167.28\" name=\"ER3P-ER3P\" />\n+ <Type class=\"YB3P\" element=\"Yb\" mass=\"173.05\" name=\"YB3P-YB3P\" />\n+ <Type class=\"LU3P\" element=\"Lu\" mass=\"174.97\" name=\"LU3P-LU3P\" />\n+ <Type class=\"U3P\" element=\"U\" mass=\"238.03\" name=\"U3P-U3P\" />\n+ <Type class=\"PU3P\" element=\"Pu\" mass=\"244.06\" name=\"PU3P-PU3P\" />\n+ <Type class=\"TI3P\" element=\"Ti\" mass=\"47.867\" name=\"TI3P-TI3P\" />\n+ <Type class=\"V3P\" element=\"V\" mass=\"50.942\" name=\"V3P-V3P\" />\n+ <Type class=\"CR3P\" element=\"Cr\" mass=\"51.996\" name=\"CR3P-CR3P\" />\n+ <Type class=\"MN3P\" element=\"Mn\" mass=\"54.938\" name=\"MN3P-MN3P\" />\n+ <Type class=\"FE3P\" element=\"Fe\" mass=\"55.854\" name=\"FE3P-FE3P\" />\n+ <Type class=\"CO3P\" element=\"Co\" mass=\"58.933\" name=\"CO3P-CO3P\" />\n+ <Type class=\"GA3P\" element=\"Ga\" mass=\"69.723\" name=\"GA3P-GA3P\" />\n+ <Type class=\"RH3P\" element=\"Rh\" mass=\"102.91\" name=\"RH3P-RH3P\" />\n+ <Type class=\"IN3P\" element=\"In\" mass=\"114.82\" name=\"IN3P-IN3P\" />\n+ <Type class=\"AU3P\" element=\"Au\" mass=\"196.97\" name=\"AU3P-AU3P\" />\n+ <Type class=\"TL3P\" element=\"Tl\" mass=\"204.38\" name=\"TL3P-TL3P\" />\n+ <Type class=\"BI3P\" element=\"Bi\" mass=\"208.98\" name=\"BI3P-BI3P\" />\n+ </AtomTypes>\n+ <Residues>\n+ <Residue name=\"TP3F\">\n+ <Atom charge=\"-0.83\" name=\"OH2\" type=\"TP3F-OH2\" />\n+ <Atom charge=\"0.415\" name=\"H1\" type=\"TP3F-H1\" />\n+ <Atom charge=\"0.415\" name=\"H2\" type=\"TP3F-H2\" />\n+ <Bond atomName1=\"OH2\" atomName2=\"H1\" />\n+ <Bond atomName1=\"OH2\" atomName2=\"H2\" />\n+ </Residue>\n+ <Residue name=\"OH\">\n+ <Atom charge=\"-1.32\" name=\"O1\" type=\"OH-O1\" />\n+ <Atom charge=\"0.32\" name=\"H1\" type=\"OH-H1\" />\n+ <Bond atomName1=\"O1\" atomName2=\"H1\" />\n+ </Residue>\n+ <Residue name=\"LIT\">\n+ <Atom charge=\"1.0\" name=\"LIT\" type=\"LIT-LIT\" />\n+ </Residue>\n+ <Residue name=\"SOD\">\n+ <Atom charge=\"1.0\" name=\"SOD\" type=\"SOD-SOD\" />\n+ </Residue>\n+ <Residue name=\"MG\">\n+ <Atom charge=\"2.0\" name=\"MG\" type=\"MG-MG\" />\n+ </Residue>\n+ <Residue name=\"POT\">\n+ <Atom charge=\"1.0\" name=\"POT\" type=\"POT-POT\" />\n+ </Residue>\n+ <Residue name=\"CAL\">\n+ <Atom charge=\"2.0\" name=\"CAL\" type=\"CAL-CAL\" />\n+ </Residue>\n+ <Residue name=\"RUB\">\n+ <Atom charge=\"1.0\" name=\"RUB\" type=\"RUB-RUB\" />\n+ </Residue>\n+ <Residue name=\"CES\">\n+ <Atom charge=\"1.0\" name=\"CES\" type=\"CES-CES\" />\n+ </Residue>\n+ <Residue name=\"BAR\">\n+ <Atom charge=\"2.0\" name=\"BAR\" type=\"BAR-BAR\" />\n+ </Residue>\n+ <Residue name=\"ZN2\">\n+ <Atom charge=\"2.0\" name=\"ZN\" type=\"ZN2-ZN\" />\n+ </Residue>\n+ <Residue name=\"CD2\">\n+ <Atom charge=\"2.0\" name=\"CD\" type=\"CD2-CD\" />\n+ </Residue>\n+ <Residue name=\"CLA\">\n+ <Atom charge=\"-1.0\" name=\"CLA\" type=\"CLA-CLA\" />\n+ </Residue>\n+ <Residue name=\"CU1P\">\n+ <Atom charge=\"1.0\" name=\"CU1P\" type=\"CU1P-CU1P\" />\n+ </Residue>\n+ <Residue name=\"AG1P\">\n+ <Atom charge=\"1.0\" name=\"AG1P\" type=\"AG1P-AG1P\" />\n+ </Residue>\n+ <Residue name=\"AU1P\">\n+ <Atom charge=\"1.0\" name=\"AU1P\" type=\"AU1P-AU1P\" />\n+ </Residue>\n+ <Residue name=\"TI1P\">\n+ <Atom charge=\"1.0\" name=\"TI1P\" type=\"TI1P-TI1P\" />\n+ </Residue>\n+ <Residue name=\"BE2P\">\n+ <Atom charge=\"2.0\" name=\"BE2P\" type=\"BE2P-BE2P\" />\n+ </Residue>\n+ <Residue name=\"SR2P\">\n+ <Atom charge=\"2.0\" name=\"SR2P\" type=\"SR2P-SR2P\" />\n+ </Residue>\n+ <Residue name=\"RA2P\">\n+ <Atom charge=\"2.0\" name=\"RA2P\" type=\"RA2P-RA2P\" />\n+ </Residue>\n+ <Residue name=\"V2P\">\n+ <Atom charge=\"2.0\" name=\"V2P\" type=\"V2P-V2P\" />\n+ </Residue>\n+ <Residue name=\"CR2P\">\n+ <Atom charge=\"2.0\" name=\"CR2P\" type=\"CR2P-CR2P\" />\n+ </Residue>\n+ <Residue name=\"MN2P\">\n+ <Atom charge=\"2.0\" name=\"MN2P\" type=\"MN2P-MN2P\" />\n+ </Residue>\n+ <Residue name=\"FE2P\">\n+ <Atom charge=\"2.0\" name=\"FE2P\" type=\"FE2P-FE2P\" />\n+ </Residue>\n+ <Residue name=\"CO2P\">\n+ <Atom charge=\"2.0\" name=\"CO2P\" type=\"CO2P-CO2P\" />\n+ </Residue>\n+ <Residue name=\"NI2P\">\n+ <Atom charge=\"2.0\" name=\"NI2P\" type=\"NI2P-NI2P\" />\n+ </Residue>\n+ <Residue name=\"CU2P\">\n+ <Atom charge=\"2.0\" name=\"CU2P\" type=\"CU2P-CU2P\" />\n+ </Residue>\n+ <Residue name=\"PD2P\">\n+ <Atom charge=\"2.0\" name=\"PD2P\" type=\"PD2P-PD2P\" />\n+ </Residue>\n+ <Residue name=\"AG2P\">\n+ <Atom charge=\"2.0\" name=\"AG2P\" type=\"AG2P-AG2P\" />\n+ </Residue>\n+ <Residue name=\"SN2P\">\n+ <Atom charge=\"2.0\" name=\"SN2P\" type=\"SN2P-SN2P\" />\n+ </Residue>\n+ <Residue name=\"PT2P\">\n+ <Atom charge=\"2.0\" name=\"PT2P\" type=\"PT2P-PT2P\" />\n+ </Residue>\n+ <Residue name=\"HG2P\">\n+ <Atom charge=\"2.0\" name=\"HG2P\" type=\"HG2P-HG2P\" />\n+ </Residue>\n+ <Residue name=\"PB2P\">\n+ <Atom charge=\"2.0\" name=\"PB2P\" type=\"PB2P-PB2P\" />\n+ </Residue>\n+ <Residue name=\"SM2P\">\n+ <Atom charge=\"2.0\" name=\"SM2P\" type=\"SM2P-SM2P\" />\n+ </Residue>\n+ <Residue name=\"EU2P\">\n+ <Atom charge=\"2.0\" name=\"EU2P\" type=\"EU2P-EU2P\" />\n+ </Residue>\n+ <Residue name=\"YB2P\">\n+ <Atom charge=\"2.0\" name=\"YB2P\" type=\"YB2P-YB2P\" />\n+ </Residue>\n+ <Residue name=\"AL3P\">\n+ <Atom charge=\"3.0\" name=\"AL3P\" type=\"AL3P-AL3P\" />\n+ </Residue>\n+ <Residue name=\"SC3P\">\n+ <Atom charge=\"3.0\" name=\"SC3P\" type=\"SC3P-SC3P\" />\n+ </Residue>\n+ <Residue name=\"Y3P\">\n+ <Atom charge=\"3.0\" name=\"Y3P\" type=\"Y3P-Y3P\" />\n+ </Residue>\n+ <Residue name=\"LA3P\">\n+ <Atom charge=\"3.0\" name=\"LA3P\" type=\"LA3P-LA3P\" />\n+ </Residue>\n+ <Residue name=\"CE3P\">\n+ <Atom charge=\"3.0\" name=\"CE3P\" type=\"CE3P-CE3P\" />\n+ </Residue>\n+ <Residue name=\"PR3P\">\n+ <Atom charge=\"3.0\" name=\"PR3P\" type=\"PR3P-PR3P\" />\n+ </Residue>\n+ <Residue name=\"ND3P\">\n+ <Atom charge=\"3.0\" name=\"ND3P\" type=\"ND3P-ND3P\" />\n+ </Residue>\n+ <Residue name=\"PM3P\">\n+ <Atom charge=\"3.0\" name=\"PM3P\" type=\"PM3P-PM3P\" />\n+ </Residue>\n+ <Residue name=\"SM3P\">\n+ <Atom charge=\"3.0\" name=\"SM3P\" type=\"SM3P-SM3P\" />\n+ </Residue>\n+ <Residue name=\"EU3P\">\n+ <Atom charge=\"3.0\" name=\"EU3P\" type=\"EU3P-EU3P\" />\n+ </Residue>\n+ <Residue name=\"GD3P\">\n+ <Atom charge=\"3.0\" name=\"GD3P\" type=\"GD3P-GD3P\" />\n+ </Residue>\n+ <Residue name=\"TB3P\">\n+ <Atom charge=\"3.0\" name=\"TB3P\" type=\"TB3P-TB3P\" />\n+ </Residue>\n+ <Residue name=\"DY3P\">\n+ <Atom charge=\"3.0\" name=\"DY3P\" type=\"DY3P-DY3P\" />\n+ </Residue>\n+ <Residue name=\"HO3P\">\n+ <Atom charge=\"3.0\" name=\"HO3P\" type=\"HO3P-HO3P\" />\n+ </Residue>\n+ <Residue name=\"ER3P\">\n+ <Atom charge=\"3.0\" name=\"ER3P\" type=\"ER3P-ER3P\" />\n+ </Residue>\n+ <Residue name=\"YB3P\">\n+ <Atom charge=\"3.0\" name=\"YB3P\" type=\"YB3P-YB3P\" />\n+ </Residue>\n+ <Residue name=\"LU3P\">\n+ <Atom charge=\"3.0\" name=\"LU3P\" type=\"LU3P-LU3P\" />\n+ </Residue>\n+ <Residue name=\"U3P\">\n+ <Atom charge=\"3.0\" name=\"U3P\" type=\"U3P-U3P\" />\n+ </Residue>\n+ <Residue name=\"PU3P\">\n+ <Atom charge=\"3.0\" name=\"PU3P\" type=\"PU3P-PU3P\" />\n+ </Residue>\n+ <Residue name=\"TI3P\">\n+ <Atom charge=\"3.0\" name=\"TI3P\" type=\"TI3P-TI3P\" />\n+ </Residue>\n+ <Residue name=\"V3P\">\n+ <Atom charge=\"3.0\" name=\"V3P\" type=\"V3P-V3P\" />\n+ </Residue>\n+ <Residue name=\"CR3P\">\n+ <Atom charge=\"3.0\" name=\"CR3P\" type=\"CR3P-CR3P\" />\n+ </Residue>\n+ <Residue name=\"MN3P\">\n+ <Atom charge=\"3.0\" name=\"MN3P\" type=\"MN3P-MN3P\" />\n+ </Residue>\n+ <Residue name=\"FE3P\">\n+ <Atom charge=\"3.0\" name=\"FE3P\" type=\"FE3P-FE3P\" />\n+ </Residue>\n+ <Residue name=\"CO3P\">\n+ <Atom charge=\"3.0\" name=\"CO3P\" type=\"CO3P-CO3P\" />\n+ </Residue>\n+ <Residue name=\"GA3P\">\n+ <Atom charge=\"3.0\" name=\"GA3P\" type=\"GA3P-GA3P\" />\n+ </Residue>\n+ <Residue name=\"RH3P\">\n+ <Atom charge=\"3.0\" name=\"RH3P\" type=\"RH3P-RH3P\" />\n+ </Residue>\n+ <Residue name=\"IN3P\">\n+ <Atom charge=\"3.0\" name=\"IN3P\" type=\"IN3P-IN3P\" />\n+ </Residue>\n+ <Residue name=\"AU3P\">\n+ <Atom charge=\"3.0\" name=\"AU3P\" type=\"AU3P-AU3P\" />\n+ </Residue>\n+ <Residue name=\"TL3P\">\n+ <Atom charge=\"3.0\" name=\"TL3P\" type=\"TL3P-TL3P\" />\n+ </Residue>\n+ <Residue name=\"BI3P\">\n+ <Atom charge=\"3.0\" name=\"BI3P\" type=\"BI3P-BI3P\" />\n+ </Residue>\n+ </Residues>\n+ <HarmonicBondForce>\n+ <Bond class1=\"HT\" class2=\"HT\" k=\"0.0\" length=\"0.15139000000000002\" />\n+ <Bond class1=\"HT\" class2=\"OT\" k=\"376559.99999999994\" length=\"0.09572000000000001\" />\n+ <Bond class1=\"OX\" class2=\"HX\" k=\"456055.99999999994\" length=\"0.097\" />\n+ </HarmonicBondForce>\n+ <HarmonicAngleForce>\n+ <Angle angle=\"1.8242181341844732\" class1=\"HT\" class2=\"OT\" class3=\"HT\" k=\"460.24\" />\n+ </HarmonicAngleForce>\n+ <AmoebaUreyBradleyForce />\n+ <NonbondedForce coulomb14scale=\"1.0\" lj14scale=\"1.0\">\n+ <UseAttributeFromResidue name=\"charge\" />\n+ <Atom class=\"HT\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"HX\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"OT\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"OX\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"LIT\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"SOD\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"MG\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"POT\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"CAL\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"RUB\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"CES\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"BAR\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"ZN\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"CAD\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"CLA\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"CU1P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"AG1P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"AU1P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"TI1P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"BE2P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"SR2P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"RA2P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"V2P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"CR2P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"MN2P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"FE2P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"CO2P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"NI2P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"CU2P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"PD2P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"AG2P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"SN2P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"PT2P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"HG2P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"PB2P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"SM2P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"EU2P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"YB2P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"AL3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"SC3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"Y3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"LA3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"CE3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"PR3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"ND3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"PM3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"SM3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"EU3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"GD3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"TB3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"DY3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"HO3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"ER3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"TM3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"YB3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"LU3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"U3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"PU3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"TI3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"V3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"CR3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"MN3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"FE3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"CO3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"GA3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"RH3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"IN3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"AU3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"TL3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"BI3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ </NonbondedForce>\n+ <LennardJonesForce lj14scale=\"1.0\">\n+ <Atom class=\"HT\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"HX\" epsilon=\"0.192464\" sigma=\"0.04000135244450124\" />\n+ <Atom class=\"OT\" epsilon=\"0.410032\" sigma=\"0.3194050084276745\" />\n+ <Atom class=\"OX\" epsilon=\"0.50208\" sigma=\"0.30290556416771536\" />\n+ <Atom class=\"LIT\" epsilon=\"0.00974872\" sigma=\"0.23118821735741807\" />\n+ <Atom class=\"SOD\" epsilon=\"0.1962296\" sigma=\"0.2513670733232967\" />\n+ <Atom class=\"MG\" epsilon=\"0.06276\" sigma=\"0.2111429961992604\" />\n+ <Atom class=\"POT\" epsilon=\"0.364008\" sigma=\"0.3142645228240047\" />\n+ <Atom class=\"CAL\" epsilon=\"0.50208\" sigma=\"0.24357170953956878\" />\n+ <Atom class=\"RUB\" epsilon=\"0.6276\" sigma=\"0.3385415128933289\" />\n+ <Atom class=\"CES\" epsilon=\"0.79496\" sigma=\"0.37417746161894255\" />\n+ <Atom class=\"BAR\" epsilon=\"0.6276\" sigma=\"0.33675971545704825\" />\n+ <Atom class=\"ZN\" epsilon=\"1.046\" sigma=\"0.194215920554594\" />\n+ <Atom class=\"CAD\" epsilon=\"0.50208\" sigma=\"0.2417899121032881\" />\n+ <Atom class=\"CLA\" epsilon=\"0.6276\" sigma=\"0.4044680180357141\" />\n+ <Atom class=\"CU1P\" epsilon=\"0.7748768\" sigma=\"0.1535909390073945\" />\n+ <Atom class=\"AG1P\" epsilon=\"1.2008079999999999\" sigma=\"0.2163636626875628\" />\n+ <Atom class=\"AU1P\" epsilon=\"1.4907592\" sigma=\"0.11250269012676205\" />\n+ <Atom class=\"TI1P\" epsilon=\"1.7016328\" sigma=\"0.34401163102271065\" />\n+ <Atom class=\"BE2P\" epsilon=\"0.4250944\" sigma=\"0.007127189745122714\" />\n+ <Atom class=\"SR2P\" epsilon=\"0.9572992\" sigma=\"0.3306837861993312\" />\n+ <Atom class=\"RA2P\" epsilon=\"1.2631496\" sigma=\"0.37237784620829906\" />\n+ <Atom class=\"V2P\" epsilon=\"0.6732056\" sigma=\"0.1966569830422985\" />\n+ <Atom class=\"CR2P\" epsilon=\"0.6974728\" sigma=\"0.18872798445084948\" />\n+ <Atom class=\"MN2P\" epsilon=\"0.7050040000000001\" sigma=\"0.2144749574051053\" />\n+ <Atom class=\"FE2P\" epsilon=\"0.667348\" sigma=\"0.1924519410926761\" />\n+ <Atom class=\"CO2P\" epsilon=\"0.6439176000000001\" sigma=\"0.16527953018939576\" />\n+ <Atom class=\"NI2P\" epsilon=\"0.5999856\" sigma=\"0.13903365395298137\" />\n+ <Atom class=\"CU2P\" epsilon=\"0.629692\" sigma=\"0.129198132104712\" />\n+ <Atom class=\"PD2P\" epsilon=\"0.7288528\" sigma=\"0.16519044031758173\" />\n+ <Atom class=\"AG2P\" epsilon=\"0.7752952\" sigma=\"0.1869105510658432\" />\n+ <Atom class=\"SN2P\" epsilon=\"0.7861736\" sigma=\"0.29542201493533654\" />\n+ <Atom class=\"PT2P\" epsilon=\"0.6824104\" sigma=\"0.1420270736459329\" />\n+ <Atom class=\"HG2P\" epsilon=\"0.8593936\" sigma=\"0.2105728210196506\" />\n+ <Atom class=\"PB2P\" epsilon=\"1.0016496000000001\" sigma=\"0.3132399892981433\" />\n+ <Atom class=\"SM2P\" epsilon=\"1.0242432\" sigma=\"0.330790694045508\" />\n+ <Atom class=\"EU2P\" epsilon=\"0.9907712000000001\" sigma=\"0.3279220001730961\" />\n+ <Atom class=\"YB2P\" epsilon=\"0.8593936\" sigma=\"0.28669120749756116\" />\n+ <Atom class=\"AL3P\" epsilon=\"0.44601440000000003\" sigma=\"0.039377723341803\" />\n+ <Atom class=\"SC3P\" epsilon=\"0.5899439999999999\" sigma=\"0.19544536078562763\" />\n+ <Atom class=\"Y3P\" epsilon=\"0.6928704\" sigma=\"0.25183924964391113\" />\n+ <Atom class=\"LA3P\" epsilon=\"0.7932864\" sigma=\"0.3158592315294759\" />\n+ <Atom class=\"CE3P\" epsilon=\"0.7702744000000001\" sigma=\"0.30495463121943817\" />\n+ <Atom class=\"PR3P\" epsilon=\"0.7627432\" sigma=\"0.2956180126533274\" />\n+ <Atom class=\"ND3P\" epsilon=\"0.7497728\" sigma=\"0.2886333667031071\" />\n+ <Atom class=\"PM3P\" epsilon=\"0.74266\" sigma=\"0.29527947114043407\" />\n+ <Atom class=\"SM3P\" epsilon=\"0.7351288\" sigma=\"0.2791542043420939\" />\n+ <Atom class=\"EU3P\" epsilon=\"0.728016\" sigma=\"0.2713677495455473\" />\n+ <Atom class=\"GD3P\" epsilon=\"0.7209032000000001\" sigma=\"0.2681605141602421\" />\n+ <Atom class=\"TB3P\" epsilon=\"0.7083512000000001\" sigma=\"0.2628151218514001\" />\n+ <Atom class=\"DY3P\" epsilon=\"0.6999832\" sigma=\"0.2573628216963812\" />\n+ <Atom class=\"HO3P\" epsilon=\"0.6928704\" sigma=\"0.247794569463554\" />\n+ <Atom class=\"ER3P\" epsilon=\"0.6845024\" sigma=\"0.24362516346265717\" />\n+ <Atom class=\"TM3P\" epsilon=\"0.6778080000000001\" sigma=\"0.24029320225681233\" />\n+ <Atom class=\"YB3P\" epsilon=\"0.6711136\" sigma=\"0.23077840394707347\" />\n+ <Atom class=\"LU3P\" epsilon=\"0.6644192\" sigma=\"0.2407564695902453\" />\n+ <Atom class=\"U3P\" epsilon=\"0.7932864\" sigma=\"0.3031193798600691\" />\n+ <Atom class=\"PU3P\" epsilon=\"0.7702744000000001\" sigma=\"0.29750671793578487\" />\n+ <Atom class=\"TI3P\" epsilon=\"0.537644\" sigma=\"0.14769318949330543\" />\n+ <Atom class=\"V3P\" epsilon=\"0.5171424\" sigma=\"0.10943799853635927\" />\n+ <Atom class=\"CR3P\" epsilon=\"0.5045904\" sigma=\"0.15022334185282402\" />\n+ <Atom class=\"MN3P\" epsilon=\"0.5238368\" sigma=\"0.06849229345062928\" />\n+ <Atom class=\"FE3P\" epsilon=\"0.5238368\" sigma=\"0.10090318881657484\" />\n+ <Atom class=\"CO3P\" epsilon=\"0.4983144\" sigma=\"0.04598819183040431\" />\n+ <Atom class=\"GA3P\" epsilon=\"0.5045904\" sigma=\"0.04042898382920859\" />\n+ <Atom class=\"RH3P\" epsilon=\"0.537644\" sigma=\"0.0821943157356277\" />\n+ <Atom class=\"IN3P\" epsilon=\"0.6163031999999999\" sigma=\"0.15435711190499518\" />\n+ <Atom class=\"AU3P\" epsilon=\"0.5564720000000001\" sigma=\"0.065106878321696\" />\n+ <Atom class=\"TL3P\" epsilon=\"0.6815736\" sigma=\"0.15489165113587938\" />\n+ <Atom class=\"BI3P\" epsilon=\"0.7740400000000001\" sigma=\"0.24378552523192246\" />\n+ <NBFixPair class1=\"CLA\" class2=\"SOD\" epsilon=\"0.35093300000000005\" sigma=\"0.3323943117381606\" />\n+ <NBFixPair class1=\"CLA\" class2=\"POT\" epsilon=\"0.477963424\" sigma=\"0.3635757668730725\" />\n+ <NBFixPair class1=\"OC\" class2=\"SOD\" epsilon=\"0.31388368000000005\" sigma=\"0.28419669108676826\" />\n+ <NBFixPair class1=\"OCL\" class2=\"SOD\" epsilon=\"0.31388368000000005\" sigma=\"0.28419669108676826\" />\n+ <NBFixPair class1=\"OC2D2\" class2=\"SOD\" epsilon=\"0.31388368000000005\" sigma=\"0.28419669108676826\" />\n+ <NBFixPair class1=\"OG2D2\" class2=\"SOD\" epsilon=\"0.31388368000000005\" sigma=\"0.28419669108676826\" />\n+ </LennardJonesForce>\n+ <InitializationScript>\n+EXPECTED_VERSION = \"charmm36_2024\"\n+if hasattr(self, \"_charmm_ff_version\"):\n+ if self._charmm_ff_version != EXPECTED_VERSION:\n+ raise RuntimeError(f\"CHARMM force field versions ({self._charmm_ff_version} and {EXPECTED_VERSION}) incompatible\")\n+else:\n+ self._charmm_ff_version = EXPECTED_VERSION\n+ </InitializationScript>\n+</ForceField>\n\\ No newline at end of file\ndiff --git a/wrappers/python/openmm/app/data/charmm36_2024/tip4p2005.xml b/wrappers/python/openmm/app/data/charmm36_2024/tip4p2005.xml\nnew file mode 100644\nindex 0000000000..fb92496f47\n--- /dev/null\n+++ b/wrappers/python/openmm/app/data/charmm36_2024/tip4p2005.xml\n@@ -0,0 +1,466 @@\n+<ForceField>\n+ <Info>\n+ <DateGenerated>2025-02-27</DateGenerated>\n+ <Source Source=\"toppar/non_charmm/toppar_water_ions_tip4p_2005.str\" md5hash=\"e2932421df3f88ec82c5a7b9b6c8292c\" sourcePackage=\"charmm36\" sourcePackageVersion=\"toppar_c36_jul24.tgz\">toppar/non_charmm/toppar_water_ions_tip4p_2005.str</Source>\n+ <Source Source=\"toppar/stream/misc/toppar_ions_won.str\" md5hash=\"f523f7727e7dfa25468cc75f9b880c5b\" sourcePackage=\"charmm36\" sourcePackageVersion=\"toppar_c36_jul24.tgz\">toppar/stream/misc/toppar_ions_won.str</Source>\n+ <Reference Reference=\"J.L.F. Abascal and C. Vega. A general purpose model for the condensed phases of water: TIP4P/2005 J. Chem. Phys. 123:234505, 2005.\" forcefield=\"tip4p-2005\">J.L.F. Abascal and C. Vega. A general purpose model for the condensed phases of water: TIP4P/2005 J. Chem. Phys. 123:234505, 2005.</Reference>\n+ <Reference Reference=\"Beglov, D. and Roux, B., Finite Representation of an Infinite Bulk System: Solvent Boundary Potential for Computer Simulations, Journal of Chemical Physics, 1994, 100: 9050-9063\" forcefield=\"ions\">Beglov, D. and Roux, B., Finite Representation of an Infinite Bulk System: Solvent Boundary Potential for Computer Simulations, Journal of Chemical Physics, 1994, 100: 9050-9063</Reference>\n+ <Reference Reference=\"Stote, R.H. and Karplus, M. Zinc Binding in Proteins and Solution: A Simple but Accurate Nonbonded Representation, PROTEINS: Structure, Function, and Genetics 23:12-31 (1995)\" forcefield=\"ions\">Stote, R.H. and Karplus, M. Zinc Binding in Proteins and Solution: A Simple but Accurate Nonbonded Representation, PROTEINS: Structure, Function, and Genetics 23:12-31 (1995)</Reference>\n+ <Reference Reference=\"Won, Y., "Force Field for Monovalent, Divalent, and Trivalent Cations Developed under the Solvent Boundary Potential," Journal of Physical Chemistry A., 116: 11763-11767, 2012.\" forcefield=\"ions\">Won, Y., \"Force Field for Monovalent, Divalent, and Trivalent Cations Developed under the Solvent Boundary Potential,\" Journal of Physical Chemistry A., 116: 11763-11767, 2012.</Reference>\n+ </Info>\n+ <AtomTypes>\n+ <Type class=\"OT\" element=\"O\" mass=\"15.9994\" name=\"TP45-OH2\" />\n+ <Type class=\"LP\" mass=\"0.0\" name=\"TP45-OM\" />\n+ <Type class=\"HT\" element=\"H\" mass=\"1.008\" name=\"TP45-H1\" />\n+ <Type class=\"HT\" element=\"H\" mass=\"1.008\" name=\"TP45-H2\" />\n+ <Type class=\"OX\" element=\"O\" mass=\"15.9994\" name=\"OH-O1\" />\n+ <Type class=\"HX\" element=\"H\" mass=\"1.008\" name=\"OH-H1\" />\n+ <Type class=\"LIT\" element=\"Li\" mass=\"6.941\" name=\"LIT-LIT\" />\n+ <Type class=\"SOD\" element=\"Na\" mass=\"22.98977\" name=\"SOD-SOD\" />\n+ <Type class=\"MG\" element=\"Mg\" mass=\"24.305\" name=\"MG-MG\" />\n+ <Type class=\"POT\" element=\"K\" mass=\"39.0983\" name=\"POT-POT\" />\n+ <Type class=\"CAL\" element=\"Ca\" mass=\"40.08\" name=\"CAL-CAL\" />\n+ <Type class=\"RUB\" element=\"Rb\" mass=\"85.4678\" name=\"RUB-RUB\" />\n+ <Type class=\"CES\" element=\"Cs\" mass=\"132.90545\" name=\"CES-CES\" />\n+ <Type class=\"BAR\" element=\"Ba\" mass=\"137.327\" name=\"BAR-BAR\" />\n+ <Type class=\"ZN\" element=\"Zn\" mass=\"65.37\" name=\"ZN2-ZN\" />\n+ <Type class=\"CAD\" element=\"Cd\" mass=\"112.411\" name=\"CD2-CD\" />\n+ <Type class=\"CLA\" element=\"Cl\" mass=\"35.45\" name=\"CLA-CLA\" />\n+ <Type class=\"CU1P\" element=\"Cu\" mass=\"63.546\" name=\"CU1P-CU1P\" />\n+ <Type class=\"AG1P\" element=\"Ag\" mass=\"107.87\" name=\"AG1P-AG1P\" />\n+ <Type class=\"AU1P\" element=\"Au\" mass=\"196.97\" name=\"AU1P-AU1P\" />\n+ <Type class=\"TI1P\" element=\"Ti\" mass=\"47.867\" name=\"TI1P-TI1P\" />\n+ <Type class=\"BE2P\" element=\"Be\" mass=\"9.0122\" name=\"BE2P-BE2P\" />\n+ <Type class=\"SR2P\" element=\"Sr\" mass=\"87.62\" name=\"SR2P-SR2P\" />\n+ <Type class=\"RA2P\" element=\"Ra\" mass=\"226.03\" name=\"RA2P-RA2P\" />\n+ <Type class=\"V2P\" element=\"V\" mass=\"50.942\" name=\"V2P-V2P\" />\n+ <Type class=\"CR2P\" element=\"Cr\" mass=\"51.996\" name=\"CR2P-CR2P\" />\n+ <Type class=\"MN2P\" element=\"Mn\" mass=\"54.938\" name=\"MN2P-MN2P\" />\n+ <Type class=\"FE2P\" element=\"Fe\" mass=\"55.854\" name=\"FE2P-FE2P\" />\n+ <Type class=\"CO2P\" element=\"Co\" mass=\"58.933\" name=\"CO2P-CO2P\" />\n+ <Type class=\"NI2P\" element=\"Ni\" mass=\"58.693\" name=\"NI2P-NI2P\" />\n+ <Type class=\"CU2P\" element=\"Cu\" mass=\"63.546\" name=\"CU2P-CU2P\" />\n+ <Type class=\"PD2P\" element=\"Pd\" mass=\"106.42\" name=\"PD2P-PD2P\" />\n+ <Type class=\"AG2P\" element=\"Ag\" mass=\"107.87\" name=\"AG2P-AG2P\" />\n+ <Type class=\"SN2P\" element=\"Sn\" mass=\"118.71\" name=\"SN2P-SN2P\" />\n+ <Type class=\"PT2P\" element=\"Pt\" mass=\"195.08\" name=\"PT2P-PT2P\" />\n+ <Type class=\"HG2P\" element=\"Hg\" mass=\"200.59\" name=\"HG2P-HG2P\" />\n+ <Type class=\"PB2P\" element=\"Pb\" mass=\"207.2\" name=\"PB2P-PB2P\" />\n+ <Type class=\"SM2P\" element=\"Sm\" mass=\"150.36\" name=\"SM2P-SM2P\" />\n+ <Type class=\"EU2P\" element=\"Eu\" mass=\"151.96\" name=\"EU2P-EU2P\" />\n+ <Type class=\"YB2P\" element=\"Yb\" mass=\"173.05\" name=\"YB2P-YB2P\" />\n+ <Type class=\"AL3P\" element=\"Al\" mass=\"26.982\" name=\"AL3P-AL3P\" />\n+ <Type class=\"SC3P\" element=\"Sc\" mass=\"44.956\" name=\"SC3P-SC3P\" />\n+ <Type class=\"Y3P\" element=\"Y\" mass=\"88.906\" name=\"Y3P-Y3P\" />\n+ <Type class=\"LA3P\" element=\"La\" mass=\"138.91\" name=\"LA3P-LA3P\" />\n+ <Type class=\"CE3P\" element=\"Ce\" mass=\"140.12\" name=\"CE3P-CE3P\" />\n+ <Type class=\"PR3P\" element=\"Pr\" mass=\"140.91\" name=\"PR3P-PR3P\" />\n+ <Type class=\"ND3P\" element=\"Nd\" mass=\"144.24\" name=\"ND3P-ND3P\" />\n+ <Type class=\"PM3P\" element=\"Pm\" mass=\"144.91\" name=\"PM3P-PM3P\" />\n+ <Type class=\"SM3P\" element=\"Sm\" mass=\"150.36\" name=\"SM3P-SM3P\" />\n+ <Type class=\"EU3P\" element=\"Eu\" mass=\"151.96\" name=\"EU3P-EU3P\" />\n+ <Type class=\"GD3P\" element=\"Gd\" mass=\"157.25\" name=\"GD3P-GD3P\" />\n+ <Type class=\"TB3P\" element=\"Tb\" mass=\"158.93\" name=\"TB3P-TB3P\" />\n+ <Type class=\"DY3P\" element=\"Dy\" mass=\"162.5\" name=\"DY3P-DY3P\" />\n+ <Type class=\"HO3P\" element=\"Ho\" mass=\"164.93\" name=\"HO3P-HO3P\" />\n+ <Type class=\"ER3P\" element=\"Er\" mass=\"167.28\" name=\"ER3P-ER3P\" />\n+ <Type class=\"YB3P\" element=\"Yb\" mass=\"173.05\" name=\"YB3P-YB3P\" />\n+ <Type class=\"LU3P\" element=\"Lu\" mass=\"174.97\" name=\"LU3P-LU3P\" />\n+ <Type class=\"U3P\" element=\"U\" mass=\"238.03\" name=\"U3P-U3P\" />\n+ <Type class=\"PU3P\" element=\"Pu\" mass=\"244.06\" name=\"PU3P-PU3P\" />\n+ <Type class=\"TI3P\" element=\"Ti\" mass=\"47.867\" name=\"TI3P-TI3P\" />\n+ <Type class=\"V3P\" element=\"V\" mass=\"50.942\" name=\"V3P-V3P\" />\n+ <Type class=\"CR3P\" element=\"Cr\" mass=\"51.996\" name=\"CR3P-CR3P\" />\n+ <Type class=\"MN3P\" element=\"Mn\" mass=\"54.938\" name=\"MN3P-MN3P\" />\n+ <Type class=\"FE3P\" element=\"Fe\" mass=\"55.854\" name=\"FE3P-FE3P\" />\n+ <Type class=\"CO3P\" element=\"Co\" mass=\"58.933\" name=\"CO3P-CO3P\" />\n+ <Type class=\"GA3P\" element=\"Ga\" mass=\"69.723\" name=\"GA3P-GA3P\" />\n+ <Type class=\"RH3P\" element=\"Rh\" mass=\"102.91\" name=\"RH3P-RH3P\" />\n+ <Type class=\"IN3P\" element=\"In\" mass=\"114.82\" name=\"IN3P-IN3P\" />\n+ <Type class=\"AU3P\" element=\"Au\" mass=\"196.97\" name=\"AU3P-AU3P\" />\n+ <Type class=\"TL3P\" element=\"Tl\" mass=\"204.38\" name=\"TL3P-TL3P\" />\n+ <Type class=\"BI3P\" element=\"Bi\" mass=\"208.98\" name=\"BI3P-BI3P\" />\n+ </AtomTypes>\n+ <Residues>\n+ <Residue name=\"TP45\">\n+ <Atom charge=\"0.0\" name=\"OH2\" type=\"TP45-OH2\" />\n+ <Atom charge=\"-1.1128\" name=\"OM\" type=\"TP45-OM\" />\n+ <Atom charge=\"0.5564\" name=\"H1\" type=\"TP45-H1\" />\n+ <Atom charge=\"0.5564\" name=\"H2\" type=\"TP45-H2\" />\n+ <Bond atomName1=\"OH2\" atomName2=\"H1\" />\n+ <Bond atomName1=\"OH2\" atomName2=\"H2\" />\n+ <VirtualSite atomName1=\"OH2\" atomName2=\"H2\" atomName3=\"H1\" p1=\"0.015459999999999998\" p2=\"0\" p3=\"0\" siteName=\"OM\" type=\"localCoords\" wo1=\"1\" wo2=\"0\" wo3=\"0\" wx1=\"-1.0\" wx2=\"0.5\" wx3=\"0.5\" wy1=\"0\" wy2=\"-1\" wy3=\"1\" />\n+ </Residue>\n+ <Residue name=\"OH\">\n+ <Atom charge=\"-1.32\" name=\"O1\" type=\"OH-O1\" />\n+ <Atom charge=\"0.32\" name=\"H1\" type=\"OH-H1\" />\n+ <Bond atomName1=\"O1\" atomName2=\"H1\" />\n+ </Residue>\n+ <Residue name=\"LIT\">\n+ <Atom charge=\"1.0\" name=\"LIT\" type=\"LIT-LIT\" />\n+ </Residue>\n+ <Residue name=\"SOD\">\n+ <Atom charge=\"1.0\" name=\"SOD\" type=\"SOD-SOD\" />\n+ </Residue>\n+ <Residue name=\"MG\">\n+ <Atom charge=\"2.0\" name=\"MG\" type=\"MG-MG\" />\n+ </Residue>\n+ <Residue name=\"POT\">\n+ <Atom charge=\"1.0\" name=\"POT\" type=\"POT-POT\" />\n+ </Residue>\n+ <Residue name=\"CAL\">\n+ <Atom charge=\"2.0\" name=\"CAL\" type=\"CAL-CAL\" />\n+ </Residue>\n+ <Residue name=\"RUB\">\n+ <Atom charge=\"1.0\" name=\"RUB\" type=\"RUB-RUB\" />\n+ </Residue>\n+ <Residue name=\"CES\">\n+ <Atom charge=\"1.0\" name=\"CES\" type=\"CES-CES\" />\n+ </Residue>\n+ <Residue name=\"BAR\">\n+ <Atom charge=\"2.0\" name=\"BAR\" type=\"BAR-BAR\" />\n+ </Residue>\n+ <Residue name=\"ZN2\">\n+ <Atom charge=\"2.0\" name=\"ZN\" type=\"ZN2-ZN\" />\n+ </Residue>\n+ <Residue name=\"CD2\">\n+ <Atom charge=\"2.0\" name=\"CD\" type=\"CD2-CD\" />\n+ </Residue>\n+ <Residue name=\"CLA\">\n+ <Atom charge=\"-1.0\" name=\"CLA\" type=\"CLA-CLA\" />\n+ </Residue>\n+ <Residue name=\"CU1P\">\n+ <Atom charge=\"1.0\" name=\"CU1P\" type=\"CU1P-CU1P\" />\n+ </Residue>\n+ <Residue name=\"AG1P\">\n+ <Atom charge=\"1.0\" name=\"AG1P\" type=\"AG1P-AG1P\" />\n+ </Residue>\n+ <Residue name=\"AU1P\">\n+ <Atom charge=\"1.0\" name=\"AU1P\" type=\"AU1P-AU1P\" />\n+ </Residue>\n+ <Residue name=\"TI1P\">\n+ <Atom charge=\"1.0\" name=\"TI1P\" type=\"TI1P-TI1P\" />\n+ </Residue>\n+ <Residue name=\"BE2P\">\n+ <Atom charge=\"2.0\" name=\"BE2P\" type=\"BE2P-BE2P\" />\n+ </Residue>\n+ <Residue name=\"SR2P\">\n+ <Atom charge=\"2.0\" name=\"SR2P\" type=\"SR2P-SR2P\" />\n+ </Residue>\n+ <Residue name=\"RA2P\">\n+ <Atom charge=\"2.0\" name=\"RA2P\" type=\"RA2P-RA2P\" />\n+ </Residue>\n+ <Residue name=\"V2P\">\n+ <Atom charge=\"2.0\" name=\"V2P\" type=\"V2P-V2P\" />\n+ </Residue>\n+ <Residue name=\"CR2P\">\n+ <Atom charge=\"2.0\" name=\"CR2P\" type=\"CR2P-CR2P\" />\n+ </Residue>\n+ <Residue name=\"MN2P\">\n+ <Atom charge=\"2.0\" name=\"MN2P\" type=\"MN2P-MN2P\" />\n+ </Residue>\n+ <Residue name=\"FE2P\">\n+ <Atom charge=\"2.0\" name=\"FE2P\" type=\"FE2P-FE2P\" />\n+ </Residue>\n+ <Residue name=\"CO2P\">\n+ <Atom charge=\"2.0\" name=\"CO2P\" type=\"CO2P-CO2P\" />\n+ </Residue>\n+ <Residue name=\"NI2P\">\n+ <Atom charge=\"2.0\" name=\"NI2P\" type=\"NI2P-NI2P\" />\n+ </Residue>\n+ <Residue name=\"CU2P\">\n+ <Atom charge=\"2.0\" name=\"CU2P\" type=\"CU2P-CU2P\" />\n+ </Residue>\n+ <Residue name=\"PD2P\">\n+ <Atom charge=\"2.0\" name=\"PD2P\" type=\"PD2P-PD2P\" />\n+ </Residue>\n+ <Residue name=\"AG2P\">\n+ <Atom charge=\"2.0\" name=\"AG2P\" type=\"AG2P-AG2P\" />\n+ </Residue>\n+ <Residue name=\"SN2P\">\n+ <Atom charge=\"2.0\" name=\"SN2P\" type=\"SN2P-SN2P\" />\n+ </Residue>\n+ <Residue name=\"PT2P\">\n+ <Atom charge=\"2.0\" name=\"PT2P\" type=\"PT2P-PT2P\" />\n+ </Residue>\n+ <Residue name=\"HG2P\">\n+ <Atom charge=\"2.0\" name=\"HG2P\" type=\"HG2P-HG2P\" />\n+ </Residue>\n+ <Residue name=\"PB2P\">\n+ <Atom charge=\"2.0\" name=\"PB2P\" type=\"PB2P-PB2P\" />\n+ </Residue>\n+ <Residue name=\"SM2P\">\n+ <Atom charge=\"2.0\" name=\"SM2P\" type=\"SM2P-SM2P\" />\n+ </Residue>\n+ <Residue name=\"EU2P\">\n+ <Atom charge=\"2.0\" name=\"EU2P\" type=\"EU2P-EU2P\" />\n+ </Residue>\n+ <Residue name=\"YB2P\">\n+ <Atom charge=\"2.0\" name=\"YB2P\" type=\"YB2P-YB2P\" />\n+ </Residue>\n+ <Residue name=\"AL3P\">\n+ <Atom charge=\"3.0\" name=\"AL3P\" type=\"AL3P-AL3P\" />\n+ </Residue>\n+ <Residue name=\"SC3P\">\n+ <Atom charge=\"3.0\" name=\"SC3P\" type=\"SC3P-SC3P\" />\n+ </Residue>\n+ <Residue name=\"Y3P\">\n+ <Atom charge=\"3.0\" name=\"Y3P\" type=\"Y3P-Y3P\" />\n+ </Residue>\n+ <Residue name=\"LA3P\">\n+ <Atom charge=\"3.0\" name=\"LA3P\" type=\"LA3P-LA3P\" />\n+ </Residue>\n+ <Residue name=\"CE3P\">\n+ <Atom charge=\"3.0\" name=\"CE3P\" type=\"CE3P-CE3P\" />\n+ </Residue>\n+ <Residue name=\"PR3P\">\n+ <Atom charge=\"3.0\" name=\"PR3P\" type=\"PR3P-PR3P\" />\n+ </Residue>\n+ <Residue name=\"ND3P\">\n+ <Atom charge=\"3.0\" name=\"ND3P\" type=\"ND3P-ND3P\" />\n+ </Residue>\n+ <Residue name=\"PM3P\">\n+ <Atom charge=\"3.0\" name=\"PM3P\" type=\"PM3P-PM3P\" />\n+ </Residue>\n+ <Residue name=\"SM3P\">\n+ <Atom charge=\"3.0\" name=\"SM3P\" type=\"SM3P-SM3P\" />\n+ </Residue>\n+ <Residue name=\"EU3P\">\n+ <Atom charge=\"3.0\" name=\"EU3P\" type=\"EU3P-EU3P\" />\n+ </Residue>\n+ <Residue name=\"GD3P\">\n+ <Atom charge=\"3.0\" name=\"GD3P\" type=\"GD3P-GD3P\" />\n+ </Residue>\n+ <Residue name=\"TB3P\">\n+ <Atom charge=\"3.0\" name=\"TB3P\" type=\"TB3P-TB3P\" />\n+ </Residue>\n+ <Residue name=\"DY3P\">\n+ <Atom charge=\"3.0\" name=\"DY3P\" type=\"DY3P-DY3P\" />\n+ </Residue>\n+ <Residue name=\"HO3P\">\n+ <Atom charge=\"3.0\" name=\"HO3P\" type=\"HO3P-HO3P\" />\n+ </Residue>\n+ <Residue name=\"ER3P\">\n+ <Atom charge=\"3.0\" name=\"ER3P\" type=\"ER3P-ER3P\" />\n+ </Residue>\n+ <Residue name=\"YB3P\">\n+ <Atom charge=\"3.0\" name=\"YB3P\" type=\"YB3P-YB3P\" />\n+ </Residue>\n+ <Residue name=\"LU3P\">\n+ <Atom charge=\"3.0\" name=\"LU3P\" type=\"LU3P-LU3P\" />\n+ </Residue>\n+ <Residue name=\"U3P\">\n+ <Atom charge=\"3.0\" name=\"U3P\" type=\"U3P-U3P\" />\n+ </Residue>\n+ <Residue name=\"PU3P\">\n+ <Atom charge=\"3.0\" name=\"PU3P\" type=\"PU3P-PU3P\" />\n+ </Residue>\n+ <Residue name=\"TI3P\">\n+ <Atom charge=\"3.0\" name=\"TI3P\" type=\"TI3P-TI3P\" />\n+ </Residue>\n+ <Residue name=\"V3P\">\n+ <Atom charge=\"3.0\" name=\"V3P\" type=\"V3P-V3P\" />\n+ </Residue>\n+ <Residue name=\"CR3P\">\n+ <Atom charge=\"3.0\" name=\"CR3P\" type=\"CR3P-CR3P\" />\n+ </Residue>\n+ <Residue name=\"MN3P\">\n+ <Atom charge=\"3.0\" name=\"MN3P\" type=\"MN3P-MN3P\" />\n+ </Residue>\n+ <Residue name=\"FE3P\">\n+ <Atom charge=\"3.0\" name=\"FE3P\" type=\"FE3P-FE3P\" />\n+ </Residue>\n+ <Residue name=\"CO3P\">\n+ <Atom charge=\"3.0\" name=\"CO3P\" type=\"CO3P-CO3P\" />\n+ </Residue>\n+ <Residue name=\"GA3P\">\n+ <Atom charge=\"3.0\" name=\"GA3P\" type=\"GA3P-GA3P\" />\n+ </Residue>\n+ <Residue name=\"RH3P\">\n+ <Atom charge=\"3.0\" name=\"RH3P\" type=\"RH3P-RH3P\" />\n+ </Residue>\n+ <Residue name=\"IN3P\">\n+ <Atom charge=\"3.0\" name=\"IN3P\" type=\"IN3P-IN3P\" />\n+ </Residue>\n+ <Residue name=\"AU3P\">\n+ <Atom charge=\"3.0\" name=\"AU3P\" type=\"AU3P-AU3P\" />\n+ </Residue>\n+ <Residue name=\"TL3P\">\n+ <Atom charge=\"3.0\" name=\"TL3P\" type=\"TL3P-TL3P\" />\n+ </Residue>\n+ <Residue name=\"BI3P\">\n+ <Atom charge=\"3.0\" name=\"BI3P\" type=\"BI3P-BI3P\" />\n+ </Residue>\n+ </Residues>\n+ <HarmonicBondForce>\n+ <Bond class1=\"HT\" class2=\"HT\" k=\"0.0\" length=\"0.15139000000000002\" />\n+ <Bond class1=\"HT\" class2=\"OT\" k=\"376559.99999999994\" length=\"0.09572000000000001\" />\n+ <Bond class1=\"OX\" class2=\"HX\" k=\"456055.99999999994\" length=\"0.097\" />\n+ <Bond class1=\"OT\" class2=\"LP\" k=\"0.0\" length=\"0.015\" />\n+ </HarmonicBondForce>\n+ <HarmonicAngleForce>\n+ <Angle angle=\"1.8242181341844732\" class1=\"HT\" class2=\"OT\" class3=\"HT\" k=\"460.24\" />\n+ </HarmonicAngleForce>\n+ <AmoebaUreyBradleyForce />\n+ <NonbondedForce coulomb14scale=\"1.0\" lj14scale=\"1.0\">\n+ <UseAttributeFromResidue name=\"charge\" />\n+ <Atom class=\"HT\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"HX\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"OT\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"OX\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"LIT\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"SOD\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"MG\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"POT\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"CAL\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"RUB\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"CES\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"BAR\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"ZN\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"CAD\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"CLA\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"LP\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"CU1P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"AG1P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"AU1P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"TI1P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"BE2P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"SR2P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"RA2P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"V2P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"CR2P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"MN2P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"FE2P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"CO2P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"NI2P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"CU2P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"PD2P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"AG2P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"SN2P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"PT2P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"HG2P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"PB2P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"SM2P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"EU2P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"YB2P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"AL3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"SC3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"Y3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"LA3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"CE3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"PR3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"ND3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"PM3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"SM3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"EU3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"GD3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"TB3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"DY3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"HO3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"ER3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"TM3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"YB3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"LU3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"U3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"PU3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"TI3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"V3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"CR3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"MN3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"FE3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"CO3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"GA3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"RH3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"IN3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"AU3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"TL3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"BI3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ </NonbondedForce>\n+ <LennardJonesForce lj14scale=\"1.0\">\n+ <Atom class=\"HT\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"HX\" epsilon=\"0.192464\" sigma=\"0.04000135244450124\" />\n+ <Atom class=\"OT\" epsilon=\"0.7748768\" sigma=\"0.3158414135551131\" />\n+ <Atom class=\"OX\" epsilon=\"0.50208\" sigma=\"0.30290556416771536\" />\n+ <Atom class=\"LIT\" epsilon=\"0.00974872\" sigma=\"0.23118821735741807\" />\n+ <Atom class=\"SOD\" epsilon=\"0.1962296\" sigma=\"0.2513670733232967\" />\n+ <Atom class=\"MG\" epsilon=\"0.06276\" sigma=\"0.2111429961992604\" />\n+ <Atom class=\"POT\" epsilon=\"0.364008\" sigma=\"0.3142645228240047\" />\n+ <Atom class=\"CAL\" epsilon=\"0.50208\" sigma=\"0.24357170953956878\" />\n+ <Atom class=\"RUB\" epsilon=\"0.6276\" sigma=\"0.3385415128933289\" />\n+ <Atom class=\"CES\" epsilon=\"0.79496\" sigma=\"0.37417746161894255\" />\n+ <Atom class=\"BAR\" epsilon=\"0.6276\" sigma=\"0.33675971545704825\" />\n+ <Atom class=\"ZN\" epsilon=\"1.046\" sigma=\"0.194215920554594\" />\n+ <Atom class=\"CAD\" epsilon=\"0.50208\" sigma=\"0.2417899121032881\" />\n+ <Atom class=\"CLA\" epsilon=\"0.6276\" sigma=\"0.4044680180357141\" />\n+ <Atom class=\"LP\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"CU1P\" epsilon=\"0.7748768\" sigma=\"0.1535909390073945\" />\n+ <Atom class=\"AG1P\" epsilon=\"1.2008079999999999\" sigma=\"0.2163636626875628\" />\n+ <Atom class=\"AU1P\" epsilon=\"1.4907592\" sigma=\"0.11250269012676205\" />\n+ <Atom class=\"TI1P\" epsilon=\"1.7016328\" sigma=\"0.34401163102271065\" />\n+ <Atom class=\"BE2P\" epsilon=\"0.4250944\" sigma=\"0.007127189745122714\" />\n+ <Atom class=\"SR2P\" epsilon=\"0.9572992\" sigma=\"0.3306837861993312\" />\n+ <Atom class=\"RA2P\" epsilon=\"1.2631496\" sigma=\"0.37237784620829906\" />\n+ <Atom class=\"V2P\" epsilon=\"0.6732056\" sigma=\"0.1966569830422985\" />\n+ <Atom class=\"CR2P\" epsilon=\"0.6974728\" sigma=\"0.18872798445084948\" />\n+ <Atom class=\"MN2P\" epsilon=\"0.7050040000000001\" sigma=\"0.2144749574051053\" />\n+ <Atom class=\"FE2P\" epsilon=\"0.667348\" sigma=\"0.1924519410926761\" />\n+ <Atom class=\"CO2P\" epsilon=\"0.6439176000000001\" sigma=\"0.16527953018939576\" />\n+ <Atom class=\"NI2P\" epsilon=\"0.5999856\" sigma=\"0.13903365395298137\" />\n+ <Atom class=\"CU2P\" epsilon=\"0.629692\" sigma=\"0.129198132104712\" />\n+ <Atom class=\"PD2P\" epsilon=\"0.7288528\" sigma=\"0.16519044031758173\" />\n+ <Atom class=\"AG2P\" epsilon=\"0.7752952\" sigma=\"0.1869105510658432\" />\n+ <Atom class=\"SN2P\" epsilon=\"0.7861736\" sigma=\"0.29542201493533654\" />\n+ <Atom class=\"PT2P\" epsilon=\"0.6824104\" sigma=\"0.1420270736459329\" />\n+ <Atom class=\"HG2P\" epsilon=\"0.8593936\" sigma=\"0.2105728210196506\" />\n+ <Atom class=\"PB2P\" epsilon=\"1.0016496000000001\" sigma=\"0.3132399892981433\" />\n+ <Atom class=\"SM2P\" epsilon=\"1.0242432\" sigma=\"0.330790694045508\" />\n+ <Atom class=\"EU2P\" epsilon=\"0.9907712000000001\" sigma=\"0.3279220001730961\" />\n+ <Atom class=\"YB2P\" epsilon=\"0.8593936\" sigma=\"0.28669120749756116\" />\n+ <Atom class=\"AL3P\" epsilon=\"0.44601440000000003\" sigma=\"0.039377723341803\" />\n+ <Atom class=\"SC3P\" epsilon=\"0.5899439999999999\" sigma=\"0.19544536078562763\" />\n+ <Atom class=\"Y3P\" epsilon=\"0.6928704\" sigma=\"0.25183924964391113\" />\n+ <Atom class=\"LA3P\" epsilon=\"0.7932864\" sigma=\"0.3158592315294759\" />\n+ <Atom class=\"CE3P\" epsilon=\"0.7702744000000001\" sigma=\"0.30495463121943817\" />\n+ <Atom class=\"PR3P\" epsilon=\"0.7627432\" sigma=\"0.2956180126533274\" />\n+ <Atom class=\"ND3P\" epsilon=\"0.7497728\" sigma=\"0.2886333667031071\" />\n+ <Atom class=\"PM3P\" epsilon=\"0.74266\" sigma=\"0.29527947114043407\" />\n+ <Atom class=\"SM3P\" epsilon=\"0.7351288\" sigma=\"0.2791542043420939\" />\n+ <Atom class=\"EU3P\" epsilon=\"0.728016\" sigma=\"0.2713677495455473\" />\n+ <Atom class=\"GD3P\" epsilon=\"0.7209032000000001\" sigma=\"0.2681605141602421\" />\n+ <Atom class=\"TB3P\" epsilon=\"0.7083512000000001\" sigma=\"0.2628151218514001\" />\n+ <Atom class=\"DY3P\" epsilon=\"0.6999832\" sigma=\"0.2573628216963812\" />\n+ <Atom class=\"HO3P\" epsilon=\"0.6928704\" sigma=\"0.247794569463554\" />\n+ <Atom class=\"ER3P\" epsilon=\"0.6845024\" sigma=\"0.24362516346265717\" />\n+ <Atom class=\"TM3P\" epsilon=\"0.6778080000000001\" sigma=\"0.24029320225681233\" />\n+ <Atom class=\"YB3P\" epsilon=\"0.6711136\" sigma=\"0.23077840394707347\" />\n+ <Atom class=\"LU3P\" epsilon=\"0.6644192\" sigma=\"0.2407564695902453\" />\n+ <Atom class=\"U3P\" epsilon=\"0.7932864\" sigma=\"0.3031193798600691\" />\n+ <Atom class=\"PU3P\" epsilon=\"0.7702744000000001\" sigma=\"0.29750671793578487\" />\n+ <Atom class=\"TI3P\" epsilon=\"0.537644\" sigma=\"0.14769318949330543\" />\n+ <Atom class=\"V3P\" epsilon=\"0.5171424\" sigma=\"0.10943799853635927\" />\n+ <Atom class=\"CR3P\" epsilon=\"0.5045904\" sigma=\"0.15022334185282402\" />\n+ <Atom class=\"MN3P\" epsilon=\"0.5238368\" sigma=\"0.06849229345062928\" />\n+ <Atom class=\"FE3P\" epsilon=\"0.5238368\" sigma=\"0.10090318881657484\" />\n+ <Atom class=\"CO3P\" epsilon=\"0.4983144\" sigma=\"0.04598819183040431\" />\n+ <Atom class=\"GA3P\" epsilon=\"0.5045904\" sigma=\"0.04042898382920859\" />\n+ <Atom class=\"RH3P\" epsilon=\"0.537644\" sigma=\"0.0821943157356277\" />\n+ <Atom class=\"IN3P\" epsilon=\"0.6163031999999999\" sigma=\"0.15435711190499518\" />\n+ <Atom class=\"AU3P\" epsilon=\"0.5564720000000001\" sigma=\"0.065106878321696\" />\n+ <Atom class=\"TL3P\" epsilon=\"0.6815736\" sigma=\"0.15489165113587938\" />\n+ <Atom class=\"BI3P\" epsilon=\"0.7740400000000001\" sigma=\"0.24378552523192246\" />\n+ <NBFixPair class1=\"CLA\" class2=\"SOD\" epsilon=\"0.35093300000000005\" sigma=\"0.3323943117381606\" />\n+ <NBFixPair class1=\"CLA\" class2=\"POT\" epsilon=\"0.477963424\" sigma=\"0.3635757668730725\" />\n+ <NBFixPair class1=\"OC\" class2=\"SOD\" epsilon=\"0.31388368000000005\" sigma=\"0.28419669108676826\" />\n+ <NBFixPair class1=\"OCL\" class2=\"SOD\" epsilon=\"0.31388368000000005\" sigma=\"0.28419669108676826\" />\n+ <NBFixPair class1=\"OC2D2\" class2=\"SOD\" epsilon=\"0.31388368000000005\" sigma=\"0.28419669108676826\" />\n+ <NBFixPair class1=\"OG2D2\" class2=\"SOD\" epsilon=\"0.31388368000000005\" sigma=\"0.28419669108676826\" />\n+ </LennardJonesForce>\n+ <InitializationScript>\n+EXPECTED_VERSION = \"charmm36_2024\"\n+if hasattr(self, \"_charmm_ff_version\"):\n+ if self._charmm_ff_version != EXPECTED_VERSION:\n+ raise RuntimeError(f\"CHARMM force field versions ({self._charmm_ff_version} and {EXPECTED_VERSION}) incompatible\")\n+else:\n+ self._charmm_ff_version = EXPECTED_VERSION\n+ </InitializationScript>\n+</ForceField>\n\\ No newline at end of file\ndiff --git a/wrappers/python/openmm/app/data/charmm36_2024/tip4pew.xml b/wrappers/python/openmm/app/data/charmm36_2024/tip4pew.xml\nnew file mode 100644\nindex 0000000000..ffe02ad093\n--- /dev/null\n+++ b/wrappers/python/openmm/app/data/charmm36_2024/tip4pew.xml\n@@ -0,0 +1,466 @@\n+<ForceField>\n+ <Info>\n+ <DateGenerated>2025-02-27</DateGenerated>\n+ <Source Source=\"toppar/non_charmm/toppar_water_ions_tip4p_ew.str\" md5hash=\"50fdc364d5a9faf3dc728329548dc3ac\" sourcePackage=\"charmm36\" sourcePackageVersion=\"toppar_c36_jul24.tgz\">toppar/non_charmm/toppar_water_ions_tip4p_ew.str</Source>\n+ <Source Source=\"toppar/stream/misc/toppar_ions_won.str\" md5hash=\"f523f7727e7dfa25468cc75f9b880c5b\" sourcePackage=\"charmm36\" sourcePackageVersion=\"toppar_c36_jul24.tgz\">toppar/stream/misc/toppar_ions_won.str</Source>\n+ <Reference Reference=\"H.W. Horn; W.C Swope; J.W. Pitera; J.D. Madura; T.J. Dick; G.L. Hura; T. Head-Gordon. J. Chem. Phys. 120:9665-9678, 2004.\" forcefield=\"tip4p-ew\">H.W. Horn; W.C Swope; J.W. Pitera; J.D. Madura; T.J. Dick; G.L. Hura; T. Head-Gordon. J. Chem. Phys. 120:9665-9678, 2004.</Reference>\n+ <Reference Reference=\"Beglov, D. and Roux, B., Finite Representation of an Infinite Bulk System: Solvent Boundary Potential for Computer Simulations, Journal of Chemical Physics, 1994, 100: 9050-9063\" forcefield=\"ions\">Beglov, D. and Roux, B., Finite Representation of an Infinite Bulk System: Solvent Boundary Potential for Computer Simulations, Journal of Chemical Physics, 1994, 100: 9050-9063</Reference>\n+ <Reference Reference=\"Stote, R.H. and Karplus, M. Zinc Binding in Proteins and Solution: A Simple but Accurate Nonbonded Representation, PROTEINS: Structure, Function, and Genetics 23:12-31 (1995)\" forcefield=\"ions\">Stote, R.H. and Karplus, M. Zinc Binding in Proteins and Solution: A Simple but Accurate Nonbonded Representation, PROTEINS: Structure, Function, and Genetics 23:12-31 (1995)</Reference>\n+ <Reference Reference=\"Won, Y., "Force Field for Monovalent, Divalent, and Trivalent Cations Developed under the Solvent Boundary Potential," Journal of Physical Chemistry A., 116: 11763-11767, 2012.\" forcefield=\"ions\">Won, Y., \"Force Field for Monovalent, Divalent, and Trivalent Cations Developed under the Solvent Boundary Potential,\" Journal of Physical Chemistry A., 116: 11763-11767, 2012.</Reference>\n+ </Info>\n+ <AtomTypes>\n+ <Type class=\"OT\" element=\"O\" mass=\"15.9994\" name=\"TP4E-OH2\" />\n+ <Type class=\"LP\" mass=\"0.0\" name=\"TP4E-OM\" />\n+ <Type class=\"HT\" element=\"H\" mass=\"1.008\" name=\"TP4E-H1\" />\n+ <Type class=\"HT\" element=\"H\" mass=\"1.008\" name=\"TP4E-H2\" />\n+ <Type class=\"OX\" element=\"O\" mass=\"15.9994\" name=\"OH-O1\" />\n+ <Type class=\"HX\" element=\"H\" mass=\"1.008\" name=\"OH-H1\" />\n+ <Type class=\"LIT\" element=\"Li\" mass=\"6.941\" name=\"LIT-LIT\" />\n+ <Type class=\"SOD\" element=\"Na\" mass=\"22.98977\" name=\"SOD-SOD\" />\n+ <Type class=\"MG\" element=\"Mg\" mass=\"24.305\" name=\"MG-MG\" />\n+ <Type class=\"POT\" element=\"K\" mass=\"39.0983\" name=\"POT-POT\" />\n+ <Type class=\"CAL\" element=\"Ca\" mass=\"40.08\" name=\"CAL-CAL\" />\n+ <Type class=\"RUB\" element=\"Rb\" mass=\"85.4678\" name=\"RUB-RUB\" />\n+ <Type class=\"CES\" element=\"Cs\" mass=\"132.90545\" name=\"CES-CES\" />\n+ <Type class=\"BAR\" element=\"Ba\" mass=\"137.327\" name=\"BAR-BAR\" />\n+ <Type class=\"ZN\" element=\"Zn\" mass=\"65.37\" name=\"ZN2-ZN\" />\n+ <Type class=\"CAD\" element=\"Cd\" mass=\"112.411\" name=\"CD2-CD\" />\n+ <Type class=\"CLA\" element=\"Cl\" mass=\"35.45\" name=\"CLA-CLA\" />\n+ <Type class=\"CU1P\" element=\"Cu\" mass=\"63.546\" name=\"CU1P-CU1P\" />\n+ <Type class=\"AG1P\" element=\"Ag\" mass=\"107.87\" name=\"AG1P-AG1P\" />\n+ <Type class=\"AU1P\" element=\"Au\" mass=\"196.97\" name=\"AU1P-AU1P\" />\n+ <Type class=\"TI1P\" element=\"Ti\" mass=\"47.867\" name=\"TI1P-TI1P\" />\n+ <Type class=\"BE2P\" element=\"Be\" mass=\"9.0122\" name=\"BE2P-BE2P\" />\n+ <Type class=\"SR2P\" element=\"Sr\" mass=\"87.62\" name=\"SR2P-SR2P\" />\n+ <Type class=\"RA2P\" element=\"Ra\" mass=\"226.03\" name=\"RA2P-RA2P\" />\n+ <Type class=\"V2P\" element=\"V\" mass=\"50.942\" name=\"V2P-V2P\" />\n+ <Type class=\"CR2P\" element=\"Cr\" mass=\"51.996\" name=\"CR2P-CR2P\" />\n+ <Type class=\"MN2P\" element=\"Mn\" mass=\"54.938\" name=\"MN2P-MN2P\" />\n+ <Type class=\"FE2P\" element=\"Fe\" mass=\"55.854\" name=\"FE2P-FE2P\" />\n+ <Type class=\"CO2P\" element=\"Co\" mass=\"58.933\" name=\"CO2P-CO2P\" />\n+ <Type class=\"NI2P\" element=\"Ni\" mass=\"58.693\" name=\"NI2P-NI2P\" />\n+ <Type class=\"CU2P\" element=\"Cu\" mass=\"63.546\" name=\"CU2P-CU2P\" />\n+ <Type class=\"PD2P\" element=\"Pd\" mass=\"106.42\" name=\"PD2P-PD2P\" />\n+ <Type class=\"AG2P\" element=\"Ag\" mass=\"107.87\" name=\"AG2P-AG2P\" />\n+ <Type class=\"SN2P\" element=\"Sn\" mass=\"118.71\" name=\"SN2P-SN2P\" />\n+ <Type class=\"PT2P\" element=\"Pt\" mass=\"195.08\" name=\"PT2P-PT2P\" />\n+ <Type class=\"HG2P\" element=\"Hg\" mass=\"200.59\" name=\"HG2P-HG2P\" />\n+ <Type class=\"PB2P\" element=\"Pb\" mass=\"207.2\" name=\"PB2P-PB2P\" />\n+ <Type class=\"SM2P\" element=\"Sm\" mass=\"150.36\" name=\"SM2P-SM2P\" />\n+ <Type class=\"EU2P\" element=\"Eu\" mass=\"151.96\" name=\"EU2P-EU2P\" />\n+ <Type class=\"YB2P\" element=\"Yb\" mass=\"173.05\" name=\"YB2P-YB2P\" />\n+ <Type class=\"AL3P\" element=\"Al\" mass=\"26.982\" name=\"AL3P-AL3P\" />\n+ <Type class=\"SC3P\" element=\"Sc\" mass=\"44.956\" name=\"SC3P-SC3P\" />\n+ <Type class=\"Y3P\" element=\"Y\" mass=\"88.906\" name=\"Y3P-Y3P\" />\n+ <Type class=\"LA3P\" element=\"La\" mass=\"138.91\" name=\"LA3P-LA3P\" />\n+ <Type class=\"CE3P\" element=\"Ce\" mass=\"140.12\" name=\"CE3P-CE3P\" />\n+ <Type class=\"PR3P\" element=\"Pr\" mass=\"140.91\" name=\"PR3P-PR3P\" />\n+ <Type class=\"ND3P\" element=\"Nd\" mass=\"144.24\" name=\"ND3P-ND3P\" />\n+ <Type class=\"PM3P\" element=\"Pm\" mass=\"144.91\" name=\"PM3P-PM3P\" />\n+ <Type class=\"SM3P\" element=\"Sm\" mass=\"150.36\" name=\"SM3P-SM3P\" />\n+ <Type class=\"EU3P\" element=\"Eu\" mass=\"151.96\" name=\"EU3P-EU3P\" />\n+ <Type class=\"GD3P\" element=\"Gd\" mass=\"157.25\" name=\"GD3P-GD3P\" />\n+ <Type class=\"TB3P\" element=\"Tb\" mass=\"158.93\" name=\"TB3P-TB3P\" />\n+ <Type class=\"DY3P\" element=\"Dy\" mass=\"162.5\" name=\"DY3P-DY3P\" />\n+ <Type class=\"HO3P\" element=\"Ho\" mass=\"164.93\" name=\"HO3P-HO3P\" />\n+ <Type class=\"ER3P\" element=\"Er\" mass=\"167.28\" name=\"ER3P-ER3P\" />\n+ <Type class=\"YB3P\" element=\"Yb\" mass=\"173.05\" name=\"YB3P-YB3P\" />\n+ <Type class=\"LU3P\" element=\"Lu\" mass=\"174.97\" name=\"LU3P-LU3P\" />\n+ <Type class=\"U3P\" element=\"U\" mass=\"238.03\" name=\"U3P-U3P\" />\n+ <Type class=\"PU3P\" element=\"Pu\" mass=\"244.06\" name=\"PU3P-PU3P\" />\n+ <Type class=\"TI3P\" element=\"Ti\" mass=\"47.867\" name=\"TI3P-TI3P\" />\n+ <Type class=\"V3P\" element=\"V\" mass=\"50.942\" name=\"V3P-V3P\" />\n+ <Type class=\"CR3P\" element=\"Cr\" mass=\"51.996\" name=\"CR3P-CR3P\" />\n+ <Type class=\"MN3P\" element=\"Mn\" mass=\"54.938\" name=\"MN3P-MN3P\" />\n+ <Type class=\"FE3P\" element=\"Fe\" mass=\"55.854\" name=\"FE3P-FE3P\" />\n+ <Type class=\"CO3P\" element=\"Co\" mass=\"58.933\" name=\"CO3P-CO3P\" />\n+ <Type class=\"GA3P\" element=\"Ga\" mass=\"69.723\" name=\"GA3P-GA3P\" />\n+ <Type class=\"RH3P\" element=\"Rh\" mass=\"102.91\" name=\"RH3P-RH3P\" />\n+ <Type class=\"IN3P\" element=\"In\" mass=\"114.82\" name=\"IN3P-IN3P\" />\n+ <Type class=\"AU3P\" element=\"Au\" mass=\"196.97\" name=\"AU3P-AU3P\" />\n+ <Type class=\"TL3P\" element=\"Tl\" mass=\"204.38\" name=\"TL3P-TL3P\" />\n+ <Type class=\"BI3P\" element=\"Bi\" mass=\"208.98\" name=\"BI3P-BI3P\" />\n+ </AtomTypes>\n+ <Residues>\n+ <Residue name=\"TP4E\">\n+ <Atom charge=\"0.0\" name=\"OH2\" type=\"TP4E-OH2\" />\n+ <Atom charge=\"-1.04844\" name=\"OM\" type=\"TP4E-OM\" />\n+ <Atom charge=\"0.52422\" name=\"H1\" type=\"TP4E-H1\" />\n+ <Atom charge=\"0.52422\" name=\"H2\" type=\"TP4E-H2\" />\n+ <Bond atomName1=\"OH2\" atomName2=\"H1\" />\n+ <Bond atomName1=\"OH2\" atomName2=\"H2\" />\n+ <VirtualSite atomName1=\"OH2\" atomName2=\"H2\" atomName3=\"H1\" p1=\"0.0125\" p2=\"0\" p3=\"0\" siteName=\"OM\" type=\"localCoords\" wo1=\"1\" wo2=\"0\" wo3=\"0\" wx1=\"-1.0\" wx2=\"0.5\" wx3=\"0.5\" wy1=\"0\" wy2=\"-1\" wy3=\"1\" />\n+ </Residue>\n+ <Residue name=\"OH\">\n+ <Atom charge=\"-1.32\" name=\"O1\" type=\"OH-O1\" />\n+ <Atom charge=\"0.32\" name=\"H1\" type=\"OH-H1\" />\n+ <Bond atomName1=\"O1\" atomName2=\"H1\" />\n+ </Residue>\n+ <Residue name=\"LIT\">\n+ <Atom charge=\"1.0\" name=\"LIT\" type=\"LIT-LIT\" />\n+ </Residue>\n+ <Residue name=\"SOD\">\n+ <Atom charge=\"1.0\" name=\"SOD\" type=\"SOD-SOD\" />\n+ </Residue>\n+ <Residue name=\"MG\">\n+ <Atom charge=\"2.0\" name=\"MG\" type=\"MG-MG\" />\n+ </Residue>\n+ <Residue name=\"POT\">\n+ <Atom charge=\"1.0\" name=\"POT\" type=\"POT-POT\" />\n+ </Residue>\n+ <Residue name=\"CAL\">\n+ <Atom charge=\"2.0\" name=\"CAL\" type=\"CAL-CAL\" />\n+ </Residue>\n+ <Residue name=\"RUB\">\n+ <Atom charge=\"1.0\" name=\"RUB\" type=\"RUB-RUB\" />\n+ </Residue>\n+ <Residue name=\"CES\">\n+ <Atom charge=\"1.0\" name=\"CES\" type=\"CES-CES\" />\n+ </Residue>\n+ <Residue name=\"BAR\">\n+ <Atom charge=\"2.0\" name=\"BAR\" type=\"BAR-BAR\" />\n+ </Residue>\n+ <Residue name=\"ZN2\">\n+ <Atom charge=\"2.0\" name=\"ZN\" type=\"ZN2-ZN\" />\n+ </Residue>\n+ <Residue name=\"CD2\">\n+ <Atom charge=\"2.0\" name=\"CD\" type=\"CD2-CD\" />\n+ </Residue>\n+ <Residue name=\"CLA\">\n+ <Atom charge=\"-1.0\" name=\"CLA\" type=\"CLA-CLA\" />\n+ </Residue>\n+ <Residue name=\"CU1P\">\n+ <Atom charge=\"1.0\" name=\"CU1P\" type=\"CU1P-CU1P\" />\n+ </Residue>\n+ <Residue name=\"AG1P\">\n+ <Atom charge=\"1.0\" name=\"AG1P\" type=\"AG1P-AG1P\" />\n+ </Residue>\n+ <Residue name=\"AU1P\">\n+ <Atom charge=\"1.0\" name=\"AU1P\" type=\"AU1P-AU1P\" />\n+ </Residue>\n+ <Residue name=\"TI1P\">\n+ <Atom charge=\"1.0\" name=\"TI1P\" type=\"TI1P-TI1P\" />\n+ </Residue>\n+ <Residue name=\"BE2P\">\n+ <Atom charge=\"2.0\" name=\"BE2P\" type=\"BE2P-BE2P\" />\n+ </Residue>\n+ <Residue name=\"SR2P\">\n+ <Atom charge=\"2.0\" name=\"SR2P\" type=\"SR2P-SR2P\" />\n+ </Residue>\n+ <Residue name=\"RA2P\">\n+ <Atom charge=\"2.0\" name=\"RA2P\" type=\"RA2P-RA2P\" />\n+ </Residue>\n+ <Residue name=\"V2P\">\n+ <Atom charge=\"2.0\" name=\"V2P\" type=\"V2P-V2P\" />\n+ </Residue>\n+ <Residue name=\"CR2P\">\n+ <Atom charge=\"2.0\" name=\"CR2P\" type=\"CR2P-CR2P\" />\n+ </Residue>\n+ <Residue name=\"MN2P\">\n+ <Atom charge=\"2.0\" name=\"MN2P\" type=\"MN2P-MN2P\" />\n+ </Residue>\n+ <Residue name=\"FE2P\">\n+ <Atom charge=\"2.0\" name=\"FE2P\" type=\"FE2P-FE2P\" />\n+ </Residue>\n+ <Residue name=\"CO2P\">\n+ <Atom charge=\"2.0\" name=\"CO2P\" type=\"CO2P-CO2P\" />\n+ </Residue>\n+ <Residue name=\"NI2P\">\n+ <Atom charge=\"2.0\" name=\"NI2P\" type=\"NI2P-NI2P\" />\n+ </Residue>\n+ <Residue name=\"CU2P\">\n+ <Atom charge=\"2.0\" name=\"CU2P\" type=\"CU2P-CU2P\" />\n+ </Residue>\n+ <Residue name=\"PD2P\">\n+ <Atom charge=\"2.0\" name=\"PD2P\" type=\"PD2P-PD2P\" />\n+ </Residue>\n+ <Residue name=\"AG2P\">\n+ <Atom charge=\"2.0\" name=\"AG2P\" type=\"AG2P-AG2P\" />\n+ </Residue>\n+ <Residue name=\"SN2P\">\n+ <Atom charge=\"2.0\" name=\"SN2P\" type=\"SN2P-SN2P\" />\n+ </Residue>\n+ <Residue name=\"PT2P\">\n+ <Atom charge=\"2.0\" name=\"PT2P\" type=\"PT2P-PT2P\" />\n+ </Residue>\n+ <Residue name=\"HG2P\">\n+ <Atom charge=\"2.0\" name=\"HG2P\" type=\"HG2P-HG2P\" />\n+ </Residue>\n+ <Residue name=\"PB2P\">\n+ <Atom charge=\"2.0\" name=\"PB2P\" type=\"PB2P-PB2P\" />\n+ </Residue>\n+ <Residue name=\"SM2P\">\n+ <Atom charge=\"2.0\" name=\"SM2P\" type=\"SM2P-SM2P\" />\n+ </Residue>\n+ <Residue name=\"EU2P\">\n+ <Atom charge=\"2.0\" name=\"EU2P\" type=\"EU2P-EU2P\" />\n+ </Residue>\n+ <Residue name=\"YB2P\">\n+ <Atom charge=\"2.0\" name=\"YB2P\" type=\"YB2P-YB2P\" />\n+ </Residue>\n+ <Residue name=\"AL3P\">\n+ <Atom charge=\"3.0\" name=\"AL3P\" type=\"AL3P-AL3P\" />\n+ </Residue>\n+ <Residue name=\"SC3P\">\n+ <Atom charge=\"3.0\" name=\"SC3P\" type=\"SC3P-SC3P\" />\n+ </Residue>\n+ <Residue name=\"Y3P\">\n+ <Atom charge=\"3.0\" name=\"Y3P\" type=\"Y3P-Y3P\" />\n+ </Residue>\n+ <Residue name=\"LA3P\">\n+ <Atom charge=\"3.0\" name=\"LA3P\" type=\"LA3P-LA3P\" />\n+ </Residue>\n+ <Residue name=\"CE3P\">\n+ <Atom charge=\"3.0\" name=\"CE3P\" type=\"CE3P-CE3P\" />\n+ </Residue>\n+ <Residue name=\"PR3P\">\n+ <Atom charge=\"3.0\" name=\"PR3P\" type=\"PR3P-PR3P\" />\n+ </Residue>\n+ <Residue name=\"ND3P\">\n+ <Atom charge=\"3.0\" name=\"ND3P\" type=\"ND3P-ND3P\" />\n+ </Residue>\n+ <Residue name=\"PM3P\">\n+ <Atom charge=\"3.0\" name=\"PM3P\" type=\"PM3P-PM3P\" />\n+ </Residue>\n+ <Residue name=\"SM3P\">\n+ <Atom charge=\"3.0\" name=\"SM3P\" type=\"SM3P-SM3P\" />\n+ </Residue>\n+ <Residue name=\"EU3P\">\n+ <Atom charge=\"3.0\" name=\"EU3P\" type=\"EU3P-EU3P\" />\n+ </Residue>\n+ <Residue name=\"GD3P\">\n+ <Atom charge=\"3.0\" name=\"GD3P\" type=\"GD3P-GD3P\" />\n+ </Residue>\n+ <Residue name=\"TB3P\">\n+ <Atom charge=\"3.0\" name=\"TB3P\" type=\"TB3P-TB3P\" />\n+ </Residue>\n+ <Residue name=\"DY3P\">\n+ <Atom charge=\"3.0\" name=\"DY3P\" type=\"DY3P-DY3P\" />\n+ </Residue>\n+ <Residue name=\"HO3P\">\n+ <Atom charge=\"3.0\" name=\"HO3P\" type=\"HO3P-HO3P\" />\n+ </Residue>\n+ <Residue name=\"ER3P\">\n+ <Atom charge=\"3.0\" name=\"ER3P\" type=\"ER3P-ER3P\" />\n+ </Residue>\n+ <Residue name=\"YB3P\">\n+ <Atom charge=\"3.0\" name=\"YB3P\" type=\"YB3P-YB3P\" />\n+ </Residue>\n+ <Residue name=\"LU3P\">\n+ <Atom charge=\"3.0\" name=\"LU3P\" type=\"LU3P-LU3P\" />\n+ </Residue>\n+ <Residue name=\"U3P\">\n+ <Atom charge=\"3.0\" name=\"U3P\" type=\"U3P-U3P\" />\n+ </Residue>\n+ <Residue name=\"PU3P\">\n+ <Atom charge=\"3.0\" name=\"PU3P\" type=\"PU3P-PU3P\" />\n+ </Residue>\n+ <Residue name=\"TI3P\">\n+ <Atom charge=\"3.0\" name=\"TI3P\" type=\"TI3P-TI3P\" />\n+ </Residue>\n+ <Residue name=\"V3P\">\n+ <Atom charge=\"3.0\" name=\"V3P\" type=\"V3P-V3P\" />\n+ </Residue>\n+ <Residue name=\"CR3P\">\n+ <Atom charge=\"3.0\" name=\"CR3P\" type=\"CR3P-CR3P\" />\n+ </Residue>\n+ <Residue name=\"MN3P\">\n+ <Atom charge=\"3.0\" name=\"MN3P\" type=\"MN3P-MN3P\" />\n+ </Residue>\n+ <Residue name=\"FE3P\">\n+ <Atom charge=\"3.0\" name=\"FE3P\" type=\"FE3P-FE3P\" />\n+ </Residue>\n+ <Residue name=\"CO3P\">\n+ <Atom charge=\"3.0\" name=\"CO3P\" type=\"CO3P-CO3P\" />\n+ </Residue>\n+ <Residue name=\"GA3P\">\n+ <Atom charge=\"3.0\" name=\"GA3P\" type=\"GA3P-GA3P\" />\n+ </Residue>\n+ <Residue name=\"RH3P\">\n+ <Atom charge=\"3.0\" name=\"RH3P\" type=\"RH3P-RH3P\" />\n+ </Residue>\n+ <Residue name=\"IN3P\">\n+ <Atom charge=\"3.0\" name=\"IN3P\" type=\"IN3P-IN3P\" />\n+ </Residue>\n+ <Residue name=\"AU3P\">\n+ <Atom charge=\"3.0\" name=\"AU3P\" type=\"AU3P-AU3P\" />\n+ </Residue>\n+ <Residue name=\"TL3P\">\n+ <Atom charge=\"3.0\" name=\"TL3P\" type=\"TL3P-TL3P\" />\n+ </Residue>\n+ <Residue name=\"BI3P\">\n+ <Atom charge=\"3.0\" name=\"BI3P\" type=\"BI3P-BI3P\" />\n+ </Residue>\n+ </Residues>\n+ <HarmonicBondForce>\n+ <Bond class1=\"HT\" class2=\"HT\" k=\"0.0\" length=\"0.15139000000000002\" />\n+ <Bond class1=\"HT\" class2=\"OT\" k=\"376559.99999999994\" length=\"0.09572000000000001\" />\n+ <Bond class1=\"OX\" class2=\"HX\" k=\"456055.99999999994\" length=\"0.097\" />\n+ <Bond class1=\"OT\" class2=\"LP\" k=\"0.0\" length=\"0.015\" />\n+ </HarmonicBondForce>\n+ <HarmonicAngleForce>\n+ <Angle angle=\"1.8242181341844732\" class1=\"HT\" class2=\"OT\" class3=\"HT\" k=\"460.24\" />\n+ </HarmonicAngleForce>\n+ <AmoebaUreyBradleyForce />\n+ <NonbondedForce coulomb14scale=\"1.0\" lj14scale=\"1.0\">\n+ <UseAttributeFromResidue name=\"charge\" />\n+ <Atom class=\"HT\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"HX\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"OT\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"OX\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"LIT\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"SOD\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"MG\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"POT\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"CAL\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"RUB\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"CES\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"BAR\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"ZN\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"CAD\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"CLA\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"LP\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"CU1P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"AG1P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"AU1P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"TI1P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"BE2P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"SR2P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"RA2P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"V2P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"CR2P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"MN2P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"FE2P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"CO2P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"NI2P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"CU2P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"PD2P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"AG2P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"SN2P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"PT2P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"HG2P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"PB2P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"SM2P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"EU2P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"YB2P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"AL3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"SC3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"Y3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"LA3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"CE3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"PR3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"ND3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"PM3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"SM3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"EU3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"GD3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"TB3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"DY3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"HO3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"ER3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"TM3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"YB3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"LU3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"U3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"PU3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"TI3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"V3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"CR3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"MN3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"FE3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"CO3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"GA3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"RH3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"IN3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"AU3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"TL3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"BI3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ </NonbondedForce>\n+ <LennardJonesForce lj14scale=\"1.0\">\n+ <Atom class=\"HT\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"HX\" epsilon=\"0.192464\" sigma=\"0.04000135244450124\" />\n+ <Atom class=\"OT\" epsilon=\"0.680946\" sigma=\"0.31642940670908576\" />\n+ <Atom class=\"OX\" epsilon=\"0.50208\" sigma=\"0.30290556416771536\" />\n+ <Atom class=\"LIT\" epsilon=\"0.00974872\" sigma=\"0.23118821735741807\" />\n+ <Atom class=\"SOD\" epsilon=\"0.1962296\" sigma=\"0.2513670733232967\" />\n+ <Atom class=\"MG\" epsilon=\"0.06276\" sigma=\"0.2111429961992604\" />\n+ <Atom class=\"POT\" epsilon=\"0.364008\" sigma=\"0.3142645228240047\" />\n+ <Atom class=\"CAL\" epsilon=\"0.50208\" sigma=\"0.24357170953956878\" />\n+ <Atom class=\"RUB\" epsilon=\"0.6276\" sigma=\"0.3385415128933289\" />\n+ <Atom class=\"CES\" epsilon=\"0.79496\" sigma=\"0.37417746161894255\" />\n+ <Atom class=\"BAR\" epsilon=\"0.6276\" sigma=\"0.33675971545704825\" />\n+ <Atom class=\"ZN\" epsilon=\"1.046\" sigma=\"0.194215920554594\" />\n+ <Atom class=\"CAD\" epsilon=\"0.50208\" sigma=\"0.2417899121032881\" />\n+ <Atom class=\"CLA\" epsilon=\"0.6276\" sigma=\"0.4044680180357141\" />\n+ <Atom class=\"LP\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"CU1P\" epsilon=\"0.7748768\" sigma=\"0.1535909390073945\" />\n+ <Atom class=\"AG1P\" epsilon=\"1.2008079999999999\" sigma=\"0.2163636626875628\" />\n+ <Atom class=\"AU1P\" epsilon=\"1.4907592\" sigma=\"0.11250269012676205\" />\n+ <Atom class=\"TI1P\" epsilon=\"1.7016328\" sigma=\"0.34401163102271065\" />\n+ <Atom class=\"BE2P\" epsilon=\"0.4250944\" sigma=\"0.007127189745122714\" />\n+ <Atom class=\"SR2P\" epsilon=\"0.9572992\" sigma=\"0.3306837861993312\" />\n+ <Atom class=\"RA2P\" epsilon=\"1.2631496\" sigma=\"0.37237784620829906\" />\n+ <Atom class=\"V2P\" epsilon=\"0.6732056\" sigma=\"0.1966569830422985\" />\n+ <Atom class=\"CR2P\" epsilon=\"0.6974728\" sigma=\"0.18872798445084948\" />\n+ <Atom class=\"MN2P\" epsilon=\"0.7050040000000001\" sigma=\"0.2144749574051053\" />\n+ <Atom class=\"FE2P\" epsilon=\"0.667348\" sigma=\"0.1924519410926761\" />\n+ <Atom class=\"CO2P\" epsilon=\"0.6439176000000001\" sigma=\"0.16527953018939576\" />\n+ <Atom class=\"NI2P\" epsilon=\"0.5999856\" sigma=\"0.13903365395298137\" />\n+ <Atom class=\"CU2P\" epsilon=\"0.629692\" sigma=\"0.129198132104712\" />\n+ <Atom class=\"PD2P\" epsilon=\"0.7288528\" sigma=\"0.16519044031758173\" />\n+ <Atom class=\"AG2P\" epsilon=\"0.7752952\" sigma=\"0.1869105510658432\" />\n+ <Atom class=\"SN2P\" epsilon=\"0.7861736\" sigma=\"0.29542201493533654\" />\n+ <Atom class=\"PT2P\" epsilon=\"0.6824104\" sigma=\"0.1420270736459329\" />\n+ <Atom class=\"HG2P\" epsilon=\"0.8593936\" sigma=\"0.2105728210196506\" />\n+ <Atom class=\"PB2P\" epsilon=\"1.0016496000000001\" sigma=\"0.3132399892981433\" />\n+ <Atom class=\"SM2P\" epsilon=\"1.0242432\" sigma=\"0.330790694045508\" />\n+ <Atom class=\"EU2P\" epsilon=\"0.9907712000000001\" sigma=\"0.3279220001730961\" />\n+ <Atom class=\"YB2P\" epsilon=\"0.8593936\" sigma=\"0.28669120749756116\" />\n+ <Atom class=\"AL3P\" epsilon=\"0.44601440000000003\" sigma=\"0.039377723341803\" />\n+ <Atom class=\"SC3P\" epsilon=\"0.5899439999999999\" sigma=\"0.19544536078562763\" />\n+ <Atom class=\"Y3P\" epsilon=\"0.6928704\" sigma=\"0.25183924964391113\" />\n+ <Atom class=\"LA3P\" epsilon=\"0.7932864\" sigma=\"0.3158592315294759\" />\n+ <Atom class=\"CE3P\" epsilon=\"0.7702744000000001\" sigma=\"0.30495463121943817\" />\n+ <Atom class=\"PR3P\" epsilon=\"0.7627432\" sigma=\"0.2956180126533274\" />\n+ <Atom class=\"ND3P\" epsilon=\"0.7497728\" sigma=\"0.2886333667031071\" />\n+ <Atom class=\"PM3P\" epsilon=\"0.74266\" sigma=\"0.29527947114043407\" />\n+ <Atom class=\"SM3P\" epsilon=\"0.7351288\" sigma=\"0.2791542043420939\" />\n+ <Atom class=\"EU3P\" epsilon=\"0.728016\" sigma=\"0.2713677495455473\" />\n+ <Atom class=\"GD3P\" epsilon=\"0.7209032000000001\" sigma=\"0.2681605141602421\" />\n+ <Atom class=\"TB3P\" epsilon=\"0.7083512000000001\" sigma=\"0.2628151218514001\" />\n+ <Atom class=\"DY3P\" epsilon=\"0.6999832\" sigma=\"0.2573628216963812\" />\n+ <Atom class=\"HO3P\" epsilon=\"0.6928704\" sigma=\"0.247794569463554\" />\n+ <Atom class=\"ER3P\" epsilon=\"0.6845024\" sigma=\"0.24362516346265717\" />\n+ <Atom class=\"TM3P\" epsilon=\"0.6778080000000001\" sigma=\"0.24029320225681233\" />\n+ <Atom class=\"YB3P\" epsilon=\"0.6711136\" sigma=\"0.23077840394707347\" />\n+ <Atom class=\"LU3P\" epsilon=\"0.6644192\" sigma=\"0.2407564695902453\" />\n+ <Atom class=\"U3P\" epsilon=\"0.7932864\" sigma=\"0.3031193798600691\" />\n+ <Atom class=\"PU3P\" epsilon=\"0.7702744000000001\" sigma=\"0.29750671793578487\" />\n+ <Atom class=\"TI3P\" epsilon=\"0.537644\" sigma=\"0.14769318949330543\" />\n+ <Atom class=\"V3P\" epsilon=\"0.5171424\" sigma=\"0.10943799853635927\" />\n+ <Atom class=\"CR3P\" epsilon=\"0.5045904\" sigma=\"0.15022334185282402\" />\n+ <Atom class=\"MN3P\" epsilon=\"0.5238368\" sigma=\"0.06849229345062928\" />\n+ <Atom class=\"FE3P\" epsilon=\"0.5238368\" sigma=\"0.10090318881657484\" />\n+ <Atom class=\"CO3P\" epsilon=\"0.4983144\" sigma=\"0.04598819183040431\" />\n+ <Atom class=\"GA3P\" epsilon=\"0.5045904\" sigma=\"0.04042898382920859\" />\n+ <Atom class=\"RH3P\" epsilon=\"0.537644\" sigma=\"0.0821943157356277\" />\n+ <Atom class=\"IN3P\" epsilon=\"0.6163031999999999\" sigma=\"0.15435711190499518\" />\n+ <Atom class=\"AU3P\" epsilon=\"0.5564720000000001\" sigma=\"0.065106878321696\" />\n+ <Atom class=\"TL3P\" epsilon=\"0.6815736\" sigma=\"0.15489165113587938\" />\n+ <Atom class=\"BI3P\" epsilon=\"0.7740400000000001\" sigma=\"0.24378552523192246\" />\n+ <NBFixPair class1=\"CLA\" class2=\"SOD\" epsilon=\"0.35093300000000005\" sigma=\"0.3323943117381606\" />\n+ <NBFixPair class1=\"CLA\" class2=\"POT\" epsilon=\"0.477963424\" sigma=\"0.3635757668730725\" />\n+ <NBFixPair class1=\"OC\" class2=\"SOD\" epsilon=\"0.31388368000000005\" sigma=\"0.28419669108676826\" />\n+ <NBFixPair class1=\"OCL\" class2=\"SOD\" epsilon=\"0.31388368000000005\" sigma=\"0.28419669108676826\" />\n+ <NBFixPair class1=\"OC2D2\" class2=\"SOD\" epsilon=\"0.31388368000000005\" sigma=\"0.28419669108676826\" />\n+ <NBFixPair class1=\"OG2D2\" class2=\"SOD\" epsilon=\"0.31388368000000005\" sigma=\"0.28419669108676826\" />\n+ </LennardJonesForce>\n+ <InitializationScript>\n+EXPECTED_VERSION = \"charmm36_2024\"\n+if hasattr(self, \"_charmm_ff_version\"):\n+ if self._charmm_ff_version != EXPECTED_VERSION:\n+ raise RuntimeError(f\"CHARMM force field versions ({self._charmm_ff_version} and {EXPECTED_VERSION}) incompatible\")\n+else:\n+ self._charmm_ff_version = EXPECTED_VERSION\n+ </InitializationScript>\n+</ForceField>\n\\ No newline at end of file\ndiff --git a/wrappers/python/openmm/app/data/charmm36_2024/tip5p.xml b/wrappers/python/openmm/app/data/charmm36_2024/tip5p.xml\nnew file mode 100644\nindex 0000000000..68623343b8\n--- /dev/null\n+++ b/wrappers/python/openmm/app/data/charmm36_2024/tip5p.xml\n@@ -0,0 +1,469 @@\n+<ForceField>\n+ <Info>\n+ <DateGenerated>2025-02-27</DateGenerated>\n+ <Source Source=\"toppar/non_charmm/toppar_water_ions_tip5p.str\" md5hash=\"9c77ba3236c2f10e5474bcbda612a486\" sourcePackage=\"charmm36\" sourcePackageVersion=\"toppar_c36_jul24.tgz\">toppar/non_charmm/toppar_water_ions_tip5p.str</Source>\n+ <Source Source=\"toppar/stream/misc/toppar_ions_won.str\" md5hash=\"f523f7727e7dfa25468cc75f9b880c5b\" sourcePackage=\"charmm36\" sourcePackageVersion=\"toppar_c36_jul24.tgz\">toppar/stream/misc/toppar_ions_won.str</Source>\n+ <Reference Reference=\"M.W. Mahoney and W.L. Jorgensen. A five-site model for liquid water and the reproduction of the density anomaly by rigid, nonpolarizable potential functions. J. Chem Phys. 112:8910-8922, 2000.\" forcefield=\"tip5p\">M.W. Mahoney and W.L. Jorgensen. A five-site model for liquid water and the reproduction of the density anomaly by rigid, nonpolarizable potential functions. J. Chem Phys. 112:8910-8922, 2000.</Reference>\n+ <Reference Reference=\"Beglov, D. and Roux, B., Finite Representation of an Infinite Bulk System: Solvent Boundary Potential for Computer Simulations, Journal of Chemical Physics, 1994, 100: 9050-9063\" forcefield=\"ions\">Beglov, D. and Roux, B., Finite Representation of an Infinite Bulk System: Solvent Boundary Potential for Computer Simulations, Journal of Chemical Physics, 1994, 100: 9050-9063</Reference>\n+ <Reference Reference=\"Stote, R.H. and Karplus, M. Zinc Binding in Proteins and Solution: A Simple but Accurate Nonbonded Representation, PROTEINS: Structure, Function, and Genetics 23:12-31 (1995)\" forcefield=\"ions\">Stote, R.H. and Karplus, M. Zinc Binding in Proteins and Solution: A Simple but Accurate Nonbonded Representation, PROTEINS: Structure, Function, and Genetics 23:12-31 (1995)</Reference>\n+ <Reference Reference=\"Won, Y., "Force Field for Monovalent, Divalent, and Trivalent Cations Developed under the Solvent Boundary Potential," Journal of Physical Chemistry A., 116: 11763-11767, 2012.\" forcefield=\"ions\">Won, Y., \"Force Field for Monovalent, Divalent, and Trivalent Cations Developed under the Solvent Boundary Potential,\" Journal of Physical Chemistry A., 116: 11763-11767, 2012.</Reference>\n+ </Info>\n+ <AtomTypes>\n+ <Type class=\"OT\" element=\"O\" mass=\"15.9994\" name=\"TIP5-OH2\" />\n+ <Type class=\"HT\" element=\"H\" mass=\"1.008\" name=\"TIP5-H1\" />\n+ <Type class=\"HT\" element=\"H\" mass=\"1.008\" name=\"TIP5-H2\" />\n+ <Type class=\"LP\" mass=\"0.0\" name=\"TIP5-LP1\" />\n+ <Type class=\"LP\" mass=\"0.0\" name=\"TIP5-LP2\" />\n+ <Type class=\"OX\" element=\"O\" mass=\"15.9994\" name=\"OH-O1\" />\n+ <Type class=\"HX\" element=\"H\" mass=\"1.008\" name=\"OH-H1\" />\n+ <Type class=\"LIT\" element=\"Li\" mass=\"6.941\" name=\"LIT-LIT\" />\n+ <Type class=\"SOD\" element=\"Na\" mass=\"22.98977\" name=\"SOD-SOD\" />\n+ <Type class=\"MG\" element=\"Mg\" mass=\"24.305\" name=\"MG-MG\" />\n+ <Type class=\"POT\" element=\"K\" mass=\"39.0983\" name=\"POT-POT\" />\n+ <Type class=\"CAL\" element=\"Ca\" mass=\"40.08\" name=\"CAL-CAL\" />\n+ <Type class=\"RUB\" element=\"Rb\" mass=\"85.4678\" name=\"RUB-RUB\" />\n+ <Type class=\"CES\" element=\"Cs\" mass=\"132.90545\" name=\"CES-CES\" />\n+ <Type class=\"BAR\" element=\"Ba\" mass=\"137.327\" name=\"BAR-BAR\" />\n+ <Type class=\"ZN\" element=\"Zn\" mass=\"65.37\" name=\"ZN2-ZN\" />\n+ <Type class=\"CAD\" element=\"Cd\" mass=\"112.411\" name=\"CD2-CD\" />\n+ <Type class=\"CLA\" element=\"Cl\" mass=\"35.45\" name=\"CLA-CLA\" />\n+ <Type class=\"CU1P\" element=\"Cu\" mass=\"63.546\" name=\"CU1P-CU1P\" />\n+ <Type class=\"AG1P\" element=\"Ag\" mass=\"107.87\" name=\"AG1P-AG1P\" />\n+ <Type class=\"AU1P\" element=\"Au\" mass=\"196.97\" name=\"AU1P-AU1P\" />\n+ <Type class=\"TI1P\" element=\"Ti\" mass=\"47.867\" name=\"TI1P-TI1P\" />\n+ <Type class=\"BE2P\" element=\"Be\" mass=\"9.0122\" name=\"BE2P-BE2P\" />\n+ <Type class=\"SR2P\" element=\"Sr\" mass=\"87.62\" name=\"SR2P-SR2P\" />\n+ <Type class=\"RA2P\" element=\"Ra\" mass=\"226.03\" name=\"RA2P-RA2P\" />\n+ <Type class=\"V2P\" element=\"V\" mass=\"50.942\" name=\"V2P-V2P\" />\n+ <Type class=\"CR2P\" element=\"Cr\" mass=\"51.996\" name=\"CR2P-CR2P\" />\n+ <Type class=\"MN2P\" element=\"Mn\" mass=\"54.938\" name=\"MN2P-MN2P\" />\n+ <Type class=\"FE2P\" element=\"Fe\" mass=\"55.854\" name=\"FE2P-FE2P\" />\n+ <Type class=\"CO2P\" element=\"Co\" mass=\"58.933\" name=\"CO2P-CO2P\" />\n+ <Type class=\"NI2P\" element=\"Ni\" mass=\"58.693\" name=\"NI2P-NI2P\" />\n+ <Type class=\"CU2P\" element=\"Cu\" mass=\"63.546\" name=\"CU2P-CU2P\" />\n+ <Type class=\"PD2P\" element=\"Pd\" mass=\"106.42\" name=\"PD2P-PD2P\" />\n+ <Type class=\"AG2P\" element=\"Ag\" mass=\"107.87\" name=\"AG2P-AG2P\" />\n+ <Type class=\"SN2P\" element=\"Sn\" mass=\"118.71\" name=\"SN2P-SN2P\" />\n+ <Type class=\"PT2P\" element=\"Pt\" mass=\"195.08\" name=\"PT2P-PT2P\" />\n+ <Type class=\"HG2P\" element=\"Hg\" mass=\"200.59\" name=\"HG2P-HG2P\" />\n+ <Type class=\"PB2P\" element=\"Pb\" mass=\"207.2\" name=\"PB2P-PB2P\" />\n+ <Type class=\"SM2P\" element=\"Sm\" mass=\"150.36\" name=\"SM2P-SM2P\" />\n+ <Type class=\"EU2P\" element=\"Eu\" mass=\"151.96\" name=\"EU2P-EU2P\" />\n+ <Type class=\"YB2P\" element=\"Yb\" mass=\"173.05\" name=\"YB2P-YB2P\" />\n+ <Type class=\"AL3P\" element=\"Al\" mass=\"26.982\" name=\"AL3P-AL3P\" />\n+ <Type class=\"SC3P\" element=\"Sc\" mass=\"44.956\" name=\"SC3P-SC3P\" />\n+ <Type class=\"Y3P\" element=\"Y\" mass=\"88.906\" name=\"Y3P-Y3P\" />\n+ <Type class=\"LA3P\" element=\"La\" mass=\"138.91\" name=\"LA3P-LA3P\" />\n+ <Type class=\"CE3P\" element=\"Ce\" mass=\"140.12\" name=\"CE3P-CE3P\" />\n+ <Type class=\"PR3P\" element=\"Pr\" mass=\"140.91\" name=\"PR3P-PR3P\" />\n+ <Type class=\"ND3P\" element=\"Nd\" mass=\"144.24\" name=\"ND3P-ND3P\" />\n+ <Type class=\"PM3P\" element=\"Pm\" mass=\"144.91\" name=\"PM3P-PM3P\" />\n+ <Type class=\"SM3P\" element=\"Sm\" mass=\"150.36\" name=\"SM3P-SM3P\" />\n+ <Type class=\"EU3P\" element=\"Eu\" mass=\"151.96\" name=\"EU3P-EU3P\" />\n+ <Type class=\"GD3P\" element=\"Gd\" mass=\"157.25\" name=\"GD3P-GD3P\" />\n+ <Type class=\"TB3P\" element=\"Tb\" mass=\"158.93\" name=\"TB3P-TB3P\" />\n+ <Type class=\"DY3P\" element=\"Dy\" mass=\"162.5\" name=\"DY3P-DY3P\" />\n+ <Type class=\"HO3P\" element=\"Ho\" mass=\"164.93\" name=\"HO3P-HO3P\" />\n+ <Type class=\"ER3P\" element=\"Er\" mass=\"167.28\" name=\"ER3P-ER3P\" />\n+ <Type class=\"YB3P\" element=\"Yb\" mass=\"173.05\" name=\"YB3P-YB3P\" />\n+ <Type class=\"LU3P\" element=\"Lu\" mass=\"174.97\" name=\"LU3P-LU3P\" />\n+ <Type class=\"U3P\" element=\"U\" mass=\"238.03\" name=\"U3P-U3P\" />\n+ <Type class=\"PU3P\" element=\"Pu\" mass=\"244.06\" name=\"PU3P-PU3P\" />\n+ <Type class=\"TI3P\" element=\"Ti\" mass=\"47.867\" name=\"TI3P-TI3P\" />\n+ <Type class=\"V3P\" element=\"V\" mass=\"50.942\" name=\"V3P-V3P\" />\n+ <Type class=\"CR3P\" element=\"Cr\" mass=\"51.996\" name=\"CR3P-CR3P\" />\n+ <Type class=\"MN3P\" element=\"Mn\" mass=\"54.938\" name=\"MN3P-MN3P\" />\n+ <Type class=\"FE3P\" element=\"Fe\" mass=\"55.854\" name=\"FE3P-FE3P\" />\n+ <Type class=\"CO3P\" element=\"Co\" mass=\"58.933\" name=\"CO3P-CO3P\" />\n+ <Type class=\"GA3P\" element=\"Ga\" mass=\"69.723\" name=\"GA3P-GA3P\" />\n+ <Type class=\"RH3P\" element=\"Rh\" mass=\"102.91\" name=\"RH3P-RH3P\" />\n+ <Type class=\"IN3P\" element=\"In\" mass=\"114.82\" name=\"IN3P-IN3P\" />\n+ <Type class=\"AU3P\" element=\"Au\" mass=\"196.97\" name=\"AU3P-AU3P\" />\n+ <Type class=\"TL3P\" element=\"Tl\" mass=\"204.38\" name=\"TL3P-TL3P\" />\n+ <Type class=\"BI3P\" element=\"Bi\" mass=\"208.98\" name=\"BI3P-BI3P\" />\n+ </AtomTypes>\n+ <Residues>\n+ <Residue name=\"TIP5\">\n+ <Atom charge=\"0.0\" name=\"OH2\" type=\"TIP5-OH2\" />\n+ <Atom charge=\"0.241\" name=\"H1\" type=\"TIP5-H1\" />\n+ <Atom charge=\"0.241\" name=\"H2\" type=\"TIP5-H2\" />\n+ <Atom charge=\"-0.241\" name=\"LP1\" type=\"TIP5-LP1\" />\n+ <Atom charge=\"-0.241\" name=\"LP2\" type=\"TIP5-LP2\" />\n+ <Bond atomName1=\"OH2\" atomName2=\"H1\" />\n+ <Bond atomName1=\"OH2\" atomName2=\"H2\" />\n+ <VirtualSite atomName1=\"OH2\" atomName2=\"H2\" atomName3=\"H1\" p1=\"-0.04041512765608711\" p2=\"0\" p3=\"0.057154330164408206\" siteName=\"LP1\" type=\"localCoords\" wo1=\"1\" wo2=\"0\" wo3=\"0\" wx1=\"-1.0\" wx2=\"0.5\" wx3=\"0.5\" wy1=\"0\" wy2=\"-1\" wy3=\"1\" />\n+ <VirtualSite atomName1=\"OH2\" atomName2=\"H2\" atomName3=\"H1\" p1=\"-0.04041512765608711\" p2=\"0\" p3=\"-0.057154330164408206\" siteName=\"LP2\" type=\"localCoords\" wo1=\"1\" wo2=\"0\" wo3=\"0\" wx1=\"-1.0\" wx2=\"0.5\" wx3=\"0.5\" wy1=\"0\" wy2=\"-1\" wy3=\"1\" />\n+ </Residue>\n+ <Residue name=\"OH\">\n+ <Atom charge=\"-1.32\" name=\"O1\" type=\"OH-O1\" />\n+ <Atom charge=\"0.32\" name=\"H1\" type=\"OH-H1\" />\n+ <Bond atomName1=\"O1\" atomName2=\"H1\" />\n+ </Residue>\n+ <Residue name=\"LIT\">\n+ <Atom charge=\"1.0\" name=\"LIT\" type=\"LIT-LIT\" />\n+ </Residue>\n+ <Residue name=\"SOD\">\n+ <Atom charge=\"1.0\" name=\"SOD\" type=\"SOD-SOD\" />\n+ </Residue>\n+ <Residue name=\"MG\">\n+ <Atom charge=\"2.0\" name=\"MG\" type=\"MG-MG\" />\n+ </Residue>\n+ <Residue name=\"POT\">\n+ <Atom charge=\"1.0\" name=\"POT\" type=\"POT-POT\" />\n+ </Residue>\n+ <Residue name=\"CAL\">\n+ <Atom charge=\"2.0\" name=\"CAL\" type=\"CAL-CAL\" />\n+ </Residue>\n+ <Residue name=\"RUB\">\n+ <Atom charge=\"1.0\" name=\"RUB\" type=\"RUB-RUB\" />\n+ </Residue>\n+ <Residue name=\"CES\">\n+ <Atom charge=\"1.0\" name=\"CES\" type=\"CES-CES\" />\n+ </Residue>\n+ <Residue name=\"BAR\">\n+ <Atom charge=\"2.0\" name=\"BAR\" type=\"BAR-BAR\" />\n+ </Residue>\n+ <Residue name=\"ZN2\">\n+ <Atom charge=\"2.0\" name=\"ZN\" type=\"ZN2-ZN\" />\n+ </Residue>\n+ <Residue name=\"CD2\">\n+ <Atom charge=\"2.0\" name=\"CD\" type=\"CD2-CD\" />\n+ </Residue>\n+ <Residue name=\"CLA\">\n+ <Atom charge=\"-1.0\" name=\"CLA\" type=\"CLA-CLA\" />\n+ </Residue>\n+ <Residue name=\"CU1P\">\n+ <Atom charge=\"1.0\" name=\"CU1P\" type=\"CU1P-CU1P\" />\n+ </Residue>\n+ <Residue name=\"AG1P\">\n+ <Atom charge=\"1.0\" name=\"AG1P\" type=\"AG1P-AG1P\" />\n+ </Residue>\n+ <Residue name=\"AU1P\">\n+ <Atom charge=\"1.0\" name=\"AU1P\" type=\"AU1P-AU1P\" />\n+ </Residue>\n+ <Residue name=\"TI1P\">\n+ <Atom charge=\"1.0\" name=\"TI1P\" type=\"TI1P-TI1P\" />\n+ </Residue>\n+ <Residue name=\"BE2P\">\n+ <Atom charge=\"2.0\" name=\"BE2P\" type=\"BE2P-BE2P\" />\n+ </Residue>\n+ <Residue name=\"SR2P\">\n+ <Atom charge=\"2.0\" name=\"SR2P\" type=\"SR2P-SR2P\" />\n+ </Residue>\n+ <Residue name=\"RA2P\">\n+ <Atom charge=\"2.0\" name=\"RA2P\" type=\"RA2P-RA2P\" />\n+ </Residue>\n+ <Residue name=\"V2P\">\n+ <Atom charge=\"2.0\" name=\"V2P\" type=\"V2P-V2P\" />\n+ </Residue>\n+ <Residue name=\"CR2P\">\n+ <Atom charge=\"2.0\" name=\"CR2P\" type=\"CR2P-CR2P\" />\n+ </Residue>\n+ <Residue name=\"MN2P\">\n+ <Atom charge=\"2.0\" name=\"MN2P\" type=\"MN2P-MN2P\" />\n+ </Residue>\n+ <Residue name=\"FE2P\">\n+ <Atom charge=\"2.0\" name=\"FE2P\" type=\"FE2P-FE2P\" />\n+ </Residue>\n+ <Residue name=\"CO2P\">\n+ <Atom charge=\"2.0\" name=\"CO2P\" type=\"CO2P-CO2P\" />\n+ </Residue>\n+ <Residue name=\"NI2P\">\n+ <Atom charge=\"2.0\" name=\"NI2P\" type=\"NI2P-NI2P\" />\n+ </Residue>\n+ <Residue name=\"CU2P\">\n+ <Atom charge=\"2.0\" name=\"CU2P\" type=\"CU2P-CU2P\" />\n+ </Residue>\n+ <Residue name=\"PD2P\">\n+ <Atom charge=\"2.0\" name=\"PD2P\" type=\"PD2P-PD2P\" />\n+ </Residue>\n+ <Residue name=\"AG2P\">\n+ <Atom charge=\"2.0\" name=\"AG2P\" type=\"AG2P-AG2P\" />\n+ </Residue>\n+ <Residue name=\"SN2P\">\n+ <Atom charge=\"2.0\" name=\"SN2P\" type=\"SN2P-SN2P\" />\n+ </Residue>\n+ <Residue name=\"PT2P\">\n+ <Atom charge=\"2.0\" name=\"PT2P\" type=\"PT2P-PT2P\" />\n+ </Residue>\n+ <Residue name=\"HG2P\">\n+ <Atom charge=\"2.0\" name=\"HG2P\" type=\"HG2P-HG2P\" />\n+ </Residue>\n+ <Residue name=\"PB2P\">\n+ <Atom charge=\"2.0\" name=\"PB2P\" type=\"PB2P-PB2P\" />\n+ </Residue>\n+ <Residue name=\"SM2P\">\n+ <Atom charge=\"2.0\" name=\"SM2P\" type=\"SM2P-SM2P\" />\n+ </Residue>\n+ <Residue name=\"EU2P\">\n+ <Atom charge=\"2.0\" name=\"EU2P\" type=\"EU2P-EU2P\" />\n+ </Residue>\n+ <Residue name=\"YB2P\">\n+ <Atom charge=\"2.0\" name=\"YB2P\" type=\"YB2P-YB2P\" />\n+ </Residue>\n+ <Residue name=\"AL3P\">\n+ <Atom charge=\"3.0\" name=\"AL3P\" type=\"AL3P-AL3P\" />\n+ </Residue>\n+ <Residue name=\"SC3P\">\n+ <Atom charge=\"3.0\" name=\"SC3P\" type=\"SC3P-SC3P\" />\n+ </Residue>\n+ <Residue name=\"Y3P\">\n+ <Atom charge=\"3.0\" name=\"Y3P\" type=\"Y3P-Y3P\" />\n+ </Residue>\n+ <Residue name=\"LA3P\">\n+ <Atom charge=\"3.0\" name=\"LA3P\" type=\"LA3P-LA3P\" />\n+ </Residue>\n+ <Residue name=\"CE3P\">\n+ <Atom charge=\"3.0\" name=\"CE3P\" type=\"CE3P-CE3P\" />\n+ </Residue>\n+ <Residue name=\"PR3P\">\n+ <Atom charge=\"3.0\" name=\"PR3P\" type=\"PR3P-PR3P\" />\n+ </Residue>\n+ <Residue name=\"ND3P\">\n+ <Atom charge=\"3.0\" name=\"ND3P\" type=\"ND3P-ND3P\" />\n+ </Residue>\n+ <Residue name=\"PM3P\">\n+ <Atom charge=\"3.0\" name=\"PM3P\" type=\"PM3P-PM3P\" />\n+ </Residue>\n+ <Residue name=\"SM3P\">\n+ <Atom charge=\"3.0\" name=\"SM3P\" type=\"SM3P-SM3P\" />\n+ </Residue>\n+ <Residue name=\"EU3P\">\n+ <Atom charge=\"3.0\" name=\"EU3P\" type=\"EU3P-EU3P\" />\n+ </Residue>\n+ <Residue name=\"GD3P\">\n+ <Atom charge=\"3.0\" name=\"GD3P\" type=\"GD3P-GD3P\" />\n+ </Residue>\n+ <Residue name=\"TB3P\">\n+ <Atom charge=\"3.0\" name=\"TB3P\" type=\"TB3P-TB3P\" />\n+ </Residue>\n+ <Residue name=\"DY3P\">\n+ <Atom charge=\"3.0\" name=\"DY3P\" type=\"DY3P-DY3P\" />\n+ </Residue>\n+ <Residue name=\"HO3P\">\n+ <Atom charge=\"3.0\" name=\"HO3P\" type=\"HO3P-HO3P\" />\n+ </Residue>\n+ <Residue name=\"ER3P\">\n+ <Atom charge=\"3.0\" name=\"ER3P\" type=\"ER3P-ER3P\" />\n+ </Residue>\n+ <Residue name=\"YB3P\">\n+ <Atom charge=\"3.0\" name=\"YB3P\" type=\"YB3P-YB3P\" />\n+ </Residue>\n+ <Residue name=\"LU3P\">\n+ <Atom charge=\"3.0\" name=\"LU3P\" type=\"LU3P-LU3P\" />\n+ </Residue>\n+ <Residue name=\"U3P\">\n+ <Atom charge=\"3.0\" name=\"U3P\" type=\"U3P-U3P\" />\n+ </Residue>\n+ <Residue name=\"PU3P\">\n+ <Atom charge=\"3.0\" name=\"PU3P\" type=\"PU3P-PU3P\" />\n+ </Residue>\n+ <Residue name=\"TI3P\">\n+ <Atom charge=\"3.0\" name=\"TI3P\" type=\"TI3P-TI3P\" />\n+ </Residue>\n+ <Residue name=\"V3P\">\n+ <Atom charge=\"3.0\" name=\"V3P\" type=\"V3P-V3P\" />\n+ </Residue>\n+ <Residue name=\"CR3P\">\n+ <Atom charge=\"3.0\" name=\"CR3P\" type=\"CR3P-CR3P\" />\n+ </Residue>\n+ <Residue name=\"MN3P\">\n+ <Atom charge=\"3.0\" name=\"MN3P\" type=\"MN3P-MN3P\" />\n+ </Residue>\n+ <Residue name=\"FE3P\">\n+ <Atom charge=\"3.0\" name=\"FE3P\" type=\"FE3P-FE3P\" />\n+ </Residue>\n+ <Residue name=\"CO3P\">\n+ <Atom charge=\"3.0\" name=\"CO3P\" type=\"CO3P-CO3P\" />\n+ </Residue>\n+ <Residue name=\"GA3P\">\n+ <Atom charge=\"3.0\" name=\"GA3P\" type=\"GA3P-GA3P\" />\n+ </Residue>\n+ <Residue name=\"RH3P\">\n+ <Atom charge=\"3.0\" name=\"RH3P\" type=\"RH3P-RH3P\" />\n+ </Residue>\n+ <Residue name=\"IN3P\">\n+ <Atom charge=\"3.0\" name=\"IN3P\" type=\"IN3P-IN3P\" />\n+ </Residue>\n+ <Residue name=\"AU3P\">\n+ <Atom charge=\"3.0\" name=\"AU3P\" type=\"AU3P-AU3P\" />\n+ </Residue>\n+ <Residue name=\"TL3P\">\n+ <Atom charge=\"3.0\" name=\"TL3P\" type=\"TL3P-TL3P\" />\n+ </Residue>\n+ <Residue name=\"BI3P\">\n+ <Atom charge=\"3.0\" name=\"BI3P\" type=\"BI3P-BI3P\" />\n+ </Residue>\n+ </Residues>\n+ <HarmonicBondForce>\n+ <Bond class1=\"HT\" class2=\"HT\" k=\"0.0\" length=\"0.15139000000000002\" />\n+ <Bond class1=\"HT\" class2=\"OT\" k=\"376559.99999999994\" length=\"0.09572000000000001\" />\n+ <Bond class1=\"OX\" class2=\"HX\" k=\"456055.99999999994\" length=\"0.097\" />\n+ <Bond class1=\"OT\" class2=\"LP\" k=\"0.0\" length=\"0.06999999999999999\" />\n+ </HarmonicBondForce>\n+ <HarmonicAngleForce>\n+ <Angle angle=\"1.8242181341844732\" class1=\"HT\" class2=\"OT\" class3=\"HT\" k=\"460.24\" />\n+ </HarmonicAngleForce>\n+ <AmoebaUreyBradleyForce />\n+ <NonbondedForce coulomb14scale=\"1.0\" lj14scale=\"1.0\">\n+ <UseAttributeFromResidue name=\"charge\" />\n+ <Atom class=\"HT\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"HX\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"OT\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"OX\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"LIT\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"SOD\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"MG\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"POT\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"CAL\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"RUB\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"CES\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"BAR\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"ZN\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"CAD\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"CLA\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"LP\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"CU1P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"AG1P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"AU1P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"TI1P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"BE2P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"SR2P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"RA2P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"V2P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"CR2P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"MN2P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"FE2P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"CO2P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"NI2P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"CU2P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"PD2P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"AG2P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"SN2P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"PT2P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"HG2P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"PB2P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"SM2P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"EU2P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"YB2P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"AL3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"SC3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"Y3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"LA3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"CE3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"PR3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"ND3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"PM3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"SM3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"EU3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"GD3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"TB3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"DY3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"HO3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"ER3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"TM3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"YB3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"LU3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"U3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"PU3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"TI3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"V3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"CR3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"MN3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"FE3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"CO3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"GA3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"RH3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"IN3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"AU3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"TL3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"BI3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ </NonbondedForce>\n+ <LennardJonesForce lj14scale=\"1.0\">\n+ <Atom class=\"HT\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"HX\" epsilon=\"0.192464\" sigma=\"0.04000135244450124\" />\n+ <Atom class=\"OT\" epsilon=\"0.66944\" sigma=\"0.3119570951440212\" />\n+ <Atom class=\"OX\" epsilon=\"0.50208\" sigma=\"0.30290556416771536\" />\n+ <Atom class=\"LIT\" epsilon=\"0.00974872\" sigma=\"0.23118821735741807\" />\n+ <Atom class=\"SOD\" epsilon=\"0.1962296\" sigma=\"0.2513670733232967\" />\n+ <Atom class=\"MG\" epsilon=\"0.06276\" sigma=\"0.2111429961992604\" />\n+ <Atom class=\"POT\" epsilon=\"0.364008\" sigma=\"0.3142645228240047\" />\n+ <Atom class=\"CAL\" epsilon=\"0.50208\" sigma=\"0.24357170953956878\" />\n+ <Atom class=\"RUB\" epsilon=\"0.6276\" sigma=\"0.3385415128933289\" />\n+ <Atom class=\"CES\" epsilon=\"0.79496\" sigma=\"0.37417746161894255\" />\n+ <Atom class=\"BAR\" epsilon=\"0.6276\" sigma=\"0.33675971545704825\" />\n+ <Atom class=\"ZN\" epsilon=\"1.046\" sigma=\"0.194215920554594\" />\n+ <Atom class=\"CAD\" epsilon=\"0.50208\" sigma=\"0.2417899121032881\" />\n+ <Atom class=\"CLA\" epsilon=\"0.6276\" sigma=\"0.4044680180357141\" />\n+ <Atom class=\"LP\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"CU1P\" epsilon=\"0.7748768\" sigma=\"0.1535909390073945\" />\n+ <Atom class=\"AG1P\" epsilon=\"1.2008079999999999\" sigma=\"0.2163636626875628\" />\n+ <Atom class=\"AU1P\" epsilon=\"1.4907592\" sigma=\"0.11250269012676205\" />\n+ <Atom class=\"TI1P\" epsilon=\"1.7016328\" sigma=\"0.34401163102271065\" />\n+ <Atom class=\"BE2P\" epsilon=\"0.4250944\" sigma=\"0.007127189745122714\" />\n+ <Atom class=\"SR2P\" epsilon=\"0.9572992\" sigma=\"0.3306837861993312\" />\n+ <Atom class=\"RA2P\" epsilon=\"1.2631496\" sigma=\"0.37237784620829906\" />\n+ <Atom class=\"V2P\" epsilon=\"0.6732056\" sigma=\"0.1966569830422985\" />\n+ <Atom class=\"CR2P\" epsilon=\"0.6974728\" sigma=\"0.18872798445084948\" />\n+ <Atom class=\"MN2P\" epsilon=\"0.7050040000000001\" sigma=\"0.2144749574051053\" />\n+ <Atom class=\"FE2P\" epsilon=\"0.667348\" sigma=\"0.1924519410926761\" />\n+ <Atom class=\"CO2P\" epsilon=\"0.6439176000000001\" sigma=\"0.16527953018939576\" />\n+ <Atom class=\"NI2P\" epsilon=\"0.5999856\" sigma=\"0.13903365395298137\" />\n+ <Atom class=\"CU2P\" epsilon=\"0.629692\" sigma=\"0.129198132104712\" />\n+ <Atom class=\"PD2P\" epsilon=\"0.7288528\" sigma=\"0.16519044031758173\" />\n+ <Atom class=\"AG2P\" epsilon=\"0.7752952\" sigma=\"0.1869105510658432\" />\n+ <Atom class=\"SN2P\" epsilon=\"0.7861736\" sigma=\"0.29542201493533654\" />\n+ <Atom class=\"PT2P\" epsilon=\"0.6824104\" sigma=\"0.1420270736459329\" />\n+ <Atom class=\"HG2P\" epsilon=\"0.8593936\" sigma=\"0.2105728210196506\" />\n+ <Atom class=\"PB2P\" epsilon=\"1.0016496000000001\" sigma=\"0.3132399892981433\" />\n+ <Atom class=\"SM2P\" epsilon=\"1.0242432\" sigma=\"0.330790694045508\" />\n+ <Atom class=\"EU2P\" epsilon=\"0.9907712000000001\" sigma=\"0.3279220001730961\" />\n+ <Atom class=\"YB2P\" epsilon=\"0.8593936\" sigma=\"0.28669120749756116\" />\n+ <Atom class=\"AL3P\" epsilon=\"0.44601440000000003\" sigma=\"0.039377723341803\" />\n+ <Atom class=\"SC3P\" epsilon=\"0.5899439999999999\" sigma=\"0.19544536078562763\" />\n+ <Atom class=\"Y3P\" epsilon=\"0.6928704\" sigma=\"0.25183924964391113\" />\n+ <Atom class=\"LA3P\" epsilon=\"0.7932864\" sigma=\"0.3158592315294759\" />\n+ <Atom class=\"CE3P\" epsilon=\"0.7702744000000001\" sigma=\"0.30495463121943817\" />\n+ <Atom class=\"PR3P\" epsilon=\"0.7627432\" sigma=\"0.2956180126533274\" />\n+ <Atom class=\"ND3P\" epsilon=\"0.7497728\" sigma=\"0.2886333667031071\" />\n+ <Atom class=\"PM3P\" epsilon=\"0.74266\" sigma=\"0.29527947114043407\" />\n+ <Atom class=\"SM3P\" epsilon=\"0.7351288\" sigma=\"0.2791542043420939\" />\n+ <Atom class=\"EU3P\" epsilon=\"0.728016\" sigma=\"0.2713677495455473\" />\n+ <Atom class=\"GD3P\" epsilon=\"0.7209032000000001\" sigma=\"0.2681605141602421\" />\n+ <Atom class=\"TB3P\" epsilon=\"0.7083512000000001\" sigma=\"0.2628151218514001\" />\n+ <Atom class=\"DY3P\" epsilon=\"0.6999832\" sigma=\"0.2573628216963812\" />\n+ <Atom class=\"HO3P\" epsilon=\"0.6928704\" sigma=\"0.247794569463554\" />\n+ <Atom class=\"ER3P\" epsilon=\"0.6845024\" sigma=\"0.24362516346265717\" />\n+ <Atom class=\"TM3P\" epsilon=\"0.6778080000000001\" sigma=\"0.24029320225681233\" />\n+ <Atom class=\"YB3P\" epsilon=\"0.6711136\" sigma=\"0.23077840394707347\" />\n+ <Atom class=\"LU3P\" epsilon=\"0.6644192\" sigma=\"0.2407564695902453\" />\n+ <Atom class=\"U3P\" epsilon=\"0.7932864\" sigma=\"0.3031193798600691\" />\n+ <Atom class=\"PU3P\" epsilon=\"0.7702744000000001\" sigma=\"0.29750671793578487\" />\n+ <Atom class=\"TI3P\" epsilon=\"0.537644\" sigma=\"0.14769318949330543\" />\n+ <Atom class=\"V3P\" epsilon=\"0.5171424\" sigma=\"0.10943799853635927\" />\n+ <Atom class=\"CR3P\" epsilon=\"0.5045904\" sigma=\"0.15022334185282402\" />\n+ <Atom class=\"MN3P\" epsilon=\"0.5238368\" sigma=\"0.06849229345062928\" />\n+ <Atom class=\"FE3P\" epsilon=\"0.5238368\" sigma=\"0.10090318881657484\" />\n+ <Atom class=\"CO3P\" epsilon=\"0.4983144\" sigma=\"0.04598819183040431\" />\n+ <Atom class=\"GA3P\" epsilon=\"0.5045904\" sigma=\"0.04042898382920859\" />\n+ <Atom class=\"RH3P\" epsilon=\"0.537644\" sigma=\"0.0821943157356277\" />\n+ <Atom class=\"IN3P\" epsilon=\"0.6163031999999999\" sigma=\"0.15435711190499518\" />\n+ <Atom class=\"AU3P\" epsilon=\"0.5564720000000001\" sigma=\"0.065106878321696\" />\n+ <Atom class=\"TL3P\" epsilon=\"0.6815736\" sigma=\"0.15489165113587938\" />\n+ <Atom class=\"BI3P\" epsilon=\"0.7740400000000001\" sigma=\"0.24378552523192246\" />\n+ <NBFixPair class1=\"CLA\" class2=\"SOD\" epsilon=\"0.35093300000000005\" sigma=\"0.3323943117381606\" />\n+ <NBFixPair class1=\"CLA\" class2=\"POT\" epsilon=\"0.477963424\" sigma=\"0.3635757668730725\" />\n+ <NBFixPair class1=\"OC\" class2=\"SOD\" epsilon=\"0.31388368000000005\" sigma=\"0.28419669108676826\" />\n+ <NBFixPair class1=\"OCL\" class2=\"SOD\" epsilon=\"0.31388368000000005\" sigma=\"0.28419669108676826\" />\n+ <NBFixPair class1=\"OC2D2\" class2=\"SOD\" epsilon=\"0.31388368000000005\" sigma=\"0.28419669108676826\" />\n+ <NBFixPair class1=\"OG2D2\" class2=\"SOD\" epsilon=\"0.31388368000000005\" sigma=\"0.28419669108676826\" />\n+ </LennardJonesForce>\n+ <InitializationScript>\n+EXPECTED_VERSION = \"charmm36_2024\"\n+if hasattr(self, \"_charmm_ff_version\"):\n+ if self._charmm_ff_version != EXPECTED_VERSION:\n+ raise RuntimeError(f\"CHARMM force field versions ({self._charmm_ff_version} and {EXPECTED_VERSION}) incompatible\")\n+else:\n+ self._charmm_ff_version = EXPECTED_VERSION\n+ </InitializationScript>\n+</ForceField>\n\\ No newline at end of file\ndiff --git a/wrappers/python/openmm/app/data/charmm36_2024/tip5pew.xml b/wrappers/python/openmm/app/data/charmm36_2024/tip5pew.xml\nnew file mode 100644\nindex 0000000000..4db5f89b04\n--- /dev/null\n+++ b/wrappers/python/openmm/app/data/charmm36_2024/tip5pew.xml\n@@ -0,0 +1,469 @@\n+<ForceField>\n+ <Info>\n+ <DateGenerated>2025-02-27</DateGenerated>\n+ <Source Source=\"toppar/non_charmm/toppar_water_ions_tip5p_ew.str\" md5hash=\"f12096ec0aa691de80983a34cc5cce5a\" sourcePackage=\"charmm36\" sourcePackageVersion=\"toppar_c36_jul24.tgz\">toppar/non_charmm/toppar_water_ions_tip5p_ew.str</Source>\n+ <Source Source=\"toppar/stream/misc/toppar_ions_won.str\" md5hash=\"f523f7727e7dfa25468cc75f9b880c5b\" sourcePackage=\"charmm36\" sourcePackageVersion=\"toppar_c36_jul24.tgz\">toppar/stream/misc/toppar_ions_won.str</Source>\n+ <Reference Reference=\"Rick, S.W. A reoptimization of the five-site water potential (TIP5P) for use with Ewald sums. J Chem Phys 120: 6085-93, 2004.\" forcefield=\"tip5p-ew\">Rick, S.W. A reoptimization of the five-site water potential (TIP5P) for use with Ewald sums. J Chem Phys 120: 6085-93, 2004.</Reference>\n+ <Reference Reference=\"Beglov, D. and Roux, B., Finite Representation of an Infinite Bulk System: Solvent Boundary Potential for Computer Simulations, Journal of Chemical Physics, 1994, 100: 9050-9063\" forcefield=\"ions\">Beglov, D. and Roux, B., Finite Representation of an Infinite Bulk System: Solvent Boundary Potential for Computer Simulations, Journal of Chemical Physics, 1994, 100: 9050-9063</Reference>\n+ <Reference Reference=\"Stote, R.H. and Karplus, M. Zinc Binding in Proteins and Solution: A Simple but Accurate Nonbonded Representation, PROTEINS: Structure, Function, and Genetics 23:12-31 (1995)\" forcefield=\"ions\">Stote, R.H. and Karplus, M. Zinc Binding in Proteins and Solution: A Simple but Accurate Nonbonded Representation, PROTEINS: Structure, Function, and Genetics 23:12-31 (1995)</Reference>\n+ <Reference Reference=\"Won, Y., "Force Field for Monovalent, Divalent, and Trivalent Cations Developed under the Solvent Boundary Potential," Journal of Physical Chemistry A., 116: 11763-11767, 2012.\" forcefield=\"ions\">Won, Y., \"Force Field for Monovalent, Divalent, and Trivalent Cations Developed under the Solvent Boundary Potential,\" Journal of Physical Chemistry A., 116: 11763-11767, 2012.</Reference>\n+ </Info>\n+ <AtomTypes>\n+ <Type class=\"OT\" element=\"O\" mass=\"15.9994\" name=\"TP5E-OH2\" />\n+ <Type class=\"HT\" element=\"H\" mass=\"1.008\" name=\"TP5E-H1\" />\n+ <Type class=\"HT\" element=\"H\" mass=\"1.008\" name=\"TP5E-H2\" />\n+ <Type class=\"LP\" mass=\"0.0\" name=\"TP5E-LP1\" />\n+ <Type class=\"LP\" mass=\"0.0\" name=\"TP5E-LP2\" />\n+ <Type class=\"OX\" element=\"O\" mass=\"15.9994\" name=\"OH-O1\" />\n+ <Type class=\"HX\" element=\"H\" mass=\"1.008\" name=\"OH-H1\" />\n+ <Type class=\"LIT\" element=\"Li\" mass=\"6.941\" name=\"LIT-LIT\" />\n+ <Type class=\"SOD\" element=\"Na\" mass=\"22.98977\" name=\"SOD-SOD\" />\n+ <Type class=\"MG\" element=\"Mg\" mass=\"24.305\" name=\"MG-MG\" />\n+ <Type class=\"POT\" element=\"K\" mass=\"39.0983\" name=\"POT-POT\" />\n+ <Type class=\"CAL\" element=\"Ca\" mass=\"40.08\" name=\"CAL-CAL\" />\n+ <Type class=\"RUB\" element=\"Rb\" mass=\"85.4678\" name=\"RUB-RUB\" />\n+ <Type class=\"CES\" element=\"Cs\" mass=\"132.90545\" name=\"CES-CES\" />\n+ <Type class=\"BAR\" element=\"Ba\" mass=\"137.327\" name=\"BAR-BAR\" />\n+ <Type class=\"ZN\" element=\"Zn\" mass=\"65.37\" name=\"ZN2-ZN\" />\n+ <Type class=\"CAD\" element=\"Cd\" mass=\"112.411\" name=\"CD2-CD\" />\n+ <Type class=\"CLA\" element=\"Cl\" mass=\"35.45\" name=\"CLA-CLA\" />\n+ <Type class=\"CU1P\" element=\"Cu\" mass=\"63.546\" name=\"CU1P-CU1P\" />\n+ <Type class=\"AG1P\" element=\"Ag\" mass=\"107.87\" name=\"AG1P-AG1P\" />\n+ <Type class=\"AU1P\" element=\"Au\" mass=\"196.97\" name=\"AU1P-AU1P\" />\n+ <Type class=\"TI1P\" element=\"Ti\" mass=\"47.867\" name=\"TI1P-TI1P\" />\n+ <Type class=\"BE2P\" element=\"Be\" mass=\"9.0122\" name=\"BE2P-BE2P\" />\n+ <Type class=\"SR2P\" element=\"Sr\" mass=\"87.62\" name=\"SR2P-SR2P\" />\n+ <Type class=\"RA2P\" element=\"Ra\" mass=\"226.03\" name=\"RA2P-RA2P\" />\n+ <Type class=\"V2P\" element=\"V\" mass=\"50.942\" name=\"V2P-V2P\" />\n+ <Type class=\"CR2P\" element=\"Cr\" mass=\"51.996\" name=\"CR2P-CR2P\" />\n+ <Type class=\"MN2P\" element=\"Mn\" mass=\"54.938\" name=\"MN2P-MN2P\" />\n+ <Type class=\"FE2P\" element=\"Fe\" mass=\"55.854\" name=\"FE2P-FE2P\" />\n+ <Type class=\"CO2P\" element=\"Co\" mass=\"58.933\" name=\"CO2P-CO2P\" />\n+ <Type class=\"NI2P\" element=\"Ni\" mass=\"58.693\" name=\"NI2P-NI2P\" />\n+ <Type class=\"CU2P\" element=\"Cu\" mass=\"63.546\" name=\"CU2P-CU2P\" />\n+ <Type class=\"PD2P\" element=\"Pd\" mass=\"106.42\" name=\"PD2P-PD2P\" />\n+ <Type class=\"AG2P\" element=\"Ag\" mass=\"107.87\" name=\"AG2P-AG2P\" />\n+ <Type class=\"SN2P\" element=\"Sn\" mass=\"118.71\" name=\"SN2P-SN2P\" />\n+ <Type class=\"PT2P\" element=\"Pt\" mass=\"195.08\" name=\"PT2P-PT2P\" />\n+ <Type class=\"HG2P\" element=\"Hg\" mass=\"200.59\" name=\"HG2P-HG2P\" />\n+ <Type class=\"PB2P\" element=\"Pb\" mass=\"207.2\" name=\"PB2P-PB2P\" />\n+ <Type class=\"SM2P\" element=\"Sm\" mass=\"150.36\" name=\"SM2P-SM2P\" />\n+ <Type class=\"EU2P\" element=\"Eu\" mass=\"151.96\" name=\"EU2P-EU2P\" />\n+ <Type class=\"YB2P\" element=\"Yb\" mass=\"173.05\" name=\"YB2P-YB2P\" />\n+ <Type class=\"AL3P\" element=\"Al\" mass=\"26.982\" name=\"AL3P-AL3P\" />\n+ <Type class=\"SC3P\" element=\"Sc\" mass=\"44.956\" name=\"SC3P-SC3P\" />\n+ <Type class=\"Y3P\" element=\"Y\" mass=\"88.906\" name=\"Y3P-Y3P\" />\n+ <Type class=\"LA3P\" element=\"La\" mass=\"138.91\" name=\"LA3P-LA3P\" />\n+ <Type class=\"CE3P\" element=\"Ce\" mass=\"140.12\" name=\"CE3P-CE3P\" />\n+ <Type class=\"PR3P\" element=\"Pr\" mass=\"140.91\" name=\"PR3P-PR3P\" />\n+ <Type class=\"ND3P\" element=\"Nd\" mass=\"144.24\" name=\"ND3P-ND3P\" />\n+ <Type class=\"PM3P\" element=\"Pm\" mass=\"144.91\" name=\"PM3P-PM3P\" />\n+ <Type class=\"SM3P\" element=\"Sm\" mass=\"150.36\" name=\"SM3P-SM3P\" />\n+ <Type class=\"EU3P\" element=\"Eu\" mass=\"151.96\" name=\"EU3P-EU3P\" />\n+ <Type class=\"GD3P\" element=\"Gd\" mass=\"157.25\" name=\"GD3P-GD3P\" />\n+ <Type class=\"TB3P\" element=\"Tb\" mass=\"158.93\" name=\"TB3P-TB3P\" />\n+ <Type class=\"DY3P\" element=\"Dy\" mass=\"162.5\" name=\"DY3P-DY3P\" />\n+ <Type class=\"HO3P\" element=\"Ho\" mass=\"164.93\" name=\"HO3P-HO3P\" />\n+ <Type class=\"ER3P\" element=\"Er\" mass=\"167.28\" name=\"ER3P-ER3P\" />\n+ <Type class=\"YB3P\" element=\"Yb\" mass=\"173.05\" name=\"YB3P-YB3P\" />\n+ <Type class=\"LU3P\" element=\"Lu\" mass=\"174.97\" name=\"LU3P-LU3P\" />\n+ <Type class=\"U3P\" element=\"U\" mass=\"238.03\" name=\"U3P-U3P\" />\n+ <Type class=\"PU3P\" element=\"Pu\" mass=\"244.06\" name=\"PU3P-PU3P\" />\n+ <Type class=\"TI3P\" element=\"Ti\" mass=\"47.867\" name=\"TI3P-TI3P\" />\n+ <Type class=\"V3P\" element=\"V\" mass=\"50.942\" name=\"V3P-V3P\" />\n+ <Type class=\"CR3P\" element=\"Cr\" mass=\"51.996\" name=\"CR3P-CR3P\" />\n+ <Type class=\"MN3P\" element=\"Mn\" mass=\"54.938\" name=\"MN3P-MN3P\" />\n+ <Type class=\"FE3P\" element=\"Fe\" mass=\"55.854\" name=\"FE3P-FE3P\" />\n+ <Type class=\"CO3P\" element=\"Co\" mass=\"58.933\" name=\"CO3P-CO3P\" />\n+ <Type class=\"GA3P\" element=\"Ga\" mass=\"69.723\" name=\"GA3P-GA3P\" />\n+ <Type class=\"RH3P\" element=\"Rh\" mass=\"102.91\" name=\"RH3P-RH3P\" />\n+ <Type class=\"IN3P\" element=\"In\" mass=\"114.82\" name=\"IN3P-IN3P\" />\n+ <Type class=\"AU3P\" element=\"Au\" mass=\"196.97\" name=\"AU3P-AU3P\" />\n+ <Type class=\"TL3P\" element=\"Tl\" mass=\"204.38\" name=\"TL3P-TL3P\" />\n+ <Type class=\"BI3P\" element=\"Bi\" mass=\"208.98\" name=\"BI3P-BI3P\" />\n+ </AtomTypes>\n+ <Residues>\n+ <Residue name=\"TP5E\">\n+ <Atom charge=\"0.0\" name=\"OH2\" type=\"TP5E-OH2\" />\n+ <Atom charge=\"0.241\" name=\"H1\" type=\"TP5E-H1\" />\n+ <Atom charge=\"0.241\" name=\"H2\" type=\"TP5E-H2\" />\n+ <Atom charge=\"-0.241\" name=\"LP1\" type=\"TP5E-LP1\" />\n+ <Atom charge=\"-0.241\" name=\"LP2\" type=\"TP5E-LP2\" />\n+ <Bond atomName1=\"OH2\" atomName2=\"H1\" />\n+ <Bond atomName1=\"OH2\" atomName2=\"H2\" />\n+ <VirtualSite atomName1=\"OH2\" atomName2=\"H2\" atomName3=\"H1\" p1=\"-0.04041512765608711\" p2=\"0\" p3=\"0.057154330164408206\" siteName=\"LP1\" type=\"localCoords\" wo1=\"1\" wo2=\"0\" wo3=\"0\" wx1=\"-1.0\" wx2=\"0.5\" wx3=\"0.5\" wy1=\"0\" wy2=\"-1\" wy3=\"1\" />\n+ <VirtualSite atomName1=\"OH2\" atomName2=\"H2\" atomName3=\"H1\" p1=\"-0.04041512765608711\" p2=\"0\" p3=\"-0.057154330164408206\" siteName=\"LP2\" type=\"localCoords\" wo1=\"1\" wo2=\"0\" wo3=\"0\" wx1=\"-1.0\" wx2=\"0.5\" wx3=\"0.5\" wy1=\"0\" wy2=\"-1\" wy3=\"1\" />\n+ </Residue>\n+ <Residue name=\"OH\">\n+ <Atom charge=\"-1.32\" name=\"O1\" type=\"OH-O1\" />\n+ <Atom charge=\"0.32\" name=\"H1\" type=\"OH-H1\" />\n+ <Bond atomName1=\"O1\" atomName2=\"H1\" />\n+ </Residue>\n+ <Residue name=\"LIT\">\n+ <Atom charge=\"1.0\" name=\"LIT\" type=\"LIT-LIT\" />\n+ </Residue>\n+ <Residue name=\"SOD\">\n+ <Atom charge=\"1.0\" name=\"SOD\" type=\"SOD-SOD\" />\n+ </Residue>\n+ <Residue name=\"MG\">\n+ <Atom charge=\"2.0\" name=\"MG\" type=\"MG-MG\" />\n+ </Residue>\n+ <Residue name=\"POT\">\n+ <Atom charge=\"1.0\" name=\"POT\" type=\"POT-POT\" />\n+ </Residue>\n+ <Residue name=\"CAL\">\n+ <Atom charge=\"2.0\" name=\"CAL\" type=\"CAL-CAL\" />\n+ </Residue>\n+ <Residue name=\"RUB\">\n+ <Atom charge=\"1.0\" name=\"RUB\" type=\"RUB-RUB\" />\n+ </Residue>\n+ <Residue name=\"CES\">\n+ <Atom charge=\"1.0\" name=\"CES\" type=\"CES-CES\" />\n+ </Residue>\n+ <Residue name=\"BAR\">\n+ <Atom charge=\"2.0\" name=\"BAR\" type=\"BAR-BAR\" />\n+ </Residue>\n+ <Residue name=\"ZN2\">\n+ <Atom charge=\"2.0\" name=\"ZN\" type=\"ZN2-ZN\" />\n+ </Residue>\n+ <Residue name=\"CD2\">\n+ <Atom charge=\"2.0\" name=\"CD\" type=\"CD2-CD\" />\n+ </Residue>\n+ <Residue name=\"CLA\">\n+ <Atom charge=\"-1.0\" name=\"CLA\" type=\"CLA-CLA\" />\n+ </Residue>\n+ <Residue name=\"CU1P\">\n+ <Atom charge=\"1.0\" name=\"CU1P\" type=\"CU1P-CU1P\" />\n+ </Residue>\n+ <Residue name=\"AG1P\">\n+ <Atom charge=\"1.0\" name=\"AG1P\" type=\"AG1P-AG1P\" />\n+ </Residue>\n+ <Residue name=\"AU1P\">\n+ <Atom charge=\"1.0\" name=\"AU1P\" type=\"AU1P-AU1P\" />\n+ </Residue>\n+ <Residue name=\"TI1P\">\n+ <Atom charge=\"1.0\" name=\"TI1P\" type=\"TI1P-TI1P\" />\n+ </Residue>\n+ <Residue name=\"BE2P\">\n+ <Atom charge=\"2.0\" name=\"BE2P\" type=\"BE2P-BE2P\" />\n+ </Residue>\n+ <Residue name=\"SR2P\">\n+ <Atom charge=\"2.0\" name=\"SR2P\" type=\"SR2P-SR2P\" />\n+ </Residue>\n+ <Residue name=\"RA2P\">\n+ <Atom charge=\"2.0\" name=\"RA2P\" type=\"RA2P-RA2P\" />\n+ </Residue>\n+ <Residue name=\"V2P\">\n+ <Atom charge=\"2.0\" name=\"V2P\" type=\"V2P-V2P\" />\n+ </Residue>\n+ <Residue name=\"CR2P\">\n+ <Atom charge=\"2.0\" name=\"CR2P\" type=\"CR2P-CR2P\" />\n+ </Residue>\n+ <Residue name=\"MN2P\">\n+ <Atom charge=\"2.0\" name=\"MN2P\" type=\"MN2P-MN2P\" />\n+ </Residue>\n+ <Residue name=\"FE2P\">\n+ <Atom charge=\"2.0\" name=\"FE2P\" type=\"FE2P-FE2P\" />\n+ </Residue>\n+ <Residue name=\"CO2P\">\n+ <Atom charge=\"2.0\" name=\"CO2P\" type=\"CO2P-CO2P\" />\n+ </Residue>\n+ <Residue name=\"NI2P\">\n+ <Atom charge=\"2.0\" name=\"NI2P\" type=\"NI2P-NI2P\" />\n+ </Residue>\n+ <Residue name=\"CU2P\">\n+ <Atom charge=\"2.0\" name=\"CU2P\" type=\"CU2P-CU2P\" />\n+ </Residue>\n+ <Residue name=\"PD2P\">\n+ <Atom charge=\"2.0\" name=\"PD2P\" type=\"PD2P-PD2P\" />\n+ </Residue>\n+ <Residue name=\"AG2P\">\n+ <Atom charge=\"2.0\" name=\"AG2P\" type=\"AG2P-AG2P\" />\n+ </Residue>\n+ <Residue name=\"SN2P\">\n+ <Atom charge=\"2.0\" name=\"SN2P\" type=\"SN2P-SN2P\" />\n+ </Residue>\n+ <Residue name=\"PT2P\">\n+ <Atom charge=\"2.0\" name=\"PT2P\" type=\"PT2P-PT2P\" />\n+ </Residue>\n+ <Residue name=\"HG2P\">\n+ <Atom charge=\"2.0\" name=\"HG2P\" type=\"HG2P-HG2P\" />\n+ </Residue>\n+ <Residue name=\"PB2P\">\n+ <Atom charge=\"2.0\" name=\"PB2P\" type=\"PB2P-PB2P\" />\n+ </Residue>\n+ <Residue name=\"SM2P\">\n+ <Atom charge=\"2.0\" name=\"SM2P\" type=\"SM2P-SM2P\" />\n+ </Residue>\n+ <Residue name=\"EU2P\">\n+ <Atom charge=\"2.0\" name=\"EU2P\" type=\"EU2P-EU2P\" />\n+ </Residue>\n+ <Residue name=\"YB2P\">\n+ <Atom charge=\"2.0\" name=\"YB2P\" type=\"YB2P-YB2P\" />\n+ </Residue>\n+ <Residue name=\"AL3P\">\n+ <Atom charge=\"3.0\" name=\"AL3P\" type=\"AL3P-AL3P\" />\n+ </Residue>\n+ <Residue name=\"SC3P\">\n+ <Atom charge=\"3.0\" name=\"SC3P\" type=\"SC3P-SC3P\" />\n+ </Residue>\n+ <Residue name=\"Y3P\">\n+ <Atom charge=\"3.0\" name=\"Y3P\" type=\"Y3P-Y3P\" />\n+ </Residue>\n+ <Residue name=\"LA3P\">\n+ <Atom charge=\"3.0\" name=\"LA3P\" type=\"LA3P-LA3P\" />\n+ </Residue>\n+ <Residue name=\"CE3P\">\n+ <Atom charge=\"3.0\" name=\"CE3P\" type=\"CE3P-CE3P\" />\n+ </Residue>\n+ <Residue name=\"PR3P\">\n+ <Atom charge=\"3.0\" name=\"PR3P\" type=\"PR3P-PR3P\" />\n+ </Residue>\n+ <Residue name=\"ND3P\">\n+ <Atom charge=\"3.0\" name=\"ND3P\" type=\"ND3P-ND3P\" />\n+ </Residue>\n+ <Residue name=\"PM3P\">\n+ <Atom charge=\"3.0\" name=\"PM3P\" type=\"PM3P-PM3P\" />\n+ </Residue>\n+ <Residue name=\"SM3P\">\n+ <Atom charge=\"3.0\" name=\"SM3P\" type=\"SM3P-SM3P\" />\n+ </Residue>\n+ <Residue name=\"EU3P\">\n+ <Atom charge=\"3.0\" name=\"EU3P\" type=\"EU3P-EU3P\" />\n+ </Residue>\n+ <Residue name=\"GD3P\">\n+ <Atom charge=\"3.0\" name=\"GD3P\" type=\"GD3P-GD3P\" />\n+ </Residue>\n+ <Residue name=\"TB3P\">\n+ <Atom charge=\"3.0\" name=\"TB3P\" type=\"TB3P-TB3P\" />\n+ </Residue>\n+ <Residue name=\"DY3P\">\n+ <Atom charge=\"3.0\" name=\"DY3P\" type=\"DY3P-DY3P\" />\n+ </Residue>\n+ <Residue name=\"HO3P\">\n+ <Atom charge=\"3.0\" name=\"HO3P\" type=\"HO3P-HO3P\" />\n+ </Residue>\n+ <Residue name=\"ER3P\">\n+ <Atom charge=\"3.0\" name=\"ER3P\" type=\"ER3P-ER3P\" />\n+ </Residue>\n+ <Residue name=\"YB3P\">\n+ <Atom charge=\"3.0\" name=\"YB3P\" type=\"YB3P-YB3P\" />\n+ </Residue>\n+ <Residue name=\"LU3P\">\n+ <Atom charge=\"3.0\" name=\"LU3P\" type=\"LU3P-LU3P\" />\n+ </Residue>\n+ <Residue name=\"U3P\">\n+ <Atom charge=\"3.0\" name=\"U3P\" type=\"U3P-U3P\" />\n+ </Residue>\n+ <Residue name=\"PU3P\">\n+ <Atom charge=\"3.0\" name=\"PU3P\" type=\"PU3P-PU3P\" />\n+ </Residue>\n+ <Residue name=\"TI3P\">\n+ <Atom charge=\"3.0\" name=\"TI3P\" type=\"TI3P-TI3P\" />\n+ </Residue>\n+ <Residue name=\"V3P\">\n+ <Atom charge=\"3.0\" name=\"V3P\" type=\"V3P-V3P\" />\n+ </Residue>\n+ <Residue name=\"CR3P\">\n+ <Atom charge=\"3.0\" name=\"CR3P\" type=\"CR3P-CR3P\" />\n+ </Residue>\n+ <Residue name=\"MN3P\">\n+ <Atom charge=\"3.0\" name=\"MN3P\" type=\"MN3P-MN3P\" />\n+ </Residue>\n+ <Residue name=\"FE3P\">\n+ <Atom charge=\"3.0\" name=\"FE3P\" type=\"FE3P-FE3P\" />\n+ </Residue>\n+ <Residue name=\"CO3P\">\n+ <Atom charge=\"3.0\" name=\"CO3P\" type=\"CO3P-CO3P\" />\n+ </Residue>\n+ <Residue name=\"GA3P\">\n+ <Atom charge=\"3.0\" name=\"GA3P\" type=\"GA3P-GA3P\" />\n+ </Residue>\n+ <Residue name=\"RH3P\">\n+ <Atom charge=\"3.0\" name=\"RH3P\" type=\"RH3P-RH3P\" />\n+ </Residue>\n+ <Residue name=\"IN3P\">\n+ <Atom charge=\"3.0\" name=\"IN3P\" type=\"IN3P-IN3P\" />\n+ </Residue>\n+ <Residue name=\"AU3P\">\n+ <Atom charge=\"3.0\" name=\"AU3P\" type=\"AU3P-AU3P\" />\n+ </Residue>\n+ <Residue name=\"TL3P\">\n+ <Atom charge=\"3.0\" name=\"TL3P\" type=\"TL3P-TL3P\" />\n+ </Residue>\n+ <Residue name=\"BI3P\">\n+ <Atom charge=\"3.0\" name=\"BI3P\" type=\"BI3P-BI3P\" />\n+ </Residue>\n+ </Residues>\n+ <HarmonicBondForce>\n+ <Bond class1=\"HT\" class2=\"HT\" k=\"0.0\" length=\"0.15139000000000002\" />\n+ <Bond class1=\"HT\" class2=\"OT\" k=\"376559.99999999994\" length=\"0.09572000000000001\" />\n+ <Bond class1=\"OX\" class2=\"HX\" k=\"456055.99999999994\" length=\"0.097\" />\n+ <Bond class1=\"OT\" class2=\"LP\" k=\"0.0\" length=\"0.06999999999999999\" />\n+ </HarmonicBondForce>\n+ <HarmonicAngleForce>\n+ <Angle angle=\"1.8242181341844732\" class1=\"HT\" class2=\"OT\" class3=\"HT\" k=\"460.24\" />\n+ </HarmonicAngleForce>\n+ <AmoebaUreyBradleyForce />\n+ <NonbondedForce coulomb14scale=\"1.0\" lj14scale=\"1.0\">\n+ <UseAttributeFromResidue name=\"charge\" />\n+ <Atom class=\"HT\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"HX\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"OT\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"OX\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"LIT\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"SOD\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"MG\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"POT\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"CAL\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"RUB\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"CES\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"BAR\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"ZN\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"CAD\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"CLA\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"LP\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"CU1P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"AG1P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"AU1P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"TI1P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"BE2P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"SR2P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"RA2P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"V2P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"CR2P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"MN2P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"FE2P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"CO2P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"NI2P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"CU2P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"PD2P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"AG2P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"SN2P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"PT2P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"HG2P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"PB2P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"SM2P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"EU2P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"YB2P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"AL3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"SC3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"Y3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"LA3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"CE3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"PR3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"ND3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"PM3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"SM3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"EU3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"GD3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"TB3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"DY3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"HO3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"ER3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"TM3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"YB3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"LU3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"U3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"PU3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"TI3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"V3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"CR3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"MN3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"FE3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"CO3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"GA3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"RH3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"IN3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"AU3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"TL3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"BI3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ </NonbondedForce>\n+ <LennardJonesForce lj14scale=\"1.0\">\n+ <Atom class=\"HT\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"HX\" epsilon=\"0.192464\" sigma=\"0.04000135244450124\" />\n+ <Atom class=\"OT\" epsilon=\"0.680946\" sigma=\"0.30965857645121914\" />\n+ <Atom class=\"OX\" epsilon=\"0.50208\" sigma=\"0.30290556416771536\" />\n+ <Atom class=\"LIT\" epsilon=\"0.00974872\" sigma=\"0.23118821735741807\" />\n+ <Atom class=\"SOD\" epsilon=\"0.1962296\" sigma=\"0.2513670733232967\" />\n+ <Atom class=\"MG\" epsilon=\"0.06276\" sigma=\"0.2111429961992604\" />\n+ <Atom class=\"POT\" epsilon=\"0.364008\" sigma=\"0.3142645228240047\" />\n+ <Atom class=\"CAL\" epsilon=\"0.50208\" sigma=\"0.24357170953956878\" />\n+ <Atom class=\"RUB\" epsilon=\"0.6276\" sigma=\"0.3385415128933289\" />\n+ <Atom class=\"CES\" epsilon=\"0.79496\" sigma=\"0.37417746161894255\" />\n+ <Atom class=\"BAR\" epsilon=\"0.6276\" sigma=\"0.33675971545704825\" />\n+ <Atom class=\"ZN\" epsilon=\"1.046\" sigma=\"0.194215920554594\" />\n+ <Atom class=\"CAD\" epsilon=\"0.50208\" sigma=\"0.2417899121032881\" />\n+ <Atom class=\"CLA\" epsilon=\"0.6276\" sigma=\"0.4044680180357141\" />\n+ <Atom class=\"LP\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"CU1P\" epsilon=\"0.7748768\" sigma=\"0.1535909390073945\" />\n+ <Atom class=\"AG1P\" epsilon=\"1.2008079999999999\" sigma=\"0.2163636626875628\" />\n+ <Atom class=\"AU1P\" epsilon=\"1.4907592\" sigma=\"0.11250269012676205\" />\n+ <Atom class=\"TI1P\" epsilon=\"1.7016328\" sigma=\"0.34401163102271065\" />\n+ <Atom class=\"BE2P\" epsilon=\"0.4250944\" sigma=\"0.007127189745122714\" />\n+ <Atom class=\"SR2P\" epsilon=\"0.9572992\" sigma=\"0.3306837861993312\" />\n+ <Atom class=\"RA2P\" epsilon=\"1.2631496\" sigma=\"0.37237784620829906\" />\n+ <Atom class=\"V2P\" epsilon=\"0.6732056\" sigma=\"0.1966569830422985\" />\n+ <Atom class=\"CR2P\" epsilon=\"0.6974728\" sigma=\"0.18872798445084948\" />\n+ <Atom class=\"MN2P\" epsilon=\"0.7050040000000001\" sigma=\"0.2144749574051053\" />\n+ <Atom class=\"FE2P\" epsilon=\"0.667348\" sigma=\"0.1924519410926761\" />\n+ <Atom class=\"CO2P\" epsilon=\"0.6439176000000001\" sigma=\"0.16527953018939576\" />\n+ <Atom class=\"NI2P\" epsilon=\"0.5999856\" sigma=\"0.13903365395298137\" />\n+ <Atom class=\"CU2P\" epsilon=\"0.629692\" sigma=\"0.129198132104712\" />\n+ <Atom class=\"PD2P\" epsilon=\"0.7288528\" sigma=\"0.16519044031758173\" />\n+ <Atom class=\"AG2P\" epsilon=\"0.7752952\" sigma=\"0.1869105510658432\" />\n+ <Atom class=\"SN2P\" epsilon=\"0.7861736\" sigma=\"0.29542201493533654\" />\n+ <Atom class=\"PT2P\" epsilon=\"0.6824104\" sigma=\"0.1420270736459329\" />\n+ <Atom class=\"HG2P\" epsilon=\"0.8593936\" sigma=\"0.2105728210196506\" />\n+ <Atom class=\"PB2P\" epsilon=\"1.0016496000000001\" sigma=\"0.3132399892981433\" />\n+ <Atom class=\"SM2P\" epsilon=\"1.0242432\" sigma=\"0.330790694045508\" />\n+ <Atom class=\"EU2P\" epsilon=\"0.9907712000000001\" sigma=\"0.3279220001730961\" />\n+ <Atom class=\"YB2P\" epsilon=\"0.8593936\" sigma=\"0.28669120749756116\" />\n+ <Atom class=\"AL3P\" epsilon=\"0.44601440000000003\" sigma=\"0.039377723341803\" />\n+ <Atom class=\"SC3P\" epsilon=\"0.5899439999999999\" sigma=\"0.19544536078562763\" />\n+ <Atom class=\"Y3P\" epsilon=\"0.6928704\" sigma=\"0.25183924964391113\" />\n+ <Atom class=\"LA3P\" epsilon=\"0.7932864\" sigma=\"0.3158592315294759\" />\n+ <Atom class=\"CE3P\" epsilon=\"0.7702744000000001\" sigma=\"0.30495463121943817\" />\n+ <Atom class=\"PR3P\" epsilon=\"0.7627432\" sigma=\"0.2956180126533274\" />\n+ <Atom class=\"ND3P\" epsilon=\"0.7497728\" sigma=\"0.2886333667031071\" />\n+ <Atom class=\"PM3P\" epsilon=\"0.74266\" sigma=\"0.29527947114043407\" />\n+ <Atom class=\"SM3P\" epsilon=\"0.7351288\" sigma=\"0.2791542043420939\" />\n+ <Atom class=\"EU3P\" epsilon=\"0.728016\" sigma=\"0.2713677495455473\" />\n+ <Atom class=\"GD3P\" epsilon=\"0.7209032000000001\" sigma=\"0.2681605141602421\" />\n+ <Atom class=\"TB3P\" epsilon=\"0.7083512000000001\" sigma=\"0.2628151218514001\" />\n+ <Atom class=\"DY3P\" epsilon=\"0.6999832\" sigma=\"0.2573628216963812\" />\n+ <Atom class=\"HO3P\" epsilon=\"0.6928704\" sigma=\"0.247794569463554\" />\n+ <Atom class=\"ER3P\" epsilon=\"0.6845024\" sigma=\"0.24362516346265717\" />\n+ <Atom class=\"TM3P\" epsilon=\"0.6778080000000001\" sigma=\"0.24029320225681233\" />\n+ <Atom class=\"YB3P\" epsilon=\"0.6711136\" sigma=\"0.23077840394707347\" />\n+ <Atom class=\"LU3P\" epsilon=\"0.6644192\" sigma=\"0.2407564695902453\" />\n+ <Atom class=\"U3P\" epsilon=\"0.7932864\" sigma=\"0.3031193798600691\" />\n+ <Atom class=\"PU3P\" epsilon=\"0.7702744000000001\" sigma=\"0.29750671793578487\" />\n+ <Atom class=\"TI3P\" epsilon=\"0.537644\" sigma=\"0.14769318949330543\" />\n+ <Atom class=\"V3P\" epsilon=\"0.5171424\" sigma=\"0.10943799853635927\" />\n+ <Atom class=\"CR3P\" epsilon=\"0.5045904\" sigma=\"0.15022334185282402\" />\n+ <Atom class=\"MN3P\" epsilon=\"0.5238368\" sigma=\"0.06849229345062928\" />\n+ <Atom class=\"FE3P\" epsilon=\"0.5238368\" sigma=\"0.10090318881657484\" />\n+ <Atom class=\"CO3P\" epsilon=\"0.4983144\" sigma=\"0.04598819183040431\" />\n+ <Atom class=\"GA3P\" epsilon=\"0.5045904\" sigma=\"0.04042898382920859\" />\n+ <Atom class=\"RH3P\" epsilon=\"0.537644\" sigma=\"0.0821943157356277\" />\n+ <Atom class=\"IN3P\" epsilon=\"0.6163031999999999\" sigma=\"0.15435711190499518\" />\n+ <Atom class=\"AU3P\" epsilon=\"0.5564720000000001\" sigma=\"0.065106878321696\" />\n+ <Atom class=\"TL3P\" epsilon=\"0.6815736\" sigma=\"0.15489165113587938\" />\n+ <Atom class=\"BI3P\" epsilon=\"0.7740400000000001\" sigma=\"0.24378552523192246\" />\n+ <NBFixPair class1=\"CLA\" class2=\"SOD\" epsilon=\"0.35093300000000005\" sigma=\"0.3323943117381606\" />\n+ <NBFixPair class1=\"CLA\" class2=\"POT\" epsilon=\"0.477963424\" sigma=\"0.3635757668730725\" />\n+ <NBFixPair class1=\"OC\" class2=\"SOD\" epsilon=\"0.31388368000000005\" sigma=\"0.28419669108676826\" />\n+ <NBFixPair class1=\"OCL\" class2=\"SOD\" epsilon=\"0.31388368000000005\" sigma=\"0.28419669108676826\" />\n+ <NBFixPair class1=\"OC2D2\" class2=\"SOD\" epsilon=\"0.31388368000000005\" sigma=\"0.28419669108676826\" />\n+ <NBFixPair class1=\"OG2D2\" class2=\"SOD\" epsilon=\"0.31388368000000005\" sigma=\"0.28419669108676826\" />\n+ </LennardJonesForce>\n+ <InitializationScript>\n+EXPECTED_VERSION = \"charmm36_2024\"\n+if hasattr(self, \"_charmm_ff_version\"):\n+ if self._charmm_ff_version != EXPECTED_VERSION:\n+ raise RuntimeError(f\"CHARMM force field versions ({self._charmm_ff_version} and {EXPECTED_VERSION}) incompatible\")\n+else:\n+ self._charmm_ff_version = EXPECTED_VERSION\n+ </InitializationScript>\n+</ForceField>\n\\ No newline at end of file\ndiff --git a/wrappers/python/openmm/app/data/charmm36_2024/water.xml b/wrappers/python/openmm/app/data/charmm36_2024/water.xml\nnew file mode 100644\nindex 0000000000..912a32704b\n--- /dev/null\n+++ b/wrappers/python/openmm/app/data/charmm36_2024/water.xml\n@@ -0,0 +1,502 @@\n+<ForceField>\n+ <Info>\n+ <DateGenerated>2025-02-27</DateGenerated>\n+ <Source Source=\"toppar/toppar_water_ions.str\" md5hash=\"1eba52cd9a244fa3df9a274a806d9128\" sourcePackage=\"charmm36\" sourcePackageVersion=\"toppar_c36_jul24.tgz\">toppar/toppar_water_ions.str</Source>\n+ <Source Source=\"toppar/stream/misc/toppar_ions_won.str\" md5hash=\"f523f7727e7dfa25468cc75f9b880c5b\" sourcePackage=\"charmm36\" sourcePackageVersion=\"toppar_c36_jul24.tgz\">toppar/stream/misc/toppar_ions_won.str</Source>\n+ <Reference Reference=\"W.L. Jorgensen; J.Chandrasekhar; J.D. Madura; R.W. Impey; M.L. Klein; "Comparison of simple potential functions for simulating liquid water", J. Chem. Phys. 79 926-935 (1983).\" forcefield=\"tip3p\">W.L. Jorgensen; J.Chandrasekhar; J.D. Madura; R.W. Impey; M.L. Klein; \"Comparison of simple potential functions for simulating liquid water\", J. Chem. Phys. 79 926-935 (1983).</Reference>\n+ <Reference Reference=\"Beglov, D. and Roux, B., Finite Representation of an Infinite Bulk System: Solvent Boundary Potential for Computer Simulations, Journal of Chemical Physics, 1994, 100: 9050-9063\" forcefield=\"ions\">Beglov, D. and Roux, B., Finite Representation of an Infinite Bulk System: Solvent Boundary Potential for Computer Simulations, Journal of Chemical Physics, 1994, 100: 9050-9063</Reference>\n+ <Reference Reference=\"Stote, R.H. and Karplus, M. Zinc Binding in Proteins and Solution: A Simple but Accurate Nonbonded Representation, PROTEINS: Structure, Function, and Genetics 23:12-31 (1995)\" forcefield=\"ions\">Stote, R.H. and Karplus, M. Zinc Binding in Proteins and Solution: A Simple but Accurate Nonbonded Representation, PROTEINS: Structure, Function, and Genetics 23:12-31 (1995)</Reference>\n+ <Reference Reference=\"Won, Y., "Force Field for Monovalent, Divalent, and Trivalent Cations Developed under the Solvent Boundary Potential," Journal of Physical Chemistry A., 116: 11763-11767, 2012.\" forcefield=\"ions\">Won, Y., \"Force Field for Monovalent, Divalent, and Trivalent Cations Developed under the Solvent Boundary Potential,\" Journal of Physical Chemistry A., 116: 11763-11767, 2012.</Reference>\n+ </Info>\n+ <AtomTypes>\n+ <Type class=\"OT\" element=\"O\" mass=\"15.9994\" name=\"TIP3-OH2\" />\n+ <Type class=\"HT\" element=\"H\" mass=\"1.008\" name=\"TIP3-H1\" />\n+ <Type class=\"HT\" element=\"H\" mass=\"1.008\" name=\"TIP3-H2\" />\n+ <Type class=\"OX\" element=\"O\" mass=\"15.9994\" name=\"OH-O1\" />\n+ <Type class=\"HX\" element=\"H\" mass=\"1.008\" name=\"OH-H1\" />\n+ <Type class=\"HPER\" element=\"H\" mass=\"1.008\" name=\"H2O2-HP1\" />\n+ <Type class=\"OPER\" element=\"O\" mass=\"15.999\" name=\"H2O2-OP1\" />\n+ <Type class=\"OPER\" element=\"O\" mass=\"15.999\" name=\"H2O2-OP2\" />\n+ <Type class=\"HPER\" element=\"H\" mass=\"1.008\" name=\"H2O2-HP2\" />\n+ <Type class=\"LIT\" element=\"Li\" mass=\"6.941\" name=\"LIT-LIT\" />\n+ <Type class=\"SOD\" element=\"Na\" mass=\"22.98977\" name=\"SOD-SOD\" />\n+ <Type class=\"MG\" element=\"Mg\" mass=\"24.305\" name=\"MG-MG\" />\n+ <Type class=\"POT\" element=\"K\" mass=\"39.0983\" name=\"POT-POT\" />\n+ <Type class=\"CAL\" element=\"Ca\" mass=\"40.08\" name=\"CAL-CAL\" />\n+ <Type class=\"RUB\" element=\"Rb\" mass=\"85.4678\" name=\"RUB-RUB\" />\n+ <Type class=\"CES\" element=\"Cs\" mass=\"132.90545\" name=\"CES-CES\" />\n+ <Type class=\"BAR\" element=\"Ba\" mass=\"137.327\" name=\"BAR-BAR\" />\n+ <Type class=\"ZN\" element=\"Zn\" mass=\"65.37\" name=\"ZN2-ZN\" />\n+ <Type class=\"CAD\" element=\"Cd\" mass=\"112.411\" name=\"CD2-CD\" />\n+ <Type class=\"CLA\" element=\"Cl\" mass=\"35.45\" name=\"CLA-CLA\" />\n+ <Type class=\"CU1P\" element=\"Cu\" mass=\"63.546\" name=\"CU1P-CU1P\" />\n+ <Type class=\"AG1P\" element=\"Ag\" mass=\"107.87\" name=\"AG1P-AG1P\" />\n+ <Type class=\"AU1P\" element=\"Au\" mass=\"196.97\" name=\"AU1P-AU1P\" />\n+ <Type class=\"TI1P\" element=\"Ti\" mass=\"47.867\" name=\"TI1P-TI1P\" />\n+ <Type class=\"BE2P\" element=\"Be\" mass=\"9.0122\" name=\"BE2P-BE2P\" />\n+ <Type class=\"SR2P\" element=\"Sr\" mass=\"87.62\" name=\"SR2P-SR2P\" />\n+ <Type class=\"RA2P\" element=\"Ra\" mass=\"226.03\" name=\"RA2P-RA2P\" />\n+ <Type class=\"V2P\" element=\"V\" mass=\"50.942\" name=\"V2P-V2P\" />\n+ <Type class=\"CR2P\" element=\"Cr\" mass=\"51.996\" name=\"CR2P-CR2P\" />\n+ <Type class=\"MN2P\" element=\"Mn\" mass=\"54.938\" name=\"MN2P-MN2P\" />\n+ <Type class=\"FE2P\" element=\"Fe\" mass=\"55.854\" name=\"FE2P-FE2P\" />\n+ <Type class=\"CO2P\" element=\"Co\" mass=\"58.933\" name=\"CO2P-CO2P\" />\n+ <Type class=\"NI2P\" element=\"Ni\" mass=\"58.693\" name=\"NI2P-NI2P\" />\n+ <Type class=\"CU2P\" element=\"Cu\" mass=\"63.546\" name=\"CU2P-CU2P\" />\n+ <Type class=\"PD2P\" element=\"Pd\" mass=\"106.42\" name=\"PD2P-PD2P\" />\n+ <Type class=\"AG2P\" element=\"Ag\" mass=\"107.87\" name=\"AG2P-AG2P\" />\n+ <Type class=\"SN2P\" element=\"Sn\" mass=\"118.71\" name=\"SN2P-SN2P\" />\n+ <Type class=\"PT2P\" element=\"Pt\" mass=\"195.08\" name=\"PT2P-PT2P\" />\n+ <Type class=\"HG2P\" element=\"Hg\" mass=\"200.59\" name=\"HG2P-HG2P\" />\n+ <Type class=\"PB2P\" element=\"Pb\" mass=\"207.2\" name=\"PB2P-PB2P\" />\n+ <Type class=\"SM2P\" element=\"Sm\" mass=\"150.36\" name=\"SM2P-SM2P\" />\n+ <Type class=\"EU2P\" element=\"Eu\" mass=\"151.96\" name=\"EU2P-EU2P\" />\n+ <Type class=\"YB2P\" element=\"Yb\" mass=\"173.05\" name=\"YB2P-YB2P\" />\n+ <Type class=\"AL3P\" element=\"Al\" mass=\"26.982\" name=\"AL3P-AL3P\" />\n+ <Type class=\"SC3P\" element=\"Sc\" mass=\"44.956\" name=\"SC3P-SC3P\" />\n+ <Type class=\"Y3P\" element=\"Y\" mass=\"88.906\" name=\"Y3P-Y3P\" />\n+ <Type class=\"LA3P\" element=\"La\" mass=\"138.91\" name=\"LA3P-LA3P\" />\n+ <Type class=\"CE3P\" element=\"Ce\" mass=\"140.12\" name=\"CE3P-CE3P\" />\n+ <Type class=\"PR3P\" element=\"Pr\" mass=\"140.91\" name=\"PR3P-PR3P\" />\n+ <Type class=\"ND3P\" element=\"Nd\" mass=\"144.24\" name=\"ND3P-ND3P\" />\n+ <Type class=\"PM3P\" element=\"Pm\" mass=\"144.91\" name=\"PM3P-PM3P\" />\n+ <Type class=\"SM3P\" element=\"Sm\" mass=\"150.36\" name=\"SM3P-SM3P\" />\n+ <Type class=\"EU3P\" element=\"Eu\" mass=\"151.96\" name=\"EU3P-EU3P\" />\n+ <Type class=\"GD3P\" element=\"Gd\" mass=\"157.25\" name=\"GD3P-GD3P\" />\n+ <Type class=\"TB3P\" element=\"Tb\" mass=\"158.93\" name=\"TB3P-TB3P\" />\n+ <Type class=\"DY3P\" element=\"Dy\" mass=\"162.5\" name=\"DY3P-DY3P\" />\n+ <Type class=\"HO3P\" element=\"Ho\" mass=\"164.93\" name=\"HO3P-HO3P\" />\n+ <Type class=\"ER3P\" element=\"Er\" mass=\"167.28\" name=\"ER3P-ER3P\" />\n+ <Type class=\"YB3P\" element=\"Yb\" mass=\"173.05\" name=\"YB3P-YB3P\" />\n+ <Type class=\"LU3P\" element=\"Lu\" mass=\"174.97\" name=\"LU3P-LU3P\" />\n+ <Type class=\"U3P\" element=\"U\" mass=\"238.03\" name=\"U3P-U3P\" />\n+ <Type class=\"PU3P\" element=\"Pu\" mass=\"244.06\" name=\"PU3P-PU3P\" />\n+ <Type class=\"TI3P\" element=\"Ti\" mass=\"47.867\" name=\"TI3P-TI3P\" />\n+ <Type class=\"V3P\" element=\"V\" mass=\"50.942\" name=\"V3P-V3P\" />\n+ <Type class=\"CR3P\" element=\"Cr\" mass=\"51.996\" name=\"CR3P-CR3P\" />\n+ <Type class=\"MN3P\" element=\"Mn\" mass=\"54.938\" name=\"MN3P-MN3P\" />\n+ <Type class=\"FE3P\" element=\"Fe\" mass=\"55.854\" name=\"FE3P-FE3P\" />\n+ <Type class=\"CO3P\" element=\"Co\" mass=\"58.933\" name=\"CO3P-CO3P\" />\n+ <Type class=\"GA3P\" element=\"Ga\" mass=\"69.723\" name=\"GA3P-GA3P\" />\n+ <Type class=\"RH3P\" element=\"Rh\" mass=\"102.91\" name=\"RH3P-RH3P\" />\n+ <Type class=\"IN3P\" element=\"In\" mass=\"114.82\" name=\"IN3P-IN3P\" />\n+ <Type class=\"AU3P\" element=\"Au\" mass=\"196.97\" name=\"AU3P-AU3P\" />\n+ <Type class=\"TL3P\" element=\"Tl\" mass=\"204.38\" name=\"TL3P-TL3P\" />\n+ <Type class=\"BI3P\" element=\"Bi\" mass=\"208.98\" name=\"BI3P-BI3P\" />\n+ </AtomTypes>\n+ <Residues>\n+ <Residue name=\"TIP3\">\n+ <Atom charge=\"-0.834\" name=\"OH2\" type=\"TIP3-OH2\" />\n+ <Atom charge=\"0.417\" name=\"H1\" type=\"TIP3-H1\" />\n+ <Atom charge=\"0.417\" name=\"H2\" type=\"TIP3-H2\" />\n+ <Bond atomName1=\"OH2\" atomName2=\"H1\" />\n+ <Bond atomName1=\"OH2\" atomName2=\"H2\" />\n+ </Residue>\n+ <Residue name=\"OH\">\n+ <Atom charge=\"-1.32\" name=\"O1\" type=\"OH-O1\" />\n+ <Atom charge=\"0.32\" name=\"H1\" type=\"OH-H1\" />\n+ <Bond atomName1=\"O1\" atomName2=\"H1\" />\n+ </Residue>\n+ <Residue name=\"H2O2\">\n+ <Atom charge=\"0.41\" name=\"HP1\" type=\"H2O2-HP1\" />\n+ <Atom charge=\"-0.41\" name=\"OP1\" type=\"H2O2-OP1\" />\n+ <Atom charge=\"-0.41\" name=\"OP2\" type=\"H2O2-OP2\" />\n+ <Atom charge=\"0.41\" name=\"HP2\" type=\"H2O2-HP2\" />\n+ <Bond atomName1=\"HP1\" atomName2=\"OP1\" />\n+ <Bond atomName1=\"OP1\" atomName2=\"OP2\" />\n+ <Bond atomName1=\"OP2\" atomName2=\"HP2\" />\n+ </Residue>\n+ <Residue name=\"LIT\">\n+ <Atom charge=\"1.0\" name=\"LIT\" type=\"LIT-LIT\" />\n+ </Residue>\n+ <Residue name=\"SOD\">\n+ <Atom charge=\"1.0\" name=\"SOD\" type=\"SOD-SOD\" />\n+ </Residue>\n+ <Residue name=\"MG\">\n+ <Atom charge=\"2.0\" name=\"MG\" type=\"MG-MG\" />\n+ </Residue>\n+ <Residue name=\"POT\">\n+ <Atom charge=\"1.0\" name=\"POT\" type=\"POT-POT\" />\n+ </Residue>\n+ <Residue name=\"CAL\">\n+ <Atom charge=\"2.0\" name=\"CAL\" type=\"CAL-CAL\" />\n+ </Residue>\n+ <Residue name=\"RUB\">\n+ <Atom charge=\"1.0\" name=\"RUB\" type=\"RUB-RUB\" />\n+ </Residue>\n+ <Residue name=\"CES\">\n+ <Atom charge=\"1.0\" name=\"CES\" type=\"CES-CES\" />\n+ </Residue>\n+ <Residue name=\"BAR\">\n+ <Atom charge=\"2.0\" name=\"BAR\" type=\"BAR-BAR\" />\n+ </Residue>\n+ <Residue name=\"ZN2\">\n+ <Atom charge=\"2.0\" name=\"ZN\" type=\"ZN2-ZN\" />\n+ </Residue>\n+ <Residue name=\"CD2\">\n+ <Atom charge=\"2.0\" name=\"CD\" type=\"CD2-CD\" />\n+ </Residue>\n+ <Residue name=\"CLA\">\n+ <Atom charge=\"-1.0\" name=\"CLA\" type=\"CLA-CLA\" />\n+ </Residue>\n+ <Residue name=\"CU1P\">\n+ <Atom charge=\"1.0\" name=\"CU1P\" type=\"CU1P-CU1P\" />\n+ </Residue>\n+ <Residue name=\"AG1P\">\n+ <Atom charge=\"1.0\" name=\"AG1P\" type=\"AG1P-AG1P\" />\n+ </Residue>\n+ <Residue name=\"AU1P\">\n+ <Atom charge=\"1.0\" name=\"AU1P\" type=\"AU1P-AU1P\" />\n+ </Residue>\n+ <Residue name=\"TI1P\">\n+ <Atom charge=\"1.0\" name=\"TI1P\" type=\"TI1P-TI1P\" />\n+ </Residue>\n+ <Residue name=\"BE2P\">\n+ <Atom charge=\"2.0\" name=\"BE2P\" type=\"BE2P-BE2P\" />\n+ </Residue>\n+ <Residue name=\"SR2P\">\n+ <Atom charge=\"2.0\" name=\"SR2P\" type=\"SR2P-SR2P\" />\n+ </Residue>\n+ <Residue name=\"RA2P\">\n+ <Atom charge=\"2.0\" name=\"RA2P\" type=\"RA2P-RA2P\" />\n+ </Residue>\n+ <Residue name=\"V2P\">\n+ <Atom charge=\"2.0\" name=\"V2P\" type=\"V2P-V2P\" />\n+ </Residue>\n+ <Residue name=\"CR2P\">\n+ <Atom charge=\"2.0\" name=\"CR2P\" type=\"CR2P-CR2P\" />\n+ </Residue>\n+ <Residue name=\"MN2P\">\n+ <Atom charge=\"2.0\" name=\"MN2P\" type=\"MN2P-MN2P\" />\n+ </Residue>\n+ <Residue name=\"FE2P\">\n+ <Atom charge=\"2.0\" name=\"FE2P\" type=\"FE2P-FE2P\" />\n+ </Residue>\n+ <Residue name=\"CO2P\">\n+ <Atom charge=\"2.0\" name=\"CO2P\" type=\"CO2P-CO2P\" />\n+ </Residue>\n+ <Residue name=\"NI2P\">\n+ <Atom charge=\"2.0\" name=\"NI2P\" type=\"NI2P-NI2P\" />\n+ </Residue>\n+ <Residue name=\"CU2P\">\n+ <Atom charge=\"2.0\" name=\"CU2P\" type=\"CU2P-CU2P\" />\n+ </Residue>\n+ <Residue name=\"PD2P\">\n+ <Atom charge=\"2.0\" name=\"PD2P\" type=\"PD2P-PD2P\" />\n+ </Residue>\n+ <Residue name=\"AG2P\">\n+ <Atom charge=\"2.0\" name=\"AG2P\" type=\"AG2P-AG2P\" />\n+ </Residue>\n+ <Residue name=\"SN2P\">\n+ <Atom charge=\"2.0\" name=\"SN2P\" type=\"SN2P-SN2P\" />\n+ </Residue>\n+ <Residue name=\"PT2P\">\n+ <Atom charge=\"2.0\" name=\"PT2P\" type=\"PT2P-PT2P\" />\n+ </Residue>\n+ <Residue name=\"HG2P\">\n+ <Atom charge=\"2.0\" name=\"HG2P\" type=\"HG2P-HG2P\" />\n+ </Residue>\n+ <Residue name=\"PB2P\">\n+ <Atom charge=\"2.0\" name=\"PB2P\" type=\"PB2P-PB2P\" />\n+ </Residue>\n+ <Residue name=\"SM2P\">\n+ <Atom charge=\"2.0\" name=\"SM2P\" type=\"SM2P-SM2P\" />\n+ </Residue>\n+ <Residue name=\"EU2P\">\n+ <Atom charge=\"2.0\" name=\"EU2P\" type=\"EU2P-EU2P\" />\n+ </Residue>\n+ <Residue name=\"YB2P\">\n+ <Atom charge=\"2.0\" name=\"YB2P\" type=\"YB2P-YB2P\" />\n+ </Residue>\n+ <Residue name=\"AL3P\">\n+ <Atom charge=\"3.0\" name=\"AL3P\" type=\"AL3P-AL3P\" />\n+ </Residue>\n+ <Residue name=\"SC3P\">\n+ <Atom charge=\"3.0\" name=\"SC3P\" type=\"SC3P-SC3P\" />\n+ </Residue>\n+ <Residue name=\"Y3P\">\n+ <Atom charge=\"3.0\" name=\"Y3P\" type=\"Y3P-Y3P\" />\n+ </Residue>\n+ <Residue name=\"LA3P\">\n+ <Atom charge=\"3.0\" name=\"LA3P\" type=\"LA3P-LA3P\" />\n+ </Residue>\n+ <Residue name=\"CE3P\">\n+ <Atom charge=\"3.0\" name=\"CE3P\" type=\"CE3P-CE3P\" />\n+ </Residue>\n+ <Residue name=\"PR3P\">\n+ <Atom charge=\"3.0\" name=\"PR3P\" type=\"PR3P-PR3P\" />\n+ </Residue>\n+ <Residue name=\"ND3P\">\n+ <Atom charge=\"3.0\" name=\"ND3P\" type=\"ND3P-ND3P\" />\n+ </Residue>\n+ <Residue name=\"PM3P\">\n+ <Atom charge=\"3.0\" name=\"PM3P\" type=\"PM3P-PM3P\" />\n+ </Residue>\n+ <Residue name=\"SM3P\">\n+ <Atom charge=\"3.0\" name=\"SM3P\" type=\"SM3P-SM3P\" />\n+ </Residue>\n+ <Residue name=\"EU3P\">\n+ <Atom charge=\"3.0\" name=\"EU3P\" type=\"EU3P-EU3P\" />\n+ </Residue>\n+ <Residue name=\"GD3P\">\n+ <Atom charge=\"3.0\" name=\"GD3P\" type=\"GD3P-GD3P\" />\n+ </Residue>\n+ <Residue name=\"TB3P\">\n+ <Atom charge=\"3.0\" name=\"TB3P\" type=\"TB3P-TB3P\" />\n+ </Residue>\n+ <Residue name=\"DY3P\">\n+ <Atom charge=\"3.0\" name=\"DY3P\" type=\"DY3P-DY3P\" />\n+ </Residue>\n+ <Residue name=\"HO3P\">\n+ <Atom charge=\"3.0\" name=\"HO3P\" type=\"HO3P-HO3P\" />\n+ </Residue>\n+ <Residue name=\"ER3P\">\n+ <Atom charge=\"3.0\" name=\"ER3P\" type=\"ER3P-ER3P\" />\n+ </Residue>\n+ <Residue name=\"YB3P\">\n+ <Atom charge=\"3.0\" name=\"YB3P\" type=\"YB3P-YB3P\" />\n+ </Residue>\n+ <Residue name=\"LU3P\">\n+ <Atom charge=\"3.0\" name=\"LU3P\" type=\"LU3P-LU3P\" />\n+ </Residue>\n+ <Residue name=\"U3P\">\n+ <Atom charge=\"3.0\" name=\"U3P\" type=\"U3P-U3P\" />\n+ </Residue>\n+ <Residue name=\"PU3P\">\n+ <Atom charge=\"3.0\" name=\"PU3P\" type=\"PU3P-PU3P\" />\n+ </Residue>\n+ <Residue name=\"TI3P\">\n+ <Atom charge=\"3.0\" name=\"TI3P\" type=\"TI3P-TI3P\" />\n+ </Residue>\n+ <Residue name=\"V3P\">\n+ <Atom charge=\"3.0\" name=\"V3P\" type=\"V3P-V3P\" />\n+ </Residue>\n+ <Residue name=\"CR3P\">\n+ <Atom charge=\"3.0\" name=\"CR3P\" type=\"CR3P-CR3P\" />\n+ </Residue>\n+ <Residue name=\"MN3P\">\n+ <Atom charge=\"3.0\" name=\"MN3P\" type=\"MN3P-MN3P\" />\n+ </Residue>\n+ <Residue name=\"FE3P\">\n+ <Atom charge=\"3.0\" name=\"FE3P\" type=\"FE3P-FE3P\" />\n+ </Residue>\n+ <Residue name=\"CO3P\">\n+ <Atom charge=\"3.0\" name=\"CO3P\" type=\"CO3P-CO3P\" />\n+ </Residue>\n+ <Residue name=\"GA3P\">\n+ <Atom charge=\"3.0\" name=\"GA3P\" type=\"GA3P-GA3P\" />\n+ </Residue>\n+ <Residue name=\"RH3P\">\n+ <Atom charge=\"3.0\" name=\"RH3P\" type=\"RH3P-RH3P\" />\n+ </Residue>\n+ <Residue name=\"IN3P\">\n+ <Atom charge=\"3.0\" name=\"IN3P\" type=\"IN3P-IN3P\" />\n+ </Residue>\n+ <Residue name=\"AU3P\">\n+ <Atom charge=\"3.0\" name=\"AU3P\" type=\"AU3P-AU3P\" />\n+ </Residue>\n+ <Residue name=\"TL3P\">\n+ <Atom charge=\"3.0\" name=\"TL3P\" type=\"TL3P-TL3P\" />\n+ </Residue>\n+ <Residue name=\"BI3P\">\n+ <Atom charge=\"3.0\" name=\"BI3P\" type=\"BI3P-BI3P\" />\n+ </Residue>\n+ </Residues>\n+ <HarmonicBondForce>\n+ <Bond class1=\"HT\" class2=\"HT\" k=\"0.0\" length=\"0.15139000000000002\" />\n+ <Bond class1=\"HT\" class2=\"OT\" k=\"376559.99999999994\" length=\"0.09572000000000001\" />\n+ <Bond class1=\"OX\" class2=\"HX\" k=\"456055.99999999994\" length=\"0.097\" />\n+ <Bond class1=\"HPER\" class2=\"OPER\" k=\"435972.79999999993\" length=\"0.0963\" />\n+ <Bond class1=\"OPER\" class2=\"OPER\" k=\"238906.39999999997\" length=\"0.1442\" />\n+ </HarmonicBondForce>\n+ <HarmonicAngleForce>\n+ <Angle angle=\"1.8242181341844732\" class1=\"HT\" class2=\"OT\" class3=\"HT\" k=\"460.24\" />\n+ <Angle angle=\"1.7439329885927342\" class1=\"HPER\" class2=\"OPER\" class3=\"OPER\" k=\"505.4272\" />\n+ </HarmonicAngleForce>\n+ <AmoebaUreyBradleyForce />\n+ <PeriodicTorsionForce>\n+ <Proper class1=\"HPER\" class2=\"OPER\" class3=\"OPER\" class4=\"HPER\" k1=\"8.45168\" periodicity1=\"2\" phase1=\"0.0\" />\n+ </PeriodicTorsionForce>\n+ <NonbondedForce coulomb14scale=\"1.0\" lj14scale=\"1.0\">\n+ <UseAttributeFromResidue name=\"charge\" />\n+ <Atom class=\"HT\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"HX\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"OT\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"OX\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"HPER\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"OPER\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"LIT\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"SOD\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"MG\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"POT\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"CAL\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"RUB\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"CES\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"BAR\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"ZN\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"CAD\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"CLA\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"CU1P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"AG1P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"AU1P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"TI1P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"BE2P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"SR2P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"RA2P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"V2P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"CR2P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"MN2P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"FE2P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"CO2P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"NI2P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"CU2P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"PD2P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"AG2P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"SN2P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"PT2P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"HG2P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"PB2P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"SM2P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"EU2P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"YB2P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"AL3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"SC3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"Y3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"LA3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"CE3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"PR3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"ND3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"PM3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"SM3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"EU3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"GD3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"TB3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"DY3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"HO3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"ER3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"TM3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"YB3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"LU3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"U3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"PU3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"TI3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"V3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"CR3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"MN3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"FE3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"CO3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"GA3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"RH3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"IN3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"AU3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"TL3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ <Atom class=\"BI3P\" epsilon=\"0.0\" sigma=\"1.0\" />\n+ </NonbondedForce>\n+ <LennardJonesForce lj14scale=\"1.0\">\n+ <Atom class=\"HT\" epsilon=\"0.192464\" sigma=\"0.04000135244450124\" />\n+ <Atom class=\"HX\" epsilon=\"0.192464\" sigma=\"0.04000135244450124\" />\n+ <Atom class=\"OT\" epsilon=\"0.6363864000000001\" sigma=\"0.3150574226831496\" />\n+ <Atom class=\"OX\" epsilon=\"0.50208\" sigma=\"0.30290556416771536\" />\n+ <Atom class=\"HPER\" epsilon=\"0.192464\" sigma=\"0.04000135244450124\" />\n+ <Atom class=\"OPER\" epsilon=\"0.85286656\" sigma=\"0.29831387217442007\" />\n+ <Atom class=\"LIT\" epsilon=\"0.00974872\" sigma=\"0.23118821735741807\" />\n+ <Atom class=\"SOD\" epsilon=\"0.1962296\" sigma=\"0.2513670733232967\" />\n+ <Atom class=\"MG\" epsilon=\"0.06276\" sigma=\"0.2111429961992604\" />\n+ <Atom class=\"POT\" epsilon=\"0.364008\" sigma=\"0.3142645228240047\" />\n+ <Atom class=\"CAL\" epsilon=\"0.50208\" sigma=\"0.24357170953956878\" />\n+ <Atom class=\"RUB\" epsilon=\"0.6276\" sigma=\"0.3385415128933289\" />\n+ <Atom class=\"CES\" epsilon=\"0.79496\" sigma=\"0.37417746161894255\" />\n+ <Atom class=\"BAR\" epsilon=\"0.6276\" sigma=\"0.33675971545704825\" />\n+ <Atom class=\"ZN\" epsilon=\"1.046\" sigma=\"0.194215920554594\" />\n+ <Atom class=\"CAD\" epsilon=\"0.50208\" sigma=\"0.2417899121032881\" />\n+ <Atom class=\"CLA\" epsilon=\"0.6276\" sigma=\"0.4044680180357141\" />\n+ <Atom class=\"CU1P\" epsilon=\"0.7748768\" sigma=\"0.1535909390073945\" />\n+ <Atom class=\"AG1P\" epsilon=\"1.2008079999999999\" sigma=\"0.2163636626875628\" />\n+ <Atom class=\"AU1P\" epsilon=\"1.4907592\" sigma=\"0.11250269012676205\" />\n+ <Atom class=\"TI1P\" epsilon=\"1.7016328\" sigma=\"0.34401163102271065\" />\n+ <Atom class=\"BE2P\" epsilon=\"0.4250944\" sigma=\"0.007127189745122714\" />\n+ <Atom class=\"SR2P\" epsilon=\"0.9572992\" sigma=\"0.3306837861993312\" />\n+ <Atom class=\"RA2P\" epsilon=\"1.2631496\" sigma=\"0.37237784620829906\" />\n+ <Atom class=\"V2P\" epsilon=\"0.6732056\" sigma=\"0.1966569830422985\" />\n+ <Atom class=\"CR2P\" epsilon=\"0.6974728\" sigma=\"0.18872798445084948\" />\n+ <Atom class=\"MN2P\" epsilon=\"0.7050040000000001\" sigma=\"0.2144749574051053\" />\n+ <Atom class=\"FE2P\" epsilon=\"0.667348\" sigma=\"0.1924519410926761\" />\n+ <Atom class=\"CO2P\" epsilon=\"0.6439176000000001\" sigma=\"0.16527953018939576\" />\n+ <Atom class=\"NI2P\" epsilon=\"0.5999856\" sigma=\"0.13903365395298137\" />\n+ <Atom class=\"CU2P\" epsilon=\"0.629692\" sigma=\"0.129198132104712\" />\n+ <Atom class=\"PD2P\" epsilon=\"0.7288528\" sigma=\"0.16519044031758173\" />\n+ <Atom class=\"AG2P\" epsilon=\"0.7752952\" sigma=\"0.1869105510658432\" />\n+ <Atom class=\"SN2P\" epsilon=\"0.7861736\" sigma=\"0.29542201493533654\" />\n+ <Atom class=\"PT2P\" epsilon=\"0.6824104\" sigma=\"0.1420270736459329\" />\n+ <Atom class=\"HG2P\" epsilon=\"0.8593936\" sigma=\"0.2105728210196506\" />\n+ <Atom class=\"PB2P\" epsilon=\"1.0016496000000001\" sigma=\"0.3132399892981433\" />\n+ <Atom class=\"SM2P\" epsilon=\"1.0242432\" sigma=\"0.330790694045508\" />\n+ <Atom class=\"EU2P\" epsilon=\"0.9907712000000001\" sigma=\"0.3279220001730961\" />\n+ <Atom class=\"YB2P\" epsilon=\"0.8593936\" sigma=\"0.28669120749756116\" />\n+ <Atom class=\"AL3P\" epsilon=\"0.44601440000000003\" sigma=\"0.039377723341803\" />\n+ <Atom class=\"SC3P\" epsilon=\"0.5899439999999999\" sigma=\"0.19544536078562763\" />\n+ <Atom class=\"Y3P\" epsilon=\"0.6928704\" sigma=\"0.25183924964391113\" />\n+ <Atom class=\"LA3P\" epsilon=\"0.7932864\" sigma=\"0.3158592315294759\" />\n+ <Atom class=\"CE3P\" epsilon=\"0.7702744000000001\" sigma=\"0.30495463121943817\" />\n+ <Atom class=\"PR3P\" epsilon=\"0.7627432\" sigma=\"0.2956180126533274\" />\n+ <Atom class=\"ND3P\" epsilon=\"0.7497728\" sigma=\"0.2886333667031071\" />\n+ <Atom class=\"PM3P\" epsilon=\"0.74266\" sigma=\"0.29527947114043407\" />\n+ <Atom class=\"SM3P\" epsilon=\"0.7351288\" sigma=\"0.2791542043420939\" />\n+ <Atom class=\"EU3P\" epsilon=\"0.728016\" sigma=\"0.2713677495455473\" />\n+ <Atom class=\"GD3P\" epsilon=\"0.7209032000000001\" sigma=\"0.2681605141602421\" />\n+ <Atom class=\"TB3P\" epsilon=\"0.7083512000000001\" sigma=\"0.2628151218514001\" />\n+ <Atom class=\"DY3P\" epsilon=\"0.6999832\" sigma=\"0.2573628216963812\" />\n+ <Atom class=\"HO3P\" epsilon=\"0.6928704\" sigma=\"0.247794569463554\" />\n+ <Atom class=\"ER3P\" epsilon=\"0.6845024\" sigma=\"0.24362516346265717\" />\n+ <Atom class=\"TM3P\" epsilon=\"0.6778080000000001\" sigma=\"0.24029320225681233\" />\n+ <Atom class=\"YB3P\" epsilon=\"0.6711136\" sigma=\"0.23077840394707347\" />\n+ <Atom class=\"LU3P\" epsilon=\"0.6644192\" sigma=\"0.2407564695902453\" />\n+ <Atom class=\"U3P\" epsilon=\"0.7932864\" sigma=\"0.3031193798600691\" />\n+ <Atom class=\"PU3P\" epsilon=\"0.7702744000000001\" sigma=\"0.29750671793578487\" />\n+ <Atom class=\"TI3P\" epsilon=\"0.537644\" sigma=\"0.14769318949330543\" />\n+ <Atom class=\"V3P\" epsilon=\"0.5171424\" sigma=\"0.10943799853635927\" />\n+ <Atom class=\"CR3P\" epsilon=\"0.5045904\" sigma=\"0.15022334185282402\" />\n+ <Atom class=\"MN3P\" epsilon=\"0.5238368\" sigma=\"0.06849229345062928\" />\n+ <Atom class=\"FE3P\" epsilon=\"0.5238368\" sigma=\"0.10090318881657484\" />\n+ <Atom class=\"CO3P\" epsilon=\"0.4983144\" sigma=\"0.04598819183040431\" />\n+ <Atom class=\"GA3P\" epsilon=\"0.5045904\" sigma=\"0.04042898382920859\" />\n+ <Atom class=\"RH3P\" epsilon=\"0.537644\" sigma=\"0.0821943157356277\" />\n+ <Atom class=\"IN3P\" epsilon=\"0.6163031999999999\" sigma=\"0.15435711190499518\" />\n+ <Atom class=\"AU3P\" epsilon=\"0.5564720000000001\" sigma=\"0.065106878321696\" />\n+ <Atom class=\"TL3P\" epsilon=\"0.6815736\" sigma=\"0.15489165113587938\" />\n+ <Atom class=\"BI3P\" epsilon=\"0.7740400000000001\" sigma=\"0.24378552523192246\" />\n+ <NBFixPair class1=\"OC\" class2=\"SOD\" epsilon=\"0.31388368000000005\" sigma=\"0.2877602859593296\" />\n+ <NBFixPair class1=\"OS\" class2=\"SOD\" epsilon=\"0.31388368000000005\" sigma=\"0.2788512987779262\" />\n+ <NBFixPair class1=\"LIT\" class2=\"ON3\" epsilon=\"0.0698728\" sigma=\"0.28308306768909286\" />\n+ <NBFixPair class1=\"OCL\" class2=\"SOD\" epsilon=\"0.31388368000000005\" sigma=\"0.2877602859593296\" />\n+ <NBFixPair class1=\"OBL\" class2=\"SOD\" epsilon=\"0.31388368000000005\" sigma=\"0.2788512987779262\" />\n+ <NBFixPair class1=\"O2L\" class2=\"SOD\" epsilon=\"0.31388368000000005\" sigma=\"0.28152399493234725\" />\n+ <NBFixPair class1=\"OC2D2\" class2=\"SOD\" epsilon=\"0.31388368000000005\" sigma=\"0.2877602859593296\" />\n+ <NBFixPair class1=\"OC2DP\" class2=\"SOD\" epsilon=\"0.31388368000000005\" sigma=\"0.28152399493234725\" />\n+ <NBFixPair class1=\"OG2D2\" class2=\"SOD\" epsilon=\"0.31388368000000005\" sigma=\"0.2877602859593296\" />\n+ <NBFixPair class1=\"OG2P1\" class2=\"SOD\" epsilon=\"0.31388368000000005\" sigma=\"0.28152399493234725\" />\n+ <NBFixPair class1=\"CLA\" class2=\"LIT\" epsilon=\"0.07824080000000001\" sigma=\"0.3285189023142501\" />\n+ <NBFixPair class1=\"CLA\" class2=\"SOD\" epsilon=\"0.3510376\" sigma=\"0.3323943117381606\" />\n+ <NBFixPair class1=\"CLA\" class2=\"POT\" epsilon=\"0.4778128\" sigma=\"0.3635757668730725\" />\n+ <NBFixPair class1=\"OC\" class2=\"POT\" epsilon=\"0.4276048\" sigma=\"0.3139527082726556\" />\n+ <NBFixPair class1=\"OCL\" class2=\"POT\" epsilon=\"0.4276048\" sigma=\"0.3139527082726556\" />\n+ <NBFixPair class1=\"OC2D2\" class2=\"POT\" epsilon=\"0.4276048\" sigma=\"0.3139527082726556\" />\n+ <NBFixPair class1=\"OG2D2\" class2=\"POT\" epsilon=\"0.4276048\" sigma=\"0.3139527082726556\" />\n+ <NBFixPair class1=\"CAL\" class2=\"CLA\" epsilon=\"0.561342176\" sigma=\"0.3320379522509045\" />\n+ <NBFixPair class1=\"CAL\" class2=\"O2L\" epsilon=\"0.50208\" sigma=\"0.2900766226264945\" />\n+ <NBFixPair class1=\"CAL\" class2=\"OC2DP\" epsilon=\"0.50208\" sigma=\"0.2900766226264945\" />\n+ <NBFixPair class1=\"CAL\" class2=\"OG2P1\" epsilon=\"0.50208\" sigma=\"0.2900766226264945\" />\n+ <NBFixPair class1=\"CAL\" class2=\"OCL\" epsilon=\"0.50208\" sigma=\"0.28793846570295767\" />\n+ <NBFixPair class1=\"CAL\" class2=\"OC\" epsilon=\"0.50208\" sigma=\"0.28793846570295767\" />\n+ <NBFixPair class1=\"CAL\" class2=\"OC2D2\" epsilon=\"0.50208\" sigma=\"0.28793846570295767\" />\n+ <NBFixPair class1=\"CAL\" class2=\"OG2D2\" epsilon=\"0.50208\" sigma=\"0.28793846570295767\" />\n+ </LennardJonesForce>\n+ <InitializationScript>\n+EXPECTED_VERSION = \"charmm36_2024\"\n+if hasattr(self, \"_charmm_ff_version\"):\n+ if self._charmm_ff_version != EXPECTED_VERSION:\n+ raise RuntimeError(f\"CHARMM force field versions ({self._charmm_ff_version} and {EXPECTED_VERSION}) incompatible\")\n+else:\n+ self._charmm_ff_version = EXPECTED_VERSION\n+ </InitializationScript>\n+</ForceField>\n\\ No newline at end of file\ndiff --git a/wrappers/python/openmm/app/data/charmm_polar_2023.xml b/wrappers/python/openmm/app/data/charmm_polar_2023.xml\nindex 133e9c8442..ac9e60b3c7 100644\n--- a/wrappers/python/openmm/app/data/charmm_polar_2023.xml\n+++ b/wrappers/python/openmm/app/data/charmm_polar_2023.xml\n@@ -1,6 +1,6 @@\n <ForceField>\n <Info>\n- <DateGenerated>2025-02-27</DateGenerated>\n+ <DateGenerated>2025-06-23</DateGenerated>\n <Source Source=\"toppar/drude/drude_toppar_2023/toppar_drude_main_protein_2023a.str\" md5hash=\"f3c4caab3ff08e7b822f7b944db3f197\" sourcePackage=\"drude\" sourcePackageVersion=\"drude_toppar_2023.tgz\">toppar/drude/drude_toppar_2023/toppar_drude_main_protein_2023a.str</Source>\n <Source Source=\"toppar/drude/drude_toppar_2023/toppar_drude_d_aminoacids_2023a.str\" md5hash=\"192af93e684f3891df130182b8302c58\" sourcePackage=\"drude\" sourcePackageVersion=\"drude_toppar_2023.tgz\">toppar/drude/drude_toppar_2023/toppar_drude_d_aminoacids_2023a.str</Source>\n <Source Source=\"toppar/drude/drude_toppar_2023/toppar_drude_carbohydrate_2023a.str\" md5hash=\"6d8a686b8b5ecf19de7e598d928a7c1a\" sourcePackage=\"drude\" sourcePackageVersion=\"drude_toppar_2023.tgz\">toppar/drude/drude_toppar_2023/toppar_drude_carbohydrate_2023a.str</Source>\n@@ -9684,15 +9684,6 @@\n <Type class=\"DRUD\" mass=\"0.0\" name=\"Drude-GNTE-O\" />\n <Type class=\"LPDO1\" mass=\"0.0\" name=\"GNTE-LPOA\" />\n <Type class=\"LPDO1\" mass=\"0.0\" name=\"GNTE-LPOB\" />\n- <Type class=\"ND3P3A\" element=\"N\" mass=\"14.007\" name=\"GNTS-N\" />\n- <Type class=\"DRUD\" mass=\"0.0\" name=\"Drude-GNTS-N\" />\n- <Type class=\"HDP1B\" element=\"H\" mass=\"1.008\" name=\"GNTS-HT1\" />\n- <Type class=\"HDP1B\" element=\"H\" mass=\"1.008\" name=\"GNTS-HT2\" />\n- <Type class=\"HDP1B\" element=\"H\" mass=\"1.008\" name=\"GNTS-HT3\" />\n- <Type class=\"CD32C\" element=\"C\" mass=\"12.011\" name=\"GNTS-CA\" />\n- <Type class=\"DRUD\" mass=\"0.0\" name=\"Drude-GNTS-CA\" />\n- <Type class=\"HDA2C\" element=\"H\" mass=\"1.008\" name=\"GNTS-HA1\" />\n- <Type class=\"HDA2C\" element=\"H\" mass=\"1.008\" name=\"GNTS-HA2\" />\n <Type class=\"ND3P2A\" element=\"N\" mass=\"14.007\" name=\"PROP-N\" />\n <Type class=\"DRUD\" mass=\"0.0\" name=\"Drude-PROP-N\" />\n <Type class=\"HDP1B\" element=\"H\" mass=\"1.008\" name=\"PROP-HT1\" />\n@@ -9855,17 +9846,6 @@\n <Type class=\"LPD\" mass=\"0.0\" name=\"CNEG-LPT2\" />\n <Type class=\"LPD\" mass=\"0.0\" name=\"CNEG-LPT3\" />\n <Type class=\"LPD\" mass=\"0.0\" name=\"CNEG-LPT4\" />\n- <Type class=\"CD2O3A\" element=\"C\" mass=\"12.011\" name=\"CNES-C\" />\n- <Type class=\"DRUD\" mass=\"0.0\" name=\"Drude-CNES-C\" />\n- <Type class=\"OD2C3A\" element=\"O\" mass=\"15.9994\" name=\"CNES-OT1\" />\n- <Type class=\"DRUD\" mass=\"0.0\" name=\"Drude-CNES-OT1\" />\n- <Type class=\"OD31F\" element=\"O\" mass=\"15.9994\" name=\"CNES-OT2\" />\n- <Type class=\"DRUD\" mass=\"0.0\" name=\"Drude-CNES-OT2\" />\n- <Type class=\"HDP1A\" element=\"H\" mass=\"1.008\" name=\"CNES-HT\" />\n- <Type class=\"LPD\" mass=\"0.0\" name=\"CNES-LPT1\" />\n- <Type class=\"LPD\" mass=\"0.0\" name=\"CNES-LPT2\" />\n- <Type class=\"LPD\" mass=\"0.0\" name=\"CNES-LPT3\" />\n- <Type class=\"LPD\" mass=\"0.0\" name=\"CNES-LPT4\" />\n <Type class=\"ND2A2\" element=\"N\" mass=\"14.007\" name=\"CT1-N\" />\n <Type class=\"DRUD\" mass=\"0.0\" name=\"Drude-CT1-N\" />\n <Type class=\"HDP1A\" element=\"H\" mass=\"1.008\" name=\"CT1-HN\" />\n@@ -9942,16 +9922,6 @@\n <Type class=\"HDP1A\" element=\"H\" mass=\"1.008\" name=\"CT2G-HTC2\" />\n <Type class=\"LPDO1\" mass=\"0.0\" name=\"CT2G-LPOA\" />\n <Type class=\"LPDO1\" mass=\"0.0\" name=\"CT2G-LPOB\" />\n- <Type class=\"CD2O1A\" element=\"C\" mass=\"12.011\" name=\"CT2S-C\" />\n- <Type class=\"DRUD\" mass=\"0.0\" name=\"Drude-CT2S-C\" />\n- <Type class=\"OD2C1A\" element=\"O\" mass=\"15.9994\" name=\"CT2S-O\" />\n- <Type class=\"DRUD\" mass=\"0.0\" name=\"Drude-CT2S-O\" />\n- <Type class=\"ND2A1\" element=\"N\" mass=\"14.007\" name=\"CT2S-NT\" />\n- <Type class=\"DRUD\" mass=\"0.0\" name=\"Drude-CT2S-NT\" />\n- <Type class=\"HDP1A\" element=\"H\" mass=\"1.008\" name=\"CT2S-HTC1\" />\n- <Type class=\"HDP1A\" element=\"H\" mass=\"1.008\" name=\"CT2S-HTC2\" />\n- <Type class=\"LPDO1\" mass=\"0.0\" name=\"CT2S-LPOA\" />\n- <Type class=\"LPDO1\" mass=\"0.0\" name=\"CT2S-LPOB\" />\n <Type class=\"ND2A2\" element=\"N\" mass=\"14.007\" name=\"CT3-NT\" />\n <Type class=\"DRUD\" mass=\"0.0\" name=\"Drude-CT3-NT\" />\n <Type class=\"HDP1A\" element=\"H\" mass=\"1.008\" name=\"CT3-HNT\" />\n@@ -10059,6 +10029,15 @@\n <Type class=\"CD31DC\" element=\"C\" mass=\"12.011\" name=\"DNTES-CA\" />\n <Type class=\"DRUD\" mass=\"0.0\" name=\"Drude-DNTES-CA\" />\n <Type class=\"HDA1C\" element=\"H\" mass=\"1.008\" name=\"DNTES-HA\" />\n+ <Type class=\"ND3P3A\" element=\"N\" mass=\"14.007\" name=\"DGNTS-N\" />\n+ <Type class=\"DRUD\" mass=\"0.0\" name=\"Drude-DGNTS-N\" />\n+ <Type class=\"HDP1B\" element=\"H\" mass=\"1.008\" name=\"DGNTS-HT1\" />\n+ <Type class=\"HDP1B\" element=\"H\" mass=\"1.008\" name=\"DGNTS-HT2\" />\n+ <Type class=\"HDP1B\" element=\"H\" mass=\"1.008\" name=\"DGNTS-HT3\" />\n+ <Type class=\"CD32C\" element=\"C\" mass=\"12.011\" name=\"DGNTS-CA\" />\n+ <Type class=\"DRUD\" mass=\"0.0\" name=\"Drude-DGNTS-CA\" />\n+ <Type class=\"HDA2C\" element=\"H\" mass=\"1.008\" name=\"DGNTS-HA1\" />\n+ <Type class=\"HDA2C\" element=\"H\" mass=\"1.008\" name=\"DGNTS-HA2\" />\n <Type class=\"ND3P2A\" element=\"N\" mass=\"14.007\" name=\"DPROP-N\" />\n <Type class=\"DRUD\" mass=\"0.0\" name=\"Drude-DPROP-N\" />\n <Type class=\"HDP1B\" element=\"H\" mass=\"1.008\" name=\"DPROP-HT1\" />\n@@ -10169,6 +10148,17 @@\n <Type class=\"LPD\" mass=\"0.0\" name=\"DCNEU-LPT2\" />\n <Type class=\"LPD\" mass=\"0.0\" name=\"DCNEU-LPT3\" />\n <Type class=\"LPD\" mass=\"0.0\" name=\"DCNEU-LPT4\" />\n+ <Type class=\"CD2O3A\" element=\"C\" mass=\"12.011\" name=\"DCNES-C\" />\n+ <Type class=\"DRUD\" mass=\"0.0\" name=\"Drude-DCNES-C\" />\n+ <Type class=\"OD2C3A\" element=\"O\" mass=\"15.9994\" name=\"DCNES-OT1\" />\n+ <Type class=\"DRUD\" mass=\"0.0\" name=\"Drude-DCNES-OT1\" />\n+ <Type class=\"OD31F\" element=\"O\" mass=\"15.9994\" name=\"DCNES-OT2\" />\n+ <Type class=\"DRUD\" mass=\"0.0\" name=\"Drude-DCNES-OT2\" />\n+ <Type class=\"HDP1A\" element=\"H\" mass=\"1.008\" name=\"DCNES-HT\" />\n+ <Type class=\"LPD\" mass=\"0.0\" name=\"DCNES-LPT1\" />\n+ <Type class=\"LPD\" mass=\"0.0\" name=\"DCNES-LPT2\" />\n+ <Type class=\"LPD\" mass=\"0.0\" name=\"DCNES-LPT3\" />\n+ <Type class=\"LPD\" mass=\"0.0\" name=\"DCNES-LPT4\" />\n <Type class=\"ND2A2\" element=\"N\" mass=\"14.007\" name=\"DCT1-N\" />\n <Type class=\"DRUD\" mass=\"0.0\" name=\"Drude-DCT1-N\" />\n <Type class=\"HDP1A\" element=\"H\" mass=\"1.008\" name=\"DCT1-HN\" />\n@@ -10206,6 +10196,16 @@\n <Type class=\"HDP1A\" element=\"H\" mass=\"1.008\" name=\"DCT2-HTC2\" />\n <Type class=\"LPDO1\" mass=\"0.0\" name=\"DCT2-LPOA\" />\n <Type class=\"LPDO1\" mass=\"0.0\" name=\"DCT2-LPOB\" />\n+ <Type class=\"CD2O1A\" element=\"C\" mass=\"12.011\" name=\"DCT2S-C\" />\n+ <Type class=\"DRUD\" mass=\"0.0\" name=\"Drude-DCT2S-C\" />\n+ <Type class=\"OD2C1A\" element=\"O\" mass=\"15.9994\" name=\"DCT2S-O\" />\n+ <Type class=\"DRUD\" mass=\"0.0\" name=\"Drude-DCT2S-O\" />\n+ <Type class=\"ND2A1\" element=\"N\" mass=\"14.007\" name=\"DCT2S-NT\" />\n+ <Type class=\"DRUD\" mass=\"0.0\" name=\"Drude-DCT2S-NT\" />\n+ <Type class=\"HDP1A\" element=\"H\" mass=\"1.008\" name=\"DCT2S-HTC1\" />\n+ <Type class=\"HDP1A\" element=\"H\" mass=\"1.008\" name=\"DCT2S-HTC2\" />\n+ <Type class=\"LPDO1\" mass=\"0.0\" name=\"DCT2S-LPOA\" />\n+ <Type class=\"LPDO1\" mass=\"0.0\" name=\"DCT2S-LPOB\" />\n <Type class=\"OD306A\" element=\"O\" mass=\"15.9994\" name=\"OMEA-O5\" />\n <Type class=\"DRUD\" mass=\"0.0\" name=\"Drude-OMEA-O5\" />\n <Type class=\"CD31HA\" element=\"C\" mass=\"12.011\" name=\"OMEA-C1\" />\n@@ -10414,10 +10414,8 @@\n <AllowPatch name=\"ACE_3\" />\n <AllowPatch name=\"CTER_1\" />\n <AllowPatch name=\"CNEU_1\" />\n- <AllowPatch name=\"CNES_1\" />\n <AllowPatch name=\"CT1_1\" />\n <AllowPatch name=\"CT2_1\" />\n- <AllowPatch name=\"CT2S_2\" />\n <AllowPatch name=\"CT3_2\" />\n </Residue>\n <Residue name=\"ALA\">\n@@ -10455,10 +10453,8 @@\n <AllowPatch name=\"ACE_0\" />\n <AllowPatch name=\"CTER_0\" />\n <AllowPatch name=\"CNEU_0\" />\n- <AllowPatch name=\"CNES_0\" />\n <AllowPatch name=\"CT1_0\" />\n <AllowPatch name=\"CT2_0\" />\n- <AllowPatch name=\"CT2S_1\" />\n <AllowPatch name=\"CT3_1\" />\n </Residue>\n <Residue name=\"ARG\">\n@@ -10527,14 +10523,11 @@\n <ExternalBond atomName=\"N\" />\n <ExternalBond atomName=\"C\" />\n <AllowPatch name=\"NTER_1\" />\n- <AllowPatch name=\"PROP_0\" />\n <AllowPatch name=\"ACE_0\" />\n <AllowPatch name=\"CTER_0\" />\n <AllowPatch name=\"CNEU_0\" />\n- <AllowPatch name=\"CNES_0\" />\n <AllowPatch name=\"CT1_0\" />\n <AllowPatch name=\"CT2_0\" />\n- <AllowPatch name=\"CT2S_1\" />\n <AllowPatch name=\"CT3_1\" />\n </Residue>\n <Residue name=\"ASN\">\n@@ -10587,10 +10580,8 @@\n <AllowPatch name=\"ACE_0\" />\n <AllowPatch name=\"CTER_0\" />\n <AllowPatch name=\"CNEU_0\" />\n- <AllowPatch name=\"CNES_0\" />\n <AllowPatch name=\"CT1_0\" />\n <AllowPatch name=\"CT2_0\" />\n- <AllowPatch name=\"CT2S_1\" />\n <AllowPatch name=\"CT3_1\" />\n </Residue>\n <Residue name=\"ASP\">\n@@ -10643,10 +10634,8 @@\n <AllowPatch name=\"ACE_0\" />\n <AllowPatch name=\"CTER_0\" />\n <AllowPatch name=\"CNEU_0\" />\n- <AllowPatch name=\"CNES_0\" />\n <AllowPatch name=\"CT1_0\" />\n <AllowPatch name=\"CT2_0\" />\n- <AllowPatch name=\"CT2S_1\" />\n <AllowPatch name=\"CT3_1\" />\n <AllowPatch name=\"ASPP_0\" />\n </Residue>\n@@ -10692,10 +10681,8 @@\n <AllowPatch name=\"ACE_0\" />\n <AllowPatch name=\"CTER_0\" />\n <AllowPatch name=\"CNEU_0\" />\n- <AllowPatch name=\"CNES_0\" />\n <AllowPatch name=\"CT1_0\" />\n <AllowPatch name=\"CT2_0\" />\n- <AllowPatch name=\"CT2S_1\" />\n <AllowPatch name=\"CT3_1\" />\n </Residue>\n <Residue name=\"GLN\">\n@@ -10755,10 +10742,8 @@\n <AllowPatch name=\"ACE_0\" />\n <AllowPatch name=\"CTER_0\" />\n <AllowPatch name=\"CNEU_0\" />\n- <AllowPatch name=\"CNES_0\" />\n <AllowPatch name=\"CT1_0\" />\n <AllowPatch name=\"CT2_0\" />\n- <AllowPatch name=\"CT2S_1\" />\n <AllowPatch name=\"CT3_1\" />\n </Residue>\n <Residue name=\"GLU\">\n@@ -10818,10 +10803,8 @@\n <AllowPatch name=\"ACE_0\" />\n <AllowPatch name=\"CTER_0\" />\n <AllowPatch name=\"CNEU_0\" />\n- <AllowPatch name=\"CNES_0\" />\n <AllowPatch name=\"CT1_0\" />\n <AllowPatch name=\"CT2_0\" />\n- <AllowPatch name=\"CT2S_1\" />\n <AllowPatch name=\"CT3_1\" />\n <AllowPatch name=\"GLUP_0\" />\n </Residue>\n@@ -10850,15 +10833,12 @@\n <ExternalBond atomName=\"N\" />\n <ExternalBond atomName=\"C\" />\n <AllowPatch name=\"GNTE_0\" />\n- <AllowPatch name=\"GNTS_1\" />\n <AllowPatch name=\"ACE_0\" />\n <AllowPatch name=\"GNNU_0\" />\n <AllowPatch name=\"CTEG_0\" />\n <AllowPatch name=\"CNEG_0\" />\n- <AllowPatch name=\"CNES_0\" />\n <AllowPatch name=\"CT1G_0\" />\n <AllowPatch name=\"CT2G_0\" />\n- <AllowPatch name=\"CT2S_1\" />\n <AllowPatch name=\"CT3_1\" />\n </Residue>\n <Residue name=\"HSD\">\n@@ -10920,10 +10900,8 @@\n <AllowPatch name=\"ACE_0\" />\n <AllowPatch name=\"CTER_0\" />\n <AllowPatch name=\"CNEU_0\" />\n- <AllowPatch name=\"CNES_0\" />\n <AllowPatch name=\"CT1_0\" />\n <AllowPatch name=\"CT2_0\" />\n- <AllowPatch name=\"CT2S_1\" />\n <AllowPatch name=\"CT3_1\" />\n <AllowPatch name=\"HS2_0\" />\n </Residue>\n@@ -10987,10 +10965,8 @@\n <AllowPatch name=\"NNEU_0\" />\n <AllowPatch name=\"CTER_0\" />\n <AllowPatch name=\"CNEU_0\" />\n- <AllowPatch name=\"CNES_0\" />\n <AllowPatch name=\"CT1_0\" />\n <AllowPatch name=\"CT2_0\" />\n- <AllowPatch name=\"CT2S_1\" />\n <AllowPatch name=\"CT3_1\" />\n </Residue>\n <Residue name=\"HSP\">\n@@ -11050,10 +11026,8 @@\n <AllowPatch name=\"ACE_0\" />\n <AllowPatch name=\"CTER_0\" />\n <AllowPatch name=\"CNEU_0\" />\n- <AllowPatch name=\"CNES_0\" />\n <AllowPatch name=\"CT1_0\" />\n <AllowPatch name=\"CT2_0\" />\n- <AllowPatch name=\"CT2S_1\" />\n <AllowPatch name=\"CT3_1\" />\n </Residue>\n <Residue name=\"ILE\">\n@@ -11112,10 +11086,8 @@\n <AllowPatch name=\"ACE_0\" />\n <AllowPatch name=\"CTER_0\" />\n <AllowPatch name=\"CNEU_0\" />\n- <AllowPatch name=\"CNES_0\" />\n <AllowPatch name=\"CT1_0\" />\n <AllowPatch name=\"CT2_0\" />\n- <AllowPatch name=\"CT2S_1\" />\n <AllowPatch name=\"CT3_1\" />\n </Residue>\n <Residue name=\"LEU\">\n@@ -11174,10 +11146,8 @@\n <AllowPatch name=\"ACE_0\" />\n <AllowPatch name=\"CTER_0\" />\n <AllowPatch name=\"CNEU_0\" />\n- <AllowPatch name=\"CNES_0\" />\n <AllowPatch name=\"CT1_0\" />\n <AllowPatch name=\"CT2_0\" />\n- <AllowPatch name=\"CT2S_1\" />\n <AllowPatch name=\"CT3_1\" />\n </Residue>\n <Residue name=\"LYS\">\n@@ -11240,14 +11210,11 @@\n <ExternalBond atomName=\"N\" />\n <ExternalBond atomName=\"C\" />\n <AllowPatch name=\"NTER_1\" />\n- <AllowPatch name=\"PROP_0\" />\n <AllowPatch name=\"ACE_0\" />\n <AllowPatch name=\"CTER_0\" />\n <AllowPatch name=\"CNEU_0\" />\n- <AllowPatch name=\"CNES_0\" />\n <AllowPatch name=\"CT1_0\" />\n <AllowPatch name=\"CT2_0\" />\n- <AllowPatch name=\"CT2S_1\" />\n <AllowPatch name=\"CT3_1\" />\n <AllowPatch name=\"LSN_0\" />\n <AllowPatch name=\"KAC_0\" />\n@@ -11308,10 +11275,8 @@\n <AllowPatch name=\"ACE_0\" />\n <AllowPatch name=\"CTER_0\" />\n <AllowPatch name=\"CNEU_0\" />\n- <AllowPatch name=\"CNES_0\" />\n <AllowPatch name=\"CT1_0\" />\n <AllowPatch name=\"CT2_0\" />\n- <AllowPatch name=\"CT2S_1\" />\n <AllowPatch name=\"CT3_1\" />\n </Residue>\n <Residue name=\"PHE\">\n@@ -11378,10 +11343,8 @@\n <AllowPatch name=\"ACE_0\" />\n <AllowPatch name=\"CTER_0\" />\n <AllowPatch name=\"CNEU_0\" />\n- <AllowPatch name=\"CNES_0\" />\n <AllowPatch name=\"CT1_0\" />\n <AllowPatch name=\"CT2_0\" />\n- <AllowPatch name=\"CT2S_1\" />\n <AllowPatch name=\"CT3_1\" />\n </Residue>\n <Residue name=\"PRO\">\n@@ -11429,8 +11392,6 @@\n <AllowPatch name=\"PROP_0\" />\n <AllowPatch name=\"ACE_0\" />\n <AllowPatch name=\"CTEP_0\" />\n- <AllowPatch name=\"CNES_0\" />\n- <AllowPatch name=\"CT2S_1\" />\n <AllowPatch name=\"CT3_1\" />\n </Residue>\n <Residue name=\"SER\">\n@@ -11475,10 +11436,8 @@\n <AllowPatch name=\"ACE_0\" />\n <AllowPatch name=\"CTER_0\" />\n <AllowPatch name=\"CNEU_0\" />\n- <AllowPatch name=\"CNES_0\" />\n <AllowPatch name=\"CT1_0\" />\n <AllowPatch name=\"CT2_0\" />\n- <AllowPatch name=\"CT2S_1\" />\n <AllowPatch name=\"CT3_1\" />\n </Residue>\n <Residue name=\"THR\">\n@@ -11530,10 +11489,8 @@\n <AllowPatch name=\"ACE_0\" />\n <AllowPatch name=\"CTER_0\" />\n <AllowPatch name=\"CNEU_0\" />\n- <AllowPatch name=\"CNES_0\" />\n <AllowPatch name=\"CT1_0\" />\n <AllowPatch name=\"CT2_0\" />\n- <AllowPatch name=\"CT2S_1\" />\n <AllowPatch name=\"CT3_1\" />\n </Residue>\n <Residue name=\"TRP\">\n@@ -11612,10 +11569,8 @@\n <AllowPatch name=\"ACE_0\" />\n <AllowPatch name=\"CTER_0\" />\n <AllowPatch name=\"CNEU_0\" />\n- <AllowPatch name=\"CNES_0\" />\n <AllowPatch name=\"CT1_0\" />\n <AllowPatch name=\"CT2_0\" />\n- <AllowPatch name=\"CT2S_1\" />\n <AllowPatch name=\"CT3_1\" />\n </Residue>\n <Residue name=\"TYR\">\n@@ -11689,10 +11644,8 @@\n <AllowPatch name=\"ACE_0\" />\n <AllowPatch name=\"CTER_0\" />\n <AllowPatch name=\"CNEU_0\" />\n- <AllowPatch name=\"CNES_0\" />\n <AllowPatch name=\"CT1_0\" />\n <AllowPatch name=\"CT2_0\" />\n- <AllowPatch name=\"CT2S_1\" />\n <AllowPatch name=\"CT3_1\" />\n </Residue>\n <Residue name=\"VAL\">\n@@ -11744,10 +11697,8 @@\n <AllowPatch name=\"ACE_0\" />\n <AllowPatch name=\"CTER_0\" />\n <AllowPatch name=\"CNEU_0\" />\n- <AllowPatch name=\"CNES_0\" />\n <AllowPatch name=\"CT1_0\" />\n <AllowPatch name=\"CT2_0\" />\n- <AllowPatch name=\"CT2S_1\" />\n <AllowPatch name=\"CT3_1\" />\n </Residue>\n <Residue name=\"ALLO\">\n@@ -12742,7 +12693,6 @@\n <VirtualSite atomName1=\"O\" atomName2=\"CT\" atomName3=\"C\" p1=\"-0.0005235721931185043\" p2=\"-0.029995430854691738\" p3=\"0\" siteName=\"LPY1\" type=\"localCoords\" wo1=\"1\" wo2=\"0\" wo3=\"0\" wx1=\"-1.0\" wx2=\"0.0\" wx3=\"1.0\" wy1=\"0\" wy2=\"-1\" wy3=\"1\" />\n <VirtualSite atomName1=\"O\" atomName2=\"CT\" atomName3=\"C\" p1=\"-0.0005235721931185043\" p2=\"0.029995430854691738\" p3=\"0\" siteName=\"LPY2\" type=\"localCoords\" wo1=\"1\" wo2=\"0\" wo3=\"0\" wx1=\"-1.0\" wx2=\"0.0\" wx3=\"1.0\" wy1=\"0\" wy2=\"-1\" wy3=\"1\" />\n <AllowPatch name=\"ACE_2\" />\n- <AllowPatch name=\"CT2S_0\" />\n <AllowPatch name=\"CT3_0\" />\n <AllowPatch name=\"OMEA_0\" />\n <AllowPatch name=\"1AOME_0\" />\n@@ -13003,7 +12953,6 @@\n <VirtualSite atomName1=\"O\" atomName2=\"CT\" atomName3=\"C\" p1=\"-0.0005235721931185043\" p2=\"-0.029995430854691738\" p3=\"0\" siteName=\"LPY1\" type=\"localCoords\" wo1=\"1\" wo2=\"0\" wo3=\"0\" wx1=\"-1.0\" wx2=\"0.0\" wx3=\"1.0\" wy1=\"0\" wy2=\"-1\" wy3=\"1\" />\n <VirtualSite atomName1=\"O\" atomName2=\"CT\" atomName3=\"C\" p1=\"-0.0005235721931185043\" p2=\"0.029995430854691738\" p3=\"0\" siteName=\"LPY2\" type=\"localCoords\" wo1=\"1\" wo2=\"0\" wo3=\"0\" wx1=\"-1.0\" wx2=\"0.0\" wx3=\"1.0\" wy1=\"0\" wy2=\"-1\" wy3=\"1\" />\n <AllowPatch name=\"ACE_2\" />\n- <AllowPatch name=\"CT2S_0\" />\n <AllowPatch name=\"CT3_0\" />\n <AllowPatch name=\"OMEA_0\" />\n <AllowPatch name=\"1AOME_0\" />\n@@ -13148,7 +13097,6 @@\n <VirtualSite atomName1=\"O9\" atomName2=\"HO9\" atomName3=\"C9\" p1=\"-0.011970705016398403\" p2=\"0.0005739964140425085\" p3=\"0.032884232536689074\" siteName=\"LP9A\" type=\"localCoords\" wo1=\"1\" wo2=\"0\" wo3=\"0\" wx1=\"-1.0\" wx2=\"0.0\" wx3=\"1.0\" wy1=\"0\" wy2=\"-1\" wy3=\"1\" />\n <VirtualSite atomName1=\"O9\" atomName2=\"HO9\" atomName3=\"C9\" p1=\"-0.011970705016398403\" p2=\"0.0005739964140425085\" p3=\"-0.032884232536689074\" siteName=\"LP9B\" type=\"localCoords\" wo1=\"1\" wo2=\"0\" wo3=\"0\" wx1=\"-1.0\" wx2=\"0.0\" wx3=\"1.0\" wy1=\"0\" wy2=\"-1\" wy3=\"1\" />\n <AllowPatch name=\"ACE_2\" />\n- <AllowPatch name=\"CT2S_0\" />\n <AllowPatch name=\"CT3_0\" />\n </Residue>\n <Residue name=\"ETHA\">\n@@ -14583,7 +14531,6 @@\n <Bond atomName1=\"C\" atomName2=\"O\" />\n <VirtualSite atomName1=\"O\" atomName2=\"HA\" atomName3=\"C\" p1=\"-0.0005235721931185043\" p2=\"-0.029995430854691738\" p3=\"0\" siteName=\"LPA\" type=\"localCoords\" wo1=\"1\" wo2=\"0\" wo3=\"0\" wx1=\"-1.0\" wx2=\"0.0\" wx3=\"1.0\" wy1=\"0\" wy2=\"-1\" wy3=\"1\" />\n <VirtualSite atomName1=\"O\" atomName2=\"HA\" atomName3=\"C\" p1=\"-0.0005235721931185043\" p2=\"0.029995430854691738\" p3=\"0\" siteName=\"LPB\" type=\"localCoords\" wo1=\"1\" wo2=\"0\" wo3=\"0\" wx1=\"-1.0\" wx2=\"0.0\" wx3=\"1.0\" wy1=\"0\" wy2=\"-1\" wy3=\"1\" />\n- <AllowPatch name=\"CT2S_0\" />\n <AllowPatch name=\"CT3_0\" />\n </Residue>\n <Residue name=\"BALD\">\n@@ -14621,7 +14568,6 @@\n <Bond atomName1=\"C\" atomName2=\"O\" />\n <VirtualSite atomName1=\"O\" atomName2=\"HA\" atomName3=\"C\" p1=\"-0.0005235721931185043\" p2=\"-0.029995430854691738\" p3=\"0\" siteName=\"LPA\" type=\"localCoords\" wo1=\"1\" wo2=\"0\" wo3=\"0\" wx1=\"-1.0\" wx2=\"0.0\" wx3=\"1.0\" wy1=\"0\" wy2=\"-1\" wy3=\"1\" />\n <VirtualSite atomName1=\"O\" atomName2=\"HA\" atomName3=\"C\" p1=\"-0.0005235721931185043\" p2=\"0.029995430854691738\" p3=\"0\" siteName=\"LPB\" type=\"localCoords\" wo1=\"1\" wo2=\"0\" wo3=\"0\" wx1=\"-1.0\" wx2=\"0.0\" wx3=\"1.0\" wy1=\"0\" wy2=\"-1\" wy3=\"1\" />\n- <AllowPatch name=\"CT2S_0\" />\n <AllowPatch name=\"CT3_0\" />\n </Residue>\n <Residue name=\"IBLD\">\n@@ -14659,7 +14605,6 @@\n <Bond atomName1=\"C\" atomName2=\"O\" />\n <VirtualSite atomName1=\"O\" atomName2=\"HA\" atomName3=\"C\" p1=\"-0.0005235721931185043\" p2=\"-0.029995430854691738\" p3=\"0\" siteName=\"LPA\" type=\"localCoords\" wo1=\"1\" wo2=\"0\" wo3=\"0\" wx1=\"-1.0\" wx2=\"0.0\" wx3=\"1.0\" wy1=\"0\" wy2=\"-1\" wy3=\"1\" />\n <VirtualSite atomName1=\"O\" atomName2=\"HA\" atomName3=\"C\" p1=\"-0.0005235721931185043\" p2=\"0.029995430854691738\" p3=\"0\" siteName=\"LPB\" type=\"localCoords\" wo1=\"1\" wo2=\"0\" wo3=\"0\" wx1=\"-1.0\" wx2=\"0.0\" wx3=\"1.0\" wy1=\"0\" wy2=\"-1\" wy3=\"1\" />\n- <AllowPatch name=\"CT2S_0\" />\n <AllowPatch name=\"CT3_0\" />\n </Residue>\n <Residue name=\"ACO\">\n@@ -14747,7 +14692,6 @@\n <VirtualSite atomName1=\"O\" atomName2=\"HA\" atomName3=\"C\" p1=\"-0.0005235721931185043\" p2=\"-0.029995430854691738\" p3=\"0\" siteName=\"LPA\" type=\"localCoords\" wo1=\"1\" wo2=\"0\" wo3=\"0\" wx1=\"-1.0\" wx2=\"0.0\" wx3=\"1.0\" wy1=\"0\" wy2=\"-1\" wy3=\"1\" />\n <VirtualSite atomName1=\"O\" atomName2=\"HA\" atomName3=\"C\" p1=\"-0.0005235721931185043\" p2=\"0.029995430854691738\" p3=\"0\" siteName=\"LPB\" type=\"localCoords\" wo1=\"1\" wo2=\"0\" wo3=\"0\" wx1=\"-1.0\" wx2=\"0.0\" wx3=\"1.0\" wy1=\"0\" wy2=\"-1\" wy3=\"1\" />\n <AllowPatch name=\"ACE_1\" />\n- <AllowPatch name=\"CT2S_0\" />\n <AllowPatch name=\"CT3_0\" />\n </Residue>\n <Residue name=\"ACEM\">\n@@ -14777,7 +14721,6 @@\n <VirtualSite atomName1=\"O\" atomName2=\"CL\" atomName3=\"C\" p1=\"-0.0005235721931185043\" p2=\"-0.029995430854691738\" p3=\"0\" siteName=\"LPA\" type=\"localCoords\" wo1=\"1\" wo2=\"0\" wo3=\"0\" wx1=\"-1.0\" wx2=\"0.0\" wx3=\"1.0\" wy1=\"0\" wy2=\"-1\" wy3=\"1\" />\n <VirtualSite atomName1=\"O\" atomName2=\"CL\" atomName3=\"C\" p1=\"-0.0005235721931185043\" p2=\"0.029995430854691738\" p3=\"0\" siteName=\"LPB\" type=\"localCoords\" wo1=\"1\" wo2=\"0\" wo3=\"0\" wx1=\"-1.0\" wx2=\"0.0\" wx3=\"1.0\" wy1=\"0\" wy2=\"-1\" wy3=\"1\" />\n <AllowPatch name=\"ACE_1\" />\n- <AllowPatch name=\"CT2S_0\" />\n <AllowPatch name=\"CT3_0\" />\n </Residue>\n <Residue name=\"NMA\">\n@@ -14814,7 +14757,6 @@\n <VirtualSite atomName1=\"O\" atomName2=\"CL\" atomName3=\"C\" p1=\"-0.0005235721931185043\" p2=\"-0.029995430854691738\" p3=\"0\" siteName=\"LPA\" type=\"localCoords\" wo1=\"1\" wo2=\"0\" wo3=\"0\" wx1=\"-1.0\" wx2=\"0.0\" wx3=\"1.0\" wy1=\"0\" wy2=\"-1\" wy3=\"1\" />\n <VirtualSite atomName1=\"O\" atomName2=\"CL\" atomName3=\"C\" p1=\"-0.0005235721931185043\" p2=\"0.029995430854691738\" p3=\"0\" siteName=\"LPB\" type=\"localCoords\" wo1=\"1\" wo2=\"0\" wo3=\"0\" wx1=\"-1.0\" wx2=\"0.0\" wx3=\"1.0\" wy1=\"0\" wy2=\"-1\" wy3=\"1\" />\n <AllowPatch name=\"ACE_1\" />\n- <AllowPatch name=\"CT2S_0\" />\n <AllowPatch name=\"CT3_0\" />\n </Residue>\n <Residue name=\"NEA\">\n@@ -14858,7 +14800,6 @@\n <VirtualSite atomName1=\"O\" atomName2=\"CL\" atomName3=\"C\" p1=\"-0.0005235721931185043\" p2=\"-0.029995430854691738\" p3=\"0\" siteName=\"LPA\" type=\"localCoords\" wo1=\"1\" wo2=\"0\" wo3=\"0\" wx1=\"-1.0\" wx2=\"0.0\" wx3=\"1.0\" wy1=\"0\" wy2=\"-1\" wy3=\"1\" />\n <VirtualSite atomName1=\"O\" atomName2=\"CL\" atomName3=\"C\" p1=\"-0.0005235721931185043\" p2=\"0.029995430854691738\" p3=\"0\" siteName=\"LPB\" type=\"localCoords\" wo1=\"1\" wo2=\"0\" wo3=\"0\" wx1=\"-1.0\" wx2=\"0.0\" wx3=\"1.0\" wy1=\"0\" wy2=\"-1\" wy3=\"1\" />\n <AllowPatch name=\"ACE_1\" />\n- <AllowPatch name=\"CT2S_0\" />\n <AllowPatch name=\"CT3_0\" />\n </Residue>\n <Residue name=\"NPA\">\n@@ -14909,7 +14850,6 @@\n <VirtualSite atomName1=\"O\" atomName2=\"CL\" atomName3=\"C\" p1=\"-0.0005235721931185043\" p2=\"-0.029995430854691738\" p3=\"0\" siteName=\"LPA\" type=\"localCoords\" wo1=\"1\" wo2=\"0\" wo3=\"0\" wx1=\"-1.0\" wx2=\"0.0\" wx3=\"1.0\" wy1=\"0\" wy2=\"-1\" wy3=\"1\" />\n <VirtualSite atomName1=\"O\" atomName2=\"CL\" atomName3=\"C\" p1=\"-0.0005235721931185043\" p2=\"0.029995430854691738\" p3=\"0\" siteName=\"LPB\" type=\"localCoords\" wo1=\"1\" wo2=\"0\" wo3=\"0\" wx1=\"-1.0\" wx2=\"0.0\" wx3=\"1.0\" wy1=\"0\" wy2=\"-1\" wy3=\"1\" />\n <AllowPatch name=\"ACE_1\" />\n- <AllowPatch name=\"CT2S_0\" />\n <AllowPatch name=\"CT3_0\" />\n </Residue>\n <Residue name=\"DMA\">\n@@ -14953,7 +14893,6 @@\n <VirtualSite atomName1=\"O\" atomName2=\"CL\" atomName3=\"C\" p1=\"-0.0005235721931185043\" p2=\"-0.029995430854691738\" p3=\"0\" siteName=\"LPA\" type=\"localCoords\" wo1=\"1\" wo2=\"0\" wo3=\"0\" wx1=\"-1.0\" wx2=\"0.0\" wx3=\"1.0\" wy1=\"0\" wy2=\"-1\" wy3=\"1\" />\n <VirtualSite atomName1=\"O\" atomName2=\"CL\" atomName3=\"C\" p1=\"-0.0005235721931185043\" p2=\"0.029995430854691738\" p3=\"0\" siteName=\"LPB\" type=\"localCoords\" wo1=\"1\" wo2=\"0\" wo3=\"0\" wx1=\"-1.0\" wx2=\"0.0\" wx3=\"1.0\" wy1=\"0\" wy2=\"-1\" wy3=\"1\" />\n <AllowPatch name=\"ACE_1\" />\n- <AllowPatch name=\"CT2S_0\" />\n <AllowPatch name=\"CT3_0\" />\n </Residue>\n <Residue name=\"THF\">\n@@ -16218,7 +16157,6 @@\n <Bond atomName1=\"CD\" atomName2=\"HD2\" />\n <Bond atomName1=\"CD\" atomName2=\"N\" />\n <Bond atomName1=\"N\" atomName2=\"HN\" />\n- <AllowPatch name=\"GNTS_0\" />\n <AllowPatch name=\"ACE_1\" />\n </Residue>\n <Residue name=\"MEOH\">\n@@ -17427,7 +17365,6 @@\n <VirtualSite atomName1=\"O\" atomName2=\"C1\" atomName3=\"C\" p1=\"-0.0005235721931185043\" p2=\"0.029995430854691738\" p3=\"0\" siteName=\"LP1B\" type=\"localCoords\" wo1=\"1\" wo2=\"0\" wo3=\"0\" wx1=\"-1.0\" wx2=\"0.0\" wx3=\"1.0\" wy1=\"0\" wy2=\"-1\" wy3=\"1\" />\n <VirtualSite atomName1=\"OM\" atomName2=\"C2\" atomName3=\"C\" p1=\"-0.012485829976186883\" p2=\"0.0005706440663482743\" p3=\"0.03269217666591343\" siteName=\"LPMA\" type=\"localCoords\" wo1=\"1\" wo2=\"0\" wo3=\"0\" wx1=\"-1.0\" wx2=\"0.0\" wx3=\"1.0\" wy1=\"0\" wy2=\"-1\" wy3=\"1\" />\n <VirtualSite atomName1=\"OM\" atomName2=\"C2\" atomName3=\"C\" p1=\"-0.012485829976186883\" p2=\"0.0005706440663482743\" p3=\"-0.03269217666591343\" siteName=\"LPMB\" type=\"localCoords\" wo1=\"1\" wo2=\"0\" wo3=\"0\" wx1=\"-1.0\" wx2=\"0.0\" wx3=\"1.0\" wy1=\"0\" wy2=\"-1\" wy3=\"1\" />\n- <AllowPatch name=\"CT2S_0\" />\n <AllowPatch name=\"CT3_0\" />\n </Residue>\n <Residue name=\"EAS\">\n@@ -17472,7 +17409,6 @@\n <VirtualSite atomName1=\"O\" atomName2=\"C1\" atomName3=\"C\" p1=\"-0.0005235721931185043\" p2=\"0.029995430854691738\" p3=\"0\" siteName=\"LP1B\" type=\"localCoords\" wo1=\"1\" wo2=\"0\" wo3=\"0\" wx1=\"-1.0\" wx2=\"0.0\" wx3=\"1.0\" wy1=\"0\" wy2=\"-1\" wy3=\"1\" />\n <VirtualSite atomName1=\"OM\" atomName2=\"C2\" atomName3=\"C\" p1=\"-0.012485829976186883\" p2=\"0.0005706440663482743\" p3=\"0.03269217666591343\" siteName=\"LPMA\" type=\"localCoords\" wo1=\"1\" wo2=\"0\" wo3=\"0\" wx1=\"-1.0\" wx2=\"0.0\" wx3=\"1.0\" wy1=\"0\" wy2=\"-1\" wy3=\"1\" />\n <VirtualSite atomName1=\"OM\" atomName2=\"C2\" atomName3=\"C\" p1=\"-0.012485829976186883\" p2=\"0.0005706440663482743\" p3=\"-0.03269217666591343\" siteName=\"LPMB\" type=\"localCoords\" wo1=\"1\" wo2=\"0\" wo3=\"0\" wx1=\"-1.0\" wx2=\"0.0\" wx3=\"1.0\" wy1=\"0\" wy2=\"-1\" wy3=\"1\" />\n- <AllowPatch name=\"CT2S_0\" />\n <AllowPatch name=\"CT3_0\" />\n </Residue>\n <Residue name=\"MPRO\">\n@@ -17517,7 +17453,6 @@\n <VirtualSite atomName1=\"O\" atomName2=\"C1\" atomName3=\"C\" p1=\"-0.0005235721931185043\" p2=\"0.029995430854691738\" p3=\"0\" siteName=\"LP1B\" type=\"localCoords\" wo1=\"1\" wo2=\"0\" wo3=\"0\" wx1=\"-1.0\" wx2=\"0.0\" wx3=\"1.0\" wy1=\"0\" wy2=\"-1\" wy3=\"1\" />\n <VirtualSite atomName1=\"OM\" atomName2=\"C2\" atomName3=\"C\" p1=\"-0.012485829976186883\" p2=\"0.0005706440663482743\" p3=\"0.03269217666591343\" siteName=\"LPMA\" type=\"localCoords\" wo1=\"1\" wo2=\"0\" wo3=\"0\" wx1=\"-1.0\" wx2=\"0.0\" wx3=\"1.0\" wy1=\"0\" wy2=\"-1\" wy3=\"1\" />\n <VirtualSite atomName1=\"OM\" atomName2=\"C2\" atomName3=\"C\" p1=\"-0.012485829976186883\" p2=\"0.0005706440663482743\" p3=\"-0.03269217666591343\" siteName=\"LPMB\" type=\"localCoords\" wo1=\"1\" wo2=\"0\" wo3=\"0\" wx1=\"-1.0\" wx2=\"0.0\" wx3=\"1.0\" wy1=\"0\" wy2=\"-1\" wy3=\"1\" />\n- <AllowPatch name=\"CT2S_0\" />\n <AllowPatch name=\"CT3_0\" />\n </Residue>\n <Residue name=\"MBU\">\n@@ -17569,7 +17504,6 @@\n <VirtualSite atomName1=\"O\" atomName2=\"C1\" atomName3=\"C\" p1=\"-0.0005235721931185043\" p2=\"0.029995430854691738\" p3=\"0\" siteName=\"LP1B\" type=\"localCoords\" wo1=\"1\" wo2=\"0\" wo3=\"0\" wx1=\"-1.0\" wx2=\"0.0\" wx3=\"1.0\" wy1=\"0\" wy2=\"-1\" wy3=\"1\" />\n <VirtualSite atomName1=\"OM\" atomName2=\"C2\" atomName3=\"C\" p1=\"-0.012485829976186883\" p2=\"0.0005706440663482743\" p3=\"0.03269217666591343\" siteName=\"LPMA\" type=\"localCoords\" wo1=\"1\" wo2=\"0\" wo3=\"0\" wx1=\"-1.0\" wx2=\"0.0\" wx3=\"1.0\" wy1=\"0\" wy2=\"-1\" wy3=\"1\" />\n <VirtualSite atomName1=\"OM\" atomName2=\"C2\" atomName3=\"C\" p1=\"-0.012485829976186883\" p2=\"0.0005706440663482743\" p3=\"-0.03269217666591343\" siteName=\"LPMB\" type=\"localCoords\" wo1=\"1\" wo2=\"0\" wo3=\"0\" wx1=\"-1.0\" wx2=\"0.0\" wx3=\"1.0\" wy1=\"0\" wy2=\"-1\" wy3=\"1\" />\n- <AllowPatch name=\"CT2S_0\" />\n <AllowPatch name=\"CT3_0\" />\n </Residue>\n <Residue name=\"FETH\">\n@@ -17890,7 +17824,6 @@\n <Bond atomName1=\"C\" atomName2=\"H1\" />\n <Bond atomName1=\"C\" atomName2=\"H2\" />\n <Bond atomName1=\"C\" atomName2=\"H3\" />\n- <AllowPatch name=\"CT2S_0\" />\n <AllowPatch name=\"CT3_0\" />\n </Residue>\n <Residue name=\"ETO\">\n@@ -21560,39 +21493,6 @@\n <RemoveBond atomName1=\"HN\" atomName2=\"N\" />\n <RemoveExternalBond atomName=\"N\" />\n </Patch>\n- <Patch name=\"GNTS_0\">\n- <AddAtom charge=\"0.34\" name=\"HT1\" type=\"GNTS-HT1\" />\n- <AddAtom charge=\"0.34\" name=\"HT2\" type=\"GNTS-HT2\" />\n- <AddAtom charge=\"0.34\" name=\"HT3\" type=\"GNTS-HT3\" />\n- <AddBond atomName1=\"HT1\" atomName2=\"N\" />\n- <AddBond atomName1=\"HT2\" atomName2=\"N\" />\n- <AddBond atomName1=\"HT3\" atomName2=\"N\" />\n- <ChangeAtom charge=\"2.276158038387988\" name=\"CA\" type=\"GNTS-CA\" />\n- <ChangeAtom charge=\"-2.233158038387988\" name=\"DCA\" type=\"Drude-GNTS-CA\" />\n- <ChangeAtom charge=\"-1.9770909072094385\" name=\"DN\" type=\"Drude-GNTS-N\" />\n- <ChangeAtom charge=\"0.143\" name=\"HA1\" type=\"GNTS-HA1\" />\n- <ChangeAtom charge=\"0.143\" name=\"HA2\" type=\"GNTS-HA2\" />\n- <ChangeAtom charge=\"1.6280909072094385\" name=\"N\" type=\"GNTS-N\" />\n- <RemoveAtom name=\"HN\" />\n- <RemoveBond atomName1=\"HN\" atomName2=\"N\" />\n- </Patch>\n- <Patch name=\"GNTS_1\">\n- <AddAtom charge=\"0.34\" name=\"HT1\" type=\"GNTS-HT1\" />\n- <AddAtom charge=\"0.34\" name=\"HT2\" type=\"GNTS-HT2\" />\n- <AddAtom charge=\"0.34\" name=\"HT3\" type=\"GNTS-HT3\" />\n- <AddBond atomName1=\"HT1\" atomName2=\"N\" />\n- <AddBond atomName1=\"HT2\" atomName2=\"N\" />\n- <AddBond atomName1=\"HT3\" atomName2=\"N\" />\n- <ChangeAtom charge=\"2.276158038387988\" name=\"CA\" type=\"GNTS-CA\" />\n- <ChangeAtom charge=\"-2.233158038387988\" name=\"DCA\" type=\"Drude-GNTS-CA\" />\n- <ChangeAtom charge=\"-1.9770909072094385\" name=\"DN\" type=\"Drude-GNTS-N\" />\n- <ChangeAtom charge=\"0.143\" name=\"HA1\" type=\"GNTS-HA1\" />\n- <ChangeAtom charge=\"0.143\" name=\"HA2\" type=\"GNTS-HA2\" />\n- <ChangeAtom charge=\"1.6280909072094385\" name=\"N\" type=\"GNTS-N\" />\n- <RemoveAtom name=\"HN\" />\n- <RemoveBond atomName1=\"HN\" atomName2=\"N\" />\n- <RemoveExternalBond atomName=\"N\" />\n- </Patch>\n <Patch name=\"PROP_0\">\n <AddAtom charge=\"0.266\" name=\"HT1\" type=\"PROP-HT1\" />\n <AddAtom charge=\"0.266\" name=\"HT2\" type=\"PROP-HT2\" />\n@@ -21978,57 +21878,6 @@\n <VirtualSite atomName1=\"OT2\" atomName2=\"HT\" atomName3=\"C\" p1=\"-0.012485829976186883\" p2=\"0.0005706440663482743\" p3=\"0.03269217666591343\" siteName=\"LPT3\" type=\"localCoords\" wo1=\"1\" wo2=\"0\" wo3=\"0\" wx1=\"-1.0\" wx2=\"0.0\" wx3=\"1.0\" wy1=\"0\" wy2=\"-1\" wy3=\"1\" />\n <VirtualSite atomName1=\"OT2\" atomName2=\"HT\" atomName3=\"C\" p1=\"-0.012485829976186883\" p2=\"0.0005706440663482743\" p3=\"-0.03269217666591343\" siteName=\"LPT4\" type=\"localCoords\" wo1=\"1\" wo2=\"0\" wo3=\"0\" wx1=\"-1.0\" wx2=\"0.0\" wx3=\"1.0\" wy1=\"0\" wy2=\"-1\" wy3=\"1\" />\n </Patch>\n- <Patch name=\"CNES_0\">\n- <AddAtom charge=\"-1.6663059805572336\" name=\"DOT1\" type=\"Drude-CNES-OT1\" />\n- <AddAtom charge=\"-1.963334406026505\" name=\"DOT2\" type=\"Drude-CNES-OT2\" />\n- <AddAtom charge=\"0.374\" name=\"HT\" type=\"CNES-HT\" />\n- <AddAtom charge=\"-0.319\" name=\"LPT1\" type=\"CNES-LPT1\" />\n- <AddAtom charge=\"-0.319\" name=\"LPT2\" type=\"CNES-LPT2\" />\n- <AddAtom charge=\"-0.285\" name=\"LPT3\" type=\"CNES-LPT3\" />\n- <AddAtom charge=\"-0.285\" name=\"LPT4\" type=\"CNES-LPT4\" />\n- <AddAtom charge=\"1.6663059805572336\" name=\"OT1\" type=\"CNES-OT1\" />\n- <AddAtom charge=\"1.963334406026505\" name=\"OT2\" type=\"CNES-OT2\" />\n- <AddBond atomName1=\"C\" atomName2=\"OT1\" />\n- <AddBond atomName1=\"C\" atomName2=\"OT2\" />\n- <AddBond atomName1=\"HT\" atomName2=\"OT2\" />\n- <ChangeAtom charge=\"2.7405268573119237\" name=\"C\" type=\"CNES-C\" />\n- <ChangeAtom charge=\"-1.9065268573119238\" name=\"DC\" type=\"Drude-CNES-C\" />\n- <RemoveAtom name=\"DO\" />\n- <RemoveAtom name=\"LPOA\" />\n- <RemoveAtom name=\"LPOB\" />\n- <RemoveAtom name=\"O\" />\n- <RemoveBond atomName1=\"C\" atomName2=\"O\" />\n- <RemoveExternalBond atomName=\"C\" />\n- <VirtualSite atomName1=\"OT1\" atomName2=\"OT2\" atomName3=\"C\" p1=\"-0.0005235721931185043\" p2=\"-0.029995430854691738\" p3=\"0\" siteName=\"LPT1\" type=\"localCoords\" wo1=\"1\" wo2=\"0\" wo3=\"0\" wx1=\"-1.0\" wx2=\"0.0\" wx3=\"1.0\" wy1=\"0\" wy2=\"-1\" wy3=\"1\" />\n- <VirtualSite atomName1=\"OT1\" atomName2=\"OT2\" atomName3=\"C\" p1=\"-0.0005235721931185043\" p2=\"0.029995430854691738\" p3=\"0\" siteName=\"LPT2\" type=\"localCoords\" wo1=\"1\" wo2=\"0\" wo3=\"0\" wx1=\"-1.0\" wx2=\"0.0\" wx3=\"1.0\" wy1=\"0\" wy2=\"-1\" wy3=\"1\" />\n- <VirtualSite atomName1=\"OT2\" atomName2=\"HT\" atomName3=\"C\" p1=\"-0.012485829976186883\" p2=\"0.0005706440663482743\" p3=\"0.03269217666591343\" siteName=\"LPT3\" type=\"localCoords\" wo1=\"1\" wo2=\"0\" wo3=\"0\" wx1=\"-1.0\" wx2=\"0.0\" wx3=\"1.0\" wy1=\"0\" wy2=\"-1\" wy3=\"1\" />\n- <VirtualSite atomName1=\"OT2\" atomName2=\"HT\" atomName3=\"C\" p1=\"-0.012485829976186883\" p2=\"0.0005706440663482743\" p3=\"-0.03269217666591343\" siteName=\"LPT4\" type=\"localCoords\" wo1=\"1\" wo2=\"0\" wo3=\"0\" wx1=\"-1.0\" wx2=\"0.0\" wx3=\"1.0\" wy1=\"0\" wy2=\"-1\" wy3=\"1\" />\n- </Patch>\n- <Patch name=\"CNES_1\">\n- <AddAtom charge=\"-1.6663059805572336\" name=\"DOT1\" type=\"Drude-CNES-OT1\" />\n- <AddAtom charge=\"-1.963334406026505\" name=\"DOT2\" type=\"Drude-CNES-OT2\" />\n- <AddAtom charge=\"0.374\" name=\"HT\" type=\"CNES-HT\" />\n- <AddAtom charge=\"-0.319\" name=\"LPT1\" type=\"CNES-LPT1\" />\n- <AddAtom charge=\"-0.319\" name=\"LPT2\" type=\"CNES-LPT2\" />\n- <AddAtom charge=\"-0.285\" name=\"LPT3\" type=\"CNES-LPT3\" />\n- <AddAtom charge=\"-0.285\" name=\"LPT4\" type=\"CNES-LPT4\" />\n- <AddAtom charge=\"1.6663059805572336\" name=\"OT1\" type=\"CNES-OT1\" />\n- <AddAtom charge=\"1.963334406026505\" name=\"OT2\" type=\"CNES-OT2\" />\n- <AddBond atomName1=\"C\" atomName2=\"OT1\" />\n- <AddBond atomName1=\"C\" atomName2=\"OT2\" />\n- <AddBond atomName1=\"HT\" atomName2=\"OT2\" />\n- <ChangeAtom charge=\"2.7405268573119237\" name=\"C\" type=\"CNES-C\" />\n- <ChangeAtom charge=\"-1.9065268573119238\" name=\"DC\" type=\"Drude-CNES-C\" />\n- <RemoveAtom name=\"DO\" />\n- <RemoveAtom name=\"LPOA\" />\n- <RemoveAtom name=\"LPOB\" />\n- <RemoveAtom name=\"O\" />\n- <RemoveBond atomName1=\"C\" atomName2=\"O\" />\n- <VirtualSite atomName1=\"OT1\" atomName2=\"OT2\" atomName3=\"C\" p1=\"-0.0005235721931185043\" p2=\"-0.029995430854691738\" p3=\"0\" siteName=\"LPT1\" type=\"localCoords\" wo1=\"1\" wo2=\"0\" wo3=\"0\" wx1=\"-1.0\" wx2=\"0.0\" wx3=\"1.0\" wy1=\"0\" wy2=\"-1\" wy3=\"1\" />\n- <VirtualSite atomName1=\"OT1\" atomName2=\"OT2\" atomName3=\"C\" p1=\"-0.0005235721931185043\" p2=\"0.029995430854691738\" p3=\"0\" siteName=\"LPT2\" type=\"localCoords\" wo1=\"1\" wo2=\"0\" wo3=\"0\" wx1=\"-1.0\" wx2=\"0.0\" wx3=\"1.0\" wy1=\"0\" wy2=\"-1\" wy3=\"1\" />\n- <VirtualSite atomName1=\"OT2\" atomName2=\"HT\" atomName3=\"C\" p1=\"-0.012485829976186883\" p2=\"0.0005706440663482743\" p3=\"0.03269217666591343\" siteName=\"LPT3\" type=\"localCoords\" wo1=\"1\" wo2=\"0\" wo3=\"0\" wx1=\"-1.0\" wx2=\"0.0\" wx3=\"1.0\" wy1=\"0\" wy2=\"-1\" wy3=\"1\" />\n- <VirtualSite atomName1=\"OT2\" atomName2=\"HT\" atomName3=\"C\" p1=\"-0.012485829976186883\" p2=\"0.0005706440663482743\" p3=\"-0.03269217666591343\" siteName=\"LPT4\" type=\"localCoords\" wo1=\"1\" wo2=\"0\" wo3=\"0\" wx1=\"-1.0\" wx2=\"0.0\" wx3=\"1.0\" wy1=\"0\" wy2=\"-1\" wy3=\"1\" />\n- </Patch>\n <Patch name=\"CT1_0\">\n <AddAtom charge=\"2.2962872001035097\" name=\"CT\" type=\"CT1-CT\" />\n <AddAtom charge=\"-2.3262872001035095\" name=\"DCT\" type=\"Drude-CT1-CT\" />\n@@ -22211,51 +22060,6 @@\n <ChangeAtom charge=\"1.6675290868987966\" name=\"O\" type=\"CT2G-O\" />\n <RemoveExternalBond atomName=\"C\" />\n </Patch>\n- <Patch name=\"CT2S_0\">\n- <AddAtom charge=\"-2.2739161182852508\" name=\"DNT\" type=\"Drude-CT2S-NT\" />\n- <AddAtom charge=\"0.303\" name=\"HTC1\" type=\"CT2S-HTC1\" />\n- <AddAtom charge=\"0.351\" name=\"HTC2\" type=\"CT2S-HTC2\" />\n- <AddAtom charge=\"-0.411\" name=\"LPOA\" type=\"CT2S-LPOA\" />\n- <AddAtom charge=\"-0.264\" name=\"LPOB\" type=\"CT2S-LPOB\" />\n- <AddAtom charge=\"1.4919161182852507\" name=\"NT\" type=\"CT2S-NT\" />\n- <AddBond atomName1=\"C\" atomName2=\"NT\" />\n- <AddBond atomName1=\"HTC1\" atomName2=\"NT\" />\n- <AddBond atomName1=\"HTC2\" atomName2=\"NT\" />\n- <ChangeAtom charge=\"2.951382122346228\" name=\"C\" type=\"CT2S-C\" />\n- <ChangeAtom charge=\"-2.1833821223462277\" name=\"DC\" type=\"Drude-CT2S-C\" />\n- <ChangeAtom charge=\"-1.6325290868987967\" name=\"DO\" type=\"Drude-CT2S-O\" />\n- <ChangeAtom charge=\"1.6675290868987966\" name=\"O\" type=\"CT2S-O\" />\n- </Patch>\n- <Patch name=\"CT2S_1\">\n- <AddAtom charge=\"-2.2739161182852508\" name=\"DNT\" type=\"Drude-CT2S-NT\" />\n- <AddAtom charge=\"0.303\" name=\"HTC1\" type=\"CT2S-HTC1\" />\n- <AddAtom charge=\"0.351\" name=\"HTC2\" type=\"CT2S-HTC2\" />\n- <AddAtom charge=\"1.4919161182852507\" name=\"NT\" type=\"CT2S-NT\" />\n- <AddBond atomName1=\"C\" atomName2=\"NT\" />\n- <AddBond atomName1=\"HTC1\" atomName2=\"NT\" />\n- <AddBond atomName1=\"HTC2\" atomName2=\"NT\" />\n- <ChangeAtom charge=\"2.951382122346228\" name=\"C\" type=\"CT2S-C\" />\n- <ChangeAtom charge=\"-2.1833821223462277\" name=\"DC\" type=\"Drude-CT2S-C\" />\n- <ChangeAtom charge=\"-1.6325290868987967\" name=\"DO\" type=\"Drude-CT2S-O\" />\n- <ChangeAtom charge=\"-0.411\" name=\"LPOA\" type=\"CT2S-LPOA\" />\n- <ChangeAtom charge=\"-0.264\" name=\"LPOB\" type=\"CT2S-LPOB\" />\n- <ChangeAtom charge=\"1.6675290868987966\" name=\"O\" type=\"CT2S-O\" />\n- <RemoveExternalBond atomName=\"C\" />\n- </Patch>\n- <Patch name=\"CT2S_2\">\n- <AddBond atomName1=\"HTC1\" atomName2=\"NT\" />\n- <AddBond atomName1=\"HTC2\" atomName2=\"NT\" />\n- <ChangeAtom charge=\"2.951382122346228\" name=\"C\" type=\"CT2S-C\" />\n- <ChangeAtom charge=\"-2.1833821223462277\" name=\"DC\" type=\"Drude-CT2S-C\" />\n- <ChangeAtom charge=\"-2.2739161182852508\" name=\"DNT\" type=\"Drude-CT2S-NT\" />\n- <ChangeAtom charge=\"-1.6325290868987967\" name=\"DO\" type=\"Drude-CT2S-O\" />\n- <ChangeAtom charge=\"0.303\" name=\"HTC1\" type=\"CT2S-HTC1\" />\n- <ChangeAtom charge=\"0.351\" name=\"HTC2\" type=\"CT2S-HTC2\" />\n- <ChangeAtom charge=\"-0.411\" name=\"LPOA\" type=\"CT2S-LPOA\" />\n- <ChangeAtom charge=\"-0.264\" name=\"LPOB\" type=\"CT2S-LPOB\" />\n- <ChangeAtom charge=\"1.4919161182852507\" name=\"NT\" type=\"CT2S-NT\" />\n- <ChangeAtom charge=\"1.6675290868987966\" name=\"O\" type=\"CT2S-O\" />\n- </Patch>\n <Patch name=\"CT3_0\">\n <AddAtom charge=\"2.166666003079377\" name=\"CAT\" type=\"CT3-CAT\" />\n <AddAtom charge=\"-2.221666003079377\" name=\"DCAT\" type=\"Drude-CT3-CAT\" />\n@@ -30342,8 +30146,6 @@\n <Particle charge=\"-2.233158038387988\" polarizability=\"0.0016560000000000004\" thole=\"0.895\" type1=\"Drude-GNTE-CA\" type2=\"GNTE-CA\" />\n <Particle charge=\"-1.3653205186135353\" polarizability=\"0.0006190000000000002\" thole=\"0.317\" type1=\"Drude-GNTE-C\" type2=\"GNTE-C\" />\n <Particle charge=\"-1.3204701080914898\" polarizability=\"0.0005790000000000001\" thole=\"0.37\" type1=\"Drude-GNTE-O\" type2=\"GNTE-O\" />\n- <Particle charge=\"-1.9770909072094385\" polarizability=\"0.0012980000000000003\" thole=\"0.895\" type1=\"Drude-GNTS-N\" type2=\"GNTS-N\" />\n- <Particle charge=\"-2.233158038387988\" polarizability=\"0.0016560000000000004\" thole=\"0.895\" type1=\"Drude-GNTS-CA\" type2=\"GNTS-CA\" />\n <Particle charge=\"-2.1104417974686633\" polarizability=\"0.0014790000000000005\" thole=\"0.111\" type1=\"Drude-PROP-N\" type2=\"PROP-N\" />\n <Particle charge=\"-2.179931223836688\" polarizability=\"0.0015780000000000004\" thole=\"1.429\" type1=\"Drude-PROP-CD\" type2=\"PROP-CD\" />\n <Particle charge=\"-2.179931223836688\" polarizability=\"0.0015780000000000004\" thole=\"1.429\" type1=\"Drude-PROP-CA\" type2=\"PROP-CA\" />\n@@ -30390,9 +30192,6 @@\n <Particle charge=\"-1.9065268573119238\" polarizability=\"0.0012070000000000004\" thole=\"0.708\" type1=\"Drude-CNEG-C\" type2=\"CNEG-C\" />\n <Particle charge=\"-1.6663059805572336\" polarizability=\"0.0009220000000000003\" thole=\"1.539\" type1=\"Drude-CNEG-OT1\" type2=\"CNEG-OT1\" />\n <Particle charge=\"-1.963334406026505\" polarizability=\"0.0012800000000000003\" thole=\"1.124\" type1=\"Drude-CNEG-OT2\" type2=\"CNEG-OT2\" />\n- <Particle charge=\"-1.9065268573119238\" polarizability=\"0.0012070000000000004\" thole=\"0.708\" type1=\"Drude-CNES-C\" type2=\"CNES-C\" />\n- <Particle charge=\"-1.6663059805572336\" polarizability=\"0.0009220000000000003\" thole=\"1.539\" type1=\"Drude-CNES-OT1\" type2=\"CNES-OT1\" />\n- <Particle charge=\"-1.963334406026505\" polarizability=\"0.0012800000000000003\" thole=\"1.124\" type1=\"Drude-CNES-OT2\" type2=\"CNES-OT2\" />\n <Particle charge=\"-2.4183207668819215\" polarizability=\"0.0019420000000000004\" thole=\"0.25\" type1=\"Drude-CT1-N\" type2=\"CT1-N\" />\n <Particle charge=\"-1.700297471742985\" polarizability=\"0.0009600000000000002\" thole=\"1.078\" type1=\"Drude-CT1-CA\" type2=\"CT1-CA\" />\n <Particle charge=\"-2.031185446309965\" polarizability=\"0.0013700000000000003\" thole=\"1.747\" type1=\"Drude-CT1-C\" type2=\"CT1-C\" />\n@@ -30415,9 +30214,6 @@\n <Particle charge=\"-2.1833821223462277\" polarizability=\"0.0015830000000000004\" thole=\"1.095\" type1=\"Drude-CT2G-C\" type2=\"CT2G-C\" />\n <Particle charge=\"-1.6325290868987967\" polarizability=\"0.0008850000000000003\" thole=\"1.227\" type1=\"Drude-CT2G-O\" type2=\"CT2G-O\" />\n <Particle charge=\"-2.2739161182852508\" polarizability=\"0.0017170000000000004\" thole=\"1.132\" type1=\"Drude-CT2G-NT\" type2=\"CT2G-NT\" />\n- <Particle charge=\"-2.1833821223462277\" polarizability=\"0.0015830000000000004\" thole=\"1.095\" type1=\"Drude-CT2S-C\" type2=\"CT2S-C\" />\n- <Particle charge=\"-1.6325290868987967\" polarizability=\"0.0008850000000000003\" thole=\"1.227\" type1=\"Drude-CT2S-O\" type2=\"CT2S-O\" />\n- <Particle charge=\"-2.2739161182852508\" polarizability=\"0.0017170000000000004\" thole=\"1.132\" type1=\"Drude-CT2S-NT\" type2=\"CT2S-NT\" />\n <Particle charge=\"-2.4183207668819215\" polarizability=\"0.0019420000000000004\" thole=\"0.25\" type1=\"Drude-CT3-NT\" type2=\"CT3-NT\" />\n <Particle charge=\"-2.221666003079377\" polarizability=\"0.0016390000000000005\" thole=\"2.122\" type1=\"Drude-CT3-CAT\" type2=\"CT3-CAT\" />\n <Particle charge=\"-2.5231425294508214\" polarizability=\"0.0021140000000000004\" thole=\"0.75\" type1=\"Drude-ASPP-CB\" type2=\"ASPP-CB\" />\n@@ -30447,6 +30243,8 @@\n <Particle charge=\"-1.3204701080914898\" polarizability=\"0.0005790000000000001\" thole=\"0.37\" type1=\"Drude-DNTER-O\" type2=\"DNTER-O\" />\n <Particle charge=\"-1.9770909072094385\" polarizability=\"0.0012980000000000003\" thole=\"0.895\" type1=\"Drude-DNTES-N\" type2=\"DNTES-N\" />\n <Particle charge=\"-2.233158038387988\" polarizability=\"0.0016560000000000004\" thole=\"0.895\" type1=\"Drude-DNTES-CA\" type2=\"DNTES-CA\" />\n+ <Particle charge=\"-1.9770909072094385\" polarizability=\"0.0012980000000000003\" thole=\"0.895\" type1=\"Drude-DGNTS-N\" type2=\"DGNTS-N\" />\n+ <Particle charge=\"-2.233158038387988\" polarizability=\"0.0016560000000000004\" thole=\"0.895\" type1=\"Drude-DGNTS-CA\" type2=\"DGNTS-CA\" />\n <Particle charge=\"-2.1104417974686633\" polarizability=\"0.0014790000000000005\" thole=\"0.111\" type1=\"Drude-DPROP-N\" type2=\"DPROP-N\" />\n <Particle charge=\"-2.179931223836688\" polarizability=\"0.0015780000000000004\" thole=\"1.429\" type1=\"Drude-DPROP-CD\" type2=\"DPROP-CD\" />\n <Particle charge=\"-2.179931223836688\" polarizability=\"0.0015780000000000004\" thole=\"1.429\" type1=\"Drude-DPROP-CA\" type2=\"DPROP-CA\" />\n@@ -30479,6 +30277,9 @@\n <Particle charge=\"-1.9065268573119238\" polarizability=\"0.0012070000000000004\" thole=\"0.708\" type1=\"Drude-DCNEU-C\" type2=\"DCNEU-C\" />\n <Particle charge=\"-1.6663059805572336\" polarizability=\"0.0009220000000000003\" thole=\"1.539\" type1=\"Drude-DCNEU-OT1\" type2=\"DCNEU-OT1\" />\n <Particle charge=\"-1.963334406026505\" polarizability=\"0.0012800000000000003\" thole=\"1.124\" type1=\"Drude-DCNEU-OT2\" type2=\"DCNEU-OT2\" />\n+ <Particle charge=\"-1.9065268573119238\" polarizability=\"0.0012070000000000004\" thole=\"0.708\" type1=\"Drude-DCNES-C\" type2=\"DCNES-C\" />\n+ <Particle charge=\"-1.6663059805572336\" polarizability=\"0.0009220000000000003\" thole=\"1.539\" type1=\"Drude-DCNES-OT1\" type2=\"DCNES-OT1\" />\n+ <Particle charge=\"-1.963334406026505\" polarizability=\"0.0012800000000000003\" thole=\"1.124\" type1=\"Drude-DCNES-OT2\" type2=\"DCNES-OT2\" />\n <Particle charge=\"-2.4183207668819215\" polarizability=\"0.0019420000000000004\" thole=\"0.25\" type1=\"Drude-DCT1-N\" type2=\"DCT1-N\" />\n <Particle charge=\"-1.700297471742985\" polarizability=\"0.0009600000000000002\" thole=\"1.078\" type1=\"Drude-DCT1-CA\" type2=\"DCT1-CA\" />\n <Particle charge=\"-2.031185446309965\" polarizability=\"0.0013700000000000003\" thole=\"1.747\" type1=\"Drude-DCT1-C\" type2=\"DCT1-C\" />\n@@ -30490,6 +30291,9 @@\n <Particle charge=\"-2.1833821223462277\" polarizability=\"0.0015830000000000004\" thole=\"1.095\" type1=\"Drude-DCT2-C\" type2=\"DCT2-C\" />\n <Particle charge=\"-1.6325290868987967\" polarizability=\"0.0008850000000000003\" thole=\"1.227\" type1=\"Drude-DCT2-O\" type2=\"DCT2-O\" />\n <Particle charge=\"-2.2739161182852508\" polarizability=\"0.0017170000000000004\" thole=\"1.132\" type1=\"Drude-DCT2-NT\" type2=\"DCT2-NT\" />\n+ <Particle charge=\"-2.1833821223462277\" polarizability=\"0.0015830000000000004\" thole=\"1.095\" type1=\"Drude-DCT2S-C\" type2=\"DCT2S-C\" />\n+ <Particle charge=\"-1.6325290868987967\" polarizability=\"0.0008850000000000003\" thole=\"1.227\" type1=\"Drude-DCT2S-O\" type2=\"DCT2S-O\" />\n+ <Particle charge=\"-2.2739161182852508\" polarizability=\"0.0017170000000000004\" thole=\"1.132\" type1=\"Drude-DCT2S-NT\" type2=\"DCT2S-NT\" />\n <Particle charge=\"-1.233204161452102\" polarizability=\"0.0005050000000000001\" thole=\"0.907\" type1=\"Drude-OMEA-O5\" type2=\"OMEA-O5\" />\n <Particle charge=\"-1.7353588402977551\" polarizability=\"0.0010000000000000002\" thole=\"0.487\" type1=\"Drude-OMEA-C1\" type2=\"OMEA-C1\" />\n <Particle charge=\"-1.230759750403621\" polarizability=\"0.0005030000000000001\" thole=\"0.443\" type1=\"Drude-OMEA-O1\" type2=\"OMEA-O1\" />\n@@ -30510,15 +30314,556 @@\n import math\n import openmm\n \n-residue_impropers = {'ALAD': (((0, 'CY'), (0, 'CAY'), (0, 'N'), (0, 'OY')), ((0, 'N'), (0, 'CY'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (0, 'NT'), (0, 'O')), ((0, 'NT'), (0, 'C'), (0, 'CAT'), (0, 'HNT'))), 'ALA': (((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN'))), 'ARG': (((0, 'CZ'), (0, 'NH1'), (0, 'NH2'), (0, 'NE')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN'))), 'ASN': (((0, 'CG'), (0, 'CB'), (0, 'ND2'), (0, 'OD1')), ((0, 'ND2'), (0, 'HD21'), (0, 'HD22'), (0, 'CG')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN'))), 'ASP': (((0, 'OD1'), (0, 'CB'), (0, 'OD2'), (0, 'CG')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN'))), 'CYS': (((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN'))), 'GLN': (((0, 'CD'), (0, 'CG'), (0, 'NE2'), (0, 'OE1')), ((0, 'NE2'), (0, 'HE21'), (0, 'HE22'), (0, 'CD')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN'))), 'GLU': (((0, 'OE1'), (0, 'CG'), (0, 'OE2'), (0, 'CD')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN'))), 'GLY': (((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN'))), 'HSD': (((0, 'ND1'), (0, 'CG'), (0, 'CE1'), (0, 'HD1')), ((0, 'CD2'), (0, 'CG'), (0, 'NE2'), (0, 'HD2')), ((0, 'CE1'), (0, 'ND1'), (0, 'NE2'), (0, 'HE1')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN'))), 'HSE': (((0, 'NE2'), (0, 'CD2'), (0, 'CE1'), (0, 'HE2')), ((0, 'CD2'), (0, 'CG'), (0, 'NE2'), (0, 'HD2')), ((0, 'CE1'), (0, 'ND1'), (0, 'NE2'), (0, 'HE1')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN'))), 'HSP': (((0, 'ND1'), (0, 'CE1'), (0, 'CG'), (0, 'HD1')), ((0, 'NE2'), (0, 'CE1'), (0, 'CD2'), (0, 'HE2')), ((0, 'CE1'), (0, 'ND1'), (0, 'NE2'), (0, 'HE1')), ((0, 'CD2'), (0, 'CG'), (0, 'NE2'), (0, 'HD2')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN'))), 'ILE': (((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN'))), 'LEU': (((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN'))), 'LYS': (((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN'))), 'MET': (((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN'))), 'PHE': (((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN'))), 'PRO': (((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'CD'))), 'SER': (((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN'))), 'THR': (((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN'))), 'TRP': (((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN'))), 'TYR': (((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN'))), 'VAL': (((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN'))), 'ALDD': (((0, 'CY'), (0, 'CAY'), (0, 'N'), (0, 'OY')), ((0, 'N'), (0, 'CY'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (0, 'NT'), (0, 'O')), ((0, 'NT'), (0, 'C'), (0, 'CAT'), (0, 'HNT'))), 'DALA': (((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN'))), 'DARG': (((0, 'CZ'), (0, 'NH1'), (0, 'NH2'), (0, 'NE')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN'))), 'DASN': (((0, 'CG'), (0, 'CB'), (0, 'ND2'), (0, 'OD1')), ((0, 'ND2'), (0, 'HD21'), (0, 'HD22'), (0, 'CG')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN'))), 'DASP': (((0, 'OD1'), (0, 'CB'), (0, 'OD2'), (0, 'CG')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN'))), 'DCYS': (((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN'))), 'DGLN': (((0, 'CD'), (0, 'CG'), (0, 'NE2'), (0, 'OE1')), ((0, 'NE2'), (0, 'HE21'), (0, 'HE22'), (0, 'CD')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN'))), 'DGLU': (((0, 'OE1'), (0, 'CG'), (0, 'OE2'), (0, 'CD')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN'))), 'DGLY': (((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN'))), 'DHSD': (((0, 'ND1'), (0, 'CG'), (0, 'CE1'), (0, 'HD1')), ((0, 'CD2'), (0, 'CG'), (0, 'NE2'), (0, 'HD2')), ((0, 'CE1'), (0, 'ND1'), (0, 'NE2'), (0, 'HE1')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN'))), 'DHSE': (((0, 'NE2'), (0, 'CD2'), (0, 'CE1'), (0, 'HE2')), ((0, 'CD2'), (0, 'CG'), (0, 'NE2'), (0, 'HD2')), ((0, 'CE1'), (0, 'ND1'), (0, 'NE2'), (0, 'HE1')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN'))), 'DHSP': (((0, 'ND1'), (0, 'CE1'), (0, 'CG'), (0, 'HD1')), ((0, 'NE2'), (0, 'CE1'), (0, 'CD2'), (0, 'HE2')), ((0, 'CE1'), (0, 'ND1'), (0, 'NE2'), (0, 'HE1')), ((0, 'CD2'), (0, 'CG'), (0, 'NE2'), (0, 'HD2')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN'))), 'DILE': (((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN'))), 'DLEU': (((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN'))), 'DLYS': (((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN'))), 'DMET': (((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN'))), 'DPHE': (((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN'))), 'DPRO': (((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'CD'))), 'DSER': (((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN'))), 'DTHR': (((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN'))), 'DTRP': (((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN'))), 'DTYR': (((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN'))), 'DVAL': (((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN'))), 'ALLO': (((0, 'C1'), (0, 'H1'), (0, 'C2'), (0, 'O1')),), 'PSIC': (((0, 'C2'), (0, 'C1'), (0, 'C3'), (0, 'O2')),), 'AGALA': (((0, 'C6'), (0, 'C5'), (0, 'O62'), (0, 'O61')),), 'BGALA': (((0, 'C6'), (0, 'C5'), (0, 'O62'), (0, 'O61')),), 'AGLCA': (((0, 'C6'), (0, 'C5'), (0, 'O62'), (0, 'O61')),), 'BGLCA': (((0, 'C6'), (0, 'C5'), (0, 'O62'), (0, 'O61')),), 'AIDOA': (((0, 'C6'), (0, 'C5'), (0, 'O62'), (0, 'O61')),), 'BIDOA': (((0, 'C6'), (0, 'C5'), (0, 'O62'), (0, 'O61')),), 'AGLCNA': (((0, 'C'), (0, 'CT'), (0, 'N'), (0, 'O')), ((0, 'N'), (0, 'C'), (0, 'C2'), (0, 'HN'))), 'BGLCNA': (((0, 'C'), (0, 'CT'), (0, 'N'), (0, 'O')), ((0, 'N'), (0, 'C'), (0, 'C2'), (0, 'HN'))), 'AGALNA': (((0, 'C'), (0, 'CT'), (0, 'N'), (0, 'O')), ((0, 'N'), (0, 'C'), (0, 'C2'), (0, 'HN'))), 'BGALNA': (((0, 'C'), (0, 'CT'), (0, 'N'), (0, 'O')), ((0, 'N'), (0, 'C'), (0, 'C2'), (0, 'HN'))), 'AMANNA': (((0, 'C'), (0, 'CT'), (0, 'N'), (0, 'O')), ((0, 'N'), (0, 'C'), (0, 'C2'), (0, 'HN'))), 'BMANNA': (((0, 'C'), (0, 'CT'), (0, 'N'), (0, 'O')), ((0, 'N'), (0, 'C'), (0, 'C2'), (0, 'HN'))), 'ARHMNA': (((0, 'C'), (0, 'CT'), (0, 'N'), (0, 'O')), ((0, 'N'), (0, 'C'), (0, 'C2'), (0, 'HN'))), 'BRHMNA': (((0, 'C'), (0, 'CT'), (0, 'N'), (0, 'O')), ((0, 'N'), (0, 'C'), (0, 'C2'), (0, 'HN'))), 'ANE5AC': (((0, 'C'), (0, 'CT'), (0, 'N'), (0, 'O')), ((0, 'N'), (0, 'C'), (0, 'C5'), (0, 'HN')), ((0, 'C1'), (0, 'C2'), (0, 'O12'), (0, 'O11'))), 'BNE5AC': (((0, 'C'), (0, 'CT'), (0, 'N'), (0, 'O')), ((0, 'N'), (0, 'C'), (0, 'C5'), (0, 'HN')), ((0, 'C1'), (0, 'C2'), (0, 'O12'), (0, 'O11'))), '2BTE': (((0, 'C2'), (0, 'C3'), (0, 'C1'), (0, 'H2')), ((0, 'C3'), (0, 'C2'), (0, 'C4'), (0, 'H3'))), '2BTD': (((0, 'C2'), (0, 'C3'), (0, 'C1'), (0, 'H2')), ((0, 'C3'), (0, 'C2'), (0, 'C4'), (0, 'H3'))), '2PTE': (((0, 'C3'), (0, 'C2'), (0, 'C4'), (0, 'H3')), ((0, 'C2'), (0, 'C3'), (0, 'C1'), (0, 'H2'))), '2PTD': (((0, 'C3'), (0, 'C2'), (0, 'C4'), (0, 'H3')), ((0, 'C2'), (0, 'C3'), (0, 'C1'), (0, 'H2'))), '2HEX': (((0, 'C2'), (0, 'C3'), (0, 'C1'), (0, 'H2')), ((0, 'C3'), (0, 'C2'), (0, 'C4'), (0, 'H3'))), '2HED': (((0, 'C2'), (0, 'C3'), (0, 'C1'), (0, 'H2')), ((0, 'C3'), (0, 'C2'), (0, 'C4'), (0, 'H3'))), '3HEX': (((0, 'C3'), (0, 'C4'), (0, 'C2'), (0, 'H3')), ((0, 'C4'), (0, 'C3'), (0, 'C5'), (0, 'H4'))), '3HED': (((0, 'C3'), (0, 'C4'), (0, 'C2'), (0, 'H3')), ((0, 'C4'), (0, 'C3'), (0, 'C5'), (0, 'H4'))), '5DEC': (((0, 'C5'), (0, 'C4'), (0, 'C6'), (0, 'H5')), ((0, 'C6'), (0, 'C5'), (0, 'C7'), (0, 'H6'))), '5DED': (((0, 'C5'), (0, 'C4'), (0, 'C6'), (0, 'H5')), ((0, 'C6'), (0, 'C5'), (0, 'C7'), (0, 'H6'))), 'AALD': (((0, 'C'), (0, 'HA'), (0, 'CB'), (0, 'O')),), 'PALD': (((0, 'C'), (0, 'HA'), (0, 'CB'), (0, 'O')),), 'BALD': (((0, 'C'), (0, 'HA'), (0, 'CB'), (0, 'O')),), 'IBLD': (((0, 'C'), (0, 'HA'), (0, 'CB'), (0, 'O')),), 'ACO': (((0, 'C1'), (0, 'C2'), (0, 'C3'), (0, 'O1')),), 'BTON': (((0, 'C1'), (0, 'C2'), (0, 'C3'), (0, 'O1')),), 'FORM': (((0, 'C'), (0, 'N'), (0, 'O'), (0, 'HA')),), 'ACEM': (((0, 'C'), (0, 'CL'), (0, 'N'), (0, 'O')), ((0, 'N'), (0, 'HC'), (0, 'HT'), (0, 'C'))), 'NMA': (((0, 'C'), (0, 'CL'), (0, 'N'), (0, 'O')), ((0, 'N'), (0, 'C'), (0, 'CC'), (0, 'H'))), 'NEA': (((0, 'C'), (0, 'CL'), (0, 'N'), (0, 'O')), ((0, 'N'), (0, 'C'), (0, 'CC'), (0, 'H'))), 'NPA': (((0, 'C'), (0, 'CL'), (0, 'N'), (0, 'O')), ((0, 'N'), (0, 'C'), (0, 'CC'), (0, 'H'))), 'DMA': (((0, 'C'), (0, 'CL'), (0, 'N'), (0, 'O')),), 'IMID': (((0, 'ND1'), (0, 'CG'), (0, 'CE1'), (0, 'HD1')), ((0, 'ND1'), (0, 'CE1'), (0, 'CG'), (0, 'HD1')), ((0, 'CD2'), (0, 'CG'), (0, 'NE2'), (0, 'HD2')), ((0, 'CD2'), (0, 'NE2'), (0, 'CG'), (0, 'HD2')), ((0, 'CE1'), (0, 'ND1'), (0, 'NE2'), (0, 'HE1')), ((0, 'CE1'), (0, 'NE2'), (0, 'ND1'), (0, 'HE1')), ((0, 'CG'), (0, 'CD2'), (0, 'ND1'), (0, 'HG')), ((0, 'CG'), (0, 'ND1'), (0, 'CD2'), (0, 'HG'))), '4MIM': (((0, 'ND1'), (0, 'CG'), (0, 'CE1'), (0, 'HD1')), ((0, 'CD2'), (0, 'CG'), (0, 'NE2'), (0, 'HD2')), ((0, 'CE1'), (0, 'ND1'), (0, 'NE2'), (0, 'HE1'))), '4MIE': (((0, 'NE2'), (0, 'CD2'), (0, 'CE1'), (0, 'HE2')), ((0, 'CD2'), (0, 'CG'), (0, 'NE2'), (0, 'HD2')), ((0, 'CE1'), (0, 'ND1'), (0, 'NE2'), (0, 'HE1'))), 'INDO': (((0, 'HZ2'), (0, 'CH2'), (0, 'CE2'), (0, 'CZ2')), ((0, 'HZ2'), (0, 'CE2'), (0, 'CH2'), (0, 'CZ2')), ((0, 'HE3'), (0, 'CD2'), (0, 'CZ3'), (0, 'CE3')), ((0, 'HE3'), (0, 'CZ3'), (0, 'CD2'), (0, 'CE3')), ((0, 'HG'), (0, 'CD2'), (0, 'CD1'), (0, 'CG')), ((0, 'HG'), (0, 'CD1'), (0, 'CD2'), (0, 'CG')), ((0, 'HD1'), (0, 'CG'), (0, 'NE1'), (0, 'CD1')), ((0, 'HD1'), (0, 'NE1'), (0, 'CG'), (0, 'CD1')), ((0, 'HE1'), (0, 'CE2'), (0, 'CD1'), (0, 'NE1')), ((0, 'HE1'), (0, 'CD1'), (0, 'CE2'), (0, 'NE1'))), 'PUR0': (((0, 'N9'), (0, 'C4'), (0, 'C8'), (0, 'H9')), ((0, 'N9'), (0, 'C8'), (0, 'C4'), (0, 'H9')), ((0, 'C8'), (0, 'N9'), (0, 'N7'), (0, 'H8')), ((0, 'C8'), (0, 'N7'), (0, 'N9'), (0, 'H8')), ((0, 'C5'), (0, 'C4'), (0, 'C6'), (0, 'N7')), ((0, 'C5'), (0, 'C6'), (0, 'C4'), (0, 'N7')), ((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'N9')), ((0, 'C4'), (0, 'N3'), (0, 'C5'), (0, 'N9'))), 'PUR1': (((0, 'N9'), (0, 'C5'), (0, 'C8'), (0, 'H9')), ((0, 'N9'), (0, 'C8'), (0, 'C5'), (0, 'H9')), ((0, 'C8'), (0, 'N9'), (0, 'N7'), (0, 'H8')), ((0, 'C8'), (0, 'N7'), (0, 'N9'), (0, 'H8')), ((0, 'C5'), (0, 'C4'), (0, 'C6'), (0, 'N9')), ((0, 'C5'), (0, 'C6'), (0, 'C4'), (0, 'N9')), ((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'N7')), ((0, 'C4'), (0, 'N3'), (0, 'C5'), (0, 'N7'))), 'MIND': (((0, 'HZ2'), (0, 'CH2'), (0, 'CE2'), (0, 'CZ2')), ((0, 'HZ2'), (0, 'CE2'), (0, 'CH2'), (0, 'CZ2')), ((0, 'HE3'), (0, 'CD2'), (0, 'CZ3'), (0, 'CE3')), ((0, 'HE3'), (0, 'CZ3'), (0, 'CD2'), (0, 'CE3')), ((0, 'HD1'), (0, 'CG'), (0, 'NE1'), (0, 'CD1')), ((0, 'HD1'), (0, 'NE1'), (0, 'CG'), (0, 'CD1')), ((0, 'HE1'), (0, 'CE2'), (0, 'CD1'), (0, 'NE1')), ((0, 'HE1'), (0, 'CD1'), (0, 'CE2'), (0, 'NE1'))), 'ACET': (((0, 'O1'), (0, 'C1'), (0, 'O2'), (0, 'C2')),), 'GUAN': (((0, 'C'), (0, 'N2'), (0, 'N1'), (0, 'N3')),), 'MGUAN': (((0, 'C'), (0, 'N2'), (0, 'N1'), (0, 'N3')),), 'BGUAN': (((0, 'CZ'), (0, 'NH1'), (0, 'NH2'), (0, 'NE')),), 'IMIM': (((0, 'ND1'), (0, 'CE1'), (0, 'CG'), (0, 'HD1')), ((0, 'NE2'), (0, 'CE1'), (0, 'CD2'), (0, 'HE2')), ((0, 'CE1'), (0, 'ND1'), (0, 'NE2'), (0, 'HE1')), ((0, 'CG'), (0, 'CD2'), (0, 'ND1'), (0, 'HG')), ((0, 'CD2'), (0, 'CG'), (0, 'NE2'), (0, 'HD2'))), 'ACEH': (((0, 'O2'), (0, 'C1'), (0, 'O1'), (0, 'C2')),), 'MAS': (((0, 'O'), (0, 'C1'), (0, 'OM'), (0, 'C')),), 'EAS': (((0, 'O'), (0, 'C1'), (0, 'OM'), (0, 'C')),), 'MPRO': (((0, 'O'), (0, 'C1'), (0, 'OM'), (0, 'C')),), 'MBU': (((0, 'O'), (0, 'C1'), (0, 'OM'), (0, 'C')),), 'GLYC': (((0, 'O6'), (0, 'C7'), (0, 'O4'), (0, 'C5')), ((0, 'O10'), (0, 'C11'), (0, 'O8'), (0, 'C9'))), 'GLYP': (((0, 'O6'), (0, 'C7'), (0, 'O4'), (0, 'C5')), ((0, 'O10'), (0, 'C11'), (0, 'O8'), (0, 'C9'))), 'PRPC': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))), 'DMPC': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))), 'DPPC': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))), 'DSPC': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))), 'DOPC': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32')), ((0, 'C29'), (0, 'C210'), (0, 'C28'), (0, 'H9R')), ((0, 'C210'), (0, 'C29'), (0, 'C211'), (0, 'H10R')), ((0, 'C39'), (0, 'C310'), (0, 'C38'), (0, 'H9X')), ((0, 'C310'), (0, 'C39'), (0, 'C311'), (0, 'H10X'))), 'DLPE': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))), 'DPPE': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))), 'POPC': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32')), ((0, 'C29'), (0, 'C210'), (0, 'C28'), (0, 'H91')), ((0, 'C210'), (0, 'C29'), (0, 'C211'), (0, 'H101'))), 'DOPE': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32')), ((0, 'C29'), (0, 'C210'), (0, 'C28'), (0, 'H9R')), ((0, 'C210'), (0, 'C29'), (0, 'C211'), (0, 'H10R')), ((0, 'C39'), (0, 'C310'), (0, 'C38'), (0, 'H9X')), ((0, 'C310'), (0, 'C39'), (0, 'C311'), (0, 'H10X'))), 'POPE': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32')), ((0, 'C29'), (0, 'C210'), (0, 'C28'), (0, 'H91')), ((0, 'C210'), (0, 'C29'), (0, 'C211'), (0, 'H101'))), 'DLPC': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32')))}\n-patch_impropers = {'ACE': (((0, 'CY'), (0, 'CAY'), (0, 'N'), (0, 'OY')), ((0, 'N'), (0, 'CY'), (0, 'CA'), (0, 'HN'))), 'ACP': (((0, 'CY'), (0, 'CAY'), (0, 'N'), (0, 'OY')), ((0, 'N'), (0, 'CY'), (0, 'CA'), (0, 'CD'))), 'CTER': (((0, 'C'), (0, 'OT1'), (0, 'OT2'), (0, 'CA')),), 'CTEG': (((0, 'C'), (0, 'OT1'), (0, 'OT2'), (0, 'CA')),), 'CTEP': (((0, 'C'), (0, 'OT1'), (0, 'OT2'), (0, 'CA')),), 'CNEU': (((0, 'OT1'), (0, 'CA'), (0, 'OT2'), (0, 'C')),), 'CNEG': (((0, 'OT1'), (0, 'CA'), (0, 'OT2'), (0, 'C')),), 'CNES': (((0, 'OT1'), (0, 'CA'), (0, 'OT2'), (0, 'C')),), 'CT1': (((0, 'C'), (0, 'OT2'), (0, 'CA'), (0, 'OT1')),), 'CT1G': (((0, 'C'), (0, 'OT2'), (0, 'CA'), (0, 'OT1')),), 'CT2': (((0, 'C'), (0, 'CA'), (0, 'NT'), (0, 'O')), ((0, 'NT'), (0, 'HTC1'), (0, 'HTC2'), (0, 'C'))), 'CT2G': (((0, 'C'), (0, 'CA'), (0, 'NT'), (0, 'O')), ((0, 'NT'), (0, 'HTC1'), (0, 'HTC2'), (0, 'C'))), 'CT2S': (((0, 'C'), (0, 'CA'), (0, 'NT'), (0, 'O')), ((0, 'NT'), (0, 'HTC1'), (0, 'HTC2'), (0, 'C'))), 'CT3': (((0, 'C'), (0, 'CA'), (0, 'NT'), (0, 'O')), ((0, 'NT'), (0, 'C'), (0, 'CAT'), (0, 'HNT'))), 'LINK': (((0, '3N'), (0, '2C'), (0, '3CA'), (0, '3HN')), ((0, '2C'), (0, '2CA'), (0, '3N'), (0, '2O'))), 'HS2': (((0, 'NE2'), (0, 'CD2'), (0, 'CE1'), (0, 'HE2')),), 'KAC': (((0, 'NZ'), (0, 'CH'), (0, 'CE'), (0, 'HZ')), ((0, 'CH'), (0, 'CH3'), (0, 'NZ'), (0, 'OH'))), 'DACE': (((0, 'CY'), (0, 'CAY'), (0, 'N'), (0, 'OY')), ((0, 'N'), (0, 'CY'), (0, 'CA'), (0, 'HN'))), 'DACP': (((0, 'CY'), (0, 'CAY'), (0, 'N'), (0, 'OY')), ((0, 'N'), (0, 'CY'), (0, 'CA'), (0, 'CD'))), 'DCTER': (((0, 'C'), (0, 'OT1'), (0, 'OT2'), (0, 'CA')),), 'DCTEG': (((0, 'C'), (0, 'OT1'), (0, 'OT2'), (0, 'CA')),), 'DCTEP': (((0, 'C'), (0, 'OT1'), (0, 'OT2'), (0, 'CA')),), 'DCTES': (((0, 'C'), (0, 'OT1'), (0, 'OT2'), (0, 'CA')),), 'DCNEU': (((0, 'OT1'), (0, 'CA'), (0, 'OT2'), (0, 'C')),), 'DCNEG': (((0, 'OT1'), (0, 'CA'), (0, 'OT2'), (0, 'C')),), 'DCNES': (((0, 'OT1'), (0, 'CA'), (0, 'OT2'), (0, 'C')),), 'DCT1': (((0, 'C'), (0, 'OT2'), (0, 'CA'), (0, 'OT1')),), 'DCT1G': (((0, 'C'), (0, 'OT2'), (0, 'CA'), (0, 'OT1')),), 'DCT2': (((0, 'C'), (0, 'CA'), (0, 'NT'), (0, 'O')), ((0, 'NT'), (0, 'HTC1'), (0, 'HTC2'), (0, 'C'))), 'DCT2G': (((0, 'C'), (0, 'CA'), (0, 'NT'), (0, 'O')), ((0, 'NT'), (0, 'HTC1'), (0, 'HTC2'), (0, 'C'))), 'DCT2S': (((0, 'C'), (0, 'CA'), (0, 'NT'), (0, 'O')), ((0, 'NT'), (0, 'HTC1'), (0, 'HTC2'), (0, 'C'))), 'DCT3': (((0, 'C'), (0, 'CA'), (0, 'NT'), (0, 'O')), ((0, 'NT'), (0, 'C'), (0, 'CAT'), (0, 'HNT')))}\n-delete_impropers = {}\n+residue_impropers = {\n+ 'ALAD': (((0, 'CY'), (0, 'CAY'), (0, 'N'), (0, 'OY')), ((0, 'N'), (0, 'CY'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (0, 'NT'), (0, 'O')), ((0, 'NT'), (0, 'C'), (0, 'CAT'), (0, 'HNT'))),\n+ 'ALA': (((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN'))),\n+ 'ARG': (((0, 'CZ'), (0, 'NH1'), (0, 'NH2'), (0, 'NE')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN'))),\n+ 'ASN': (((0, 'CG'), (0, 'CB'), (0, 'ND2'), (0, 'OD1')), ((0, 'ND2'), (0, 'HD21'), (0, 'HD22'), (0, 'CG')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN'))),\n+ 'ASP': (((0, 'OD1'), (0, 'CB'), (0, 'OD2'), (0, 'CG')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN'))),\n+ 'CYS': (((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN'))),\n+ 'GLN': (((0, 'CD'), (0, 'CG'), (0, 'NE2'), (0, 'OE1')), ((0, 'NE2'), (0, 'HE21'), (0, 'HE22'), (0, 'CD')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN'))),\n+ 'GLU': (((0, 'OE1'), (0, 'CG'), (0, 'OE2'), (0, 'CD')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN'))),\n+ 'GLY': (((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN'))),\n+ 'HSD': (((0, 'ND1'), (0, 'CG'), (0, 'CE1'), (0, 'HD1')), ((0, 'CD2'), (0, 'CG'), (0, 'NE2'), (0, 'HD2')), ((0, 'CE1'), (0, 'ND1'), (0, 'NE2'), (0, 'HE1')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN'))),\n+ 'HSE': (((0, 'NE2'), (0, 'CD2'), (0, 'CE1'), (0, 'HE2')), ((0, 'CD2'), (0, 'CG'), (0, 'NE2'), (0, 'HD2')), ((0, 'CE1'), (0, 'ND1'), (0, 'NE2'), (0, 'HE1')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN'))),\n+ 'HSP': (((0, 'ND1'), (0, 'CE1'), (0, 'CG'), (0, 'HD1')), ((0, 'NE2'), (0, 'CE1'), (0, 'CD2'), (0, 'HE2')), ((0, 'CE1'), (0, 'ND1'), (0, 'NE2'), (0, 'HE1')), ((0, 'CD2'), (0, 'CG'), (0, 'NE2'), (0, 'HD2')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN'))),\n+ 'ILE': (((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN'))),\n+ 'LEU': (((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN'))),\n+ 'LYS': (((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN'))),\n+ 'MET': (((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN'))),\n+ 'PHE': (((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN'))),\n+ 'PRO': (((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'CD'))),\n+ 'SER': (((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN'))),\n+ 'THR': (((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN'))),\n+ 'TRP': (((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN'))),\n+ 'TYR': (((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN'))),\n+ 'VAL': (((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN'))),\n+ 'ALDD': (((0, 'CY'), (0, 'CAY'), (0, 'N'), (0, 'OY')), ((0, 'N'), (0, 'CY'), (0, 'CA'), (0, 'HN')), ((0, 'C'), (0, 'CA'), (0, 'NT'), (0, 'O')), ((0, 'NT'), (0, 'C'), (0, 'CAT'), (0, 'HNT'))),\n+ 'DALA': (((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN'))),\n+ 'DARG': (((0, 'CZ'), (0, 'NH1'), (0, 'NH2'), (0, 'NE')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN'))),\n+ 'DASN': (((0, 'CG'), (0, 'CB'), (0, 'ND2'), (0, 'OD1')), ((0, 'ND2'), (0, 'HD21'), (0, 'HD22'), (0, 'CG')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN'))),\n+ 'DASP': (((0, 'OD1'), (0, 'CB'), (0, 'OD2'), (0, 'CG')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN'))),\n+ 'DCYS': (((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN'))),\n+ 'DGLN': (((0, 'CD'), (0, 'CG'), (0, 'NE2'), (0, 'OE1')), ((0, 'NE2'), (0, 'HE21'), (0, 'HE22'), (0, 'CD')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN'))),\n+ 'DGLU': (((0, 'OE1'), (0, 'CG'), (0, 'OE2'), (0, 'CD')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN'))),\n+ 'DGLY': (((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN'))),\n+ 'DHSD': (((0, 'ND1'), (0, 'CG'), (0, 'CE1'), (0, 'HD1')), ((0, 'CD2'), (0, 'CG'), (0, 'NE2'), (0, 'HD2')), ((0, 'CE1'), (0, 'ND1'), (0, 'NE2'), (0, 'HE1')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN'))),\n+ 'DHSE': (((0, 'NE2'), (0, 'CD2'), (0, 'CE1'), (0, 'HE2')), ((0, 'CD2'), (0, 'CG'), (0, 'NE2'), (0, 'HD2')), ((0, 'CE1'), (0, 'ND1'), (0, 'NE2'), (0, 'HE1')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN'))),\n+ 'DHSP': (((0, 'ND1'), (0, 'CE1'), (0, 'CG'), (0, 'HD1')), ((0, 'NE2'), (0, 'CE1'), (0, 'CD2'), (0, 'HE2')), ((0, 'CE1'), (0, 'ND1'), (0, 'NE2'), (0, 'HE1')), ((0, 'CD2'), (0, 'CG'), (0, 'NE2'), (0, 'HD2')), ((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN'))),\n+ 'DILE': (((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN'))),\n+ 'DLEU': (((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN'))),\n+ 'DLYS': (((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN'))),\n+ 'DMET': (((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN'))),\n+ 'DPHE': (((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN'))),\n+ 'DPRO': (((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'CD'))),\n+ 'DSER': (((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN'))),\n+ 'DTHR': (((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN'))),\n+ 'DTRP': (((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN'))),\n+ 'DTYR': (((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN'))),\n+ 'DVAL': (((0, 'C'), (0, 'CA'), (1, 'N'), (0, 'O')), ((0, 'N'), (-1, 'C'), (0, 'CA'), (0, 'HN'))),\n+ 'ALLO': (((0, 'C1'), (0, 'H1'), (0, 'C2'), (0, 'O1')),),\n+ 'PSIC': (((0, 'C2'), (0, 'C1'), (0, 'C3'), (0, 'O2')),),\n+ 'AGALA': (((0, 'C6'), (0, 'C5'), (0, 'O62'), (0, 'O61')),),\n+ 'BGALA': (((0, 'C6'), (0, 'C5'), (0, 'O62'), (0, 'O61')),),\n+ 'AGLCA': (((0, 'C6'), (0, 'C5'), (0, 'O62'), (0, 'O61')),),\n+ 'BGLCA': (((0, 'C6'), (0, 'C5'), (0, 'O62'), (0, 'O61')),),\n+ 'AIDOA': (((0, 'C6'), (0, 'C5'), (0, 'O62'), (0, 'O61')),),\n+ 'BIDOA': (((0, 'C6'), (0, 'C5'), (0, 'O62'), (0, 'O61')),),\n+ 'AGLCNA': (((0, 'C'), (0, 'CT'), (0, 'N'), (0, 'O')), ((0, 'N'), (0, 'C'), (0, 'C2'), (0, 'HN'))),\n+ 'BGLCNA': (((0, 'C'), (0, 'CT'), (0, 'N'), (0, 'O')), ((0, 'N'), (0, 'C'), (0, 'C2'), (0, 'HN'))),\n+ 'AGALNA': (((0, 'C'), (0, 'CT'), (0, 'N'), (0, 'O')), ((0, 'N'), (0, 'C'), (0, 'C2'), (0, 'HN'))),\n+ 'BGALNA': (((0, 'C'), (0, 'CT'), (0, 'N'), (0, 'O')), ((0, 'N'), (0, 'C'), (0, 'C2'), (0, 'HN'))),\n+ 'AMANNA': (((0, 'C'), (0, 'CT'), (0, 'N'), (0, 'O')), ((0, 'N'), (0, 'C'), (0, 'C2'), (0, 'HN'))),\n+ 'BMANNA': (((0, 'C'), (0, 'CT'), (0, 'N'), (0, 'O')), ((0, 'N'), (0, 'C'), (0, 'C2'), (0, 'HN'))),\n+ 'ARHMNA': (((0, 'C'), (0, 'CT'), (0, 'N'), (0, 'O')), ((0, 'N'), (0, 'C'), (0, 'C2'), (0, 'HN'))),\n+ 'BRHMNA': (((0, 'C'), (0, 'CT'), (0, 'N'), (0, 'O')), ((0, 'N'), (0, 'C'), (0, 'C2'), (0, 'HN'))),\n+ 'ANE5AC': (((0, 'C'), (0, 'CT'), (0, 'N'), (0, 'O')), ((0, 'N'), (0, 'C'), (0, 'C5'), (0, 'HN')), ((0, 'C1'), (0, 'C2'), (0, 'O12'), (0, 'O11'))),\n+ 'BNE5AC': (((0, 'C'), (0, 'CT'), (0, 'N'), (0, 'O')), ((0, 'N'), (0, 'C'), (0, 'C5'), (0, 'HN')), ((0, 'C1'), (0, 'C2'), (0, 'O12'), (0, 'O11'))),\n+ '2BTE': (((0, 'C2'), (0, 'C3'), (0, 'C1'), (0, 'H2')), ((0, 'C3'), (0, 'C2'), (0, 'C4'), (0, 'H3'))),\n+ '2BTD': (((0, 'C2'), (0, 'C3'), (0, 'C1'), (0, 'H2')), ((0, 'C3'), (0, 'C2'), (0, 'C4'), (0, 'H3'))),\n+ '2PTE': (((0, 'C3'), (0, 'C2'), (0, 'C4'), (0, 'H3')), ((0, 'C2'), (0, 'C3'), (0, 'C1'), (0, 'H2'))),\n+ '2PTD': (((0, 'C3'), (0, 'C2'), (0, 'C4'), (0, 'H3')), ((0, 'C2'), (0, 'C3'), (0, 'C1'), (0, 'H2'))),\n+ '2HEX': (((0, 'C2'), (0, 'C3'), (0, 'C1'), (0, 'H2')), ((0, 'C3'), (0, 'C2'), (0, 'C4'), (0, 'H3'))),\n+ '2HED': (((0, 'C2'), (0, 'C3'), (0, 'C1'), (0, 'H2')), ((0, 'C3'), (0, 'C2'), (0, 'C4'), (0, 'H3'))),\n+ '3HEX': (((0, 'C3'), (0, 'C4'), (0, 'C2'), (0, 'H3')), ((0, 'C4'), (0, 'C3'), (0, 'C5'), (0, 'H4'))),\n+ '3HED': (((0, 'C3'), (0, 'C4'), (0, 'C2'), (0, 'H3')), ((0, 'C4'), (0, 'C3'), (0, 'C5'), (0, 'H4'))),\n+ '5DEC': (((0, 'C5'), (0, 'C4'), (0, 'C6'), (0, 'H5')), ((0, 'C6'), (0, 'C5'), (0, 'C7'), (0, 'H6'))),\n+ '5DED': (((0, 'C5'), (0, 'C4'), (0, 'C6'), (0, 'H5')), ((0, 'C6'), (0, 'C5'), (0, 'C7'), (0, 'H6'))),\n+ 'AALD': (((0, 'C'), (0, 'HA'), (0, 'CB'), (0, 'O')),),\n+ 'PALD': (((0, 'C'), (0, 'HA'), (0, 'CB'), (0, 'O')),),\n+ 'BALD': (((0, 'C'), (0, 'HA'), (0, 'CB'), (0, 'O')),),\n+ 'IBLD': (((0, 'C'), (0, 'HA'), (0, 'CB'), (0, 'O')),),\n+ 'ACO': (((0, 'C1'), (0, 'C2'), (0, 'C3'), (0, 'O1')),),\n+ 'BTON': (((0, 'C1'), (0, 'C2'), (0, 'C3'), (0, 'O1')),),\n+ 'FORM': (((0, 'C'), (0, 'N'), (0, 'O'), (0, 'HA')),),\n+ 'ACEM': (((0, 'C'), (0, 'CL'), (0, 'N'), (0, 'O')), ((0, 'N'), (0, 'HC'), (0, 'HT'), (0, 'C'))),\n+ 'NMA': (((0, 'C'), (0, 'CL'), (0, 'N'), (0, 'O')), ((0, 'N'), (0, 'C'), (0, 'CC'), (0, 'H'))),\n+ 'NEA': (((0, 'C'), (0, 'CL'), (0, 'N'), (0, 'O')), ((0, 'N'), (0, 'C'), (0, 'CC'), (0, 'H'))),\n+ 'NPA': (((0, 'C'), (0, 'CL'), (0, 'N'), (0, 'O')), ((0, 'N'), (0, 'C'), (0, 'CC'), (0, 'H'))),\n+ 'DMA': (((0, 'C'), (0, 'CL'), (0, 'N'), (0, 'O')),),\n+ 'IMID': (((0, 'ND1'), (0, 'CG'), (0, 'CE1'), (0, 'HD1')), ((0, 'ND1'), (0, 'CE1'), (0, 'CG'), (0, 'HD1')), ((0, 'CD2'), (0, 'CG'), (0, 'NE2'), (0, 'HD2')), ((0, 'CD2'), (0, 'NE2'), (0, 'CG'), (0, 'HD2')), ((0, 'CE1'), (0, 'ND1'), (0, 'NE2'), (0, 'HE1')), ((0, 'CE1'), (0, 'NE2'), (0, 'ND1'), (0, 'HE1')), ((0, 'CG'), (0, 'CD2'), (0, 'ND1'), (0, 'HG')), ((0, 'CG'), (0, 'ND1'), (0, 'CD2'), (0, 'HG'))),\n+ '4MIM': (((0, 'ND1'), (0, 'CG'), (0, 'CE1'), (0, 'HD1')), ((0, 'CD2'), (0, 'CG'), (0, 'NE2'), (0, 'HD2')), ((0, 'CE1'), (0, 'ND1'), (0, 'NE2'), (0, 'HE1'))),\n+ '4MIE': (((0, 'NE2'), (0, 'CD2'), (0, 'CE1'), (0, 'HE2')), ((0, 'CD2'), (0, 'CG'), (0, 'NE2'), (0, 'HD2')), ((0, 'CE1'), (0, 'ND1'), (0, 'NE2'), (0, 'HE1'))),\n+ 'INDO': (((0, 'HZ2'), (0, 'CH2'), (0, 'CE2'), (0, 'CZ2')), ((0, 'HZ2'), (0, 'CE2'), (0, 'CH2'), (0, 'CZ2')), ((0, 'HE3'), (0, 'CD2'), (0, 'CZ3'), (0, 'CE3')), ((0, 'HE3'), (0, 'CZ3'), (0, 'CD2'), (0, 'CE3')), ((0, 'HG'), (0, 'CD2'), (0, 'CD1'), (0, 'CG')), ((0, 'HG'), (0, 'CD1'), (0, 'CD2'), (0, 'CG')), ((0, 'HD1'), (0, 'CG'), (0, 'NE1'), (0, 'CD1')), ((0, 'HD1'), (0, 'NE1'), (0, 'CG'), (0, 'CD1')), ((0, 'HE1'), (0, 'CE2'), (0, 'CD1'), (0, 'NE1')), ((0, 'HE1'), (0, 'CD1'), (0, 'CE2'), (0, 'NE1'))),\n+ 'PUR0': (((0, 'N9'), (0, 'C4'), (0, 'C8'), (0, 'H9')), ((0, 'N9'), (0, 'C8'), (0, 'C4'), (0, 'H9')), ((0, 'C8'), (0, 'N9'), (0, 'N7'), (0, 'H8')), ((0, 'C8'), (0, 'N7'), (0, 'N9'), (0, 'H8')), ((0, 'C5'), (0, 'C4'), (0, 'C6'), (0, 'N7')), ((0, 'C5'), (0, 'C6'), (0, 'C4'), (0, 'N7')), ((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'N9')), ((0, 'C4'), (0, 'N3'), (0, 'C5'), (0, 'N9'))),\n+ 'PUR1': (((0, 'N9'), (0, 'C5'), (0, 'C8'), (0, 'H9')), ((0, 'N9'), (0, 'C8'), (0, 'C5'), (0, 'H9')), ((0, 'C8'), (0, 'N9'), (0, 'N7'), (0, 'H8')), ((0, 'C8'), (0, 'N7'), (0, 'N9'), (0, 'H8')), ((0, 'C5'), (0, 'C4'), (0, 'C6'), (0, 'N9')), ((0, 'C5'), (0, 'C6'), (0, 'C4'), (0, 'N9')), ((0, 'C4'), (0, 'C5'), (0, 'N3'), (0, 'N7')), ((0, 'C4'), (0, 'N3'), (0, 'C5'), (0, 'N7'))),\n+ 'MIND': (((0, 'HZ2'), (0, 'CH2'), (0, 'CE2'), (0, 'CZ2')), ((0, 'HZ2'), (0, 'CE2'), (0, 'CH2'), (0, 'CZ2')), ((0, 'HE3'), (0, 'CD2'), (0, 'CZ3'), (0, 'CE3')), ((0, 'HE3'), (0, 'CZ3'), (0, 'CD2'), (0, 'CE3')), ((0, 'HD1'), (0, 'CG'), (0, 'NE1'), (0, 'CD1')), ((0, 'HD1'), (0, 'NE1'), (0, 'CG'), (0, 'CD1')), ((0, 'HE1'), (0, 'CE2'), (0, 'CD1'), (0, 'NE1')), ((0, 'HE1'), (0, 'CD1'), (0, 'CE2'), (0, 'NE1'))),\n+ 'ACET': (((0, 'O1'), (0, 'C1'), (0, 'O2'), (0, 'C2')),),\n+ 'GUAN': (((0, 'C'), (0, 'N2'), (0, 'N1'), (0, 'N3')),),\n+ 'MGUAN': (((0, 'C'), (0, 'N2'), (0, 'N1'), (0, 'N3')),),\n+ 'BGUAN': (((0, 'CZ'), (0, 'NH1'), (0, 'NH2'), (0, 'NE')),),\n+ 'IMIM': (((0, 'ND1'), (0, 'CE1'), (0, 'CG'), (0, 'HD1')), ((0, 'NE2'), (0, 'CE1'), (0, 'CD2'), (0, 'HE2')), ((0, 'CE1'), (0, 'ND1'), (0, 'NE2'), (0, 'HE1')), ((0, 'CG'), (0, 'CD2'), (0, 'ND1'), (0, 'HG')), ((0, 'CD2'), (0, 'CG'), (0, 'NE2'), (0, 'HD2'))),\n+ 'ACEH': (((0, 'O2'), (0, 'C1'), (0, 'O1'), (0, 'C2')),),\n+ 'MAS': (((0, 'O'), (0, 'C1'), (0, 'OM'), (0, 'C')),),\n+ 'EAS': (((0, 'O'), (0, 'C1'), (0, 'OM'), (0, 'C')),),\n+ 'MPRO': (((0, 'O'), (0, 'C1'), (0, 'OM'), (0, 'C')),),\n+ 'MBU': (((0, 'O'), (0, 'C1'), (0, 'OM'), (0, 'C')),),\n+ 'GLYC': (((0, 'O6'), (0, 'C7'), (0, 'O4'), (0, 'C5')), ((0, 'O10'), (0, 'C11'), (0, 'O8'), (0, 'C9'))),\n+ 'GLYP': (((0, 'O6'), (0, 'C7'), (0, 'O4'), (0, 'C5')), ((0, 'O10'), (0, 'C11'), (0, 'O8'), (0, 'C9'))),\n+ 'PRPC': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))),\n+ 'DMPC': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))),\n+ 'DPPC': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))),\n+ 'DSPC': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))),\n+ 'DOPC': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32')), ((0, 'C29'), (0, 'C210'), (0, 'C28'), (0, 'H9R')), ((0, 'C210'), (0, 'C29'), (0, 'C211'), (0, 'H10R')), ((0, 'C39'), (0, 'C310'), (0, 'C38'), (0, 'H9X')), ((0, 'C310'), (0, 'C39'), (0, 'C311'), (0, 'H10X'))),\n+ 'DLPE': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))),\n+ 'DPPE': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))),\n+ 'POPC': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32')), ((0, 'C29'), (0, 'C210'), (0, 'C28'), (0, 'H91')), ((0, 'C210'), (0, 'C29'), (0, 'C211'), (0, 'H101'))),\n+ 'DOPE': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32')), ((0, 'C29'), (0, 'C210'), (0, 'C28'), (0, 'H9R')), ((0, 'C210'), (0, 'C29'), (0, 'C211'), (0, 'H10R')), ((0, 'C39'), (0, 'C310'), (0, 'C38'), (0, 'H9X')), ((0, 'C310'), (0, 'C39'), (0, 'C311'), (0, 'H10X'))),\n+ 'POPE': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32')), ((0, 'C29'), (0, 'C210'), (0, 'C28'), (0, 'H91')), ((0, 'C210'), (0, 'C29'), (0, 'C211'), (0, 'H101'))),\n+ 'DLPC': (((0, 'C21'), (0, 'O21'), (0, 'C22'), (0, 'O22')), ((0, 'C31'), (0, 'O31'), (0, 'C32'), (0, 'O32'))),\n+}\n+patch_impropers = {\n+ 'ACE': (((0, 'CY'), (0, 'CAY'), (0, 'N'), (0, 'OY')), ((0, 'N'), (0, 'CY'), (0, 'CA'), (0, 'HN'))),\n+ 'ACP': (((0, 'CY'), (0, 'CAY'), (0, 'N'), (0, 'OY')), ((0, 'N'), (0, 'CY'), (0, 'CA'), (0, 'CD'))),\n+ 'CTER': (((0, 'C'), (0, 'OT1'), (0, 'OT2'), (0, 'CA')),),\n+ 'CTEG': (((0, 'C'), (0, 'OT1'), (0, 'OT2'), (0, 'CA')),),\n+ 'CTEP': (((0, 'C'), (0, 'OT1'), (0, 'OT2'), (0, 'CA')),),\n+ 'CNEU': (((0, 'OT1'), (0, 'CA'), (0, 'OT2'), (0, 'C')),),\n+ 'CNEG': (((0, 'OT1'), (0, 'CA'), (0, 'OT2'), (0, 'C')),),\n+ 'CT1': (((0, 'C'), (0, 'OT2'), (0, 'CA'), (0, 'OT1')),),\n+ 'CT1G': (((0, 'C'), (0, 'OT2'), (0, 'CA'), (0, 'OT1')),),\n+ 'CT2': (((0, 'C'), (0, 'CA'), (0, 'NT'), (0, 'O')), ((0, 'NT'), (0, 'HTC1'), (0, 'HTC2'), (0, 'C'))),\n+ 'CT2G': (((0, 'C'), (0, 'CA'), (0, 'NT'), (0, 'O')), ((0, 'NT'), (0, 'HTC1'), (0, 'HTC2'), (0, 'C'))),\n+ 'CT3': (((0, 'C'), (0, 'CA'), (0, 'NT'), (0, 'O')), ((0, 'NT'), (0, 'C'), (0, 'CAT'), (0, 'HNT'))),\n+ 'LINK': (((0, '3N'), (0, '2C'), (0, '3CA'), (0, '3HN')), ((0, '2C'), (0, '2CA'), (0, '3N'), (0, '2O'))),\n+ 'HS2': (((0, 'NE2'), (0, 'CD2'), (0, 'CE1'), (0, 'HE2')),),\n+ 'KAC': (((0, 'NZ'), (0, 'CH'), (0, 'CE'), (0, 'HZ')), ((0, 'CH'), (0, 'CH3'), (0, 'NZ'), (0, 'OH'))),\n+ 'DACE': (((0, 'CY'), (0, 'CAY'), (0, 'N'), (0, 'OY')), ((0, 'N'), (0, 'CY'), (0, 'CA'), (0, 'HN'))),\n+ 'DACP': (((0, 'CY'), (0, 'CAY'), (0, 'N'), (0, 'OY')), ((0, 'N'), (0, 'CY'), (0, 'CA'), (0, 'CD'))),\n+ 'DCTER': (((0, 'C'), (0, 'OT1'), (0, 'OT2'), (0, 'CA')),),\n+ 'DCTEG': (((0, 'C'), (0, 'OT1'), (0, 'OT2'), (0, 'CA')),),\n+ 'DCTEP': (((0, 'C'), (0, 'OT1'), (0, 'OT2'), (0, 'CA')),),\n+ 'DCTES': (((0, 'C'), (0, 'OT1'), (0, 'OT2'), (0, 'CA')),),\n+ 'DCNEU': (((0, 'OT1'), (0, 'CA'), (0, 'OT2'), (0, 'C')),),\n+ 'DCNEG': (((0, 'OT1'), (0, 'CA'), (0, 'OT2'), (0, 'C')),),\n+ 'DCNES': (((0, 'OT1'), (0, 'CA'), (0, 'OT2'), (0, 'C')),),\n+ 'DCT1': (((0, 'C'), (0, 'OT2'), (0, 'CA'), (0, 'OT1')),),\n+ 'DCT1G': (((0, 'C'), (0, 'OT2'), (0, 'CA'), (0, 'OT1')),),\n+ 'DCT2': (((0, 'C'), (0, 'CA'), (0, 'NT'), (0, 'O')), ((0, 'NT'), (0, 'HTC1'), (0, 'HTC2'), (0, 'C'))),\n+ 'DCT2G': (((0, 'C'), (0, 'CA'), (0, 'NT'), (0, 'O')), ((0, 'NT'), (0, 'HTC1'), (0, 'HTC2'), (0, 'C'))),\n+ 'DCT2S': (((0, 'C'), (0, 'CA'), (0, 'NT'), (0, 'O')), ((0, 'NT'), (0, 'HTC1'), (0, 'HTC2'), (0, 'C'))),\n+ 'DCT3': (((0, 'C'), (0, 'CA'), (0, 'NT'), (0, 'O')), ((0, 'NT'), (0, 'C'), (0, 'CAT'), (0, 'HNT'))),\n+}\n+delete_impropers = {\n+}\n \n-residue_order = {'ALAD': 0, 'ALA': 1, 'ARG': 2, 'ASN': 3, 'ASP': 4, 'CYS': 5, 'GLN': 6, 'GLU': 7, 'GLY': 8, 'HSD': 9, 'HSE': 10, 'HSP': 11, 'ILE': 12, 'LEU': 13, 'LYS': 14, 'MET': 15, 'PHE': 16, 'PRO': 17, 'SER': 18, 'THR': 19, 'TRP': 20, 'TYR': 21, 'VAL': 22, 'ALDD': 23, 'DALA': 24, 'DARG': 25, 'DASN': 26, 'DASP': 27, 'DCYS': 28, 'DGLN': 29, 'DGLU': 30, 'DGLY': 31, 'DHSD': 32, 'DHSE': 33, 'DHSP': 34, 'DILE': 35, 'DLEU': 36, 'DLYS': 37, 'DMET': 38, 'DPHE': 39, 'DPRO': 40, 'DSER': 41, 'DTHR': 42, 'DTRP': 43, 'DTYR': 44, 'DVAL': 45, 'ALLO': 46, 'PSIC': 47, 'AGALA': 48, 'BGALA': 49, 'AGLCA': 50, 'BGLCA': 51, 'AIDOA': 52, 'BIDOA': 53, 'AGLCNA': 54, 'BGLCNA': 55, 'AGALNA': 56, 'BGALNA': 57, 'AMANNA': 58, 'BMANNA': 59, 'ARHMNA': 60, 'BRHMNA': 61, 'ANE5AC': 62, 'BNE5AC': 63, '2BTE': 64, '2BTD': 65, '2PTE': 66, '2PTD': 67, '2HEX': 68, '2HED': 69, '3HEX': 70, '3HED': 71, '5DEC': 72, '5DED': 73, 'AALD': 74, 'PALD': 75, 'BALD': 76, 'IBLD': 77, 'ACO': 78, 'BTON': 79, 'FORM': 80, 'ACEM': 81, 'NMA': 82, 'NEA': 83, 'NPA': 84, 'DMA': 85, 'IMID': 86, '4MIM': 87, '4MIE': 88, 'INDO': 89, 'PUR0': 90, 'PUR1': 91, 'MIND': 92, 'ACET': 93, 'GUAN': 94, 'MGUAN': 95, 'BGUAN': 96, 'IMIM': 97, 'ACEH': 98, 'MAS': 99, 'EAS': 100, 'MPRO': 101, 'MBU': 102, 'GLYC': 103, 'GLYP': 104, 'PRPC': 105, 'DMPC': 106, 'DPPC': 107, 'DSPC': 108, 'DOPC': 109, 'DLPE': 110, 'DPPE': 111, 'POPC': 112, 'DOPE': 113, 'POPE': 114, 'DLPC': 115}\n-patch_order = {'ACE': 0, 'ACP': 1, 'CTER': 2, 'CTEG': 3, 'CTEP': 4, 'CNEU': 5, 'CNEG': 6, 'CNES': 7, 'CT1': 8, 'CT1G': 9, 'CT2': 10, 'CT2G': 11, 'CT2S': 12, 'CT3': 13, 'LINK': 14, 'HS2': 15, 'KAC': 16, 'DACE': 17, 'DACP': 18, 'DCTER': 19, 'DCTEG': 20, 'DCTEP': 21, 'DCTES': 22, 'DCNEU': 23, 'DCNEG': 24, 'DCNES': 25, 'DCT1': 26, 'DCT1G': 27, 'DCT2': 28, 'DCT2G': 29, 'DCT2S': 30, 'DCT3': 31}\n+residue_order = {\n+ 'ALAD': 0,\n+ 'ALA': 1,\n+ 'ARG': 2,\n+ 'ASN': 3,\n+ 'ASP': 4,\n+ 'CYS': 5,\n+ 'GLN': 6,\n+ 'GLU': 7,\n+ 'GLY': 8,\n+ 'HSD': 9,\n+ 'HSE': 10,\n+ 'HSP': 11,\n+ 'ILE': 12,\n+ 'LEU': 13,\n+ 'LYS': 14,\n+ 'MET': 15,\n+ 'PHE': 16,\n+ 'PRO': 17,\n+ 'SER': 18,\n+ 'THR': 19,\n+ 'TRP': 20,\n+ 'TYR': 21,\n+ 'VAL': 22,\n+ 'ALDD': 23,\n+ 'DALA': 24,\n+ 'DARG': 25,\n+ 'DASN': 26,\n+ 'DASP': 27,\n+ 'DCYS': 28,\n+ 'DGLN': 29,\n+ 'DGLU': 30,\n+ 'DGLY': 31,\n+ 'DHSD': 32,\n+ 'DHSE': 33,\n+ 'DHSP': 34,\n+ 'DILE': 35,\n+ 'DLEU': 36,\n+ 'DLYS': 37,\n+ 'DMET': 38,\n+ 'DPHE': 39,\n+ 'DPRO': 40,\n+ 'DSER': 41,\n+ 'DTHR': 42,\n+ 'DTRP': 43,\n+ 'DTYR': 44,\n+ 'DVAL': 45,\n+ 'ALLO': 46,\n+ 'PSIC': 47,\n+ 'AGALA': 48,\n+ 'BGALA': 49,\n+ 'AGLCA': 50,\n+ 'BGLCA': 51,\n+ 'AIDOA': 52,\n+ 'BIDOA': 53,\n+ 'AGLCNA': 54,\n+ 'BGLCNA': 55,\n+ 'AGALNA': 56,\n+ 'BGALNA': 57,\n+ 'AMANNA': 58,\n+ 'BMANNA': 59,\n+ 'ARHMNA': 60,\n+ 'BRHMNA': 61,\n+ 'ANE5AC': 62,\n+ 'BNE5AC': 63,\n+ '2BTE': 64,\n+ '2BTD': 65,\n+ '2PTE': 66,\n+ '2PTD': 67,\n+ '2HEX': 68,\n+ '2HED': 69,\n+ '3HEX': 70,\n+ '3HED': 71,\n+ '5DEC': 72,\n+ '5DED': 73,\n+ 'AALD': 74,\n+ 'PALD': 75,\n+ 'BALD': 76,\n+ 'IBLD': 77,\n+ 'ACO': 78,\n+ 'BTON': 79,\n+ 'FORM': 80,\n+ 'ACEM': 81,\n+ 'NMA': 82,\n+ 'NEA': 83,\n+ 'NPA': 84,\n+ 'DMA': 85,\n+ 'IMID': 86,\n+ '4MIM': 87,\n+ '4MIE': 88,\n+ 'INDO': 89,\n+ 'PUR0': 90,\n+ 'PUR1': 91,\n+ 'MIND': 92,\n+ 'ACET': 93,\n+ 'GUAN': 94,\n+ 'MGUAN': 95,\n+ 'BGUAN': 96,\n+ 'IMIM': 97,\n+ 'ACEH': 98,\n+ 'MAS': 99,\n+ 'EAS': 100,\n+ 'MPRO': 101,\n+ 'MBU': 102,\n+ 'GLYC': 103,\n+ 'GLYP': 104,\n+ 'PRPC': 105,\n+ 'DMPC': 106,\n+ 'DPPC': 107,\n+ 'DSPC': 108,\n+ 'DOPC': 109,\n+ 'DLPE': 110,\n+ 'DPPE': 111,\n+ 'POPC': 112,\n+ 'DOPE': 113,\n+ 'POPE': 114,\n+ 'DLPC': 115,\n+}\n+patch_order = {\n+ 'ACE': 0,\n+ 'ACP': 1,\n+ 'CTER': 2,\n+ 'CTEG': 3,\n+ 'CTEP': 4,\n+ 'CNEU': 5,\n+ 'CNEG': 6,\n+ 'CT1': 7,\n+ 'CT1G': 8,\n+ 'CT2': 9,\n+ 'CT2G': 10,\n+ 'CT3': 11,\n+ 'LINK': 12,\n+ 'HS2': 13,\n+ 'KAC': 14,\n+ 'DACE': 15,\n+ 'DACP': 16,\n+ 'DCTER': 17,\n+ 'DCTEG': 18,\n+ 'DCTEP': 19,\n+ 'DCTES': 20,\n+ 'DCNEU': 21,\n+ 'DCNEG': 22,\n+ 'DCNES': 23,\n+ 'DCT1': 24,\n+ 'DCT1G': 25,\n+ 'DCT2': 26,\n+ 'DCT2G': 27,\n+ 'DCT2S': 28,\n+ 'DCT3': 29,\n+}\n \n-periodic_improper_types = {}\n-harmonic_improper_types = {('OD2C3A', 'CD32C', 'OD31F', 'CD2O3A'): ((355.64, 0.0),), ('CD2O3A', 'OD31F', 'CD32C', 'OD2C3A'): ((355.64, 0.0),), ('CD2O1A', 'CD32A', 'ND2A2', 'OD2C1A'): ((418.40000000000003, 0.0),), ('OD2C1A', 'ND2A2', 'CD32A', 'CD2O1A'): ((418.40000000000003, 0.0),), ('CD2O1A', 'CD31C', 'ND3A3', 'OD2C1A'): ((0.0, 0.0),), ('OD2C1A', 'ND3A3', 'CD31C', 'CD2O1A'): ((0.0, 0.0),), ('CD2O1A', 'CD32C', 'ND3A3', 'OD2C1A'): ((0.0, 0.0),), ('OD2C1A', 'ND3A3', 'CD32C', 'CD2O1A'): ((0.0, 0.0),), ('ND3A3', 'CD2O1A', 'CD31C', 'CD32A'): ((0.0, 0.0),), ('CD32A', 'CD31C', 'CD2O1A', 'ND3A3'): ((0.0, 0.0),), ('CD2O1A', 'CD31C', 'ND2A1', 'OD2C1A'): ((502.08000000000004, 0.0),), ('OD2C1A', 'ND2A1', 'CD31C', 'CD2O1A'): ((502.08000000000004, 0.0),), ('CD2O1A', 'CD31A', 'ND2A2', 'OD2C1A'): ((502.08000000000004, 0.0),), ('OD2C1A', 'ND2A2', 'CD31A', 'CD2O1A'): ((502.08000000000004, 0.0),), ('CD2O1A', 'CD32A', 'ND3A3', 'OD2C1A'): ((502.08000000000004, 0.0),), ('OD2C1A', 'ND3A3', 'CD32A', 'CD2O1A'): ((502.08000000000004, 0.0),), ('CD2O1A', 'CD33C', 'ND3A3', 'OD2C1A'): ((502.08000000000004, 0.0),), ('OD2C1A', 'ND3A3', 'CD33C', 'CD2O1A'): ((502.08000000000004, 0.0),), ('OD2C2A', 'CD31A', 'OD2C2A', 'CD2O2A'): ((297.064, 0.0),), ('CD2O2A', 'OD2C2A', 'CD31A', 'OD2C2A'): ((297.064, 0.0),), ('OD2C2A', 'CD32A', 'OD2C2A', 'CD2O2A'): ((297.064, 0.0),), ('CD2O2A', 'OD2C2A', 'CD32A', 'OD2C2A'): ((297.064, 0.0),), ('OD2C2A', 'CD33A', 'OD2C2A', 'CD2O2A'): ((297.064, 0.0),), ('CD2O2A', 'OD2C2A', 'CD33A', 'OD2C2A'): ((297.064, 0.0),), ('OD2C2A', 'CD31C', 'OD2C2A', 'CD2O2A'): ((297.064, 0.0),), ('CD2O2A', 'OD2C2A', 'CD31C', 'OD2C2A'): ((297.064, 0.0),), ('OD2C2A', 'CD32C', 'OD2C2A', 'CD2O2A'): ((297.064, 0.0),), ('CD2O2A', 'OD2C2A', 'CD32C', 'OD2C2A'): ((297.064, 0.0),), ('OD2C3A', 'CD31C', 'OD31F', 'CD2O3A'): ((355.64, 0.0),), ('CD2O3A', 'OD31F', 'CD31C', 'OD2C3A'): ((355.64, 0.0),), ('OD2C3A', 'CD31A', 'OD31F', 'CD2O3A'): ((355.64, 0.0),), ('CD2O3A', 'OD31F', 'CD31A', 'OD2C3A'): ((355.64, 0.0),), ('CD2O1A', 'CD32C', 'ND2A1', 'OD2C1A'): ((376.56, 0.0),), ('OD2C1A', 'ND2A1', 'CD32C', 'CD2O1A'): ((376.56, 0.0),), ('CD2O1A', 'CD31C', 'ND2A2', 'OD2C1A'): ((155.64480000000003, 0.0),), ('OD2C1A', 'ND2A2', 'CD31C', 'CD2O1A'): ((155.64480000000003, 0.0),), ('CD2O1A', 'CD32C', 'ND2A2', 'OD2C1A'): ((418.40000000000003, 0.0),), ('OD2C1A', 'ND2A2', 'CD32C', 'CD2O1A'): ((418.40000000000003, 0.0),), ('CD2O1A', 'CD33C', 'ND2A2', 'OD2C1A'): ((374.04960000000005, 0.0),), ('OD2C1A', 'ND2A2', 'CD33C', 'CD2O1A'): ((374.04960000000005, 0.0),), ('OD2C1A', 'ND2A1', 'CD33C', 'CD2O1A'): ((376.56, 0.0),), ('CD2O1A', 'CD33C', 'ND2A1', 'OD2C1A'): ((376.56, 0.0),), ('ND2A1', 'HDP1A', 'HDP1A', 'CD2O1A'): ((16.736, 0.0),), ('CD2O1A', 'HDP1A', 'HDP1A', 'ND2A1'): ((16.736, 0.0),), ('OD2C1A', 'ND2A3', 'CD33C', 'CD2O1A'): ((251.04000000000002, 0.0),), ('CD2O1A', 'CD33C', 'ND2A3', 'OD2C1A'): ((251.04000000000002, 0.0),), ('ND2A2', 'CD2O1A', 'CD31C', 'HDP1A'): ((128.4488, 0.0),), ('HDP1A', 'CD31C', 'CD2O1A', 'ND2A2'): ((128.4488, 0.0),), ('ND2A2', 'CD2O1A', 'CD32C', 'HDP1A'): ((167.36, 0.0),), ('HDP1A', 'CD32C', 'CD2O1A', 'ND2A2'): ((167.36, 0.0),), ('ND2A2', 'CD2O1A', 'CD33C', 'HDP1A'): ((148.9504, 0.0),), ('HDP1A', 'CD33C', 'CD2O1A', 'ND2A2'): ((148.9504, 0.0),), ('CD2O2A', 'OD2C2A', 'OD2C2A', 'CD33A'): ((297.064, 0.0),), ('CD33A', 'OD2C2A', 'OD2C2A', 'CD2O2A'): ((297.064, 0.0),), ('CD2O2A', 'OD2C2A', 'OD2C2A', 'CD32A'): ((297.064, 0.0),), ('CD32A', 'OD2C2A', 'OD2C2A', 'CD2O2A'): ((297.064, 0.0),), ('CD2O2A', 'OD2C2A', 'OD2C2A', 'CD32C'): ((297.064, 0.0),), ('CD32C', 'OD2C2A', 'OD2C2A', 'CD2O2A'): ((297.064, 0.0),), ('CD2O2A', 'OD2C2A', 'OD2C2A', 'CD31A'): ((297.064, 0.0),), ('CD31A', 'OD2C2A', 'OD2C2A', 'CD2O2A'): ((297.064, 0.0),), ('CD2O2A', 'OD2C2A', 'OD2C2A', 'CD31C'): ((297.064, 0.0),), ('CD31C', 'OD2C2A', 'OD2C2A', 'CD2O2A'): ((297.064, 0.0),), ('ND2R5A', 'CD2R5A', 'CD2R5B', 'HDP1A'): ((1.8828, 0.0),), ('HDP1A', 'CD2R5B', 'CD2R5A', 'ND2R5A'): ((1.8828, 0.0),), ('ND2R5A', 'CD2R5B', 'CD2R5A', 'HDP1A'): ((1.8828, 0.0),), ('HDP1A', 'CD2R5A', 'CD2R5B', 'ND2R5A'): ((1.8828, 0.0),), ('CD2R5A', 'CD2R5A', 'ND2R5B', 'HDR5A'): ((2.092, 0.0),), ('HDR5A', 'ND2R5B', 'CD2R5A', 'CD2R5A'): ((2.092, 0.0),), ('CD2R5A', 'ND2R5B', 'CD2R5A', 'HDR5A'): ((2.092, 0.0),), ('HDR5A', 'CD2R5A', 'ND2R5B', 'CD2R5A'): ((2.092, 0.0),), ('CD2R5B', 'ND2R5A', 'ND2R5B', 'HDR5B'): ((2.092, 0.0),), ('HDR5B', 'ND2R5B', 'ND2R5A', 'CD2R5B'): ((2.092, 0.0),), ('CD2R5B', 'ND2R5B', 'ND2R5A', 'HDR5B'): ((2.092, 0.0),), ('HDR5B', 'ND2R5A', 'ND2R5B', 'CD2R5B'): ((2.092, 0.0),), ('CD2R5A', 'CD2R5A', 'ND2R5A', 'HDR5A'): ((2.092, 0.0),), ('HDR5A', 'ND2R5A', 'CD2R5A', 'CD2R5A'): ((2.092, 0.0),), ('CD2R5A', 'ND2R5A', 'CD2R5A', 'HDR5A'): ((2.092, 0.0),), ('HDR5A', 'CD2R5A', 'ND2R5A', 'CD2R5A'): ((2.092, 0.0),), ('ND2R5C', 'CD2R5E', 'CD2R5D', 'HDP1A'): ((1.8828, 0.0),), ('HDP1A', 'CD2R5D', 'CD2R5E', 'ND2R5C'): ((1.8828, 0.0),), ('CD2R5D', 'CD2R5D', 'ND2R5C', 'HDR5D'): ((2.092, 0.0),), ('HDR5D', 'ND2R5C', 'CD2R5D', 'CD2R5D'): ((2.092, 0.0),), ('CD2R5E', 'ND2R5C', 'ND2R5C', 'HDR5E'): ((2.092, 0.0),), ('HDR5E', 'ND2R5C', 'ND2R5C', 'CD2R5E'): ((2.092, 0.0),), ('CD2N1A', 'ND2P1A', 'ND2P1A', 'ND2P1A'): ((167.36, 0.0),), ('ND2P1A', 'ND2P1A', 'ND2P1A', 'CD2N1A'): ((167.36, 0.0),), ('HDR5A', 'ND2R5A', 'CD2R5C', 'CD2R5A'): ((1.8828, 0.0),), ('CD2R5A', 'CD2R5C', 'ND2R5A', 'HDR5A'): ((1.8828, 0.0),), ('HDR5A', 'CD2R5C', 'ND2R5A', 'CD2R5A'): ((1.8828, 0.0),), ('CD2R5A', 'ND2R5A', 'CD2R5C', 'HDR5A'): ((1.8828, 0.0),), ('HDP1A', 'CD2R5A', 'CD2R5A', 'ND2R5A'): ((1.8828, 0.0),), ('ND2R5A', 'CD2R5A', 'CD2R5A', 'HDP1A'): ((1.8828, 0.0),), ('HDR5C', 'CD2R5A', 'CD2R5C', 'CD2R5C'): ((1.8828, 0.0),), ('CD2R5C', 'CD2R5C', 'CD2R5A', 'HDR5C'): ((1.8828, 0.0),), ('HDR5C', 'CD2R5C', 'CD2R5A', 'CD2R5C'): ((1.8828, 0.0),), ('CD2R5C', 'CD2R5A', 'CD2R5C', 'HDR5C'): ((1.8828, 0.0),), ('HDP1A', 'CD2R5A', 'CD2R6D', 'ND2R5A'): ((1.8828, 0.0),), ('ND2R5A', 'CD2R6D', 'CD2R5A', 'HDP1A'): ((1.8828, 0.0),), ('HDP1A', 'CD2R6D', 'CD2R5A', 'ND2R5A'): ((1.8828, 0.0),), ('ND2R5A', 'CD2R5A', 'CD2R6D', 'HDP1A'): ((1.8828, 0.0),), ('CD2R6A', 'CD2R6A', 'CD2R6D', 'HDR6A'): ((1.8828, 0.0),), ('HDR6A', 'CD2R6D', 'CD2R6A', 'CD2R6A'): ((1.8828, 0.0),), ('HDR6A', 'CD2R6A', 'CD2R6D', 'CD2R6A'): ((1.8828, 0.0),), ('CD2R6A', 'CD2R6D', 'CD2R6A', 'HDR6A'): ((1.8828, 0.0),), ('HDR5C', 'CD2R6D', 'CD2R5A', 'CD2R5C'): ((1.8828, 0.0),), ('CD2R5C', 'CD2R5A', 'CD2R6D', 'HDR5C'): ((1.8828, 0.0),), ('HDR5C', 'CD2R5A', 'CD2R6D', 'CD2R5C'): ((1.8828, 0.0),), ('CD2R5C', 'CD2R6D', 'CD2R5A', 'HDR5C'): ((1.8828, 0.0),), ('ND2R5A', 'CD2R6F', 'CD2R5B', 'HDP1A'): ((1.8828, 0.0),), ('HDP1A', 'CD2R5B', 'CD2R6F', 'ND2R5A'): ((1.8828, 0.0),), ('ND2R5A', 'CD2R5B', 'CD2R6F', 'HDP1A'): ((1.8828, 0.0),), ('HDP1A', 'CD2R6F', 'CD2R5B', 'ND2R5A'): ((1.8828, 0.0),), ('CD2R6F', 'CD2R6F', 'CD2R6B', 'ND2R5A'): ((83.68, 0.0),), ('ND2R5A', 'CD2R6B', 'CD2R6F', 'CD2R6F'): ((83.68, 0.0),), ('CD2R6F', 'CD2R6B', 'CD2R6F', 'ND2R5A'): ((83.68, 0.0),), ('ND2R5A', 'CD2R6F', 'CD2R6B', 'CD2R6F'): ((83.68, 0.0),), ('CD2R6F', 'CD2R6F', 'ND2R6B', 'ND2R5B'): ((41.84, 0.0),), ('ND2R5B', 'ND2R6B', 'CD2R6F', 'CD2R6F'): ((41.84, 0.0),), ('CD2R6F', 'ND2R6B', 'CD2R6F', 'ND2R5B'): ((41.84, 0.0),), ('ND2R5B', 'CD2R6F', 'ND2R6B', 'CD2R6F'): ((41.84, 0.0),), ('CD2R6F', 'CD2R6F', 'CD2R6B', 'ND2R5B'): ((83.68, 0.0),), ('ND2R5B', 'CD2R6B', 'CD2R6F', 'CD2R6F'): ((83.68, 0.0),), ('CD2R6F', 'CD2R6B', 'CD2R6F', 'ND2R5B'): ((83.68, 0.0),), ('ND2R5B', 'CD2R6F', 'CD2R6B', 'CD2R6F'): ((83.68, 0.0),), ('CD2R6F', 'CD2R6F', 'ND2R6B', 'ND2R5A'): ((41.84, 0.0),), ('ND2R5A', 'ND2R6B', 'CD2R6F', 'CD2R6F'): ((41.84, 0.0),), ('CD2R6F', 'ND2R6B', 'CD2R6F', 'ND2R5A'): ((41.84, 0.0),), ('ND2R5A', 'CD2R6F', 'ND2R6B', 'CD2R6F'): ((41.84, 0.0),), ('CD2O4A', 'ND2R6B', 'ND2R6B', 'OD2C1B'): ((334.72, 0.0),), ('OD2C1B', 'ND2R6B', 'ND2R6B', 'CD2O4A'): ((334.72, 0.0),), ('CD2O4A', 'ND2R6C', 'ND2R6C', 'OD2C1B'): ((334.72, 0.0),), ('OD2C1B', 'ND2R6C', 'ND2R6C', 'CD2O4A'): ((334.72, 0.0),), ('CD2O4A', 'ND2R6C', 'ND2R6B', 'OD2C1B'): ((334.72, 0.0),), ('OD2C1B', 'ND2R6B', 'ND2R6C', 'CD2O4A'): ((334.72, 0.0),), ('CD2R6B', 'ND2R6B', 'CD2R6J', 'ND2B1'): ((251.04000000000002, 0.0),), ('ND2B1', 'CD2R6J', 'ND2R6B', 'CD2R6B'): ((251.04000000000002, 0.0),), ('ND2R6B', 'CD2R6H', 'CD2O4A', 'HDP1A'): ((4.184, 0.0),), ('HDP1A', 'CD2O4A', 'CD2R6H', 'ND2R6B'): ((4.184, 0.0),), ('ND2R6C', 'CD2R6H', 'CD2O4A', 'HDP1A'): ((4.184, 0.0),), ('HDP1A', 'CD2O4A', 'CD2R6H', 'ND2R6C'): ((4.184, 0.0),), ('ND2R6C', 'CD2R6H', 'CD2O4A', 'CD33A'): ((58.576, 0.0),), ('CD33A', 'CD2O4A', 'CD2R6H', 'ND2R6C'): ((58.576, 0.0),), ('CD2O4A', 'ND2R6B', 'ND2R6C', 'OD2C1B'): ((460.24, 0.0),), ('OD2C1B', 'ND2R6C', 'ND2R6B', 'CD2O4A'): ((460.24, 0.0),), ('CD2O4A', 'ND2R6C', 'CD2R6J', 'OD2C1B'): ((376.56, 0.0),), ('OD2C1B', 'CD2R6J', 'ND2R6C', 'CD2O4A'): ((376.56, 0.0),), ('CD2R6J', 'CD2O4A', 'CD2R6H', 'CD33A'): ((58.576, 0.0),), ('CD33A', 'CD2R6H', 'CD2O4A', 'CD2R6J'): ((58.576, 0.0),), ('CD2R6C', 'ND2R6B', 'ND2R6C', 'ND2B1'): ((167.36, 0.0),), ('ND2B1', 'ND2R6C', 'ND2R6B', 'CD2R6C'): ((167.36, 0.0),), ('CD2O4A', 'ND2R6C', 'CD2R6F', 'OD2C1B'): ((376.56, 0.0),), ('OD2C1B', 'CD2R6F', 'ND2R6C', 'CD2O4A'): ((376.56, 0.0),), ('ND2B1', 'HDP1A', 'CD2R6C', 'HDP1A'): ((25.104, 0.0),), ('HDP1A', 'CD2R6C', 'HDP1A', 'ND2B1'): ((25.104, 0.0),), ('OD2C3A', 'CD33A', 'OD30C', 'CD2O3A'): ((355.64, 0.0),), ('CD2O3A', 'OD30C', 'CD33A', 'OD2C3A'): ((355.64, 0.0),), ('OD2C3A', 'CD32A', 'OD30C', 'CD2O3A'): ((355.64, 0.0),), ('CD2O3A', 'OD30C', 'CD32A', 'OD2C3A'): ((355.64, 0.0),), ('OD2C3A', 'CD33C', 'OD30C', 'CD2O3A'): ((355.64, 0.0),), ('CD2O3A', 'OD30C', 'CD33C', 'OD2C3A'): ((355.64, 0.0),), ('OD2C3A', 'CD32C', 'OD30C', 'CD2O3A'): ((355.64, 0.0),), ('CD2O3A', 'OD30C', 'CD32C', 'OD2C3A'): ((355.64, 0.0),), ('OD2C3A', 'CD31C', 'OD30C', 'CD2O3A'): ((355.64, 0.0),), ('CD2O3A', 'OD30C', 'CD31C', 'OD2C3A'): ((355.64, 0.0),), ('CD2O3A', 'OD31F', 'CD33C', 'OD2C3A'): ((355.64, 0.0),), ('OD2C3A', 'CD33C', 'OD31F', 'CD2O3A'): ((355.64, 0.0),), ('CD2C1A', 'CD2C1A', 'CD32A', 'HD2C1A'): ((8.368, 0.0),), ('HD2C1A', 'CD32A', 'CD2C1A', 'CD2C1A'): ((8.368, 0.0),), ('CD2C1A', 'CD2C1B', 'CD32A', 'HD2C1A'): ((8.368, 0.0),), ('HD2C1A', 'CD32A', 'CD2C1B', 'CD2C1A'): ((8.368, 0.0),), ('CD2C1A', 'CD32A', 'CD2C1A', 'HD2C1A'): ((8.368, 0.0),), ('HD2C1A', 'CD2C1A', 'CD32A', 'CD2C1A'): ((8.368, 0.0),), ('CD2C1A', 'CD32A', 'CD2C1B', 'HD2C1A'): ((8.368, 0.0),), ('HD2C1A', 'CD2C1B', 'CD32A', 'CD2C1A'): ((8.368, 0.0),), ('CD2C1A', 'CD2C1A', 'CD33A', 'HD2C1A'): ((8.368, 0.0),), ('HD2C1A', 'CD33A', 'CD2C1A', 'CD2C1A'): ((8.368, 0.0),), ('CD2C1A', 'CD2C1B', 'CD33A', 'HD2C1A'): ((8.368, 0.0),), ('HD2C1A', 'CD33A', 'CD2C1B', 'CD2C1A'): ((8.368, 0.0),), ('CD2O1D', 'CD33C', 'CD33C', 'OD2C1D'): ((410.03200000000004, 0.0),), ('OD2C1D', 'CD33C', 'CD33C', 'CD2O1D'): ((410.03200000000004, 0.0),), ('CD2O1D', 'CD33C', 'CD32C', 'OD2C1D'): ((389.112, 0.0),), ('OD2C1D', 'CD32C', 'CD33C', 'CD2O1D'): ((389.112, 0.0),), ('CD2O1D', 'CD32C', 'CD32C', 'OD2C1D'): ((397.48, 0.0),), ('OD2C1D', 'CD32C', 'CD32C', 'CD2O1D'): ((397.48, 0.0),), ('CD2O1C', 'HDP1C', 'CD33C', 'OD2C1D'): ((313.8, 0.0),), ('OD2C1D', 'CD33C', 'HDP1C', 'CD2O1C'): ((313.8, 0.0),), ('CD2O1C', 'HDP1C', 'CD32C', 'OD2C1D'): ((298.3192, 0.0),), ('OD2C1D', 'CD32C', 'HDP1C', 'CD2O1C'): ((298.3192, 0.0),), ('CD2O1C', 'HDP1C', 'CD33C', 'OD2C1C'): ((313.8, 0.0),), ('OD2C1C', 'CD33C', 'HDP1C', 'CD2O1C'): ((313.8, 0.0),), ('CD2O1C', 'HDP1C', 'CD32C', 'OD2C1C'): ((298.3192, 0.0),), ('OD2C1C', 'CD32C', 'HDP1C', 'CD2O1C'): ((298.3192, 0.0),), ('CD2O1C', 'HDP1C', 'CD31C', 'OD2C1C'): ((298.3192, 0.0),), ('OD2C1C', 'CD31C', 'HDP1C', 'CD2O1C'): ((298.3192, 0.0),), ('CD2O1C', 'HDP1C', 'CD31G', 'OD2C1C'): ((298.3192, 0.0),), ('OD2C1C', 'CD31G', 'HDP1C', 'CD2O1C'): ((298.3192, 0.0),), ('CD2O1D', 'CD32F', 'CD31G', 'OD2C1D'): ((389.112, 0.0),), ('OD2C1D', 'CD31G', 'CD32F', 'CD2O1D'): ((389.112, 0.0),), ('CD2O1C', 'ND2A1', 'OD2C1D', 'HDP1C'): ((292.88, 0.0),), ('HDP1C', 'OD2C1D', 'ND2A1', 'CD2O1C'): ((292.88, 0.0),), ('CD2O1A', 'CD31DC', 'ND3A3', 'OD2C1A'): ((0.0, 0.0),), ('OD2C1A', 'ND3A3', 'CD31DC', 'CD2O1A'): ((0.0, 0.0),), ('ND3A3', 'CD2O1A', 'CD31DC', 'CD32A'): ((0.0, 0.0),), ('CD32A', 'CD31DC', 'CD2O1A', 'ND3A3'): ((0.0, 0.0),), ('CD2O1A', 'CD31DC', 'ND2A1', 'OD2C1A'): ((502.08000000000004, 0.0),), ('OD2C1A', 'ND2A1', 'CD31DC', 'CD2O1A'): ((502.08000000000004, 0.0),), ('OD2C2A', 'CD31DC', 'OD2C2A', 'CD2O2A'): ((297.064, 0.0),), ('CD2O2A', 'OD2C2A', 'CD31DC', 'OD2C2A'): ((297.064, 0.0),), ('OD2C3A', 'CD31DC', 'OD31F', 'CD2O3A'): ((355.64, 0.0),), ('CD2O3A', 'OD31F', 'CD31DC', 'OD2C3A'): ((355.64, 0.0),), ('CD2O1A', 'CD31DC', 'ND2A2', 'OD2C1A'): ((155.64480000000003, 0.0),), ('OD2C1A', 'ND2A2', 'CD31DC', 'CD2O1A'): ((155.64480000000003, 0.0),), ('ND2A2', 'CD2O1A', 'CD31DC', 'HDP1A'): ((128.4488, 0.0),), ('HDP1A', 'CD31DC', 'CD2O1A', 'ND2A2'): ((128.4488, 0.0),), ('CD2O2A', 'OD2C2A', 'OD2C2A', 'CD31DC'): ((297.064, 0.0),), ('CD31DC', 'OD2C2A', 'OD2C2A', 'CD2O2A'): ((297.064, 0.0),), ('OD2C3A', 'CD31DC', 'OD30C', 'CD2O3A'): ((355.64, 0.0),), ('CD2O3A', 'OD30C', 'CD31DC', 'OD2C3A'): ((355.64, 0.0),), ('CD2O1C', 'HDP1C', 'CD31DC', 'OD2C1C'): ((298.3192, 0.0),), ('OD2C1C', 'CD31DC', 'HDP1C', 'CD2O1C'): ((298.3192, 0.0),), ('ND2A2', 'CD2O1A', 'CD31HB', 'HDP1A'): ((128.4488, 0.0),), ('HDP1A', 'CD31HB', 'CD2O1A', 'ND2A2'): ((128.4488, 0.0),), ('CD2O2A', 'CD31HC', 'OD2C2A', 'OD2C2A'): ((297.064, 0.0),), ('OD2C2A', 'OD2C2A', 'CD31HC', 'CD2O2A'): ((297.064, 0.0),), ('CD2O2A', 'CD30HA', 'OD2C2A', 'OD2C2A'): ((297.064, 0.0),), ('OD2C2A', 'OD2C2A', 'CD30HA', 'CD2O2A'): ((297.064, 0.0),), ('ND2A2', 'CD2O1A', 'CD31HA', 'HDP1A'): ((128.4488, 0.0),), ('HDP1A', 'CD31HA', 'CD2O1A', 'ND2A2'): ((128.4488, 0.0),)}\n+periodic_improper_types = {\n+}\n+harmonic_improper_types = {\n+ ('OD2C3A', 'CD32C', 'OD31F', 'CD2O3A'): ((355.64, 0.0),),\n+ ('CD2O3A', 'OD31F', 'CD32C', 'OD2C3A'): ((355.64, 0.0),),\n+ ('CD2O1A', 'CD32A', 'ND2A2', 'OD2C1A'): ((418.40000000000003, 0.0),),\n+ ('OD2C1A', 'ND2A2', 'CD32A', 'CD2O1A'): ((418.40000000000003, 0.0),),\n+ ('CD2O1A', 'CD31C', 'ND3A3', 'OD2C1A'): ((0.0, 0.0),),\n+ ('OD2C1A', 'ND3A3', 'CD31C', 'CD2O1A'): ((0.0, 0.0),),\n+ ('CD2O1A', 'CD32C', 'ND3A3', 'OD2C1A'): ((0.0, 0.0),),\n+ ('OD2C1A', 'ND3A3', 'CD32C', 'CD2O1A'): ((0.0, 0.0),),\n+ ('ND3A3', 'CD2O1A', 'CD31C', 'CD32A'): ((0.0, 0.0),),\n+ ('CD32A', 'CD31C', 'CD2O1A', 'ND3A3'): ((0.0, 0.0),),\n+ ('CD2O1A', 'CD31C', 'ND2A1', 'OD2C1A'): ((502.08000000000004, 0.0),),\n+ ('OD2C1A', 'ND2A1', 'CD31C', 'CD2O1A'): ((502.08000000000004, 0.0),),\n+ ('CD2O1A', 'CD31A', 'ND2A2', 'OD2C1A'): ((502.08000000000004, 0.0),),\n+ ('OD2C1A', 'ND2A2', 'CD31A', 'CD2O1A'): ((502.08000000000004, 0.0),),\n+ ('CD2O1A', 'CD32A', 'ND3A3', 'OD2C1A'): ((502.08000000000004, 0.0),),\n+ ('OD2C1A', 'ND3A3', 'CD32A', 'CD2O1A'): ((502.08000000000004, 0.0),),\n+ ('CD2O1A', 'CD33C', 'ND3A3', 'OD2C1A'): ((502.08000000000004, 0.0),),\n+ ('OD2C1A', 'ND3A3', 'CD33C', 'CD2O1A'): ((502.08000000000004, 0.0),),\n+ ('OD2C2A', 'CD31A', 'OD2C2A', 'CD2O2A'): ((297.064, 0.0),),\n+ ('CD2O2A', 'OD2C2A', 'CD31A', 'OD2C2A'): ((297.064, 0.0),),\n+ ('OD2C2A', 'CD32A', 'OD2C2A', 'CD2O2A'): ((297.064, 0.0),),\n+ ('CD2O2A', 'OD2C2A', 'CD32A', 'OD2C2A'): ((297.064, 0.0),),\n+ ('OD2C2A', 'CD33A', 'OD2C2A', 'CD2O2A'): ((297.064, 0.0),),\n+ ('CD2O2A', 'OD2C2A', 'CD33A', 'OD2C2A'): ((297.064, 0.0),),\n+ ('OD2C2A', 'CD31C', 'OD2C2A', 'CD2O2A'): ((297.064, 0.0),),\n+ ('CD2O2A', 'OD2C2A', 'CD31C', 'OD2C2A'): ((297.064, 0.0),),\n+ ('OD2C2A', 'CD32C', 'OD2C2A', 'CD2O2A'): ((297.064, 0.0),),\n+ ('CD2O2A', 'OD2C2A', 'CD32C', 'OD2C2A'): ((297.064, 0.0),),\n+ ('OD2C3A', 'CD31C', 'OD31F', 'CD2O3A'): ((355.64, 0.0),),\n+ ('CD2O3A', 'OD31F', 'CD31C', 'OD2C3A'): ((355.64, 0.0),),\n+ ('OD2C3A', 'CD31A', 'OD31F', 'CD2O3A'): ((355.64, 0.0),),\n+ ('CD2O3A', 'OD31F', 'CD31A', 'OD2C3A'): ((355.64, 0.0),),\n+ ('CD2O1A', 'CD32C', 'ND2A1', 'OD2C1A'): ((376.56, 0.0),),\n+ ('OD2C1A', 'ND2A1', 'CD32C', 'CD2O1A'): ((376.56, 0.0),),\n+ ('CD2O1A', 'CD31C', 'ND2A2', 'OD2C1A'): ((155.64480000000003, 0.0),),\n+ ('OD2C1A', 'ND2A2', 'CD31C', 'CD2O1A'): ((155.64480000000003, 0.0),),\n+ ('CD2O1A', 'CD32C', 'ND2A2', 'OD2C1A'): ((418.40000000000003, 0.0),),\n+ ('OD2C1A', 'ND2A2', 'CD32C', 'CD2O1A'): ((418.40000000000003, 0.0),),\n+ ('CD2O1A', 'CD33C', 'ND2A2', 'OD2C1A'): ((374.04960000000005, 0.0),),\n+ ('OD2C1A', 'ND2A2', 'CD33C', 'CD2O1A'): ((374.04960000000005, 0.0),),\n+ ('OD2C1A', 'ND2A1', 'CD33C', 'CD2O1A'): ((376.56, 0.0),),\n+ ('CD2O1A', 'CD33C', 'ND2A1', 'OD2C1A'): ((376.56, 0.0),),\n+ ('ND2A1', 'HDP1A', 'HDP1A', 'CD2O1A'): ((16.736, 0.0),),\n+ ('CD2O1A', 'HDP1A', 'HDP1A', 'ND2A1'): ((16.736, 0.0),),\n+ ('OD2C1A', 'ND2A3', 'CD33C', 'CD2O1A'): ((251.04000000000002, 0.0),),\n+ ('CD2O1A', 'CD33C', 'ND2A3', 'OD2C1A'): ((251.04000000000002, 0.0),),\n+ ('ND2A2', 'CD2O1A', 'CD31C', 'HDP1A'): ((128.4488, 0.0),),\n+ ('HDP1A', 'CD31C', 'CD2O1A', 'ND2A2'): ((128.4488, 0.0),),\n+ ('ND2A2', 'CD2O1A', 'CD32C', 'HDP1A'): ((167.36, 0.0),),\n+ ('HDP1A', 'CD32C', 'CD2O1A', 'ND2A2'): ((167.36, 0.0),),\n+ ('ND2A2', 'CD2O1A', 'CD33C', 'HDP1A'): ((148.9504, 0.0),),\n+ ('HDP1A', 'CD33C', 'CD2O1A', 'ND2A2'): ((148.9504, 0.0),),\n+ ('CD2O2A', 'OD2C2A', 'OD2C2A', 'CD33A'): ((297.064, 0.0),),\n+ ('CD33A', 'OD2C2A', 'OD2C2A', 'CD2O2A'): ((297.064, 0.0),),\n+ ('CD2O2A', 'OD2C2A', 'OD2C2A', 'CD32A'): ((297.064, 0.0),),\n+ ('CD32A', 'OD2C2A', 'OD2C2A', 'CD2O2A'): ((297.064, 0.0),),\n+ ('CD2O2A', 'OD2C2A', 'OD2C2A', 'CD32C'): ((297.064, 0.0),),\n+ ('CD32C', 'OD2C2A', 'OD2C2A', 'CD2O2A'): ((297.064, 0.0),),\n+ ('CD2O2A', 'OD2C2A', 'OD2C2A', 'CD31A'): ((297.064, 0.0),),\n+ ('CD31A', 'OD2C2A', 'OD2C2A', 'CD2O2A'): ((297.064, 0.0),),\n+ ('CD2O2A', 'OD2C2A', 'OD2C2A', 'CD31C'): ((297.064, 0.0),),\n+ ('CD31C', 'OD2C2A', 'OD2C2A', 'CD2O2A'): ((297.064, 0.0),),\n+ ('ND2R5A', 'CD2R5A', 'CD2R5B', 'HDP1A'): ((1.8828, 0.0),),\n+ ('HDP1A', 'CD2R5B', 'CD2R5A', 'ND2R5A'): ((1.8828, 0.0),),\n+ ('ND2R5A', 'CD2R5B', 'CD2R5A', 'HDP1A'): ((1.8828, 0.0),),\n+ ('HDP1A', 'CD2R5A', 'CD2R5B', 'ND2R5A'): ((1.8828, 0.0),),\n+ ('CD2R5A', 'CD2R5A', 'ND2R5B', 'HDR5A'): ((2.092, 0.0),),\n+ ('HDR5A', 'ND2R5B', 'CD2R5A', 'CD2R5A'): ((2.092, 0.0),),\n+ ('CD2R5A', 'ND2R5B', 'CD2R5A', 'HDR5A'): ((2.092, 0.0),),\n+ ('HDR5A', 'CD2R5A', 'ND2R5B', 'CD2R5A'): ((2.092, 0.0),),\n+ ('CD2R5B', 'ND2R5A', 'ND2R5B', 'HDR5B'): ((2.092, 0.0),),\n+ ('HDR5B', 'ND2R5B', 'ND2R5A', 'CD2R5B'): ((2.092, 0.0),),\n+ ('CD2R5B', 'ND2R5B', 'ND2R5A', 'HDR5B'): ((2.092, 0.0),),\n+ ('HDR5B', 'ND2R5A', 'ND2R5B', 'CD2R5B'): ((2.092, 0.0),),\n+ ('CD2R5A', 'CD2R5A', 'ND2R5A', 'HDR5A'): ((2.092, 0.0),),\n+ ('HDR5A', 'ND2R5A', 'CD2R5A', 'CD2R5A'): ((2.092, 0.0),),\n+ ('CD2R5A', 'ND2R5A', 'CD2R5A', 'HDR5A'): ((2.092, 0.0),),\n+ ('HDR5A', 'CD2R5A', 'ND2R5A', 'CD2R5A'): ((2.092, 0.0),),\n+ ('ND2R5C', 'CD2R5E', 'CD2R5D', 'HDP1A'): ((1.8828, 0.0),),\n+ ('HDP1A', 'CD2R5D', 'CD2R5E', 'ND2R5C'): ((1.8828, 0.0),),\n+ ('CD2R5D', 'CD2R5D', 'ND2R5C', 'HDR5D'): ((2.092, 0.0),),\n+ ('HDR5D', 'ND2R5C', 'CD2R5D', 'CD2R5D'): ((2.092, 0.0),),\n+ ('CD2R5E', 'ND2R5C', 'ND2R5C', 'HDR5E'): ((2.092, 0.0),),\n+ ('HDR5E', 'ND2R5C', 'ND2R5C', 'CD2R5E'): ((2.092, 0.0),),\n+ ('CD2N1A', 'ND2P1A', 'ND2P1A', 'ND2P1A'): ((167.36, 0.0),),\n+ ('ND2P1A', 'ND2P1A', 'ND2P1A', 'CD2N1A'): ((167.36, 0.0),),\n+ ('HDR5A', 'ND2R5A', 'CD2R5C', 'CD2R5A'): ((1.8828, 0.0),),\n+ ('CD2R5A', 'CD2R5C', 'ND2R5A', 'HDR5A'): ((1.8828, 0.0),),\n+ ('HDR5A', 'CD2R5C', 'ND2R5A', 'CD2R5A'): ((1.8828, 0.0),),\n+ ('CD2R5A', 'ND2R5A', 'CD2R5C', 'HDR5A'): ((1.8828, 0.0),),\n+ ('HDP1A', 'CD2R5A', 'CD2R5A', 'ND2R5A'): ((1.8828, 0.0),),\n+ ('ND2R5A', 'CD2R5A', 'CD2R5A', 'HDP1A'): ((1.8828, 0.0),),\n+ ('HDR5C', 'CD2R5A', 'CD2R5C', 'CD2R5C'): ((1.8828, 0.0),),\n+ ('CD2R5C', 'CD2R5C', 'CD2R5A', 'HDR5C'): ((1.8828, 0.0),),\n+ ('HDR5C', 'CD2R5C', 'CD2R5A', 'CD2R5C'): ((1.8828, 0.0),),\n+ ('CD2R5C', 'CD2R5A', 'CD2R5C', 'HDR5C'): ((1.8828, 0.0),),\n+ ('HDP1A', 'CD2R5A', 'CD2R6D', 'ND2R5A'): ((1.8828, 0.0),),\n+ ('ND2R5A', 'CD2R6D', 'CD2R5A', 'HDP1A'): ((1.8828, 0.0),),\n+ ('HDP1A', 'CD2R6D', 'CD2R5A', 'ND2R5A'): ((1.8828, 0.0),),\n+ ('ND2R5A', 'CD2R5A', 'CD2R6D', 'HDP1A'): ((1.8828, 0.0),),\n+ ('CD2R6A', 'CD2R6A', 'CD2R6D', 'HDR6A'): ((1.8828, 0.0),),\n+ ('HDR6A', 'CD2R6D', 'CD2R6A', 'CD2R6A'): ((1.8828, 0.0),),\n+ ('HDR6A', 'CD2R6A', 'CD2R6D', 'CD2R6A'): ((1.8828, 0.0),),\n+ ('CD2R6A', 'CD2R6D', 'CD2R6A', 'HDR6A'): ((1.8828, 0.0),),\n+ ('HDR5C', 'CD2R6D', 'CD2R5A', 'CD2R5C'): ((1.8828, 0.0),),\n+ ('CD2R5C', 'CD2R5A', 'CD2R6D', 'HDR5C'): ((1.8828, 0.0),),\n+ ('HDR5C', 'CD2R5A', 'CD2R6D', 'CD2R5C'): ((1.8828, 0.0),),\n+ ('CD2R5C', 'CD2R6D', 'CD2R5A', 'HDR5C'): ((1.8828, 0.0),),\n+ ('ND2R5A', 'CD2R6F', 'CD2R5B', 'HDP1A'): ((1.8828, 0.0),),\n+ ('HDP1A', 'CD2R5B', 'CD2R6F', 'ND2R5A'): ((1.8828, 0.0),),\n+ ('ND2R5A', 'CD2R5B', 'CD2R6F', 'HDP1A'): ((1.8828, 0.0),),\n+ ('HDP1A', 'CD2R6F', 'CD2R5B', 'ND2R5A'): ((1.8828, 0.0),),\n+ ('CD2R6F', 'CD2R6F', 'CD2R6B', 'ND2R5A'): ((83.68, 0.0),),\n+ ('ND2R5A', 'CD2R6B', 'CD2R6F', 'CD2R6F'): ((83.68, 0.0),),\n+ ('CD2R6F', 'CD2R6B', 'CD2R6F', 'ND2R5A'): ((83.68, 0.0),),\n+ ('ND2R5A', 'CD2R6F', 'CD2R6B', 'CD2R6F'): ((83.68, 0.0),),\n+ ('CD2R6F', 'CD2R6F', 'ND2R6B', 'ND2R5B'): ((41.84, 0.0),),\n+ ('ND2R5B', 'ND2R6B', 'CD2R6F', 'CD2R6F'): ((41.84, 0.0),),\n+ ('CD2R6F', 'ND2R6B', 'CD2R6F', 'ND2R5B'): ((41.84, 0.0),),\n+ ('ND2R5B', 'CD2R6F', 'ND2R6B', 'CD2R6F'): ((41.84, 0.0),),\n+ ('CD2R6F', 'CD2R6F', 'CD2R6B', 'ND2R5B'): ((83.68, 0.0),),\n+ ('ND2R5B', 'CD2R6B', 'CD2R6F', 'CD2R6F'): ((83.68, 0.0),),\n+ ('CD2R6F', 'CD2R6B', 'CD2R6F', 'ND2R5B'): ((83.68, 0.0),),\n+ ('ND2R5B', 'CD2R6F', 'CD2R6B', 'CD2R6F'): ((83.68, 0.0),),\n+ ('CD2R6F', 'CD2R6F', 'ND2R6B', 'ND2R5A'): ((41.84, 0.0),),\n+ ('ND2R5A', 'ND2R6B', 'CD2R6F', 'CD2R6F'): ((41.84, 0.0),),\n+ ('CD2R6F', 'ND2R6B', 'CD2R6F', 'ND2R5A'): ((41.84, 0.0),),\n+ ('ND2R5A', 'CD2R6F', 'ND2R6B', 'CD2R6F'): ((41.84, 0.0),),\n+ ('CD2O4A', 'ND2R6B', 'ND2R6B', 'OD2C1B'): ((334.72, 0.0),),\n+ ('OD2C1B', 'ND2R6B', 'ND2R6B', 'CD2O4A'): ((334.72, 0.0),),\n+ ('CD2O4A', 'ND2R6C', 'ND2R6C', 'OD2C1B'): ((334.72, 0.0),),\n+ ('OD2C1B', 'ND2R6C', 'ND2R6C', 'CD2O4A'): ((334.72, 0.0),),\n+ ('CD2O4A', 'ND2R6C', 'ND2R6B', 'OD2C1B'): ((334.72, 0.0),),\n+ ('OD2C1B', 'ND2R6B', 'ND2R6C', 'CD2O4A'): ((334.72, 0.0),),\n+ ('CD2R6B', 'ND2R6B', 'CD2R6J', 'ND2B1'): ((251.04000000000002, 0.0),),\n+ ('ND2B1', 'CD2R6J', 'ND2R6B', 'CD2R6B'): ((251.04000000000002, 0.0),),\n+ ('ND2R6B', 'CD2R6H', 'CD2O4A', 'HDP1A'): ((4.184, 0.0),),\n+ ('HDP1A', 'CD2O4A', 'CD2R6H', 'ND2R6B'): ((4.184, 0.0),),\n+ ('ND2R6C', 'CD2R6H', 'CD2O4A', 'HDP1A'): ((4.184, 0.0),),\n+ ('HDP1A', 'CD2O4A', 'CD2R6H', 'ND2R6C'): ((4.184, 0.0),),\n+ ('ND2R6C', 'CD2R6H', 'CD2O4A', 'CD33A'): ((58.576, 0.0),),\n+ ('CD33A', 'CD2O4A', 'CD2R6H', 'ND2R6C'): ((58.576, 0.0),),\n+ ('CD2O4A', 'ND2R6B', 'ND2R6C', 'OD2C1B'): ((460.24, 0.0),),\n+ ('OD2C1B', 'ND2R6C', 'ND2R6B', 'CD2O4A'): ((460.24, 0.0),),\n+ ('CD2O4A', 'ND2R6C', 'CD2R6J', 'OD2C1B'): ((376.56, 0.0),),\n+ ('OD2C1B', 'CD2R6J', 'ND2R6C', 'CD2O4A'): ((376.56, 0.0),),\n+ ('CD2R6J', 'CD2O4A', 'CD2R6H', 'CD33A'): ((58.576, 0.0),),\n+ ('CD33A', 'CD2R6H', 'CD2O4A', 'CD2R6J'): ((58.576, 0.0),),\n+ ('CD2R6C', 'ND2R6B', 'ND2R6C', 'ND2B1'): ((167.36, 0.0),),\n+ ('ND2B1', 'ND2R6C', 'ND2R6B', 'CD2R6C'): ((167.36, 0.0),),\n+ ('CD2O4A', 'ND2R6C', 'CD2R6F', 'OD2C1B'): ((376.56, 0.0),),\n+ ('OD2C1B', 'CD2R6F', 'ND2R6C', 'CD2O4A'): ((376.56, 0.0),),\n+ ('ND2B1', 'HDP1A', 'CD2R6C', 'HDP1A'): ((25.104, 0.0),),\n+ ('HDP1A', 'CD2R6C', 'HDP1A', 'ND2B1'): ((25.104, 0.0),),\n+ ('OD2C3A', 'CD33A', 'OD30C', 'CD2O3A'): ((355.64, 0.0),),\n+ ('CD2O3A', 'OD30C', 'CD33A', 'OD2C3A'): ((355.64, 0.0),),\n+ ('OD2C3A', 'CD32A', 'OD30C', 'CD2O3A'): ((355.64, 0.0),),\n+ ('CD2O3A', 'OD30C', 'CD32A', 'OD2C3A'): ((355.64, 0.0),),\n+ ('OD2C3A', 'CD33C', 'OD30C', 'CD2O3A'): ((355.64, 0.0),),\n+ ('CD2O3A', 'OD30C', 'CD33C', 'OD2C3A'): ((355.64, 0.0),),\n+ ('OD2C3A', 'CD32C', 'OD30C', 'CD2O3A'): ((355.64, 0.0),),\n+ ('CD2O3A', 'OD30C', 'CD32C', 'OD2C3A'): ((355.64, 0.0),),\n+ ('OD2C3A', 'CD31C', 'OD30C', 'CD2O3A'): ((355.64, 0.0),),\n+ ('CD2O3A', 'OD30C', 'CD31C', 'OD2C3A'): ((355.64, 0.0),),\n+ ('CD2O3A', 'OD31F', 'CD33C', 'OD2C3A'): ((355.64, 0.0),),\n+ ('OD2C3A', 'CD33C', 'OD31F', 'CD2O3A'): ((355.64, 0.0),),\n+ ('CD2C1A', 'CD2C1A', 'CD32A', 'HD2C1A'): ((8.368, 0.0),),\n+ ('HD2C1A', 'CD32A', 'CD2C1A', 'CD2C1A'): ((8.368, 0.0),),\n+ ('CD2C1A', 'CD2C1B', 'CD32A', 'HD2C1A'): ((8.368, 0.0),),\n+ ('HD2C1A', 'CD32A', 'CD2C1B', 'CD2C1A'): ((8.368, 0.0),),\n+ ('CD2C1A', 'CD32A', 'CD2C1A', 'HD2C1A'): ((8.368, 0.0),),\n+ ('HD2C1A', 'CD2C1A', 'CD32A', 'CD2C1A'): ((8.368, 0.0),),\n+ ('CD2C1A', 'CD32A', 'CD2C1B', 'HD2C1A'): ((8.368, 0.0),),\n+ ('HD2C1A', 'CD2C1B', 'CD32A', 'CD2C1A'): ((8.368, 0.0),),\n+ ('CD2C1A', 'CD2C1A', 'CD33A', 'HD2C1A'): ((8.368, 0.0),),\n+ ('HD2C1A', 'CD33A', 'CD2C1A', 'CD2C1A'): ((8.368, 0.0),),\n+ ('CD2C1A', 'CD2C1B', 'CD33A', 'HD2C1A'): ((8.368, 0.0),),\n+ ('HD2C1A', 'CD33A', 'CD2C1B', 'CD2C1A'): ((8.368, 0.0),),\n+ ('CD2O1D', 'CD33C', 'CD33C', 'OD2C1D'): ((410.03200000000004, 0.0),),\n+ ('OD2C1D', 'CD33C', 'CD33C', 'CD2O1D'): ((410.03200000000004, 0.0),),\n+ ('CD2O1D', 'CD33C', 'CD32C', 'OD2C1D'): ((389.112, 0.0),),\n+ ('OD2C1D', 'CD32C', 'CD33C', 'CD2O1D'): ((389.112, 0.0),),\n+ ('CD2O1D', 'CD32C', 'CD32C', 'OD2C1D'): ((397.48, 0.0),),\n+ ('OD2C1D', 'CD32C', 'CD32C', 'CD2O1D'): ((397.48, 0.0),),\n+ ('CD2O1C', 'HDP1C', 'CD33C', 'OD2C1D'): ((313.8, 0.0),),\n+ ('OD2C1D', 'CD33C', 'HDP1C', 'CD2O1C'): ((313.8, 0.0),),\n+ ('CD2O1C', 'HDP1C', 'CD32C', 'OD2C1D'): ((298.3192, 0.0),),\n+ ('OD2C1D', 'CD32C', 'HDP1C', 'CD2O1C'): ((298.3192, 0.0),),\n+ ('CD2O1C', 'HDP1C', 'CD33C', 'OD2C1C'): ((313.8, 0.0),),\n+ ('OD2C1C', 'CD33C', 'HDP1C', 'CD2O1C'): ((313.8, 0.0),),\n+ ('CD2O1C', 'HDP1C', 'CD32C', 'OD2C1C'): ((298.3192, 0.0),),\n+ ('OD2C1C', 'CD32C', 'HDP1C', 'CD2O1C'): ((298.3192, 0.0),),\n+ ('CD2O1C', 'HDP1C', 'CD31C', 'OD2C1C'): ((298.3192, 0.0),),\n+ ('OD2C1C', 'CD31C', 'HDP1C', 'CD2O1C'): ((298.3192, 0.0),),\n+ ('CD2O1C', 'HDP1C', 'CD31G', 'OD2C1C'): ((298.3192, 0.0),),\n+ ('OD2C1C', 'CD31G', 'HDP1C', 'CD2O1C'): ((298.3192, 0.0),),\n+ ('CD2O1D', 'CD32F', 'CD31G', 'OD2C1D'): ((389.112, 0.0),),\n+ ('OD2C1D', 'CD31G', 'CD32F', 'CD2O1D'): ((389.112, 0.0),),\n+ ('CD2O1C', 'ND2A1', 'OD2C1D', 'HDP1C'): ((292.88, 0.0),),\n+ ('HDP1C', 'OD2C1D', 'ND2A1', 'CD2O1C'): ((292.88, 0.0),),\n+ ('CD2O1A', 'CD31DC', 'ND3A3', 'OD2C1A'): ((0.0, 0.0),),\n+ ('OD2C1A', 'ND3A3', 'CD31DC', 'CD2O1A'): ((0.0, 0.0),),\n+ ('ND3A3', 'CD2O1A', 'CD31DC', 'CD32A'): ((0.0, 0.0),),\n+ ('CD32A', 'CD31DC', 'CD2O1A', 'ND3A3'): ((0.0, 0.0),),\n+ ('CD2O1A', 'CD31DC', 'ND2A1', 'OD2C1A'): ((502.08000000000004, 0.0),),\n+ ('OD2C1A', 'ND2A1', 'CD31DC', 'CD2O1A'): ((502.08000000000004, 0.0),),\n+ ('OD2C2A', 'CD31DC', 'OD2C2A', 'CD2O2A'): ((297.064, 0.0),),\n+ ('CD2O2A', 'OD2C2A', 'CD31DC', 'OD2C2A'): ((297.064, 0.0),),\n+ ('OD2C3A', 'CD31DC', 'OD31F', 'CD2O3A'): ((355.64, 0.0),),\n+ ('CD2O3A', 'OD31F', 'CD31DC', 'OD2C3A'): ((355.64, 0.0),),\n+ ('CD2O1A', 'CD31DC', 'ND2A2', 'OD2C1A'): ((155.64480000000003, 0.0),),\n+ ('OD2C1A', 'ND2A2', 'CD31DC', 'CD2O1A'): ((155.64480000000003, 0.0),),\n+ ('ND2A2', 'CD2O1A', 'CD31DC', 'HDP1A'): ((128.4488, 0.0),),\n+ ('HDP1A', 'CD31DC', 'CD2O1A', 'ND2A2'): ((128.4488, 0.0),),\n+ ('CD2O2A', 'OD2C2A', 'OD2C2A', 'CD31DC'): ((297.064, 0.0),),\n+ ('CD31DC', 'OD2C2A', 'OD2C2A', 'CD2O2A'): ((297.064, 0.0),),\n+ ('OD2C3A', 'CD31DC', 'OD30C', 'CD2O3A'): ((355.64, 0.0),),\n+ ('CD2O3A', 'OD30C', 'CD31DC', 'OD2C3A'): ((355.64, 0.0),),\n+ ('CD2O1C', 'HDP1C', 'CD31DC', 'OD2C1C'): ((298.3192, 0.0),),\n+ ('OD2C1C', 'CD31DC', 'HDP1C', 'CD2O1C'): ((298.3192, 0.0),),\n+ ('ND2A2', 'CD2O1A', 'CD31HB', 'HDP1A'): ((128.4488, 0.0),),\n+ ('HDP1A', 'CD31HB', 'CD2O1A', 'ND2A2'): ((128.4488, 0.0),),\n+ ('CD2O2A', 'CD31HC', 'OD2C2A', 'OD2C2A'): ((297.064, 0.0),),\n+ ('OD2C2A', 'OD2C2A', 'CD31HC', 'CD2O2A'): ((297.064, 0.0),),\n+ ('CD2O2A', 'CD30HA', 'OD2C2A', 'OD2C2A'): ((297.064, 0.0),),\n+ ('OD2C2A', 'OD2C2A', 'CD30HA', 'CD2O2A'): ((297.064, 0.0),),\n+ ('ND2A2', 'CD2O1A', 'CD31HA', 'HDP1A'): ((128.4488, 0.0),),\n+ ('HDP1A', 'CD31HA', 'CD2O1A', 'ND2A2'): ((128.4488, 0.0),),\n+}\n+\n+def extract_atom_name(raw_atom_name, templates):\n+ # Process Drude particles.\n+ atom_name_prefix = \"\"\n+ if raw_atom_name.startswith(\"Drude-\"):\n+ raw_atom_name = raw_atom_name[len(\"Drude-\"):]\n+ atom_name_prefix = \"D\"\n+\n+ # Return None to indicate an atom without template name information.\n+ atom_name_parts = raw_atom_name.rsplit(\"-\", maxsplit=1)\n+ if len(atom_name_parts) < 2:\n+ return None\n+ templates.add(atom_name_parts[0])\n+ return f\"{atom_name_prefix}{atom_name_parts[1]}\"\n \n def is_valid_improper(atom_indices):\n index_1, index_2, index_3, index_4 = atom_indices\n@@ -30542,23 +30887,38 @@ def find_improper(improper_types, atom_classes):\n \n residue_data = []\n \n-for residue in topology.residues():\n- # Extract the residue or patch names and atom names from the atom type names.\n- templates = []\n- atom_names = []\n- for atom in residue.atoms():\n- raw_atom_name = data.atomType[atom]\n- atom_is_drude = raw_atom_name.startswith(\"Drude-\")\n- if atom_is_drude:\n- atom_name_parts = raw_atom_name[len(\"Drude-\"):].rsplit(\"-\", maxsplit=1)\n- atom_names.append(f\"D{atom_name_parts[1]}\")\n- else:\n- atom_name_parts = raw_atom_name.rsplit(\"-\", maxsplit=1)\n- atom_names.append(atom_name_parts[1])\n- templates.append(atom_name_parts[0])\n+for residue_index, residue in enumerate(topology.residues()):\n+ # Extract the residue or patch names and atom names.\n+ template_data = templateForResidue[residue_index]\n+ templates = set()\n+ if template_data is None:\n+ # Multi-residue patch; fall back to parsing atom names because OpenMM\n+ # leaves None in templateForResidue in this case.\n+ atom_names = []\n+ skip_residue = False\n+ for atom in residue.atoms():\n+ atom_name = extract_atom_name(data.atomType[atom], templates)\n+ if atom_name is None:\n+ # Skip residues containing atoms without template name data\n+ # (they might be from, e.g., another solvent force field file).\n+ skip_residue = True\n+ break\n+ atom_names.append(atom_name)\n+ if skip_residue:\n+ residue_data.append(([], [], []))\n+ continue\n+ else:\n+ # Extract names from template name.\n+ for template_index, template_name in enumerate(template_data.name.split(\"-\")):\n+ if template_index:\n+ # Patch name.\n+ templates.add(template_name.rsplit(\"_\", maxsplit=1)[0])\n+ else:\n+ # Residue name.\n+ templates.add(template_name)\n+ atom_names = [template_data.atoms[data.atomTemplateIndexes[atom]].name for atom in residue.atoms()]\n \n # Get all unique residue or patch names that have impropers.\n- templates = set(templates)\n residue_templates = sorted(\n (template for template in templates if template in residue_impropers), key=residue_order.get\n )\n@@ -30661,32 +31021,548 @@ if harmonic_impropers:\n sys.addForce(harmonic_force)</Script>\n <Script>import openmm\n \n-residue_anisotropies = {'ALAD': {'OY': ('CY', 'LPY1', 'LPY2', 0.82322, 1.14332), 'O': ('C', 'LPOA', 'LPOB', 0.82322, 1.14332)}, 'ALA': {'O': ('C', 'LPOA', 'LPOB', 0.82322, 1.14332)}, 'ARG': {'O': ('C', 'LPOA', 'LPOB', 0.82322, 1.14332)}, 'ASN': {'O': ('C', 'LPOA', 'LPOB', 0.82322, 1.14332), 'OD1': ('CG', 'LPDA', 'LPDB', 0.88, 1.32)}, 'ASP': {'O': ('C', 'LPOA', 'LPOB', 0.82322, 1.14332), 'OD1': ('CG', 'LP1A', 'LP1B', 0.7229, 1.265), 'OD2': ('CG', 'LP2A', 'LP2B', 0.7229, 1.265)}, 'CYS': {'O': ('C', 'LPOA', 'LPOB', 0.82322, 1.14332), 'SG': ('CB', 'LPGA', 'LPGB', 0.88, 1.32)}, 'GLN': {'O': ('C', 'LPOA', 'LPOB', 0.82322, 1.14332), 'OE1': ('CD', 'LPEA', 'LPEB', 0.82322, 1.14332)}, 'GLU': {'O': ('C', 'LPOA', 'LPOB', 0.82322, 1.14332), 'OE1': ('CD', 'LP1A', 'LP1B', 0.7229, 1.265), 'OE2': ('CD', 'LP2A', 'LP2B', 0.7229, 1.265)}, 'GLY': {'O': ('C', 'LPOA', 'LPOB', 0.82322, 1.14332)}, 'HSD': {'O': ('C', 'LPOA', 'LPOB', 0.82322, 1.14332), 'NE2': ('LPE2', 'CE1', 'CD2', 0.808, 1.384)}, 'HSE': {'O': ('C', 'LPOA', 'LPOB', 0.82322, 1.14332), 'ND1': ('LPD1', 'CE1', 'CG', 0.808, 1.384)}, 'HSP': {'O': ('C', 'LPOA', 'LPOB', 0.82322, 1.14332)}, 'ILE': {'O': ('C', 'LPOA', 'LPOB', 0.82322, 1.14332)}, 'LEU': {'O': ('C', 'LPOA', 'LPOB', 0.82322, 1.14332)}, 'LYS': {'O': ('C', 'LPOA', 'LPOB', 0.82322, 1.14332)}, 'MET': {'O': ('C', 'LPOA', 'LPOB', 0.82322, 1.14332), 'SD': ('CE', 'LP1A', 'LP1B', 0.7808, 1.3662)}, 'PHE': {'O': ('C', 'LPOA', 'LPOB', 0.82322, 1.14332)}, 'PRO': {'O': ('C', 'LPOA', 'LPOB', 0.82322, 1.14332)}, 'SER': {'O': ('C', 'LPOA', 'LPOB', 0.82322, 1.14332), 'OG': ('CB', 'LPGA', 'LPGB', 0.8108, 1.2162)}, 'THR': {'O': ('C', 'LPOA', 'LPOB', 0.82322, 1.14332), 'OG1': ('CB', 'LPGA', 'LPGB', 0.8108, 1.2162)}, 'TRP': {'O': ('C', 'LPOA', 'LPOB', 0.82322, 1.14332)}, 'TYR': {'O': ('C', 'LPOA', 'LPOB', 0.82322, 1.14332), 'OH': ('CZ', 'LP1A', 'LP1B', 0.8108, 1.2162)}, 'VAL': {'O': ('C', 'LPOA', 'LPOB', 0.82322, 1.14332)}, 'ALDD': {'OY': ('CY', 'LPY1', 'LPY2', 0.82322, 1.14332), 'O': ('C', 'LPOA', 'LPOB', 0.82322, 1.14332)}, 'DALA': {'O': ('C', 'LPOA', 'LPOB', 0.82322, 1.14332)}, 'DARG': {'O': ('C', 'LPOA', 'LPOB', 0.82322, 1.14332)}, 'DASN': {'O': ('C', 'LPOA', 'LPOB', 0.82322, 1.14332), 'OD1': ('CG', 'LPDA', 'LPDB', 0.88, 1.32)}, 'DASP': {'O': ('C', 'LPOA', 'LPOB', 0.82322, 1.14332), 'OD1': ('CG', 'LP1A', 'LP1B', 0.7229, 1.265), 'OD2': ('CG', 'LP2A', 'LP2B', 0.7229, 1.265)}, 'DCYS': {'O': ('C', 'LPOA', 'LPOB', 0.82322, 1.14332), 'SG': ('CB', 'LPGA', 'LPGB', 0.88, 1.32)}, 'DGLN': {'O': ('C', 'LPOA', 'LPOB', 0.82322, 1.14332), 'OE1': ('CD', 'LPEA', 'LPEB', 0.82322, 1.14332)}, 'DGLU': {'O': ('C', 'LPOA', 'LPOB', 0.82322, 1.14332), 'OE1': ('CD', 'LP1A', 'LP1B', 0.7229, 1.265), 'OE2': ('CD', 'LP2A', 'LP2B', 0.7229, 1.265)}, 'DGLY': {'O': ('C', 'LPOA', 'LPOB', 0.82322, 1.14332)}, 'DHSD': {'O': ('C', 'LPOA', 'LPOB', 0.82322, 1.14332), 'NE2': ('LPE2', 'CE1', 'CD2', 0.808, 1.384)}, 'DHSE': {'O': ('C', 'LPOA', 'LPOB', 0.82322, 1.14332), 'ND1': ('LPD1', 'CE1', 'CG', 0.808, 1.384)}, 'DHSP': {'O': ('C', 'LPOA', 'LPOB', 0.82322, 1.14332)}, 'DILE': {'O': ('C', 'LPOA', 'LPOB', 0.82322, 1.14332)}, 'DLEU': {'O': ('C', 'LPOA', 'LPOB', 0.82322, 1.14332)}, 'DLYS': {'O': ('C', 'LPOA', 'LPOB', 0.82322, 1.14332)}, 'DMET': {'O': ('C', 'LPOA', 'LPOB', 0.82322, 1.14332), 'SD': ('CE', 'LP1A', 'LP1B', 0.7808, 1.3662)}, 'DPHE': {'O': ('C', 'LPOA', 'LPOB', 0.82322, 1.14332)}, 'DPRO': {'O': ('C', 'LPOA', 'LPOB', 0.82322, 1.14332)}, 'DSER': {'O': ('C', 'LPOA', 'LPOB', 0.82322, 1.14332), 'OG': ('CB', 'LPGA', 'LPGB', 0.8108, 1.2162)}, 'DTHR': {'O': ('C', 'LPOA', 'LPOB', 0.82322, 1.14332), 'OG1': ('CB', 'LPGA', 'LPGB', 0.8108, 1.2162)}, 'DTRP': {'O': ('C', 'LPOA', 'LPOB', 0.82322, 1.14332)}, 'DTYR': {'O': ('C', 'LPOA', 'LPOB', 0.82322, 1.14332), 'OH': ('CZ', 'LP1A', 'LP1B', 0.8108, 1.2162)}, 'DVAL': {'O': ('C', 'LPOA', 'LPOB', 0.82322, 1.14332)}, 'ALLO': {'O1': ('C1', 'LP1A', 'LP1B', 0.85956, 1.13122), 'O2': ('C2', 'LP2A', 'LP2B', 0.8108, 1.2162), 'O3': ('C3', 'LP3A', 'LP3B', 0.8108, 1.2162), 'O4': ('C4', 'LP4A', 'LP4B', 0.8108, 1.2162), 'O5': ('C5', 'LP5A', 'LP5B', 0.8108, 1.2162), 'O6': ('C6', 'LP6A', 'LP6B', 0.8108, 1.2162)}, 'PSIC': {'O1': ('C1', 'LP1A', 'LP1B', 0.8108, 1.2162), 'O2': ('C2', 'LP2A', 'LP2B', 0.8665, 1.07246), 'O3': ('C3', 'LP3A', 'LP3B', 0.8108, 1.2162), 'O4': ('C4', 'LP4A', 'LP4B', 0.8108, 1.2162), 'O5': ('C5', 'LP5A', 'LP5B', 0.8108, 1.2162), 'O6': ('C6', 'LP6A', 'LP6B', 0.8108, 1.2162)}, 'EGLY': {'O1': ('C1', 'LP1A', 'LP1B', 0.8108, 1.2162), 'O2': ('C2', 'LP2A', 'LP2B', 0.8108, 1.2162)}, 'MGLYOL': {'O1': ('C1', 'LP1A', 'LP1B', 0.8108, 1.2162), 'O2': ('C2', 'LP2A', 'LP2B', 0.8108, 1.2162), 'O3': ('C3', 'LP3A', 'LP3B', 0.8108, 1.2162)}, 'MERYOL': {'O1': ('C1', 'LP1A', 'LP1B', 0.8108, 1.2162), 'O2': ('C2', 'LP2A', 'LP2B', 0.8108, 1.2162), 'O3': ('C3', 'LP3A', 'LP3B', 0.8108, 1.2162), 'O4': ('C4', 'LP4A', 'LP4B', 0.8108, 1.2162)}, 'DTHROL': {'O1': ('C1', 'LP1A', 'LP1B', 0.8108, 1.2162), 'O2': ('C2', 'LP2A', 'LP2B', 0.8108, 1.2162), 'O3': ('C3', 'LP3A', 'LP3B', 0.8108, 1.2162), 'O4': ('C4', 'LP4A', 'LP4B', 0.8108, 1.2162)}, 'LTHROL': {'O1': ('C1', 'LP1A', 'LP1B', 0.8108, 1.2162), 'O2': ('C2', 'LP2A', 'LP2B', 0.8108, 1.2162), 'O3': ('C3', 'LP3A', 'LP3B', 0.8108, 1.2162), 'O4': ('C4', 'LP4A', 'LP4B', 0.8108, 1.2162)}, 'MRIBOL': {'O1': ('C1', 'LP1A', 'LP1B', 0.8108, 1.2162), 'O2': ('C2', 'LP2A', 'LP2B', 0.8108, 1.2162), 'O3': ('C3', 'LP3A', 'LP3B', 0.8108, 1.2162), 'O4': ('C4', 'LP4A', 'LP4B', 0.8108, 1.2162), 'O5': ('C5', 'LP5A', 'LP5B', 0.8108, 1.2162)}, 'DARAOL': {'O1': ('C1', 'LP1A', 'LP1B', 0.8108, 1.2162), 'O2': ('C2', 'LP2A', 'LP2B', 0.8108, 1.2162), 'O3': ('C3', 'LP3A', 'LP3B', 0.8108, 1.2162), 'O4': ('C4', 'LP4A', 'LP4B', 0.8108, 1.2162), 'O5': ('C5', 'LP5A', 'LP5B', 0.8108, 1.2162)}, 'LARAOL': {'O1': ('C1', 'LP1A', 'LP1B', 0.8108, 1.2162), 'O2': ('C2', 'LP2A', 'LP2B', 0.8108, 1.2162), 'O3': ('C3', 'LP3A', 'LP3B', 0.8108, 1.2162), 'O4': ('C4', 'LP4A', 'LP4B', 0.8108, 1.2162), 'O5': ('C5', 'LP5A', 'LP5B', 0.8108, 1.2162)}, 'MXYLOL': {'O1': ('C1', 'LP1A', 'LP1B', 0.8108, 1.2162), 'O2': ('C2', 'LP2A', 'LP2B', 0.8108, 1.2162), 'O3': ('C3', 'LP3A', 'LP3B', 0.8108, 1.2162), 'O4': ('C4', 'LP4A', 'LP4B', 0.8108, 1.2162), 'O5': ('C5', 'LP5A', 'LP5B', 0.8108, 1.2162)}, 'MALLOL': {'O1': ('C1', 'LP1A', 'LP1B', 0.8108, 1.2162), 'O2': ('C2', 'LP2A', 'LP2B', 0.8108, 1.2162), 'O3': ('C3', 'LP3A', 'LP3B', 0.8108, 1.2162), 'O4': ('C4', 'LP4A', 'LP4B', 0.8108, 1.2162), 'O5': ('C5', 'LP5A', 'LP5B', 0.8108, 1.2162), 'O6': ('C6', 'LP6A', 'LP6B', 0.8108, 1.2162)}, 'DALTOL': {'O1': ('C1', 'LP1A', 'LP1B', 0.8108, 1.2162), 'O2': ('C2', 'LP2A', 'LP2B', 0.8108, 1.2162), 'O3': ('C3', 'LP3A', 'LP3B', 0.8108, 1.2162), 'O4': ('C4', 'LP4A', 'LP4B', 0.8108, 1.2162), 'O5': ('C5', 'LP5A', 'LP5B', 0.8108, 1.2162), 'O6': ('C6', 'LP6A', 'LP6B', 0.8108, 1.2162)}, 'LALTOL': {'O1': ('C1', 'LP1A', 'LP1B', 0.8108, 1.2162), 'O2': ('C2', 'LP2A', 'LP2B', 0.8108, 1.2162), 'O3': ('C3', 'LP3A', 'LP3B', 0.8108, 1.2162), 'O4': ('C4', 'LP4A', 'LP4B', 0.8108, 1.2162), 'O5': ('C5', 'LP5A', 'LP5B', 0.8108, 1.2162), 'O6': ('C6', 'LP6A', 'LP6B', 0.8108, 1.2162)}, 'DGLUOL': {'O1': ('C1', 'LP1A', 'LP1B', 0.8108, 1.2162), 'O2': ('C2', 'LP2A', 'LP2B', 0.8108, 1.2162), 'O3': ('C3', 'LP3A', 'LP3B', 0.8108, 1.2162), 'O4': ('C4', 'LP4A', 'LP4B', 0.8108, 1.2162), 'O5': ('C5', 'LP5A', 'LP5B', 0.8108, 1.2162), 'O6': ('C6', 'LP6A', 'LP6B', 0.8108, 1.2162)}, 'LGLUOL': {'O1': ('C1', 'LP1A', 'LP1B', 0.8108, 1.2162), 'O2': ('C2', 'LP2A', 'LP2B', 0.8108, 1.2162), 'O3': ('C3', 'LP3A', 'LP3B', 0.8108, 1.2162), 'O4': ('C4', 'LP4A', 'LP4B', 0.8108, 1.2162), 'O5': ('C5', 'LP5A', 'LP5B', 0.8108, 1.2162), 'O6': ('C6', 'LP6A', 'LP6B', 0.8108, 1.2162)}, 'DMANOL': {'O1': ('C1', 'LP1A', 'LP1B', 0.8108, 1.2162), 'O2': ('C2', 'LP2A', 'LP2B', 0.8108, 1.2162), 'O3': ('C3', 'LP3A', 'LP3B', 0.8108, 1.2162), 'O4': ('C4', 'LP4A', 'LP4B', 0.8108, 1.2162), 'O5': ('C5', 'LP5A', 'LP5B', 0.8108, 1.2162), 'O6': ('C6', 'LP6A', 'LP6B', 0.8108, 1.2162)}, 'LMANOL': {'O1': ('C1', 'LP1A', 'LP1B', 0.8108, 1.2162), 'O2': ('C2', 'LP2A', 'LP2B', 0.8108, 1.2162), 'O3': ('C3', 'LP3A', 'LP3B', 0.8108, 1.2162), 'O4': ('C4', 'LP4A', 'LP4B', 0.8108, 1.2162), 'O5': ('C5', 'LP5A', 'LP5B', 0.8108, 1.2162), 'O6': ('C6', 'LP6A', 'LP6B', 0.8108, 1.2162)}, 'DGULOL': {'O1': ('C1', 'LP1A', 'LP1B', 0.8108, 1.2162), 'O2': ('C2', 'LP2A', 'LP2B', 0.8108, 1.2162), 'O3': ('C3', 'LP3A', 'LP3B', 0.8108, 1.2162), 'O4': ('C4', 'LP4A', 'LP4B', 0.8108, 1.2162), 'O5': ('C5', 'LP5A', 'LP5B', 0.8108, 1.2162), 'O6': ('C6', 'LP6A', 'LP6B', 0.8108, 1.2162)}, 'LGULOL': {'O1': ('C1', 'LP1A', 'LP1B', 0.8108, 1.2162), 'O2': ('C2', 'LP2A', 'LP2B', 0.8108, 1.2162), 'O3': ('C3', 'LP3A', 'LP3B', 0.8108, 1.2162), 'O4': ('C4', 'LP4A', 'LP4B', 0.8108, 1.2162), 'O5': ('C5', 'LP5A', 'LP5B', 0.8108, 1.2162), 'O6': ('C6', 'LP6A', 'LP6B', 0.8108, 1.2162)}, 'DIDIOL': {'O1': ('C1', 'LP1A', 'LP1B', 0.8108, 1.2162), 'O2': ('C2', 'LP2A', 'LP2B', 0.8108, 1.2162), 'O3': ('C3', 'LP3A', 'LP3B', 0.8108, 1.2162), 'O4': ('C4', 'LP4A', 'LP4B', 0.8108, 1.2162), 'O5': ('C5', 'LP5A', 'LP5B', 0.8108, 1.2162), 'O6': ('C6', 'LP6A', 'LP6B', 0.8108, 1.2162)}, 'LIDIOL': {'O1': ('C1', 'LP1A', 'LP1B', 0.8108, 1.2162), 'O2': ('C2', 'LP2A', 'LP2B', 0.8108, 1.2162), 'O3': ('C3', 'LP3A', 'LP3B', 0.8108, 1.2162), 'O4': ('C4', 'LP4A', 'LP4B', 0.8108, 1.2162), 'O5': ('C5', 'LP5A', 'LP5B', 0.8108, 1.2162), 'O6': ('C6', 'LP6A', 'LP6B', 0.8108, 1.2162)}, 'MGALOL': {'O1': ('C1', 'LP1A', 'LP1B', 0.8108, 1.2162), 'O2': ('C2', 'LP2A', 'LP2B', 0.8108, 1.2162), 'O3': ('C3', 'LP3A', 'LP3B', 0.8108, 1.2162), 'O4': ('C4', 'LP4A', 'LP4B', 0.8108, 1.2162), 'O5': ('C5', 'LP5A', 'LP5B', 0.8108, 1.2162), 'O6': ('C6', 'LP6A', 'LP6B', 0.8108, 1.2162)}, 'AGLC': {'O1': ('C1', 'LP1A', 'LP1B', 0.8108, 1.2162), 'O2': ('C2', 'LP2A', 'LP2B', 0.8108, 1.2162), 'O3': ('C3', 'LP3A', 'LP3B', 0.8108, 1.2162), 'O4': ('C4', 'LP4A', 'LP4B', 0.8108, 1.2162), 'O5': ('LPX5', 'LP5A', 'LP5B', 0.8889, 1.2222), 'O6': ('C6', 'LP6A', 'LP6B', 0.8108, 1.2162)}, 'BGLC': {'O1': ('C1', 'LP1A', 'LP1B', 0.8108, 1.2162), 'O2': ('C2', 'LP2A', 'LP2B', 0.8108, 1.2162), 'O3': ('C3', 'LP3A', 'LP3B', 0.8108, 1.2162), 'O4': ('C4', 'LP4A', 'LP4B', 0.8108, 1.2162), 'O5': ('LPX5', 'LP5A', 'LP5B', 0.8889, 1.2222), 'O6': ('C6', 'LP6A', 'LP6B', 0.8108, 1.2162)}, 'AALT': {'O1': ('C1', 'LP1A', 'LP1B', 0.8108, 1.2162), 'O2': ('C2', 'LP2A', 'LP2B', 0.8108, 1.2162), 'O3': ('C3', 'LP3A', 'LP3B', 0.8108, 1.2162), 'O4': ('C4', 'LP4A', 'LP4B', 0.8108, 1.2162), 'O5': ('LPX5', 'LP5A', 'LP5B', 0.8889, 1.2222), 'O6': ('C6', 'LP6A', 'LP6B', 0.8108, 1.2162)}, 'BALT': {'O1': ('C1', 'LP1A', 'LP1B', 0.8108, 1.2162), 'O2': ('C2', 'LP2A', 'LP2B', 0.8108, 1.2162), 'O3': ('C3', 'LP3A', 'LP3B', 0.8108, 1.2162), 'O4': ('C4', 'LP4A', 'LP4B', 0.8108, 1.2162), 'O5': ('LPX5', 'LP5A', 'LP5B', 0.8889, 1.2222), 'O6': ('C6', 'LP6A', 'LP6B', 0.8108, 1.2162)}, 'AALL': {'O1': ('C1', 'LP1A', 'LP1B', 0.8108, 1.2162), 'O2': ('C2', 'LP2A', 'LP2B', 0.8108, 1.2162), 'O3': ('C3', 'LP3A', 'LP3B', 0.8108, 1.2162), 'O4': ('C4', 'LP4A', 'LP4B', 0.8108, 1.2162), 'O5': ('LPX5', 'LP5A', 'LP5B', 0.8889, 1.2222), 'O6': ('C6', 'LP6A', 'LP6B', 0.8108, 1.2162)}, 'BALL': {'O1': ('C1', 'LP1A', 'LP1B', 0.8108, 1.2162), 'O2': ('C2', 'LP2A', 'LP2B', 0.8108, 1.2162), 'O3': ('C3', 'LP3A', 'LP3B', 0.8108, 1.2162), 'O4': ('C4', 'LP4A', 'LP4B', 0.8108, 1.2162), 'O5': ('LPX5', 'LP5A', 'LP5B', 0.8889, 1.2222), 'O6': ('C6', 'LP6A', 'LP6B', 0.8108, 1.2162)}, 'AGAL': {'O1': ('C1', 'LP1A', 'LP1B', 0.8108, 1.2162), 'O2': ('C2', 'LP2A', 'LP2B', 0.8108, 1.2162), 'O3': ('C3', 'LP3A', 'LP3B', 0.8108, 1.2162), 'O4': ('C4', 'LP4A', 'LP4B', 0.8108, 1.2162), 'O5': ('LPX5', 'LP5A', 'LP5B', 0.8889, 1.2222), 'O6': ('C6', 'LP6A', 'LP6B', 0.8108, 1.2162)}, 'BGAL': {'O1': ('C1', 'LP1A', 'LP1B', 0.8108, 1.2162), 'O2': ('C2', 'LP2A', 'LP2B', 0.8108, 1.2162), 'O3': ('C3', 'LP3A', 'LP3B', 0.8108, 1.2162), 'O4': ('C4', 'LP4A', 'LP4B', 0.8108, 1.2162), 'O5': ('LPX5', 'LP5A', 'LP5B', 0.8889, 1.2222), 'O6': ('C6', 'LP6A', 'LP6B', 0.8108, 1.2162)}, 'AGUL': {'O1': ('C1', 'LP1A', 'LP1B', 0.8108, 1.2162), 'O2': ('C2', 'LP2A', 'LP2B', 0.8108, 1.2162), 'O3': ('C3', 'LP3A', 'LP3B', 0.8108, 1.2162), 'O4': ('C4', 'LP4A', 'LP4B', 0.8108, 1.2162), 'O5': ('LPX5', 'LP5A', 'LP5B', 0.8889, 1.2222), 'O6': ('C6', 'LP6A', 'LP6B', 0.8108, 1.2162)}, 'BGUL': {'O1': ('C1', 'LP1A', 'LP1B', 0.8108, 1.2162), 'O2': ('C2', 'LP2A', 'LP2B', 0.8108, 1.2162), 'O3': ('C3', 'LP3A', 'LP3B', 0.8108, 1.2162), 'O4': ('C4', 'LP4A', 'LP4B', 0.8108, 1.2162), 'O5': ('LPX5', 'LP5A', 'LP5B', 0.8889, 1.2222), 'O6': ('C6', 'LP6A', 'LP6B', 0.8108, 1.2162)}, 'AIDO': {'O1': ('C1', 'LP1A', 'LP1B', 0.8108, 1.2162), 'O2': ('C2', 'LP2A', 'LP2B', 0.8108, 1.2162), 'O3': ('C3', 'LP3A', 'LP3B', 0.8108, 1.2162), 'O4': ('C4', 'LP4A', 'LP4B', 0.8108, 1.2162), 'O5': ('LPX5', 'LP5A', 'LP5B', 0.8889, 1.2222), 'O6': ('C6', 'LP6A', 'LP6B', 0.8108, 1.2162)}, 'BIDO': {'O1': ('C1', 'LP1A', 'LP1B', 0.8108, 1.2162), 'O2': ('C2', 'LP2A', 'LP2B', 0.8108, 1.2162), 'O3': ('C3', 'LP3A', 'LP3B', 0.8108, 1.2162), 'O4': ('C4', 'LP4A', 'LP4B', 0.8108, 1.2162), 'O5': ('LPX5', 'LP5A', 'LP5B', 0.8889, 1.2222), 'O6': ('C6', 'LP6A', 'LP6B', 0.8108, 1.2162)}, 'AMAN': {'O1': ('C1', 'LP1A', 'LP1B', 0.8108, 1.2162), 'O2': ('C2', 'LP2A', 'LP2B', 0.8108, 1.2162), 'O3': ('C3', 'LP3A', 'LP3B', 0.8108, 1.2162), 'O4': ('C4', 'LP4A', 'LP4B', 0.8108, 1.2162), 'O5': ('LPX5', 'LP5A', 'LP5B', 0.8889, 1.2222), 'O6': ('C6', 'LP6A', 'LP6B', 0.8108, 1.2162)}, 'BMAN': {'O1': ('C1', 'LP1A', 'LP1B', 0.8108, 1.2162), 'O2': ('C2', 'LP2A', 'LP2B', 0.8108, 1.2162), 'O3': ('C3', 'LP3A', 'LP3B', 0.8108, 1.2162), 'O4': ('C4', 'LP4A', 'LP4B', 0.8108, 1.2162), 'O5': ('LPX5', 'LP5A', 'LP5B', 0.8889, 1.2222), 'O6': ('C6', 'LP6A', 'LP6B', 0.8108, 1.2162)}, 'ATAL': {'O1': ('C1', 'LP1A', 'LP1B', 0.8108, 1.2162), 'O2': ('C2', 'LP2A', 'LP2B', 0.8108, 1.2162), 'O3': ('C3', 'LP3A', 'LP3B', 0.8108, 1.2162), 'O4': ('C4', 'LP4A', 'LP4B', 0.8108, 1.2162), 'O5': ('LPX5', 'LP5A', 'LP5B', 0.8889, 1.2222), 'O6': ('C6', 'LP6A', 'LP6B', 0.8108, 1.2162)}, 'BTAL': {'O1': ('C1', 'LP1A', 'LP1B', 0.8108, 1.2162), 'O2': ('C2', 'LP2A', 'LP2B', 0.8108, 1.2162), 'O3': ('C3', 'LP3A', 'LP3B', 0.8108, 1.2162), 'O4': ('C4', 'LP4A', 'LP4B', 0.8108, 1.2162), 'O5': ('LPX5', 'LP5A', 'LP5B', 0.8889, 1.2222), 'O6': ('C6', 'LP6A', 'LP6B', 0.8108, 1.2162)}, 'ARIB': {'O1': ('C1', 'LP1A', 'LP1B', 0.8108, 1.2162), 'O2': ('C2', 'LP2A', 'LP2B', 0.8108, 1.2162), 'O3': ('C3', 'LP3A', 'LP3B', 0.8108, 1.2162), 'O4': ('LPX4', 'LP4A', 'LP4B', 0.8889, 1.2222), 'O5': ('C5', 'LP5A', 'LP5B', 0.8108, 1.2162)}, 'BRIB': {'O1': ('C1', 'LP1A', 'LP1B', 0.8108, 1.2162), 'O2': ('C2', 'LP2A', 'LP2B', 0.8108, 1.2162), 'O3': ('C3', 'LP3A', 'LP3B', 0.8108, 1.2162), 'O4': ('LPX4', 'LP4A', 'LP4B', 0.8889, 1.2222), 'O5': ('C5', 'LP5A', 'LP5B', 0.8108, 1.2162)}, 'AARB': {'O1': ('C1', 'LP1A', 'LP1B', 0.8108, 1.2162), 'O2': ('C2', 'LP2A', 'LP2B', 0.8108, 1.2162), 'O3': ('C3', 'LP3A', 'LP3B', 0.8108, 1.2162), 'O4': ('LPX4', 'LP4A', 'LP4B', 0.8889, 1.2222), 'O5': ('C5', 'LP5A', 'LP5B', 0.8108, 1.2162)}, 'BARB': {'O1': ('C1', 'LP1A', 'LP1B', 0.8108, 1.2162), 'O2': ('C2', 'LP2A', 'LP2B', 0.8108, 1.2162), 'O3': ('C3', 'LP3A', 'LP3B', 0.8108, 1.2162), 'O4': ('LPX4', 'LP4A', 'LP4B', 0.8889, 1.2222), 'O5': ('C5', 'LP5A', 'LP5B', 0.8108, 1.2162)}, 'AXYF': {'O1': ('C1', 'LP1A', 'LP1B', 0.8108, 1.2162), 'O2': ('C2', 'LP2A', 'LP2B', 0.8108, 1.2162), 'O3': ('C3', 'LP3A', 'LP3B', 0.8108, 1.2162), 'O4': ('LPX4', 'LP4A', 'LP4B', 0.8889, 1.2222), 'O5': ('C5', 'LP5A', 'LP5B', 0.8108, 1.2162)}, 'BXYF': {'O1': ('C1', 'LP1A', 'LP1B', 0.8108, 1.2162), 'O2': ('C2', 'LP2A', 'LP2B', 0.8108, 1.2162), 'O3': ('C3', 'LP3A', 'LP3B', 0.8108, 1.2162), 'O4': ('LPX4', 'LP4A', 'LP4B', 0.8889, 1.2222), 'O5': ('C5', 'LP5A', 'LP5B', 0.8108, 1.2162)}, 'ALYF': {'O1': ('C1', 'LP1A', 'LP1B', 0.8108, 1.2162), 'O2': ('C2', 'LP2A', 'LP2B', 0.8108, 1.2162), 'O3': ('C3', 'LP3A', 'LP3B', 0.8108, 1.2162), 'O4': ('LPX4', 'LP4A', 'LP4B', 0.8889, 1.2222), 'O5': ('C5', 'LP5A', 'LP5B', 0.8108, 1.2162)}, 'BLYF': {'O1': ('C1', 'LP1A', 'LP1B', 0.8108, 1.2162), 'O2': ('C2', 'LP2A', 'LP2B', 0.8108, 1.2162), 'O3': ('C3', 'LP3A', 'LP3B', 0.8108, 1.2162), 'O4': ('LPX4', 'LP4A', 'LP4B', 0.8889, 1.2222), 'O5': ('C5', 'LP5A', 'LP5B', 0.8108, 1.2162)}, 'ADEO': {'O1': ('C1', 'LP1A', 'LP1B', 0.8108, 1.2162), 'O3': ('C3', 'LP3A', 'LP3B', 0.8108, 1.2162), 'O4': ('LPX4', 'LP4A', 'LP4B', 0.8889, 1.2222), 'O5': ('C5', 'LP5A', 'LP5B', 0.8108, 1.2162)}, 'BDEO': {'O1': ('C1', 'LP1A', 'LP1B', 0.8108, 1.2162), 'O3': ('C3', 'LP3A', 'LP3B', 0.8108, 1.2162), 'O4': ('LPX4', 'LP4A', 'LP4B', 0.8889, 1.2222), 'O5': ('C5', 'LP5A', 'LP5B', 0.8108, 1.2162)}, 'AFRU': {'O1': ('C1', 'LP1A', 'LP1B', 0.8108, 1.2162), 'O2': ('C2', 'LP2A', 'LP2B', 0.8108, 1.2162), 'O3': ('C3', 'LP3A', 'LP3B', 0.8108, 1.2162), 'O4': ('C4', 'LP4A', 'LP4B', 0.8108, 1.2162), 'O5': ('LPX5', 'LP5A', 'LP5B', 0.8889, 1.2222), 'O6': ('C6', 'LP6A', 'LP6B', 0.8108, 1.2162)}, 'BFRU': {'O1': ('C1', 'LP1A', 'LP1B', 0.8108, 1.2162), 'O2': ('C2', 'LP2A', 'LP2B', 0.8108, 1.2162), 'O3': ('C3', 'LP3A', 'LP3B', 0.8108, 1.2162), 'O4': ('C4', 'LP4A', 'LP4B', 0.8108, 1.2162), 'O5': ('LPX5', 'LP5A', 'LP5B', 0.8889, 1.2222), 'O6': ('C6', 'LP6A', 'LP6B', 0.8108, 1.2162)}, 'AGALA': {'O1': ('C1', 'LP1A', 'LP1B', 0.8108, 1.2162), 'O2': ('C2', 'LP2A', 'LP2B', 0.8108, 1.2162), 'O3': ('C3', 'LP3A', 'LP3B', 0.8108, 1.2162), 'O4': ('C4', 'LP4A', 'LP4B', 0.8108, 1.2162), 'O5': ('LPX5', 'LP5A', 'LP5B', 0.8889, 1.2222), 'O61': ('C6', 'LPT1', 'LPT2', 0.7229, 1.265), 'O62': ('C6', 'LPT3', 'LPT4', 0.7229, 1.265)}, 'BGALA': {'O1': ('C1', 'LP1A', 'LP1B', 0.8108, 1.2162), 'O2': ('C2', 'LP2A', 'LP2B', 0.8108, 1.2162), 'O3': ('C3', 'LP3A', 'LP3B', 0.8108, 1.2162), 'O4': ('C4', 'LP4A', 'LP4B', 0.8108, 1.2162), 'O5': ('LPX5', 'LP5A', 'LP5B', 0.8889, 1.2222), 'O61': ('C6', 'LPT1', 'LPT2', 0.7229, 1.265), 'O62': ('C6', 'LPT3', 'LPT4', 0.7229, 1.265)}, 'AGLCA': {'O1': ('C1', 'LP1A', 'LP1B', 0.8108, 1.2162), 'O2': ('C2', 'LP2A', 'LP2B', 0.8108, 1.2162), 'O3': ('C3', 'LP3A', 'LP3B', 0.8108, 1.2162), 'O4': ('C4', 'LP4A', 'LP4B', 0.8108, 1.2162), 'O5': ('LPX5', 'LP5A', 'LP5B', 0.8889, 1.2222), 'O61': ('C6', 'LPT1', 'LPT2', 0.7229, 1.265), 'O62': ('C6', 'LPT3', 'LPT4', 0.7229, 1.265)}, 'BGLCA': {'O1': ('C1', 'LP1A', 'LP1B', 0.8108, 1.2162), 'O2': ('C2', 'LP2A', 'LP2B', 0.8108, 1.2162), 'O3': ('C3', 'LP3A', 'LP3B', 0.8108, 1.2162), 'O4': ('C4', 'LP4A', 'LP4B', 0.8108, 1.2162), 'O5': ('LPX5', 'LP5A', 'LP5B', 0.8889, 1.2222), 'O61': ('C6', 'LPT1', 'LPT2', 0.7229, 1.265), 'O62': ('C6', 'LPT3', 'LPT4', 0.7229, 1.265)}, 'AIDOA': {'O1': ('C1', 'LP1A', 'LP1B', 0.8108, 1.2162), 'O2': ('C2', 'LP2A', 'LP2B', 0.8108, 1.2162), 'O3': ('C3', 'LP3A', 'LP3B', 0.8108, 1.2162), 'O4': ('C4', 'LP4A', 'LP4B', 0.8108, 1.2162), 'O5': ('LPX5', 'LP5A', 'LP5B', 0.8889, 1.2222), 'O61': ('C6', 'LPT1', 'LPT2', 0.7229, 1.265), 'O62': ('C6', 'LPT3', 'LPT4', 0.7229, 1.265)}, 'BIDOA': {'O1': ('C1', 'LP1A', 'LP1B', 0.8108, 1.2162), 'O2': ('C2', 'LP2A', 'LP2B', 0.8108, 1.2162), 'O3': ('C3', 'LP3A', 'LP3B', 0.8108, 1.2162), 'O4': ('C4', 'LP4A', 'LP4B', 0.8108, 1.2162), 'O5': ('LPX5', 'LP5A', 'LP5B', 0.8889, 1.2222), 'O61': ('C6', 'LPT1', 'LPT2', 0.7229, 1.265), 'O62': ('C6', 'LPT3', 'LPT4', 0.7229, 1.265)}, 'AGLCNA': {'O1': ('C1', 'LP1A', 'LP1B', 0.8108, 1.2162), 'O3': ('C3', 'LP3A', 'LP3B', 0.8108, 1.2162), 'O4': ('C4', 'LP4A', 'LP4B', 0.8108, 1.2162), 'O5': ('LPX5', 'LP5A', 'LP5B', 0.8889, 1.2222), 'O6': ('C6', 'LP6A', 'LP6B', 0.8108, 1.2162), 'O': ('C', 'LPY1', 'LPY2', 0.82322, 1.14332)}, 'BGLCNA': {'O1': ('C1', 'LP1A', 'LP1B', 0.8108, 1.2162), 'O3': ('C3', 'LP3A', 'LP3B', 0.8108, 1.2162), 'O4': ('C4', 'LP4A', 'LP4B', 0.8108, 1.2162), 'O5': ('LPX5', 'LP5A', 'LP5B', 0.8889, 1.2222), 'O6': ('C6', 'LP6A', 'LP6B', 0.8108, 1.2162), 'O': ('C', 'LPY1', 'LPY2', 0.82322, 1.14332)}, 'AGALNA': {'O1': ('C1', 'LP1A', 'LP1B', 0.8108, 1.2162), 'O3': ('C3', 'LP3A', 'LP3B', 0.8108, 1.2162), 'O4': ('C4', 'LP4A', 'LP4B', 0.8108, 1.2162), 'O5': ('LPX5', 'LP5A', 'LP5B', 0.8889, 1.2222), 'O6': ('C6', 'LP6A', 'LP6B', 0.8108, 1.2162), 'O': ('C', 'LPY1', 'LPY2', 0.82322, 1.14332)}, 'BGALNA': {'O1': ('C1', 'LP1A', 'LP1B', 0.8108, 1.2162), 'O3': ('C3', 'LP3A', 'LP3B', 0.8108, 1.2162), 'O4': ('C4', 'LP4A', 'LP4B', 0.8108, 1.2162), 'O5': ('LPX5', 'LP5A', 'LP5B', 0.8889, 1.2222), 'O6': ('C6', 'LP6A', 'LP6B', 0.8108, 1.2162), 'O': ('C', 'LPY1', 'LPY2', 0.82322, 1.14332)}, 'AMANNA': {'O1': ('C1', 'LP1A', 'LP1B', 0.8108, 1.2162), 'O3': ('C3', 'LP3A', 'LP3B', 0.8108, 1.2162), 'O4': ('C4', 'LP4A', 'LP4B', 0.8108, 1.2162), 'O5': ('LPX5', 'LP5A', 'LP5B', 0.8889, 1.2222), 'O6': ('C6', 'LP6A', 'LP6B', 0.8108, 1.2162), 'O': ('C', 'LPY1', 'LPY2', 0.82322, 1.14332)}, 'BMANNA': {'O1': ('C1', 'LP1A', 'LP1B', 0.8108, 1.2162), 'O3': ('C3', 'LP3A', 'LP3B', 0.8108, 1.2162), 'O4': ('C4', 'LP4A', 'LP4B', 0.8108, 1.2162), 'O5': ('LPX5', 'LP5A', 'LP5B', 0.8889, 1.2222), 'O6': ('C6', 'LP6A', 'LP6B', 0.8108, 1.2162), 'O': ('C', 'LPY1', 'LPY2', 0.82322, 1.14332)}, 'AXYL': {'O1': ('C1', 'LP1A', 'LP1B', 0.8108, 1.2162), 'O2': ('C2', 'LP2A', 'LP2B', 0.8108, 1.2162), 'O3': ('C3', 'LP3A', 'LP3B', 0.8108, 1.2162), 'O4': ('C4', 'LP4A', 'LP4B', 0.8108, 1.2162), 'O5': ('LPX5', 'LP5A', 'LP5B', 0.8889, 1.2222)}, 'BXYL': {'O1': ('C1', 'LP1A', 'LP1B', 0.8108, 1.2162), 'O2': ('C2', 'LP2A', 'LP2B', 0.8108, 1.2162), 'O3': ('C3', 'LP3A', 'LP3B', 0.8108, 1.2162), 'O4': ('C4', 'LP4A', 'LP4B', 0.8108, 1.2162), 'O5': ('LPX5', 'LP5A', 'LP5B', 0.8889, 1.2222)}, 'AFUC': {'O1': ('C1', 'LP1A', 'LP1B', 0.8108, 1.2162), 'O2': ('C2', 'LP2A', 'LP2B', 0.8108, 1.2162), 'O3': ('C3', 'LP3A', 'LP3B', 0.8108, 1.2162), 'O4': ('C4', 'LP4A', 'LP4B', 0.8108, 1.2162), 'O5': ('LPX5', 'LP5A', 'LP5B', 0.8889, 1.2222)}, 'BFUC': {'O1': ('C1', 'LP1A', 'LP1B', 0.8108, 1.2162), 'O2': ('C2', 'LP2A', 'LP2B', 0.8108, 1.2162), 'O3': ('C3', 'LP3A', 'LP3B', 0.8108, 1.2162), 'O4': ('C4', 'LP4A', 'LP4B', 0.8108, 1.2162), 'O5': ('LPX5', 'LP5A', 'LP5B', 0.8889, 1.2222)}, 'ARHM': {'O1': ('C1', 'LP1A', 'LP1B', 0.8108, 1.2162), 'O2': ('C2', 'LP2A', 'LP2B', 0.8108, 1.2162), 'O3': ('C3', 'LP3A', 'LP3B', 0.8108, 1.2162), 'O4': ('C4', 'LP4A', 'LP4B', 0.8108, 1.2162), 'O5': ('LPX5', 'LP5A', 'LP5B', 0.8889, 1.2222)}, 'BRHM': {'O1': ('C1', 'LP1A', 'LP1B', 0.8108, 1.2162), 'O2': ('C2', 'LP2A', 'LP2B', 0.8108, 1.2162), 'O3': ('C3', 'LP3A', 'LP3B', 0.8108, 1.2162), 'O4': ('C4', 'LP4A', 'LP4B', 0.8108, 1.2162), 'O5': ('LPX5', 'LP5A', 'LP5B', 0.8889, 1.2222)}, 'AQUI': {'O1': ('C1', 'LP1A', 'LP1B', 0.8108, 1.2162), 'O2': ('C2', 'LP2A', 'LP2B', 0.8108, 1.2162), 'O3': ('C3', 'LP3A', 'LP3B', 0.8108, 1.2162), 'O4': ('C4', 'LP4A', 'LP4B', 0.8108, 1.2162), 'O5': ('LPX5', 'LP5A', 'LP5B', 0.8889, 1.2222)}, 'BQUI': {'O1': ('C1', 'LP1A', 'LP1B', 0.8108, 1.2162), 'O2': ('C2', 'LP2A', 'LP2B', 0.8108, 1.2162), 'O3': ('C3', 'LP3A', 'LP3B', 0.8108, 1.2162), 'O4': ('C4', 'LP4A', 'LP4B', 0.8108, 1.2162), 'O5': ('LPX5', 'LP5A', 'LP5B', 0.8889, 1.2222)}, 'ARHMNA': {'O1': ('C1', 'LP1A', 'LP1B', 0.8108, 1.2162), 'O3': ('C3', 'LP3A', 'LP3B', 0.8108, 1.2162), 'O4': ('C4', 'LP4A', 'LP4B', 0.8108, 1.2162), 'O5': ('LPX5', 'LP5A', 'LP5B', 0.8889, 1.2222), 'O': ('C', 'LPY1', 'LPY2', 0.82322, 1.14332)}, 'BRHMNA': {'O1': ('C1', 'LP1A', 'LP1B', 0.8108, 1.2162), 'O3': ('C3', 'LP3A', 'LP3B', 0.8108, 1.2162), 'O4': ('C4', 'LP4A', 'LP4B', 0.8108, 1.2162), 'O5': ('LPX5', 'LP5A', 'LP5B', 0.8889, 1.2222), 'O': ('C', 'LPY1', 'LPY2', 0.82322, 1.14332)}, 'ANE5AC': {'O11': ('C1', 'LPT1', 'LPT2', 0.7229, 1.265), 'O12': ('C1', 'LPT3', 'LPT4', 0.7229, 1.265), 'O6': ('LPX6', 'LP6A', 'LP6B', 0.8889, 1.2222), 'O2': ('C2', 'LP2A', 'LP2B', 0.8108, 1.2162), 'O4': ('C4', 'LP4A', 'LP4B', 0.8108, 1.2162), 'O': ('C', 'LPY1', 'LPY2', 0.82322, 1.14332), 'O7': ('C7', 'LP7A', 'LP7B', 0.8108, 1.2162), 'O8': ('C8', 'LP8A', 'LP8B', 0.8108, 1.2162), 'O9': ('C9', 'LP9A', 'LP9B', 0.8108, 1.2162)}, 'BNE5AC': {'O11': ('C1', 'LPT1', 'LPT2', 0.7229, 1.265), 'O12': ('C1', 'LPT3', 'LPT4', 0.7229, 1.265), 'O6': ('LPX6', 'LP6A', 'LP6B', 0.8889, 1.2222), 'O2': ('C2', 'LP2A', 'LP2B', 0.8108, 1.2162), 'O4': ('C4', 'LP4A', 'LP4B', 0.8108, 1.2162), 'O': ('C', 'LPY1', 'LPY2', 0.82322, 1.14332), 'O7': ('C7', 'LP7A', 'LP7B', 0.8108, 1.2162), 'O8': ('C8', 'LP8A', 'LP8B', 0.8108, 1.2162), 'O9': ('C9', 'LP9A', 'LP9B', 0.8108, 1.2162)}, 'AALD': {'O': ('C', 'LPA', 'LPB', 0.85956, 1.13122)}, 'PALD': {'O': ('C', 'LPA', 'LPB', 0.85956, 1.13122)}, 'BALD': {'O': ('C', 'LPA', 'LPB', 0.85956, 1.13122)}, 'IBLD': {'O': ('C', 'LPA', 'LPB', 0.85956, 1.13122)}, 'ACO': {'O1': ('C1', 'LPA', 'LPB', 0.8665, 1.07246)}, 'BTON': {'O1': ('C1', 'LPA', 'LPB', 0.8665, 1.07246)}, 'FORM': {'O': ('C', 'LPA', 'LPB', 0.819, 1.183), 'N': ('C', 'HC', 'HT', 0.796, 1.109)}, 'ACEM': {'O': ('C', 'LPA', 'LPB', 0.82322, 1.14332)}, 'NMA': {'O': ('C', 'LPA', 'LPB', 0.82322, 1.14332)}, 'NEA': {'O': ('C', 'LPA', 'LPB', 0.82322, 1.14332)}, 'NPA': {'O': ('C', 'LPA', 'LPB', 0.82322, 1.14332)}, 'DMA': {'O': ('C', 'LPA', 'LPB', 0.82322, 1.14332)}, 'THF': {'O1': ('LPX', 'LP1A', 'LP1B', 0.8889, 1.2222)}, 'TF2M': {'O1': ('LPX', 'LP1A', 'LP1B', 0.8889, 1.2222)}, 'THP': {'O1': ('LPX', 'LP1A', 'LP1B', 0.8889, 1.2222)}, 'DIOX': {'O1': ('LPX', 'LP1A', 'LP1B', 0.8889, 1.2222), 'O3': ('LPX2', 'LP2A', 'LP2B', 0.8889, 1.2222)}, 'DMEE': {'O2': ('LPX', 'LP2A', 'LP2B', 0.8889, 1.2222)}, 'MEET': {'O3': ('LPX', 'LP3A', 'LP3B', 0.8889, 1.2222)}, 'DEET': {'O3': ('LPX', 'LP3A', 'LP3B', 0.8889, 1.2222)}, 'DME': {'O2': ('LPX2', 'LP2A', 'LP2B', 0.8889, 1.2222), 'O5': ('LPX5', 'LP5A', 'LP5B', 0.8889, 1.2222)}, 'MPET': {'O2': ('LPX', 'LP2A', 'LP2B', 0.8889, 1.2222)}, 'MBET': {'O2': ('LPX', 'LP2A', 'LP2B', 0.8889, 1.2222)}, 'EPET': {'O3': ('LPX', 'LP3A', 'LP3B', 0.8889, 1.2222)}, 'MESH': {'S1': ('C1', 'LP1A', 'LP1B', 0.88, 1.32)}, 'ETSH': {'S1': ('C1', 'LP1A', 'LP1B', 0.88, 1.32)}, 'PRSH': {'S1': ('C1', 'LP1A', 'LP1B', 0.88, 1.32)}, 'BUSH': {'S1': ('C1', 'LP1A', 'LP1B', 0.88, 1.32)}, 'DMS': {'S1': ('C1', 'LP1A', 'LP1B', 0.7808, 1.3662)}, 'EMS': {'S1': ('C1', 'LP1A', 'LP1B', 0.7808, 1.3662)}, 'DMDS': {'S1': ('C1', 'LP1A', 'LP1B', 0.9208, 1.0102), 'S2': ('C2', 'LP2A', 'LP2B', 0.9208, 1.0102)}, 'PHEN': {'OH': ('CZ', 'LP1A', 'LP1B', 0.8108, 1.2162)}, 'CRES': {'OZ': ('CZ', 'LP1A', 'LP1B', 0.8108, 1.2162)}, 'PYR': {'NZ': ('LP1', 'CE1', 'CE2', 1.1611, 0.6778)}, 'PYRM': {'N1': ('LP1', 'C6', 'C2', 1.2376, 0.6648), 'N3': ('LP3', 'C4', 'C2', 1.2376, 0.6648)}, 'IMID': {'NE2': ('LP1', 'CE1', 'CD2', 0.808, 1.384)}, '4MIM': {'NE2': ('LP1', 'CE1', 'CD2', 0.808, 1.384)}, '4MIE': {'ND1': ('LP1', 'CE1', 'CG', 0.808, 1.384)}, 'PUR0': {'N1': ('LP1', 'C6', 'C2', 1.2376, 0.6648), 'N3': ('LP3', 'C4', 'C2', 1.2376, 0.6648), 'N7': ('LP7', 'C5', 'C8', 0.808, 1.384)}, 'PUR1': {'N1': ('LP1', 'C6', 'C2', 1.2376, 0.6648), 'N3': ('LP3', 'C4', 'C2', 1.2376, 0.6648), 'N7': ('LP7', 'C4', 'C8', 0.808, 1.384)}, 'MEOH': {'O1': ('C1', 'LP1A', 'LP1B', 0.8108, 1.2162)}, 'ETOH': {'O1': ('C1', 'LP1A', 'LP1B', 0.8108, 1.2162)}, 'PRO1': {'O1': ('C1', 'LP1A', 'LP1B', 0.8108, 1.2162)}, 'BUO1': {'O1': ('C1', 'LP1A', 'LP1B', 0.8108, 1.2162)}, 'PRO2': {'O2': ('C2', 'LP2A', 'LP2B', 0.8108, 1.2162)}, 'BUO2': {'O2': ('C2', 'LP2A', 'LP2B', 0.8108, 1.2162)}, 'PEO1': {'O1': ('C1', 'LP1A', 'LP1B', 0.8108, 1.2162)}, 'HXO1': {'O1': ('C1', 'LP1A', 'LP1B', 0.8108, 1.2162)}, 'PEO2': {'O2': ('C2', 'LP2A', 'LP2B', 0.8108, 1.2162)}, 'B3MO1': {'O1': ('C1', 'LP1A', 'LP1B', 0.8108, 1.2162)}, 'CPO1': {'O1': ('C1', 'LP1A', 'LP1B', 0.8108, 1.2162)}, 'ACET': {'O1': ('C2', 'LP1A', 'LP1B', 0.7229, 1.265), 'O2': ('C2', 'LP2A', 'LP2B', 0.7229, 1.265)}, 'DMP': {'O11': ('O13', 'O12', 'O14', 1.0, 0.6), 'O12': ('O14', 'O11', 'O13', 1.0, 0.6), 'O13': ('P', 'O11', 'O12', 0.6, 1.0), 'O14': ('P', 'O12', 'O11', 0.6, 1.0)}, 'MP_0': {'O2': ('P1', 'LP2A', 'LP2B', 0.76473, 1.16239), 'O3': ('P1', 'LP3A', 'LP3B', 0.76473, 1.16239)}, 'MP_1': {'O2': ('P1', 'LPA', 'LPB', 0.76473, 1.16239)}, 'HP_1': {'O1': ('P1', 'LP1A', 'LP1B', 0.76473, 1.16239), 'O2': ('P1', 'LP2A', 'LP2B', 0.76473, 1.16239)}, 'HP_2': {'O1': ('P1', 'LPA', 'LPB', 0.76473, 1.16239)}, 'ETAM': {'OH1': ('C5', 'LP1A', 'LP1B', 0.8108, 1.2162)}, 'CHOL': {'OH1': ('C5', 'LP1A', 'LP1B', 0.8108, 1.2162)}, 'ACEH': {'O2': ('C2', 'LP2A', 'LP2B', 0.6968, 1.2194), 'O1': ('C2', 'LP1A', 'LP1B', 0.8108, 1.2162)}, 'MAS': {'O': ('C', 'LP1A', 'LP1B', 0.6968, 1.2194), 'OM': ('C', 'LPMA', 'LPMB', 0.8108, 1.2162)}, 'EAS': {'O': ('C', 'LP1A', 'LP1B', 0.6968, 1.2194), 'OM': ('C', 'LPMA', 'LPMB', 0.8108, 1.2162)}, 'MPRO': {'O': ('C', 'LP1A', 'LP1B', 0.6968, 1.2194), 'OM': ('C', 'LPMA', 'LPMB', 0.8108, 1.2162)}, 'MBU': {'O': ('C', 'LP1A', 'LP1B', 0.6968, 1.2194), 'OM': ('C', 'LPMA', 'LPMB', 0.8108, 1.2162)}, 'FLUB': {'F6': ('C6', 'C1', 'C5', 0.75, 1.125)}, 'MAM1': {'N1': ('C1', 'HN1', 'HN2', 0.85, 1.05)}, 'EAM1': {'N1': ('C1', 'HN1', 'HN2', 0.85, 1.05)}, 'PAM1': {'N1': ('C1', 'HN1', 'HN2', 0.85, 1.05)}, 'PE': {'O1': ('O3', 'O2', 'O4', 1.0, 0.6), 'O2': ('O4', 'O1', 'O3', 1.0, 0.6), 'O3': ('P1', 'O1', 'O2', 0.6, 1.0), 'O4': ('P1', 'O2', 'O1', 0.6, 1.0)}, 'PC': {'O1': ('O3', 'O2', 'O4', 1.0, 0.6), 'O2': ('O4', 'O1', 'O3', 1.0, 0.6), 'O3': ('P1', 'O1', 'O2', 0.6, 1.0), 'O4': ('P1', 'O2', 'O1', 0.6, 1.0)}, 'GLYC': {'O4': ('C5', 'LP4A', 'LP4B', 0.8108, 1.2162), 'O6': ('C5', 'LP6A', 'LP6B', 0.6968, 1.2194), 'O8': ('C9', 'LP8A', 'LP8B', 0.8108, 1.2162), 'O10': ('C9', 'LP1A', 'LP1B', 0.6968, 1.2194)}, 'GLYP': {'O4': ('C5', 'LP4A', 'LP4B', 0.8108, 1.2162), 'O6': ('C5', 'LP6A', 'LP6B', 0.6968, 1.2194), 'O8': ('C9', 'LP8A', 'LP8B', 0.8108, 1.2162), 'O10': ('C9', 'LP1A', 'LP1B', 0.6968, 1.2194), 'OP1': ('OP3', 'OP2', 'OP4', 1.0, 0.6), 'OP2': ('OP4', 'OP1', 'OP3', 1.0, 0.6), 'OP3': ('P1', 'OP1', 'OP2', 0.6, 1.0), 'OP4': ('P1', 'OP2', 'OP1', 0.6, 1.0)}, 'PRPC': {'O22': ('C21', 'LP1A', 'LP1B', 0.6968, 1.2194), 'O32': ('C31', 'LP1C', 'LP1D', 0.6968, 1.2194), 'O21': ('C21', 'LPMA', 'LPMB', 0.8108, 1.2162), 'O31': ('C31', 'LPMC', 'LPMD', 0.8108, 1.2162), 'O12': ('O13', 'O11', 'O14', 1.0, 0.6), 'O11': ('O14', 'O12', 'O13', 1.0, 0.6), 'O13': ('P', 'O12', 'O11', 0.6, 1.0), 'O14': ('P', 'O11', 'O12', 0.6, 1.0)}, 'DMPC': {'O22': ('C21', 'LP1A', 'LP1B', 0.6968, 1.2194), 'O32': ('C31', 'LP1C', 'LP1D', 0.6968, 1.2194), 'O21': ('C21', 'LPMA', 'LPMB', 0.8108, 1.2162), 'O31': ('C31', 'LPMC', 'LPMD', 0.8108, 1.2162), 'O12': ('O13', 'O11', 'O14', 1.0, 0.6), 'O11': ('O14', 'O12', 'O13', 1.0, 0.6), 'O13': ('P', 'O12', 'O11', 0.6, 1.0), 'O14': ('P', 'O11', 'O12', 0.6, 1.0)}, 'DPPC': {'O22': ('C21', 'LP1A', 'LP1B', 0.6968, 1.2194), 'O32': ('C31', 'LP1C', 'LP1D', 0.6968, 1.2194), 'O21': ('C21', 'LPMA', 'LPMB', 0.8108, 1.2162), 'O31': ('C31', 'LPMC', 'LPMD', 0.8108, 1.2162), 'O12': ('O13', 'O11', 'O14', 1.0, 0.6), 'O11': ('O14', 'O12', 'O13', 1.0, 0.6), 'O13': ('P', 'O12', 'O11', 0.6, 1.0), 'O14': ('P', 'O11', 'O12', 0.6, 1.0)}, 'DSPC': {'O22': ('C21', 'LP1A', 'LP1B', 0.6968, 1.2194), 'O32': ('C31', 'LP1C', 'LP1D', 0.6968, 1.2194), 'O21': ('C21', 'LPMA', 'LPMB', 0.8108, 1.2162), 'O31': ('C31', 'LPMC', 'LPMD', 0.8108, 1.2162), 'O12': ('O13', 'O11', 'O14', 1.0, 0.6), 'O11': ('O14', 'O12', 'O13', 1.0, 0.6), 'O13': ('P', 'O12', 'O11', 0.6, 1.0), 'O14': ('P', 'O11', 'O12', 0.6, 1.0)}, 'DOPC': {'O22': ('C21', 'LP1A', 'LP1B', 0.6968, 1.2194), 'O32': ('C31', 'LP1A', 'LP1B', 0.6968, 1.2194), 'O21': ('C21', 'LPMA', 'LPMB', 0.8108, 1.2162), 'O31': ('C31', 'LPMC', 'LPMD', 0.8108, 1.2162), 'O12': ('O13', 'O11', 'O14', 1.0, 0.6), 'O11': ('O14', 'O12', 'O13', 1.0, 0.6), 'O13': ('P', 'O12', 'O11', 0.6, 1.0), 'O14': ('P', 'O11', 'O12', 0.6, 1.0)}, 'DLPE': {'O22': ('C21', 'LP1A', 'LP1B', 0.6968, 1.2194), 'O32': ('C31', 'LP1C', 'LP1D', 0.6968, 1.2194), 'O21': ('C21', 'LPMA', 'LPMB', 0.8108, 1.2162), 'O31': ('C31', 'LPMC', 'LPMD', 0.8108, 1.2162), 'O12': ('O13', 'O11', 'O14', 1.0, 0.6), 'O11': ('O14', 'O12', 'O13', 1.0, 0.6), 'O13': ('P', 'O12', 'O11', 0.6, 1.0), 'O14': ('P', 'O11', 'O12', 0.6, 1.0)}, 'DPPE': {'O22': ('C21', 'LP1A', 'LP1B', 0.6968, 1.2194), 'O32': ('C31', 'LP1A', 'LP1B', 0.6968, 1.2194), 'O21': ('C21', 'LPMA', 'LPMB', 0.8108, 1.2162), 'O31': ('C31', 'LPMC', 'LPMD', 0.8108, 1.2162), 'O12': ('O13', 'O11', 'O14', 1.0, 0.6), 'O11': ('O14', 'O12', 'O13', 1.0, 0.6), 'O13': ('P', 'O12', 'O11', 0.6, 1.0), 'O14': ('P', 'O11', 'O12', 0.6, 1.0)}, 'POPC': {'O22': ('C21', 'LP1A', 'LP1B', 0.6968, 1.2194), 'O32': ('C31', 'LP1A', 'LP1B', 0.6968, 1.2194), 'O21': ('C21', 'LPMA', 'LPMB', 0.8108, 1.2162), 'O31': ('C31', 'LPMC', 'LPMD', 0.8108, 1.2162), 'O12': ('O13', 'O11', 'O14', 1.0, 0.6), 'O11': ('O14', 'O12', 'O13', 1.0, 0.6), 'O13': ('P', 'O12', 'O11', 0.6, 1.0), 'O14': ('P', 'O11', 'O12', 0.6, 1.0)}, 'DOPE': {'O22': ('C21', 'LP1A', 'LP1B', 0.6968, 1.2194), 'O32': ('C31', 'LP1A', 'LP1B', 0.6968, 1.2194), 'O21': ('C21', 'LPMA', 'LPMB', 0.8108, 1.2162), 'O31': ('C31', 'LPMC', 'LPMD', 0.8108, 1.2162), 'O12': ('O13', 'O11', 'O14', 1.0, 0.6), 'O11': ('O14', 'O12', 'O13', 1.0, 0.6), 'O13': ('P', 'O12', 'O11', 0.6, 1.0), 'O14': ('P', 'O11', 'O12', 0.6, 1.0)}, 'POPE': {'O22': ('C21', 'LP1A', 'LP1B', 0.6968, 1.2194), 'O32': ('C31', 'LP1A', 'LP1B', 0.6968, 1.2194), 'O21': ('C21', 'LPMA', 'LPMB', 0.8108, 1.2162), 'O31': ('C31', 'LPMC', 'LPMD', 0.8108, 1.2162), 'O12': ('O13', 'O11', 'O14', 1.0, 0.6), 'O11': ('O14', 'O12', 'O13', 1.0, 0.6), 'O13': ('P', 'O12', 'O11', 0.6, 1.0), 'O14': ('P', 'O11', 'O12', 0.6, 1.0)}, 'DLPC': {'O22': ('C21', 'LP1A', 'LP1B', 0.6968, 1.2194), 'O32': ('C31', 'LP1C', 'LP1D', 0.6968, 1.2194), 'O21': ('C21', 'LPMA', 'LPMB', 0.8108, 1.2162), 'O31': ('C31', 'LPMC', 'LPMD', 0.8108, 1.2162), 'O12': ('O13', 'O11', 'O14', 1.0, 0.6), 'O11': ('O14', 'O12', 'O13', 1.0, 0.6), 'O13': ('P', 'O12', 'O11', 0.6, 1.0), 'O14': ('P', 'O11', 'O12', 0.6, 1.0)}}\n-patch_anisotropies = {'ACE': {'OY': ('CY', 'LPY1', 'LPY2', 0.82322, 1.14332)}, 'ACP': {'OY': ('CY', 'LPY1', 'LPY2', 0.82322, 1.14332)}, 'NNEU': {'N': ('CA', 'HT1', 'HT2', 0.85, 1.05)}, 'GNNU': {'N': ('CA', 'HT1', 'HT2', 0.85, 1.05)}, 'CTER': {'OT1': ('C', 'LPT1', 'LPT2', 0.7229, 1.265), 'OT2': ('C', 'LPT3', 'LPT4', 0.7229, 1.265)}, 'CTEG': {'OT1': ('C', 'LPT1', 'LPT2', 0.7229, 1.265), 'OT2': ('C', 'LPT3', 'LPT4', 0.7229, 1.265)}, 'CTEP': {'OT1': ('C', 'LPT1', 'LPT2', 0.7229, 1.265), 'OT2': ('C', 'LPT3', 'LPT4', 0.7229, 1.265)}, 'CNEU': {'OT1': ('C', 'LPT1', 'LPT2', 0.6968, 1.2194), 'OT2': ('C', 'LPT3', 'LPT4', 0.8108, 1.2162)}, 'CNEG': {'OT1': ('C', 'LPT1', 'LPT2', 0.6968, 1.2194), 'OT2': ('C', 'LPT3', 'LPT4', 0.8108, 1.2162)}, 'CNES': {'OT1': ('C', 'LPT1', 'LPT2', 0.6968, 1.2194), 'OT2': ('C', 'LPT3', 'LPT4', 0.8108, 1.2162)}, 'CT1': {'OT1': ('C', 'LPT1', 'LPT2', 0.6968, 1.2194), 'OT2': ('C', 'LPT3', 'LPT4', 0.8108, 1.2162)}, 'CT1G': {'OT1': ('C', 'LPT1', 'LPT2', 0.6968, 1.2194), 'OT2': ('C', 'LPT3', 'LPT4', 0.8108, 1.2162)}, 'ASPP': {'OD1': ('CG', 'LPP1', 'LPP2', 0.6968, 1.2194), 'OD2': ('CG', 'LPP3', 'LPP4', 0.8108, 1.2162)}, 'GLUP': {'OE1': ('CD', 'LPP1', 'LPP2', 0.6968, 1.2194), 'OE2': ('CD', 'LPP3', 'LPP4', 0.8108, 1.2162)}, 'LSN': {'NZ': ('CE', 'HZ1', 'HZ2', 0.85, 1.05)}, 'HS2': {'ND1': ('LPD1', 'CE1', 'CG', 0.808, 1.384)}, 'KAC': {'OH': ('CH', 'LPA', 'LPB', 0.82322, 1.14332)}, 'DACE': {'OY': ('CY', 'LPY1', 'LPY2', 0.82322, 1.14332)}, 'DACP': {'OY': ('CY', 'LPY1', 'LPY2', 0.82322, 1.14332)}, 'DNNEU': {'N': ('CA', 'HT1', 'HT2', 0.85, 1.05)}, 'DGNNU': {'N': ('CA', 'HT1', 'HT2', 0.85, 1.05)}, 'DCTER': {'OT1': ('C', 'LPT1', 'LPT2', 0.7229, 1.265), 'OT2': ('C', 'LPT3', 'LPT4', 0.7229, 1.265)}, 'DCTEG': {'OT1': ('C', 'LPT1', 'LPT2', 0.7229, 1.265), 'OT2': ('C', 'LPT3', 'LPT4', 0.7229, 1.265)}, 'DCTEP': {'OT1': ('C', 'LPT1', 'LPT2', 0.7229, 1.265), 'OT2': ('C', 'LPT3', 'LPT4', 0.7229, 1.265)}, 'DCTES': {'OT1': ('C', 'LPT1', 'LPT2', 0.7229, 1.265), 'OT2': ('C', 'LPT3', 'LPT4', 0.7229, 1.265)}, 'DCNEU': {'OT1': ('C', 'LPT1', 'LPT2', 0.6968, 1.2194), 'OT2': ('C', 'LPT3', 'LPT4', 0.8108, 1.2162)}, 'DCNEG': {'OT1': ('C', 'LPT1', 'LPT2', 0.6968, 1.2194), 'OT2': ('C', 'LPT3', 'LPT4', 0.8108, 1.2162)}, 'DCNES': {'OT1': ('C', 'LPT1', 'LPT2', 0.6968, 1.2194), 'OT2': ('C', 'LPT3', 'LPT4', 0.8108, 1.2162)}, 'DCT1': {'OT1': ('C', 'LPT1', 'LPT2', 0.6968, 1.2194), 'OT2': ('C', 'LPT3', 'LPT4', 0.8108, 1.2162)}, 'DCT1G': {'OT1': ('C', 'LPT1', 'LPT2', 0.6968, 1.2194), 'OT2': ('C', 'LPT3', 'LPT4', 0.8108, 1.2162)}, 'OMEA': {'O1': ('LPX1', 'LPMA', 'LPMB', 0.8889, 1.2222), 'O5': ('LPX5', 'LP5A', 'LP5B', 0.8889, 1.2222)}, 'OMEB': {'O1': ('LPX1', 'LPMA', 'LPMB', 0.8889, 1.2222), 'O5': ('LPX5', 'LP5A', 'LP5B', 0.8889, 1.2222)}, '1AOME': {'O1': ('LPX1', 'LPMA', 'LPMB', 0.8889, 1.2222), 'O5': ('LPX5', 'LP5A', 'LP5B', 0.8889, 1.2222)}, '1BOME': {'O1': ('LPX1', 'LPMA', 'LPMB', 0.8889, 1.2222), 'O5': ('LPX5', 'LP5A', 'LP5B', 0.8889, 1.2222)}, 'FOMEA': {'O1': ('LPX1', 'LPMA', 'LPMB', 0.8889, 1.2222), 'O4': ('LPX4', 'LP4A', 'LP4B', 0.8889, 1.2222)}, 'FOMEB': {'O1': ('LPX1', 'LPMA', 'LPMB', 0.8889, 1.2222), 'O4': ('LPX4', 'LP4A', 'LP4B', 0.8889, 1.2222)}}\n-delete_anisotropies = {'OMEA': ['O5'], 'OMEB': ['O5'], '1AOME': ['O5'], '1BOME': ['O5'], 'FOMEA': ['O4'], 'FOMEB': ['O4']}\n+residue_anisotropies = {\n+ 'ALAD': {'OY': ('CY', 'LPY1', 'LPY2', 0.82322, 1.14332), 'O': ('C', 'LPOA', 'LPOB', 0.82322, 1.14332)},\n+ 'ALA': {'O': ('C', 'LPOA', 'LPOB', 0.82322, 1.14332)},\n+ 'ARG': {'O': ('C', 'LPOA', 'LPOB', 0.82322, 1.14332)},\n+ 'ASN': {'O': ('C', 'LPOA', 'LPOB', 0.82322, 1.14332), 'OD1': ('CG', 'LPDA', 'LPDB', 0.88, 1.32)},\n+ 'ASP': {'O': ('C', 'LPOA', 'LPOB', 0.82322, 1.14332), 'OD1': ('CG', 'LP1A', 'LP1B', 0.7229, 1.265), 'OD2': ('CG', 'LP2A', 'LP2B', 0.7229, 1.265)},\n+ 'CYS': {'O': ('C', 'LPOA', 'LPOB', 0.82322, 1.14332), 'SG': ('CB', 'LPGA', 'LPGB', 0.88, 1.32)},\n+ 'GLN': {'O': ('C', 'LPOA', 'LPOB', 0.82322, 1.14332), 'OE1': ('CD', 'LPEA', 'LPEB', 0.82322, 1.14332)},\n+ 'GLU': {'O': ('C', 'LPOA', 'LPOB', 0.82322, 1.14332), 'OE1': ('CD', 'LP1A', 'LP1B', 0.7229, 1.265), 'OE2': ('CD', 'LP2A', 'LP2B', 0.7229, 1.265)},\n+ 'GLY': {'O': ('C', 'LPOA', 'LPOB', 0.82322, 1.14332)},\n+ 'HSD': {'O': ('C', 'LPOA', 'LPOB', 0.82322, 1.14332), 'NE2': ('LPE2', 'CE1', 'CD2', 0.808, 1.384)},\n+ 'HSE': {'O': ('C', 'LPOA', 'LPOB', 0.82322, 1.14332), 'ND1': ('LPD1', 'CE1', 'CG', 0.808, 1.384)},\n+ 'HSP': {'O': ('C', 'LPOA', 'LPOB', 0.82322, 1.14332)},\n+ 'ILE': {'O': ('C', 'LPOA', 'LPOB', 0.82322, 1.14332)},\n+ 'LEU': {'O': ('C', 'LPOA', 'LPOB', 0.82322, 1.14332)},\n+ 'LYS': {'O': ('C', 'LPOA', 'LPOB', 0.82322, 1.14332)},\n+ 'MET': {'O': ('C', 'LPOA', 'LPOB', 0.82322, 1.14332), 'SD': ('CE', 'LP1A', 'LP1B', 0.7808, 1.3662)},\n+ 'PHE': {'O': ('C', 'LPOA', 'LPOB', 0.82322, 1.14332)},\n+ 'PRO': {'O': ('C', 'LPOA', 'LPOB', 0.82322, 1.14332)},\n+ 'SER': {'O': ('C', 'LPOA', 'LPOB', 0.82322, 1.14332), 'OG': ('CB', 'LPGA', 'LPGB', 0.8108, 1.2162)},\n+ 'THR': {'O': ('C', 'LPOA', 'LPOB', 0.82322, 1.14332), 'OG1': ('CB', 'LPGA', 'LPGB', 0.8108, 1.2162)},\n+ 'TRP': {'O': ('C', 'LPOA', 'LPOB', 0.82322, 1.14332)},\n+ 'TYR': {'O': ('C', 'LPOA', 'LPOB', 0.82322, 1.14332), 'OH': ('CZ', 'LP1A', 'LP1B', 0.8108, 1.2162)},\n+ 'VAL': {'O': ('C', 'LPOA', 'LPOB', 0.82322, 1.14332)},\n+ 'ALDD': {'OY': ('CY', 'LPY1', 'LPY2', 0.82322, 1.14332), 'O': ('C', 'LPOA', 'LPOB', 0.82322, 1.14332)},\n+ 'DALA': {'O': ('C', 'LPOA', 'LPOB', 0.82322, 1.14332)},\n+ 'DARG': {'O': ('C', 'LPOA', 'LPOB', 0.82322, 1.14332)},\n+ 'DASN': {'O': ('C', 'LPOA', 'LPOB', 0.82322, 1.14332), 'OD1': ('CG', 'LPDA', 'LPDB', 0.88, 1.32)},\n+ 'DASP': {'O': ('C', 'LPOA', 'LPOB', 0.82322, 1.14332), 'OD1': ('CG', 'LP1A', 'LP1B', 0.7229, 1.265), 'OD2': ('CG', 'LP2A', 'LP2B', 0.7229, 1.265)},\n+ 'DCYS': {'O': ('C', 'LPOA', 'LPOB', 0.82322, 1.14332), 'SG': ('CB', 'LPGA', 'LPGB', 0.88, 1.32)},\n+ 'DGLN': {'O': ('C', 'LPOA', 'LPOB', 0.82322, 1.14332), 'OE1': ('CD', 'LPEA', 'LPEB', 0.82322, 1.14332)},\n+ 'DGLU': {'O': ('C', 'LPOA', 'LPOB', 0.82322, 1.14332), 'OE1': ('CD', 'LP1A', 'LP1B', 0.7229, 1.265), 'OE2': ('CD', 'LP2A', 'LP2B', 0.7229, 1.265)},\n+ 'DGLY': {'O': ('C', 'LPOA', 'LPOB', 0.82322, 1.14332)},\n+ 'DHSD': {'O': ('C', 'LPOA', 'LPOB', 0.82322, 1.14332), 'NE2': ('LPE2', 'CE1', 'CD2', 0.808, 1.384)},\n+ 'DHSE': {'O': ('C', 'LPOA', 'LPOB', 0.82322, 1.14332), 'ND1': ('LPD1', 'CE1', 'CG', 0.808, 1.384)},\n+ 'DHSP': {'O': ('C', 'LPOA', 'LPOB', 0.82322, 1.14332)},\n+ 'DILE': {'O': ('C', 'LPOA', 'LPOB', 0.82322, 1.14332)},\n+ 'DLEU': {'O': ('C', 'LPOA', 'LPOB', 0.82322, 1.14332)},\n+ 'DLYS': {'O': ('C', 'LPOA', 'LPOB', 0.82322, 1.14332)},\n+ 'DMET': {'O': ('C', 'LPOA', 'LPOB', 0.82322, 1.14332), 'SD': ('CE', 'LP1A', 'LP1B', 0.7808, 1.3662)},\n+ 'DPHE': {'O': ('C', 'LPOA', 'LPOB', 0.82322, 1.14332)},\n+ 'DPRO': {'O': ('C', 'LPOA', 'LPOB', 0.82322, 1.14332)},\n+ 'DSER': {'O': ('C', 'LPOA', 'LPOB', 0.82322, 1.14332), 'OG': ('CB', 'LPGA', 'LPGB', 0.8108, 1.2162)},\n+ 'DTHR': {'O': ('C', 'LPOA', 'LPOB', 0.82322, 1.14332), 'OG1': ('CB', 'LPGA', 'LPGB', 0.8108, 1.2162)},\n+ 'DTRP': {'O': ('C', 'LPOA', 'LPOB', 0.82322, 1.14332)},\n+ 'DTYR': {'O': ('C', 'LPOA', 'LPOB', 0.82322, 1.14332), 'OH': ('CZ', 'LP1A', 'LP1B', 0.8108, 1.2162)},\n+ 'DVAL': {'O': ('C', 'LPOA', 'LPOB', 0.82322, 1.14332)},\n+ 'ALLO': {'O1': ('C1', 'LP1A', 'LP1B', 0.85956, 1.13122), 'O2': ('C2', 'LP2A', 'LP2B', 0.8108, 1.2162), 'O3': ('C3', 'LP3A', 'LP3B', 0.8108, 1.2162), 'O4': ('C4', 'LP4A', 'LP4B', 0.8108, 1.2162), 'O5': ('C5', 'LP5A', 'LP5B', 0.8108, 1.2162), 'O6': ('C6', 'LP6A', 'LP6B', 0.8108, 1.2162)},\n+ 'PSIC': {'O1': ('C1', 'LP1A', 'LP1B', 0.8108, 1.2162), 'O2': ('C2', 'LP2A', 'LP2B', 0.8665, 1.07246), 'O3': ('C3', 'LP3A', 'LP3B', 0.8108, 1.2162), 'O4': ('C4', 'LP4A', 'LP4B', 0.8108, 1.2162), 'O5': ('C5', 'LP5A', 'LP5B', 0.8108, 1.2162), 'O6': ('C6', 'LP6A', 'LP6B', 0.8108, 1.2162)},\n+ 'EGLY': {'O1': ('C1', 'LP1A', 'LP1B', 0.8108, 1.2162), 'O2': ('C2', 'LP2A', 'LP2B', 0.8108, 1.2162)},\n+ 'MGLYOL': {'O1': ('C1', 'LP1A', 'LP1B', 0.8108, 1.2162), 'O2': ('C2', 'LP2A', 'LP2B', 0.8108, 1.2162), 'O3': ('C3', 'LP3A', 'LP3B', 0.8108, 1.2162)},\n+ 'MERYOL': {'O1': ('C1', 'LP1A', 'LP1B', 0.8108, 1.2162), 'O2': ('C2', 'LP2A', 'LP2B', 0.8108, 1.2162), 'O3': ('C3', 'LP3A', 'LP3B', 0.8108, 1.2162), 'O4': ('C4', 'LP4A', 'LP4B', 0.8108, 1.2162)},\n+ 'DTHROL': {'O1': ('C1', 'LP1A', 'LP1B', 0.8108, 1.2162), 'O2': ('C2', 'LP2A', 'LP2B', 0.8108, 1.2162), 'O3': ('C3', 'LP3A', 'LP3B', 0.8108, 1.2162), 'O4': ('C4', 'LP4A', 'LP4B', 0.8108, 1.2162)},\n+ 'LTHROL': {'O1': ('C1', 'LP1A', 'LP1B', 0.8108, 1.2162), 'O2': ('C2', 'LP2A', 'LP2B', 0.8108, 1.2162), 'O3': ('C3', 'LP3A', 'LP3B', 0.8108, 1.2162), 'O4': ('C4', 'LP4A', 'LP4B', 0.8108, 1.2162)},\n+ 'MRIBOL': {'O1': ('C1', 'LP1A', 'LP1B', 0.8108, 1.2162), 'O2': ('C2', 'LP2A', 'LP2B', 0.8108, 1.2162), 'O3': ('C3', 'LP3A', 'LP3B', 0.8108, 1.2162), 'O4': ('C4', 'LP4A', 'LP4B', 0.8108, 1.2162), 'O5': ('C5', 'LP5A', 'LP5B', 0.8108, 1.2162)},\n+ 'DARAOL': {'O1': ('C1', 'LP1A', 'LP1B', 0.8108, 1.2162), 'O2': ('C2', 'LP2A', 'LP2B', 0.8108, 1.2162), 'O3': ('C3', 'LP3A', 'LP3B', 0.8108, 1.2162), 'O4': ('C4', 'LP4A', 'LP4B', 0.8108, 1.2162), 'O5': ('C5', 'LP5A', 'LP5B', 0.8108, 1.2162)},\n+ 'LARAOL': {'O1': ('C1', 'LP1A', 'LP1B', 0.8108, 1.2162), 'O2': ('C2', 'LP2A', 'LP2B', 0.8108, 1.2162), 'O3': ('C3', 'LP3A', 'LP3B', 0.8108, 1.2162), 'O4': ('C4', 'LP4A', 'LP4B', 0.8108, 1.2162), 'O5': ('C5', 'LP5A', 'LP5B', 0.8108, 1.2162)},\n+ 'MXYLOL': {'O1': ('C1', 'LP1A', 'LP1B', 0.8108, 1.2162), 'O2': ('C2', 'LP2A', 'LP2B', 0.8108, 1.2162), 'O3': ('C3', 'LP3A', 'LP3B', 0.8108, 1.2162), 'O4': ('C4', 'LP4A', 'LP4B', 0.8108, 1.2162), 'O5': ('C5', 'LP5A', 'LP5B', 0.8108, 1.2162)},\n+ 'MALLOL': {'O1': ('C1', 'LP1A', 'LP1B', 0.8108, 1.2162), 'O2': ('C2', 'LP2A', 'LP2B', 0.8108, 1.2162), 'O3': ('C3', 'LP3A', 'LP3B', 0.8108, 1.2162), 'O4': ('C4', 'LP4A', 'LP4B', 0.8108, 1.2162), 'O5': ('C5', 'LP5A', 'LP5B', 0.8108, 1.2162), 'O6': ('C6', 'LP6A', 'LP6B', 0.8108, 1.2162)},\n+ 'DALTOL': {'O1': ('C1', 'LP1A', 'LP1B', 0.8108, 1.2162), 'O2': ('C2', 'LP2A', 'LP2B', 0.8108, 1.2162), 'O3': ('C3', 'LP3A', 'LP3B', 0.8108, 1.2162), 'O4': ('C4', 'LP4A', 'LP4B', 0.8108, 1.2162), 'O5': ('C5', 'LP5A', 'LP5B', 0.8108, 1.2162), 'O6': ('C6', 'LP6A', 'LP6B', 0.8108, 1.2162)},\n+ 'LALTOL': {'O1': ('C1', 'LP1A', 'LP1B', 0.8108, 1.2162), 'O2': ('C2', 'LP2A', 'LP2B', 0.8108, 1.2162), 'O3': ('C3', 'LP3A', 'LP3B', 0.8108, 1.2162), 'O4': ('C4', 'LP4A', 'LP4B', 0.8108, 1.2162), 'O5': ('C5', 'LP5A', 'LP5B', 0.8108, 1.2162), 'O6': ('C6', 'LP6A', 'LP6B', 0.8108, 1.2162)},\n+ 'DGLUOL': {'O1': ('C1', 'LP1A', 'LP1B', 0.8108, 1.2162), 'O2': ('C2', 'LP2A', 'LP2B', 0.8108, 1.2162), 'O3': ('C3', 'LP3A', 'LP3B', 0.8108, 1.2162), 'O4': ('C4', 'LP4A', 'LP4B', 0.8108, 1.2162), 'O5': ('C5', 'LP5A', 'LP5B', 0.8108, 1.2162), 'O6': ('C6', 'LP6A', 'LP6B', 0.8108, 1.2162)},\n+ 'LGLUOL': {'O1': ('C1', 'LP1A', 'LP1B', 0.8108, 1.2162), 'O2': ('C2', 'LP2A', 'LP2B', 0.8108, 1.2162), 'O3': ('C3', 'LP3A', 'LP3B', 0.8108, 1.2162), 'O4': ('C4', 'LP4A', 'LP4B', 0.8108, 1.2162), 'O5': ('C5', 'LP5A', 'LP5B', 0.8108, 1.2162), 'O6': ('C6', 'LP6A', 'LP6B', 0.8108, 1.2162)},\n+ 'DMANOL': {'O1': ('C1', 'LP1A', 'LP1B', 0.8108, 1.2162), 'O2': ('C2', 'LP2A', 'LP2B', 0.8108, 1.2162), 'O3': ('C3', 'LP3A', 'LP3B', 0.8108, 1.2162), 'O4': ('C4', 'LP4A', 'LP4B', 0.8108, 1.2162), 'O5': ('C5', 'LP5A', 'LP5B', 0.8108, 1.2162), 'O6': ('C6', 'LP6A', 'LP6B', 0.8108, 1.2162)},\n+ 'LMANOL': {'O1': ('C1', 'LP1A', 'LP1B', 0.8108, 1.2162), 'O2': ('C2', 'LP2A', 'LP2B', 0.8108, 1.2162), 'O3': ('C3', 'LP3A', 'LP3B', 0.8108, 1.2162), 'O4': ('C4', 'LP4A', 'LP4B', 0.8108, 1.2162), 'O5': ('C5', 'LP5A', 'LP5B', 0.8108, 1.2162), 'O6': ('C6', 'LP6A', 'LP6B', 0.8108, 1.2162)},\n+ 'DGULOL': {'O1': ('C1', 'LP1A', 'LP1B', 0.8108, 1.2162), 'O2': ('C2', 'LP2A', 'LP2B', 0.8108, 1.2162), 'O3': ('C3', 'LP3A', 'LP3B', 0.8108, 1.2162), 'O4': ('C4', 'LP4A', 'LP4B', 0.8108, 1.2162), 'O5': ('C5', 'LP5A', 'LP5B', 0.8108, 1.2162), 'O6': ('C6', 'LP6A', 'LP6B', 0.8108, 1.2162)},\n+ 'LGULOL': {'O1': ('C1', 'LP1A', 'LP1B', 0.8108, 1.2162), 'O2': ('C2', 'LP2A', 'LP2B', 0.8108, 1.2162), 'O3': ('C3', 'LP3A', 'LP3B', 0.8108, 1.2162), 'O4': ('C4', 'LP4A', 'LP4B', 0.8108, 1.2162), 'O5': ('C5', 'LP5A', 'LP5B', 0.8108, 1.2162), 'O6': ('C6', 'LP6A', 'LP6B', 0.8108, 1.2162)},\n+ 'DIDIOL': {'O1': ('C1', 'LP1A', 'LP1B', 0.8108, 1.2162), 'O2': ('C2', 'LP2A', 'LP2B', 0.8108, 1.2162), 'O3': ('C3', 'LP3A', 'LP3B', 0.8108, 1.2162), 'O4': ('C4', 'LP4A', 'LP4B', 0.8108, 1.2162), 'O5': ('C5', 'LP5A', 'LP5B', 0.8108, 1.2162), 'O6': ('C6', 'LP6A', 'LP6B', 0.8108, 1.2162)},\n+ 'LIDIOL': {'O1': ('C1', 'LP1A', 'LP1B', 0.8108, 1.2162), 'O2': ('C2', 'LP2A', 'LP2B', 0.8108, 1.2162), 'O3': ('C3', 'LP3A', 'LP3B', 0.8108, 1.2162), 'O4': ('C4', 'LP4A', 'LP4B', 0.8108, 1.2162), 'O5': ('C5', 'LP5A', 'LP5B', 0.8108, 1.2162), 'O6': ('C6', 'LP6A', 'LP6B', 0.8108, 1.2162)},\n+ 'MGALOL': {'O1': ('C1', 'LP1A', 'LP1B', 0.8108, 1.2162), 'O2': ('C2', 'LP2A', 'LP2B', 0.8108, 1.2162), 'O3': ('C3', 'LP3A', 'LP3B', 0.8108, 1.2162), 'O4': ('C4', 'LP4A', 'LP4B', 0.8108, 1.2162), 'O5': ('C5', 'LP5A', 'LP5B', 0.8108, 1.2162), 'O6': ('C6', 'LP6A', 'LP6B', 0.8108, 1.2162)},\n+ 'AGLC': {'O1': ('C1', 'LP1A', 'LP1B', 0.8108, 1.2162), 'O2': ('C2', 'LP2A', 'LP2B', 0.8108, 1.2162), 'O3': ('C3', 'LP3A', 'LP3B', 0.8108, 1.2162), 'O4': ('C4', 'LP4A', 'LP4B', 0.8108, 1.2162), 'O5': ('LPX5', 'LP5A', 'LP5B', 0.8889, 1.2222), 'O6': ('C6', 'LP6A', 'LP6B', 0.8108, 1.2162)},\n+ 'BGLC': {'O1': ('C1', 'LP1A', 'LP1B', 0.8108, 1.2162), 'O2': ('C2', 'LP2A', 'LP2B', 0.8108, 1.2162), 'O3': ('C3', 'LP3A', 'LP3B', 0.8108, 1.2162), 'O4': ('C4', 'LP4A', 'LP4B', 0.8108, 1.2162), 'O5': ('LPX5', 'LP5A', 'LP5B', 0.8889, 1.2222), 'O6': ('C6', 'LP6A', 'LP6B', 0.8108, 1.2162)},\n+ 'AALT': {'O1': ('C1', 'LP1A', 'LP1B', 0.8108, 1.2162), 'O2': ('C2', 'LP2A', 'LP2B', 0.8108, 1.2162), 'O3': ('C3', 'LP3A', 'LP3B', 0.8108, 1.2162), 'O4': ('C4', 'LP4A', 'LP4B', 0.8108, 1.2162), 'O5': ('LPX5', 'LP5A', 'LP5B', 0.8889, 1.2222), 'O6': ('C6', 'LP6A', 'LP6B', 0.8108, 1.2162)},\n+ 'BALT': {'O1': ('C1', 'LP1A', 'LP1B', 0.8108, 1.2162), 'O2': ('C2', 'LP2A', 'LP2B', 0.8108, 1.2162), 'O3': ('C3', 'LP3A', 'LP3B', 0.8108, 1.2162), 'O4': ('C4', 'LP4A', 'LP4B', 0.8108, 1.2162), 'O5': ('LPX5', 'LP5A', 'LP5B', 0.8889, 1.2222), 'O6': ('C6', 'LP6A', 'LP6B', 0.8108, 1.2162)},\n+ 'AALL': {'O1': ('C1', 'LP1A', 'LP1B', 0.8108, 1.2162), 'O2': ('C2', 'LP2A', 'LP2B', 0.8108, 1.2162), 'O3': ('C3', 'LP3A', 'LP3B', 0.8108, 1.2162), 'O4': ('C4', 'LP4A', 'LP4B', 0.8108, 1.2162), 'O5': ('LPX5', 'LP5A', 'LP5B', 0.8889, 1.2222), 'O6': ('C6', 'LP6A', 'LP6B', 0.8108, 1.2162)},\n+ 'BALL': {'O1': ('C1', 'LP1A', 'LP1B', 0.8108, 1.2162), 'O2': ('C2', 'LP2A', 'LP2B', 0.8108, 1.2162), 'O3': ('C3', 'LP3A', 'LP3B', 0.8108, 1.2162), 'O4': ('C4', 'LP4A', 'LP4B', 0.8108, 1.2162), 'O5': ('LPX5', 'LP5A', 'LP5B', 0.8889, 1.2222), 'O6': ('C6', 'LP6A', 'LP6B', 0.8108, 1.2162)},\n+ 'AGAL': {'O1': ('C1', 'LP1A', 'LP1B', 0.8108, 1.2162), 'O2': ('C2', 'LP2A', 'LP2B', 0.8108, 1.2162), 'O3': ('C3', 'LP3A', 'LP3B', 0.8108, 1.2162), 'O4': ('C4', 'LP4A', 'LP4B', 0.8108, 1.2162), 'O5': ('LPX5', 'LP5A', 'LP5B', 0.8889, 1.2222), 'O6': ('C6', 'LP6A', 'LP6B', 0.8108, 1.2162)},\n+ 'BGAL': {'O1': ('C1', 'LP1A', 'LP1B', 0.8108, 1.2162), 'O2': ('C2', 'LP2A', 'LP2B', 0.8108, 1.2162), 'O3': ('C3', 'LP3A', 'LP3B', 0.8108, 1.2162), 'O4': ('C4', 'LP4A', 'LP4B', 0.8108, 1.2162), 'O5': ('LPX5', 'LP5A', 'LP5B', 0.8889, 1.2222), 'O6': ('C6', 'LP6A', 'LP6B', 0.8108, 1.2162)},\n+ 'AGUL': {'O1': ('C1', 'LP1A', 'LP1B', 0.8108, 1.2162), 'O2': ('C2', 'LP2A', 'LP2B', 0.8108, 1.2162), 'O3': ('C3', 'LP3A', 'LP3B', 0.8108, 1.2162), 'O4': ('C4', 'LP4A', 'LP4B', 0.8108, 1.2162), 'O5': ('LPX5', 'LP5A', 'LP5B', 0.8889, 1.2222), 'O6': ('C6', 'LP6A', 'LP6B', 0.8108, 1.2162)},\n+ 'BGUL': {'O1': ('C1', 'LP1A', 'LP1B', 0.8108, 1.2162), 'O2': ('C2', 'LP2A', 'LP2B', 0.8108, 1.2162), 'O3': ('C3', 'LP3A', 'LP3B', 0.8108, 1.2162), 'O4': ('C4', 'LP4A', 'LP4B', 0.8108, 1.2162), 'O5': ('LPX5', 'LP5A', 'LP5B', 0.8889, 1.2222), 'O6': ('C6', 'LP6A', 'LP6B', 0.8108, 1.2162)},\n+ 'AIDO': {'O1': ('C1', 'LP1A', 'LP1B', 0.8108, 1.2162), 'O2': ('C2', 'LP2A', 'LP2B', 0.8108, 1.2162), 'O3': ('C3', 'LP3A', 'LP3B', 0.8108, 1.2162), 'O4': ('C4', 'LP4A', 'LP4B', 0.8108, 1.2162), 'O5': ('LPX5', 'LP5A', 'LP5B', 0.8889, 1.2222), 'O6': ('C6', 'LP6A', 'LP6B', 0.8108, 1.2162)},\n+ 'BIDO': {'O1': ('C1', 'LP1A', 'LP1B', 0.8108, 1.2162), 'O2': ('C2', 'LP2A', 'LP2B', 0.8108, 1.2162), 'O3': ('C3', 'LP3A', 'LP3B', 0.8108, 1.2162), 'O4': ('C4', 'LP4A', 'LP4B', 0.8108, 1.2162), 'O5': ('LPX5', 'LP5A', 'LP5B', 0.8889, 1.2222), 'O6': ('C6', 'LP6A', 'LP6B', 0.8108, 1.2162)},\n+ 'AMAN': {'O1': ('C1', 'LP1A', 'LP1B', 0.8108, 1.2162), 'O2': ('C2', 'LP2A', 'LP2B', 0.8108, 1.2162), 'O3': ('C3', 'LP3A', 'LP3B', 0.8108, 1.2162), 'O4': ('C4', 'LP4A', 'LP4B', 0.8108, 1.2162), 'O5': ('LPX5', 'LP5A', 'LP5B', 0.8889, 1.2222), 'O6': ('C6', 'LP6A', 'LP6B', 0.8108, 1.2162)},\n+ 'BMAN': {'O1': ('C1', 'LP1A', 'LP1B', 0.8108, 1.2162), 'O2': ('C2', 'LP2A', 'LP2B', 0.8108, 1.2162), 'O3': ('C3', 'LP3A', 'LP3B', 0.8108, 1.2162), 'O4': ('C4', 'LP4A', 'LP4B', 0.8108, 1.2162), 'O5': ('LPX5', 'LP5A', 'LP5B', 0.8889, 1.2222), 'O6': ('C6', 'LP6A', 'LP6B', 0.8108, 1.2162)},\n+ 'ATAL': {'O1': ('C1', 'LP1A', 'LP1B', 0.8108, 1.2162), 'O2': ('C2', 'LP2A', 'LP2B', 0.8108, 1.2162), 'O3': ('C3', 'LP3A', 'LP3B', 0.8108, 1.2162), 'O4': ('C4', 'LP4A', 'LP4B', 0.8108, 1.2162), 'O5': ('LPX5', 'LP5A', 'LP5B', 0.8889, 1.2222), 'O6': ('C6', 'LP6A', 'LP6B', 0.8108, 1.2162)},\n+ 'BTAL': {'O1': ('C1', 'LP1A', 'LP1B', 0.8108, 1.2162), 'O2': ('C2', 'LP2A', 'LP2B', 0.8108, 1.2162), 'O3': ('C3', 'LP3A', 'LP3B', 0.8108, 1.2162), 'O4': ('C4', 'LP4A', 'LP4B', 0.8108, 1.2162), 'O5': ('LPX5', 'LP5A', 'LP5B', 0.8889, 1.2222), 'O6': ('C6', 'LP6A', 'LP6B', 0.8108, 1.2162)},\n+ 'ARIB': {'O1': ('C1', 'LP1A', 'LP1B', 0.8108, 1.2162), 'O2': ('C2', 'LP2A', 'LP2B', 0.8108, 1.2162), 'O3': ('C3', 'LP3A', 'LP3B', 0.8108, 1.2162), 'O4': ('LPX4', 'LP4A', 'LP4B', 0.8889, 1.2222), 'O5': ('C5', 'LP5A', 'LP5B', 0.8108, 1.2162)},\n+ 'BRIB': {'O1': ('C1', 'LP1A', 'LP1B', 0.8108, 1.2162), 'O2': ('C2', 'LP2A', 'LP2B', 0.8108, 1.2162), 'O3': ('C3', 'LP3A', 'LP3B', 0.8108, 1.2162), 'O4': ('LPX4', 'LP4A', 'LP4B', 0.8889, 1.2222), 'O5': ('C5', 'LP5A', 'LP5B', 0.8108, 1.2162)},\n+ 'AARB': {'O1': ('C1', 'LP1A', 'LP1B', 0.8108, 1.2162), 'O2': ('C2', 'LP2A', 'LP2B', 0.8108, 1.2162), 'O3': ('C3', 'LP3A', 'LP3B', 0.8108, 1.2162), 'O4': ('LPX4', 'LP4A', 'LP4B', 0.8889, 1.2222), 'O5': ('C5', 'LP5A', 'LP5B', 0.8108, 1.2162)},\n+ 'BARB': {'O1': ('C1', 'LP1A', 'LP1B', 0.8108, 1.2162), 'O2': ('C2', 'LP2A', 'LP2B', 0.8108, 1.2162), 'O3': ('C3', 'LP3A', 'LP3B', 0.8108, 1.2162), 'O4': ('LPX4', 'LP4A', 'LP4B', 0.8889, 1.2222), 'O5': ('C5', 'LP5A', 'LP5B', 0.8108, 1.2162)},\n+ 'AXYF': {'O1': ('C1', 'LP1A', 'LP1B', 0.8108, 1.2162), 'O2': ('C2', 'LP2A', 'LP2B', 0.8108, 1.2162), 'O3': ('C3', 'LP3A', 'LP3B', 0.8108, 1.2162), 'O4': ('LPX4', 'LP4A', 'LP4B', 0.8889, 1.2222), 'O5': ('C5', 'LP5A', 'LP5B', 0.8108, 1.2162)},\n+ 'BXYF': {'O1': ('C1', 'LP1A', 'LP1B', 0.8108, 1.2162), 'O2': ('C2', 'LP2A', 'LP2B', 0.8108, 1.2162), 'O3': ('C3', 'LP3A', 'LP3B', 0.8108, 1.2162), 'O4': ('LPX4', 'LP4A', 'LP4B', 0.8889, 1.2222), 'O5': ('C5', 'LP5A', 'LP5B', 0.8108, 1.2162)},\n+ 'ALYF': {'O1': ('C1', 'LP1A', 'LP1B', 0.8108, 1.2162), 'O2': ('C2', 'LP2A', 'LP2B', 0.8108, 1.2162), 'O3': ('C3', 'LP3A', 'LP3B', 0.8108, 1.2162), 'O4': ('LPX4', 'LP4A', 'LP4B', 0.8889, 1.2222), 'O5': ('C5', 'LP5A', 'LP5B', 0.8108, 1.2162)},\n+ 'BLYF': {'O1': ('C1', 'LP1A', 'LP1B', 0.8108, 1.2162), 'O2': ('C2', 'LP2A', 'LP2B', 0.8108, 1.2162), 'O3': ('C3', 'LP3A', 'LP3B', 0.8108, 1.2162), 'O4': ('LPX4', 'LP4A', 'LP4B', 0.8889, 1.2222), 'O5': ('C5', 'LP5A', 'LP5B', 0.8108, 1.2162)},\n+ 'ADEO': {'O1': ('C1', 'LP1A', 'LP1B', 0.8108, 1.2162), 'O3': ('C3', 'LP3A', 'LP3B', 0.8108, 1.2162), 'O4': ('LPX4', 'LP4A', 'LP4B', 0.8889, 1.2222), 'O5': ('C5', 'LP5A', 'LP5B', 0.8108, 1.2162)},\n+ 'BDEO': {'O1': ('C1', 'LP1A', 'LP1B', 0.8108, 1.2162), 'O3': ('C3', 'LP3A', 'LP3B', 0.8108, 1.2162), 'O4': ('LPX4', 'LP4A', 'LP4B', 0.8889, 1.2222), 'O5': ('C5', 'LP5A', 'LP5B', 0.8108, 1.2162)},\n+ 'AFRU': {'O1': ('C1', 'LP1A', 'LP1B', 0.8108, 1.2162), 'O2': ('C2', 'LP2A', 'LP2B', 0.8108, 1.2162), 'O3': ('C3', 'LP3A', 'LP3B', 0.8108, 1.2162), 'O4': ('C4', 'LP4A', 'LP4B', 0.8108, 1.2162), 'O5': ('LPX5', 'LP5A', 'LP5B', 0.8889, 1.2222), 'O6': ('C6', 'LP6A', 'LP6B', 0.8108, 1.2162)},\n+ 'BFRU': {'O1': ('C1', 'LP1A', 'LP1B', 0.8108, 1.2162), 'O2': ('C2', 'LP2A', 'LP2B', 0.8108, 1.2162), 'O3': ('C3', 'LP3A', 'LP3B', 0.8108, 1.2162), 'O4': ('C4', 'LP4A', 'LP4B', 0.8108, 1.2162), 'O5': ('LPX5', 'LP5A', 'LP5B', 0.8889, 1.2222), 'O6': ('C6', 'LP6A', 'LP6B', 0.8108, 1.2162)},\n+ 'AGALA': {'O1': ('C1', 'LP1A', 'LP1B', 0.8108, 1.2162), 'O2': ('C2', 'LP2A', 'LP2B', 0.8108, 1.2162), 'O3': ('C3', 'LP3A', 'LP3B', 0.8108, 1.2162), 'O4': ('C4', 'LP4A', 'LP4B', 0.8108, 1.2162), 'O5': ('LPX5', 'LP5A', 'LP5B', 0.8889, 1.2222), 'O61': ('C6', 'LPT1', 'LPT2', 0.7229, 1.265), 'O62': ('C6', 'LPT3', 'LPT4', 0.7229, 1.265)},\n+ 'BGALA': {'O1': ('C1', 'LP1A', 'LP1B', 0.8108, 1.2162), 'O2': ('C2', 'LP2A', 'LP2B', 0.8108, 1.2162), 'O3': ('C3', 'LP3A', 'LP3B', 0.8108, 1.2162), 'O4': ('C4', 'LP4A', 'LP4B', 0.8108, 1.2162), 'O5': ('LPX5', 'LP5A', 'LP5B', 0.8889, 1.2222), 'O61': ('C6', 'LPT1', 'LPT2', 0.7229, 1.265), 'O62': ('C6', 'LPT3', 'LPT4', 0.7229, 1.265)},\n+ 'AGLCA': {'O1': ('C1', 'LP1A', 'LP1B', 0.8108, 1.2162), 'O2': ('C2', 'LP2A', 'LP2B', 0.8108, 1.2162), 'O3': ('C3', 'LP3A', 'LP3B', 0.8108, 1.2162), 'O4': ('C4', 'LP4A', 'LP4B', 0.8108, 1.2162), 'O5': ('LPX5', 'LP5A', 'LP5B', 0.8889, 1.2222), 'O61': ('C6', 'LPT1', 'LPT2', 0.7229, 1.265), 'O62': ('C6', 'LPT3', 'LPT4', 0.7229, 1.265)},\n+ 'BGLCA': {'O1': ('C1', 'LP1A', 'LP1B', 0.8108, 1.2162), 'O2': ('C2', 'LP2A', 'LP2B', 0.8108, 1.2162), 'O3': ('C3', 'LP3A', 'LP3B', 0.8108, 1.2162), 'O4': ('C4', 'LP4A', 'LP4B', 0.8108, 1.2162), 'O5': ('LPX5', 'LP5A', 'LP5B', 0.8889, 1.2222), 'O61': ('C6', 'LPT1', 'LPT2', 0.7229, 1.265), 'O62': ('C6', 'LPT3', 'LPT4', 0.7229, 1.265)},\n+ 'AIDOA': {'O1': ('C1', 'LP1A', 'LP1B', 0.8108, 1.2162), 'O2': ('C2', 'LP2A', 'LP2B', 0.8108, 1.2162), 'O3': ('C3', 'LP3A', 'LP3B', 0.8108, 1.2162), 'O4': ('C4', 'LP4A', 'LP4B', 0.8108, 1.2162), 'O5': ('LPX5', 'LP5A', 'LP5B', 0.8889, 1.2222), 'O61': ('C6', 'LPT1', 'LPT2', 0.7229, 1.265), 'O62': ('C6', 'LPT3', 'LPT4', 0.7229, 1.265)},\n+ 'BIDOA': {'O1': ('C1', 'LP1A', 'LP1B', 0.8108, 1.2162), 'O2': ('C2', 'LP2A', 'LP2B', 0.8108, 1.2162), 'O3': ('C3', 'LP3A', 'LP3B', 0.8108, 1.2162), 'O4': ('C4', 'LP4A', 'LP4B', 0.8108, 1.2162), 'O5': ('LPX5', 'LP5A', 'LP5B', 0.8889, 1.2222), 'O61': ('C6', 'LPT1', 'LPT2', 0.7229, 1.265), 'O62': ('C6', 'LPT3', 'LPT4', 0.7229, 1.265)},\n+ 'AGLCNA': {'O1': ('C1', 'LP1A', 'LP1B', 0.8108, 1.2162), 'O3': ('C3', 'LP3A', 'LP3B', 0.8108, 1.2162), 'O4': ('C4', 'LP4A', 'LP4B', 0.8108, 1.2162), 'O5': ('LPX5', 'LP5A', 'LP5B', 0.8889, 1.2222), 'O6': ('C6', 'LP6A', 'LP6B', 0.8108, 1.2162), 'O': ('C', 'LPY1', 'LPY2', 0.82322, 1.14332)},\n+ 'BGLCNA': {'O1': ('C1', 'LP1A', 'LP1B', 0.8108, 1.2162), 'O3': ('C3', 'LP3A', 'LP3B', 0.8108, 1.2162), 'O4': ('C4', 'LP4A', 'LP4B', 0.8108, 1.2162), 'O5': ('LPX5', 'LP5A', 'LP5B', 0.8889, 1.2222), 'O6': ('C6', 'LP6A', 'LP6B', 0.8108, 1.2162), 'O': ('C', 'LPY1', 'LPY2', 0.82322, 1.14332)},\n+ 'AGALNA': {'O1': ('C1', 'LP1A', 'LP1B', 0.8108, 1.2162), 'O3': ('C3', 'LP3A', 'LP3B', 0.8108, 1.2162), 'O4': ('C4', 'LP4A', 'LP4B', 0.8108, 1.2162), 'O5': ('LPX5', 'LP5A', 'LP5B', 0.8889, 1.2222), 'O6': ('C6', 'LP6A', 'LP6B', 0.8108, 1.2162), 'O': ('C', 'LPY1', 'LPY2', 0.82322, 1.14332)},\n+ 'BGALNA': {'O1': ('C1', 'LP1A', 'LP1B', 0.8108, 1.2162), 'O3': ('C3', 'LP3A', 'LP3B', 0.8108, 1.2162), 'O4': ('C4', 'LP4A', 'LP4B', 0.8108, 1.2162), 'O5': ('LPX5', 'LP5A', 'LP5B', 0.8889, 1.2222), 'O6': ('C6', 'LP6A', 'LP6B', 0.8108, 1.2162), 'O': ('C', 'LPY1', 'LPY2', 0.82322, 1.14332)},\n+ 'AMANNA': {'O1': ('C1', 'LP1A', 'LP1B', 0.8108, 1.2162), 'O3': ('C3', 'LP3A', 'LP3B', 0.8108, 1.2162), 'O4': ('C4', 'LP4A', 'LP4B', 0.8108, 1.2162), 'O5': ('LPX5', 'LP5A', 'LP5B', 0.8889, 1.2222), 'O6': ('C6', 'LP6A', 'LP6B', 0.8108, 1.2162), 'O': ('C', 'LPY1', 'LPY2', 0.82322, 1.14332)},\n+ 'BMANNA': {'O1': ('C1', 'LP1A', 'LP1B', 0.8108, 1.2162), 'O3': ('C3', 'LP3A', 'LP3B', 0.8108, 1.2162), 'O4': ('C4', 'LP4A', 'LP4B', 0.8108, 1.2162), 'O5': ('LPX5', 'LP5A', 'LP5B', 0.8889, 1.2222), 'O6': ('C6', 'LP6A', 'LP6B', 0.8108, 1.2162), 'O': ('C', 'LPY1', 'LPY2', 0.82322, 1.14332)},\n+ 'AXYL': {'O1': ('C1', 'LP1A', 'LP1B', 0.8108, 1.2162), 'O2': ('C2', 'LP2A', 'LP2B', 0.8108, 1.2162), 'O3': ('C3', 'LP3A', 'LP3B', 0.8108, 1.2162), 'O4': ('C4', 'LP4A', 'LP4B', 0.8108, 1.2162), 'O5': ('LPX5', 'LP5A', 'LP5B', 0.8889, 1.2222)},\n+ 'BXYL': {'O1': ('C1', 'LP1A', 'LP1B', 0.8108, 1.2162), 'O2': ('C2', 'LP2A', 'LP2B', 0.8108, 1.2162), 'O3': ('C3', 'LP3A', 'LP3B', 0.8108, 1.2162), 'O4': ('C4', 'LP4A', 'LP4B', 0.8108, 1.2162), 'O5': ('LPX5', 'LP5A', 'LP5B', 0.8889, 1.2222)},\n+ 'AFUC': {'O1': ('C1', 'LP1A', 'LP1B', 0.8108, 1.2162), 'O2': ('C2', 'LP2A', 'LP2B', 0.8108, 1.2162), 'O3': ('C3', 'LP3A', 'LP3B', 0.8108, 1.2162), 'O4': ('C4', 'LP4A', 'LP4B', 0.8108, 1.2162), 'O5': ('LPX5', 'LP5A', 'LP5B', 0.8889, 1.2222)},\n+ 'BFUC': {'O1': ('C1', 'LP1A', 'LP1B', 0.8108, 1.2162), 'O2': ('C2', 'LP2A', 'LP2B', 0.8108, 1.2162), 'O3': ('C3', 'LP3A', 'LP3B', 0.8108, 1.2162), 'O4': ('C4', 'LP4A', 'LP4B', 0.8108, 1.2162), 'O5': ('LPX5', 'LP5A', 'LP5B', 0.8889, 1.2222)},\n+ 'ARHM': {'O1': ('C1', 'LP1A', 'LP1B', 0.8108, 1.2162), 'O2': ('C2', 'LP2A', 'LP2B', 0.8108, 1.2162), 'O3': ('C3', 'LP3A', 'LP3B', 0.8108, 1.2162), 'O4': ('C4', 'LP4A', 'LP4B', 0.8108, 1.2162), 'O5': ('LPX5', 'LP5A', 'LP5B', 0.8889, 1.2222)},\n+ 'BRHM': {'O1': ('C1', 'LP1A', 'LP1B', 0.8108, 1.2162), 'O2': ('C2', 'LP2A', 'LP2B', 0.8108, 1.2162), 'O3': ('C3', 'LP3A', 'LP3B', 0.8108, 1.2162), 'O4': ('C4', 'LP4A', 'LP4B', 0.8108, 1.2162), 'O5': ('LPX5', 'LP5A', 'LP5B', 0.8889, 1.2222)},\n+ 'AQUI': {'O1': ('C1', 'LP1A', 'LP1B', 0.8108, 1.2162), 'O2': ('C2', 'LP2A', 'LP2B', 0.8108, 1.2162), 'O3': ('C3', 'LP3A', 'LP3B', 0.8108, 1.2162), 'O4': ('C4', 'LP4A', 'LP4B', 0.8108, 1.2162), 'O5': ('LPX5', 'LP5A', 'LP5B', 0.8889, 1.2222)},\n+ 'BQUI': {'O1': ('C1', 'LP1A', 'LP1B', 0.8108, 1.2162), 'O2': ('C2', 'LP2A', 'LP2B', 0.8108, 1.2162), 'O3': ('C3', 'LP3A', 'LP3B', 0.8108, 1.2162), 'O4': ('C4', 'LP4A', 'LP4B', 0.8108, 1.2162), 'O5': ('LPX5', 'LP5A', 'LP5B', 0.8889, 1.2222)},\n+ 'ARHMNA': {'O1': ('C1', 'LP1A', 'LP1B', 0.8108, 1.2162), 'O3': ('C3', 'LP3A', 'LP3B', 0.8108, 1.2162), 'O4': ('C4', 'LP4A', 'LP4B', 0.8108, 1.2162), 'O5': ('LPX5', 'LP5A', 'LP5B', 0.8889, 1.2222), 'O': ('C', 'LPY1', 'LPY2', 0.82322, 1.14332)},\n+ 'BRHMNA': {'O1': ('C1', 'LP1A', 'LP1B', 0.8108, 1.2162), 'O3': ('C3', 'LP3A', 'LP3B', 0.8108, 1.2162), 'O4': ('C4', 'LP4A', 'LP4B', 0.8108, 1.2162), 'O5': ('LPX5', 'LP5A', 'LP5B', 0.8889, 1.2222), 'O': ('C', 'LPY1', 'LPY2', 0.82322, 1.14332)},\n+ 'ANE5AC': {'O11': ('C1', 'LPT1', 'LPT2', 0.7229, 1.265), 'O12': ('C1', 'LPT3', 'LPT4', 0.7229, 1.265), 'O6': ('LPX6', 'LP6A', 'LP6B', 0.8889, 1.2222), 'O2': ('C2', 'LP2A', 'LP2B', 0.8108, 1.2162), 'O4': ('C4', 'LP4A', 'LP4B', 0.8108, 1.2162), 'O': ('C', 'LPY1', 'LPY2', 0.82322, 1.14332), 'O7': ('C7', 'LP7A', 'LP7B', 0.8108, 1.2162), 'O8': ('C8', 'LP8A', 'LP8B', 0.8108, 1.2162), 'O9': ('C9', 'LP9A', 'LP9B', 0.8108, 1.2162)},\n+ 'BNE5AC': {'O11': ('C1', 'LPT1', 'LPT2', 0.7229, 1.265), 'O12': ('C1', 'LPT3', 'LPT4', 0.7229, 1.265), 'O6': ('LPX6', 'LP6A', 'LP6B', 0.8889, 1.2222), 'O2': ('C2', 'LP2A', 'LP2B', 0.8108, 1.2162), 'O4': ('C4', 'LP4A', 'LP4B', 0.8108, 1.2162), 'O': ('C', 'LPY1', 'LPY2', 0.82322, 1.14332), 'O7': ('C7', 'LP7A', 'LP7B', 0.8108, 1.2162), 'O8': ('C8', 'LP8A', 'LP8B', 0.8108, 1.2162), 'O9': ('C9', 'LP9A', 'LP9B', 0.8108, 1.2162)},\n+ 'AALD': {'O': ('C', 'LPA', 'LPB', 0.85956, 1.13122)},\n+ 'PALD': {'O': ('C', 'LPA', 'LPB', 0.85956, 1.13122)},\n+ 'BALD': {'O': ('C', 'LPA', 'LPB', 0.85956, 1.13122)},\n+ 'IBLD': {'O': ('C', 'LPA', 'LPB', 0.85956, 1.13122)},\n+ 'ACO': {'O1': ('C1', 'LPA', 'LPB', 0.8665, 1.07246)},\n+ 'BTON': {'O1': ('C1', 'LPA', 'LPB', 0.8665, 1.07246)},\n+ 'FORM': {'O': ('C', 'LPA', 'LPB', 0.819, 1.183), 'N': ('C', 'HC', 'HT', 0.796, 1.109)},\n+ 'ACEM': {'O': ('C', 'LPA', 'LPB', 0.82322, 1.14332)},\n+ 'NMA': {'O': ('C', 'LPA', 'LPB', 0.82322, 1.14332)},\n+ 'NEA': {'O': ('C', 'LPA', 'LPB', 0.82322, 1.14332)},\n+ 'NPA': {'O': ('C', 'LPA', 'LPB', 0.82322, 1.14332)},\n+ 'DMA': {'O': ('C', 'LPA', 'LPB', 0.82322, 1.14332)},\n+ 'THF': {'O1': ('LPX', 'LP1A', 'LP1B', 0.8889, 1.2222)},\n+ 'TF2M': {'O1': ('LPX', 'LP1A', 'LP1B', 0.8889, 1.2222)},\n+ 'THP': {'O1': ('LPX', 'LP1A', 'LP1B', 0.8889, 1.2222)},\n+ 'DIOX': {'O1': ('LPX', 'LP1A', 'LP1B', 0.8889, 1.2222), 'O3': ('LPX2', 'LP2A', 'LP2B', 0.8889, 1.2222)},\n+ 'DMEE': {'O2': ('LPX', 'LP2A', 'LP2B', 0.8889, 1.2222)},\n+ 'MEET': {'O3': ('LPX', 'LP3A', 'LP3B', 0.8889, 1.2222)},\n+ 'DEET': {'O3': ('LPX', 'LP3A', 'LP3B', 0.8889, 1.2222)},\n+ 'DME': {'O2': ('LPX2', 'LP2A', 'LP2B', 0.8889, 1.2222), 'O5': ('LPX5', 'LP5A', 'LP5B', 0.8889, 1.2222)},\n+ 'MPET': {'O2': ('LPX', 'LP2A', 'LP2B', 0.8889, 1.2222)},\n+ 'MBET': {'O2': ('LPX', 'LP2A', 'LP2B', 0.8889, 1.2222)},\n+ 'EPET': {'O3': ('LPX', 'LP3A', 'LP3B', 0.8889, 1.2222)},\n+ 'MESH': {'S1': ('C1', 'LP1A', 'LP1B', 0.88, 1.32)},\n+ 'ETSH': {'S1': ('C1', 'LP1A', 'LP1B', 0.88, 1.32)},\n+ 'PRSH': {'S1': ('C1', 'LP1A', 'LP1B', 0.88, 1.32)},\n+ 'BUSH': {'S1': ('C1', 'LP1A', 'LP1B', 0.88, 1.32)},\n+ 'DMS': {'S1': ('C1', 'LP1A', 'LP1B', 0.7808, 1.3662)},\n+ 'EMS': {'S1': ('C1', 'LP1A', 'LP1B', 0.7808, 1.3662)},\n+ 'DMDS': {'S1': ('C1', 'LP1A', 'LP1B', 0.9208, 1.0102), 'S2': ('C2', 'LP2A', 'LP2B', 0.9208, 1.0102)},\n+ 'PHEN': {'OH': ('CZ', 'LP1A', 'LP1B', 0.8108, 1.2162)},\n+ 'CRES': {'OZ': ('CZ', 'LP1A', 'LP1B', 0.8108, 1.2162)},\n+ 'PYR': {'NZ': ('LP1', 'CE1', 'CE2', 1.1611, 0.6778)},\n+ 'PYRM': {'N1': ('LP1', 'C6', 'C2', 1.2376, 0.6648), 'N3': ('LP3', 'C4', 'C2', 1.2376, 0.6648)},\n+ 'IMID': {'NE2': ('LP1', 'CE1', 'CD2', 0.808, 1.384)},\n+ '4MIM': {'NE2': ('LP1', 'CE1', 'CD2', 0.808, 1.384)},\n+ '4MIE': {'ND1': ('LP1', 'CE1', 'CG', 0.808, 1.384)},\n+ 'PUR0': {'N1': ('LP1', 'C6', 'C2', 1.2376, 0.6648), 'N3': ('LP3', 'C4', 'C2', 1.2376, 0.6648), 'N7': ('LP7', 'C5', 'C8', 0.808, 1.384)},\n+ 'PUR1': {'N1': ('LP1', 'C6', 'C2', 1.2376, 0.6648), 'N3': ('LP3', 'C4', 'C2', 1.2376, 0.6648), 'N7': ('LP7', 'C4', 'C8', 0.808, 1.384)},\n+ 'MEOH': {'O1': ('C1', 'LP1A', 'LP1B', 0.8108, 1.2162)},\n+ 'ETOH': {'O1': ('C1', 'LP1A', 'LP1B', 0.8108, 1.2162)},\n+ 'PRO1': {'O1': ('C1', 'LP1A', 'LP1B', 0.8108, 1.2162)},\n+ 'BUO1': {'O1': ('C1', 'LP1A', 'LP1B', 0.8108, 1.2162)},\n+ 'PRO2': {'O2': ('C2', 'LP2A', 'LP2B', 0.8108, 1.2162)},\n+ 'BUO2': {'O2': ('C2', 'LP2A', 'LP2B', 0.8108, 1.2162)},\n+ 'PEO1': {'O1': ('C1', 'LP1A', 'LP1B', 0.8108, 1.2162)},\n+ 'HXO1': {'O1': ('C1', 'LP1A', 'LP1B', 0.8108, 1.2162)},\n+ 'PEO2': {'O2': ('C2', 'LP2A', 'LP2B', 0.8108, 1.2162)},\n+ 'B3MO1': {'O1': ('C1', 'LP1A', 'LP1B', 0.8108, 1.2162)},\n+ 'CPO1': {'O1': ('C1', 'LP1A', 'LP1B', 0.8108, 1.2162)},\n+ 'ACET': {'O1': ('C2', 'LP1A', 'LP1B', 0.7229, 1.265), 'O2': ('C2', 'LP2A', 'LP2B', 0.7229, 1.265)},\n+ 'DMP': {'O11': ('O13', 'O12', 'O14', 1.0, 0.6), 'O12': ('O14', 'O11', 'O13', 1.0, 0.6), 'O13': ('P', 'O11', 'O12', 0.6, 1.0), 'O14': ('P', 'O12', 'O11', 0.6, 1.0)},\n+ 'MP_0': {'O2': ('P1', 'LP2A', 'LP2B', 0.76473, 1.16239), 'O3': ('P1', 'LP3A', 'LP3B', 0.76473, 1.16239)},\n+ 'MP_1': {'O2': ('P1', 'LPA', 'LPB', 0.76473, 1.16239)},\n+ 'HP_1': {'O1': ('P1', 'LP1A', 'LP1B', 0.76473, 1.16239), 'O2': ('P1', 'LP2A', 'LP2B', 0.76473, 1.16239)},\n+ 'HP_2': {'O1': ('P1', 'LPA', 'LPB', 0.76473, 1.16239)},\n+ 'ETAM': {'OH1': ('C5', 'LP1A', 'LP1B', 0.8108, 1.2162)},\n+ 'CHOL': {'OH1': ('C5', 'LP1A', 'LP1B', 0.8108, 1.2162)},\n+ 'ACEH': {'O2': ('C2', 'LP2A', 'LP2B', 0.6968, 1.2194), 'O1': ('C2', 'LP1A', 'LP1B', 0.8108, 1.2162)},\n+ 'MAS': {'O': ('C', 'LP1A', 'LP1B', 0.6968, 1.2194), 'OM': ('C', 'LPMA', 'LPMB', 0.8108, 1.2162)},\n+ 'EAS': {'O': ('C', 'LP1A', 'LP1B', 0.6968, 1.2194), 'OM': ('C', 'LPMA', 'LPMB', 0.8108, 1.2162)},\n+ 'MPRO': {'O': ('C', 'LP1A', 'LP1B', 0.6968, 1.2194), 'OM': ('C', 'LPMA', 'LPMB', 0.8108, 1.2162)},\n+ 'MBU': {'O': ('C', 'LP1A', 'LP1B', 0.6968, 1.2194), 'OM': ('C', 'LPMA', 'LPMB', 0.8108, 1.2162)},\n+ 'FLUB': {'F6': ('C6', 'C1', 'C5', 0.75, 1.125)},\n+ 'MAM1': {'N1': ('C1', 'HN1', 'HN2', 0.85, 1.05)},\n+ 'EAM1': {'N1': ('C1', 'HN1', 'HN2', 0.85, 1.05)},\n+ 'PAM1': {'N1': ('C1', 'HN1', 'HN2', 0.85, 1.05)},\n+ 'PE': {'O1': ('O3', 'O2', 'O4', 1.0, 0.6), 'O2': ('O4', 'O1', 'O3', 1.0, 0.6), 'O3': ('P1', 'O1', 'O2', 0.6, 1.0), 'O4': ('P1', 'O2', 'O1', 0.6, 1.0)},\n+ 'PC': {'O1': ('O3', 'O2', 'O4', 1.0, 0.6), 'O2': ('O4', 'O1', 'O3', 1.0, 0.6), 'O3': ('P1', 'O1', 'O2', 0.6, 1.0), 'O4': ('P1', 'O2', 'O1', 0.6, 1.0)},\n+ 'GLYC': {'O4': ('C5', 'LP4A', 'LP4B', 0.8108, 1.2162), 'O6': ('C5', 'LP6A', 'LP6B', 0.6968, 1.2194), 'O8': ('C9', 'LP8A', 'LP8B', 0.8108, 1.2162), 'O10': ('C9', 'LP1A', 'LP1B', 0.6968, 1.2194)},\n+ 'GLYP': {'O4': ('C5', 'LP4A', 'LP4B', 0.8108, 1.2162), 'O6': ('C5', 'LP6A', 'LP6B', 0.6968, 1.2194), 'O8': ('C9', 'LP8A', 'LP8B', 0.8108, 1.2162), 'O10': ('C9', 'LP1A', 'LP1B', 0.6968, 1.2194), 'OP1': ('OP3', 'OP2', 'OP4', 1.0, 0.6), 'OP2': ('OP4', 'OP1', 'OP3', 1.0, 0.6), 'OP3': ('P1', 'OP1', 'OP2', 0.6, 1.0), 'OP4': ('P1', 'OP2', 'OP1', 0.6, 1.0)},\n+ 'PRPC': {'O22': ('C21', 'LP1A', 'LP1B', 0.6968, 1.2194), 'O32': ('C31', 'LP1C', 'LP1D', 0.6968, 1.2194), 'O21': ('C21', 'LPMA', 'LPMB', 0.8108, 1.2162), 'O31': ('C31', 'LPMC', 'LPMD', 0.8108, 1.2162), 'O12': ('O13', 'O11', 'O14', 1.0, 0.6), 'O11': ('O14', 'O12', 'O13', 1.0, 0.6), 'O13': ('P', 'O12', 'O11', 0.6, 1.0), 'O14': ('P', 'O11', 'O12', 0.6, 1.0)},\n+ 'DMPC': {'O22': ('C21', 'LP1A', 'LP1B', 0.6968, 1.2194), 'O32': ('C31', 'LP1C', 'LP1D', 0.6968, 1.2194), 'O21': ('C21', 'LPMA', 'LPMB', 0.8108, 1.2162), 'O31': ('C31', 'LPMC', 'LPMD', 0.8108, 1.2162), 'O12': ('O13', 'O11', 'O14', 1.0, 0.6), 'O11': ('O14', 'O12', 'O13', 1.0, 0.6), 'O13': ('P', 'O12', 'O11', 0.6, 1.0), 'O14': ('P', 'O11', 'O12', 0.6, 1.0)},\n+ 'DPPC': {'O22': ('C21', 'LP1A', 'LP1B', 0.6968, 1.2194), 'O32': ('C31', 'LP1C', 'LP1D', 0.6968, 1.2194), 'O21': ('C21', 'LPMA', 'LPMB', 0.8108, 1.2162), 'O31': ('C31', 'LPMC', 'LPMD', 0.8108, 1.2162), 'O12': ('O13', 'O11', 'O14', 1.0, 0.6), 'O11': ('O14', 'O12', 'O13', 1.0, 0.6), 'O13': ('P', 'O12', 'O11', 0.6, 1.0), 'O14': ('P', 'O11', 'O12', 0.6, 1.0)},\n+ 'DSPC': {'O22': ('C21', 'LP1A', 'LP1B', 0.6968, 1.2194), 'O32': ('C31', 'LP1C', 'LP1D', 0.6968, 1.2194), 'O21': ('C21', 'LPMA', 'LPMB', 0.8108, 1.2162), 'O31': ('C31', 'LPMC', 'LPMD', 0.8108, 1.2162), 'O12': ('O13', 'O11', 'O14', 1.0, 0.6), 'O11': ('O14', 'O12', 'O13', 1.0, 0.6), 'O13': ('P', 'O12', 'O11', 0.6, 1.0), 'O14': ('P', 'O11', 'O12', 0.6, 1.0)},\n+ 'DOPC': {'O22': ('C21', 'LP1A', 'LP1B', 0.6968, 1.2194), 'O32': ('C31', 'LP1A', 'LP1B', 0.6968, 1.2194), 'O21': ('C21', 'LPMA', 'LPMB', 0.8108, 1.2162), 'O31': ('C31', 'LPMC', 'LPMD', 0.8108, 1.2162), 'O12': ('O13', 'O11', 'O14', 1.0, 0.6), 'O11': ('O14', 'O12', 'O13', 1.0, 0.6), 'O13': ('P', 'O12', 'O11', 0.6, 1.0), 'O14': ('P', 'O11', 'O12', 0.6, 1.0)},\n+ 'DLPE': {'O22': ('C21', 'LP1A', 'LP1B', 0.6968, 1.2194), 'O32': ('C31', 'LP1C', 'LP1D', 0.6968, 1.2194), 'O21': ('C21', 'LPMA', 'LPMB', 0.8108, 1.2162), 'O31': ('C31', 'LPMC', 'LPMD', 0.8108, 1.2162), 'O12': ('O13', 'O11', 'O14', 1.0, 0.6), 'O11': ('O14', 'O12', 'O13', 1.0, 0.6), 'O13': ('P', 'O12', 'O11', 0.6, 1.0), 'O14': ('P', 'O11', 'O12', 0.6, 1.0)},\n+ 'DPPE': {'O22': ('C21', 'LP1A', 'LP1B', 0.6968, 1.2194), 'O32': ('C31', 'LP1A', 'LP1B', 0.6968, 1.2194), 'O21': ('C21', 'LPMA', 'LPMB', 0.8108, 1.2162), 'O31': ('C31', 'LPMC', 'LPMD', 0.8108, 1.2162), 'O12': ('O13', 'O11', 'O14', 1.0, 0.6), 'O11': ('O14', 'O12', 'O13', 1.0, 0.6), 'O13': ('P', 'O12', 'O11', 0.6, 1.0), 'O14': ('P', 'O11', 'O12', 0.6, 1.0)},\n+ 'POPC': {'O22': ('C21', 'LP1A', 'LP1B', 0.6968, 1.2194), 'O32': ('C31', 'LP1A', 'LP1B', 0.6968, 1.2194), 'O21': ('C21', 'LPMA', 'LPMB', 0.8108, 1.2162), 'O31': ('C31', 'LPMC', 'LPMD', 0.8108, 1.2162), 'O12': ('O13', 'O11', 'O14', 1.0, 0.6), 'O11': ('O14', 'O12', 'O13', 1.0, 0.6), 'O13': ('P', 'O12', 'O11', 0.6, 1.0), 'O14': ('P', 'O11', 'O12', 0.6, 1.0)},\n+ 'DOPE': {'O22': ('C21', 'LP1A', 'LP1B', 0.6968, 1.2194), 'O32': ('C31', 'LP1A', 'LP1B', 0.6968, 1.2194), 'O21': ('C21', 'LPMA', 'LPMB', 0.8108, 1.2162), 'O31': ('C31', 'LPMC', 'LPMD', 0.8108, 1.2162), 'O12': ('O13', 'O11', 'O14', 1.0, 0.6), 'O11': ('O14', 'O12', 'O13', 1.0, 0.6), 'O13': ('P', 'O12', 'O11', 0.6, 1.0), 'O14': ('P', 'O11', 'O12', 0.6, 1.0)},\n+ 'POPE': {'O22': ('C21', 'LP1A', 'LP1B', 0.6968, 1.2194), 'O32': ('C31', 'LP1A', 'LP1B', 0.6968, 1.2194), 'O21': ('C21', 'LPMA', 'LPMB', 0.8108, 1.2162), 'O31': ('C31', 'LPMC', 'LPMD', 0.8108, 1.2162), 'O12': ('O13', 'O11', 'O14', 1.0, 0.6), 'O11': ('O14', 'O12', 'O13', 1.0, 0.6), 'O13': ('P', 'O12', 'O11', 0.6, 1.0), 'O14': ('P', 'O11', 'O12', 0.6, 1.0)},\n+ 'DLPC': {'O22': ('C21', 'LP1A', 'LP1B', 0.6968, 1.2194), 'O32': ('C31', 'LP1C', 'LP1D', 0.6968, 1.2194), 'O21': ('C21', 'LPMA', 'LPMB', 0.8108, 1.2162), 'O31': ('C31', 'LPMC', 'LPMD', 0.8108, 1.2162), 'O12': ('O13', 'O11', 'O14', 1.0, 0.6), 'O11': ('O14', 'O12', 'O13', 1.0, 0.6), 'O13': ('P', 'O12', 'O11', 0.6, 1.0), 'O14': ('P', 'O11', 'O12', 0.6, 1.0)},\n+}\n+patch_anisotropies = {\n+ 'ACE': {'OY': ('CY', 'LPY1', 'LPY2', 0.82322, 1.14332)},\n+ 'ACP': {'OY': ('CY', 'LPY1', 'LPY2', 0.82322, 1.14332)},\n+ 'NNEU': {'N': ('CA', 'HT1', 'HT2', 0.85, 1.05)},\n+ 'GNNU': {'N': ('CA', 'HT1', 'HT2', 0.85, 1.05)},\n+ 'CTER': {'OT1': ('C', 'LPT1', 'LPT2', 0.7229, 1.265), 'OT2': ('C', 'LPT3', 'LPT4', 0.7229, 1.265)},\n+ 'CTEG': {'OT1': ('C', 'LPT1', 'LPT2', 0.7229, 1.265), 'OT2': ('C', 'LPT3', 'LPT4', 0.7229, 1.265)},\n+ 'CTEP': {'OT1': ('C', 'LPT1', 'LPT2', 0.7229, 1.265), 'OT2': ('C', 'LPT3', 'LPT4', 0.7229, 1.265)},\n+ 'CNEU': {'OT1': ('C', 'LPT1', 'LPT2', 0.6968, 1.2194), 'OT2': ('C', 'LPT3', 'LPT4', 0.8108, 1.2162)},\n+ 'CNEG': {'OT1': ('C', 'LPT1', 'LPT2', 0.6968, 1.2194), 'OT2': ('C', 'LPT3', 'LPT4', 0.8108, 1.2162)},\n+ 'CT1': {'OT1': ('C', 'LPT1', 'LPT2', 0.6968, 1.2194), 'OT2': ('C', 'LPT3', 'LPT4', 0.8108, 1.2162)},\n+ 'CT1G': {'OT1': ('C', 'LPT1', 'LPT2', 0.6968, 1.2194), 'OT2': ('C', 'LPT3', 'LPT4', 0.8108, 1.2162)},\n+ 'ASPP': {'OD1': ('CG', 'LPP1', 'LPP2', 0.6968, 1.2194), 'OD2': ('CG', 'LPP3', 'LPP4', 0.8108, 1.2162)},\n+ 'GLUP': {'OE1': ('CD', 'LPP1', 'LPP2', 0.6968, 1.2194), 'OE2': ('CD', 'LPP3', 'LPP4', 0.8108, 1.2162)},\n+ 'LSN': {'NZ': ('CE', 'HZ1', 'HZ2', 0.85, 1.05)},\n+ 'HS2': {'ND1': ('LPD1', 'CE1', 'CG', 0.808, 1.384)},\n+ 'KAC': {'OH': ('CH', 'LPA', 'LPB', 0.82322, 1.14332)},\n+ 'DACE': {'OY': ('CY', 'LPY1', 'LPY2', 0.82322, 1.14332)},\n+ 'DACP': {'OY': ('CY', 'LPY1', 'LPY2', 0.82322, 1.14332)},\n+ 'DNNEU': {'N': ('CA', 'HT1', 'HT2', 0.85, 1.05)},\n+ 'DGNNU': {'N': ('CA', 'HT1', 'HT2', 0.85, 1.05)},\n+ 'DCTER': {'OT1': ('C', 'LPT1', 'LPT2', 0.7229, 1.265), 'OT2': ('C', 'LPT3', 'LPT4', 0.7229, 1.265)},\n+ 'DCTEG': {'OT1': ('C', 'LPT1', 'LPT2', 0.7229, 1.265), 'OT2': ('C', 'LPT3', 'LPT4', 0.7229, 1.265)},\n+ 'DCTEP': {'OT1': ('C', 'LPT1', 'LPT2', 0.7229, 1.265), 'OT2': ('C', 'LPT3', 'LPT4', 0.7229, 1.265)},\n+ 'DCTES': {'OT1': ('C', 'LPT1', 'LPT2', 0.7229, 1.265), 'OT2': ('C', 'LPT3', 'LPT4', 0.7229, 1.265)},\n+ 'DCNEU': {'OT1': ('C', 'LPT1', 'LPT2', 0.6968, 1.2194), 'OT2': ('C', 'LPT3', 'LPT4', 0.8108, 1.2162)},\n+ 'DCNEG': {'OT1': ('C', 'LPT1', 'LPT2', 0.6968, 1.2194), 'OT2': ('C', 'LPT3', 'LPT4', 0.8108, 1.2162)},\n+ 'DCNES': {'OT1': ('C', 'LPT1', 'LPT2', 0.6968, 1.2194), 'OT2': ('C', 'LPT3', 'LPT4', 0.8108, 1.2162)},\n+ 'DCT1': {'OT1': ('C', 'LPT1', 'LPT2', 0.6968, 1.2194), 'OT2': ('C', 'LPT3', 'LPT4', 0.8108, 1.2162)},\n+ 'DCT1G': {'OT1': ('C', 'LPT1', 'LPT2', 0.6968, 1.2194), 'OT2': ('C', 'LPT3', 'LPT4', 0.8108, 1.2162)},\n+ 'OMEA': {'O1': ('LPX1', 'LPMA', 'LPMB', 0.8889, 1.2222), 'O5': ('LPX5', 'LP5A', 'LP5B', 0.8889, 1.2222)},\n+ 'OMEB': {'O1': ('LPX1', 'LPMA', 'LPMB', 0.8889, 1.2222), 'O5': ('LPX5', 'LP5A', 'LP5B', 0.8889, 1.2222)},\n+ '1AOME': {'O1': ('LPX1', 'LPMA', 'LPMB', 0.8889, 1.2222), 'O5': ('LPX5', 'LP5A', 'LP5B', 0.8889, 1.2222)},\n+ '1BOME': {'O1': ('LPX1', 'LPMA', 'LPMB', 0.8889, 1.2222), 'O5': ('LPX5', 'LP5A', 'LP5B', 0.8889, 1.2222)},\n+ 'FOMEA': {'O1': ('LPX1', 'LPMA', 'LPMB', 0.8889, 1.2222), 'O4': ('LPX4', 'LP4A', 'LP4B', 0.8889, 1.2222)},\n+ 'FOMEB': {'O1': ('LPX1', 'LPMA', 'LPMB', 0.8889, 1.2222), 'O4': ('LPX4', 'LP4A', 'LP4B', 0.8889, 1.2222)},\n+}\n+delete_anisotropies = {\n+ 'OMEA': ['O5'],\n+ 'OMEB': ['O5'],\n+ '1AOME': ['O5'],\n+ '1BOME': ['O5'],\n+ 'FOMEA': ['O4'],\n+ 'FOMEB': ['O4'],\n+}\n+\n+residue_order = {\n+ 'ALAD': 0,\n+ 'ALA': 1,\n+ 'ARG': 2,\n+ 'ASN': 3,\n+ 'ASP': 4,\n+ 'CYS': 5,\n+ 'GLN': 6,\n+ 'GLU': 7,\n+ 'GLY': 8,\n+ 'HSD': 9,\n+ 'HSE': 10,\n+ 'HSP': 11,\n+ 'ILE': 12,\n+ 'LEU': 13,\n+ 'LYS': 14,\n+ 'MET': 15,\n+ 'PHE': 16,\n+ 'PRO': 17,\n+ 'SER': 18,\n+ 'THR': 19,\n+ 'TRP': 20,\n+ 'TYR': 21,\n+ 'VAL': 22,\n+ 'ALDD': 23,\n+ 'DALA': 24,\n+ 'DARG': 25,\n+ 'DASN': 26,\n+ 'DASP': 27,\n+ 'DCYS': 28,\n+ 'DGLN': 29,\n+ 'DGLU': 30,\n+ 'DGLY': 31,\n+ 'DHSD': 32,\n+ 'DHSE': 33,\n+ 'DHSP': 34,\n+ 'DILE': 35,\n+ 'DLEU': 36,\n+ 'DLYS': 37,\n+ 'DMET': 38,\n+ 'DPHE': 39,\n+ 'DPRO': 40,\n+ 'DSER': 41,\n+ 'DTHR': 42,\n+ 'DTRP': 43,\n+ 'DTYR': 44,\n+ 'DVAL': 45,\n+ 'ALLO': 46,\n+ 'PSIC': 47,\n+ 'EGLY': 48,\n+ 'MGLYOL': 49,\n+ 'MERYOL': 50,\n+ 'DTHROL': 51,\n+ 'LTHROL': 52,\n+ 'MRIBOL': 53,\n+ 'DARAOL': 54,\n+ 'LARAOL': 55,\n+ 'MXYLOL': 56,\n+ 'MALLOL': 57,\n+ 'DALTOL': 58,\n+ 'LALTOL': 59,\n+ 'DGLUOL': 60,\n+ 'LGLUOL': 61,\n+ 'DMANOL': 62,\n+ 'LMANOL': 63,\n+ 'DGULOL': 64,\n+ 'LGULOL': 65,\n+ 'DIDIOL': 66,\n+ 'LIDIOL': 67,\n+ 'MGALOL': 68,\n+ 'AGLC': 69,\n+ 'BGLC': 70,\n+ 'AALT': 71,\n+ 'BALT': 72,\n+ 'AALL': 73,\n+ 'BALL': 74,\n+ 'AGAL': 75,\n+ 'BGAL': 76,\n+ 'AGUL': 77,\n+ 'BGUL': 78,\n+ 'AIDO': 79,\n+ 'BIDO': 80,\n+ 'AMAN': 81,\n+ 'BMAN': 82,\n+ 'ATAL': 83,\n+ 'BTAL': 84,\n+ 'ARIB': 85,\n+ 'BRIB': 86,\n+ 'AARB': 87,\n+ 'BARB': 88,\n+ 'AXYF': 89,\n+ 'BXYF': 90,\n+ 'ALYF': 91,\n+ 'BLYF': 92,\n+ 'ADEO': 93,\n+ 'BDEO': 94,\n+ 'AFRU': 95,\n+ 'BFRU': 96,\n+ 'AGALA': 97,\n+ 'BGALA': 98,\n+ 'AGLCA': 99,\n+ 'BGLCA': 100,\n+ 'AIDOA': 101,\n+ 'BIDOA': 102,\n+ 'AGLCNA': 103,\n+ 'BGLCNA': 104,\n+ 'AGALNA': 105,\n+ 'BGALNA': 106,\n+ 'AMANNA': 107,\n+ 'BMANNA': 108,\n+ 'AXYL': 109,\n+ 'BXYL': 110,\n+ 'AFUC': 111,\n+ 'BFUC': 112,\n+ 'ARHM': 113,\n+ 'BRHM': 114,\n+ 'AQUI': 115,\n+ 'BQUI': 116,\n+ 'ARHMNA': 117,\n+ 'BRHMNA': 118,\n+ 'ANE5AC': 119,\n+ 'BNE5AC': 120,\n+ 'AALD': 121,\n+ 'PALD': 122,\n+ 'BALD': 123,\n+ 'IBLD': 124,\n+ 'ACO': 125,\n+ 'BTON': 126,\n+ 'FORM': 127,\n+ 'ACEM': 128,\n+ 'NMA': 129,\n+ 'NEA': 130,\n+ 'NPA': 131,\n+ 'DMA': 132,\n+ 'THF': 133,\n+ 'TF2M': 134,\n+ 'THP': 135,\n+ 'DIOX': 136,\n+ 'DMEE': 137,\n+ 'MEET': 138,\n+ 'DEET': 139,\n+ 'DME': 140,\n+ 'MPET': 141,\n+ 'MBET': 142,\n+ 'EPET': 143,\n+ 'MESH': 144,\n+ 'ETSH': 145,\n+ 'PRSH': 146,\n+ 'BUSH': 147,\n+ 'DMS': 148,\n+ 'EMS': 149,\n+ 'DMDS': 150,\n+ 'PHEN': 151,\n+ 'CRES': 152,\n+ 'PYR': 153,\n+ 'PYRM': 154,\n+ 'IMID': 155,\n+ '4MIM': 156,\n+ '4MIE': 157,\n+ 'PUR0': 158,\n+ 'PUR1': 159,\n+ 'MEOH': 160,\n+ 'ETOH': 161,\n+ 'PRO1': 162,\n+ 'BUO1': 163,\n+ 'PRO2': 164,\n+ 'BUO2': 165,\n+ 'PEO1': 166,\n+ 'HXO1': 167,\n+ 'PEO2': 168,\n+ 'B3MO1': 169,\n+ 'CPO1': 170,\n+ 'ACET': 171,\n+ 'DMP': 172,\n+ 'MP_0': 173,\n+ 'MP_1': 174,\n+ 'HP_1': 175,\n+ 'HP_2': 176,\n+ 'ETAM': 177,\n+ 'CHOL': 178,\n+ 'ACEH': 179,\n+ 'MAS': 180,\n+ 'EAS': 181,\n+ 'MPRO': 182,\n+ 'MBU': 183,\n+ 'FLUB': 184,\n+ 'MAM1': 185,\n+ 'EAM1': 186,\n+ 'PAM1': 187,\n+ 'PE': 188,\n+ 'PC': 189,\n+ 'GLYC': 190,\n+ 'GLYP': 191,\n+ 'PRPC': 192,\n+ 'DMPC': 193,\n+ 'DPPC': 194,\n+ 'DSPC': 195,\n+ 'DOPC': 196,\n+ 'DLPE': 197,\n+ 'DPPE': 198,\n+ 'POPC': 199,\n+ 'DOPE': 200,\n+ 'POPE': 201,\n+ 'DLPC': 202,\n+}\n+patch_order = {\n+ 'ACE': 0,\n+ 'ACP': 1,\n+ 'NNEU': 2,\n+ 'GNNU': 3,\n+ 'CTER': 4,\n+ 'CTEG': 5,\n+ 'CTEP': 6,\n+ 'CNEU': 7,\n+ 'CNEG': 8,\n+ 'CT1': 9,\n+ 'CT1G': 10,\n+ 'ASPP': 11,\n+ 'GLUP': 12,\n+ 'LSN': 13,\n+ 'HS2': 14,\n+ 'KAC': 15,\n+ 'DACE': 16,\n+ 'DACP': 17,\n+ 'DNNEU': 18,\n+ 'DGNNU': 19,\n+ 'DCTER': 20,\n+ 'DCTEG': 21,\n+ 'DCTEP': 22,\n+ 'DCTES': 23,\n+ 'DCNEU': 24,\n+ 'DCNEG': 25,\n+ 'DCNES': 26,\n+ 'DCT1': 27,\n+ 'DCT1G': 28,\n+ 'OMEA': 29,\n+ 'OMEB': 30,\n+ '1AOME': 31,\n+ '1BOME': 32,\n+ 'FOMEA': 33,\n+ 'FOMEB': 34,\n+}\n+\n+def extract_atom_name(raw_atom_name, templates):\n+ # Process Drude particles.\n+ atom_name_prefix = \"\"\n+ if raw_atom_name.startswith(\"Drude-\"):\n+ raw_atom_name = raw_atom_name[len(\"Drude-\"):]\n+ atom_name_prefix = \"D\"\n \n-residue_order = {'ALAD': 0, 'ALA': 1, 'ARG': 2, 'ASN': 3, 'ASP': 4, 'CYS': 5, 'GLN': 6, 'GLU': 7, 'GLY': 8, 'HSD': 9, 'HSE': 10, 'HSP': 11, 'ILE': 12, 'LEU': 13, 'LYS': 14, 'MET': 15, 'PHE': 16, 'PRO': 17, 'SER': 18, 'THR': 19, 'TRP': 20, 'TYR': 21, 'VAL': 22, 'ALDD': 23, 'DALA': 24, 'DARG': 25, 'DASN': 26, 'DASP': 27, 'DCYS': 28, 'DGLN': 29, 'DGLU': 30, 'DGLY': 31, 'DHSD': 32, 'DHSE': 33, 'DHSP': 34, 'DILE': 35, 'DLEU': 36, 'DLYS': 37, 'DMET': 38, 'DPHE': 39, 'DPRO': 40, 'DSER': 41, 'DTHR': 42, 'DTRP': 43, 'DTYR': 44, 'DVAL': 45, 'ALLO': 46, 'PSIC': 47, 'EGLY': 48, 'MGLYOL': 49, 'MERYOL': 50, 'DTHROL': 51, 'LTHROL': 52, 'MRIBOL': 53, 'DARAOL': 54, 'LARAOL': 55, 'MXYLOL': 56, 'MALLOL': 57, 'DALTOL': 58, 'LALTOL': 59, 'DGLUOL': 60, 'LGLUOL': 61, 'DMANOL': 62, 'LMANOL': 63, 'DGULOL': 64, 'LGULOL': 65, 'DIDIOL': 66, 'LIDIOL': 67, 'MGALOL': 68, 'AGLC': 69, 'BGLC': 70, 'AALT': 71, 'BALT': 72, 'AALL': 73, 'BALL': 74, 'AGAL': 75, 'BGAL': 76, 'AGUL': 77, 'BGUL': 78, 'AIDO': 79, 'BIDO': 80, 'AMAN': 81, 'BMAN': 82, 'ATAL': 83, 'BTAL': 84, 'ARIB': 85, 'BRIB': 86, 'AARB': 87, 'BARB': 88, 'AXYF': 89, 'BXYF': 90, 'ALYF': 91, 'BLYF': 92, 'ADEO': 93, 'BDEO': 94, 'AFRU': 95, 'BFRU': 96, 'AGALA': 97, 'BGALA': 98, 'AGLCA': 99, 'BGLCA': 100, 'AIDOA': 101, 'BIDOA': 102, 'AGLCNA': 103, 'BGLCNA': 104, 'AGALNA': 105, 'BGALNA': 106, 'AMANNA': 107, 'BMANNA': 108, 'AXYL': 109, 'BXYL': 110, 'AFUC': 111, 'BFUC': 112, 'ARHM': 113, 'BRHM': 114, 'AQUI': 115, 'BQUI': 116, 'ARHMNA': 117, 'BRHMNA': 118, 'ANE5AC': 119, 'BNE5AC': 120, 'AALD': 121, 'PALD': 122, 'BALD': 123, 'IBLD': 124, 'ACO': 125, 'BTON': 126, 'FORM': 127, 'ACEM': 128, 'NMA': 129, 'NEA': 130, 'NPA': 131, 'DMA': 132, 'THF': 133, 'TF2M': 134, 'THP': 135, 'DIOX': 136, 'DMEE': 137, 'MEET': 138, 'DEET': 139, 'DME': 140, 'MPET': 141, 'MBET': 142, 'EPET': 143, 'MESH': 144, 'ETSH': 145, 'PRSH': 146, 'BUSH': 147, 'DMS': 148, 'EMS': 149, 'DMDS': 150, 'PHEN': 151, 'CRES': 152, 'PYR': 153, 'PYRM': 154, 'IMID': 155, '4MIM': 156, '4MIE': 157, 'PUR0': 158, 'PUR1': 159, 'MEOH': 160, 'ETOH': 161, 'PRO1': 162, 'BUO1': 163, 'PRO2': 164, 'BUO2': 165, 'PEO1': 166, 'HXO1': 167, 'PEO2': 168, 'B3MO1': 169, 'CPO1': 170, 'ACET': 171, 'DMP': 172, 'MP_0': 173, 'MP_1': 174, 'HP_1': 175, 'HP_2': 176, 'ETAM': 177, 'CHOL': 178, 'ACEH': 179, 'MAS': 180, 'EAS': 181, 'MPRO': 182, 'MBU': 183, 'FLUB': 184, 'MAM1': 185, 'EAM1': 186, 'PAM1': 187, 'PE': 188, 'PC': 189, 'GLYC': 190, 'GLYP': 191, 'PRPC': 192, 'DMPC': 193, 'DPPC': 194, 'DSPC': 195, 'DOPC': 196, 'DLPE': 197, 'DPPE': 198, 'POPC': 199, 'DOPE': 200, 'POPE': 201, 'DLPC': 202}\n-patch_order = {'ACE': 0, 'ACP': 1, 'NNEU': 2, 'GNNU': 3, 'CTER': 4, 'CTEG': 5, 'CTEP': 6, 'CNEU': 7, 'CNEG': 8, 'CNES': 9, 'CT1': 10, 'CT1G': 11, 'ASPP': 12, 'GLUP': 13, 'LSN': 14, 'HS2': 15, 'KAC': 16, 'DACE': 17, 'DACP': 18, 'DNNEU': 19, 'DGNNU': 20, 'DCTER': 21, 'DCTEG': 22, 'DCTEP': 23, 'DCTES': 24, 'DCNEU': 25, 'DCNEG': 26, 'DCNES': 27, 'DCT1': 28, 'DCT1G': 29, 'OMEA': 30, 'OMEB': 31, '1AOME': 32, '1BOME': 33, 'FOMEA': 34, 'FOMEB': 35}\n+ # Return None to indicate an atom without template name information.\n+ atom_name_parts = raw_atom_name.rsplit(\"-\", maxsplit=1)\n+ if len(atom_name_parts) < 2:\n+ return None\n+ templates.add(atom_name_parts[0])\n+ return f\"{atom_name_prefix}{atom_name_parts[1]}\"\n \n residue_data = []\n \n-for residue in topology.residues():\n- # Extract the residue or patch names and atom names from the atom type names.\n- templates = []\n- atom_names = []\n- for atom in residue.atoms():\n- raw_atom_name = data.atomType[atom]\n- atom_is_drude = raw_atom_name.startswith(\"Drude-\")\n- if atom_is_drude:\n- atom_name_parts = raw_atom_name[len(\"Drude-\"):].rsplit(\"-\", maxsplit=1)\n- atom_names.append(f\"D{atom_name_parts[1]}\")\n- else:\n- atom_name_parts = raw_atom_name.rsplit(\"-\", maxsplit=1)\n- atom_names.append(atom_name_parts[1])\n- templates.append(atom_name_parts[0])\n+for residue_index, residue in enumerate(topology.residues()):\n+ # Extract the residue or patch names and atom names.\n+ template_data = templateForResidue[residue_index]\n+ templates = set()\n+ if template_data is None:\n+ # Multi-residue patch; fall back to parsing atom names because OpenMM\n+ # leaves None in templateForResidue in this case.\n+ atom_names = []\n+ skip_residue = False\n+ for atom in residue.atoms():\n+ atom_name = extract_atom_name(data.atomType[atom], templates)\n+ if atom_name is None:\n+ # Skip residues containing atoms without template name data\n+ # (they might be from, e.g., another solvent force field file).\n+ skip_residue = True\n+ break\n+ atom_names.append(atom_name)\n+ if skip_residue:\n+ residue_data.append(([], [], []))\n+ continue\n+ else:\n+ # Extract names from template name.\n+ for template_index, template_name in enumerate(template_data.name.split(\"-\")):\n+ if template_index:\n+ # Patch name.\n+ templates.add(template_name.rsplit(\"_\", maxsplit=1)[0])\n+ else:\n+ # Residue name.\n+ templates.add(template_name)\n+ atom_names = [template_data.atoms[data.atomTemplateIndexes[atom]].name for atom in residue.atoms()]\n \n # Get all unique residue or patch names that have anisotropies.\n- templates = set(templates)\n residue_templates = sorted(\n (template for template in templates if template in residue_anisotropies), key=residue_order.get\n )\ndiff --git a/wrappers/python/setup.py b/wrappers/python/setup.py\nindex 1dc49672c0..ca26e66a54 100644\n--- a/wrappers/python/setup.py\n+++ b/wrappers/python/setup.py\n@@ -153,7 +153,7 @@ def buildKeywordDictionary(major_version_num=MAJOR_VERSION_NUM,\n \"openmm.app.internal.pdbx.writer\"]\n setupKeywords[\"data_files\"] = []\n setupKeywords[\"package_data\"] = {\"openmm\" : [],\n- \"openmm.app\" : ['data/*.xml', 'data/*.pdb', 'data/amber14/*.xml', 'data/amber19/*.xml', 'data/charmm36/*.xml', 'data/implicit/*.xml'],\n+ \"openmm.app\" : ['data/*.xml', 'data/*.pdb', 'data/amber14/*.xml', 'data/amber19/*.xml', 'data/charmm36/*.xml', 'data/charmm36_2024/*.xml', 'data/implicit/*.xml'],\n \"openmm.app.internal\" : []}\n setupKeywords[\"install_requires\"] = [\"numpy\"]\n setupKeywords[\"platforms\"] = [\"Linux\", \"Mac OS X\", \"Windows\"]\n"}, "test": {"test_patch": "diff --git a/wrappers/python/tests/TestForceField.py b/wrappers/python/tests/TestForceField.py\nindex fe32e92def..2a758df4aa 100644\n--- a/wrappers/python/tests/TestForceField.py\n+++ b/wrappers/python/tests/TestForceField.py\n@@ -1386,6 +1386,66 @@ def test_IdenticalTemplates(self):\n END\"\"\"))\n # If the check is not done correctly, this will throw an exception.\n ff.createSystem(pdb.topology)\n+ \n+ def test_CharmmLoad(self):\n+ \"\"\"Tests that the CHARMM force fields are capable of parameterizing systems.\"\"\"\n+\n+ charmm_models = (\"charmm36\", \"charmm36_2024\")\n+ water_models_3 = (\"water\", \"spce\", \"tip3p-pme-b\", \"tip3p-pme-f\")\n+ water_models_4 = (\"tip4p2005\", \"tip4pew\")\n+ water_models_5 = (\"tip5p\", \"tip5pew\")\n+\n+ # Checks that the numbers of various types of terms in a system matches expected counts.\n+ def check_system(system, particle_count, site_count, constraint_count, bond_count, angle_count, cmap_count, exception_count, override_count, drude_count, screen_count):\n+ self.assertEqual(particle_count, system.getNumParticles())\n+ self.assertEqual(site_count, sum([1 for index in range(system.getNumParticles()) if system.isVirtualSite(index)]))\n+ self.assertEqual(constraint_count, system.getNumConstraints())\n+ self.assertEqual(bond_count, sum([force.getNumBonds() for force in system.getForces() if isinstance(force, HarmonicBondForce)]))\n+ self.assertEqual(angle_count, sum([force.getNumAngles() for force in system.getForces() if isinstance(force, HarmonicAngleForce)]))\n+ self.assertEqual(cmap_count, sum([force.getNumTorsions() for force in system.getForces() if isinstance(force, CMAPTorsionForce)]))\n+ self.assertEqual(exception_count, sum([force.getNumExceptions() for force in system.getForces() if isinstance(force, NonbondedForce)]))\n+ self.assertEqual(override_count, sum([force.getNumBonds() for force in system.getForces() if isinstance(force, CustomBondForce)]))\n+ self.assertEqual(drude_count, sum([force.getNumParticles() for force in system.getForces() if isinstance(force, DrudeForce)]))\n+ self.assertEqual(screen_count, sum([force.getNumScreenedPairs() for force in system.getForces() if isinstance(force, DrudeForce)]))\n+\n+ # Standard 20 amino acids including N- and C-terminal variants.\n+ pdb_20aa = PDBFile(\"systems/test_charmm_20aa.pdb\")\n+ for charmm_model in charmm_models:\n+ check_system(ForceField(f\"{charmm_model}.xml\").createSystem(pdb_20aa.topology), 1032, 0, 0, 1937, 1833, 20, 5390, 2527, 0, 0)\n+\n+ # Standard 20 amino acids including N- and C-terminal variants (Drude).\n+ pdb_20aa_drude = PDBFile(\"systems/test_charmm_20aa_drude.pdb\")\n+ for drude_model in (\"charmm_polar_2019\", \"charmm_polar_2023\"):\n+ check_system(ForceField(f\"{drude_model}.xml\").createSystem(pdb_20aa_drude.topology), 1794, 241, 0, 2106, 1833, 20, 18162, 7434, 521, 1203)\n+\n+ # Peptide in water with ions.\n+ pdb_peptide_3 = PDBFile(\"systems/test_charmm_peptide_3.pdb\")\n+ pdb_peptide_4 = PDBFile(\"systems/test_charmm_peptide_4.pdb\")\n+ pdb_peptide_5 = PDBFile(\"systems/test_charmm_peptide_5.pdb\")\n+ for charmm_model in charmm_models:\n+ for water_model in water_models_3:\n+ check_system(ForceField(f\"{charmm_model}.xml\", f\"{charmm_model}/{water_model}.xml\").createSystem(pdb_peptide_3.topology), 1136, 0, 984, 234, 249, 8, 1727, 353, 0, 0)\n+ for water_model in water_models_4:\n+ check_system(ForceField(f\"{charmm_model}.xml\", f\"{charmm_model}/{water_model}.xml\").createSystem(pdb_peptide_4.topology), 1464, 328, 984, 234, 249, 8, 2711, 353, 0, 0)\n+ for water_model in water_models_5:\n+ check_system(ForceField(f\"{charmm_model}.xml\", f\"{charmm_model}/{water_model}.xml\").createSystem(pdb_peptide_5.topology), 1792, 656, 984, 234, 249, 8, 4023, 353, 0, 0)\n+\n+ def test_CharmmVersionMismatchCheck(self):\n+ \"\"\"\n+ Tests that CHARMM force fields cannot be loaded with the wrong water model versions.\n+ \"\"\"\n+\n+ charmm_models = (\"charmm36\", \"charmm36_2024\")\n+ water_models = (\"water\", \"spce\", \"tip3p-pme-b\", \"tip3p-pme-f\", \"tip4p2005\", \"tip4pew\", \"tip5p\", \"tip5pew\")\n+\n+ for base_charmm_model in charmm_models:\n+ for water_charmm_model in charmm_models:\n+ if base_charmm_model != water_charmm_model:\n+ for water_model in water_models:\n+ with self.assertRaises(Exception):\n+ ForceField(f\"{base_charmm_model}.xml\", f\"{water_charmm_model}/{water_model}.xml\")\n+ with self.assertRaises(Exception):\n+ ForceField(f\"{water_charmm_model}/{water_model}.xml\", f\"{base_charmm_model}.xml\")\n \n def test_CharmmPolar(self):\n \"\"\"Test the CHARMM polarizable force field.\"\"\"\ndiff --git a/wrappers/python/tests/systems/test_charmm_20aa.pdb b/wrappers/python/tests/systems/test_charmm_20aa.pdb\nnew file mode 100644\nindex 0000000000..757d2deb8c\n--- /dev/null\n+++ b/wrappers/python/tests/systems/test_charmm_20aa.pdb\n@@ -0,0 +1,1054 @@\n+REMARK 1 CREATED WITH OPENMM 8.3, 2025-06-23\n+ATOM 1 N ALA A 1 -1.242 -1.427 0.393 1.00 0.00 N \n+ATOM 2 H ALA A 1 -2.205 -1.477 0.753 1.00 0.00 H \n+ATOM 3 H2 ALA A 1 -0.581 -0.977 1.088 1.00 0.00 H \n+ATOM 4 H3 ALA A 1 -0.794 -2.376 0.341 1.00 0.00 H \n+ATOM 5 CA ALA A 1 -1.092 -0.807 -0.948 1.00 0.00 C \n+ATOM 6 HA ALA A 1 -0.055 -0.877 -1.215 1.00 0.00 H \n+ATOM 7 CB ALA A 1 -1.858 -1.702 -1.952 1.00 0.00 C \n+ATOM 8 HB1 ALA A 1 -2.948 -1.722 -1.737 1.00 0.00 H \n+ATOM 9 HB2 ALA A 1 -1.469 -2.743 -1.929 1.00 0.00 H \n+ATOM 10 HB3 ALA A 1 -1.721 -1.320 -2.988 1.00 0.00 H \n+ATOM 11 C ALA A 1 -1.563 0.649 -1.072 1.00 0.00 C \n+ATOM 12 O ALA A 1 -2.721 0.878 -1.399 1.00 0.00 O \n+ATOM 13 N ALA A 2 -0.771 1.724 -0.826 1.00 0.00 N \n+ATOM 14 H ALA A 2 -1.205 2.590 -1.056 1.00 0.00 H \n+ATOM 15 CA ALA A 2 0.544 1.868 -0.213 1.00 0.00 C \n+ATOM 16 HA ALA A 2 0.400 1.678 0.843 1.00 0.00 H \n+ATOM 17 CB ALA A 2 1.026 3.325 -0.366 1.00 0.00 C \n+ATOM 18 HB1 ALA A 2 0.266 4.026 0.040 1.00 0.00 H \n+ATOM 19 HB2 ALA A 2 1.188 3.569 -1.439 1.00 0.00 H \n+ATOM 20 HB3 ALA A 2 1.978 3.495 0.181 1.00 0.00 H \n+ATOM 21 C ALA A 2 1.639 0.911 -0.661 1.00 0.00 C \n+ATOM 22 O ALA A 2 1.696 0.477 -1.808 1.00 0.00 O \n+ATOM 23 N ALA A 3 2.472 0.500 0.311 1.00 0.00 N \n+ATOM 24 H ALA A 3 2.505 0.958 1.189 1.00 0.00 H \n+ATOM 25 CA ALA A 3 2.827 -0.896 0.424 1.00 0.00 C \n+ATOM 26 HA ALA A 3 3.043 -1.313 -0.552 1.00 0.00 H \n+ATOM 27 CB ALA A 3 4.029 -1.076 1.368 1.00 0.00 C \n+ATOM 28 HB1 ALA A 3 4.279 -2.155 1.465 1.00 0.00 H \n+ATOM 29 HB2 ALA A 3 4.914 -0.539 0.968 1.00 0.00 H \n+ATOM 30 HB3 ALA A 3 3.792 -0.678 2.378 1.00 0.00 H \n+ATOM 31 C ALA A 3 1.577 -1.609 1.006 1.00 0.00 C \n+ATOM 32 O ALA A 3 0.897 -1.007 1.889 1.00 0.00 O \n+ATOM 33 OXT ALA A 3 1.161 -2.669 0.465 1.00 0.00 O \n+TER 34 ALA A 3\n+ATOM 35 N CYS B 1 -2.703 -0.955 20.737 1.00 0.00 N \n+ATOM 36 H CYS B 1 -2.063 -0.228 21.156 1.00 0.00 H \n+ATOM 37 H2 CYS B 1 -3.355 -1.276 21.477 1.00 0.00 H \n+ATOM 38 H3 CYS B 1 -3.214 -0.519 19.947 1.00 0.00 H \n+ATOM 39 CA CYS B 1 -1.861 -2.105 20.277 1.00 0.00 C \n+ATOM 40 HA CYS B 1 -2.564 -2.845 19.918 1.00 0.00 H \n+ATOM 41 CB CYS B 1 -1.124 -2.788 21.465 1.00 0.00 C \n+ATOM 42 HB3 CYS B 1 -0.494 -3.611 21.048 1.00 0.00 H \n+ATOM 43 HB2 CYS B 1 -0.416 -2.090 21.955 1.00 0.00 H \n+ATOM 44 SG CYS B 1 -2.264 -3.506 22.699 1.00 0.00 S \n+ATOM 45 HG CYS B 1 -1.328 -4.188 23.353 1.00 0.00 H \n+ATOM 46 C CYS B 1 -0.977 -1.872 19.061 1.00 0.00 C \n+ATOM 47 O CYS B 1 -1.102 -2.640 18.117 1.00 0.00 O \n+ATOM 48 N CYS B 2 -0.118 -0.838 18.916 1.00 0.00 N \n+ATOM 49 H CYS B 2 0.486 -0.986 18.132 1.00 0.00 H \n+ATOM 50 CA CYS B 2 0.253 0.360 19.676 1.00 0.00 C \n+ATOM 51 HA CYS B 2 1.306 0.458 19.484 1.00 0.00 H \n+ATOM 52 CB CYS B 2 -0.335 1.655 19.034 1.00 0.00 C \n+ATOM 53 HB3 CYS B 2 0.242 1.836 18.099 1.00 0.00 H \n+ATOM 54 HB2 CYS B 2 -0.139 2.535 19.686 1.00 0.00 H \n+ATOM 55 SG CYS B 2 -2.110 1.544 18.603 1.00 0.00 S \n+ATOM 56 HG CYS B 2 -1.906 0.955 17.429 1.00 0.00 H \n+ATOM 57 C CYS B 2 0.147 0.428 21.204 1.00 0.00 C \n+ATOM 58 O CYS B 2 -0.919 0.743 21.734 1.00 0.00 O \n+ATOM 59 N CYS B 3 1.188 0.152 22.015 1.00 0.00 N \n+ATOM 60 H CYS B 3 1.031 0.316 22.980 1.00 0.00 H \n+ATOM 61 CA CYS B 3 2.480 -0.463 21.716 1.00 0.00 C \n+ATOM 62 HA CYS B 3 2.714 -1.053 22.590 1.00 0.00 H \n+ATOM 63 CB CYS B 3 3.657 0.554 21.598 1.00 0.00 C \n+ATOM 64 HB3 CYS B 3 3.733 1.090 22.568 1.00 0.00 H \n+ATOM 65 HB2 CYS B 3 4.596 -0.029 21.471 1.00 0.00 H \n+ATOM 66 SG CYS B 3 3.507 1.769 20.247 1.00 0.00 S \n+ATOM 67 HG CYS B 3 3.544 0.800 19.330 1.00 0.00 H \n+ATOM 68 C CYS B 3 2.459 -1.515 20.579 1.00 0.00 C \n+ATOM 69 O CYS B 3 3.029 -1.253 19.489 1.00 0.00 O \n+ATOM 70 OXT CYS B 3 1.793 -2.562 20.789 1.00 0.00 O \n+TER 71 CYS B 3\n+ATOM 72 N ASP C 1 5.491 9.923 41.402 1.00 0.00 N \n+ATOM 73 H ASP C 1 4.728 10.034 42.088 1.00 0.00 H \n+ATOM 74 H2 ASP C 1 6.176 9.190 41.726 1.00 0.00 H \n+ATOM 75 H3 ASP C 1 5.971 10.870 41.322 1.00 0.00 H \n+ATOM 76 CA ASP C 1 4.993 9.441 40.084 1.00 0.00 C \n+ATOM 77 HA ASP C 1 4.204 8.738 40.318 1.00 0.00 H \n+ATOM 78 CB ASP C 1 6.082 8.632 39.321 1.00 0.00 C \n+ATOM 79 HB3 ASP C 1 7.001 9.226 39.152 1.00 0.00 H \n+ATOM 80 HB2 ASP C 1 5.698 8.293 38.334 1.00 0.00 H \n+ATOM 81 CG ASP C 1 6.458 7.407 40.123 1.00 0.00 C \n+ATOM 82 OD1 ASP C 1 6.594 6.300 39.554 1.00 0.00 O \n+ATOM 83 OD2 ASP C 1 6.706 7.554 41.351 1.00 0.00 O \n+ATOM 84 C ASP C 1 4.279 10.487 39.238 1.00 0.00 C \n+ATOM 85 O ASP C 1 3.067 10.388 39.088 1.00 0.00 O \n+ATOM 86 N ASP C 2 4.910 11.525 38.660 1.00 0.00 N \n+ATOM 87 H ASP C 2 4.328 12.100 38.090 1.00 0.00 H \n+ATOM 88 CA ASP C 2 6.290 11.974 38.707 1.00 0.00 C \n+ATOM 89 HA ASP C 2 6.921 11.304 39.268 1.00 0.00 H \n+ATOM 90 CB ASP C 2 6.287 13.401 39.310 1.00 0.00 C \n+ATOM 91 HB3 ASP C 2 5.429 13.977 38.906 1.00 0.00 H \n+ATOM 92 HB2 ASP C 2 7.209 13.945 39.054 1.00 0.00 H \n+ATOM 93 CG ASP C 2 6.222 13.433 40.821 1.00 0.00 C \n+ATOM 94 OD1 ASP C 2 6.171 14.575 41.347 1.00 0.00 O \n+ATOM 95 OD2 ASP C 2 6.294 12.355 41.462 1.00 0.00 O \n+ATOM 96 C ASP C 2 6.825 12.022 37.268 1.00 0.00 C \n+ATOM 97 O ASP C 2 6.118 11.648 36.336 1.00 0.00 O \n+ATOM 98 N ASP C 3 8.061 12.479 36.980 1.00 0.00 N \n+ATOM 99 H ASP C 3 8.275 12.544 36.014 1.00 0.00 H \n+ATOM 100 CA ASP C 3 9.184 12.750 37.856 1.00 0.00 C \n+ATOM 101 HA ASP C 3 8.880 12.736 38.894 1.00 0.00 H \n+ATOM 102 CB ASP C 3 9.906 14.098 37.519 1.00 0.00 C \n+ATOM 103 HB3 ASP C 3 10.891 14.131 38.029 1.00 0.00 H \n+ATOM 104 HB2 ASP C 3 10.062 14.173 36.424 1.00 0.00 H \n+ATOM 105 CG ASP C 3 9.137 15.325 37.971 1.00 0.00 C \n+ATOM 106 OD1 ASP C 3 9.624 16.034 38.891 1.00 0.00 O \n+ATOM 107 OD2 ASP C 3 8.016 15.593 37.467 1.00 0.00 O \n+ATOM 108 C ASP C 3 10.213 11.609 37.688 1.00 0.00 C \n+ATOM 109 O ASP C 3 10.684 11.047 38.709 1.00 0.00 O \n+ATOM 110 OXT ASP C 3 10.649 11.307 36.547 1.00 0.00 O \n+TER 111 ASP C 3\n+ATOM 112 N GLU D 1 -0.052 23.573 8.702 1.00 0.00 N \n+ATOM 113 H GLU D 1 -0.480 23.035 9.503 1.00 0.00 H \n+ATOM 114 H2 GLU D 1 0.622 24.224 9.184 1.00 0.00 H \n+ATOM 115 H3 GLU D 1 0.527 22.951 8.070 1.00 0.00 H \n+ATOM 116 CA GLU D 1 -1.156 24.289 8.013 1.00 0.00 C \n+ATOM 117 HA GLU D 1 -1.937 23.549 7.914 1.00 0.00 H \n+ATOM 118 CB GLU D 1 -1.750 25.414 8.914 1.00 0.00 C \n+ATOM 119 HB3 GLU D 1 -0.941 26.020 9.376 1.00 0.00 H \n+ATOM 120 HB2 GLU D 1 -2.354 26.095 8.271 1.00 0.00 H \n+ATOM 121 CG GLU D 1 -2.719 24.911 10.020 1.00 0.00 C \n+ATOM 122 HG3 GLU D 1 -3.499 24.247 9.598 1.00 0.00 H \n+ATOM 123 HG2 GLU D 1 -3.221 25.788 10.484 1.00 0.00 H \n+ATOM 124 CD GLU D 1 -1.999 24.153 11.125 1.00 0.00 C \n+ATOM 125 OE1 GLU D 1 -1.864 24.715 12.241 1.00 0.00 O \n+ATOM 126 OE2 GLU D 1 -1.523 23.023 10.846 1.00 0.00 O \n+ATOM 127 C GLU D 1 -0.884 24.683 6.568 1.00 0.00 C \n+ATOM 128 O GLU D 1 -1.373 24.003 5.672 1.00 0.00 O \n+ATOM 129 N GLU D 2 -0.110 25.735 6.226 1.00 0.00 N \n+ATOM 130 H GLU D 2 0.246 25.675 5.295 1.00 0.00 H \n+ATOM 131 CA GLU D 2 0.210 26.972 6.922 1.00 0.00 C \n+ATOM 132 HA GLU D 2 -0.667 27.302 7.456 1.00 0.00 H \n+ATOM 133 CB GLU D 2 0.528 28.093 5.894 1.00 0.00 C \n+ATOM 134 HB3 GLU D 2 1.288 27.707 5.179 1.00 0.00 H \n+ATOM 135 HB2 GLU D 2 0.965 28.975 6.417 1.00 0.00 H \n+ATOM 136 CG GLU D 2 -0.731 28.580 5.125 1.00 0.00 C \n+ATOM 137 HG3 GLU D 2 -1.449 29.044 5.832 1.00 0.00 H \n+ATOM 138 HG2 GLU D 2 -1.230 27.717 4.637 1.00 0.00 H \n+ATOM 139 CD GLU D 2 -0.411 29.589 4.038 1.00 0.00 C \n+ATOM 140 OE1 GLU D 2 0.225 29.216 3.015 1.00 0.00 O \n+ATOM 141 OE2 GLU D 2 -0.844 30.774 4.131 1.00 0.00 O \n+ATOM 142 C GLU D 2 1.317 26.881 7.963 1.00 0.00 C \n+ATOM 143 O GLU D 2 1.410 27.755 8.820 1.00 0.00 O \n+ATOM 144 N GLU D 3 2.139 25.814 7.927 1.00 0.00 N \n+ATOM 145 H GLU D 3 2.085 25.177 7.148 1.00 0.00 H \n+ATOM 146 CA GLU D 3 3.133 25.466 8.938 1.00 0.00 C \n+ATOM 147 HA GLU D 3 3.889 26.236 8.937 1.00 0.00 H \n+ATOM 148 CB GLU D 3 3.768 24.050 8.691 1.00 0.00 C \n+ATOM 149 HB3 GLU D 3 3.196 23.266 9.240 1.00 0.00 H \n+ATOM 150 HB2 GLU D 3 4.784 24.068 9.143 1.00 0.00 H \n+ATOM 151 CG GLU D 3 3.875 23.558 7.222 1.00 0.00 C \n+ATOM 152 HG3 GLU D 3 4.355 24.330 6.588 1.00 0.00 H \n+ATOM 153 HG2 GLU D 3 4.484 22.632 7.178 1.00 0.00 H \n+ATOM 154 CD GLU D 3 2.508 23.212 6.643 1.00 0.00 C \n+ATOM 155 OE1 GLU D 3 1.785 22.357 7.219 1.00 0.00 O \n+ATOM 156 OE2 GLU D 3 2.112 23.921 5.686 1.00 0.00 O \n+ATOM 157 C GLU D 3 2.497 25.402 10.356 1.00 0.00 C \n+ATOM 158 O GLU D 3 2.962 26.077 11.309 1.00 0.00 O \n+ATOM 159 OXT GLU D 3 1.513 24.633 10.516 1.00 0.00 O \n+TER 160 GLU D 3\n+ATOM 161 N PHE E 1 0.604 25.320 12.866 1.00 0.00 N \n+ATOM 162 H PHE E 1 0.767 26.342 12.891 1.00 0.00 H \n+ATOM 163 H2 PHE E 1 1.181 24.962 12.052 1.00 0.00 H \n+ATOM 164 H3 PHE E 1 -0.409 25.121 12.619 1.00 0.00 H \n+ATOM 165 CA PHE E 1 0.967 24.683 14.155 1.00 0.00 C \n+ATOM 166 HA PHE E 1 0.257 23.880 14.307 1.00 0.00 H \n+ATOM 167 CB PHE E 1 2.433 24.139 14.096 1.00 0.00 C \n+ATOM 168 HB3 PHE E 1 3.009 24.566 13.248 1.00 0.00 H \n+ATOM 169 HB2 PHE E 1 2.996 24.384 15.023 1.00 0.00 H \n+ATOM 170 CG PHE E 1 2.433 22.641 13.934 1.00 0.00 C \n+ATOM 171 CD1 PHE E 1 1.798 22.038 12.835 1.00 0.00 C \n+ATOM 172 HD1 PHE E 1 1.302 22.645 12.089 1.00 0.00 H \n+ATOM 173 CE1 PHE E 1 1.801 20.647 12.683 1.00 0.00 C \n+ATOM 174 HE1 PHE E 1 1.307 20.207 11.828 1.00 0.00 H \n+ATOM 175 CZ PHE E 1 2.441 19.841 13.633 1.00 0.00 C \n+ATOM 176 HZ PHE E 1 2.448 18.768 13.511 1.00 0.00 H \n+ATOM 177 CD2 PHE E 1 3.087 21.822 14.872 1.00 0.00 C \n+ATOM 178 HD2 PHE E 1 3.594 22.276 15.712 1.00 0.00 H \n+ATOM 179 CE2 PHE E 1 3.084 20.430 14.729 1.00 0.00 C \n+ATOM 180 HE2 PHE E 1 3.585 19.814 15.461 1.00 0.00 H \n+ATOM 181 C PHE E 1 0.753 25.679 15.291 1.00 0.00 C \n+ATOM 182 O PHE E 1 0.590 26.872 15.050 1.00 0.00 O \n+ATOM 183 N PHE E 2 0.706 25.289 16.580 1.00 0.00 N \n+ATOM 184 H PHE E 2 0.524 26.020 17.231 1.00 0.00 H \n+ATOM 185 CA PHE E 2 0.979 23.983 17.159 1.00 0.00 C \n+ATOM 186 HA PHE E 2 1.452 23.354 16.423 1.00 0.00 H \n+ATOM 187 CB PHE E 2 -0.303 23.268 17.669 1.00 0.00 C \n+ATOM 188 HB3 PHE E 2 -0.061 22.384 18.299 1.00 0.00 H \n+ATOM 189 HB2 PHE E 2 -0.944 23.958 18.257 1.00 0.00 H \n+ATOM 190 CG PHE E 2 -1.062 22.770 16.474 1.00 0.00 C \n+ATOM 191 CD1 PHE E 2 -2.152 23.487 15.956 1.00 0.00 C \n+ATOM 192 HD1 PHE E 2 -2.477 24.395 16.440 1.00 0.00 H \n+ATOM 193 CE1 PHE E 2 -2.775 23.070 14.774 1.00 0.00 C \n+ATOM 194 HE1 PHE E 2 -3.569 23.659 14.338 1.00 0.00 H \n+ATOM 195 CZ PHE E 2 -2.323 21.923 14.110 1.00 0.00 C \n+ATOM 196 HZ PHE E 2 -2.771 21.636 13.168 1.00 0.00 H \n+ATOM 197 CD2 PHE E 2 -0.636 21.602 15.818 1.00 0.00 C \n+ATOM 198 HD2 PHE E 2 0.210 21.051 16.199 1.00 0.00 H \n+ATOM 199 CE2 PHE E 2 -1.259 21.182 14.637 1.00 0.00 C \n+ATOM 200 HE2 PHE E 2 -0.896 20.311 14.111 1.00 0.00 H \n+ATOM 201 C PHE E 2 2.018 24.098 18.257 1.00 0.00 C \n+ATOM 202 O PHE E 2 3.210 23.917 18.015 1.00 0.00 O \n+ATOM 203 N PHE E 3 1.570 24.392 19.485 1.00 0.00 N \n+ATOM 204 H PHE E 3 0.617 24.594 19.715 1.00 0.00 H \n+ATOM 205 CA PHE E 3 2.365 24.469 20.681 1.00 0.00 C \n+ATOM 206 HA PHE E 3 3.195 25.137 20.503 1.00 0.00 H \n+ATOM 207 CB PHE E 3 2.899 23.076 21.146 1.00 0.00 C \n+ATOM 208 HB3 PHE E 3 3.764 22.809 20.503 1.00 0.00 H \n+ATOM 209 HB2 PHE E 3 3.249 23.135 22.197 1.00 0.00 H \n+ATOM 210 CG PHE E 3 1.863 21.978 21.039 1.00 0.00 C \n+ATOM 211 CD1 PHE E 3 0.776 21.925 21.927 1.00 0.00 C \n+ATOM 212 HD1 PHE E 3 0.674 22.695 22.679 1.00 0.00 H \n+ATOM 213 CE1 PHE E 3 -0.184 20.911 21.824 1.00 0.00 C \n+ATOM 214 HE1 PHE E 3 -1.023 20.898 22.503 1.00 0.00 H \n+ATOM 215 CZ PHE E 3 -0.059 19.927 20.834 1.00 0.00 C \n+ATOM 216 HZ PHE E 3 -0.803 19.149 20.749 1.00 0.00 H \n+ATOM 217 CD2 PHE E 3 1.982 20.977 20.057 1.00 0.00 C \n+ATOM 218 HD2 PHE E 3 2.812 21.012 19.367 1.00 0.00 H \n+ATOM 219 CE2 PHE E 3 1.026 19.959 19.950 1.00 0.00 C \n+ATOM 220 HE2 PHE E 3 1.123 19.205 19.183 1.00 0.00 H \n+ATOM 221 C PHE E 3 1.485 25.154 21.761 1.00 0.00 C \n+ATOM 222 O PHE E 3 2.009 25.430 22.873 1.00 0.00 O \n+ATOM 223 OXT PHE E 3 0.283 25.418 21.471 1.00 0.00 O \n+TER 224 PHE E 3\n+ATOM 225 N GLY F 1 6.970 16.518 39.722 1.00 0.00 N \n+ATOM 226 H GLY F 1 7.888 16.755 40.140 1.00 0.00 H \n+ATOM 227 H2 GLY F 1 6.502 15.791 40.337 1.00 0.00 H \n+ATOM 228 H3 GLY F 1 7.252 16.041 38.815 1.00 0.00 H \n+ATOM 229 CA GLY F 1 6.105 17.689 39.412 1.00 0.00 C \n+ATOM 230 HA3 GLY F 1 5.768 18.100 40.352 1.00 0.00 H \n+ATOM 231 HA2 GLY F 1 6.706 18.370 38.831 1.00 0.00 H \n+ATOM 232 C GLY F 1 4.875 17.317 38.621 1.00 0.00 C \n+ATOM 233 O GLY F 1 4.223 16.324 38.915 1.00 0.00 O \n+ATOM 234 N GLY F 2 4.454 18.058 37.575 1.00 0.00 N \n+ATOM 235 H GLY F 2 3.640 17.681 37.141 1.00 0.00 H \n+ATOM 236 CA GLY F 2 4.988 19.300 37.012 1.00 0.00 C \n+ATOM 237 HA3 GLY F 2 4.463 19.467 36.083 1.00 0.00 H \n+ATOM 238 HA2 GLY F 2 6.051 19.180 36.863 1.00 0.00 H \n+ATOM 239 C GLY F 2 4.781 20.530 37.866 1.00 0.00 C \n+ATOM 240 O GLY F 2 4.867 20.481 39.089 1.00 0.00 O \n+ATOM 241 N GLY F 3 4.531 21.683 37.220 1.00 0.00 N \n+ATOM 242 H GLY F 3 4.454 21.758 36.226 1.00 0.00 H \n+ATOM 243 CA GLY F 3 4.250 22.945 37.878 1.00 0.00 C \n+ATOM 244 HA3 GLY F 3 5.166 23.334 38.298 1.00 0.00 H \n+ATOM 245 HA2 GLY F 3 3.464 22.799 38.603 1.00 0.00 H \n+ATOM 246 C GLY F 3 3.739 23.947 36.840 1.00 0.00 C \n+ATOM 247 O GLY F 3 3.340 25.081 37.217 1.00 0.00 O \n+ATOM 248 OXT GLY F 3 3.710 23.621 35.621 1.00 0.00 O \n+TER 249 GLY F 3\n+ATOM 250 N HIS G 1 -0.593 31.233 1.561 1.00 0.00 N \n+ATOM 251 H HIS G 1 -0.700 31.270 2.618 1.00 0.00 H \n+ATOM 252 H2 HIS G 1 -0.237 30.251 1.487 1.00 0.00 H \n+ATOM 253 H3 HIS G 1 -1.560 31.322 1.176 1.00 0.00 H \n+ATOM 254 CA HIS G 1 0.392 32.254 1.123 1.00 0.00 C \n+ATOM 255 HA HIS G 1 0.475 32.158 0.050 1.00 0.00 H \n+ATOM 256 CB HIS G 1 1.801 31.983 1.764 1.00 0.00 C \n+ATOM 257 HB3 HIS G 1 1.945 30.897 1.953 1.00 0.00 H \n+ATOM 258 HB2 HIS G 1 2.568 32.276 1.013 1.00 0.00 H \n+ATOM 259 ND1 HIS G 1 2.625 34.028 3.026 1.00 0.00 N \n+ATOM 260 HD1 HIS G 1 2.756 34.627 2.221 1.00 0.00 H \n+ATOM 261 CG HIS G 1 2.140 32.737 3.024 1.00 0.00 C \n+ATOM 262 CE1 HIS G 1 2.805 34.383 4.318 1.00 0.00 C \n+ATOM 263 HE1 HIS G 1 3.116 35.383 4.624 1.00 0.00 H \n+ATOM 264 NE2 HIS G 1 2.502 33.402 5.142 1.00 0.00 N \n+ATOM 265 CD2 HIS G 1 2.095 32.356 4.332 1.00 0.00 C \n+ATOM 266 HD2 HIS G 1 1.783 31.414 4.769 1.00 0.00 H \n+ATOM 267 C HIS G 1 -0.191 33.627 1.390 1.00 0.00 C \n+ATOM 268 O HIS G 1 -0.525 34.332 0.444 1.00 0.00 O \n+ATOM 269 N HIS G 2 -0.421 33.984 2.674 1.00 0.00 N \n+ATOM 270 H HIS G 2 -0.046 33.439 3.424 1.00 0.00 H \n+ATOM 271 CA HIS G 2 -1.211 35.130 3.098 1.00 0.00 C \n+ATOM 272 HA HIS G 2 -1.316 35.019 4.166 1.00 0.00 H \n+ATOM 273 CB HIS G 2 -2.646 35.101 2.488 1.00 0.00 C \n+ATOM 274 HB3 HIS G 2 -2.647 35.527 1.462 1.00 0.00 H \n+ATOM 275 HB2 HIS G 2 -3.343 35.700 3.112 1.00 0.00 H \n+ATOM 276 ND1 HIS G 2 -3.201 32.739 3.340 1.00 0.00 N \n+ATOM 277 HD1 HIS G 2 -2.945 32.867 4.300 1.00 0.00 H \n+ATOM 278 CG HIS G 2 -3.145 33.683 2.333 1.00 0.00 C \n+ATOM 279 CE1 HIS G 2 -3.445 31.542 2.754 1.00 0.00 C \n+ATOM 280 HE1 HIS G 2 -3.485 30.606 3.318 1.00 0.00 H \n+ATOM 281 NE2 HIS G 2 -3.534 31.651 1.439 1.00 0.00 N \n+ATOM 282 CD2 HIS G 2 -3.382 33.003 1.178 1.00 0.00 C \n+ATOM 283 HD2 HIS G 2 -3.388 33.369 0.157 1.00 0.00 H \n+ATOM 284 C HIS G 2 -0.460 36.444 2.907 1.00 0.00 C \n+ATOM 285 O HIS G 2 0.590 36.649 3.514 1.00 0.00 O \n+ATOM 286 N HIS G 3 -0.975 37.360 2.076 1.00 0.00 N \n+ATOM 287 H HIS G 3 -1.881 37.312 1.659 1.00 0.00 H \n+ATOM 288 CA HIS G 3 -0.351 38.614 1.745 1.00 0.00 C \n+ATOM 289 HA HIS G 3 0.161 39.014 2.608 1.00 0.00 H \n+ATOM 290 CB HIS G 3 0.583 38.489 0.515 1.00 0.00 C \n+ATOM 291 HB3 HIS G 3 -0.024 38.147 -0.351 1.00 0.00 H \n+ATOM 292 HB2 HIS G 3 0.998 39.490 0.266 1.00 0.00 H \n+ATOM 293 ND1 HIS G 3 2.788 37.749 1.538 1.00 0.00 N \n+ATOM 294 HD1 HIS G 3 2.864 38.525 2.164 1.00 0.00 H \n+ATOM 295 CG HIS G 3 1.707 37.510 0.720 1.00 0.00 C \n+ATOM 296 CE1 HIS G 3 3.601 36.671 1.451 1.00 0.00 C \n+ATOM 297 HE1 HIS G 3 4.532 36.580 2.011 1.00 0.00 H \n+ATOM 298 NE2 HIS G 3 3.121 35.754 0.632 1.00 0.00 N \n+ATOM 299 CD2 HIS G 3 1.930 36.290 0.160 1.00 0.00 C \n+ATOM 300 HD2 HIS G 3 1.324 35.751 -0.557 1.00 0.00 H \n+ATOM 301 C HIS G 3 -1.485 39.591 1.374 1.00 0.00 C \n+ATOM 302 O HIS G 3 -1.186 40.803 1.215 1.00 0.00 O \n+ATOM 303 OXT HIS G 3 -2.649 39.123 1.228 1.00 0.00 O \n+TER 304 HIS G 3\n+ATOM 305 N ILE H 1 -1.123 36.890 19.292 1.00 0.00 N \n+ATOM 306 H ILE H 1 -0.665 37.016 18.370 1.00 0.00 H \n+ATOM 307 H2 ILE H 1 -1.576 35.954 19.332 1.00 0.00 H \n+ATOM 308 H3 ILE H 1 -1.861 37.615 19.445 1.00 0.00 H \n+ATOM 309 CA ILE H 1 -0.138 36.988 20.424 1.00 0.00 C \n+ATOM 310 HA ILE H 1 0.542 37.800 20.201 1.00 0.00 H \n+ATOM 311 CB ILE H 1 0.644 35.679 20.551 1.00 0.00 C \n+ATOM 312 HB ILE H 1 1.342 35.758 21.420 1.00 0.00 H \n+ATOM 313 CG2 ILE H 1 -0.302 34.479 20.801 1.00 0.00 C \n+ATOM 314 HG21 ILE H 1 0.299 33.566 21.013 1.00 0.00 H \n+ATOM 315 HG22 ILE H 1 -0.931 34.244 19.918 1.00 0.00 H \n+ATOM 316 HG23 ILE H 1 -0.960 34.638 21.682 1.00 0.00 H \n+ATOM 317 CG1 ILE H 1 1.549 35.457 19.313 1.00 0.00 C \n+ATOM 318 HG13 ILE H 1 2.088 36.403 19.075 1.00 0.00 H \n+ATOM 319 HG12 ILE H 1 0.936 35.180 18.426 1.00 0.00 H \n+ATOM 320 CD1 ILE H 1 2.606 34.368 19.534 1.00 0.00 C \n+ATOM 321 HD11 ILE H 1 2.136 33.375 19.700 1.00 0.00 H \n+ATOM 322 HD12 ILE H 1 3.267 34.280 18.643 1.00 0.00 H \n+ATOM 323 HD13 ILE H 1 3.246 34.601 20.412 1.00 0.00 H \n+ATOM 324 C ILE H 1 -0.879 37.397 21.684 1.00 0.00 C \n+ATOM 325 O ILE H 1 -1.982 37.914 21.547 1.00 0.00 O \n+ATOM 326 N ILE H 2 -0.317 37.211 22.901 1.00 0.00 N \n+ATOM 327 H ILE H 2 0.583 36.804 23.022 1.00 0.00 H \n+ATOM 328 CA ILE H 2 -0.984 37.567 24.152 1.00 0.00 C \n+ATOM 329 HA ILE H 2 -1.926 38.043 23.912 1.00 0.00 H \n+ATOM 330 CB ILE H 2 -0.229 38.607 24.988 1.00 0.00 C \n+ATOM 331 HB ILE H 2 0.809 38.257 25.182 1.00 0.00 H \n+ATOM 332 CG2 ILE H 2 -0.114 39.910 24.161 1.00 0.00 C \n+ATOM 333 HG21 ILE H 2 0.374 40.702 24.768 1.00 0.00 H \n+ATOM 334 HG22 ILE H 2 -1.118 40.274 23.856 1.00 0.00 H \n+ATOM 335 HG23 ILE H 2 0.497 39.753 23.249 1.00 0.00 H \n+ATOM 336 CG1 ILE H 2 -0.877 38.890 26.373 1.00 0.00 C \n+ATOM 337 HG13 ILE H 2 -0.809 37.976 27.005 1.00 0.00 H \n+ATOM 338 HG12 ILE H 2 -0.261 39.668 26.878 1.00 0.00 H \n+ATOM 339 CD1 ILE H 2 -2.337 39.364 26.328 1.00 0.00 C \n+ATOM 340 HD11 ILE H 2 -2.436 40.297 25.733 1.00 0.00 H \n+ATOM 341 HD12 ILE H 2 -2.994 38.589 25.879 1.00 0.00 H \n+ATOM 342 HD13 ILE H 2 -2.707 39.570 27.355 1.00 0.00 H \n+ATOM 343 C ILE H 2 -1.416 36.308 24.907 1.00 0.00 C \n+ATOM 344 O ILE H 2 -2.599 35.990 24.921 1.00 0.00 O \n+ATOM 345 N ILE H 3 -0.547 35.511 25.560 1.00 0.00 N \n+ATOM 346 H ILE H 3 -0.957 34.773 26.084 1.00 0.00 H \n+ATOM 347 CA ILE H 3 0.903 35.545 25.624 1.00 0.00 C \n+ATOM 348 HA ILE H 3 1.290 36.251 24.910 1.00 0.00 H \n+ATOM 349 CB ILE H 3 1.540 34.184 25.326 1.00 0.00 C \n+ATOM 350 HB ILE H 3 1.224 33.461 26.114 1.00 0.00 H \n+ATOM 351 CG2 ILE H 3 3.081 34.326 25.367 1.00 0.00 C \n+ATOM 352 HG21 ILE H 3 3.426 34.685 26.359 1.00 0.00 H \n+ATOM 353 HG22 ILE H 3 3.572 33.349 25.180 1.00 0.00 H \n+ATOM 354 HG23 ILE H 3 3.425 35.046 24.596 1.00 0.00 H \n+ATOM 355 CG1 ILE H 3 1.067 33.626 23.959 1.00 0.00 C \n+ATOM 356 HG13 ILE H 3 1.426 34.308 23.162 1.00 0.00 H \n+ATOM 357 HG12 ILE H 3 -0.045 33.609 23.924 1.00 0.00 H \n+ATOM 358 CD1 ILE H 3 1.558 32.204 23.661 1.00 0.00 C \n+ATOM 359 HD11 ILE H 3 2.663 32.169 23.557 1.00 0.00 H \n+ATOM 360 HD12 ILE H 3 1.263 31.508 24.476 1.00 0.00 H \n+ATOM 361 HD13 ILE H 3 1.116 31.826 22.714 1.00 0.00 H \n+ATOM 362 C ILE H 3 1.321 36.015 27.031 1.00 0.00 C \n+ATOM 363 O ILE H 3 1.993 37.074 27.138 1.00 0.00 O \n+ATOM 364 OXT ILE H 3 0.999 35.341 28.048 1.00 0.00 O \n+TER 365 ILE H 3\n+ATOM 366 N LYS I 1 1.658 32.719 31.804 1.00 0.00 N \n+ATOM 367 H LYS I 1 2.427 32.375 31.202 1.00 0.00 H \n+ATOM 368 H2 LYS I 1 0.753 32.639 31.303 1.00 0.00 H \n+ATOM 369 H3 LYS I 1 1.835 33.756 31.977 1.00 0.00 H \n+ATOM 370 CA LYS I 1 1.627 32.019 33.130 1.00 0.00 C \n+ATOM 371 HA LYS I 1 2.575 32.223 33.608 1.00 0.00 H \n+ATOM 372 CB LYS I 1 1.468 30.475 32.949 1.00 0.00 C \n+ATOM 373 HB3 LYS I 1 2.072 30.153 32.069 1.00 0.00 H \n+ATOM 374 HB2 LYS I 1 0.411 30.205 32.732 1.00 0.00 H \n+ATOM 375 CG LYS I 1 1.996 29.653 34.147 1.00 0.00 C \n+ATOM 376 HG3 LYS I 1 1.412 29.917 35.058 1.00 0.00 H \n+ATOM 377 HG2 LYS I 1 3.059 29.927 34.336 1.00 0.00 H \n+ATOM 378 CD LYS I 1 1.916 28.124 33.928 1.00 0.00 C \n+ATOM 379 HD3 LYS I 1 2.473 27.871 32.997 1.00 0.00 H \n+ATOM 380 HD2 LYS I 1 0.849 27.844 33.773 1.00 0.00 H \n+ATOM 381 CE LYS I 1 2.496 27.306 35.101 1.00 0.00 C \n+ATOM 382 HE3 LYS I 1 1.938 27.526 36.039 1.00 0.00 H \n+ATOM 383 HE2 LYS I 1 3.566 27.565 35.260 1.00 0.00 H \n+ATOM 384 NZ LYS I 1 2.417 25.853 34.861 1.00 0.00 N \n+ATOM 385 HZ1 LYS I 1 3.013 25.516 34.084 1.00 0.00 H \n+ATOM 386 HZ2 LYS I 1 1.456 25.491 34.761 1.00 0.00 H \n+ATOM 387 HZ3 LYS I 1 2.831 25.359 35.718 1.00 0.00 H \n+ATOM 388 C LYS I 1 0.527 32.614 34.001 1.00 0.00 C \n+ATOM 389 O LYS I 1 -0.639 32.258 33.892 1.00 0.00 O \n+ATOM 390 N LYS I 2 0.902 33.603 34.828 1.00 0.00 N \n+ATOM 391 H LYS I 2 1.866 33.901 34.784 1.00 0.00 H \n+ATOM 392 CA LYS I 2 0.026 34.587 35.428 1.00 0.00 C \n+ATOM 393 HA LYS I 2 -0.493 35.095 34.625 1.00 0.00 H \n+ATOM 394 CB LYS I 2 -1.036 34.007 36.411 1.00 0.00 C \n+ATOM 395 HB3 LYS I 2 -1.566 34.844 36.912 1.00 0.00 H \n+ATOM 396 HB2 LYS I 2 -1.812 33.475 35.812 1.00 0.00 H \n+ATOM 397 CG LYS I 2 -0.486 33.003 37.444 1.00 0.00 C \n+ATOM 398 HG3 LYS I 2 0.589 33.193 37.653 1.00 0.00 H \n+ATOM 399 HG2 LYS I 2 -0.534 31.991 36.973 1.00 0.00 H \n+ATOM 400 CD LYS I 2 -1.280 32.978 38.765 1.00 0.00 C \n+ATOM 401 HD3 LYS I 2 -2.313 33.354 38.597 1.00 0.00 H \n+ATOM 402 HD2 LYS I 2 -1.382 31.910 39.075 1.00 0.00 H \n+ATOM 403 CE LYS I 2 -0.598 33.707 39.936 1.00 0.00 C \n+ATOM 404 HE3 LYS I 2 0.402 33.258 40.128 1.00 0.00 H \n+ATOM 405 HE2 LYS I 2 -1.212 33.622 40.859 1.00 0.00 H \n+ATOM 406 NZ LYS I 2 -0.405 35.144 39.644 1.00 0.00 N \n+ATOM 407 HZ1 LYS I 2 0.143 35.253 38.749 1.00 0.00 H \n+ATOM 408 HZ2 LYS I 2 -1.318 35.618 39.515 1.00 0.00 H \n+ATOM 409 HZ3 LYS I 2 0.127 35.607 40.405 1.00 0.00 H \n+ATOM 410 C LYS I 2 0.878 35.645 36.132 1.00 0.00 C \n+ATOM 411 O LYS I 2 0.857 35.758 37.359 1.00 0.00 O \n+ATOM 412 N LYS I 3 1.689 36.466 35.438 1.00 0.00 N \n+ATOM 413 H LYS I 3 2.298 37.038 35.976 1.00 0.00 H \n+ATOM 414 CA LYS I 3 1.777 36.717 34.009 1.00 0.00 C \n+ATOM 415 HA LYS I 3 0.774 36.932 33.670 1.00 0.00 H \n+ATOM 416 CB LYS I 3 2.659 37.980 33.790 1.00 0.00 C \n+ATOM 417 HB3 LYS I 3 2.164 38.836 34.301 1.00 0.00 H \n+ATOM 418 HB2 LYS I 3 3.638 37.807 34.293 1.00 0.00 H \n+ATOM 419 CG LYS I 3 2.937 38.372 32.326 1.00 0.00 C \n+ATOM 420 HG3 LYS I 3 3.558 39.296 32.303 1.00 0.00 H \n+ATOM 421 HG2 LYS I 3 3.570 37.564 31.896 1.00 0.00 H \n+ATOM 422 CD LYS I 3 1.664 38.597 31.483 1.00 0.00 C \n+ATOM 423 HD3 LYS I 3 1.327 39.650 31.613 1.00 0.00 H \n+ATOM 424 HD2 LYS I 3 0.840 37.952 31.858 1.00 0.00 H \n+ATOM 425 CE LYS I 3 1.814 38.291 29.986 1.00 0.00 C \n+ATOM 426 HE3 LYS I 3 2.561 38.954 29.500 1.00 0.00 H \n+ATOM 427 HE2 LYS I 3 0.834 38.414 29.469 1.00 0.00 H \n+ATOM 428 NZ LYS I 3 2.244 36.897 29.812 1.00 0.00 N \n+ATOM 429 HZ1 LYS I 3 1.803 36.509 28.921 1.00 0.00 H \n+ATOM 430 HZ2 LYS I 3 1.950 36.296 30.625 1.00 0.00 H \n+ATOM 431 HZ3 LYS I 3 3.265 36.834 29.680 1.00 0.00 H \n+ATOM 432 C LYS I 3 2.290 35.533 33.144 1.00 0.00 C \n+ATOM 433 O LYS I 3 1.800 35.377 31.992 1.00 0.00 O \n+ATOM 434 OXT LYS I 3 3.087 34.690 33.627 1.00 0.00 O \n+TER 435 LYS I 3\n+ATOM 436 N LEU J 1 16.345 0.157 -0.850 1.00 0.00 N \n+ATOM 437 H LEU J 1 16.558 -0.435 -1.696 1.00 0.00 H \n+ATOM 438 H2 LEU J 1 16.439 -0.115 0.171 1.00 0.00 H \n+ATOM 439 H3 LEU J 1 15.559 -0.496 -0.777 1.00 0.00 H \n+ATOM 440 CA LEU J 1 17.860 0.077 -0.787 1.00 0.00 C \n+ATOM 441 HA LEU J 1 18.282 1.006 -1.155 1.00 0.00 H \n+ATOM 442 CB LEU J 1 18.309 -1.115 -1.671 1.00 0.00 C \n+ATOM 443 HB3 LEU J 1 17.960 -2.095 -1.281 1.00 0.00 H \n+ATOM 444 HB2 LEU J 1 19.425 -1.146 -1.625 1.00 0.00 H \n+ATOM 445 CG LEU J 1 17.952 -0.991 -3.174 1.00 0.00 C \n+ATOM 446 HG LEU J 1 18.024 0.085 -3.471 1.00 0.00 H \n+ATOM 447 CD1 LEU J 1 16.558 -1.528 -3.542 1.00 0.00 C \n+ATOM 448 HD11 LEU J 1 15.728 -0.907 -3.156 1.00 0.00 H \n+ATOM 449 HD12 LEU J 1 16.457 -1.541 -4.651 1.00 0.00 H \n+ATOM 450 HD13 LEU J 1 16.439 -2.576 -3.191 1.00 0.00 H \n+ATOM 451 CD2 LEU J 1 19.005 -1.728 -4.015 1.00 0.00 C \n+ATOM 452 HD21 LEU J 1 20.014 -1.289 -3.839 1.00 0.00 H \n+ATOM 453 HD22 LEU J 1 18.784 -1.634 -5.099 1.00 0.00 H \n+ATOM 454 HD23 LEU J 1 19.044 -2.806 -3.753 1.00 0.00 H \n+ATOM 455 C LEU J 1 18.270 -0.090 0.655 1.00 0.00 C \n+ATOM 456 O LEU J 1 17.414 -0.465 1.452 1.00 0.00 O \n+ATOM 457 N LEU J 2 19.523 0.219 0.982 1.00 0.00 N \n+ATOM 458 H LEU J 2 20.142 0.486 0.219 1.00 0.00 H \n+ATOM 459 CA LEU J 2 20.168 0.103 2.278 1.00 0.00 C \n+ATOM 460 HA LEU J 2 19.697 -0.681 2.855 1.00 0.00 H \n+ATOM 461 CB LEU J 2 20.224 1.437 3.077 1.00 0.00 C \n+ATOM 462 HB3 LEU J 2 20.822 2.201 2.535 1.00 0.00 H \n+ATOM 463 HB2 LEU J 2 20.755 1.220 4.033 1.00 0.00 H \n+ATOM 464 CG LEU J 2 18.851 2.055 3.427 1.00 0.00 C \n+ATOM 465 HG LEU J 2 18.098 1.233 3.463 1.00 0.00 H \n+ATOM 466 CD1 LEU J 2 18.403 3.101 2.393 1.00 0.00 C \n+ATOM 467 HD11 LEU J 2 18.367 2.671 1.373 1.00 0.00 H \n+ATOM 468 HD12 LEU J 2 19.115 3.954 2.382 1.00 0.00 H \n+ATOM 469 HD13 LEU J 2 17.397 3.493 2.651 1.00 0.00 H \n+ATOM 470 CD2 LEU J 2 18.887 2.703 4.821 1.00 0.00 C \n+ATOM 471 HD21 LEU J 2 19.158 1.953 5.594 1.00 0.00 H \n+ATOM 472 HD22 LEU J 2 19.638 3.522 4.846 1.00 0.00 H \n+ATOM 473 HD23 LEU J 2 17.894 3.129 5.078 1.00 0.00 H \n+ATOM 474 C LEU J 2 21.575 -0.352 1.941 1.00 0.00 C \n+ATOM 475 O LEU J 2 22.121 -1.266 2.551 1.00 0.00 O \n+ATOM 476 N LEU J 3 22.107 0.294 0.886 1.00 0.00 N \n+ATOM 477 H LEU J 3 21.718 1.164 0.604 1.00 0.00 H \n+ATOM 478 CA LEU J 3 22.764 -0.282 -0.271 1.00 0.00 C \n+ATOM 479 HA LEU J 3 23.720 0.210 -0.366 1.00 0.00 H \n+ATOM 480 CB LEU J 3 23.013 -1.828 -0.280 1.00 0.00 C \n+ATOM 481 HB3 LEU J 3 23.661 -2.063 -1.153 1.00 0.00 H \n+ATOM 482 HB2 LEU J 3 23.603 -2.059 0.632 1.00 0.00 H \n+ATOM 483 CG LEU J 3 21.782 -2.769 -0.328 1.00 0.00 C \n+ATOM 484 HG LEU J 3 20.889 -2.204 0.019 1.00 0.00 H \n+ATOM 485 CD1 LEU J 3 21.511 -3.277 -1.753 1.00 0.00 C \n+ATOM 486 HD11 LEU J 3 21.390 -2.422 -2.450 1.00 0.00 H \n+ATOM 487 HD12 LEU J 3 20.594 -3.899 -1.784 1.00 0.00 H \n+ATOM 488 HD13 LEU J 3 22.368 -3.886 -2.110 1.00 0.00 H \n+ATOM 489 CD2 LEU J 3 21.969 -3.979 0.604 1.00 0.00 C \n+ATOM 490 HD21 LEU J 3 22.856 -4.568 0.289 1.00 0.00 H \n+ATOM 491 HD22 LEU J 3 22.126 -3.641 1.650 1.00 0.00 H \n+ATOM 492 HD23 LEU J 3 21.076 -4.636 0.574 1.00 0.00 H \n+ATOM 493 C LEU J 3 21.903 0.187 -1.483 1.00 0.00 C \n+ATOM 494 O LEU J 3 20.852 0.862 -1.250 1.00 0.00 O \n+ATOM 495 OXT LEU J 3 22.274 -0.105 -2.644 1.00 0.00 O \n+TER 496 LEU J 3\n+ATOM 497 N MET K 1 18.203 -1.403 17.866 1.00 0.00 N \n+ATOM 498 H MET K 1 18.126 -2.333 17.422 1.00 0.00 H \n+ATOM 499 H2 MET K 1 17.629 -0.712 17.351 1.00 0.00 H \n+ATOM 500 H3 MET K 1 19.223 -1.092 17.779 1.00 0.00 H \n+ATOM 501 CA MET K 1 17.820 -1.441 19.305 1.00 0.00 C \n+ATOM 502 HA MET K 1 18.507 -2.128 19.783 1.00 0.00 H \n+ATOM 503 CB MET K 1 16.375 -1.996 19.514 1.00 0.00 C \n+ATOM 504 HB3 MET K 1 16.043 -1.769 20.554 1.00 0.00 H \n+ATOM 505 HB2 MET K 1 16.425 -3.106 19.447 1.00 0.00 H \n+ATOM 506 CG MET K 1 15.281 -1.504 18.531 1.00 0.00 C \n+ATOM 507 HG3 MET K 1 15.335 -0.393 18.472 1.00 0.00 H \n+ATOM 508 HG2 MET K 1 14.292 -1.730 18.994 1.00 0.00 H \n+ATOM 509 SD MET K 1 15.294 -2.219 16.851 1.00 0.00 S \n+ATOM 510 CE MET K 1 14.643 -3.858 17.288 1.00 0.00 C \n+ATOM 511 HE1 MET K 1 15.327 -4.409 17.967 1.00 0.00 H \n+ATOM 512 HE2 MET K 1 14.503 -4.481 16.377 1.00 0.00 H \n+ATOM 513 HE3 MET K 1 13.655 -3.775 17.789 1.00 0.00 H \n+ATOM 514 C MET K 1 18.024 -0.113 20.017 1.00 0.00 C \n+ATOM 515 O MET K 1 17.178 0.773 19.977 1.00 0.00 O \n+ATOM 516 N MET K 2 19.204 0.043 20.631 1.00 0.00 N \n+ATOM 517 H MET K 2 19.909 -0.666 20.497 1.00 0.00 H \n+ATOM 518 CA MET K 2 19.721 1.268 21.189 1.00 0.00 C \n+ATOM 519 HA MET K 2 19.609 2.050 20.452 1.00 0.00 H \n+ATOM 520 CB MET K 2 18.983 1.700 22.490 1.00 0.00 C \n+ATOM 521 HB3 MET K 2 19.508 2.574 22.933 1.00 0.00 H \n+ATOM 522 HB2 MET K 2 17.966 2.048 22.197 1.00 0.00 H \n+ATOM 523 CG MET K 2 18.804 0.585 23.545 1.00 0.00 C \n+ATOM 524 HG3 MET K 2 19.795 0.135 23.776 1.00 0.00 H \n+ATOM 525 HG2 MET K 2 18.181 -0.221 23.101 1.00 0.00 H \n+ATOM 526 SD MET K 2 18.022 1.135 25.094 1.00 0.00 S \n+ATOM 527 CE MET K 2 19.471 2.009 25.756 1.00 0.00 C \n+ATOM 528 HE1 MET K 2 19.274 2.381 26.784 1.00 0.00 H \n+ATOM 529 HE2 MET K 2 20.356 1.338 25.798 1.00 0.00 H \n+ATOM 530 HE3 MET K 2 19.739 2.883 25.126 1.00 0.00 H \n+ATOM 531 C MET K 2 21.228 1.102 21.418 1.00 0.00 C \n+ATOM 532 O MET K 2 21.725 1.206 22.535 1.00 0.00 O \n+ATOM 533 N MET K 3 22.047 0.812 20.386 1.00 0.00 N \n+ATOM 534 H MET K 3 22.991 0.604 20.622 1.00 0.00 H \n+ATOM 535 CA MET K 3 21.790 0.826 18.955 1.00 0.00 C \n+ATOM 536 HA MET K 3 21.154 1.675 18.753 1.00 0.00 H \n+ATOM 537 CB MET K 3 23.103 1.027 18.148 1.00 0.00 C \n+ATOM 538 HB3 MET K 3 23.568 1.982 18.475 1.00 0.00 H \n+ATOM 539 HB2 MET K 3 22.825 1.146 17.076 1.00 0.00 H \n+ATOM 540 CG MET K 3 24.160 -0.102 18.244 1.00 0.00 C \n+ATOM 541 HG3 MET K 3 24.904 0.087 17.438 1.00 0.00 H \n+ATOM 542 HG2 MET K 3 23.672 -1.069 17.992 1.00 0.00 H \n+ATOM 543 SD MET K 3 25.067 -0.236 19.822 1.00 0.00 S \n+ATOM 544 CE MET K 3 24.298 -1.795 20.352 1.00 0.00 C \n+ATOM 545 HE1 MET K 3 24.634 -2.078 21.372 1.00 0.00 H \n+ATOM 546 HE2 MET K 3 23.189 -1.715 20.367 1.00 0.00 H \n+ATOM 547 HE3 MET K 3 24.563 -2.623 19.661 1.00 0.00 H \n+ATOM 548 C MET K 3 21.044 -0.412 18.388 1.00 0.00 C \n+ATOM 549 O MET K 3 20.503 -0.301 17.256 1.00 0.00 O \n+ATOM 550 OXT MET K 3 20.873 -1.446 19.088 1.00 0.00 O \n+TER 551 MET K 3\n+ATOM 552 N ASN L 1 7.847 4.956 41.433 1.00 0.00 N \n+ATOM 553 H ASN L 1 7.752 3.918 41.520 1.00 0.00 H \n+ATOM 554 H2 ASN L 1 7.790 5.443 42.345 1.00 0.00 H \n+ATOM 555 H3 ASN L 1 7.082 5.358 40.810 1.00 0.00 H \n+ATOM 556 CA ASN L 1 9.107 5.283 40.699 1.00 0.00 C \n+ATOM 557 HA ASN L 1 8.948 6.260 40.262 1.00 0.00 H \n+ATOM 558 CB ASN L 1 9.349 4.263 39.540 1.00 0.00 C \n+ATOM 559 HB3 ASN L 1 8.468 4.274 38.861 1.00 0.00 H \n+ATOM 560 HB2 ASN L 1 10.236 4.551 38.941 1.00 0.00 H \n+ATOM 561 CG ASN L 1 9.502 2.838 40.075 1.00 0.00 C \n+ATOM 562 OD1 ASN L 1 8.613 2.375 40.793 1.00 0.00 O \n+ATOM 563 ND2 ASN L 1 10.628 2.161 39.783 1.00 0.00 N \n+ATOM 564 HD21 ASN L 1 11.408 2.644 39.370 1.00 0.00 H \n+ATOM 565 HD22 ASN L 1 10.715 1.232 40.133 1.00 0.00 H \n+ATOM 566 C ASN L 1 10.334 5.435 41.567 1.00 0.00 C \n+ATOM 567 O ASN L 1 10.418 4.913 42.673 1.00 0.00 O \n+ATOM 568 N ASN L 2 11.322 6.180 41.055 1.00 0.00 N \n+ATOM 569 H ASN L 2 11.204 6.709 40.214 1.00 0.00 H \n+ATOM 570 CA ASN L 2 12.639 6.305 41.621 1.00 0.00 C \n+ATOM 571 HA ASN L 2 12.565 6.413 42.696 1.00 0.00 H \n+ATOM 572 CB ASN L 2 13.555 5.105 41.226 1.00 0.00 C \n+ATOM 573 HB3 ASN L 2 13.178 4.198 41.747 1.00 0.00 H \n+ATOM 574 HB2 ASN L 2 14.603 5.268 41.547 1.00 0.00 H \n+ATOM 575 CG ASN L 2 13.515 4.794 39.726 1.00 0.00 C \n+ATOM 576 OD1 ASN L 2 12.796 3.892 39.293 1.00 0.00 O \n+ATOM 577 ND2 ASN L 2 14.299 5.518 38.898 1.00 0.00 N \n+ATOM 578 HD21 ASN L 2 14.291 5.263 37.936 1.00 0.00 H \n+ATOM 579 HD22 ASN L 2 14.810 6.323 39.218 1.00 0.00 H \n+ATOM 580 C ASN L 2 13.160 7.603 41.050 1.00 0.00 C \n+ATOM 581 O ASN L 2 12.565 8.128 40.108 1.00 0.00 O \n+ATOM 582 N ASN L 3 14.275 8.134 41.581 1.00 0.00 N \n+ATOM 583 H ASN L 3 14.743 7.701 42.345 1.00 0.00 H \n+ATOM 584 CA ASN L 3 14.915 9.321 41.045 1.00 0.00 C \n+ATOM 585 HA ASN L 3 14.204 10.131 41.146 1.00 0.00 H \n+ATOM 586 CB ASN L 3 16.183 9.705 41.857 1.00 0.00 C \n+ATOM 587 HB3 ASN L 3 15.866 10.051 42.865 1.00 0.00 H \n+ATOM 588 HB2 ASN L 3 16.727 10.537 41.366 1.00 0.00 H \n+ATOM 589 CG ASN L 3 17.152 8.544 42.083 1.00 0.00 C \n+ATOM 590 OD1 ASN L 3 17.568 8.298 43.215 1.00 0.00 O \n+ATOM 591 ND2 ASN L 3 17.486 7.778 41.024 1.00 0.00 N \n+ATOM 592 HD21 ASN L 3 16.988 7.916 40.158 1.00 0.00 H \n+ATOM 593 HD22 ASN L 3 18.138 7.042 41.169 1.00 0.00 H \n+ATOM 594 C ASN L 3 15.238 9.231 39.526 1.00 0.00 C \n+ATOM 595 O ASN L 3 15.546 8.117 39.024 1.00 0.00 O \n+ATOM 596 OXT ASN L 3 15.126 10.274 38.834 1.00 0.00 O \n+TER 597 ASN L 3\n+ATOM 598 N PRO M 1 16.443 18.010 -0.787 1.00 0.00 N \n+ATOM 599 H PRO M 1 16.806 17.313 -0.155 1.00 0.00 H \n+ATOM 600 H2 PRO M 1 17.265 18.339 -1.302 1.00 0.00 H \n+ATOM 601 CD PRO M 1 15.365 17.450 -1.667 1.00 0.00 C \n+ATOM 602 HD3 PRO M 1 15.566 17.709 -2.729 1.00 0.00 H \n+ATOM 603 HD2 PRO M 1 15.333 16.345 -1.553 1.00 0.00 H \n+ATOM 604 CA PRO M 1 15.890 19.118 0.036 1.00 0.00 C \n+ATOM 605 HA PRO M 1 16.041 20.004 -0.560 1.00 0.00 H \n+ATOM 606 CB PRO M 1 14.431 18.687 0.222 1.00 0.00 C \n+ATOM 607 HB3 PRO M 1 13.780 19.541 0.504 1.00 0.00 H \n+ATOM 608 HB2 PRO M 1 14.344 17.895 1.001 1.00 0.00 H \n+ATOM 609 CG PRO M 1 14.068 18.108 -1.157 1.00 0.00 C \n+ATOM 610 HG3 PRO M 1 13.226 17.388 -1.101 1.00 0.00 H \n+ATOM 611 HG2 PRO M 1 13.786 18.937 -1.845 1.00 0.00 H \n+ATOM 612 C PRO M 1 16.771 19.126 1.260 1.00 0.00 C \n+ATOM 613 O PRO M 1 16.978 18.025 1.770 1.00 0.00 O \n+ATOM 614 N PRO M 2 17.313 20.229 1.759 1.00 0.00 N \n+ATOM 615 CD PRO M 2 16.932 21.594 1.384 1.00 0.00 C \n+ATOM 616 HD3 PRO M 2 15.873 21.779 1.669 1.00 0.00 H \n+ATOM 617 HD2 PRO M 2 17.078 21.756 0.291 1.00 0.00 H \n+ATOM 618 CA PRO M 2 18.494 20.192 2.607 1.00 0.00 C \n+ATOM 619 HA PRO M 2 18.378 19.426 3.361 1.00 0.00 H \n+ATOM 620 CB PRO M 2 18.509 21.599 3.231 1.00 0.00 C \n+ATOM 621 HB3 PRO M 2 17.853 21.587 4.130 1.00 0.00 H \n+ATOM 622 HB2 PRO M 2 19.522 21.929 3.539 1.00 0.00 H \n+ATOM 623 CG PRO M 2 17.876 22.515 2.171 1.00 0.00 C \n+ATOM 624 HG3 PRO M 2 17.346 23.377 2.624 1.00 0.00 H \n+ATOM 625 HG2 PRO M 2 18.661 22.896 1.483 1.00 0.00 H \n+ATOM 626 C PRO M 2 19.776 19.834 1.843 1.00 0.00 C \n+ATOM 627 O PRO M 2 20.474 18.947 2.335 1.00 0.00 O \n+ATOM 628 N PRO M 3 20.162 20.468 0.738 1.00 0.00 N \n+ATOM 629 CD PRO M 3 21.256 21.447 0.891 1.00 0.00 C \n+ATOM 630 HD3 PRO M 3 21.805 21.344 1.857 1.00 0.00 H \n+ATOM 631 HD2 PRO M 3 20.811 22.463 0.826 1.00 0.00 H \n+ATOM 632 CA PRO M 3 20.418 19.674 -0.468 1.00 0.00 C \n+ATOM 633 HA PRO M 3 20.958 18.773 -0.208 1.00 0.00 H \n+ATOM 634 CB PRO M 3 21.281 20.600 -1.328 1.00 0.00 C \n+ATOM 635 HB3 PRO M 3 20.646 21.384 -1.797 1.00 0.00 H \n+ATOM 636 HB2 PRO M 3 21.823 20.040 -2.117 1.00 0.00 H \n+ATOM 637 CG PRO M 3 22.205 21.226 -0.291 1.00 0.00 C \n+ATOM 638 HG3 PRO M 3 22.991 20.492 -0.002 1.00 0.00 H \n+ATOM 639 HG2 PRO M 3 22.680 22.163 -0.644 1.00 0.00 H \n+ATOM 640 C PRO M 3 19.155 19.269 -1.197 1.00 0.00 C \n+ATOM 641 O PRO M 3 18.999 18.062 -1.530 1.00 0.00 O \n+ATOM 642 OXT PRO M 3 18.262 20.129 -1.432 1.00 0.00 O \n+TER 643 PRO M 3\n+ATOM 644 N GLN N 1 18.466 18.527 19.326 1.00 0.00 N \n+ATOM 645 H GLN N 1 19.264 18.517 20.025 1.00 0.00 H \n+ATOM 646 H2 GLN N 1 18.339 19.517 19.000 1.00 0.00 H \n+ATOM 647 H3 GLN N 1 18.716 17.897 18.529 1.00 0.00 H \n+ATOM 648 CA GLN N 1 17.233 18.013 20.018 1.00 0.00 C \n+ATOM 649 HA GLN N 1 16.461 17.911 19.268 1.00 0.00 H \n+ATOM 650 CB GLN N 1 17.491 16.620 20.684 1.00 0.00 C \n+ATOM 651 HB3 GLN N 1 16.645 16.411 21.382 1.00 0.00 H \n+ATOM 652 HB2 GLN N 1 18.410 16.649 21.309 1.00 0.00 H \n+ATOM 653 CG GLN N 1 17.545 15.398 19.723 1.00 0.00 C \n+ATOM 654 HG3 GLN N 1 16.605 15.348 19.133 1.00 0.00 H \n+ATOM 655 HG2 GLN N 1 17.620 14.463 20.318 1.00 0.00 H \n+ATOM 656 CD GLN N 1 18.706 15.475 18.726 1.00 0.00 C \n+ATOM 657 OE1 GLN N 1 18.686 16.298 17.808 1.00 0.00 O \n+ATOM 658 NE2 GLN N 1 19.755 14.648 18.917 1.00 0.00 N \n+ATOM 659 HE21 GLN N 1 19.790 14.063 19.721 1.00 0.00 H \n+ATOM 660 HE22 GLN N 1 20.514 14.714 18.275 1.00 0.00 H \n+ATOM 661 C GLN N 1 16.689 19.007 21.030 1.00 0.00 C \n+ATOM 662 O GLN N 1 15.484 19.171 21.189 1.00 0.00 O \n+ATOM 663 N GLN N 2 17.610 19.742 21.668 1.00 0.00 N \n+ATOM 664 H GLN N 2 18.572 19.430 21.632 1.00 0.00 H \n+ATOM 665 CA GLN N 2 17.408 20.906 22.497 1.00 0.00 C \n+ATOM 666 HA GLN N 2 16.592 20.732 23.186 1.00 0.00 H \n+ATOM 667 CB GLN N 2 17.251 22.238 21.687 1.00 0.00 C \n+ATOM 668 HB3 GLN N 2 18.183 22.479 21.129 1.00 0.00 H \n+ATOM 669 HB2 GLN N 2 17.104 23.047 22.440 1.00 0.00 H \n+ATOM 670 CG GLN N 2 16.064 22.320 20.683 1.00 0.00 C \n+ATOM 671 HG3 GLN N 2 15.831 23.395 20.520 1.00 0.00 H \n+ATOM 672 HG2 GLN N 2 15.172 21.836 21.133 1.00 0.00 H \n+ATOM 673 CD GLN N 2 16.320 21.702 19.298 1.00 0.00 C \n+ATOM 674 OE1 GLN N 2 17.348 21.100 18.981 1.00 0.00 O \n+ATOM 675 NE2 GLN N 2 15.311 21.848 18.406 1.00 0.00 N \n+ATOM 676 HE21 GLN N 2 15.455 21.489 17.489 1.00 0.00 H \n+ATOM 677 HE22 GLN N 2 14.468 22.302 18.679 1.00 0.00 H \n+ATOM 678 C GLN N 2 18.711 20.935 23.268 1.00 0.00 C \n+ATOM 679 O GLN N 2 18.758 20.907 24.494 1.00 0.00 O \n+ATOM 680 N GLN N 3 19.801 20.880 22.480 1.00 0.00 N \n+ATOM 681 H GLN N 3 19.711 21.045 21.504 1.00 0.00 H \n+ATOM 682 CA GLN N 3 21.032 20.204 22.804 1.00 0.00 C \n+ATOM 683 HA GLN N 3 21.112 20.071 23.875 1.00 0.00 H \n+ATOM 684 CB GLN N 3 22.241 21.028 22.277 1.00 0.00 C \n+ATOM 685 HB3 GLN N 3 22.343 21.925 22.926 1.00 0.00 H \n+ATOM 686 HB2 GLN N 3 23.158 20.414 22.423 1.00 0.00 H \n+ATOM 687 CG GLN N 3 22.179 21.513 20.797 1.00 0.00 C \n+ATOM 688 HG3 GLN N 3 21.447 22.346 20.727 1.00 0.00 H \n+ATOM 689 HG2 GLN N 3 23.168 21.914 20.494 1.00 0.00 H \n+ATOM 690 CD GLN N 3 21.737 20.468 19.765 1.00 0.00 C \n+ATOM 691 OE1 GLN N 3 20.656 20.556 19.176 1.00 0.00 O \n+ATOM 692 NE2 GLN N 3 22.583 19.439 19.544 1.00 0.00 N \n+ATOM 693 HE21 GLN N 3 22.276 18.738 18.913 1.00 0.00 H \n+ATOM 694 HE22 GLN N 3 23.211 19.201 20.282 1.00 0.00 H \n+ATOM 695 C GLN N 3 21.015 18.784 22.170 1.00 0.00 C \n+ATOM 696 O GLN N 3 22.007 18.036 22.349 1.00 0.00 O \n+ATOM 697 OXT GLN N 3 20.034 18.455 21.442 1.00 0.00 O \n+TER 698 GLN N 3\n+ATOM 699 N ARG O 1 13.197 12.006 38.356 1.00 0.00 N \n+ATOM 700 H ARG O 1 12.999 12.620 39.174 1.00 0.00 H \n+ATOM 701 H2 ARG O 1 12.269 11.679 37.986 1.00 0.00 H \n+ATOM 702 H3 ARG O 1 13.750 11.172 38.695 1.00 0.00 H \n+ATOM 703 CA ARG O 1 14.066 12.739 37.389 1.00 0.00 C \n+ATOM 704 HA ARG O 1 14.926 12.115 37.195 1.00 0.00 H \n+ATOM 705 CB ARG O 1 13.334 13.054 36.042 1.00 0.00 C \n+ATOM 706 HB3 ARG O 1 12.240 12.946 36.174 1.00 0.00 H \n+ATOM 707 HB2 ARG O 1 13.455 14.125 35.764 1.00 0.00 H \n+ATOM 708 CG ARG O 1 13.771 12.232 34.793 1.00 0.00 C \n+ATOM 709 HG3 ARG O 1 14.700 12.686 34.379 1.00 0.00 H \n+ATOM 710 HG2 ARG O 1 12.982 12.358 34.015 1.00 0.00 H \n+ATOM 711 CD ARG O 1 14.046 10.720 34.943 1.00 0.00 C \n+ATOM 712 HD3 ARG O 1 15.007 10.578 35.490 1.00 0.00 H \n+ATOM 713 HD2 ARG O 1 14.129 10.241 33.939 1.00 0.00 H \n+ATOM 714 NE ARG O 1 12.915 10.079 35.682 1.00 0.00 N \n+ATOM 715 HE ARG O 1 12.017 10.557 35.770 1.00 0.00 H \n+ATOM 716 CZ ARG O 1 13.066 9.114 36.583 1.00 0.00 C \n+ATOM 717 NH1 ARG O 1 14.162 8.397 36.660 1.00 0.00 N \n+ATOM 718 HH11 ARG O 1 14.506 8.224 37.601 1.00 0.00 H \n+ATOM 719 HH12 ARG O 1 14.856 8.580 35.990 1.00 0.00 H \n+ATOM 720 NH2 ARG O 1 12.139 8.971 37.503 1.00 0.00 N \n+ATOM 721 HH21 ARG O 1 11.387 9.654 37.539 1.00 0.00 H \n+ATOM 722 HH22 ARG O 1 12.371 8.514 38.365 1.00 0.00 H \n+ATOM 723 C ARG O 1 14.603 13.965 38.096 1.00 0.00 C \n+ATOM 724 O ARG O 1 14.263 14.199 39.254 1.00 0.00 O \n+ATOM 725 N ARG O 2 15.461 14.778 37.450 1.00 0.00 N \n+ATOM 726 H ARG O 2 15.751 14.601 36.516 1.00 0.00 H \n+ATOM 727 CA ARG O 2 16.075 15.905 38.126 1.00 0.00 C \n+ATOM 728 HA ARG O 2 15.897 15.832 39.190 1.00 0.00 H \n+ATOM 729 CB ARG O 2 15.435 17.234 37.641 1.00 0.00 C \n+ATOM 730 HB3 ARG O 2 14.339 17.125 37.831 1.00 0.00 H \n+ATOM 731 HB2 ARG O 2 15.550 17.327 36.539 1.00 0.00 H \n+ATOM 732 CG ARG O 2 15.885 18.555 38.317 1.00 0.00 C \n+ATOM 733 HG3 ARG O 2 16.845 18.909 37.881 1.00 0.00 H \n+ATOM 734 HG2 ARG O 2 15.126 19.321 38.033 1.00 0.00 H \n+ATOM 735 CD ARG O 2 15.962 18.549 39.857 1.00 0.00 C \n+ATOM 736 HD3 ARG O 2 15.799 19.581 40.245 1.00 0.00 H \n+ATOM 737 HD2 ARG O 2 15.188 17.874 40.284 1.00 0.00 H \n+ATOM 738 NE ARG O 2 17.352 18.142 40.239 1.00 0.00 N \n+ATOM 739 HE ARG O 2 18.121 18.477 39.652 1.00 0.00 H \n+ATOM 740 CZ ARG O 2 17.710 17.239 41.140 1.00 0.00 C \n+ATOM 741 NH1 ARG O 2 18.979 16.895 41.217 1.00 0.00 N \n+ATOM 742 HH11 ARG O 2 19.219 16.040 41.645 1.00 0.00 H \n+ATOM 743 HH12 ARG O 2 19.597 17.229 40.480 1.00 0.00 H \n+ATOM 744 NH2 ARG O 2 16.853 16.641 41.937 1.00 0.00 N \n+ATOM 745 HH21 ARG O 2 17.194 15.995 42.604 1.00 0.00 H \n+ATOM 746 HH22 ARG O 2 15.902 16.906 41.882 1.00 0.00 H \n+ATOM 747 C ARG O 2 17.587 15.823 38.011 1.00 0.00 C \n+ATOM 748 O ARG O 2 18.215 15.038 38.716 1.00 0.00 O \n+ATOM 749 N ARG O 3 18.214 16.634 37.141 1.00 0.00 N \n+ATOM 750 H ARG O 3 17.706 17.270 36.575 1.00 0.00 H \n+ATOM 751 CA ARG O 3 19.645 16.855 37.195 1.00 0.00 C \n+ATOM 752 HA ARG O 3 20.148 15.913 37.375 1.00 0.00 H \n+ATOM 753 CB ARG O 3 20.175 17.462 35.869 1.00 0.00 C \n+ATOM 754 HB3 ARG O 3 19.994 16.703 35.074 1.00 0.00 H \n+ATOM 755 HB2 ARG O 3 19.587 18.369 35.610 1.00 0.00 H \n+ATOM 756 CG ARG O 3 21.683 17.807 35.891 1.00 0.00 C \n+ATOM 757 HG3 ARG O 3 22.192 17.060 36.541 1.00 0.00 H \n+ATOM 758 HG2 ARG O 3 22.095 17.687 34.863 1.00 0.00 H \n+ATOM 759 CD ARG O 3 21.990 19.241 36.358 1.00 0.00 C \n+ATOM 760 HD3 ARG O 3 21.415 19.551 37.256 1.00 0.00 H \n+ATOM 761 HD2 ARG O 3 21.731 19.961 35.548 1.00 0.00 H \n+ATOM 762 NE ARG O 3 23.460 19.333 36.637 1.00 0.00 N \n+ATOM 763 HE ARG O 3 24.066 19.646 35.918 1.00 0.00 H \n+ATOM 764 CZ ARG O 3 24.005 19.057 37.817 1.00 0.00 C \n+ATOM 765 NH1 ARG O 3 23.334 18.606 38.853 1.00 0.00 N \n+ATOM 766 HH11 ARG O 3 23.785 18.372 39.697 1.00 0.00 H \n+ATOM 767 HH12 ARG O 3 22.354 18.342 38.769 1.00 0.00 H \n+ATOM 768 NH2 ARG O 3 25.305 19.237 37.968 1.00 0.00 N \n+ATOM 769 HH21 ARG O 3 25.711 19.044 38.850 1.00 0.00 H \n+ATOM 770 HH22 ARG O 3 25.839 19.587 37.212 1.00 0.00 H \n+ATOM 771 C ARG O 3 19.976 17.794 38.376 1.00 0.00 C \n+ATOM 772 O ARG O 3 20.857 17.451 39.206 1.00 0.00 O \n+ATOM 773 OXT ARG O 3 19.345 18.874 38.494 1.00 0.00 O \n+TER 774 ARG O 3\n+ATOM 775 N SER P 1 16.142 36.560 -0.044 1.00 0.00 N \n+ATOM 776 H SER P 1 17.054 36.321 -0.509 1.00 0.00 H \n+ATOM 777 H2 SER P 1 15.443 35.811 -0.187 1.00 0.00 H \n+ATOM 778 H3 SER P 1 15.803 37.471 -0.447 1.00 0.00 H \n+ATOM 779 CA SER P 1 16.527 36.734 1.407 1.00 0.00 C \n+ATOM 780 HA SER P 1 16.132 35.879 1.938 1.00 0.00 H \n+ATOM 781 CB SER P 1 18.085 36.716 1.613 1.00 0.00 C \n+ATOM 782 HB3 SER P 1 18.431 37.573 2.235 1.00 0.00 H \n+ATOM 783 HB2 SER P 1 18.366 35.796 2.174 1.00 0.00 H \n+ATOM 784 OG SER P 1 18.801 36.713 0.372 1.00 0.00 O \n+ATOM 785 HG SER P 1 19.678 37.154 0.562 1.00 0.00 H \n+ATOM 786 C SER P 1 15.882 37.936 2.062 1.00 0.00 C \n+ATOM 787 O SER P 1 15.115 37.771 2.998 1.00 0.00 O \n+ATOM 788 N SER P 2 16.109 39.183 1.608 1.00 0.00 N \n+ATOM 789 H SER P 2 15.708 39.926 2.143 1.00 0.00 H \n+ATOM 790 CA SER P 2 16.919 39.600 0.469 1.00 0.00 C \n+ATOM 791 HA SER P 2 17.502 38.774 0.106 1.00 0.00 H \n+ATOM 792 CB SER P 2 16.091 40.108 -0.728 1.00 0.00 C \n+ATOM 793 HB3 SER P 2 16.759 40.530 -1.515 1.00 0.00 H \n+ATOM 794 HB2 SER P 2 15.397 40.912 -0.385 1.00 0.00 H \n+ATOM 795 OG SER P 2 15.351 39.012 -1.280 1.00 0.00 O \n+ATOM 796 HG SER P 2 14.778 39.396 -1.962 1.00 0.00 H \n+ATOM 797 C SER P 2 17.943 40.605 0.912 1.00 0.00 C \n+ATOM 798 O SER P 2 17.650 41.508 1.689 1.00 0.00 O \n+ATOM 799 N SER P 3 19.189 40.376 0.478 1.00 0.00 N \n+ATOM 800 H SER P 3 19.402 39.729 -0.246 1.00 0.00 H \n+ATOM 801 CA SER P 3 20.338 40.525 1.342 1.00 0.00 C \n+ATOM 802 HA SER P 3 20.089 41.076 2.239 1.00 0.00 H \n+ATOM 803 CB SER P 3 21.578 41.137 0.646 1.00 0.00 C \n+ATOM 804 HB3 SER P 3 21.874 40.500 -0.218 1.00 0.00 H \n+ATOM 805 HB2 SER P 3 22.432 41.165 1.360 1.00 0.00 H \n+ATOM 806 OG SER P 3 21.299 42.454 0.168 1.00 0.00 O \n+ATOM 807 HG SER P 3 20.965 42.951 0.921 1.00 0.00 H \n+ATOM 808 C SER P 3 20.660 39.070 1.731 1.00 0.00 C \n+ATOM 809 O SER P 3 20.856 38.244 0.796 1.00 0.00 O \n+ATOM 810 OXT SER P 3 20.605 38.740 2.940 1.00 0.00 O \n+TER 811 SER P 3\n+ATOM 812 N THR Q 1 17.644 38.466 15.943 1.00 0.00 N \n+ATOM 813 H THR Q 1 17.185 37.531 15.984 1.00 0.00 H \n+ATOM 814 H2 THR Q 1 17.027 39.119 16.497 1.00 0.00 H \n+ATOM 815 H3 THR Q 1 17.742 38.794 14.966 1.00 0.00 H \n+ATOM 816 CA THR Q 1 18.966 38.371 16.665 1.00 0.00 C \n+ATOM 817 HA THR Q 1 19.435 39.345 16.649 1.00 0.00 H \n+ATOM 818 CB THR Q 1 19.915 37.303 16.120 1.00 0.00 C \n+ATOM 819 HB THR Q 1 19.590 36.271 16.402 1.00 0.00 H \n+ATOM 820 OG1 THR Q 1 21.217 37.555 16.625 1.00 0.00 O \n+ATOM 821 HG1 THR Q 1 21.766 36.787 16.419 1.00 0.00 H \n+ATOM 822 CG2 THR Q 1 20.026 37.393 14.589 1.00 0.00 C \n+ATOM 823 HG21 THR Q 1 20.344 38.410 14.273 1.00 0.00 H \n+ATOM 824 HG22 THR Q 1 19.072 37.134 14.087 1.00 0.00 H \n+ATOM 825 HG23 THR Q 1 20.792 36.676 14.220 1.00 0.00 H \n+ATOM 826 C THR Q 1 18.561 38.043 18.063 1.00 0.00 C \n+ATOM 827 O THR Q 1 17.822 37.082 18.234 1.00 0.00 O \n+ATOM 828 N THR Q 2 18.878 38.937 19.017 1.00 0.00 N \n+ATOM 829 H THR Q 2 19.783 39.354 19.072 1.00 0.00 H \n+ATOM 830 CA THR Q 2 17.877 39.593 19.866 1.00 0.00 C \n+ATOM 831 HA THR Q 2 18.432 40.298 20.459 1.00 0.00 H \n+ATOM 832 CB THR Q 2 16.845 40.444 19.103 1.00 0.00 C \n+ATOM 833 HB THR Q 2 16.098 40.880 19.812 1.00 0.00 H \n+ATOM 834 OG1 THR Q 2 16.156 39.691 18.103 1.00 0.00 O \n+ATOM 835 HG1 THR Q 2 15.728 38.993 18.638 1.00 0.00 H \n+ATOM 836 CG2 THR Q 2 17.557 41.612 18.403 1.00 0.00 C \n+ATOM 837 HG21 THR Q 2 18.300 41.257 17.663 1.00 0.00 H \n+ATOM 838 HG22 THR Q 2 18.080 42.245 19.153 1.00 0.00 H \n+ATOM 839 HG23 THR Q 2 16.812 42.249 17.878 1.00 0.00 H \n+ATOM 840 C THR Q 2 17.121 38.706 20.843 1.00 0.00 C \n+ATOM 841 O THR Q 2 16.185 38.018 20.440 1.00 0.00 O \n+ATOM 842 N THR Q 3 17.428 38.738 22.146 1.00 0.00 N \n+ATOM 843 H THR Q 3 16.894 38.211 22.811 1.00 0.00 H \n+ATOM 844 CA THR Q 3 18.369 39.601 22.846 1.00 0.00 C \n+ATOM 845 HA THR Q 3 18.284 40.611 22.480 1.00 0.00 H \n+ATOM 846 CB THR Q 3 19.839 39.162 22.864 1.00 0.00 C \n+ATOM 847 HB THR Q 3 20.393 39.779 23.613 1.00 0.00 H \n+ATOM 848 OG1 THR Q 3 20.478 39.343 21.603 1.00 0.00 O \n+ATOM 849 HG1 THR Q 3 21.401 39.150 21.790 1.00 0.00 H \n+ATOM 850 CG2 THR Q 3 19.970 37.677 23.236 1.00 0.00 C \n+ATOM 851 HG21 THR Q 3 19.479 37.487 24.216 1.00 0.00 H \n+ATOM 852 HG22 THR Q 3 19.480 37.037 22.473 1.00 0.00 H \n+ATOM 853 HG23 THR Q 3 21.035 37.382 23.319 1.00 0.00 H \n+ATOM 854 C THR Q 3 17.893 39.656 24.308 1.00 0.00 C \n+ATOM 855 O THR Q 3 18.436 40.504 25.062 1.00 0.00 O \n+ATOM 856 OXT THR Q 3 16.993 38.853 24.679 1.00 0.00 O \n+TER 857 THR Q 3\n+ATOM 858 N VAL R 1 18.906 36.782 39.918 1.00 0.00 N \n+ATOM 859 H VAL R 1 19.584 36.310 39.283 1.00 0.00 H \n+ATOM 860 H2 VAL R 1 19.537 37.078 40.724 1.00 0.00 H \n+ATOM 861 H3 VAL R 1 18.152 36.157 40.238 1.00 0.00 H \n+ATOM 862 CA VAL R 1 18.424 38.028 39.255 1.00 0.00 C \n+ATOM 863 HA VAL R 1 19.297 38.623 39.083 1.00 0.00 H \n+ATOM 864 CB VAL R 1 17.890 37.721 37.843 1.00 0.00 C \n+ATOM 865 HB VAL R 1 18.756 37.372 37.227 1.00 0.00 H \n+ATOM 866 CG1 VAL R 1 16.827 36.598 37.820 1.00 0.00 C \n+ATOM 867 HG11 VAL R 1 17.226 35.633 38.192 1.00 0.00 H \n+ATOM 868 HG12 VAL R 1 16.487 36.436 36.773 1.00 0.00 H \n+ATOM 869 HG13 VAL R 1 15.934 36.878 38.418 1.00 0.00 H \n+ATOM 870 CG2 VAL R 1 17.357 39.005 37.170 1.00 0.00 C \n+ATOM 871 HG21 VAL R 1 17.107 38.802 36.106 1.00 0.00 H \n+ATOM 872 HG22 VAL R 1 16.435 39.374 37.667 1.00 0.00 H \n+ATOM 873 HG23 VAL R 1 18.121 39.813 37.193 1.00 0.00 H \n+ATOM 874 C VAL R 1 17.460 38.838 40.124 1.00 0.00 C \n+ATOM 875 O VAL R 1 16.298 38.474 40.266 1.00 0.00 O \n+ATOM 876 N VAL R 2 17.844 39.940 40.810 1.00 0.00 N \n+ATOM 877 H VAL R 2 17.097 40.407 41.272 1.00 0.00 H \n+ATOM 878 CA VAL R 2 19.158 40.532 41.066 1.00 0.00 C \n+ATOM 879 HA VAL R 2 19.677 39.816 41.677 1.00 0.00 H \n+ATOM 880 CB VAL R 2 19.006 41.778 41.951 1.00 0.00 C \n+ATOM 881 HB VAL R 2 18.433 41.470 42.859 1.00 0.00 H \n+ATOM 882 CG1 VAL R 2 18.198 42.886 41.242 1.00 0.00 C \n+ATOM 883 HG11 VAL R 2 17.202 42.525 40.916 1.00 0.00 H \n+ATOM 884 HG12 VAL R 2 18.742 43.261 40.349 1.00 0.00 H \n+ATOM 885 HG13 VAL R 2 18.047 43.745 41.930 1.00 0.00 H \n+ATOM 886 CG2 VAL R 2 20.372 42.312 42.432 1.00 0.00 C \n+ATOM 887 HG21 VAL R 2 20.939 41.522 42.968 1.00 0.00 H \n+ATOM 888 HG22 VAL R 2 20.221 43.162 43.131 1.00 0.00 H \n+ATOM 889 HG23 VAL R 2 20.984 42.680 41.581 1.00 0.00 H \n+ATOM 890 C VAL R 2 20.027 40.818 39.833 1.00 0.00 C \n+ATOM 891 O VAL R 2 19.558 41.351 38.832 1.00 0.00 O \n+ATOM 892 N VAL R 3 21.321 40.441 39.813 1.00 0.00 N \n+ATOM 893 H VAL R 3 21.847 40.669 39.002 1.00 0.00 H \n+ATOM 894 CA VAL R 3 22.000 39.551 40.745 1.00 0.00 C \n+ATOM 895 HA VAL R 3 21.785 39.886 41.748 1.00 0.00 H \n+ATOM 896 CB VAL R 3 23.524 39.588 40.609 1.00 0.00 C \n+ATOM 897 HB VAL R 3 23.960 38.800 41.268 1.00 0.00 H \n+ATOM 898 CG1 VAL R 3 23.993 39.329 39.161 1.00 0.00 C \n+ATOM 899 HG11 VAL R 3 25.103 39.332 39.118 1.00 0.00 H \n+ATOM 900 HG12 VAL R 3 23.621 40.109 38.467 1.00 0.00 H \n+ATOM 901 HG13 VAL R 3 23.641 38.339 38.803 1.00 0.00 H \n+ATOM 902 CG2 VAL R 3 24.028 40.960 41.104 1.00 0.00 C \n+ATOM 903 HG21 VAL R 3 25.137 40.996 41.060 1.00 0.00 H \n+ATOM 904 HG22 VAL R 3 23.627 41.779 40.471 1.00 0.00 H \n+ATOM 905 HG23 VAL R 3 23.713 41.136 42.154 1.00 0.00 H \n+ATOM 906 C VAL R 3 21.426 38.114 40.639 1.00 0.00 C \n+ATOM 907 O VAL R 3 21.504 37.461 39.566 1.00 0.00 O \n+ATOM 908 OXT VAL R 3 20.734 37.688 41.608 1.00 0.00 O \n+TER 909 VAL R 3\n+ATOM 910 N TRP S 1 37.595 -0.878 1.056 1.00 0.00 N \n+ATOM 911 H TRP S 1 38.279 -0.206 1.506 1.00 0.00 H \n+ATOM 912 H2 TRP S 1 36.659 -0.666 1.436 1.00 0.00 H \n+ATOM 913 H3 TRP S 1 37.939 -1.785 1.437 1.00 0.00 H \n+ATOM 914 CA TRP S 1 37.660 -0.895 -0.435 1.00 0.00 C \n+ATOM 915 HA TRP S 1 36.795 -1.481 -0.717 1.00 0.00 H \n+ATOM 916 CB TRP S 1 38.887 -1.720 -0.938 1.00 0.00 C \n+ATOM 917 HB3 TRP S 1 39.282 -1.273 -1.878 1.00 0.00 H \n+ATOM 918 HB2 TRP S 1 39.722 -1.659 -0.208 1.00 0.00 H \n+ATOM 919 CG TRP S 1 38.595 -3.162 -1.224 1.00 0.00 C \n+ATOM 920 CD1 TRP S 1 38.247 -3.661 -2.453 1.00 0.00 C \n+ATOM 921 HD1 TRP S 1 38.186 -3.063 -3.357 1.00 0.00 H \n+ATOM 922 NE1 TRP S 1 38.000 -5.009 -2.349 1.00 0.00 N \n+ATOM 923 HE1 TRP S 1 37.752 -5.626 -3.065 1.00 0.00 H \n+ATOM 924 CE2 TRP S 1 38.189 -5.411 -1.061 1.00 0.00 C \n+ATOM 925 CD2 TRP S 1 38.572 -4.274 -0.310 1.00 0.00 C \n+ATOM 926 CE3 TRP S 1 38.842 -4.413 1.053 1.00 0.00 C \n+ATOM 927 HE3 TRP S 1 39.178 -3.582 1.654 1.00 0.00 H \n+ATOM 928 CZ3 TRP S 1 38.714 -5.677 1.636 1.00 0.00 C \n+ATOM 929 HZ3 TRP S 1 38.928 -5.800 2.690 1.00 0.00 H \n+ATOM 930 CZ2 TRP S 1 38.056 -6.662 -0.482 1.00 0.00 C \n+ATOM 931 HZ2 TRP S 1 37.760 -7.524 -1.059 1.00 0.00 H \n+ATOM 932 CH2 TRP S 1 38.324 -6.781 0.884 1.00 0.00 C \n+ATOM 933 HH2 TRP S 1 38.236 -7.747 1.365 1.00 0.00 H \n+ATOM 934 C TRP S 1 37.408 0.389 -1.238 1.00 0.00 C \n+ATOM 935 O TRP S 1 36.586 0.346 -2.145 1.00 0.00 O \n+ATOM 936 N TRP S 2 37.993 1.587 -1.009 1.00 0.00 N \n+ATOM 937 H TRP S 2 37.683 2.295 -1.638 1.00 0.00 H \n+ATOM 938 CA TRP S 2 38.961 2.069 -0.034 1.00 0.00 C \n+ATOM 939 HA TRP S 2 38.504 1.918 0.930 1.00 0.00 H \n+ATOM 940 CB TRP S 2 39.184 3.597 -0.197 1.00 0.00 C \n+ATOM 941 HB3 TRP S 2 39.865 3.975 0.595 1.00 0.00 H \n+ATOM 942 HB2 TRP S 2 39.675 3.785 -1.178 1.00 0.00 H \n+ATOM 943 CG TRP S 2 37.914 4.385 -0.115 1.00 0.00 C \n+ATOM 944 CD1 TRP S 2 37.349 5.145 -1.108 1.00 0.00 C \n+ATOM 945 HD1 TRP S 2 37.801 5.314 -2.079 1.00 0.00 H \n+ATOM 946 NE1 TRP S 2 36.147 5.651 -0.670 1.00 0.00 N \n+ATOM 947 HE1 TRP S 2 35.531 6.233 -1.156 1.00 0.00 H \n+ATOM 948 CE2 TRP S 2 35.910 5.231 0.606 1.00 0.00 C \n+ATOM 949 CD2 TRP S 2 37.004 4.425 1.001 1.00 0.00 C \n+ATOM 950 CE3 TRP S 2 37.011 3.853 2.276 1.00 0.00 C \n+ATOM 951 HE3 TRP S 2 37.830 3.235 2.620 1.00 0.00 H \n+ATOM 952 CZ3 TRP S 2 35.927 4.097 3.124 1.00 0.00 C \n+ATOM 953 HZ3 TRP S 2 35.919 3.663 4.117 1.00 0.00 H \n+ATOM 954 CZ2 TRP S 2 34.836 5.471 1.447 1.00 0.00 C \n+ATOM 955 HZ2 TRP S 2 34.005 6.086 1.141 1.00 0.00 H \n+ATOM 956 CH2 TRP S 2 34.860 4.892 2.718 1.00 0.00 C \n+ATOM 957 HH2 TRP S 2 34.036 5.064 3.399 1.00 0.00 H \n+ATOM 958 C TRP S 2 40.294 1.339 0.030 1.00 0.00 C \n+ATOM 959 O TRP S 2 40.636 0.581 -0.865 1.00 0.00 O \n+ATOM 960 N TRP S 3 41.025 1.552 1.145 1.00 0.00 N \n+ATOM 961 H TRP S 3 40.920 2.417 1.612 1.00 0.00 H \n+ATOM 962 CA TRP S 3 41.341 0.489 2.096 1.00 0.00 C \n+ATOM 963 HA TRP S 3 41.647 1.019 2.986 1.00 0.00 H \n+ATOM 964 CB TRP S 3 42.562 -0.442 1.776 1.00 0.00 C \n+ATOM 965 HB3 TRP S 3 43.447 0.214 1.635 1.00 0.00 H \n+ATOM 966 HB2 TRP S 3 42.751 -1.041 2.695 1.00 0.00 H \n+ATOM 967 CG TRP S 3 42.502 -1.390 0.614 1.00 0.00 C \n+ATOM 968 CD1 TRP S 3 42.037 -2.678 0.687 1.00 0.00 C \n+ATOM 969 HD1 TRP S 3 41.580 -3.093 1.579 1.00 0.00 H \n+ATOM 970 NE1 TRP S 3 42.176 -3.294 -0.534 1.00 0.00 N \n+ATOM 971 HE1 TRP S 3 41.845 -4.177 -0.786 1.00 0.00 H \n+ATOM 972 CE2 TRP S 3 42.768 -2.433 -1.411 1.00 0.00 C \n+ATOM 973 CD2 TRP S 3 43.008 -1.219 -0.724 1.00 0.00 C \n+ATOM 974 CE3 TRP S 3 43.642 -0.169 -1.393 1.00 0.00 C \n+ATOM 975 HE3 TRP S 3 43.820 0.771 -0.894 1.00 0.00 H \n+ATOM 976 CZ3 TRP S 3 44.007 -0.346 -2.731 1.00 0.00 C \n+ATOM 977 HZ3 TRP S 3 44.488 0.465 -3.263 1.00 0.00 H \n+ATOM 978 CZ2 TRP S 3 43.130 -2.610 -2.737 1.00 0.00 C \n+ATOM 979 HZ2 TRP S 3 42.945 -3.538 -3.251 1.00 0.00 H \n+ATOM 980 CH2 TRP S 3 43.756 -1.545 -3.392 1.00 0.00 C \n+ATOM 981 HH2 TRP S 3 44.052 -1.652 -4.428 1.00 0.00 H \n+ATOM 982 C TRP S 3 40.030 -0.219 2.538 1.00 0.00 C \n+ATOM 983 O TRP S 3 39.038 0.529 2.779 1.00 0.00 O \n+ATOM 984 OXT TRP S 3 39.914 -1.468 2.541 1.00 0.00 O \n+TER 985 TRP S 3\n+ATOM 986 N TYR T 1 39.204 -0.462 17.154 1.00 0.00 N \n+ATOM 987 H TYR T 1 40.021 -1.093 17.284 1.00 0.00 H \n+ATOM 988 H2 TYR T 1 39.527 0.512 17.407 1.00 0.00 H \n+ATOM 989 H3 TYR T 1 38.872 -0.495 16.172 1.00 0.00 H \n+ATOM 990 CA TYR T 1 38.129 -0.871 18.125 1.00 0.00 C \n+ATOM 991 HA TYR T 1 37.275 -0.222 17.986 1.00 0.00 H \n+ATOM 992 CB TYR T 1 37.749 -2.372 17.969 1.00 0.00 C \n+ATOM 993 HB3 TYR T 1 36.979 -2.656 18.720 1.00 0.00 H \n+ATOM 994 HB2 TYR T 1 38.631 -3.032 18.126 1.00 0.00 H \n+ATOM 995 CG TYR T 1 37.162 -2.636 16.607 1.00 0.00 C \n+ATOM 996 CD1 TYR T 1 37.809 -3.489 15.695 1.00 0.00 C \n+ATOM 997 HD1 TYR T 1 38.732 -3.979 15.971 1.00 0.00 H \n+ATOM 998 CE1 TYR T 1 37.263 -3.721 14.424 1.00 0.00 C \n+ATOM 999 HE1 TYR T 1 37.769 -4.378 13.732 1.00 0.00 H \n+ATOM 1000 CZ TYR T 1 36.061 -3.104 14.060 1.00 0.00 C \n+ATOM 1001 OH TYR T 1 35.497 -3.321 12.790 1.00 0.00 O \n+ATOM 1002 HH TYR T 1 36.036 -3.962 12.322 1.00 0.00 H \n+ATOM 1003 CD2 TYR T 1 35.946 -2.038 16.234 1.00 0.00 C \n+ATOM 1004 HD2 TYR T 1 35.413 -1.404 16.928 1.00 0.00 H \n+ATOM 1005 CE2 TYR T 1 35.402 -2.267 14.963 1.00 0.00 C \n+ATOM 1006 HE2 TYR T 1 34.466 -1.808 14.676 1.00 0.00 H \n+ATOM 1007 C TYR T 1 38.715 -0.594 19.480 1.00 0.00 C \n+ATOM 1008 O TYR T 1 39.712 -1.211 19.833 1.00 0.00 O \n+ATOM 1009 N TYR T 2 38.218 0.468 20.155 1.00 0.00 N \n+ATOM 1010 H TYR T 2 37.281 0.780 20.044 1.00 0.00 H \n+ATOM 1011 CA TYR T 2 39.096 1.472 20.756 1.00 0.00 C \n+ATOM 1012 HA TYR T 2 38.457 2.294 21.047 1.00 0.00 H \n+ATOM 1013 CB TYR T 2 39.828 0.989 22.042 1.00 0.00 C \n+ATOM 1014 HB3 TYR T 2 40.522 0.152 21.817 1.00 0.00 H \n+ATOM 1015 HB2 TYR T 2 40.424 1.804 22.508 1.00 0.00 H \n+ATOM 1016 CG TYR T 2 38.818 0.534 23.059 1.00 0.00 C \n+ATOM 1017 CD1 TYR T 2 38.555 -0.833 23.254 1.00 0.00 C \n+ATOM 1018 HD1 TYR T 2 39.083 -1.565 22.659 1.00 0.00 H \n+ATOM 1019 CE1 TYR T 2 37.614 -1.248 24.206 1.00 0.00 C \n+ATOM 1020 HE1 TYR T 2 37.413 -2.299 24.352 1.00 0.00 H \n+ATOM 1021 CZ TYR T 2 36.941 -0.300 24.983 1.00 0.00 C \n+ATOM 1022 OH TYR T 2 36.002 -0.727 25.940 1.00 0.00 O \n+ATOM 1023 HH TYR T 2 35.715 0.045 26.429 1.00 0.00 H \n+ATOM 1024 CD2 TYR T 2 38.145 1.477 23.856 1.00 0.00 C \n+ATOM 1025 HD2 TYR T 2 38.360 2.529 23.731 1.00 0.00 H \n+ATOM 1026 CE2 TYR T 2 37.208 1.063 24.813 1.00 0.00 C \n+ATOM 1027 HE2 TYR T 2 36.700 1.801 25.416 1.00 0.00 H \n+ATOM 1028 C TYR T 2 40.066 2.082 19.731 1.00 0.00 C \n+ATOM 1029 O TYR T 2 39.979 1.803 18.526 1.00 0.00 O \n+ATOM 1030 N TYR T 3 40.976 2.934 20.192 1.00 0.00 N \n+ATOM 1031 H TYR T 3 41.050 3.267 21.137 1.00 0.00 H \n+ATOM 1032 CA TYR T 3 42.013 3.573 19.435 1.00 0.00 C \n+ATOM 1033 HA TYR T 3 41.583 4.061 18.573 1.00 0.00 H \n+ATOM 1034 CB TYR T 3 43.149 2.594 19.005 1.00 0.00 C \n+ATOM 1035 HB3 TYR T 3 42.784 1.961 18.172 1.00 0.00 H \n+ATOM 1036 HB2 TYR T 3 44.026 3.176 18.645 1.00 0.00 H \n+ATOM 1037 CG TYR T 3 43.599 1.696 20.136 1.00 0.00 C \n+ATOM 1038 CD1 TYR T 3 44.450 2.187 21.140 1.00 0.00 C \n+ATOM 1039 HD1 TYR T 3 44.764 3.223 21.105 1.00 0.00 H \n+ATOM 1040 CE1 TYR T 3 44.860 1.365 22.198 1.00 0.00 C \n+ATOM 1041 HE1 TYR T 3 45.499 1.773 22.966 1.00 0.00 H \n+ATOM 1042 CZ TYR T 3 44.431 0.034 22.252 1.00 0.00 C \n+ATOM 1043 OH TYR T 3 44.831 -0.795 23.317 1.00 0.00 O \n+ATOM 1044 HH TYR T 3 45.353 -0.252 23.912 1.00 0.00 H \n+ATOM 1045 CD2 TYR T 3 43.188 0.351 20.196 1.00 0.00 C \n+ATOM 1046 HD2 TYR T 3 42.533 -0.039 19.434 1.00 0.00 H \n+ATOM 1047 CE2 TYR T 3 43.597 -0.475 21.253 1.00 0.00 C \n+ATOM 1048 HE2 TYR T 3 43.268 -1.502 21.304 1.00 0.00 H \n+ATOM 1049 C TYR T 3 42.534 4.699 20.360 1.00 0.00 C \n+ATOM 1050 O TYR T 3 42.060 4.766 21.531 1.00 0.00 O \n+ATOM 1051 OXT TYR T 3 43.397 5.489 19.902 1.00 0.00 O \n+TER 1052 TYR T 3\n+END\ndiff --git a/wrappers/python/tests/systems/test_charmm_20aa_drude.pdb b/wrappers/python/tests/systems/test_charmm_20aa_drude.pdb\nnew file mode 100644\nindex 0000000000..b66ab909c4\n--- /dev/null\n+++ b/wrappers/python/tests/systems/test_charmm_20aa_drude.pdb\n@@ -0,0 +1,1816 @@\n+REMARK 1 CREATED WITH OPENMM 8.3, 2025-07-01\n+ATOM 1 N ALA A 1 -15.460 -18.764 -18.529 1.00 0.00 N \n+ATOM 2 DN ALA A 1 -15.460 -18.764 -18.529 1.00 0.00 EP \n+ATOM 3 H ALA A 1 -16.423 -18.814 -18.169 1.00 0.00 H \n+ATOM 4 H2 ALA A 1 -14.799 -18.314 -17.834 1.00 0.00 H \n+ATOM 5 H3 ALA A 1 -15.012 -19.713 -18.581 1.00 0.00 H \n+ATOM 6 CA ALA A 1 -15.310 -18.144 -19.870 1.00 0.00 C \n+ATOM 7 DCA ALA A 1 -15.310 -18.144 -19.870 1.00 0.00 EP \n+ATOM 8 HA ALA A 1 -14.273 -18.214 -20.137 1.00 0.00 H \n+ATOM 9 C ALA A 1 -15.781 -16.688 -19.994 1.00 0.00 C \n+ATOM 10 DC ALA A 1 -15.781 -16.688 -19.994 1.00 0.00 EP \n+ATOM 11 O ALA A 1 -16.939 -16.459 -20.321 1.00 0.00 O \n+ATOM 12 DO ALA A 1 -16.939 -16.459 -20.321 1.00 0.00 EP \n+ATOM 13 LPOA ALA A 1 -16.997 -16.753 -20.340 1.00 0.00 EP \n+ATOM 14 LPOB ALA A 1 -16.890 -16.164 -20.306 1.00 0.00 EP \n+ATOM 15 CB ALA A 1 -16.076 -19.039 -20.874 1.00 0.00 C \n+ATOM 16 DCB ALA A 1 -16.076 -19.039 -20.874 1.00 0.00 EP \n+ATOM 17 HB1 ALA A 1 -17.166 -19.059 -20.659 1.00 0.00 H \n+ATOM 18 HB2 ALA A 1 -15.687 -20.080 -20.851 1.00 0.00 H \n+ATOM 19 HB3 ALA A 1 -15.939 -18.657 -21.910 1.00 0.00 H \n+ATOM 20 N ALA A 2 -14.989 -15.613 -19.748 1.00 0.00 N \n+ATOM 21 DN ALA A 2 -14.989 -15.613 -19.748 1.00 0.00 EP \n+ATOM 22 H ALA A 2 -15.423 -14.747 -19.978 1.00 0.00 H \n+ATOM 23 CA ALA A 2 -13.674 -15.469 -19.135 1.00 0.00 C \n+ATOM 24 DCA ALA A 2 -13.674 -15.469 -19.135 1.00 0.00 EP \n+ATOM 25 HA ALA A 2 -13.818 -15.659 -18.079 1.00 0.00 H \n+ATOM 26 C ALA A 2 -12.579 -16.426 -19.583 1.00 0.00 C \n+ATOM 27 DC ALA A 2 -12.579 -16.426 -19.583 1.00 0.00 EP \n+ATOM 28 O ALA A 2 -12.522 -16.860 -20.730 1.00 0.00 O \n+ATOM 29 DO ALA A 2 -12.522 -16.860 -20.730 1.00 0.00 EP \n+ATOM 30 LPOA ALA A 2 -12.768 -16.706 -20.807 1.00 0.00 EP \n+ATOM 31 LPOB ALA A 2 -12.276 -17.018 -20.664 1.00 0.00 EP \n+ATOM 32 CB ALA A 2 -13.192 -14.012 -19.288 1.00 0.00 C \n+ATOM 33 DCB ALA A 2 -13.192 -14.012 -19.288 1.00 0.00 EP \n+ATOM 34 HB1 ALA A 2 -13.952 -13.311 -18.882 1.00 0.00 H \n+ATOM 35 HB2 ALA A 2 -13.030 -13.768 -20.361 1.00 0.00 H \n+ATOM 36 HB3 ALA A 2 -12.240 -13.842 -18.741 1.00 0.00 H \n+ATOM 37 N ALA A 3 -11.746 -16.837 -18.611 1.00 0.00 N \n+ATOM 38 DN ALA A 3 -11.746 -16.837 -18.611 1.00 0.00 EP \n+ATOM 39 H ALA A 3 -11.713 -16.379 -17.733 1.00 0.00 H \n+ATOM 40 CA ALA A 3 -11.391 -18.233 -18.498 1.00 0.00 C \n+ATOM 41 DCA ALA A 3 -11.391 -18.233 -18.498 1.00 0.00 EP \n+ATOM 42 HA ALA A 3 -11.175 -18.650 -19.474 1.00 0.00 H \n+ATOM 43 C ALA A 3 -12.641 -18.946 -17.916 1.00 0.00 C \n+ATOM 44 DC ALA A 3 -12.641 -18.946 -17.916 1.00 0.00 EP \n+ATOM 45 CB ALA A 3 -10.189 -18.413 -17.554 1.00 0.00 C \n+ATOM 46 DCB ALA A 3 -10.189 -18.413 -17.554 1.00 0.00 EP \n+ATOM 47 HB1 ALA A 3 -9.939 -19.492 -17.457 1.00 0.00 H \n+ATOM 48 HB2 ALA A 3 -9.304 -17.876 -17.954 1.00 0.00 H \n+ATOM 49 HB3 ALA A 3 -10.426 -18.015 -16.544 1.00 0.00 H \n+ATOM 50 O ALA A 3 -13.321 -18.344 -17.033 1.00 0.00 O \n+ATOM 51 DOT1 ALA A 3 -13.321 -18.344 -17.033 1.00 0.00 EP \n+ATOM 52 OXT ALA A 3 -13.057 -20.006 -18.457 1.00 0.00 O \n+ATOM 53 DOT2 ALA A 3 -13.057 -20.006 -18.457 1.00 0.00 EP \n+ATOM 54 LPT1 ALA A 3 -13.620 -18.516 -16.975 1.00 0.00 EP \n+ATOM 55 LPT2 ALA A 3 -13.150 -18.059 -16.925 1.00 0.00 EP \n+ATOM 56 LPT3 ALA A 3 -13.370 -20.093 -18.326 1.00 0.00 EP \n+ATOM 57 LPT4 ALA A 3 -12.823 -20.121 -18.691 1.00 0.00 EP \n+TER 58 ALA A 3\n+ATOM 59 N CYS B 1 -16.921 -18.292 1.815 1.00 0.00 N \n+ATOM 60 DN CYS B 1 -16.921 -18.292 1.815 1.00 0.00 EP \n+ATOM 61 H CYS B 1 -16.281 -17.565 2.234 1.00 0.00 H \n+ATOM 62 H2 CYS B 1 -17.573 -18.613 2.555 1.00 0.00 H \n+ATOM 63 H3 CYS B 1 -17.432 -17.856 1.025 1.00 0.00 H \n+ATOM 64 CA CYS B 1 -16.079 -19.442 1.355 1.00 0.00 C \n+ATOM 65 DCA CYS B 1 -16.079 -19.442 1.355 1.00 0.00 EP \n+ATOM 66 HA CYS B 1 -16.782 -20.182 0.996 1.00 0.00 H \n+ATOM 67 C CYS B 1 -15.195 -19.209 0.139 1.00 0.00 C \n+ATOM 68 DC CYS B 1 -15.195 -19.209 0.139 1.00 0.00 EP \n+ATOM 69 O CYS B 1 -15.320 -19.977 -0.805 1.00 0.00 O \n+ATOM 70 DO CYS B 1 -15.320 -19.977 -0.805 1.00 0.00 EP \n+ATOM 71 LPOA CYS B 1 -15.533 -20.130 -0.659 1.00 0.00 EP \n+ATOM 72 LPOB CYS B 1 -15.108 -19.831 -0.959 1.00 0.00 EP \n+ATOM 73 CB CYS B 1 -15.342 -20.125 2.543 1.00 0.00 C \n+ATOM 74 DCB CYS B 1 -15.342 -20.125 2.543 1.00 0.00 EP \n+ATOM 75 HB3 CYS B 1 -14.712 -20.948 2.126 1.00 0.00 H \n+ATOM 76 HB2 CYS B 1 -14.634 -19.427 3.033 1.00 0.00 H \n+ATOM 77 SG CYS B 1 -16.482 -20.843 3.777 1.00 0.00 S \n+ATOM 78 DSG CYS B 1 -16.482 -20.843 3.777 1.00 0.00 EP \n+ATOM 79 HG CYS B 1 -15.546 -21.525 4.431 1.00 0.00 H \n+ATOM 80 LPGA CYS B 1 -16.509 -20.229 4.206 1.00 0.00 EP \n+ATOM 81 LPGB CYS B 1 -16.735 -21.385 3.324 1.00 0.00 EP \n+ATOM 82 N CYS B 2 -14.336 -18.175 -0.006 1.00 0.00 N \n+ATOM 83 DN CYS B 2 -14.336 -18.175 -0.006 1.00 0.00 EP \n+ATOM 84 H CYS B 2 -13.732 -18.323 -0.790 1.00 0.00 H \n+ATOM 85 CA CYS B 2 -13.965 -16.977 0.754 1.00 0.00 C \n+ATOM 86 DCA CYS B 2 -13.965 -16.977 0.754 1.00 0.00 EP \n+ATOM 87 HA CYS B 2 -12.912 -16.879 0.562 1.00 0.00 H \n+ATOM 88 C CYS B 2 -14.071 -16.909 2.282 1.00 0.00 C \n+ATOM 89 DC CYS B 2 -14.071 -16.909 2.282 1.00 0.00 EP \n+ATOM 90 O CYS B 2 -15.137 -16.594 2.812 1.00 0.00 O \n+ATOM 91 DO CYS B 2 -15.137 -16.594 2.812 1.00 0.00 EP \n+ATOM 92 LPOA CYS B 2 -15.267 -16.564 2.543 1.00 0.00 EP \n+ATOM 93 LPOB CYS B 2 -15.015 -16.622 3.085 1.00 0.00 EP \n+ATOM 94 CB CYS B 2 -14.553 -15.682 0.112 1.00 0.00 C \n+ATOM 95 DCB CYS B 2 -14.553 -15.682 0.112 1.00 0.00 EP \n+ATOM 96 HB3 CYS B 2 -13.976 -15.501 -0.823 1.00 0.00 H \n+ATOM 97 HB2 CYS B 2 -14.357 -14.802 0.764 1.00 0.00 H \n+ATOM 98 SG CYS B 2 -16.328 -15.793 -0.319 1.00 0.00 S \n+ATOM 99 DSG CYS B 2 -16.328 -15.793 -0.319 1.00 0.00 EP \n+ATOM 100 HG CYS B 2 -16.124 -16.382 -1.493 1.00 0.00 H \n+ATOM 101 LPGA CYS B 2 -16.460 -16.400 0.102 1.00 0.00 EP \n+ATOM 102 LPGB CYS B 2 -16.385 -15.081 -0.547 1.00 0.00 EP \n+ATOM 103 N CYS B 3 -13.030 -17.185 3.093 1.00 0.00 N \n+ATOM 104 DN CYS B 3 -13.030 -17.185 3.093 1.00 0.00 EP \n+ATOM 105 H CYS B 3 -13.187 -17.021 4.058 1.00 0.00 H \n+ATOM 106 CA CYS B 3 -11.738 -17.800 2.794 1.00 0.00 C \n+ATOM 107 DCA CYS B 3 -11.738 -17.800 2.794 1.00 0.00 EP \n+ATOM 108 HA CYS B 3 -11.504 -18.390 3.668 1.00 0.00 H \n+ATOM 109 C CYS B 3 -11.759 -18.852 1.657 1.00 0.00 C \n+ATOM 110 DC CYS B 3 -11.759 -18.852 1.657 1.00 0.00 EP \n+ATOM 111 CB CYS B 3 -10.561 -16.783 2.676 1.00 0.00 C \n+ATOM 112 DCB CYS B 3 -10.561 -16.783 2.676 1.00 0.00 EP \n+ATOM 113 HB3 CYS B 3 -10.485 -16.247 3.646 1.00 0.00 H \n+ATOM 114 HB2 CYS B 3 -9.622 -17.366 2.549 1.00 0.00 H \n+ATOM 115 SG CYS B 3 -10.711 -15.568 1.325 1.00 0.00 S \n+ATOM 116 DSG CYS B 3 -10.711 -15.568 1.325 1.00 0.00 EP \n+ATOM 117 HG CYS B 3 -10.674 -16.537 0.408 1.00 0.00 H \n+ATOM 118 LPGA CYS B 3 -11.453 -15.485 1.394 1.00 0.00 EP \n+ATOM 119 LPGB CYS B 3 -9.987 -15.372 1.333 1.00 0.00 EP \n+ATOM 120 O CYS B 3 -11.189 -18.590 0.567 1.00 0.00 O \n+ATOM 121 DOT1 CYS B 3 -11.189 -18.590 0.567 1.00 0.00 EP \n+ATOM 122 OXT CYS B 3 -12.425 -19.899 1.867 1.00 0.00 O \n+ATOM 123 DOT2 CYS B 3 -12.425 -19.899 1.867 1.00 0.00 EP \n+ATOM 124 LPT1 CYS B 3 -11.244 -18.849 0.338 1.00 0.00 EP \n+ATOM 125 LPT2 CYS B 3 -11.025 -18.282 0.588 1.00 0.00 EP \n+ATOM 126 LPT3 CYS B 3 -12.426 -20.100 1.580 1.00 0.00 EP \n+ATOM 127 LPT4 CYS B 3 -12.551 -19.897 2.193 1.00 0.00 EP \n+TER 128 CYS B 3\n+ATOM 129 N ASP C 1 -8.727 -7.414 22.480 1.00 0.00 N \n+ATOM 130 DN ASP C 1 -8.727 -7.414 22.480 1.00 0.00 EP \n+ATOM 131 H ASP C 1 -9.490 -7.303 23.166 1.00 0.00 H \n+ATOM 132 H2 ASP C 1 -8.042 -8.147 22.804 1.00 0.00 H \n+ATOM 133 H3 ASP C 1 -8.247 -6.467 22.400 1.00 0.00 H \n+ATOM 134 CA ASP C 1 -9.225 -7.896 21.162 1.00 0.00 C \n+ATOM 135 DCA ASP C 1 -9.225 -7.896 21.162 1.00 0.00 EP \n+ATOM 136 HA ASP C 1 -10.014 -8.599 21.396 1.00 0.00 H \n+ATOM 137 C ASP C 1 -9.939 -6.850 20.316 1.00 0.00 C \n+ATOM 138 DC ASP C 1 -9.939 -6.850 20.316 1.00 0.00 EP \n+ATOM 139 O ASP C 1 -11.151 -6.949 20.166 1.00 0.00 O \n+ATOM 140 DO ASP C 1 -11.151 -6.949 20.166 1.00 0.00 EP \n+ATOM 141 LPOA ASP C 1 -11.157 -7.197 20.335 1.00 0.00 EP \n+ATOM 142 LPOB ASP C 1 -11.155 -6.702 19.995 1.00 0.00 EP \n+ATOM 143 CB ASP C 1 -8.136 -8.705 20.399 1.00 0.00 C \n+ATOM 144 DCB ASP C 1 -8.136 -8.705 20.399 1.00 0.00 EP \n+ATOM 145 HB3 ASP C 1 -7.217 -8.111 20.230 1.00 0.00 H \n+ATOM 146 HB2 ASP C 1 -8.520 -9.044 19.412 1.00 0.00 H \n+ATOM 147 CG ASP C 1 -7.760 -9.930 21.201 1.00 0.00 C \n+ATOM 148 DCG ASP C 1 -7.760 -9.930 21.201 1.00 0.00 EP \n+ATOM 149 OD1 ASP C 1 -7.624 -11.037 20.632 1.00 0.00 O \n+ATOM 150 DOD1 ASP C 1 -7.624 -11.037 20.632 1.00 0.00 EP \n+ATOM 151 OD2 ASP C 1 -7.512 -9.783 22.429 1.00 0.00 O \n+ATOM 152 DOD2 ASP C 1 -7.512 -9.783 22.429 1.00 0.00 EP \n+ATOM 153 LP1A ASP C 1 -7.685 -11.004 20.289 1.00 0.00 EP \n+ATOM 154 LP1B ASP C 1 -7.537 -11.282 20.866 1.00 0.00 EP \n+ATOM 155 LP2A ASP C 1 -7.547 -9.447 22.518 1.00 0.00 EP \n+ATOM 156 LP2B ASP C 1 -7.430 -10.092 22.572 1.00 0.00 EP \n+ATOM 157 N ASP C 2 -9.308 -5.812 19.738 1.00 0.00 N \n+ATOM 158 DN ASP C 2 -9.308 -5.812 19.738 1.00 0.00 EP \n+ATOM 159 H ASP C 2 -9.890 -5.237 19.168 1.00 0.00 H \n+ATOM 160 CA ASP C 2 -7.928 -5.363 19.785 1.00 0.00 C \n+ATOM 161 DCA ASP C 2 -7.928 -5.363 19.785 1.00 0.00 EP \n+ATOM 162 HA ASP C 2 -7.297 -6.033 20.346 1.00 0.00 H \n+ATOM 163 C ASP C 2 -7.393 -5.315 18.346 1.00 0.00 C \n+ATOM 164 DC ASP C 2 -7.393 -5.315 18.346 1.00 0.00 EP \n+ATOM 165 O ASP C 2 -8.100 -5.689 17.414 1.00 0.00 O \n+ATOM 166 DO ASP C 2 -8.100 -5.689 17.414 1.00 0.00 EP \n+ATOM 167 LPOA ASP C 2 -8.324 -5.754 17.603 1.00 0.00 EP \n+ATOM 168 LPOB ASP C 2 -7.882 -5.627 17.217 1.00 0.00 EP \n+ATOM 169 CB ASP C 2 -7.931 -3.936 20.388 1.00 0.00 C \n+ATOM 170 DCB ASP C 2 -7.931 -3.936 20.388 1.00 0.00 EP \n+ATOM 171 HB3 ASP C 2 -8.789 -3.360 19.984 1.00 0.00 H \n+ATOM 172 HB2 ASP C 2 -7.009 -3.392 20.132 1.00 0.00 H \n+ATOM 173 CG ASP C 2 -7.996 -3.904 21.899 1.00 0.00 C \n+ATOM 174 DCG ASP C 2 -7.996 -3.904 21.899 1.00 0.00 EP \n+ATOM 175 OD1 ASP C 2 -8.047 -2.762 22.425 1.00 0.00 O \n+ATOM 176 DOD1 ASP C 2 -8.047 -2.762 22.425 1.00 0.00 EP \n+ATOM 177 OD2 ASP C 2 -7.924 -4.982 22.540 1.00 0.00 O \n+ATOM 178 DOD2 ASP C 2 -7.924 -4.982 22.540 1.00 0.00 EP \n+ATOM 179 LP1A ASP C 2 -8.042 -2.516 22.176 1.00 0.00 EP \n+ATOM 180 LP1B ASP C 2 -8.061 -2.791 22.773 1.00 0.00 EP \n+ATOM 181 LP2A ASP C 2 -7.890 -5.251 22.318 1.00 0.00 EP \n+ATOM 182 LP2B ASP C 2 -7.944 -4.919 22.883 1.00 0.00 EP \n+ATOM 183 N ASP C 3 -6.157 -4.858 18.058 1.00 0.00 N \n+ATOM 184 DN ASP C 3 -6.157 -4.858 18.058 1.00 0.00 EP \n+ATOM 185 H ASP C 3 -5.943 -4.793 17.092 1.00 0.00 H \n+ATOM 186 CA ASP C 3 -5.034 -4.587 18.934 1.00 0.00 C \n+ATOM 187 DCA ASP C 3 -5.034 -4.587 18.934 1.00 0.00 EP \n+ATOM 188 HA ASP C 3 -5.338 -4.601 19.972 1.00 0.00 H \n+ATOM 189 C ASP C 3 -4.005 -5.728 18.766 1.00 0.00 C \n+ATOM 190 DC ASP C 3 -4.005 -5.728 18.766 1.00 0.00 EP \n+ATOM 191 CB ASP C 3 -4.312 -3.239 18.597 1.00 0.00 C \n+ATOM 192 DCB ASP C 3 -4.312 -3.239 18.597 1.00 0.00 EP \n+ATOM 193 HB3 ASP C 3 -3.327 -3.206 19.107 1.00 0.00 H \n+ATOM 194 HB2 ASP C 3 -4.156 -3.164 17.502 1.00 0.00 H \n+ATOM 195 CG ASP C 3 -5.081 -2.012 19.049 1.00 0.00 C \n+ATOM 196 DCG ASP C 3 -5.081 -2.012 19.049 1.00 0.00 EP \n+ATOM 197 OD1 ASP C 3 -4.594 -1.303 19.969 1.00 0.00 O \n+ATOM 198 DOD1 ASP C 3 -4.594 -1.303 19.969 1.00 0.00 EP \n+ATOM 199 OD2 ASP C 3 -6.202 -1.744 18.545 1.00 0.00 O \n+ATOM 200 DOD2 ASP C 3 -6.202 -1.744 18.545 1.00 0.00 EP \n+ATOM 201 LP1A ASP C 3 -4.289 -1.438 20.075 1.00 0.00 EP \n+ATOM 202 LP1B ASP C 3 -4.806 -1.034 20.037 1.00 0.00 EP \n+ATOM 203 LP2A ASP C 3 -6.287 -1.986 18.306 1.00 0.00 EP \n+ATOM 204 LP2B ASP C 3 -6.330 -1.452 18.687 1.00 0.00 EP \n+ATOM 205 O ASP C 3 -3.534 -6.290 19.787 1.00 0.00 O \n+ATOM 206 DOT1 ASP C 3 -3.534 -6.290 19.787 1.00 0.00 EP \n+ATOM 207 OXT ASP C 3 -3.569 -6.030 17.625 1.00 0.00 O \n+ATOM 208 DOT2 ASP C 3 -3.569 -6.030 17.625 1.00 0.00 EP \n+ATOM 209 LPT1 ASP C 3 -3.286 -6.520 19.694 1.00 0.00 EP \n+ATOM 210 LPT2 ASP C 3 -3.692 -6.168 20.074 1.00 0.00 EP \n+ATOM 211 LPT3 ASP C 3 -3.319 -6.274 17.653 1.00 0.00 EP \n+ATOM 212 LPT4 ASP C 3 -3.735 -5.844 17.380 1.00 0.00 EP \n+TER 213 ASP C 3\n+ATOM 214 N GLU D 1 -14.270 6.236 -10.220 1.00 0.00 N \n+ATOM 215 DN GLU D 1 -14.270 6.236 -10.220 1.00 0.00 EP \n+ATOM 216 H GLU D 1 -14.698 5.698 -9.419 1.00 0.00 H \n+ATOM 217 H2 GLU D 1 -13.596 6.887 -9.738 1.00 0.00 H \n+ATOM 218 H3 GLU D 1 -13.691 5.614 -10.852 1.00 0.00 H \n+ATOM 219 CA GLU D 1 -15.374 6.952 -10.909 1.00 0.00 C \n+ATOM 220 DCA GLU D 1 -15.374 6.952 -10.909 1.00 0.00 EP \n+ATOM 221 HA GLU D 1 -16.155 6.212 -11.008 1.00 0.00 H \n+ATOM 222 C GLU D 1 -15.102 7.346 -12.354 1.00 0.00 C \n+ATOM 223 DC GLU D 1 -15.102 7.346 -12.354 1.00 0.00 EP \n+ATOM 224 O GLU D 1 -15.591 6.666 -13.250 1.00 0.00 O \n+ATOM 225 DO GLU D 1 -15.591 6.666 -13.250 1.00 0.00 EP \n+ATOM 226 LPOA GLU D 1 -15.719 6.484 -13.049 1.00 0.00 EP \n+ATOM 227 LPOB GLU D 1 -15.467 6.842 -13.459 1.00 0.00 EP \n+ATOM 228 CB GLU D 1 -15.968 8.077 -10.008 1.00 0.00 C \n+ATOM 229 DCB GLU D 1 -15.968 8.077 -10.008 1.00 0.00 EP \n+ATOM 230 HB3 GLU D 1 -15.159 8.683 -9.546 1.00 0.00 H \n+ATOM 231 HB2 GLU D 1 -16.572 8.758 -10.651 1.00 0.00 H \n+ATOM 232 CG GLU D 1 -16.937 7.574 -8.902 1.00 0.00 C \n+ATOM 233 DCG GLU D 1 -16.937 7.574 -8.902 1.00 0.00 EP \n+ATOM 234 HG3 GLU D 1 -17.717 6.910 -9.324 1.00 0.00 H \n+ATOM 235 HG2 GLU D 1 -17.439 8.451 -8.438 1.00 0.00 H \n+ATOM 236 CD GLU D 1 -16.217 6.816 -7.797 1.00 0.00 C \n+ATOM 237 DCD GLU D 1 -16.217 6.816 -7.797 1.00 0.00 EP \n+ATOM 238 OE1 GLU D 1 -16.082 7.378 -6.681 1.00 0.00 O \n+ATOM 239 DOE1 GLU D 1 -16.082 7.378 -6.681 1.00 0.00 EP \n+ATOM 240 OE2 GLU D 1 -15.741 5.686 -8.076 1.00 0.00 O \n+ATOM 241 DOE2 GLU D 1 -15.741 5.686 -8.076 1.00 0.00 EP \n+ATOM 242 LP1A GLU D 1 -16.227 7.696 -6.689 1.00 0.00 EP \n+ATOM 243 LP1B GLU D 1 -15.911 7.166 -6.461 1.00 0.00 EP \n+ATOM 244 LP2A GLU D 1 -15.806 5.608 -8.411 1.00 0.00 EP \n+ATOM 245 LP2B GLU D 1 -15.585 5.549 -7.794 1.00 0.00 EP \n+ATOM 246 N GLU D 2 -14.328 8.398 -12.696 1.00 0.00 N \n+ATOM 247 DN GLU D 2 -14.328 8.398 -12.696 1.00 0.00 EP \n+ATOM 248 H GLU D 2 -13.972 8.338 -13.627 1.00 0.00 H \n+ATOM 249 CA GLU D 2 -14.008 9.635 -12.000 1.00 0.00 C \n+ATOM 250 DCA GLU D 2 -14.008 9.635 -12.000 1.00 0.00 EP \n+ATOM 251 HA GLU D 2 -14.885 9.965 -11.466 1.00 0.00 H \n+ATOM 252 C GLU D 2 -12.901 9.544 -10.959 1.00 0.00 C \n+ATOM 253 DC GLU D 2 -12.901 9.544 -10.959 1.00 0.00 EP \n+ATOM 254 O GLU D 2 -12.808 10.418 -10.102 1.00 0.00 O \n+ATOM 255 DO GLU D 2 -12.808 10.418 -10.102 1.00 0.00 EP \n+ATOM 256 LPOA GLU D 2 -13.045 10.562 -10.216 1.00 0.00 EP \n+ATOM 257 LPOB GLU D 2 -12.570 10.281 -9.981 1.00 0.00 EP \n+ATOM 258 CB GLU D 2 -13.690 10.756 -13.028 1.00 0.00 C \n+ATOM 259 DCB GLU D 2 -13.690 10.756 -13.028 1.00 0.00 EP \n+ATOM 260 HB3 GLU D 2 -12.930 10.370 -13.743 1.00 0.00 H \n+ATOM 261 HB2 GLU D 2 -13.253 11.638 -12.505 1.00 0.00 H \n+ATOM 262 CG GLU D 2 -14.949 11.243 -13.797 1.00 0.00 C \n+ATOM 263 DCG GLU D 2 -14.949 11.243 -13.797 1.00 0.00 EP \n+ATOM 264 HG3 GLU D 2 -15.667 11.707 -13.090 1.00 0.00 H \n+ATOM 265 HG2 GLU D 2 -15.448 10.380 -14.285 1.00 0.00 H \n+ATOM 266 CD GLU D 2 -14.629 12.252 -14.884 1.00 0.00 C \n+ATOM 267 DCD GLU D 2 -14.629 12.252 -14.884 1.00 0.00 EP \n+ATOM 268 OE1 GLU D 2 -13.993 11.879 -15.907 1.00 0.00 O \n+ATOM 269 DOE1 GLU D 2 -13.993 11.879 -15.907 1.00 0.00 EP \n+ATOM 270 OE2 GLU D 2 -15.062 13.437 -14.791 1.00 0.00 O \n+ATOM 271 DOE2 GLU D 2 -15.062 13.437 -14.791 1.00 0.00 EP \n+ATOM 272 LP1A GLU D 2 -13.919 11.538 -15.884 1.00 0.00 EP \n+ATOM 273 LP1B GLU D 2 -13.946 12.149 -16.125 1.00 0.00 EP \n+ATOM 274 LP2A GLU D 2 -15.247 13.474 -14.497 1.00 0.00 EP \n+ATOM 275 LP2B GLU D 2 -14.958 13.624 -15.068 1.00 0.00 EP \n+ATOM 276 N GLU D 3 -12.079 8.477 -10.995 1.00 0.00 N \n+ATOM 277 DN GLU D 3 -12.079 8.477 -10.995 1.00 0.00 EP \n+ATOM 278 H GLU D 3 -12.133 7.840 -11.774 1.00 0.00 H \n+ATOM 279 CA GLU D 3 -11.085 8.129 -9.984 1.00 0.00 C \n+ATOM 280 DCA GLU D 3 -11.085 8.129 -9.984 1.00 0.00 EP \n+ATOM 281 HA GLU D 3 -10.329 8.899 -9.985 1.00 0.00 H \n+ATOM 282 C GLU D 3 -11.721 8.065 -8.566 1.00 0.00 C \n+ATOM 283 DC GLU D 3 -11.721 8.065 -8.566 1.00 0.00 EP \n+ATOM 284 CB GLU D 3 -10.450 6.713 -10.231 1.00 0.00 C \n+ATOM 285 DCB GLU D 3 -10.450 6.713 -10.231 1.00 0.00 EP \n+ATOM 286 HB3 GLU D 3 -11.022 5.929 -9.682 1.00 0.00 H \n+ATOM 287 HB2 GLU D 3 -9.434 6.731 -9.779 1.00 0.00 H \n+ATOM 288 CG GLU D 3 -10.343 6.221 -11.700 1.00 0.00 C \n+ATOM 289 DCG GLU D 3 -10.343 6.221 -11.700 1.00 0.00 EP \n+ATOM 290 HG3 GLU D 3 -9.863 6.993 -12.334 1.00 0.00 H \n+ATOM 291 HG2 GLU D 3 -9.734 5.295 -11.744 1.00 0.00 H \n+ATOM 292 CD GLU D 3 -11.710 5.875 -12.279 1.00 0.00 C \n+ATOM 293 DCD GLU D 3 -11.710 5.875 -12.279 1.00 0.00 EP \n+ATOM 294 OE1 GLU D 3 -12.433 5.020 -11.703 1.00 0.00 O \n+ATOM 295 DOE1 GLU D 3 -12.433 5.020 -11.703 1.00 0.00 EP \n+ATOM 296 OE2 GLU D 3 -12.106 6.584 -13.236 1.00 0.00 O \n+ATOM 297 DOE2 GLU D 3 -12.106 6.584 -13.236 1.00 0.00 EP \n+ATOM 298 LP1A GLU D 3 -12.270 4.897 -11.419 1.00 0.00 EP \n+ATOM 299 LP1B GLU D 3 -12.733 4.980 -11.878 1.00 0.00 EP \n+ATOM 300 LP2A GLU D 3 -11.866 6.827 -13.313 1.00 0.00 EP \n+ATOM 301 LP2B GLU D 3 -12.421 6.476 -13.343 1.00 0.00 EP \n+ATOM 302 O GLU D 3 -11.256 8.740 -7.613 1.00 0.00 O \n+ATOM 303 DOT1 GLU D 3 -11.256 8.740 -7.613 1.00 0.00 EP \n+ATOM 304 OXT GLU D 3 -12.705 7.296 -8.406 1.00 0.00 O \n+ATOM 305 DOT2 GLU D 3 -12.705 7.296 -8.406 1.00 0.00 EP \n+ATOM 306 LPT1 GLU D 3 -11.438 8.677 -7.321 1.00 0.00 EP \n+ATOM 307 LPT2 GLU D 3 -10.985 8.932 -7.724 1.00 0.00 EP \n+ATOM 308 LPT3 GLU D 3 -12.813 7.307 -8.074 1.00 0.00 EP \n+ATOM 309 LPT4 GLU D 3 -12.784 7.138 -8.709 1.00 0.00 EP \n+TER 310 GLU D 3\n+ATOM 311 N PHE E 1 -13.614 7.983 -6.056 1.00 0.00 N \n+ATOM 312 DN PHE E 1 -13.614 7.983 -6.056 1.00 0.00 EP \n+ATOM 313 H PHE E 1 -13.451 9.005 -6.031 1.00 0.00 H \n+ATOM 314 H2 PHE E 1 -13.037 7.625 -6.870 1.00 0.00 H \n+ATOM 315 H3 PHE E 1 -14.627 7.784 -6.303 1.00 0.00 H \n+ATOM 316 CA PHE E 1 -13.251 7.346 -4.767 1.00 0.00 C \n+ATOM 317 DCA PHE E 1 -13.251 7.346 -4.767 1.00 0.00 EP \n+ATOM 318 HA PHE E 1 -13.961 6.543 -4.615 1.00 0.00 H \n+ATOM 319 C PHE E 1 -13.465 8.342 -3.631 1.00 0.00 C \n+ATOM 320 DC PHE E 1 -13.465 8.342 -3.631 1.00 0.00 EP \n+ATOM 321 O PHE E 1 -13.628 9.535 -3.872 1.00 0.00 O \n+ATOM 322 DO PHE E 1 -13.628 9.535 -3.872 1.00 0.00 EP \n+ATOM 323 LPOA PHE E 1 -13.603 9.484 -4.167 1.00 0.00 EP \n+ATOM 324 LPOB PHE E 1 -13.654 9.596 -3.580 1.00 0.00 EP \n+ATOM 325 CB PHE E 1 -11.785 6.802 -4.826 1.00 0.00 C \n+ATOM 326 DCB PHE E 1 -11.785 6.802 -4.826 1.00 0.00 EP \n+ATOM 327 HB3 PHE E 1 -11.209 7.229 -5.674 1.00 0.00 H \n+ATOM 328 HB2 PHE E 1 -11.222 7.047 -3.899 1.00 0.00 H \n+ATOM 329 CG PHE E 1 -11.785 5.304 -4.988 1.00 0.00 C \n+ATOM 330 DCG PHE E 1 -11.785 5.304 -4.988 1.00 0.00 EP \n+ATOM 331 CD1 PHE E 1 -12.420 4.701 -6.087 1.00 0.00 C \n+ATOM 332 DCD1 PHE E 1 -12.420 4.701 -6.087 1.00 0.00 EP \n+ATOM 333 HD1 PHE E 1 -12.916 5.308 -6.833 1.00 0.00 H \n+ATOM 334 CD2 PHE E 1 -11.131 4.485 -4.050 1.00 0.00 C \n+ATOM 335 DCD2 PHE E 1 -11.131 4.485 -4.050 1.00 0.00 EP \n+ATOM 336 HD2 PHE E 1 -10.624 4.939 -3.210 1.00 0.00 H \n+ATOM 337 CE1 PHE E 1 -12.417 3.310 -6.239 1.00 0.00 C \n+ATOM 338 DCE1 PHE E 1 -12.417 3.310 -6.239 1.00 0.00 EP \n+ATOM 339 HE1 PHE E 1 -12.911 2.870 -7.094 1.00 0.00 H \n+ATOM 340 CE2 PHE E 1 -11.134 3.093 -4.193 1.00 0.00 C \n+ATOM 341 DCE2 PHE E 1 -11.134 3.093 -4.193 1.00 0.00 EP \n+ATOM 342 HE2 PHE E 1 -10.633 2.477 -3.461 1.00 0.00 H \n+ATOM 343 CZ PHE E 1 -11.777 2.504 -5.289 1.00 0.00 C \n+ATOM 344 DCZ PHE E 1 -11.777 2.504 -5.289 1.00 0.00 EP \n+ATOM 345 HZ PHE E 1 -11.770 1.431 -5.411 1.00 0.00 H \n+ATOM 346 LP PHE E 1 -11.766 3.894 -5.148 1.00 0.00 EP \n+ATOM 347 N PHE E 2 -13.512 7.952 -2.342 1.00 0.00 N \n+ATOM 348 DN PHE E 2 -13.512 7.952 -2.342 1.00 0.00 EP \n+ATOM 349 H PHE E 2 -13.694 8.683 -1.691 1.00 0.00 H \n+ATOM 350 CA PHE E 2 -13.239 6.646 -1.763 1.00 0.00 C \n+ATOM 351 DCA PHE E 2 -13.239 6.646 -1.763 1.00 0.00 EP \n+ATOM 352 HA PHE E 2 -12.766 6.017 -2.499 1.00 0.00 H \n+ATOM 353 C PHE E 2 -12.200 6.761 -0.665 1.00 0.00 C \n+ATOM 354 DC PHE E 2 -12.200 6.761 -0.665 1.00 0.00 EP \n+ATOM 355 O PHE E 2 -11.008 6.580 -0.907 1.00 0.00 O \n+ATOM 356 DO PHE E 2 -11.008 6.580 -0.907 1.00 0.00 EP \n+ATOM 357 LPOA PHE E 2 -11.069 6.526 -1.196 1.00 0.00 EP \n+ATOM 358 LPOB PHE E 2 -10.936 6.632 -0.621 1.00 0.00 EP \n+ATOM 359 CB PHE E 2 -14.521 5.931 -1.253 1.00 0.00 C \n+ATOM 360 DCB PHE E 2 -14.521 5.931 -1.253 1.00 0.00 EP \n+ATOM 361 HB3 PHE E 2 -14.279 5.047 -0.623 1.00 0.00 H \n+ATOM 362 HB2 PHE E 2 -15.162 6.621 -0.665 1.00 0.00 H \n+ATOM 363 CG PHE E 2 -15.280 5.433 -2.448 1.00 0.00 C \n+ATOM 364 DCG PHE E 2 -15.280 5.433 -2.448 1.00 0.00 EP \n+ATOM 365 CD1 PHE E 2 -16.370 6.150 -2.966 1.00 0.00 C \n+ATOM 366 DCD1 PHE E 2 -16.370 6.150 -2.966 1.00 0.00 EP \n+ATOM 367 HD1 PHE E 2 -16.695 7.058 -2.482 1.00 0.00 H \n+ATOM 368 CD2 PHE E 2 -14.854 4.265 -3.104 1.00 0.00 C \n+ATOM 369 DCD2 PHE E 2 -14.854 4.265 -3.104 1.00 0.00 EP \n+ATOM 370 HD2 PHE E 2 -14.008 3.714 -2.723 1.00 0.00 H \n+ATOM 371 CE1 PHE E 2 -16.993 5.733 -4.148 1.00 0.00 C \n+ATOM 372 DCE1 PHE E 2 -16.993 5.733 -4.148 1.00 0.00 EP \n+ATOM 373 HE1 PHE E 2 -17.787 6.322 -4.584 1.00 0.00 H \n+ATOM 374 CE2 PHE E 2 -15.477 3.845 -4.285 1.00 0.00 C \n+ATOM 375 DCE2 PHE E 2 -15.477 3.845 -4.285 1.00 0.00 EP \n+ATOM 376 HE2 PHE E 2 -15.114 2.974 -4.811 1.00 0.00 H \n+ATOM 377 CZ PHE E 2 -16.541 4.586 -4.812 1.00 0.00 C \n+ATOM 378 DCZ PHE E 2 -16.541 4.586 -4.812 1.00 0.00 EP \n+ATOM 379 HZ PHE E 2 -16.989 4.299 -5.754 1.00 0.00 H \n+ATOM 380 LP PHE E 2 -15.942 4.983 -3.620 1.00 0.00 EP \n+ATOM 381 N PHE E 3 -12.648 7.055 0.563 1.00 0.00 N \n+ATOM 382 DN PHE E 3 -12.648 7.055 0.563 1.00 0.00 EP \n+ATOM 383 H PHE E 3 -13.601 7.257 0.793 1.00 0.00 H \n+ATOM 384 CA PHE E 3 -11.853 7.132 1.759 1.00 0.00 C \n+ATOM 385 DCA PHE E 3 -11.853 7.132 1.759 1.00 0.00 EP \n+ATOM 386 HA PHE E 3 -11.023 7.800 1.581 1.00 0.00 H \n+ATOM 387 C PHE E 3 -12.733 7.817 2.839 1.00 0.00 C \n+ATOM 388 DC PHE E 3 -12.733 7.817 2.839 1.00 0.00 EP \n+ATOM 389 CB PHE E 3 -11.319 5.739 2.224 1.00 0.00 C \n+ATOM 390 DCB PHE E 3 -11.319 5.739 2.224 1.00 0.00 EP \n+ATOM 391 HB3 PHE E 3 -10.454 5.472 1.581 1.00 0.00 H \n+ATOM 392 HB2 PHE E 3 -10.969 5.798 3.275 1.00 0.00 H \n+ATOM 393 CG PHE E 3 -12.355 4.641 2.117 1.00 0.00 C \n+ATOM 394 DCG PHE E 3 -12.355 4.641 2.117 1.00 0.00 EP \n+ATOM 395 CD1 PHE E 3 -13.442 4.588 3.005 1.00 0.00 C \n+ATOM 396 DCD1 PHE E 3 -13.442 4.588 3.005 1.00 0.00 EP \n+ATOM 397 HD1 PHE E 3 -13.544 5.358 3.757 1.00 0.00 H \n+ATOM 398 CD2 PHE E 3 -12.236 3.640 1.135 1.00 0.00 C \n+ATOM 399 DCD2 PHE E 3 -12.236 3.640 1.135 1.00 0.00 EP \n+ATOM 400 HD2 PHE E 3 -11.406 3.675 0.445 1.00 0.00 H \n+ATOM 401 CE1 PHE E 3 -14.402 3.574 2.902 1.00 0.00 C \n+ATOM 402 DCE1 PHE E 3 -14.402 3.574 2.902 1.00 0.00 EP \n+ATOM 403 HE1 PHE E 3 -15.241 3.561 3.581 1.00 0.00 H \n+ATOM 404 CE2 PHE E 3 -13.192 2.622 1.028 1.00 0.00 C \n+ATOM 405 DCE2 PHE E 3 -13.192 2.622 1.028 1.00 0.00 EP \n+ATOM 406 HE2 PHE E 3 -13.095 1.868 0.261 1.00 0.00 H \n+ATOM 407 CZ PHE E 3 -14.277 2.590 1.912 1.00 0.00 C \n+ATOM 408 DCZ PHE E 3 -14.277 2.590 1.912 1.00 0.00 EP \n+ATOM 409 HZ PHE E 3 -15.021 1.812 1.827 1.00 0.00 H \n+ATOM 410 LP PHE E 3 -13.313 3.598 2.024 1.00 0.00 EP \n+ATOM 411 O PHE E 3 -12.209 8.093 3.951 1.00 0.00 O \n+ATOM 412 DOT1 PHE E 3 -12.209 8.093 3.951 1.00 0.00 EP \n+ATOM 413 OXT PHE E 3 -13.935 8.081 2.549 1.00 0.00 O \n+ATOM 414 DOT2 PHE E 3 -13.935 8.081 2.549 1.00 0.00 EP \n+ATOM 415 LPT1 PHE E 3 -12.443 8.249 4.158 1.00 0.00 EP \n+ATOM 416 LPT2 PHE E 3 -11.875 7.989 3.955 1.00 0.00 EP \n+ATOM 417 LPT3 PHE E 3 -14.092 8.238 2.819 1.00 0.00 EP \n+ATOM 418 LPT4 PHE E 3 -14.006 7.974 2.223 1.00 0.00 EP \n+TER 419 PHE E 3\n+ATOM 420 N GLY F 1 -7.248 -0.819 20.800 1.00 0.00 N \n+ATOM 421 DN GLY F 1 -7.248 -0.819 20.800 1.00 0.00 EP \n+ATOM 422 H GLY F 1 -6.330 -0.582 21.218 1.00 0.00 H \n+ATOM 423 H2 GLY F 1 -7.716 -1.546 21.415 1.00 0.00 H \n+ATOM 424 H3 GLY F 1 -6.966 -1.296 19.893 1.00 0.00 H \n+ATOM 425 CA GLY F 1 -8.113 0.352 20.490 1.00 0.00 C \n+ATOM 426 DCA GLY F 1 -8.113 0.352 20.490 1.00 0.00 EP \n+ATOM 427 HA3 GLY F 1 -8.450 0.763 21.430 1.00 0.00 H \n+ATOM 428 HA2 GLY F 1 -7.512 1.033 19.909 1.00 0.00 H \n+ATOM 429 C GLY F 1 -9.343 -0.020 19.699 1.00 0.00 C \n+ATOM 430 DC GLY F 1 -9.343 -0.020 19.699 1.00 0.00 EP \n+ATOM 431 O GLY F 1 -9.995 -1.013 19.993 1.00 0.00 O \n+ATOM 432 DO GLY F 1 -9.995 -1.013 19.993 1.00 0.00 EP \n+ATOM 433 LPOA GLY F 1 -9.808 -1.075 20.219 1.00 0.00 EP \n+ATOM 434 LPOB GLY F 1 -10.187 -0.960 19.769 1.00 0.00 EP \n+ATOM 435 N GLY F 2 -9.764 0.721 18.653 1.00 0.00 N \n+ATOM 436 DN GLY F 2 -9.764 0.721 18.653 1.00 0.00 EP \n+ATOM 437 H GLY F 2 -10.578 0.344 18.219 1.00 0.00 H \n+ATOM 438 CA GLY F 2 -9.230 1.963 18.090 1.00 0.00 C \n+ATOM 439 DCA GLY F 2 -9.230 1.963 18.090 1.00 0.00 EP \n+ATOM 440 HA3 GLY F 2 -9.755 2.130 17.161 1.00 0.00 H \n+ATOM 441 HA2 GLY F 2 -8.167 1.843 17.941 1.00 0.00 H \n+ATOM 442 C GLY F 2 -9.437 3.193 18.944 1.00 0.00 C \n+ATOM 443 DC GLY F 2 -9.437 3.193 18.944 1.00 0.00 EP \n+ATOM 444 O GLY F 2 -9.351 3.144 20.167 1.00 0.00 O \n+ATOM 445 DO GLY F 2 -9.351 3.144 20.167 1.00 0.00 EP \n+ATOM 446 LPOA GLY F 2 -9.290 2.850 20.156 1.00 0.00 EP \n+ATOM 447 LPOB GLY F 2 -9.411 3.437 20.188 1.00 0.00 EP \n+ATOM 448 N GLY F 3 -9.687 4.346 18.298 1.00 0.00 N \n+ATOM 449 DN GLY F 3 -9.687 4.346 18.298 1.00 0.00 EP \n+ATOM 450 H GLY F 3 -9.764 4.421 17.304 1.00 0.00 H \n+ATOM 451 CA GLY F 3 -9.968 5.608 18.956 1.00 0.00 C \n+ATOM 452 DCA GLY F 3 -9.968 5.608 18.956 1.00 0.00 EP \n+ATOM 453 HA3 GLY F 3 -9.052 5.997 19.376 1.00 0.00 H \n+ATOM 454 HA2 GLY F 3 -10.754 5.462 19.681 1.00 0.00 H \n+ATOM 455 C GLY F 3 -10.479 6.610 17.918 1.00 0.00 C \n+ATOM 456 DC GLY F 3 -10.479 6.610 17.918 1.00 0.00 EP \n+ATOM 457 O GLY F 3 -10.878 7.744 18.295 1.00 0.00 O \n+ATOM 458 DOT1 GLY F 3 -10.878 7.744 18.295 1.00 0.00 EP \n+ATOM 459 OXT GLY F 3 -10.508 6.284 16.699 1.00 0.00 O \n+ATOM 460 DOT2 GLY F 3 -10.508 6.284 16.699 1.00 0.00 EP \n+ATOM 461 LPT1 GLY F 3 -10.987 7.930 18.019 1.00 0.00 EP \n+ATOM 462 LPT2 GLY F 3 -10.844 7.773 18.642 1.00 0.00 EP \n+ATOM 463 LPT3 GLY F 3 -10.637 6.547 16.507 1.00 0.00 EP \n+ATOM 464 LPT4 GLY F 3 -10.385 5.959 16.659 1.00 0.00 EP \n+TER 465 GLY F 3\n+ATOM 466 N HIS G 1 -14.811 13.896 -17.361 1.00 0.00 N \n+ATOM 467 DN HIS G 1 -14.811 13.896 -17.361 1.00 0.00 EP \n+ATOM 468 H HIS G 1 -14.918 13.933 -16.304 1.00 0.00 H \n+ATOM 469 H2 HIS G 1 -14.455 12.914 -17.435 1.00 0.00 H \n+ATOM 470 H3 HIS G 1 -15.778 13.985 -17.746 1.00 0.00 H \n+ATOM 471 CA HIS G 1 -13.826 14.917 -17.799 1.00 0.00 C \n+ATOM 472 DCA HIS G 1 -13.826 14.917 -17.799 1.00 0.00 EP \n+ATOM 473 HA HIS G 1 -13.743 14.821 -18.872 1.00 0.00 H \n+ATOM 474 C HIS G 1 -14.409 16.290 -17.532 1.00 0.00 C \n+ATOM 475 DC HIS G 1 -14.409 16.290 -17.532 1.00 0.00 EP \n+ATOM 476 O HIS G 1 -14.743 16.995 -18.478 1.00 0.00 O \n+ATOM 477 DO HIS G 1 -14.743 16.995 -18.478 1.00 0.00 EP \n+ATOM 478 LPOA HIS G 1 -14.658 16.783 -18.673 1.00 0.00 EP \n+ATOM 479 LPOB HIS G 1 -14.831 17.213 -18.292 1.00 0.00 EP \n+ATOM 480 CB HIS G 1 -12.417 14.646 -17.158 1.00 0.00 C \n+ATOM 481 DCB HIS G 1 -12.417 14.646 -17.158 1.00 0.00 EP \n+ATOM 482 HB3 HIS G 1 -12.273 13.560 -16.969 1.00 0.00 H \n+ATOM 483 HB2 HIS G 1 -11.650 14.939 -17.909 1.00 0.00 H \n+ATOM 484 ND1 HIS G 1 -11.593 16.691 -15.896 1.00 0.00 N \n+ATOM 485 DND1 HIS G 1 -11.593 16.691 -15.896 1.00 0.00 EP \n+ATOM 486 HD1 HIS G 1 -11.462 17.290 -16.701 1.00 0.00 H \n+ATOM 487 CG HIS G 1 -12.078 15.400 -15.898 1.00 0.00 C \n+ATOM 488 DCG HIS G 1 -12.078 15.400 -15.898 1.00 0.00 EP \n+ATOM 489 CE1 HIS G 1 -11.413 17.046 -14.604 1.00 0.00 C \n+ATOM 490 DCE1 HIS G 1 -11.413 17.046 -14.604 1.00 0.00 EP \n+ATOM 491 HE1 HIS G 1 -11.102 18.046 -14.298 1.00 0.00 H \n+ATOM 492 NE2 HIS G 1 -11.716 16.065 -13.780 1.00 0.00 N \n+ATOM 493 DNE2 HIS G 1 -11.716 16.065 -13.780 1.00 0.00 EP \n+ATOM 494 LPE2 HIS G 1 -11.694 16.079 -13.431 1.00 0.00 EP \n+ATOM 495 CD2 HIS G 1 -12.123 15.019 -14.590 1.00 0.00 C \n+ATOM 496 DCD2 HIS G 1 -12.123 15.019 -14.590 1.00 0.00 EP \n+ATOM 497 HD2 HIS G 1 -12.435 14.077 -14.153 1.00 0.00 H \n+ATOM 498 LPA HIS G 1 -11.813 16.014 -14.964 1.00 0.00 EP \n+ATOM 499 N HIS G 2 -14.639 16.647 -16.248 1.00 0.00 N \n+ATOM 500 DN HIS G 2 -14.639 16.647 -16.248 1.00 0.00 EP \n+ATOM 501 H HIS G 2 -14.264 16.102 -15.498 1.00 0.00 H \n+ATOM 502 CA HIS G 2 -15.429 17.793 -15.824 1.00 0.00 C \n+ATOM 503 DCA HIS G 2 -15.429 17.793 -15.824 1.00 0.00 EP \n+ATOM 504 HA HIS G 2 -15.534 17.682 -14.756 1.00 0.00 H \n+ATOM 505 C HIS G 2 -14.678 19.107 -16.015 1.00 0.00 C \n+ATOM 506 DC HIS G 2 -14.678 19.107 -16.015 1.00 0.00 EP \n+ATOM 507 O HIS G 2 -13.628 19.312 -15.408 1.00 0.00 O \n+ATOM 508 DO HIS G 2 -13.628 19.312 -15.408 1.00 0.00 EP \n+ATOM 509 LPOA HIS G 2 -13.645 19.043 -15.276 1.00 0.00 EP \n+ATOM 510 LPOB HIS G 2 -13.601 19.582 -15.535 1.00 0.00 EP \n+ATOM 511 CB HIS G 2 -16.864 17.764 -16.434 1.00 0.00 C \n+ATOM 512 DCB HIS G 2 -16.864 17.764 -16.434 1.00 0.00 EP \n+ATOM 513 HB3 HIS G 2 -16.865 18.190 -17.460 1.00 0.00 H \n+ATOM 514 HB2 HIS G 2 -17.561 18.363 -15.810 1.00 0.00 H \n+ATOM 515 ND1 HIS G 2 -17.419 15.402 -15.582 1.00 0.00 N \n+ATOM 516 DND1 HIS G 2 -17.419 15.402 -15.582 1.00 0.00 EP \n+ATOM 517 HD1 HIS G 2 -17.163 15.530 -14.622 1.00 0.00 H \n+ATOM 518 CG HIS G 2 -17.363 16.346 -16.589 1.00 0.00 C \n+ATOM 519 DCG HIS G 2 -17.363 16.346 -16.589 1.00 0.00 EP \n+ATOM 520 CE1 HIS G 2 -17.663 14.205 -16.168 1.00 0.00 C \n+ATOM 521 DCE1 HIS G 2 -17.663 14.205 -16.168 1.00 0.00 EP \n+ATOM 522 HE1 HIS G 2 -17.703 13.269 -15.604 1.00 0.00 H \n+ATOM 523 NE2 HIS G 2 -17.752 14.314 -17.483 1.00 0.00 N \n+ATOM 524 DNE2 HIS G 2 -17.752 14.314 -17.483 1.00 0.00 EP \n+ATOM 525 LPE2 HIS G 2 -17.803 14.050 -17.707 1.00 0.00 EP \n+ATOM 526 CD2 HIS G 2 -17.600 15.666 -17.744 1.00 0.00 C \n+ATOM 527 DCD2 HIS G 2 -17.600 15.666 -17.744 1.00 0.00 EP \n+ATOM 528 HD2 HIS G 2 -17.606 16.032 -18.765 1.00 0.00 H \n+ATOM 529 LPA HIS G 2 -17.555 15.219 -16.733 1.00 0.00 EP \n+ATOM 530 N HIS G 3 -15.193 20.023 -16.846 1.00 0.00 N \n+ATOM 531 DN HIS G 3 -15.193 20.023 -16.846 1.00 0.00 EP \n+ATOM 532 H HIS G 3 -16.099 19.975 -17.263 1.00 0.00 H \n+ATOM 533 CA HIS G 3 -14.569 21.277 -17.177 1.00 0.00 C \n+ATOM 534 DCA HIS G 3 -14.569 21.277 -17.177 1.00 0.00 EP \n+ATOM 535 HA HIS G 3 -14.057 21.677 -16.314 1.00 0.00 H \n+ATOM 536 C HIS G 3 -15.703 22.254 -17.548 1.00 0.00 C \n+ATOM 537 DC HIS G 3 -15.703 22.254 -17.548 1.00 0.00 EP \n+ATOM 538 CB HIS G 3 -13.635 21.152 -18.407 1.00 0.00 C \n+ATOM 539 DCB HIS G 3 -13.635 21.152 -18.407 1.00 0.00 EP \n+ATOM 540 HB3 HIS G 3 -14.242 20.810 -19.273 1.00 0.00 H \n+ATOM 541 HB2 HIS G 3 -13.220 22.153 -18.656 1.00 0.00 H \n+ATOM 542 ND1 HIS G 3 -11.430 20.412 -17.384 1.00 0.00 N \n+ATOM 543 DND1 HIS G 3 -11.430 20.412 -17.384 1.00 0.00 EP \n+ATOM 544 HD1 HIS G 3 -11.354 21.188 -16.758 1.00 0.00 H \n+ATOM 545 CG HIS G 3 -12.511 20.173 -18.202 1.00 0.00 C \n+ATOM 546 DCG HIS G 3 -12.511 20.173 -18.202 1.00 0.00 EP \n+ATOM 547 CE1 HIS G 3 -10.617 19.334 -17.471 1.00 0.00 C \n+ATOM 548 DCE1 HIS G 3 -10.617 19.334 -17.471 1.00 0.00 EP \n+ATOM 549 HE1 HIS G 3 -9.686 19.243 -16.911 1.00 0.00 H \n+ATOM 550 NE2 HIS G 3 -11.097 18.417 -18.290 1.00 0.00 N \n+ATOM 551 DNE2 HIS G 3 -11.097 18.417 -18.290 1.00 0.00 EP \n+ATOM 552 LPE2 HIS G 3 -10.946 18.109 -18.364 1.00 0.00 EP \n+ATOM 553 CD2 HIS G 3 -12.288 18.953 -18.762 1.00 0.00 C \n+ATOM 554 DCD2 HIS G 3 -12.288 18.953 -18.762 1.00 0.00 EP \n+ATOM 555 HD2 HIS G 3 -12.894 18.414 -19.479 1.00 0.00 H \n+ATOM 556 LPA HIS G 3 -11.624 19.458 -18.039 1.00 0.00 EP \n+ATOM 557 O HIS G 3 -15.404 23.466 -17.707 1.00 0.00 O \n+ATOM 558 DOT1 HIS G 3 -15.404 23.466 -17.707 1.00 0.00 EP \n+ATOM 559 OXT HIS G 3 -16.867 21.786 -17.694 1.00 0.00 O \n+ATOM 560 DOT2 HIS G 3 -16.867 21.786 -17.694 1.00 0.00 EP \n+ATOM 561 LPT1 HIS G 3 -15.689 23.649 -17.797 1.00 0.00 EP \n+ATOM 562 LPT2 HIS G 3 -15.062 23.514 -17.648 1.00 0.00 EP \n+ATOM 563 LPT3 HIS G 3 -17.088 22.042 -17.784 1.00 0.00 EP \n+ATOM 564 LPT4 HIS G 3 -16.866 21.441 -17.632 1.00 0.00 EP \n+TER 565 HIS G 3\n+ATOM 566 N ILE H 1 -15.341 19.553 0.370 1.00 0.00 N \n+ATOM 567 DN ILE H 1 -15.341 19.553 0.370 1.00 0.00 EP \n+ATOM 568 H ILE H 1 -14.883 19.679 -0.552 1.00 0.00 H \n+ATOM 569 H2 ILE H 1 -15.794 18.617 0.410 1.00 0.00 H \n+ATOM 570 H3 ILE H 1 -16.079 20.278 0.523 1.00 0.00 H \n+ATOM 571 CA ILE H 1 -14.356 19.651 1.502 1.00 0.00 C \n+ATOM 572 DCA ILE H 1 -14.356 19.651 1.502 1.00 0.00 EP \n+ATOM 573 HA ILE H 1 -13.676 20.463 1.279 1.00 0.00 H \n+ATOM 574 C ILE H 1 -15.097 20.060 2.762 1.00 0.00 C \n+ATOM 575 DC ILE H 1 -15.097 20.060 2.762 1.00 0.00 EP \n+ATOM 576 O ILE H 1 -16.200 20.577 2.625 1.00 0.00 O \n+ATOM 577 DO ILE H 1 -16.200 20.577 2.625 1.00 0.00 EP \n+ATOM 578 LPOA ILE H 1 -16.179 20.554 2.326 1.00 0.00 EP \n+ATOM 579 LPOB ILE H 1 -16.230 20.604 2.922 1.00 0.00 EP \n+ATOM 580 CB ILE H 1 -13.574 18.342 1.629 1.00 0.00 C \n+ATOM 581 DCB ILE H 1 -13.574 18.342 1.629 1.00 0.00 EP \n+ATOM 582 HB ILE H 1 -12.876 18.421 2.498 1.00 0.00 H \n+ATOM 583 CG2 ILE H 1 -14.520 17.142 1.879 1.00 0.00 C \n+ATOM 584 DCG2 ILE H 1 -14.520 17.142 1.879 1.00 0.00 EP \n+ATOM 585 HG21 ILE H 1 -13.919 16.229 2.091 1.00 0.00 H \n+ATOM 586 HG22 ILE H 1 -15.149 16.907 0.996 1.00 0.00 H \n+ATOM 587 HG23 ILE H 1 -15.178 17.301 2.760 1.00 0.00 H \n+ATOM 588 CG1 ILE H 1 -12.669 18.120 0.391 1.00 0.00 C \n+ATOM 589 DCG1 ILE H 1 -12.669 18.120 0.391 1.00 0.00 EP \n+ATOM 590 HG13 ILE H 1 -12.130 19.066 0.153 1.00 0.00 H \n+ATOM 591 HG12 ILE H 1 -13.282 17.843 -0.496 1.00 0.00 H \n+ATOM 592 CD1 ILE H 1 -11.612 17.031 0.612 1.00 0.00 C \n+ATOM 593 DCD1 ILE H 1 -11.612 17.031 0.612 1.00 0.00 EP \n+ATOM 594 HD11 ILE H 1 -12.082 16.038 0.778 1.00 0.00 H \n+ATOM 595 HD12 ILE H 1 -10.951 16.943 -0.279 1.00 0.00 H \n+ATOM 596 HD13 ILE H 1 -10.972 17.264 1.490 1.00 0.00 H \n+ATOM 597 N ILE H 2 -14.535 19.874 3.979 1.00 0.00 N \n+ATOM 598 DN ILE H 2 -14.535 19.874 3.979 1.00 0.00 EP \n+ATOM 599 H ILE H 2 -13.635 19.467 4.100 1.00 0.00 H \n+ATOM 600 CA ILE H 2 -15.202 20.230 5.230 1.00 0.00 C \n+ATOM 601 DCA ILE H 2 -15.202 20.230 5.230 1.00 0.00 EP \n+ATOM 602 HA ILE H 2 -16.144 20.706 4.990 1.00 0.00 H \n+ATOM 603 C ILE H 2 -15.634 18.971 5.985 1.00 0.00 C \n+ATOM 604 DC ILE H 2 -15.634 18.971 5.985 1.00 0.00 EP \n+ATOM 605 O ILE H 2 -16.817 18.653 5.999 1.00 0.00 O \n+ATOM 606 DO ILE H 2 -16.817 18.653 5.999 1.00 0.00 EP \n+ATOM 607 LPOA ILE H 2 -16.888 18.891 5.831 1.00 0.00 EP \n+ATOM 608 LPOB ILE H 2 -16.756 18.412 6.167 1.00 0.00 EP \n+ATOM 609 CB ILE H 2 -14.447 21.270 6.066 1.00 0.00 C \n+ATOM 610 DCB ILE H 2 -14.447 21.270 6.066 1.00 0.00 EP \n+ATOM 611 HB ILE H 2 -13.409 20.920 6.260 1.00 0.00 H \n+ATOM 612 CG2 ILE H 2 -14.332 22.573 5.239 1.00 0.00 C \n+ATOM 613 DCG2 ILE H 2 -14.332 22.573 5.239 1.00 0.00 EP \n+ATOM 614 HG21 ILE H 2 -13.844 23.365 5.846 1.00 0.00 H \n+ATOM 615 HG22 ILE H 2 -15.336 22.937 4.934 1.00 0.00 H \n+ATOM 616 HG23 ILE H 2 -13.721 22.416 4.327 1.00 0.00 H \n+ATOM 617 CG1 ILE H 2 -15.095 21.553 7.451 1.00 0.00 C \n+ATOM 618 DCG1 ILE H 2 -15.095 21.553 7.451 1.00 0.00 EP \n+ATOM 619 HG13 ILE H 2 -15.027 20.639 8.083 1.00 0.00 H \n+ATOM 620 HG12 ILE H 2 -14.479 22.331 7.956 1.00 0.00 H \n+ATOM 621 CD1 ILE H 2 -16.555 22.027 7.406 1.00 0.00 C \n+ATOM 622 DCD1 ILE H 2 -16.555 22.027 7.406 1.00 0.00 EP \n+ATOM 623 HD11 ILE H 2 -16.654 22.960 6.811 1.00 0.00 H \n+ATOM 624 HD12 ILE H 2 -17.212 21.252 6.957 1.00 0.00 H \n+ATOM 625 HD13 ILE H 2 -16.925 22.233 8.433 1.00 0.00 H \n+ATOM 626 N ILE H 3 -14.765 18.174 6.638 1.00 0.00 N \n+ATOM 627 DN ILE H 3 -14.765 18.174 6.638 1.00 0.00 EP \n+ATOM 628 H ILE H 3 -15.175 17.436 7.162 1.00 0.00 H \n+ATOM 629 CA ILE H 3 -13.315 18.208 6.702 1.00 0.00 C \n+ATOM 630 DCA ILE H 3 -13.315 18.208 6.702 1.00 0.00 EP \n+ATOM 631 HA ILE H 3 -12.928 18.914 5.988 1.00 0.00 H \n+ATOM 632 C ILE H 3 -12.897 18.678 8.109 1.00 0.00 C \n+ATOM 633 DC ILE H 3 -12.897 18.678 8.109 1.00 0.00 EP \n+ATOM 634 CB ILE H 3 -12.678 16.847 6.404 1.00 0.00 C \n+ATOM 635 DCB ILE H 3 -12.678 16.847 6.404 1.00 0.00 EP \n+ATOM 636 HB ILE H 3 -12.994 16.124 7.192 1.00 0.00 H \n+ATOM 637 CG2 ILE H 3 -11.137 16.989 6.445 1.00 0.00 C \n+ATOM 638 DCG2 ILE H 3 -11.137 16.989 6.445 1.00 0.00 EP \n+ATOM 639 HG21 ILE H 3 -10.792 17.348 7.437 1.00 0.00 H \n+ATOM 640 HG22 ILE H 3 -10.646 16.012 6.258 1.00 0.00 H \n+ATOM 641 HG23 ILE H 3 -10.793 17.709 5.674 1.00 0.00 H \n+ATOM 642 CG1 ILE H 3 -13.151 16.289 5.037 1.00 0.00 C \n+ATOM 643 DCG1 ILE H 3 -13.151 16.289 5.037 1.00 0.00 EP \n+ATOM 644 HG13 ILE H 3 -12.792 16.971 4.240 1.00 0.00 H \n+ATOM 645 HG12 ILE H 3 -14.263 16.272 5.002 1.00 0.00 H \n+ATOM 646 CD1 ILE H 3 -12.660 14.867 4.739 1.00 0.00 C \n+ATOM 647 DCD1 ILE H 3 -12.660 14.867 4.739 1.00 0.00 EP \n+ATOM 648 HD11 ILE H 3 -11.555 14.832 4.635 1.00 0.00 H \n+ATOM 649 HD12 ILE H 3 -12.955 14.171 5.554 1.00 0.00 H \n+ATOM 650 HD13 ILE H 3 -13.102 14.489 3.792 1.00 0.00 H \n+ATOM 651 O ILE H 3 -12.225 19.737 8.216 1.00 0.00 O \n+ATOM 652 DOT1 ILE H 3 -12.225 19.737 8.216 1.00 0.00 EP \n+ATOM 653 OXT ILE H 3 -13.219 18.004 9.126 1.00 0.00 O \n+ATOM 654 DOT2 ILE H 3 -13.219 18.004 9.126 1.00 0.00 EP \n+ATOM 655 LPT1 ILE H 3 -12.153 19.799 8.552 1.00 0.00 EP \n+ATOM 656 LPT2 ILE H 3 -12.169 19.876 7.899 1.00 0.00 EP \n+ATOM 657 LPT3 ILE H 3 -13.095 18.157 9.415 1.00 0.00 EP \n+ATOM 658 LPT4 ILE H 3 -13.404 17.723 9.029 1.00 0.00 EP \n+TER 659 ILE H 3\n+ATOM 660 N LYS I 1 -12.560 15.382 12.882 1.00 0.00 N \n+ATOM 661 DN LYS I 1 -12.560 15.382 12.882 1.00 0.00 EP \n+ATOM 662 H LYS I 1 -11.791 15.038 12.280 1.00 0.00 H \n+ATOM 663 H2 LYS I 1 -13.465 15.302 12.381 1.00 0.00 H \n+ATOM 664 H3 LYS I 1 -12.383 16.419 13.055 1.00 0.00 H \n+ATOM 665 CA LYS I 1 -12.591 14.682 14.208 1.00 0.00 C \n+ATOM 666 DCA LYS I 1 -12.591 14.682 14.208 1.00 0.00 EP \n+ATOM 667 HA LYS I 1 -11.643 14.886 14.686 1.00 0.00 H \n+ATOM 668 C LYS I 1 -13.691 15.277 15.079 1.00 0.00 C \n+ATOM 669 DC LYS I 1 -13.691 15.277 15.079 1.00 0.00 EP \n+ATOM 670 O LYS I 1 -14.857 14.921 14.970 1.00 0.00 O \n+ATOM 671 DO LYS I 1 -14.857 14.921 14.970 1.00 0.00 EP \n+ATOM 672 LPOA LYS I 1 -14.783 14.728 14.752 1.00 0.00 EP \n+ATOM 673 LPOB LYS I 1 -14.940 15.110 15.187 1.00 0.00 EP \n+ATOM 674 CB LYS I 1 -12.750 13.138 14.027 1.00 0.00 C \n+ATOM 675 DCB LYS I 1 -12.750 13.138 14.027 1.00 0.00 EP \n+ATOM 676 HB3 LYS I 1 -12.146 12.816 13.147 1.00 0.00 H \n+ATOM 677 HB2 LYS I 1 -13.807 12.868 13.810 1.00 0.00 H \n+ATOM 678 CG LYS I 1 -12.222 12.316 15.225 1.00 0.00 C \n+ATOM 679 DCG LYS I 1 -12.222 12.316 15.225 1.00 0.00 EP \n+ATOM 680 HG3 LYS I 1 -12.806 12.580 16.136 1.00 0.00 H \n+ATOM 681 HG2 LYS I 1 -11.159 12.590 15.414 1.00 0.00 H \n+ATOM 682 CD LYS I 1 -12.302 10.787 15.006 1.00 0.00 C \n+ATOM 683 DCD LYS I 1 -12.302 10.787 15.006 1.00 0.00 EP \n+ATOM 684 HD3 LYS I 1 -11.745 10.534 14.075 1.00 0.00 H \n+ATOM 685 HD2 LYS I 1 -13.369 10.507 14.851 1.00 0.00 H \n+ATOM 686 CE LYS I 1 -11.722 9.969 16.179 1.00 0.00 C \n+ATOM 687 DCE LYS I 1 -11.722 9.969 16.179 1.00 0.00 EP \n+ATOM 688 HE3 LYS I 1 -12.280 10.189 17.117 1.00 0.00 H \n+ATOM 689 HE2 LYS I 1 -10.652 10.228 16.338 1.00 0.00 H \n+ATOM 690 NZ LYS I 1 -11.801 8.516 15.939 1.00 0.00 N \n+ATOM 691 DNZ LYS I 1 -11.801 8.516 15.939 1.00 0.00 EP \n+ATOM 692 HZ1 LYS I 1 -11.205 8.179 15.162 1.00 0.00 H \n+ATOM 693 HZ2 LYS I 1 -12.762 8.154 15.839 1.00 0.00 H \n+ATOM 694 HZ3 LYS I 1 -11.387 8.022 16.796 1.00 0.00 H \n+ATOM 695 N LYS I 2 -13.316 16.266 15.906 1.00 0.00 N \n+ATOM 696 DN LYS I 2 -13.316 16.266 15.906 1.00 0.00 EP \n+ATOM 697 H LYS I 2 -12.352 16.564 15.862 1.00 0.00 H \n+ATOM 698 CA LYS I 2 -14.192 17.250 16.506 1.00 0.00 C \n+ATOM 699 DCA LYS I 2 -14.192 17.250 16.506 1.00 0.00 EP \n+ATOM 700 HA LYS I 2 -14.711 17.758 15.703 1.00 0.00 H \n+ATOM 701 C LYS I 2 -13.340 18.308 17.210 1.00 0.00 C \n+ATOM 702 DC LYS I 2 -13.340 18.308 17.210 1.00 0.00 EP \n+ATOM 703 O LYS I 2 -13.361 18.421 18.437 1.00 0.00 O \n+ATOM 704 DO LYS I 2 -13.361 18.421 18.437 1.00 0.00 EP \n+ATOM 705 LPOA LYS I 2 -13.558 18.196 18.459 1.00 0.00 EP \n+ATOM 706 LPOB LYS I 2 -13.163 18.646 18.425 1.00 0.00 EP \n+ATOM 707 CB LYS I 2 -15.254 16.670 17.489 1.00 0.00 C \n+ATOM 708 DCB LYS I 2 -15.254 16.670 17.489 1.00 0.00 EP \n+ATOM 709 HB3 LYS I 2 -15.784 17.507 17.990 1.00 0.00 H \n+ATOM 710 HB2 LYS I 2 -16.030 16.138 16.890 1.00 0.00 H \n+ATOM 711 CG LYS I 2 -14.704 15.666 18.522 1.00 0.00 C \n+ATOM 712 DCG LYS I 2 -14.704 15.666 18.522 1.00 0.00 EP \n+ATOM 713 HG3 LYS I 2 -13.629 15.856 18.731 1.00 0.00 H \n+ATOM 714 HG2 LYS I 2 -14.752 14.654 18.051 1.00 0.00 H \n+ATOM 715 CD LYS I 2 -15.498 15.641 19.843 1.00 0.00 C \n+ATOM 716 DCD LYS I 2 -15.498 15.641 19.843 1.00 0.00 EP \n+ATOM 717 HD3 LYS I 2 -16.531 16.017 19.675 1.00 0.00 H \n+ATOM 718 HD2 LYS I 2 -15.600 14.573 20.153 1.00 0.00 H \n+ATOM 719 CE LYS I 2 -14.816 16.370 21.014 1.00 0.00 C \n+ATOM 720 DCE LYS I 2 -14.816 16.370 21.014 1.00 0.00 EP \n+ATOM 721 HE3 LYS I 2 -13.816 15.921 21.206 1.00 0.00 H \n+ATOM 722 HE2 LYS I 2 -15.430 16.285 21.937 1.00 0.00 H \n+ATOM 723 NZ LYS I 2 -14.623 17.807 20.722 1.00 0.00 N \n+ATOM 724 DNZ LYS I 2 -14.623 17.807 20.722 1.00 0.00 EP \n+ATOM 725 HZ1 LYS I 2 -14.075 17.916 19.827 1.00 0.00 H \n+ATOM 726 HZ2 LYS I 2 -15.536 18.281 20.593 1.00 0.00 H \n+ATOM 727 HZ3 LYS I 2 -14.091 18.270 21.483 1.00 0.00 H \n+ATOM 728 N LYS I 3 -12.529 19.129 16.516 1.00 0.00 N \n+ATOM 729 DN LYS I 3 -12.529 19.129 16.516 1.00 0.00 EP \n+ATOM 730 H LYS I 3 -11.920 19.701 17.054 1.00 0.00 H \n+ATOM 731 CA LYS I 3 -12.441 19.380 15.087 1.00 0.00 C \n+ATOM 732 DCA LYS I 3 -12.441 19.380 15.087 1.00 0.00 EP \n+ATOM 733 HA LYS I 3 -13.444 19.595 14.748 1.00 0.00 H \n+ATOM 734 C LYS I 3 -11.928 18.196 14.222 1.00 0.00 C \n+ATOM 735 DC LYS I 3 -11.928 18.196 14.222 1.00 0.00 EP \n+ATOM 736 CB LYS I 3 -11.559 20.643 14.868 1.00 0.00 C \n+ATOM 737 DCB LYS I 3 -11.559 20.643 14.868 1.00 0.00 EP \n+ATOM 738 HB3 LYS I 3 -12.054 21.499 15.379 1.00 0.00 H \n+ATOM 739 HB2 LYS I 3 -10.580 20.470 15.371 1.00 0.00 H \n+ATOM 740 CG LYS I 3 -11.281 21.035 13.404 1.00 0.00 C \n+ATOM 741 DCG LYS I 3 -11.281 21.035 13.404 1.00 0.00 EP \n+ATOM 742 HG3 LYS I 3 -10.660 21.959 13.381 1.00 0.00 H \n+ATOM 743 HG2 LYS I 3 -10.648 20.227 12.974 1.00 0.00 H \n+ATOM 744 CD LYS I 3 -12.554 21.260 12.561 1.00 0.00 C \n+ATOM 745 DCD LYS I 3 -12.554 21.260 12.561 1.00 0.00 EP \n+ATOM 746 HD3 LYS I 3 -12.891 22.313 12.691 1.00 0.00 H \n+ATOM 747 HD2 LYS I 3 -13.378 20.615 12.936 1.00 0.00 H \n+ATOM 748 CE LYS I 3 -12.404 20.954 11.064 1.00 0.00 C \n+ATOM 749 DCE LYS I 3 -12.404 20.954 11.064 1.00 0.00 EP \n+ATOM 750 HE3 LYS I 3 -11.657 21.617 10.578 1.00 0.00 H \n+ATOM 751 HE2 LYS I 3 -13.384 21.077 10.547 1.00 0.00 H \n+ATOM 752 NZ LYS I 3 -11.974 19.560 10.890 1.00 0.00 N \n+ATOM 753 DNZ LYS I 3 -11.974 19.560 10.890 1.00 0.00 EP \n+ATOM 754 HZ1 LYS I 3 -12.415 19.172 9.999 1.00 0.00 H \n+ATOM 755 HZ2 LYS I 3 -12.268 18.959 11.703 1.00 0.00 H \n+ATOM 756 HZ3 LYS I 3 -10.953 19.497 10.758 1.00 0.00 H \n+ATOM 757 O LYS I 3 -12.418 18.040 13.070 1.00 0.00 O \n+ATOM 758 DOT1 LYS I 3 -12.418 18.040 13.070 1.00 0.00 EP \n+ATOM 759 OXT LYS I 3 -11.131 17.353 14.705 1.00 0.00 O \n+ATOM 760 DOT2 LYS I 3 -11.131 17.353 14.705 1.00 0.00 EP \n+ATOM 761 LPT1 LYS I 3 -12.298 17.743 12.928 1.00 0.00 EP \n+ATOM 762 LPT2 LYS I 3 -12.631 18.307 12.993 1.00 0.00 EP \n+ATOM 763 LPT3 LYS I 3 -11.079 17.093 14.476 1.00 0.00 EP \n+ATOM 764 LPT4 LYS I 3 -11.031 17.452 15.025 1.00 0.00 EP \n+TER 765 LYS I 3\n+ATOM 766 N LEU J 1 2.127 -17.180 -19.772 1.00 0.00 N \n+ATOM 767 DN LEU J 1 2.127 -17.180 -19.772 1.00 0.00 EP \n+ATOM 768 H LEU J 1 2.340 -17.772 -20.618 1.00 0.00 H \n+ATOM 769 H2 LEU J 1 2.221 -17.452 -18.751 1.00 0.00 H \n+ATOM 770 H3 LEU J 1 1.341 -17.833 -19.699 1.00 0.00 H \n+ATOM 771 CA LEU J 1 3.642 -17.260 -19.709 1.00 0.00 C \n+ATOM 772 DCA LEU J 1 3.642 -17.260 -19.709 1.00 0.00 EP \n+ATOM 773 HA LEU J 1 4.064 -16.331 -20.077 1.00 0.00 H \n+ATOM 774 C LEU J 1 4.052 -17.427 -18.267 1.00 0.00 C \n+ATOM 775 DC LEU J 1 4.052 -17.427 -18.267 1.00 0.00 EP \n+ATOM 776 O LEU J 1 3.196 -17.802 -17.470 1.00 0.00 O \n+ATOM 777 DO LEU J 1 3.196 -17.802 -17.470 1.00 0.00 EP \n+ATOM 778 LPOA LEU J 1 2.991 -17.814 -17.689 1.00 0.00 EP \n+ATOM 779 LPOB LEU J 1 3.394 -17.793 -17.245 1.00 0.00 EP \n+ATOM 780 CB LEU J 1 4.091 -18.452 -20.593 1.00 0.00 C \n+ATOM 781 DCB LEU J 1 4.091 -18.452 -20.593 1.00 0.00 EP \n+ATOM 782 HB3 LEU J 1 3.742 -19.432 -20.203 1.00 0.00 H \n+ATOM 783 HB2 LEU J 1 5.207 -18.483 -20.547 1.00 0.00 H \n+ATOM 784 CG LEU J 1 3.734 -18.328 -22.096 1.00 0.00 C \n+ATOM 785 DCG LEU J 1 3.734 -18.328 -22.096 1.00 0.00 EP \n+ATOM 786 HG LEU J 1 3.806 -17.252 -22.393 1.00 0.00 H \n+ATOM 787 CD1 LEU J 1 2.340 -18.865 -22.464 1.00 0.00 C \n+ATOM 788 DCD1 LEU J 1 2.340 -18.865 -22.464 1.00 0.00 EP \n+ATOM 789 HD11 LEU J 1 1.510 -18.244 -22.078 1.00 0.00 H \n+ATOM 790 HD12 LEU J 1 2.239 -18.878 -23.573 1.00 0.00 H \n+ATOM 791 HD13 LEU J 1 2.221 -19.913 -22.113 1.00 0.00 H \n+ATOM 792 CD2 LEU J 1 4.787 -19.065 -22.937 1.00 0.00 C \n+ATOM 793 DCD2 LEU J 1 4.787 -19.065 -22.937 1.00 0.00 EP \n+ATOM 794 HD21 LEU J 1 5.796 -18.626 -22.761 1.00 0.00 H \n+ATOM 795 HD22 LEU J 1 4.566 -18.971 -24.021 1.00 0.00 H \n+ATOM 796 HD23 LEU J 1 4.826 -20.143 -22.675 1.00 0.00 H \n+ATOM 797 N LEU J 2 5.305 -17.118 -17.940 1.00 0.00 N \n+ATOM 798 DN LEU J 2 5.305 -17.118 -17.940 1.00 0.00 EP \n+ATOM 799 H LEU J 2 5.924 -16.851 -18.703 1.00 0.00 H \n+ATOM 800 CA LEU J 2 5.950 -17.234 -16.644 1.00 0.00 C \n+ATOM 801 DCA LEU J 2 5.950 -17.234 -16.644 1.00 0.00 EP \n+ATOM 802 HA LEU J 2 5.479 -18.018 -16.067 1.00 0.00 H \n+ATOM 803 C LEU J 2 7.357 -17.689 -16.981 1.00 0.00 C \n+ATOM 804 DC LEU J 2 7.357 -17.689 -16.981 1.00 0.00 EP \n+ATOM 805 O LEU J 2 7.903 -18.603 -16.371 1.00 0.00 O \n+ATOM 806 DO LEU J 2 7.903 -18.603 -16.371 1.00 0.00 EP \n+ATOM 807 LPOA LEU J 2 7.661 -18.639 -16.198 1.00 0.00 EP \n+ATOM 808 LPOB LEU J 2 8.150 -18.575 -16.539 1.00 0.00 EP \n+ATOM 809 CB LEU J 2 6.006 -15.900 -15.845 1.00 0.00 C \n+ATOM 810 DCB LEU J 2 6.006 -15.900 -15.845 1.00 0.00 EP \n+ATOM 811 HB3 LEU J 2 6.604 -15.136 -16.387 1.00 0.00 H \n+ATOM 812 HB2 LEU J 2 6.537 -16.117 -14.889 1.00 0.00 H \n+ATOM 813 CG LEU J 2 4.633 -15.282 -15.495 1.00 0.00 C \n+ATOM 814 DCG LEU J 2 4.633 -15.282 -15.495 1.00 0.00 EP \n+ATOM 815 HG LEU J 2 3.880 -16.104 -15.459 1.00 0.00 H \n+ATOM 816 CD1 LEU J 2 4.185 -14.236 -16.529 1.00 0.00 C \n+ATOM 817 DCD1 LEU J 2 4.185 -14.236 -16.529 1.00 0.00 EP \n+ATOM 818 HD11 LEU J 2 4.149 -14.666 -17.549 1.00 0.00 H \n+ATOM 819 HD12 LEU J 2 4.897 -13.383 -16.540 1.00 0.00 H \n+ATOM 820 HD13 LEU J 2 3.179 -13.844 -16.271 1.00 0.00 H \n+ATOM 821 CD2 LEU J 2 4.669 -14.634 -14.101 1.00 0.00 C \n+ATOM 822 DCD2 LEU J 2 4.669 -14.634 -14.101 1.00 0.00 EP \n+ATOM 823 HD21 LEU J 2 4.940 -15.384 -13.328 1.00 0.00 H \n+ATOM 824 HD22 LEU J 2 5.420 -13.815 -14.076 1.00 0.00 H \n+ATOM 825 HD23 LEU J 2 3.676 -14.208 -13.844 1.00 0.00 H \n+ATOM 826 N LEU J 3 7.889 -17.043 -18.036 1.00 0.00 N \n+ATOM 827 DN LEU J 3 7.889 -17.043 -18.036 1.00 0.00 EP \n+ATOM 828 H LEU J 3 7.500 -16.173 -18.318 1.00 0.00 H \n+ATOM 829 CA LEU J 3 8.546 -17.619 -19.193 1.00 0.00 C \n+ATOM 830 DCA LEU J 3 8.546 -17.619 -19.193 1.00 0.00 EP \n+ATOM 831 HA LEU J 3 9.502 -17.127 -19.288 1.00 0.00 H \n+ATOM 832 C LEU J 3 7.685 -17.150 -20.405 1.00 0.00 C \n+ATOM 833 DC LEU J 3 7.685 -17.150 -20.405 1.00 0.00 EP \n+ATOM 834 CB LEU J 3 8.795 -19.165 -19.202 1.00 0.00 C \n+ATOM 835 DCB LEU J 3 8.795 -19.165 -19.202 1.00 0.00 EP \n+ATOM 836 HB3 LEU J 3 9.443 -19.400 -20.075 1.00 0.00 H \n+ATOM 837 HB2 LEU J 3 9.385 -19.396 -18.290 1.00 0.00 H \n+ATOM 838 CG LEU J 3 7.564 -20.106 -19.250 1.00 0.00 C \n+ATOM 839 DCG LEU J 3 7.564 -20.106 -19.250 1.00 0.00 EP \n+ATOM 840 HG LEU J 3 6.671 -19.541 -18.903 1.00 0.00 H \n+ATOM 841 CD1 LEU J 3 7.293 -20.614 -20.675 1.00 0.00 C \n+ATOM 842 DCD1 LEU J 3 7.293 -20.614 -20.675 1.00 0.00 EP \n+ATOM 843 HD11 LEU J 3 7.172 -19.759 -21.372 1.00 0.00 H \n+ATOM 844 HD12 LEU J 3 6.376 -21.236 -20.706 1.00 0.00 H \n+ATOM 845 HD13 LEU J 3 8.150 -21.223 -21.032 1.00 0.00 H \n+ATOM 846 CD2 LEU J 3 7.751 -21.316 -18.318 1.00 0.00 C \n+ATOM 847 DCD2 LEU J 3 7.751 -21.316 -18.318 1.00 0.00 EP \n+ATOM 848 HD21 LEU J 3 8.638 -21.905 -18.633 1.00 0.00 H \n+ATOM 849 HD22 LEU J 3 7.908 -20.978 -17.272 1.00 0.00 H \n+ATOM 850 HD23 LEU J 3 6.858 -21.973 -18.348 1.00 0.00 H \n+ATOM 851 O LEU J 3 6.634 -16.475 -20.172 1.00 0.00 O \n+ATOM 852 DOT1 LEU J 3 6.634 -16.475 -20.172 1.00 0.00 EP \n+ATOM 853 OXT LEU J 3 8.056 -17.442 -21.566 1.00 0.00 O \n+ATOM 854 DOT2 LEU J 3 8.056 -17.442 -21.566 1.00 0.00 EP \n+ATOM 855 LPT1 LEU J 3 6.477 -16.391 -20.473 1.00 0.00 EP \n+ATOM 856 LPT2 LEU J 3 6.593 -16.432 -19.827 1.00 0.00 EP \n+ATOM 857 LPT3 LEU J 3 7.831 -17.312 -21.800 1.00 0.00 EP \n+ATOM 858 LPT4 LEU J 3 8.352 -17.628 -21.554 1.00 0.00 EP \n+TER 859 LEU J 3\n+ATOM 860 N MET K 1 3.985 -18.740 -1.056 1.00 0.00 N \n+ATOM 861 DN MET K 1 3.985 -18.740 -1.056 1.00 0.00 EP \n+ATOM 862 H MET K 1 3.908 -19.670 -1.500 1.00 0.00 H \n+ATOM 863 H2 MET K 1 3.411 -18.049 -1.571 1.00 0.00 H \n+ATOM 864 H3 MET K 1 5.005 -18.429 -1.143 1.00 0.00 H \n+ATOM 865 CA MET K 1 3.602 -18.778 0.383 1.00 0.00 C \n+ATOM 866 DCA MET K 1 3.602 -18.778 0.383 1.00 0.00 EP \n+ATOM 867 HA MET K 1 4.289 -19.465 0.861 1.00 0.00 H \n+ATOM 868 C MET K 1 3.806 -17.450 1.095 1.00 0.00 C \n+ATOM 869 DC MET K 1 3.806 -17.450 1.095 1.00 0.00 EP \n+ATOM 870 O MET K 1 2.960 -16.564 1.055 1.00 0.00 O \n+ATOM 871 DO MET K 1 2.960 -16.564 1.055 1.00 0.00 EP \n+ATOM 872 LPOA MET K 1 2.782 -16.735 0.884 1.00 0.00 EP \n+ATOM 873 LPOB MET K 1 3.131 -16.386 1.225 1.00 0.00 EP \n+ATOM 874 CB MET K 1 2.157 -19.333 0.592 1.00 0.00 C \n+ATOM 875 DCB MET K 1 2.157 -19.333 0.592 1.00 0.00 EP \n+ATOM 876 HB3 MET K 1 1.825 -19.106 1.632 1.00 0.00 H \n+ATOM 877 HB2 MET K 1 2.207 -20.443 0.525 1.00 0.00 H \n+ATOM 878 CG MET K 1 1.063 -18.841 -0.391 1.00 0.00 C \n+ATOM 879 DCG MET K 1 1.063 -18.841 -0.391 1.00 0.00 EP \n+ATOM 880 HG3 MET K 1 1.117 -17.730 -0.450 1.00 0.00 H \n+ATOM 881 HG2 MET K 1 0.074 -19.067 0.072 1.00 0.00 H \n+ATOM 882 SD MET K 1 1.076 -19.556 -2.071 1.00 0.00 S \n+ATOM 883 DSD MET K 1 1.076 -19.556 -2.071 1.00 0.00 EP \n+ATOM 884 CE MET K 1 0.425 -21.195 -1.634 1.00 0.00 C \n+ATOM 885 DCE MET K 1 0.425 -21.195 -1.634 1.00 0.00 EP \n+ATOM 886 HE1 MET K 1 1.109 -21.746 -0.955 1.00 0.00 H \n+ATOM 887 HE2 MET K 1 0.285 -21.818 -2.545 1.00 0.00 H \n+ATOM 888 HE3 MET K 1 -0.563 -21.112 -1.133 1.00 0.00 H \n+ATOM 889 LP1A MET K 1 1.705 -19.864 -2.078 1.00 0.00 EP \n+ATOM 890 LP1B MET K 1 0.481 -19.201 -2.172 1.00 0.00 EP \n+ATOM 891 N MET K 2 4.986 -17.294 1.709 1.00 0.00 N \n+ATOM 892 DN MET K 2 4.986 -17.294 1.709 1.00 0.00 EP \n+ATOM 893 H MET K 2 5.691 -18.003 1.575 1.00 0.00 H \n+ATOM 894 CA MET K 2 5.503 -16.069 2.267 1.00 0.00 C \n+ATOM 895 DCA MET K 2 5.503 -16.069 2.267 1.00 0.00 EP \n+ATOM 896 HA MET K 2 5.391 -15.287 1.530 1.00 0.00 H \n+ATOM 897 C MET K 2 7.010 -16.235 2.496 1.00 0.00 C \n+ATOM 898 DC MET K 2 7.010 -16.235 2.496 1.00 0.00 EP \n+ATOM 899 O MET K 2 7.507 -16.131 3.613 1.00 0.00 O \n+ATOM 900 DO MET K 2 7.507 -16.131 3.613 1.00 0.00 EP \n+ATOM 901 LPOA MET K 2 7.238 -16.077 3.733 1.00 0.00 EP \n+ATOM 902 LPOB MET K 2 7.781 -16.185 3.502 1.00 0.00 EP \n+ATOM 903 CB MET K 2 4.765 -15.637 3.568 1.00 0.00 C \n+ATOM 904 DCB MET K 2 4.765 -15.637 3.568 1.00 0.00 EP \n+ATOM 905 HB3 MET K 2 5.290 -14.763 4.011 1.00 0.00 H \n+ATOM 906 HB2 MET K 2 3.748 -15.289 3.275 1.00 0.00 H \n+ATOM 907 CG MET K 2 4.586 -16.752 4.623 1.00 0.00 C \n+ATOM 908 DCG MET K 2 4.586 -16.752 4.623 1.00 0.00 EP \n+ATOM 909 HG3 MET K 2 5.577 -17.202 4.854 1.00 0.00 H \n+ATOM 910 HG2 MET K 2 3.963 -17.558 4.179 1.00 0.00 H \n+ATOM 911 SD MET K 2 3.804 -16.202 6.172 1.00 0.00 S \n+ATOM 912 DSD MET K 2 3.804 -16.202 6.172 1.00 0.00 EP \n+ATOM 913 CE MET K 2 5.253 -15.328 6.834 1.00 0.00 C \n+ATOM 914 DCE MET K 2 5.253 -15.328 6.834 1.00 0.00 EP \n+ATOM 915 HE1 MET K 2 5.056 -14.956 7.862 1.00 0.00 H \n+ATOM 916 HE2 MET K 2 6.138 -15.999 6.876 1.00 0.00 H \n+ATOM 917 HE3 MET K 2 5.521 -14.454 6.204 1.00 0.00 H \n+ATOM 918 LP1A MET K 2 3.985 -16.724 6.602 1.00 0.00 EP \n+ATOM 919 LP1B MET K 2 3.511 -15.697 5.786 1.00 0.00 EP \n+ATOM 920 N MET K 3 7.829 -16.525 1.464 1.00 0.00 N \n+ATOM 921 DN MET K 3 7.829 -16.525 1.464 1.00 0.00 EP \n+ATOM 922 H MET K 3 8.773 -16.733 1.700 1.00 0.00 H \n+ATOM 923 CA MET K 3 7.572 -16.511 0.033 1.00 0.00 C \n+ATOM 924 DCA MET K 3 7.572 -16.511 0.033 1.00 0.00 EP \n+ATOM 925 HA MET K 3 6.936 -15.662 -0.169 1.00 0.00 H \n+ATOM 926 C MET K 3 6.826 -17.749 -0.534 1.00 0.00 C \n+ATOM 927 DC MET K 3 6.826 -17.749 -0.534 1.00 0.00 EP \n+ATOM 928 CB MET K 3 8.885 -16.310 -0.774 1.00 0.00 C \n+ATOM 929 DCB MET K 3 8.885 -16.310 -0.774 1.00 0.00 EP \n+ATOM 930 HB3 MET K 3 9.350 -15.355 -0.447 1.00 0.00 H \n+ATOM 931 HB2 MET K 3 8.607 -16.191 -1.846 1.00 0.00 H \n+ATOM 932 CG MET K 3 9.942 -17.439 -0.678 1.00 0.00 C \n+ATOM 933 DCG MET K 3 9.942 -17.439 -0.678 1.00 0.00 EP \n+ATOM 934 HG3 MET K 3 10.686 -17.250 -1.484 1.00 0.00 H \n+ATOM 935 HG2 MET K 3 9.454 -18.406 -0.930 1.00 0.00 H \n+ATOM 936 SD MET K 3 10.849 -17.573 0.900 1.00 0.00 S \n+ATOM 937 DSD MET K 3 10.849 -17.573 0.900 1.00 0.00 EP \n+ATOM 938 CE MET K 3 10.080 -19.132 1.430 1.00 0.00 C \n+ATOM 939 DCE MET K 3 10.080 -19.132 1.430 1.00 0.00 EP \n+ATOM 940 HE1 MET K 3 10.416 -19.415 2.450 1.00 0.00 H \n+ATOM 941 HE2 MET K 3 8.971 -19.052 1.445 1.00 0.00 H \n+ATOM 942 HE3 MET K 3 10.345 -19.960 0.739 1.00 0.00 H \n+ATOM 943 LP1A MET K 3 10.400 -17.261 1.336 1.00 0.00 EP \n+ATOM 944 LP1B MET K 3 11.383 -17.814 0.516 1.00 0.00 EP \n+ATOM 945 O MET K 3 6.285 -17.638 -1.666 1.00 0.00 O \n+ATOM 946 DOT1 MET K 3 6.285 -17.638 -1.666 1.00 0.00 EP \n+ATOM 947 OXT MET K 3 6.655 -18.783 0.166 1.00 0.00 O \n+ATOM 948 DOT2 MET K 3 6.655 -18.783 0.166 1.00 0.00 EP \n+ATOM 949 LPT1 MET K 3 6.097 -17.925 -1.738 1.00 0.00 EP \n+ATOM 950 LPT2 MET K 3 6.370 -17.331 -1.810 1.00 0.00 EP \n+ATOM 951 LPT3 MET K 3 6.448 -19.009 -0.003 1.00 0.00 EP \n+ATOM 952 LPT4 MET K 3 6.830 -18.754 0.467 1.00 0.00 EP \n+TER 953 MET K 3\n+ATOM 954 N ASN L 1 -6.371 -12.381 22.511 1.00 0.00 N \n+ATOM 955 DN ASN L 1 -6.371 -12.381 22.511 1.00 0.00 EP \n+ATOM 956 H ASN L 1 -6.466 -13.419 22.598 1.00 0.00 H \n+ATOM 957 H2 ASN L 1 -6.428 -11.894 23.423 1.00 0.00 H \n+ATOM 958 H3 ASN L 1 -7.136 -11.979 21.888 1.00 0.00 H \n+ATOM 959 CA ASN L 1 -5.111 -12.054 21.777 1.00 0.00 C \n+ATOM 960 DCA ASN L 1 -5.111 -12.054 21.777 1.00 0.00 EP \n+ATOM 961 HA ASN L 1 -5.270 -11.077 21.340 1.00 0.00 H \n+ATOM 962 C ASN L 1 -3.884 -11.902 22.645 1.00 0.00 C \n+ATOM 963 DC ASN L 1 -3.884 -11.902 22.645 1.00 0.00 EP \n+ATOM 964 O ASN L 1 -3.800 -12.424 23.751 1.00 0.00 O \n+ATOM 965 DO ASN L 1 -3.800 -12.424 23.751 1.00 0.00 EP \n+ATOM 966 LPOA ASN L 1 -4.074 -12.542 23.722 1.00 0.00 EP \n+ATOM 967 LPOB ASN L 1 -3.525 -12.311 23.789 1.00 0.00 EP \n+ATOM 968 CB ASN L 1 -4.869 -13.074 20.618 1.00 0.00 C \n+ATOM 969 DCB ASN L 1 -4.869 -13.074 20.618 1.00 0.00 EP \n+ATOM 970 HB3 ASN L 1 -5.750 -13.063 19.939 1.00 0.00 H \n+ATOM 971 HB2 ASN L 1 -3.982 -12.786 20.019 1.00 0.00 H \n+ATOM 972 CG ASN L 1 -4.716 -14.499 21.153 1.00 0.00 C \n+ATOM 973 DCG ASN L 1 -4.716 -14.499 21.153 1.00 0.00 EP \n+ATOM 974 OD1 ASN L 1 -5.605 -14.962 21.871 1.00 0.00 O \n+ATOM 975 DOD1 ASN L 1 -5.605 -14.962 21.871 1.00 0.00 EP \n+ATOM 976 ND2 ASN L 1 -3.590 -15.176 20.861 1.00 0.00 N \n+ATOM 977 DND2 ASN L 1 -3.590 -15.176 20.861 1.00 0.00 EP \n+ATOM 978 HD21 ASN L 1 -2.810 -14.693 20.448 1.00 0.00 H \n+ATOM 979 HD22 ASN L 1 -3.503 -16.105 21.211 1.00 0.00 H \n+ATOM 980 LPDA ASN L 1 -5.762 -14.707 21.850 1.00 0.00 EP \n+ATOM 981 LPDB ASN L 1 -5.456 -15.221 21.898 1.00 0.00 EP \n+ATOM 982 N ASN L 2 -2.896 -11.157 22.133 1.00 0.00 N \n+ATOM 983 DN ASN L 2 -2.896 -11.157 22.133 1.00 0.00 EP \n+ATOM 984 H ASN L 2 -3.014 -10.628 21.292 1.00 0.00 H \n+ATOM 985 CA ASN L 2 -1.579 -11.032 22.699 1.00 0.00 C \n+ATOM 986 DCA ASN L 2 -1.579 -11.032 22.699 1.00 0.00 EP \n+ATOM 987 HA ASN L 2 -1.653 -10.924 23.774 1.00 0.00 H \n+ATOM 988 C ASN L 2 -1.058 -9.734 22.128 1.00 0.00 C \n+ATOM 989 DC ASN L 2 -1.058 -9.734 22.128 1.00 0.00 EP \n+ATOM 990 O ASN L 2 -1.653 -9.209 21.186 1.00 0.00 O \n+ATOM 991 DO ASN L 2 -1.653 -9.209 21.186 1.00 0.00 EP \n+ATOM 992 LPOA ASN L 2 -1.855 -9.431 21.183 1.00 0.00 EP \n+ATOM 993 LPOB ASN L 2 -1.456 -8.983 21.180 1.00 0.00 EP \n+ATOM 994 CB ASN L 2 -0.663 -12.232 22.304 1.00 0.00 C \n+ATOM 995 DCB ASN L 2 -0.663 -12.232 22.304 1.00 0.00 EP \n+ATOM 996 HB3 ASN L 2 -1.040 -13.139 22.825 1.00 0.00 H \n+ATOM 997 HB2 ASN L 2 0.385 -12.069 22.625 1.00 0.00 H \n+ATOM 998 CG ASN L 2 -0.703 -12.543 20.804 1.00 0.00 C \n+ATOM 999 DCG ASN L 2 -0.703 -12.543 20.804 1.00 0.00 EP \n+ATOM 1000 OD1 ASN L 2 -1.422 -13.445 20.371 1.00 0.00 O \n+ATOM 1001 DOD1 ASN L 2 -1.422 -13.445 20.371 1.00 0.00 EP \n+ATOM 1002 ND2 ASN L 2 0.081 -11.819 19.976 1.00 0.00 N \n+ATOM 1003 DND2 ASN L 2 0.081 -11.819 19.976 1.00 0.00 EP \n+ATOM 1004 HD21 ASN L 2 0.073 -12.074 19.014 1.00 0.00 H \n+ATOM 1005 HD22 ASN L 2 0.592 -11.014 20.296 1.00 0.00 H \n+ATOM 1006 LPDA ASN L 2 -1.519 -13.508 20.648 1.00 0.00 EP \n+ATOM 1007 LPDB ASN L 2 -1.331 -13.390 20.090 1.00 0.00 EP \n+ATOM 1008 N ASN L 3 0.057 -9.203 22.659 1.00 0.00 N \n+ATOM 1009 DN ASN L 3 0.057 -9.203 22.659 1.00 0.00 EP \n+ATOM 1010 H ASN L 3 0.525 -9.636 23.423 1.00 0.00 H \n+ATOM 1011 CA ASN L 3 0.697 -8.016 22.123 1.00 0.00 C \n+ATOM 1012 DCA ASN L 3 0.697 -8.016 22.123 1.00 0.00 EP \n+ATOM 1013 HA ASN L 3 -0.014 -7.206 22.224 1.00 0.00 H \n+ATOM 1014 C ASN L 3 1.020 -8.106 20.604 1.00 0.00 C \n+ATOM 1015 DC ASN L 3 1.020 -8.106 20.604 1.00 0.00 EP \n+ATOM 1016 CB ASN L 3 1.965 -7.632 22.935 1.00 0.00 C \n+ATOM 1017 DCB ASN L 3 1.965 -7.632 22.935 1.00 0.00 EP \n+ATOM 1018 HB3 ASN L 3 1.648 -7.286 23.943 1.00 0.00 H \n+ATOM 1019 HB2 ASN L 3 2.509 -6.800 22.444 1.00 0.00 H \n+ATOM 1020 CG ASN L 3 2.934 -8.793 23.161 1.00 0.00 C \n+ATOM 1021 DCG ASN L 3 2.934 -8.793 23.161 1.00 0.00 EP \n+ATOM 1022 OD1 ASN L 3 3.350 -9.039 24.293 1.00 0.00 O \n+ATOM 1023 DOD1 ASN L 3 3.350 -9.039 24.293 1.00 0.00 EP \n+ATOM 1024 ND2 ASN L 3 3.268 -9.559 22.102 1.00 0.00 N \n+ATOM 1025 DND2 ASN L 3 3.268 -9.559 22.102 1.00 0.00 EP \n+ATOM 1026 HD21 ASN L 3 2.770 -9.421 21.236 1.00 0.00 H \n+ATOM 1027 HD22 ASN L 3 3.920 -10.295 22.247 1.00 0.00 H \n+ATOM 1028 LPDA ASN L 3 3.191 -8.812 24.406 1.00 0.00 EP \n+ATOM 1029 LPDB ASN L 3 3.513 -9.269 24.189 1.00 0.00 EP \n+ATOM 1030 O ASN L 3 1.328 -9.220 20.102 1.00 0.00 O \n+ATOM 1031 DOT1 ASN L 3 1.328 -9.220 20.102 1.00 0.00 EP \n+ATOM 1032 OXT ASN L 3 0.908 -7.063 19.912 1.00 0.00 O \n+ATOM 1033 DOT2 ASN L 3 0.908 -7.063 19.912 1.00 0.00 EP \n+ATOM 1034 LPT1 ASN L 3 1.374 -9.187 19.756 1.00 0.00 EP \n+ATOM 1035 LPT2 ASN L 3 1.341 -9.465 20.352 1.00 0.00 EP \n+ATOM 1036 LPT3 ASN L 3 0.974 -7.135 19.576 1.00 0.00 EP \n+ATOM 1037 LPT4 ASN L 3 0.821 -6.793 20.116 1.00 0.00 EP \n+TER 1038 ASN L 3\n+ATOM 1039 N PRO M 1 2.225 0.673 -19.709 1.00 0.00 N \n+ATOM 1040 DN PRO M 1 2.225 0.673 -19.709 1.00 0.00 EP \n+ATOM 1041 H2 PRO M 1 2.588 -0.024 -19.077 1.00 0.00 H \n+ATOM 1042 H3 PRO M 1 3.047 1.002 -20.224 1.00 0.00 H \n+ATOM 1043 CD PRO M 1 1.147 0.113 -20.589 1.00 0.00 C \n+ATOM 1044 DCD PRO M 1 1.147 0.113 -20.589 1.00 0.00 EP \n+ATOM 1045 HD3 PRO M 1 1.348 0.372 -21.651 1.00 0.00 H \n+ATOM 1046 HD2 PRO M 1 1.115 -0.992 -20.475 1.00 0.00 H \n+ATOM 1047 CA PRO M 1 1.672 1.781 -18.886 1.00 0.00 C \n+ATOM 1048 DCA PRO M 1 1.672 1.781 -18.886 1.00 0.00 EP \n+ATOM 1049 HA PRO M 1 1.823 2.667 -19.482 1.00 0.00 H \n+ATOM 1050 C PRO M 1 2.553 1.789 -17.662 1.00 0.00 C \n+ATOM 1051 DC PRO M 1 2.553 1.789 -17.662 1.00 0.00 EP \n+ATOM 1052 O PRO M 1 2.760 0.688 -17.152 1.00 0.00 O \n+ATOM 1053 DO PRO M 1 2.760 0.688 -17.152 1.00 0.00 EP \n+ATOM 1054 LPOA PRO M 1 2.591 0.554 -17.361 1.00 0.00 EP \n+ATOM 1055 LPOB PRO M 1 2.931 0.813 -16.940 1.00 0.00 EP \n+ATOM 1056 CB PRO M 1 0.213 1.350 -18.700 1.00 0.00 C \n+ATOM 1057 DCB PRO M 1 0.213 1.350 -18.700 1.00 0.00 EP \n+ATOM 1058 HB3 PRO M 1 -0.438 2.204 -18.418 1.00 0.00 H \n+ATOM 1059 HB2 PRO M 1 0.126 0.558 -17.921 1.00 0.00 H \n+ATOM 1060 CG PRO M 1 -0.150 0.771 -20.079 1.00 0.00 C \n+ATOM 1061 DCG PRO M 1 -0.150 0.771 -20.079 1.00 0.00 EP \n+ATOM 1062 HG3 PRO M 1 -0.992 0.051 -20.023 1.00 0.00 H \n+ATOM 1063 HG2 PRO M 1 -0.432 1.600 -20.767 1.00 0.00 H \n+ATOM 1064 N PRO M 2 3.095 2.892 -17.163 1.00 0.00 N \n+ATOM 1065 DN PRO M 2 3.095 2.892 -17.163 1.00 0.00 EP \n+ATOM 1066 CA PRO M 2 4.276 2.855 -16.315 1.00 0.00 C \n+ATOM 1067 DCA PRO M 2 4.276 2.855 -16.315 1.00 0.00 EP \n+ATOM 1068 HA PRO M 2 4.160 2.089 -15.561 1.00 0.00 H \n+ATOM 1069 CD PRO M 2 2.714 4.257 -17.538 1.00 0.00 C \n+ATOM 1070 DCD PRO M 2 2.714 4.257 -17.538 1.00 0.00 EP \n+ATOM 1071 HD3 PRO M 2 1.655 4.442 -17.253 1.00 0.00 H \n+ATOM 1072 HD2 PRO M 2 2.860 4.419 -18.631 1.00 0.00 H \n+ATOM 1073 CB PRO M 2 4.291 4.262 -15.691 1.00 0.00 C \n+ATOM 1074 DCB PRO M 2 4.291 4.262 -15.691 1.00 0.00 EP \n+ATOM 1075 HB3 PRO M 2 3.635 4.250 -14.792 1.00 0.00 H \n+ATOM 1076 HB2 PRO M 2 5.304 4.592 -15.383 1.00 0.00 H \n+ATOM 1077 CG PRO M 2 3.658 5.178 -16.751 1.00 0.00 C \n+ATOM 1078 DCG PRO M 2 3.658 5.178 -16.751 1.00 0.00 EP \n+ATOM 1079 HG3 PRO M 2 3.128 6.040 -16.298 1.00 0.00 H \n+ATOM 1080 HG2 PRO M 2 4.443 5.559 -17.439 1.00 0.00 H \n+ATOM 1081 C PRO M 2 5.558 2.497 -17.079 1.00 0.00 C \n+ATOM 1082 DC PRO M 2 5.558 2.497 -17.079 1.00 0.00 EP \n+ATOM 1083 O PRO M 2 6.256 1.610 -16.587 1.00 0.00 O \n+ATOM 1084 DO PRO M 2 6.256 1.610 -16.587 1.00 0.00 EP \n+ATOM 1085 LPOA PRO M 2 6.064 1.577 -16.360 1.00 0.00 EP \n+ATOM 1086 LPOB PRO M 2 6.455 1.635 -16.811 1.00 0.00 EP \n+ATOM 1087 N PRO M 3 5.944 3.131 -18.184 1.00 0.00 N \n+ATOM 1088 DN PRO M 3 5.944 3.131 -18.184 1.00 0.00 EP \n+ATOM 1089 CA PRO M 3 6.200 2.337 -19.390 1.00 0.00 C \n+ATOM 1090 DCA PRO M 3 6.200 2.337 -19.390 1.00 0.00 EP \n+ATOM 1091 HA PRO M 3 6.740 1.436 -19.130 1.00 0.00 H \n+ATOM 1092 CD PRO M 3 7.038 4.110 -18.031 1.00 0.00 C \n+ATOM 1093 DCD PRO M 3 7.038 4.110 -18.031 1.00 0.00 EP \n+ATOM 1094 HD3 PRO M 3 7.587 4.007 -17.065 1.00 0.00 H \n+ATOM 1095 HD2 PRO M 3 6.593 5.126 -18.096 1.00 0.00 H \n+ATOM 1096 CB PRO M 3 7.063 3.263 -20.250 1.00 0.00 C \n+ATOM 1097 DCB PRO M 3 7.063 3.263 -20.250 1.00 0.00 EP \n+ATOM 1098 HB3 PRO M 3 6.428 4.047 -20.719 1.00 0.00 H \n+ATOM 1099 HB2 PRO M 3 7.605 2.703 -21.039 1.00 0.00 H \n+ATOM 1100 CG PRO M 3 7.987 3.889 -19.213 1.00 0.00 C \n+ATOM 1101 DCG PRO M 3 7.987 3.889 -19.213 1.00 0.00 EP \n+ATOM 1102 HG3 PRO M 3 8.773 3.155 -18.924 1.00 0.00 H \n+ATOM 1103 HG2 PRO M 3 8.462 4.826 -19.566 1.00 0.00 H \n+ATOM 1104 C PRO M 3 4.937 1.932 -20.119 1.00 0.00 C \n+ATOM 1105 DC PRO M 3 4.937 1.932 -20.119 1.00 0.00 EP \n+ATOM 1106 O PRO M 3 4.781 0.725 -20.452 1.00 0.00 O \n+ATOM 1107 DOT1 PRO M 3 4.781 0.725 -20.452 1.00 0.00 EP \n+ATOM 1108 OXT PRO M 3 4.044 2.792 -20.354 1.00 0.00 O \n+ATOM 1109 DOT2 PRO M 3 4.044 2.792 -20.354 1.00 0.00 EP \n+ATOM 1110 LPT1 PRO M 3 4.470 0.683 -20.608 1.00 0.00 EP \n+ATOM 1111 LPT2 PRO M 3 5.062 0.538 -20.360 1.00 0.00 EP \n+ATOM 1112 LPT3 PRO M 3 3.772 2.641 -20.515 1.00 0.00 EP \n+ATOM 1113 LPT4 PRO M 3 4.147 3.106 -20.238 1.00 0.00 EP \n+TER 1114 PRO M 3\n+ATOM 1115 N GLN N 1 4.248 1.190 0.404 1.00 0.00 N \n+ATOM 1116 DN GLN N 1 4.248 1.190 0.404 1.00 0.00 EP \n+ATOM 1117 H GLN N 1 5.046 1.180 1.103 1.00 0.00 H \n+ATOM 1118 H2 GLN N 1 4.121 2.180 0.078 1.00 0.00 H \n+ATOM 1119 H3 GLN N 1 4.498 0.560 -0.393 1.00 0.00 H \n+ATOM 1120 CA GLN N 1 3.015 0.676 1.096 1.00 0.00 C \n+ATOM 1121 DCA GLN N 1 3.015 0.676 1.096 1.00 0.00 EP \n+ATOM 1122 HA GLN N 1 2.243 0.574 0.346 1.00 0.00 H \n+ATOM 1123 C GLN N 1 2.471 1.670 2.108 1.00 0.00 C \n+ATOM 1124 DC GLN N 1 2.471 1.670 2.108 1.00 0.00 EP \n+ATOM 1125 O GLN N 1 1.266 1.834 2.267 1.00 0.00 O \n+ATOM 1126 DO GLN N 1 1.266 1.834 2.267 1.00 0.00 EP \n+ATOM 1127 LPOA GLN N 1 1.205 1.629 2.057 1.00 0.00 EP \n+ATOM 1128 LPOB GLN N 1 1.317 2.040 2.478 1.00 0.00 EP \n+ATOM 1129 CB GLN N 1 3.273 -0.717 1.762 1.00 0.00 C \n+ATOM 1130 DCB GLN N 1 3.273 -0.717 1.762 1.00 0.00 EP \n+ATOM 1131 HB3 GLN N 1 2.427 -0.926 2.460 1.00 0.00 H \n+ATOM 1132 HB2 GLN N 1 4.192 -0.688 2.387 1.00 0.00 H \n+ATOM 1133 CG GLN N 1 3.327 -1.939 0.801 1.00 0.00 C \n+ATOM 1134 DCG GLN N 1 3.327 -1.939 0.801 1.00 0.00 EP \n+ATOM 1135 HG3 GLN N 1 2.387 -1.989 0.211 1.00 0.00 H \n+ATOM 1136 HG2 GLN N 1 3.402 -2.874 1.396 1.00 0.00 H \n+ATOM 1137 CD GLN N 1 4.488 -1.862 -0.196 1.00 0.00 C \n+ATOM 1138 DCD GLN N 1 4.488 -1.862 -0.196 1.00 0.00 EP \n+ATOM 1139 OE1 GLN N 1 4.468 -1.039 -1.114 1.00 0.00 O \n+ATOM 1140 DOE1 GLN N 1 4.468 -1.039 -1.114 1.00 0.00 EP \n+ATOM 1141 NE2 GLN N 1 5.537 -2.689 -0.005 1.00 0.00 N \n+ATOM 1142 DNE2 GLN N 1 5.537 -2.689 -0.005 1.00 0.00 EP \n+ATOM 1143 HE21 GLN N 1 5.572 -3.274 0.799 1.00 0.00 H \n+ATOM 1144 HE22 GLN N 1 6.296 -2.623 -0.647 1.00 0.00 H \n+ATOM 1145 LPEA GLN N 1 4.202 -0.936 -1.023 1.00 0.00 EP \n+ATOM 1146 LPEB GLN N 1 4.734 -1.136 -1.214 1.00 0.00 EP \n+ATOM 1147 N GLN N 2 3.392 2.405 2.746 1.00 0.00 N \n+ATOM 1148 DN GLN N 2 3.392 2.405 2.746 1.00 0.00 EP \n+ATOM 1149 H GLN N 2 4.354 2.093 2.710 1.00 0.00 H \n+ATOM 1150 CA GLN N 2 3.190 3.569 3.575 1.00 0.00 C \n+ATOM 1151 DCA GLN N 2 3.190 3.569 3.575 1.00 0.00 EP \n+ATOM 1152 HA GLN N 2 2.374 3.395 4.264 1.00 0.00 H \n+ATOM 1153 C GLN N 2 4.493 3.598 4.346 1.00 0.00 C \n+ATOM 1154 DC GLN N 2 4.493 3.598 4.346 1.00 0.00 EP \n+ATOM 1155 O GLN N 2 4.540 3.570 5.572 1.00 0.00 O \n+ATOM 1156 DO GLN N 2 4.540 3.570 5.572 1.00 0.00 EP \n+ATOM 1157 LPOA GLN N 2 4.241 3.558 5.588 1.00 0.00 EP \n+ATOM 1158 LPOB GLN N 2 4.840 3.581 5.566 1.00 0.00 EP \n+ATOM 1159 CB GLN N 2 3.033 4.901 2.765 1.00 0.00 C \n+ATOM 1160 DCB GLN N 2 3.033 4.901 2.765 1.00 0.00 EP \n+ATOM 1161 HB3 GLN N 2 3.965 5.142 2.207 1.00 0.00 H \n+ATOM 1162 HB2 GLN N 2 2.886 5.710 3.518 1.00 0.00 H \n+ATOM 1163 CG GLN N 2 1.846 4.983 1.761 1.00 0.00 C \n+ATOM 1164 DCG GLN N 2 1.846 4.983 1.761 1.00 0.00 EP \n+ATOM 1165 HG3 GLN N 2 1.613 6.058 1.598 1.00 0.00 H \n+ATOM 1166 HG2 GLN N 2 0.954 4.499 2.211 1.00 0.00 H \n+ATOM 1167 CD GLN N 2 2.102 4.365 0.376 1.00 0.00 C \n+ATOM 1168 DCD GLN N 2 2.102 4.365 0.376 1.00 0.00 EP \n+ATOM 1169 OE1 GLN N 2 3.130 3.763 0.059 1.00 0.00 O \n+ATOM 1170 DOE1 GLN N 2 3.130 3.763 0.059 1.00 0.00 EP \n+ATOM 1171 NE2 GLN N 2 1.093 4.511 -0.516 1.00 0.00 N \n+ATOM 1172 DNE2 GLN N 2 1.093 4.511 -0.516 1.00 0.00 EP \n+ATOM 1173 HE21 GLN N 2 1.237 4.152 -1.433 1.00 0.00 H \n+ATOM 1174 HE22 GLN N 2 0.250 4.965 -0.243 1.00 0.00 H \n+ATOM 1175 LPEA GLN N 2 3.246 3.806 0.332 1.00 0.00 EP \n+ATOM 1176 LPEB GLN N 2 3.023 3.715 -0.217 1.00 0.00 EP \n+ATOM 1177 N GLN N 3 5.583 3.543 3.558 1.00 0.00 N \n+ATOM 1178 DN GLN N 3 5.583 3.543 3.558 1.00 0.00 EP \n+ATOM 1179 H GLN N 3 5.493 3.708 2.582 1.00 0.00 H \n+ATOM 1180 CA GLN N 3 6.814 2.867 3.882 1.00 0.00 C \n+ATOM 1181 DCA GLN N 3 6.814 2.867 3.882 1.00 0.00 EP \n+ATOM 1182 HA GLN N 3 6.894 2.734 4.953 1.00 0.00 H \n+ATOM 1183 C GLN N 3 6.797 1.447 3.248 1.00 0.00 C \n+ATOM 1184 DC GLN N 3 6.797 1.447 3.248 1.00 0.00 EP \n+ATOM 1185 CB GLN N 3 8.023 3.691 3.355 1.00 0.00 C \n+ATOM 1186 DCB GLN N 3 8.023 3.691 3.355 1.00 0.00 EP \n+ATOM 1187 HB3 GLN N 3 8.125 4.588 4.004 1.00 0.00 H \n+ATOM 1188 HB2 GLN N 3 8.940 3.077 3.501 1.00 0.00 H \n+ATOM 1189 CG GLN N 3 7.961 4.176 1.875 1.00 0.00 C \n+ATOM 1190 DCG GLN N 3 7.961 4.176 1.875 1.00 0.00 EP \n+ATOM 1191 HG3 GLN N 3 7.229 5.009 1.805 1.00 0.00 H \n+ATOM 1192 HG2 GLN N 3 8.950 4.577 1.572 1.00 0.00 H \n+ATOM 1193 CD GLN N 3 7.519 3.131 0.843 1.00 0.00 C \n+ATOM 1194 DCD GLN N 3 7.519 3.131 0.843 1.00 0.00 EP \n+ATOM 1195 OE1 GLN N 3 6.438 3.219 0.254 1.00 0.00 O \n+ATOM 1196 DOE1 GLN N 3 6.438 3.219 0.254 1.00 0.00 EP \n+ATOM 1197 NE2 GLN N 3 8.365 2.102 0.622 1.00 0.00 N \n+ATOM 1198 DNE2 GLN N 3 8.365 2.102 0.622 1.00 0.00 EP \n+ATOM 1199 HE21 GLN N 3 8.058 1.401 -0.009 1.00 0.00 H \n+ATOM 1200 HE22 GLN N 3 8.993 1.864 1.360 1.00 0.00 H \n+ATOM 1201 LPEA GLN N 3 6.373 3.472 0.400 1.00 0.00 EP \n+ATOM 1202 LPEB GLN N 3 6.494 2.966 0.102 1.00 0.00 EP \n+ATOM 1203 O GLN N 3 7.789 0.699 3.427 1.00 0.00 O \n+ATOM 1204 DOT1 GLN N 3 7.789 0.699 3.427 1.00 0.00 EP \n+ATOM 1205 OXT GLN N 3 5.816 1.118 2.520 1.00 0.00 O \n+ATOM 1206 DOT2 GLN N 3 5.816 1.118 2.520 1.00 0.00 EP \n+ATOM 1207 LPT1 GLN N 3 7.748 0.400 3.249 1.00 0.00 EP \n+ATOM 1208 LPT2 GLN N 3 8.020 0.855 3.639 1.00 0.00 EP \n+ATOM 1209 LPT3 GLN N 3 5.869 0.799 2.385 1.00 0.00 EP \n+ATOM 1210 LPT4 GLN N 3 5.578 1.374 2.516 1.00 0.00 EP \n+TER 1211 GLN N 3\n+ATOM 1212 N ARG O 1 -1.021 -5.331 19.434 1.00 0.00 N \n+ATOM 1213 DN ARG O 1 -1.021 -5.331 19.434 1.00 0.00 EP \n+ATOM 1214 H ARG O 1 -1.219 -4.717 20.252 1.00 0.00 H \n+ATOM 1215 H2 ARG O 1 -1.949 -5.658 19.064 1.00 0.00 H \n+ATOM 1216 H3 ARG O 1 -0.468 -6.165 19.773 1.00 0.00 H \n+ATOM 1217 CA ARG O 1 -0.152 -4.598 18.467 1.00 0.00 C \n+ATOM 1218 DCA ARG O 1 -0.152 -4.598 18.467 1.00 0.00 EP \n+ATOM 1219 HA ARG O 1 0.708 -5.222 18.273 1.00 0.00 H \n+ATOM 1220 C ARG O 1 0.385 -3.372 19.174 1.00 0.00 C \n+ATOM 1221 DC ARG O 1 0.385 -3.372 19.174 1.00 0.00 EP \n+ATOM 1222 O ARG O 1 0.045 -3.138 20.332 1.00 0.00 O \n+ATOM 1223 DO ARG O 1 0.045 -3.138 20.332 1.00 0.00 EP \n+ATOM 1224 LPOA ARG O 1 -0.126 -3.384 20.337 1.00 0.00 EP \n+ATOM 1225 LPOB ARG O 1 0.214 -2.890 20.337 1.00 0.00 EP \n+ATOM 1226 CB ARG O 1 -0.884 -4.283 17.120 1.00 0.00 C \n+ATOM 1227 DCB ARG O 1 -0.884 -4.283 17.120 1.00 0.00 EP \n+ATOM 1228 HB3 ARG O 1 -1.978 -4.391 17.252 1.00 0.00 H \n+ATOM 1229 HB2 ARG O 1 -0.763 -3.212 16.842 1.00 0.00 H \n+ATOM 1230 CG ARG O 1 -0.447 -5.105 15.871 1.00 0.00 C \n+ATOM 1231 DCG ARG O 1 -0.447 -5.105 15.871 1.00 0.00 EP \n+ATOM 1232 HG3 ARG O 1 0.482 -4.651 15.457 1.00 0.00 H \n+ATOM 1233 HG2 ARG O 1 -1.236 -4.979 15.093 1.00 0.00 H \n+ATOM 1234 CD ARG O 1 -0.172 -6.617 16.021 1.00 0.00 C \n+ATOM 1235 DCD ARG O 1 -0.172 -6.617 16.021 1.00 0.00 EP \n+ATOM 1236 HD3 ARG O 1 0.789 -6.759 16.568 1.00 0.00 H \n+ATOM 1237 HD2 ARG O 1 -0.089 -7.096 15.017 1.00 0.00 H \n+ATOM 1238 NE ARG O 1 -1.303 -7.258 16.760 1.00 0.00 N \n+ATOM 1239 DNE ARG O 1 -1.303 -7.258 16.760 1.00 0.00 EP \n+ATOM 1240 HE ARG O 1 -2.201 -6.780 16.848 1.00 0.00 H \n+ATOM 1241 CZ ARG O 1 -1.152 -8.223 17.661 1.00 0.00 C \n+ATOM 1242 DCZ ARG O 1 -1.152 -8.223 17.661 1.00 0.00 EP \n+ATOM 1243 NH1 ARG O 1 -0.056 -8.940 17.738 1.00 0.00 N \n+ATOM 1244 DNH1 ARG O 1 -0.056 -8.940 17.738 1.00 0.00 EP \n+ATOM 1245 HH11 ARG O 1 0.288 -9.113 18.679 1.00 0.00 H \n+ATOM 1246 HH12 ARG O 1 0.638 -8.757 17.068 1.00 0.00 H \n+ATOM 1247 NH2 ARG O 1 -2.079 -8.366 18.581 1.00 0.00 N \n+ATOM 1248 DNH2 ARG O 1 -2.079 -8.366 18.581 1.00 0.00 EP \n+ATOM 1249 HH21 ARG O 1 -2.831 -7.683 18.617 1.00 0.00 H \n+ATOM 1250 HH22 ARG O 1 -1.847 -8.823 19.443 1.00 0.00 H \n+ATOM 1251 N ARG O 2 1.243 -2.559 18.528 1.00 0.00 N \n+ATOM 1252 DN ARG O 2 1.243 -2.559 18.528 1.00 0.00 EP \n+ATOM 1253 H ARG O 2 1.533 -2.736 17.594 1.00 0.00 H \n+ATOM 1254 CA ARG O 2 1.857 -1.432 19.204 1.00 0.00 C \n+ATOM 1255 DCA ARG O 2 1.857 -1.432 19.204 1.00 0.00 EP \n+ATOM 1256 HA ARG O 2 1.679 -1.505 20.268 1.00 0.00 H \n+ATOM 1257 C ARG O 2 3.369 -1.514 19.089 1.00 0.00 C \n+ATOM 1258 DC ARG O 2 3.369 -1.514 19.089 1.00 0.00 EP \n+ATOM 1259 O ARG O 2 3.997 -2.299 19.794 1.00 0.00 O \n+ATOM 1260 DO ARG O 2 3.997 -2.299 19.794 1.00 0.00 EP \n+ATOM 1261 LPOA ARG O 2 3.744 -2.395 19.922 1.00 0.00 EP \n+ATOM 1262 LPOB ARG O 2 4.256 -2.210 19.671 1.00 0.00 EP \n+ATOM 1263 CB ARG O 2 1.217 -0.103 18.719 1.00 0.00 C \n+ATOM 1264 DCB ARG O 2 1.217 -0.103 18.719 1.00 0.00 EP \n+ATOM 1265 HB3 ARG O 2 0.121 -0.212 18.909 1.00 0.00 H \n+ATOM 1266 HB2 ARG O 2 1.332 -0.010 17.617 1.00 0.00 H \n+ATOM 1267 CG ARG O 2 1.667 1.218 19.395 1.00 0.00 C \n+ATOM 1268 DCG ARG O 2 1.667 1.218 19.395 1.00 0.00 EP \n+ATOM 1269 HG3 ARG O 2 2.627 1.572 18.959 1.00 0.00 H \n+ATOM 1270 HG2 ARG O 2 0.908 1.984 19.111 1.00 0.00 H \n+ATOM 1271 CD ARG O 2 1.744 1.212 20.935 1.00 0.00 C \n+ATOM 1272 DCD ARG O 2 1.744 1.212 20.935 1.00 0.00 EP \n+ATOM 1273 HD3 ARG O 2 1.581 2.244 21.323 1.00 0.00 H \n+ATOM 1274 HD2 ARG O 2 0.970 0.537 21.362 1.00 0.00 H \n+ATOM 1275 NE ARG O 2 3.134 0.805 21.317 1.00 0.00 N \n+ATOM 1276 DNE ARG O 2 3.134 0.805 21.317 1.00 0.00 EP \n+ATOM 1277 HE ARG O 2 3.903 1.140 20.730 1.00 0.00 H \n+ATOM 1278 CZ ARG O 2 3.492 -0.098 22.218 1.00 0.00 C \n+ATOM 1279 DCZ ARG O 2 3.492 -0.098 22.218 1.00 0.00 EP \n+ATOM 1280 NH1 ARG O 2 4.761 -0.442 22.295 1.00 0.00 N \n+ATOM 1281 DNH1 ARG O 2 4.761 -0.442 22.295 1.00 0.00 EP \n+ATOM 1282 HH11 ARG O 2 5.001 -1.297 22.723 1.00 0.00 H \n+ATOM 1283 HH12 ARG O 2 5.379 -0.108 21.558 1.00 0.00 H \n+ATOM 1284 NH2 ARG O 2 2.635 -0.696 23.015 1.00 0.00 N \n+ATOM 1285 DNH2 ARG O 2 2.635 -0.696 23.015 1.00 0.00 EP \n+ATOM 1286 HH21 ARG O 2 2.976 -1.342 23.682 1.00 0.00 H \n+ATOM 1287 HH22 ARG O 2 1.684 -0.431 22.960 1.00 0.00 H \n+ATOM 1288 N ARG O 3 3.996 -0.703 18.219 1.00 0.00 N \n+ATOM 1289 DN ARG O 3 3.996 -0.703 18.219 1.00 0.00 EP \n+ATOM 1290 H ARG O 3 3.488 -0.067 17.653 1.00 0.00 H \n+ATOM 1291 CA ARG O 3 5.427 -0.482 18.273 1.00 0.00 C \n+ATOM 1292 DCA ARG O 3 5.427 -0.482 18.273 1.00 0.00 EP \n+ATOM 1293 HA ARG O 3 5.930 -1.424 18.453 1.00 0.00 H \n+ATOM 1294 C ARG O 3 5.758 0.457 19.454 1.00 0.00 C \n+ATOM 1295 DC ARG O 3 5.758 0.457 19.454 1.00 0.00 EP \n+ATOM 1296 CB ARG O 3 5.957 0.125 16.947 1.00 0.00 C \n+ATOM 1297 DCB ARG O 3 5.957 0.125 16.947 1.00 0.00 EP \n+ATOM 1298 HB3 ARG O 3 5.776 -0.634 16.152 1.00 0.00 H \n+ATOM 1299 HB2 ARG O 3 5.369 1.032 16.688 1.00 0.00 H \n+ATOM 1300 CG ARG O 3 7.465 0.470 16.969 1.00 0.00 C \n+ATOM 1301 DCG ARG O 3 7.465 0.470 16.969 1.00 0.00 EP \n+ATOM 1302 HG3 ARG O 3 7.974 -0.277 17.619 1.00 0.00 H \n+ATOM 1303 HG2 ARG O 3 7.877 0.350 15.941 1.00 0.00 H \n+ATOM 1304 CD ARG O 3 7.772 1.904 17.436 1.00 0.00 C \n+ATOM 1305 DCD ARG O 3 7.772 1.904 17.436 1.00 0.00 EP \n+ATOM 1306 HD3 ARG O 3 7.197 2.214 18.334 1.00 0.00 H \n+ATOM 1307 HD2 ARG O 3 7.513 2.624 16.626 1.00 0.00 H \n+ATOM 1308 NE ARG O 3 9.242 1.996 17.715 1.00 0.00 N \n+ATOM 1309 DNE ARG O 3 9.242 1.996 17.715 1.00 0.00 EP \n+ATOM 1310 HE ARG O 3 9.848 2.309 16.996 1.00 0.00 H \n+ATOM 1311 CZ ARG O 3 9.787 1.720 18.895 1.00 0.00 C \n+ATOM 1312 DCZ ARG O 3 9.787 1.720 18.895 1.00 0.00 EP \n+ATOM 1313 NH1 ARG O 3 9.116 1.269 19.931 1.00 0.00 N \n+ATOM 1314 DNH1 ARG O 3 9.116 1.269 19.931 1.00 0.00 EP \n+ATOM 1315 HH11 ARG O 3 9.567 1.035 20.775 1.00 0.00 H \n+ATOM 1316 HH12 ARG O 3 8.136 1.005 19.847 1.00 0.00 H \n+ATOM 1317 NH2 ARG O 3 11.087 1.900 19.046 1.00 0.00 N \n+ATOM 1318 DNH2 ARG O 3 11.087 1.900 19.046 1.00 0.00 EP \n+ATOM 1319 HH21 ARG O 3 11.493 1.707 19.928 1.00 0.00 H \n+ATOM 1320 HH22 ARG O 3 11.621 2.250 18.290 1.00 0.00 H \n+ATOM 1321 O ARG O 3 6.639 0.114 20.284 1.00 0.00 O \n+ATOM 1322 DOT1 ARG O 3 6.639 0.114 20.284 1.00 0.00 EP \n+ATOM 1323 OXT ARG O 3 5.127 1.537 19.572 1.00 0.00 O \n+ATOM 1324 DOT2 ARG O 3 5.127 1.537 19.572 1.00 0.00 EP \n+ATOM 1325 LPT1 ARG O 3 6.671 0.358 20.532 1.00 0.00 EP \n+ATOM 1326 LPT2 ARG O 3 6.775 -0.196 20.193 1.00 0.00 EP \n+ATOM 1327 LPT3 ARG O 3 5.236 1.708 19.857 1.00 0.00 EP \n+ATOM 1328 LPT4 ARG O 3 4.898 1.571 19.309 1.00 0.00 EP \n+TER 1329 ARG O 3\n+ATOM 1330 N SER P 1 1.924 19.223 -18.966 1.00 0.00 N \n+ATOM 1331 DN SER P 1 1.924 19.223 -18.966 1.00 0.00 EP \n+ATOM 1332 H SER P 1 2.836 18.984 -19.431 1.00 0.00 H \n+ATOM 1333 H2 SER P 1 1.225 18.474 -19.109 1.00 0.00 H \n+ATOM 1334 H3 SER P 1 1.585 20.134 -19.369 1.00 0.00 H \n+ATOM 1335 CA SER P 1 2.309 19.397 -17.515 1.00 0.00 C \n+ATOM 1336 DCA SER P 1 2.309 19.397 -17.515 1.00 0.00 EP \n+ATOM 1337 HA SER P 1 1.914 18.542 -16.984 1.00 0.00 H \n+ATOM 1338 C SER P 1 1.664 20.599 -16.860 1.00 0.00 C \n+ATOM 1339 DC SER P 1 1.664 20.599 -16.860 1.00 0.00 EP \n+ATOM 1340 O SER P 1 0.897 20.434 -15.924 1.00 0.00 O \n+ATOM 1341 DO SER P 1 0.897 20.434 -15.924 1.00 0.00 EP \n+ATOM 1342 LPOA SER P 1 0.934 20.136 -15.939 1.00 0.00 EP \n+ATOM 1343 LPOB SER P 1 0.853 20.730 -15.901 1.00 0.00 EP \n+ATOM 1344 CB SER P 1 3.867 19.379 -17.309 1.00 0.00 C \n+ATOM 1345 DCB SER P 1 3.867 19.379 -17.309 1.00 0.00 EP \n+ATOM 1346 HB3 SER P 1 4.213 20.236 -16.687 1.00 0.00 H \n+ATOM 1347 HB2 SER P 1 4.148 18.459 -16.748 1.00 0.00 H \n+ATOM 1348 OG SER P 1 4.583 19.376 -18.550 1.00 0.00 O \n+ATOM 1349 DOG SER P 1 4.583 19.376 -18.550 1.00 0.00 EP \n+ATOM 1350 HG SER P 1 5.460 19.817 -18.360 1.00 0.00 H \n+ATOM 1351 LPGA SER P 1 4.771 19.082 -18.585 1.00 0.00 EP \n+ATOM 1352 LPGB SER P 1 4.511 19.663 -18.736 1.00 0.00 EP \n+ATOM 1353 N SER P 2 1.891 21.846 -17.314 1.00 0.00 N \n+ATOM 1354 DN SER P 2 1.891 21.846 -17.314 1.00 0.00 EP \n+ATOM 1355 H SER P 2 1.490 22.589 -16.779 1.00 0.00 H \n+ATOM 1356 CA SER P 2 2.701 22.263 -18.453 1.00 0.00 C \n+ATOM 1357 DCA SER P 2 2.701 22.263 -18.453 1.00 0.00 EP \n+ATOM 1358 HA SER P 2 3.284 21.437 -18.816 1.00 0.00 H \n+ATOM 1359 C SER P 2 3.725 23.268 -18.010 1.00 0.00 C \n+ATOM 1360 DC SER P 2 3.725 23.268 -18.010 1.00 0.00 EP \n+ATOM 1361 O SER P 2 3.432 24.171 -17.233 1.00 0.00 O \n+ATOM 1362 DO SER P 2 3.432 24.171 -17.233 1.00 0.00 EP \n+ATOM 1363 LPOA SER P 2 3.149 24.073 -17.219 1.00 0.00 EP \n+ATOM 1364 LPOB SER P 2 3.713 24.276 -17.241 1.00 0.00 EP \n+ATOM 1365 CB SER P 2 1.873 22.771 -19.650 1.00 0.00 C \n+ATOM 1366 DCB SER P 2 1.873 22.771 -19.650 1.00 0.00 EP \n+ATOM 1367 HB3 SER P 2 2.541 23.193 -20.437 1.00 0.00 H \n+ATOM 1368 HB2 SER P 2 1.179 23.575 -19.307 1.00 0.00 H \n+ATOM 1369 OG SER P 2 1.133 21.675 -20.202 1.00 0.00 O \n+ATOM 1370 DOG SER P 2 1.133 21.675 -20.202 1.00 0.00 EP \n+ATOM 1371 HG SER P 2 0.560 22.059 -20.884 1.00 0.00 H \n+ATOM 1372 LPGA SER P 2 1.306 21.530 -20.470 1.00 0.00 EP \n+ATOM 1373 LPGB SER P 2 0.837 21.622 -20.024 1.00 0.00 EP \n+ATOM 1374 N SER P 3 4.971 23.039 -18.444 1.00 0.00 N \n+ATOM 1375 DN SER P 3 4.971 23.039 -18.444 1.00 0.00 EP \n+ATOM 1376 H SER P 3 5.184 22.392 -19.168 1.00 0.00 H \n+ATOM 1377 CA SER P 3 6.120 23.188 -17.580 1.00 0.00 C \n+ATOM 1378 DCA SER P 3 6.120 23.188 -17.580 1.00 0.00 EP \n+ATOM 1379 HA SER P 3 5.871 23.739 -16.683 1.00 0.00 H \n+ATOM 1380 C SER P 3 6.442 21.733 -17.191 1.00 0.00 C \n+ATOM 1381 DC SER P 3 6.442 21.733 -17.191 1.00 0.00 EP \n+ATOM 1382 CB SER P 3 7.360 23.800 -18.276 1.00 0.00 C \n+ATOM 1383 DCB SER P 3 7.360 23.800 -18.276 1.00 0.00 EP \n+ATOM 1384 HB3 SER P 3 7.656 23.163 -19.140 1.00 0.00 H \n+ATOM 1385 HB2 SER P 3 8.214 23.828 -17.562 1.00 0.00 H \n+ATOM 1386 OG SER P 3 7.081 25.117 -18.754 1.00 0.00 O \n+ATOM 1387 DOG SER P 3 7.081 25.117 -18.754 1.00 0.00 EP \n+ATOM 1388 HG SER P 3 6.747 25.614 -18.001 1.00 0.00 H \n+ATOM 1389 LPGA SER P 3 7.363 25.322 -18.727 1.00 0.00 EP \n+ATOM 1390 LPGB SER P 3 6.754 25.139 -18.876 1.00 0.00 EP \n+ATOM 1391 O SER P 3 6.638 20.907 -18.126 1.00 0.00 O \n+ATOM 1392 DOT1 SER P 3 6.638 20.907 -18.126 1.00 0.00 EP \n+ATOM 1393 OXT SER P 3 6.387 21.403 -15.982 1.00 0.00 O \n+ATOM 1394 DOT2 SER P 3 6.387 21.403 -15.982 1.00 0.00 EP \n+ATOM 1395 LPT1 SER P 3 6.673 20.584 -17.996 1.00 0.00 EP \n+ATOM 1396 LPT2 SER P 3 6.641 21.073 -18.434 1.00 0.00 EP \n+ATOM 1397 LPT3 SER P 3 6.433 21.057 -15.950 1.00 0.00 EP \n+ATOM 1398 LPT4 SER P 3 6.330 21.685 -15.784 1.00 0.00 EP \n+TER 1399 SER P 3\n+ATOM 1400 N THR Q 1 3.426 21.129 -2.979 1.00 0.00 N \n+ATOM 1401 DN THR Q 1 3.426 21.129 -2.979 1.00 0.00 EP \n+ATOM 1402 H THR Q 1 2.967 20.194 -2.938 1.00 0.00 H \n+ATOM 1403 H2 THR Q 1 2.809 21.782 -2.425 1.00 0.00 H \n+ATOM 1404 H3 THR Q 1 3.524 21.457 -3.956 1.00 0.00 H \n+ATOM 1405 CA THR Q 1 4.748 21.034 -2.257 1.00 0.00 C \n+ATOM 1406 DCA THR Q 1 4.748 21.034 -2.257 1.00 0.00 EP \n+ATOM 1407 HA THR Q 1 5.217 22.008 -2.273 1.00 0.00 H \n+ATOM 1408 C THR Q 1 4.343 20.706 -0.859 1.00 0.00 C \n+ATOM 1409 DC THR Q 1 4.343 20.706 -0.859 1.00 0.00 EP \n+ATOM 1410 O THR Q 1 3.604 19.745 -0.688 1.00 0.00 O \n+ATOM 1411 DO THR Q 1 3.604 19.745 -0.688 1.00 0.00 EP \n+ATOM 1412 LPOA THR Q 1 3.597 19.691 -0.983 1.00 0.00 EP \n+ATOM 1413 LPOB THR Q 1 3.605 19.791 -0.392 1.00 0.00 EP \n+ATOM 1414 CB THR Q 1 5.697 19.966 -2.802 1.00 0.00 C \n+ATOM 1415 DCB THR Q 1 5.697 19.966 -2.802 1.00 0.00 EP \n+ATOM 1416 HB THR Q 1 5.372 18.934 -2.520 1.00 0.00 H \n+ATOM 1417 OG1 THR Q 1 6.999 20.218 -2.297 1.00 0.00 O \n+ATOM 1418 DOG1 THR Q 1 6.999 20.218 -2.297 1.00 0.00 EP \n+ATOM 1419 HG1 THR Q 1 7.548 19.450 -2.503 1.00 0.00 H \n+ATOM 1420 LPGA THR Q 1 7.196 20.382 -2.536 1.00 0.00 EP \n+ATOM 1421 LPGB THR Q 1 7.028 20.109 -1.966 1.00 0.00 EP \n+ATOM 1422 CG2 THR Q 1 5.808 20.056 -4.333 1.00 0.00 C \n+ATOM 1423 DCG2 THR Q 1 5.808 20.056 -4.333 1.00 0.00 EP \n+ATOM 1424 HG21 THR Q 1 6.126 21.073 -4.649 1.00 0.00 H \n+ATOM 1425 HG22 THR Q 1 4.854 19.797 -4.835 1.00 0.00 H \n+ATOM 1426 HG23 THR Q 1 6.574 19.339 -4.702 1.00 0.00 H \n+ATOM 1427 N THR Q 2 4.660 21.600 0.095 1.00 0.00 N \n+ATOM 1428 DN THR Q 2 4.660 21.600 0.095 1.00 0.00 EP \n+ATOM 1429 H THR Q 2 5.565 22.017 0.150 1.00 0.00 H \n+ATOM 1430 CA THR Q 2 3.659 22.256 0.944 1.00 0.00 C \n+ATOM 1431 DCA THR Q 2 3.659 22.256 0.944 1.00 0.00 EP \n+ATOM 1432 HA THR Q 2 4.214 22.961 1.537 1.00 0.00 H \n+ATOM 1433 C THR Q 2 2.903 21.369 1.921 1.00 0.00 C \n+ATOM 1434 DC THR Q 2 2.903 21.369 1.921 1.00 0.00 EP \n+ATOM 1435 O THR Q 2 1.967 20.681 1.518 1.00 0.00 O \n+ATOM 1436 DO THR Q 2 1.967 20.681 1.518 1.00 0.00 EP \n+ATOM 1437 LPOA THR Q 2 2.005 20.784 1.238 1.00 0.00 EP \n+ATOM 1438 LPOB THR Q 2 1.921 20.572 1.794 1.00 0.00 EP \n+ATOM 1439 CB THR Q 2 2.627 23.107 0.181 1.00 0.00 C \n+ATOM 1440 DCB THR Q 2 2.627 23.107 0.181 1.00 0.00 EP \n+ATOM 1441 HB THR Q 2 1.880 23.543 0.890 1.00 0.00 H \n+ATOM 1442 OG1 THR Q 2 1.938 22.354 -0.819 1.00 0.00 O \n+ATOM 1443 DOG1 THR Q 2 1.938 22.354 -0.819 1.00 0.00 EP \n+ATOM 1444 HG1 THR Q 2 1.510 21.656 -0.284 1.00 0.00 H \n+ATOM 1445 LPGA THR Q 2 1.617 22.482 -0.873 1.00 0.00 EP \n+ATOM 1446 LPGB THR Q 2 2.143 22.101 -0.949 1.00 0.00 EP \n+ATOM 1447 CG2 THR Q 2 3.339 24.275 -0.519 1.00 0.00 C \n+ATOM 1448 DCG2 THR Q 2 3.339 24.275 -0.519 1.00 0.00 EP \n+ATOM 1449 HG21 THR Q 2 4.082 23.920 -1.259 1.00 0.00 H \n+ATOM 1450 HG22 THR Q 2 3.862 24.908 0.231 1.00 0.00 H \n+ATOM 1451 HG23 THR Q 2 2.594 24.912 -1.044 1.00 0.00 H \n+ATOM 1452 N THR Q 3 3.210 21.401 3.224 1.00 0.00 N \n+ATOM 1453 DN THR Q 3 3.210 21.401 3.224 1.00 0.00 EP \n+ATOM 1454 H THR Q 3 2.676 20.874 3.889 1.00 0.00 H \n+ATOM 1455 CA THR Q 3 4.151 22.264 3.924 1.00 0.00 C \n+ATOM 1456 DCA THR Q 3 4.151 22.264 3.924 1.00 0.00 EP \n+ATOM 1457 HA THR Q 3 4.066 23.274 3.558 1.00 0.00 H \n+ATOM 1458 C THR Q 3 3.675 22.319 5.386 1.00 0.00 C \n+ATOM 1459 DC THR Q 3 3.675 22.319 5.386 1.00 0.00 EP \n+ATOM 1460 CB THR Q 3 5.621 21.825 3.942 1.00 0.00 C \n+ATOM 1461 DCB THR Q 3 5.621 21.825 3.942 1.00 0.00 EP \n+ATOM 1462 HB THR Q 3 6.175 22.442 4.691 1.00 0.00 H \n+ATOM 1463 OG1 THR Q 3 6.260 22.006 2.681 1.00 0.00 O \n+ATOM 1464 DOG1 THR Q 3 6.260 22.006 2.681 1.00 0.00 EP \n+ATOM 1465 HG1 THR Q 3 7.183 21.813 2.868 1.00 0.00 H \n+ATOM 1466 LPGA THR Q 3 6.260 21.708 2.497 1.00 0.00 EP \n+ATOM 1467 LPGB THR Q 3 6.363 22.338 2.639 1.00 0.00 EP \n+ATOM 1468 CG2 THR Q 3 5.752 20.340 4.314 1.00 0.00 C \n+ATOM 1469 DCG2 THR Q 3 5.752 20.340 4.314 1.00 0.00 EP \n+ATOM 1470 HG21 THR Q 3 5.261 20.150 5.294 1.00 0.00 H \n+ATOM 1471 HG22 THR Q 3 5.262 19.700 3.551 1.00 0.00 H \n+ATOM 1472 HG23 THR Q 3 6.817 20.045 4.397 1.00 0.00 H \n+ATOM 1473 O THR Q 3 4.218 23.167 6.140 1.00 0.00 O \n+ATOM 1474 DOT1 THR Q 3 4.218 23.167 6.140 1.00 0.00 EP \n+ATOM 1475 OXT THR Q 3 2.775 21.516 5.757 1.00 0.00 O \n+ATOM 1476 DOT2 THR Q 3 2.775 21.516 5.757 1.00 0.00 EP \n+ATOM 1477 LPT1 THR Q 3 4.083 23.145 6.462 1.00 0.00 EP \n+ATOM 1478 LPT2 THR Q 3 4.457 23.350 5.961 1.00 0.00 EP \n+ATOM 1479 LPT3 THR Q 3 2.702 21.566 6.095 1.00 0.00 EP \n+ATOM 1480 LPT4 THR Q 3 2.677 21.314 5.488 1.00 0.00 EP \n+TER 1481 THR Q 3\n+ATOM 1482 N VAL R 1 4.688 19.445 20.996 1.00 0.00 N \n+ATOM 1483 DN VAL R 1 4.688 19.445 20.996 1.00 0.00 EP \n+ATOM 1484 H VAL R 1 5.366 18.973 20.361 1.00 0.00 H \n+ATOM 1485 H2 VAL R 1 5.319 19.741 21.802 1.00 0.00 H \n+ATOM 1486 H3 VAL R 1 3.934 18.820 21.316 1.00 0.00 H \n+ATOM 1487 CA VAL R 1 4.206 20.691 20.333 1.00 0.00 C \n+ATOM 1488 DCA VAL R 1 4.206 20.691 20.333 1.00 0.00 EP \n+ATOM 1489 HA VAL R 1 5.079 21.286 20.161 1.00 0.00 H \n+ATOM 1490 C VAL R 1 3.242 21.501 21.202 1.00 0.00 C \n+ATOM 1491 DC VAL R 1 3.242 21.501 21.202 1.00 0.00 EP \n+ATOM 1492 O VAL R 1 2.080 21.137 21.344 1.00 0.00 O \n+ATOM 1493 DO VAL R 1 2.080 21.137 21.344 1.00 0.00 EP \n+ATOM 1494 LPOA VAL R 1 2.128 20.899 21.167 1.00 0.00 EP \n+ATOM 1495 LPOB VAL R 1 2.023 21.372 21.521 1.00 0.00 EP \n+ATOM 1496 CB VAL R 1 3.672 20.384 18.921 1.00 0.00 C \n+ATOM 1497 DCB VAL R 1 3.672 20.384 18.921 1.00 0.00 EP \n+ATOM 1498 HB VAL R 1 4.538 20.035 18.305 1.00 0.00 H \n+ATOM 1499 CG1 VAL R 1 2.609 19.261 18.898 1.00 0.00 C \n+ATOM 1500 DCG1 VAL R 1 2.609 19.261 18.898 1.00 0.00 EP \n+ATOM 1501 HG11 VAL R 1 3.008 18.296 19.270 1.00 0.00 H \n+ATOM 1502 HG12 VAL R 1 2.269 19.099 17.851 1.00 0.00 H \n+ATOM 1503 HG13 VAL R 1 1.716 19.541 19.496 1.00 0.00 H \n+ATOM 1504 CG2 VAL R 1 3.139 21.668 18.248 1.00 0.00 C \n+ATOM 1505 DCG2 VAL R 1 3.139 21.668 18.248 1.00 0.00 EP \n+ATOM 1506 HG21 VAL R 1 2.889 21.465 17.184 1.00 0.00 H \n+ATOM 1507 HG22 VAL R 1 2.217 22.037 18.745 1.00 0.00 H \n+ATOM 1508 HG23 VAL R 1 3.903 22.476 18.271 1.00 0.00 H \n+ATOM 1509 N VAL R 2 3.626 22.603 21.888 1.00 0.00 N \n+ATOM 1510 DN VAL R 2 3.626 22.603 21.888 1.00 0.00 EP \n+ATOM 1511 H VAL R 2 2.879 23.070 22.350 1.00 0.00 H \n+ATOM 1512 CA VAL R 2 4.940 23.195 22.144 1.00 0.00 C \n+ATOM 1513 DCA VAL R 2 4.940 23.195 22.144 1.00 0.00 EP \n+ATOM 1514 HA VAL R 2 5.459 22.479 22.755 1.00 0.00 H \n+ATOM 1515 C VAL R 2 5.809 23.481 20.911 1.00 0.00 C \n+ATOM 1516 DC VAL R 2 5.809 23.481 20.911 1.00 0.00 EP \n+ATOM 1517 O VAL R 2 5.340 24.014 19.910 1.00 0.00 O \n+ATOM 1518 DO VAL R 2 5.340 24.014 19.910 1.00 0.00 EP \n+ATOM 1519 LPOA VAL R 2 5.070 24.030 20.039 1.00 0.00 EP \n+ATOM 1520 LPOB VAL R 2 5.607 24.002 19.772 1.00 0.00 EP \n+ATOM 1521 CB VAL R 2 4.788 24.441 23.029 1.00 0.00 C \n+ATOM 1522 DCB VAL R 2 4.788 24.441 23.029 1.00 0.00 EP \n+ATOM 1523 HB VAL R 2 4.215 24.133 23.937 1.00 0.00 H \n+ATOM 1524 CG1 VAL R 2 3.980 25.549 22.320 1.00 0.00 C \n+ATOM 1525 DCG1 VAL R 2 3.980 25.549 22.320 1.00 0.00 EP \n+ATOM 1526 HG11 VAL R 2 2.984 25.188 21.994 1.00 0.00 H \n+ATOM 1527 HG12 VAL R 2 4.524 25.924 21.427 1.00 0.00 H \n+ATOM 1528 HG13 VAL R 2 3.829 26.408 23.008 1.00 0.00 H \n+ATOM 1529 CG2 VAL R 2 6.154 24.975 23.510 1.00 0.00 C \n+ATOM 1530 DCG2 VAL R 2 6.154 24.975 23.510 1.00 0.00 EP \n+ATOM 1531 HG21 VAL R 2 6.721 24.185 24.046 1.00 0.00 H \n+ATOM 1532 HG22 VAL R 2 6.003 25.825 24.209 1.00 0.00 H \n+ATOM 1533 HG23 VAL R 2 6.766 25.343 22.659 1.00 0.00 H \n+ATOM 1534 N VAL R 3 7.103 23.104 20.891 1.00 0.00 N \n+ATOM 1535 DN VAL R 3 7.103 23.104 20.891 1.00 0.00 EP \n+ATOM 1536 H VAL R 3 7.629 23.332 20.080 1.00 0.00 H \n+ATOM 1537 CA VAL R 3 7.782 22.214 21.823 1.00 0.00 C \n+ATOM 1538 DCA VAL R 3 7.782 22.214 21.823 1.00 0.00 EP \n+ATOM 1539 HA VAL R 3 7.567 22.549 22.826 1.00 0.00 H \n+ATOM 1540 C VAL R 3 7.208 20.777 21.717 1.00 0.00 C \n+ATOM 1541 DC VAL R 3 7.208 20.777 21.717 1.00 0.00 EP \n+ATOM 1542 CB VAL R 3 9.306 22.251 21.687 1.00 0.00 C \n+ATOM 1543 DCB VAL R 3 9.306 22.251 21.687 1.00 0.00 EP \n+ATOM 1544 HB VAL R 3 9.742 21.463 22.346 1.00 0.00 H \n+ATOM 1545 CG1 VAL R 3 9.775 21.992 20.239 1.00 0.00 C \n+ATOM 1546 DCG1 VAL R 3 9.775 21.992 20.239 1.00 0.00 EP \n+ATOM 1547 HG11 VAL R 3 10.885 21.995 20.196 1.00 0.00 H \n+ATOM 1548 HG12 VAL R 3 9.403 22.772 19.545 1.00 0.00 H \n+ATOM 1549 HG13 VAL R 3 9.423 21.002 19.881 1.00 0.00 H \n+ATOM 1550 CG2 VAL R 3 9.810 23.623 22.182 1.00 0.00 C \n+ATOM 1551 DCG2 VAL R 3 9.810 23.623 22.182 1.00 0.00 EP \n+ATOM 1552 HG21 VAL R 3 10.919 23.659 22.138 1.00 0.00 H \n+ATOM 1553 HG22 VAL R 3 9.409 24.442 21.549 1.00 0.00 H \n+ATOM 1554 HG23 VAL R 3 9.495 23.799 23.232 1.00 0.00 H \n+ATOM 1555 O VAL R 3 7.286 20.124 20.644 1.00 0.00 O \n+ATOM 1556 DOT1 VAL R 3 7.286 20.124 20.644 1.00 0.00 EP \n+ATOM 1557 OXT VAL R 3 6.516 20.351 22.686 1.00 0.00 O \n+ATOM 1558 DOT2 VAL R 3 6.516 20.351 22.686 1.00 0.00 EP \n+ATOM 1559 LPT1 VAL R 3 7.096 19.831 20.668 1.00 0.00 EP \n+ATOM 1560 LPT2 VAL R 3 7.491 20.293 20.416 1.00 0.00 EP \n+ATOM 1561 LPT3 VAL R 3 6.367 20.046 22.601 1.00 0.00 EP \n+ATOM 1562 LPT4 VAL R 3 6.534 20.575 22.954 1.00 0.00 EP \n+TER 1563 VAL R 3\n+ATOM 1564 N TRP S 1 23.377 -18.215 -17.866 1.00 0.00 N \n+ATOM 1565 DN TRP S 1 23.377 -18.215 -17.866 1.00 0.00 EP \n+ATOM 1566 H TRP S 1 24.061 -17.543 -17.416 1.00 0.00 H \n+ATOM 1567 H2 TRP S 1 22.441 -18.003 -17.486 1.00 0.00 H \n+ATOM 1568 H3 TRP S 1 23.721 -19.122 -17.485 1.00 0.00 H \n+ATOM 1569 CA TRP S 1 23.442 -18.232 -19.357 1.00 0.00 C \n+ATOM 1570 DCA TRP S 1 23.442 -18.232 -19.357 1.00 0.00 EP \n+ATOM 1571 HA TRP S 1 22.577 -18.818 -19.639 1.00 0.00 H \n+ATOM 1572 C TRP S 1 23.190 -16.948 -20.160 1.00 0.00 C \n+ATOM 1573 DC TRP S 1 23.190 -16.948 -20.160 1.00 0.00 EP \n+ATOM 1574 O TRP S 1 22.368 -16.991 -21.067 1.00 0.00 O \n+ATOM 1575 DO TRP S 1 22.368 -16.991 -21.067 1.00 0.00 EP \n+ATOM 1576 LPOA TRP S 1 22.314 -17.281 -21.011 1.00 0.00 EP \n+ATOM 1577 LPOB TRP S 1 22.416 -16.702 -21.131 1.00 0.00 EP \n+ATOM 1578 CB TRP S 1 24.669 -19.057 -19.860 1.00 0.00 C \n+ATOM 1579 DCB TRP S 1 24.669 -19.057 -19.860 1.00 0.00 EP \n+ATOM 1580 HB3 TRP S 1 25.064 -18.610 -20.800 1.00 0.00 H \n+ATOM 1581 HB2 TRP S 1 25.504 -18.996 -19.130 1.00 0.00 H \n+ATOM 1582 CG TRP S 1 24.377 -20.499 -20.146 1.00 0.00 C \n+ATOM 1583 DCG TRP S 1 24.377 -20.499 -20.146 1.00 0.00 EP \n+ATOM 1584 CD1 TRP S 1 24.029 -20.998 -21.375 1.00 0.00 C \n+ATOM 1585 DCD1 TRP S 1 24.029 -20.998 -21.375 1.00 0.00 EP \n+ATOM 1586 HD1 TRP S 1 23.968 -20.400 -22.279 1.00 0.00 H \n+ATOM 1587 NE1 TRP S 1 23.782 -22.346 -21.271 1.00 0.00 N \n+ATOM 1588 DNE1 TRP S 1 23.782 -22.346 -21.271 1.00 0.00 EP \n+ATOM 1589 HE1 TRP S 1 23.534 -22.963 -21.987 1.00 0.00 H \n+ATOM 1590 CE2 TRP S 1 23.971 -22.748 -19.983 1.00 0.00 C \n+ATOM 1591 DCE2 TRP S 1 23.971 -22.748 -19.983 1.00 0.00 EP \n+ATOM 1592 CD2 TRP S 1 24.354 -21.611 -19.232 1.00 0.00 C \n+ATOM 1593 DCD2 TRP S 1 24.354 -21.611 -19.232 1.00 0.00 EP \n+ATOM 1594 CE3 TRP S 1 24.624 -21.750 -17.869 1.00 0.00 C \n+ATOM 1595 DCE3 TRP S 1 24.624 -21.750 -17.869 1.00 0.00 EP \n+ATOM 1596 HE3 TRP S 1 24.960 -20.919 -17.268 1.00 0.00 H \n+ATOM 1597 CZ3 TRP S 1 24.496 -23.014 -17.286 1.00 0.00 C \n+ATOM 1598 DCZ3 TRP S 1 24.496 -23.014 -17.286 1.00 0.00 EP \n+ATOM 1599 HZ3 TRP S 1 24.710 -23.137 -16.232 1.00 0.00 H \n+ATOM 1600 CZ2 TRP S 1 23.838 -23.999 -19.404 1.00 0.00 C \n+ATOM 1601 DCZ2 TRP S 1 23.838 -23.999 -19.404 1.00 0.00 EP \n+ATOM 1602 HZ2 TRP S 1 23.542 -24.861 -19.981 1.00 0.00 H \n+ATOM 1603 CH2 TRP S 1 24.106 -24.118 -18.038 1.00 0.00 C \n+ATOM 1604 DCH2 TRP S 1 24.106 -24.118 -18.038 1.00 0.00 EP \n+ATOM 1605 HH2 TRP S 1 24.018 -25.084 -17.557 1.00 0.00 H \n+ATOM 1606 LP TRP S 1 24.232 -22.888 -18.631 1.00 0.00 EP \n+ATOM 1607 N TRP S 2 23.775 -15.750 -19.931 1.00 0.00 N \n+ATOM 1608 DN TRP S 2 23.775 -15.750 -19.931 1.00 0.00 EP \n+ATOM 1609 H TRP S 2 23.465 -15.042 -20.560 1.00 0.00 H \n+ATOM 1610 CA TRP S 2 24.743 -15.268 -18.956 1.00 0.00 C \n+ATOM 1611 DCA TRP S 2 24.743 -15.268 -18.956 1.00 0.00 EP \n+ATOM 1612 HA TRP S 2 24.286 -15.419 -17.992 1.00 0.00 H \n+ATOM 1613 C TRP S 2 26.076 -15.998 -18.892 1.00 0.00 C \n+ATOM 1614 DC TRP S 2 26.076 -15.998 -18.892 1.00 0.00 EP \n+ATOM 1615 O TRP S 2 26.418 -16.756 -19.787 1.00 0.00 O \n+ATOM 1616 DO TRP S 2 26.418 -16.756 -19.787 1.00 0.00 EP \n+ATOM 1617 LPOA TRP S 2 26.164 -16.703 -19.937 1.00 0.00 EP \n+ATOM 1618 LPOB TRP S 2 26.676 -16.816 -19.645 1.00 0.00 EP \n+ATOM 1619 CB TRP S 2 24.966 -13.740 -19.119 1.00 0.00 C \n+ATOM 1620 DCB TRP S 2 24.966 -13.740 -19.119 1.00 0.00 EP \n+ATOM 1621 HB3 TRP S 2 25.647 -13.362 -18.327 1.00 0.00 H \n+ATOM 1622 HB2 TRP S 2 25.457 -13.552 -20.100 1.00 0.00 H \n+ATOM 1623 CG TRP S 2 23.696 -12.952 -19.037 1.00 0.00 C \n+ATOM 1624 DCG TRP S 2 23.696 -12.952 -19.037 1.00 0.00 EP \n+ATOM 1625 CD1 TRP S 2 23.131 -12.192 -20.030 1.00 0.00 C \n+ATOM 1626 DCD1 TRP S 2 23.131 -12.192 -20.030 1.00 0.00 EP \n+ATOM 1627 HD1 TRP S 2 23.583 -12.023 -21.001 1.00 0.00 H \n+ATOM 1628 NE1 TRP S 2 21.929 -11.686 -19.592 1.00 0.00 N \n+ATOM 1629 DNE1 TRP S 2 21.929 -11.686 -19.592 1.00 0.00 EP \n+ATOM 1630 HE1 TRP S 2 21.313 -11.104 -20.078 1.00 0.00 H \n+ATOM 1631 CE2 TRP S 2 21.692 -12.106 -18.316 1.00 0.00 C \n+ATOM 1632 DCE2 TRP S 2 21.692 -12.106 -18.316 1.00 0.00 EP \n+ATOM 1633 CD2 TRP S 2 22.786 -12.912 -17.921 1.00 0.00 C \n+ATOM 1634 DCD2 TRP S 2 22.786 -12.912 -17.921 1.00 0.00 EP \n+ATOM 1635 CE3 TRP S 2 22.793 -13.484 -16.646 1.00 0.00 C \n+ATOM 1636 DCE3 TRP S 2 22.793 -13.484 -16.646 1.00 0.00 EP \n+ATOM 1637 HE3 TRP S 2 23.612 -14.102 -16.302 1.00 0.00 H \n+ATOM 1638 CZ3 TRP S 2 21.709 -13.240 -15.798 1.00 0.00 C \n+ATOM 1639 DCZ3 TRP S 2 21.709 -13.240 -15.798 1.00 0.00 EP \n+ATOM 1640 HZ3 TRP S 2 21.701 -13.674 -14.805 1.00 0.00 H \n+ATOM 1641 CZ2 TRP S 2 20.618 -11.866 -17.475 1.00 0.00 C \n+ATOM 1642 DCZ2 TRP S 2 20.618 -11.866 -17.475 1.00 0.00 EP \n+ATOM 1643 HZ2 TRP S 2 19.787 -11.251 -17.781 1.00 0.00 H \n+ATOM 1644 CH2 TRP S 2 20.642 -12.445 -16.204 1.00 0.00 C \n+ATOM 1645 DCH2 TRP S 2 20.642 -12.445 -16.204 1.00 0.00 EP \n+ATOM 1646 HH2 TRP S 2 19.818 -12.273 -15.523 1.00 0.00 H \n+ATOM 1647 LP TRP S 2 21.697 -12.671 -17.053 1.00 0.00 EP \n+ATOM 1648 N TRP S 3 26.807 -15.785 -17.777 1.00 0.00 N \n+ATOM 1649 DN TRP S 3 26.807 -15.785 -17.777 1.00 0.00 EP \n+ATOM 1650 H TRP S 3 26.702 -14.920 -17.310 1.00 0.00 H \n+ATOM 1651 CA TRP S 3 27.123 -16.848 -16.826 1.00 0.00 C \n+ATOM 1652 DCA TRP S 3 27.123 -16.848 -16.826 1.00 0.00 EP \n+ATOM 1653 HA TRP S 3 27.429 -16.318 -15.936 1.00 0.00 H \n+ATOM 1654 C TRP S 3 25.812 -17.556 -16.384 1.00 0.00 C \n+ATOM 1655 DC TRP S 3 25.812 -17.556 -16.384 1.00 0.00 EP \n+ATOM 1656 CB TRP S 3 28.344 -17.779 -17.146 1.00 0.00 C \n+ATOM 1657 DCB TRP S 3 28.344 -17.779 -17.146 1.00 0.00 EP \n+ATOM 1658 HB3 TRP S 3 29.229 -17.123 -17.287 1.00 0.00 H \n+ATOM 1659 HB2 TRP S 3 28.533 -18.378 -16.227 1.00 0.00 H \n+ATOM 1660 CG TRP S 3 28.284 -18.727 -18.308 1.00 0.00 C \n+ATOM 1661 DCG TRP S 3 28.284 -18.727 -18.308 1.00 0.00 EP \n+ATOM 1662 CD1 TRP S 3 27.819 -20.015 -18.235 1.00 0.00 C \n+ATOM 1663 DCD1 TRP S 3 27.819 -20.015 -18.235 1.00 0.00 EP \n+ATOM 1664 HD1 TRP S 3 27.362 -20.430 -17.343 1.00 0.00 H \n+ATOM 1665 NE1 TRP S 3 27.958 -20.631 -19.456 1.00 0.00 N \n+ATOM 1666 DNE1 TRP S 3 27.958 -20.631 -19.456 1.00 0.00 EP \n+ATOM 1667 HE1 TRP S 3 27.627 -21.514 -19.708 1.00 0.00 H \n+ATOM 1668 CE2 TRP S 3 28.550 -19.770 -20.333 1.00 0.00 C \n+ATOM 1669 DCE2 TRP S 3 28.550 -19.770 -20.333 1.00 0.00 EP \n+ATOM 1670 CD2 TRP S 3 28.790 -18.556 -19.646 1.00 0.00 C \n+ATOM 1671 DCD2 TRP S 3 28.790 -18.556 -19.646 1.00 0.00 EP \n+ATOM 1672 CE3 TRP S 3 29.424 -17.506 -20.315 1.00 0.00 C \n+ATOM 1673 DCE3 TRP S 3 29.424 -17.506 -20.315 1.00 0.00 EP \n+ATOM 1674 HE3 TRP S 3 29.602 -16.566 -19.816 1.00 0.00 H \n+ATOM 1675 CZ3 TRP S 3 29.789 -17.683 -21.653 1.00 0.00 C \n+ATOM 1676 DCZ3 TRP S 3 29.789 -17.683 -21.653 1.00 0.00 EP \n+ATOM 1677 HZ3 TRP S 3 30.270 -16.872 -22.185 1.00 0.00 H \n+ATOM 1678 CZ2 TRP S 3 28.912 -19.947 -21.659 1.00 0.00 C \n+ATOM 1679 DCZ2 TRP S 3 28.912 -19.947 -21.659 1.00 0.00 EP \n+ATOM 1680 HZ2 TRP S 3 28.727 -20.875 -22.173 1.00 0.00 H \n+ATOM 1681 CH2 TRP S 3 29.538 -18.882 -22.314 1.00 0.00 C \n+ATOM 1682 DCH2 TRP S 3 29.538 -18.882 -22.314 1.00 0.00 EP \n+ATOM 1683 HH2 TRP S 3 29.834 -18.989 -23.350 1.00 0.00 H \n+ATOM 1684 LP TRP S 3 29.171 -18.728 -21.001 1.00 0.00 EP \n+ATOM 1685 O TRP S 3 24.820 -16.808 -16.143 1.00 0.00 O \n+ATOM 1686 DOT1 TRP S 3 24.820 -16.808 -16.143 1.00 0.00 EP \n+ATOM 1687 OXT TRP S 3 25.696 -18.805 -16.381 1.00 0.00 O \n+ATOM 1688 DOT2 TRP S 3 25.696 -18.805 -16.381 1.00 0.00 EP \n+ATOM 1689 LPT1 TRP S 3 24.536 -17.003 -16.082 1.00 0.00 EP \n+ATOM 1690 LPT2 TRP S 3 24.917 -16.472 -16.159 1.00 0.00 EP \n+ATOM 1691 LPT3 TRP S 3 25.366 -18.895 -16.307 1.00 0.00 EP \n+ATOM 1692 LPT4 TRP S 3 26.004 -18.954 -16.455 1.00 0.00 EP \n+TER 1693 TRP S 3\n+ATOM 1694 N TYR T 1 24.986 -17.799 -1.768 1.00 0.00 N \n+ATOM 1695 DN TYR T 1 24.986 -17.799 -1.768 1.00 0.00 EP \n+ATOM 1696 H TYR T 1 25.803 -18.430 -1.638 1.00 0.00 H \n+ATOM 1697 H2 TYR T 1 25.309 -16.825 -1.515 1.00 0.00 H \n+ATOM 1698 H3 TYR T 1 24.654 -17.832 -2.750 1.00 0.00 H \n+ATOM 1699 CA TYR T 1 23.911 -18.208 -0.797 1.00 0.00 C \n+ATOM 1700 DCA TYR T 1 23.911 -18.208 -0.797 1.00 0.00 EP \n+ATOM 1701 HA TYR T 1 23.057 -17.559 -0.936 1.00 0.00 H \n+ATOM 1702 C TYR T 1 24.497 -17.931 0.558 1.00 0.00 C \n+ATOM 1703 DC TYR T 1 24.497 -17.931 0.558 1.00 0.00 EP \n+ATOM 1704 O TYR T 1 25.494 -18.548 0.911 1.00 0.00 O \n+ATOM 1705 DO TYR T 1 25.494 -18.548 0.911 1.00 0.00 EP \n+ATOM 1706 LPOA TYR T 1 25.500 -18.698 0.651 1.00 0.00 EP \n+ATOM 1707 LPOB TYR T 1 25.497 -18.404 1.174 1.00 0.00 EP \n+ATOM 1708 CB TYR T 1 23.531 -19.709 -0.953 1.00 0.00 C \n+ATOM 1709 DCB TYR T 1 23.531 -19.709 -0.953 1.00 0.00 EP \n+ATOM 1710 HB3 TYR T 1 22.761 -19.993 -0.202 1.00 0.00 H \n+ATOM 1711 HB2 TYR T 1 24.413 -20.369 -0.796 1.00 0.00 H \n+ATOM 1712 CG TYR T 1 22.944 -19.973 -2.315 1.00 0.00 C \n+ATOM 1713 DCG TYR T 1 22.944 -19.973 -2.315 1.00 0.00 EP \n+ATOM 1714 CD1 TYR T 1 23.591 -20.826 -3.227 1.00 0.00 C \n+ATOM 1715 DCD1 TYR T 1 23.591 -20.826 -3.227 1.00 0.00 EP \n+ATOM 1716 HD1 TYR T 1 24.514 -21.316 -2.951 1.00 0.00 H \n+ATOM 1717 CD2 TYR T 1 21.728 -19.375 -2.688 1.00 0.00 C \n+ATOM 1718 DCD2 TYR T 1 21.728 -19.375 -2.688 1.00 0.00 EP \n+ATOM 1719 HD2 TYR T 1 21.195 -18.741 -1.994 1.00 0.00 H \n+ATOM 1720 CE1 TYR T 1 23.045 -21.058 -4.498 1.00 0.00 C \n+ATOM 1721 DCE1 TYR T 1 23.045 -21.058 -4.498 1.00 0.00 EP \n+ATOM 1722 HE1 TYR T 1 23.551 -21.715 -5.190 1.00 0.00 H \n+ATOM 1723 CE2 TYR T 1 21.184 -19.604 -3.959 1.00 0.00 C \n+ATOM 1724 DCE2 TYR T 1 21.184 -19.604 -3.959 1.00 0.00 EP \n+ATOM 1725 HE2 TYR T 1 20.248 -19.145 -4.246 1.00 0.00 H \n+ATOM 1726 CZ TYR T 1 21.843 -20.441 -4.862 1.00 0.00 C \n+ATOM 1727 DCZ TYR T 1 21.843 -20.441 -4.862 1.00 0.00 EP \n+ATOM 1728 OH TYR T 1 21.279 -20.658 -6.132 1.00 0.00 O \n+ATOM 1729 DOH TYR T 1 21.279 -20.658 -6.132 1.00 0.00 EP \n+ATOM 1730 HH TYR T 1 21.818 -21.299 -6.600 1.00 0.00 H \n+ATOM 1731 LP1A TYR T 1 21.043 -20.916 -6.122 1.00 0.00 EP \n+ATOM 1732 LP1B TYR T 1 21.407 -20.431 -6.366 1.00 0.00 EP \n+ATOM 1733 LP TYR T 1 22.378 -20.227 -3.594 1.00 0.00 EP \n+ATOM 1734 N TYR T 2 24.000 -16.869 1.233 1.00 0.00 N \n+ATOM 1735 DN TYR T 2 24.000 -16.869 1.233 1.00 0.00 EP \n+ATOM 1736 H TYR T 2 23.063 -16.557 1.122 1.00 0.00 H \n+ATOM 1737 CA TYR T 2 24.878 -15.865 1.834 1.00 0.00 C \n+ATOM 1738 DCA TYR T 2 24.878 -15.865 1.834 1.00 0.00 EP \n+ATOM 1739 HA TYR T 2 24.239 -15.043 2.125 1.00 0.00 H \n+ATOM 1740 C TYR T 2 25.848 -15.255 0.809 1.00 0.00 C \n+ATOM 1741 DC TYR T 2 25.848 -15.255 0.809 1.00 0.00 EP \n+ATOM 1742 O TYR T 2 25.761 -15.534 -0.396 1.00 0.00 O \n+ATOM 1743 DO TYR T 2 25.761 -15.534 -0.396 1.00 0.00 EP \n+ATOM 1744 LPOA TYR T 2 25.527 -15.715 -0.343 1.00 0.00 EP \n+ATOM 1745 LPOB TYR T 2 25.994 -15.356 -0.460 1.00 0.00 EP \n+ATOM 1746 CB TYR T 2 25.610 -16.348 3.120 1.00 0.00 C \n+ATOM 1747 DCB TYR T 2 25.610 -16.348 3.120 1.00 0.00 EP \n+ATOM 1748 HB3 TYR T 2 26.304 -17.185 2.895 1.00 0.00 H \n+ATOM 1749 HB2 TYR T 2 26.206 -15.533 3.586 1.00 0.00 H \n+ATOM 1750 CG TYR T 2 24.600 -16.803 4.137 1.00 0.00 C \n+ATOM 1751 DCG TYR T 2 24.600 -16.803 4.137 1.00 0.00 EP \n+ATOM 1752 CD1 TYR T 2 24.337 -18.170 4.332 1.00 0.00 C \n+ATOM 1753 DCD1 TYR T 2 24.337 -18.170 4.332 1.00 0.00 EP \n+ATOM 1754 HD1 TYR T 2 24.865 -18.902 3.737 1.00 0.00 H \n+ATOM 1755 CD2 TYR T 2 23.927 -15.860 4.934 1.00 0.00 C \n+ATOM 1756 DCD2 TYR T 2 23.927 -15.860 4.934 1.00 0.00 EP \n+ATOM 1757 HD2 TYR T 2 24.142 -14.808 4.809 1.00 0.00 H \n+ATOM 1758 CE1 TYR T 2 23.396 -18.585 5.284 1.00 0.00 C \n+ATOM 1759 DCE1 TYR T 2 23.396 -18.585 5.284 1.00 0.00 EP \n+ATOM 1760 HE1 TYR T 2 23.195 -19.636 5.430 1.00 0.00 H \n+ATOM 1761 CE2 TYR T 2 22.990 -16.274 5.891 1.00 0.00 C \n+ATOM 1762 DCE2 TYR T 2 22.990 -16.274 5.891 1.00 0.00 EP \n+ATOM 1763 HE2 TYR T 2 22.482 -15.536 6.494 1.00 0.00 H \n+ATOM 1764 CZ TYR T 2 22.723 -17.637 6.061 1.00 0.00 C \n+ATOM 1765 DCZ TYR T 2 22.723 -17.637 6.061 1.00 0.00 EP \n+ATOM 1766 OH TYR T 2 21.784 -18.064 7.018 1.00 0.00 O \n+ATOM 1767 DOH TYR T 2 21.784 -18.064 7.018 1.00 0.00 EP \n+ATOM 1768 HH TYR T 2 21.497 -17.292 7.507 1.00 0.00 H \n+ATOM 1769 LP1A TYR T 2 21.460 -18.061 6.885 1.00 0.00 EP \n+ATOM 1770 LP1B TYR T 2 21.943 -18.154 7.316 1.00 0.00 EP \n+ATOM 1771 LP TYR T 2 23.669 -17.225 5.124 1.00 0.00 EP \n+ATOM 1772 N TYR T 3 26.758 -14.403 1.270 1.00 0.00 N \n+ATOM 1773 DN TYR T 3 26.758 -14.403 1.270 1.00 0.00 EP \n+ATOM 1774 H TYR T 3 26.832 -14.070 2.215 1.00 0.00 H \n+ATOM 1775 CA TYR T 3 27.795 -13.764 0.513 1.00 0.00 C \n+ATOM 1776 DCA TYR T 3 27.795 -13.764 0.513 1.00 0.00 EP \n+ATOM 1777 HA TYR T 3 27.365 -13.276 -0.349 1.00 0.00 H \n+ATOM 1778 C TYR T 3 28.316 -12.638 1.438 1.00 0.00 C \n+ATOM 1779 DC TYR T 3 28.316 -12.638 1.438 1.00 0.00 EP \n+ATOM 1780 CB TYR T 3 28.931 -14.743 0.083 1.00 0.00 C \n+ATOM 1781 DCB TYR T 3 28.931 -14.743 0.083 1.00 0.00 EP \n+ATOM 1782 HB3 TYR T 3 28.566 -15.376 -0.750 1.00 0.00 H \n+ATOM 1783 HB2 TYR T 3 29.808 -14.161 -0.277 1.00 0.00 H \n+ATOM 1784 CG TYR T 3 29.381 -15.641 1.214 1.00 0.00 C \n+ATOM 1785 DCG TYR T 3 29.381 -15.641 1.214 1.00 0.00 EP \n+ATOM 1786 CD1 TYR T 3 30.232 -15.150 2.218 1.00 0.00 C \n+ATOM 1787 DCD1 TYR T 3 30.232 -15.150 2.218 1.00 0.00 EP \n+ATOM 1788 HD1 TYR T 3 30.546 -14.114 2.183 1.00 0.00 H \n+ATOM 1789 CD2 TYR T 3 28.970 -16.986 1.274 1.00 0.00 C \n+ATOM 1790 DCD2 TYR T 3 28.970 -16.986 1.274 1.00 0.00 EP \n+ATOM 1791 HD2 TYR T 3 28.315 -17.376 0.512 1.00 0.00 H \n+ATOM 1792 CE1 TYR T 3 30.642 -15.972 3.276 1.00 0.00 C \n+ATOM 1793 DCE1 TYR T 3 30.642 -15.972 3.276 1.00 0.00 EP \n+ATOM 1794 HE1 TYR T 3 31.281 -15.564 4.044 1.00 0.00 H \n+ATOM 1795 CE2 TYR T 3 29.379 -17.812 2.331 1.00 0.00 C \n+ATOM 1796 DCE2 TYR T 3 29.379 -17.812 2.331 1.00 0.00 EP \n+ATOM 1797 HE2 TYR T 3 29.050 -18.839 2.382 1.00 0.00 H \n+ATOM 1798 CZ TYR T 3 30.213 -17.303 3.330 1.00 0.00 C \n+ATOM 1799 DCZ TYR T 3 30.213 -17.303 3.330 1.00 0.00 EP \n+ATOM 1800 OH TYR T 3 30.613 -18.132 4.395 1.00 0.00 O \n+ATOM 1801 DOH TYR T 3 30.613 -18.132 4.395 1.00 0.00 EP \n+ATOM 1802 HH TYR T 3 31.135 -17.589 4.990 1.00 0.00 H \n+ATOM 1803 LP1A TYR T 3 30.375 -18.130 4.651 1.00 0.00 EP \n+ATOM 1804 LP1B TYR T 3 30.917 -18.291 4.322 1.00 0.00 EP \n+ATOM 1805 LP TYR T 3 29.817 -16.488 2.268 1.00 0.00 EP \n+ATOM 1806 O TYR T 3 27.842 -12.571 2.609 1.00 0.00 O \n+ATOM 1807 DOT1 TYR T 3 27.842 -12.571 2.609 1.00 0.00 EP \n+ATOM 1808 OXT TYR T 3 29.179 -11.848 0.980 1.00 0.00 O \n+ATOM 1809 DOT2 TYR T 3 29.179 -11.848 0.980 1.00 0.00 EP \n+ATOM 1810 LPT1 TYR T 3 27.987 -12.303 2.781 1.00 0.00 EP \n+ATOM 1811 LPT2 TYR T 3 27.608 -12.827 2.658 1.00 0.00 EP \n+ATOM 1812 LPT3 TYR T 3 29.266 -11.612 1.223 1.00 0.00 EP \n+ATOM 1813 LPT4 TYR T 3 29.257 -11.934 0.650 1.00 0.00 EP \n+TER 1814 TYR T 3\n+END\ndiff --git a/wrappers/python/tests/systems/test_charmm_peptide_3.pdb b/wrappers/python/tests/systems/test_charmm_peptide_3.pdb\nnew file mode 100644\nindex 0000000000..83fb12ec83\n--- /dev/null\n+++ b/wrappers/python/tests/systems/test_charmm_peptide_3.pdb\n@@ -0,0 +1,1142 @@\n+REMARK 1 CREATED WITH OPENMM 8.3, 2025-07-01\n+CRYST1 24.000 24.000 24.000 90.00 90.00 90.00 P 1 1 \n+ATOM 1 N GLY A 1 -6.274 -1.954 4.174 1.00 0.00 N \n+ATOM 2 CA GLY A 1 -6.600 -1.462 2.797 1.00 0.00 C \n+ATOM 3 C GLY A 1 -5.465 -1.599 1.823 1.00 0.00 C \n+ATOM 4 O GLY A 1 -4.649 -2.500 1.958 1.00 0.00 O \n+ATOM 5 H GLY A 1 -5.496 -1.418 4.630 1.00 0.00 H \n+ATOM 6 H2 GLY A 1 -5.943 -2.956 4.190 1.00 0.00 H \n+ATOM 7 H3 GLY A 1 -7.112 -1.843 4.800 1.00 0.00 H \n+ATOM 8 HA2 GLY A 1 -7.410 -2.070 2.428 1.00 0.00 H \n+ATOM 9 HA3 GLY A 1 -6.850 -0.414 2.880 1.00 0.00 H \n+ATOM 10 N TYR A 2 -5.371 -0.720 0.809 1.00 0.00 N \n+ATOM 11 CA TYR A 2 -4.230 -0.674 -0.093 1.00 0.00 C \n+ATOM 12 C TYR A 2 -3.463 0.617 0.174 1.00 0.00 C \n+ATOM 13 O TYR A 2 -4.013 1.720 0.097 1.00 0.00 O \n+ATOM 14 CB TYR A 2 -4.675 -0.812 -1.581 1.00 0.00 C \n+ATOM 15 CG TYR A 2 -3.519 -0.744 -2.554 1.00 0.00 C \n+ATOM 16 CD1 TYR A 2 -2.895 -1.910 -3.034 1.00 0.00 C \n+ATOM 17 CD2 TYR A 2 -3.072 0.501 -3.024 1.00 0.00 C \n+ATOM 18 CE1 TYR A 2 -1.832 -1.825 -3.948 1.00 0.00 C \n+ATOM 19 CE2 TYR A 2 -2.004 0.591 -3.923 1.00 0.00 C \n+ATOM 20 CZ TYR A 2 -1.385 -0.573 -4.387 1.00 0.00 C \n+ATOM 21 OH TYR A 2 -0.316 -0.471 -5.298 1.00 0.00 O \n+ATOM 22 H TYR A 2 -6.085 -0.031 0.647 1.00 0.00 H \n+ATOM 23 HA TYR A 2 -3.549 -1.489 0.122 1.00 0.00 H \n+ATOM 24 HB2 TYR A 2 -5.184 -1.790 -1.715 1.00 0.00 H \n+ATOM 25 HB3 TYR A 2 -5.401 -0.010 -1.835 1.00 0.00 H \n+ATOM 26 HD1 TYR A 2 -3.234 -2.877 -2.691 1.00 0.00 H \n+ATOM 27 HD2 TYR A 2 -3.545 1.404 -2.672 1.00 0.00 H \n+ATOM 28 HE1 TYR A 2 -1.347 -2.721 -4.309 1.00 0.00 H \n+ATOM 29 HE2 TYR A 2 -1.671 1.562 -4.257 1.00 0.00 H \n+ATOM 30 HH TYR A 2 -0.007 0.453 -5.271 1.00 0.00 H \n+ATOM 31 N ASP A 3 -2.169 0.498 0.522 1.00 0.00 N \n+ATOM 32 CA ASP A 3 -1.368 1.602 1.002 1.00 0.00 C \n+ATOM 33 C ASP A 3 -0.444 2.119 -0.108 1.00 0.00 C \n+ATOM 34 O ASP A 3 0.309 1.327 -0.683 1.00 0.00 O \n+ATOM 35 CB ASP A 3 -0.589 1.125 2.261 1.00 0.00 C \n+ATOM 36 CG ASP A 3 0.254 2.181 2.948 1.00 0.00 C \n+ATOM 37 OD1 ASP A 3 0.313 3.347 2.481 1.00 0.00 O \n+ATOM 38 OD2 ASP A 3 0.843 1.853 4.007 1.00 0.00 O \n+ATOM 39 H ASP A 3 -1.713 -0.394 0.509 1.00 0.00 H \n+ATOM 40 HA ASP A 3 -2.028 2.392 1.327 1.00 0.00 H \n+ATOM 41 HB2 ASP A 3 -1.326 0.748 3.001 1.00 0.00 H \n+ATOM 42 HB3 ASP A 3 0.077 0.281 1.990 1.00 0.00 H \n+ATOM 43 N PRO A 4 -0.421 3.407 -0.468 1.00 0.00 N \n+ATOM 44 CA PRO A 4 0.523 3.917 -1.451 1.00 0.00 C \n+ATOM 45 C PRO A 4 1.936 4.056 -0.894 1.00 0.00 C \n+ATOM 46 O PRO A 4 2.826 4.393 -1.677 1.00 0.00 O \n+ATOM 47 CB PRO A 4 -0.079 5.283 -1.835 1.00 0.00 C \n+ATOM 48 CG PRO A 4 -0.797 5.747 -0.565 1.00 0.00 C \n+ATOM 49 CD PRO A 4 -1.358 4.438 -0.009 1.00 0.00 C \n+ATOM 50 HA PRO A 4 0.575 3.234 -2.287 1.00 0.00 H \n+ATOM 51 HB2 PRO A 4 0.670 6.015 -2.196 1.00 0.00 H \n+ATOM 52 HB3 PRO A 4 -0.834 5.124 -2.638 1.00 0.00 H \n+ATOM 53 HG2 PRO A 4 -0.057 6.166 0.152 1.00 0.00 H \n+ATOM 54 HG3 PRO A 4 -1.586 6.497 -0.769 1.00 0.00 H \n+ATOM 55 HD2 PRO A 4 -1.420 4.470 1.100 1.00 0.00 H \n+ATOM 56 HD3 PRO A 4 -2.358 4.222 -0.441 1.00 0.00 H \n+ATOM 57 N GLU A 5 2.208 3.789 0.404 1.00 0.00 N \n+ATOM 58 CA GLU A 5 3.575 3.720 0.907 1.00 0.00 C \n+ATOM 59 C GLU A 5 4.167 2.385 0.491 1.00 0.00 C \n+ATOM 60 O GLU A 5 5.100 2.323 -0.311 1.00 0.00 O \n+ATOM 61 CB GLU A 5 3.623 3.859 2.458 1.00 0.00 C \n+ATOM 62 CG GLU A 5 4.941 4.475 3.016 1.00 0.00 C \n+ATOM 63 CD GLU A 5 6.166 3.568 3.104 1.00 0.00 C \n+ATOM 64 OE1 GLU A 5 6.123 2.356 2.791 1.00 0.00 O \n+ATOM 65 OE2 GLU A 5 7.228 4.108 3.518 1.00 0.00 O \n+ATOM 66 H GLU A 5 1.469 3.588 1.066 1.00 0.00 H \n+ATOM 67 HA GLU A 5 4.163 4.506 0.457 1.00 0.00 H \n+ATOM 68 HB2 GLU A 5 2.796 4.558 2.719 1.00 0.00 H \n+ATOM 69 HB3 GLU A 5 3.379 2.916 2.991 1.00 0.00 H \n+ATOM 70 HG2 GLU A 5 5.230 5.358 2.408 1.00 0.00 H \n+ATOM 71 HG3 GLU A 5 4.753 4.809 4.061 1.00 0.00 H \n+ATOM 72 N THR A 6 3.591 1.274 0.992 1.00 0.00 N \n+ATOM 73 CA THR A 6 4.025 -0.081 0.690 1.00 0.00 C \n+ATOM 74 C THR A 6 3.861 -0.453 -0.774 1.00 0.00 C \n+ATOM 75 O THR A 6 4.703 -1.128 -1.367 1.00 0.00 O \n+ATOM 76 CB THR A 6 3.349 -1.151 1.555 1.00 0.00 C \n+ATOM 77 OG1 THR A 6 1.959 -1.285 1.287 1.00 0.00 O \n+ATOM 78 CG2 THR A 6 3.485 -0.794 3.042 1.00 0.00 C \n+ATOM 79 H THR A 6 2.834 1.352 1.638 1.00 0.00 H \n+ATOM 80 HA THR A 6 5.081 -0.120 0.905 1.00 0.00 H \n+ATOM 81 HB THR A 6 3.850 -2.132 1.383 1.00 0.00 H \n+ATOM 82 HG1 THR A 6 1.746 -2.222 1.446 1.00 0.00 H \n+ATOM 83 HG21 THR A 6 4.548 -0.623 3.308 1.00 0.00 H \n+ATOM 84 HG22 THR A 6 3.092 -1.616 3.677 1.00 0.00 H \n+ATOM 85 HG23 THR A 6 2.911 0.125 3.290 1.00 0.00 H \n+ATOM 86 N GLY A 7 2.732 -0.043 -1.394 1.00 0.00 N \n+ATOM 87 CA GLY A 7 2.294 -0.524 -2.698 1.00 0.00 C \n+ATOM 88 C GLY A 7 1.749 -1.925 -2.606 1.00 0.00 C \n+ATOM 89 O GLY A 7 1.874 -2.720 -3.537 1.00 0.00 O \n+ATOM 90 H GLY A 7 2.077 0.525 -0.885 1.00 0.00 H \n+ATOM 91 HA2 GLY A 7 1.485 0.111 -3.025 1.00 0.00 H \n+ATOM 92 HA3 GLY A 7 3.133 -0.535 -3.378 1.00 0.00 H \n+ATOM 93 N THR A 8 1.164 -2.268 -1.443 1.00 0.00 N \n+ATOM 94 CA THR A 8 0.659 -3.596 -1.128 1.00 0.00 C \n+ATOM 95 C THR A 8 -0.714 -3.461 -0.520 1.00 0.00 C \n+ATOM 96 O THR A 8 -1.117 -2.416 -0.012 1.00 0.00 O \n+ATOM 97 CB THR A 8 1.524 -4.433 -0.142 1.00 0.00 C \n+ATOM 98 OG1 THR A 8 1.450 -4.052 1.238 1.00 0.00 O \n+ATOM 99 CG2 THR A 8 2.998 -4.389 -0.556 1.00 0.00 C \n+ATOM 100 H THR A 8 1.101 -1.590 -0.707 1.00 0.00 H \n+ATOM 101 HA THR A 8 0.553 -4.152 -2.049 1.00 0.00 H \n+ATOM 102 HB THR A 8 1.192 -5.496 -0.208 1.00 0.00 H \n+ATOM 103 HG1 THR A 8 0.585 -4.376 1.558 1.00 0.00 H \n+ATOM 104 HG21 THR A 8 3.107 -4.694 -1.616 1.00 0.00 H \n+ATOM 105 HG22 THR A 8 3.601 -5.075 0.075 1.00 0.00 H \n+ATOM 106 HG23 THR A 8 3.411 -3.367 -0.446 1.00 0.00 H \n+ATOM 107 N TRP A 9 -1.462 -4.578 -0.508 1.00 0.00 N \n+ATOM 108 CA TRP A 9 -2.525 -4.792 0.454 1.00 0.00 C \n+ATOM 109 C TRP A 9 -2.001 -4.857 1.883 1.00 0.00 C \n+ATOM 110 O TRP A 9 -0.888 -5.328 2.130 1.00 0.00 O \n+ATOM 111 CB TRP A 9 -3.350 -6.057 0.104 1.00 0.00 C \n+ATOM 112 CG TRP A 9 -4.143 -5.868 -1.151 1.00 0.00 C \n+ATOM 113 CD1 TRP A 9 -3.856 -6.312 -2.418 1.00 0.00 C \n+ATOM 114 CD2 TRP A 9 -5.318 -5.049 -1.263 1.00 0.00 C \n+ATOM 115 NE1 TRP A 9 -4.778 -5.798 -3.300 1.00 0.00 N \n+ATOM 116 CE2 TRP A 9 -5.671 -5.021 -2.629 1.00 0.00 C \n+ATOM 117 CE3 TRP A 9 -6.093 -4.351 -0.338 1.00 0.00 C \n+ATOM 118 CZ2 TRP A 9 -6.740 -4.269 -3.089 1.00 0.00 C \n+ATOM 119 CZ3 TRP A 9 -7.168 -3.590 -0.803 1.00 0.00 C \n+ATOM 120 CH2 TRP A 9 -7.476 -3.534 -2.159 1.00 0.00 C \n+ATOM 121 H TRP A 9 -1.187 -5.386 -1.019 1.00 0.00 H \n+ATOM 122 HA TRP A 9 -3.179 -3.929 0.412 1.00 0.00 H \n+ATOM 123 HB2 TRP A 9 -2.666 -6.925 -0.011 1.00 0.00 H \n+ATOM 124 HB3 TRP A 9 -4.055 -6.294 0.927 1.00 0.00 H \n+ATOM 125 HD1 TRP A 9 -3.027 -6.967 -2.668 1.00 0.00 H \n+ATOM 126 HE1 TRP A 9 -4.916 -6.066 -4.233 1.00 0.00 H \n+ATOM 127 HE3 TRP A 9 -5.853 -4.369 0.717 1.00 0.00 H \n+ATOM 128 HZ2 TRP A 9 -6.984 -4.220 -4.136 1.00 0.00 H \n+ATOM 129 HZ3 TRP A 9 -7.753 -3.012 -0.097 1.00 0.00 H \n+ATOM 130 HH2 TRP A 9 -8.282 -2.899 -2.504 1.00 0.00 H \n+ATOM 131 N GLY A 10 -2.783 -4.355 2.843 1.00 0.00 N \n+ATOM 132 CA GLY A 10 -2.436 -4.301 4.245 1.00 0.00 C \n+ATOM 133 C GLY A 10 -3.699 -4.095 5.082 1.00 0.00 C \n+ATOM 134 O GLY A 10 -3.551 -3.810 6.300 1.00 0.00 O \n+ATOM 135 OXT GLY A 10 -4.845 -4.199 4.566 1.00 0.00 O \n+ATOM 136 H GLY A 10 -3.656 -3.912 2.620 1.00 0.00 H \n+ATOM 137 HA2 GLY A 10 -1.986 -5.233 4.552 1.00 0.00 H \n+ATOM 138 HA3 GLY A 10 -1.800 -3.438 4.395 1.00 0.00 H \n+TER 139 GLY A 10\n+HETATM 140 O HOH B 1 5.537 2.848 -8.373 1.00 0.00 O \n+HETATM 141 H1 HOH B 1 5.578 2.076 -8.939 1.00 0.00 H \n+HETATM 142 H2 HOH B 1 4.698 3.257 -8.585 1.00 0.00 H \n+HETATM 143 O HOH B 2 5.119 -9.650 9.219 1.00 0.00 O \n+HETATM 144 H1 HOH B 2 5.020 -10.379 8.606 1.00 0.00 H \n+HETATM 145 H2 HOH B 2 4.405 -9.052 8.998 1.00 0.00 H \n+HETATM 146 O HOH B 3 -6.058 6.083 10.429 1.00 0.00 O \n+HETATM 147 H1 HOH B 3 -6.940 5.720 10.349 1.00 0.00 H \n+HETATM 148 H2 HOH B 3 -5.477 5.338 10.276 1.00 0.00 H \n+HETATM 149 O HOH B 4 -10.533 -0.449 -2.899 1.00 0.00 O \n+HETATM 150 H1 HOH B 4 -10.613 0.471 -3.149 1.00 0.00 H \n+HETATM 151 H2 HOH B 4 -10.545 -0.925 -3.730 1.00 0.00 H \n+HETATM 152 O HOH B 5 4.857 6.167 -1.839 1.00 0.00 O \n+HETATM 153 H1 HOH B 5 4.230 5.458 -1.698 1.00 0.00 H \n+HETATM 154 H2 HOH B 5 4.893 6.269 -2.790 1.00 0.00 H \n+HETATM 155 O HOH B 6 7.885 -1.776 -4.397 1.00 0.00 O \n+HETATM 156 H1 HOH B 6 7.796 -1.088 -5.056 1.00 0.00 H \n+HETATM 157 H2 HOH B 6 7.975 -1.306 -3.569 1.00 0.00 H \n+HETATM 158 O HOH B 7 5.952 8.895 -8.581 1.00 0.00 O \n+HETATM 159 H1 HOH B 7 5.794 9.752 -8.183 1.00 0.00 H \n+HETATM 160 H2 HOH B 7 6.902 8.850 -8.684 1.00 0.00 H \n+HETATM 161 O HOH B 8 -8.922 8.767 -7.817 1.00 0.00 O \n+HETATM 162 H1 HOH B 8 -7.991 8.991 -7.809 1.00 0.00 H \n+HETATM 163 H2 HOH B 8 -8.974 7.941 -7.337 1.00 0.00 H \n+HETATM 164 O HOH B 9 -0.118 2.251 -10.674 1.00 0.00 O \n+HETATM 165 H1 HOH B 9 -0.009 2.429 -11.608 1.00 0.00 H \n+HETATM 166 H2 HOH B 9 0.669 2.612 -10.267 1.00 0.00 H \n+HETATM 167 O HOH B 10 4.631 8.796 1.859 1.00 0.00 O \n+HETATM 168 H1 HOH B 10 5.343 9.077 2.433 1.00 0.00 H \n+HETATM 169 H2 HOH B 10 5.042 8.686 1.002 1.00 0.00 H \n+HETATM 170 O HOH B 11 0.775 10.971 -2.895 1.00 0.00 O \n+HETATM 171 H1 HOH B 11 0.907 11.806 -3.344 1.00 0.00 H \n+HETATM 172 H2 HOH B 11 0.524 10.362 -3.590 1.00 0.00 H \n+HETATM 173 O HOH B 12 -9.453 -5.591 -5.442 1.00 0.00 O \n+HETATM 174 H1 HOH B 12 -9.991 -5.766 -6.214 1.00 0.00 H \n+HETATM 175 H2 HOH B 12 -8.674 -5.154 -5.786 1.00 0.00 H \n+HETATM 176 O HOH B 13 -7.625 -11.557 4.412 1.00 0.00 O \n+HETATM 177 H1 HOH B 13 -7.176 -11.719 5.241 1.00 0.00 H \n+HETATM 178 H2 HOH B 13 -7.877 -12.427 4.102 1.00 0.00 H \n+HETATM 179 O HOH B 14 -0.215 -8.012 4.986 1.00 0.00 O \n+HETATM 180 H1 HOH B 14 0.375 -7.301 5.236 1.00 0.00 H \n+HETATM 181 H2 HOH B 14 0.056 -8.751 5.532 1.00 0.00 H \n+HETATM 182 O HOH B 15 1.536 -10.442 -3.799 1.00 0.00 O \n+HETATM 183 H1 HOH B 15 2.447 -10.338 -3.526 1.00 0.00 H \n+HETATM 184 H2 HOH B 15 1.493 -10.020 -4.657 1.00 0.00 H \n+HETATM 185 O HOH B 16 -3.760 -5.920 -8.515 1.00 0.00 O \n+HETATM 186 H1 HOH B 16 -3.398 -5.033 -8.517 1.00 0.00 H \n+HETATM 187 H2 HOH B 16 -3.358 -6.342 -7.756 1.00 0.00 H \n+HETATM 188 O HOH B 17 -2.693 -9.855 1.082 1.00 0.00 O \n+HETATM 189 H1 HOH B 17 -2.488 -9.862 0.147 1.00 0.00 H \n+HETATM 190 H2 HOH B 17 -2.003 -9.320 1.475 1.00 0.00 H \n+HETATM 191 O HOH B 18 6.678 -8.152 -7.878 1.00 0.00 O \n+HETATM 192 H1 HOH B 18 6.086 -8.263 -8.622 1.00 0.00 H \n+HETATM 193 H2 HOH B 18 6.982 -7.247 -7.947 1.00 0.00 H \n+HETATM 194 O HOH B 19 6.849 9.206 3.500 1.00 0.00 O \n+HETATM 195 H1 HOH B 19 7.332 9.528 4.261 1.00 0.00 H \n+HETATM 196 H2 HOH B 19 7.527 8.964 2.870 1.00 0.00 H \n+HETATM 197 O HOH B 20 -6.563 -7.490 0.689 1.00 0.00 O \n+HETATM 198 H1 HOH B 20 -6.786 -6.686 0.219 1.00 0.00 H \n+HETATM 199 H2 HOH B 20 -5.944 -7.941 0.115 1.00 0.00 H \n+HETATM 200 O HOH B 21 0.862 -6.872 10.573 1.00 0.00 O \n+HETATM 201 H1 HOH B 21 1.480 -7.063 11.279 1.00 0.00 H \n+HETATM 202 H2 HOH B 21 1.342 -7.082 9.772 1.00 0.00 H \n+HETATM 203 O HOH B 22 2.392 6.752 -4.198 1.00 0.00 O \n+HETATM 204 H1 HOH B 22 2.263 5.812 -4.323 1.00 0.00 H \n+HETATM 205 H2 HOH B 22 2.032 7.151 -4.990 1.00 0.00 H \n+HETATM 206 O HOH B 23 -6.306 1.397 -4.615 1.00 0.00 O \n+HETATM 207 H1 HOH B 23 -6.233 0.447 -4.519 1.00 0.00 H \n+HETATM 208 H2 HOH B 23 -6.945 1.656 -3.951 1.00 0.00 H \n+HETATM 209 O HOH B 24 -6.524 6.577 1.057 1.00 0.00 O \n+HETATM 210 H1 HOH B 24 -7.057 5.994 1.598 1.00 0.00 H \n+HETATM 211 H2 HOH B 24 -5.838 6.892 1.647 1.00 0.00 H \n+HETATM 212 O HOH B 25 2.146 5.045 -6.932 1.00 0.00 O \n+HETATM 213 H1 HOH B 25 2.321 4.580 -7.750 1.00 0.00 H \n+HETATM 214 H2 HOH B 25 2.584 4.523 -6.260 1.00 0.00 H \n+HETATM 215 O HOH B 26 -6.602 -11.097 -6.482 1.00 0.00 O \n+HETATM 216 H1 HOH B 26 -6.426 -12.011 -6.257 1.00 0.00 H \n+HETATM 217 H2 HOH B 26 -6.436 -10.614 -5.672 1.00 0.00 H \n+HETATM 218 O HOH B 27 -2.022 10.663 -5.937 1.00 0.00 O \n+HETATM 219 H1 HOH B 27 -1.845 10.139 -5.156 1.00 0.00 H \n+HETATM 220 H2 HOH B 27 -1.221 10.597 -6.457 1.00 0.00 H \n+HETATM 221 O HOH B 28 -0.632 -7.785 -5.019 1.00 0.00 O \n+HETATM 222 H1 HOH B 28 -0.605 -8.054 -4.101 1.00 0.00 H \n+HETATM 223 H2 HOH B 28 0.157 -8.165 -5.404 1.00 0.00 H \n+HETATM 224 O HOH B 29 -8.405 -7.943 -1.758 1.00 0.00 O \n+HETATM 225 H1 HOH B 29 -7.812 -8.223 -2.456 1.00 0.00 H \n+HETATM 226 H2 HOH B 29 -9.141 -7.537 -2.217 1.00 0.00 H \n+HETATM 227 O HOH B 30 -1.445 -8.169 -10.454 1.00 0.00 O \n+HETATM 228 H1 HOH B 30 -1.200 -7.249 -10.552 1.00 0.00 H \n+HETATM 229 H2 HOH B 30 -0.618 -8.646 -10.517 1.00 0.00 H \n+HETATM 230 O HOH B 31 -8.227 -0.672 5.665 1.00 0.00 O \n+HETATM 231 H1 HOH B 31 -8.691 -1.152 6.352 1.00 0.00 H \n+HETATM 232 H2 HOH B 31 -8.225 0.236 5.967 1.00 0.00 H \n+HETATM 233 O HOH B 32 0.662 -1.876 -9.602 1.00 0.00 O \n+HETATM 234 H1 HOH B 32 0.736 -2.785 -9.312 1.00 0.00 H \n+HETATM 235 H2 HOH B 32 1.546 -1.521 -9.510 1.00 0.00 H \n+HETATM 236 O HOH B 33 -2.358 0.465 -10.111 1.00 0.00 O \n+HETATM 237 H1 HOH B 33 -1.604 0.991 -10.379 1.00 0.00 H \n+HETATM 238 H2 HOH B 33 -2.040 -0.051 -9.371 1.00 0.00 H \n+HETATM 239 O HOH B 34 2.781 8.262 -1.923 1.00 0.00 O \n+HETATM 240 H1 HOH B 34 2.507 7.875 -2.754 1.00 0.00 H \n+HETATM 241 H2 HOH B 34 3.318 7.586 -1.509 1.00 0.00 H \n+HETATM 242 O HOH B 35 8.445 -0.056 -2.328 1.00 0.00 O \n+HETATM 243 H1 HOH B 35 8.027 0.798 -2.220 1.00 0.00 H \n+HETATM 244 H2 HOH B 35 9.383 0.131 -2.305 1.00 0.00 H \n+HETATM 245 O HOH B 36 -2.142 0.300 6.816 1.00 0.00 O \n+HETATM 246 H1 HOH B 36 -1.485 0.157 6.135 1.00 0.00 H \n+HETATM 247 H2 HOH B 36 -1.696 0.072 7.632 1.00 0.00 H \n+HETATM 248 O HOH B 37 -2.880 -3.270 -8.784 1.00 0.00 O \n+HETATM 249 H1 HOH B 37 -2.495 -3.274 -9.660 1.00 0.00 H \n+HETATM 250 H2 HOH B 37 -2.475 -2.521 -8.347 1.00 0.00 H \n+HETATM 251 O HOH B 38 -7.329 2.233 11.246 1.00 0.00 O \n+HETATM 252 H1 HOH B 38 -7.637 2.883 11.879 1.00 0.00 H \n+HETATM 253 H2 HOH B 38 -6.433 2.037 11.520 1.00 0.00 H \n+HETATM 254 O HOH B 39 -9.130 2.689 1.982 1.00 0.00 O \n+HETATM 255 H1 HOH B 39 -8.591 3.407 2.314 1.00 0.00 H \n+HETATM 256 H2 HOH B 39 -9.952 2.762 2.467 1.00 0.00 H \n+HETATM 257 O HOH B 40 -2.662 -9.832 -1.733 1.00 0.00 O \n+HETATM 258 H1 HOH B 40 -1.833 -9.442 -2.009 1.00 0.00 H \n+HETATM 259 H2 HOH B 40 -2.883 -10.446 -2.433 1.00 0.00 H \n+HETATM 260 O HOH B 41 -6.472 -6.184 8.321 1.00 0.00 O \n+HETATM 261 H1 HOH B 41 -6.069 -6.263 9.186 1.00 0.00 H \n+HETATM 262 H2 HOH B 41 -6.160 -5.342 7.988 1.00 0.00 H \n+HETATM 263 O HOH B 42 3.401 -3.002 9.083 1.00 0.00 O \n+HETATM 264 H1 HOH B 42 2.475 -3.062 8.849 1.00 0.00 H \n+HETATM 265 H2 HOH B 42 3.653 -3.900 9.296 1.00 0.00 H \n+HETATM 266 O HOH B 43 4.809 -8.333 6.013 1.00 0.00 O \n+HETATM 267 H1 HOH B 43 5.448 -7.722 6.380 1.00 0.00 H \n+HETATM 268 H2 HOH B 43 4.089 -8.335 6.643 1.00 0.00 H \n+HETATM 269 O HOH B 44 8.437 -3.519 6.096 1.00 0.00 O \n+HETATM 270 H1 HOH B 44 7.504 -3.682 6.230 1.00 0.00 H \n+HETATM 271 H2 HOH B 44 8.742 -3.168 6.933 1.00 0.00 H \n+HETATM 272 O HOH B 45 -5.105 3.529 -9.986 1.00 0.00 O \n+HETATM 273 H1 HOH B 45 -5.150 2.580 -9.878 1.00 0.00 H \n+HETATM 274 H2 HOH B 45 -4.256 3.683 -10.402 1.00 0.00 H \n+HETATM 275 O HOH B 46 -2.952 -7.663 -6.468 1.00 0.00 O \n+HETATM 276 H1 HOH B 46 -2.155 -7.714 -5.941 1.00 0.00 H \n+HETATM 277 H2 HOH B 46 -2.879 -8.392 -7.085 1.00 0.00 H \n+HETATM 278 O HOH B 47 -0.777 -5.026 9.216 1.00 0.00 O \n+HETATM 279 H1 HOH B 47 -0.149 -4.655 8.598 1.00 0.00 H \n+HETATM 280 H2 HOH B 47 -0.272 -5.669 9.714 1.00 0.00 H \n+HETATM 281 O HOH B 48 7.919 5.148 -4.905 1.00 0.00 O \n+HETATM 282 H1 HOH B 48 8.686 5.121 -5.478 1.00 0.00 H \n+HETATM 283 H2 HOH B 48 7.174 5.200 -5.504 1.00 0.00 H \n+HETATM 284 O HOH B 49 -7.810 0.856 0.369 1.00 0.00 O \n+HETATM 285 H1 HOH B 49 -8.253 1.392 1.028 1.00 0.00 H \n+HETATM 286 H2 HOH B 49 -7.675 1.448 -0.370 1.00 0.00 H \n+HETATM 287 O HOH B 50 -7.736 -10.987 -1.071 1.00 0.00 O \n+HETATM 288 H1 HOH B 50 -7.417 -10.648 -1.908 1.00 0.00 H \n+HETATM 289 H2 HOH B 50 -7.821 -11.930 -1.210 1.00 0.00 H \n+HETATM 290 O HOH B 51 -9.496 3.246 -0.710 1.00 0.00 O \n+HETATM 291 H1 HOH B 51 -9.511 3.071 0.231 1.00 0.00 H \n+HETATM 292 H2 HOH B 51 -9.773 4.158 -0.789 1.00 0.00 H \n+HETATM 293 O HOH B 52 -3.852 2.604 -7.264 1.00 0.00 O \n+HETATM 294 H1 HOH B 52 -3.752 2.717 -6.318 1.00 0.00 H \n+HETATM 295 H2 HOH B 52 -3.242 3.235 -7.646 1.00 0.00 H \n+HETATM 296 O HOH B 53 -3.530 4.597 5.301 1.00 0.00 O \n+HETATM 297 H1 HOH B 53 -3.742 3.734 5.656 1.00 0.00 H \n+HETATM 298 H2 HOH B 53 -2.634 4.509 4.976 1.00 0.00 H \n+HETATM 299 O HOH B 54 -4.326 -8.608 2.985 1.00 0.00 O \n+HETATM 300 H1 HOH B 54 -3.749 -9.019 2.341 1.00 0.00 H \n+HETATM 301 H2 HOH B 54 -3.743 -8.349 3.699 1.00 0.00 H \n+HETATM 302 O HOH B 55 -0.068 10.265 -7.904 1.00 0.00 O \n+HETATM 303 H1 HOH B 55 -0.236 9.647 -8.617 1.00 0.00 H \n+HETATM 304 H2 HOH B 55 0.836 10.547 -8.039 1.00 0.00 H \n+HETATM 305 O HOH B 56 -8.063 9.449 7.308 1.00 0.00 O \n+HETATM 306 H1 HOH B 56 -7.491 9.331 6.550 1.00 0.00 H \n+HETATM 307 H2 HOH B 56 -8.755 8.799 7.190 1.00 0.00 H \n+HETATM 308 O HOH B 57 5.676 -3.028 -5.767 1.00 0.00 O \n+HETATM 309 H1 HOH B 57 6.106 -2.639 -5.005 1.00 0.00 H \n+HETATM 310 H2 HOH B 57 6.110 -3.874 -5.882 1.00 0.00 H \n+HETATM 311 O HOH B 58 -6.607 2.906 -6.919 1.00 0.00 O \n+HETATM 312 H1 HOH B 58 -5.717 2.843 -7.266 1.00 0.00 H \n+HETATM 313 H2 HOH B 58 -6.615 2.309 -6.170 1.00 0.00 H \n+HETATM 314 O HOH B 59 3.070 -0.637 -8.770 1.00 0.00 O \n+HETATM 315 H1 HOH B 59 3.790 -0.575 -8.141 1.00 0.00 H \n+HETATM 316 H2 HOH B 59 2.399 -0.048 -8.425 1.00 0.00 H \n+HETATM 317 O HOH B 60 -2.867 6.758 10.544 1.00 0.00 O \n+HETATM 318 H1 HOH B 60 -3.063 5.822 10.498 1.00 0.00 H \n+HETATM 319 H2 HOH B 60 -1.948 6.823 10.283 1.00 0.00 H \n+HETATM 320 O HOH B 61 -3.050 7.296 -8.490 1.00 0.00 O \n+HETATM 321 H1 HOH B 61 -3.894 6.845 -8.519 1.00 0.00 H \n+HETATM 322 H2 HOH B 61 -3.265 8.189 -8.218 1.00 0.00 H \n+HETATM 323 O HOH B 62 1.716 -8.908 -6.133 1.00 0.00 O \n+HETATM 324 H1 HOH B 62 2.252 -8.328 -6.674 1.00 0.00 H \n+HETATM 325 H2 HOH B 62 1.078 -9.282 -6.741 1.00 0.00 H \n+HETATM 326 O HOH B 63 -4.472 3.706 -1.928 1.00 0.00 O \n+HETATM 327 H1 HOH B 63 -4.698 4.577 -1.602 1.00 0.00 H \n+HETATM 328 H2 HOH B 63 -4.374 3.172 -1.139 1.00 0.00 H \n+HETATM 329 O HOH B 64 -1.462 -3.097 -11.162 1.00 0.00 O \n+HETATM 330 H1 HOH B 64 -1.783 -2.862 -12.032 1.00 0.00 H \n+HETATM 331 H2 HOH B 64 -0.831 -2.410 -10.945 1.00 0.00 H \n+HETATM 332 O HOH B 65 1.441 7.910 7.320 1.00 0.00 O \n+HETATM 333 H1 HOH B 65 0.772 7.603 7.931 1.00 0.00 H \n+HETATM 334 H2 HOH B 65 1.132 7.624 6.461 1.00 0.00 H \n+HETATM 335 O HOH B 66 2.354 -5.799 -4.170 1.00 0.00 O \n+HETATM 336 H1 HOH B 66 2.932 -6.096 -4.873 1.00 0.00 H \n+HETATM 337 H2 HOH B 66 2.666 -6.261 -3.392 1.00 0.00 H \n+HETATM 338 O HOH B 67 -8.482 -11.757 -4.033 1.00 0.00 O \n+HETATM 339 H1 HOH B 67 -7.908 -12.519 -3.950 1.00 0.00 H \n+HETATM 340 H2 HOH B 67 -7.893 -11.005 -3.975 1.00 0.00 H \n+HETATM 341 O HOH B 68 -8.287 2.260 -2.914 1.00 0.00 O \n+HETATM 342 H1 HOH B 68 -8.963 2.088 -3.570 1.00 0.00 H \n+HETATM 343 H2 HOH B 68 -8.774 2.515 -2.130 1.00 0.00 H \n+HETATM 344 O HOH B 69 -5.824 0.251 7.810 1.00 0.00 O \n+HETATM 345 H1 HOH B 69 -5.481 1.070 7.450 1.00 0.00 H \n+HETATM 346 H2 HOH B 69 -5.416 -0.433 7.279 1.00 0.00 H \n+HETATM 347 O HOH B 70 -7.198 -10.088 2.083 1.00 0.00 O \n+HETATM 348 H1 HOH B 70 -7.446 -10.602 2.851 1.00 0.00 H \n+HETATM 349 H2 HOH B 70 -6.442 -10.549 1.718 1.00 0.00 H \n+HETATM 350 O HOH B 71 7.949 -10.460 2.716 1.00 0.00 O \n+HETATM 351 H1 HOH B 71 8.212 -11.011 3.454 1.00 0.00 H \n+HETATM 352 H2 HOH B 71 7.898 -9.577 3.082 1.00 0.00 H \n+HETATM 353 O HOH B 72 -0.405 4.742 -5.899 1.00 0.00 O \n+HETATM 354 H1 HOH B 72 -0.754 5.514 -5.454 1.00 0.00 H \n+HETATM 355 H2 HOH B 72 0.441 5.026 -6.245 1.00 0.00 H \n+HETATM 356 O HOH B 73 -7.610 4.233 -10.748 1.00 0.00 O \n+HETATM 357 H1 HOH B 73 -6.716 3.941 -10.566 1.00 0.00 H \n+HETATM 358 H2 HOH B 73 -7.585 5.180 -10.610 1.00 0.00 H \n+HETATM 359 O HOH B 74 -5.210 -9.114 -1.016 1.00 0.00 O \n+HETATM 360 H1 HOH B 74 -4.273 -9.231 -1.173 1.00 0.00 H \n+HETATM 361 H2 HOH B 74 -5.603 -9.123 -1.889 1.00 0.00 H \n+HETATM 362 O HOH B 75 0.275 3.001 6.307 1.00 0.00 O \n+HETATM 363 H1 HOH B 75 0.801 2.554 6.971 1.00 0.00 H \n+HETATM 364 H2 HOH B 75 0.521 2.580 5.484 1.00 0.00 H \n+HETATM 365 O HOH B 76 2.709 -7.439 -11.450 1.00 0.00 O \n+HETATM 366 H1 HOH B 76 2.792 -6.673 -10.882 1.00 0.00 H \n+HETATM 367 H2 HOH B 76 3.595 -7.797 -11.501 1.00 0.00 H \n+HETATM 368 O HOH B 77 -6.967 -0.995 -8.864 1.00 0.00 O \n+HETATM 369 H1 HOH B 77 -7.791 -0.537 -9.030 1.00 0.00 H \n+HETATM 370 H2 HOH B 77 -6.291 -0.331 -8.999 1.00 0.00 H \n+HETATM 371 O HOH B 78 6.990 0.128 3.839 1.00 0.00 O \n+HETATM 372 H1 HOH B 78 6.652 0.895 3.377 1.00 0.00 H \n+HETATM 373 H2 HOH B 78 6.800 0.300 4.761 1.00 0.00 H \n+HETATM 374 O HOH B 79 -1.376 -1.052 -7.961 1.00 0.00 O \n+HETATM 375 H1 HOH B 79 -1.095 -0.916 -7.056 1.00 0.00 H \n+HETATM 376 H2 HOH B 79 -0.577 -1.307 -8.424 1.00 0.00 H \n+HETATM 377 O HOH B 80 3.322 7.069 3.555 1.00 0.00 O \n+HETATM 378 H1 HOH B 80 3.676 6.213 3.314 1.00 0.00 H \n+HETATM 379 H2 HOH B 80 3.671 7.668 2.895 1.00 0.00 H \n+HETATM 380 O HOH B 81 -5.542 -7.204 -5.808 1.00 0.00 O \n+HETATM 381 H1 HOH B 81 -5.760 -7.850 -5.135 1.00 0.00 H \n+HETATM 382 H2 HOH B 81 -4.620 -7.367 -6.007 1.00 0.00 H \n+HETATM 383 O HOH B 82 8.261 3.477 -8.370 1.00 0.00 O \n+HETATM 384 H1 HOH B 82 8.216 4.277 -8.894 1.00 0.00 H \n+HETATM 385 H2 HOH B 82 7.351 3.192 -8.289 1.00 0.00 H \n+HETATM 386 O HOH B 83 5.378 -0.734 -7.265 1.00 0.00 O \n+HETATM 387 H1 HOH B 83 6.021 -0.222 -6.775 1.00 0.00 H \n+HETATM 388 H2 HOH B 83 5.367 -1.586 -6.829 1.00 0.00 H \n+HETATM 389 O HOH B 84 -5.663 6.335 -1.532 1.00 0.00 O \n+HETATM 390 H1 HOH B 84 -5.949 6.398 -0.620 1.00 0.00 H \n+HETATM 391 H2 HOH B 84 -6.375 5.874 -1.975 1.00 0.00 H \n+HETATM 392 O HOH B 85 -5.244 10.344 2.234 1.00 0.00 O \n+HETATM 393 H1 HOH B 85 -4.790 10.666 3.013 1.00 0.00 H \n+HETATM 394 H2 HOH B 85 -5.196 11.070 1.612 1.00 0.00 H \n+HETATM 395 O HOH B 86 -4.902 0.840 -9.110 1.00 0.00 O \n+HETATM 396 H1 HOH B 86 -4.523 1.314 -8.370 1.00 0.00 H \n+HETATM 397 H2 HOH B 86 -4.150 0.601 -9.652 1.00 0.00 H \n+HETATM 398 O HOH B 87 4.391 -5.827 -5.912 1.00 0.00 O \n+HETATM 399 H1 HOH B 87 5.332 -5.902 -5.753 1.00 0.00 H \n+HETATM 400 H2 HOH B 87 4.219 -6.439 -6.629 1.00 0.00 H \n+HETATM 401 O HOH B 88 4.693 -1.203 7.408 1.00 0.00 O \n+HETATM 402 H1 HOH B 88 4.102 -1.730 7.945 1.00 0.00 H \n+HETATM 403 H2 HOH B 88 4.675 -0.336 7.811 1.00 0.00 H \n+HETATM 404 O HOH B 89 3.062 -5.419 6.201 1.00 0.00 O \n+HETATM 405 H1 HOH B 89 3.885 -5.036 6.505 1.00 0.00 H \n+HETATM 406 H2 HOH B 89 2.921 -6.171 6.777 1.00 0.00 H \n+HETATM 407 O HOH B 90 -5.577 -3.265 -8.137 1.00 0.00 O \n+HETATM 408 H1 HOH B 90 -4.652 -3.244 -8.385 1.00 0.00 H \n+HETATM 409 H2 HOH B 90 -5.935 -2.444 -8.473 1.00 0.00 H \n+HETATM 410 O HOH B 91 -5.824 -3.660 7.544 1.00 0.00 O \n+HETATM 411 H1 HOH B 91 -5.505 -3.369 8.398 1.00 0.00 H \n+HETATM 412 H2 HOH B 91 -5.040 -3.704 6.997 1.00 0.00 H \n+HETATM 413 O HOH B 92 -6.975 -4.962 -6.611 1.00 0.00 O \n+HETATM 414 H1 HOH B 92 -6.357 -4.412 -7.092 1.00 0.00 H \n+HETATM 415 H2 HOH B 92 -6.445 -5.687 -6.281 1.00 0.00 H \n+HETATM 416 O HOH B 93 7.139 7.204 10.468 1.00 0.00 O \n+HETATM 417 H1 HOH B 93 6.533 7.942 10.403 1.00 0.00 H \n+HETATM 418 H2 HOH B 93 7.068 6.759 9.623 1.00 0.00 H \n+HETATM 419 O HOH B 94 6.624 0.600 6.498 1.00 0.00 O \n+HETATM 420 H1 HOH B 94 6.152 -0.227 6.594 1.00 0.00 H \n+HETATM 421 H2 HOH B 94 6.223 1.181 7.145 1.00 0.00 H \n+HETATM 422 O HOH B 95 4.904 1.364 8.545 1.00 0.00 O \n+HETATM 423 H1 HOH B 95 5.244 2.081 9.080 1.00 0.00 H \n+HETATM 424 H2 HOH B 95 3.953 1.432 8.629 1.00 0.00 H \n+HETATM 425 O HOH B 96 3.420 -7.526 -7.910 1.00 0.00 O \n+HETATM 426 H1 HOH B 96 3.917 -8.105 -8.488 1.00 0.00 H \n+HETATM 427 H2 HOH B 96 3.178 -6.784 -8.464 1.00 0.00 H \n+HETATM 428 O HOH B 97 -0.708 -0.378 9.161 1.00 0.00 O \n+HETATM 429 H1 HOH B 97 0.096 0.140 9.139 1.00 0.00 H \n+HETATM 430 H2 HOH B 97 -1.326 0.158 9.660 1.00 0.00 H \n+HETATM 431 O HOH B 98 6.489 -6.451 7.120 1.00 0.00 O \n+HETATM 432 H1 HOH B 98 6.639 -6.393 8.064 1.00 0.00 H \n+HETATM 433 H2 HOH B 98 6.275 -5.557 6.856 1.00 0.00 H \n+HETATM 434 O HOH B 99 -0.740 4.764 4.409 1.00 0.00 O \n+HETATM 435 H1 HOH B 99 -0.392 4.297 3.650 1.00 0.00 H \n+HETATM 436 H2 HOH B 99 -0.453 4.247 5.162 1.00 0.00 H \n+HETATM 437 O HOH B 100 7.196 -2.470 2.989 1.00 0.00 O \n+HETATM 438 H1 HOH B 100 7.019 -1.555 3.207 1.00 0.00 H \n+HETATM 439 H2 HOH B 100 6.804 -2.590 2.124 1.00 0.00 H \n+HETATM 440 O HOH B 101 -6.665 9.518 -10.509 1.00 0.00 O \n+HETATM 441 H1 HOH B 101 -6.402 9.647 -9.597 1.00 0.00 H \n+HETATM 442 H2 HOH B 101 -7.504 9.974 -10.583 1.00 0.00 H \n+HETATM 443 O HOH B 102 -10.343 5.429 -10.217 1.00 0.00 O \n+HETATM 444 H1 HOH B 102 -10.271 6.293 -10.623 1.00 0.00 H \n+HETATM 445 H2 HOH B 102 -9.752 4.874 -10.727 1.00 0.00 H \n+HETATM 446 O HOH B 103 -5.546 -6.196 11.064 1.00 0.00 O \n+HETATM 447 H1 HOH B 103 -5.414 -7.118 10.840 1.00 0.00 H \n+HETATM 448 H2 HOH B 103 -5.713 -6.200 12.007 1.00 0.00 H \n+HETATM 449 O HOH B 104 -9.558 0.010 -9.123 1.00 0.00 O \n+HETATM 450 H1 HOH B 104 -10.434 0.000 -8.736 1.00 0.00 H \n+HETATM 451 H2 HOH B 104 -9.298 0.931 -9.105 1.00 0.00 H \n+HETATM 452 O HOH B 105 7.461 -7.964 3.774 1.00 0.00 O \n+HETATM 453 H1 HOH B 105 7.879 -7.120 3.600 1.00 0.00 H \n+HETATM 454 H2 HOH B 105 6.545 -7.832 3.530 1.00 0.00 H \n+HETATM 455 O HOH B 106 -2.171 -2.792 10.167 1.00 0.00 O \n+HETATM 456 H1 HOH B 106 -1.742 -3.556 9.782 1.00 0.00 H \n+HETATM 457 H2 HOH B 106 -1.757 -2.043 9.739 1.00 0.00 H \n+HETATM 458 O HOH B 107 -9.865 -4.849 1.616 1.00 0.00 O \n+HETATM 459 H1 HOH B 107 -9.935 -3.972 1.992 1.00 0.00 H \n+HETATM 460 H2 HOH B 107 -10.170 -4.748 0.714 1.00 0.00 H \n+HETATM 461 O HOH B 108 -2.856 -9.508 -8.520 1.00 0.00 O \n+HETATM 462 H1 HOH B 108 -3.555 -9.959 -8.994 1.00 0.00 H \n+HETATM 463 H2 HOH B 108 -2.414 -8.983 -9.187 1.00 0.00 H \n+HETATM 464 O HOH B 109 -0.928 -8.979 9.784 1.00 0.00 O \n+HETATM 465 H1 HOH B 109 -0.443 -8.235 10.143 1.00 0.00 H \n+HETATM 466 H2 HOH B 109 -0.272 -9.670 9.691 1.00 0.00 H \n+HETATM 467 O HOH B 110 -7.999 -9.346 10.292 1.00 0.00 O \n+HETATM 468 H1 HOH B 110 -7.058 -9.181 10.357 1.00 0.00 H \n+HETATM 469 H2 HOH B 110 -8.403 -8.628 10.780 1.00 0.00 H \n+HETATM 470 O HOH B 111 -4.291 3.287 -4.626 1.00 0.00 O \n+HETATM 471 H1 HOH B 111 -4.948 2.592 -4.626 1.00 0.00 H \n+HETATM 472 H2 HOH B 111 -4.186 3.519 -3.703 1.00 0.00 H \n+HETATM 473 O HOH B 112 -0.095 -0.330 5.159 1.00 0.00 O \n+HETATM 474 H1 HOH B 112 0.624 -0.684 5.683 1.00 0.00 H \n+HETATM 475 H2 HOH B 112 0.297 0.396 4.673 1.00 0.00 H \n+HETATM 476 O HOH B 113 -4.986 -3.533 10.177 1.00 0.00 O \n+HETATM 477 H1 HOH B 113 -4.989 -4.403 10.576 1.00 0.00 H \n+HETATM 478 H2 HOH B 113 -4.086 -3.224 10.282 1.00 0.00 H \n+HETATM 479 O HOH B 114 1.025 1.147 -8.056 1.00 0.00 O \n+HETATM 480 H1 HOH B 114 1.583 1.835 -8.419 1.00 0.00 H \n+HETATM 481 H2 HOH B 114 0.305 1.068 -8.681 1.00 0.00 H \n+HETATM 482 O HOH B 115 -4.268 -1.205 5.953 1.00 0.00 O \n+HETATM 483 H1 HOH B 115 -3.525 -0.647 6.181 1.00 0.00 H \n+HETATM 484 H2 HOH B 115 -3.945 -2.098 6.072 1.00 0.00 H \n+HETATM 485 O HOH B 116 -4.695 1.855 11.630 1.00 0.00 O \n+HETATM 486 H1 HOH B 116 -4.436 2.569 11.047 1.00 0.00 H \n+HETATM 487 H2 HOH B 116 -3.910 1.313 11.708 1.00 0.00 H \n+HETATM 488 O HOH B 117 7.289 -2.891 -9.164 1.00 0.00 O \n+HETATM 489 H1 HOH B 117 7.787 -2.943 -8.348 1.00 0.00 H \n+HETATM 490 H2 HOH B 117 7.321 -1.965 -9.406 1.00 0.00 H \n+HETATM 491 O HOH B 118 -6.969 5.307 -5.534 1.00 0.00 O \n+HETATM 492 H1 HOH B 118 -6.100 5.707 -5.554 1.00 0.00 H \n+HETATM 493 H2 HOH B 118 -6.882 4.517 -6.067 1.00 0.00 H \n+HETATM 494 O HOH B 119 -5.552 -6.711 4.948 1.00 0.00 O \n+HETATM 495 H1 HOH B 119 -5.409 -5.775 4.810 1.00 0.00 H \n+HETATM 496 H2 HOH B 119 -4.673 -7.075 5.058 1.00 0.00 H \n+HETATM 497 O HOH B 120 2.544 3.931 -4.415 1.00 0.00 O \n+HETATM 498 H1 HOH B 120 2.008 3.160 -4.599 1.00 0.00 H \n+HETATM 499 H2 HOH B 120 2.788 3.839 -3.494 1.00 0.00 H \n+HETATM 500 O HOH B 121 4.080 -10.165 1.896 1.00 0.00 O \n+HETATM 501 H1 HOH B 121 4.853 -10.364 1.367 1.00 0.00 H \n+HETATM 502 H2 HOH B 121 4.332 -9.397 2.409 1.00 0.00 H \n+HETATM 503 O HOH B 122 -7.734 -0.061 9.781 1.00 0.00 O \n+HETATM 504 H1 HOH B 122 -7.600 0.672 10.382 1.00 0.00 H \n+HETATM 505 H2 HOH B 122 -7.061 0.054 9.110 1.00 0.00 H \n+HETATM 506 O HOH B 123 3.894 11.747 -1.937 1.00 0.00 O \n+HETATM 507 H1 HOH B 123 4.724 11.327 -2.160 1.00 0.00 H \n+HETATM 508 H2 HOH B 123 3.978 12.639 -2.275 1.00 0.00 H \n+HETATM 509 O HOH B 124 7.179 4.872 11.912 1.00 0.00 O \n+HETATM 510 H1 HOH B 124 7.450 5.080 12.806 1.00 0.00 H \n+HETATM 511 H2 HOH B 124 7.214 5.709 11.449 1.00 0.00 H \n+HETATM 512 O HOH B 125 -2.437 3.858 -10.596 1.00 0.00 O \n+HETATM 513 H1 HOH B 125 -1.689 3.276 -10.734 1.00 0.00 H \n+HETATM 514 H2 HOH B 125 -2.309 4.207 -9.714 1.00 0.00 H \n+HETATM 515 O HOH B 126 -9.389 -2.095 7.783 1.00 0.00 O \n+HETATM 516 H1 HOH B 126 -9.908 -1.339 8.058 1.00 0.00 H \n+HETATM 517 H2 HOH B 126 -8.869 -2.323 8.554 1.00 0.00 H \n+HETATM 518 O HOH B 127 1.810 8.202 -9.416 1.00 0.00 O \n+HETATM 519 H1 HOH B 127 0.900 8.146 -9.709 1.00 0.00 H \n+HETATM 520 H2 HOH B 127 2.258 7.498 -9.885 1.00 0.00 H \n+HETATM 521 O HOH B 128 3.175 4.362 9.161 1.00 0.00 O \n+HETATM 522 H1 HOH B 128 4.044 4.080 9.447 1.00 0.00 H \n+HETATM 523 H2 HOH B 128 2.740 3.555 8.885 1.00 0.00 H \n+HETATM 524 O HOH B 129 1.063 -9.309 -10.267 1.00 0.00 O \n+HETATM 525 H1 HOH B 129 1.725 -9.923 -9.949 1.00 0.00 H \n+HETATM 526 H2 HOH B 129 1.559 -8.659 -10.765 1.00 0.00 H \n+HETATM 527 O HOH B 130 -10.686 -6.615 7.868 1.00 0.00 O \n+HETATM 528 H1 HOH B 130 -11.607 -6.423 8.044 1.00 0.00 H \n+HETATM 529 H2 HOH B 130 -10.204 -6.032 8.455 1.00 0.00 H \n+HETATM 530 O HOH B 131 0.864 7.024 4.781 1.00 0.00 O \n+HETATM 531 H1 HOH B 131 0.427 6.179 4.673 1.00 0.00 H \n+HETATM 532 H2 HOH B 131 1.733 6.895 4.401 1.00 0.00 H \n+HETATM 533 O HOH B 132 -11.705 -6.858 -0.803 1.00 0.00 O \n+HETATM 534 H1 HOH B 132 -11.377 -6.844 -1.702 1.00 0.00 H \n+HETATM 535 H2 HOH B 132 -12.303 -6.112 -0.754 1.00 0.00 H \n+HETATM 536 O HOH B 133 -2.010 8.183 7.532 1.00 0.00 O \n+HETATM 537 H1 HOH B 133 -1.376 7.764 8.114 1.00 0.00 H \n+HETATM 538 H2 HOH B 133 -2.778 7.612 7.562 1.00 0.00 H \n+HETATM 539 O HOH B 134 -9.701 6.047 -1.331 1.00 0.00 O \n+HETATM 540 H1 HOH B 134 -9.329 6.860 -0.990 1.00 0.00 H \n+HETATM 541 H2 HOH B 134 -9.019 5.690 -1.899 1.00 0.00 H \n+HETATM 542 O HOH B 135 0.623 2.152 -5.514 1.00 0.00 O \n+HETATM 543 H1 HOH B 135 0.821 1.857 -6.403 1.00 0.00 H \n+HETATM 544 H2 HOH B 135 0.141 2.970 -5.634 1.00 0.00 H \n+HETATM 545 O HOH B 136 -9.927 -7.731 1.054 1.00 0.00 O \n+HETATM 546 H1 HOH B 136 -10.645 -7.567 0.443 1.00 0.00 H \n+HETATM 547 H2 HOH B 136 -9.840 -6.914 1.546 1.00 0.00 H \n+HETATM 548 O HOH B 137 -0.307 6.795 9.237 1.00 0.00 O \n+HETATM 549 H1 HOH B 137 -0.490 5.920 8.894 1.00 0.00 H \n+HETATM 550 H2 HOH B 137 0.361 6.654 9.908 1.00 0.00 H \n+HETATM 551 O HOH B 138 0.610 -4.462 -8.609 1.00 0.00 O \n+HETATM 552 H1 HOH B 138 0.083 -4.943 -9.247 1.00 0.00 H \n+HETATM 553 H2 HOH B 138 0.326 -4.801 -7.759 1.00 0.00 H \n+HETATM 554 O HOH B 139 -1.830 6.956 -4.906 1.00 0.00 O \n+HETATM 555 H1 HOH B 139 -2.620 6.573 -5.288 1.00 0.00 H \n+HETATM 556 H2 HOH B 139 -2.154 7.645 -4.326 1.00 0.00 H \n+HETATM 557 O HOH B 140 0.257 -5.386 -6.059 1.00 0.00 O \n+HETATM 558 H1 HOH B 140 0.907 -5.280 -5.364 1.00 0.00 H \n+HETATM 559 H2 HOH B 140 -0.271 -6.134 -5.781 1.00 0.00 H \n+HETATM 560 O HOH B 141 -11.715 8.495 -7.381 1.00 0.00 O \n+HETATM 561 H1 HOH B 141 -10.812 8.669 -7.646 1.00 0.00 H \n+HETATM 562 H2 HOH B 141 -11.855 7.573 -7.597 1.00 0.00 H \n+HETATM 563 O HOH B 142 5.053 8.938 9.711 1.00 0.00 O \n+HETATM 564 H1 HOH B 142 4.385 9.537 10.045 1.00 0.00 H \n+HETATM 565 H2 HOH B 142 4.557 8.226 9.307 1.00 0.00 H \n+HETATM 566 O HOH B 143 -6.033 9.274 5.485 1.00 0.00 O \n+HETATM 567 H1 HOH B 143 -5.294 9.794 5.168 1.00 0.00 H \n+HETATM 568 H2 HOH B 143 -5.709 8.373 5.485 1.00 0.00 H \n+HETATM 569 O HOH B 144 -6.683 9.963 -5.065 1.00 0.00 O \n+HETATM 570 H1 HOH B 144 -6.083 9.585 -4.422 1.00 0.00 H \n+HETATM 571 H2 HOH B 144 -7.541 9.611 -4.830 1.00 0.00 H \n+HETATM 572 O HOH B 145 -9.308 6.465 -6.342 1.00 0.00 O \n+HETATM 573 H1 HOH B 145 -9.737 6.601 -5.497 1.00 0.00 H \n+HETATM 574 H2 HOH B 145 -8.477 6.044 -6.125 1.00 0.00 H \n+HETATM 575 O HOH B 146 -5.353 5.757 -8.395 1.00 0.00 O \n+HETATM 576 H1 HOH B 146 -6.111 6.178 -8.800 1.00 0.00 H \n+HETATM 577 H2 HOH B 146 -5.239 4.943 -8.886 1.00 0.00 H \n+HETATM 578 O HOH B 147 3.837 6.895 8.273 1.00 0.00 O \n+HETATM 579 H1 HOH B 147 3.593 6.014 8.557 1.00 0.00 H \n+HETATM 580 H2 HOH B 147 3.045 7.243 7.864 1.00 0.00 H \n+HETATM 581 O HOH B 148 -3.542 10.001 -8.066 1.00 0.00 O \n+HETATM 582 H1 HOH B 148 -3.043 10.475 -8.731 1.00 0.00 H \n+HETATM 583 H2 HOH B 148 -3.129 10.244 -7.237 1.00 0.00 H \n+HETATM 584 O HOH B 149 -1.900 9.236 4.971 1.00 0.00 O \n+HETATM 585 H1 HOH B 149 -1.797 8.945 5.877 1.00 0.00 H \n+HETATM 586 H2 HOH B 149 -1.955 8.425 4.464 1.00 0.00 H \n+HETATM 587 O HOH B 150 -8.482 8.174 -0.048 1.00 0.00 O \n+HETATM 588 H1 HOH B 150 -9.036 8.404 0.698 1.00 0.00 H \n+HETATM 589 H2 HOH B 150 -7.745 7.701 0.337 1.00 0.00 H \n+HETATM 590 O HOH B 151 -8.680 2.626 -8.719 1.00 0.00 O \n+HETATM 591 H1 HOH B 151 -8.427 3.173 -9.462 1.00 0.00 H \n+HETATM 592 H2 HOH B 151 -7.956 2.713 -8.099 1.00 0.00 H \n+HETATM 593 O HOH B 152 -7.679 5.010 -2.888 1.00 0.00 O \n+HETATM 594 H1 HOH B 152 -7.471 5.206 -3.801 1.00 0.00 H \n+HETATM 595 H2 HOH B 152 -7.733 4.055 -2.854 1.00 0.00 H \n+HETATM 596 O HOH B 153 -11.486 5.578 -7.772 1.00 0.00 O \n+HETATM 597 H1 HOH B 153 -10.700 5.848 -7.297 1.00 0.00 H \n+HETATM 598 H2 HOH B 153 -11.201 5.498 -8.682 1.00 0.00 H \n+HETATM 599 O HOH B 154 -0.273 -8.811 -2.506 1.00 0.00 O \n+HETATM 600 H1 HOH B 154 0.370 -9.444 -2.826 1.00 0.00 H \n+HETATM 601 H2 HOH B 154 0.091 -8.497 -1.679 1.00 0.00 H \n+HETATM 602 O HOH B 155 -0.905 8.295 -9.907 1.00 0.00 O \n+HETATM 603 H1 HOH B 155 -1.565 7.869 -9.359 1.00 0.00 H \n+HETATM 604 H2 HOH B 155 -1.221 8.173 -10.802 1.00 0.00 H \n+HETATM 605 O HOH B 156 -10.943 2.866 -7.169 1.00 0.00 O \n+HETATM 606 H1 HOH B 156 -11.283 3.749 -7.315 1.00 0.00 H \n+HETATM 607 H2 HOH B 156 -10.171 2.810 -7.731 1.00 0.00 H \n+HETATM 608 O HOH B 157 -4.062 2.260 6.713 1.00 0.00 O \n+HETATM 609 H1 HOH B 157 -3.982 2.722 7.547 1.00 0.00 H \n+HETATM 610 H2 HOH B 157 -3.366 1.603 6.735 1.00 0.00 H \n+HETATM 611 O HOH B 158 -7.791 10.144 -1.843 1.00 0.00 O \n+HETATM 612 H1 HOH B 158 -8.044 9.548 -1.138 1.00 0.00 H \n+HETATM 613 H2 HOH B 158 -8.365 9.910 -2.572 1.00 0.00 H \n+HETATM 614 O HOH B 159 -7.761 9.833 3.364 1.00 0.00 O \n+HETATM 615 H1 HOH B 159 -7.056 9.959 2.729 1.00 0.00 H \n+HETATM 616 H2 HOH B 159 -7.330 9.454 4.129 1.00 0.00 H \n+HETATM 617 O HOH B 160 4.926 -8.853 -9.909 1.00 0.00 O \n+HETATM 618 H1 HOH B 160 5.433 -9.016 -10.705 1.00 0.00 H \n+HETATM 619 H2 HOH B 160 4.379 -9.632 -9.809 1.00 0.00 H \n+HETATM 620 O HOH B 161 -11.426 3.929 3.116 1.00 0.00 O \n+HETATM 621 H1 HOH B 161 -12.371 3.871 3.259 1.00 0.00 H \n+HETATM 622 H2 HOH B 161 -11.320 4.657 2.504 1.00 0.00 H \n+HETATM 623 O HOH B 162 -1.142 -8.063 2.413 1.00 0.00 O \n+HETATM 624 H1 HOH B 162 -0.777 -8.158 3.293 1.00 0.00 H \n+HETATM 625 H2 HOH B 162 -0.977 -7.148 2.183 1.00 0.00 H \n+HETATM 626 O HOH B 163 -8.245 6.175 5.286 1.00 0.00 O \n+HETATM 627 H1 HOH B 163 -8.671 6.561 6.051 1.00 0.00 H \n+HETATM 628 H2 HOH B 163 -7.308 6.261 5.463 1.00 0.00 H \n+HETATM 629 O HOH B 164 -9.172 9.221 -4.095 1.00 0.00 O \n+HETATM 630 H1 HOH B 164 -9.563 8.351 -4.012 1.00 0.00 H \n+HETATM 631 H2 HOH B 164 -9.863 9.758 -4.483 1.00 0.00 H \n+HETATM 632 O HOH B 165 3.154 10.031 7.105 1.00 0.00 O \n+HETATM 633 H1 HOH B 165 3.745 9.637 6.463 1.00 0.00 H \n+HETATM 634 H2 HOH B 165 2.446 9.394 7.202 1.00 0.00 H \n+HETATM 635 O HOH B 166 -5.431 8.850 -2.782 1.00 0.00 O \n+HETATM 636 H1 HOH B 166 -6.112 9.320 -2.301 1.00 0.00 H \n+HETATM 637 H2 HOH B 166 -5.432 7.971 -2.403 1.00 0.00 H \n+HETATM 638 O HOH B 167 -2.175 4.694 -7.998 1.00 0.00 O \n+HETATM 639 H1 HOH B 167 -2.347 5.629 -8.108 1.00 0.00 H \n+HETATM 640 H2 HOH B 167 -1.519 4.651 -7.302 1.00 0.00 H \n+HETATM 641 O HOH B 168 -0.161 -9.789 -7.808 1.00 0.00 O \n+HETATM 642 H1 HOH B 168 -1.100 -9.951 -7.900 1.00 0.00 H \n+HETATM 643 H2 HOH B 168 0.155 -9.691 -8.706 1.00 0.00 H \n+HETATM 644 O HOH B 169 -9.095 -10.646 -7.684 1.00 0.00 O \n+HETATM 645 H1 HOH B 169 -8.255 -10.929 -7.324 1.00 0.00 H \n+HETATM 646 H2 HOH B 169 -9.733 -10.867 -7.006 1.00 0.00 H \n+HETATM 647 O HOH B 170 -2.738 9.069 -3.432 1.00 0.00 O \n+HETATM 648 H1 HOH B 170 -3.685 9.024 -3.295 1.00 0.00 H \n+HETATM 649 H2 HOH B 170 -2.414 9.584 -2.693 1.00 0.00 H \n+HETATM 650 O HOH B 171 -4.663 7.660 2.784 1.00 0.00 O \n+HETATM 651 H1 HOH B 171 -3.722 7.488 2.827 1.00 0.00 H \n+HETATM 652 H2 HOH B 171 -4.728 8.567 2.486 1.00 0.00 H \n+HETATM 653 O HOH B 172 1.316 -10.097 1.714 1.00 0.00 O \n+HETATM 654 H1 HOH B 172 2.247 -10.298 1.809 1.00 0.00 H \n+HETATM 655 H2 HOH B 172 0.937 -10.309 2.568 1.00 0.00 H \n+HETATM 656 O HOH B 173 2.125 9.747 0.994 1.00 0.00 O \n+HETATM 657 H1 HOH B 173 1.460 9.571 1.661 1.00 0.00 H \n+HETATM 658 H2 HOH B 173 2.949 9.483 1.402 1.00 0.00 H \n+HETATM 659 O HOH B 174 -6.299 -12.041 6.853 1.00 0.00 O \n+HETATM 660 H1 HOH B 174 -6.160 -12.978 6.713 1.00 0.00 H \n+HETATM 661 H2 HOH B 174 -6.757 -11.990 7.692 1.00 0.00 H \n+HETATM 662 O HOH B 175 4.699 1.031 -10.368 1.00 0.00 O \n+HETATM 663 H1 HOH B 175 4.207 1.835 -10.535 1.00 0.00 H \n+HETATM 664 H2 HOH B 175 4.040 0.404 -10.072 1.00 0.00 H \n+HETATM 665 O HOH B 176 -2.152 1.596 10.344 1.00 0.00 O \n+HETATM 666 H1 HOH B 176 -1.410 2.115 10.654 1.00 0.00 H \n+HETATM 667 H2 HOH B 176 -2.749 2.237 9.958 1.00 0.00 H \n+HETATM 668 O HOH B 177 7.644 2.423 -4.449 1.00 0.00 O \n+HETATM 669 H1 HOH B 177 7.773 3.352 -4.640 1.00 0.00 H \n+HETATM 670 H2 HOH B 177 7.467 2.393 -3.509 1.00 0.00 H \n+HETATM 671 O HOH B 178 -5.379 6.565 5.198 1.00 0.00 O \n+HETATM 672 H1 HOH B 178 -5.255 6.878 4.303 1.00 0.00 H \n+HETATM 673 H2 HOH B 178 -4.819 5.791 5.262 1.00 0.00 H \n+HETATM 674 O HOH B 179 -5.655 -7.024 -10.069 1.00 0.00 O \n+HETATM 675 H1 HOH B 179 -4.981 -6.545 -9.586 1.00 0.00 H \n+HETATM 676 H2 HOH B 179 -5.913 -7.734 -9.480 1.00 0.00 H \n+HETATM 677 O HOH B 180 7.364 2.400 -1.724 1.00 0.00 O \n+HETATM 678 H1 HOH B 180 6.515 2.303 -1.292 1.00 0.00 H \n+HETATM 679 H2 HOH B 180 7.873 2.952 -1.130 1.00 0.00 H \n+HETATM 680 O HOH B 181 -10.655 5.953 1.391 1.00 0.00 O \n+HETATM 681 H1 HOH B 181 -10.636 6.868 1.669 1.00 0.00 H \n+HETATM 682 H2 HOH B 181 -10.604 5.991 0.435 1.00 0.00 H \n+HETATM 683 O HOH B 182 0.302 9.099 3.035 1.00 0.00 O \n+HETATM 684 H1 HOH B 182 -0.342 9.610 3.524 1.00 0.00 H \n+HETATM 685 H2 HOH B 182 0.632 8.461 3.668 1.00 0.00 H \n+HETATM 686 O HOH B 183 0.160 9.035 -4.783 1.00 0.00 O \n+HETATM 687 H1 HOH B 183 0.718 8.845 -5.538 1.00 0.00 H \n+HETATM 688 H2 HOH B 183 -0.459 8.305 -4.752 1.00 0.00 H \n+HETATM 689 O HOH B 184 -8.035 -6.237 -8.789 1.00 0.00 O \n+HETATM 690 H1 HOH B 184 -7.276 -6.337 -9.364 1.00 0.00 H \n+HETATM 691 H2 HOH B 184 -7.718 -5.698 -8.065 1.00 0.00 H \n+HETATM 692 O HOH B 185 5.373 11.348 -7.528 1.00 0.00 O \n+HETATM 693 H1 HOH B 185 4.815 11.944 -7.028 1.00 0.00 H \n+HETATM 694 H2 HOH B 185 6.116 11.887 -7.800 1.00 0.00 H \n+HETATM 695 O HOH B 186 -11.820 -8.699 -5.105 1.00 0.00 O \n+HETATM 696 H1 HOH B 186 -11.377 -9.538 -5.231 1.00 0.00 H \n+HETATM 697 H2 HOH B 186 -12.704 -8.934 -4.822 1.00 0.00 H \n+HETATM 698 O HOH B 187 3.153 11.256 9.606 1.00 0.00 O \n+HETATM 699 H1 HOH B 187 2.943 10.771 8.808 1.00 0.00 H \n+HETATM 700 H2 HOH B 187 3.939 11.755 9.385 1.00 0.00 H \n+HETATM 701 O HOH B 188 -6.975 3.184 8.681 1.00 0.00 O \n+HETATM 702 H1 HOH B 188 -7.111 2.724 9.510 1.00 0.00 H \n+HETATM 703 H2 HOH B 188 -6.039 3.384 8.669 1.00 0.00 H \n+HETATM 704 O HOH B 189 0.125 3.132 10.704 1.00 0.00 O \n+HETATM 705 H1 HOH B 189 0.774 2.566 10.286 1.00 0.00 H \n+HETATM 706 H2 HOH B 189 -0.255 3.635 9.984 1.00 0.00 H \n+HETATM 707 O HOH B 190 1.500 5.574 10.940 1.00 0.00 O \n+HETATM 708 H1 HOH B 190 1.027 4.789 11.216 1.00 0.00 H \n+HETATM 709 H2 HOH B 190 2.168 5.251 10.334 1.00 0.00 H \n+HETATM 710 O HOH B 191 -7.370 6.892 -10.040 1.00 0.00 O \n+HETATM 711 H1 HOH B 191 -8.290 7.134 -10.153 1.00 0.00 H \n+HETATM 712 H2 HOH B 191 -6.882 7.670 -10.310 1.00 0.00 H \n+HETATM 713 O HOH B 192 -1.951 7.067 3.221 1.00 0.00 O \n+HETATM 714 H1 HOH B 192 -1.679 6.235 3.610 1.00 0.00 H \n+HETATM 715 H2 HOH B 192 -1.176 7.376 2.752 1.00 0.00 H \n+HETATM 716 O HOH B 193 -3.323 -8.604 8.504 1.00 0.00 O \n+HETATM 717 H1 HOH B 193 -3.176 -7.713 8.187 1.00 0.00 H \n+HETATM 718 H2 HOH B 193 -2.499 -8.849 8.923 1.00 0.00 H \n+HETATM 719 O HOH B 194 -6.233 9.601 -7.747 1.00 0.00 O \n+HETATM 720 H1 HOH B 194 -5.294 9.725 -7.885 1.00 0.00 H \n+HETATM 721 H2 HOH B 194 -6.353 9.707 -6.803 1.00 0.00 H \n+HETATM 722 O HOH B 195 -9.264 10.478 -9.943 1.00 0.00 O \n+HETATM 723 H1 HOH B 195 -9.252 9.955 -9.142 1.00 0.00 H \n+HETATM 724 H2 HOH B 195 -9.478 11.364 -9.649 1.00 0.00 H \n+HETATM 725 O HOH B 196 -8.919 7.819 10.226 1.00 0.00 O \n+HETATM 726 H1 HOH B 196 -8.728 6.883 10.161 1.00 0.00 H \n+HETATM 727 H2 HOH B 196 -8.062 8.243 10.183 1.00 0.00 H \n+HETATM 728 O HOH B 197 1.290 -10.613 9.419 1.00 0.00 O \n+HETATM 729 H1 HOH B 197 1.847 -11.353 9.660 1.00 0.00 H \n+HETATM 730 H2 HOH B 197 1.903 -9.898 9.248 1.00 0.00 H \n+HETATM 731 O HOH B 198 -4.385 6.769 7.858 1.00 0.00 O \n+HETATM 732 H1 HOH B 198 -4.786 6.655 6.996 1.00 0.00 H \n+HETATM 733 H2 HOH B 198 -4.253 5.878 8.181 1.00 0.00 H \n+HETATM 734 O HOH B 199 6.459 5.856 8.146 1.00 0.00 O \n+HETATM 735 H1 HOH B 199 6.898 5.773 7.300 1.00 0.00 H \n+HETATM 736 H2 HOH B 199 5.634 6.298 7.946 1.00 0.00 H \n+HETATM 737 O HOH B 200 0.807 -9.819 6.712 1.00 0.00 O \n+HETATM 738 H1 HOH B 200 0.653 -10.450 7.415 1.00 0.00 H \n+HETATM 739 H2 HOH B 200 1.427 -9.191 7.083 1.00 0.00 H \n+HETATM 740 O HOH B 201 -3.443 9.753 9.312 1.00 0.00 O \n+HETATM 741 H1 HOH B 201 -2.834 9.437 8.645 1.00 0.00 H \n+HETATM 742 H2 HOH B 201 -3.148 10.643 9.505 1.00 0.00 H \n+HETATM 743 O HOH B 202 4.396 -3.131 -9.147 1.00 0.00 O \n+HETATM 744 H1 HOH B 202 5.350 -3.080 -9.208 1.00 0.00 H \n+HETATM 745 H2 HOH B 202 4.097 -2.236 -9.306 1.00 0.00 H \n+HETATM 746 O HOH B 203 1.669 7.685 -6.699 1.00 0.00 O \n+HETATM 747 H1 HOH B 203 1.707 8.128 -7.547 1.00 0.00 H \n+HETATM 748 H2 HOH B 203 1.878 6.772 -6.895 1.00 0.00 H \n+HETATM 749 O HOH B 204 -3.955 -8.917 -11.276 1.00 0.00 O \n+HETATM 750 H1 HOH B 204 -3.036 -8.670 -11.171 1.00 0.00 H \n+HETATM 751 H2 HOH B 204 -4.444 -8.193 -10.885 1.00 0.00 H \n+HETATM 752 O HOH B 205 -7.629 -11.951 9.309 1.00 0.00 O \n+HETATM 753 H1 HOH B 205 -7.720 -11.098 9.733 1.00 0.00 H \n+HETATM 754 H2 HOH B 205 -8.528 -12.252 9.180 1.00 0.00 H \n+HETATM 755 O HOH B 206 5.733 -5.206 2.308 1.00 0.00 O \n+HETATM 756 H1 HOH B 206 5.768 -4.440 1.735 1.00 0.00 H \n+HETATM 757 H2 HOH B 206 4.855 -5.181 2.688 1.00 0.00 H \n+HETATM 758 O HOH B 207 10.482 -3.139 1.984 1.00 0.00 O \n+HETATM 759 H1 HOH B 207 10.465 -2.226 1.696 1.00 0.00 H \n+HETATM 760 H2 HOH B 207 10.669 -3.638 1.189 1.00 0.00 H \n+HETATM 761 O HOH B 208 10.945 -4.299 -0.635 1.00 0.00 O \n+HETATM 762 H1 HOH B 208 10.444 -3.974 -1.383 1.00 0.00 H \n+HETATM 763 H2 HOH B 208 11.846 -4.028 -0.813 1.00 0.00 H \n+HETATM 764 O HOH B 209 -8.837 -6.244 5.814 1.00 0.00 O \n+HETATM 765 H1 HOH B 209 -8.632 -5.310 5.864 1.00 0.00 H \n+HETATM 766 H2 HOH B 209 -9.594 -6.355 6.390 1.00 0.00 H \n+HETATM 767 O HOH B 210 7.012 -0.173 -9.452 1.00 0.00 O \n+HETATM 768 H1 HOH B 210 6.468 0.257 -10.112 1.00 0.00 H \n+HETATM 769 H2 HOH B 210 6.430 -0.286 -8.700 1.00 0.00 H \n+HETATM 770 O HOH B 211 6.061 -7.294 0.554 1.00 0.00 O \n+HETATM 771 H1 HOH B 211 6.367 -6.796 -0.204 1.00 0.00 H \n+HETATM 772 H2 HOH B 211 6.053 -6.660 1.271 1.00 0.00 H \n+HETATM 773 O HOH B 212 2.973 -5.428 -9.628 1.00 0.00 O \n+HETATM 774 H1 HOH B 212 2.135 -5.052 -9.358 1.00 0.00 H \n+HETATM 775 H2 HOH B 212 3.585 -4.691 -9.607 1.00 0.00 H \n+HETATM 776 O HOH B 213 -10.006 8.543 2.200 1.00 0.00 O \n+HETATM 777 H1 HOH B 213 -10.853 8.661 2.630 1.00 0.00 H \n+HETATM 778 H2 HOH B 213 -9.393 9.046 2.736 1.00 0.00 H \n+HETATM 779 O HOH B 214 1.326 -1.268 7.383 1.00 0.00 O \n+HETATM 780 H1 HOH B 214 0.524 -1.174 7.897 1.00 0.00 H \n+HETATM 781 H2 HOH B 214 1.829 -0.477 7.577 1.00 0.00 H \n+HETATM 782 O HOH B 215 6.249 10.467 -2.549 1.00 0.00 O \n+HETATM 783 H1 HOH B 215 7.018 11.024 -2.424 1.00 0.00 H \n+HETATM 784 H2 HOH B 215 6.484 9.893 -3.278 1.00 0.00 H \n+HETATM 785 O HOH B 216 2.693 -3.386 -6.945 1.00 0.00 O \n+HETATM 786 H1 HOH B 216 3.328 -3.318 -7.658 1.00 0.00 H \n+HETATM 787 H2 HOH B 216 1.879 -3.650 -7.373 1.00 0.00 H \n+HETATM 788 O HOH B 217 -5.504 -9.333 6.925 1.00 0.00 O \n+HETATM 789 H1 HOH B 217 -4.686 -9.222 7.408 1.00 0.00 H \n+HETATM 790 H2 HOH B 217 -5.645 -10.280 6.905 1.00 0.00 H \n+HETATM 791 O HOH B 218 -2.791 -6.036 7.559 1.00 0.00 O \n+HETATM 792 H1 HOH B 218 -3.096 -5.243 7.118 1.00 0.00 H \n+HETATM 793 H2 HOH B 218 -2.114 -5.729 8.163 1.00 0.00 H \n+HETATM 794 O HOH B 219 7.816 5.305 5.794 1.00 0.00 O \n+HETATM 795 H1 HOH B 219 7.446 5.043 4.951 1.00 0.00 H \n+HETATM 796 H2 HOH B 219 8.265 4.522 6.113 1.00 0.00 H \n+HETATM 797 O HOH B 220 -10.144 -8.107 -10.131 1.00 0.00 O \n+HETATM 798 H1 HOH B 220 -10.366 -7.182 -10.237 1.00 0.00 H \n+HETATM 799 H2 HOH B 220 -9.974 -8.417 -11.020 1.00 0.00 H \n+HETATM 800 O HOH B 221 7.659 0.309 -6.133 1.00 0.00 O \n+HETATM 801 H1 HOH B 221 7.622 1.072 -5.557 1.00 0.00 H \n+HETATM 802 H2 HOH B 221 8.326 0.530 -6.783 1.00 0.00 H \n+HETATM 803 O HOH B 222 -10.202 1.683 -4.763 1.00 0.00 O \n+HETATM 804 H1 HOH B 222 -10.519 2.234 -5.478 1.00 0.00 H \n+HETATM 805 H2 HOH B 222 -10.211 0.795 -5.122 1.00 0.00 H \n+HETATM 806 O HOH B 223 7.735 5.899 -9.517 1.00 0.00 O \n+HETATM 807 H1 HOH B 223 6.797 6.028 -9.379 1.00 0.00 H \n+HETATM 808 H2 HOH B 223 8.128 6.745 -9.302 1.00 0.00 H \n+HETATM 809 O HOH B 224 7.445 -10.136 -2.138 1.00 0.00 O \n+HETATM 810 H1 HOH B 224 6.986 -10.098 -1.299 1.00 0.00 H \n+HETATM 811 H2 HOH B 224 7.979 -10.929 -2.084 1.00 0.00 H \n+HETATM 812 O HOH B 225 8.848 -5.674 0.461 1.00 0.00 O \n+HETATM 813 H1 HOH B 225 9.636 -5.270 0.098 1.00 0.00 H \n+HETATM 814 H2 HOH B 225 8.214 -5.649 -0.256 1.00 0.00 H \n+HETATM 815 O HOH B 226 11.468 8.518 3.250 1.00 0.00 O \n+HETATM 816 H1 HOH B 226 11.097 8.061 4.005 1.00 0.00 H \n+HETATM 817 H2 HOH B 226 10.709 8.766 2.723 1.00 0.00 H \n+HETATM 818 O HOH B 227 -9.650 -1.123 -0.407 1.00 0.00 O \n+HETATM 819 H1 HOH B 227 -8.992 -0.459 -0.200 1.00 0.00 H \n+HETATM 820 H2 HOH B 227 -10.019 -0.842 -1.245 1.00 0.00 H \n+HETATM 821 O HOH B 228 8.899 11.557 -1.548 1.00 0.00 O \n+HETATM 822 H1 HOH B 228 9.362 12.060 -0.878 1.00 0.00 H \n+HETATM 823 H2 HOH B 228 8.735 10.707 -1.140 1.00 0.00 H \n+HETATM 824 O HOH B 229 -10.510 -6.963 -3.318 1.00 0.00 O \n+HETATM 825 H1 HOH B 229 -10.986 -7.583 -3.870 1.00 0.00 H \n+HETATM 826 H2 HOH B 229 -10.185 -6.300 -3.928 1.00 0.00 H \n+HETATM 827 O HOH B 230 -5.037 -11.262 0.853 1.00 0.00 O \n+HETATM 828 H1 HOH B 230 -4.177 -10.891 1.051 1.00 0.00 H \n+HETATM 829 H2 HOH B 230 -5.309 -10.821 0.049 1.00 0.00 H \n+HETATM 830 O HOH B 231 -0.444 -5.648 -10.970 1.00 0.00 O \n+HETATM 831 H1 HOH B 231 -0.880 -4.808 -11.114 1.00 0.00 H \n+HETATM 832 H2 HOH B 231 -0.050 -5.861 -11.816 1.00 0.00 H \n+HETATM 833 O HOH B 232 -2.947 -7.634 5.268 1.00 0.00 O \n+HETATM 834 H1 HOH B 232 -2.933 -7.138 6.087 1.00 0.00 H \n+HETATM 835 H2 HOH B 232 -2.028 -7.837 5.095 1.00 0.00 H \n+HETATM 836 O HOH B 233 6.487 -10.005 0.460 1.00 0.00 O \n+HETATM 837 H1 HOH B 233 7.069 -10.259 1.176 1.00 0.00 H \n+HETATM 838 H2 HOH B 233 6.444 -9.051 0.511 1.00 0.00 H \n+HETATM 839 O HOH B 234 -8.282 5.265 2.674 1.00 0.00 O \n+HETATM 840 H1 HOH B 234 -9.140 5.520 2.336 1.00 0.00 H \n+HETATM 841 H2 HOH B 234 -8.272 5.591 3.574 1.00 0.00 H \n+HETATM 842 O HOH B 235 -9.174 -7.036 11.357 1.00 0.00 O \n+HETATM 843 H1 HOH B 235 -9.074 -6.469 10.593 1.00 0.00 H \n+HETATM 844 H2 HOH B 235 -9.397 -6.438 12.071 1.00 0.00 H \n+HETATM 845 O HOH B 236 7.432 -0.781 0.137 1.00 0.00 O \n+HETATM 846 H1 HOH B 236 7.422 0.096 0.519 1.00 0.00 H \n+HETATM 847 H2 HOH B 236 7.618 -0.637 -0.791 1.00 0.00 H \n+HETATM 848 O HOH B 237 -10.405 -3.760 -0.923 1.00 0.00 O \n+HETATM 849 H1 HOH B 237 -9.683 -4.103 -1.450 1.00 0.00 H \n+HETATM 850 H2 HOH B 237 -10.171 -2.846 -0.763 1.00 0.00 H \n+HETATM 851 O HOH B 238 -8.053 -3.693 6.021 1.00 0.00 O \n+HETATM 852 H1 HOH B 238 -7.233 -3.674 6.513 1.00 0.00 H \n+HETATM 853 H2 HOH B 238 -8.653 -3.151 6.533 1.00 0.00 H \n+HETATM 854 O HOH B 239 -6.520 -8.731 -8.017 1.00 0.00 O \n+HETATM 855 H1 HOH B 239 -6.237 -8.182 -7.286 1.00 0.00 H \n+HETATM 856 H2 HOH B 239 -6.441 -9.627 -7.689 1.00 0.00 H \n+HETATM 857 O HOH B 240 7.719 -7.860 -3.613 1.00 0.00 O \n+HETATM 858 H1 HOH B 240 7.730 -8.670 -3.103 1.00 0.00 H \n+HETATM 859 H2 HOH B 240 7.534 -7.175 -2.970 1.00 0.00 H \n+HETATM 860 O HOH B 241 9.201 -3.637 -2.654 1.00 0.00 O \n+HETATM 861 H1 HOH B 241 8.459 -4.189 -2.406 1.00 0.00 H \n+HETATM 862 H2 HOH B 241 8.849 -3.046 -3.320 1.00 0.00 H \n+HETATM 863 O HOH B 242 6.979 -5.468 -4.992 1.00 0.00 O \n+HETATM 864 H1 HOH B 242 6.833 -5.250 -4.072 1.00 0.00 H \n+HETATM 865 H2 HOH B 242 7.487 -6.279 -4.969 1.00 0.00 H \n+HETATM 866 O HOH B 243 -8.601 5.144 9.718 1.00 0.00 O \n+HETATM 867 H1 HOH B 243 -9.509 5.056 9.425 1.00 0.00 H \n+HETATM 868 H2 HOH B 243 -8.133 4.445 9.261 1.00 0.00 H \n+HETATM 869 O HOH B 244 0.717 -8.056 -0.108 1.00 0.00 O \n+HETATM 870 H1 HOH B 244 1.649 -7.842 -0.069 1.00 0.00 H \n+HETATM 871 H2 HOH B 244 0.588 -8.693 0.595 1.00 0.00 H \n+HETATM 872 O HOH B 245 -8.048 -6.169 3.140 1.00 0.00 O \n+HETATM 873 H1 HOH B 245 -8.383 -6.101 4.035 1.00 0.00 H \n+HETATM 874 H2 HOH B 245 -8.635 -5.619 2.622 1.00 0.00 H \n+HETATM 875 O HOH B 246 -10.609 6.863 -3.955 1.00 0.00 O \n+HETATM 876 H1 HOH B 246 -10.633 6.476 -3.080 1.00 0.00 H \n+HETATM 877 H2 HOH B 246 -11.521 6.858 -4.245 1.00 0.00 H \n+HETATM 878 O HOH B 247 -0.950 4.310 8.435 1.00 0.00 O \n+HETATM 879 H1 HOH B 247 -0.619 3.820 7.682 1.00 0.00 H \n+HETATM 880 H2 HOH B 247 -1.884 4.104 8.464 1.00 0.00 H \n+HETATM 881 O HOH B 248 8.333 -5.373 3.102 1.00 0.00 O \n+HETATM 882 H1 HOH B 248 7.400 -5.206 2.968 1.00 0.00 H \n+HETATM 883 H2 HOH B 248 8.673 -5.548 2.225 1.00 0.00 H \n+HETATM 884 O HOH B 249 -9.199 -2.646 -10.176 1.00 0.00 O \n+HETATM 885 H1 HOH B 249 -9.560 -1.798 -9.917 1.00 0.00 H \n+HETATM 886 H2 HOH B 249 -8.250 -2.521 -10.153 1.00 0.00 H \n+HETATM 887 O HOH B 250 2.936 6.103 -10.728 1.00 0.00 O \n+HETATM 888 H1 HOH B 250 2.865 5.218 -10.372 1.00 0.00 H \n+HETATM 889 H2 HOH B 250 2.551 6.042 -11.602 1.00 0.00 H \n+HETATM 890 O HOH B 251 8.440 2.588 5.465 1.00 0.00 O \n+HETATM 891 H1 HOH B 251 8.012 2.921 4.676 1.00 0.00 H \n+HETATM 892 H2 HOH B 251 7.862 1.891 5.776 1.00 0.00 H \n+HETATM 893 O HOH B 252 8.223 -11.360 5.438 1.00 0.00 O \n+HETATM 894 H1 HOH B 252 7.273 -11.281 5.346 1.00 0.00 H \n+HETATM 895 H2 HOH B 252 8.476 -10.608 5.972 1.00 0.00 H \n+HETATM 896 O HOH B 253 -4.198 5.784 -5.821 1.00 0.00 O \n+HETATM 897 H1 HOH B 253 -4.144 4.893 -5.475 1.00 0.00 H \n+HETATM 898 H2 HOH B 253 -4.452 5.671 -6.737 1.00 0.00 H \n+HETATM 899 O HOH B 254 -11.966 0.343 -7.707 1.00 0.00 O \n+HETATM 900 H1 HOH B 254 -11.735 1.241 -7.471 1.00 0.00 H \n+HETATM 901 H2 HOH B 254 -12.891 0.389 -7.950 1.00 0.00 H \n+HETATM 902 O HOH B 255 8.668 -3.183 -6.763 1.00 0.00 O \n+HETATM 903 H1 HOH B 255 9.618 -3.079 -6.709 1.00 0.00 H \n+HETATM 904 H2 HOH B 255 8.340 -2.837 -5.933 1.00 0.00 H \n+HETATM 905 O HOH B 256 3.958 -10.525 -6.497 1.00 0.00 O \n+HETATM 906 H1 HOH B 256 3.164 -10.091 -6.185 1.00 0.00 H \n+HETATM 907 H2 HOH B 256 4.673 -10.046 -6.079 1.00 0.00 H \n+HETATM 908 O HOH B 257 6.166 -3.203 0.485 1.00 0.00 O \n+HETATM 909 H1 HOH B 257 6.487 -2.350 0.192 1.00 0.00 H \n+HETATM 910 H2 HOH B 257 6.337 -3.790 -0.251 1.00 0.00 H \n+HETATM 911 O HOH B 258 8.934 5.793 2.467 1.00 0.00 O \n+HETATM 912 H1 HOH B 258 9.260 6.229 3.254 1.00 0.00 H \n+HETATM 913 H2 HOH B 258 8.308 5.146 2.792 1.00 0.00 H \n+HETATM 914 O HOH B 259 -10.407 -0.906 -5.687 1.00 0.00 O \n+HETATM 915 H1 HOH B 259 -10.970 -0.727 -6.440 1.00 0.00 H \n+HETATM 916 H2 HOH B 259 -9.701 -1.448 -6.038 1.00 0.00 H \n+HETATM 917 O HOH B 260 4.872 -3.201 -3.050 1.00 0.00 O \n+HETATM 918 H1 HOH B 260 5.414 -3.842 -2.590 1.00 0.00 H \n+HETATM 919 H2 HOH B 260 4.831 -2.451 -2.456 1.00 0.00 H \n+HETATM 920 O HOH B 261 3.451 -7.993 0.171 1.00 0.00 O \n+HETATM 921 H1 HOH B 261 4.326 -7.690 0.413 1.00 0.00 H \n+HETATM 922 H2 HOH B 261 3.357 -8.835 0.617 1.00 0.00 H \n+HETATM 923 O HOH B 262 7.368 -5.512 -8.031 1.00 0.00 O \n+HETATM 924 H1 HOH B 262 7.764 -5.043 -7.297 1.00 0.00 H \n+HETATM 925 H2 HOH B 262 7.206 -4.836 -8.689 1.00 0.00 H \n+HETATM 926 O HOH B 263 8.088 -8.614 6.411 1.00 0.00 O \n+HETATM 927 H1 HOH B 263 8.037 -8.551 5.457 1.00 0.00 H \n+HETATM 928 H2 HOH B 263 7.631 -7.835 6.728 1.00 0.00 H \n+HETATM 929 O HOH B 264 9.327 0.909 -8.297 1.00 0.00 O \n+HETATM 930 H1 HOH B 264 9.137 1.843 -8.385 1.00 0.00 H \n+HETATM 931 H2 HOH B 264 8.693 0.480 -8.871 1.00 0.00 H \n+HETATM 932 O HOH B 265 -7.708 -2.780 9.975 1.00 0.00 O \n+HETATM 933 H1 HOH B 265 -7.737 -1.830 10.092 1.00 0.00 H \n+HETATM 934 H2 HOH B 265 -6.793 -3.013 10.131 1.00 0.00 H \n+HETATM 935 O HOH B 266 -8.861 -5.204 9.338 1.00 0.00 O \n+HETATM 936 H1 HOH B 266 -8.632 -4.327 9.645 1.00 0.00 H \n+HETATM 937 H2 HOH B 266 -8.065 -5.527 8.917 1.00 0.00 H \n+HETATM 938 O HOH B 267 5.779 5.044 -6.672 1.00 0.00 O \n+HETATM 939 H1 HOH B 267 5.734 4.148 -7.006 1.00 0.00 H \n+HETATM 940 H2 HOH B 267 5.530 5.591 -7.417 1.00 0.00 H \n+HETATM 941 O HOH B 268 6.938 -3.670 12.173 1.00 0.00 O \n+HETATM 942 H1 HOH B 268 7.763 -4.021 11.838 1.00 0.00 H \n+HETATM 943 H2 HOH B 268 7.118 -3.468 13.091 1.00 0.00 H \n+HETATM 944 O HOH B 269 -10.966 -7.202 -7.276 1.00 0.00 O \n+HETATM 945 H1 HOH B 269 -11.753 -7.087 -7.809 1.00 0.00 H \n+HETATM 946 H2 HOH B 269 -11.266 -7.681 -6.504 1.00 0.00 H \n+HETATM 947 O HOH B 270 4.335 -5.503 9.507 1.00 0.00 O \n+HETATM 948 H1 HOH B 270 3.893 -6.308 9.238 1.00 0.00 H \n+HETATM 949 H2 HOH B 270 5.214 -5.784 9.761 1.00 0.00 H \n+HETATM 950 O HOH B 271 7.041 -6.220 9.796 1.00 0.00 O \n+HETATM 951 H1 HOH B 271 7.422 -7.098 9.825 1.00 0.00 H \n+HETATM 952 H2 HOH B 271 7.723 -5.651 10.154 1.00 0.00 H \n+HETATM 953 O HOH B 272 6.136 -2.892 9.677 1.00 0.00 O \n+HETATM 954 H1 HOH B 272 6.291 -3.171 10.579 1.00 0.00 H \n+HETATM 955 H2 HOH B 272 5.200 -2.693 9.645 1.00 0.00 H \n+HETATM 956 O HOH B 273 9.873 -0.480 1.384 1.00 0.00 O \n+HETATM 957 H1 HOH B 273 9.117 -0.877 0.951 1.00 0.00 H \n+HETATM 958 H2 HOH B 273 9.664 0.453 1.425 1.00 0.00 H \n+HETATM 959 O HOH B 274 9.119 -4.448 10.559 1.00 0.00 O \n+HETATM 960 H1 HOH B 274 8.994 -3.783 9.881 1.00 0.00 H \n+HETATM 961 H2 HOH B 274 10.056 -4.421 10.751 1.00 0.00 H \n+HETATM 962 O HOH B 275 -9.976 -2.151 2.138 1.00 0.00 O \n+HETATM 963 H1 HOH B 275 -10.604 -1.635 2.645 1.00 0.00 H \n+HETATM 964 H2 HOH B 275 -9.965 -1.736 1.276 1.00 0.00 H \n+HETATM 965 O HOH B 276 8.150 1.739 1.211 1.00 0.00 O \n+HETATM 966 H1 HOH B 276 8.408 2.593 0.863 1.00 0.00 H \n+HETATM 967 H2 HOH B 276 7.427 1.932 1.808 1.00 0.00 H \n+HETATM 968 O HOH B 277 -9.593 3.729 5.206 1.00 0.00 O \n+HETATM 969 H1 HOH B 277 -9.203 4.603 5.222 1.00 0.00 H \n+HETATM 970 H2 HOH B 277 -10.309 3.797 4.575 1.00 0.00 H \n+HETATM 971 O HOH B 278 -8.512 1.822 6.781 1.00 0.00 O \n+HETATM 972 H1 HOH B 278 -7.905 2.312 7.335 1.00 0.00 H \n+HETATM 973 H2 HOH B 278 -8.904 2.483 6.210 1.00 0.00 H \n+HETATM 974 O HOH B 279 5.784 -3.767 7.009 1.00 0.00 O \n+HETATM 975 H1 HOH B 279 5.380 -2.935 6.761 1.00 0.00 H \n+HETATM 976 H2 HOH B 279 5.889 -3.708 7.959 1.00 0.00 H \n+HETATM 977 O HOH B 280 4.606 -7.911 3.352 1.00 0.00 O \n+HETATM 978 H1 HOH B 280 4.586 -8.036 4.301 1.00 0.00 H \n+HETATM 979 H2 HOH B 280 4.104 -7.109 3.205 1.00 0.00 H \n+HETATM 980 O HOH B 281 -5.310 -8.857 10.379 1.00 0.00 O \n+HETATM 981 H1 HOH B 281 -4.652 -8.861 9.683 1.00 0.00 H \n+HETATM 982 H2 HOH B 281 -4.827 -9.107 11.166 1.00 0.00 H \n+HETATM 983 O HOH B 282 -11.974 2.557 7.978 1.00 0.00 O \n+HETATM 984 H1 HOH B 282 -12.641 2.223 7.377 1.00 0.00 H \n+HETATM 985 H2 HOH B 282 -11.480 1.781 8.243 1.00 0.00 H \n+HETATM 986 O HOH B 283 -10.150 0.488 8.504 1.00 0.00 O \n+HETATM 987 H1 HOH B 283 -9.503 0.338 9.193 1.00 0.00 H \n+HETATM 988 H2 HOH B 283 -9.672 0.962 7.824 1.00 0.00 H \n+HETATM 989 O HOH B 284 -8.276 -2.321 -6.710 1.00 0.00 O \n+HETATM 990 H1 HOH B 284 -7.823 -1.859 -7.416 1.00 0.00 H \n+HETATM 991 H2 HOH B 284 -7.806 -3.150 -6.625 1.00 0.00 H \n+HETATM 992 O HOH B 285 1.088 -3.975 7.540 1.00 0.00 O \n+HETATM 993 H1 HOH B 285 1.152 -3.061 7.266 1.00 0.00 H \n+HETATM 994 H2 HOH B 285 1.699 -4.441 6.969 1.00 0.00 H \n+HETATM 995 O HOH B 286 5.786 3.716 9.792 1.00 0.00 O \n+HETATM 996 H1 HOH B 286 6.215 3.895 10.629 1.00 0.00 H \n+HETATM 997 H2 HOH B 286 6.138 4.377 9.196 1.00 0.00 H \n+HETATM 998 O HOH B 287 -7.917 -8.854 4.708 1.00 0.00 O \n+HETATM 999 H1 HOH B 287 -7.893 -9.811 4.708 1.00 0.00 H \n+HETATM 1000 H2 HOH B 287 -8.830 -8.638 4.897 1.00 0.00 H \n+HETATM 1001 O HOH B 288 -8.540 -8.191 -5.837 1.00 0.00 O \n+HETATM 1002 H1 HOH B 288 -7.985 -8.613 -5.181 1.00 0.00 H \n+HETATM 1003 H2 HOH B 288 -8.799 -7.362 -5.435 1.00 0.00 H \n+HETATM 1004 O HOH B 289 8.621 -2.427 8.685 1.00 0.00 O \n+HETATM 1005 H1 HOH B 289 8.781 -1.485 8.620 1.00 0.00 H \n+HETATM 1006 H2 HOH B 289 7.716 -2.496 8.987 1.00 0.00 H \n+HETATM 1007 O HOH B 290 10.009 4.920 -6.732 1.00 0.00 O \n+HETATM 1008 H1 HOH B 290 9.484 4.350 -7.293 1.00 0.00 H \n+HETATM 1009 H2 HOH B 290 10.806 5.085 -7.236 1.00 0.00 H \n+HETATM 1010 O HOH B 291 5.565 -10.786 5.014 1.00 0.00 O \n+HETATM 1011 H1 HOH B 291 5.184 -10.855 4.139 1.00 0.00 H \n+HETATM 1012 H2 HOH B 291 5.326 -9.908 5.312 1.00 0.00 H \n+HETATM 1013 O HOH B 292 4.153 -9.761 -3.250 1.00 0.00 O \n+HETATM 1014 H1 HOH B 292 4.850 -9.717 -3.904 1.00 0.00 H \n+HETATM 1015 H2 HOH B 292 4.087 -8.868 -2.909 1.00 0.00 H \n+HETATM 1016 O HOH B 293 4.009 -7.119 -2.362 1.00 0.00 O \n+HETATM 1017 H1 HOH B 293 4.815 -6.613 -2.259 1.00 0.00 H \n+HETATM 1018 H2 HOH B 293 3.766 -7.368 -1.471 1.00 0.00 H \n+HETATM 1019 O HOH B 294 4.694 -11.685 7.467 1.00 0.00 O \n+HETATM 1020 H1 HOH B 294 4.154 -12.452 7.277 1.00 0.00 H \n+HETATM 1021 H2 HOH B 294 5.092 -11.458 6.626 1.00 0.00 H \n+HETATM 1022 O HOH B 295 5.923 -8.999 -5.362 1.00 0.00 O \n+HETATM 1023 H1 HOH B 295 6.576 -8.646 -4.758 1.00 0.00 H \n+HETATM 1024 H2 HOH B 295 6.218 -8.714 -6.227 1.00 0.00 H \n+HETATM 1025 O HOH B 296 9.582 -1.016 4.095 1.00 0.00 O \n+HETATM 1026 H1 HOH B 296 9.899 -0.708 3.246 1.00 0.00 H \n+HETATM 1027 H2 HOH B 296 8.793 -0.500 4.258 1.00 0.00 H \n+HETATM 1028 O HOH B 297 -9.618 7.166 7.538 1.00 0.00 O \n+HETATM 1029 H1 HOH B 297 -9.526 7.513 8.426 1.00 0.00 H \n+HETATM 1030 H2 HOH B 297 -10.231 6.436 7.628 1.00 0.00 H \n+HETATM 1031 O HOH B 298 5.101 6.592 -4.522 1.00 0.00 O \n+HETATM 1032 H1 HOH B 298 4.164 6.778 -4.571 1.00 0.00 H \n+HETATM 1033 H2 HOH B 298 5.273 6.023 -5.273 1.00 0.00 H \n+HETATM 1034 O HOH B 299 9.128 8.981 -5.998 1.00 0.00 O \n+HETATM 1035 H1 HOH B 299 8.264 8.831 -5.616 1.00 0.00 H \n+HETATM 1036 H2 HOH B 299 9.530 9.640 -5.432 1.00 0.00 H \n+HETATM 1037 O HOH B 300 9.008 8.522 1.903 1.00 0.00 O \n+HETATM 1038 H1 HOH B 300 8.915 8.738 0.975 1.00 0.00 H \n+HETATM 1039 H2 HOH B 300 8.980 7.566 1.931 1.00 0.00 H \n+HETATM 1040 O HOH B 301 10.166 10.113 -3.664 1.00 0.00 O \n+HETATM 1041 H1 HOH B 301 9.969 9.280 -3.234 1.00 0.00 H \n+HETATM 1042 H2 HOH B 301 9.826 10.778 -3.065 1.00 0.00 H \n+HETATM 1043 O HOH B 302 -6.626 9.353 9.611 1.00 0.00 O \n+HETATM 1044 H1 HOH B 302 -7.121 9.370 8.792 1.00 0.00 H \n+HETATM 1045 H2 HOH B 302 -6.674 10.251 9.939 1.00 0.00 H \n+HETATM 1046 O HOH B 303 7.608 5.607 -2.157 1.00 0.00 O \n+HETATM 1047 H1 HOH B 303 6.678 5.661 -1.937 1.00 0.00 H \n+HETATM 1048 H2 HOH B 303 7.623 5.291 -3.060 1.00 0.00 H \n+HETATM 1049 O HOH B 304 8.464 9.017 -0.705 1.00 0.00 O \n+HETATM 1050 H1 HOH B 304 7.539 8.783 -0.628 1.00 0.00 H \n+HETATM 1051 H2 HOH B 304 8.805 8.429 -1.379 1.00 0.00 H \n+HETATM 1052 O HOH B 305 9.481 7.314 4.842 1.00 0.00 O \n+HETATM 1053 H1 HOH B 305 9.194 8.183 5.122 1.00 0.00 H \n+HETATM 1054 H2 HOH B 305 8.935 6.708 5.341 1.00 0.00 H \n+HETATM 1055 O HOH B 306 7.098 8.432 -4.182 1.00 0.00 O \n+HETATM 1056 H1 HOH B 306 6.384 7.828 -4.386 1.00 0.00 H \n+HETATM 1057 H2 HOH B 306 7.758 7.886 -3.754 1.00 0.00 H \n+HETATM 1058 O HOH B 307 8.636 4.232 0.067 1.00 0.00 O \n+HETATM 1059 H1 HOH B 307 8.795 4.779 0.836 1.00 0.00 H \n+HETATM 1060 H2 HOH B 307 8.366 4.847 -0.615 1.00 0.00 H \n+HETATM 1061 O HOH B 308 4.771 8.683 5.334 1.00 0.00 O \n+HETATM 1062 H1 HOH B 308 4.214 8.040 4.896 1.00 0.00 H \n+HETATM 1063 H2 HOH B 308 5.468 8.866 4.705 1.00 0.00 H \n+HETATM 1064 O HOH B 309 -11.155 5.082 8.605 1.00 0.00 O \n+HETATM 1065 H1 HOH B 309 -11.352 4.198 8.297 1.00 0.00 H \n+HETATM 1066 H2 HOH B 309 -11.973 5.387 8.999 1.00 0.00 H \n+HETATM 1067 O HOH B 310 -3.991 10.931 4.616 1.00 0.00 O \n+HETATM 1068 H1 HOH B 310 -3.779 11.796 4.966 1.00 0.00 H \n+HETATM 1069 H2 HOH B 310 -3.184 10.426 4.721 1.00 0.00 H \n+HETATM 1070 O HOH B 311 2.739 10.592 -8.534 1.00 0.00 O \n+HETATM 1071 H1 HOH B 311 2.581 9.741 -8.942 1.00 0.00 H \n+HETATM 1072 H2 HOH B 311 3.633 10.534 -8.197 1.00 0.00 H \n+HETATM 1073 O HOH B 312 3.201 -5.461 3.320 1.00 0.00 O \n+HETATM 1074 H1 HOH B 312 2.969 -5.317 4.237 1.00 0.00 H \n+HETATM 1075 H2 HOH B 312 2.538 -4.979 2.826 1.00 0.00 H \n+HETATM 1076 O HOH B 313 9.437 7.511 -2.768 1.00 0.00 O \n+HETATM 1077 H1 HOH B 313 8.981 6.723 -2.472 1.00 0.00 H \n+HETATM 1078 H2 HOH B 313 10.001 7.208 -3.480 1.00 0.00 H \n+HETATM 1079 O HOH B 314 5.767 8.475 -0.639 1.00 0.00 O \n+HETATM 1080 H1 HOH B 314 5.471 7.665 -1.056 1.00 0.00 H \n+HETATM 1081 H2 HOH B 314 5.689 9.139 -1.324 1.00 0.00 H \n+HETATM 1082 O HOH B 315 -10.689 -11.184 -5.468 1.00 0.00 O \n+HETATM 1083 H1 HOH B 315 -11.114 -12.041 -5.475 1.00 0.00 H \n+HETATM 1084 H2 HOH B 315 -9.935 -11.295 -4.889 1.00 0.00 H \n+HETATM 1085 O HOH B 316 3.108 -10.767 -9.120 1.00 0.00 O \n+HETATM 1086 H1 HOH B 316 3.407 -10.641 -8.220 1.00 0.00 H \n+HETATM 1087 H2 HOH B 316 2.894 -11.699 -9.174 1.00 0.00 H \n+HETATM 1088 O HOH B 317 8.734 8.396 -8.658 1.00 0.00 O \n+HETATM 1089 H1 HOH B 317 9.493 8.733 -9.134 1.00 0.00 H \n+HETATM 1090 H2 HOH B 317 8.927 8.580 -7.739 1.00 0.00 H \n+HETATM 1091 O HOH B 318 -11.541 10.220 -5.225 1.00 0.00 O \n+HETATM 1092 H1 HOH B 318 -11.723 9.636 -5.961 1.00 0.00 H \n+HETATM 1093 H2 HOH B 318 -12.323 10.166 -4.677 1.00 0.00 H \n+HETATM 1094 O HOH B 319 5.076 6.380 -8.948 1.00 0.00 O \n+HETATM 1095 H1 HOH B 319 4.389 6.300 -9.610 1.00 0.00 H \n+HETATM 1096 H2 HOH B 319 5.220 7.323 -8.865 1.00 0.00 H \n+HETATM 1097 O HOH B 320 6.561 9.311 7.404 1.00 0.00 O \n+HETATM 1098 H1 HOH B 320 6.181 9.282 8.282 1.00 0.00 H \n+HETATM 1099 H2 HOH B 320 5.863 8.998 6.829 1.00 0.00 H \n+HETATM 1100 O HOH B 321 7.761 -8.826 9.260 1.00 0.00 O \n+HETATM 1101 H1 HOH B 321 8.141 -8.941 8.389 1.00 0.00 H \n+HETATM 1102 H2 HOH B 321 6.876 -9.182 9.185 1.00 0.00 H \n+HETATM 1103 O HOH B 322 -9.748 7.951 -11.137 1.00 0.00 O \n+HETATM 1104 H1 HOH B 322 -9.745 8.864 -10.851 1.00 0.00 H \n+HETATM 1105 H2 HOH B 322 -9.612 7.995 -12.084 1.00 0.00 H \n+HETATM 1106 O HOH B 323 6.216 -9.331 11.740 1.00 0.00 O \n+HETATM 1107 H1 HOH B 323 5.672 -9.550 10.983 1.00 0.00 H \n+HETATM 1108 H2 HOH B 323 7.086 -9.175 11.373 1.00 0.00 H \n+HETATM 1109 O HOH B 324 10.826 6.911 -5.024 1.00 0.00 O \n+HETATM 1110 H1 HOH B 324 10.624 6.130 -5.540 1.00 0.00 H \n+HETATM 1111 H2 HOH B 324 10.469 7.636 -5.537 1.00 0.00 H \n+HETATM 1112 O HOH B 325 8.505 9.847 5.600 1.00 0.00 O \n+HETATM 1113 H1 HOH B 325 7.951 9.689 6.364 1.00 0.00 H \n+HETATM 1114 H2 HOH B 325 8.616 10.797 5.576 1.00 0.00 H \n+HETATM 1115 O HOH B 326 7.288 -10.838 -8.306 1.00 0.00 O \n+HETATM 1116 H1 HOH B 326 7.175 -9.926 -8.038 1.00 0.00 H \n+HETATM 1117 H2 HOH B 326 7.665 -10.785 -9.184 1.00 0.00 H \n+HETATM 1118 O HOH B 327 -8.740 -8.620 7.734 1.00 0.00 O \n+HETATM 1119 H1 HOH B 327 -8.564 -8.989 8.599 1.00 0.00 H \n+HETATM 1120 H2 HOH B 327 -9.552 -8.124 7.845 1.00 0.00 H \n+HETATM 1121 O HOH B 328 -9.897 -5.326 -10.561 1.00 0.00 O \n+HETATM 1122 H1 HOH B 328 -9.880 -4.369 -10.604 1.00 0.00 H \n+HETATM 1123 H2 HOH B 328 -9.279 -5.546 -9.865 1.00 0.00 H \n+TER 1124 HOH B 328\n+HETATM 1125 Na NA C 1 2.203 10.375 -1.212 1.00 0.00 Na \n+HETATM 1126 Na NA C 2 -6.508 -7.871 3.038 1.00 0.00 Na \n+HETATM 1127 Na NA C 3 -8.301 -9.121 0.227 1.00 0.00 Na \n+HETATM 1128 Na NA C 4 -4.783 7.949 9.928 1.00 0.00 Na \n+HETATM 1129 Na NA C 5 -7.004 -7.629 6.549 1.00 0.00 Na \n+HETATM 1130 Na NA C 6 3.495 -3.739 -4.837 1.00 0.00 Na \n+HETATM 1131 Na NA C 7 9.139 -3.314 3.904 1.00 0.00 Na \n+HETATM 1132 Na NA C 8 -8.987 -8.343 -8.114 1.00 0.00 Na \n+HETATM 1133 Cl CL C 9 1.781 1.549 8.681 1.00 0.00 Cl \n+HETATM 1134 Cl CL C 10 -3.965 3.977 9.320 1.00 0.00 Cl \n+HETATM 1135 Cl CL C 11 2.718 -7.893 8.256 1.00 0.00 Cl \n+HETATM 1136 Cl CL C 12 2.612 3.308 -9.470 1.00 0.00 Cl \n+HETATM 1137 Cl CL C 13 6.699 -5.398 -1.848 1.00 0.00 Cl \n+HETATM 1138 Cl CL C 14 -6.529 -9.408 -3.794 1.00 0.00 Cl \n+TER 1139 CL C 14\n+END\ndiff --git a/wrappers/python/tests/systems/test_charmm_peptide_4.pdb b/wrappers/python/tests/systems/test_charmm_peptide_4.pdb\nnew file mode 100644\nindex 0000000000..0e91cafca5\n--- /dev/null\n+++ b/wrappers/python/tests/systems/test_charmm_peptide_4.pdb\n@@ -0,0 +1,1470 @@\n+REMARK 1 CREATED WITH OPENMM 8.3, 2025-07-01\n+CRYST1 24.000 24.000 24.000 90.00 90.00 90.00 P 1 1 \n+ATOM 1 N GLY A 1 -6.191 -2.039 4.188 1.00 0.00 N \n+ATOM 2 CA GLY A 1 -6.574 -1.518 2.835 1.00 0.00 C \n+ATOM 3 C GLY A 1 -5.473 -1.646 1.823 1.00 0.00 C \n+ATOM 4 O GLY A 1 -4.677 -2.572 1.903 1.00 0.00 O \n+ATOM 5 H GLY A 1 -5.431 -1.491 4.651 1.00 0.00 H \n+ATOM 6 H2 GLY A 1 -5.835 -3.033 4.159 1.00 0.00 H \n+ATOM 7 H3 GLY A 1 -7.016 -1.993 4.837 1.00 0.00 H \n+ATOM 8 HA2 GLY A 1 -7.400 -2.118 2.484 1.00 0.00 H \n+ATOM 9 HA3 GLY A 1 -6.818 -0.470 2.946 1.00 0.00 H \n+ATOM 10 N TYR A 2 -5.379 -0.733 0.839 1.00 0.00 N \n+ATOM 11 CA TYR A 2 -4.240 -0.662 -0.063 1.00 0.00 C \n+ATOM 12 C TYR A 2 -3.482 0.623 0.248 1.00 0.00 C \n+ATOM 13 O TYR A 2 -4.062 1.712 0.284 1.00 0.00 O \n+ATOM 14 CB TYR A 2 -4.695 -0.745 -1.551 1.00 0.00 C \n+ATOM 15 CG TYR A 2 -3.549 -0.650 -2.533 1.00 0.00 C \n+ATOM 16 CD1 TYR A 2 -2.939 -1.803 -3.061 1.00 0.00 C \n+ATOM 17 CD2 TYR A 2 -3.104 0.608 -2.969 1.00 0.00 C \n+ATOM 18 CE1 TYR A 2 -1.889 -1.691 -3.988 1.00 0.00 C \n+ATOM 19 CE2 TYR A 2 -2.051 0.724 -3.882 1.00 0.00 C \n+ATOM 20 CZ TYR A 2 -1.447 -0.426 -4.393 1.00 0.00 C \n+ATOM 21 OH TYR A 2 -0.404 -0.301 -5.330 1.00 0.00 O \n+ATOM 22 H TYR A 2 -6.087 -0.036 0.692 1.00 0.00 H \n+ATOM 23 HA TYR A 2 -3.557 -1.481 0.125 1.00 0.00 H \n+ATOM 24 HB2 TYR A 2 -5.211 -1.713 -1.717 1.00 0.00 H \n+ATOM 25 HB3 TYR A 2 -5.418 0.069 -1.769 1.00 0.00 H \n+ATOM 26 HD1 TYR A 2 -3.279 -2.779 -2.749 1.00 0.00 H \n+ATOM 27 HD2 TYR A 2 -3.570 1.499 -2.582 1.00 0.00 H \n+ATOM 28 HE1 TYR A 2 -1.418 -2.577 -4.389 1.00 0.00 H \n+ATOM 29 HE2 TYR A 2 -1.721 1.705 -4.193 1.00 0.00 H \n+ATOM 30 HH TYR A 2 -0.102 0.626 -5.304 1.00 0.00 H \n+ATOM 31 N ASP A 3 -2.166 0.517 0.508 1.00 0.00 N \n+ATOM 32 CA ASP A 3 -1.372 1.605 1.037 1.00 0.00 C \n+ATOM 33 C ASP A 3 -0.423 2.141 -0.041 1.00 0.00 C \n+ATOM 34 O ASP A 3 0.328 1.357 -0.630 1.00 0.00 O \n+ATOM 35 CB ASP A 3 -0.626 1.085 2.298 1.00 0.00 C \n+ATOM 36 CG ASP A 3 0.189 2.117 3.052 1.00 0.00 C \n+ATOM 37 OD1 ASP A 3 0.360 3.268 2.576 1.00 0.00 O \n+ATOM 38 OD2 ASP A 3 0.661 1.778 4.167 1.00 0.00 O \n+ATOM 39 H ASP A 3 -1.691 -0.360 0.411 1.00 0.00 H \n+ATOM 40 HA ASP A 3 -2.032 2.392 1.367 1.00 0.00 H \n+ATOM 41 HB2 ASP A 3 -1.387 0.685 3.002 1.00 0.00 H \n+ATOM 42 HB3 ASP A 3 0.048 0.251 2.023 1.00 0.00 H \n+ATOM 43 N PRO A 4 -0.382 3.440 -0.363 1.00 0.00 N \n+ATOM 44 CA PRO A 4 0.552 3.962 -1.349 1.00 0.00 C \n+ATOM 45 C PRO A 4 1.974 4.066 -0.812 1.00 0.00 C \n+ATOM 46 O PRO A 4 2.859 4.420 -1.595 1.00 0.00 O \n+ATOM 47 CB PRO A 4 -0.039 5.346 -1.681 1.00 0.00 C \n+ATOM 48 CG PRO A 4 -0.713 5.789 -0.381 1.00 0.00 C \n+ATOM 49 CD PRO A 4 -1.289 4.476 0.145 1.00 0.00 C \n+ATOM 50 HA PRO A 4 0.579 3.303 -2.204 1.00 0.00 H \n+ATOM 51 HB2 PRO A 4 0.710 6.077 -2.040 1.00 0.00 H \n+ATOM 52 HB3 PRO A 4 -0.819 5.221 -2.466 1.00 0.00 H \n+ATOM 53 HG2 PRO A 4 0.052 6.171 0.333 1.00 0.00 H \n+ATOM 54 HG3 PRO A 4 -1.492 6.562 -0.538 1.00 0.00 H \n+ATOM 55 HD2 PRO A 4 -1.335 4.474 1.256 1.00 0.00 H \n+ATOM 56 HD3 PRO A 4 -2.302 4.297 -0.274 1.00 0.00 H \n+ATOM 57 N GLU A 5 2.254 3.753 0.473 1.00 0.00 N \n+ATOM 58 CA GLU A 5 3.621 3.669 0.969 1.00 0.00 C \n+ATOM 59 C GLU A 5 4.192 2.323 0.555 1.00 0.00 C \n+ATOM 60 O GLU A 5 5.140 2.244 -0.227 1.00 0.00 O \n+ATOM 61 CB GLU A 5 3.667 3.813 2.519 1.00 0.00 C \n+ATOM 62 CG GLU A 5 4.984 4.426 3.079 1.00 0.00 C \n+ATOM 63 CD GLU A 5 6.212 3.526 3.148 1.00 0.00 C \n+ATOM 64 OE1 GLU A 5 6.170 2.311 2.847 1.00 0.00 O \n+ATOM 65 OE2 GLU A 5 7.281 4.077 3.530 1.00 0.00 O \n+ATOM 66 H GLU A 5 1.518 3.535 1.131 1.00 0.00 H \n+ATOM 67 HA GLU A 5 4.221 4.445 0.515 1.00 0.00 H \n+ATOM 68 HB2 GLU A 5 2.846 4.523 2.774 1.00 0.00 H \n+ATOM 69 HB3 GLU A 5 3.414 2.874 3.053 1.00 0.00 H \n+ATOM 70 HG2 GLU A 5 5.268 5.314 2.475 1.00 0.00 H \n+ATOM 71 HG3 GLU A 5 4.803 4.744 4.130 1.00 0.00 H \n+ATOM 72 N THR A 6 3.579 1.221 1.034 1.00 0.00 N \n+ATOM 73 CA THR A 6 3.987 -0.141 0.719 1.00 0.00 C \n+ATOM 74 C THR A 6 3.840 -0.485 -0.752 1.00 0.00 C \n+ATOM 75 O THR A 6 4.681 -1.168 -1.343 1.00 0.00 O \n+ATOM 76 CB THR A 6 3.272 -1.212 1.556 1.00 0.00 C \n+ATOM 77 OG1 THR A 6 1.889 -1.330 1.245 1.00 0.00 O \n+ATOM 78 CG2 THR A 6 3.369 -0.873 3.049 1.00 0.00 C \n+ATOM 79 H THR A 6 2.805 1.308 1.657 1.00 0.00 H \n+ATOM 80 HA THR A 6 5.038 -0.208 0.951 1.00 0.00 H \n+ATOM 81 HB THR A 6 3.767 -2.197 1.384 1.00 0.00 H \n+ATOM 82 HG1 THR A 6 1.657 -2.261 1.404 1.00 0.00 H \n+ATOM 83 HG21 THR A 6 4.424 -0.720 3.349 1.00 0.00 H \n+ATOM 84 HG22 THR A 6 2.947 -1.697 3.661 1.00 0.00 H \n+ATOM 85 HG23 THR A 6 2.798 0.049 3.292 1.00 0.00 H \n+ATOM 86 N GLY A 7 2.732 -0.041 -1.385 1.00 0.00 N \n+ATOM 87 CA GLY A 7 2.302 -0.493 -2.702 1.00 0.00 C \n+ATOM 88 C GLY A 7 1.750 -1.894 -2.643 1.00 0.00 C \n+ATOM 89 O GLY A 7 1.892 -2.675 -3.579 1.00 0.00 O \n+ATOM 90 H GLY A 7 2.078 0.531 -0.876 1.00 0.00 H \n+ATOM 91 HA2 GLY A 7 1.499 0.151 -3.025 1.00 0.00 H \n+ATOM 92 HA3 GLY A 7 3.147 -0.494 -3.376 1.00 0.00 H \n+ATOM 93 N THR A 8 1.141 -2.254 -1.498 1.00 0.00 N \n+ATOM 94 CA THR A 8 0.625 -3.588 -1.230 1.00 0.00 C \n+ATOM 95 C THR A 8 -0.757 -3.456 -0.639 1.00 0.00 C \n+ATOM 96 O THR A 8 -1.149 -2.430 -0.089 1.00 0.00 O \n+ATOM 97 CB THR A 8 1.470 -4.455 -0.255 1.00 0.00 C \n+ATOM 98 OG1 THR A 8 1.363 -4.125 1.136 1.00 0.00 O \n+ATOM 99 CG2 THR A 8 2.952 -4.400 -0.639 1.00 0.00 C \n+ATOM 100 H THR A 8 1.070 -1.594 -0.748 1.00 0.00 H \n+ATOM 101 HA THR A 8 0.526 -4.117 -2.167 1.00 0.00 H \n+ATOM 102 HB THR A 8 1.138 -5.515 -0.366 1.00 0.00 H \n+ATOM 103 HG1 THR A 8 0.495 -4.474 1.420 1.00 0.00 H \n+ATOM 104 HG21 THR A 8 3.089 -4.702 -1.697 1.00 0.00 H \n+ATOM 105 HG22 THR A 8 3.545 -5.084 0.004 1.00 0.00 H \n+ATOM 106 HG23 THR A 8 3.359 -3.377 -0.512 1.00 0.00 H \n+ATOM 107 N TRP A 9 -1.528 -4.559 -0.691 1.00 0.00 N \n+ATOM 108 CA TRP A 9 -2.595 -4.799 0.257 1.00 0.00 C \n+ATOM 109 C TRP A 9 -2.062 -4.963 1.681 1.00 0.00 C \n+ATOM 110 O TRP A 9 -0.974 -5.504 1.901 1.00 0.00 O \n+ATOM 111 CB TRP A 9 -3.447 -6.025 -0.153 1.00 0.00 C \n+ATOM 112 CG TRP A 9 -4.210 -5.810 -1.420 1.00 0.00 C \n+ATOM 113 CD1 TRP A 9 -3.956 -6.325 -2.664 1.00 0.00 C \n+ATOM 114 CD2 TRP A 9 -5.368 -4.971 -1.551 1.00 0.00 C \n+ATOM 115 NE1 TRP A 9 -4.890 -5.842 -3.556 1.00 0.00 N \n+ATOM 116 CE2 TRP A 9 -5.750 -5.007 -2.911 1.00 0.00 C \n+ATOM 117 CE3 TRP A 9 -6.122 -4.226 -0.644 1.00 0.00 C \n+ATOM 118 CZ2 TRP A 9 -6.823 -4.270 -3.384 1.00 0.00 C \n+ATOM 119 CZ3 TRP A 9 -7.203 -3.484 -1.123 1.00 0.00 C \n+ATOM 120 CH2 TRP A 9 -7.538 -3.490 -2.472 1.00 0.00 C \n+ATOM 121 H TRP A 9 -1.270 -5.342 -1.246 1.00 0.00 H \n+ATOM 122 HA TRP A 9 -3.229 -3.922 0.265 1.00 0.00 H \n+ATOM 123 HB2 TRP A 9 -2.787 -6.916 -0.255 1.00 0.00 H \n+ATOM 124 HB3 TRP A 9 -4.182 -6.247 0.649 1.00 0.00 H \n+ATOM 125 HD1 TRP A 9 -3.159 -7.020 -2.896 1.00 0.00 H \n+ATOM 126 HE1 TRP A 9 -5.114 -6.222 -4.435 1.00 0.00 H \n+ATOM 127 HE3 TRP A 9 -5.864 -4.205 0.404 1.00 0.00 H \n+ATOM 128 HZ2 TRP A 9 -7.091 -4.279 -4.430 1.00 0.00 H \n+ATOM 129 HZ3 TRP A 9 -7.772 -2.872 -0.432 1.00 0.00 H \n+ATOM 130 HH2 TRP A 9 -8.359 -2.874 -2.827 1.00 0.00 H \n+ATOM 131 N GLY A 10 -2.809 -4.465 2.675 1.00 0.00 N \n+ATOM 132 CA GLY A 10 -2.426 -4.476 4.071 1.00 0.00 C \n+ATOM 133 C GLY A 10 -3.648 -4.236 4.957 1.00 0.00 C \n+ATOM 134 O GLY A 10 -3.453 -3.944 6.166 1.00 0.00 O \n+ATOM 135 OXT GLY A 10 -4.818 -4.338 4.490 1.00 0.00 O \n+ATOM 136 H GLY A 10 -3.662 -3.971 2.483 1.00 0.00 H \n+ATOM 137 HA2 GLY A 10 -2.015 -5.440 4.333 1.00 0.00 H \n+ATOM 138 HA3 GLY A 10 -1.745 -3.651 4.231 1.00 0.00 H \n+TER 139 GLY A 10\n+HETATM 140 O HOH B 1 5.842 2.828 -7.968 1.00 0.00 O \n+HETATM 141 H1 HOH B 1 6.062 2.010 -8.412 1.00 0.00 H \n+HETATM 142 H2 HOH B 1 5.015 3.101 -8.365 1.00 0.00 H \n+HETATM 143 OM HOH B 1 5.777 2.770 -8.057 1.00 0.00 EP \n+HETATM 144 O HOH B 2 5.088 -9.709 9.042 1.00 0.00 O \n+HETATM 145 H1 HOH B 2 4.906 -10.365 8.369 1.00 0.00 H \n+HETATM 146 H2 HOH B 2 4.427 -9.032 8.903 1.00 0.00 H \n+HETATM 147 OM HOH B 2 4.998 -9.707 8.955 1.00 0.00 EP \n+HETATM 148 O HOH B 3 -5.915 6.231 10.326 1.00 0.00 O \n+HETATM 149 H1 HOH B 3 -6.797 5.862 10.356 1.00 0.00 H \n+HETATM 150 H2 HOH B 3 -5.356 5.497 10.072 1.00 0.00 H \n+HETATM 151 OM HOH B 3 -5.949 6.114 10.302 1.00 0.00 EP \n+HETATM 152 O HOH B 4 -10.746 -0.382 -3.096 1.00 0.00 O \n+HETATM 153 H1 HOH B 4 -10.769 0.558 -3.274 1.00 0.00 H \n+HETATM 154 H2 HOH B 4 -10.529 -0.780 -3.939 1.00 0.00 H \n+HETATM 155 OM HOH B 4 -10.725 -0.325 -3.205 1.00 0.00 EP \n+HETATM 156 O HOH B 5 4.958 6.074 -1.815 1.00 0.00 O \n+HETATM 157 H1 HOH B 5 4.310 5.383 -1.683 1.00 0.00 H \n+HETATM 158 H2 HOH B 5 4.931 6.253 -2.755 1.00 0.00 H \n+HETATM 159 OM HOH B 5 4.886 6.020 -1.901 1.00 0.00 EP \n+HETATM 160 O HOH B 6 7.952 -1.734 -4.429 1.00 0.00 O \n+HETATM 161 H1 HOH B 6 7.791 -1.027 -5.055 1.00 0.00 H \n+HETATM 162 H2 HOH B 6 8.050 -1.291 -3.587 1.00 0.00 H \n+HETATM 163 OM HOH B 6 7.946 -1.611 -4.406 1.00 0.00 EP \n+HETATM 164 O HOH B 7 6.849 8.946 -9.342 1.00 0.00 O \n+HETATM 165 H1 HOH B 7 6.647 9.802 -8.963 1.00 0.00 H \n+HETATM 166 H2 HOH B 7 7.798 8.859 -9.245 1.00 0.00 H \n+HETATM 167 OM HOH B 7 6.929 9.028 -9.291 1.00 0.00 EP \n+HETATM 168 O HOH B 8 -8.905 8.941 -7.411 1.00 0.00 O \n+HETATM 169 H1 HOH B 8 -8.008 9.226 -7.240 1.00 0.00 H \n+HETATM 170 H2 HOH B 8 -9.000 8.132 -6.907 1.00 0.00 H \n+HETATM 171 OM HOH B 8 -8.820 8.885 -7.339 1.00 0.00 EP \n+HETATM 172 O HOH B 9 0.740 2.395 -10.734 1.00 0.00 O \n+HETATM 173 H1 HOH B 9 1.037 2.203 -11.624 1.00 0.00 H \n+HETATM 174 H2 HOH B 9 1.456 2.896 -10.345 1.00 0.00 H \n+HETATM 175 OM HOH B 9 0.848 2.428 -10.788 1.00 0.00 EP \n+HETATM 176 O HOH B 10 4.606 8.811 1.851 1.00 0.00 O \n+HETATM 177 H1 HOH B 10 5.335 9.147 2.373 1.00 0.00 H \n+HETATM 178 H2 HOH B 10 4.978 8.674 0.980 1.00 0.00 H \n+HETATM 179 OM HOH B 10 4.723 8.832 1.813 1.00 0.00 EP \n+HETATM 180 O HOH B 11 0.355 10.462 -2.761 1.00 0.00 O \n+HETATM 181 H1 HOH B 11 0.493 11.337 -3.122 1.00 0.00 H \n+HETATM 182 H2 HOH B 11 0.321 9.889 -3.527 1.00 0.00 H \n+HETATM 183 OM HOH B 11 0.366 10.494 -2.881 1.00 0.00 EP \n+HETATM 184 O HOH B 12 -9.476 -5.983 -5.436 1.00 0.00 O \n+HETATM 185 H1 HOH B 12 -10.006 -6.201 -6.203 1.00 0.00 H \n+HETATM 186 H2 HOH B 12 -8.672 -5.610 -5.798 1.00 0.00 H \n+HETATM 187 OM HOH B 12 -9.446 -5.967 -5.556 1.00 0.00 EP \n+HETATM 188 O HOH B 13 -6.767 -11.861 4.899 1.00 0.00 O \n+HETATM 189 H1 HOH B 13 -6.466 -12.159 5.757 1.00 0.00 H \n+HETATM 190 H2 HOH B 13 -7.259 -12.602 4.547 1.00 0.00 H \n+HETATM 191 OM HOH B 13 -6.787 -11.972 4.953 1.00 0.00 EP \n+HETATM 192 O HOH B 14 -0.294 -7.964 5.056 1.00 0.00 O \n+HETATM 193 H1 HOH B 14 0.123 -7.143 5.315 1.00 0.00 H \n+HETATM 194 H2 HOH B 14 0.138 -8.632 5.588 1.00 0.00 H \n+HETATM 195 OM HOH B 14 -0.204 -7.948 5.140 1.00 0.00 EP \n+HETATM 196 O HOH B 15 1.029 -10.881 -3.463 1.00 0.00 O \n+HETATM 197 H1 HOH B 15 1.961 -10.664 -3.445 1.00 0.00 H \n+HETATM 198 H2 HOH B 15 0.747 -10.649 -4.348 1.00 0.00 H \n+HETATM 199 OM HOH B 15 1.098 -10.833 -3.556 1.00 0.00 EP \n+HETATM 200 O HOH B 16 -4.397 -5.767 -8.191 1.00 0.00 O \n+HETATM 201 H1 HOH B 16 -4.029 -4.890 -8.301 1.00 0.00 H \n+HETATM 202 H2 HOH B 16 -3.791 -6.209 -7.596 1.00 0.00 H \n+HETATM 203 OM HOH B 16 -4.293 -5.721 -8.139 1.00 0.00 EP \n+HETATM 204 O HOH B 17 -2.894 -10.357 1.134 1.00 0.00 O \n+HETATM 205 H1 HOH B 17 -2.685 -10.384 0.201 1.00 0.00 H \n+HETATM 206 H2 HOH B 17 -2.142 -9.922 1.536 1.00 0.00 H \n+HETATM 207 OM HOH B 17 -2.792 -10.314 1.078 1.00 0.00 EP \n+HETATM 208 O HOH B 18 7.269 -7.812 -8.603 1.00 0.00 O \n+HETATM 209 H1 HOH B 18 6.561 -8.036 -9.208 1.00 0.00 H \n+HETATM 210 H2 HOH B 18 7.366 -6.864 -8.688 1.00 0.00 H \n+HETATM 211 OM HOH B 18 7.204 -7.735 -8.677 1.00 0.00 EP \n+HETATM 212 O HOH B 19 6.880 9.356 3.406 1.00 0.00 O \n+HETATM 213 H1 HOH B 19 7.412 9.647 4.147 1.00 0.00 H \n+HETATM 214 H2 HOH B 19 7.515 9.018 2.774 1.00 0.00 H \n+HETATM 215 OM HOH B 19 7.005 9.351 3.418 1.00 0.00 EP \n+HETATM 216 O HOH B 20 -6.635 -7.362 0.247 1.00 0.00 O \n+HETATM 217 H1 HOH B 20 -6.755 -6.596 -0.314 1.00 0.00 H \n+HETATM 218 H2 HOH B 20 -6.041 -7.929 -0.246 1.00 0.00 H \n+HETATM 219 OM HOH B 20 -6.584 -7.341 0.134 1.00 0.00 EP \n+HETATM 220 O HOH B 21 1.148 -6.867 10.795 1.00 0.00 O \n+HETATM 221 H1 HOH B 21 1.766 -7.034 11.507 1.00 0.00 H \n+HETATM 222 H2 HOH B 21 1.637 -7.075 9.999 1.00 0.00 H \n+HETATM 223 OM HOH B 21 1.266 -6.907 10.786 1.00 0.00 EP \n+HETATM 224 O HOH B 22 2.295 6.992 -3.964 1.00 0.00 O \n+HETATM 225 H1 HOH B 22 2.068 6.080 -4.141 1.00 0.00 H \n+HETATM 226 H2 HOH B 22 1.598 7.499 -4.382 1.00 0.00 H \n+HETATM 227 OM HOH B 22 2.197 6.949 -4.028 1.00 0.00 EP \n+HETATM 228 O HOH B 23 -6.301 1.635 -4.318 1.00 0.00 O \n+HETATM 229 H1 HOH B 23 -6.054 0.710 -4.299 1.00 0.00 H \n+HETATM 230 H2 HOH B 23 -6.882 1.743 -3.565 1.00 0.00 H \n+HETATM 231 OM HOH B 23 -6.337 1.548 -4.236 1.00 0.00 EP \n+HETATM 232 O HOH B 24 -6.605 6.566 1.107 1.00 0.00 O \n+HETATM 233 H1 HOH B 24 -7.084 5.951 1.662 1.00 0.00 H \n+HETATM 234 H2 HOH B 24 -5.896 6.890 1.663 1.00 0.00 H \n+HETATM 235 OM HOH B 24 -6.580 6.535 1.225 1.00 0.00 EP \n+HETATM 236 O HOH B 25 2.071 5.474 -6.828 1.00 0.00 O \n+HETATM 237 H1 HOH B 25 2.412 4.995 -7.584 1.00 0.00 H \n+HETATM 238 H2 HOH B 25 2.395 4.989 -6.070 1.00 0.00 H \n+HETATM 239 OM HOH B 25 2.142 5.372 -6.828 1.00 0.00 EP \n+HETATM 240 O HOH B 26 -6.792 -11.426 -6.549 1.00 0.00 O \n+HETATM 241 H1 HOH B 26 -6.447 -12.319 -6.566 1.00 0.00 H \n+HETATM 242 H2 HOH B 26 -6.630 -11.123 -5.655 1.00 0.00 H \n+HETATM 243 OM HOH B 26 -6.738 -11.489 -6.455 1.00 0.00 EP \n+HETATM 244 O HOH B 27 -2.262 10.593 -5.446 1.00 0.00 O \n+HETATM 245 H1 HOH B 27 -2.258 9.989 -4.703 1.00 0.00 H \n+HETATM 246 H2 HOH B 27 -1.451 10.400 -5.917 1.00 0.00 H \n+HETATM 247 OM HOH B 27 -2.175 10.508 -5.417 1.00 0.00 EP \n+HETATM 248 O HOH B 28 -1.161 -7.945 -4.801 1.00 0.00 O \n+HETATM 249 H1 HOH B 28 -0.989 -8.127 -3.877 1.00 0.00 H \n+HETATM 250 H2 HOH B 28 -0.712 -8.648 -5.271 1.00 0.00 H \n+HETATM 251 OM HOH B 28 -1.094 -8.040 -4.753 1.00 0.00 EP \n+HETATM 252 O HOH B 29 -8.777 -7.922 -2.129 1.00 0.00 O \n+HETATM 253 H1 HOH B 29 -8.199 -8.369 -2.747 1.00 0.00 H \n+HETATM 254 H2 HOH B 29 -9.586 -7.774 -2.620 1.00 0.00 H \n+HETATM 255 OM HOH B 29 -8.802 -7.954 -2.247 1.00 0.00 EP \n+HETATM 256 O HOH B 30 -1.087 -8.172 -10.219 1.00 0.00 O \n+HETATM 257 H1 HOH B 30 -0.911 -7.242 -10.363 1.00 0.00 H \n+HETATM 258 H2 HOH B 30 -0.221 -8.580 -10.198 1.00 0.00 H \n+HETATM 259 OM HOH B 30 -0.976 -8.116 -10.232 1.00 0.00 EP \n+HETATM 260 O HOH B 31 -8.062 -0.643 5.749 1.00 0.00 O \n+HETATM 261 H1 HOH B 31 -8.333 -1.135 6.524 1.00 0.00 H \n+HETATM 262 H2 HOH B 31 -8.027 0.267 6.043 1.00 0.00 H \n+HETATM 263 OM HOH B 31 -8.087 -0.598 5.863 1.00 0.00 EP \n+HETATM 264 O HOH B 32 0.388 -2.076 -9.237 1.00 0.00 O \n+HETATM 265 H1 HOH B 32 0.555 -2.943 -8.869 1.00 0.00 H \n+HETATM 266 H2 HOH B 32 1.204 -1.596 -9.100 1.00 0.00 H \n+HETATM 267 OM HOH B 32 0.493 -2.117 -9.183 1.00 0.00 EP \n+HETATM 268 O HOH B 33 -3.142 0.100 -9.642 1.00 0.00 O \n+HETATM 269 H1 HOH B 33 -2.664 0.887 -9.906 1.00 0.00 H \n+HETATM 270 H2 HOH B 33 -2.587 -0.305 -8.976 1.00 0.00 H \n+HETATM 271 OM HOH B 33 -3.032 0.141 -9.599 1.00 0.00 EP \n+HETATM 272 O HOH B 34 2.655 8.097 -1.531 1.00 0.00 O \n+HETATM 273 H1 HOH B 34 2.491 7.722 -2.396 1.00 0.00 H \n+HETATM 274 H2 HOH B 34 3.261 7.484 -1.114 1.00 0.00 H \n+HETATM 275 OM HOH B 34 2.702 7.992 -1.579 1.00 0.00 EP \n+HETATM 276 O HOH B 35 8.431 -0.234 -2.179 1.00 0.00 O \n+HETATM 277 H1 HOH B 35 8.045 0.638 -2.099 1.00 0.00 H \n+HETATM 278 H2 HOH B 35 9.373 -0.087 -2.100 1.00 0.00 H \n+HETATM 279 OM HOH B 35 8.490 -0.125 -2.162 1.00 0.00 EP \n+HETATM 280 O HOH B 36 -2.184 0.248 6.923 1.00 0.00 O \n+HETATM 281 H1 HOH B 36 -1.532 0.073 6.244 1.00 0.00 H \n+HETATM 282 H2 HOH B 36 -1.716 0.110 7.746 1.00 0.00 H \n+HETATM 283 OM HOH B 36 -2.064 0.214 6.938 1.00 0.00 EP \n+HETATM 284 O HOH B 37 -3.561 -3.178 -8.702 1.00 0.00 O \n+HETATM 285 H1 HOH B 37 -3.115 -3.221 -9.547 1.00 0.00 H \n+HETATM 286 H2 HOH B 37 -3.047 -2.554 -8.190 1.00 0.00 H \n+HETATM 287 OM HOH B 37 -3.459 -3.116 -8.738 1.00 0.00 EP \n+HETATM 288 O HOH B 38 -6.788 2.635 11.374 1.00 0.00 O \n+HETATM 289 H1 HOH B 38 -7.290 3.274 11.880 1.00 0.00 H \n+HETATM 290 H2 HOH B 38 -5.883 2.761 11.659 1.00 0.00 H \n+HETATM 291 OM HOH B 38 -6.745 2.717 11.458 1.00 0.00 EP \n+HETATM 292 O HOH B 39 -9.076 2.546 1.780 1.00 0.00 O \n+HETATM 293 H1 HOH B 39 -8.535 3.264 2.110 1.00 0.00 H \n+HETATM 294 H2 HOH B 39 -9.877 2.589 2.303 1.00 0.00 H \n+HETATM 295 OM HOH B 39 -9.104 2.627 1.871 1.00 0.00 EP \n+HETATM 296 O HOH B 40 -2.743 -10.274 -1.614 1.00 0.00 O \n+HETATM 297 H1 HOH B 40 -1.972 -9.769 -1.873 1.00 0.00 H \n+HETATM 298 H2 HOH B 40 -2.837 -10.937 -2.298 1.00 0.00 H \n+HETATM 299 OM HOH B 40 -2.671 -10.291 -1.715 1.00 0.00 EP \n+HETATM 300 O HOH B 41 -6.379 -6.445 8.337 1.00 0.00 O \n+HETATM 301 H1 HOH B 41 -5.875 -6.477 9.150 1.00 0.00 H \n+HETATM 302 H2 HOH B 41 -6.177 -5.588 7.963 1.00 0.00 H \n+HETATM 303 OM HOH B 41 -6.303 -6.357 8.384 1.00 0.00 EP \n+HETATM 304 O HOH B 42 3.959 -3.229 9.388 1.00 0.00 O \n+HETATM 305 H1 HOH B 42 3.106 -3.383 8.982 1.00 0.00 H \n+HETATM 306 H2 HOH B 42 4.256 -4.098 9.658 1.00 0.00 H \n+HETATM 307 OM HOH B 42 3.900 -3.338 9.373 1.00 0.00 EP \n+HETATM 308 O HOH B 43 4.762 -8.266 5.877 1.00 0.00 O \n+HETATM 309 H1 HOH B 43 5.185 -7.411 5.963 1.00 0.00 H \n+HETATM 310 H2 HOH B 43 4.124 -8.290 6.590 1.00 0.00 H \n+HETATM 311 OM HOH B 43 4.739 -8.177 5.962 1.00 0.00 EP \n+HETATM 312 O HOH B 44 8.799 -3.434 5.907 1.00 0.00 O \n+HETATM 313 H1 HOH B 44 7.861 -3.334 6.072 1.00 0.00 H \n+HETATM 314 H2 HOH B 44 9.219 -3.094 6.696 1.00 0.00 H \n+HETATM 315 OM HOH B 44 8.744 -3.387 6.009 1.00 0.00 EP \n+HETATM 316 O HOH B 45 -5.582 3.282 -9.567 1.00 0.00 O \n+HETATM 317 H1 HOH B 45 -5.554 2.392 -9.216 1.00 0.00 H \n+HETATM 318 H2 HOH B 45 -4.989 3.262 -10.318 1.00 0.00 H \n+HETATM 319 OM HOH B 45 -5.516 3.185 -9.609 1.00 0.00 EP \n+HETATM 320 O HOH B 46 -3.203 -7.706 -6.558 1.00 0.00 O \n+HETATM 321 H1 HOH B 46 -2.517 -7.754 -5.893 1.00 0.00 H \n+HETATM 322 H2 HOH B 46 -3.001 -8.420 -7.163 1.00 0.00 H \n+HETATM 323 OM HOH B 46 -3.108 -7.787 -6.552 1.00 0.00 EP \n+HETATM 324 O HOH B 47 -0.385 -4.885 9.323 1.00 0.00 O \n+HETATM 325 H1 HOH B 47 0.319 -4.488 8.811 1.00 0.00 H \n+HETATM 326 H2 HOH B 47 0.049 -5.560 9.845 1.00 0.00 H \n+HETATM 327 OM HOH B 47 -0.264 -4.915 9.324 1.00 0.00 EP \n+HETATM 328 O HOH B 48 7.858 5.117 -4.825 1.00 0.00 O \n+HETATM 329 H1 HOH B 48 8.665 5.076 -5.338 1.00 0.00 H \n+HETATM 330 H2 HOH B 48 7.167 5.245 -5.475 1.00 0.00 H \n+HETATM 331 OM HOH B 48 7.870 5.126 -4.949 1.00 0.00 EP \n+HETATM 332 O HOH B 49 -7.936 0.643 0.049 1.00 0.00 O \n+HETATM 333 H1 HOH B 49 -8.308 1.259 0.680 1.00 0.00 H \n+HETATM 334 H2 HOH B 49 -7.893 1.135 -0.771 1.00 0.00 H \n+HETATM 335 OM HOH B 49 -7.971 0.761 0.029 1.00 0.00 EP \n+HETATM 336 O HOH B 50 -8.000 -10.722 -1.075 1.00 0.00 O \n+HETATM 337 H1 HOH B 50 -7.441 -10.478 -1.813 1.00 0.00 H \n+HETATM 338 H2 HOH B 50 -8.664 -11.296 -1.455 1.00 0.00 H \n+HETATM 339 OM HOH B 50 -8.011 -10.757 -1.194 1.00 0.00 EP \n+HETATM 340 O HOH B 51 -10.035 3.235 -0.688 1.00 0.00 O \n+HETATM 341 H1 HOH B 51 -9.800 3.059 0.223 1.00 0.00 H \n+HETATM 342 H2 HOH B 51 -10.164 4.183 -0.724 1.00 0.00 H \n+HETATM 343 OM HOH B 51 -10.024 3.317 -0.595 1.00 0.00 EP \n+HETATM 344 O HOH B 52 -4.014 2.796 -6.947 1.00 0.00 O \n+HETATM 345 H1 HOH B 52 -3.836 3.002 -6.029 1.00 0.00 H \n+HETATM 346 H2 HOH B 52 -3.376 3.315 -7.436 1.00 0.00 H \n+HETATM 347 OM HOH B 52 -3.927 2.873 -6.901 1.00 0.00 EP \n+HETATM 348 O HOH B 53 -3.507 4.329 5.241 1.00 0.00 O \n+HETATM 349 H1 HOH B 53 -3.695 3.498 5.678 1.00 0.00 H \n+HETATM 350 H2 HOH B 53 -2.610 4.233 4.920 1.00 0.00 H \n+HETATM 351 OM HOH B 53 -3.431 4.230 5.254 1.00 0.00 EP \n+HETATM 352 O HOH B 54 -4.117 -8.247 2.321 1.00 0.00 O \n+HETATM 353 H1 HOH B 54 -3.854 -9.015 1.814 1.00 0.00 H \n+HETATM 354 H2 HOH B 54 -3.312 -7.956 2.751 1.00 0.00 H \n+HETATM 355 OM HOH B 54 -4.003 -8.298 2.313 1.00 0.00 EP \n+HETATM 356 O HOH B 55 -0.444 10.199 -7.525 1.00 0.00 O \n+HETATM 357 H1 HOH B 55 -0.484 9.654 -8.311 1.00 0.00 H \n+HETATM 358 H2 HOH B 55 -0.309 11.088 -7.855 1.00 0.00 H \n+HETATM 359 OM HOH B 55 -0.434 10.236 -7.644 1.00 0.00 EP \n+HETATM 360 O HOH B 56 -8.208 9.523 7.310 1.00 0.00 O \n+HETATM 361 H1 HOH B 56 -7.527 9.341 6.662 1.00 0.00 H \n+HETATM 362 H2 HOH B 56 -8.837 8.810 7.204 1.00 0.00 H \n+HETATM 363 OM HOH B 56 -8.202 9.428 7.230 1.00 0.00 EP \n+HETATM 364 O HOH B 57 5.601 -2.910 -5.823 1.00 0.00 O \n+HETATM 365 H1 HOH B 57 5.950 -2.557 -5.005 1.00 0.00 H \n+HETATM 366 H2 HOH B 57 6.060 -3.742 -5.940 1.00 0.00 H \n+HETATM 367 OM HOH B 57 5.687 -2.961 -5.748 1.00 0.00 EP \n+HETATM 368 O HOH B 58 -6.750 3.143 -6.587 1.00 0.00 O \n+HETATM 369 H1 HOH B 58 -5.841 3.124 -6.887 1.00 0.00 H \n+HETATM 370 H2 HOH B 58 -6.776 2.522 -5.860 1.00 0.00 H \n+HETATM 371 OM HOH B 58 -6.656 3.074 -6.542 1.00 0.00 EP \n+HETATM 372 O HOH B 59 2.779 -0.506 -8.772 1.00 0.00 O \n+HETATM 373 H1 HOH B 59 3.455 -0.537 -8.095 1.00 0.00 H \n+HETATM 374 H2 HOH B 59 2.191 0.194 -8.491 1.00 0.00 H \n+HETATM 375 OM HOH B 59 2.789 -0.435 -8.670 1.00 0.00 EP \n+HETATM 376 O HOH B 60 -2.763 7.112 10.361 1.00 0.00 O \n+HETATM 377 H1 HOH B 60 -2.954 6.175 10.308 1.00 0.00 H \n+HETATM 378 H2 HOH B 60 -1.839 7.182 10.124 1.00 0.00 H \n+HETATM 379 OM HOH B 60 -2.685 7.019 10.330 1.00 0.00 EP \n+HETATM 380 O HOH B 61 -2.964 7.059 -8.586 1.00 0.00 O \n+HETATM 381 H1 HOH B 61 -3.823 6.640 -8.634 1.00 0.00 H \n+HETATM 382 H2 HOH B 61 -3.120 7.874 -8.110 1.00 0.00 H \n+HETATM 383 OM HOH B 61 -3.072 7.101 -8.541 1.00 0.00 EP \n+HETATM 384 O HOH B 62 0.293 -9.949 -5.906 1.00 0.00 O \n+HETATM 385 H1 HOH B 62 0.865 -9.278 -6.279 1.00 0.00 H \n+HETATM 386 H2 HOH B 62 0.045 -10.495 -6.651 1.00 0.00 H \n+HETATM 387 OM HOH B 62 0.328 -9.936 -6.025 1.00 0.00 EP \n+HETATM 388 O HOH B 63 -4.355 3.709 -1.641 1.00 0.00 O \n+HETATM 389 H1 HOH B 63 -4.748 4.536 -1.361 1.00 0.00 H \n+HETATM 390 H2 HOH B 63 -4.353 3.165 -0.854 1.00 0.00 H \n+HETATM 391 OM HOH B 63 -4.397 3.739 -1.527 1.00 0.00 EP \n+HETATM 392 O HOH B 64 -1.701 -3.253 -10.866 1.00 0.00 O \n+HETATM 393 H1 HOH B 64 -1.815 -2.966 -11.772 1.00 0.00 H \n+HETATM 394 H2 HOH B 64 -1.053 -2.649 -10.502 1.00 0.00 H \n+HETATM 395 OM HOH B 64 -1.644 -3.158 -10.923 1.00 0.00 EP \n+HETATM 396 O HOH B 65 1.559 7.934 7.256 1.00 0.00 O \n+HETATM 397 H1 HOH B 65 0.952 7.612 7.923 1.00 0.00 H \n+HETATM 398 H2 HOH B 65 1.266 7.521 6.445 1.00 0.00 H \n+HETATM 399 OM HOH B 65 1.463 7.856 7.241 1.00 0.00 EP \n+HETATM 400 O HOH B 66 2.416 -5.794 -4.425 1.00 0.00 O \n+HETATM 401 H1 HOH B 66 2.894 -6.047 -5.214 1.00 0.00 H \n+HETATM 402 H2 HOH B 66 2.788 -6.340 -3.733 1.00 0.00 H \n+HETATM 403 OM HOH B 66 2.507 -5.879 -4.435 1.00 0.00 EP \n+HETATM 404 O HOH B 67 -9.332 -11.496 -3.593 1.00 0.00 O \n+HETATM 405 H1 HOH B 67 -9.092 -12.418 -3.691 1.00 0.00 H \n+HETATM 406 H2 HOH B 67 -8.513 -11.019 -3.725 1.00 0.00 H \n+HETATM 407 OM HOH B 67 -9.219 -11.544 -3.617 1.00 0.00 EP \n+HETATM 408 O HOH B 68 -8.301 2.194 -2.416 1.00 0.00 O \n+HETATM 409 H1 HOH B 68 -8.807 2.064 -3.218 1.00 0.00 H \n+HETATM 410 H2 HOH B 68 -8.937 2.531 -1.784 1.00 0.00 H \n+HETATM 411 OM HOH B 68 -8.423 2.216 -2.434 1.00 0.00 EP \n+HETATM 412 O HOH B 69 -5.674 0.114 8.146 1.00 0.00 O \n+HETATM 413 H1 HOH B 69 -5.335 0.911 7.738 1.00 0.00 H \n+HETATM 414 H2 HOH B 69 -5.327 -0.598 7.608 1.00 0.00 H \n+HETATM 415 OM HOH B 69 -5.601 0.123 8.045 1.00 0.00 EP \n+HETATM 416 O HOH B 70 -7.483 -9.591 1.996 1.00 0.00 O \n+HETATM 417 H1 HOH B 70 -7.709 -9.733 2.915 1.00 0.00 H \n+HETATM 418 H2 HOH B 70 -6.869 -10.295 1.788 1.00 0.00 H \n+HETATM 419 OM HOH B 70 -7.442 -9.681 2.072 1.00 0.00 EP \n+HETATM 420 O HOH B 71 7.350 -10.318 2.645 1.00 0.00 O \n+HETATM 421 H1 HOH B 71 7.989 -10.763 3.202 1.00 0.00 H \n+HETATM 422 H2 HOH B 71 7.400 -9.399 2.908 1.00 0.00 H \n+HETATM 423 OM HOH B 71 7.423 -10.268 2.733 1.00 0.00 EP \n+HETATM 424 O HOH B 72 -0.499 4.768 -6.157 1.00 0.00 O \n+HETATM 425 H1 HOH B 72 -0.915 5.511 -5.720 1.00 0.00 H \n+HETATM 426 H2 HOH B 72 0.344 5.107 -6.458 1.00 0.00 H \n+HETATM 427 OM HOH B 72 -0.453 4.883 -6.142 1.00 0.00 EP \n+HETATM 428 O HOH B 73 -7.761 4.442 -10.588 1.00 0.00 O \n+HETATM 429 H1 HOH B 73 -6.987 3.991 -10.251 1.00 0.00 H \n+HETATM 430 H2 HOH B 73 -7.546 5.372 -10.520 1.00 0.00 H \n+HETATM 431 OM HOH B 73 -7.655 4.493 -10.545 1.00 0.00 EP \n+HETATM 432 O HOH B 74 -5.248 -9.221 -1.206 1.00 0.00 O \n+HETATM 433 H1 HOH B 74 -4.342 -9.506 -1.319 1.00 0.00 H \n+HETATM 434 H2 HOH B 74 -5.635 -9.298 -2.078 1.00 0.00 H \n+HETATM 435 OM HOH B 74 -5.193 -9.259 -1.311 1.00 0.00 EP \n+HETATM 436 O HOH B 75 0.260 3.100 6.348 1.00 0.00 O \n+HETATM 437 H1 HOH B 75 0.770 2.671 7.035 1.00 0.00 H \n+HETATM 438 H2 HOH B 75 0.454 2.599 5.556 1.00 0.00 H \n+HETATM 439 OM HOH B 75 0.335 3.001 6.337 1.00 0.00 EP \n+HETATM 440 O HOH B 76 2.859 -7.403 -11.010 1.00 0.00 O \n+HETATM 441 H1 HOH B 76 2.954 -6.687 -10.382 1.00 0.00 H \n+HETATM 442 H2 HOH B 76 3.699 -7.861 -10.981 1.00 0.00 H \n+HETATM 443 OM HOH B 76 2.959 -7.376 -10.940 1.00 0.00 EP \n+HETATM 444 O HOH B 77 -7.575 -0.650 -7.584 1.00 0.00 O \n+HETATM 445 H1 HOH B 77 -8.216 -0.384 -8.243 1.00 0.00 H \n+HETATM 446 H2 HOH B 77 -6.806 -0.110 -7.766 1.00 0.00 H \n+HETATM 447 OM HOH B 77 -7.561 -0.564 -7.674 1.00 0.00 EP \n+HETATM 448 O HOH B 78 6.828 0.088 3.942 1.00 0.00 O \n+HETATM 449 H1 HOH B 78 6.541 0.882 3.492 1.00 0.00 H \n+HETATM 450 H2 HOH B 78 6.697 0.277 4.871 1.00 0.00 H \n+HETATM 451 OM HOH B 78 6.784 0.193 3.993 1.00 0.00 EP \n+HETATM 452 O HOH B 79 -1.705 -1.265 -7.703 1.00 0.00 O \n+HETATM 453 H1 HOH B 79 -1.363 -1.013 -6.845 1.00 0.00 H \n+HETATM 454 H2 HOH B 79 -0.931 -1.514 -8.207 1.00 0.00 H \n+HETATM 455 OM HOH B 79 -1.586 -1.265 -7.665 1.00 0.00 EP \n+HETATM 456 O HOH B 80 3.490 7.055 3.642 1.00 0.00 O \n+HETATM 457 H1 HOH B 80 3.913 6.213 3.474 1.00 0.00 H \n+HETATM 458 H2 HOH B 80 3.808 7.628 2.944 1.00 0.00 H \n+HETATM 459 OM HOH B 80 3.569 7.027 3.550 1.00 0.00 EP \n+HETATM 460 O HOH B 81 -5.765 -7.522 -5.794 1.00 0.00 O \n+HETATM 461 H1 HOH B 81 -5.963 -8.174 -5.122 1.00 0.00 H \n+HETATM 462 H2 HOH B 81 -4.842 -7.664 -6.002 1.00 0.00 H \n+HETATM 463 OM HOH B 81 -5.688 -7.607 -5.745 1.00 0.00 EP \n+HETATM 464 O HOH B 82 8.483 3.611 -8.077 1.00 0.00 O \n+HETATM 465 H1 HOH B 82 8.460 4.326 -8.713 1.00 0.00 H \n+HETATM 466 H2 HOH B 82 7.565 3.365 -7.960 1.00 0.00 H \n+HETATM 467 OM HOH B 82 8.382 3.661 -8.132 1.00 0.00 EP \n+HETATM 468 O HOH B 83 5.046 -0.548 -7.115 1.00 0.00 O \n+HETATM 469 H1 HOH B 83 5.662 -0.024 -6.603 1.00 0.00 H \n+HETATM 470 H2 HOH B 83 5.172 -1.443 -6.800 1.00 0.00 H \n+HETATM 471 OM HOH B 83 5.125 -0.588 -7.027 1.00 0.00 EP \n+HETATM 472 O HOH B 84 -5.657 6.115 -1.377 1.00 0.00 O \n+HETATM 473 H1 HOH B 84 -5.959 6.258 -0.480 1.00 0.00 H \n+HETATM 474 H2 HOH B 84 -6.401 5.708 -1.819 1.00 0.00 H \n+HETATM 475 OM HOH B 84 -5.768 6.087 -1.328 1.00 0.00 EP \n+HETATM 476 O HOH B 85 -5.421 10.207 2.308 1.00 0.00 O \n+HETATM 477 H1 HOH B 85 -4.989 10.469 3.120 1.00 0.00 H \n+HETATM 478 H2 HOH B 85 -5.463 11.010 1.788 1.00 0.00 H \n+HETATM 479 OM HOH B 85 -5.379 10.321 2.339 1.00 0.00 EP \n+HETATM 480 O HOH B 86 -5.359 0.830 -8.311 1.00 0.00 O \n+HETATM 481 H1 HOH B 86 -4.852 1.364 -7.698 1.00 0.00 H \n+HETATM 482 H2 HOH B 86 -4.701 0.419 -8.871 1.00 0.00 H \n+HETATM 483 OM HOH B 86 -5.234 0.843 -8.305 1.00 0.00 EP \n+HETATM 484 O HOH B 87 4.214 -5.710 -6.410 1.00 0.00 O \n+HETATM 485 H1 HOH B 87 5.164 -5.805 -6.343 1.00 0.00 H \n+HETATM 486 H2 HOH B 87 4.031 -5.789 -7.346 1.00 0.00 H \n+HETATM 487 OM HOH B 87 4.296 -5.728 -6.503 1.00 0.00 EP \n+HETATM 488 O HOH B 88 4.673 -1.062 7.679 1.00 0.00 O \n+HETATM 489 H1 HOH B 88 4.260 -1.605 8.351 1.00 0.00 H \n+HETATM 490 H2 HOH B 88 4.616 -0.171 8.023 1.00 0.00 H \n+HETATM 491 OM HOH B 88 4.622 -1.025 7.788 1.00 0.00 EP \n+HETATM 492 O HOH B 89 2.914 -5.498 6.157 1.00 0.00 O \n+HETATM 493 H1 HOH B 89 3.869 -5.436 6.169 1.00 0.00 H \n+HETATM 494 H2 HOH B 89 2.710 -6.176 6.801 1.00 0.00 H \n+HETATM 495 OM HOH B 89 2.994 -5.564 6.227 1.00 0.00 EP \n+HETATM 496 O HOH B 90 -6.454 -3.115 -8.272 1.00 0.00 O \n+HETATM 497 H1 HOH B 90 -5.526 -2.991 -8.471 1.00 0.00 H \n+HETATM 498 H2 HOH B 90 -6.755 -2.253 -7.987 1.00 0.00 H \n+HETATM 499 OM HOH B 90 -6.387 -3.010 -8.263 1.00 0.00 EP \n+HETATM 500 O HOH B 91 -5.658 -4.026 7.475 1.00 0.00 O \n+HETATM 501 H1 HOH B 91 -5.286 -3.721 8.303 1.00 0.00 H \n+HETATM 502 H2 HOH B 91 -4.915 -4.045 6.871 1.00 0.00 H \n+HETATM 503 OM HOH B 91 -5.539 -3.995 7.499 1.00 0.00 EP \n+HETATM 504 O HOH B 92 -7.256 -5.349 -6.898 1.00 0.00 O \n+HETATM 505 H1 HOH B 92 -6.860 -4.578 -7.304 1.00 0.00 H \n+HETATM 506 H2 HOH B 92 -6.513 -5.898 -6.649 1.00 0.00 H \n+HETATM 507 OM HOH B 92 -7.135 -5.325 -6.915 1.00 0.00 EP \n+HETATM 508 O HOH B 93 7.216 7.176 10.196 1.00 0.00 O \n+HETATM 509 H1 HOH B 93 6.541 7.854 10.177 1.00 0.00 H \n+HETATM 510 H2 HOH B 93 7.101 6.699 9.374 1.00 0.00 H \n+HETATM 511 OM HOH B 93 7.132 7.197 10.106 1.00 0.00 EP \n+HETATM 512 O HOH B 94 6.667 0.729 6.583 1.00 0.00 O \n+HETATM 513 H1 HOH B 94 6.369 -0.127 6.891 1.00 0.00 H \n+HETATM 514 H2 HOH B 94 6.105 1.356 7.037 1.00 0.00 H \n+HETATM 515 OM HOH B 94 6.575 0.704 6.664 1.00 0.00 EP \n+HETATM 516 O HOH B 95 4.738 1.583 8.458 1.00 0.00 O \n+HETATM 517 H1 HOH B 95 5.114 2.233 9.051 1.00 0.00 H \n+HETATM 518 H2 HOH B 95 3.792 1.676 8.568 1.00 0.00 H \n+HETATM 519 OM HOH B 95 4.677 1.662 8.533 1.00 0.00 EP \n+HETATM 520 O HOH B 96 1.828 -8.086 -7.048 1.00 0.00 O \n+HETATM 521 H1 HOH B 96 2.669 -8.449 -6.769 1.00 0.00 H \n+HETATM 522 H2 HOH B 96 1.750 -8.343 -7.967 1.00 0.00 H \n+HETATM 523 OM HOH B 96 1.910 -8.152 -7.117 1.00 0.00 EP \n+HETATM 524 O HOH B 97 -0.700 -0.202 9.271 1.00 0.00 O \n+HETATM 525 H1 HOH B 97 0.088 0.338 9.208 1.00 0.00 H \n+HETATM 526 H2 HOH B 97 -1.336 0.353 9.722 1.00 0.00 H \n+HETATM 527 OM HOH B 97 -0.684 -0.085 9.312 1.00 0.00 EP \n+HETATM 528 O HOH B 98 5.716 -5.732 6.352 1.00 0.00 O \n+HETATM 529 H1 HOH B 98 6.242 -6.021 7.098 1.00 0.00 H \n+HETATM 530 H2 HOH B 98 5.857 -4.786 6.312 1.00 0.00 H \n+HETATM 531 OM HOH B 98 5.788 -5.662 6.428 1.00 0.00 EP \n+HETATM 532 O HOH B 99 -0.681 4.784 4.367 1.00 0.00 O \n+HETATM 533 H1 HOH B 99 -0.319 4.274 3.642 1.00 0.00 H \n+HETATM 534 H2 HOH B 99 -0.401 4.315 5.153 1.00 0.00 H \n+HETATM 535 OM HOH B 99 -0.612 4.679 4.374 1.00 0.00 EP \n+HETATM 536 O HOH B 100 6.905 -2.501 3.032 1.00 0.00 O \n+HETATM 537 H1 HOH B 100 6.769 -1.592 3.300 1.00 0.00 H \n+HETATM 538 H2 HOH B 100 6.662 -2.517 2.106 1.00 0.00 H \n+HETATM 539 OM HOH B 100 6.865 -2.406 2.962 1.00 0.00 EP \n+HETATM 540 O HOH B 101 -6.389 9.714 -9.784 1.00 0.00 O \n+HETATM 541 H1 HOH B 101 -6.228 9.821 -8.847 1.00 0.00 H \n+HETATM 542 H2 HOH B 101 -7.247 10.113 -9.928 1.00 0.00 H \n+HETATM 543 OM HOH B 101 -6.463 9.768 -9.700 1.00 0.00 EP \n+HETATM 544 O HOH B 102 -10.363 5.658 -9.964 1.00 0.00 O \n+HETATM 545 H1 HOH B 102 -10.251 6.514 -10.376 1.00 0.00 H \n+HETATM 546 H2 HOH B 102 -9.713 5.099 -10.390 1.00 0.00 H \n+HETATM 547 OM HOH B 102 -10.282 5.689 -10.053 1.00 0.00 EP \n+HETATM 548 O HOH B 103 -5.259 -6.005 10.810 1.00 0.00 O \n+HETATM 549 H1 HOH B 103 -5.162 -6.929 11.040 1.00 0.00 H \n+HETATM 550 H2 HOH B 103 -6.027 -5.715 11.303 1.00 0.00 H \n+HETATM 551 OM HOH B 103 -5.331 -6.073 10.887 1.00 0.00 EP \n+HETATM 552 O HOH B 104 -9.525 0.403 -9.219 1.00 0.00 O \n+HETATM 553 H1 HOH B 104 -10.412 0.380 -8.859 1.00 0.00 H \n+HETATM 554 H2 HOH B 104 -9.226 1.299 -9.063 1.00 0.00 H \n+HETATM 555 OM HOH B 104 -9.588 0.496 -9.164 1.00 0.00 EP \n+HETATM 556 O HOH B 105 7.070 -7.778 3.588 1.00 0.00 O \n+HETATM 557 H1 HOH B 105 7.495 -6.958 3.336 1.00 0.00 H \n+HETATM 558 H2 HOH B 105 6.144 -7.639 3.389 1.00 0.00 H \n+HETATM 559 OM HOH B 105 7.017 -7.676 3.540 1.00 0.00 EP \n+HETATM 560 O HOH B 106 -1.827 -2.728 10.383 1.00 0.00 O \n+HETATM 561 H1 HOH B 106 -1.304 -3.434 10.005 1.00 0.00 H \n+HETATM 562 H2 HOH B 106 -1.435 -1.926 10.035 1.00 0.00 H \n+HETATM 563 OM HOH B 106 -1.729 -2.718 10.306 1.00 0.00 EP \n+HETATM 564 O HOH B 107 -9.859 -4.745 1.515 1.00 0.00 O \n+HETATM 565 H1 HOH B 107 -9.937 -3.878 1.912 1.00 0.00 H \n+HETATM 566 H2 HOH B 107 -10.053 -4.604 0.589 1.00 0.00 H \n+HETATM 567 OM HOH B 107 -9.888 -4.638 1.459 1.00 0.00 EP \n+HETATM 568 O HOH B 108 -2.538 -9.572 -8.436 1.00 0.00 O \n+HETATM 569 H1 HOH B 108 -3.212 -9.852 -9.056 1.00 0.00 H \n+HETATM 570 H2 HOH B 108 -1.992 -8.963 -8.933 1.00 0.00 H \n+HETATM 571 OM HOH B 108 -2.552 -9.537 -8.555 1.00 0.00 EP \n+HETATM 572 O HOH B 109 -0.638 -8.967 10.027 1.00 0.00 O \n+HETATM 573 H1 HOH B 109 -0.097 -8.257 10.373 1.00 0.00 H \n+HETATM 574 H2 HOH B 109 -0.013 -9.652 9.790 1.00 0.00 H \n+HETATM 575 OM HOH B 109 -0.514 -8.965 10.039 1.00 0.00 EP \n+HETATM 576 O HOH B 110 -7.631 -9.333 9.957 1.00 0.00 O \n+HETATM 577 H1 HOH B 110 -6.720 -9.191 10.213 1.00 0.00 H \n+HETATM 578 H2 HOH B 110 -8.078 -8.521 10.200 1.00 0.00 H \n+HETATM 579 OM HOH B 110 -7.582 -9.231 10.010 1.00 0.00 EP \n+HETATM 580 O HOH B 111 -4.342 3.574 -4.349 1.00 0.00 O \n+HETATM 581 H1 HOH B 111 -5.026 2.904 -4.354 1.00 0.00 H \n+HETATM 582 H2 HOH B 111 -4.164 3.728 -3.422 1.00 0.00 H \n+HETATM 583 OM HOH B 111 -4.396 3.519 -4.251 1.00 0.00 EP \n+HETATM 584 O HOH B 112 -0.215 -0.432 5.215 1.00 0.00 O \n+HETATM 585 H1 HOH B 112 0.443 -0.695 5.858 1.00 0.00 H \n+HETATM 586 H2 HOH B 112 0.161 0.339 4.789 1.00 0.00 H \n+HETATM 587 OM HOH B 112 -0.105 -0.378 5.239 1.00 0.00 EP \n+HETATM 588 O HOH B 113 -4.528 -3.457 9.908 1.00 0.00 O \n+HETATM 589 H1 HOH B 113 -4.543 -4.334 10.291 1.00 0.00 H \n+HETATM 590 H2 HOH B 113 -3.636 -3.144 10.060 1.00 0.00 H \n+HETATM 591 OM HOH B 113 -4.434 -3.517 9.965 1.00 0.00 EP \n+HETATM 592 O HOH B 114 1.195 1.563 -8.040 1.00 0.00 O \n+HETATM 593 H1 HOH B 114 1.862 2.224 -8.223 1.00 0.00 H \n+HETATM 594 H2 HOH B 114 0.625 1.577 -8.809 1.00 0.00 H \n+HETATM 595 OM HOH B 114 1.205 1.635 -8.141 1.00 0.00 EP \n+HETATM 596 O HOH B 115 -4.247 -1.387 6.151 1.00 0.00 O \n+HETATM 597 H1 HOH B 115 -3.501 -0.831 6.378 1.00 0.00 H \n+HETATM 598 H2 HOH B 115 -3.900 -2.278 6.180 1.00 0.00 H \n+HETATM 599 OM HOH B 115 -4.130 -1.422 6.178 1.00 0.00 EP \n+HETATM 600 O HOH B 116 -4.186 3.248 12.130 1.00 0.00 O \n+HETATM 601 H1 HOH B 116 -3.975 3.589 11.261 1.00 0.00 H \n+HETATM 602 H2 HOH B 116 -3.366 2.868 12.444 1.00 0.00 H \n+HETATM 603 OM HOH B 116 -4.076 3.244 12.071 1.00 0.00 EP \n+HETATM 604 O HOH B 117 6.823 -2.425 -9.115 1.00 0.00 O \n+HETATM 605 H1 HOH B 117 7.375 -2.511 -8.338 1.00 0.00 H \n+HETATM 606 H2 HOH B 117 6.907 -1.506 -9.369 1.00 0.00 H \n+HETATM 607 OM HOH B 117 6.891 -2.336 -9.059 1.00 0.00 EP \n+HETATM 608 O HOH B 118 -7.167 5.431 -5.189 1.00 0.00 O \n+HETATM 609 H1 HOH B 118 -6.359 5.937 -5.279 1.00 0.00 H \n+HETATM 610 H2 HOH B 118 -7.023 4.652 -5.726 1.00 0.00 H \n+HETATM 611 OM HOH B 118 -7.066 5.402 -5.256 1.00 0.00 EP \n+HETATM 612 O HOH B 119 -5.379 -6.863 4.745 1.00 0.00 O \n+HETATM 613 H1 HOH B 119 -5.242 -5.920 4.663 1.00 0.00 H \n+HETATM 614 H2 HOH B 119 -4.520 -7.211 4.986 1.00 0.00 H \n+HETATM 615 OM HOH B 119 -5.273 -6.800 4.762 1.00 0.00 EP \n+HETATM 616 O HOH B 120 2.303 4.220 -4.374 1.00 0.00 O \n+HETATM 617 H1 HOH B 120 1.818 3.438 -4.637 1.00 0.00 H \n+HETATM 618 H2 HOH B 120 2.639 4.012 -3.502 1.00 0.00 H \n+HETATM 619 OM HOH B 120 2.287 4.114 -4.309 1.00 0.00 EP \n+HETATM 620 O HOH B 121 3.520 -9.989 1.501 1.00 0.00 O \n+HETATM 621 H1 HOH B 121 4.355 -10.191 1.079 1.00 0.00 H \n+HETATM 622 H2 HOH B 121 3.745 -9.365 2.191 1.00 0.00 H \n+HETATM 623 OM HOH B 121 3.633 -9.944 1.529 1.00 0.00 EP \n+HETATM 624 O HOH B 122 -7.280 0.123 10.411 1.00 0.00 O \n+HETATM 625 H1 HOH B 122 -7.077 0.953 10.842 1.00 0.00 H \n+HETATM 626 H2 HOH B 122 -6.691 0.093 9.657 1.00 0.00 H \n+HETATM 627 OM HOH B 122 -7.195 0.208 10.377 1.00 0.00 EP \n+HETATM 628 O HOH B 123 3.514 11.576 -1.964 1.00 0.00 O \n+HETATM 629 H1 HOH B 123 4.320 11.149 -2.254 1.00 0.00 H \n+HETATM 630 H2 HOH B 123 3.563 12.458 -2.332 1.00 0.00 H \n+HETATM 631 OM HOH B 123 3.605 11.625 -2.034 1.00 0.00 EP \n+HETATM 632 O HOH B 124 7.230 5.000 11.835 1.00 0.00 O \n+HETATM 633 H1 HOH B 124 7.629 5.220 12.677 1.00 0.00 H \n+HETATM 634 H2 HOH B 124 7.263 5.814 11.333 1.00 0.00 H \n+HETATM 635 OM HOH B 124 7.276 5.110 11.871 1.00 0.00 EP \n+HETATM 636 O HOH B 125 -1.971 2.532 -10.313 1.00 0.00 O \n+HETATM 637 H1 HOH B 125 -1.051 2.507 -10.576 1.00 0.00 H \n+HETATM 638 H2 HOH B 125 -2.007 3.202 -9.630 1.00 0.00 H \n+HETATM 639 OM HOH B 125 -1.877 2.601 -10.268 1.00 0.00 EP \n+HETATM 640 O HOH B 126 -8.875 -2.100 7.970 1.00 0.00 O \n+HETATM 641 H1 HOH B 126 -9.283 -1.298 8.298 1.00 0.00 H \n+HETATM 642 H2 HOH B 126 -8.279 -2.368 8.669 1.00 0.00 H \n+HETATM 643 OM HOH B 126 -8.855 -2.043 8.080 1.00 0.00 EP \n+HETATM 644 O HOH B 127 1.909 8.636 -9.650 1.00 0.00 O \n+HETATM 645 H1 HOH B 127 0.973 8.492 -9.783 1.00 0.00 H \n+HETATM 646 H2 HOH B 127 2.327 7.860 -10.023 1.00 0.00 H \n+HETATM 647 OM HOH B 127 1.854 8.538 -9.704 1.00 0.00 EP \n+HETATM 648 O HOH B 128 3.150 4.556 9.323 1.00 0.00 O \n+HETATM 649 H1 HOH B 128 4.014 4.275 9.624 1.00 0.00 H \n+HETATM 650 H2 HOH B 128 2.710 3.745 9.068 1.00 0.00 H \n+HETATM 651 OM HOH B 128 3.195 4.439 9.328 1.00 0.00 EP \n+HETATM 652 O HOH B 129 1.510 -9.262 -9.570 1.00 0.00 O \n+HETATM 653 H1 HOH B 129 2.221 -9.856 -9.330 1.00 0.00 H \n+HETATM 654 H2 HOH B 129 1.920 -8.615 -10.144 1.00 0.00 H \n+HETATM 655 OM HOH B 129 1.629 -9.257 -9.606 1.00 0.00 EP \n+HETATM 656 O HOH B 130 -10.335 -7.010 7.783 1.00 0.00 O \n+HETATM 657 H1 HOH B 130 -11.263 -6.904 7.993 1.00 0.00 H \n+HETATM 658 H2 HOH B 130 -9.879 -6.799 8.597 1.00 0.00 H \n+HETATM 659 OM HOH B 130 -10.386 -6.977 7.892 1.00 0.00 EP \n+HETATM 660 O HOH B 131 1.022 6.905 4.799 1.00 0.00 O \n+HETATM 661 H1 HOH B 131 0.572 6.077 4.627 1.00 0.00 H \n+HETATM 662 H2 HOH B 131 1.892 6.788 4.419 1.00 0.00 H \n+HETATM 663 OM HOH B 131 1.066 6.804 4.740 1.00 0.00 EP \n+HETATM 664 O HOH B 132 -12.129 -7.059 -1.135 1.00 0.00 O \n+HETATM 665 H1 HOH B 132 -11.847 -7.142 -2.046 1.00 0.00 H \n+HETATM 666 H2 HOH B 132 -12.572 -6.212 -1.097 1.00 0.00 H \n+HETATM 667 OM HOH B 132 -12.146 -6.978 -1.228 1.00 0.00 EP \n+HETATM 668 O HOH B 133 -1.930 8.484 7.494 1.00 0.00 O \n+HETATM 669 H1 HOH B 133 -1.245 8.119 8.054 1.00 0.00 H \n+HETATM 670 H2 HOH B 133 -2.597 7.798 7.453 1.00 0.00 H \n+HETATM 671 OM HOH B 133 -1.929 8.372 7.549 1.00 0.00 EP \n+HETATM 672 O HOH B 134 -9.834 6.033 -1.130 1.00 0.00 O \n+HETATM 673 H1 HOH B 134 -9.439 6.817 -0.750 1.00 0.00 H \n+HETATM 674 H2 HOH B 134 -9.138 5.647 -1.662 1.00 0.00 H \n+HETATM 675 OM HOH B 134 -9.717 6.075 -1.146 1.00 0.00 EP \n+HETATM 676 O HOH B 135 0.589 2.320 -5.492 1.00 0.00 O \n+HETATM 677 H1 HOH B 135 0.855 2.032 -6.366 1.00 0.00 H \n+HETATM 678 H2 HOH B 135 0.070 3.109 -5.647 1.00 0.00 H \n+HETATM 679 OM HOH B 135 0.562 2.373 -5.602 1.00 0.00 EP \n+HETATM 680 O HOH B 136 -10.321 -7.464 0.831 1.00 0.00 O \n+HETATM 681 H1 HOH B 136 -11.022 -7.374 0.186 1.00 0.00 H \n+HETATM 682 H2 HOH B 136 -10.266 -6.604 1.248 1.00 0.00 H \n+HETATM 683 OM HOH B 136 -10.390 -7.363 0.807 1.00 0.00 EP \n+HETATM 684 O HOH B 137 -0.194 7.059 9.209 1.00 0.00 O \n+HETATM 685 H1 HOH B 137 -0.430 6.235 8.782 1.00 0.00 H \n+HETATM 686 H2 HOH B 137 0.427 6.806 9.892 1.00 0.00 H \n+HETATM 687 OM HOH B 137 -0.153 6.944 9.236 1.00 0.00 EP \n+HETATM 688 O HOH B 138 0.715 -4.654 -8.228 1.00 0.00 O \n+HETATM 689 H1 HOH B 138 0.260 -5.076 -8.957 1.00 0.00 H \n+HETATM 690 H2 HOH B 138 0.332 -5.050 -7.445 1.00 0.00 H \n+HETATM 691 OM HOH B 138 0.625 -4.741 -8.223 1.00 0.00 EP \n+HETATM 692 O HOH B 139 -1.911 6.924 -5.072 1.00 0.00 O \n+HETATM 693 H1 HOH B 139 -2.761 6.634 -5.404 1.00 0.00 H \n+HETATM 694 H2 HOH B 139 -2.124 7.499 -4.337 1.00 0.00 H \n+HETATM 695 OM HOH B 139 -2.024 6.954 -5.029 1.00 0.00 EP \n+HETATM 696 O HOH B 140 -0.018 -5.589 -5.749 1.00 0.00 O \n+HETATM 697 H1 HOH B 140 0.798 -5.609 -5.249 1.00 0.00 H \n+HETATM 698 H2 HOH B 140 -0.486 -6.378 -5.477 1.00 0.00 H \n+HETATM 699 OM HOH B 140 0.019 -5.675 -5.667 1.00 0.00 EP \n+HETATM 700 O HOH B 141 -11.742 8.551 -7.526 1.00 0.00 O \n+HETATM 701 H1 HOH B 141 -10.816 8.757 -7.651 1.00 0.00 H \n+HETATM 702 H2 HOH B 141 -11.778 7.594 -7.533 1.00 0.00 H \n+HETATM 703 OM HOH B 141 -11.647 8.470 -7.540 1.00 0.00 EP \n+HETATM 704 O HOH B 142 5.066 8.859 9.510 1.00 0.00 O \n+HETATM 705 H1 HOH B 142 4.400 9.526 9.675 1.00 0.00 H \n+HETATM 706 H2 HOH B 142 4.594 8.151 9.072 1.00 0.00 H \n+HETATM 707 OM HOH B 142 4.945 8.855 9.481 1.00 0.00 EP \n+HETATM 708 O HOH B 143 -6.247 8.868 5.575 1.00 0.00 O \n+HETATM 709 H1 HOH B 143 -5.504 9.426 5.345 1.00 0.00 H \n+HETATM 710 H2 HOH B 143 -5.927 7.976 5.445 1.00 0.00 H \n+HETATM 711 OM HOH B 143 -6.134 8.833 5.536 1.00 0.00 EP \n+HETATM 712 O HOH B 144 -6.890 8.571 -4.833 1.00 0.00 O \n+HETATM 713 H1 HOH B 144 -6.301 8.530 -4.080 1.00 0.00 H \n+HETATM 714 H2 HOH B 144 -7.712 8.909 -4.477 1.00 0.00 H \n+HETATM 715 OM HOH B 144 -6.915 8.603 -4.715 1.00 0.00 EP \n+HETATM 716 O HOH B 145 -9.438 6.660 -5.991 1.00 0.00 O \n+HETATM 717 H1 HOH B 145 -9.838 6.849 -5.142 1.00 0.00 H \n+HETATM 718 H2 HOH B 145 -8.603 6.244 -5.776 1.00 0.00 H \n+HETATM 719 OM HOH B 145 -9.391 6.636 -5.878 1.00 0.00 EP \n+HETATM 720 O HOH B 146 -5.348 5.728 -8.332 1.00 0.00 O \n+HETATM 721 H1 HOH B 146 -6.048 6.204 -8.778 1.00 0.00 H \n+HETATM 722 H2 HOH B 146 -5.369 4.852 -8.719 1.00 0.00 H \n+HETATM 723 OM HOH B 146 -5.425 5.685 -8.421 1.00 0.00 EP \n+HETATM 724 O HOH B 147 3.935 6.826 8.013 1.00 0.00 O \n+HETATM 725 H1 HOH B 147 3.649 6.012 8.429 1.00 0.00 H \n+HETATM 726 H2 HOH B 147 3.131 7.214 7.668 1.00 0.00 H \n+HETATM 727 OM HOH B 147 3.819 6.780 8.020 1.00 0.00 EP \n+HETATM 728 O HOH B 148 -3.533 9.581 -7.596 1.00 0.00 O \n+HETATM 729 H1 HOH B 148 -3.152 10.107 -8.298 1.00 0.00 H \n+HETATM 730 H2 HOH B 148 -3.111 9.902 -6.799 1.00 0.00 H \n+HETATM 731 OM HOH B 148 -3.447 9.671 -7.586 1.00 0.00 EP \n+HETATM 732 O HOH B 149 -1.798 9.295 4.880 1.00 0.00 O \n+HETATM 733 H1 HOH B 149 -1.685 9.052 5.799 1.00 0.00 H \n+HETATM 734 H2 HOH B 149 -1.937 8.464 4.427 1.00 0.00 H \n+HETATM 735 OM HOH B 149 -1.801 9.181 4.929 1.00 0.00 EP \n+HETATM 736 O HOH B 150 -8.597 8.123 0.087 1.00 0.00 O \n+HETATM 737 H1 HOH B 150 -9.116 8.387 0.846 1.00 0.00 H \n+HETATM 738 H2 HOH B 150 -7.849 7.655 0.457 1.00 0.00 H \n+HETATM 739 OM HOH B 150 -8.573 8.101 0.207 1.00 0.00 EP \n+HETATM 740 O HOH B 151 -8.710 2.901 -8.482 1.00 0.00 O \n+HETATM 741 H1 HOH B 151 -8.483 3.507 -9.187 1.00 0.00 H \n+HETATM 742 H2 HOH B 151 -7.983 2.968 -7.863 1.00 0.00 H \n+HETATM 743 OM HOH B 151 -8.608 2.973 -8.491 1.00 0.00 EP \n+HETATM 744 O HOH B 152 -7.797 4.937 -2.594 1.00 0.00 O \n+HETATM 745 H1 HOH B 152 -7.608 5.132 -3.512 1.00 0.00 H \n+HETATM 746 H2 HOH B 152 -7.853 3.982 -2.558 1.00 0.00 H \n+HETATM 747 OM HOH B 152 -7.783 4.856 -2.688 1.00 0.00 EP \n+HETATM 748 O HOH B 153 -11.491 5.751 -7.514 1.00 0.00 O \n+HETATM 749 H1 HOH B 153 -10.724 5.995 -6.996 1.00 0.00 H \n+HETATM 750 H2 HOH B 153 -11.162 5.679 -8.410 1.00 0.00 H \n+HETATM 751 OM HOH B 153 -11.374 5.769 -7.554 1.00 0.00 EP \n+HETATM 752 O HOH B 154 -0.542 -8.901 -2.329 1.00 0.00 O \n+HETATM 753 H1 HOH B 154 0.070 -9.583 -2.605 1.00 0.00 H \n+HETATM 754 H2 HOH B 154 -0.175 -8.565 -1.512 1.00 0.00 H \n+HETATM 755 OM HOH B 154 -0.438 -8.938 -2.271 1.00 0.00 EP \n+HETATM 756 O HOH B 155 -0.875 8.481 -9.757 1.00 0.00 O \n+HETATM 757 H1 HOH B 155 -1.494 7.869 -9.358 1.00 0.00 H \n+HETATM 758 H2 HOH B 155 -1.134 8.519 -10.677 1.00 0.00 H \n+HETATM 759 OM HOH B 155 -0.969 8.420 -9.812 1.00 0.00 EP \n+HETATM 760 O HOH B 156 -10.886 3.090 -6.892 1.00 0.00 O \n+HETATM 761 H1 HOH B 156 -11.257 3.959 -7.043 1.00 0.00 H \n+HETATM 762 H2 HOH B 156 -10.118 3.054 -7.462 1.00 0.00 H \n+HETATM 763 OM HOH B 156 -10.843 3.179 -6.969 1.00 0.00 EP \n+HETATM 764 O HOH B 157 -4.120 2.179 6.892 1.00 0.00 O \n+HETATM 765 H1 HOH B 157 -3.949 2.755 7.637 1.00 0.00 H \n+HETATM 766 H2 HOH B 157 -3.399 1.549 6.906 1.00 0.00 H \n+HETATM 767 OM HOH B 157 -4.025 2.173 6.973 1.00 0.00 EP \n+HETATM 768 O HOH B 158 -7.558 9.789 -1.820 1.00 0.00 O \n+HETATM 769 H1 HOH B 158 -7.926 9.304 -1.081 1.00 0.00 H \n+HETATM 770 H2 HOH B 158 -8.258 9.801 -2.473 1.00 0.00 H \n+HETATM 771 OM HOH B 158 -7.672 9.739 -1.811 1.00 0.00 EP \n+HETATM 772 O HOH B 159 -7.854 9.897 3.605 1.00 0.00 O \n+HETATM 773 H1 HOH B 159 -7.160 10.022 2.958 1.00 0.00 H \n+HETATM 774 H2 HOH B 159 -7.447 9.372 4.294 1.00 0.00 H \n+HETATM 775 OM HOH B 159 -7.737 9.854 3.609 1.00 0.00 EP \n+HETATM 776 O HOH B 160 5.171 -8.761 -10.211 1.00 0.00 O \n+HETATM 777 H1 HOH B 160 5.590 -9.126 -10.990 1.00 0.00 H \n+HETATM 778 H2 HOH B 160 4.771 -9.516 -9.778 1.00 0.00 H \n+HETATM 779 OM HOH B 160 5.173 -8.881 -10.248 1.00 0.00 EP \n+HETATM 780 O HOH B 161 -11.297 3.573 3.178 1.00 0.00 O \n+HETATM 781 H1 HOH B 161 -12.234 3.468 3.341 1.00 0.00 H \n+HETATM 782 H2 HOH B 161 -11.229 4.399 2.697 1.00 0.00 H \n+HETATM 783 OM HOH B 161 -11.390 3.650 3.144 1.00 0.00 EP \n+HETATM 784 O HOH B 162 -1.272 -8.316 2.548 1.00 0.00 O \n+HETATM 785 H1 HOH B 162 -0.912 -8.228 3.430 1.00 0.00 H \n+HETATM 786 H2 HOH B 162 -0.977 -7.530 2.089 1.00 0.00 H \n+HETATM 787 OM HOH B 162 -1.202 -8.223 2.593 1.00 0.00 EP \n+HETATM 788 O HOH B 163 -8.127 5.805 5.348 1.00 0.00 O \n+HETATM 789 H1 HOH B 163 -8.488 6.286 6.093 1.00 0.00 H \n+HETATM 790 H2 HOH B 163 -7.179 5.902 5.437 1.00 0.00 H \n+HETATM 791 OM HOH B 163 -8.064 5.867 5.437 1.00 0.00 EP \n+HETATM 792 O HOH B 164 -9.385 9.608 -3.931 1.00 0.00 O \n+HETATM 793 H1 HOH B 164 -9.747 8.764 -3.663 1.00 0.00 H \n+HETATM 794 H2 HOH B 164 -10.047 9.978 -4.516 1.00 0.00 H \n+HETATM 795 OM HOH B 164 -9.494 9.558 -3.965 1.00 0.00 EP \n+HETATM 796 O HOH B 165 2.943 10.211 6.715 1.00 0.00 O \n+HETATM 797 H1 HOH B 165 3.624 9.822 6.166 1.00 0.00 H \n+HETATM 798 H2 HOH B 165 2.326 9.497 6.873 1.00 0.00 H \n+HETATM 799 OM HOH B 165 2.950 10.093 6.673 1.00 0.00 EP \n+HETATM 800 O HOH B 166 -5.238 8.551 -2.597 1.00 0.00 O \n+HETATM 801 H1 HOH B 166 -5.936 9.079 -2.210 1.00 0.00 H \n+HETATM 802 H2 HOH B 166 -5.329 7.692 -2.184 1.00 0.00 H \n+HETATM 803 OM HOH B 166 -5.322 8.515 -2.512 1.00 0.00 EP \n+HETATM 804 O HOH B 167 -2.180 4.388 -8.253 1.00 0.00 O \n+HETATM 805 H1 HOH B 167 -2.394 5.299 -8.457 1.00 0.00 H \n+HETATM 806 H2 HOH B 167 -1.519 4.445 -7.563 1.00 0.00 H \n+HETATM 807 OM HOH B 167 -2.132 4.491 -8.201 1.00 0.00 EP \n+HETATM 808 O HOH B 168 -0.318 -11.149 -8.297 1.00 0.00 O \n+HETATM 809 H1 HOH B 168 -1.165 -10.705 -8.338 1.00 0.00 H \n+HETATM 810 H2 HOH B 168 0.248 -10.641 -8.877 1.00 0.00 H \n+HETATM 811 OM HOH B 168 -0.348 -11.048 -8.363 1.00 0.00 EP \n+HETATM 812 O HOH B 169 -9.169 -11.107 -7.902 1.00 0.00 O \n+HETATM 813 H1 HOH B 169 -8.357 -11.305 -7.434 1.00 0.00 H \n+HETATM 814 H2 HOH B 169 -9.845 -11.120 -7.225 1.00 0.00 H \n+HETATM 815 OM HOH B 169 -9.154 -11.129 -7.780 1.00 0.00 EP \n+HETATM 816 O HOH B 170 -2.561 8.880 -3.268 1.00 0.00 O \n+HETATM 817 H1 HOH B 170 -3.484 8.811 -3.023 1.00 0.00 H \n+HETATM 818 H2 HOH B 170 -2.140 9.280 -2.507 1.00 0.00 H \n+HETATM 819 OM HOH B 170 -2.615 8.916 -3.161 1.00 0.00 EP \n+HETATM 820 O HOH B 171 -4.675 7.555 2.745 1.00 0.00 O \n+HETATM 821 H1 HOH B 171 -3.726 7.435 2.763 1.00 0.00 H \n+HETATM 822 H2 HOH B 171 -4.796 8.475 2.512 1.00 0.00 H \n+HETATM 823 OM HOH B 171 -4.587 7.640 2.722 1.00 0.00 EP \n+HETATM 824 O HOH B 172 0.763 -10.343 1.391 1.00 0.00 O \n+HETATM 825 H1 HOH B 172 1.714 -10.410 1.480 1.00 0.00 H \n+HETATM 826 H2 HOH B 172 0.448 -10.205 2.284 1.00 0.00 H \n+HETATM 827 OM HOH B 172 0.831 -10.335 1.496 1.00 0.00 EP \n+HETATM 828 O HOH B 173 2.082 9.833 1.221 1.00 0.00 O \n+HETATM 829 H1 HOH B 173 1.456 9.513 1.871 1.00 0.00 H \n+HETATM 830 H2 HOH B 173 2.938 9.576 1.565 1.00 0.00 H \n+HETATM 831 OM HOH B 173 2.107 9.771 1.327 1.00 0.00 EP \n+HETATM 832 O HOH B 174 -5.514 -12.232 7.414 1.00 0.00 O \n+HETATM 833 H1 HOH B 174 -4.907 -12.860 7.807 1.00 0.00 H \n+HETATM 834 H2 HOH B 174 -6.217 -12.142 8.057 1.00 0.00 H \n+HETATM 835 OM HOH B 174 -5.524 -12.290 7.524 1.00 0.00 EP \n+HETATM 836 O HOH B 175 4.357 1.106 -10.405 1.00 0.00 O \n+HETATM 837 H1 HOH B 175 4.038 1.991 -10.224 1.00 0.00 H \n+HETATM 838 H2 HOH B 175 3.718 0.530 -9.985 1.00 0.00 H \n+HETATM 839 OM HOH B 175 4.255 1.139 -10.341 1.00 0.00 EP \n+HETATM 840 O HOH B 176 -2.188 1.802 10.295 1.00 0.00 O \n+HETATM 841 H1 HOH B 176 -1.450 2.377 10.497 1.00 0.00 H \n+HETATM 842 H2 HOH B 176 -2.837 2.377 9.890 1.00 0.00 H \n+HETATM 843 OM HOH B 176 -2.178 1.924 10.273 1.00 0.00 EP \n+HETATM 844 O HOH B 177 7.317 2.468 -4.405 1.00 0.00 O \n+HETATM 845 H1 HOH B 177 7.513 3.389 -4.579 1.00 0.00 H \n+HETATM 846 H2 HOH B 177 7.260 2.411 -3.451 1.00 0.00 H \n+HETATM 847 OM HOH B 177 7.332 2.560 -4.322 1.00 0.00 EP \n+HETATM 848 O HOH B 178 -5.312 6.325 5.099 1.00 0.00 O \n+HETATM 849 H1 HOH B 178 -5.132 6.703 4.238 1.00 0.00 H \n+HETATM 850 H2 HOH B 178 -4.760 5.544 5.137 1.00 0.00 H \n+HETATM 851 OM HOH B 178 -5.234 6.282 5.011 1.00 0.00 EP \n+HETATM 852 O HOH B 179 -5.499 -7.526 -9.908 1.00 0.00 O \n+HETATM 853 H1 HOH B 179 -5.074 -6.846 -9.386 1.00 0.00 H \n+HETATM 854 H2 HOH B 179 -5.815 -8.160 -9.265 1.00 0.00 H \n+HETATM 855 OM HOH B 179 -5.488 -7.521 -9.784 1.00 0.00 EP \n+HETATM 856 O HOH B 180 7.359 2.234 -1.681 1.00 0.00 O \n+HETATM 857 H1 HOH B 180 6.529 2.170 -1.209 1.00 0.00 H \n+HETATM 858 H2 HOH B 180 7.899 2.810 -1.141 1.00 0.00 H \n+HETATM 859 OM HOH B 180 7.328 2.289 -1.573 1.00 0.00 EP \n+HETATM 860 O HOH B 181 -10.543 5.847 1.720 1.00 0.00 O \n+HETATM 861 H1 HOH B 181 -10.501 6.747 2.042 1.00 0.00 H \n+HETATM 862 H2 HOH B 181 -10.560 5.933 0.767 1.00 0.00 H \n+HETATM 863 OM HOH B 181 -10.540 5.952 1.652 1.00 0.00 EP \n+HETATM 864 O HOH B 182 0.252 8.790 3.009 1.00 0.00 O \n+HETATM 865 H1 HOH B 182 -0.280 9.367 3.556 1.00 0.00 H \n+HETATM 866 H2 HOH B 182 0.639 8.167 3.624 1.00 0.00 H \n+HETATM 867 OM HOH B 182 0.236 8.785 3.133 1.00 0.00 EP \n+HETATM 868 O HOH B 183 0.317 8.635 -4.913 1.00 0.00 O \n+HETATM 869 H1 HOH B 183 0.786 8.740 -5.741 1.00 0.00 H \n+HETATM 870 H2 HOH B 183 -0.437 8.088 -5.133 1.00 0.00 H \n+HETATM 871 OM HOH B 183 0.287 8.588 -5.025 1.00 0.00 EP \n+HETATM 872 O HOH B 184 -8.029 -6.717 -9.133 1.00 0.00 O \n+HETATM 873 H1 HOH B 184 -7.201 -6.844 -9.595 1.00 0.00 H \n+HETATM 874 H2 HOH B 184 -7.808 -6.146 -8.397 1.00 0.00 H \n+HETATM 875 OM HOH B 184 -7.917 -6.670 -9.103 1.00 0.00 EP \n+HETATM 876 O HOH B 185 5.966 11.258 -8.197 1.00 0.00 O \n+HETATM 877 H1 HOH B 185 5.058 10.955 -8.197 1.00 0.00 H \n+HETATM 878 H2 HOH B 185 5.912 12.181 -8.444 1.00 0.00 H \n+HETATM 879 OM HOH B 185 5.863 11.324 -8.223 1.00 0.00 EP \n+HETATM 880 O HOH B 186 -12.293 -8.659 -5.907 1.00 0.00 O \n+HETATM 881 H1 HOH B 186 -11.855 -9.509 -5.867 1.00 0.00 H \n+HETATM 882 H2 HOH B 186 -13.140 -8.844 -6.313 1.00 0.00 H \n+HETATM 883 OM HOH B 186 -12.336 -8.769 -5.946 1.00 0.00 EP \n+HETATM 884 O HOH B 187 3.254 11.060 9.334 1.00 0.00 O \n+HETATM 885 H1 HOH B 187 3.012 10.696 8.483 1.00 0.00 H \n+HETATM 886 H2 HOH B 187 4.020 11.606 9.152 1.00 0.00 H \n+HETATM 887 OM HOH B 187 3.310 11.080 9.224 1.00 0.00 EP \n+HETATM 888 O HOH B 188 -6.844 3.352 8.740 1.00 0.00 O \n+HETATM 889 H1 HOH B 188 -6.860 2.967 9.616 1.00 0.00 H \n+HETATM 890 H2 HOH B 188 -5.931 3.608 8.608 1.00 0.00 H \n+HETATM 891 OM HOH B 188 -6.748 3.338 8.820 1.00 0.00 EP \n+HETATM 892 O HOH B 189 -0.110 3.570 10.422 1.00 0.00 O \n+HETATM 893 H1 HOH B 189 0.525 2.968 10.034 1.00 0.00 H \n+HETATM 894 H2 HOH B 189 -0.483 4.038 9.675 1.00 0.00 H \n+HETATM 895 OM HOH B 189 -0.082 3.556 10.301 1.00 0.00 EP \n+HETATM 896 O HOH B 190 1.454 5.794 11.048 1.00 0.00 O \n+HETATM 897 H1 HOH B 190 0.860 5.050 11.148 1.00 0.00 H \n+HETATM 898 H2 HOH B 190 2.157 5.465 10.488 1.00 0.00 H \n+HETATM 899 OM HOH B 190 1.466 5.680 10.999 1.00 0.00 EP \n+HETATM 900 O HOH B 191 -7.192 7.105 -9.987 1.00 0.00 O \n+HETATM 901 H1 HOH B 191 -8.078 7.355 -10.251 1.00 0.00 H \n+HETATM 902 H2 HOH B 191 -6.707 7.930 -9.964 1.00 0.00 H \n+HETATM 903 OM HOH B 191 -7.235 7.219 -10.013 1.00 0.00 EP \n+HETATM 904 O HOH B 192 -1.959 7.090 3.231 1.00 0.00 O \n+HETATM 905 H1 HOH B 192 -1.626 6.270 3.597 1.00 0.00 H \n+HETATM 906 H2 HOH B 192 -1.184 7.529 2.882 1.00 0.00 H \n+HETATM 907 OM HOH B 192 -1.841 7.049 3.233 1.00 0.00 EP \n+HETATM 908 O HOH B 193 -3.079 -8.350 8.866 1.00 0.00 O \n+HETATM 909 H1 HOH B 193 -2.927 -7.457 8.559 1.00 0.00 H \n+HETATM 910 H2 HOH B 193 -2.241 -8.621 9.241 1.00 0.00 H \n+HETATM 911 OM HOH B 193 -2.973 -8.284 8.873 1.00 0.00 EP \n+HETATM 912 O HOH B 194 -6.146 9.906 -7.006 1.00 0.00 O \n+HETATM 913 H1 HOH B 194 -5.209 9.789 -7.162 1.00 0.00 H \n+HETATM 914 H2 HOH B 194 -6.321 9.409 -6.207 1.00 0.00 H \n+HETATM 915 OM HOH B 194 -6.065 9.841 -6.937 1.00 0.00 EP \n+HETATM 916 O HOH B 195 -9.049 10.537 -9.616 1.00 0.00 O \n+HETATM 917 H1 HOH B 195 -9.091 9.963 -8.852 1.00 0.00 H \n+HETATM 918 H2 HOH B 195 -9.187 11.416 -9.264 1.00 0.00 H \n+HETATM 919 OM HOH B 195 -9.068 10.570 -9.497 1.00 0.00 EP \n+HETATM 920 O HOH B 196 -8.998 7.824 10.268 1.00 0.00 O \n+HETATM 921 H1 HOH B 196 -8.749 6.900 10.293 1.00 0.00 H \n+HETATM 922 H2 HOH B 196 -8.171 8.293 10.158 1.00 0.00 H \n+HETATM 923 OM HOH B 196 -8.883 7.775 10.259 1.00 0.00 EP \n+HETATM 924 O HOH B 197 1.473 -10.698 9.269 1.00 0.00 O \n+HETATM 925 H1 HOH B 197 2.025 -11.467 9.410 1.00 0.00 H \n+HETATM 926 H2 HOH B 197 2.090 -9.975 9.160 1.00 0.00 H \n+HETATM 927 OM HOH B 197 1.597 -10.703 9.272 1.00 0.00 EP \n+HETATM 928 O HOH B 198 -4.163 6.882 7.597 1.00 0.00 O \n+HETATM 929 H1 HOH B 198 -4.531 6.713 6.729 1.00 0.00 H \n+HETATM 930 H2 HOH B 198 -4.027 6.013 7.974 1.00 0.00 H \n+HETATM 931 OM HOH B 198 -4.187 6.771 7.544 1.00 0.00 EP \n+HETATM 932 O HOH B 199 6.483 5.654 7.996 1.00 0.00 O \n+HETATM 933 H1 HOH B 199 6.968 5.557 7.176 1.00 0.00 H \n+HETATM 934 H2 HOH B 199 5.684 6.119 7.748 1.00 0.00 H \n+HETATM 935 OM HOH B 199 6.450 5.694 7.882 1.00 0.00 EP \n+HETATM 936 O HOH B 200 1.078 -9.609 6.677 1.00 0.00 O \n+HETATM 937 H1 HOH B 200 0.966 -10.305 7.325 1.00 0.00 H \n+HETATM 938 H2 HOH B 200 1.629 -8.960 7.115 1.00 0.00 H \n+HETATM 939 OM HOH B 200 1.125 -9.614 6.793 1.00 0.00 EP \n+HETATM 940 O HOH B 201 -3.691 10.097 8.794 1.00 0.00 O \n+HETATM 941 H1 HOH B 201 -3.007 9.668 8.280 1.00 0.00 H \n+HETATM 942 H2 HOH B 201 -3.229 10.765 9.299 1.00 0.00 H \n+HETATM 943 OM HOH B 201 -3.569 10.122 8.793 1.00 0.00 EP \n+HETATM 944 O HOH B 202 4.146 -3.018 -9.149 1.00 0.00 O \n+HETATM 945 H1 HOH B 202 5.091 -2.868 -9.172 1.00 0.00 H \n+HETATM 946 H2 HOH B 202 3.765 -2.193 -9.451 1.00 0.00 H \n+HETATM 947 OM HOH B 202 4.206 -2.914 -9.184 1.00 0.00 EP \n+HETATM 948 O HOH B 203 2.131 8.232 -6.971 1.00 0.00 O \n+HETATM 949 H1 HOH B 203 2.023 8.384 -7.910 1.00 0.00 H \n+HETATM 950 H2 HOH B 203 2.230 7.283 -6.892 1.00 0.00 H \n+HETATM 951 OM HOH B 203 2.130 8.147 -7.063 1.00 0.00 EP \n+HETATM 952 O HOH B 204 -3.695 -9.232 -10.995 1.00 0.00 O \n+HETATM 953 H1 HOH B 204 -2.828 -8.826 -11.004 1.00 0.00 H \n+HETATM 954 H2 HOH B 204 -4.272 -8.559 -10.634 1.00 0.00 H \n+HETATM 955 OM HOH B 204 -3.664 -9.117 -10.957 1.00 0.00 EP \n+HETATM 956 O HOH B 205 -7.468 -12.005 9.328 1.00 0.00 O \n+HETATM 957 H1 HOH B 205 -7.567 -11.117 9.672 1.00 0.00 H \n+HETATM 958 H2 HOH B 205 -8.307 -12.193 8.906 1.00 0.00 H \n+HETATM 959 OM HOH B 205 -7.568 -11.930 9.319 1.00 0.00 EP \n+HETATM 960 O HOH B 206 5.541 -5.212 2.183 1.00 0.00 O \n+HETATM 961 H1 HOH B 206 5.608 -4.432 1.632 1.00 0.00 H \n+HETATM 962 H2 HOH B 206 4.680 -5.143 2.594 1.00 0.00 H \n+HETATM 963 OM HOH B 206 5.457 -5.121 2.168 1.00 0.00 EP \n+HETATM 964 O HOH B 207 10.468 -3.100 1.701 1.00 0.00 O \n+HETATM 965 H1 HOH B 207 10.497 -2.187 1.415 1.00 0.00 H \n+HETATM 966 H2 HOH B 207 10.623 -3.606 0.904 1.00 0.00 H \n+HETATM 967 OM HOH B 207 10.487 -3.056 1.585 1.00 0.00 EP \n+HETATM 968 O HOH B 208 10.869 -4.449 -0.785 1.00 0.00 O \n+HETATM 969 H1 HOH B 208 10.368 -4.128 -1.535 1.00 0.00 H \n+HETATM 970 H2 HOH B 208 11.771 -4.187 -0.970 1.00 0.00 H \n+HETATM 971 OM HOH B 208 10.912 -4.387 -0.885 1.00 0.00 EP \n+HETATM 972 O HOH B 209 -8.487 -6.331 5.795 1.00 0.00 O \n+HETATM 973 H1 HOH B 209 -8.306 -5.394 5.869 1.00 0.00 H \n+HETATM 974 H2 HOH B 209 -9.240 -6.476 6.368 1.00 0.00 H \n+HETATM 975 OM HOH B 209 -8.548 -6.246 5.864 1.00 0.00 EP \n+HETATM 976 O HOH B 210 6.636 0.340 -9.154 1.00 0.00 O \n+HETATM 977 H1 HOH B 210 5.998 0.601 -9.818 1.00 0.00 H \n+HETATM 978 H2 HOH B 210 6.107 -0.019 -8.441 1.00 0.00 H \n+HETATM 979 OM HOH B 210 6.511 0.329 -9.149 1.00 0.00 EP \n+HETATM 980 O HOH B 211 5.683 -7.159 0.310 1.00 0.00 O \n+HETATM 981 H1 HOH B 211 6.018 -6.679 -0.447 1.00 0.00 H \n+HETATM 982 H2 HOH B 211 5.708 -6.525 1.027 1.00 0.00 H \n+HETATM 983 OM HOH B 211 5.721 -7.040 0.305 1.00 0.00 EP \n+HETATM 984 O HOH B 212 3.198 -5.582 -9.013 1.00 0.00 O \n+HETATM 985 H1 HOH B 212 2.328 -5.358 -8.682 1.00 0.00 H \n+HETATM 986 H2 HOH B 212 3.598 -4.739 -9.225 1.00 0.00 H \n+HETATM 987 OM HOH B 212 3.147 -5.468 -9.001 1.00 0.00 EP \n+HETATM 988 O HOH B 213 -9.982 8.485 2.396 1.00 0.00 O \n+HETATM 989 H1 HOH B 213 -10.868 8.680 2.703 1.00 0.00 H \n+HETATM 990 H2 HOH B 213 -9.415 9.041 2.929 1.00 0.00 H \n+HETATM 991 OM HOH B 213 -10.016 8.565 2.485 1.00 0.00 EP \n+HETATM 992 O HOH B 214 1.253 -1.111 7.438 1.00 0.00 O \n+HETATM 993 H1 HOH B 214 0.488 -1.034 8.007 1.00 0.00 H \n+HETATM 994 H2 HOH B 214 1.766 -0.323 7.616 1.00 0.00 H \n+HETATM 995 OM HOH B 214 1.226 -1.019 7.517 1.00 0.00 EP \n+HETATM 996 O HOH B 215 5.854 10.338 -2.641 1.00 0.00 O \n+HETATM 997 H1 HOH B 215 6.591 10.930 -2.488 1.00 0.00 H \n+HETATM 998 H2 HOH B 215 6.131 9.796 -3.380 1.00 0.00 H \n+HETATM 999 OM HOH B 215 5.962 10.343 -2.703 1.00 0.00 EP \n+HETATM 1000 O HOH B 216 2.573 -3.083 -6.884 1.00 0.00 O \n+HETATM 1001 H1 HOH B 216 3.187 -3.039 -7.617 1.00 0.00 H \n+HETATM 1002 H2 HOH B 216 1.831 -3.584 -7.223 1.00 0.00 H \n+HETATM 1003 OM HOH B 216 2.559 -3.132 -6.998 1.00 0.00 EP \n+HETATM 1004 O HOH B 217 -5.167 -9.441 7.201 1.00 0.00 O \n+HETATM 1005 H1 HOH B 217 -4.343 -9.163 7.601 1.00 0.00 H \n+HETATM 1006 H2 HOH B 217 -5.162 -10.395 7.281 1.00 0.00 H \n+HETATM 1007 OM HOH B 217 -5.078 -9.513 7.252 1.00 0.00 EP \n+HETATM 1008 O HOH B 218 -2.511 -5.842 7.744 1.00 0.00 O \n+HETATM 1009 H1 HOH B 218 -2.825 -5.095 7.233 1.00 0.00 H \n+HETATM 1010 H2 HOH B 218 -1.778 -5.495 8.252 1.00 0.00 H \n+HETATM 1011 OM HOH B 218 -2.467 -5.725 7.744 1.00 0.00 EP \n+HETATM 1012 O HOH B 219 8.010 5.203 5.755 1.00 0.00 O \n+HETATM 1013 H1 HOH B 219 7.617 4.928 4.926 1.00 0.00 H \n+HETATM 1014 H2 HOH B 219 8.481 4.430 6.065 1.00 0.00 H \n+HETATM 1015 OM HOH B 219 8.018 5.091 5.699 1.00 0.00 EP \n+HETATM 1016 O HOH B 220 -10.294 -8.750 -10.176 1.00 0.00 O \n+HETATM 1017 H1 HOH B 220 -10.449 -7.843 -10.443 1.00 0.00 H \n+HETATM 1018 H2 HOH B 220 -11.015 -9.242 -10.570 1.00 0.00 H \n+HETATM 1019 OM HOH B 220 -10.388 -8.705 -10.247 1.00 0.00 EP \n+HETATM 1020 O HOH B 221 7.462 0.362 -6.069 1.00 0.00 O \n+HETATM 1021 H1 HOH B 221 7.398 1.128 -5.499 1.00 0.00 H \n+HETATM 1022 H2 HOH B 221 8.140 0.592 -6.705 1.00 0.00 H \n+HETATM 1023 OM HOH B 221 7.527 0.468 -6.076 1.00 0.00 EP \n+HETATM 1024 O HOH B 222 -9.798 1.891 -4.640 1.00 0.00 O \n+HETATM 1025 H1 HOH B 222 -10.218 2.458 -5.286 1.00 0.00 H \n+HETATM 1026 H2 HOH B 222 -9.718 1.044 -5.080 1.00 0.00 H \n+HETATM 1027 OM HOH B 222 -9.835 1.861 -4.756 1.00 0.00 EP \n+HETATM 1028 O HOH B 223 8.127 5.812 -9.624 1.00 0.00 O \n+HETATM 1029 H1 HOH B 223 7.215 6.058 -9.470 1.00 0.00 H \n+HETATM 1030 H2 HOH B 223 8.627 6.600 -9.411 1.00 0.00 H \n+HETATM 1031 OM HOH B 223 8.083 5.923 -9.585 1.00 0.00 EP \n+HETATM 1032 O HOH B 224 6.406 -10.321 -2.403 1.00 0.00 O \n+HETATM 1033 H1 HOH B 224 6.255 -10.170 -1.470 1.00 0.00 H \n+HETATM 1034 H2 HOH B 224 7.117 -10.961 -2.431 1.00 0.00 H \n+HETATM 1035 OM HOH B 224 6.466 -10.373 -2.306 1.00 0.00 EP \n+HETATM 1036 O HOH B 225 8.650 -5.720 0.265 1.00 0.00 O \n+HETATM 1037 H1 HOH B 225 9.466 -5.357 -0.081 1.00 0.00 H \n+HETATM 1038 H2 HOH B 225 8.082 -5.807 -0.501 1.00 0.00 H \n+HETATM 1039 OM HOH B 225 8.676 -5.690 0.146 1.00 0.00 EP \n+HETATM 1040 O HOH B 226 11.378 8.552 3.064 1.00 0.00 O \n+HETATM 1041 H1 HOH B 226 11.022 8.072 3.812 1.00 0.00 H \n+HETATM 1042 H2 HOH B 226 10.618 8.737 2.513 1.00 0.00 H \n+HETATM 1043 OM HOH B 226 11.259 8.520 3.085 1.00 0.00 EP \n+HETATM 1044 O HOH B 227 -9.884 -1.213 -0.616 1.00 0.00 O \n+HETATM 1045 H1 HOH B 227 -9.188 -0.589 -0.411 1.00 0.00 H \n+HETATM 1046 H2 HOH B 227 -10.262 -0.891 -1.434 1.00 0.00 H \n+HETATM 1047 OM HOH B 227 -9.850 -1.112 -0.682 1.00 0.00 EP \n+HETATM 1048 O HOH B 228 8.378 11.692 -1.989 1.00 0.00 O \n+HETATM 1049 H1 HOH B 228 8.944 12.299 -1.512 1.00 0.00 H \n+HETATM 1050 H2 HOH B 228 8.368 10.900 -1.451 1.00 0.00 H \n+HETATM 1051 OM HOH B 228 8.437 11.672 -1.881 1.00 0.00 EP \n+HETATM 1052 O HOH B 229 -11.044 -7.335 -3.659 1.00 0.00 O \n+HETATM 1053 H1 HOH B 229 -11.556 -7.826 -4.300 1.00 0.00 H \n+HETATM 1054 H2 HOH B 229 -10.535 -6.716 -4.182 1.00 0.00 H \n+HETATM 1055 OM HOH B 229 -11.044 -7.321 -3.783 1.00 0.00 EP \n+HETATM 1056 O HOH B 230 -5.508 -11.307 1.073 1.00 0.00 O \n+HETATM 1057 H1 HOH B 230 -4.589 -11.048 1.141 1.00 0.00 H \n+HETATM 1058 H2 HOH B 230 -5.756 -11.079 0.177 1.00 0.00 H \n+HETATM 1059 OM HOH B 230 -5.437 -11.255 0.984 1.00 0.00 EP \n+HETATM 1060 O HOH B 231 -0.313 -5.592 -10.654 1.00 0.00 O \n+HETATM 1061 H1 HOH B 231 -0.875 -4.830 -10.796 1.00 0.00 H \n+HETATM 1062 H2 HOH B 231 0.164 -5.696 -11.477 1.00 0.00 H \n+HETATM 1063 OM HOH B 231 -0.322 -5.522 -10.757 1.00 0.00 EP \n+HETATM 1064 O HOH B 232 -2.948 -7.606 5.676 1.00 0.00 O \n+HETATM 1065 H1 HOH B 232 -2.826 -7.004 6.411 1.00 0.00 H \n+HETATM 1066 H2 HOH B 232 -2.063 -7.888 5.447 1.00 0.00 H \n+HETATM 1067 OM HOH B 232 -2.841 -7.572 5.730 1.00 0.00 EP \n+HETATM 1068 O HOH B 233 6.023 -9.882 0.272 1.00 0.00 O \n+HETATM 1069 H1 HOH B 233 6.558 -10.142 1.022 1.00 0.00 H \n+HETATM 1070 H2 HOH B 233 5.994 -8.927 0.318 1.00 0.00 H \n+HETATM 1071 OM HOH B 233 6.077 -9.808 0.357 1.00 0.00 EP \n+HETATM 1072 O HOH B 234 -8.149 5.001 2.682 1.00 0.00 O \n+HETATM 1073 H1 HOH B 234 -8.997 5.317 2.369 1.00 0.00 H \n+HETATM 1074 H2 HOH B 234 -8.119 5.267 3.601 1.00 0.00 H \n+HETATM 1075 OM HOH B 234 -8.236 5.063 2.747 1.00 0.00 EP \n+HETATM 1076 O HOH B 235 -8.623 -6.715 9.883 1.00 0.00 O \n+HETATM 1077 H1 HOH B 235 -7.877 -6.572 9.300 1.00 0.00 H \n+HETATM 1078 H2 HOH B 235 -8.483 -6.104 10.606 1.00 0.00 H \n+HETATM 1079 OM HOH B 235 -8.529 -6.634 9.898 1.00 0.00 EP \n+HETATM 1080 O HOH B 236 7.465 -0.796 0.289 1.00 0.00 O \n+HETATM 1081 H1 HOH B 236 7.445 0.085 0.663 1.00 0.00 H \n+HETATM 1082 H2 HOH B 236 7.686 -0.661 -0.633 1.00 0.00 H \n+HETATM 1083 OM HOH B 236 7.486 -0.687 0.230 1.00 0.00 EP \n+HETATM 1084 O HOH B 237 -10.451 -3.897 -1.047 1.00 0.00 O \n+HETATM 1085 H1 HOH B 237 -9.788 -4.222 -1.656 1.00 0.00 H \n+HETATM 1086 H2 HOH B 237 -10.244 -2.969 -0.939 1.00 0.00 H \n+HETATM 1087 OM HOH B 237 -10.358 -3.833 -1.100 1.00 0.00 EP \n+HETATM 1088 O HOH B 238 -7.874 -3.726 5.996 1.00 0.00 O \n+HETATM 1089 H1 HOH B 238 -7.045 -3.814 6.466 1.00 0.00 H \n+HETATM 1090 H2 HOH B 238 -8.430 -3.215 6.584 1.00 0.00 H \n+HETATM 1091 OM HOH B 238 -7.845 -3.681 6.109 1.00 0.00 EP \n+HETATM 1092 O HOH B 239 -6.540 -9.077 -7.923 1.00 0.00 O \n+HETATM 1093 H1 HOH B 239 -6.345 -8.495 -7.188 1.00 0.00 H \n+HETATM 1094 H2 HOH B 239 -6.496 -9.958 -7.550 1.00 0.00 H \n+HETATM 1095 OM HOH B 239 -6.514 -9.109 -7.805 1.00 0.00 EP \n+HETATM 1096 O HOH B 240 7.274 -8.122 -3.870 1.00 0.00 O \n+HETATM 1097 H1 HOH B 240 7.025 -8.875 -3.335 1.00 0.00 H \n+HETATM 1098 H2 HOH B 240 7.182 -7.370 -3.284 1.00 0.00 H \n+HETATM 1099 OM HOH B 240 7.238 -8.122 -3.751 1.00 0.00 EP \n+HETATM 1100 O HOH B 241 9.083 -3.792 -2.774 1.00 0.00 O \n+HETATM 1101 H1 HOH B 241 8.329 -4.361 -2.623 1.00 0.00 H \n+HETATM 1102 H2 HOH B 241 8.774 -3.146 -3.410 1.00 0.00 H \n+HETATM 1103 OM HOH B 241 8.970 -3.784 -2.826 1.00 0.00 EP \n+HETATM 1104 O HOH B 242 6.797 -5.387 -5.343 1.00 0.00 O \n+HETATM 1105 H1 HOH B 242 6.697 -5.443 -4.393 1.00 0.00 H \n+HETATM 1106 H2 HOH B 242 7.546 -5.950 -5.539 1.00 0.00 H \n+HETATM 1107 OM HOH B 242 6.867 -5.453 -5.263 1.00 0.00 EP \n+HETATM 1108 O HOH B 243 -8.461 5.152 10.013 1.00 0.00 O \n+HETATM 1109 H1 HOH B 243 -9.372 5.056 9.737 1.00 0.00 H \n+HETATM 1110 H2 HOH B 243 -7.976 4.541 9.459 1.00 0.00 H \n+HETATM 1111 OM HOH B 243 -8.506 5.077 9.925 1.00 0.00 EP \n+HETATM 1112 O HOH B 244 0.392 -8.009 0.019 1.00 0.00 O \n+HETATM 1113 H1 HOH B 244 1.317 -7.767 -0.011 1.00 0.00 H \n+HETATM 1114 H2 HOH B 244 0.368 -8.804 0.551 1.00 0.00 H \n+HETATM 1115 OM HOH B 244 0.488 -8.068 0.073 1.00 0.00 EP \n+HETATM 1116 O HOH B 245 -8.029 -6.136 3.041 1.00 0.00 O \n+HETATM 1117 H1 HOH B 245 -8.345 -6.142 3.944 1.00 0.00 H \n+HETATM 1118 H2 HOH B 245 -8.676 -5.615 2.564 1.00 0.00 H \n+HETATM 1119 OM HOH B 245 -8.132 -6.081 3.086 1.00 0.00 EP \n+HETATM 1120 O HOH B 246 -10.619 7.204 -3.575 1.00 0.00 O \n+HETATM 1121 H1 HOH B 246 -10.585 6.734 -2.742 1.00 0.00 H \n+HETATM 1122 H2 HOH B 246 -11.530 7.128 -3.857 1.00 0.00 H \n+HETATM 1123 OM HOH B 246 -10.712 7.146 -3.516 1.00 0.00 EP \n+HETATM 1124 O HOH B 247 -1.002 4.761 8.125 1.00 0.00 O \n+HETATM 1125 H1 HOH B 247 -0.632 4.137 7.500 1.00 0.00 H \n+HETATM 1126 H2 HOH B 247 -1.911 4.481 8.235 1.00 0.00 H \n+HETATM 1127 OM HOH B 247 -1.059 4.664 8.070 1.00 0.00 EP \n+HETATM 1128 O HOH B 248 8.166 -5.326 2.907 1.00 0.00 O \n+HETATM 1129 H1 HOH B 248 7.237 -5.107 2.830 1.00 0.00 H \n+HETATM 1130 H2 HOH B 248 8.444 -5.513 2.011 1.00 0.00 H \n+HETATM 1131 OM HOH B 248 8.097 -5.322 2.804 1.00 0.00 EP \n+HETATM 1132 O HOH B 249 -8.632 -1.158 -11.307 1.00 0.00 O \n+HETATM 1133 H1 HOH B 249 -8.994 -0.545 -10.667 1.00 0.00 H \n+HETATM 1134 H2 HOH B 249 -8.209 -0.601 -11.960 1.00 0.00 H \n+HETATM 1135 OM HOH B 249 -8.625 -1.033 -11.308 1.00 0.00 EP \n+HETATM 1136 O HOH B 250 3.022 6.335 -10.623 1.00 0.00 O \n+HETATM 1137 H1 HOH B 250 3.040 5.486 -10.181 1.00 0.00 H \n+HETATM 1138 H2 HOH B 250 2.566 6.166 -11.447 1.00 0.00 H \n+HETATM 1139 OM HOH B 250 2.975 6.227 -10.664 1.00 0.00 EP \n+HETATM 1140 O HOH B 251 8.618 2.490 5.340 1.00 0.00 O \n+HETATM 1141 H1 HOH B 251 8.121 2.850 4.606 1.00 0.00 H \n+HETATM 1142 H2 HOH B 251 8.017 1.874 5.758 1.00 0.00 H \n+HETATM 1143 OM HOH B 251 8.501 2.462 5.306 1.00 0.00 EP \n+HETATM 1144 O HOH B 252 8.547 -11.294 5.129 1.00 0.00 O \n+HETATM 1145 H1 HOH B 252 7.605 -11.194 5.263 1.00 0.00 H \n+HETATM 1146 H2 HOH B 252 8.929 -10.505 5.513 1.00 0.00 H \n+HETATM 1147 OM HOH B 252 8.487 -11.199 5.184 1.00 0.00 EP \n+HETATM 1148 O HOH B 253 -4.446 6.003 -5.691 1.00 0.00 O \n+HETATM 1149 H1 HOH B 253 -4.404 5.145 -5.268 1.00 0.00 H \n+HETATM 1150 H2 HOH B 253 -4.704 5.814 -6.593 1.00 0.00 H \n+HETATM 1151 OM HOH B 253 -4.469 5.891 -5.742 1.00 0.00 EP \n+HETATM 1152 O HOH B 254 -11.838 0.602 -7.643 1.00 0.00 O \n+HETATM 1153 H1 HOH B 254 -11.647 1.495 -7.356 1.00 0.00 H \n+HETATM 1154 H2 HOH B 254 -12.775 0.608 -7.837 1.00 0.00 H \n+HETATM 1155 OM HOH B 254 -11.918 0.698 -7.633 1.00 0.00 EP \n+HETATM 1156 O HOH B 255 8.556 -2.996 -6.959 1.00 0.00 O \n+HETATM 1157 H1 HOH B 255 9.478 -2.746 -7.030 1.00 0.00 H \n+HETATM 1158 H2 HOH B 255 8.301 -2.722 -6.078 1.00 0.00 H \n+HETATM 1159 OM HOH B 255 8.627 -2.940 -6.873 1.00 0.00 EP \n+HETATM 1160 O HOH B 256 3.951 -9.618 -6.165 1.00 0.00 O \n+HETATM 1161 H1 HOH B 256 3.826 -9.864 -5.248 1.00 0.00 H \n+HETATM 1162 H2 HOH B 256 4.886 -9.428 -6.237 1.00 0.00 H \n+HETATM 1163 OM HOH B 256 4.037 -9.624 -6.075 1.00 0.00 EP \n+HETATM 1164 O HOH B 257 6.158 -3.235 0.381 1.00 0.00 O \n+HETATM 1165 H1 HOH B 257 6.470 -2.365 0.132 1.00 0.00 H \n+HETATM 1166 H2 HOH B 257 6.437 -3.805 -0.335 1.00 0.00 H \n+HETATM 1167 OM HOH B 257 6.221 -3.203 0.278 1.00 0.00 EP \n+HETATM 1168 O HOH B 258 8.868 5.743 2.357 1.00 0.00 O \n+HETATM 1169 H1 HOH B 258 9.258 6.187 3.109 1.00 0.00 H \n+HETATM 1170 H2 HOH B 258 8.267 5.104 2.741 1.00 0.00 H \n+HETATM 1171 OM HOH B 258 8.845 5.722 2.478 1.00 0.00 EP \n+HETATM 1172 O HOH B 259 -9.831 -0.519 -5.873 1.00 0.00 O \n+HETATM 1173 H1 HOH B 259 -10.515 -0.349 -6.520 1.00 0.00 H \n+HETATM 1174 H2 HOH B 259 -9.041 -0.670 -6.393 1.00 0.00 H \n+HETATM 1175 OM HOH B 259 -9.820 -0.517 -5.998 1.00 0.00 EP \n+HETATM 1176 O HOH B 260 4.931 -3.163 -3.087 1.00 0.00 O \n+HETATM 1177 H1 HOH B 260 5.443 -3.860 -2.676 1.00 0.00 H \n+HETATM 1178 H2 HOH B 260 4.888 -2.474 -2.424 1.00 0.00 H \n+HETATM 1179 OM HOH B 260 4.981 -3.164 -2.972 1.00 0.00 EP \n+HETATM 1180 O HOH B 261 3.116 -7.835 -0.092 1.00 0.00 O \n+HETATM 1181 H1 HOH B 261 3.960 -7.438 0.126 1.00 0.00 H \n+HETATM 1182 H2 HOH B 261 3.119 -8.672 0.371 1.00 0.00 H \n+HETATM 1183 OM HOH B 261 3.207 -7.882 -0.019 1.00 0.00 EP \n+HETATM 1184 O HOH B 262 7.624 -5.126 -8.559 1.00 0.00 O \n+HETATM 1185 H1 HOH B 262 7.986 -4.545 -7.889 1.00 0.00 H \n+HETATM 1186 H2 HOH B 262 7.319 -4.536 -9.249 1.00 0.00 H \n+HETATM 1187 OM HOH B 262 7.630 -5.001 -8.561 1.00 0.00 EP \n+HETATM 1188 O HOH B 263 8.353 -8.378 5.974 1.00 0.00 O \n+HETATM 1189 H1 HOH B 263 7.833 -8.222 5.185 1.00 0.00 H \n+HETATM 1190 H2 HOH B 263 8.721 -7.522 6.192 1.00 0.00 H \n+HETATM 1191 OM HOH B 263 8.337 -8.270 5.913 1.00 0.00 EP \n+HETATM 1192 O HOH B 264 9.264 0.962 -8.100 1.00 0.00 O \n+HETATM 1193 H1 HOH B 264 9.167 1.914 -8.125 1.00 0.00 H \n+HETATM 1194 H2 HOH B 264 8.585 0.636 -8.690 1.00 0.00 H \n+HETATM 1195 OM HOH B 264 9.181 1.029 -8.166 1.00 0.00 EP \n+HETATM 1196 O HOH B 265 -7.147 -2.654 10.089 1.00 0.00 O \n+HETATM 1197 H1 HOH B 265 -7.214 -1.756 10.414 1.00 0.00 H \n+HETATM 1198 H2 HOH B 265 -6.206 -2.825 10.048 1.00 0.00 H \n+HETATM 1199 OM HOH B 265 -7.054 -2.577 10.119 1.00 0.00 EP \n+HETATM 1200 O HOH B 266 -7.654 -4.856 11.650 1.00 0.00 O \n+HETATM 1201 H1 HOH B 266 -7.547 -4.072 11.113 1.00 0.00 H \n+HETATM 1202 H2 HOH B 266 -7.942 -4.527 12.501 1.00 0.00 H \n+HETATM 1203 OM HOH B 266 -7.673 -4.738 11.684 1.00 0.00 EP \n+HETATM 1204 O HOH B 267 5.783 5.279 -6.638 1.00 0.00 O \n+HETATM 1205 H1 HOH B 267 5.707 4.373 -6.936 1.00 0.00 H \n+HETATM 1206 H2 HOH B 267 5.655 5.803 -7.429 1.00 0.00 H \n+HETATM 1207 OM HOH B 267 5.761 5.238 -6.754 1.00 0.00 EP \n+HETATM 1208 O HOH B 268 7.138 -4.679 11.557 1.00 0.00 O \n+HETATM 1209 H1 HOH B 268 7.888 -5.023 11.073 1.00 0.00 H \n+HETATM 1210 H2 HOH B 268 6.408 -5.243 11.301 1.00 0.00 H \n+HETATM 1211 OM HOH B 268 7.140 -4.776 11.478 1.00 0.00 EP \n+HETATM 1212 O HOH B 269 -10.733 -7.122 -7.567 1.00 0.00 O \n+HETATM 1213 H1 HOH B 269 -11.149 -6.730 -8.335 1.00 0.00 H \n+HETATM 1214 H2 HOH B 269 -11.438 -7.599 -7.129 1.00 0.00 H \n+HETATM 1215 OM HOH B 269 -10.853 -7.131 -7.602 1.00 0.00 EP \n+HETATM 1216 O HOH B 270 4.904 -5.776 9.906 1.00 0.00 O \n+HETATM 1217 H1 HOH B 270 4.235 -6.356 9.543 1.00 0.00 H \n+HETATM 1218 H2 HOH B 270 5.691 -5.969 9.395 1.00 0.00 H \n+HETATM 1219 OM HOH B 270 4.917 -5.859 9.813 1.00 0.00 EP \n+HETATM 1220 O HOH B 271 7.237 -6.304 8.565 1.00 0.00 O \n+HETATM 1221 H1 HOH B 271 7.419 -7.237 8.675 1.00 0.00 H \n+HETATM 1222 H2 HOH B 271 8.014 -5.865 8.912 1.00 0.00 H \n+HETATM 1223 OM HOH B 271 7.339 -6.357 8.614 1.00 0.00 EP \n+HETATM 1224 O HOH B 272 6.725 -2.893 9.555 1.00 0.00 O \n+HETATM 1225 H1 HOH B 272 6.892 -3.407 10.345 1.00 0.00 H \n+HETATM 1226 H2 HOH B 272 5.784 -2.723 9.574 1.00 0.00 H \n+HETATM 1227 OM HOH B 272 6.643 -2.929 9.641 1.00 0.00 EP \n+HETATM 1228 O HOH B 273 10.017 -0.423 1.112 1.00 0.00 O \n+HETATM 1229 H1 HOH B 273 9.168 -0.736 0.800 1.00 0.00 H \n+HETATM 1230 H2 HOH B 273 9.903 0.522 1.211 1.00 0.00 H \n+HETATM 1231 OM HOH B 273 9.915 -0.356 1.089 1.00 0.00 EP \n+HETATM 1232 O HOH B 274 9.358 -4.990 9.770 1.00 0.00 O \n+HETATM 1233 H1 HOH B 274 9.398 -4.136 9.340 1.00 0.00 H \n+HETATM 1234 H2 HOH B 274 10.160 -5.033 10.292 1.00 0.00 H \n+HETATM 1235 OM HOH B 274 9.448 -4.904 9.780 1.00 0.00 EP \n+HETATM 1236 O HOH B 275 -9.974 -2.048 2.055 1.00 0.00 O \n+HETATM 1237 H1 HOH B 275 -10.686 -1.640 2.548 1.00 0.00 H \n+HETATM 1238 H2 HOH B 275 -10.063 -1.697 1.169 1.00 0.00 H \n+HETATM 1239 OM HOH B 275 -10.059 -1.967 2.013 1.00 0.00 EP \n+HETATM 1240 O HOH B 276 8.176 1.730 1.312 1.00 0.00 O \n+HETATM 1241 H1 HOH B 276 8.402 2.565 0.901 1.00 0.00 H \n+HETATM 1242 H2 HOH B 276 7.456 1.942 1.905 1.00 0.00 H \n+HETATM 1243 OM HOH B 276 8.124 1.842 1.331 1.00 0.00 EP \n+HETATM 1244 O HOH B 277 -9.805 3.600 5.524 1.00 0.00 O \n+HETATM 1245 H1 HOH B 277 -9.263 4.384 5.438 1.00 0.00 H \n+HETATM 1246 H2 HOH B 277 -10.340 3.589 4.731 1.00 0.00 H \n+HETATM 1247 OM HOH B 277 -9.804 3.682 5.431 1.00 0.00 EP \n+HETATM 1248 O HOH B 278 -8.244 1.851 6.875 1.00 0.00 O \n+HETATM 1249 H1 HOH B 278 -7.689 2.405 7.425 1.00 0.00 H \n+HETATM 1250 H2 HOH B 278 -8.802 2.467 6.400 1.00 0.00 H \n+HETATM 1251 OM HOH B 278 -8.244 1.976 6.883 1.00 0.00 EP \n+HETATM 1252 O HOH B 279 6.244 -3.121 6.810 1.00 0.00 O \n+HETATM 1253 H1 HOH B 279 5.596 -2.417 6.800 1.00 0.00 H \n+HETATM 1254 H2 HOH B 279 6.479 -3.218 7.733 1.00 0.00 H \n+HETATM 1255 OM HOH B 279 6.200 -3.056 6.907 1.00 0.00 EP \n+HETATM 1256 O HOH B 280 4.223 -7.971 3.240 1.00 0.00 O \n+HETATM 1257 H1 HOH B 280 4.255 -8.138 4.182 1.00 0.00 H \n+HETATM 1258 H2 HOH B 280 3.745 -7.145 3.159 1.00 0.00 H \n+HETATM 1259 OM HOH B 280 4.175 -7.900 3.332 1.00 0.00 EP \n+HETATM 1260 O HOH B 281 -5.052 -8.759 10.696 1.00 0.00 O \n+HETATM 1261 H1 HOH B 281 -4.364 -8.657 10.039 1.00 0.00 H \n+HETATM 1262 H2 HOH B 281 -4.595 -9.070 11.477 1.00 0.00 H \n+HETATM 1263 OM HOH B 281 -4.930 -8.781 10.709 1.00 0.00 EP \n+HETATM 1264 O HOH B 282 -11.410 2.411 8.395 1.00 0.00 O \n+HETATM 1265 H1 HOH B 282 -11.626 2.234 7.479 1.00 0.00 H \n+HETATM 1266 H2 HOH B 282 -10.849 1.681 8.655 1.00 0.00 H \n+HETATM 1267 OM HOH B 282 -11.373 2.314 8.325 1.00 0.00 EP \n+HETATM 1268 O HOH B 283 -9.507 0.440 8.798 1.00 0.00 O \n+HETATM 1269 H1 HOH B 283 -8.842 0.379 9.484 1.00 0.00 H \n+HETATM 1270 H2 HOH B 283 -9.078 0.921 8.090 1.00 0.00 H \n+HETATM 1271 OM HOH B 283 -9.390 0.485 8.796 1.00 0.00 EP \n+HETATM 1272 O HOH B 284 -8.514 -3.600 -10.104 1.00 0.00 O \n+HETATM 1273 H1 HOH B 284 -8.591 -2.746 -10.531 1.00 0.00 H \n+HETATM 1274 H2 HOH B 284 -7.805 -3.489 -9.471 1.00 0.00 H \n+HETATM 1275 OM HOH B 284 -8.447 -3.497 -10.082 1.00 0.00 EP \n+HETATM 1276 O HOH B 285 1.689 -3.754 7.946 1.00 0.00 O \n+HETATM 1277 H1 HOH B 285 1.588 -2.860 7.618 1.00 0.00 H \n+HETATM 1278 H2 HOH B 285 2.100 -4.229 7.224 1.00 0.00 H \n+HETATM 1279 OM HOH B 285 1.722 -3.709 7.834 1.00 0.00 EP \n+HETATM 1280 O HOH B 286 5.705 3.789 9.859 1.00 0.00 O \n+HETATM 1281 H1 HOH B 286 6.177 4.032 10.655 1.00 0.00 H \n+HETATM 1282 H2 HOH B 286 6.074 4.354 9.180 1.00 0.00 H \n+HETATM 1283 OM HOH B 286 5.795 3.875 9.871 1.00 0.00 EP \n+HETATM 1284 O HOH B 287 -7.541 -9.319 4.725 1.00 0.00 O \n+HETATM 1285 H1 HOH B 287 -7.161 -10.194 4.812 1.00 0.00 H \n+HETATM 1286 H2 HOH B 287 -8.285 -9.319 5.327 1.00 0.00 H \n+HETATM 1287 OM HOH B 287 -7.579 -9.413 4.798 1.00 0.00 EP \n+HETATM 1288 O HOH B 288 -8.778 -8.634 -5.881 1.00 0.00 O \n+HETATM 1289 H1 HOH B 288 -8.169 -8.991 -5.234 1.00 0.00 H \n+HETATM 1290 H2 HOH B 288 -8.969 -7.750 -5.568 1.00 0.00 H \n+HETATM 1291 OM HOH B 288 -8.733 -8.578 -5.779 1.00 0.00 EP \n+HETATM 1292 O HOH B 289 9.253 -2.505 8.563 1.00 0.00 O \n+HETATM 1293 H1 HOH B 289 9.594 -1.616 8.663 1.00 0.00 H \n+HETATM 1294 H2 HOH B 289 8.358 -2.458 8.900 1.00 0.00 H \n+HETATM 1295 OM HOH B 289 9.193 -2.405 8.609 1.00 0.00 EP \n+HETATM 1296 O HOH B 290 10.131 4.935 -6.372 1.00 0.00 O \n+HETATM 1297 H1 HOH B 290 9.592 4.419 -6.971 1.00 0.00 H \n+HETATM 1298 H2 HOH B 290 10.872 5.225 -6.906 1.00 0.00 H \n+HETATM 1299 OM HOH B 290 10.153 4.911 -6.493 1.00 0.00 EP \n+HETATM 1300 O HOH B 291 5.900 -10.637 5.037 1.00 0.00 O \n+HETATM 1301 H1 HOH B 291 6.074 -10.551 4.100 1.00 0.00 H \n+HETATM 1302 H2 HOH B 291 5.562 -9.780 5.298 1.00 0.00 H \n+HETATM 1303 OM HOH B 291 5.883 -10.536 4.965 1.00 0.00 EP \n+HETATM 1304 O HOH B 292 3.815 -10.003 -3.369 1.00 0.00 O \n+HETATM 1305 H1 HOH B 292 4.733 -10.193 -3.176 1.00 0.00 H \n+HETATM 1306 H2 HOH B 292 3.719 -9.069 -3.184 1.00 0.00 H \n+HETATM 1307 OM HOH B 292 3.903 -9.924 -3.329 1.00 0.00 EP \n+HETATM 1308 O HOH B 293 3.831 -7.337 -2.663 1.00 0.00 O \n+HETATM 1309 H1 HOH B 293 4.659 -6.867 -2.567 1.00 0.00 H \n+HETATM 1310 H2 HOH B 293 3.536 -7.490 -1.765 1.00 0.00 H \n+HETATM 1311 OM HOH B 293 3.888 -7.303 -2.557 1.00 0.00 EP \n+HETATM 1312 O HOH B 294 4.519 -11.549 7.171 1.00 0.00 O \n+HETATM 1313 H1 HOH B 294 3.893 -12.218 6.894 1.00 0.00 H \n+HETATM 1314 H2 HOH B 294 5.027 -11.354 6.384 1.00 0.00 H \n+HETATM 1315 OM HOH B 294 4.506 -11.600 7.058 1.00 0.00 EP \n+HETATM 1316 O HOH B 295 6.595 -9.150 -6.335 1.00 0.00 O \n+HETATM 1317 H1 HOH B 295 6.891 -8.685 -5.552 1.00 0.00 H \n+HETATM 1318 H2 HOH B 295 6.831 -8.572 -7.061 1.00 0.00 H \n+HETATM 1319 OM HOH B 295 6.652 -9.038 -6.329 1.00 0.00 EP \n+HETATM 1320 O HOH B 296 9.452 -0.916 3.752 1.00 0.00 O \n+HETATM 1321 H1 HOH B 296 9.724 -0.613 2.886 1.00 0.00 H \n+HETATM 1322 H2 HOH B 296 8.668 -0.404 3.950 1.00 0.00 H \n+HETATM 1323 OM HOH B 296 9.397 -0.829 3.681 1.00 0.00 EP \n+HETATM 1324 O HOH B 297 -9.442 7.025 7.598 1.00 0.00 O \n+HETATM 1325 H1 HOH B 297 -9.339 7.389 8.477 1.00 0.00 H \n+HETATM 1326 H2 HOH B 297 -10.080 6.320 7.704 1.00 0.00 H \n+HETATM 1327 OM HOH B 297 -9.499 6.989 7.703 1.00 0.00 EP \n+HETATM 1328 O HOH B 298 4.959 6.704 -4.455 1.00 0.00 O \n+HETATM 1329 H1 HOH B 298 4.024 6.908 -4.479 1.00 0.00 H \n+HETATM 1330 H2 HOH B 298 5.109 6.173 -5.237 1.00 0.00 H \n+HETATM 1331 OM HOH B 298 4.875 6.669 -4.541 1.00 0.00 EP \n+HETATM 1332 O HOH B 299 9.133 8.790 -6.043 1.00 0.00 O \n+HETATM 1333 H1 HOH B 299 8.227 8.666 -5.760 1.00 0.00 H \n+HETATM 1334 H2 HOH B 299 9.425 9.573 -5.575 1.00 0.00 H \n+HETATM 1335 OM HOH B 299 9.067 8.860 -5.963 1.00 0.00 EP \n+HETATM 1336 O HOH B 300 8.884 8.473 1.769 1.00 0.00 O \n+HETATM 1337 H1 HOH B 300 8.757 8.714 0.851 1.00 0.00 H \n+HETATM 1338 H2 HOH B 300 8.826 7.517 1.776 1.00 0.00 H \n+HETATM 1339 OM HOH B 300 8.864 8.396 1.672 1.00 0.00 EP \n+HETATM 1340 O HOH B 301 10.037 10.230 -3.825 1.00 0.00 O \n+HETATM 1341 H1 HOH B 301 9.799 9.414 -3.384 1.00 0.00 H \n+HETATM 1342 H2 HOH B 301 9.544 10.906 -3.361 1.00 0.00 H \n+HETATM 1343 OM HOH B 301 9.959 10.215 -3.728 1.00 0.00 EP \n+HETATM 1344 O HOH B 302 -6.780 9.305 9.569 1.00 0.00 O \n+HETATM 1345 H1 HOH B 302 -7.245 9.315 8.732 1.00 0.00 H \n+HETATM 1346 H2 HOH B 302 -6.877 10.195 9.908 1.00 0.00 H \n+HETATM 1347 OM HOH B 302 -6.840 9.401 9.516 1.00 0.00 EP \n+HETATM 1348 O HOH B 303 7.645 5.540 -2.103 1.00 0.00 O \n+HETATM 1349 H1 HOH B 303 6.708 5.591 -1.916 1.00 0.00 H \n+HETATM 1350 H2 HOH B 303 7.692 5.253 -3.016 1.00 0.00 H \n+HETATM 1351 OM HOH B 303 7.550 5.515 -2.181 1.00 0.00 EP \n+HETATM 1352 O HOH B 304 8.293 9.269 -0.751 1.00 0.00 O \n+HETATM 1353 H1 HOH B 304 7.387 8.980 -0.646 1.00 0.00 H \n+HETATM 1354 H2 HOH B 304 8.657 8.681 -1.413 1.00 0.00 H \n+HETATM 1355 OM HOH B 304 8.235 9.175 -0.810 1.00 0.00 EP \n+HETATM 1356 O HOH B 305 9.568 7.228 4.722 1.00 0.00 O \n+HETATM 1357 H1 HOH B 305 9.242 8.075 5.026 1.00 0.00 H \n+HETATM 1358 H2 HOH B 305 9.067 6.584 5.223 1.00 0.00 H \n+HETATM 1359 OM HOH B 305 9.480 7.249 4.808 1.00 0.00 EP \n+HETATM 1360 O HOH B 306 6.928 8.563 -4.396 1.00 0.00 O \n+HETATM 1361 H1 HOH B 306 6.244 7.904 -4.508 1.00 0.00 H \n+HETATM 1362 H2 HOH B 306 7.601 8.126 -3.874 1.00 0.00 H \n+HETATM 1363 OM HOH B 306 6.927 8.446 -4.353 1.00 0.00 EP \n+HETATM 1364 O HOH B 307 8.703 4.113 0.013 1.00 0.00 O \n+HETATM 1365 H1 HOH B 307 8.833 4.680 0.774 1.00 0.00 H \n+HETATM 1366 H2 HOH B 307 8.391 4.702 -0.674 1.00 0.00 H \n+HETATM 1367 OM HOH B 307 8.683 4.236 0.021 1.00 0.00 EP \n+HETATM 1368 O HOH B 308 4.835 8.871 5.234 1.00 0.00 O \n+HETATM 1369 H1 HOH B 308 4.353 8.148 4.834 1.00 0.00 H \n+HETATM 1370 H2 HOH B 308 5.532 9.070 4.608 1.00 0.00 H \n+HETATM 1371 OM HOH B 308 4.858 8.815 5.124 1.00 0.00 EP \n+HETATM 1372 O HOH B 309 -10.976 5.032 8.919 1.00 0.00 O \n+HETATM 1373 H1 HOH B 309 -11.121 4.111 8.702 1.00 0.00 H \n+HETATM 1374 H2 HOH B 309 -11.808 5.324 9.292 1.00 0.00 H \n+HETATM 1375 OM HOH B 309 -11.080 4.965 8.936 1.00 0.00 EP \n+HETATM 1376 O HOH B 310 -4.207 10.485 4.752 1.00 0.00 O \n+HETATM 1377 H1 HOH B 310 -4.165 11.365 5.127 1.00 0.00 H \n+HETATM 1378 H2 HOH B 310 -3.306 10.163 4.794 1.00 0.00 H \n+HETATM 1379 OM HOH B 310 -4.106 10.545 4.796 1.00 0.00 EP \n+HETATM 1380 O HOH B 311 3.263 10.639 -8.246 1.00 0.00 O \n+HETATM 1381 H1 HOH B 311 2.912 10.107 -8.961 1.00 0.00 H \n+HETATM 1382 H2 HOH B 311 3.050 10.146 -7.453 1.00 0.00 H \n+HETATM 1383 OM HOH B 311 3.203 10.529 -8.238 1.00 0.00 EP \n+HETATM 1384 O HOH B 312 3.036 -5.444 3.248 1.00 0.00 O \n+HETATM 1385 H1 HOH B 312 2.783 -5.296 4.160 1.00 0.00 H \n+HETATM 1386 H2 HOH B 312 2.392 -4.951 2.738 1.00 0.00 H \n+HETATM 1387 OM HOH B 312 2.940 -5.376 3.291 1.00 0.00 EP \n+HETATM 1388 O HOH B 313 9.073 7.693 -2.823 1.00 0.00 O \n+HETATM 1389 H1 HOH B 313 8.629 6.912 -2.493 1.00 0.00 H \n+HETATM 1390 H2 HOH B 313 9.727 7.357 -3.435 1.00 0.00 H \n+HETATM 1391 OM HOH B 313 9.095 7.574 -2.853 1.00 0.00 EP \n+HETATM 1392 O HOH B 314 5.704 8.444 -0.643 1.00 0.00 O \n+HETATM 1393 H1 HOH B 314 5.496 7.597 -1.037 1.00 0.00 H \n+HETATM 1394 H2 HOH B 314 5.557 9.078 -1.345 1.00 0.00 H \n+HETATM 1395 OM HOH B 314 5.666 8.422 -0.760 1.00 0.00 EP \n+HETATM 1396 O HOH B 315 -10.943 -11.069 -5.804 1.00 0.00 O \n+HETATM 1397 H1 HOH B 315 -11.335 -11.941 -5.767 1.00 0.00 H \n+HETATM 1398 H2 HOH B 315 -10.390 -11.021 -5.025 1.00 0.00 H \n+HETATM 1399 OM HOH B 315 -10.926 -11.157 -5.717 1.00 0.00 EP \n+HETATM 1400 O HOH B 316 3.682 -10.668 -8.686 1.00 0.00 O \n+HETATM 1401 H1 HOH B 316 3.783 -10.368 -7.782 1.00 0.00 H \n+HETATM 1402 H2 HOH B 316 3.480 -11.600 -8.608 1.00 0.00 H \n+HETATM 1403 OM HOH B 316 3.671 -10.735 -8.581 1.00 0.00 EP \n+HETATM 1404 O HOH B 317 9.475 8.162 -8.692 1.00 0.00 O \n+HETATM 1405 H1 HOH B 317 10.386 8.416 -8.836 1.00 0.00 H \n+HETATM 1406 H2 HOH B 317 9.312 8.365 -7.771 1.00 0.00 H \n+HETATM 1407 OM HOH B 317 9.555 8.211 -8.609 1.00 0.00 EP \n+HETATM 1408 O HOH B 318 -11.648 10.320 -5.382 1.00 0.00 O \n+HETATM 1409 H1 HOH B 318 -11.821 9.703 -6.093 1.00 0.00 H \n+HETATM 1410 H2 HOH B 318 -12.427 10.272 -4.828 1.00 0.00 H \n+HETATM 1411 OM HOH B 318 -11.749 10.249 -5.399 1.00 0.00 EP \n+HETATM 1412 O HOH B 319 5.535 6.614 -9.038 1.00 0.00 O \n+HETATM 1413 H1 HOH B 319 4.821 6.520 -9.669 1.00 0.00 H \n+HETATM 1414 H2 HOH B 319 5.861 7.503 -9.176 1.00 0.00 H \n+HETATM 1415 OM HOH B 319 5.493 6.699 -9.120 1.00 0.00 EP \n+HETATM 1416 O HOH B 320 6.625 9.362 7.274 1.00 0.00 O \n+HETATM 1417 H1 HOH B 320 6.227 9.257 8.138 1.00 0.00 H \n+HETATM 1418 H2 HOH B 320 5.939 9.097 6.660 1.00 0.00 H \n+HETATM 1419 OM HOH B 320 6.509 9.323 7.300 1.00 0.00 EP \n+HETATM 1420 O HOH B 321 7.684 -8.938 8.631 1.00 0.00 O \n+HETATM 1421 H1 HOH B 321 7.871 -8.965 7.692 1.00 0.00 H \n+HETATM 1422 H2 HOH B 321 6.792 -9.275 8.707 1.00 0.00 H \n+HETATM 1423 OM HOH B 321 7.609 -8.977 8.539 1.00 0.00 EP \n+HETATM 1424 O HOH B 322 -9.558 8.072 -11.023 1.00 0.00 O \n+HETATM 1425 H1 HOH B 322 -9.563 8.990 -10.751 1.00 0.00 H \n+HETATM 1426 H2 HOH B 322 -9.489 8.105 -11.977 1.00 0.00 H \n+HETATM 1427 OM HOH B 322 -9.551 8.174 -11.096 1.00 0.00 EP \n+HETATM 1428 O HOH B 323 6.314 -9.675 11.503 1.00 0.00 O \n+HETATM 1429 H1 HOH B 323 5.766 -9.730 10.720 1.00 0.00 H \n+HETATM 1430 H2 HOH B 323 7.211 -9.682 11.169 1.00 0.00 H \n+HETATM 1431 OM HOH B 323 6.351 -9.682 11.384 1.00 0.00 EP \n+HETATM 1432 O HOH B 324 10.842 7.030 -4.740 1.00 0.00 O \n+HETATM 1433 H1 HOH B 324 10.690 6.189 -5.170 1.00 0.00 H \n+HETATM 1434 H2 HOH B 324 10.400 7.669 -5.300 1.00 0.00 H \n+HETATM 1435 OM HOH B 324 10.779 7.009 -4.846 1.00 0.00 EP \n+HETATM 1436 O HOH B 325 8.575 9.885 5.456 1.00 0.00 O \n+HETATM 1437 H1 HOH B 325 8.017 9.759 6.224 1.00 0.00 H \n+HETATM 1438 H2 HOH B 325 8.734 10.829 5.428 1.00 0.00 H \n+HETATM 1439 OM HOH B 325 8.533 9.972 5.535 1.00 0.00 EP \n+HETATM 1440 O HOH B 326 9.377 -9.225 -7.262 1.00 0.00 O \n+HETATM 1441 H1 HOH B 326 8.939 -8.686 -7.921 1.00 0.00 H \n+HETATM 1442 H2 HOH B 326 8.668 -9.706 -6.835 1.00 0.00 H \n+HETATM 1443 OM HOH B 326 9.255 -9.219 -7.287 1.00 0.00 EP \n+HETATM 1444 O HOH B 327 -8.519 -9.036 7.370 1.00 0.00 O \n+HETATM 1445 H1 HOH B 327 -8.198 -9.248 8.246 1.00 0.00 H \n+HETATM 1446 H2 HOH B 327 -9.279 -8.474 7.522 1.00 0.00 H \n+HETATM 1447 OM HOH B 327 -8.566 -8.999 7.479 1.00 0.00 EP \n+HETATM 1448 O HOH B 328 -10.399 -5.952 -10.240 1.00 0.00 O \n+HETATM 1449 H1 HOH B 328 -10.384 -5.012 -10.416 1.00 0.00 H \n+HETATM 1450 H2 HOH B 328 -9.528 -6.145 -9.892 1.00 0.00 H \n+HETATM 1451 OM HOH B 328 -10.304 -5.872 -10.221 1.00 0.00 EP \n+TER 1452 HOH B 328\n+HETATM 1453 Na NA C 1 1.890 10.225 -1.030 1.00 0.00 Na \n+HETATM 1454 Na NA C 2 -6.298 -7.598 2.667 1.00 0.00 Na \n+HETATM 1455 Na NA C 3 -8.580 -8.752 0.050 1.00 0.00 Na \n+HETATM 1456 Na NA C 4 -4.766 8.110 9.595 1.00 0.00 Na \n+HETATM 1457 Na NA C 5 -6.672 -7.830 6.444 1.00 0.00 Na \n+HETATM 1458 Na NA C 6 3.494 -3.691 -4.871 1.00 0.00 Na \n+HETATM 1459 Na NA C 7 9.050 -3.228 3.597 1.00 0.00 Na \n+HETATM 1460 Na NA C 8 -8.970 -8.727 -8.217 1.00 0.00 Na \n+HETATM 1461 Cl CL C 9 1.681 1.786 8.787 1.00 0.00 Cl \n+HETATM 1462 Cl CL C 10 -3.849 4.249 9.189 1.00 0.00 Cl \n+HETATM 1463 Cl CL C 11 2.861 -7.733 8.355 1.00 0.00 Cl \n+HETATM 1464 Cl CL C 12 3.080 3.665 -9.112 1.00 0.00 Cl \n+HETATM 1465 Cl CL C 13 6.575 -5.587 -2.154 1.00 0.00 Cl \n+HETATM 1466 Cl CL C 14 -6.793 -9.728 -3.822 1.00 0.00 Cl \n+TER 1467 CL C 14\n+END\ndiff --git a/wrappers/python/tests/systems/test_charmm_peptide_5.pdb b/wrappers/python/tests/systems/test_charmm_peptide_5.pdb\nnew file mode 100644\nindex 0000000000..ac03fcf5dc\n--- /dev/null\n+++ b/wrappers/python/tests/systems/test_charmm_peptide_5.pdb\n@@ -0,0 +1,1798 @@\n+REMARK 1 CREATED WITH OPENMM 8.3, 2025-07-01\n+CRYST1 24.000 24.000 24.000 90.00 90.00 90.00 P 1 1 \n+ATOM 1 N GLY A 1 -6.286 -1.896 3.998 1.00 0.00 N \n+ATOM 2 CA GLY A 1 -6.591 -1.285 2.662 1.00 0.00 C \n+ATOM 3 C GLY A 1 -5.431 -1.333 1.708 1.00 0.00 C \n+ATOM 4 O GLY A 1 -4.439 -1.988 1.994 1.00 0.00 O \n+ATOM 5 H GLY A 1 -5.604 -1.349 4.587 1.00 0.00 H \n+ATOM 6 H2 GLY A 1 -5.852 -2.854 3.933 1.00 0.00 H \n+ATOM 7 H3 GLY A 1 -7.179 -1.992 4.577 1.00 0.00 H \n+ATOM 8 HA2 GLY A 1 -7.396 -1.856 2.223 1.00 0.00 H \n+ATOM 9 HA3 GLY A 1 -6.843 -0.248 2.828 1.00 0.00 H \n+ATOM 10 N TYR A 2 -5.504 -0.668 0.537 1.00 0.00 N \n+ATOM 11 CA TYR A 2 -4.352 -0.545 -0.350 1.00 0.00 C \n+ATOM 12 C TYR A 2 -3.556 0.728 -0.025 1.00 0.00 C \n+ATOM 13 O TYR A 2 -4.072 1.846 -0.107 1.00 0.00 O \n+ATOM 14 CB TYR A 2 -4.794 -0.606 -1.840 1.00 0.00 C \n+ATOM 15 CG TYR A 2 -3.617 -0.538 -2.783 1.00 0.00 C \n+ATOM 16 CD1 TYR A 2 -2.954 -1.708 -3.195 1.00 0.00 C \n+ATOM 17 CD2 TYR A 2 -3.167 0.701 -3.264 1.00 0.00 C \n+ATOM 18 CE1 TYR A 2 -1.846 -1.633 -4.052 1.00 0.00 C \n+ATOM 19 CE2 TYR A 2 -2.054 0.782 -4.108 1.00 0.00 C \n+ATOM 20 CZ TYR A 2 -1.394 -0.386 -4.499 1.00 0.00 C \n+ATOM 21 OH TYR A 2 -0.278 -0.309 -5.350 1.00 0.00 O \n+ATOM 22 H TYR A 2 -6.361 -0.230 0.228 1.00 0.00 H \n+ATOM 23 HA TYR A 2 -3.683 -1.380 -0.185 1.00 0.00 H \n+ATOM 24 HB2 TYR A 2 -5.333 -1.560 -2.023 1.00 0.00 H \n+ATOM 25 HB3 TYR A 2 -5.489 0.232 -2.064 1.00 0.00 H \n+ATOM 26 HD1 TYR A 2 -3.291 -2.669 -2.835 1.00 0.00 H \n+ATOM 27 HD2 TYR A 2 -3.662 1.606 -2.951 1.00 0.00 H \n+ATOM 28 HE1 TYR A 2 -1.329 -2.532 -4.358 1.00 0.00 H \n+ATOM 29 HE2 TYR A 2 -1.706 1.746 -4.449 1.00 0.00 H \n+ATOM 30 HH TYR A 2 0.019 0.633 -5.381 1.00 0.00 H \n+ATOM 31 N ASP A 3 -2.274 0.577 0.365 1.00 0.00 N \n+ATOM 32 CA ASP A 3 -1.483 1.641 0.959 1.00 0.00 C \n+ATOM 33 C ASP A 3 -0.505 2.276 -0.054 1.00 0.00 C \n+ATOM 34 O ASP A 3 0.286 1.554 -0.669 1.00 0.00 O \n+ATOM 35 CB ASP A 3 -0.795 1.045 2.221 1.00 0.00 C \n+ATOM 36 CG ASP A 3 0.075 1.990 3.030 1.00 0.00 C \n+ATOM 37 OD1 ASP A 3 0.460 3.081 2.542 1.00 0.00 O \n+ATOM 38 OD2 ASP A 3 0.400 1.619 4.183 1.00 0.00 O \n+ATOM 39 H ASP A 3 -1.834 -0.325 0.347 1.00 0.00 H \n+ATOM 40 HA ASP A 3 -2.161 2.397 1.319 1.00 0.00 H \n+ATOM 41 HB2 ASP A 3 -1.587 0.660 2.898 1.00 0.00 H \n+ATOM 42 HB3 ASP A 3 -0.165 0.183 1.926 1.00 0.00 H \n+ATOM 43 N PRO A 4 -0.501 3.600 -0.293 1.00 0.00 N \n+ATOM 44 CA PRO A 4 0.437 4.238 -1.212 1.00 0.00 C \n+ATOM 45 C PRO A 4 1.840 4.426 -0.638 1.00 0.00 C \n+ATOM 46 O PRO A 4 2.662 5.064 -1.299 1.00 0.00 O \n+ATOM 47 CB PRO A 4 -0.251 5.590 -1.468 1.00 0.00 C \n+ATOM 48 CG PRO A 4 -0.868 5.949 -0.115 1.00 0.00 C \n+ATOM 49 CD PRO A 4 -1.339 4.587 0.402 1.00 0.00 C \n+ATOM 50 HA PRO A 4 0.535 3.636 -2.104 1.00 0.00 H \n+ATOM 51 HB2 PRO A 4 0.428 6.368 -1.865 1.00 0.00 H \n+ATOM 52 HB3 PRO A 4 -1.072 5.428 -2.205 1.00 0.00 H \n+ATOM 53 HG2 PRO A 4 -0.082 6.352 0.562 1.00 0.00 H \n+ATOM 54 HG3 PRO A 4 -1.697 6.679 -0.202 1.00 0.00 H \n+ATOM 55 HD2 PRO A 4 -1.215 4.515 1.504 1.00 0.00 H \n+ATOM 56 HD3 PRO A 4 -2.403 4.410 0.142 1.00 0.00 H \n+ATOM 57 N GLU A 5 2.179 3.896 0.552 1.00 0.00 N \n+ATOM 58 CA GLU A 5 3.550 3.880 1.035 1.00 0.00 C \n+ATOM 59 C GLU A 5 4.121 2.536 0.634 1.00 0.00 C \n+ATOM 60 O GLU A 5 5.025 2.441 -0.196 1.00 0.00 O \n+ATOM 61 CB GLU A 5 3.606 4.058 2.578 1.00 0.00 C \n+ATOM 62 CG GLU A 5 4.888 4.764 3.102 1.00 0.00 C \n+ATOM 63 CD GLU A 5 6.185 3.958 3.143 1.00 0.00 C \n+ATOM 64 OE1 GLU A 5 6.267 2.782 2.715 1.00 0.00 O \n+ATOM 65 OE2 GLU A 5 7.174 4.559 3.639 1.00 0.00 O \n+ATOM 66 H GLU A 5 1.482 3.485 1.164 1.00 0.00 H \n+ATOM 67 HA GLU A 5 4.136 4.653 0.558 1.00 0.00 H \n+ATOM 68 HB2 GLU A 5 2.757 4.737 2.830 1.00 0.00 H \n+ATOM 69 HB3 GLU A 5 3.413 3.121 3.141 1.00 0.00 H \n+ATOM 70 HG2 GLU A 5 5.082 5.674 2.496 1.00 0.00 H \n+ATOM 71 HG3 GLU A 5 4.693 5.080 4.151 1.00 0.00 H \n+ATOM 72 N THR A 6 3.553 1.438 1.172 1.00 0.00 N \n+ATOM 73 CA THR A 6 3.998 0.081 0.891 1.00 0.00 C \n+ATOM 74 C THR A 6 3.866 -0.292 -0.576 1.00 0.00 C \n+ATOM 75 O THR A 6 4.740 -0.951 -1.142 1.00 0.00 O \n+ATOM 76 CB THR A 6 3.303 -0.994 1.734 1.00 0.00 C \n+ATOM 77 OG1 THR A 6 1.921 -1.109 1.430 1.00 0.00 O \n+ATOM 78 CG2 THR A 6 3.405 -0.658 3.228 1.00 0.00 C \n+ATOM 79 H THR A 6 2.793 1.530 1.813 1.00 0.00 H \n+ATOM 80 HA THR A 6 5.050 0.048 1.132 1.00 0.00 H \n+ATOM 81 HB THR A 6 3.798 -1.980 1.556 1.00 0.00 H \n+ATOM 82 HG1 THR A 6 1.697 -2.048 1.569 1.00 0.00 H \n+ATOM 83 HG21 THR A 6 4.462 -0.524 3.530 1.00 0.00 H \n+ATOM 84 HG22 THR A 6 2.967 -1.477 3.837 1.00 0.00 H \n+ATOM 85 HG23 THR A 6 2.846 0.271 3.469 1.00 0.00 H \n+ATOM 86 N GLY A 7 2.753 0.119 -1.224 1.00 0.00 N \n+ATOM 87 CA GLY A 7 2.343 -0.349 -2.541 1.00 0.00 C \n+ATOM 88 C GLY A 7 1.801 -1.748 -2.464 1.00 0.00 C \n+ATOM 89 O GLY A 7 1.986 -2.555 -3.373 1.00 0.00 O \n+ATOM 90 H GLY A 7 2.089 0.693 -0.732 1.00 0.00 H \n+ATOM 91 HA2 GLY A 7 1.538 0.288 -2.881 1.00 0.00 H \n+ATOM 92 HA3 GLY A 7 3.197 -0.352 -3.205 1.00 0.00 H \n+ATOM 93 N THR A 8 1.163 -2.084 -1.332 1.00 0.00 N \n+ATOM 94 CA THR A 8 0.666 -3.416 -1.028 1.00 0.00 C \n+ATOM 95 C THR A 8 -0.718 -3.288 -0.459 1.00 0.00 C \n+ATOM 96 O THR A 8 -1.162 -2.226 -0.023 1.00 0.00 O \n+ATOM 97 CB THR A 8 1.508 -4.242 -0.020 1.00 0.00 C \n+ATOM 98 OG1 THR A 8 1.431 -3.825 1.348 1.00 0.00 O \n+ATOM 99 CG2 THR A 8 2.978 -4.229 -0.440 1.00 0.00 C \n+ATOM 100 H THR A 8 1.050 -1.399 -0.609 1.00 0.00 H \n+ATOM 101 HA THR A 8 0.581 -3.975 -1.949 1.00 0.00 H \n+ATOM 102 HB THR A 8 1.167 -5.301 -0.050 1.00 0.00 H \n+ATOM 103 HG1 THR A 8 0.574 -4.154 1.684 1.00 0.00 H \n+ATOM 104 HG21 THR A 8 3.088 -4.587 -1.484 1.00 0.00 H \n+ATOM 105 HG22 THR A 8 3.570 -4.892 0.225 1.00 0.00 H \n+ATOM 106 HG23 THR A 8 3.402 -3.207 -0.367 1.00 0.00 H \n+ATOM 107 N TRP A 9 -1.435 -4.423 -0.398 1.00 0.00 N \n+ATOM 108 CA TRP A 9 -2.504 -4.583 0.560 1.00 0.00 C \n+ATOM 109 C TRP A 9 -1.994 -4.600 1.998 1.00 0.00 C \n+ATOM 110 O TRP A 9 -0.909 -5.109 2.292 1.00 0.00 O \n+ATOM 111 CB TRP A 9 -3.327 -5.855 0.262 1.00 0.00 C \n+ATOM 112 CG TRP A 9 -4.066 -5.764 -1.034 1.00 0.00 C \n+ATOM 113 CD1 TRP A 9 -3.746 -6.357 -2.226 1.00 0.00 C \n+ATOM 114 CD2 TRP A 9 -5.244 -4.976 -1.269 1.00 0.00 C \n+ATOM 115 NE1 TRP A 9 -4.670 -5.993 -3.179 1.00 0.00 N \n+ATOM 116 CE2 TRP A 9 -5.584 -5.146 -2.629 1.00 0.00 C \n+ATOM 117 CE3 TRP A 9 -6.039 -4.168 -0.452 1.00 0.00 C \n+ATOM 118 CZ2 TRP A 9 -6.669 -4.499 -3.191 1.00 0.00 C \n+ATOM 119 CZ3 TRP A 9 -7.140 -3.522 -1.020 1.00 0.00 C \n+ATOM 120 CH2 TRP A 9 -7.445 -3.676 -2.370 1.00 0.00 C \n+ATOM 121 H TRP A 9 -1.121 -5.263 -0.837 1.00 0.00 H \n+ATOM 122 HA TRP A 9 -3.156 -3.722 0.476 1.00 0.00 H \n+ATOM 123 HB2 TRP A 9 -2.647 -6.735 0.241 1.00 0.00 H \n+ATOM 124 HB3 TRP A 9 -4.069 -6.022 1.072 1.00 0.00 H \n+ATOM 125 HD1 TRP A 9 -2.898 -7.015 -2.381 1.00 0.00 H \n+ATOM 126 HE1 TRP A 9 -4.828 -6.470 -4.039 1.00 0.00 H \n+ATOM 127 HE3 TRP A 9 -5.802 -4.032 0.592 1.00 0.00 H \n+ATOM 128 HZ2 TRP A 9 -6.902 -4.613 -4.238 1.00 0.00 H \n+ATOM 129 HZ3 TRP A 9 -7.758 -2.877 -0.408 1.00 0.00 H \n+ATOM 130 HH2 TRP A 9 -8.290 -3.149 -2.795 1.00 0.00 H \n+ATOM 131 N GLY A 10 -2.776 -4.031 2.919 1.00 0.00 N \n+ATOM 132 CA GLY A 10 -2.531 -4.015 4.345 1.00 0.00 C \n+ATOM 133 C GLY A 10 -3.866 -3.998 5.090 1.00 0.00 C \n+ATOM 134 O GLY A 10 -3.837 -3.788 6.329 1.00 0.00 O \n+ATOM 135 OXT GLY A 10 -4.949 -4.177 4.465 1.00 0.00 O \n+ATOM 136 H GLY A 10 -3.597 -3.527 2.642 1.00 0.00 H \n+ATOM 137 HA2 GLY A 10 -2.000 -4.907 4.645 1.00 0.00 H \n+ATOM 138 HA3 GLY A 10 -2.008 -3.097 4.579 1.00 0.00 H \n+TER 139 GLY A 10\n+HETATM 140 O HOH B 1 5.801 3.536 -7.223 1.00 0.00 O \n+HETATM 141 H1 HOH B 1 5.589 2.814 -6.632 1.00 0.00 H \n+HETATM 142 H2 HOH B 1 5.132 3.493 -7.906 1.00 0.00 H \n+HETATM 143 LP1 HOH B 1 6.440 3.452 -7.497 1.00 0.00 EP \n+HETATM 144 LP2 HOH B 1 5.771 4.149 -6.886 1.00 0.00 EP \n+HETATM 145 O HOH B 2 5.254 -9.417 9.199 1.00 0.00 O \n+HETATM 146 H1 HOH B 2 4.957 -10.210 8.752 1.00 0.00 H \n+HETATM 147 H2 HOH B 2 4.514 -8.813 9.134 1.00 0.00 H \n+HETATM 148 LP1 HOH B 2 5.818 -9.151 8.882 1.00 0.00 EP \n+HETATM 149 LP2 HOH B 2 5.404 -9.552 9.869 1.00 0.00 EP \n+HETATM 150 O HOH B 3 -5.979 6.425 9.959 1.00 0.00 O \n+HETATM 151 H1 HOH B 3 -6.851 6.155 9.671 1.00 0.00 H \n+HETATM 152 H2 HOH B 3 -5.450 5.629 9.905 1.00 0.00 H \n+HETATM 153 LP1 HOH B 3 -5.999 6.664 10.617 1.00 0.00 EP \n+HETATM 154 LP2 HOH B 3 -5.722 6.922 9.538 1.00 0.00 EP \n+HETATM 155 O HOH B 4 -11.933 -0.344 -2.385 1.00 0.00 O \n+HETATM 156 H1 HOH B 4 -11.728 0.575 -2.557 1.00 0.00 H \n+HETATM 157 H2 HOH B 4 -11.860 -0.769 -3.240 1.00 0.00 H \n+HETATM 158 LP1 HOH B 4 -12.582 -0.409 -2.131 1.00 0.00 EP \n+HETATM 159 LP2 HOH B 4 -11.476 -0.619 -1.932 1.00 0.00 EP \n+HETATM 160 O HOH B 5 5.513 6.360 -1.845 1.00 0.00 O \n+HETATM 161 H1 HOH B 5 4.837 5.729 -1.597 1.00 0.00 H \n+HETATM 162 H2 HOH B 5 5.318 6.576 -2.756 1.00 0.00 H \n+HETATM 163 LP1 HOH B 5 6.150 6.074 -1.789 1.00 0.00 EP \n+HETATM 164 LP2 HOH B 5 5.478 6.931 -1.442 1.00 0.00 EP \n+HETATM 165 O HOH B 6 7.766 -1.882 -4.856 1.00 0.00 O \n+HETATM 166 H1 HOH B 6 7.519 -1.032 -5.221 1.00 0.00 H \n+HETATM 167 H2 HOH B 6 8.097 -1.681 -3.981 1.00 0.00 H \n+HETATM 168 LP1 HOH B 6 8.264 -2.183 -5.246 1.00 0.00 EP \n+HETATM 169 LP2 HOH B 6 7.211 -2.306 -4.819 1.00 0.00 EP \n+HETATM 170 O HOH B 7 6.099 9.618 -9.718 1.00 0.00 O \n+HETATM 171 H1 HOH B 7 6.464 10.251 -9.100 1.00 0.00 H \n+HETATM 172 H2 HOH B 7 6.747 9.569 -10.421 1.00 0.00 H \n+HETATM 173 LP1 HOH B 7 5.483 9.840 -9.965 1.00 0.00 EP \n+HETATM 174 LP2 HOH B 7 6.018 8.993 -9.413 1.00 0.00 EP \n+HETATM 175 O HOH B 8 -9.207 8.908 -6.802 1.00 0.00 O \n+HETATM 176 H1 HOH B 8 -8.276 8.781 -6.615 1.00 0.00 H \n+HETATM 177 H2 HOH B 8 -9.630 8.124 -6.451 1.00 0.00 H \n+HETATM 178 LP1 HOH B 8 -9.316 8.960 -7.492 1.00 0.00 EP \n+HETATM 179 LP2 HOH B 8 -9.447 9.483 -6.483 1.00 0.00 EP \n+HETATM 180 O HOH B 9 0.740 2.388 -10.541 1.00 0.00 O \n+HETATM 181 H1 HOH B 9 0.958 2.042 -11.407 1.00 0.00 H \n+HETATM 182 H2 HOH B 9 1.385 3.078 -10.389 1.00 0.00 H \n+HETATM 183 LP1 HOH B 9 0.793 1.887 -10.054 1.00 0.00 EP \n+HETATM 184 LP2 HOH B 9 0.091 2.650 -10.536 1.00 0.00 EP \n+HETATM 185 O HOH B 10 4.699 9.280 1.687 1.00 0.00 O \n+HETATM 186 H1 HOH B 10 5.378 9.808 2.109 1.00 0.00 H \n+HETATM 187 H2 HOH B 10 5.109 8.963 0.882 1.00 0.00 H \n+HETATM 188 LP1 HOH B 10 4.137 9.671 1.541 1.00 0.00 EP \n+HETATM 189 LP2 HOH B 10 4.512 8.745 2.097 1.00 0.00 EP \n+HETATM 190 O HOH B 11 0.464 10.040 -3.067 1.00 0.00 O \n+HETATM 191 H1 HOH B 11 0.545 10.857 -3.561 1.00 0.00 H \n+HETATM 192 H2 HOH B 11 0.512 9.353 -3.731 1.00 0.00 H \n+HETATM 193 LP1 HOH B 11 -0.149 10.016 -2.730 1.00 0.00 EP \n+HETATM 194 LP2 HOH B 11 0.987 9.977 -2.607 1.00 0.00 EP \n+HETATM 195 O HOH B 12 -9.303 -5.439 -5.238 1.00 0.00 O \n+HETATM 196 H1 HOH B 12 -9.654 -5.993 -5.935 1.00 0.00 H \n+HETATM 197 H2 HOH B 12 -8.382 -5.315 -5.469 1.00 0.00 H \n+HETATM 198 LP1 HOH B 12 -9.361 -5.756 -4.617 1.00 0.00 EP \n+HETATM 199 LP2 HOH B 12 -9.638 -4.824 -5.218 1.00 0.00 EP \n+HETATM 200 O HOH B 13 -7.306 -11.452 4.205 1.00 0.00 O \n+HETATM 201 H1 HOH B 13 -8.069 -12.015 4.335 1.00 0.00 H \n+HETATM 202 H2 HOH B 13 -6.575 -11.948 4.574 1.00 0.00 H \n+HETATM 203 LP1 HOH B 13 -7.387 -10.843 4.542 1.00 0.00 EP \n+HETATM 204 LP2 HOH B 13 -7.202 -11.329 3.523 1.00 0.00 EP \n+HETATM 205 O HOH B 14 -0.429 -7.758 5.660 1.00 0.00 O \n+HETATM 206 H1 HOH B 14 0.118 -7.029 5.953 1.00 0.00 H \n+HETATM 207 H2 HOH B 14 -0.031 -8.532 6.057 1.00 0.00 H \n+HETATM 208 LP1 HOH B 14 -0.423 -7.807 4.961 1.00 0.00 EP \n+HETATM 209 LP2 HOH B 14 -1.088 -7.677 5.882 1.00 0.00 EP \n+HETATM 210 O HOH B 15 1.203 -10.313 -3.995 1.00 0.00 O \n+HETATM 211 H1 HOH B 15 2.117 -10.110 -3.796 1.00 0.00 H \n+HETATM 212 H2 HOH B 15 1.129 -10.188 -4.941 1.00 0.00 H \n+HETATM 213 LP1 HOH B 15 0.774 -9.878 -3.653 1.00 0.00 EP \n+HETATM 214 LP2 HOH B 15 1.053 -10.974 -3.820 1.00 0.00 EP \n+HETATM 215 O HOH B 16 -4.221 -5.699 -7.913 1.00 0.00 O \n+HETATM 216 H1 HOH B 16 -3.756 -4.893 -8.139 1.00 0.00 H \n+HETATM 217 H2 HOH B 16 -3.562 -6.242 -7.480 1.00 0.00 H \n+HETATM 218 LP1 HOH B 16 -4.462 -6.015 -8.489 1.00 0.00 EP \n+HETATM 219 LP2 HOH B 16 -4.754 -5.564 -7.480 1.00 0.00 EP \n+HETATM 220 O HOH B 17 -2.581 -10.192 0.642 1.00 0.00 O \n+HETATM 221 H1 HOH B 17 -2.578 -10.077 -0.308 1.00 0.00 H \n+HETATM 222 H2 HOH B 17 -1.658 -10.154 0.892 1.00 0.00 H \n+HETATM 223 LP1 HOH B 17 -2.859 -10.811 0.816 1.00 0.00 EP \n+HETATM 224 LP2 HOH B 17 -2.942 -9.679 0.953 1.00 0.00 EP \n+HETATM 225 O HOH B 18 6.709 -8.371 -7.887 1.00 0.00 O \n+HETATM 226 H1 HOH B 18 6.150 -8.497 -8.654 1.00 0.00 H \n+HETATM 227 H2 HOH B 18 7.076 -7.494 -7.999 1.00 0.00 H \n+HETATM 228 LP1 HOH B 18 7.217 -8.852 -7.869 1.00 0.00 EP \n+HETATM 229 LP2 HOH B 18 6.332 -8.408 -7.298 1.00 0.00 EP \n+HETATM 230 O HOH B 19 7.002 10.111 2.895 1.00 0.00 O \n+HETATM 231 H1 HOH B 19 7.183 9.928 3.817 1.00 0.00 H \n+HETATM 232 H2 HOH B 19 7.714 9.680 2.421 1.00 0.00 H \n+HETATM 233 LP1 HOH B 19 7.007 10.801 2.775 1.00 0.00 EP \n+HETATM 234 LP2 HOH B 19 6.383 9.845 2.706 1.00 0.00 EP \n+HETATM 235 O HOH B 20 -6.327 -7.447 0.602 1.00 0.00 O \n+HETATM 236 H1 HOH B 20 -6.442 -6.578 0.217 1.00 0.00 H \n+HETATM 237 H2 HOH B 20 -5.657 -7.863 0.059 1.00 0.00 H \n+HETATM 238 LP1 HOH B 20 -6.925 -7.809 0.577 1.00 0.00 EP \n+HETATM 239 LP2 HOH B 20 -6.111 -7.397 1.266 1.00 0.00 EP \n+HETATM 240 O HOH B 21 0.827 -6.395 10.754 1.00 0.00 O \n+HETATM 241 H1 HOH B 21 1.486 -6.557 11.429 1.00 0.00 H \n+HETATM 242 H2 HOH B 21 1.250 -6.659 9.937 1.00 0.00 H \n+HETATM 243 LP1 HOH B 21 0.654 -5.717 10.735 1.00 0.00 EP \n+HETATM 244 LP2 HOH B 21 0.253 -6.778 10.871 1.00 0.00 EP \n+HETATM 245 O HOH B 22 2.468 6.673 -3.823 1.00 0.00 O \n+HETATM 246 H1 HOH B 22 2.261 5.740 -3.871 1.00 0.00 H \n+HETATM 247 H2 HOH B 22 1.758 7.101 -4.301 1.00 0.00 H \n+HETATM 248 LP1 HOH B 22 3.085 6.806 -4.125 1.00 0.00 EP \n+HETATM 249 LP2 HOH B 22 2.482 6.889 -3.157 1.00 0.00 EP \n+HETATM 250 O HOH B 23 -6.392 2.121 -4.289 1.00 0.00 O \n+HETATM 251 H1 HOH B 23 -6.063 1.222 -4.307 1.00 0.00 H \n+HETATM 252 H2 HOH B 23 -7.106 2.102 -3.651 1.00 0.00 H \n+HETATM 253 LP1 HOH B 23 -6.629 2.311 -4.920 1.00 0.00 EP \n+HETATM 254 LP2 HOH B 23 -5.890 2.564 -4.085 1.00 0.00 EP \n+HETATM 255 O HOH B 24 -6.124 6.194 0.960 1.00 0.00 O \n+HETATM 256 H1 HOH B 24 -6.591 5.497 1.421 1.00 0.00 H \n+HETATM 257 H2 HOH B 24 -5.437 6.465 1.569 1.00 0.00 H \n+HETATM 258 LP1 HOH B 24 -6.554 6.728 0.818 1.00 0.00 EP \n+HETATM 259 LP2 HOH B 24 -5.845 5.954 0.365 1.00 0.00 EP \n+HETATM 260 O HOH B 25 2.214 5.239 -6.896 1.00 0.00 O \n+HETATM 261 H1 HOH B 25 2.562 4.799 -7.672 1.00 0.00 H \n+HETATM 262 H2 HOH B 25 2.621 4.784 -6.159 1.00 0.00 H \n+HETATM 263 LP1 HOH B 25 1.517 5.178 -6.869 1.00 0.00 EP \n+HETATM 264 LP2 HOH B 25 2.389 5.917 -6.896 1.00 0.00 EP \n+HETATM 265 O HOH B 26 -6.389 -11.379 -6.627 1.00 0.00 O \n+HETATM 266 H1 HOH B 26 -6.215 -12.311 -6.757 1.00 0.00 H \n+HETATM 267 H2 HOH B 26 -6.131 -11.211 -5.720 1.00 0.00 H \n+HETATM 268 LP1 HOH B 26 -7.069 -11.239 -6.720 1.00 0.00 EP \n+HETATM 269 LP2 HOH B 26 -6.008 -10.991 -7.068 1.00 0.00 EP \n+HETATM 270 O HOH B 27 -2.186 10.305 -5.614 1.00 0.00 O \n+HETATM 271 H1 HOH B 27 -2.214 9.708 -4.866 1.00 0.00 H \n+HETATM 272 H2 HOH B 27 -1.276 10.280 -5.908 1.00 0.00 H \n+HETATM 273 LP1 HOH B 27 -2.366 10.953 -5.421 1.00 0.00 EP \n+HETATM 274 LP2 HOH B 27 -2.616 10.085 -6.122 1.00 0.00 EP \n+HETATM 275 O HOH B 28 -0.629 -7.698 -5.587 1.00 0.00 O \n+HETATM 276 H1 HOH B 28 -0.713 -7.981 -4.677 1.00 0.00 H \n+HETATM 277 H2 HOH B 28 -0.018 -8.324 -5.977 1.00 0.00 H \n+HETATM 278 LP1 HOH B 28 -0.373 -7.048 -5.622 1.00 0.00 EP \n+HETATM 279 LP2 HOH B 28 -1.249 -7.723 -5.912 1.00 0.00 EP \n+HETATM 280 O HOH B 29 -7.881 -8.062 -1.834 1.00 0.00 O \n+HETATM 281 H1 HOH B 29 -7.413 -8.566 -2.499 1.00 0.00 H \n+HETATM 282 H2 HOH B 29 -8.632 -7.693 -2.299 1.00 0.00 H \n+HETATM 283 LP1 HOH B 29 -7.475 -7.554 -1.577 1.00 0.00 EP \n+HETATM 284 LP2 HOH B 29 -8.093 -8.478 -1.312 1.00 0.00 EP \n+HETATM 285 O HOH B 30 -0.083 -7.936 -9.304 1.00 0.00 O \n+HETATM 286 H1 HOH B 30 -0.262 -7.194 -9.880 1.00 0.00 H \n+HETATM 287 H2 HOH B 30 0.594 -8.437 -9.760 1.00 0.00 H \n+HETATM 288 LP1 HOH B 30 -0.659 -8.324 -9.213 1.00 0.00 EP \n+HETATM 289 LP2 HOH B 30 0.150 -7.716 -8.681 1.00 0.00 EP \n+HETATM 290 O HOH B 31 -8.465 -2.074 5.456 1.00 0.00 O \n+HETATM 291 H1 HOH B 31 -8.358 -2.591 6.254 1.00 0.00 H \n+HETATM 292 H2 HOH B 31 -8.748 -1.213 5.764 1.00 0.00 H \n+HETATM 293 LP1 HOH B 31 -8.951 -2.359 5.040 1.00 0.00 EP \n+HETATM 294 LP2 HOH B 31 -7.859 -2.025 5.109 1.00 0.00 EP \n+HETATM 295 O HOH B 32 0.598 -2.249 -9.226 1.00 0.00 O \n+HETATM 296 H1 HOH B 32 0.811 -3.134 -8.932 1.00 0.00 H \n+HETATM 297 H2 HOH B 32 1.433 -1.782 -9.207 1.00 0.00 H \n+HETATM 298 LP1 HOH B 32 0.137 -1.948 -8.792 1.00 0.00 EP \n+HETATM 299 LP2 HOH B 32 0.335 -2.259 -9.874 1.00 0.00 EP \n+HETATM 300 O HOH B 33 -2.926 0.219 -9.710 1.00 0.00 O \n+HETATM 301 H1 HOH B 33 -2.421 0.985 -9.987 1.00 0.00 H \n+HETATM 302 H2 HOH B 33 -2.358 -0.228 -9.082 1.00 0.00 H \n+HETATM 303 LP1 HOH B 33 -3.065 -0.195 -10.256 1.00 0.00 EP \n+HETATM 304 LP2 HOH B 33 -3.525 0.415 -9.406 1.00 0.00 EP \n+HETATM 305 O HOH B 34 2.823 7.901 -1.527 1.00 0.00 O \n+HETATM 306 H1 HOH B 34 2.726 7.468 -2.376 1.00 0.00 H \n+HETATM 307 H2 HOH B 34 2.700 7.201 -0.886 1.00 0.00 H \n+HETATM 308 LP1 HOH B 34 2.337 8.398 -1.446 1.00 0.00 EP \n+HETATM 309 LP2 HOH B 34 3.459 8.184 -1.465 1.00 0.00 EP \n+HETATM 310 O HOH B 35 8.523 -0.803 -2.439 1.00 0.00 O \n+HETATM 311 H1 HOH B 35 8.018 0.009 -2.388 1.00 0.00 H \n+HETATM 312 H2 HOH B 35 9.436 -0.522 -2.381 1.00 0.00 H \n+HETATM 313 LP1 HOH B 35 8.403 -1.131 -3.046 1.00 0.00 EP \n+HETATM 314 LP2 HOH B 35 8.361 -1.228 -1.908 1.00 0.00 EP \n+HETATM 315 O HOH B 36 -2.472 0.012 6.828 1.00 0.00 O \n+HETATM 316 H1 HOH B 36 -1.737 -0.136 6.233 1.00 0.00 H \n+HETATM 317 H2 HOH B 36 -2.124 -0.192 7.696 1.00 0.00 H \n+HETATM 318 LP1 HOH B 36 -3.007 -0.411 6.670 1.00 0.00 EP \n+HETATM 319 LP2 HOH B 36 -2.685 0.678 6.797 1.00 0.00 EP \n+HETATM 320 O HOH B 37 -3.385 -3.232 -8.772 1.00 0.00 O \n+HETATM 321 H1 HOH B 37 -2.945 -3.232 -9.623 1.00 0.00 H \n+HETATM 322 H2 HOH B 37 -2.896 -2.597 -8.249 1.00 0.00 H \n+HETATM 323 LP1 HOH B 37 -3.358 -3.867 -8.480 1.00 0.00 EP \n+HETATM 324 LP2 HOH B 37 -4.053 -3.034 -8.840 1.00 0.00 EP \n+HETATM 325 O HOH B 38 -7.039 2.024 11.168 1.00 0.00 O \n+HETATM 326 H1 HOH B 38 -7.564 2.217 11.944 1.00 0.00 H \n+HETATM 327 H2 HOH B 38 -6.133 2.082 11.471 1.00 0.00 H \n+HETATM 328 LP1 HOH B 38 -7.161 2.494 10.663 1.00 0.00 EP \n+HETATM 329 LP2 HOH B 38 -7.179 1.382 10.928 1.00 0.00 EP \n+HETATM 330 O HOH B 39 -8.895 2.395 1.201 1.00 0.00 O \n+HETATM 331 H1 HOH B 39 -8.245 2.987 1.579 1.00 0.00 H \n+HETATM 332 H2 HOH B 39 -9.554 2.292 1.889 1.00 0.00 H \n+HETATM 333 LP1 HOH B 39 -8.605 1.777 1.043 1.00 0.00 EP \n+HETATM 334 LP2 HOH B 39 -9.180 2.673 0.626 1.00 0.00 EP \n+HETATM 335 O HOH B 40 -2.690 -9.821 -2.025 1.00 0.00 O \n+HETATM 336 H1 HOH B 40 -1.967 -9.363 -2.454 1.00 0.00 H \n+HETATM 337 H2 HOH B 40 -2.959 -10.489 -2.656 1.00 0.00 H \n+HETATM 338 LP1 HOH B 40 -3.217 -9.381 -1.891 1.00 0.00 EP \n+HETATM 339 LP2 HOH B 40 -2.476 -10.117 -1.428 1.00 0.00 EP \n+HETATM 340 O HOH B 41 -6.143 -6.826 8.555 1.00 0.00 O \n+HETATM 341 H1 HOH B 41 -5.419 -7.220 9.042 1.00 0.00 H \n+HETATM 342 H2 HOH B 41 -5.904 -5.903 8.473 1.00 0.00 H \n+HETATM 343 LP1 HOH B 41 -6.744 -6.895 8.907 1.00 0.00 EP \n+HETATM 344 LP2 HOH B 41 -6.207 -7.122 7.924 1.00 0.00 EP \n+HETATM 345 O HOH B 42 3.654 -2.924 9.727 1.00 0.00 O \n+HETATM 346 H1 HOH B 42 2.808 -3.124 9.327 1.00 0.00 H \n+HETATM 347 H2 HOH B 42 4.049 -3.779 9.894 1.00 0.00 H \n+HETATM 348 LP1 HOH B 42 3.567 -2.570 10.325 1.00 0.00 EP \n+HETATM 349 LP2 HOH B 42 4.052 -2.549 9.290 1.00 0.00 EP \n+HETATM 350 O HOH B 43 4.059 -8.662 5.942 1.00 0.00 O \n+HETATM 351 H1 HOH B 43 4.848 -8.214 6.248 1.00 0.00 H \n+HETATM 352 H2 HOH B 43 3.438 -8.573 6.665 1.00 0.00 H \n+HETATM 353 LP1 HOH B 43 4.192 -9.336 5.812 1.00 0.00 EP \n+HETATM 354 LP2 HOH B 43 3.810 -8.357 5.364 1.00 0.00 EP \n+HETATM 355 O HOH B 44 8.723 -3.045 5.856 1.00 0.00 O \n+HETATM 356 H1 HOH B 44 7.822 -2.870 6.126 1.00 0.00 H \n+HETATM 357 H2 HOH B 44 9.260 -2.678 6.559 1.00 0.00 H \n+HETATM 358 LP1 HOH B 44 8.865 -2.730 5.247 1.00 0.00 EP \n+HETATM 359 LP2 HOH B 44 8.834 -3.733 5.795 1.00 0.00 EP \n+HETATM 360 O HOH B 45 -5.684 3.567 -9.908 1.00 0.00 O \n+HETATM 361 H1 HOH B 45 -5.561 2.729 -9.463 1.00 0.00 H \n+HETATM 362 H2 HOH B 45 -5.216 3.471 -10.737 1.00 0.00 H \n+HETATM 363 LP1 HOH B 45 -5.412 4.090 -9.529 1.00 0.00 EP \n+HETATM 364 LP2 HOH B 45 -6.364 3.690 -10.020 1.00 0.00 EP \n+HETATM 365 O HOH B 46 -2.900 -7.795 -6.866 1.00 0.00 O \n+HETATM 366 H1 HOH B 46 -2.072 -7.706 -6.394 1.00 0.00 H \n+HETATM 367 H2 HOH B 46 -2.743 -8.498 -7.496 1.00 0.00 H \n+HETATM 368 LP1 HOH B 46 -3.063 -7.199 -7.195 1.00 0.00 EP \n+HETATM 369 LP2 HOH B 46 -3.418 -7.968 -6.427 1.00 0.00 EP \n+HETATM 370 O HOH B 47 -0.509 -4.321 9.351 1.00 0.00 O \n+HETATM 371 H1 HOH B 47 0.208 -3.950 8.837 1.00 0.00 H \n+HETATM 372 H2 HOH B 47 -0.081 -4.918 9.965 1.00 0.00 H \n+HETATM 373 LP1 HOH B 47 -0.955 -4.669 8.938 1.00 0.00 EP \n+HETATM 374 LP2 HOH B 47 -0.854 -3.818 9.694 1.00 0.00 EP \n+HETATM 375 O HOH B 48 7.873 4.715 -4.486 1.00 0.00 O \n+HETATM 376 H1 HOH B 48 8.690 4.672 -4.984 1.00 0.00 H \n+HETATM 377 H2 HOH B 48 7.306 5.286 -5.004 1.00 0.00 H \n+HETATM 378 LP1 HOH B 48 7.984 4.987 -3.851 1.00 0.00 EP \n+HETATM 379 LP2 HOH B 48 7.590 4.078 -4.421 1.00 0.00 EP \n+HETATM 380 O HOH B 49 -8.047 0.314 -0.324 1.00 0.00 O \n+HETATM 381 H1 HOH B 49 -8.352 0.987 0.285 1.00 0.00 H \n+HETATM 382 H2 HOH B 49 -7.996 0.761 -1.169 1.00 0.00 H \n+HETATM 383 LP1 HOH B 49 -8.500 -0.218 -0.352 1.00 0.00 EP \n+HETATM 384 LP2 HOH B 49 -7.417 0.075 -0.133 1.00 0.00 EP \n+HETATM 385 O HOH B 50 -7.577 -10.947 -0.797 1.00 0.00 O \n+HETATM 386 H1 HOH B 50 -6.923 -10.822 -1.485 1.00 0.00 H \n+HETATM 387 H2 HOH B 50 -8.287 -11.424 -1.225 1.00 0.00 H \n+HETATM 388 LP1 HOH B 50 -7.804 -10.329 -0.556 1.00 0.00 EP \n+HETATM 389 LP2 HOH B 50 -7.311 -11.320 -0.268 1.00 0.00 EP \n+HETATM 390 O HOH B 51 -9.899 3.302 -1.042 1.00 0.00 O \n+HETATM 391 H1 HOH B 51 -9.628 3.019 -0.168 1.00 0.00 H \n+HETATM 392 H2 HOH B 51 -9.942 4.257 -0.981 1.00 0.00 H \n+HETATM 393 LP1 HOH B 51 -10.525 3.036 -1.206 1.00 0.00 EP \n+HETATM 394 LP2 HOH B 51 -9.429 3.106 -1.522 1.00 0.00 EP \n+HETATM 395 O HOH B 52 -4.170 3.078 -7.076 1.00 0.00 O \n+HETATM 396 H1 HOH B 52 -3.882 3.124 -6.164 1.00 0.00 H \n+HETATM 397 H2 HOH B 52 -3.502 3.560 -7.563 1.00 0.00 H \n+HETATM 398 LP1 HOH B 52 -4.797 3.379 -7.153 1.00 0.00 EP \n+HETATM 399 LP2 HOH B 52 -4.202 2.413 -7.292 1.00 0.00 EP \n+HETATM 400 O HOH B 53 -3.998 3.532 4.629 1.00 0.00 O \n+HETATM 401 H1 HOH B 53 -4.201 2.954 5.365 1.00 0.00 H \n+HETATM 402 H2 HOH B 53 -3.058 3.421 4.489 1.00 0.00 H \n+HETATM 403 LP1 HOH B 53 -4.148 4.197 4.789 1.00 0.00 EP \n+HETATM 404 LP2 HOH B 53 -4.358 3.343 4.059 1.00 0.00 EP \n+HETATM 405 O HOH B 54 -3.759 -8.381 2.305 1.00 0.00 O \n+HETATM 406 H1 HOH B 54 -3.494 -9.048 1.672 1.00 0.00 H \n+HETATM 407 H2 HOH B 54 -2.951 -8.152 2.764 1.00 0.00 H \n+HETATM 408 LP1 HOH B 54 -4.232 -8.638 2.752 1.00 0.00 EP \n+HETATM 409 LP2 HOH B 54 -4.025 -7.822 1.979 1.00 0.00 EP \n+HETATM 410 O HOH B 55 0.050 10.306 -7.119 1.00 0.00 O \n+HETATM 411 H1 HOH B 55 -0.004 9.724 -7.878 1.00 0.00 H \n+HETATM 412 H2 HOH B 55 0.138 11.182 -7.494 1.00 0.00 H \n+HETATM 413 LP1 HOH B 55 0.608 10.148 -6.726 1.00 0.00 EP \n+HETATM 414 LP2 HOH B 55 -0.530 10.259 -6.730 1.00 0.00 EP \n+HETATM 415 O HOH B 56 -8.188 8.904 6.730 1.00 0.00 O \n+HETATM 416 H1 HOH B 56 -7.579 8.815 5.997 1.00 0.00 H \n+HETATM 417 H2 HOH B 56 -8.738 8.122 6.680 1.00 0.00 H \n+HETATM 418 LP1 HOH B 56 -8.575 9.483 6.662 1.00 0.00 EP \n+HETATM 419 LP2 HOH B 56 -7.842 8.925 7.338 1.00 0.00 EP \n+HETATM 420 O HOH B 57 5.656 -3.334 -5.697 1.00 0.00 O \n+HETATM 421 H1 HOH B 57 6.325 -2.936 -5.139 1.00 0.00 H \n+HETATM 422 H2 HOH B 57 6.018 -4.188 -5.934 1.00 0.00 H \n+HETATM 423 LP1 HOH B 57 5.547 -2.945 -6.268 1.00 0.00 EP \n+HETATM 424 LP2 HOH B 57 5.055 -3.409 -5.347 1.00 0.00 EP \n+HETATM 425 O HOH B 58 -6.857 3.469 -6.574 1.00 0.00 O \n+HETATM 426 H1 HOH B 58 -6.007 3.487 -7.014 1.00 0.00 H \n+HETATM 427 H2 HOH B 58 -6.721 2.903 -5.814 1.00 0.00 H \n+HETATM 428 LP1 HOH B 58 -7.349 3.204 -6.995 1.00 0.00 EP \n+HETATM 429 LP2 HOH B 58 -7.045 4.113 -6.372 1.00 0.00 EP \n+HETATM 430 O HOH B 59 2.942 -0.794 -8.771 1.00 0.00 O \n+HETATM 431 H1 HOH B 59 3.609 -1.020 -8.122 1.00 0.00 H \n+HETATM 432 H2 HOH B 59 2.436 -0.092 -8.361 1.00 0.00 H \n+HETATM 433 LP1 HOH B 59 2.534 -1.345 -8.909 1.00 0.00 EP \n+HETATM 434 LP2 HOH B 59 3.240 -0.570 -9.364 1.00 0.00 EP \n+HETATM 435 O HOH B 60 -2.954 7.453 10.052 1.00 0.00 O \n+HETATM 436 H1 HOH B 60 -3.085 6.629 10.522 1.00 0.00 H \n+HETATM 437 H2 HOH B 60 -2.141 7.325 9.564 1.00 0.00 H \n+HETATM 438 LP1 HOH B 60 -2.893 7.986 10.501 1.00 0.00 EP \n+HETATM 439 LP2 HOH B 60 -3.488 7.576 9.616 1.00 0.00 EP \n+HETATM 440 O HOH B 61 -2.732 7.151 -8.583 1.00 0.00 O \n+HETATM 441 H1 HOH B 61 -3.535 6.658 -8.753 1.00 0.00 H \n+HETATM 442 H2 HOH B 61 -3.026 7.939 -8.126 1.00 0.00 H \n+HETATM 443 LP1 HOH B 61 -2.412 7.317 -9.183 1.00 0.00 EP \n+HETATM 444 LP2 HOH B 61 -2.295 6.780 -8.180 1.00 0.00 EP \n+HETATM 445 O HOH B 62 1.104 -9.467 -6.517 1.00 0.00 O \n+HETATM 446 H1 HOH B 62 1.859 -9.062 -6.944 1.00 0.00 H \n+HETATM 447 H2 HOH B 62 0.770 -10.092 -7.161 1.00 0.00 H \n+HETATM 448 LP1 HOH B 62 0.619 -8.986 -6.364 1.00 0.00 EP \n+HETATM 449 LP2 HOH B 62 1.299 -9.796 -5.931 1.00 0.00 EP \n+HETATM 450 O HOH B 63 -3.609 4.037 -2.023 1.00 0.00 O \n+HETATM 451 H1 HOH B 63 -4.187 4.756 -1.766 1.00 0.00 H \n+HETATM 452 H2 HOH B 63 -3.772 3.354 -1.373 1.00 0.00 H \n+HETATM 453 LP1 HOH B 63 -2.939 4.240 -2.006 1.00 0.00 EP \n+HETATM 454 LP2 HOH B 63 -3.768 3.810 -2.666 1.00 0.00 EP \n+HETATM 455 O HOH B 64 -1.653 -3.102 -10.856 1.00 0.00 O \n+HETATM 456 H1 HOH B 64 -1.888 -2.772 -11.724 1.00 0.00 H \n+HETATM 457 H2 HOH B 64 -0.955 -2.519 -10.558 1.00 0.00 H \n+HETATM 458 LP1 HOH B 64 -1.423 -3.762 -10.897 1.00 0.00 EP \n+HETATM 459 LP2 HOH B 64 -2.202 -3.072 -10.423 1.00 0.00 EP \n+HETATM 460 O HOH B 65 1.364 7.819 7.001 1.00 0.00 O \n+HETATM 461 H1 HOH B 65 0.602 7.446 7.444 1.00 0.00 H \n+HETATM 462 H2 HOH B 65 1.193 7.677 6.070 1.00 0.00 H \n+HETATM 463 LP1 HOH B 65 1.950 7.490 7.198 1.00 0.00 EP \n+HETATM 464 LP2 HOH B 65 1.422 8.502 7.141 1.00 0.00 EP \n+HETATM 465 O HOH B 66 2.810 -5.564 -4.563 1.00 0.00 O \n+HETATM 466 H1 HOH B 66 3.333 -5.973 -5.253 1.00 0.00 H \n+HETATM 467 H2 HOH B 66 2.961 -6.112 -3.792 1.00 0.00 H \n+HETATM 468 LP1 HOH B 66 2.132 -5.561 -4.735 1.00 0.00 EP \n+HETATM 469 LP2 HOH B 66 3.024 -4.908 -4.446 1.00 0.00 EP \n+HETATM 470 O HOH B 67 -8.559 -11.980 -3.138 1.00 0.00 O \n+HETATM 471 H1 HOH B 67 -8.401 -12.919 -3.238 1.00 0.00 H \n+HETATM 472 H2 HOH B 67 -7.736 -11.569 -3.402 1.00 0.00 H \n+HETATM 473 LP1 HOH B 67 -8.711 -11.825 -2.472 1.00 0.00 EP \n+HETATM 474 LP2 HOH B 67 -9.083 -11.772 -3.552 1.00 0.00 EP \n+HETATM 475 O HOH B 68 -8.467 1.830 -2.642 1.00 0.00 O \n+HETATM 476 H1 HOH B 68 -9.139 1.520 -3.250 1.00 0.00 H \n+HETATM 477 H2 HOH B 68 -8.911 2.491 -2.111 1.00 0.00 H \n+HETATM 478 LP1 HOH B 68 -7.930 2.113 -2.991 1.00 0.00 EP \n+HETATM 479 LP2 HOH B 68 -8.235 1.305 -2.242 1.00 0.00 EP \n+HETATM 480 O HOH B 69 -6.312 0.459 7.372 1.00 0.00 O \n+HETATM 481 H1 HOH B 69 -5.740 1.214 7.235 1.00 0.00 H \n+HETATM 482 H2 HOH B 69 -5.805 -0.287 7.052 1.00 0.00 H \n+HETATM 483 LP1 HOH B 69 -6.906 0.529 7.008 1.00 0.00 EP \n+HETATM 484 LP2 HOH B 69 -6.463 0.383 8.051 1.00 0.00 EP \n+HETATM 485 O HOH B 70 -6.709 -9.946 1.989 1.00 0.00 O \n+HETATM 486 H1 HOH B 70 -7.101 -10.517 2.651 1.00 0.00 H \n+HETATM 487 H2 HOH B 70 -6.029 -10.483 1.582 1.00 0.00 H \n+HETATM 488 LP1 HOH B 70 -6.431 -9.377 2.287 1.00 0.00 EP \n+HETATM 489 LP2 HOH B 70 -7.187 -9.752 1.516 1.00 0.00 EP \n+HETATM 490 O HOH B 71 6.414 -10.302 2.994 1.00 0.00 O \n+HETATM 491 H1 HOH B 71 7.251 -10.703 3.229 1.00 0.00 H \n+HETATM 492 H2 HOH B 71 6.528 -9.373 3.192 1.00 0.00 H \n+HETATM 493 LP1 HOH B 71 5.894 -10.574 3.375 1.00 0.00 EP \n+HETATM 494 LP2 HOH B 71 6.278 -10.395 2.314 1.00 0.00 EP \n+HETATM 495 O HOH B 72 -0.316 4.563 -6.362 1.00 0.00 O \n+HETATM 496 H1 HOH B 72 -0.674 5.201 -5.745 1.00 0.00 H \n+HETATM 497 H2 HOH B 72 0.522 4.937 -6.635 1.00 0.00 H \n+HETATM 498 LP1 HOH B 72 -0.742 4.484 -6.912 1.00 0.00 EP \n+HETATM 499 LP2 HOH B 72 -0.220 3.944 -6.050 1.00 0.00 EP \n+HETATM 500 O HOH B 73 -8.246 4.102 -10.099 1.00 0.00 O \n+HETATM 501 H1 HOH B 73 -7.307 3.918 -10.085 1.00 0.00 H \n+HETATM 502 H2 HOH B 73 -8.303 5.057 -10.133 1.00 0.00 H \n+HETATM 503 LP1 HOH B 73 -8.555 3.855 -9.522 1.00 0.00 EP \n+HETATM 504 LP2 HOH B 73 -8.545 3.816 -10.664 1.00 0.00 EP \n+HETATM 505 O HOH B 74 -5.048 -9.138 -0.972 1.00 0.00 O \n+HETATM 506 H1 HOH B 74 -4.121 -9.117 -1.211 1.00 0.00 H \n+HETATM 507 H2 HOH B 74 -5.508 -9.251 -1.804 1.00 0.00 H \n+HETATM 508 LP1 HOH B 74 -5.237 -8.538 -0.664 1.00 0.00 EP \n+HETATM 509 LP2 HOH B 74 -5.180 -9.673 -0.541 1.00 0.00 EP \n+HETATM 510 O HOH B 75 0.322 3.366 6.116 1.00 0.00 O \n+HETATM 511 H1 HOH B 75 1.036 3.062 6.676 1.00 0.00 H \n+HETATM 512 H2 HOH B 75 0.213 2.671 5.466 1.00 0.00 H \n+HETATM 513 LP1 HOH B 75 0.490 3.970 5.806 1.00 0.00 EP \n+HETATM 514 LP2 HOH B 75 -0.265 3.450 6.488 1.00 0.00 EP \n+HETATM 515 O HOH B 76 2.776 -7.168 -11.594 1.00 0.00 O \n+HETATM 516 H1 HOH B 76 2.873 -6.715 -10.757 1.00 0.00 H \n+HETATM 517 H2 HOH B 76 3.629 -7.075 -12.018 1.00 0.00 H \n+HETATM 518 LP1 HOH B 76 2.274 -6.870 -11.981 1.00 0.00 EP \n+HETATM 519 LP2 HOH B 76 2.622 -7.844 -11.493 1.00 0.00 EP \n+HETATM 520 O HOH B 77 -6.917 -0.544 -8.412 1.00 0.00 O \n+HETATM 521 H1 HOH B 77 -7.376 -0.249 -7.626 1.00 0.00 H \n+HETATM 522 H2 HOH B 77 -6.254 0.128 -8.570 1.00 0.00 H \n+HETATM 523 LP1 HOH B 77 -7.359 -0.589 -8.954 1.00 0.00 EP \n+HETATM 524 LP2 HOH B 77 -6.617 -1.167 -8.304 1.00 0.00 EP \n+HETATM 525 O HOH B 78 6.839 0.459 3.803 1.00 0.00 O \n+HETATM 526 H1 HOH B 78 6.627 1.244 3.297 1.00 0.00 H \n+HETATM 527 H2 HOH B 78 6.458 0.620 4.666 1.00 0.00 H \n+HETATM 528 LP1 HOH B 78 7.532 0.375 3.849 1.00 0.00 EP \n+HETATM 529 LP2 HOH B 78 6.554 -0.109 3.509 1.00 0.00 EP \n+HETATM 530 O HOH B 79 -1.523 -1.315 -7.944 1.00 0.00 O \n+HETATM 531 H1 HOH B 79 -1.264 -1.054 -7.060 1.00 0.00 H \n+HETATM 532 H2 HOH B 79 -0.711 -1.613 -8.354 1.00 0.00 H \n+HETATM 533 LP1 HOH B 79 -1.791 -0.771 -8.293 1.00 0.00 EP \n+HETATM 534 LP2 HOH B 79 -1.993 -1.833 -7.921 1.00 0.00 EP \n+HETATM 535 O HOH B 80 3.996 8.019 3.922 1.00 0.00 O \n+HETATM 536 H1 HOH B 80 4.681 7.385 4.135 1.00 0.00 H \n+HETATM 537 H2 HOH B 80 4.199 8.301 3.030 1.00 0.00 H \n+HETATM 538 LP1 HOH B 80 4.015 8.562 4.364 1.00 0.00 EP \n+HETATM 539 LP2 HOH B 80 3.364 7.719 3.949 1.00 0.00 EP \n+HETATM 540 O HOH B 81 -4.987 -7.734 -5.271 1.00 0.00 O \n+HETATM 541 H1 HOH B 81 -5.006 -8.556 -4.781 1.00 0.00 H \n+HETATM 542 H2 HOH B 81 -4.218 -7.809 -5.836 1.00 0.00 H \n+HETATM 543 LP1 HOH B 81 -4.923 -7.189 -4.837 1.00 0.00 EP \n+HETATM 544 LP2 HOH B 81 -5.568 -7.660 -5.654 1.00 0.00 EP \n+HETATM 545 O HOH B 82 8.233 3.743 -8.237 1.00 0.00 O \n+HETATM 546 H1 HOH B 82 8.124 4.267 -9.031 1.00 0.00 H \n+HETATM 547 H2 HOH B 82 7.349 3.661 -7.880 1.00 0.00 H \n+HETATM 548 LP1 HOH B 82 8.655 4.068 -7.783 1.00 0.00 EP \n+HETATM 549 LP2 HOH B 82 8.497 3.113 -8.391 1.00 0.00 EP \n+HETATM 550 O HOH B 83 5.303 -1.174 -7.329 1.00 0.00 O \n+HETATM 551 H1 HOH B 83 5.627 -0.543 -6.686 1.00 0.00 H \n+HETATM 552 H2 HOH B 83 5.376 -2.022 -6.891 1.00 0.00 H \n+HETATM 553 LP1 HOH B 83 5.695 -1.160 -7.908 1.00 0.00 EP \n+HETATM 554 LP2 HOH B 83 4.637 -1.038 -7.494 1.00 0.00 EP \n+HETATM 555 O HOH B 84 -5.443 5.867 -1.568 1.00 0.00 O \n+HETATM 556 H1 HOH B 84 -5.657 5.976 -0.641 1.00 0.00 H \n+HETATM 557 H2 HOH B 84 -6.239 5.503 -1.956 1.00 0.00 H \n+HETATM 558 LP1 HOH B 84 -4.905 5.426 -1.647 1.00 0.00 EP \n+HETATM 559 LP2 HOH B 84 -5.285 6.483 -1.860 1.00 0.00 EP \n+HETATM 560 O HOH B 85 -5.335 10.056 2.205 1.00 0.00 O \n+HETATM 561 H1 HOH B 85 -5.056 10.351 3.072 1.00 0.00 H \n+HETATM 562 H2 HOH B 85 -5.167 10.804 1.632 1.00 0.00 H \n+HETATM 563 LP1 HOH B 85 -6.015 9.893 2.206 1.00 0.00 EP \n+HETATM 564 LP2 HOH B 85 -4.962 9.500 2.001 1.00 0.00 EP \n+HETATM 565 O HOH B 86 -5.091 1.252 -8.748 1.00 0.00 O \n+HETATM 566 H1 HOH B 86 -4.691 1.647 -7.973 1.00 0.00 H \n+HETATM 567 H2 HOH B 86 -4.368 0.806 -9.190 1.00 0.00 H \n+HETATM 568 LP1 HOH B 86 -5.368 1.744 -9.161 1.00 0.00 EP \n+HETATM 569 LP2 HOH B 86 -5.588 0.795 -8.564 1.00 0.00 EP \n+HETATM 570 O HOH B 87 4.476 -6.393 -6.319 1.00 0.00 O \n+HETATM 571 H1 HOH B 87 5.357 -6.481 -5.956 1.00 0.00 H \n+HETATM 572 H2 HOH B 87 4.289 -7.248 -6.706 1.00 0.00 H \n+HETATM 573 LP1 HOH B 87 4.458 -5.891 -6.807 1.00 0.00 EP \n+HETATM 574 LP2 HOH B 87 4.015 -6.244 -5.814 1.00 0.00 EP \n+HETATM 575 O HOH B 88 4.292 -1.083 7.818 1.00 0.00 O \n+HETATM 576 H1 HOH B 88 4.095 -1.651 8.564 1.00 0.00 H \n+HETATM 577 H2 HOH B 88 4.432 -0.219 8.205 1.00 0.00 H \n+HETATM 578 LP1 HOH B 88 3.755 -1.070 7.369 1.00 0.00 EP \n+HETATM 579 LP2 HOH B 88 4.868 -1.302 7.487 1.00 0.00 EP \n+HETATM 580 O HOH B 89 2.895 -5.159 6.464 1.00 0.00 O \n+HETATM 581 H1 HOH B 89 3.841 -5.038 6.543 1.00 0.00 H \n+HETATM 582 H2 HOH B 89 2.714 -5.959 6.959 1.00 0.00 H \n+HETATM 583 LP1 HOH B 89 2.710 -5.237 5.794 1.00 0.00 EP \n+HETATM 584 LP2 HOH B 89 2.552 -4.615 6.740 1.00 0.00 EP \n+HETATM 585 O HOH B 90 -6.139 -3.066 -8.599 1.00 0.00 O \n+HETATM 586 H1 HOH B 90 -5.208 -3.084 -8.820 1.00 0.00 H \n+HETATM 587 H2 HOH B 90 -6.340 -2.138 -8.482 1.00 0.00 H \n+HETATM 588 LP1 HOH B 90 -6.261 -3.422 -8.009 1.00 0.00 EP \n+HETATM 589 LP2 HOH B 90 -6.522 -3.339 -9.119 1.00 0.00 EP \n+HETATM 590 O HOH B 91 -5.543 -4.326 8.171 1.00 0.00 O \n+HETATM 591 H1 HOH B 91 -5.168 -3.905 8.944 1.00 0.00 H \n+HETATM 592 H2 HOH B 91 -4.905 -4.165 7.476 1.00 0.00 H \n+HETATM 593 LP1 HOH B 91 -6.162 -4.041 8.010 1.00 0.00 EP \n+HETATM 594 LP2 HOH B 91 -5.624 -5.013 8.279 1.00 0.00 EP \n+HETATM 595 O HOH B 92 -6.607 -4.945 -6.785 1.00 0.00 O \n+HETATM 596 H1 HOH B 92 -6.521 -4.101 -7.229 1.00 0.00 H \n+HETATM 597 H2 HOH B 92 -5.718 -5.299 -6.768 1.00 0.00 H \n+HETATM 598 LP1 HOH B 92 -7.035 -5.369 -7.141 1.00 0.00 EP \n+HETATM 599 LP2 HOH B 92 -6.852 -4.859 -6.135 1.00 0.00 EP \n+HETATM 600 O HOH B 93 7.005 7.200 10.234 1.00 0.00 O \n+HETATM 601 H1 HOH B 93 6.420 7.919 9.995 1.00 0.00 H \n+HETATM 602 H2 HOH B 93 7.060 6.662 9.444 1.00 0.00 H \n+HETATM 603 LP1 HOH B 93 6.739 6.832 10.767 1.00 0.00 EP \n+HETATM 604 LP2 HOH B 93 7.637 7.444 10.412 1.00 0.00 EP \n+HETATM 605 O HOH B 94 6.461 1.093 6.399 1.00 0.00 O \n+HETATM 606 H1 HOH B 94 6.755 0.409 7.000 1.00 0.00 H \n+HETATM 607 H2 HOH B 94 5.723 1.506 6.848 1.00 0.00 H \n+HETATM 608 LP1 HOH B 94 6.255 0.815 5.790 1.00 0.00 EP \n+HETATM 609 LP2 HOH B 94 6.971 1.558 6.283 1.00 0.00 EP \n+HETATM 610 O HOH B 95 4.779 1.561 8.483 1.00 0.00 O \n+HETATM 611 H1 HOH B 95 5.068 2.224 9.110 1.00 0.00 H \n+HETATM 612 H2 HOH B 95 3.833 1.690 8.417 1.00 0.00 H \n+HETATM 613 LP1 HOH B 95 4.925 0.918 8.717 1.00 0.00 EP \n+HETATM 614 LP2 HOH B 95 5.086 1.658 7.861 1.00 0.00 EP \n+HETATM 615 O HOH B 96 3.225 -8.315 -7.781 1.00 0.00 O \n+HETATM 616 H1 HOH B 96 3.650 -8.925 -8.384 1.00 0.00 H \n+HETATM 617 H2 HOH B 96 3.025 -7.548 -8.317 1.00 0.00 H \n+HETATM 618 LP1 HOH B 96 3.655 -8.145 -7.257 1.00 0.00 EP \n+HETATM 619 LP2 HOH B 96 2.638 -8.595 -7.521 1.00 0.00 EP \n+HETATM 620 O HOH B 97 -1.349 -0.181 9.264 1.00 0.00 O \n+HETATM 621 H1 HOH B 97 -0.420 0.036 9.187 1.00 0.00 H \n+HETATM 622 H2 HOH B 97 -1.725 0.547 9.758 1.00 0.00 H \n+HETATM 623 LP1 HOH B 97 -1.434 -0.785 9.608 1.00 0.00 EP \n+HETATM 624 LP2 HOH B 97 -1.645 -0.230 8.631 1.00 0.00 EP \n+HETATM 625 O HOH B 98 5.522 -5.011 6.579 1.00 0.00 O \n+HETATM 626 H1 HOH B 98 5.939 -5.417 7.339 1.00 0.00 H \n+HETATM 627 H2 HOH B 98 5.819 -4.101 6.600 1.00 0.00 H \n+HETATM 628 LP1 HOH B 98 4.824 -5.044 6.632 1.00 0.00 EP \n+HETATM 629 LP2 HOH B 98 5.726 -5.324 5.988 1.00 0.00 EP \n+HETATM 630 O HOH B 99 0.154 5.174 4.070 1.00 0.00 O \n+HETATM 631 H1 HOH B 99 0.326 4.498 3.414 1.00 0.00 H \n+HETATM 632 H2 HOH B 99 0.196 4.712 4.907 1.00 0.00 H \n+HETATM 633 LP1 HOH B 99 -0.480 5.455 3.974 1.00 0.00 EP \n+HETATM 634 LP2 HOH B 99 0.639 5.677 4.040 1.00 0.00 EP \n+HETATM 635 O HOH B 100 7.066 -2.020 2.774 1.00 0.00 O \n+HETATM 636 H1 HOH B 100 6.805 -1.193 3.180 1.00 0.00 H \n+HETATM 637 H2 HOH B 100 7.018 -1.851 1.833 1.00 0.00 H \n+HETATM 638 LP1 HOH B 100 6.628 -2.534 2.956 1.00 0.00 EP \n+HETATM 639 LP2 HOH B 100 7.718 -2.192 2.961 1.00 0.00 EP \n+HETATM 640 O HOH B 101 -6.898 9.775 -9.609 1.00 0.00 O \n+HETATM 641 H1 HOH B 101 -6.662 9.957 -8.699 1.00 0.00 H \n+HETATM 642 H2 HOH B 101 -7.846 9.903 -9.641 1.00 0.00 H \n+HETATM 643 LP1 HOH B 101 -6.732 9.117 -9.781 1.00 0.00 EP \n+HETATM 644 LP2 HOH B 101 -6.574 10.219 -10.042 1.00 0.00 EP \n+HETATM 645 O HOH B 102 -11.056 5.508 -9.714 1.00 0.00 O \n+HETATM 646 H1 HOH B 102 -10.400 6.138 -10.012 1.00 0.00 H \n+HETATM 647 H2 HOH B 102 -10.826 4.692 -10.158 1.00 0.00 H \n+HETATM 648 LP1 HOH B 102 -11.699 5.716 -9.896 1.00 0.00 EP \n+HETATM 649 LP2 HOH B 102 -11.025 5.429 -9.019 1.00 0.00 EP \n+HETATM 650 O HOH B 103 -5.253 -5.669 11.601 1.00 0.00 O \n+HETATM 651 H1 HOH B 103 -5.156 -6.160 12.417 1.00 0.00 H \n+HETATM 652 H2 HOH B 103 -6.186 -5.460 11.556 1.00 0.00 H \n+HETATM 653 LP1 HOH B 103 -5.061 -6.060 11.053 1.00 0.00 EP \n+HETATM 654 LP2 HOH B 103 -4.869 -5.084 11.616 1.00 0.00 EP \n+HETATM 655 O HOH B 104 -10.075 0.017 -8.099 1.00 0.00 O \n+HETATM 656 H1 HOH B 104 -11.021 0.154 -8.039 1.00 0.00 H \n+HETATM 657 H2 HOH B 104 -9.705 0.900 -8.110 1.00 0.00 H \n+HETATM 658 LP1 HOH B 104 -9.911 -0.327 -8.686 1.00 0.00 EP \n+HETATM 659 LP2 HOH B 104 -9.842 -0.341 -7.545 1.00 0.00 EP \n+HETATM 660 O HOH B 105 6.293 -7.750 3.605 1.00 0.00 O \n+HETATM 661 H1 HOH B 105 6.573 -6.994 3.088 1.00 0.00 H \n+HETATM 662 H2 HOH B 105 5.336 -7.716 3.581 1.00 0.00 H \n+HETATM 663 LP1 HOH B 105 6.526 -7.699 4.263 1.00 0.00 EP \n+HETATM 664 LP2 HOH B 105 6.527 -8.345 3.320 1.00 0.00 EP \n+HETATM 665 O HOH B 106 -2.048 -2.493 10.538 1.00 0.00 O \n+HETATM 666 H1 HOH B 106 -1.497 -3.124 10.076 1.00 0.00 H \n+HETATM 667 H2 HOH B 106 -1.827 -1.648 10.146 1.00 0.00 H \n+HETATM 668 LP1 HOH B 106 -1.904 -2.493 11.223 1.00 0.00 EP \n+HETATM 669 LP2 HOH B 106 -2.726 -2.640 10.443 1.00 0.00 EP \n+HETATM 670 O HOH B 107 -9.324 -5.176 1.094 1.00 0.00 O \n+HETATM 671 H1 HOH B 107 -9.694 -4.414 1.539 1.00 0.00 H \n+HETATM 672 H2 HOH B 107 -9.459 -4.999 0.163 1.00 0.00 H \n+HETATM 673 LP1 HOH B 107 -9.657 -5.761 1.285 1.00 0.00 EP \n+HETATM 674 LP2 HOH B 107 -8.641 -5.239 1.237 1.00 0.00 EP \n+HETATM 675 O HOH B 108 -2.095 -9.470 -8.835 1.00 0.00 O \n+HETATM 676 H1 HOH B 108 -2.596 -9.457 -9.650 1.00 0.00 H \n+HETATM 677 H2 HOH B 108 -1.359 -8.880 -8.997 1.00 0.00 H \n+HETATM 678 LP1 HOH B 108 -1.867 -10.117 -8.695 1.00 0.00 EP \n+HETATM 679 LP2 HOH B 108 -2.484 -9.240 -8.301 1.00 0.00 EP \n+HETATM 680 O HOH B 109 -1.307 -8.043 10.933 1.00 0.00 O \n+HETATM 681 H1 HOH B 109 -0.692 -7.312 10.993 1.00 0.00 H \n+HETATM 682 H2 HOH B 109 -0.772 -8.784 10.647 1.00 0.00 H \n+HETATM 683 LP1 HOH B 109 -1.810 -7.906 10.466 1.00 0.00 EP \n+HETATM 684 LP2 HOH B 109 -1.597 -8.174 11.557 1.00 0.00 EP \n+HETATM 685 O HOH B 110 -7.404 -9.960 9.729 1.00 0.00 O \n+HETATM 686 H1 HOH B 110 -6.569 -9.607 10.037 1.00 0.00 H \n+HETATM 687 H2 HOH B 110 -8.011 -9.809 10.454 1.00 0.00 H \n+HETATM 688 LP1 HOH B 110 -7.348 -10.644 9.592 1.00 0.00 EP \n+HETATM 689 LP2 HOH B 110 -7.617 -9.623 9.153 1.00 0.00 EP \n+HETATM 690 O HOH B 111 -4.324 3.817 -4.527 1.00 0.00 O \n+HETATM 691 H1 HOH B 111 -5.112 3.319 -4.310 1.00 0.00 H \n+HETATM 692 H2 HOH B 111 -3.856 3.900 -3.697 1.00 0.00 H \n+HETATM 693 LP1 HOH B 111 -4.492 4.448 -4.781 1.00 0.00 EP \n+HETATM 694 LP2 HOH B 111 -3.935 3.473 -4.997 1.00 0.00 EP \n+HETATM 695 O HOH B 112 -0.411 -0.590 5.330 1.00 0.00 O \n+HETATM 696 H1 HOH B 112 0.357 -0.823 5.851 1.00 0.00 H \n+HETATM 697 H2 HOH B 112 -0.125 0.155 4.801 1.00 0.00 H \n+HETATM 698 LP1 HOH B 112 -0.946 -0.408 5.744 1.00 0.00 EP \n+HETATM 699 LP2 HOH B 112 -0.604 -1.124 4.920 1.00 0.00 EP \n+HETATM 700 O HOH B 113 -4.610 -3.271 10.375 1.00 0.00 O \n+HETATM 701 H1 HOH B 113 -4.599 -3.989 11.008 1.00 0.00 H \n+HETATM 702 H2 HOH B 113 -3.735 -2.887 10.432 1.00 0.00 H \n+HETATM 703 LP1 HOH B 113 -5.098 -2.798 10.544 1.00 0.00 EP \n+HETATM 704 LP2 HOH B 113 -4.733 -3.512 9.729 1.00 0.00 EP \n+HETATM 705 O HOH B 114 1.554 1.388 -8.115 1.00 0.00 O \n+HETATM 706 H1 HOH B 114 2.236 2.022 -8.338 1.00 0.00 H \n+HETATM 707 H2 HOH B 114 0.921 1.454 -8.830 1.00 0.00 H \n+HETATM 708 LP1 HOH B 114 1.255 1.552 -7.504 1.00 0.00 EP \n+HETATM 709 LP2 HOH B 114 1.820 0.741 -8.078 1.00 0.00 EP \n+HETATM 710 O HOH B 115 -4.695 -1.230 6.100 1.00 0.00 O \n+HETATM 711 H1 HOH B 115 -3.872 -0.750 6.195 1.00 0.00 H \n+HETATM 712 H2 HOH B 115 -4.475 -2.132 6.336 1.00 0.00 H \n+HETATM 713 LP1 HOH B 115 -4.926 -1.197 5.440 1.00 0.00 EP \n+HETATM 714 LP2 HOH B 115 -5.183 -0.973 6.531 1.00 0.00 EP \n+HETATM 715 O HOH B 116 -4.589 2.744 11.855 1.00 0.00 O \n+HETATM 716 H1 HOH B 116 -4.334 3.330 11.142 1.00 0.00 H \n+HETATM 717 H2 HOH B 116 -3.830 2.175 11.981 1.00 0.00 H \n+HETATM 718 LP1 HOH B 116 -5.152 2.368 11.676 1.00 0.00 EP \n+HETATM 719 LP2 HOH B 116 -4.726 3.107 12.437 1.00 0.00 EP \n+HETATM 720 O HOH B 117 6.840 -3.545 -9.304 1.00 0.00 O \n+HETATM 721 H1 HOH B 117 7.343 -3.093 -8.627 1.00 0.00 H \n+HETATM 722 H2 HOH B 117 7.068 -3.091 -10.116 1.00 0.00 H \n+HETATM 723 LP1 HOH B 117 6.154 -3.495 -9.177 1.00 0.00 EP \n+HETATM 724 LP2 HOH B 117 7.022 -4.220 -9.339 1.00 0.00 EP \n+HETATM 725 O HOH B 118 -7.748 5.673 -5.304 1.00 0.00 O \n+HETATM 726 H1 HOH B 118 -7.192 6.433 -5.479 1.00 0.00 H \n+HETATM 727 H2 HOH B 118 -7.419 4.995 -5.894 1.00 0.00 H \n+HETATM 728 LP1 HOH B 118 -8.418 5.819 -5.444 1.00 0.00 EP \n+HETATM 729 LP2 HOH B 118 -7.687 5.471 -4.637 1.00 0.00 EP \n+HETATM 730 O HOH B 119 -5.092 -6.838 4.844 1.00 0.00 O \n+HETATM 731 H1 HOH B 119 -5.082 -5.887 4.733 1.00 0.00 H \n+HETATM 732 H2 HOH B 119 -4.214 -7.052 5.159 1.00 0.00 H \n+HETATM 733 LP1 HOH B 119 -5.220 -7.156 4.234 1.00 0.00 EP \n+HETATM 734 LP2 HOH B 119 -5.576 -7.027 5.313 1.00 0.00 EP \n+HETATM 735 O HOH B 120 2.503 3.864 -4.552 1.00 0.00 O \n+HETATM 736 H1 HOH B 120 1.870 3.160 -4.697 1.00 0.00 H \n+HETATM 737 H2 HOH B 120 3.231 3.442 -4.095 1.00 0.00 H \n+HETATM 738 LP1 HOH B 120 2.223 4.370 -4.157 1.00 0.00 EP \n+HETATM 739 LP2 HOH B 120 2.716 4.134 -5.161 1.00 0.00 EP \n+HETATM 740 O HOH B 121 2.531 -9.404 1.640 1.00 0.00 O \n+HETATM 741 H1 HOH B 121 3.025 -10.223 1.657 1.00 0.00 H \n+HETATM 742 H2 HOH B 121 2.898 -8.887 2.357 1.00 0.00 H \n+HETATM 743 LP1 HOH B 121 1.849 -9.524 1.745 1.00 0.00 EP \n+HETATM 744 LP2 HOH B 121 2.618 -9.075 1.028 1.00 0.00 EP \n+HETATM 745 O HOH B 122 -7.746 -0.003 9.621 1.00 0.00 O \n+HETATM 746 H1 HOH B 122 -7.519 0.651 10.282 1.00 0.00 H \n+HETATM 747 H2 HOH B 122 -7.166 0.188 8.884 1.00 0.00 H \n+HETATM 748 LP1 HOH B 122 -8.417 0.059 9.431 1.00 0.00 EP \n+HETATM 749 LP2 HOH B 122 -7.632 -0.650 9.864 1.00 0.00 EP \n+HETATM 750 O HOH B 123 3.061 11.541 -2.591 1.00 0.00 O \n+HETATM 751 H1 HOH B 123 3.994 11.327 -2.583 1.00 0.00 H \n+HETATM 752 H2 HOH B 123 3.034 12.497 -2.545 1.00 0.00 H \n+HETATM 753 LP1 HOH B 123 2.737 11.258 -2.039 1.00 0.00 EP \n+HETATM 754 LP2 HOH B 123 2.760 11.313 -3.181 1.00 0.00 EP \n+HETATM 755 O HOH B 124 5.943 5.508 11.923 1.00 0.00 O \n+HETATM 756 H1 HOH B 124 6.596 5.325 12.599 1.00 0.00 H \n+HETATM 757 H2 HOH B 124 6.331 6.210 11.399 1.00 0.00 H \n+HETATM 758 LP1 HOH B 124 5.341 5.719 12.211 1.00 0.00 EP \n+HETATM 759 LP2 HOH B 124 5.828 4.941 11.530 1.00 0.00 EP \n+HETATM 760 O HOH B 125 -1.899 2.625 -10.253 1.00 0.00 O \n+HETATM 761 H1 HOH B 125 -0.963 2.644 -10.454 1.00 0.00 H \n+HETATM 762 H2 HOH B 125 -2.005 3.259 -9.544 1.00 0.00 H \n+HETATM 763 LP1 HOH B 125 -2.094 1.986 -10.045 1.00 0.00 EP \n+HETATM 764 LP2 HOH B 125 -2.276 2.813 -10.812 1.00 0.00 EP \n+HETATM 765 O HOH B 126 -7.957 -3.576 7.592 1.00 0.00 O \n+HETATM 766 H1 HOH B 126 -8.292 -3.250 8.427 1.00 0.00 H \n+HETATM 767 H2 HOH B 126 -7.025 -3.729 7.751 1.00 0.00 H \n+HETATM 768 LP1 HOH B 126 -8.046 -3.100 7.086 1.00 0.00 EP \n+HETATM 769 LP2 HOH B 126 -8.278 -4.171 7.412 1.00 0.00 EP \n+HETATM 770 O HOH B 127 2.389 8.360 -9.381 1.00 0.00 O \n+HETATM 771 H1 HOH B 127 1.442 8.327 -9.520 1.00 0.00 H \n+HETATM 772 H2 HOH B 127 2.735 7.644 -9.914 1.00 0.00 H \n+HETATM 773 LP1 HOH B 127 2.543 8.262 -8.705 1.00 0.00 EP \n+HETATM 774 LP2 HOH B 127 2.649 8.974 -9.593 1.00 0.00 EP \n+HETATM 775 O HOH B 128 2.860 4.671 9.136 1.00 0.00 O \n+HETATM 776 H1 HOH B 128 3.685 4.346 9.497 1.00 0.00 H \n+HETATM 777 H2 HOH B 128 2.431 3.893 8.780 1.00 0.00 H \n+HETATM 778 LP1 HOH B 128 2.979 5.141 8.632 1.00 0.00 EP \n+HETATM 779 LP2 HOH B 128 2.469 4.961 9.638 1.00 0.00 EP \n+HETATM 780 O HOH B 129 1.705 -9.429 -10.578 1.00 0.00 O \n+HETATM 781 H1 HOH B 129 2.346 -9.929 -10.072 1.00 0.00 H \n+HETATM 782 H2 HOH B 129 2.230 -8.802 -11.076 1.00 0.00 H \n+HETATM 783 LP1 HOH B 129 1.260 -9.097 -10.153 1.00 0.00 EP \n+HETATM 784 LP2 HOH B 129 1.347 -9.849 -11.008 1.00 0.00 EP \n+HETATM 785 O HOH B 130 -10.167 -7.390 7.927 1.00 0.00 O \n+HETATM 786 H1 HOH B 130 -11.008 -7.619 8.323 1.00 0.00 H \n+HETATM 787 H2 HOH B 130 -9.677 -6.967 8.632 1.00 0.00 H \n+HETATM 788 LP1 HOH B 130 -10.259 -6.950 7.391 1.00 0.00 EP \n+HETATM 789 LP2 HOH B 130 -9.835 -7.964 7.704 1.00 0.00 EP \n+HETATM 790 O HOH B 131 1.415 7.478 4.359 1.00 0.00 O \n+HETATM 791 H1 HOH B 131 1.147 6.583 4.153 1.00 0.00 H \n+HETATM 792 H2 HOH B 131 2.361 7.485 4.215 1.00 0.00 H \n+HETATM 793 LP1 HOH B 131 1.265 7.635 5.024 1.00 0.00 EP \n+HETATM 794 LP2 HOH B 131 1.097 7.935 3.934 1.00 0.00 EP \n+HETATM 795 O HOH B 132 -11.397 -7.187 -0.982 1.00 0.00 O \n+HETATM 796 H1 HOH B 132 -10.900 -7.071 -1.792 1.00 0.00 H \n+HETATM 797 H2 HOH B 132 -11.825 -6.343 -0.840 1.00 0.00 H \n+HETATM 798 LP1 HOH B 132 -10.969 -7.341 -0.450 1.00 0.00 EP \n+HETATM 799 LP2 HOH B 132 -11.871 -7.697 -1.055 1.00 0.00 EP \n+HETATM 800 O HOH B 133 -2.097 8.444 7.155 1.00 0.00 O \n+HETATM 801 H1 HOH B 133 -1.340 8.072 7.608 1.00 0.00 H \n+HETATM 802 H2 HOH B 133 -2.734 7.730 7.125 1.00 0.00 H \n+HETATM 803 LP1 HOH B 133 -1.923 8.648 6.508 1.00 0.00 EP \n+HETATM 804 LP2 HOH B 133 -2.355 8.990 7.510 1.00 0.00 EP \n+HETATM 805 O HOH B 134 -9.473 6.028 -1.226 1.00 0.00 O \n+HETATM 806 H1 HOH B 134 -9.070 6.684 -0.657 1.00 0.00 H \n+HETATM 807 H2 HOH B 134 -8.747 5.681 -1.744 1.00 0.00 H \n+HETATM 808 LP1 HOH B 134 -9.954 6.322 -1.641 1.00 0.00 EP \n+HETATM 809 LP2 HOH B 134 -9.771 5.521 -0.847 1.00 0.00 EP \n+HETATM 810 O HOH B 135 0.669 2.092 -5.743 1.00 0.00 O \n+HETATM 811 H1 HOH B 135 1.053 1.887 -6.596 1.00 0.00 H \n+HETATM 812 H2 HOH B 135 0.092 2.837 -5.913 1.00 0.00 H \n+HETATM 813 LP1 HOH B 135 1.167 2.265 -5.283 1.00 0.00 EP \n+HETATM 814 LP2 HOH B 135 0.304 1.547 -5.499 1.00 0.00 EP \n+HETATM 815 O HOH B 136 -9.778 -7.871 0.980 1.00 0.00 O \n+HETATM 816 H1 HOH B 136 -10.466 -7.800 0.318 1.00 0.00 H \n+HETATM 817 H2 HOH B 136 -9.644 -6.973 1.284 1.00 0.00 H \n+HETATM 818 LP1 HOH B 136 -9.190 -8.127 0.699 1.00 0.00 EP \n+HETATM 819 LP2 HOH B 136 -9.984 -8.283 1.507 1.00 0.00 EP \n+HETATM 820 O HOH B 137 -0.606 6.803 8.766 1.00 0.00 O \n+HETATM 821 H1 HOH B 137 -0.756 5.898 8.494 1.00 0.00 H \n+HETATM 822 H2 HOH B 137 0.031 6.737 9.478 1.00 0.00 H \n+HETATM 823 LP1 HOH B 137 -1.200 7.095 8.993 1.00 0.00 EP \n+HETATM 824 LP2 HOH B 137 -0.347 7.181 8.237 1.00 0.00 EP \n+HETATM 825 O HOH B 138 0.836 -4.802 -8.454 1.00 0.00 O \n+HETATM 826 H1 HOH B 138 0.145 -5.181 -8.998 1.00 0.00 H \n+HETATM 827 H2 HOH B 138 0.576 -5.011 -7.557 1.00 0.00 H \n+HETATM 828 LP1 HOH B 138 0.872 -4.110 -8.547 1.00 0.00 EP \n+HETATM 829 LP2 HOH B 138 1.456 -5.090 -8.606 1.00 0.00 EP \n+HETATM 830 O HOH B 139 -1.713 6.757 -5.349 1.00 0.00 O \n+HETATM 831 H1 HOH B 139 -2.540 6.607 -5.807 1.00 0.00 H \n+HETATM 832 H2 HOH B 139 -1.964 7.205 -4.541 1.00 0.00 H \n+HETATM 833 LP1 HOH B 139 -1.287 7.159 -5.733 1.00 0.00 EP \n+HETATM 834 LP2 HOH B 139 -1.396 6.149 -5.207 1.00 0.00 EP \n+HETATM 835 O HOH B 140 0.397 -5.290 -5.894 1.00 0.00 O \n+HETATM 836 H1 HOH B 140 1.181 -5.360 -5.349 1.00 0.00 H \n+HETATM 837 H2 HOH B 140 -0.055 -6.125 -5.773 1.00 0.00 H \n+HETATM 838 LP1 HOH B 140 0.571 -5.199 -6.566 1.00 0.00 EP \n+HETATM 839 LP2 HOH B 140 -0.005 -4.758 -5.683 1.00 0.00 EP \n+HETATM 840 O HOH B 141 -12.240 8.818 -6.421 1.00 0.00 O \n+HETATM 841 H1 HOH B 141 -11.623 8.093 -6.511 1.00 0.00 H \n+HETATM 842 H2 HOH B 141 -13.051 8.407 -6.121 1.00 0.00 H \n+HETATM 843 LP1 HOH B 141 -12.338 9.138 -7.036 1.00 0.00 EP \n+HETATM 844 LP2 HOH B 141 -12.010 9.282 -5.950 1.00 0.00 EP \n+HETATM 845 O HOH B 142 5.163 8.668 8.989 1.00 0.00 O \n+HETATM 846 H1 HOH B 142 4.562 9.275 9.421 1.00 0.00 H \n+HETATM 847 H2 HOH B 142 4.598 7.980 8.637 1.00 0.00 H \n+HETATM 848 LP1 HOH B 142 5.619 8.403 9.449 1.00 0.00 EP \n+HETATM 849 LP2 HOH B 142 5.511 8.989 8.474 1.00 0.00 EP \n+HETATM 850 O HOH B 143 -6.487 8.454 4.809 1.00 0.00 O \n+HETATM 851 H1 HOH B 143 -5.752 9.067 4.819 1.00 0.00 H \n+HETATM 852 H2 HOH B 143 -6.080 7.591 4.878 1.00 0.00 H \n+HETATM 853 LP1 HOH B 143 -6.847 8.511 4.212 1.00 0.00 EP \n+HETATM 854 LP2 HOH B 143 -6.914 8.570 5.351 1.00 0.00 EP \n+HETATM 855 O HOH B 144 -6.878 8.306 -5.098 1.00 0.00 O \n+HETATM 856 H1 HOH B 144 -6.142 8.215 -4.492 1.00 0.00 H \n+HETATM 857 H2 HOH B 144 -7.584 8.671 -4.565 1.00 0.00 H \n+HETATM 858 LP1 HOH B 144 -7.061 7.682 -5.358 1.00 0.00 EP \n+HETATM 859 LP2 HOH B 144 -6.714 8.739 -5.622 1.00 0.00 EP \n+HETATM 860 O HOH B 145 -10.171 6.668 -5.685 1.00 0.00 O \n+HETATM 861 H1 HOH B 145 -10.504 6.795 -4.797 1.00 0.00 H \n+HETATM 862 H2 HOH B 145 -9.353 6.183 -5.568 1.00 0.00 H \n+HETATM 863 LP1 HOH B 145 -10.051 7.284 -5.995 1.00 0.00 EP \n+HETATM 864 LP2 HOH B 145 -10.624 6.298 -6.069 1.00 0.00 EP \n+HETATM 865 O HOH B 146 -5.011 5.785 -8.573 1.00 0.00 O \n+HETATM 866 H1 HOH B 146 -5.655 6.342 -9.011 1.00 0.00 H \n+HETATM 867 H2 HOH B 146 -5.118 4.927 -8.983 1.00 0.00 H \n+HETATM 868 LP1 HOH B 146 -5.142 5.749 -7.886 1.00 0.00 EP \n+HETATM 869 LP2 HOH B 146 -4.363 6.029 -8.675 1.00 0.00 EP \n+HETATM 870 O HOH B 147 3.703 6.800 7.766 1.00 0.00 O \n+HETATM 871 H1 HOH B 147 3.407 6.025 8.244 1.00 0.00 H \n+HETATM 872 H2 HOH B 147 2.899 7.193 7.426 1.00 0.00 H \n+HETATM 873 LP1 HOH B 147 4.131 6.619 7.242 1.00 0.00 EP \n+HETATM 874 LP2 HOH B 147 4.033 7.244 8.195 1.00 0.00 EP \n+HETATM 875 O HOH B 148 -3.568 9.537 -7.635 1.00 0.00 O \n+HETATM 876 H1 HOH B 148 -3.319 10.193 -8.286 1.00 0.00 H \n+HETATM 877 H2 HOH B 148 -3.086 9.787 -6.846 1.00 0.00 H \n+HETATM 878 LP1 HOH B 148 -3.383 8.896 -7.845 1.00 0.00 EP \n+HETATM 879 LP2 HOH B 148 -4.258 9.554 -7.519 1.00 0.00 EP \n+HETATM 880 O HOH B 149 -2.106 9.348 4.666 1.00 0.00 O \n+HETATM 881 H1 HOH B 149 -1.895 9.104 5.567 1.00 0.00 H \n+HETATM 882 H2 HOH B 149 -1.989 8.541 4.165 1.00 0.00 H \n+HETATM 883 LP1 HOH B 149 -1.671 9.847 4.437 1.00 0.00 EP \n+HETATM 884 LP2 HOH B 149 -2.766 9.575 4.619 1.00 0.00 EP \n+HETATM 885 O HOH B 150 -8.037 7.781 0.152 1.00 0.00 O \n+HETATM 886 H1 HOH B 150 -8.379 8.205 0.938 1.00 0.00 H \n+HETATM 887 H2 HOH B 150 -7.276 7.287 0.457 1.00 0.00 H \n+HETATM 888 LP1 HOH B 150 -7.847 8.258 -0.324 1.00 0.00 EP \n+HETATM 889 LP2 HOH B 150 -8.515 7.351 -0.126 1.00 0.00 EP \n+HETATM 890 O HOH B 151 -8.975 2.588 -7.973 1.00 0.00 O \n+HETATM 891 H1 HOH B 151 -8.915 3.098 -8.782 1.00 0.00 H \n+HETATM 892 H2 HOH B 151 -8.195 2.834 -7.476 1.00 0.00 H \n+HETATM 893 LP1 HOH B 151 -8.974 1.902 -8.113 1.00 0.00 EP \n+HETATM 894 LP2 HOH B 151 -9.556 2.753 -7.620 1.00 0.00 EP \n+HETATM 895 O HOH B 152 -7.616 4.960 -2.757 1.00 0.00 O \n+HETATM 896 H1 HOH B 152 -7.662 5.269 -3.662 1.00 0.00 H \n+HETATM 897 H2 HOH B 152 -7.706 4.009 -2.823 1.00 0.00 H \n+HETATM 898 LP1 HOH B 152 -8.136 5.232 -2.376 1.00 0.00 EP \n+HETATM 899 LP2 HOH B 152 -7.001 5.131 -2.469 1.00 0.00 EP \n+HETATM 900 O HOH B 153 -11.741 5.115 -7.142 1.00 0.00 O \n+HETATM 901 H1 HOH B 153 -11.218 5.751 -6.654 1.00 0.00 H \n+HETATM 902 H2 HOH B 153 -11.535 5.289 -8.061 1.00 0.00 H \n+HETATM 903 LP1 HOH B 153 -12.424 5.209 -7.020 1.00 0.00 EP \n+HETATM 904 LP2 HOH B 153 -11.561 4.461 -6.969 1.00 0.00 EP \n+HETATM 905 O HOH B 154 -0.612 -8.661 -3.092 1.00 0.00 O \n+HETATM 906 H1 HOH B 154 0.070 -9.309 -3.269 1.00 0.00 H \n+HETATM 907 H2 HOH B 154 -0.254 -8.121 -2.388 1.00 0.00 H \n+HETATM 908 LP1 HOH B 154 -1.204 -8.974 -2.888 1.00 0.00 EP \n+HETATM 909 LP2 HOH B 154 -0.738 -8.273 -3.661 1.00 0.00 EP \n+HETATM 910 O HOH B 155 -0.337 8.550 -9.264 1.00 0.00 O \n+HETATM 911 H1 HOH B 155 -0.869 7.814 -8.961 1.00 0.00 H \n+HETATM 912 H2 HOH B 155 -0.764 8.837 -10.072 1.00 0.00 H \n+HETATM 913 LP1 HOH B 155 0.320 8.344 -9.391 1.00 0.00 EP \n+HETATM 914 LP2 HOH B 155 -0.334 9.064 -8.790 1.00 0.00 EP \n+HETATM 915 O HOH B 156 -11.159 2.661 -6.495 1.00 0.00 O \n+HETATM 916 H1 HOH B 156 -11.481 3.555 -6.604 1.00 0.00 H \n+HETATM 917 H2 HOH B 156 -10.371 2.622 -7.037 1.00 0.00 H \n+HETATM 918 LP1 HOH B 156 -11.635 2.198 -6.717 1.00 0.00 EP \n+HETATM 919 LP2 HOH B 156 -11.005 2.533 -5.824 1.00 0.00 EP \n+HETATM 920 O HOH B 157 -4.207 2.053 6.807 1.00 0.00 O \n+HETATM 921 H1 HOH B 157 -4.052 2.641 7.546 1.00 0.00 H \n+HETATM 922 H2 HOH B 157 -3.483 1.427 6.843 1.00 0.00 H \n+HETATM 923 LP1 HOH B 157 -4.198 2.406 6.203 1.00 0.00 EP \n+HETATM 924 LP2 HOH B 157 -4.821 1.724 6.877 1.00 0.00 EP \n+HETATM 925 O HOH B 158 -7.217 9.429 -1.735 1.00 0.00 O \n+HETATM 926 H1 HOH B 158 -7.529 8.915 -0.990 1.00 0.00 H \n+HETATM 927 H2 HOH B 158 -7.953 9.434 -2.347 1.00 0.00 H \n+HETATM 928 LP1 HOH B 158 -6.656 9.128 -2.026 1.00 0.00 EP \n+HETATM 929 LP2 HOH B 158 -7.057 10.080 -1.537 1.00 0.00 EP \n+HETATM 930 O HOH B 159 -7.830 9.088 2.567 1.00 0.00 O \n+HETATM 931 H1 HOH B 159 -7.063 9.563 2.247 1.00 0.00 H \n+HETATM 932 H2 HOH B 159 -7.539 8.687 3.386 1.00 0.00 H \n+HETATM 933 LP1 HOH B 159 -8.028 8.598 2.108 1.00 0.00 EP \n+HETATM 934 LP2 HOH B 159 -8.362 9.528 2.683 1.00 0.00 EP \n+HETATM 935 O HOH B 160 5.162 -8.995 -9.997 1.00 0.00 O \n+HETATM 936 H1 HOH B 160 5.599 -9.179 -10.829 1.00 0.00 H \n+HETATM 937 H2 HOH B 160 4.709 -9.809 -9.779 1.00 0.00 H \n+HETATM 938 LP1 HOH B 160 4.706 -8.469 -10.069 1.00 0.00 EP \n+HETATM 939 LP2 HOH B 160 5.630 -8.832 -9.503 1.00 0.00 EP \n+HETATM 940 O HOH B 161 -10.717 3.238 3.091 1.00 0.00 O \n+HETATM 941 H1 HOH B 161 -11.628 3.033 3.300 1.00 0.00 H \n+HETATM 942 H2 HOH B 161 -10.739 4.147 2.790 1.00 0.00 H \n+HETATM 943 LP1 HOH B 161 -10.477 2.816 2.587 1.00 0.00 EP \n+HETATM 944 LP2 HOH B 161 -10.312 3.176 3.659 1.00 0.00 EP \n+HETATM 945 O HOH B 162 -1.237 -7.712 3.119 1.00 0.00 O \n+HETATM 946 H1 HOH B 162 -0.923 -7.838 4.014 1.00 0.00 H \n+HETATM 947 H2 HOH B 162 -1.098 -6.781 2.944 1.00 0.00 H \n+HETATM 948 LP1 HOH B 162 -1.917 -7.874 3.070 1.00 0.00 EP \n+HETATM 949 LP2 HOH B 162 -0.871 -8.105 2.670 1.00 0.00 EP \n+HETATM 950 O HOH B 163 -7.708 4.961 4.893 1.00 0.00 O \n+HETATM 951 H1 HOH B 163 -8.265 5.519 5.435 1.00 0.00 H \n+HETATM 952 H2 HOH B 163 -6.815 5.227 5.113 1.00 0.00 H \n+HETATM 953 LP1 HOH B 163 -7.837 5.067 4.213 1.00 0.00 EP \n+HETATM 954 LP2 HOH B 163 -7.810 4.286 5.047 1.00 0.00 EP \n+HETATM 955 O HOH B 164 -9.123 9.216 -3.696 1.00 0.00 O \n+HETATM 956 H1 HOH B 164 -9.681 8.487 -3.426 1.00 0.00 H \n+HETATM 957 H2 HOH B 164 -9.723 9.839 -4.106 1.00 0.00 H \n+HETATM 958 LP1 HOH B 164 -8.639 9.001 -4.153 1.00 0.00 EP \n+HETATM 959 LP2 HOH B 164 -8.808 9.505 -3.141 1.00 0.00 EP \n+HETATM 960 O HOH B 165 2.030 10.326 7.335 1.00 0.00 O \n+HETATM 961 H1 HOH B 165 2.704 10.344 6.655 1.00 0.00 H \n+HETATM 962 H2 HOH B 165 1.671 9.440 7.293 1.00 0.00 H \n+HETATM 963 LP1 HOH B 165 1.533 10.801 7.202 1.00 0.00 EP \n+HETATM 964 LP2 HOH B 165 2.310 10.451 7.964 1.00 0.00 EP \n+HETATM 965 O HOH B 166 -5.208 8.159 -2.965 1.00 0.00 O \n+HETATM 966 H1 HOH B 166 -5.726 8.738 -2.405 1.00 0.00 H \n+HETATM 967 H2 HOH B 166 -5.199 7.321 -2.502 1.00 0.00 H \n+HETATM 968 LP1 HOH B 166 -4.558 8.406 -3.043 1.00 0.00 EP \n+HETATM 969 LP2 HOH B 166 -5.508 8.090 -3.594 1.00 0.00 EP \n+HETATM 970 O HOH B 167 -2.151 4.340 -8.209 1.00 0.00 O \n+HETATM 971 H1 HOH B 167 -2.279 5.260 -8.441 1.00 0.00 H \n+HETATM 972 H2 HOH B 167 -1.418 4.348 -7.594 1.00 0.00 H \n+HETATM 973 LP1 HOH B 167 -1.994 3.962 -8.777 1.00 0.00 EP \n+HETATM 974 LP2 HOH B 167 -2.726 4.079 -7.906 1.00 0.00 EP \n+HETATM 975 O HOH B 168 0.023 -11.181 -8.274 1.00 0.00 O \n+HETATM 976 H1 HOH B 168 -0.869 -10.849 -8.384 1.00 0.00 H \n+HETATM 977 H2 HOH B 168 0.409 -11.124 -9.148 1.00 0.00 H \n+HETATM 978 LP1 HOH B 168 0.014 -11.844 -8.050 1.00 0.00 EP \n+HETATM 979 LP2 HOH B 168 0.379 -10.785 -7.820 1.00 0.00 EP \n+HETATM 980 O HOH B 169 -8.826 -10.564 -7.170 1.00 0.00 O \n+HETATM 981 H1 HOH B 169 -7.985 -10.976 -6.973 1.00 0.00 H \n+HETATM 982 H2 HOH B 169 -9.383 -10.787 -6.424 1.00 0.00 H \n+HETATM 983 LP1 HOH B 169 -9.094 -10.819 -7.764 1.00 0.00 EP \n+HETATM 984 LP2 HOH B 169 -8.754 -9.870 -7.226 1.00 0.00 EP \n+HETATM 985 O HOH B 170 -2.608 8.581 -3.583 1.00 0.00 O \n+HETATM 986 H1 HOH B 170 -3.553 8.497 -3.453 1.00 0.00 H \n+HETATM 987 H2 HOH B 170 -2.264 8.790 -2.714 1.00 0.00 H \n+HETATM 988 LP1 HOH B 170 -2.466 9.096 -4.036 1.00 0.00 EP \n+HETATM 989 LP2 HOH B 170 -2.337 7.981 -3.819 1.00 0.00 EP \n+HETATM 990 O HOH B 171 -4.376 7.246 2.719 1.00 0.00 O \n+HETATM 991 H1 HOH B 171 -3.425 7.138 2.684 1.00 0.00 H \n+HETATM 992 H2 HOH B 171 -4.517 8.179 2.559 1.00 0.00 H \n+HETATM 993 LP1 HOH B 171 -4.623 7.062 3.347 1.00 0.00 EP \n+HETATM 994 LP2 HOH B 171 -4.687 6.860 2.224 1.00 0.00 EP \n+HETATM 995 O HOH B 172 -0.140 -9.078 1.158 1.00 0.00 O \n+HETATM 996 H1 HOH B 172 0.735 -9.379 1.403 1.00 0.00 H \n+HETATM 997 H2 HOH B 172 -0.462 -8.618 1.933 1.00 0.00 H \n+HETATM 998 LP1 HOH B 172 -0.554 -9.621 1.002 1.00 0.00 EP \n+HETATM 999 LP2 HOH B 172 -0.107 -8.645 0.609 1.00 0.00 EP \n+HETATM 1000 O HOH B 173 2.248 10.174 0.842 1.00 0.00 O \n+HETATM 1001 H1 HOH B 173 1.626 9.782 1.455 1.00 0.00 H \n+HETATM 1002 H2 HOH B 173 3.108 9.942 1.193 1.00 0.00 H \n+HETATM 1003 LP1 HOH B 173 2.169 10.869 0.820 1.00 0.00 EP \n+HETATM 1004 LP2 HOH B 173 2.163 9.909 0.200 1.00 0.00 EP \n+HETATM 1005 O HOH B 174 -4.916 -12.143 6.929 1.00 0.00 O \n+HETATM 1006 H1 HOH B 174 -4.367 -12.621 7.551 1.00 0.00 H \n+HETATM 1007 H2 HOH B 174 -5.785 -12.139 7.331 1.00 0.00 H \n+HETATM 1008 LP1 HOH B 174 -4.931 -12.469 6.310 1.00 0.00 EP \n+HETATM 1009 LP2 HOH B 174 -4.681 -11.489 6.843 1.00 0.00 EP \n+HETATM 1010 O HOH B 175 4.740 0.692 -10.381 1.00 0.00 O \n+HETATM 1011 H1 HOH B 175 4.489 1.594 -10.183 1.00 0.00 H \n+HETATM 1012 H2 HOH B 175 4.009 0.163 -10.061 1.00 0.00 H \n+HETATM 1013 LP1 HOH B 175 5.333 0.521 -10.049 1.00 0.00 EP \n+HETATM 1014 LP2 HOH B 175 4.825 0.604 -11.070 1.00 0.00 EP \n+HETATM 1015 O HOH B 176 -2.241 1.963 10.514 1.00 0.00 O \n+HETATM 1016 H1 HOH B 176 -1.483 2.440 10.854 1.00 0.00 H \n+HETATM 1017 H2 HOH B 176 -2.670 2.583 9.925 1.00 0.00 H \n+HETATM 1018 LP1 HOH B 176 -2.671 1.778 11.035 1.00 0.00 EP \n+HETATM 1019 LP2 HOH B 176 -2.037 1.391 10.166 1.00 0.00 EP \n+HETATM 1020 O HOH B 177 6.623 2.401 -4.225 1.00 0.00 O \n+HETATM 1021 H1 HOH B 177 7.111 3.219 -4.320 1.00 0.00 H \n+HETATM 1022 H2 HOH B 177 6.804 2.116 -3.329 1.00 0.00 H \n+HETATM 1023 LP1 HOH B 177 6.847 1.924 -4.686 1.00 0.00 EP \n+HETATM 1024 LP2 HOH B 177 5.938 2.509 -4.317 1.00 0.00 EP \n+HETATM 1025 O HOH B 178 -5.090 5.904 4.963 1.00 0.00 O \n+HETATM 1026 H1 HOH B 178 -4.835 6.362 4.162 1.00 0.00 H \n+HETATM 1027 H2 HOH B 178 -4.680 5.043 4.888 1.00 0.00 H \n+HETATM 1028 LP1 HOH B 178 -5.786 5.844 5.003 1.00 0.00 EP \n+HETATM 1029 LP2 HOH B 178 -4.853 6.243 5.528 1.00 0.00 EP \n+HETATM 1030 O HOH B 179 -4.980 -7.123 -9.990 1.00 0.00 O \n+HETATM 1031 H1 HOH B 179 -4.693 -6.554 -9.276 1.00 0.00 H \n+HETATM 1032 H2 HOH B 179 -5.495 -7.807 -9.561 1.00 0.00 H \n+HETATM 1033 LP1 HOH B 179 -4.430 -7.399 -10.323 1.00 0.00 EP \n+HETATM 1034 LP2 HOH B 179 -5.374 -6.767 -10.447 1.00 0.00 EP \n+HETATM 1035 O HOH B 180 7.081 1.423 -1.754 1.00 0.00 O \n+HETATM 1036 H1 HOH B 180 6.178 1.346 -1.447 1.00 0.00 H \n+HETATM 1037 H2 HOH B 180 7.538 1.873 -1.044 1.00 0.00 H \n+HETATM 1038 LP1 HOH B 180 7.111 1.797 -2.345 1.00 0.00 EP \n+HETATM 1039 LP2 HOH B 180 7.359 0.790 -1.865 1.00 0.00 EP \n+HETATM 1040 O HOH B 181 -10.302 5.623 1.778 1.00 0.00 O \n+HETATM 1041 H1 HOH B 181 -10.446 6.534 2.035 1.00 0.00 H \n+HETATM 1042 H2 HOH B 181 -10.593 5.582 0.867 1.00 0.00 H \n+HETATM 1043 LP1 HOH B 181 -10.680 5.191 2.178 1.00 0.00 EP \n+HETATM 1044 LP2 HOH B 181 -9.624 5.456 1.829 1.00 0.00 EP \n+HETATM 1045 O HOH B 182 0.447 9.150 2.581 1.00 0.00 O \n+HETATM 1046 H1 HOH B 182 -0.005 9.844 3.061 1.00 0.00 H \n+HETATM 1047 H2 HOH B 182 0.825 8.594 3.263 1.00 0.00 H \n+HETATM 1048 LP1 HOH B 182 0.949 9.418 2.174 1.00 0.00 EP \n+HETATM 1049 LP2 HOH B 182 -0.004 8.787 2.188 1.00 0.00 EP \n+HETATM 1050 O HOH B 183 0.669 8.201 -4.982 1.00 0.00 O \n+HETATM 1051 H1 HOH B 183 1.208 8.485 -5.720 1.00 0.00 H \n+HETATM 1052 H2 HOH B 183 -0.134 7.871 -5.385 1.00 0.00 H \n+HETATM 1053 LP1 HOH B 183 0.529 8.739 -4.556 1.00 0.00 EP \n+HETATM 1054 LP2 HOH B 183 0.991 7.695 -4.621 1.00 0.00 EP \n+HETATM 1055 O HOH B 184 -7.852 -6.374 -8.528 1.00 0.00 O \n+HETATM 1056 H1 HOH B 184 -7.194 -6.321 -9.222 1.00 0.00 H \n+HETATM 1057 H2 HOH B 184 -7.496 -5.839 -7.819 1.00 0.00 H \n+HETATM 1058 LP1 HOH B 184 -7.937 -7.037 -8.319 1.00 0.00 EP \n+HETATM 1059 LP2 HOH B 184 -8.465 -6.118 -8.748 1.00 0.00 EP \n+HETATM 1060 O HOH B 185 6.924 11.239 -7.793 1.00 0.00 O \n+HETATM 1061 H1 HOH B 185 6.137 11.592 -7.379 1.00 0.00 H \n+HETATM 1062 H2 HOH B 185 7.495 11.999 -7.910 1.00 0.00 H \n+HETATM 1063 LP1 HOH B 185 6.769 10.949 -8.411 1.00 0.00 EP \n+HETATM 1064 LP2 HOH B 185 7.228 10.762 -7.381 1.00 0.00 EP \n+HETATM 1065 O HOH B 186 -11.299 -8.726 -4.820 1.00 0.00 O \n+HETATM 1066 H1 HOH B 186 -10.925 -9.606 -4.869 1.00 0.00 H \n+HETATM 1067 H2 HOH B 186 -12.211 -8.867 -4.567 1.00 0.00 H \n+HETATM 1068 LP1 HOH B 186 -11.261 -8.406 -5.441 1.00 0.00 EP \n+HETATM 1069 LP2 HOH B 186 -10.966 -8.342 -4.339 1.00 0.00 EP \n+HETATM 1070 O HOH B 187 3.464 10.626 9.525 1.00 0.00 O \n+HETATM 1071 H1 HOH B 187 2.762 10.510 8.886 1.00 0.00 H \n+HETATM 1072 H2 HOH B 187 3.924 11.414 9.236 1.00 0.00 H \n+HETATM 1073 LP1 HOH B 187 3.895 10.074 9.524 1.00 0.00 EP \n+HETATM 1074 LP2 HOH B 187 3.202 10.716 10.168 1.00 0.00 EP \n+HETATM 1075 O HOH B 188 -7.122 3.499 8.978 1.00 0.00 O \n+HETATM 1076 H1 HOH B 188 -7.179 2.944 9.756 1.00 0.00 H \n+HETATM 1077 H2 HOH B 188 -6.183 3.633 8.847 1.00 0.00 H \n+HETATM 1078 LP1 HOH B 188 -7.446 4.110 9.086 1.00 0.00 EP \n+HETATM 1079 LP2 HOH B 188 -7.406 3.179 8.424 1.00 0.00 EP \n+HETATM 1080 O HOH B 189 0.025 3.432 10.460 1.00 0.00 O \n+HETATM 1081 H1 HOH B 189 0.707 2.828 10.165 1.00 0.00 H \n+HETATM 1082 H2 HOH B 189 -0.340 3.795 9.653 1.00 0.00 H \n+HETATM 1083 LP1 HOH B 189 0.299 3.939 10.857 1.00 0.00 EP \n+HETATM 1084 LP2 HOH B 189 -0.467 3.091 10.822 1.00 0.00 EP \n+HETATM 1085 O HOH B 190 1.055 5.976 10.642 1.00 0.00 O \n+HETATM 1086 H1 HOH B 190 0.664 5.185 11.013 1.00 0.00 H \n+HETATM 1087 H2 HOH B 190 1.856 5.671 10.216 1.00 0.00 H \n+HETATM 1088 LP1 HOH B 190 1.204 6.439 11.146 1.00 0.00 EP \n+HETATM 1089 LP2 HOH B 190 0.624 6.270 10.176 1.00 0.00 EP \n+HETATM 1090 O HOH B 191 -6.560 7.214 -10.141 1.00 0.00 O \n+HETATM 1091 H1 HOH B 191 -7.493 7.050 -10.281 1.00 0.00 H \n+HETATM 1092 H2 HOH B 191 -6.500 8.160 -10.011 1.00 0.00 H \n+HETATM 1093 LP1 HOH B 191 -6.187 7.017 -10.699 1.00 0.00 EP \n+HETATM 1094 LP2 HOH B 191 -6.332 6.872 -9.574 1.00 0.00 EP \n+HETATM 1095 O HOH B 192 -1.663 7.140 3.211 1.00 0.00 O \n+HETATM 1096 H1 HOH B 192 -1.263 6.370 3.614 1.00 0.00 H \n+HETATM 1097 H2 HOH B 192 -1.029 7.423 2.552 1.00 0.00 H \n+HETATM 1098 LP1 HOH B 192 -1.767 7.643 3.687 1.00 0.00 EP \n+HETATM 1099 LP2 HOH B 192 -2.273 6.973 2.911 1.00 0.00 EP \n+HETATM 1100 O HOH B 193 -3.460 -7.613 9.452 1.00 0.00 O \n+HETATM 1101 H1 HOH B 193 -3.339 -6.708 9.164 1.00 0.00 H \n+HETATM 1102 H2 HOH B 193 -2.675 -7.809 9.964 1.00 0.00 H \n+HETATM 1103 LP1 HOH B 193 -3.510 -8.043 8.902 1.00 0.00 EP \n+HETATM 1104 LP2 HOH B 193 -4.034 -7.672 9.847 1.00 0.00 EP \n+HETATM 1105 O HOH B 194 -6.084 9.972 -7.049 1.00 0.00 O \n+HETATM 1106 H1 HOH B 194 -5.175 9.730 -7.226 1.00 0.00 H \n+HETATM 1107 H2 HOH B 194 -6.366 9.362 -6.368 1.00 0.00 H \n+HETATM 1108 LP1 HOH B 194 -6.476 9.899 -7.624 1.00 0.00 EP \n+HETATM 1109 LP2 HOH B 194 -6.124 10.633 -6.821 1.00 0.00 EP \n+HETATM 1110 O HOH B 195 -9.557 9.507 -9.320 1.00 0.00 O \n+HETATM 1111 H1 HOH B 195 -9.528 9.277 -8.391 1.00 0.00 H \n+HETATM 1112 H2 HOH B 195 -10.283 10.126 -9.392 1.00 0.00 H \n+HETATM 1113 LP1 HOH B 195 -9.676 8.939 -9.711 1.00 0.00 EP \n+HETATM 1114 LP2 HOH B 195 -8.956 9.806 -9.520 1.00 0.00 EP \n+HETATM 1115 O HOH B 196 -8.846 7.738 10.734 1.00 0.00 O \n+HETATM 1116 H1 HOH B 196 -8.771 6.961 10.180 1.00 0.00 H \n+HETATM 1117 H2 HOH B 196 -8.087 8.273 10.500 1.00 0.00 H \n+HETATM 1118 LP1 HOH B 196 -8.824 7.562 11.411 1.00 0.00 EP \n+HETATM 1119 LP2 HOH B 196 -9.441 8.081 10.601 1.00 0.00 EP \n+HETATM 1120 O HOH B 197 0.690 -9.628 10.046 1.00 0.00 O \n+HETATM 1121 H1 HOH B 197 1.080 -10.224 10.684 1.00 0.00 H \n+HETATM 1122 H2 HOH B 197 1.399 -9.029 9.812 1.00 0.00 H \n+HETATM 1123 LP1 HOH B 197 0.154 -9.278 10.330 1.00 0.00 EP \n+HETATM 1124 LP2 HOH B 197 0.467 -9.979 9.483 1.00 0.00 EP \n+HETATM 1125 O HOH B 198 -4.180 6.799 7.330 1.00 0.00 O \n+HETATM 1126 H1 HOH B 198 -4.596 6.569 6.500 1.00 0.00 H \n+HETATM 1127 H2 HOH B 198 -4.047 5.961 7.773 1.00 0.00 H \n+HETATM 1128 LP1 HOH B 198 -4.596 7.216 7.708 1.00 0.00 EP \n+HETATM 1129 LP2 HOH B 198 -3.568 7.120 7.219 1.00 0.00 EP \n+HETATM 1130 O HOH B 199 6.458 5.713 8.080 1.00 0.00 O \n+HETATM 1131 H1 HOH B 199 7.076 5.538 7.371 1.00 0.00 H \n+HETATM 1132 H2 HOH B 199 5.704 6.114 7.647 1.00 0.00 H \n+HETATM 1133 LP1 HOH B 199 6.737 6.153 8.548 1.00 0.00 EP \n+HETATM 1134 LP2 HOH B 199 6.273 5.119 8.399 1.00 0.00 EP \n+HETATM 1135 O HOH B 200 0.855 -9.564 7.067 1.00 0.00 O \n+HETATM 1136 H1 HOH B 200 0.389 -10.067 7.735 1.00 0.00 H \n+HETATM 1137 H2 HOH B 200 1.488 -9.040 7.558 1.00 0.00 H \n+HETATM 1138 LP1 HOH B 200 0.412 -9.151 6.715 1.00 0.00 EP \n+HETATM 1139 LP2 HOH B 200 1.182 -9.991 6.619 1.00 0.00 EP \n+HETATM 1140 O HOH B 201 -3.622 10.068 8.553 1.00 0.00 O \n+HETATM 1141 H1 HOH B 201 -2.942 9.678 8.002 1.00 0.00 H \n+HETATM 1142 H2 HOH B 201 -3.144 10.451 9.288 1.00 0.00 H \n+HETATM 1143 LP1 HOH B 201 -4.070 9.578 8.776 1.00 0.00 EP \n+HETATM 1144 LP2 HOH B 201 -3.972 10.561 8.201 1.00 0.00 EP \n+HETATM 1145 O HOH B 202 4.214 -3.703 -8.962 1.00 0.00 O \n+HETATM 1146 H1 HOH B 202 5.170 -3.662 -8.968 1.00 0.00 H \n+HETATM 1147 H2 HOH B 202 3.943 -3.070 -9.628 1.00 0.00 H \n+HETATM 1148 LP1 HOH B 202 3.962 -3.524 -8.334 1.00 0.00 EP \n+HETATM 1149 LP2 HOH B 202 3.992 -4.346 -9.128 1.00 0.00 EP \n+HETATM 1150 O HOH B 203 2.662 7.867 -6.795 1.00 0.00 O \n+HETATM 1151 H1 HOH B 203 2.663 8.176 -7.700 1.00 0.00 H \n+HETATM 1152 H2 HOH B 203 2.569 6.916 -6.866 1.00 0.00 H \n+HETATM 1153 LP1 HOH B 203 2.124 8.141 -6.440 1.00 0.00 EP \n+HETATM 1154 LP2 HOH B 203 3.262 8.034 -6.475 1.00 0.00 EP \n+HETATM 1155 O HOH B 204 -3.171 -8.754 -11.188 1.00 0.00 O \n+HETATM 1156 H1 HOH B 204 -2.481 -8.407 -11.754 1.00 0.00 H \n+HETATM 1157 H2 HOH B 204 -3.665 -7.982 -10.911 1.00 0.00 H \n+HETATM 1158 LP1 HOH B 204 -2.895 -9.082 -10.634 1.00 0.00 EP \n+HETATM 1159 LP2 HOH B 204 -3.582 -9.197 -11.541 1.00 0.00 EP \n+HETATM 1160 O HOH B 205 -7.161 -12.216 8.340 1.00 0.00 O \n+HETATM 1161 H1 HOH B 205 -7.184 -11.482 8.954 1.00 0.00 H \n+HETATM 1162 H2 HOH B 205 -7.994 -12.163 7.871 1.00 0.00 H \n+HETATM 1163 LP1 HOH B 205 -7.109 -12.824 8.683 1.00 0.00 EP \n+HETATM 1164 LP2 HOH B 205 -6.624 -12.152 7.896 1.00 0.00 EP \n+HETATM 1165 O HOH B 206 5.708 -5.236 2.462 1.00 0.00 O \n+HETATM 1166 H1 HOH B 206 5.734 -4.520 1.827 1.00 0.00 H \n+HETATM 1167 H2 HOH B 206 4.931 -5.058 2.992 1.00 0.00 H \n+HETATM 1168 LP1 HOH B 206 6.284 -5.236 2.859 1.00 0.00 EP \n+HETATM 1169 LP2 HOH B 206 5.649 -5.853 2.136 1.00 0.00 EP \n+HETATM 1170 O HOH B 207 10.572 -2.513 1.849 1.00 0.00 O \n+HETATM 1171 H1 HOH B 207 10.450 -1.647 1.459 1.00 0.00 H \n+HETATM 1172 H2 HOH B 207 10.578 -3.113 1.103 1.00 0.00 H \n+HETATM 1173 LP1 HOH B 207 10.045 -2.665 2.284 1.00 0.00 EP \n+HETATM 1174 LP2 HOH B 207 11.179 -2.544 2.196 1.00 0.00 EP \n+HETATM 1175 O HOH B 208 10.753 -4.084 -0.334 1.00 0.00 O \n+HETATM 1176 H1 HOH B 208 10.255 -3.845 -1.116 1.00 0.00 H \n+HETATM 1177 H2 HOH B 208 11.656 -4.164 -0.641 1.00 0.00 H \n+HETATM 1178 LP1 HOH B 208 10.526 -4.692 -0.072 1.00 0.00 EP \n+HETATM 1179 LP2 HOH B 208 10.701 -3.586 0.155 1.00 0.00 EP \n+HETATM 1180 O HOH B 209 -9.521 -7.325 4.640 1.00 0.00 O \n+HETATM 1181 H1 HOH B 209 -9.265 -6.800 5.398 1.00 0.00 H \n+HETATM 1182 H2 HOH B 209 -10.461 -7.467 4.752 1.00 0.00 H \n+HETATM 1183 LP1 HOH B 209 -9.177 -7.935 4.634 1.00 0.00 EP \n+HETATM 1184 LP2 HOH B 209 -9.392 -6.980 4.044 1.00 0.00 EP \n+HETATM 1185 O HOH B 210 6.954 -0.397 -9.293 1.00 0.00 O \n+HETATM 1186 H1 HOH B 210 6.359 0.081 -9.870 1.00 0.00 H \n+HETATM 1187 H2 HOH B 210 6.387 -0.770 -8.619 1.00 0.00 H \n+HETATM 1188 LP1 HOH B 210 7.424 0.037 -9.009 1.00 0.00 EP \n+HETATM 1189 LP2 HOH B 210 7.287 -0.903 -9.644 1.00 0.00 EP \n+HETATM 1190 O HOH B 211 5.354 -7.177 0.571 1.00 0.00 O \n+HETATM 1191 H1 HOH B 211 5.853 -6.783 -0.144 1.00 0.00 H \n+HETATM 1192 H2 HOH B 211 5.538 -6.621 1.328 1.00 0.00 H \n+HETATM 1193 LP1 HOH B 211 5.567 -7.834 0.688 1.00 0.00 EP \n+HETATM 1194 LP2 HOH B 211 4.669 -7.177 0.425 1.00 0.00 EP \n+HETATM 1195 O HOH B 212 2.969 -6.084 -9.221 1.00 0.00 O \n+HETATM 1196 H1 HOH B 212 2.170 -5.631 -8.952 1.00 0.00 H \n+HETATM 1197 H2 HOH B 212 3.664 -5.437 -9.102 1.00 0.00 H \n+HETATM 1198 LP1 HOH B 212 2.927 -6.282 -9.892 1.00 0.00 EP \n+HETATM 1199 LP2 HOH B 212 3.082 -6.646 -8.819 1.00 0.00 EP \n+HETATM 1200 O HOH B 213 -10.621 8.214 2.058 1.00 0.00 O \n+HETATM 1201 H1 HOH B 213 -11.409 8.494 2.521 1.00 0.00 H \n+HETATM 1202 H2 HOH B 213 -9.916 8.732 2.446 1.00 0.00 H \n+HETATM 1203 LP1 HOH B 213 -10.676 8.346 1.372 1.00 0.00 EP \n+HETATM 1204 LP2 HOH B 213 -10.507 7.530 2.155 1.00 0.00 EP \n+HETATM 1205 O HOH B 214 1.637 -0.976 7.001 1.00 0.00 O \n+HETATM 1206 H1 HOH B 214 1.483 -0.228 7.578 1.00 0.00 H \n+HETATM 1207 H2 HOH B 214 2.560 -0.906 6.757 1.00 0.00 H \n+HETATM 1208 LP1 HOH B 214 1.228 -0.940 6.434 1.00 0.00 EP \n+HETATM 1209 LP2 HOH B 214 1.515 -1.578 7.338 1.00 0.00 EP \n+HETATM 1210 O HOH B 215 5.531 10.882 -2.367 1.00 0.00 O \n+HETATM 1211 H1 HOH B 215 6.076 11.647 -2.185 1.00 0.00 H \n+HETATM 1212 H2 HOH B 215 5.928 10.484 -3.142 1.00 0.00 H \n+HETATM 1213 LP1 HOH B 215 4.871 11.075 -2.499 1.00 0.00 EP \n+HETATM 1214 LP2 HOH B 215 5.541 10.437 -1.827 1.00 0.00 EP \n+HETATM 1215 O HOH B 216 2.797 -3.183 -6.749 1.00 0.00 O \n+HETATM 1216 H1 HOH B 216 3.387 -3.393 -7.473 1.00 0.00 H \n+HETATM 1217 H2 HOH B 216 1.979 -3.629 -6.969 1.00 0.00 H \n+HETATM 1218 LP1 HOH B 216 2.698 -2.492 -6.703 1.00 0.00 EP \n+HETATM 1219 LP2 HOH B 216 3.054 -3.423 -6.144 1.00 0.00 EP \n+HETATM 1220 O HOH B 217 -4.887 -9.268 7.088 1.00 0.00 O \n+HETATM 1221 H1 HOH B 217 -4.030 -8.844 7.030 1.00 0.00 H \n+HETATM 1222 H2 HOH B 217 -4.723 -10.176 6.832 1.00 0.00 H \n+HETATM 1223 LP1 HOH B 217 -5.342 -8.966 6.650 1.00 0.00 EP \n+HETATM 1224 LP2 HOH B 217 -5.135 -9.237 7.742 1.00 0.00 EP \n+HETATM 1225 O HOH B 218 -2.556 -5.441 8.038 1.00 0.00 O \n+HETATM 1226 H1 HOH B 218 -2.959 -4.712 7.566 1.00 0.00 H \n+HETATM 1227 H2 HOH B 218 -1.773 -5.063 8.438 1.00 0.00 H \n+HETATM 1228 LP1 HOH B 218 -2.384 -5.957 7.597 1.00 0.00 EP \n+HETATM 1229 LP2 HOH B 218 -2.990 -5.688 8.528 1.00 0.00 EP \n+HETATM 1230 O HOH B 219 8.065 5.255 6.017 1.00 0.00 O \n+HETATM 1231 H1 HOH B 219 7.572 5.150 5.202 1.00 0.00 H \n+HETATM 1232 H2 HOH B 219 8.492 4.408 6.149 1.00 0.00 H \n+HETATM 1233 LP1 HOH B 219 7.634 5.401 6.549 1.00 0.00 EP \n+HETATM 1234 LP2 HOH B 219 8.540 5.765 5.955 1.00 0.00 EP \n+HETATM 1235 O HOH B 220 -9.809 -8.469 -9.645 1.00 0.00 O \n+HETATM 1236 H1 HOH B 220 -10.160 -7.594 -9.810 1.00 0.00 H \n+HETATM 1237 H2 HOH B 220 -9.487 -8.763 -10.497 1.00 0.00 H \n+HETATM 1238 LP1 HOH B 220 -10.311 -8.897 -9.410 1.00 0.00 EP \n+HETATM 1239 LP2 HOH B 220 -9.287 -8.443 -9.179 1.00 0.00 EP \n+HETATM 1240 O HOH B 221 7.043 0.399 -5.881 1.00 0.00 O \n+HETATM 1241 H1 HOH B 221 6.890 1.141 -5.295 1.00 0.00 H \n+HETATM 1242 H2 HOH B 221 7.683 0.722 -6.515 1.00 0.00 H \n+HETATM 1243 LP1 HOH B 221 6.450 0.211 -6.202 1.00 0.00 EP \n+HETATM 1244 LP2 HOH B 221 7.300 -0.147 -5.526 1.00 0.00 EP \n+HETATM 1245 O HOH B 222 -10.571 1.382 -4.187 1.00 0.00 O \n+HETATM 1246 H1 HOH B 222 -10.769 2.033 -4.860 1.00 0.00 H \n+HETATM 1247 H2 HOH B 222 -10.722 0.540 -4.617 1.00 0.00 H \n+HETATM 1248 LP1 HOH B 222 -10.997 1.458 -3.636 1.00 0.00 EP \n+HETATM 1249 LP2 HOH B 222 -9.906 1.437 -3.977 1.00 0.00 EP \n+HETATM 1250 O HOH B 223 7.643 5.719 -9.947 1.00 0.00 O \n+HETATM 1251 H1 HOH B 223 6.961 6.171 -9.450 1.00 0.00 H \n+HETATM 1252 H2 HOH B 223 8.331 6.375 -10.061 1.00 0.00 H \n+HETATM 1253 LP1 HOH B 223 7.398 5.506 -10.567 1.00 0.00 EP \n+HETATM 1254 LP2 HOH B 223 7.885 5.168 -9.590 1.00 0.00 EP \n+HETATM 1255 O HOH B 224 6.964 -10.975 -1.704 1.00 0.00 O \n+HETATM 1256 H1 HOH B 224 6.546 -10.602 -0.928 1.00 0.00 H \n+HETATM 1257 H2 HOH B 224 7.806 -11.303 -1.388 1.00 0.00 H \n+HETATM 1258 LP1 HOH B 224 7.058 -10.484 -2.194 1.00 0.00 EP \n+HETATM 1259 LP2 HOH B 224 6.578 -11.496 -1.966 1.00 0.00 EP \n+HETATM 1260 O HOH B 225 8.892 -5.830 0.639 1.00 0.00 O \n+HETATM 1261 H1 HOH B 225 9.659 -5.380 0.284 1.00 0.00 H \n+HETATM 1262 H2 HOH B 225 8.267 -5.846 -0.086 1.00 0.00 H \n+HETATM 1263 LP1 HOH B 225 8.629 -5.478 1.184 1.00 0.00 EP \n+HETATM 1264 LP2 HOH B 225 9.056 -6.480 0.839 1.00 0.00 EP \n+HETATM 1265 O HOH B 226 11.199 8.911 3.355 1.00 0.00 O \n+HETATM 1266 H1 HOH B 226 10.906 8.278 4.010 1.00 0.00 H \n+HETATM 1267 H2 HOH B 226 10.456 9.001 2.758 1.00 0.00 H \n+HETATM 1268 LP1 HOH B 226 11.762 8.672 3.014 1.00 0.00 EP \n+HETATM 1269 LP2 HOH B 226 11.352 9.525 3.655 1.00 0.00 EP \n+HETATM 1270 O HOH B 227 -10.194 -1.510 -0.627 1.00 0.00 O \n+HETATM 1271 H1 HOH B 227 -9.422 -0.945 -0.626 1.00 0.00 H \n+HETATM 1272 H2 HOH B 227 -10.855 -1.012 -1.108 1.00 0.00 H \n+HETATM 1273 LP1 HOH B 227 -10.408 -1.637 0.028 1.00 0.00 EP \n+HETATM 1274 LP2 HOH B 227 -10.058 -2.116 -0.949 1.00 0.00 EP \n+HETATM 1275 O HOH B 228 9.173 11.689 -0.983 1.00 0.00 O \n+HETATM 1276 H1 HOH B 228 9.692 11.951 -0.223 1.00 0.00 H \n+HETATM 1277 H2 HOH B 228 8.842 10.819 -0.759 1.00 0.00 H \n+HETATM 1278 LP1 HOH B 228 9.572 11.661 -1.558 1.00 0.00 EP \n+HETATM 1279 LP2 HOH B 228 8.644 12.135 -1.088 1.00 0.00 EP \n+HETATM 1280 O HOH B 229 -9.913 -7.086 -3.218 1.00 0.00 O \n+HETATM 1281 H1 HOH B 229 -10.359 -7.710 -3.790 1.00 0.00 H \n+HETATM 1282 H2 HOH B 229 -9.643 -6.376 -3.801 1.00 0.00 H \n+HETATM 1283 LP1 HOH B 229 -9.356 -7.383 -2.915 1.00 0.00 EP \n+HETATM 1284 LP2 HOH B 229 -10.348 -6.848 -2.724 1.00 0.00 EP \n+HETATM 1285 O HOH B 230 -4.918 -11.596 0.948 1.00 0.00 O \n+HETATM 1286 H1 HOH B 230 -4.022 -11.261 0.967 1.00 0.00 H \n+HETATM 1287 H2 HOH B 230 -5.147 -11.615 0.019 1.00 0.00 H \n+HETATM 1288 LP1 HOH B 230 -5.349 -11.171 1.300 1.00 0.00 EP \n+HETATM 1289 LP2 HOH B 230 -4.948 -12.238 1.223 1.00 0.00 EP \n+HETATM 1290 O HOH B 231 -0.598 -5.536 -10.703 1.00 0.00 O \n+HETATM 1291 H1 HOH B 231 -1.153 -4.759 -10.763 1.00 0.00 H \n+HETATM 1292 H2 HOH B 231 -0.095 -5.535 -11.517 1.00 0.00 H \n+HETATM 1293 LP1 HOH B 231 -0.987 -6.116 -10.653 1.00 0.00 EP \n+HETATM 1294 LP2 HOH B 231 -0.172 -5.493 -10.149 1.00 0.00 EP \n+HETATM 1295 O HOH B 232 -2.953 -7.478 6.312 1.00 0.00 O \n+HETATM 1296 H1 HOH B 232 -2.839 -6.807 6.985 1.00 0.00 H \n+HETATM 1297 H2 HOH B 232 -2.064 -7.669 6.011 1.00 0.00 H \n+HETATM 1298 LP1 HOH B 232 -3.346 -7.237 5.786 1.00 0.00 EP \n+HETATM 1299 LP2 HOH B 232 -3.250 -8.051 6.583 1.00 0.00 EP \n+HETATM 1300 O HOH B 233 5.673 -9.949 0.437 1.00 0.00 O \n+HETATM 1301 H1 HOH B 233 5.959 -10.235 1.305 1.00 0.00 H \n+HETATM 1302 H2 HOH B 233 5.630 -8.995 0.501 1.00 0.00 H \n+HETATM 1303 LP1 HOH B 233 5.044 -10.215 0.283 1.00 0.00 EP \n+HETATM 1304 LP2 HOH B 233 6.135 -10.143 -0.052 1.00 0.00 EP \n+HETATM 1305 O HOH B 234 -7.879 4.694 2.249 1.00 0.00 O \n+HETATM 1306 H1 HOH B 234 -8.719 5.111 2.056 1.00 0.00 H \n+HETATM 1307 H2 HOH B 234 -7.791 4.762 3.200 1.00 0.00 H \n+HETATM 1308 LP1 HOH B 234 -7.356 5.031 1.928 1.00 0.00 EP \n+HETATM 1309 LP2 HOH B 234 -7.884 4.024 2.049 1.00 0.00 EP \n+HETATM 1310 O HOH B 235 -8.470 -6.902 9.919 1.00 0.00 O \n+HETATM 1311 H1 HOH B 235 -7.619 -6.935 9.483 1.00 0.00 H \n+HETATM 1312 H2 HOH B 235 -8.401 -6.164 10.525 1.00 0.00 H \n+HETATM 1313 LP1 HOH B 235 -8.593 -7.497 10.267 1.00 0.00 EP \n+HETATM 1314 LP2 HOH B 235 -8.982 -6.793 9.455 1.00 0.00 EP \n+HETATM 1315 O HOH B 236 7.288 -1.409 -0.129 1.00 0.00 O \n+HETATM 1316 H1 HOH B 236 6.499 -0.936 -0.393 1.00 0.00 H \n+HETATM 1317 H2 HOH B 236 7.820 -1.452 -0.923 1.00 0.00 H \n+HETATM 1318 LP1 HOH B 236 7.128 -2.052 0.097 1.00 0.00 EP \n+HETATM 1319 LP2 HOH B 236 7.627 -1.062 0.377 1.00 0.00 EP \n+HETATM 1320 O HOH B 237 -10.612 -4.129 -1.177 1.00 0.00 O \n+HETATM 1321 H1 HOH B 237 -10.373 -4.327 -2.083 1.00 0.00 H \n+HETATM 1322 H2 HOH B 237 -10.371 -3.210 -1.061 1.00 0.00 H \n+HETATM 1323 LP1 HOH B 237 -10.255 -4.536 -0.733 1.00 0.00 EP \n+HETATM 1324 LP2 HOH B 237 -11.299 -4.220 -1.077 1.00 0.00 EP \n+HETATM 1325 O HOH B 238 -7.763 -5.846 6.076 1.00 0.00 O \n+HETATM 1326 H1 HOH B 238 -7.334 -5.287 5.428 1.00 0.00 H \n+HETATM 1327 H2 HOH B 238 -8.009 -5.249 6.783 1.00 0.00 H \n+HETATM 1328 LP1 HOH B 238 -7.322 -6.337 6.309 1.00 0.00 EP \n+HETATM 1329 LP2 HOH B 238 -8.330 -6.152 5.802 1.00 0.00 EP \n+HETATM 1330 O HOH B 239 -6.223 -8.892 -8.068 1.00 0.00 O \n+HETATM 1331 H1 HOH B 239 -5.723 -8.567 -7.320 1.00 0.00 H \n+HETATM 1332 H2 HOH B 239 -6.085 -9.839 -8.056 1.00 0.00 H \n+HETATM 1333 LP1 HOH B 239 -5.984 -8.615 -8.665 1.00 0.00 EP \n+HETATM 1334 LP2 HOH B 239 -6.903 -8.740 -7.996 1.00 0.00 EP \n+HETATM 1335 O HOH B 240 7.276 -9.065 -3.563 1.00 0.00 O \n+HETATM 1336 H1 HOH B 240 7.195 -9.812 -2.970 1.00 0.00 H \n+HETATM 1337 H2 HOH B 240 7.091 -8.302 -3.015 1.00 0.00 H \n+HETATM 1338 LP1 HOH B 240 6.812 -9.112 -4.085 1.00 0.00 EP \n+HETATM 1339 LP2 HOH B 240 7.923 -9.028 -3.828 1.00 0.00 EP \n+HETATM 1340 O HOH B 241 9.164 -3.769 -2.419 1.00 0.00 O \n+HETATM 1341 H1 HOH B 241 8.462 -4.417 -2.364 1.00 0.00 H \n+HETATM 1342 H2 HOH B 241 8.710 -2.935 -2.545 1.00 0.00 H \n+HETATM 1343 LP1 HOH B 241 9.585 -3.905 -2.961 1.00 0.00 EP \n+HETATM 1344 LP2 HOH B 241 9.539 -3.759 -1.828 1.00 0.00 EP \n+HETATM 1345 O HOH B 242 6.795 -5.869 -5.030 1.00 0.00 O \n+HETATM 1346 H1 HOH B 242 6.693 -5.822 -4.079 1.00 0.00 H \n+HETATM 1347 H2 HOH B 242 7.652 -6.274 -5.160 1.00 0.00 H \n+HETATM 1348 LP1 HOH B 242 6.779 -5.228 -5.312 1.00 0.00 EP \n+HETATM 1349 LP2 HOH B 242 6.289 -6.261 -5.314 1.00 0.00 EP \n+HETATM 1350 O HOH B 243 -8.699 5.565 9.045 1.00 0.00 O \n+HETATM 1351 H1 HOH B 243 -9.576 5.214 9.202 1.00 0.00 H \n+HETATM 1352 H2 HOH B 243 -8.126 4.799 9.064 1.00 0.00 H \n+HETATM 1353 LP1 HOH B 243 -8.521 6.019 9.548 1.00 0.00 EP \n+HETATM 1354 LP2 HOH B 243 -8.667 5.883 8.422 1.00 0.00 EP \n+HETATM 1355 O HOH B 244 0.118 -7.392 -0.889 1.00 0.00 O \n+HETATM 1356 H1 HOH B 244 1.057 -7.240 -0.776 1.00 0.00 H \n+HETATM 1357 H2 HOH B 244 -0.115 -7.990 -0.180 1.00 0.00 H \n+HETATM 1358 LP1 HOH B 244 -0.011 -7.684 -1.512 1.00 0.00 EP \n+HETATM 1359 LP2 HOH B 244 -0.238 -6.792 -0.834 1.00 0.00 EP \n+HETATM 1360 O HOH B 245 -7.630 -6.247 2.982 1.00 0.00 O \n+HETATM 1361 H1 HOH B 245 -8.404 -6.543 3.461 1.00 0.00 H \n+HETATM 1362 H2 HOH B 245 -7.980 -5.824 2.198 1.00 0.00 H \n+HETATM 1363 LP1 HOH B 245 -7.224 -6.791 2.810 1.00 0.00 EP \n+HETATM 1364 LP2 HOH B 245 -7.260 -5.792 3.365 1.00 0.00 EP \n+HETATM 1365 O HOH B 246 -10.805 7.249 -3.138 1.00 0.00 O \n+HETATM 1366 H1 HOH B 246 -10.462 6.710 -2.425 1.00 0.00 H \n+HETATM 1367 H2 HOH B 246 -11.705 7.445 -2.878 1.00 0.00 H \n+HETATM 1368 LP1 HOH B 246 -10.792 6.896 -3.742 1.00 0.00 EP \n+HETATM 1369 LP2 HOH B 246 -10.432 7.838 -3.203 1.00 0.00 EP \n+HETATM 1370 O HOH B 247 -1.031 4.308 8.226 1.00 0.00 O \n+HETATM 1371 H1 HOH B 247 -0.678 3.897 7.437 1.00 0.00 H \n+HETATM 1372 H2 HOH B 247 -1.967 4.109 8.202 1.00 0.00 H \n+HETATM 1373 LP1 HOH B 247 -0.924 5.000 8.213 1.00 0.00 EP \n+HETATM 1374 LP2 HOH B 247 -0.735 4.038 8.800 1.00 0.00 EP \n+HETATM 1375 O HOH B 248 8.352 -4.852 3.061 1.00 0.00 O \n+HETATM 1376 H1 HOH B 248 7.400 -4.945 3.102 1.00 0.00 H \n+HETATM 1377 H2 HOH B 248 8.591 -5.207 2.205 1.00 0.00 H \n+HETATM 1378 LP1 HOH B 248 8.658 -5.216 3.575 1.00 0.00 EP \n+HETATM 1379 LP2 HOH B 248 8.536 -4.178 3.110 1.00 0.00 EP \n+HETATM 1380 O HOH B 249 -8.824 -1.211 -10.134 1.00 0.00 O \n+HETATM 1381 H1 HOH B 249 -9.522 -0.897 -9.560 1.00 0.00 H \n+HETATM 1382 H2 HOH B 249 -8.018 -0.884 -9.734 1.00 0.00 H \n+HETATM 1383 LP1 HOH B 249 -8.901 -0.953 -10.781 1.00 0.00 EP \n+HETATM 1384 LP2 HOH B 249 -8.821 -1.910 -10.161 1.00 0.00 EP \n+HETATM 1385 O HOH B 250 3.905 6.239 -10.347 1.00 0.00 O \n+HETATM 1386 H1 HOH B 250 3.621 5.370 -10.063 1.00 0.00 H \n+HETATM 1387 H2 HOH B 250 4.377 6.081 -11.164 1.00 0.00 H \n+HETATM 1388 LP1 HOH B 250 4.326 6.530 -9.870 1.00 0.00 EP \n+HETATM 1389 LP2 HOH B 250 3.353 6.656 -10.456 1.00 0.00 EP \n+HETATM 1390 O HOH B 251 8.395 2.672 5.375 1.00 0.00 O \n+HETATM 1391 H1 HOH B 251 8.019 2.938 4.536 1.00 0.00 H \n+HETATM 1392 H2 HOH B 251 7.725 2.115 5.772 1.00 0.00 H \n+HETATM 1393 LP1 HOH B 251 8.523 3.231 5.777 1.00 0.00 EP \n+HETATM 1394 LP2 HOH B 251 8.988 2.314 5.277 1.00 0.00 EP \n+HETATM 1395 O HOH B 252 8.688 -10.431 4.523 1.00 0.00 O \n+HETATM 1396 H1 HOH B 252 8.757 -11.086 5.218 1.00 0.00 H \n+HETATM 1397 H2 HOH B 252 8.531 -9.608 4.985 1.00 0.00 H \n+HETATM 1398 LP1 HOH B 252 8.155 -10.580 4.094 1.00 0.00 EP \n+HETATM 1399 LP2 HOH B 252 9.282 -10.398 4.154 1.00 0.00 EP \n+HETATM 1400 O HOH B 253 -4.298 6.144 -5.923 1.00 0.00 O \n+HETATM 1401 H1 HOH B 253 -4.407 5.322 -5.444 1.00 0.00 H \n+HETATM 1402 H2 HOH B 253 -4.613 5.950 -6.806 1.00 0.00 H \n+HETATM 1403 LP1 HOH B 253 -3.625 6.335 -5.937 1.00 0.00 EP \n+HETATM 1404 LP2 HOH B 253 -4.679 6.653 -5.631 1.00 0.00 EP \n+HETATM 1405 O HOH B 254 -12.671 0.537 -7.207 1.00 0.00 O \n+HETATM 1406 H1 HOH B 254 -12.391 1.414 -6.946 1.00 0.00 H \n+HETATM 1407 H2 HOH B 254 -13.584 0.645 -7.473 1.00 0.00 H \n+HETATM 1408 LP1 HOH B 254 -12.621 0.091 -6.670 1.00 0.00 EP \n+HETATM 1409 LP2 HOH B 254 -12.284 0.302 -7.741 1.00 0.00 EP \n+HETATM 1410 O HOH B 255 8.539 -3.335 -7.072 1.00 0.00 O \n+HETATM 1411 H1 HOH B 255 9.446 -3.073 -7.230 1.00 0.00 H \n+HETATM 1412 H2 HOH B 255 8.305 -2.905 -6.250 1.00 0.00 H \n+HETATM 1413 LP1 HOH B 255 8.490 -4.031 -7.010 1.00 0.00 EP \n+HETATM 1414 LP2 HOH B 255 8.124 -3.117 -7.592 1.00 0.00 EP \n+HETATM 1415 O HOH B 256 4.773 -11.615 -6.746 1.00 0.00 O \n+HETATM 1416 H1 HOH B 256 4.283 -12.119 -6.096 1.00 0.00 H \n+HETATM 1417 H2 HOH B 256 5.060 -10.832 -6.276 1.00 0.00 H \n+HETATM 1418 LP1 HOH B 256 4.363 -11.443 -7.287 1.00 0.00 EP \n+HETATM 1419 LP2 HOH B 256 5.324 -11.980 -6.978 1.00 0.00 EP \n+HETATM 1420 O HOH B 257 5.955 -3.656 0.377 1.00 0.00 O \n+HETATM 1421 H1 HOH B 257 6.587 -2.942 0.290 1.00 0.00 H \n+HETATM 1422 H2 HOH B 257 6.185 -4.266 -0.325 1.00 0.00 H \n+HETATM 1423 LP1 HOH B 257 5.301 -3.419 0.294 1.00 0.00 EP \n+HETATM 1424 LP2 HOH B 257 6.014 -3.964 1.002 1.00 0.00 EP \n+HETATM 1425 O HOH B 258 8.827 6.100 2.316 1.00 0.00 O \n+HETATM 1426 H1 HOH B 258 9.418 6.173 3.066 1.00 0.00 H \n+HETATM 1427 H2 HOH B 258 8.076 5.610 2.650 1.00 0.00 H \n+HETATM 1428 LP1 HOH B 258 9.135 5.753 1.792 1.00 0.00 EP \n+HETATM 1429 LP2 HOH B 258 8.631 6.733 2.093 1.00 0.00 EP \n+HETATM 1430 O HOH B 259 -11.478 -0.853 -5.236 1.00 0.00 O \n+HETATM 1431 H1 HOH B 259 -12.089 -0.526 -5.896 1.00 0.00 H \n+HETATM 1432 H2 HOH B 259 -10.941 -1.493 -5.703 1.00 0.00 H \n+HETATM 1433 LP1 HOH B 259 -11.823 -1.158 -4.708 1.00 0.00 EP \n+HETATM 1434 LP2 HOH B 259 -11.082 -0.333 -4.986 1.00 0.00 EP \n+HETATM 1435 O HOH B 260 5.037 -3.095 -2.913 1.00 0.00 O \n+HETATM 1436 H1 HOH B 260 5.433 -3.854 -2.486 1.00 0.00 H \n+HETATM 1437 H2 HOH B 260 4.826 -2.498 -2.195 1.00 0.00 H \n+HETATM 1438 LP1 HOH B 260 4.457 -3.280 -3.259 1.00 0.00 EP \n+HETATM 1439 LP2 HOH B 260 5.489 -2.797 -3.357 1.00 0.00 EP \n+HETATM 1440 O HOH B 261 2.848 -7.556 -0.240 1.00 0.00 O \n+HETATM 1441 H1 HOH B 261 3.632 -7.217 0.191 1.00 0.00 H \n+HETATM 1442 H2 HOH B 261 2.681 -8.394 0.190 1.00 0.00 H \n+HETATM 1443 LP1 HOH B 261 2.962 -7.648 -0.925 1.00 0.00 EP \n+HETATM 1444 LP2 HOH B 261 2.307 -7.120 -0.151 1.00 0.00 EP \n+HETATM 1445 O HOH B 262 7.804 -5.907 -8.277 1.00 0.00 O \n+HETATM 1446 H1 HOH B 262 8.065 -5.330 -7.559 1.00 0.00 H \n+HETATM 1447 H2 HOH B 262 7.347 -5.333 -8.892 1.00 0.00 H \n+HETATM 1448 LP1 HOH B 262 7.378 -6.412 -8.047 1.00 0.00 EP \n+HETATM 1449 LP2 HOH B 262 8.366 -6.195 -8.580 1.00 0.00 EP \n+HETATM 1450 O HOH B 263 7.905 -8.153 5.684 1.00 0.00 O \n+HETATM 1451 H1 HOH B 263 7.190 -7.944 5.082 1.00 0.00 H \n+HETATM 1452 H2 HOH B 263 8.486 -7.394 5.638 1.00 0.00 H \n+HETATM 1453 LP1 HOH B 263 8.239 -8.733 5.479 1.00 0.00 EP \n+HETATM 1454 LP2 HOH B 263 7.662 -8.240 6.334 1.00 0.00 EP \n+HETATM 1455 O HOH B 264 8.727 1.091 -7.845 1.00 0.00 O \n+HETATM 1456 H1 HOH B 264 8.668 1.998 -8.147 1.00 0.00 H \n+HETATM 1457 H2 HOH B 264 8.295 0.582 -8.532 1.00 0.00 H \n+HETATM 1458 LP1 HOH B 264 8.396 1.012 -7.234 1.00 0.00 EP \n+HETATM 1459 LP2 HOH B 264 9.395 0.896 -7.776 1.00 0.00 EP \n+HETATM 1460 O HOH B 265 -7.317 -2.586 10.086 1.00 0.00 O \n+HETATM 1461 H1 HOH B 265 -7.589 -1.670 10.147 1.00 0.00 H \n+HETATM 1462 H2 HOH B 265 -6.366 -2.561 10.189 1.00 0.00 H \n+HETATM 1463 LP1 HOH B 265 -7.491 -2.855 9.463 1.00 0.00 EP \n+HETATM 1464 LP2 HOH B 265 -7.611 -2.966 10.594 1.00 0.00 EP \n+HETATM 1465 O HOH B 266 -7.753 -4.813 11.484 1.00 0.00 O \n+HETATM 1466 H1 HOH B 266 -7.728 -4.005 10.972 1.00 0.00 H \n+HETATM 1467 H2 HOH B 266 -8.070 -4.541 12.346 1.00 0.00 H \n+HETATM 1468 LP1 HOH B 266 -7.114 -5.095 11.533 1.00 0.00 EP \n+HETATM 1469 LP2 HOH B 266 -8.190 -5.276 11.194 1.00 0.00 EP \n+HETATM 1470 O HOH B 267 6.125 5.973 -6.340 1.00 0.00 O \n+HETATM 1471 H1 HOH B 267 5.893 5.082 -6.603 1.00 0.00 H \n+HETATM 1472 H2 HOH B 267 6.027 6.493 -7.138 1.00 0.00 H \n+HETATM 1473 LP1 HOH B 267 6.785 5.998 -6.108 1.00 0.00 EP \n+HETATM 1474 LP2 HOH B 267 5.693 6.203 -5.840 1.00 0.00 EP \n+HETATM 1475 O HOH B 268 6.879 -3.565 11.391 1.00 0.00 O \n+HETATM 1476 H1 HOH B 268 7.595 -4.113 11.069 1.00 0.00 H \n+HETATM 1477 H2 HOH B 268 6.105 -4.126 11.338 1.00 0.00 H \n+HETATM 1478 LP1 HOH B 268 6.801 -2.998 10.988 1.00 0.00 EP \n+HETATM 1479 LP2 HOH B 268 6.996 -3.367 12.052 1.00 0.00 EP \n+HETATM 1480 O HOH B 269 -10.360 -7.288 -6.872 1.00 0.00 O \n+HETATM 1481 H1 HOH B 269 -11.022 -7.025 -7.513 1.00 0.00 H \n+HETATM 1482 H2 HOH B 269 -10.841 -7.815 -6.234 1.00 0.00 H \n+HETATM 1483 LP1 HOH B 269 -10.076 -6.726 -6.566 1.00 0.00 EP \n+HETATM 1484 LP2 HOH B 269 -9.857 -7.667 -7.177 1.00 0.00 EP \n+HETATM 1485 O HOH B 270 4.533 -5.447 10.101 1.00 0.00 O \n+HETATM 1486 H1 HOH B 270 3.905 -6.051 9.705 1.00 0.00 H \n+HETATM 1487 H2 HOH B 270 5.357 -5.626 9.649 1.00 0.00 H \n+HETATM 1488 LP1 HOH B 270 4.595 -5.570 10.788 1.00 0.00 EP \n+HETATM 1489 LP2 HOH B 270 4.334 -4.783 10.000 1.00 0.00 EP \n+HETATM 1490 O HOH B 271 6.757 -5.858 8.748 1.00 0.00 O \n+HETATM 1491 H1 HOH B 271 7.062 -6.762 8.673 1.00 0.00 H \n+HETATM 1492 H2 HOH B 271 7.527 -5.368 9.036 1.00 0.00 H \n+HETATM 1493 LP1 HOH B 271 6.242 -5.809 9.220 1.00 0.00 EP \n+HETATM 1494 LP2 HOH B 271 6.530 -5.621 8.130 1.00 0.00 EP \n+HETATM 1495 O HOH B 272 6.996 -1.656 9.553 1.00 0.00 O \n+HETATM 1496 H1 HOH B 272 6.886 -2.277 10.274 1.00 0.00 H \n+HETATM 1497 H2 HOH B 272 6.537 -0.868 9.844 1.00 0.00 H \n+HETATM 1498 LP1 HOH B 272 6.710 -1.906 8.966 1.00 0.00 EP \n+HETATM 1499 LP2 HOH B 272 7.674 -1.521 9.444 1.00 0.00 EP \n+HETATM 1500 O HOH B 273 9.221 -0.015 1.189 1.00 0.00 O \n+HETATM 1501 H1 HOH B 273 8.458 -0.477 0.841 1.00 0.00 H \n+HETATM 1502 H2 HOH B 273 9.048 0.908 1.002 1.00 0.00 H \n+HETATM 1503 LP1 HOH B 273 9.806 -0.227 0.869 1.00 0.00 EP \n+HETATM 1504 LP2 HOH B 273 9.280 -0.121 1.878 1.00 0.00 EP \n+HETATM 1505 O HOH B 274 8.851 -4.576 9.733 1.00 0.00 O \n+HETATM 1506 H1 HOH B 274 9.126 -3.805 9.237 1.00 0.00 H \n+HETATM 1507 H2 HOH B 274 9.663 -5.054 9.903 1.00 0.00 H \n+HETATM 1508 LP1 HOH B 274 8.408 -4.967 9.358 1.00 0.00 EP \n+HETATM 1509 LP2 HOH B 274 8.545 -4.387 10.334 1.00 0.00 EP \n+HETATM 1510 O HOH B 275 -10.174 -2.723 1.810 1.00 0.00 O \n+HETATM 1511 H1 HOH B 275 -10.980 -2.596 2.310 1.00 0.00 H \n+HETATM 1512 H2 HOH B 275 -10.312 -2.227 1.002 1.00 0.00 H \n+HETATM 1513 LP1 HOH B 275 -10.073 -3.401 1.670 1.00 0.00 EP \n+HETATM 1514 LP2 HOH B 275 -9.623 -2.473 2.162 1.00 0.00 EP \n+HETATM 1515 O HOH B 276 8.073 2.320 0.578 1.00 0.00 O \n+HETATM 1516 H1 HOH B 276 8.570 3.133 0.491 1.00 0.00 H \n+HETATM 1517 H2 HOH B 276 7.395 2.520 1.223 1.00 0.00 H \n+HETATM 1518 LP1 HOH B 276 8.485 1.801 0.804 1.00 0.00 EP \n+HETATM 1519 LP2 HOH B 276 7.786 2.139 -0.035 1.00 0.00 EP \n+HETATM 1520 O HOH B 277 -8.592 2.385 4.554 1.00 0.00 O \n+HETATM 1521 H1 HOH B 277 -8.159 3.186 4.849 1.00 0.00 H \n+HETATM 1522 H2 HOH B 277 -9.416 2.685 4.170 1.00 0.00 H \n+HETATM 1523 LP1 HOH B 277 -8.712 1.956 5.093 1.00 0.00 EP \n+HETATM 1524 LP2 HOH B 277 -8.202 2.055 4.075 1.00 0.00 EP \n+HETATM 1525 O HOH B 278 -8.705 0.417 6.326 1.00 0.00 O \n+HETATM 1526 H1 HOH B 278 -7.837 0.541 6.710 1.00 0.00 H \n+HETATM 1527 H2 HOH B 278 -8.793 1.132 5.695 1.00 0.00 H \n+HETATM 1528 LP1 HOH B 278 -9.202 0.459 6.817 1.00 0.00 EP \n+HETATM 1529 LP2 HOH B 278 -8.747 -0.203 6.004 1.00 0.00 EP \n+HETATM 1530 O HOH B 279 6.372 -2.552 7.072 1.00 0.00 O \n+HETATM 1531 H1 HOH B 279 5.650 -1.943 6.919 1.00 0.00 H \n+HETATM 1532 H2 HOH B 279 6.611 -2.415 7.989 1.00 0.00 H \n+HETATM 1533 LP1 HOH B 279 6.912 -2.406 6.652 1.00 0.00 EP \n+HETATM 1534 LP2 HOH B 279 6.166 -3.213 6.967 1.00 0.00 EP \n+HETATM 1535 O HOH B 280 3.629 -7.797 3.480 1.00 0.00 O \n+HETATM 1536 H1 HOH B 280 3.501 -8.080 4.386 1.00 0.00 H \n+HETATM 1537 H2 HOH B 280 3.290 -6.903 3.458 1.00 0.00 H \n+HETATM 1538 LP1 HOH B 280 3.273 -8.208 3.040 1.00 0.00 EP \n+HETATM 1539 LP2 HOH B 280 4.309 -7.808 3.312 1.00 0.00 EP \n+HETATM 1540 O HOH B 281 -5.358 -8.814 10.973 1.00 0.00 O \n+HETATM 1541 H1 HOH B 281 -4.775 -8.288 10.425 1.00 0.00 H \n+HETATM 1542 H2 HOH B 281 -4.776 -9.247 11.597 1.00 0.00 H \n+HETATM 1543 LP1 HOH B 281 -5.702 -9.286 10.586 1.00 0.00 EP \n+HETATM 1544 LP2 HOH B 281 -5.819 -8.406 11.306 1.00 0.00 EP \n+HETATM 1545 O HOH B 282 -11.893 2.202 9.021 1.00 0.00 O \n+HETATM 1546 H1 HOH B 282 -12.542 1.962 8.360 1.00 0.00 H \n+HETATM 1547 H2 HOH B 282 -11.210 1.537 8.941 1.00 0.00 H \n+HETATM 1548 LP1 HOH B 282 -12.177 2.190 9.661 1.00 0.00 EP \n+HETATM 1549 LP2 HOH B 282 -11.634 2.840 8.893 1.00 0.00 EP \n+HETATM 1550 O HOH B 283 -10.210 0.239 8.514 1.00 0.00 O \n+HETATM 1551 H1 HOH B 283 -9.465 0.114 9.102 1.00 0.00 H \n+HETATM 1552 H2 HOH B 283 -9.818 0.318 7.644 1.00 0.00 H \n+HETATM 1553 LP1 HOH B 283 -10.561 0.821 8.680 1.00 0.00 EP \n+HETATM 1554 LP2 HOH B 283 -10.642 -0.311 8.541 1.00 0.00 EP \n+HETATM 1555 O HOH B 284 -8.311 -3.778 -10.168 1.00 0.00 O \n+HETATM 1556 H1 HOH B 284 -8.639 -2.883 -10.257 1.00 0.00 H \n+HETATM 1557 H2 HOH B 284 -7.508 -3.688 -9.654 1.00 0.00 H \n+HETATM 1558 LP1 HOH B 284 -8.173 -4.054 -10.796 1.00 0.00 EP \n+HETATM 1559 LP2 HOH B 284 -8.776 -4.179 -9.833 1.00 0.00 EP \n+HETATM 1560 O HOH B 285 1.601 -3.391 8.088 1.00 0.00 O \n+HETATM 1561 H1 HOH B 285 1.473 -2.532 7.686 1.00 0.00 H \n+HETATM 1562 H2 HOH B 285 1.951 -3.937 7.384 1.00 0.00 H \n+HETATM 1563 LP1 HOH B 285 0.993 -3.649 8.321 1.00 0.00 EP \n+HETATM 1564 LP2 HOH B 285 2.056 -3.351 8.619 1.00 0.00 EP \n+HETATM 1565 O HOH B 286 5.290 3.942 9.788 1.00 0.00 O \n+HETATM 1566 H1 HOH B 286 5.538 4.220 10.670 1.00 0.00 H \n+HETATM 1567 H2 HOH B 286 5.849 4.458 9.208 1.00 0.00 H \n+HETATM 1568 LP1 HOH B 286 4.614 4.079 9.667 1.00 0.00 EP \n+HETATM 1569 LP2 HOH B 286 5.409 3.258 9.702 1.00 0.00 EP \n+HETATM 1570 O HOH B 287 -7.293 -8.797 4.599 1.00 0.00 O \n+HETATM 1571 H1 HOH B 287 -7.346 -9.752 4.638 1.00 0.00 H \n+HETATM 1572 H2 HOH B 287 -8.204 -8.508 4.548 1.00 0.00 H \n+HETATM 1573 LP1 HOH B 287 -6.936 -8.592 4.033 1.00 0.00 EP \n+HETATM 1574 LP2 HOH B 287 -6.985 -8.542 5.174 1.00 0.00 EP \n+HETATM 1575 O HOH B 288 -7.660 -8.035 -5.611 1.00 0.00 O \n+HETATM 1576 H1 HOH B 288 -7.605 -8.793 -5.029 1.00 0.00 H \n+HETATM 1577 H2 HOH B 288 -6.785 -7.648 -5.585 1.00 0.00 H \n+HETATM 1578 LP1 HOH B 288 -8.139 -7.580 -5.380 1.00 0.00 EP \n+HETATM 1579 LP2 HOH B 288 -7.823 -8.234 -6.262 1.00 0.00 EP \n+HETATM 1580 O HOH B 289 9.419 -2.261 8.477 1.00 0.00 O \n+HETATM 1581 H1 HOH B 289 10.151 -1.696 8.722 1.00 0.00 H \n+HETATM 1582 H2 HOH B 289 8.645 -1.810 8.814 1.00 0.00 H \n+HETATM 1583 LP1 HOH B 289 9.485 -2.893 8.770 1.00 0.00 EP \n+HETATM 1584 LP2 HOH B 289 9.382 -2.329 7.781 1.00 0.00 EP \n+HETATM 1585 O HOH B 290 9.684 5.071 -6.463 1.00 0.00 O \n+HETATM 1586 H1 HOH B 290 9.210 4.633 -7.170 1.00 0.00 H \n+HETATM 1587 H2 HOH B 290 10.607 4.976 -6.699 1.00 0.00 H \n+HETATM 1588 LP1 HOH B 290 9.553 4.763 -5.849 1.00 0.00 EP \n+HETATM 1589 LP2 HOH B 290 9.506 5.747 -6.428 1.00 0.00 EP \n+HETATM 1590 O HOH B 291 4.594 -11.139 4.809 1.00 0.00 O \n+HETATM 1591 H1 HOH B 291 5.207 -10.946 4.100 1.00 0.00 H \n+HETATM 1592 H2 HOH B 291 4.324 -10.280 5.134 1.00 0.00 H \n+HETATM 1593 LP1 HOH B 291 4.908 -11.508 5.314 1.00 0.00 EP \n+HETATM 1594 LP2 HOH B 291 4.042 -11.497 4.568 1.00 0.00 EP \n+HETATM 1595 O HOH B 292 3.694 -9.635 -3.632 1.00 0.00 O \n+HETATM 1596 H1 HOH B 292 4.224 -9.602 -4.428 1.00 0.00 H \n+HETATM 1597 H2 HOH B 292 3.763 -8.756 -3.261 1.00 0.00 H \n+HETATM 1598 LP1 HOH B 292 3.946 -10.112 -3.186 1.00 0.00 EP \n+HETATM 1599 LP2 HOH B 292 3.028 -9.787 -3.785 1.00 0.00 EP \n+HETATM 1600 O HOH B 293 3.826 -7.169 -2.670 1.00 0.00 O \n+HETATM 1601 H1 HOH B 293 4.687 -6.811 -2.452 1.00 0.00 H \n+HETATM 1602 H2 HOH B 293 3.395 -7.288 -1.825 1.00 0.00 H \n+HETATM 1603 LP1 HOH B 293 3.890 -7.781 -3.004 1.00 0.00 EP \n+HETATM 1604 LP2 HOH B 293 3.467 -6.721 -3.071 1.00 0.00 EP \n+HETATM 1605 O HOH B 294 4.452 -11.509 7.810 1.00 0.00 O \n+HETATM 1606 H1 HOH B 294 3.762 -11.361 7.163 1.00 0.00 H \n+HETATM 1607 H2 HOH B 294 5.156 -11.931 7.317 1.00 0.00 H \n+HETATM 1608 LP1 HOH B 294 4.224 -11.927 8.323 1.00 0.00 EP \n+HETATM 1609 LP2 HOH B 294 4.670 -10.902 8.082 1.00 0.00 EP \n+HETATM 1610 O HOH B 295 5.604 -9.379 -5.607 1.00 0.00 O \n+HETATM 1611 H1 HOH B 295 6.297 -9.329 -4.949 1.00 0.00 H \n+HETATM 1612 H2 HOH B 295 5.939 -8.875 -6.348 1.00 0.00 H \n+HETATM 1613 LP1 HOH B 295 5.011 -9.097 -5.364 1.00 0.00 EP \n+HETATM 1614 LP2 HOH B 295 5.486 -10.044 -5.792 1.00 0.00 EP \n+HETATM 1615 O HOH B 296 9.375 -0.524 3.794 1.00 0.00 O \n+HETATM 1616 H1 HOH B 296 9.537 -0.192 2.911 1.00 0.00 H \n+HETATM 1617 H2 HOH B 296 8.610 -0.036 4.098 1.00 0.00 H \n+HETATM 1618 LP1 HOH B 296 9.926 -0.404 4.209 1.00 0.00 EP \n+HETATM 1619 LP2 HOH B 296 9.240 -1.211 3.779 1.00 0.00 EP \n+HETATM 1620 O HOH B 297 -9.170 6.429 6.614 1.00 0.00 O \n+HETATM 1621 H1 HOH B 297 -8.924 6.134 7.490 1.00 0.00 H \n+HETATM 1622 H2 HOH B 297 -10.109 6.255 6.556 1.00 0.00 H \n+HETATM 1623 LP1 HOH B 297 -8.821 6.069 6.125 1.00 0.00 EP \n+HETATM 1624 LP2 HOH B 297 -9.040 7.113 6.537 1.00 0.00 EP \n+HETATM 1625 O HOH B 298 5.046 7.168 -4.285 1.00 0.00 O \n+HETATM 1626 H1 HOH B 298 4.093 7.195 -4.373 1.00 0.00 H \n+HETATM 1627 H2 HOH B 298 5.343 6.670 -5.047 1.00 0.00 H \n+HETATM 1628 LP1 HOH B 298 5.230 6.846 -3.692 1.00 0.00 EP \n+HETATM 1629 LP2 HOH B 298 5.313 7.815 -4.293 1.00 0.00 EP \n+HETATM 1630 O HOH B 299 7.781 8.770 -7.171 1.00 0.00 O \n+HETATM 1631 H1 HOH B 299 6.901 8.412 -7.056 1.00 0.00 H \n+HETATM 1632 H2 HOH B 299 7.664 9.718 -7.115 1.00 0.00 H \n+HETATM 1633 LP1 HOH B 299 8.042 8.589 -7.795 1.00 0.00 EP \n+HETATM 1634 LP2 HOH B 299 8.208 8.543 -6.665 1.00 0.00 EP \n+HETATM 1635 O HOH B 300 8.975 8.701 1.855 1.00 0.00 O \n+HETATM 1636 H1 HOH B 300 8.978 8.839 0.908 1.00 0.00 H \n+HETATM 1637 H2 HOH B 300 8.791 7.768 1.961 1.00 0.00 H \n+HETATM 1638 LP1 HOH B 300 8.478 9.088 2.160 1.00 0.00 EP \n+HETATM 1639 LP2 HOH B 300 9.598 8.863 2.130 1.00 0.00 EP \n+HETATM 1640 O HOH B 301 10.217 10.696 -3.350 1.00 0.00 O \n+HETATM 1641 H1 HOH B 301 9.691 9.903 -3.251 1.00 0.00 H \n+HETATM 1642 H2 HOH B 301 9.985 11.234 -2.593 1.00 0.00 H \n+HETATM 1643 LP1 HOH B 301 10.057 11.026 -3.946 1.00 0.00 EP \n+HETATM 1644 LP2 HOH B 301 10.900 10.543 -3.344 1.00 0.00 EP \n+HETATM 1645 O HOH B 302 -6.924 9.198 8.989 1.00 0.00 O \n+HETATM 1646 H1 HOH B 302 -7.427 8.994 8.201 1.00 0.00 H \n+HETATM 1647 H2 HOH B 302 -6.931 10.154 9.038 1.00 0.00 H \n+HETATM 1648 LP1 HOH B 302 -6.269 8.958 8.934 1.00 0.00 EP \n+HETATM 1649 LP2 HOH B 302 -7.228 8.919 9.555 1.00 0.00 EP \n+HETATM 1650 O HOH B 303 8.112 5.832 -2.041 1.00 0.00 O \n+HETATM 1651 H1 HOH B 303 7.191 5.937 -1.801 1.00 0.00 H \n+HETATM 1652 H2 HOH B 303 8.100 5.230 -2.784 1.00 0.00 H \n+HETATM 1653 LP1 HOH B 303 8.477 5.560 -1.508 1.00 0.00 EP \n+HETATM 1654 LP2 HOH B 303 8.391 6.447 -2.225 1.00 0.00 EP \n+HETATM 1655 O HOH B 304 8.412 9.210 -0.653 1.00 0.00 O \n+HETATM 1656 H1 HOH B 304 7.467 9.072 -0.601 1.00 0.00 H \n+HETATM 1657 H2 HOH B 304 8.684 8.721 -1.429 1.00 0.00 H \n+HETATM 1658 LP1 HOH B 304 8.731 8.963 -0.081 1.00 0.00 EP \n+HETATM 1659 LP2 HOH B 304 8.559 9.891 -0.726 1.00 0.00 EP \n+HETATM 1660 O HOH B 305 9.488 7.210 4.816 1.00 0.00 O \n+HETATM 1661 H1 HOH B 305 8.876 7.934 4.947 1.00 0.00 H \n+HETATM 1662 H2 HOH B 305 9.204 6.540 5.438 1.00 0.00 H \n+HETATM 1663 LP1 HOH B 305 10.144 7.413 4.953 1.00 0.00 EP \n+HETATM 1664 LP2 HOH B 305 9.451 6.970 4.160 1.00 0.00 EP \n+HETATM 1665 O HOH B 306 6.558 9.346 -4.200 1.00 0.00 O \n+HETATM 1666 H1 HOH B 306 5.938 8.621 -4.283 1.00 0.00 H \n+HETATM 1667 H2 HOH B 306 7.356 8.942 -3.861 1.00 0.00 H \n+HETATM 1668 LP1 HOH B 306 6.316 9.828 -3.754 1.00 0.00 EP \n+HETATM 1669 LP2 HOH B 306 6.676 9.643 -4.823 1.00 0.00 EP \n+HETATM 1670 O HOH B 307 9.334 4.619 0.135 1.00 0.00 O \n+HETATM 1671 H1 HOH B 307 9.245 5.214 0.880 1.00 0.00 H \n+HETATM 1672 H2 HOH B 307 8.963 5.103 -0.603 1.00 0.00 H \n+HETATM 1673 LP1 HOH B 307 8.978 4.027 0.248 1.00 0.00 EP \n+HETATM 1674 LP2 HOH B 307 10.007 4.468 0.018 1.00 0.00 EP \n+HETATM 1675 O HOH B 308 3.996 10.167 5.550 1.00 0.00 O \n+HETATM 1676 H1 HOH B 308 3.936 9.424 4.950 1.00 0.00 H \n+HETATM 1677 H2 HOH B 308 4.067 10.932 4.979 1.00 0.00 H \n+HETATM 1678 LP1 HOH B 308 4.562 10.110 5.958 1.00 0.00 EP \n+HETATM 1679 LP2 HOH B 308 3.423 10.209 5.950 1.00 0.00 EP \n+HETATM 1680 O HOH B 309 -11.194 4.735 8.944 1.00 0.00 O \n+HETATM 1681 H1 HOH B 309 -11.360 3.793 8.920 1.00 0.00 H \n+HETATM 1682 H2 HOH B 309 -11.846 5.077 9.557 1.00 0.00 H \n+HETATM 1683 LP1 HOH B 309 -11.279 5.018 8.310 1.00 0.00 EP \n+HETATM 1684 LP2 HOH B 309 -10.546 4.866 9.174 1.00 0.00 EP \n+HETATM 1685 O HOH B 310 -4.581 10.299 4.752 1.00 0.00 O \n+HETATM 1686 H1 HOH B 310 -4.630 10.954 5.448 1.00 0.00 H \n+HETATM 1687 H2 HOH B 310 -3.661 10.035 4.736 1.00 0.00 H \n+HETATM 1688 LP1 HOH B 310 -4.769 10.577 4.137 1.00 0.00 EP \n+HETATM 1689 LP2 HOH B 310 -4.993 9.752 4.897 1.00 0.00 EP \n+HETATM 1690 O HOH B 311 3.647 10.593 -10.165 1.00 0.00 O \n+HETATM 1691 H1 HOH B 311 3.095 9.880 -9.844 1.00 0.00 H \n+HETATM 1692 H2 HOH B 311 4.535 10.237 -10.147 1.00 0.00 H \n+HETATM 1693 LP1 HOH B 311 3.597 11.153 -9.748 1.00 0.00 EP \n+HETATM 1694 LP2 HOH B 311 3.466 10.772 -10.817 1.00 0.00 EP \n+HETATM 1695 O HOH B 312 3.172 -5.171 3.642 1.00 0.00 O \n+HETATM 1696 H1 HOH B 312 2.999 -4.958 4.559 1.00 0.00 H \n+HETATM 1697 H2 HOH B 312 2.525 -4.665 3.152 1.00 0.00 H \n+HETATM 1698 LP1 HOH B 312 3.088 -5.857 3.528 1.00 0.00 EP \n+HETATM 1699 LP2 HOH B 312 3.822 -4.983 3.463 1.00 0.00 EP \n+HETATM 1700 O HOH B 313 8.763 8.119 -3.235 1.00 0.00 O \n+HETATM 1701 H1 HOH B 313 8.628 7.286 -2.782 1.00 0.00 H \n+HETATM 1702 H2 HOH B 313 9.196 7.879 -4.054 1.00 0.00 H \n+HETATM 1703 LP1 HOH B 313 9.170 8.544 -2.855 1.00 0.00 EP \n+HETATM 1704 LP2 HOH B 313 8.151 8.434 -3.361 1.00 0.00 EP \n+HETATM 1705 O HOH B 314 5.829 8.761 -0.651 1.00 0.00 O \n+HETATM 1706 H1 HOH B 314 5.598 7.920 -1.046 1.00 0.00 H \n+HETATM 1707 H2 HOH B 314 5.482 9.414 -1.258 1.00 0.00 H \n+HETATM 1708 LP1 HOH B 314 6.523 8.824 -0.590 1.00 0.00 EP \n+HETATM 1709 LP2 HOH B 314 5.532 8.827 -0.020 1.00 0.00 EP \n+HETATM 1710 O HOH B 315 -10.228 -11.120 -4.980 1.00 0.00 O \n+HETATM 1711 H1 HOH B 315 -10.790 -11.892 -5.041 1.00 0.00 H \n+HETATM 1712 H2 HOH B 315 -9.649 -11.303 -4.240 1.00 0.00 H \n+HETATM 1713 LP1 HOH B 315 -10.609 -10.546 -4.860 1.00 0.00 EP \n+HETATM 1714 LP2 HOH B 315 -9.859 -11.036 -5.569 1.00 0.00 EP \n+HETATM 1715 O HOH B 316 3.640 -10.980 -9.123 1.00 0.00 O \n+HETATM 1716 H1 HOH B 316 3.913 -11.198 -8.232 1.00 0.00 H \n+HETATM 1717 H2 HOH B 316 3.607 -11.822 -9.577 1.00 0.00 H \n+HETATM 1718 LP1 HOH B 316 4.105 -10.553 -9.426 1.00 0.00 EP \n+HETATM 1719 LP2 HOH B 316 3.010 -10.675 -9.121 1.00 0.00 EP \n+HETATM 1720 O HOH B 317 8.875 8.116 -9.498 1.00 0.00 O \n+HETATM 1721 H1 HOH B 317 9.806 8.306 -9.386 1.00 0.00 H \n+HETATM 1722 H2 HOH B 317 8.480 8.346 -8.657 1.00 0.00 H \n+HETATM 1723 LP1 HOH B 317 8.776 7.437 -9.639 1.00 0.00 EP \n+HETATM 1724 LP2 HOH B 317 8.603 8.503 -10.013 1.00 0.00 EP \n+HETATM 1725 O HOH B 318 -11.368 10.527 -4.615 1.00 0.00 O \n+HETATM 1726 H1 HOH B 318 -11.661 10.010 -5.365 1.00 0.00 H \n+HETATM 1727 H2 HOH B 318 -12.139 10.592 -4.052 1.00 0.00 H \n+HETATM 1728 LP1 HOH B 318 -11.157 11.162 -4.819 1.00 0.00 EP \n+HETATM 1729 LP2 HOH B 318 -10.845 10.203 -4.281 1.00 0.00 EP \n+HETATM 1730 O HOH B 319 5.782 7.153 -8.766 1.00 0.00 O \n+HETATM 1731 H1 HOH B 319 4.979 6.850 -9.190 1.00 0.00 H \n+HETATM 1732 H2 HOH B 319 5.856 8.072 -9.019 1.00 0.00 H \n+HETATM 1733 LP1 HOH B 319 6.334 6.788 -8.993 1.00 0.00 EP \n+HETATM 1734 LP2 HOH B 319 5.732 7.091 -8.070 1.00 0.00 EP \n+HETATM 1735 O HOH B 320 6.173 10.085 7.013 1.00 0.00 O \n+HETATM 1736 H1 HOH B 320 5.982 9.548 7.782 1.00 0.00 H \n+HETATM 1737 H2 HOH B 320 5.360 10.079 6.508 1.00 0.00 H \n+HETATM 1738 LP1 HOH B 320 6.697 9.806 6.641 1.00 0.00 EP \n+HETATM 1739 LP2 HOH B 320 6.343 10.737 7.202 1.00 0.00 EP \n+HETATM 1740 O HOH B 321 7.501 -8.299 8.363 1.00 0.00 O \n+HETATM 1741 H1 HOH B 321 7.598 -8.449 7.423 1.00 0.00 H \n+HETATM 1742 H2 HOH B 321 6.750 -8.837 8.615 1.00 0.00 H \n+HETATM 1743 LP1 HOH B 321 7.376 -7.623 8.494 1.00 0.00 EP \n+HETATM 1744 LP2 HOH B 321 8.076 -8.501 8.706 1.00 0.00 EP \n+HETATM 1745 O HOH B 322 -9.183 7.197 -10.649 1.00 0.00 O \n+HETATM 1746 H1 HOH B 322 -9.430 8.041 -10.271 1.00 0.00 H \n+HETATM 1747 H2 HOH B 322 -9.173 7.351 -11.594 1.00 0.00 H \n+HETATM 1748 LP1 HOH B 322 -9.653 6.705 -10.484 1.00 0.00 EP \n+HETATM 1749 LP2 HOH B 322 -8.550 7.000 -10.424 1.00 0.00 EP \n+HETATM 1750 O HOH B 323 6.194 -9.845 11.670 1.00 0.00 O \n+HETATM 1751 H1 HOH B 323 5.740 -9.705 10.839 1.00 0.00 H \n+HETATM 1752 H2 HOH B 323 7.117 -9.687 11.468 1.00 0.00 H \n+HETATM 1753 LP1 HOH B 323 6.100 -10.501 11.895 1.00 0.00 EP \n+HETATM 1754 LP2 HOH B 323 5.967 -9.396 12.156 1.00 0.00 EP \n+HETATM 1755 O HOH B 324 9.566 7.596 -5.685 1.00 0.00 O \n+HETATM 1756 H1 HOH B 324 9.518 6.691 -5.991 1.00 0.00 H \n+HETATM 1757 H2 HOH B 324 8.889 8.054 -6.184 1.00 0.00 H \n+HETATM 1758 LP1 HOH B 324 10.197 7.869 -5.817 1.00 0.00 EP \n+HETATM 1759 LP2 HOH B 324 9.435 7.633 -4.998 1.00 0.00 EP \n+HETATM 1760 O HOH B 325 8.036 9.453 5.290 1.00 0.00 O \n+HETATM 1761 H1 HOH B 325 7.384 9.523 5.987 1.00 0.00 H \n+HETATM 1762 H2 HOH B 325 8.720 10.074 5.537 1.00 0.00 H \n+HETATM 1763 LP1 HOH B 325 7.756 9.626 4.672 1.00 0.00 EP \n+HETATM 1764 LP2 HOH B 325 8.293 8.803 5.255 1.00 0.00 EP \n+HETATM 1765 O HOH B 326 8.316 -10.500 -7.906 1.00 0.00 O \n+HETATM 1766 H1 HOH B 326 7.761 -9.721 -7.945 1.00 0.00 H \n+HETATM 1767 H2 HOH B 326 8.892 -10.346 -7.156 1.00 0.00 H \n+HETATM 1768 LP1 HOH B 326 8.689 -10.568 -8.494 1.00 0.00 EP \n+HETATM 1769 LP2 HOH B 326 7.929 -11.075 -7.806 1.00 0.00 EP \n+HETATM 1770 O HOH B 327 -8.154 -9.039 7.371 1.00 0.00 O \n+HETATM 1771 H1 HOH B 327 -7.898 -9.343 8.242 1.00 0.00 H \n+HETATM 1772 H2 HOH B 327 -8.973 -8.563 7.515 1.00 0.00 H \n+HETATM 1773 LP1 HOH B 327 -8.256 -9.581 6.940 1.00 0.00 EP \n+HETATM 1774 LP2 HOH B 327 -7.666 -8.615 7.103 1.00 0.00 EP \n+HETATM 1775 O HOH B 328 -10.252 -5.795 -9.481 1.00 0.00 O \n+HETATM 1776 H1 HOH B 328 -10.218 -5.008 -10.025 1.00 0.00 H \n+HETATM 1777 H2 HOH B 328 -9.398 -5.824 -9.048 1.00 0.00 H \n+HETATM 1778 LP1 HOH B 328 -10.348 -6.365 -9.876 1.00 0.00 EP \n+HETATM 1779 LP2 HOH B 328 -10.767 -5.748 -9.010 1.00 0.00 EP \n+TER 1780 HOH B 328\n+HETATM 1781 Na NA C 1 1.968 9.986 -1.390 1.00 0.00 Na \n+HETATM 1782 Na NA C 2 -5.965 -7.867 2.917 1.00 0.00 Na \n+HETATM 1783 Na NA C 3 -7.977 -8.998 0.259 1.00 0.00 Na \n+HETATM 1784 Na NA C 4 -4.898 8.187 9.077 1.00 0.00 Na \n+HETATM 1785 Na NA C 5 -6.503 -7.754 6.490 1.00 0.00 Na \n+HETATM 1786 Na NA C 6 3.617 -3.455 -4.677 1.00 0.00 Na \n+HETATM 1787 Na NA C 7 9.065 -2.767 3.619 1.00 0.00 Na \n+HETATM 1788 Na NA C 8 -8.524 -8.403 -7.725 1.00 0.00 Na \n+HETATM 1789 Cl CL C 9 1.679 1.733 8.540 1.00 0.00 Cl \n+HETATM 1790 Cl CL C 10 -4.027 4.212 9.047 1.00 0.00 Cl \n+HETATM 1791 Cl CL C 11 2.743 -7.604 8.563 1.00 0.00 Cl \n+HETATM 1792 Cl CL C 12 3.455 3.453 -9.133 1.00 0.00 Cl \n+HETATM 1793 Cl CL C 13 6.638 -5.663 -1.890 1.00 0.00 Cl \n+HETATM 1794 Cl CL C 14 -6.207 -10.120 -3.654 1.00 0.00 Cl \n+TER 1795 CL C 14\n+END\n", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}107{"question_id": "MSB_openmm_openmm_pr4995", "question_type": "multi_swe_bench", "description": "Adaptive quantum thermal bath (openmm/openmm#4995)", "content": {"org": "openmm", "repo": "openmm", "pr_number": 4995, "issue_title": "Adaptive quantum thermal bath", "issue_body": "I'm implementing the adaptive quantum thermal bath (adQTB) algorithm. This is a fast method of simulating nuclear quantum effects. I've written the reference implementation so far.\r\n\r\nImplements #4225.", "base_commit": "bb3073d4f3722abeb4f215f358f5ae709c996ad0", "resolved_issues": [{"number": null, "title": "Adaptive quantum thermal bath", "body": "The Adaptive Quantum Thermal Bath (adQTB) algorithm is not currently available in the software, limiting the ability to efficiently simulate nuclear quantum effects in molecular systems. This creates a gap for users who require a fast and accurate method to approximate these effects, particularly in systems where quantum behavior significantly impacts the dynamics.\n\nThe expected behavior is that the software provides an integrator implementing the adQTB algorithm. This integrator should enable simulations that approximate nuclear quantum effects by applying a frequency-dependent Langevin thermostat, with automatic adjustments to prevent zero-point energy leakage. Users should be able to utilize this feature seamlessly within the existing framework to perform simulations with near-classical computational efficiency while capturing quantum effects.\n\n## IMPORTANT INSTRUCTIONS\n\n1. If you edit a python file, you MUST run 'make PythonInstall' inside the build directory\n2. If you edit a c++ file, you MUST run 'make -j4 && make install\" inside the build directory"}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/openmm_m_openmm:pr-4995", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/docs-source/api-c++/integrators.rst b/docs-source/api-c++/integrators.rst\nindex ba5701dc41..23692a8a1b 100644\n--- a/docs-source/api-c++/integrators.rst\n+++ b/docs-source/api-c++/integrators.rst\n@@ -57,6 +57,17 @@ The RPMD integrator implements Ring Polymer MD.\n generated/RPMDIntegrator\n \n \n+Quantum Thermal Bath integrators\n+================================\n+\n+The QTB integrator implements the adaptive quantum thermal bath (adQTB) method.\n+\n+.. toctree::\n+ :maxdepth: 2\n+\n+ generated/QTBIntegrator\n+\n+\n Dissipative Particle Dynamics integrators\n =========================================\n \ndiff --git a/docs-source/usersguide/references.bib b/docs-source/usersguide/references.bib\nindex c3275b26c6..24130b299f 100644\n--- a/docs-source/usersguide/references.bib\n+++ b/docs-source/usersguide/references.bib\n@@ -346,6 +346,17 @@ @article{Maier2015\n type = {Journal Article}\n }\n \n+@article{Mangaud2019\n+ author = {Mangaud, Etienne and Huppert, Simon and Pl{\\'e}, Thomas and Depondt, Philippe and Bonella, Sara and Finocchi, Fabio},\n+ title = {The Fluctuation\u2013Dissipation Theorem as a Diagnosis and Cure for Zero-Point Energy Leakage in Quantum Thermal Bath Simulations},\n+ journal = {Journal of Chemical Theory and Computation},\n+ volume = {15},\n+ number = {5},\n+ pages = {2863-2880},\n+ year = {2019},\n+ doi = {10.1021/acs.jctc.8b01164},\n+}\n+\n @article{Marinari1992,\n doi = {10.1209/0295-5075/19/6/002},\n year = 1992,\n@@ -378,6 +389,17 @@ @article{Markland2008\n type = {Journal Article}\n }\n \n+@article{Mauger2021\n+ author = {Mauger, Nastasia and Pl{\\'e}, Thomas and Lagard\u00e8re, Louis and Bonella, Sara and Mangaud, {\\'E}tienne and Piquemal, Jean-Philip and Huppert, Simon},\n+ title = {Nuclear Quantum Effects in Liquid Water at Near Classical Computational Cost Using the Adaptive Quantum Thermal Bath},\n+ journal = {The Journal of Physical Chemistry Letters},\n+ volume = {12},\n+ number = {34},\n+ pages = {8285-8291},\n+ year = {2021},\n+ doi = {10.1021/acs.jpclett.1c01722},\n+}\n+\n @article{Mongan2007\n author = {Mongan, John and Simmerling, Carlos and McCammon, J. Andrew and Case, David A. and Onufriev, Alexey},\n title = {Generalized {Born} model with a simple, robust molecular volume correction},\ndiff --git a/docs-source/usersguide/theory/04_integrators.rst b/docs-source/usersguide/theory/04_integrators.rst\nindex 94ac6a7694..e3dfaad365 100644\n--- a/docs-source/usersguide/theory/04_integrators.rst\n+++ b/docs-source/usersguide/theory/04_integrators.rst\n@@ -294,3 +294,102 @@ on the types of the particles.\n \n The integration is done using the same LFMiddle discretization used for\n LangevinIntegrator. :cite:`Zhang2019`\n+\n+QTBIntegrator\n+*************\n+\n+This integrator implements the Adaptive Quantum Thermal Bath (adQTB) algorithm.\n+:cite:`Mangaud2019` This is a fast method for approximating nuclear quantum\n+effects by applying a Langevin thermostat whose random force varies with\n+frequency to match the expected energy of a quantum harmonic oscillator.\n+\n+It integrates the Langevin equation\n+\n+.. math::\n+ m_i\\frac{d\\mathbf{v}_i}{dt}=\\mathbf{f}_i-\\gamma_f m_i \\mathbf{v}_i+\\mathbf{R}_i\n+\n+Unlike LangevinIntegrator, for which the random noise force :math:`\\mathbf{R}_i`\n+is uncorrelated white noise, in this case its cross correlation function is given\n+by\n+\n+.. math::\n+ C(\\omega) = 2 m_i \\gamma_r \\theta(\\omega, T)\n+\n+where\n+\n+.. math::\n+ \\theta(\\omega, T) = \\hbar \\omega \\left( \\frac{1}{2} + \\frac{1}{e^{\\hbar \\omega / k_B T} - 1} \\right)\n+\n+In the limit of high temperature, :math:`\\theta(\\omega, T) \\approx k_B T`,\n+reproducing the classical behavior. In the limit of low temperature,\n+:math:`\\theta(\\omega, T) \\approx \\hbar \\omega / 2`, which is the ground state\n+energy of a quantum harmonic oscillator with frequency :math:`\\omega`.\n+\n+A problem that can arise with this method is zero-point energy leakage. The\n+thermostat drives the system toward the desired quantum energy distribution, but\n+the classical dynamics of the system causes it to continuously relax toward the\n+classical distribution. The result is too much energy in the low frequency modes\n+and too little energy in the high frequency modes. A solution is to allow the\n+two friction coefficients to differ. The coefficient :math:`\\gamma_f` appearing\n+in the friction term of the Langevin equation is fixed as a constant. The\n+coefficient :math:`\\gamma_r` that determines the magnitude of the random force\n+becomes frequency dependent, :math:`\\gamma_r(\\omega)`. Its spectrum is dynamically\n+adjusted to produce the correct distribution of energy between modes.\n+\n+In practice, the simulation is divided into short segments, typically on the\n+order of 1000 time steps. At the end of each segment, we calculate the velocity\n+autocorrelation function :math:`C_{vv}(\\omega)` of each degree of freedom, as\n+well as the correlation :math:`C_{vR}(\\omega)` between the velocity and random\n+force :math:`\\mathbf{R}`. From these we can calculate the amount by which the\n+fluctuation-dissipation theorem is violated at each frequency:\n+\n+.. math::\n+ \\Delta_{FDT}(\\omega) = \\mathrm{Re}[C_{vR}(\\omega)] - m \\gamma_r(\\omega) C_{vv}(\\omega)\n+\n+We then select new friction coefficients according to\n+\n+.. math::\n+ \\gamma_r^{k+1}(\\omega) = \\gamma_r^k(\\omega) - A \\Delta_{FDT}^k(\\omega)\n+\n+where :math:`k` is the index of the segment and the adaptation rate :math:`A`\n+may vary between degrees of freedom. Random noise for the next segment is\n+generated based on the new spectrum, and the simulation continues. The value of\n+:math:`A` generally needs to be determined by trial and error to find a value\n+that produces fast adaptation and good convergence.\n+\n+This process is much more robust if data is pooled over all degrees of freedom\n+that are expected to be equivalent. One specifies a type index for each\n+particle. :math:`\\Delta_{FDT}(\\omega)` is computed as the average over all\n+three coordinates of all particles with the same type. The more particles that\n+are averaged over, the larger :math:`A` can be, leading to faster adaptation.\n+\n+When running simulations with adQTB, it is critical to equilibrate the system\n+long enough for :math:`\\gamma_r(\\omega)` to converge. Until it does, the\n+simulation does not explore the correct distribution of states.\n+\n+Simulations with adQTB tend to require a larger friction coefficient\n+:math:`\\gamma_f` than is usual in fully classical simulations, typically 10\n+ps\\ :sup:`-1` or more. If the friction is too low, it is impossible to fully\n+compensate for zero-point energy leakage. Even reducing the random force to\n+zero may still leave too much energy in low frequency modes. It is important\n+to check the converged spectrum of :math:`\\gamma_r(\\omega)`. If it is close to\n+zero at some frequencies, that suggests :math:`\\gamma_f` needs to be increased.\n+\n+A possible consequence of the large friction coefficient is unwanted broadening\n+of spectral peaks, leading to a less accurate energy spectrum. This is\n+compensated through a deconvolution procedure. :cite:`Mauger2021` The target\n+spectrum :math:`\\theta(\\omega, T)` is replaced with a deconvolved version\n+:math:`\\tilde{\\theta}(\\omega, T)` related to it by\n+\n+.. math::\n+ \\frac{\\theta(\\omega_0, T)}{2} = \\int \\frac{d\\omega}{\\pi} \\frac{\\gamma \\omega_0^2}{(\\omega^2-\\omega_0^2)^2 + \\gamma^2\\omega^2} \\tilde{\\theta}(\\omega, T)\n+\n+An iterative procedure is used to solve for :math:`\\tilde{\\theta}(\\omega, T)`,\n+which is then used in place of :math:`\\theta(\\omega, T)` when computing the\n+random force.\n+\n+One must be very careful when trying to compute velocity dependent thermodynamic\n+quantities, such as the instantaneous temperature or instantaneous pressure.\n+The standard calculations for these quantities assume the velocities follow a\n+classical distribution. They do not produce correct results for an adQTB\n+simulation, in which the velocities follow a quantum distribution.\ndiff --git a/olla/include/openmm/kernels.h b/olla/include/openmm/kernels.h\nindex 9b9a5a7656..bae1996a4d 100644\n--- a/olla/include/openmm/kernels.h\n+++ b/olla/include/openmm/kernels.h\n@@ -57,6 +57,7 @@\n #include \"openmm/KernelImpl.h\"\n #include \"openmm/MonteCarloBarostat.h\"\n #include \"openmm/PeriodicTorsionForce.h\"\n+#include \"openmm/QTBIntegrator.h\"\n #include \"openmm/RBTorsionForce.h\"\n #include \"openmm/RMSDForce.h\"\n #include \"openmm/NonbondedForce.h\"\n@@ -1435,6 +1436,72 @@ class IntegrateDPDStepKernel : public KernelImpl {\n virtual double computeKineticEnergy(ContextImpl& context, const DPDIntegrator& integrator) = 0;\n };\n \n+/**\n+ * This kernel is invoked by QTBIntegrator to take one time step.\n+ */\n+class IntegrateQTBStepKernel : public KernelImpl {\n+public:\n+ static std::string Name() {\n+ return \"IntegrateQTBStep\";\n+ }\n+ IntegrateQTBStepKernel(std::string name, const Platform& platform) : KernelImpl(name, platform) {\n+ }\n+ /**\n+ * Initialize the kernel.\n+ * \n+ * @param system the System this kernel will be applied to\n+ * @param integrator the QTBIntegrator this kernel will be used for\n+ */\n+ virtual void initialize(const System& system, const QTBIntegrator& integrator) = 0;\n+ /**\n+ * Execute the kernel.\n+ * \n+ * @param context the context in which to execute this kernel\n+ * @param integrator the QTBIntegrator this kernel is being used for\n+ */\n+ virtual void execute(ContextImpl& context, const QTBIntegrator& integrator) = 0;\n+ /**\n+ * Compute the kinetic energy.\n+ * \n+ * @param context the context in which to execute this kernel\n+ * @param integrator the QTBIntegrator this kernel is being used for\n+ */\n+ virtual double computeKineticEnergy(ContextImpl& context, const QTBIntegrator& integrator) = 0;\n+ /**\n+ * Get the adapted friction coefficients for a particle.\n+ * \n+ * @param context the context in which to execute this kernel\n+ * @param particle the index of the particle for which to get the friction\n+ * @param friction the adapted friction coefficients used in generating the\n+ * random force\n+ */\n+ virtual void getAdaptedFriction(ContextImpl& context, int particle, std::vector<double>& friction) const = 0;\n+ /**\n+ * Set the adapted friction coefficients for a particle. This affects the\n+ * specified particle, and all others that have the same type.\n+ * \n+ * @param context the context in which to execute this kernel\n+ * @param particle the index of the particle for which to get the friction\n+ * @param friction the adapted friction coefficients used in generating the\n+ * random force\n+ */\n+ virtual void setAdaptedFriction(ContextImpl& context, int particle, const std::vector<double>& friction) = 0;\n+ /**\n+ * Write the adapted friction to a checkpoint.\n+ * \n+ * @param context the context in which to execute this kernel\n+ * @param stream the stream to write the checkpoint to\n+ */\n+ virtual void createCheckpoint(ContextImpl& context, std::ostream& stream) const = 0;\n+ /**\n+ * Load the adapted friction from a checkpoint.\n+ * \n+ * @param context the context in which to execute this kernel\n+ * @param stream the stream to read the checkpoint from\n+ */\n+ virtual void loadCheckpoint(ContextImpl& context, std::istream& stream) = 0;\n+};\n+\n /**\n * This kernel is invoked by AndersenThermostat at the start of each time step to adjust the particle velocities.\n */\ndiff --git a/openmmapi/include/OpenMM.h b/openmmapi/include/OpenMM.h\nindex 1c4f7db991..df064cbc28 100644\n--- a/openmmapi/include/OpenMM.h\n+++ b/openmmapi/include/OpenMM.h\n@@ -68,6 +68,7 @@\n #include \"openmm/Context.h\"\n #include \"openmm/OpenMMException.h\"\n #include \"openmm/PeriodicTorsionForce.h\"\n+#include \"openmm/QTBIntegrator.h\"\n #include \"openmm/RBTorsionForce.h\"\n #include \"openmm/RMSDForce.h\"\n #include \"openmm/State.h\"\ndiff --git a/openmmapi/include/openmm/QTBIntegrator.h b/openmmapi/include/openmm/QTBIntegrator.h\nnew file mode 100644\nindex 0000000000..93065ad4a8\n--- /dev/null\n+++ b/openmmapi/include/openmm/QTBIntegrator.h\n@@ -0,0 +1,283 @@\n+#ifndef OPENMM_QTBINTEGRATOR_H_\n+#define OPENMM_QTBINTEGRATOR_H_\n+\n+/* -------------------------------------------------------------------------- *\n+ * OpenMM *\n+ * -------------------------------------------------------------------------- *\n+ * This is part of the OpenMM molecular simulation toolkit originating from *\n+ * Simbios, the NIH National Center for Physics-Based Simulation of *\n+ * Biological Structures at Stanford, funded under the NIH Roadmap for *\n+ * Medical Research, grant U54 GM072970. See https://simtk.org. *\n+ * *\n+ * Portions copyright (c) 2025 Stanford University and the Authors. *\n+ * Authors: Peter Eastman *\n+ * Contributors: *\n+ * *\n+ * Permission is hereby granted, free of charge, to any person obtaining a *\n+ * copy of this software and associated documentation files (the \"Software\"), *\n+ * to deal in the Software without restriction, including without limitation *\n+ * the rights to use, copy, modify, merge, publish, distribute, sublicense, *\n+ * and/or sell copies of the Software, and to permit persons to whom the *\n+ * Software is furnished to do so, subject to the following conditions: *\n+ * *\n+ * The above copyright notice and this permission notice shall be included in *\n+ * all copies or substantial portions of the Software. *\n+ * *\n+ * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR *\n+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, *\n+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL *\n+ * THE AUTHORS, CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, *\n+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR *\n+ * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE *\n+ * USE OR OTHER DEALINGS IN THE SOFTWARE. *\n+ * -------------------------------------------------------------------------- */\n+\n+#include \"Integrator.h\"\n+#include \"openmm/Kernel.h\"\n+#include \"internal/windowsExport.h\"\n+\n+namespace OpenMM {\n+\n+/**\n+ * This integrator implements the Adaptive Quantum Thermal Bath (adQTB) algorithm\n+ * as described in https://doi.org/10.1021/acs.jctc.8b01164. This is a fast method\n+ * for approximating nuclear quantum effects by applying a Langevin thermostat whose\n+ * random force varies with frequency to match the expected energy of a quantum\n+ * harmonic oscillator.\n+ * \n+ * To compensate for zero point energy leakage, the spectrum of the random force\n+ * is adjusted automatically. The trajectory is divided into short segments. At\n+ * the end of each segment, the distribution of energy across frequencies is evaluated,\n+ * and the friction coefficients used in generating the random force are adjusted\n+ * to better match the target distribution. You can monitor this process by calling\n+ * getAdaptedFriction(). It is important to equilibrate the simulation long enough\n+ * for the friction coefficients to converge before beginning the production part of\n+ * the simulation.\n+ * \n+ * To make this process more robust, it is recommended to average the data over all\n+ * particles that are expected to behave identically. To do this, you can optionally\n+ * call setParticleType() to define a particle as having a particular type. The\n+ * data for all particles of the same type is averaged and they are adjusted together.\n+ * You also can set a different adaptation rate for each particle type. The more\n+ * particles that are being averaged over, the higher the adaptation rate can reasonably\n+ * be set, leading to faster adaptation.\n+ * \n+ * Most properties of this integrator are fixed at Context creation time and can\n+ * only be changed after that by reinitializing the Context. That includes the\n+ * step size, friction coefficient, segment length, cutoff frequency, particle types,\n+ * and adaptation rates. The only property of the integrator that can be freely\n+ * changed in the middle of a simulation is the temperature, and even that requires\n+ * some care. The new temperature will not take effect until the beginning of the\n+ * next segment. Furthermore, changing the temperature is a potentially expensive\n+ * operation, since it requires performing a calculation whose cost scales as the\n+ * cube of the number of time steps in a segment.\n+ * \n+ * One must be very careful when trying to compute velocity dependent thermodynamic\n+ * quantities, such as the instantaneous temperature or instantaneous pressure.\n+ * The standard calculations for these quantities assume the velocities follow a\n+ * classical distribution. They do not produce correct results for an adQTB\n+ * simulation, in which the velocities follow a quantum distribution.\n+ */\n+class OPENMM_EXPORT QTBIntegrator : public Integrator {\n+public:\n+ /**\n+ * Create a QTBIntegrator.\n+ * \n+ * @param temperature the temperature of the heat bath (in Kelvin)\n+ * @param frictionCoeff the friction coefficient which couples the system to the heat bath (in inverse picoseconds)\n+ * @param stepSize the step size with which to integrate the system (in picoseconds)\n+ */\n+ QTBIntegrator(double temperature, double frictionCoeff, double stepSize);\n+ /**\n+ * Get the temperature of the heat bath (in Kelvin).\n+ *\n+ * @return the temperature of the heat bath, measured in Kelvin\n+ */\n+ double getTemperature() const {\n+ return temperature;\n+ }\n+ /**\n+ * Set the temperature of the heat bath (in Kelvin).\n+ *\n+ * @param temp the temperature of the heat bath, measured in Kelvin\n+ */\n+ void setTemperature(double temp);\n+ /**\n+ * Get the friction coefficient which determines how strongly the system is coupled to\n+ * the heat bath (in inverse ps).\n+ *\n+ * @return the friction coefficient, measured in 1/ps\n+ */\n+ double getFriction() const {\n+ return friction;\n+ }\n+ /**\n+ * Set the friction coefficient which determines how strongly the system is coupled to\n+ * the heat bath (in inverse ps).\n+ *\n+ * @param coeff the friction coefficient, measured in 1/ps\n+ */\n+ void setFriction(double coeff);\n+ /**\n+ * Get the length of each segment used for adapting the noise spectrum.\n+ * \n+ * @return the segment length, measured in ps\n+ */\n+ double getSegmentLength() const;\n+ /**\n+ * Set the length of each segment used for adapting the noise spectrum.\n+ * \n+ * @param length the segment length, measured in ps\n+ */\n+ void setSegmentLength(double length);\n+ /**\n+ * Get the cutoff frequency applied to the colored noise.\n+ * \n+ * @return the cutoff frequency, measured in 1/ps\n+ */\n+ double getCutoffFrequency() const;\n+ /**\n+ * Set the cutoff frequency applied to the colored noise.\n+ * \n+ * @param cutoff the cutoff frequency, measured in 1/ps\n+ */\n+ void setCutoffFrequency(double cutoff);\n+ /**\n+ * Get a map whose keys are particle indices and whose values are particle types. This\n+ * contains only the particles that have been specifically set with setParticleType().\n+ */\n+ const std::map<int, int>& getParticleTypes() const;\n+ /**\n+ * Set the type of a particle. This is an arbitrary integer.\n+ */\n+ void setParticleType(int index, int type);\n+ /**\n+ * Get the default adaptation rate. This is the rate used for particles whose\n+ * rate has not been otherwise specified with setTypeAdaptationRate(). It\n+ * determines how much the noise spectrum changes after each segment.\n+ */\n+ double getDefaultAdaptationRate() const;\n+ /**\n+ * Set the default adaptation rate. This is the rate used for particles whose\n+ * rate has not been otherwise specified with setTypeAdaptationRate(). It\n+ * determines how much the noise spectrum changes after each segment.\n+ */\n+ void setDefaultAdaptationRate(double rate);\n+ /**\n+ * Get a map whose keys are particle types and whose values are adaptation rates.\n+ * These are the rates used for particles whose rates have been specified with\n+ * setTypeAdaptationRate(). The rate determines how much the noise spectrum\n+ * changes after each segment.\n+ */\n+ const std::map<int, double>& getTypeAdaptationRates() const;\n+ /**\n+ * Set the adaptation rate to use for particles of a given type. The rate\n+ * determines how much the noise spectrum changes after each segment.\n+ */\n+ void setTypeAdaptationRate(int type, double rate);\n+ /**\n+ * Get the adapted friction coefficients for a particle. The return value is\n+ * a vector of length numFreq = (3*n+1)/2, where n is the number of time steps\n+ * in a segment. Element i is the friction coefficient used in generating\n+ * the random force with frequency i*pi/(numFreq*stepSize).\n+ * \n+ * This method is guaranteed to return identical results for particles that\n+ * have the same type.\n+ * \n+ * @param particle the index of the particle for which to get the friction\n+ * @param friction the adapted friction coefficients used in generating the\n+ * random force.\n+ */\n+ void getAdaptedFriction(int particle, std::vector<double>& friction) const;\n+ /**\n+ * Get the random number seed. See setRandomNumberSeed() for details.\n+ */\n+ int getRandomNumberSeed() const {\n+ return randomNumberSeed;\n+ }\n+ /**\n+ * Set the random number seed. The precise meaning of this parameter is undefined, and is left up\n+ * to each Platform to interpret in an appropriate way. It is guaranteed that if two simulations\n+ * are run with different random number seeds, the sequence of random forces will be different. On\n+ * the other hand, no guarantees are made about the behavior of simulations that use the same seed.\n+ * In particular, Platforms are permitted to use non-deterministic algorithms which produce different\n+ * results on successive runs, even if those runs were initialized identically.\n+ *\n+ * If seed is set to 0 (which is the default value assigned), a unique seed is chosen when a Context\n+ * is created from this Integrator. This is done to ensure that each Context receives unique random seeds\n+ * without you needing to set them explicitly.\n+ */\n+ void setRandomNumberSeed(int seed) {\n+ randomNumberSeed = seed;\n+ }\n+ /**\n+ * Advance a simulation through time by taking a series of time steps.\n+ * \n+ * @param steps the number of time steps to take\n+ */\n+ void step(int steps);\n+protected:\n+ /**\n+ * This will be called by the Context when it is created. It informs the Integrator\n+ * of what context it will be integrating, and gives it a chance to do any necessary initialization.\n+ * It will also get called again if the application calls reinitialize() on the Context.\n+ */\n+ void initialize(ContextImpl& context);\n+ /**\n+ * This will be called by the Context when it is destroyed to let the Integrator do any necessary\n+ * cleanup. It will also get called again if the application calls reinitialize() on the Context.\n+ */\n+ void cleanup();\n+ /**\n+ * Get the names of all Kernels used by this Integrator.\n+ */\n+ std::vector<std::string> getKernelNames();\n+ /**\n+ * Compute the kinetic energy of the system at the current time.\n+ */\n+ double computeKineticEnergy();\n+ /**\n+ * Computing kinetic energy for this integrator does not require forces.\n+ */\n+ bool kineticEnergyRequiresForce() const;\n+ /**\n+ * Get the time interval by which velocities are offset from positions. This is used to\n+ * adjust velocities when setVelocitiesToTemperature() is called on a Context.\n+ */\n+ double getVelocityTimeOffset() const {\n+ return getStepSize()/2;\n+ }\n+ /**\n+ * This is called while writing checkpoints. It gives the integrator a chance to write\n+ * its own data.\n+ */\n+ void createCheckpoint(std::ostream& stream) const;\n+ /**\n+ * This is called while loading a checkpoint. The integrator should read in whatever\n+ * data it wrote in createCheckpoint() and update its internal state accordingly.\n+ */\n+ void loadCheckpoint(std::istream& stream);\n+ /**\n+ * This is called while creating a State. The Integrator should store the values\n+ * of all time-varying parameters into the SerializationNode so they can be saved\n+ * as part of the state.\n+ */\n+ void serializeParameters(SerializationNode& node) const;\n+ /**\n+ * This is called when loading a previously saved State. The Integrator should\n+ * load the values of all time-varying parameters from the SerializationNode. If\n+ * the node contains parameters that are not defined for this Integrator, it should\n+ * throw an exception.\n+ */\n+ void deserializeParameters(const SerializationNode& node);\n+private:\n+ double temperature, friction, segmentLength, defaultAdaptationRate, cutoffFrequency;\n+ std::map<int, int> particleType;\n+ std::map<int, double> typeAdaptationRates;\n+ int randomNumberSeed;\n+ Kernel kernel;\n+};\n+\n+} // namespace OpenMM\n+\n+#endif /*OPENMM_QTBINTEGRATOR_H_*/\ndiff --git a/openmmapi/include/openmm/internal/QTBIntegratorUtilities.h b/openmmapi/include/openmm/internal/QTBIntegratorUtilities.h\nnew file mode 100644\nindex 0000000000..30c68de541\n--- /dev/null\n+++ b/openmmapi/include/openmm/internal/QTBIntegratorUtilities.h\n@@ -0,0 +1,76 @@\n+#ifndef OPENMM_QTBINTEGRATORUTILITIES_H_\n+#define OPENMM_QTBINTEGRATORUTILITIES_H_\n+\n+/* -------------------------------------------------------------------------- *\n+ * OpenMM *\n+ * -------------------------------------------------------------------------- *\n+ * This is part of the OpenMM molecular simulation toolkit originating from *\n+ * Simbios, the NIH National Center for Physics-Based Simulation of *\n+ * Biological Structures at Stanford, funded under the NIH Roadmap for *\n+ * Medical Research, grant U54 GM072970. See https://simtk.org. *\n+ * *\n+ * Portions copyright (c) 2025 Stanford University and the Authors. *\n+ * Authors: Peter Eastman *\n+ * Contributors: *\n+ * *\n+ * Permission is hereby granted, free of charge, to any person obtaining a *\n+ * copy of this software and associated documentation files (the \"Software\"), *\n+ * to deal in the Software without restriction, including without limitation *\n+ * the rights to use, copy, modify, merge, publish, distribute, sublicense, *\n+ * and/or sell copies of the Software, and to permit persons to whom the *\n+ * Software is furnished to do so, subject to the following conditions: *\n+ * *\n+ * The above copyright notice and this permission notice shall be included in *\n+ * all copies or substantial portions of the Software. *\n+ * *\n+ * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR *\n+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, *\n+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL *\n+ * THE AUTHORS, CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, *\n+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR *\n+ * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE *\n+ * USE OR OTHER DEALINGS IN THE SOFTWARE. *\n+ * -------------------------------------------------------------------------- */\n+\n+#include \"openmm/QTBIntegrator.h\"\n+#include \"openmm/System.h\"\n+#include \"openmm/internal/ThreadPool.h\"\n+#include <vector>\n+\n+namespace OpenMM {\n+\n+/**\n+ * This class defines a set of utility functions that are useful in implementing QTBIntegrator.\n+ */\n+\n+class OPENMM_EXPORT QTBIntegratorUtilities {\n+public:\n+ /**\n+ * Identify unique particle types, and record the sets of particles with the same type.\n+ * \n+ * @param system the System being simulated\n+ * @param integrator the integrator defining the particle types\n+ * @param particleType on exit, element i is the type index of particle i\n+ * @param typeParticles on exit, element i contains the indices of all particles with type i\n+ * @param typeMass on exit, element i contains the mass of particles with type i\n+ * @param typeAdaptationRate on exit, element i contains the adaptation rate of particles with type i\n+ */\n+ static void findTypes(const System& system, const QTBIntegrator& integrator, std::vector<int>& particleType,\n+ std::vector<std::vector<int> >& typeParticles, std::vector<double>& typeMass, std::vector<double>& typeAdaptationRate);\n+ /**\n+ * Calculate the target noise spectrum.\n+ * \n+ * @param temperature the target temperature, in Kelvin\n+ * @param friction the friction coefficient in 1/ps\n+ * @param dt the integration step size, in ps\n+ * @param numFreq the number of frequency bins in the spectrum\n+ * @param theta the standard version of the spectrum is stored into this\n+ * @param thetad the deconvolved version of the spectrum is stored into this\n+ * @param threads a ThreadPool to use for parallelization\n+ */\n+ static void calculateSpectrum(double temperature, double friction, double dt, int numFreq, std::vector<double>& theta, std::vector<double>& thetad, ThreadPool& threads);\n+};\n+\n+} // namespace OpenMM\n+\n+#endif /*OPENMM_QTBINTEGRATORUTILITIES_H_*/\ndiff --git a/openmmapi/src/QTBIntegrator.cpp b/openmmapi/src/QTBIntegrator.cpp\nnew file mode 100644\nindex 0000000000..10e4768ed3\n--- /dev/null\n+++ b/openmmapi/src/QTBIntegrator.cpp\n@@ -0,0 +1,189 @@\n+/* -------------------------------------------------------------------------- *\n+ * OpenMM *\n+ * -------------------------------------------------------------------------- *\n+ * This is part of the OpenMM molecular simulation toolkit originating from *\n+ * Simbios, the NIH National Center for Physics-Based Simulation of *\n+ * Biological Structures at Stanford, funded under the NIH Roadmap for *\n+ * Medical Research, grant U54 GM072970. See https://simtk.org. *\n+ * *\n+ * Portions copyright (c) 2025 Stanford University and the Authors. *\n+ * Authors: Peter Eastman *\n+ * Contributors: *\n+ * *\n+ * Permission is hereby granted, free of charge, to any person obtaining a *\n+ * copy of this software and associated documentation files (the \"Software\"), *\n+ * to deal in the Software without restriction, including without limitation *\n+ * the rights to use, copy, modify, merge, publish, distribute, sublicense, *\n+ * and/or sell copies of the Software, and to permit persons to whom the *\n+ * Software is furnished to do so, subject to the following conditions: *\n+ * *\n+ * The above copyright notice and this permission notice shall be included in *\n+ * all copies or substantial portions of the Software. *\n+ * *\n+ * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR *\n+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, *\n+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL *\n+ * THE AUTHORS, CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, *\n+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR *\n+ * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE *\n+ * USE OR OTHER DEALINGS IN THE SOFTWARE. *\n+ * -------------------------------------------------------------------------- */\n+\n+#include \"openmm/QTBIntegrator.h\"\n+#include \"openmm/Context.h\"\n+#include \"openmm/OpenMMException.h\"\n+#include \"openmm/internal/ContextImpl.h\"\n+#include \"openmm/kernels.h\"\n+#include <set>\n+#include <string>\n+\n+using namespace OpenMM;\n+using std::map;\n+using std::set;\n+using std::string;\n+using std::vector;\n+\n+QTBIntegrator::QTBIntegrator(double temperature, double frictionCoeff, double stepSize) {\n+ setTemperature(temperature);\n+ setFriction(frictionCoeff);\n+ setSegmentLength(1.0);\n+ setCutoffFrequency(500.0);\n+ setDefaultAdaptationRate(0.01);\n+ setStepSize(stepSize);\n+ setConstraintTolerance(1e-5);\n+ setRandomNumberSeed(0);\n+}\n+\n+void QTBIntegrator::initialize(ContextImpl& contextRef) {\n+ if (owner != NULL && &contextRef.getOwner() != owner)\n+ throw OpenMMException(\"This Integrator is already bound to a context\");\n+ context = &contextRef;\n+ owner = &contextRef.getOwner();\n+ kernel = context->getPlatform().createKernel(IntegrateQTBStepKernel::Name(), contextRef);\n+ kernel.getAs<IntegrateQTBStepKernel>().initialize(contextRef.getSystem(), *this);\n+}\n+\n+void QTBIntegrator::setTemperature(double temp) {\n+ if (temp < 0)\n+ throw OpenMMException(\"Temperature cannot be negative\");\n+ temperature = temp;\n+}\n+\n+void QTBIntegrator::setFriction(double coeff) {\n+ if (coeff < 0)\n+ throw OpenMMException(\"Friction cannot be negative\");\n+ friction = coeff;\n+}\n+\n+double QTBIntegrator::getSegmentLength() const {\n+ return segmentLength;\n+}\n+\n+void QTBIntegrator::setSegmentLength(double length) {\n+ segmentLength = length;\n+}\n+\n+double QTBIntegrator::getCutoffFrequency() const {\n+ return cutoffFrequency;\n+}\n+\n+void QTBIntegrator::setCutoffFrequency(double cutoff) {\n+ cutoffFrequency = cutoff;\n+}\n+\n+const map<int, int>& QTBIntegrator::getParticleTypes() const {\n+ return particleType;\n+}\n+\n+void QTBIntegrator::setParticleType(int index, int type) {\n+ particleType[index] = type;\n+}\n+\n+double QTBIntegrator::getDefaultAdaptationRate() const {\n+ return defaultAdaptationRate;\n+}\n+\n+void QTBIntegrator::setDefaultAdaptationRate(double rate) {\n+ defaultAdaptationRate = rate;\n+}\n+\n+const map<int, double>& QTBIntegrator::getTypeAdaptationRates() const {\n+ return typeAdaptationRates;\n+}\n+\n+void QTBIntegrator::setTypeAdaptationRate(int type, double rate) {\n+ typeAdaptationRates[type] = rate;\n+}\n+\n+void QTBIntegrator::getAdaptedFriction(int particle, vector<double>& friction) const {\n+ kernel.getAs<IntegrateQTBStepKernel>().getAdaptedFriction(*context, particle, friction);\n+}\n+\n+void QTBIntegrator::cleanup() {\n+ kernel = Kernel();\n+}\n+\n+vector<string> QTBIntegrator::getKernelNames() {\n+ vector<std::string> names;\n+ names.push_back(IntegrateQTBStepKernel::Name());\n+ return names;\n+}\n+\n+double QTBIntegrator::computeKineticEnergy() {\n+ return kernel.getAs<IntegrateQTBStepKernel>().computeKineticEnergy(*context, *this);\n+}\n+\n+bool QTBIntegrator::kineticEnergyRequiresForce() const {\n+ return false;\n+}\n+\n+void QTBIntegrator::step(int steps) {\n+ if (context == NULL)\n+ throw OpenMMException(\"This Integrator is not bound to a context!\");\n+ for (int i = 0; i < steps; ++i) {\n+ context->updateContextState();\n+ context->calcForcesAndEnergy(true, false, getIntegrationForceGroups());\n+ kernel.getAs<IntegrateQTBStepKernel>().execute(*context, *this);\n+ }\n+}\n+\n+void QTBIntegrator::createCheckpoint(std::ostream& stream) const {\n+ kernel.getAs<IntegrateQTBStepKernel>().createCheckpoint(*context, stream);\n+}\n+\n+void QTBIntegrator::loadCheckpoint(std::istream& stream) {\n+ kernel.getAs<IntegrateQTBStepKernel>().loadCheckpoint(*context, stream);\n+}\n+\n+void QTBIntegrator::serializeParameters(SerializationNode& node) const {\n+ node.setIntProperty(\"version\", 1);\n+ vector<int> particles;\n+ set<int> types;\n+ for (int i = 0; i < context->getSystem().getNumParticles(); i++) {\n+ if (particleType.find(i) == particleType.end())\n+ particles.push_back(i);\n+ else if (types.find(particleType.at(i)) == types.end()) {\n+ particles.push_back(i);\n+ types.insert(particleType.at(i));\n+ }\n+ }\n+ vector<double> friction;\n+ for (int i : particles) {\n+ SerializationNode& particle = node.createChildNode(\"Friction\").setIntProperty(\"particle\", i);\n+ getAdaptedFriction(i, friction);\n+ for (double f : friction)\n+ particle.createChildNode(\"F\").setDoubleProperty(\"v\", f);\n+ }\n+}\n+\n+void QTBIntegrator::deserializeParameters(const SerializationNode& node) {\n+ if (node.getIntProperty(\"version\") != 1)\n+ throw OpenMMException(\"Unsupported version number\");\n+ for (const SerializationNode& child : node.getChildren()) {\n+ int particle = child.getIntProperty(\"particle\");\n+ vector<double> friction;\n+ for (const SerializationNode& f : child.getChildren())\n+ friction.push_back(f.getDoubleProperty(\"v\"));\n+ kernel.getAs<IntegrateQTBStepKernel>().setAdaptedFriction(*context, particle, friction);\n+ }\n+}\ndiff --git a/openmmapi/src/QTBIntegratorUtilities.cpp b/openmmapi/src/QTBIntegratorUtilities.cpp\nnew file mode 100644\nindex 0000000000..ec57b3ef85\n--- /dev/null\n+++ b/openmmapi/src/QTBIntegratorUtilities.cpp\n@@ -0,0 +1,148 @@\n+/* -------------------------------------------------------------------------- *\n+ * OpenMM *\n+ * -------------------------------------------------------------------------- *\n+ * This is part of the OpenMM molecular simulation toolkit originating from *\n+ * Simbios, the NIH National Center for Physics-Based Simulation of *\n+ * Biological Structures at Stanford, funded under the NIH Roadmap for *\n+ * Medical Research, grant U54 GM072970. See https://simtk.org. *\n+ * *\n+ * Portions copyright (c) 2025 Stanford University and the Authors. *\n+ * Authors: Peter Eastman *\n+ * Contributors: *\n+ * *\n+ * Permission is hereby granted, free of charge, to any person obtaining a *\n+ * copy of this software and associated documentation files (the \"Software\"), *\n+ * to deal in the Software without restriction, including without limitation *\n+ * the rights to use, copy, modify, merge, publish, distribute, sublicense, *\n+ * and/or sell copies of the Software, and to permit persons to whom the *\n+ * Software is furnished to do so, subject to the following conditions: *\n+ * *\n+ * The above copyright notice and this permission notice shall be included in *\n+ * all copies or substantial portions of the Software. *\n+ * *\n+ * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR *\n+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, *\n+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL *\n+ * THE AUTHORS, CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, *\n+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR *\n+ * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE *\n+ * USE OR OTHER DEALINGS IN THE SOFTWARE. *\n+ * -------------------------------------------------------------------------- */\n+\n+#include \"openmm/internal/QTBIntegratorUtilities.h\"\n+#include \"SimTKOpenMMRealType.h\"\n+#include <map>\n+\n+using namespace OpenMM;\n+using namespace std;\n+\n+void QTBIntegratorUtilities::findTypes(const System& system, const QTBIntegrator& integrator, vector<int>& particleType,\n+ vector<std::vector<int> >& typeParticles, vector<double>& typeMass, vector<double>& typeAdaptationRate) {\n+ // Record information about groups defined by particle types.\n+\n+ particleType.resize(system.getNumParticles());\n+ map<int, int> typeIndex;\n+ map<int, double> massTable;\n+ const auto& types = integrator.getParticleTypes();\n+ double defaultAdaptationRate = integrator.getDefaultAdaptationRate();\n+ for (auto particle : types) {\n+ int type = particle.second;\n+ double mass = system.getParticleMass(particle.first);\n+ if (typeIndex.find(type) == typeIndex.end()) {\n+ int index = typeIndex.size();\n+ typeIndex[type] = index;\n+ double rate = defaultAdaptationRate;\n+ const auto& typeRates = integrator.getTypeAdaptationRates();\n+ if (typeRates.find(type) != typeRates.end())\n+ rate = typeRates.at(type);\n+ typeAdaptationRate.push_back(rate);\n+ typeParticles.push_back(vector<int>());\n+ typeMass.push_back(mass);\n+ massTable[type] = mass;\n+ }\n+ if (mass != massTable[type])\n+ throw OpenMMException(\"QTBIntegrator: All particles of the same type must have the same mass\");\n+ particleType[particle.first] = typeIndex[type];\n+ typeParticles[typeIndex[type]].push_back(particle.first);\n+ }\n+ for (int i = 0; i < system.getNumParticles(); i++)\n+ if (types.find(i) == types.end()) {\n+ // This particle's type isn't set, so define a new type for it.\n+ particleType[i] = typeParticles.size();\n+ typeAdaptationRate.push_back(defaultAdaptationRate);\n+ typeParticles.push_back({i});\n+ typeMass.push_back(system.getParticleMass(i));\n+ }\n+}\n+\n+void QTBIntegratorUtilities::calculateSpectrum(double temperature, double friction, double dt, int numFreq, vector<double>& theta, vector<double>& thetad, ThreadPool& threads) {\n+ // Compute the standard spectrum.\n+\n+ double hbar = 1.054571628e-34*AVOGADRO/(1000*1e-12);\n+ double kT = BOLTZ*temperature;\n+ theta.resize(numFreq);\n+ theta[0] = kT;\n+ for (int i = 1; i < numFreq; i++) {\n+ double w = M_PI*i/(numFreq*dt);\n+ theta[i] = hbar*w*(0.5+1/(exp(hbar*w/kT)-1));\n+ }\n+\n+ // Compute the deconvolved version. The algorithm is described in the supplementary\n+ // information in https://doi.org/10.1021/acs.jpclett.1c01722.\n+\n+ auto C = [&](double w0, double w) {\n+ double t = w*w-w0*w0;\n+ return (friction/M_PI)*w0*w0/(t*t+friction*friction*w*w);\n+ };\n+ double dw = M_PI/(numFreq*dt);\n+\n+ // Normalize the kernel to reduce error at low frequencies.\n+\n+ vector<double> sum(numFreq, 0.0), scale(numFreq);\n+ for (int i = 0; i < numFreq; i++) {\n+ double wi = M_PI*(i+0.5)/(numFreq*dt);\n+ for (int j = 0; j < numFreq; j++) {\n+ double wj = M_PI*(j+0.5)/(numFreq*dt);\n+ sum[i] += C(wi, wj)*dw;\n+ }\n+ }\n+ for (int i = 0; i < numFreq; i++)\n+ scale[i] = 0.5/sum[i];\n+\n+ // Compute intermediate quantities.\n+\n+ vector<vector<double> > D(numFreq, vector<double>(numFreq));\n+ vector<double> h(numFreq);\n+ vector<double> fcurrent(numFreq), fnext(numFreq);\n+ for (int i = 0; i < numFreq; i++)\n+ fcurrent[i] = 0.5*theta[i];\n+ threads.execute([&] (ThreadPool& threads, int threadIndex) {\n+ for (int i = threadIndex; i < numFreq; i += threads.getNumThreads()) {\n+ double wi = M_PI*(i+0.5)/(numFreq*dt);\n+ h[i] = 0.0;\n+ for (int j = 0; j < numFreq; j++) {\n+ double wj = M_PI*(j+0.5)/(numFreq*dt);\n+ h[i] += dw*C(wj, wi)*fcurrent[j]*scale[j];\n+ D[i][j] = 0.0;\n+ for (int k = 0; k < numFreq; k++) {\n+ double wk = M_PI*(k+0.5)/(numFreq*dt);\n+ D[i][j] += dw*C(wk, wi)*C(wk, wj)*scale[k]*scale[k];\n+ }\n+ }\n+ }\n+ });\n+ threads.waitForThreads();\n+\n+ // Perform the iteration.\n+\n+ for (int iteration = 0; iteration < 20; iteration++) {\n+ for (int i = 0; i < numFreq; i++) {\n+ double denom = 0.0;\n+ for (int j = 0; j < numFreq; j++)\n+ denom += dw*D[i][j]*fcurrent[j];\n+ fnext[i] = fcurrent[i]*h[i]/denom;\n+ }\n+ fcurrent = fnext;\n+ }\n+ thetad = fnext;\n+}\ndiff --git a/platforms/common/include/openmm/common/CommonIntegrateQTBStepKernel.h b/platforms/common/include/openmm/common/CommonIntegrateQTBStepKernel.h\nnew file mode 100644\nindex 0000000000..ce1588fbda\n--- /dev/null\n+++ b/platforms/common/include/openmm/common/CommonIntegrateQTBStepKernel.h\n@@ -0,0 +1,113 @@\n+#ifndef OPENMM_COMMONINTEGRATEQTBSTEPKERNEL_H_\n+#define OPENMM_COMMONINTEGRATEQTBSTEPKERNEL_H_\n+\n+/* -------------------------------------------------------------------------- *\n+ * OpenMM *\n+ * -------------------------------------------------------------------------- *\n+ * This is part of the OpenMM molecular simulation toolkit originating from *\n+ * Simbios, the NIH National Center for Physics-Based Simulation of *\n+ * Biological Structures at Stanford, funded under the NIH Roadmap for *\n+ * Medical Research, grant U54 GM072970. See https://simtk.org. *\n+ * *\n+ * Portions copyright (c) 2025 Stanford University and the Authors. *\n+ * Authors: Peter Eastman *\n+ * Contributors: *\n+ * *\n+ * This program is free software: you can redistribute it and/or modify *\n+ * it under the terms of the GNU Lesser General Public License as published *\n+ * by the Free Software Foundation, either version 3 of the License, or *\n+ * (at your option) any later version. *\n+ * *\n+ * This program is distributed in the hope that it will be useful, *\n+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *\n+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *\n+ * GNU Lesser General Public License for more details. *\n+ * *\n+ * You should have received a copy of the GNU Lesser General Public License *\n+ * along with this program. If not, see <http://www.gnu.org/licenses/>. *\n+ * -------------------------------------------------------------------------- */\n+\n+#include \"openmm/common/ComputeArray.h\"\n+#include \"openmm/common/ComputeContext.h\"\n+#include \"openmm/Platform.h\"\n+#include \"openmm/kernels.h\"\n+\n+namespace OpenMM {\n+\n+/**\n+ * This kernel is invoked by QTBIntegrator to take one time step.\n+ */\n+class CommonIntegrateQTBStepKernel : public IntegrateQTBStepKernel {\n+public:\n+ CommonIntegrateQTBStepKernel(std::string name, const Platform& platform, ComputeContext& cc) : IntegrateQTBStepKernel(name, platform), cc(cc),\n+ hasInitializedKernels(false) {\n+ }\n+ /**\n+ * Initialize the kernel.\n+ * \n+ * @param system the System this kernel will be applied to\n+ * @param integrator the QTBIntegrator this kernel will be used for\n+ */\n+ void initialize(const System& system, const QTBIntegrator& integrator);\n+ /**\n+ * Execute the kernel.\n+ * \n+ * @param context the context in which to execute this kernel\n+ * @param integrator the QTBIntegrator this kernel is being used for\n+ */\n+ void execute(ContextImpl& context, const QTBIntegrator& integrator);\n+ /**\n+ * Compute the kinetic energy.\n+ * \n+ * @param context the context in which to execute this kernel\n+ * @param integrator the QTBIntegrator this kernel is being used for\n+ */\n+ double computeKineticEnergy(ContextImpl& context, const QTBIntegrator& integrator);\n+ /**\n+ * Get the adapted friction coefficients for a particle.\n+ * \n+ * @param context the context in which to execute this kernel\n+ * @param particle the index of the particle for which to get the friction\n+ * @param friction the adapted friction coefficients used in generating the\n+ * random force\n+ */\n+ void getAdaptedFriction(ContextImpl& context, int particle, std::vector<double>& friction) const;\n+ /**\n+ * Set the adapted friction coefficients for a particle. This affects the\n+ * specified particle, and all others that have the same type.\n+ * \n+ * @param context the context in which to execute this kernel\n+ * @param particle the index of the particle for which to get the friction\n+ * @param friction the adapted friction coefficients used in generating the\n+ * random force\n+ */\n+ void setAdaptedFriction(ContextImpl& context, int particle, const std::vector<double>& friction);\n+ /**\n+ * Write the adapted friction to a checkpoint.\n+ * \n+ * @param context the context in which to execute this kernel\n+ * @param stream the stream to write the checkpoint to\n+ */\n+ void createCheckpoint(ContextImpl& context, std::ostream& stream) const;\n+ /**\n+ * Load the adapted friction from a checkpoint.\n+ * \n+ * @param context the context in which to execute this kernel\n+ * @param stream the stream to read the checkpoint from\n+ */\n+ void loadCheckpoint(ContextImpl& context, std::istream& stream);\n+private:\n+ std::string createFFT(int size, int inputIndex, int& outputIndex, bool forward);\n+ ComputeContext& cc;\n+ int segmentLength, stepIndex, numFreq, numTypes;\n+ double prevTemp, dt, friction;\n+ std::vector<int> particleTypeVec;\n+ ComputeArray oldDelta, noise, randomForce, segmentVelocity, thetad, cutoffFunction, workspace;\n+ ComputeArray particleType, typeParticleCount, typeAdaptationRate, adaptedFriction, dfdt;\n+ ComputeKernel kernel1, kernel2, kernel3, noiseKernel, forceKernel, adapt1Kernel, adapt2Kernel;\n+ bool hasInitializedKernels;\n+};\n+\n+} // namespace OpenMM\n+\n+#endif /*OPENMM_COMMONINTEGRATEQTBSTEPKERNEL_H_*/\ndiff --git a/platforms/common/src/CommonIntegrateQTBStepKernel.cpp b/platforms/common/src/CommonIntegrateQTBStepKernel.cpp\nnew file mode 100644\nindex 0000000000..a444b83db9\n--- /dev/null\n+++ b/platforms/common/src/CommonIntegrateQTBStepKernel.cpp\n@@ -0,0 +1,481 @@\n+/* -------------------------------------------------------------------------- *\n+ * OpenMM *\n+ * -------------------------------------------------------------------------- *\n+ * This is part of the OpenMM molecular simulation toolkit originating from *\n+ * Simbios, the NIH National Center for Physics-Based Simulation of *\n+ * Biological Structures at Stanford, funded under the NIH Roadmap for *\n+ * Medical Research, grant U54 GM072970. See https://simtk.org. *\n+ * *\n+ * Portions copyright (c) 2025 Stanford University and the Authors. *\n+ * Authors: Peter Eastman *\n+ * Contributors: *\n+ * *\n+ * This program is free software: you can redistribute it and/or modify *\n+ * it under the terms of the GNU Lesser General Public License as published *\n+ * by the Free Software Foundation, either version 3 of the License, or *\n+ * (at your option) any later version. *\n+ * *\n+ * This program is distributed in the hope that it will be useful, *\n+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *\n+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *\n+ * GNU Lesser General Public License for more details. *\n+ * *\n+ * You should have received a copy of the GNU Lesser General Public License *\n+ * along with this program. If not, see <http://www.gnu.org/licenses/>. *\n+ * -------------------------------------------------------------------------- */\n+\n+#include \"openmm/common/CommonIntegrateQTBStepKernel.h\"\n+#include \"openmm/common/CommonKernelUtilities.h\"\n+#include \"openmm/common/ContextSelector.h\"\n+#include \"openmm/Context.h\"\n+#include \"openmm/internal/ContextImpl.h\"\n+#include \"openmm/internal/QTBIntegratorUtilities.h\"\n+#include \"CommonKernelSources.h\"\n+#include \"SimTKOpenMMUtilities.h\"\n+\n+using namespace OpenMM;\n+using namespace std;\n+\n+void CommonIntegrateQTBStepKernel::initialize(const System& system, const QTBIntegrator& integrator) {\n+ cc.initializeContexts();\n+ ContextSelector selector(cc);\n+ cc.getIntegrationUtilities().initRandomNumberGenerator(integrator.getRandomNumberSeed());\n+ int numParticles = system.getNumParticles();\n+ dt = integrator.getStepSize();\n+ friction = integrator.getFriction();\n+ segmentLength = (int) ceil(integrator.getSegmentLength()/integrator.getStepSize());\n+ numFreq = (3*segmentLength+1)/2;\n+ noise.initialize<float>(cc, 3*3*segmentLength*numParticles, \"noise\");\n+ SimTKOpenMMUtilities::setRandomNumberSeed(integrator.getRandomNumberSeed());\n+ vector<float> noiseVec(noise.getSize());\n+ for (int i = 0; i < noiseVec.size(); i++)\n+ noiseVec[i] = (float) SimTKOpenMMUtilities::getNormallyDistributedRandomNumber();\n+ noise.upload(noiseVec);\n+ int elementSize = (cc.getUseMixedPrecision() || cc.getUseDoublePrecision() ? sizeof(double) : sizeof(float));\n+ randomForce.initialize(cc, 3*segmentLength*numParticles, elementSize, \"randomForce\");\n+ segmentVelocity.initialize(cc, 3*segmentLength*numParticles, elementSize, \"segmentVelocity\");\n+ oldDelta.initialize(cc, cc.getPaddedNumAtoms(), 4*elementSize, \"oldDelta\");\n+ thetad.initialize(cc, numFreq, elementSize, \"thetad\");\n+ workspace.initialize(cc, 18*segmentLength*cc.getNumThreadBlocks(), elementSize, \"workspace\");\n+ cutoffFunction.initialize(cc, numFreq, elementSize, \"cutoffFunction\");\n+ vector<double> cf(numFreq);\n+ double cutoff = integrator.getCutoffFrequency();\n+ double cutoffWidth = cutoff/100;\n+ for (int i = 0; i < numFreq; i++) {\n+ double w = M_PI*i/(numFreq*dt);\n+ cf[i] = 1.0/(1.0+exp((w-cutoff)/cutoffWidth));\n+ }\n+ cutoffFunction.upload(cf, true);\n+ vector<double> typeMassVec, typeAdaptationRateVec;\n+ vector<vector<int> > typeParticles;\n+ QTBIntegratorUtilities::findTypes(system, integrator, particleTypeVec, typeParticles, typeMassVec, typeAdaptationRateVec);\n+ particleType.initialize<int>(cc, particleTypeVec.size(), \"particleType\");\n+ particleType.upload(particleTypeVec);\n+ typeAdaptationRate.initialize<float>(cc, typeAdaptationRateVec.size(), \"typeAdaptationRate\");\n+ typeAdaptationRate.upload(typeAdaptationRateVec, true);\n+ vector<int> typeParticleCountVec(typeParticles.size());\n+ for (int i = 0; i < typeParticleCountVec.size(); i++)\n+ typeParticleCountVec[i] = typeParticles[i].size();\n+ typeParticleCount.initialize<int>(cc, typeParticleCountVec.size(), \"typeParticleCount\");\n+ typeParticleCount.upload(typeParticleCountVec);\n+ numTypes = typeParticles.size();\n+ adaptedFriction.initialize(cc, numFreq*numTypes, elementSize, \"adaptedFriction\");\n+ vector<double> adaptedFrictionVec(adaptedFriction.getSize(), friction);\n+ adaptedFriction.upload(adaptedFrictionVec, true);\n+ dfdt.initialize(cc, adaptedFriction.getSize(), sizeof(long long), \"dfdt\");\n+\n+ // Create the kernels.\n+\n+ map<string, string> defines, replacements;\n+ defines[\"M_PI\"] = cc.doubleToString(M_PI);\n+ int outputIndex;\n+ replacements[\"FFT_FORWARD\"] = createFFT(3*segmentLength, 0, outputIndex, true);\n+ replacements[\"RECIP_DATA\"] = (outputIndex == 0 ? \"data0\" : \"data1\");\n+ replacements[\"FFT_BACKWARD\"] = createFFT(3*segmentLength, outputIndex, outputIndex, false);\n+ replacements[\"ADAPTATION_FFT\"] = createFFT(segmentLength, 0, outputIndex, true);\n+ replacements[\"ADAPTATION_RECIP\"] = (outputIndex == 0 ? \"data0\" : \"data1\");\n+ ComputeProgram program = cc.compileProgram(cc.replaceStrings(CommonKernelSources::qtb, replacements), defines);\n+ kernel1 = program->createKernel(\"integrateQTBPart1\");\n+ kernel2 = program->createKernel(\"integrateQTBPart2\");\n+ kernel3 = program->createKernel(\"integrateQTBPart3\");\n+ noiseKernel = program->createKernel(\"generateNoise\");\n+ forceKernel = program->createKernel(\"generateRandomForce\");\n+ adapt1Kernel = program->createKernel(\"adaptFrictionPart1\");\n+ adapt2Kernel = program->createKernel(\"adaptFrictionPart2\");\n+ stepIndex = 0;\n+ prevTemp = -1.0;\n+}\n+\n+void CommonIntegrateQTBStepKernel::execute(ContextImpl& context, const QTBIntegrator& integrator) {\n+ ContextSelector selector(cc);\n+ IntegrationUtilities& integration = cc.getIntegrationUtilities();\n+ int numAtoms = cc.getNumAtoms();\n+ int paddedNumAtoms = cc.getPaddedNumAtoms();\n+ double temperature = integrator.getTemperature();\n+ if (!hasInitializedKernels) {\n+ hasInitializedKernels = true;\n+ bool useDouble = cc.getUseDoublePrecision() || cc.getUseMixedPrecision();\n+ kernel1->addArg(numAtoms);\n+ kernel1->addArg(paddedNumAtoms);\n+ if (useDouble)\n+ kernel1->addArg(dt);\n+ else\n+ kernel1->addArg((float) dt);\n+ kernel1->addArg();\n+ kernel1->addArg(cc.getVelm());\n+ kernel1->addArg(cc.getLongForceBuffer());\n+ kernel1->addArg(segmentVelocity);\n+ kernel1->addArg(cc.getAtomIndexArray());\n+ kernel2->addArg(numAtoms);\n+ if (useDouble) {\n+ kernel2->addArg(dt);\n+ kernel2->addArg(friction);\n+ }\n+ else {\n+ kernel2->addArg((float) dt);\n+ kernel2->addArg((float) friction);\n+ }\n+ kernel2->addArg();\n+ kernel2->addArg(cc.getVelm());\n+ kernel2->addArg(integration.getPosDelta());\n+ kernel2->addArg(oldDelta);\n+ kernel2->addArg(randomForce);\n+ kernel2->addArg(cc.getAtomIndexArray());\n+ kernel3->addArg(numAtoms);\n+ if (useDouble)\n+ kernel3->addArg(dt);\n+ else\n+ kernel3->addArg((float) dt);\n+ kernel3->addArg(cc.getPosq());\n+ kernel3->addArg(cc.getVelm());\n+ kernel3->addArg(integration.getPosDelta());\n+ kernel3->addArg(oldDelta);\n+ if (cc.getUseMixedPrecision())\n+ kernel3->addArg(cc.getPosqCorrection());\n+ noiseKernel->addArg(numAtoms);\n+ noiseKernel->addArg(segmentLength);\n+ noiseKernel->addArg(noise);\n+ noiseKernel->addArg(integration.getRandom());\n+ noiseKernel->addArg(); // Random index will be set just before it is executed.\n+ forceKernel->addArg(numAtoms);\n+ forceKernel->addArg(segmentLength);\n+ if (useDouble) {\n+ forceKernel->addArg(dt);\n+ forceKernel->addArg(friction);\n+ }\n+ else {\n+ forceKernel->addArg((float) dt);\n+ forceKernel->addArg((float) friction);\n+ }\n+ forceKernel->addArg(noise);\n+ forceKernel->addArg(randomForce);\n+ forceKernel->addArg(cc.getVelm());\n+ forceKernel->addArg(thetad);\n+ forceKernel->addArg(cutoffFunction);\n+ forceKernel->addArg(particleType);\n+ forceKernel->addArg(adaptedFriction);\n+ forceKernel->addArg(workspace);\n+ adapt1Kernel->addArg(numAtoms);\n+ adapt1Kernel->addArg(segmentLength);\n+ adapt1Kernel->addArg(cc.getVelm());\n+ adapt1Kernel->addArg(particleType);\n+ adapt1Kernel->addArg(randomForce);\n+ adapt1Kernel->addArg(segmentVelocity);\n+ adapt1Kernel->addArg(adaptedFriction);\n+ adapt1Kernel->addArg(dfdt);\n+ adapt1Kernel->addArg(workspace);\n+ adapt2Kernel->addArg(numTypes);\n+ adapt2Kernel->addArg(segmentLength);\n+ if (useDouble)\n+ adapt2Kernel->addArg(dt);\n+ else\n+ adapt2Kernel->addArg((float) dt);\n+ adapt2Kernel->addArg(typeParticleCount);\n+ adapt2Kernel->addArg(typeAdaptationRate);\n+ adapt2Kernel->addArg(adaptedFriction);\n+ adapt2Kernel->addArg(dfdt);\n+ }\n+ cc.getIntegrationUtilities().setNextStepSize(dt);\n+\n+ // Update the random force at the start of each segment.\n+\n+ if (stepIndex%segmentLength == 0) {\n+ if (temperature != prevTemp) {\n+ vector<double> thetaVec, thetadVec;\n+ QTBIntegratorUtilities::calculateSpectrum(temperature, friction, dt, numFreq, thetaVec, thetadVec, cc.getThreadPool());\n+ thetad.upload(thetadVec, true);\n+ prevTemp = temperature;\n+ }\n+ cc.clearBuffer(dfdt);\n+ adapt1Kernel->execute(3*numAtoms*128, 128);\n+ adapt2Kernel->execute(numTypes*128, 128);\n+ noiseKernel->setArg(4, integration.prepareRandomNumbers(3*numAtoms*segmentLength/4+1));\n+ noiseKernel->execute(3*numAtoms*128, 128);\n+ forceKernel->execute(3*numAtoms*128, 128);\n+ stepIndex = 0;\n+ }\n+\n+ // Perform the integration.\n+\n+ kernel1->setArg(3, stepIndex);\n+ kernel2->setArg(3, stepIndex);\n+ kernel1->execute(numAtoms);\n+ integration.applyVelocityConstraints(integrator.getConstraintTolerance());\n+ kernel2->execute(numAtoms);\n+ integration.applyConstraints(integrator.getConstraintTolerance());\n+ kernel3->execute(numAtoms);\n+ integration.computeVirtualSites();\n+\n+ // Update the time and step count.\n+\n+ cc.setTime(cc.getTime()+dt);\n+ cc.setStepCount(cc.getStepCount()+1);\n+ stepIndex++;\n+ cc.reorderAtoms();\n+\n+ // Reduce UI lag.\n+\n+ flushPeriodically(cc);\n+}\n+\n+double CommonIntegrateQTBStepKernel::computeKineticEnergy(ContextImpl& context, const QTBIntegrator& integrator) {\n+ return cc.getIntegrationUtilities().computeKineticEnergy(0.0);\n+}\n+\n+void CommonIntegrateQTBStepKernel::getAdaptedFriction(ContextImpl& context, int particle, std::vector<double>& friction) const {\n+ ASSERT_VALID_INDEX(particle, particleTypeVec);\n+ int type = particleTypeVec[particle];\n+ friction.resize(numFreq);\n+ ContextSelector selector(cc);\n+ if (cc.getUseMixedPrecision() || cc.getUseDoublePrecision()) {\n+ vector<double> adaptedFrictionVec;\n+ adaptedFriction.download(adaptedFrictionVec);\n+ for (int i = 0; i < numFreq; i++)\n+ friction[i] = adaptedFrictionVec[type*numFreq+i];\n+ }\n+ else {\n+ vector<float> adaptedFrictionVec;\n+ adaptedFriction.download(adaptedFrictionVec);\n+ for (int i = 0; i < numFreq; i++)\n+ friction[i] = adaptedFrictionVec[type*numFreq+i];\n+ }\n+}\n+\n+void CommonIntegrateQTBStepKernel::setAdaptedFriction(ContextImpl& context, int particle, const std::vector<double>& friction) {\n+ ASSERT_VALID_INDEX(particle, particleTypeVec);\n+ int type = particleTypeVec[particle];\n+ ContextSelector selector(cc);\n+ if (cc.getUseMixedPrecision() || cc.getUseDoublePrecision()) {\n+ vector<double> adaptedFrictionVec;\n+ adaptedFriction.download(adaptedFrictionVec);\n+ for (int i = 0; i < numFreq; i++)\n+ adaptedFrictionVec[type*numFreq+i] = friction[i];\n+ adaptedFriction.upload(adaptedFrictionVec);\n+ }\n+ else {\n+ vector<float> adaptedFrictionVec;\n+ adaptedFriction.download(adaptedFrictionVec);\n+ for (int i = 0; i < numFreq; i++)\n+ adaptedFrictionVec[type*numFreq+i] = friction[i];\n+ adaptedFriction.upload(adaptedFrictionVec);\n+ }\n+}\n+\n+void CommonIntegrateQTBStepKernel::createCheckpoint(ContextImpl& context, ostream& stream) const {\n+ ContextSelector selector(cc);\n+ stream.write((char*) &stepIndex, sizeof(int));\n+ vector<float> f;\n+ noise.download(f);\n+ stream.write((char*) f.data(), sizeof(float)*f.size());\n+ if (cc.getUseMixedPrecision() || cc.getUseDoublePrecision()) {\n+ vector<double> d;\n+ randomForce.download(d);\n+ stream.write((char*) d.data(), sizeof(double)*d.size());\n+ segmentVelocity.download(d);\n+ stream.write((char*) d.data(), sizeof(double)*d.size());\n+ adaptedFriction.download(d);\n+ stream.write((char*) d.data(), sizeof(double)*d.size());\n+ }\n+ else {\n+ randomForce.download(f);\n+ stream.write((char*) f.data(), sizeof(float)*f.size());\n+ segmentVelocity.download(f);\n+ stream.write((char*) f.data(), sizeof(float)*f.size());\n+ adaptedFriction.download(f);\n+ stream.write((char*) f.data(), sizeof(float)*f.size());\n+ }\n+}\n+\n+void CommonIntegrateQTBStepKernel::loadCheckpoint(ContextImpl& context, istream& stream) {\n+ ContextSelector selector(cc);\n+ stream.read((char*) &stepIndex, sizeof(int));\n+ vector<float> f(noise.getSize());\n+ stream.read((char*) f.data(), sizeof(float)*noise.getSize());\n+ noise.upload(f);\n+ if (cc.getUseMixedPrecision() || cc.getUseDoublePrecision()) {\n+ vector<double> d;\n+ d.resize(randomForce.getSize());\n+ stream.read((char*) d.data(), sizeof(double)*d.size());\n+ randomForce.upload(d);\n+ d.resize(segmentVelocity.getSize());\n+ stream.read((char*) d.data(), sizeof(double)*d.size());\n+ segmentVelocity.upload(d);\n+ d.resize(adaptedFriction.getSize());\n+ stream.read((char*) d.data(), sizeof(double)*d.size());\n+ adaptedFriction.upload(d);\n+ }\n+ else {\n+ f.resize(randomForce.getSize());\n+ stream.read((char*) f.data(), sizeof(float)*f.size());\n+ randomForce.upload(f);\n+ f.resize(segmentVelocity.getSize());\n+ stream.read((char*) f.data(), sizeof(float)*f.size());\n+ segmentVelocity.upload(f);\n+ f.resize(adaptedFriction.getSize());\n+ stream.read((char*) f.data(), sizeof(float)*f.size());\n+ adaptedFriction.upload(f);\n+ }\n+}\n+\n+string CommonIntegrateQTBStepKernel::createFFT(int size, int inputIndex, int& outputIndex, bool forward) {\n+ stringstream source;\n+ int stage = 0;\n+ int L = size;\n+ int m = 1;\n+ string sign = (forward ? \"1\" : \"-1\");\n+ string mult = (forward ? \"multiplyComplex\" : \"multiplyComplexConj\");\n+\n+ // Factor size, generating an appropriate block of code for each factor.\n+\n+ while (L > 1) {\n+ int input = (inputIndex+stage)%2;\n+ int output = 1-input;\n+ int radix;\n+ if (L%7 == 0)\n+ radix = 7;\n+ else if (L%5 == 0)\n+ radix = 5;\n+ else if (L%4 == 0)\n+ radix = 4;\n+ else if (L%3 == 0)\n+ radix = 3;\n+ else if (L%2 == 0)\n+ radix = 2;\n+ else\n+ throw OpenMMException(\"QTBIntegrator: Number of steps in a segment must be a multiple of powers of 2, 3, 5, and 7\");\n+ source<<\"{\\n\";\n+ L = L/radix;\n+ source<<\"// Pass \"<<(stage+1)<<\" (radix \"<<radix<<\")\\n\";\n+ source<<\"for (int i = LOCAL_ID; i < \"<<(L*m)<<\"; i += LOCAL_SIZE) {\\n\";\n+ source<<\"int base = i;\\n\";\n+ source<<\"int j = i/\"<<m<<\";\\n\";\n+ if (radix == 7) {\n+ source<<\"mixed2 c0 = data\"<<input<<\"[base];\\n\";\n+ source<<\"mixed2 c1 = data\"<<input<<\"[base+\"<<(L*m)<<\"];\\n\";\n+ source<<\"mixed2 c2 = data\"<<input<<\"[base+\"<<(2*L*m)<<\"];\\n\";\n+ source<<\"mixed2 c3 = data\"<<input<<\"[base+\"<<(3*L*m)<<\"];\\n\";\n+ source<<\"mixed2 c4 = data\"<<input<<\"[base+\"<<(4*L*m)<<\"];\\n\";\n+ source<<\"mixed2 c5 = data\"<<input<<\"[base+\"<<(5*L*m)<<\"];\\n\";\n+ source<<\"mixed2 c6 = data\"<<input<<\"[base+\"<<(6*L*m)<<\"];\\n\";\n+ source<<\"mixed2 d0 = c1+c6;\\n\";\n+ source<<\"mixed2 d1 = c1-c6;\\n\";\n+ source<<\"mixed2 d2 = c2+c5;\\n\";\n+ source<<\"mixed2 d3 = c2-c5;\\n\";\n+ source<<\"mixed2 d4 = c4+c3;\\n\";\n+ source<<\"mixed2 d5 = c4-c3;\\n\";\n+ source<<\"mixed2 d6 = d2+d0;\\n\";\n+ source<<\"mixed2 d7 = d5+d3;\\n\";\n+ source<<\"mixed2 b0 = c0+d6+d4;\\n\";\n+ source<<\"mixed2 b1 = \"<<cc.doubleToString((cos(2*M_PI/7)+cos(4*M_PI/7)+cos(6*M_PI/7))/3-1)<<\"*(d6+d4);\\n\";\n+ source<<\"mixed2 b2 = \"<<cc.doubleToString((2*cos(2*M_PI/7)-cos(4*M_PI/7)-cos(6*M_PI/7))/3)<<\"*(d0-d4);\\n\";\n+ source<<\"mixed2 b3 = \"<<cc.doubleToString((cos(2*M_PI/7)-2*cos(4*M_PI/7)+cos(6*M_PI/7))/3)<<\"*(d4-d2);\\n\";\n+ source<<\"mixed2 b4 = \"<<cc.doubleToString((cos(2*M_PI/7)+cos(4*M_PI/7)-2*cos(6*M_PI/7))/3)<<\"*(d2-d0);\\n\";\n+ source<<\"mixed2 b5 = -(\"<<sign<<\")*\"<<cc.doubleToString((sin(2*M_PI/7)+sin(4*M_PI/7)-sin(6*M_PI/7))/3)<<\"*(d7+d1);\\n\";\n+ source<<\"mixed2 b6 = -(\"<<sign<<\")*\"<<cc.doubleToString((2*sin(2*M_PI/7)-sin(4*M_PI/7)+sin(6*M_PI/7))/3)<<\"*(d1-d5);\\n\";\n+ source<<\"mixed2 b7 = -(\"<<sign<<\")*\"<<cc.doubleToString((sin(2*M_PI/7)-2*sin(4*M_PI/7)-sin(6*M_PI/7))/3)<<\"*(d5-d3);\\n\";\n+ source<<\"mixed2 b8 = -(\"<<sign<<\")*\"<<cc.doubleToString((sin(2*M_PI/7)+sin(4*M_PI/7)+2*sin(6*M_PI/7))/3)<<\"*(d3-d1);\\n\";\n+ source<<\"mixed2 t0 = b0+b1;\\n\";\n+ source<<\"mixed2 t1 = b2+b3;\\n\";\n+ source<<\"mixed2 t2 = b4-b3;\\n\";\n+ source<<\"mixed2 t3 = -b2-b4;\\n\";\n+ source<<\"mixed2 t4 = b6+b7;\\n\";\n+ source<<\"mixed2 t5 = b8-b7;\\n\";\n+ source<<\"mixed2 t6 = -b8-b6;\\n\";\n+ source<<\"mixed2 t7 = t0+t1;\\n\";\n+ source<<\"mixed2 t8 = t0+t2;\\n\";\n+ source<<\"mixed2 t9 = t0+t3;\\n\";\n+ source<<\"mixed2 t10 = make_mixed2(t4.y+b5.y, -(t4.x+b5.x));\\n\";\n+ source<<\"mixed2 t11 = make_mixed2(t5.y+b5.y, -(t5.x+b5.x));\\n\";\n+ source<<\"mixed2 t12 = make_mixed2(t6.y+b5.y, -(t6.x+b5.x));\\n\";\n+ source<<\"data\"<<output<<\"[base+6*j*\"<<m<<\"] = b0;\\n\";\n+ source<<\"data\"<<output<<\"[base+(6*j+1)*\"<<m<<\"] = \"<<mult<<\"(w[j*\"<<size<<\"/\"<<(7*L)<<\"], t7-t10);\\n\";\n+ source<<\"data\"<<output<<\"[base+(6*j+2)*\"<<m<<\"] = \"<<mult<<\"(w[j*\"<<(2*size)<<\"/\"<<(7*L)<<\"], t9-t12);\\n\";\n+ source<<\"data\"<<output<<\"[base+(6*j+3)*\"<<m<<\"] = \"<<mult<<\"(w[j*\"<<(3*size)<<\"/\"<<(7*L)<<\"], t8+t11);\\n\";\n+ source<<\"data\"<<output<<\"[base+(6*j+4)*\"<<m<<\"] = \"<<mult<<\"(w[j*\"<<(4*size)<<\"/\"<<(7*L)<<\"], t8-t11);\\n\";\n+ source<<\"data\"<<output<<\"[base+(6*j+5)*\"<<m<<\"] = \"<<mult<<\"(w[j*\"<<(5*size)<<\"/\"<<(7*L)<<\"], t9+t12);\\n\";\n+ source<<\"data\"<<output<<\"[base+(6*j+6)*\"<<m<<\"] = \"<<mult<<\"(w[j*\"<<(6*size)<<\"/\"<<(7*L)<<\"], t7+t10);\\n\";\n+ }\n+ else if (radix == 5) {\n+ source<<\"mixed2 c0 = data\"<<input<<\"[base];\\n\";\n+ source<<\"mixed2 c1 = data\"<<input<<\"[base+\"<<(L*m)<<\"];\\n\";\n+ source<<\"mixed2 c2 = data\"<<input<<\"[base+\"<<(2*L*m)<<\"];\\n\";\n+ source<<\"mixed2 c3 = data\"<<input<<\"[base+\"<<(3*L*m)<<\"];\\n\";\n+ source<<\"mixed2 c4 = data\"<<input<<\"[base+\"<<(4*L*m)<<\"];\\n\";\n+ source<<\"mixed2 d0 = c1+c4;\\n\";\n+ source<<\"mixed2 d1 = c2+c3;\\n\";\n+ source<<\"mixed2 d2 = \"<<cc.doubleToString(sin(0.4*M_PI))<<\"*(c1-c4);\\n\";\n+ source<<\"mixed2 d3 = \"<<cc.doubleToString(sin(0.4*M_PI))<<\"*(c2-c3);\\n\";\n+ source<<\"mixed2 d4 = d0+d1;\\n\";\n+ source<<\"mixed2 d5 = \"<<cc.doubleToString(0.25*sqrt(5.0))<<\"*(d0-d1);\\n\";\n+ source<<\"mixed2 d6 = c0-0.25f*d4;\\n\";\n+ source<<\"mixed2 d7 = d6+d5;\\n\";\n+ source<<\"mixed2 d8 = d6-d5;\\n\";\n+ string coeff = cc.doubleToString(sin(0.2*M_PI)/sin(0.4*M_PI));\n+ source<<\"mixed2 d9 = \"<<sign<<\"*make_mixed2(d2.y+\"<<coeff<<\"*d3.y, -d2.x-\"<<coeff<<\"*d3.x);\\n\";\n+ source<<\"mixed2 d10 = \"<<sign<<\"*make_mixed2(\"<<coeff<<\"*d2.y-d3.y, d3.x-\"<<coeff<<\"*d2.x);\\n\";\n+ source<<\"data\"<<output<<\"[base+4*j*\"<<m<<\"] = c0+d4;\\n\";\n+ source<<\"data\"<<output<<\"[base+(4*j+1)*\"<<m<<\"] = \"<<mult<<\"(w[j*\"<<size<<\"/\"<<(5*L)<<\"], d7+d9);\\n\";\n+ source<<\"data\"<<output<<\"[base+(4*j+2)*\"<<m<<\"] = \"<<mult<<\"(w[j*\"<<(2*size)<<\"/\"<<(5*L)<<\"], d8+d10);\\n\";\n+ source<<\"data\"<<output<<\"[base+(4*j+3)*\"<<m<<\"] = \"<<mult<<\"(w[j*\"<<(3*size)<<\"/\"<<(5*L)<<\"], d8-d10);\\n\";\n+ source<<\"data\"<<output<<\"[base+(4*j+4)*\"<<m<<\"] = \"<<mult<<\"(w[j*\"<<(4*size)<<\"/\"<<(5*L)<<\"], d7-d9);\\n\";\n+ }\n+ else if (radix == 4) {\n+ source<<\"mixed2 c0 = data\"<<input<<\"[base];\\n\";\n+ source<<\"mixed2 c1 = data\"<<input<<\"[base+\"<<(L*m)<<\"];\\n\";\n+ source<<\"mixed2 c2 = data\"<<input<<\"[base+\"<<(2*L*m)<<\"];\\n\";\n+ source<<\"mixed2 c3 = data\"<<input<<\"[base+\"<<(3*L*m)<<\"];\\n\";\n+ source<<\"mixed2 d0 = c0+c2;\\n\";\n+ source<<\"mixed2 d1 = c0-c2;\\n\";\n+ source<<\"mixed2 d2 = c1+c3;\\n\";\n+ source<<\"mixed2 d3 = \"<<sign<<\"*make_mixed2(c1.y-c3.y, c3.x-c1.x);\\n\";\n+ source<<\"data\"<<output<<\"[base+3*j*\"<<m<<\"] = d0+d2;\\n\";\n+ source<<\"data\"<<output<<\"[base+(3*j+1)*\"<<m<<\"] = \"<<mult<<\"(w[j*\"<<size<<\"/\"<<(4*L)<<\"], d1+d3);\\n\";\n+ source<<\"data\"<<output<<\"[base+(3*j+2)*\"<<m<<\"] = \"<<mult<<\"(w[j*\"<<(2*size)<<\"/\"<<(4*L)<<\"], d0-d2);\\n\";\n+ source<<\"data\"<<output<<\"[base+(3*j+3)*\"<<m<<\"] = \"<<mult<<\"(w[j*\"<<(3*size)<<\"/\"<<(4*L)<<\"], d1-d3);\\n\";\n+ }\n+ else if (radix == 3) {\n+ source<<\"mixed2 c0 = data\"<<input<<\"[base];\\n\";\n+ source<<\"mixed2 c1 = data\"<<input<<\"[base+\"<<(L*m)<<\"];\\n\";\n+ source<<\"mixed2 c2 = data\"<<input<<\"[base+\"<<(2*L*m)<<\"];\\n\";\n+ source<<\"mixed2 d0 = c1+c2;\\n\";\n+ source<<\"mixed2 d1 = c0-0.5f*d0;\\n\";\n+ source<<\"mixed2 d2 = \"<<sign<<\"*\"<<cc.doubleToString(sin(M_PI/3.0))<<\"*make_mixed2(c1.y-c2.y, c2.x-c1.x);\\n\";\n+ source<<\"data\"<<output<<\"[base+2*j*\"<<m<<\"] = c0+d0;\\n\";\n+ source<<\"data\"<<output<<\"[base+(2*j+1)*\"<<m<<\"] = \"<<mult<<\"(w[j*\"<<size<<\"/\"<<(3*L)<<\"], d1+d2);\\n\";\n+ source<<\"data\"<<output<<\"[base+(2*j+2)*\"<<m<<\"] = \"<<mult<<\"(w[j*\"<<(2*size)<<\"/\"<<(3*L)<<\"], d1-d2);\\n\";\n+ }\n+ else if (radix == 2) {\n+ source<<\"mixed2 c0 = data\"<<input<<\"[base];\\n\";\n+ source<<\"mixed2 c1 = data\"<<input<<\"[base+\"<<(L*m)<<\"];\\n\";\n+ source<<\"data\"<<output<<\"[base+j*\"<<m<<\"] = c0+c1;\\n\";\n+ source<<\"data\"<<output<<\"[base+(j+1)*\"<<m<<\"] = \"<<mult<<\"(w[j*\"<<size<<\"/\"<<(2*L)<<\"], c0-c1);\\n\";\n+ }\n+ source<<\"}\\n\";\n+ m = m*radix;\n+ source<<\"SYNC_THREADS\\n\";\n+ source<<\"}\\n\";\n+ ++stage;\n+ }\n+ outputIndex = (inputIndex+stage)%2;\n+ return source.str();\n+}\ndiff --git a/platforms/common/src/IntegrationUtilities.cpp b/platforms/common/src/IntegrationUtilities.cpp\nindex 8d40361afa..b93e6ee2c9 100644\n--- a/platforms/common/src/IntegrationUtilities.cpp\n+++ b/platforms/common/src/IntegrationUtilities.cpp\n@@ -917,6 +917,8 @@ void IntegrationUtilities::createCheckpoint(ostream& stream) {\n if (!random.isInitialized())\n return;\n stream.write((char*) &randomPos, sizeof(int));\n+ int numRandom = random.getSize();\n+ stream.write((char*) &numRandom, sizeof(int));\n vector<mm_float4> randomVec;\n random.download(randomVec);\n stream.write((char*) &randomVec[0], sizeof(mm_float4)*random.getSize());\n@@ -929,6 +931,12 @@ void IntegrationUtilities::loadCheckpoint(istream& stream) {\n if (!random.isInitialized())\n return;\n stream.read((char*) &randomPos, sizeof(int));\n+ int numRandom;\n+ stream.read((char*) &numRandom, sizeof(int));\n+ if (numRandom != random.getSize()) {\n+ random.resize(numRandom);\n+ randomKernel->setArg(0, numRandom);\n+ }\n vector<mm_float4> randomVec(random.getSize());\n stream.read((char*) &randomVec[0], sizeof(mm_float4)*random.getSize());\n random.upload(randomVec);\ndiff --git a/platforms/common/src/kernels/qtb.cc b/platforms/common/src/kernels/qtb.cc\nnew file mode 100644\nindex 0000000000..d173add59f\n--- /dev/null\n+++ b/platforms/common/src/kernels/qtb.cc\n@@ -0,0 +1,217 @@\n+/**\n+ * Perform the first part of integration: velocity step.\n+ */\n+KERNEL void integrateQTBPart1(int numAtoms, int paddedNumAtoms, mixed dt, int stepIndex, GLOBAL mixed4* RESTRICT velm,\n+ GLOBAL const mm_long* RESTRICT force, GLOBAL mixed* RESTRICT segmentVelocity, GLOBAL const int* RESTRICT atomOrder) {\n+ mixed fscale = dt/(mixed) 0x100000000;\n+ for (int atom = GLOBAL_ID; atom < numAtoms; atom += GLOBAL_SIZE) {\n+ int atomIndex = atomOrder[atom];\n+ mixed4 velocity = velm[atom];\n+ segmentVelocity[3*numAtoms*stepIndex + atomIndex] = velocity.x;\n+ segmentVelocity[3*numAtoms*stepIndex + numAtoms + atomIndex] = velocity.y;\n+ segmentVelocity[3*numAtoms*stepIndex + 2*numAtoms + atomIndex] = velocity.z;\n+ if (velocity.w != 0.0) {\n+ velocity.x += fscale*velocity.w*force[atom];\n+ velocity.y += fscale*velocity.w*force[atom+paddedNumAtoms];\n+ velocity.z += fscale*velocity.w*force[atom+paddedNumAtoms*2];\n+ velm[atom] = velocity;\n+ }\n+ }\n+}\n+\n+/**\n+ * Perform the second part of integration: position half step, then interact with heat bath,\n+ * then another position half step.\n+ */\n+KERNEL void integrateQTBPart2(int numAtoms, mixed dt, mixed friction, int stepIndex, GLOBAL mixed4* RESTRICT velm,\n+ GLOBAL mixed4* RESTRICT posDelta, GLOBAL mixed4* RESTRICT oldDelta, GLOBAL const mixed* RESTRICT randomForce,\n+ GLOBAL const int* RESTRICT atomOrder) {\n+ mixed halfdt = 0.5f*dt;\n+ mixed vscale = EXP(-dt*friction);\n+ for (int atom = GLOBAL_ID; atom < numAtoms; atom += GLOBAL_SIZE) {\n+ int atomIndex = atomOrder[atom];\n+ mixed4 velocity = velm[atom];\n+ if (velocity.w != 0.0) {\n+ mixed4 delta = make_mixed4(halfdt*velocity.x, halfdt*velocity.y, halfdt*velocity.z, 0);\n+ mixed fscale = dt*velocity.w;\n+ velocity.x = vscale*velocity.x + fscale*randomForce[3*numAtoms*stepIndex + atomIndex];\n+ velocity.y = vscale*velocity.y + fscale*randomForce[3*numAtoms*stepIndex + numAtoms + atomIndex];\n+ velocity.z = vscale*velocity.z + fscale*randomForce[3*numAtoms*stepIndex + 2*numAtoms + atomIndex];\n+ velm[atom] = velocity;\n+ delta += make_mixed4(halfdt*velocity.x, halfdt*velocity.y, halfdt*velocity.z, 0);\n+ posDelta[atom] = delta;\n+ oldDelta[atom] = delta;\n+ }\n+ }\n+}\n+\n+/**\n+ * Perform the third part of integration: apply constraint forces to velocities, then record\n+ * the constrained positions.\n+ */\n+KERNEL void integrateQTBPart3(int numAtoms, mixed dt, GLOBAL real4* RESTRICT posq, GLOBAL mixed4* RESTRICT velm,\n+ GLOBAL const mixed4* RESTRICT posDelta, GLOBAL const mixed4* RESTRICT oldDelta\n+#ifdef USE_MIXED_PRECISION\n+ , GLOBAL real4* RESTRICT posqCorrection\n+#endif\n+ ) {\n+ mixed invDt = 1/dt;\n+ for (int index = GLOBAL_ID; index < numAtoms; index += GLOBAL_SIZE) {\n+ mixed4 velocity = velm[index];\n+ if (velocity.w != 0.0) {\n+ mixed4 delta = posDelta[index];\n+ velocity.x += (delta.x-oldDelta[index].x)*invDt;\n+ velocity.y += (delta.y-oldDelta[index].y)*invDt;\n+ velocity.z += (delta.z-oldDelta[index].z)*invDt;\n+ velm[index] = velocity;\n+#ifdef USE_MIXED_PRECISION\n+ real4 pos1 = posq[index];\n+ real4 pos2 = posqCorrection[index];\n+ mixed4 pos = make_mixed4(pos1.x+(mixed)pos2.x, pos1.y+(mixed)pos2.y, pos1.z+(mixed)pos2.z, pos1.w);\n+#else\n+ real4 pos = posq[index];\n+#endif\n+ pos.x += delta.x;\n+ pos.y += delta.y;\n+ pos.z += delta.z;\n+#ifdef USE_MIXED_PRECISION\n+ posq[index] = make_real4((real) pos.x, (real) pos.y, (real) pos.z, (real) pos.w);\n+ posqCorrection[index] = make_real4(pos.x-(real) pos.x, pos.y-(real) pos.y, pos.z-(real) pos.z, 0);\n+#else\n+ posq[index] = pos;\n+#endif\n+ }\n+ }\n+}\n+\n+/**\n+ * Update the buffer of white noise.\n+ */\n+KERNEL void generateNoise(int numAtoms, int segmentLength, GLOBAL float* RESTRICT noise, GLOBAL const float* RESTRICT random, unsigned int randomIndex) {\n+ randomIndex = 4*randomIndex; // Interpret it as float instead of float4\n+ int fftLength = 3*segmentLength;\n+ for (int i = GROUP_ID; i < 3*numAtoms; i += NUM_GROUPS) {\n+ // Copy segment 2 over to segment 1\n+\n+ for (int j = LOCAL_ID; j < segmentLength; j += LOCAL_SIZE)\n+ noise[i*fftLength+j] = noise[i*fftLength+j+segmentLength];\n+ SYNC_THREADS\n+\n+ // Copy segment 3 over to segment 2\n+\n+ for (int j = LOCAL_ID; j < segmentLength; j += LOCAL_SIZE)\n+ noise[i*fftLength+j+segmentLength] = noise[i*fftLength+j+2*segmentLength];\n+ SYNC_THREADS\n+ \n+ // Fill segment 3 with new random values.\n+\n+ for (int j = LOCAL_ID; j < segmentLength; j += LOCAL_SIZE)\n+ noise[i*fftLength+j+2*segmentLength] = random[randomIndex+i*segmentLength+j];\n+ SYNC_THREADS\n+ }\n+}\n+\n+DEVICE mixed2 multiplyComplex(mixed2 c1, mixed2 c2) {\n+ return make_mixed2(c1.x*c2.x-c1.y*c2.y, c1.x*c2.y+c1.y*c2.x);\n+}\n+\n+DEVICE mixed2 multiplyComplexConj(mixed2 c1, mixed2 c2) {\n+ return make_mixed2(c1.x*c2.x+c1.y*c2.y, c1.x*c2.y-c1.y*c2.x);\n+}\n+\n+/**\n+ * Generate the random force for the next segment.\n+ */\n+KERNEL void generateRandomForce(int numAtoms, int segmentLength, mixed dt, mixed friction, GLOBAL float* RESTRICT noise,\n+ GLOBAL mixed* RESTRICT randomForce, GLOBAL mixed4* RESTRICT velm, GLOBAL mixed* RESTRICT thetad,\n+ GLOBAL mixed* RESTRICT cutoffFunction, GLOBAL int* RESTRICT particleType, GLOBAL mixed* RESTRICT adaptedFriction,\n+ GLOBAL mixed2* RESTRICT workspace) {\n+ const int fftLength = 3*segmentLength;\n+ const int numFreq = (fftLength+1)/2;\n+ GLOBAL mixed2* data0 = &workspace[GROUP_ID*3*fftLength];\n+ GLOBAL mixed2* data1 = &data0[fftLength];\n+ GLOBAL mixed2* w = &data1[fftLength];\n+ for (int i = LOCAL_ID; i < fftLength; i += LOCAL_SIZE)\n+ w[i] = make_mixed2(cos(-i*2*M_PI/fftLength), sin(-i*2*M_PI/fftLength));\n+ for (int i = GROUP_ID; i < 3*numAtoms; i += NUM_GROUPS) {\n+ int atom = i/3;\n+ int axis = i%3;\n+ mixed invMass = velm[atom].w;\n+ int type = particleType[atom];\n+ if (invMass != 0) {\n+ for (int j = LOCAL_ID; j < fftLength; j += LOCAL_SIZE)\n+ data0[j] = make_mixed2(noise[i*fftLength+j], 0);\n+ SYNC_THREADS\n+ FFT_FORWARD\n+ for (int j = LOCAL_ID; j < numFreq; j += LOCAL_SIZE) {\n+ mixed f = M_PI*j/(numFreq*dt);\n+ mixed gamma = adaptedFriction[type*numFreq+j];\n+ mixed cw = (1 - 2*EXP(-dt*friction)*COS(f*dt) + EXP(-2*friction*dt)) / ((friction*friction+f*f)*dt*dt);\n+ mixed2 d = RECIP_DATA[j] * SQRT(cutoffFunction[j]*thetad[j]*cw*gamma/friction);\n+ RECIP_DATA[j] = d;\n+ if (j != 0 && j*2 != fftLength)\n+ RECIP_DATA[fftLength-j] = make_mixed2(d.x, -d.y);\n+ }\n+ SYNC_THREADS\n+ FFT_BACKWARD\n+ const mixed scale = SQRT(2*friction/(dt*invMass))/fftLength;\n+ for (int j = LOCAL_ID; j < segmentLength; j += LOCAL_SIZE)\n+ randomForce[numAtoms*(3*j+axis)+atom] = scale*data0[segmentLength+j].x;\n+ SYNC_THREADS\n+ }\n+ }\n+}\n+\n+/**\n+ * Update the friction rates used for generating noise, part 1: compute the error in the\n+ * fluctuation dissipation theorem.\n+ */\n+KERNEL void adaptFrictionPart1(int numAtoms, int segmentLength, GLOBAL const mixed4* RESTRICT velm, GLOBAL const int* RESTRICT particleType,\n+ GLOBAL const mixed* RESTRICT randomForce, GLOBAL const mixed* RESTRICT segmentVelocity, GLOBAL const mixed* RESTRICT adaptedFriction,\n+ GLOBAL mm_ulong* RESTRICT dfdt, GLOBAL mixed2* RESTRICT workspace) {\n+ const int numFreq = (segmentLength+1)/2;\n+ GLOBAL mixed2* data0 = &workspace[GROUP_ID*3*segmentLength];\n+ GLOBAL mixed2* data1 = &data0[segmentLength];\n+ GLOBAL mixed2* w = &data1[segmentLength];\n+ for (int i = LOCAL_ID; i < segmentLength; i += LOCAL_SIZE)\n+ w[i] = make_mixed2(cos(-i*2*M_PI/segmentLength), sin(-i*2*M_PI/segmentLength));\n+ for (int i = GROUP_ID; i < 3*numAtoms; i += NUM_GROUPS) {\n+ int atom = i/3;\n+ int axis = i%3;\n+ int type = particleType[atom];\n+ mixed invMass = velm[atom].w;\n+ if (invMass != 0) {\n+ // Pack the velocities and forces together so we can transform both at once.\n+ for (int j = LOCAL_ID; j < segmentLength; j += LOCAL_SIZE)\n+ data0[j] = make_mixed2(segmentVelocity[numAtoms*(3*j+axis)+atom], randomForce[numAtoms*(3*j+axis)+atom]);\n+ SYNC_THREADS\n+ ADAPTATION_FFT\n+ for (int j = LOCAL_ID; j < numFreq; j += LOCAL_SIZE) {\n+ mixed2 d1 = ADAPTATION_RECIP[j];\n+ mixed2 d2 = (j == 0 ? ADAPTATION_RECIP[0] : ADAPTATION_RECIP[segmentLength-j]);\n+ mixed2 v = 0.5f*make_mixed2(d1.x+d2.x, d1.y-d2.y);\n+ mixed2 f = 0.5f*make_mixed2(d1.y+d2.y, -d1.x+d2.x);\n+ mixed cvv = v.x*v.x + v.y*v.y;\n+ mixed2 cvf = multiplyComplexConj(f, v);\n+ mixed dfdtinc = adaptedFriction[type*numFreq+j]*cvv/invMass - cvf.x;\n+ ATOMIC_ADD(&dfdt[type*numFreq+j], (mm_ulong) realToFixedPoint(dfdtinc));\n+ }\n+ }\n+ }\n+}\n+\n+/**\n+ * Update the friction rates used for generating noise, part 2: update the friction based\n+ * on the error.\n+ */\n+KERNEL void adaptFrictionPart2(int numTypes, int segmentLength, mixed dt, GLOBAL const int* RESTRICT typeParticleCount,\n+ GLOBAL const float* RESTRICT typeAdaptationRate, GLOBAL mixed* RESTRICT adaptedFriction, GLOBAL const mm_long* RESTRICT dfdt) {\n+ int numFreq = (3*segmentLength+1)/2;\n+ for (int type = GROUP_ID; type < numTypes; type += NUM_GROUPS) {\n+ mixed scale = dt*typeAdaptationRate[type]/(3*typeParticleCount[type]*segmentLength)/(mixed) 0x100000000;\n+ for (int i = LOCAL_ID; i < numFreq; i += LOCAL_SIZE) {\n+ mixed delta = -scale*dfdt[type*numFreq+i];\n+ adaptedFriction[type*numFreq+i] = max((mixed) 0, adaptedFriction[type*numFreq+i]+delta);\n+ }\n+ }\n+}\n\\ No newline at end of file\ndiff --git a/platforms/cuda/src/CudaKernelFactory.cpp b/platforms/cuda/src/CudaKernelFactory.cpp\nindex 0a15aa454b..01f493fcc9 100644\n--- a/platforms/cuda/src/CudaKernelFactory.cpp\n+++ b/platforms/cuda/src/CudaKernelFactory.cpp\n@@ -36,6 +36,7 @@\n #include \"openmm/common/CommonCalcCustomNonbondedForceKernel.h\"\n #include \"openmm/common/CommonIntegrateCustomStepKernel.h\"\n #include \"openmm/common/CommonIntegrateNoseHooverStepKernel.h\"\n+#include \"openmm/common/CommonIntegrateQTBStepKernel.h\"\n #include \"openmm/internal/ContextImpl.h\"\n #include \"openmm/OpenMMException.h\"\n \n@@ -142,6 +143,8 @@ KernelImpl* CudaKernelFactory::createKernelImpl(std::string name, const Platform\n return new CommonIntegrateCustomStepKernel(name, platform, cu);\n if (name == IntegrateDPDStepKernel::Name())\n return new CommonIntegrateDPDStepKernel(name, platform, cu);\n+ if (name == IntegrateQTBStepKernel::Name())\n+ return new CommonIntegrateQTBStepKernel(name, platform, cu);\n if (name == ApplyAndersenThermostatKernel::Name())\n return new CommonApplyAndersenThermostatKernel(name, platform, cu);\n if (name == IntegrateNoseHooverStepKernel::Name())\ndiff --git a/platforms/cuda/src/CudaPlatform.cpp b/platforms/cuda/src/CudaPlatform.cpp\nindex 7c6e6675a9..6adc21fb23 100644\n--- a/platforms/cuda/src/CudaPlatform.cpp\n+++ b/platforms/cuda/src/CudaPlatform.cpp\n@@ -105,6 +105,7 @@ CudaPlatform::CudaPlatform() {\n registerKernelFactory(IntegrateVariableLangevinStepKernel::Name(), factory);\n registerKernelFactory(IntegrateCustomStepKernel::Name(), factory);\n registerKernelFactory(IntegrateDPDStepKernel::Name(), factory);\n+ registerKernelFactory(IntegrateQTBStepKernel::Name(), factory);\n registerKernelFactory(ApplyAndersenThermostatKernel::Name(), factory);\n registerKernelFactory(ApplyMonteCarloBarostatKernel::Name(), factory);\n registerKernelFactory(RemoveCMMotionKernel::Name(), factory);\ndiff --git a/platforms/hip/src/HipKernelFactory.cpp b/platforms/hip/src/HipKernelFactory.cpp\nindex aa499b871b..16d2f7b782 100644\n--- a/platforms/hip/src/HipKernelFactory.cpp\n+++ b/platforms/hip/src/HipKernelFactory.cpp\n@@ -37,6 +37,7 @@\n #include \"openmm/common/CommonCalcCustomNonbondedForceKernel.h\"\n #include \"openmm/common/CommonIntegrateCustomStepKernel.h\"\n #include \"openmm/common/CommonIntegrateNoseHooverStepKernel.h\"\n+#include \"openmm/common/CommonIntegrateQTBStepKernel.h\"\n #include \"openmm/internal/ContextImpl.h\"\n #include \"openmm/OpenMMException.h\"\n \n@@ -141,6 +142,8 @@ KernelImpl* HipKernelFactory::createKernelImpl(std::string name, const Platform&\n return new CommonIntegrateCustomStepKernel(name, platform, cu);\n if (name == IntegrateDPDStepKernel::Name())\n return new CommonIntegrateDPDStepKernel(name, platform, cu);\n+ if (name == IntegrateQTBStepKernel::Name())\n+ return new CommonIntegrateQTBStepKernel(name, platform, cu);\n if (name == ApplyAndersenThermostatKernel::Name())\n return new CommonApplyAndersenThermostatKernel(name, platform, cu);\n if (name == IntegrateNoseHooverStepKernel::Name())\ndiff --git a/platforms/hip/src/HipPlatform.cpp b/platforms/hip/src/HipPlatform.cpp\nindex deb02907c5..dc0f9c2d52 100644\n--- a/platforms/hip/src/HipPlatform.cpp\n+++ b/platforms/hip/src/HipPlatform.cpp\n@@ -105,6 +105,7 @@ HipPlatform::HipPlatform() {\n registerKernelFactory(IntegrateVariableLangevinStepKernel::Name(), factory);\n registerKernelFactory(IntegrateCustomStepKernel::Name(), factory);\n registerKernelFactory(IntegrateDPDStepKernel::Name(), factory);\n+ registerKernelFactory(IntegrateQTBStepKernel::Name(), factory);\n registerKernelFactory(ApplyAndersenThermostatKernel::Name(), factory);\n registerKernelFactory(ApplyMonteCarloBarostatKernel::Name(), factory);\n registerKernelFactory(RemoveCMMotionKernel::Name(), factory);\ndiff --git a/platforms/opencl/src/OpenCLKernelFactory.cpp b/platforms/opencl/src/OpenCLKernelFactory.cpp\nindex 3510dc1ef0..c758df70c7 100644\n--- a/platforms/opencl/src/OpenCLKernelFactory.cpp\n+++ b/platforms/opencl/src/OpenCLKernelFactory.cpp\n@@ -34,6 +34,7 @@\n #include \"openmm/common/CommonCalcCustomNonbondedForceKernel.h\"\n #include \"openmm/common/CommonIntegrateCustomStepKernel.h\"\n #include \"openmm/common/CommonIntegrateNoseHooverStepKernel.h\"\n+#include \"openmm/common/CommonIntegrateQTBStepKernel.h\"\n #include \"openmm/internal/ContextImpl.h\"\n #include \"openmm/OpenMMException.h\"\n \n@@ -140,6 +141,8 @@ KernelImpl* OpenCLKernelFactory::createKernelImpl(std::string name, const Platfo\n return new CommonIntegrateCustomStepKernel(name, platform, cl);\n if (name == IntegrateDPDStepKernel::Name())\n return new CommonIntegrateDPDStepKernel(name, platform, cl);\n+ if (name == IntegrateQTBStepKernel::Name())\n+ return new CommonIntegrateQTBStepKernel(name, platform, cl);\n if (name == ApplyAndersenThermostatKernel::Name())\n return new CommonApplyAndersenThermostatKernel(name, platform, cl);\n if (name == IntegrateNoseHooverStepKernel::Name())\ndiff --git a/platforms/opencl/src/OpenCLPlatform.cpp b/platforms/opencl/src/OpenCLPlatform.cpp\nindex 0e93cdc5dc..872def0968 100644\n--- a/platforms/opencl/src/OpenCLPlatform.cpp\n+++ b/platforms/opencl/src/OpenCLPlatform.cpp\n@@ -96,6 +96,7 @@ OpenCLPlatform::OpenCLPlatform() {\n registerKernelFactory(IntegrateVariableLangevinStepKernel::Name(), factory);\n registerKernelFactory(IntegrateCustomStepKernel::Name(), factory);\n registerKernelFactory(IntegrateDPDStepKernel::Name(), factory);\n+ registerKernelFactory(IntegrateQTBStepKernel::Name(), factory);\n registerKernelFactory(ApplyAndersenThermostatKernel::Name(), factory);\n registerKernelFactory(ApplyMonteCarloBarostatKernel::Name(), factory);\n registerKernelFactory(RemoveCMMotionKernel::Name(), factory);\ndiff --git a/platforms/reference/include/ReferenceKernels.h b/platforms/reference/include/ReferenceKernels.h\nindex 1c039e9bcc..c19f5a6bd1 100644\n--- a/platforms/reference/include/ReferenceKernels.h\n+++ b/platforms/reference/include/ReferenceKernels.h\n@@ -69,6 +69,7 @@ class ReferenceVariableVerletDynamics;\n class ReferenceVerletDynamics;\n class ReferenceCustomDynamics;\n class ReferenceDPDDynamics;\n+class ReferenceQTBDynamics;\n \n /**\n * This kernel is invoked at the beginning and end of force and energy computations. It gives the\n@@ -1546,6 +1547,76 @@ class ReferenceIntegrateDPDStepKernel : public IntegrateDPDStepKernel {\n std::vector<double> masses;\n };\n \n+/**\n+ * This kernel is invoked by QTBIntegrator to take one time step.\n+ */\n+class ReferenceIntegrateQTBStepKernel : public IntegrateQTBStepKernel {\n+public:\n+ ReferenceIntegrateQTBStepKernel(std::string name, const Platform& platform, ReferencePlatform::PlatformData& data) : IntegrateQTBStepKernel(name, platform),\n+ data(data), dynamics(NULL), hasInitialized(false) {\n+ }\n+ ~ReferenceIntegrateQTBStepKernel();\n+ /**\n+ * Initialize the kernel.\n+ * \n+ * @param system the System this kernel will be applied to\n+ * @param integrator the QTBIntegrator this kernel will be used for\n+ */\n+ void initialize(const System& system, const QTBIntegrator& integrator);\n+ /**\n+ * Execute the kernel.\n+ * \n+ * @param context the context in which to execute this kernel\n+ * @param integrator the QTBIntegrator this kernel is being used for\n+ */\n+ void execute(ContextImpl& context, const QTBIntegrator& integrator);\n+ /**\n+ * Compute the kinetic energy.\n+ * \n+ * @param context the context in which to execute this kernel\n+ * @param integrator the QTBIntegrator this kernel is being used for\n+ */\n+ double computeKineticEnergy(ContextImpl& context, const QTBIntegrator& integrator);\n+ /**\n+ * Get the adapted friction coefficients for a particle.\n+ * \n+ * @param context the context in which to execute this kernel\n+ * @param particle the index of the particle for which to get the friction\n+ * @param friction the adapted friction coefficients used in generating the\n+ * random force\n+ */\n+ void getAdaptedFriction(ContextImpl& context, int particle, std::vector<double>& friction) const;\n+ /**\n+ * Set the adapted friction coefficients for a particle. This affects the\n+ * specified particle, and all others that have the same type.\n+ * \n+ * @param context the context in which to execute this kernel\n+ * @param particle the index of the particle for which to get the friction\n+ * @param friction the adapted friction coefficients used in generating the\n+ * random force\n+ */\n+ void setAdaptedFriction(ContextImpl& context, int particle, const std::vector<double>& friction);\n+ /**\n+ * Write the adapted friction to a checkpoint.\n+ * \n+ * @param context the context in which to execute this kernel\n+ * @param stream the stream to write the checkpoint to\n+ */\n+ void createCheckpoint(ContextImpl& context, std::ostream& stream) const;\n+ /**\n+ * Load the adapted friction from a checkpoint.\n+ * \n+ * @param context the context in which to execute this kernel\n+ * @param stream the stream to read the checkpoint from\n+ */\n+ void loadCheckpoint(ContextImpl& context, std::istream& stream);\n+private:\n+ ReferencePlatform::PlatformData& data;\n+ ReferenceQTBDynamics* dynamics;\n+ std::vector<double> masses;\n+ bool hasInitialized;\n+};\n+\n /**\n * This kernel is invoked by AndersenThermostat at the start of each time step to adjust the particle velocities.\n */\ndiff --git a/platforms/reference/include/ReferenceQTBDynamics.h b/platforms/reference/include/ReferenceQTBDynamics.h\nnew file mode 100644\nindex 0000000000..8e1381e5cf\n--- /dev/null\n+++ b/platforms/reference/include/ReferenceQTBDynamics.h\n@@ -0,0 +1,131 @@\n+/* Portions copyright (c) 2025 Stanford University and the Authors.\n+ * Authors: Peter Eastman\n+ *\n+ * Permission is hereby granted, free of charge, to any person obtaining\n+ * a copy of this software and associated documentation files (the\n+ * \"Software\"), to deal in the Software without restriction, including\n+ * without limitation the rights to use, copy, modify, merge, publish,\n+ * distribute, sublicense, and/or sell copies of the Software, and to\n+ * permit persons to whom the Software is furnished to do so, subject\n+ * to the following conditions:\n+ *\n+ * The above copyright notice and this permission notice shall be included\n+ * in all copies or substantial portions of the Software.\n+ *\n+ * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\n+ * IN NO EVENT SHALL THE AUTHORS, CONTRIBUTORS OR COPYRIGHT HOLDERS BE\n+ * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\n+ * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\n+ * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n+ */\n+\n+#ifndef __ReferenceQTBDynamics_H__\n+#define __ReferenceQTBDynamics_H__\n+\n+#include \"ReferenceDynamics.h\"\n+#include \"openmm/QTBIntegrator.h\"\n+#include \"openmm/internal/ContextImpl.h\"\n+#include \"openmm/internal/ThreadPool.h\"\n+#include \"openmm/internal/windowsExport.h\"\n+#include <complex>\n+\n+namespace OpenMM {\n+\n+class OPENMM_EXPORT ReferenceQTBDynamics : public ReferenceDynamics {\n+protected:\n+ double friction, lastTemperature;\n+ int segmentLength, stepIndex, numFreq;\n+ std::vector<OpenMM::Vec3> xPrime, oldx, randomForce, segmentVelocity;\n+ std::vector<double> inverseMasses, typeAdaptationRate, typeMass;\n+ std::vector<double> noise, theta, thetad, cutoffFunction;\n+ std::vector<int> particleType;\n+ std::vector<std::vector<int> > typeParticles;\n+ std::vector<std::vector<double> > adaptedFriction;\n+\n+public:\n+ /**\n+ * Constructor\n+ * \n+ * @param system the system to simulate\n+ * @param integrator the integrator being used\n+ */\n+ ReferenceQTBDynamics(const System& system, const QTBIntegrator& integrator);\n+\n+ /**\n+ * Destructor\n+ */\n+ ~ReferenceQTBDynamics();\n+\n+ /**\n+ * Perform a time step, updating the positions and velocities.\n+ * \n+ * @param context the context this integrator is updating\n+ * @param system the System to be integrated\n+ * @param atomCoordinates atom coordinates\n+ * @param velocities velocities\n+ * @param masses atom masses\n+ * @param tolerance the constraint tolerance\n+ * @param boxVectors the current periodic box vectors\n+ * @param threads a ThreadPool to use for parallelization\n+ */\n+ void update(OpenMM::ContextImpl& context, std::vector<OpenMM::Vec3>& atomCoordinates,\n+ std::vector<OpenMM::Vec3>& velocities, std::vector<double>& masses, double tolerance, const Vec3* boxVectors, ThreadPool& threads);\n+\n+ /**\n+ * The first stage of the update algorithm.\n+ */\n+ virtual void updatePart1(int numParticles, std::vector<OpenMM::Vec3>& velocities, std::vector<OpenMM::Vec3>& forces);\n+\n+ /**\n+ * The second stage of the update algorithm.\n+ */\n+ virtual void updatePart2(int numParticles, std::vector<OpenMM::Vec3>& atomCoordinates, std::vector<OpenMM::Vec3>& velocities,\n+ std::vector<OpenMM::Vec3>& xPrime);\n+\n+ /**\n+ * The third stage of the update algorithm.\n+ */\n+ virtual void updatePart3(OpenMM::ContextImpl& context, int numParticles, std::vector<OpenMM::Vec3>& atomCoordinates,\n+ std::vector<OpenMM::Vec3>& velocities, std::vector<OpenMM::Vec3>& xPrime);\n+ /**\n+ * Get the adapted friction coefficients for a particle.\n+ * \n+ * @param particle the index of the particle for which to get the friction\n+ * @param friction the adapted friction coefficients used in generating the\n+ * random force.\n+ */\n+ void getAdaptedFriction(int particle, std::vector<double>& friction) const;\n+ /**\n+ * Set the adapted friction coefficients for a particle. This affects the\n+ * specified particle, and all others that have the same type.\n+ * \n+ * @param particle the index of the particle for which to get the friction\n+ * @param friction the adapted friction coefficients used in generating the\n+ * random force.\n+ */\n+ void setAdaptedFriction(int particle, const std::vector<double>& friction);\n+ /**\n+ * Write the adapted friction to a checkpoint.\n+ */\n+ void createCheckpoint(std::ostream& stream) const;\n+ /**\n+ * Load the adapted friction from a checkpoint.\n+ */\n+ void loadCheckpoint(std::istream& stream);\n+\n+private:\n+ /**\n+ * Generate noise for the next segment.\n+ */\n+ void generateNoise(int numParticles, std::vector<double>& masses, ThreadPool& threads);\n+ /**\n+ * Update the friction rates used for generating noise.\n+ */\n+ void adaptFriction(ThreadPool& threads);\n+};\n+\n+} // namespace OpenMM\n+\n+#endif // __ReferenceQTBDynamics_H__\ndiff --git a/platforms/reference/src/ReferenceKernelFactory.cpp b/platforms/reference/src/ReferenceKernelFactory.cpp\nindex 8c1cdcde2a..dbe1421596 100644\n--- a/platforms/reference/src/ReferenceKernelFactory.cpp\n+++ b/platforms/reference/src/ReferenceKernelFactory.cpp\n@@ -106,6 +106,8 @@ KernelImpl* ReferenceKernelFactory::createKernelImpl(std::string name, const Pla\n return new ReferenceIntegrateCustomStepKernel(name, platform, data);\n if (name == IntegrateDPDStepKernel::Name())\n return new ReferenceIntegrateDPDStepKernel(name, platform, data);\n+ if (name == IntegrateQTBStepKernel::Name())\n+ return new ReferenceIntegrateQTBStepKernel(name, platform, data);\n if (name == ApplyAndersenThermostatKernel::Name())\n return new ReferenceApplyAndersenThermostatKernel(name, platform);\n if (name == ApplyMonteCarloBarostatKernel::Name())\ndiff --git a/platforms/reference/src/ReferenceKernels.cpp b/platforms/reference/src/ReferenceKernels.cpp\nindex 7896f13359..17bdd9fec2 100644\n--- a/platforms/reference/src/ReferenceKernels.cpp\n+++ b/platforms/reference/src/ReferenceKernels.cpp\n@@ -60,6 +60,7 @@\n #include \"ReferenceNoseHooverDynamics.h\"\n #include \"ReferencePointFunctions.h\"\n #include \"ReferenceProperDihedralBond.h\"\n+#include \"ReferenceQTBDynamics.h\"\n #include \"ReferenceRbDihedralBond.h\"\n #include \"ReferenceRMSDForce.h\"\n #include \"ReferenceTabulatedFunction.h\"\n@@ -2899,6 +2900,55 @@ double ReferenceIntegrateDPDStepKernel::computeKineticEnergy(ContextImpl& contex\n return computeShiftedKineticEnergy(context, masses, 0.0);\n }\n \n+ReferenceIntegrateQTBStepKernel::~ReferenceIntegrateQTBStepKernel() {\n+ if (dynamics != NULL)\n+ delete dynamics;\n+}\n+\n+void ReferenceIntegrateQTBStepKernel::initialize(const System& system, const QTBIntegrator& integrator) {\n+ int numParticles = system.getNumParticles();\n+ masses.resize(numParticles);\n+ for (int i = 0; i < numParticles; ++i)\n+ masses[i] = system.getParticleMass(i);\n+ SimTKOpenMMUtilities::setRandomNumberSeed((unsigned int) integrator.getRandomNumberSeed());\n+ dynamics = new ReferenceQTBDynamics(system, integrator);\n+}\n+\n+void ReferenceIntegrateQTBStepKernel::execute(ContextImpl& context, const QTBIntegrator& integrator) {\n+ double stepSize = integrator.getStepSize();\n+ vector<Vec3>& posData = extractPositions(context);\n+ vector<Vec3>& velData = extractVelocities(context);\n+ if (!hasInitialized) {\n+ hasInitialized = true;\n+ dynamics->setReferenceConstraintAlgorithm(&extractConstraints(context));\n+ dynamics->setVirtualSites(extractVirtualSites(context));\n+ }\n+ dynamics->setTemperature(integrator.getTemperature());\n+ dynamics->update(context, posData, velData, masses, integrator.getConstraintTolerance(), extractBoxVectors(context), extractThreadPool(context));\n+ data.time += stepSize;\n+ data.stepCount++;\n+}\n+\n+double ReferenceIntegrateQTBStepKernel::computeKineticEnergy(ContextImpl& context, const QTBIntegrator& integrator) {\n+ return computeShiftedKineticEnergy(context, masses, 0.0);\n+}\n+\n+void ReferenceIntegrateQTBStepKernel::getAdaptedFriction(ContextImpl& context, int particle, std::vector<double>& friction) const {\n+ dynamics->getAdaptedFriction(particle, friction);\n+}\n+\n+void ReferenceIntegrateQTBStepKernel::setAdaptedFriction(ContextImpl& context, int particle, const std::vector<double>& friction) {\n+ dynamics->setAdaptedFriction(particle, friction);\n+}\n+\n+void ReferenceIntegrateQTBStepKernel::createCheckpoint(ContextImpl& context, ostream& stream) const {\n+ dynamics->createCheckpoint(stream);\n+}\n+\n+void ReferenceIntegrateQTBStepKernel::loadCheckpoint(ContextImpl& context, istream& stream) {\n+ dynamics->loadCheckpoint(stream);\n+}\n+\n ReferenceApplyAndersenThermostatKernel::~ReferenceApplyAndersenThermostatKernel() {\n if (thermostat)\n delete thermostat;\ndiff --git a/platforms/reference/src/ReferencePlatform.cpp b/platforms/reference/src/ReferencePlatform.cpp\nindex 04394254d4..70fc071ec4 100644\n--- a/platforms/reference/src/ReferencePlatform.cpp\n+++ b/platforms/reference/src/ReferencePlatform.cpp\n@@ -76,6 +76,7 @@ ReferencePlatform::ReferencePlatform() {\n registerKernelFactory(IntegrateVariableVerletStepKernel::Name(), factory);\n registerKernelFactory(IntegrateCustomStepKernel::Name(), factory);\n registerKernelFactory(IntegrateDPDStepKernel::Name(), factory);\n+ registerKernelFactory(IntegrateQTBStepKernel::Name(), factory);\n registerKernelFactory(ApplyAndersenThermostatKernel::Name(), factory);\n registerKernelFactory(ApplyMonteCarloBarostatKernel::Name(), factory);\n registerKernelFactory(RemoveCMMotionKernel::Name(), factory);\ndiff --git a/platforms/reference/src/SimTKReference/ReferenceQTBDynamics.cpp b/platforms/reference/src/SimTKReference/ReferenceQTBDynamics.cpp\nnew file mode 100644\nindex 0000000000..ed9b114529\n--- /dev/null\n+++ b/platforms/reference/src/SimTKReference/ReferenceQTBDynamics.cpp\n@@ -0,0 +1,264 @@\n+/* Portions copyright (c) 2025 Stanford University and the Authors.\n+ * Authors: Peter Eastman\n+ *\n+ * Permission is hereby granted, free of charge, to any person obtaining\n+ * a copy of this software and associated documentation files (the\n+ * \"Software\"), to deal in the Software without restriction, including\n+ * without limitation the rights to use, copy, modify, merge, publish,\n+ * distribute, sublicense, and/or sell copies of the Software, and to\n+ * permit persons to whom the Software is furnished to do so, subject\n+ * to the following conditions:\n+ *\n+ * The above copyright notice and this permission notice shall be included\n+ * in all copies or substantial portions of the Software.\n+ *\n+ * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\n+ * IN NO EVENT SHALL THE AUTHORS, CONTRIBUTORS OR COPYRIGHT HOLDERS BE\n+ * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\n+ * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\n+ * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n+ */\n+\n+#include \"SimTKOpenMMUtilities.h\"\n+#include \"ReferenceQTBDynamics.h\"\n+#include \"ReferencePlatform.h\"\n+#include \"ReferenceVirtualSites.h\"\n+#include \"openmm/OpenMMException.h\"\n+#include \"openmm/internal/ContextImpl.h\"\n+#include \"openmm/internal/QTBIntegratorUtilities.h\"\n+#include <algorithm>\n+#include <cmath>\n+#include <map>\n+\n+#ifdef _MSC_VER\n+ #define POCKETFFT_NO_VECTORS\n+#endif\n+#include \"pocketfft_hdronly.h\"\n+\n+using namespace OpenMM;\n+using namespace std;\n+\n+ReferenceQTBDynamics::ReferenceQTBDynamics(const System& system, const QTBIntegrator& integrator) :\n+ ReferenceDynamics(system.getNumParticles(), integrator.getStepSize(), integrator.getTemperature()), friction(integrator.getFriction()), stepIndex(0) {\n+ segmentLength = (int) ceil(integrator.getSegmentLength()/integrator.getStepSize());\n+ int numParticles = system.getNumParticles();\n+ xPrime.resize(numParticles);\n+ oldx.resize(numParticles);\n+ noise.resize(3*3*segmentLength*numParticles);\n+ randomForce.resize(segmentLength*numParticles);\n+ segmentVelocity.resize(segmentLength*numParticles);\n+ for (int i = 0; i < noise.size(); i++)\n+ noise[i] = SimTKOpenMMUtilities::getNormallyDistributedRandomNumber();\n+ QTBIntegratorUtilities::findTypes(system, integrator, particleType, typeParticles, typeMass, typeAdaptationRate);\n+\n+ // Calculate the target energy distribution.\n+\n+ numFreq = (3*segmentLength+1)/2;\n+ cutoffFunction.resize(numFreq);\n+ double cutoff = integrator.getCutoffFrequency();\n+ double cutoffWidth = cutoff/100;\n+ for (int i = 0; i < numFreq; i++) {\n+ double w = M_PI*i/(numFreq*getDeltaT());\n+ cutoffFunction[i] = 1.0/(1.0+exp((w-cutoff)/cutoffWidth));\n+ }\n+\n+ // Allocate space for adaptation.\n+\n+ int numTypes = typeParticles.size();\n+ adaptedFriction.resize(numTypes, vector<double>(numFreq, friction));\n+}\n+\n+ReferenceQTBDynamics::~ReferenceQTBDynamics() {\n+}\n+\n+void ReferenceQTBDynamics::updatePart1(int numParticles, vector<Vec3>& velocities, vector<Vec3>& forces) {\n+ for (int i = 0; i < numParticles; i++) {\n+ segmentVelocity[i*segmentLength+stepIndex] = velocities[i];\n+ if (inverseMasses[i] != 0.0)\n+ velocities[i] += (getDeltaT()*inverseMasses[i])*forces[i];\n+ }\n+}\n+\n+void ReferenceQTBDynamics::updatePart2(int numParticles, vector<Vec3>& atomCoordinates,\n+ vector<Vec3>& velocities, vector<Vec3>& xPrime) {\n+ const double dt = getDeltaT();\n+ const double halfdt = 0.5*dt;\n+ const double vscale = exp(-dt*friction);\n+\n+ for (int i = 0; i < numParticles; i++) {\n+ if (inverseMasses[i] != 0.0) {\n+ xPrime[i] = atomCoordinates[i] + velocities[i]*halfdt;\n+ velocities[i] = vscale*velocities[i] + inverseMasses[i]*dt*randomForce[segmentLength*i+stepIndex];\n+ xPrime[i] = xPrime[i] + velocities[i]*halfdt;\n+ oldx[i] = xPrime[i];\n+ }\n+ }\n+}\n+\n+void ReferenceQTBDynamics::updatePart3(OpenMM::ContextImpl& context, int numParticles, vector<Vec3>& atomCoordinates,\n+ vector<Vec3>& velocities, vector<Vec3>& xPrime) {\n+ for (int i = 0; i < numParticles; i++) {\n+ if (inverseMasses[i] != 0.0) {\n+ velocities[i] += (xPrime[i]-oldx[i])/getDeltaT();\n+ atomCoordinates[i] = xPrime[i];\n+ }\n+ }\n+}\n+\n+void ReferenceQTBDynamics::update(ContextImpl& context, vector<Vec3>& atomCoordinates, vector<Vec3>& velocities,\n+ vector<double>& masses, double tolerance, const Vec3* boxVectors, ThreadPool& threads) {\n+ int numParticles = context.getSystem().getNumParticles();\n+ ReferenceConstraintAlgorithm* referenceConstraintAlgorithm = getReferenceConstraintAlgorithm();\n+ if (inverseMasses.size() == 0) {\n+ // Invert masses\n+\n+ inverseMasses.resize(numParticles);\n+ for (int ii = 0; ii < numParticles; ii++) {\n+ if (masses[ii] == 0.0)\n+ inverseMasses[ii] = 0.0;\n+ else\n+ inverseMasses[ii] = 1.0/masses[ii];\n+ }\n+ }\n+ ReferencePlatform::PlatformData* data = reinterpret_cast<ReferencePlatform::PlatformData*>(context.getPlatformData());\n+ vector<Vec3>& forces = *data->forces;\n+ if (stepIndex%segmentLength == 0) {\n+ if (lastTemperature != getTemperature() || thetad.size() == 0) {\n+ QTBIntegratorUtilities::calculateSpectrum(getTemperature(), friction, getDeltaT(), numFreq, theta, thetad, threads);\n+ lastTemperature = getTemperature();\n+ }\n+ adaptFriction(threads);\n+ generateNoise(numParticles, masses, threads);\n+ stepIndex = 0;\n+ }\n+\n+ // 1st update\n+\n+ updatePart1(numParticles, velocities, forces);\n+ if (referenceConstraintAlgorithm)\n+ referenceConstraintAlgorithm->applyToVelocities(atomCoordinates, velocities, inverseMasses, tolerance);\n+\n+ // 2nd update\n+\n+ updatePart2(numParticles, atomCoordinates, velocities, xPrime);\n+ if (referenceConstraintAlgorithm)\n+ referenceConstraintAlgorithm->apply(atomCoordinates, xPrime, inverseMasses, tolerance);\n+\n+ // 3rd update\n+\n+ updatePart3(context, numParticles, atomCoordinates, velocities, xPrime);\n+\n+ getVirtualSites().computePositions(context.getSystem(), atomCoordinates, boxVectors);\n+ incrementTimeStep();\n+ stepIndex += 1;\n+}\n+\n+void ReferenceQTBDynamics::generateNoise(int numParticles, vector<double>& masses, ThreadPool& threads) {\n+ // Update the buffer of white noise.\n+\n+ for (int base = 0; base < noise.size(); base += 3*segmentLength) {\n+ for (int i = 0; i < 2*segmentLength; i++)\n+ noise[base+i] = noise[base+i+segmentLength];\n+ for (int i = 0; i < segmentLength; i++)\n+ noise[base+2*segmentLength+i] = SimTKOpenMMUtilities::getNormallyDistributedRandomNumber();\n+ }\n+\n+ // Generate the random force for the next segment.\n+\n+ double dt = getDeltaT();\n+ vector<ptrdiff_t> realStride = {(ptrdiff_t) sizeof(double)};\n+ vector<ptrdiff_t> complexStride = {(ptrdiff_t) sizeof(complex<double>)};\n+ vector<size_t> shape = {(size_t) 3*segmentLength}, axes = {0};\n+ threads.execute([&] (ThreadPool& threads, int threadIndex) {\n+ vector<complex<double> > recipData(3*segmentLength);\n+ vector<double> force(3*segmentLength);\n+ for (int particle = threadIndex; particle < numParticles; particle += threads.getNumThreads()) {\n+ int type = particleType[particle];\n+ for (int axis = 0; axis < 3; axis++) {\n+ double* data = &noise[(3*particle+axis)*3*segmentLength];\n+ pocketfft::r2c(shape, realStride, complexStride, axes, true, data, recipData.data(), 1.0, 1);\n+ for (int i = 0; i < numFreq; i++) {\n+ double w = M_PI*i/(numFreq*dt);\n+ double gamma = adaptedFriction[type][i];\n+ double cw = (1 - 2*exp(-dt*friction)*cos(w*dt) + exp(-2*friction*dt)) / ((friction*friction+w*w)*dt*dt);\n+ recipData[i] *= sqrt(cutoffFunction[i]*thetad[i]*cw*gamma/friction);\n+ }\n+ pocketfft::c2r(shape, complexStride, realStride, axes, false, recipData.data(), force.data(), 1.0/(3*segmentLength), 1);\n+ for (int i = 0; i < segmentLength; i++)\n+ randomForce[particle*segmentLength+i][axis] = sqrt(2*masses[particle]*friction/dt)*force[segmentLength+i];\n+ }\n+ }\n+ });\n+ threads.waitForThreads();\n+}\n+\n+void ReferenceQTBDynamics::adaptFriction(ThreadPool& threads) {\n+ vector<ptrdiff_t> realStride = {(ptrdiff_t) sizeof(double)};\n+ vector<ptrdiff_t> complexStride = {(ptrdiff_t) sizeof(complex<double>)};\n+ vector<size_t> shape = {(size_t) 3*segmentLength}, axes = {0};\n+ threads.execute([&] (ThreadPool& threads, int threadIndex) {\n+ vector<double> vel(3*segmentLength, 0.0), force(3*segmentLength, 0.0);\n+ vector<complex<double> > recipVel(3*segmentLength), recipForce(3*segmentLength);\n+ vector<double> dfdt(numFreq);\n+ for (int type = threadIndex; type < typeParticles.size(); type += threads.getNumThreads()) {\n+ for (int i = 0; i < dfdt.size(); i++)\n+ dfdt[i] = 0;\n+ for (int particle : typeParticles[type]) {\n+ for (int axis = 0; axis < 3; axis++) {\n+ // Compute the Fourier transformed velocity and force.\n+\n+ for (int i = 0; i < segmentLength; i++) {\n+ vel[i] = segmentVelocity[particle*segmentLength+i][axis];\n+ force[i] = randomForce[particle*segmentLength+i][axis];\n+ }\n+ pocketfft::r2c(shape, realStride, complexStride, axes, true, vel.data(), recipVel.data(), 1.0, 1);\n+ pocketfft::r2c(shape, realStride, complexStride, axes, true, force.data(), recipForce.data(), 1.0, 1);\n+\n+ // Compute the error in the fluctuation dissipation theorem.\n+\n+ double mass = typeMass[type];\n+ for (int i = 0; i < numFreq; i++) {\n+ double cvv = norm(recipVel[i]);\n+ complex<double> cvf = recipVel[i]*conj(recipForce[i]);\n+ dfdt[i] += mass*adaptedFriction[type][i]*cvv - cvf.real();\n+ }\n+ }\n+ }\n+\n+ // Average over particles and axes, and update the friction.\n+\n+ double scale = getDeltaT()/(3*typeParticles[type].size()*segmentLength);\n+ for (int i = 0; i < adaptedFriction[type].size(); i++)\n+ adaptedFriction[type][i] = max(0.0, adaptedFriction[type][i]-scale*typeAdaptationRate[type]*dfdt[i]);\n+ }\n+ });\n+ threads.waitForThreads();\n+}\n+\n+void ReferenceQTBDynamics::getAdaptedFriction(int particle, vector<double>& friction) const {\n+ friction = adaptedFriction[particleType[particle]];\n+}\n+\n+void ReferenceQTBDynamics::setAdaptedFriction(int particle, const std::vector<double>& friction) {\n+ adaptedFriction[particleType[particle]] = friction;\n+}\n+\n+void ReferenceQTBDynamics::createCheckpoint(std::ostream& stream) const {\n+ stream.write((char*) &stepIndex, sizeof(int));\n+ stream.write((char*) noise.data(), sizeof(double)*noise.size());\n+ stream.write((char*) randomForce.data(), sizeof(Vec3)*randomForce.size());\n+ stream.write((char*) segmentVelocity.data(), sizeof(Vec3)*segmentVelocity.size());\n+ for (int i = 0; i < adaptedFriction.size(); i++)\n+ stream.write((char*) adaptedFriction[i].data(), sizeof(double)*adaptedFriction[i].size());\n+}\n+\n+void ReferenceQTBDynamics::loadCheckpoint(std::istream& stream) {\n+ stream.read((char*) &stepIndex, sizeof(int));\n+ stream.read((char*) noise.data(), sizeof(double)*noise.size());\n+ stream.read((char*) randomForce.data(), sizeof(Vec3)*randomForce.size());\n+ stream.read((char*) segmentVelocity.data(), sizeof(Vec3)*segmentVelocity.size());\n+ for (int i = 0; i < adaptedFriction.size(); i++)\n+ stream.read((char*) adaptedFriction[i].data(), sizeof(double)*adaptedFriction[i].size());\n+}\ndiff --git a/serialization/include/openmm/serialization/QTBIntegratorProxy.h b/serialization/include/openmm/serialization/QTBIntegratorProxy.h\nnew file mode 100644\nindex 0000000000..4d5c0abeb2\n--- /dev/null\n+++ b/serialization/include/openmm/serialization/QTBIntegratorProxy.h\n@@ -0,0 +1,17 @@\n+#ifndef OPENMM_QTB_INTEGRATOR_PROXY_H_\n+#define OPENMM_QTB_INTEGRATOR_PROXY_H_\n+\n+#include \"openmm/serialization/XmlSerializer.h\"\n+\n+namespace OpenMM {\n+\n+class QTBIntegratorProxy : public SerializationProxy {\n+public:\n+ QTBIntegratorProxy();\n+ void serialize(const void* object, SerializationNode& node) const;\n+ void* deserialize(const SerializationNode& node) const;\n+};\n+\n+}\n+\n+#endif /*OPENMM_QTB_INTEGRATOR_PROXY_H_*/\n\\ No newline at end of file\ndiff --git a/serialization/src/QTBIntegratorProxy.cpp b/serialization/src/QTBIntegratorProxy.cpp\nnew file mode 100644\nindex 0000000000..23eb8e69ad\n--- /dev/null\n+++ b/serialization/src/QTBIntegratorProxy.cpp\n@@ -0,0 +1,80 @@\n+/* -------------------------------------------------------------------------- *\n+ * OpenMM *\n+ * -------------------------------------------------------------------------- *\n+ * This is part of the OpenMM molecular simulation toolkit originating from *\n+ * Simbios, the NIH National Center for Physics-Based Simulation of *\n+ * Biological Structures at Stanford, funded under the NIH Roadmap for *\n+ * Medical Research, grant U54 GM072970. See https://simtk.org. *\n+ * *\n+ * Portions copyright (c) 2025 Stanford University and the Authors. *\n+ * Authors: Peter Eastman *\n+ * Contributors: *\n+ * *\n+ * Permission is hereby granted, free of charge, to any person obtaining a *\n+ * copy of this software and associated documentation files (the \"Software\"), *\n+ * to deal in the Software without restriction, including without limitation *\n+ * the rights to use, copy, modify, merge, publish, distribute, sublicense, *\n+ * and/or sell copies of the Software, and to permit persons to whom the *\n+ * Software is furnished to do so, subject to the following conditions: *\n+ * *\n+ * The above copyright notice and this permission notice shall be included in *\n+ * all copies or substantial portions of the Software. *\n+ * *\n+ * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR *\n+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, *\n+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL *\n+ * THE AUTHORS, CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, *\n+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR *\n+ * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE *\n+ * USE OR OTHER DEALINGS IN THE SOFTWARE. *\n+ * -------------------------------------------------------------------------- */\n+\n+#include \"openmm/serialization/QTBIntegratorProxy.h\"\n+#include <OpenMM.h>\n+\n+using namespace std;\n+using namespace OpenMM;\n+\n+QTBIntegratorProxy::QTBIntegratorProxy() : SerializationProxy(\"QTBIntegrator\") {\n+}\n+\n+void QTBIntegratorProxy::serialize(const void* object, SerializationNode& node) const {\n+ node.setIntProperty(\"version\", 1);\n+ const QTBIntegrator& integrator = *reinterpret_cast<const QTBIntegrator*>(object);\n+ node.setDoubleProperty(\"stepSize\", integrator.getStepSize());\n+ node.setDoubleProperty(\"constraintTolerance\", integrator.getConstraintTolerance());\n+ node.setDoubleProperty(\"temperature\", integrator.getTemperature());\n+ node.setDoubleProperty(\"friction\", integrator.getFriction());\n+ node.setDoubleProperty(\"segmentLength\", integrator.getSegmentLength());\n+ node.setDoubleProperty(\"cutoffFrequency\", integrator.getCutoffFrequency());\n+ node.setDoubleProperty(\"defaultAdaptationRate\", integrator.getDefaultAdaptationRate());\n+ node.setIntProperty(\"randomSeed\", integrator.getRandomNumberSeed());\n+ node.setIntProperty(\"integrationForceGroups\", integrator.getIntegrationForceGroups());\n+ SerializationNode& particleTypes = node.createChildNode(\"ParticleTypes\");\n+ for (auto type : integrator.getParticleTypes())\n+ particleTypes.createChildNode(\"Particle\").setIntProperty(\"index\", type.first).setIntProperty(\"type\", type.second);\n+ SerializationNode& adaptationRates = node.createChildNode(\"TypeAdaptationRates\");\n+ for (auto type : integrator.getTypeAdaptationRates())\n+ adaptationRates.createChildNode(\"Type\").setIntProperty(\"index\", type.first).setDoubleProperty(\"rate\", type.second);\n+}\n+\n+void* QTBIntegratorProxy::deserialize(const SerializationNode& node) const {\n+ if (node.getIntProperty(\"version\") != 1)\n+ throw OpenMMException(\"Unsupported version number\");\n+ QTBIntegrator *integrator = new QTBIntegrator(node.getDoubleProperty(\"temperature\"),\n+ node.getDoubleProperty(\"friction\"),\n+ node.getDoubleProperty(\"stepSize\"));\n+ integrator->setConstraintTolerance(node.getDoubleProperty(\"constraintTolerance\"));\n+ integrator->setSegmentLength(node.getDoubleProperty(\"segmentLength\"));\n+ integrator->setCutoffFrequency(node.getDoubleProperty(\"cutoffFrequency\"));\n+ integrator->setDefaultAdaptationRate(node.getDoubleProperty(\"defaultAdaptationRate\"));\n+ integrator->setRandomNumberSeed(node.getIntProperty(\"randomSeed\"));\n+ integrator->setIntegrationForceGroups(node.getIntProperty(\"integrationForceGroups\", 0xFFFFFFFF));\n+ const SerializationNode& particleTypes = node.getChildNode(\"ParticleTypes\");\n+ for (auto& particle : particleTypes.getChildren())\n+ integrator->setParticleType(particle.getIntProperty(\"index\"), particle.getIntProperty(\"type\"));\n+ const SerializationNode& adaptationRates = node.getChildNode(\"TypeAdaptationRates\");\n+ for (auto& type : adaptationRates.getChildren())\n+ integrator->setTypeAdaptationRate(type.getIntProperty(\"index\"), type.getDoubleProperty(\"rate\"));\n+ return integrator;\n+}\n\\ No newline at end of file\ndiff --git a/serialization/src/SerializationProxyRegistration.cpp b/serialization/src/SerializationProxyRegistration.cpp\nindex ad734c1d76..cfeb746aca 100644\n--- a/serialization/src/SerializationProxyRegistration.cpp\n+++ b/serialization/src/SerializationProxyRegistration.cpp\n@@ -62,6 +62,7 @@\n #include \"openmm/NonbondedForce.h\"\n #include \"openmm/NoseHooverIntegrator.h\"\n #include \"openmm/PeriodicTorsionForce.h\"\n+#include \"openmm/QTBIntegrator.h\"\n #include \"openmm/RBTorsionForce.h\"\n #include \"openmm/RMSDForce.h\"\n #include \"openmm/System.h\"\n@@ -104,6 +105,7 @@\n #include \"openmm/serialization/NonbondedForceProxy.h\"\n #include \"openmm/serialization/NoseHooverIntegratorProxy.h\"\n #include \"openmm/serialization/PeriodicTorsionForceProxy.h\"\n+#include \"openmm/serialization/QTBIntegratorProxy.h\"\n #include \"openmm/serialization/RBTorsionForceProxy.h\"\n #include \"openmm/serialization/RMSDForceProxy.h\"\n #include \"openmm/serialization/StateProxy.h\"\n@@ -168,6 +170,7 @@ extern \"C\" void registerSerializationProxies() {\n SerializationProxy::registerProxy(typeid(NoseHooverIntegrator), new NoseHooverIntegratorProxy());\n SerializationProxy::registerProxy(typeid(PeriodicTorsionForce), new PeriodicTorsionForceProxy());\n SerializationProxy::registerProxy(typeid(RBTorsionForce), new RBTorsionForceProxy());\n+ SerializationProxy::registerProxy(typeid(QTBIntegrator), new QTBIntegratorProxy());\n SerializationProxy::registerProxy(typeid(RMSDForce), new RMSDForceProxy());\n SerializationProxy::registerProxy(typeid(System), new SystemProxy());\n SerializationProxy::registerProxy(typeid(State), new StateProxy());\ndiff --git a/wrappers/generateWrappers.py b/wrappers/generateWrappers.py\nindex 7f6a8564f8..0709bd18d2 100644\n--- a/wrappers/generateWrappers.py\n+++ b/wrappers/generateWrappers.py\n@@ -95,7 +95,9 @@ def __init__(self, inputDirname, output):\n 'bool OpenMM::Discrete1DFunction::operator!=',\n 'bool OpenMM::Discrete2DFunction::operator!=',\n 'bool OpenMM::Discrete3DFunction::operator!=',\n- 'const std::map<int, int>& OpenMM::DPDIntegrator::getParticleTypes'\n+ 'const std::map<int, int>& OpenMM::DPDIntegrator::getParticleTypes',\n+ 'const std::map<int, int>& OpenMM::QTBIntegrator::getParticleTypes',\n+ 'const std::map<int, double>& OpenMM::QTBIntegrator::getTypeAdaptationRates'\n ]\n self.skipMethods = [s.replace(' ', '') for s in self.skipMethods]\n self.hideClasses = ['Kernel', 'KernelImpl', 'KernelFactory', 'ContextImpl', 'SerializationNode', 'SerializationProxy']\ndiff --git a/wrappers/python/src/swig_doxygen/swigInputConfig.py b/wrappers/python/src/swig_doxygen/swigInputConfig.py\nindex 65a08feede..9a70fc0391 100755\n--- a/wrappers/python/src/swig_doxygen/swigInputConfig.py\n+++ b/wrappers/python/src/swig_doxygen/swigInputConfig.py\n@@ -512,6 +512,14 @@\n (\"DPDIntegrator\", \"getDefaultCutoff\") : (\"unit.nanometer\", ()),\n (\"DPDIntegrator\", \"setDefaultCutoff\") : (None, (\"unit.nanometer\",)),\n (\"DPDIntegrator\", \"getParticleTypes\") : (None, ()),\n+(\"QTBIntegrator\", \"getSegmentLength\") : (\"unit.picosecond\", ()),\n+(\"QTBIntegrator\", \"setSegmentLength\") : (None, (\"unit.picosecond\",)),\n+(\"QTBIntegrator\", \"getDefaultAdaptationRate\") : (None, ()),\n+(\"QTBIntegrator\", \"setDefaultAdaptationRate\") : (None, (None,)),\n+(\"QTBIntegrator\", \"getTypeAdaptationRates\") : (None, ()),\n+(\"QTBIntegrator\", \"getParticleTypes\") : (None, ()),\n+(\"QTBIntegrator\", \"getCutoffFrequency\") : (\"unit.picosecond**-1\", ()),\n+(\"QTBIntegrator\", \"setCutoffFrequency\") : (None, (\"unit.picosecond**-1\",)),\n (\"LocalEnergyMinimizer\", \"minimize\") : (None, (None, \"unit.kilojoules_per_mole/unit.nanometer\", None)),\n (\"ATMForce\", \"getForce\") : (None, ()),\n (\"ATMForce\", \"getPerturbationEnergy\") : ('unit.kilojoule_per_mole', ()),\n"}, "test": {"test_patch": "diff --git a/platforms/cuda/tests/TestCudaQTBIntegrator.cpp b/platforms/cuda/tests/TestCudaQTBIntegrator.cpp\nnew file mode 100644\nindex 0000000000..2d6816c1d9\n--- /dev/null\n+++ b/platforms/cuda/tests/TestCudaQTBIntegrator.cpp\n@@ -0,0 +1,36 @@\n+/* -------------------------------------------------------------------------- *\n+ * OpenMM *\n+ * -------------------------------------------------------------------------- *\n+ * This is part of the OpenMM molecular simulation toolkit originating from *\n+ * Simbios, the NIH National Center for Physics-Based Simulation of *\n+ * Biological Structures at Stanford, funded under the NIH Roadmap for *\n+ * Medical Research, grant U54 GM072970. See https://simtk.org. *\n+ * *\n+ * Portions copyright (c) 2025 Stanford University and the Authors. *\n+ * Authors: Peter Eastman *\n+ * Contributors: *\n+ * *\n+ * Permission is hereby granted, free of charge, to any person obtaining a *\n+ * copy of this software and associated documentation files (the \"Software\"), *\n+ * to deal in the Software without restriction, including without limitation *\n+ * the rights to use, copy, modify, merge, publish, distribute, sublicense, *\n+ * and/or sell copies of the Software, and to permit persons to whom the *\n+ * Software is furnished to do so, subject to the following conditions: *\n+ * *\n+ * The above copyright notice and this permission notice shall be included in *\n+ * all copies or substantial portions of the Software. *\n+ * *\n+ * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR *\n+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, *\n+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL *\n+ * THE AUTHORS, CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, *\n+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR *\n+ * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE *\n+ * USE OR OTHER DEALINGS IN THE SOFTWARE. *\n+ * -------------------------------------------------------------------------- */\n+\n+#include \"CudaTests.h\"\n+#include \"TestQTBIntegrator.h\"\n+\n+void runPlatformTests() {\n+}\ndiff --git a/platforms/hip/tests/TestHipQTBIntegrator.cpp b/platforms/hip/tests/TestHipQTBIntegrator.cpp\nnew file mode 100644\nindex 0000000000..ee8d9acd23\n--- /dev/null\n+++ b/platforms/hip/tests/TestHipQTBIntegrator.cpp\n@@ -0,0 +1,36 @@\n+/* -------------------------------------------------------------------------- *\n+ * OpenMM *\n+ * -------------------------------------------------------------------------- *\n+ * This is part of the OpenMM molecular simulation toolkit originating from *\n+ * Simbios, the NIH National Center for Physics-Based Simulation of *\n+ * Biological Structures at Stanford, funded under the NIH Roadmap for *\n+ * Medical Research, grant U54 GM072970. See https://simtk.org. *\n+ * *\n+ * Portions copyright (c) 2025 Stanford University and the Authors. *\n+ * Authors: Peter Eastman *\n+ * Contributors: *\n+ * *\n+ * Permission is hereby granted, free of charge, to any person obtaining a *\n+ * copy of this software and associated documentation files (the \"Software\"), *\n+ * to deal in the Software without restriction, including without limitation *\n+ * the rights to use, copy, modify, merge, publish, distribute, sublicense, *\n+ * and/or sell copies of the Software, and to permit persons to whom the *\n+ * Software is furnished to do so, subject to the following conditions: *\n+ * *\n+ * The above copyright notice and this permission notice shall be included in *\n+ * all copies or substantial portions of the Software. *\n+ * *\n+ * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR *\n+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, *\n+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL *\n+ * THE AUTHORS, CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, *\n+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR *\n+ * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE *\n+ * USE OR OTHER DEALINGS IN THE SOFTWARE. *\n+ * -------------------------------------------------------------------------- */\n+\n+#include \"HipTests.h\"\n+#include \"TestQTBIntegrator.h\"\n+\n+void runPlatformTests() {\n+}\ndiff --git a/platforms/opencl/tests/TestOpenCLQTBIntegrator.cpp b/platforms/opencl/tests/TestOpenCLQTBIntegrator.cpp\nnew file mode 100644\nindex 0000000000..5bdc749dc0\n--- /dev/null\n+++ b/platforms/opencl/tests/TestOpenCLQTBIntegrator.cpp\n@@ -0,0 +1,36 @@\n+/* -------------------------------------------------------------------------- *\n+ * OpenMM *\n+ * -------------------------------------------------------------------------- *\n+ * This is part of the OpenMM molecular simulation toolkit originating from *\n+ * Simbios, the NIH National Center for Physics-Based Simulation of *\n+ * Biological Structures at Stanford, funded under the NIH Roadmap for *\n+ * Medical Research, grant U54 GM072970. See https://simtk.org. *\n+ * *\n+ * Portions copyright (c) 2025 Stanford University and the Authors. *\n+ * Authors: Peter Eastman *\n+ * Contributors: *\n+ * *\n+ * Permission is hereby granted, free of charge, to any person obtaining a *\n+ * copy of this software and associated documentation files (the \"Software\"), *\n+ * to deal in the Software without restriction, including without limitation *\n+ * the rights to use, copy, modify, merge, publish, distribute, sublicense, *\n+ * and/or sell copies of the Software, and to permit persons to whom the *\n+ * Software is furnished to do so, subject to the following conditions: *\n+ * *\n+ * The above copyright notice and this permission notice shall be included in *\n+ * all copies or substantial portions of the Software. *\n+ * *\n+ * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR *\n+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, *\n+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL *\n+ * THE AUTHORS, CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, *\n+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR *\n+ * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE *\n+ * USE OR OTHER DEALINGS IN THE SOFTWARE. *\n+ * -------------------------------------------------------------------------- */\n+\n+#include \"OpenCLTests.h\"\n+#include \"TestQTBIntegrator.h\"\n+\n+void runPlatformTests() {\n+}\ndiff --git a/platforms/reference/tests/TestReferenceQTBIntegrator.cpp b/platforms/reference/tests/TestReferenceQTBIntegrator.cpp\nnew file mode 100644\nindex 0000000000..4ff579a047\n--- /dev/null\n+++ b/platforms/reference/tests/TestReferenceQTBIntegrator.cpp\n@@ -0,0 +1,36 @@\n+/* -------------------------------------------------------------------------- *\n+ * OpenMM *\n+ * -------------------------------------------------------------------------- *\n+ * This is part of the OpenMM molecular simulation toolkit originating from *\n+ * Simbios, the NIH National Center for Physics-Based Simulation of *\n+ * Biological Structures at Stanford, funded under the NIH Roadmap for *\n+ * Medical Research, grant U54 GM072970. See https://simtk.org. *\n+ * *\n+ * Portions copyright (c) 2025 Stanford University and the Authors. *\n+ * Authors: Peter Eastman *\n+ * Contributors: *\n+ * *\n+ * Permission is hereby granted, free of charge, to any person obtaining a *\n+ * copy of this software and associated documentation files (the \"Software\"), *\n+ * to deal in the Software without restriction, including without limitation *\n+ * the rights to use, copy, modify, merge, publish, distribute, sublicense, *\n+ * and/or sell copies of the Software, and to permit persons to whom the *\n+ * Software is furnished to do so, subject to the following conditions: *\n+ * *\n+ * The above copyright notice and this permission notice shall be included in *\n+ * all copies or substantial portions of the Software. *\n+ * *\n+ * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR *\n+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, *\n+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL *\n+ * THE AUTHORS, CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, *\n+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR *\n+ * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE *\n+ * USE OR OTHER DEALINGS IN THE SOFTWARE. *\n+ * -------------------------------------------------------------------------- */\n+\n+#include \"ReferenceTests.h\"\n+#include \"TestQTBIntegrator.h\"\n+\n+void runPlatformTests() {\n+}\ndiff --git a/serialization/tests/TestSerializeQTBIntegrator.cpp b/serialization/tests/TestSerializeQTBIntegrator.cpp\nnew file mode 100644\nindex 0000000000..1e07e9b762\n--- /dev/null\n+++ b/serialization/tests/TestSerializeQTBIntegrator.cpp\n@@ -0,0 +1,83 @@\n+/* -------------------------------------------------------------------------- *\n+ * OpenMM *\n+ * -------------------------------------------------------------------------- *\n+ * This is part of the OpenMM molecular simulation toolkit originating from *\n+ * Simbios, the NIH National Center for Physics-Based Simulation of *\n+ * Biological Structures at Stanford, funded under the NIH Roadmap for *\n+ * Medical Research, grant U54 GM072970. See https://simtk.org. *\n+ * *\n+ * Portions copyright (c) 2025 Stanford University and the Authors. *\n+ * Authors: Peter Eastman *\n+ * Contributors: *\n+ * *\n+ * Permission is hereby granted, free of charge, to any person obtaining a *\n+ * copy of this software and associated documentation files (the \"Software\"), *\n+ * to deal in the Software without restriction, including without limitation *\n+ * the rights to use, copy, modify, merge, publish, distribute, sublicense, *\n+ * and/or sell copies of the Software, and to permit persons to whom the *\n+ * Software is furnished to do so, subject to the following conditions: *\n+ * *\n+ * The above copyright notice and this permission notice shall be included in *\n+ * all copies or substantial portions of the Software. *\n+ * *\n+ * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR *\n+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, *\n+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL *\n+ * THE AUTHORS, CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, *\n+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR *\n+ * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE *\n+ * USE OR OTHER DEALINGS IN THE SOFTWARE. *\n+ * -------------------------------------------------------------------------- */\n+\n+#include \"openmm/internal/AssertionUtilities.h\"\n+#include \"openmm/QTBIntegrator.h\"\n+#include \"openmm/serialization/XmlSerializer.h\"\n+#include <iostream>\n+#include <sstream>\n+#include <stdlib.h>\n+\n+#include <fstream>\n+\n+using namespace OpenMM;\n+using namespace std;\n+\n+void testSerialization() {\n+ QTBIntegrator integ(310.0, 10.0, 0.002);\n+ integ.setSegmentLength(0.5);\n+ integ.setCutoffFrequency(600.0);\n+ integ.setDefaultAdaptationRate(0.02);\n+ integ.setRandomNumberSeed(10);\n+ integ.setIntegrationForceGroups(3);\n+ for (int i = 0; i < 5; i++)\n+ integ.setParticleType(i, i%3);\n+ for (int i = 0; i < 3; i++)\n+ integ.setTypeAdaptationRate(i, 0.1*i);\n+ stringstream ss;\n+ XmlSerializer::serialize<Integrator>(&integ, \"QTBIntegrator\", ss);\n+ QTBIntegrator *copy = dynamic_cast<QTBIntegrator*>(XmlSerializer::deserialize<Integrator>(ss));\n+ QTBIntegrator& integ2 = *copy;\n+ ASSERT_EQUAL(integ.getConstraintTolerance(), integ2.getConstraintTolerance());\n+ ASSERT_EQUAL(integ.getStepSize(), integ2.getStepSize());\n+ ASSERT_EQUAL(integ.getTemperature(), integ2.getTemperature());\n+ ASSERT_EQUAL(integ.getFriction(), integ2.getFriction());\n+ ASSERT_EQUAL(integ.getSegmentLength(), integ2.getSegmentLength());\n+ ASSERT_EQUAL(integ.getCutoffFrequency(), integ2.getCutoffFrequency());\n+ ASSERT_EQUAL(integ.getDefaultAdaptationRate(), integ2.getDefaultAdaptationRate());\n+ ASSERT_EQUAL(integ.getRandomNumberSeed(), integ2.getRandomNumberSeed());\n+ ASSERT_EQUAL(integ.getIntegrationForceGroups(), integ2.getIntegrationForceGroups());\n+ ASSERT_EQUAL_CONTAINERS(integ.getParticleTypes(), integ2.getParticleTypes());\n+ ASSERT_EQUAL_CONTAINERS(integ.getTypeAdaptationRates(), integ2.getTypeAdaptationRates());\n+ delete copy;\n+}\n+\n+int main() {\n+ try {\n+ testSerialization();\n+ }\n+ catch(const exception& e) {\n+ cout << \"exception: \" << e.what() << endl;\n+ return 1;\n+ }\n+ cout << \"Done\" << endl;\n+ return 0;\n+}\ndiff --git a/tests/TestQTBIntegrator.h b/tests/TestQTBIntegrator.h\nnew file mode 100644\nindex 0000000000..a1623e3ec9\n--- /dev/null\n+++ b/tests/TestQTBIntegrator.h\n@@ -0,0 +1,497 @@\n+/* -------------------------------------------------------------------------- *\n+ * OpenMM *\n+ * -------------------------------------------------------------------------- *\n+ * This is part of the OpenMM molecular simulation toolkit originating from *\n+ * Simbios, the NIH National Center for Physics-Based Simulation of *\n+ * Biological Structures at Stanford, funded under the NIH Roadmap for *\n+ * Medical Research, grant U54 GM072970. See https://simtk.org. *\n+ * *\n+ * Portions copyright (c) 2025 Stanford University and the Authors. *\n+ * Authors: Peter Eastman *\n+ * Contributors: *\n+ * *\n+ * Permission is hereby granted, free of charge, to any person obtaining a *\n+ * copy of this software and associated documentation files (the \"Software\"), *\n+ * to deal in the Software without restriction, including without limitation *\n+ * the rights to use, copy, modify, merge, publish, distribute, sublicense, *\n+ * and/or sell copies of the Software, and to permit persons to whom the *\n+ * Software is furnished to do so, subject to the following conditions: *\n+ * *\n+ * The above copyright notice and this permission notice shall be included in *\n+ * all copies or substantial portions of the Software. *\n+ * *\n+ * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR *\n+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, *\n+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL *\n+ * THE AUTHORS, CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, *\n+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR *\n+ * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE *\n+ * USE OR OTHER DEALINGS IN THE SOFTWARE. *\n+ * -------------------------------------------------------------------------- */\n+\n+#include \"openmm/internal/AssertionUtilities.h\"\n+#include \"openmm/Context.h\"\n+#include \"openmm/CustomBondForce.h\"\n+#include \"openmm/CustomExternalForce.h\"\n+#include \"openmm/CustomNonbondedForce.h\"\n+#include \"openmm/HarmonicBondForce.h\"\n+#include \"openmm/NonbondedForce.h\"\n+#include \"openmm/System.h\"\n+#include \"openmm/QTBIntegrator.h\"\n+#include \"SimTKOpenMMRealType.h\"\n+#include \"sfmt/SFMT.h\"\n+#include <iostream>\n+#include <vector>\n+\n+using namespace OpenMM;\n+using namespace std;\n+\n+void testHarmonic() {\n+ // Create a collection of uncoupled harmonic oscillators.\n+\n+ int numFrequencies = 10;\n+ int numReplicas = 10;\n+ int numParticles = numFrequencies*numReplicas;\n+ double temperature = 300.0;\n+ double mass = 1.0;\n+ System system;\n+ vector<Vec3> positions(numParticles);\n+ vector<double> k;\n+ CustomExternalForce* force = new CustomExternalForce(\"0.5*k*(x*x+y*y+z*z)\");\n+ system.addForce(force);\n+ force->addPerParticleParameter(\"k\");\n+ QTBIntegrator integrator(temperature, 10.0, 0.001);\n+ integrator.setCutoffFrequency(500.0);\n+ for (int j = 0; j < numReplicas; j++) {\n+ int base = system.getNumParticles();\n+ for (int i = 0; i < numFrequencies; i++) {\n+ system.addParticle(mass);\n+ k.push_back(1000.0*(i+1)*(i+1));\n+ force->addParticle(i+base, {k[i]});\n+ integrator.setParticleType(i+base, i);\n+ }\n+ }\n+ Context context(system, integrator, platform);\n+ context.setPositions(positions);\n+ context.setVelocitiesToTemperature(temperature);\n+\n+ // Compute the average energy of each particle over a simulation.\n+\n+ integrator.step(10000);\n+ vector<double> energy(numParticles, 0.0);\n+ int numSteps = 10000;\n+ for (int i = 0; i < numSteps; i++) {\n+ integrator.step(10);\n+ State state = context.getState(State::Positions);\n+ for (int j = 0; j < numParticles; j++) {\n+ Vec3 p = state.getPositions()[j];\n+ energy[j%numFrequencies] += 0.5*k[j]*p.dot(p);\n+ }\n+ }\n+ for (int i = 0; i < numParticles; i++)\n+ energy[i] /= numSteps*numReplicas;\n+\n+ // Compare to the expected distribution.\n+\n+ for (int i = 0; i < numFrequencies; i++) {\n+ double w = sqrt(k[i]/mass);\n+ double hbar = 1.054571628e-34*AVOGADRO/(1000*1e-12);\n+ double kT = BOLTZ*temperature;\n+ double expected = 1.5*hbar*w*(0.5+1/(exp(hbar*w/kT)-1));\n+ ASSERT_USUALLY_EQUAL_TOL(expected, energy[i], 0.07);\n+ }\n+}\n+\n+void testCoupledHarmonic() {\n+ // Create a collection of weakly coupled harmonic oscillators.\n+\n+ int numFrequencies = 8;\n+ int numReplicas = 10;\n+ int numParticles = numFrequencies*numReplicas;\n+ double temperature = 10.0;\n+ double mass = 1.0;\n+ System system;\n+ vector<Vec3> positions(numParticles);\n+ vector<double> k;\n+ CustomExternalForce* force = new CustomExternalForce(\"0.5*k*(x*x+y*y+z*z)\");\n+ system.addForce(force);\n+ force->addPerParticleParameter(\"k\");\n+ CustomBondForce* bonds = new CustomBondForce(\"sin(100*r)\");\n+ system.addForce(bonds);\n+ QTBIntegrator integrator(temperature, 50.0, 0.001);\n+ integrator.setCutoffFrequency(500.0);\n+ integrator.setDefaultAdaptationRate(1.0);\n+ for (int j = 0; j < numReplicas; j++) {\n+ int base = system.getNumParticles();\n+ for (int i = 0; i < numFrequencies; i++) {\n+ system.addParticle(mass);\n+ k.push_back(1000.0*(i+1)*(i+1));\n+ force->addParticle(i+base, {k[i]});\n+ integrator.setParticleType(i+base, i);\n+ }\n+ for (int i = 0; i < numFrequencies; i++)\n+ for (int k = 0; k < i; k++)\n+ bonds->addBond(i+base, k+base);\n+ }\n+ Context context(system, integrator, platform);\n+ context.setPositions(positions);\n+ context.setVelocitiesToTemperature(temperature);\n+\n+ // Equilibrate with a high adaptation rate to let the spectrum converge.\n+\n+ for (int i = 0; i < 15; i++) {\n+ integrator.step(10000);\n+ // OpenCL on Mac hangs if we go too long without downloading anything. I don't know why.\n+ context.getState(State::Positions);\n+ }\n+ integrator.setDefaultAdaptationRate(0.05);\n+ context.reinitialize(true);\n+\n+ // Compute the average energy of each particle over a simulation.\n+\n+ vector<double> energy(numFrequencies, 0.0);\n+ int numSteps = 20000;\n+ for (int i = 0; i < numSteps; i++) {\n+ integrator.step(10);\n+ State state = context.getState(State::Positions);\n+ for (int j = 0; j < numParticles; j++) {\n+ Vec3 p = state.getPositions()[j];\n+ energy[j%numFrequencies] += 0.5*k[j]*p.dot(p);\n+ }\n+ }\n+ for (int i = 0; i < numFrequencies; i++)\n+ energy[i] /= numSteps*numReplicas;\n+\n+ // Compare to the expected distribution.\n+\n+ for (int i = 0; i < numFrequencies; i++) {\n+ double w = sqrt(k[i]/mass);\n+ double hbar = 1.054571628e-34*AVOGADRO/(1000*1e-12);\n+ double kT = BOLTZ*temperature;\n+ double expected = 1.5*hbar*w*(0.5+1/(exp(hbar*w/kT)-1));\n+ ASSERT_USUALLY_EQUAL_TOL(expected, energy[i], 0.15);\n+ }\n+}\n+\n+void testParaHydrogen() {\n+ const int numParticles = 32;\n+ const double temperature = 25.0;\n+ const double mass = 2.0;\n+ const double boxSize = 1.1896;\n+ const int numSteps = 2000;\n+ const int numBins = 200;\n+ const double reference[] = {\n+ 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,\n+ 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,\n+ 0.0, 0.0, 0.0, 4.932814042206152e-5, 1.244331241336431e-4, 4.052316284060125e-4,\n+ 1.544810863683946e-3, 4.376197806690222e-3, 1.025847561714293e-2, 2.286702037465422e-2,\n+ 4.371052180263602e-2, 7.518538770734748e-2, 0.122351534531647, 0.185758975626622,\n+ 0.266399984652322, 0.363380262153250, 0.473696401293219, 0.595312098494172,\n+ 0.726049519422861, 0.862264551954547, 0.991102029379444, 1.1147503922535,\n+ 1.23587006992066, 1.33495411932817, 1.42208208736987, 1.49273884004107,\n+ 1.54633319690403, 1.58714702233941, 1.60439217751355, 1.61804190608902,\n+ 1.60680198476058, 1.58892222973695, 1.56387607986781, 1.52629494593350,\n+ 1.48421439018970, 1.43656176771959, 1.38752775598872, 1.33310695719931,\n+ 1.28363477223121, 1.23465642750248, 1.18874848666326, 1.14350496170519,\n+ 1.10292486009936, 1.06107270157688, 1.02348927970441, 0.989729345271297,\n+ 0.959273446941802, 0.932264875865758, 0.908818658748942, 0.890946420768315,\n+ 0.869332737718165, 0.856401736350349, 0.842370069917020, 0.834386614237393,\n+ 0.826268072171045, 0.821547250199453, 0.818786865315836, 0.819441757028076,\n+ 0.819156933383128, 0.822275325148621, 0.828919078023881, 0.837233720599450,\n+ 0.846961908186718, 0.855656955481099, 0.864520333201247, 0.876082425547566,\n+ 0.886950044046000, 0.900275658318995\n+ };\n+\n+ // Create a box of para-hydrogen.\n+\n+ System system;\n+ for (int i = 0; i < numParticles; i++)\n+ system.addParticle(mass);\n+ system.setDefaultPeriodicBoxVectors(Vec3(boxSize,0,0), Vec3(0,boxSize,0), Vec3(0,0,boxSize));\n+ CustomNonbondedForce* nb = new CustomNonbondedForce(\"2625.49963*(exp(1.713-1.5671*p-0.00993*p*p)-(12.14/p^6+215.2/p^8-143.1/p^9+4813.9/p^10)*(step(rc-p)*exp(-(rc/p-1)^2)+1-step(rc-p))); p=r/0.05291772108; rc=8.32\");\n+ nb->setNonbondedMethod(CustomNonbondedForce::CutoffPeriodic);\n+ nb->setCutoffDistance(boxSize/2);\n+ vector<double> params;\n+ for (int i = 0; i < numParticles; i++)\n+ nb->addParticle(params);\n+ system.addForce(nb);\n+ QTBIntegrator integ(temperature, 40.0, 0.001);\n+ for (int i = 0; i < numParticles; i++)\n+ integ.setParticleType(i, 0);\n+ integ.setDefaultAdaptationRate(0.5);\n+ integ.setSegmentLength(0.5);\n+ Context context(system, integ, platform);\n+ OpenMM_SFMT::SFMT sfmt;\n+ init_gen_rand(0, sfmt);\n+ vector<Vec3> positions(numParticles);\n+ for (int i = 0; i < numParticles; i++)\n+ positions[i] = Vec3(boxSize*genrand_real2(sfmt), boxSize*genrand_real2(sfmt), boxSize*genrand_real2(sfmt));\n+ context.setPositions(positions);\n+ integ.step(50000);\n+\n+ // Simulate it.\n+\n+ vector<int> counts(numBins, 0);\n+ const double invBoxSize = 1.0/boxSize;\n+ for (int step = 0; step < numSteps; step++) {\n+ integ.step(20);\n+ State state = context.getState(State::Positions);\n+\n+ // Record the radial distribution function.\n+\n+ const vector<Vec3>& pos = state.getPositions();\n+ for (int j = 0; j < numParticles; j++)\n+ for (int k = 0; k < j; k++) {\n+ Vec3 delta = pos[j]-pos[k];\n+ delta[0] -= floor(delta[0]*invBoxSize+0.5)*boxSize;\n+ delta[1] -= floor(delta[1]*invBoxSize+0.5)*boxSize;\n+ delta[2] -= floor(delta[2]*invBoxSize+0.5)*boxSize;\n+ double dist = sqrt(delta.dot(delta));\n+ int bin = (int) (numBins*(dist/boxSize));\n+ counts[bin]++;\n+ }\n+ }\n+\n+ // Check against expected values.\n+\n+ double scale = (boxSize*boxSize*boxSize)/(numSteps*0.5*numParticles*numParticles);\n+ for (int i = 0; i < numBins/2; i++) {\n+ double r1 = i*boxSize/numBins;\n+ double r2 = (i+1)*boxSize/numBins;\n+ double volume = (4.0/3.0)*M_PI*(r2*r2*r2-r1*r1*r1);\n+ ASSERT_USUALLY_EQUAL_TOL(reference[i], scale*counts[i]/volume, 0.2);\n+ }\n+}\n+\n+void testConstraints() {\n+ const int numParticles = 8;\n+ const int numConstraints = 5;\n+ const double temp = 100.0;\n+ System system;\n+ QTBIntegrator integrator(temp, 2.0, 0.01);\n+ integrator.setConstraintTolerance(1e-5);\n+ NonbondedForce* forceField = new NonbondedForce();\n+ for (int i = 0; i < numParticles; ++i) {\n+ system.addParticle(10.0);\n+ forceField->addParticle((i%2 == 0 ? 0.2 : -0.2), 0.5, 5.0);\n+ }\n+ system.addConstraint(0, 1, 1.0);\n+ system.addConstraint(1, 2, 1.0);\n+ system.addConstraint(2, 3, 1.0);\n+ system.addConstraint(4, 5, 1.0);\n+ system.addConstraint(6, 7, 1.0);\n+ system.addForce(forceField);\n+ Context context(system, integrator, platform);\n+ vector<Vec3> positions(numParticles);\n+ vector<Vec3> velocities(numParticles);\n+ OpenMM_SFMT::SFMT sfmt;\n+ init_gen_rand(0, sfmt);\n+\n+ for (int i = 0; i < numParticles; ++i) {\n+ positions[i] = Vec3(i/2, (i+1)/2, 0);\n+ velocities[i] = Vec3(genrand_real2(sfmt)-0.5, genrand_real2(sfmt)-0.5, genrand_real2(sfmt)-0.5);\n+ }\n+ context.setPositions(positions);\n+ context.setVelocities(velocities);\n+\n+ // Simulate it and see whether the constraints remain satisfied.\n+\n+ for (int i = 0; i < 1000; ++i) {\n+ State state = context.getState(State::Positions);\n+ for (int j = 0; j < numConstraints; ++j) {\n+ int particle1, particle2;\n+ double distance;\n+ system.getConstraintParameters(j, particle1, particle2, distance);\n+ Vec3 p1 = state.getPositions()[particle1];\n+ Vec3 p2 = state.getPositions()[particle2];\n+ double dist = std::sqrt((p1[0]-p2[0])*(p1[0]-p2[0])+(p1[1]-p2[1])*(p1[1]-p2[1])+(p1[2]-p2[2])*(p1[2]-p2[2]));\n+ ASSERT_EQUAL_TOL(distance, dist, 1e-4);\n+ }\n+ integrator.step(1);\n+ }\n+}\n+\n+void testConstrainedMasslessParticles() {\n+ System system;\n+ system.addParticle(0.0);\n+ system.addParticle(1.0);\n+ system.addConstraint(0, 1, 1.5);\n+ vector<Vec3> positions(2);\n+ positions[0] = Vec3(-1, 0, 0);\n+ positions[1] = Vec3(1, 0, 0);\n+ QTBIntegrator integrator(300.0, 2.0, 0.01);\n+ bool failed = false;\n+ try {\n+ // This should throw an exception.\n+ \n+ Context context(system, integrator, platform);\n+ }\n+ catch (exception& ex) {\n+ failed = true;\n+ }\n+ ASSERT(failed);\n+ \n+ // Now make both particles massless, which should work.\n+ \n+ system.setParticleMass(1, 0.0);\n+ Context context(system, integrator, platform);\n+ context.setPositions(positions);\n+ context.setVelocitiesToTemperature(300.0);\n+ integrator.step(1);\n+ State state = context.getState(State::Velocities);\n+ ASSERT_EQUAL(0.0, state.getVelocities()[0][0]);\n+}\n+\n+void testRandomSeed() {\n+ const int numParticles = 8;\n+ const double temp = 100.0;\n+ System system;\n+ QTBIntegrator integrator(temp, 2.0, 0.01);\n+ NonbondedForce* forceField = new NonbondedForce();\n+ for (int i = 0; i < numParticles; ++i) {\n+ system.addParticle(2.0);\n+ forceField->addParticle((i%2 == 0 ? 1.0 : -1.0), 1.0, 5.0);\n+ }\n+ system.addForce(forceField);\n+ vector<Vec3> positions(numParticles);\n+ vector<Vec3> velocities(numParticles);\n+ for (int i = 0; i < numParticles; ++i) {\n+ positions[i] = Vec3((i%2 == 0 ? 2 : -2), (i%4 < 2 ? 2 : -2), (i < 4 ? 2 : -2));\n+ velocities[i] = Vec3(0, 0, 0);\n+ }\n+\n+ // Try twice with the same random seed.\n+\n+ integrator.setRandomNumberSeed(5);\n+ Context context(system, integrator, platform);\n+ context.setPositions(positions);\n+ context.setVelocities(velocities);\n+ integrator.step(10);\n+ State state1 = context.getState(State::Positions);\n+ context.reinitialize();\n+ context.setPositions(positions);\n+ context.setVelocities(velocities);\n+ integrator.step(10);\n+ State state2 = context.getState(State::Positions);\n+\n+ // Try twice with a different random seed.\n+\n+ integrator.setRandomNumberSeed(10);\n+ context.reinitialize();\n+ context.setPositions(positions);\n+ context.setVelocities(velocities);\n+ integrator.step(10);\n+ State state3 = context.getState(State::Positions);\n+ context.reinitialize();\n+ context.setPositions(positions);\n+ context.setVelocities(velocities);\n+ integrator.step(10);\n+ State state4 = context.getState(State::Positions);\n+\n+ // Compare the results.\n+\n+ for (int i = 0; i < numParticles; i++) {\n+ for (int j = 0; j < 3; j++) {\n+ ASSERT_EQUAL_TOL(state1.getPositions()[i][j], state2.getPositions()[i][j], 1e-6);\n+ ASSERT_EQUAL_TOL(state3.getPositions()[i][j], state4.getPositions()[i][j], 1e-6);\n+ ASSERT(state1.getPositions()[i][j] != state3.getPositions()[i][j]);\n+ }\n+ }\n+}\n+\n+void testInitialTemperature() {\n+ // Check temperature initialization for a collection of randomly placed particles\n+ const int numParticles = 50000;\n+ const int nDoF = 3 * numParticles;\n+ const double targetTemperature = 300;\n+ System system;\n+ OpenMM_SFMT::SFMT sfmt;\n+ init_gen_rand(0, sfmt);\n+ std::vector<Vec3> positions(numParticles);\n+\n+ for (int i = 0; i < numParticles; i++) {\n+ system.addParticle(1.0);\n+ positions[i][0] = genrand_real2(sfmt);\n+ positions[i][1] = genrand_real2(sfmt);\n+ positions[i][2] = genrand_real2(sfmt);\n+ }\n+\n+ QTBIntegrator integrator(300, 25, 0.001);\n+ Context context(system, integrator, platform);\n+ context.setPositions(positions);\n+ context.setVelocitiesToTemperature(targetTemperature);\n+ auto velocities = context.getState(State::Velocities).getVelocities();\n+ double kineticEnergy = 0;\n+ for(const auto &v : velocities) kineticEnergy += 0.5 * v.dot(v);\n+ double temperature = (2*kineticEnergy / (nDoF*BOLTZ));\n+ ASSERT_USUALLY_EQUAL_TOL(targetTemperature, temperature, 0.01);\n+}\n+\n+void testSerializeParameters() {\n+ // Test serializing the integrator's parameters.\n+\n+ int numParticles = 10;\n+ double temperature = 300.0;\n+ double mass = 2.0;\n+ System system;\n+ vector<Vec3> positions(numParticles);\n+ CustomExternalForce* force = new CustomExternalForce(\"0.5*k*(x*x+y*y+z*z)\");\n+ system.addForce(force);\n+ force->addPerParticleParameter(\"k\");\n+ QTBIntegrator integrator(temperature, 10.0, 0.001);\n+ integrator.setCutoffFrequency(500.0);\n+ integrator.setDefaultAdaptationRate(0.1);\n+ for (int i = 0; i < numParticles; i++) {\n+ system.addParticle(mass);\n+ force->addParticle(i, {1000.0*(i+1)*(i+1)});\n+ if (i < 5)\n+ integrator.setParticleType(i, i%3);\n+ }\n+ Context context(system, integrator, platform);\n+ context.setPositions(positions);\n+ context.setVelocitiesToTemperature(temperature);\n+\n+ // Run for a little while, then record a State.\n+\n+ integrator.step(5000);\n+ State state = context.getState(State::IntegratorParameters);\n+\n+ // Create a new Integrator and Context, set the State, and see if the adapted\n+ // friction coefficients were set correctly.\n+\n+ QTBIntegrator integrator2(temperature, 10.0, 0.001);\n+ for (auto type : integrator.getParticleTypes())\n+ integrator2.setParticleType(type.first, type.second);\n+ Context context2(system, integrator2, platform);\n+ context2.setPositions(positions);\n+ context2.setState(state);\n+ for (int i = 0; i < numParticles; i++) {\n+ vector<double> f1, f2;\n+ integrator.getAdaptedFriction(i, f1);\n+ integrator2.getAdaptedFriction(i, f2);\n+ ASSERT_EQUAL_CONTAINERS(f1, f2);\n+ }\n+}\n+\n+void runPlatformTests();\n+\n+int main(int argc, char* argv[]) {\n+ try {\n+ initializeTests(argc, argv);\n+ testHarmonic();\n+ testCoupledHarmonic();\n+ testParaHydrogen();\n+ testConstraints();\n+ testConstrainedMasslessParticles();\n+ testRandomSeed();\n+ testInitialTemperature();\n+ testSerializeParameters();\n+ runPlatformTests();\n+ }\n+ catch(const exception& e) {\n+ cout << \"exception: \" << e.what() << endl;\n+ return 1;\n+ }\n+ cout << \"Done\" << endl;\n+ return 0;\n+}\ndiff --git a/wrappers/python/tests/TestAPIUnits.py b/wrappers/python/tests/TestAPIUnits.py\nindex 63c877bbbb..ec125ff81f 100644\n--- a/wrappers/python/tests/TestAPIUnits.py\n+++ b/wrappers/python/tests/TestAPIUnits.py\n@@ -1089,5 +1089,22 @@ def testCustomIntegrator(self):\n integrator = CustomIntegrator(1.0*femtoseconds)\n self.assertEqual(integrator.getStepSize(), 1.0*femtoseconds)\n \n+ def testQTBIntegrator(self):\n+ \"\"\" Tests the LangevinIntegrator API features \"\"\"\n+ integrator = QTBIntegrator(300, 0.1, 0.001)\n+ self.assertEqual(integrator.getTemperature(), 300*kelvin)\n+ self.assertEqual(integrator.getFriction(), 0.1/picosecond)\n+ self.assertEqual(integrator.getStepSize(), 0.001*picosecond)\n+\n+ integrator = QTBIntegrator(300*kelvin, 0.1/microsecond, 1*femtosecond)\n+ self.assertEqual(integrator.getTemperature(), 300*kelvin)\n+ self.assertAlmostEqualUnit(integrator.getFriction(), 0.1/microsecond)\n+ self.assertEqual(integrator.getStepSize(), 1*femtosecond)\n+\n+ integrator.setSegmentLength(0.5)\n+ self.assertEqual(integrator.getSegmentLength(), 0.5*picosecond)\n+ integrator.setSegmentLength(100*femtosecond)\n+ self.assertEqual(integrator.getSegmentLength(), 0.1*picosecond)\n+\n if __name__ == '__main__':\n unittest.main()\n", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}108{"question_id": "MSB_openmm_openmm_pr5031", "question_type": "multi_swe_bench", "description": "Radius of gyration force (openmm/openmm#5031)", "content": {"org": "openmm", "repo": "openmm", "pr_number": 5031, "issue_title": "Radius of gyration force", "issue_body": "This adds a RGForce class that computes the radius of gyration. It is mainly intended for use with CustomCVForce so you can use Rg as part of restraint potentials, metadynamics, etc.\r\n\r\nFixes #5015.", "base_commit": "6e2f213fa70310e6f2ac89bd8aba7a51475f001d", "resolved_issues": [{"number": 5015, "title": "Radius of Gyration restraint force in OpenMM", "body": "Hello!\n\nWe are recently investigating moving from CHARMM to OpenMM for some coarse-grained MD runs for comparison with SAXS data. We are very excited with the potential performance of some initial runs. \n\nHowever, we are running into an issue with implementing a RGYR Restraint Force ala CHARMM in OpenMM. We followed your suggestion of creating one group per atom, and one group with all atoms, and a bond for each single-atom group with the group containing all atoms within a CustomCentroidBondForce wrapped in CustomCVForce that does the harmonic restraint. \n``` \nnum_atoms = len(atom_indices)\nrg2_force = CustomCentroidBondForce(2, f\"(distance(g1, g2)^2)/{num_atoms}\")\nfor i in atom_indices:\n rg2_force.addGroup([i], [1.0]) # g1: single atom\nrg2_force.addGroup(atom_indices, [1.0] * num_atoms\nfor i in range(num_atoms):\n rg2_force.addBond([i, num_atoms]) # last group is full group (index = num_atoms)\nsuper().__init__(\"0.5 * k_rg * (sqrt(cv) - rg0)^2\")\nself.addGlobalParameter(\"k_rg\", k_rg)\nself.addGlobalParameter(\"rg0\", rg0)\nself.addCollectiveVariable(\"cv\", rg2_force)\nself.setForceGroup(force_group)\n```\n\n1. As you cautioned in the other issue - this works when the number of atoms involved in the calc of the collective variable is in 100s - time for setup is a few seconds. When the number of atoms which are involved in the calculation of Rg is closer to a 1000, then the setup time becomes slower but still few tens of seconds. However, when we go to ~8000 atoms, the code doesn't move past the Simulation creation step for ~30 mins (longest we waited to test it). Is this expected?\nThe attached test case uses ~8000 atoms for the Rg restraint - ```python scripts/md.py``` should repr it in the attached tar. There is an nsys profile attached in the tar in case its helpful. A profile for a successful run (around 1000 atoms) shows that most of this time, it is in the ```findMoleculeGroups()``` function. In the py code it is at the ```simulation = Simulation(modeller.topology, system, integrator)``` step. \n2. We see only one thread on the CPU being active when where it possibly hangs. Is this part expected to be multi-threaded or single threaded? Is the setup part parallelizable? \n3. We are under the impression that the Rg / Rg-based force calculation itself is not time consuming, it is the setup part that is currently just hanging (or requiring time > 30 min to complete) - but the dynamics calculation after setup completes proceeds faster since its using the GPU/is optimized - is this right? \n4. So, if we implemented the restraint force via a plugin (i.e. without using the bond infrastructure), would that avoid the slow setup problem since we would not need to create a group of >> 1000 atoms involved in a bond - the possibly non-optimized single threaded part of the code? Is that a reasonable approach?\n\n\n[openmm-test.tar.gz](https://github.com/user-attachments/files/21306632/openmm-test.tar.gz)\n\nHow you installed OpenMM (pip, conda, compile from source, etc.).\n - compiled from source \n- The operating system and hardware (e.g. GPU model) you are using.\n - Running on Perlmutter, A100\n- The platform (CUDA, OpenCL, etc.) you are using.\n - CUDA \n- Any other software (Python libraries, setup tools, etc.) you are using along with OpenMM to implement your workflow.\n - None\n- The output of the command `python -m openmm.testInstallation`. It reports details about your installation and checks for some basic problems.\n```\nOpenMM Version: 8.3.1\nGit Revision: 6e13f1361dcc3ffb581c7c97e3adfcc61257b813\n\nThere are 3 Platforms available:\n\n1 Reference - Successfully computed forces\n2 CPU - Successfully computed forces\n3 CUDA - Successfully computed forces\n\nMedian difference in forces between platforms:\n\nReference vs. CPU: 6.30823e-06\nReference vs. CUDA: 6.74442e-06\nCPU vs. CUDA: 7.12587e-07\n\nAll differences are within tolerance.\n```\nThanks!\n\n## IMPORTANT INSTRUCTIONS\n\n1. If you edit a python file, you MUST run 'make PythonInstall' inside the build directory\n2. If you edit a c++ file, you MUST run 'make -j4 && make install\" inside the build directory"}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/openmm_m_openmm:pr-5031", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/docs-source/api-c++/forces.rst b/docs-source/api-c++/forces.rst\nindex fdb99b272a..f1c45cb818 100644\n--- a/docs-source/api-c++/forces.rst\n+++ b/docs-source/api-c++/forces.rst\n@@ -70,6 +70,7 @@ be combined in arbitrary ways.\n generated/MonteCarloBarostat\n generated/MonteCarloFlexibleBarostat\n generated/MonteCarloMembraneBarostat\n+ generated/RGForce\n generated/RMSDForce\n generated/RPMDMonteCarloBarostat\n \ndiff --git a/docs-source/usersguide/theory/02_standard_forces.rst b/docs-source/usersguide/theory/02_standard_forces.rst\nindex 031990da80..9f8f6e5a1c 100644\n--- a/docs-source/usersguide/theory/02_standard_forces.rst\n+++ b/docs-source/usersguide/theory/02_standard_forces.rst\n@@ -790,3 +790,21 @@ This force is normally used with a CustomCVForce (see Section :numref:`customcvf\n One rarely wants a force whose energy exactly equals the RMSD, but there are many\n situations where it is useful to have a restraining or biasing force that depends\n on the RMSD in some way.\n+\n+RGForce\n+*********\n+\n+RGForce computes the radius of gyration (Rg) of a set of particle positions:\n+\n+.. math::\n+ \\text{Rg} = \\sqrt{\\frac{\\sum_{i} \\| \\mathbf{x}_i - \\mathbf{x}_c \\|^2}{N}}\n+\n+where :math:`\\mathbf{x}_c` is the center position,\n+\n+.. math::\n+ \\mathbf{x}_c = \\frac{\\sum_{i} \\mathbf{x}_i}{N}\n+\n+This force is normally used with a CustomCVForce (see Section :numref:`customcvforce`).\n+One rarely wants a force whose energy exactly equals Rg, but there are many\n+situations where it is useful to have a restraining or biasing force that depends\n+on Rg in some way.\ndiff --git a/olla/include/openmm/kernels.h b/olla/include/openmm/kernels.h\nindex bae1996a4d..be7e0bdbe0 100644\n--- a/olla/include/openmm/kernels.h\n+++ b/olla/include/openmm/kernels.h\n@@ -59,6 +59,7 @@\n #include \"openmm/PeriodicTorsionForce.h\"\n #include \"openmm/QTBIntegrator.h\"\n #include \"openmm/RBTorsionForce.h\"\n+#include \"openmm/RGForce.h\"\n #include \"openmm/RMSDForce.h\"\n #include \"openmm/NonbondedForce.h\"\n #include \"openmm/System.h\"\n@@ -1071,6 +1072,34 @@ class CalcRMSDForceKernel : public KernelImpl {\n virtual void copyParametersToContext(ContextImpl& context, const RMSDForce& force) = 0;\n };\n \n+/**\n+ * This kernel is invoked by RGForce to calculate the forces acting on the system and the energy of the system.\n+ */\n+class CalcRGForceKernel : public KernelImpl {\n+public:\n+ static std::string Name() {\n+ return \"CalcRGForce\";\n+ }\n+ CalcRGForceKernel(std::string name, const Platform& platform) : KernelImpl(name, platform) {\n+ }\n+ /**\n+ * Initialize the kernel.\n+ *\n+ * @param system the System this kernel will be applied to\n+ * @param force the RGForce this kernel will be used for\n+ */\n+ virtual void initialize(const System& system, const RGForce& force) = 0;\n+ /**\n+ * Execute the kernel to calculate the forces and/or energy.\n+ *\n+ * @param context the context in which to execute this kernel\n+ * @param includeForces true if forces should be calculated\n+ * @param includeEnergy true if the energy should be calculated\n+ * @return the potential energy due to the force\n+ */\n+ virtual double execute(ContextImpl& context, bool includeForces, bool includeEnergy) = 0;\n+};\n+\n /**\n * This kernel is invoked by VerletIntegrator to take one time step.\n */\ndiff --git a/openmmapi/include/OpenMM.h b/openmmapi/include/OpenMM.h\nindex df064cbc28..3004cc0c30 100644\n--- a/openmmapi/include/OpenMM.h\n+++ b/openmmapi/include/OpenMM.h\n@@ -70,6 +70,7 @@\n #include \"openmm/PeriodicTorsionForce.h\"\n #include \"openmm/QTBIntegrator.h\"\n #include \"openmm/RBTorsionForce.h\"\n+#include \"openmm/RGForce.h\"\n #include \"openmm/RMSDForce.h\"\n #include \"openmm/State.h\"\n #include \"openmm/System.h\"\ndiff --git a/openmmapi/include/openmm/RGForce.h b/openmmapi/include/openmm/RGForce.h\nnew file mode 100644\nindex 0000000000..3c3e65ccb0\n--- /dev/null\n+++ b/openmmapi/include/openmm/RGForce.h\n@@ -0,0 +1,89 @@\n+#ifndef OPENMM_RGFORCE_H_\n+#define OPENMM_RGFORCE_H_\n+\n+/* -------------------------------------------------------------------------- *\n+ * OpenMM *\n+ * -------------------------------------------------------------------------- *\n+ * This is part of the OpenMM molecular simulation toolkit originating from *\n+ * Simbios, the NIH National Center for Physics-Based Simulation of *\n+ * Biological Structures at Stanford, funded under the NIH Roadmap for *\n+ * Medical Research, grant U54 GM072970. See https://simtk.org. *\n+ * *\n+ * Portions copyright (c) 2025 Stanford University and the Authors. *\n+ * Authors: Peter Eastman *\n+ * Contributors: *\n+ * *\n+ * Permission is hereby granted, free of charge, to any person obtaining a *\n+ * copy of this software and associated documentation files (the \"Software\"), *\n+ * to deal in the Software without restriction, including without limitation *\n+ * the rights to use, copy, modify, merge, publish, distribute, sublicense, *\n+ * and/or sell copies of the Software, and to permit persons to whom the *\n+ * Software is furnished to do so, subject to the following conditions: *\n+ * *\n+ * The above copyright notice and this permission notice shall be included in *\n+ * all copies or substantial portions of the Software. *\n+ * *\n+ * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR *\n+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, *\n+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL *\n+ * THE AUTHORS, CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, *\n+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR *\n+ * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE *\n+ * USE OR OTHER DEALINGS IN THE SOFTWARE. *\n+ * -------------------------------------------------------------------------- */\n+\n+#include \"Force.h\"\n+#include \"Vec3.h\"\n+#include <vector>\n+#include \"internal/windowsExport.h\"\n+\n+namespace OpenMM {\n+\n+/**\n+ * This is a force whose energy equals the radius of gyration (Rg) of a set of\n+ * particles. It is intended for use with CustomCVForce. You will not normally\n+ * want a force that exactly equals the radius of gyration, but there are many\n+ * situations where it is useful to have a restraining or biasing force that\n+ * depends on Rg in some way.\n+ */\n+\n+class OPENMM_EXPORT RGForce : public Force {\n+public:\n+ /**\n+ * Create an RGForce.\n+ *\n+ * @param particles the indices of the particles to use when computing\n+ * Rg. If this is empty (the default), all particles in\n+ * the system will be used.\n+ */\n+ explicit RGForce(const std::vector<int>& particles=std::vector<int>());\n+ /**\n+ * Get the indices of the particles to use when computing Rg. If this\n+ * is empty, all particles in the system will be used.\n+ */\n+ const std::vector<int>& getParticles() const {\n+ return particles;\n+ }\n+ /**\n+ * Set the indices of the particles to use when computing Rg. If this\n+ * is empty, all particles in the system will be used.\n+ */\n+ void setParticles(const std::vector<int>& particles);\n+ /**\n+ * Returns whether or not this force makes use of periodic boundary\n+ * conditions.\n+ *\n+ * @returns true if force uses PBC and false otherwise\n+ */\n+ bool usesPeriodicBoundaryConditions() const {\n+ return false;\n+ }\n+protected:\n+ ForceImpl* createImpl() const;\n+private:\n+ std::vector<int> particles;\n+};\n+\n+} // namespace OpenMM\n+\n+#endif /*OPENMM_RGFORCE_H_*/\ndiff --git a/openmmapi/include/openmm/internal/RGForceImpl.h b/openmmapi/include/openmm/internal/RGForceImpl.h\nnew file mode 100644\nindex 0000000000..7febebc1e3\n--- /dev/null\n+++ b/openmmapi/include/openmm/internal/RGForceImpl.h\n@@ -0,0 +1,71 @@\n+#ifndef OPENMM_RGFORCEIMPL_H_\n+#define OPENMM_RGFORCEIMPL_H_\n+\n+/* -------------------------------------------------------------------------- *\n+ * OpenMM *\n+ * -------------------------------------------------------------------------- *\n+ * This is part of the OpenMM molecular simulation toolkit originating from *\n+ * Simbios, the NIH National Center for Physics-Based Simulation of *\n+ * Biological Structures at Stanford, funded under the NIH Roadmap for *\n+ * Medical Research, grant U54 GM072970. See https://simtk.org. *\n+ * *\n+ * Portions copyright (c) 2025 Stanford University and the Authors. *\n+ * Authors: Peter Eastman *\n+ * Contributors: *\n+ * *\n+ * Permission is hereby granted, free of charge, to any person obtaining a *\n+ * copy of this software and associated documentation files (the \"Software\"), *\n+ * to deal in the Software without restriction, including without limitation *\n+ * the rights to use, copy, modify, merge, publish, distribute, sublicense, *\n+ * and/or sell copies of the Software, and to permit persons to whom the *\n+ * Software is furnished to do so, subject to the following conditions: *\n+ * *\n+ * The above copyright notice and this permission notice shall be included in *\n+ * all copies or substantial portions of the Software. *\n+ * *\n+ * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR *\n+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, *\n+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL *\n+ * THE AUTHORS, CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, *\n+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR *\n+ * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE *\n+ * USE OR OTHER DEALINGS IN THE SOFTWARE. *\n+ * -------------------------------------------------------------------------- */\n+\n+#include \"ForceImpl.h\"\n+#include \"openmm/RGForce.h\"\n+#include \"openmm/Kernel.h\"\n+#include <utility>\n+#include <map>\n+#include <string>\n+\n+namespace OpenMM {\n+\n+/**\n+ * This is the internal implementation of RGForce.\n+ */\n+\n+class RGForceImpl : public ForceImpl {\n+public:\n+ RGForceImpl(const RGForce& owner);\n+ ~RGForceImpl();\n+ void initialize(ContextImpl& context);\n+ const RGForce& getOwner() const {\n+ return owner;\n+ }\n+ void updateContextState(ContextImpl& context, bool& forcesInvalid) {\n+ // This force field doesn't update the state directly.\n+ }\n+ double calcForcesAndEnergy(ContextImpl& context, bool includeForces, bool includeEnergy, int groups);\n+ std::map<std::string, double> getDefaultParameters() {\n+ return std::map<std::string, double>(); // This force doesn't define any parameters.\n+ }\n+ std::vector<std::string> getKernelNames();\n+private:\n+ const RGForce& owner;\n+ Kernel kernel;\n+};\n+\n+} // namespace OpenMM\n+\n+#endif /*OPENMM_RGFORCEIMPL_H_*/\ndiff --git a/openmmapi/src/RGForce.cpp b/openmmapi/src/RGForce.cpp\nnew file mode 100644\nindex 0000000000..ce30d02c17\n--- /dev/null\n+++ b/openmmapi/src/RGForce.cpp\n@@ -0,0 +1,47 @@\n+/* -------------------------------------------------------------------------- *\n+ * OpenMM *\n+ * -------------------------------------------------------------------------- *\n+ * This is part of the OpenMM molecular simulation toolkit originating from *\n+ * Simbios, the NIH National Center for Physics-Based Simulation of *\n+ * Biological Structures at Stanford, funded under the NIH Roadmap for *\n+ * Medical Research, grant U54 GM072970. See https://simtk.org. *\n+ * *\n+ * Portions copyright (c) 2025 Stanford University and the Authors. *\n+ * Authors: Peter Eastman *\n+ * Contributors: *\n+ * *\n+ * Permission is hereby granted, free of charge, to any person obtaining a *\n+ * copy of this software and associated documentation files (the \"Software\"), *\n+ * to deal in the Software without restriction, including without limitation *\n+ * the rights to use, copy, modify, merge, publish, distribute, sublicense, *\n+ * and/or sell copies of the Software, and to permit persons to whom the *\n+ * Software is furnished to do so, subject to the following conditions: *\n+ * *\n+ * The above copyright notice and this permission notice shall be included in *\n+ * all copies or substantial portions of the Software. *\n+ * *\n+ * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR *\n+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, *\n+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL *\n+ * THE AUTHORS, CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, *\n+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR *\n+ * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE *\n+ * USE OR OTHER DEALINGS IN THE SOFTWARE. *\n+ * -------------------------------------------------------------------------- */\n+\n+#include \"openmm/RGForce.h\"\n+#include \"openmm/internal/RGForceImpl.h\"\n+\n+using namespace OpenMM;\n+using namespace std;\n+\n+RGForce::RGForce(const vector<int>& particles) : particles(particles) {\n+}\n+\n+void RGForce::setParticles(const std::vector<int>& particles) {\n+ this->particles = particles;\n+}\n+\n+ForceImpl* RGForce::createImpl() const {\n+ return new RGForceImpl(*this);\n+}\ndiff --git a/openmmapi/src/RGForceImpl.cpp b/openmmapi/src/RGForceImpl.cpp\nnew file mode 100644\nindex 0000000000..df50f77cf9\n--- /dev/null\n+++ b/openmmapi/src/RGForceImpl.cpp\n@@ -0,0 +1,84 @@\n+/* -------------------------------------------------------------------------- *\n+ * OpenMM *\n+ * -------------------------------------------------------------------------- *\n+ * This is part of the OpenMM molecular simulation toolkit originating from *\n+ * Simbios, the NIH National Center for Physics-Based Simulation of *\n+ * Biological Structures at Stanford, funded under the NIH Roadmap for *\n+ * Medical Research, grant U54 GM072970. See https://simtk.org. *\n+ * *\n+ * Portions copyright (c) 2025 Stanford University and the Authors. *\n+ * Authors: Peter Eastman *\n+ * Contributors: *\n+ * *\n+ * Permission is hereby granted, free of charge, to any person obtaining a *\n+ * copy of this software and associated documentation files (the \"Software\"), *\n+ * to deal in the Software without restriction, including without limitation *\n+ * the rights to use, copy, modify, merge, publish, distribute, sublicense, *\n+ * and/or sell copies of the Software, and to permit persons to whom the *\n+ * Software is furnished to do so, subject to the following conditions: *\n+ * *\n+ * The above copyright notice and this permission notice shall be included in *\n+ * all copies or substantial portions of the Software. *\n+ * *\n+ * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR *\n+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, *\n+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL *\n+ * THE AUTHORS, CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, *\n+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR *\n+ * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE *\n+ * USE OR OTHER DEALINGS IN THE SOFTWARE. *\n+ * -------------------------------------------------------------------------- */\n+\n+#include \"openmm/OpenMMException.h\"\n+#include \"openmm/internal/ContextImpl.h\"\n+#include \"openmm/internal/RGForceImpl.h\"\n+#include \"openmm/kernels.h\"\n+#include <set>\n+#include <sstream>\n+\n+using namespace OpenMM;\n+using namespace std;\n+\n+RGForceImpl::RGForceImpl(const RGForce& owner) : owner(owner) {\n+ forceGroup = owner.getForceGroup();\n+}\n+\n+RGForceImpl::~RGForceImpl() {\n+}\n+\n+void RGForceImpl::initialize(ContextImpl& context) {\n+ kernel = context.getPlatform().createKernel(CalcRGForceKernel::Name(), context);\n+\n+ // Check for errors in the specification of particles.\n+ const System& system = context.getSystem();\n+ int numParticles = system.getNumParticles();\n+ set<int> particles;\n+ for (int i : owner.getParticles()) {\n+ if (i < 0 || i >= numParticles) {\n+ stringstream msg;\n+ msg << \"RGForce: Illegal particle index for Rg: \";\n+ msg << i;\n+ throw OpenMMException(msg.str());\n+ }\n+ if (particles.find(i) != particles.end()) {\n+ stringstream msg;\n+ msg << \"RGForce: Duplicated particle index for Rg: \";\n+ msg << i;\n+ throw OpenMMException(msg.str());\n+ }\n+ particles.insert(i);\n+ }\n+ kernel.getAs<CalcRGForceKernel>().initialize(context.getSystem(), owner);\n+}\n+\n+double RGForceImpl::calcForcesAndEnergy(ContextImpl& context, bool includeForces, bool includeEnergy, int groups) {\n+ if ((groups&(1<<forceGroup)) != 0)\n+ return kernel.getAs<CalcRGForceKernel>().execute(context, includeForces, includeEnergy);\n+ return 0.0;\n+}\n+\n+vector<string> RGForceImpl::getKernelNames() {\n+ vector<string> names;\n+ names.push_back(CalcRGForceKernel::Name());\n+ return names;\n+}\ndiff --git a/platforms/common/include/openmm/common/CommonKernels.h b/platforms/common/include/openmm/common/CommonKernels.h\nindex ffda15d675..be7bf01c3c 100644\n--- a/platforms/common/include/openmm/common/CommonKernels.h\n+++ b/platforms/common/include/openmm/common/CommonKernels.h\n@@ -1158,6 +1158,37 @@ class CommonCalcRMSDForceKernel : public CalcRMSDForceKernel {\n ComputeKernel kernel1, kernel2;\n };\n \n+/**\n+ * This kernel is invoked by RGForce to calculate the forces acting on the system and the energy of the system.\n+ */\n+class CommonCalcRGForceKernel : public CalcRGForceKernel {\n+public:\n+ CommonCalcRGForceKernel(std::string name, const Platform& platform, ComputeContext& cc) : CalcRGForceKernel(name, platform), cc(cc) {\n+ }\n+ /**\n+ * Initialize the kernel.\n+ *\n+ * @param system the System this kernel will be applied to\n+ * @param force the RGForce this kernel will be used for\n+ */\n+ void initialize(const System& system, const RGForce& force);\n+ /**\n+ * Execute the kernel to calculate the forces and/or energy.\n+ *\n+ * @param context the context in which to execute this kernel\n+ * @param includeForces true if forces should be calculated\n+ * @param includeEnergy true if the energy should be calculated\n+ * @return the potential energy due to the force\n+ */\n+ double execute(ContextImpl& context, bool includeForces, bool includeEnergy);\n+private:\n+ class ReorderListener;\n+ ComputeContext& cc;\n+ int blockSize;\n+ ComputeArray particles, centerBuffer, rgBuffer;\n+ ComputeKernel centerKernel, rgKernel, forceKernel;\n+};\n+\n /**\n * This kernel is invoked by AndersenThermostat at the start of each time step to adjust the particle velocities.\n */\ndiff --git a/platforms/common/src/CommonKernels.cpp b/platforms/common/src/CommonKernels.cpp\nindex 6526df339f..b159bd880a 100644\n--- a/platforms/common/src/CommonKernels.cpp\n+++ b/platforms/common/src/CommonKernels.cpp\n@@ -3592,6 +3592,90 @@ void CommonCalcRMSDForceKernel::copyParametersToContext(ContextImpl& context, co\n cc.invalidateMolecules(info);\n }\n \n+class CommonCalcRGForceKernel::ReorderListener : public ComputeContext::ReorderListener {\n+public:\n+ ReorderListener(ComputeContext& cc, const vector<int>& particleIndices, ArrayInterface& particles) : cc(cc),\n+ particleIndices(particleIndices), particles(particles) {\n+ }\n+ void execute() {\n+ vector<int> particleVec(particles.getSize());\n+ const vector<int>& order = cc.getAtomIndex();\n+ vector<int> invOrder(cc.getPaddedNumAtoms());\n+ for (int i = 0; i < order.size(); i++)\n+ invOrder[order[i]] = i;\n+ for (int i = 0; i < particleIndices.size(); i++)\n+ particleVec[i] = invOrder[particleIndices[i]];\n+ particles.upload(particleVec);\n+ }\n+private:\n+ ComputeContext& cc;\n+ const vector<int>& particleIndices;\n+ ArrayInterface& particles;\n+};\n+\n+void CommonCalcRGForceKernel::initialize(const System& system, const RGForce& force) {\n+ // Create data structures.\n+\n+ ContextSelector selector(cc);\n+ bool useDouble = cc.getUseDoublePrecision();\n+ int elementSize = (useDouble ? sizeof(double) : sizeof(float));\n+ int numParticles = force.getParticles().size();\n+ if (numParticles == 0)\n+ numParticles = system.getNumParticles();\n+ particles.initialize<int>(cc, numParticles, \"particles\");\n+ centerBuffer.initialize(cc, 3*(cc.getNumThreadBlocks()+1), elementSize, \"centerBuffer\");\n+ rgBuffer.initialize(cc, cc.getNumThreadBlocks(), elementSize, \"rgBuffer\");\n+\n+ // Create the kernels.\n+\n+ blockSize = min(256, cc.getMaxThreadBlockSize());\n+ map<string, string> defines;\n+ defines[\"THREAD_BLOCK_SIZE\"] = cc.intToString(blockSize);\n+ defines[\"PADDED_NUM_ATOMS\"] = cc.intToString(cc.getPaddedNumAtoms());\n+ ComputeProgram program = cc.compileProgram(CommonKernelSources::rg, defines);\n+ centerKernel = program->createKernel(\"computeCenterPosition\");\n+ rgKernel = program->createKernel(\"computeRg\");\n+ forceKernel = program->createKernel(\"computeForces\");\n+ centerKernel->addArg(numParticles);\n+ centerKernel->addArg(cc.getPosq());\n+ centerKernel->addArg(particles);\n+ centerKernel->addArg(centerBuffer);\n+ rgKernel->addArg(numParticles);\n+ rgKernel->addArg(cc.getPosq());\n+ rgKernel->addArg(particles);\n+ rgKernel->addArg(centerBuffer);\n+ rgKernel->addArg(rgBuffer);\n+ forceKernel->addArg(numParticles);\n+ forceKernel->addArg(cc.getPosq());\n+ forceKernel->addArg(particles);\n+ forceKernel->addArg(centerBuffer);\n+ forceKernel->addArg(rgBuffer);\n+ forceKernel->addArg(cc.getLongForceBuffer());\n+ forceKernel->addArg(cc.getEnergyBuffer());\n+\n+ // Create the listener for updating the list of particles.\n+\n+ if (force.getParticles().size() == 0) {\n+ vector<int> particleVec(numParticles);\n+ for (int i = 0; i < numParticles; i++)\n+ particleVec[i] = i;\n+ particles.upload(particleVec);\n+ }\n+ else {\n+ ReorderListener* listener = new ReorderListener(cc, force.getParticles(), particles);\n+ cc.addReorderListener(listener);\n+ listener->execute();\n+ }\n+}\n+\n+double CommonCalcRGForceKernel::execute(ContextImpl& context, bool includeForces, bool includeEnergy) {\n+ ContextSelector selector(cc);\n+ centerKernel->execute(particles.getSize(), blockSize);\n+ rgKernel->execute(particles.getSize(), blockSize);\n+ forceKernel->execute(particles.getSize(), blockSize);\n+ return 0.0;\n+}\n+\n void CommonApplyAndersenThermostatKernel::initialize(const System& system, const AndersenThermostat& thermostat) {\n ContextSelector selector(cc);\n randomSeed = thermostat.getRandomNumberSeed();\ndiff --git a/platforms/common/src/kernels/rg.cc b/platforms/common/src/kernels/rg.cc\nnew file mode 100644\nindex 0000000000..f9ffdcca55\n--- /dev/null\n+++ b/platforms/common/src/kernels/rg.cc\n@@ -0,0 +1,107 @@\n+/**\n+ * Sum a value over all threads.\n+ */\n+DEVICE real reduceValue(real value, LOCAL_ARG volatile real* temp) {\n+ const int thread = LOCAL_ID;\n+ SYNC_THREADS;\n+ temp[thread] = value;\n+ SYNC_THREADS;\n+ for (int step = 1; step < 32; step *= 2) {\n+ if (thread+step < LOCAL_SIZE && thread%(2*step) == 0)\n+ temp[thread] = temp[thread] + temp[thread+step];\n+ SYNC_WARPS;\n+ }\n+ for (int step = 32; step < LOCAL_SIZE; step *= 2) {\n+ if (thread+step < LOCAL_SIZE && thread%(2*step) == 0)\n+ temp[thread] = temp[thread] + temp[thread+step];\n+ SYNC_THREADS;\n+ }\n+ return temp[0];\n+}\n+\n+/**\n+ * First step of computing the radius of gyration: each thread block computes a contribution\n+ * to the center position.\n+ */\n+KERNEL void computeCenterPosition(int numParticles, GLOBAL const real4* RESTRICT posq, GLOBAL const int* RESTRICT particles,\n+ GLOBAL real* centerBuffer) {\n+ LOCAL volatile real temp[THREAD_BLOCK_SIZE];\n+ real3 center = make_real3(0);\n+ for (int i = GLOBAL_ID; i < numParticles; i += GLOBAL_SIZE)\n+ center += trimTo3(posq[particles[i]]);\n+ center.x = reduceValue(center.x, temp);\n+ center.y = reduceValue(center.y, temp);\n+ center.z = reduceValue(center.z, temp);\n+ if (LOCAL_ID == 0) {\n+ centerBuffer[3*GROUP_ID] = center.x;\n+ centerBuffer[3*GROUP_ID+1] = center.y;\n+ centerBuffer[3*GROUP_ID+2] = center.z;\n+ }\n+}\n+\n+/**\n+ * Second step of computing the radius of gyration: each thread block computes a contribution to Rg^2.\n+ */\n+KERNEL void computeRg(int numParticles, GLOBAL const real4* RESTRICT posq, GLOBAL const int* RESTRICT particles,\n+ GLOBAL real* centerBuffer, GLOBAL real* rgBuffer) {\n+ LOCAL volatile real temp[THREAD_BLOCK_SIZE];\n+\n+ // Sum the contributions computed in the previous kernel to find the center position.\n+\n+ real3 center = make_real3(0);\n+ for (int i = LOCAL_ID; i < NUM_GROUPS; i += LOCAL_SIZE) {\n+ center.x += centerBuffer[3*i];\n+ center.y += centerBuffer[3*i+1];\n+ center.z += centerBuffer[3*i+2];\n+ }\n+ center.x = reduceValue(center.x, temp)/numParticles;\n+ center.y = reduceValue(center.y, temp)/numParticles;\n+ center.z = reduceValue(center.z, temp)/numParticles;\n+ if (GLOBAL_ID == 0) {\n+ // Save the result so we don't need to compute it again in the next kernel.\n+\n+ centerBuffer[3*NUM_GROUPS] = center.x;\n+ centerBuffer[3*NUM_GROUPS+1] = center.y;\n+ centerBuffer[3*NUM_GROUPS+2] = center.z;\n+ }\n+\n+ // Compute the contributions to Rg^2.\n+\n+ real rg2 = 0;\n+ for (int i = GLOBAL_ID; i < numParticles; i += GLOBAL_SIZE) {\n+ real3 delta = trimTo3(posq[particles[i]]) - center;\n+ rg2 += dot(delta, delta);\n+ }\n+ rg2 = reduceValue(rg2, temp);\n+ if (LOCAL_ID == 0)\n+ rgBuffer[GROUP_ID] = rg2;\n+}\n+\n+/**\n+ * Third step of computing the radius of gyration: compute the forces.\n+ */\n+KERNEL void computeForces(int numParticles, GLOBAL const real4* RESTRICT posq, GLOBAL const int* RESTRICT particles,\n+ GLOBAL const real* centerBuffer, GLOBAL real* rgBuffer, GLOBAL mm_ulong* RESTRICT forceBuffers, GLOBAL mixed* RESTRICT energyBuffer) {\n+ LOCAL volatile real temp[THREAD_BLOCK_SIZE];\n+ real3 center = make_real3(centerBuffer[3*NUM_GROUPS], centerBuffer[3*NUM_GROUPS+1], centerBuffer[3*NUM_GROUPS+2]);\n+\n+ // Sum the contributions computed in the previous kernel to find Rg.\n+\n+ real rg2 = 0;\n+ for (int i = LOCAL_ID; i < NUM_GROUPS; i += LOCAL_SIZE)\n+ rg2 += rgBuffer[i];\n+ real rg = SQRT(reduceValue(rg2, temp)/numParticles);\n+ if (GLOBAL_ID == 0)\n+ energyBuffer[0] += rg;\n+\n+ // Compute the forces.\n+\n+ real scale = 1/(rg*numParticles);\n+ for (int i = GLOBAL_ID; i < numParticles; i += GLOBAL_SIZE) {\n+ int particle = particles[i];\n+ real3 delta = trimTo3(posq[particle]) - center;\n+ ATOMIC_ADD(&forceBuffers[particle], (mm_ulong) realToFixedPoint(-scale*delta.x));\n+ ATOMIC_ADD(&forceBuffers[particle+PADDED_NUM_ATOMS], (mm_ulong) realToFixedPoint(-scale*delta.y));\n+ ATOMIC_ADD(&forceBuffers[particle+2*PADDED_NUM_ATOMS], (mm_ulong) realToFixedPoint(-scale*delta.z));\n+ }\n+}\ndiff --git a/platforms/cuda/src/CudaKernelFactory.cpp b/platforms/cuda/src/CudaKernelFactory.cpp\nindex 01f493fcc9..989584703f 100644\n--- a/platforms/cuda/src/CudaKernelFactory.cpp\n+++ b/platforms/cuda/src/CudaKernelFactory.cpp\n@@ -123,6 +123,8 @@ KernelImpl* CudaKernelFactory::createKernelImpl(std::string name, const Platform\n return new CudaCalcATMForceKernel(name, platform, cu);\n if (name == CalcCustomCPPForceKernel::Name())\n return new CommonCalcCustomCPPForceKernel(name, platform, context, cu);\n+ if (name == CalcRGForceKernel::Name())\n+ return new CommonCalcRGForceKernel(name, platform, cu);\n if (name == CalcRMSDForceKernel::Name())\n return new CommonCalcRMSDForceKernel(name, platform, cu);\n if (name == CalcCustomManyParticleForceKernel::Name())\ndiff --git a/platforms/cuda/src/CudaPlatform.cpp b/platforms/cuda/src/CudaPlatform.cpp\nindex 6adc21fb23..4625eb2cd2 100644\n--- a/platforms/cuda/src/CudaPlatform.cpp\n+++ b/platforms/cuda/src/CudaPlatform.cpp\n@@ -94,6 +94,7 @@ CudaPlatform::CudaPlatform() {\n registerKernelFactory(CalcCustomCPPForceKernel::Name(), factory);\n registerKernelFactory(CalcCustomCVForceKernel::Name(), factory);\n registerKernelFactory(CalcATMForceKernel::Name(), factory);\n+ registerKernelFactory(CalcRGForceKernel::Name(), factory);\n registerKernelFactory(CalcRMSDForceKernel::Name(), factory);\n registerKernelFactory(CalcCustomManyParticleForceKernel::Name(), factory);\n registerKernelFactory(CalcGayBerneForceKernel::Name(), factory);\ndiff --git a/platforms/hip/src/HipKernelFactory.cpp b/platforms/hip/src/HipKernelFactory.cpp\nindex 16d2f7b782..b3eade589c 100644\n--- a/platforms/hip/src/HipKernelFactory.cpp\n+++ b/platforms/hip/src/HipKernelFactory.cpp\n@@ -122,6 +122,8 @@ KernelImpl* HipKernelFactory::createKernelImpl(std::string name, const Platform&\n return new HipCalcCustomCVForceKernel(name, platform, cu);\n if (name == CalcCustomCPPForceKernel::Name())\n return new CommonCalcCustomCPPForceKernel(name, platform, context, cu);\n+ if (name == CalcRGForceKernel::Name())\n+ return new CommonCalcRGForceKernel(name, platform, cu);\n if (name == CalcRMSDForceKernel::Name())\n return new CommonCalcRMSDForceKernel(name, platform, cu);\n if (name == CalcCustomManyParticleForceKernel::Name())\ndiff --git a/platforms/hip/src/HipPlatform.cpp b/platforms/hip/src/HipPlatform.cpp\nindex dc0f9c2d52..69817904f6 100644\n--- a/platforms/hip/src/HipPlatform.cpp\n+++ b/platforms/hip/src/HipPlatform.cpp\n@@ -94,6 +94,7 @@ HipPlatform::HipPlatform() {\n registerKernelFactory(CalcCustomCompoundBondForceKernel::Name(), factory);\n registerKernelFactory(CalcCustomCPPForceKernel::Name(), factory);\n registerKernelFactory(CalcCustomCVForceKernel::Name(), factory);\n+ registerKernelFactory(CalcRGForceKernel::Name(), factory);\n registerKernelFactory(CalcRMSDForceKernel::Name(), factory);\n registerKernelFactory(CalcCustomManyParticleForceKernel::Name(), factory);\n registerKernelFactory(CalcGayBerneForceKernel::Name(), factory);\ndiff --git a/platforms/opencl/src/OpenCLKernelFactory.cpp b/platforms/opencl/src/OpenCLKernelFactory.cpp\nindex c758df70c7..2909350086 100644\n--- a/platforms/opencl/src/OpenCLKernelFactory.cpp\n+++ b/platforms/opencl/src/OpenCLKernelFactory.cpp\n@@ -121,6 +121,8 @@ KernelImpl* OpenCLKernelFactory::createKernelImpl(std::string name, const Platfo\n return new OpenCLCalcATMForceKernel(name, platform, cl);\n if (name == CalcCustomCPPForceKernel::Name())\n return new CommonCalcCustomCPPForceKernel(name, platform, context, cl);\n+ if (name == CalcRGForceKernel::Name())\n+ return new CommonCalcRGForceKernel(name, platform, cl);\n if (name == CalcRMSDForceKernel::Name())\n return new CommonCalcRMSDForceKernel(name, platform, cl);\n if (name == CalcCustomManyParticleForceKernel::Name())\ndiff --git a/platforms/opencl/src/OpenCLPlatform.cpp b/platforms/opencl/src/OpenCLPlatform.cpp\nindex fe81690b06..30388cb936 100644\n--- a/platforms/opencl/src/OpenCLPlatform.cpp\n+++ b/platforms/opencl/src/OpenCLPlatform.cpp\n@@ -85,6 +85,7 @@ OpenCLPlatform::OpenCLPlatform() {\n registerKernelFactory(CalcCustomCPPForceKernel::Name(), factory);\n registerKernelFactory(CalcCustomCVForceKernel::Name(), factory);\n registerKernelFactory(CalcATMForceKernel::Name(), factory);\n+ registerKernelFactory(CalcRGForceKernel::Name(), factory);\n registerKernelFactory(CalcRMSDForceKernel::Name(), factory);\n registerKernelFactory(CalcCustomManyParticleForceKernel::Name(), factory);\n registerKernelFactory(CalcGayBerneForceKernel::Name(), factory);\ndiff --git a/platforms/reference/include/ReferenceKernels.h b/platforms/reference/include/ReferenceKernels.h\nindex 6c614ff47e..9dd2b2edc0 100644\n--- a/platforms/reference/include/ReferenceKernels.h\n+++ b/platforms/reference/include/ReferenceKernels.h\n@@ -1148,6 +1148,33 @@ class ReferenceCalcRMSDForceKernel : public CalcRMSDForceKernel {\n std::vector<int> particles;\n };\n \n+/**\n+ * This kernel is invoked by RGForce to calculate the forces acting on the system and the energy of the system.\n+ */\n+class ReferenceCalcRGForceKernel : public CalcRGForceKernel {\n+public:\n+ ReferenceCalcRGForceKernel(std::string name, const Platform& platform) : CalcRGForceKernel(name, platform) {\n+ }\n+ /**\n+ * Initialize the kernel.\n+ *\n+ * @param system the System this kernel will be applied to\n+ * @param force the RGForce this kernel will be used for\n+ */\n+ void initialize(const System& system, const RGForce& force);\n+ /**\n+ * Execute the kernel to calculate the forces and/or energy.\n+ *\n+ * @param context the context in which to execute this kernel\n+ * @param includeForces true if forces should be calculated\n+ * @param includeEnergy true if the energy should be calculated\n+ * @return the potential energy due to the force\n+ */\n+ double execute(ContextImpl& context, bool includeForces, bool includeEnergy);\n+private:\n+ std::vector<int> particles;\n+};\n+\n /**\n * This kernel is invoked by VerletIntegrator to take one time step.\n */\ndiff --git a/platforms/reference/include/ReferenceRGForce.h b/platforms/reference/include/ReferenceRGForce.h\nnew file mode 100644\nindex 0000000000..a4948e0d71\n--- /dev/null\n+++ b/platforms/reference/include/ReferenceRGForce.h\n@@ -0,0 +1,54 @@\n+/* Portions copyright (c) 2025 Stanford University and Simbios.\n+ * Contributors: Peter Eastman\n+ *\n+ * Permission is hereby granted, free of charge, to any person obtaining\n+ * a copy of this software and associated documentation files (the\n+ * \"Software\"), to deal in the Software without restriction, including\n+ * without limitation the rights to use, copy, modify, merge, publish,\n+ * distribute, sublicense, and/or sell copies of the Software, and to\n+ * permit persons to whom the Software is furnished to do so, subject\n+ * to the following conditions:\n+ *\n+ * The above copyright notice and this permission notice shall be included\n+ * in all copies or substantial portions of the Software.\n+ *\n+ * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\n+ * IN NO EVENT SHALL THE AUTHORS, CONTRIBUTORS OR COPYRIGHT HOLDERS BE\n+ * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\n+ * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\n+ * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n+ */\n+\n+#ifndef __ReferenceRGForce_H__\n+#define __ReferenceRGForce_H__\n+\n+#include \"openmm/RGForce.h\"\n+#include <vector>\n+\n+namespace OpenMM {\n+\n+class ReferenceRGForce {\n+private:\n+ std::vector<int> particles;\n+\n+public:\n+ /**\n+ * Constructor\n+ */\n+ ReferenceRGForce(std::vector<int>& particles);\n+\n+ /**\n+ * Calculate the interaction.\n+ * \n+ * @param atomCoordinates atom coordinates\n+ * @param forces the forces are added to this\n+ * @return the energy of the interaction\n+ */\n+ double calculateIxn(std::vector<OpenMM::Vec3>& atomCoordinates, std::vector<OpenMM::Vec3>& forces) const;\n+};\n+\n+} // namespace OpenMM\n+\n+#endif // __ReferenceRGForce_H__\ndiff --git a/platforms/reference/src/ReferenceKernelFactory.cpp b/platforms/reference/src/ReferenceKernelFactory.cpp\nindex dbe1421596..54951966ff 100644\n--- a/platforms/reference/src/ReferenceKernelFactory.cpp\n+++ b/platforms/reference/src/ReferenceKernelFactory.cpp\n@@ -84,6 +84,8 @@ KernelImpl* ReferenceKernelFactory::createKernelImpl(std::string name, const Pla\n return new ReferenceCalcATMForceKernel(name, platform);\n if (name == CalcCustomCPPForceKernel::Name())\n return new ReferenceCalcCustomCPPForceKernel(name, platform);\n+ if (name == CalcRGForceKernel::Name())\n+ return new ReferenceCalcRGForceKernel(name, platform);\n if (name == CalcRMSDForceKernel::Name())\n return new ReferenceCalcRMSDForceKernel(name, platform);\n if (name == CalcCustomManyParticleForceKernel::Name())\ndiff --git a/platforms/reference/src/ReferenceKernels.cpp b/platforms/reference/src/ReferenceKernels.cpp\nindex 4c8e0dea12..aaae045710 100644\n--- a/platforms/reference/src/ReferenceKernels.cpp\n+++ b/platforms/reference/src/ReferenceKernels.cpp\n@@ -62,6 +62,7 @@\n #include \"ReferenceProperDihedralBond.h\"\n #include \"ReferenceQTBDynamics.h\"\n #include \"ReferenceRbDihedralBond.h\"\n+#include \"ReferenceRGForce.h\"\n #include \"ReferenceRMSDForce.h\"\n #include \"ReferenceTabulatedFunction.h\"\n #include \"ReferenceVariableStochasticDynamics.h\"\n@@ -2308,6 +2309,20 @@ void ReferenceCalcRMSDForceKernel::copyParametersToContext(ContextImpl& context,\n p -= center;\n }\n \n+void ReferenceCalcRGForceKernel::initialize(const System& system, const RGForce& force) {\n+ particles = force.getParticles();\n+ if (particles.size() == 0)\n+ for (int i = 0; i < system.getNumParticles(); i++)\n+ particles.push_back(i);\n+}\n+\n+double ReferenceCalcRGForceKernel::execute(ContextImpl& context, bool includeForces, bool includeEnergy) {\n+ vector<Vec3>& posData = extractPositions(context);\n+ vector<Vec3>& forceData = extractForces(context);\n+ ReferenceRGForce rg(particles);\n+ return rg.calculateIxn(posData, forceData);\n+}\n+\n ReferenceIntegrateVerletStepKernel::~ReferenceIntegrateVerletStepKernel() {\n if (dynamics)\n delete dynamics;\ndiff --git a/platforms/reference/src/ReferencePlatform.cpp b/platforms/reference/src/ReferencePlatform.cpp\nindex 70fc071ec4..17bd8b31c6 100644\n--- a/platforms/reference/src/ReferencePlatform.cpp\n+++ b/platforms/reference/src/ReferencePlatform.cpp\n@@ -65,6 +65,7 @@ ReferencePlatform::ReferencePlatform() {\n registerKernelFactory(CalcCustomCPPForceKernel::Name(), factory);\n registerKernelFactory(CalcCustomCVForceKernel::Name(), factory);\n registerKernelFactory(CalcATMForceKernel::Name(), factory);\n+ registerKernelFactory(CalcRGForceKernel::Name(), factory);\n registerKernelFactory(CalcRMSDForceKernel::Name(), factory);\n registerKernelFactory(CalcCustomManyParticleForceKernel::Name(), factory);\n registerKernelFactory(CalcGayBerneForceKernel::Name(), factory);\ndiff --git a/platforms/reference/src/SimTKReference/ReferenceRGForce.cpp b/platforms/reference/src/SimTKReference/ReferenceRGForce.cpp\nnew file mode 100644\nindex 0000000000..481814bebf\n--- /dev/null\n+++ b/platforms/reference/src/SimTKReference/ReferenceRGForce.cpp\n@@ -0,0 +1,59 @@\n+/* Portions copyright (c) 2025 Stanford University and Simbios.\n+ * Contributors: Peter Eastman\n+ *\n+ * Permission is hereby granted, free of charge, to any person obtaining\n+ * a copy of this software and associated documentation files (the\n+ * \"Software\"), to deal in the Software without restriction, including\n+ * without limitation the rights to use, copy, modify, merge, publish,\n+ * distribute, sublicense, and/or sell copies of the Software, and to\n+ * permit persons to whom the Software is furnished to do so, subject\n+ * to the following conditions:\n+ *\n+ * The above copyright notice and this permission notice shall be included\n+ * in all copies or substantial portions of the Software.\n+ *\n+ * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\n+ * IN NO EVENT SHALL THE AUTHORS, CONTRIBUTORS OR COPYRIGHT HOLDERS BE\n+ * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\n+ * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\n+ * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n+ */\n+\n+#include \"ReferenceRGForce.h\"\n+#include <cmath>\n+\n+using namespace OpenMM;\n+using namespace std;\n+\n+ReferenceRGForce::ReferenceRGForce(vector<int>& particles) : particles(particles) {\n+}\n+\n+double ReferenceRGForce::calculateIxn(vector<Vec3>& atomCoordinates, vector<Vec3>& forces) const {\n+ // Compute the center position.\n+\n+ int numParticles = particles.size();\n+ Vec3 center;\n+ for (int i : particles)\n+ center += atomCoordinates[i];\n+ center /= numParticles;\n+\n+ // Compute the radius of gyration.\n+\n+ double sum = 0.0;\n+ for (int i = 0; i < numParticles; i++) {\n+ Vec3 delta = atomCoordinates[particles[i]]-center;\n+ sum += delta.dot(delta);\n+ }\n+ double rg = sqrt(sum/numParticles);\n+\n+ // Compute the forces.\n+\n+ double scale = 1.0/(rg*numParticles);\n+ for (int i = 0; i < numParticles; i++) {\n+ Vec3 delta = atomCoordinates[particles[i]]-center;\n+ forces[particles[i]] -= scale*delta;\n+ }\n+ return rg;\n+}\ndiff --git a/serialization/include/openmm/serialization/RGForceProxy.h b/serialization/include/openmm/serialization/RGForceProxy.h\nnew file mode 100644\nindex 0000000000..3b218695b1\n--- /dev/null\n+++ b/serialization/include/openmm/serialization/RGForceProxy.h\n@@ -0,0 +1,53 @@\n+#ifndef OPENMM_RGFORCE_PROXY_H_\n+#define OPENMM_RGFORCE_PROXY_H_\n+\n+/* -------------------------------------------------------------------------- *\n+ * OpenMM *\n+ * -------------------------------------------------------------------------- *\n+ * This is part of the OpenMM molecular simulation toolkit originating from *\n+ * Simbios, the NIH National Center for Physics-Based Simulation of *\n+ * Biological Structures at Stanford, funded under the NIH Roadmap for *\n+ * Medical Research, grant U54 GM072970. See https://simtk.org. *\n+ * *\n+ * Portions copyright (c) 2025 Stanford University and the Authors. *\n+ * Authors: Peter Eastman *\n+ * Contributors: *\n+ * *\n+ * Permission is hereby granted, free of charge, to any person obtaining a *\n+ * copy of this software and associated documentation files (the \"Software\"), *\n+ * to deal in the Software without restriction, including without limitation *\n+ * the rights to use, copy, modify, merge, publish, distribute, sublicense, *\n+ * and/or sell copies of the Software, and to permit persons to whom the *\n+ * Software is furnished to do so, subject to the following conditions: *\n+ * *\n+ * The above copyright notice and this permission notice shall be included in *\n+ * all copies or substantial portions of the Software. *\n+ * *\n+ * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR *\n+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, *\n+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL *\n+ * THE AUTHORS, CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, *\n+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR *\n+ * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE *\n+ * USE OR OTHER DEALINGS IN THE SOFTWARE. *\n+ * -------------------------------------------------------------------------- */\n+\n+#include \"openmm/internal/windowsExport.h\"\n+#include \"openmm/serialization/SerializationProxy.h\"\n+\n+namespace OpenMM {\n+\n+/**\n+ * This is a proxy for serializing RGForce objects.\n+ */\n+\n+class OPENMM_EXPORT RGForceProxy : public SerializationProxy {\n+public:\n+ RGForceProxy();\n+ void serialize(const void* object, SerializationNode& node) const;\n+ void* deserialize(const SerializationNode& node) const;\n+};\n+\n+} // namespace OpenMM\n+\n+#endif /*OPENMM_RGFORCE_PROXY_H_*/\ndiff --git a/serialization/src/RGForceProxy.cpp b/serialization/src/RGForceProxy.cpp\nnew file mode 100644\nindex 0000000000..32f5af722b\n--- /dev/null\n+++ b/serialization/src/RGForceProxy.cpp\n@@ -0,0 +1,73 @@\n+/* -------------------------------------------------------------------------- *\n+ * OpenMM *\n+ * -------------------------------------------------------------------------- *\n+ * This is part of the OpenMM molecular simulation toolkit originating from *\n+ * Simbios, the NIH National Center for Physics-Based Simulation of *\n+ * Biological Structures at Stanford, funded under the NIH Roadmap for *\n+ * Medical Research, grant U54 GM072970. See https://simtk.org. *\n+ * *\n+ * Portions copyright (c) 2025 Stanford University and the Authors. *\n+ * Authors: Peter Eastman *\n+ * Contributors: *\n+ * *\n+ * Permission is hereby granted, free of charge, to any person obtaining a *\n+ * copy of this software and associated documentation files (the \"Software\"), *\n+ * to deal in the Software without restriction, including without limitation *\n+ * the rights to use, copy, modify, merge, publish, distribute, sublicense, *\n+ * and/or sell copies of the Software, and to permit persons to whom the *\n+ * Software is furnished to do so, subject to the following conditions: *\n+ * *\n+ * The above copyright notice and this permission notice shall be included in *\n+ * all copies or substantial portions of the Software. *\n+ * *\n+ * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR *\n+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, *\n+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL *\n+ * THE AUTHORS, CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, *\n+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR *\n+ * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE *\n+ * USE OR OTHER DEALINGS IN THE SOFTWARE. *\n+ * -------------------------------------------------------------------------- */\n+\n+#include \"openmm/serialization/RGForceProxy.h\"\n+#include \"openmm/serialization/SerializationNode.h\"\n+#include \"openmm/Force.h\"\n+#include \"openmm/RGForce.h\"\n+#include <sstream>\n+\n+using namespace OpenMM;\n+using namespace std;\n+\n+RGForceProxy::RGForceProxy() : SerializationProxy(\"RGForce\") {\n+}\n+\n+void RGForceProxy::serialize(const void* object, SerializationNode& node) const {\n+ node.setIntProperty(\"version\", 0);\n+ const RGForce& force = *reinterpret_cast<const RGForce*>(object);\n+ node.setIntProperty(\"forceGroup\", force.getForceGroup());\n+ node.setStringProperty(\"name\", force.getName());\n+ SerializationNode& particlesNode = node.createChildNode(\"Particles\");\n+ for (int i : force.getParticles())\n+ particlesNode.createChildNode(\"Particle\").setIntProperty(\"index\", i);\n+}\n+\n+void* RGForceProxy::deserialize(const SerializationNode& node) const {\n+ int version = node.getIntProperty(\"version\");\n+ if (version != 0)\n+ throw OpenMMException(\"Unsupported version number\");\n+ RGForce* force = NULL;\n+ try {\n+ vector<int> particles;\n+ for (auto& particle : node.getChildNode(\"Particles\").getChildren())\n+ particles.push_back(particle.getIntProperty(\"index\"));\n+ force = new RGForce(particles);\n+ force->setForceGroup(node.getIntProperty(\"forceGroup\", 0));\n+ force->setName(node.getStringProperty(\"name\", force->getName()));\n+ return force;\n+ }\n+ catch (...) {\n+ if (force != NULL)\n+ delete force;\n+ throw;\n+ }\n+}\ndiff --git a/serialization/src/SerializationProxyRegistration.cpp b/serialization/src/SerializationProxyRegistration.cpp\nindex cfeb746aca..eabafa0841 100644\n--- a/serialization/src/SerializationProxyRegistration.cpp\n+++ b/serialization/src/SerializationProxyRegistration.cpp\n@@ -6,7 +6,7 @@\n * Biological Structures at Stanford, funded under the NIH Roadmap for *\n * Medical Research, grant U54 GM072970. See https://simtk.org. *\n * *\n- * Portions copyright (c) 2010-2021 Stanford University and the Authors. *\n+ * Portions copyright (c) 2010-2025 Stanford University and the Authors. *\n * Authors: Peter Eastman *\n * Contributors: *\n * *\n@@ -64,6 +64,7 @@\n #include \"openmm/PeriodicTorsionForce.h\"\n #include \"openmm/QTBIntegrator.h\"\n #include \"openmm/RBTorsionForce.h\"\n+#include \"openmm/RGForce.h\"\n #include \"openmm/RMSDForce.h\"\n #include \"openmm/System.h\"\n #include \"openmm/TabulatedFunction.h\"\n@@ -107,6 +108,7 @@\n #include \"openmm/serialization/PeriodicTorsionForceProxy.h\"\n #include \"openmm/serialization/QTBIntegratorProxy.h\"\n #include \"openmm/serialization/RBTorsionForceProxy.h\"\n+#include \"openmm/serialization/RGForceProxy.h\"\n #include \"openmm/serialization/RMSDForceProxy.h\"\n #include \"openmm/serialization/StateProxy.h\"\n #include \"openmm/serialization/SystemProxy.h\"\n@@ -169,8 +171,9 @@ extern \"C\" void registerSerializationProxies() {\n SerializationProxy::registerProxy(typeid(NonbondedForce), new NonbondedForceProxy());\n SerializationProxy::registerProxy(typeid(NoseHooverIntegrator), new NoseHooverIntegratorProxy());\n SerializationProxy::registerProxy(typeid(PeriodicTorsionForce), new PeriodicTorsionForceProxy());\n- SerializationProxy::registerProxy(typeid(RBTorsionForce), new RBTorsionForceProxy());\n SerializationProxy::registerProxy(typeid(QTBIntegrator), new QTBIntegratorProxy());\n+ SerializationProxy::registerProxy(typeid(RBTorsionForce), new RBTorsionForceProxy());\n+ SerializationProxy::registerProxy(typeid(RGForce), new RGForceProxy());\n SerializationProxy::registerProxy(typeid(RMSDForce), new RMSDForceProxy());\n SerializationProxy::registerProxy(typeid(System), new SystemProxy());\n SerializationProxy::registerProxy(typeid(State), new StateProxy());\ndiff --git a/wrappers/python/src/swig_doxygen/swigInputConfig.py b/wrappers/python/src/swig_doxygen/swigInputConfig.py\nindex ebc155eac5..410d1a6039 100755\n--- a/wrappers/python/src/swig_doxygen/swigInputConfig.py\n+++ b/wrappers/python/src/swig_doxygen/swigInputConfig.py\n@@ -491,6 +491,7 @@\n (\"RMSDForce\", \"getReferencePositions\") : (\"unit.nanometer\", ()),\n (\"RMSDForce\", \"setReferencePositions\") : (None, (\"unit.nanometer\",)),\n (\"RMSDForce\", \"getParticles\") : (None, ()),\n+(\"RGForce\", \"getParticles\") : (None, ()),\n (\"NoseHooverChain\", \"NoseHooverChain\") : (None, (\"unit.kelvin\", \"unit.kelvin\", \"unit.picosecond**-1\", \"unit.picosecond**-1\", None, None, None, None, None, None, None)),\n (\"NoseHooverChain\", \"getThermostatedPairs\") : (None, ()),\n (\"NoseHooverChain\", \"getThermostatedAtoms\") : (None, ()),\n"}, "test": {"test_patch": "diff --git a/platforms/cuda/tests/TestCudaRGForce.cpp b/platforms/cuda/tests/TestCudaRGForce.cpp\nnew file mode 100644\nindex 0000000000..cb30ae5b87\n--- /dev/null\n+++ b/platforms/cuda/tests/TestCudaRGForce.cpp\n@@ -0,0 +1,36 @@\n+/* -------------------------------------------------------------------------- *\n+ * OpenMM *\n+ * -------------------------------------------------------------------------- *\n+ * This is part of the OpenMM molecular simulation toolkit originating from *\n+ * Simbios, the NIH National Center for Physics-Based Simulation of *\n+ * Biological Structures at Stanford, funded under the NIH Roadmap for *\n+ * Medical Research, grant U54 GM072970. See https://simtk.org. *\n+ * *\n+ * Portions copyright (c) 2025 Stanford University and the Authors. *\n+ * Authors: Peter Eastman *\n+ * Contributors: *\n+ * *\n+ * Permission is hereby granted, free of charge, to any person obtaining a *\n+ * copy of this software and associated documentation files (the \"Software\"), *\n+ * to deal in the Software without restriction, including without limitation *\n+ * the rights to use, copy, modify, merge, publish, distribute, sublicense, *\n+ * and/or sell copies of the Software, and to permit persons to whom the *\n+ * Software is furnished to do so, subject to the following conditions: *\n+ * *\n+ * The above copyright notice and this permission notice shall be included in *\n+ * all copies or substantial portions of the Software. *\n+ * *\n+ * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR *\n+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, *\n+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL *\n+ * THE AUTHORS, CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, *\n+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR *\n+ * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE *\n+ * USE OR OTHER DEALINGS IN THE SOFTWARE. *\n+ * -------------------------------------------------------------------------- */\n+\n+#include \"CudaTests.h\"\n+#include \"TestRGForce.h\"\n+\n+void runPlatformTests() {\n+}\ndiff --git a/platforms/hip/tests/TestHipRGForce.cpp b/platforms/hip/tests/TestHipRGForce.cpp\nnew file mode 100644\nindex 0000000000..5b8caeac28\n--- /dev/null\n+++ b/platforms/hip/tests/TestHipRGForce.cpp\n@@ -0,0 +1,36 @@\n+/* -------------------------------------------------------------------------- *\n+ * OpenMM *\n+ * -------------------------------------------------------------------------- *\n+ * This is part of the OpenMM molecular simulation toolkit originating from *\n+ * Simbios, the NIH National Center for Physics-Based Simulation of *\n+ * Biological Structures at Stanford, funded under the NIH Roadmap for *\n+ * Medical Research, grant U54 GM072970. See https://simtk.org. *\n+ * *\n+ * Portions copyright (c) 2025 Stanford University and the Authors. *\n+ * Authors: Peter Eastman *\n+ * Contributors: *\n+ * *\n+ * Permission is hereby granted, free of charge, to any person obtaining a *\n+ * copy of this software and associated documentation files (the \"Software\"), *\n+ * to deal in the Software without restriction, including without limitation *\n+ * the rights to use, copy, modify, merge, publish, distribute, sublicense, *\n+ * and/or sell copies of the Software, and to permit persons to whom the *\n+ * Software is furnished to do so, subject to the following conditions: *\n+ * *\n+ * The above copyright notice and this permission notice shall be included in *\n+ * all copies or substantial portions of the Software. *\n+ * *\n+ * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR *\n+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, *\n+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL *\n+ * THE AUTHORS, CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, *\n+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR *\n+ * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE *\n+ * USE OR OTHER DEALINGS IN THE SOFTWARE. *\n+ * -------------------------------------------------------------------------- */\n+\n+#include \"HipTests.h\"\n+#include \"TestRGForce.h\"\n+\n+void runPlatformTests() {\n+}\ndiff --git a/platforms/opencl/tests/TestOpenCLRGForce.cpp b/platforms/opencl/tests/TestOpenCLRGForce.cpp\nnew file mode 100644\nindex 0000000000..d47fb0dd65\n--- /dev/null\n+++ b/platforms/opencl/tests/TestOpenCLRGForce.cpp\n@@ -0,0 +1,36 @@\n+/* -------------------------------------------------------------------------- *\n+ * OpenMM *\n+ * -------------------------------------------------------------------------- *\n+ * This is part of the OpenMM molecular simulation toolkit originating from *\n+ * Simbios, the NIH National Center for Physics-Based Simulation of *\n+ * Biological Structures at Stanford, funded under the NIH Roadmap for *\n+ * Medical Research, grant U54 GM072970. See https://simtk.org. *\n+ * *\n+ * Portions copyright (c) 2025 Stanford University and the Authors. *\n+ * Authors: Peter Eastman *\n+ * Contributors: *\n+ * *\n+ * Permission is hereby granted, free of charge, to any person obtaining a *\n+ * copy of this software and associated documentation files (the \"Software\"), *\n+ * to deal in the Software without restriction, including without limitation *\n+ * the rights to use, copy, modify, merge, publish, distribute, sublicense, *\n+ * and/or sell copies of the Software, and to permit persons to whom the *\n+ * Software is furnished to do so, subject to the following conditions: *\n+ * *\n+ * The above copyright notice and this permission notice shall be included in *\n+ * all copies or substantial portions of the Software. *\n+ * *\n+ * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR *\n+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, *\n+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL *\n+ * THE AUTHORS, CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, *\n+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR *\n+ * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE *\n+ * USE OR OTHER DEALINGS IN THE SOFTWARE. *\n+ * -------------------------------------------------------------------------- */\n+\n+#include \"OpenCLTests.h\"\n+#include \"TestRGForce.h\"\n+\n+void runPlatformTests() {\n+}\ndiff --git a/platforms/reference/tests/TestReferenceRGForce.cpp b/platforms/reference/tests/TestReferenceRGForce.cpp\nnew file mode 100644\nindex 0000000000..5bdeb83d9d\n--- /dev/null\n+++ b/platforms/reference/tests/TestReferenceRGForce.cpp\n@@ -0,0 +1,36 @@\n+/* -------------------------------------------------------------------------- *\n+ * OpenMM *\n+ * -------------------------------------------------------------------------- *\n+ * This is part of the OpenMM molecular simulation toolkit originating from *\n+ * Simbios, the NIH National Center for Physics-Based Simulation of *\n+ * Biological Structures at Stanford, funded under the NIH Roadmap for *\n+ * Medical Research, grant U54 GM072970. See https://simtk.org. *\n+ * *\n+ * Portions copyright (c) 2025 Stanford University and the Authors. *\n+ * Authors: Peter Eastman *\n+ * Contributors: *\n+ * *\n+ * Permission is hereby granted, free of charge, to any person obtaining a *\n+ * copy of this software and associated documentation files (the \"Software\"), *\n+ * to deal in the Software without restriction, including without limitation *\n+ * the rights to use, copy, modify, merge, publish, distribute, sublicense, *\n+ * and/or sell copies of the Software, and to permit persons to whom the *\n+ * Software is furnished to do so, subject to the following conditions: *\n+ * *\n+ * The above copyright notice and this permission notice shall be included in *\n+ * all copies or substantial portions of the Software. *\n+ * *\n+ * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR *\n+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, *\n+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL *\n+ * THE AUTHORS, CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, *\n+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR *\n+ * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE *\n+ * USE OR OTHER DEALINGS IN THE SOFTWARE. *\n+ * -------------------------------------------------------------------------- */\n+\n+#include \"ReferenceTests.h\"\n+#include \"TestRGForce.h\"\n+\n+void runPlatformTests() {\n+}\ndiff --git a/serialization/tests/TestSerializeRGForce.cpp b/serialization/tests/TestSerializeRGForce.cpp\nnew file mode 100644\nindex 0000000000..03f463143e\n--- /dev/null\n+++ b/serialization/tests/TestSerializeRGForce.cpp\n@@ -0,0 +1,77 @@\n+/* -------------------------------------------------------------------------- *\n+ * OpenMM *\n+ * -------------------------------------------------------------------------- *\n+ * This is part of the OpenMM molecular simulation toolkit originating from *\n+ * Simbios, the NIH National Center for Physics-Based Simulation of *\n+ * Biological Structures at Stanford, funded under the NIH Roadmap for *\n+ * Medical Research, grant U54 GM072970. See https://simtk.org. *\n+ * *\n+ * Portions copyright (c) 2025 Stanford University and the Authors. *\n+ * Authors: Peter Eastman *\n+ * Contributors: *\n+ * *\n+ * Permission is hereby granted, free of charge, to any person obtaining a *\n+ * copy of this software and associated documentation files (the \"Software\"), *\n+ * to deal in the Software without restriction, including without limitation *\n+ * the rights to use, copy, modify, merge, publish, distribute, sublicense, *\n+ * and/or sell copies of the Software, and to permit persons to whom the *\n+ * Software is furnished to do so, subject to the following conditions: *\n+ * *\n+ * The above copyright notice and this permission notice shall be included in *\n+ * all copies or substantial portions of the Software. *\n+ * *\n+ * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR *\n+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, *\n+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL *\n+ * THE AUTHORS, CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, *\n+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR *\n+ * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE *\n+ * USE OR OTHER DEALINGS IN THE SOFTWARE. *\n+ * -------------------------------------------------------------------------- */\n+\n+#include \"openmm/internal/AssertionUtilities.h\"\n+#include \"openmm/RGForce.h\"\n+#include \"openmm/serialization/XmlSerializer.h\"\n+#include <iostream>\n+#include <sstream>\n+\n+using namespace OpenMM;\n+using namespace std;\n+\n+void testSerialization() {\n+ // Create a Force.\n+\n+ vector<int> particles;\n+ for (int i = 0; i < 5; i++)\n+ particles.push_back(i*i);\n+ RGForce force(particles);\n+ force.setForceGroup(3);\n+ force.setName(\"custom name\");\n+\n+ // Serialize and then deserialize it.\n+\n+ stringstream buffer;\n+ XmlSerializer::serialize<RGForce>(&force, \"Force\", buffer);\n+ RGForce* copy = XmlSerializer::deserialize<RGForce>(buffer);\n+\n+ // Compare the two forces to see if they are identical.\n+\n+ RGForce& force2 = *copy;\n+ ASSERT_EQUAL(force.getForceGroup(), force2.getForceGroup());\n+ ASSERT_EQUAL(force.getName(), force2.getName());\n+ ASSERT_EQUAL(force.getParticles().size(), force2.getParticles().size());\n+ for (int i = 0; i < force.getParticles().size(); i++)\n+ ASSERT_EQUAL(force.getParticles()[i], force2.getParticles()[i]);\n+}\n+\n+int main() {\n+ try {\n+ testSerialization();\n+ }\n+ catch(const exception& e) {\n+ cout << \"exception: \" << e.what() << endl;\n+ return 1;\n+ }\n+ cout << \"Done\" << endl;\n+ return 0;\n+}\ndiff --git a/tests/TestRGForce.h b/tests/TestRGForce.h\nnew file mode 100644\nindex 0000000000..1a1cf59159\n--- /dev/null\n+++ b/tests/TestRGForce.h\n@@ -0,0 +1,161 @@\n+/* -------------------------------------------------------------------------- *\n+ * OpenMM *\n+ * -------------------------------------------------------------------------- *\n+ * This is part of the OpenMM molecular simulation toolkit originating from *\n+ * Simbios, the NIH National Center for Physics-Based Simulation of *\n+ * Biological Structures at Stanford, funded under the NIH Roadmap for *\n+ * Medical Research, grant U54 GM072970. See https://simtk.org. *\n+ * *\n+ * Portions copyright (c) 2025 Stanford University and the Authors. *\n+ * Authors: Peter Eastman *\n+ * Contributors: *\n+ * *\n+ * Permission is hereby granted, free of charge, to any person obtaining a *\n+ * copy of this software and associated documentation files (the \"Software\"), *\n+ * to deal in the Software without restriction, including without limitation *\n+ * the rights to use, copy, modify, merge, publish, distribute, sublicense, *\n+ * and/or sell copies of the Software, and to permit persons to whom the *\n+ * Software is furnished to do so, subject to the following conditions: *\n+ * *\n+ * The above copyright notice and this permission notice shall be included in *\n+ * all copies or substantial portions of the Software. *\n+ * *\n+ * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR *\n+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, *\n+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL *\n+ * THE AUTHORS, CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, *\n+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR *\n+ * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE *\n+ * USE OR OTHER DEALINGS IN THE SOFTWARE. *\n+ * -------------------------------------------------------------------------- */\n+\n+#include \"openmm/internal/AssertionUtilities.h\"\n+#include \"openmm/RGForce.h\"\n+#include \"openmm/Context.h\"\n+#include \"openmm/NonbondedForce.h\"\n+#include \"openmm/System.h\"\n+#include \"openmm/VerletIntegrator.h\"\n+#include \"sfmt/SFMT.h\"\n+#include <cmath>\n+#include <iostream>\n+#include <vector>\n+\n+using namespace OpenMM;\n+using namespace std;\n+\n+void testRG(bool allParticles) {\n+ const int numParticles = 30;\n+ System system;\n+ vector<Vec3> positions(numParticles);\n+ vector<int> particles;\n+ OpenMM_SFMT::SFMT sfmt;\n+ init_gen_rand(0, sfmt);\n+ for (int i = 0; i < numParticles; ++i) {\n+ system.addParticle(1.0);\n+ if (genrand_real2(sfmt) < 0.5 || allParticles)\n+ particles.push_back(i);\n+ }\n+ if (allParticles)\n+ system.addForce(new RGForce()); // Omitting the list of particles should mean all particles.\n+ else\n+ system.addForce(new RGForce(particles));\n+ VerletIntegrator integrator(0.001);\n+ Context context(system, integrator, platform);\n+ for (int i = 0; i < 10; i++) {\n+ // Set all particles to random positions.\n+\n+ for (int j = 0; j < numParticles; j++)\n+ positions[j] = Vec3(genrand_real2(sfmt), genrand_real2(sfmt), genrand_real2(sfmt))*5;\n+ context.setPositions(positions);\n+\n+ // Compute Rg.\n+\n+ Vec3 center;\n+ for (int j : particles)\n+ center += positions[j];\n+ center /= particles.size();\n+ double sum = 0;\n+ for (int j : particles) {\n+ Vec3 v = positions[j]-center;\n+ sum += v.dot(v);\n+ }\n+ double rg = sqrt(sum/particles.size());\n+\n+ // Compare to the value computed by the force.\n+\n+ State state = context.getState(State::Energy | State::Forces);\n+ ASSERT_EQUAL_TOL(rg, state.getPotentialEnergy(), 1e-6);\n+\n+ // Take a small step in the direction of the energy gradient and see whether the potential energy changes by the expected amount.\n+\n+ const vector<Vec3>& forces = state.getForces();\n+ double norm = 0.0;\n+ for (int j = 0; j < (int) forces.size(); ++j)\n+ norm += forces[j].dot(forces[j]);\n+ norm = sqrt(norm);\n+ const double stepSize = 0.1;\n+ double step = 0.5*stepSize/norm;\n+ vector<Vec3> positions2(numParticles), positions3(numParticles);\n+ for (int j = 0; j < positions.size(); ++j) {\n+ Vec3 p = positions[j];\n+ Vec3 f = forces[j];\n+ positions2[j] = Vec3(p[0]-f[0]*step, p[1]-f[1]*step, p[2]-f[2]*step);\n+ positions3[j] = Vec3(p[0]+f[0]*step, p[1]+f[1]*step, p[2]+f[2]*step);\n+ }\n+ context.setPositions(positions2);\n+ State state2 = context.getState(State::Energy);\n+ context.setPositions(positions3);\n+ State state3 = context.getState(State::Energy);\n+ ASSERT_EQUAL_TOL(norm, (state2.getPotentialEnergy()-state3.getPotentialEnergy())/stepSize, 1e-4);\n+ }\n+}\n+\n+void testEnergyConservation() {\n+ const int numParticles = 50;\n+ System system;\n+ vector<Vec3> positions(numParticles);\n+ vector<int> particles;\n+ OpenMM_SFMT::SFMT sfmt;\n+ init_gen_rand(0, sfmt);\n+ NonbondedForce* nb = new NonbondedForce(); // Add a nonbonded force to activate reordering on the GPU\n+ nb->setNonbondedMethod(NonbondedForce::CutoffNonPeriodic);\n+ system.addForce(nb);\n+ for (int i = 0; i < numParticles; ++i) {\n+ system.addParticle(2.0);\n+ nb->addParticle(0.0, 0.1, 0.01);\n+ positions[i] = Vec3(genrand_real2(sfmt), genrand_real2(sfmt), genrand_real2(sfmt))*5;\n+ if (genrand_real2(sfmt) < 0.5)\n+ particles.push_back(i);\n+ }\n+ system.addForce(new RGForce(particles));\n+ VerletIntegrator integrator(0.001);\n+ Context context(system, integrator, platform);\n+ context.setPositions(positions);\n+ context.setVelocitiesToTemperature(300.0, 0);\n+ integrator.step(5);\n+ State initialState = context.getState(State::Energy);\n+ double energy = initialState.getPotentialEnergy()+initialState.getKineticEnergy();\n+ for (int i = 0; i < 100; i++) {\n+ integrator.step(5);\n+ State state = context.getState(State::Energy);\n+ ASSERT_EQUAL_TOL(energy, state.getPotentialEnergy()+state.getKineticEnergy(), 1e-4);\n+ }\n+}\n+\n+void runPlatformTests();\n+\n+int main(int argc, char* argv[]) {\n+ try {\n+ initializeTests(argc, argv);\n+ testRG(true);\n+ testRG(false);\n+ testEnergyConservation();\n+ runPlatformTests();\n+ }\n+ catch(const exception& e) {\n+ cout << \"exception: \" << e.what() << endl;\n+ return 1;\n+ }\n+ cout << \"Done\" << endl;\n+ return 0;\n+}\n", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}109{"question_id": "MSB_openmm_openmm_pr5044", "question_type": "multi_swe_bench", "description": "Don't allow LJPME when LJ interactions use `CustomNonbondedForce` (openmm/openmm#5044)", "content": {"org": "openmm", "repo": "openmm", "pr_number": 5044, "issue_title": "Don't allow LJPME when LJ interactions use `CustomNonbondedForce`", "issue_body": "Updates Amber, CHARMM, Desmond, `ForceField`, and GROMACS loaders to raise `ValueError` if LJPME is requested on a system that requires `CustomNonbondedForce` to implement its Lennard-Jones interactions. See https://github.com/openmm/openmm/discussions/5039#discussioncomment-14077098. This is usually because of NBFIX, but it can also be due to non-standard mixing rules in Desmond and GROMACS.", "base_commit": "3645e1eeb7cea37bc7af1291e0fd672a85d49db9", "resolved_issues": [{"number": null, "title": "Don't allow LJPME when LJ interactions use `CustomNonbondedForce`", "body": "### Issue Description\n\n**Problem:**\nWhen using Lennard-Jones Particle Mesh Ewald (LJPME) as the nonbonded method in systems that require `CustomNonbondedForce` to handle Lennard-Jones interactions, the current implementation does not properly handle cases involving non-standard mixing rules or NBFIX terms. This can lead to incorrect behavior or unsupported configurations without clear feedback to the user.\n\n**Expected Behavior:**\nThe system should detect when LJPME is requested in scenarios where it is incompatible, such as when non-standard mixing rules or NBFIX terms are present. In such cases, the system should raise a clear and descriptive error, informing the user that LJPME is not supported in these configurations. This ensures that users are aware of the limitation and can adjust their setup accordingly.\n\n## IMPORTANT INSTRUCTIONS\n\n1. If you edit a python file, you MUST run 'make PythonInstall' inside the build directory\n2. If you edit a c++ file, you MUST run 'make -j4 && make install\" inside the build directory"}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/openmm_m_openmm:pr-5044", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/wrappers/python/openmm/app/charmmpsffile.py b/wrappers/python/openmm/app/charmmpsffile.py\nindex 46f9a176ac..126a2467e3 100644\n--- a/wrappers/python/openmm/app/charmmpsffile.py\n+++ b/wrappers/python/openmm/app/charmmpsffile.py\n@@ -1217,6 +1217,8 @@ def _is_bond_in_water(bond):\n force.addParticle(atm.charge, sigma_scale*atm.type.rmin*length_conv,\n abs(atm.type.epsilon*ene_conv))\n else:\n+ if nonbondedMethod is ff.LJPME:\n+ raise ValueError('LJPME is not supported when NBFIX terms are present')\n for atm in self.atom_list:\n force.addParticle(atm.charge, 1.0, 0.0)\n # Now add the custom nonbonded force that implements NBFIX. First\ndiff --git a/wrappers/python/openmm/app/desmonddmsfile.py b/wrappers/python/openmm/app/desmonddmsfile.py\nindex c85d026655..33dab4b97d 100644\n--- a/wrappers/python/openmm/app/desmonddmsfile.py\n+++ b/wrappers/python/openmm/app/desmonddmsfile.py\n@@ -368,12 +368,14 @@ def createSystem(self, nonbondedMethod=ff.NoCutoff, nonbondedCutoff=1.0*nanomete\n nb.setEwaldErrorTolerance(ewaldErrorTolerance)\n if cnb is not None:\n nb.setUseDispersionCorrection(False)\n- if nonbondedMethod in (ff.CutoffPeriodic, ff.Ewald, ff.PME, ff.LJPME):\n+ if nonbondedMethod in (ff.CutoffPeriodic, ff.Ewald, ff.PME):\n cnb.setNonbondedMethod(methodMap[ff.CutoffPeriodic])\n cnb.setCutoffDistance(nonbondedCutoff)\n elif nonbondedMethod == ff.CutoffNonPeriodic:\n cnb.setNonbondedMethod(methodMap[ff.CutoffNonPeriodic])\n cnb.setCutoffDistance(nonbondedCutoff)\n+ elif nonbondedMethod is ff.LJPME:\n+ raise ValueError('LJPME is not supported with OPLS combining rules')\n else:\n cnb.setNonbondedMethod(methodMap[ff.NoCutoff])\n cnb.setUseSwitchingFunction(False)\ndiff --git a/wrappers/python/openmm/app/forcefield.py b/wrappers/python/openmm/app/forcefield.py\nindex 5f8fa8c44c..9d7131a89c 100644\n--- a/wrappers/python/openmm/app/forcefield.py\n+++ b/wrappers/python/openmm/app/forcefield.py\n@@ -2836,12 +2836,14 @@ def createForce(self, sys, data, nonbondedMethod, nonbondedCutoff, args):\n self.force.addTabulatedFunction('bcoef', mm.Discrete2DFunction(numLjTypes, numLjTypes, bcoef))\n self.force.addPerParticleParameter('type')\n self.force.setName('LennardJones')\n- if nonbondedMethod in [CutoffPeriodic, Ewald, PME, LJPME]:\n+ if nonbondedMethod in [CutoffPeriodic, Ewald, PME]:\n self.force.setNonbondedMethod(mm.CustomNonbondedForce.CutoffPeriodic)\n elif nonbondedMethod is NoCutoff:\n self.force.setNonbondedMethod(mm.CustomNonbondedForce.NoCutoff)\n elif nonbondedMethod is CutoffNonPeriodic:\n self.force.setNonbondedMethod(mm.CustomNonbondedForce.CutoffNonPeriodic)\n+ elif nonbondedMethod is LJPME:\n+ raise ValueError('LJPME is not supported by LennardJonesForce')\n else:\n raise AssertionError('Unrecognized nonbonded method [%s]' % nonbondedMethod)\n if args['switchDistance'] is not None:\ndiff --git a/wrappers/python/openmm/app/gromacstopfile.py b/wrappers/python/openmm/app/gromacstopfile.py\nindex 343c8ff9f2..dec167c0a7 100644\n--- a/wrappers/python/openmm/app/gromacstopfile.py\n+++ b/wrappers/python/openmm/app/gromacstopfile.py\n@@ -1239,6 +1239,8 @@ def convertParams(params):\n nb.setUseSwitchingFunction(True)\n nb.setSwitchingDistance(switchDistance)\n \n+ if not (lj is None and ljnbfix is None) and nonbondedMethod is ff.LJPME:\n+ raise ValueError('LJPME is not supported with active nonbond_params or combining rules other than 2')\n if lj is not None:\n methodMap = {ff.NoCutoff:mm.CustomNonbondedForce.NoCutoff,\n ff.CutoffNonPeriodic:mm.CustomNonbondedForce.CutoffNonPeriodic,\ndiff --git a/wrappers/python/openmm/app/internal/amber_file_parser.py b/wrappers/python/openmm/app/internal/amber_file_parser.py\nindex 55cbb83b26..1425de068d 100644\n--- a/wrappers/python/openmm/app/internal/amber_file_parser.py\n+++ b/wrappers/python/openmm/app/internal/amber_file_parser.py\n@@ -1037,6 +1037,8 @@ def readAmberSystem(topology, prmtop_filename=None, prmtop_loader=None, shake=No\n \n # Copy the exceptions as exclusions to the CustomNonbondedForce if we have\n # NBFIX terms\n+ if nbfix and nonbondedMethod == 'LJPME':\n+ raise ValueError('LJPME is not supported with modified off-diagonal Lennard-Jones coefficients')\n if nbfix or has_1264:\n for i in range(force.getNumExceptions()):\n ii, jj, chg, sig, eps = force.getExceptionParameters(i)\n"}, "test": {"test_patch": "diff --git a/wrappers/python/tests/TestAmberPrmtopFile.py b/wrappers/python/tests/TestAmberPrmtopFile.py\nindex 5f8678542d..74c87edb50 100644\n--- a/wrappers/python/tests/TestAmberPrmtopFile.py\n+++ b/wrappers/python/tests/TestAmberPrmtopFile.py\n@@ -39,6 +39,12 @@ def test_NonbondedMethod(self):\n f.getNonbondedMethod()==methodMap[method]\n for f in forces))\n \n+ def test_LJPME_NBFIX(self):\n+ \"\"\"Test LJPME with NBFIX.\"\"\"\n+\n+ with self.assertRaisesRegex(ValueError, 'LJPME is not supported'):\n+ prmtop3.createSystem(nonbondedMethod=LJPME)\n+\n def test_Cutoff(self):\n \"\"\"Test to make sure the nonbondedCutoff parameter is passed correctly.\"\"\"\n \ndiff --git a/wrappers/python/tests/TestCharmmFiles.py b/wrappers/python/tests/TestCharmmFiles.py\nindex 7ac43e13a4..23f9ae9935 100644\n--- a/wrappers/python/tests/TestCharmmFiles.py\n+++ b/wrappers/python/tests/TestCharmmFiles.py\n@@ -287,6 +287,8 @@ def testSystemOptions(self):\n # Check some illegal options\n self.assertRaises(ValueError, lambda:\n psf.createSystem(params, nonbondedMethod=5))\n+ self.assertRaisesRegex(ValueError, 'LJPME is not supported', lambda:\n+ psf.createSystem(params, nonbondedMethod=LJPME))\n self.assertRaises(TypeError, lambda:\n psf.createSystem(params, nonbondedMethod=PME,\n nonbondedCutoff=1*radian)\n@@ -302,6 +304,9 @@ def testSystemOptions(self):\n psf.createSystem(params, nonbondedMethod=PME, switchDistance=0.8,\n nonbondedCutoff=1.2*nanometer)\n \n+ psf_no_nbfix = CharmmPsfFile('systems/ala_ala_ala.psf', unitCellDimensions=Vec3(30, 30, 30)*angstroms)\n+ psf_no_nbfix.createSystem(self.params, nonbondedMethod=LJPME)\n+\n def test_ImplicitSolventForces(self):\n \"\"\"Compute forces for different implicit solvent types, and compare them to ones generated with a previous version of OpenMM to ensure they haven't changed.\"\"\"\n solventType = [HCT, OBC1, OBC2, GBn, GBn2]\ndiff --git a/wrappers/python/tests/TestDesmondDMSFile.py b/wrappers/python/tests/TestDesmondDMSFile.py\nindex fbe7c0bb6c..9e4b6711cd 100644\n--- a/wrappers/python/tests/TestDesmondDMSFile.py\n+++ b/wrappers/python/tests/TestDesmondDMSFile.py\n@@ -37,7 +37,19 @@ def test_NonbondedMethod(self):\n self.assertTrue(any(isinstance(f, NonbondedForce) and \n f.getNonbondedMethod()==methodMap[method] \n for f in forces))\n- \n+\n+ def test_LJPME_OPLS(self):\n+ \"\"\"Test LJPME with and without OPLS mixing rules.\"\"\"\n+\n+ system = self.dms_opls1.createSystem(nonbondedMethod=LJPME, OPLS=False)\n+ forces = system.getForces()\n+ self.assertTrue(any(isinstance(f, NonbondedForce) and\n+ f.getNonbondedMethod()==NonbondedForce.LJPME\n+ for f in forces))\n+\n+ with self.assertRaisesRegex(ValueError, 'LJPME is not supported'):\n+ self.dms_opls1.createSystem(nonbondedMethod=LJPME, OPLS=True)\n+\n def test_Cutoff(self):\n \"\"\"Test to make sure the nonbondedCutoff parameter is passed correctly.\"\"\"\n \ndiff --git a/wrappers/python/tests/TestForceField.py b/wrappers/python/tests/TestForceField.py\nindex 9147635d66..13c5a4b86a 100644\n--- a/wrappers/python/tests/TestForceField.py\n+++ b/wrappers/python/tests/TestForceField.py\n@@ -1314,6 +1314,10 @@ def test_LennardJonesGenerator(self):\n ene2 = state2.getPotentialEnergy().value_in_unit(kilocalories_per_mole)\n self.assertAlmostEqual(ene, ene2)\n \n+ # LJPME should be forbidden with LennardJonesForce since it makes a CustomNonbondedForce to handle NBFix\n+ with self.assertRaisesRegex(ValueError, 'LJPME is not supported'):\n+ ff.createSystem(pdb.topology, nonbondedMethod=LJPME)\n+\n def test_NBFix(self):\n \"\"\"Test using LennardJonesGenerator to implement NBFix terms.\"\"\"\n # Create a chain of seven atoms.\ndiff --git a/wrappers/python/tests/TestGromacsTopFile.py b/wrappers/python/tests/TestGromacsTopFile.py\nindex b8b9c3c30f..c27cebf2e6 100644\n--- a/wrappers/python/tests/TestGromacsTopFile.py\n+++ b/wrappers/python/tests/TestGromacsTopFile.py\n@@ -36,6 +36,36 @@ def test_NonbondedMethod(self):\n f.getNonbondedMethod()==methodMap[method]\n for f in forces))\n \n+ def test_LJPME_mixing(self):\n+ \"\"\"Test that LJPME is not allowed with non-standard LJ mixing or NBFIX.\"\"\"\n+\n+ tests = {\n+ 'apgr.nbfix.pairs.comb1.top': False,\n+ 'apgr.nbfix.pairs.comb2.top': False,\n+ 'apgr.nbfix.pairs.comb3.top': False,\n+ 'apgr.nbfix.nopairs.comb1.top': False,\n+ 'apgr.nbfix.nopairs.comb2.top': False,\n+ 'apgr.nbfix.nopairs.comb3.top': False,\n+ 'apgr.nonbfix.pairs.comb1.top': False,\n+ 'apgr.nonbfix.pairs.comb2.top': True,\n+ 'apgr.nonbfix.pairs.comb3.top': False,\n+ 'apgr.nonbfix.nopairs.comb1.top': False,\n+ 'apgr.nonbfix.nopairs.comb2.top': True,\n+ 'apgr.nonbfix.nopairs.comb3.top': False,\n+ }\n+\n+ for topfile, ljpme_allowed in tests.items():\n+ top = GromacsTopFile(f'systems/{topfile}', unitCellDimensions=Vec3(30, 30, 30)*angstroms)\n+ if ljpme_allowed:\n+ system = top.createSystem(nonbondedMethod=LJPME)\n+ forces = system.getForces()\n+ self.assertTrue(any(isinstance(f, NonbondedForce) and\n+ f.getNonbondedMethod()==NonbondedForce.LJPME\n+ for f in forces))\n+ else:\n+ with self.assertRaisesRegex(ValueError, 'LJPME is not supported'):\n+ top.createSystem(nonbondedMethod=LJPME)\n+\n def test_ff99SBILDN(self):\n \"\"\" Test Gromacs topology #define replacement as used in ff99SB-ILDN \"\"\"\n top = GromacsTopFile('systems/aidilnaaaaa.top')\n", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}110{"question_id": "MSB_openmm_openmm_pr5065", "question_type": "multi_swe_bench", "description": "Fix error message formatting for bonds to elements without atoms (openmm/openmm#5065)", "content": {"org": "openmm", "repo": "openmm", "pr_number": 5065, "issue_title": "Fix error message formatting for bonds to elements without atoms", "issue_body": "Fixes a minor bug in #5020 in which error messages for incorrect bonds to elements without atoms don't get formatted and an unrelated error gets shown instead. Normally, there shouldn't be bonds to extra sites that would trigger this, but it can happen if one attempts to parameterize a topology with explicitly specified bonds to atoms for which OpenMM couldn't guess the elements.", "base_commit": "d8798cb3db9c57d23506204afa99a3a5d3b41f49", "resolved_issues": [{"number": null, "title": "Fix error message formatting for bonds to elements without atoms", "body": "### Issue Description\n\n**Problem:** \nWhen attempting to parameterize a molecular topology that includes explicitly specified bonds to atoms with undefined or unrecognized elements, the software fails to generate a meaningful error message. Instead, an unrelated error message is displayed, which does not accurately describe the issue. This can lead to confusion for users trying to debug their input files, as the actual cause of the error is obscured.\n\n**Expected Behavior:** \nWhen bonds to atoms with undefined or unrecognized elements are encountered during topology parameterization, the software should provide a clear and accurate error message. The message should explicitly indicate the issue, such as the presence of bonds to extra sites or elements without atoms, allowing users to identify and resolve the problem in their input files.\n\n## IMPORTANT INSTRUCTIONS\n\n1. If you edit a python file, you MUST run 'make PythonInstall' inside the build directory\n2. If you edit a c++ file, you MUST run 'make -j4 && make install\" inside the build directory"}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/openmm_m_openmm:pr-5065", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/wrappers/python/openmm/app/forcefield.py b/wrappers/python/openmm/app/forcefield.py\nindex 9d7131a89c..9d178e01c4 100644\n--- a/wrappers/python/openmm/app/forcefield.py\n+++ b/wrappers/python/openmm/app/forcefield.py\n@@ -1888,8 +1888,8 @@ def formatAtomDiff(key, diff):\n \n def formatBondDiff(key, diff):\n \"\"\"Formats a string describing elements associated with a different number of bonds.\"\"\"\n- name1 = elem.Element.getByAtomicNumber(key[0]).symbol if key else 'extra site'\n- name2 = elem.Element.getByAtomicNumber(key[1]).symbol if key else 'extra site'\n+ name1 = elem.Element.getByAtomicNumber(key[0]).symbol if key[0] else 'extra site'\n+ name2 = elem.Element.getByAtomicNumber(key[1]).symbol if key[1] else 'extra site'\n return f'{name1}-{name2} bond' + ('' if diff == 1 else 's')\n \n def pickBestMatch(bestMatches):\n"}, "test": {"test_patch": "diff --git a/wrappers/python/tests/TestForceField.py b/wrappers/python/tests/TestForceField.py\nindex 13c5a4b86a..c0f0d34c2b 100644\n--- a/wrappers/python/tests/TestForceField.py\n+++ b/wrappers/python/tests/TestForceField.py\n@@ -987,6 +987,18 @@ def makeSystem(lines):\n with self.assertRaisesRegex(ValueError, 'No template found for residue.*HOH.*The force field contains no residue templates'):\n makeSystem(pdbLines)\n \n+ # Make water with an extra site and an (invalid) bond to it.\n+ pdbLines = [\n+ 'ATOM 0 O HOH A 1 0 0 0 O',\n+ 'ATOM 1 H1 HOH A 1 0 0 0 H',\n+ 'ATOM 2 H2 HOH A 1 0 0 0 H',\n+ 'ATOM 3 M HOH A 1 0 0 0 EP',\n+ 'CONECT 0 3'\n+ ]\n+ forcefield = ForceField('opc.xml')\n+ with self.assertRaisesRegex(ValueError, 'No template found for residue.*HOH.*The set of atoms matches HOH, but the residue has 1 extra site-O bond too many'):\n+ makeSystem(pdbLines)\n+\n def test_Wildcard(self):\n \"\"\"Test that PeriodicTorsionForces using wildcard ('') for atom types / classes in the ffxml are correctly registered\"\"\"\n \n", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}111{"question_id": "MSB_openmm_openmm_pr5066", "question_type": "multi_swe_bench", "description": "Add Lipid21 (openmm/openmm#5066)", "content": {"org": "openmm", "repo": "openmm", "pr_number": 5066, "issue_title": "Add Lipid21", "issue_body": "Adds Lipid21 from https://github.com/openmm/openmmforcefields/pull/390. (Presumably we shouldn't merge this PR before that one.) In addition to adding Amber19 to the Modeller test, I've also manually checked that the updated `amber19-all.xml` can be used to add membranes of all Modeller-supported types, and to set up a stable membrane protein simulation.", "base_commit": "d8798cb3db9c57d23506204afa99a3a5d3b41f49", "resolved_issues": [{"number": null, "title": "Add Lipid21", "body": "The Lipid21 force field is missing from the Amber19 parameter set in OpenMM, limiting the ability to simulate lipid membranes and membrane protein systems using the Amber19 force field. Users currently need to rely on AmberTools for system preparation, which adds complexity and requires external tools.\n\nExpected behavior: The Lipid21 force field should be fully integrated into the Amber19 parameter set in OpenMM, allowing users to directly simulate lipid membranes and membrane protein systems without needing external tools for system preparation. This integration should support all membrane types compatible with the Modeller class and enable stable simulations of membrane protein systems.\n\n## IMPORTANT INSTRUCTIONS\n\n1. If you edit a python file, you MUST run 'make PythonInstall' inside the build directory\n2. If you edit a c++ file, you MUST run 'make -j4 && make install\" inside the build directory"}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/openmm_m_openmm:pr-5066", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/docs-source/usersguide/application/02_running_sims.rst b/docs-source/usersguide/application/02_running_sims.rst\nindex 1485c9f8a8..d5cbdb57ba 100644\n--- a/docs-source/usersguide/application/02_running_sims.rst\n+++ b/docs-source/usersguide/application/02_running_sims.rst\n@@ -487,6 +487,7 @@ File Parameters\n :file:`amber19/protein.ff19ipq.xml` Protein (alternative)\n :file:`amber19/DNA.OL21.xml` DNA\\ :cite:`Zgarbova2021`\n :file:`amber14/RNA.OL3.xml` RNA\n+:file:`amber19/lipid21.xml` Lipid\n :file:`amber14/GLYCAM_06j-1.xml` Carbohydrates and glycosylated proteins\\ :cite:`Kirschner2007`\n :file:`amber19/tip3p.xml` TIP3P water model\\ :cite:`Jorgensen1983` and ions\n :file:`amber19/tip3pfb.xml` TIP3P-FB water model\\ :cite:`Wang2014` and ions\n@@ -498,8 +499,8 @@ File Parameters\n =================================== ===========================================\n \n As a convenience, the file :file:`amber19-all.xml` can be used as a shortcut to\n-include :file:`amber19/protein.ff19SB.xml`, :file:`amber19/DNA.OL21.xml`, and\n-:file:`amber14/RNA.OL3.xml`. In most cases, you can simply include that file,\n+include :file:`amber19/protein.ff19SB.xml`, :file:`amber19/DNA.OL21.xml`,\n+:file:`amber14/RNA.OL3.xml`, and :file:`amber19/lipid21.xml`. In most cases, you can simply include that file,\n plus one of the water models, such as :file:`amber19/tip3pfb.xml` for the\n TIP3P-FB water model and ions\\ :cite:`Wang2014`:\n ::\n@@ -530,15 +531,6 @@ to them.\n you run the risk of having :class:`ForceField` throw an exception since\n :file:`tip3p.xml` will be missing parameters for ions in your system.\n \n-.. warning::\n- The updated Lipid21 lipid force field is not yet supported in this port of\n- Amber19, as it makes use of Amber features not yet supported in\n- `ParmEd <https://github.com/parmed/parmed>`_. Amber19 should be preferred\n- over Amber14 for simulations not requiring a lipid force field, but Amber14\n- should be used if the Lipid17 force field is desired. Alternatively, to use\n- Amber19 with Lipid21, you can prepare your system with AmberTools_ before\n- loading it into OpenMM, as described in Section :numref:`using_amber_files`.\n-\n The converted parameter sets come from the `AmberTools 24 release <http://ambermd.org/AmberTools.php>`_\n and were converted using the openmmforcefields_ package and `ParmEd <https://github.com/parmed/parmed>`_.\n \ndiff --git a/wrappers/python/openmm/app/data/amber19-all.xml b/wrappers/python/openmm/app/data/amber19-all.xml\nindex 6509f82400..87cb5d305f 100644\n--- a/wrappers/python/openmm/app/data/amber19-all.xml\n+++ b/wrappers/python/openmm/app/data/amber19-all.xml\n@@ -2,4 +2,5 @@\n <Include file=\"amber19/protein.ff19SB.xml\"/>\n <Include file=\"amber19/DNA.OL21.xml\"/>\n <Include file=\"amber14/RNA.OL3.xml\"/>\n+ <Include file=\"amber19/lipid21.xml\"/>\n </ForceField>\ndiff --git a/wrappers/python/openmm/app/data/amber19/lipid21.xml b/wrappers/python/openmm/app/data/amber19/lipid21.xml\nnew file mode 100644\nindex 0000000000..eaaa768255\n--- /dev/null\n+++ b/wrappers/python/openmm/app/data/amber19/lipid21.xml\n@@ -0,0 +1,10312 @@\n+<ForceField>\n+ <Info>\n+ <DateGenerated>2025-07-15</DateGenerated>\n+ <Source Source=\"leaprc.lipid21\" md5hash=\"e1c09d4e068913ba25e685b6887f50e3\" sourcePackage=\"AmberTools\" sourcePackageVersion=\"24.8\">leaprc.lipid21</Source>\n+ <Reference>Dickson, C.J.; Walker, R.C.; Gould, I.R. Lipid21: Complex Lipid Membrane Simulations with AMBER. J. Chem. Theory Comput., 2022, 18, 1726-1736.</Reference>\n+ </Info>\n+ <AtomTypes>\n+ <Type element=\"C\" name=\"cA\" class=\"cA\" mass=\"12.01\" />\n+ <Type element=\"C\" name=\"cB\" class=\"cB\" mass=\"12.01\" />\n+ <Type element=\"C\" name=\"cC\" class=\"cC\" mass=\"12.01\" />\n+ <Type element=\"C\" name=\"cD\" class=\"cD\" mass=\"12.01\" />\n+ <Type element=\"H\" name=\"hA\" class=\"hA\" mass=\"1.008\" />\n+ <Type element=\"H\" name=\"hB\" class=\"hB\" mass=\"1.008\" />\n+ <Type element=\"H\" name=\"hE\" class=\"hE\" mass=\"1.008\" />\n+ <Type element=\"H\" name=\"hL\" class=\"hL\" mass=\"1.008\" />\n+ <Type element=\"H\" name=\"hN\" class=\"hN\" mass=\"1.008\" />\n+ <Type element=\"H\" name=\"hO\" class=\"hO\" mass=\"1.008\" />\n+ <Type element=\"H\" name=\"hX\" class=\"hX\" mass=\"1.008\" />\n+ <Type element=\"N\" name=\"nA\" class=\"nA\" mass=\"14.01\" />\n+ <Type element=\"N\" name=\"nN\" class=\"nN\" mass=\"14.01\" />\n+ <Type element=\"O\" name=\"oC\" class=\"oC\" mass=\"16.0\" />\n+ <Type element=\"O\" name=\"oH\" class=\"oH\" mass=\"16.0\" />\n+ <Type element=\"O\" name=\"oO\" class=\"oO\" mass=\"16.0\" />\n+ <Type element=\"O\" name=\"oP\" class=\"oP\" mass=\"16.0\" />\n+ <Type element=\"O\" name=\"oS\" class=\"oS\" mass=\"16.0\" />\n+ <Type element=\"O\" name=\"oT\" class=\"oT\" mass=\"16.0\" />\n+ <Type element=\"P\" name=\"pA\" class=\"pA\" mass=\"30.97\" />\n+ </AtomTypes>\n+ <Residues>\n+ <Residue name=\"DLPC\">\n+ <Atom charge=\"0.245262\" name=\"N\" type=\"nA\" />\n+ <Atom charge=\"-0.338973\" name=\"C13\" type=\"cA\" />\n+ <Atom charge=\"0.17223\" name=\"H13A\" type=\"hX\" />\n+ <Atom charge=\"0.17223\" name=\"H13B\" type=\"hX\" />\n+ <Atom charge=\"0.17223\" name=\"H13C\" type=\"hX\" />\n+ <Atom charge=\"-0.338973\" name=\"C14\" type=\"cA\" />\n+ <Atom charge=\"0.17223\" name=\"H14A\" type=\"hX\" />\n+ <Atom charge=\"0.17223\" name=\"H14B\" type=\"hX\" />\n+ <Atom charge=\"0.17223\" name=\"H14C\" type=\"hX\" />\n+ <Atom charge=\"-0.338973\" name=\"C15\" type=\"cA\" />\n+ <Atom charge=\"0.17223\" name=\"H15A\" type=\"hX\" />\n+ <Atom charge=\"0.17223\" name=\"H15B\" type=\"hX\" />\n+ <Atom charge=\"0.17223\" name=\"H15C\" type=\"hX\" />\n+ <Atom charge=\"-0.170824\" name=\"C12\" type=\"cA\" />\n+ <Atom charge=\"0.136415\" name=\"H12A\" type=\"hX\" />\n+ <Atom charge=\"0.136415\" name=\"H12B\" type=\"hX\" />\n+ <Atom charge=\"0.166801\" name=\"C11\" type=\"cA\" />\n+ <Atom charge=\"0.078534\" name=\"H11A\" type=\"hE\" />\n+ <Atom charge=\"0.078534\" name=\"H11B\" type=\"hE\" />\n+ <Atom charge=\"1.339721\" name=\"P\" type=\"pA\" />\n+ <Atom charge=\"-0.875812\" name=\"O13\" type=\"oP\" />\n+ <Atom charge=\"-0.875812\" name=\"O14\" type=\"oP\" />\n+ <Atom charge=\"-0.50948\" name=\"O11\" type=\"oT\" />\n+ <Atom charge=\"-0.508176\" name=\"O12\" type=\"oT\" />\n+ <Atom charge=\"0.017459\" name=\"C1\" type=\"cA\" />\n+ <Atom charge=\"0.095591\" name=\"HA\" type=\"hE\" />\n+ <Atom charge=\"0.095591\" name=\"HB\" type=\"hE\" />\n+ <Atom charge=\"0.281242\" name=\"C2\" type=\"cA\" />\n+ <Atom charge=\"0.063253\" name=\"HS\" type=\"hE\" />\n+ <Atom charge=\"-0.552948\" name=\"O21\" type=\"oS\" />\n+ <Atom charge=\"0.897613\" name=\"C21\" type=\"cC\" />\n+ <Atom charge=\"-0.673755\" name=\"O22\" type=\"oC\" />\n+ <Atom charge=\"-0.172159\" name=\"C22\" type=\"cD\" />\n+ <Atom charge=\"0.054419\" name=\"H2R\" type=\"hL\" />\n+ <Atom charge=\"0.054419\" name=\"H2S\" type=\"hL\" />\n+ <Atom charge=\"0.196939\" name=\"C3\" type=\"cA\" />\n+ <Atom charge=\"0.070469\" name=\"HX\" type=\"hE\" />\n+ <Atom charge=\"0.070469\" name=\"HY\" type=\"hE\" />\n+ <Atom charge=\"-0.575489\" name=\"O31\" type=\"oS\" />\n+ <Atom charge=\"0.910403\" name=\"C31\" type=\"cC\" />\n+ <Atom charge=\"-0.671566\" name=\"O32\" type=\"oC\" />\n+ <Atom charge=\"-0.172159\" name=\"C32\" type=\"cD\" />\n+ <Atom charge=\"0.054419\" name=\"H2X\" type=\"hL\" />\n+ <Atom charge=\"0.054419\" name=\"H2Y\" type=\"hL\" />\n+ <Atom charge=\"0.00151\" name=\"C23\" type=\"cD\" />\n+ <Atom charge=\"0.019108\" name=\"H3R\" type=\"hL\" />\n+ <Atom charge=\"0.019108\" name=\"H3S\" type=\"hL\" />\n+ <Atom charge=\"-0.024078\" name=\"C24\" type=\"cD\" />\n+ <Atom charge=\"0.02058\" name=\"H4R\" type=\"hL\" />\n+ <Atom charge=\"0.02058\" name=\"H4S\" type=\"hL\" />\n+ <Atom charge=\"-0.015735\" name=\"C25\" type=\"cD\" />\n+ <Atom charge=\"0.009551\" name=\"H5R\" type=\"hL\" />\n+ <Atom charge=\"0.009551\" name=\"H5S\" type=\"hL\" />\n+ <Atom charge=\"-0.019631\" name=\"C26\" type=\"cD\" />\n+ <Atom charge=\"0.010236\" name=\"H6R\" type=\"hL\" />\n+ <Atom charge=\"0.010236\" name=\"H6S\" type=\"hL\" />\n+ <Atom charge=\"-0.019279\" name=\"C27\" type=\"cD\" />\n+ <Atom charge=\"0.011207\" name=\"H7R\" type=\"hL\" />\n+ <Atom charge=\"0.011207\" name=\"H7S\" type=\"hL\" />\n+ <Atom charge=\"-0.020879\" name=\"C28\" type=\"cD\" />\n+ <Atom charge=\"0.010385\" name=\"H8R\" type=\"hL\" />\n+ <Atom charge=\"0.010385\" name=\"H8S\" type=\"hL\" />\n+ <Atom charge=\"-0.021975\" name=\"C29\" type=\"cD\" />\n+ <Atom charge=\"0.005869\" name=\"H9R\" type=\"hL\" />\n+ <Atom charge=\"0.005869\" name=\"H9S\" type=\"hL\" />\n+ <Atom charge=\"-0.019575\" name=\"C210\" type=\"cD\" />\n+ <Atom charge=\"0.015163\" name=\"H10R\" type=\"hL\" />\n+ <Atom charge=\"0.015163\" name=\"H10S\" type=\"hL\" />\n+ <Atom charge=\"0.02332\" name=\"C211\" type=\"cD\" />\n+ <Atom charge=\"0.008276\" name=\"H11R\" type=\"hL\" />\n+ <Atom charge=\"0.008276\" name=\"H11S\" type=\"hL\" />\n+ <Atom charge=\"-0.118534\" name=\"C212\" type=\"cD\" />\n+ <Atom charge=\"0.025809\" name=\"H12R\" type=\"hL\" />\n+ <Atom charge=\"0.025809\" name=\"H12S\" type=\"hL\" />\n+ <Atom charge=\"0.025809\" name=\"H12T\" type=\"hL\" />\n+ <Atom charge=\"0.00151\" name=\"C33\" type=\"cD\" />\n+ <Atom charge=\"0.019108\" name=\"H3X\" type=\"hL\" />\n+ <Atom charge=\"0.019108\" name=\"H3Y\" type=\"hL\" />\n+ <Atom charge=\"-0.024078\" name=\"C34\" type=\"cD\" />\n+ <Atom charge=\"0.02058\" name=\"H4X\" type=\"hL\" />\n+ <Atom charge=\"0.02058\" name=\"H4Y\" type=\"hL\" />\n+ <Atom charge=\"-0.015735\" name=\"C35\" type=\"cD\" />\n+ <Atom charge=\"0.009551\" name=\"H5X\" type=\"hL\" />\n+ <Atom charge=\"0.009551\" name=\"H5Y\" type=\"hL\" />\n+ <Atom charge=\"-0.019631\" name=\"C36\" type=\"cD\" />\n+ <Atom charge=\"0.010236\" name=\"H6X\" type=\"hL\" />\n+ <Atom charge=\"0.010236\" name=\"H6Y\" type=\"hL\" />\n+ <Atom charge=\"-0.019279\" name=\"C37\" type=\"cD\" />\n+ <Atom charge=\"0.011207\" name=\"H7X\" type=\"hL\" />\n+ <Atom charge=\"0.011207\" name=\"H7Y\" type=\"hL\" />\n+ <Atom charge=\"-0.020879\" name=\"C38\" type=\"cD\" />\n+ <Atom charge=\"0.010385\" name=\"H8X\" type=\"hL\" />\n+ <Atom charge=\"0.010385\" name=\"H8Y\" type=\"hL\" />\n+ <Atom charge=\"-0.021975\" name=\"C39\" type=\"cD\" />\n+ <Atom charge=\"0.005869\" name=\"H9X\" type=\"hL\" />\n+ <Atom charge=\"0.005869\" name=\"H9Y\" type=\"hL\" />\n+ <Atom charge=\"-0.019575\" name=\"C310\" type=\"cD\" />\n+ <Atom charge=\"0.015163\" name=\"H10X\" type=\"hL\" />\n+ <Atom charge=\"0.015163\" name=\"H10Y\" type=\"hL\" />\n+ <Atom charge=\"0.02332\" name=\"C311\" type=\"cD\" />\n+ <Atom charge=\"0.008276\" name=\"H11X\" type=\"hL\" />\n+ <Atom charge=\"0.008276\" name=\"H11Y\" type=\"hL\" />\n+ <Atom charge=\"-0.118534\" name=\"C312\" type=\"cD\" />\n+ <Atom charge=\"0.025809\" name=\"H12X\" type=\"hL\" />\n+ <Atom charge=\"0.025809\" name=\"H12Y\" type=\"hL\" />\n+ <Atom charge=\"0.025809\" name=\"H12Z\" type=\"hL\" />\n+ <Bond atomName1=\"N\" atomName2=\"C13\" />\n+ <Bond atomName1=\"N\" atomName2=\"C14\" />\n+ <Bond atomName1=\"N\" atomName2=\"C15\" />\n+ <Bond atomName1=\"C13\" atomName2=\"H13A\" />\n+ <Bond atomName1=\"C13\" atomName2=\"H13B\" />\n+ <Bond atomName1=\"C13\" atomName2=\"H13C\" />\n+ <Bond atomName1=\"C14\" atomName2=\"H14A\" />\n+ <Bond atomName1=\"C14\" atomName2=\"H14B\" />\n+ <Bond atomName1=\"C14\" atomName2=\"H14C\" />\n+ <Bond atomName1=\"C15\" atomName2=\"H15A\" />\n+ <Bond atomName1=\"C15\" atomName2=\"H15B\" />\n+ <Bond atomName1=\"C15\" atomName2=\"H15C\" />\n+ <Bond atomName1=\"N\" atomName2=\"C12\" />\n+ <Bond atomName1=\"C12\" atomName2=\"H12A\" />\n+ <Bond atomName1=\"C12\" atomName2=\"H12B\" />\n+ <Bond atomName1=\"C12\" atomName2=\"C11\" />\n+ <Bond atomName1=\"C11\" atomName2=\"H11A\" />\n+ <Bond atomName1=\"C11\" atomName2=\"H11B\" />\n+ <Bond atomName1=\"C11\" atomName2=\"O12\" />\n+ <Bond atomName1=\"O12\" atomName2=\"P\" />\n+ <Bond atomName1=\"P\" atomName2=\"O11\" />\n+ <Bond atomName1=\"P\" atomName2=\"O13\" />\n+ <Bond atomName1=\"P\" atomName2=\"O14\" />\n+ <Bond atomName1=\"C1\" atomName2=\"HA\" />\n+ <Bond atomName1=\"C1\" atomName2=\"HB\" />\n+ <Bond atomName1=\"C1\" atomName2=\"C2\" />\n+ <Bond atomName1=\"C1\" atomName2=\"O11\" />\n+ <Bond atomName1=\"C2\" atomName2=\"HS\" />\n+ <Bond atomName1=\"C2\" atomName2=\"C3\" />\n+ <Bond atomName1=\"C2\" atomName2=\"O21\" />\n+ <Bond atomName1=\"C3\" atomName2=\"HX\" />\n+ <Bond atomName1=\"C3\" atomName2=\"HY\" />\n+ <Bond atomName1=\"C3\" atomName2=\"O31\" />\n+ <Bond atomName1=\"O21\" atomName2=\"C21\" />\n+ <Bond atomName1=\"C21\" atomName2=\"C22\" />\n+ <Bond atomName1=\"C21\" atomName2=\"O22\" />\n+ <Bond atomName1=\"C22\" atomName2=\"H2R\" />\n+ <Bond atomName1=\"C22\" atomName2=\"H2S\" />\n+ <Bond atomName1=\"C22\" atomName2=\"C23\" />\n+ <Bond atomName1=\"C23\" atomName2=\"H3R\" />\n+ <Bond atomName1=\"C23\" atomName2=\"H3S\" />\n+ <Bond atomName1=\"C23\" atomName2=\"C24\" />\n+ <Bond atomName1=\"C24\" atomName2=\"H4R\" />\n+ <Bond atomName1=\"C24\" atomName2=\"H4S\" />\n+ <Bond atomName1=\"C24\" atomName2=\"C25\" />\n+ <Bond atomName1=\"C25\" atomName2=\"H5R\" />\n+ <Bond atomName1=\"C25\" atomName2=\"H5S\" />\n+ <Bond atomName1=\"C25\" atomName2=\"C26\" />\n+ <Bond atomName1=\"C26\" atomName2=\"H6R\" />\n+ <Bond atomName1=\"C26\" atomName2=\"H6S\" />\n+ <Bond atomName1=\"C26\" atomName2=\"C27\" />\n+ <Bond atomName1=\"C27\" atomName2=\"H7R\" />\n+ <Bond atomName1=\"C27\" atomName2=\"H7S\" />\n+ <Bond atomName1=\"C27\" atomName2=\"C28\" />\n+ <Bond atomName1=\"C28\" atomName2=\"H8R\" />\n+ <Bond atomName1=\"C28\" atomName2=\"H8S\" />\n+ <Bond atomName1=\"C28\" atomName2=\"C29\" />\n+ <Bond atomName1=\"C29\" atomName2=\"H9R\" />\n+ <Bond atomName1=\"C29\" atomName2=\"H9S\" />\n+ <Bond atomName1=\"C29\" atomName2=\"C210\" />\n+ <Bond atomName1=\"C210\" atomName2=\"H10R\" />\n+ <Bond atomName1=\"C210\" atomName2=\"H10S\" />\n+ <Bond atomName1=\"C210\" atomName2=\"C211\" />\n+ <Bond atomName1=\"C211\" atomName2=\"H11R\" />\n+ <Bond atomName1=\"C211\" atomName2=\"H11S\" />\n+ <Bond atomName1=\"C211\" atomName2=\"C212\" />\n+ <Bond atomName1=\"C212\" atomName2=\"H12R\" />\n+ <Bond atomName1=\"C212\" atomName2=\"H12S\" />\n+ <Bond atomName1=\"C212\" atomName2=\"H12T\" />\n+ <Bond atomName1=\"O31\" atomName2=\"C31\" />\n+ <Bond atomName1=\"C31\" atomName2=\"C32\" />\n+ <Bond atomName1=\"C31\" atomName2=\"O32\" />\n+ <Bond atomName1=\"C32\" atomName2=\"H2X\" />\n+ <Bond atomName1=\"C32\" atomName2=\"H2Y\" />\n+ <Bond atomName1=\"C32\" atomName2=\"C33\" />\n+ <Bond atomName1=\"C33\" atomName2=\"H3X\" />\n+ <Bond atomName1=\"C33\" atomName2=\"H3Y\" />\n+ <Bond atomName1=\"C33\" atomName2=\"C34\" />\n+ <Bond atomName1=\"C34\" atomName2=\"H4X\" />\n+ <Bond atomName1=\"C34\" atomName2=\"H4Y\" />\n+ <Bond atomName1=\"C34\" atomName2=\"C35\" />\n+ <Bond atomName1=\"C35\" atomName2=\"H5X\" />\n+ <Bond atomName1=\"C35\" atomName2=\"H5Y\" />\n+ <Bond atomName1=\"C35\" atomName2=\"C36\" />\n+ <Bond atomName1=\"C36\" atomName2=\"H6X\" />\n+ <Bond atomName1=\"C36\" atomName2=\"H6Y\" />\n+ <Bond atomName1=\"C36\" atomName2=\"C37\" />\n+ <Bond atomName1=\"C37\" atomName2=\"H7X\" />\n+ <Bond atomName1=\"C37\" atomName2=\"H7Y\" />\n+ <Bond atomName1=\"C37\" atomName2=\"C38\" />\n+ <Bond atomName1=\"C38\" atomName2=\"H8X\" />\n+ <Bond atomName1=\"C38\" atomName2=\"H8Y\" />\n+ <Bond atomName1=\"C38\" atomName2=\"C39\" />\n+ <Bond atomName1=\"C39\" atomName2=\"H9X\" />\n+ <Bond atomName1=\"C39\" atomName2=\"H9Y\" />\n+ <Bond atomName1=\"C39\" atomName2=\"C310\" />\n+ <Bond atomName1=\"C310\" atomName2=\"H10X\" />\n+ <Bond atomName1=\"C310\" atomName2=\"H10Y\" />\n+ <Bond atomName1=\"C310\" atomName2=\"C311\" />\n+ <Bond atomName1=\"C311\" atomName2=\"H11X\" />\n+ <Bond atomName1=\"C311\" atomName2=\"H11Y\" />\n+ <Bond atomName1=\"C311\" atomName2=\"C312\" />\n+ <Bond atomName1=\"C312\" atomName2=\"H12X\" />\n+ <Bond atomName1=\"C312\" atomName2=\"H12Y\" />\n+ <Bond atomName1=\"C312\" atomName2=\"H12Z\" />\n+ </Residue>\n+ <Residue name=\"DLPE\">\n+ <Atom charge=\"-0.368132\" name=\"N\" type=\"nA\" />\n+ <Atom charge=\"0.348549\" name=\"HN1\" type=\"hN\" />\n+ <Atom charge=\"0.348549\" name=\"HN2\" type=\"hN\" />\n+ <Atom charge=\"0.348549\" name=\"HN3\" type=\"hN\" />\n+ <Atom charge=\"0.077319\" name=\"C12\" type=\"cA\" />\n+ <Atom charge=\"0.09163\" name=\"H12A\" type=\"hX\" />\n+ <Atom charge=\"0.09163\" name=\"H12B\" type=\"hX\" />\n+ <Atom charge=\"0.075159\" name=\"C11\" type=\"cA\" />\n+ <Atom charge=\"0.091516\" name=\"H11A\" type=\"hE\" />\n+ <Atom charge=\"0.091516\" name=\"H11B\" type=\"hE\" />\n+ <Atom charge=\"1.373656\" name=\"P\" type=\"pA\" />\n+ <Atom charge=\"-0.877447\" name=\"O13\" type=\"oP\" />\n+ <Atom charge=\"-0.877447\" name=\"O14\" type=\"oP\" />\n+ <Atom charge=\"-0.546623\" name=\"O11\" type=\"oT\" />\n+ <Atom charge=\"-0.514542\" name=\"O12\" type=\"oT\" />\n+ <Atom charge=\"0.040967\" name=\"C1\" type=\"cA\" />\n+ <Atom charge=\"0.090994\" name=\"HA\" type=\"hE\" />\n+ <Atom charge=\"0.090994\" name=\"HB\" type=\"hE\" />\n+ <Atom charge=\"0.339004\" name=\"C2\" type=\"cA\" />\n+ <Atom charge=\"0.032843\" name=\"HS\" type=\"hE\" />\n+ <Atom charge=\"-0.57548\" name=\"O21\" type=\"oS\" />\n+ <Atom charge=\"0.86934\" name=\"C21\" type=\"cC\" />\n+ <Atom charge=\"-0.649199\" name=\"O22\" type=\"oC\" />\n+ <Atom charge=\"-0.172159\" name=\"C22\" type=\"cD\" />\n+ <Atom charge=\"0.054419\" name=\"H2R\" type=\"hL\" />\n+ <Atom charge=\"0.054419\" name=\"H2S\" type=\"hL\" />\n+ <Atom charge=\"0.273776\" name=\"C3\" type=\"cA\" />\n+ <Atom charge=\"0.044574\" name=\"HX\" type=\"hE\" />\n+ <Atom charge=\"0.044574\" name=\"HY\" type=\"hE\" />\n+ <Atom charge=\"-0.593826\" name=\"O31\" type=\"oS\" />\n+ <Atom charge=\"0.888359\" name=\"C31\" type=\"cC\" />\n+ <Atom charge=\"-0.650802\" name=\"O32\" type=\"oC\" />\n+ <Atom charge=\"-0.172159\" name=\"C32\" type=\"cD\" />\n+ <Atom charge=\"0.054419\" name=\"H2X\" type=\"hL\" />\n+ <Atom charge=\"0.054419\" name=\"H2Y\" type=\"hL\" />\n+ <Atom charge=\"0.00151\" name=\"C23\" type=\"cD\" />\n+ <Atom charge=\"0.019108\" name=\"H3R\" type=\"hL\" />\n+ <Atom charge=\"0.019108\" name=\"H3S\" type=\"hL\" />\n+ <Atom charge=\"-0.024078\" name=\"C24\" type=\"cD\" />\n+ <Atom charge=\"0.02058\" name=\"H4R\" type=\"hL\" />\n+ <Atom charge=\"0.02058\" name=\"H4S\" type=\"hL\" />\n+ <Atom charge=\"-0.015735\" name=\"C25\" type=\"cD\" />\n+ <Atom charge=\"0.009551\" name=\"H5R\" type=\"hL\" />\n+ <Atom charge=\"0.009551\" name=\"H5S\" type=\"hL\" />\n+ <Atom charge=\"-0.019631\" name=\"C26\" type=\"cD\" />\n+ <Atom charge=\"0.010236\" name=\"H6R\" type=\"hL\" />\n+ <Atom charge=\"0.010236\" name=\"H6S\" type=\"hL\" />\n+ <Atom charge=\"-0.019279\" name=\"C27\" type=\"cD\" />\n+ <Atom charge=\"0.011207\" name=\"H7R\" type=\"hL\" />\n+ <Atom charge=\"0.011207\" name=\"H7S\" type=\"hL\" />\n+ <Atom charge=\"-0.020879\" name=\"C28\" type=\"cD\" />\n+ <Atom charge=\"0.010385\" name=\"H8R\" type=\"hL\" />\n+ <Atom charge=\"0.010385\" name=\"H8S\" type=\"hL\" />\n+ <Atom charge=\"-0.021975\" name=\"C29\" type=\"cD\" />\n+ <Atom charge=\"0.005869\" name=\"H9R\" type=\"hL\" />\n+ <Atom charge=\"0.005869\" name=\"H9S\" type=\"hL\" />\n+ <Atom charge=\"-0.019575\" name=\"C210\" type=\"cD\" />\n+ <Atom charge=\"0.015163\" name=\"H10R\" type=\"hL\" />\n+ <Atom charge=\"0.015163\" name=\"H10S\" type=\"hL\" />\n+ <Atom charge=\"0.02332\" name=\"C211\" type=\"cD\" />\n+ <Atom charge=\"0.008276\" name=\"H11R\" type=\"hL\" />\n+ <Atom charge=\"0.008276\" name=\"H11S\" type=\"hL\" />\n+ <Atom charge=\"-0.118534\" name=\"C212\" type=\"cD\" />\n+ <Atom charge=\"0.025809\" name=\"H12R\" type=\"hL\" />\n+ <Atom charge=\"0.025809\" name=\"H12S\" type=\"hL\" />\n+ <Atom charge=\"0.025809\" name=\"H12T\" type=\"hL\" />\n+ <Atom charge=\"0.00151\" name=\"C33\" type=\"cD\" />\n+ <Atom charge=\"0.019108\" name=\"H3X\" type=\"hL\" />\n+ <Atom charge=\"0.019108\" name=\"H3Y\" type=\"hL\" />\n+ <Atom charge=\"-0.024078\" name=\"C34\" type=\"cD\" />\n+ <Atom charge=\"0.02058\" name=\"H4X\" type=\"hL\" />\n+ <Atom charge=\"0.02058\" name=\"H4Y\" type=\"hL\" />\n+ <Atom charge=\"-0.015735\" name=\"C35\" type=\"cD\" />\n+ <Atom charge=\"0.009551\" name=\"H5X\" type=\"hL\" />\n+ <Atom charge=\"0.009551\" name=\"H5Y\" type=\"hL\" />\n+ <Atom charge=\"-0.019631\" name=\"C36\" type=\"cD\" />\n+ <Atom charge=\"0.010236\" name=\"H6X\" type=\"hL\" />\n+ <Atom charge=\"0.010236\" name=\"H6Y\" type=\"hL\" />\n+ <Atom charge=\"-0.019279\" name=\"C37\" type=\"cD\" />\n+ <Atom charge=\"0.011207\" name=\"H7X\" type=\"hL\" />\n+ <Atom charge=\"0.011207\" name=\"H7Y\" type=\"hL\" />\n+ <Atom charge=\"-0.020879\" name=\"C38\" type=\"cD\" />\n+ <Atom charge=\"0.010385\" name=\"H8X\" type=\"hL\" />\n+ <Atom charge=\"0.010385\" name=\"H8Y\" type=\"hL\" />\n+ <Atom charge=\"-0.021975\" name=\"C39\" type=\"cD\" />\n+ <Atom charge=\"0.005869\" name=\"H9X\" type=\"hL\" />\n+ <Atom charge=\"0.005869\" name=\"H9Y\" type=\"hL\" />\n+ <Atom charge=\"-0.019575\" name=\"C310\" type=\"cD\" />\n+ <Atom charge=\"0.015163\" name=\"H10X\" type=\"hL\" />\n+ <Atom charge=\"0.015163\" name=\"H10Y\" type=\"hL\" />\n+ <Atom charge=\"0.02332\" name=\"C311\" type=\"cD\" />\n+ <Atom charge=\"0.008276\" name=\"H11X\" type=\"hL\" />\n+ <Atom charge=\"0.008276\" name=\"H11Y\" type=\"hL\" />\n+ <Atom charge=\"-0.118534\" name=\"C312\" type=\"cD\" />\n+ <Atom charge=\"0.025809\" name=\"H12X\" type=\"hL\" />\n+ <Atom charge=\"0.025809\" name=\"H12Y\" type=\"hL\" />\n+ <Atom charge=\"0.025809\" name=\"H12Z\" type=\"hL\" />\n+ <Bond atomName1=\"N\" atomName2=\"HN1\" />\n+ <Bond atomName1=\"N\" atomName2=\"HN2\" />\n+ <Bond atomName1=\"N\" atomName2=\"HN3\" />\n+ <Bond atomName1=\"N\" atomName2=\"C12\" />\n+ <Bond atomName1=\"C12\" atomName2=\"H12A\" />\n+ <Bond atomName1=\"C12\" atomName2=\"H12B\" />\n+ <Bond atomName1=\"C12\" atomName2=\"C11\" />\n+ <Bond atomName1=\"C11\" atomName2=\"H11A\" />\n+ <Bond atomName1=\"C11\" atomName2=\"H11B\" />\n+ <Bond atomName1=\"C11\" atomName2=\"O12\" />\n+ <Bond atomName1=\"O12\" atomName2=\"P\" />\n+ <Bond atomName1=\"P\" atomName2=\"O11\" />\n+ <Bond atomName1=\"P\" atomName2=\"O13\" />\n+ <Bond atomName1=\"P\" atomName2=\"O14\" />\n+ <Bond atomName1=\"C1\" atomName2=\"HA\" />\n+ <Bond atomName1=\"C1\" atomName2=\"HB\" />\n+ <Bond atomName1=\"C1\" atomName2=\"C2\" />\n+ <Bond atomName1=\"C1\" atomName2=\"O11\" />\n+ <Bond atomName1=\"C2\" atomName2=\"HS\" />\n+ <Bond atomName1=\"C2\" atomName2=\"C3\" />\n+ <Bond atomName1=\"C2\" atomName2=\"O21\" />\n+ <Bond atomName1=\"C3\" atomName2=\"HX\" />\n+ <Bond atomName1=\"C3\" atomName2=\"HY\" />\n+ <Bond atomName1=\"C3\" atomName2=\"O31\" />\n+ <Bond atomName1=\"O21\" atomName2=\"C21\" />\n+ <Bond atomName1=\"C21\" atomName2=\"C22\" />\n+ <Bond atomName1=\"C21\" atomName2=\"O22\" />\n+ <Bond atomName1=\"C22\" atomName2=\"H2R\" />\n+ <Bond atomName1=\"C22\" atomName2=\"H2S\" />\n+ <Bond atomName1=\"C22\" atomName2=\"C23\" />\n+ <Bond atomName1=\"C23\" atomName2=\"H3R\" />\n+ <Bond atomName1=\"C23\" atomName2=\"H3S\" />\n+ <Bond atomName1=\"C23\" atomName2=\"C24\" />\n+ <Bond atomName1=\"C24\" atomName2=\"H4R\" />\n+ <Bond atomName1=\"C24\" atomName2=\"H4S\" />\n+ <Bond atomName1=\"C24\" atomName2=\"C25\" />\n+ <Bond atomName1=\"C25\" atomName2=\"H5R\" />\n+ <Bond atomName1=\"C25\" atomName2=\"H5S\" />\n+ <Bond atomName1=\"C25\" atomName2=\"C26\" />\n+ <Bond atomName1=\"C26\" atomName2=\"H6R\" />\n+ <Bond atomName1=\"C26\" atomName2=\"H6S\" />\n+ <Bond atomName1=\"C26\" atomName2=\"C27\" />\n+ <Bond atomName1=\"C27\" atomName2=\"H7R\" />\n+ <Bond atomName1=\"C27\" atomName2=\"H7S\" />\n+ <Bond atomName1=\"C27\" atomName2=\"C28\" />\n+ <Bond atomName1=\"C28\" atomName2=\"H8R\" />\n+ <Bond atomName1=\"C28\" atomName2=\"H8S\" />\n+ <Bond atomName1=\"C28\" atomName2=\"C29\" />\n+ <Bond atomName1=\"C29\" atomName2=\"H9R\" />\n+ <Bond atomName1=\"C29\" atomName2=\"H9S\" />\n+ <Bond atomName1=\"C29\" atomName2=\"C210\" />\n+ <Bond atomName1=\"C210\" atomName2=\"H10R\" />\n+ <Bond atomName1=\"C210\" atomName2=\"H10S\" />\n+ <Bond atomName1=\"C210\" atomName2=\"C211\" />\n+ <Bond atomName1=\"C211\" atomName2=\"H11R\" />\n+ <Bond atomName1=\"C211\" atomName2=\"H11S\" />\n+ <Bond atomName1=\"C211\" atomName2=\"C212\" />\n+ <Bond atomName1=\"C212\" atomName2=\"H12R\" />\n+ <Bond atomName1=\"C212\" atomName2=\"H12S\" />\n+ <Bond atomName1=\"C212\" atomName2=\"H12T\" />\n+ <Bond atomName1=\"O31\" atomName2=\"C31\" />\n+ <Bond atomName1=\"C31\" atomName2=\"C32\" />\n+ <Bond atomName1=\"C31\" atomName2=\"O32\" />\n+ <Bond atomName1=\"C32\" atomName2=\"H2X\" />\n+ <Bond atomName1=\"C32\" atomName2=\"H2Y\" />\n+ <Bond atomName1=\"C32\" atomName2=\"C33\" />\n+ <Bond atomName1=\"C33\" atomName2=\"H3X\" />\n+ <Bond atomName1=\"C33\" atomName2=\"H3Y\" />\n+ <Bond atomName1=\"C33\" atomName2=\"C34\" />\n+ <Bond atomName1=\"C34\" atomName2=\"H4X\" />\n+ <Bond atomName1=\"C34\" atomName2=\"H4Y\" />\n+ <Bond atomName1=\"C34\" atomName2=\"C35\" />\n+ <Bond atomName1=\"C35\" atomName2=\"H5X\" />\n+ <Bond atomName1=\"C35\" atomName2=\"H5Y\" />\n+ <Bond atomName1=\"C35\" atomName2=\"C36\" />\n+ <Bond atomName1=\"C36\" atomName2=\"H6X\" />\n+ <Bond atomName1=\"C36\" atomName2=\"H6Y\" />\n+ <Bond atomName1=\"C36\" atomName2=\"C37\" />\n+ <Bond atomName1=\"C37\" atomName2=\"H7X\" />\n+ <Bond atomName1=\"C37\" atomName2=\"H7Y\" />\n+ <Bond atomName1=\"C37\" atomName2=\"C38\" />\n+ <Bond atomName1=\"C38\" atomName2=\"H8X\" />\n+ <Bond atomName1=\"C38\" atomName2=\"H8Y\" />\n+ <Bond atomName1=\"C38\" atomName2=\"C39\" />\n+ <Bond atomName1=\"C39\" atomName2=\"H9X\" />\n+ <Bond atomName1=\"C39\" atomName2=\"H9Y\" />\n+ <Bond atomName1=\"C39\" atomName2=\"C310\" />\n+ <Bond atomName1=\"C310\" atomName2=\"H10X\" />\n+ <Bond atomName1=\"C310\" atomName2=\"H10Y\" />\n+ <Bond atomName1=\"C310\" atomName2=\"C311\" />\n+ <Bond atomName1=\"C311\" atomName2=\"H11X\" />\n+ <Bond atomName1=\"C311\" atomName2=\"H11Y\" />\n+ <Bond atomName1=\"C311\" atomName2=\"C312\" />\n+ <Bond atomName1=\"C312\" atomName2=\"H12X\" />\n+ <Bond atomName1=\"C312\" atomName2=\"H12Y\" />\n+ <Bond atomName1=\"C312\" atomName2=\"H12Z\" />\n+ </Residue>\n+ <Residue name=\"DLPS\">\n+ <Atom charge=\"-0.414327\" name=\"N\" type=\"nA\" />\n+ <Atom charge=\"0.353866\" name=\"HN1\" type=\"hN\" />\n+ <Atom charge=\"0.353866\" name=\"HN2\" type=\"hN\" />\n+ <Atom charge=\"0.353866\" name=\"HN3\" type=\"hN\" />\n+ <Atom charge=\"0.039448\" name=\"C12\" type=\"cA\" />\n+ <Atom charge=\"0.090549\" name=\"H12A\" type=\"hX\" />\n+ <Atom charge=\"0.809867\" name=\"C13\" type=\"cC\" />\n+ <Atom charge=\"-0.815178\" name=\"O13A\" type=\"oO\" />\n+ <Atom charge=\"-0.815178\" name=\"O13B\" type=\"oO\" />\n+ <Atom charge=\"0.060375\" name=\"C11\" type=\"cA\" />\n+ <Atom charge=\"0.093484\" name=\"H11A\" type=\"hE\" />\n+ <Atom charge=\"0.093484\" name=\"H11B\" type=\"hE\" />\n+ <Atom charge=\"1.380208\" name=\"P\" type=\"pA\" />\n+ <Atom charge=\"-0.877922\" name=\"O13\" type=\"oP\" />\n+ <Atom charge=\"-0.877922\" name=\"O14\" type=\"oP\" />\n+ <Atom charge=\"-0.520128\" name=\"O12\" type=\"oT\" />\n+ <Atom charge=\"-0.556992\" name=\"O11\" type=\"oT\" />\n+ <Atom charge=\"0.012366\" name=\"C1\" type=\"cA\" />\n+ <Atom charge=\"0.097347\" name=\"HA\" type=\"hE\" />\n+ <Atom charge=\"0.097347\" name=\"HB\" type=\"hE\" />\n+ <Atom charge=\"0.44065\" name=\"C2\" type=\"cA\" />\n+ <Atom charge=\"0.002473\" name=\"HS\" type=\"hE\" />\n+ <Atom charge=\"-0.634381\" name=\"O21\" type=\"oS\" />\n+ <Atom charge=\"0.891897\" name=\"C21\" type=\"cC\" />\n+ <Atom charge=\"-0.650291\" name=\"O22\" type=\"oC\" />\n+ <Atom charge=\"-0.172159\" name=\"C22\" type=\"cD\" />\n+ <Atom charge=\"0.054419\" name=\"H2R\" type=\"hL\" />\n+ <Atom charge=\"0.054419\" name=\"H2S\" type=\"hL\" />\n+ <Atom charge=\"0.271173\" name=\"C3\" type=\"cA\" />\n+ <Atom charge=\"0.037454\" name=\"HX\" type=\"hE\" />\n+ <Atom charge=\"0.037454\" name=\"HY\" type=\"hE\" />\n+ <Atom charge=\"-0.579073\" name=\"O31\" type=\"oS\" />\n+ <Atom charge=\"0.887549\" name=\"C31\" type=\"cC\" />\n+ <Atom charge=\"-0.663331\" name=\"O32\" type=\"oC\" />\n+ <Atom charge=\"-0.172159\" name=\"C32\" type=\"cD\" />\n+ <Atom charge=\"0.054419\" name=\"H2X\" type=\"hL\" />\n+ <Atom charge=\"0.054419\" name=\"H2Y\" type=\"hL\" />\n+ <Atom charge=\"0.00151\" name=\"C23\" type=\"cD\" />\n+ <Atom charge=\"0.019108\" name=\"H3R\" type=\"hL\" />\n+ <Atom charge=\"0.019108\" name=\"H3S\" type=\"hL\" />\n+ <Atom charge=\"-0.024078\" name=\"C24\" type=\"cD\" />\n+ <Atom charge=\"0.02058\" name=\"H4R\" type=\"hL\" />\n+ <Atom charge=\"0.02058\" name=\"H4S\" type=\"hL\" />\n+ <Atom charge=\"-0.015735\" name=\"C25\" type=\"cD\" />\n+ <Atom charge=\"0.009551\" name=\"H5R\" type=\"hL\" />\n+ <Atom charge=\"0.009551\" name=\"H5S\" type=\"hL\" />\n+ <Atom charge=\"-0.019631\" name=\"C26\" type=\"cD\" />\n+ <Atom charge=\"0.010236\" name=\"H6R\" type=\"hL\" />\n+ <Atom charge=\"0.010236\" name=\"H6S\" type=\"hL\" />\n+ <Atom charge=\"-0.019279\" name=\"C27\" type=\"cD\" />\n+ <Atom charge=\"0.011207\" name=\"H7R\" type=\"hL\" />\n+ <Atom charge=\"0.011207\" name=\"H7S\" type=\"hL\" />\n+ <Atom charge=\"-0.020879\" name=\"C28\" type=\"cD\" />\n+ <Atom charge=\"0.010385\" name=\"H8R\" type=\"hL\" />\n+ <Atom charge=\"0.010385\" name=\"H8S\" type=\"hL\" />\n+ <Atom charge=\"-0.021975\" name=\"C29\" type=\"cD\" />\n+ <Atom charge=\"0.005869\" name=\"H9R\" type=\"hL\" />\n+ <Atom charge=\"0.005869\" name=\"H9S\" type=\"hL\" />\n+ <Atom charge=\"-0.019575\" name=\"C210\" type=\"cD\" />\n+ <Atom charge=\"0.015163\" name=\"H10R\" type=\"hL\" />\n+ <Atom charge=\"0.015163\" name=\"H10S\" type=\"hL\" />\n+ <Atom charge=\"0.02332\" name=\"C211\" type=\"cD\" />\n+ <Atom charge=\"0.008276\" name=\"H11R\" type=\"hL\" />\n+ <Atom charge=\"0.008276\" name=\"H11S\" type=\"hL\" />\n+ <Atom charge=\"-0.118534\" name=\"C212\" type=\"cD\" />\n+ <Atom charge=\"0.025809\" name=\"H12R\" type=\"hL\" />\n+ <Atom charge=\"0.025809\" name=\"H12S\" type=\"hL\" />\n+ <Atom charge=\"0.025809\" name=\"H12T\" type=\"hL\" />\n+ <Atom charge=\"0.00151\" name=\"C33\" type=\"cD\" />\n+ <Atom charge=\"0.019108\" name=\"H3X\" type=\"hL\" />\n+ <Atom charge=\"0.019108\" name=\"H3Y\" type=\"hL\" />\n+ <Atom charge=\"-0.024078\" name=\"C34\" type=\"cD\" />\n+ <Atom charge=\"0.02058\" name=\"H4X\" type=\"hL\" />\n+ <Atom charge=\"0.02058\" name=\"H4Y\" type=\"hL\" />\n+ <Atom charge=\"-0.015735\" name=\"C35\" type=\"cD\" />\n+ <Atom charge=\"0.009551\" name=\"H5X\" type=\"hL\" />\n+ <Atom charge=\"0.009551\" name=\"H5Y\" type=\"hL\" />\n+ <Atom charge=\"-0.019631\" name=\"C36\" type=\"cD\" />\n+ <Atom charge=\"0.010236\" name=\"H6X\" type=\"hL\" />\n+ <Atom charge=\"0.010236\" name=\"H6Y\" type=\"hL\" />\n+ <Atom charge=\"-0.019279\" name=\"C37\" type=\"cD\" />\n+ <Atom charge=\"0.011207\" name=\"H7X\" type=\"hL\" />\n+ <Atom charge=\"0.011207\" name=\"H7Y\" type=\"hL\" />\n+ <Atom charge=\"-0.020879\" name=\"C38\" type=\"cD\" />\n+ <Atom charge=\"0.010385\" name=\"H8X\" type=\"hL\" />\n+ <Atom charge=\"0.010385\" name=\"H8Y\" type=\"hL\" />\n+ <Atom charge=\"-0.021975\" name=\"C39\" type=\"cD\" />\n+ <Atom charge=\"0.005869\" name=\"H9X\" type=\"hL\" />\n+ <Atom charge=\"0.005869\" name=\"H9Y\" type=\"hL\" />\n+ <Atom charge=\"-0.019575\" name=\"C310\" type=\"cD\" />\n+ <Atom charge=\"0.015163\" name=\"H10X\" type=\"hL\" />\n+ <Atom charge=\"0.015163\" name=\"H10Y\" type=\"hL\" />\n+ <Atom charge=\"0.02332\" name=\"C311\" type=\"cD\" />\n+ <Atom charge=\"0.008276\" name=\"H11X\" type=\"hL\" />\n+ <Atom charge=\"0.008276\" name=\"H11Y\" type=\"hL\" />\n+ <Atom charge=\"-0.118534\" name=\"C312\" type=\"cD\" />\n+ <Atom charge=\"0.025809\" name=\"H12X\" type=\"hL\" />\n+ <Atom charge=\"0.025809\" name=\"H12Y\" type=\"hL\" />\n+ <Atom charge=\"0.025809\" name=\"H12Z\" type=\"hL\" />\n+ <Bond atomName1=\"N\" atomName2=\"HN1\" />\n+ <Bond atomName1=\"N\" atomName2=\"HN2\" />\n+ <Bond atomName1=\"N\" atomName2=\"HN3\" />\n+ <Bond atomName1=\"N\" atomName2=\"C12\" />\n+ <Bond atomName1=\"O13B\" atomName2=\"C13\" />\n+ <Bond atomName1=\"C13\" atomName2=\"C12\" />\n+ <Bond atomName1=\"C13\" atomName2=\"O13A\" />\n+ <Bond atomName1=\"C12\" atomName2=\"H12A\" />\n+ <Bond atomName1=\"C12\" atomName2=\"C11\" />\n+ <Bond atomName1=\"C1\" atomName2=\"O11\" />\n+ <Bond atomName1=\"C11\" atomName2=\"H11A\" />\n+ <Bond atomName1=\"C11\" atomName2=\"H11B\" />\n+ <Bond atomName1=\"C11\" atomName2=\"O12\" />\n+ <Bond atomName1=\"O12\" atomName2=\"P\" />\n+ <Bond atomName1=\"P\" atomName2=\"O11\" />\n+ <Bond atomName1=\"P\" atomName2=\"O13\" />\n+ <Bond atomName1=\"P\" atomName2=\"O14\" />\n+ <Bond atomName1=\"C1\" atomName2=\"HA\" />\n+ <Bond atomName1=\"C1\" atomName2=\"HB\" />\n+ <Bond atomName1=\"C1\" atomName2=\"C2\" />\n+ <Bond atomName1=\"C2\" atomName2=\"HS\" />\n+ <Bond atomName1=\"C2\" atomName2=\"C3\" />\n+ <Bond atomName1=\"C2\" atomName2=\"O21\" />\n+ <Bond atomName1=\"C3\" atomName2=\"HX\" />\n+ <Bond atomName1=\"C3\" atomName2=\"HY\" />\n+ <Bond atomName1=\"C3\" atomName2=\"O31\" />\n+ <Bond atomName1=\"O21\" atomName2=\"C21\" />\n+ <Bond atomName1=\"C21\" atomName2=\"C22\" />\n+ <Bond atomName1=\"C21\" atomName2=\"O22\" />\n+ <Bond atomName1=\"C22\" atomName2=\"H2R\" />\n+ <Bond atomName1=\"C22\" atomName2=\"H2S\" />\n+ <Bond atomName1=\"C22\" atomName2=\"C23\" />\n+ <Bond atomName1=\"C23\" atomName2=\"H3R\" />\n+ <Bond atomName1=\"C23\" atomName2=\"H3S\" />\n+ <Bond atomName1=\"C23\" atomName2=\"C24\" />\n+ <Bond atomName1=\"C24\" atomName2=\"H4R\" />\n+ <Bond atomName1=\"C24\" atomName2=\"H4S\" />\n+ <Bond atomName1=\"C24\" atomName2=\"C25\" />\n+ <Bond atomName1=\"C25\" atomName2=\"H5R\" />\n+ <Bond atomName1=\"C25\" atomName2=\"H5S\" />\n+ <Bond atomName1=\"C25\" atomName2=\"C26\" />\n+ <Bond atomName1=\"C26\" atomName2=\"H6R\" />\n+ <Bond atomName1=\"C26\" atomName2=\"H6S\" />\n+ <Bond atomName1=\"C26\" atomName2=\"C27\" />\n+ <Bond atomName1=\"C27\" atomName2=\"H7R\" />\n+ <Bond atomName1=\"C27\" atomName2=\"H7S\" />\n+ <Bond atomName1=\"C27\" atomName2=\"C28\" />\n+ <Bond atomName1=\"C28\" atomName2=\"H8R\" />\n+ <Bond atomName1=\"C28\" atomName2=\"H8S\" />\n+ <Bond atomName1=\"C28\" atomName2=\"C29\" />\n+ <Bond atomName1=\"C29\" atomName2=\"H9R\" />\n+ <Bond atomName1=\"C29\" atomName2=\"H9S\" />\n+ <Bond atomName1=\"C29\" atomName2=\"C210\" />\n+ <Bond atomName1=\"C210\" atomName2=\"H10R\" />\n+ <Bond atomName1=\"C210\" atomName2=\"H10S\" />\n+ <Bond atomName1=\"C210\" atomName2=\"C211\" />\n+ <Bond atomName1=\"C211\" atomName2=\"H11R\" />\n+ <Bond atomName1=\"C211\" atomName2=\"H11S\" />\n+ <Bond atomName1=\"C211\" atomName2=\"C212\" />\n+ <Bond atomName1=\"C212\" atomName2=\"H12R\" />\n+ <Bond atomName1=\"C212\" atomName2=\"H12S\" />\n+ <Bond atomName1=\"C212\" atomName2=\"H12T\" />\n+ <Bond atomName1=\"O31\" atomName2=\"C31\" />\n+ <Bond atomName1=\"C31\" atomName2=\"C32\" />\n+ <Bond atomName1=\"C31\" atomName2=\"O32\" />\n+ <Bond atomName1=\"C32\" atomName2=\"H2X\" />\n+ <Bond atomName1=\"C32\" atomName2=\"H2Y\" />\n+ <Bond atomName1=\"C32\" atomName2=\"C33\" />\n+ <Bond atomName1=\"C33\" atomName2=\"H3X\" />\n+ <Bond atomName1=\"C33\" atomName2=\"H3Y\" />\n+ <Bond atomName1=\"C33\" atomName2=\"C34\" />\n+ <Bond atomName1=\"C34\" atomName2=\"H4X\" />\n+ <Bond atomName1=\"C34\" atomName2=\"H4Y\" />\n+ <Bond atomName1=\"C34\" atomName2=\"C35\" />\n+ <Bond atomName1=\"C35\" atomName2=\"H5X\" />\n+ <Bond atomName1=\"C35\" atomName2=\"H5Y\" />\n+ <Bond atomName1=\"C35\" atomName2=\"C36\" />\n+ <Bond atomName1=\"C36\" atomName2=\"H6X\" />\n+ <Bond atomName1=\"C36\" atomName2=\"H6Y\" />\n+ <Bond atomName1=\"C36\" atomName2=\"C37\" />\n+ <Bond atomName1=\"C37\" atomName2=\"H7X\" />\n+ <Bond atomName1=\"C37\" atomName2=\"H7Y\" />\n+ <Bond atomName1=\"C37\" atomName2=\"C38\" />\n+ <Bond atomName1=\"C38\" atomName2=\"H8X\" />\n+ <Bond atomName1=\"C38\" atomName2=\"H8Y\" />\n+ <Bond atomName1=\"C38\" atomName2=\"C39\" />\n+ <Bond atomName1=\"C39\" atomName2=\"H9X\" />\n+ <Bond atomName1=\"C39\" atomName2=\"H9Y\" />\n+ <Bond atomName1=\"C39\" atomName2=\"C310\" />\n+ <Bond atomName1=\"C310\" atomName2=\"H10X\" />\n+ <Bond atomName1=\"C310\" atomName2=\"H10Y\" />\n+ <Bond atomName1=\"C310\" atomName2=\"C311\" />\n+ <Bond atomName1=\"C311\" atomName2=\"H11X\" />\n+ <Bond atomName1=\"C311\" atomName2=\"H11Y\" />\n+ <Bond atomName1=\"C311\" atomName2=\"C312\" />\n+ <Bond atomName1=\"C312\" atomName2=\"H12X\" />\n+ <Bond atomName1=\"C312\" atomName2=\"H12Y\" />\n+ <Bond atomName1=\"C312\" atomName2=\"H12Z\" />\n+ </Residue>\n+ <Residue name=\"DLPA\">\n+ <Atom charge=\"1.456663\" name=\"P\" type=\"pA\" />\n+ <Atom charge=\"-0.914158\" name=\"O13\" type=\"oP\" />\n+ <Atom charge=\"-0.914158\" name=\"O14\" type=\"oP\" />\n+ <Atom charge=\"-0.706197\" name=\"O12\" type=\"oH\" />\n+ <Atom charge=\"0.415628\" name=\"H12\" type=\"hO\" />\n+ <Atom charge=\"-0.594197\" name=\"O11\" type=\"oT\" />\n+ <Atom charge=\"0.081528\" name=\"C1\" type=\"cA\" />\n+ <Atom charge=\"0.083099\" name=\"HA\" type=\"hE\" />\n+ <Atom charge=\"0.083099\" name=\"HB\" type=\"hE\" />\n+ <Atom charge=\"0.283546\" name=\"C2\" type=\"cA\" />\n+ <Atom charge=\"0.063862\" name=\"HS\" type=\"hE\" />\n+ <Atom charge=\"-0.554487\" name=\"O21\" type=\"oS\" />\n+ <Atom charge=\"0.897502\" name=\"C21\" type=\"cC\" />\n+ <Atom charge=\"-0.671622\" name=\"O22\" type=\"oC\" />\n+ <Atom charge=\"-0.172159\" name=\"C22\" type=\"cD\" />\n+ <Atom charge=\"0.054419\" name=\"H2R\" type=\"hL\" />\n+ <Atom charge=\"0.054419\" name=\"H2S\" type=\"hL\" />\n+ <Atom charge=\"0.185299\" name=\"C3\" type=\"cA\" />\n+ <Atom charge=\"0.067676\" name=\"HX\" type=\"hE\" />\n+ <Atom charge=\"0.067676\" name=\"HY\" type=\"hE\" />\n+ <Atom charge=\"-0.547824\" name=\"O31\" type=\"oS\" />\n+ <Atom charge=\"0.888207\" name=\"C31\" type=\"cC\" />\n+ <Atom charge=\"-0.671142\" name=\"O32\" type=\"oC\" />\n+ <Atom charge=\"-0.172159\" name=\"C32\" type=\"cD\" />\n+ <Atom charge=\"0.054419\" name=\"H2X\" type=\"hL\" />\n+ <Atom charge=\"0.054419\" name=\"H2Y\" type=\"hL\" />\n+ <Atom charge=\"0.00151\" name=\"C23\" type=\"cD\" />\n+ <Atom charge=\"0.019108\" name=\"H3R\" type=\"hL\" />\n+ <Atom charge=\"0.019108\" name=\"H3S\" type=\"hL\" />\n+ <Atom charge=\"-0.024078\" name=\"C24\" type=\"cD\" />\n+ <Atom charge=\"0.02058\" name=\"H4R\" type=\"hL\" />\n+ <Atom charge=\"0.02058\" name=\"H4S\" type=\"hL\" />\n+ <Atom charge=\"-0.015735\" name=\"C25\" type=\"cD\" />\n+ <Atom charge=\"0.009551\" name=\"H5R\" type=\"hL\" />\n+ <Atom charge=\"0.009551\" name=\"H5S\" type=\"hL\" />\n+ <Atom charge=\"-0.019631\" name=\"C26\" type=\"cD\" />\n+ <Atom charge=\"0.010236\" name=\"H6R\" type=\"hL\" />\n+ <Atom charge=\"0.010236\" name=\"H6S\" type=\"hL\" />\n+ <Atom charge=\"-0.019279\" name=\"C27\" type=\"cD\" />\n+ <Atom charge=\"0.011207\" name=\"H7R\" type=\"hL\" />\n+ <Atom charge=\"0.011207\" name=\"H7S\" type=\"hL\" />\n+ <Atom charge=\"-0.020879\" name=\"C28\" type=\"cD\" />\n+ <Atom charge=\"0.010385\" name=\"H8R\" type=\"hL\" />\n+ <Atom charge=\"0.010385\" name=\"H8S\" type=\"hL\" />\n+ <Atom charge=\"-0.021975\" name=\"C29\" type=\"cD\" />\n+ <Atom charge=\"0.005869\" name=\"H9R\" type=\"hL\" />\n+ <Atom charge=\"0.005869\" name=\"H9S\" type=\"hL\" />\n+ <Atom charge=\"-0.019575\" name=\"C210\" type=\"cD\" />\n+ <Atom charge=\"0.015163\" name=\"H10R\" type=\"hL\" />\n+ <Atom charge=\"0.015163\" name=\"H10S\" type=\"hL\" />\n+ <Atom charge=\"0.02332\" name=\"C211\" type=\"cD\" />\n+ <Atom charge=\"0.008276\" name=\"H11R\" type=\"hL\" />\n+ <Atom charge=\"0.008276\" name=\"H11S\" type=\"hL\" />\n+ <Atom charge=\"-0.118534\" name=\"C212\" type=\"cD\" />\n+ <Atom charge=\"0.025809\" name=\"H12R\" type=\"hL\" />\n+ <Atom charge=\"0.025809\" name=\"H12S\" type=\"hL\" />\n+ <Atom charge=\"0.025809\" name=\"H12T\" type=\"hL\" />\n+ <Atom charge=\"0.00151\" name=\"C33\" type=\"cD\" />\n+ <Atom charge=\"0.019108\" name=\"H3X\" type=\"hL\" />\n+ <Atom charge=\"0.019108\" name=\"H3Y\" type=\"hL\" />\n+ <Atom charge=\"-0.024078\" name=\"C34\" type=\"cD\" />\n+ <Atom charge=\"0.02058\" name=\"H4X\" type=\"hL\" />\n+ <Atom charge=\"0.02058\" name=\"H4Y\" type=\"hL\" />\n+ <Atom charge=\"-0.015735\" name=\"C35\" type=\"cD\" />\n+ <Atom charge=\"0.009551\" name=\"H5X\" type=\"hL\" />\n+ <Atom charge=\"0.009551\" name=\"H5Y\" type=\"hL\" />\n+ <Atom charge=\"-0.019631\" name=\"C36\" type=\"cD\" />\n+ <Atom charge=\"0.010236\" name=\"H6X\" type=\"hL\" />\n+ <Atom charge=\"0.010236\" name=\"H6Y\" type=\"hL\" />\n+ <Atom charge=\"-0.019279\" name=\"C37\" type=\"cD\" />\n+ <Atom charge=\"0.011207\" name=\"H7X\" type=\"hL\" />\n+ <Atom charge=\"0.011207\" name=\"H7Y\" type=\"hL\" />\n+ <Atom charge=\"-0.020879\" name=\"C38\" type=\"cD\" />\n+ <Atom charge=\"0.010385\" name=\"H8X\" type=\"hL\" />\n+ <Atom charge=\"0.010385\" name=\"H8Y\" type=\"hL\" />\n+ <Atom charge=\"-0.021975\" name=\"C39\" type=\"cD\" />\n+ <Atom charge=\"0.005869\" name=\"H9X\" type=\"hL\" />\n+ <Atom charge=\"0.005869\" name=\"H9Y\" type=\"hL\" />\n+ <Atom charge=\"-0.019575\" name=\"C310\" type=\"cD\" />\n+ <Atom charge=\"0.015163\" name=\"H10X\" type=\"hL\" />\n+ <Atom charge=\"0.015163\" name=\"H10Y\" type=\"hL\" />\n+ <Atom charge=\"0.02332\" name=\"C311\" type=\"cD\" />\n+ <Atom charge=\"0.008276\" name=\"H11X\" type=\"hL\" />\n+ <Atom charge=\"0.008276\" name=\"H11Y\" type=\"hL\" />\n+ <Atom charge=\"-0.118534\" name=\"C312\" type=\"cD\" />\n+ <Atom charge=\"0.025809\" name=\"H12X\" type=\"hL\" />\n+ <Atom charge=\"0.025809\" name=\"H12Y\" type=\"hL\" />\n+ <Atom charge=\"0.025809\" name=\"H12Z\" type=\"hL\" />\n+ <Bond atomName1=\"O12\" atomName2=\"P\" />\n+ <Bond atomName1=\"P\" atomName2=\"O11\" />\n+ <Bond atomName1=\"P\" atomName2=\"O13\" />\n+ <Bond atomName1=\"P\" atomName2=\"O14\" />\n+ <Bond atomName1=\"O12\" atomName2=\"H12\" />\n+ <Bond atomName1=\"O11\" atomName2=\"C1\" />\n+ <Bond atomName1=\"C1\" atomName2=\"HA\" />\n+ <Bond atomName1=\"C1\" atomName2=\"HB\" />\n+ <Bond atomName1=\"C1\" atomName2=\"C2\" />\n+ <Bond atomName1=\"C2\" atomName2=\"HS\" />\n+ <Bond atomName1=\"C2\" atomName2=\"C3\" />\n+ <Bond atomName1=\"C2\" atomName2=\"O21\" />\n+ <Bond atomName1=\"C3\" atomName2=\"HX\" />\n+ <Bond atomName1=\"C3\" atomName2=\"HY\" />\n+ <Bond atomName1=\"C3\" atomName2=\"O31\" />\n+ <Bond atomName1=\"O21\" atomName2=\"C21\" />\n+ <Bond atomName1=\"C21\" atomName2=\"C22\" />\n+ <Bond atomName1=\"C21\" atomName2=\"O22\" />\n+ <Bond atomName1=\"C22\" atomName2=\"H2R\" />\n+ <Bond atomName1=\"C22\" atomName2=\"H2S\" />\n+ <Bond atomName1=\"C22\" atomName2=\"C23\" />\n+ <Bond atomName1=\"C23\" atomName2=\"H3R\" />\n+ <Bond atomName1=\"C23\" atomName2=\"H3S\" />\n+ <Bond atomName1=\"C23\" atomName2=\"C24\" />\n+ <Bond atomName1=\"C24\" atomName2=\"H4R\" />\n+ <Bond atomName1=\"C24\" atomName2=\"H4S\" />\n+ <Bond atomName1=\"C24\" atomName2=\"C25\" />\n+ <Bond atomName1=\"C25\" atomName2=\"H5R\" />\n+ <Bond atomName1=\"C25\" atomName2=\"H5S\" />\n+ <Bond atomName1=\"C25\" atomName2=\"C26\" />\n+ <Bond atomName1=\"C26\" atomName2=\"H6R\" />\n+ <Bond atomName1=\"C26\" atomName2=\"H6S\" />\n+ <Bond atomName1=\"C26\" atomName2=\"C27\" />\n+ <Bond atomName1=\"C27\" atomName2=\"H7R\" />\n+ <Bond atomName1=\"C27\" atomName2=\"H7S\" />\n+ <Bond atomName1=\"C27\" atomName2=\"C28\" />\n+ <Bond atomName1=\"C28\" atomName2=\"H8R\" />\n+ <Bond atomName1=\"C28\" atomName2=\"H8S\" />\n+ <Bond atomName1=\"C28\" atomName2=\"C29\" />\n+ <Bond atomName1=\"C29\" atomName2=\"H9R\" />\n+ <Bond atomName1=\"C29\" atomName2=\"H9S\" />\n+ <Bond atomName1=\"C29\" atomName2=\"C210\" />\n+ <Bond atomName1=\"C210\" atomName2=\"H10R\" />\n+ <Bond atomName1=\"C210\" atomName2=\"H10S\" />\n+ <Bond atomName1=\"C210\" atomName2=\"C211\" />\n+ <Bond atomName1=\"C211\" atomName2=\"H11R\" />\n+ <Bond atomName1=\"C211\" atomName2=\"H11S\" />\n+ <Bond atomName1=\"C211\" atomName2=\"C212\" />\n+ <Bond atomName1=\"C212\" atomName2=\"H12R\" />\n+ <Bond atomName1=\"C212\" atomName2=\"H12S\" />\n+ <Bond atomName1=\"C212\" atomName2=\"H12T\" />\n+ <Bond atomName1=\"O31\" atomName2=\"C31\" />\n+ <Bond atomName1=\"C31\" atomName2=\"C32\" />\n+ <Bond atomName1=\"C31\" atomName2=\"O32\" />\n+ <Bond atomName1=\"C32\" atomName2=\"H2X\" />\n+ <Bond atomName1=\"C32\" atomName2=\"H2Y\" />\n+ <Bond atomName1=\"C32\" atomName2=\"C33\" />\n+ <Bond atomName1=\"C33\" atomName2=\"H3X\" />\n+ <Bond atomName1=\"C33\" atomName2=\"H3Y\" />\n+ <Bond atomName1=\"C33\" atomName2=\"C34\" />\n+ <Bond atomName1=\"C34\" atomName2=\"H4X\" />\n+ <Bond atomName1=\"C34\" atomName2=\"H4Y\" />\n+ <Bond atomName1=\"C34\" atomName2=\"C35\" />\n+ <Bond atomName1=\"C35\" atomName2=\"H5X\" />\n+ <Bond atomName1=\"C35\" atomName2=\"H5Y\" />\n+ <Bond atomName1=\"C35\" atomName2=\"C36\" />\n+ <Bond atomName1=\"C36\" atomName2=\"H6X\" />\n+ <Bond atomName1=\"C36\" atomName2=\"H6Y\" />\n+ <Bond atomName1=\"C36\" atomName2=\"C37\" />\n+ <Bond atomName1=\"C37\" atomName2=\"H7X\" />\n+ <Bond atomName1=\"C37\" atomName2=\"H7Y\" />\n+ <Bond atomName1=\"C37\" atomName2=\"C38\" />\n+ <Bond atomName1=\"C38\" atomName2=\"H8X\" />\n+ <Bond atomName1=\"C38\" atomName2=\"H8Y\" />\n+ <Bond atomName1=\"C38\" atomName2=\"C39\" />\n+ <Bond atomName1=\"C39\" atomName2=\"H9X\" />\n+ <Bond atomName1=\"C39\" atomName2=\"H9Y\" />\n+ <Bond atomName1=\"C39\" atomName2=\"C310\" />\n+ <Bond atomName1=\"C310\" atomName2=\"H10X\" />\n+ <Bond atomName1=\"C310\" atomName2=\"H10Y\" />\n+ <Bond atomName1=\"C310\" atomName2=\"C311\" />\n+ <Bond atomName1=\"C311\" atomName2=\"H11X\" />\n+ <Bond atomName1=\"C311\" atomName2=\"H11Y\" />\n+ <Bond atomName1=\"C311\" atomName2=\"C312\" />\n+ <Bond atomName1=\"C312\" atomName2=\"H12X\" />\n+ <Bond atomName1=\"C312\" atomName2=\"H12Y\" />\n+ <Bond atomName1=\"C312\" atomName2=\"H12Z\" />\n+ </Residue>\n+ <Residue name=\"DLPG\">\n+ <Atom charge=\"0.193597\" name=\"C13\" type=\"cA\" />\n+ <Atom charge=\"0.034715\" name=\"H13A\" type=\"hE\" />\n+ <Atom charge=\"0.034715\" name=\"H13B\" type=\"hE\" />\n+ <Atom charge=\"-0.700871\" name=\"OC3\" type=\"oH\" />\n+ <Atom charge=\"0.423328\" name=\"HO3\" type=\"hO\" />\n+ <Atom charge=\"0.336816\" name=\"C12\" type=\"cA\" />\n+ <Atom charge=\"0.030042\" name=\"H12A\" type=\"hE\" />\n+ <Atom charge=\"-0.726192\" name=\"OC2\" type=\"oH\" />\n+ <Atom charge=\"0.439523\" name=\"HO2\" type=\"hO\" />\n+ <Atom charge=\"-0.056706\" name=\"C11\" type=\"cA\" />\n+ <Atom charge=\"0.093354\" name=\"H11A\" type=\"hE\" />\n+ <Atom charge=\"0.093354\" name=\"H11B\" type=\"hE\" />\n+ <Atom charge=\"1.380464\" name=\"P\" type=\"pA\" />\n+ <Atom charge=\"-0.873444\" name=\"O13\" type=\"oP\" />\n+ <Atom charge=\"-0.873444\" name=\"O14\" type=\"oP\" />\n+ <Atom charge=\"-0.534308\" name=\"O12\" type=\"oT\" />\n+ <Atom charge=\"-0.546098\" name=\"O11\" type=\"oT\" />\n+ <Atom charge=\"0.043713\" name=\"C1\" type=\"cA\" />\n+ <Atom charge=\"0.091041\" name=\"HA\" type=\"hE\" />\n+ <Atom charge=\"0.091041\" name=\"HB\" type=\"hE\" />\n+ <Atom charge=\"0.353807\" name=\"C2\" type=\"cA\" />\n+ <Atom charge=\"0.037488\" name=\"HS\" type=\"hE\" />\n+ <Atom charge=\"-0.599131\" name=\"O21\" type=\"oS\" />\n+ <Atom charge=\"0.883669\" name=\"C21\" type=\"cC\" />\n+ <Atom charge=\"-0.655762\" name=\"O22\" type=\"oC\" />\n+ <Atom charge=\"-0.172159\" name=\"C22\" type=\"cD\" />\n+ <Atom charge=\"0.054419\" name=\"H2R\" type=\"hL\" />\n+ <Atom charge=\"0.054419\" name=\"H2S\" type=\"hL\" />\n+ <Atom charge=\"0.295119\" name=\"C3\" type=\"cA\" />\n+ <Atom charge=\"0.033797\" name=\"HX\" type=\"hE\" />\n+ <Atom charge=\"0.033797\" name=\"HY\" type=\"hE\" />\n+ <Atom charge=\"-0.585165\" name=\"O31\" type=\"oS\" />\n+ <Atom charge=\"0.877006\" name=\"C31\" type=\"cC\" />\n+ <Atom charge=\"-0.649265\" name=\"O32\" type=\"oC\" />\n+ <Atom charge=\"-0.172159\" name=\"C32\" type=\"cD\" />\n+ <Atom charge=\"0.054419\" name=\"H2X\" type=\"hL\" />\n+ <Atom charge=\"0.054419\" name=\"H2Y\" type=\"hL\" />\n+ <Atom charge=\"0.00151\" name=\"C23\" type=\"cD\" />\n+ <Atom charge=\"0.019108\" name=\"H3R\" type=\"hL\" />\n+ <Atom charge=\"0.019108\" name=\"H3S\" type=\"hL\" />\n+ <Atom charge=\"-0.024078\" name=\"C24\" type=\"cD\" />\n+ <Atom charge=\"0.02058\" name=\"H4R\" type=\"hL\" />\n+ <Atom charge=\"0.02058\" name=\"H4S\" type=\"hL\" />\n+ <Atom charge=\"-0.015735\" name=\"C25\" type=\"cD\" />\n+ <Atom charge=\"0.009551\" name=\"H5R\" type=\"hL\" />\n+ <Atom charge=\"0.009551\" name=\"H5S\" type=\"hL\" />\n+ <Atom charge=\"-0.019631\" name=\"C26\" type=\"cD\" />\n+ <Atom charge=\"0.010236\" name=\"H6R\" type=\"hL\" />\n+ <Atom charge=\"0.010236\" name=\"H6S\" type=\"hL\" />\n+ <Atom charge=\"-0.019279\" name=\"C27\" type=\"cD\" />\n+ <Atom charge=\"0.011207\" name=\"H7R\" type=\"hL\" />\n+ <Atom charge=\"0.011207\" name=\"H7S\" type=\"hL\" />\n+ <Atom charge=\"-0.020879\" name=\"C28\" type=\"cD\" />\n+ <Atom charge=\"0.010385\" name=\"H8R\" type=\"hL\" />\n+ <Atom charge=\"0.010385\" name=\"H8S\" type=\"hL\" />\n+ <Atom charge=\"-0.021975\" name=\"C29\" type=\"cD\" />\n+ <Atom charge=\"0.005869\" name=\"H9R\" type=\"hL\" />\n+ <Atom charge=\"0.005869\" name=\"H9S\" type=\"hL\" />\n+ <Atom charge=\"-0.019575\" name=\"C210\" type=\"cD\" />\n+ <Atom charge=\"0.015163\" name=\"H10R\" type=\"hL\" />\n+ <Atom charge=\"0.015163\" name=\"H10S\" type=\"hL\" />\n+ <Atom charge=\"0.02332\" name=\"C211\" type=\"cD\" />\n+ <Atom charge=\"0.008276\" name=\"H11R\" type=\"hL\" />\n+ <Atom charge=\"0.008276\" name=\"H11S\" type=\"hL\" />\n+ <Atom charge=\"-0.118534\" name=\"C212\" type=\"cD\" />\n+ <Atom charge=\"0.025809\" name=\"H12R\" type=\"hL\" />\n+ <Atom charge=\"0.025809\" name=\"H12S\" type=\"hL\" />\n+ <Atom charge=\"0.025809\" name=\"H12T\" type=\"hL\" />\n+ <Atom charge=\"0.00151\" name=\"C33\" type=\"cD\" />\n+ <Atom charge=\"0.019108\" name=\"H3X\" type=\"hL\" />\n+ <Atom charge=\"0.019108\" name=\"H3Y\" type=\"hL\" />\n+ <Atom charge=\"-0.024078\" name=\"C34\" type=\"cD\" />\n+ <Atom charge=\"0.02058\" name=\"H4X\" type=\"hL\" />\n+ <Atom charge=\"0.02058\" name=\"H4Y\" type=\"hL\" />\n+ <Atom charge=\"-0.015735\" name=\"C35\" type=\"cD\" />\n+ <Atom charge=\"0.009551\" name=\"H5X\" type=\"hL\" />\n+ <Atom charge=\"0.009551\" name=\"H5Y\" type=\"hL\" />\n+ <Atom charge=\"-0.019631\" name=\"C36\" type=\"cD\" />\n+ <Atom charge=\"0.010236\" name=\"H6X\" type=\"hL\" />\n+ <Atom charge=\"0.010236\" name=\"H6Y\" type=\"hL\" />\n+ <Atom charge=\"-0.019279\" name=\"C37\" type=\"cD\" />\n+ <Atom charge=\"0.011207\" name=\"H7X\" type=\"hL\" />\n+ <Atom charge=\"0.011207\" name=\"H7Y\" type=\"hL\" />\n+ <Atom charge=\"-0.020879\" name=\"C38\" type=\"cD\" />\n+ <Atom charge=\"0.010385\" name=\"H8X\" type=\"hL\" />\n+ <Atom charge=\"0.010385\" name=\"H8Y\" type=\"hL\" />\n+ <Atom charge=\"-0.021975\" name=\"C39\" type=\"cD\" />\n+ <Atom charge=\"0.005869\" name=\"H9X\" type=\"hL\" />\n+ <Atom charge=\"0.005869\" name=\"H9Y\" type=\"hL\" />\n+ <Atom charge=\"-0.019575\" name=\"C310\" type=\"cD\" />\n+ <Atom charge=\"0.015163\" name=\"H10X\" type=\"hL\" />\n+ <Atom charge=\"0.015163\" name=\"H10Y\" type=\"hL\" />\n+ <Atom charge=\"0.02332\" name=\"C311\" type=\"cD\" />\n+ <Atom charge=\"0.008276\" name=\"H11X\" type=\"hL\" />\n+ <Atom charge=\"0.008276\" name=\"H11Y\" type=\"hL\" />\n+ <Atom charge=\"-0.118534\" name=\"C312\" type=\"cD\" />\n+ <Atom charge=\"0.025809\" name=\"H12X\" type=\"hL\" />\n+ <Atom charge=\"0.025809\" name=\"H12Y\" type=\"hL\" />\n+ <Atom charge=\"0.025809\" name=\"H12Z\" type=\"hL\" />\n+ <Bond atomName1=\"HO3\" atomName2=\"OC3\" />\n+ <Bond atomName1=\"OC3\" atomName2=\"C13\" />\n+ <Bond atomName1=\"C13\" atomName2=\"H13A\" />\n+ <Bond atomName1=\"C13\" atomName2=\"H13B\" />\n+ <Bond atomName1=\"C13\" atomName2=\"C12\" />\n+ <Bond atomName1=\"HO2\" atomName2=\"OC2\" />\n+ <Bond atomName1=\"OC2\" atomName2=\"C12\" />\n+ <Bond atomName1=\"C12\" atomName2=\"H12A\" />\n+ <Bond atomName1=\"C12\" atomName2=\"C11\" />\n+ <Bond atomName1=\"C11\" atomName2=\"H11A\" />\n+ <Bond atomName1=\"C11\" atomName2=\"H11B\" />\n+ <Bond atomName1=\"C11\" atomName2=\"O12\" />\n+ <Bond atomName1=\"O11\" atomName2=\"C1\" />\n+ <Bond atomName1=\"O12\" atomName2=\"P\" />\n+ <Bond atomName1=\"P\" atomName2=\"O11\" />\n+ <Bond atomName1=\"P\" atomName2=\"O13\" />\n+ <Bond atomName1=\"P\" atomName2=\"O14\" />\n+ <Bond atomName1=\"C1\" atomName2=\"HA\" />\n+ <Bond atomName1=\"C1\" atomName2=\"HB\" />\n+ <Bond atomName1=\"C1\" atomName2=\"C2\" />\n+ <Bond atomName1=\"C2\" atomName2=\"HS\" />\n+ <Bond atomName1=\"C2\" atomName2=\"C3\" />\n+ <Bond atomName1=\"C2\" atomName2=\"O21\" />\n+ <Bond atomName1=\"C3\" atomName2=\"HX\" />\n+ <Bond atomName1=\"C3\" atomName2=\"HY\" />\n+ <Bond atomName1=\"C3\" atomName2=\"O31\" />\n+ <Bond atomName1=\"O21\" atomName2=\"C21\" />\n+ <Bond atomName1=\"C21\" atomName2=\"C22\" />\n+ <Bond atomName1=\"C21\" atomName2=\"O22\" />\n+ <Bond atomName1=\"C22\" atomName2=\"H2R\" />\n+ <Bond atomName1=\"C22\" atomName2=\"H2S\" />\n+ <Bond atomName1=\"C22\" atomName2=\"C23\" />\n+ <Bond atomName1=\"C23\" atomName2=\"H3R\" />\n+ <Bond atomName1=\"C23\" atomName2=\"H3S\" />\n+ <Bond atomName1=\"C23\" atomName2=\"C24\" />\n+ <Bond atomName1=\"C24\" atomName2=\"H4R\" />\n+ <Bond atomName1=\"C24\" atomName2=\"H4S\" />\n+ <Bond atomName1=\"C24\" atomName2=\"C25\" />\n+ <Bond atomName1=\"C25\" atomName2=\"H5R\" />\n+ <Bond atomName1=\"C25\" atomName2=\"H5S\" />\n+ <Bond atomName1=\"C25\" atomName2=\"C26\" />\n+ <Bond atomName1=\"C26\" atomName2=\"H6R\" />\n+ <Bond atomName1=\"C26\" atomName2=\"H6S\" />\n+ <Bond atomName1=\"C26\" atomName2=\"C27\" />\n+ <Bond atomName1=\"C27\" atomName2=\"H7R\" />\n+ <Bond atomName1=\"C27\" atomName2=\"H7S\" />\n+ <Bond atomName1=\"C27\" atomName2=\"C28\" />\n+ <Bond atomName1=\"C28\" atomName2=\"H8R\" />\n+ <Bond atomName1=\"C28\" atomName2=\"H8S\" />\n+ <Bond atomName1=\"C28\" atomName2=\"C29\" />\n+ <Bond atomName1=\"C29\" atomName2=\"H9R\" />\n+ <Bond atomName1=\"C29\" atomName2=\"H9S\" />\n+ <Bond atomName1=\"C29\" atomName2=\"C210\" />\n+ <Bond atomName1=\"C210\" atomName2=\"H10R\" />\n+ <Bond atomName1=\"C210\" atomName2=\"H10S\" />\n+ <Bond atomName1=\"C210\" atomName2=\"C211\" />\n+ <Bond atomName1=\"C211\" atomName2=\"H11R\" />\n+ <Bond atomName1=\"C211\" atomName2=\"H11S\" />\n+ <Bond atomName1=\"C211\" atomName2=\"C212\" />\n+ <Bond atomName1=\"C212\" atomName2=\"H12R\" />\n+ <Bond atomName1=\"C212\" atomName2=\"H12S\" />\n+ <Bond atomName1=\"C212\" atomName2=\"H12T\" />\n+ <Bond atomName1=\"O31\" atomName2=\"C31\" />\n+ <Bond atomName1=\"C31\" atomName2=\"C32\" />\n+ <Bond atomName1=\"C31\" atomName2=\"O32\" />\n+ <Bond atomName1=\"C32\" atomName2=\"H2X\" />\n+ <Bond atomName1=\"C32\" atomName2=\"H2Y\" />\n+ <Bond atomName1=\"C32\" atomName2=\"C33\" />\n+ <Bond atomName1=\"C33\" atomName2=\"H3X\" />\n+ <Bond atomName1=\"C33\" atomName2=\"H3Y\" />\n+ <Bond atomName1=\"C33\" atomName2=\"C34\" />\n+ <Bond atomName1=\"C34\" atomName2=\"H4X\" />\n+ <Bond atomName1=\"C34\" atomName2=\"H4Y\" />\n+ <Bond atomName1=\"C34\" atomName2=\"C35\" />\n+ <Bond atomName1=\"C35\" atomName2=\"H5X\" />\n+ <Bond atomName1=\"C35\" atomName2=\"H5Y\" />\n+ <Bond atomName1=\"C35\" atomName2=\"C36\" />\n+ <Bond atomName1=\"C36\" atomName2=\"H6X\" />\n+ <Bond atomName1=\"C36\" atomName2=\"H6Y\" />\n+ <Bond atomName1=\"C36\" atomName2=\"C37\" />\n+ <Bond atomName1=\"C37\" atomName2=\"H7X\" />\n+ <Bond atomName1=\"C37\" atomName2=\"H7Y\" />\n+ <Bond atomName1=\"C37\" atomName2=\"C38\" />\n+ <Bond atomName1=\"C38\" atomName2=\"H8X\" />\n+ <Bond atomName1=\"C38\" atomName2=\"H8Y\" />\n+ <Bond atomName1=\"C38\" atomName2=\"C39\" />\n+ <Bond atomName1=\"C39\" atomName2=\"H9X\" />\n+ <Bond atomName1=\"C39\" atomName2=\"H9Y\" />\n+ <Bond atomName1=\"C39\" atomName2=\"C310\" />\n+ <Bond atomName1=\"C310\" atomName2=\"H10X\" />\n+ <Bond atomName1=\"C310\" atomName2=\"H10Y\" />\n+ <Bond atomName1=\"C310\" atomName2=\"C311\" />\n+ <Bond atomName1=\"C311\" atomName2=\"H11X\" />\n+ <Bond atomName1=\"C311\" atomName2=\"H11Y\" />\n+ <Bond atomName1=\"C311\" atomName2=\"C312\" />\n+ <Bond atomName1=\"C312\" atomName2=\"H12X\" />\n+ <Bond atomName1=\"C312\" atomName2=\"H12Y\" />\n+ <Bond atomName1=\"C312\" atomName2=\"H12Z\" />\n+ </Residue>\n+ <Residue name=\"DMPC\">\n+ <Atom charge=\"0.245262\" name=\"N\" type=\"nA\" />\n+ <Atom charge=\"-0.338973\" name=\"C13\" type=\"cA\" />\n+ <Atom charge=\"0.17223\" name=\"H13A\" type=\"hX\" />\n+ <Atom charge=\"0.17223\" name=\"H13B\" type=\"hX\" />\n+ <Atom charge=\"0.17223\" name=\"H13C\" type=\"hX\" />\n+ <Atom charge=\"-0.338973\" name=\"C14\" type=\"cA\" />\n+ <Atom charge=\"0.17223\" name=\"H14A\" type=\"hX\" />\n+ <Atom charge=\"0.17223\" name=\"H14B\" type=\"hX\" />\n+ <Atom charge=\"0.17223\" name=\"H14C\" type=\"hX\" />\n+ <Atom charge=\"-0.338973\" name=\"C15\" type=\"cA\" />\n+ <Atom charge=\"0.17223\" name=\"H15A\" type=\"hX\" />\n+ <Atom charge=\"0.17223\" name=\"H15B\" type=\"hX\" />\n+ <Atom charge=\"0.17223\" name=\"H15C\" type=\"hX\" />\n+ <Atom charge=\"-0.170824\" name=\"C12\" type=\"cA\" />\n+ <Atom charge=\"0.136415\" name=\"H12A\" type=\"hX\" />\n+ <Atom charge=\"0.136415\" name=\"H12B\" type=\"hX\" />\n+ <Atom charge=\"0.166801\" name=\"C11\" type=\"cA\" />\n+ <Atom charge=\"0.078534\" name=\"H11A\" type=\"hE\" />\n+ <Atom charge=\"0.078534\" name=\"H11B\" type=\"hE\" />\n+ <Atom charge=\"1.339721\" name=\"P\" type=\"pA\" />\n+ <Atom charge=\"-0.875812\" name=\"O13\" type=\"oP\" />\n+ <Atom charge=\"-0.875812\" name=\"O14\" type=\"oP\" />\n+ <Atom charge=\"-0.50948\" name=\"O11\" type=\"oT\" />\n+ <Atom charge=\"-0.508176\" name=\"O12\" type=\"oT\" />\n+ <Atom charge=\"0.017459\" name=\"C1\" type=\"cA\" />\n+ <Atom charge=\"0.095591\" name=\"HA\" type=\"hE\" />\n+ <Atom charge=\"0.095591\" name=\"HB\" type=\"hE\" />\n+ <Atom charge=\"0.281242\" name=\"C2\" type=\"cA\" />\n+ <Atom charge=\"0.063253\" name=\"HS\" type=\"hE\" />\n+ <Atom charge=\"-0.552948\" name=\"O21\" type=\"oS\" />\n+ <Atom charge=\"0.897613\" name=\"C21\" type=\"cC\" />\n+ <Atom charge=\"-0.673755\" name=\"O22\" type=\"oC\" />\n+ <Atom charge=\"-0.1642\" name=\"C22\" type=\"cD\" />\n+ <Atom charge=\"0.053944\" name=\"H2R\" type=\"hL\" />\n+ <Atom charge=\"0.053944\" name=\"H2S\" type=\"hL\" />\n+ <Atom charge=\"0.196939\" name=\"C3\" type=\"cA\" />\n+ <Atom charge=\"0.070469\" name=\"HX\" type=\"hE\" />\n+ <Atom charge=\"0.070469\" name=\"HY\" type=\"hE\" />\n+ <Atom charge=\"-0.575489\" name=\"O31\" type=\"oS\" />\n+ <Atom charge=\"0.910403\" name=\"C31\" type=\"cC\" />\n+ <Atom charge=\"-0.671566\" name=\"O32\" type=\"oC\" />\n+ <Atom charge=\"-0.1642\" name=\"C32\" type=\"cD\" />\n+ <Atom charge=\"0.053944\" name=\"H2X\" type=\"hL\" />\n+ <Atom charge=\"0.053944\" name=\"H2Y\" type=\"hL\" />\n+ <Atom charge=\"-0.002435\" name=\"C23\" type=\"cD\" />\n+ <Atom charge=\"0.018859\" name=\"H3R\" type=\"hL\" />\n+ <Atom charge=\"0.018859\" name=\"H3S\" type=\"hL\" />\n+ <Atom charge=\"-0.026954\" name=\"C24\" type=\"cD\" />\n+ <Atom charge=\"0.020431\" name=\"H4R\" type=\"hL\" />\n+ <Atom charge=\"0.020431\" name=\"H4S\" type=\"hL\" />\n+ <Atom charge=\"-0.016521\" name=\"C25\" type=\"cD\" />\n+ <Atom charge=\"0.010573\" name=\"H5R\" type=\"hL\" />\n+ <Atom charge=\"0.010573\" name=\"H5S\" type=\"hL\" />\n+ <Atom charge=\"-0.027812\" name=\"C26\" type=\"cD\" />\n+ <Atom charge=\"0.011511\" name=\"H6R\" type=\"hL\" />\n+ <Atom charge=\"0.011511\" name=\"H6S\" type=\"hL\" />\n+ <Atom charge=\"-0.004386\" name=\"C27\" type=\"cD\" />\n+ <Atom charge=\"0.006833\" name=\"H7R\" type=\"hL\" />\n+ <Atom charge=\"0.006833\" name=\"H7S\" type=\"hL\" />\n+ <Atom charge=\"-0.026451\" name=\"C28\" type=\"cD\" />\n+ <Atom charge=\"0.011241\" name=\"H8R\" type=\"hL\" />\n+ <Atom charge=\"0.011241\" name=\"H8S\" type=\"hL\" />\n+ <Atom charge=\"-0.014653\" name=\"C29\" type=\"cD\" />\n+ <Atom charge=\"0.010172\" name=\"H9R\" type=\"hL\" />\n+ <Atom charge=\"0.010172\" name=\"H9S\" type=\"hL\" />\n+ <Atom charge=\"-0.021025\" name=\"C210\" type=\"cD\" />\n+ <Atom charge=\"0.010037\" name=\"H10R\" type=\"hL\" />\n+ <Atom charge=\"0.010037\" name=\"H10S\" type=\"hL\" />\n+ <Atom charge=\"-0.031787\" name=\"C211\" type=\"cD\" />\n+ <Atom charge=\"0.012677\" name=\"H11R\" type=\"hL\" />\n+ <Atom charge=\"0.012677\" name=\"H11S\" type=\"hL\" />\n+ <Atom charge=\"-0.028094\" name=\"C212\" type=\"cD\" />\n+ <Atom charge=\"0.017208\" name=\"H12R\" type=\"hL\" />\n+ <Atom charge=\"0.017208\" name=\"H12S\" type=\"hL\" />\n+ <Atom charge=\"0.017463\" name=\"C213\" type=\"cD\" />\n+ <Atom charge=\"0.007531\" name=\"H13R\" type=\"hL\" />\n+ <Atom charge=\"0.007531\" name=\"H13S\" type=\"hL\" />\n+ <Atom charge=\"-0.111712\" name=\"C214\" type=\"cD\" />\n+ <Atom charge=\"0.025511\" name=\"H14R\" type=\"hL\" />\n+ <Atom charge=\"0.025511\" name=\"H14S\" type=\"hL\" />\n+ <Atom charge=\"0.025511\" name=\"H14T\" type=\"hL\" />\n+ <Atom charge=\"-0.002435\" name=\"C33\" type=\"cD\" />\n+ <Atom charge=\"0.018859\" name=\"H3X\" type=\"hL\" />\n+ <Atom charge=\"0.018859\" name=\"H3Y\" type=\"hL\" />\n+ <Atom charge=\"-0.026954\" name=\"C34\" type=\"cD\" />\n+ <Atom charge=\"0.020431\" name=\"H4X\" type=\"hL\" />\n+ <Atom charge=\"0.020431\" name=\"H4Y\" type=\"hL\" />\n+ <Atom charge=\"-0.016521\" name=\"C35\" type=\"cD\" />\n+ <Atom charge=\"0.010573\" name=\"H5X\" type=\"hL\" />\n+ <Atom charge=\"0.010573\" name=\"H5Y\" type=\"hL\" />\n+ <Atom charge=\"-0.027812\" name=\"C36\" type=\"cD\" />\n+ <Atom charge=\"0.011511\" name=\"H6X\" type=\"hL\" />\n+ <Atom charge=\"0.011511\" name=\"H6Y\" type=\"hL\" />\n+ <Atom charge=\"-0.004386\" name=\"C37\" type=\"cD\" />\n+ <Atom charge=\"0.006833\" name=\"H7X\" type=\"hL\" />\n+ <Atom charge=\"0.006833\" name=\"H7Y\" type=\"hL\" />\n+ <Atom charge=\"-0.026451\" name=\"C38\" type=\"cD\" />\n+ <Atom charge=\"0.011241\" name=\"H8X\" type=\"hL\" />\n+ <Atom charge=\"0.011241\" name=\"H8Y\" type=\"hL\" />\n+ <Atom charge=\"-0.014653\" name=\"C39\" type=\"cD\" />\n+ <Atom charge=\"0.010172\" name=\"H9X\" type=\"hL\" />\n+ <Atom charge=\"0.010172\" name=\"H9Y\" type=\"hL\" />\n+ <Atom charge=\"-0.021025\" name=\"C310\" type=\"cD\" />\n+ <Atom charge=\"0.010037\" name=\"H10X\" type=\"hL\" />\n+ <Atom charge=\"0.010037\" name=\"H10Y\" type=\"hL\" />\n+ <Atom charge=\"-0.031787\" name=\"C311\" type=\"cD\" />\n+ <Atom charge=\"0.012677\" name=\"H11X\" type=\"hL\" />\n+ <Atom charge=\"0.012677\" name=\"H11Y\" type=\"hL\" />\n+ <Atom charge=\"-0.028094\" name=\"C312\" type=\"cD\" />\n+ <Atom charge=\"0.017208\" name=\"H12X\" type=\"hL\" />\n+ <Atom charge=\"0.017208\" name=\"H12Y\" type=\"hL\" />\n+ <Atom charge=\"0.017463\" name=\"C313\" type=\"cD\" />\n+ <Atom charge=\"0.007531\" name=\"H13X\" type=\"hL\" />\n+ <Atom charge=\"0.007531\" name=\"H13Y\" type=\"hL\" />\n+ <Atom charge=\"-0.111712\" name=\"C314\" type=\"cD\" />\n+ <Atom charge=\"0.025511\" name=\"H14X\" type=\"hL\" />\n+ <Atom charge=\"0.025511\" name=\"H14Y\" type=\"hL\" />\n+ <Atom charge=\"0.025511\" name=\"H14Z\" type=\"hL\" />\n+ <Bond atomName1=\"N\" atomName2=\"C13\" />\n+ <Bond atomName1=\"N\" atomName2=\"C14\" />\n+ <Bond atomName1=\"N\" atomName2=\"C15\" />\n+ <Bond atomName1=\"C13\" atomName2=\"H13A\" />\n+ <Bond atomName1=\"C13\" atomName2=\"H13B\" />\n+ <Bond atomName1=\"C13\" atomName2=\"H13C\" />\n+ <Bond atomName1=\"C14\" atomName2=\"H14A\" />\n+ <Bond atomName1=\"C14\" atomName2=\"H14B\" />\n+ <Bond atomName1=\"C14\" atomName2=\"H14C\" />\n+ <Bond atomName1=\"C15\" atomName2=\"H15A\" />\n+ <Bond atomName1=\"C15\" atomName2=\"H15B\" />\n+ <Bond atomName1=\"C15\" atomName2=\"H15C\" />\n+ <Bond atomName1=\"N\" atomName2=\"C12\" />\n+ <Bond atomName1=\"C12\" atomName2=\"H12A\" />\n+ <Bond atomName1=\"C12\" atomName2=\"H12B\" />\n+ <Bond atomName1=\"C12\" atomName2=\"C11\" />\n+ <Bond atomName1=\"C11\" atomName2=\"H11A\" />\n+ <Bond atomName1=\"C11\" atomName2=\"H11B\" />\n+ <Bond atomName1=\"C11\" atomName2=\"O12\" />\n+ <Bond atomName1=\"O12\" atomName2=\"P\" />\n+ <Bond atomName1=\"P\" atomName2=\"O11\" />\n+ <Bond atomName1=\"P\" atomName2=\"O13\" />\n+ <Bond atomName1=\"P\" atomName2=\"O14\" />\n+ <Bond atomName1=\"C1\" atomName2=\"HA\" />\n+ <Bond atomName1=\"C1\" atomName2=\"HB\" />\n+ <Bond atomName1=\"C1\" atomName2=\"C2\" />\n+ <Bond atomName1=\"C1\" atomName2=\"O11\" />\n+ <Bond atomName1=\"C2\" atomName2=\"HS\" />\n+ <Bond atomName1=\"C2\" atomName2=\"C3\" />\n+ <Bond atomName1=\"C2\" atomName2=\"O21\" />\n+ <Bond atomName1=\"C3\" atomName2=\"HX\" />\n+ <Bond atomName1=\"C3\" atomName2=\"HY\" />\n+ <Bond atomName1=\"C3\" atomName2=\"O31\" />\n+ <Bond atomName1=\"O21\" atomName2=\"C21\" />\n+ <Bond atomName1=\"C21\" atomName2=\"C22\" />\n+ <Bond atomName1=\"C21\" atomName2=\"O22\" />\n+ <Bond atomName1=\"C22\" atomName2=\"H2R\" />\n+ <Bond atomName1=\"C22\" atomName2=\"H2S\" />\n+ <Bond atomName1=\"C22\" atomName2=\"C23\" />\n+ <Bond atomName1=\"C23\" atomName2=\"H3R\" />\n+ <Bond atomName1=\"C23\" atomName2=\"H3S\" />\n+ <Bond atomName1=\"C23\" atomName2=\"C24\" />\n+ <Bond atomName1=\"C24\" atomName2=\"H4R\" />\n+ <Bond atomName1=\"C24\" atomName2=\"H4S\" />\n+ <Bond atomName1=\"C24\" atomName2=\"C25\" />\n+ <Bond atomName1=\"C25\" atomName2=\"H5R\" />\n+ <Bond atomName1=\"C25\" atomName2=\"H5S\" />\n+ <Bond atomName1=\"C25\" atomName2=\"C26\" />\n+ <Bond atomName1=\"C26\" atomName2=\"H6R\" />\n+ <Bond atomName1=\"C26\" atomName2=\"H6S\" />\n+ <Bond atomName1=\"C26\" atomName2=\"C27\" />\n+ <Bond atomName1=\"C27\" atomName2=\"H7R\" />\n+ <Bond atomName1=\"C27\" atomName2=\"H7S\" />\n+ <Bond atomName1=\"C27\" atomName2=\"C28\" />\n+ <Bond atomName1=\"C28\" atomName2=\"H8R\" />\n+ <Bond atomName1=\"C28\" atomName2=\"H8S\" />\n+ <Bond atomName1=\"C28\" atomName2=\"C29\" />\n+ <Bond atomName1=\"C29\" atomName2=\"H9R\" />\n+ <Bond atomName1=\"C29\" atomName2=\"H9S\" />\n+ <Bond atomName1=\"C29\" atomName2=\"C210\" />\n+ <Bond atomName1=\"C210\" atomName2=\"H10R\" />\n+ <Bond atomName1=\"C210\" atomName2=\"H10S\" />\n+ <Bond atomName1=\"C210\" atomName2=\"C211\" />\n+ <Bond atomName1=\"C211\" atomName2=\"H11R\" />\n+ <Bond atomName1=\"C211\" atomName2=\"H11S\" />\n+ <Bond atomName1=\"C211\" atomName2=\"C212\" />\n+ <Bond atomName1=\"C212\" atomName2=\"H12R\" />\n+ <Bond atomName1=\"C212\" atomName2=\"H12S\" />\n+ <Bond atomName1=\"C212\" atomName2=\"C213\" />\n+ <Bond atomName1=\"C213\" atomName2=\"H13R\" />\n+ <Bond atomName1=\"C213\" atomName2=\"H13S\" />\n+ <Bond atomName1=\"C213\" atomName2=\"C214\" />\n+ <Bond atomName1=\"C214\" atomName2=\"H14R\" />\n+ <Bond atomName1=\"C214\" atomName2=\"H14S\" />\n+ <Bond atomName1=\"C214\" atomName2=\"H14T\" />\n+ <Bond atomName1=\"O31\" atomName2=\"C31\" />\n+ <Bond atomName1=\"C31\" atomName2=\"C32\" />\n+ <Bond atomName1=\"C31\" atomName2=\"O32\" />\n+ <Bond atomName1=\"C32\" atomName2=\"H2X\" />\n+ <Bond atomName1=\"C32\" atomName2=\"H2Y\" />\n+ <Bond atomName1=\"C32\" atomName2=\"C33\" />\n+ <Bond atomName1=\"C33\" atomName2=\"H3X\" />\n+ <Bond atomName1=\"C33\" atomName2=\"H3Y\" />\n+ <Bond atomName1=\"C33\" atomName2=\"C34\" />\n+ <Bond atomName1=\"C34\" atomName2=\"H4X\" />\n+ <Bond atomName1=\"C34\" atomName2=\"H4Y\" />\n+ <Bond atomName1=\"C34\" atomName2=\"C35\" />\n+ <Bond atomName1=\"C35\" atomName2=\"H5X\" />\n+ <Bond atomName1=\"C35\" atomName2=\"H5Y\" />\n+ <Bond atomName1=\"C35\" atomName2=\"C36\" />\n+ <Bond atomName1=\"C36\" atomName2=\"H6X\" />\n+ <Bond atomName1=\"C36\" atomName2=\"H6Y\" />\n+ <Bond atomName1=\"C36\" atomName2=\"C37\" />\n+ <Bond atomName1=\"C37\" atomName2=\"H7X\" />\n+ <Bond atomName1=\"C37\" atomName2=\"H7Y\" />\n+ <Bond atomName1=\"C37\" atomName2=\"C38\" />\n+ <Bond atomName1=\"C38\" atomName2=\"H8X\" />\n+ <Bond atomName1=\"C38\" atomName2=\"H8Y\" />\n+ <Bond atomName1=\"C38\" atomName2=\"C39\" />\n+ <Bond atomName1=\"C39\" atomName2=\"H9X\" />\n+ <Bond atomName1=\"C39\" atomName2=\"H9Y\" />\n+ <Bond atomName1=\"C39\" atomName2=\"C310\" />\n+ <Bond atomName1=\"C310\" atomName2=\"H10X\" />\n+ <Bond atomName1=\"C310\" atomName2=\"H10Y\" />\n+ <Bond atomName1=\"C310\" atomName2=\"C311\" />\n+ <Bond atomName1=\"C311\" atomName2=\"H11X\" />\n+ <Bond atomName1=\"C311\" atomName2=\"H11Y\" />\n+ <Bond atomName1=\"C311\" atomName2=\"C312\" />\n+ <Bond atomName1=\"C312\" atomName2=\"H12X\" />\n+ <Bond atomName1=\"C312\" atomName2=\"H12Y\" />\n+ <Bond atomName1=\"C312\" atomName2=\"C313\" />\n+ <Bond atomName1=\"C313\" atomName2=\"H13X\" />\n+ <Bond atomName1=\"C313\" atomName2=\"H13Y\" />\n+ <Bond atomName1=\"C313\" atomName2=\"C314\" />\n+ <Bond atomName1=\"C314\" atomName2=\"H14X\" />\n+ <Bond atomName1=\"C314\" atomName2=\"H14Y\" />\n+ <Bond atomName1=\"C314\" atomName2=\"H14Z\" />\n+ </Residue>\n+ <Residue name=\"DMPE\">\n+ <Atom charge=\"-0.368132\" name=\"N\" type=\"nA\" />\n+ <Atom charge=\"0.348549\" name=\"HN1\" type=\"hN\" />\n+ <Atom charge=\"0.348549\" name=\"HN2\" type=\"hN\" />\n+ <Atom charge=\"0.348549\" name=\"HN3\" type=\"hN\" />\n+ <Atom charge=\"0.077319\" name=\"C12\" type=\"cA\" />\n+ <Atom charge=\"0.09163\" name=\"H12A\" type=\"hX\" />\n+ <Atom charge=\"0.09163\" name=\"H12B\" type=\"hX\" />\n+ <Atom charge=\"0.075159\" name=\"C11\" type=\"cA\" />\n+ <Atom charge=\"0.091516\" name=\"H11A\" type=\"hE\" />\n+ <Atom charge=\"0.091516\" name=\"H11B\" type=\"hE\" />\n+ <Atom charge=\"1.373656\" name=\"P\" type=\"pA\" />\n+ <Atom charge=\"-0.877447\" name=\"O13\" type=\"oP\" />\n+ <Atom charge=\"-0.877447\" name=\"O14\" type=\"oP\" />\n+ <Atom charge=\"-0.546623\" name=\"O11\" type=\"oT\" />\n+ <Atom charge=\"-0.514542\" name=\"O12\" type=\"oT\" />\n+ <Atom charge=\"0.040967\" name=\"C1\" type=\"cA\" />\n+ <Atom charge=\"0.090994\" name=\"HA\" type=\"hE\" />\n+ <Atom charge=\"0.090994\" name=\"HB\" type=\"hE\" />\n+ <Atom charge=\"0.339004\" name=\"C2\" type=\"cA\" />\n+ <Atom charge=\"0.032843\" name=\"HS\" type=\"hE\" />\n+ <Atom charge=\"-0.57548\" name=\"O21\" type=\"oS\" />\n+ <Atom charge=\"0.86934\" name=\"C21\" type=\"cC\" />\n+ <Atom charge=\"-0.649199\" name=\"O22\" type=\"oC\" />\n+ <Atom charge=\"-0.1642\" name=\"C22\" type=\"cD\" />\n+ <Atom charge=\"0.053944\" name=\"H2R\" type=\"hL\" />\n+ <Atom charge=\"0.053944\" name=\"H2S\" type=\"hL\" />\n+ <Atom charge=\"0.273776\" name=\"C3\" type=\"cA\" />\n+ <Atom charge=\"0.044574\" name=\"HX\" type=\"hE\" />\n+ <Atom charge=\"0.044574\" name=\"HY\" type=\"hE\" />\n+ <Atom charge=\"-0.593826\" name=\"O31\" type=\"oS\" />\n+ <Atom charge=\"0.888359\" name=\"C31\" type=\"cC\" />\n+ <Atom charge=\"-0.650802\" name=\"O32\" type=\"oC\" />\n+ <Atom charge=\"-0.1642\" name=\"C32\" type=\"cD\" />\n+ <Atom charge=\"0.053944\" name=\"H2X\" type=\"hL\" />\n+ <Atom charge=\"0.053944\" name=\"H2Y\" type=\"hL\" />\n+ <Atom charge=\"-0.002435\" name=\"C23\" type=\"cD\" />\n+ <Atom charge=\"0.018859\" name=\"H3R\" type=\"hL\" />\n+ <Atom charge=\"0.018859\" name=\"H3S\" type=\"hL\" />\n+ <Atom charge=\"-0.026954\" name=\"C24\" type=\"cD\" />\n+ <Atom charge=\"0.020431\" name=\"H4R\" type=\"hL\" />\n+ <Atom charge=\"0.020431\" name=\"H4S\" type=\"hL\" />\n+ <Atom charge=\"-0.016521\" name=\"C25\" type=\"cD\" />\n+ <Atom charge=\"0.010573\" name=\"H5R\" type=\"hL\" />\n+ <Atom charge=\"0.010573\" name=\"H5S\" type=\"hL\" />\n+ <Atom charge=\"-0.027812\" name=\"C26\" type=\"cD\" />\n+ <Atom charge=\"0.011511\" name=\"H6R\" type=\"hL\" />\n+ <Atom charge=\"0.011511\" name=\"H6S\" type=\"hL\" />\n+ <Atom charge=\"-0.004386\" name=\"C27\" type=\"cD\" />\n+ <Atom charge=\"0.006833\" name=\"H7R\" type=\"hL\" />\n+ <Atom charge=\"0.006833\" name=\"H7S\" type=\"hL\" />\n+ <Atom charge=\"-0.026451\" name=\"C28\" type=\"cD\" />\n+ <Atom charge=\"0.011241\" name=\"H8R\" type=\"hL\" />\n+ <Atom charge=\"0.011241\" name=\"H8S\" type=\"hL\" />\n+ <Atom charge=\"-0.014653\" name=\"C29\" type=\"cD\" />\n+ <Atom charge=\"0.010172\" name=\"H9R\" type=\"hL\" />\n+ <Atom charge=\"0.010172\" name=\"H9S\" type=\"hL\" />\n+ <Atom charge=\"-0.021025\" name=\"C210\" type=\"cD\" />\n+ <Atom charge=\"0.010037\" name=\"H10R\" type=\"hL\" />\n+ <Atom charge=\"0.010037\" name=\"H10S\" type=\"hL\" />\n+ <Atom charge=\"-0.031787\" name=\"C211\" type=\"cD\" />\n+ <Atom charge=\"0.012677\" name=\"H11R\" type=\"hL\" />\n+ <Atom charge=\"0.012677\" name=\"H11S\" type=\"hL\" />\n+ <Atom charge=\"-0.028094\" name=\"C212\" type=\"cD\" />\n+ <Atom charge=\"0.017208\" name=\"H12R\" type=\"hL\" />\n+ <Atom charge=\"0.017208\" name=\"H12S\" type=\"hL\" />\n+ <Atom charge=\"0.017463\" name=\"C213\" type=\"cD\" />\n+ <Atom charge=\"0.007531\" name=\"H13R\" type=\"hL\" />\n+ <Atom charge=\"0.007531\" name=\"H13S\" type=\"hL\" />\n+ <Atom charge=\"-0.111712\" name=\"C214\" type=\"cD\" />\n+ <Atom charge=\"0.025511\" name=\"H14R\" type=\"hL\" />\n+ <Atom charge=\"0.025511\" name=\"H14S\" type=\"hL\" />\n+ <Atom charge=\"0.025511\" name=\"H14T\" type=\"hL\" />\n+ <Atom charge=\"-0.002435\" name=\"C33\" type=\"cD\" />\n+ <Atom charge=\"0.018859\" name=\"H3X\" type=\"hL\" />\n+ <Atom charge=\"0.018859\" name=\"H3Y\" type=\"hL\" />\n+ <Atom charge=\"-0.026954\" name=\"C34\" type=\"cD\" />\n+ <Atom charge=\"0.020431\" name=\"H4X\" type=\"hL\" />\n+ <Atom charge=\"0.020431\" name=\"H4Y\" type=\"hL\" />\n+ <Atom charge=\"-0.016521\" name=\"C35\" type=\"cD\" />\n+ <Atom charge=\"0.010573\" name=\"H5X\" type=\"hL\" />\n+ <Atom charge=\"0.010573\" name=\"H5Y\" type=\"hL\" />\n+ <Atom charge=\"-0.027812\" name=\"C36\" type=\"cD\" />\n+ <Atom charge=\"0.011511\" name=\"H6X\" type=\"hL\" />\n+ <Atom charge=\"0.011511\" name=\"H6Y\" type=\"hL\" />\n+ <Atom charge=\"-0.004386\" name=\"C37\" type=\"cD\" />\n+ <Atom charge=\"0.006833\" name=\"H7X\" type=\"hL\" />\n+ <Atom charge=\"0.006833\" name=\"H7Y\" type=\"hL\" />\n+ <Atom charge=\"-0.026451\" name=\"C38\" type=\"cD\" />\n+ <Atom charge=\"0.011241\" name=\"H8X\" type=\"hL\" />\n+ <Atom charge=\"0.011241\" name=\"H8Y\" type=\"hL\" />\n+ <Atom charge=\"-0.014653\" name=\"C39\" type=\"cD\" />\n+ <Atom charge=\"0.010172\" name=\"H9X\" type=\"hL\" />\n+ <Atom charge=\"0.010172\" name=\"H9Y\" type=\"hL\" />\n+ <Atom charge=\"-0.021025\" name=\"C310\" type=\"cD\" />\n+ <Atom charge=\"0.010037\" name=\"H10X\" type=\"hL\" />\n+ <Atom charge=\"0.010037\" name=\"H10Y\" type=\"hL\" />\n+ <Atom charge=\"-0.031787\" name=\"C311\" type=\"cD\" />\n+ <Atom charge=\"0.012677\" name=\"H11X\" type=\"hL\" />\n+ <Atom charge=\"0.012677\" name=\"H11Y\" type=\"hL\" />\n+ <Atom charge=\"-0.028094\" name=\"C312\" type=\"cD\" />\n+ <Atom charge=\"0.017208\" name=\"H12X\" type=\"hL\" />\n+ <Atom charge=\"0.017208\" name=\"H12Y\" type=\"hL\" />\n+ <Atom charge=\"0.017463\" name=\"C313\" type=\"cD\" />\n+ <Atom charge=\"0.007531\" name=\"H13X\" type=\"hL\" />\n+ <Atom charge=\"0.007531\" name=\"H13Y\" type=\"hL\" />\n+ <Atom charge=\"-0.111712\" name=\"C314\" type=\"cD\" />\n+ <Atom charge=\"0.025511\" name=\"H14X\" type=\"hL\" />\n+ <Atom charge=\"0.025511\" name=\"H14Y\" type=\"hL\" />\n+ <Atom charge=\"0.025511\" name=\"H14Z\" type=\"hL\" />\n+ <Bond atomName1=\"N\" atomName2=\"HN1\" />\n+ <Bond atomName1=\"N\" atomName2=\"HN2\" />\n+ <Bond atomName1=\"N\" atomName2=\"HN3\" />\n+ <Bond atomName1=\"N\" atomName2=\"C12\" />\n+ <Bond atomName1=\"C12\" atomName2=\"H12A\" />\n+ <Bond atomName1=\"C12\" atomName2=\"H12B\" />\n+ <Bond atomName1=\"C12\" atomName2=\"C11\" />\n+ <Bond atomName1=\"C11\" atomName2=\"H11A\" />\n+ <Bond atomName1=\"C11\" atomName2=\"H11B\" />\n+ <Bond atomName1=\"C11\" atomName2=\"O12\" />\n+ <Bond atomName1=\"O12\" atomName2=\"P\" />\n+ <Bond atomName1=\"P\" atomName2=\"O11\" />\n+ <Bond atomName1=\"P\" atomName2=\"O13\" />\n+ <Bond atomName1=\"P\" atomName2=\"O14\" />\n+ <Bond atomName1=\"C1\" atomName2=\"HA\" />\n+ <Bond atomName1=\"C1\" atomName2=\"HB\" />\n+ <Bond atomName1=\"C1\" atomName2=\"C2\" />\n+ <Bond atomName1=\"C1\" atomName2=\"O11\" />\n+ <Bond atomName1=\"C2\" atomName2=\"HS\" />\n+ <Bond atomName1=\"C2\" atomName2=\"C3\" />\n+ <Bond atomName1=\"C2\" atomName2=\"O21\" />\n+ <Bond atomName1=\"C3\" atomName2=\"HX\" />\n+ <Bond atomName1=\"C3\" atomName2=\"HY\" />\n+ <Bond atomName1=\"C3\" atomName2=\"O31\" />\n+ <Bond atomName1=\"O21\" atomName2=\"C21\" />\n+ <Bond atomName1=\"C21\" atomName2=\"C22\" />\n+ <Bond atomName1=\"C21\" atomName2=\"O22\" />\n+ <Bond atomName1=\"C22\" atomName2=\"H2R\" />\n+ <Bond atomName1=\"C22\" atomName2=\"H2S\" />\n+ <Bond atomName1=\"C22\" atomName2=\"C23\" />\n+ <Bond atomName1=\"C23\" atomName2=\"H3R\" />\n+ <Bond atomName1=\"C23\" atomName2=\"H3S\" />\n+ <Bond atomName1=\"C23\" atomName2=\"C24\" />\n+ <Bond atomName1=\"C24\" atomName2=\"H4R\" />\n+ <Bond atomName1=\"C24\" atomName2=\"H4S\" />\n+ <Bond atomName1=\"C24\" atomName2=\"C25\" />\n+ <Bond atomName1=\"C25\" atomName2=\"H5R\" />\n+ <Bond atomName1=\"C25\" atomName2=\"H5S\" />\n+ <Bond atomName1=\"C25\" atomName2=\"C26\" />\n+ <Bond atomName1=\"C26\" atomName2=\"H6R\" />\n+ <Bond atomName1=\"C26\" atomName2=\"H6S\" />\n+ <Bond atomName1=\"C26\" atomName2=\"C27\" />\n+ <Bond atomName1=\"C27\" atomName2=\"H7R\" />\n+ <Bond atomName1=\"C27\" atomName2=\"H7S\" />\n+ <Bond atomName1=\"C27\" atomName2=\"C28\" />\n+ <Bond atomName1=\"C28\" atomName2=\"H8R\" />\n+ <Bond atomName1=\"C28\" atomName2=\"H8S\" />\n+ <Bond atomName1=\"C28\" atomName2=\"C29\" />\n+ <Bond atomName1=\"C29\" atomName2=\"H9R\" />\n+ <Bond atomName1=\"C29\" atomName2=\"H9S\" />\n+ <Bond atomName1=\"C29\" atomName2=\"C210\" />\n+ <Bond atomName1=\"C210\" atomName2=\"H10R\" />\n+ <Bond atomName1=\"C210\" atomName2=\"H10S\" />\n+ <Bond atomName1=\"C210\" atomName2=\"C211\" />\n+ <Bond atomName1=\"C211\" atomName2=\"H11R\" />\n+ <Bond atomName1=\"C211\" atomName2=\"H11S\" />\n+ <Bond atomName1=\"C211\" atomName2=\"C212\" />\n+ <Bond atomName1=\"C212\" atomName2=\"H12R\" />\n+ <Bond atomName1=\"C212\" atomName2=\"H12S\" />\n+ <Bond atomName1=\"C212\" atomName2=\"C213\" />\n+ <Bond atomName1=\"C213\" atomName2=\"H13R\" />\n+ <Bond atomName1=\"C213\" atomName2=\"H13S\" />\n+ <Bond atomName1=\"C213\" atomName2=\"C214\" />\n+ <Bond atomName1=\"C214\" atomName2=\"H14R\" />\n+ <Bond atomName1=\"C214\" atomName2=\"H14S\" />\n+ <Bond atomName1=\"C214\" atomName2=\"H14T\" />\n+ <Bond atomName1=\"O31\" atomName2=\"C31\" />\n+ <Bond atomName1=\"C31\" atomName2=\"C32\" />\n+ <Bond atomName1=\"C31\" atomName2=\"O32\" />\n+ <Bond atomName1=\"C32\" atomName2=\"H2X\" />\n+ <Bond atomName1=\"C32\" atomName2=\"H2Y\" />\n+ <Bond atomName1=\"C32\" atomName2=\"C33\" />\n+ <Bond atomName1=\"C33\" atomName2=\"H3X\" />\n+ <Bond atomName1=\"C33\" atomName2=\"H3Y\" />\n+ <Bond atomName1=\"C33\" atomName2=\"C34\" />\n+ <Bond atomName1=\"C34\" atomName2=\"H4X\" />\n+ <Bond atomName1=\"C34\" atomName2=\"H4Y\" />\n+ <Bond atomName1=\"C34\" atomName2=\"C35\" />\n+ <Bond atomName1=\"C35\" atomName2=\"H5X\" />\n+ <Bond atomName1=\"C35\" atomName2=\"H5Y\" />\n+ <Bond atomName1=\"C35\" atomName2=\"C36\" />\n+ <Bond atomName1=\"C36\" atomName2=\"H6X\" />\n+ <Bond atomName1=\"C36\" atomName2=\"H6Y\" />\n+ <Bond atomName1=\"C36\" atomName2=\"C37\" />\n+ <Bond atomName1=\"C37\" atomName2=\"H7X\" />\n+ <Bond atomName1=\"C37\" atomName2=\"H7Y\" />\n+ <Bond atomName1=\"C37\" atomName2=\"C38\" />\n+ <Bond atomName1=\"C38\" atomName2=\"H8X\" />\n+ <Bond atomName1=\"C38\" atomName2=\"H8Y\" />\n+ <Bond atomName1=\"C38\" atomName2=\"C39\" />\n+ <Bond atomName1=\"C39\" atomName2=\"H9X\" />\n+ <Bond atomName1=\"C39\" atomName2=\"H9Y\" />\n+ <Bond atomName1=\"C39\" atomName2=\"C310\" />\n+ <Bond atomName1=\"C310\" atomName2=\"H10X\" />\n+ <Bond atomName1=\"C310\" atomName2=\"H10Y\" />\n+ <Bond atomName1=\"C310\" atomName2=\"C311\" />\n+ <Bond atomName1=\"C311\" atomName2=\"H11X\" />\n+ <Bond atomName1=\"C311\" atomName2=\"H11Y\" />\n+ <Bond atomName1=\"C311\" atomName2=\"C312\" />\n+ <Bond atomName1=\"C312\" atomName2=\"H12X\" />\n+ <Bond atomName1=\"C312\" atomName2=\"H12Y\" />\n+ <Bond atomName1=\"C312\" atomName2=\"C313\" />\n+ <Bond atomName1=\"C313\" atomName2=\"H13X\" />\n+ <Bond atomName1=\"C313\" atomName2=\"H13Y\" />\n+ <Bond atomName1=\"C313\" atomName2=\"C314\" />\n+ <Bond atomName1=\"C314\" atomName2=\"H14X\" />\n+ <Bond atomName1=\"C314\" atomName2=\"H14Y\" />\n+ <Bond atomName1=\"C314\" atomName2=\"H14Z\" />\n+ </Residue>\n+ <Residue name=\"DMPS\">\n+ <Atom charge=\"-0.414327\" name=\"N\" type=\"nA\" />\n+ <Atom charge=\"0.353866\" name=\"HN1\" type=\"hN\" />\n+ <Atom charge=\"0.353866\" name=\"HN2\" type=\"hN\" />\n+ <Atom charge=\"0.353866\" name=\"HN3\" type=\"hN\" />\n+ <Atom charge=\"0.039448\" name=\"C12\" type=\"cA\" />\n+ <Atom charge=\"0.090549\" name=\"H12A\" type=\"hX\" />\n+ <Atom charge=\"0.809867\" name=\"C13\" type=\"cC\" />\n+ <Atom charge=\"-0.815178\" name=\"O13A\" type=\"oO\" />\n+ <Atom charge=\"-0.815178\" name=\"O13B\" type=\"oO\" />\n+ <Atom charge=\"0.060375\" name=\"C11\" type=\"cA\" />\n+ <Atom charge=\"0.093484\" name=\"H11A\" type=\"hE\" />\n+ <Atom charge=\"0.093484\" name=\"H11B\" type=\"hE\" />\n+ <Atom charge=\"1.380208\" name=\"P\" type=\"pA\" />\n+ <Atom charge=\"-0.877922\" name=\"O13\" type=\"oP\" />\n+ <Atom charge=\"-0.877922\" name=\"O14\" type=\"oP\" />\n+ <Atom charge=\"-0.520128\" name=\"O12\" type=\"oT\" />\n+ <Atom charge=\"-0.556992\" name=\"O11\" type=\"oT\" />\n+ <Atom charge=\"0.012366\" name=\"C1\" type=\"cA\" />\n+ <Atom charge=\"0.097347\" name=\"HA\" type=\"hE\" />\n+ <Atom charge=\"0.097347\" name=\"HB\" type=\"hE\" />\n+ <Atom charge=\"0.44065\" name=\"C2\" type=\"cA\" />\n+ <Atom charge=\"0.002473\" name=\"HS\" type=\"hE\" />\n+ <Atom charge=\"-0.634381\" name=\"O21\" type=\"oS\" />\n+ <Atom charge=\"0.891897\" name=\"C21\" type=\"cC\" />\n+ <Atom charge=\"-0.650291\" name=\"O22\" type=\"oC\" />\n+ <Atom charge=\"-0.1642\" name=\"C22\" type=\"cD\" />\n+ <Atom charge=\"0.053944\" name=\"H2R\" type=\"hL\" />\n+ <Atom charge=\"0.053944\" name=\"H2S\" type=\"hL\" />\n+ <Atom charge=\"0.271173\" name=\"C3\" type=\"cA\" />\n+ <Atom charge=\"0.037454\" name=\"HX\" type=\"hE\" />\n+ <Atom charge=\"0.037454\" name=\"HY\" type=\"hE\" />\n+ <Atom charge=\"-0.579073\" name=\"O31\" type=\"oS\" />\n+ <Atom charge=\"0.887549\" name=\"C31\" type=\"cC\" />\n+ <Atom charge=\"-0.663331\" name=\"O32\" type=\"oC\" />\n+ <Atom charge=\"-0.1642\" name=\"C32\" type=\"cD\" />\n+ <Atom charge=\"0.053944\" name=\"H2X\" type=\"hL\" />\n+ <Atom charge=\"0.053944\" name=\"H2Y\" type=\"hL\" />\n+ <Atom charge=\"-0.002435\" name=\"C23\" type=\"cD\" />\n+ <Atom charge=\"0.018859\" name=\"H3R\" type=\"hL\" />\n+ <Atom charge=\"0.018859\" name=\"H3S\" type=\"hL\" />\n+ <Atom charge=\"-0.026954\" name=\"C24\" type=\"cD\" />\n+ <Atom charge=\"0.020431\" name=\"H4R\" type=\"hL\" />\n+ <Atom charge=\"0.020431\" name=\"H4S\" type=\"hL\" />\n+ <Atom charge=\"-0.016521\" name=\"C25\" type=\"cD\" />\n+ <Atom charge=\"0.010573\" name=\"H5R\" type=\"hL\" />\n+ <Atom charge=\"0.010573\" name=\"H5S\" type=\"hL\" />\n+ <Atom charge=\"-0.027812\" name=\"C26\" type=\"cD\" />\n+ <Atom charge=\"0.011511\" name=\"H6R\" type=\"hL\" />\n+ <Atom charge=\"0.011511\" name=\"H6S\" type=\"hL\" />\n+ <Atom charge=\"-0.004386\" name=\"C27\" type=\"cD\" />\n+ <Atom charge=\"0.006833\" name=\"H7R\" type=\"hL\" />\n+ <Atom charge=\"0.006833\" name=\"H7S\" type=\"hL\" />\n+ <Atom charge=\"-0.026451\" name=\"C28\" type=\"cD\" />\n+ <Atom charge=\"0.011241\" name=\"H8R\" type=\"hL\" />\n+ <Atom charge=\"0.011241\" name=\"H8S\" type=\"hL\" />\n+ <Atom charge=\"-0.014653\" name=\"C29\" type=\"cD\" />\n+ <Atom charge=\"0.010172\" name=\"H9R\" type=\"hL\" />\n+ <Atom charge=\"0.010172\" name=\"H9S\" type=\"hL\" />\n+ <Atom charge=\"-0.021025\" name=\"C210\" type=\"cD\" />\n+ <Atom charge=\"0.010037\" name=\"H10R\" type=\"hL\" />\n+ <Atom charge=\"0.010037\" name=\"H10S\" type=\"hL\" />\n+ <Atom charge=\"-0.031787\" name=\"C211\" type=\"cD\" />\n+ <Atom charge=\"0.012677\" name=\"H11R\" type=\"hL\" />\n+ <Atom charge=\"0.012677\" name=\"H11S\" type=\"hL\" />\n+ <Atom charge=\"-0.028094\" name=\"C212\" type=\"cD\" />\n+ <Atom charge=\"0.017208\" name=\"H12R\" type=\"hL\" />\n+ <Atom charge=\"0.017208\" name=\"H12S\" type=\"hL\" />\n+ <Atom charge=\"0.017463\" name=\"C213\" type=\"cD\" />\n+ <Atom charge=\"0.007531\" name=\"H13R\" type=\"hL\" />\n+ <Atom charge=\"0.007531\" name=\"H13S\" type=\"hL\" />\n+ <Atom charge=\"-0.111712\" name=\"C214\" type=\"cD\" />\n+ <Atom charge=\"0.025511\" name=\"H14R\" type=\"hL\" />\n+ <Atom charge=\"0.025511\" name=\"H14S\" type=\"hL\" />\n+ <Atom charge=\"0.025511\" name=\"H14T\" type=\"hL\" />\n+ <Atom charge=\"-0.002435\" name=\"C33\" type=\"cD\" />\n+ <Atom charge=\"0.018859\" name=\"H3X\" type=\"hL\" />\n+ <Atom charge=\"0.018859\" name=\"H3Y\" type=\"hL\" />\n+ <Atom charge=\"-0.026954\" name=\"C34\" type=\"cD\" />\n+ <Atom charge=\"0.020431\" name=\"H4X\" type=\"hL\" />\n+ <Atom charge=\"0.020431\" name=\"H4Y\" type=\"hL\" />\n+ <Atom charge=\"-0.016521\" name=\"C35\" type=\"cD\" />\n+ <Atom charge=\"0.010573\" name=\"H5X\" type=\"hL\" />\n+ <Atom charge=\"0.010573\" name=\"H5Y\" type=\"hL\" />\n+ <Atom charge=\"-0.027812\" name=\"C36\" type=\"cD\" />\n+ <Atom charge=\"0.011511\" name=\"H6X\" type=\"hL\" />\n+ <Atom charge=\"0.011511\" name=\"H6Y\" type=\"hL\" />\n+ <Atom charge=\"-0.004386\" name=\"C37\" type=\"cD\" />\n+ <Atom charge=\"0.006833\" name=\"H7X\" type=\"hL\" />\n+ <Atom charge=\"0.006833\" name=\"H7Y\" type=\"hL\" />\n+ <Atom charge=\"-0.026451\" name=\"C38\" type=\"cD\" />\n+ <Atom charge=\"0.011241\" name=\"H8X\" type=\"hL\" />\n+ <Atom charge=\"0.011241\" name=\"H8Y\" type=\"hL\" />\n+ <Atom charge=\"-0.014653\" name=\"C39\" type=\"cD\" />\n+ <Atom charge=\"0.010172\" name=\"H9X\" type=\"hL\" />\n+ <Atom charge=\"0.010172\" name=\"H9Y\" type=\"hL\" />\n+ <Atom charge=\"-0.021025\" name=\"C310\" type=\"cD\" />\n+ <Atom charge=\"0.010037\" name=\"H10X\" type=\"hL\" />\n+ <Atom charge=\"0.010037\" name=\"H10Y\" type=\"hL\" />\n+ <Atom charge=\"-0.031787\" name=\"C311\" type=\"cD\" />\n+ <Atom charge=\"0.012677\" name=\"H11X\" type=\"hL\" />\n+ <Atom charge=\"0.012677\" name=\"H11Y\" type=\"hL\" />\n+ <Atom charge=\"-0.028094\" name=\"C312\" type=\"cD\" />\n+ <Atom charge=\"0.017208\" name=\"H12X\" type=\"hL\" />\n+ <Atom charge=\"0.017208\" name=\"H12Y\" type=\"hL\" />\n+ <Atom charge=\"0.017463\" name=\"C313\" type=\"cD\" />\n+ <Atom charge=\"0.007531\" name=\"H13X\" type=\"hL\" />\n+ <Atom charge=\"0.007531\" name=\"H13Y\" type=\"hL\" />\n+ <Atom charge=\"-0.111712\" name=\"C314\" type=\"cD\" />\n+ <Atom charge=\"0.025511\" name=\"H14X\" type=\"hL\" />\n+ <Atom charge=\"0.025511\" name=\"H14Y\" type=\"hL\" />\n+ <Atom charge=\"0.025511\" name=\"H14Z\" type=\"hL\" />\n+ <Bond atomName1=\"N\" atomName2=\"HN1\" />\n+ <Bond atomName1=\"N\" atomName2=\"HN2\" />\n+ <Bond atomName1=\"N\" atomName2=\"HN3\" />\n+ <Bond atomName1=\"N\" atomName2=\"C12\" />\n+ <Bond atomName1=\"O13B\" atomName2=\"C13\" />\n+ <Bond atomName1=\"C13\" atomName2=\"C12\" />\n+ <Bond atomName1=\"C13\" atomName2=\"O13A\" />\n+ <Bond atomName1=\"C12\" atomName2=\"H12A\" />\n+ <Bond atomName1=\"C12\" atomName2=\"C11\" />\n+ <Bond atomName1=\"C1\" atomName2=\"O11\" />\n+ <Bond atomName1=\"C11\" atomName2=\"H11A\" />\n+ <Bond atomName1=\"C11\" atomName2=\"H11B\" />\n+ <Bond atomName1=\"C11\" atomName2=\"O12\" />\n+ <Bond atomName1=\"O12\" atomName2=\"P\" />\n+ <Bond atomName1=\"P\" atomName2=\"O11\" />\n+ <Bond atomName1=\"P\" atomName2=\"O13\" />\n+ <Bond atomName1=\"P\" atomName2=\"O14\" />\n+ <Bond atomName1=\"C1\" atomName2=\"HA\" />\n+ <Bond atomName1=\"C1\" atomName2=\"HB\" />\n+ <Bond atomName1=\"C1\" atomName2=\"C2\" />\n+ <Bond atomName1=\"C2\" atomName2=\"HS\" />\n+ <Bond atomName1=\"C2\" atomName2=\"C3\" />\n+ <Bond atomName1=\"C2\" atomName2=\"O21\" />\n+ <Bond atomName1=\"C3\" atomName2=\"HX\" />\n+ <Bond atomName1=\"C3\" atomName2=\"HY\" />\n+ <Bond atomName1=\"C3\" atomName2=\"O31\" />\n+ <Bond atomName1=\"O21\" atomName2=\"C21\" />\n+ <Bond atomName1=\"C21\" atomName2=\"C22\" />\n+ <Bond atomName1=\"C21\" atomName2=\"O22\" />\n+ <Bond atomName1=\"C22\" atomName2=\"H2R\" />\n+ <Bond atomName1=\"C22\" atomName2=\"H2S\" />\n+ <Bond atomName1=\"C22\" atomName2=\"C23\" />\n+ <Bond atomName1=\"C23\" atomName2=\"H3R\" />\n+ <Bond atomName1=\"C23\" atomName2=\"H3S\" />\n+ <Bond atomName1=\"C23\" atomName2=\"C24\" />\n+ <Bond atomName1=\"C24\" atomName2=\"H4R\" />\n+ <Bond atomName1=\"C24\" atomName2=\"H4S\" />\n+ <Bond atomName1=\"C24\" atomName2=\"C25\" />\n+ <Bond atomName1=\"C25\" atomName2=\"H5R\" />\n+ <Bond atomName1=\"C25\" atomName2=\"H5S\" />\n+ <Bond atomName1=\"C25\" atomName2=\"C26\" />\n+ <Bond atomName1=\"C26\" atomName2=\"H6R\" />\n+ <Bond atomName1=\"C26\" atomName2=\"H6S\" />\n+ <Bond atomName1=\"C26\" atomName2=\"C27\" />\n+ <Bond atomName1=\"C27\" atomName2=\"H7R\" />\n+ <Bond atomName1=\"C27\" atomName2=\"H7S\" />\n+ <Bond atomName1=\"C27\" atomName2=\"C28\" />\n+ <Bond atomName1=\"C28\" atomName2=\"H8R\" />\n+ <Bond atomName1=\"C28\" atomName2=\"H8S\" />\n+ <Bond atomName1=\"C28\" atomName2=\"C29\" />\n+ <Bond atomName1=\"C29\" atomName2=\"H9R\" />\n+ <Bond atomName1=\"C29\" atomName2=\"H9S\" />\n+ <Bond atomName1=\"C29\" atomName2=\"C210\" />\n+ <Bond atomName1=\"C210\" atomName2=\"H10R\" />\n+ <Bond atomName1=\"C210\" atomName2=\"H10S\" />\n+ <Bond atomName1=\"C210\" atomName2=\"C211\" />\n+ <Bond atomName1=\"C211\" atomName2=\"H11R\" />\n+ <Bond atomName1=\"C211\" atomName2=\"H11S\" />\n+ <Bond atomName1=\"C211\" atomName2=\"C212\" />\n+ <Bond atomName1=\"C212\" atomName2=\"H12R\" />\n+ <Bond atomName1=\"C212\" atomName2=\"H12S\" />\n+ <Bond atomName1=\"C212\" atomName2=\"C213\" />\n+ <Bond atomName1=\"C213\" atomName2=\"H13R\" />\n+ <Bond atomName1=\"C213\" atomName2=\"H13S\" />\n+ <Bond atomName1=\"C213\" atomName2=\"C214\" />\n+ <Bond atomName1=\"C214\" atomName2=\"H14R\" />\n+ <Bond atomName1=\"C214\" atomName2=\"H14S\" />\n+ <Bond atomName1=\"C214\" atomName2=\"H14T\" />\n+ <Bond atomName1=\"O31\" atomName2=\"C31\" />\n+ <Bond atomName1=\"C31\" atomName2=\"C32\" />\n+ <Bond atomName1=\"C31\" atomName2=\"O32\" />\n+ <Bond atomName1=\"C32\" atomName2=\"H2X\" />\n+ <Bond atomName1=\"C32\" atomName2=\"H2Y\" />\n+ <Bond atomName1=\"C32\" atomName2=\"C33\" />\n+ <Bond atomName1=\"C33\" atomName2=\"H3X\" />\n+ <Bond atomName1=\"C33\" atomName2=\"H3Y\" />\n+ <Bond atomName1=\"C33\" atomName2=\"C34\" />\n+ <Bond atomName1=\"C34\" atomName2=\"H4X\" />\n+ <Bond atomName1=\"C34\" atomName2=\"H4Y\" />\n+ <Bond atomName1=\"C34\" atomName2=\"C35\" />\n+ <Bond atomName1=\"C35\" atomName2=\"H5X\" />\n+ <Bond atomName1=\"C35\" atomName2=\"H5Y\" />\n+ <Bond atomName1=\"C35\" atomName2=\"C36\" />\n+ <Bond atomName1=\"C36\" atomName2=\"H6X\" />\n+ <Bond atomName1=\"C36\" atomName2=\"H6Y\" />\n+ <Bond atomName1=\"C36\" atomName2=\"C37\" />\n+ <Bond atomName1=\"C37\" atomName2=\"H7X\" />\n+ <Bond atomName1=\"C37\" atomName2=\"H7Y\" />\n+ <Bond atomName1=\"C37\" atomName2=\"C38\" />\n+ <Bond atomName1=\"C38\" atomName2=\"H8X\" />\n+ <Bond atomName1=\"C38\" atomName2=\"H8Y\" />\n+ <Bond atomName1=\"C38\" atomName2=\"C39\" />\n+ <Bond atomName1=\"C39\" atomName2=\"H9X\" />\n+ <Bond atomName1=\"C39\" atomName2=\"H9Y\" />\n+ <Bond atomName1=\"C39\" atomName2=\"C310\" />\n+ <Bond atomName1=\"C310\" atomName2=\"H10X\" />\n+ <Bond atomName1=\"C310\" atomName2=\"H10Y\" />\n+ <Bond atomName1=\"C310\" atomName2=\"C311\" />\n+ <Bond atomName1=\"C311\" atomName2=\"H11X\" />\n+ <Bond atomName1=\"C311\" atomName2=\"H11Y\" />\n+ <Bond atomName1=\"C311\" atomName2=\"C312\" />\n+ <Bond atomName1=\"C312\" atomName2=\"H12X\" />\n+ <Bond atomName1=\"C312\" atomName2=\"H12Y\" />\n+ <Bond atomName1=\"C312\" atomName2=\"C313\" />\n+ <Bond atomName1=\"C313\" atomName2=\"H13X\" />\n+ <Bond atomName1=\"C313\" atomName2=\"H13Y\" />\n+ <Bond atomName1=\"C313\" atomName2=\"C314\" />\n+ <Bond atomName1=\"C314\" atomName2=\"H14X\" />\n+ <Bond atomName1=\"C314\" atomName2=\"H14Y\" />\n+ <Bond atomName1=\"C314\" atomName2=\"H14Z\" />\n+ </Residue>\n+ <Residue name=\"DMPA\">\n+ <Atom charge=\"1.456663\" name=\"P\" type=\"pA\" />\n+ <Atom charge=\"-0.914158\" name=\"O13\" type=\"oP\" />\n+ <Atom charge=\"-0.914158\" name=\"O14\" type=\"oP\" />\n+ <Atom charge=\"-0.706197\" name=\"O12\" type=\"oH\" />\n+ <Atom charge=\"0.415628\" name=\"H12\" type=\"hO\" />\n+ <Atom charge=\"-0.594197\" name=\"O11\" type=\"oT\" />\n+ <Atom charge=\"0.081528\" name=\"C1\" type=\"cA\" />\n+ <Atom charge=\"0.083099\" name=\"HA\" type=\"hE\" />\n+ <Atom charge=\"0.083099\" name=\"HB\" type=\"hE\" />\n+ <Atom charge=\"0.283546\" name=\"C2\" type=\"cA\" />\n+ <Atom charge=\"0.063862\" name=\"HS\" type=\"hE\" />\n+ <Atom charge=\"-0.554487\" name=\"O21\" type=\"oS\" />\n+ <Atom charge=\"0.897502\" name=\"C21\" type=\"cC\" />\n+ <Atom charge=\"-0.671622\" name=\"O22\" type=\"oC\" />\n+ <Atom charge=\"-0.1642\" name=\"C22\" type=\"cD\" />\n+ <Atom charge=\"0.053944\" name=\"H2R\" type=\"hL\" />\n+ <Atom charge=\"0.053944\" name=\"H2S\" type=\"hL\" />\n+ <Atom charge=\"0.185299\" name=\"C3\" type=\"cA\" />\n+ <Atom charge=\"0.067676\" name=\"HX\" type=\"hE\" />\n+ <Atom charge=\"0.067676\" name=\"HY\" type=\"hE\" />\n+ <Atom charge=\"-0.547824\" name=\"O31\" type=\"oS\" />\n+ <Atom charge=\"0.888207\" name=\"C31\" type=\"cC\" />\n+ <Atom charge=\"-0.671142\" name=\"O32\" type=\"oC\" />\n+ <Atom charge=\"-0.1642\" name=\"C32\" type=\"cD\" />\n+ <Atom charge=\"0.053944\" name=\"H2X\" type=\"hL\" />\n+ <Atom charge=\"0.053944\" name=\"H2Y\" type=\"hL\" />\n+ <Atom charge=\"-0.002435\" name=\"C23\" type=\"cD\" />\n+ <Atom charge=\"0.018859\" name=\"H3R\" type=\"hL\" />\n+ <Atom charge=\"0.018859\" name=\"H3S\" type=\"hL\" />\n+ <Atom charge=\"-0.026954\" name=\"C24\" type=\"cD\" />\n+ <Atom charge=\"0.020431\" name=\"H4R\" type=\"hL\" />\n+ <Atom charge=\"0.020431\" name=\"H4S\" type=\"hL\" />\n+ <Atom charge=\"-0.016521\" name=\"C25\" type=\"cD\" />\n+ <Atom charge=\"0.010573\" name=\"H5R\" type=\"hL\" />\n+ <Atom charge=\"0.010573\" name=\"H5S\" type=\"hL\" />\n+ <Atom charge=\"-0.027812\" name=\"C26\" type=\"cD\" />\n+ <Atom charge=\"0.011511\" name=\"H6R\" type=\"hL\" />\n+ <Atom charge=\"0.011511\" name=\"H6S\" type=\"hL\" />\n+ <Atom charge=\"-0.004386\" name=\"C27\" type=\"cD\" />\n+ <Atom charge=\"0.006833\" name=\"H7R\" type=\"hL\" />\n+ <Atom charge=\"0.006833\" name=\"H7S\" type=\"hL\" />\n+ <Atom charge=\"-0.026451\" name=\"C28\" type=\"cD\" />\n+ <Atom charge=\"0.011241\" name=\"H8R\" type=\"hL\" />\n+ <Atom charge=\"0.011241\" name=\"H8S\" type=\"hL\" />\n+ <Atom charge=\"-0.014653\" name=\"C29\" type=\"cD\" />\n+ <Atom charge=\"0.010172\" name=\"H9R\" type=\"hL\" />\n+ <Atom charge=\"0.010172\" name=\"H9S\" type=\"hL\" />\n+ <Atom charge=\"-0.021025\" name=\"C210\" type=\"cD\" />\n+ <Atom charge=\"0.010037\" name=\"H10R\" type=\"hL\" />\n+ <Atom charge=\"0.010037\" name=\"H10S\" type=\"hL\" />\n+ <Atom charge=\"-0.031787\" name=\"C211\" type=\"cD\" />\n+ <Atom charge=\"0.012677\" name=\"H11R\" type=\"hL\" />\n+ <Atom charge=\"0.012677\" name=\"H11S\" type=\"hL\" />\n+ <Atom charge=\"-0.028094\" name=\"C212\" type=\"cD\" />\n+ <Atom charge=\"0.017208\" name=\"H12R\" type=\"hL\" />\n+ <Atom charge=\"0.017208\" name=\"H12S\" type=\"hL\" />\n+ <Atom charge=\"0.017463\" name=\"C213\" type=\"cD\" />\n+ <Atom charge=\"0.007531\" name=\"H13R\" type=\"hL\" />\n+ <Atom charge=\"0.007531\" name=\"H13S\" type=\"hL\" />\n+ <Atom charge=\"-0.111712\" name=\"C214\" type=\"cD\" />\n+ <Atom charge=\"0.025511\" name=\"H14R\" type=\"hL\" />\n+ <Atom charge=\"0.025511\" name=\"H14S\" type=\"hL\" />\n+ <Atom charge=\"0.025511\" name=\"H14T\" type=\"hL\" />\n+ <Atom charge=\"-0.002435\" name=\"C33\" type=\"cD\" />\n+ <Atom charge=\"0.018859\" name=\"H3X\" type=\"hL\" />\n+ <Atom charge=\"0.018859\" name=\"H3Y\" type=\"hL\" />\n+ <Atom charge=\"-0.026954\" name=\"C34\" type=\"cD\" />\n+ <Atom charge=\"0.020431\" name=\"H4X\" type=\"hL\" />\n+ <Atom charge=\"0.020431\" name=\"H4Y\" type=\"hL\" />\n+ <Atom charge=\"-0.016521\" name=\"C35\" type=\"cD\" />\n+ <Atom charge=\"0.010573\" name=\"H5X\" type=\"hL\" />\n+ <Atom charge=\"0.010573\" name=\"H5Y\" type=\"hL\" />\n+ <Atom charge=\"-0.027812\" name=\"C36\" type=\"cD\" />\n+ <Atom charge=\"0.011511\" name=\"H6X\" type=\"hL\" />\n+ <Atom charge=\"0.011511\" name=\"H6Y\" type=\"hL\" />\n+ <Atom charge=\"-0.004386\" name=\"C37\" type=\"cD\" />\n+ <Atom charge=\"0.006833\" name=\"H7X\" type=\"hL\" />\n+ <Atom charge=\"0.006833\" name=\"H7Y\" type=\"hL\" />\n+ <Atom charge=\"-0.026451\" name=\"C38\" type=\"cD\" />\n+ <Atom charge=\"0.011241\" name=\"H8X\" type=\"hL\" />\n+ <Atom charge=\"0.011241\" name=\"H8Y\" type=\"hL\" />\n+ <Atom charge=\"-0.014653\" name=\"C39\" type=\"cD\" />\n+ <Atom charge=\"0.010172\" name=\"H9X\" type=\"hL\" />\n+ <Atom charge=\"0.010172\" name=\"H9Y\" type=\"hL\" />\n+ <Atom charge=\"-0.021025\" name=\"C310\" type=\"cD\" />\n+ <Atom charge=\"0.010037\" name=\"H10X\" type=\"hL\" />\n+ <Atom charge=\"0.010037\" name=\"H10Y\" type=\"hL\" />\n+ <Atom charge=\"-0.031787\" name=\"C311\" type=\"cD\" />\n+ <Atom charge=\"0.012677\" name=\"H11X\" type=\"hL\" />\n+ <Atom charge=\"0.012677\" name=\"H11Y\" type=\"hL\" />\n+ <Atom charge=\"-0.028094\" name=\"C312\" type=\"cD\" />\n+ <Atom charge=\"0.017208\" name=\"H12X\" type=\"hL\" />\n+ <Atom charge=\"0.017208\" name=\"H12Y\" type=\"hL\" />\n+ <Atom charge=\"0.017463\" name=\"C313\" type=\"cD\" />\n+ <Atom charge=\"0.007531\" name=\"H13X\" type=\"hL\" />\n+ <Atom charge=\"0.007531\" name=\"H13Y\" type=\"hL\" />\n+ <Atom charge=\"-0.111712\" name=\"C314\" type=\"cD\" />\n+ <Atom charge=\"0.025511\" name=\"H14X\" type=\"hL\" />\n+ <Atom charge=\"0.025511\" name=\"H14Y\" type=\"hL\" />\n+ <Atom charge=\"0.025511\" name=\"H14Z\" type=\"hL\" />\n+ <Bond atomName1=\"O12\" atomName2=\"P\" />\n+ <Bond atomName1=\"P\" atomName2=\"O11\" />\n+ <Bond atomName1=\"P\" atomName2=\"O13\" />\n+ <Bond atomName1=\"P\" atomName2=\"O14\" />\n+ <Bond atomName1=\"O12\" atomName2=\"H12\" />\n+ <Bond atomName1=\"O11\" atomName2=\"C1\" />\n+ <Bond atomName1=\"C1\" atomName2=\"HA\" />\n+ <Bond atomName1=\"C1\" atomName2=\"HB\" />\n+ <Bond atomName1=\"C1\" atomName2=\"C2\" />\n+ <Bond atomName1=\"C2\" atomName2=\"HS\" />\n+ <Bond atomName1=\"C2\" atomName2=\"C3\" />\n+ <Bond atomName1=\"C2\" atomName2=\"O21\" />\n+ <Bond atomName1=\"C3\" atomName2=\"HX\" />\n+ <Bond atomName1=\"C3\" atomName2=\"HY\" />\n+ <Bond atomName1=\"C3\" atomName2=\"O31\" />\n+ <Bond atomName1=\"O21\" atomName2=\"C21\" />\n+ <Bond atomName1=\"C21\" atomName2=\"C22\" />\n+ <Bond atomName1=\"C21\" atomName2=\"O22\" />\n+ <Bond atomName1=\"C22\" atomName2=\"H2R\" />\n+ <Bond atomName1=\"C22\" atomName2=\"H2S\" />\n+ <Bond atomName1=\"C22\" atomName2=\"C23\" />\n+ <Bond atomName1=\"C23\" atomName2=\"H3R\" />\n+ <Bond atomName1=\"C23\" atomName2=\"H3S\" />\n+ <Bond atomName1=\"C23\" atomName2=\"C24\" />\n+ <Bond atomName1=\"C24\" atomName2=\"H4R\" />\n+ <Bond atomName1=\"C24\" atomName2=\"H4S\" />\n+ <Bond atomName1=\"C24\" atomName2=\"C25\" />\n+ <Bond atomName1=\"C25\" atomName2=\"H5R\" />\n+ <Bond atomName1=\"C25\" atomName2=\"H5S\" />\n+ <Bond atomName1=\"C25\" atomName2=\"C26\" />\n+ <Bond atomName1=\"C26\" atomName2=\"H6R\" />\n+ <Bond atomName1=\"C26\" atomName2=\"H6S\" />\n+ <Bond atomName1=\"C26\" atomName2=\"C27\" />\n+ <Bond atomName1=\"C27\" atomName2=\"H7R\" />\n+ <Bond atomName1=\"C27\" atomName2=\"H7S\" />\n+ <Bond atomName1=\"C27\" atomName2=\"C28\" />\n+ <Bond atomName1=\"C28\" atomName2=\"H8R\" />\n+ <Bond atomName1=\"C28\" atomName2=\"H8S\" />\n+ <Bond atomName1=\"C28\" atomName2=\"C29\" />\n+ <Bond atomName1=\"C29\" atomName2=\"H9R\" />\n+ <Bond atomName1=\"C29\" atomName2=\"H9S\" />\n+ <Bond atomName1=\"C29\" atomName2=\"C210\" />\n+ <Bond atomName1=\"C210\" atomName2=\"H10R\" />\n+ <Bond atomName1=\"C210\" atomName2=\"H10S\" />\n+ <Bond atomName1=\"C210\" atomName2=\"C211\" />\n+ <Bond atomName1=\"C211\" atomName2=\"H11R\" />\n+ <Bond atomName1=\"C211\" atomName2=\"H11S\" />\n+ <Bond atomName1=\"C211\" atomName2=\"C212\" />\n+ <Bond atomName1=\"C212\" atomName2=\"H12R\" />\n+ <Bond atomName1=\"C212\" atomName2=\"H12S\" />\n+ <Bond atomName1=\"C212\" atomName2=\"C213\" />\n+ <Bond atomName1=\"C213\" atomName2=\"H13R\" />\n+ <Bond atomName1=\"C213\" atomName2=\"H13S\" />\n+ <Bond atomName1=\"C213\" atomName2=\"C214\" />\n+ <Bond atomName1=\"C214\" atomName2=\"H14R\" />\n+ <Bond atomName1=\"C214\" atomName2=\"H14S\" />\n+ <Bond atomName1=\"C214\" atomName2=\"H14T\" />\n+ <Bond atomName1=\"O31\" atomName2=\"C31\" />\n+ <Bond atomName1=\"C31\" atomName2=\"C32\" />\n+ <Bond atomName1=\"C31\" atomName2=\"O32\" />\n+ <Bond atomName1=\"C32\" atomName2=\"H2X\" />\n+ <Bond atomName1=\"C32\" atomName2=\"H2Y\" />\n+ <Bond atomName1=\"C32\" atomName2=\"C33\" />\n+ <Bond atomName1=\"C33\" atomName2=\"H3X\" />\n+ <Bond atomName1=\"C33\" atomName2=\"H3Y\" />\n+ <Bond atomName1=\"C33\" atomName2=\"C34\" />\n+ <Bond atomName1=\"C34\" atomName2=\"H4X\" />\n+ <Bond atomName1=\"C34\" atomName2=\"H4Y\" />\n+ <Bond atomName1=\"C34\" atomName2=\"C35\" />\n+ <Bond atomName1=\"C35\" atomName2=\"H5X\" />\n+ <Bond atomName1=\"C35\" atomName2=\"H5Y\" />\n+ <Bond atomName1=\"C35\" atomName2=\"C36\" />\n+ <Bond atomName1=\"C36\" atomName2=\"H6X\" />\n+ <Bond atomName1=\"C36\" atomName2=\"H6Y\" />\n+ <Bond atomName1=\"C36\" atomName2=\"C37\" />\n+ <Bond atomName1=\"C37\" atomName2=\"H7X\" />\n+ <Bond atomName1=\"C37\" atomName2=\"H7Y\" />\n+ <Bond atomName1=\"C37\" atomName2=\"C38\" />\n+ <Bond atomName1=\"C38\" atomName2=\"H8X\" />\n+ <Bond atomName1=\"C38\" atomName2=\"H8Y\" />\n+ <Bond atomName1=\"C38\" atomName2=\"C39\" />\n+ <Bond atomName1=\"C39\" atomName2=\"H9X\" />\n+ <Bond atomName1=\"C39\" atomName2=\"H9Y\" />\n+ <Bond atomName1=\"C39\" atomName2=\"C310\" />\n+ <Bond atomName1=\"C310\" atomName2=\"H10X\" />\n+ <Bond atomName1=\"C310\" atomName2=\"H10Y\" />\n+ <Bond atomName1=\"C310\" atomName2=\"C311\" />\n+ <Bond atomName1=\"C311\" atomName2=\"H11X\" />\n+ <Bond atomName1=\"C311\" atomName2=\"H11Y\" />\n+ <Bond atomName1=\"C311\" atomName2=\"C312\" />\n+ <Bond atomName1=\"C312\" atomName2=\"H12X\" />\n+ <Bond atomName1=\"C312\" atomName2=\"H12Y\" />\n+ <Bond atomName1=\"C312\" atomName2=\"C313\" />\n+ <Bond atomName1=\"C313\" atomName2=\"H13X\" />\n+ <Bond atomName1=\"C313\" atomName2=\"H13Y\" />\n+ <Bond atomName1=\"C313\" atomName2=\"C314\" />\n+ <Bond atomName1=\"C314\" atomName2=\"H14X\" />\n+ <Bond atomName1=\"C314\" atomName2=\"H14Y\" />\n+ <Bond atomName1=\"C314\" atomName2=\"H14Z\" />\n+ </Residue>\n+ <Residue name=\"DMPG\">\n+ <Atom charge=\"0.193597\" name=\"C13\" type=\"cA\" />\n+ <Atom charge=\"0.034715\" name=\"H13A\" type=\"hE\" />\n+ <Atom charge=\"0.034715\" name=\"H13B\" type=\"hE\" />\n+ <Atom charge=\"-0.700871\" name=\"OC3\" type=\"oH\" />\n+ <Atom charge=\"0.423328\" name=\"HO3\" type=\"hO\" />\n+ <Atom charge=\"0.336816\" name=\"C12\" type=\"cA\" />\n+ <Atom charge=\"0.030042\" name=\"H12A\" type=\"hE\" />\n+ <Atom charge=\"-0.726192\" name=\"OC2\" type=\"oH\" />\n+ <Atom charge=\"0.439523\" name=\"HO2\" type=\"hO\" />\n+ <Atom charge=\"-0.056706\" name=\"C11\" type=\"cA\" />\n+ <Atom charge=\"0.093354\" name=\"H11A\" type=\"hE\" />\n+ <Atom charge=\"0.093354\" name=\"H11B\" type=\"hE\" />\n+ <Atom charge=\"1.380464\" name=\"P\" type=\"pA\" />\n+ <Atom charge=\"-0.873444\" name=\"O13\" type=\"oP\" />\n+ <Atom charge=\"-0.873444\" name=\"O14\" type=\"oP\" />\n+ <Atom charge=\"-0.534308\" name=\"O12\" type=\"oT\" />\n+ <Atom charge=\"-0.546098\" name=\"O11\" type=\"oT\" />\n+ <Atom charge=\"0.043713\" name=\"C1\" type=\"cA\" />\n+ <Atom charge=\"0.091041\" name=\"HA\" type=\"hE\" />\n+ <Atom charge=\"0.091041\" name=\"HB\" type=\"hE\" />\n+ <Atom charge=\"0.353807\" name=\"C2\" type=\"cA\" />\n+ <Atom charge=\"0.037488\" name=\"HS\" type=\"hE\" />\n+ <Atom charge=\"-0.599131\" name=\"O21\" type=\"oS\" />\n+ <Atom charge=\"0.883669\" name=\"C21\" type=\"cC\" />\n+ <Atom charge=\"-0.655762\" name=\"O22\" type=\"oC\" />\n+ <Atom charge=\"-0.1642\" name=\"C22\" type=\"cD\" />\n+ <Atom charge=\"0.053944\" name=\"H2R\" type=\"hL\" />\n+ <Atom charge=\"0.053944\" name=\"H2S\" type=\"hL\" />\n+ <Atom charge=\"0.295119\" name=\"C3\" type=\"cA\" />\n+ <Atom charge=\"0.033797\" name=\"HX\" type=\"hE\" />\n+ <Atom charge=\"0.033797\" name=\"HY\" type=\"hE\" />\n+ <Atom charge=\"-0.585165\" name=\"O31\" type=\"oS\" />\n+ <Atom charge=\"0.877006\" name=\"C31\" type=\"cC\" />\n+ <Atom charge=\"-0.649265\" name=\"O32\" type=\"oC\" />\n+ <Atom charge=\"-0.1642\" name=\"C32\" type=\"cD\" />\n+ <Atom charge=\"0.053944\" name=\"H2X\" type=\"hL\" />\n+ <Atom charge=\"0.053944\" name=\"H2Y\" type=\"hL\" />\n+ <Atom charge=\"-0.002435\" name=\"C23\" type=\"cD\" />\n+ <Atom charge=\"0.018859\" name=\"H3R\" type=\"hL\" />\n+ <Atom charge=\"0.018859\" name=\"H3S\" type=\"hL\" />\n+ <Atom charge=\"-0.026954\" name=\"C24\" type=\"cD\" />\n+ <Atom charge=\"0.020431\" name=\"H4R\" type=\"hL\" />\n+ <Atom charge=\"0.020431\" name=\"H4S\" type=\"hL\" />\n+ <Atom charge=\"-0.016521\" name=\"C25\" type=\"cD\" />\n+ <Atom charge=\"0.010573\" name=\"H5R\" type=\"hL\" />\n+ <Atom charge=\"0.010573\" name=\"H5S\" type=\"hL\" />\n+ <Atom charge=\"-0.027812\" name=\"C26\" type=\"cD\" />\n+ <Atom charge=\"0.011511\" name=\"H6R\" type=\"hL\" />\n+ <Atom charge=\"0.011511\" name=\"H6S\" type=\"hL\" />\n+ <Atom charge=\"-0.004386\" name=\"C27\" type=\"cD\" />\n+ <Atom charge=\"0.006833\" name=\"H7R\" type=\"hL\" />\n+ <Atom charge=\"0.006833\" name=\"H7S\" type=\"hL\" />\n+ <Atom charge=\"-0.026451\" name=\"C28\" type=\"cD\" />\n+ <Atom charge=\"0.011241\" name=\"H8R\" type=\"hL\" />\n+ <Atom charge=\"0.011241\" name=\"H8S\" type=\"hL\" />\n+ <Atom charge=\"-0.014653\" name=\"C29\" type=\"cD\" />\n+ <Atom charge=\"0.010172\" name=\"H9R\" type=\"hL\" />\n+ <Atom charge=\"0.010172\" name=\"H9S\" type=\"hL\" />\n+ <Atom charge=\"-0.021025\" name=\"C210\" type=\"cD\" />\n+ <Atom charge=\"0.010037\" name=\"H10R\" type=\"hL\" />\n+ <Atom charge=\"0.010037\" name=\"H10S\" type=\"hL\" />\n+ <Atom charge=\"-0.031787\" name=\"C211\" type=\"cD\" />\n+ <Atom charge=\"0.012677\" name=\"H11R\" type=\"hL\" />\n+ <Atom charge=\"0.012677\" name=\"H11S\" type=\"hL\" />\n+ <Atom charge=\"-0.028094\" name=\"C212\" type=\"cD\" />\n+ <Atom charge=\"0.017208\" name=\"H12R\" type=\"hL\" />\n+ <Atom charge=\"0.017208\" name=\"H12S\" type=\"hL\" />\n+ <Atom charge=\"0.017463\" name=\"C213\" type=\"cD\" />\n+ <Atom charge=\"0.007531\" name=\"H13R\" type=\"hL\" />\n+ <Atom charge=\"0.007531\" name=\"H13S\" type=\"hL\" />\n+ <Atom charge=\"-0.111712\" name=\"C214\" type=\"cD\" />\n+ <Atom charge=\"0.025511\" name=\"H14R\" type=\"hL\" />\n+ <Atom charge=\"0.025511\" name=\"H14S\" type=\"hL\" />\n+ <Atom charge=\"0.025511\" name=\"H14T\" type=\"hL\" />\n+ <Atom charge=\"-0.002435\" name=\"C33\" type=\"cD\" />\n+ <Atom charge=\"0.018859\" name=\"H3X\" type=\"hL\" />\n+ <Atom charge=\"0.018859\" name=\"H3Y\" type=\"hL\" />\n+ <Atom charge=\"-0.026954\" name=\"C34\" type=\"cD\" />\n+ <Atom charge=\"0.020431\" name=\"H4X\" type=\"hL\" />\n+ <Atom charge=\"0.020431\" name=\"H4Y\" type=\"hL\" />\n+ <Atom charge=\"-0.016521\" name=\"C35\" type=\"cD\" />\n+ <Atom charge=\"0.010573\" name=\"H5X\" type=\"hL\" />\n+ <Atom charge=\"0.010573\" name=\"H5Y\" type=\"hL\" />\n+ <Atom charge=\"-0.027812\" name=\"C36\" type=\"cD\" />\n+ <Atom charge=\"0.011511\" name=\"H6X\" type=\"hL\" />\n+ <Atom charge=\"0.011511\" name=\"H6Y\" type=\"hL\" />\n+ <Atom charge=\"-0.004386\" name=\"C37\" type=\"cD\" />\n+ <Atom charge=\"0.006833\" name=\"H7X\" type=\"hL\" />\n+ <Atom charge=\"0.006833\" name=\"H7Y\" type=\"hL\" />\n+ <Atom charge=\"-0.026451\" name=\"C38\" type=\"cD\" />\n+ <Atom charge=\"0.011241\" name=\"H8X\" type=\"hL\" />\n+ <Atom charge=\"0.011241\" name=\"H8Y\" type=\"hL\" />\n+ <Atom charge=\"-0.014653\" name=\"C39\" type=\"cD\" />\n+ <Atom charge=\"0.010172\" name=\"H9X\" type=\"hL\" />\n+ <Atom charge=\"0.010172\" name=\"H9Y\" type=\"hL\" />\n+ <Atom charge=\"-0.021025\" name=\"C310\" type=\"cD\" />\n+ <Atom charge=\"0.010037\" name=\"H10X\" type=\"hL\" />\n+ <Atom charge=\"0.010037\" name=\"H10Y\" type=\"hL\" />\n+ <Atom charge=\"-0.031787\" name=\"C311\" type=\"cD\" />\n+ <Atom charge=\"0.012677\" name=\"H11X\" type=\"hL\" />\n+ <Atom charge=\"0.012677\" name=\"H11Y\" type=\"hL\" />\n+ <Atom charge=\"-0.028094\" name=\"C312\" type=\"cD\" />\n+ <Atom charge=\"0.017208\" name=\"H12X\" type=\"hL\" />\n+ <Atom charge=\"0.017208\" name=\"H12Y\" type=\"hL\" />\n+ <Atom charge=\"0.017463\" name=\"C313\" type=\"cD\" />\n+ <Atom charge=\"0.007531\" name=\"H13X\" type=\"hL\" />\n+ <Atom charge=\"0.007531\" name=\"H13Y\" type=\"hL\" />\n+ <Atom charge=\"-0.111712\" name=\"C314\" type=\"cD\" />\n+ <Atom charge=\"0.025511\" name=\"H14X\" type=\"hL\" />\n+ <Atom charge=\"0.025511\" name=\"H14Y\" type=\"hL\" />\n+ <Atom charge=\"0.025511\" name=\"H14Z\" type=\"hL\" />\n+ <Bond atomName1=\"HO3\" atomName2=\"OC3\" />\n+ <Bond atomName1=\"OC3\" atomName2=\"C13\" />\n+ <Bond atomName1=\"C13\" atomName2=\"H13A\" />\n+ <Bond atomName1=\"C13\" atomName2=\"H13B\" />\n+ <Bond atomName1=\"C13\" atomName2=\"C12\" />\n+ <Bond atomName1=\"HO2\" atomName2=\"OC2\" />\n+ <Bond atomName1=\"OC2\" atomName2=\"C12\" />\n+ <Bond atomName1=\"C12\" atomName2=\"H12A\" />\n+ <Bond atomName1=\"C12\" atomName2=\"C11\" />\n+ <Bond atomName1=\"C11\" atomName2=\"H11A\" />\n+ <Bond atomName1=\"C11\" atomName2=\"H11B\" />\n+ <Bond atomName1=\"C11\" atomName2=\"O12\" />\n+ <Bond atomName1=\"O11\" atomName2=\"C1\" />\n+ <Bond atomName1=\"O12\" atomName2=\"P\" />\n+ <Bond atomName1=\"P\" atomName2=\"O11\" />\n+ <Bond atomName1=\"P\" atomName2=\"O13\" />\n+ <Bond atomName1=\"P\" atomName2=\"O14\" />\n+ <Bond atomName1=\"C1\" atomName2=\"HA\" />\n+ <Bond atomName1=\"C1\" atomName2=\"HB\" />\n+ <Bond atomName1=\"C1\" atomName2=\"C2\" />\n+ <Bond atomName1=\"C2\" atomName2=\"HS\" />\n+ <Bond atomName1=\"C2\" atomName2=\"C3\" />\n+ <Bond atomName1=\"C2\" atomName2=\"O21\" />\n+ <Bond atomName1=\"C3\" atomName2=\"HX\" />\n+ <Bond atomName1=\"C3\" atomName2=\"HY\" />\n+ <Bond atomName1=\"C3\" atomName2=\"O31\" />\n+ <Bond atomName1=\"O21\" atomName2=\"C21\" />\n+ <Bond atomName1=\"C21\" atomName2=\"C22\" />\n+ <Bond atomName1=\"C21\" atomName2=\"O22\" />\n+ <Bond atomName1=\"C22\" atomName2=\"H2R\" />\n+ <Bond atomName1=\"C22\" atomName2=\"H2S\" />\n+ <Bond atomName1=\"C22\" atomName2=\"C23\" />\n+ <Bond atomName1=\"C23\" atomName2=\"H3R\" />\n+ <Bond atomName1=\"C23\" atomName2=\"H3S\" />\n+ <Bond atomName1=\"C23\" atomName2=\"C24\" />\n+ <Bond atomName1=\"C24\" atomName2=\"H4R\" />\n+ <Bond atomName1=\"C24\" atomName2=\"H4S\" />\n+ <Bond atomName1=\"C24\" atomName2=\"C25\" />\n+ <Bond atomName1=\"C25\" atomName2=\"H5R\" />\n+ <Bond atomName1=\"C25\" atomName2=\"H5S\" />\n+ <Bond atomName1=\"C25\" atomName2=\"C26\" />\n+ <Bond atomName1=\"C26\" atomName2=\"H6R\" />\n+ <Bond atomName1=\"C26\" atomName2=\"H6S\" />\n+ <Bond atomName1=\"C26\" atomName2=\"C27\" />\n+ <Bond atomName1=\"C27\" atomName2=\"H7R\" />\n+ <Bond atomName1=\"C27\" atomName2=\"H7S\" />\n+ <Bond atomName1=\"C27\" atomName2=\"C28\" />\n+ <Bond atomName1=\"C28\" atomName2=\"H8R\" />\n+ <Bond atomName1=\"C28\" atomName2=\"H8S\" />\n+ <Bond atomName1=\"C28\" atomName2=\"C29\" />\n+ <Bond atomName1=\"C29\" atomName2=\"H9R\" />\n+ <Bond atomName1=\"C29\" atomName2=\"H9S\" />\n+ <Bond atomName1=\"C29\" atomName2=\"C210\" />\n+ <Bond atomName1=\"C210\" atomName2=\"H10R\" />\n+ <Bond atomName1=\"C210\" atomName2=\"H10S\" />\n+ <Bond atomName1=\"C210\" atomName2=\"C211\" />\n+ <Bond atomName1=\"C211\" atomName2=\"H11R\" />\n+ <Bond atomName1=\"C211\" atomName2=\"H11S\" />\n+ <Bond atomName1=\"C211\" atomName2=\"C212\" />\n+ <Bond atomName1=\"C212\" atomName2=\"H12R\" />\n+ <Bond atomName1=\"C212\" atomName2=\"H12S\" />\n+ <Bond atomName1=\"C212\" atomName2=\"C213\" />\n+ <Bond atomName1=\"C213\" atomName2=\"H13R\" />\n+ <Bond atomName1=\"C213\" atomName2=\"H13S\" />\n+ <Bond atomName1=\"C213\" atomName2=\"C214\" />\n+ <Bond atomName1=\"C214\" atomName2=\"H14R\" />\n+ <Bond atomName1=\"C214\" atomName2=\"H14S\" />\n+ <Bond atomName1=\"C214\" atomName2=\"H14T\" />\n+ <Bond atomName1=\"O31\" atomName2=\"C31\" />\n+ <Bond atomName1=\"C31\" atomName2=\"C32\" />\n+ <Bond atomName1=\"C31\" atomName2=\"O32\" />\n+ <Bond atomName1=\"C32\" atomName2=\"H2X\" />\n+ <Bond atomName1=\"C32\" atomName2=\"H2Y\" />\n+ <Bond atomName1=\"C32\" atomName2=\"C33\" />\n+ <Bond atomName1=\"C33\" atomName2=\"H3X\" />\n+ <Bond atomName1=\"C33\" atomName2=\"H3Y\" />\n+ <Bond atomName1=\"C33\" atomName2=\"C34\" />\n+ <Bond atomName1=\"C34\" atomName2=\"H4X\" />\n+ <Bond atomName1=\"C34\" atomName2=\"H4Y\" />\n+ <Bond atomName1=\"C34\" atomName2=\"C35\" />\n+ <Bond atomName1=\"C35\" atomName2=\"H5X\" />\n+ <Bond atomName1=\"C35\" atomName2=\"H5Y\" />\n+ <Bond atomName1=\"C35\" atomName2=\"C36\" />\n+ <Bond atomName1=\"C36\" atomName2=\"H6X\" />\n+ <Bond atomName1=\"C36\" atomName2=\"H6Y\" />\n+ <Bond atomName1=\"C36\" atomName2=\"C37\" />\n+ <Bond atomName1=\"C37\" atomName2=\"H7X\" />\n+ <Bond atomName1=\"C37\" atomName2=\"H7Y\" />\n+ <Bond atomName1=\"C37\" atomName2=\"C38\" />\n+ <Bond atomName1=\"C38\" atomName2=\"H8X\" />\n+ <Bond atomName1=\"C38\" atomName2=\"H8Y\" />\n+ <Bond atomName1=\"C38\" atomName2=\"C39\" />\n+ <Bond atomName1=\"C39\" atomName2=\"H9X\" />\n+ <Bond atomName1=\"C39\" atomName2=\"H9Y\" />\n+ <Bond atomName1=\"C39\" atomName2=\"C310\" />\n+ <Bond atomName1=\"C310\" atomName2=\"H10X\" />\n+ <Bond atomName1=\"C310\" atomName2=\"H10Y\" />\n+ <Bond atomName1=\"C310\" atomName2=\"C311\" />\n+ <Bond atomName1=\"C311\" atomName2=\"H11X\" />\n+ <Bond atomName1=\"C311\" atomName2=\"H11Y\" />\n+ <Bond atomName1=\"C311\" atomName2=\"C312\" />\n+ <Bond atomName1=\"C312\" atomName2=\"H12X\" />\n+ <Bond atomName1=\"C312\" atomName2=\"H12Y\" />\n+ <Bond atomName1=\"C312\" atomName2=\"C313\" />\n+ <Bond atomName1=\"C313\" atomName2=\"H13X\" />\n+ <Bond atomName1=\"C313\" atomName2=\"H13Y\" />\n+ <Bond atomName1=\"C313\" atomName2=\"C314\" />\n+ <Bond atomName1=\"C314\" atomName2=\"H14X\" />\n+ <Bond atomName1=\"C314\" atomName2=\"H14Y\" />\n+ <Bond atomName1=\"C314\" atomName2=\"H14Z\" />\n+ </Residue>\n+ <Residue name=\"DPPC\">\n+ <Atom charge=\"0.245262\" name=\"N\" type=\"nA\" />\n+ <Atom charge=\"-0.338973\" name=\"C13\" type=\"cA\" />\n+ <Atom charge=\"0.17223\" name=\"H13A\" type=\"hX\" />\n+ <Atom charge=\"0.17223\" name=\"H13B\" type=\"hX\" />\n+ <Atom charge=\"0.17223\" name=\"H13C\" type=\"hX\" />\n+ <Atom charge=\"-0.338973\" name=\"C14\" type=\"cA\" />\n+ <Atom charge=\"0.17223\" name=\"H14A\" type=\"hX\" />\n+ <Atom charge=\"0.17223\" name=\"H14B\" type=\"hX\" />\n+ <Atom charge=\"0.17223\" name=\"H14C\" type=\"hX\" />\n+ <Atom charge=\"-0.338973\" name=\"C15\" type=\"cA\" />\n+ <Atom charge=\"0.17223\" name=\"H15A\" type=\"hX\" />\n+ <Atom charge=\"0.17223\" name=\"H15B\" type=\"hX\" />\n+ <Atom charge=\"0.17223\" name=\"H15C\" type=\"hX\" />\n+ <Atom charge=\"-0.170824\" name=\"C12\" type=\"cA\" />\n+ <Atom charge=\"0.136415\" name=\"H12A\" type=\"hX\" />\n+ <Atom charge=\"0.136415\" name=\"H12B\" type=\"hX\" />\n+ <Atom charge=\"0.166801\" name=\"C11\" type=\"cA\" />\n+ <Atom charge=\"0.078534\" name=\"H11A\" type=\"hE\" />\n+ <Atom charge=\"0.078534\" name=\"H11B\" type=\"hE\" />\n+ <Atom charge=\"1.339721\" name=\"P\" type=\"pA\" />\n+ <Atom charge=\"-0.875812\" name=\"O13\" type=\"oP\" />\n+ <Atom charge=\"-0.875812\" name=\"O14\" type=\"oP\" />\n+ <Atom charge=\"-0.50948\" name=\"O11\" type=\"oT\" />\n+ <Atom charge=\"-0.508176\" name=\"O12\" type=\"oT\" />\n+ <Atom charge=\"0.017459\" name=\"C1\" type=\"cA\" />\n+ <Atom charge=\"0.095591\" name=\"HA\" type=\"hE\" />\n+ <Atom charge=\"0.095591\" name=\"HB\" type=\"hE\" />\n+ <Atom charge=\"0.281242\" name=\"C2\" type=\"cA\" />\n+ <Atom charge=\"0.063253\" name=\"HS\" type=\"hE\" />\n+ <Atom charge=\"-0.552948\" name=\"O21\" type=\"oS\" />\n+ <Atom charge=\"0.897613\" name=\"C21\" type=\"cC\" />\n+ <Atom charge=\"-0.673755\" name=\"O22\" type=\"oC\" />\n+ <Atom charge=\"-0.149259\" name=\"C22\" type=\"cD\" />\n+ <Atom charge=\"0.047345\" name=\"H2R\" type=\"hL\" />\n+ <Atom charge=\"0.047345\" name=\"H2S\" type=\"hL\" />\n+ <Atom charge=\"0.196939\" name=\"C3\" type=\"cA\" />\n+ <Atom charge=\"0.070469\" name=\"HX\" type=\"hE\" />\n+ <Atom charge=\"0.070469\" name=\"HY\" type=\"hE\" />\n+ <Atom charge=\"-0.575489\" name=\"O31\" type=\"oS\" />\n+ <Atom charge=\"0.910403\" name=\"C31\" type=\"cC\" />\n+ <Atom charge=\"-0.671566\" name=\"O32\" type=\"oC\" />\n+ <Atom charge=\"-0.149259\" name=\"C32\" type=\"cD\" />\n+ <Atom charge=\"0.047345\" name=\"H2X\" type=\"hL\" />\n+ <Atom charge=\"0.047345\" name=\"H2Y\" type=\"hL\" />\n+ <Atom charge=\"-0.004882\" name=\"C23\" type=\"cD\" />\n+ <Atom charge=\"0.019007\" name=\"H3R\" type=\"hL\" />\n+ <Atom charge=\"0.019007\" name=\"H3S\" type=\"hL\" />\n+ <Atom charge=\"-0.030099\" name=\"C24\" type=\"cD\" />\n+ <Atom charge=\"0.020877\" name=\"H4R\" type=\"hL\" />\n+ <Atom charge=\"0.020877\" name=\"H4S\" type=\"hL\" />\n+ <Atom charge=\"-0.029387\" name=\"C25\" type=\"cD\" />\n+ <Atom charge=\"0.016763\" name=\"H5R\" type=\"hL\" />\n+ <Atom charge=\"0.016763\" name=\"H5S\" type=\"hL\" />\n+ <Atom charge=\"-0.024427\" name=\"C26\" type=\"cD\" />\n+ <Atom charge=\"0.013334\" name=\"H6R\" type=\"hL\" />\n+ <Atom charge=\"0.013334\" name=\"H6S\" type=\"hL\" />\n+ <Atom charge=\"-0.01963\" name=\"C27\" type=\"cD\" />\n+ <Atom charge=\"0.011041\" name=\"H7R\" type=\"hL\" />\n+ <Atom charge=\"0.011041\" name=\"H7S\" type=\"hL\" />\n+ <Atom charge=\"-0.015793\" name=\"C28\" type=\"cD\" />\n+ <Atom charge=\"0.009067\" name=\"H8R\" type=\"hL\" />\n+ <Atom charge=\"0.009067\" name=\"H8S\" type=\"hL\" />\n+ <Atom charge=\"-0.030472\" name=\"C29\" type=\"cD\" />\n+ <Atom charge=\"0.013897\" name=\"H9R\" type=\"hL\" />\n+ <Atom charge=\"0.013897\" name=\"H9S\" type=\"hL\" />\n+ <Atom charge=\"-0.028831\" name=\"C210\" type=\"cD\" />\n+ <Atom charge=\"0.014691\" name=\"H10R\" type=\"hL\" />\n+ <Atom charge=\"0.014691\" name=\"H10S\" type=\"hL\" />\n+ <Atom charge=\"-0.025206\" name=\"C211\" type=\"cD\" />\n+ <Atom charge=\"0.014334\" name=\"H11R\" type=\"hL\" />\n+ <Atom charge=\"0.014334\" name=\"H11S\" type=\"hL\" />\n+ <Atom charge=\"-0.027633\" name=\"C212\" type=\"cD\" />\n+ <Atom charge=\"0.011368\" name=\"H12R\" type=\"hL\" />\n+ <Atom charge=\"0.011368\" name=\"H12S\" type=\"hL\" />\n+ <Atom charge=\"-0.033096\" name=\"C213\" type=\"cD\" />\n+ <Atom charge=\"0.014621\" name=\"H13R\" type=\"hL\" />\n+ <Atom charge=\"0.014621\" name=\"H13S\" type=\"hL\" />\n+ <Atom charge=\"-0.020086\" name=\"C214\" type=\"cD\" />\n+ <Atom charge=\"0.015929\" name=\"H14R\" type=\"hL\" />\n+ <Atom charge=\"0.015929\" name=\"H14S\" type=\"hL\" />\n+ <Atom charge=\"0.013975\" name=\"C215\" type=\"cD\" />\n+ <Atom charge=\"0.009292\" name=\"H15R\" type=\"hL\" />\n+ <Atom charge=\"0.009292\" name=\"H15S\" type=\"hL\" />\n+ <Atom charge=\"-0.125447\" name=\"C216\" type=\"cD\" />\n+ <Atom charge=\"0.029047\" name=\"H16R\" type=\"hL\" />\n+ <Atom charge=\"0.029047\" name=\"H16S\" type=\"hL\" />\n+ <Atom charge=\"0.029047\" name=\"H16T\" type=\"hL\" />\n+ <Atom charge=\"-0.004882\" name=\"C33\" type=\"cD\" />\n+ <Atom charge=\"0.019007\" name=\"H3X\" type=\"hL\" />\n+ <Atom charge=\"0.019007\" name=\"H3Y\" type=\"hL\" />\n+ <Atom charge=\"-0.030099\" name=\"C34\" type=\"cD\" />\n+ <Atom charge=\"0.020877\" name=\"H4X\" type=\"hL\" />\n+ <Atom charge=\"0.020877\" name=\"H4Y\" type=\"hL\" />\n+ <Atom charge=\"-0.029387\" name=\"C35\" type=\"cD\" />\n+ <Atom charge=\"0.016763\" name=\"H5X\" type=\"hL\" />\n+ <Atom charge=\"0.016763\" name=\"H5Y\" type=\"hL\" />\n+ <Atom charge=\"-0.024427\" name=\"C36\" type=\"cD\" />\n+ <Atom charge=\"0.013334\" name=\"H6X\" type=\"hL\" />\n+ <Atom charge=\"0.013334\" name=\"H6Y\" type=\"hL\" />\n+ <Atom charge=\"-0.01963\" name=\"C37\" type=\"cD\" />\n+ <Atom charge=\"0.011041\" name=\"H7X\" type=\"hL\" />\n+ <Atom charge=\"0.011041\" name=\"H7Y\" type=\"hL\" />\n+ <Atom charge=\"-0.015793\" name=\"C38\" type=\"cD\" />\n+ <Atom charge=\"0.009067\" name=\"H8X\" type=\"hL\" />\n+ <Atom charge=\"0.009067\" name=\"H8Y\" type=\"hL\" />\n+ <Atom charge=\"-0.030472\" name=\"C39\" type=\"cD\" />\n+ <Atom charge=\"0.013897\" name=\"H9X\" type=\"hL\" />\n+ <Atom charge=\"0.013897\" name=\"H9Y\" type=\"hL\" />\n+ <Atom charge=\"-0.028831\" name=\"C310\" type=\"cD\" />\n+ <Atom charge=\"0.014691\" name=\"H10X\" type=\"hL\" />\n+ <Atom charge=\"0.014691\" name=\"H10Y\" type=\"hL\" />\n+ <Atom charge=\"-0.025206\" name=\"C311\" type=\"cD\" />\n+ <Atom charge=\"0.014334\" name=\"H11X\" type=\"hL\" />\n+ <Atom charge=\"0.014334\" name=\"H11Y\" type=\"hL\" />\n+ <Atom charge=\"-0.027633\" name=\"C312\" type=\"cD\" />\n+ <Atom charge=\"0.011368\" name=\"H12X\" type=\"hL\" />\n+ <Atom charge=\"0.011368\" name=\"H12Y\" type=\"hL\" />\n+ <Atom charge=\"-0.033096\" name=\"C313\" type=\"cD\" />\n+ <Atom charge=\"0.014621\" name=\"H13X\" type=\"hL\" />\n+ <Atom charge=\"0.014621\" name=\"H13Y\" type=\"hL\" />\n+ <Atom charge=\"-0.020086\" name=\"C314\" type=\"cD\" />\n+ <Atom charge=\"0.015929\" name=\"H14X\" type=\"hL\" />\n+ <Atom charge=\"0.015929\" name=\"H14Y\" type=\"hL\" />\n+ <Atom charge=\"0.013975\" name=\"C315\" type=\"cD\" />\n+ <Atom charge=\"0.009292\" name=\"H15X\" type=\"hL\" />\n+ <Atom charge=\"0.009292\" name=\"H15Y\" type=\"hL\" />\n+ <Atom charge=\"-0.125447\" name=\"C316\" type=\"cD\" />\n+ <Atom charge=\"0.029047\" name=\"H16X\" type=\"hL\" />\n+ <Atom charge=\"0.029047\" name=\"H16Y\" type=\"hL\" />\n+ <Atom charge=\"0.029047\" name=\"H16Z\" type=\"hL\" />\n+ <Bond atomName1=\"N\" atomName2=\"C13\" />\n+ <Bond atomName1=\"N\" atomName2=\"C14\" />\n+ <Bond atomName1=\"N\" atomName2=\"C15\" />\n+ <Bond atomName1=\"C13\" atomName2=\"H13A\" />\n+ <Bond atomName1=\"C13\" atomName2=\"H13B\" />\n+ <Bond atomName1=\"C13\" atomName2=\"H13C\" />\n+ <Bond atomName1=\"C14\" atomName2=\"H14A\" />\n+ <Bond atomName1=\"C14\" atomName2=\"H14B\" />\n+ <Bond atomName1=\"C14\" atomName2=\"H14C\" />\n+ <Bond atomName1=\"C15\" atomName2=\"H15A\" />\n+ <Bond atomName1=\"C15\" atomName2=\"H15B\" />\n+ <Bond atomName1=\"C15\" atomName2=\"H15C\" />\n+ <Bond atomName1=\"N\" atomName2=\"C12\" />\n+ <Bond atomName1=\"C12\" atomName2=\"H12A\" />\n+ <Bond atomName1=\"C12\" atomName2=\"H12B\" />\n+ <Bond atomName1=\"C12\" atomName2=\"C11\" />\n+ <Bond atomName1=\"C11\" atomName2=\"H11A\" />\n+ <Bond atomName1=\"C11\" atomName2=\"H11B\" />\n+ <Bond atomName1=\"C11\" atomName2=\"O12\" />\n+ <Bond atomName1=\"O12\" atomName2=\"P\" />\n+ <Bond atomName1=\"P\" atomName2=\"O11\" />\n+ <Bond atomName1=\"P\" atomName2=\"O13\" />\n+ <Bond atomName1=\"P\" atomName2=\"O14\" />\n+ <Bond atomName1=\"C1\" atomName2=\"HA\" />\n+ <Bond atomName1=\"C1\" atomName2=\"HB\" />\n+ <Bond atomName1=\"C1\" atomName2=\"C2\" />\n+ <Bond atomName1=\"C1\" atomName2=\"O11\" />\n+ <Bond atomName1=\"C2\" atomName2=\"HS\" />\n+ <Bond atomName1=\"C2\" atomName2=\"C3\" />\n+ <Bond atomName1=\"C2\" atomName2=\"O21\" />\n+ <Bond atomName1=\"C3\" atomName2=\"HX\" />\n+ <Bond atomName1=\"C3\" atomName2=\"HY\" />\n+ <Bond atomName1=\"C3\" atomName2=\"O31\" />\n+ <Bond atomName1=\"O21\" atomName2=\"C21\" />\n+ <Bond atomName1=\"C21\" atomName2=\"C22\" />\n+ <Bond atomName1=\"C21\" atomName2=\"O22\" />\n+ <Bond atomName1=\"C22\" atomName2=\"H2R\" />\n+ <Bond atomName1=\"C22\" atomName2=\"H2S\" />\n+ <Bond atomName1=\"C22\" atomName2=\"C23\" />\n+ <Bond atomName1=\"C23\" atomName2=\"H3R\" />\n+ <Bond atomName1=\"C23\" atomName2=\"H3S\" />\n+ <Bond atomName1=\"C23\" atomName2=\"C24\" />\n+ <Bond atomName1=\"C24\" atomName2=\"H4R\" />\n+ <Bond atomName1=\"C24\" atomName2=\"H4S\" />\n+ <Bond atomName1=\"C24\" atomName2=\"C25\" />\n+ <Bond atomName1=\"C25\" atomName2=\"H5R\" />\n+ <Bond atomName1=\"C25\" atomName2=\"H5S\" />\n+ <Bond atomName1=\"C25\" atomName2=\"C26\" />\n+ <Bond atomName1=\"C26\" atomName2=\"H6R\" />\n+ <Bond atomName1=\"C26\" atomName2=\"H6S\" />\n+ <Bond atomName1=\"C26\" atomName2=\"C27\" />\n+ <Bond atomName1=\"C27\" atomName2=\"H7R\" />\n+ <Bond atomName1=\"C27\" atomName2=\"H7S\" />\n+ <Bond atomName1=\"C27\" atomName2=\"C28\" />\n+ <Bond atomName1=\"C28\" atomName2=\"H8R\" />\n+ <Bond atomName1=\"C28\" atomName2=\"H8S\" />\n+ <Bond atomName1=\"C28\" atomName2=\"C29\" />\n+ <Bond atomName1=\"C29\" atomName2=\"H9R\" />\n+ <Bond atomName1=\"C29\" atomName2=\"H9S\" />\n+ <Bond atomName1=\"C29\" atomName2=\"C210\" />\n+ <Bond atomName1=\"C210\" atomName2=\"H10R\" />\n+ <Bond atomName1=\"C210\" atomName2=\"H10S\" />\n+ <Bond atomName1=\"C210\" atomName2=\"C211\" />\n+ <Bond atomName1=\"C211\" atomName2=\"H11R\" />\n+ <Bond atomName1=\"C211\" atomName2=\"H11S\" />\n+ <Bond atomName1=\"C211\" atomName2=\"C212\" />\n+ <Bond atomName1=\"C212\" atomName2=\"H12R\" />\n+ <Bond atomName1=\"C212\" atomName2=\"H12S\" />\n+ <Bond atomName1=\"C212\" atomName2=\"C213\" />\n+ <Bond atomName1=\"C213\" atomName2=\"H13R\" />\n+ <Bond atomName1=\"C213\" atomName2=\"H13S\" />\n+ <Bond atomName1=\"C213\" atomName2=\"C214\" />\n+ <Bond atomName1=\"C214\" atomName2=\"H14R\" />\n+ <Bond atomName1=\"C214\" atomName2=\"H14S\" />\n+ <Bond atomName1=\"C214\" atomName2=\"C215\" />\n+ <Bond atomName1=\"C215\" atomName2=\"H15R\" />\n+ <Bond atomName1=\"C215\" atomName2=\"H15S\" />\n+ <Bond atomName1=\"C215\" atomName2=\"C216\" />\n+ <Bond atomName1=\"C216\" atomName2=\"H16R\" />\n+ <Bond atomName1=\"C216\" atomName2=\"H16S\" />\n+ <Bond atomName1=\"C216\" atomName2=\"H16T\" />\n+ <Bond atomName1=\"O31\" atomName2=\"C31\" />\n+ <Bond atomName1=\"C31\" atomName2=\"C32\" />\n+ <Bond atomName1=\"C31\" atomName2=\"O32\" />\n+ <Bond atomName1=\"C32\" atomName2=\"H2X\" />\n+ <Bond atomName1=\"C32\" atomName2=\"H2Y\" />\n+ <Bond atomName1=\"C32\" atomName2=\"C33\" />\n+ <Bond atomName1=\"C33\" atomName2=\"H3X\" />\n+ <Bond atomName1=\"C33\" atomName2=\"H3Y\" />\n+ <Bond atomName1=\"C33\" atomName2=\"C34\" />\n+ <Bond atomName1=\"C34\" atomName2=\"H4X\" />\n+ <Bond atomName1=\"C34\" atomName2=\"H4Y\" />\n+ <Bond atomName1=\"C34\" atomName2=\"C35\" />\n+ <Bond atomName1=\"C35\" atomName2=\"H5X\" />\n+ <Bond atomName1=\"C35\" atomName2=\"H5Y\" />\n+ <Bond atomName1=\"C35\" atomName2=\"C36\" />\n+ <Bond atomName1=\"C36\" atomName2=\"H6X\" />\n+ <Bond atomName1=\"C36\" atomName2=\"H6Y\" />\n+ <Bond atomName1=\"C36\" atomName2=\"C37\" />\n+ <Bond atomName1=\"C37\" atomName2=\"H7X\" />\n+ <Bond atomName1=\"C37\" atomName2=\"H7Y\" />\n+ <Bond atomName1=\"C37\" atomName2=\"C38\" />\n+ <Bond atomName1=\"C38\" atomName2=\"H8X\" />\n+ <Bond atomName1=\"C38\" atomName2=\"H8Y\" />\n+ <Bond atomName1=\"C38\" atomName2=\"C39\" />\n+ <Bond atomName1=\"C39\" atomName2=\"H9X\" />\n+ <Bond atomName1=\"C39\" atomName2=\"H9Y\" />\n+ <Bond atomName1=\"C39\" atomName2=\"C310\" />\n+ <Bond atomName1=\"C310\" atomName2=\"H10X\" />\n+ <Bond atomName1=\"C310\" atomName2=\"H10Y\" />\n+ <Bond atomName1=\"C310\" atomName2=\"C311\" />\n+ <Bond atomName1=\"C311\" atomName2=\"H11X\" />\n+ <Bond atomName1=\"C311\" atomName2=\"H11Y\" />\n+ <Bond atomName1=\"C311\" atomName2=\"C312\" />\n+ <Bond atomName1=\"C312\" atomName2=\"H12X\" />\n+ <Bond atomName1=\"C312\" atomName2=\"H12Y\" />\n+ <Bond atomName1=\"C312\" atomName2=\"C313\" />\n+ <Bond atomName1=\"C313\" atomName2=\"H13X\" />\n+ <Bond atomName1=\"C313\" atomName2=\"H13Y\" />\n+ <Bond atomName1=\"C313\" atomName2=\"C314\" />\n+ <Bond atomName1=\"C314\" atomName2=\"H14X\" />\n+ <Bond atomName1=\"C314\" atomName2=\"H14Y\" />\n+ <Bond atomName1=\"C314\" atomName2=\"C315\" />\n+ <Bond atomName1=\"C315\" atomName2=\"H15X\" />\n+ <Bond atomName1=\"C315\" atomName2=\"H15Y\" />\n+ <Bond atomName1=\"C315\" atomName2=\"C316\" />\n+ <Bond atomName1=\"C316\" atomName2=\"H16X\" />\n+ <Bond atomName1=\"C316\" atomName2=\"H16Y\" />\n+ <Bond atomName1=\"C316\" atomName2=\"H16Z\" />\n+ </Residue>\n+ <Residue name=\"DPPE\">\n+ <Atom charge=\"-0.368132\" name=\"N\" type=\"nA\" />\n+ <Atom charge=\"0.348549\" name=\"HN1\" type=\"hN\" />\n+ <Atom charge=\"0.348549\" name=\"HN2\" type=\"hN\" />\n+ <Atom charge=\"0.348549\" name=\"HN3\" type=\"hN\" />\n+ <Atom charge=\"0.077319\" name=\"C12\" type=\"cA\" />\n+ <Atom charge=\"0.09163\" name=\"H12A\" type=\"hX\" />\n+ <Atom charge=\"0.09163\" name=\"H12B\" type=\"hX\" />\n+ <Atom charge=\"0.075159\" name=\"C11\" type=\"cA\" />\n+ <Atom charge=\"0.091516\" name=\"H11A\" type=\"hE\" />\n+ <Atom charge=\"0.091516\" name=\"H11B\" type=\"hE\" />\n+ <Atom charge=\"1.373656\" name=\"P\" type=\"pA\" />\n+ <Atom charge=\"-0.877447\" name=\"O13\" type=\"oP\" />\n+ <Atom charge=\"-0.877447\" name=\"O14\" type=\"oP\" />\n+ <Atom charge=\"-0.546623\" name=\"O11\" type=\"oT\" />\n+ <Atom charge=\"-0.514542\" name=\"O12\" type=\"oT\" />\n+ <Atom charge=\"0.040967\" name=\"C1\" type=\"cA\" />\n+ <Atom charge=\"0.090994\" name=\"HA\" type=\"hE\" />\n+ <Atom charge=\"0.090994\" name=\"HB\" type=\"hE\" />\n+ <Atom charge=\"0.339004\" name=\"C2\" type=\"cA\" />\n+ <Atom charge=\"0.032843\" name=\"HS\" type=\"hE\" />\n+ <Atom charge=\"-0.57548\" name=\"O21\" type=\"oS\" />\n+ <Atom charge=\"0.86934\" name=\"C21\" type=\"cC\" />\n+ <Atom charge=\"-0.649199\" name=\"O22\" type=\"oC\" />\n+ <Atom charge=\"-0.149259\" name=\"C22\" type=\"cD\" />\n+ <Atom charge=\"0.047345\" name=\"H2R\" type=\"hL\" />\n+ <Atom charge=\"0.047345\" name=\"H2S\" type=\"hL\" />\n+ <Atom charge=\"0.273776\" name=\"C3\" type=\"cA\" />\n+ <Atom charge=\"0.044574\" name=\"HX\" type=\"hE\" />\n+ <Atom charge=\"0.044574\" name=\"HY\" type=\"hE\" />\n+ <Atom charge=\"-0.593826\" name=\"O31\" type=\"oS\" />\n+ <Atom charge=\"0.888359\" name=\"C31\" type=\"cC\" />\n+ <Atom charge=\"-0.650802\" name=\"O32\" type=\"oC\" />\n+ <Atom charge=\"-0.149259\" name=\"C32\" type=\"cD\" />\n+ <Atom charge=\"0.047345\" name=\"H2X\" type=\"hL\" />\n+ <Atom charge=\"0.047345\" name=\"H2Y\" type=\"hL\" />\n+ <Atom charge=\"-0.004882\" name=\"C23\" type=\"cD\" />\n+ <Atom charge=\"0.019007\" name=\"H3R\" type=\"hL\" />\n+ <Atom charge=\"0.019007\" name=\"H3S\" type=\"hL\" />\n+ <Atom charge=\"-0.030099\" name=\"C24\" type=\"cD\" />\n+ <Atom charge=\"0.020877\" name=\"H4R\" type=\"hL\" />\n+ <Atom charge=\"0.020877\" name=\"H4S\" type=\"hL\" />\n+ <Atom charge=\"-0.029387\" name=\"C25\" type=\"cD\" />\n+ <Atom charge=\"0.016763\" name=\"H5R\" type=\"hL\" />\n+ <Atom charge=\"0.016763\" name=\"H5S\" type=\"hL\" />\n+ <Atom charge=\"-0.024427\" name=\"C26\" type=\"cD\" />\n+ <Atom charge=\"0.013334\" name=\"H6R\" type=\"hL\" />\n+ <Atom charge=\"0.013334\" name=\"H6S\" type=\"hL\" />\n+ <Atom charge=\"-0.01963\" name=\"C27\" type=\"cD\" />\n+ <Atom charge=\"0.011041\" name=\"H7R\" type=\"hL\" />\n+ <Atom charge=\"0.011041\" name=\"H7S\" type=\"hL\" />\n+ <Atom charge=\"-0.015793\" name=\"C28\" type=\"cD\" />\n+ <Atom charge=\"0.009067\" name=\"H8R\" type=\"hL\" />\n+ <Atom charge=\"0.009067\" name=\"H8S\" type=\"hL\" />\n+ <Atom charge=\"-0.030472\" name=\"C29\" type=\"cD\" />\n+ <Atom charge=\"0.013897\" name=\"H9R\" type=\"hL\" />\n+ <Atom charge=\"0.013897\" name=\"H9S\" type=\"hL\" />\n+ <Atom charge=\"-0.028831\" name=\"C210\" type=\"cD\" />\n+ <Atom charge=\"0.014691\" name=\"H10R\" type=\"hL\" />\n+ <Atom charge=\"0.014691\" name=\"H10S\" type=\"hL\" />\n+ <Atom charge=\"-0.025206\" name=\"C211\" type=\"cD\" />\n+ <Atom charge=\"0.014334\" name=\"H11R\" type=\"hL\" />\n+ <Atom charge=\"0.014334\" name=\"H11S\" type=\"hL\" />\n+ <Atom charge=\"-0.027633\" name=\"C212\" type=\"cD\" />\n+ <Atom charge=\"0.011368\" name=\"H12R\" type=\"hL\" />\n+ <Atom charge=\"0.011368\" name=\"H12S\" type=\"hL\" />\n+ <Atom charge=\"-0.033096\" name=\"C213\" type=\"cD\" />\n+ <Atom charge=\"0.014621\" name=\"H13R\" type=\"hL\" />\n+ <Atom charge=\"0.014621\" name=\"H13S\" type=\"hL\" />\n+ <Atom charge=\"-0.020086\" name=\"C214\" type=\"cD\" />\n+ <Atom charge=\"0.015929\" name=\"H14R\" type=\"hL\" />\n+ <Atom charge=\"0.015929\" name=\"H14S\" type=\"hL\" />\n+ <Atom charge=\"0.013975\" name=\"C215\" type=\"cD\" />\n+ <Atom charge=\"0.009292\" name=\"H15R\" type=\"hL\" />\n+ <Atom charge=\"0.009292\" name=\"H15S\" type=\"hL\" />\n+ <Atom charge=\"-0.125447\" name=\"C216\" type=\"cD\" />\n+ <Atom charge=\"0.029047\" name=\"H16R\" type=\"hL\" />\n+ <Atom charge=\"0.029047\" name=\"H16S\" type=\"hL\" />\n+ <Atom charge=\"0.029047\" name=\"H16T\" type=\"hL\" />\n+ <Atom charge=\"-0.004882\" name=\"C33\" type=\"cD\" />\n+ <Atom charge=\"0.019007\" name=\"H3X\" type=\"hL\" />\n+ <Atom charge=\"0.019007\" name=\"H3Y\" type=\"hL\" />\n+ <Atom charge=\"-0.030099\" name=\"C34\" type=\"cD\" />\n+ <Atom charge=\"0.020877\" name=\"H4X\" type=\"hL\" />\n+ <Atom charge=\"0.020877\" name=\"H4Y\" type=\"hL\" />\n+ <Atom charge=\"-0.029387\" name=\"C35\" type=\"cD\" />\n+ <Atom charge=\"0.016763\" name=\"H5X\" type=\"hL\" />\n+ <Atom charge=\"0.016763\" name=\"H5Y\" type=\"hL\" />\n+ <Atom charge=\"-0.024427\" name=\"C36\" type=\"cD\" />\n+ <Atom charge=\"0.013334\" name=\"H6X\" type=\"hL\" />\n+ <Atom charge=\"0.013334\" name=\"H6Y\" type=\"hL\" />\n+ <Atom charge=\"-0.01963\" name=\"C37\" type=\"cD\" />\n+ <Atom charge=\"0.011041\" name=\"H7X\" type=\"hL\" />\n+ <Atom charge=\"0.011041\" name=\"H7Y\" type=\"hL\" />\n+ <Atom charge=\"-0.015793\" name=\"C38\" type=\"cD\" />\n+ <Atom charge=\"0.009067\" name=\"H8X\" type=\"hL\" />\n+ <Atom charge=\"0.009067\" name=\"H8Y\" type=\"hL\" />\n+ <Atom charge=\"-0.030472\" name=\"C39\" type=\"cD\" />\n+ <Atom charge=\"0.013897\" name=\"H9X\" type=\"hL\" />\n+ <Atom charge=\"0.013897\" name=\"H9Y\" type=\"hL\" />\n+ <Atom charge=\"-0.028831\" name=\"C310\" type=\"cD\" />\n+ <Atom charge=\"0.014691\" name=\"H10X\" type=\"hL\" />\n+ <Atom charge=\"0.014691\" name=\"H10Y\" type=\"hL\" />\n+ <Atom charge=\"-0.025206\" name=\"C311\" type=\"cD\" />\n+ <Atom charge=\"0.014334\" name=\"H11X\" type=\"hL\" />\n+ <Atom charge=\"0.014334\" name=\"H11Y\" type=\"hL\" />\n+ <Atom charge=\"-0.027633\" name=\"C312\" type=\"cD\" />\n+ <Atom charge=\"0.011368\" name=\"H12X\" type=\"hL\" />\n+ <Atom charge=\"0.011368\" name=\"H12Y\" type=\"hL\" />\n+ <Atom charge=\"-0.033096\" name=\"C313\" type=\"cD\" />\n+ <Atom charge=\"0.014621\" name=\"H13X\" type=\"hL\" />\n+ <Atom charge=\"0.014621\" name=\"H13Y\" type=\"hL\" />\n+ <Atom charge=\"-0.020086\" name=\"C314\" type=\"cD\" />\n+ <Atom charge=\"0.015929\" name=\"H14X\" type=\"hL\" />\n+ <Atom charge=\"0.015929\" name=\"H14Y\" type=\"hL\" />\n+ <Atom charge=\"0.013975\" name=\"C315\" type=\"cD\" />\n+ <Atom charge=\"0.009292\" name=\"H15X\" type=\"hL\" />\n+ <Atom charge=\"0.009292\" name=\"H15Y\" type=\"hL\" />\n+ <Atom charge=\"-0.125447\" name=\"C316\" type=\"cD\" />\n+ <Atom charge=\"0.029047\" name=\"H16X\" type=\"hL\" />\n+ <Atom charge=\"0.029047\" name=\"H16Y\" type=\"hL\" />\n+ <Atom charge=\"0.029047\" name=\"H16Z\" type=\"hL\" />\n+ <Bond atomName1=\"N\" atomName2=\"HN1\" />\n+ <Bond atomName1=\"N\" atomName2=\"HN2\" />\n+ <Bond atomName1=\"N\" atomName2=\"HN3\" />\n+ <Bond atomName1=\"N\" atomName2=\"C12\" />\n+ <Bond atomName1=\"C12\" atomName2=\"H12A\" />\n+ <Bond atomName1=\"C12\" atomName2=\"H12B\" />\n+ <Bond atomName1=\"C12\" atomName2=\"C11\" />\n+ <Bond atomName1=\"C11\" atomName2=\"H11A\" />\n+ <Bond atomName1=\"C11\" atomName2=\"H11B\" />\n+ <Bond atomName1=\"C11\" atomName2=\"O12\" />\n+ <Bond atomName1=\"O12\" atomName2=\"P\" />\n+ <Bond atomName1=\"P\" atomName2=\"O11\" />\n+ <Bond atomName1=\"P\" atomName2=\"O13\" />\n+ <Bond atomName1=\"P\" atomName2=\"O14\" />\n+ <Bond atomName1=\"C1\" atomName2=\"HA\" />\n+ <Bond atomName1=\"C1\" atomName2=\"HB\" />\n+ <Bond atomName1=\"C1\" atomName2=\"C2\" />\n+ <Bond atomName1=\"C1\" atomName2=\"O11\" />\n+ <Bond atomName1=\"C2\" atomName2=\"HS\" />\n+ <Bond atomName1=\"C2\" atomName2=\"C3\" />\n+ <Bond atomName1=\"C2\" atomName2=\"O21\" />\n+ <Bond atomName1=\"C3\" atomName2=\"HX\" />\n+ <Bond atomName1=\"C3\" atomName2=\"HY\" />\n+ <Bond atomName1=\"C3\" atomName2=\"O31\" />\n+ <Bond atomName1=\"O21\" atomName2=\"C21\" />\n+ <Bond atomName1=\"C21\" atomName2=\"C22\" />\n+ <Bond atomName1=\"C21\" atomName2=\"O22\" />\n+ <Bond atomName1=\"C22\" atomName2=\"H2R\" />\n+ <Bond atomName1=\"C22\" atomName2=\"H2S\" />\n+ <Bond atomName1=\"C22\" atomName2=\"C23\" />\n+ <Bond atomName1=\"C23\" atomName2=\"H3R\" />\n+ <Bond atomName1=\"C23\" atomName2=\"H3S\" />\n+ <Bond atomName1=\"C23\" atomName2=\"C24\" />\n+ <Bond atomName1=\"C24\" atomName2=\"H4R\" />\n+ <Bond atomName1=\"C24\" atomName2=\"H4S\" />\n+ <Bond atomName1=\"C24\" atomName2=\"C25\" />\n+ <Bond atomName1=\"C25\" atomName2=\"H5R\" />\n+ <Bond atomName1=\"C25\" atomName2=\"H5S\" />\n+ <Bond atomName1=\"C25\" atomName2=\"C26\" />\n+ <Bond atomName1=\"C26\" atomName2=\"H6R\" />\n+ <Bond atomName1=\"C26\" atomName2=\"H6S\" />\n+ <Bond atomName1=\"C26\" atomName2=\"C27\" />\n+ <Bond atomName1=\"C27\" atomName2=\"H7R\" />\n+ <Bond atomName1=\"C27\" atomName2=\"H7S\" />\n+ <Bond atomName1=\"C27\" atomName2=\"C28\" />\n+ <Bond atomName1=\"C28\" atomName2=\"H8R\" />\n+ <Bond atomName1=\"C28\" atomName2=\"H8S\" />\n+ <Bond atomName1=\"C28\" atomName2=\"C29\" />\n+ <Bond atomName1=\"C29\" atomName2=\"H9R\" />\n+ <Bond atomName1=\"C29\" atomName2=\"H9S\" />\n+ <Bond atomName1=\"C29\" atomName2=\"C210\" />\n+ <Bond atomName1=\"C210\" atomName2=\"H10R\" />\n+ <Bond atomName1=\"C210\" atomName2=\"H10S\" />\n+ <Bond atomName1=\"C210\" atomName2=\"C211\" />\n+ <Bond atomName1=\"C211\" atomName2=\"H11R\" />\n+ <Bond atomName1=\"C211\" atomName2=\"H11S\" />\n+ <Bond atomName1=\"C211\" atomName2=\"C212\" />\n+ <Bond atomName1=\"C212\" atomName2=\"H12R\" />\n+ <Bond atomName1=\"C212\" atomName2=\"H12S\" />\n+ <Bond atomName1=\"C212\" atomName2=\"C213\" />\n+ <Bond atomName1=\"C213\" atomName2=\"H13R\" />\n+ <Bond atomName1=\"C213\" atomName2=\"H13S\" />\n+ <Bond atomName1=\"C213\" atomName2=\"C214\" />\n+ <Bond atomName1=\"C214\" atomName2=\"H14R\" />\n+ <Bond atomName1=\"C214\" atomName2=\"H14S\" />\n+ <Bond atomName1=\"C214\" atomName2=\"C215\" />\n+ <Bond atomName1=\"C215\" atomName2=\"H15R\" />\n+ <Bond atomName1=\"C215\" atomName2=\"H15S\" />\n+ <Bond atomName1=\"C215\" atomName2=\"C216\" />\n+ <Bond atomName1=\"C216\" atomName2=\"H16R\" />\n+ <Bond atomName1=\"C216\" atomName2=\"H16S\" />\n+ <Bond atomName1=\"C216\" atomName2=\"H16T\" />\n+ <Bond atomName1=\"O31\" atomName2=\"C31\" />\n+ <Bond atomName1=\"C31\" atomName2=\"C32\" />\n+ <Bond atomName1=\"C31\" atomName2=\"O32\" />\n+ <Bond atomName1=\"C32\" atomName2=\"H2X\" />\n+ <Bond atomName1=\"C32\" atomName2=\"H2Y\" />\n+ <Bond atomName1=\"C32\" atomName2=\"C33\" />\n+ <Bond atomName1=\"C33\" atomName2=\"H3X\" />\n+ <Bond atomName1=\"C33\" atomName2=\"H3Y\" />\n+ <Bond atomName1=\"C33\" atomName2=\"C34\" />\n+ <Bond atomName1=\"C34\" atomName2=\"H4X\" />\n+ <Bond atomName1=\"C34\" atomName2=\"H4Y\" />\n+ <Bond atomName1=\"C34\" atomName2=\"C35\" />\n+ <Bond atomName1=\"C35\" atomName2=\"H5X\" />\n+ <Bond atomName1=\"C35\" atomName2=\"H5Y\" />\n+ <Bond atomName1=\"C35\" atomName2=\"C36\" />\n+ <Bond atomName1=\"C36\" atomName2=\"H6X\" />\n+ <Bond atomName1=\"C36\" atomName2=\"H6Y\" />\n+ <Bond atomName1=\"C36\" atomName2=\"C37\" />\n+ <Bond atomName1=\"C37\" atomName2=\"H7X\" />\n+ <Bond atomName1=\"C37\" atomName2=\"H7Y\" />\n+ <Bond atomName1=\"C37\" atomName2=\"C38\" />\n+ <Bond atomName1=\"C38\" atomName2=\"H8X\" />\n+ <Bond atomName1=\"C38\" atomName2=\"H8Y\" />\n+ <Bond atomName1=\"C38\" atomName2=\"C39\" />\n+ <Bond atomName1=\"C39\" atomName2=\"H9X\" />\n+ <Bond atomName1=\"C39\" atomName2=\"H9Y\" />\n+ <Bond atomName1=\"C39\" atomName2=\"C310\" />\n+ <Bond atomName1=\"C310\" atomName2=\"H10X\" />\n+ <Bond atomName1=\"C310\" atomName2=\"H10Y\" />\n+ <Bond atomName1=\"C310\" atomName2=\"C311\" />\n+ <Bond atomName1=\"C311\" atomName2=\"H11X\" />\n+ <Bond atomName1=\"C311\" atomName2=\"H11Y\" />\n+ <Bond atomName1=\"C311\" atomName2=\"C312\" />\n+ <Bond atomName1=\"C312\" atomName2=\"H12X\" />\n+ <Bond atomName1=\"C312\" atomName2=\"H12Y\" />\n+ <Bond atomName1=\"C312\" atomName2=\"C313\" />\n+ <Bond atomName1=\"C313\" atomName2=\"H13X\" />\n+ <Bond atomName1=\"C313\" atomName2=\"H13Y\" />\n+ <Bond atomName1=\"C313\" atomName2=\"C314\" />\n+ <Bond atomName1=\"C314\" atomName2=\"H14X\" />\n+ <Bond atomName1=\"C314\" atomName2=\"H14Y\" />\n+ <Bond atomName1=\"C314\" atomName2=\"C315\" />\n+ <Bond atomName1=\"C315\" atomName2=\"H15X\" />\n+ <Bond atomName1=\"C315\" atomName2=\"H15Y\" />\n+ <Bond atomName1=\"C315\" atomName2=\"C316\" />\n+ <Bond atomName1=\"C316\" atomName2=\"H16X\" />\n+ <Bond atomName1=\"C316\" atomName2=\"H16Y\" />\n+ <Bond atomName1=\"C316\" atomName2=\"H16Z\" />\n+ </Residue>\n+ <Residue name=\"DPPS\">\n+ <Atom charge=\"-0.414327\" name=\"N\" type=\"nA\" />\n+ <Atom charge=\"0.353866\" name=\"HN1\" type=\"hN\" />\n+ <Atom charge=\"0.353866\" name=\"HN2\" type=\"hN\" />\n+ <Atom charge=\"0.353866\" name=\"HN3\" type=\"hN\" />\n+ <Atom charge=\"0.039448\" name=\"C12\" type=\"cA\" />\n+ <Atom charge=\"0.090549\" name=\"H12A\" type=\"hX\" />\n+ <Atom charge=\"0.809867\" name=\"C13\" type=\"cC\" />\n+ <Atom charge=\"-0.815178\" name=\"O13A\" type=\"oO\" />\n+ <Atom charge=\"-0.815178\" name=\"O13B\" type=\"oO\" />\n+ <Atom charge=\"0.060375\" name=\"C11\" type=\"cA\" />\n+ <Atom charge=\"0.093484\" name=\"H11A\" type=\"hE\" />\n+ <Atom charge=\"0.093484\" name=\"H11B\" type=\"hE\" />\n+ <Atom charge=\"1.380208\" name=\"P\" type=\"pA\" />\n+ <Atom charge=\"-0.877922\" name=\"O13\" type=\"oP\" />\n+ <Atom charge=\"-0.877922\" name=\"O14\" type=\"oP\" />\n+ <Atom charge=\"-0.520128\" name=\"O12\" type=\"oT\" />\n+ <Atom charge=\"-0.556992\" name=\"O11\" type=\"oT\" />\n+ <Atom charge=\"0.012366\" name=\"C1\" type=\"cA\" />\n+ <Atom charge=\"0.097347\" name=\"HA\" type=\"hE\" />\n+ <Atom charge=\"0.097347\" name=\"HB\" type=\"hE\" />\n+ <Atom charge=\"0.44065\" name=\"C2\" type=\"cA\" />\n+ <Atom charge=\"0.002473\" name=\"HS\" type=\"hE\" />\n+ <Atom charge=\"-0.634381\" name=\"O21\" type=\"oS\" />\n+ <Atom charge=\"0.891897\" name=\"C21\" type=\"cC\" />\n+ <Atom charge=\"-0.650291\" name=\"O22\" type=\"oC\" />\n+ <Atom charge=\"-0.149259\" name=\"C22\" type=\"cD\" />\n+ <Atom charge=\"0.047345\" name=\"H2R\" type=\"hL\" />\n+ <Atom charge=\"0.047345\" name=\"H2S\" type=\"hL\" />\n+ <Atom charge=\"0.271173\" name=\"C3\" type=\"cA\" />\n+ <Atom charge=\"0.037454\" name=\"HX\" type=\"hE\" />\n+ <Atom charge=\"0.037454\" name=\"HY\" type=\"hE\" />\n+ <Atom charge=\"-0.579073\" name=\"O31\" type=\"oS\" />\n+ <Atom charge=\"0.887549\" name=\"C31\" type=\"cC\" />\n+ <Atom charge=\"-0.663331\" name=\"O32\" type=\"oC\" />\n+ <Atom charge=\"-0.149259\" name=\"C32\" type=\"cD\" />\n+ <Atom charge=\"0.047345\" name=\"H2X\" type=\"hL\" />\n+ <Atom charge=\"0.047345\" name=\"H2Y\" type=\"hL\" />\n+ <Atom charge=\"-0.004882\" name=\"C23\" type=\"cD\" />\n+ <Atom charge=\"0.019007\" name=\"H3R\" type=\"hL\" />\n+ <Atom charge=\"0.019007\" name=\"H3S\" type=\"hL\" />\n+ <Atom charge=\"-0.030099\" name=\"C24\" type=\"cD\" />\n+ <Atom charge=\"0.020877\" name=\"H4R\" type=\"hL\" />\n+ <Atom charge=\"0.020877\" name=\"H4S\" type=\"hL\" />\n+ <Atom charge=\"-0.029387\" name=\"C25\" type=\"cD\" />\n+ <Atom charge=\"0.016763\" name=\"H5R\" type=\"hL\" />\n+ <Atom charge=\"0.016763\" name=\"H5S\" type=\"hL\" />\n+ <Atom charge=\"-0.024427\" name=\"C26\" type=\"cD\" />\n+ <Atom charge=\"0.013334\" name=\"H6R\" type=\"hL\" />\n+ <Atom charge=\"0.013334\" name=\"H6S\" type=\"hL\" />\n+ <Atom charge=\"-0.01963\" name=\"C27\" type=\"cD\" />\n+ <Atom charge=\"0.011041\" name=\"H7R\" type=\"hL\" />\n+ <Atom charge=\"0.011041\" name=\"H7S\" type=\"hL\" />\n+ <Atom charge=\"-0.015793\" name=\"C28\" type=\"cD\" />\n+ <Atom charge=\"0.009067\" name=\"H8R\" type=\"hL\" />\n+ <Atom charge=\"0.009067\" name=\"H8S\" type=\"hL\" />\n+ <Atom charge=\"-0.030472\" name=\"C29\" type=\"cD\" />\n+ <Atom charge=\"0.013897\" name=\"H9R\" type=\"hL\" />\n+ <Atom charge=\"0.013897\" name=\"H9S\" type=\"hL\" />\n+ <Atom charge=\"-0.028831\" name=\"C210\" type=\"cD\" />\n+ <Atom charge=\"0.014691\" name=\"H10R\" type=\"hL\" />\n+ <Atom charge=\"0.014691\" name=\"H10S\" type=\"hL\" />\n+ <Atom charge=\"-0.025206\" name=\"C211\" type=\"cD\" />\n+ <Atom charge=\"0.014334\" name=\"H11R\" type=\"hL\" />\n+ <Atom charge=\"0.014334\" name=\"H11S\" type=\"hL\" />\n+ <Atom charge=\"-0.027633\" name=\"C212\" type=\"cD\" />\n+ <Atom charge=\"0.011368\" name=\"H12R\" type=\"hL\" />\n+ <Atom charge=\"0.011368\" name=\"H12S\" type=\"hL\" />\n+ <Atom charge=\"-0.033096\" name=\"C213\" type=\"cD\" />\n+ <Atom charge=\"0.014621\" name=\"H13R\" type=\"hL\" />\n+ <Atom charge=\"0.014621\" name=\"H13S\" type=\"hL\" />\n+ <Atom charge=\"-0.020086\" name=\"C214\" type=\"cD\" />\n+ <Atom charge=\"0.015929\" name=\"H14R\" type=\"hL\" />\n+ <Atom charge=\"0.015929\" name=\"H14S\" type=\"hL\" />\n+ <Atom charge=\"0.013975\" name=\"C215\" type=\"cD\" />\n+ <Atom charge=\"0.009292\" name=\"H15R\" type=\"hL\" />\n+ <Atom charge=\"0.009292\" name=\"H15S\" type=\"hL\" />\n+ <Atom charge=\"-0.125447\" name=\"C216\" type=\"cD\" />\n+ <Atom charge=\"0.029047\" name=\"H16R\" type=\"hL\" />\n+ <Atom charge=\"0.029047\" name=\"H16S\" type=\"hL\" />\n+ <Atom charge=\"0.029047\" name=\"H16T\" type=\"hL\" />\n+ <Atom charge=\"-0.004882\" name=\"C33\" type=\"cD\" />\n+ <Atom charge=\"0.019007\" name=\"H3X\" type=\"hL\" />\n+ <Atom charge=\"0.019007\" name=\"H3Y\" type=\"hL\" />\n+ <Atom charge=\"-0.030099\" name=\"C34\" type=\"cD\" />\n+ <Atom charge=\"0.020877\" name=\"H4X\" type=\"hL\" />\n+ <Atom charge=\"0.020877\" name=\"H4Y\" type=\"hL\" />\n+ <Atom charge=\"-0.029387\" name=\"C35\" type=\"cD\" />\n+ <Atom charge=\"0.016763\" name=\"H5X\" type=\"hL\" />\n+ <Atom charge=\"0.016763\" name=\"H5Y\" type=\"hL\" />\n+ <Atom charge=\"-0.024427\" name=\"C36\" type=\"cD\" />\n+ <Atom charge=\"0.013334\" name=\"H6X\" type=\"hL\" />\n+ <Atom charge=\"0.013334\" name=\"H6Y\" type=\"hL\" />\n+ <Atom charge=\"-0.01963\" name=\"C37\" type=\"cD\" />\n+ <Atom charge=\"0.011041\" name=\"H7X\" type=\"hL\" />\n+ <Atom charge=\"0.011041\" name=\"H7Y\" type=\"hL\" />\n+ <Atom charge=\"-0.015793\" name=\"C38\" type=\"cD\" />\n+ <Atom charge=\"0.009067\" name=\"H8X\" type=\"hL\" />\n+ <Atom charge=\"0.009067\" name=\"H8Y\" type=\"hL\" />\n+ <Atom charge=\"-0.030472\" name=\"C39\" type=\"cD\" />\n+ <Atom charge=\"0.013897\" name=\"H9X\" type=\"hL\" />\n+ <Atom charge=\"0.013897\" name=\"H9Y\" type=\"hL\" />\n+ <Atom charge=\"-0.028831\" name=\"C310\" type=\"cD\" />\n+ <Atom charge=\"0.014691\" name=\"H10X\" type=\"hL\" />\n+ <Atom charge=\"0.014691\" name=\"H10Y\" type=\"hL\" />\n+ <Atom charge=\"-0.025206\" name=\"C311\" type=\"cD\" />\n+ <Atom charge=\"0.014334\" name=\"H11X\" type=\"hL\" />\n+ <Atom charge=\"0.014334\" name=\"H11Y\" type=\"hL\" />\n+ <Atom charge=\"-0.027633\" name=\"C312\" type=\"cD\" />\n+ <Atom charge=\"0.011368\" name=\"H12X\" type=\"hL\" />\n+ <Atom charge=\"0.011368\" name=\"H12Y\" type=\"hL\" />\n+ <Atom charge=\"-0.033096\" name=\"C313\" type=\"cD\" />\n+ <Atom charge=\"0.014621\" name=\"H13X\" type=\"hL\" />\n+ <Atom charge=\"0.014621\" name=\"H13Y\" type=\"hL\" />\n+ <Atom charge=\"-0.020086\" name=\"C314\" type=\"cD\" />\n+ <Atom charge=\"0.015929\" name=\"H14X\" type=\"hL\" />\n+ <Atom charge=\"0.015929\" name=\"H14Y\" type=\"hL\" />\n+ <Atom charge=\"0.013975\" name=\"C315\" type=\"cD\" />\n+ <Atom charge=\"0.009292\" name=\"H15X\" type=\"hL\" />\n+ <Atom charge=\"0.009292\" name=\"H15Y\" type=\"hL\" />\n+ <Atom charge=\"-0.125447\" name=\"C316\" type=\"cD\" />\n+ <Atom charge=\"0.029047\" name=\"H16X\" type=\"hL\" />\n+ <Atom charge=\"0.029047\" name=\"H16Y\" type=\"hL\" />\n+ <Atom charge=\"0.029047\" name=\"H16Z\" type=\"hL\" />\n+ <Bond atomName1=\"N\" atomName2=\"HN1\" />\n+ <Bond atomName1=\"N\" atomName2=\"HN2\" />\n+ <Bond atomName1=\"N\" atomName2=\"HN3\" />\n+ <Bond atomName1=\"N\" atomName2=\"C12\" />\n+ <Bond atomName1=\"O13B\" atomName2=\"C13\" />\n+ <Bond atomName1=\"C13\" atomName2=\"C12\" />\n+ <Bond atomName1=\"C13\" atomName2=\"O13A\" />\n+ <Bond atomName1=\"C12\" atomName2=\"H12A\" />\n+ <Bond atomName1=\"C12\" atomName2=\"C11\" />\n+ <Bond atomName1=\"C1\" atomName2=\"O11\" />\n+ <Bond atomName1=\"C11\" atomName2=\"H11A\" />\n+ <Bond atomName1=\"C11\" atomName2=\"H11B\" />\n+ <Bond atomName1=\"C11\" atomName2=\"O12\" />\n+ <Bond atomName1=\"O12\" atomName2=\"P\" />\n+ <Bond atomName1=\"P\" atomName2=\"O11\" />\n+ <Bond atomName1=\"P\" atomName2=\"O13\" />\n+ <Bond atomName1=\"P\" atomName2=\"O14\" />\n+ <Bond atomName1=\"C1\" atomName2=\"HA\" />\n+ <Bond atomName1=\"C1\" atomName2=\"HB\" />\n+ <Bond atomName1=\"C1\" atomName2=\"C2\" />\n+ <Bond atomName1=\"C2\" atomName2=\"HS\" />\n+ <Bond atomName1=\"C2\" atomName2=\"C3\" />\n+ <Bond atomName1=\"C2\" atomName2=\"O21\" />\n+ <Bond atomName1=\"C3\" atomName2=\"HX\" />\n+ <Bond atomName1=\"C3\" atomName2=\"HY\" />\n+ <Bond atomName1=\"C3\" atomName2=\"O31\" />\n+ <Bond atomName1=\"O21\" atomName2=\"C21\" />\n+ <Bond atomName1=\"C21\" atomName2=\"C22\" />\n+ <Bond atomName1=\"C21\" atomName2=\"O22\" />\n+ <Bond atomName1=\"C22\" atomName2=\"H2R\" />\n+ <Bond atomName1=\"C22\" atomName2=\"H2S\" />\n+ <Bond atomName1=\"C22\" atomName2=\"C23\" />\n+ <Bond atomName1=\"C23\" atomName2=\"H3R\" />\n+ <Bond atomName1=\"C23\" atomName2=\"H3S\" />\n+ <Bond atomName1=\"C23\" atomName2=\"C24\" />\n+ <Bond atomName1=\"C24\" atomName2=\"H4R\" />\n+ <Bond atomName1=\"C24\" atomName2=\"H4S\" />\n+ <Bond atomName1=\"C24\" atomName2=\"C25\" />\n+ <Bond atomName1=\"C25\" atomName2=\"H5R\" />\n+ <Bond atomName1=\"C25\" atomName2=\"H5S\" />\n+ <Bond atomName1=\"C25\" atomName2=\"C26\" />\n+ <Bond atomName1=\"C26\" atomName2=\"H6R\" />\n+ <Bond atomName1=\"C26\" atomName2=\"H6S\" />\n+ <Bond atomName1=\"C26\" atomName2=\"C27\" />\n+ <Bond atomName1=\"C27\" atomName2=\"H7R\" />\n+ <Bond atomName1=\"C27\" atomName2=\"H7S\" />\n+ <Bond atomName1=\"C27\" atomName2=\"C28\" />\n+ <Bond atomName1=\"C28\" atomName2=\"H8R\" />\n+ <Bond atomName1=\"C28\" atomName2=\"H8S\" />\n+ <Bond atomName1=\"C28\" atomName2=\"C29\" />\n+ <Bond atomName1=\"C29\" atomName2=\"H9R\" />\n+ <Bond atomName1=\"C29\" atomName2=\"H9S\" />\n+ <Bond atomName1=\"C29\" atomName2=\"C210\" />\n+ <Bond atomName1=\"C210\" atomName2=\"H10R\" />\n+ <Bond atomName1=\"C210\" atomName2=\"H10S\" />\n+ <Bond atomName1=\"C210\" atomName2=\"C211\" />\n+ <Bond atomName1=\"C211\" atomName2=\"H11R\" />\n+ <Bond atomName1=\"C211\" atomName2=\"H11S\" />\n+ <Bond atomName1=\"C211\" atomName2=\"C212\" />\n+ <Bond atomName1=\"C212\" atomName2=\"H12R\" />\n+ <Bond atomName1=\"C212\" atomName2=\"H12S\" />\n+ <Bond atomName1=\"C212\" atomName2=\"C213\" />\n+ <Bond atomName1=\"C213\" atomName2=\"H13R\" />\n+ <Bond atomName1=\"C213\" atomName2=\"H13S\" />\n+ <Bond atomName1=\"C213\" atomName2=\"C214\" />\n+ <Bond atomName1=\"C214\" atomName2=\"H14R\" />\n+ <Bond atomName1=\"C214\" atomName2=\"H14S\" />\n+ <Bond atomName1=\"C214\" atomName2=\"C215\" />\n+ <Bond atomName1=\"C215\" atomName2=\"H15R\" />\n+ <Bond atomName1=\"C215\" atomName2=\"H15S\" />\n+ <Bond atomName1=\"C215\" atomName2=\"C216\" />\n+ <Bond atomName1=\"C216\" atomName2=\"H16R\" />\n+ <Bond atomName1=\"C216\" atomName2=\"H16S\" />\n+ <Bond atomName1=\"C216\" atomName2=\"H16T\" />\n+ <Bond atomName1=\"O31\" atomName2=\"C31\" />\n+ <Bond atomName1=\"C31\" atomName2=\"C32\" />\n+ <Bond atomName1=\"C31\" atomName2=\"O32\" />\n+ <Bond atomName1=\"C32\" atomName2=\"H2X\" />\n+ <Bond atomName1=\"C32\" atomName2=\"H2Y\" />\n+ <Bond atomName1=\"C32\" atomName2=\"C33\" />\n+ <Bond atomName1=\"C33\" atomName2=\"H3X\" />\n+ <Bond atomName1=\"C33\" atomName2=\"H3Y\" />\n+ <Bond atomName1=\"C33\" atomName2=\"C34\" />\n+ <Bond atomName1=\"C34\" atomName2=\"H4X\" />\n+ <Bond atomName1=\"C34\" atomName2=\"H4Y\" />\n+ <Bond atomName1=\"C34\" atomName2=\"C35\" />\n+ <Bond atomName1=\"C35\" atomName2=\"H5X\" />\n+ <Bond atomName1=\"C35\" atomName2=\"H5Y\" />\n+ <Bond atomName1=\"C35\" atomName2=\"C36\" />\n+ <Bond atomName1=\"C36\" atomName2=\"H6X\" />\n+ <Bond atomName1=\"C36\" atomName2=\"H6Y\" />\n+ <Bond atomName1=\"C36\" atomName2=\"C37\" />\n+ <Bond atomName1=\"C37\" atomName2=\"H7X\" />\n+ <Bond atomName1=\"C37\" atomName2=\"H7Y\" />\n+ <Bond atomName1=\"C37\" atomName2=\"C38\" />\n+ <Bond atomName1=\"C38\" atomName2=\"H8X\" />\n+ <Bond atomName1=\"C38\" atomName2=\"H8Y\" />\n+ <Bond atomName1=\"C38\" atomName2=\"C39\" />\n+ <Bond atomName1=\"C39\" atomName2=\"H9X\" />\n+ <Bond atomName1=\"C39\" atomName2=\"H9Y\" />\n+ <Bond atomName1=\"C39\" atomName2=\"C310\" />\n+ <Bond atomName1=\"C310\" atomName2=\"H10X\" />\n+ <Bond atomName1=\"C310\" atomName2=\"H10Y\" />\n+ <Bond atomName1=\"C310\" atomName2=\"C311\" />\n+ <Bond atomName1=\"C311\" atomName2=\"H11X\" />\n+ <Bond atomName1=\"C311\" atomName2=\"H11Y\" />\n+ <Bond atomName1=\"C311\" atomName2=\"C312\" />\n+ <Bond atomName1=\"C312\" atomName2=\"H12X\" />\n+ <Bond atomName1=\"C312\" atomName2=\"H12Y\" />\n+ <Bond atomName1=\"C312\" atomName2=\"C313\" />\n+ <Bond atomName1=\"C313\" atomName2=\"H13X\" />\n+ <Bond atomName1=\"C313\" atomName2=\"H13Y\" />\n+ <Bond atomName1=\"C313\" atomName2=\"C314\" />\n+ <Bond atomName1=\"C314\" atomName2=\"H14X\" />\n+ <Bond atomName1=\"C314\" atomName2=\"H14Y\" />\n+ <Bond atomName1=\"C314\" atomName2=\"C315\" />\n+ <Bond atomName1=\"C315\" atomName2=\"H15X\" />\n+ <Bond atomName1=\"C315\" atomName2=\"H15Y\" />\n+ <Bond atomName1=\"C315\" atomName2=\"C316\" />\n+ <Bond atomName1=\"C316\" atomName2=\"H16X\" />\n+ <Bond atomName1=\"C316\" atomName2=\"H16Y\" />\n+ <Bond atomName1=\"C316\" atomName2=\"H16Z\" />\n+ </Residue>\n+ <Residue name=\"DPPA\">\n+ <Atom charge=\"1.456663\" name=\"P\" type=\"pA\" />\n+ <Atom charge=\"-0.914158\" name=\"O13\" type=\"oP\" />\n+ <Atom charge=\"-0.914158\" name=\"O14\" type=\"oP\" />\n+ <Atom charge=\"-0.706197\" name=\"O12\" type=\"oH\" />\n+ <Atom charge=\"0.415628\" name=\"H12\" type=\"hO\" />\n+ <Atom charge=\"-0.594197\" name=\"O11\" type=\"oT\" />\n+ <Atom charge=\"0.081528\" name=\"C1\" type=\"cA\" />\n+ <Atom charge=\"0.083099\" name=\"HA\" type=\"hE\" />\n+ <Atom charge=\"0.083099\" name=\"HB\" type=\"hE\" />\n+ <Atom charge=\"0.283546\" name=\"C2\" type=\"cA\" />\n+ <Atom charge=\"0.063862\" name=\"HS\" type=\"hE\" />\n+ <Atom charge=\"-0.554487\" name=\"O21\" type=\"oS\" />\n+ <Atom charge=\"0.897502\" name=\"C21\" type=\"cC\" />\n+ <Atom charge=\"-0.671622\" name=\"O22\" type=\"oC\" />\n+ <Atom charge=\"-0.149259\" name=\"C22\" type=\"cD\" />\n+ <Atom charge=\"0.047345\" name=\"H2R\" type=\"hL\" />\n+ <Atom charge=\"0.047345\" name=\"H2S\" type=\"hL\" />\n+ <Atom charge=\"0.185299\" name=\"C3\" type=\"cA\" />\n+ <Atom charge=\"0.067676\" name=\"HX\" type=\"hE\" />\n+ <Atom charge=\"0.067676\" name=\"HY\" type=\"hE\" />\n+ <Atom charge=\"-0.547824\" name=\"O31\" type=\"oS\" />\n+ <Atom charge=\"0.888207\" name=\"C31\" type=\"cC\" />\n+ <Atom charge=\"-0.671142\" name=\"O32\" type=\"oC\" />\n+ <Atom charge=\"-0.149259\" name=\"C32\" type=\"cD\" />\n+ <Atom charge=\"0.047345\" name=\"H2X\" type=\"hL\" />\n+ <Atom charge=\"0.047345\" name=\"H2Y\" type=\"hL\" />\n+ <Atom charge=\"-0.004882\" name=\"C23\" type=\"cD\" />\n+ <Atom charge=\"0.019007\" name=\"H3R\" type=\"hL\" />\n+ <Atom charge=\"0.019007\" name=\"H3S\" type=\"hL\" />\n+ <Atom charge=\"-0.030099\" name=\"C24\" type=\"cD\" />\n+ <Atom charge=\"0.020877\" name=\"H4R\" type=\"hL\" />\n+ <Atom charge=\"0.020877\" name=\"H4S\" type=\"hL\" />\n+ <Atom charge=\"-0.029387\" name=\"C25\" type=\"cD\" />\n+ <Atom charge=\"0.016763\" name=\"H5R\" type=\"hL\" />\n+ <Atom charge=\"0.016763\" name=\"H5S\" type=\"hL\" />\n+ <Atom charge=\"-0.024427\" name=\"C26\" type=\"cD\" />\n+ <Atom charge=\"0.013334\" name=\"H6R\" type=\"hL\" />\n+ <Atom charge=\"0.013334\" name=\"H6S\" type=\"hL\" />\n+ <Atom charge=\"-0.01963\" name=\"C27\" type=\"cD\" />\n+ <Atom charge=\"0.011041\" name=\"H7R\" type=\"hL\" />\n+ <Atom charge=\"0.011041\" name=\"H7S\" type=\"hL\" />\n+ <Atom charge=\"-0.015793\" name=\"C28\" type=\"cD\" />\n+ <Atom charge=\"0.009067\" name=\"H8R\" type=\"hL\" />\n+ <Atom charge=\"0.009067\" name=\"H8S\" type=\"hL\" />\n+ <Atom charge=\"-0.030472\" name=\"C29\" type=\"cD\" />\n+ <Atom charge=\"0.013897\" name=\"H9R\" type=\"hL\" />\n+ <Atom charge=\"0.013897\" name=\"H9S\" type=\"hL\" />\n+ <Atom charge=\"-0.028831\" name=\"C210\" type=\"cD\" />\n+ <Atom charge=\"0.014691\" name=\"H10R\" type=\"hL\" />\n+ <Atom charge=\"0.014691\" name=\"H10S\" type=\"hL\" />\n+ <Atom charge=\"-0.025206\" name=\"C211\" type=\"cD\" />\n+ <Atom charge=\"0.014334\" name=\"H11R\" type=\"hL\" />\n+ <Atom charge=\"0.014334\" name=\"H11S\" type=\"hL\" />\n+ <Atom charge=\"-0.027633\" name=\"C212\" type=\"cD\" />\n+ <Atom charge=\"0.011368\" name=\"H12R\" type=\"hL\" />\n+ <Atom charge=\"0.011368\" name=\"H12S\" type=\"hL\" />\n+ <Atom charge=\"-0.033096\" name=\"C213\" type=\"cD\" />\n+ <Atom charge=\"0.014621\" name=\"H13R\" type=\"hL\" />\n+ <Atom charge=\"0.014621\" name=\"H13S\" type=\"hL\" />\n+ <Atom charge=\"-0.020086\" name=\"C214\" type=\"cD\" />\n+ <Atom charge=\"0.015929\" name=\"H14R\" type=\"hL\" />\n+ <Atom charge=\"0.015929\" name=\"H14S\" type=\"hL\" />\n+ <Atom charge=\"0.013975\" name=\"C215\" type=\"cD\" />\n+ <Atom charge=\"0.009292\" name=\"H15R\" type=\"hL\" />\n+ <Atom charge=\"0.009292\" name=\"H15S\" type=\"hL\" />\n+ <Atom charge=\"-0.125447\" name=\"C216\" type=\"cD\" />\n+ <Atom charge=\"0.029047\" name=\"H16R\" type=\"hL\" />\n+ <Atom charge=\"0.029047\" name=\"H16S\" type=\"hL\" />\n+ <Atom charge=\"0.029047\" name=\"H16T\" type=\"hL\" />\n+ <Atom charge=\"-0.004882\" name=\"C33\" type=\"cD\" />\n+ <Atom charge=\"0.019007\" name=\"H3X\" type=\"hL\" />\n+ <Atom charge=\"0.019007\" name=\"H3Y\" type=\"hL\" />\n+ <Atom charge=\"-0.030099\" name=\"C34\" type=\"cD\" />\n+ <Atom charge=\"0.020877\" name=\"H4X\" type=\"hL\" />\n+ <Atom charge=\"0.020877\" name=\"H4Y\" type=\"hL\" />\n+ <Atom charge=\"-0.029387\" name=\"C35\" type=\"cD\" />\n+ <Atom charge=\"0.016763\" name=\"H5X\" type=\"hL\" />\n+ <Atom charge=\"0.016763\" name=\"H5Y\" type=\"hL\" />\n+ <Atom charge=\"-0.024427\" name=\"C36\" type=\"cD\" />\n+ <Atom charge=\"0.013334\" name=\"H6X\" type=\"hL\" />\n+ <Atom charge=\"0.013334\" name=\"H6Y\" type=\"hL\" />\n+ <Atom charge=\"-0.01963\" name=\"C37\" type=\"cD\" />\n+ <Atom charge=\"0.011041\" name=\"H7X\" type=\"hL\" />\n+ <Atom charge=\"0.011041\" name=\"H7Y\" type=\"hL\" />\n+ <Atom charge=\"-0.015793\" name=\"C38\" type=\"cD\" />\n+ <Atom charge=\"0.009067\" name=\"H8X\" type=\"hL\" />\n+ <Atom charge=\"0.009067\" name=\"H8Y\" type=\"hL\" />\n+ <Atom charge=\"-0.030472\" name=\"C39\" type=\"cD\" />\n+ <Atom charge=\"0.013897\" name=\"H9X\" type=\"hL\" />\n+ <Atom charge=\"0.013897\" name=\"H9Y\" type=\"hL\" />\n+ <Atom charge=\"-0.028831\" name=\"C310\" type=\"cD\" />\n+ <Atom charge=\"0.014691\" name=\"H10X\" type=\"hL\" />\n+ <Atom charge=\"0.014691\" name=\"H10Y\" type=\"hL\" />\n+ <Atom charge=\"-0.025206\" name=\"C311\" type=\"cD\" />\n+ <Atom charge=\"0.014334\" name=\"H11X\" type=\"hL\" />\n+ <Atom charge=\"0.014334\" name=\"H11Y\" type=\"hL\" />\n+ <Atom charge=\"-0.027633\" name=\"C312\" type=\"cD\" />\n+ <Atom charge=\"0.011368\" name=\"H12X\" type=\"hL\" />\n+ <Atom charge=\"0.011368\" name=\"H12Y\" type=\"hL\" />\n+ <Atom charge=\"-0.033096\" name=\"C313\" type=\"cD\" />\n+ <Atom charge=\"0.014621\" name=\"H13X\" type=\"hL\" />\n+ <Atom charge=\"0.014621\" name=\"H13Y\" type=\"hL\" />\n+ <Atom charge=\"-0.020086\" name=\"C314\" type=\"cD\" />\n+ <Atom charge=\"0.015929\" name=\"H14X\" type=\"hL\" />\n+ <Atom charge=\"0.015929\" name=\"H14Y\" type=\"hL\" />\n+ <Atom charge=\"0.013975\" name=\"C315\" type=\"cD\" />\n+ <Atom charge=\"0.009292\" name=\"H15X\" type=\"hL\" />\n+ <Atom charge=\"0.009292\" name=\"H15Y\" type=\"hL\" />\n+ <Atom charge=\"-0.125447\" name=\"C316\" type=\"cD\" />\n+ <Atom charge=\"0.029047\" name=\"H16X\" type=\"hL\" />\n+ <Atom charge=\"0.029047\" name=\"H16Y\" type=\"hL\" />\n+ <Atom charge=\"0.029047\" name=\"H16Z\" type=\"hL\" />\n+ <Bond atomName1=\"O12\" atomName2=\"P\" />\n+ <Bond atomName1=\"P\" atomName2=\"O11\" />\n+ <Bond atomName1=\"P\" atomName2=\"O13\" />\n+ <Bond atomName1=\"P\" atomName2=\"O14\" />\n+ <Bond atomName1=\"O12\" atomName2=\"H12\" />\n+ <Bond atomName1=\"O11\" atomName2=\"C1\" />\n+ <Bond atomName1=\"C1\" atomName2=\"HA\" />\n+ <Bond atomName1=\"C1\" atomName2=\"HB\" />\n+ <Bond atomName1=\"C1\" atomName2=\"C2\" />\n+ <Bond atomName1=\"C2\" atomName2=\"HS\" />\n+ <Bond atomName1=\"C2\" atomName2=\"C3\" />\n+ <Bond atomName1=\"C2\" atomName2=\"O21\" />\n+ <Bond atomName1=\"C3\" atomName2=\"HX\" />\n+ <Bond atomName1=\"C3\" atomName2=\"HY\" />\n+ <Bond atomName1=\"C3\" atomName2=\"O31\" />\n+ <Bond atomName1=\"O21\" atomName2=\"C21\" />\n+ <Bond atomName1=\"C21\" atomName2=\"C22\" />\n+ <Bond atomName1=\"C21\" atomName2=\"O22\" />\n+ <Bond atomName1=\"C22\" atomName2=\"H2R\" />\n+ <Bond atomName1=\"C22\" atomName2=\"H2S\" />\n+ <Bond atomName1=\"C22\" atomName2=\"C23\" />\n+ <Bond atomName1=\"C23\" atomName2=\"H3R\" />\n+ <Bond atomName1=\"C23\" atomName2=\"H3S\" />\n+ <Bond atomName1=\"C23\" atomName2=\"C24\" />\n+ <Bond atomName1=\"C24\" atomName2=\"H4R\" />\n+ <Bond atomName1=\"C24\" atomName2=\"H4S\" />\n+ <Bond atomName1=\"C24\" atomName2=\"C25\" />\n+ <Bond atomName1=\"C25\" atomName2=\"H5R\" />\n+ <Bond atomName1=\"C25\" atomName2=\"H5S\" />\n+ <Bond atomName1=\"C25\" atomName2=\"C26\" />\n+ <Bond atomName1=\"C26\" atomName2=\"H6R\" />\n+ <Bond atomName1=\"C26\" atomName2=\"H6S\" />\n+ <Bond atomName1=\"C26\" atomName2=\"C27\" />\n+ <Bond atomName1=\"C27\" atomName2=\"H7R\" />\n+ <Bond atomName1=\"C27\" atomName2=\"H7S\" />\n+ <Bond atomName1=\"C27\" atomName2=\"C28\" />\n+ <Bond atomName1=\"C28\" atomName2=\"H8R\" />\n+ <Bond atomName1=\"C28\" atomName2=\"H8S\" />\n+ <Bond atomName1=\"C28\" atomName2=\"C29\" />\n+ <Bond atomName1=\"C29\" atomName2=\"H9R\" />\n+ <Bond atomName1=\"C29\" atomName2=\"H9S\" />\n+ <Bond atomName1=\"C29\" atomName2=\"C210\" />\n+ <Bond atomName1=\"C210\" atomName2=\"H10R\" />\n+ <Bond atomName1=\"C210\" atomName2=\"H10S\" />\n+ <Bond atomName1=\"C210\" atomName2=\"C211\" />\n+ <Bond atomName1=\"C211\" atomName2=\"H11R\" />\n+ <Bond atomName1=\"C211\" atomName2=\"H11S\" />\n+ <Bond atomName1=\"C211\" atomName2=\"C212\" />\n+ <Bond atomName1=\"C212\" atomName2=\"H12R\" />\n+ <Bond atomName1=\"C212\" atomName2=\"H12S\" />\n+ <Bond atomName1=\"C212\" atomName2=\"C213\" />\n+ <Bond atomName1=\"C213\" atomName2=\"H13R\" />\n+ <Bond atomName1=\"C213\" atomName2=\"H13S\" />\n+ <Bond atomName1=\"C213\" atomName2=\"C214\" />\n+ <Bond atomName1=\"C214\" atomName2=\"H14R\" />\n+ <Bond atomName1=\"C214\" atomName2=\"H14S\" />\n+ <Bond atomName1=\"C214\" atomName2=\"C215\" />\n+ <Bond atomName1=\"C215\" atomName2=\"H15R\" />\n+ <Bond atomName1=\"C215\" atomName2=\"H15S\" />\n+ <Bond atomName1=\"C215\" atomName2=\"C216\" />\n+ <Bond atomName1=\"C216\" atomName2=\"H16R\" />\n+ <Bond atomName1=\"C216\" atomName2=\"H16S\" />\n+ <Bond atomName1=\"C216\" atomName2=\"H16T\" />\n+ <Bond atomName1=\"O31\" atomName2=\"C31\" />\n+ <Bond atomName1=\"C31\" atomName2=\"C32\" />\n+ <Bond atomName1=\"C31\" atomName2=\"O32\" />\n+ <Bond atomName1=\"C32\" atomName2=\"H2X\" />\n+ <Bond atomName1=\"C32\" atomName2=\"H2Y\" />\n+ <Bond atomName1=\"C32\" atomName2=\"C33\" />\n+ <Bond atomName1=\"C33\" atomName2=\"H3X\" />\n+ <Bond atomName1=\"C33\" atomName2=\"H3Y\" />\n+ <Bond atomName1=\"C33\" atomName2=\"C34\" />\n+ <Bond atomName1=\"C34\" atomName2=\"H4X\" />\n+ <Bond atomName1=\"C34\" atomName2=\"H4Y\" />\n+ <Bond atomName1=\"C34\" atomName2=\"C35\" />\n+ <Bond atomName1=\"C35\" atomName2=\"H5X\" />\n+ <Bond atomName1=\"C35\" atomName2=\"H5Y\" />\n+ <Bond atomName1=\"C35\" atomName2=\"C36\" />\n+ <Bond atomName1=\"C36\" atomName2=\"H6X\" />\n+ <Bond atomName1=\"C36\" atomName2=\"H6Y\" />\n+ <Bond atomName1=\"C36\" atomName2=\"C37\" />\n+ <Bond atomName1=\"C37\" atomName2=\"H7X\" />\n+ <Bond atomName1=\"C37\" atomName2=\"H7Y\" />\n+ <Bond atomName1=\"C37\" atomName2=\"C38\" />\n+ <Bond atomName1=\"C38\" atomName2=\"H8X\" />\n+ <Bond atomName1=\"C38\" atomName2=\"H8Y\" />\n+ <Bond atomName1=\"C38\" atomName2=\"C39\" />\n+ <Bond atomName1=\"C39\" atomName2=\"H9X\" />\n+ <Bond atomName1=\"C39\" atomName2=\"H9Y\" />\n+ <Bond atomName1=\"C39\" atomName2=\"C310\" />\n+ <Bond atomName1=\"C310\" atomName2=\"H10X\" />\n+ <Bond atomName1=\"C310\" atomName2=\"H10Y\" />\n+ <Bond atomName1=\"C310\" atomName2=\"C311\" />\n+ <Bond atomName1=\"C311\" atomName2=\"H11X\" />\n+ <Bond atomName1=\"C311\" atomName2=\"H11Y\" />\n+ <Bond atomName1=\"C311\" atomName2=\"C312\" />\n+ <Bond atomName1=\"C312\" atomName2=\"H12X\" />\n+ <Bond atomName1=\"C312\" atomName2=\"H12Y\" />\n+ <Bond atomName1=\"C312\" atomName2=\"C313\" />\n+ <Bond atomName1=\"C313\" atomName2=\"H13X\" />\n+ <Bond atomName1=\"C313\" atomName2=\"H13Y\" />\n+ <Bond atomName1=\"C313\" atomName2=\"C314\" />\n+ <Bond atomName1=\"C314\" atomName2=\"H14X\" />\n+ <Bond atomName1=\"C314\" atomName2=\"H14Y\" />\n+ <Bond atomName1=\"C314\" atomName2=\"C315\" />\n+ <Bond atomName1=\"C315\" atomName2=\"H15X\" />\n+ <Bond atomName1=\"C315\" atomName2=\"H15Y\" />\n+ <Bond atomName1=\"C315\" atomName2=\"C316\" />\n+ <Bond atomName1=\"C316\" atomName2=\"H16X\" />\n+ <Bond atomName1=\"C316\" atomName2=\"H16Y\" />\n+ <Bond atomName1=\"C316\" atomName2=\"H16Z\" />\n+ </Residue>\n+ <Residue name=\"DPPG\">\n+ <Atom charge=\"0.193597\" name=\"C13\" type=\"cA\" />\n+ <Atom charge=\"0.034715\" name=\"H13A\" type=\"hE\" />\n+ <Atom charge=\"0.034715\" name=\"H13B\" type=\"hE\" />\n+ <Atom charge=\"-0.700871\" name=\"OC3\" type=\"oH\" />\n+ <Atom charge=\"0.423328\" name=\"HO3\" type=\"hO\" />\n+ <Atom charge=\"0.336816\" name=\"C12\" type=\"cA\" />\n+ <Atom charge=\"0.030042\" name=\"H12A\" type=\"hE\" />\n+ <Atom charge=\"-0.726192\" name=\"OC2\" type=\"oH\" />\n+ <Atom charge=\"0.439523\" name=\"HO2\" type=\"hO\" />\n+ <Atom charge=\"-0.056706\" name=\"C11\" type=\"cA\" />\n+ <Atom charge=\"0.093354\" name=\"H11A\" type=\"hE\" />\n+ <Atom charge=\"0.093354\" name=\"H11B\" type=\"hE\" />\n+ <Atom charge=\"1.380464\" name=\"P\" type=\"pA\" />\n+ <Atom charge=\"-0.873444\" name=\"O13\" type=\"oP\" />\n+ <Atom charge=\"-0.873444\" name=\"O14\" type=\"oP\" />\n+ <Atom charge=\"-0.534308\" name=\"O12\" type=\"oT\" />\n+ <Atom charge=\"-0.546098\" name=\"O11\" type=\"oT\" />\n+ <Atom charge=\"0.043713\" name=\"C1\" type=\"cA\" />\n+ <Atom charge=\"0.091041\" name=\"HA\" type=\"hE\" />\n+ <Atom charge=\"0.091041\" name=\"HB\" type=\"hE\" />\n+ <Atom charge=\"0.353807\" name=\"C2\" type=\"cA\" />\n+ <Atom charge=\"0.037488\" name=\"HS\" type=\"hE\" />\n+ <Atom charge=\"-0.599131\" name=\"O21\" type=\"oS\" />\n+ <Atom charge=\"0.883669\" name=\"C21\" type=\"cC\" />\n+ <Atom charge=\"-0.655762\" name=\"O22\" type=\"oC\" />\n+ <Atom charge=\"-0.149259\" name=\"C22\" type=\"cD\" />\n+ <Atom charge=\"0.047345\" name=\"H2R\" type=\"hL\" />\n+ <Atom charge=\"0.047345\" name=\"H2S\" type=\"hL\" />\n+ <Atom charge=\"0.295119\" name=\"C3\" type=\"cA\" />\n+ <Atom charge=\"0.033797\" name=\"HX\" type=\"hE\" />\n+ <Atom charge=\"0.033797\" name=\"HY\" type=\"hE\" />\n+ <Atom charge=\"-0.585165\" name=\"O31\" type=\"oS\" />\n+ <Atom charge=\"0.877006\" name=\"C31\" type=\"cC\" />\n+ <Atom charge=\"-0.649265\" name=\"O32\" type=\"oC\" />\n+ <Atom charge=\"-0.149259\" name=\"C32\" type=\"cD\" />\n+ <Atom charge=\"0.047345\" name=\"H2X\" type=\"hL\" />\n+ <Atom charge=\"0.047345\" name=\"H2Y\" type=\"hL\" />\n+ <Atom charge=\"-0.004882\" name=\"C23\" type=\"cD\" />\n+ <Atom charge=\"0.019007\" name=\"H3R\" type=\"hL\" />\n+ <Atom charge=\"0.019007\" name=\"H3S\" type=\"hL\" />\n+ <Atom charge=\"-0.030099\" name=\"C24\" type=\"cD\" />\n+ <Atom charge=\"0.020877\" name=\"H4R\" type=\"hL\" />\n+ <Atom charge=\"0.020877\" name=\"H4S\" type=\"hL\" />\n+ <Atom charge=\"-0.029387\" name=\"C25\" type=\"cD\" />\n+ <Atom charge=\"0.016763\" name=\"H5R\" type=\"hL\" />\n+ <Atom charge=\"0.016763\" name=\"H5S\" type=\"hL\" />\n+ <Atom charge=\"-0.024427\" name=\"C26\" type=\"cD\" />\n+ <Atom charge=\"0.013334\" name=\"H6R\" type=\"hL\" />\n+ <Atom charge=\"0.013334\" name=\"H6S\" type=\"hL\" />\n+ <Atom charge=\"-0.01963\" name=\"C27\" type=\"cD\" />\n+ <Atom charge=\"0.011041\" name=\"H7R\" type=\"hL\" />\n+ <Atom charge=\"0.011041\" name=\"H7S\" type=\"hL\" />\n+ <Atom charge=\"-0.015793\" name=\"C28\" type=\"cD\" />\n+ <Atom charge=\"0.009067\" name=\"H8R\" type=\"hL\" />\n+ <Atom charge=\"0.009067\" name=\"H8S\" type=\"hL\" />\n+ <Atom charge=\"-0.030472\" name=\"C29\" type=\"cD\" />\n+ <Atom charge=\"0.013897\" name=\"H9R\" type=\"hL\" />\n+ <Atom charge=\"0.013897\" name=\"H9S\" type=\"hL\" />\n+ <Atom charge=\"-0.028831\" name=\"C210\" type=\"cD\" />\n+ <Atom charge=\"0.014691\" name=\"H10R\" type=\"hL\" />\n+ <Atom charge=\"0.014691\" name=\"H10S\" type=\"hL\" />\n+ <Atom charge=\"-0.025206\" name=\"C211\" type=\"cD\" />\n+ <Atom charge=\"0.014334\" name=\"H11R\" type=\"hL\" />\n+ <Atom charge=\"0.014334\" name=\"H11S\" type=\"hL\" />\n+ <Atom charge=\"-0.027633\" name=\"C212\" type=\"cD\" />\n+ <Atom charge=\"0.011368\" name=\"H12R\" type=\"hL\" />\n+ <Atom charge=\"0.011368\" name=\"H12S\" type=\"hL\" />\n+ <Atom charge=\"-0.033096\" name=\"C213\" type=\"cD\" />\n+ <Atom charge=\"0.014621\" name=\"H13R\" type=\"hL\" />\n+ <Atom charge=\"0.014621\" name=\"H13S\" type=\"hL\" />\n+ <Atom charge=\"-0.020086\" name=\"C214\" type=\"cD\" />\n+ <Atom charge=\"0.015929\" name=\"H14R\" type=\"hL\" />\n+ <Atom charge=\"0.015929\" name=\"H14S\" type=\"hL\" />\n+ <Atom charge=\"0.013975\" name=\"C215\" type=\"cD\" />\n+ <Atom charge=\"0.009292\" name=\"H15R\" type=\"hL\" />\n+ <Atom charge=\"0.009292\" name=\"H15S\" type=\"hL\" />\n+ <Atom charge=\"-0.125447\" name=\"C216\" type=\"cD\" />\n+ <Atom charge=\"0.029047\" name=\"H16R\" type=\"hL\" />\n+ <Atom charge=\"0.029047\" name=\"H16S\" type=\"hL\" />\n+ <Atom charge=\"0.029047\" name=\"H16T\" type=\"hL\" />\n+ <Atom charge=\"-0.004882\" name=\"C33\" type=\"cD\" />\n+ <Atom charge=\"0.019007\" name=\"H3X\" type=\"hL\" />\n+ <Atom charge=\"0.019007\" name=\"H3Y\" type=\"hL\" />\n+ <Atom charge=\"-0.030099\" name=\"C34\" type=\"cD\" />\n+ <Atom charge=\"0.020877\" name=\"H4X\" type=\"hL\" />\n+ <Atom charge=\"0.020877\" name=\"H4Y\" type=\"hL\" />\n+ <Atom charge=\"-0.029387\" name=\"C35\" type=\"cD\" />\n+ <Atom charge=\"0.016763\" name=\"H5X\" type=\"hL\" />\n+ <Atom charge=\"0.016763\" name=\"H5Y\" type=\"hL\" />\n+ <Atom charge=\"-0.024427\" name=\"C36\" type=\"cD\" />\n+ <Atom charge=\"0.013334\" name=\"H6X\" type=\"hL\" />\n+ <Atom charge=\"0.013334\" name=\"H6Y\" type=\"hL\" />\n+ <Atom charge=\"-0.01963\" name=\"C37\" type=\"cD\" />\n+ <Atom charge=\"0.011041\" name=\"H7X\" type=\"hL\" />\n+ <Atom charge=\"0.011041\" name=\"H7Y\" type=\"hL\" />\n+ <Atom charge=\"-0.015793\" name=\"C38\" type=\"cD\" />\n+ <Atom charge=\"0.009067\" name=\"H8X\" type=\"hL\" />\n+ <Atom charge=\"0.009067\" name=\"H8Y\" type=\"hL\" />\n+ <Atom charge=\"-0.030472\" name=\"C39\" type=\"cD\" />\n+ <Atom charge=\"0.013897\" name=\"H9X\" type=\"hL\" />\n+ <Atom charge=\"0.013897\" name=\"H9Y\" type=\"hL\" />\n+ <Atom charge=\"-0.028831\" name=\"C310\" type=\"cD\" />\n+ <Atom charge=\"0.014691\" name=\"H10X\" type=\"hL\" />\n+ <Atom charge=\"0.014691\" name=\"H10Y\" type=\"hL\" />\n+ <Atom charge=\"-0.025206\" name=\"C311\" type=\"cD\" />\n+ <Atom charge=\"0.014334\" name=\"H11X\" type=\"hL\" />\n+ <Atom charge=\"0.014334\" name=\"H11Y\" type=\"hL\" />\n+ <Atom charge=\"-0.027633\" name=\"C312\" type=\"cD\" />\n+ <Atom charge=\"0.011368\" name=\"H12X\" type=\"hL\" />\n+ <Atom charge=\"0.011368\" name=\"H12Y\" type=\"hL\" />\n+ <Atom charge=\"-0.033096\" name=\"C313\" type=\"cD\" />\n+ <Atom charge=\"0.014621\" name=\"H13X\" type=\"hL\" />\n+ <Atom charge=\"0.014621\" name=\"H13Y\" type=\"hL\" />\n+ <Atom charge=\"-0.020086\" name=\"C314\" type=\"cD\" />\n+ <Atom charge=\"0.015929\" name=\"H14X\" type=\"hL\" />\n+ <Atom charge=\"0.015929\" name=\"H14Y\" type=\"hL\" />\n+ <Atom charge=\"0.013975\" name=\"C315\" type=\"cD\" />\n+ <Atom charge=\"0.009292\" name=\"H15X\" type=\"hL\" />\n+ <Atom charge=\"0.009292\" name=\"H15Y\" type=\"hL\" />\n+ <Atom charge=\"-0.125447\" name=\"C316\" type=\"cD\" />\n+ <Atom charge=\"0.029047\" name=\"H16X\" type=\"hL\" />\n+ <Atom charge=\"0.029047\" name=\"H16Y\" type=\"hL\" />\n+ <Atom charge=\"0.029047\" name=\"H16Z\" type=\"hL\" />\n+ <Bond atomName1=\"HO3\" atomName2=\"OC3\" />\n+ <Bond atomName1=\"OC3\" atomName2=\"C13\" />\n+ <Bond atomName1=\"C13\" atomName2=\"H13A\" />\n+ <Bond atomName1=\"C13\" atomName2=\"H13B\" />\n+ <Bond atomName1=\"C13\" atomName2=\"C12\" />\n+ <Bond atomName1=\"HO2\" atomName2=\"OC2\" />\n+ <Bond atomName1=\"OC2\" atomName2=\"C12\" />\n+ <Bond atomName1=\"C12\" atomName2=\"H12A\" />\n+ <Bond atomName1=\"C12\" atomName2=\"C11\" />\n+ <Bond atomName1=\"C11\" atomName2=\"H11A\" />\n+ <Bond atomName1=\"C11\" atomName2=\"H11B\" />\n+ <Bond atomName1=\"C11\" atomName2=\"O12\" />\n+ <Bond atomName1=\"O11\" atomName2=\"C1\" />\n+ <Bond atomName1=\"O12\" atomName2=\"P\" />\n+ <Bond atomName1=\"P\" atomName2=\"O11\" />\n+ <Bond atomName1=\"P\" atomName2=\"O13\" />\n+ <Bond atomName1=\"P\" atomName2=\"O14\" />\n+ <Bond atomName1=\"C1\" atomName2=\"HA\" />\n+ <Bond atomName1=\"C1\" atomName2=\"HB\" />\n+ <Bond atomName1=\"C1\" atomName2=\"C2\" />\n+ <Bond atomName1=\"C2\" atomName2=\"HS\" />\n+ <Bond atomName1=\"C2\" atomName2=\"C3\" />\n+ <Bond atomName1=\"C2\" atomName2=\"O21\" />\n+ <Bond atomName1=\"C3\" atomName2=\"HX\" />\n+ <Bond atomName1=\"C3\" atomName2=\"HY\" />\n+ <Bond atomName1=\"C3\" atomName2=\"O31\" />\n+ <Bond atomName1=\"O21\" atomName2=\"C21\" />\n+ <Bond atomName1=\"C21\" atomName2=\"C22\" />\n+ <Bond atomName1=\"C21\" atomName2=\"O22\" />\n+ <Bond atomName1=\"C22\" atomName2=\"H2R\" />\n+ <Bond atomName1=\"C22\" atomName2=\"H2S\" />\n+ <Bond atomName1=\"C22\" atomName2=\"C23\" />\n+ <Bond atomName1=\"C23\" atomName2=\"H3R\" />\n+ <Bond atomName1=\"C23\" atomName2=\"H3S\" />\n+ <Bond atomName1=\"C23\" atomName2=\"C24\" />\n+ <Bond atomName1=\"C24\" atomName2=\"H4R\" />\n+ <Bond atomName1=\"C24\" atomName2=\"H4S\" />\n+ <Bond atomName1=\"C24\" atomName2=\"C25\" />\n+ <Bond atomName1=\"C25\" atomName2=\"H5R\" />\n+ <Bond atomName1=\"C25\" atomName2=\"H5S\" />\n+ <Bond atomName1=\"C25\" atomName2=\"C26\" />\n+ <Bond atomName1=\"C26\" atomName2=\"H6R\" />\n+ <Bond atomName1=\"C26\" atomName2=\"H6S\" />\n+ <Bond atomName1=\"C26\" atomName2=\"C27\" />\n+ <Bond atomName1=\"C27\" atomName2=\"H7R\" />\n+ <Bond atomName1=\"C27\" atomName2=\"H7S\" />\n+ <Bond atomName1=\"C27\" atomName2=\"C28\" />\n+ <Bond atomName1=\"C28\" atomName2=\"H8R\" />\n+ <Bond atomName1=\"C28\" atomName2=\"H8S\" />\n+ <Bond atomName1=\"C28\" atomName2=\"C29\" />\n+ <Bond atomName1=\"C29\" atomName2=\"H9R\" />\n+ <Bond atomName1=\"C29\" atomName2=\"H9S\" />\n+ <Bond atomName1=\"C29\" atomName2=\"C210\" />\n+ <Bond atomName1=\"C210\" atomName2=\"H10R\" />\n+ <Bond atomName1=\"C210\" atomName2=\"H10S\" />\n+ <Bond atomName1=\"C210\" atomName2=\"C211\" />\n+ <Bond atomName1=\"C211\" atomName2=\"H11R\" />\n+ <Bond atomName1=\"C211\" atomName2=\"H11S\" />\n+ <Bond atomName1=\"C211\" atomName2=\"C212\" />\n+ <Bond atomName1=\"C212\" atomName2=\"H12R\" />\n+ <Bond atomName1=\"C212\" atomName2=\"H12S\" />\n+ <Bond atomName1=\"C212\" atomName2=\"C213\" />\n+ <Bond atomName1=\"C213\" atomName2=\"H13R\" />\n+ <Bond atomName1=\"C213\" atomName2=\"H13S\" />\n+ <Bond atomName1=\"C213\" atomName2=\"C214\" />\n+ <Bond atomName1=\"C214\" atomName2=\"H14R\" />\n+ <Bond atomName1=\"C214\" atomName2=\"H14S\" />\n+ <Bond atomName1=\"C214\" atomName2=\"C215\" />\n+ <Bond atomName1=\"C215\" atomName2=\"H15R\" />\n+ <Bond atomName1=\"C215\" atomName2=\"H15S\" />\n+ <Bond atomName1=\"C215\" atomName2=\"C216\" />\n+ <Bond atomName1=\"C216\" atomName2=\"H16R\" />\n+ <Bond atomName1=\"C216\" atomName2=\"H16S\" />\n+ <Bond atomName1=\"C216\" atomName2=\"H16T\" />\n+ <Bond atomName1=\"O31\" atomName2=\"C31\" />\n+ <Bond atomName1=\"C31\" atomName2=\"C32\" />\n+ <Bond atomName1=\"C31\" atomName2=\"O32\" />\n+ <Bond atomName1=\"C32\" atomName2=\"H2X\" />\n+ <Bond atomName1=\"C32\" atomName2=\"H2Y\" />\n+ <Bond atomName1=\"C32\" atomName2=\"C33\" />\n+ <Bond atomName1=\"C33\" atomName2=\"H3X\" />\n+ <Bond atomName1=\"C33\" atomName2=\"H3Y\" />\n+ <Bond atomName1=\"C33\" atomName2=\"C34\" />\n+ <Bond atomName1=\"C34\" atomName2=\"H4X\" />\n+ <Bond atomName1=\"C34\" atomName2=\"H4Y\" />\n+ <Bond atomName1=\"C34\" atomName2=\"C35\" />\n+ <Bond atomName1=\"C35\" atomName2=\"H5X\" />\n+ <Bond atomName1=\"C35\" atomName2=\"H5Y\" />\n+ <Bond atomName1=\"C35\" atomName2=\"C36\" />\n+ <Bond atomName1=\"C36\" atomName2=\"H6X\" />\n+ <Bond atomName1=\"C36\" atomName2=\"H6Y\" />\n+ <Bond atomName1=\"C36\" atomName2=\"C37\" />\n+ <Bond atomName1=\"C37\" atomName2=\"H7X\" />\n+ <Bond atomName1=\"C37\" atomName2=\"H7Y\" />\n+ <Bond atomName1=\"C37\" atomName2=\"C38\" />\n+ <Bond atomName1=\"C38\" atomName2=\"H8X\" />\n+ <Bond atomName1=\"C38\" atomName2=\"H8Y\" />\n+ <Bond atomName1=\"C38\" atomName2=\"C39\" />\n+ <Bond atomName1=\"C39\" atomName2=\"H9X\" />\n+ <Bond atomName1=\"C39\" atomName2=\"H9Y\" />\n+ <Bond atomName1=\"C39\" atomName2=\"C310\" />\n+ <Bond atomName1=\"C310\" atomName2=\"H10X\" />\n+ <Bond atomName1=\"C310\" atomName2=\"H10Y\" />\n+ <Bond atomName1=\"C310\" atomName2=\"C311\" />\n+ <Bond atomName1=\"C311\" atomName2=\"H11X\" />\n+ <Bond atomName1=\"C311\" atomName2=\"H11Y\" />\n+ <Bond atomName1=\"C311\" atomName2=\"C312\" />\n+ <Bond atomName1=\"C312\" atomName2=\"H12X\" />\n+ <Bond atomName1=\"C312\" atomName2=\"H12Y\" />\n+ <Bond atomName1=\"C312\" atomName2=\"C313\" />\n+ <Bond atomName1=\"C313\" atomName2=\"H13X\" />\n+ <Bond atomName1=\"C313\" atomName2=\"H13Y\" />\n+ <Bond atomName1=\"C313\" atomName2=\"C314\" />\n+ <Bond atomName1=\"C314\" atomName2=\"H14X\" />\n+ <Bond atomName1=\"C314\" atomName2=\"H14Y\" />\n+ <Bond atomName1=\"C314\" atomName2=\"C315\" />\n+ <Bond atomName1=\"C315\" atomName2=\"H15X\" />\n+ <Bond atomName1=\"C315\" atomName2=\"H15Y\" />\n+ <Bond atomName1=\"C315\" atomName2=\"C316\" />\n+ <Bond atomName1=\"C316\" atomName2=\"H16X\" />\n+ <Bond atomName1=\"C316\" atomName2=\"H16Y\" />\n+ <Bond atomName1=\"C316\" atomName2=\"H16Z\" />\n+ </Residue>\n+ <Residue name=\"DSPC\">\n+ <Atom charge=\"0.245262\" name=\"N\" type=\"nA\" />\n+ <Atom charge=\"-0.338973\" name=\"C13\" type=\"cA\" />\n+ <Atom charge=\"0.17223\" name=\"H13A\" type=\"hX\" />\n+ <Atom charge=\"0.17223\" name=\"H13B\" type=\"hX\" />\n+ <Atom charge=\"0.17223\" name=\"H13C\" type=\"hX\" />\n+ <Atom charge=\"-0.338973\" name=\"C14\" type=\"cA\" />\n+ <Atom charge=\"0.17223\" name=\"H14A\" type=\"hX\" />\n+ <Atom charge=\"0.17223\" name=\"H14B\" type=\"hX\" />\n+ <Atom charge=\"0.17223\" name=\"H14C\" type=\"hX\" />\n+ <Atom charge=\"-0.338973\" name=\"C15\" type=\"cA\" />\n+ <Atom charge=\"0.17223\" name=\"H15A\" type=\"hX\" />\n+ <Atom charge=\"0.17223\" name=\"H15B\" type=\"hX\" />\n+ <Atom charge=\"0.17223\" name=\"H15C\" type=\"hX\" />\n+ <Atom charge=\"-0.170824\" name=\"C12\" type=\"cA\" />\n+ <Atom charge=\"0.136415\" name=\"H12A\" type=\"hX\" />\n+ <Atom charge=\"0.136415\" name=\"H12B\" type=\"hX\" />\n+ <Atom charge=\"0.166801\" name=\"C11\" type=\"cA\" />\n+ <Atom charge=\"0.078534\" name=\"H11A\" type=\"hE\" />\n+ <Atom charge=\"0.078534\" name=\"H11B\" type=\"hE\" />\n+ <Atom charge=\"1.339721\" name=\"P\" type=\"pA\" />\n+ <Atom charge=\"-0.875812\" name=\"O13\" type=\"oP\" />\n+ <Atom charge=\"-0.875812\" name=\"O14\" type=\"oP\" />\n+ <Atom charge=\"-0.50948\" name=\"O11\" type=\"oT\" />\n+ <Atom charge=\"-0.508176\" name=\"O12\" type=\"oT\" />\n+ <Atom charge=\"0.017459\" name=\"C1\" type=\"cA\" />\n+ <Atom charge=\"0.095591\" name=\"HA\" type=\"hE\" />\n+ <Atom charge=\"0.095591\" name=\"HB\" type=\"hE\" />\n+ <Atom charge=\"0.281242\" name=\"C2\" type=\"cA\" />\n+ <Atom charge=\"0.063253\" name=\"HS\" type=\"hE\" />\n+ <Atom charge=\"-0.552948\" name=\"O21\" type=\"oS\" />\n+ <Atom charge=\"0.897613\" name=\"C21\" type=\"cC\" />\n+ <Atom charge=\"-0.673755\" name=\"O22\" type=\"oC\" />\n+ <Atom charge=\"-0.11702\" name=\"C22\" type=\"cD\" />\n+ <Atom charge=\"0.051807\" name=\"H2R\" type=\"hL\" />\n+ <Atom charge=\"0.051807\" name=\"H2S\" type=\"hL\" />\n+ <Atom charge=\"0.196939\" name=\"C3\" type=\"cA\" />\n+ <Atom charge=\"0.070469\" name=\"HX\" type=\"hE\" />\n+ <Atom charge=\"0.070469\" name=\"HY\" type=\"hE\" />\n+ <Atom charge=\"-0.575489\" name=\"O31\" type=\"oS\" />\n+ <Atom charge=\"0.910403\" name=\"C31\" type=\"cC\" />\n+ <Atom charge=\"-0.671566\" name=\"O32\" type=\"oC\" />\n+ <Atom charge=\"-0.11702\" name=\"C32\" type=\"cD\" />\n+ <Atom charge=\"0.051807\" name=\"H2X\" type=\"hL\" />\n+ <Atom charge=\"0.051807\" name=\"H2Y\" type=\"hL\" />\n+ <Atom charge=\"-0.000128\" name=\"C23\" type=\"cD\" />\n+ <Atom charge=\"0.013886\" name=\"H3R\" type=\"hL\" />\n+ <Atom charge=\"0.013886\" name=\"H3S\" type=\"hL\" />\n+ <Atom charge=\"-0.059792\" name=\"C24\" type=\"cD\" />\n+ <Atom charge=\"0.024241\" name=\"H4R\" type=\"hL\" />\n+ <Atom charge=\"0.024241\" name=\"H4S\" type=\"hL\" />\n+ <Atom charge=\"-0.013443\" name=\"C25\" type=\"cD\" />\n+ <Atom charge=\"0.008191\" name=\"H5R\" type=\"hL\" />\n+ <Atom charge=\"0.008191\" name=\"H5S\" type=\"hL\" />\n+ <Atom charge=\"-0.037627\" name=\"C26\" type=\"cD\" />\n+ <Atom charge=\"0.01774\" name=\"H6R\" type=\"hL\" />\n+ <Atom charge=\"0.01774\" name=\"H6S\" type=\"hL\" />\n+ <Atom charge=\"-0.019469\" name=\"C27\" type=\"cD\" />\n+ <Atom charge=\"0.009292\" name=\"H7R\" type=\"hL\" />\n+ <Atom charge=\"0.009292\" name=\"H7S\" type=\"hL\" />\n+ <Atom charge=\"-0.014623\" name=\"C28\" type=\"cD\" />\n+ <Atom charge=\"0.007326\" name=\"H8R\" type=\"hL\" />\n+ <Atom charge=\"0.007326\" name=\"H8S\" type=\"hL\" />\n+ <Atom charge=\"-0.017997\" name=\"C29\" type=\"cD\" />\n+ <Atom charge=\"0.009595\" name=\"H9R\" type=\"hL\" />\n+ <Atom charge=\"0.009595\" name=\"H9S\" type=\"hL\" />\n+ <Atom charge=\"-0.026418\" name=\"C210\" type=\"cD\" />\n+ <Atom charge=\"0.010825\" name=\"H10R\" type=\"hL\" />\n+ <Atom charge=\"0.010825\" name=\"H10S\" type=\"hL\" />\n+ <Atom charge=\"-0.017093\" name=\"C211\" type=\"cD\" />\n+ <Atom charge=\"0.010206\" name=\"H11R\" type=\"hL\" />\n+ <Atom charge=\"0.010206\" name=\"H11S\" type=\"hL\" />\n+ <Atom charge=\"-0.019153\" name=\"C212\" type=\"cD\" />\n+ <Atom charge=\"0.008198\" name=\"H12R\" type=\"hL\" />\n+ <Atom charge=\"0.008198\" name=\"H12S\" type=\"hL\" />\n+ <Atom charge=\"-0.01159\" name=\"C213\" type=\"cD\" />\n+ <Atom charge=\"0.006022\" name=\"H13R\" type=\"hL\" />\n+ <Atom charge=\"0.006022\" name=\"H13S\" type=\"hL\" />\n+ <Atom charge=\"-0.013489\" name=\"C214\" type=\"cD\" />\n+ <Atom charge=\"0.010073\" name=\"H14R\" type=\"hL\" />\n+ <Atom charge=\"0.010073\" name=\"H14S\" type=\"hL\" />\n+ <Atom charge=\"-0.032444\" name=\"C215\" type=\"cD\" />\n+ <Atom charge=\"0.010253\" name=\"H15R\" type=\"hL\" />\n+ <Atom charge=\"0.010253\" name=\"H15S\" type=\"hL\" />\n+ <Atom charge=\"-0.027654\" name=\"C216\" type=\"cD\" />\n+ <Atom charge=\"0.015627\" name=\"H16R\" type=\"hL\" />\n+ <Atom charge=\"0.015627\" name=\"H16S\" type=\"hL\" />\n+ <Atom charge=\"0.020665\" name=\"C217\" type=\"cD\" />\n+ <Atom charge=\"0.008483\" name=\"H17R\" type=\"hL\" />\n+ <Atom charge=\"0.008483\" name=\"H17S\" type=\"hL\" />\n+ <Atom charge=\"-0.120069\" name=\"C218\" type=\"cD\" />\n+ <Atom charge=\"0.027938\" name=\"H18R\" type=\"hL\" />\n+ <Atom charge=\"0.027938\" name=\"H18S\" type=\"hL\" />\n+ <Atom charge=\"0.027938\" name=\"H18T\" type=\"hL\" />\n+ <Atom charge=\"-0.000128\" name=\"C33\" type=\"cD\" />\n+ <Atom charge=\"0.013886\" name=\"H3X\" type=\"hL\" />\n+ <Atom charge=\"0.013886\" name=\"H3Y\" type=\"hL\" />\n+ <Atom charge=\"-0.059792\" name=\"C34\" type=\"cD\" />\n+ <Atom charge=\"0.024241\" name=\"H4X\" type=\"hL\" />\n+ <Atom charge=\"0.024241\" name=\"H4Y\" type=\"hL\" />\n+ <Atom charge=\"-0.013443\" name=\"C35\" type=\"cD\" />\n+ <Atom charge=\"0.008191\" name=\"H5X\" type=\"hL\" />\n+ <Atom charge=\"0.008191\" name=\"H5Y\" type=\"hL\" />\n+ <Atom charge=\"-0.037627\" name=\"C36\" type=\"cD\" />\n+ <Atom charge=\"0.01774\" name=\"H6X\" type=\"hL\" />\n+ <Atom charge=\"0.01774\" name=\"H6Y\" type=\"hL\" />\n+ <Atom charge=\"-0.019469\" name=\"C37\" type=\"cD\" />\n+ <Atom charge=\"0.009292\" name=\"H7X\" type=\"hL\" />\n+ <Atom charge=\"0.009292\" name=\"H7Y\" type=\"hL\" />\n+ <Atom charge=\"-0.014623\" name=\"C38\" type=\"cD\" />\n+ <Atom charge=\"0.007326\" name=\"H8X\" type=\"hL\" />\n+ <Atom charge=\"0.007326\" name=\"H8Y\" type=\"hL\" />\n+ <Atom charge=\"-0.017997\" name=\"C39\" type=\"cD\" />\n+ <Atom charge=\"0.009595\" name=\"H9X\" type=\"hL\" />\n+ <Atom charge=\"0.009595\" name=\"H9Y\" type=\"hL\" />\n+ <Atom charge=\"-0.026418\" name=\"C310\" type=\"cD\" />\n+ <Atom charge=\"0.010825\" name=\"H10X\" type=\"hL\" />\n+ <Atom charge=\"0.010825\" name=\"H10Y\" type=\"hL\" />\n+ <Atom charge=\"-0.017093\" name=\"C311\" type=\"cD\" />\n+ <Atom charge=\"0.010206\" name=\"H11X\" type=\"hL\" />\n+ <Atom charge=\"0.010206\" name=\"H11Y\" type=\"hL\" />\n+ <Atom charge=\"-0.019153\" name=\"C312\" type=\"cD\" />\n+ <Atom charge=\"0.008198\" name=\"H12X\" type=\"hL\" />\n+ <Atom charge=\"0.008198\" name=\"H12Y\" type=\"hL\" />\n+ <Atom charge=\"-0.01159\" name=\"C313\" type=\"cD\" />\n+ <Atom charge=\"0.006022\" name=\"H13X\" type=\"hL\" />\n+ <Atom charge=\"0.006022\" name=\"H13Y\" type=\"hL\" />\n+ <Atom charge=\"-0.013489\" name=\"C314\" type=\"cD\" />\n+ <Atom charge=\"0.010073\" name=\"H14X\" type=\"hL\" />\n+ <Atom charge=\"0.010073\" name=\"H14Y\" type=\"hL\" />\n+ <Atom charge=\"-0.032444\" name=\"C315\" type=\"cD\" />\n+ <Atom charge=\"0.010253\" name=\"H15X\" type=\"hL\" />\n+ <Atom charge=\"0.010253\" name=\"H15Y\" type=\"hL\" />\n+ <Atom charge=\"-0.027654\" name=\"C316\" type=\"cD\" />\n+ <Atom charge=\"0.015627\" name=\"H16X\" type=\"hL\" />\n+ <Atom charge=\"0.015627\" name=\"H16Y\" type=\"hL\" />\n+ <Atom charge=\"0.020665\" name=\"C317\" type=\"cD\" />\n+ <Atom charge=\"0.008483\" name=\"H17X\" type=\"hL\" />\n+ <Atom charge=\"0.008483\" name=\"H17Y\" type=\"hL\" />\n+ <Atom charge=\"-0.120069\" name=\"C318\" type=\"cD\" />\n+ <Atom charge=\"0.027938\" name=\"H18X\" type=\"hL\" />\n+ <Atom charge=\"0.027938\" name=\"H18Y\" type=\"hL\" />\n+ <Atom charge=\"0.027938\" name=\"H18Z\" type=\"hL\" />\n+ <Bond atomName1=\"N\" atomName2=\"C13\" />\n+ <Bond atomName1=\"N\" atomName2=\"C14\" />\n+ <Bond atomName1=\"N\" atomName2=\"C15\" />\n+ <Bond atomName1=\"C13\" atomName2=\"H13A\" />\n+ <Bond atomName1=\"C13\" atomName2=\"H13B\" />\n+ <Bond atomName1=\"C13\" atomName2=\"H13C\" />\n+ <Bond atomName1=\"C14\" atomName2=\"H14A\" />\n+ <Bond atomName1=\"C14\" atomName2=\"H14B\" />\n+ <Bond atomName1=\"C14\" atomName2=\"H14C\" />\n+ <Bond atomName1=\"C15\" atomName2=\"H15A\" />\n+ <Bond atomName1=\"C15\" atomName2=\"H15B\" />\n+ <Bond atomName1=\"C15\" atomName2=\"H15C\" />\n+ <Bond atomName1=\"N\" atomName2=\"C12\" />\n+ <Bond atomName1=\"C12\" atomName2=\"H12A\" />\n+ <Bond atomName1=\"C12\" atomName2=\"H12B\" />\n+ <Bond atomName1=\"C12\" atomName2=\"C11\" />\n+ <Bond atomName1=\"C11\" atomName2=\"H11A\" />\n+ <Bond atomName1=\"C11\" atomName2=\"H11B\" />\n+ <Bond atomName1=\"C11\" atomName2=\"O12\" />\n+ <Bond atomName1=\"O12\" atomName2=\"P\" />\n+ <Bond atomName1=\"P\" atomName2=\"O11\" />\n+ <Bond atomName1=\"P\" atomName2=\"O13\" />\n+ <Bond atomName1=\"P\" atomName2=\"O14\" />\n+ <Bond atomName1=\"C1\" atomName2=\"HA\" />\n+ <Bond atomName1=\"C1\" atomName2=\"HB\" />\n+ <Bond atomName1=\"C1\" atomName2=\"C2\" />\n+ <Bond atomName1=\"C1\" atomName2=\"O11\" />\n+ <Bond atomName1=\"C2\" atomName2=\"HS\" />\n+ <Bond atomName1=\"C2\" atomName2=\"C3\" />\n+ <Bond atomName1=\"C2\" atomName2=\"O21\" />\n+ <Bond atomName1=\"C3\" atomName2=\"HX\" />\n+ <Bond atomName1=\"C3\" atomName2=\"HY\" />\n+ <Bond atomName1=\"C3\" atomName2=\"O31\" />\n+ <Bond atomName1=\"O21\" atomName2=\"C21\" />\n+ <Bond atomName1=\"C21\" atomName2=\"C22\" />\n+ <Bond atomName1=\"C21\" atomName2=\"O22\" />\n+ <Bond atomName1=\"C22\" atomName2=\"H2R\" />\n+ <Bond atomName1=\"C22\" atomName2=\"H2S\" />\n+ <Bond atomName1=\"C22\" atomName2=\"C23\" />\n+ <Bond atomName1=\"C23\" atomName2=\"H3R\" />\n+ <Bond atomName1=\"C23\" atomName2=\"H3S\" />\n+ <Bond atomName1=\"C23\" atomName2=\"C24\" />\n+ <Bond atomName1=\"C24\" atomName2=\"H4R\" />\n+ <Bond atomName1=\"C24\" atomName2=\"H4S\" />\n+ <Bond atomName1=\"C24\" atomName2=\"C25\" />\n+ <Bond atomName1=\"C25\" atomName2=\"H5R\" />\n+ <Bond atomName1=\"C25\" atomName2=\"H5S\" />\n+ <Bond atomName1=\"C25\" atomName2=\"C26\" />\n+ <Bond atomName1=\"C26\" atomName2=\"H6R\" />\n+ <Bond atomName1=\"C26\" atomName2=\"H6S\" />\n+ <Bond atomName1=\"C26\" atomName2=\"C27\" />\n+ <Bond atomName1=\"C27\" atomName2=\"H7R\" />\n+ <Bond atomName1=\"C27\" atomName2=\"H7S\" />\n+ <Bond atomName1=\"C27\" atomName2=\"C28\" />\n+ <Bond atomName1=\"C28\" atomName2=\"H8R\" />\n+ <Bond atomName1=\"C28\" atomName2=\"H8S\" />\n+ <Bond atomName1=\"C28\" atomName2=\"C29\" />\n+ <Bond atomName1=\"C29\" atomName2=\"H9R\" />\n+ <Bond atomName1=\"C29\" atomName2=\"H9S\" />\n+ <Bond atomName1=\"C29\" atomName2=\"C210\" />\n+ <Bond atomName1=\"C210\" atomName2=\"H10R\" />\n+ <Bond atomName1=\"C210\" atomName2=\"H10S\" />\n+ <Bond atomName1=\"C210\" atomName2=\"C211\" />\n+ <Bond atomName1=\"C211\" atomName2=\"H11R\" />\n+ <Bond atomName1=\"C211\" atomName2=\"H11S\" />\n+ <Bond atomName1=\"C211\" atomName2=\"C212\" />\n+ <Bond atomName1=\"C212\" atomName2=\"H12R\" />\n+ <Bond atomName1=\"C212\" atomName2=\"H12S\" />\n+ <Bond atomName1=\"C212\" atomName2=\"C213\" />\n+ <Bond atomName1=\"C213\" atomName2=\"H13R\" />\n+ <Bond atomName1=\"C213\" atomName2=\"H13S\" />\n+ <Bond atomName1=\"C213\" atomName2=\"C214\" />\n+ <Bond atomName1=\"C214\" atomName2=\"H14R\" />\n+ <Bond atomName1=\"C214\" atomName2=\"H14S\" />\n+ <Bond atomName1=\"C214\" atomName2=\"C215\" />\n+ <Bond atomName1=\"C215\" atomName2=\"H15R\" />\n+ <Bond atomName1=\"C215\" atomName2=\"H15S\" />\n+ <Bond atomName1=\"C215\" atomName2=\"C216\" />\n+ <Bond atomName1=\"C216\" atomName2=\"H16R\" />\n+ <Bond atomName1=\"C216\" atomName2=\"H16S\" />\n+ <Bond atomName1=\"C216\" atomName2=\"C217\" />\n+ <Bond atomName1=\"C217\" atomName2=\"H17R\" />\n+ <Bond atomName1=\"C217\" atomName2=\"H17S\" />\n+ <Bond atomName1=\"C217\" atomName2=\"C218\" />\n+ <Bond atomName1=\"C218\" atomName2=\"H18R\" />\n+ <Bond atomName1=\"C218\" atomName2=\"H18S\" />\n+ <Bond atomName1=\"C218\" atomName2=\"H18T\" />\n+ <Bond atomName1=\"O31\" atomName2=\"C31\" />\n+ <Bond atomName1=\"C31\" atomName2=\"C32\" />\n+ <Bond atomName1=\"C31\" atomName2=\"O32\" />\n+ <Bond atomName1=\"C32\" atomName2=\"H2X\" />\n+ <Bond atomName1=\"C32\" atomName2=\"H2Y\" />\n+ <Bond atomName1=\"C32\" atomName2=\"C33\" />\n+ <Bond atomName1=\"C33\" atomName2=\"H3X\" />\n+ <Bond atomName1=\"C33\" atomName2=\"H3Y\" />\n+ <Bond atomName1=\"C33\" atomName2=\"C34\" />\n+ <Bond atomName1=\"C34\" atomName2=\"H4X\" />\n+ <Bond atomName1=\"C34\" atomName2=\"H4Y\" />\n+ <Bond atomName1=\"C34\" atomName2=\"C35\" />\n+ <Bond atomName1=\"C35\" atomName2=\"H5X\" />\n+ <Bond atomName1=\"C35\" atomName2=\"H5Y\" />\n+ <Bond atomName1=\"C35\" atomName2=\"C36\" />\n+ <Bond atomName1=\"C36\" atomName2=\"H6X\" />\n+ <Bond atomName1=\"C36\" atomName2=\"H6Y\" />\n+ <Bond atomName1=\"C36\" atomName2=\"C37\" />\n+ <Bond atomName1=\"C37\" atomName2=\"H7X\" />\n+ <Bond atomName1=\"C37\" atomName2=\"H7Y\" />\n+ <Bond atomName1=\"C37\" atomName2=\"C38\" />\n+ <Bond atomName1=\"C38\" atomName2=\"H8X\" />\n+ <Bond atomName1=\"C38\" atomName2=\"H8Y\" />\n+ <Bond atomName1=\"C38\" atomName2=\"C39\" />\n+ <Bond atomName1=\"C39\" atomName2=\"H9X\" />\n+ <Bond atomName1=\"C39\" atomName2=\"H9Y\" />\n+ <Bond atomName1=\"C39\" atomName2=\"C310\" />\n+ <Bond atomName1=\"C310\" atomName2=\"H10X\" />\n+ <Bond atomName1=\"C310\" atomName2=\"H10Y\" />\n+ <Bond atomName1=\"C310\" atomName2=\"C311\" />\n+ <Bond atomName1=\"C311\" atomName2=\"H11X\" />\n+ <Bond atomName1=\"C311\" atomName2=\"H11Y\" />\n+ <Bond atomName1=\"C311\" atomName2=\"C312\" />\n+ <Bond atomName1=\"C312\" atomName2=\"H12X\" />\n+ <Bond atomName1=\"C312\" atomName2=\"H12Y\" />\n+ <Bond atomName1=\"C312\" atomName2=\"C313\" />\n+ <Bond atomName1=\"C313\" atomName2=\"H13X\" />\n+ <Bond atomName1=\"C313\" atomName2=\"H13Y\" />\n+ <Bond atomName1=\"C313\" atomName2=\"C314\" />\n+ <Bond atomName1=\"C314\" atomName2=\"H14X\" />\n+ <Bond atomName1=\"C314\" atomName2=\"H14Y\" />\n+ <Bond atomName1=\"C314\" atomName2=\"C315\" />\n+ <Bond atomName1=\"C315\" atomName2=\"H15X\" />\n+ <Bond atomName1=\"C315\" atomName2=\"H15Y\" />\n+ <Bond atomName1=\"C315\" atomName2=\"C316\" />\n+ <Bond atomName1=\"C316\" atomName2=\"H16X\" />\n+ <Bond atomName1=\"C316\" atomName2=\"H16Y\" />\n+ <Bond atomName1=\"C316\" atomName2=\"C317\" />\n+ <Bond atomName1=\"C317\" atomName2=\"H17X\" />\n+ <Bond atomName1=\"C317\" atomName2=\"H17Y\" />\n+ <Bond atomName1=\"C317\" atomName2=\"C318\" />\n+ <Bond atomName1=\"C318\" atomName2=\"H18X\" />\n+ <Bond atomName1=\"C318\" atomName2=\"H18Y\" />\n+ <Bond atomName1=\"C318\" atomName2=\"H18Z\" />\n+ </Residue>\n+ <Residue name=\"DSPE\">\n+ <Atom charge=\"-0.368132\" name=\"N\" type=\"nA\" />\n+ <Atom charge=\"0.348549\" name=\"HN1\" type=\"hN\" />\n+ <Atom charge=\"0.348549\" name=\"HN2\" type=\"hN\" />\n+ <Atom charge=\"0.348549\" name=\"HN3\" type=\"hN\" />\n+ <Atom charge=\"0.077319\" name=\"C12\" type=\"cA\" />\n+ <Atom charge=\"0.09163\" name=\"H12A\" type=\"hX\" />\n+ <Atom charge=\"0.09163\" name=\"H12B\" type=\"hX\" />\n+ <Atom charge=\"0.075159\" name=\"C11\" type=\"cA\" />\n+ <Atom charge=\"0.091516\" name=\"H11A\" type=\"hE\" />\n+ <Atom charge=\"0.091516\" name=\"H11B\" type=\"hE\" />\n+ <Atom charge=\"1.373656\" name=\"P\" type=\"pA\" />\n+ <Atom charge=\"-0.877447\" name=\"O13\" type=\"oP\" />\n+ <Atom charge=\"-0.877447\" name=\"O14\" type=\"oP\" />\n+ <Atom charge=\"-0.546623\" name=\"O11\" type=\"oT\" />\n+ <Atom charge=\"-0.514542\" name=\"O12\" type=\"oT\" />\n+ <Atom charge=\"0.040967\" name=\"C1\" type=\"cA\" />\n+ <Atom charge=\"0.090994\" name=\"HA\" type=\"hE\" />\n+ <Atom charge=\"0.090994\" name=\"HB\" type=\"hE\" />\n+ <Atom charge=\"0.339004\" name=\"C2\" type=\"cA\" />\n+ <Atom charge=\"0.032843\" name=\"HS\" type=\"hE\" />\n+ <Atom charge=\"-0.57548\" name=\"O21\" type=\"oS\" />\n+ <Atom charge=\"0.86934\" name=\"C21\" type=\"cC\" />\n+ <Atom charge=\"-0.649199\" name=\"O22\" type=\"oC\" />\n+ <Atom charge=\"-0.11702\" name=\"C22\" type=\"cD\" />\n+ <Atom charge=\"0.051807\" name=\"H2R\" type=\"hL\" />\n+ <Atom charge=\"0.051807\" name=\"H2S\" type=\"hL\" />\n+ <Atom charge=\"0.273776\" name=\"C3\" type=\"cA\" />\n+ <Atom charge=\"0.044574\" name=\"HX\" type=\"hE\" />\n+ <Atom charge=\"0.044574\" name=\"HY\" type=\"hE\" />\n+ <Atom charge=\"-0.593826\" name=\"O31\" type=\"oS\" />\n+ <Atom charge=\"0.888359\" name=\"C31\" type=\"cC\" />\n+ <Atom charge=\"-0.650802\" name=\"O32\" type=\"oC\" />\n+ <Atom charge=\"-0.11702\" name=\"C32\" type=\"cD\" />\n+ <Atom charge=\"0.051807\" name=\"H2X\" type=\"hL\" />\n+ <Atom charge=\"0.051807\" name=\"H2Y\" type=\"hL\" />\n+ <Atom charge=\"-0.000128\" name=\"C23\" type=\"cD\" />\n+ <Atom charge=\"0.013886\" name=\"H3R\" type=\"hL\" />\n+ <Atom charge=\"0.013886\" name=\"H3S\" type=\"hL\" />\n+ <Atom charge=\"-0.059792\" name=\"C24\" type=\"cD\" />\n+ <Atom charge=\"0.024241\" name=\"H4R\" type=\"hL\" />\n+ <Atom charge=\"0.024241\" name=\"H4S\" type=\"hL\" />\n+ <Atom charge=\"-0.013443\" name=\"C25\" type=\"cD\" />\n+ <Atom charge=\"0.008191\" name=\"H5R\" type=\"hL\" />\n+ <Atom charge=\"0.008191\" name=\"H5S\" type=\"hL\" />\n+ <Atom charge=\"-0.037627\" name=\"C26\" type=\"cD\" />\n+ <Atom charge=\"0.01774\" name=\"H6R\" type=\"hL\" />\n+ <Atom charge=\"0.01774\" name=\"H6S\" type=\"hL\" />\n+ <Atom charge=\"-0.019469\" name=\"C27\" type=\"cD\" />\n+ <Atom charge=\"0.009292\" name=\"H7R\" type=\"hL\" />\n+ <Atom charge=\"0.009292\" name=\"H7S\" type=\"hL\" />\n+ <Atom charge=\"-0.014623\" name=\"C28\" type=\"cD\" />\n+ <Atom charge=\"0.007326\" name=\"H8R\" type=\"hL\" />\n+ <Atom charge=\"0.007326\" name=\"H8S\" type=\"hL\" />\n+ <Atom charge=\"-0.017997\" name=\"C29\" type=\"cD\" />\n+ <Atom charge=\"0.009595\" name=\"H9R\" type=\"hL\" />\n+ <Atom charge=\"0.009595\" name=\"H9S\" type=\"hL\" />\n+ <Atom charge=\"-0.026418\" name=\"C210\" type=\"cD\" />\n+ <Atom charge=\"0.010825\" name=\"H10R\" type=\"hL\" />\n+ <Atom charge=\"0.010825\" name=\"H10S\" type=\"hL\" />\n+ <Atom charge=\"-0.017093\" name=\"C211\" type=\"cD\" />\n+ <Atom charge=\"0.010206\" name=\"H11R\" type=\"hL\" />\n+ <Atom charge=\"0.010206\" name=\"H11S\" type=\"hL\" />\n+ <Atom charge=\"-0.019153\" name=\"C212\" type=\"cD\" />\n+ <Atom charge=\"0.008198\" name=\"H12R\" type=\"hL\" />\n+ <Atom charge=\"0.008198\" name=\"H12S\" type=\"hL\" />\n+ <Atom charge=\"-0.01159\" name=\"C213\" type=\"cD\" />\n+ <Atom charge=\"0.006022\" name=\"H13R\" type=\"hL\" />\n+ <Atom charge=\"0.006022\" name=\"H13S\" type=\"hL\" />\n+ <Atom charge=\"-0.013489\" name=\"C214\" type=\"cD\" />\n+ <Atom charge=\"0.010073\" name=\"H14R\" type=\"hL\" />\n+ <Atom charge=\"0.010073\" name=\"H14S\" type=\"hL\" />\n+ <Atom charge=\"-0.032444\" name=\"C215\" type=\"cD\" />\n+ <Atom charge=\"0.010253\" name=\"H15R\" type=\"hL\" />\n+ <Atom charge=\"0.010253\" name=\"H15S\" type=\"hL\" />\n+ <Atom charge=\"-0.027654\" name=\"C216\" type=\"cD\" />\n+ <Atom charge=\"0.015627\" name=\"H16R\" type=\"hL\" />\n+ <Atom charge=\"0.015627\" name=\"H16S\" type=\"hL\" />\n+ <Atom charge=\"0.020665\" name=\"C217\" type=\"cD\" />\n+ <Atom charge=\"0.008483\" name=\"H17R\" type=\"hL\" />\n+ <Atom charge=\"0.008483\" name=\"H17S\" type=\"hL\" />\n+ <Atom charge=\"-0.120069\" name=\"C218\" type=\"cD\" />\n+ <Atom charge=\"0.027938\" name=\"H18R\" type=\"hL\" />\n+ <Atom charge=\"0.027938\" name=\"H18S\" type=\"hL\" />\n+ <Atom charge=\"0.027938\" name=\"H18T\" type=\"hL\" />\n+ <Atom charge=\"-0.000128\" name=\"C33\" type=\"cD\" />\n+ <Atom charge=\"0.013886\" name=\"H3X\" type=\"hL\" />\n+ <Atom charge=\"0.013886\" name=\"H3Y\" type=\"hL\" />\n+ <Atom charge=\"-0.059792\" name=\"C34\" type=\"cD\" />\n+ <Atom charge=\"0.024241\" name=\"H4X\" type=\"hL\" />\n+ <Atom charge=\"0.024241\" name=\"H4Y\" type=\"hL\" />\n+ <Atom charge=\"-0.013443\" name=\"C35\" type=\"cD\" />\n+ <Atom charge=\"0.008191\" name=\"H5X\" type=\"hL\" />\n+ <Atom charge=\"0.008191\" name=\"H5Y\" type=\"hL\" />\n+ <Atom charge=\"-0.037627\" name=\"C36\" type=\"cD\" />\n+ <Atom charge=\"0.01774\" name=\"H6X\" type=\"hL\" />\n+ <Atom charge=\"0.01774\" name=\"H6Y\" type=\"hL\" />\n+ <Atom charge=\"-0.019469\" name=\"C37\" type=\"cD\" />\n+ <Atom charge=\"0.009292\" name=\"H7X\" type=\"hL\" />\n+ <Atom charge=\"0.009292\" name=\"H7Y\" type=\"hL\" />\n+ <Atom charge=\"-0.014623\" name=\"C38\" type=\"cD\" />\n+ <Atom charge=\"0.007326\" name=\"H8X\" type=\"hL\" />\n+ <Atom charge=\"0.007326\" name=\"H8Y\" type=\"hL\" />\n+ <Atom charge=\"-0.017997\" name=\"C39\" type=\"cD\" />\n+ <Atom charge=\"0.009595\" name=\"H9X\" type=\"hL\" />\n+ <Atom charge=\"0.009595\" name=\"H9Y\" type=\"hL\" />\n+ <Atom charge=\"-0.026418\" name=\"C310\" type=\"cD\" />\n+ <Atom charge=\"0.010825\" name=\"H10X\" type=\"hL\" />\n+ <Atom charge=\"0.010825\" name=\"H10Y\" type=\"hL\" />\n+ <Atom charge=\"-0.017093\" name=\"C311\" type=\"cD\" />\n+ <Atom charge=\"0.010206\" name=\"H11X\" type=\"hL\" />\n+ <Atom charge=\"0.010206\" name=\"H11Y\" type=\"hL\" />\n+ <Atom charge=\"-0.019153\" name=\"C312\" type=\"cD\" />\n+ <Atom charge=\"0.008198\" name=\"H12X\" type=\"hL\" />\n+ <Atom charge=\"0.008198\" name=\"H12Y\" type=\"hL\" />\n+ <Atom charge=\"-0.01159\" name=\"C313\" type=\"cD\" />\n+ <Atom charge=\"0.006022\" name=\"H13X\" type=\"hL\" />\n+ <Atom charge=\"0.006022\" name=\"H13Y\" type=\"hL\" />\n+ <Atom charge=\"-0.013489\" name=\"C314\" type=\"cD\" />\n+ <Atom charge=\"0.010073\" name=\"H14X\" type=\"hL\" />\n+ <Atom charge=\"0.010073\" name=\"H14Y\" type=\"hL\" />\n+ <Atom charge=\"-0.032444\" name=\"C315\" type=\"cD\" />\n+ <Atom charge=\"0.010253\" name=\"H15X\" type=\"hL\" />\n+ <Atom charge=\"0.010253\" name=\"H15Y\" type=\"hL\" />\n+ <Atom charge=\"-0.027654\" name=\"C316\" type=\"cD\" />\n+ <Atom charge=\"0.015627\" name=\"H16X\" type=\"hL\" />\n+ <Atom charge=\"0.015627\" name=\"H16Y\" type=\"hL\" />\n+ <Atom charge=\"0.020665\" name=\"C317\" type=\"cD\" />\n+ <Atom charge=\"0.008483\" name=\"H17X\" type=\"hL\" />\n+ <Atom charge=\"0.008483\" name=\"H17Y\" type=\"hL\" />\n+ <Atom charge=\"-0.120069\" name=\"C318\" type=\"cD\" />\n+ <Atom charge=\"0.027938\" name=\"H18X\" type=\"hL\" />\n+ <Atom charge=\"0.027938\" name=\"H18Y\" type=\"hL\" />\n+ <Atom charge=\"0.027938\" name=\"H18Z\" type=\"hL\" />\n+ <Bond atomName1=\"N\" atomName2=\"HN1\" />\n+ <Bond atomName1=\"N\" atomName2=\"HN2\" />\n+ <Bond atomName1=\"N\" atomName2=\"HN3\" />\n+ <Bond atomName1=\"N\" atomName2=\"C12\" />\n+ <Bond atomName1=\"C12\" atomName2=\"H12A\" />\n+ <Bond atomName1=\"C12\" atomName2=\"H12B\" />\n+ <Bond atomName1=\"C12\" atomName2=\"C11\" />\n+ <Bond atomName1=\"C11\" atomName2=\"H11A\" />\n+ <Bond atomName1=\"C11\" atomName2=\"H11B\" />\n+ <Bond atomName1=\"C11\" atomName2=\"O12\" />\n+ <Bond atomName1=\"O12\" atomName2=\"P\" />\n+ <Bond atomName1=\"P\" atomName2=\"O11\" />\n+ <Bond atomName1=\"P\" atomName2=\"O13\" />\n+ <Bond atomName1=\"P\" atomName2=\"O14\" />\n+ <Bond atomName1=\"C1\" atomName2=\"HA\" />\n+ <Bond atomName1=\"C1\" atomName2=\"HB\" />\n+ <Bond atomName1=\"C1\" atomName2=\"C2\" />\n+ <Bond atomName1=\"C1\" atomName2=\"O11\" />\n+ <Bond atomName1=\"C2\" atomName2=\"HS\" />\n+ <Bond atomName1=\"C2\" atomName2=\"C3\" />\n+ <Bond atomName1=\"C2\" atomName2=\"O21\" />\n+ <Bond atomName1=\"C3\" atomName2=\"HX\" />\n+ <Bond atomName1=\"C3\" atomName2=\"HY\" />\n+ <Bond atomName1=\"C3\" atomName2=\"O31\" />\n+ <Bond atomName1=\"O21\" atomName2=\"C21\" />\n+ <Bond atomName1=\"C21\" atomName2=\"C22\" />\n+ <Bond atomName1=\"C21\" atomName2=\"O22\" />\n+ <Bond atomName1=\"C22\" atomName2=\"H2R\" />\n+ <Bond atomName1=\"C22\" atomName2=\"H2S\" />\n+ <Bond atomName1=\"C22\" atomName2=\"C23\" />\n+ <Bond atomName1=\"C23\" atomName2=\"H3R\" />\n+ <Bond atomName1=\"C23\" atomName2=\"H3S\" />\n+ <Bond atomName1=\"C23\" atomName2=\"C24\" />\n+ <Bond atomName1=\"C24\" atomName2=\"H4R\" />\n+ <Bond atomName1=\"C24\" atomName2=\"H4S\" />\n+ <Bond atomName1=\"C24\" atomName2=\"C25\" />\n+ <Bond atomName1=\"C25\" atomName2=\"H5R\" />\n+ <Bond atomName1=\"C25\" atomName2=\"H5S\" />\n+ <Bond atomName1=\"C25\" atomName2=\"C26\" />\n+ <Bond atomName1=\"C26\" atomName2=\"H6R\" />\n+ <Bond atomName1=\"C26\" atomName2=\"H6S\" />\n+ <Bond atomName1=\"C26\" atomName2=\"C27\" />\n+ <Bond atomName1=\"C27\" atomName2=\"H7R\" />\n+ <Bond atomName1=\"C27\" atomName2=\"H7S\" />\n+ <Bond atomName1=\"C27\" atomName2=\"C28\" />\n+ <Bond atomName1=\"C28\" atomName2=\"H8R\" />\n+ <Bond atomName1=\"C28\" atomName2=\"H8S\" />\n+ <Bond atomName1=\"C28\" atomName2=\"C29\" />\n+ <Bond atomName1=\"C29\" atomName2=\"H9R\" />\n+ <Bond atomName1=\"C29\" atomName2=\"H9S\" />\n+ <Bond atomName1=\"C29\" atomName2=\"C210\" />\n+ <Bond atomName1=\"C210\" atomName2=\"H10R\" />\n+ <Bond atomName1=\"C210\" atomName2=\"H10S\" />\n+ <Bond atomName1=\"C210\" atomName2=\"C211\" />\n+ <Bond atomName1=\"C211\" atomName2=\"H11R\" />\n+ <Bond atomName1=\"C211\" atomName2=\"H11S\" />\n+ <Bond atomName1=\"C211\" atomName2=\"C212\" />\n+ <Bond atomName1=\"C212\" atomName2=\"H12R\" />\n+ <Bond atomName1=\"C212\" atomName2=\"H12S\" />\n+ <Bond atomName1=\"C212\" atomName2=\"C213\" />\n+ <Bond atomName1=\"C213\" atomName2=\"H13R\" />\n+ <Bond atomName1=\"C213\" atomName2=\"H13S\" />\n+ <Bond atomName1=\"C213\" atomName2=\"C214\" />\n+ <Bond atomName1=\"C214\" atomName2=\"H14R\" />\n+ <Bond atomName1=\"C214\" atomName2=\"H14S\" />\n+ <Bond atomName1=\"C214\" atomName2=\"C215\" />\n+ <Bond atomName1=\"C215\" atomName2=\"H15R\" />\n+ <Bond atomName1=\"C215\" atomName2=\"H15S\" />\n+ <Bond atomName1=\"C215\" atomName2=\"C216\" />\n+ <Bond atomName1=\"C216\" atomName2=\"H16R\" />\n+ <Bond atomName1=\"C216\" atomName2=\"H16S\" />\n+ <Bond atomName1=\"C216\" atomName2=\"C217\" />\n+ <Bond atomName1=\"C217\" atomName2=\"H17R\" />\n+ <Bond atomName1=\"C217\" atomName2=\"H17S\" />\n+ <Bond atomName1=\"C217\" atomName2=\"C218\" />\n+ <Bond atomName1=\"C218\" atomName2=\"H18R\" />\n+ <Bond atomName1=\"C218\" atomName2=\"H18S\" />\n+ <Bond atomName1=\"C218\" atomName2=\"H18T\" />\n+ <Bond atomName1=\"O31\" atomName2=\"C31\" />\n+ <Bond atomName1=\"C31\" atomName2=\"C32\" />\n+ <Bond atomName1=\"C31\" atomName2=\"O32\" />\n+ <Bond atomName1=\"C32\" atomName2=\"H2X\" />\n+ <Bond atomName1=\"C32\" atomName2=\"H2Y\" />\n+ <Bond atomName1=\"C32\" atomName2=\"C33\" />\n+ <Bond atomName1=\"C33\" atomName2=\"H3X\" />\n+ <Bond atomName1=\"C33\" atomName2=\"H3Y\" />\n+ <Bond atomName1=\"C33\" atomName2=\"C34\" />\n+ <Bond atomName1=\"C34\" atomName2=\"H4X\" />\n+ <Bond atomName1=\"C34\" atomName2=\"H4Y\" />\n+ <Bond atomName1=\"C34\" atomName2=\"C35\" />\n+ <Bond atomName1=\"C35\" atomName2=\"H5X\" />\n+ <Bond atomName1=\"C35\" atomName2=\"H5Y\" />\n+ <Bond atomName1=\"C35\" atomName2=\"C36\" />\n+ <Bond atomName1=\"C36\" atomName2=\"H6X\" />\n+ <Bond atomName1=\"C36\" atomName2=\"H6Y\" />\n+ <Bond atomName1=\"C36\" atomName2=\"C37\" />\n+ <Bond atomName1=\"C37\" atomName2=\"H7X\" />\n+ <Bond atomName1=\"C37\" atomName2=\"H7Y\" />\n+ <Bond atomName1=\"C37\" atomName2=\"C38\" />\n+ <Bond atomName1=\"C38\" atomName2=\"H8X\" />\n+ <Bond atomName1=\"C38\" atomName2=\"H8Y\" />\n+ <Bond atomName1=\"C38\" atomName2=\"C39\" />\n+ <Bond atomName1=\"C39\" atomName2=\"H9X\" />\n+ <Bond atomName1=\"C39\" atomName2=\"H9Y\" />\n+ <Bond atomName1=\"C39\" atomName2=\"C310\" />\n+ <Bond atomName1=\"C310\" atomName2=\"H10X\" />\n+ <Bond atomName1=\"C310\" atomName2=\"H10Y\" />\n+ <Bond atomName1=\"C310\" atomName2=\"C311\" />\n+ <Bond atomName1=\"C311\" atomName2=\"H11X\" />\n+ <Bond atomName1=\"C311\" atomName2=\"H11Y\" />\n+ <Bond atomName1=\"C311\" atomName2=\"C312\" />\n+ <Bond atomName1=\"C312\" atomName2=\"H12X\" />\n+ <Bond atomName1=\"C312\" atomName2=\"H12Y\" />\n+ <Bond atomName1=\"C312\" atomName2=\"C313\" />\n+ <Bond atomName1=\"C313\" atomName2=\"H13X\" />\n+ <Bond atomName1=\"C313\" atomName2=\"H13Y\" />\n+ <Bond atomName1=\"C313\" atomName2=\"C314\" />\n+ <Bond atomName1=\"C314\" atomName2=\"H14X\" />\n+ <Bond atomName1=\"C314\" atomName2=\"H14Y\" />\n+ <Bond atomName1=\"C314\" atomName2=\"C315\" />\n+ <Bond atomName1=\"C315\" atomName2=\"H15X\" />\n+ <Bond atomName1=\"C315\" atomName2=\"H15Y\" />\n+ <Bond atomName1=\"C315\" atomName2=\"C316\" />\n+ <Bond atomName1=\"C316\" atomName2=\"H16X\" />\n+ <Bond atomName1=\"C316\" atomName2=\"H16Y\" />\n+ <Bond atomName1=\"C316\" atomName2=\"C317\" />\n+ <Bond atomName1=\"C317\" atomName2=\"H17X\" />\n+ <Bond atomName1=\"C317\" atomName2=\"H17Y\" />\n+ <Bond atomName1=\"C317\" atomName2=\"C318\" />\n+ <Bond atomName1=\"C318\" atomName2=\"H18X\" />\n+ <Bond atomName1=\"C318\" atomName2=\"H18Y\" />\n+ <Bond atomName1=\"C318\" atomName2=\"H18Z\" />\n+ </Residue>\n+ <Residue name=\"DSPS\">\n+ <Atom charge=\"-0.414327\" name=\"N\" type=\"nA\" />\n+ <Atom charge=\"0.353866\" name=\"HN1\" type=\"hN\" />\n+ <Atom charge=\"0.353866\" name=\"HN2\" type=\"hN\" />\n+ <Atom charge=\"0.353866\" name=\"HN3\" type=\"hN\" />\n+ <Atom charge=\"0.039448\" name=\"C12\" type=\"cA\" />\n+ <Atom charge=\"0.090549\" name=\"H12A\" type=\"hX\" />\n+ <Atom charge=\"0.809867\" name=\"C13\" type=\"cC\" />\n+ <Atom charge=\"-0.815178\" name=\"O13A\" type=\"oO\" />\n+ <Atom charge=\"-0.815178\" name=\"O13B\" type=\"oO\" />\n+ <Atom charge=\"0.060375\" name=\"C11\" type=\"cA\" />\n+ <Atom charge=\"0.093484\" name=\"H11A\" type=\"hE\" />\n+ <Atom charge=\"0.093484\" name=\"H11B\" type=\"hE\" />\n+ <Atom charge=\"1.380208\" name=\"P\" type=\"pA\" />\n+ <Atom charge=\"-0.877922\" name=\"O13\" type=\"oP\" />\n+ <Atom charge=\"-0.877922\" name=\"O14\" type=\"oP\" />\n+ <Atom charge=\"-0.520128\" name=\"O12\" type=\"oT\" />\n+ <Atom charge=\"-0.556992\" name=\"O11\" type=\"oT\" />\n+ <Atom charge=\"0.012366\" name=\"C1\" type=\"cA\" />\n+ <Atom charge=\"0.097347\" name=\"HA\" type=\"hE\" />\n+ <Atom charge=\"0.097347\" name=\"HB\" type=\"hE\" />\n+ <Atom charge=\"0.44065\" name=\"C2\" type=\"cA\" />\n+ <Atom charge=\"0.002473\" name=\"HS\" type=\"hE\" />\n+ <Atom charge=\"-0.634381\" name=\"O21\" type=\"oS\" />\n+ <Atom charge=\"0.891897\" name=\"C21\" type=\"cC\" />\n+ <Atom charge=\"-0.650291\" name=\"O22\" type=\"oC\" />\n+ <Atom charge=\"-0.11702\" name=\"C22\" type=\"cD\" />\n+ <Atom charge=\"0.051807\" name=\"H2R\" type=\"hL\" />\n+ <Atom charge=\"0.051807\" name=\"H2S\" type=\"hL\" />\n+ <Atom charge=\"0.271173\" name=\"C3\" type=\"cA\" />\n+ <Atom charge=\"0.037454\" name=\"HX\" type=\"hE\" />\n+ <Atom charge=\"0.037454\" name=\"HY\" type=\"hE\" />\n+ <Atom charge=\"-0.579073\" name=\"O31\" type=\"oS\" />\n+ <Atom charge=\"0.887549\" name=\"C31\" type=\"cC\" />\n+ <Atom charge=\"-0.663331\" name=\"O32\" type=\"oC\" />\n+ <Atom charge=\"-0.11702\" name=\"C32\" type=\"cD\" />\n+ <Atom charge=\"0.051807\" name=\"H2X\" type=\"hL\" />\n+ <Atom charge=\"0.051807\" name=\"H2Y\" type=\"hL\" />\n+ <Atom charge=\"-0.000128\" name=\"C23\" type=\"cD\" />\n+ <Atom charge=\"0.013886\" name=\"H3R\" type=\"hL\" />\n+ <Atom charge=\"0.013886\" name=\"H3S\" type=\"hL\" />\n+ <Atom charge=\"-0.059792\" name=\"C24\" type=\"cD\" />\n+ <Atom charge=\"0.024241\" name=\"H4R\" type=\"hL\" />\n+ <Atom charge=\"0.024241\" name=\"H4S\" type=\"hL\" />\n+ <Atom charge=\"-0.013443\" name=\"C25\" type=\"cD\" />\n+ <Atom charge=\"0.008191\" name=\"H5R\" type=\"hL\" />\n+ <Atom charge=\"0.008191\" name=\"H5S\" type=\"hL\" />\n+ <Atom charge=\"-0.037627\" name=\"C26\" type=\"cD\" />\n+ <Atom charge=\"0.01774\" name=\"H6R\" type=\"hL\" />\n+ <Atom charge=\"0.01774\" name=\"H6S\" type=\"hL\" />\n+ <Atom charge=\"-0.019469\" name=\"C27\" type=\"cD\" />\n+ <Atom charge=\"0.009292\" name=\"H7R\" type=\"hL\" />\n+ <Atom charge=\"0.009292\" name=\"H7S\" type=\"hL\" />\n+ <Atom charge=\"-0.014623\" name=\"C28\" type=\"cD\" />\n+ <Atom charge=\"0.007326\" name=\"H8R\" type=\"hL\" />\n+ <Atom charge=\"0.007326\" name=\"H8S\" type=\"hL\" />\n+ <Atom charge=\"-0.017997\" name=\"C29\" type=\"cD\" />\n+ <Atom charge=\"0.009595\" name=\"H9R\" type=\"hL\" />\n+ <Atom charge=\"0.009595\" name=\"H9S\" type=\"hL\" />\n+ <Atom charge=\"-0.026418\" name=\"C210\" type=\"cD\" />\n+ <Atom charge=\"0.010825\" name=\"H10R\" type=\"hL\" />\n+ <Atom charge=\"0.010825\" name=\"H10S\" type=\"hL\" />\n+ <Atom charge=\"-0.017093\" name=\"C211\" type=\"cD\" />\n+ <Atom charge=\"0.010206\" name=\"H11R\" type=\"hL\" />\n+ <Atom charge=\"0.010206\" name=\"H11S\" type=\"hL\" />\n+ <Atom charge=\"-0.019153\" name=\"C212\" type=\"cD\" />\n+ <Atom charge=\"0.008198\" name=\"H12R\" type=\"hL\" />\n+ <Atom charge=\"0.008198\" name=\"H12S\" type=\"hL\" />\n+ <Atom charge=\"-0.01159\" name=\"C213\" type=\"cD\" />\n+ <Atom charge=\"0.006022\" name=\"H13R\" type=\"hL\" />\n+ <Atom charge=\"0.006022\" name=\"H13S\" type=\"hL\" />\n+ <Atom charge=\"-0.013489\" name=\"C214\" type=\"cD\" />\n+ <Atom charge=\"0.010073\" name=\"H14R\" type=\"hL\" />\n+ <Atom charge=\"0.010073\" name=\"H14S\" type=\"hL\" />\n+ <Atom charge=\"-0.032444\" name=\"C215\" type=\"cD\" />\n+ <Atom charge=\"0.010253\" name=\"H15R\" type=\"hL\" />\n+ <Atom charge=\"0.010253\" name=\"H15S\" type=\"hL\" />\n+ <Atom charge=\"-0.027654\" name=\"C216\" type=\"cD\" />\n+ <Atom charge=\"0.015627\" name=\"H16R\" type=\"hL\" />\n+ <Atom charge=\"0.015627\" name=\"H16S\" type=\"hL\" />\n+ <Atom charge=\"0.020665\" name=\"C217\" type=\"cD\" />\n+ <Atom charge=\"0.008483\" name=\"H17R\" type=\"hL\" />\n+ <Atom charge=\"0.008483\" name=\"H17S\" type=\"hL\" />\n+ <Atom charge=\"-0.120069\" name=\"C218\" type=\"cD\" />\n+ <Atom charge=\"0.027938\" name=\"H18R\" type=\"hL\" />\n+ <Atom charge=\"0.027938\" name=\"H18S\" type=\"hL\" />\n+ <Atom charge=\"0.027938\" name=\"H18T\" type=\"hL\" />\n+ <Atom charge=\"-0.000128\" name=\"C33\" type=\"cD\" />\n+ <Atom charge=\"0.013886\" name=\"H3X\" type=\"hL\" />\n+ <Atom charge=\"0.013886\" name=\"H3Y\" type=\"hL\" />\n+ <Atom charge=\"-0.059792\" name=\"C34\" type=\"cD\" />\n+ <Atom charge=\"0.024241\" name=\"H4X\" type=\"hL\" />\n+ <Atom charge=\"0.024241\" name=\"H4Y\" type=\"hL\" />\n+ <Atom charge=\"-0.013443\" name=\"C35\" type=\"cD\" />\n+ <Atom charge=\"0.008191\" name=\"H5X\" type=\"hL\" />\n+ <Atom charge=\"0.008191\" name=\"H5Y\" type=\"hL\" />\n+ <Atom charge=\"-0.037627\" name=\"C36\" type=\"cD\" />\n+ <Atom charge=\"0.01774\" name=\"H6X\" type=\"hL\" />\n+ <Atom charge=\"0.01774\" name=\"H6Y\" type=\"hL\" />\n+ <Atom charge=\"-0.019469\" name=\"C37\" type=\"cD\" />\n+ <Atom charge=\"0.009292\" name=\"H7X\" type=\"hL\" />\n+ <Atom charge=\"0.009292\" name=\"H7Y\" type=\"hL\" />\n+ <Atom charge=\"-0.014623\" name=\"C38\" type=\"cD\" />\n+ <Atom charge=\"0.007326\" name=\"H8X\" type=\"hL\" />\n+ <Atom charge=\"0.007326\" name=\"H8Y\" type=\"hL\" />\n+ <Atom charge=\"-0.017997\" name=\"C39\" type=\"cD\" />\n+ <Atom charge=\"0.009595\" name=\"H9X\" type=\"hL\" />\n+ <Atom charge=\"0.009595\" name=\"H9Y\" type=\"hL\" />\n+ <Atom charge=\"-0.026418\" name=\"C310\" type=\"cD\" />\n+ <Atom charge=\"0.010825\" name=\"H10X\" type=\"hL\" />\n+ <Atom charge=\"0.010825\" name=\"H10Y\" type=\"hL\" />\n+ <Atom charge=\"-0.017093\" name=\"C311\" type=\"cD\" />\n+ <Atom charge=\"0.010206\" name=\"H11X\" type=\"hL\" />\n+ <Atom charge=\"0.010206\" name=\"H11Y\" type=\"hL\" />\n+ <Atom charge=\"-0.019153\" name=\"C312\" type=\"cD\" />\n+ <Atom charge=\"0.008198\" name=\"H12X\" type=\"hL\" />\n+ <Atom charge=\"0.008198\" name=\"H12Y\" type=\"hL\" />\n+ <Atom charge=\"-0.01159\" name=\"C313\" type=\"cD\" />\n+ <Atom charge=\"0.006022\" name=\"H13X\" type=\"hL\" />\n+ <Atom charge=\"0.006022\" name=\"H13Y\" type=\"hL\" />\n+ <Atom charge=\"-0.013489\" name=\"C314\" type=\"cD\" />\n+ <Atom charge=\"0.010073\" name=\"H14X\" type=\"hL\" />\n+ <Atom charge=\"0.010073\" name=\"H14Y\" type=\"hL\" />\n+ <Atom charge=\"-0.032444\" name=\"C315\" type=\"cD\" />\n+ <Atom charge=\"0.010253\" name=\"H15X\" type=\"hL\" />\n+ <Atom charge=\"0.010253\" name=\"H15Y\" type=\"hL\" />\n+ <Atom charge=\"-0.027654\" name=\"C316\" type=\"cD\" />\n+ <Atom charge=\"0.015627\" name=\"H16X\" type=\"hL\" />\n+ <Atom charge=\"0.015627\" name=\"H16Y\" type=\"hL\" />\n+ <Atom charge=\"0.020665\" name=\"C317\" type=\"cD\" />\n+ <Atom charge=\"0.008483\" name=\"H17X\" type=\"hL\" />\n+ <Atom charge=\"0.008483\" name=\"H17Y\" type=\"hL\" />\n+ <Atom charge=\"-0.120069\" name=\"C318\" type=\"cD\" />\n+ <Atom charge=\"0.027938\" name=\"H18X\" type=\"hL\" />\n+ <Atom charge=\"0.027938\" name=\"H18Y\" type=\"hL\" />\n+ <Atom charge=\"0.027938\" name=\"H18Z\" type=\"hL\" />\n+ <Bond atomName1=\"N\" atomName2=\"HN1\" />\n+ <Bond atomName1=\"N\" atomName2=\"HN2\" />\n+ <Bond atomName1=\"N\" atomName2=\"HN3\" />\n+ <Bond atomName1=\"N\" atomName2=\"C12\" />\n+ <Bond atomName1=\"O13B\" atomName2=\"C13\" />\n+ <Bond atomName1=\"C13\" atomName2=\"C12\" />\n+ <Bond atomName1=\"C13\" atomName2=\"O13A\" />\n+ <Bond atomName1=\"C12\" atomName2=\"H12A\" />\n+ <Bond atomName1=\"C12\" atomName2=\"C11\" />\n+ <Bond atomName1=\"C1\" atomName2=\"O11\" />\n+ <Bond atomName1=\"C11\" atomName2=\"H11A\" />\n+ <Bond atomName1=\"C11\" atomName2=\"H11B\" />\n+ <Bond atomName1=\"C11\" atomName2=\"O12\" />\n+ <Bond atomName1=\"O12\" atomName2=\"P\" />\n+ <Bond atomName1=\"P\" atomName2=\"O11\" />\n+ <Bond atomName1=\"P\" atomName2=\"O13\" />\n+ <Bond atomName1=\"P\" atomName2=\"O14\" />\n+ <Bond atomName1=\"C1\" atomName2=\"HA\" />\n+ <Bond atomName1=\"C1\" atomName2=\"HB\" />\n+ <Bond atomName1=\"C1\" atomName2=\"C2\" />\n+ <Bond atomName1=\"C2\" atomName2=\"HS\" />\n+ <Bond atomName1=\"C2\" atomName2=\"C3\" />\n+ <Bond atomName1=\"C2\" atomName2=\"O21\" />\n+ <Bond atomName1=\"C3\" atomName2=\"HX\" />\n+ <Bond atomName1=\"C3\" atomName2=\"HY\" />\n+ <Bond atomName1=\"C3\" atomName2=\"O31\" />\n+ <Bond atomName1=\"O21\" atomName2=\"C21\" />\n+ <Bond atomName1=\"C21\" atomName2=\"C22\" />\n+ <Bond atomName1=\"C21\" atomName2=\"O22\" />\n+ <Bond atomName1=\"C22\" atomName2=\"H2R\" />\n+ <Bond atomName1=\"C22\" atomName2=\"H2S\" />\n+ <Bond atomName1=\"C22\" atomName2=\"C23\" />\n+ <Bond atomName1=\"C23\" atomName2=\"H3R\" />\n+ <Bond atomName1=\"C23\" atomName2=\"H3S\" />\n+ <Bond atomName1=\"C23\" atomName2=\"C24\" />\n+ <Bond atomName1=\"C24\" atomName2=\"H4R\" />\n+ <Bond atomName1=\"C24\" atomName2=\"H4S\" />\n+ <Bond atomName1=\"C24\" atomName2=\"C25\" />\n+ <Bond atomName1=\"C25\" atomName2=\"H5R\" />\n+ <Bond atomName1=\"C25\" atomName2=\"H5S\" />\n+ <Bond atomName1=\"C25\" atomName2=\"C26\" />\n+ <Bond atomName1=\"C26\" atomName2=\"H6R\" />\n+ <Bond atomName1=\"C26\" atomName2=\"H6S\" />\n+ <Bond atomName1=\"C26\" atomName2=\"C27\" />\n+ <Bond atomName1=\"C27\" atomName2=\"H7R\" />\n+ <Bond atomName1=\"C27\" atomName2=\"H7S\" />\n+ <Bond atomName1=\"C27\" atomName2=\"C28\" />\n+ <Bond atomName1=\"C28\" atomName2=\"H8R\" />\n+ <Bond atomName1=\"C28\" atomName2=\"H8S\" />\n+ <Bond atomName1=\"C28\" atomName2=\"C29\" />\n+ <Bond atomName1=\"C29\" atomName2=\"H9R\" />\n+ <Bond atomName1=\"C29\" atomName2=\"H9S\" />\n+ <Bond atomName1=\"C29\" atomName2=\"C210\" />\n+ <Bond atomName1=\"C210\" atomName2=\"H10R\" />\n+ <Bond atomName1=\"C210\" atomName2=\"H10S\" />\n+ <Bond atomName1=\"C210\" atomName2=\"C211\" />\n+ <Bond atomName1=\"C211\" atomName2=\"H11R\" />\n+ <Bond atomName1=\"C211\" atomName2=\"H11S\" />\n+ <Bond atomName1=\"C211\" atomName2=\"C212\" />\n+ <Bond atomName1=\"C212\" atomName2=\"H12R\" />\n+ <Bond atomName1=\"C212\" atomName2=\"H12S\" />\n+ <Bond atomName1=\"C212\" atomName2=\"C213\" />\n+ <Bond atomName1=\"C213\" atomName2=\"H13R\" />\n+ <Bond atomName1=\"C213\" atomName2=\"H13S\" />\n+ <Bond atomName1=\"C213\" atomName2=\"C214\" />\n+ <Bond atomName1=\"C214\" atomName2=\"H14R\" />\n+ <Bond atomName1=\"C214\" atomName2=\"H14S\" />\n+ <Bond atomName1=\"C214\" atomName2=\"C215\" />\n+ <Bond atomName1=\"C215\" atomName2=\"H15R\" />\n+ <Bond atomName1=\"C215\" atomName2=\"H15S\" />\n+ <Bond atomName1=\"C215\" atomName2=\"C216\" />\n+ <Bond atomName1=\"C216\" atomName2=\"H16R\" />\n+ <Bond atomName1=\"C216\" atomName2=\"H16S\" />\n+ <Bond atomName1=\"C216\" atomName2=\"C217\" />\n+ <Bond atomName1=\"C217\" atomName2=\"H17R\" />\n+ <Bond atomName1=\"C217\" atomName2=\"H17S\" />\n+ <Bond atomName1=\"C217\" atomName2=\"C218\" />\n+ <Bond atomName1=\"C218\" atomName2=\"H18R\" />\n+ <Bond atomName1=\"C218\" atomName2=\"H18S\" />\n+ <Bond atomName1=\"C218\" atomName2=\"H18T\" />\n+ <Bond atomName1=\"O31\" atomName2=\"C31\" />\n+ <Bond atomName1=\"C31\" atomName2=\"C32\" />\n+ <Bond atomName1=\"C31\" atomName2=\"O32\" />\n+ <Bond atomName1=\"C32\" atomName2=\"H2X\" />\n+ <Bond atomName1=\"C32\" atomName2=\"H2Y\" />\n+ <Bond atomName1=\"C32\" atomName2=\"C33\" />\n+ <Bond atomName1=\"C33\" atomName2=\"H3X\" />\n+ <Bond atomName1=\"C33\" atomName2=\"H3Y\" />\n+ <Bond atomName1=\"C33\" atomName2=\"C34\" />\n+ <Bond atomName1=\"C34\" atomName2=\"H4X\" />\n+ <Bond atomName1=\"C34\" atomName2=\"H4Y\" />\n+ <Bond atomName1=\"C34\" atomName2=\"C35\" />\n+ <Bond atomName1=\"C35\" atomName2=\"H5X\" />\n+ <Bond atomName1=\"C35\" atomName2=\"H5Y\" />\n+ <Bond atomName1=\"C35\" atomName2=\"C36\" />\n+ <Bond atomName1=\"C36\" atomName2=\"H6X\" />\n+ <Bond atomName1=\"C36\" atomName2=\"H6Y\" />\n+ <Bond atomName1=\"C36\" atomName2=\"C37\" />\n+ <Bond atomName1=\"C37\" atomName2=\"H7X\" />\n+ <Bond atomName1=\"C37\" atomName2=\"H7Y\" />\n+ <Bond atomName1=\"C37\" atomName2=\"C38\" />\n+ <Bond atomName1=\"C38\" atomName2=\"H8X\" />\n+ <Bond atomName1=\"C38\" atomName2=\"H8Y\" />\n+ <Bond atomName1=\"C38\" atomName2=\"C39\" />\n+ <Bond atomName1=\"C39\" atomName2=\"H9X\" />\n+ <Bond atomName1=\"C39\" atomName2=\"H9Y\" />\n+ <Bond atomName1=\"C39\" atomName2=\"C310\" />\n+ <Bond atomName1=\"C310\" atomName2=\"H10X\" />\n+ <Bond atomName1=\"C310\" atomName2=\"H10Y\" />\n+ <Bond atomName1=\"C310\" atomName2=\"C311\" />\n+ <Bond atomName1=\"C311\" atomName2=\"H11X\" />\n+ <Bond atomName1=\"C311\" atomName2=\"H11Y\" />\n+ <Bond atomName1=\"C311\" atomName2=\"C312\" />\n+ <Bond atomName1=\"C312\" atomName2=\"H12X\" />\n+ <Bond atomName1=\"C312\" atomName2=\"H12Y\" />\n+ <Bond atomName1=\"C312\" atomName2=\"C313\" />\n+ <Bond atomName1=\"C313\" atomName2=\"H13X\" />\n+ <Bond atomName1=\"C313\" atomName2=\"H13Y\" />\n+ <Bond atomName1=\"C313\" atomName2=\"C314\" />\n+ <Bond atomName1=\"C314\" atomName2=\"H14X\" />\n+ <Bond atomName1=\"C314\" atomName2=\"H14Y\" />\n+ <Bond atomName1=\"C314\" atomName2=\"C315\" />\n+ <Bond atomName1=\"C315\" atomName2=\"H15X\" />\n+ <Bond atomName1=\"C315\" atomName2=\"H15Y\" />\n+ <Bond atomName1=\"C315\" atomName2=\"C316\" />\n+ <Bond atomName1=\"C316\" atomName2=\"H16X\" />\n+ <Bond atomName1=\"C316\" atomName2=\"H16Y\" />\n+ <Bond atomName1=\"C316\" atomName2=\"C317\" />\n+ <Bond atomName1=\"C317\" atomName2=\"H17X\" />\n+ <Bond atomName1=\"C317\" atomName2=\"H17Y\" />\n+ <Bond atomName1=\"C317\" atomName2=\"C318\" />\n+ <Bond atomName1=\"C318\" atomName2=\"H18X\" />\n+ <Bond atomName1=\"C318\" atomName2=\"H18Y\" />\n+ <Bond atomName1=\"C318\" atomName2=\"H18Z\" />\n+ </Residue>\n+ <Residue name=\"DSPA\">\n+ <Atom charge=\"1.456663\" name=\"P\" type=\"pA\" />\n+ <Atom charge=\"-0.914158\" name=\"O13\" type=\"oP\" />\n+ <Atom charge=\"-0.914158\" name=\"O14\" type=\"oP\" />\n+ <Atom charge=\"-0.706197\" name=\"O12\" type=\"oH\" />\n+ <Atom charge=\"0.415628\" name=\"H12\" type=\"hO\" />\n+ <Atom charge=\"-0.594197\" name=\"O11\" type=\"oT\" />\n+ <Atom charge=\"0.081528\" name=\"C1\" type=\"cA\" />\n+ <Atom charge=\"0.083099\" name=\"HA\" type=\"hE\" />\n+ <Atom charge=\"0.083099\" name=\"HB\" type=\"hE\" />\n+ <Atom charge=\"0.283546\" name=\"C2\" type=\"cA\" />\n+ <Atom charge=\"0.063862\" name=\"HS\" type=\"hE\" />\n+ <Atom charge=\"-0.554487\" name=\"O21\" type=\"oS\" />\n+ <Atom charge=\"0.897502\" name=\"C21\" type=\"cC\" />\n+ <Atom charge=\"-0.671622\" name=\"O22\" type=\"oC\" />\n+ <Atom charge=\"-0.11702\" name=\"C22\" type=\"cD\" />\n+ <Atom charge=\"0.051807\" name=\"H2R\" type=\"hL\" />\n+ <Atom charge=\"0.051807\" name=\"H2S\" type=\"hL\" />\n+ <Atom charge=\"0.185299\" name=\"C3\" type=\"cA\" />\n+ <Atom charge=\"0.067676\" name=\"HX\" type=\"hE\" />\n+ <Atom charge=\"0.067676\" name=\"HY\" type=\"hE\" />\n+ <Atom charge=\"-0.547824\" name=\"O31\" type=\"oS\" />\n+ <Atom charge=\"0.888207\" name=\"C31\" type=\"cC\" />\n+ <Atom charge=\"-0.671142\" name=\"O32\" type=\"oC\" />\n+ <Atom charge=\"-0.11702\" name=\"C32\" type=\"cD\" />\n+ <Atom charge=\"0.051807\" name=\"H2X\" type=\"hL\" />\n+ <Atom charge=\"0.051807\" name=\"H2Y\" type=\"hL\" />\n+ <Atom charge=\"-0.000128\" name=\"C23\" type=\"cD\" />\n+ <Atom charge=\"0.013886\" name=\"H3R\" type=\"hL\" />\n+ <Atom charge=\"0.013886\" name=\"H3S\" type=\"hL\" />\n+ <Atom charge=\"-0.059792\" name=\"C24\" type=\"cD\" />\n+ <Atom charge=\"0.024241\" name=\"H4R\" type=\"hL\" />\n+ <Atom charge=\"0.024241\" name=\"H4S\" type=\"hL\" />\n+ <Atom charge=\"-0.013443\" name=\"C25\" type=\"cD\" />\n+ <Atom charge=\"0.008191\" name=\"H5R\" type=\"hL\" />\n+ <Atom charge=\"0.008191\" name=\"H5S\" type=\"hL\" />\n+ <Atom charge=\"-0.037627\" name=\"C26\" type=\"cD\" />\n+ <Atom charge=\"0.01774\" name=\"H6R\" type=\"hL\" />\n+ <Atom charge=\"0.01774\" name=\"H6S\" type=\"hL\" />\n+ <Atom charge=\"-0.019469\" name=\"C27\" type=\"cD\" />\n+ <Atom charge=\"0.009292\" name=\"H7R\" type=\"hL\" />\n+ <Atom charge=\"0.009292\" name=\"H7S\" type=\"hL\" />\n+ <Atom charge=\"-0.014623\" name=\"C28\" type=\"cD\" />\n+ <Atom charge=\"0.007326\" name=\"H8R\" type=\"hL\" />\n+ <Atom charge=\"0.007326\" name=\"H8S\" type=\"hL\" />\n+ <Atom charge=\"-0.017997\" name=\"C29\" type=\"cD\" />\n+ <Atom charge=\"0.009595\" name=\"H9R\" type=\"hL\" />\n+ <Atom charge=\"0.009595\" name=\"H9S\" type=\"hL\" />\n+ <Atom charge=\"-0.026418\" name=\"C210\" type=\"cD\" />\n+ <Atom charge=\"0.010825\" name=\"H10R\" type=\"hL\" />\n+ <Atom charge=\"0.010825\" name=\"H10S\" type=\"hL\" />\n+ <Atom charge=\"-0.017093\" name=\"C211\" type=\"cD\" />\n+ <Atom charge=\"0.010206\" name=\"H11R\" type=\"hL\" />\n+ <Atom charge=\"0.010206\" name=\"H11S\" type=\"hL\" />\n+ <Atom charge=\"-0.019153\" name=\"C212\" type=\"cD\" />\n+ <Atom charge=\"0.008198\" name=\"H12R\" type=\"hL\" />\n+ <Atom charge=\"0.008198\" name=\"H12S\" type=\"hL\" />\n+ <Atom charge=\"-0.01159\" name=\"C213\" type=\"cD\" />\n+ <Atom charge=\"0.006022\" name=\"H13R\" type=\"hL\" />\n+ <Atom charge=\"0.006022\" name=\"H13S\" type=\"hL\" />\n+ <Atom charge=\"-0.013489\" name=\"C214\" type=\"cD\" />\n+ <Atom charge=\"0.010073\" name=\"H14R\" type=\"hL\" />\n+ <Atom charge=\"0.010073\" name=\"H14S\" type=\"hL\" />\n+ <Atom charge=\"-0.032444\" name=\"C215\" type=\"cD\" />\n+ <Atom charge=\"0.010253\" name=\"H15R\" type=\"hL\" />\n+ <Atom charge=\"0.010253\" name=\"H15S\" type=\"hL\" />\n+ <Atom charge=\"-0.027654\" name=\"C216\" type=\"cD\" />\n+ <Atom charge=\"0.015627\" name=\"H16R\" type=\"hL\" />\n+ <Atom charge=\"0.015627\" name=\"H16S\" type=\"hL\" />\n+ <Atom charge=\"0.020665\" name=\"C217\" type=\"cD\" />\n+ <Atom charge=\"0.008483\" name=\"H17R\" type=\"hL\" />\n+ <Atom charge=\"0.008483\" name=\"H17S\" type=\"hL\" />\n+ <Atom charge=\"-0.120069\" name=\"C218\" type=\"cD\" />\n+ <Atom charge=\"0.027938\" name=\"H18R\" type=\"hL\" />\n+ <Atom charge=\"0.027938\" name=\"H18S\" type=\"hL\" />\n+ <Atom charge=\"0.027938\" name=\"H18T\" type=\"hL\" />\n+ <Atom charge=\"-0.000128\" name=\"C33\" type=\"cD\" />\n+ <Atom charge=\"0.013886\" name=\"H3X\" type=\"hL\" />\n+ <Atom charge=\"0.013886\" name=\"H3Y\" type=\"hL\" />\n+ <Atom charge=\"-0.059792\" name=\"C34\" type=\"cD\" />\n+ <Atom charge=\"0.024241\" name=\"H4X\" type=\"hL\" />\n+ <Atom charge=\"0.024241\" name=\"H4Y\" type=\"hL\" />\n+ <Atom charge=\"-0.013443\" name=\"C35\" type=\"cD\" />\n+ <Atom charge=\"0.008191\" name=\"H5X\" type=\"hL\" />\n+ <Atom charge=\"0.008191\" name=\"H5Y\" type=\"hL\" />\n+ <Atom charge=\"-0.037627\" name=\"C36\" type=\"cD\" />\n+ <Atom charge=\"0.01774\" name=\"H6X\" type=\"hL\" />\n+ <Atom charge=\"0.01774\" name=\"H6Y\" type=\"hL\" />\n+ <Atom charge=\"-0.019469\" name=\"C37\" type=\"cD\" />\n+ <Atom charge=\"0.009292\" name=\"H7X\" type=\"hL\" />\n+ <Atom charge=\"0.009292\" name=\"H7Y\" type=\"hL\" />\n+ <Atom charge=\"-0.014623\" name=\"C38\" type=\"cD\" />\n+ <Atom charge=\"0.007326\" name=\"H8X\" type=\"hL\" />\n+ <Atom charge=\"0.007326\" name=\"H8Y\" type=\"hL\" />\n+ <Atom charge=\"-0.017997\" name=\"C39\" type=\"cD\" />\n+ <Atom charge=\"0.009595\" name=\"H9X\" type=\"hL\" />\n+ <Atom charge=\"0.009595\" name=\"H9Y\" type=\"hL\" />\n+ <Atom charge=\"-0.026418\" name=\"C310\" type=\"cD\" />\n+ <Atom charge=\"0.010825\" name=\"H10X\" type=\"hL\" />\n+ <Atom charge=\"0.010825\" name=\"H10Y\" type=\"hL\" />\n+ <Atom charge=\"-0.017093\" name=\"C311\" type=\"cD\" />\n+ <Atom charge=\"0.010206\" name=\"H11X\" type=\"hL\" />\n+ <Atom charge=\"0.010206\" name=\"H11Y\" type=\"hL\" />\n+ <Atom charge=\"-0.019153\" name=\"C312\" type=\"cD\" />\n+ <Atom charge=\"0.008198\" name=\"H12X\" type=\"hL\" />\n+ <Atom charge=\"0.008198\" name=\"H12Y\" type=\"hL\" />\n+ <Atom charge=\"-0.01159\" name=\"C313\" type=\"cD\" />\n+ <Atom charge=\"0.006022\" name=\"H13X\" type=\"hL\" />\n+ <Atom charge=\"0.006022\" name=\"H13Y\" type=\"hL\" />\n+ <Atom charge=\"-0.013489\" name=\"C314\" type=\"cD\" />\n+ <Atom charge=\"0.010073\" name=\"H14X\" type=\"hL\" />\n+ <Atom charge=\"0.010073\" name=\"H14Y\" type=\"hL\" />\n+ <Atom charge=\"-0.032444\" name=\"C315\" type=\"cD\" />\n+ <Atom charge=\"0.010253\" name=\"H15X\" type=\"hL\" />\n+ <Atom charge=\"0.010253\" name=\"H15Y\" type=\"hL\" />\n+ <Atom charge=\"-0.027654\" name=\"C316\" type=\"cD\" />\n+ <Atom charge=\"0.015627\" name=\"H16X\" type=\"hL\" />\n+ <Atom charge=\"0.015627\" name=\"H16Y\" type=\"hL\" />\n+ <Atom charge=\"0.020665\" name=\"C317\" type=\"cD\" />\n+ <Atom charge=\"0.008483\" name=\"H17X\" type=\"hL\" />\n+ <Atom charge=\"0.008483\" name=\"H17Y\" type=\"hL\" />\n+ <Atom charge=\"-0.120069\" name=\"C318\" type=\"cD\" />\n+ <Atom charge=\"0.027938\" name=\"H18X\" type=\"hL\" />\n+ <Atom charge=\"0.027938\" name=\"H18Y\" type=\"hL\" />\n+ <Atom charge=\"0.027938\" name=\"H18Z\" type=\"hL\" />\n+ <Bond atomName1=\"O12\" atomName2=\"P\" />\n+ <Bond atomName1=\"P\" atomName2=\"O11\" />\n+ <Bond atomName1=\"P\" atomName2=\"O13\" />\n+ <Bond atomName1=\"P\" atomName2=\"O14\" />\n+ <Bond atomName1=\"O12\" atomName2=\"H12\" />\n+ <Bond atomName1=\"O11\" atomName2=\"C1\" />\n+ <Bond atomName1=\"C1\" atomName2=\"HA\" />\n+ <Bond atomName1=\"C1\" atomName2=\"HB\" />\n+ <Bond atomName1=\"C1\" atomName2=\"C2\" />\n+ <Bond atomName1=\"C2\" atomName2=\"HS\" />\n+ <Bond atomName1=\"C2\" atomName2=\"C3\" />\n+ <Bond atomName1=\"C2\" atomName2=\"O21\" />\n+ <Bond atomName1=\"C3\" atomName2=\"HX\" />\n+ <Bond atomName1=\"C3\" atomName2=\"HY\" />\n+ <Bond atomName1=\"C3\" atomName2=\"O31\" />\n+ <Bond atomName1=\"O21\" atomName2=\"C21\" />\n+ <Bond atomName1=\"C21\" atomName2=\"C22\" />\n+ <Bond atomName1=\"C21\" atomName2=\"O22\" />\n+ <Bond atomName1=\"C22\" atomName2=\"H2R\" />\n+ <Bond atomName1=\"C22\" atomName2=\"H2S\" />\n+ <Bond atomName1=\"C22\" atomName2=\"C23\" />\n+ <Bond atomName1=\"C23\" atomName2=\"H3R\" />\n+ <Bond atomName1=\"C23\" atomName2=\"H3S\" />\n+ <Bond atomName1=\"C23\" atomName2=\"C24\" />\n+ <Bond atomName1=\"C24\" atomName2=\"H4R\" />\n+ <Bond atomName1=\"C24\" atomName2=\"H4S\" />\n+ <Bond atomName1=\"C24\" atomName2=\"C25\" />\n+ <Bond atomName1=\"C25\" atomName2=\"H5R\" />\n+ <Bond atomName1=\"C25\" atomName2=\"H5S\" />\n+ <Bond atomName1=\"C25\" atomName2=\"C26\" />\n+ <Bond atomName1=\"C26\" atomName2=\"H6R\" />\n+ <Bond atomName1=\"C26\" atomName2=\"H6S\" />\n+ <Bond atomName1=\"C26\" atomName2=\"C27\" />\n+ <Bond atomName1=\"C27\" atomName2=\"H7R\" />\n+ <Bond atomName1=\"C27\" atomName2=\"H7S\" />\n+ <Bond atomName1=\"C27\" atomName2=\"C28\" />\n+ <Bond atomName1=\"C28\" atomName2=\"H8R\" />\n+ <Bond atomName1=\"C28\" atomName2=\"H8S\" />\n+ <Bond atomName1=\"C28\" atomName2=\"C29\" />\n+ <Bond atomName1=\"C29\" atomName2=\"H9R\" />\n+ <Bond atomName1=\"C29\" atomName2=\"H9S\" />\n+ <Bond atomName1=\"C29\" atomName2=\"C210\" />\n+ <Bond atomName1=\"C210\" atomName2=\"H10R\" />\n+ <Bond atomName1=\"C210\" atomName2=\"H10S\" />\n+ <Bond atomName1=\"C210\" atomName2=\"C211\" />\n+ <Bond atomName1=\"C211\" atomName2=\"H11R\" />\n+ <Bond atomName1=\"C211\" atomName2=\"H11S\" />\n+ <Bond atomName1=\"C211\" atomName2=\"C212\" />\n+ <Bond atomName1=\"C212\" atomName2=\"H12R\" />\n+ <Bond atomName1=\"C212\" atomName2=\"H12S\" />\n+ <Bond atomName1=\"C212\" atomName2=\"C213\" />\n+ <Bond atomName1=\"C213\" atomName2=\"H13R\" />\n+ <Bond atomName1=\"C213\" atomName2=\"H13S\" />\n+ <Bond atomName1=\"C213\" atomName2=\"C214\" />\n+ <Bond atomName1=\"C214\" atomName2=\"H14R\" />\n+ <Bond atomName1=\"C214\" atomName2=\"H14S\" />\n+ <Bond atomName1=\"C214\" atomName2=\"C215\" />\n+ <Bond atomName1=\"C215\" atomName2=\"H15R\" />\n+ <Bond atomName1=\"C215\" atomName2=\"H15S\" />\n+ <Bond atomName1=\"C215\" atomName2=\"C216\" />\n+ <Bond atomName1=\"C216\" atomName2=\"H16R\" />\n+ <Bond atomName1=\"C216\" atomName2=\"H16S\" />\n+ <Bond atomName1=\"C216\" atomName2=\"C217\" />\n+ <Bond atomName1=\"C217\" atomName2=\"H17R\" />\n+ <Bond atomName1=\"C217\" atomName2=\"H17S\" />\n+ <Bond atomName1=\"C217\" atomName2=\"C218\" />\n+ <Bond atomName1=\"C218\" atomName2=\"H18R\" />\n+ <Bond atomName1=\"C218\" atomName2=\"H18S\" />\n+ <Bond atomName1=\"C218\" atomName2=\"H18T\" />\n+ <Bond atomName1=\"O31\" atomName2=\"C31\" />\n+ <Bond atomName1=\"C31\" atomName2=\"C32\" />\n+ <Bond atomName1=\"C31\" atomName2=\"O32\" />\n+ <Bond atomName1=\"C32\" atomName2=\"H2X\" />\n+ <Bond atomName1=\"C32\" atomName2=\"H2Y\" />\n+ <Bond atomName1=\"C32\" atomName2=\"C33\" />\n+ <Bond atomName1=\"C33\" atomName2=\"H3X\" />\n+ <Bond atomName1=\"C33\" atomName2=\"H3Y\" />\n+ <Bond atomName1=\"C33\" atomName2=\"C34\" />\n+ <Bond atomName1=\"C34\" atomName2=\"H4X\" />\n+ <Bond atomName1=\"C34\" atomName2=\"H4Y\" />\n+ <Bond atomName1=\"C34\" atomName2=\"C35\" />\n+ <Bond atomName1=\"C35\" atomName2=\"H5X\" />\n+ <Bond atomName1=\"C35\" atomName2=\"H5Y\" />\n+ <Bond atomName1=\"C35\" atomName2=\"C36\" />\n+ <Bond atomName1=\"C36\" atomName2=\"H6X\" />\n+ <Bond atomName1=\"C36\" atomName2=\"H6Y\" />\n+ <Bond atomName1=\"C36\" atomName2=\"C37\" />\n+ <Bond atomName1=\"C37\" atomName2=\"H7X\" />\n+ <Bond atomName1=\"C37\" atomName2=\"H7Y\" />\n+ <Bond atomName1=\"C37\" atomName2=\"C38\" />\n+ <Bond atomName1=\"C38\" atomName2=\"H8X\" />\n+ <Bond atomName1=\"C38\" atomName2=\"H8Y\" />\n+ <Bond atomName1=\"C38\" atomName2=\"C39\" />\n+ <Bond atomName1=\"C39\" atomName2=\"H9X\" />\n+ <Bond atomName1=\"C39\" atomName2=\"H9Y\" />\n+ <Bond atomName1=\"C39\" atomName2=\"C310\" />\n+ <Bond atomName1=\"C310\" atomName2=\"H10X\" />\n+ <Bond atomName1=\"C310\" atomName2=\"H10Y\" />\n+ <Bond atomName1=\"C310\" atomName2=\"C311\" />\n+ <Bond atomName1=\"C311\" atomName2=\"H11X\" />\n+ <Bond atomName1=\"C311\" atomName2=\"H11Y\" />\n+ <Bond atomName1=\"C311\" atomName2=\"C312\" />\n+ <Bond atomName1=\"C312\" atomName2=\"H12X\" />\n+ <Bond atomName1=\"C312\" atomName2=\"H12Y\" />\n+ <Bond atomName1=\"C312\" atomName2=\"C313\" />\n+ <Bond atomName1=\"C313\" atomName2=\"H13X\" />\n+ <Bond atomName1=\"C313\" atomName2=\"H13Y\" />\n+ <Bond atomName1=\"C313\" atomName2=\"C314\" />\n+ <Bond atomName1=\"C314\" atomName2=\"H14X\" />\n+ <Bond atomName1=\"C314\" atomName2=\"H14Y\" />\n+ <Bond atomName1=\"C314\" atomName2=\"C315\" />\n+ <Bond atomName1=\"C315\" atomName2=\"H15X\" />\n+ <Bond atomName1=\"C315\" atomName2=\"H15Y\" />\n+ <Bond atomName1=\"C315\" atomName2=\"C316\" />\n+ <Bond atomName1=\"C316\" atomName2=\"H16X\" />\n+ <Bond atomName1=\"C316\" atomName2=\"H16Y\" />\n+ <Bond atomName1=\"C316\" atomName2=\"C317\" />\n+ <Bond atomName1=\"C317\" atomName2=\"H17X\" />\n+ <Bond atomName1=\"C317\" atomName2=\"H17Y\" />\n+ <Bond atomName1=\"C317\" atomName2=\"C318\" />\n+ <Bond atomName1=\"C318\" atomName2=\"H18X\" />\n+ <Bond atomName1=\"C318\" atomName2=\"H18Y\" />\n+ <Bond atomName1=\"C318\" atomName2=\"H18Z\" />\n+ </Residue>\n+ <Residue name=\"DSPG\">\n+ <Atom charge=\"0.193597\" name=\"C13\" type=\"cA\" />\n+ <Atom charge=\"0.034715\" name=\"H13A\" type=\"hE\" />\n+ <Atom charge=\"0.034715\" name=\"H13B\" type=\"hE\" />\n+ <Atom charge=\"-0.700871\" name=\"OC3\" type=\"oH\" />\n+ <Atom charge=\"0.423328\" name=\"HO3\" type=\"hO\" />\n+ <Atom charge=\"0.336816\" name=\"C12\" type=\"cA\" />\n+ <Atom charge=\"0.030042\" name=\"H12A\" type=\"hE\" />\n+ <Atom charge=\"-0.726192\" name=\"OC2\" type=\"oH\" />\n+ <Atom charge=\"0.439523\" name=\"HO2\" type=\"hO\" />\n+ <Atom charge=\"-0.056706\" name=\"C11\" type=\"cA\" />\n+ <Atom charge=\"0.093354\" name=\"H11A\" type=\"hE\" />\n+ <Atom charge=\"0.093354\" name=\"H11B\" type=\"hE\" />\n+ <Atom charge=\"1.380464\" name=\"P\" type=\"pA\" />\n+ <Atom charge=\"-0.873444\" name=\"O13\" type=\"oP\" />\n+ <Atom charge=\"-0.873444\" name=\"O14\" type=\"oP\" />\n+ <Atom charge=\"-0.534308\" name=\"O12\" type=\"oT\" />\n+ <Atom charge=\"-0.546098\" name=\"O11\" type=\"oT\" />\n+ <Atom charge=\"0.043713\" name=\"C1\" type=\"cA\" />\n+ <Atom charge=\"0.091041\" name=\"HA\" type=\"hE\" />\n+ <Atom charge=\"0.091041\" name=\"HB\" type=\"hE\" />\n+ <Atom charge=\"0.353807\" name=\"C2\" type=\"cA\" />\n+ <Atom charge=\"0.037488\" name=\"HS\" type=\"hE\" />\n+ <Atom charge=\"-0.599131\" name=\"O21\" type=\"oS\" />\n+ <Atom charge=\"0.883669\" name=\"C21\" type=\"cC\" />\n+ <Atom charge=\"-0.655762\" name=\"O22\" type=\"oC\" />\n+ <Atom charge=\"-0.11702\" name=\"C22\" type=\"cD\" />\n+ <Atom charge=\"0.051807\" name=\"H2R\" type=\"hL\" />\n+ <Atom charge=\"0.051807\" name=\"H2S\" type=\"hL\" />\n+ <Atom charge=\"0.295119\" name=\"C3\" type=\"cA\" />\n+ <Atom charge=\"0.033797\" name=\"HX\" type=\"hE\" />\n+ <Atom charge=\"0.033797\" name=\"HY\" type=\"hE\" />\n+ <Atom charge=\"-0.585165\" name=\"O31\" type=\"oS\" />\n+ <Atom charge=\"0.877006\" name=\"C31\" type=\"cC\" />\n+ <Atom charge=\"-0.649265\" name=\"O32\" type=\"oC\" />\n+ <Atom charge=\"-0.11702\" name=\"C32\" type=\"cD\" />\n+ <Atom charge=\"0.051807\" name=\"H2X\" type=\"hL\" />\n+ <Atom charge=\"0.051807\" name=\"H2Y\" type=\"hL\" />\n+ <Atom charge=\"-0.000128\" name=\"C23\" type=\"cD\" />\n+ <Atom charge=\"0.013886\" name=\"H3R\" type=\"hL\" />\n+ <Atom charge=\"0.013886\" name=\"H3S\" type=\"hL\" />\n+ <Atom charge=\"-0.059792\" name=\"C24\" type=\"cD\" />\n+ <Atom charge=\"0.024241\" name=\"H4R\" type=\"hL\" />\n+ <Atom charge=\"0.024241\" name=\"H4S\" type=\"hL\" />\n+ <Atom charge=\"-0.013443\" name=\"C25\" type=\"cD\" />\n+ <Atom charge=\"0.008191\" name=\"H5R\" type=\"hL\" />\n+ <Atom charge=\"0.008191\" name=\"H5S\" type=\"hL\" />\n+ <Atom charge=\"-0.037627\" name=\"C26\" type=\"cD\" />\n+ <Atom charge=\"0.01774\" name=\"H6R\" type=\"hL\" />\n+ <Atom charge=\"0.01774\" name=\"H6S\" type=\"hL\" />\n+ <Atom charge=\"-0.019469\" name=\"C27\" type=\"cD\" />\n+ <Atom charge=\"0.009292\" name=\"H7R\" type=\"hL\" />\n+ <Atom charge=\"0.009292\" name=\"H7S\" type=\"hL\" />\n+ <Atom charge=\"-0.014623\" name=\"C28\" type=\"cD\" />\n+ <Atom charge=\"0.007326\" name=\"H8R\" type=\"hL\" />\n+ <Atom charge=\"0.007326\" name=\"H8S\" type=\"hL\" />\n+ <Atom charge=\"-0.017997\" name=\"C29\" type=\"cD\" />\n+ <Atom charge=\"0.009595\" name=\"H9R\" type=\"hL\" />\n+ <Atom charge=\"0.009595\" name=\"H9S\" type=\"hL\" />\n+ <Atom charge=\"-0.026418\" name=\"C210\" type=\"cD\" />\n+ <Atom charge=\"0.010825\" name=\"H10R\" type=\"hL\" />\n+ <Atom charge=\"0.010825\" name=\"H10S\" type=\"hL\" />\n+ <Atom charge=\"-0.017093\" name=\"C211\" type=\"cD\" />\n+ <Atom charge=\"0.010206\" name=\"H11R\" type=\"hL\" />\n+ <Atom charge=\"0.010206\" name=\"H11S\" type=\"hL\" />\n+ <Atom charge=\"-0.019153\" name=\"C212\" type=\"cD\" />\n+ <Atom charge=\"0.008198\" name=\"H12R\" type=\"hL\" />\n+ <Atom charge=\"0.008198\" name=\"H12S\" type=\"hL\" />\n+ <Atom charge=\"-0.01159\" name=\"C213\" type=\"cD\" />\n+ <Atom charge=\"0.006022\" name=\"H13R\" type=\"hL\" />\n+ <Atom charge=\"0.006022\" name=\"H13S\" type=\"hL\" />\n+ <Atom charge=\"-0.013489\" name=\"C214\" type=\"cD\" />\n+ <Atom charge=\"0.010073\" name=\"H14R\" type=\"hL\" />\n+ <Atom charge=\"0.010073\" name=\"H14S\" type=\"hL\" />\n+ <Atom charge=\"-0.032444\" name=\"C215\" type=\"cD\" />\n+ <Atom charge=\"0.010253\" name=\"H15R\" type=\"hL\" />\n+ <Atom charge=\"0.010253\" name=\"H15S\" type=\"hL\" />\n+ <Atom charge=\"-0.027654\" name=\"C216\" type=\"cD\" />\n+ <Atom charge=\"0.015627\" name=\"H16R\" type=\"hL\" />\n+ <Atom charge=\"0.015627\" name=\"H16S\" type=\"hL\" />\n+ <Atom charge=\"0.020665\" name=\"C217\" type=\"cD\" />\n+ <Atom charge=\"0.008483\" name=\"H17R\" type=\"hL\" />\n+ <Atom charge=\"0.008483\" name=\"H17S\" type=\"hL\" />\n+ <Atom charge=\"-0.120069\" name=\"C218\" type=\"cD\" />\n+ <Atom charge=\"0.027938\" name=\"H18R\" type=\"hL\" />\n+ <Atom charge=\"0.027938\" name=\"H18S\" type=\"hL\" />\n+ <Atom charge=\"0.027938\" name=\"H18T\" type=\"hL\" />\n+ <Atom charge=\"-0.000128\" name=\"C33\" type=\"cD\" />\n+ <Atom charge=\"0.013886\" name=\"H3X\" type=\"hL\" />\n+ <Atom charge=\"0.013886\" name=\"H3Y\" type=\"hL\" />\n+ <Atom charge=\"-0.059792\" name=\"C34\" type=\"cD\" />\n+ <Atom charge=\"0.024241\" name=\"H4X\" type=\"hL\" />\n+ <Atom charge=\"0.024241\" name=\"H4Y\" type=\"hL\" />\n+ <Atom charge=\"-0.013443\" name=\"C35\" type=\"cD\" />\n+ <Atom charge=\"0.008191\" name=\"H5X\" type=\"hL\" />\n+ <Atom charge=\"0.008191\" name=\"H5Y\" type=\"hL\" />\n+ <Atom charge=\"-0.037627\" name=\"C36\" type=\"cD\" />\n+ <Atom charge=\"0.01774\" name=\"H6X\" type=\"hL\" />\n+ <Atom charge=\"0.01774\" name=\"H6Y\" type=\"hL\" />\n+ <Atom charge=\"-0.019469\" name=\"C37\" type=\"cD\" />\n+ <Atom charge=\"0.009292\" name=\"H7X\" type=\"hL\" />\n+ <Atom charge=\"0.009292\" name=\"H7Y\" type=\"hL\" />\n+ <Atom charge=\"-0.014623\" name=\"C38\" type=\"cD\" />\n+ <Atom charge=\"0.007326\" name=\"H8X\" type=\"hL\" />\n+ <Atom charge=\"0.007326\" name=\"H8Y\" type=\"hL\" />\n+ <Atom charge=\"-0.017997\" name=\"C39\" type=\"cD\" />\n+ <Atom charge=\"0.009595\" name=\"H9X\" type=\"hL\" />\n+ <Atom charge=\"0.009595\" name=\"H9Y\" type=\"hL\" />\n+ <Atom charge=\"-0.026418\" name=\"C310\" type=\"cD\" />\n+ <Atom charge=\"0.010825\" name=\"H10X\" type=\"hL\" />\n+ <Atom charge=\"0.010825\" name=\"H10Y\" type=\"hL\" />\n+ <Atom charge=\"-0.017093\" name=\"C311\" type=\"cD\" />\n+ <Atom charge=\"0.010206\" name=\"H11X\" type=\"hL\" />\n+ <Atom charge=\"0.010206\" name=\"H11Y\" type=\"hL\" />\n+ <Atom charge=\"-0.019153\" name=\"C312\" type=\"cD\" />\n+ <Atom charge=\"0.008198\" name=\"H12X\" type=\"hL\" />\n+ <Atom charge=\"0.008198\" name=\"H12Y\" type=\"hL\" />\n+ <Atom charge=\"-0.01159\" name=\"C313\" type=\"cD\" />\n+ <Atom charge=\"0.006022\" name=\"H13X\" type=\"hL\" />\n+ <Atom charge=\"0.006022\" name=\"H13Y\" type=\"hL\" />\n+ <Atom charge=\"-0.013489\" name=\"C314\" type=\"cD\" />\n+ <Atom charge=\"0.010073\" name=\"H14X\" type=\"hL\" />\n+ <Atom charge=\"0.010073\" name=\"H14Y\" type=\"hL\" />\n+ <Atom charge=\"-0.032444\" name=\"C315\" type=\"cD\" />\n+ <Atom charge=\"0.010253\" name=\"H15X\" type=\"hL\" />\n+ <Atom charge=\"0.010253\" name=\"H15Y\" type=\"hL\" />\n+ <Atom charge=\"-0.027654\" name=\"C316\" type=\"cD\" />\n+ <Atom charge=\"0.015627\" name=\"H16X\" type=\"hL\" />\n+ <Atom charge=\"0.015627\" name=\"H16Y\" type=\"hL\" />\n+ <Atom charge=\"0.020665\" name=\"C317\" type=\"cD\" />\n+ <Atom charge=\"0.008483\" name=\"H17X\" type=\"hL\" />\n+ <Atom charge=\"0.008483\" name=\"H17Y\" type=\"hL\" />\n+ <Atom charge=\"-0.120069\" name=\"C318\" type=\"cD\" />\n+ <Atom charge=\"0.027938\" name=\"H18X\" type=\"hL\" />\n+ <Atom charge=\"0.027938\" name=\"H18Y\" type=\"hL\" />\n+ <Atom charge=\"0.027938\" name=\"H18Z\" type=\"hL\" />\n+ <Bond atomName1=\"HO3\" atomName2=\"OC3\" />\n+ <Bond atomName1=\"OC3\" atomName2=\"C13\" />\n+ <Bond atomName1=\"C13\" atomName2=\"H13A\" />\n+ <Bond atomName1=\"C13\" atomName2=\"H13B\" />\n+ <Bond atomName1=\"C13\" atomName2=\"C12\" />\n+ <Bond atomName1=\"HO2\" atomName2=\"OC2\" />\n+ <Bond atomName1=\"OC2\" atomName2=\"C12\" />\n+ <Bond atomName1=\"C12\" atomName2=\"H12A\" />\n+ <Bond atomName1=\"C12\" atomName2=\"C11\" />\n+ <Bond atomName1=\"C11\" atomName2=\"H11A\" />\n+ <Bond atomName1=\"C11\" atomName2=\"H11B\" />\n+ <Bond atomName1=\"C11\" atomName2=\"O12\" />\n+ <Bond atomName1=\"O11\" atomName2=\"C1\" />\n+ <Bond atomName1=\"O12\" atomName2=\"P\" />\n+ <Bond atomName1=\"P\" atomName2=\"O11\" />\n+ <Bond atomName1=\"P\" atomName2=\"O13\" />\n+ <Bond atomName1=\"P\" atomName2=\"O14\" />\n+ <Bond atomName1=\"C1\" atomName2=\"HA\" />\n+ <Bond atomName1=\"C1\" atomName2=\"HB\" />\n+ <Bond atomName1=\"C1\" atomName2=\"C2\" />\n+ <Bond atomName1=\"C2\" atomName2=\"HS\" />\n+ <Bond atomName1=\"C2\" atomName2=\"C3\" />\n+ <Bond atomName1=\"C2\" atomName2=\"O21\" />\n+ <Bond atomName1=\"C3\" atomName2=\"HX\" />\n+ <Bond atomName1=\"C3\" atomName2=\"HY\" />\n+ <Bond atomName1=\"C3\" atomName2=\"O31\" />\n+ <Bond atomName1=\"O21\" atomName2=\"C21\" />\n+ <Bond atomName1=\"C21\" atomName2=\"C22\" />\n+ <Bond atomName1=\"C21\" atomName2=\"O22\" />\n+ <Bond atomName1=\"C22\" atomName2=\"H2R\" />\n+ <Bond atomName1=\"C22\" atomName2=\"H2S\" />\n+ <Bond atomName1=\"C22\" atomName2=\"C23\" />\n+ <Bond atomName1=\"C23\" atomName2=\"H3R\" />\n+ <Bond atomName1=\"C23\" atomName2=\"H3S\" />\n+ <Bond atomName1=\"C23\" atomName2=\"C24\" />\n+ <Bond atomName1=\"C24\" atomName2=\"H4R\" />\n+ <Bond atomName1=\"C24\" atomName2=\"H4S\" />\n+ <Bond atomName1=\"C24\" atomName2=\"C25\" />\n+ <Bond atomName1=\"C25\" atomName2=\"H5R\" />\n+ <Bond atomName1=\"C25\" atomName2=\"H5S\" />\n+ <Bond atomName1=\"C25\" atomName2=\"C26\" />\n+ <Bond atomName1=\"C26\" atomName2=\"H6R\" />\n+ <Bond atomName1=\"C26\" atomName2=\"H6S\" />\n+ <Bond atomName1=\"C26\" atomName2=\"C27\" />\n+ <Bond atomName1=\"C27\" atomName2=\"H7R\" />\n+ <Bond atomName1=\"C27\" atomName2=\"H7S\" />\n+ <Bond atomName1=\"C27\" atomName2=\"C28\" />\n+ <Bond atomName1=\"C28\" atomName2=\"H8R\" />\n+ <Bond atomName1=\"C28\" atomName2=\"H8S\" />\n+ <Bond atomName1=\"C28\" atomName2=\"C29\" />\n+ <Bond atomName1=\"C29\" atomName2=\"H9R\" />\n+ <Bond atomName1=\"C29\" atomName2=\"H9S\" />\n+ <Bond atomName1=\"C29\" atomName2=\"C210\" />\n+ <Bond atomName1=\"C210\" atomName2=\"H10R\" />\n+ <Bond atomName1=\"C210\" atomName2=\"H10S\" />\n+ <Bond atomName1=\"C210\" atomName2=\"C211\" />\n+ <Bond atomName1=\"C211\" atomName2=\"H11R\" />\n+ <Bond atomName1=\"C211\" atomName2=\"H11S\" />\n+ <Bond atomName1=\"C211\" atomName2=\"C212\" />\n+ <Bond atomName1=\"C212\" atomName2=\"H12R\" />\n+ <Bond atomName1=\"C212\" atomName2=\"H12S\" />\n+ <Bond atomName1=\"C212\" atomName2=\"C213\" />\n+ <Bond atomName1=\"C213\" atomName2=\"H13R\" />\n+ <Bond atomName1=\"C213\" atomName2=\"H13S\" />\n+ <Bond atomName1=\"C213\" atomName2=\"C214\" />\n+ <Bond atomName1=\"C214\" atomName2=\"H14R\" />\n+ <Bond atomName1=\"C214\" atomName2=\"H14S\" />\n+ <Bond atomName1=\"C214\" atomName2=\"C215\" />\n+ <Bond atomName1=\"C215\" atomName2=\"H15R\" />\n+ <Bond atomName1=\"C215\" atomName2=\"H15S\" />\n+ <Bond atomName1=\"C215\" atomName2=\"C216\" />\n+ <Bond atomName1=\"C216\" atomName2=\"H16R\" />\n+ <Bond atomName1=\"C216\" atomName2=\"H16S\" />\n+ <Bond atomName1=\"C216\" atomName2=\"C217\" />\n+ <Bond atomName1=\"C217\" atomName2=\"H17R\" />\n+ <Bond atomName1=\"C217\" atomName2=\"H17S\" />\n+ <Bond atomName1=\"C217\" atomName2=\"C218\" />\n+ <Bond atomName1=\"C218\" atomName2=\"H18R\" />\n+ <Bond atomName1=\"C218\" atomName2=\"H18S\" />\n+ <Bond atomName1=\"C218\" atomName2=\"H18T\" />\n+ <Bond atomName1=\"O31\" atomName2=\"C31\" />\n+ <Bond atomName1=\"C31\" atomName2=\"C32\" />\n+ <Bond atomName1=\"C31\" atomName2=\"O32\" />\n+ <Bond atomName1=\"C32\" atomName2=\"H2X\" />\n+ <Bond atomName1=\"C32\" atomName2=\"H2Y\" />\n+ <Bond atomName1=\"C32\" atomName2=\"C33\" />\n+ <Bond atomName1=\"C33\" atomName2=\"H3X\" />\n+ <Bond atomName1=\"C33\" atomName2=\"H3Y\" />\n+ <Bond atomName1=\"C33\" atomName2=\"C34\" />\n+ <Bond atomName1=\"C34\" atomName2=\"H4X\" />\n+ <Bond atomName1=\"C34\" atomName2=\"H4Y\" />\n+ <Bond atomName1=\"C34\" atomName2=\"C35\" />\n+ <Bond atomName1=\"C35\" atomName2=\"H5X\" />\n+ <Bond atomName1=\"C35\" atomName2=\"H5Y\" />\n+ <Bond atomName1=\"C35\" atomName2=\"C36\" />\n+ <Bond atomName1=\"C36\" atomName2=\"H6X\" />\n+ <Bond atomName1=\"C36\" atomName2=\"H6Y\" />\n+ <Bond atomName1=\"C36\" atomName2=\"C37\" />\n+ <Bond atomName1=\"C37\" atomName2=\"H7X\" />\n+ <Bond atomName1=\"C37\" atomName2=\"H7Y\" />\n+ <Bond atomName1=\"C37\" atomName2=\"C38\" />\n+ <Bond atomName1=\"C38\" atomName2=\"H8X\" />\n+ <Bond atomName1=\"C38\" atomName2=\"H8Y\" />\n+ <Bond atomName1=\"C38\" atomName2=\"C39\" />\n+ <Bond atomName1=\"C39\" atomName2=\"H9X\" />\n+ <Bond atomName1=\"C39\" atomName2=\"H9Y\" />\n+ <Bond atomName1=\"C39\" atomName2=\"C310\" />\n+ <Bond atomName1=\"C310\" atomName2=\"H10X\" />\n+ <Bond atomName1=\"C310\" atomName2=\"H10Y\" />\n+ <Bond atomName1=\"C310\" atomName2=\"C311\" />\n+ <Bond atomName1=\"C311\" atomName2=\"H11X\" />\n+ <Bond atomName1=\"C311\" atomName2=\"H11Y\" />\n+ <Bond atomName1=\"C311\" atomName2=\"C312\" />\n+ <Bond atomName1=\"C312\" atomName2=\"H12X\" />\n+ <Bond atomName1=\"C312\" atomName2=\"H12Y\" />\n+ <Bond atomName1=\"C312\" atomName2=\"C313\" />\n+ <Bond atomName1=\"C313\" atomName2=\"H13X\" />\n+ <Bond atomName1=\"C313\" atomName2=\"H13Y\" />\n+ <Bond atomName1=\"C313\" atomName2=\"C314\" />\n+ <Bond atomName1=\"C314\" atomName2=\"H14X\" />\n+ <Bond atomName1=\"C314\" atomName2=\"H14Y\" />\n+ <Bond atomName1=\"C314\" atomName2=\"C315\" />\n+ <Bond atomName1=\"C315\" atomName2=\"H15X\" />\n+ <Bond atomName1=\"C315\" atomName2=\"H15Y\" />\n+ <Bond atomName1=\"C315\" atomName2=\"C316\" />\n+ <Bond atomName1=\"C316\" atomName2=\"H16X\" />\n+ <Bond atomName1=\"C316\" atomName2=\"H16Y\" />\n+ <Bond atomName1=\"C316\" atomName2=\"C317\" />\n+ <Bond atomName1=\"C317\" atomName2=\"H17X\" />\n+ <Bond atomName1=\"C317\" atomName2=\"H17Y\" />\n+ <Bond atomName1=\"C317\" atomName2=\"C318\" />\n+ <Bond atomName1=\"C318\" atomName2=\"H18X\" />\n+ <Bond atomName1=\"C318\" atomName2=\"H18Y\" />\n+ <Bond atomName1=\"C318\" atomName2=\"H18Z\" />\n+ </Residue>\n+ <Residue name=\"DOPC\">\n+ <Atom charge=\"0.245262\" name=\"N\" type=\"nA\" />\n+ <Atom charge=\"-0.170824\" name=\"C12\" type=\"cA\" />\n+ <Atom charge=\"0.136415\" name=\"H12A\" type=\"hX\" />\n+ <Atom charge=\"0.136415\" name=\"H12B\" type=\"hX\" />\n+ <Atom charge=\"-0.338973\" name=\"C13\" type=\"cA\" />\n+ <Atom charge=\"0.17223\" name=\"H13A\" type=\"hX\" />\n+ <Atom charge=\"0.17223\" name=\"H13B\" type=\"hX\" />\n+ <Atom charge=\"0.17223\" name=\"H13C\" type=\"hX\" />\n+ <Atom charge=\"-0.338973\" name=\"C14\" type=\"cA\" />\n+ <Atom charge=\"0.17223\" name=\"H14A\" type=\"hX\" />\n+ <Atom charge=\"0.17223\" name=\"H14B\" type=\"hX\" />\n+ <Atom charge=\"0.17223\" name=\"H14C\" type=\"hX\" />\n+ <Atom charge=\"-0.338973\" name=\"C15\" type=\"cA\" />\n+ <Atom charge=\"0.17223\" name=\"H15A\" type=\"hX\" />\n+ <Atom charge=\"0.17223\" name=\"H15B\" type=\"hX\" />\n+ <Atom charge=\"0.17223\" name=\"H15C\" type=\"hX\" />\n+ <Atom charge=\"0.166801\" name=\"C11\" type=\"cA\" />\n+ <Atom charge=\"0.078534\" name=\"H11A\" type=\"hE\" />\n+ <Atom charge=\"0.078534\" name=\"H11B\" type=\"hE\" />\n+ <Atom charge=\"1.339721\" name=\"P\" type=\"pA\" />\n+ <Atom charge=\"-0.875812\" name=\"O13\" type=\"oP\" />\n+ <Atom charge=\"-0.875812\" name=\"O14\" type=\"oP\" />\n+ <Atom charge=\"-0.508176\" name=\"O12\" type=\"oT\" />\n+ <Atom charge=\"-0.50948\" name=\"O11\" type=\"oT\" />\n+ <Atom charge=\"0.017459\" name=\"C1\" type=\"cA\" />\n+ <Atom charge=\"0.095591\" name=\"HA\" type=\"hE\" />\n+ <Atom charge=\"0.095591\" name=\"HB\" type=\"hE\" />\n+ <Atom charge=\"0.281242\" name=\"C2\" type=\"cA\" />\n+ <Atom charge=\"0.063253\" name=\"HS\" type=\"hE\" />\n+ <Atom charge=\"-0.552948\" name=\"O21\" type=\"oS\" />\n+ <Atom charge=\"0.897613\" name=\"C21\" type=\"cC\" />\n+ <Atom charge=\"-0.673755\" name=\"O22\" type=\"oC\" />\n+ <Atom charge=\"-0.143418\" name=\"C22\" type=\"cD\" />\n+ <Atom charge=\"0.042861\" name=\"H2R\" type=\"hL\" />\n+ <Atom charge=\"0.042861\" name=\"H2S\" type=\"hL\" />\n+ <Atom charge=\"0.196939\" name=\"C3\" type=\"cA\" />\n+ <Atom charge=\"0.070469\" name=\"HX\" type=\"hE\" />\n+ <Atom charge=\"0.070469\" name=\"HY\" type=\"hE\" />\n+ <Atom charge=\"-0.575489\" name=\"O31\" type=\"oS\" />\n+ <Atom charge=\"0.910403\" name=\"C31\" type=\"cC\" />\n+ <Atom charge=\"-0.671566\" name=\"O32\" type=\"oC\" />\n+ <Atom charge=\"-0.143418\" name=\"C32\" type=\"cD\" />\n+ <Atom charge=\"0.042861\" name=\"H2X\" type=\"hL\" />\n+ <Atom charge=\"0.042861\" name=\"H2Y\" type=\"hL\" />\n+ <Atom charge=\"0.001619\" name=\"C23\" type=\"cD\" />\n+ <Atom charge=\"0.019529\" name=\"H3R\" type=\"hL\" />\n+ <Atom charge=\"0.019529\" name=\"H3S\" type=\"hL\" />\n+ <Atom charge=\"-0.02296\" name=\"C24\" type=\"cD\" />\n+ <Atom charge=\"0.018134\" name=\"H4R\" type=\"hL\" />\n+ <Atom charge=\"0.018134\" name=\"H4S\" type=\"hL\" />\n+ <Atom charge=\"-0.016692\" name=\"C25\" type=\"cD\" />\n+ <Atom charge=\"0.00869\" name=\"H5R\" type=\"hL\" />\n+ <Atom charge=\"0.00869\" name=\"H5S\" type=\"hL\" />\n+ <Atom charge=\"-0.023789\" name=\"C26\" type=\"cD\" />\n+ <Atom charge=\"0.009266\" name=\"H6R\" type=\"hL\" />\n+ <Atom charge=\"0.009266\" name=\"H6S\" type=\"hL\" />\n+ <Atom charge=\"-0.017495\" name=\"C27\" type=\"cD\" />\n+ <Atom charge=\"0.019598\" name=\"H7R\" type=\"hL\" />\n+ <Atom charge=\"0.019598\" name=\"H7S\" type=\"hL\" />\n+ <Atom charge=\"0.031775\" name=\"C28\" type=\"cD\" />\n+ <Atom charge=\"0.032685\" name=\"H8R\" type=\"hL\" />\n+ <Atom charge=\"0.032685\" name=\"H8S\" type=\"hL\" />\n+ <Atom charge=\"-0.244228\" name=\"C29\" type=\"cB\" />\n+ <Atom charge=\"0.131512\" name=\"H9R\" type=\"hB\" />\n+ <Atom charge=\"-0.239284\" name=\"C210\" type=\"cB\" />\n+ <Atom charge=\"0.126878\" name=\"H10R\" type=\"hB\" />\n+ <Atom charge=\"0.029059\" name=\"C211\" type=\"cD\" />\n+ <Atom charge=\"0.033531\" name=\"H11R\" type=\"hL\" />\n+ <Atom charge=\"0.033531\" name=\"H11S\" type=\"hL\" />\n+ <Atom charge=\"-0.026353\" name=\"C212\" type=\"cD\" />\n+ <Atom charge=\"0.019717\" name=\"H12R\" type=\"hL\" />\n+ <Atom charge=\"0.019717\" name=\"H12S\" type=\"hL\" />\n+ <Atom charge=\"-0.018257\" name=\"C213\" type=\"cD\" />\n+ <Atom charge=\"0.0138\" name=\"H13R\" type=\"hL\" />\n+ <Atom charge=\"0.0138\" name=\"H13S\" type=\"hL\" />\n+ <Atom charge=\"-0.024849\" name=\"C214\" type=\"cD\" />\n+ <Atom charge=\"0.008572\" name=\"H14R\" type=\"hL\" />\n+ <Atom charge=\"0.008572\" name=\"H14S\" type=\"hL\" />\n+ <Atom charge=\"-0.023247\" name=\"C215\" type=\"cD\" />\n+ <Atom charge=\"0.010403\" name=\"H15R\" type=\"hL\" />\n+ <Atom charge=\"0.010403\" name=\"H15S\" type=\"hL\" />\n+ <Atom charge=\"-0.012488\" name=\"C216\" type=\"cD\" />\n+ <Atom charge=\"0.013659\" name=\"H16R\" type=\"hL\" />\n+ <Atom charge=\"0.013659\" name=\"H16S\" type=\"hL\" />\n+ <Atom charge=\"0.008684\" name=\"C217\" type=\"cD\" />\n+ <Atom charge=\"0.010026\" name=\"H17R\" type=\"hL\" />\n+ <Atom charge=\"0.010026\" name=\"H17S\" type=\"hL\" />\n+ <Atom charge=\"-0.11729\" name=\"C218\" type=\"cD\" />\n+ <Atom charge=\"0.026627\" name=\"H18R\" type=\"hL\" />\n+ <Atom charge=\"0.026627\" name=\"H18S\" type=\"hL\" />\n+ <Atom charge=\"0.026627\" name=\"H18T\" type=\"hL\" />\n+ <Atom charge=\"0.001619\" name=\"C33\" type=\"cD\" />\n+ <Atom charge=\"0.019529\" name=\"H3X\" type=\"hL\" />\n+ <Atom charge=\"0.019529\" name=\"H3Y\" type=\"hL\" />\n+ <Atom charge=\"-0.02296\" name=\"C34\" type=\"cD\" />\n+ <Atom charge=\"0.018134\" name=\"H4X\" type=\"hL\" />\n+ <Atom charge=\"0.018134\" name=\"H4Y\" type=\"hL\" />\n+ <Atom charge=\"-0.016692\" name=\"C35\" type=\"cD\" />\n+ <Atom charge=\"0.00869\" name=\"H5X\" type=\"hL\" />\n+ <Atom charge=\"0.00869\" name=\"H5Y\" type=\"hL\" />\n+ <Atom charge=\"-0.023789\" name=\"C36\" type=\"cD\" />\n+ <Atom charge=\"0.009266\" name=\"H6X\" type=\"hL\" />\n+ <Atom charge=\"0.009266\" name=\"H6Y\" type=\"hL\" />\n+ <Atom charge=\"-0.017495\" name=\"C37\" type=\"cD\" />\n+ <Atom charge=\"0.019598\" name=\"H7X\" type=\"hL\" />\n+ <Atom charge=\"0.019598\" name=\"H7Y\" type=\"hL\" />\n+ <Atom charge=\"0.031775\" name=\"C38\" type=\"cD\" />\n+ <Atom charge=\"0.032685\" name=\"H8X\" type=\"hL\" />\n+ <Atom charge=\"0.032685\" name=\"H8Y\" type=\"hL\" />\n+ <Atom charge=\"-0.244228\" name=\"C39\" type=\"cB\" />\n+ <Atom charge=\"0.131512\" name=\"H9X\" type=\"hB\" />\n+ <Atom charge=\"-0.239284\" name=\"C310\" type=\"cB\" />\n+ <Atom charge=\"0.126878\" name=\"H10X\" type=\"hB\" />\n+ <Atom charge=\"0.029059\" name=\"C311\" type=\"cD\" />\n+ <Atom charge=\"0.033531\" name=\"H11X\" type=\"hL\" />\n+ <Atom charge=\"0.033531\" name=\"H11Y\" type=\"hL\" />\n+ <Atom charge=\"-0.026353\" name=\"C312\" type=\"cD\" />\n+ <Atom charge=\"0.019717\" name=\"H12X\" type=\"hL\" />\n+ <Atom charge=\"0.019717\" name=\"H12Y\" type=\"hL\" />\n+ <Atom charge=\"-0.018257\" name=\"C313\" type=\"cD\" />\n+ <Atom charge=\"0.0138\" name=\"H13X\" type=\"hL\" />\n+ <Atom charge=\"0.0138\" name=\"H13Y\" type=\"hL\" />\n+ <Atom charge=\"-0.024849\" name=\"C314\" type=\"cD\" />\n+ <Atom charge=\"0.008572\" name=\"H14X\" type=\"hL\" />\n+ <Atom charge=\"0.008572\" name=\"H14Y\" type=\"hL\" />\n+ <Atom charge=\"-0.023247\" name=\"C315\" type=\"cD\" />\n+ <Atom charge=\"0.010403\" name=\"H15X\" type=\"hL\" />\n+ <Atom charge=\"0.010403\" name=\"H15Y\" type=\"hL\" />\n+ <Atom charge=\"-0.012488\" name=\"C316\" type=\"cD\" />\n+ <Atom charge=\"0.013659\" name=\"H16X\" type=\"hL\" />\n+ <Atom charge=\"0.013659\" name=\"H16Y\" type=\"hL\" />\n+ <Atom charge=\"0.008684\" name=\"C317\" type=\"cD\" />\n+ <Atom charge=\"0.010026\" name=\"H17X\" type=\"hL\" />\n+ <Atom charge=\"0.010026\" name=\"H17Y\" type=\"hL\" />\n+ <Atom charge=\"-0.11729\" name=\"C318\" type=\"cD\" />\n+ <Atom charge=\"0.026627\" name=\"H18X\" type=\"hL\" />\n+ <Atom charge=\"0.026627\" name=\"H18Y\" type=\"hL\" />\n+ <Atom charge=\"0.026627\" name=\"H18Z\" type=\"hL\" />\n+ <Bond atomName1=\"N\" atomName2=\"C13\" />\n+ <Bond atomName1=\"N\" atomName2=\"C14\" />\n+ <Bond atomName1=\"N\" atomName2=\"C15\" />\n+ <Bond atomName1=\"C13\" atomName2=\"H13A\" />\n+ <Bond atomName1=\"C13\" atomName2=\"H13B\" />\n+ <Bond atomName1=\"C13\" atomName2=\"H13C\" />\n+ <Bond atomName1=\"C14\" atomName2=\"H14A\" />\n+ <Bond atomName1=\"C14\" atomName2=\"H14B\" />\n+ <Bond atomName1=\"C14\" atomName2=\"H14C\" />\n+ <Bond atomName1=\"C15\" atomName2=\"H15A\" />\n+ <Bond atomName1=\"C15\" atomName2=\"H15B\" />\n+ <Bond atomName1=\"C15\" atomName2=\"H15C\" />\n+ <Bond atomName1=\"N\" atomName2=\"C12\" />\n+ <Bond atomName1=\"C12\" atomName2=\"H12A\" />\n+ <Bond atomName1=\"C12\" atomName2=\"H12B\" />\n+ <Bond atomName1=\"C12\" atomName2=\"C11\" />\n+ <Bond atomName1=\"C11\" atomName2=\"H11A\" />\n+ <Bond atomName1=\"C11\" atomName2=\"H11B\" />\n+ <Bond atomName1=\"C11\" atomName2=\"O12\" />\n+ <Bond atomName1=\"O11\" atomName2=\"C1\" />\n+ <Bond atomName1=\"O12\" atomName2=\"P\" />\n+ <Bond atomName1=\"P\" atomName2=\"O11\" />\n+ <Bond atomName1=\"P\" atomName2=\"O13\" />\n+ <Bond atomName1=\"P\" atomName2=\"O14\" />\n+ <Bond atomName1=\"C1\" atomName2=\"HA\" />\n+ <Bond atomName1=\"C1\" atomName2=\"HB\" />\n+ <Bond atomName1=\"C1\" atomName2=\"C2\" />\n+ <Bond atomName1=\"C2\" atomName2=\"HS\" />\n+ <Bond atomName1=\"C2\" atomName2=\"C3\" />\n+ <Bond atomName1=\"C2\" atomName2=\"O21\" />\n+ <Bond atomName1=\"C3\" atomName2=\"HX\" />\n+ <Bond atomName1=\"C3\" atomName2=\"HY\" />\n+ <Bond atomName1=\"C3\" atomName2=\"O31\" />\n+ <Bond atomName1=\"O21\" atomName2=\"C21\" />\n+ <Bond atomName1=\"C21\" atomName2=\"C22\" />\n+ <Bond atomName1=\"C21\" atomName2=\"O22\" />\n+ <Bond atomName1=\"C22\" atomName2=\"H2R\" />\n+ <Bond atomName1=\"C22\" atomName2=\"H2S\" />\n+ <Bond atomName1=\"C22\" atomName2=\"C23\" />\n+ <Bond atomName1=\"C23\" atomName2=\"H3R\" />\n+ <Bond atomName1=\"C23\" atomName2=\"H3S\" />\n+ <Bond atomName1=\"C23\" atomName2=\"C24\" />\n+ <Bond atomName1=\"C24\" atomName2=\"H4R\" />\n+ <Bond atomName1=\"C24\" atomName2=\"H4S\" />\n+ <Bond atomName1=\"C24\" atomName2=\"C25\" />\n+ <Bond atomName1=\"C25\" atomName2=\"H5R\" />\n+ <Bond atomName1=\"C25\" atomName2=\"H5S\" />\n+ <Bond atomName1=\"C25\" atomName2=\"C26\" />\n+ <Bond atomName1=\"C26\" atomName2=\"H6R\" />\n+ <Bond atomName1=\"C26\" atomName2=\"H6S\" />\n+ <Bond atomName1=\"C26\" atomName2=\"C27\" />\n+ <Bond atomName1=\"C27\" atomName2=\"H7R\" />\n+ <Bond atomName1=\"C27\" atomName2=\"H7S\" />\n+ <Bond atomName1=\"C27\" atomName2=\"C28\" />\n+ <Bond atomName1=\"C28\" atomName2=\"H8R\" />\n+ <Bond atomName1=\"C28\" atomName2=\"H8S\" />\n+ <Bond atomName1=\"C28\" atomName2=\"C29\" />\n+ <Bond atomName1=\"C29\" atomName2=\"H9R\" />\n+ <Bond atomName1=\"C29\" atomName2=\"C210\" />\n+ <Bond atomName1=\"C210\" atomName2=\"H10R\" />\n+ <Bond atomName1=\"C210\" atomName2=\"C211\" />\n+ <Bond atomName1=\"C211\" atomName2=\"H11R\" />\n+ <Bond atomName1=\"C211\" atomName2=\"H11S\" />\n+ <Bond atomName1=\"C211\" atomName2=\"C212\" />\n+ <Bond atomName1=\"C212\" atomName2=\"H12R\" />\n+ <Bond atomName1=\"C212\" atomName2=\"H12S\" />\n+ <Bond atomName1=\"C212\" atomName2=\"C213\" />\n+ <Bond atomName1=\"C213\" atomName2=\"H13R\" />\n+ <Bond atomName1=\"C213\" atomName2=\"H13S\" />\n+ <Bond atomName1=\"C213\" atomName2=\"C214\" />\n+ <Bond atomName1=\"C214\" atomName2=\"H14R\" />\n+ <Bond atomName1=\"C214\" atomName2=\"H14S\" />\n+ <Bond atomName1=\"C214\" atomName2=\"C215\" />\n+ <Bond atomName1=\"C215\" atomName2=\"H15R\" />\n+ <Bond atomName1=\"C215\" atomName2=\"H15S\" />\n+ <Bond atomName1=\"C215\" atomName2=\"C216\" />\n+ <Bond atomName1=\"C216\" atomName2=\"H16R\" />\n+ <Bond atomName1=\"C216\" atomName2=\"H16S\" />\n+ <Bond atomName1=\"C216\" atomName2=\"C217\" />\n+ <Bond atomName1=\"C217\" atomName2=\"H17R\" />\n+ <Bond atomName1=\"C217\" atomName2=\"H17S\" />\n+ <Bond atomName1=\"C217\" atomName2=\"C218\" />\n+ <Bond atomName1=\"C218\" atomName2=\"H18R\" />\n+ <Bond atomName1=\"C218\" atomName2=\"H18S\" />\n+ <Bond atomName1=\"C218\" atomName2=\"H18T\" />\n+ <Bond atomName1=\"O31\" atomName2=\"C31\" />\n+ <Bond atomName1=\"C31\" atomName2=\"C32\" />\n+ <Bond atomName1=\"C31\" atomName2=\"O32\" />\n+ <Bond atomName1=\"C32\" atomName2=\"H2X\" />\n+ <Bond atomName1=\"C32\" atomName2=\"H2Y\" />\n+ <Bond atomName1=\"C32\" atomName2=\"C33\" />\n+ <Bond atomName1=\"C33\" atomName2=\"H3X\" />\n+ <Bond atomName1=\"C33\" atomName2=\"H3Y\" />\n+ <Bond atomName1=\"C33\" atomName2=\"C34\" />\n+ <Bond atomName1=\"C34\" atomName2=\"H4X\" />\n+ <Bond atomName1=\"C34\" atomName2=\"H4Y\" />\n+ <Bond atomName1=\"C34\" atomName2=\"C35\" />\n+ <Bond atomName1=\"C35\" atomName2=\"H5X\" />\n+ <Bond atomName1=\"C35\" atomName2=\"H5Y\" />\n+ <Bond atomName1=\"C35\" atomName2=\"C36\" />\n+ <Bond atomName1=\"C36\" atomName2=\"H6X\" />\n+ <Bond atomName1=\"C36\" atomName2=\"H6Y\" />\n+ <Bond atomName1=\"C36\" atomName2=\"C37\" />\n+ <Bond atomName1=\"C37\" atomName2=\"H7X\" />\n+ <Bond atomName1=\"C37\" atomName2=\"H7Y\" />\n+ <Bond atomName1=\"C37\" atomName2=\"C38\" />\n+ <Bond atomName1=\"C38\" atomName2=\"H8X\" />\n+ <Bond atomName1=\"C38\" atomName2=\"H8Y\" />\n+ <Bond atomName1=\"C38\" atomName2=\"C39\" />\n+ <Bond atomName1=\"C39\" atomName2=\"H9X\" />\n+ <Bond atomName1=\"C39\" atomName2=\"C310\" />\n+ <Bond atomName1=\"C310\" atomName2=\"H10X\" />\n+ <Bond atomName1=\"C310\" atomName2=\"C311\" />\n+ <Bond atomName1=\"C311\" atomName2=\"H11X\" />\n+ <Bond atomName1=\"C311\" atomName2=\"H11Y\" />\n+ <Bond atomName1=\"C311\" atomName2=\"C312\" />\n+ <Bond atomName1=\"C312\" atomName2=\"H12X\" />\n+ <Bond atomName1=\"C312\" atomName2=\"H12Y\" />\n+ <Bond atomName1=\"C312\" atomName2=\"C313\" />\n+ <Bond atomName1=\"C313\" atomName2=\"H13X\" />\n+ <Bond atomName1=\"C313\" atomName2=\"H13Y\" />\n+ <Bond atomName1=\"C313\" atomName2=\"C314\" />\n+ <Bond atomName1=\"C314\" atomName2=\"H14X\" />\n+ <Bond atomName1=\"C314\" atomName2=\"H14Y\" />\n+ <Bond atomName1=\"C314\" atomName2=\"C315\" />\n+ <Bond atomName1=\"C315\" atomName2=\"H15X\" />\n+ <Bond atomName1=\"C315\" atomName2=\"H15Y\" />\n+ <Bond atomName1=\"C315\" atomName2=\"C316\" />\n+ <Bond atomName1=\"C316\" atomName2=\"H16X\" />\n+ <Bond atomName1=\"C316\" atomName2=\"H16Y\" />\n+ <Bond atomName1=\"C316\" atomName2=\"C317\" />\n+ <Bond atomName1=\"C317\" atomName2=\"H17X\" />\n+ <Bond atomName1=\"C317\" atomName2=\"H17Y\" />\n+ <Bond atomName1=\"C317\" atomName2=\"C318\" />\n+ <Bond atomName1=\"C318\" atomName2=\"H18X\" />\n+ <Bond atomName1=\"C318\" atomName2=\"H18Y\" />\n+ <Bond atomName1=\"C318\" atomName2=\"H18Z\" />\n+ </Residue>\n+ <Residue name=\"DOPE\">\n+ <Atom charge=\"-0.368132\" name=\"N\" type=\"nA\" />\n+ <Atom charge=\"0.348549\" name=\"HN1\" type=\"hN\" />\n+ <Atom charge=\"0.348549\" name=\"HN2\" type=\"hN\" />\n+ <Atom charge=\"0.348549\" name=\"HN3\" type=\"hN\" />\n+ <Atom charge=\"0.077319\" name=\"C12\" type=\"cA\" />\n+ <Atom charge=\"0.09163\" name=\"H12A\" type=\"hX\" />\n+ <Atom charge=\"0.09163\" name=\"H12B\" type=\"hX\" />\n+ <Atom charge=\"0.075159\" name=\"C11\" type=\"cA\" />\n+ <Atom charge=\"0.091516\" name=\"H11A\" type=\"hE\" />\n+ <Atom charge=\"0.091516\" name=\"H11B\" type=\"hE\" />\n+ <Atom charge=\"1.373656\" name=\"P\" type=\"pA\" />\n+ <Atom charge=\"-0.877447\" name=\"O13\" type=\"oP\" />\n+ <Atom charge=\"-0.877447\" name=\"O14\" type=\"oP\" />\n+ <Atom charge=\"-0.546623\" name=\"O11\" type=\"oT\" />\n+ <Atom charge=\"-0.514542\" name=\"O12\" type=\"oT\" />\n+ <Atom charge=\"0.040967\" name=\"C1\" type=\"cA\" />\n+ <Atom charge=\"0.090994\" name=\"HA\" type=\"hE\" />\n+ <Atom charge=\"0.090994\" name=\"HB\" type=\"hE\" />\n+ <Atom charge=\"0.339004\" name=\"C2\" type=\"cA\" />\n+ <Atom charge=\"0.032843\" name=\"HS\" type=\"hE\" />\n+ <Atom charge=\"-0.57548\" name=\"O21\" type=\"oS\" />\n+ <Atom charge=\"0.86934\" name=\"C21\" type=\"cC\" />\n+ <Atom charge=\"-0.649199\" name=\"O22\" type=\"oC\" />\n+ <Atom charge=\"-0.143418\" name=\"C22\" type=\"cD\" />\n+ <Atom charge=\"0.042861\" name=\"H2R\" type=\"hL\" />\n+ <Atom charge=\"0.042861\" name=\"H2S\" type=\"hL\" />\n+ <Atom charge=\"0.273776\" name=\"C3\" type=\"cA\" />\n+ <Atom charge=\"0.044574\" name=\"HX\" type=\"hE\" />\n+ <Atom charge=\"0.044574\" name=\"HY\" type=\"hE\" />\n+ <Atom charge=\"-0.593826\" name=\"O31\" type=\"oS\" />\n+ <Atom charge=\"0.888359\" name=\"C31\" type=\"cC\" />\n+ <Atom charge=\"-0.650802\" name=\"O32\" type=\"oC\" />\n+ <Atom charge=\"-0.143418\" name=\"C32\" type=\"cD\" />\n+ <Atom charge=\"0.042861\" name=\"H2X\" type=\"hL\" />\n+ <Atom charge=\"0.042861\" name=\"H2Y\" type=\"hL\" />\n+ <Atom charge=\"0.001619\" name=\"C23\" type=\"cD\" />\n+ <Atom charge=\"0.019529\" name=\"H3R\" type=\"hL\" />\n+ <Atom charge=\"0.019529\" name=\"H3S\" type=\"hL\" />\n+ <Atom charge=\"-0.02296\" name=\"C24\" type=\"cD\" />\n+ <Atom charge=\"0.018134\" name=\"H4R\" type=\"hL\" />\n+ <Atom charge=\"0.018134\" name=\"H4S\" type=\"hL\" />\n+ <Atom charge=\"-0.016692\" name=\"C25\" type=\"cD\" />\n+ <Atom charge=\"0.00869\" name=\"H5R\" type=\"hL\" />\n+ <Atom charge=\"0.00869\" name=\"H5S\" type=\"hL\" />\n+ <Atom charge=\"-0.023789\" name=\"C26\" type=\"cD\" />\n+ <Atom charge=\"0.009266\" name=\"H6R\" type=\"hL\" />\n+ <Atom charge=\"0.009266\" name=\"H6S\" type=\"hL\" />\n+ <Atom charge=\"-0.017495\" name=\"C27\" type=\"cD\" />\n+ <Atom charge=\"0.019598\" name=\"H7R\" type=\"hL\" />\n+ <Atom charge=\"0.019598\" name=\"H7S\" type=\"hL\" />\n+ <Atom charge=\"0.031775\" name=\"C28\" type=\"cD\" />\n+ <Atom charge=\"0.032685\" name=\"H8R\" type=\"hL\" />\n+ <Atom charge=\"0.032685\" name=\"H8S\" type=\"hL\" />\n+ <Atom charge=\"-0.244228\" name=\"C29\" type=\"cB\" />\n+ <Atom charge=\"0.131512\" name=\"H9R\" type=\"hB\" />\n+ <Atom charge=\"-0.239284\" name=\"C210\" type=\"cB\" />\n+ <Atom charge=\"0.126878\" name=\"H10R\" type=\"hB\" />\n+ <Atom charge=\"0.029059\" name=\"C211\" type=\"cD\" />\n+ <Atom charge=\"0.033531\" name=\"H11R\" type=\"hL\" />\n+ <Atom charge=\"0.033531\" name=\"H11S\" type=\"hL\" />\n+ <Atom charge=\"-0.026353\" name=\"C212\" type=\"cD\" />\n+ <Atom charge=\"0.019717\" name=\"H12R\" type=\"hL\" />\n+ <Atom charge=\"0.019717\" name=\"H12S\" type=\"hL\" />\n+ <Atom charge=\"-0.018257\" name=\"C213\" type=\"cD\" />\n+ <Atom charge=\"0.0138\" name=\"H13R\" type=\"hL\" />\n+ <Atom charge=\"0.0138\" name=\"H13S\" type=\"hL\" />\n+ <Atom charge=\"-0.024849\" name=\"C214\" type=\"cD\" />\n+ <Atom charge=\"0.008572\" name=\"H14R\" type=\"hL\" />\n+ <Atom charge=\"0.008572\" name=\"H14S\" type=\"hL\" />\n+ <Atom charge=\"-0.023247\" name=\"C215\" type=\"cD\" />\n+ <Atom charge=\"0.010403\" name=\"H15R\" type=\"hL\" />\n+ <Atom charge=\"0.010403\" name=\"H15S\" type=\"hL\" />\n+ <Atom charge=\"-0.012488\" name=\"C216\" type=\"cD\" />\n+ <Atom charge=\"0.013659\" name=\"H16R\" type=\"hL\" />\n+ <Atom charge=\"0.013659\" name=\"H16S\" type=\"hL\" />\n+ <Atom charge=\"0.008684\" name=\"C217\" type=\"cD\" />\n+ <Atom charge=\"0.010026\" name=\"H17R\" type=\"hL\" />\n+ <Atom charge=\"0.010026\" name=\"H17S\" type=\"hL\" />\n+ <Atom charge=\"-0.11729\" name=\"C218\" type=\"cD\" />\n+ <Atom charge=\"0.026627\" name=\"H18R\" type=\"hL\" />\n+ <Atom charge=\"0.026627\" name=\"H18S\" type=\"hL\" />\n+ <Atom charge=\"0.026627\" name=\"H18T\" type=\"hL\" />\n+ <Atom charge=\"0.001619\" name=\"C33\" type=\"cD\" />\n+ <Atom charge=\"0.019529\" name=\"H3X\" type=\"hL\" />\n+ <Atom charge=\"0.019529\" name=\"H3Y\" type=\"hL\" />\n+ <Atom charge=\"-0.02296\" name=\"C34\" type=\"cD\" />\n+ <Atom charge=\"0.018134\" name=\"H4X\" type=\"hL\" />\n+ <Atom charge=\"0.018134\" name=\"H4Y\" type=\"hL\" />\n+ <Atom charge=\"-0.016692\" name=\"C35\" type=\"cD\" />\n+ <Atom charge=\"0.00869\" name=\"H5X\" type=\"hL\" />\n+ <Atom charge=\"0.00869\" name=\"H5Y\" type=\"hL\" />\n+ <Atom charge=\"-0.023789\" name=\"C36\" type=\"cD\" />\n+ <Atom charge=\"0.009266\" name=\"H6X\" type=\"hL\" />\n+ <Atom charge=\"0.009266\" name=\"H6Y\" type=\"hL\" />\n+ <Atom charge=\"-0.017495\" name=\"C37\" type=\"cD\" />\n+ <Atom charge=\"0.019598\" name=\"H7X\" type=\"hL\" />\n+ <Atom charge=\"0.019598\" name=\"H7Y\" type=\"hL\" />\n+ <Atom charge=\"0.031775\" name=\"C38\" type=\"cD\" />\n+ <Atom charge=\"0.032685\" name=\"H8X\" type=\"hL\" />\n+ <Atom charge=\"0.032685\" name=\"H8Y\" type=\"hL\" />\n+ <Atom charge=\"-0.244228\" name=\"C39\" type=\"cB\" />\n+ <Atom charge=\"0.131512\" name=\"H9X\" type=\"hB\" />\n+ <Atom charge=\"-0.239284\" name=\"C310\" type=\"cB\" />\n+ <Atom charge=\"0.126878\" name=\"H10X\" type=\"hB\" />\n+ <Atom charge=\"0.029059\" name=\"C311\" type=\"cD\" />\n+ <Atom charge=\"0.033531\" name=\"H11X\" type=\"hL\" />\n+ <Atom charge=\"0.033531\" name=\"H11Y\" type=\"hL\" />\n+ <Atom charge=\"-0.026353\" name=\"C312\" type=\"cD\" />\n+ <Atom charge=\"0.019717\" name=\"H12X\" type=\"hL\" />\n+ <Atom charge=\"0.019717\" name=\"H12Y\" type=\"hL\" />\n+ <Atom charge=\"-0.018257\" name=\"C313\" type=\"cD\" />\n+ <Atom charge=\"0.0138\" name=\"H13X\" type=\"hL\" />\n+ <Atom charge=\"0.0138\" name=\"H13Y\" type=\"hL\" />\n+ <Atom charge=\"-0.024849\" name=\"C314\" type=\"cD\" />\n+ <Atom charge=\"0.008572\" name=\"H14X\" type=\"hL\" />\n+ <Atom charge=\"0.008572\" name=\"H14Y\" type=\"hL\" />\n+ <Atom charge=\"-0.023247\" name=\"C315\" type=\"cD\" />\n+ <Atom charge=\"0.010403\" name=\"H15X\" type=\"hL\" />\n+ <Atom charge=\"0.010403\" name=\"H15Y\" type=\"hL\" />\n+ <Atom charge=\"-0.012488\" name=\"C316\" type=\"cD\" />\n+ <Atom charge=\"0.013659\" name=\"H16X\" type=\"hL\" />\n+ <Atom charge=\"0.013659\" name=\"H16Y\" type=\"hL\" />\n+ <Atom charge=\"0.008684\" name=\"C317\" type=\"cD\" />\n+ <Atom charge=\"0.010026\" name=\"H17X\" type=\"hL\" />\n+ <Atom charge=\"0.010026\" name=\"H17Y\" type=\"hL\" />\n+ <Atom charge=\"-0.11729\" name=\"C318\" type=\"cD\" />\n+ <Atom charge=\"0.026627\" name=\"H18X\" type=\"hL\" />\n+ <Atom charge=\"0.026627\" name=\"H18Y\" type=\"hL\" />\n+ <Atom charge=\"0.026627\" name=\"H18Z\" type=\"hL\" />\n+ <Bond atomName1=\"N\" atomName2=\"HN1\" />\n+ <Bond atomName1=\"N\" atomName2=\"HN2\" />\n+ <Bond atomName1=\"N\" atomName2=\"HN3\" />\n+ <Bond atomName1=\"N\" atomName2=\"C12\" />\n+ <Bond atomName1=\"C12\" atomName2=\"H12A\" />\n+ <Bond atomName1=\"C12\" atomName2=\"H12B\" />\n+ <Bond atomName1=\"C12\" atomName2=\"C11\" />\n+ <Bond atomName1=\"C11\" atomName2=\"H11A\" />\n+ <Bond atomName1=\"C11\" atomName2=\"H11B\" />\n+ <Bond atomName1=\"C11\" atomName2=\"O12\" />\n+ <Bond atomName1=\"O12\" atomName2=\"P\" />\n+ <Bond atomName1=\"P\" atomName2=\"O11\" />\n+ <Bond atomName1=\"P\" atomName2=\"O13\" />\n+ <Bond atomName1=\"P\" atomName2=\"O14\" />\n+ <Bond atomName1=\"C1\" atomName2=\"HA\" />\n+ <Bond atomName1=\"C1\" atomName2=\"HB\" />\n+ <Bond atomName1=\"C1\" atomName2=\"C2\" />\n+ <Bond atomName1=\"C1\" atomName2=\"O11\" />\n+ <Bond atomName1=\"C2\" atomName2=\"HS\" />\n+ <Bond atomName1=\"C2\" atomName2=\"C3\" />\n+ <Bond atomName1=\"C2\" atomName2=\"O21\" />\n+ <Bond atomName1=\"C3\" atomName2=\"HX\" />\n+ <Bond atomName1=\"C3\" atomName2=\"HY\" />\n+ <Bond atomName1=\"C3\" atomName2=\"O31\" />\n+ <Bond atomName1=\"O21\" atomName2=\"C21\" />\n+ <Bond atomName1=\"C21\" atomName2=\"C22\" />\n+ <Bond atomName1=\"C21\" atomName2=\"O22\" />\n+ <Bond atomName1=\"C22\" atomName2=\"H2R\" />\n+ <Bond atomName1=\"C22\" atomName2=\"H2S\" />\n+ <Bond atomName1=\"C22\" atomName2=\"C23\" />\n+ <Bond atomName1=\"C23\" atomName2=\"H3R\" />\n+ <Bond atomName1=\"C23\" atomName2=\"H3S\" />\n+ <Bond atomName1=\"C23\" atomName2=\"C24\" />\n+ <Bond atomName1=\"C24\" atomName2=\"H4R\" />\n+ <Bond atomName1=\"C24\" atomName2=\"H4S\" />\n+ <Bond atomName1=\"C24\" atomName2=\"C25\" />\n+ <Bond atomName1=\"C25\" atomName2=\"H5R\" />\n+ <Bond atomName1=\"C25\" atomName2=\"H5S\" />\n+ <Bond atomName1=\"C25\" atomName2=\"C26\" />\n+ <Bond atomName1=\"C26\" atomName2=\"H6R\" />\n+ <Bond atomName1=\"C26\" atomName2=\"H6S\" />\n+ <Bond atomName1=\"C26\" atomName2=\"C27\" />\n+ <Bond atomName1=\"C27\" atomName2=\"H7R\" />\n+ <Bond atomName1=\"C27\" atomName2=\"H7S\" />\n+ <Bond atomName1=\"C27\" atomName2=\"C28\" />\n+ <Bond atomName1=\"C28\" atomName2=\"H8R\" />\n+ <Bond atomName1=\"C28\" atomName2=\"H8S\" />\n+ <Bond atomName1=\"C28\" atomName2=\"C29\" />\n+ <Bond atomName1=\"C29\" atomName2=\"H9R\" />\n+ <Bond atomName1=\"C29\" atomName2=\"C210\" />\n+ <Bond atomName1=\"C210\" atomName2=\"H10R\" />\n+ <Bond atomName1=\"C210\" atomName2=\"C211\" />\n+ <Bond atomName1=\"C211\" atomName2=\"H11R\" />\n+ <Bond atomName1=\"C211\" atomName2=\"H11S\" />\n+ <Bond atomName1=\"C211\" atomName2=\"C212\" />\n+ <Bond atomName1=\"C212\" atomName2=\"H12R\" />\n+ <Bond atomName1=\"C212\" atomName2=\"H12S\" />\n+ <Bond atomName1=\"C212\" atomName2=\"C213\" />\n+ <Bond atomName1=\"C213\" atomName2=\"H13R\" />\n+ <Bond atomName1=\"C213\" atomName2=\"H13S\" />\n+ <Bond atomName1=\"C213\" atomName2=\"C214\" />\n+ <Bond atomName1=\"C214\" atomName2=\"H14R\" />\n+ <Bond atomName1=\"C214\" atomName2=\"H14S\" />\n+ <Bond atomName1=\"C214\" atomName2=\"C215\" />\n+ <Bond atomName1=\"C215\" atomName2=\"H15R\" />\n+ <Bond atomName1=\"C215\" atomName2=\"H15S\" />\n+ <Bond atomName1=\"C215\" atomName2=\"C216\" />\n+ <Bond atomName1=\"C216\" atomName2=\"H16R\" />\n+ <Bond atomName1=\"C216\" atomName2=\"H16S\" />\n+ <Bond atomName1=\"C216\" atomName2=\"C217\" />\n+ <Bond atomName1=\"C217\" atomName2=\"H17R\" />\n+ <Bond atomName1=\"C217\" atomName2=\"H17S\" />\n+ <Bond atomName1=\"C217\" atomName2=\"C218\" />\n+ <Bond atomName1=\"C218\" atomName2=\"H18R\" />\n+ <Bond atomName1=\"C218\" atomName2=\"H18S\" />\n+ <Bond atomName1=\"C218\" atomName2=\"H18T\" />\n+ <Bond atomName1=\"O31\" atomName2=\"C31\" />\n+ <Bond atomName1=\"C31\" atomName2=\"C32\" />\n+ <Bond atomName1=\"C31\" atomName2=\"O32\" />\n+ <Bond atomName1=\"C32\" atomName2=\"H2X\" />\n+ <Bond atomName1=\"C32\" atomName2=\"H2Y\" />\n+ <Bond atomName1=\"C32\" atomName2=\"C33\" />\n+ <Bond atomName1=\"C33\" atomName2=\"H3X\" />\n+ <Bond atomName1=\"C33\" atomName2=\"H3Y\" />\n+ <Bond atomName1=\"C33\" atomName2=\"C34\" />\n+ <Bond atomName1=\"C34\" atomName2=\"H4X\" />\n+ <Bond atomName1=\"C34\" atomName2=\"H4Y\" />\n+ <Bond atomName1=\"C34\" atomName2=\"C35\" />\n+ <Bond atomName1=\"C35\" atomName2=\"H5X\" />\n+ <Bond atomName1=\"C35\" atomName2=\"H5Y\" />\n+ <Bond atomName1=\"C35\" atomName2=\"C36\" />\n+ <Bond atomName1=\"C36\" atomName2=\"H6X\" />\n+ <Bond atomName1=\"C36\" atomName2=\"H6Y\" />\n+ <Bond atomName1=\"C36\" atomName2=\"C37\" />\n+ <Bond atomName1=\"C37\" atomName2=\"H7X\" />\n+ <Bond atomName1=\"C37\" atomName2=\"H7Y\" />\n+ <Bond atomName1=\"C37\" atomName2=\"C38\" />\n+ <Bond atomName1=\"C38\" atomName2=\"H8X\" />\n+ <Bond atomName1=\"C38\" atomName2=\"H8Y\" />\n+ <Bond atomName1=\"C38\" atomName2=\"C39\" />\n+ <Bond atomName1=\"C39\" atomName2=\"H9X\" />\n+ <Bond atomName1=\"C39\" atomName2=\"C310\" />\n+ <Bond atomName1=\"C310\" atomName2=\"H10X\" />\n+ <Bond atomName1=\"C310\" atomName2=\"C311\" />\n+ <Bond atomName1=\"C311\" atomName2=\"H11X\" />\n+ <Bond atomName1=\"C311\" atomName2=\"H11Y\" />\n+ <Bond atomName1=\"C311\" atomName2=\"C312\" />\n+ <Bond atomName1=\"C312\" atomName2=\"H12X\" />\n+ <Bond atomName1=\"C312\" atomName2=\"H12Y\" />\n+ <Bond atomName1=\"C312\" atomName2=\"C313\" />\n+ <Bond atomName1=\"C313\" atomName2=\"H13X\" />\n+ <Bond atomName1=\"C313\" atomName2=\"H13Y\" />\n+ <Bond atomName1=\"C313\" atomName2=\"C314\" />\n+ <Bond atomName1=\"C314\" atomName2=\"H14X\" />\n+ <Bond atomName1=\"C314\" atomName2=\"H14Y\" />\n+ <Bond atomName1=\"C314\" atomName2=\"C315\" />\n+ <Bond atomName1=\"C315\" atomName2=\"H15X\" />\n+ <Bond atomName1=\"C315\" atomName2=\"H15Y\" />\n+ <Bond atomName1=\"C315\" atomName2=\"C316\" />\n+ <Bond atomName1=\"C316\" atomName2=\"H16X\" />\n+ <Bond atomName1=\"C316\" atomName2=\"H16Y\" />\n+ <Bond atomName1=\"C316\" atomName2=\"C317\" />\n+ <Bond atomName1=\"C317\" atomName2=\"H17X\" />\n+ <Bond atomName1=\"C317\" atomName2=\"H17Y\" />\n+ <Bond atomName1=\"C317\" atomName2=\"C318\" />\n+ <Bond atomName1=\"C318\" atomName2=\"H18X\" />\n+ <Bond atomName1=\"C318\" atomName2=\"H18Y\" />\n+ <Bond atomName1=\"C318\" atomName2=\"H18Z\" />\n+ </Residue>\n+ <Residue name=\"DOPS\">\n+ <Atom charge=\"-0.414327\" name=\"N\" type=\"nA\" />\n+ <Atom charge=\"0.353866\" name=\"HN1\" type=\"hN\" />\n+ <Atom charge=\"0.353866\" name=\"HN2\" type=\"hN\" />\n+ <Atom charge=\"0.353866\" name=\"HN3\" type=\"hN\" />\n+ <Atom charge=\"0.039448\" name=\"C12\" type=\"cA\" />\n+ <Atom charge=\"0.090549\" name=\"H12A\" type=\"hX\" />\n+ <Atom charge=\"0.809867\" name=\"C13\" type=\"cC\" />\n+ <Atom charge=\"-0.815178\" name=\"O13A\" type=\"oO\" />\n+ <Atom charge=\"-0.815178\" name=\"O13B\" type=\"oO\" />\n+ <Atom charge=\"0.060375\" name=\"C11\" type=\"cA\" />\n+ <Atom charge=\"0.093484\" name=\"H11A\" type=\"hE\" />\n+ <Atom charge=\"0.093484\" name=\"H11B\" type=\"hE\" />\n+ <Atom charge=\"1.380208\" name=\"P\" type=\"pA\" />\n+ <Atom charge=\"-0.877922\" name=\"O13\" type=\"oP\" />\n+ <Atom charge=\"-0.877922\" name=\"O14\" type=\"oP\" />\n+ <Atom charge=\"-0.520128\" name=\"O12\" type=\"oT\" />\n+ <Atom charge=\"-0.556992\" name=\"O11\" type=\"oT\" />\n+ <Atom charge=\"0.012366\" name=\"C1\" type=\"cA\" />\n+ <Atom charge=\"0.097347\" name=\"HA\" type=\"hE\" />\n+ <Atom charge=\"0.097347\" name=\"HB\" type=\"hE\" />\n+ <Atom charge=\"0.44065\" name=\"C2\" type=\"cA\" />\n+ <Atom charge=\"0.002473\" name=\"HS\" type=\"hE\" />\n+ <Atom charge=\"-0.634381\" name=\"O21\" type=\"oS\" />\n+ <Atom charge=\"0.891897\" name=\"C21\" type=\"cC\" />\n+ <Atom charge=\"-0.650291\" name=\"O22\" type=\"oC\" />\n+ <Atom charge=\"-0.143418\" name=\"C22\" type=\"cD\" />\n+ <Atom charge=\"0.042861\" name=\"H2R\" type=\"hL\" />\n+ <Atom charge=\"0.042861\" name=\"H2S\" type=\"hL\" />\n+ <Atom charge=\"0.271173\" name=\"C3\" type=\"cA\" />\n+ <Atom charge=\"0.037454\" name=\"HX\" type=\"hE\" />\n+ <Atom charge=\"0.037454\" name=\"HY\" type=\"hE\" />\n+ <Atom charge=\"-0.579073\" name=\"O31\" type=\"oS\" />\n+ <Atom charge=\"0.887549\" name=\"C31\" type=\"cC\" />\n+ <Atom charge=\"-0.663331\" name=\"O32\" type=\"oC\" />\n+ <Atom charge=\"-0.143418\" name=\"C32\" type=\"cD\" />\n+ <Atom charge=\"0.042861\" name=\"H2X\" type=\"hL\" />\n+ <Atom charge=\"0.042861\" name=\"H2Y\" type=\"hL\" />\n+ <Atom charge=\"0.001619\" name=\"C23\" type=\"cD\" />\n+ <Atom charge=\"0.019529\" name=\"H3R\" type=\"hL\" />\n+ <Atom charge=\"0.019529\" name=\"H3S\" type=\"hL\" />\n+ <Atom charge=\"-0.02296\" name=\"C24\" type=\"cD\" />\n+ <Atom charge=\"0.018134\" name=\"H4R\" type=\"hL\" />\n+ <Atom charge=\"0.018134\" name=\"H4S\" type=\"hL\" />\n+ <Atom charge=\"-0.016692\" name=\"C25\" type=\"cD\" />\n+ <Atom charge=\"0.00869\" name=\"H5R\" type=\"hL\" />\n+ <Atom charge=\"0.00869\" name=\"H5S\" type=\"hL\" />\n+ <Atom charge=\"-0.023789\" name=\"C26\" type=\"cD\" />\n+ <Atom charge=\"0.009266\" name=\"H6R\" type=\"hL\" />\n+ <Atom charge=\"0.009266\" name=\"H6S\" type=\"hL\" />\n+ <Atom charge=\"-0.017495\" name=\"C27\" type=\"cD\" />\n+ <Atom charge=\"0.019598\" name=\"H7R\" type=\"hL\" />\n+ <Atom charge=\"0.019598\" name=\"H7S\" type=\"hL\" />\n+ <Atom charge=\"0.031775\" name=\"C28\" type=\"cD\" />\n+ <Atom charge=\"0.032685\" name=\"H8R\" type=\"hL\" />\n+ <Atom charge=\"0.032685\" name=\"H8S\" type=\"hL\" />\n+ <Atom charge=\"-0.244228\" name=\"C29\" type=\"cB\" />\n+ <Atom charge=\"0.131512\" name=\"H9R\" type=\"hB\" />\n+ <Atom charge=\"-0.239284\" name=\"C210\" type=\"cB\" />\n+ <Atom charge=\"0.126878\" name=\"H10R\" type=\"hB\" />\n+ <Atom charge=\"0.029059\" name=\"C211\" type=\"cD\" />\n+ <Atom charge=\"0.033531\" name=\"H11R\" type=\"hL\" />\n+ <Atom charge=\"0.033531\" name=\"H11S\" type=\"hL\" />\n+ <Atom charge=\"-0.026353\" name=\"C212\" type=\"cD\" />\n+ <Atom charge=\"0.019717\" name=\"H12R\" type=\"hL\" />\n+ <Atom charge=\"0.019717\" name=\"H12S\" type=\"hL\" />\n+ <Atom charge=\"-0.018257\" name=\"C213\" type=\"cD\" />\n+ <Atom charge=\"0.0138\" name=\"H13R\" type=\"hL\" />\n+ <Atom charge=\"0.0138\" name=\"H13S\" type=\"hL\" />\n+ <Atom charge=\"-0.024849\" name=\"C214\" type=\"cD\" />\n+ <Atom charge=\"0.008572\" name=\"H14R\" type=\"hL\" />\n+ <Atom charge=\"0.008572\" name=\"H14S\" type=\"hL\" />\n+ <Atom charge=\"-0.023247\" name=\"C215\" type=\"cD\" />\n+ <Atom charge=\"0.010403\" name=\"H15R\" type=\"hL\" />\n+ <Atom charge=\"0.010403\" name=\"H15S\" type=\"hL\" />\n+ <Atom charge=\"-0.012488\" name=\"C216\" type=\"cD\" />\n+ <Atom charge=\"0.013659\" name=\"H16R\" type=\"hL\" />\n+ <Atom charge=\"0.013659\" name=\"H16S\" type=\"hL\" />\n+ <Atom charge=\"0.008684\" name=\"C217\" type=\"cD\" />\n+ <Atom charge=\"0.010026\" name=\"H17R\" type=\"hL\" />\n+ <Atom charge=\"0.010026\" name=\"H17S\" type=\"hL\" />\n+ <Atom charge=\"-0.11729\" name=\"C218\" type=\"cD\" />\n+ <Atom charge=\"0.026627\" name=\"H18R\" type=\"hL\" />\n+ <Atom charge=\"0.026627\" name=\"H18S\" type=\"hL\" />\n+ <Atom charge=\"0.026627\" name=\"H18T\" type=\"hL\" />\n+ <Atom charge=\"0.001619\" name=\"C33\" type=\"cD\" />\n+ <Atom charge=\"0.019529\" name=\"H3X\" type=\"hL\" />\n+ <Atom charge=\"0.019529\" name=\"H3Y\" type=\"hL\" />\n+ <Atom charge=\"-0.02296\" name=\"C34\" type=\"cD\" />\n+ <Atom charge=\"0.018134\" name=\"H4X\" type=\"hL\" />\n+ <Atom charge=\"0.018134\" name=\"H4Y\" type=\"hL\" />\n+ <Atom charge=\"-0.016692\" name=\"C35\" type=\"cD\" />\n+ <Atom charge=\"0.00869\" name=\"H5X\" type=\"hL\" />\n+ <Atom charge=\"0.00869\" name=\"H5Y\" type=\"hL\" />\n+ <Atom charge=\"-0.023789\" name=\"C36\" type=\"cD\" />\n+ <Atom charge=\"0.009266\" name=\"H6X\" type=\"hL\" />\n+ <Atom charge=\"0.009266\" name=\"H6Y\" type=\"hL\" />\n+ <Atom charge=\"-0.017495\" name=\"C37\" type=\"cD\" />\n+ <Atom charge=\"0.019598\" name=\"H7X\" type=\"hL\" />\n+ <Atom charge=\"0.019598\" name=\"H7Y\" type=\"hL\" />\n+ <Atom charge=\"0.031775\" name=\"C38\" type=\"cD\" />\n+ <Atom charge=\"0.032685\" name=\"H8X\" type=\"hL\" />\n+ <Atom charge=\"0.032685\" name=\"H8Y\" type=\"hL\" />\n+ <Atom charge=\"-0.244228\" name=\"C39\" type=\"cB\" />\n+ <Atom charge=\"0.131512\" name=\"H9X\" type=\"hB\" />\n+ <Atom charge=\"-0.239284\" name=\"C310\" type=\"cB\" />\n+ <Atom charge=\"0.126878\" name=\"H10X\" type=\"hB\" />\n+ <Atom charge=\"0.029059\" name=\"C311\" type=\"cD\" />\n+ <Atom charge=\"0.033531\" name=\"H11X\" type=\"hL\" />\n+ <Atom charge=\"0.033531\" name=\"H11Y\" type=\"hL\" />\n+ <Atom charge=\"-0.026353\" name=\"C312\" type=\"cD\" />\n+ <Atom charge=\"0.019717\" name=\"H12X\" type=\"hL\" />\n+ <Atom charge=\"0.019717\" name=\"H12Y\" type=\"hL\" />\n+ <Atom charge=\"-0.018257\" name=\"C313\" type=\"cD\" />\n+ <Atom charge=\"0.0138\" name=\"H13X\" type=\"hL\" />\n+ <Atom charge=\"0.0138\" name=\"H13Y\" type=\"hL\" />\n+ <Atom charge=\"-0.024849\" name=\"C314\" type=\"cD\" />\n+ <Atom charge=\"0.008572\" name=\"H14X\" type=\"hL\" />\n+ <Atom charge=\"0.008572\" name=\"H14Y\" type=\"hL\" />\n+ <Atom charge=\"-0.023247\" name=\"C315\" type=\"cD\" />\n+ <Atom charge=\"0.010403\" name=\"H15X\" type=\"hL\" />\n+ <Atom charge=\"0.010403\" name=\"H15Y\" type=\"hL\" />\n+ <Atom charge=\"-0.012488\" name=\"C316\" type=\"cD\" />\n+ <Atom charge=\"0.013659\" name=\"H16X\" type=\"hL\" />\n+ <Atom charge=\"0.013659\" name=\"H16Y\" type=\"hL\" />\n+ <Atom charge=\"0.008684\" name=\"C317\" type=\"cD\" />\n+ <Atom charge=\"0.010026\" name=\"H17X\" type=\"hL\" />\n+ <Atom charge=\"0.010026\" name=\"H17Y\" type=\"hL\" />\n+ <Atom charge=\"-0.11729\" name=\"C318\" type=\"cD\" />\n+ <Atom charge=\"0.026627\" name=\"H18X\" type=\"hL\" />\n+ <Atom charge=\"0.026627\" name=\"H18Y\" type=\"hL\" />\n+ <Atom charge=\"0.026627\" name=\"H18Z\" type=\"hL\" />\n+ <Bond atomName1=\"N\" atomName2=\"HN1\" />\n+ <Bond atomName1=\"N\" atomName2=\"HN2\" />\n+ <Bond atomName1=\"N\" atomName2=\"HN3\" />\n+ <Bond atomName1=\"N\" atomName2=\"C12\" />\n+ <Bond atomName1=\"O13B\" atomName2=\"C13\" />\n+ <Bond atomName1=\"C13\" atomName2=\"C12\" />\n+ <Bond atomName1=\"C13\" atomName2=\"O13A\" />\n+ <Bond atomName1=\"C12\" atomName2=\"H12A\" />\n+ <Bond atomName1=\"C12\" atomName2=\"C11\" />\n+ <Bond atomName1=\"C1\" atomName2=\"O11\" />\n+ <Bond atomName1=\"C11\" atomName2=\"H11A\" />\n+ <Bond atomName1=\"C11\" atomName2=\"H11B\" />\n+ <Bond atomName1=\"C11\" atomName2=\"O12\" />\n+ <Bond atomName1=\"O12\" atomName2=\"P\" />\n+ <Bond atomName1=\"P\" atomName2=\"O11\" />\n+ <Bond atomName1=\"P\" atomName2=\"O13\" />\n+ <Bond atomName1=\"P\" atomName2=\"O14\" />\n+ <Bond atomName1=\"C1\" atomName2=\"HA\" />\n+ <Bond atomName1=\"C1\" atomName2=\"HB\" />\n+ <Bond atomName1=\"C1\" atomName2=\"C2\" />\n+ <Bond atomName1=\"C2\" atomName2=\"HS\" />\n+ <Bond atomName1=\"C2\" atomName2=\"C3\" />\n+ <Bond atomName1=\"C2\" atomName2=\"O21\" />\n+ <Bond atomName1=\"C3\" atomName2=\"HX\" />\n+ <Bond atomName1=\"C3\" atomName2=\"HY\" />\n+ <Bond atomName1=\"C3\" atomName2=\"O31\" />\n+ <Bond atomName1=\"O21\" atomName2=\"C21\" />\n+ <Bond atomName1=\"C21\" atomName2=\"C22\" />\n+ <Bond atomName1=\"C21\" atomName2=\"O22\" />\n+ <Bond atomName1=\"C22\" atomName2=\"H2R\" />\n+ <Bond atomName1=\"C22\" atomName2=\"H2S\" />\n+ <Bond atomName1=\"C22\" atomName2=\"C23\" />\n+ <Bond atomName1=\"C23\" atomName2=\"H3R\" />\n+ <Bond atomName1=\"C23\" atomName2=\"H3S\" />\n+ <Bond atomName1=\"C23\" atomName2=\"C24\" />\n+ <Bond atomName1=\"C24\" atomName2=\"H4R\" />\n+ <Bond atomName1=\"C24\" atomName2=\"H4S\" />\n+ <Bond atomName1=\"C24\" atomName2=\"C25\" />\n+ <Bond atomName1=\"C25\" atomName2=\"H5R\" />\n+ <Bond atomName1=\"C25\" atomName2=\"H5S\" />\n+ <Bond atomName1=\"C25\" atomName2=\"C26\" />\n+ <Bond atomName1=\"C26\" atomName2=\"H6R\" />\n+ <Bond atomName1=\"C26\" atomName2=\"H6S\" />\n+ <Bond atomName1=\"C26\" atomName2=\"C27\" />\n+ <Bond atomName1=\"C27\" atomName2=\"H7R\" />\n+ <Bond atomName1=\"C27\" atomName2=\"H7S\" />\n+ <Bond atomName1=\"C27\" atomName2=\"C28\" />\n+ <Bond atomName1=\"C28\" atomName2=\"H8R\" />\n+ <Bond atomName1=\"C28\" atomName2=\"H8S\" />\n+ <Bond atomName1=\"C28\" atomName2=\"C29\" />\n+ <Bond atomName1=\"C29\" atomName2=\"H9R\" />\n+ <Bond atomName1=\"C29\" atomName2=\"C210\" />\n+ <Bond atomName1=\"C210\" atomName2=\"H10R\" />\n+ <Bond atomName1=\"C210\" atomName2=\"C211\" />\n+ <Bond atomName1=\"C211\" atomName2=\"H11R\" />\n+ <Bond atomName1=\"C211\" atomName2=\"H11S\" />\n+ <Bond atomName1=\"C211\" atomName2=\"C212\" />\n+ <Bond atomName1=\"C212\" atomName2=\"H12R\" />\n+ <Bond atomName1=\"C212\" atomName2=\"H12S\" />\n+ <Bond atomName1=\"C212\" atomName2=\"C213\" />\n+ <Bond atomName1=\"C213\" atomName2=\"H13R\" />\n+ <Bond atomName1=\"C213\" atomName2=\"H13S\" />\n+ <Bond atomName1=\"C213\" atomName2=\"C214\" />\n+ <Bond atomName1=\"C214\" atomName2=\"H14R\" />\n+ <Bond atomName1=\"C214\" atomName2=\"H14S\" />\n+ <Bond atomName1=\"C214\" atomName2=\"C215\" />\n+ <Bond atomName1=\"C215\" atomName2=\"H15R\" />\n+ <Bond atomName1=\"C215\" atomName2=\"H15S\" />\n+ <Bond atomName1=\"C215\" atomName2=\"C216\" />\n+ <Bond atomName1=\"C216\" atomName2=\"H16R\" />\n+ <Bond atomName1=\"C216\" atomName2=\"H16S\" />\n+ <Bond atomName1=\"C216\" atomName2=\"C217\" />\n+ <Bond atomName1=\"C217\" atomName2=\"H17R\" />\n+ <Bond atomName1=\"C217\" atomName2=\"H17S\" />\n+ <Bond atomName1=\"C217\" atomName2=\"C218\" />\n+ <Bond atomName1=\"C218\" atomName2=\"H18R\" />\n+ <Bond atomName1=\"C218\" atomName2=\"H18S\" />\n+ <Bond atomName1=\"C218\" atomName2=\"H18T\" />\n+ <Bond atomName1=\"O31\" atomName2=\"C31\" />\n+ <Bond atomName1=\"C31\" atomName2=\"C32\" />\n+ <Bond atomName1=\"C31\" atomName2=\"O32\" />\n+ <Bond atomName1=\"C32\" atomName2=\"H2X\" />\n+ <Bond atomName1=\"C32\" atomName2=\"H2Y\" />\n+ <Bond atomName1=\"C32\" atomName2=\"C33\" />\n+ <Bond atomName1=\"C33\" atomName2=\"H3X\" />\n+ <Bond atomName1=\"C33\" atomName2=\"H3Y\" />\n+ <Bond atomName1=\"C33\" atomName2=\"C34\" />\n+ <Bond atomName1=\"C34\" atomName2=\"H4X\" />\n+ <Bond atomName1=\"C34\" atomName2=\"H4Y\" />\n+ <Bond atomName1=\"C34\" atomName2=\"C35\" />\n+ <Bond atomName1=\"C35\" atomName2=\"H5X\" />\n+ <Bond atomName1=\"C35\" atomName2=\"H5Y\" />\n+ <Bond atomName1=\"C35\" atomName2=\"C36\" />\n+ <Bond atomName1=\"C36\" atomName2=\"H6X\" />\n+ <Bond atomName1=\"C36\" atomName2=\"H6Y\" />\n+ <Bond atomName1=\"C36\" atomName2=\"C37\" />\n+ <Bond atomName1=\"C37\" atomName2=\"H7X\" />\n+ <Bond atomName1=\"C37\" atomName2=\"H7Y\" />\n+ <Bond atomName1=\"C37\" atomName2=\"C38\" />\n+ <Bond atomName1=\"C38\" atomName2=\"H8X\" />\n+ <Bond atomName1=\"C38\" atomName2=\"H8Y\" />\n+ <Bond atomName1=\"C38\" atomName2=\"C39\" />\n+ <Bond atomName1=\"C39\" atomName2=\"H9X\" />\n+ <Bond atomName1=\"C39\" atomName2=\"C310\" />\n+ <Bond atomName1=\"C310\" atomName2=\"H10X\" />\n+ <Bond atomName1=\"C310\" atomName2=\"C311\" />\n+ <Bond atomName1=\"C311\" atomName2=\"H11X\" />\n+ <Bond atomName1=\"C311\" atomName2=\"H11Y\" />\n+ <Bond atomName1=\"C311\" atomName2=\"C312\" />\n+ <Bond atomName1=\"C312\" atomName2=\"H12X\" />\n+ <Bond atomName1=\"C312\" atomName2=\"H12Y\" />\n+ <Bond atomName1=\"C312\" atomName2=\"C313\" />\n+ <Bond atomName1=\"C313\" atomName2=\"H13X\" />\n+ <Bond atomName1=\"C313\" atomName2=\"H13Y\" />\n+ <Bond atomName1=\"C313\" atomName2=\"C314\" />\n+ <Bond atomName1=\"C314\" atomName2=\"H14X\" />\n+ <Bond atomName1=\"C314\" atomName2=\"H14Y\" />\n+ <Bond atomName1=\"C314\" atomName2=\"C315\" />\n+ <Bond atomName1=\"C315\" atomName2=\"H15X\" />\n+ <Bond atomName1=\"C315\" atomName2=\"H15Y\" />\n+ <Bond atomName1=\"C315\" atomName2=\"C316\" />\n+ <Bond atomName1=\"C316\" atomName2=\"H16X\" />\n+ <Bond atomName1=\"C316\" atomName2=\"H16Y\" />\n+ <Bond atomName1=\"C316\" atomName2=\"C317\" />\n+ <Bond atomName1=\"C317\" atomName2=\"H17X\" />\n+ <Bond atomName1=\"C317\" atomName2=\"H17Y\" />\n+ <Bond atomName1=\"C317\" atomName2=\"C318\" />\n+ <Bond atomName1=\"C318\" atomName2=\"H18X\" />\n+ <Bond atomName1=\"C318\" atomName2=\"H18Y\" />\n+ <Bond atomName1=\"C318\" atomName2=\"H18Z\" />\n+ </Residue>\n+ <Residue name=\"DOPA\">\n+ <Atom charge=\"1.456663\" name=\"P\" type=\"pA\" />\n+ <Atom charge=\"-0.914158\" name=\"O13\" type=\"oP\" />\n+ <Atom charge=\"-0.914158\" name=\"O14\" type=\"oP\" />\n+ <Atom charge=\"-0.706197\" name=\"O12\" type=\"oH\" />\n+ <Atom charge=\"0.415628\" name=\"H12\" type=\"hO\" />\n+ <Atom charge=\"-0.594197\" name=\"O11\" type=\"oT\" />\n+ <Atom charge=\"0.081528\" name=\"C1\" type=\"cA\" />\n+ <Atom charge=\"0.083099\" name=\"HA\" type=\"hE\" />\n+ <Atom charge=\"0.083099\" name=\"HB\" type=\"hE\" />\n+ <Atom charge=\"0.283546\" name=\"C2\" type=\"cA\" />\n+ <Atom charge=\"0.063862\" name=\"HS\" type=\"hE\" />\n+ <Atom charge=\"-0.554487\" name=\"O21\" type=\"oS\" />\n+ <Atom charge=\"0.897502\" name=\"C21\" type=\"cC\" />\n+ <Atom charge=\"-0.671622\" name=\"O22\" type=\"oC\" />\n+ <Atom charge=\"-0.143418\" name=\"C22\" type=\"cD\" />\n+ <Atom charge=\"0.042861\" name=\"H2R\" type=\"hL\" />\n+ <Atom charge=\"0.042861\" name=\"H2S\" type=\"hL\" />\n+ <Atom charge=\"0.185299\" name=\"C3\" type=\"cA\" />\n+ <Atom charge=\"0.067676\" name=\"HX\" type=\"hE\" />\n+ <Atom charge=\"0.067676\" name=\"HY\" type=\"hE\" />\n+ <Atom charge=\"-0.547824\" name=\"O31\" type=\"oS\" />\n+ <Atom charge=\"0.888207\" name=\"C31\" type=\"cC\" />\n+ <Atom charge=\"-0.671142\" name=\"O32\" type=\"oC\" />\n+ <Atom charge=\"-0.143418\" name=\"C32\" type=\"cD\" />\n+ <Atom charge=\"0.042861\" name=\"H2X\" type=\"hL\" />\n+ <Atom charge=\"0.042861\" name=\"H2Y\" type=\"hL\" />\n+ <Atom charge=\"0.001619\" name=\"C23\" type=\"cD\" />\n+ <Atom charge=\"0.019529\" name=\"H3R\" type=\"hL\" />\n+ <Atom charge=\"0.019529\" name=\"H3S\" type=\"hL\" />\n+ <Atom charge=\"-0.02296\" name=\"C24\" type=\"cD\" />\n+ <Atom charge=\"0.018134\" name=\"H4R\" type=\"hL\" />\n+ <Atom charge=\"0.018134\" name=\"H4S\" type=\"hL\" />\n+ <Atom charge=\"-0.016692\" name=\"C25\" type=\"cD\" />\n+ <Atom charge=\"0.00869\" name=\"H5R\" type=\"hL\" />\n+ <Atom charge=\"0.00869\" name=\"H5S\" type=\"hL\" />\n+ <Atom charge=\"-0.023789\" name=\"C26\" type=\"cD\" />\n+ <Atom charge=\"0.009266\" name=\"H6R\" type=\"hL\" />\n+ <Atom charge=\"0.009266\" name=\"H6S\" type=\"hL\" />\n+ <Atom charge=\"-0.017495\" name=\"C27\" type=\"cD\" />\n+ <Atom charge=\"0.019598\" name=\"H7R\" type=\"hL\" />\n+ <Atom charge=\"0.019598\" name=\"H7S\" type=\"hL\" />\n+ <Atom charge=\"0.031775\" name=\"C28\" type=\"cD\" />\n+ <Atom charge=\"0.032685\" name=\"H8R\" type=\"hL\" />\n+ <Atom charge=\"0.032685\" name=\"H8S\" type=\"hL\" />\n+ <Atom charge=\"-0.244228\" name=\"C29\" type=\"cB\" />\n+ <Atom charge=\"0.131512\" name=\"H9R\" type=\"hB\" />\n+ <Atom charge=\"-0.239284\" name=\"C210\" type=\"cB\" />\n+ <Atom charge=\"0.126878\" name=\"H10R\" type=\"hB\" />\n+ <Atom charge=\"0.029059\" name=\"C211\" type=\"cD\" />\n+ <Atom charge=\"0.033531\" name=\"H11R\" type=\"hL\" />\n+ <Atom charge=\"0.033531\" name=\"H11S\" type=\"hL\" />\n+ <Atom charge=\"-0.026353\" name=\"C212\" type=\"cD\" />\n+ <Atom charge=\"0.019717\" name=\"H12R\" type=\"hL\" />\n+ <Atom charge=\"0.019717\" name=\"H12S\" type=\"hL\" />\n+ <Atom charge=\"-0.018257\" name=\"C213\" type=\"cD\" />\n+ <Atom charge=\"0.0138\" name=\"H13R\" type=\"hL\" />\n+ <Atom charge=\"0.0138\" name=\"H13S\" type=\"hL\" />\n+ <Atom charge=\"-0.024849\" name=\"C214\" type=\"cD\" />\n+ <Atom charge=\"0.008572\" name=\"H14R\" type=\"hL\" />\n+ <Atom charge=\"0.008572\" name=\"H14S\" type=\"hL\" />\n+ <Atom charge=\"-0.023247\" name=\"C215\" type=\"cD\" />\n+ <Atom charge=\"0.010403\" name=\"H15R\" type=\"hL\" />\n+ <Atom charge=\"0.010403\" name=\"H15S\" type=\"hL\" />\n+ <Atom charge=\"-0.012488\" name=\"C216\" type=\"cD\" />\n+ <Atom charge=\"0.013659\" name=\"H16R\" type=\"hL\" />\n+ <Atom charge=\"0.013659\" name=\"H16S\" type=\"hL\" />\n+ <Atom charge=\"0.008684\" name=\"C217\" type=\"cD\" />\n+ <Atom charge=\"0.010026\" name=\"H17R\" type=\"hL\" />\n+ <Atom charge=\"0.010026\" name=\"H17S\" type=\"hL\" />\n+ <Atom charge=\"-0.11729\" name=\"C218\" type=\"cD\" />\n+ <Atom charge=\"0.026627\" name=\"H18R\" type=\"hL\" />\n+ <Atom charge=\"0.026627\" name=\"H18S\" type=\"hL\" />\n+ <Atom charge=\"0.026627\" name=\"H18T\" type=\"hL\" />\n+ <Atom charge=\"0.001619\" name=\"C33\" type=\"cD\" />\n+ <Atom charge=\"0.019529\" name=\"H3X\" type=\"hL\" />\n+ <Atom charge=\"0.019529\" name=\"H3Y\" type=\"hL\" />\n+ <Atom charge=\"-0.02296\" name=\"C34\" type=\"cD\" />\n+ <Atom charge=\"0.018134\" name=\"H4X\" type=\"hL\" />\n+ <Atom charge=\"0.018134\" name=\"H4Y\" type=\"hL\" />\n+ <Atom charge=\"-0.016692\" name=\"C35\" type=\"cD\" />\n+ <Atom charge=\"0.00869\" name=\"H5X\" type=\"hL\" />\n+ <Atom charge=\"0.00869\" name=\"H5Y\" type=\"hL\" />\n+ <Atom charge=\"-0.023789\" name=\"C36\" type=\"cD\" />\n+ <Atom charge=\"0.009266\" name=\"H6X\" type=\"hL\" />\n+ <Atom charge=\"0.009266\" name=\"H6Y\" type=\"hL\" />\n+ <Atom charge=\"-0.017495\" name=\"C37\" type=\"cD\" />\n+ <Atom charge=\"0.019598\" name=\"H7X\" type=\"hL\" />\n+ <Atom charge=\"0.019598\" name=\"H7Y\" type=\"hL\" />\n+ <Atom charge=\"0.031775\" name=\"C38\" type=\"cD\" />\n+ <Atom charge=\"0.032685\" name=\"H8X\" type=\"hL\" />\n+ <Atom charge=\"0.032685\" name=\"H8Y\" type=\"hL\" />\n+ <Atom charge=\"-0.244228\" name=\"C39\" type=\"cB\" />\n+ <Atom charge=\"0.131512\" name=\"H9X\" type=\"hB\" />\n+ <Atom charge=\"-0.239284\" name=\"C310\" type=\"cB\" />\n+ <Atom charge=\"0.126878\" name=\"H10X\" type=\"hB\" />\n+ <Atom charge=\"0.029059\" name=\"C311\" type=\"cD\" />\n+ <Atom charge=\"0.033531\" name=\"H11X\" type=\"hL\" />\n+ <Atom charge=\"0.033531\" name=\"H11Y\" type=\"hL\" />\n+ <Atom charge=\"-0.026353\" name=\"C312\" type=\"cD\" />\n+ <Atom charge=\"0.019717\" name=\"H12X\" type=\"hL\" />\n+ <Atom charge=\"0.019717\" name=\"H12Y\" type=\"hL\" />\n+ <Atom charge=\"-0.018257\" name=\"C313\" type=\"cD\" />\n+ <Atom charge=\"0.0138\" name=\"H13X\" type=\"hL\" />\n+ <Atom charge=\"0.0138\" name=\"H13Y\" type=\"hL\" />\n+ <Atom charge=\"-0.024849\" name=\"C314\" type=\"cD\" />\n+ <Atom charge=\"0.008572\" name=\"H14X\" type=\"hL\" />\n+ <Atom charge=\"0.008572\" name=\"H14Y\" type=\"hL\" />\n+ <Atom charge=\"-0.023247\" name=\"C315\" type=\"cD\" />\n+ <Atom charge=\"0.010403\" name=\"H15X\" type=\"hL\" />\n+ <Atom charge=\"0.010403\" name=\"H15Y\" type=\"hL\" />\n+ <Atom charge=\"-0.012488\" name=\"C316\" type=\"cD\" />\n+ <Atom charge=\"0.013659\" name=\"H16X\" type=\"hL\" />\n+ <Atom charge=\"0.013659\" name=\"H16Y\" type=\"hL\" />\n+ <Atom charge=\"0.008684\" name=\"C317\" type=\"cD\" />\n+ <Atom charge=\"0.010026\" name=\"H17X\" type=\"hL\" />\n+ <Atom charge=\"0.010026\" name=\"H17Y\" type=\"hL\" />\n+ <Atom charge=\"-0.11729\" name=\"C318\" type=\"cD\" />\n+ <Atom charge=\"0.026627\" name=\"H18X\" type=\"hL\" />\n+ <Atom charge=\"0.026627\" name=\"H18Y\" type=\"hL\" />\n+ <Atom charge=\"0.026627\" name=\"H18Z\" type=\"hL\" />\n+ <Bond atomName1=\"O12\" atomName2=\"P\" />\n+ <Bond atomName1=\"P\" atomName2=\"O11\" />\n+ <Bond atomName1=\"P\" atomName2=\"O13\" />\n+ <Bond atomName1=\"P\" atomName2=\"O14\" />\n+ <Bond atomName1=\"O12\" atomName2=\"H12\" />\n+ <Bond atomName1=\"O11\" atomName2=\"C1\" />\n+ <Bond atomName1=\"C1\" atomName2=\"HA\" />\n+ <Bond atomName1=\"C1\" atomName2=\"HB\" />\n+ <Bond atomName1=\"C1\" atomName2=\"C2\" />\n+ <Bond atomName1=\"C2\" atomName2=\"HS\" />\n+ <Bond atomName1=\"C2\" atomName2=\"C3\" />\n+ <Bond atomName1=\"C2\" atomName2=\"O21\" />\n+ <Bond atomName1=\"C3\" atomName2=\"HX\" />\n+ <Bond atomName1=\"C3\" atomName2=\"HY\" />\n+ <Bond atomName1=\"C3\" atomName2=\"O31\" />\n+ <Bond atomName1=\"O21\" atomName2=\"C21\" />\n+ <Bond atomName1=\"C21\" atomName2=\"C22\" />\n+ <Bond atomName1=\"C21\" atomName2=\"O22\" />\n+ <Bond atomName1=\"C22\" atomName2=\"H2R\" />\n+ <Bond atomName1=\"C22\" atomName2=\"H2S\" />\n+ <Bond atomName1=\"C22\" atomName2=\"C23\" />\n+ <Bond atomName1=\"C23\" atomName2=\"H3R\" />\n+ <Bond atomName1=\"C23\" atomName2=\"H3S\" />\n+ <Bond atomName1=\"C23\" atomName2=\"C24\" />\n+ <Bond atomName1=\"C24\" atomName2=\"H4R\" />\n+ <Bond atomName1=\"C24\" atomName2=\"H4S\" />\n+ <Bond atomName1=\"C24\" atomName2=\"C25\" />\n+ <Bond atomName1=\"C25\" atomName2=\"H5R\" />\n+ <Bond atomName1=\"C25\" atomName2=\"H5S\" />\n+ <Bond atomName1=\"C25\" atomName2=\"C26\" />\n+ <Bond atomName1=\"C26\" atomName2=\"H6R\" />\n+ <Bond atomName1=\"C26\" atomName2=\"H6S\" />\n+ <Bond atomName1=\"C26\" atomName2=\"C27\" />\n+ <Bond atomName1=\"C27\" atomName2=\"H7R\" />\n+ <Bond atomName1=\"C27\" atomName2=\"H7S\" />\n+ <Bond atomName1=\"C27\" atomName2=\"C28\" />\n+ <Bond atomName1=\"C28\" atomName2=\"H8R\" />\n+ <Bond atomName1=\"C28\" atomName2=\"H8S\" />\n+ <Bond atomName1=\"C28\" atomName2=\"C29\" />\n+ <Bond atomName1=\"C29\" atomName2=\"H9R\" />\n+ <Bond atomName1=\"C29\" atomName2=\"C210\" />\n+ <Bond atomName1=\"C210\" atomName2=\"H10R\" />\n+ <Bond atomName1=\"C210\" atomName2=\"C211\" />\n+ <Bond atomName1=\"C211\" atomName2=\"H11R\" />\n+ <Bond atomName1=\"C211\" atomName2=\"H11S\" />\n+ <Bond atomName1=\"C211\" atomName2=\"C212\" />\n+ <Bond atomName1=\"C212\" atomName2=\"H12R\" />\n+ <Bond atomName1=\"C212\" atomName2=\"H12S\" />\n+ <Bond atomName1=\"C212\" atomName2=\"C213\" />\n+ <Bond atomName1=\"C213\" atomName2=\"H13R\" />\n+ <Bond atomName1=\"C213\" atomName2=\"H13S\" />\n+ <Bond atomName1=\"C213\" atomName2=\"C214\" />\n+ <Bond atomName1=\"C214\" atomName2=\"H14R\" />\n+ <Bond atomName1=\"C214\" atomName2=\"H14S\" />\n+ <Bond atomName1=\"C214\" atomName2=\"C215\" />\n+ <Bond atomName1=\"C215\" atomName2=\"H15R\" />\n+ <Bond atomName1=\"C215\" atomName2=\"H15S\" />\n+ <Bond atomName1=\"C215\" atomName2=\"C216\" />\n+ <Bond atomName1=\"C216\" atomName2=\"H16R\" />\n+ <Bond atomName1=\"C216\" atomName2=\"H16S\" />\n+ <Bond atomName1=\"C216\" atomName2=\"C217\" />\n+ <Bond atomName1=\"C217\" atomName2=\"H17R\" />\n+ <Bond atomName1=\"C217\" atomName2=\"H17S\" />\n+ <Bond atomName1=\"C217\" atomName2=\"C218\" />\n+ <Bond atomName1=\"C218\" atomName2=\"H18R\" />\n+ <Bond atomName1=\"C218\" atomName2=\"H18S\" />\n+ <Bond atomName1=\"C218\" atomName2=\"H18T\" />\n+ <Bond atomName1=\"O31\" atomName2=\"C31\" />\n+ <Bond atomName1=\"C31\" atomName2=\"C32\" />\n+ <Bond atomName1=\"C31\" atomName2=\"O32\" />\n+ <Bond atomName1=\"C32\" atomName2=\"H2X\" />\n+ <Bond atomName1=\"C32\" atomName2=\"H2Y\" />\n+ <Bond atomName1=\"C32\" atomName2=\"C33\" />\n+ <Bond atomName1=\"C33\" atomName2=\"H3X\" />\n+ <Bond atomName1=\"C33\" atomName2=\"H3Y\" />\n+ <Bond atomName1=\"C33\" atomName2=\"C34\" />\n+ <Bond atomName1=\"C34\" atomName2=\"H4X\" />\n+ <Bond atomName1=\"C34\" atomName2=\"H4Y\" />\n+ <Bond atomName1=\"C34\" atomName2=\"C35\" />\n+ <Bond atomName1=\"C35\" atomName2=\"H5X\" />\n+ <Bond atomName1=\"C35\" atomName2=\"H5Y\" />\n+ <Bond atomName1=\"C35\" atomName2=\"C36\" />\n+ <Bond atomName1=\"C36\" atomName2=\"H6X\" />\n+ <Bond atomName1=\"C36\" atomName2=\"H6Y\" />\n+ <Bond atomName1=\"C36\" atomName2=\"C37\" />\n+ <Bond atomName1=\"C37\" atomName2=\"H7X\" />\n+ <Bond atomName1=\"C37\" atomName2=\"H7Y\" />\n+ <Bond atomName1=\"C37\" atomName2=\"C38\" />\n+ <Bond atomName1=\"C38\" atomName2=\"H8X\" />\n+ <Bond atomName1=\"C38\" atomName2=\"H8Y\" />\n+ <Bond atomName1=\"C38\" atomName2=\"C39\" />\n+ <Bond atomName1=\"C39\" atomName2=\"H9X\" />\n+ <Bond atomName1=\"C39\" atomName2=\"C310\" />\n+ <Bond atomName1=\"C310\" atomName2=\"H10X\" />\n+ <Bond atomName1=\"C310\" atomName2=\"C311\" />\n+ <Bond atomName1=\"C311\" atomName2=\"H11X\" />\n+ <Bond atomName1=\"C311\" atomName2=\"H11Y\" />\n+ <Bond atomName1=\"C311\" atomName2=\"C312\" />\n+ <Bond atomName1=\"C312\" atomName2=\"H12X\" />\n+ <Bond atomName1=\"C312\" atomName2=\"H12Y\" />\n+ <Bond atomName1=\"C312\" atomName2=\"C313\" />\n+ <Bond atomName1=\"C313\" atomName2=\"H13X\" />\n+ <Bond atomName1=\"C313\" atomName2=\"H13Y\" />\n+ <Bond atomName1=\"C313\" atomName2=\"C314\" />\n+ <Bond atomName1=\"C314\" atomName2=\"H14X\" />\n+ <Bond atomName1=\"C314\" atomName2=\"H14Y\" />\n+ <Bond atomName1=\"C314\" atomName2=\"C315\" />\n+ <Bond atomName1=\"C315\" atomName2=\"H15X\" />\n+ <Bond atomName1=\"C315\" atomName2=\"H15Y\" />\n+ <Bond atomName1=\"C315\" atomName2=\"C316\" />\n+ <Bond atomName1=\"C316\" atomName2=\"H16X\" />\n+ <Bond atomName1=\"C316\" atomName2=\"H16Y\" />\n+ <Bond atomName1=\"C316\" atomName2=\"C317\" />\n+ <Bond atomName1=\"C317\" atomName2=\"H17X\" />\n+ <Bond atomName1=\"C317\" atomName2=\"H17Y\" />\n+ <Bond atomName1=\"C317\" atomName2=\"C318\" />\n+ <Bond atomName1=\"C318\" atomName2=\"H18X\" />\n+ <Bond atomName1=\"C318\" atomName2=\"H18Y\" />\n+ <Bond atomName1=\"C318\" atomName2=\"H18Z\" />\n+ </Residue>\n+ <Residue name=\"DOPG\">\n+ <Atom charge=\"0.193597\" name=\"C13\" type=\"cA\" />\n+ <Atom charge=\"0.034715\" name=\"H13A\" type=\"hE\" />\n+ <Atom charge=\"0.034715\" name=\"H13B\" type=\"hE\" />\n+ <Atom charge=\"-0.700871\" name=\"OC3\" type=\"oH\" />\n+ <Atom charge=\"0.423328\" name=\"HO3\" type=\"hO\" />\n+ <Atom charge=\"0.336816\" name=\"C12\" type=\"cA\" />\n+ <Atom charge=\"0.030042\" name=\"H12A\" type=\"hE\" />\n+ <Atom charge=\"-0.726192\" name=\"OC2\" type=\"oH\" />\n+ <Atom charge=\"0.439523\" name=\"HO2\" type=\"hO\" />\n+ <Atom charge=\"-0.056706\" name=\"C11\" type=\"cA\" />\n+ <Atom charge=\"0.093354\" name=\"H11A\" type=\"hE\" />\n+ <Atom charge=\"0.093354\" name=\"H11B\" type=\"hE\" />\n+ <Atom charge=\"1.380464\" name=\"P\" type=\"pA\" />\n+ <Atom charge=\"-0.873444\" name=\"O13\" type=\"oP\" />\n+ <Atom charge=\"-0.873444\" name=\"O14\" type=\"oP\" />\n+ <Atom charge=\"-0.534308\" name=\"O12\" type=\"oT\" />\n+ <Atom charge=\"-0.546098\" name=\"O11\" type=\"oT\" />\n+ <Atom charge=\"0.043713\" name=\"C1\" type=\"cA\" />\n+ <Atom charge=\"0.091041\" name=\"HA\" type=\"hE\" />\n+ <Atom charge=\"0.091041\" name=\"HB\" type=\"hE\" />\n+ <Atom charge=\"0.353807\" name=\"C2\" type=\"cA\" />\n+ <Atom charge=\"0.037488\" name=\"HS\" type=\"hE\" />\n+ <Atom charge=\"-0.599131\" name=\"O21\" type=\"oS\" />\n+ <Atom charge=\"0.883669\" name=\"C21\" type=\"cC\" />\n+ <Atom charge=\"-0.655762\" name=\"O22\" type=\"oC\" />\n+ <Atom charge=\"-0.143418\" name=\"C22\" type=\"cD\" />\n+ <Atom charge=\"0.042861\" name=\"H2R\" type=\"hL\" />\n+ <Atom charge=\"0.042861\" name=\"H2S\" type=\"hL\" />\n+ <Atom charge=\"0.295119\" name=\"C3\" type=\"cA\" />\n+ <Atom charge=\"0.033797\" name=\"HX\" type=\"hE\" />\n+ <Atom charge=\"0.033797\" name=\"HY\" type=\"hE\" />\n+ <Atom charge=\"-0.585165\" name=\"O31\" type=\"oS\" />\n+ <Atom charge=\"0.877006\" name=\"C31\" type=\"cC\" />\n+ <Atom charge=\"-0.649265\" name=\"O32\" type=\"oC\" />\n+ <Atom charge=\"-0.143418\" name=\"C32\" type=\"cD\" />\n+ <Atom charge=\"0.042861\" name=\"H2X\" type=\"hL\" />\n+ <Atom charge=\"0.042861\" name=\"H2Y\" type=\"hL\" />\n+ <Atom charge=\"0.001619\" name=\"C23\" type=\"cD\" />\n+ <Atom charge=\"0.019529\" name=\"H3R\" type=\"hL\" />\n+ <Atom charge=\"0.019529\" name=\"H3S\" type=\"hL\" />\n+ <Atom charge=\"-0.02296\" name=\"C24\" type=\"cD\" />\n+ <Atom charge=\"0.018134\" name=\"H4R\" type=\"hL\" />\n+ <Atom charge=\"0.018134\" name=\"H4S\" type=\"hL\" />\n+ <Atom charge=\"-0.016692\" name=\"C25\" type=\"cD\" />\n+ <Atom charge=\"0.00869\" name=\"H5R\" type=\"hL\" />\n+ <Atom charge=\"0.00869\" name=\"H5S\" type=\"hL\" />\n+ <Atom charge=\"-0.023789\" name=\"C26\" type=\"cD\" />\n+ <Atom charge=\"0.009266\" name=\"H6R\" type=\"hL\" />\n+ <Atom charge=\"0.009266\" name=\"H6S\" type=\"hL\" />\n+ <Atom charge=\"-0.017495\" name=\"C27\" type=\"cD\" />\n+ <Atom charge=\"0.019598\" name=\"H7R\" type=\"hL\" />\n+ <Atom charge=\"0.019598\" name=\"H7S\" type=\"hL\" />\n+ <Atom charge=\"0.031775\" name=\"C28\" type=\"cD\" />\n+ <Atom charge=\"0.032685\" name=\"H8R\" type=\"hL\" />\n+ <Atom charge=\"0.032685\" name=\"H8S\" type=\"hL\" />\n+ <Atom charge=\"-0.244228\" name=\"C29\" type=\"cB\" />\n+ <Atom charge=\"0.131512\" name=\"H9R\" type=\"hB\" />\n+ <Atom charge=\"-0.239284\" name=\"C210\" type=\"cB\" />\n+ <Atom charge=\"0.126878\" name=\"H10R\" type=\"hB\" />\n+ <Atom charge=\"0.029059\" name=\"C211\" type=\"cD\" />\n+ <Atom charge=\"0.033531\" name=\"H11R\" type=\"hL\" />\n+ <Atom charge=\"0.033531\" name=\"H11S\" type=\"hL\" />\n+ <Atom charge=\"-0.026353\" name=\"C212\" type=\"cD\" />\n+ <Atom charge=\"0.019717\" name=\"H12R\" type=\"hL\" />\n+ <Atom charge=\"0.019717\" name=\"H12S\" type=\"hL\" />\n+ <Atom charge=\"-0.018257\" name=\"C213\" type=\"cD\" />\n+ <Atom charge=\"0.0138\" name=\"H13R\" type=\"hL\" />\n+ <Atom charge=\"0.0138\" name=\"H13S\" type=\"hL\" />\n+ <Atom charge=\"-0.024849\" name=\"C214\" type=\"cD\" />\n+ <Atom charge=\"0.008572\" name=\"H14R\" type=\"hL\" />\n+ <Atom charge=\"0.008572\" name=\"H14S\" type=\"hL\" />\n+ <Atom charge=\"-0.023247\" name=\"C215\" type=\"cD\" />\n+ <Atom charge=\"0.010403\" name=\"H15R\" type=\"hL\" />\n+ <Atom charge=\"0.010403\" name=\"H15S\" type=\"hL\" />\n+ <Atom charge=\"-0.012488\" name=\"C216\" type=\"cD\" />\n+ <Atom charge=\"0.013659\" name=\"H16R\" type=\"hL\" />\n+ <Atom charge=\"0.013659\" name=\"H16S\" type=\"hL\" />\n+ <Atom charge=\"0.008684\" name=\"C217\" type=\"cD\" />\n+ <Atom charge=\"0.010026\" name=\"H17R\" type=\"hL\" />\n+ <Atom charge=\"0.010026\" name=\"H17S\" type=\"hL\" />\n+ <Atom charge=\"-0.11729\" name=\"C218\" type=\"cD\" />\n+ <Atom charge=\"0.026627\" name=\"H18R\" type=\"hL\" />\n+ <Atom charge=\"0.026627\" name=\"H18S\" type=\"hL\" />\n+ <Atom charge=\"0.026627\" name=\"H18T\" type=\"hL\" />\n+ <Atom charge=\"0.001619\" name=\"C33\" type=\"cD\" />\n+ <Atom charge=\"0.019529\" name=\"H3X\" type=\"hL\" />\n+ <Atom charge=\"0.019529\" name=\"H3Y\" type=\"hL\" />\n+ <Atom charge=\"-0.02296\" name=\"C34\" type=\"cD\" />\n+ <Atom charge=\"0.018134\" name=\"H4X\" type=\"hL\" />\n+ <Atom charge=\"0.018134\" name=\"H4Y\" type=\"hL\" />\n+ <Atom charge=\"-0.016692\" name=\"C35\" type=\"cD\" />\n+ <Atom charge=\"0.00869\" name=\"H5X\" type=\"hL\" />\n+ <Atom charge=\"0.00869\" name=\"H5Y\" type=\"hL\" />\n+ <Atom charge=\"-0.023789\" name=\"C36\" type=\"cD\" />\n+ <Atom charge=\"0.009266\" name=\"H6X\" type=\"hL\" />\n+ <Atom charge=\"0.009266\" name=\"H6Y\" type=\"hL\" />\n+ <Atom charge=\"-0.017495\" name=\"C37\" type=\"cD\" />\n+ <Atom charge=\"0.019598\" name=\"H7X\" type=\"hL\" />\n+ <Atom charge=\"0.019598\" name=\"H7Y\" type=\"hL\" />\n+ <Atom charge=\"0.031775\" name=\"C38\" type=\"cD\" />\n+ <Atom charge=\"0.032685\" name=\"H8X\" type=\"hL\" />\n+ <Atom charge=\"0.032685\" name=\"H8Y\" type=\"hL\" />\n+ <Atom charge=\"-0.244228\" name=\"C39\" type=\"cB\" />\n+ <Atom charge=\"0.131512\" name=\"H9X\" type=\"hB\" />\n+ <Atom charge=\"-0.239284\" name=\"C310\" type=\"cB\" />\n+ <Atom charge=\"0.126878\" name=\"H10X\" type=\"hB\" />\n+ <Atom charge=\"0.029059\" name=\"C311\" type=\"cD\" />\n+ <Atom charge=\"0.033531\" name=\"H11X\" type=\"hL\" />\n+ <Atom charge=\"0.033531\" name=\"H11Y\" type=\"hL\" />\n+ <Atom charge=\"-0.026353\" name=\"C312\" type=\"cD\" />\n+ <Atom charge=\"0.019717\" name=\"H12X\" type=\"hL\" />\n+ <Atom charge=\"0.019717\" name=\"H12Y\" type=\"hL\" />\n+ <Atom charge=\"-0.018257\" name=\"C313\" type=\"cD\" />\n+ <Atom charge=\"0.0138\" name=\"H13X\" type=\"hL\" />\n+ <Atom charge=\"0.0138\" name=\"H13Y\" type=\"hL\" />\n+ <Atom charge=\"-0.024849\" name=\"C314\" type=\"cD\" />\n+ <Atom charge=\"0.008572\" name=\"H14X\" type=\"hL\" />\n+ <Atom charge=\"0.008572\" name=\"H14Y\" type=\"hL\" />\n+ <Atom charge=\"-0.023247\" name=\"C315\" type=\"cD\" />\n+ <Atom charge=\"0.010403\" name=\"H15X\" type=\"hL\" />\n+ <Atom charge=\"0.010403\" name=\"H15Y\" type=\"hL\" />\n+ <Atom charge=\"-0.012488\" name=\"C316\" type=\"cD\" />\n+ <Atom charge=\"0.013659\" name=\"H16X\" type=\"hL\" />\n+ <Atom charge=\"0.013659\" name=\"H16Y\" type=\"hL\" />\n+ <Atom charge=\"0.008684\" name=\"C317\" type=\"cD\" />\n+ <Atom charge=\"0.010026\" name=\"H17X\" type=\"hL\" />\n+ <Atom charge=\"0.010026\" name=\"H17Y\" type=\"hL\" />\n+ <Atom charge=\"-0.11729\" name=\"C318\" type=\"cD\" />\n+ <Atom charge=\"0.026627\" name=\"H18X\" type=\"hL\" />\n+ <Atom charge=\"0.026627\" name=\"H18Y\" type=\"hL\" />\n+ <Atom charge=\"0.026627\" name=\"H18Z\" type=\"hL\" />\n+ <Bond atomName1=\"HO3\" atomName2=\"OC3\" />\n+ <Bond atomName1=\"OC3\" atomName2=\"C13\" />\n+ <Bond atomName1=\"C13\" atomName2=\"H13A\" />\n+ <Bond atomName1=\"C13\" atomName2=\"H13B\" />\n+ <Bond atomName1=\"C13\" atomName2=\"C12\" />\n+ <Bond atomName1=\"HO2\" atomName2=\"OC2\" />\n+ <Bond atomName1=\"OC2\" atomName2=\"C12\" />\n+ <Bond atomName1=\"C12\" atomName2=\"H12A\" />\n+ <Bond atomName1=\"C12\" atomName2=\"C11\" />\n+ <Bond atomName1=\"C11\" atomName2=\"H11A\" />\n+ <Bond atomName1=\"C11\" atomName2=\"H11B\" />\n+ <Bond atomName1=\"C11\" atomName2=\"O12\" />\n+ <Bond atomName1=\"O11\" atomName2=\"C1\" />\n+ <Bond atomName1=\"O12\" atomName2=\"P\" />\n+ <Bond atomName1=\"P\" atomName2=\"O11\" />\n+ <Bond atomName1=\"P\" atomName2=\"O13\" />\n+ <Bond atomName1=\"P\" atomName2=\"O14\" />\n+ <Bond atomName1=\"C1\" atomName2=\"HA\" />\n+ <Bond atomName1=\"C1\" atomName2=\"HB\" />\n+ <Bond atomName1=\"C1\" atomName2=\"C2\" />\n+ <Bond atomName1=\"C2\" atomName2=\"HS\" />\n+ <Bond atomName1=\"C2\" atomName2=\"C3\" />\n+ <Bond atomName1=\"C2\" atomName2=\"O21\" />\n+ <Bond atomName1=\"C3\" atomName2=\"HX\" />\n+ <Bond atomName1=\"C3\" atomName2=\"HY\" />\n+ <Bond atomName1=\"C3\" atomName2=\"O31\" />\n+ <Bond atomName1=\"O21\" atomName2=\"C21\" />\n+ <Bond atomName1=\"C21\" atomName2=\"C22\" />\n+ <Bond atomName1=\"C21\" atomName2=\"O22\" />\n+ <Bond atomName1=\"C22\" atomName2=\"H2R\" />\n+ <Bond atomName1=\"C22\" atomName2=\"H2S\" />\n+ <Bond atomName1=\"C22\" atomName2=\"C23\" />\n+ <Bond atomName1=\"C23\" atomName2=\"H3R\" />\n+ <Bond atomName1=\"C23\" atomName2=\"H3S\" />\n+ <Bond atomName1=\"C23\" atomName2=\"C24\" />\n+ <Bond atomName1=\"C24\" atomName2=\"H4R\" />\n+ <Bond atomName1=\"C24\" atomName2=\"H4S\" />\n+ <Bond atomName1=\"C24\" atomName2=\"C25\" />\n+ <Bond atomName1=\"C25\" atomName2=\"H5R\" />\n+ <Bond atomName1=\"C25\" atomName2=\"H5S\" />\n+ <Bond atomName1=\"C25\" atomName2=\"C26\" />\n+ <Bond atomName1=\"C26\" atomName2=\"H6R\" />\n+ <Bond atomName1=\"C26\" atomName2=\"H6S\" />\n+ <Bond atomName1=\"C26\" atomName2=\"C27\" />\n+ <Bond atomName1=\"C27\" atomName2=\"H7R\" />\n+ <Bond atomName1=\"C27\" atomName2=\"H7S\" />\n+ <Bond atomName1=\"C27\" atomName2=\"C28\" />\n+ <Bond atomName1=\"C28\" atomName2=\"H8R\" />\n+ <Bond atomName1=\"C28\" atomName2=\"H8S\" />\n+ <Bond atomName1=\"C28\" atomName2=\"C29\" />\n+ <Bond atomName1=\"C29\" atomName2=\"H9R\" />\n+ <Bond atomName1=\"C29\" atomName2=\"C210\" />\n+ <Bond atomName1=\"C210\" atomName2=\"H10R\" />\n+ <Bond atomName1=\"C210\" atomName2=\"C211\" />\n+ <Bond atomName1=\"C211\" atomName2=\"H11R\" />\n+ <Bond atomName1=\"C211\" atomName2=\"H11S\" />\n+ <Bond atomName1=\"C211\" atomName2=\"C212\" />\n+ <Bond atomName1=\"C212\" atomName2=\"H12R\" />\n+ <Bond atomName1=\"C212\" atomName2=\"H12S\" />\n+ <Bond atomName1=\"C212\" atomName2=\"C213\" />\n+ <Bond atomName1=\"C213\" atomName2=\"H13R\" />\n+ <Bond atomName1=\"C213\" atomName2=\"H13S\" />\n+ <Bond atomName1=\"C213\" atomName2=\"C214\" />\n+ <Bond atomName1=\"C214\" atomName2=\"H14R\" />\n+ <Bond atomName1=\"C214\" atomName2=\"H14S\" />\n+ <Bond atomName1=\"C214\" atomName2=\"C215\" />\n+ <Bond atomName1=\"C215\" atomName2=\"H15R\" />\n+ <Bond atomName1=\"C215\" atomName2=\"H15S\" />\n+ <Bond atomName1=\"C215\" atomName2=\"C216\" />\n+ <Bond atomName1=\"C216\" atomName2=\"H16R\" />\n+ <Bond atomName1=\"C216\" atomName2=\"H16S\" />\n+ <Bond atomName1=\"C216\" atomName2=\"C217\" />\n+ <Bond atomName1=\"C217\" atomName2=\"H17R\" />\n+ <Bond atomName1=\"C217\" atomName2=\"H17S\" />\n+ <Bond atomName1=\"C217\" atomName2=\"C218\" />\n+ <Bond atomName1=\"C218\" atomName2=\"H18R\" />\n+ <Bond atomName1=\"C218\" atomName2=\"H18S\" />\n+ <Bond atomName1=\"C218\" atomName2=\"H18T\" />\n+ <Bond atomName1=\"O31\" atomName2=\"C31\" />\n+ <Bond atomName1=\"C31\" atomName2=\"C32\" />\n+ <Bond atomName1=\"C31\" atomName2=\"O32\" />\n+ <Bond atomName1=\"C32\" atomName2=\"H2X\" />\n+ <Bond atomName1=\"C32\" atomName2=\"H2Y\" />\n+ <Bond atomName1=\"C32\" atomName2=\"C33\" />\n+ <Bond atomName1=\"C33\" atomName2=\"H3X\" />\n+ <Bond atomName1=\"C33\" atomName2=\"H3Y\" />\n+ <Bond atomName1=\"C33\" atomName2=\"C34\" />\n+ <Bond atomName1=\"C34\" atomName2=\"H4X\" />\n+ <Bond atomName1=\"C34\" atomName2=\"H4Y\" />\n+ <Bond atomName1=\"C34\" atomName2=\"C35\" />\n+ <Bond atomName1=\"C35\" atomName2=\"H5X\" />\n+ <Bond atomName1=\"C35\" atomName2=\"H5Y\" />\n+ <Bond atomName1=\"C35\" atomName2=\"C36\" />\n+ <Bond atomName1=\"C36\" atomName2=\"H6X\" />\n+ <Bond atomName1=\"C36\" atomName2=\"H6Y\" />\n+ <Bond atomName1=\"C36\" atomName2=\"C37\" />\n+ <Bond atomName1=\"C37\" atomName2=\"H7X\" />\n+ <Bond atomName1=\"C37\" atomName2=\"H7Y\" />\n+ <Bond atomName1=\"C37\" atomName2=\"C38\" />\n+ <Bond atomName1=\"C38\" atomName2=\"H8X\" />\n+ <Bond atomName1=\"C38\" atomName2=\"H8Y\" />\n+ <Bond atomName1=\"C38\" atomName2=\"C39\" />\n+ <Bond atomName1=\"C39\" atomName2=\"H9X\" />\n+ <Bond atomName1=\"C39\" atomName2=\"C310\" />\n+ <Bond atomName1=\"C310\" atomName2=\"H10X\" />\n+ <Bond atomName1=\"C310\" atomName2=\"C311\" />\n+ <Bond atomName1=\"C311\" atomName2=\"H11X\" />\n+ <Bond atomName1=\"C311\" atomName2=\"H11Y\" />\n+ <Bond atomName1=\"C311\" atomName2=\"C312\" />\n+ <Bond atomName1=\"C312\" atomName2=\"H12X\" />\n+ <Bond atomName1=\"C312\" atomName2=\"H12Y\" />\n+ <Bond atomName1=\"C312\" atomName2=\"C313\" />\n+ <Bond atomName1=\"C313\" atomName2=\"H13X\" />\n+ <Bond atomName1=\"C313\" atomName2=\"H13Y\" />\n+ <Bond atomName1=\"C313\" atomName2=\"C314\" />\n+ <Bond atomName1=\"C314\" atomName2=\"H14X\" />\n+ <Bond atomName1=\"C314\" atomName2=\"H14Y\" />\n+ <Bond atomName1=\"C314\" atomName2=\"C315\" />\n+ <Bond atomName1=\"C315\" atomName2=\"H15X\" />\n+ <Bond atomName1=\"C315\" atomName2=\"H15Y\" />\n+ <Bond atomName1=\"C315\" atomName2=\"C316\" />\n+ <Bond atomName1=\"C316\" atomName2=\"H16X\" />\n+ <Bond atomName1=\"C316\" atomName2=\"H16Y\" />\n+ <Bond atomName1=\"C316\" atomName2=\"C317\" />\n+ <Bond atomName1=\"C317\" atomName2=\"H17X\" />\n+ <Bond atomName1=\"C317\" atomName2=\"H17Y\" />\n+ <Bond atomName1=\"C317\" atomName2=\"C318\" />\n+ <Bond atomName1=\"C318\" atomName2=\"H18X\" />\n+ <Bond atomName1=\"C318\" atomName2=\"H18Y\" />\n+ <Bond atomName1=\"C318\" atomName2=\"H18Z\" />\n+ </Residue>\n+ <Residue name=\"POPC\">\n+ <Atom charge=\"0.245262\" name=\"N\" type=\"nA\" />\n+ <Atom charge=\"-0.170824\" name=\"C12\" type=\"cA\" />\n+ <Atom charge=\"0.136415\" name=\"H12A\" type=\"hX\" />\n+ <Atom charge=\"0.136415\" name=\"H12B\" type=\"hX\" />\n+ <Atom charge=\"-0.338973\" name=\"C13\" type=\"cA\" />\n+ <Atom charge=\"0.17223\" name=\"H13A\" type=\"hX\" />\n+ <Atom charge=\"0.17223\" name=\"H13B\" type=\"hX\" />\n+ <Atom charge=\"0.17223\" name=\"H13C\" type=\"hX\" />\n+ <Atom charge=\"-0.338973\" name=\"C14\" type=\"cA\" />\n+ <Atom charge=\"0.17223\" name=\"H14A\" type=\"hX\" />\n+ <Atom charge=\"0.17223\" name=\"H14B\" type=\"hX\" />\n+ <Atom charge=\"0.17223\" name=\"H14C\" type=\"hX\" />\n+ <Atom charge=\"-0.338973\" name=\"C15\" type=\"cA\" />\n+ <Atom charge=\"0.17223\" name=\"H15A\" type=\"hX\" />\n+ <Atom charge=\"0.17223\" name=\"H15B\" type=\"hX\" />\n+ <Atom charge=\"0.17223\" name=\"H15C\" type=\"hX\" />\n+ <Atom charge=\"0.166801\" name=\"C11\" type=\"cA\" />\n+ <Atom charge=\"0.078534\" name=\"H11A\" type=\"hE\" />\n+ <Atom charge=\"0.078534\" name=\"H11B\" type=\"hE\" />\n+ <Atom charge=\"1.339721\" name=\"P\" type=\"pA\" />\n+ <Atom charge=\"-0.875812\" name=\"O13\" type=\"oP\" />\n+ <Atom charge=\"-0.875812\" name=\"O14\" type=\"oP\" />\n+ <Atom charge=\"-0.508176\" name=\"O12\" type=\"oT\" />\n+ <Atom charge=\"-0.50948\" name=\"O11\" type=\"oT\" />\n+ <Atom charge=\"0.017459\" name=\"C1\" type=\"cA\" />\n+ <Atom charge=\"0.095591\" name=\"HA\" type=\"hE\" />\n+ <Atom charge=\"0.095591\" name=\"HB\" type=\"hE\" />\n+ <Atom charge=\"0.281242\" name=\"C2\" type=\"cA\" />\n+ <Atom charge=\"0.063253\" name=\"HS\" type=\"hE\" />\n+ <Atom charge=\"-0.552948\" name=\"O21\" type=\"oS\" />\n+ <Atom charge=\"0.897613\" name=\"C21\" type=\"cC\" />\n+ <Atom charge=\"-0.673755\" name=\"O22\" type=\"oC\" />\n+ <Atom charge=\"-0.143418\" name=\"C22\" type=\"cD\" />\n+ <Atom charge=\"0.042861\" name=\"H2R\" type=\"hL\" />\n+ <Atom charge=\"0.042861\" name=\"H2S\" type=\"hL\" />\n+ <Atom charge=\"0.196939\" name=\"C3\" type=\"cA\" />\n+ <Atom charge=\"0.070469\" name=\"HX\" type=\"hE\" />\n+ <Atom charge=\"0.070469\" name=\"HY\" type=\"hE\" />\n+ <Atom charge=\"-0.575489\" name=\"O31\" type=\"oS\" />\n+ <Atom charge=\"0.910403\" name=\"C31\" type=\"cC\" />\n+ <Atom charge=\"-0.671566\" name=\"O32\" type=\"oC\" />\n+ <Atom charge=\"-0.149259\" name=\"C32\" type=\"cD\" />\n+ <Atom charge=\"0.047345\" name=\"H2X\" type=\"hL\" />\n+ <Atom charge=\"0.047345\" name=\"H2Y\" type=\"hL\" />\n+ <Atom charge=\"0.001619\" name=\"C23\" type=\"cD\" />\n+ <Atom charge=\"0.019529\" name=\"H3R\" type=\"hL\" />\n+ <Atom charge=\"0.019529\" name=\"H3S\" type=\"hL\" />\n+ <Atom charge=\"-0.02296\" name=\"C24\" type=\"cD\" />\n+ <Atom charge=\"0.018134\" name=\"H4R\" type=\"hL\" />\n+ <Atom charge=\"0.018134\" name=\"H4S\" type=\"hL\" />\n+ <Atom charge=\"-0.016692\" name=\"C25\" type=\"cD\" />\n+ <Atom charge=\"0.00869\" name=\"H5R\" type=\"hL\" />\n+ <Atom charge=\"0.00869\" name=\"H5S\" type=\"hL\" />\n+ <Atom charge=\"-0.023789\" name=\"C26\" type=\"cD\" />\n+ <Atom charge=\"0.009266\" name=\"H6R\" type=\"hL\" />\n+ <Atom charge=\"0.009266\" name=\"H6S\" type=\"hL\" />\n+ <Atom charge=\"-0.017495\" name=\"C27\" type=\"cD\" />\n+ <Atom charge=\"0.019598\" name=\"H7R\" type=\"hL\" />\n+ <Atom charge=\"0.019598\" name=\"H7S\" type=\"hL\" />\n+ <Atom charge=\"0.031775\" name=\"C28\" type=\"cD\" />\n+ <Atom charge=\"0.032685\" name=\"H8R\" type=\"hL\" />\n+ <Atom charge=\"0.032685\" name=\"H8S\" type=\"hL\" />\n+ <Atom charge=\"-0.244228\" name=\"C29\" type=\"cB\" />\n+ <Atom charge=\"0.131512\" name=\"H91\" type=\"hB\" />\n+ <Atom charge=\"-0.239284\" name=\"C210\" type=\"cB\" />\n+ <Atom charge=\"0.126878\" name=\"H101\" type=\"hB\" />\n+ <Atom charge=\"0.029059\" name=\"C211\" type=\"cD\" />\n+ <Atom charge=\"0.033531\" name=\"H11R\" type=\"hL\" />\n+ <Atom charge=\"0.033531\" name=\"H11S\" type=\"hL\" />\n+ <Atom charge=\"-0.026353\" name=\"C212\" type=\"cD\" />\n+ <Atom charge=\"0.019717\" name=\"H12R\" type=\"hL\" />\n+ <Atom charge=\"0.019717\" name=\"H12S\" type=\"hL\" />\n+ <Atom charge=\"-0.018257\" name=\"C213\" type=\"cD\" />\n+ <Atom charge=\"0.0138\" name=\"H13R\" type=\"hL\" />\n+ <Atom charge=\"0.0138\" name=\"H13S\" type=\"hL\" />\n+ <Atom charge=\"-0.024849\" name=\"C214\" type=\"cD\" />\n+ <Atom charge=\"0.008572\" name=\"H14R\" type=\"hL\" />\n+ <Atom charge=\"0.008572\" name=\"H14S\" type=\"hL\" />\n+ <Atom charge=\"-0.023247\" name=\"C215\" type=\"cD\" />\n+ <Atom charge=\"0.010403\" name=\"H15R\" type=\"hL\" />\n+ <Atom charge=\"0.010403\" name=\"H15S\" type=\"hL\" />\n+ <Atom charge=\"-0.012488\" name=\"C216\" type=\"cD\" />\n+ <Atom charge=\"0.013659\" name=\"H16R\" type=\"hL\" />\n+ <Atom charge=\"0.013659\" name=\"H16S\" type=\"hL\" />\n+ <Atom charge=\"0.008684\" name=\"C217\" type=\"cD\" />\n+ <Atom charge=\"0.010026\" name=\"H17R\" type=\"hL\" />\n+ <Atom charge=\"0.010026\" name=\"H17S\" type=\"hL\" />\n+ <Atom charge=\"-0.11729\" name=\"C218\" type=\"cD\" />\n+ <Atom charge=\"0.026627\" name=\"H18R\" type=\"hL\" />\n+ <Atom charge=\"0.026627\" name=\"H18S\" type=\"hL\" />\n+ <Atom charge=\"0.026627\" name=\"H18T\" type=\"hL\" />\n+ <Atom charge=\"-0.004882\" name=\"C33\" type=\"cD\" />\n+ <Atom charge=\"0.019007\" name=\"H3X\" type=\"hL\" />\n+ <Atom charge=\"0.019007\" name=\"H3Y\" type=\"hL\" />\n+ <Atom charge=\"-0.030099\" name=\"C34\" type=\"cD\" />\n+ <Atom charge=\"0.020877\" name=\"H4X\" type=\"hL\" />\n+ <Atom charge=\"0.020877\" name=\"H4Y\" type=\"hL\" />\n+ <Atom charge=\"-0.029387\" name=\"C35\" type=\"cD\" />\n+ <Atom charge=\"0.016763\" name=\"H5X\" type=\"hL\" />\n+ <Atom charge=\"0.016763\" name=\"H5Y\" type=\"hL\" />\n+ <Atom charge=\"-0.024427\" name=\"C36\" type=\"cD\" />\n+ <Atom charge=\"0.013334\" name=\"H6X\" type=\"hL\" />\n+ <Atom charge=\"0.013334\" name=\"H6Y\" type=\"hL\" />\n+ <Atom charge=\"-0.01963\" name=\"C37\" type=\"cD\" />\n+ <Atom charge=\"0.011041\" name=\"H7X\" type=\"hL\" />\n+ <Atom charge=\"0.011041\" name=\"H7Y\" type=\"hL\" />\n+ <Atom charge=\"-0.015793\" name=\"C38\" type=\"cD\" />\n+ <Atom charge=\"0.009067\" name=\"H8X\" type=\"hL\" />\n+ <Atom charge=\"0.009067\" name=\"H8Y\" type=\"hL\" />\n+ <Atom charge=\"-0.030472\" name=\"C39\" type=\"cD\" />\n+ <Atom charge=\"0.013897\" name=\"H9X\" type=\"hL\" />\n+ <Atom charge=\"0.013897\" name=\"H9Y\" type=\"hL\" />\n+ <Atom charge=\"-0.028831\" name=\"C310\" type=\"cD\" />\n+ <Atom charge=\"0.014691\" name=\"H10X\" type=\"hL\" />\n+ <Atom charge=\"0.014691\" name=\"H10Y\" type=\"hL\" />\n+ <Atom charge=\"-0.025206\" name=\"C311\" type=\"cD\" />\n+ <Atom charge=\"0.014334\" name=\"H11X\" type=\"hL\" />\n+ <Atom charge=\"0.014334\" name=\"H11Y\" type=\"hL\" />\n+ <Atom charge=\"-0.027633\" name=\"C312\" type=\"cD\" />\n+ <Atom charge=\"0.011368\" name=\"H12X\" type=\"hL\" />\n+ <Atom charge=\"0.011368\" name=\"H12Y\" type=\"hL\" />\n+ <Atom charge=\"-0.033096\" name=\"C313\" type=\"cD\" />\n+ <Atom charge=\"0.014621\" name=\"H13X\" type=\"hL\" />\n+ <Atom charge=\"0.014621\" name=\"H13Y\" type=\"hL\" />\n+ <Atom charge=\"-0.020086\" name=\"C314\" type=\"cD\" />\n+ <Atom charge=\"0.015929\" name=\"H14X\" type=\"hL\" />\n+ <Atom charge=\"0.015929\" name=\"H14Y\" type=\"hL\" />\n+ <Atom charge=\"0.013975\" name=\"C315\" type=\"cD\" />\n+ <Atom charge=\"0.009292\" name=\"H15X\" type=\"hL\" />\n+ <Atom charge=\"0.009292\" name=\"H15Y\" type=\"hL\" />\n+ <Atom charge=\"-0.125447\" name=\"C316\" type=\"cD\" />\n+ <Atom charge=\"0.029047\" name=\"H16X\" type=\"hL\" />\n+ <Atom charge=\"0.029047\" name=\"H16Y\" type=\"hL\" />\n+ <Atom charge=\"0.029047\" name=\"H16Z\" type=\"hL\" />\n+ <Bond atomName1=\"N\" atomName2=\"C13\" />\n+ <Bond atomName1=\"N\" atomName2=\"C14\" />\n+ <Bond atomName1=\"N\" atomName2=\"C15\" />\n+ <Bond atomName1=\"C13\" atomName2=\"H13A\" />\n+ <Bond atomName1=\"C13\" atomName2=\"H13B\" />\n+ <Bond atomName1=\"C13\" atomName2=\"H13C\" />\n+ <Bond atomName1=\"C14\" atomName2=\"H14A\" />\n+ <Bond atomName1=\"C14\" atomName2=\"H14B\" />\n+ <Bond atomName1=\"C14\" atomName2=\"H14C\" />\n+ <Bond atomName1=\"C15\" atomName2=\"H15A\" />\n+ <Bond atomName1=\"C15\" atomName2=\"H15B\" />\n+ <Bond atomName1=\"C15\" atomName2=\"H15C\" />\n+ <Bond atomName1=\"N\" atomName2=\"C12\" />\n+ <Bond atomName1=\"C12\" atomName2=\"H12A\" />\n+ <Bond atomName1=\"C12\" atomName2=\"H12B\" />\n+ <Bond atomName1=\"C12\" atomName2=\"C11\" />\n+ <Bond atomName1=\"C11\" atomName2=\"H11A\" />\n+ <Bond atomName1=\"C11\" atomName2=\"H11B\" />\n+ <Bond atomName1=\"C11\" atomName2=\"O12\" />\n+ <Bond atomName1=\"O11\" atomName2=\"C1\" />\n+ <Bond atomName1=\"O12\" atomName2=\"P\" />\n+ <Bond atomName1=\"P\" atomName2=\"O11\" />\n+ <Bond atomName1=\"P\" atomName2=\"O13\" />\n+ <Bond atomName1=\"P\" atomName2=\"O14\" />\n+ <Bond atomName1=\"C1\" atomName2=\"HA\" />\n+ <Bond atomName1=\"C1\" atomName2=\"HB\" />\n+ <Bond atomName1=\"C1\" atomName2=\"C2\" />\n+ <Bond atomName1=\"C2\" atomName2=\"HS\" />\n+ <Bond atomName1=\"C2\" atomName2=\"C3\" />\n+ <Bond atomName1=\"C2\" atomName2=\"O21\" />\n+ <Bond atomName1=\"C3\" atomName2=\"HX\" />\n+ <Bond atomName1=\"C3\" atomName2=\"HY\" />\n+ <Bond atomName1=\"C3\" atomName2=\"O31\" />\n+ <Bond atomName1=\"O21\" atomName2=\"C21\" />\n+ <Bond atomName1=\"C21\" atomName2=\"C22\" />\n+ <Bond atomName1=\"C21\" atomName2=\"O22\" />\n+ <Bond atomName1=\"C22\" atomName2=\"H2R\" />\n+ <Bond atomName1=\"C22\" atomName2=\"H2S\" />\n+ <Bond atomName1=\"C22\" atomName2=\"C23\" />\n+ <Bond atomName1=\"C23\" atomName2=\"H3R\" />\n+ <Bond atomName1=\"C23\" atomName2=\"H3S\" />\n+ <Bond atomName1=\"C23\" atomName2=\"C24\" />\n+ <Bond atomName1=\"C24\" atomName2=\"H4R\" />\n+ <Bond atomName1=\"C24\" atomName2=\"H4S\" />\n+ <Bond atomName1=\"C24\" atomName2=\"C25\" />\n+ <Bond atomName1=\"C25\" atomName2=\"H5R\" />\n+ <Bond atomName1=\"C25\" atomName2=\"H5S\" />\n+ <Bond atomName1=\"C25\" atomName2=\"C26\" />\n+ <Bond atomName1=\"C26\" atomName2=\"H6R\" />\n+ <Bond atomName1=\"C26\" atomName2=\"H6S\" />\n+ <Bond atomName1=\"C26\" atomName2=\"C27\" />\n+ <Bond atomName1=\"C27\" atomName2=\"H7R\" />\n+ <Bond atomName1=\"C27\" atomName2=\"H7S\" />\n+ <Bond atomName1=\"C27\" atomName2=\"C28\" />\n+ <Bond atomName1=\"C28\" atomName2=\"H8R\" />\n+ <Bond atomName1=\"C28\" atomName2=\"H8S\" />\n+ <Bond atomName1=\"C28\" atomName2=\"C29\" />\n+ <Bond atomName1=\"C29\" atomName2=\"H91\" />\n+ <Bond atomName1=\"C29\" atomName2=\"C210\" />\n+ <Bond atomName1=\"C210\" atomName2=\"H101\" />\n+ <Bond atomName1=\"C210\" atomName2=\"C211\" />\n+ <Bond atomName1=\"C211\" atomName2=\"H11R\" />\n+ <Bond atomName1=\"C211\" atomName2=\"H11S\" />\n+ <Bond atomName1=\"C211\" atomName2=\"C212\" />\n+ <Bond atomName1=\"C212\" atomName2=\"H12R\" />\n+ <Bond atomName1=\"C212\" atomName2=\"H12S\" />\n+ <Bond atomName1=\"C212\" atomName2=\"C213\" />\n+ <Bond atomName1=\"C213\" atomName2=\"H13R\" />\n+ <Bond atomName1=\"C213\" atomName2=\"H13S\" />\n+ <Bond atomName1=\"C213\" atomName2=\"C214\" />\n+ <Bond atomName1=\"C214\" atomName2=\"H14R\" />\n+ <Bond atomName1=\"C214\" atomName2=\"H14S\" />\n+ <Bond atomName1=\"C214\" atomName2=\"C215\" />\n+ <Bond atomName1=\"C215\" atomName2=\"H15R\" />\n+ <Bond atomName1=\"C215\" atomName2=\"H15S\" />\n+ <Bond atomName1=\"C215\" atomName2=\"C216\" />\n+ <Bond atomName1=\"C216\" atomName2=\"H16R\" />\n+ <Bond atomName1=\"C216\" atomName2=\"H16S\" />\n+ <Bond atomName1=\"C216\" atomName2=\"C217\" />\n+ <Bond atomName1=\"C217\" atomName2=\"H17R\" />\n+ <Bond atomName1=\"C217\" atomName2=\"H17S\" />\n+ <Bond atomName1=\"C217\" atomName2=\"C218\" />\n+ <Bond atomName1=\"C218\" atomName2=\"H18R\" />\n+ <Bond atomName1=\"C218\" atomName2=\"H18S\" />\n+ <Bond atomName1=\"C218\" atomName2=\"H18T\" />\n+ <Bond atomName1=\"O31\" atomName2=\"C31\" />\n+ <Bond atomName1=\"C31\" atomName2=\"C32\" />\n+ <Bond atomName1=\"C31\" atomName2=\"O32\" />\n+ <Bond atomName1=\"C32\" atomName2=\"H2X\" />\n+ <Bond atomName1=\"C32\" atomName2=\"H2Y\" />\n+ <Bond atomName1=\"C32\" atomName2=\"C33\" />\n+ <Bond atomName1=\"C33\" atomName2=\"H3X\" />\n+ <Bond atomName1=\"C33\" atomName2=\"H3Y\" />\n+ <Bond atomName1=\"C33\" atomName2=\"C34\" />\n+ <Bond atomName1=\"C34\" atomName2=\"H4X\" />\n+ <Bond atomName1=\"C34\" atomName2=\"H4Y\" />\n+ <Bond atomName1=\"C34\" atomName2=\"C35\" />\n+ <Bond atomName1=\"C35\" atomName2=\"H5X\" />\n+ <Bond atomName1=\"C35\" atomName2=\"H5Y\" />\n+ <Bond atomName1=\"C35\" atomName2=\"C36\" />\n+ <Bond atomName1=\"C36\" atomName2=\"H6X\" />\n+ <Bond atomName1=\"C36\" atomName2=\"H6Y\" />\n+ <Bond atomName1=\"C36\" atomName2=\"C37\" />\n+ <Bond atomName1=\"C37\" atomName2=\"H7X\" />\n+ <Bond atomName1=\"C37\" atomName2=\"H7Y\" />\n+ <Bond atomName1=\"C37\" atomName2=\"C38\" />\n+ <Bond atomName1=\"C38\" atomName2=\"H8X\" />\n+ <Bond atomName1=\"C38\" atomName2=\"H8Y\" />\n+ <Bond atomName1=\"C38\" atomName2=\"C39\" />\n+ <Bond atomName1=\"C39\" atomName2=\"H9X\" />\n+ <Bond atomName1=\"C39\" atomName2=\"H9Y\" />\n+ <Bond atomName1=\"C39\" atomName2=\"C310\" />\n+ <Bond atomName1=\"C310\" atomName2=\"H10X\" />\n+ <Bond atomName1=\"C310\" atomName2=\"H10Y\" />\n+ <Bond atomName1=\"C310\" atomName2=\"C311\" />\n+ <Bond atomName1=\"C311\" atomName2=\"H11X\" />\n+ <Bond atomName1=\"C311\" atomName2=\"H11Y\" />\n+ <Bond atomName1=\"C311\" atomName2=\"C312\" />\n+ <Bond atomName1=\"C312\" atomName2=\"H12X\" />\n+ <Bond atomName1=\"C312\" atomName2=\"H12Y\" />\n+ <Bond atomName1=\"C312\" atomName2=\"C313\" />\n+ <Bond atomName1=\"C313\" atomName2=\"H13X\" />\n+ <Bond atomName1=\"C313\" atomName2=\"H13Y\" />\n+ <Bond atomName1=\"C313\" atomName2=\"C314\" />\n+ <Bond atomName1=\"C314\" atomName2=\"H14X\" />\n+ <Bond atomName1=\"C314\" atomName2=\"H14Y\" />\n+ <Bond atomName1=\"C314\" atomName2=\"C315\" />\n+ <Bond atomName1=\"C315\" atomName2=\"H15X\" />\n+ <Bond atomName1=\"C315\" atomName2=\"H15Y\" />\n+ <Bond atomName1=\"C315\" atomName2=\"C316\" />\n+ <Bond atomName1=\"C316\" atomName2=\"H16X\" />\n+ <Bond atomName1=\"C316\" atomName2=\"H16Y\" />\n+ <Bond atomName1=\"C316\" atomName2=\"H16Z\" />\n+ </Residue>\n+ <Residue name=\"POPE\">\n+ <Atom charge=\"-0.368132\" name=\"N\" type=\"nA\" />\n+ <Atom charge=\"0.348549\" name=\"HN1\" type=\"hN\" />\n+ <Atom charge=\"0.348549\" name=\"HN2\" type=\"hN\" />\n+ <Atom charge=\"0.348549\" name=\"HN3\" type=\"hN\" />\n+ <Atom charge=\"0.077319\" name=\"C12\" type=\"cA\" />\n+ <Atom charge=\"0.09163\" name=\"H12A\" type=\"hX\" />\n+ <Atom charge=\"0.09163\" name=\"H12B\" type=\"hX\" />\n+ <Atom charge=\"0.075159\" name=\"C11\" type=\"cA\" />\n+ <Atom charge=\"0.091516\" name=\"H11A\" type=\"hE\" />\n+ <Atom charge=\"0.091516\" name=\"H11B\" type=\"hE\" />\n+ <Atom charge=\"1.373656\" name=\"P\" type=\"pA\" />\n+ <Atom charge=\"-0.877447\" name=\"O13\" type=\"oP\" />\n+ <Atom charge=\"-0.877447\" name=\"O14\" type=\"oP\" />\n+ <Atom charge=\"-0.546623\" name=\"O11\" type=\"oT\" />\n+ <Atom charge=\"-0.514542\" name=\"O12\" type=\"oT\" />\n+ <Atom charge=\"0.040967\" name=\"C1\" type=\"cA\" />\n+ <Atom charge=\"0.090994\" name=\"HA\" type=\"hE\" />\n+ <Atom charge=\"0.090994\" name=\"HB\" type=\"hE\" />\n+ <Atom charge=\"0.339004\" name=\"C2\" type=\"cA\" />\n+ <Atom charge=\"0.032843\" name=\"HS\" type=\"hE\" />\n+ <Atom charge=\"-0.57548\" name=\"O21\" type=\"oS\" />\n+ <Atom charge=\"0.86934\" name=\"C21\" type=\"cC\" />\n+ <Atom charge=\"-0.649199\" name=\"O22\" type=\"oC\" />\n+ <Atom charge=\"-0.143418\" name=\"C22\" type=\"cD\" />\n+ <Atom charge=\"0.042861\" name=\"H2R\" type=\"hL\" />\n+ <Atom charge=\"0.042861\" name=\"H2S\" type=\"hL\" />\n+ <Atom charge=\"0.273776\" name=\"C3\" type=\"cA\" />\n+ <Atom charge=\"0.044574\" name=\"HX\" type=\"hE\" />\n+ <Atom charge=\"0.044574\" name=\"HY\" type=\"hE\" />\n+ <Atom charge=\"-0.593826\" name=\"O31\" type=\"oS\" />\n+ <Atom charge=\"0.888359\" name=\"C31\" type=\"cC\" />\n+ <Atom charge=\"-0.650802\" name=\"O32\" type=\"oC\" />\n+ <Atom charge=\"-0.149259\" name=\"C32\" type=\"cD\" />\n+ <Atom charge=\"0.047345\" name=\"H2X\" type=\"hL\" />\n+ <Atom charge=\"0.047345\" name=\"H2Y\" type=\"hL\" />\n+ <Atom charge=\"0.001619\" name=\"C23\" type=\"cD\" />\n+ <Atom charge=\"0.019529\" name=\"H3R\" type=\"hL\" />\n+ <Atom charge=\"0.019529\" name=\"H3S\" type=\"hL\" />\n+ <Atom charge=\"-0.02296\" name=\"C24\" type=\"cD\" />\n+ <Atom charge=\"0.018134\" name=\"H4R\" type=\"hL\" />\n+ <Atom charge=\"0.018134\" name=\"H4S\" type=\"hL\" />\n+ <Atom charge=\"-0.016692\" name=\"C25\" type=\"cD\" />\n+ <Atom charge=\"0.00869\" name=\"H5R\" type=\"hL\" />\n+ <Atom charge=\"0.00869\" name=\"H5S\" type=\"hL\" />\n+ <Atom charge=\"-0.023789\" name=\"C26\" type=\"cD\" />\n+ <Atom charge=\"0.009266\" name=\"H6R\" type=\"hL\" />\n+ <Atom charge=\"0.009266\" name=\"H6S\" type=\"hL\" />\n+ <Atom charge=\"-0.017495\" name=\"C27\" type=\"cD\" />\n+ <Atom charge=\"0.019598\" name=\"H7R\" type=\"hL\" />\n+ <Atom charge=\"0.019598\" name=\"H7S\" type=\"hL\" />\n+ <Atom charge=\"0.031775\" name=\"C28\" type=\"cD\" />\n+ <Atom charge=\"0.032685\" name=\"H8R\" type=\"hL\" />\n+ <Atom charge=\"0.032685\" name=\"H8S\" type=\"hL\" />\n+ <Atom charge=\"-0.244228\" name=\"C29\" type=\"cB\" />\n+ <Atom charge=\"0.131512\" name=\"H91\" type=\"hB\" />\n+ <Atom charge=\"-0.239284\" name=\"C210\" type=\"cB\" />\n+ <Atom charge=\"0.126878\" name=\"H101\" type=\"hB\" />\n+ <Atom charge=\"0.029059\" name=\"C211\" type=\"cD\" />\n+ <Atom charge=\"0.033531\" name=\"H11R\" type=\"hL\" />\n+ <Atom charge=\"0.033531\" name=\"H11S\" type=\"hL\" />\n+ <Atom charge=\"-0.026353\" name=\"C212\" type=\"cD\" />\n+ <Atom charge=\"0.019717\" name=\"H12R\" type=\"hL\" />\n+ <Atom charge=\"0.019717\" name=\"H12S\" type=\"hL\" />\n+ <Atom charge=\"-0.018257\" name=\"C213\" type=\"cD\" />\n+ <Atom charge=\"0.0138\" name=\"H13R\" type=\"hL\" />\n+ <Atom charge=\"0.0138\" name=\"H13S\" type=\"hL\" />\n+ <Atom charge=\"-0.024849\" name=\"C214\" type=\"cD\" />\n+ <Atom charge=\"0.008572\" name=\"H14R\" type=\"hL\" />\n+ <Atom charge=\"0.008572\" name=\"H14S\" type=\"hL\" />\n+ <Atom charge=\"-0.023247\" name=\"C215\" type=\"cD\" />\n+ <Atom charge=\"0.010403\" name=\"H15R\" type=\"hL\" />\n+ <Atom charge=\"0.010403\" name=\"H15S\" type=\"hL\" />\n+ <Atom charge=\"-0.012488\" name=\"C216\" type=\"cD\" />\n+ <Atom charge=\"0.013659\" name=\"H16R\" type=\"hL\" />\n+ <Atom charge=\"0.013659\" name=\"H16S\" type=\"hL\" />\n+ <Atom charge=\"0.008684\" name=\"C217\" type=\"cD\" />\n+ <Atom charge=\"0.010026\" name=\"H17R\" type=\"hL\" />\n+ <Atom charge=\"0.010026\" name=\"H17S\" type=\"hL\" />\n+ <Atom charge=\"-0.11729\" name=\"C218\" type=\"cD\" />\n+ <Atom charge=\"0.026627\" name=\"H18R\" type=\"hL\" />\n+ <Atom charge=\"0.026627\" name=\"H18S\" type=\"hL\" />\n+ <Atom charge=\"0.026627\" name=\"H18T\" type=\"hL\" />\n+ <Atom charge=\"-0.004882\" name=\"C33\" type=\"cD\" />\n+ <Atom charge=\"0.019007\" name=\"H3X\" type=\"hL\" />\n+ <Atom charge=\"0.019007\" name=\"H3Y\" type=\"hL\" />\n+ <Atom charge=\"-0.030099\" name=\"C34\" type=\"cD\" />\n+ <Atom charge=\"0.020877\" name=\"H4X\" type=\"hL\" />\n+ <Atom charge=\"0.020877\" name=\"H4Y\" type=\"hL\" />\n+ <Atom charge=\"-0.029387\" name=\"C35\" type=\"cD\" />\n+ <Atom charge=\"0.016763\" name=\"H5X\" type=\"hL\" />\n+ <Atom charge=\"0.016763\" name=\"H5Y\" type=\"hL\" />\n+ <Atom charge=\"-0.024427\" name=\"C36\" type=\"cD\" />\n+ <Atom charge=\"0.013334\" name=\"H6X\" type=\"hL\" />\n+ <Atom charge=\"0.013334\" name=\"H6Y\" type=\"hL\" />\n+ <Atom charge=\"-0.01963\" name=\"C37\" type=\"cD\" />\n+ <Atom charge=\"0.011041\" name=\"H7X\" type=\"hL\" />\n+ <Atom charge=\"0.011041\" name=\"H7Y\" type=\"hL\" />\n+ <Atom charge=\"-0.015793\" name=\"C38\" type=\"cD\" />\n+ <Atom charge=\"0.009067\" name=\"H8X\" type=\"hL\" />\n+ <Atom charge=\"0.009067\" name=\"H8Y\" type=\"hL\" />\n+ <Atom charge=\"-0.030472\" name=\"C39\" type=\"cD\" />\n+ <Atom charge=\"0.013897\" name=\"H9X\" type=\"hL\" />\n+ <Atom charge=\"0.013897\" name=\"H9Y\" type=\"hL\" />\n+ <Atom charge=\"-0.028831\" name=\"C310\" type=\"cD\" />\n+ <Atom charge=\"0.014691\" name=\"H10X\" type=\"hL\" />\n+ <Atom charge=\"0.014691\" name=\"H10Y\" type=\"hL\" />\n+ <Atom charge=\"-0.025206\" name=\"C311\" type=\"cD\" />\n+ <Atom charge=\"0.014334\" name=\"H11X\" type=\"hL\" />\n+ <Atom charge=\"0.014334\" name=\"H11Y\" type=\"hL\" />\n+ <Atom charge=\"-0.027633\" name=\"C312\" type=\"cD\" />\n+ <Atom charge=\"0.011368\" name=\"H12X\" type=\"hL\" />\n+ <Atom charge=\"0.011368\" name=\"H12Y\" type=\"hL\" />\n+ <Atom charge=\"-0.033096\" name=\"C313\" type=\"cD\" />\n+ <Atom charge=\"0.014621\" name=\"H13X\" type=\"hL\" />\n+ <Atom charge=\"0.014621\" name=\"H13Y\" type=\"hL\" />\n+ <Atom charge=\"-0.020086\" name=\"C314\" type=\"cD\" />\n+ <Atom charge=\"0.015929\" name=\"H14X\" type=\"hL\" />\n+ <Atom charge=\"0.015929\" name=\"H14Y\" type=\"hL\" />\n+ <Atom charge=\"0.013975\" name=\"C315\" type=\"cD\" />\n+ <Atom charge=\"0.009292\" name=\"H15X\" type=\"hL\" />\n+ <Atom charge=\"0.009292\" name=\"H15Y\" type=\"hL\" />\n+ <Atom charge=\"-0.125447\" name=\"C316\" type=\"cD\" />\n+ <Atom charge=\"0.029047\" name=\"H16X\" type=\"hL\" />\n+ <Atom charge=\"0.029047\" name=\"H16Y\" type=\"hL\" />\n+ <Atom charge=\"0.029047\" name=\"H16Z\" type=\"hL\" />\n+ <Bond atomName1=\"N\" atomName2=\"HN1\" />\n+ <Bond atomName1=\"N\" atomName2=\"HN2\" />\n+ <Bond atomName1=\"N\" atomName2=\"HN3\" />\n+ <Bond atomName1=\"N\" atomName2=\"C12\" />\n+ <Bond atomName1=\"C12\" atomName2=\"H12A\" />\n+ <Bond atomName1=\"C12\" atomName2=\"H12B\" />\n+ <Bond atomName1=\"C12\" atomName2=\"C11\" />\n+ <Bond atomName1=\"C11\" atomName2=\"H11A\" />\n+ <Bond atomName1=\"C11\" atomName2=\"H11B\" />\n+ <Bond atomName1=\"C11\" atomName2=\"O12\" />\n+ <Bond atomName1=\"O12\" atomName2=\"P\" />\n+ <Bond atomName1=\"P\" atomName2=\"O11\" />\n+ <Bond atomName1=\"P\" atomName2=\"O13\" />\n+ <Bond atomName1=\"P\" atomName2=\"O14\" />\n+ <Bond atomName1=\"C1\" atomName2=\"HA\" />\n+ <Bond atomName1=\"C1\" atomName2=\"HB\" />\n+ <Bond atomName1=\"C1\" atomName2=\"C2\" />\n+ <Bond atomName1=\"C1\" atomName2=\"O11\" />\n+ <Bond atomName1=\"C2\" atomName2=\"HS\" />\n+ <Bond atomName1=\"C2\" atomName2=\"C3\" />\n+ <Bond atomName1=\"C2\" atomName2=\"O21\" />\n+ <Bond atomName1=\"C3\" atomName2=\"HX\" />\n+ <Bond atomName1=\"C3\" atomName2=\"HY\" />\n+ <Bond atomName1=\"C3\" atomName2=\"O31\" />\n+ <Bond atomName1=\"O21\" atomName2=\"C21\" />\n+ <Bond atomName1=\"C21\" atomName2=\"C22\" />\n+ <Bond atomName1=\"C21\" atomName2=\"O22\" />\n+ <Bond atomName1=\"C22\" atomName2=\"H2R\" />\n+ <Bond atomName1=\"C22\" atomName2=\"H2S\" />\n+ <Bond atomName1=\"C22\" atomName2=\"C23\" />\n+ <Bond atomName1=\"C23\" atomName2=\"H3R\" />\n+ <Bond atomName1=\"C23\" atomName2=\"H3S\" />\n+ <Bond atomName1=\"C23\" atomName2=\"C24\" />\n+ <Bond atomName1=\"C24\" atomName2=\"H4R\" />\n+ <Bond atomName1=\"C24\" atomName2=\"H4S\" />\n+ <Bond atomName1=\"C24\" atomName2=\"C25\" />\n+ <Bond atomName1=\"C25\" atomName2=\"H5R\" />\n+ <Bond atomName1=\"C25\" atomName2=\"H5S\" />\n+ <Bond atomName1=\"C25\" atomName2=\"C26\" />\n+ <Bond atomName1=\"C26\" atomName2=\"H6R\" />\n+ <Bond atomName1=\"C26\" atomName2=\"H6S\" />\n+ <Bond atomName1=\"C26\" atomName2=\"C27\" />\n+ <Bond atomName1=\"C27\" atomName2=\"H7R\" />\n+ <Bond atomName1=\"C27\" atomName2=\"H7S\" />\n+ <Bond atomName1=\"C27\" atomName2=\"C28\" />\n+ <Bond atomName1=\"C28\" atomName2=\"H8R\" />\n+ <Bond atomName1=\"C28\" atomName2=\"H8S\" />\n+ <Bond atomName1=\"C28\" atomName2=\"C29\" />\n+ <Bond atomName1=\"C29\" atomName2=\"H91\" />\n+ <Bond atomName1=\"C29\" atomName2=\"C210\" />\n+ <Bond atomName1=\"C210\" atomName2=\"H101\" />\n+ <Bond atomName1=\"C210\" atomName2=\"C211\" />\n+ <Bond atomName1=\"C211\" atomName2=\"H11R\" />\n+ <Bond atomName1=\"C211\" atomName2=\"H11S\" />\n+ <Bond atomName1=\"C211\" atomName2=\"C212\" />\n+ <Bond atomName1=\"C212\" atomName2=\"H12R\" />\n+ <Bond atomName1=\"C212\" atomName2=\"H12S\" />\n+ <Bond atomName1=\"C212\" atomName2=\"C213\" />\n+ <Bond atomName1=\"C213\" atomName2=\"H13R\" />\n+ <Bond atomName1=\"C213\" atomName2=\"H13S\" />\n+ <Bond atomName1=\"C213\" atomName2=\"C214\" />\n+ <Bond atomName1=\"C214\" atomName2=\"H14R\" />\n+ <Bond atomName1=\"C214\" atomName2=\"H14S\" />\n+ <Bond atomName1=\"C214\" atomName2=\"C215\" />\n+ <Bond atomName1=\"C215\" atomName2=\"H15R\" />\n+ <Bond atomName1=\"C215\" atomName2=\"H15S\" />\n+ <Bond atomName1=\"C215\" atomName2=\"C216\" />\n+ <Bond atomName1=\"C216\" atomName2=\"H16R\" />\n+ <Bond atomName1=\"C216\" atomName2=\"H16S\" />\n+ <Bond atomName1=\"C216\" atomName2=\"C217\" />\n+ <Bond atomName1=\"C217\" atomName2=\"H17R\" />\n+ <Bond atomName1=\"C217\" atomName2=\"H17S\" />\n+ <Bond atomName1=\"C217\" atomName2=\"C218\" />\n+ <Bond atomName1=\"C218\" atomName2=\"H18R\" />\n+ <Bond atomName1=\"C218\" atomName2=\"H18S\" />\n+ <Bond atomName1=\"C218\" atomName2=\"H18T\" />\n+ <Bond atomName1=\"O31\" atomName2=\"C31\" />\n+ <Bond atomName1=\"C31\" atomName2=\"C32\" />\n+ <Bond atomName1=\"C31\" atomName2=\"O32\" />\n+ <Bond atomName1=\"C32\" atomName2=\"H2X\" />\n+ <Bond atomName1=\"C32\" atomName2=\"H2Y\" />\n+ <Bond atomName1=\"C32\" atomName2=\"C33\" />\n+ <Bond atomName1=\"C33\" atomName2=\"H3X\" />\n+ <Bond atomName1=\"C33\" atomName2=\"H3Y\" />\n+ <Bond atomName1=\"C33\" atomName2=\"C34\" />\n+ <Bond atomName1=\"C34\" atomName2=\"H4X\" />\n+ <Bond atomName1=\"C34\" atomName2=\"H4Y\" />\n+ <Bond atomName1=\"C34\" atomName2=\"C35\" />\n+ <Bond atomName1=\"C35\" atomName2=\"H5X\" />\n+ <Bond atomName1=\"C35\" atomName2=\"H5Y\" />\n+ <Bond atomName1=\"C35\" atomName2=\"C36\" />\n+ <Bond atomName1=\"C36\" atomName2=\"H6X\" />\n+ <Bond atomName1=\"C36\" atomName2=\"H6Y\" />\n+ <Bond atomName1=\"C36\" atomName2=\"C37\" />\n+ <Bond atomName1=\"C37\" atomName2=\"H7X\" />\n+ <Bond atomName1=\"C37\" atomName2=\"H7Y\" />\n+ <Bond atomName1=\"C37\" atomName2=\"C38\" />\n+ <Bond atomName1=\"C38\" atomName2=\"H8X\" />\n+ <Bond atomName1=\"C38\" atomName2=\"H8Y\" />\n+ <Bond atomName1=\"C38\" atomName2=\"C39\" />\n+ <Bond atomName1=\"C39\" atomName2=\"H9X\" />\n+ <Bond atomName1=\"C39\" atomName2=\"H9Y\" />\n+ <Bond atomName1=\"C39\" atomName2=\"C310\" />\n+ <Bond atomName1=\"C310\" atomName2=\"H10X\" />\n+ <Bond atomName1=\"C310\" atomName2=\"H10Y\" />\n+ <Bond atomName1=\"C310\" atomName2=\"C311\" />\n+ <Bond atomName1=\"C311\" atomName2=\"H11X\" />\n+ <Bond atomName1=\"C311\" atomName2=\"H11Y\" />\n+ <Bond atomName1=\"C311\" atomName2=\"C312\" />\n+ <Bond atomName1=\"C312\" atomName2=\"H12X\" />\n+ <Bond atomName1=\"C312\" atomName2=\"H12Y\" />\n+ <Bond atomName1=\"C312\" atomName2=\"C313\" />\n+ <Bond atomName1=\"C313\" atomName2=\"H13X\" />\n+ <Bond atomName1=\"C313\" atomName2=\"H13Y\" />\n+ <Bond atomName1=\"C313\" atomName2=\"C314\" />\n+ <Bond atomName1=\"C314\" atomName2=\"H14X\" />\n+ <Bond atomName1=\"C314\" atomName2=\"H14Y\" />\n+ <Bond atomName1=\"C314\" atomName2=\"C315\" />\n+ <Bond atomName1=\"C315\" atomName2=\"H15X\" />\n+ <Bond atomName1=\"C315\" atomName2=\"H15Y\" />\n+ <Bond atomName1=\"C315\" atomName2=\"C316\" />\n+ <Bond atomName1=\"C316\" atomName2=\"H16X\" />\n+ <Bond atomName1=\"C316\" atomName2=\"H16Y\" />\n+ <Bond atomName1=\"C316\" atomName2=\"H16Z\" />\n+ </Residue>\n+ <Residue name=\"POPS\">\n+ <Atom charge=\"-0.414327\" name=\"N\" type=\"nA\" />\n+ <Atom charge=\"0.353866\" name=\"HN1\" type=\"hN\" />\n+ <Atom charge=\"0.353866\" name=\"HN2\" type=\"hN\" />\n+ <Atom charge=\"0.353866\" name=\"HN3\" type=\"hN\" />\n+ <Atom charge=\"0.039448\" name=\"C12\" type=\"cA\" />\n+ <Atom charge=\"0.090549\" name=\"H12A\" type=\"hX\" />\n+ <Atom charge=\"0.809867\" name=\"C13\" type=\"cC\" />\n+ <Atom charge=\"-0.815178\" name=\"O13A\" type=\"oO\" />\n+ <Atom charge=\"-0.815178\" name=\"O13B\" type=\"oO\" />\n+ <Atom charge=\"0.060375\" name=\"C11\" type=\"cA\" />\n+ <Atom charge=\"0.093484\" name=\"H11A\" type=\"hE\" />\n+ <Atom charge=\"0.093484\" name=\"H11B\" type=\"hE\" />\n+ <Atom charge=\"1.380208\" name=\"P\" type=\"pA\" />\n+ <Atom charge=\"-0.877922\" name=\"O13\" type=\"oP\" />\n+ <Atom charge=\"-0.877922\" name=\"O14\" type=\"oP\" />\n+ <Atom charge=\"-0.520128\" name=\"O12\" type=\"oT\" />\n+ <Atom charge=\"-0.556992\" name=\"O11\" type=\"oT\" />\n+ <Atom charge=\"0.012366\" name=\"C1\" type=\"cA\" />\n+ <Atom charge=\"0.097347\" name=\"HA\" type=\"hE\" />\n+ <Atom charge=\"0.097347\" name=\"HB\" type=\"hE\" />\n+ <Atom charge=\"0.44065\" name=\"C2\" type=\"cA\" />\n+ <Atom charge=\"0.002473\" name=\"HS\" type=\"hE\" />\n+ <Atom charge=\"-0.634381\" name=\"O21\" type=\"oS\" />\n+ <Atom charge=\"0.891897\" name=\"C21\" type=\"cC\" />\n+ <Atom charge=\"-0.650291\" name=\"O22\" type=\"oC\" />\n+ <Atom charge=\"-0.143418\" name=\"C22\" type=\"cD\" />\n+ <Atom charge=\"0.042861\" name=\"H2R\" type=\"hL\" />\n+ <Atom charge=\"0.042861\" name=\"H2S\" type=\"hL\" />\n+ <Atom charge=\"0.271173\" name=\"C3\" type=\"cA\" />\n+ <Atom charge=\"0.037454\" name=\"HX\" type=\"hE\" />\n+ <Atom charge=\"0.037454\" name=\"HY\" type=\"hE\" />\n+ <Atom charge=\"-0.579073\" name=\"O31\" type=\"oS\" />\n+ <Atom charge=\"0.887549\" name=\"C31\" type=\"cC\" />\n+ <Atom charge=\"-0.663331\" name=\"O32\" type=\"oC\" />\n+ <Atom charge=\"-0.149259\" name=\"C32\" type=\"cD\" />\n+ <Atom charge=\"0.047345\" name=\"H2X\" type=\"hL\" />\n+ <Atom charge=\"0.047345\" name=\"H2Y\" type=\"hL\" />\n+ <Atom charge=\"0.001619\" name=\"C23\" type=\"cD\" />\n+ <Atom charge=\"0.019529\" name=\"H3R\" type=\"hL\" />\n+ <Atom charge=\"0.019529\" name=\"H3S\" type=\"hL\" />\n+ <Atom charge=\"-0.02296\" name=\"C24\" type=\"cD\" />\n+ <Atom charge=\"0.018134\" name=\"H4R\" type=\"hL\" />\n+ <Atom charge=\"0.018134\" name=\"H4S\" type=\"hL\" />\n+ <Atom charge=\"-0.016692\" name=\"C25\" type=\"cD\" />\n+ <Atom charge=\"0.00869\" name=\"H5R\" type=\"hL\" />\n+ <Atom charge=\"0.00869\" name=\"H5S\" type=\"hL\" />\n+ <Atom charge=\"-0.023789\" name=\"C26\" type=\"cD\" />\n+ <Atom charge=\"0.009266\" name=\"H6R\" type=\"hL\" />\n+ <Atom charge=\"0.009266\" name=\"H6S\" type=\"hL\" />\n+ <Atom charge=\"-0.017495\" name=\"C27\" type=\"cD\" />\n+ <Atom charge=\"0.019598\" name=\"H7R\" type=\"hL\" />\n+ <Atom charge=\"0.019598\" name=\"H7S\" type=\"hL\" />\n+ <Atom charge=\"0.031775\" name=\"C28\" type=\"cD\" />\n+ <Atom charge=\"0.032685\" name=\"H8R\" type=\"hL\" />\n+ <Atom charge=\"0.032685\" name=\"H8S\" type=\"hL\" />\n+ <Atom charge=\"-0.244228\" name=\"C29\" type=\"cB\" />\n+ <Atom charge=\"0.131512\" name=\"H91\" type=\"hB\" />\n+ <Atom charge=\"-0.239284\" name=\"C210\" type=\"cB\" />\n+ <Atom charge=\"0.126878\" name=\"H101\" type=\"hB\" />\n+ <Atom charge=\"0.029059\" name=\"C211\" type=\"cD\" />\n+ <Atom charge=\"0.033531\" name=\"H11R\" type=\"hL\" />\n+ <Atom charge=\"0.033531\" name=\"H11S\" type=\"hL\" />\n+ <Atom charge=\"-0.026353\" name=\"C212\" type=\"cD\" />\n+ <Atom charge=\"0.019717\" name=\"H12R\" type=\"hL\" />\n+ <Atom charge=\"0.019717\" name=\"H12S\" type=\"hL\" />\n+ <Atom charge=\"-0.018257\" name=\"C213\" type=\"cD\" />\n+ <Atom charge=\"0.0138\" name=\"H13R\" type=\"hL\" />\n+ <Atom charge=\"0.0138\" name=\"H13S\" type=\"hL\" />\n+ <Atom charge=\"-0.024849\" name=\"C214\" type=\"cD\" />\n+ <Atom charge=\"0.008572\" name=\"H14R\" type=\"hL\" />\n+ <Atom charge=\"0.008572\" name=\"H14S\" type=\"hL\" />\n+ <Atom charge=\"-0.023247\" name=\"C215\" type=\"cD\" />\n+ <Atom charge=\"0.010403\" name=\"H15R\" type=\"hL\" />\n+ <Atom charge=\"0.010403\" name=\"H15S\" type=\"hL\" />\n+ <Atom charge=\"-0.012488\" name=\"C216\" type=\"cD\" />\n+ <Atom charge=\"0.013659\" name=\"H16R\" type=\"hL\" />\n+ <Atom charge=\"0.013659\" name=\"H16S\" type=\"hL\" />\n+ <Atom charge=\"0.008684\" name=\"C217\" type=\"cD\" />\n+ <Atom charge=\"0.010026\" name=\"H17R\" type=\"hL\" />\n+ <Atom charge=\"0.010026\" name=\"H17S\" type=\"hL\" />\n+ <Atom charge=\"-0.11729\" name=\"C218\" type=\"cD\" />\n+ <Atom charge=\"0.026627\" name=\"H18R\" type=\"hL\" />\n+ <Atom charge=\"0.026627\" name=\"H18S\" type=\"hL\" />\n+ <Atom charge=\"0.026627\" name=\"H18T\" type=\"hL\" />\n+ <Atom charge=\"-0.004882\" name=\"C33\" type=\"cD\" />\n+ <Atom charge=\"0.019007\" name=\"H3X\" type=\"hL\" />\n+ <Atom charge=\"0.019007\" name=\"H3Y\" type=\"hL\" />\n+ <Atom charge=\"-0.030099\" name=\"C34\" type=\"cD\" />\n+ <Atom charge=\"0.020877\" name=\"H4X\" type=\"hL\" />\n+ <Atom charge=\"0.020877\" name=\"H4Y\" type=\"hL\" />\n+ <Atom charge=\"-0.029387\" name=\"C35\" type=\"cD\" />\n+ <Atom charge=\"0.016763\" name=\"H5X\" type=\"hL\" />\n+ <Atom charge=\"0.016763\" name=\"H5Y\" type=\"hL\" />\n+ <Atom charge=\"-0.024427\" name=\"C36\" type=\"cD\" />\n+ <Atom charge=\"0.013334\" name=\"H6X\" type=\"hL\" />\n+ <Atom charge=\"0.013334\" name=\"H6Y\" type=\"hL\" />\n+ <Atom charge=\"-0.01963\" name=\"C37\" type=\"cD\" />\n+ <Atom charge=\"0.011041\" name=\"H7X\" type=\"hL\" />\n+ <Atom charge=\"0.011041\" name=\"H7Y\" type=\"hL\" />\n+ <Atom charge=\"-0.015793\" name=\"C38\" type=\"cD\" />\n+ <Atom charge=\"0.009067\" name=\"H8X\" type=\"hL\" />\n+ <Atom charge=\"0.009067\" name=\"H8Y\" type=\"hL\" />\n+ <Atom charge=\"-0.030472\" name=\"C39\" type=\"cD\" />\n+ <Atom charge=\"0.013897\" name=\"H9X\" type=\"hL\" />\n+ <Atom charge=\"0.013897\" name=\"H9Y\" type=\"hL\" />\n+ <Atom charge=\"-0.028831\" name=\"C310\" type=\"cD\" />\n+ <Atom charge=\"0.014691\" name=\"H10X\" type=\"hL\" />\n+ <Atom charge=\"0.014691\" name=\"H10Y\" type=\"hL\" />\n+ <Atom charge=\"-0.025206\" name=\"C311\" type=\"cD\" />\n+ <Atom charge=\"0.014334\" name=\"H11X\" type=\"hL\" />\n+ <Atom charge=\"0.014334\" name=\"H11Y\" type=\"hL\" />\n+ <Atom charge=\"-0.027633\" name=\"C312\" type=\"cD\" />\n+ <Atom charge=\"0.011368\" name=\"H12X\" type=\"hL\" />\n+ <Atom charge=\"0.011368\" name=\"H12Y\" type=\"hL\" />\n+ <Atom charge=\"-0.033096\" name=\"C313\" type=\"cD\" />\n+ <Atom charge=\"0.014621\" name=\"H13X\" type=\"hL\" />\n+ <Atom charge=\"0.014621\" name=\"H13Y\" type=\"hL\" />\n+ <Atom charge=\"-0.020086\" name=\"C314\" type=\"cD\" />\n+ <Atom charge=\"0.015929\" name=\"H14X\" type=\"hL\" />\n+ <Atom charge=\"0.015929\" name=\"H14Y\" type=\"hL\" />\n+ <Atom charge=\"0.013975\" name=\"C315\" type=\"cD\" />\n+ <Atom charge=\"0.009292\" name=\"H15X\" type=\"hL\" />\n+ <Atom charge=\"0.009292\" name=\"H15Y\" type=\"hL\" />\n+ <Atom charge=\"-0.125447\" name=\"C316\" type=\"cD\" />\n+ <Atom charge=\"0.029047\" name=\"H16X\" type=\"hL\" />\n+ <Atom charge=\"0.029047\" name=\"H16Y\" type=\"hL\" />\n+ <Atom charge=\"0.029047\" name=\"H16Z\" type=\"hL\" />\n+ <Bond atomName1=\"N\" atomName2=\"HN1\" />\n+ <Bond atomName1=\"N\" atomName2=\"HN2\" />\n+ <Bond atomName1=\"N\" atomName2=\"HN3\" />\n+ <Bond atomName1=\"N\" atomName2=\"C12\" />\n+ <Bond atomName1=\"O13B\" atomName2=\"C13\" />\n+ <Bond atomName1=\"C13\" atomName2=\"C12\" />\n+ <Bond atomName1=\"C13\" atomName2=\"O13A\" />\n+ <Bond atomName1=\"C12\" atomName2=\"H12A\" />\n+ <Bond atomName1=\"C12\" atomName2=\"C11\" />\n+ <Bond atomName1=\"C1\" atomName2=\"O11\" />\n+ <Bond atomName1=\"C11\" atomName2=\"H11A\" />\n+ <Bond atomName1=\"C11\" atomName2=\"H11B\" />\n+ <Bond atomName1=\"C11\" atomName2=\"O12\" />\n+ <Bond atomName1=\"O12\" atomName2=\"P\" />\n+ <Bond atomName1=\"P\" atomName2=\"O11\" />\n+ <Bond atomName1=\"P\" atomName2=\"O13\" />\n+ <Bond atomName1=\"P\" atomName2=\"O14\" />\n+ <Bond atomName1=\"C1\" atomName2=\"HA\" />\n+ <Bond atomName1=\"C1\" atomName2=\"HB\" />\n+ <Bond atomName1=\"C1\" atomName2=\"C2\" />\n+ <Bond atomName1=\"C2\" atomName2=\"HS\" />\n+ <Bond atomName1=\"C2\" atomName2=\"C3\" />\n+ <Bond atomName1=\"C2\" atomName2=\"O21\" />\n+ <Bond atomName1=\"C3\" atomName2=\"HX\" />\n+ <Bond atomName1=\"C3\" atomName2=\"HY\" />\n+ <Bond atomName1=\"C3\" atomName2=\"O31\" />\n+ <Bond atomName1=\"O21\" atomName2=\"C21\" />\n+ <Bond atomName1=\"C21\" atomName2=\"C22\" />\n+ <Bond atomName1=\"C21\" atomName2=\"O22\" />\n+ <Bond atomName1=\"C22\" atomName2=\"H2R\" />\n+ <Bond atomName1=\"C22\" atomName2=\"H2S\" />\n+ <Bond atomName1=\"C22\" atomName2=\"C23\" />\n+ <Bond atomName1=\"C23\" atomName2=\"H3R\" />\n+ <Bond atomName1=\"C23\" atomName2=\"H3S\" />\n+ <Bond atomName1=\"C23\" atomName2=\"C24\" />\n+ <Bond atomName1=\"C24\" atomName2=\"H4R\" />\n+ <Bond atomName1=\"C24\" atomName2=\"H4S\" />\n+ <Bond atomName1=\"C24\" atomName2=\"C25\" />\n+ <Bond atomName1=\"C25\" atomName2=\"H5R\" />\n+ <Bond atomName1=\"C25\" atomName2=\"H5S\" />\n+ <Bond atomName1=\"C25\" atomName2=\"C26\" />\n+ <Bond atomName1=\"C26\" atomName2=\"H6R\" />\n+ <Bond atomName1=\"C26\" atomName2=\"H6S\" />\n+ <Bond atomName1=\"C26\" atomName2=\"C27\" />\n+ <Bond atomName1=\"C27\" atomName2=\"H7R\" />\n+ <Bond atomName1=\"C27\" atomName2=\"H7S\" />\n+ <Bond atomName1=\"C27\" atomName2=\"C28\" />\n+ <Bond atomName1=\"C28\" atomName2=\"H8R\" />\n+ <Bond atomName1=\"C28\" atomName2=\"H8S\" />\n+ <Bond atomName1=\"C28\" atomName2=\"C29\" />\n+ <Bond atomName1=\"C29\" atomName2=\"H91\" />\n+ <Bond atomName1=\"C29\" atomName2=\"C210\" />\n+ <Bond atomName1=\"C210\" atomName2=\"H101\" />\n+ <Bond atomName1=\"C210\" atomName2=\"C211\" />\n+ <Bond atomName1=\"C211\" atomName2=\"H11R\" />\n+ <Bond atomName1=\"C211\" atomName2=\"H11S\" />\n+ <Bond atomName1=\"C211\" atomName2=\"C212\" />\n+ <Bond atomName1=\"C212\" atomName2=\"H12R\" />\n+ <Bond atomName1=\"C212\" atomName2=\"H12S\" />\n+ <Bond atomName1=\"C212\" atomName2=\"C213\" />\n+ <Bond atomName1=\"C213\" atomName2=\"H13R\" />\n+ <Bond atomName1=\"C213\" atomName2=\"H13S\" />\n+ <Bond atomName1=\"C213\" atomName2=\"C214\" />\n+ <Bond atomName1=\"C214\" atomName2=\"H14R\" />\n+ <Bond atomName1=\"C214\" atomName2=\"H14S\" />\n+ <Bond atomName1=\"C214\" atomName2=\"C215\" />\n+ <Bond atomName1=\"C215\" atomName2=\"H15R\" />\n+ <Bond atomName1=\"C215\" atomName2=\"H15S\" />\n+ <Bond atomName1=\"C215\" atomName2=\"C216\" />\n+ <Bond atomName1=\"C216\" atomName2=\"H16R\" />\n+ <Bond atomName1=\"C216\" atomName2=\"H16S\" />\n+ <Bond atomName1=\"C216\" atomName2=\"C217\" />\n+ <Bond atomName1=\"C217\" atomName2=\"H17R\" />\n+ <Bond atomName1=\"C217\" atomName2=\"H17S\" />\n+ <Bond atomName1=\"C217\" atomName2=\"C218\" />\n+ <Bond atomName1=\"C218\" atomName2=\"H18R\" />\n+ <Bond atomName1=\"C218\" atomName2=\"H18S\" />\n+ <Bond atomName1=\"C218\" atomName2=\"H18T\" />\n+ <Bond atomName1=\"O31\" atomName2=\"C31\" />\n+ <Bond atomName1=\"C31\" atomName2=\"C32\" />\n+ <Bond atomName1=\"C31\" atomName2=\"O32\" />\n+ <Bond atomName1=\"C32\" atomName2=\"H2X\" />\n+ <Bond atomName1=\"C32\" atomName2=\"H2Y\" />\n+ <Bond atomName1=\"C32\" atomName2=\"C33\" />\n+ <Bond atomName1=\"C33\" atomName2=\"H3X\" />\n+ <Bond atomName1=\"C33\" atomName2=\"H3Y\" />\n+ <Bond atomName1=\"C33\" atomName2=\"C34\" />\n+ <Bond atomName1=\"C34\" atomName2=\"H4X\" />\n+ <Bond atomName1=\"C34\" atomName2=\"H4Y\" />\n+ <Bond atomName1=\"C34\" atomName2=\"C35\" />\n+ <Bond atomName1=\"C35\" atomName2=\"H5X\" />\n+ <Bond atomName1=\"C35\" atomName2=\"H5Y\" />\n+ <Bond atomName1=\"C35\" atomName2=\"C36\" />\n+ <Bond atomName1=\"C36\" atomName2=\"H6X\" />\n+ <Bond atomName1=\"C36\" atomName2=\"H6Y\" />\n+ <Bond atomName1=\"C36\" atomName2=\"C37\" />\n+ <Bond atomName1=\"C37\" atomName2=\"H7X\" />\n+ <Bond atomName1=\"C37\" atomName2=\"H7Y\" />\n+ <Bond atomName1=\"C37\" atomName2=\"C38\" />\n+ <Bond atomName1=\"C38\" atomName2=\"H8X\" />\n+ <Bond atomName1=\"C38\" atomName2=\"H8Y\" />\n+ <Bond atomName1=\"C38\" atomName2=\"C39\" />\n+ <Bond atomName1=\"C39\" atomName2=\"H9X\" />\n+ <Bond atomName1=\"C39\" atomName2=\"H9Y\" />\n+ <Bond atomName1=\"C39\" atomName2=\"C310\" />\n+ <Bond atomName1=\"C310\" atomName2=\"H10X\" />\n+ <Bond atomName1=\"C310\" atomName2=\"H10Y\" />\n+ <Bond atomName1=\"C310\" atomName2=\"C311\" />\n+ <Bond atomName1=\"C311\" atomName2=\"H11X\" />\n+ <Bond atomName1=\"C311\" atomName2=\"H11Y\" />\n+ <Bond atomName1=\"C311\" atomName2=\"C312\" />\n+ <Bond atomName1=\"C312\" atomName2=\"H12X\" />\n+ <Bond atomName1=\"C312\" atomName2=\"H12Y\" />\n+ <Bond atomName1=\"C312\" atomName2=\"C313\" />\n+ <Bond atomName1=\"C313\" atomName2=\"H13X\" />\n+ <Bond atomName1=\"C313\" atomName2=\"H13Y\" />\n+ <Bond atomName1=\"C313\" atomName2=\"C314\" />\n+ <Bond atomName1=\"C314\" atomName2=\"H14X\" />\n+ <Bond atomName1=\"C314\" atomName2=\"H14Y\" />\n+ <Bond atomName1=\"C314\" atomName2=\"C315\" />\n+ <Bond atomName1=\"C315\" atomName2=\"H15X\" />\n+ <Bond atomName1=\"C315\" atomName2=\"H15Y\" />\n+ <Bond atomName1=\"C315\" atomName2=\"C316\" />\n+ <Bond atomName1=\"C316\" atomName2=\"H16X\" />\n+ <Bond atomName1=\"C316\" atomName2=\"H16Y\" />\n+ <Bond atomName1=\"C316\" atomName2=\"H16Z\" />\n+ </Residue>\n+ <Residue name=\"POPA\">\n+ <Atom charge=\"1.456663\" name=\"P\" type=\"pA\" />\n+ <Atom charge=\"-0.914158\" name=\"O13\" type=\"oP\" />\n+ <Atom charge=\"-0.914158\" name=\"O14\" type=\"oP\" />\n+ <Atom charge=\"-0.706197\" name=\"O12\" type=\"oH\" />\n+ <Atom charge=\"0.415628\" name=\"H12\" type=\"hO\" />\n+ <Atom charge=\"-0.594197\" name=\"O11\" type=\"oT\" />\n+ <Atom charge=\"0.081528\" name=\"C1\" type=\"cA\" />\n+ <Atom charge=\"0.083099\" name=\"HA\" type=\"hE\" />\n+ <Atom charge=\"0.083099\" name=\"HB\" type=\"hE\" />\n+ <Atom charge=\"0.283546\" name=\"C2\" type=\"cA\" />\n+ <Atom charge=\"0.063862\" name=\"HS\" type=\"hE\" />\n+ <Atom charge=\"-0.554487\" name=\"O21\" type=\"oS\" />\n+ <Atom charge=\"0.897502\" name=\"C21\" type=\"cC\" />\n+ <Atom charge=\"-0.671622\" name=\"O22\" type=\"oC\" />\n+ <Atom charge=\"-0.143418\" name=\"C22\" type=\"cD\" />\n+ <Atom charge=\"0.042861\" name=\"H2R\" type=\"hL\" />\n+ <Atom charge=\"0.042861\" name=\"H2S\" type=\"hL\" />\n+ <Atom charge=\"0.185299\" name=\"C3\" type=\"cA\" />\n+ <Atom charge=\"0.067676\" name=\"HX\" type=\"hE\" />\n+ <Atom charge=\"0.067676\" name=\"HY\" type=\"hE\" />\n+ <Atom charge=\"-0.547824\" name=\"O31\" type=\"oS\" />\n+ <Atom charge=\"0.888207\" name=\"C31\" type=\"cC\" />\n+ <Atom charge=\"-0.671142\" name=\"O32\" type=\"oC\" />\n+ <Atom charge=\"-0.149259\" name=\"C32\" type=\"cD\" />\n+ <Atom charge=\"0.047345\" name=\"H2X\" type=\"hL\" />\n+ <Atom charge=\"0.047345\" name=\"H2Y\" type=\"hL\" />\n+ <Atom charge=\"0.001619\" name=\"C23\" type=\"cD\" />\n+ <Atom charge=\"0.019529\" name=\"H3R\" type=\"hL\" />\n+ <Atom charge=\"0.019529\" name=\"H3S\" type=\"hL\" />\n+ <Atom charge=\"-0.02296\" name=\"C24\" type=\"cD\" />\n+ <Atom charge=\"0.018134\" name=\"H4R\" type=\"hL\" />\n+ <Atom charge=\"0.018134\" name=\"H4S\" type=\"hL\" />\n+ <Atom charge=\"-0.016692\" name=\"C25\" type=\"cD\" />\n+ <Atom charge=\"0.00869\" name=\"H5R\" type=\"hL\" />\n+ <Atom charge=\"0.00869\" name=\"H5S\" type=\"hL\" />\n+ <Atom charge=\"-0.023789\" name=\"C26\" type=\"cD\" />\n+ <Atom charge=\"0.009266\" name=\"H6R\" type=\"hL\" />\n+ <Atom charge=\"0.009266\" name=\"H6S\" type=\"hL\" />\n+ <Atom charge=\"-0.017495\" name=\"C27\" type=\"cD\" />\n+ <Atom charge=\"0.019598\" name=\"H7R\" type=\"hL\" />\n+ <Atom charge=\"0.019598\" name=\"H7S\" type=\"hL\" />\n+ <Atom charge=\"0.031775\" name=\"C28\" type=\"cD\" />\n+ <Atom charge=\"0.032685\" name=\"H8R\" type=\"hL\" />\n+ <Atom charge=\"0.032685\" name=\"H8S\" type=\"hL\" />\n+ <Atom charge=\"-0.244228\" name=\"C29\" type=\"cB\" />\n+ <Atom charge=\"0.131512\" name=\"H91\" type=\"hB\" />\n+ <Atom charge=\"-0.239284\" name=\"C210\" type=\"cB\" />\n+ <Atom charge=\"0.126878\" name=\"H101\" type=\"hB\" />\n+ <Atom charge=\"0.029059\" name=\"C211\" type=\"cD\" />\n+ <Atom charge=\"0.033531\" name=\"H11R\" type=\"hL\" />\n+ <Atom charge=\"0.033531\" name=\"H11S\" type=\"hL\" />\n+ <Atom charge=\"-0.026353\" name=\"C212\" type=\"cD\" />\n+ <Atom charge=\"0.019717\" name=\"H12R\" type=\"hL\" />\n+ <Atom charge=\"0.019717\" name=\"H12S\" type=\"hL\" />\n+ <Atom charge=\"-0.018257\" name=\"C213\" type=\"cD\" />\n+ <Atom charge=\"0.0138\" name=\"H13R\" type=\"hL\" />\n+ <Atom charge=\"0.0138\" name=\"H13S\" type=\"hL\" />\n+ <Atom charge=\"-0.024849\" name=\"C214\" type=\"cD\" />\n+ <Atom charge=\"0.008572\" name=\"H14R\" type=\"hL\" />\n+ <Atom charge=\"0.008572\" name=\"H14S\" type=\"hL\" />\n+ <Atom charge=\"-0.023247\" name=\"C215\" type=\"cD\" />\n+ <Atom charge=\"0.010403\" name=\"H15R\" type=\"hL\" />\n+ <Atom charge=\"0.010403\" name=\"H15S\" type=\"hL\" />\n+ <Atom charge=\"-0.012488\" name=\"C216\" type=\"cD\" />\n+ <Atom charge=\"0.013659\" name=\"H16R\" type=\"hL\" />\n+ <Atom charge=\"0.013659\" name=\"H16S\" type=\"hL\" />\n+ <Atom charge=\"0.008684\" name=\"C217\" type=\"cD\" />\n+ <Atom charge=\"0.010026\" name=\"H17R\" type=\"hL\" />\n+ <Atom charge=\"0.010026\" name=\"H17S\" type=\"hL\" />\n+ <Atom charge=\"-0.11729\" name=\"C218\" type=\"cD\" />\n+ <Atom charge=\"0.026627\" name=\"H18R\" type=\"hL\" />\n+ <Atom charge=\"0.026627\" name=\"H18S\" type=\"hL\" />\n+ <Atom charge=\"0.026627\" name=\"H18T\" type=\"hL\" />\n+ <Atom charge=\"-0.004882\" name=\"C33\" type=\"cD\" />\n+ <Atom charge=\"0.019007\" name=\"H3X\" type=\"hL\" />\n+ <Atom charge=\"0.019007\" name=\"H3Y\" type=\"hL\" />\n+ <Atom charge=\"-0.030099\" name=\"C34\" type=\"cD\" />\n+ <Atom charge=\"0.020877\" name=\"H4X\" type=\"hL\" />\n+ <Atom charge=\"0.020877\" name=\"H4Y\" type=\"hL\" />\n+ <Atom charge=\"-0.029387\" name=\"C35\" type=\"cD\" />\n+ <Atom charge=\"0.016763\" name=\"H5X\" type=\"hL\" />\n+ <Atom charge=\"0.016763\" name=\"H5Y\" type=\"hL\" />\n+ <Atom charge=\"-0.024427\" name=\"C36\" type=\"cD\" />\n+ <Atom charge=\"0.013334\" name=\"H6X\" type=\"hL\" />\n+ <Atom charge=\"0.013334\" name=\"H6Y\" type=\"hL\" />\n+ <Atom charge=\"-0.01963\" name=\"C37\" type=\"cD\" />\n+ <Atom charge=\"0.011041\" name=\"H7X\" type=\"hL\" />\n+ <Atom charge=\"0.011041\" name=\"H7Y\" type=\"hL\" />\n+ <Atom charge=\"-0.015793\" name=\"C38\" type=\"cD\" />\n+ <Atom charge=\"0.009067\" name=\"H8X\" type=\"hL\" />\n+ <Atom charge=\"0.009067\" name=\"H8Y\" type=\"hL\" />\n+ <Atom charge=\"-0.030472\" name=\"C39\" type=\"cD\" />\n+ <Atom charge=\"0.013897\" name=\"H9X\" type=\"hL\" />\n+ <Atom charge=\"0.013897\" name=\"H9Y\" type=\"hL\" />\n+ <Atom charge=\"-0.028831\" name=\"C310\" type=\"cD\" />\n+ <Atom charge=\"0.014691\" name=\"H10X\" type=\"hL\" />\n+ <Atom charge=\"0.014691\" name=\"H10Y\" type=\"hL\" />\n+ <Atom charge=\"-0.025206\" name=\"C311\" type=\"cD\" />\n+ <Atom charge=\"0.014334\" name=\"H11X\" type=\"hL\" />\n+ <Atom charge=\"0.014334\" name=\"H11Y\" type=\"hL\" />\n+ <Atom charge=\"-0.027633\" name=\"C312\" type=\"cD\" />\n+ <Atom charge=\"0.011368\" name=\"H12X\" type=\"hL\" />\n+ <Atom charge=\"0.011368\" name=\"H12Y\" type=\"hL\" />\n+ <Atom charge=\"-0.033096\" name=\"C313\" type=\"cD\" />\n+ <Atom charge=\"0.014621\" name=\"H13X\" type=\"hL\" />\n+ <Atom charge=\"0.014621\" name=\"H13Y\" type=\"hL\" />\n+ <Atom charge=\"-0.020086\" name=\"C314\" type=\"cD\" />\n+ <Atom charge=\"0.015929\" name=\"H14X\" type=\"hL\" />\n+ <Atom charge=\"0.015929\" name=\"H14Y\" type=\"hL\" />\n+ <Atom charge=\"0.013975\" name=\"C315\" type=\"cD\" />\n+ <Atom charge=\"0.009292\" name=\"H15X\" type=\"hL\" />\n+ <Atom charge=\"0.009292\" name=\"H15Y\" type=\"hL\" />\n+ <Atom charge=\"-0.125447\" name=\"C316\" type=\"cD\" />\n+ <Atom charge=\"0.029047\" name=\"H16X\" type=\"hL\" />\n+ <Atom charge=\"0.029047\" name=\"H16Y\" type=\"hL\" />\n+ <Atom charge=\"0.029047\" name=\"H16Z\" type=\"hL\" />\n+ <Bond atomName1=\"O12\" atomName2=\"P\" />\n+ <Bond atomName1=\"P\" atomName2=\"O11\" />\n+ <Bond atomName1=\"P\" atomName2=\"O13\" />\n+ <Bond atomName1=\"P\" atomName2=\"O14\" />\n+ <Bond atomName1=\"O12\" atomName2=\"H12\" />\n+ <Bond atomName1=\"O11\" atomName2=\"C1\" />\n+ <Bond atomName1=\"C1\" atomName2=\"HA\" />\n+ <Bond atomName1=\"C1\" atomName2=\"HB\" />\n+ <Bond atomName1=\"C1\" atomName2=\"C2\" />\n+ <Bond atomName1=\"C2\" atomName2=\"HS\" />\n+ <Bond atomName1=\"C2\" atomName2=\"C3\" />\n+ <Bond atomName1=\"C2\" atomName2=\"O21\" />\n+ <Bond atomName1=\"C3\" atomName2=\"HX\" />\n+ <Bond atomName1=\"C3\" atomName2=\"HY\" />\n+ <Bond atomName1=\"C3\" atomName2=\"O31\" />\n+ <Bond atomName1=\"O21\" atomName2=\"C21\" />\n+ <Bond atomName1=\"C21\" atomName2=\"C22\" />\n+ <Bond atomName1=\"C21\" atomName2=\"O22\" />\n+ <Bond atomName1=\"C22\" atomName2=\"H2R\" />\n+ <Bond atomName1=\"C22\" atomName2=\"H2S\" />\n+ <Bond atomName1=\"C22\" atomName2=\"C23\" />\n+ <Bond atomName1=\"C23\" atomName2=\"H3R\" />\n+ <Bond atomName1=\"C23\" atomName2=\"H3S\" />\n+ <Bond atomName1=\"C23\" atomName2=\"C24\" />\n+ <Bond atomName1=\"C24\" atomName2=\"H4R\" />\n+ <Bond atomName1=\"C24\" atomName2=\"H4S\" />\n+ <Bond atomName1=\"C24\" atomName2=\"C25\" />\n+ <Bond atomName1=\"C25\" atomName2=\"H5R\" />\n+ <Bond atomName1=\"C25\" atomName2=\"H5S\" />\n+ <Bond atomName1=\"C25\" atomName2=\"C26\" />\n+ <Bond atomName1=\"C26\" atomName2=\"H6R\" />\n+ <Bond atomName1=\"C26\" atomName2=\"H6S\" />\n+ <Bond atomName1=\"C26\" atomName2=\"C27\" />\n+ <Bond atomName1=\"C27\" atomName2=\"H7R\" />\n+ <Bond atomName1=\"C27\" atomName2=\"H7S\" />\n+ <Bond atomName1=\"C27\" atomName2=\"C28\" />\n+ <Bond atomName1=\"C28\" atomName2=\"H8R\" />\n+ <Bond atomName1=\"C28\" atomName2=\"H8S\" />\n+ <Bond atomName1=\"C28\" atomName2=\"C29\" />\n+ <Bond atomName1=\"C29\" atomName2=\"H91\" />\n+ <Bond atomName1=\"C29\" atomName2=\"C210\" />\n+ <Bond atomName1=\"C210\" atomName2=\"H101\" />\n+ <Bond atomName1=\"C210\" atomName2=\"C211\" />\n+ <Bond atomName1=\"C211\" atomName2=\"H11R\" />\n+ <Bond atomName1=\"C211\" atomName2=\"H11S\" />\n+ <Bond atomName1=\"C211\" atomName2=\"C212\" />\n+ <Bond atomName1=\"C212\" atomName2=\"H12R\" />\n+ <Bond atomName1=\"C212\" atomName2=\"H12S\" />\n+ <Bond atomName1=\"C212\" atomName2=\"C213\" />\n+ <Bond atomName1=\"C213\" atomName2=\"H13R\" />\n+ <Bond atomName1=\"C213\" atomName2=\"H13S\" />\n+ <Bond atomName1=\"C213\" atomName2=\"C214\" />\n+ <Bond atomName1=\"C214\" atomName2=\"H14R\" />\n+ <Bond atomName1=\"C214\" atomName2=\"H14S\" />\n+ <Bond atomName1=\"C214\" atomName2=\"C215\" />\n+ <Bond atomName1=\"C215\" atomName2=\"H15R\" />\n+ <Bond atomName1=\"C215\" atomName2=\"H15S\" />\n+ <Bond atomName1=\"C215\" atomName2=\"C216\" />\n+ <Bond atomName1=\"C216\" atomName2=\"H16R\" />\n+ <Bond atomName1=\"C216\" atomName2=\"H16S\" />\n+ <Bond atomName1=\"C216\" atomName2=\"C217\" />\n+ <Bond atomName1=\"C217\" atomName2=\"H17R\" />\n+ <Bond atomName1=\"C217\" atomName2=\"H17S\" />\n+ <Bond atomName1=\"C217\" atomName2=\"C218\" />\n+ <Bond atomName1=\"C218\" atomName2=\"H18R\" />\n+ <Bond atomName1=\"C218\" atomName2=\"H18S\" />\n+ <Bond atomName1=\"C218\" atomName2=\"H18T\" />\n+ <Bond atomName1=\"O31\" atomName2=\"C31\" />\n+ <Bond atomName1=\"C31\" atomName2=\"C32\" />\n+ <Bond atomName1=\"C31\" atomName2=\"O32\" />\n+ <Bond atomName1=\"C32\" atomName2=\"H2X\" />\n+ <Bond atomName1=\"C32\" atomName2=\"H2Y\" />\n+ <Bond atomName1=\"C32\" atomName2=\"C33\" />\n+ <Bond atomName1=\"C33\" atomName2=\"H3X\" />\n+ <Bond atomName1=\"C33\" atomName2=\"H3Y\" />\n+ <Bond atomName1=\"C33\" atomName2=\"C34\" />\n+ <Bond atomName1=\"C34\" atomName2=\"H4X\" />\n+ <Bond atomName1=\"C34\" atomName2=\"H4Y\" />\n+ <Bond atomName1=\"C34\" atomName2=\"C35\" />\n+ <Bond atomName1=\"C35\" atomName2=\"H5X\" />\n+ <Bond atomName1=\"C35\" atomName2=\"H5Y\" />\n+ <Bond atomName1=\"C35\" atomName2=\"C36\" />\n+ <Bond atomName1=\"C36\" atomName2=\"H6X\" />\n+ <Bond atomName1=\"C36\" atomName2=\"H6Y\" />\n+ <Bond atomName1=\"C36\" atomName2=\"C37\" />\n+ <Bond atomName1=\"C37\" atomName2=\"H7X\" />\n+ <Bond atomName1=\"C37\" atomName2=\"H7Y\" />\n+ <Bond atomName1=\"C37\" atomName2=\"C38\" />\n+ <Bond atomName1=\"C38\" atomName2=\"H8X\" />\n+ <Bond atomName1=\"C38\" atomName2=\"H8Y\" />\n+ <Bond atomName1=\"C38\" atomName2=\"C39\" />\n+ <Bond atomName1=\"C39\" atomName2=\"H9X\" />\n+ <Bond atomName1=\"C39\" atomName2=\"H9Y\" />\n+ <Bond atomName1=\"C39\" atomName2=\"C310\" />\n+ <Bond atomName1=\"C310\" atomName2=\"H10X\" />\n+ <Bond atomName1=\"C310\" atomName2=\"H10Y\" />\n+ <Bond atomName1=\"C310\" atomName2=\"C311\" />\n+ <Bond atomName1=\"C311\" atomName2=\"H11X\" />\n+ <Bond atomName1=\"C311\" atomName2=\"H11Y\" />\n+ <Bond atomName1=\"C311\" atomName2=\"C312\" />\n+ <Bond atomName1=\"C312\" atomName2=\"H12X\" />\n+ <Bond atomName1=\"C312\" atomName2=\"H12Y\" />\n+ <Bond atomName1=\"C312\" atomName2=\"C313\" />\n+ <Bond atomName1=\"C313\" atomName2=\"H13X\" />\n+ <Bond atomName1=\"C313\" atomName2=\"H13Y\" />\n+ <Bond atomName1=\"C313\" atomName2=\"C314\" />\n+ <Bond atomName1=\"C314\" atomName2=\"H14X\" />\n+ <Bond atomName1=\"C314\" atomName2=\"H14Y\" />\n+ <Bond atomName1=\"C314\" atomName2=\"C315\" />\n+ <Bond atomName1=\"C315\" atomName2=\"H15X\" />\n+ <Bond atomName1=\"C315\" atomName2=\"H15Y\" />\n+ <Bond atomName1=\"C315\" atomName2=\"C316\" />\n+ <Bond atomName1=\"C316\" atomName2=\"H16X\" />\n+ <Bond atomName1=\"C316\" atomName2=\"H16Y\" />\n+ <Bond atomName1=\"C316\" atomName2=\"H16Z\" />\n+ </Residue>\n+ <Residue name=\"POPG\">\n+ <Atom charge=\"0.193597\" name=\"C13\" type=\"cA\" />\n+ <Atom charge=\"0.034715\" name=\"H13A\" type=\"hE\" />\n+ <Atom charge=\"0.034715\" name=\"H13B\" type=\"hE\" />\n+ <Atom charge=\"-0.700871\" name=\"OC3\" type=\"oH\" />\n+ <Atom charge=\"0.423328\" name=\"HO3\" type=\"hO\" />\n+ <Atom charge=\"0.336816\" name=\"C12\" type=\"cA\" />\n+ <Atom charge=\"0.030042\" name=\"H12A\" type=\"hE\" />\n+ <Atom charge=\"-0.726192\" name=\"OC2\" type=\"oH\" />\n+ <Atom charge=\"0.439523\" name=\"HO2\" type=\"hO\" />\n+ <Atom charge=\"-0.056706\" name=\"C11\" type=\"cA\" />\n+ <Atom charge=\"0.093354\" name=\"H11A\" type=\"hE\" />\n+ <Atom charge=\"0.093354\" name=\"H11B\" type=\"hE\" />\n+ <Atom charge=\"1.380464\" name=\"P\" type=\"pA\" />\n+ <Atom charge=\"-0.873444\" name=\"O13\" type=\"oP\" />\n+ <Atom charge=\"-0.873444\" name=\"O14\" type=\"oP\" />\n+ <Atom charge=\"-0.534308\" name=\"O12\" type=\"oT\" />\n+ <Atom charge=\"-0.546098\" name=\"O11\" type=\"oT\" />\n+ <Atom charge=\"0.043713\" name=\"C1\" type=\"cA\" />\n+ <Atom charge=\"0.091041\" name=\"HA\" type=\"hE\" />\n+ <Atom charge=\"0.091041\" name=\"HB\" type=\"hE\" />\n+ <Atom charge=\"0.353807\" name=\"C2\" type=\"cA\" />\n+ <Atom charge=\"0.037488\" name=\"HS\" type=\"hE\" />\n+ <Atom charge=\"-0.599131\" name=\"O21\" type=\"oS\" />\n+ <Atom charge=\"0.883669\" name=\"C21\" type=\"cC\" />\n+ <Atom charge=\"-0.655762\" name=\"O22\" type=\"oC\" />\n+ <Atom charge=\"-0.143418\" name=\"C22\" type=\"cD\" />\n+ <Atom charge=\"0.042861\" name=\"H2R\" type=\"hL\" />\n+ <Atom charge=\"0.042861\" name=\"H2S\" type=\"hL\" />\n+ <Atom charge=\"0.295119\" name=\"C3\" type=\"cA\" />\n+ <Atom charge=\"0.033797\" name=\"HX\" type=\"hE\" />\n+ <Atom charge=\"0.033797\" name=\"HY\" type=\"hE\" />\n+ <Atom charge=\"-0.585165\" name=\"O31\" type=\"oS\" />\n+ <Atom charge=\"0.877006\" name=\"C31\" type=\"cC\" />\n+ <Atom charge=\"-0.649265\" name=\"O32\" type=\"oC\" />\n+ <Atom charge=\"-0.149259\" name=\"C32\" type=\"cD\" />\n+ <Atom charge=\"0.047345\" name=\"H2X\" type=\"hL\" />\n+ <Atom charge=\"0.047345\" name=\"H2Y\" type=\"hL\" />\n+ <Atom charge=\"0.001619\" name=\"C23\" type=\"cD\" />\n+ <Atom charge=\"0.019529\" name=\"H3R\" type=\"hL\" />\n+ <Atom charge=\"0.019529\" name=\"H3S\" type=\"hL\" />\n+ <Atom charge=\"-0.02296\" name=\"C24\" type=\"cD\" />\n+ <Atom charge=\"0.018134\" name=\"H4R\" type=\"hL\" />\n+ <Atom charge=\"0.018134\" name=\"H4S\" type=\"hL\" />\n+ <Atom charge=\"-0.016692\" name=\"C25\" type=\"cD\" />\n+ <Atom charge=\"0.00869\" name=\"H5R\" type=\"hL\" />\n+ <Atom charge=\"0.00869\" name=\"H5S\" type=\"hL\" />\n+ <Atom charge=\"-0.023789\" name=\"C26\" type=\"cD\" />\n+ <Atom charge=\"0.009266\" name=\"H6R\" type=\"hL\" />\n+ <Atom charge=\"0.009266\" name=\"H6S\" type=\"hL\" />\n+ <Atom charge=\"-0.017495\" name=\"C27\" type=\"cD\" />\n+ <Atom charge=\"0.019598\" name=\"H7R\" type=\"hL\" />\n+ <Atom charge=\"0.019598\" name=\"H7S\" type=\"hL\" />\n+ <Atom charge=\"0.031775\" name=\"C28\" type=\"cD\" />\n+ <Atom charge=\"0.032685\" name=\"H8R\" type=\"hL\" />\n+ <Atom charge=\"0.032685\" name=\"H8S\" type=\"hL\" />\n+ <Atom charge=\"-0.244228\" name=\"C29\" type=\"cB\" />\n+ <Atom charge=\"0.131512\" name=\"H91\" type=\"hB\" />\n+ <Atom charge=\"-0.239284\" name=\"C210\" type=\"cB\" />\n+ <Atom charge=\"0.126878\" name=\"H101\" type=\"hB\" />\n+ <Atom charge=\"0.029059\" name=\"C211\" type=\"cD\" />\n+ <Atom charge=\"0.033531\" name=\"H11R\" type=\"hL\" />\n+ <Atom charge=\"0.033531\" name=\"H11S\" type=\"hL\" />\n+ <Atom charge=\"-0.026353\" name=\"C212\" type=\"cD\" />\n+ <Atom charge=\"0.019717\" name=\"H12R\" type=\"hL\" />\n+ <Atom charge=\"0.019717\" name=\"H12S\" type=\"hL\" />\n+ <Atom charge=\"-0.018257\" name=\"C213\" type=\"cD\" />\n+ <Atom charge=\"0.0138\" name=\"H13R\" type=\"hL\" />\n+ <Atom charge=\"0.0138\" name=\"H13S\" type=\"hL\" />\n+ <Atom charge=\"-0.024849\" name=\"C214\" type=\"cD\" />\n+ <Atom charge=\"0.008572\" name=\"H14R\" type=\"hL\" />\n+ <Atom charge=\"0.008572\" name=\"H14S\" type=\"hL\" />\n+ <Atom charge=\"-0.023247\" name=\"C215\" type=\"cD\" />\n+ <Atom charge=\"0.010403\" name=\"H15R\" type=\"hL\" />\n+ <Atom charge=\"0.010403\" name=\"H15S\" type=\"hL\" />\n+ <Atom charge=\"-0.012488\" name=\"C216\" type=\"cD\" />\n+ <Atom charge=\"0.013659\" name=\"H16R\" type=\"hL\" />\n+ <Atom charge=\"0.013659\" name=\"H16S\" type=\"hL\" />\n+ <Atom charge=\"0.008684\" name=\"C217\" type=\"cD\" />\n+ <Atom charge=\"0.010026\" name=\"H17R\" type=\"hL\" />\n+ <Atom charge=\"0.010026\" name=\"H17S\" type=\"hL\" />\n+ <Atom charge=\"-0.11729\" name=\"C218\" type=\"cD\" />\n+ <Atom charge=\"0.026627\" name=\"H18R\" type=\"hL\" />\n+ <Atom charge=\"0.026627\" name=\"H18S\" type=\"hL\" />\n+ <Atom charge=\"0.026627\" name=\"H18T\" type=\"hL\" />\n+ <Atom charge=\"-0.004882\" name=\"C33\" type=\"cD\" />\n+ <Atom charge=\"0.019007\" name=\"H3X\" type=\"hL\" />\n+ <Atom charge=\"0.019007\" name=\"H3Y\" type=\"hL\" />\n+ <Atom charge=\"-0.030099\" name=\"C34\" type=\"cD\" />\n+ <Atom charge=\"0.020877\" name=\"H4X\" type=\"hL\" />\n+ <Atom charge=\"0.020877\" name=\"H4Y\" type=\"hL\" />\n+ <Atom charge=\"-0.029387\" name=\"C35\" type=\"cD\" />\n+ <Atom charge=\"0.016763\" name=\"H5X\" type=\"hL\" />\n+ <Atom charge=\"0.016763\" name=\"H5Y\" type=\"hL\" />\n+ <Atom charge=\"-0.024427\" name=\"C36\" type=\"cD\" />\n+ <Atom charge=\"0.013334\" name=\"H6X\" type=\"hL\" />\n+ <Atom charge=\"0.013334\" name=\"H6Y\" type=\"hL\" />\n+ <Atom charge=\"-0.01963\" name=\"C37\" type=\"cD\" />\n+ <Atom charge=\"0.011041\" name=\"H7X\" type=\"hL\" />\n+ <Atom charge=\"0.011041\" name=\"H7Y\" type=\"hL\" />\n+ <Atom charge=\"-0.015793\" name=\"C38\" type=\"cD\" />\n+ <Atom charge=\"0.009067\" name=\"H8X\" type=\"hL\" />\n+ <Atom charge=\"0.009067\" name=\"H8Y\" type=\"hL\" />\n+ <Atom charge=\"-0.030472\" name=\"C39\" type=\"cD\" />\n+ <Atom charge=\"0.013897\" name=\"H9X\" type=\"hL\" />\n+ <Atom charge=\"0.013897\" name=\"H9Y\" type=\"hL\" />\n+ <Atom charge=\"-0.028831\" name=\"C310\" type=\"cD\" />\n+ <Atom charge=\"0.014691\" name=\"H10X\" type=\"hL\" />\n+ <Atom charge=\"0.014691\" name=\"H10Y\" type=\"hL\" />\n+ <Atom charge=\"-0.025206\" name=\"C311\" type=\"cD\" />\n+ <Atom charge=\"0.014334\" name=\"H11X\" type=\"hL\" />\n+ <Atom charge=\"0.014334\" name=\"H11Y\" type=\"hL\" />\n+ <Atom charge=\"-0.027633\" name=\"C312\" type=\"cD\" />\n+ <Atom charge=\"0.011368\" name=\"H12X\" type=\"hL\" />\n+ <Atom charge=\"0.011368\" name=\"H12Y\" type=\"hL\" />\n+ <Atom charge=\"-0.033096\" name=\"C313\" type=\"cD\" />\n+ <Atom charge=\"0.014621\" name=\"H13X\" type=\"hL\" />\n+ <Atom charge=\"0.014621\" name=\"H13Y\" type=\"hL\" />\n+ <Atom charge=\"-0.020086\" name=\"C314\" type=\"cD\" />\n+ <Atom charge=\"0.015929\" name=\"H14X\" type=\"hL\" />\n+ <Atom charge=\"0.015929\" name=\"H14Y\" type=\"hL\" />\n+ <Atom charge=\"0.013975\" name=\"C315\" type=\"cD\" />\n+ <Atom charge=\"0.009292\" name=\"H15X\" type=\"hL\" />\n+ <Atom charge=\"0.009292\" name=\"H15Y\" type=\"hL\" />\n+ <Atom charge=\"-0.125447\" name=\"C316\" type=\"cD\" />\n+ <Atom charge=\"0.029047\" name=\"H16X\" type=\"hL\" />\n+ <Atom charge=\"0.029047\" name=\"H16Y\" type=\"hL\" />\n+ <Atom charge=\"0.029047\" name=\"H16Z\" type=\"hL\" />\n+ <Bond atomName1=\"HO3\" atomName2=\"OC3\" />\n+ <Bond atomName1=\"OC3\" atomName2=\"C13\" />\n+ <Bond atomName1=\"C13\" atomName2=\"H13A\" />\n+ <Bond atomName1=\"C13\" atomName2=\"H13B\" />\n+ <Bond atomName1=\"C13\" atomName2=\"C12\" />\n+ <Bond atomName1=\"HO2\" atomName2=\"OC2\" />\n+ <Bond atomName1=\"OC2\" atomName2=\"C12\" />\n+ <Bond atomName1=\"C12\" atomName2=\"H12A\" />\n+ <Bond atomName1=\"C12\" atomName2=\"C11\" />\n+ <Bond atomName1=\"C11\" atomName2=\"H11A\" />\n+ <Bond atomName1=\"C11\" atomName2=\"H11B\" />\n+ <Bond atomName1=\"C11\" atomName2=\"O12\" />\n+ <Bond atomName1=\"O11\" atomName2=\"C1\" />\n+ <Bond atomName1=\"O12\" atomName2=\"P\" />\n+ <Bond atomName1=\"P\" atomName2=\"O11\" />\n+ <Bond atomName1=\"P\" atomName2=\"O13\" />\n+ <Bond atomName1=\"P\" atomName2=\"O14\" />\n+ <Bond atomName1=\"C1\" atomName2=\"HA\" />\n+ <Bond atomName1=\"C1\" atomName2=\"HB\" />\n+ <Bond atomName1=\"C1\" atomName2=\"C2\" />\n+ <Bond atomName1=\"C2\" atomName2=\"HS\" />\n+ <Bond atomName1=\"C2\" atomName2=\"C3\" />\n+ <Bond atomName1=\"C2\" atomName2=\"O21\" />\n+ <Bond atomName1=\"C3\" atomName2=\"HX\" />\n+ <Bond atomName1=\"C3\" atomName2=\"HY\" />\n+ <Bond atomName1=\"C3\" atomName2=\"O31\" />\n+ <Bond atomName1=\"O21\" atomName2=\"C21\" />\n+ <Bond atomName1=\"C21\" atomName2=\"C22\" />\n+ <Bond atomName1=\"C21\" atomName2=\"O22\" />\n+ <Bond atomName1=\"C22\" atomName2=\"H2R\" />\n+ <Bond atomName1=\"C22\" atomName2=\"H2S\" />\n+ <Bond atomName1=\"C22\" atomName2=\"C23\" />\n+ <Bond atomName1=\"C23\" atomName2=\"H3R\" />\n+ <Bond atomName1=\"C23\" atomName2=\"H3S\" />\n+ <Bond atomName1=\"C23\" atomName2=\"C24\" />\n+ <Bond atomName1=\"C24\" atomName2=\"H4R\" />\n+ <Bond atomName1=\"C24\" atomName2=\"H4S\" />\n+ <Bond atomName1=\"C24\" atomName2=\"C25\" />\n+ <Bond atomName1=\"C25\" atomName2=\"H5R\" />\n+ <Bond atomName1=\"C25\" atomName2=\"H5S\" />\n+ <Bond atomName1=\"C25\" atomName2=\"C26\" />\n+ <Bond atomName1=\"C26\" atomName2=\"H6R\" />\n+ <Bond atomName1=\"C26\" atomName2=\"H6S\" />\n+ <Bond atomName1=\"C26\" atomName2=\"C27\" />\n+ <Bond atomName1=\"C27\" atomName2=\"H7R\" />\n+ <Bond atomName1=\"C27\" atomName2=\"H7S\" />\n+ <Bond atomName1=\"C27\" atomName2=\"C28\" />\n+ <Bond atomName1=\"C28\" atomName2=\"H8R\" />\n+ <Bond atomName1=\"C28\" atomName2=\"H8S\" />\n+ <Bond atomName1=\"C28\" atomName2=\"C29\" />\n+ <Bond atomName1=\"C29\" atomName2=\"H91\" />\n+ <Bond atomName1=\"C29\" atomName2=\"C210\" />\n+ <Bond atomName1=\"C210\" atomName2=\"H101\" />\n+ <Bond atomName1=\"C210\" atomName2=\"C211\" />\n+ <Bond atomName1=\"C211\" atomName2=\"H11R\" />\n+ <Bond atomName1=\"C211\" atomName2=\"H11S\" />\n+ <Bond atomName1=\"C211\" atomName2=\"C212\" />\n+ <Bond atomName1=\"C212\" atomName2=\"H12R\" />\n+ <Bond atomName1=\"C212\" atomName2=\"H12S\" />\n+ <Bond atomName1=\"C212\" atomName2=\"C213\" />\n+ <Bond atomName1=\"C213\" atomName2=\"H13R\" />\n+ <Bond atomName1=\"C213\" atomName2=\"H13S\" />\n+ <Bond atomName1=\"C213\" atomName2=\"C214\" />\n+ <Bond atomName1=\"C214\" atomName2=\"H14R\" />\n+ <Bond atomName1=\"C214\" atomName2=\"H14S\" />\n+ <Bond atomName1=\"C214\" atomName2=\"C215\" />\n+ <Bond atomName1=\"C215\" atomName2=\"H15R\" />\n+ <Bond atomName1=\"C215\" atomName2=\"H15S\" />\n+ <Bond atomName1=\"C215\" atomName2=\"C216\" />\n+ <Bond atomName1=\"C216\" atomName2=\"H16R\" />\n+ <Bond atomName1=\"C216\" atomName2=\"H16S\" />\n+ <Bond atomName1=\"C216\" atomName2=\"C217\" />\n+ <Bond atomName1=\"C217\" atomName2=\"H17R\" />\n+ <Bond atomName1=\"C217\" atomName2=\"H17S\" />\n+ <Bond atomName1=\"C217\" atomName2=\"C218\" />\n+ <Bond atomName1=\"C218\" atomName2=\"H18R\" />\n+ <Bond atomName1=\"C218\" atomName2=\"H18S\" />\n+ <Bond atomName1=\"C218\" atomName2=\"H18T\" />\n+ <Bond atomName1=\"O31\" atomName2=\"C31\" />\n+ <Bond atomName1=\"C31\" atomName2=\"C32\" />\n+ <Bond atomName1=\"C31\" atomName2=\"O32\" />\n+ <Bond atomName1=\"C32\" atomName2=\"H2X\" />\n+ <Bond atomName1=\"C32\" atomName2=\"H2Y\" />\n+ <Bond atomName1=\"C32\" atomName2=\"C33\" />\n+ <Bond atomName1=\"C33\" atomName2=\"H3X\" />\n+ <Bond atomName1=\"C33\" atomName2=\"H3Y\" />\n+ <Bond atomName1=\"C33\" atomName2=\"C34\" />\n+ <Bond atomName1=\"C34\" atomName2=\"H4X\" />\n+ <Bond atomName1=\"C34\" atomName2=\"H4Y\" />\n+ <Bond atomName1=\"C34\" atomName2=\"C35\" />\n+ <Bond atomName1=\"C35\" atomName2=\"H5X\" />\n+ <Bond atomName1=\"C35\" atomName2=\"H5Y\" />\n+ <Bond atomName1=\"C35\" atomName2=\"C36\" />\n+ <Bond atomName1=\"C36\" atomName2=\"H6X\" />\n+ <Bond atomName1=\"C36\" atomName2=\"H6Y\" />\n+ <Bond atomName1=\"C36\" atomName2=\"C37\" />\n+ <Bond atomName1=\"C37\" atomName2=\"H7X\" />\n+ <Bond atomName1=\"C37\" atomName2=\"H7Y\" />\n+ <Bond atomName1=\"C37\" atomName2=\"C38\" />\n+ <Bond atomName1=\"C38\" atomName2=\"H8X\" />\n+ <Bond atomName1=\"C38\" atomName2=\"H8Y\" />\n+ <Bond atomName1=\"C38\" atomName2=\"C39\" />\n+ <Bond atomName1=\"C39\" atomName2=\"H9X\" />\n+ <Bond atomName1=\"C39\" atomName2=\"H9Y\" />\n+ <Bond atomName1=\"C39\" atomName2=\"C310\" />\n+ <Bond atomName1=\"C310\" atomName2=\"H10X\" />\n+ <Bond atomName1=\"C310\" atomName2=\"H10Y\" />\n+ <Bond atomName1=\"C310\" atomName2=\"C311\" />\n+ <Bond atomName1=\"C311\" atomName2=\"H11X\" />\n+ <Bond atomName1=\"C311\" atomName2=\"H11Y\" />\n+ <Bond atomName1=\"C311\" atomName2=\"C312\" />\n+ <Bond atomName1=\"C312\" atomName2=\"H12X\" />\n+ <Bond atomName1=\"C312\" atomName2=\"H12Y\" />\n+ <Bond atomName1=\"C312\" atomName2=\"C313\" />\n+ <Bond atomName1=\"C313\" atomName2=\"H13X\" />\n+ <Bond atomName1=\"C313\" atomName2=\"H13Y\" />\n+ <Bond atomName1=\"C313\" atomName2=\"C314\" />\n+ <Bond atomName1=\"C314\" atomName2=\"H14X\" />\n+ <Bond atomName1=\"C314\" atomName2=\"H14Y\" />\n+ <Bond atomName1=\"C314\" atomName2=\"C315\" />\n+ <Bond atomName1=\"C315\" atomName2=\"H15X\" />\n+ <Bond atomName1=\"C315\" atomName2=\"H15Y\" />\n+ <Bond atomName1=\"C315\" atomName2=\"C316\" />\n+ <Bond atomName1=\"C316\" atomName2=\"H16X\" />\n+ <Bond atomName1=\"C316\" atomName2=\"H16Y\" />\n+ <Bond atomName1=\"C316\" atomName2=\"H16Z\" />\n+ </Residue>\n+ <Residue name=\"SDPC\">\n+ <Atom charge=\"0.245262\" name=\"N\" type=\"nA\" />\n+ <Atom charge=\"-0.170824\" name=\"C12\" type=\"cA\" />\n+ <Atom charge=\"0.136415\" name=\"H12A\" type=\"hX\" />\n+ <Atom charge=\"0.136415\" name=\"H12B\" type=\"hX\" />\n+ <Atom charge=\"-0.338973\" name=\"C13\" type=\"cA\" />\n+ <Atom charge=\"0.17223\" name=\"H13A\" type=\"hX\" />\n+ <Atom charge=\"0.17223\" name=\"H13B\" type=\"hX\" />\n+ <Atom charge=\"0.17223\" name=\"H13C\" type=\"hX\" />\n+ <Atom charge=\"-0.338973\" name=\"C14\" type=\"cA\" />\n+ <Atom charge=\"0.17223\" name=\"H14A\" type=\"hX\" />\n+ <Atom charge=\"0.17223\" name=\"H14B\" type=\"hX\" />\n+ <Atom charge=\"0.17223\" name=\"H14C\" type=\"hX\" />\n+ <Atom charge=\"-0.338973\" name=\"C15\" type=\"cA\" />\n+ <Atom charge=\"0.17223\" name=\"H15A\" type=\"hX\" />\n+ <Atom charge=\"0.17223\" name=\"H15B\" type=\"hX\" />\n+ <Atom charge=\"0.17223\" name=\"H15C\" type=\"hX\" />\n+ <Atom charge=\"0.166801\" name=\"C11\" type=\"cA\" />\n+ <Atom charge=\"0.078534\" name=\"H11A\" type=\"hE\" />\n+ <Atom charge=\"0.078534\" name=\"H11B\" type=\"hE\" />\n+ <Atom charge=\"1.339721\" name=\"P\" type=\"pA\" />\n+ <Atom charge=\"-0.875812\" name=\"O13\" type=\"oP\" />\n+ <Atom charge=\"-0.875812\" name=\"O14\" type=\"oP\" />\n+ <Atom charge=\"-0.508176\" name=\"O12\" type=\"oT\" />\n+ <Atom charge=\"-0.50948\" name=\"O11\" type=\"oT\" />\n+ <Atom charge=\"0.017459\" name=\"C1\" type=\"cA\" />\n+ <Atom charge=\"0.095591\" name=\"HA\" type=\"hE\" />\n+ <Atom charge=\"0.095591\" name=\"HB\" type=\"hE\" />\n+ <Atom charge=\"0.281242\" name=\"C2\" type=\"cA\" />\n+ <Atom charge=\"0.063253\" name=\"HS\" type=\"hE\" />\n+ <Atom charge=\"-0.552948\" name=\"O21\" type=\"oS\" />\n+ <Atom charge=\"0.897613\" name=\"C21\" type=\"cC\" />\n+ <Atom charge=\"-0.673755\" name=\"O22\" type=\"oC\" />\n+ <Atom charge=\"-0.142937\" name=\"C22\" type=\"cD\" />\n+ <Atom charge=\"0.037544\" name=\"H2R\" type=\"hL\" />\n+ <Atom charge=\"0.037544\" name=\"H2S\" type=\"hL\" />\n+ <Atom charge=\"0.196939\" name=\"C3\" type=\"cA\" />\n+ <Atom charge=\"0.070469\" name=\"HX\" type=\"hE\" />\n+ <Atom charge=\"0.070469\" name=\"HY\" type=\"hE\" />\n+ <Atom charge=\"-0.575489\" name=\"O31\" type=\"oS\" />\n+ <Atom charge=\"0.910403\" name=\"C31\" type=\"cC\" />\n+ <Atom charge=\"-0.671566\" name=\"O32\" type=\"oC\" />\n+ <Atom charge=\"-0.11702\" name=\"C32\" type=\"cD\" />\n+ <Atom charge=\"0.051807\" name=\"H2X\" type=\"hL\" />\n+ <Atom charge=\"0.051807\" name=\"H2Y\" type=\"hL\" />\n+ <Atom charge=\"0.120999\" name=\"C23\" type=\"cD\" />\n+ <Atom charge=\"0.026097\" name=\"H3R\" type=\"hL\" />\n+ <Atom charge=\"0.026097\" name=\"H3S\" type=\"hL\" />\n+ <Atom charge=\"-0.287059\" name=\"C24\" type=\"cB\" />\n+ <Atom charge=\"0.154038\" name=\"H4R\" type=\"hB\" />\n+ <Atom charge=\"-0.214845\" name=\"C25\" type=\"cB\" />\n+ <Atom charge=\"0.132504\" name=\"H5R\" type=\"hB\" />\n+ <Atom charge=\"0.060337\" name=\"C26\" type=\"cD\" />\n+ <Atom charge=\"0.063515\" name=\"H6R\" type=\"hL\" />\n+ <Atom charge=\"0.063515\" name=\"H6S\" type=\"hL\" />\n+ <Atom charge=\"-0.220895\" name=\"C27\" type=\"cB\" />\n+ <Atom charge=\"0.139863\" name=\"H7R\" type=\"hB\" />\n+ <Atom charge=\"-0.226254\" name=\"C28\" type=\"cB\" />\n+ <Atom charge=\"0.128147\" name=\"H8R\" type=\"hB\" />\n+ <Atom charge=\"0.089043\" name=\"C29\" type=\"cD\" />\n+ <Atom charge=\"0.054255\" name=\"H9R\" type=\"hL\" />\n+ <Atom charge=\"0.054255\" name=\"H9S\" type=\"hL\" />\n+ <Atom charge=\"-0.221433\" name=\"C210\" type=\"cB\" />\n+ <Atom charge=\"0.133628\" name=\"H10R\" type=\"hB\" />\n+ <Atom charge=\"-0.241205\" name=\"C211\" type=\"cB\" />\n+ <Atom charge=\"0.136308\" name=\"H11R\" type=\"hB\" />\n+ <Atom charge=\"0.085245\" name=\"C212\" type=\"cD\" />\n+ <Atom charge=\"0.053422\" name=\"H12R\" type=\"hL\" />\n+ <Atom charge=\"0.053422\" name=\"H12S\" type=\"hL\" />\n+ <Atom charge=\"-0.218668\" name=\"C213\" type=\"cB\" />\n+ <Atom charge=\"0.131575\" name=\"H13R\" type=\"hB\" />\n+ <Atom charge=\"-0.240419\" name=\"C214\" type=\"cB\" />\n+ <Atom charge=\"0.138337\" name=\"H14R\" type=\"hB\" />\n+ <Atom charge=\"0.069215\" name=\"C215\" type=\"cD\" />\n+ <Atom charge=\"0.058341\" name=\"H15R\" type=\"hL\" />\n+ <Atom charge=\"0.058341\" name=\"H15S\" type=\"hL\" />\n+ <Atom charge=\"-0.233897\" name=\"C216\" type=\"cB\" />\n+ <Atom charge=\"0.133812\" name=\"H16R\" type=\"hB\" />\n+ <Atom charge=\"-0.216499\" name=\"C217\" type=\"cB\" />\n+ <Atom charge=\"0.132121\" name=\"H17R\" type=\"hB\" />\n+ <Atom charge=\"0.092718\" name=\"C218\" type=\"cD\" />\n+ <Atom charge=\"0.053227\" name=\"H18R\" type=\"hL\" />\n+ <Atom charge=\"0.053227\" name=\"H18S\" type=\"hL\" />\n+ <Atom charge=\"-0.246833\" name=\"C219\" type=\"cB\" />\n+ <Atom charge=\"0.136323\" name=\"H19R\" type=\"hB\" />\n+ <Atom charge=\"-0.240216\" name=\"C220\" type=\"cB\" />\n+ <Atom charge=\"0.133048\" name=\"H20R\" type=\"hB\" />\n+ <Atom charge=\"0.122022\" name=\"C221\" type=\"cD\" />\n+ <Atom charge=\"0.010042\" name=\"H21R\" type=\"hL\" />\n+ <Atom charge=\"0.010042\" name=\"H21S\" type=\"hL\" />\n+ <Atom charge=\"-0.108913\" name=\"C222\" type=\"cD\" />\n+ <Atom charge=\"0.025968\" name=\"H22R\" type=\"hL\" />\n+ <Atom charge=\"0.025968\" name=\"H22S\" type=\"hL\" />\n+ <Atom charge=\"0.025968\" name=\"H22T\" type=\"hL\" />\n+ <Atom charge=\"-0.000128\" name=\"C33\" type=\"cD\" />\n+ <Atom charge=\"0.013886\" name=\"H3X\" type=\"hL\" />\n+ <Atom charge=\"0.013886\" name=\"H3Y\" type=\"hL\" />\n+ <Atom charge=\"-0.059792\" name=\"C34\" type=\"cD\" />\n+ <Atom charge=\"0.024241\" name=\"H4X\" type=\"hL\" />\n+ <Atom charge=\"0.024241\" name=\"H4Y\" type=\"hL\" />\n+ <Atom charge=\"-0.013443\" name=\"C35\" type=\"cD\" />\n+ <Atom charge=\"0.008191\" name=\"H5X\" type=\"hL\" />\n+ <Atom charge=\"0.008191\" name=\"H5Y\" type=\"hL\" />\n+ <Atom charge=\"-0.037627\" name=\"C36\" type=\"cD\" />\n+ <Atom charge=\"0.01774\" name=\"H6X\" type=\"hL\" />\n+ <Atom charge=\"0.01774\" name=\"H6Y\" type=\"hL\" />\n+ <Atom charge=\"-0.019469\" name=\"C37\" type=\"cD\" />\n+ <Atom charge=\"0.009292\" name=\"H7X\" type=\"hL\" />\n+ <Atom charge=\"0.009292\" name=\"H7Y\" type=\"hL\" />\n+ <Atom charge=\"-0.014623\" name=\"C38\" type=\"cD\" />\n+ <Atom charge=\"0.007326\" name=\"H8X\" type=\"hL\" />\n+ <Atom charge=\"0.007326\" name=\"H8Y\" type=\"hL\" />\n+ <Atom charge=\"-0.017997\" name=\"C39\" type=\"cD\" />\n+ <Atom charge=\"0.009595\" name=\"H9X\" type=\"hL\" />\n+ <Atom charge=\"0.009595\" name=\"H9Y\" type=\"hL\" />\n+ <Atom charge=\"-0.026418\" name=\"C310\" type=\"cD\" />\n+ <Atom charge=\"0.010825\" name=\"H10X\" type=\"hL\" />\n+ <Atom charge=\"0.010825\" name=\"H10Y\" type=\"hL\" />\n+ <Atom charge=\"-0.017093\" name=\"C311\" type=\"cD\" />\n+ <Atom charge=\"0.010206\" name=\"H11X\" type=\"hL\" />\n+ <Atom charge=\"0.010206\" name=\"H11Y\" type=\"hL\" />\n+ <Atom charge=\"-0.019153\" name=\"C312\" type=\"cD\" />\n+ <Atom charge=\"0.008198\" name=\"H12X\" type=\"hL\" />\n+ <Atom charge=\"0.008198\" name=\"H12Y\" type=\"hL\" />\n+ <Atom charge=\"-0.01159\" name=\"C313\" type=\"cD\" />\n+ <Atom charge=\"0.006022\" name=\"H13X\" type=\"hL\" />\n+ <Atom charge=\"0.006022\" name=\"H13Y\" type=\"hL\" />\n+ <Atom charge=\"-0.013489\" name=\"C314\" type=\"cD\" />\n+ <Atom charge=\"0.010073\" name=\"H14X\" type=\"hL\" />\n+ <Atom charge=\"0.010073\" name=\"H14Y\" type=\"hL\" />\n+ <Atom charge=\"-0.032444\" name=\"C315\" type=\"cD\" />\n+ <Atom charge=\"0.010253\" name=\"H15X\" type=\"hL\" />\n+ <Atom charge=\"0.010253\" name=\"H15Y\" type=\"hL\" />\n+ <Atom charge=\"-0.027654\" name=\"C316\" type=\"cD\" />\n+ <Atom charge=\"0.015627\" name=\"H16X\" type=\"hL\" />\n+ <Atom charge=\"0.015627\" name=\"H16Y\" type=\"hL\" />\n+ <Atom charge=\"0.020665\" name=\"C317\" type=\"cD\" />\n+ <Atom charge=\"0.008483\" name=\"H17X\" type=\"hL\" />\n+ <Atom charge=\"0.008483\" name=\"H17Y\" type=\"hL\" />\n+ <Atom charge=\"-0.120069\" name=\"C318\" type=\"cD\" />\n+ <Atom charge=\"0.027938\" name=\"H18X\" type=\"hL\" />\n+ <Atom charge=\"0.027938\" name=\"H18Y\" type=\"hL\" />\n+ <Atom charge=\"0.027938\" name=\"H18Z\" type=\"hL\" />\n+ <Bond atomName1=\"N\" atomName2=\"C13\" />\n+ <Bond atomName1=\"N\" atomName2=\"C14\" />\n+ <Bond atomName1=\"N\" atomName2=\"C15\" />\n+ <Bond atomName1=\"C13\" atomName2=\"H13A\" />\n+ <Bond atomName1=\"C13\" atomName2=\"H13B\" />\n+ <Bond atomName1=\"C13\" atomName2=\"H13C\" />\n+ <Bond atomName1=\"C14\" atomName2=\"H14A\" />\n+ <Bond atomName1=\"C14\" atomName2=\"H14B\" />\n+ <Bond atomName1=\"C14\" atomName2=\"H14C\" />\n+ <Bond atomName1=\"C15\" atomName2=\"H15A\" />\n+ <Bond atomName1=\"C15\" atomName2=\"H15B\" />\n+ <Bond atomName1=\"C15\" atomName2=\"H15C\" />\n+ <Bond atomName1=\"N\" atomName2=\"C12\" />\n+ <Bond atomName1=\"C12\" atomName2=\"H12A\" />\n+ <Bond atomName1=\"C12\" atomName2=\"H12B\" />\n+ <Bond atomName1=\"C12\" atomName2=\"C11\" />\n+ <Bond atomName1=\"C11\" atomName2=\"H11A\" />\n+ <Bond atomName1=\"C11\" atomName2=\"H11B\" />\n+ <Bond atomName1=\"C11\" atomName2=\"O12\" />\n+ <Bond atomName1=\"O11\" atomName2=\"C1\" />\n+ <Bond atomName1=\"O12\" atomName2=\"P\" />\n+ <Bond atomName1=\"P\" atomName2=\"O11\" />\n+ <Bond atomName1=\"P\" atomName2=\"O13\" />\n+ <Bond atomName1=\"P\" atomName2=\"O14\" />\n+ <Bond atomName1=\"C1\" atomName2=\"HA\" />\n+ <Bond atomName1=\"C1\" atomName2=\"HB\" />\n+ <Bond atomName1=\"C1\" atomName2=\"C2\" />\n+ <Bond atomName1=\"C2\" atomName2=\"HS\" />\n+ <Bond atomName1=\"C2\" atomName2=\"C3\" />\n+ <Bond atomName1=\"C2\" atomName2=\"O21\" />\n+ <Bond atomName1=\"C3\" atomName2=\"HX\" />\n+ <Bond atomName1=\"C3\" atomName2=\"HY\" />\n+ <Bond atomName1=\"C3\" atomName2=\"O31\" />\n+ <Bond atomName1=\"O21\" atomName2=\"C21\" />\n+ <Bond atomName1=\"C21\" atomName2=\"C22\" />\n+ <Bond atomName1=\"C21\" atomName2=\"O22\" />\n+ <Bond atomName1=\"C22\" atomName2=\"H2R\" />\n+ <Bond atomName1=\"C22\" atomName2=\"H2S\" />\n+ <Bond atomName1=\"C22\" atomName2=\"C23\" />\n+ <Bond atomName1=\"C23\" atomName2=\"H3R\" />\n+ <Bond atomName1=\"C23\" atomName2=\"H3S\" />\n+ <Bond atomName1=\"C23\" atomName2=\"C24\" />\n+ <Bond atomName1=\"C24\" atomName2=\"H4R\" />\n+ <Bond atomName1=\"C24\" atomName2=\"C25\" />\n+ <Bond atomName1=\"C25\" atomName2=\"H5R\" />\n+ <Bond atomName1=\"C25\" atomName2=\"C26\" />\n+ <Bond atomName1=\"C26\" atomName2=\"H6R\" />\n+ <Bond atomName1=\"C26\" atomName2=\"H6S\" />\n+ <Bond atomName1=\"C26\" atomName2=\"C27\" />\n+ <Bond atomName1=\"C27\" atomName2=\"H7R\" />\n+ <Bond atomName1=\"C27\" atomName2=\"C28\" />\n+ <Bond atomName1=\"C28\" atomName2=\"H8R\" />\n+ <Bond atomName1=\"C28\" atomName2=\"C29\" />\n+ <Bond atomName1=\"C29\" atomName2=\"H9R\" />\n+ <Bond atomName1=\"C29\" atomName2=\"H9S\" />\n+ <Bond atomName1=\"C29\" atomName2=\"C210\" />\n+ <Bond atomName1=\"C210\" atomName2=\"H10R\" />\n+ <Bond atomName1=\"C210\" atomName2=\"C211\" />\n+ <Bond atomName1=\"C211\" atomName2=\"H11R\" />\n+ <Bond atomName1=\"C211\" atomName2=\"C212\" />\n+ <Bond atomName1=\"C212\" atomName2=\"H12R\" />\n+ <Bond atomName1=\"C212\" atomName2=\"H12S\" />\n+ <Bond atomName1=\"C212\" atomName2=\"C213\" />\n+ <Bond atomName1=\"C213\" atomName2=\"H13R\" />\n+ <Bond atomName1=\"C213\" atomName2=\"C214\" />\n+ <Bond atomName1=\"C214\" atomName2=\"H14R\" />\n+ <Bond atomName1=\"C214\" atomName2=\"C215\" />\n+ <Bond atomName1=\"C215\" atomName2=\"H15R\" />\n+ <Bond atomName1=\"C215\" atomName2=\"H15S\" />\n+ <Bond atomName1=\"C215\" atomName2=\"C216\" />\n+ <Bond atomName1=\"C216\" atomName2=\"H16R\" />\n+ <Bond atomName1=\"C216\" atomName2=\"C217\" />\n+ <Bond atomName1=\"C217\" atomName2=\"H17R\" />\n+ <Bond atomName1=\"C217\" atomName2=\"C218\" />\n+ <Bond atomName1=\"C218\" atomName2=\"H18R\" />\n+ <Bond atomName1=\"C218\" atomName2=\"H18S\" />\n+ <Bond atomName1=\"C218\" atomName2=\"C219\" />\n+ <Bond atomName1=\"C219\" atomName2=\"H19R\" />\n+ <Bond atomName1=\"C219\" atomName2=\"C220\" />\n+ <Bond atomName1=\"C220\" atomName2=\"H20R\" />\n+ <Bond atomName1=\"C220\" atomName2=\"C221\" />\n+ <Bond atomName1=\"C221\" atomName2=\"H21R\" />\n+ <Bond atomName1=\"C221\" atomName2=\"H21S\" />\n+ <Bond atomName1=\"C221\" atomName2=\"C222\" />\n+ <Bond atomName1=\"C222\" atomName2=\"H22R\" />\n+ <Bond atomName1=\"C222\" atomName2=\"H22S\" />\n+ <Bond atomName1=\"C222\" atomName2=\"H22T\" />\n+ <Bond atomName1=\"O31\" atomName2=\"C31\" />\n+ <Bond atomName1=\"C31\" atomName2=\"C32\" />\n+ <Bond atomName1=\"C31\" atomName2=\"O32\" />\n+ <Bond atomName1=\"C32\" atomName2=\"H2X\" />\n+ <Bond atomName1=\"C32\" atomName2=\"H2Y\" />\n+ <Bond atomName1=\"C32\" atomName2=\"C33\" />\n+ <Bond atomName1=\"C33\" atomName2=\"H3X\" />\n+ <Bond atomName1=\"C33\" atomName2=\"H3Y\" />\n+ <Bond atomName1=\"C33\" atomName2=\"C34\" />\n+ <Bond atomName1=\"C34\" atomName2=\"H4X\" />\n+ <Bond atomName1=\"C34\" atomName2=\"H4Y\" />\n+ <Bond atomName1=\"C34\" atomName2=\"C35\" />\n+ <Bond atomName1=\"C35\" atomName2=\"H5X\" />\n+ <Bond atomName1=\"C35\" atomName2=\"H5Y\" />\n+ <Bond atomName1=\"C35\" atomName2=\"C36\" />\n+ <Bond atomName1=\"C36\" atomName2=\"H6X\" />\n+ <Bond atomName1=\"C36\" atomName2=\"H6Y\" />\n+ <Bond atomName1=\"C36\" atomName2=\"C37\" />\n+ <Bond atomName1=\"C37\" atomName2=\"H7X\" />\n+ <Bond atomName1=\"C37\" atomName2=\"H7Y\" />\n+ <Bond atomName1=\"C37\" atomName2=\"C38\" />\n+ <Bond atomName1=\"C38\" atomName2=\"H8X\" />\n+ <Bond atomName1=\"C38\" atomName2=\"H8Y\" />\n+ <Bond atomName1=\"C38\" atomName2=\"C39\" />\n+ <Bond atomName1=\"C39\" atomName2=\"H9X\" />\n+ <Bond atomName1=\"C39\" atomName2=\"H9Y\" />\n+ <Bond atomName1=\"C39\" atomName2=\"C310\" />\n+ <Bond atomName1=\"C310\" atomName2=\"H10X\" />\n+ <Bond atomName1=\"C310\" atomName2=\"H10Y\" />\n+ <Bond atomName1=\"C310\" atomName2=\"C311\" />\n+ <Bond atomName1=\"C311\" atomName2=\"H11X\" />\n+ <Bond atomName1=\"C311\" atomName2=\"H11Y\" />\n+ <Bond atomName1=\"C311\" atomName2=\"C312\" />\n+ <Bond atomName1=\"C312\" atomName2=\"H12X\" />\n+ <Bond atomName1=\"C312\" atomName2=\"H12Y\" />\n+ <Bond atomName1=\"C312\" atomName2=\"C313\" />\n+ <Bond atomName1=\"C313\" atomName2=\"H13X\" />\n+ <Bond atomName1=\"C313\" atomName2=\"H13Y\" />\n+ <Bond atomName1=\"C313\" atomName2=\"C314\" />\n+ <Bond atomName1=\"C314\" atomName2=\"H14X\" />\n+ <Bond atomName1=\"C314\" atomName2=\"H14Y\" />\n+ <Bond atomName1=\"C314\" atomName2=\"C315\" />\n+ <Bond atomName1=\"C315\" atomName2=\"H15X\" />\n+ <Bond atomName1=\"C315\" atomName2=\"H15Y\" />\n+ <Bond atomName1=\"C315\" atomName2=\"C316\" />\n+ <Bond atomName1=\"C316\" atomName2=\"H16X\" />\n+ <Bond atomName1=\"C316\" atomName2=\"H16Y\" />\n+ <Bond atomName1=\"C316\" atomName2=\"C317\" />\n+ <Bond atomName1=\"C317\" atomName2=\"H17X\" />\n+ <Bond atomName1=\"C317\" atomName2=\"H17Y\" />\n+ <Bond atomName1=\"C317\" atomName2=\"C318\" />\n+ <Bond atomName1=\"C318\" atomName2=\"H18X\" />\n+ <Bond atomName1=\"C318\" atomName2=\"H18Y\" />\n+ <Bond atomName1=\"C318\" atomName2=\"H18Z\" />\n+ </Residue>\n+ <Residue name=\"DAPC\">\n+ <Atom charge=\"0.245262\" name=\"N\" type=\"nA\" />\n+ <Atom charge=\"-0.170824\" name=\"C12\" type=\"cA\" />\n+ <Atom charge=\"0.136415\" name=\"H12A\" type=\"hX\" />\n+ <Atom charge=\"0.136415\" name=\"H12B\" type=\"hX\" />\n+ <Atom charge=\"-0.338973\" name=\"C13\" type=\"cA\" />\n+ <Atom charge=\"0.17223\" name=\"H13A\" type=\"hX\" />\n+ <Atom charge=\"0.17223\" name=\"H13B\" type=\"hX\" />\n+ <Atom charge=\"0.17223\" name=\"H13C\" type=\"hX\" />\n+ <Atom charge=\"-0.338973\" name=\"C14\" type=\"cA\" />\n+ <Atom charge=\"0.17223\" name=\"H14A\" type=\"hX\" />\n+ <Atom charge=\"0.17223\" name=\"H14B\" type=\"hX\" />\n+ <Atom charge=\"0.17223\" name=\"H14C\" type=\"hX\" />\n+ <Atom charge=\"-0.338973\" name=\"C15\" type=\"cA\" />\n+ <Atom charge=\"0.17223\" name=\"H15A\" type=\"hX\" />\n+ <Atom charge=\"0.17223\" name=\"H15B\" type=\"hX\" />\n+ <Atom charge=\"0.17223\" name=\"H15C\" type=\"hX\" />\n+ <Atom charge=\"0.166801\" name=\"C11\" type=\"cA\" />\n+ <Atom charge=\"0.078534\" name=\"H11A\" type=\"hE\" />\n+ <Atom charge=\"0.078534\" name=\"H11B\" type=\"hE\" />\n+ <Atom charge=\"1.339721\" name=\"P\" type=\"pA\" />\n+ <Atom charge=\"-0.875812\" name=\"O13\" type=\"oP\" />\n+ <Atom charge=\"-0.875812\" name=\"O14\" type=\"oP\" />\n+ <Atom charge=\"-0.508176\" name=\"O12\" type=\"oT\" />\n+ <Atom charge=\"-0.50948\" name=\"O11\" type=\"oT\" />\n+ <Atom charge=\"0.017459\" name=\"C1\" type=\"cA\" />\n+ <Atom charge=\"0.095591\" name=\"HA\" type=\"hE\" />\n+ <Atom charge=\"0.095591\" name=\"HB\" type=\"hE\" />\n+ <Atom charge=\"0.281242\" name=\"C2\" type=\"cA\" />\n+ <Atom charge=\"0.063253\" name=\"HS\" type=\"hE\" />\n+ <Atom charge=\"-0.552948\" name=\"O21\" type=\"oS\" />\n+ <Atom charge=\"0.897613\" name=\"C21\" type=\"cC\" />\n+ <Atom charge=\"-0.673755\" name=\"O22\" type=\"oC\" />\n+ <Atom charge=\"-0.123935\" name=\"C22\" type=\"cD\" />\n+ <Atom charge=\"0.024535\" name=\"H2R\" type=\"hL\" />\n+ <Atom charge=\"0.024535\" name=\"H2S\" type=\"hL\" />\n+ <Atom charge=\"0.196939\" name=\"C3\" type=\"cA\" />\n+ <Atom charge=\"0.070469\" name=\"HX\" type=\"hE\" />\n+ <Atom charge=\"0.070469\" name=\"HY\" type=\"hE\" />\n+ <Atom charge=\"-0.575489\" name=\"O31\" type=\"oS\" />\n+ <Atom charge=\"0.910403\" name=\"C31\" type=\"cC\" />\n+ <Atom charge=\"-0.671566\" name=\"O32\" type=\"oC\" />\n+ <Atom charge=\"-0.123935\" name=\"C32\" type=\"cD\" />\n+ <Atom charge=\"0.024535\" name=\"H2X\" type=\"hL\" />\n+ <Atom charge=\"0.024535\" name=\"H2Y\" type=\"hL\" />\n+ <Atom charge=\"0.025626\" name=\"C23\" type=\"cD\" />\n+ <Atom charge=\"0.025117\" name=\"H3R\" type=\"hL\" />\n+ <Atom charge=\"0.025117\" name=\"H3S\" type=\"hL\" />\n+ <Atom charge=\"0.031382\" name=\"C24\" type=\"cD\" />\n+ <Atom charge=\"0.038708\" name=\"H4R\" type=\"hL\" />\n+ <Atom charge=\"0.038708\" name=\"H4S\" type=\"hL\" />\n+ <Atom charge=\"-0.26789\" name=\"C25\" type=\"cB\" />\n+ <Atom charge=\"0.143577\" name=\"H5R\" type=\"hB\" />\n+ <Atom charge=\"-0.206786\" name=\"C26\" type=\"cB\" />\n+ <Atom charge=\"0.129858\" name=\"H6R\" type=\"hB\" />\n+ <Atom charge=\"0.055784\" name=\"C27\" type=\"cD\" />\n+ <Atom charge=\"0.062775\" name=\"H7R\" type=\"hL\" />\n+ <Atom charge=\"0.062775\" name=\"H7S\" type=\"hL\" />\n+ <Atom charge=\"-0.228527\" name=\"C28\" type=\"cB\" />\n+ <Atom charge=\"0.134735\" name=\"H8R\" type=\"hB\" />\n+ <Atom charge=\"-0.228694\" name=\"C29\" type=\"cB\" />\n+ <Atom charge=\"0.132167\" name=\"H9R\" type=\"hB\" />\n+ <Atom charge=\"0.095406\" name=\"C210\" type=\"cD\" />\n+ <Atom charge=\"0.05114\" name=\"H10R\" type=\"hL\" />\n+ <Atom charge=\"0.05114\" name=\"H10S\" type=\"hL\" />\n+ <Atom charge=\"-0.228704\" name=\"C211\" type=\"cB\" />\n+ <Atom charge=\"0.131341\" name=\"H11R\" type=\"hB\" />\n+ <Atom charge=\"-0.220164\" name=\"C212\" type=\"cB\" />\n+ <Atom charge=\"0.131986\" name=\"H12R\" type=\"hB\" />\n+ <Atom charge=\"0.058197\" name=\"C213\" type=\"cD\" />\n+ <Atom charge=\"0.06135\" name=\"H13R\" type=\"hL\" />\n+ <Atom charge=\"0.06135\" name=\"H13S\" type=\"hL\" />\n+ <Atom charge=\"-0.224769\" name=\"C214\" type=\"cB\" />\n+ <Atom charge=\"0.129616\" name=\"H14R\" type=\"hB\" />\n+ <Atom charge=\"-0.244149\" name=\"C215\" type=\"cB\" />\n+ <Atom charge=\"0.132793\" name=\"H15R\" type=\"hB\" />\n+ <Atom charge=\"0.0391\" name=\"C216\" type=\"cD\" />\n+ <Atom charge=\"0.028848\" name=\"H16R\" type=\"hL\" />\n+ <Atom charge=\"0.028848\" name=\"H16S\" type=\"hL\" />\n+ <Atom charge=\"-0.028398\" name=\"C217\" type=\"cD\" />\n+ <Atom charge=\"0.019581\" name=\"H17R\" type=\"hL\" />\n+ <Atom charge=\"0.019581\" name=\"H17S\" type=\"hL\" />\n+ <Atom charge=\"-0.019772\" name=\"C218\" type=\"cD\" />\n+ <Atom charge=\"0.014218\" name=\"H18R\" type=\"hL\" />\n+ <Atom charge=\"0.014218\" name=\"H18S\" type=\"hL\" />\n+ <Atom charge=\"0.024957\" name=\"C219\" type=\"cD\" />\n+ <Atom charge=\"0.005426\" name=\"H19R\" type=\"hL\" />\n+ <Atom charge=\"0.005426\" name=\"H19S\" type=\"hL\" />\n+ <Atom charge=\"-0.109302\" name=\"C220\" type=\"cD\" />\n+ <Atom charge=\"0.023723\" name=\"H20R\" type=\"hL\" />\n+ <Atom charge=\"0.023723\" name=\"H20S\" type=\"hL\" />\n+ <Atom charge=\"0.023723\" name=\"H20T\" type=\"hL\" />\n+ <Atom charge=\"0.025626\" name=\"C33\" type=\"cD\" />\n+ <Atom charge=\"0.025117\" name=\"H3X\" type=\"hL\" />\n+ <Atom charge=\"0.025117\" name=\"H3Y\" type=\"hL\" />\n+ <Atom charge=\"0.031382\" name=\"C34\" type=\"cD\" />\n+ <Atom charge=\"0.038708\" name=\"H4X\" type=\"hL\" />\n+ <Atom charge=\"0.038708\" name=\"H4Y\" type=\"hL\" />\n+ <Atom charge=\"-0.26789\" name=\"C35\" type=\"cB\" />\n+ <Atom charge=\"0.143577\" name=\"H5X\" type=\"hB\" />\n+ <Atom charge=\"-0.206786\" name=\"C36\" type=\"cB\" />\n+ <Atom charge=\"0.129858\" name=\"H6X\" type=\"hB\" />\n+ <Atom charge=\"0.055784\" name=\"C37\" type=\"cD\" />\n+ <Atom charge=\"0.062775\" name=\"H7X\" type=\"hL\" />\n+ <Atom charge=\"0.062775\" name=\"H7Y\" type=\"hL\" />\n+ <Atom charge=\"-0.228527\" name=\"C38\" type=\"cB\" />\n+ <Atom charge=\"0.134735\" name=\"H8X\" type=\"hB\" />\n+ <Atom charge=\"-0.228694\" name=\"C39\" type=\"cB\" />\n+ <Atom charge=\"0.132167\" name=\"H9X\" type=\"hB\" />\n+ <Atom charge=\"0.095406\" name=\"C310\" type=\"cD\" />\n+ <Atom charge=\"0.05114\" name=\"H10X\" type=\"hL\" />\n+ <Atom charge=\"0.05114\" name=\"H10Y\" type=\"hL\" />\n+ <Atom charge=\"-0.228704\" name=\"C311\" type=\"cB\" />\n+ <Atom charge=\"0.131341\" name=\"H11X\" type=\"hB\" />\n+ <Atom charge=\"-0.220164\" name=\"C312\" type=\"cB\" />\n+ <Atom charge=\"0.131986\" name=\"H12X\" type=\"hB\" />\n+ <Atom charge=\"0.058197\" name=\"C313\" type=\"cD\" />\n+ <Atom charge=\"0.06135\" name=\"H13X\" type=\"hL\" />\n+ <Atom charge=\"0.06135\" name=\"H13Y\" type=\"hL\" />\n+ <Atom charge=\"-0.224769\" name=\"C314\" type=\"cB\" />\n+ <Atom charge=\"0.129616\" name=\"H14X\" type=\"hB\" />\n+ <Atom charge=\"-0.244149\" name=\"C315\" type=\"cB\" />\n+ <Atom charge=\"0.132793\" name=\"H15X\" type=\"hB\" />\n+ <Atom charge=\"0.0391\" name=\"C316\" type=\"cD\" />\n+ <Atom charge=\"0.028848\" name=\"H16X\" type=\"hL\" />\n+ <Atom charge=\"0.028848\" name=\"H16Y\" type=\"hL\" />\n+ <Atom charge=\"-0.028398\" name=\"C317\" type=\"cD\" />\n+ <Atom charge=\"0.019581\" name=\"H17X\" type=\"hL\" />\n+ <Atom charge=\"0.019581\" name=\"H17Y\" type=\"hL\" />\n+ <Atom charge=\"-0.019772\" name=\"C318\" type=\"cD\" />\n+ <Atom charge=\"0.014218\" name=\"H18X\" type=\"hL\" />\n+ <Atom charge=\"0.014218\" name=\"H18Y\" type=\"hL\" />\n+ <Atom charge=\"0.024957\" name=\"C319\" type=\"cD\" />\n+ <Atom charge=\"0.005426\" name=\"H19X\" type=\"hL\" />\n+ <Atom charge=\"0.005426\" name=\"H19Y\" type=\"hL\" />\n+ <Atom charge=\"-0.109302\" name=\"C320\" type=\"cD\" />\n+ <Atom charge=\"0.023723\" name=\"H20X\" type=\"hL\" />\n+ <Atom charge=\"0.023723\" name=\"H20Y\" type=\"hL\" />\n+ <Atom charge=\"0.023723\" name=\"H20Z\" type=\"hL\" />\n+ <Bond atomName1=\"N\" atomName2=\"C13\" />\n+ <Bond atomName1=\"N\" atomName2=\"C14\" />\n+ <Bond atomName1=\"N\" atomName2=\"C15\" />\n+ <Bond atomName1=\"C13\" atomName2=\"H13A\" />\n+ <Bond atomName1=\"C13\" atomName2=\"H13B\" />\n+ <Bond atomName1=\"C13\" atomName2=\"H13C\" />\n+ <Bond atomName1=\"C14\" atomName2=\"H14A\" />\n+ <Bond atomName1=\"C14\" atomName2=\"H14B\" />\n+ <Bond atomName1=\"C14\" atomName2=\"H14C\" />\n+ <Bond atomName1=\"C15\" atomName2=\"H15A\" />\n+ <Bond atomName1=\"C15\" atomName2=\"H15B\" />\n+ <Bond atomName1=\"C15\" atomName2=\"H15C\" />\n+ <Bond atomName1=\"N\" atomName2=\"C12\" />\n+ <Bond atomName1=\"C12\" atomName2=\"H12A\" />\n+ <Bond atomName1=\"C12\" atomName2=\"H12B\" />\n+ <Bond atomName1=\"C12\" atomName2=\"C11\" />\n+ <Bond atomName1=\"C11\" atomName2=\"H11A\" />\n+ <Bond atomName1=\"C11\" atomName2=\"H11B\" />\n+ <Bond atomName1=\"C11\" atomName2=\"O12\" />\n+ <Bond atomName1=\"O11\" atomName2=\"C1\" />\n+ <Bond atomName1=\"O12\" atomName2=\"P\" />\n+ <Bond atomName1=\"P\" atomName2=\"O11\" />\n+ <Bond atomName1=\"P\" atomName2=\"O13\" />\n+ <Bond atomName1=\"P\" atomName2=\"O14\" />\n+ <Bond atomName1=\"C1\" atomName2=\"HA\" />\n+ <Bond atomName1=\"C1\" atomName2=\"HB\" />\n+ <Bond atomName1=\"C1\" atomName2=\"C2\" />\n+ <Bond atomName1=\"C2\" atomName2=\"HS\" />\n+ <Bond atomName1=\"C2\" atomName2=\"C3\" />\n+ <Bond atomName1=\"C2\" atomName2=\"O21\" />\n+ <Bond atomName1=\"C3\" atomName2=\"HX\" />\n+ <Bond atomName1=\"C3\" atomName2=\"HY\" />\n+ <Bond atomName1=\"C3\" atomName2=\"O31\" />\n+ <Bond atomName1=\"C21\" atomName2=\"O21\" />\n+ <Bond atomName1=\"C21\" atomName2=\"C22\" />\n+ <Bond atomName1=\"C21\" atomName2=\"O22\" />\n+ <Bond atomName1=\"C22\" atomName2=\"C23\" />\n+ <Bond atomName1=\"C22\" atomName2=\"H2R\" />\n+ <Bond atomName1=\"C22\" atomName2=\"H2S\" />\n+ <Bond atomName1=\"C23\" atomName2=\"C24\" />\n+ <Bond atomName1=\"C23\" atomName2=\"H3R\" />\n+ <Bond atomName1=\"C23\" atomName2=\"H3S\" />\n+ <Bond atomName1=\"C24\" atomName2=\"C25\" />\n+ <Bond atomName1=\"C24\" atomName2=\"H4R\" />\n+ <Bond atomName1=\"C24\" atomName2=\"H4S\" />\n+ <Bond atomName1=\"C25\" atomName2=\"C26\" />\n+ <Bond atomName1=\"C25\" atomName2=\"H5R\" />\n+ <Bond atomName1=\"C26\" atomName2=\"C27\" />\n+ <Bond atomName1=\"C26\" atomName2=\"H6R\" />\n+ <Bond atomName1=\"C27\" atomName2=\"C28\" />\n+ <Bond atomName1=\"C27\" atomName2=\"H7R\" />\n+ <Bond atomName1=\"C27\" atomName2=\"H7S\" />\n+ <Bond atomName1=\"C28\" atomName2=\"C29\" />\n+ <Bond atomName1=\"C28\" atomName2=\"H8R\" />\n+ <Bond atomName1=\"C29\" atomName2=\"C210\" />\n+ <Bond atomName1=\"C29\" atomName2=\"H9R\" />\n+ <Bond atomName1=\"C210\" atomName2=\"C211\" />\n+ <Bond atomName1=\"C210\" atomName2=\"H10R\" />\n+ <Bond atomName1=\"C210\" atomName2=\"H10S\" />\n+ <Bond atomName1=\"C211\" atomName2=\"C212\" />\n+ <Bond atomName1=\"C211\" atomName2=\"H11R\" />\n+ <Bond atomName1=\"C212\" atomName2=\"C213\" />\n+ <Bond atomName1=\"C212\" atomName2=\"H12R\" />\n+ <Bond atomName1=\"C213\" atomName2=\"C214\" />\n+ <Bond atomName1=\"C213\" atomName2=\"H13R\" />\n+ <Bond atomName1=\"C213\" atomName2=\"H13S\" />\n+ <Bond atomName1=\"C214\" atomName2=\"C215\" />\n+ <Bond atomName1=\"C214\" atomName2=\"H14R\" />\n+ <Bond atomName1=\"C215\" atomName2=\"C216\" />\n+ <Bond atomName1=\"C215\" atomName2=\"H15R\" />\n+ <Bond atomName1=\"C216\" atomName2=\"C217\" />\n+ <Bond atomName1=\"C216\" atomName2=\"H16R\" />\n+ <Bond atomName1=\"C216\" atomName2=\"H16S\" />\n+ <Bond atomName1=\"C217\" atomName2=\"C218\" />\n+ <Bond atomName1=\"C217\" atomName2=\"H17R\" />\n+ <Bond atomName1=\"C217\" atomName2=\"H17S\" />\n+ <Bond atomName1=\"C218\" atomName2=\"C219\" />\n+ <Bond atomName1=\"C218\" atomName2=\"H18R\" />\n+ <Bond atomName1=\"C218\" atomName2=\"H18S\" />\n+ <Bond atomName1=\"C219\" atomName2=\"C220\" />\n+ <Bond atomName1=\"C219\" atomName2=\"H19R\" />\n+ <Bond atomName1=\"C219\" atomName2=\"H19S\" />\n+ <Bond atomName1=\"C220\" atomName2=\"H20T\" />\n+ <Bond atomName1=\"C220\" atomName2=\"H20R\" />\n+ <Bond atomName1=\"C220\" atomName2=\"H20S\" />\n+ <Bond atomName1=\"C31\" atomName2=\"O31\" />\n+ <Bond atomName1=\"C31\" atomName2=\"C32\" />\n+ <Bond atomName1=\"C31\" atomName2=\"O32\" />\n+ <Bond atomName1=\"C32\" atomName2=\"C33\" />\n+ <Bond atomName1=\"C32\" atomName2=\"H2X\" />\n+ <Bond atomName1=\"C32\" atomName2=\"H2Y\" />\n+ <Bond atomName1=\"C33\" atomName2=\"C34\" />\n+ <Bond atomName1=\"C33\" atomName2=\"H3X\" />\n+ <Bond atomName1=\"C33\" atomName2=\"H3Y\" />\n+ <Bond atomName1=\"C34\" atomName2=\"C35\" />\n+ <Bond atomName1=\"C34\" atomName2=\"H4X\" />\n+ <Bond atomName1=\"C34\" atomName2=\"H4Y\" />\n+ <Bond atomName1=\"C35\" atomName2=\"C36\" />\n+ <Bond atomName1=\"C35\" atomName2=\"H5X\" />\n+ <Bond atomName1=\"C36\" atomName2=\"C37\" />\n+ <Bond atomName1=\"C36\" atomName2=\"H6X\" />\n+ <Bond atomName1=\"C37\" atomName2=\"C38\" />\n+ <Bond atomName1=\"C37\" atomName2=\"H7X\" />\n+ <Bond atomName1=\"C37\" atomName2=\"H7Y\" />\n+ <Bond atomName1=\"C38\" atomName2=\"C39\" />\n+ <Bond atomName1=\"C38\" atomName2=\"H8X\" />\n+ <Bond atomName1=\"C39\" atomName2=\"C310\" />\n+ <Bond atomName1=\"C39\" atomName2=\"H9X\" />\n+ <Bond atomName1=\"C310\" atomName2=\"C311\" />\n+ <Bond atomName1=\"C310\" atomName2=\"H10X\" />\n+ <Bond atomName1=\"C310\" atomName2=\"H10Y\" />\n+ <Bond atomName1=\"C311\" atomName2=\"C312\" />\n+ <Bond atomName1=\"C311\" atomName2=\"H11X\" />\n+ <Bond atomName1=\"C312\" atomName2=\"C313\" />\n+ <Bond atomName1=\"C312\" atomName2=\"H12X\" />\n+ <Bond atomName1=\"C313\" atomName2=\"C314\" />\n+ <Bond atomName1=\"C313\" atomName2=\"H13X\" />\n+ <Bond atomName1=\"C313\" atomName2=\"H13Y\" />\n+ <Bond atomName1=\"C314\" atomName2=\"C315\" />\n+ <Bond atomName1=\"C314\" atomName2=\"H14X\" />\n+ <Bond atomName1=\"C315\" atomName2=\"C316\" />\n+ <Bond atomName1=\"C315\" atomName2=\"H15X\" />\n+ <Bond atomName1=\"C316\" atomName2=\"C317\" />\n+ <Bond atomName1=\"C316\" atomName2=\"H16X\" />\n+ <Bond atomName1=\"C316\" atomName2=\"H16Y\" />\n+ <Bond atomName1=\"C317\" atomName2=\"C318\" />\n+ <Bond atomName1=\"C317\" atomName2=\"H17X\" />\n+ <Bond atomName1=\"C317\" atomName2=\"H17Y\" />\n+ <Bond atomName1=\"C318\" atomName2=\"C319\" />\n+ <Bond atomName1=\"C318\" atomName2=\"H18X\" />\n+ <Bond atomName1=\"C318\" atomName2=\"H18Y\" />\n+ <Bond atomName1=\"C319\" atomName2=\"C320\" />\n+ <Bond atomName1=\"C319\" atomName2=\"H19X\" />\n+ <Bond atomName1=\"C319\" atomName2=\"H19Y\" />\n+ <Bond atomName1=\"C320\" atomName2=\"H20Z\" />\n+ <Bond atomName1=\"C320\" atomName2=\"H20X\" />\n+ <Bond atomName1=\"C320\" atomName2=\"H20Y\" />\n+ </Residue>\n+ <Residue name=\"CHL1\">\n+ <Atom charge=\"0.400362\" name=\"C3\" type=\"cA\" />\n+ <Atom charge=\"-0.00851\" name=\"H3\" type=\"hE\" />\n+ <Atom charge=\"-0.766581\" name=\"O3\" type=\"oH\" />\n+ <Atom charge=\"0.44297\" name=\"H3'\" type=\"hO\" />\n+ <Atom charge=\"-0.237134\" name=\"C4\" type=\"cA\" />\n+ <Atom charge=\"0.100619\" name=\"H4A\" type=\"hA\" />\n+ <Atom charge=\"0.100619\" name=\"H4B\" type=\"hA\" />\n+ <Atom charge=\"-0.257515\" name=\"C5\" type=\"cB\" />\n+ <Atom charge=\"-0.24373\" name=\"C6\" type=\"cB\" />\n+ <Atom charge=\"0.148607\" name=\"H6\" type=\"hB\" />\n+ <Atom charge=\"-0.075453\" name=\"C7\" type=\"cA\" />\n+ <Atom charge=\"0.051297\" name=\"H7A\" type=\"hA\" />\n+ <Atom charge=\"0.051297\" name=\"H7B\" type=\"hA\" />\n+ <Atom charge=\"0.017835\" name=\"C8\" type=\"cA\" />\n+ <Atom charge=\"0.02812\" name=\"H8\" type=\"hA\" />\n+ <Atom charge=\"0.013753\" name=\"C14\" type=\"cA\" />\n+ <Atom charge=\"0.004469\" name=\"H14\" type=\"hA\" />\n+ <Atom charge=\"-0.185047\" name=\"C15\" type=\"cA\" />\n+ <Atom charge=\"0.041228\" name=\"H15A\" type=\"hA\" />\n+ <Atom charge=\"0.041228\" name=\"H15B\" type=\"hA\" />\n+ <Atom charge=\"-0.082919\" name=\"C16\" type=\"cA\" />\n+ <Atom charge=\"0.027639\" name=\"H16A\" type=\"hA\" />\n+ <Atom charge=\"0.027639\" name=\"H16B\" type=\"hA\" />\n+ <Atom charge=\"-0.051767\" name=\"C17\" type=\"cA\" />\n+ <Atom charge=\"-0.030436\" name=\"H17\" type=\"hA\" />\n+ <Atom charge=\"0.583692\" name=\"C13\" type=\"cA\" />\n+ <Atom charge=\"-0.536004\" name=\"C18\" type=\"cA\" />\n+ <Atom charge=\"0.103623\" name=\"H18A\" type=\"hA\" />\n+ <Atom charge=\"0.103623\" name=\"H18B\" type=\"hA\" />\n+ <Atom charge=\"0.103623\" name=\"H18C\" type=\"hA\" />\n+ <Atom charge=\"-0.158054\" name=\"C12\" type=\"cA\" />\n+ <Atom charge=\"0.007687\" name=\"H12A\" type=\"hA\" />\n+ <Atom charge=\"0.007687\" name=\"H12B\" type=\"hA\" />\n+ <Atom charge=\"-0.127715\" name=\"C11\" type=\"cA\" />\n+ <Atom charge=\"0.040257\" name=\"H11A\" type=\"hA\" />\n+ <Atom charge=\"0.040257\" name=\"H11B\" type=\"hA\" />\n+ <Atom charge=\"-0.029839\" name=\"C9\" type=\"cA\" />\n+ <Atom charge=\"-0.003361\" name=\"H9\" type=\"hA\" />\n+ <Atom charge=\"0.54647\" name=\"C10\" type=\"cA\" />\n+ <Atom charge=\"-0.352218\" name=\"C19\" type=\"cA\" />\n+ <Atom charge=\"0.072469\" name=\"H19A\" type=\"hA\" />\n+ <Atom charge=\"0.072469\" name=\"H19B\" type=\"hA\" />\n+ <Atom charge=\"0.072469\" name=\"H19C\" type=\"hA\" />\n+ <Atom charge=\"-0.247736\" name=\"C1\" type=\"cA\" />\n+ <Atom charge=\"0.048772\" name=\"H1A\" type=\"hA\" />\n+ <Atom charge=\"0.048772\" name=\"H1B\" type=\"hA\" />\n+ <Atom charge=\"-0.061498\" name=\"C2\" type=\"cA\" />\n+ <Atom charge=\"0.048128\" name=\"H2A\" type=\"hA\" />\n+ <Atom charge=\"0.048128\" name=\"H2B\" type=\"hA\" />\n+ <Atom charge=\"0.178752\" name=\"C20\" type=\"cD\" />\n+ <Atom charge=\"-0.016015\" name=\"H20\" type=\"hL\" />\n+ <Atom charge=\"-0.427968\" name=\"C21\" type=\"cD\" />\n+ <Atom charge=\"0.099219\" name=\"H21A\" type=\"hL\" />\n+ <Atom charge=\"0.099219\" name=\"H21B\" type=\"hL\" />\n+ <Atom charge=\"0.099219\" name=\"H21C\" type=\"hL\" />\n+ <Atom charge=\"-0.050256\" name=\"C22\" type=\"cD\" />\n+ <Atom charge=\"0.009445\" name=\"H22A\" type=\"hL\" />\n+ <Atom charge=\"0.009445\" name=\"H22B\" type=\"hL\" />\n+ <Atom charge=\"0.078665\" name=\"C23\" type=\"cD\" />\n+ <Atom charge=\"-0.007957\" name=\"H23A\" type=\"hL\" />\n+ <Atom charge=\"-0.007957\" name=\"H23B\" type=\"hL\" />\n+ <Atom charge=\"-0.282133\" name=\"C24\" type=\"cD\" />\n+ <Atom charge=\"0.062972\" name=\"H24A\" type=\"hL\" />\n+ <Atom charge=\"0.062972\" name=\"H24B\" type=\"hL\" />\n+ <Atom charge=\"0.450601\" name=\"C25\" type=\"cD\" />\n+ <Atom charge=\"-0.049128\" name=\"H25\" type=\"hL\" />\n+ <Atom charge=\"-0.4493\" name=\"C26\" type=\"cD\" />\n+ <Atom charge=\"0.099869\" name=\"H26A\" type=\"hL\" />\n+ <Atom charge=\"0.099869\" name=\"H26B\" type=\"hL\" />\n+ <Atom charge=\"0.099869\" name=\"H26C\" type=\"hL\" />\n+ <Atom charge=\"-0.4493\" name=\"C27\" type=\"cD\" />\n+ <Atom charge=\"0.099869\" name=\"H27A\" type=\"hL\" />\n+ <Atom charge=\"0.099869\" name=\"H27B\" type=\"hL\" />\n+ <Atom charge=\"0.099869\" name=\"H27C\" type=\"hL\" />\n+ <Bond atomName1=\"C3\" atomName2=\"O3\" />\n+ <Bond atomName1=\"C3\" atomName2=\"H3\" />\n+ <Bond atomName1=\"O3\" atomName2=\"H3'\" />\n+ <Bond atomName1=\"C3\" atomName2=\"C2\" />\n+ <Bond atomName1=\"C2\" atomName2=\"H2A\" />\n+ <Bond atomName1=\"C2\" atomName2=\"H2B\" />\n+ <Bond atomName1=\"C2\" atomName2=\"C1\" />\n+ <Bond atomName1=\"C1\" atomName2=\"H1A\" />\n+ <Bond atomName1=\"C1\" atomName2=\"H1B\" />\n+ <Bond atomName1=\"C3\" atomName2=\"C4\" />\n+ <Bond atomName1=\"C4\" atomName2=\"H4A\" />\n+ <Bond atomName1=\"C4\" atomName2=\"H4B\" />\n+ <Bond atomName1=\"C4\" atomName2=\"C5\" />\n+ <Bond atomName1=\"C5\" atomName2=\"C10\" />\n+ <Bond atomName1=\"C10\" atomName2=\"C1\" />\n+ <Bond atomName1=\"C10\" atomName2=\"C19\" />\n+ <Bond atomName1=\"C19\" atomName2=\"H19A\" />\n+ <Bond atomName1=\"C19\" atomName2=\"H19B\" />\n+ <Bond atomName1=\"C19\" atomName2=\"H19C\" />\n+ <Bond atomName1=\"C5\" atomName2=\"C6\" />\n+ <Bond atomName1=\"C6\" atomName2=\"H6\" />\n+ <Bond atomName1=\"C6\" atomName2=\"C7\" />\n+ <Bond atomName1=\"C7\" atomName2=\"H7A\" />\n+ <Bond atomName1=\"C7\" atomName2=\"H7B\" />\n+ <Bond atomName1=\"C7\" atomName2=\"C8\" />\n+ <Bond atomName1=\"C8\" atomName2=\"H8\" />\n+ <Bond atomName1=\"C8\" atomName2=\"C9\" />\n+ <Bond atomName1=\"C9\" atomName2=\"H9\" />\n+ <Bond atomName1=\"C9\" atomName2=\"C10\" />\n+ <Bond atomName1=\"C8\" atomName2=\"C14\" />\n+ <Bond atomName1=\"C14\" atomName2=\"H14\" />\n+ <Bond atomName1=\"C14\" atomName2=\"C13\" />\n+ <Bond atomName1=\"C13\" atomName2=\"C12\" />\n+ <Bond atomName1=\"C12\" atomName2=\"H12A\" />\n+ <Bond atomName1=\"C12\" atomName2=\"H12B\" />\n+ <Bond atomName1=\"C12\" atomName2=\"C11\" />\n+ <Bond atomName1=\"C11\" atomName2=\"H11A\" />\n+ <Bond atomName1=\"C11\" atomName2=\"H11B\" />\n+ <Bond atomName1=\"C11\" atomName2=\"C9\" />\n+ <Bond atomName1=\"C13\" atomName2=\"C18\" />\n+ <Bond atomName1=\"C18\" atomName2=\"H18A\" />\n+ <Bond atomName1=\"C18\" atomName2=\"H18B\" />\n+ <Bond atomName1=\"C18\" atomName2=\"H18C\" />\n+ <Bond atomName1=\"C14\" atomName2=\"C15\" />\n+ <Bond atomName1=\"C15\" atomName2=\"H15A\" />\n+ <Bond atomName1=\"C15\" atomName2=\"H15B\" />\n+ <Bond atomName1=\"C15\" atomName2=\"C16\" />\n+ <Bond atomName1=\"C16\" atomName2=\"H16A\" />\n+ <Bond atomName1=\"C16\" atomName2=\"H16B\" />\n+ <Bond atomName1=\"C16\" atomName2=\"C17\" />\n+ <Bond atomName1=\"C17\" atomName2=\"H17\" />\n+ <Bond atomName1=\"C17\" atomName2=\"C13\" />\n+ <Bond atomName1=\"C17\" atomName2=\"C20\" />\n+ <Bond atomName1=\"C20\" atomName2=\"H20\" />\n+ <Bond atomName1=\"C20\" atomName2=\"C21\" />\n+ <Bond atomName1=\"C21\" atomName2=\"H21A\" />\n+ <Bond atomName1=\"C21\" atomName2=\"H21B\" />\n+ <Bond atomName1=\"C21\" atomName2=\"H21C\" />\n+ <Bond atomName1=\"C20\" atomName2=\"C22\" />\n+ <Bond atomName1=\"C22\" atomName2=\"H22A\" />\n+ <Bond atomName1=\"C22\" atomName2=\"H22B\" />\n+ <Bond atomName1=\"C22\" atomName2=\"C23\" />\n+ <Bond atomName1=\"C23\" atomName2=\"H23A\" />\n+ <Bond atomName1=\"C23\" atomName2=\"H23B\" />\n+ <Bond atomName1=\"C23\" atomName2=\"C24\" />\n+ <Bond atomName1=\"C24\" atomName2=\"H24A\" />\n+ <Bond atomName1=\"C24\" atomName2=\"H24B\" />\n+ <Bond atomName1=\"C24\" atomName2=\"C25\" />\n+ <Bond atomName1=\"C25\" atomName2=\"H25\" />\n+ <Bond atomName1=\"C25\" atomName2=\"C26\" />\n+ <Bond atomName1=\"C26\" atomName2=\"H26A\" />\n+ <Bond atomName1=\"C26\" atomName2=\"H26B\" />\n+ <Bond atomName1=\"C26\" atomName2=\"H26C\" />\n+ <Bond atomName1=\"C25\" atomName2=\"C27\" />\n+ <Bond atomName1=\"C27\" atomName2=\"H27A\" />\n+ <Bond atomName1=\"C27\" atomName2=\"H27B\" />\n+ <Bond atomName1=\"C27\" atomName2=\"H27C\" />\n+ </Residue>\n+ <Residue name=\"SDPE\">\n+ <Atom charge=\"-0.368132\" name=\"N\" type=\"nA\" />\n+ <Atom charge=\"0.348549\" name=\"HN1\" type=\"hN\" />\n+ <Atom charge=\"0.348549\" name=\"HN2\" type=\"hN\" />\n+ <Atom charge=\"0.348549\" name=\"HN3\" type=\"hN\" />\n+ <Atom charge=\"0.077319\" name=\"C12\" type=\"cA\" />\n+ <Atom charge=\"0.09163\" name=\"H12A\" type=\"hX\" />\n+ <Atom charge=\"0.09163\" name=\"H12B\" type=\"hX\" />\n+ <Atom charge=\"0.075159\" name=\"C11\" type=\"cA\" />\n+ <Atom charge=\"0.091516\" name=\"H11A\" type=\"hE\" />\n+ <Atom charge=\"0.091516\" name=\"H11B\" type=\"hE\" />\n+ <Atom charge=\"1.373656\" name=\"P\" type=\"pA\" />\n+ <Atom charge=\"-0.877447\" name=\"O13\" type=\"oP\" />\n+ <Atom charge=\"-0.877447\" name=\"O14\" type=\"oP\" />\n+ <Atom charge=\"-0.514542\" name=\"O12\" type=\"oT\" />\n+ <Atom charge=\"-0.546623\" name=\"O11\" type=\"oT\" />\n+ <Atom charge=\"0.040967\" name=\"C1\" type=\"cA\" />\n+ <Atom charge=\"0.090994\" name=\"HA\" type=\"hE\" />\n+ <Atom charge=\"0.090994\" name=\"HB\" type=\"hE\" />\n+ <Atom charge=\"0.339004\" name=\"C2\" type=\"cA\" />\n+ <Atom charge=\"0.032843\" name=\"HS\" type=\"hE\" />\n+ <Atom charge=\"-0.57548\" name=\"O21\" type=\"oS\" />\n+ <Atom charge=\"0.86934\" name=\"C21\" type=\"cC\" />\n+ <Atom charge=\"-0.649199\" name=\"O22\" type=\"oC\" />\n+ <Atom charge=\"-0.142937\" name=\"C22\" type=\"cD\" />\n+ <Atom charge=\"0.037544\" name=\"H2R\" type=\"hL\" />\n+ <Atom charge=\"0.037544\" name=\"H2S\" type=\"hL\" />\n+ <Atom charge=\"0.273776\" name=\"C3\" type=\"cA\" />\n+ <Atom charge=\"0.044574\" name=\"HX\" type=\"hE\" />\n+ <Atom charge=\"0.044574\" name=\"HY\" type=\"hE\" />\n+ <Atom charge=\"-0.593826\" name=\"O31\" type=\"oS\" />\n+ <Atom charge=\"0.888359\" name=\"C31\" type=\"cC\" />\n+ <Atom charge=\"-0.650802\" name=\"O32\" type=\"oC\" />\n+ <Atom charge=\"-0.11702\" name=\"C32\" type=\"cD\" />\n+ <Atom charge=\"0.051807\" name=\"H2X\" type=\"hL\" />\n+ <Atom charge=\"0.051807\" name=\"H2Y\" type=\"hL\" />\n+ <Atom charge=\"0.120999\" name=\"C23\" type=\"cD\" />\n+ <Atom charge=\"0.026097\" name=\"H3R\" type=\"hL\" />\n+ <Atom charge=\"0.026097\" name=\"H3S\" type=\"hL\" />\n+ <Atom charge=\"-0.287059\" name=\"C24\" type=\"cB\" />\n+ <Atom charge=\"0.154038\" name=\"H4R\" type=\"hB\" />\n+ <Atom charge=\"-0.214845\" name=\"C25\" type=\"cB\" />\n+ <Atom charge=\"0.132504\" name=\"H5R\" type=\"hB\" />\n+ <Atom charge=\"0.060337\" name=\"C26\" type=\"cD\" />\n+ <Atom charge=\"0.063515\" name=\"H6R\" type=\"hL\" />\n+ <Atom charge=\"0.063515\" name=\"H6S\" type=\"hL\" />\n+ <Atom charge=\"-0.220895\" name=\"C27\" type=\"cB\" />\n+ <Atom charge=\"0.139863\" name=\"H7R\" type=\"hB\" />\n+ <Atom charge=\"-0.226254\" name=\"C28\" type=\"cB\" />\n+ <Atom charge=\"0.128147\" name=\"H8R\" type=\"hB\" />\n+ <Atom charge=\"0.089043\" name=\"C29\" type=\"cD\" />\n+ <Atom charge=\"0.054255\" name=\"H9R\" type=\"hL\" />\n+ <Atom charge=\"0.054255\" name=\"H9S\" type=\"hL\" />\n+ <Atom charge=\"-0.221433\" name=\"C210\" type=\"cB\" />\n+ <Atom charge=\"0.133628\" name=\"H10R\" type=\"hB\" />\n+ <Atom charge=\"-0.241205\" name=\"C211\" type=\"cB\" />\n+ <Atom charge=\"0.136308\" name=\"H11R\" type=\"hB\" />\n+ <Atom charge=\"0.085245\" name=\"C212\" type=\"cD\" />\n+ <Atom charge=\"0.053422\" name=\"H12R\" type=\"hL\" />\n+ <Atom charge=\"0.053422\" name=\"H12S\" type=\"hL\" />\n+ <Atom charge=\"-0.218668\" name=\"C213\" type=\"cB\" />\n+ <Atom charge=\"0.131575\" name=\"H13R\" type=\"hB\" />\n+ <Atom charge=\"-0.240419\" name=\"C214\" type=\"cB\" />\n+ <Atom charge=\"0.138337\" name=\"H14R\" type=\"hB\" />\n+ <Atom charge=\"0.069215\" name=\"C215\" type=\"cD\" />\n+ <Atom charge=\"0.058341\" name=\"H15R\" type=\"hL\" />\n+ <Atom charge=\"0.058341\" name=\"H15S\" type=\"hL\" />\n+ <Atom charge=\"-0.233897\" name=\"C216\" type=\"cB\" />\n+ <Atom charge=\"0.133812\" name=\"H16R\" type=\"hB\" />\n+ <Atom charge=\"-0.216499\" name=\"C217\" type=\"cB\" />\n+ <Atom charge=\"0.132121\" name=\"H17R\" type=\"hB\" />\n+ <Atom charge=\"0.092718\" name=\"C218\" type=\"cD\" />\n+ <Atom charge=\"0.053227\" name=\"H18R\" type=\"hL\" />\n+ <Atom charge=\"0.053227\" name=\"H18S\" type=\"hL\" />\n+ <Atom charge=\"-0.246833\" name=\"C219\" type=\"cB\" />\n+ <Atom charge=\"0.136323\" name=\"H19R\" type=\"hB\" />\n+ <Atom charge=\"-0.240216\" name=\"C220\" type=\"cB\" />\n+ <Atom charge=\"0.133048\" name=\"H20R\" type=\"hB\" />\n+ <Atom charge=\"0.122022\" name=\"C221\" type=\"cD\" />\n+ <Atom charge=\"0.010042\" name=\"H21R\" type=\"hL\" />\n+ <Atom charge=\"0.010042\" name=\"H21S\" type=\"hL\" />\n+ <Atom charge=\"-0.108913\" name=\"C222\" type=\"cD\" />\n+ <Atom charge=\"0.025968\" name=\"H22R\" type=\"hL\" />\n+ <Atom charge=\"0.025968\" name=\"H22S\" type=\"hL\" />\n+ <Atom charge=\"0.025968\" name=\"H22T\" type=\"hL\" />\n+ <Atom charge=\"-0.000128\" name=\"C33\" type=\"cD\" />\n+ <Atom charge=\"0.013886\" name=\"H3X\" type=\"hL\" />\n+ <Atom charge=\"0.013886\" name=\"H3Y\" type=\"hL\" />\n+ <Atom charge=\"-0.059792\" name=\"C34\" type=\"cD\" />\n+ <Atom charge=\"0.024241\" name=\"H4X\" type=\"hL\" />\n+ <Atom charge=\"0.024241\" name=\"H4Y\" type=\"hL\" />\n+ <Atom charge=\"-0.013443\" name=\"C35\" type=\"cD\" />\n+ <Atom charge=\"0.008191\" name=\"H5X\" type=\"hL\" />\n+ <Atom charge=\"0.008191\" name=\"H5Y\" type=\"hL\" />\n+ <Atom charge=\"-0.037627\" name=\"C36\" type=\"cD\" />\n+ <Atom charge=\"0.01774\" name=\"H6X\" type=\"hL\" />\n+ <Atom charge=\"0.01774\" name=\"H6Y\" type=\"hL\" />\n+ <Atom charge=\"-0.019469\" name=\"C37\" type=\"cD\" />\n+ <Atom charge=\"0.009292\" name=\"H7X\" type=\"hL\" />\n+ <Atom charge=\"0.009292\" name=\"H7Y\" type=\"hL\" />\n+ <Atom charge=\"-0.014623\" name=\"C38\" type=\"cD\" />\n+ <Atom charge=\"0.007326\" name=\"H8X\" type=\"hL\" />\n+ <Atom charge=\"0.007326\" name=\"H8Y\" type=\"hL\" />\n+ <Atom charge=\"-0.017997\" name=\"C39\" type=\"cD\" />\n+ <Atom charge=\"0.009595\" name=\"H9X\" type=\"hL\" />\n+ <Atom charge=\"0.009595\" name=\"H9Y\" type=\"hL\" />\n+ <Atom charge=\"-0.026418\" name=\"C310\" type=\"cD\" />\n+ <Atom charge=\"0.010825\" name=\"H10X\" type=\"hL\" />\n+ <Atom charge=\"0.010825\" name=\"H10Y\" type=\"hL\" />\n+ <Atom charge=\"-0.017093\" name=\"C311\" type=\"cD\" />\n+ <Atom charge=\"0.010206\" name=\"H11X\" type=\"hL\" />\n+ <Atom charge=\"0.010206\" name=\"H11Y\" type=\"hL\" />\n+ <Atom charge=\"-0.019153\" name=\"C312\" type=\"cD\" />\n+ <Atom charge=\"0.008198\" name=\"H12X\" type=\"hL\" />\n+ <Atom charge=\"0.008198\" name=\"H12Y\" type=\"hL\" />\n+ <Atom charge=\"-0.01159\" name=\"C313\" type=\"cD\" />\n+ <Atom charge=\"0.006022\" name=\"H13X\" type=\"hL\" />\n+ <Atom charge=\"0.006022\" name=\"H13Y\" type=\"hL\" />\n+ <Atom charge=\"-0.013489\" name=\"C314\" type=\"cD\" />\n+ <Atom charge=\"0.010073\" name=\"H14X\" type=\"hL\" />\n+ <Atom charge=\"0.010073\" name=\"H14Y\" type=\"hL\" />\n+ <Atom charge=\"-0.032444\" name=\"C315\" type=\"cD\" />\n+ <Atom charge=\"0.010253\" name=\"H15X\" type=\"hL\" />\n+ <Atom charge=\"0.010253\" name=\"H15Y\" type=\"hL\" />\n+ <Atom charge=\"-0.027654\" name=\"C316\" type=\"cD\" />\n+ <Atom charge=\"0.015627\" name=\"H16X\" type=\"hL\" />\n+ <Atom charge=\"0.015627\" name=\"H16Y\" type=\"hL\" />\n+ <Atom charge=\"0.020665\" name=\"C317\" type=\"cD\" />\n+ <Atom charge=\"0.008483\" name=\"H17X\" type=\"hL\" />\n+ <Atom charge=\"0.008483\" name=\"H17Y\" type=\"hL\" />\n+ <Atom charge=\"-0.120069\" name=\"C318\" type=\"cD\" />\n+ <Atom charge=\"0.027938\" name=\"H18X\" type=\"hL\" />\n+ <Atom charge=\"0.027938\" name=\"H18Y\" type=\"hL\" />\n+ <Atom charge=\"0.027938\" name=\"H18Z\" type=\"hL\" />\n+ <Bond atomName1=\"N\" atomName2=\"HN1\" />\n+ <Bond atomName1=\"N\" atomName2=\"HN2\" />\n+ <Bond atomName1=\"N\" atomName2=\"HN3\" />\n+ <Bond atomName1=\"N\" atomName2=\"C12\" />\n+ <Bond atomName1=\"C12\" atomName2=\"H12A\" />\n+ <Bond atomName1=\"C12\" atomName2=\"H12B\" />\n+ <Bond atomName1=\"C12\" atomName2=\"C11\" />\n+ <Bond atomName1=\"C11\" atomName2=\"H11A\" />\n+ <Bond atomName1=\"C11\" atomName2=\"H11B\" />\n+ <Bond atomName1=\"C11\" atomName2=\"O12\" />\n+ <Bond atomName1=\"C1\" atomName2=\"O11\" />\n+ <Bond atomName1=\"O12\" atomName2=\"P\" />\n+ <Bond atomName1=\"P\" atomName2=\"O11\" />\n+ <Bond atomName1=\"P\" atomName2=\"O13\" />\n+ <Bond atomName1=\"P\" atomName2=\"O14\" />\n+ <Bond atomName1=\"C1\" atomName2=\"HA\" />\n+ <Bond atomName1=\"C1\" atomName2=\"HB\" />\n+ <Bond atomName1=\"C1\" atomName2=\"C2\" />\n+ <Bond atomName1=\"C2\" atomName2=\"HS\" />\n+ <Bond atomName1=\"C2\" atomName2=\"C3\" />\n+ <Bond atomName1=\"C2\" atomName2=\"O21\" />\n+ <Bond atomName1=\"C3\" atomName2=\"HX\" />\n+ <Bond atomName1=\"C3\" atomName2=\"HY\" />\n+ <Bond atomName1=\"C3\" atomName2=\"O31\" />\n+ <Bond atomName1=\"O21\" atomName2=\"C21\" />\n+ <Bond atomName1=\"C21\" atomName2=\"C22\" />\n+ <Bond atomName1=\"C21\" atomName2=\"O22\" />\n+ <Bond atomName1=\"C22\" atomName2=\"H2R\" />\n+ <Bond atomName1=\"C22\" atomName2=\"H2S\" />\n+ <Bond atomName1=\"C22\" atomName2=\"C23\" />\n+ <Bond atomName1=\"C23\" atomName2=\"H3R\" />\n+ <Bond atomName1=\"C23\" atomName2=\"H3S\" />\n+ <Bond atomName1=\"C23\" atomName2=\"C24\" />\n+ <Bond atomName1=\"C24\" atomName2=\"H4R\" />\n+ <Bond atomName1=\"C24\" atomName2=\"C25\" />\n+ <Bond atomName1=\"C25\" atomName2=\"H5R\" />\n+ <Bond atomName1=\"C25\" atomName2=\"C26\" />\n+ <Bond atomName1=\"C26\" atomName2=\"H6R\" />\n+ <Bond atomName1=\"C26\" atomName2=\"H6S\" />\n+ <Bond atomName1=\"C26\" atomName2=\"C27\" />\n+ <Bond atomName1=\"C27\" atomName2=\"H7R\" />\n+ <Bond atomName1=\"C27\" atomName2=\"C28\" />\n+ <Bond atomName1=\"C28\" atomName2=\"H8R\" />\n+ <Bond atomName1=\"C28\" atomName2=\"C29\" />\n+ <Bond atomName1=\"C29\" atomName2=\"H9R\" />\n+ <Bond atomName1=\"C29\" atomName2=\"H9S\" />\n+ <Bond atomName1=\"C29\" atomName2=\"C210\" />\n+ <Bond atomName1=\"C210\" atomName2=\"H10R\" />\n+ <Bond atomName1=\"C210\" atomName2=\"C211\" />\n+ <Bond atomName1=\"C211\" atomName2=\"H11R\" />\n+ <Bond atomName1=\"C211\" atomName2=\"C212\" />\n+ <Bond atomName1=\"C212\" atomName2=\"H12R\" />\n+ <Bond atomName1=\"C212\" atomName2=\"H12S\" />\n+ <Bond atomName1=\"C212\" atomName2=\"C213\" />\n+ <Bond atomName1=\"C213\" atomName2=\"H13R\" />\n+ <Bond atomName1=\"C213\" atomName2=\"C214\" />\n+ <Bond atomName1=\"C214\" atomName2=\"H14R\" />\n+ <Bond atomName1=\"C214\" atomName2=\"C215\" />\n+ <Bond atomName1=\"C215\" atomName2=\"H15R\" />\n+ <Bond atomName1=\"C215\" atomName2=\"H15S\" />\n+ <Bond atomName1=\"C215\" atomName2=\"C216\" />\n+ <Bond atomName1=\"C216\" atomName2=\"H16R\" />\n+ <Bond atomName1=\"C216\" atomName2=\"C217\" />\n+ <Bond atomName1=\"C217\" atomName2=\"H17R\" />\n+ <Bond atomName1=\"C217\" atomName2=\"C218\" />\n+ <Bond atomName1=\"C218\" atomName2=\"H18R\" />\n+ <Bond atomName1=\"C218\" atomName2=\"H18S\" />\n+ <Bond atomName1=\"C218\" atomName2=\"C219\" />\n+ <Bond atomName1=\"C219\" atomName2=\"H19R\" />\n+ <Bond atomName1=\"C219\" atomName2=\"C220\" />\n+ <Bond atomName1=\"C220\" atomName2=\"H20R\" />\n+ <Bond atomName1=\"C220\" atomName2=\"C221\" />\n+ <Bond atomName1=\"C221\" atomName2=\"H21R\" />\n+ <Bond atomName1=\"C221\" atomName2=\"H21S\" />\n+ <Bond atomName1=\"C221\" atomName2=\"C222\" />\n+ <Bond atomName1=\"C222\" atomName2=\"H22R\" />\n+ <Bond atomName1=\"C222\" atomName2=\"H22S\" />\n+ <Bond atomName1=\"C222\" atomName2=\"H22T\" />\n+ <Bond atomName1=\"O31\" atomName2=\"C31\" />\n+ <Bond atomName1=\"C31\" atomName2=\"C32\" />\n+ <Bond atomName1=\"C31\" atomName2=\"O32\" />\n+ <Bond atomName1=\"C32\" atomName2=\"H2X\" />\n+ <Bond atomName1=\"C32\" atomName2=\"H2Y\" />\n+ <Bond atomName1=\"C32\" atomName2=\"C33\" />\n+ <Bond atomName1=\"C33\" atomName2=\"H3X\" />\n+ <Bond atomName1=\"C33\" atomName2=\"H3Y\" />\n+ <Bond atomName1=\"C33\" atomName2=\"C34\" />\n+ <Bond atomName1=\"C34\" atomName2=\"H4X\" />\n+ <Bond atomName1=\"C34\" atomName2=\"H4Y\" />\n+ <Bond atomName1=\"C34\" atomName2=\"C35\" />\n+ <Bond atomName1=\"C35\" atomName2=\"H5X\" />\n+ <Bond atomName1=\"C35\" atomName2=\"H5Y\" />\n+ <Bond atomName1=\"C35\" atomName2=\"C36\" />\n+ <Bond atomName1=\"C36\" atomName2=\"H6X\" />\n+ <Bond atomName1=\"C36\" atomName2=\"H6Y\" />\n+ <Bond atomName1=\"C36\" atomName2=\"C37\" />\n+ <Bond atomName1=\"C37\" atomName2=\"H7X\" />\n+ <Bond atomName1=\"C37\" atomName2=\"H7Y\" />\n+ <Bond atomName1=\"C37\" atomName2=\"C38\" />\n+ <Bond atomName1=\"C38\" atomName2=\"H8X\" />\n+ <Bond atomName1=\"C38\" atomName2=\"H8Y\" />\n+ <Bond atomName1=\"C38\" atomName2=\"C39\" />\n+ <Bond atomName1=\"C39\" atomName2=\"H9X\" />\n+ <Bond atomName1=\"C39\" atomName2=\"H9Y\" />\n+ <Bond atomName1=\"C39\" atomName2=\"C310\" />\n+ <Bond atomName1=\"C310\" atomName2=\"H10X\" />\n+ <Bond atomName1=\"C310\" atomName2=\"H10Y\" />\n+ <Bond atomName1=\"C310\" atomName2=\"C311\" />\n+ <Bond atomName1=\"C311\" atomName2=\"H11X\" />\n+ <Bond atomName1=\"C311\" atomName2=\"H11Y\" />\n+ <Bond atomName1=\"C311\" atomName2=\"C312\" />\n+ <Bond atomName1=\"C312\" atomName2=\"H12X\" />\n+ <Bond atomName1=\"C312\" atomName2=\"H12Y\" />\n+ <Bond atomName1=\"C312\" atomName2=\"C313\" />\n+ <Bond atomName1=\"C313\" atomName2=\"H13X\" />\n+ <Bond atomName1=\"C313\" atomName2=\"H13Y\" />\n+ <Bond atomName1=\"C313\" atomName2=\"C314\" />\n+ <Bond atomName1=\"C314\" atomName2=\"H14X\" />\n+ <Bond atomName1=\"C314\" atomName2=\"H14Y\" />\n+ <Bond atomName1=\"C314\" atomName2=\"C315\" />\n+ <Bond atomName1=\"C315\" atomName2=\"H15X\" />\n+ <Bond atomName1=\"C315\" atomName2=\"H15Y\" />\n+ <Bond atomName1=\"C315\" atomName2=\"C316\" />\n+ <Bond atomName1=\"C316\" atomName2=\"H16X\" />\n+ <Bond atomName1=\"C316\" atomName2=\"H16Y\" />\n+ <Bond atomName1=\"C316\" atomName2=\"C317\" />\n+ <Bond atomName1=\"C317\" atomName2=\"H17X\" />\n+ <Bond atomName1=\"C317\" atomName2=\"H17Y\" />\n+ <Bond atomName1=\"C317\" atomName2=\"C318\" />\n+ <Bond atomName1=\"C318\" atomName2=\"H18X\" />\n+ <Bond atomName1=\"C318\" atomName2=\"H18Y\" />\n+ <Bond atomName1=\"C318\" atomName2=\"H18Z\" />\n+ </Residue>\n+ <Residue name=\"DAPE\">\n+ <Atom charge=\"-0.368132\" name=\"N\" type=\"nA\" />\n+ <Atom charge=\"0.348549\" name=\"HN1\" type=\"hN\" />\n+ <Atom charge=\"0.348549\" name=\"HN2\" type=\"hN\" />\n+ <Atom charge=\"0.348549\" name=\"HN3\" type=\"hN\" />\n+ <Atom charge=\"0.077319\" name=\"C12\" type=\"cA\" />\n+ <Atom charge=\"0.09163\" name=\"H12A\" type=\"hX\" />\n+ <Atom charge=\"0.09163\" name=\"H12B\" type=\"hX\" />\n+ <Atom charge=\"0.075159\" name=\"C11\" type=\"cA\" />\n+ <Atom charge=\"0.091516\" name=\"H11A\" type=\"hE\" />\n+ <Atom charge=\"0.091516\" name=\"H11B\" type=\"hE\" />\n+ <Atom charge=\"1.373656\" name=\"P\" type=\"pA\" />\n+ <Atom charge=\"-0.877447\" name=\"O13\" type=\"oP\" />\n+ <Atom charge=\"-0.877447\" name=\"O14\" type=\"oP\" />\n+ <Atom charge=\"-0.514542\" name=\"O12\" type=\"oT\" />\n+ <Atom charge=\"-0.546623\" name=\"O11\" type=\"oT\" />\n+ <Atom charge=\"0.040967\" name=\"C1\" type=\"cA\" />\n+ <Atom charge=\"0.090994\" name=\"HA\" type=\"hE\" />\n+ <Atom charge=\"0.090994\" name=\"HB\" type=\"hE\" />\n+ <Atom charge=\"0.339004\" name=\"C2\" type=\"cA\" />\n+ <Atom charge=\"0.032843\" name=\"HS\" type=\"hE\" />\n+ <Atom charge=\"-0.57548\" name=\"O21\" type=\"oS\" />\n+ <Atom charge=\"0.86934\" name=\"C21\" type=\"cC\" />\n+ <Atom charge=\"-0.649199\" name=\"O22\" type=\"oC\" />\n+ <Atom charge=\"-0.123935\" name=\"C22\" type=\"cD\" />\n+ <Atom charge=\"0.024535\" name=\"H2R\" type=\"hL\" />\n+ <Atom charge=\"0.024535\" name=\"H2S\" type=\"hL\" />\n+ <Atom charge=\"0.273776\" name=\"C3\" type=\"cA\" />\n+ <Atom charge=\"0.044574\" name=\"HX\" type=\"hE\" />\n+ <Atom charge=\"0.044574\" name=\"HY\" type=\"hE\" />\n+ <Atom charge=\"-0.593826\" name=\"O31\" type=\"oS\" />\n+ <Atom charge=\"0.888359\" name=\"C31\" type=\"cC\" />\n+ <Atom charge=\"-0.650802\" name=\"O32\" type=\"oC\" />\n+ <Atom charge=\"-0.123935\" name=\"C32\" type=\"cD\" />\n+ <Atom charge=\"0.024535\" name=\"H2X\" type=\"hL\" />\n+ <Atom charge=\"0.024535\" name=\"H2Y\" type=\"hL\" />\n+ <Atom charge=\"0.025626\" name=\"C23\" type=\"cD\" />\n+ <Atom charge=\"0.025117\" name=\"H3R\" type=\"hL\" />\n+ <Atom charge=\"0.025117\" name=\"H3S\" type=\"hL\" />\n+ <Atom charge=\"0.031382\" name=\"C24\" type=\"cD\" />\n+ <Atom charge=\"0.038708\" name=\"H4R\" type=\"hL\" />\n+ <Atom charge=\"0.038708\" name=\"H4S\" type=\"hL\" />\n+ <Atom charge=\"-0.26789\" name=\"C25\" type=\"cB\" />\n+ <Atom charge=\"0.143577\" name=\"H5R\" type=\"hB\" />\n+ <Atom charge=\"-0.206786\" name=\"C26\" type=\"cB\" />\n+ <Atom charge=\"0.129858\" name=\"H6R\" type=\"hB\" />\n+ <Atom charge=\"0.055784\" name=\"C27\" type=\"cD\" />\n+ <Atom charge=\"0.062775\" name=\"H7R\" type=\"hL\" />\n+ <Atom charge=\"0.062775\" name=\"H7S\" type=\"hL\" />\n+ <Atom charge=\"-0.228527\" name=\"C28\" type=\"cB\" />\n+ <Atom charge=\"0.134735\" name=\"H8R\" type=\"hB\" />\n+ <Atom charge=\"-0.228694\" name=\"C29\" type=\"cB\" />\n+ <Atom charge=\"0.132167\" name=\"H9R\" type=\"hB\" />\n+ <Atom charge=\"0.095406\" name=\"C210\" type=\"cD\" />\n+ <Atom charge=\"0.05114\" name=\"H10R\" type=\"hL\" />\n+ <Atom charge=\"0.05114\" name=\"H10S\" type=\"hL\" />\n+ <Atom charge=\"-0.228704\" name=\"C211\" type=\"cB\" />\n+ <Atom charge=\"0.131341\" name=\"H11R\" type=\"hB\" />\n+ <Atom charge=\"-0.220164\" name=\"C212\" type=\"cB\" />\n+ <Atom charge=\"0.131986\" name=\"H12R\" type=\"hB\" />\n+ <Atom charge=\"0.058197\" name=\"C213\" type=\"cD\" />\n+ <Atom charge=\"0.06135\" name=\"H13R\" type=\"hL\" />\n+ <Atom charge=\"0.06135\" name=\"H13S\" type=\"hL\" />\n+ <Atom charge=\"-0.224769\" name=\"C214\" type=\"cB\" />\n+ <Atom charge=\"0.129616\" name=\"H14R\" type=\"hB\" />\n+ <Atom charge=\"-0.244149\" name=\"C215\" type=\"cB\" />\n+ <Atom charge=\"0.132793\" name=\"H15R\" type=\"hB\" />\n+ <Atom charge=\"0.0391\" name=\"C216\" type=\"cD\" />\n+ <Atom charge=\"0.028848\" name=\"H16R\" type=\"hL\" />\n+ <Atom charge=\"0.028848\" name=\"H16S\" type=\"hL\" />\n+ <Atom charge=\"-0.028398\" name=\"C217\" type=\"cD\" />\n+ <Atom charge=\"0.019581\" name=\"H17R\" type=\"hL\" />\n+ <Atom charge=\"0.019581\" name=\"H17S\" type=\"hL\" />\n+ <Atom charge=\"-0.019772\" name=\"C218\" type=\"cD\" />\n+ <Atom charge=\"0.014218\" name=\"H18R\" type=\"hL\" />\n+ <Atom charge=\"0.014218\" name=\"H18S\" type=\"hL\" />\n+ <Atom charge=\"0.024957\" name=\"C219\" type=\"cD\" />\n+ <Atom charge=\"0.005426\" name=\"H19R\" type=\"hL\" />\n+ <Atom charge=\"0.005426\" name=\"H19S\" type=\"hL\" />\n+ <Atom charge=\"-0.109302\" name=\"C220\" type=\"cD\" />\n+ <Atom charge=\"0.023723\" name=\"H20R\" type=\"hL\" />\n+ <Atom charge=\"0.023723\" name=\"H20S\" type=\"hL\" />\n+ <Atom charge=\"0.023723\" name=\"H20T\" type=\"hL\" />\n+ <Atom charge=\"0.025626\" name=\"C33\" type=\"cD\" />\n+ <Atom charge=\"0.025117\" name=\"H3X\" type=\"hL\" />\n+ <Atom charge=\"0.025117\" name=\"H3Y\" type=\"hL\" />\n+ <Atom charge=\"0.031382\" name=\"C34\" type=\"cD\" />\n+ <Atom charge=\"0.038708\" name=\"H4X\" type=\"hL\" />\n+ <Atom charge=\"0.038708\" name=\"H4Y\" type=\"hL\" />\n+ <Atom charge=\"-0.26789\" name=\"C35\" type=\"cB\" />\n+ <Atom charge=\"0.143577\" name=\"H5X\" type=\"hB\" />\n+ <Atom charge=\"-0.206786\" name=\"C36\" type=\"cB\" />\n+ <Atom charge=\"0.129858\" name=\"H6X\" type=\"hB\" />\n+ <Atom charge=\"0.055784\" name=\"C37\" type=\"cD\" />\n+ <Atom charge=\"0.062775\" name=\"H7X\" type=\"hL\" />\n+ <Atom charge=\"0.062775\" name=\"H7Y\" type=\"hL\" />\n+ <Atom charge=\"-0.228527\" name=\"C38\" type=\"cB\" />\n+ <Atom charge=\"0.134735\" name=\"H8X\" type=\"hB\" />\n+ <Atom charge=\"-0.228694\" name=\"C39\" type=\"cB\" />\n+ <Atom charge=\"0.132167\" name=\"H9X\" type=\"hB\" />\n+ <Atom charge=\"0.095406\" name=\"C310\" type=\"cD\" />\n+ <Atom charge=\"0.05114\" name=\"H10X\" type=\"hL\" />\n+ <Atom charge=\"0.05114\" name=\"H10Y\" type=\"hL\" />\n+ <Atom charge=\"-0.228704\" name=\"C311\" type=\"cB\" />\n+ <Atom charge=\"0.131341\" name=\"H11X\" type=\"hB\" />\n+ <Atom charge=\"-0.220164\" name=\"C312\" type=\"cB\" />\n+ <Atom charge=\"0.131986\" name=\"H12X\" type=\"hB\" />\n+ <Atom charge=\"0.058197\" name=\"C313\" type=\"cD\" />\n+ <Atom charge=\"0.06135\" name=\"H13X\" type=\"hL\" />\n+ <Atom charge=\"0.06135\" name=\"H13Y\" type=\"hL\" />\n+ <Atom charge=\"-0.224769\" name=\"C314\" type=\"cB\" />\n+ <Atom charge=\"0.129616\" name=\"H14X\" type=\"hB\" />\n+ <Atom charge=\"-0.244149\" name=\"C315\" type=\"cB\" />\n+ <Atom charge=\"0.132793\" name=\"H15X\" type=\"hB\" />\n+ <Atom charge=\"0.0391\" name=\"C316\" type=\"cD\" />\n+ <Atom charge=\"0.028848\" name=\"H16X\" type=\"hL\" />\n+ <Atom charge=\"0.028848\" name=\"H16Y\" type=\"hL\" />\n+ <Atom charge=\"-0.028398\" name=\"C317\" type=\"cD\" />\n+ <Atom charge=\"0.019581\" name=\"H17X\" type=\"hL\" />\n+ <Atom charge=\"0.019581\" name=\"H17Y\" type=\"hL\" />\n+ <Atom charge=\"-0.019772\" name=\"C318\" type=\"cD\" />\n+ <Atom charge=\"0.014218\" name=\"H18X\" type=\"hL\" />\n+ <Atom charge=\"0.014218\" name=\"H18Y\" type=\"hL\" />\n+ <Atom charge=\"0.024957\" name=\"C319\" type=\"cD\" />\n+ <Atom charge=\"0.005426\" name=\"H19X\" type=\"hL\" />\n+ <Atom charge=\"0.005426\" name=\"H19Y\" type=\"hL\" />\n+ <Atom charge=\"-0.109302\" name=\"C320\" type=\"cD\" />\n+ <Atom charge=\"0.023723\" name=\"H20X\" type=\"hL\" />\n+ <Atom charge=\"0.023723\" name=\"H20Y\" type=\"hL\" />\n+ <Atom charge=\"0.023723\" name=\"H20Z\" type=\"hL\" />\n+ <Bond atomName1=\"N\" atomName2=\"HN1\" />\n+ <Bond atomName1=\"N\" atomName2=\"HN2\" />\n+ <Bond atomName1=\"N\" atomName2=\"HN3\" />\n+ <Bond atomName1=\"N\" atomName2=\"C12\" />\n+ <Bond atomName1=\"C12\" atomName2=\"H12A\" />\n+ <Bond atomName1=\"C12\" atomName2=\"H12B\" />\n+ <Bond atomName1=\"C12\" atomName2=\"C11\" />\n+ <Bond atomName1=\"C11\" atomName2=\"H11A\" />\n+ <Bond atomName1=\"C11\" atomName2=\"H11B\" />\n+ <Bond atomName1=\"C11\" atomName2=\"O12\" />\n+ <Bond atomName1=\"C1\" atomName2=\"O11\" />\n+ <Bond atomName1=\"O12\" atomName2=\"P\" />\n+ <Bond atomName1=\"P\" atomName2=\"O11\" />\n+ <Bond atomName1=\"P\" atomName2=\"O13\" />\n+ <Bond atomName1=\"P\" atomName2=\"O14\" />\n+ <Bond atomName1=\"C1\" atomName2=\"HA\" />\n+ <Bond atomName1=\"C1\" atomName2=\"HB\" />\n+ <Bond atomName1=\"C1\" atomName2=\"C2\" />\n+ <Bond atomName1=\"C2\" atomName2=\"HS\" />\n+ <Bond atomName1=\"C2\" atomName2=\"C3\" />\n+ <Bond atomName1=\"C2\" atomName2=\"O21\" />\n+ <Bond atomName1=\"C3\" atomName2=\"HX\" />\n+ <Bond atomName1=\"C3\" atomName2=\"HY\" />\n+ <Bond atomName1=\"C3\" atomName2=\"O31\" />\n+ <Bond atomName1=\"C21\" atomName2=\"O21\" />\n+ <Bond atomName1=\"C21\" atomName2=\"C22\" />\n+ <Bond atomName1=\"C21\" atomName2=\"O22\" />\n+ <Bond atomName1=\"C22\" atomName2=\"C23\" />\n+ <Bond atomName1=\"C22\" atomName2=\"H2R\" />\n+ <Bond atomName1=\"C22\" atomName2=\"H2S\" />\n+ <Bond atomName1=\"C23\" atomName2=\"C24\" />\n+ <Bond atomName1=\"C23\" atomName2=\"H3R\" />\n+ <Bond atomName1=\"C23\" atomName2=\"H3S\" />\n+ <Bond atomName1=\"C24\" atomName2=\"C25\" />\n+ <Bond atomName1=\"C24\" atomName2=\"H4R\" />\n+ <Bond atomName1=\"C24\" atomName2=\"H4S\" />\n+ <Bond atomName1=\"C25\" atomName2=\"C26\" />\n+ <Bond atomName1=\"C25\" atomName2=\"H5R\" />\n+ <Bond atomName1=\"C26\" atomName2=\"C27\" />\n+ <Bond atomName1=\"C26\" atomName2=\"H6R\" />\n+ <Bond atomName1=\"C27\" atomName2=\"C28\" />\n+ <Bond atomName1=\"C27\" atomName2=\"H7R\" />\n+ <Bond atomName1=\"C27\" atomName2=\"H7S\" />\n+ <Bond atomName1=\"C28\" atomName2=\"C29\" />\n+ <Bond atomName1=\"C28\" atomName2=\"H8R\" />\n+ <Bond atomName1=\"C29\" atomName2=\"C210\" />\n+ <Bond atomName1=\"C29\" atomName2=\"H9R\" />\n+ <Bond atomName1=\"C210\" atomName2=\"C211\" />\n+ <Bond atomName1=\"C210\" atomName2=\"H10R\" />\n+ <Bond atomName1=\"C210\" atomName2=\"H10S\" />\n+ <Bond atomName1=\"C211\" atomName2=\"C212\" />\n+ <Bond atomName1=\"C211\" atomName2=\"H11R\" />\n+ <Bond atomName1=\"C212\" atomName2=\"C213\" />\n+ <Bond atomName1=\"C212\" atomName2=\"H12R\" />\n+ <Bond atomName1=\"C213\" atomName2=\"C214\" />\n+ <Bond atomName1=\"C213\" atomName2=\"H13R\" />\n+ <Bond atomName1=\"C213\" atomName2=\"H13S\" />\n+ <Bond atomName1=\"C214\" atomName2=\"C215\" />\n+ <Bond atomName1=\"C214\" atomName2=\"H14R\" />\n+ <Bond atomName1=\"C215\" atomName2=\"C216\" />\n+ <Bond atomName1=\"C215\" atomName2=\"H15R\" />\n+ <Bond atomName1=\"C216\" atomName2=\"C217\" />\n+ <Bond atomName1=\"C216\" atomName2=\"H16R\" />\n+ <Bond atomName1=\"C216\" atomName2=\"H16S\" />\n+ <Bond atomName1=\"C217\" atomName2=\"C218\" />\n+ <Bond atomName1=\"C217\" atomName2=\"H17R\" />\n+ <Bond atomName1=\"C217\" atomName2=\"H17S\" />\n+ <Bond atomName1=\"C218\" atomName2=\"C219\" />\n+ <Bond atomName1=\"C218\" atomName2=\"H18R\" />\n+ <Bond atomName1=\"C218\" atomName2=\"H18S\" />\n+ <Bond atomName1=\"C219\" atomName2=\"C220\" />\n+ <Bond atomName1=\"C219\" atomName2=\"H19R\" />\n+ <Bond atomName1=\"C219\" atomName2=\"H19S\" />\n+ <Bond atomName1=\"C220\" atomName2=\"H20T\" />\n+ <Bond atomName1=\"C220\" atomName2=\"H20R\" />\n+ <Bond atomName1=\"C220\" atomName2=\"H20S\" />\n+ <Bond atomName1=\"C31\" atomName2=\"O31\" />\n+ <Bond atomName1=\"C31\" atomName2=\"C32\" />\n+ <Bond atomName1=\"C31\" atomName2=\"O32\" />\n+ <Bond atomName1=\"C32\" atomName2=\"C33\" />\n+ <Bond atomName1=\"C32\" atomName2=\"H2X\" />\n+ <Bond atomName1=\"C32\" atomName2=\"H2Y\" />\n+ <Bond atomName1=\"C33\" atomName2=\"C34\" />\n+ <Bond atomName1=\"C33\" atomName2=\"H3X\" />\n+ <Bond atomName1=\"C33\" atomName2=\"H3Y\" />\n+ <Bond atomName1=\"C34\" atomName2=\"C35\" />\n+ <Bond atomName1=\"C34\" atomName2=\"H4X\" />\n+ <Bond atomName1=\"C34\" atomName2=\"H4Y\" />\n+ <Bond atomName1=\"C35\" atomName2=\"C36\" />\n+ <Bond atomName1=\"C35\" atomName2=\"H5X\" />\n+ <Bond atomName1=\"C36\" atomName2=\"C37\" />\n+ <Bond atomName1=\"C36\" atomName2=\"H6X\" />\n+ <Bond atomName1=\"C37\" atomName2=\"C38\" />\n+ <Bond atomName1=\"C37\" atomName2=\"H7X\" />\n+ <Bond atomName1=\"C37\" atomName2=\"H7Y\" />\n+ <Bond atomName1=\"C38\" atomName2=\"C39\" />\n+ <Bond atomName1=\"C38\" atomName2=\"H8X\" />\n+ <Bond atomName1=\"C39\" atomName2=\"C310\" />\n+ <Bond atomName1=\"C39\" atomName2=\"H9X\" />\n+ <Bond atomName1=\"C310\" atomName2=\"C311\" />\n+ <Bond atomName1=\"C310\" atomName2=\"H10X\" />\n+ <Bond atomName1=\"C310\" atomName2=\"H10Y\" />\n+ <Bond atomName1=\"C311\" atomName2=\"C312\" />\n+ <Bond atomName1=\"C311\" atomName2=\"H11X\" />\n+ <Bond atomName1=\"C312\" atomName2=\"C313\" />\n+ <Bond atomName1=\"C312\" atomName2=\"H12X\" />\n+ <Bond atomName1=\"C313\" atomName2=\"C314\" />\n+ <Bond atomName1=\"C313\" atomName2=\"H13X\" />\n+ <Bond atomName1=\"C313\" atomName2=\"H13Y\" />\n+ <Bond atomName1=\"C314\" atomName2=\"C315\" />\n+ <Bond atomName1=\"C314\" atomName2=\"H14X\" />\n+ <Bond atomName1=\"C315\" atomName2=\"C316\" />\n+ <Bond atomName1=\"C315\" atomName2=\"H15X\" />\n+ <Bond atomName1=\"C316\" atomName2=\"C317\" />\n+ <Bond atomName1=\"C316\" atomName2=\"H16X\" />\n+ <Bond atomName1=\"C316\" atomName2=\"H16Y\" />\n+ <Bond atomName1=\"C317\" atomName2=\"C318\" />\n+ <Bond atomName1=\"C317\" atomName2=\"H17X\" />\n+ <Bond atomName1=\"C317\" atomName2=\"H17Y\" />\n+ <Bond atomName1=\"C318\" atomName2=\"C319\" />\n+ <Bond atomName1=\"C318\" atomName2=\"H18X\" />\n+ <Bond atomName1=\"C318\" atomName2=\"H18Y\" />\n+ <Bond atomName1=\"C319\" atomName2=\"C320\" />\n+ <Bond atomName1=\"C319\" atomName2=\"H19X\" />\n+ <Bond atomName1=\"C319\" atomName2=\"H19Y\" />\n+ <Bond atomName1=\"C320\" atomName2=\"H20Z\" />\n+ <Bond atomName1=\"C320\" atomName2=\"H20X\" />\n+ <Bond atomName1=\"C320\" atomName2=\"H20Y\" />\n+ </Residue>\n+ <Residue name=\"SDPS\">\n+ <Atom charge=\"-0.414327\" name=\"N\" type=\"nA\" />\n+ <Atom charge=\"0.353866\" name=\"HN1\" type=\"hN\" />\n+ <Atom charge=\"0.353866\" name=\"HN2\" type=\"hN\" />\n+ <Atom charge=\"0.353866\" name=\"HN3\" type=\"hN\" />\n+ <Atom charge=\"0.039448\" name=\"C12\" type=\"cA\" />\n+ <Atom charge=\"0.090549\" name=\"H12A\" type=\"hX\" />\n+ <Atom charge=\"0.809867\" name=\"C13\" type=\"cC\" />\n+ <Atom charge=\"-0.815178\" name=\"O13A\" type=\"oO\" />\n+ <Atom charge=\"-0.815178\" name=\"O13B\" type=\"oO\" />\n+ <Atom charge=\"0.060375\" name=\"C11\" type=\"cA\" />\n+ <Atom charge=\"0.093484\" name=\"H11A\" type=\"hE\" />\n+ <Atom charge=\"0.093484\" name=\"H11B\" type=\"hE\" />\n+ <Atom charge=\"1.380208\" name=\"P\" type=\"pA\" />\n+ <Atom charge=\"-0.877922\" name=\"O13\" type=\"oP\" />\n+ <Atom charge=\"-0.877922\" name=\"O14\" type=\"oP\" />\n+ <Atom charge=\"-0.520128\" name=\"O12\" type=\"oT\" />\n+ <Atom charge=\"-0.556992\" name=\"O11\" type=\"oT\" />\n+ <Atom charge=\"0.012366\" name=\"C1\" type=\"cA\" />\n+ <Atom charge=\"0.097347\" name=\"HA\" type=\"hE\" />\n+ <Atom charge=\"0.097347\" name=\"HB\" type=\"hE\" />\n+ <Atom charge=\"0.44065\" name=\"C2\" type=\"cA\" />\n+ <Atom charge=\"0.002473\" name=\"HS\" type=\"hE\" />\n+ <Atom charge=\"-0.634381\" name=\"O21\" type=\"oS\" />\n+ <Atom charge=\"0.891897\" name=\"C21\" type=\"cC\" />\n+ <Atom charge=\"-0.650291\" name=\"O22\" type=\"oC\" />\n+ <Atom charge=\"-0.142937\" name=\"C22\" type=\"cD\" />\n+ <Atom charge=\"0.037544\" name=\"H2R\" type=\"hL\" />\n+ <Atom charge=\"0.037544\" name=\"H2S\" type=\"hL\" />\n+ <Atom charge=\"0.271173\" name=\"C3\" type=\"cA\" />\n+ <Atom charge=\"0.037454\" name=\"HX\" type=\"hE\" />\n+ <Atom charge=\"0.037454\" name=\"HY\" type=\"hE\" />\n+ <Atom charge=\"-0.579073\" name=\"O31\" type=\"oS\" />\n+ <Atom charge=\"0.887549\" name=\"C31\" type=\"cC\" />\n+ <Atom charge=\"-0.663331\" name=\"O32\" type=\"oC\" />\n+ <Atom charge=\"-0.11702\" name=\"C32\" type=\"cD\" />\n+ <Atom charge=\"0.051807\" name=\"H2X\" type=\"hL\" />\n+ <Atom charge=\"0.051807\" name=\"H2Y\" type=\"hL\" />\n+ <Atom charge=\"0.120999\" name=\"C23\" type=\"cD\" />\n+ <Atom charge=\"0.026097\" name=\"H3R\" type=\"hL\" />\n+ <Atom charge=\"0.026097\" name=\"H3S\" type=\"hL\" />\n+ <Atom charge=\"-0.287059\" name=\"C24\" type=\"cB\" />\n+ <Atom charge=\"0.154038\" name=\"H4R\" type=\"hB\" />\n+ <Atom charge=\"-0.214845\" name=\"C25\" type=\"cB\" />\n+ <Atom charge=\"0.132504\" name=\"H5R\" type=\"hB\" />\n+ <Atom charge=\"0.060337\" name=\"C26\" type=\"cD\" />\n+ <Atom charge=\"0.063515\" name=\"H6R\" type=\"hL\" />\n+ <Atom charge=\"0.063515\" name=\"H6S\" type=\"hL\" />\n+ <Atom charge=\"-0.220895\" name=\"C27\" type=\"cB\" />\n+ <Atom charge=\"0.139863\" name=\"H7R\" type=\"hB\" />\n+ <Atom charge=\"-0.226254\" name=\"C28\" type=\"cB\" />\n+ <Atom charge=\"0.128147\" name=\"H8R\" type=\"hB\" />\n+ <Atom charge=\"0.089043\" name=\"C29\" type=\"cD\" />\n+ <Atom charge=\"0.054255\" name=\"H9R\" type=\"hL\" />\n+ <Atom charge=\"0.054255\" name=\"H9S\" type=\"hL\" />\n+ <Atom charge=\"-0.221433\" name=\"C210\" type=\"cB\" />\n+ <Atom charge=\"0.133628\" name=\"H10R\" type=\"hB\" />\n+ <Atom charge=\"-0.241205\" name=\"C211\" type=\"cB\" />\n+ <Atom charge=\"0.136308\" name=\"H11R\" type=\"hB\" />\n+ <Atom charge=\"0.085245\" name=\"C212\" type=\"cD\" />\n+ <Atom charge=\"0.053422\" name=\"H12R\" type=\"hL\" />\n+ <Atom charge=\"0.053422\" name=\"H12S\" type=\"hL\" />\n+ <Atom charge=\"-0.218668\" name=\"C213\" type=\"cB\" />\n+ <Atom charge=\"0.131575\" name=\"H13R\" type=\"hB\" />\n+ <Atom charge=\"-0.240419\" name=\"C214\" type=\"cB\" />\n+ <Atom charge=\"0.138337\" name=\"H14R\" type=\"hB\" />\n+ <Atom charge=\"0.069215\" name=\"C215\" type=\"cD\" />\n+ <Atom charge=\"0.058341\" name=\"H15R\" type=\"hL\" />\n+ <Atom charge=\"0.058341\" name=\"H15S\" type=\"hL\" />\n+ <Atom charge=\"-0.233897\" name=\"C216\" type=\"cB\" />\n+ <Atom charge=\"0.133812\" name=\"H16R\" type=\"hB\" />\n+ <Atom charge=\"-0.216499\" name=\"C217\" type=\"cB\" />\n+ <Atom charge=\"0.132121\" name=\"H17R\" type=\"hB\" />\n+ <Atom charge=\"0.092718\" name=\"C218\" type=\"cD\" />\n+ <Atom charge=\"0.053227\" name=\"H18R\" type=\"hL\" />\n+ <Atom charge=\"0.053227\" name=\"H18S\" type=\"hL\" />\n+ <Atom charge=\"-0.246833\" name=\"C219\" type=\"cB\" />\n+ <Atom charge=\"0.136323\" name=\"H19R\" type=\"hB\" />\n+ <Atom charge=\"-0.240216\" name=\"C220\" type=\"cB\" />\n+ <Atom charge=\"0.133048\" name=\"H20R\" type=\"hB\" />\n+ <Atom charge=\"0.122022\" name=\"C221\" type=\"cD\" />\n+ <Atom charge=\"0.010042\" name=\"H21R\" type=\"hL\" />\n+ <Atom charge=\"0.010042\" name=\"H21S\" type=\"hL\" />\n+ <Atom charge=\"-0.108913\" name=\"C222\" type=\"cD\" />\n+ <Atom charge=\"0.025968\" name=\"H22R\" type=\"hL\" />\n+ <Atom charge=\"0.025968\" name=\"H22S\" type=\"hL\" />\n+ <Atom charge=\"0.025968\" name=\"H22T\" type=\"hL\" />\n+ <Atom charge=\"-0.000128\" name=\"C33\" type=\"cD\" />\n+ <Atom charge=\"0.013886\" name=\"H3X\" type=\"hL\" />\n+ <Atom charge=\"0.013886\" name=\"H3Y\" type=\"hL\" />\n+ <Atom charge=\"-0.059792\" name=\"C34\" type=\"cD\" />\n+ <Atom charge=\"0.024241\" name=\"H4X\" type=\"hL\" />\n+ <Atom charge=\"0.024241\" name=\"H4Y\" type=\"hL\" />\n+ <Atom charge=\"-0.013443\" name=\"C35\" type=\"cD\" />\n+ <Atom charge=\"0.008191\" name=\"H5X\" type=\"hL\" />\n+ <Atom charge=\"0.008191\" name=\"H5Y\" type=\"hL\" />\n+ <Atom charge=\"-0.037627\" name=\"C36\" type=\"cD\" />\n+ <Atom charge=\"0.01774\" name=\"H6X\" type=\"hL\" />\n+ <Atom charge=\"0.01774\" name=\"H6Y\" type=\"hL\" />\n+ <Atom charge=\"-0.019469\" name=\"C37\" type=\"cD\" />\n+ <Atom charge=\"0.009292\" name=\"H7X\" type=\"hL\" />\n+ <Atom charge=\"0.009292\" name=\"H7Y\" type=\"hL\" />\n+ <Atom charge=\"-0.014623\" name=\"C38\" type=\"cD\" />\n+ <Atom charge=\"0.007326\" name=\"H8X\" type=\"hL\" />\n+ <Atom charge=\"0.007326\" name=\"H8Y\" type=\"hL\" />\n+ <Atom charge=\"-0.017997\" name=\"C39\" type=\"cD\" />\n+ <Atom charge=\"0.009595\" name=\"H9X\" type=\"hL\" />\n+ <Atom charge=\"0.009595\" name=\"H9Y\" type=\"hL\" />\n+ <Atom charge=\"-0.026418\" name=\"C310\" type=\"cD\" />\n+ <Atom charge=\"0.010825\" name=\"H10X\" type=\"hL\" />\n+ <Atom charge=\"0.010825\" name=\"H10Y\" type=\"hL\" />\n+ <Atom charge=\"-0.017093\" name=\"C311\" type=\"cD\" />\n+ <Atom charge=\"0.010206\" name=\"H11X\" type=\"hL\" />\n+ <Atom charge=\"0.010206\" name=\"H11Y\" type=\"hL\" />\n+ <Atom charge=\"-0.019153\" name=\"C312\" type=\"cD\" />\n+ <Atom charge=\"0.008198\" name=\"H12X\" type=\"hL\" />\n+ <Atom charge=\"0.008198\" name=\"H12Y\" type=\"hL\" />\n+ <Atom charge=\"-0.01159\" name=\"C313\" type=\"cD\" />\n+ <Atom charge=\"0.006022\" name=\"H13X\" type=\"hL\" />\n+ <Atom charge=\"0.006022\" name=\"H13Y\" type=\"hL\" />\n+ <Atom charge=\"-0.013489\" name=\"C314\" type=\"cD\" />\n+ <Atom charge=\"0.010073\" name=\"H14X\" type=\"hL\" />\n+ <Atom charge=\"0.010073\" name=\"H14Y\" type=\"hL\" />\n+ <Atom charge=\"-0.032444\" name=\"C315\" type=\"cD\" />\n+ <Atom charge=\"0.010253\" name=\"H15X\" type=\"hL\" />\n+ <Atom charge=\"0.010253\" name=\"H15Y\" type=\"hL\" />\n+ <Atom charge=\"-0.027654\" name=\"C316\" type=\"cD\" />\n+ <Atom charge=\"0.015627\" name=\"H16X\" type=\"hL\" />\n+ <Atom charge=\"0.015627\" name=\"H16Y\" type=\"hL\" />\n+ <Atom charge=\"0.020665\" name=\"C317\" type=\"cD\" />\n+ <Atom charge=\"0.008483\" name=\"H17X\" type=\"hL\" />\n+ <Atom charge=\"0.008483\" name=\"H17Y\" type=\"hL\" />\n+ <Atom charge=\"-0.120069\" name=\"C318\" type=\"cD\" />\n+ <Atom charge=\"0.027938\" name=\"H18X\" type=\"hL\" />\n+ <Atom charge=\"0.027938\" name=\"H18Y\" type=\"hL\" />\n+ <Atom charge=\"0.027938\" name=\"H18Z\" type=\"hL\" />\n+ <Bond atomName1=\"N\" atomName2=\"HN1\" />\n+ <Bond atomName1=\"N\" atomName2=\"HN2\" />\n+ <Bond atomName1=\"N\" atomName2=\"HN3\" />\n+ <Bond atomName1=\"N\" atomName2=\"C12\" />\n+ <Bond atomName1=\"O13B\" atomName2=\"C13\" />\n+ <Bond atomName1=\"C13\" atomName2=\"C12\" />\n+ <Bond atomName1=\"C13\" atomName2=\"O13A\" />\n+ <Bond atomName1=\"C12\" atomName2=\"H12A\" />\n+ <Bond atomName1=\"C12\" atomName2=\"C11\" />\n+ <Bond atomName1=\"C1\" atomName2=\"O11\" />\n+ <Bond atomName1=\"C11\" atomName2=\"H11A\" />\n+ <Bond atomName1=\"C11\" atomName2=\"H11B\" />\n+ <Bond atomName1=\"C11\" atomName2=\"O12\" />\n+ <Bond atomName1=\"O12\" atomName2=\"P\" />\n+ <Bond atomName1=\"P\" atomName2=\"O11\" />\n+ <Bond atomName1=\"P\" atomName2=\"O13\" />\n+ <Bond atomName1=\"P\" atomName2=\"O14\" />\n+ <Bond atomName1=\"C1\" atomName2=\"HA\" />\n+ <Bond atomName1=\"C1\" atomName2=\"HB\" />\n+ <Bond atomName1=\"C1\" atomName2=\"C2\" />\n+ <Bond atomName1=\"C2\" atomName2=\"HS\" />\n+ <Bond atomName1=\"C2\" atomName2=\"C3\" />\n+ <Bond atomName1=\"C2\" atomName2=\"O21\" />\n+ <Bond atomName1=\"C3\" atomName2=\"HX\" />\n+ <Bond atomName1=\"C3\" atomName2=\"HY\" />\n+ <Bond atomName1=\"C3\" atomName2=\"O31\" />\n+ <Bond atomName1=\"O21\" atomName2=\"C21\" />\n+ <Bond atomName1=\"C21\" atomName2=\"C22\" />\n+ <Bond atomName1=\"C21\" atomName2=\"O22\" />\n+ <Bond atomName1=\"C22\" atomName2=\"H2R\" />\n+ <Bond atomName1=\"C22\" atomName2=\"H2S\" />\n+ <Bond atomName1=\"C22\" atomName2=\"C23\" />\n+ <Bond atomName1=\"C23\" atomName2=\"H3R\" />\n+ <Bond atomName1=\"C23\" atomName2=\"H3S\" />\n+ <Bond atomName1=\"C23\" atomName2=\"C24\" />\n+ <Bond atomName1=\"C24\" atomName2=\"H4R\" />\n+ <Bond atomName1=\"C24\" atomName2=\"C25\" />\n+ <Bond atomName1=\"C25\" atomName2=\"H5R\" />\n+ <Bond atomName1=\"C25\" atomName2=\"C26\" />\n+ <Bond atomName1=\"C26\" atomName2=\"H6R\" />\n+ <Bond atomName1=\"C26\" atomName2=\"H6S\" />\n+ <Bond atomName1=\"C26\" atomName2=\"C27\" />\n+ <Bond atomName1=\"C27\" atomName2=\"H7R\" />\n+ <Bond atomName1=\"C27\" atomName2=\"C28\" />\n+ <Bond atomName1=\"C28\" atomName2=\"H8R\" />\n+ <Bond atomName1=\"C28\" atomName2=\"C29\" />\n+ <Bond atomName1=\"C29\" atomName2=\"H9R\" />\n+ <Bond atomName1=\"C29\" atomName2=\"H9S\" />\n+ <Bond atomName1=\"C29\" atomName2=\"C210\" />\n+ <Bond atomName1=\"C210\" atomName2=\"H10R\" />\n+ <Bond atomName1=\"C210\" atomName2=\"C211\" />\n+ <Bond atomName1=\"C211\" atomName2=\"H11R\" />\n+ <Bond atomName1=\"C211\" atomName2=\"C212\" />\n+ <Bond atomName1=\"C212\" atomName2=\"H12R\" />\n+ <Bond atomName1=\"C212\" atomName2=\"H12S\" />\n+ <Bond atomName1=\"C212\" atomName2=\"C213\" />\n+ <Bond atomName1=\"C213\" atomName2=\"H13R\" />\n+ <Bond atomName1=\"C213\" atomName2=\"C214\" />\n+ <Bond atomName1=\"C214\" atomName2=\"H14R\" />\n+ <Bond atomName1=\"C214\" atomName2=\"C215\" />\n+ <Bond atomName1=\"C215\" atomName2=\"H15R\" />\n+ <Bond atomName1=\"C215\" atomName2=\"H15S\" />\n+ <Bond atomName1=\"C215\" atomName2=\"C216\" />\n+ <Bond atomName1=\"C216\" atomName2=\"H16R\" />\n+ <Bond atomName1=\"C216\" atomName2=\"C217\" />\n+ <Bond atomName1=\"C217\" atomName2=\"H17R\" />\n+ <Bond atomName1=\"C217\" atomName2=\"C218\" />\n+ <Bond atomName1=\"C218\" atomName2=\"H18R\" />\n+ <Bond atomName1=\"C218\" atomName2=\"H18S\" />\n+ <Bond atomName1=\"C218\" atomName2=\"C219\" />\n+ <Bond atomName1=\"C219\" atomName2=\"H19R\" />\n+ <Bond atomName1=\"C219\" atomName2=\"C220\" />\n+ <Bond atomName1=\"C220\" atomName2=\"H20R\" />\n+ <Bond atomName1=\"C220\" atomName2=\"C221\" />\n+ <Bond atomName1=\"C221\" atomName2=\"H21R\" />\n+ <Bond atomName1=\"C221\" atomName2=\"H21S\" />\n+ <Bond atomName1=\"C221\" atomName2=\"C222\" />\n+ <Bond atomName1=\"C222\" atomName2=\"H22R\" />\n+ <Bond atomName1=\"C222\" atomName2=\"H22S\" />\n+ <Bond atomName1=\"C222\" atomName2=\"H22T\" />\n+ <Bond atomName1=\"O31\" atomName2=\"C31\" />\n+ <Bond atomName1=\"C31\" atomName2=\"C32\" />\n+ <Bond atomName1=\"C31\" atomName2=\"O32\" />\n+ <Bond atomName1=\"C32\" atomName2=\"H2X\" />\n+ <Bond atomName1=\"C32\" atomName2=\"H2Y\" />\n+ <Bond atomName1=\"C32\" atomName2=\"C33\" />\n+ <Bond atomName1=\"C33\" atomName2=\"H3X\" />\n+ <Bond atomName1=\"C33\" atomName2=\"H3Y\" />\n+ <Bond atomName1=\"C33\" atomName2=\"C34\" />\n+ <Bond atomName1=\"C34\" atomName2=\"H4X\" />\n+ <Bond atomName1=\"C34\" atomName2=\"H4Y\" />\n+ <Bond atomName1=\"C34\" atomName2=\"C35\" />\n+ <Bond atomName1=\"C35\" atomName2=\"H5X\" />\n+ <Bond atomName1=\"C35\" atomName2=\"H5Y\" />\n+ <Bond atomName1=\"C35\" atomName2=\"C36\" />\n+ <Bond atomName1=\"C36\" atomName2=\"H6X\" />\n+ <Bond atomName1=\"C36\" atomName2=\"H6Y\" />\n+ <Bond atomName1=\"C36\" atomName2=\"C37\" />\n+ <Bond atomName1=\"C37\" atomName2=\"H7X\" />\n+ <Bond atomName1=\"C37\" atomName2=\"H7Y\" />\n+ <Bond atomName1=\"C37\" atomName2=\"C38\" />\n+ <Bond atomName1=\"C38\" atomName2=\"H8X\" />\n+ <Bond atomName1=\"C38\" atomName2=\"H8Y\" />\n+ <Bond atomName1=\"C38\" atomName2=\"C39\" />\n+ <Bond atomName1=\"C39\" atomName2=\"H9X\" />\n+ <Bond atomName1=\"C39\" atomName2=\"H9Y\" />\n+ <Bond atomName1=\"C39\" atomName2=\"C310\" />\n+ <Bond atomName1=\"C310\" atomName2=\"H10X\" />\n+ <Bond atomName1=\"C310\" atomName2=\"H10Y\" />\n+ <Bond atomName1=\"C310\" atomName2=\"C311\" />\n+ <Bond atomName1=\"C311\" atomName2=\"H11X\" />\n+ <Bond atomName1=\"C311\" atomName2=\"H11Y\" />\n+ <Bond atomName1=\"C311\" atomName2=\"C312\" />\n+ <Bond atomName1=\"C312\" atomName2=\"H12X\" />\n+ <Bond atomName1=\"C312\" atomName2=\"H12Y\" />\n+ <Bond atomName1=\"C312\" atomName2=\"C313\" />\n+ <Bond atomName1=\"C313\" atomName2=\"H13X\" />\n+ <Bond atomName1=\"C313\" atomName2=\"H13Y\" />\n+ <Bond atomName1=\"C313\" atomName2=\"C314\" />\n+ <Bond atomName1=\"C314\" atomName2=\"H14X\" />\n+ <Bond atomName1=\"C314\" atomName2=\"H14Y\" />\n+ <Bond atomName1=\"C314\" atomName2=\"C315\" />\n+ <Bond atomName1=\"C315\" atomName2=\"H15X\" />\n+ <Bond atomName1=\"C315\" atomName2=\"H15Y\" />\n+ <Bond atomName1=\"C315\" atomName2=\"C316\" />\n+ <Bond atomName1=\"C316\" atomName2=\"H16X\" />\n+ <Bond atomName1=\"C316\" atomName2=\"H16Y\" />\n+ <Bond atomName1=\"C316\" atomName2=\"C317\" />\n+ <Bond atomName1=\"C317\" atomName2=\"H17X\" />\n+ <Bond atomName1=\"C317\" atomName2=\"H17Y\" />\n+ <Bond atomName1=\"C317\" atomName2=\"C318\" />\n+ <Bond atomName1=\"C318\" atomName2=\"H18X\" />\n+ <Bond atomName1=\"C318\" atomName2=\"H18Y\" />\n+ <Bond atomName1=\"C318\" atomName2=\"H18Z\" />\n+ </Residue>\n+ <Residue name=\"DAPS\">\n+ <Atom charge=\"-0.414327\" name=\"N\" type=\"nA\" />\n+ <Atom charge=\"0.353866\" name=\"HN1\" type=\"hN\" />\n+ <Atom charge=\"0.353866\" name=\"HN2\" type=\"hN\" />\n+ <Atom charge=\"0.353866\" name=\"HN3\" type=\"hN\" />\n+ <Atom charge=\"0.039448\" name=\"C12\" type=\"cA\" />\n+ <Atom charge=\"0.090549\" name=\"H12A\" type=\"hX\" />\n+ <Atom charge=\"0.809867\" name=\"C13\" type=\"cC\" />\n+ <Atom charge=\"-0.815178\" name=\"O13A\" type=\"oO\" />\n+ <Atom charge=\"-0.815178\" name=\"O13B\" type=\"oO\" />\n+ <Atom charge=\"0.060375\" name=\"C11\" type=\"cA\" />\n+ <Atom charge=\"0.093484\" name=\"H11A\" type=\"hE\" />\n+ <Atom charge=\"0.093484\" name=\"H11B\" type=\"hE\" />\n+ <Atom charge=\"1.380208\" name=\"P\" type=\"pA\" />\n+ <Atom charge=\"-0.877922\" name=\"O13\" type=\"oP\" />\n+ <Atom charge=\"-0.877922\" name=\"O14\" type=\"oP\" />\n+ <Atom charge=\"-0.520128\" name=\"O12\" type=\"oT\" />\n+ <Atom charge=\"-0.556992\" name=\"O11\" type=\"oT\" />\n+ <Atom charge=\"0.012366\" name=\"C1\" type=\"cA\" />\n+ <Atom charge=\"0.097347\" name=\"HA\" type=\"hE\" />\n+ <Atom charge=\"0.097347\" name=\"HB\" type=\"hE\" />\n+ <Atom charge=\"0.44065\" name=\"C2\" type=\"cA\" />\n+ <Atom charge=\"0.002473\" name=\"HS\" type=\"hE\" />\n+ <Atom charge=\"-0.634381\" name=\"O21\" type=\"oS\" />\n+ <Atom charge=\"0.891897\" name=\"C21\" type=\"cC\" />\n+ <Atom charge=\"-0.650291\" name=\"O22\" type=\"oC\" />\n+ <Atom charge=\"-0.123935\" name=\"C22\" type=\"cD\" />\n+ <Atom charge=\"0.024535\" name=\"H2R\" type=\"hL\" />\n+ <Atom charge=\"0.024535\" name=\"H2S\" type=\"hL\" />\n+ <Atom charge=\"0.271173\" name=\"C3\" type=\"cA\" />\n+ <Atom charge=\"0.037454\" name=\"HX\" type=\"hE\" />\n+ <Atom charge=\"0.037454\" name=\"HY\" type=\"hE\" />\n+ <Atom charge=\"-0.579073\" name=\"O31\" type=\"oS\" />\n+ <Atom charge=\"0.887549\" name=\"C31\" type=\"cC\" />\n+ <Atom charge=\"-0.663331\" name=\"O32\" type=\"oC\" />\n+ <Atom charge=\"-0.123935\" name=\"C32\" type=\"cD\" />\n+ <Atom charge=\"0.024535\" name=\"H2X\" type=\"hL\" />\n+ <Atom charge=\"0.024535\" name=\"H2Y\" type=\"hL\" />\n+ <Atom charge=\"0.025626\" name=\"C23\" type=\"cD\" />\n+ <Atom charge=\"0.025117\" name=\"H3R\" type=\"hL\" />\n+ <Atom charge=\"0.025117\" name=\"H3S\" type=\"hL\" />\n+ <Atom charge=\"0.031382\" name=\"C24\" type=\"cD\" />\n+ <Atom charge=\"0.038708\" name=\"H4R\" type=\"hL\" />\n+ <Atom charge=\"0.038708\" name=\"H4S\" type=\"hL\" />\n+ <Atom charge=\"-0.26789\" name=\"C25\" type=\"cB\" />\n+ <Atom charge=\"0.143577\" name=\"H5R\" type=\"hB\" />\n+ <Atom charge=\"-0.206786\" name=\"C26\" type=\"cB\" />\n+ <Atom charge=\"0.129858\" name=\"H6R\" type=\"hB\" />\n+ <Atom charge=\"0.055784\" name=\"C27\" type=\"cD\" />\n+ <Atom charge=\"0.062775\" name=\"H7R\" type=\"hL\" />\n+ <Atom charge=\"0.062775\" name=\"H7S\" type=\"hL\" />\n+ <Atom charge=\"-0.228527\" name=\"C28\" type=\"cB\" />\n+ <Atom charge=\"0.134735\" name=\"H8R\" type=\"hB\" />\n+ <Atom charge=\"-0.228694\" name=\"C29\" type=\"cB\" />\n+ <Atom charge=\"0.132167\" name=\"H9R\" type=\"hB\" />\n+ <Atom charge=\"0.095406\" name=\"C210\" type=\"cD\" />\n+ <Atom charge=\"0.05114\" name=\"H10R\" type=\"hL\" />\n+ <Atom charge=\"0.05114\" name=\"H10S\" type=\"hL\" />\n+ <Atom charge=\"-0.228704\" name=\"C211\" type=\"cB\" />\n+ <Atom charge=\"0.131341\" name=\"H11R\" type=\"hB\" />\n+ <Atom charge=\"-0.220164\" name=\"C212\" type=\"cB\" />\n+ <Atom charge=\"0.131986\" name=\"H12R\" type=\"hB\" />\n+ <Atom charge=\"0.058197\" name=\"C213\" type=\"cD\" />\n+ <Atom charge=\"0.06135\" name=\"H13R\" type=\"hL\" />\n+ <Atom charge=\"0.06135\" name=\"H13S\" type=\"hL\" />\n+ <Atom charge=\"-0.224769\" name=\"C214\" type=\"cB\" />\n+ <Atom charge=\"0.129616\" name=\"H14R\" type=\"hB\" />\n+ <Atom charge=\"-0.244149\" name=\"C215\" type=\"cB\" />\n+ <Atom charge=\"0.132793\" name=\"H15R\" type=\"hB\" />\n+ <Atom charge=\"0.0391\" name=\"C216\" type=\"cD\" />\n+ <Atom charge=\"0.028848\" name=\"H16R\" type=\"hL\" />\n+ <Atom charge=\"0.028848\" name=\"H16S\" type=\"hL\" />\n+ <Atom charge=\"-0.028398\" name=\"C217\" type=\"cD\" />\n+ <Atom charge=\"0.019581\" name=\"H17R\" type=\"hL\" />\n+ <Atom charge=\"0.019581\" name=\"H17S\" type=\"hL\" />\n+ <Atom charge=\"-0.019772\" name=\"C218\" type=\"cD\" />\n+ <Atom charge=\"0.014218\" name=\"H18R\" type=\"hL\" />\n+ <Atom charge=\"0.014218\" name=\"H18S\" type=\"hL\" />\n+ <Atom charge=\"0.024957\" name=\"C219\" type=\"cD\" />\n+ <Atom charge=\"0.005426\" name=\"H19R\" type=\"hL\" />\n+ <Atom charge=\"0.005426\" name=\"H19S\" type=\"hL\" />\n+ <Atom charge=\"-0.109302\" name=\"C220\" type=\"cD\" />\n+ <Atom charge=\"0.023723\" name=\"H20R\" type=\"hL\" />\n+ <Atom charge=\"0.023723\" name=\"H20S\" type=\"hL\" />\n+ <Atom charge=\"0.023723\" name=\"H20T\" type=\"hL\" />\n+ <Atom charge=\"0.025626\" name=\"C33\" type=\"cD\" />\n+ <Atom charge=\"0.025117\" name=\"H3X\" type=\"hL\" />\n+ <Atom charge=\"0.025117\" name=\"H3Y\" type=\"hL\" />\n+ <Atom charge=\"0.031382\" name=\"C34\" type=\"cD\" />\n+ <Atom charge=\"0.038708\" name=\"H4X\" type=\"hL\" />\n+ <Atom charge=\"0.038708\" name=\"H4Y\" type=\"hL\" />\n+ <Atom charge=\"-0.26789\" name=\"C35\" type=\"cB\" />\n+ <Atom charge=\"0.143577\" name=\"H5X\" type=\"hB\" />\n+ <Atom charge=\"-0.206786\" name=\"C36\" type=\"cB\" />\n+ <Atom charge=\"0.129858\" name=\"H6X\" type=\"hB\" />\n+ <Atom charge=\"0.055784\" name=\"C37\" type=\"cD\" />\n+ <Atom charge=\"0.062775\" name=\"H7X\" type=\"hL\" />\n+ <Atom charge=\"0.062775\" name=\"H7Y\" type=\"hL\" />\n+ <Atom charge=\"-0.228527\" name=\"C38\" type=\"cB\" />\n+ <Atom charge=\"0.134735\" name=\"H8X\" type=\"hB\" />\n+ <Atom charge=\"-0.228694\" name=\"C39\" type=\"cB\" />\n+ <Atom charge=\"0.132167\" name=\"H9X\" type=\"hB\" />\n+ <Atom charge=\"0.095406\" name=\"C310\" type=\"cD\" />\n+ <Atom charge=\"0.05114\" name=\"H10X\" type=\"hL\" />\n+ <Atom charge=\"0.05114\" name=\"H10Y\" type=\"hL\" />\n+ <Atom charge=\"-0.228704\" name=\"C311\" type=\"cB\" />\n+ <Atom charge=\"0.131341\" name=\"H11X\" type=\"hB\" />\n+ <Atom charge=\"-0.220164\" name=\"C312\" type=\"cB\" />\n+ <Atom charge=\"0.131986\" name=\"H12X\" type=\"hB\" />\n+ <Atom charge=\"0.058197\" name=\"C313\" type=\"cD\" />\n+ <Atom charge=\"0.06135\" name=\"H13X\" type=\"hL\" />\n+ <Atom charge=\"0.06135\" name=\"H13Y\" type=\"hL\" />\n+ <Atom charge=\"-0.224769\" name=\"C314\" type=\"cB\" />\n+ <Atom charge=\"0.129616\" name=\"H14X\" type=\"hB\" />\n+ <Atom charge=\"-0.244149\" name=\"C315\" type=\"cB\" />\n+ <Atom charge=\"0.132793\" name=\"H15X\" type=\"hB\" />\n+ <Atom charge=\"0.0391\" name=\"C316\" type=\"cD\" />\n+ <Atom charge=\"0.028848\" name=\"H16X\" type=\"hL\" />\n+ <Atom charge=\"0.028848\" name=\"H16Y\" type=\"hL\" />\n+ <Atom charge=\"-0.028398\" name=\"C317\" type=\"cD\" />\n+ <Atom charge=\"0.019581\" name=\"H17X\" type=\"hL\" />\n+ <Atom charge=\"0.019581\" name=\"H17Y\" type=\"hL\" />\n+ <Atom charge=\"-0.019772\" name=\"C318\" type=\"cD\" />\n+ <Atom charge=\"0.014218\" name=\"H18X\" type=\"hL\" />\n+ <Atom charge=\"0.014218\" name=\"H18Y\" type=\"hL\" />\n+ <Atom charge=\"0.024957\" name=\"C319\" type=\"cD\" />\n+ <Atom charge=\"0.005426\" name=\"H19X\" type=\"hL\" />\n+ <Atom charge=\"0.005426\" name=\"H19Y\" type=\"hL\" />\n+ <Atom charge=\"-0.109302\" name=\"C320\" type=\"cD\" />\n+ <Atom charge=\"0.023723\" name=\"H20X\" type=\"hL\" />\n+ <Atom charge=\"0.023723\" name=\"H20Y\" type=\"hL\" />\n+ <Atom charge=\"0.023723\" name=\"H20Z\" type=\"hL\" />\n+ <Bond atomName1=\"N\" atomName2=\"HN1\" />\n+ <Bond atomName1=\"N\" atomName2=\"HN2\" />\n+ <Bond atomName1=\"N\" atomName2=\"HN3\" />\n+ <Bond atomName1=\"N\" atomName2=\"C12\" />\n+ <Bond atomName1=\"O13B\" atomName2=\"C13\" />\n+ <Bond atomName1=\"C13\" atomName2=\"C12\" />\n+ <Bond atomName1=\"C13\" atomName2=\"O13A\" />\n+ <Bond atomName1=\"C12\" atomName2=\"H12A\" />\n+ <Bond atomName1=\"C12\" atomName2=\"C11\" />\n+ <Bond atomName1=\"C1\" atomName2=\"O11\" />\n+ <Bond atomName1=\"C11\" atomName2=\"H11A\" />\n+ <Bond atomName1=\"C11\" atomName2=\"H11B\" />\n+ <Bond atomName1=\"C11\" atomName2=\"O12\" />\n+ <Bond atomName1=\"O12\" atomName2=\"P\" />\n+ <Bond atomName1=\"P\" atomName2=\"O11\" />\n+ <Bond atomName1=\"P\" atomName2=\"O13\" />\n+ <Bond atomName1=\"P\" atomName2=\"O14\" />\n+ <Bond atomName1=\"C1\" atomName2=\"HA\" />\n+ <Bond atomName1=\"C1\" atomName2=\"HB\" />\n+ <Bond atomName1=\"C1\" atomName2=\"C2\" />\n+ <Bond atomName1=\"C2\" atomName2=\"HS\" />\n+ <Bond atomName1=\"C2\" atomName2=\"C3\" />\n+ <Bond atomName1=\"C2\" atomName2=\"O21\" />\n+ <Bond atomName1=\"C3\" atomName2=\"HX\" />\n+ <Bond atomName1=\"C3\" atomName2=\"HY\" />\n+ <Bond atomName1=\"C3\" atomName2=\"O31\" />\n+ <Bond atomName1=\"C21\" atomName2=\"O21\" />\n+ <Bond atomName1=\"C21\" atomName2=\"C22\" />\n+ <Bond atomName1=\"C21\" atomName2=\"O22\" />\n+ <Bond atomName1=\"C22\" atomName2=\"C23\" />\n+ <Bond atomName1=\"C22\" atomName2=\"H2R\" />\n+ <Bond atomName1=\"C22\" atomName2=\"H2S\" />\n+ <Bond atomName1=\"C23\" atomName2=\"C24\" />\n+ <Bond atomName1=\"C23\" atomName2=\"H3R\" />\n+ <Bond atomName1=\"C23\" atomName2=\"H3S\" />\n+ <Bond atomName1=\"C24\" atomName2=\"C25\" />\n+ <Bond atomName1=\"C24\" atomName2=\"H4R\" />\n+ <Bond atomName1=\"C24\" atomName2=\"H4S\" />\n+ <Bond atomName1=\"C25\" atomName2=\"C26\" />\n+ <Bond atomName1=\"C25\" atomName2=\"H5R\" />\n+ <Bond atomName1=\"C26\" atomName2=\"C27\" />\n+ <Bond atomName1=\"C26\" atomName2=\"H6R\" />\n+ <Bond atomName1=\"C27\" atomName2=\"C28\" />\n+ <Bond atomName1=\"C27\" atomName2=\"H7R\" />\n+ <Bond atomName1=\"C27\" atomName2=\"H7S\" />\n+ <Bond atomName1=\"C28\" atomName2=\"C29\" />\n+ <Bond atomName1=\"C28\" atomName2=\"H8R\" />\n+ <Bond atomName1=\"C29\" atomName2=\"C210\" />\n+ <Bond atomName1=\"C29\" atomName2=\"H9R\" />\n+ <Bond atomName1=\"C210\" atomName2=\"C211\" />\n+ <Bond atomName1=\"C210\" atomName2=\"H10R\" />\n+ <Bond atomName1=\"C210\" atomName2=\"H10S\" />\n+ <Bond atomName1=\"C211\" atomName2=\"C212\" />\n+ <Bond atomName1=\"C211\" atomName2=\"H11R\" />\n+ <Bond atomName1=\"C212\" atomName2=\"C213\" />\n+ <Bond atomName1=\"C212\" atomName2=\"H12R\" />\n+ <Bond atomName1=\"C213\" atomName2=\"C214\" />\n+ <Bond atomName1=\"C213\" atomName2=\"H13R\" />\n+ <Bond atomName1=\"C213\" atomName2=\"H13S\" />\n+ <Bond atomName1=\"C214\" atomName2=\"C215\" />\n+ <Bond atomName1=\"C214\" atomName2=\"H14R\" />\n+ <Bond atomName1=\"C215\" atomName2=\"C216\" />\n+ <Bond atomName1=\"C215\" atomName2=\"H15R\" />\n+ <Bond atomName1=\"C216\" atomName2=\"C217\" />\n+ <Bond atomName1=\"C216\" atomName2=\"H16R\" />\n+ <Bond atomName1=\"C216\" atomName2=\"H16S\" />\n+ <Bond atomName1=\"C217\" atomName2=\"C218\" />\n+ <Bond atomName1=\"C217\" atomName2=\"H17R\" />\n+ <Bond atomName1=\"C217\" atomName2=\"H17S\" />\n+ <Bond atomName1=\"C218\" atomName2=\"C219\" />\n+ <Bond atomName1=\"C218\" atomName2=\"H18R\" />\n+ <Bond atomName1=\"C218\" atomName2=\"H18S\" />\n+ <Bond atomName1=\"C219\" atomName2=\"C220\" />\n+ <Bond atomName1=\"C219\" atomName2=\"H19R\" />\n+ <Bond atomName1=\"C219\" atomName2=\"H19S\" />\n+ <Bond atomName1=\"C220\" atomName2=\"H20T\" />\n+ <Bond atomName1=\"C220\" atomName2=\"H20R\" />\n+ <Bond atomName1=\"C220\" atomName2=\"H20S\" />\n+ <Bond atomName1=\"C31\" atomName2=\"O31\" />\n+ <Bond atomName1=\"C31\" atomName2=\"C32\" />\n+ <Bond atomName1=\"C31\" atomName2=\"O32\" />\n+ <Bond atomName1=\"C32\" atomName2=\"C33\" />\n+ <Bond atomName1=\"C32\" atomName2=\"H2X\" />\n+ <Bond atomName1=\"C32\" atomName2=\"H2Y\" />\n+ <Bond atomName1=\"C33\" atomName2=\"C34\" />\n+ <Bond atomName1=\"C33\" atomName2=\"H3X\" />\n+ <Bond atomName1=\"C33\" atomName2=\"H3Y\" />\n+ <Bond atomName1=\"C34\" atomName2=\"C35\" />\n+ <Bond atomName1=\"C34\" atomName2=\"H4X\" />\n+ <Bond atomName1=\"C34\" atomName2=\"H4Y\" />\n+ <Bond atomName1=\"C35\" atomName2=\"C36\" />\n+ <Bond atomName1=\"C35\" atomName2=\"H5X\" />\n+ <Bond atomName1=\"C36\" atomName2=\"C37\" />\n+ <Bond atomName1=\"C36\" atomName2=\"H6X\" />\n+ <Bond atomName1=\"C37\" atomName2=\"C38\" />\n+ <Bond atomName1=\"C37\" atomName2=\"H7X\" />\n+ <Bond atomName1=\"C37\" atomName2=\"H7Y\" />\n+ <Bond atomName1=\"C38\" atomName2=\"C39\" />\n+ <Bond atomName1=\"C38\" atomName2=\"H8X\" />\n+ <Bond atomName1=\"C39\" atomName2=\"C310\" />\n+ <Bond atomName1=\"C39\" atomName2=\"H9X\" />\n+ <Bond atomName1=\"C310\" atomName2=\"C311\" />\n+ <Bond atomName1=\"C310\" atomName2=\"H10X\" />\n+ <Bond atomName1=\"C310\" atomName2=\"H10Y\" />\n+ <Bond atomName1=\"C311\" atomName2=\"C312\" />\n+ <Bond atomName1=\"C311\" atomName2=\"H11X\" />\n+ <Bond atomName1=\"C312\" atomName2=\"C313\" />\n+ <Bond atomName1=\"C312\" atomName2=\"H12X\" />\n+ <Bond atomName1=\"C313\" atomName2=\"C314\" />\n+ <Bond atomName1=\"C313\" atomName2=\"H13X\" />\n+ <Bond atomName1=\"C313\" atomName2=\"H13Y\" />\n+ <Bond atomName1=\"C314\" atomName2=\"C315\" />\n+ <Bond atomName1=\"C314\" atomName2=\"H14X\" />\n+ <Bond atomName1=\"C315\" atomName2=\"C316\" />\n+ <Bond atomName1=\"C315\" atomName2=\"H15X\" />\n+ <Bond atomName1=\"C316\" atomName2=\"C317\" />\n+ <Bond atomName1=\"C316\" atomName2=\"H16X\" />\n+ <Bond atomName1=\"C316\" atomName2=\"H16Y\" />\n+ <Bond atomName1=\"C317\" atomName2=\"C318\" />\n+ <Bond atomName1=\"C317\" atomName2=\"H17X\" />\n+ <Bond atomName1=\"C317\" atomName2=\"H17Y\" />\n+ <Bond atomName1=\"C318\" atomName2=\"C319\" />\n+ <Bond atomName1=\"C318\" atomName2=\"H18X\" />\n+ <Bond atomName1=\"C318\" atomName2=\"H18Y\" />\n+ <Bond atomName1=\"C319\" atomName2=\"C320\" />\n+ <Bond atomName1=\"C319\" atomName2=\"H19X\" />\n+ <Bond atomName1=\"C319\" atomName2=\"H19Y\" />\n+ <Bond atomName1=\"C320\" atomName2=\"H20Z\" />\n+ <Bond atomName1=\"C320\" atomName2=\"H20X\" />\n+ <Bond atomName1=\"C320\" atomName2=\"H20Y\" />\n+ </Residue>\n+ <Residue name=\"SDPA\">\n+ <Atom charge=\"1.456663\" name=\"P\" type=\"pA\" />\n+ <Atom charge=\"-0.914158\" name=\"O13\" type=\"oP\" />\n+ <Atom charge=\"-0.914158\" name=\"O14\" type=\"oP\" />\n+ <Atom charge=\"-0.706197\" name=\"O12\" type=\"oH\" />\n+ <Atom charge=\"0.415628\" name=\"H12\" type=\"hO\" />\n+ <Atom charge=\"-0.594197\" name=\"O11\" type=\"oT\" />\n+ <Atom charge=\"0.081528\" name=\"C1\" type=\"cA\" />\n+ <Atom charge=\"0.083099\" name=\"HA\" type=\"hE\" />\n+ <Atom charge=\"0.083099\" name=\"HB\" type=\"hE\" />\n+ <Atom charge=\"0.283546\" name=\"C2\" type=\"cA\" />\n+ <Atom charge=\"0.063862\" name=\"HS\" type=\"hE\" />\n+ <Atom charge=\"-0.554487\" name=\"O21\" type=\"oS\" />\n+ <Atom charge=\"0.897502\" name=\"C21\" type=\"cC\" />\n+ <Atom charge=\"-0.671622\" name=\"O22\" type=\"oC\" />\n+ <Atom charge=\"-0.142937\" name=\"C22\" type=\"cD\" />\n+ <Atom charge=\"0.037544\" name=\"H2R\" type=\"hL\" />\n+ <Atom charge=\"0.037544\" name=\"H2S\" type=\"hL\" />\n+ <Atom charge=\"0.185299\" name=\"C3\" type=\"cA\" />\n+ <Atom charge=\"0.067676\" name=\"HX\" type=\"hE\" />\n+ <Atom charge=\"0.067676\" name=\"HY\" type=\"hE\" />\n+ <Atom charge=\"-0.547824\" name=\"O31\" type=\"oS\" />\n+ <Atom charge=\"0.888207\" name=\"C31\" type=\"cC\" />\n+ <Atom charge=\"-0.671142\" name=\"O32\" type=\"oC\" />\n+ <Atom charge=\"-0.11702\" name=\"C32\" type=\"cD\" />\n+ <Atom charge=\"0.051807\" name=\"H2X\" type=\"hL\" />\n+ <Atom charge=\"0.051807\" name=\"H2Y\" type=\"hL\" />\n+ <Atom charge=\"0.120999\" name=\"C23\" type=\"cD\" />\n+ <Atom charge=\"0.026097\" name=\"H3R\" type=\"hL\" />\n+ <Atom charge=\"0.026097\" name=\"H3S\" type=\"hL\" />\n+ <Atom charge=\"-0.287059\" name=\"C24\" type=\"cB\" />\n+ <Atom charge=\"0.154038\" name=\"H4R\" type=\"hB\" />\n+ <Atom charge=\"-0.214845\" name=\"C25\" type=\"cB\" />\n+ <Atom charge=\"0.132504\" name=\"H5R\" type=\"hB\" />\n+ <Atom charge=\"0.060337\" name=\"C26\" type=\"cD\" />\n+ <Atom charge=\"0.063515\" name=\"H6R\" type=\"hL\" />\n+ <Atom charge=\"0.063515\" name=\"H6S\" type=\"hL\" />\n+ <Atom charge=\"-0.220895\" name=\"C27\" type=\"cB\" />\n+ <Atom charge=\"0.139863\" name=\"H7R\" type=\"hB\" />\n+ <Atom charge=\"-0.226254\" name=\"C28\" type=\"cB\" />\n+ <Atom charge=\"0.128147\" name=\"H8R\" type=\"hB\" />\n+ <Atom charge=\"0.089043\" name=\"C29\" type=\"cD\" />\n+ <Atom charge=\"0.054255\" name=\"H9R\" type=\"hL\" />\n+ <Atom charge=\"0.054255\" name=\"H9S\" type=\"hL\" />\n+ <Atom charge=\"-0.221433\" name=\"C210\" type=\"cB\" />\n+ <Atom charge=\"0.133628\" name=\"H10R\" type=\"hB\" />\n+ <Atom charge=\"-0.241205\" name=\"C211\" type=\"cB\" />\n+ <Atom charge=\"0.136308\" name=\"H11R\" type=\"hB\" />\n+ <Atom charge=\"0.085245\" name=\"C212\" type=\"cD\" />\n+ <Atom charge=\"0.053422\" name=\"H12R\" type=\"hL\" />\n+ <Atom charge=\"0.053422\" name=\"H12S\" type=\"hL\" />\n+ <Atom charge=\"-0.218668\" name=\"C213\" type=\"cB\" />\n+ <Atom charge=\"0.131575\" name=\"H13R\" type=\"hB\" />\n+ <Atom charge=\"-0.240419\" name=\"C214\" type=\"cB\" />\n+ <Atom charge=\"0.138337\" name=\"H14R\" type=\"hB\" />\n+ <Atom charge=\"0.069215\" name=\"C215\" type=\"cD\" />\n+ <Atom charge=\"0.058341\" name=\"H15R\" type=\"hL\" />\n+ <Atom charge=\"0.058341\" name=\"H15S\" type=\"hL\" />\n+ <Atom charge=\"-0.233897\" name=\"C216\" type=\"cB\" />\n+ <Atom charge=\"0.133812\" name=\"H16R\" type=\"hB\" />\n+ <Atom charge=\"-0.216499\" name=\"C217\" type=\"cB\" />\n+ <Atom charge=\"0.132121\" name=\"H17R\" type=\"hB\" />\n+ <Atom charge=\"0.092718\" name=\"C218\" type=\"cD\" />\n+ <Atom charge=\"0.053227\" name=\"H18R\" type=\"hL\" />\n+ <Atom charge=\"0.053227\" name=\"H18S\" type=\"hL\" />\n+ <Atom charge=\"-0.246833\" name=\"C219\" type=\"cB\" />\n+ <Atom charge=\"0.136323\" name=\"H19R\" type=\"hB\" />\n+ <Atom charge=\"-0.240216\" name=\"C220\" type=\"cB\" />\n+ <Atom charge=\"0.133048\" name=\"H20R\" type=\"hB\" />\n+ <Atom charge=\"0.122022\" name=\"C221\" type=\"cD\" />\n+ <Atom charge=\"0.010042\" name=\"H21R\" type=\"hL\" />\n+ <Atom charge=\"0.010042\" name=\"H21S\" type=\"hL\" />\n+ <Atom charge=\"-0.108913\" name=\"C222\" type=\"cD\" />\n+ <Atom charge=\"0.025968\" name=\"H22R\" type=\"hL\" />\n+ <Atom charge=\"0.025968\" name=\"H22S\" type=\"hL\" />\n+ <Atom charge=\"0.025968\" name=\"H22T\" type=\"hL\" />\n+ <Atom charge=\"-0.000128\" name=\"C33\" type=\"cD\" />\n+ <Atom charge=\"0.013886\" name=\"H3X\" type=\"hL\" />\n+ <Atom charge=\"0.013886\" name=\"H3Y\" type=\"hL\" />\n+ <Atom charge=\"-0.059792\" name=\"C34\" type=\"cD\" />\n+ <Atom charge=\"0.024241\" name=\"H4X\" type=\"hL\" />\n+ <Atom charge=\"0.024241\" name=\"H4Y\" type=\"hL\" />\n+ <Atom charge=\"-0.013443\" name=\"C35\" type=\"cD\" />\n+ <Atom charge=\"0.008191\" name=\"H5X\" type=\"hL\" />\n+ <Atom charge=\"0.008191\" name=\"H5Y\" type=\"hL\" />\n+ <Atom charge=\"-0.037627\" name=\"C36\" type=\"cD\" />\n+ <Atom charge=\"0.01774\" name=\"H6X\" type=\"hL\" />\n+ <Atom charge=\"0.01774\" name=\"H6Y\" type=\"hL\" />\n+ <Atom charge=\"-0.019469\" name=\"C37\" type=\"cD\" />\n+ <Atom charge=\"0.009292\" name=\"H7X\" type=\"hL\" />\n+ <Atom charge=\"0.009292\" name=\"H7Y\" type=\"hL\" />\n+ <Atom charge=\"-0.014623\" name=\"C38\" type=\"cD\" />\n+ <Atom charge=\"0.007326\" name=\"H8X\" type=\"hL\" />\n+ <Atom charge=\"0.007326\" name=\"H8Y\" type=\"hL\" />\n+ <Atom charge=\"-0.017997\" name=\"C39\" type=\"cD\" />\n+ <Atom charge=\"0.009595\" name=\"H9X\" type=\"hL\" />\n+ <Atom charge=\"0.009595\" name=\"H9Y\" type=\"hL\" />\n+ <Atom charge=\"-0.026418\" name=\"C310\" type=\"cD\" />\n+ <Atom charge=\"0.010825\" name=\"H10X\" type=\"hL\" />\n+ <Atom charge=\"0.010825\" name=\"H10Y\" type=\"hL\" />\n+ <Atom charge=\"-0.017093\" name=\"C311\" type=\"cD\" />\n+ <Atom charge=\"0.010206\" name=\"H11X\" type=\"hL\" />\n+ <Atom charge=\"0.010206\" name=\"H11Y\" type=\"hL\" />\n+ <Atom charge=\"-0.019153\" name=\"C312\" type=\"cD\" />\n+ <Atom charge=\"0.008198\" name=\"H12X\" type=\"hL\" />\n+ <Atom charge=\"0.008198\" name=\"H12Y\" type=\"hL\" />\n+ <Atom charge=\"-0.01159\" name=\"C313\" type=\"cD\" />\n+ <Atom charge=\"0.006022\" name=\"H13X\" type=\"hL\" />\n+ <Atom charge=\"0.006022\" name=\"H13Y\" type=\"hL\" />\n+ <Atom charge=\"-0.013489\" name=\"C314\" type=\"cD\" />\n+ <Atom charge=\"0.010073\" name=\"H14X\" type=\"hL\" />\n+ <Atom charge=\"0.010073\" name=\"H14Y\" type=\"hL\" />\n+ <Atom charge=\"-0.032444\" name=\"C315\" type=\"cD\" />\n+ <Atom charge=\"0.010253\" name=\"H15X\" type=\"hL\" />\n+ <Atom charge=\"0.010253\" name=\"H15Y\" type=\"hL\" />\n+ <Atom charge=\"-0.027654\" name=\"C316\" type=\"cD\" />\n+ <Atom charge=\"0.015627\" name=\"H16X\" type=\"hL\" />\n+ <Atom charge=\"0.015627\" name=\"H16Y\" type=\"hL\" />\n+ <Atom charge=\"0.020665\" name=\"C317\" type=\"cD\" />\n+ <Atom charge=\"0.008483\" name=\"H17X\" type=\"hL\" />\n+ <Atom charge=\"0.008483\" name=\"H17Y\" type=\"hL\" />\n+ <Atom charge=\"-0.120069\" name=\"C318\" type=\"cD\" />\n+ <Atom charge=\"0.027938\" name=\"H18X\" type=\"hL\" />\n+ <Atom charge=\"0.027938\" name=\"H18Y\" type=\"hL\" />\n+ <Atom charge=\"0.027938\" name=\"H18Z\" type=\"hL\" />\n+ <Bond atomName1=\"O12\" atomName2=\"P\" />\n+ <Bond atomName1=\"P\" atomName2=\"O11\" />\n+ <Bond atomName1=\"P\" atomName2=\"O13\" />\n+ <Bond atomName1=\"P\" atomName2=\"O14\" />\n+ <Bond atomName1=\"O12\" atomName2=\"H12\" />\n+ <Bond atomName1=\"O11\" atomName2=\"C1\" />\n+ <Bond atomName1=\"C1\" atomName2=\"HA\" />\n+ <Bond atomName1=\"C1\" atomName2=\"HB\" />\n+ <Bond atomName1=\"C1\" atomName2=\"C2\" />\n+ <Bond atomName1=\"C2\" atomName2=\"HS\" />\n+ <Bond atomName1=\"C2\" atomName2=\"C3\" />\n+ <Bond atomName1=\"C2\" atomName2=\"O21\" />\n+ <Bond atomName1=\"C3\" atomName2=\"HX\" />\n+ <Bond atomName1=\"C3\" atomName2=\"HY\" />\n+ <Bond atomName1=\"C3\" atomName2=\"O31\" />\n+ <Bond atomName1=\"O21\" atomName2=\"C21\" />\n+ <Bond atomName1=\"C21\" atomName2=\"C22\" />\n+ <Bond atomName1=\"C21\" atomName2=\"O22\" />\n+ <Bond atomName1=\"C22\" atomName2=\"H2R\" />\n+ <Bond atomName1=\"C22\" atomName2=\"H2S\" />\n+ <Bond atomName1=\"C22\" atomName2=\"C23\" />\n+ <Bond atomName1=\"C23\" atomName2=\"H3R\" />\n+ <Bond atomName1=\"C23\" atomName2=\"H3S\" />\n+ <Bond atomName1=\"C23\" atomName2=\"C24\" />\n+ <Bond atomName1=\"C24\" atomName2=\"H4R\" />\n+ <Bond atomName1=\"C24\" atomName2=\"C25\" />\n+ <Bond atomName1=\"C25\" atomName2=\"H5R\" />\n+ <Bond atomName1=\"C25\" atomName2=\"C26\" />\n+ <Bond atomName1=\"C26\" atomName2=\"H6R\" />\n+ <Bond atomName1=\"C26\" atomName2=\"H6S\" />\n+ <Bond atomName1=\"C26\" atomName2=\"C27\" />\n+ <Bond atomName1=\"C27\" atomName2=\"H7R\" />\n+ <Bond atomName1=\"C27\" atomName2=\"C28\" />\n+ <Bond atomName1=\"C28\" atomName2=\"H8R\" />\n+ <Bond atomName1=\"C28\" atomName2=\"C29\" />\n+ <Bond atomName1=\"C29\" atomName2=\"H9R\" />\n+ <Bond atomName1=\"C29\" atomName2=\"H9S\" />\n+ <Bond atomName1=\"C29\" atomName2=\"C210\" />\n+ <Bond atomName1=\"C210\" atomName2=\"H10R\" />\n+ <Bond atomName1=\"C210\" atomName2=\"C211\" />\n+ <Bond atomName1=\"C211\" atomName2=\"H11R\" />\n+ <Bond atomName1=\"C211\" atomName2=\"C212\" />\n+ <Bond atomName1=\"C212\" atomName2=\"H12R\" />\n+ <Bond atomName1=\"C212\" atomName2=\"H12S\" />\n+ <Bond atomName1=\"C212\" atomName2=\"C213\" />\n+ <Bond atomName1=\"C213\" atomName2=\"H13R\" />\n+ <Bond atomName1=\"C213\" atomName2=\"C214\" />\n+ <Bond atomName1=\"C214\" atomName2=\"H14R\" />\n+ <Bond atomName1=\"C214\" atomName2=\"C215\" />\n+ <Bond atomName1=\"C215\" atomName2=\"H15R\" />\n+ <Bond atomName1=\"C215\" atomName2=\"H15S\" />\n+ <Bond atomName1=\"C215\" atomName2=\"C216\" />\n+ <Bond atomName1=\"C216\" atomName2=\"H16R\" />\n+ <Bond atomName1=\"C216\" atomName2=\"C217\" />\n+ <Bond atomName1=\"C217\" atomName2=\"H17R\" />\n+ <Bond atomName1=\"C217\" atomName2=\"C218\" />\n+ <Bond atomName1=\"C218\" atomName2=\"H18R\" />\n+ <Bond atomName1=\"C218\" atomName2=\"H18S\" />\n+ <Bond atomName1=\"C218\" atomName2=\"C219\" />\n+ <Bond atomName1=\"C219\" atomName2=\"H19R\" />\n+ <Bond atomName1=\"C219\" atomName2=\"C220\" />\n+ <Bond atomName1=\"C220\" atomName2=\"H20R\" />\n+ <Bond atomName1=\"C220\" atomName2=\"C221\" />\n+ <Bond atomName1=\"C221\" atomName2=\"H21R\" />\n+ <Bond atomName1=\"C221\" atomName2=\"H21S\" />\n+ <Bond atomName1=\"C221\" atomName2=\"C222\" />\n+ <Bond atomName1=\"C222\" atomName2=\"H22R\" />\n+ <Bond atomName1=\"C222\" atomName2=\"H22S\" />\n+ <Bond atomName1=\"C222\" atomName2=\"H22T\" />\n+ <Bond atomName1=\"O31\" atomName2=\"C31\" />\n+ <Bond atomName1=\"C31\" atomName2=\"C32\" />\n+ <Bond atomName1=\"C31\" atomName2=\"O32\" />\n+ <Bond atomName1=\"C32\" atomName2=\"H2X\" />\n+ <Bond atomName1=\"C32\" atomName2=\"H2Y\" />\n+ <Bond atomName1=\"C32\" atomName2=\"C33\" />\n+ <Bond atomName1=\"C33\" atomName2=\"H3X\" />\n+ <Bond atomName1=\"C33\" atomName2=\"H3Y\" />\n+ <Bond atomName1=\"C33\" atomName2=\"C34\" />\n+ <Bond atomName1=\"C34\" atomName2=\"H4X\" />\n+ <Bond atomName1=\"C34\" atomName2=\"H4Y\" />\n+ <Bond atomName1=\"C34\" atomName2=\"C35\" />\n+ <Bond atomName1=\"C35\" atomName2=\"H5X\" />\n+ <Bond atomName1=\"C35\" atomName2=\"H5Y\" />\n+ <Bond atomName1=\"C35\" atomName2=\"C36\" />\n+ <Bond atomName1=\"C36\" atomName2=\"H6X\" />\n+ <Bond atomName1=\"C36\" atomName2=\"H6Y\" />\n+ <Bond atomName1=\"C36\" atomName2=\"C37\" />\n+ <Bond atomName1=\"C37\" atomName2=\"H7X\" />\n+ <Bond atomName1=\"C37\" atomName2=\"H7Y\" />\n+ <Bond atomName1=\"C37\" atomName2=\"C38\" />\n+ <Bond atomName1=\"C38\" atomName2=\"H8X\" />\n+ <Bond atomName1=\"C38\" atomName2=\"H8Y\" />\n+ <Bond atomName1=\"C38\" atomName2=\"C39\" />\n+ <Bond atomName1=\"C39\" atomName2=\"H9X\" />\n+ <Bond atomName1=\"C39\" atomName2=\"H9Y\" />\n+ <Bond atomName1=\"C39\" atomName2=\"C310\" />\n+ <Bond atomName1=\"C310\" atomName2=\"H10X\" />\n+ <Bond atomName1=\"C310\" atomName2=\"H10Y\" />\n+ <Bond atomName1=\"C310\" atomName2=\"C311\" />\n+ <Bond atomName1=\"C311\" atomName2=\"H11X\" />\n+ <Bond atomName1=\"C311\" atomName2=\"H11Y\" />\n+ <Bond atomName1=\"C311\" atomName2=\"C312\" />\n+ <Bond atomName1=\"C312\" atomName2=\"H12X\" />\n+ <Bond atomName1=\"C312\" atomName2=\"H12Y\" />\n+ <Bond atomName1=\"C312\" atomName2=\"C313\" />\n+ <Bond atomName1=\"C313\" atomName2=\"H13X\" />\n+ <Bond atomName1=\"C313\" atomName2=\"H13Y\" />\n+ <Bond atomName1=\"C313\" atomName2=\"C314\" />\n+ <Bond atomName1=\"C314\" atomName2=\"H14X\" />\n+ <Bond atomName1=\"C314\" atomName2=\"H14Y\" />\n+ <Bond atomName1=\"C314\" atomName2=\"C315\" />\n+ <Bond atomName1=\"C315\" atomName2=\"H15X\" />\n+ <Bond atomName1=\"C315\" atomName2=\"H15Y\" />\n+ <Bond atomName1=\"C315\" atomName2=\"C316\" />\n+ <Bond atomName1=\"C316\" atomName2=\"H16X\" />\n+ <Bond atomName1=\"C316\" atomName2=\"H16Y\" />\n+ <Bond atomName1=\"C316\" atomName2=\"C317\" />\n+ <Bond atomName1=\"C317\" atomName2=\"H17X\" />\n+ <Bond atomName1=\"C317\" atomName2=\"H17Y\" />\n+ <Bond atomName1=\"C317\" atomName2=\"C318\" />\n+ <Bond atomName1=\"C318\" atomName2=\"H18X\" />\n+ <Bond atomName1=\"C318\" atomName2=\"H18Y\" />\n+ <Bond atomName1=\"C318\" atomName2=\"H18Z\" />\n+ </Residue>\n+ <Residue name=\"DAPA\">\n+ <Atom charge=\"1.456663\" name=\"P\" type=\"pA\" />\n+ <Atom charge=\"-0.914158\" name=\"O13\" type=\"oP\" />\n+ <Atom charge=\"-0.914158\" name=\"O14\" type=\"oP\" />\n+ <Atom charge=\"-0.706197\" name=\"O12\" type=\"oH\" />\n+ <Atom charge=\"0.415628\" name=\"H12\" type=\"hO\" />\n+ <Atom charge=\"-0.594197\" name=\"O11\" type=\"oT\" />\n+ <Atom charge=\"0.081528\" name=\"C1\" type=\"cA\" />\n+ <Atom charge=\"0.083099\" name=\"HA\" type=\"hE\" />\n+ <Atom charge=\"0.083099\" name=\"HB\" type=\"hE\" />\n+ <Atom charge=\"0.283546\" name=\"C2\" type=\"cA\" />\n+ <Atom charge=\"0.063862\" name=\"HS\" type=\"hE\" />\n+ <Atom charge=\"-0.554487\" name=\"O21\" type=\"oS\" />\n+ <Atom charge=\"0.897502\" name=\"C21\" type=\"cC\" />\n+ <Atom charge=\"-0.671622\" name=\"O22\" type=\"oC\" />\n+ <Atom charge=\"-0.123935\" name=\"C22\" type=\"cD\" />\n+ <Atom charge=\"0.024535\" name=\"H2R\" type=\"hL\" />\n+ <Atom charge=\"0.024535\" name=\"H2S\" type=\"hL\" />\n+ <Atom charge=\"0.185299\" name=\"C3\" type=\"cA\" />\n+ <Atom charge=\"0.067676\" name=\"HX\" type=\"hE\" />\n+ <Atom charge=\"0.067676\" name=\"HY\" type=\"hE\" />\n+ <Atom charge=\"-0.547824\" name=\"O31\" type=\"oS\" />\n+ <Atom charge=\"0.888207\" name=\"C31\" type=\"cC\" />\n+ <Atom charge=\"-0.671142\" name=\"O32\" type=\"oC\" />\n+ <Atom charge=\"-0.123935\" name=\"C32\" type=\"cD\" />\n+ <Atom charge=\"0.024535\" name=\"H2X\" type=\"hL\" />\n+ <Atom charge=\"0.024535\" name=\"H2Y\" type=\"hL\" />\n+ <Atom charge=\"0.025626\" name=\"C23\" type=\"cD\" />\n+ <Atom charge=\"0.025117\" name=\"H3R\" type=\"hL\" />\n+ <Atom charge=\"0.025117\" name=\"H3S\" type=\"hL\" />\n+ <Atom charge=\"0.031382\" name=\"C24\" type=\"cD\" />\n+ <Atom charge=\"0.038708\" name=\"H4R\" type=\"hL\" />\n+ <Atom charge=\"0.038708\" name=\"H4S\" type=\"hL\" />\n+ <Atom charge=\"-0.26789\" name=\"C25\" type=\"cB\" />\n+ <Atom charge=\"0.143577\" name=\"H5R\" type=\"hB\" />\n+ <Atom charge=\"-0.206786\" name=\"C26\" type=\"cB\" />\n+ <Atom charge=\"0.129858\" name=\"H6R\" type=\"hB\" />\n+ <Atom charge=\"0.055784\" name=\"C27\" type=\"cD\" />\n+ <Atom charge=\"0.062775\" name=\"H7R\" type=\"hL\" />\n+ <Atom charge=\"0.062775\" name=\"H7S\" type=\"hL\" />\n+ <Atom charge=\"-0.228527\" name=\"C28\" type=\"cB\" />\n+ <Atom charge=\"0.134735\" name=\"H8R\" type=\"hB\" />\n+ <Atom charge=\"-0.228694\" name=\"C29\" type=\"cB\" />\n+ <Atom charge=\"0.132167\" name=\"H9R\" type=\"hB\" />\n+ <Atom charge=\"0.095406\" name=\"C210\" type=\"cD\" />\n+ <Atom charge=\"0.05114\" name=\"H10R\" type=\"hL\" />\n+ <Atom charge=\"0.05114\" name=\"H10S\" type=\"hL\" />\n+ <Atom charge=\"-0.228704\" name=\"C211\" type=\"cB\" />\n+ <Atom charge=\"0.131341\" name=\"H11R\" type=\"hB\" />\n+ <Atom charge=\"-0.220164\" name=\"C212\" type=\"cB\" />\n+ <Atom charge=\"0.131986\" name=\"H12R\" type=\"hB\" />\n+ <Atom charge=\"0.058197\" name=\"C213\" type=\"cD\" />\n+ <Atom charge=\"0.06135\" name=\"H13R\" type=\"hL\" />\n+ <Atom charge=\"0.06135\" name=\"H13S\" type=\"hL\" />\n+ <Atom charge=\"-0.224769\" name=\"C214\" type=\"cB\" />\n+ <Atom charge=\"0.129616\" name=\"H14R\" type=\"hB\" />\n+ <Atom charge=\"-0.244149\" name=\"C215\" type=\"cB\" />\n+ <Atom charge=\"0.132793\" name=\"H15R\" type=\"hB\" />\n+ <Atom charge=\"0.0391\" name=\"C216\" type=\"cD\" />\n+ <Atom charge=\"0.028848\" name=\"H16R\" type=\"hL\" />\n+ <Atom charge=\"0.028848\" name=\"H16S\" type=\"hL\" />\n+ <Atom charge=\"-0.028398\" name=\"C217\" type=\"cD\" />\n+ <Atom charge=\"0.019581\" name=\"H17R\" type=\"hL\" />\n+ <Atom charge=\"0.019581\" name=\"H17S\" type=\"hL\" />\n+ <Atom charge=\"-0.019772\" name=\"C218\" type=\"cD\" />\n+ <Atom charge=\"0.014218\" name=\"H18R\" type=\"hL\" />\n+ <Atom charge=\"0.014218\" name=\"H18S\" type=\"hL\" />\n+ <Atom charge=\"0.024957\" name=\"C219\" type=\"cD\" />\n+ <Atom charge=\"0.005426\" name=\"H19R\" type=\"hL\" />\n+ <Atom charge=\"0.005426\" name=\"H19S\" type=\"hL\" />\n+ <Atom charge=\"-0.109302\" name=\"C220\" type=\"cD\" />\n+ <Atom charge=\"0.023723\" name=\"H20R\" type=\"hL\" />\n+ <Atom charge=\"0.023723\" name=\"H20S\" type=\"hL\" />\n+ <Atom charge=\"0.023723\" name=\"H20T\" type=\"hL\" />\n+ <Atom charge=\"0.025626\" name=\"C33\" type=\"cD\" />\n+ <Atom charge=\"0.025117\" name=\"H3X\" type=\"hL\" />\n+ <Atom charge=\"0.025117\" name=\"H3Y\" type=\"hL\" />\n+ <Atom charge=\"0.031382\" name=\"C34\" type=\"cD\" />\n+ <Atom charge=\"0.038708\" name=\"H4X\" type=\"hL\" />\n+ <Atom charge=\"0.038708\" name=\"H4Y\" type=\"hL\" />\n+ <Atom charge=\"-0.26789\" name=\"C35\" type=\"cB\" />\n+ <Atom charge=\"0.143577\" name=\"H5X\" type=\"hB\" />\n+ <Atom charge=\"-0.206786\" name=\"C36\" type=\"cB\" />\n+ <Atom charge=\"0.129858\" name=\"H6X\" type=\"hB\" />\n+ <Atom charge=\"0.055784\" name=\"C37\" type=\"cD\" />\n+ <Atom charge=\"0.062775\" name=\"H7X\" type=\"hL\" />\n+ <Atom charge=\"0.062775\" name=\"H7Y\" type=\"hL\" />\n+ <Atom charge=\"-0.228527\" name=\"C38\" type=\"cB\" />\n+ <Atom charge=\"0.134735\" name=\"H8X\" type=\"hB\" />\n+ <Atom charge=\"-0.228694\" name=\"C39\" type=\"cB\" />\n+ <Atom charge=\"0.132167\" name=\"H9X\" type=\"hB\" />\n+ <Atom charge=\"0.095406\" name=\"C310\" type=\"cD\" />\n+ <Atom charge=\"0.05114\" name=\"H10X\" type=\"hL\" />\n+ <Atom charge=\"0.05114\" name=\"H10Y\" type=\"hL\" />\n+ <Atom charge=\"-0.228704\" name=\"C311\" type=\"cB\" />\n+ <Atom charge=\"0.131341\" name=\"H11X\" type=\"hB\" />\n+ <Atom charge=\"-0.220164\" name=\"C312\" type=\"cB\" />\n+ <Atom charge=\"0.131986\" name=\"H12X\" type=\"hB\" />\n+ <Atom charge=\"0.058197\" name=\"C313\" type=\"cD\" />\n+ <Atom charge=\"0.06135\" name=\"H13X\" type=\"hL\" />\n+ <Atom charge=\"0.06135\" name=\"H13Y\" type=\"hL\" />\n+ <Atom charge=\"-0.224769\" name=\"C314\" type=\"cB\" />\n+ <Atom charge=\"0.129616\" name=\"H14X\" type=\"hB\" />\n+ <Atom charge=\"-0.244149\" name=\"C315\" type=\"cB\" />\n+ <Atom charge=\"0.132793\" name=\"H15X\" type=\"hB\" />\n+ <Atom charge=\"0.0391\" name=\"C316\" type=\"cD\" />\n+ <Atom charge=\"0.028848\" name=\"H16X\" type=\"hL\" />\n+ <Atom charge=\"0.028848\" name=\"H16Y\" type=\"hL\" />\n+ <Atom charge=\"-0.028398\" name=\"C317\" type=\"cD\" />\n+ <Atom charge=\"0.019581\" name=\"H17X\" type=\"hL\" />\n+ <Atom charge=\"0.019581\" name=\"H17Y\" type=\"hL\" />\n+ <Atom charge=\"-0.019772\" name=\"C318\" type=\"cD\" />\n+ <Atom charge=\"0.014218\" name=\"H18X\" type=\"hL\" />\n+ <Atom charge=\"0.014218\" name=\"H18Y\" type=\"hL\" />\n+ <Atom charge=\"0.024957\" name=\"C319\" type=\"cD\" />\n+ <Atom charge=\"0.005426\" name=\"H19X\" type=\"hL\" />\n+ <Atom charge=\"0.005426\" name=\"H19Y\" type=\"hL\" />\n+ <Atom charge=\"-0.109302\" name=\"C320\" type=\"cD\" />\n+ <Atom charge=\"0.023723\" name=\"H20X\" type=\"hL\" />\n+ <Atom charge=\"0.023723\" name=\"H20Y\" type=\"hL\" />\n+ <Atom charge=\"0.023723\" name=\"H20Z\" type=\"hL\" />\n+ <Bond atomName1=\"O12\" atomName2=\"P\" />\n+ <Bond atomName1=\"P\" atomName2=\"O11\" />\n+ <Bond atomName1=\"P\" atomName2=\"O13\" />\n+ <Bond atomName1=\"P\" atomName2=\"O14\" />\n+ <Bond atomName1=\"O12\" atomName2=\"H12\" />\n+ <Bond atomName1=\"O11\" atomName2=\"C1\" />\n+ <Bond atomName1=\"C1\" atomName2=\"HA\" />\n+ <Bond atomName1=\"C1\" atomName2=\"HB\" />\n+ <Bond atomName1=\"C1\" atomName2=\"C2\" />\n+ <Bond atomName1=\"C2\" atomName2=\"HS\" />\n+ <Bond atomName1=\"C2\" atomName2=\"C3\" />\n+ <Bond atomName1=\"C2\" atomName2=\"O21\" />\n+ <Bond atomName1=\"C3\" atomName2=\"HX\" />\n+ <Bond atomName1=\"C3\" atomName2=\"HY\" />\n+ <Bond atomName1=\"C3\" atomName2=\"O31\" />\n+ <Bond atomName1=\"C21\" atomName2=\"O21\" />\n+ <Bond atomName1=\"C21\" atomName2=\"C22\" />\n+ <Bond atomName1=\"C21\" atomName2=\"O22\" />\n+ <Bond atomName1=\"C22\" atomName2=\"C23\" />\n+ <Bond atomName1=\"C22\" atomName2=\"H2R\" />\n+ <Bond atomName1=\"C22\" atomName2=\"H2S\" />\n+ <Bond atomName1=\"C23\" atomName2=\"C24\" />\n+ <Bond atomName1=\"C23\" atomName2=\"H3R\" />\n+ <Bond atomName1=\"C23\" atomName2=\"H3S\" />\n+ <Bond atomName1=\"C24\" atomName2=\"C25\" />\n+ <Bond atomName1=\"C24\" atomName2=\"H4R\" />\n+ <Bond atomName1=\"C24\" atomName2=\"H4S\" />\n+ <Bond atomName1=\"C25\" atomName2=\"C26\" />\n+ <Bond atomName1=\"C25\" atomName2=\"H5R\" />\n+ <Bond atomName1=\"C26\" atomName2=\"C27\" />\n+ <Bond atomName1=\"C26\" atomName2=\"H6R\" />\n+ <Bond atomName1=\"C27\" atomName2=\"C28\" />\n+ <Bond atomName1=\"C27\" atomName2=\"H7R\" />\n+ <Bond atomName1=\"C27\" atomName2=\"H7S\" />\n+ <Bond atomName1=\"C28\" atomName2=\"C29\" />\n+ <Bond atomName1=\"C28\" atomName2=\"H8R\" />\n+ <Bond atomName1=\"C29\" atomName2=\"C210\" />\n+ <Bond atomName1=\"C29\" atomName2=\"H9R\" />\n+ <Bond atomName1=\"C210\" atomName2=\"C211\" />\n+ <Bond atomName1=\"C210\" atomName2=\"H10R\" />\n+ <Bond atomName1=\"C210\" atomName2=\"H10S\" />\n+ <Bond atomName1=\"C211\" atomName2=\"C212\" />\n+ <Bond atomName1=\"C211\" atomName2=\"H11R\" />\n+ <Bond atomName1=\"C212\" atomName2=\"C213\" />\n+ <Bond atomName1=\"C212\" atomName2=\"H12R\" />\n+ <Bond atomName1=\"C213\" atomName2=\"C214\" />\n+ <Bond atomName1=\"C213\" atomName2=\"H13R\" />\n+ <Bond atomName1=\"C213\" atomName2=\"H13S\" />\n+ <Bond atomName1=\"C214\" atomName2=\"C215\" />\n+ <Bond atomName1=\"C214\" atomName2=\"H14R\" />\n+ <Bond atomName1=\"C215\" atomName2=\"C216\" />\n+ <Bond atomName1=\"C215\" atomName2=\"H15R\" />\n+ <Bond atomName1=\"C216\" atomName2=\"C217\" />\n+ <Bond atomName1=\"C216\" atomName2=\"H16R\" />\n+ <Bond atomName1=\"C216\" atomName2=\"H16S\" />\n+ <Bond atomName1=\"C217\" atomName2=\"C218\" />\n+ <Bond atomName1=\"C217\" atomName2=\"H17R\" />\n+ <Bond atomName1=\"C217\" atomName2=\"H17S\" />\n+ <Bond atomName1=\"C218\" atomName2=\"C219\" />\n+ <Bond atomName1=\"C218\" atomName2=\"H18R\" />\n+ <Bond atomName1=\"C218\" atomName2=\"H18S\" />\n+ <Bond atomName1=\"C219\" atomName2=\"C220\" />\n+ <Bond atomName1=\"C219\" atomName2=\"H19R\" />\n+ <Bond atomName1=\"C219\" atomName2=\"H19S\" />\n+ <Bond atomName1=\"C220\" atomName2=\"H20T\" />\n+ <Bond atomName1=\"C220\" atomName2=\"H20R\" />\n+ <Bond atomName1=\"C220\" atomName2=\"H20S\" />\n+ <Bond atomName1=\"C31\" atomName2=\"O31\" />\n+ <Bond atomName1=\"C31\" atomName2=\"C32\" />\n+ <Bond atomName1=\"C31\" atomName2=\"O32\" />\n+ <Bond atomName1=\"C32\" atomName2=\"C33\" />\n+ <Bond atomName1=\"C32\" atomName2=\"H2X\" />\n+ <Bond atomName1=\"C32\" atomName2=\"H2Y\" />\n+ <Bond atomName1=\"C33\" atomName2=\"C34\" />\n+ <Bond atomName1=\"C33\" atomName2=\"H3X\" />\n+ <Bond atomName1=\"C33\" atomName2=\"H3Y\" />\n+ <Bond atomName1=\"C34\" atomName2=\"C35\" />\n+ <Bond atomName1=\"C34\" atomName2=\"H4X\" />\n+ <Bond atomName1=\"C34\" atomName2=\"H4Y\" />\n+ <Bond atomName1=\"C35\" atomName2=\"C36\" />\n+ <Bond atomName1=\"C35\" atomName2=\"H5X\" />\n+ <Bond atomName1=\"C36\" atomName2=\"C37\" />\n+ <Bond atomName1=\"C36\" atomName2=\"H6X\" />\n+ <Bond atomName1=\"C37\" atomName2=\"C38\" />\n+ <Bond atomName1=\"C37\" atomName2=\"H7X\" />\n+ <Bond atomName1=\"C37\" atomName2=\"H7Y\" />\n+ <Bond atomName1=\"C38\" atomName2=\"C39\" />\n+ <Bond atomName1=\"C38\" atomName2=\"H8X\" />\n+ <Bond atomName1=\"C39\" atomName2=\"C310\" />\n+ <Bond atomName1=\"C39\" atomName2=\"H9X\" />\n+ <Bond atomName1=\"C310\" atomName2=\"C311\" />\n+ <Bond atomName1=\"C310\" atomName2=\"H10X\" />\n+ <Bond atomName1=\"C310\" atomName2=\"H10Y\" />\n+ <Bond atomName1=\"C311\" atomName2=\"C312\" />\n+ <Bond atomName1=\"C311\" atomName2=\"H11X\" />\n+ <Bond atomName1=\"C312\" atomName2=\"C313\" />\n+ <Bond atomName1=\"C312\" atomName2=\"H12X\" />\n+ <Bond atomName1=\"C313\" atomName2=\"C314\" />\n+ <Bond atomName1=\"C313\" atomName2=\"H13X\" />\n+ <Bond atomName1=\"C313\" atomName2=\"H13Y\" />\n+ <Bond atomName1=\"C314\" atomName2=\"C315\" />\n+ <Bond atomName1=\"C314\" atomName2=\"H14X\" />\n+ <Bond atomName1=\"C315\" atomName2=\"C316\" />\n+ <Bond atomName1=\"C315\" atomName2=\"H15X\" />\n+ <Bond atomName1=\"C316\" atomName2=\"C317\" />\n+ <Bond atomName1=\"C316\" atomName2=\"H16X\" />\n+ <Bond atomName1=\"C316\" atomName2=\"H16Y\" />\n+ <Bond atomName1=\"C317\" atomName2=\"C318\" />\n+ <Bond atomName1=\"C317\" atomName2=\"H17X\" />\n+ <Bond atomName1=\"C317\" atomName2=\"H17Y\" />\n+ <Bond atomName1=\"C318\" atomName2=\"C319\" />\n+ <Bond atomName1=\"C318\" atomName2=\"H18X\" />\n+ <Bond atomName1=\"C318\" atomName2=\"H18Y\" />\n+ <Bond atomName1=\"C319\" atomName2=\"C320\" />\n+ <Bond atomName1=\"C319\" atomName2=\"H19X\" />\n+ <Bond atomName1=\"C319\" atomName2=\"H19Y\" />\n+ <Bond atomName1=\"C320\" atomName2=\"H20Z\" />\n+ <Bond atomName1=\"C320\" atomName2=\"H20X\" />\n+ <Bond atomName1=\"C320\" atomName2=\"H20Y\" />\n+ </Residue>\n+ <Residue name=\"SDPG\">\n+ <Atom charge=\"0.193597\" name=\"C13\" type=\"cA\" />\n+ <Atom charge=\"0.034715\" name=\"H13A\" type=\"hE\" />\n+ <Atom charge=\"0.034715\" name=\"H13B\" type=\"hE\" />\n+ <Atom charge=\"-0.700871\" name=\"OC3\" type=\"oH\" />\n+ <Atom charge=\"0.423328\" name=\"HO3\" type=\"hO\" />\n+ <Atom charge=\"0.336816\" name=\"C12\" type=\"cA\" />\n+ <Atom charge=\"0.030042\" name=\"H12A\" type=\"hE\" />\n+ <Atom charge=\"-0.726192\" name=\"OC2\" type=\"oH\" />\n+ <Atom charge=\"0.439523\" name=\"HO2\" type=\"hO\" />\n+ <Atom charge=\"-0.056706\" name=\"C11\" type=\"cA\" />\n+ <Atom charge=\"0.093354\" name=\"H11A\" type=\"hE\" />\n+ <Atom charge=\"0.093354\" name=\"H11B\" type=\"hE\" />\n+ <Atom charge=\"1.380464\" name=\"P\" type=\"pA\" />\n+ <Atom charge=\"-0.873444\" name=\"O13\" type=\"oP\" />\n+ <Atom charge=\"-0.873444\" name=\"O14\" type=\"oP\" />\n+ <Atom charge=\"-0.534308\" name=\"O12\" type=\"oT\" />\n+ <Atom charge=\"-0.546098\" name=\"O11\" type=\"oT\" />\n+ <Atom charge=\"0.043713\" name=\"C1\" type=\"cA\" />\n+ <Atom charge=\"0.091041\" name=\"HA\" type=\"hE\" />\n+ <Atom charge=\"0.091041\" name=\"HB\" type=\"hE\" />\n+ <Atom charge=\"0.353807\" name=\"C2\" type=\"cA\" />\n+ <Atom charge=\"0.037488\" name=\"HS\" type=\"hE\" />\n+ <Atom charge=\"-0.599131\" name=\"O21\" type=\"oS\" />\n+ <Atom charge=\"0.883669\" name=\"C21\" type=\"cC\" />\n+ <Atom charge=\"-0.655762\" name=\"O22\" type=\"oC\" />\n+ <Atom charge=\"-0.142937\" name=\"C22\" type=\"cD\" />\n+ <Atom charge=\"0.037544\" name=\"H2R\" type=\"hL\" />\n+ <Atom charge=\"0.037544\" name=\"H2S\" type=\"hL\" />\n+ <Atom charge=\"0.295119\" name=\"C3\" type=\"cA\" />\n+ <Atom charge=\"0.033797\" name=\"HX\" type=\"hE\" />\n+ <Atom charge=\"0.033797\" name=\"HY\" type=\"hE\" />\n+ <Atom charge=\"-0.585165\" name=\"O31\" type=\"oS\" />\n+ <Atom charge=\"0.877006\" name=\"C31\" type=\"cC\" />\n+ <Atom charge=\"-0.649265\" name=\"O32\" type=\"oC\" />\n+ <Atom charge=\"-0.11702\" name=\"C32\" type=\"cD\" />\n+ <Atom charge=\"0.051807\" name=\"H2X\" type=\"hL\" />\n+ <Atom charge=\"0.051807\" name=\"H2Y\" type=\"hL\" />\n+ <Atom charge=\"0.120999\" name=\"C23\" type=\"cD\" />\n+ <Atom charge=\"0.026097\" name=\"H3R\" type=\"hL\" />\n+ <Atom charge=\"0.026097\" name=\"H3S\" type=\"hL\" />\n+ <Atom charge=\"-0.287059\" name=\"C24\" type=\"cB\" />\n+ <Atom charge=\"0.154038\" name=\"H4R\" type=\"hB\" />\n+ <Atom charge=\"-0.214845\" name=\"C25\" type=\"cB\" />\n+ <Atom charge=\"0.132504\" name=\"H5R\" type=\"hB\" />\n+ <Atom charge=\"0.060337\" name=\"C26\" type=\"cD\" />\n+ <Atom charge=\"0.063515\" name=\"H6R\" type=\"hL\" />\n+ <Atom charge=\"0.063515\" name=\"H6S\" type=\"hL\" />\n+ <Atom charge=\"-0.220895\" name=\"C27\" type=\"cB\" />\n+ <Atom charge=\"0.139863\" name=\"H7R\" type=\"hB\" />\n+ <Atom charge=\"-0.226254\" name=\"C28\" type=\"cB\" />\n+ <Atom charge=\"0.128147\" name=\"H8R\" type=\"hB\" />\n+ <Atom charge=\"0.089043\" name=\"C29\" type=\"cD\" />\n+ <Atom charge=\"0.054255\" name=\"H9R\" type=\"hL\" />\n+ <Atom charge=\"0.054255\" name=\"H9S\" type=\"hL\" />\n+ <Atom charge=\"-0.221433\" name=\"C210\" type=\"cB\" />\n+ <Atom charge=\"0.133628\" name=\"H10R\" type=\"hB\" />\n+ <Atom charge=\"-0.241205\" name=\"C211\" type=\"cB\" />\n+ <Atom charge=\"0.136308\" name=\"H11R\" type=\"hB\" />\n+ <Atom charge=\"0.085245\" name=\"C212\" type=\"cD\" />\n+ <Atom charge=\"0.053422\" name=\"H12R\" type=\"hL\" />\n+ <Atom charge=\"0.053422\" name=\"H12S\" type=\"hL\" />\n+ <Atom charge=\"-0.218668\" name=\"C213\" type=\"cB\" />\n+ <Atom charge=\"0.131575\" name=\"H13R\" type=\"hB\" />\n+ <Atom charge=\"-0.240419\" name=\"C214\" type=\"cB\" />\n+ <Atom charge=\"0.138337\" name=\"H14R\" type=\"hB\" />\n+ <Atom charge=\"0.069215\" name=\"C215\" type=\"cD\" />\n+ <Atom charge=\"0.058341\" name=\"H15R\" type=\"hL\" />\n+ <Atom charge=\"0.058341\" name=\"H15S\" type=\"hL\" />\n+ <Atom charge=\"-0.233897\" name=\"C216\" type=\"cB\" />\n+ <Atom charge=\"0.133812\" name=\"H16R\" type=\"hB\" />\n+ <Atom charge=\"-0.216499\" name=\"C217\" type=\"cB\" />\n+ <Atom charge=\"0.132121\" name=\"H17R\" type=\"hB\" />\n+ <Atom charge=\"0.092718\" name=\"C218\" type=\"cD\" />\n+ <Atom charge=\"0.053227\" name=\"H18R\" type=\"hL\" />\n+ <Atom charge=\"0.053227\" name=\"H18S\" type=\"hL\" />\n+ <Atom charge=\"-0.246833\" name=\"C219\" type=\"cB\" />\n+ <Atom charge=\"0.136323\" name=\"H19R\" type=\"hB\" />\n+ <Atom charge=\"-0.240216\" name=\"C220\" type=\"cB\" />\n+ <Atom charge=\"0.133048\" name=\"H20R\" type=\"hB\" />\n+ <Atom charge=\"0.122022\" name=\"C221\" type=\"cD\" />\n+ <Atom charge=\"0.010042\" name=\"H21R\" type=\"hL\" />\n+ <Atom charge=\"0.010042\" name=\"H21S\" type=\"hL\" />\n+ <Atom charge=\"-0.108913\" name=\"C222\" type=\"cD\" />\n+ <Atom charge=\"0.025968\" name=\"H22R\" type=\"hL\" />\n+ <Atom charge=\"0.025968\" name=\"H22S\" type=\"hL\" />\n+ <Atom charge=\"0.025968\" name=\"H22T\" type=\"hL\" />\n+ <Atom charge=\"-0.000128\" name=\"C33\" type=\"cD\" />\n+ <Atom charge=\"0.013886\" name=\"H3X\" type=\"hL\" />\n+ <Atom charge=\"0.013886\" name=\"H3Y\" type=\"hL\" />\n+ <Atom charge=\"-0.059792\" name=\"C34\" type=\"cD\" />\n+ <Atom charge=\"0.024241\" name=\"H4X\" type=\"hL\" />\n+ <Atom charge=\"0.024241\" name=\"H4Y\" type=\"hL\" />\n+ <Atom charge=\"-0.013443\" name=\"C35\" type=\"cD\" />\n+ <Atom charge=\"0.008191\" name=\"H5X\" type=\"hL\" />\n+ <Atom charge=\"0.008191\" name=\"H5Y\" type=\"hL\" />\n+ <Atom charge=\"-0.037627\" name=\"C36\" type=\"cD\" />\n+ <Atom charge=\"0.01774\" name=\"H6X\" type=\"hL\" />\n+ <Atom charge=\"0.01774\" name=\"H6Y\" type=\"hL\" />\n+ <Atom charge=\"-0.019469\" name=\"C37\" type=\"cD\" />\n+ <Atom charge=\"0.009292\" name=\"H7X\" type=\"hL\" />\n+ <Atom charge=\"0.009292\" name=\"H7Y\" type=\"hL\" />\n+ <Atom charge=\"-0.014623\" name=\"C38\" type=\"cD\" />\n+ <Atom charge=\"0.007326\" name=\"H8X\" type=\"hL\" />\n+ <Atom charge=\"0.007326\" name=\"H8Y\" type=\"hL\" />\n+ <Atom charge=\"-0.017997\" name=\"C39\" type=\"cD\" />\n+ <Atom charge=\"0.009595\" name=\"H9X\" type=\"hL\" />\n+ <Atom charge=\"0.009595\" name=\"H9Y\" type=\"hL\" />\n+ <Atom charge=\"-0.026418\" name=\"C310\" type=\"cD\" />\n+ <Atom charge=\"0.010825\" name=\"H10X\" type=\"hL\" />\n+ <Atom charge=\"0.010825\" name=\"H10Y\" type=\"hL\" />\n+ <Atom charge=\"-0.017093\" name=\"C311\" type=\"cD\" />\n+ <Atom charge=\"0.010206\" name=\"H11X\" type=\"hL\" />\n+ <Atom charge=\"0.010206\" name=\"H11Y\" type=\"hL\" />\n+ <Atom charge=\"-0.019153\" name=\"C312\" type=\"cD\" />\n+ <Atom charge=\"0.008198\" name=\"H12X\" type=\"hL\" />\n+ <Atom charge=\"0.008198\" name=\"H12Y\" type=\"hL\" />\n+ <Atom charge=\"-0.01159\" name=\"C313\" type=\"cD\" />\n+ <Atom charge=\"0.006022\" name=\"H13X\" type=\"hL\" />\n+ <Atom charge=\"0.006022\" name=\"H13Y\" type=\"hL\" />\n+ <Atom charge=\"-0.013489\" name=\"C314\" type=\"cD\" />\n+ <Atom charge=\"0.010073\" name=\"H14X\" type=\"hL\" />\n+ <Atom charge=\"0.010073\" name=\"H14Y\" type=\"hL\" />\n+ <Atom charge=\"-0.032444\" name=\"C315\" type=\"cD\" />\n+ <Atom charge=\"0.010253\" name=\"H15X\" type=\"hL\" />\n+ <Atom charge=\"0.010253\" name=\"H15Y\" type=\"hL\" />\n+ <Atom charge=\"-0.027654\" name=\"C316\" type=\"cD\" />\n+ <Atom charge=\"0.015627\" name=\"H16X\" type=\"hL\" />\n+ <Atom charge=\"0.015627\" name=\"H16Y\" type=\"hL\" />\n+ <Atom charge=\"0.020665\" name=\"C317\" type=\"cD\" />\n+ <Atom charge=\"0.008483\" name=\"H17X\" type=\"hL\" />\n+ <Atom charge=\"0.008483\" name=\"H17Y\" type=\"hL\" />\n+ <Atom charge=\"-0.120069\" name=\"C318\" type=\"cD\" />\n+ <Atom charge=\"0.027938\" name=\"H18X\" type=\"hL\" />\n+ <Atom charge=\"0.027938\" name=\"H18Y\" type=\"hL\" />\n+ <Atom charge=\"0.027938\" name=\"H18Z\" type=\"hL\" />\n+ <Bond atomName1=\"HO3\" atomName2=\"OC3\" />\n+ <Bond atomName1=\"OC3\" atomName2=\"C13\" />\n+ <Bond atomName1=\"C13\" atomName2=\"H13A\" />\n+ <Bond atomName1=\"C13\" atomName2=\"H13B\" />\n+ <Bond atomName1=\"C13\" atomName2=\"C12\" />\n+ <Bond atomName1=\"HO2\" atomName2=\"OC2\" />\n+ <Bond atomName1=\"OC2\" atomName2=\"C12\" />\n+ <Bond atomName1=\"C12\" atomName2=\"H12A\" />\n+ <Bond atomName1=\"C12\" atomName2=\"C11\" />\n+ <Bond atomName1=\"C11\" atomName2=\"H11A\" />\n+ <Bond atomName1=\"C11\" atomName2=\"H11B\" />\n+ <Bond atomName1=\"C11\" atomName2=\"O12\" />\n+ <Bond atomName1=\"O11\" atomName2=\"C1\" />\n+ <Bond atomName1=\"O12\" atomName2=\"P\" />\n+ <Bond atomName1=\"P\" atomName2=\"O11\" />\n+ <Bond atomName1=\"P\" atomName2=\"O13\" />\n+ <Bond atomName1=\"P\" atomName2=\"O14\" />\n+ <Bond atomName1=\"C1\" atomName2=\"HA\" />\n+ <Bond atomName1=\"C1\" atomName2=\"HB\" />\n+ <Bond atomName1=\"C1\" atomName2=\"C2\" />\n+ <Bond atomName1=\"C2\" atomName2=\"HS\" />\n+ <Bond atomName1=\"C2\" atomName2=\"C3\" />\n+ <Bond atomName1=\"C2\" atomName2=\"O21\" />\n+ <Bond atomName1=\"C3\" atomName2=\"HX\" />\n+ <Bond atomName1=\"C3\" atomName2=\"HY\" />\n+ <Bond atomName1=\"C3\" atomName2=\"O31\" />\n+ <Bond atomName1=\"O21\" atomName2=\"C21\" />\n+ <Bond atomName1=\"C21\" atomName2=\"C22\" />\n+ <Bond atomName1=\"C21\" atomName2=\"O22\" />\n+ <Bond atomName1=\"C22\" atomName2=\"H2R\" />\n+ <Bond atomName1=\"C22\" atomName2=\"H2S\" />\n+ <Bond atomName1=\"C22\" atomName2=\"C23\" />\n+ <Bond atomName1=\"C23\" atomName2=\"H3R\" />\n+ <Bond atomName1=\"C23\" atomName2=\"H3S\" />\n+ <Bond atomName1=\"C23\" atomName2=\"C24\" />\n+ <Bond atomName1=\"C24\" atomName2=\"H4R\" />\n+ <Bond atomName1=\"C24\" atomName2=\"C25\" />\n+ <Bond atomName1=\"C25\" atomName2=\"H5R\" />\n+ <Bond atomName1=\"C25\" atomName2=\"C26\" />\n+ <Bond atomName1=\"C26\" atomName2=\"H6R\" />\n+ <Bond atomName1=\"C26\" atomName2=\"H6S\" />\n+ <Bond atomName1=\"C26\" atomName2=\"C27\" />\n+ <Bond atomName1=\"C27\" atomName2=\"H7R\" />\n+ <Bond atomName1=\"C27\" atomName2=\"C28\" />\n+ <Bond atomName1=\"C28\" atomName2=\"H8R\" />\n+ <Bond atomName1=\"C28\" atomName2=\"C29\" />\n+ <Bond atomName1=\"C29\" atomName2=\"H9R\" />\n+ <Bond atomName1=\"C29\" atomName2=\"H9S\" />\n+ <Bond atomName1=\"C29\" atomName2=\"C210\" />\n+ <Bond atomName1=\"C210\" atomName2=\"H10R\" />\n+ <Bond atomName1=\"C210\" atomName2=\"C211\" />\n+ <Bond atomName1=\"C211\" atomName2=\"H11R\" />\n+ <Bond atomName1=\"C211\" atomName2=\"C212\" />\n+ <Bond atomName1=\"C212\" atomName2=\"H12R\" />\n+ <Bond atomName1=\"C212\" atomName2=\"H12S\" />\n+ <Bond atomName1=\"C212\" atomName2=\"C213\" />\n+ <Bond atomName1=\"C213\" atomName2=\"H13R\" />\n+ <Bond atomName1=\"C213\" atomName2=\"C214\" />\n+ <Bond atomName1=\"C214\" atomName2=\"H14R\" />\n+ <Bond atomName1=\"C214\" atomName2=\"C215\" />\n+ <Bond atomName1=\"C215\" atomName2=\"H15R\" />\n+ <Bond atomName1=\"C215\" atomName2=\"H15S\" />\n+ <Bond atomName1=\"C215\" atomName2=\"C216\" />\n+ <Bond atomName1=\"C216\" atomName2=\"H16R\" />\n+ <Bond atomName1=\"C216\" atomName2=\"C217\" />\n+ <Bond atomName1=\"C217\" atomName2=\"H17R\" />\n+ <Bond atomName1=\"C217\" atomName2=\"C218\" />\n+ <Bond atomName1=\"C218\" atomName2=\"H18R\" />\n+ <Bond atomName1=\"C218\" atomName2=\"H18S\" />\n+ <Bond atomName1=\"C218\" atomName2=\"C219\" />\n+ <Bond atomName1=\"C219\" atomName2=\"H19R\" />\n+ <Bond atomName1=\"C219\" atomName2=\"C220\" />\n+ <Bond atomName1=\"C220\" atomName2=\"H20R\" />\n+ <Bond atomName1=\"C220\" atomName2=\"C221\" />\n+ <Bond atomName1=\"C221\" atomName2=\"H21R\" />\n+ <Bond atomName1=\"C221\" atomName2=\"H21S\" />\n+ <Bond atomName1=\"C221\" atomName2=\"C222\" />\n+ <Bond atomName1=\"C222\" atomName2=\"H22R\" />\n+ <Bond atomName1=\"C222\" atomName2=\"H22S\" />\n+ <Bond atomName1=\"C222\" atomName2=\"H22T\" />\n+ <Bond atomName1=\"O31\" atomName2=\"C31\" />\n+ <Bond atomName1=\"C31\" atomName2=\"C32\" />\n+ <Bond atomName1=\"C31\" atomName2=\"O32\" />\n+ <Bond atomName1=\"C32\" atomName2=\"H2X\" />\n+ <Bond atomName1=\"C32\" atomName2=\"H2Y\" />\n+ <Bond atomName1=\"C32\" atomName2=\"C33\" />\n+ <Bond atomName1=\"C33\" atomName2=\"H3X\" />\n+ <Bond atomName1=\"C33\" atomName2=\"H3Y\" />\n+ <Bond atomName1=\"C33\" atomName2=\"C34\" />\n+ <Bond atomName1=\"C34\" atomName2=\"H4X\" />\n+ <Bond atomName1=\"C34\" atomName2=\"H4Y\" />\n+ <Bond atomName1=\"C34\" atomName2=\"C35\" />\n+ <Bond atomName1=\"C35\" atomName2=\"H5X\" />\n+ <Bond atomName1=\"C35\" atomName2=\"H5Y\" />\n+ <Bond atomName1=\"C35\" atomName2=\"C36\" />\n+ <Bond atomName1=\"C36\" atomName2=\"H6X\" />\n+ <Bond atomName1=\"C36\" atomName2=\"H6Y\" />\n+ <Bond atomName1=\"C36\" atomName2=\"C37\" />\n+ <Bond atomName1=\"C37\" atomName2=\"H7X\" />\n+ <Bond atomName1=\"C37\" atomName2=\"H7Y\" />\n+ <Bond atomName1=\"C37\" atomName2=\"C38\" />\n+ <Bond atomName1=\"C38\" atomName2=\"H8X\" />\n+ <Bond atomName1=\"C38\" atomName2=\"H8Y\" />\n+ <Bond atomName1=\"C38\" atomName2=\"C39\" />\n+ <Bond atomName1=\"C39\" atomName2=\"H9X\" />\n+ <Bond atomName1=\"C39\" atomName2=\"H9Y\" />\n+ <Bond atomName1=\"C39\" atomName2=\"C310\" />\n+ <Bond atomName1=\"C310\" atomName2=\"H10X\" />\n+ <Bond atomName1=\"C310\" atomName2=\"H10Y\" />\n+ <Bond atomName1=\"C310\" atomName2=\"C311\" />\n+ <Bond atomName1=\"C311\" atomName2=\"H11X\" />\n+ <Bond atomName1=\"C311\" atomName2=\"H11Y\" />\n+ <Bond atomName1=\"C311\" atomName2=\"C312\" />\n+ <Bond atomName1=\"C312\" atomName2=\"H12X\" />\n+ <Bond atomName1=\"C312\" atomName2=\"H12Y\" />\n+ <Bond atomName1=\"C312\" atomName2=\"C313\" />\n+ <Bond atomName1=\"C313\" atomName2=\"H13X\" />\n+ <Bond atomName1=\"C313\" atomName2=\"H13Y\" />\n+ <Bond atomName1=\"C313\" atomName2=\"C314\" />\n+ <Bond atomName1=\"C314\" atomName2=\"H14X\" />\n+ <Bond atomName1=\"C314\" atomName2=\"H14Y\" />\n+ <Bond atomName1=\"C314\" atomName2=\"C315\" />\n+ <Bond atomName1=\"C315\" atomName2=\"H15X\" />\n+ <Bond atomName1=\"C315\" atomName2=\"H15Y\" />\n+ <Bond atomName1=\"C315\" atomName2=\"C316\" />\n+ <Bond atomName1=\"C316\" atomName2=\"H16X\" />\n+ <Bond atomName1=\"C316\" atomName2=\"H16Y\" />\n+ <Bond atomName1=\"C316\" atomName2=\"C317\" />\n+ <Bond atomName1=\"C317\" atomName2=\"H17X\" />\n+ <Bond atomName1=\"C317\" atomName2=\"H17Y\" />\n+ <Bond atomName1=\"C317\" atomName2=\"C318\" />\n+ <Bond atomName1=\"C318\" atomName2=\"H18X\" />\n+ <Bond atomName1=\"C318\" atomName2=\"H18Y\" />\n+ <Bond atomName1=\"C318\" atomName2=\"H18Z\" />\n+ </Residue>\n+ <Residue name=\"DAPG\">\n+ <Atom charge=\"0.193597\" name=\"C13\" type=\"cA\" />\n+ <Atom charge=\"0.034715\" name=\"H13A\" type=\"hE\" />\n+ <Atom charge=\"0.034715\" name=\"H13B\" type=\"hE\" />\n+ <Atom charge=\"-0.700871\" name=\"OC3\" type=\"oH\" />\n+ <Atom charge=\"0.423328\" name=\"HO3\" type=\"hO\" />\n+ <Atom charge=\"0.336816\" name=\"C12\" type=\"cA\" />\n+ <Atom charge=\"0.030042\" name=\"H12A\" type=\"hE\" />\n+ <Atom charge=\"-0.726192\" name=\"OC2\" type=\"oH\" />\n+ <Atom charge=\"0.439523\" name=\"HO2\" type=\"hO\" />\n+ <Atom charge=\"-0.056706\" name=\"C11\" type=\"cA\" />\n+ <Atom charge=\"0.093354\" name=\"H11A\" type=\"hE\" />\n+ <Atom charge=\"0.093354\" name=\"H11B\" type=\"hE\" />\n+ <Atom charge=\"1.380464\" name=\"P\" type=\"pA\" />\n+ <Atom charge=\"-0.873444\" name=\"O13\" type=\"oP\" />\n+ <Atom charge=\"-0.873444\" name=\"O14\" type=\"oP\" />\n+ <Atom charge=\"-0.534308\" name=\"O12\" type=\"oT\" />\n+ <Atom charge=\"-0.546098\" name=\"O11\" type=\"oT\" />\n+ <Atom charge=\"0.043713\" name=\"C1\" type=\"cA\" />\n+ <Atom charge=\"0.091041\" name=\"HA\" type=\"hE\" />\n+ <Atom charge=\"0.091041\" name=\"HB\" type=\"hE\" />\n+ <Atom charge=\"0.353807\" name=\"C2\" type=\"cA\" />\n+ <Atom charge=\"0.037488\" name=\"HS\" type=\"hE\" />\n+ <Atom charge=\"-0.599131\" name=\"O21\" type=\"oS\" />\n+ <Atom charge=\"0.883669\" name=\"C21\" type=\"cC\" />\n+ <Atom charge=\"-0.655762\" name=\"O22\" type=\"oC\" />\n+ <Atom charge=\"-0.123935\" name=\"C22\" type=\"cD\" />\n+ <Atom charge=\"0.024535\" name=\"H2R\" type=\"hL\" />\n+ <Atom charge=\"0.024535\" name=\"H2S\" type=\"hL\" />\n+ <Atom charge=\"0.295119\" name=\"C3\" type=\"cA\" />\n+ <Atom charge=\"0.033797\" name=\"HX\" type=\"hE\" />\n+ <Atom charge=\"0.033797\" name=\"HY\" type=\"hE\" />\n+ <Atom charge=\"-0.585165\" name=\"O31\" type=\"oS\" />\n+ <Atom charge=\"0.877006\" name=\"C31\" type=\"cC\" />\n+ <Atom charge=\"-0.649265\" name=\"O32\" type=\"oC\" />\n+ <Atom charge=\"-0.123935\" name=\"C32\" type=\"cD\" />\n+ <Atom charge=\"0.024535\" name=\"H2X\" type=\"hL\" />\n+ <Atom charge=\"0.024535\" name=\"H2Y\" type=\"hL\" />\n+ <Atom charge=\"0.025626\" name=\"C23\" type=\"cD\" />\n+ <Atom charge=\"0.025117\" name=\"H3R\" type=\"hL\" />\n+ <Atom charge=\"0.025117\" name=\"H3S\" type=\"hL\" />\n+ <Atom charge=\"0.031382\" name=\"C24\" type=\"cD\" />\n+ <Atom charge=\"0.038708\" name=\"H4R\" type=\"hL\" />\n+ <Atom charge=\"0.038708\" name=\"H4S\" type=\"hL\" />\n+ <Atom charge=\"-0.26789\" name=\"C25\" type=\"cB\" />\n+ <Atom charge=\"0.143577\" name=\"H5R\" type=\"hB\" />\n+ <Atom charge=\"-0.206786\" name=\"C26\" type=\"cB\" />\n+ <Atom charge=\"0.129858\" name=\"H6R\" type=\"hB\" />\n+ <Atom charge=\"0.055784\" name=\"C27\" type=\"cD\" />\n+ <Atom charge=\"0.062775\" name=\"H7R\" type=\"hL\" />\n+ <Atom charge=\"0.062775\" name=\"H7S\" type=\"hL\" />\n+ <Atom charge=\"-0.228527\" name=\"C28\" type=\"cB\" />\n+ <Atom charge=\"0.134735\" name=\"H8R\" type=\"hB\" />\n+ <Atom charge=\"-0.228694\" name=\"C29\" type=\"cB\" />\n+ <Atom charge=\"0.132167\" name=\"H9R\" type=\"hB\" />\n+ <Atom charge=\"0.095406\" name=\"C210\" type=\"cD\" />\n+ <Atom charge=\"0.05114\" name=\"H10R\" type=\"hL\" />\n+ <Atom charge=\"0.05114\" name=\"H10S\" type=\"hL\" />\n+ <Atom charge=\"-0.228704\" name=\"C211\" type=\"cB\" />\n+ <Atom charge=\"0.131341\" name=\"H11R\" type=\"hB\" />\n+ <Atom charge=\"-0.220164\" name=\"C212\" type=\"cB\" />\n+ <Atom charge=\"0.131986\" name=\"H12R\" type=\"hB\" />\n+ <Atom charge=\"0.058197\" name=\"C213\" type=\"cD\" />\n+ <Atom charge=\"0.06135\" name=\"H13R\" type=\"hL\" />\n+ <Atom charge=\"0.06135\" name=\"H13S\" type=\"hL\" />\n+ <Atom charge=\"-0.224769\" name=\"C214\" type=\"cB\" />\n+ <Atom charge=\"0.129616\" name=\"H14R\" type=\"hB\" />\n+ <Atom charge=\"-0.244149\" name=\"C215\" type=\"cB\" />\n+ <Atom charge=\"0.132793\" name=\"H15R\" type=\"hB\" />\n+ <Atom charge=\"0.0391\" name=\"C216\" type=\"cD\" />\n+ <Atom charge=\"0.028848\" name=\"H16R\" type=\"hL\" />\n+ <Atom charge=\"0.028848\" name=\"H16S\" type=\"hL\" />\n+ <Atom charge=\"-0.028398\" name=\"C217\" type=\"cD\" />\n+ <Atom charge=\"0.019581\" name=\"H17R\" type=\"hL\" />\n+ <Atom charge=\"0.019581\" name=\"H17S\" type=\"hL\" />\n+ <Atom charge=\"-0.019772\" name=\"C218\" type=\"cD\" />\n+ <Atom charge=\"0.014218\" name=\"H18R\" type=\"hL\" />\n+ <Atom charge=\"0.014218\" name=\"H18S\" type=\"hL\" />\n+ <Atom charge=\"0.024957\" name=\"C219\" type=\"cD\" />\n+ <Atom charge=\"0.005426\" name=\"H19R\" type=\"hL\" />\n+ <Atom charge=\"0.005426\" name=\"H19S\" type=\"hL\" />\n+ <Atom charge=\"-0.109302\" name=\"C220\" type=\"cD\" />\n+ <Atom charge=\"0.023723\" name=\"H20R\" type=\"hL\" />\n+ <Atom charge=\"0.023723\" name=\"H20S\" type=\"hL\" />\n+ <Atom charge=\"0.023723\" name=\"H20T\" type=\"hL\" />\n+ <Atom charge=\"0.025626\" name=\"C33\" type=\"cD\" />\n+ <Atom charge=\"0.025117\" name=\"H3X\" type=\"hL\" />\n+ <Atom charge=\"0.025117\" name=\"H3Y\" type=\"hL\" />\n+ <Atom charge=\"0.031382\" name=\"C34\" type=\"cD\" />\n+ <Atom charge=\"0.038708\" name=\"H4X\" type=\"hL\" />\n+ <Atom charge=\"0.038708\" name=\"H4Y\" type=\"hL\" />\n+ <Atom charge=\"-0.26789\" name=\"C35\" type=\"cB\" />\n+ <Atom charge=\"0.143577\" name=\"H5X\" type=\"hB\" />\n+ <Atom charge=\"-0.206786\" name=\"C36\" type=\"cB\" />\n+ <Atom charge=\"0.129858\" name=\"H6X\" type=\"hB\" />\n+ <Atom charge=\"0.055784\" name=\"C37\" type=\"cD\" />\n+ <Atom charge=\"0.062775\" name=\"H7X\" type=\"hL\" />\n+ <Atom charge=\"0.062775\" name=\"H7Y\" type=\"hL\" />\n+ <Atom charge=\"-0.228527\" name=\"C38\" type=\"cB\" />\n+ <Atom charge=\"0.134735\" name=\"H8X\" type=\"hB\" />\n+ <Atom charge=\"-0.228694\" name=\"C39\" type=\"cB\" />\n+ <Atom charge=\"0.132167\" name=\"H9X\" type=\"hB\" />\n+ <Atom charge=\"0.095406\" name=\"C310\" type=\"cD\" />\n+ <Atom charge=\"0.05114\" name=\"H10X\" type=\"hL\" />\n+ <Atom charge=\"0.05114\" name=\"H10Y\" type=\"hL\" />\n+ <Atom charge=\"-0.228704\" name=\"C311\" type=\"cB\" />\n+ <Atom charge=\"0.131341\" name=\"H11X\" type=\"hB\" />\n+ <Atom charge=\"-0.220164\" name=\"C312\" type=\"cB\" />\n+ <Atom charge=\"0.131986\" name=\"H12X\" type=\"hB\" />\n+ <Atom charge=\"0.058197\" name=\"C313\" type=\"cD\" />\n+ <Atom charge=\"0.06135\" name=\"H13X\" type=\"hL\" />\n+ <Atom charge=\"0.06135\" name=\"H13Y\" type=\"hL\" />\n+ <Atom charge=\"-0.224769\" name=\"C314\" type=\"cB\" />\n+ <Atom charge=\"0.129616\" name=\"H14X\" type=\"hB\" />\n+ <Atom charge=\"-0.244149\" name=\"C315\" type=\"cB\" />\n+ <Atom charge=\"0.132793\" name=\"H15X\" type=\"hB\" />\n+ <Atom charge=\"0.0391\" name=\"C316\" type=\"cD\" />\n+ <Atom charge=\"0.028848\" name=\"H16X\" type=\"hL\" />\n+ <Atom charge=\"0.028848\" name=\"H16Y\" type=\"hL\" />\n+ <Atom charge=\"-0.028398\" name=\"C317\" type=\"cD\" />\n+ <Atom charge=\"0.019581\" name=\"H17X\" type=\"hL\" />\n+ <Atom charge=\"0.019581\" name=\"H17Y\" type=\"hL\" />\n+ <Atom charge=\"-0.019772\" name=\"C318\" type=\"cD\" />\n+ <Atom charge=\"0.014218\" name=\"H18X\" type=\"hL\" />\n+ <Atom charge=\"0.014218\" name=\"H18Y\" type=\"hL\" />\n+ <Atom charge=\"0.024957\" name=\"C319\" type=\"cD\" />\n+ <Atom charge=\"0.005426\" name=\"H19X\" type=\"hL\" />\n+ <Atom charge=\"0.005426\" name=\"H19Y\" type=\"hL\" />\n+ <Atom charge=\"-0.109302\" name=\"C320\" type=\"cD\" />\n+ <Atom charge=\"0.023723\" name=\"H20X\" type=\"hL\" />\n+ <Atom charge=\"0.023723\" name=\"H20Y\" type=\"hL\" />\n+ <Atom charge=\"0.023723\" name=\"H20Z\" type=\"hL\" />\n+ <Bond atomName1=\"HO3\" atomName2=\"OC3\" />\n+ <Bond atomName1=\"OC3\" atomName2=\"C13\" />\n+ <Bond atomName1=\"C13\" atomName2=\"H13A\" />\n+ <Bond atomName1=\"C13\" atomName2=\"H13B\" />\n+ <Bond atomName1=\"C13\" atomName2=\"C12\" />\n+ <Bond atomName1=\"HO2\" atomName2=\"OC2\" />\n+ <Bond atomName1=\"OC2\" atomName2=\"C12\" />\n+ <Bond atomName1=\"C12\" atomName2=\"H12A\" />\n+ <Bond atomName1=\"C12\" atomName2=\"C11\" />\n+ <Bond atomName1=\"C11\" atomName2=\"H11A\" />\n+ <Bond atomName1=\"C11\" atomName2=\"H11B\" />\n+ <Bond atomName1=\"C11\" atomName2=\"O12\" />\n+ <Bond atomName1=\"O11\" atomName2=\"C1\" />\n+ <Bond atomName1=\"O12\" atomName2=\"P\" />\n+ <Bond atomName1=\"P\" atomName2=\"O11\" />\n+ <Bond atomName1=\"P\" atomName2=\"O13\" />\n+ <Bond atomName1=\"P\" atomName2=\"O14\" />\n+ <Bond atomName1=\"C1\" atomName2=\"HA\" />\n+ <Bond atomName1=\"C1\" atomName2=\"HB\" />\n+ <Bond atomName1=\"C1\" atomName2=\"C2\" />\n+ <Bond atomName1=\"C2\" atomName2=\"HS\" />\n+ <Bond atomName1=\"C2\" atomName2=\"C3\" />\n+ <Bond atomName1=\"C2\" atomName2=\"O21\" />\n+ <Bond atomName1=\"C3\" atomName2=\"HX\" />\n+ <Bond atomName1=\"C3\" atomName2=\"HY\" />\n+ <Bond atomName1=\"C3\" atomName2=\"O31\" />\n+ <Bond atomName1=\"C21\" atomName2=\"O21\" />\n+ <Bond atomName1=\"C21\" atomName2=\"C22\" />\n+ <Bond atomName1=\"C21\" atomName2=\"O22\" />\n+ <Bond atomName1=\"C22\" atomName2=\"C23\" />\n+ <Bond atomName1=\"C22\" atomName2=\"H2R\" />\n+ <Bond atomName1=\"C22\" atomName2=\"H2S\" />\n+ <Bond atomName1=\"C23\" atomName2=\"C24\" />\n+ <Bond atomName1=\"C23\" atomName2=\"H3R\" />\n+ <Bond atomName1=\"C23\" atomName2=\"H3S\" />\n+ <Bond atomName1=\"C24\" atomName2=\"C25\" />\n+ <Bond atomName1=\"C24\" atomName2=\"H4R\" />\n+ <Bond atomName1=\"C24\" atomName2=\"H4S\" />\n+ <Bond atomName1=\"C25\" atomName2=\"C26\" />\n+ <Bond atomName1=\"C25\" atomName2=\"H5R\" />\n+ <Bond atomName1=\"C26\" atomName2=\"C27\" />\n+ <Bond atomName1=\"C26\" atomName2=\"H6R\" />\n+ <Bond atomName1=\"C27\" atomName2=\"C28\" />\n+ <Bond atomName1=\"C27\" atomName2=\"H7R\" />\n+ <Bond atomName1=\"C27\" atomName2=\"H7S\" />\n+ <Bond atomName1=\"C28\" atomName2=\"C29\" />\n+ <Bond atomName1=\"C28\" atomName2=\"H8R\" />\n+ <Bond atomName1=\"C29\" atomName2=\"C210\" />\n+ <Bond atomName1=\"C29\" atomName2=\"H9R\" />\n+ <Bond atomName1=\"C210\" atomName2=\"C211\" />\n+ <Bond atomName1=\"C210\" atomName2=\"H10R\" />\n+ <Bond atomName1=\"C210\" atomName2=\"H10S\" />\n+ <Bond atomName1=\"C211\" atomName2=\"C212\" />\n+ <Bond atomName1=\"C211\" atomName2=\"H11R\" />\n+ <Bond atomName1=\"C212\" atomName2=\"C213\" />\n+ <Bond atomName1=\"C212\" atomName2=\"H12R\" />\n+ <Bond atomName1=\"C213\" atomName2=\"C214\" />\n+ <Bond atomName1=\"C213\" atomName2=\"H13R\" />\n+ <Bond atomName1=\"C213\" atomName2=\"H13S\" />\n+ <Bond atomName1=\"C214\" atomName2=\"C215\" />\n+ <Bond atomName1=\"C214\" atomName2=\"H14R\" />\n+ <Bond atomName1=\"C215\" atomName2=\"C216\" />\n+ <Bond atomName1=\"C215\" atomName2=\"H15R\" />\n+ <Bond atomName1=\"C216\" atomName2=\"C217\" />\n+ <Bond atomName1=\"C216\" atomName2=\"H16R\" />\n+ <Bond atomName1=\"C216\" atomName2=\"H16S\" />\n+ <Bond atomName1=\"C217\" atomName2=\"C218\" />\n+ <Bond atomName1=\"C217\" atomName2=\"H17R\" />\n+ <Bond atomName1=\"C217\" atomName2=\"H17S\" />\n+ <Bond atomName1=\"C218\" atomName2=\"C219\" />\n+ <Bond atomName1=\"C218\" atomName2=\"H18R\" />\n+ <Bond atomName1=\"C218\" atomName2=\"H18S\" />\n+ <Bond atomName1=\"C219\" atomName2=\"C220\" />\n+ <Bond atomName1=\"C219\" atomName2=\"H19R\" />\n+ <Bond atomName1=\"C219\" atomName2=\"H19S\" />\n+ <Bond atomName1=\"C220\" atomName2=\"H20T\" />\n+ <Bond atomName1=\"C220\" atomName2=\"H20R\" />\n+ <Bond atomName1=\"C220\" atomName2=\"H20S\" />\n+ <Bond atomName1=\"C31\" atomName2=\"O31\" />\n+ <Bond atomName1=\"C31\" atomName2=\"C32\" />\n+ <Bond atomName1=\"C31\" atomName2=\"O32\" />\n+ <Bond atomName1=\"C32\" atomName2=\"C33\" />\n+ <Bond atomName1=\"C32\" atomName2=\"H2X\" />\n+ <Bond atomName1=\"C32\" atomName2=\"H2Y\" />\n+ <Bond atomName1=\"C33\" atomName2=\"C34\" />\n+ <Bond atomName1=\"C33\" atomName2=\"H3X\" />\n+ <Bond atomName1=\"C33\" atomName2=\"H3Y\" />\n+ <Bond atomName1=\"C34\" atomName2=\"C35\" />\n+ <Bond atomName1=\"C34\" atomName2=\"H4X\" />\n+ <Bond atomName1=\"C34\" atomName2=\"H4Y\" />\n+ <Bond atomName1=\"C35\" atomName2=\"C36\" />\n+ <Bond atomName1=\"C35\" atomName2=\"H5X\" />\n+ <Bond atomName1=\"C36\" atomName2=\"C37\" />\n+ <Bond atomName1=\"C36\" atomName2=\"H6X\" />\n+ <Bond atomName1=\"C37\" atomName2=\"C38\" />\n+ <Bond atomName1=\"C37\" atomName2=\"H7X\" />\n+ <Bond atomName1=\"C37\" atomName2=\"H7Y\" />\n+ <Bond atomName1=\"C38\" atomName2=\"C39\" />\n+ <Bond atomName1=\"C38\" atomName2=\"H8X\" />\n+ <Bond atomName1=\"C39\" atomName2=\"C310\" />\n+ <Bond atomName1=\"C39\" atomName2=\"H9X\" />\n+ <Bond atomName1=\"C310\" atomName2=\"C311\" />\n+ <Bond atomName1=\"C310\" atomName2=\"H10X\" />\n+ <Bond atomName1=\"C310\" atomName2=\"H10Y\" />\n+ <Bond atomName1=\"C311\" atomName2=\"C312\" />\n+ <Bond atomName1=\"C311\" atomName2=\"H11X\" />\n+ <Bond atomName1=\"C312\" atomName2=\"C313\" />\n+ <Bond atomName1=\"C312\" atomName2=\"H12X\" />\n+ <Bond atomName1=\"C313\" atomName2=\"C314\" />\n+ <Bond atomName1=\"C313\" atomName2=\"H13X\" />\n+ <Bond atomName1=\"C313\" atomName2=\"H13Y\" />\n+ <Bond atomName1=\"C314\" atomName2=\"C315\" />\n+ <Bond atomName1=\"C314\" atomName2=\"H14X\" />\n+ <Bond atomName1=\"C315\" atomName2=\"C316\" />\n+ <Bond atomName1=\"C315\" atomName2=\"H15X\" />\n+ <Bond atomName1=\"C316\" atomName2=\"C317\" />\n+ <Bond atomName1=\"C316\" atomName2=\"H16X\" />\n+ <Bond atomName1=\"C316\" atomName2=\"H16Y\" />\n+ <Bond atomName1=\"C317\" atomName2=\"C318\" />\n+ <Bond atomName1=\"C317\" atomName2=\"H17X\" />\n+ <Bond atomName1=\"C317\" atomName2=\"H17Y\" />\n+ <Bond atomName1=\"C318\" atomName2=\"C319\" />\n+ <Bond atomName1=\"C318\" atomName2=\"H18X\" />\n+ <Bond atomName1=\"C318\" atomName2=\"H18Y\" />\n+ <Bond atomName1=\"C319\" atomName2=\"C320\" />\n+ <Bond atomName1=\"C319\" atomName2=\"H19X\" />\n+ <Bond atomName1=\"C319\" atomName2=\"H19Y\" />\n+ <Bond atomName1=\"C320\" atomName2=\"H20Z\" />\n+ <Bond atomName1=\"C320\" atomName2=\"H20X\" />\n+ <Bond atomName1=\"C320\" atomName2=\"H20Y\" />\n+ </Residue>\n+ </Residues>\n+ <HarmonicBondForce>\n+ <Bond class1=\"cC\" class2=\"cD\" length=\"0.15080000000000002\" k=\"274721.43999999994\" />\n+ <Bond class1=\"cD\" class2=\"cD\" length=\"0.1535\" k=\"253634.07999999996\" />\n+ <Bond class1=\"cA\" class2=\"cD\" length=\"0.1535\" k=\"253634.07999999996\" />\n+ <Bond class1=\"cC\" class2=\"oC\" length=\"0.12140000000000001\" k=\"542246.3999999999\" />\n+ <Bond class1=\"oS\" class2=\"cC\" length=\"0.1343\" k=\"344175.83999999997\" />\n+ <Bond class1=\"nA\" class2=\"cA\" length=\"0.1499\" k=\"245684.47999999998\" />\n+ <Bond class1=\"cA\" class2=\"cA\" length=\"0.1535\" k=\"253634.07999999996\" />\n+ <Bond class1=\"pA\" class2=\"oT\" length=\"0.16100000000000003\" k=\"192463.99999999997\" />\n+ <Bond class1=\"pA\" class2=\"oP\" length=\"0.148\" k=\"439319.99999999994\" />\n+ <Bond class1=\"cA\" class2=\"oT\" length=\"0.1439\" k=\"252295.19999999995\" />\n+ <Bond class1=\"cA\" class2=\"oS\" length=\"0.1439\" k=\"252295.19999999995\" />\n+ <Bond class1=\"cA\" class2=\"hA\" length=\"0.10920000000000002\" k=\"282252.63999999996\" />\n+ <Bond class1=\"cD\" class2=\"hL\" length=\"0.10920000000000002\" k=\"282252.63999999996\" />\n+ <Bond class1=\"cA\" class2=\"hX\" length=\"0.1091\" k=\"283424.1599999999\" />\n+ <Bond class1=\"cA\" class2=\"hE\" length=\"0.10930000000000001\" k=\"281081.11999999994\" />\n+ <Bond class1=\"cB\" class2=\"cB\" length=\"0.13240000000000002\" k=\"493460.95999999996\" />\n+ <Bond class1=\"cB\" class2=\"cD\" length=\"0.15080000000000002\" k=\"274721.43999999994\" />\n+ <Bond class1=\"cB\" class2=\"cA\" length=\"0.15080000000000002\" k=\"274721.43999999994\" />\n+ <Bond class1=\"cB\" class2=\"hB\" length=\"0.1087\" k=\"288110.23999999993\" />\n+ <Bond class1=\"cA\" class2=\"cC\" length=\"0.15080000000000002\" k=\"274721.43999999994\" />\n+ <Bond class1=\"cC\" class2=\"oO\" length=\"0.12140000000000001\" k=\"542246.3999999999\" />\n+ <Bond class1=\"hN\" class2=\"nA\" length=\"0.1033\" k=\"308779.19999999995\" />\n+ <Bond class1=\"cA\" class2=\"oH\" length=\"0.1426\" k=\"262838.87999999995\" />\n+ <Bond class1=\"hO\" class2=\"oH\" length=\"0.0974\" k=\"309281.27999999997\" />\n+ <Bond class1=\"oH\" class2=\"pA\" length=\"0.1625\" k=\"268780.1599999999\" />\n+ <Bond class1=\"cC\" class2=\"nN\" length=\"0.1345\" k=\"400157.7599999999\" />\n+ <Bond class1=\"cA\" class2=\"nN\" length=\"0.146\" k=\"276646.07999999996\" />\n+ <Bond class1=\"hN\" class2=\"nN\" length=\"0.10089999999999999\" k=\"343255.3599999999\" />\n+ </HarmonicBondForce>\n+ <HarmonicAngleForce>\n+ <Angle class1=\"cD\" class2=\"cD\" class3=\"cD\" angle=\"1.9556414268596463\" k=\"394.9696\" />\n+ <Angle class1=\"cD\" class2=\"cC\" class3=\"oC\" angle=\"2.148674842130219\" k=\"569.27504\" />\n+ <Angle class1=\"cD\" class2=\"cC\" class3=\"oS\" angle=\"1.9540706305328512\" k=\"579.5676800000001\" />\n+ <Angle class1=\"cD\" class2=\"cD\" class3=\"cC\" angle=\"1.9291124222293325\" k=\"533.79472\" />\n+ <Angle class1=\"hA\" class2=\"cA\" class3=\"hA\" angle=\"1.8910642445358559\" k=\"329.95024\" />\n+ <Angle class1=\"cA\" class2=\"cA\" class3=\"hA\" angle=\"1.9207348418197596\" k=\"388.02416\" />\n+ <Angle class1=\"cD\" class2=\"cA\" class3=\"hA\" angle=\"1.9207348418197596\" k=\"388.02416\" />\n+ <Angle class1=\"cA\" class2=\"cD\" class3=\"hL\" angle=\"1.9207348418197596\" k=\"388.02416\" />\n+ <Angle class1=\"cA\" class2=\"cA\" class3=\"cA\" angle=\"1.9308577514813268\" k=\"528.94128\" />\n+ <Angle class1=\"cD\" class2=\"cD\" class3=\"cA\" angle=\"1.9308577514813268\" k=\"528.94128\" />\n+ <Angle class1=\"cA\" class2=\"cA\" class3=\"cD\" angle=\"1.9308577514813268\" k=\"528.94128\" />\n+ <Angle class1=\"cA\" class2=\"cA\" class3=\"cB\" angle=\"1.9449949184224808\" k=\"531.61904\" />\n+ <Angle class1=\"cA\" class2=\"cB\" class3=\"cB\" angle=\"2.1540853628114016\" k=\"538.31344\" />\n+ <Angle class1=\"cA\" class2=\"cB\" class3=\"cA\" angle=\"2.033657644423793\" k=\"524.6736000000001\" />\n+ <Angle class1=\"cA\" class2=\"cB\" class3=\"hB\" angle=\"2.0472712125893486\" k=\"382.08288\" />\n+ <Angle class1=\"cB\" class2=\"cA\" class3=\"hA\" angle=\"1.9284142905285346\" k=\"393.54704000000004\" />\n+ <Angle class1=\"oS\" class2=\"cC\" class3=\"oC\" angle=\"2.152514566484607\" k=\"635.3822400000001\" />\n+ <Angle class1=\"oP\" class2=\"pA\" class3=\"oP\" angle=\"2.092649773141201\" k=\"1171.52\" />\n+ <Angle class1=\"cA\" class2=\"nA\" class3=\"cA\" angle=\"1.9310322844065262\" k=\"525.8451200000001\" />\n+ <Angle class1=\"cA\" class2=\"cA\" class3=\"nA\" angle=\"1.9952604008799175\" k=\"539.3176000000001\" />\n+ <Angle class1=\"oT\" class2=\"pA\" class3=\"oP\" angle=\"1.888969849433463\" k=\"836.8000000000001\" />\n+ <Angle class1=\"oT\" class2=\"cA\" class3=\"cA\" angle=\"1.892285975012252\" k=\"567.18304\" />\n+ <Angle class1=\"pA\" class2=\"oT\" class3=\"cA\" angle=\"2.1031217486531673\" k=\"836.8000000000001\" />\n+ <Angle class1=\"oT\" class2=\"pA\" class3=\"oT\" angle=\"1.790707812546182\" k=\"753.12\" />\n+ <Angle class1=\"cA\" class2=\"cA\" class3=\"oS\" angle=\"1.892285975012252\" k=\"567.18304\" />\n+ <Angle class1=\"cA\" class2=\"oS\" class3=\"cC\" angle=\"2.0095721007462712\" k=\"532.4558400000001\" />\n+ <Angle class1=\"hL\" class2=\"cD\" class3=\"cC\" angle=\"1.9142771235873808\" k=\"394.9696\" />\n+ <Angle class1=\"hL\" class2=\"cD\" class3=\"hL\" angle=\"1.8910642445358559\" k=\"329.95024\" />\n+ <Angle class1=\"hL\" class2=\"cD\" class3=\"cD\" angle=\"1.9207348418197596\" k=\"388.02416\" />\n+ <Angle class1=\"hX\" class2=\"cA\" class3=\"hX\" angle=\"1.9327776136585204\" k=\"326.68672\" />\n+ <Angle class1=\"nA\" class2=\"cA\" class3=\"hX\" angle=\"1.8833847958270808\" k=\"410.19936000000007\" />\n+ <Angle class1=\"hE\" class2=\"cA\" class3=\"cA\" angle=\"1.9210839076701585\" k=\"387.94048000000004\" />\n+ <Angle class1=\"hE\" class2=\"cA\" class3=\"hE\" angle=\"1.912008195559788\" k=\"327.85824\" />\n+ <Angle class1=\"cA\" class2=\"cA\" class3=\"hX\" angle=\"1.9502309061784637\" k=\"385.09536\" />\n+ <Angle class1=\"oT\" class2=\"cA\" class3=\"hE\" angle=\"1.8992672920202294\" k=\"425.42912000000007\" />\n+ <Angle class1=\"hE\" class2=\"cA\" class3=\"oS\" angle=\"1.8992672920202294\" k=\"425.42912000000007\" />\n+ <Angle class1=\"cB\" class2=\"cB\" class3=\"cD\" angle=\"2.1540853628114016\" k=\"538.31344\" />\n+ <Angle class1=\"cB\" class2=\"cD\" class3=\"hL\" angle=\"1.9284142905285346\" k=\"393.54704000000004\" />\n+ <Angle class1=\"cB\" class2=\"cD\" class3=\"cD\" angle=\"1.9449949184224808\" k=\"531.61904\" />\n+ <Angle class1=\"cB\" class2=\"cB\" class3=\"hB\" angle=\"2.1108011973619423\" k=\"418.73472\" />\n+ <Angle class1=\"cD\" class2=\"cB\" class3=\"hB\" angle=\"2.0472712125893486\" k=\"382.08288\" />\n+ <Angle class1=\"cA\" class2=\"cC\" class3=\"oO\" angle=\"2.148674842130219\" k=\"569.27504\" />\n+ <Angle class1=\"oO\" class2=\"cC\" class3=\"oO\" angle=\"2.275560278750207\" k=\"654.12656\" />\n+ <Angle class1=\"cA\" class2=\"nA\" class3=\"hN\" angle=\"1.9217820393709562\" k=\"386.51792\" />\n+ <Angle class1=\"hN\" class2=\"nA\" class3=\"hN\" angle=\"1.8868754543310697\" k=\"339.07136\" />\n+ <Angle class1=\"cA\" class2=\"cA\" class3=\"cC\" angle=\"1.9291124222293325\" k=\"533.79472\" />\n+ <Angle class1=\"cC\" class2=\"cA\" class3=\"nA\" angle=\"1.9933405387027237\" k=\"544.50576\" />\n+ <Angle class1=\"cC\" class2=\"cA\" class3=\"hX\" angle=\"1.9118336626345886\" k=\"395.22064\" />\n+ <Angle class1=\"hE\" class2=\"cA\" class3=\"oH\" angle=\"1.9177677820913692\" k=\"426.51696\" />\n+ <Angle class1=\"cA\" class2=\"oH\" class3=\"hO\" angle=\"1.8877481189570668\" k=\"394.04912\" />\n+ <Angle class1=\"cA\" class2=\"cA\" class3=\"oH\" angle=\"1.909913800457395\" k=\"566.68096\" />\n+ <Angle class1=\"hO\" class2=\"oH\" class3=\"pA\" angle=\"1.9223056381465546\" k=\"467.60384000000005\" />\n+ <Angle class1=\"oH\" class2=\"pA\" class3=\"oT\" angle=\"1.7866935552665952\" k=\"375.80688\" />\n+ <Angle class1=\"oP\" class2=\"pA\" class3=\"oH\" angle=\"2.0116664958486643\" k=\"366.43472\" />\n+ <Angle class1=\"cB\" class2=\"cD\" class3=\"cB\" angle=\"1.9561650256352445\" k=\"534.96624\" />\n+ <Angle class1=\"cA\" class2=\"cA\" class3=\"nN\" angle=\"1.9570376902612416\" k=\"551.0328\" />\n+ <Angle class1=\"cA\" class2=\"nN\" class3=\"cC\" angle=\"2.117957047295119\" k=\"534.88256\" />\n+ <Angle class1=\"cA\" class2=\"nN\" class3=\"hN\" angle=\"2.0381955004789782\" k=\"385.26272\" />\n+ <Angle class1=\"cC\" class2=\"nN\" class3=\"hN\" angle=\"2.0675170319124825\" k=\"411.78928\" />\n+ <Angle class1=\"cD\" class2=\"cC\" class3=\"nN\" angle=\"2.0097466336714707\" k=\"567.85248\" />\n+ <Angle class1=\"hE\" class2=\"cA\" class3=\"nN\" angle=\"1.907993938280201\" k=\"416.89376000000004\" />\n+ <Angle class1=\"nN\" class2=\"cC\" class3=\"oC\" angle=\"2.12982528620868\" k=\"634.54544\" />\n+ <Angle class1=\"cB\" class2=\"cA\" class3=\"oH\" angle=\"1.9235273686229506\" k=\"570.53024\" />\n+ <Angle class1=\"cB\" class2=\"cA\" class3=\"hE\" angle=\"1.9278906917529364\" k=\"393.54704000000004\" />\n+ </HarmonicAngleForce>\n+ <PeriodicTorsionForce ordering=\"amber\">\n+ <Proper class1=\"cD\" class2=\"cD\" class3=\"cD\" class4=\"cD\" periodicity1=\"5\" phase1=\"0.0\" k1=\"0.41840000000000005\" periodicity2=\"4\" phase2=\"0.0\" k2=\"0.41840000000000005\" periodicity3=\"3\" phase3=\"0.0\" k3=\"1.2552\" periodicity4=\"2\" phase4=\"0.0\" k4=\"0.41840000000000005\" periodicity5=\"1\" phase5=\"0.0\" k5=\"0.41840000000000005\" />\n+ <Proper class1=\"cA\" class2=\"oT\" class3=\"pA\" class4=\"oP\" periodicity1=\"5\" phase1=\"0.0\" k1=\"0.0\" periodicity2=\"4\" phase2=\"0.0\" k2=\"0.0\" periodicity3=\"3\" phase3=\"0.0\" k3=\"0.0\" periodicity4=\"2\" phase4=\"0.0\" k4=\"0.8368000000000001\" periodicity5=\"1\" phase5=\"0.0\" k5=\"0.0\" />\n+ <Proper class1=\"hE\" class2=\"cA\" class3=\"oT\" class4=\"pA\" periodicity1=\"5\" phase1=\"0.0\" k1=\"0.0\" periodicity2=\"4\" phase2=\"0.0\" k2=\"0.0\" periodicity3=\"3\" phase3=\"0.0\" k3=\"1.6024720000000001\" periodicity4=\"2\" phase4=\"0.0\" k4=\"0.0\" periodicity5=\"1\" phase5=\"0.0\" k5=\"0.0\" />\n+ <Proper class1=\"oS\" class2=\"cA\" class3=\"cA\" class4=\"cA\" periodicity1=\"5\" phase1=\"0.0\" k1=\"0.0\" periodicity2=\"4\" phase2=\"0.0\" k2=\"0.0\" periodicity3=\"3\" phase3=\"0.0\" k3=\"0.0\" periodicity4=\"2\" phase4=\"0.0\" k4=\"0.0\" periodicity5=\"1\" phase5=\"0.0\" k5=\"0.0\" />\n+ <Proper class1=\"oT\" class2=\"cA\" class3=\"cA\" class4=\"oS\" periodicity1=\"5\" phase1=\"0.0\" k1=\"0.0\" periodicity2=\"4\" phase2=\"0.0\" k2=\"0.0\" periodicity3=\"3\" phase3=\"0.0\" k3=\"0.0\" periodicity4=\"2\" phase4=\"0.0\" k4=\"0.0\" periodicity5=\"1\" phase5=\"0.0\" k5=\"0.0\" />\n+ <Proper class1=\"cC\" class2=\"oS\" class3=\"cA\" class4=\"cA\" periodicity1=\"3\" phase1=\"5.235987755982989\" k1=\"-0.8368000000000001\" periodicity2=\"2\" phase2=\"4.1887902047863905\" k2=\"-1.2552\" periodicity3=\"1\" phase3=\"0.0\" k3=\"-0.41840000000000005\" />\n+ <Proper class1=\"oS\" class2=\"cA\" class3=\"cA\" class4=\"oS\" periodicity1=\"3\" phase1=\"0.0\" k1=\"4.184\" periodicity2=\"2\" phase2=\"0.0\" k2=\"1.2552\" periodicity3=\"1\" phase3=\"3.141592653589793\" k3=\"-0.41840000000000005\" />\n+ <Proper class1=\"cA\" class2=\"oT\" class3=\"pA\" class4=\"oT\" periodicity1=\"3\" phase1=\"0.0\" k1=\"2.5104\" periodicity2=\"2\" phase2=\"0.0\" k2=\"9.623199999999999\" />\n+ <Proper class1=\"cA\" class2=\"cA\" class3=\"oT\" class4=\"pA\" periodicity1=\"3\" phase1=\"0.0\" k1=\"0.0\" periodicity2=\"2\" phase2=\"3.141592653589793\" k2=\"-3.3472000000000004\" />\n+ <Proper class1=\"cA\" class2=\"cA\" class3=\"cA\" class4=\"oT\" periodicity1=\"3\" phase1=\"1.0471975511965976\" k1=\"1.6736000000000002\" periodicity2=\"2\" phase2=\"2.0943951023931953\" k2=\"0.8368000000000001\" periodicity3=\"1\" phase3=\"3.141592653589793\" k3=\"3.3472000000000004\" />\n+ <Proper class1=\"nA\" class2=\"cA\" class3=\"cA\" class4=\"oT\" periodicity1=\"3\" phase1=\"0.0\" k1=\"4.184\" />\n+ <Proper class1=\"cD\" class2=\"cB\" class3=\"cB\" class4=\"cD\" periodicity1=\"5\" phase1=\"0.0\" k1=\"0.0\" periodicity2=\"4\" phase2=\"0.0\" k2=\"0.0\" periodicity3=\"3\" phase3=\"0.0\" k3=\"2.5104\" periodicity4=\"2\" phase4=\"3.141592653589793\" k4=\"13.8072\" periodicity5=\"1\" phase5=\"3.141592653589793\" k5=\"7.1128\" />\n+ <Proper class1=\"cA\" class2=\"cB\" class3=\"cB\" class4=\"cA\" periodicity1=\"2\" phase1=\"3.141592653589793\" k1=\"27.823600000000003\" periodicity2=\"1\" phase2=\"3.141592653589793\" k2=\"7.9496\" />\n+ <Proper class1=\"cD\" class2=\"cB\" class3=\"cB\" class4=\"cA\" periodicity1=\"2\" phase1=\"3.141592653589793\" k1=\"27.823600000000003\" periodicity2=\"1\" phase2=\"3.141592653589793\" k2=\"7.9496\" />\n+ <Proper class1=\"cB\" class2=\"cB\" class3=\"cD\" class4=\"cD\" periodicity1=\"5\" phase1=\"3.141592653589793\" k1=\"0.8368000000000001\" periodicity2=\"4\" phase2=\"3.141592653589793\" k2=\"0.8368000000000001\" periodicity3=\"3\" phase3=\"3.141592653589793\" k3=\"1.6736000000000002\" periodicity4=\"2\" phase4=\"3.141592653589793\" k4=\"1.6736000000000002\" periodicity5=\"1\" phase5=\"0.0\" k5=\"2.5104\" />\n+ <Proper class1=\"cA\" class2=\"cA\" class3=\"cB\" class4=\"cB\" periodicity1=\"2\" phase1=\"0.0\" k1=\"0.0\" />\n+ <Proper class1=\"cB\" class2=\"cD\" class3=\"cD\" class4=\"cD\" periodicity1=\"5\" phase1=\"0.0\" k1=\"0.41840000000000005\" periodicity2=\"4\" phase2=\"0.0\" k2=\"0.0\" periodicity3=\"3\" phase3=\"0.0\" k3=\"2.092\" periodicity4=\"2\" phase4=\"0.0\" k4=\"0.0\" periodicity5=\"1\" phase5=\"0.0\" k5=\"0.0\" />\n+ <Proper class1=\"cB\" class2=\"cA\" class3=\"cA\" class4=\"cA\" periodicity1=\"5\" phase1=\"0.0\" k1=\"0.0\" periodicity2=\"4\" phase2=\"0.0\" k2=\"0.0\" periodicity3=\"3\" phase3=\"0.0\" k3=\"0.0\" periodicity4=\"2\" phase4=\"0.0\" k4=\"0.0\" periodicity5=\"1\" phase5=\"0.0\" k5=\"0.0\" />\n+ <Proper class1=\"cD\" class2=\"cD\" class3=\"cC\" class4=\"oC\" periodicity1=\"2\" phase1=\"3.141592653589793\" k1=\"0.0\" />\n+ <Proper class1=\"cD\" class2=\"cD\" class3=\"cC\" class4=\"oS\" periodicity1=\"2\" phase1=\"3.141592653589793\" k1=\"0.0\" />\n+ <Proper class1=\"cD\" class2=\"cC\" class3=\"oS\" class4=\"cA\" periodicity1=\"2\" phase1=\"3.141592653589793\" k1=\"11.296800000000001\" />\n+ <Proper class1=\"cC\" class2=\"cD\" class3=\"cD\" class4=\"cD\" periodicity1=\"3\" phase1=\"0.0\" k1=\"0.6527040000000001\" />\n+ <Proper class1=\"cA\" class2=\"cA\" class3=\"nA\" class4=\"cA\" periodicity1=\"3\" phase1=\"0.0\" k1=\"0.6527040000000001\" />\n+ <Proper class1=\"cA\" class2=\"oS\" class3=\"cC\" class4=\"oC\" periodicity1=\"2\" phase1=\"3.141592653589793\" k1=\"11.296800000000001\" periodicity2=\"1\" phase2=\"3.141592653589793\" k2=\"5.8576\" />\n+ <Proper class1=\"hL\" class2=\"cD\" class3=\"cC\" class4=\"oC\" periodicity1=\"3\" phase1=\"3.141592653589793\" k1=\"0.33472\" periodicity2=\"1\" phase2=\"0.0\" k2=\"3.3472000000000004\" />\n+ <Proper class1=\"hL\" class2=\"cD\" class3=\"cC\" class4=\"oS\" periodicity1=\"2\" phase1=\"3.141592653589793\" k1=\"0.0\" />\n+ <Proper class1=\"hL\" class2=\"cD\" class3=\"cD\" class4=\"hL\" periodicity1=\"3\" phase1=\"0.0\" k1=\"0.6276\" />\n+ <Proper class1=\"hL\" class2=\"cD\" class3=\"cD\" class4=\"cC\" periodicity1=\"3\" phase1=\"0.0\" k1=\"0.6527040000000001\" />\n+ <Proper class1=\"hL\" class2=\"cD\" class3=\"cD\" class4=\"cD\" periodicity1=\"3\" phase1=\"0.0\" k1=\"0.66944\" />\n+ <Proper class1=\"hX\" class2=\"cA\" class3=\"nA\" class4=\"cA\" periodicity1=\"3\" phase1=\"0.0\" k1=\"0.6527040000000001\" />\n+ <Proper class1=\"hE\" class2=\"cA\" class3=\"cA\" class4=\"hX\" periodicity1=\"3\" phase1=\"0.0\" k1=\"0.6527040000000001\" />\n+ <Proper class1=\"hE\" class2=\"cA\" class3=\"cA\" class4=\"nA\" periodicity1=\"3\" phase1=\"0.0\" k1=\"0.6527040000000001\" />\n+ <Proper class1=\"oT\" class2=\"cA\" class3=\"cA\" class4=\"hX\" periodicity1=\"3\" phase1=\"0.0\" k1=\"0.6527040000000001\" />\n+ <Proper class1=\"hE\" class2=\"cA\" class3=\"cA\" class4=\"oS\" periodicity1=\"3\" phase1=\"0.0\" k1=\"0.0\" periodicity2=\"1\" phase2=\"0.0\" k2=\"1.046\" />\n+ <Proper class1=\"hE\" class2=\"cA\" class3=\"cA\" class4=\"hE\" periodicity1=\"3\" phase1=\"0.0\" k1=\"0.6527040000000001\" />\n+ <Proper class1=\"hE\" class2=\"cA\" class3=\"cA\" class4=\"oT\" periodicity1=\"3\" phase1=\"0.0\" k1=\"0.0\" periodicity2=\"1\" phase2=\"0.0\" k2=\"1.046\" />\n+ <Proper class1=\"hE\" class2=\"cA\" class3=\"oS\" class4=\"cC\" periodicity1=\"3\" phase1=\"0.0\" k1=\"1.6024720000000001\" />\n+ <Proper class1=\"hE\" class2=\"cA\" class3=\"cA\" class4=\"cA\" periodicity1=\"3\" phase1=\"0.0\" k1=\"0.6527040000000001\" />\n+ <Proper class1=\"cD\" class2=\"cD\" class3=\"cB\" class4=\"hB\" periodicity1=\"2\" phase1=\"0.0\" k1=\"0.0\" />\n+ <Proper class1=\"hB\" class2=\"cB\" class3=\"cD\" class4=\"hL\" periodicity1=\"2\" phase1=\"0.0\" k1=\"0.0\" />\n+ <Proper class1=\"cB\" class2=\"cD\" class3=\"cD\" class4=\"hL\" periodicity1=\"3\" phase1=\"0.0\" k1=\"0.6510304\" />\n+ <Proper class1=\"cD\" class2=\"cB\" class3=\"cB\" class4=\"hB\" periodicity1=\"2\" phase1=\"3.141592653589793\" k1=\"27.823600000000003\" />\n+ <Proper class1=\"cB\" class2=\"cB\" class3=\"cD\" class4=\"hL\" periodicity1=\"3\" phase1=\"3.141592653589793\" k1=\"1.58992\" periodicity2=\"1\" phase2=\"0.0\" k2=\"4.811599999999999\" />\n+ <Proper class1=\"hB\" class2=\"cB\" class3=\"cB\" class4=\"hB\" periodicity1=\"2\" phase1=\"3.141592653589793\" k1=\"27.823600000000003\" />\n+ <Proper class1=\"cC\" class2=\"cA\" class3=\"nA\" class4=\"hN\" periodicity1=\"3\" phase1=\"0.0\" k1=\"0.6510304\" />\n+ <Proper class1=\"nA\" class2=\"cA\" class3=\"cC\" class4=\"oO\" periodicity1=\"2\" phase1=\"3.141592653589793\" k1=\"0.0\" />\n+ <Proper class1=\"hN\" class2=\"nA\" class3=\"cA\" class4=\"hX\" periodicity1=\"3\" phase1=\"0.0\" k1=\"0.6510304\" />\n+ <Proper class1=\"hX\" class2=\"cA\" class3=\"cC\" class4=\"oO\" periodicity1=\"2\" phase1=\"3.141592653589793\" k1=\"0.0\" />\n+ <Proper class1=\"cC\" class2=\"cA\" class3=\"cA\" class4=\"hE\" periodicity1=\"3\" phase1=\"0.0\" k1=\"0.6510304\" />\n+ <Proper class1=\"cA\" class2=\"cA\" class3=\"nA\" class4=\"hN\" periodicity1=\"3\" phase1=\"0.0\" k1=\"0.6510304\" />\n+ <Proper class1=\"cA\" class2=\"cA\" class3=\"cC\" class4=\"oO\" periodicity1=\"2\" phase1=\"3.141592653589793\" k1=\"0.0\" />\n+ <Proper class1=\"cC\" class2=\"cA\" class3=\"cA\" class4=\"oT\" periodicity1=\"3\" phase1=\"0.0\" k1=\"0.6510304\" />\n+ <Proper class1=\"hE\" class2=\"cA\" class3=\"oH\" class4=\"hO\" periodicity1=\"3\" phase1=\"0.0\" k1=\"2.092\" />\n+ <Proper class1=\"cA\" class2=\"cA\" class3=\"oH\" class4=\"hO\" periodicity1=\"3\" phase1=\"0.0\" k1=\"0.66944\" periodicity2=\"1\" phase2=\"0.0\" k2=\"1.046\" />\n+ <Proper class1=\"hE\" class2=\"cA\" class3=\"cA\" class4=\"oH\" periodicity1=\"3\" phase1=\"0.0\" k1=\"0.0\" periodicity2=\"1\" phase2=\"0.0\" k2=\"1.046\" />\n+ <Proper class1=\"cA\" class2=\"cA\" class3=\"cA\" class4=\"oH\" periodicity1=\"3\" phase1=\"0.0\" k1=\"0.6510304\" />\n+ <Proper class1=\"oH\" class2=\"cA\" class3=\"cA\" class4=\"oT\" periodicity1=\"3\" phase1=\"0.0\" k1=\"0.602496\" periodicity2=\"2\" phase2=\"0.0\" k2=\"4.916200000000001\" />\n+ <Proper class1=\"oH\" class2=\"cA\" class3=\"cA\" class4=\"oH\" periodicity1=\"3\" phase1=\"0.0\" k1=\"0.602496\" periodicity2=\"2\" phase2=\"0.0\" k2=\"4.916200000000001\" />\n+ <Proper class1=\"cA\" class2=\"oT\" class3=\"pA\" class4=\"oH\" periodicity1=\"3\" phase1=\"0.0\" k1=\"1.046\" periodicity2=\"2\" phase2=\"0.0\" k2=\"5.0208\" />\n+ <Proper class1=\"hO\" class2=\"oH\" class3=\"pA\" class4=\"oT\" periodicity1=\"3\" phase1=\"0.0\" k1=\"2.2313272\" />\n+ <Proper class1=\"hO\" class2=\"oH\" class3=\"pA\" class4=\"oP\" periodicity1=\"3\" phase1=\"0.0\" k1=\"2.2313272\" />\n+ <Proper class1=\"cB\" class2=\"cB\" class3=\"cD\" class4=\"cB\" periodicity1=\"5\" phase1=\"0.0\" k1=\"0.0\" periodicity2=\"4\" phase2=\"0.0\" k2=\"0.0\" periodicity3=\"3\" phase3=\"0.0\" k3=\"0.0\" periodicity4=\"2\" phase4=\"0.0\" k4=\"0.0\" periodicity5=\"1\" phase5=\"0.0\" k5=\"0.0\" />\n+ <Proper class1=\"cB\" class2=\"cD\" class3=\"cB\" class4=\"hB\" periodicity1=\"2\" phase1=\"0.0\" k1=\"0.0\" />\n+ <Proper class1=\"cA\" class2=\"cA\" class3=\"cA\" class4=\"cA\" periodicity1=\"3\" phase1=\"0.0\" k1=\"0.75312\" periodicity2=\"2\" phase2=\"3.141592653589793\" k2=\"1.046\" periodicity3=\"1\" phase3=\"3.141592653589793\" k3=\"0.8368000000000001\" />\n+ <Proper class1=\"cA\" class2=\"cA\" class3=\"cA\" class4=\"cD\" periodicity1=\"3\" phase1=\"0.0\" k1=\"0.75312\" periodicity2=\"2\" phase2=\"3.141592653589793\" k2=\"1.046\" periodicity3=\"1\" phase3=\"3.141592653589793\" k3=\"0.8368000000000001\" />\n+ <Proper class1=\"cA\" class2=\"cA\" class3=\"cD\" class4=\"cD\" periodicity1=\"3\" phase1=\"0.0\" k1=\"0.75312\" periodicity2=\"2\" phase2=\"3.141592653589793\" k2=\"1.046\" periodicity3=\"1\" phase3=\"3.141592653589793\" k3=\"0.8368000000000001\" />\n+ <Proper class1=\"cA\" class2=\"cD\" class3=\"cD\" class4=\"cD\" periodicity1=\"3\" phase1=\"0.0\" k1=\"0.75312\" periodicity2=\"2\" phase2=\"3.141592653589793\" k2=\"1.046\" periodicity3=\"1\" phase3=\"3.141592653589793\" k3=\"0.8368000000000001\" />\n+ <Proper class1=\"cA\" class2=\"cA\" class3=\"cA\" class4=\"hA\" periodicity1=\"3\" phase1=\"0.0\" k1=\"0.66944\" />\n+ <Proper class1=\"cD\" class2=\"cA\" class3=\"cA\" class4=\"hA\" periodicity1=\"3\" phase1=\"0.0\" k1=\"0.66944\" />\n+ <Proper class1=\"cA\" class2=\"cA\" class3=\"cD\" class4=\"hL\" periodicity1=\"3\" phase1=\"0.0\" k1=\"0.66944\" />\n+ <Proper class1=\"hA\" class2=\"cA\" class3=\"cA\" class4=\"hA\" periodicity1=\"3\" phase1=\"0.0\" k1=\"0.6276\" />\n+ <Proper class1=\"hA\" class2=\"cA\" class3=\"cD\" class4=\"hL\" periodicity1=\"3\" phase1=\"0.0\" k1=\"0.6276\" />\n+ <Proper class1=\"cD\" class2=\"cD\" class3=\"cA\" class4=\"hA\" periodicity1=\"3\" phase1=\"0.0\" k1=\"0.66944\" />\n+ <Proper class1=\"cA\" class2=\"cD\" class3=\"cD\" class4=\"hL\" periodicity1=\"3\" phase1=\"0.0\" k1=\"0.66944\" />\n+ <Proper class1=\"cA\" class2=\"cA\" class3=\"cB\" class4=\"cA\" periodicity1=\"2\" phase1=\"0.0\" k1=\"0.0\" />\n+ <Proper class1=\"cA\" class2=\"cB\" class3=\"cB\" class4=\"hB\" periodicity1=\"2\" phase1=\"3.141592653589793\" k1=\"27.823600000000003\" />\n+ <Proper class1=\"hA\" class2=\"cA\" class3=\"cB\" class4=\"hB\" periodicity1=\"2\" phase1=\"0.0\" k1=\"0.0\" />\n+ <Proper class1=\"cA\" class2=\"cA\" class3=\"cB\" class4=\"hB\" periodicity1=\"2\" phase1=\"0.0\" k1=\"0.0\" />\n+ <Proper class1=\"cB\" class2=\"cA\" class3=\"cA\" class4=\"hA\" periodicity1=\"3\" phase1=\"0.0\" k1=\"0.6510304\" />\n+ <Proper class1=\"cB\" class2=\"cA\" class3=\"cA\" class4=\"oH\" periodicity1=\"3\" phase1=\"0.0\" k1=\"0.6510304\" />\n+ <Proper class1=\"cB\" class2=\"cB\" class3=\"cA\" class4=\"hA\" periodicity1=\"3\" phase1=\"3.141592653589793\" k1=\"1.58992\" periodicity2=\"1\" phase2=\"0.0\" k2=\"4.811599999999999\" />\n+ <Proper class1=\"hA\" class2=\"cA\" class3=\"cA\" class4=\"oH\" periodicity1=\"3\" phase1=\"0.0\" k1=\"0.0\" periodicity2=\"1\" phase2=\"0.0\" k2=\"1.046\" />\n+ <Proper class1=\"cA\" class2=\"cB\" class3=\"cA\" class4=\"hA\" periodicity1=\"2\" phase1=\"0.0\" k1=\"0.0\" />\n+ <Proper class1=\"hA\" class2=\"cA\" class3=\"cA\" class4=\"hE\" periodicity1=\"3\" phase1=\"0.0\" k1=\"0.6510304\" />\n+ <Proper class1=\"cB\" class2=\"cA\" class3=\"cA\" class4=\"hE\" periodicity1=\"3\" phase1=\"0.0\" k1=\"0.6510304\" />\n+ <Proper class1=\"cA\" class2=\"cA\" class3=\"nN\" class4=\"cC\" periodicity1=\"2\" phase1=\"0.0\" k1=\"0.0\" />\n+ <Proper class1=\"cA\" class2=\"cA\" class3=\"nN\" class4=\"hN\" periodicity1=\"2\" phase1=\"0.0\" k1=\"0.0\" />\n+ <Proper class1=\"cA\" class2=\"nN\" class3=\"cC\" class4=\"cD\" periodicity1=\"2\" phase1=\"3.141592653589793\" k1=\"10.46\" />\n+ <Proper class1=\"cA\" class2=\"nN\" class3=\"cC\" class4=\"oC\" periodicity1=\"2\" phase1=\"3.141592653589793\" k1=\"10.46\" />\n+ <Proper class1=\"cB\" class2=\"cA\" class3=\"cA\" class4=\"nN\" periodicity1=\"3\" phase1=\"0.0\" k1=\"10.0416\" periodicity2=\"2\" phase2=\"3.141592653589793\" k2=\"5.4392000000000005\" periodicity3=\"1\" phase3=\"1.0471975511965976\" k3=\"1.6736000000000002\" />\n+ <Proper class1=\"cC\" class2=\"nN\" class3=\"cA\" class4=\"hE\" periodicity1=\"2\" phase1=\"0.0\" k1=\"0.0\" />\n+ <Proper class1=\"cD\" class2=\"cC\" class3=\"nN\" class4=\"hN\" periodicity1=\"2\" phase1=\"3.141592653589793\" k1=\"10.46\" />\n+ <Proper class1=\"cD\" class2=\"cD\" class3=\"cC\" class4=\"nN\" periodicity1=\"2\" phase1=\"3.141592653589793\" k1=\"0.0\" />\n+ <Proper class1=\"hE\" class2=\"cA\" class3=\"cA\" class4=\"nN\" periodicity1=\"3\" phase1=\"0.0\" k1=\"0.6527040000000001\" />\n+ <Proper class1=\"hE\" class2=\"cA\" class3=\"nN\" class4=\"hN\" periodicity1=\"2\" phase1=\"0.0\" k1=\"0.0\" />\n+ <Proper class1=\"hL\" class2=\"cD\" class3=\"cC\" class4=\"nN\" periodicity1=\"2\" phase1=\"0.0\" k1=\"0.0\" />\n+ <Proper class1=\"hN\" class2=\"nN\" class3=\"cC\" class4=\"oC\" periodicity1=\"2\" phase1=\"3.141592653589793\" k1=\"10.46\" />\n+ <Proper class1=\"nN\" class2=\"cA\" class3=\"cA\" class4=\"oH\" periodicity1=\"3\" phase1=\"0.0\" k1=\"0.6527040000000001\" />\n+ <Proper class1=\"nN\" class2=\"cA\" class3=\"cA\" class4=\"oT\" periodicity1=\"3\" phase1=\"0.0\" k1=\"0.0\" />\n+ <Proper class1=\"cB\" class2=\"cA\" class3=\"oH\" class4=\"hO\" periodicity1=\"3\" phase1=\"0.0\" k1=\"0.66944\" periodicity2=\"1\" phase2=\"0.0\" k2=\"1.046\" />\n+ <Proper class1=\"cB\" class2=\"cB\" class3=\"cA\" class4=\"oH\" periodicity1=\"2\" phase1=\"0.0\" k1=\"0.0\" />\n+ <Proper class1=\"hE\" class2=\"cA\" class3=\"cB\" class4=\"cB\" periodicity1=\"2\" phase1=\"0.0\" k1=\"0.0\" />\n+ <Proper class1=\"hE\" class2=\"cA\" class3=\"cB\" class4=\"hB\" periodicity1=\"2\" phase1=\"0.0\" k1=\"0.0\" />\n+ <Proper class1=\"oH\" class2=\"cA\" class3=\"cB\" class4=\"hB\" periodicity1=\"2\" phase1=\"0.0\" k1=\"0.0\" />\n+ <Proper class1=\"cC\" class2=\"cD\" class3=\"cD\" class4=\"cB\" periodicity1=\"3\" phase1=\"0.0\" k1=\"0.6510304\" />\n+ <Improper class1=\"cB\" class2=\"cA\" class3=\"cA\" class4=\"cB\" periodicity1=\"2\" phase1=\"3.141592653589793\" k1=\"4.6024\" />\n+ <Improper class1=\"cB\" class2=\"cA\" class3=\"cB\" class4=\"hB\" periodicity1=\"2\" phase1=\"3.141592653589793\" k1=\"4.6024\" />\n+ <Improper class1=\"nN\" class2=\"cA\" class3=\"cC\" class4=\"hN\" periodicity1=\"2\" phase1=\"3.141592653589793\" k1=\"4.6024\" />\n+ <Improper class1=\"cC\" class2=\"cA\" class3=\"oO\" class4=\"oO\" periodicity1=\"2\" phase1=\"3.141592653589793\" k1=\"4.6024\" />\n+ <Improper class1=\"cB\" class2=\"cB\" class3=\"cD\" class4=\"hB\" periodicity1=\"2\" phase1=\"3.141592653589793\" k1=\"4.6024\" />\n+ <Improper class1=\"cC\" class2=\"cD\" class3=\"nN\" class4=\"oC\" periodicity1=\"2\" phase1=\"3.141592653589793\" k1=\"4.6024\" />\n+ <Improper class1=\"cC\" class2=\"cD\" class3=\"oC\" class4=\"oS\" periodicity1=\"2\" phase1=\"3.141592653589793\" k1=\"43.932\" />\n+ </PeriodicTorsionForce>\n+ <NonbondedForce coulomb14scale=\"0.8333333333333334\" lj14scale=\"0.5\">\n+ <UseAttributeFromResidue name=\"charge\" />\n+ <Atom class=\"cA\" sigma=\"0.3399669508423535\" epsilon=\"0.4577296\" />\n+ <Atom class=\"cB\" sigma=\"0.3399669508423535\" epsilon=\"0.359824\" />\n+ <Atom class=\"cC\" sigma=\"0.3399669508423535\" epsilon=\"0.359824\" />\n+ <Atom class=\"cD\" sigma=\"0.3399669508423535\" epsilon=\"0.4577296\" />\n+ <Atom class=\"hA\" sigma=\"0.2649532787749369\" epsilon=\"0.06568879999999999\" />\n+ <Atom class=\"hB\" sigma=\"0.22272467953508485\" epsilon=\"0.029288\" />\n+ <Atom class=\"hE\" sigma=\"0.2471353044121301\" epsilon=\"0.06568879999999999\" />\n+ <Atom class=\"hL\" sigma=\"0.26014242569697904\" epsilon=\"0.04184\" />\n+ <Atom class=\"hN\" sigma=\"0.10690784617684071\" epsilon=\"0.06568879999999999\" />\n+ <Atom class=\"hO\" sigma=\"0.10690784617684071\" epsilon=\"0.06568879999999999\" />\n+ <Atom class=\"hX\" sigma=\"0.19599771799087468\" epsilon=\"0.06568879999999999\" />\n+ <Atom class=\"nA\" sigma=\"0.3249998523775958\" epsilon=\"0.7112800000000001\" />\n+ <Atom class=\"nN\" sigma=\"0.3249998523775958\" epsilon=\"0.7112800000000001\" />\n+ <Atom class=\"oC\" sigma=\"0.2959921901149463\" epsilon=\"0.87864\" />\n+ <Atom class=\"oH\" sigma=\"0.3066473387839048\" epsilon=\"0.8803136\" />\n+ <Atom class=\"oO\" sigma=\"0.2959921901149463\" epsilon=\"0.87864\" />\n+ <Atom class=\"oP\" sigma=\"0.2959921901149463\" epsilon=\"0.87864\" />\n+ <Atom class=\"oS\" sigma=\"0.3000012343465779\" epsilon=\"0.7112800000000001\" />\n+ <Atom class=\"oT\" sigma=\"0.3000012343465779\" epsilon=\"0.7112800000000001\" />\n+ <Atom class=\"pA\" sigma=\"0.37417746161894255\" epsilon=\"0.8368000000000001\" />\n+ </NonbondedForce>\n+ <Script>\n+import openmm\n+import openmm.unit\n+\n+scee_table = {\n+}\n+scnb_table = {\n+ ('cD', 'cD', 'cD', 'cD'): 6.0,\n+}\n+\n+atom_types = [data.atomType[atom] for atom in data.atoms]\n+overridden_pairs = {}\n+for atom_1, atom_2, atom_3, atom_4 in data.propers:\n+ types_key = (atom_types[atom_1], atom_types[atom_2], atom_types[atom_3], atom_types[atom_4])\n+ pairs_key = (min(atom_1, atom_4), max(atom_1, atom_4))\n+ if types_key in scee_table:\n+ overridden_pairs.setdefault(pairs_key, [1.2, 2.0])[0] = scee_table[types_key]\n+ if types_key in scnb_table:\n+ overridden_pairs.setdefault(pairs_key, [1.2, 2.0])[1] = scnb_table[types_key]\n+\n+for force in sys.getForces():\n+ if isinstance(force, openmm.NonbondedForce):\n+ charges, sigmas, epsilons = zip(*(force.getParticleParameters(index) for index in range(force.getNumParticles())))\n+ for index in range(force.getNumExceptions()):\n+ atom_1, atom_4, charge_prod, sigma, epsilon = force.getExceptionParameters(index)\n+ if charge_prod or epsilon:\n+ pairs_key = (min(atom_1, atom_4), max(atom_1, atom_4))\n+ if pairs_key in overridden_pairs:\n+ scee, scnb = overridden_pairs[pairs_key]\n+ force.setExceptionParameters(index, atom_1, atom_4, charges[atom_1] * charges[atom_4] / scee, (sigmas[atom_1] + sigmas[atom_4]) / 2, openmm.unit.sqrt(epsilons[atom_1] * epsilons[atom_4]) / scnb)\n+</Script>\n+</ForceField>\n\\ No newline at end of file\n"}, "test": {"test_patch": "diff --git a/wrappers/python/tests/TestModeller.py b/wrappers/python/tests/TestModeller.py\nindex 068cfcc1ad..848ab190e3 100644\n--- a/wrappers/python/tests/TestModeller.py\n+++ b/wrappers/python/tests/TestModeller.py\n@@ -1234,47 +1234,48 @@ def test_addMembrane(self):\n \"\"\"Test adding a membrane to a realistic system.\"\"\"\n \n mol = PDBxFile('systems/gpcr.cif')\n- modeller = Modeller(mol.topology, mol.positions)\n- ff = ForceField('amber14-all.xml', 'amber14/tip3p.xml')\n+ for ff_files in [['amber14-all.xml', 'amber14/tip3p.xml'], ['amber19-all.xml', 'amber19/opc3.xml']]:\n+ modeller = Modeller(mol.topology, mol.positions)\n+ ff = ForceField(*ff_files)\n \n- # Add a membrane around the GPCR\n- modeller.addMembrane(ff, minimumPadding=1.1*nanometers, ionicStrength=1*molar)\n+ # Add a membrane around the GPCR\n+ modeller.addMembrane(ff, minimumPadding=1.1*nanometers, ionicStrength=1*molar)\n \n- # Make sure we added everything correctly\n- resCount = defaultdict(int)\n- for res in modeller.topology.residues():\n- resCount[res.name] += 1\n+ # Make sure we added everything correctly\n+ resCount = defaultdict(int)\n+ for res in modeller.topology.residues():\n+ resCount[res.name] += 1\n \n- self.assertEqual(16, resCount['ALA'])\n- self.assertEqual(226, resCount['POP']) # 2x128 - overlapping\n- self.assertTrue(resCount['HOH'] > 1)\n+ self.assertEqual(16, resCount['ALA'])\n+ self.assertEqual(226, resCount['POP']) # 2x128 - overlapping\n+ self.assertTrue(resCount['HOH'] > 1)\n \n- deltaQ = resCount['CL'] - resCount['NA']\n- self.assertEqual(deltaQ, 10) # protein net q: +10\n+ deltaQ = resCount['CL'] - resCount['NA']\n+ self.assertEqual(deltaQ, 10) # protein net q: +10\n \n- # Check _addIons did the right thing.\n- expected_ion_fraction = 1.0*molar/(55.4*molar)\n+ # Check _addIons did the right thing.\n+ expected_ion_fraction = 1.0*molar/(55.4*molar)\n \n- total_water = resCount['HOH']\n- total_water_ions = resCount['HOH'] + resCount['CL'] + resCount['NA']\n+ total_water = resCount['HOH']\n+ total_water_ions = resCount['HOH'] + resCount['CL'] + resCount['NA']\n \n- # total_water_ions - protein charge\n- expected_sodium = math.floor((total_water_ions-10)*expected_ion_fraction+0.5)\n- expected_chlorine = expected_sodium + 10\n+ # total_water_ions - protein charge\n+ expected_sodium = math.floor((total_water_ions-10)*expected_ion_fraction+0.5)\n+ expected_chlorine = expected_sodium + 10\n \n- self.assertEqual(resCount['CL'], expected_chlorine)\n- self.assertEqual(resCount['NA'], expected_sodium)\n+ self.assertEqual(resCount['CL'], expected_chlorine)\n+ self.assertEqual(resCount['NA'], expected_sodium)\n \n- # Check lipid numbering for repetitions\n- lipidIdList = [(r.chain.id, r.id) for r in modeller.topology.residues()\n- if r.name == 'POP']\n- self.assertEqual(len(lipidIdList), len(set(lipidIdList)))\n+ # Check lipid numbering for repetitions\n+ lipidIdList = [(r.chain.id, r.id) for r in modeller.topology.residues()\n+ if r.name == 'POP']\n+ self.assertEqual(len(lipidIdList), len(set(lipidIdList)))\n \n- # Check dimensions to see if padding was respected\n- originalSize = max(mol.positions) - min(mol.positions)\n- newSize = modeller.topology.getUnitCellDimensions()\n- for i in range(3):\n- self.assertTrue(newSize[i] >= originalSize[i]+1.1*nanometers)\n+ # Check dimensions to see if padding was respected\n+ originalSize = max(mol.positions) - min(mol.positions)\n+ newSize = modeller.topology.getUnitCellDimensions()\n+ for i in range(3):\n+ self.assertTrue(newSize[i] >= originalSize[i]+1.1*nanometers)\n \n def test_bondTypeAndOrderPreserved(self):\n \"\"\" Check that bond type and order are preserved across multiple operations. \n", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}112{"question_id": "MSB_openmm_openmm_pr5091", "question_type": "multi_swe_bench", "description": "Create a new dictionary every time `_TemplateAtomData.__init__()` is called without `parameters` (openmm/openmm#5091)", "content": {"org": "openmm", "repo": "openmm", "pr_number": 5091, "issue_title": "Create a new dictionary every time `_TemplateAtomData.__init__()` is called without `parameters`", "issue_body": "See #5075.", "base_commit": "05472c9a812927c863be67abbb3376e944b2c7ef", "resolved_issues": [{"number": null, "title": "Create a new dictionary every time `_TemplateAtomData.__init__()` is called without `parameters`", "body": "When creating a new instance of a template atom in the system, the parameter dictionary is shared across multiple instances if no specific parameters are provided. This behavior can lead to unintended side effects, as modifications to the dictionary in one instance will affect all other instances that share it. This issue arises because the same dictionary object is reused by default.\n\nThe expected behavior is that each new instance of a template atom should have its own distinct parameter dictionary, even when no parameters are explicitly provided. This ensures that changes to the parameters of one instance do not inadvertently impact other instances.\n\n## IMPORTANT INSTRUCTIONS\n\n1. If you edit a python file, you MUST run 'make PythonInstall' inside the build directory\n2. If you edit a c++ file, you MUST run 'make -j4 && make install\" inside the build directory"}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/openmm_m_openmm:pr-5091", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/wrappers/python/openmm/app/forcefield.py b/wrappers/python/openmm/app/forcefield.py\nindex a3226b7248..5c872ea240 100644\n--- a/wrappers/python/openmm/app/forcefield.py\n+++ b/wrappers/python/openmm/app/forcefield.py\n@@ -744,11 +744,11 @@ def areParametersIdentical(self, template2, matchingAtoms, matchingAtoms2):\n \n class _TemplateAtomData(object):\n \"\"\"Inner class used to encapsulate data about an atom in a residue template definition.\"\"\"\n- def __init__(self, name, type, element, parameters={}):\n+ def __init__(self, name, type, element, parameters=None):\n self.name = name\n self.type = type\n self.element = element\n- self.parameters = parameters\n+ self.parameters = {} if parameters is None else parameters\n self.bondedTo = []\n self.externalBonds = 0\n \n"}, "test": {"test_patch": "diff --git a/wrappers/python/tests/TestForceField.py b/wrappers/python/tests/TestForceField.py\nindex c0f0d34c2b..aa7bfbb404 100644\n--- a/wrappers/python/tests/TestForceField.py\n+++ b/wrappers/python/tests/TestForceField.py\n@@ -804,6 +804,9 @@ def test_generateTemplatesForUnmatchedResidues(self):\n forcefield = ForceField('amber99sb.xml', 'tip3p.xml', StringIO(simple_ffxml_contents))\n # Get list of unique unmatched residues.\n [templates, residues] = forcefield.generateTemplatesForUnmatchedResidues(pdb.topology)\n+ # Make sure template atom parameter dictionaries are distinct objects.\n+ parameters = [atom.parameters for template in templates for atom in template.atoms]\n+ self.assertEqual(len(set(map(id, parameters))), len(parameters))\n # Add residue templates to forcefield.\n for template in templates:\n # Replace atom types.\n", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}113{"question_id": "MSB_openmm_openmm_pr5114", "question_type": "multi_swe_bench", "description": "Fixed errors in computeCurrentPressure() (openmm/openmm#5114)", "content": {"org": "openmm", "repo": "openmm", "pr_number": 5114, "issue_title": "Fixed errors in computeCurrentPressure()", "issue_body": "This fixes two problems in `computeCurrentPressure()`. First, if the system contained any massless molecule it would return nan. Second, the Python API was not adding units to the return values.\r\n\r\nFixes #5113.", "base_commit": "b64a82a89a52cbc6fba651a9f0e3f39bef647653", "resolved_issues": [{"number": 5113, "title": "Issues with barostat pressure computation", "body": "I've been trying to use the `computeCurrentPressure()` feature of the barostats and have run into some unusual behavior.\n\nFirst, in the Python API, `MonteCarloBarostat.computeCurrentPressure()` returns a plain float: should this be a `Quantity` with units of bar? The anisotropic barostats' return values similarly don't include units.\n\nAlso, if even one individual particle is frozen, I am getting NaN, as in this example.\n```python\nimport numpy\nimport openmm\n\nsystem = openmm.System()\nsystem.setDefaultPeriodicBoxVectors((16, 0, 0), (0, 16, 0), (0, 0, 16))\n\nlj = openmm.NonbondedForce()\nlj.setNonbondedMethod(openmm.NonbondedForce.CutoffPeriodic)\n\nfor i in range(1000):\n system.addParticle(10 if i else 0)\n lj.addParticle(0, 0, 0)\n\nsystem.addForce(lj)\n\nbarostat = openmm.MonteCarloBarostat(10, 300)\nsystem.addForce(barostat)\n\ncontext = openmm.Context(system, openmm.LangevinMiddleIntegrator(300, 1, 0.01))\ncontext.setPositions(numpy.random.uniform(0, 16, (1000, 3)))\ncontext.setVelocitiesToTemperature(300)\n\nprint(barostat.computeCurrentPressure(context))\n```\nIf all particles have non-zero masses, this works as expected. Possibly the molecular velocity calculation should check for this case? I can investigate further.\n\n## IMPORTANT INSTRUCTIONS\n\n1. If you edit a python file, you MUST run 'make PythonInstall' inside the build directory\n2. If you edit a c++ file, you MUST run 'make -j4 && make install\" inside the build directory"}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/openmm_m_openmm:pr-5114", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/platforms/common/src/kernels/monteCarloBarostat.cc b/platforms/common/src/kernels/monteCarloBarostat.cc\nindex 12c739d892..cc234af324 100644\n--- a/platforms/common/src/kernels/monteCarloBarostat.cc\n+++ b/platforms/common/src/kernels/monteCarloBarostat.cc\n@@ -79,7 +79,7 @@ KERNEL void computeMolecularKineticEnergy(int numMolecules, GLOBAL mixed4* RESTR\n molVel += mass*trimTo3(v);\n molMass += mass;\n }\n- molVel *= RECIP((mixed) molMass);\n+ molVel *= (molMass == 0 ? 0 : RECIP((mixed) molMass));\n #if COMPONENTS == 1\n ke[0] += 0.5f*molMass*dot(molVel, molVel);\n #else\ndiff --git a/platforms/reference/src/SimTKReference/ReferenceMonteCarloBarostat.cpp b/platforms/reference/src/SimTKReference/ReferenceMonteCarloBarostat.cpp\nindex ba80d297ff..44383561c4 100644\n--- a/platforms/reference/src/SimTKReference/ReferenceMonteCarloBarostat.cpp\n+++ b/platforms/reference/src/SimTKReference/ReferenceMonteCarloBarostat.cpp\n@@ -133,7 +133,8 @@ void ReferenceMonteCarloBarostat::computeMolecularKineticEnergy(const vector<Vec\n molVel += masses[atom]*velocities[atom];\n molMass += masses[atom];\n }\n- molVel /= molMass;\n+ if (molMass != 0)\n+ molVel /= molMass;\n if (components == 1)\n ke[0] += 0.5*molMass*molVel.dot(molVel);\n else {\ndiff --git a/wrappers/python/src/swig_doxygen/swigInputConfig.py b/wrappers/python/src/swig_doxygen/swigInputConfig.py\nindex 7bfd755d0b..0535db2825 100755\n--- a/wrappers/python/src/swig_doxygen/swigInputConfig.py\n+++ b/wrappers/python/src/swig_doxygen/swigInputConfig.py\n@@ -493,6 +493,7 @@\n (\"MonteCarloMembraneBarostat\", \"MonteCarloMembraneBarostat\") : (None, (\"unit.bar\", \"unit.bar*unit.nanometer\", \"unit.kelvin\", None, None, None)),\n (\"MonteCarloMembraneBarostat\", \"getXYMode\") : (None, ()),\n (\"MonteCarloMembraneBarostat\", \"getZMode\") : (None, ()),\n+(\"*\", \"computeCurrentPressure\") : (\"unit.bar\", ()),\n (\"CustomIntegrator\", \"CustomIntegrator\") : (None, (\"unit.picosecond\",)),\n (\"BrownianIntegrator\", \"BrownianIntegrator\") : (None, (\"unit.kelvin\", \"unit.picosecond**-1\", \"unit.picosecond\")),\n (\"LangevinIntegrator\", \"LangevinIntegrator\") : (None, (\"unit.kelvin\", \"unit.picosecond**-1\", \"unit.picosecond\")),\n"}, "test": {"test_patch": "diff --git a/tests/TestMonteCarloBarostat.h b/tests/TestMonteCarloBarostat.h\nindex de46eda3ca..a49e9cb4c5 100644\n--- a/tests/TestMonteCarloBarostat.h\n+++ b/tests/TestMonteCarloBarostat.h\n@@ -164,9 +164,18 @@ void testMolecularGas() {\n OpenMM_SFMT::SFMT sfmt;\n init_gen_rand(0, sfmt);\n for (int i = 0; i < numMolecules; ++i) {\n- system.addParticle(1.0);\n- system.addParticle(2.0);\n- system.addParticle(3.0);\n+ if (i == 0) {\n+ // Make one molecule massless to make sure that doesn't cause any problems.\n+\n+ system.addParticle(0.0);\n+ system.addParticle(0.0);\n+ system.addParticle(0.0);\n+ }\n+ else {\n+ system.addParticle(1.0);\n+ system.addParticle(2.0);\n+ system.addParticle(3.0);\n+ }\n Vec3 pos(initialLength*genrand_real2(sfmt), 0.5*initialLength*genrand_real2(sfmt), 2*initialLength*genrand_real2(sfmt));\n bonds->addBond(positions.size(), positions.size()+1, 0.1, 10.0);\n system.addConstraint(positions.size(), positions.size()+2, 0.1);\ndiff --git a/wrappers/python/tests/TestAPIUnits.py b/wrappers/python/tests/TestAPIUnits.py\nindex d42c313023..b4fbff9833 100644\n--- a/wrappers/python/tests/TestAPIUnits.py\n+++ b/wrappers/python/tests/TestAPIUnits.py\n@@ -1242,8 +1242,31 @@ def testAndersenThermostat(self):\n self.assertEqual(force.getDefaultTemperature(), 298.15*kelvin)\n self.assertAlmostEqualUnit(force.getDefaultCollisionFrequency(), 1/picosecond)\n \n- def testMonteCarloMembraneBarostat(self):\n- \"\"\" Tests the MonteCarloMembraneBarostat API features \"\"\"\n+ def testMonteCarloBarostat(self):\n+ \"\"\" Tests the various Monte Carlo barostats API features \"\"\"\n+ def checkPressureUnits(force):\n+ system = System()\n+ system.addParticle(0.0)\n+ system.addForce(force)\n+ bonds = HarmonicBondForce()\n+ bonds.setUsesPeriodicBoundaryConditions(True)\n+ system.addForce(bonds)\n+ context = Context(system, VerletIntegrator(0.001))\n+ context.setPositions([Vec3(0, 0, 0)])\n+ pressure = force.computeCurrentPressure(context)\n+ self.assertTrue(is_quantity(pressure))\n+ self.assertTrue(pressure.unit == bar)\n+\n+ force = MonteCarloBarostat(1.1*bar, 350*kelvin)\n+ self.assertEqual(force.getDefaultPressure(), 1.1*bar)\n+ self.assertEqual(force.getDefaultTemperature(), 350*kelvin)\n+ checkPressureUnits(force)\n+\n+ force = MonteCarloFlexibleBarostat(1.1*bar, 350*kelvin)\n+ self.assertEqual(force.getDefaultPressure(), 1.1*bar)\n+ self.assertEqual(force.getDefaultTemperature(), 350*kelvin)\n+ checkPressureUnits(force)\n+\n force = MonteCarloMembraneBarostat(1.0, 1.5, 300, MonteCarloMembraneBarostat.XYAnisotropic, MonteCarloMembraneBarostat.ZFixed, 25)\n self.assertEqual(force.getDefaultPressure(), 1.0*bar)\n self.assertEqual(force.getDefaultSurfaceTension(), 1.5*bar*nanometer)\n@@ -1251,6 +1274,7 @@ def testMonteCarloMembraneBarostat(self):\n self.assertEqual(force.getXYMode(), MonteCarloMembraneBarostat.XYAnisotropic)\n self.assertEqual(force.getZMode(), MonteCarloMembraneBarostat.ZFixed)\n self.assertEqual(force.getFrequency(), 25)\n+ checkPressureUnits(force)\n \n force = MonteCarloMembraneBarostat(1.1*bar, 2.0*bar*nanometer, 350*kelvin, MonteCarloMembraneBarostat.XYAnisotropic, MonteCarloMembraneBarostat.ZFixed, 25)\n self.assertEqual(force.getDefaultPressure(), 1.1*bar)\n@@ -1264,6 +1288,11 @@ def testMonteCarloMembraneBarostat(self):\n self.assertEqual(force.getDefaultSurfaceTension(), 2.5*bar*nanometer)\n self.assertEqual(force.getDefaultTemperature(), 298.15*kelvin)\n \n+ force = MonteCarloAnisotropicBarostat(Vec3(1.1, 2.2, 3.3)*bar, 350*kelvin)\n+ self.assertEqual(force.getDefaultPressure(), Vec3(1.1, 2.2, 3.3)*bar)\n+ self.assertEqual(force.getDefaultTemperature(), 350*kelvin)\n+ checkPressureUnits(force)\n+\n def testDrudeSCFIntegrator(self):\n \"\"\" Tests the DrudeSCFIntegrator API features \"\"\"\n integrator = DrudeSCFIntegrator(0.002)\n", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}114{"question_id": "MSB_pyscf_pyscf_pr1426", "question_type": "multi_swe_bench", "description": "Fix EOM-EE RCCSD intermediates (pyscf/pyscf#1426)", "content": {"org": "pyscf", "repo": "pyscf", "pr_number": 1426, "issue_title": "Fix EOM-EE RCCSD intermediates", "issue_body": "* Fix EOM-EE RCCSD intermediates Fov\r\n* Update spin2spatial and spatial2spin functions for various eom methods (issue #1208)", "base_commit": "12989b399b0eddfab3709c7e70dd55a45129dce9", "resolved_issues": [{"number": 1208, "title": "Spatial2Spin for EOM-RCCSD?", "body": "Hello,\r\nI noticed that there are functions in [cc.addons](https://github.com/pyscf/pyscf/blob/1de8c145abb3e1a7392df9118e8062e6fe6bde00/pyscf/cc/addons.py#L19) and [eom_uccsd](https://github.com/pyscf/pyscf/blob/1de8c145abb3e1a7392df9118e8062e6fe6bde00/pyscf/cc/eom_uccsd.py#L78) for converting between spatial and spin orbital representations of coupled cluster amplitudes. The latter does not work with EOM-RCCSD amplitudes, at least out of the box. Is there a way one could hack it together to make it work? I know there is also EOM-GCCSD, which does things in the spin orbital representation, but it is quite a bit slower, and it would be nice to just make the conversion from EOM-RCCSD instead. Here is a snippet of my code:\r\n\r\n```python\r\nfrom pyscf import gto, scf, cc\r\nfrom pyscf.cc import ccsd\r\nfrom pyscf.cc.addons import spatial2spin,spin2spatial\r\nfrom pyscf.cc.eom_uccsd import spatial2spin_ip,spatial2spin_ea\r\n\r\nmol = gto.M(\r\n atom = ' N 0.0000000000 0.0000000000 0.548756750;\\\r\n N 0.0000000000 0.0000000000 -0.548756750;',\r\n basis = 'cc-pvdz' )\r\nmol.verbose = 4\r\nmol.build()\r\nmf = mol.RHF().run()\r\n\r\nmycc = ccsd.CCSD(mf)\r\nmycc.kernel()\r\nt1 = mycc.t1\r\nt2 = mycc.t2\r\n\r\nt1_spin = spatial2spin(t1)\r\nt2_spin = spatial2spin(t2)\r\n\r\nnstates = 5\r\nmyeom = mycc.eomea_method()\r\ne_r, r_eom = mycc.eaccsd(nroots=nstates)\r\ne_l, l_eom = mycc.eaccsd(nroots=nstates,left=True)\r\n\r\nr1,r2 = myeom.vector_to_amplitudes(r_eom[0],myeom.nmo,myeom.nocc)\r\n#r1,r2 = spatial2spin_ea(r1,r2)\r\n# yields ValueError: too many values to unpack (expected 2)\r\n```\r\n\r\n\n\n### Minimal API referenced by tests (typed signatures)\n_Added only when tests call brand\u2011new symbols introduced by the fix; types reflect annotations present in the repo or `Unknown` if not annotated._\n\n- Function in `pyscf/cc/eom_rccsd.py`: `def spatial2spin_eomsf(rx, orbspin) -> numpy.ndarray: ...`\n **Inputs:** rx: numpy.ndarray, orbspin: numpy.ndarray\n **Output:** numpy.ndarray\n\n- Function in `pyscf/cc/eom_uccsd.py`: `def spatial2spin_eomsf(rx, orbspin) -> numpy.ndarray: ...`\n **Inputs:** rx: numpy.ndarray, orbspin: numpy.ndarray\n **Output:** numpy.ndarray\n\n```python\ndef spatial2spin_eomsf(rx, orbspin) -> numpy.ndarray: ...\ndef spatial2spin_eomsf(rx, orbspin) -> numpy.ndarray: ...\n```"}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/pyscf_m_pyscf:pr-1426", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/pyscf/cc/addons.py b/pyscf/cc/addons.py\nindex 3869cd41cc..3c2c93fdc2 100644\n--- a/pyscf/cc/addons.py\n+++ b/pyscf/cc/addons.py\n@@ -25,17 +25,20 @@ def spatial2spin(tx, orbspin=None):\n return spatial2spin((tx,tx), orbspin)\n elif isinstance(tx, numpy.ndarray) and tx.ndim == 4:\n # RCCSD t2 amplitudes\n- t2aa = tx - tx.transpose(0,1,3,2)\n+ t2aa = tx - tx.transpose(1,0,2,3)\n return spatial2spin((t2aa,tx,t2aa), orbspin)\n elif len(tx) == 2: # t1\n t1a, t1b = tx\n nocc_a, nvir_a = t1a.shape\n nocc_b, nvir_b = t1b.shape\n- else:\n+ elif len(tx) == 3: # t2\n t2aa, t2ab, t2bb = tx\n nocc_a, nocc_b, nvir_a, nvir_b = t2ab.shape\n+ else:\n+ raise RuntimeError('Unknown T amplitudes')\n \n if orbspin is None:\n+ assert nocc_a == nocc_b\n orbspin = numpy.zeros((nocc_a+nvir_a)*2, dtype=int)\n orbspin[1::2] = 1\n \n@@ -79,10 +82,14 @@ def spatial2spin(tx, orbspin=None):\n spatial2spinorb = spatial2spin\n \n def spin2spatial(tx, orbspin):\n+ '''Convert T1/T2 in spin-orbital basis to T1/T2 in spatial orbital basis\n+ '''\n if tx.ndim == 2: # t1\n nocc, nvir = tx.shape\n- else:\n+ elif tx.ndim == 4:\n nocc, nvir = tx.shape[1:3]\n+ else:\n+ raise RuntimeError('Unknown T amplitudes')\n \n idxoa = numpy.where(orbspin[:nocc] == 0)[0]\n idxob = numpy.where(orbspin[:nocc] == 1)[0]\ndiff --git a/pyscf/cc/eom_gccsd.py b/pyscf/cc/eom_gccsd.py\nindex 8bc85b83af..fab78ae266 100644\n--- a/pyscf/cc/eom_gccsd.py\n+++ b/pyscf/cc/eom_gccsd.py\n@@ -17,7 +17,7 @@\n import numpy as np\n \n from pyscf import lib\n-from pyscf.lib import logger\n+from pyscf.lib import logger, module_method\n from pyscf.cc import ccsd\n from pyscf.cc import eom_rccsd\n from pyscf.cc import gccsd\n@@ -46,7 +46,7 @@ def ipccsd_matvec(eom, vector, imds=None, diag=None):\n if imds is None: imds = eom.make_imds()\n nocc = eom.nocc\n nmo = eom.nmo\n- r1, r2 = vector_to_amplitudes_ip(vector, nmo, nocc)\n+ r1, r2 = eom.vector_to_amplitudes(vector, nmo, nocc)\n \n # Eq. (8)\n Hr1 = -np.einsum('mi,m->i', imds.Foo, r1)\n@@ -62,7 +62,7 @@ def ipccsd_matvec(eom, vector, imds=None, diag=None):\n Hr2 += tmp2 - tmp2.transpose(1,0,2)\n Hr2 += 0.5*lib.einsum('mnef,mnf,ijae->ija', imds.Woovv, r2, imds.t2)\n \n- vector = amplitudes_to_vector_ip(Hr1, Hr2)\n+ vector = eom.amplitudes_to_vector(Hr1, Hr2)\n return vector\n \n def lipccsd_matvec(eom, vector, imds=None, diag=None):\n@@ -73,7 +73,7 @@ def lipccsd_matvec(eom, vector, imds=None, diag=None):\n imds = eom.make_imds()\n nocc = eom.nocc\n nmo = eom.nmo\n- r1, r2 = vector_to_amplitudes_ip(vector, nmo, nocc)\n+ r1, r2 = eom.vector_to_amplitudes(vector, nmo, nocc)\n \n Hr1 = -lib.einsum('mi,i->m', imds.Foo, r1)\n Hr1 += -0.5 * lib.einsum('maji,ija->m', imds.Wovoo, r2)\n@@ -89,7 +89,7 @@ def lipccsd_matvec(eom, vector, imds=None, diag=None):\n Hr2 += (tmp2 - tmp2.transpose(1, 0, 2))\n Hr2 += 0.5 * lib.einsum('mnef,ija,ijae->mnf', imds.Woovv, r2, imds.t2)\n \n- vector = amplitudes_to_vector_ip(Hr1, Hr2)\n+ vector = eom.amplitudes_to_vector(Hr1, Hr2)\n return vector\n \n def ipccsd_diag(eom, imds=None):\n@@ -111,7 +111,7 @@ def ipccsd_diag(eom, imds=None):\n Hr2[i,j,a] += 0.5*(np.dot(imds.Woovv[i,j,:,a], t2[i,j,a,:]) -\n np.dot(imds.Woovv[j,i,:,a], t2[i,j,a,:]))\n \n- vector = amplitudes_to_vector_ip(Hr1, Hr2)\n+ vector = eom.amplitudes_to_vector(Hr1, Hr2)\n return vector\n \n def ipccsd_star_contract(eom, ipccsd_evals, ipccsd_evecs, lipccsd_evecs, imds=None):\n@@ -145,14 +145,14 @@ def ipccsd_star_contract(eom, ipccsd_evals, ipccsd_evecs, lipccsd_evecs, imds=No\n foo = fock[:nocc, :nocc].diagonal()\n fvv = fock[nocc:, nocc:].diagonal()\n \n- oovv = _cp(eris.oovv)\n- ovvv = _cp(eris.ovvv)\n- ovov = _cp(eris.ovov)\n- #ovvo = -_cp(eris.ovov).transpose(0,1,3,2)\n- ooov = _cp(eris.ooov)\n- vooo = _cp(ooov).conj().transpose(3,2,1,0)\n- vvvo = _cp(ovvv).conj().transpose(3,2,1,0)\n- oooo = _cp(eris.oooo)\n+ oovv = np.asarray(eris.oovv)\n+ ovvv = np.asarray(eris.ovvv)\n+ ovov = np.asarray(eris.ovov)\n+ #ovvo = -np.asarray(eris.ovov).transpose(0,1,3,2)\n+ ooov = np.asarray(eris.ooov)\n+ vooo = np.asarray(ooov).conj().transpose(3,2,1,0)\n+ vvvo = np.asarray(ovvv).conj().transpose(3,2,1,0)\n+ oooo = np.asarray(eris.oooo)\n \n # Create denominator\n eijk = foo[:, None, None] + foo[None, :, None] + foo[None, None, :]\n@@ -179,8 +179,8 @@ def pij(tmp):\n ipccsd_evals = np.atleast_1d(ipccsd_evals)\n for ip_eval, ip_evec, ip_levec in zip(ipccsd_evals, ipccsd_evecs, lipccsd_evecs):\n # Enforcing <L|R> = 1\n- l1, l2 = vector_to_amplitudes_ip(ip_levec, nmo, nocc)\n- r1, r2 = vector_to_amplitudes_ip(ip_evec, nmo, nocc)\n+ l1, l2 = eom.vector_to_amplitudes(ip_levec, nmo, nocc)\n+ r1, r2 = eom.vector_to_amplitudes(ip_evec, nmo, nocc)\n ldotr = np.dot(l1, r1) + 0.5 * np.dot(l2.ravel(), r2.ravel())\n \n logger.info(eom, 'Left-right amplitude overlap : %14.8e', ldotr)\n@@ -229,13 +229,9 @@ class EOMIP(eom_rccsd.EOMIP):\n get_diag = ipccsd_diag\n ccsd_star_contract = ipccsd_star_contract\n \n- def vector_to_amplitudes(self, vector, nmo=None, nocc=None):\n- if nmo is None: nmo = self.nmo\n- if nocc is None: nocc = self.nocc\n- return vector_to_amplitudes_ip(vector, nmo, nocc)\n-\n- def amplitudes_to_vector(self, r1, r2):\n- return amplitudes_to_vector_ip(r1, r2)\n+ amplitudes_to_vector = staticmethod(amplitudes_to_vector_ip)\n+ vector_to_amplitudes = module_method(vector_to_amplitudes_ip,\n+ absences=['nmo', 'nocc'])\n \n def vector_size(self):\n nocc = self.nocc\n@@ -277,7 +273,7 @@ def eaccsd_matvec(eom, vector, imds=None, diag=None):\n if imds is None: imds = eom.make_imds()\n nocc = eom.nocc\n nmo = eom.nmo\n- r1, r2 = vector_to_amplitudes_ea(vector, nmo, nocc)\n+ r1, r2 = eom.vector_to_amplitudes(vector, nmo, nocc)\n \n # Eq. (30)\n Hr1 = np.einsum('ac,c->a', imds.Fvv, r1)\n@@ -293,7 +289,7 @@ def eaccsd_matvec(eom, vector, imds=None, diag=None):\n Hr2 += 0.5*lib.einsum('abcd,jcd->jab', imds.Wvvvv, r2)\n Hr2 -= 0.5*lib.einsum('klcd,lcd,kjab->jab', imds.Woovv, r2, imds.t2)\n \n- vector = amplitudes_to_vector_ea(Hr1, Hr2)\n+ vector = eom.amplitudes_to_vector(Hr1, Hr2)\n return vector\n \n def leaccsd_matvec(eom, vector, imds=None, diag=None):\n@@ -305,7 +301,7 @@ def leaccsd_matvec(eom, vector, imds=None, diag=None):\n imds = eom.make_imds()\n nocc = eom.nocc\n nmo = eom.nmo\n- r1, r2 = vector_to_amplitudes_ea(vector, nmo, nocc)\n+ r1, r2 = eom.vector_to_amplitudes(vector, nmo, nocc)\n \n # Eq. (32)\n Hr1 = lib.einsum('ac,a->c',imds.Fvv,r1)\n@@ -322,7 +318,7 @@ def leaccsd_matvec(eom, vector, imds=None, diag=None):\n Hr2 += 0.5*lib.einsum('abcd,jab->jcd',imds.Wvvvv,r2)\n Hr2 += -0.5*lib.einsum('klcd,jab,kjab->lcd',imds.Woovv,r2,imds.t2)\n \n- vector = amplitudes_to_vector_ea(Hr1,Hr2)\n+ vector = eom.amplitudes_to_vector(Hr1,Hr2)\n return vector\n \n def eaccsd_diag(eom, imds=None):\n@@ -345,7 +341,7 @@ def eaccsd_diag(eom, imds=None):\n Hr2[j,a,b] -= 0.5*(np.dot(imds.Woovv[:,j,a,b], t2[:,j,a,b]) -\n np.dot(imds.Woovv[:,j,b,a], t2[:,j,a,b]))\n \n- vector = amplitudes_to_vector_ea(Hr1, Hr2)\n+ vector = eom.amplitudes_to_vector(Hr1, Hr2)\n return vector\n \n def eaccsd_star_contract(eom, eaccsd_evals, eaccsd_evecs, leaccsd_evecs, imds=None):\n@@ -374,14 +370,14 @@ def eaccsd_star_contract(eom, eaccsd_evals, eaccsd_evecs, leaccsd_evecs, imds=No\n foo = fock[:nocc, :nocc].diagonal()\n fvv = fock[nocc:, nocc:].diagonal()\n \n- vvvv = _cp(eris.vvvv)\n- oovv = _cp(eris.oovv)\n- ovvv = _cp(eris.ovvv)\n- ovov = _cp(eris.ovov)\n- #ovvo = -_cp(eris.ovov).transpose(0,1,3,2)\n- ooov = _cp(eris.ooov)\n- vooo = _cp(ooov).conj().transpose(3,2,1,0)\n- vvvo = _cp(ovvv).conj().transpose(3,2,1,0)\n+ vvvv = np.asarray(eris.vvvv)\n+ oovv = np.asarray(eris.oovv)\n+ ovvv = np.asarray(eris.ovvv)\n+ ovov = np.asarray(eris.ovov)\n+ #ovvo = -np.asarray(eris.ovov).transpose(0,1,3,2)\n+ ooov = np.asarray(eris.ooov)\n+ vooo = np.asarray(ooov).conj().transpose(3,2,1,0)\n+ vvvo = np.asarray(ovvv).conj().transpose(3,2,1,0)\n \n # Create denominator\n eabc = fvv[:, None, None] + fvv[None, :, None] + fvv[None, None, :]\n@@ -408,8 +404,8 @@ def pab(tmp):\n eaccsd_evals = np.atleast_1d(eaccsd_evals)\n for ea_eval, ea_evec, ea_levec in zip(eaccsd_evals, eaccsd_evecs, leaccsd_evecs):\n # Enforcing <L|R> = 1\n- l1, l2 = vector_to_amplitudes_ea(ea_levec, nmo, nocc)\n- r1, r2 = vector_to_amplitudes_ea(ea_evec, nmo, nocc)\n+ l1, l2 = eom.vector_to_amplitudes(ea_levec, nmo, nocc)\n+ r1, r2 = eom.vector_to_amplitudes(ea_evec, nmo, nocc)\n ldotr = np.dot(l1, r1) + 0.5 * np.dot(l2.ravel(), r2.ravel())\n \n logger.info(eom, 'Left-right amplitude overlap : %14.8e', ldotr)\n@@ -460,13 +456,9 @@ class EOMEA(eom_rccsd.EOMEA):\n get_diag = eaccsd_diag\n ccsd_star_contract = eaccsd_star_contract\n \n- def vector_to_amplitudes(self, vector, nmo=None, nocc=None):\n- if nmo is None: nmo = self.nmo\n- if nocc is None: nocc = self.nocc\n- return vector_to_amplitudes_ea(vector, nmo, nocc)\n-\n- def amplitudes_to_vector(self, r1, r2):\n- return amplitudes_to_vector_ea(r1, r2)\n+ amplitudes_to_vector = staticmethod(amplitudes_to_vector_ea)\n+ vector_to_amplitudes = module_method(vector_to_amplitudes_ea,\n+ absences=['nmo', 'nocc'])\n \n def vector_size(self):\n nocc = self.nocc\n@@ -500,7 +492,7 @@ def eeccsd_matvec(eom, vector, imds=None, diag=None):\n if imds is None: imds = eom.make_imds()\n nocc = eom.nocc\n nmo = eom.nmo\n- r1, r2 = vector_to_amplitudes_ee(vector, nmo, nocc)\n+ r1, r2 = eom.vector_to_amplitudes(vector, nmo, nocc)\n \n # Eq. (9)\n Hr1 = lib.einsum('ae,ie->ia', imds.Fvv, r1)\n@@ -529,7 +521,7 @@ def eeccsd_matvec(eom, vector, imds=None, diag=None):\n Hr2 += 0.5*lib.einsum('mnij,mnab->ijab', imds.Woooo, r2)\n Hr2 += 0.5*lib.einsum('abef,ijef->ijab', imds.Wvvvv, r2)\n \n- vector = amplitudes_to_vector_ee(Hr1, Hr2)\n+ vector = eom.amplitudes_to_vector(Hr1, Hr2)\n return vector\n \n def eeccsd_diag(eom, imds=None):\n@@ -564,7 +556,7 @@ def eeccsd_diag(eom, imds=None):\n for j in range(i):\n Hr2[i,j,:,:] += 0.5*(imds.Woooo[i,j,i,j]-imds.Woooo[j,i,i,j])\n \n- vector = amplitudes_to_vector_ee(Hr1, Hr2)\n+ vector = eom.amplitudes_to_vector(Hr1, Hr2)\n return vector\n \n \n@@ -596,13 +588,9 @@ def gen_matvec(self, imds=None, **kwargs):\n matvec = lambda xs: [self.matvec(x, imds) for x in xs]\n return matvec, diag\n \n- def vector_to_amplitudes(self, vector, nmo=None, nocc=None):\n- if nmo is None: nmo = self.nmo\n- if nocc is None: nocc = self.nocc\n- return vector_to_amplitudes_ee(vector, nmo, nocc)\n-\n- def amplitudes_to_vector(self, r1, r2):\n- return amplitudes_to_vector_ee(r1, r2)\n+ amplitudes_to_vector = staticmethod(amplitudes_to_vector_ee)\n+ vector_to_amplitudes = module_method(vector_to_amplitudes_ee,\n+ absences=['nmo', 'nocc'])\n \n def vector_size(self):\n '''size of the vector based on spin-orbital basis'''\n@@ -747,41 +735,3 @@ def make_ee(self):\n self.made_ee_imds = True\n logger.timer(self, 'EOM-CCSD EE intermediates', *cput0)\n return self\n-\n-def _cp(a):\n- return np.array(a, copy=False, order='C')\n-\n-if __name__ == '__main__':\n- from pyscf import scf\n- from pyscf import gto\n- from pyscf.cc import gccsd\n- mol = gto.Mole()\n- mol.atom = [\n- [8 , (0. , 0. , 0.)],\n- [1 , (0. , -0.757 , 0.587)],\n- [1 , (0. , 0.757 , 0.587)]]\n- mol.basis = 'cc-pvdz'\n- mol.spin = 0\n- mol.build()\n- mf = scf.UHF(mol).run()\n- mf = scf.addons.convert_to_ghf(mf)\n-\n- mycc = gccsd.GCCSD(mf)\n- ecc, t1, t2 = mycc.kernel()\n- print(ecc - -0.2133432712431435)\n- e,v = mycc.ipccsd(nroots=8)\n- print(e[0] - 0.4335604332073799)\n- print(e[2] - 0.5187659896045407)\n- print(e[4] - 0.6782876002229172)\n-\n- #mycc.verbose = 5\n- e,v = mycc.eaccsd(nroots=8)\n- print(e[0] - 0.16737886338859731)\n- print(e[2] - 0.24027613852009164)\n- print(e[4] - 0.51006797826488071)\n-\n- e,v = mycc.eeccsd(nroots=4)\n- print(e[0] - 0.2757159395886167)\n- print(e[1] - 0.2757159395886167)\n- print(e[2] - 0.2757159395886167)\n- print(e[3] - 0.3005716731825082)\ndiff --git a/pyscf/cc/eom_rccsd.py b/pyscf/cc/eom_rccsd.py\nindex 7a2467dd1a..b0cb3f2c1f 100644\n--- a/pyscf/cc/eom_rccsd.py\n+++ b/pyscf/cc/eom_rccsd.py\n@@ -23,7 +23,7 @@\n \n from pyscf import lib\n from pyscf import ao2mo\n-from pyscf.lib import logger\n+from pyscf.lib import logger, module_method\n from pyscf.cc import ccsd\n from pyscf.cc import rintermediates as imd\n from pyscf import __config__\n@@ -274,12 +274,22 @@ def amplitudes_to_vector_ip(r1, r2):\n vector = np.hstack((r1, r2.ravel()))\n return vector\n \n+def spatial2spin_ip(rx, orbspin=None):\n+ from pyscf.cc import eom_uccsd\n+ if rx.ndim == 1:\n+ r1 = (rx, np.zeros_like(rx))\n+ return eom_uccsd.spatial2spin_ip(r1, orbspin)\n+ else:\n+ rx0 = np.zeros_like(rx)\n+ r2 = (rx.transpose(1,0,2)-rx, rx0, -rx, rx0)\n+ return eom_uccsd.spatial2spin_ip(r2, orbspin)\n+\n def ipccsd_matvec(eom, vector, imds=None, diag=None):\n # Ref: Nooijen and Snijders, J. Chem. Phys. 102, 1681 (1995) Eqs.(8)-(9)\n if imds is None: imds = eom.make_imds()\n nocc = eom.nocc\n nmo = eom.nmo\n- r1, r2 = vector_to_amplitudes_ip(vector, nmo, nocc)\n+ r1, r2 = eom.vector_to_amplitudes(vector, nmo, nocc)\n \n # 1h-1h block\n Hr1 = -np.einsum('ki,k->i', imds.Loo, r1)\n@@ -300,7 +310,7 @@ def ipccsd_matvec(eom, vector, imds=None, diag=None):\n Hr2 += -lib.einsum('ki,kjb->ijb', foo, r2)\n Hr2 += -lib.einsum('lj,ilb->ijb', foo, r2)\n elif eom.partition == 'full':\n- diag_matrix2 = vector_to_amplitudes_ip(diag, nmo, nocc)[1]\n+ diag_matrix2 = eom.vector_to_amplitudes(diag, nmo, nocc)[1]\n Hr2 += diag_matrix2 * r2\n else:\n Hr2 += lib.einsum('bd,ijd->ijb', imds.Lvv, r2)\n@@ -315,7 +325,7 @@ def ipccsd_matvec(eom, vector, imds=None, diag=None):\n tmp += -np.einsum('kldc,kld->c', imds.Woovv, r2)\n Hr2 += -np.einsum('c,ijcb->ijb', tmp, imds.t2)\n \n- vector = amplitudes_to_vector_ip(Hr1, Hr2)\n+ vector = eom.amplitudes_to_vector(Hr1, Hr2)\n return vector\n \n def lipccsd_matvec(eom, vector, imds=None, diag=None):\n@@ -327,7 +337,7 @@ def lipccsd_matvec(eom, vector, imds=None, diag=None):\n if imds is None: imds = eom.make_imds()\n nocc = eom.nocc\n nmo = eom.nmo\n- r1, r2 = vector_to_amplitudes_ip(vector, nmo, nocc)\n+ r1, r2 = eom.vector_to_amplitudes(vector, nmo, nocc)\n \n # 1h-1h block\n Hr1 = -np.einsum('ki,i->k', imds.Loo, r1)\n@@ -347,7 +357,7 @@ def lipccsd_matvec(eom, vector, imds=None, diag=None):\n Hr2 += -lib.einsum('ki,ild->kld', foo, r2)\n Hr2 += -lib.einsum('lj,kjd->kld', foo, r2)\n elif eom.partition == 'full':\n- diag_matrix2 = vector_to_amplitudes_ip(diag, nmo, nocc)[1]\n+ diag_matrix2 = eom.vector_to_amplitudes(diag, nmo, nocc)[1]\n Hr2 += diag_matrix2 * r2\n else:\n Hr2 += lib.einsum('bd,klb->kld', imds.Lvv, r2)\n@@ -360,7 +370,7 @@ def lipccsd_matvec(eom, vector, imds=None, diag=None):\n tmp = np.einsum('ijcb,ijb->c', imds.t2, r2)\n Hr2 += -np.einsum('lkdc,c->kld', 2.*imds.Woovv-imds.Woovv.transpose(1,0,2,3), tmp)\n \n- vector = amplitudes_to_vector_ip(Hr1, Hr2)\n+ vector = eom.amplitudes_to_vector(Hr1, Hr2)\n return vector\n \n def ipccsd_diag(eom, imds=None):\n@@ -393,7 +403,7 @@ def ipccsd_diag(eom, imds=None):\n Hr2[i,j,b] += -2*np.dot(imds.Woovv[j,i,b,:], t2[i,j,:,b])\n Hr2[i,j,b] += np.dot(imds.Woovv[i,j,b,:], t2[i,j,:,b])\n \n- vector = amplitudes_to_vector_ip(Hr1, Hr2)\n+ vector = eom.amplitudes_to_vector(Hr1, Hr2)\n return vector\n \n def ipccsd_star_contract(eom, ipccsd_evals, ipccsd_evecs, lipccsd_evecs, imds=None):\n@@ -555,13 +565,10 @@ def gen_matvec(self, imds=None, left=False, **kwargs):\n matvec = lambda xs: [self.matvec(x, imds, diag) for x in xs]\n return matvec, diag\n \n- def vector_to_amplitudes(self, vector, nmo=None, nocc=None):\n- if nmo is None: nmo = self.nmo\n- if nocc is None: nocc = self.nocc\n- return vector_to_amplitudes_ip(vector, nmo, nocc)\n-\n- def amplitudes_to_vector(self, r1, r2):\n- return amplitudes_to_vector_ip(r1, r2)\n+ amplitudes_to_vector = staticmethod(amplitudes_to_vector_ip)\n+ vector_to_amplitudes = module_method(vector_to_amplitudes_ip,\n+ absences=['nmo', 'nocc'])\n+ spatial2spin = staticmethod(spatial2spin_ip)\n \n def vector_size(self):\n nocc = self.nocc\n@@ -619,13 +626,23 @@ def amplitudes_to_vector_ea(r1, r2):\n vector = np.hstack((r1, r2.ravel()))\n return vector\n \n+def spatial2spin_ea(rx, orbspin=None):\n+ from pyscf.cc import eom_uccsd\n+ if rx.ndim == 1:\n+ r1 = (rx, np.zeros_like(rx))\n+ return eom_uccsd.spatial2spin_ea(r1, orbspin)\n+ else:\n+ rx0 = np.zeros_like(rx)\n+ r2 = (rx-rx.transpose(0,2,1), rx0, rx, rx0)\n+ return eom_uccsd.spatial2spin_ea(r2, orbspin)\n+\n def eaccsd_matvec(eom, vector, imds=None, diag=None):\n # Ref: Nooijen and Bartlett, J. Chem. Phys. 102, 3629 (1995) Eqs.(30)-(31)\n if imds is None: imds = eom.make_imds()\n nocc = eom.nocc\n nmo = eom.nmo\n nvir = nmo - nocc\n- r1, r2 = vector_to_amplitudes_ea(vector, nmo, nocc)\n+ r1, r2 = eom.vector_to_amplitudes(vector, nmo, nocc)\n \n # Eq. (37)\n # 1p-1p block\n@@ -646,7 +663,7 @@ def eaccsd_matvec(eom, vector, imds=None, diag=None):\n Hr2 += lib.einsum('bd,jad->jab', fvv, r2)\n Hr2 += -lib.einsum('lj,lab->jab', foo, r2)\n elif eom.partition == 'full':\n- diag_matrix2 = vector_to_amplitudes_ea(diag, nmo, nocc)[1]\n+ diag_matrix2 = eom.vector_to_amplitudes(diag, nmo, nocc)[1]\n Hr2 += diag_matrix2 * r2\n else:\n Hr2 += lib.einsum('ac,jcb->jab', imds.Lvv, r2)\n@@ -660,7 +677,7 @@ def eaccsd_matvec(eom, vector, imds=None, diag=None):\n tmp = np.einsum('klcd,lcd->k', 2.*imds.Woovv-imds.Woovv.transpose(0,1,3,2), r2)\n Hr2 += -np.einsum('k,kjab->jab', tmp, imds.t2)\n \n- vector = amplitudes_to_vector_ea(Hr1,Hr2)\n+ vector = eom.amplitudes_to_vector(Hr1,Hr2)\n return vector\n \n def leaccsd_matvec(eom, vector, imds=None, diag=None):\n@@ -672,7 +689,7 @@ def leaccsd_matvec(eom, vector, imds=None, diag=None):\n nocc = eom.nocc\n nmo = eom.nmo\n nvir = nmo - nocc\n- r1, r2 = vector_to_amplitudes_ea(vector, nmo, nocc)\n+ r1, r2 = eom.vector_to_amplitudes(vector, nmo, nocc)\n \n # Eq. (30)\n # 1p-1p block\n@@ -693,7 +710,7 @@ def leaccsd_matvec(eom, vector, imds=None, diag=None):\n Hr2 += lib.einsum('lcb,bd->lcd', r2, fvv)\n Hr2 += -lib.einsum('jcd,lj->lcd', r2, foo)\n elif eom.partition == 'full':\n- diag_matrix2 = vector_to_amplitudes_ea(diag, nmo, nocc)[1]\n+ diag_matrix2 = eom.vector_to_amplitudes(diag, nmo, nocc)[1]\n Hr2 += diag_matrix2 * r2\n else:\n Hr2 += lib.einsum('lad,ac->lcd', r2, imds.Lvv)\n@@ -707,7 +724,7 @@ def leaccsd_matvec(eom, vector, imds=None, diag=None):\n tmp = np.einsum('ijcb,ibc->j', imds.t2, r2)\n Hr2 += -np.einsum('kjfe,j->kef', 2.*imds.Woovv-imds.Woovv.transpose(0,1,3,2),tmp)\n \n- vector = amplitudes_to_vector_ea(Hr1,Hr2)\n+ vector = eom.amplitudes_to_vector(Hr1,Hr2)\n return vector\n \n def eaccsd_diag(eom, imds=None):\n@@ -743,7 +760,7 @@ def eaccsd_diag(eom, imds=None):\n Hr2[j,a,b] += -2*np.dot(imds.Woovv[:,j,a,b], t2[:,j,a,b])\n Hr2[j,a,b] += np.dot(imds.Woovv[:,j,b,a], t2[:,j,a,b])\n \n- vector = amplitudes_to_vector_ea(Hr1,Hr2)\n+ vector = eom.amplitudes_to_vector(Hr1,Hr2)\n return vector\n \n def eaccsd_star_contract(eom, eaccsd_evals, eaccsd_evecs, leaccsd_evecs, imds=None):\n@@ -914,13 +931,10 @@ def gen_matvec(self, imds=None, left=False, **kwargs):\n matvec = lambda xs: [self.matvec(x, imds, diag) for x in xs]\n return matvec, diag\n \n- def vector_to_amplitudes(self, vector, nmo=None, nocc=None):\n- if nmo is None: nmo = self.nmo\n- if nocc is None: nocc = self.nocc\n- return vector_to_amplitudes_ea(vector, nmo, nocc)\n-\n- def amplitudes_to_vector(self, r1, r2):\n- return amplitudes_to_vector_ea(r1, r2)\n+ amplitudes_to_vector = staticmethod(amplitudes_to_vector_ea)\n+ vector_to_amplitudes = module_method(vector_to_amplitudes_ea,\n+ absences=['nmo', 'nocc'])\n+ spatial2spin = staticmethod(spatial2spin_ea)\n \n def vector_size(self):\n nocc = self.nocc\n@@ -1068,6 +1082,18 @@ def eomsf_ccsd(eom, nroots=1, koopmans=False, guess=None,\n vector_to_amplitudes_ee = vector_to_amplitudes_singlet = ccsd.vector_to_amplitudes\n amplitudes_to_vector_ee = amplitudes_to_vector_singlet = ccsd.amplitudes_to_vector\n \n+def spatial2spin_singlet(rx, orbspin=None):\n+ from pyscf.cc import eom_uccsd\n+ if rx.ndim == 2:\n+ r1a = rx * .5**.5\n+ r1 = (r1a, r1a)\n+ return eom_uccsd.spatial2spin_eomee(r1, orbspin)\n+ else:\n+ r2ab = rx * .5**.5\n+ r2aa = r2ab - r2ab.transpose(1,0,2,3)\n+ r2 = (r2aa, r2ab, r2aa)\n+ return eom_uccsd.spatial2spin_eomee(r2, orbspin)\n+\n def amplitudes_to_vector_eomsf(t1, t2, out=None):\n nocc, nvir = t1.shape\n t2baaa, t2aaba = t2\n@@ -1102,6 +1128,16 @@ def vector_to_amplitudes_eomsf(vector, nmo, nocc):\n t2aaba = t2aaba.reshape(nocc,nocc,nvir,nvir)\n return t1, (t2baaa, t2aaba)\n \n+def spatial2spin_eomsf(rx, orbspin=None):\n+ from pyscf.cc import eom_uccsd\n+ if isinstance(rx, np.ndarray) and rx.ndim == 2:\n+ r1 = (rx, np.zeros_like(rx))\n+ return eom_uccsd.spatial2spin_eomsf(r1, orbspin)\n+ else:\n+ rx0 = np.zeros_like(rx[0])\n+ r2 = (rx0, rx[1], rx[0], rx0)\n+ return eom_uccsd.spatial2spin_eomsf(r2, orbspin)\n+\n def amplitudes_to_vector_triplet(t1, t2, out=None):\n t2aa, t2ab = t2\n dtype = np.result_type(t1, t2aa, t2ab)\n@@ -1125,13 +1161,26 @@ def vector_to_amplitudes_triplet(vector, nmo, nocc):\n t2ab = t2ab.reshape(nocc,nvir,nocc,nvir).transpose(0,2,1,3).copy()\n return t1, (t2aa, t2ab)\n \n+def spatial2spin_triplet(rx, orbspin=None):\n+ from pyscf.cc import eom_uccsd\n+ if isinstance(rx, np.ndarray) and rx.ndim == 2:\n+ r1a = rx * .5**.5\n+ r1 = (r1a, r1a)\n+ return eom_uccsd.spatial2spin_eomee(r1, orbspin)\n+ else:\n+ r2ab = rx * .5**.5\n+ r2aa, r2ab = rx\n+ r2aa = r2ab - r2ab.transpose(1,0,2,3)\n+ r2 = (r2aa, r2ab, -r2aa)\n+ return eom_uccsd.spatial2spin_eomee(r2, orbspin)\n+\n def eeccsd_matvec_singlet(eom, vector, imds=None):\n if imds is None: imds = eom.make_imds()\n nocc = eom.nocc\n nmo = eom.nmo\n nvir = nmo - nocc\n \n- r1, r2 = vector_to_amplitudes_singlet(vector, nmo, nocc)\n+ r1, r2 = eom.vector_to_amplitudes(vector, nmo, nocc)\n t1, t2, eris = imds.t1, imds.t2, imds.eris\n nocc, nvir = t1.shape\n \n@@ -1219,7 +1268,7 @@ def eeccsd_matvec_singlet(eom, vector, imds=None):\n tau = tmp = eris_ovov = None\n \n Hr2 = Hr2 + Hr2.transpose(1,0,3,2)\n- vector = amplitudes_to_vector_ee(Hr1, Hr2)\n+ vector = eom.amplitudes_to_vector(Hr1, Hr2)\n return vector\n \n def eeccsd_matvec_triplet(eom, vector, imds=None):\n@@ -1228,7 +1277,7 @@ def eeccsd_matvec_triplet(eom, vector, imds=None):\n nmo = eom.nmo\n nvir = nmo - nocc\n \n- r1, r2 = vector_to_amplitudes_triplet(vector, nmo, nocc)\n+ r1, r2 = eom.vector_to_amplitudes(vector, nmo, nocc)\n r2aa, r2ab = r2\n t1, t2, eris = imds.t1, imds.t2, imds.eris\n nocc, nvir = t1.shape\n@@ -1287,10 +1336,11 @@ def eeccsd_matvec_triplet(eom, vector, imds=None):\n Hr2ab += lib.einsum('MBEJ,iMEa->iJaB', woVVo, r2aa)\n Hr2ab += lib.einsum('MbeJ,iMeA->iJbA', woVVo, r2ab)\n \n- woVVo = woVVo + np.asarray(imds.woVvO)\n+ woVvO = np.asarray(imds.woVvO)\n+ wovvo = woVVo + woVvO\n theta = r2aa + r2ab\n- tmp = lib.einsum('mbej,imae->ijab', woVVo, theta)\n- woVVo = None\n+ tmp = lib.einsum('mbej,imae->ijab', wovvo, theta)\n+ woVVo = woVvO = wovvo = None\n \n woOoV = np.asarray(imds.woOoV)\n Hr1 -= lib.einsum('mnie,mnae->ia', woOoV, theta)\n@@ -1344,7 +1394,7 @@ def eeccsd_matvec_triplet(eom, vector, imds=None):\n Hr2aa = Hr2aa - Hr2aa.transpose(0,1,3,2)\n Hr2aa = Hr2aa - Hr2aa.transpose(1,0,2,3)\n Hr2ab = Hr2ab - Hr2ab.transpose(1,0,3,2)\n- vector = amplitudes_to_vector_triplet(Hr1, (Hr2aa,Hr2ab))\n+ vector = eom.amplitudes_to_vector(Hr1, (Hr2aa,Hr2ab))\n return vector\n \n def eeccsd_matvec_sf(eom, vector, imds=None):\n@@ -1355,7 +1405,7 @@ def eeccsd_matvec_sf(eom, vector, imds=None):\n nvir = nmo - nocc\n \n t1, t2, eris = imds.t1, imds.t2, imds.eris\n- r1, r2 = vector_to_amplitudes_eomsf(vector, nmo, nocc)\n+ r1, r2 = eom.vector_to_amplitudes(vector, nmo, nocc)\n r2baaa, r2aaba = r2\n nocc, nvir = t1.shape\n \n@@ -1493,7 +1543,7 @@ def eeccsd_matvec_sf(eom, vector, imds=None):\n \n Hr2baaa = Hr2baaa - Hr2baaa.transpose(0,1,3,2)\n Hr2aaba = Hr2aaba - Hr2aaba.transpose(1,0,2,3)\n- vector = amplitudes_to_vector_eomsf(Hr1, (Hr2baaa,Hr2aaba))\n+ vector = eom.amplitudes_to_vector(Hr1, (Hr2baaa,Hr2aaba))\n return vector\n \n def eeccsd_diag(eom, imds=None):\n@@ -1655,13 +1705,10 @@ def gen_matvec(self, imds=None, diag=None, **kwargs):\n matvec = lambda xs: [self.matvec(x, imds) for x in xs]\n return matvec, diag\n \n- def vector_to_amplitudes(self, vector, nmo=None, nocc=None):\n- if nmo is None: nmo = self.nmo\n- if nocc is None: nocc = self.nocc\n- return vector_to_amplitudes_singlet(vector, nmo, nocc)\n-\n- def amplitudes_to_vector(self, r1, r2):\n- return amplitudes_to_vector_singlet(r1, r2)\n+ amplitudes_to_vector = staticmethod(amplitudes_to_vector_singlet)\n+ vector_to_amplitudes = module_method(vector_to_amplitudes_singlet,\n+ absences=['nmo', 'nocc'])\n+ spatial2spin = staticmethod(spatial2spin_singlet)\n \n def vector_size(self):\n nocc = self.nocc\n@@ -1681,13 +1728,10 @@ def gen_matvec(self, imds=None, diag=None, **kwargs):\n matvec = lambda xs: [self.matvec(x, imds) for x in xs]\n return matvec, diag\n \n- def vector_to_amplitudes(self, vector, nmo=None, nocc=None):\n- if nmo is None: nmo = self.nmo\n- if nocc is None: nocc = self.nocc\n- return vector_to_amplitudes_triplet(vector, nmo, nocc)\n-\n- def amplitudes_to_vector(self, r1, r2):\n- return amplitudes_to_vector_triplet(r1, r2)\n+ amplitudes_to_vector = staticmethod(amplitudes_to_vector_triplet)\n+ vector_to_amplitudes = module_method(vector_to_amplitudes_triplet,\n+ absences=['nmo', 'nocc'])\n+ spatial2spin = staticmethod(spatial2spin_triplet)\n \n def vector_size(self):\n nocc = self.nocc\n@@ -1707,13 +1751,10 @@ def gen_matvec(self, imds=None, diag=None, **kwargs):\n matvec = lambda xs: [self.matvec(x, imds) for x in xs]\n return matvec, diag\n \n- def vector_to_amplitudes(self, vector, nmo=None, nocc=None):\n- if nmo is None: nmo = self.nmo\n- if nocc is None: nocc = self.nocc\n- return vector_to_amplitudes_eomsf(vector, nmo, nocc)\n-\n- def amplitudes_to_vector(self, r1, r2):\n- return amplitudes_to_vector_eomsf(r1, r2)\n+ amplitudes_to_vector = staticmethod(amplitudes_to_vector_eomsf)\n+ vector_to_amplitudes = module_method(vector_to_amplitudes_eomsf,\n+ absences=['nmo', 'nocc'])\n+ spatial2spin = staticmethod(spatial2spin_eomsf)\n \n def vector_size(self):\n nocc = self.nocc\n@@ -1934,6 +1975,7 @@ def make_ee(self):\n self.woVvO[p0:p1] = woVvO\n self.woVVo[p0:p1] = woVVo\n \n+ self.Fov += fov\n self.Foo += foo + 0.5*np.einsum('me,ie->mi', self.Fov+fov, t1)\n self.Fvv += fvv - 0.5*np.einsum('me,ma->ae', self.Fov+fov, t1)\n \n@@ -2041,157 +2083,3 @@ def _make_tau(t2, t1, r1, fac=1, out=None):\n tau *= fac * .5\n tau += t2\n return tau\n-\n-def _cp(a):\n- return np.array(a, copy=False, order='C')\n-\n-\n-if __name__ == '__main__':\n- from pyscf import scf\n- from pyscf import gto\n- from pyscf.cc import rccsd\n-\n- mol = gto.Mole()\n- mol.atom = [\n- [8 , (0. , 0. , 0.)],\n- [1 , (0. , -0.757 , 0.587)],\n- [1 , (0. , 0.757 , 0.587)]]\n- mol.basis = 'cc-pvdz'\n- mol.verbose = 0\n- mol.spin = 0\n- mol.build()\n- mf = scf.RHF(mol).run(conv_tol=1e-14)\n-\n- mycc = rccsd.RCCSD(mf)\n- ecc, t1, t2 = mycc.kernel()\n- print(ecc - -0.21334326214236796)\n-\n- myeom = EOMIP(mycc)\n- print(\"IP energies... (right eigenvector)\")\n- e,v = ipccsd(myeom, nroots=3)\n- print(e[0] - 0.43356041409195489)\n- print(e[1] - 0.51876598058509493)\n- print(e[2] - 0.6782879569941862 )\n-\n- print(\"IP energies... (left eigenvector)\")\n- le,lv = ipccsd(myeom, nroots=3,left=True)\n- print(le[0] - 0.43356040428879794)\n- print(le[1] - 0.51876597800180335)\n- print(le[2] - 0.67828755013874864)\n-\n- e = myeom.ipccsd_star_contract(e, v, lv)\n- print(e[0] - 0.43793202073189047)\n- print(e[1] - 0.52287073446559729)\n- print(e[2] - 0.67994597948852287)\n-\n- myeom = EOMEA(mycc)\n- print(\"EA energies... (right eigenvector)\")\n- e,v = eaccsd(myeom, nroots=3)\n- print(e[0] - 0.16737886282063008)\n- print(e[1] - 0.24027622989542635)\n- print(e[2] - 0.51006796667905585)\n-\n- print(\"EA energies... (left eigenvector)\")\n- le,lv = eaccsd(myeom, nroots=3, left=True)\n- print(le[0] - 0.16737896537079733)\n- print(le[1] - 0.24027634198123343)\n- print(le[2] - 0.51006809015066612)\n-\n- e = myeom.eaccsd_star_contract(e,v,lv)\n- print(e[0] - 0.16656250953550664)\n- print(e[1] - 0.23944144521387614)\n- print(e[2] - 0.41399436888830721)\n-\n- myeom = EOMEESpinFlip(mycc)\n- np.random.seed(1)\n- v = np.random.random(myeom.vector_size())\n- r1, r2 = vector_to_amplitudes_eomsf(v, myeom.nmo, myeom.nocc)\n- print(lib.finger(r1) - 0.017703197938757409)\n- print(lib.finger(r2[0]) --21.605764517401415)\n- print(lib.finger(r2[1]) - 6.5857056438834842)\n- print(abs(amplitudes_to_vector_eomsf(r1, r2) - v).max())\n-\n- myeom = EOMEE(mycc)\n- e,v = myeom.eeccsd(nroots=1)\n- print(e - 0.2757159395886167)\n-\n- e,v = myeom.eeccsd(nroots=4)\n- print(e[0] - 0.2757159395886167)\n- print(e[1] - 0.2757159395886167)\n- print(e[2] - 0.2757159395886167)\n- print(e[3] - 0.3005716731825082)\n-\n- e,v = myeom.eeccsd(nroots=4, koopmans=True)\n- print(e[0] - 0.2757159395886167)\n- print(e[1] - 0.2757159395886167)\n- print(e[2] - 0.2757159395886167)\n- print(e[3] - 0.3005716731825082)\n-\n- e,v = myeom.eeccsd(nroots=4, guess=v[:4])\n- print(e[0] - 0.2757159395886167)\n- print(e[1] - 0.2757159395886167)\n- print(e[2] - 0.2757159395886167)\n- print(e[3] - 0.3005716731825082)\n-\n-\n- mycc = ccsd.CCSD(mf)\n- ecc, t1, t2 = mycc.kernel()\n- print(ecc - -0.21334326214236796)\n-\n- myeom = EOMIP(mycc)\n- print(\"IP energies... (right eigenvector)\")\n- e,v = ipccsd(myeom, nroots=3)\n- print(e[0] - 0.43356041409195489)\n- print(e[1] - 0.51876598058509493)\n- print(e[2] - 0.6782879569941862 )\n-\n- print(\"IP energies... (left eigenvector)\")\n- le,lv = ipccsd(myeom, nroots=3,left=True)\n- print(le[0] - 0.43356040428879794)\n- print(le[1] - 0.51876597800180335)\n- print(le[2] - 0.67828755013874864)\n-\n- e = myeom.ipccsd_star_contract(e, v, lv)\n- print(e[0] - 0.43793202073189047)\n- print(e[1] - 0.52287073446559729)\n- print(e[2] - 0.67994597948852287)\n-\n- myeom = EOMEA(mycc)\n- print(\"EA energies... (right eigenvector)\")\n- e,v = eaccsd(myeom, nroots=3)\n- print(e[0] - 0.16737886282063008)\n- print(e[1] - 0.24027622989542635)\n- print(e[2] - 0.51006796667905585)\n-\n- print(\"EA energies... (left eigenvector)\")\n- le,lv = eaccsd(myeom, nroots=3, left=True)\n- print(le[0] - 0.16737896537079733)\n- print(le[1] - 0.24027634198123343)\n- print(le[2] - 0.51006809015066612)\n-\n- e = myeom.eaccsd_star_contract(e,v,lv)\n- print(e[0] - 0.16656250953550664)\n- print(e[1] - 0.23944144521387614)\n- print(e[2] - 0.41399436888830721)\n-\n- myeom = EOMEE(mycc)\n- e,v = myeom.eeccsd(nroots=1)\n- print(e - 0.2757159395886167)\n-\n- e,v = myeom.eeccsd(nroots=4)\n- print(e[0] - 0.2757159395886167)\n- print(e[1] - 0.2757159395886167)\n- print(e[2] - 0.2757159395886167)\n- print(e[3] - 0.3005716731825082)\n-\n- e,v = myeom.eeccsd(nroots=4, koopmans=True)\n- print(e[0] - 0.2757159395886167)\n- print(e[1] - 0.2757159395886167)\n- print(e[2] - 0.2757159395886167)\n- print(e[3] - 0.3005716731825082)\n-\n- e,v = myeom.eeccsd(nroots=4, guess=v[:4])\n- print(e[0] - 0.2757159395886167)\n- print(e[1] - 0.2757159395886167)\n- print(e[2] - 0.2757159395886167)\n- print(e[3] - 0.3005716731825082)\ndiff --git a/pyscf/cc/eom_uccsd.py b/pyscf/cc/eom_uccsd.py\nindex d2870749a2..46ccde6491 100644\n--- a/pyscf/cc/eom_uccsd.py\n+++ b/pyscf/cc/eom_uccsd.py\n@@ -25,10 +25,11 @@\n import numpy as np\n \n from pyscf import lib\n-from pyscf.lib import logger\n+from pyscf.lib import logger, module_method\n from pyscf import ao2mo\n from pyscf.cc import ccsd\n from pyscf.cc import uccsd\n+from pyscf.cc import addons\n from pyscf.cc import eom_rccsd\n from pyscf.cc import uintermediates\n \n@@ -75,16 +76,30 @@ def amplitudes_to_vector_ip(r1, r2):\n r2aaa[idxa].ravel(), r2baa.ravel(),\n r2abb.ravel(), r2bbb[idxb].ravel()))\n \n-def spatial2spin_ip(r1, r2, orbspin=None):\n- '''Convert R1/R2 of spatial orbital representation to R1/R2 of\n- spin-orbital representation\n- '''\n- r1a, r1b = r1\n- r2aaa, r2baa, r2abb, r2bbb = r2\n+def spatial2spin_ip(rx, orbspin=None):\n+ '''Convert EOMIP spatial-orbital R1/R2 to spin-orbital R1/R2'''\n+ if len(rx) == 2: # r1\n+ r1a, r1b = rx\n+ nocc_a = r1a.size\n+ nocc_b = r1b.size\n+ nocc = nocc_a + nocc_b\n+\n+ r1 = np.zeros(nocc, dtype=r1a.dtype)\n+ if orbspin is None:\n+ assert nocc_a == nocc_b\n+ r1[0::2] = r1a\n+ r1[1::2] = r1b\n+ else:\n+ r1[orbspin[:nocc] == 0] = r1a\n+ r1[orbspin[:nocc] == 1] = r1b\n+ return r1\n+\n+ r2aaa, r2baa, r2abb, r2bbb = rx\n nocc_a, nvir_a = r2aaa.shape[1:]\n nocc_b, nvir_b = r2bbb.shape[1:]\n \n if orbspin is None:\n+ assert nocc_a == nocc_b\n orbspin = np.zeros((nocc_a+nvir_a)*2, dtype=int)\n orbspin[1::2] = 1\n \n@@ -95,10 +110,6 @@ def spatial2spin_ip(r1, r2, orbspin=None):\n idxva = np.where(orbspin[nocc:] == 0)[0]\n idxvb = np.where(orbspin[nocc:] == 1)[0]\n \n- r1 = np.zeros((nocc), dtype=r1a.dtype)\n- r1[idxoa] = r1a\n- r1[idxob] = r1b\n-\n r2 = np.zeros((nocc**2, nvir), dtype=r2aaa.dtype)\n idxoaa = idxoa[:,None] * nocc + idxoa\n idxoab = idxoa[:,None] * nocc + idxob\n@@ -120,10 +131,17 @@ def spatial2spin_ip(r1, r2, orbspin=None):\n r2bab = -r2abb\n lib.takebak_2d(r2, r2aba, idxoab.T.ravel(), idxva.ravel())\n lib.takebak_2d(r2, r2bab, idxoba.T.ravel(), idxvb.ravel())\n- return r1, r2.reshape(nocc, nocc, nvir)\n+ return r2.reshape(nocc, nocc, nvir)\n \n-def spin2spatial_ip(r1, r2, orbspin):\n- nocc, nvir = r2.shape[1:]\n+def spin2spatial_ip(rx, orbspin):\n+ '''Convert EOMIP spin-orbital R1/R2 to spatial-orbital R1/R2'''\n+ if rx.ndim == 1:\n+ nocc = rx.size\n+ r1a = rx[orbspin[:nocc] == 0]\n+ r1b = rx[orbspin[:nocc] == 1]\n+ return r1a, r1b\n+\n+ nocc, nvir = rx.shape[1:]\n \n idxoa = np.where(orbspin[:nocc] == 0)[0]\n idxob = np.where(orbspin[:nocc] == 1)[0]\n@@ -134,9 +152,6 @@ def spin2spatial_ip(r1, r2, orbspin):\n nvir_a = len(idxva)\n nvir_b = len(idxvb)\n \n- r1a = r1[idxoa]\n- r1b = r1[idxob]\n-\n idxoaa = idxoa[:,None] * nocc + idxoa\n idxoab = idxoa[:,None] * nocc + idxob\n idxoba = idxob[:,None] * nocc + idxoa\n@@ -146,7 +161,7 @@ def spin2spatial_ip(r1, r2, orbspin):\n #idxvba = idxvb[:,None] * nvir + idxva\n #idxvbb = idxvb[:,None] * nvir + idxvb\n \n- r2 = r2.reshape(nocc**2, nvir)\n+ r2 = rx.reshape(nocc**2, nvir)\n r2aaa = lib.take_2d(r2, idxoaa.ravel(), idxva.ravel())\n r2baa = lib.take_2d(r2, idxoba.ravel(), idxva.ravel())\n r2abb = lib.take_2d(r2, idxoab.ravel(), idxvb.ravel())\n@@ -156,7 +171,7 @@ def spin2spatial_ip(r1, r2, orbspin):\n r2baa = r2baa.reshape(nocc_b, nocc_a, nvir_a)\n r2abb = r2abb.reshape(nocc_a, nocc_b, nvir_b)\n r2bbb = r2bbb.reshape(nocc_b, nocc_b, nvir_b)\n- return [r1a, r1b], [r2aaa, r2baa, r2abb, r2bbb]\n+ return r2aaa, r2baa, r2abb, r2bbb\n \n def ipccsd_matvec(eom, vector, imds=None, diag=None):\n '''For spin orbitals\n@@ -168,7 +183,7 @@ def ipccsd_matvec(eom, vector, imds=None, diag=None):\n t2aa, t2ab, t2bb = t2\n nocca, noccb, nvira, nvirb = t2ab.shape\n nmoa, nmob = nocca+nvira, noccb+nvirb\n- r1, r2 = vector_to_amplitudes_ip(vector, (nmoa,nmob), (nocca,noccb))\n+ r1, r2 = eom.vector_to_amplitudes(vector, (nmoa,nmob), (nocca,noccb))\n r1a, r1b = r1\n r2aaa, r2baa, r2abb, r2bbb = r2\n \n@@ -329,13 +344,11 @@ def get_init_guess(self, nroots=1, koopmans=True, diag=None):\n guess.append(g)\n return guess\n \n- def vector_to_amplitudes(self, vector, nmo=None, nocc=None):\n- if nmo is None: nmo = self.nmo\n- if nocc is None: nocc = self.nocc\n- return vector_to_amplitudes_ip(vector, nmo, nocc)\n-\n- def amplitudes_to_vector(self, r1, r2):\n- return amplitudes_to_vector_ip(r1, r2)\n+ amplitudes_to_vector = staticmethod(amplitudes_to_vector_ip)\n+ vector_to_amplitudes = module_method(vector_to_amplitudes_ip,\n+ absences=['nmo', 'nocc'])\n+ spatial2spin = staticmethod(spatial2spin_ip)\n+ spin2spatial = staticmethod(spin2spatial_ip)\n \n def vector_size(self):\n '''size of the vector based on spin-orbital basis'''\n@@ -393,16 +406,30 @@ def amplitudes_to_vector_ea(r1, r2):\n r2aba.ravel(), r2bab.ravel(),\n r2bbb[:,idxb[0],idxb[1]].ravel()))\n \n-def spatial2spin_ea(r1, r2, orbspin=None):\n- '''Convert R1/R2 of spatial orbital representation to R1/R2 of\n- spin-orbital representation\n- '''\n- r1a, r1b = r1\n- r2aaa, r2aba, r2bab, r2bbb = r2\n+def spatial2spin_ea(rx, orbspin=None):\n+ '''Convert EOMEA spatial-orbital R1/R2 to spin-orbital R1/R2'''\n+ if len(rx) == 2: # r1\n+ r1a, r1b = rx\n+ nvir_a = r1a.size\n+ nvir_b = r1b.size\n+ nvir = nvir_a + nvir_b\n+\n+ r1 = np.zeros(nvir, dtype=r1a.dtype)\n+ if orbspin is None:\n+ assert nvir_a == nvir_b\n+ r1[0::2] = r1a\n+ r1[1::2] = r1b\n+ else:\n+ r1[orbspin[-nvir:] == 0] = r1a\n+ r1[orbspin[-nvir:] == 1] = r1b\n+ return r1\n+\n+ r2aaa, r2aba, r2bab, r2bbb = rx\n nocc_a, nvir_a = r2aaa.shape[:2]\n nocc_b, nvir_b = r2bbb.shape[:2]\n \n if orbspin is None:\n+ assert nvir_a == nvir_b\n orbspin = np.zeros((nocc_a+nvir_a)*2, dtype=int)\n orbspin[1::2] = 1\n \n@@ -413,10 +440,6 @@ def spatial2spin_ea(r1, r2, orbspin=None):\n idxva = np.where(orbspin[nocc:] == 0)[0]\n idxvb = np.where(orbspin[nocc:] == 1)[0]\n \n- r1 = np.zeros((nvir), dtype=r1a.dtype)\n- r1[idxva] = r1a\n- r1[idxvb] = r1b\n-\n r2 = np.zeros((nocc, nvir**2), dtype=r2aaa.dtype)\n #idxoaa = idxoa[:,None] * nocc + idxoa\n #idxoab = idxoa[:,None] * nocc + idxob\n@@ -441,10 +464,17 @@ def spatial2spin_ea(r1, r2, orbspin=None):\n lib.takebak_2d(r2, r2bba, idxob.ravel(), idxvba.T.ravel())\n lib.takebak_2d(r2, r2aab, idxoa.ravel(), idxvab.T.ravel())\n r2 = r2.reshape(nocc, nvir, nvir)\n- return r1, r2\n+ return r2\n \n-def spin2spatial_ea(r1, r2, orbspin):\n- nocc, nvir = r2.shape[:2]\n+def spin2spatial_ea(rx, orbspin):\n+ '''Convert EOMEA spin-orbital R1/R2 to spatial-orbital R1/R2'''\n+ if rx.ndim == 1:\n+ nvir = rx.size\n+ r1a = rx[orbspin[-nvir:] == 0]\n+ r1b = rx[orbspin[-nvir:] == 1]\n+ return r1a, r1b\n+\n+ nocc, nvir = rx.shape[:2]\n \n idxoa = np.where(orbspin[:nocc] == 0)[0]\n idxob = np.where(orbspin[:nocc] == 1)[0]\n@@ -455,19 +485,12 @@ def spin2spatial_ea(r1, r2, orbspin):\n nvir_a = len(idxva)\n nvir_b = len(idxvb)\n \n- r1a = r1[idxva]\n- r1b = r1[idxvb]\n-\n- #idxoaa = idxoa[:,None] * nocc + idxoa\n- #idxoab = idxoa[:,None] * nocc + idxob\n- #idxoba = idxob[:,None] * nocc + idxoa\n- #idxobb = idxob[:,None] * nocc + idxob\n idxvaa = idxva[:,None] * nvir + idxva\n idxvab = idxva[:,None] * nvir + idxvb\n idxvba = idxvb[:,None] * nvir + idxva\n idxvbb = idxvb[:,None] * nvir + idxvb\n \n- r2 = r2.reshape(nocc, nvir**2)\n+ r2 = rx.reshape(nocc, nvir**2)\n r2aaa = lib.take_2d(r2, idxoa.ravel(), idxvaa.ravel())\n r2aba = lib.take_2d(r2, idxoa.ravel(), idxvba.ravel())\n r2bab = lib.take_2d(r2, idxob.ravel(), idxvab.ravel())\n@@ -477,7 +500,7 @@ def spin2spatial_ea(r1, r2, orbspin):\n r2aba = r2aba.reshape(nocc_a, nvir_b, nvir_a)\n r2bab = r2bab.reshape(nocc_b, nvir_a, nvir_b)\n r2bbb = r2bbb.reshape(nocc_b, nvir_b, nvir_b)\n- return [r1a, r1b], [r2aaa, r2aba, r2bab, r2bbb]\n+ return r2aaa, r2aba, r2bab, r2bbb\n \n def eaccsd_matvec(eom, vector, imds=None, diag=None):\n '''For spin orbitals.\n@@ -490,7 +513,7 @@ def eaccsd_matvec(eom, vector, imds=None, diag=None):\n t2aa, t2ab, t2bb = t2\n nocca, noccb, nvira, nvirb = t2ab.shape\n nmoa, nmob = nocca+nvira, noccb+nvirb\n- r1, r2 = vector_to_amplitudes_ea(vector, (nmoa,nmob), (nocca,noccb))\n+ r1, r2 = eom.vector_to_amplitudes(vector, (nmoa,nmob), (nocca,noccb))\n r1a, r1b = r1\n r2aaa, r2aba, r2bab, r2bbb = r2\n \n@@ -848,13 +871,11 @@ def get_init_guess(self, nroots=1, koopmans=True, diag=None):\n guess.append(g)\n return guess\n \n- def vector_to_amplitudes(self, vector, nmo=None, nocc=None):\n- if nmo is None: nmo = self.nmo\n- if nocc is None: nocc = self.nocc\n- return vector_to_amplitudes_ea(vector, nmo, nocc)\n-\n- def amplitudes_to_vector(self, r1, r2):\n- return amplitudes_to_vector_ea(r1, r2)\n+ amplitudes_to_vector = staticmethod(amplitudes_to_vector_ea)\n+ vector_to_amplitudes = module_method(vector_to_amplitudes_ea,\n+ absences=['nmo', 'nocc'])\n+ spatial2spin = staticmethod(spatial2spin_ea)\n+ spin2spatial = staticmethod(spin2spatial_ea)\n \n def vector_size(self):\n '''size of the vector based on spin-orbital basis'''\n@@ -982,8 +1003,8 @@ def eomsf_ccsd(eom, nroots=1, koopmans=False, guess=None,\n '''\n return eomee_ccsd(eom, nroots, koopmans, guess, eris, imds, diag)\n \n-amplitudes_to_vector_ee = uccsd.amplitudes_to_vector\n-vector_to_amplitudes_ee = uccsd.vector_to_amplitudes\n+amplitudes_to_vector_ee = amplitudes_to_vector_eomee = uccsd.amplitudes_to_vector\n+vector_to_amplitudes_ee = vector_to_amplitudes_eomee = uccsd.vector_to_amplitudes\n \n def amplitudes_to_vector_eomsf(t1, t2, out=None):\n t1ab, t1ba = t1\n@@ -1049,8 +1070,11 @@ def vector_to_amplitudes_eomsf(vector, nmo, nocc):\n t2bbab = t2bbab.reshape(noccb,noccb,nvira,nvirb)\n return (t1ab,t1ba), (t2baaa, t2aaba, t2abbb, t2bbab)\n \n-def spatial2spin_eomsf(rx, orbspin):\n- '''Convert EOM spatial R1,R2 to spin-orbital R1,R2'''\n+spatial2spin_eomee = addons.spatial2spin\n+spin2spatial_eomee = addons.spin2spatial\n+\n+def spatial2spin_eomsf(rx, orbspin=None):\n+ '''Convert spin-flip EOMEE spatial-orbital R1/R2 to spin-orbital R1/R2'''\n if len(rx) == 2: # r1\n r1ab, r1ba = rx\n nocca, nvirb = r1ab.shape\n@@ -1062,6 +1086,11 @@ def spatial2spin_eomsf(rx, orbspin):\n \n nocc = nocca + noccb\n nvir = nvira + nvirb\n+ if orbspin is None:\n+ assert nocca == noccb\n+ orbspin = np.zeros(nocc+nvir, dtype=int)\n+ orbspin[1::2] = 1\n+\n idxoa = np.where(orbspin[:nocc] == 0)[0]\n idxob = np.where(orbspin[:nocc] == 1)[0]\n idxva = np.where(orbspin[nocc:] == 0)[0]\n@@ -1098,7 +1127,7 @@ def spatial2spin_eomsf(rx, orbspin):\n return r2.reshape(nocc,nocc,nvir,nvir)\n \n def spin2spatial_eomsf(rx, orbspin):\n- '''Convert EOM spin-orbital R1,R2 to spatial R1,R2'''\n+ '''Convert EOMEE spin-orbital R1/R2 to spin-flip EOMEE spatial-orbital R1/R2'''\n if rx.ndim == 2: # r1\n nocc, nvir = rx.shape\n else:\n@@ -1148,7 +1177,7 @@ def eomee_ccsd_matvec(eom, vector, imds=None):\n t2aa, t2ab, t2bb = t2\n nocca, noccb, nvira, nvirb = t2ab.shape\n nmoa, nmob = nocca+nvira, noccb+nvirb\n- r1, r2 = vector_to_amplitudes_ee(vector, (nmoa,nmob), (nocca,noccb))\n+ r1, r2 = eom.vector_to_amplitudes(vector, (nmoa,nmob), (nocca,noccb))\n r1a, r1b = r1\n r2aa, r2ab, r2bb = r2\n \n@@ -1369,7 +1398,7 @@ def eomsf_ccsd_matvec(eom, vector, imds=None):\n t2aa, t2ab, t2bb = t2\n nocca, noccb, nvira, nvirb = t2ab.shape\n nmoa, nmob = nocca+nvira, noccb+nvirb\n- r1, r2 = vector_to_amplitudes_eomsf(vector, (nmoa,nmob), (nocca,noccb))\n+ r1, r2 = eom.vector_to_amplitudes(vector, (nmoa,nmob), (nocca,noccb))\n r1ab, r1ba = r1\n r2baaa, r2aaba, r2abbb, r2bbab = r2\n \n@@ -1853,13 +1882,11 @@ def gen_matvec(self, imds=None, diag=None, **kwargs):\n matvec = lambda xs: [self.matvec(x, imds) for x in xs]\n return matvec, diag\n \n- def vector_to_amplitudes(self, vector, nmo=None, nocc=None):\n- if nmo is None: nmo = self.nmo\n- if nocc is None: nocc = self.nocc\n- return vector_to_amplitudes_ee(vector, nmo, nocc)\n-\n- def amplitudes_to_vector(self, r1, r2):\n- return amplitudes_to_vector_ee(r1, r2)\n+ amplitudes_to_vector = staticmethod(amplitudes_to_vector_ee)\n+ vector_to_amplitudes = module_method(vector_to_amplitudes_ee,\n+ absences=['nmo', 'nocc'])\n+ spatial2spin = staticmethod(spatial2spin_eomee)\n+ spin2spatial = staticmethod(spin2spatial_eomee)\n \n def vector_size(self):\n '''size of the vector based on spin-orbital basis'''\n@@ -1901,13 +1928,11 @@ def gen_matvec(self, imds=None, diag=None, **kwargs):\n matvec = lambda xs: [self.matvec(x, imds) for x in xs]\n return matvec, diag\n \n- def vector_to_amplitudes(self, vector, nmo=None, nocc=None):\n- if nmo is None: nmo = self.nmo\n- if nocc is None: nocc = self.nocc\n- return vector_to_amplitudes_eomsf(vector, nmo, nocc)\n-\n- def amplitudes_to_vector(self, r1, r2):\n- return amplitudes_to_vector_eomsf(r1, r2)\n+ amplitudes_to_vector = staticmethod(amplitudes_to_vector_eomsf)\n+ vector_to_amplitudes = module_method(vector_to_amplitudes_eomsf,\n+ absences=['nmo', 'nocc'])\n+ spatial2spin = staticmethod(spatial2spin_eomsf)\n+ spin2spatial = staticmethod(spin2spatial_eomsf)\n \n def vector_size(self):\n '''size of the vector based on spin-orbital basis'''\n@@ -2604,229 +2629,3 @@ def make_ee(self):\n \n self.made_ee_imds = True\n log.timer('EOM-UCCSD EE intermediates', *cput0)\n-\n-def rand_mf(mol, seed=1):\n- from pyscf import scf\n- from pyscf import gto\n- from pyscf import lo\n- mol = gto.Mole()\n- mol.atom = [\n- [8 , (0. , 0. , 0.)],\n- [1 , (0. , -0.757 , 0.587)],\n- [1 , (0. , 0.757 , 0.587)]]\n- mol.basis = 'sto-3g'\n- mol.verbose = 0\n- mol.spin = 0\n- mol.build()\n-\n- np.random.seed(seed)\n-\n- mf = scf.UHF(mol).run(conv_tol=1e-14)\n- nmo = mol.nao_nr()\n- mf.mo_occ = np.zeros((2,nmo))\n- mf.mo_occ[0,:4] = 1\n- mf.mo_occ[1,:2] = 1\n- mf.mo_energy = np.arange(nmo) + np.random.random((2,nmo)) * .3\n- mf.mo_energy[mf.mo_occ == 0] += 2\n-\n- mo = np.random.random((2,nmo,nmo))\n- s = mf.get_ovlp()\n- mf.mo_coeff = np.empty_like(mo)\n- mf.mo_coeff[0] = lo.orth.vec_lowdin(mo[0], s)\n- mf.mo_coeff[1] = lo.orth.vec_lowdin(mo[1], s)\n- return mf\n-\n-def rand_cc_t1_t2(mf, seed=1):\n- from pyscf import ao2mo\n- from pyscf.cc import uccsd\n- mycc = uccsd.UCCSD(mf)\n-\n- nocca, noccb = mycc.nocc\n- nmoa, nmob = mycc.nmo\n- nvira, nvirb = nmoa - nocca, nmob - noccb\n- def my_ao2mo(mo):\n- eris = ao2mo.kernel(mycc._scf._eri, mo, compact=False)\n- eris = ao2mo.restore(1, eris, mf.mol.nao_nr())\n-\n- eris = eris + np.cos(eris)*1j\n- eris = eris + eris.transpose(1, 0, 3, 2)\n- eris = eris + eris.conj().transpose(2, 3, 0, 1)\n- return eris\n- eris = uccsd._make_eris_incore(mycc)#, ao2mofn=my_ao2mo)\n-\n- np.random.seed(seed)\n- t1a = (np.random.random((nocca,nvira)) +\n- np.random.random((nocca,nvira))*1j - .5 - .5j)\n- t1b = (np.random.random((noccb,nvirb)) +\n- np.random.random((noccb,nvirb))*1j - .5 - .5j)\n- t2aa = (np.random.random((nocca,nocca,nvira,nvira)) +\n- np.random.random((nocca,nocca,nvira,nvira))*1j - .5 - .5j)\n- t2aa = t2aa - t2aa.transpose(1, 0, 2, 3)\n- t2aa = t2aa - t2aa.transpose(0, 1, 3, 2)\n-\n- t2ab = (np.random.random((nocca,noccb,nvira,nvirb)) +\n- np.random.random((nocca,noccb,nvira,nvirb))*1j - .5 - .5j)\n-\n- t2bb = (np.random.random((noccb,noccb,nvirb,nvirb)) +\n- np.random.random((noccb,noccb,nvirb,nvirb))*1j - .5 - .5j)\n- t2bb = t2bb - t2bb.transpose(1, 0, 2, 3)\n- t2bb = t2bb - t2bb.transpose(0, 1, 3, 2)\n-\n- t1 = (t1a, t1b)\n- t2 = (t2aa, t2ab, t2bb)\n- return mycc, eris, t1, t2\n-\n-def enforce_symm_2p_spin(r1, r2, orbspin, excitation):\n- assert (excitation in ['ip', 'ea'])\n- if excitation == 'ip':\n- nocc, nvir = r2.shape[1:]\n- elif excitation == 'ea':\n- nocc, nvir = r2.shape[:2]\n- else:\n- raise NotImplementedError\n-\n- idxoa = np.where(orbspin[:nocc] == 0)[0]\n- idxob = np.where(orbspin[:nocc] == 1)[0]\n- idxva = np.where(orbspin[nocc:] == 0)[0]\n- idxvb = np.where(orbspin[nocc:] == 1)[0]\n-\n- idxoaa = idxoa[:,None] * nocc + idxoa\n- idxobb = idxob[:,None] * nocc + idxob\n- idxvaa = idxva[:,None] * nvir + idxva\n- idxvbb = idxvb[:,None] * nvir + idxvb\n-\n- if excitation == 'ip':\n- r2 = r2 - r2.transpose(1, 0, 2)\n-\n- r2 = r2.reshape(nocc**2, nvir)\n- r2[idxobb.ravel()[:, None], idxva.ravel()] = 0.0\n- r2[idxoaa.ravel()[:, None], idxvb.ravel()] = 0.0\n- r2 = r2.reshape(nocc, nocc, nvir)\n-\n- if excitation == 'ea':\n- r2 = r2 - r2.transpose(0, 2, 1)\n-\n- r2 = r2.reshape(nocc, nvir**2)\n- r2[idxoa.ravel(), idxvbb.ravel()[:, None]] = 0.0\n- r2[idxob.ravel(), idxvaa.ravel()[:, None]] = 0.0\n- r2 = r2.reshape(nocc, nvir, nvir)\n-\n- return r1, r2\n-\n-def enforce_symm_2p_spin_ip(r1, r2, orbspin):\n- return enforce_symm_2p_spin(r1, r2, orbspin, 'ip')\n-\n-def enforce_symm_2p_spin_ea(r1, r2, orbspin):\n- return enforce_symm_2p_spin(r1, r2, orbspin, 'ea')\n-\n-if __name__ == '__main__':\n- from pyscf import gto\n- #from pyscf import scf\n- #from pyscf.cc import rccsd\n-\n- mol = gto.Mole()\n- mol.atom = [\n- [8 , (0. , 0. , 0.)],\n- [1 , (0. , -0.757 , 0.587)],\n- [1 , (0. , 0.757 , 0.587)]]\n- mol.basis = 'sto-3g'\n- mol.verbose = 0\n- mol.spin = 0\n- mol.build()\n-\n- mf = rand_mf(mol)\n- mycc, eris, t1, t2 = rand_cc_t1_t2(mf)\n- mycc.t1 = t1\n- mycc.t2 = t2\n-\n- nocca, noccb = mycc.nocc\n- nmoa, nmob = mycc.nmo\n- nvira, nvirb = nmoa - nocca, nmob - noccb\n- nocc = nocca + noccb\n- nvir = nvira + nvirb\n- nmo = nocc + nvir\n-\n- def my_ao2mo(mo):\n- nao, nmo = mo.shape\n- orbspin = mo.orbspin\n-\n-# eris = ao2mo.kernel(mygcc._scf._eri, mo_a + mo_b)\n-# sym_forbid = (orbspin[:,None] != orbspin)[np.tril_indices(nmo)]\n-# eris[sym_forbid,:] = 0\n-# eris[:,sym_forbid] = 0\n-# eris = ao2mo.restore(1, eris, nao)\n-# return eris\n- eris =(np.random.random((nmo,nmo,nmo,nmo)) +\n- np.random.random((nmo,nmo,nmo,nmo)) * 1j)\n-\n- eris = eris + np.cos(eris)*1j\n- eris = eris + eris.transpose(1, 0, 3, 2)\n- eris = eris + eris.conj().transpose(2, 3, 0, 1)\n- eris[orbspin[:,None] != orbspin] = 0\n- eris[:,:,orbspin[:,None] != orbspin] = 0\n- return eris\n-\n- import pyscf.cc.addons\n- from pyscf.cc import gccsd\n- mygcc = pyscf.cc.addons.convert_to_gccsd(mycc)\n- mygcc._ucc = mycc\n- mygcc._ucc_eris = eris\n- eris = gccsd._make_eris_incore(mygcc)#, ao2mofn=my_ao2mo)\n- orbspin = eris.orbspin\n-\n- ## EOM-IP\n- myeom = EOMIP(mycc)\n- imds = myeom.make_imds()\n-\n- np.random.seed(1)\n- r1 = np.random.rand(nocc)*1j + np.random.rand(nocc) - 0.5 - 0.5*1j\n- r2 = np.random.rand(nocc**2 * nvir)*1j + np.random.rand(nocc**2 * nvir) - 0.5 - 0.5*1j\n- r2 = r2.reshape(nocc, nocc, nvir)\n- r1, r2 = enforce_symm_2p_spin_ip(r1, r2, orbspin)\n- r1, r2 = spin2spatial_ip(r1, r2, orbspin)\n-\n- vector = myeom.amplitudes_to_vector(r1, r2)\n- r1x, r2x = myeom.vector_to_amplitudes(vector)\n- print(abs(r1[0]-r1x[0]).max() < 1e-13 and\n- abs(r1[1]-r1x[1]).max() < 1e-13 and\n- abs(r2[0]-r2x[0]).max() < 1e-13 and\n- abs(r2[1]-r2x[1]).max() < 1e-13 and\n- abs(r2[2]-r2x[2]).max() < 1e-13 and\n- abs(r2[3]-r2x[3]).max() < 1e-13)\n- Hvector = myeom.matvec(vector, imds=imds)\n- print('ip', lib.finger(Hvector) - (21.67127462317093-19.068987454261908j))\n- print('diag', lib.finger(myeom.get_diag()) - (-9.6676217223549763+9.325219825942975j))\n-\n- # EOM-EA\n- myeom = EOMEA(mycc)\n- imds = myeom.make_imds()\n-\n- np.random.seed(1)\n- r1 = np.random.rand(nvir)*1j + np.random.rand(nvir) - 0.5 - 0.5*1j\n- r2 = np.random.rand(nocc * nvir**2)*1j + np.random.rand(nocc * nvir**2) - 0.5 - 0.5*1j\n- r2 = r2.reshape(nocc, nvir, nvir)\n- r1, r2 = enforce_symm_2p_spin_ea(r1, r2, orbspin)\n- r1, r2 = spin2spatial_ea(r1, r2, orbspin)\n-\n- vector = myeom.amplitudes_to_vector(r1, r2)\n- r1x, r2x = myeom.vector_to_amplitudes(vector)\n- print(abs(r1[0]-r1x[0]).max() < 1e-13 and\n- abs(r1[1]-r1x[1]).max() < 1e-13 and\n- abs(r2[0]-r2x[0]).max() < 1e-13 and\n- abs(r2[1]-r2x[1]).max() < 1e-13 and\n- abs(r2[2]-r2x[2]).max() < 1e-13 and\n- abs(r2[3]-r2x[3]).max() < 1e-13)\n- Hvector = myeom.matvec(vector, imds=imds)\n- print('ea', lib.finger(Hvector) - (6.5543877287461187-13.175055314063574j))\n- print('diag', lib.finger(myeom.get_diag()) - (-57.353207240857785+1.4052857730841204j))\n-\n- mycc = uccsd.UCCSD(mol.UHF().run())\n- ecc, t1, t2 = mycc.kernel()\n- print(ecc - -0.04946750711013597)\n- e,v = mycc.ipccsd(nroots=6)\n- print(e[0] - 0.3092874511803249)\n- print(e[1] - 0.3092874511803249)\n- print(e[2] - 0.4011171373779585)\n- print(e[3] - 0.4011171373779585)\n- print(e[4] - 0.6107409208314764)\n- print(e[5] - 0.6107409208314764)\ndiff --git a/pyscf/cc/gintermediates.py b/pyscf/cc/gintermediates.py\nindex a40e022f51..55cf7ec972 100644\n--- a/pyscf/cc/gintermediates.py\n+++ b/pyscf/cc/gintermediates.py\n@@ -166,9 +166,6 @@ def Wvvvo(t1, t2, eris, _Wvvvv=None):\n # T3[2] related contributions to T1/T2\n ########################################\n \n-def _cp(a):\n- return np.array(a, copy=False, order='C')\n-\n def get_t3p2_imds_slow(cc, t1, t2, eris=None, t3p2_ip_out=None, t3p2_ea_out=None):\n \"\"\"Calculates T1, T2 amplitudes corrected by second-order T3 contribution\n and intermediates used in IP/EA-CCSD(T)a\n@@ -214,12 +211,12 @@ def get_t3p2_imds_slow(cc, t1, t2, eris=None, t3p2_ip_out=None, t3p2_ea_out=None\n mo_e_o = eris.mo_energy[:nocc]\n mo_e_v = eris.mo_energy[nocc:]\n \n- oovv = _cp(eris.oovv)\n- ovvv = _cp(eris.ovvv)\n- ooov = _cp(eris.ooov)\n- oovv = _cp(eris.oovv)\n- vooo = _cp(ooov).conj().transpose(3, 2, 1, 0)\n- vvvo = _cp(ovvv).conj().transpose(3, 2, 1, 0)\n+ oovv = np.asarray(eris.oovv)\n+ ovvv = np.asarray(eris.ovvv)\n+ ooov = np.asarray(eris.ooov)\n+ oovv = np.asarray(eris.oovv)\n+ vooo = np.asarray(ooov).conj().transpose(3, 2, 1, 0)\n+ vvvo = np.asarray(ovvv).conj().transpose(3, 2, 1, 0)\n \n ccsd_energy = cc.energy(t1, t2, eris)\n dtype = np.result_type(t1, t2)\ndiff --git a/pyscf/cc/rintermediates.py b/pyscf/cc/rintermediates.py\nindex 718ffb0cf1..ebdb4d7460 100644\n--- a/pyscf/cc/rintermediates.py\n+++ b/pyscf/cc/rintermediates.py\n@@ -236,9 +236,6 @@ def _get_vvvv(eris):\n else:\n return eris.vvvv\n \n-def _cp(a):\n- return np.array(a, copy=False, order='C')\n-\n def get_t3p2_imds_slow(cc, t1, t2, eris=None, t3p2_ip_out=None, t3p2_ea_out=None):\n \"\"\"Calculates T1, T2 amplitudes corrected by second-order T3 contribution\n and intermediates used in IP/EA-CCSD(T)a\n@@ -261,8 +258,8 @@ def get_t3p2_imds_slow(cc, t1, t2, eris=None, t3p2_ip_out=None, t3p2_ea_out=None\n mo_e_o = eris.mo_energy[:nocc]\n mo_e_v = eris.mo_energy[nocc:]\n \n- ovov = _cp(eris.ovov)\n- ovvv = _cp(eris.get_ovvv())\n+ ovov = np.asarray(eris.ovov)\n+ ovvv = np.asarray(eris.get_ovvv())\n eris_vvov = eris.get_ovvv().conj().transpose(1,3,0,2) # Physicist notation\n eris_vooo = eris.ovoo[:].conj().transpose(1,0,3,2) # Chemist notation\n \n"}, "test": {"test_patch": "diff --git a/pyscf/cc/test/test_dfccsd.py b/pyscf/cc/test/test_dfccsd.py\nindex fac0b39431..f1aa92486d 100644\n--- a/pyscf/cc/test/test_dfccsd.py\n+++ b/pyscf/cc/test/test_dfccsd.py\n@@ -201,8 +201,8 @@ def test_df_eomee_ccsd_matvec_singlet(self):\n imds = myeom.make_imds(eris1)\n vec1 = myeom.matvec(vec, imds)\n r1, r2 = myeom.vector_to_amplitudes(vec1)\n- self.assertAlmostEqual(lib.fp(r1), -11001.96269563921, 7)\n- self.assertAlmostEqual(lib.fp(r2), 10145.408880409095, 7)\n+ self.assertAlmostEqual(lib.fp(r1), -29298.85295742222, 7)\n+ self.assertAlmostEqual(lib.fp(r2), 10145.543907318603, 7)\n \n def test_df_eomee_ccsd_matvec_triplet(self):\n numpy.random.seed(10)\n@@ -216,9 +216,9 @@ def test_df_eomee_ccsd_matvec_triplet(self):\n imds = myeom.make_imds(eris1)\n vec1 = myeom.matvec(vec, imds)\n r1, r2 = myeom.vector_to_amplitudes(vec1)\n- self.assertAlmostEqual(lib.fp(r1 ), 214.90035498814302, 9)\n- self.assertAlmostEqual(lib.fp(r2[0]), 37033.183886562998, 7)\n- self.assertAlmostEqual(lib.fp(r2[1]), 4164.1657912277242, 7)\n+ self.assertAlmostEqual(lib.fp(r1 ), -6923.975705203359, 8)\n+ self.assertAlmostEqual(lib.fp(r2[0]), 37033.47500554715 , 7)\n+ self.assertAlmostEqual(lib.fp(r2[1]), 4164.221159944544, 7)\n \n def test_df_eomsf_ccsd_matvec(self):\n numpy.random.seed(10)\n@@ -229,15 +229,15 @@ def test_df_eomsf_ccsd_matvec(self):\n imds = myeom.make_imds(eris1)\n vec1 = myeom.matvec(vec, imds)\n r1, r2 = myeom.vector_to_amplitudes(vec1)\n- self.assertAlmostEqual(lib.fp(r1 ), 1929.9270950777639, 8)\n- self.assertAlmostEqual(lib.fp(r2[0]), 15571.714806853948, 7)\n- self.assertAlmostEqual(lib.fp(r2[1]),-12949.619613624538, 7)\n+ self.assertAlmostEqual(lib.fp(r1 ), 133.93692998558186, 8)\n+ self.assertAlmostEqual(lib.fp(r2[0]), 15572.228624905263, 7)\n+ self.assertAlmostEqual(lib.fp(r2[1]),-12949.86945323115 , 7)\n \n def test_df_eomee_diag(self):\n vec1S, vec1T, vec2 = eom_rccsd.EOMEE(mycc1).get_diag()\n- self.assertAlmostEqual(lib.fp(vec1S), 213.16715890265095, 9)\n- self.assertAlmostEqual(lib.fp(vec1T),-857.23800705535234, 9)\n- self.assertAlmostEqual(lib.fp(vec2) , 14.360296355284504, 9)\n+ self.assertAlmostEqual(lib.fp(vec1S), 213.17116636400607, 9)\n+ self.assertAlmostEqual(lib.fp(vec1T),-857.2458742624522 , 9)\n+ self.assertAlmostEqual(lib.fp(vec2) , 14.357453812621733, 9)\n \n def test_ao2mo(self):\n numpy.random.seed(2)\ndiff --git a/pyscf/cc/test/test_eom_rccsd.py b/pyscf/cc/test/test_eom_rccsd.py\nindex c417e4f28d..b1210ac7b3 100644\n--- a/pyscf/cc/test/test_eom_rccsd.py\n+++ b/pyscf/cc/test/test_eom_rccsd.py\n@@ -277,11 +277,21 @@ def test_eomee_ccsd_matvec_singlet(self):\n r2 = r2 + r2.transpose(1,0,3,2)\n myeom = eom_rccsd.EOMEESinglet(mycc1)\n vec = myeom.amplitudes_to_vector(r1,r2)\n- imds = myeom.make_imds(eris1)\n- vec1 = myeom.matvec(vec, imds)\n- r1, r2 = myeom.vector_to_amplitudes(vec1)\n- self.assertAlmostEqual(lib.fp(r1), -112883.3791497977, 7)\n- self.assertAlmostEqual(lib.fp(r2), -268199.3475813322, 7)\n+ vec1 = myeom.matvec(vec)\n+ v1, v2 = myeom.vector_to_amplitudes(vec1)\n+ self.assertAlmostEqual(lib.fp(v1), -145152.78511963107, 7)\n+ self.assertAlmostEqual(lib.fp(v2), -268196.0471308574, 7)\n+\n+ gcc1 = cc.addons.convert_to_gccsd(mycc1)\n+ gee1 = gcc1.EOMEE()\n+ orbspin = gcc1._scf.mo_coeff.orbspin\n+ gr1 = myeom.spatial2spin(r1, orbspin)\n+ gr2 = myeom.spatial2spin(r2, orbspin)\n+ gvec = gee1.amplitudes_to_vector(gr1, gr2)\n+ vecref = gee1.matvec(gvec)\n+ gr1, gr2 = gee1.vector_to_amplitudes(vecref)\n+ self.assertAlmostEqual(abs(gr1-myeom.spatial2spin(v1, orbspin)).max(), 0, 8)\n+ self.assertAlmostEqual(abs(gr2-myeom.spatial2spin(v2, orbspin)).max(), 0, 8)\n \n def test_eomee_ccsd_matvec_triplet(self):\n numpy.random.seed(10)\n@@ -294,10 +304,24 @@ def test_eomee_ccsd_matvec_triplet(self):\n vec = myeom.amplitudes_to_vector(r1, r2)\n imds = myeom.make_imds(eris1)\n vec1 = myeom.matvec(vec, imds)\n- r1, r2 = myeom.vector_to_amplitudes(vec1)\n- self.assertAlmostEqual(lib.fp(r1 ), 3550.5250670914056, 8)\n- self.assertAlmostEqual(lib.fp(r2[0]), -237433.03756895234,7)\n- self.assertAlmostEqual(lib.fp(r2[1]), 127680.0182437716 , 7)\n+ v1, v2 = myeom.vector_to_amplitudes(vec1)\n+ self.assertAlmostEqual(lib.fp(v1 ), -5616.12199728998, 8)\n+ self.assertAlmostEqual(lib.fp(v2[0]), -237430.14342594685,7)\n+ self.assertAlmostEqual(lib.fp(v2[1]), 127682.76151592708, 7)\n+\n+ gcc1 = cc.addons.convert_to_uccsd(mycc1)\n+ gee1 = gcc1.EOMEESpinKeep()\n+ gr1 = (r1*.5**.5, -r1*.5**.5)\n+ raa = r2[0]*.5**.5\n+ rx = r2[1]*.5**.5\n+ gr2 = (raa, rx, -raa)\n+ gvec = gee1.amplitudes_to_vector(gr1, gr2)\n+ vecref = gee1.matvec(gvec)\n+ gr1, gr2 = gee1.vector_to_amplitudes(vecref)\n+ self.assertAlmostEqual(abs(gr1[0]*2**.5- v1).max(), 0, 9)\n+ self.assertAlmostEqual(abs(gr2[0]*2**.5- v2[0]).max(), 0, 9)\n+ self.assertAlmostEqual(abs(gr2[1]*2**.5- v2[1]).max(), 0, 9)\n+ self.assertAlmostEqual(abs(-gr2[2]*2**.5- v2[0]).max(), 0, 9)\n \n def test_eomsf_ccsd_matvec(self):\n numpy.random.seed(10)\n@@ -307,24 +331,56 @@ def test_eomsf_ccsd_matvec(self):\n vec = myeom.amplitudes_to_vector(r1,r2)\n imds = myeom.make_imds(eris1)\n vec1 = myeom.matvec(vec, imds)\n- r1, r2 = myeom.vector_to_amplitudes(vec1)\n- self.assertAlmostEqual(lib.fp(r1 ), -19368.729268465482, 8)\n- self.assertAlmostEqual(lib.fp(r2[0]), 84325.863680611626 , 7)\n- self.assertAlmostEqual(lib.fp(r2[1]), 6715.9574457836134 , 8)\n+ v1, v2 = myeom.vector_to_amplitudes(vec1)\n+\n+ self.assertAlmostEqual(lib.fp(v1 ), -6213.095578988824, 7)\n+ self.assertAlmostEqual(lib.fp(v2[0]), 84329.40539995288 , 7)\n+ self.assertAlmostEqual(lib.fp(v2[1]), 6719.930458652292 , 7)\n+\n+ numpy.random.seed(10)\n+ vec = numpy.random.random(myeom.vector_size()) - .9\n+ r1, r2 = myeom.vector_to_amplitudes(vec)\n+ vec1 = myeom.matvec(vec, imds)\n+ v1, v2 = myeom.vector_to_amplitudes(vec1)\n+\n+ gcc1 = cc.addons.convert_to_gccsd(mycc1)\n+ gee1 = gcc1.EOMEE()\n+ orbspin = gcc1._scf.mo_coeff.orbspin\n+ gr1 = myeom.spatial2spin(r1, orbspin)\n+ gr2 = myeom.spatial2spin(r2, orbspin)\n+ gvec = gee1.amplitudes_to_vector(gr1, gr2)\n+ vecref = gee1.matvec(gvec)\n+ gr1, gr2 = gee1.vector_to_amplitudes(vecref)\n+ self.assertAlmostEqual(abs(gr1-myeom.spatial2spin(v1, orbspin)).max(), 0, 9)\n+ self.assertAlmostEqual(abs(gr2-myeom.spatial2spin(v2, orbspin)).max(), 0, 9)\n \n def test_eomee_diag(self):\n vec1S, vec1T, vec2 = eom_rccsd.EOMEE(mycc1).get_diag()\n- self.assertAlmostEqual(lib.fp(vec1S),-4714.9854130015719, 8)\n- self.assertAlmostEqual(lib.fp(vec1T), 2221.3155272953709, 8)\n- self.assertAlmostEqual(lib.fp(vec2) ,-5486.1611871545592, 8)\n+ self.assertAlmostEqual(lib.fp(vec1S), -4714.969920334639, 8)\n+ self.assertAlmostEqual(lib.fp(vec1T), 2221.322839866705, 8)\n+ self.assertAlmostEqual(lib.fp(vec2) , -5486.124838268124, 8)\n \n def test_ip_matvec(self):\n numpy.random.seed(12)\n r1 = numpy.random.random((no)) - .9\n r2 = numpy.random.random((no,no,nv)) - .9\n- myeom = eom_rccsd.EOMIP(mycc1)\n+ myeom = mycc1.EOMIP()\n vec = myeom.amplitudes_to_vector(r1,r2)\n r1,r2 = myeom.vector_to_amplitudes(vec)\n+\n+ gcc1 = cc.addons.convert_to_gccsd(mycc1)\n+ gee1 = gcc1.EOMIP()\n+ orbspin = gcc1._scf.mo_coeff.orbspin\n+ gr1 = myeom.spatial2spin(r1, orbspin)\n+ gr2 = myeom.spatial2spin(r2, orbspin)\n+ gvec = gee1.amplitudes_to_vector(gr1, gr2)\n+ vecref = gee1.matvec(gvec)\n+ gr1, gr2 = gee1.vector_to_amplitudes(vecref)\n+ vec1 = myeom.matvec(vec)\n+ v1, v2 = myeom.vector_to_amplitudes(vec1)\n+ self.assertAlmostEqual(abs(gr1-myeom.spatial2spin(v1, orbspin)).max(), 0, 9)\n+ self.assertAlmostEqual(abs(gr2-myeom.spatial2spin(v2, orbspin)).max(), 0, 9)\n+\n myeom.partition = 'mp'\n self.assertAlmostEqual(lib.fp(r1), 0.37404344676857076, 11)\n self.assertAlmostEqual(lib.fp(r2), -1.1568913404570922, 11)\n@@ -347,6 +403,20 @@ def test_ea_matvec(self):\n myeom = eom_rccsd.EOMEA(mycc1)\n vec = myeom.amplitudes_to_vector(r1,r2)\n r1,r2 = myeom.vector_to_amplitudes(vec)\n+\n+ gcc1 = cc.addons.convert_to_gccsd(mycc1)\n+ gee1 = gcc1.EOMEA()\n+ orbspin = gcc1._scf.mo_coeff.orbspin\n+ gr1 = myeom.spatial2spin(r1, orbspin)\n+ gr2 = myeom.spatial2spin(r2, orbspin)\n+ gvec = gee1.amplitudes_to_vector(gr1, gr2)\n+ vecref = gee1.matvec(gvec)\n+ gr1, gr2 = gee1.vector_to_amplitudes(vecref)\n+ vec1 = myeom.matvec(vec)\n+ v1, v2 = myeom.vector_to_amplitudes(vec1)\n+ self.assertAlmostEqual(abs(gr1-myeom.spatial2spin(v1, orbspin)).max(), 0, 9)\n+ self.assertAlmostEqual(abs(gr2-myeom.spatial2spin(v2, orbspin)).max(), 0, 9)\n+\n myeom.partition = 'mp'\n self.assertAlmostEqual(lib.fp(r1), 1.4488291275539353, 11)\n self.assertAlmostEqual(lib.fp(r2), 0.97080165032287469, 11)\n@@ -506,8 +576,8 @@ def test_eomee_ccsd_matvec_singlet2(self):\n imds = myeom.make_imds(eris21)\n vec1 = myeom.matvec(vec, imds)\n r1, r2 = myeom.vector_to_amplitudes(vec1)\n- self.assertAlmostEqual(lib.fp(r1), -112883.3791497977, 7)\n- self.assertAlmostEqual(lib.fp(r2), -268199.3475813322, 7)\n+ self.assertAlmostEqual(lib.fp(r1), -145152.7851196310, 7)\n+ self.assertAlmostEqual(lib.fp(r2), -268196.0471308578, 7)\n \n def test_eomee_ccsd_matvec_triplet2(self):\n numpy.random.seed(10)\n@@ -521,9 +591,9 @@ def test_eomee_ccsd_matvec_triplet2(self):\n imds = myeom.make_imds(eris21)\n vec1 = myeom.matvec(vec, imds)\n r1, r2 = myeom.vector_to_amplitudes(vec1)\n- self.assertAlmostEqual(lib.fp(r1 ), 3550.5250670914056, 8)\n- self.assertAlmostEqual(lib.fp(r2[0]), -237433.03756895234,7)\n- self.assertAlmostEqual(lib.fp(r2[1]), 127680.0182437716 , 7)\n+ self.assertAlmostEqual(lib.fp(r1 ), -5616.12199728998, 8)\n+ self.assertAlmostEqual(lib.fp(r2[0]), -237430.14342594685,7)\n+ self.assertAlmostEqual(lib.fp(r2[1]), 127682.76151592708, 7)\n \n def test_eomsf_ccsd_matvec2(self):\n numpy.random.seed(10)\n@@ -534,15 +604,15 @@ def test_eomsf_ccsd_matvec2(self):\n imds = myeom.make_imds(eris21)\n vec1 = myeom.matvec(vec, imds)\n r1, r2 = myeom.vector_to_amplitudes(vec1)\n- self.assertAlmostEqual(lib.fp(r1 ), -19368.729268465482, 7)\n- self.assertAlmostEqual(lib.fp(r2[0]), 84325.863680611626 , 7)\n- self.assertAlmostEqual(lib.fp(r2[1]), 6715.9574457836134 , 7)\n+ self.assertAlmostEqual(lib.fp(r1 ), -6213.095578988824, 7)\n+ self.assertAlmostEqual(lib.fp(r2[0]), 84329.40539995288 , 7)\n+ self.assertAlmostEqual(lib.fp(r2[1]), 6719.930458652292 , 7)\n \n def test_eomee_diag2(self):\n vec1S, vec1T, vec2 = eom_rccsd.EOMEE(mycc21).get_diag()\n- self.assertAlmostEqual(lib.fp(vec1S),-4714.9854130015719, 8)\n- self.assertAlmostEqual(lib.fp(vec1T), 2221.3155272953709, 8)\n- self.assertAlmostEqual(lib.fp(vec2) ,-5486.1611871545592, 8)\n+ self.assertAlmostEqual(lib.fp(vec1S), -4714.969920334639, 8)\n+ self.assertAlmostEqual(lib.fp(vec1T), 2221.322839866705, 8)\n+ self.assertAlmostEqual(lib.fp(vec2) , -5486.124838268124, 8)\n \n \n def test_ip_matvec2(self):\n@@ -705,8 +775,8 @@ def test_eomee_ccsd_matvec_singlet3(self):\n imds = myeom.make_imds(eris31)\n vec1 = myeom.matvec(vec, imds)\n r1, r2 = myeom.vector_to_amplitudes(vec1)\n- self.assertAlmostEqual(lib.fp(r1), -112883.3791497977, 7)\n- self.assertAlmostEqual(lib.fp(r2), -268199.3475813322, 7)\n+ self.assertAlmostEqual(lib.fp(r1), -145152.7851196310, 7)\n+ self.assertAlmostEqual(lib.fp(r2), -268196.0471308578, 7)\n \n def test_eomee_ccsd_matvec_triplet3(self):\n numpy.random.seed(10)\n@@ -720,9 +790,9 @@ def test_eomee_ccsd_matvec_triplet3(self):\n imds = myeom.make_imds(eris31)\n vec1 = myeom.matvec(vec, imds)\n r1, r2 = myeom.vector_to_amplitudes(vec1)\n- self.assertAlmostEqual(lib.fp(r1 ), 3550.5250670914056, 8)\n- self.assertAlmostEqual(lib.fp(r2[0]), -237433.03756895234,7)\n- self.assertAlmostEqual(lib.fp(r2[1]), 127680.0182437716 , 7)\n+ self.assertAlmostEqual(lib.fp(r1 ), -5616.12199728998, 8)\n+ self.assertAlmostEqual(lib.fp(r2[0]), -237430.14342594685,7)\n+ self.assertAlmostEqual(lib.fp(r2[1]), 127682.76151592708, 7)\n \n def test_eomsf_ccsd_matvec3(self):\n numpy.random.seed(10)\n@@ -733,15 +803,15 @@ def test_eomsf_ccsd_matvec3(self):\n imds = myeom.make_imds(eris31)\n vec1 = myeom.matvec(vec, imds)\n r1, r2 = myeom.vector_to_amplitudes(vec1)\n- self.assertAlmostEqual(lib.fp(r1 ), -19368.729268465482, 7)\n- self.assertAlmostEqual(lib.fp(r2[0]), 84325.863680611626 , 7)\n- self.assertAlmostEqual(lib.fp(r2[1]), 6715.9574457836134 , 7)\n+ self.assertAlmostEqual(lib.fp(r1 ), -6213.095578988824, 7)\n+ self.assertAlmostEqual(lib.fp(r2[0]), 84329.40539995288 , 7)\n+ self.assertAlmostEqual(lib.fp(r2[1]), 6719.930458652292 , 7)\n \n def test_eomee_diag3(self):\n vec1S, vec1T, vec2 = eom_rccsd.EOMEE(mycc31).get_diag()\n- self.assertAlmostEqual(lib.fp(vec1S),-2881.6804563818432, 8)\n- self.assertAlmostEqual(lib.fp(vec1T), 2039.7385969969259, 8)\n- self.assertAlmostEqual(lib.fp(vec2) ,-4271.6230465236358, 8)\n+ self.assertAlmostEqual(lib.fp(vec1S), -2881.664963714903, 8)\n+ self.assertAlmostEqual(lib.fp(vec1T), 2039.745909568253, 8)\n+ self.assertAlmostEqual(lib.fp(vec2) , -4271.586697637197, 8)\n \n \n def test_ip_matvec3(self):\ndiff --git a/pyscf/cc/test/test_eom_uccsd.py b/pyscf/cc/test/test_eom_uccsd.py\nindex 7ec38eadae..754eeb873e 100644\n--- a/pyscf/cc/test/test_eom_uccsd.py\n+++ b/pyscf/cc/test/test_eom_uccsd.py\n@@ -16,6 +16,7 @@\n import copy\n import unittest\n import numpy\n+import numpy as np\n from functools import reduce\n \n from pyscf import gto\n@@ -29,8 +30,8 @@\n from pyscf.cc import eom_gccsd\n \n def setUpModule():\n- global mol, mf, mol1, mf0, mf1, gmf, ucc, ucc0, ucc1, eris1\n- global ecc, orbspin, nocca, noccb, nvira, nvirb, r1, r2\n+ global mol, mf, mol1, mf0, mf1, gmf, ucc, ucc0, ucc1\n+ global orbspin, nocca, noccb, nvira, nvirb, r1, r2\n mol = gto.Mole()\n mol.verbose = 0\n mol.atom = [\n@@ -57,7 +58,6 @@ def setUpModule():\n orbspin = gmf.mo_coeff.orbspin\n \n ucc1 = cc.UCCSD(mf1)\n- eris1 = ucc1.ao2mo()\n \n numpy.random.seed(11)\n no = nocca + noccb\n@@ -76,16 +76,17 @@ def setUpModule():\n ucc = cc.UCCSD(mf)\n ucc.max_space = 0\n ucc.conv_tol = 1e-8\n- ecc = ucc.kernel()[0]\n+ ucc.kernel()[0]\n \n ucc0 = cc.UCCSD(mf0)\n ucc0.conv_tol = 1e-8\n ucc0.direct = True\n ucc0.kernel()\n \n+\n def tearDownModule():\n- global mol, mf, mol1, mf0, mf1, gmf, ucc, ucc0, ucc1, eris1\n- del mol, mf, mol1, mf0, mf1, gmf, ucc, ucc0, ucc1, eris1\n+ global mol, mf, mol1, mf0, mf1, gmf, ucc, ucc0, ucc1\n+ del mol, mf, mol1, mf0, mf1, gmf, ucc, ucc0, ucc1\n \n class KnownValues(unittest.TestCase):\n def test_ipccsd(self):\n@@ -130,7 +131,7 @@ def test_eaccsd_koopmans(self):\n \n \n def test_eomee(self):\n- self.assertAlmostEqual(ecc, -0.13539788719099638, 5)\n+ self.assertAlmostEqual(ucc.e_corr, -0.13539788719099638, 5)\n eom = ucc.eomee_method()\n e,v = eom.kernel(nroots=1, koopmans=False)\n self.assertAlmostEqual(e, 0.28114509667240556, 5)\n@@ -164,11 +165,13 @@ def test_eomsf_ccsd(self):\n \n def test_ucc_update_amps(self):\n gcc1 = gccsd.GCCSD(gmf)\n+ orbspin = gcc1._scf.mo_coeff.orbspin\n r1g = gcc1.spatial2spin(ucc1.t1, orbspin)\n r2g = gcc1.spatial2spin(ucc1.t2, orbspin)\n r1g, r2g = gcc1.update_amps(r1g, r2g, gcc1.ao2mo())\n u1g = gcc1.spin2spatial(r1g, orbspin)\n u2g = gcc1.spin2spatial(r2g, orbspin)\n+ eris1 = ucc1.ao2mo()\n t1, t2 = ucc1.update_amps(ucc1.t1, ucc1.t2, eris1)\n self.assertAlmostEqual(abs(u1g[0]-t1[0]).max(), 0, 7)\n self.assertAlmostEqual(abs(u1g[1]-t1[1]).max(), 0, 7)\n@@ -199,29 +202,59 @@ def test_ucc_eomee_ccsd_matvec(self):\n gr1 = gcc1.spatial2spin(r1)\n gr2 = gcc1.spatial2spin(r2)\n gee1 = eom_gccsd.EOMEE(gcc1)\n- gvec = eom_gccsd.amplitudes_to_vector_ee(gr1, gr2)\n- vecref = eom_gccsd.eeccsd_matvec(gee1, gvec)\n+ gvec = gee1.amplitudes_to_vector(gr1, gr2)\n+ vecref = gee1.matvec(gvec)\n \n- vec = eom_uccsd.amplitudes_to_vector_ee(r1,r2)\n uee1 = eom_uccsd.EOMEESpinKeep(ucc1)\n- vec1 = eom_uccsd.eomee_ccsd_matvec(uee1, vec)\n-\n- uv = eom_uccsd.amplitudes_to_vector_ee(r1, r2)\n- gv = eom_gccsd.amplitudes_to_vector_ee(gr1, gr2)\n- r1, r2 = uee1.vector_to_amplitudes(uee1.matvec(uv))\n- gr1, gr2 = gee1.vector_to_amplitudes(gee1.matvec(gv))\n+ orbspin = gcc1._scf.mo_coeff.orbspin\n+ r1 = uee1.spin2spatial(uee1.spatial2spin(r1, orbspin), orbspin)\n+ r2 = uee1.spin2spatial(uee1.spatial2spin(r2, orbspin), orbspin)\n+ vec = uee1.amplitudes_to_vector(r1,r2)\n+ vec1 = uee1.matvec(vec)\n \n r1, r2 = uee1.vector_to_amplitudes(vec1)\n gr1, gr2 = gee1.vector_to_amplitudes(vecref)\n- self.assertAlmostEqual(float(abs(gr1-gcc1.spatial2spin(r1)).max()), 0, 9)\n- self.assertAlmostEqual(float(abs(gr2-gcc1.spatial2spin(r2)).max()), 0, 9)\n+ self.assertAlmostEqual(float(abs(gr1-uee1.spatial2spin(r1, orbspin)).max()), 0, 9)\n+ self.assertAlmostEqual(float(abs(gr2-uee1.spatial2spin(r2, orbspin)).max()), 0, 9)\n+ self.assertAlmostEqual(lib.fp(vec1), 49.499911123484523, 9)\n+\n+ ucc2 = copy.copy(ucc1)\n+ ucc2.direct = True\n+ uee1 = eom_uccsd.EOMEESpinKeep(ucc2)\n+ vec1 = uee1.matvec(vec)\n self.assertAlmostEqual(lib.fp(vec1), 49.499911123484523, 9)\n \n- def test_ucc_eomee_ccsd_diag(self): # FIXME: compare to EOMEE-GCCSD diag\n+ def test_ucc_eomee_ccsd_diag(self):\n vec1, vec2 = eom_uccsd.EOMEE(ucc1).get_diag()\n self.assertAlmostEqual(lib.fp(vec1), 62.767648620751018, 9)\n self.assertAlmostEqual(lib.fp(vec2), 156.2976365433517, 9)\n \n+ gcc1 = cc.addons.convert_to_gccsd(ucc1)\n+ gee1 = eom_gccsd.EOMEE(gcc1)\n+ gvec = gee1.get_diag()\n+ orbspin = gcc1._scf.mo_coeff.orbspin\n+ gv1, gv2 = gee1.vector_to_amplitudes(gvec)\n+\n+ nmo = ucc1.nmo\n+ nocc = ucc1.nocc\n+ v1, v2 = eom_uccsd.vector_to_amplitudes_eomee(vec1, nmo, nocc)\n+ r1 = eom_uccsd.spin2spatial_eomee(gv1, orbspin)\n+ r2 = eom_uccsd.spin2spatial_eomee(gv2, orbspin)\n+ self.assertAlmostEqual(abs(abs(v1[0])-abs(r1[0])).max(), 0, 9)\n+ self.assertAlmostEqual(abs(abs(v1[1])-abs(r1[1])).max(), 0, 9)\n+ self.assertAlmostEqual(abs(abs(v2[0])-abs(r2[0])).max(), 0, 9)\n+ self.assertAlmostEqual(abs(abs(v2[1])-abs(r2[1])).max(), 0, 9)\n+ self.assertAlmostEqual(abs(abs(v2[2])-abs(r2[2])).max(), 0, 9)\n+\n+ v1, v2 = eom_uccsd.vector_to_amplitudes_eomsf(vec2, nmo, nocc)\n+ r1 = eom_uccsd.spin2spatial_eomsf(gv1, orbspin)\n+ r2 = eom_uccsd.spin2spatial_eomsf(gv2, orbspin)\n+ self.assertAlmostEqual(abs(abs(v1[0])-abs(r1[0])).max(), 0, 9)\n+ self.assertAlmostEqual(abs(abs(v1[1])-abs(r1[1])).max(), 0, 9)\n+ self.assertAlmostEqual(abs(abs(v2[0])-abs(r2[0])).max(), 0, 9)\n+ self.assertAlmostEqual(abs(abs(v2[1])-abs(r2[1])).max(), 0, 9)\n+ self.assertAlmostEqual(abs(abs(v2[2])-abs(r2[2])).max(), 0, 9)\n+\n def test_ucc_eomee_init_guess(self):\n uee = eom_uccsd.EOMEESpinKeep(ucc1)\n diag = uee.get_diag()[0]\n@@ -241,25 +274,88 @@ def test_ucc_eomsf_ccsd_matvec(self):\n numpy.random.seed(10)\n myeom = eom_uccsd.EOMEESpinFlip(ucc1)\n vec = numpy.random.random(myeom.vector_size()) - .9\n- vec1 = eom_uccsd.eomsf_ccsd_matvec(myeom, vec)\n+ vec1 = myeom.matvec(vec)\n+ self.assertAlmostEqual(lib.fp(vec1), -1655.5564756993756, 8)\n+\n+ gcc1 = cc.addons.convert_to_gccsd(ucc1)\n+ gee1 = eom_gccsd.EOMEE(gcc1)\n+ r1, r2 = myeom.vector_to_amplitudes(vec)\n+ orbspin = gcc1._scf.mo_coeff.orbspin\n+ r1 = myeom.spin2spatial(myeom.spatial2spin(r1, orbspin), orbspin)\n+ r2 = myeom.spin2spatial(myeom.spatial2spin(r2, orbspin), orbspin)\n+ gr1 = myeom.spatial2spin(r1, orbspin)\n+ gr2 = myeom.spatial2spin(r2, orbspin)\n+ gvec = gee1.amplitudes_to_vector(gr1, gr2)\n+\n+ vecref = gee1.matvec(gvec)\n+ gr1, gr2 = gee1.vector_to_amplitudes(vecref)\n+ v1, v2 = myeom.vector_to_amplitudes(vec1)\n+ self.assertAlmostEqual(float(abs(gr1-myeom.spatial2spin(v1, orbspin)).max()), 0, 9)\n+ self.assertAlmostEqual(float(abs(gr2-myeom.spatial2spin(v2, orbspin)).max()), 0, 9)\n+\n+ ucc2 = copy.copy(ucc1)\n+ ucc2.direct = True\n+ myeom = eom_uccsd.EOMEESpinFlip(ucc2)\n+ vec1 = myeom.matvec(vec)\n self.assertAlmostEqual(lib.fp(vec1), -1655.5564756993756, 8)\n \n+ def test_ucc_eomip_matvec(self):\n+ numpy.random.seed(10)\n+ myeom = eom_uccsd.EOMIP(ucc1)\n+ vec = numpy.random.random(myeom.vector_size()) - .9\n+ vec1 = myeom.matvec(vec)\n+ self.assertAlmostEqual(lib.fp(vec1), -216.54704385639815, 8)\n+\n+ gcc1 = cc.addons.convert_to_gccsd(ucc1)\n+ gee1 = eom_gccsd.EOMIP(gcc1)\n r1, r2 = myeom.vector_to_amplitudes(vec)\n- gr1 = eom_uccsd.spatial2spin_eomsf(r1, orbspin)\n- gr2 = eom_uccsd.spatial2spin_eomsf(r2, orbspin)\n- gvec = eom_gccsd.amplitudes_to_vector_ee(gr1, gr2)\n+ orbspin = gcc1._scf.mo_coeff.orbspin\n+ r1 = myeom.spin2spatial(myeom.spatial2spin(r1, orbspin), orbspin)\n+ r2 = myeom.spin2spatial(myeom.spatial2spin(r2, orbspin), orbspin)\n+ gr1 = myeom.spatial2spin(r1, orbspin)\n+ gr2 = myeom.spatial2spin(r2, orbspin)\n+ gvec = gee1.amplitudes_to_vector(gr1, gr2)\n+\n+ vecref = gee1.matvec(gvec)\n+ gr1, gr2 = gee1.vector_to_amplitudes(vecref)\n+ v1, v2 = myeom.vector_to_amplitudes(vec1)\n+ self.assertAlmostEqual(float(abs(gr1-myeom.spatial2spin(v1, orbspin)).max()), 0, 9)\n+ self.assertAlmostEqual(float(abs(gr2-myeom.spatial2spin(v2, orbspin)).max()), 0, 9)\n+\n+ ucc2 = copy.copy(ucc1)\n+ ucc2.direct = True\n+ myeom = eom_uccsd.EOMIP(ucc2)\n+ vec1 = myeom.matvec(vec)\n+ self.assertAlmostEqual(lib.fp(vec1), -216.54704385639815, 8)\n+\n+ def test_ucc_eomea_matvec(self):\n+ numpy.random.seed(10)\n+ myeom = eom_uccsd.EOMEA(ucc1)\n+ vec = numpy.random.random(myeom.vector_size()) - .9\n+ vec1 = myeom.matvec(vec)\n+ self.assertAlmostEqual(lib.fp(vec1), -110.5193188685705, 8)\n \n gcc1 = cc.addons.convert_to_gccsd(ucc1)\n- gee1 = eom_gccsd.EOMEE(gcc1)\n- vecref = eom_gccsd.eeccsd_matvec(gee1, gvec)\n+ gee1 = eom_gccsd.EOMEA(gcc1)\n+ r1, r2 = myeom.vector_to_amplitudes(vec)\n+ orbspin = gcc1._scf.mo_coeff.orbspin\n+ r1 = myeom.spin2spatial(myeom.spatial2spin(r1, orbspin), orbspin)\n+ r2 = myeom.spin2spatial(myeom.spatial2spin(r2, orbspin), orbspin)\n+ gr1 = myeom.spatial2spin(r1, orbspin)\n+ gr2 = myeom.spatial2spin(r2, orbspin)\n+ gvec = gee1.amplitudes_to_vector(gr1, gr2)\n+\n+ vecref = gee1.matvec(gvec)\n gr1, gr2 = gee1.vector_to_amplitudes(vecref)\n v1, v2 = myeom.vector_to_amplitudes(vec1)\n- self.assertAlmostEqual(float(abs(gr1-eom_uccsd.spatial2spin_eomsf(v1, orbspin)).max()), 0, 9)\n- self.assertAlmostEqual(float(abs(gr2-eom_uccsd.spatial2spin_eomsf(v2, orbspin)).max()), 0, 9)\n+ self.assertAlmostEqual(float(abs(gr1-myeom.spatial2spin(v1, orbspin)).max()), 0, 9)\n+ self.assertAlmostEqual(float(abs(gr2-myeom.spatial2spin(v2, orbspin)).max()), 0, 9)\n \n-# def test_ucc_eomip_matvec(self):\n-#\n-# def test_ucc_eomea_matvec(self):\n+ ucc2 = copy.copy(ucc1)\n+ ucc2.direct = True\n+ myeom = eom_uccsd.EOMEA(ucc2)\n+ vec1 = myeom.matvec(vec)\n+ self.assertAlmostEqual(lib.fp(vec1), -110.5193188685705, 8)\n \n ########################################\n # With 4-fold symmetry in integrals\n@@ -289,8 +385,8 @@ def test_spatial2spin_eomsf(self):\n size = eomsf.vector_size()\n v = numpy.random.random(size)\n r1, r2 = eomsf.vector_to_amplitudes(v)\n- v1 = eom_uccsd.spin2spatial_eomsf(eom_uccsd.spatial2spin_eomsf(r1, orbspin), orbspin)\n- v2 = eom_uccsd.spin2spatial_eomsf(eom_uccsd.spatial2spin_eomsf(r2, orbspin), orbspin)\n+ v1 = eomsf.spin2spatial(eomsf.spatial2spin(r1, orbspin), orbspin)\n+ v2 = eomsf.spin2spatial(eomsf.spatial2spin(r2, orbspin), orbspin)\n self.assertAlmostEqual(abs(r1[0]-v1[0]).max(), 0, 12)\n self.assertAlmostEqual(abs(r1[1]-v1[1]).max(), 0, 12)\n self.assertAlmostEqual(abs(r2[0]-v2[0]).max(), 0, 12)\n", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}115{"question_id": "MSB_pyscf_pyscf_pr1529", "question_type": "multi_swe_bench", "description": "FCI wavefunction symmetry (pyscf/pyscf#1529)", "content": {"org": "pyscf", "repo": "pyscf", "pr_number": 1529, "issue_title": "FCI wavefunction symmetry", "issue_body": "* Support Dinfh and Cinv symmetry in FCI solver\r\n* Fix issue #1517\r\n* Adjust FCI initial guess", "base_commit": "91ff78377d6cc5c4b062051b4846df1c1ffd4a7c", "resolved_issues": [{"number": 1517, "title": "Problems with FCI in Dooh symmetry", "body": "I am trying to run some FCI calculations in Dooh symmetry. The following input\r\n```\r\nimport numpy\r\nfrom pyscf import gto, scf, fci\r\n\r\nmol = gto.Mole()\r\n# Singlet bond length 2.913\r\nmol.build(\r\n atom = 'Li 0 0 0; Li 0 0 2.913',\r\n unit = 'angstrom',\r\n basis = 'cc-pVDZ',\r\n spin = 0,\r\n verbose = 4,\r\n symmetry = True,\r\n symmetry_subgroup = 'Dooh'\r\n)\r\nmf = scf.RHF(mol)\r\nmf.kernel()\r\n\r\nci_energies = {}\r\nfor sym in ['A1g', 'A1u', 'E1ux', 'E1uy', 'E1gx', 'E1gy', 'E2gx', 'E2gy', 'E2ux', 'E2uy', 'E3ux', 'E3uy', 'E3gx', 'E3gy']:\r\n mci = fci.FCI(mol, mf.mo_coeff, singlet=False)\r\n mci.wfnsym = sym\r\n e, civec = mci.kernel(nroots=3)\r\n ci_energies[sym] = e\r\n print('{}: {}'.format(sym,e))\r\n```\r\ngives the following energies\r\n```\r\nA1g: [-14.90048097 -14.82656573 -14.80619407]\r\nA1u: [-14.86012998 -14.83774646 -14.75794947]\r\nE1ux: [-14.84879138 -14.80549729 -14.74183726]\r\nE1uy: [-14.84879138 -14.80549729 -14.74183726]\r\nE1gx: [-14.79618456 -14.78343722 -14.75798428]\r\nE1gy: [-14.79618456 -14.78343722 -14.75798428]\r\nE2gx: [-14.90048097 -14.82656573 -14.80619407]\r\nE2gy: [-14.7461423 -14.74326066 -14.64015681]\r\nE2ux: [-14.86012998 -14.83774646 -14.75794947]\r\nE2uy: [-14.705979 -14.7043607 -14.66552235]\r\nE3ux: [-14.84879138 -14.80549729 -14.74183726]\r\nE3uy: [-14.84879138 -14.80549729 -14.74183726]\r\nE3gx: [-14.79618456 -14.78343722 -14.75798428]\r\nE3gy: [-14.79618456 -14.78343722 -14.75798428]\r\n```\r\nAs you can see, there is a big problem in the E2 energies: \r\n\r\n- the x and y data are different\r\n- `E2gx` results in the same energies as `A1g`\r\n- `E2ux` results in the same energies as `A1u`\r\n- the lowest Phi state `E3ux` is lower in energy than the Delta state `E2gy`\r\n\r\nRunning with `verbose=10` shows `Guessing CI wfn symmetry = 0` for the `E2gx` calculation (same as for the `A1g` calculation), while `E2ux` and `A1u` both show `Guessing CI wfn symmetry = 5`, so this could be just a problem with a wrong initial guess\n\n### Minimal API referenced by tests (typed signatures)\n_Added only when tests call brand\u2011new symbols introduced by the fix; types reflect annotations present in the repo or `Unknown` if not annotated._\n\n- Function in `pyscf/fci/direct_spin1_cyl_sym.py`: `def guess_wfnsym(solver, norb, nelec, fcivec, orbsym, wfnsym, kwargs) -> int: ...`\n **Inputs:** solver: fci.direct_spin1.FCISolver, norb: int, nelec: Union[int, tuple], fcivec: numpy.ndarray, orbsym: Unknown, wfnsym: Unknown, kwargs: dict\n **Output:** int\n\n- Function in `pyscf/fci/direct_spin1_symm.py`: `def _cyl_sym_csf2civec(strs, addr, orbsym, degen_mapping) -> numpy.ndarray: ...`\n **Inputs:** strs: numpy.ndarray, addr: numpy.ndarray, orbsym: Unknown, degen_mapping: numpy.ndarray\n **Output:** numpy.ndarray\n\n- Function in `pyscf/fci/direct_spin1_symm.py`: `def _cyl_sym_orbital_rotation(orbsym, degen_mapping) -> numpy.ndarray: ...`\n **Inputs:** orbsym: Unknown, degen_mapping: numpy.ndarray\n **Output:** numpy.ndarray\n\n- Function in `pyscf/fci/direct_spin1_symm.py`: `def guess_wfnsym(solver, norb, nelec, fcivec, orbsym, wfnsym, kwargs) -> int: ...`\n **Inputs:** solver: fci.direct_spin1.FCISolver, norb: int, nelec: Union[int, tuple], fcivec: numpy.ndarray, orbsym: Unknown, wfnsym: Unknown, kwargs: dict\n **Output:** int\n\n- Function in `pyscf/gto/mole.py`: `def ao_rotation_matrix(mol, orientation) -> numpy.ndarray: ...`\n **Inputs:** mol: gto.Mole, orientation: numpy.ndarray\n **Output:** numpy.ndarray\n\n```python\ndef guess_wfnsym(solver, norb, nelec, fcivec, orbsym, wfnsym, kwargs) -> int: ...\ndef _cyl_sym_csf2civec(strs, addr, orbsym, degen_mapping) -> numpy.ndarray: ...\ndef _cyl_sym_orbital_rotation(orbsym, degen_mapping) -> numpy.ndarray: ...\ndef guess_wfnsym(solver, norb, nelec, fcivec, orbsym, wfnsym, kwargs) -> int: ...\ndef ao_rotation_matrix(mol, orientation) -> numpy.ndarray: ...\n```"}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/pyscf_m_pyscf:pr-1529", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/pyscf/fci/addons.py b/pyscf/fci/addons.py\nindex d9b470b4c8..acd4fbe7c7 100644\n--- a/pyscf/fci/addons.py\n+++ b/pyscf/fci/addons.py\n@@ -417,8 +417,9 @@ def guess_wfnsym(ci, norb, nelec, orbsym):\n Irrep ID\n '''\n neleca, nelecb = _unpack_nelec(nelec)\n- strsa = numpy.asarray(cistring.make_strings(range(norb), neleca))\n- strsb = numpy.asarray(cistring.make_strings(range(norb), nelecb))\n+ strsa = strsb = numpy.asarray(cistring.make_strings(range(norb), neleca))\n+ if neleca != nelecb:\n+ strsb = numpy.asarray(cistring.make_strings(range(norb), nelecb))\n if isinstance(ci, numpy.ndarray) and ci.ndim <= 2:\n wfnsym = _guess_wfnsym(ci, strsa, strsb, orbsym)\n else:\n@@ -781,7 +782,7 @@ def transform_ci(ci, nelec, u):\n if neleca == 0:\n trans_ci_a = numpy.ones((1, 1))\n else:\n- trans_ci_a = numpy.zeros((na_old, na_new))\n+ trans_ci_a = numpy.zeros((na_old, na_new), dtype=ua.dtype)\n strs_old = numpy.asarray(cistring.make_strings(range(norb_old), neleca))\n \n # Unitary transformation array trans_ci is the overlap between two sets of CI basis.\n@@ -808,7 +809,7 @@ def transform_ci(ci, nelec, u):\n elif nelecb == 0:\n trans_ci_b = numpy.ones((1, 1))\n else:\n- trans_ci_b = numpy.zeros((nb_old, nb_new))\n+ trans_ci_b = numpy.zeros((nb_old, nb_new), dtype=ub.dtype)\n strs_old = numpy.asarray(cistring.make_strings(range(norb_old), nelecb))\n \n occ_masks_old = (strs_old[:,None] & one_particle_strs_old) != 0\ndiff --git a/pyscf/fci/cistring.py b/pyscf/fci/cistring.py\nindex 0a8b5d1120..62fc928e93 100644\n--- a/pyscf/fci/cistring.py\n+++ b/pyscf/fci/cistring.py\n@@ -98,6 +98,7 @@ def _strs2occslst(strs, norb):\n occslst = numpy.where(occ_masks)[1].reshape(na,-1)\n return numpy.asarray(occslst, dtype=numpy.int32).view(OIndexList)\n def _occslst2strs(occslst):\n+ occslst = numpy.asarray(occslst)\n na, nelec = occslst.shape\n strs = numpy.zeros(na, dtype=numpy.int64)\n for i in range(nelec):\ndiff --git a/pyscf/fci/direct_nosym.py b/pyscf/fci/direct_nosym.py\nindex 428b366e6e..b9c597ae7b 100644\n--- a/pyscf/fci/direct_nosym.py\n+++ b/pyscf/fci/direct_nosym.py\n@@ -133,6 +133,8 @@ def energy(h1e, eri, fcivec, norb, nelec, link_index=None):\n ci1 = contract_2e(h2e, fcivec, norb, nelec, link_index)\n return numpy.dot(fcivec.reshape(-1), ci1.reshape(-1))\n \n+make_hdiag = direct_spin1.make_hdiag\n+\n \n class FCISolver(direct_spin1.FCISolver):\n def __init__(self, *args, **kwargs):\ndiff --git a/pyscf/fci/direct_spin0_symm.py b/pyscf/fci/direct_spin0_symm.py\nindex af670570ca..fc6be225f4 100644\n--- a/pyscf/fci/direct_spin0_symm.py\n+++ b/pyscf/fci/direct_spin0_symm.py\n@@ -38,6 +38,7 @@\n from pyscf import ao2mo\n from pyscf.lib import logger\n from pyscf import symm\n+from pyscf.scf.hf_symm import map_degeneracy\n from pyscf.fci import cistring\n from pyscf.fci import direct_spin0\n from pyscf.fci import direct_spin1\n@@ -88,22 +89,23 @@ def contract_2e(eri, fcivec, norb, nelec, link_index=None, orbsym=None, wfnsym=0\n \n ci0 = []\n ci1 = []\n+ wfnsym_in_d2h = wfnsym % 10\n for ir in range(TOTIRREPS):\n- ma, mb = aidx[ir].size, aidx[wfnsym ^ ir].size\n+ ma, mb = aidx[ir].size, aidx[wfnsym_in_d2h ^ ir].size\n ci0.append(numpy.zeros((ma,mb)))\n ci1.append(numpy.zeros((ma,mb)))\n if ma > 0 and mb > 0:\n- lib.take_2d(fcivec, aidx[ir], aidx[wfnsym ^ ir], out=ci0[ir])\n+ lib.take_2d(fcivec, aidx[ir], aidx[wfnsym_in_d2h ^ ir], out=ci0[ir])\n ci0_ptrs = Tirrep(*[x.ctypes.data_as(ctypes.c_void_p) for x in ci0])\n ci1_ptrs = Tirrep(*[x.ctypes.data_as(ctypes.c_void_p) for x in ci1])\n libfci.FCIcontract_2e_symm1(eri_ptrs, ci0_ptrs, ci1_ptrs,\n ctypes.c_int(norb), nas, nas,\n ctypes.c_int(nlinka), ctypes.c_int(nlinka),\n linka_ptr, linka_ptr, dimirrep,\n- ctypes.c_int(wfnsym))\n+ ctypes.c_int(wfnsym_in_d2h))\n for ir in range(TOTIRREPS):\n if ci0[ir].size > 0:\n- lib.takebak_2d(ci1new, ci1[ir], aidx[ir], aidx[wfnsym ^ ir])\n+ lib.takebak_2d(ci1new, ci1[ir], aidx[ir], aidx[wfnsym_in_d2h ^ ir])\n ci1 = lib.transpose_sum(ci1new, inplace=True).reshape(fcivec_shape)\n return ci1.view(direct_spin1.FCIvector)\n \n@@ -161,33 +163,77 @@ def get_init_guess(norb, nelec, nroots, hdiag, orbsym, wfnsym=0):\n strsa = cistring.gen_strings4orblist(range(norb), neleca)\n airreps = direct_spin1_symm._gen_strs_irrep(strsa, orbsym)\n na = nb = len(airreps)\n+ hdiag = hdiag.reshape(na,nb)\n \n- init_strs = []\n- iroot = 0\n- for addr in numpy.argsort(hdiag):\n- addra = addr // nb\n- addrb = addr % nb\n- if airreps[addra] ^ airreps[addrb] == wfnsym:\n- if (addrb,addra) not in init_strs:\n- init_strs.append((addra,addrb))\n- iroot += 1\n- if iroot >= nroots:\n- break\n ci0 = []\n- for addra,addrb in init_strs:\n- x = numpy.zeros((na,nb))\n- if addra == addrb == 0:\n+ iroot = 0\n+ sym_allowed = (airreps[:,None] ^ airreps) == wfnsym\n+ idx = numpy.arange(na)\n+ sym_allowed[idx[:,None] < idx] = False\n+ idx_a, idx_b = numpy.where(sym_allowed)\n+ for k in hdiag[idx_a,idx_b].argsort():\n+ addra, addrb = idx_a[k], idx_b[k]\n+ x = numpy.zeros((na, nb))\n+ if addra == addrb:\n x[addra,addrb] = 1\n else:\n x[addra,addrb] = x[addrb,addra] = numpy.sqrt(.5)\n ci0.append(x.ravel().view(direct_spin1.FCIvector))\n+ iroot += 1\n+ if iroot >= nroots:\n+ break\n \n- # Add noise\n- #ci0[0][0 ] += 1e-5\n- #ci0[0][-1] -= 1e-5\n if len(ci0) == 0:\n- raise RuntimeError('No determinant matches the target symmetry %s' %\n- wfnsym)\n+ raise RuntimeError(f'Initial guess for symmetry {wfnsym} not found')\n+ return ci0\n+\n+def get_init_guess_cyl_sym(norb, nelec, nroots, hdiag, orbsym, wfnsym=0):\n+ neleca, nelecb = direct_spin1._unpack_nelec(nelec)\n+ strsa = cistring.gen_strings4orblist(range(norb), neleca)\n+ airreps_d2h = direct_spin1_symm._gen_strs_irrep(strsa, orbsym)\n+ a_ls = direct_spin1_symm._strs_angular_momentum(strsa, orbsym)\n+\n+ wfnsym_in_d2h = wfnsym % 10\n+ wfn_momentum = symm.basis.linearmole_irrep2momentum(wfnsym)\n+ na = nb = len(strsa)\n+ hdiag = hdiag.reshape(na,nb)\n+ degen = orbsym.degen_mapping\n+ ci0 = []\n+ iroot = 0\n+ wfn_ungerade = wfnsym_in_d2h >= 4\n+ a_ungerade = airreps_d2h >= 4\n+ sym_allowed = a_ungerade[:,None] == a_ungerade ^ wfn_ungerade\n+ # total angular momentum == wfn_momentum\n+ sym_allowed &= a_ls[:,None] == wfn_momentum - a_ls\n+ idx = numpy.arange(na)\n+ sym_allowed[idx[:,None] < idx] = False\n+\n+ idx_a, idx_b = numpy.where(sym_allowed)\n+ for k in hdiag[idx_a,idx_b].argsort():\n+ addra, addrb = idx_a[k], idx_b[k]\n+ ca = direct_spin1_symm._cyl_sym_csf2civec(strsa, addra, orbsym, degen)\n+ cb = direct_spin1_symm._cyl_sym_csf2civec(strsa, addrb, orbsym, degen)\n+ if wfn_momentum > 0 or wfnsym in (0, 5):\n+ x = ca.real[:,None] * cb.real\n+ x-= ca.imag[:,None] * cb.imag\n+ else:\n+ x = ca.imag[:,None] * cb.real\n+ x+= ca.real[:,None] * cb.imag\n+ if addra == addrb:\n+ norm = numpy.linalg.norm(x)\n+ else:\n+ x = x + x.T\n+ norm = numpy.linalg.norm(x)\n+ if norm < 1e-7:\n+ continue\n+ x *= 1./norm\n+ ci0.append(x.ravel().view(direct_spin1.FCIvector))\n+ iroot += 1\n+ if iroot >= nroots:\n+ break\n+\n+ if len(ci0) == 0:\n+ raise RuntimeError(f'Initial guess for symmetry {wfnsym} not found')\n return ci0\n \n \n@@ -209,8 +255,9 @@ def dump_flags(self, verbose=None):\n if isinstance(self.wfnsym, str):\n log.info('specified CI wfn symmetry = %s', self.wfnsym)\n elif isinstance(self.wfnsym, (int, numpy.number)):\n+ groupname = getattr(self.mol, 'groupname', None)\n log.info('specified CI wfn symmetry = %s',\n- symm.irrep_id2name(self.mol.groupname, self.wfnsym))\n+ symm.irrep_id2name(groupname, self.wfnsym))\n \n def absorb_h1e(self, h1e, eri, norb, nelec, fac=1):\n return direct_spin1.absorb_h1e(h1e, eri, norb, nelec, fac)\n@@ -235,22 +282,13 @@ def contract_2e(self, eri, fcivec, norb, nelec, link_index=None,\n def get_init_guess(self, norb, nelec, nroots, hdiag):\n wfnsym = direct_spin1_symm._id_wfnsym(self, norb, nelec, self.orbsym,\n self.wfnsym)\n- return get_init_guess(norb, nelec, nroots, hdiag, self.orbsym, wfnsym)\n-\n- def guess_wfnsym(self, norb, nelec, fcivec=None, orbsym=None, wfnsym=None,\n- **kwargs):\n- if orbsym is None:\n- orbsym = self.orbsym\n- if fcivec is None:\n- wfnsym = direct_spin1_symm._id_wfnsym(self, norb, nelec, orbsym,\n- wfnsym)\n+ if getattr(self.mol, 'groupname', None) in ('Dooh', 'Coov'):\n+ return get_init_guess_cyl_sym(\n+ norb, nelec, nroots, hdiag, self.orbsym, wfnsym)\n else:\n- wfnsym = addons.guess_wfnsym(fcivec, norb, nelec, orbsym)\n+ return get_init_guess(norb, nelec, nroots, hdiag, self.orbsym, wfnsym)\n \n- verbose = kwargs.get('verbose', None)\n- log = logger.new_logger(self, verbose)\n- log.debug('Guessing CI wfn symmetry = %s', wfnsym)\n- return wfnsym\n+ guess_wfnsym = direct_spin1_symm.guess_wfnsym\n \n def kernel(self, h1e, eri, norb, nelec, ci0=None,\n tol=None, lindep=None, max_cycle=None, max_space=None,\n@@ -264,7 +302,22 @@ def kernel(self, h1e, eri, norb, nelec, ci0=None,\n self.norb = norb\n self.nelec = nelec\n \n+ if (not hasattr(orbsym, 'degen_mapping') and\n+ getattr(self.mol, 'groupname', None) in ('Dooh', 'Coov')):\n+ degen_mapping = map_degeneracy(h1e.diagonal(), orbsym)\n+ orbsym = lib.tag_array(orbsym, degen_mapping=degen_mapping)\n+\n wfnsym = self.guess_wfnsym(norb, nelec, ci0, orbsym, wfnsym, **kwargs)\n+\n+ if wfnsym > 7:\n+ # Symmetry broken for Dooh and Coov groups is often observed.\n+ # A larger max_space is helpful to reduce the error. Also it is\n+ # hard to converge to high precision.\n+ if max_space is None and self.max_space == FCISolver.max_space:\n+ max_space = 20 + 7 * nroots\n+ if tol is None and self.conv_tol == FCISolver.conv_tol:\n+ tol = 1e-7\n+\n with lib.temporary_env(self, orbsym=orbsym, wfnsym=wfnsym):\n e, c = direct_spin0.kernel_ms0(self, h1e, eri, norb, nelec, ci0, None,\n tol, lindep, max_cycle, max_space,\n@@ -274,64 +327,3 @@ def kernel(self, h1e, eri, norb, nelec, ci0=None,\n return e, c\n \n FCI = FCISolver\n-\n-\n-if __name__ == '__main__':\n- from functools import reduce\n- from pyscf import gto\n- from pyscf import scf\n-\n- mol = gto.Mole()\n- mol.verbose = 0\n- mol.output = None\n- mol.atom = [\n- ['O', ( 0., 0. , 0. )],\n- ['H', ( 0., -0.757, 0.587)],\n- ['H', ( 0., 0.757 , 0.587)],]\n- mol.basis = {'H': 'sto-3g',\n- 'O': 'sto-3g',}\n- mol.symmetry = 1\n- mol.build()\n- m = scf.RHF(mol)\n- ehf = m.scf()\n-\n- norb = m.mo_coeff.shape[1]\n- nelec = mol.nelectron\n- h1e = reduce(numpy.dot, (m.mo_coeff.T, scf.hf.get_hcore(mol), m.mo_coeff))\n- eri = ao2mo.incore.full(m._eri, m.mo_coeff)\n- numpy.random.seed(1)\n- na = cistring.num_strings(norb, nelec//2)\n- fcivec = numpy.random.random((na,na))\n- fcivec = fcivec + fcivec.T\n-\n- orbsym = symm.label_orb_symm(mol, mol.irrep_id, mol.symm_orb, m.mo_coeff)\n- print(numpy.allclose(orbsym, [0, 0, 2, 0, 3, 0, 2]))\n- cis = FCISolver(mol)\n- cis.orbsym = orbsym\n- fcivec = addons.symmetrize_wfn(fcivec, norb, nelec, cis.orbsym, wfnsym=0)\n- ci1 = cis.contract_2e(eri, fcivec, norb, nelec)\n- ci1ref = direct_spin0.contract_2e(eri, fcivec, norb, nelec)\n- print(numpy.allclose(ci1ref, ci1))\n- e = cis.kernel(h1e, eri, norb, nelec, ecore=m.energy_nuc(), davidson_only=True)[0]\n- print(e, e - -75.012647118991595)\n-\n- mol.atom = [['H', (0, 0, i)] for i in range(8)]\n- mol.basis = {'H': 'sto-3g'}\n- mol.symmetry = True\n- mol.build()\n- m = scf.RHF(mol)\n- ehf = m.scf()\n-\n- norb = m.mo_coeff.shape[1]\n- nelec = mol.nelectron\n- eri = ao2mo.incore.full(m._eri, m.mo_coeff)\n- na = cistring.num_strings(norb, nelec//2)\n- fcivec = numpy.random.random((na,na))\n- fcivec = fcivec + fcivec.T\n- orbsym = symm.label_orb_symm(mol, mol.irrep_id, mol.symm_orb, m.mo_coeff)\n- cis = FCISolver(mol)\n- cis.orbsym = orbsym\n- fcivec = addons.symmetrize_wfn(fcivec, norb, nelec, cis.orbsym, wfnsym=0)\n- ci1 = cis.contract_2e(eri, fcivec, norb, nelec)\n- ci1ref = direct_spin0.contract_2e(eri, fcivec, norb, nelec)\n- print(numpy.allclose(ci1ref, ci1))\ndiff --git a/pyscf/fci/direct_spin1.py b/pyscf/fci/direct_spin1.py\nindex acb7075e6c..5b1bcfb96b 100644\n--- a/pyscf/fci/direct_spin1.py\n+++ b/pyscf/fci/direct_spin1.py\n@@ -428,19 +428,26 @@ def trans_rdm12(cibra, ciket, norb, nelec, link_index=None, reorder=True):\n dm1, dm2 = rdm.reorder_rdm(dm1, dm2, inplace=True)\n return dm1, dm2\n \n-def _get_init_guess(na, nb, nroots, hdiag):\n- '''Initial guess is the single Slater determinant\n- '''\n+def _get_init_guess(na, nb, nroots, hdiag, nelec):\n # The \"nroots\" lowest determinats based on energy expectation value.\n ci0 = []\n- try:\n+ neleca, nelecb = _unpack_nelec(nelec)\n+ if neleca == nelecb and na == nb:\n+ hdiag = hdiag.reshape(na, na)\n+ idx = numpy.arange(na)\n+ addrs = numpy.argpartition(hdiag[idx[:,None]>=idx], nroots-1)[:nroots]\n+ for addr in addrs:\n+ addra = (int)((2*addr+.25)**.5 - .5 + 1e-7)\n+ addrb = addr - addra*(addra+1)//2\n+ x = numpy.zeros((na, na))\n+ x[addra,addrb] = 1\n+ ci0.append(x.ravel().view(FCIvector))\n+ else:\n addrs = numpy.argpartition(hdiag, nroots-1)[:nroots]\n- except AttributeError:\n- addrs = numpy.argsort(hdiag)[:nroots]\n- for addr in addrs:\n- x = numpy.zeros((na*nb))\n- x[addr] = 1\n- ci0.append(x.ravel().view(FCIvector))\n+ for addr in addrs:\n+ x = numpy.zeros((na*nb))\n+ x[addr] = 1\n+ ci0.append(x.view(FCIvector))\n \n # Add noise\n ci0[0][0 ] += 1e-5\n@@ -453,7 +460,7 @@ def get_init_guess(norb, nelec, nroots, hdiag):\n neleca, nelecb = _unpack_nelec(nelec)\n na = cistring.num_strings(norb, neleca)\n nb = cistring.num_strings(norb, nelecb)\n- return _get_init_guess(na, nb, nroots, hdiag)\n+ return _get_init_guess(na, nb, nroots, hdiag, nelec)\n \n \n ###############################################################\ndiff --git a/pyscf/fci/direct_spin1_cyl_sym.py b/pyscf/fci/direct_spin1_cyl_sym.py\nnew file mode 100644\nindex 0000000000..ad0cf5c55f\n--- /dev/null\n+++ b/pyscf/fci/direct_spin1_cyl_sym.py\n@@ -0,0 +1,277 @@\n+#!/usr/bin/env python\n+# Copyright 2014-2021 The PySCF Developers. All Rights Reserved.\n+#\n+# Licensed under the Apache License, Version 2.0 (the \"License\");\n+# you may not use this file except in compliance with the License.\n+# You may obtain a copy of the License at\n+#\n+# http://www.apache.org/licenses/LICENSE-2.0\n+#\n+# Unless required by applicable law or agreed to in writing, software\n+# distributed under the License is distributed on an \"AS IS\" BASIS,\n+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n+# See the License for the specific language governing permissions and\n+# limitations under the License.\n+#\n+# Author: Qiming Sun <osirpt.sun@gmail.com>\n+#\n+\n+'''\n+Cylindrical symmetry\n+\n+This module is much slower than direct_spin1_symm.\n+\n+In this implementation, complex orbitals is used to construct the Hamiltonian.\n+FCI wavefunction (called complex wavefunction here) is solved using the complex\n+Hamiltonian. For 2D irreps, the real part and the imaginary part of the complex\n+FCI wavefunction are identical to the Ex and Ey wavefunction obtained from\n+direct_spin1_symm module. However, any observables from the complex FCI\n+wavefunction should have an indentical one from either Ex or Ey wavefunction\n+of direct_spin1_symm.\n+'''\n+\n+import numpy\n+from pyscf import lib\n+from pyscf import ao2mo\n+from pyscf.lib import logger\n+from pyscf import symm\n+from pyscf.scf.hf_symm import map_degeneracy\n+from pyscf.fci import cistring\n+from pyscf.fci import direct_spin1\n+from pyscf.fci import direct_spin1_symm\n+from pyscf.fci.direct_spin1_symm import (_sv_associated_det,\n+ _strs_angular_momentum,\n+ _cyl_sym_orbital_rotation)\n+from pyscf.fci import direct_nosym\n+from pyscf.fci import addons\n+from pyscf import __config__\n+\n+def get_init_guess(norb, nelec, nroots, hdiag, orbsym, wfnsym=0):\n+ neleca, nelecb = direct_spin1._unpack_nelec(nelec)\n+ strsa = strsb = cistring.gen_strings4orblist(range(norb), neleca)\n+ airreps_d2h = birreps_d2h = direct_spin1_symm._gen_strs_irrep(strsa, orbsym)\n+ a_ls = b_ls = _strs_angular_momentum(strsa, orbsym)\n+ if neleca != nelecb:\n+ strsb = cistring.gen_strings4orblist(range(norb), nelecb)\n+ birreps_d2h = direct_spin1_symm._gen_strs_irrep(strsb, orbsym)\n+ b_ls = _strs_angular_momentum(strsb, orbsym)\n+\n+ wfnsym_in_d2h = wfnsym % 10\n+ wfn_momentum = symm.basis.linearmole_irrep2momentum(wfnsym)\n+ na = len(strsa)\n+ nb = len(strsb)\n+ hdiag = hdiag.reshape(na,nb)\n+ degen = orbsym.degen_mapping\n+ ci0 = []\n+ iroot = 0\n+ wfn_ungerade = wfnsym_in_d2h >= 4\n+ a_ungerade = airreps_d2h >= 4\n+ b_ungerade = birreps_d2h >= 4\n+ sym_allowed = a_ungerade[:,None] == b_ungerade ^ wfn_ungerade\n+ # total angular momentum == wfn_momentum\n+ sym_allowed &= a_ls[:,None] == wfn_momentum - b_ls\n+ if neleca == nelecb and na == nb:\n+ idx = numpy.arange(na)\n+ sym_allowed[idx[:,None] < idx] = False\n+ idx_a, idx_b = numpy.where(sym_allowed)\n+\n+ for k in hdiag[idx_a,idx_b].argsort():\n+ addra, addrb = idx_a[k], idx_b[k]\n+ x = numpy.zeros((na, nb))\n+ x[addra, addrb] = 1.\n+ if wfnsym in (0, 1, 4, 5):\n+ addra1, sign_a = _sv_associated_det(strsa[addra], degen)\n+ addrb1, sign_b = _sv_associated_det(strsb[addrb], degen)\n+ # If (E+) and (E-) are associated determinants\n+ # (E+)(E-') + (E-)(E+') => A1\n+ # (E+)(E-') - (E-)(E+') => A2\n+ if wfnsym in (0, 5): # A1g, A1u\n+ # ensure <|sigma_v|> = 1\n+ x[addra1,addrb1] += sign_a * sign_b\n+ elif wfnsym in (1, 4): # A2g, A2u\n+ # ensure <|sigma_v|> = -1\n+ x[addra1,addrb1] -= sign_a * sign_b\n+\n+ norm = numpy.linalg.norm(x)\n+ if norm < 1e-3:\n+ continue\n+ x *= 1./norm\n+ ci0.append(x.ravel().view(direct_spin1.FCIvector))\n+ iroot += 1\n+ if iroot >= nroots:\n+ break\n+\n+ if len(ci0) == 0:\n+ raise RuntimeError(f'Initial guess for symmetry {wfnsym} not found')\n+ return ci0\n+\n+\n+def _guess_wfnsym(civec, strsa, strsb, orbsym):\n+ degen_mapping = orbsym.degen_mapping\n+ idx = abs(civec).argmax()\n+ na = strsa.size\n+ nb = strsb.size\n+ civec = civec.reshape(na,nb)\n+ addra = idx // nb\n+ addrb = idx % nb\n+ addra1, sign_a = _sv_associated_det(strsa[addra], degen_mapping)\n+ addrb1, sign_b = _sv_associated_det(strsb[addrb], degen_mapping)\n+\n+ airreps_d2h = direct_spin1_symm._gen_strs_irrep(strsa[[addra]], orbsym)\n+ birreps_d2h = direct_spin1_symm._gen_strs_irrep(strsb[[addrb]], orbsym)\n+ a_ls = _strs_angular_momentum(strsa[[addra]], orbsym)\n+ b_ls = _strs_angular_momentum(strsb[[addrb]], orbsym)\n+ a_ungerade = airreps_d2h >= 4\n+ b_ungerade = birreps_d2h >= 4\n+ wfn_ungerade = a_ungerade[0] ^ b_ungerade[0]\n+ wfn_momentum = a_ls[0] + b_ls[0]\n+\n+ if wfn_momentum == 0:\n+ # For A1g and A1u, CI coefficient and its sigma_v associated one have\n+ # the same sign\n+ if sign_a*sign_b * civec[addra,addrb] * civec[addra1,addrb1] > 1e-6: # A1\n+ if wfn_ungerade:\n+ wfnsym = 5\n+ else:\n+ wfnsym = 0\n+ else:\n+ # For A2g and A2u, CI coefficient and its sigma_v associated one\n+ # have opposite signs\n+ if wfn_ungerade:\n+ wfnsym = 4\n+ else:\n+ wfnsym = 1\n+\n+ elif wfn_momentum % 2 == 1:\n+ if wfn_momentum > 0: # Ex\n+ if wfn_ungerade:\n+ wfnsym = 7\n+ else:\n+ wfnsym = 2\n+ else: # Ey\n+ if wfn_ungerade:\n+ wfnsym = 6\n+ else:\n+ wfnsym = 3\n+ else:\n+ if wfn_momentum > 0: # Ex\n+ if wfn_ungerade:\n+ wfnsym = 5\n+ else:\n+ wfnsym = 0\n+ else: # Ey\n+ if wfn_ungerade:\n+ wfnsym = 4\n+ else:\n+ wfnsym = 1\n+\n+ wfnsym += (abs(wfn_momentum) // 2) * 10\n+ return wfnsym\n+\n+def guess_wfnsym(solver, norb, nelec, fcivec=None, orbsym=None, wfnsym=None, **kwargs):\n+ '''\n+ Guess point group symmetry of the FCI wavefunction. If fcivec is\n+ given, the symmetry of fcivec is used. Otherwise the symmetry is\n+ same to the HF determinant.\n+ '''\n+ if orbsym is None:\n+ orbsym = solver.orbsym\n+\n+ verbose = kwargs.get('verbose', None)\n+ log = logger.new_logger(solver, verbose)\n+\n+ neleca, nelecb = nelec = direct_spin1._unpack_nelec(nelec, solver.spin)\n+ if fcivec is None or not hasattr(orbsym, 'degen_mapping'):\n+ # guess wfnsym if initial guess is not given\n+ wfnsym = direct_spin1_symm._id_wfnsym(solver, norb, nelec, orbsym, wfnsym)\n+ log.debug('Guessing CI wfn symmetry = %s', wfnsym)\n+\n+ else:\n+ strsa = strsb = cistring.gen_strings4orblist(range(norb), neleca)\n+ if neleca != nelecb:\n+ strsb = cistring.gen_strings4orblist(range(norb), nelecb)\n+\n+ if not isinstance(fcivec, numpy.ndarray) or fcivec.ndim > 2:\n+ fcivec = fcivec[0]\n+ wfnsym1 = _guess_wfnsym(fcivec, strsa, strsb, orbsym)\n+\n+ if (wfnsym is not None and\n+ wfnsym1 != direct_spin1_symm._id_wfnsym(solver, norb, nelec, orbsym, wfnsym)):\n+ raise RuntimeError(f'Input wfnsym {wfnsym} is not consistent with '\n+ f'fcivec symmetry {wfnsym1}')\n+ wfnsym = wfnsym1\n+ return wfnsym\n+\n+\n+class FCISolver(direct_spin1_symm.FCISolver):\n+\n+ def contract_1e(self, f1e, fcivec, norb, nelec, link_index=None, **kwargs):\n+ return direct_nosym.contract_1e(f1e, fcivec, norb, nelec, link_index)\n+\n+ def contract_2e(self, eri, fcivec, norb, nelec, link_index=None,\n+ orbsym=None, wfnsym=None, **kwargs):\n+ return direct_nosym.contract_2e(eri, fcivec, norb, nelec, link_index)\n+\n+ def get_init_guess(self, norb, nelec, nroots, hdiag):\n+ wfnsym = direct_spin1_symm._id_wfnsym(self, norb, nelec, self.orbsym, self.wfnsym)\n+ return get_init_guess(norb, nelec, nroots, hdiag, self.orbsym, wfnsym)\n+\n+ absorb_h1e = direct_nosym.FCISolver.absorb_h1e\n+ make_hdiag = direct_nosym.FCISolver.make_hdiag\n+ pspace = direct_spin1.FCISolver.pspace\n+ guess_wfnsym = guess_wfnsym\n+\n+ def make_rdm12(self, fcivec, norb, nelec, link_index=None, reorder=True):\n+ nelec = direct_spin1._unpack_nelec(nelec, self.spin)\n+ dm1, dm2 = direct_spin1.make_rdm12(fcivec, norb, nelec, link_index, reorder)\n+ orbsym = self.orbsym\n+ degen_mapping = self.orbsym.degen_mapping\n+ u = _cyl_sym_orbital_rotation(orbsym, degen_mapping)\n+ dm1 = u.conj().T.dot(dm1).dot(u)\n+ dm2 = lib.einsum('pqrs,pi,qj,rk,sl->ijkl', dm2, u.conj(), u, u.conj(), u)\n+ return dm1.real.copy(), dm2.real.copy()\n+\n+ def kernel(self, h1e, eri, norb, nelec, ci0=None,\n+ tol=None, lindep=None, max_cycle=None, max_space=None,\n+ nroots=None, davidson_only=None, pspace_size=None,\n+ orbsym=None, wfnsym=None, ecore=0, **kwargs):\n+ if nroots is None: nroots = self.nroots\n+ if orbsym is None: orbsym = self.orbsym\n+ if wfnsym is None: wfnsym = self.wfnsym\n+ if self.verbose >= logger.WARN:\n+ self.check_sanity()\n+ self.norb = norb\n+ self.nelec = nelec\n+\n+ if not hasattr(orbsym, 'degen_mapping'):\n+ degen_mapping = map_degeneracy(h1e.diagonal(), orbsym)\n+ orbsym = lib.tag_array(orbsym, degen_mapping=degen_mapping)\n+ self.orbsym = orbsym\n+ u = _cyl_sym_orbital_rotation(orbsym, orbsym.degen_mapping)\n+ wfnsym = self.guess_wfnsym(norb, nelec, ci0, orbsym, wfnsym, **kwargs)\n+\n+ h1e = u.dot(h1e).dot(u.conj().T)\n+ eri = ao2mo.restore(1, eri, norb)\n+ eri = lib.einsum('pqrs,ip,jq,kr,ls->ijkl', eri, u, u.conj(), u, u.conj())\n+ assert abs(h1e.imag).max() < 1e-12, 'Cylindrical symmetry broken'\n+ assert abs(eri.imag).max() < 1e-12, 'Cylindrical symmetry broken'\n+ h1e = h1e.real.copy()\n+ # Note: although eri is real, it does not have the permutation relation\n+ # (ij|kl) = (ji|kl) = (ij|lk) = (ji|lk)\n+ # The nosym version fci contraction is required\n+ eri = eri.real.copy()\n+\n+ neleca, nelecb = direct_spin1._unpack_nelec(nelec)\n+ link_indexa = cistring.gen_linkstr_index(range(norb), neleca)\n+ link_indexb = cistring.gen_linkstr_index(range(norb), nelecb)\n+ with lib.temporary_env(self, orbsym=orbsym, wfnsym=wfnsym):\n+ e, c = direct_spin1.kernel_ms1(self, h1e, eri, norb, nelec, ci0,\n+ (link_indexa,link_indexb),\n+ tol, lindep, max_cycle, max_space,\n+ nroots, davidson_only, pspace_size,\n+ ecore=ecore, **kwargs)\n+\n+ self.eci, self.ci = e, c\n+ return e, c\n+\n+FCI = FCISolver\ndiff --git a/pyscf/fci/direct_spin1_symm.py b/pyscf/fci/direct_spin1_symm.py\nindex ff482260c0..cf728a61e7 100644\n--- a/pyscf/fci/direct_spin1_symm.py\n+++ b/pyscf/fci/direct_spin1_symm.py\n@@ -38,6 +38,7 @@\n from pyscf import lib\n from pyscf.lib import logger\n from pyscf import symm\n+from pyscf.scf.hf_symm import map_degeneracy\n from pyscf.fci import cistring\n from pyscf.fci import direct_spin1\n from pyscf.fci import addons\n@@ -93,30 +94,31 @@ def contract_2e(eri, fcivec, norb, nelec, link_index=None, orbsym=None, wfnsym=0\n # aa, ab\n ci0 = []\n ci1 = []\n+ wfnsym_in_d2h = wfnsym % 10\n for ir in range(TOTIRREPS):\n- ma, mb = aidx[ir].size, bidx[wfnsym ^ ir].size\n+ ma, mb = aidx[ir].size, bidx[wfnsym_in_d2h ^ ir].size\n ci0.append(numpy.zeros((ma,mb)))\n ci1.append(numpy.zeros((ma,mb)))\n if ma > 0 and mb > 0:\n- lib.take_2d(fcivec, aidx[ir], bidx[wfnsym ^ ir], out=ci0[ir])\n+ lib.take_2d(fcivec, aidx[ir], bidx[wfnsym_in_d2h ^ ir], out=ci0[ir])\n ci0_ptrs = Tirrep(*[x.ctypes.data_as(ctypes.c_void_p) for x in ci0])\n ci1_ptrs = Tirrep(*[x.ctypes.data_as(ctypes.c_void_p) for x in ci1])\n libfci.FCIcontract_2e_symm1(eri_ptrs, ci0_ptrs, ci1_ptrs,\n ctypes.c_int(norb), nas, nbs,\n ctypes.c_int(nlinka), ctypes.c_int(nlinkb),\n linka_ptr, linkb_ptr, dimirrep,\n- ctypes.c_int(wfnsym))\n+ ctypes.c_int(wfnsym_in_d2h))\n for ir in range(TOTIRREPS):\n if ci0[ir].size > 0:\n- lib.takebak_2d(ci1new, ci1[ir], aidx[ir], bidx[wfnsym ^ ir])\n+ lib.takebak_2d(ci1new, ci1[ir], aidx[ir], bidx[wfnsym_in_d2h ^ ir])\n \n # bb, ba\n ci0T = []\n for ir in range(TOTIRREPS):\n- mb, ma = bidx[ir].size, aidx[wfnsym ^ ir].size\n+ mb, ma = bidx[ir].size, aidx[wfnsym_in_d2h ^ ir].size\n ci0T.append(numpy.zeros((mb,ma)))\n if ma > 0 and mb > 0:\n- lib.transpose(ci0[wfnsym ^ ir], out=ci0T[ir])\n+ lib.transpose(ci0[wfnsym_in_d2h ^ ir], out=ci0T[ir])\n ci0, ci0T = ci0T, None\n ci1 = [numpy.zeros_like(x) for x in ci0]\n ci0_ptrs = Tirrep(*[x.ctypes.data_as(ctypes.c_void_p) for x in ci0])\n@@ -125,10 +127,11 @@ def contract_2e(eri, fcivec, norb, nelec, link_index=None, orbsym=None, wfnsym=0\n ctypes.c_int(norb), nbs, nas,\n ctypes.c_int(nlinkb), ctypes.c_int(nlinka),\n linkb_ptr, linka_ptr, dimirrep,\n- ctypes.c_int(wfnsym))\n+ ctypes.c_int(wfnsym_in_d2h))\n for ir in range(TOTIRREPS):\n if ci0[ir].size > 0:\n- lib.takebak_2d(ci1new, lib.transpose(ci1[ir]), aidx[wfnsym ^ ir], bidx[ir])\n+ lib.takebak_2d(ci1new, lib.transpose(ci1[ir]),\n+ aidx[wfnsym_in_d2h ^ ir], bidx[ir])\n return ci1new.reshape(fcivec_shape).view(direct_spin1.FCIvector)\n \n \n@@ -176,15 +179,20 @@ def energy(h1e, eri, fcivec, norb, nelec, link_index=None, orbsym=None, wfnsym=0\n \n def _id_wfnsym(cisolver, norb, nelec, orbsym, wfnsym):\n '''Guess wfnsym or convert wfnsym to symmetry ID if it's a symmetry label'''\n+ gpname = getattr(cisolver.mol, 'groupname', None)\n if wfnsym is None:\n neleca, nelecb = _unpack_nelec(nelec)\n wfnsym = 0 # Ag, A1 or A\n for i in orbsym[nelecb:neleca]:\n wfnsym ^= i % 10\n+ if gpname in ('Dooh', 'Coov'):\n+ l = 0\n+ for i in orbsym[nelecb:neleca]:\n+ l += symm.basis.linearmole_irrep2momentum(i)\n+ wfnsym += (l//2) * 10\n elif isinstance(wfnsym, str):\n- wfnsym = symm.irrep_name2id(cisolver.mol.groupname, wfnsym)\n- # % 10 to convert irrep_ids to irrep of D2h\n- return wfnsym % 10\n+ wfnsym = symm.irrep_name2id(gpname, wfnsym)\n+ return wfnsym\n \n def _gen_strs_irrep(strs, orbsym):\n # % 10 to convert irrep_ids to irrep of D2h\n@@ -199,28 +207,31 @@ def _gen_strs_irrep(strs, orbsym):\n irreps[numpy.bitwise_and(strs, 1 << i) > 0] ^= ir\n return irreps\n \n-def _get_init_guess(airreps, birreps, nroots, hdiag, orbsym, wfnsym=0):\n+def _get_init_guess(airreps, birreps, nroots, hdiag, nelec, orbsym, wfnsym=0):\n+ neleca, nelecb = _unpack_nelec(nelec)\n na = len(airreps)\n nb = len(birreps)\n+ hdiag = hdiag.reshape(na,nb)\n ci0 = []\n iroot = 0\n- for addr in numpy.argsort(hdiag):\n- x = numpy.zeros((na*nb))\n- addra = addr // nb\n- addrb = addr % nb\n- if airreps[addra] ^ birreps[addrb] == wfnsym:\n- x[addr] = 1\n- ci0.append(x.view(direct_spin1.FCIvector))\n- iroot += 1\n- if iroot >= nroots:\n- break\n- try:\n- # Add noise\n- ci0[0][0 ] += 1e-5\n- ci0[0][-1] -= 1e-5\n- except IndexError:\n- raise IndexError('Configuration of required symmetry (wfnsym=%d) not found' % wfnsym)\n+ sym_allowed = airreps[:,None] == wfnsym ^ birreps\n+ if neleca == nelecb and na == nb:\n+ idx = numpy.arange(na)\n+ sym_allowed[idx[:,None] < idx] = False\n+ idx_a, idx_b = numpy.where(sym_allowed)\n+ for k in hdiag[idx_a,idx_b].argsort():\n+ addra, addrb = idx_a[k], idx_b[k]\n+ x = numpy.zeros((na, nb))\n+ x[addra,addrb] = 1\n+ ci0.append(x.ravel().view(direct_spin1.FCIvector))\n+ iroot += 1\n+ if iroot >= nroots:\n+ break\n+\n+ if len(ci0) == 0:\n+ raise RuntimeError(f'Initial guess for symmetry {wfnsym} not found')\n return ci0\n+\n def get_init_guess(norb, nelec, nroots, hdiag, orbsym, wfnsym=0):\n neleca, nelecb = _unpack_nelec(nelec)\n strsa = cistring.gen_strings4orblist(range(norb), neleca)\n@@ -228,8 +239,155 @@ def get_init_guess(norb, nelec, nroots, hdiag, orbsym, wfnsym=0):\n if neleca != nelecb:\n strsb = cistring.gen_strings4orblist(range(norb), nelecb)\n birreps = _gen_strs_irrep(strsb, orbsym)\n- return _get_init_guess(airreps, birreps, nroots, hdiag, orbsym, wfnsym)\n+ return _get_init_guess(airreps, birreps, nroots, hdiag, nelec, orbsym, wfnsym)\n+\n+def get_init_guess_cyl_sym(norb, nelec, nroots, hdiag, orbsym, wfnsym=0):\n+ neleca, nelecb = _unpack_nelec(nelec)\n+ strsa = strsb = cistring.gen_strings4orblist(range(norb), neleca)\n+ airreps_d2h = birreps_d2h = _gen_strs_irrep(strsa, orbsym)\n+ a_ls = b_ls = _strs_angular_momentum(strsa, orbsym)\n+ if neleca != nelecb:\n+ strsb = cistring.gen_strings4orblist(range(norb), nelecb)\n+ birreps_d2h = _gen_strs_irrep(strsb, orbsym)\n+ b_ls = _strs_angular_momentum(strsb, orbsym)\n+\n+ wfnsym_in_d2h = wfnsym % 10\n+ wfn_momentum = symm.basis.linearmole_irrep2momentum(wfnsym)\n+ na = len(strsa)\n+ nb = len(strsb)\n+ hdiag = hdiag.reshape(na,nb)\n+ degen_mapping = orbsym.degen_mapping\n+ ci0 = []\n+ iroot = 0\n+ wfn_ungerade = wfnsym_in_d2h >= 4\n+ a_ungerade = airreps_d2h >= 4\n+ b_ungerade = birreps_d2h >= 4\n+ sym_allowed = a_ungerade[:,None] == b_ungerade ^ wfn_ungerade\n+ # total angular momentum == wfn_momentum\n+ sym_allowed &= a_ls[:,None] == wfn_momentum - b_ls\n+ if neleca == nelecb and na == nb:\n+ idx = numpy.arange(na)\n+ sym_allowed[idx[:,None] < idx] = False\n+ idx_a, idx_b = numpy.where(sym_allowed)\n+\n+ for k in hdiag[idx_a,idx_b].argsort():\n+ addra, addrb = idx_a[k], idx_b[k]\n+ ca = _cyl_sym_csf2civec(strsa, addra, orbsym, degen_mapping)\n+ cb = _cyl_sym_csf2civec(strsb, addrb, orbsym, degen_mapping)\n+ if wfnsym in (0, 1, 4, 5):\n+ addra1, sign_a = _sv_associated_det(strsa[addra], degen_mapping)\n+ addrb1, sign_b = _sv_associated_det(strsb[addrb], degen_mapping)\n+ if wfnsym in (1, 4) and addra == addra1 and addrb == addrb1:\n+ continue\n+ x = ca[:,None] * cb\n+\n+ # If (E+) and (E-) are associated determinants\n+ # (E+)(E-') + (E-)(E+') => A1\n+ # (E+)(E-') - (E-)(E+') => A2\n+ if addra != addra1:\n+ ca = _cyl_sym_csf2civec(strsa, addra1, orbsym, degen_mapping)\n+ if addrb != addrb1:\n+ cb = _cyl_sym_csf2civec(strsb, addrb1, orbsym, degen_mapping)\n+ if wfnsym in (0, 5): # A1g, A1u\n+ x += sign_a * sign_b * ca[:,None] * cb\n+ #assert (sign_a*sign_b==1 and x.imag==0) or (sign_a*sign_b==-1 and x.real==0)\n+ elif wfnsym in (1, 4): # A2g, A2u\n+ x -= sign_a * sign_b * ca[:,None] * cb\n+ #assert (sign_a*sign_b==1 and x.real==0) or (sign_a*sign_b==-1 and x.imag==0)\n+ if numpy.linalg.norm(x.real) > 1e-6:\n+ x = x.real.copy()\n+ else:\n+ x = x.imag.copy()\n+\n+ elif wfn_momentum > 0:\n+ x = ca.real[:,None] * cb.real\n+ x-= ca.imag[:,None] * cb.imag\n+ else:\n+ x = ca.imag[:,None] * cb.real\n+ x+= ca.real[:,None] * cb.imag\n+\n+ norm = numpy.linalg.norm(x)\n+ if norm < 1e-3:\n+ continue\n+ x *= 1./norm\n+ ci0.append(x.ravel().view(direct_spin1.FCIvector))\n+ iroot += 1\n+ if iroot >= nroots:\n+ break\n+\n+ if len(ci0) == 0:\n+ raise RuntimeError(f'Initial guess for symmetry {wfnsym} not found')\n+ return ci0\n \n+def _cyl_sym_csf2civec(strs, addr, orbsym, degen_mapping):\n+ '''For orbital basis rotation from E(+/-) basis to Ex/Ey basis, mimic the CI\n+ transformation addons.transform_ci(civec, (0, nelec), u)\n+ '''\n+ norb = orbsym.size\n+ one_particle_strs = numpy.asarray([1 << i for i in range(norb)])\n+ occ_masks = (strs[:,None] & one_particle_strs) != 0\n+ na = strs.size\n+ occ_idx_all_strs = numpy.where(occ_masks)[1].reshape(na,-1)\n+\n+ u = _cyl_sym_orbital_rotation(orbsym, degen_mapping)\n+ ui = u[occ_masks[addr]].T.copy()\n+ minors = ui[occ_idx_all_strs]\n+ civec = numpy.linalg.det(minors)\n+ return civec\n+\n+def _cyl_sym_orbital_rotation(orbsym, degen_mapping):\n+ '''Rotation to transform (E+)/(E-) basis to Ex/Ey basis\n+ |Ex/Ey> = |E(+/-)> * u\n+ '''\n+ norb = orbsym.size\n+ u = numpy.zeros((norb, norb), dtype=numpy.complex128)\n+ sqrth = .5**.5\n+ sqrthi = sqrth * 1j\n+ for i, j in enumerate(degen_mapping):\n+ if i == j: # 1d irrep\n+ if orbsym[i] in (1, 4): # A2g, A2u\n+ u[i,i] = 1j\n+ else:\n+ u[i,i] = 1\n+ elif orbsym[i] % 10 in (0, 2, 5, 7): # Ex, E(+)\n+ u[j,j] = sqrthi\n+ u[i,j] = sqrthi\n+ u[j,i] = sqrth\n+ u[i,i] = -sqrth\n+ return u\n+\n+def _sv_associated_det(ci_str, degen_mapping):\n+ '''Associated determinant for the sigma_v operation'''\n+ ci_str1 = 0\n+ nelec = 0\n+ sign = 1\n+ for i, j in enumerate(degen_mapping):\n+ if ci_str & (1 << i) > 0:\n+ if i > j and ci_str & (1 << j) > 0:\n+ # Ex, Ey orbitals swapped\n+ sign = -sign\n+ ci_str1 |= 1 << j\n+ nelec += 1\n+ return cistring.str2addr(degen_mapping.size, nelec, ci_str1), sign\n+\n+def _strs_angular_momentum(strs, orbsym):\n+ # angular momentum for each orbitals\n+ orb_l = (orbsym // 10) * 2\n+ e1_mask = numpy.isin(orbsym % 10, (2, 3, 6, 7))\n+ orb_l[e1_mask] += 1\n+ ey_mask = numpy.isin(orbsym % 10, (1, 3, 4, 6))\n+ orb_l[ey_mask] *= -1\n+\n+ # total angular for each determinant (CSF)\n+ ls = numpy.zeros(len(strs), dtype=int)\n+ if isinstance(strs, cistring.OIndexList):\n+ nocc = strs.shape[1]\n+ for i in range(nocc):\n+ ls += orb_l[strs[:,i]]\n+ else:\n+ for i, l in enumerate(orb_l):\n+ ls[numpy.bitwise_and(strs, 1 << i) > 0] += l\n+ return ls\n \n def reorder_eri(eri, norb, orbsym):\n if orbsym is None:\n@@ -254,7 +412,10 @@ def reorder_eri(eri, norb, orbsym):\n for ir, nnorb in enumerate(dimirrep):\n idx = numpy.asarray(numpy.where(trilirrep == ir)[0], dtype=numpy.int32)\n rank_in_irrep[idx] = numpy.arange(nnorb, dtype=numpy.int32)\n- eri_irs[ir] = lib.take_2d(eri, idx, idx)\n+ eri_ir = lib.take_2d(eri, idx, idx)\n+ # Drop small integrals which may break symmetry?\n+ #eri_ir[abs(eri_ir) < 1e-13] = 0\n+ eri_irs[ir] = eri_ir\n p0 += nnorb\n return eri_irs, rank_in_irrep, old_eri_irrep\n \n@@ -275,6 +436,149 @@ def gen_str_irrep(strs, orbsym, link_index, rank_eri, irrep_eri):\n link_index = [link_index.take(aidx[ir], axis=0) for ir in range(TOTIRREPS)]\n return aidx, link_index\n \n+def _guess_wfnsym_cyl_sym(civec, strsa, strsb, orbsym):\n+ degen_mapping = orbsym.degen_mapping\n+ idx = abs(civec).argmax()\n+ na = strsa.size\n+ nb = strsb.size\n+ addra = idx // nb\n+ addrb = idx % nb\n+ addra1, sign_a = _sv_associated_det(strsa[addra], degen_mapping)\n+ addrb1, sign_b = _sv_associated_det(strsb[addrb], degen_mapping)\n+ addra, addra1 = min(addra,addra1), max(addra,addra1)\n+ addrb, addrb1 = min(addrb,addrb1), max(addrb,addrb1)\n+ ca = ca1 = _cyl_sym_csf2civec(strsa, addra, orbsym, degen_mapping)\n+ cb = cb1 = _cyl_sym_csf2civec(strsb, addrb, orbsym, degen_mapping)\n+ if addra != addra1:\n+ ca1 = _cyl_sym_csf2civec(strsa, addra1, orbsym, degen_mapping)\n+ if addrb != addrb1:\n+ cb1 = _cyl_sym_csf2civec(strsb, addrb1, orbsym, degen_mapping)\n+ ua = numpy.stack([ca, ca1])\n+ ub = numpy.stack([cb, cb1])\n+ # civec is in the Ex/Ey basis. Transform the largest coefficient to\n+ # (E+)/(E-) basis.\n+ c_max = ua.conj().dot(civec.reshape(na,nb)).dot(ub.conj().T)\n+\n+ airreps_d2h = _gen_strs_irrep(strsa[[addra,addra1]], orbsym)\n+ birreps_d2h = _gen_strs_irrep(strsb[[addrb,addrb1]], orbsym)\n+ a_ls = _strs_angular_momentum(strsa[[addra,addra1]], orbsym)\n+ b_ls = _strs_angular_momentum(strsb[[addrb,addrb1]], orbsym)\n+ a_ungerade = airreps_d2h >= 4\n+ b_ungerade = birreps_d2h >= 4\n+ idx = abs(c_max).argmax()\n+ idx_a, idx_b = idx // 2, idx % 2\n+ wfn_ungerade = a_ungerade[idx_a] ^ b_ungerade[idx_b]\n+ wfn_momentum = a_ls[idx_a] + b_ls[idx_b]\n+\n+ if wfn_momentum == 0:\n+ # For A1g and A1u, CI coefficient and its sigma_v associated one have\n+ # the same sign\n+ if (sign_a*sign_b * c_max[0,0].real * c_max[1,1].real > 1e-6 or\n+ sign_a*sign_b * c_max[0,0].imag * c_max[1,1].imag > 1e-6): # A1\n+ if wfn_ungerade:\n+ wfnsym = 5\n+ else:\n+ wfnsym = 0\n+ else:\n+ # For A2g and A2u, CI coefficient and its sigma_v associated one\n+ # have opposite signs\n+ if wfn_ungerade:\n+ wfnsym = 4\n+ else:\n+ wfnsym = 1\n+\n+ elif wfn_momentum % 2 == 1:\n+ if abs(c_max[idx_a,idx_b].real) > 1e-6: # Ex\n+ if wfn_ungerade:\n+ wfnsym = 7\n+ else:\n+ wfnsym = 2\n+ else: # Ey\n+ if wfn_ungerade:\n+ wfnsym = 6\n+ else:\n+ wfnsym = 3\n+ else:\n+ if abs(c_max[idx_a,idx_b].real) > 1e-6: # Ex\n+ if wfn_ungerade:\n+ wfnsym = 5\n+ else:\n+ wfnsym = 0\n+ else: # Ey\n+ if wfn_ungerade:\n+ wfnsym = 4\n+ else:\n+ wfnsym = 1\n+\n+ wfnsym += (abs(wfn_momentum) // 2) * 10\n+ return wfnsym\n+\n+def guess_wfnsym(solver, norb, nelec, fcivec=None, orbsym=None, wfnsym=None, **kwargs):\n+ '''\n+ Guess point group symmetry of the FCI wavefunction. If fcivec is\n+ given, the symmetry of fcivec is used. Otherwise the symmetry is\n+ same to the HF determinant.\n+ '''\n+ if orbsym is None:\n+ orbsym = solver.orbsym\n+\n+ verbose = kwargs.get('verbose', None)\n+ log = logger.new_logger(solver, verbose)\n+ neleca, nelecb = nelec = _unpack_nelec(nelec, solver.spin)\n+\n+ groupname = getattr(solver.mol, 'groupname', None)\n+ if fcivec is None:\n+ # guess wfnsym if initial guess is not given\n+ wfnsym = _id_wfnsym(solver, norb, nelec, orbsym, wfnsym)\n+ log.debug('Guessing CI wfn symmetry = %s', wfnsym)\n+\n+ elif wfnsym is None:\n+ if groupname in ('Dooh', 'Coov'):\n+ strsa = strsb = cistring.gen_strings4orblist(range(norb), neleca)\n+ if neleca != nelecb:\n+ strsb = cistring.gen_strings4orblist(range(norb), nelecb)\n+ if not isinstance(fcivec, numpy.ndarray) or fcivec.ndim > 2:\n+ fcivec = fcivec[0]\n+ wfnsym = _guess_wfnsym_cyl_sym(fcivec, strsa, strsb, orbsym)\n+ else:\n+ wfnsym = addons.guess_wfnsym(fcivec, norb, nelec, orbsym)\n+ log.debug('Guessing CI wfn symmetry = %s', wfnsym)\n+\n+ else:\n+ # verify if the input wfnsym is consistent with the symmetry of fcivec\n+ strsa = strsb = cistring.gen_strings4orblist(range(norb), neleca)\n+ if neleca != nelecb:\n+ strsb = cistring.gen_strings4orblist(range(norb), nelecb)\n+\n+ if groupname in ('Dooh', 'Coov'):\n+ if not isinstance(fcivec, numpy.ndarray) or fcivec.ndim > 2:\n+ fcivec = fcivec[0]\n+ wfnsym1 = _guess_wfnsym_cyl_sym(fcivec, strsa, strsb, orbsym)\n+ if wfnsym1 != _id_wfnsym(solver, norb, nelec, orbsym, wfnsym):\n+ raise RuntimeError(f'Input wfnsym {wfnsym} is not consistent with '\n+ f'fcivec symmetry {wfnsym1}')\n+ wfnsym = wfnsym1\n+ else:\n+ na, nb = strsa.size, strsb.size\n+ orbsym_in_d2h = numpy.asarray(orbsym) % 10\n+ airreps = numpy.zeros(na, dtype=numpy.int32)\n+ birreps = numpy.zeros(nb, dtype=numpy.int32)\n+ for i, ir in enumerate(orbsym_in_d2h):\n+ airreps[numpy.bitwise_and(strsa, 1 << i) > 0] ^= ir\n+ birreps[numpy.bitwise_and(strsb, 1 << i) > 0] ^= ir\n+\n+ wfnsym = _id_wfnsym(solver, norb, nelec, orbsym, wfnsym)\n+ groupname = getattr(solver.mol, 'groupname', None)\n+ mask = airreps[:,None] == (wfnsym % 10) ^ birreps\n+\n+ if isinstance(fcivec, numpy.ndarray) and fcivec.ndim <= 2:\n+ fcivec = [fcivec]\n+ if all(abs(c.reshape(na, nb)[mask]).max() < 1e-5 for c in fcivec):\n+ raise RuntimeError('Input wfnsym {wfnsym} is not consistent with '\n+ 'fcivec coefficients')\n+\n+ return wfnsym\n+\n \n class FCISolver(direct_spin1.FCISolver):\n \n@@ -293,14 +597,16 @@ def dump_flags(self, verbose=None):\n if isinstance(self.wfnsym, str):\n log.info('Input CI wfn symmetry = %s', self.wfnsym)\n elif isinstance(self.wfnsym, (int, numpy.number)):\n- try:\n- log.info('Input CI wfn symmetry = %s',\n- symm.irrep_id2name(self.mol.groupname, self.wfnsym))\n- except KeyError:\n- raise RuntimeError('FCISolver cannot find mwfnsym Id %s in group %s. '\n- 'This might be caused by the projection from '\n- 'high-symmetry group to D2h symmetry.' %\n- (self.wfnsym, self.mol.groupname))\n+ groupname = getattr(self.mol, 'groupname', None)\n+ if groupname is not None:\n+ try:\n+ log.info('Input CI wfn symmetry = %s',\n+ symm.irrep_id2name(groupname, self.wfnsym))\n+ except KeyError:\n+ raise RuntimeError('FCISolver cannot find mwfnsym Id %s in group %s. '\n+ 'This might be caused by the projection from '\n+ 'high-symmetry group to D2h symmetry.' %\n+ (self.wfnsym, groupname))\n else:\n log.info('CI wfn symmetry = %s', self.wfnsym)\n return self\n@@ -331,55 +637,13 @@ def contract_2e(self, eri, fcivec, norb, nelec, link_index=None,\n \n def get_init_guess(self, norb, nelec, nroots, hdiag):\n wfnsym = _id_wfnsym(self, norb, nelec, self.orbsym, self.wfnsym)\n- nelec = _unpack_nelec(nelec, self.spin)\n- return get_init_guess(norb, nelec, nroots, hdiag, self.orbsym, wfnsym)\n-\n- def guess_wfnsym(self, norb, nelec, fcivec=None, orbsym=None, wfnsym=None,\n- **kwargs):\n- '''\n- Guess point group symmetry of the FCI wavefunction. If fcivec is\n- given, the symmetry of fcivec is used. Otherwise the symmetry is\n- based on the HF determinant.\n- '''\n- if orbsym is None:\n- orbsym = self.orbsym\n-\n- verbose = kwargs.get('verbose', None)\n- log = logger.new_logger(self, verbose)\n-\n- nelec = _unpack_nelec(nelec, self.spin)\n- if fcivec is None:\n- # guess wfnsym if initial guess is not given\n- wfnsym = _id_wfnsym(self, norb, nelec, orbsym, wfnsym)\n- log.debug('Guessing CI wfn symmetry = %s', wfnsym)\n-\n- elif wfnsym is None:\n- wfnsym = addons.guess_wfnsym(fcivec, norb, nelec, orbsym)\n- log.debug('Guessing CI wfn symmetry = %s', wfnsym)\n-\n+ if getattr(self.mol, 'groupname', None) in ('Dooh', 'Coov'):\n+ return get_init_guess_cyl_sym(\n+ norb, nelec, nroots, hdiag, self.orbsym, wfnsym)\n else:\n- # verify if the input wfnsym is consistent with the symmetry of fcivec\n- neleca, nelecb = nelec\n- strsa = numpy.asarray(cistring.make_strings(range(norb), neleca))\n- strsb = numpy.asarray(cistring.make_strings(range(norb), nelecb))\n- na, nb = strsa.size, strsb.size\n+ return get_init_guess(norb, nelec, nroots, hdiag, self.orbsym, wfnsym)\n \n- orbsym_in_d2h = numpy.asarray(orbsym) % 10\n- airreps = numpy.zeros(na, dtype=numpy.int32)\n- birreps = numpy.zeros(nb, dtype=numpy.int32)\n- for i, ir in enumerate(orbsym_in_d2h):\n- airreps[numpy.bitwise_and(strsa, 1 << i) > 0] ^= ir\n- birreps[numpy.bitwise_and(strsb, 1 << i) > 0] ^= ir\n-\n- wfnsym = _id_wfnsym(self, norb, nelec, orbsym, wfnsym)\n- mask = (airreps.reshape(-1,1) ^ birreps) == wfnsym\n-\n- if isinstance(fcivec, numpy.ndarray) and fcivec.ndim <= 2:\n- fcivec = [fcivec]\n- if all(abs(c.reshape(na, nb)[mask]).max() < 1e-5 for c in fcivec):\n- raise RuntimeError('Input wfnsym is not consistent with fcivec coefficients')\n-\n- return wfnsym\n+ guess_wfnsym = guess_wfnsym\n \n def kernel(self, h1e, eri, norb, nelec, ci0=None,\n tol=None, lindep=None, max_cycle=None, max_space=None,\n@@ -393,8 +657,22 @@ def kernel(self, h1e, eri, norb, nelec, ci0=None,\n self.norb = norb\n self.nelec = nelec\n \n+ if (not hasattr(orbsym, 'degen_mapping') and\n+ getattr(self.mol, 'groupname', None) in ('Dooh', 'Coov')):\n+ degen_mapping = map_degeneracy(h1e.diagonal(), orbsym)\n+ orbsym = lib.tag_array(orbsym, degen_mapping=degen_mapping)\n+\n wfnsym = self.guess_wfnsym(norb, nelec, ci0, orbsym, wfnsym, **kwargs)\n \n+ if wfnsym > 7:\n+ # Symmetry broken for Dooh and Coov groups is often observed.\n+ # A larger max_space is helpful to reduce the error. Also it is\n+ # hard to converge to high precision.\n+ if max_space is None and self.max_space == FCISolver.max_space:\n+ max_space = 20 + 7 * nroots\n+ if tol is None and self.conv_tol == FCISolver.conv_tol:\n+ tol = 1e-7\n+\n with lib.temporary_env(self, orbsym=orbsym, wfnsym=wfnsym):\n e, c = direct_spin1.kernel_ms1(self, h1e, eri, norb, nelec, ci0, None,\n tol, lindep, max_cycle, max_space,\n@@ -404,71 +682,3 @@ def kernel(self, h1e, eri, norb, nelec, ci0=None,\n return e, c\n \n FCI = FCISolver\n-\n-\n-if __name__ == '__main__':\n- from functools import reduce\n- from pyscf import gto\n- from pyscf import scf\n-\n- mol = gto.Mole()\n- mol.verbose = 0\n- mol.output = None\n- mol.atom = [\n- ['O', ( 0., 0. , 0. )],\n- ['H', ( 0., -0.757, 0.587)],\n- ['H', ( 0., 0.757 , 0.587)],]\n- mol.basis = {'H': 'sto-3g',\n- 'O': 'sto-3g',}\n- mol.symmetry = 1\n- mol.build()\n- m = scf.RHF(mol)\n- ehf = m.scf()\n-\n- norb = m.mo_coeff.shape[1]\n- nelec = mol.nelectron-1\n- h1e = reduce(numpy.dot, (m.mo_coeff.T, scf.hf.get_hcore(mol), m.mo_coeff))\n- eri = ao2mo.incore.full(m._eri, m.mo_coeff)\n- numpy.random.seed(1)\n- na = cistring.num_strings(norb, nelec//2+1)\n- nb = cistring.num_strings(norb, nelec//2)\n- fcivec = numpy.random.random((na,nb))\n-\n- orbsym = symm.label_orb_symm(mol, mol.irrep_id, mol.symm_orb, m.mo_coeff)\n- cis = FCISolver(mol)\n- cis.orbsym = orbsym\n- fcivec = addons.symmetrize_wfn(fcivec, norb, nelec, cis.orbsym, wfnsym=0)\n-\n- ci1 = cis.contract_2e(eri, fcivec, norb, nelec, orbsym=cis.orbsym, wfnsym=0)\n- ci1ref = direct_spin1.contract_2e(eri, fcivec, norb, nelec)\n- print(numpy.allclose(ci1ref, ci1))\n-\n- ci1 = contract_2e(eri, fcivec, norb, nelec, orbsym=orbsym)\n- ci1ref = direct_spin1.contract_2e(eri, fcivec, norb, nelec)\n- print(numpy.allclose(ci1ref, ci1))\n- cis.wfnsym = 3\n- e = cis.kernel(h1e, eri, norb, nelec, ecore=m.energy_nuc(), davidson_only=True)[0]\n- print(e, e - -74.695029029452357)\n-\n- mol.atom = [['H', (0, 0, i)] for i in range(8)]\n- mol.basis = {'H': 'sto-3g'}\n- mol.symmetry = True\n- mol.build()\n- m = scf.RHF(mol)\n- ehf = m.scf()\n-\n- norb = m.mo_coeff.shape[1]\n- nelec = mol.nelectron + 1\n- eri = ao2mo.incore.full(m._eri, m.mo_coeff)\n- na = cistring.num_strings(norb, nelec//2+1)\n- nb = cistring.num_strings(norb, nelec//2)\n- fcivec = numpy.random.random((na,nb))\n- orbsym = symm.label_orb_symm(mol, mol.irrep_id, mol.symm_orb, m.mo_coeff)\n- orbsym = orbsym % 10\n- fcivec = addons.symmetrize_wfn(fcivec, norb, nelec, orbsym, wfnsym=5)\n- cis = FCISolver(mol)\n- cis.orbsym = orbsym\n- cis.wfnsym = 5\n- ci1 = cis.contract_2e(eri, fcivec, norb, nelec)\n- ci1ref = direct_spin1.contract_2e(eri, fcivec, norb, nelec)\n- print(numpy.allclose(ci1ref, ci1))\ndiff --git a/pyscf/fci/selected_ci.py b/pyscf/fci/selected_ci.py\nindex 360fbd78ab..c31d3e46cd 100644\n--- a/pyscf/fci/selected_ci.py\n+++ b/pyscf/fci/selected_ci.py\n@@ -762,7 +762,7 @@ def get_init_guess(self, ci_strs, norb, nelec, nroots, hdiag):\n '''\n na = len(ci_strs[0])\n nb = len(ci_strs[1])\n- ci0 = direct_spin1._get_init_guess(na, nb, nroots, hdiag)\n+ ci0 = direct_spin1._get_init_guess(na, nb, nroots, hdiag, nelec)\n return [_as_SCIvector(x, ci_strs) for x in ci0]\n \n def make_hdiag(self, h1e, eri, ci_strs, norb, nelec):\ndiff --git a/pyscf/fci/selected_ci_symm.py b/pyscf/fci/selected_ci_symm.py\nindex 8dc23f16d9..0ee292b39a 100644\n--- a/pyscf/fci/selected_ci_symm.py\n+++ b/pyscf/fci/selected_ci_symm.py\n@@ -159,8 +159,8 @@ def get_init_guess(self, ci_strs, norb, nelec, nroots, hdiag):\n self.wfnsym)\n airreps = direct_spin1_symm._gen_strs_irrep(ci_strs[0], self.orbsym)\n birreps = direct_spin1_symm._gen_strs_irrep(ci_strs[1], self.orbsym)\n- ci0 = direct_spin1_symm._get_init_guess(airreps, birreps,\n- nroots, hdiag, self.orbsym, wfnsym)\n+ ci0 = direct_spin1_symm._get_init_guess(\n+ airreps, birreps, nroots, hdiag, nelec, self.orbsym, wfnsym)\n return [selected_ci._as_SCIvector(x, ci_strs) for x in ci0]\n \n def guess_wfnsym(self, norb, nelec, fcivec=None, orbsym=None, wfnsym=None,\n@@ -215,6 +215,9 @@ def kernel(self, h1e, eri, norb, nelec, ci0=None,\n if self.verbose >= logger.WARN:\n self.check_sanity()\n \n+ if getattr(self.mol, 'groupname', None) in ('Dooh', 'Coov'):\n+ raise NotImplementedError\n+\n with lib.temporary_env(self, orbsym=orbsym, wfnsym=wfnsym):\n e, c = selected_ci.kernel_float_space(self, h1e, eri, norb, nelec, ci0,\n tol, lindep, max_cycle, max_space,\ndiff --git a/pyscf/gto/mole.py b/pyscf/gto/mole.py\nindex a65c0aca77..b2d38ad1df 100644\n--- a/pyscf/gto/mole.py\n+++ b/pyscf/gto/mole.py\n@@ -259,6 +259,22 @@ def sph2spinor_l(l):\n '''Real spherical to spinor transformation matrix for angular moment l'''\n return sph2spinor_kappa(0, l)\n \n+def ao_rotation_matrix(mol, orientation):\n+ '''Matrix u to rotate AO basis to a new orientation.\n+\n+ atom_new_coords = mol.atom_coords().dot(orientation.T)\n+ new_AO = u * mol.AO\n+ new_orbitals_coef = u.dot(orbitals_coef)\n+ '''\n+ from pyscf.symm.basis import _momentum_rotation_matrices\n+ Ds = _momentum_rotation_matrices(mol, orientation)\n+ u = []\n+ for i in range(mol.nbas):\n+ l = mol.bas_angular(i)\n+ nc = mol.bas_nctr(i)\n+ u.extend([Ds[l]] * nc)\n+ return scipy.linalg.block_diag(*u)\n+\n def atom_types(atoms, basis=None, magmom=None):\n '''symmetry inequivalent atoms'''\n atmgroup = {}\n@@ -3580,6 +3596,8 @@ def search_shell_id(self, atm_id, l):\n \n __add__ = conc_mol\n \n+ ao_rotation_matrix = ao_rotation_matrix\n+\n def cart2sph_coeff(self, normalized='sp'):\n '''Transformation matrix that transforms Cartesian GTOs to spherical\n GTOs for all basis functions\ndiff --git a/pyscf/lib/linalg_helper.py b/pyscf/lib/linalg_helper.py\nindex ceb9d1b4eb..8b4c1bacc6 100644\n--- a/pyscf/lib/linalg_helper.py\n+++ b/pyscf/lib/linalg_helper.py\n@@ -425,10 +425,13 @@ def davidson1(aop, x0, precond, tol=1e-12, max_cycle=50, max_space=12,\n log.warn('Check to see if `pick` function %s is providing '\n 'linear dependent vectors', pick.__name__)\n if len(xt) == 0:\n- msg = ('No more linearly independent basis were found. '\n- 'Unless loosen the lindep tolerance (current value '\n- f'{lindep}), the diagonalization solver is not able '\n- 'to find eigenvectors.')\n+ if icyc == 0:\n+ msg = 'Initial guess is empty or zero'\n+ else:\n+ msg = ('No more linearly independent basis were found. '\n+ 'Unless loosen the lindep tolerance (current value '\n+ f'{lindep}), the diagonalization solver is not able '\n+ 'to find eigenvectors.')\n raise LinearDependenceError(msg)\n x0 = None\n max_dx_last = 1e9\ndiff --git a/pyscf/mcscf/addons.py b/pyscf/mcscf/addons.py\nindex c524aa58aa..d696ad4686 100644\n--- a/pyscf/mcscf/addons.py\n+++ b/pyscf/mcscf/addons.py\n@@ -1321,10 +1321,10 @@ def approx_kernel(self, h1, h2, norb, nelec, ci0=None, **kwargs):\n cs = []\n for ix, (solver, my_args, my_kwargs) in enumerate (self._loop_solver(_state_args (ci0))):\n c0 = my_args[0]\n- try:\n+ if hasattr(solver, 'approx_kernel'):\n e, c = solver.approx_kernel(h1, h2, norb, self._get_nelec(solver, nelec), ci0=c0,\n orbsym=self.orbsym, **kwargs)\n- except AttributeError:\n+ else:\n e, c = solver.kernel(h1, h2, norb, self._get_nelec(solver, nelec), ci0=c0,\n orbsym=self.orbsym, **kwargs)\n if solver.nroots == 1:\ndiff --git a/pyscf/mcscf/casci_symm.py b/pyscf/mcscf/casci_symm.py\nindex a6fc4d6d76..e1d61e0b79 100644\n--- a/pyscf/mcscf/casci_symm.py\n+++ b/pyscf/mcscf/casci_symm.py\n@@ -107,39 +107,41 @@ def label_symmetry_(mc, mo_coeff, ci0=None):\n \n active_orbsym = getattr(mc.fcisolver, 'orbsym', [])\n if (not getattr(active_orbsym, '__len__', None)) or len(active_orbsym) == 0:\n- mc.fcisolver.orbsym = orbsym[ncore:nocc]\n+ if getattr(mo_coeff, 'degen_mapping', None) is not None:\n+ degen_mapping = mo_coeff.degen_mapping[ncore:nocc] - ncore\n+ # Attach to degen_mapping to orbsym, this is a temporary solution\n+ # for fci.direct_spin1_symm\n+ mc.fcisolver.orbsym = lib.tag_array(\n+ orbsym[ncore:nocc], degen_mapping=degen_mapping)\n+ else:\n+ mc.fcisolver.orbsym = orbsym[ncore:nocc]\n log.info('Symmetries of active orbitals: %s',\n- ' '.join([symm.irrep_id2name(mc.mol.groupname, irrep) for irrep in mc.fcisolver.orbsym]))\n+ ' '.join([symm.irrep_id2name(mc.mol.groupname, irrep)\n+ for irrep in mc.fcisolver.orbsym]))\n \n- wfnsym = 0\n- if getattr(mc.fcisolver, 'wfnsym', None) is not None:\n- wfnsym = mc.fcisolver.wfnsym\n+ wfnsym = getattr(mc.fcisolver, 'wfnsym', None)\n+ if wfnsym is not None:\n log.debug('Use fcisolver.wfnsym %s', wfnsym)\n \n elif (ci0 is None and\n- # mc._scf may not be initialized\n- mc._scf.mo_coeff is not None):\n+ # mc._scf may not be initialized\n+ mc._scf.mo_coeff is not None):\n # Guess wfnsym based on HF determinant. mo_coeff may not be HF\n # canonical orbitals. Some checks are needed to ensure that mo_coeff\n # are derived from the symmetry adapted SCF calculations.\n if mo_coeff is mc._scf.mo_coeff:\n- wfnsym = 0\n- orbsym_in_d2h = numpy.asarray(orbsym) % 10 # convert to D2h irreps\n- for ir in orbsym_in_d2h[mc._scf.mo_occ == 1]:\n- wfnsym ^= ir\n- mc.fcisolver.wfnsym = wfnsym\n+ mc.fcisolver.wfnsym = wfnsym = mc._scf.get_wfnsym()\n log.debug('Set CASCI wfnsym %s based on HF determinant', wfnsym)\n \n- elif getattr(mo_coeff, 'orbsym', None) is not None: # It may be reordered SCF orbitals\n+ else:\n cas_orb = mo_coeff[:,ncore:nocc]\n- s = reduce(numpy.dot, (cas_orb.conj().T, mc._scf.get_ovlp(), mc._scf.mo_coeff))\n- if numpy.all(numpy.max(s, axis=1) > 1-1e-9):\n- idx = numpy.argmax(s, axis=1)\n- cas_orbsym_in_d2h = numpy.asarray(orbsym[ncore:nocc]) % 10\n+ # check if cas_orb are SCF orbitals reordered\n+ s1 = reduce(numpy.dot, (cas_orb.conj().T, s, mc._scf.mo_coeff))\n+ if numpy.all(numpy.max(s1, axis=1) > 1-1e-9):\n+ idx = numpy.argmax(s1, axis=1)\n+ cas_orbsym = orbsym[ncore:nocc]\n cas_occ = mc._scf.mo_occ[idx]\n- wfnsym = 0\n- for ir in cas_orbsym_in_d2h[cas_occ == 1]:\n- wfnsym ^= ir\n+ wfnsym = mc._scf.get_wfnsym(mo_occ=cas_occ, orbsym=cas_orbsym)\n mc.fcisolver.wfnsym = wfnsym\n log.debug('Active space are constructed from canonical SCF '\n 'orbitals %s', idx)\n@@ -156,8 +158,8 @@ def label_symmetry_(mc, mo_coeff, ci0=None):\n log.warn('mwfnsym Id %s not found in group %s. This might be caused by '\n 'the projection from high-symmetry group to D2h symmetry.',\n wfnsym, mc.mol.groupname)\n-\n- log.info('Active space CI wfn symmetry = %s', wfnsym)\n+ if wfnsym is not None:\n+ log.info('Active space CI wfn symmetry = %s', wfnsym)\n \n return mo_coeff_with_orbsym\n \ndiff --git a/pyscf/mcscf/mc1step.py b/pyscf/mcscf/mc1step.py\nindex 77932305eb..561754386a 100644\n--- a/pyscf/mcscf/mc1step.py\n+++ b/pyscf/mcscf/mc1step.py\n@@ -1100,20 +1100,8 @@ def solve_approx_ci(self, h1, h2, ci0, ecore, e_cas, envs):\n \n h2eff = self.fcisolver.absorb_h1e(h1, h2, ncas, nelecas, .5)\n \n- # Be careful with the symmetry adapted contract_2e function. When the\n- # symmetry adapted FCI solver is used, the symmetry of ci0 may be\n- # different to fcisolver.wfnsym. This function may output 0.\n- if getattr(self.fcisolver, 'guess_wfnsym', None):\n- wfnsym = self.fcisolver.guess_wfnsym(self.ncas, self.nelecas, ci0)\n- else:\n- wfnsym = None\n-\n def contract_2e(c):\n- if wfnsym is None:\n- hc = self.fcisolver.contract_2e(h2eff, c, ncas, nelecas)\n- else:\n- with lib.temporary_env(self.fcisolver, wfnsym=wfnsym):\n- hc = self.fcisolver.contract_2e(h2eff, c, ncas, nelecas)\n+ hc = self.fcisolver.contract_2e(h2eff, c, ncas, nelecas)\n return hc.ravel()\n \n hc = contract_2e(ci0)\ndiff --git a/pyscf/scf/hf_symm.py b/pyscf/scf/hf_symm.py\nindex 6b272c32ea..9c72b00239 100644\n--- a/pyscf/scf/hf_symm.py\n+++ b/pyscf/scf/hf_symm.py\n@@ -36,6 +36,7 @@\n from pyscf.scf import uhf\n from pyscf.scf import rohf\n from pyscf.scf import chkfile\n+from pyscf.lib.exceptions import PointGroupSymmetryError\n from pyscf import __config__\n \n WITH_META_LOWDIN = getattr(__config__, 'scf_analyze_with_meta_lowdin', True)\n@@ -311,11 +312,30 @@ def eig(mf, h, s):\n cs = []\n es = []\n orbsym = []\n- for ir in range(nirrep):\n- e, c = mf._eigh(h[ir], s[ir])\n- cs.append(c)\n- es.append(e)\n- orbsym.append([mol.irrep_id[ir]] * e.size)\n+ if mol.groupname in ('Dooh', 'Coov'):\n+ for ir in range(nirrep):\n+ irrep_id = mol.irrep_id[ir]\n+ irrep_1d = irrep_id in (0, 1, 4, 5)\n+ irrep_2dx = irrep_id % 2 == 0\n+ if irrep_1d or irrep_2dx:\n+ e, c = mf._eigh(h[ir], s[ir])\n+ cs.append(c)\n+ es.append(e)\n+ orbsym.append([mol.irrep_id[ir]] * e.size)\n+\n+ if not irrep_1d and irrep_2dx:\n+ # force 2D irreps using the same coefficients\n+ irrep_conj = irrep_id ^ 1\n+ assert mol.irrep_id[ir+1] == irrep_conj\n+ cs.append(c)\n+ es.append(e)\n+ orbsym.append([irrep_conj] * e.size)\n+ else:\n+ for ir in range(nirrep):\n+ e, c = mf._eigh(h[ir], s[ir])\n+ cs.append(c)\n+ es.append(e)\n+ orbsym.append([mol.irrep_id[ir]] * e.size)\n e = numpy.hstack(es)\n c = so2ao_mo_coeff(mol.symm_orb, cs)\n c = lib.tag_array(c, orbsym=numpy.hstack(orbsym))\n@@ -330,22 +350,63 @@ def get_orbsym(mol, mo_coeff, s=None, check=False):\n else:\n orbsym = symm.label_orb_symm(mol, mol.irrep_id, mol.symm_orb,\n mo_coeff, s, check)\n- return numpy.asarray(orbsym)\n+ return orbsym\n+\n+def map_degeneracy(mo_energy, orbsym):\n+ '''Find degeneracy correspondence for cylindrical symmetry'''\n+ norb = orbsym.size\n+ ex_mask = numpy.isin(orbsym % 10, (0, 2, 5, 7))\n+\n+ degen_mapping = numpy.arange(norb)\n+ for ir_ex in set(orbsym[ex_mask]):\n+ if ir_ex in (0, 1, 5, 4):\n+ continue\n \n-def get_wfnsym(mf, mo_coeff=None, mo_occ=None):\n- orbsym = mf.get_orbsym(mo_coeff)\n- if mf.mol.groupname in ('SO3', 'Dooh', 'Coov'):\n+ if ir_ex % 2 == 0:\n+ ir_ey = ir_ex + 1\n+ else:\n+ ir_ey = ir_ex - 1\n+ ex_idx = numpy.where(orbsym == ir_ex)[0]\n+ ey_idx = numpy.where(orbsym == ir_ey)[0]\n+ if ex_idx.size != ey_idx.size:\n+ raise PointGroupSymmetryError('Degenerated orbitals required')\n+ mo_ex = mo_energy[ex_idx].round(7)\n+ mo_ey = mo_energy[ey_idx].round(7)\n+ mapping = numpy.where(abs(mo_ex[:,None] - mo_ey) < 1e-6)[1]\n+ if mapping.size != ex_idx.size:\n+ raise PointGroupSymmetryError('Degenerated orbitals required')\n+ degen_mapping[ex_idx] = ey_idx[mapping]\n+ degen_mapping[ey_idx] = ex_idx[mapping.argsort()]\n+\n+ return degen_mapping\n+\n+def get_wfnsym(mf, mo_coeff=None, mo_occ=None, orbsym=None):\n+ if mo_occ is None:\n+ mo_occ = mf.mo_occ\n+ if orbsym is None:\n+ orbsym = mf.get_orbsym(mo_coeff)\n+\n+ if mf.mol.groupname == 'SO3':\n if numpy.any(orbsym > 7):\n logger.warn(mf, 'Wave-function symmetry for %s not supported. '\n 'Wfn symmetry is mapped to D2h/C2v group.',\n mf.mol.groupname)\n- orbsym = orbsym % 10\n \n- if mo_occ is None:\n- mo_occ = mf.mo_occ\n wfnsym = 0\n- for ir in orbsym[mo_occ == 1]:\n+ for ir in orbsym[mo_occ == 1] % 10:\n wfnsym ^= ir\n+\n+ if mf.mol.groupname in ('Dooh', 'Coov'):\n+ orb_l = (orbsym // 10) * 2\n+ e1_mask = numpy.isin(orbsym % 10, (2, 3, 6, 7))\n+ orb_l[e1_mask] += 1\n+ ey_mask = numpy.isin(orbsym % 10, (1, 3, 4, 6))\n+ orb_l[ey_mask] *= -1\n+ a_l = orb_l[mo_occ != 0]\n+ b_l = orb_l[mo_occ == 2]\n+ wfn_momentum = a_l.sum() + b_l.sum()\n+ wfnsym += (abs(wfn_momentum) // 2) * 10\n+\n return wfnsym\n \n \n@@ -461,9 +522,20 @@ def _finalize(self):\n idx = numpy.hstack((idx[self.mo_occ> 0][o_sort],\n idx[self.mo_occ==0][v_sort]))\n self.mo_energy = self.mo_energy[idx]\n- orbsym = self.get_orbsym(self.mo_coeff, self.get_ovlp())\n- self.mo_coeff = lib.tag_array(self.mo_coeff[:,idx], orbsym=orbsym[idx])\n self.mo_occ = self.mo_occ[idx]\n+ orbsym = self.get_orbsym(self.mo_coeff, self.get_ovlp())\n+ orbsym = orbsym[idx]\n+ degen_mapping = None\n+ if self.mol.groupname in ('Dooh', 'Coov'):\n+ try:\n+ degen_mapping = map_degeneracy(self.mo_energy, orbsym)\n+ except PointGroupSymmetryError:\n+ logger.warn(self, 'Orbital degeneracy broken')\n+ if degen_mapping is None:\n+ self.mo_coeff = lib.tag_array(self.mo_coeff[:,idx], orbsym=orbsym)\n+ else:\n+ self.mo_coeff = lib.tag_array(\n+ self.mo_coeff[:,idx], orbsym=orbsym, degen_mapping=degen_mapping)\n if self.chkfile:\n chkfile.dump_scf(self.mol, self.chkfile, self.e_tot, self.mo_energy,\n self.mo_coeff, self.mo_occ, overwrite_mol=False)\n@@ -583,7 +655,7 @@ def get_grad(self, mo_coeff, mo_occ, fock=None):\n def get_occ(self, mo_energy=None, mo_coeff=None):\n if mo_energy is None: mo_energy = self.mo_energy\n mol = self.mol\n- if not self.mol.symmetry:\n+ if not mol.symmetry:\n return rohf.ROHF.get_occ(self, mo_energy, mo_coeff)\n \n if getattr(mo_energy, 'mo_ea', None) is not None:\n@@ -712,9 +784,20 @@ def _finalize(self):\n mo_ea=mo_ea, mo_eb=mo_eb)\n else:\n self.mo_energy = self.mo_energy[idx]\n- orbsym = self.get_orbsym(self.mo_coeff, self.get_ovlp())\n- self.mo_coeff = lib.tag_array(self.mo_coeff[:,idx], orbsym=orbsym[idx])\n self.mo_occ = self.mo_occ[idx]\n+ orbsym = self.get_orbsym(self.mo_coeff, self.get_ovlp())\n+ orbsym = orbsym[idx]\n+ degen_mapping = None\n+ if self.mol.groupname in ('Dooh', 'Coov'):\n+ try:\n+ degen_mapping = map_degeneracy(self.mo_energy, orbsym)\n+ except PointGroupSymmetryError:\n+ logger.warn(self, 'Orbital degeneracy broken')\n+ if degen_mapping is None:\n+ self.mo_coeff = lib.tag_array(self.mo_coeff[:,idx], orbsym=orbsym)\n+ else:\n+ self.mo_coeff = lib.tag_array(\n+ self.mo_coeff[:,idx], orbsym=orbsym, degen_mapping=degen_mapping)\n if self.chkfile:\n chkfile.dump_scf(self.mol, self.chkfile, self.e_tot, self.mo_energy,\n self.mo_coeff, self.mo_occ, overwrite_mol=False)\n@@ -883,23 +966,3 @@ class HF1e(ROHF):\n \n \n del (WITH_META_LOWDIN)\n-\n-\n-if __name__ == '__main__':\n- from pyscf import gto\n- mol = gto.Mole()\n- mol.build(\n- verbose = 1,\n- output = None,\n- atom = [['H', (0.,0.,0.)],\n- ['H', (0.,0.,1.)], ],\n- basis = {'H': 'ccpvdz'},\n- symmetry = True\n- )\n-\n- method = RHF(mol)\n- method.verbose = 5\n- method.irrep_nelec['A1u'] = 2\n- energy = method.kernel()\n- print(energy)\n- method.analyze()\ndiff --git a/pyscf/scf/uhf_symm.py b/pyscf/scf/uhf_symm.py\nindex 8a22c9bd9d..447457d371 100644\n--- a/pyscf/scf/uhf_symm.py\n+++ b/pyscf/scf/uhf_symm.py\n@@ -29,6 +29,7 @@\n from pyscf.scf import hf_symm\n from pyscf.scf import uhf\n from pyscf.scf import chkfile\n+from pyscf.lib.exceptions import PointGroupSymmetryError\n from pyscf import __config__\n \n WITH_META_LOWDIN = getattr(__config__, 'scf_analyze_with_meta_lowdin', True)\n@@ -256,23 +257,35 @@ def get_orbsym(mol, mo_coeff, s=None, check=False):\n hf_symm.get_orbsym(mol, mo_coeff[1], s, check))\n return orbsym\n \n-def get_wfnsym(mf, mo_coeff=None, mo_occ=None):\n- orbsyma, orbsymb = mf.get_orbsym(mo_coeff)\n- if mf.mol.groupname in ('SO3', 'Dooh', 'Coov'):\n+def get_wfnsym(mf, mo_coeff=None, mo_occ=None, orbsym=None):\n+ if mo_occ is None:\n+ mo_occ = mf.mo_occ\n+ if orbsym is None:\n+ orbsym = mf.get_orbsym(mo_coeff)\n+ orbsyma, orbsymb = orbsym\n+\n+ if mf.mol.groupname == 'SO3':\n if numpy.any(orbsyma > 7):\n logger.warn(mf, 'Wave-function symmetry for %s not supported. '\n 'Wfn symmetry is mapped to D2h/C2v group.',\n mf.mol.groupname)\n- orbsyma = orbsyma % 10\n- orbsymb = orbsymb % 10\n \n- if mo_occ is None:\n- mo_occ = mf.mo_occ\n wfnsym = 0\n- for ir in orbsyma[mo_occ[0] == 1]:\n+ for ir in orbsyma[mo_occ[0] == 1] % 10:\n wfnsym ^= ir\n- for ir in orbsymb[mo_occ[1] == 1]:\n+ for ir in orbsymb[mo_occ[1] == 1] % 10:\n wfnsym ^= ir\n+\n+ if mf.mol.groupname in ('Dooh', 'Coov'):\n+ a_l = (orbsyma // 10) * 2\n+ a_l[numpy.isin(orbsyma % 10, (2, 3, 6, 7))] += 1\n+ a_l[numpy.isin(orbsyma % 10, (1, 3, 4, 6))] *= -1\n+ b_l = (orbsymb // 10) * 2\n+ b_l[numpy.isin(orbsymb % 10, (2, 3, 6, 7))] += 1\n+ b_l[numpy.isin(orbsymb % 10, (1, 3, 4, 6))] *= -1\n+ wfn_momentum = a_l[mo_occ[0]==1].sum() + b_l[mo_occ[1]==1].sum()\n+ wfnsym += (abs(wfn_momentum) // 2) * 10\n+\n return wfnsym\n \n \n@@ -325,30 +338,55 @@ def eig(self, h, s):\n nirrep = mol.symm_orb.__len__()\n s = symm.symmetrize_matrix(s, mol.symm_orb)\n ha = symm.symmetrize_matrix(h[0], mol.symm_orb)\n- cs = []\n- es = []\n- orbsym = []\n- for ir in range(nirrep):\n- e, c = self._eigh(ha[ir], s[ir])\n- cs.append(c)\n- es.append(e)\n- orbsym.append([mol.irrep_id[ir]] * e.size)\n- ea = numpy.hstack(es)\n- ca = hf_symm.so2ao_mo_coeff(mol.symm_orb, cs)\n- ca = lib.tag_array(ca, orbsym=numpy.hstack(orbsym))\n-\n hb = symm.symmetrize_matrix(h[1], mol.symm_orb)\n- cs = []\n- es = []\n- orbsym = []\n- for ir in range(nirrep):\n- e, c = self._eigh(hb[ir], s[ir])\n- cs.append(c)\n- es.append(e)\n- orbsym.append([mol.irrep_id[ir]] * e.size)\n- eb = numpy.hstack(es)\n- cb = hf_symm.so2ao_mo_coeff(mol.symm_orb, cs)\n- cb = lib.tag_array(cb, orbsym=numpy.hstack(orbsym))\n+ cs_b = []\n+ cs_a = []\n+ es_b = []\n+ es_a = []\n+ orbsym_a = []\n+ orbsym_b = []\n+ if mol.groupname in ('Dooh', 'Coov'):\n+ for ir in range(nirrep):\n+ irrep_id = mol.irrep_id[ir]\n+ irrep_1d = irrep_id in (0, 1, 4, 5)\n+ irrep_2dx = irrep_id % 2 == 0\n+ if irrep_1d or irrep_2dx:\n+ ea, ca = self._eigh(ha[ir], s[ir])\n+ eb, cb = self._eigh(hb[ir], s[ir])\n+ cs_a.append(ca)\n+ cs_b.append(cb)\n+ es_a.append(ea)\n+ es_b.append(eb)\n+ orbsym_a.append([mol.irrep_id[ir]] * ea.size)\n+ orbsym_b.append([mol.irrep_id[ir]] * eb.size)\n+\n+ if not irrep_1d and irrep_2dx:\n+ # force 2D irreps using the same coefficients\n+ irrep_conj = irrep_id ^ 1\n+ assert mol.irrep_id[ir+1] == irrep_conj\n+ cs_a.append(ca)\n+ cs_b.append(cb)\n+ es_a.append(ea)\n+ es_b.append(eb)\n+ orbsym_a.append([irrep_conj] * ea.size)\n+ orbsym_b.append([irrep_conj] * eb.size)\n+ else:\n+ for ir in range(nirrep):\n+ ea, ca = self._eigh(ha[ir], s[ir])\n+ eb, cb = self._eigh(hb[ir], s[ir])\n+ cs_a.append(ca)\n+ cs_b.append(cb)\n+ es_a.append(ea)\n+ es_b.append(eb)\n+ orbsym_a.append([mol.irrep_id[ir]] * ea.size)\n+ orbsym_b.append([mol.irrep_id[ir]] * eb.size)\n+\n+ ea = numpy.hstack(es_a)\n+ eb = numpy.hstack(es_b)\n+ ca = hf_symm.so2ao_mo_coeff(mol.symm_orb, cs_a)\n+ ca = lib.tag_array(ca, orbsym=numpy.hstack(orbsym_a))\n+ cb = hf_symm.so2ao_mo_coeff(mol.symm_orb, cs_b)\n+ cb = lib.tag_array(cb, orbsym=numpy.hstack(orbsym_b))\n return numpy.asarray((ea,eb)), (ca,cb)\n \n def get_grad(self, mo_coeff, mo_occ, fock=None):\n@@ -479,8 +517,24 @@ def _finalize(self):\n idxb[self.mo_occ[1]==0][vb_sort]))\n self.mo_energy = (ea[idxa], eb[idxb])\n orbsyma, orbsymb = self.get_orbsym(self.mo_coeff, self.get_ovlp())\n- self.mo_coeff = (lib.tag_array(self.mo_coeff[0][:,idxa], orbsym=orbsyma[idxa]),\n- lib.tag_array(self.mo_coeff[1][:,idxb], orbsym=orbsymb[idxb]))\n+ orbsyma = orbsyma[idxa]\n+ orbsymb = orbsymb[idxb]\n+ degen_a = degen_b = None\n+ if self.mol.groupname in ('Dooh', 'Coov'):\n+ try:\n+ degen_a = hf_symm.map_degeneracy(self.mo_energy[0], orbsyma)\n+ degen_b = hf_symm.map_degeneracy(self.mo_energy[1], orbsymb)\n+ except PointGroupSymmetryError:\n+ logger.warn(self, 'Orbital degeneracy broken')\n+ if degen_a is None or degen_b is None:\n+ mo_a = lib.tag_array(self.mo_coeff[0][:,idxa], orbsym=orbsyma)\n+ mo_b = lib.tag_array(self.mo_coeff[1][:,idxb], orbsym=orbsymb)\n+ else:\n+ mo_a = lib.tag_array(self.mo_coeff[0][:,idxa], orbsym=orbsyma,\n+ degen_mapping=degen_a)\n+ mo_b = lib.tag_array(self.mo_coeff[1][:,idxb], orbsym=orbsymb,\n+ degen_mapping=degen_b)\n+ self.mo_coeff = (mo_a, mo_b)\n self.mo_occ = (self.mo_occ[0][idxa], self.mo_occ[1][idxb])\n if self.chkfile:\n chkfile.dump_scf(self.mol, self.chkfile, self.e_tot, self.mo_energy,\n@@ -522,25 +576,3 @@ class HF1e(UHF):\n \n \n del (WITH_META_LOWDIN)\n-\n-\n-if __name__ == '__main__':\n- from pyscf import gto\n- mol = gto.Mole()\n- mol.build(\n- verbose = 1,\n- output = None,\n- atom = [['H', (0.,0.,0.)],\n- ['H', (0.,0.,1.)], ],\n- basis = {'H': 'ccpvdz'},\n- symmetry = True,\n- charge = -1,\n- spin = 1\n- )\n-\n- method = UHF(mol)\n- method.verbose = 5\n- method.irrep_nelec['A1u'] = (1,0)\n- energy = method.kernel()\n- print(energy)\n- method.analyze()\ndiff --git a/pyscf/symm/basis.py b/pyscf/symm/basis.py\nindex c6a8188ab3..374d8ec956 100644\n--- a/pyscf/symm/basis.py\n+++ b/pyscf/symm/basis.py\n@@ -24,9 +24,11 @@\n import numpy\n from pyscf.data.elements import _symbol, _rm_digit\n from pyscf import gto\n+from pyscf import lib\n from pyscf.lib.exceptions import PointGroupSymmetryError\n from pyscf.symm import geom\n from pyscf.symm import param\n+from pyscf.symm.Dmatrix import Dmatrix, get_euler_angles\n \n __all__ = ['tot_parity_odd',\n 'symm_adapted_basis',\n@@ -37,7 +39,7 @@\n 'linearmole_irrep_id2symb',\n 'linearmole_symm_adapted_basis',\n 'so3_irrep_symb2id',\n- 'so3_irrep_id2symb',]\n+ 'so3_irrep_id2symb']\n \n OP_PARITY_ODD = {\n 'E' : (0, 0, 0),\n@@ -132,7 +134,7 @@ def symm_adapted_basis(mol, gpname, orig=0, coordinates=None):\n if idx:\n l_idx[l] = numpy.hstack(idx)\n \n- Ds = _ao_rotation_matrices(mol, coordinates)\n+ Ds = _momentum_rotation_matrices(mol, coordinates)\n so = []\n irrep_ids = []\n for ir, c in enumerate(sodic):\n@@ -148,10 +150,8 @@ def symm_adapted_basis(mol, gpname, orig=0, coordinates=None):\n \n return so, irrep_ids\n \n-def _ao_rotation_matrices(mol, axes):\n- '''Cache the rotation matrices'''\n- from pyscf import lib\n- from pyscf.symm.Dmatrix import Dmatrix, get_euler_angles\n+def _momentum_rotation_matrices(mol, axes):\n+ '''Cache the rotation matrices for each angular momentum'''\n alpha, beta, gamma = get_euler_angles(numpy.eye(3), axes)\n ANG_OF = 1\n l_max = mol._bas[:,ANG_OF].max()\n@@ -464,31 +464,32 @@ def linearmole_irrep_id2symb(gpname, irrep_id):\n if irrep_id < 10:\n return DOOH_IRREP_SYMBS[irrep_id]\n else:\n+ l = abs(linearmole_irrep2momentum(irrep_id))\n n = irrep_id % 10\n- m = irrep_id // 10\n- if n in (0, 1, 5, 4):\n- rn = m*2\n- else:\n- rn = m*2+1\n- return 'E%d%s' % (rn, DOOH_IRREP_SYMBS_EXT[n])\n+ return 'E%d%s' % (l, DOOH_IRREP_SYMBS_EXT[n])\n elif gpname == 'Coov':\n if irrep_id < 10:\n return COOV_IRREP_SYMBS[irrep_id]\n else:\n+ l = abs(linearmole_irrep2momentum(irrep_id))\n n = irrep_id % 10\n- m = irrep_id // 10\n- if n < 2:\n- rn = m*2\n- else:\n- rn = m*2+1\n if n % 2:\n xy = 'y'\n else:\n xy = 'x'\n- return 'E%d%s' % (rn, xy)\n+ return 'E%d%s' % (l, xy)\n else:\n raise PointGroupSymmetryError('%s is not proper for linear molecule.' % gpname)\n \n+def linearmole_irrep2momentum(irrep_id):\n+ if irrep_id % 10 in (0, 1, 5, 4):\n+ l = irrep_id // 10 * 2\n+ else:\n+ l = irrep_id // 10 * 2 + 1\n+ if irrep_id % 10 in (1, 3, 4, 6): # Ey\n+ l *= -1\n+ return l\n+\n def linearmole_symm_adapted_basis(mol, gpname, orig=0, coordinates=None):\n assert (gpname in ('Dooh', 'Coov'))\n assert (not mol.cart)\n@@ -668,7 +669,7 @@ def add_so(irrep_name, c):\n if idx:\n l_idx[l] = numpy.hstack(idx)\n \n- Ds = _ao_rotation_matrices(mol, coordinates)\n+ Ds = _momentum_rotation_matrices(mol, coordinates)\n so = []\n for i in irrep_idx:\n c_ir = numpy.vstack(sodic[irrep_names[i]]).T\n"}, "test": {"test_patch": "diff --git a/pyscf/fci/test/test_addons.py b/pyscf/fci/test/test_addons.py\nindex f1a2f018fd..d6b83c0265 100644\n--- a/pyscf/fci/test/test_addons.py\n+++ b/pyscf/fci/test/test_addons.py\n@@ -229,13 +229,13 @@ def check(mci):\n mci = fci.FCI(mol, mf.mo_coeff, False)\n mci.wfnsym = 'A1g'\n check(mci)\n- mci.wfnsym = 'A2g'\n+ mci.wfnsym = 'A1u'\n check(mci)\n \n mci = fci.FCI(mol, mf.mo_coeff, True)\n mci.wfnsym = 'A1g'\n check(mci)\n- mci.wfnsym = 'A2g'\n+ mci.wfnsym = 'A1u'\n check(mci)\n \n mol = gto.M(atom='O 0 0 0; O 0 0 1.2', spin=2, basis='sto3g',\n@@ -438,4 +438,3 @@ def test_des_and_cre(self):\n if __name__ == \"__main__\":\n print(\"Full Tests for fci.addons\")\n unittest.main()\n-\ndiff --git a/pyscf/fci/test/test_spin0_symm.py b/pyscf/fci/test/test_spin0_symm.py\nindex cecd18fd1c..478cc85707 100644\n--- a/pyscf/fci/test/test_spin0_symm.py\n+++ b/pyscf/fci/test/test_spin0_symm.py\n@@ -20,6 +20,7 @@\n from pyscf import scf\n from pyscf import ao2mo\n from pyscf import fci\n+from pyscf.fci import cistring, direct_spin1, direct_spin1_symm\n import pyscf.symm\n from pyscf.fci import fci_slow\n \n@@ -42,7 +43,7 @@ def setUpModule():\n nelec = mol.nelectron\n h1e = reduce(numpy.dot, (m.mo_coeff.T, scf.hf.get_hcore(mol), m.mo_coeff))\n g2e = ao2mo.incore.full(m._eri, m.mo_coeff)\n- orbsym = pyscf.symm.label_orb_symm(mol, mol.irrep_id, mol.symm_orb, m.mo_coeff)\n+ orbsym = m.orbsym\n cis = fci.direct_spin0_symm.FCISolver(mol)\n cis.orbsym = orbsym\n \n@@ -58,16 +59,27 @@ def tearDownModule():\n class KnownValues(unittest.TestCase):\n def test_contract(self):\n ci1 = fci.addons.symmetrize_wfn(ci0, norb, nelec, orbsym, wfnsym=0)\n+ ci1ref = direct_spin1.contract_2e(g2e, ci1, norb, nelec)\n ci1 = cis.contract_2e(g2e, ci1, norb, nelec, wfnsym=0)\n+ self.assertAlmostEqual(abs(ci1ref - ci1).max(), 0, 9)\n self.assertAlmostEqual(numpy.linalg.norm(ci1), 83.221199436109003, 9)\n+\n ci1 = fci.addons.symmetrize_wfn(ci0, norb, nelec, orbsym, wfnsym=1)\n+ ci1ref = direct_spin1.contract_2e(g2e, ci1, norb, nelec)\n ci1 = cis.contract_2e(g2e, ci1, norb, nelec, wfnsym=1)\n+ self.assertAlmostEqual(abs(ci1ref - ci1).max(), 0, 9)\n self.assertAlmostEqual(numpy.linalg.norm(ci1), 82.571087072474697, 9)\n+\n ci1 = fci.addons.symmetrize_wfn(ci0, norb, nelec, orbsym, wfnsym=3)\n+ ci1ref = direct_spin1.contract_2e(g2e, ci1, norb, nelec)\n ci1 = cis.contract_2e(g2e, ci1, norb, nelec, wfnsym=3)\n+ self.assertAlmostEqual(abs(ci1ref - ci1).max(), 0, 9)\n self.assertAlmostEqual(numpy.linalg.norm(ci1), 82.257163492625622, 9)\n+\n ci1 = fci.addons.symmetrize_wfn(ci0, norb, nelec, orbsym, wfnsym=2)\n+ ci1ref = direct_spin1.contract_2e(g2e, ci1, norb, nelec)\n ci1 = cis.contract_2e(g2e, ci1, norb, nelec, wfnsym=2)\n+ self.assertAlmostEqual(abs(ci1ref - ci1).max(), 0, 9)\n self.assertAlmostEqual(numpy.linalg.norm(ci1), 81.010497935954916, 9)\n \n def test_kernel(self):\n@@ -79,10 +91,48 @@ def test_kernel(self):\n eref = fci_slow.kernel(h1e, g2e, norb, nelec)\n self.assertAlmostEqual(e, eref, 9)\n \n+ def test_linearmole(self):\n+ mol = gto.M(\n+ atom = 'Li 0 0 0; Li 0 0 2.913',\n+ basis = '''\n+#BASIS SET: (9s,4p,1d) -> [3s,2p,1d]\n+Li S\n+ 1469.0000000 0.0007660 -0.0001200 \n+ 220.5000000 0.0058920 -0.0009230 \n+ 50.2600000 0.0296710 -0.0046890 \n+ 14.2400000 0.1091800 -0.0176820 \n+ 4.5810000 0.2827890 -0.0489020 \n+ 1.5800000 0.4531230 -0.0960090 \n+ 0.5640000 0.2747740 -0.1363800 \n+ 0.0734500 0.0097510 0.5751020 \n+Li P\n+ 1.5340000 0.0227840 \n+ 0.2749000 0.1391070 \n+ 0.0736200 0.5003750 \n+Li P\n+ 0.0240300 1.0000000 \n+''',\n+ symmetry = True,\n+ )\n+ mf = mol.RHF().run()\n+ mci = fci.FCI(mol, mf.mo_coeff, singlet=True)\n+ ex, ci_x = mci.kernel(wfnsym='E1ux')\n+ ey, ci_y = mci.kernel(wfnsym='E1uy')\n+ self.assertAlmostEqual(ex - ey, 0, 7)\n+ self.assertAlmostEqual(ex - -14.79681308052051, 0, 7)\n+\n+ swap_xy = numpy.array([\n+ [0, 1, 0],\n+ [1, 0, 0],\n+ [0, 0, 1],\n+ ])\n+ mo_swapxy = mol.ao_rotation_matrix(swap_xy).dot(mf.mo_coeff)\n+ u = mf.mo_coeff.T.dot(mf.get_ovlp()).dot(mo_swapxy)\n+ ci1 = fci.addons.transform_ci(ci_x, (3,3), u.T)\n+ self.assertAlmostEqual(ci_x.ravel().dot(ci_y.ravel()), 0, 9)\n+ self.assertAlmostEqual(abs(ci1.ravel().dot(ci_y.ravel())), 1, 9)\n+\n \n if __name__ == \"__main__\":\n print(\"Full Tests for spin0 symm\")\n unittest.main()\n-\n-\n-\ndiff --git a/pyscf/fci/test/test_spin1_symm.py b/pyscf/fci/test/test_spin1_symm.py\nindex 10124e9de5..2d41ffb2ca 100644\n--- a/pyscf/fci/test/test_spin1_symm.py\n+++ b/pyscf/fci/test/test_spin1_symm.py\n@@ -13,13 +13,14 @@\n # See the License for the specific language governing permissions and\n # limitations under the License.\n \n-from functools import reduce\n import unittest\n import numpy\n from pyscf import gto\n from pyscf import scf\n from pyscf import ao2mo\n from pyscf import fci\n+from pyscf.fci import cistring, direct_spin1, direct_spin1_symm\n+from pyscf.fci import direct_spin1_cyl_sym\n import pyscf.symm\n from pyscf import mcscf\n \n@@ -40,14 +41,14 @@ def setUpModule():\n ehf = m.scf()\n norb = m.mo_coeff.shape[1]\n nelec = mol.nelectron\n- h1e = reduce(numpy.dot, (m.mo_coeff.T, scf.hf.get_hcore(mol), m.mo_coeff))\n+ h1e = m.mo_coeff.T.dot(scf.hf.get_hcore(mol)).dot(m.mo_coeff)\n g2e = ao2mo.incore.full(m._eri, m.mo_coeff)\n- orbsym = pyscf.symm.label_orb_symm(mol, mol.irrep_id, mol.symm_orb, m.mo_coeff)\n+ orbsym = m.orbsym\n cis = fci.direct_spin1_symm.FCISolver(mol)\n cis.orbsym = orbsym\n \n numpy.random.seed(15)\n- na = fci.cistring.num_strings(norb, nelec//2)\n+ na = cistring.num_strings(norb, nelec//2)\n ci0 = numpy.random.random((na,na))\n \n def tearDownModule():\n@@ -57,16 +58,27 @@ def tearDownModule():\n class KnownValues(unittest.TestCase):\n def test_contract(self):\n ci1 = fci.addons.symmetrize_wfn(ci0, norb, nelec, orbsym, wfnsym=0)\n+ ci1ref = direct_spin1.contract_2e(g2e, ci1, norb, nelec)\n ci1 = cis.contract_2e(g2e, ci1, norb, nelec, wfnsym=0)\n+ self.assertAlmostEqual(abs(ci1ref - ci1).max(), 0, 9)\n self.assertAlmostEqual(numpy.linalg.norm(ci1), 83.016780379400785, 9)\n+\n ci1 = fci.addons.symmetrize_wfn(ci0, norb, nelec, orbsym, wfnsym=1)\n+ ci1ref = direct_spin1.contract_2e(g2e, ci1, norb, nelec)\n ci1 = cis.contract_2e(g2e, ci1, norb, nelec, wfnsym=1)\n+ self.assertAlmostEqual(abs(ci1ref - ci1).max(), 0, 9)\n self.assertAlmostEqual(numpy.linalg.norm(ci1), 82.295069645213317, 9)\n+\n ci1 = fci.addons.symmetrize_wfn(ci0, norb, nelec, orbsym, wfnsym=3)\n+ ci1ref = direct_spin1.contract_2e(g2e, ci1, norb, nelec)\n ci1 = cis.contract_2e(g2e, ci1, norb, nelec, wfnsym=3)\n+ self.assertAlmostEqual(abs(ci1ref - ci1).max(), 0, 9)\n self.assertAlmostEqual(numpy.linalg.norm(ci1), 82.256692620435118, 9)\n+\n ci1 = fci.addons.symmetrize_wfn(ci0, norb, nelec, orbsym, wfnsym=2)\n+ ci1ref = direct_spin1.contract_2e(g2e, ci1, norb, nelec)\n ci1 = cis.contract_2e(g2e, ci1, norb, nelec, wfnsym=2)\n+ self.assertAlmostEqual(abs(ci1ref - ci1).max(), 0, 9)\n self.assertAlmostEqual(numpy.linalg.norm(ci1), 81.343382883053323, 9)\n \n def test_kernel(self):\n@@ -105,10 +117,153 @@ def test_guess_wfnsym(self):\n self.assertEqual(cis.guess_wfnsym(norb, nelec, ci0, wfnsym='B2'), 3)\n self.assertRaises(RuntimeError, cis.guess_wfnsym, norb, nelec, numpy.zeros_like(ci0), wfnsym=1)\n \n+ def test_csf2civec(self):\n+ def check(ci_str, orbsym, degen_mapping):\n+ norb = orbsym.size\n+ nelec = bin(ci_str).count('1')\n+ strs = numpy.asarray(cistring.make_strings(range(norb), nelec))\n+ addr = numpy.where(strs == ci_str)[0][0]\n+ ci1 = direct_spin1_symm._cyl_sym_csf2civec(strs, addr, orbsym, degen_mapping)\n \n-if __name__ == \"__main__\":\n- print(\"Full Tests for spin1-symm\")\n- unittest.main()\n+ u = direct_spin1_symm._cyl_sym_orbital_rotation(orbsym, degen_mapping)\n+ ref = numpy.zeros((1, strs.size))\n+ ref[0, addr] = 1.\n+ ref = fci.addons.transform_ci(ref, (0, nelec), u).ravel()\n+ self.assertAlmostEqual(abs(ref-ci1).max(), 0, 14)\n \n+ orbsym = numpy.array([6, 7, 0, 2, 3, 11, 10, 16, 17, 5, 22, 23])\n+ degen_mapping = numpy.array([1, 0, 2, 4, 3, 6, 5, 8, 7, 9, 11, 10])\n \n+ check(0b101000111, orbsym, degen_mapping)\n+ check(0b110100001000, orbsym, degen_mapping)\n+ check(0b100110000010, orbsym, degen_mapping)\n+ check(0b100011010001, orbsym, degen_mapping)\n+ check(0b100100101010, orbsym, degen_mapping)\n+ check(0b10110100110, orbsym, degen_mapping)\n+\n+ numpy.random.seed(2)\n+ idx = numpy.arange(orbsym.size)\n+ numpy.random.shuffle(idx)\n+ rank = idx.argsort()\n+ orbsym = orbsym[idx]\n+ degen_mapping[rank] = rank[degen_mapping]\n+ check(0b101000111, orbsym, degen_mapping)\n+ check(0b110100001000, orbsym, degen_mapping)\n+ check(0b100110000010, orbsym, degen_mapping)\n+ check(0b100011010001, orbsym, degen_mapping)\n+ check(0b100100101010, orbsym, degen_mapping)\n+ check(0b10110100110, orbsym, degen_mapping)\n+\n+ def test_linearmole(self):\n+ mol = gto.M(\n+ atom = 'Li 0 0 0; Li 0 0 2.913',\n+ basis = '''\n+#BASIS SET: (9s,4p,1d) -> [3s,2p,1d]\n+Li S\n+ 1469.0000000 0.0007660 -0.0001200 \n+ 220.5000000 0.0058920 -0.0009230 \n+ 50.2600000 0.0296710 -0.0046890 \n+ 14.2400000 0.1091800 -0.0176820 \n+ 4.5810000 0.2827890 -0.0489020 \n+ 1.5800000 0.4531230 -0.0960090 \n+ 0.5640000 0.2747740 -0.1363800 \n+ 0.0734500 0.0097510 0.5751020 \n+Li P\n+ 1.5340000 0.0227840 \n+ 0.2749000 0.1391070 \n+ 0.0736200 0.5003750 \n+Li P\n+ 0.0240300 1.0000000 \n+''',\n+ symmetry = True,\n+ )\n+ mf = mol.RHF().run()\n+ mci = fci.FCI(mol, mf.mo_coeff, singlet=False)\n+ ex, ci_x = mci.kernel(wfnsym='E2ux')\n+ ey, ci_y = mci.kernel(wfnsym='E2uy')\n+ self.assertAlmostEqual(ex - ey, 0, 7)\n+ self.assertAlmostEqual(ex - -14.70061197088, 0, 7)\n+\n+ swap_xy = numpy.array([\n+ [0, 1, 0],\n+ [1, 0, 0],\n+ [0, 0, 1],\n+ ])\n+ mo_swapxy = mol.ao_rotation_matrix(swap_xy).dot(mf.mo_coeff)\n+ u = mf.mo_coeff.T.dot(mf.get_ovlp()).dot(mo_swapxy)\n+ ci1 = fci.addons.transform_ci(ci_x, (3,3), u.T)\n+ self.assertAlmostEqual(ci_x.ravel().dot(ci_y.ravel()), 0, 9)\n+ self.assertAlmostEqual(abs(ci1.ravel().dot(ci_x.ravel())), 1, 9)\n+ ci1 = fci.addons.transform_ci(ci_y, (3,3), u.T)\n+ self.assertAlmostEqual(abs(ci1.ravel().dot(ci_y.ravel())), 1, 9)\n+\n+ def test_spin1_cyl_sym(self):\n+ mol = gto.M(\n+ atom = 'N 0 0 0; N 0 0 1.5',\n+ basis = 'cc-pVDZ',\n+ spin = 0,\n+ symmetry = True,\n+ )\n+ mc = mol.RHF().run().CASCI(12, 6)\n+ mc.fcisolver.wfnsym = 'E1ux'\n+ mc.run()\n+ e1 = mc.e_tot\n+ ci1 = mc.ci\n+ self.assertAlmostEqual(e1, -108.683383569227, 8)\n \n+ mc.fcisolver = direct_spin1_cyl_sym.FCI(mol)\n+ mc.fcisolver.wfnsym = 'E1ux'\n+ mc.run()\n+ e2 = mc.e_tot\n+ self.assertAlmostEqual(e2, -108.683383569227, 8)\n+ orbsym = mc.fcisolver.orbsym\n+ degen_mapping = orbsym.degen_mapping\n+ u = direct_spin1_symm._cyl_sym_orbital_rotation(orbsym, degen_mapping)\n+ ci2 = fci.addons.transform_ci(mc.ci, (3,3), u)\n+ ci2 = ci2.real / numpy.linalg.norm(ci2.real)\n+ self.assertAlmostEqual(abs(ci1.ravel().dot(ci2.ravel())), 1, 6)\n+\n+ def test_wrong_initial_guess(self):\n+ mol = gto.M(\n+ atom = 'H 0 0 0; H 0 0 1.2',\n+ basis = [[0, [3, 1]], [1, [1, 1]]],\n+ spin = 1,\n+ charge = 1,\n+ symmetry = True)\n+ mf = mol.RHF().run()\n+ mc = mcscf.CASCI(mf, mf.mo_energy.size, mol.nelec)\n+ mc.fcisolver.wfnsym = 'A2g'\n+ self.assertRaises(RuntimeError, mc.run)\n+\n+ mc.fcisolver = direct_spin1_cyl_sym.FCI(mol)\n+ mc.fcisolver.wfnsym = 'A2g'\n+ self.assertRaises(RuntimeError, mc.run)\n+\n+ def test_linearmole_a2(self):\n+ mol = gto.M(\n+ atom = 'H 0 0 0; H 0 0 1.2',\n+ basis = [[0, [3, 1]], [1, [1, 1]]],\n+ symmetry = True)\n+ mf = mol.RHF().run()\n+\n+ mc = mcscf.CASCI(mf, mf.mo_energy.size, mol.nelec)\n+ mc.fcisolver.wfnsym = 'A2g'\n+ mc.run()\n+ self.assertAlmostEqual(mc.e_tot, 2.6561956585409616, 8)\n+ mc.fcisolver = direct_spin1_cyl_sym.FCI(mol)\n+ mc.fcisolver.wfnsym = 'A2g'\n+ mc.run()\n+ self.assertAlmostEqual(mc.e_tot, 2.6561956585409616, 8)\n+\n+ mc = mcscf.CASCI(mf, mf.mo_energy.size, mol.nelec)\n+ mc.fcisolver.wfnsym = 'A2u'\n+ mc.run()\n+ self.assertAlmostEqual(mc.e_tot, 2.8999951068356475, 8)\n+ mc.fcisolver = direct_spin1_cyl_sym.FCI(mol)\n+ mc.fcisolver.wfnsym = 'A2u'\n+ mc.run()\n+ self.assertAlmostEqual(mc.e_tot, 2.8999951068356475, 8)\n+\n+if __name__ == \"__main__\":\n+ print(\"Full Tests for spin1-symm\")\n+ unittest.main()\ndiff --git a/pyscf/gto/test/test_mole.py b/pyscf/gto/test/test_mole.py\nindex a8969ac5f2..c42151c697 100644\n--- a/pyscf/gto/test/test_mole.py\n+++ b/pyscf/gto/test/test_mole.py\n@@ -1034,6 +1034,17 @@ def test_decontract_basis(self):\n s = ctr_coeff.T.dot(pmol.intor('int1e_ovlp')).dot(ctr_coeff)\n self.assertAlmostEqual(abs(s - mol.intor('int1e_ovlp')).max(), 0, 12)\n \n+ def test_ao_rotation_matrix(self):\n+ mol = gto.M(atom='O 0 0 0.2; H1 0 -.8 -.5; H2 0 .8 -.5', basis='ccpvdz')\n+ numpy.random.seed(1)\n+ axes = numpy.linalg.svd(numpy.random.rand(3,3))[0]\n+ mol1 = gto.M(atom=list(zip(['O', 'H', 'H'], mol.atom_coords().dot(axes.T))),\n+ basis='ccpvdz', unit='Bohr')\n+ u = mol.ao_rotation_matrix(axes)\n+ v0 = u.T.dot(mol.intor('int1e_nuc')).dot(u)\n+ v1 = mol1.intor('int1e_nuc')\n+ self.assertAlmostEqual(abs(v0 - v1).max(), 0, 12)\n+\n if __name__ == \"__main__\":\n print(\"test mole.py\")\n unittest.main()\ndiff --git a/pyscf/mcscf/test/test_addons.py b/pyscf/mcscf/test/test_addons.py\nindex 4b6cde81dc..245509c244 100644\n--- a/pyscf/mcscf/test/test_addons.py\n+++ b/pyscf/mcscf/test/test_addons.py\n@@ -316,6 +316,7 @@ def test_state_average_mix(self):\n solver1.spin = 0\n solver1.nroots = 2\n solver2 = fci.FCI(mol, singlet=False)\n+ solver2.wfnsym = 'A1u'\n solver2.spin = 2\n mc = mcscf.CASSCF(mfr, 4, 4)\n mc = mcscf.addons.state_average_mix_(mc, [solver1, solver2],\n@@ -360,6 +361,7 @@ def orbsym(self, x):\n solver1.spin = fcisolver1.spin = 0\n solver1.nroots = fcisolver1.nroots = 2\n solver2 = fci.FCI(mol, singlet=False)\n+ solver2.wfnsym = 'A1u'\n solver2.spin = 2\n mc = mcscf.CASSCF(mfr, 4, 4)\n mc = mcscf.addons.state_average_mix_(mc, [solver1, solver2],\n@@ -498,4 +500,3 @@ def test_state_average_bad_init_guess(self):\n if __name__ == \"__main__\":\n print(\"Full Tests for mcscf.addons\")\n unittest.main()\n-\ndiff --git a/pyscf/mcscf/test/test_casci.py b/pyscf/mcscf/test/test_casci.py\nindex 90c89aaac8..1b9aad9a63 100644\n--- a/pyscf/mcscf/test/test_casci.py\n+++ b/pyscf/mcscf/test/test_casci.py\n@@ -154,15 +154,15 @@ def test_get_veff(self):\n self.assertAlmostEqual(abs(veff1-veff2).max(), 0, 12)\n \n def test_with_ci_init_guess(self):\n- mc1 = mcscf.CASCI(msym, 4, 4)\n- ci0 = numpy.zeros((6,6))\n- ci0[0,1] = 1\n- mc1.kernel(ci0=ci0)\n-\n mc2 = mcscf.CASCI(msym, 4, 4)\n mc2.wfnsym = 'A1u'\n mc2.kernel()\n- self.assertAlmostEqual(mc1.e_tot, mc2.e_tot, 9)\n+ self.assertAlmostEqual(mc2.e_tot, -108.7252219413561, 9)\n+\n+ mc2 = mcscf.CASCI(msym, 4, (3, 1))\n+ mc2.wfnsym = 4\n+ mc2.kernel()\n+ self.assertAlmostEqual(mc2.e_tot, -108.62009625745821, 9)\n \n def test_slight_symmetry_broken(self):\n mf = copy.copy(msym)\ndiff --git a/pyscf/mcscf/test/test_mc1step.py b/pyscf/mcscf/test/test_mc1step.py\nindex 4d3ba5a0ca..98ec711531 100644\n--- a/pyscf/mcscf/test/test_mc1step.py\n+++ b/pyscf/mcscf/test/test_mc1step.py\n@@ -263,15 +263,10 @@ def count_jk(envs):\n self.assertEqual(tot_jk, [3,6,6,4,4,3,6,6,3,6,6,3,4,4,3,3,3,3,4,4])\n \n def test_with_ci_init_guess(self):\n- mc1 = mcscf.CASSCF(msym, 4, 4)\n- ci0 = numpy.zeros((6,6))\n- ci0[0,1] = 1\n- mc1.kernel(ci0=ci0)\n-\n mc2 = mcscf.CASSCF(msym, 4, 4)\n mc2.wfnsym = 'A1u'\n mc2.kernel()\n- self.assertAlmostEqual(mc1.e_tot, mc2.e_tot, 8)\n+ self.assertAlmostEqual(mc2.e_tot, -108.75147424827954, 8)\n \n def test_dump_chk(self):\n mcdic = lib.chkfile.load(mc0.chkfile, 'mcscf')\ndiff --git a/pyscf/mcscf/test/test_n2.py b/pyscf/mcscf/test/test_n2.py\nindex 4904648a4a..5ea142db20 100644\n--- a/pyscf/mcscf/test/test_n2.py\n+++ b/pyscf/mcscf/test/test_n2.py\n@@ -125,6 +125,10 @@ def test_casci_symm_4o4e(self):\n self.assertAlmostEqual(numpy.linalg.norm(mc.analyze()),\n 2.6910275883606078, 4)\n \n+ mc.wfnsym = 'A2u'\n+ # raised by mc.fcisolver.guess_wfnsym\n+ self.assertRaises(RuntimeError, mc.kernel)\n+\n def test_casci_from_uhf(self):\n mf = scf.UHF(mol)\n mf.scf()\n@@ -157,10 +161,14 @@ def test_frozenselect(self):\n \n def test_wfnsym(self):\n mc = mcscf.CASSCF(msym, 4, (3,1))\n- mc.fcisolver.wfnsym = 4\n+ mc.fcisolver.wfnsym = 14\n emc = mc.mc1step()[0]\n self.assertAlmostEqual(emc, -108.74508322877787, 7)\n \n+ mc.wfnsym = 'A2u'\n+ emc = mc.mc1step()[0]\n+ self.assertAlmostEqual(emc, -108.69019443475308, 7)\n+\n def test_ucasci(self):\n mc = mcscf.UCASCI(msym, 4, (3,1))\n emc = mc.kernel()[0]\ndiff --git a/pyscf/mcscf/test/test_newton_casscf.py b/pyscf/mcscf/test/test_newton_casscf.py\nindex 7cd5d0dcda..746dfe3f17 100644\n--- a/pyscf/mcscf/test/test_newton_casscf.py\n+++ b/pyscf/mcscf/test/test_newton_casscf.py\n@@ -53,6 +53,7 @@ def setUpModule():\n solver1.spin = 0\n solver1.nroots = 2\n solver2 = fci.FCI(mol_N2, singlet=False)\n+ solver2.wfnsym = 'A1u'\n solver2.spin = 2\n mc_N2 = CASSCF(mf_N2, 4, 4)\n mc_N2 = addons.state_average_mix_(mc_N2, [solver1, solver2],\n@@ -131,5 +132,3 @@ def test_sa_mix(self):\n if __name__ == \"__main__\":\n print(\"Full Tests for mcscf.addons\")\n unittest.main()\n-\n-\ndiff --git a/pyscf/soscf/test/test_newton_ah.py b/pyscf/soscf/test/test_newton_ah.py\nindex 93c765cbbf..74032140ee 100644\n--- a/pyscf/soscf/test/test_newton_ah.py\n+++ b/pyscf/soscf/test/test_newton_ah.py\n@@ -367,4 +367,3 @@ def test_rohf_so3(self):\n if __name__ == \"__main__\":\n print(\"Full Tests for Newton solver\")\n unittest.main()\n-\n", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}116{"question_id": "MSB_pyscf_pyscf_pr1584", "question_type": "multi_swe_bench", "description": "fix phase error for k-point symmetry (pyscf/pyscf#1584)", "content": {"org": "pyscf", "repo": "pyscf", "pr_number": 1584, "issue_title": "fix phase error for k-point symmetry", "issue_body": "This PR fixes issue #1582.", "base_commit": "7bcae2e3044bf4259f1c6e6b03829912ce0ae1a0", "resolved_issues": [{"number": 1582, "title": "KsymAdaptedRCCSD Not Converge", "body": "Dear developers,\r\n\r\nI'm testing the latest CCSD with k-point symmetries for periodic systems. However, the following calculation for diamond primitive cell with 3x3x3 k-point sampling does not converge. Please see the scripts and corresponding outputs below. Thank you!\r\n\r\n## Version information\r\n```\r\nPython 3.8.13\r\nGCC 7.5.0\r\nPySCF version: 2.1.1\r\nGIT HEAD 7bcae2e3044bf4259f1c6e6b03829912ce0ae1a0\r\n```\r\n\r\n## CCSD without k-point symmetry\r\nThe calculation without symmetries ended gracefully. \r\n\r\nHere is the CCSD input without k-point symmetries:\r\n```python\r\nfrom pyscf.pbc import gto, df, scf, cc\r\nfrom pyscf import scf as mol_scf\r\nfrom time import time\r\n\r\nstart_time = time()\r\n\r\ncell = gto.Cell()\r\ncell.atom = \"C 0.0000 0.0000 0.0000; C 0.8900 0.8900 0.8900\"\r\ncell.a = [[0.0000, 1.7800, 1.7800], [1.7800, 0.0000, 1.7800], [1.7800, 1.7800, 0.0000]]\r\ncell.basis = \"gth-szv\"\r\ncell.pseudo = \"gth-pade\"\r\ncell.max_memory = 512000 \r\ncell.verbose = 4\r\n# cell.precision = 1e-4\r\n\r\ncell.build()\r\n\r\nkmesh = [3,3,3]\r\nkpts = cell.make_kpts(kmesh)\r\nkhf = scf.KRHF(cell, kpts)\r\nkhf = mol_scf.addons.remove_linear_dep_(khf)\r\nkhf.kernel()\r\nprint(f\"** HF total energy [Ha]: {khf.e_tot} **\")\r\n\r\nkcc = cc.KRCCSD(khf)\r\nkcc.conv_tol = 1e-4\r\nkcc.conv_tol_normt = 1e-3\r\nkcc.kernel()\r\n\r\nprint(f\"** MP2 total energy [Ha]: {kcc.emp2 + khf.e_tot} **\")\r\nprint(f\"** MP2 correlation [Ha]: {kcc.emp2} **\")\r\nprint(f\"** CCSD total energy [Ha]: {kcc.e_tot} **\")\r\nprint(f\"** CCSD correlation [Ha]: {kcc.e_corr} **\")\r\n\r\nend_time = time()\r\n\r\nprint(f\"#####################################################\")\r\nprint(f\"# Finished in {end_time - start_time:10.2f} seconds. #\")\r\nprint(f\"#####################################################\")\r\n```\r\n\r\nHere is the output:\r\n```python\r\n******** <class 'pyscf.pbc.cc.kccsd_rhf.RCCSD'> ********\r\nCC2 = 0\r\nCCSD nocc = 4, nmo = 8\r\nmax_cycle = 50\r\ndirect = 1\r\nconv_tol = 0.0001\r\nconv_tol_normt = 0.001\r\ndiis_space = 6\r\ndiis_start_cycle = 0\r\ndiis_start_energy_diff = 1e+09\r\nmax_memory 512000 MB (current use 229 MB)\r\nusing incore ERI storage\r\nInit t2, MP2 energy (with fock eigenvalue shift) = -0.101136246587875\r\nInit E_corr(CCSD) = -0.101136246587875\r\ncycle = 1 E_corr(CCSD) = -0.11302371985953 dE = -0.0118874733 norm(t1,t2) = 0.199481\r\ncycle = 2 E_corr(CCSD) = -0.116486053728869 dE = -0.00346233387 norm(t1,t2) = 0.0672819\r\ncycle = 3 E_corr(CCSD) = -0.11809151506564 dE = -0.00160546134 norm(t1,t2) = 0.0298103\r\ncycle = 4 E_corr(CCSD) = -0.118301235613774 dE = -0.000209720548 norm(t1,t2) = 0.00626899\r\ncycle = 5 E_corr(CCSD) = -0.118298883933205 dE = 2.35168057e-06 norm(t1,t2) = 0.0019157\r\ncycle = 6 E_corr(CCSD) = -0.118295531043058 dE = 3.35289015e-06 norm(t1,t2) = 0.000438101\r\nRCCSD converged\r\nE(RCCSD) = -11.11828707024064 E_corr = -0.1182955310430577\r\n** MP2 total energy [Ha]: -11.101127785785454 **\r\n** MP2 correlation [Ha]: -0.10113624658787514 **\r\n** CCSD total energy [Ha]: -11.118287070240635 **\r\n** CCSD correlation [Ha]: -0.11829553104305766 **\r\n#####################################################\r\n# Finished in 3442.58 seconds. #\r\n#####################################################\r\n```\r\n\r\n## CCSD with k-point symmetries\r\nHere is the input file\r\n```python\r\nfrom pyscf.pbc import gto, df, scf, cc\r\nfrom pyscf import scf as mol_scf\r\nfrom time import time\r\n\r\nstart_time = time()\r\n\r\ncell = gto.Cell()\r\ncell.atom = \"C 0.0000 0.0000 0.0000; C 0.8900 0.8900 0.8900\"\r\ncell.a = [[0.0000, 1.7800, 1.7800], [1.7800, 0.0000, 1.7800], [1.7800, 1.7800, 0.0000]]\r\ncell.basis = \"gth-szv\"\r\ncell.pseudo = \"gth-pade\"\r\ncell.max_memory = 512000\r\ncell.verbose = 4\r\n# cell.precision = 1e-8\r\ncell.space_group_symmetry = True\r\ncell.build()\r\n\r\nkmesh = [3,3,3]\r\nkpts = cell.make_kpts(kmesh, with_gamma_point=True, space_group_symmetry=True)\r\nkhf = scf.KRHF(cell, kpts)\r\nkhf = mol_scf.addons.remove_linear_dep_(khf)\r\nkhf.kernel()\r\nprint(f\"** HF total energy [Ha]: {khf.e_tot} **\")\r\n\r\nkcc = cc.KsymAdaptedRCCSD(khf)\r\nkcc.conv_tol = 1e-4\r\nkcc.conv_tol_normt = 1e-3\r\nkcc.kernel()\r\n\r\nprint(f\"** MP2 total energy [Ha]: {kcc.emp2 + khf.e_tot} **\")\r\nprint(f\"** MP2 correlation [Ha]: {kcc.emp2} **\")\r\nprint(f\"** CCSD total energy [Ha]: {kcc.e_tot} **\")\r\nprint(f\"** CCSD correlation [Ha]: {kcc.e_corr} **\")\r\n\r\nend_time = time()\r\n\r\nprint(f\"#####################################################\")\r\nprint(f\"# Finished in {end_time - start_time:10.2f} seconds. #\")\r\nprint(f\"#####################################################\")\r\n```\r\nBut unfortunately, the CCSD calculation does not converge:\r\n```python\r\n******** <class 'pyscf.pbc.cc.kccsd_rhf_ksymm.KsymAdaptedRCCSD'> ********\r\nCC2 = 0\r\nCCSD nocc = 4, nmo = 8\r\nmax_cycle = 50\r\ndirect = 1\r\nconv_tol = 0.0001\r\nconv_tol_normt = 0.001\r\ndiis_space = 6\r\ndiis_start_cycle = 0\r\ndiis_start_energy_diff = 1e+09\r\nmax_memory 512000 MB (current use 269 MB)\r\nIncore memory estimation: 999.240704 MB\r\nusing incore ERI storage\r\nInit t2, MP2 energy (with fock eigenvalue shift) = 115.220187475672\r\nInit E_corr(CCSD) = 115.220187475672\r\ncycle = 1 E_corr(CCSD) = 1105912122.99569 dE = 1.10591201e+09 norm(t1,t2) = 1.26556e+07\r\n\r\nWARN: Non-zero imaginary part found in KRCCSD energy (1.6764182260999362e+23-16275017475.528364j)\r\n\r\ncycle = 2 E_corr(CCSD) = 1.67641822609994e+23 dE = 1.67641823e+23 norm(t1,t2) = 6.48812e+21\r\n\r\nWARN: Non-zero imaginary part found in KRCCSD energy (-7.192569978591114e+74-3.580017490652341e+62j)\r\n\r\ncycle = 3 E_corr(CCSD) = -7.19256997859111e+74 dE = -7.19256998e+74 norm(t1,t2) = 2.42369e+51\r\n\r\nWARN: Non-zero imaginary part found in KRCCSD energy (-1.2621487897532068e+225-1.8297827444511553e+213j)\r\n\r\ncycle = 4 E_corr(CCSD) = -1.26214878975321e+225 dE = -1.26214879e+225 norm(t1,t2) = 1.95135e+152\r\ncycle = 5 E_corr(CCSD) = nan dE = nan norm(t1,t2) = nan\r\n...\r\n```\r\n\r\n\r\n\r\n\r\n"}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/pyscf_m_pyscf:pr-1584", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/pyscf/pbc/symm/symmetry.py b/pyscf/pbc/symm/symmetry.py\nindex 41d8a0606d..3618039c8f 100644\n--- a/pyscf/pbc/symm/symmetry.py\n+++ b/pyscf/pbc/symm/symmetry.py\n@@ -235,7 +235,7 @@ def _get_phase(cell, op, kpt_scaled, ignore_phase=False, tol=SYMPREC):\n # remove numerical noise, important for symmetry adaptation\n Lshift = Lshift.round()\n if not ignore_phase:\n- phase[iatm] = np.exp(-1j * np.dot(kpt_scaled, Lshift) * 2.0 * np.pi)\n+ phase[iatm] = np.exp(1j * np.dot(kpt_scaled, Lshift) * 2.0 * np.pi)\n return atm_map, phase\n \n def _get_rotation_mat(cell, kpt_scaled_ibz, mo_coeff_or_dm, op, Dmats,\n"}, "test": {"test_patch": "diff --git a/pyscf/pbc/lib/test/test_kpts_ksymm.py b/pyscf/pbc/lib/test/test_kpts_ksymm.py\nindex 5e7a0b2ddd..9de0d07bcb 100644\n--- a/pyscf/pbc/lib/test/test_kpts_ksymm.py\n+++ b/pyscf/pbc/lib/test/test_kpts_ksymm.py\n@@ -36,15 +36,16 @@ def setUpModule():\n [2.6935121974, 2.6935121974, 0.0]]\n cell.basis = 'gth-szv'\n cell.pseudo = 'gth-pade'\n- cell.mesh = [24,24,24]\n+ cell.mesh = [20,] * 3\n cell.space_group_symmetry = True\n cell.build()\n \n cell1 = cell.copy()\n cell1.build(symmorphic=True)\n \n- kpts0 = cell.make_kpts([2,2,2])\n+ kpts0 = cell.make_kpts([3,3,3])\n kmf = scf.KRKS(cell, kpts0)\n+ kmf.max_cycle=1\n kmf.kernel()\n \n def tearDownModule():\n@@ -91,12 +92,12 @@ def test_transform(self):\n kpts = libkpts.make_kpts(cell, kpts0, space_group_symmetry=True, time_reversal_symmetry=True)\n dms_ibz = kmf.make_rdm1()[kpts.ibz2bz]\n dms_bz = kpts.transform_dm(dms_ibz)\n- self.assertAlmostEqual(abs(dms_bz - kmf.make_rdm1()).max(), 0, 9)\n+ self.assertAlmostEqual(abs(dms_bz - kmf.make_rdm1()).max(), 0, 7)\n \n mo_coeff_ibz = np.asarray(kmf.mo_coeff)[kpts.ibz2bz]\n mo_coeff_bz = kpts.transform_mo_coeff(mo_coeff_ibz)\n dms_bz = khf.make_rdm1(mo_coeff_bz, kmf.mo_occ)\n- self.assertAlmostEqual(abs(dms_bz - kmf.make_rdm1()).max(), 0, 9)\n+ self.assertAlmostEqual(abs(dms_bz - kmf.make_rdm1()).max(), 0, 7)\n \n mo_occ_ibz = kpts.check_mo_occ_symmetry(kmf.mo_occ)\n mo_occ_bz = kpts.transform_mo_occ(mo_occ_ibz)\n@@ -104,17 +105,17 @@ def test_transform(self):\n \n mo_energy_ibz = np.asarray(kmf.mo_energy)[kpts.ibz2bz]\n mo_energy_bz = kpts.transform_mo_energy(mo_energy_ibz)\n- self.assertAlmostEqual(abs(mo_energy_bz - np.asarray(kmf.mo_energy)).max(), 0 , 9)\n+ self.assertAlmostEqual(abs(mo_energy_bz - np.asarray(kmf.mo_energy)).max(), 0 , 7)\n \n fock_ibz = kmf.get_fock()[kpts.ibz2bz]\n fock_bz = kpts.transform_fock(fock_ibz)\n- self.assertAlmostEqual(abs(fock_bz - kmf.get_fock()).max(), 0, 9)\n+ self.assertAlmostEqual(abs(fock_bz - kmf.get_fock()).max(), 0, 7)\n \n kumf = kmf.to_uhf()\n mo_coeff_ibz = np.asarray(kumf.mo_coeff)[:,kpts.ibz2bz]\n mo_coeff_bz = kpts.transform_mo_coeff(mo_coeff_ibz)\n dms_bz = kuhf.make_rdm1(mo_coeff_bz, kumf.mo_occ)\n- self.assertAlmostEqual(abs(dms_bz - kumf.make_rdm1()).max(), 0, 9)\n+ self.assertAlmostEqual(abs(dms_bz - kumf.make_rdm1()).max(), 0, 7)\n \n mo_occ_ibz = np.asarray(kumf.mo_occ)[:,kpts.ibz2bz]\n mo_occ_bz = kpts.transform_mo_occ(mo_occ_ibz)\n@@ -122,11 +123,11 @@ def test_transform(self):\n \n mo_energy_ibz = np.asarray(kumf.mo_energy)[:,kpts.ibz2bz]\n mo_energy_bz = kpts.transform_mo_energy(mo_energy_ibz)\n- self.assertAlmostEqual(abs(mo_energy_bz - np.asarray(kumf.mo_energy)).max(), 0 , 9)\n+ self.assertAlmostEqual(abs(mo_energy_bz - np.asarray(kumf.mo_energy)).max(), 0 , 7)\n \n fock_ibz = kumf.get_fock()[:,kpts.ibz2bz]\n fock_bz = kpts.transform_fock(fock_ibz)\n- self.assertAlmostEqual(abs(fock_bz - kumf.get_fock()).max(), 0, 9)\n+ self.assertAlmostEqual(abs(fock_bz - kumf.get_fock()).max(), 0, 7)\n \n def test_symmetrize_density(self):\n rho0 = kmf.get_rho()\n", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}117{"question_id": "MSB_pyscf_pyscf_pr1594", "question_type": "multi_swe_bench", "description": "Fix k-point symmetry adapted KS-DFT with Newton solver (pyscf/pyscf#1594)", "content": {"org": "pyscf", "repo": "pyscf", "pr_number": 1594, "issue_title": "Fix k-point symmetry adapted KS-DFT with Newton solver", "issue_body": "Fixes issue #1462.", "base_commit": "0df2ead0cc9b80a1b8bf0f26b5d1755baf1a472f", "resolved_issues": [{"number": 1462, "title": "Newton method for krks_ksymm fails", "body": "Hi,\r\nSecond order SCF solver can be used for k-symmetry adapted HF class but fails for DFT calculations.\r\n```\r\nimport numpy\r\nfrom pyscf.pbc import gto, scf, dft\r\n\r\ncell = gto.M(\r\n a = numpy.asarray([[0.0, 2.6935121974, 2.6935121974], \r\n [2.6935121974, 0.0, 2.6935121974], \r\n [2.6935121974, 2.6935121974, 0.0]]),\r\n atom = '''Si 0.0000000000 0.0000000000 0.0000000000\r\n Si 1.3467560987 1.3467560987 1.3467560987''', \r\n basis = 'gth-szv',\r\n pseudo = 'gth-pade',\r\n mesh = [24,24,24],\r\n verbose = 5,)\r\n\r\nnk = [2,2,2]\r\nkpts = cell.make_kpts(nk, \r\n space_group_symmetry=True, \r\n time_reversal_symmetry=True,\r\n symmorphic=True)\r\n\r\nkmf = scf.KRKS(cell, kpts)\r\nkmf.xc = 'pbe'\r\nkmf = kmf.newton()\r\nkmf.kernel()\r\n```\r\nThe calculation will fail because of not correctly recognizing KPoints class.\r\n\r\n"}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/pyscf_m_pyscf:pr-1594", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/pyscf/pbc/dft/numint.py b/pyscf/pbc/dft/numint.py\nindex a8ca103c28..74ba8349fe 100644\n--- a/pyscf/pbc/dft/numint.py\n+++ b/pyscf/pbc/dft/numint.py\n@@ -27,6 +27,7 @@\n from pyscf.dft.gen_grid import NBINS, CUTOFF, ALIGNMENT_UNIT\n from pyscf.pbc.dft.gen_grid import make_mask, BLKSIZE\n from pyscf.pbc.lib.kpts_helper import member, is_zero\n+from pyscf.pbc.lib.kpts import KPoints\n \n \n def eval_ao(cell, coords, kpt=numpy.zeros(3), deriv=0, relativity=0, shls_slice=None,\n@@ -554,6 +555,8 @@ def nr_rks_fxc(ni, cell, grids, xc_code, dm0, dms, relativity=0, hermi=0,\n '''\n if kpts is None:\n kpts = numpy.zeros((1,3))\n+ if isinstance(kpts, KPoints):\n+ kpts = kpts.kpts_ibz\n xctype = ni._xc_type(xc_code)\n if xctype == 'LDA':\n ao_deriv = 0\n@@ -843,6 +846,10 @@ def cache_xc_kernel(ni, cell, grids, xc_code, mo_coeff, mo_occ, spin=0,\n '''\n if kpts is None:\n kpts = numpy.zeros((1,3))\n+ if isinstance(kpts, KPoints):\n+ mo_coeff = kpts.transform_mo_coeff(mo_coeff)\n+ mo_occ = kpts.transform_mo_occ(mo_occ)\n+ kpts = kpts.kpts\n xctype = ni._xc_type(xc_code)\n if xctype == 'GGA':\n ao_deriv = 1\n"}, "test": {"test_patch": "diff --git a/pyscf/pbc/dft/test/test_krks_ksym.py b/pyscf/pbc/dft/test/test_krks_ksym.py\nindex caa5db1573..f55e78a43b 100644\n--- a/pyscf/pbc/dft/test/test_krks_ksym.py\n+++ b/pyscf/pbc/dft/test/test_krks_ksym.py\n@@ -152,6 +152,20 @@ def test_gga_df(self):\n kmf.kernel()\n self.assertAlmostEqual(kmf.e_tot, kmf0.e_tot, 9)\n \n+ def test_gga_df_newton(self):\n+ kpts0 = He.make_kpts(nk, with_gamma_point=False)\n+ kmf0 = krks.KRKS(He, kpts=kpts0).density_fit()\n+ kmf0.xc = 'pbe'\n+ kmf0 = kmf0.newton()\n+ kmf0.kernel()\n+\n+ kpts = He.make_kpts(nk, with_gamma_point=False, space_group_symmetry=True,time_reversal_symmetry=True)\n+ kmf = pscf.KRKS(He, kpts=kpts).density_fit()\n+ kmf.xc = 'pbe'\n+ kmf = kmf.newton()\n+ kmf.kernel()\n+ self.assertAlmostEqual(kmf.e_tot, kmf0.e_tot, 9)\n+\n def test_rsh_df(self):\n kpts0 = He.make_kpts(nk, with_gamma_point=False)\n kmf0 = krks.KRKS(He, kpts=kpts0).density_fit()\n", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}118{"question_id": "MSB_pyscf_pyscf_pr1620", "question_type": "multi_swe_bench", "description": "Fix Mole.decontract_basis method (Fix issue #1609) (pyscf/pyscf#1620)", "content": {"org": "pyscf", "repo": "pyscf", "pr_number": 1620, "issue_title": "Fix Mole.decontract_basis method (Fix issue #1609)", "issue_body": null, "base_commit": "8aa7a5b02dea52dfbc9e106e4f4737f86dc56376", "resolved_issues": [{"number": 1609, "title": "Issue with x2c and using cc-pCVXZ basis sets in at least PySCF 1.7.6 and newer", "body": "Hi all,\r\n\r\nI've come across what I believe to be a bug when trying to run a relativistic exact two-component PySCF calculation using a core-valence correlation consistent basis set (cc-pCVDZ) at the SCF/mean-field level. I have included two input files that do (c6h4_load.py) and do not (c6h4_parse.py) have the bug I describe below:\r\n\r\nWhen running a calculation in which I request to use the cc-pCVDZ basis set, the output file lists the correct number of primitive GTOs, and the initial energy in the SCF procedure is reasonable (approx. -230 a.u.), but then the first step of the SCF cycle has an energy that is two orders of magnitude greater (approx. -50000 a.u.) and the SCF procedure does not converge.\r\n\r\nThe issue only occurs if I load the cc-pCVDZ basis set as it is defined within PySCF. Two actions fix this problem:\r\n1) Switching to the non-core-valence variant (cc-pCVDZ -> cc-pVDZ); SCF converges normally without any complications.\r\n\r\n2) If I manually specify the SAME cc-pCVDZ basis set and use the 'parse' function from the 'gto' module, the same exact x2c mean-field calculation no longer produces these massive energy errors in the SCF energy and convergence is smooth and quick.\r\n\r\nThe exact same input files provided below, run in PySCF 1.5.3 (compiled) and PySCF 1.6.2 (compiled), DO NOT have this issue. So it seems like something that could have been introduced around version 1.7?\r\n\r\nThe versions of PySCF I have found to be displaying this behavior:\r\nPySCF 1.7.6 (conda)\r\nPySCF 2.0.0a (compiled)\r\nPySCF 2.0.1 (conda)\r\nPySCF 2.1.1 (conda)\r\nPySCF 2.1.1 (compiled)\r\nPySCF 2.1.1 (compiled w/ OMP_NUM_THREADS=1)\r\n\r\nPlease let me know if you need any additional info from me! Thanks in advance.\r\n\r\nBest,\r\nIlia Mazin\r\n\r\n[x2c_basis_set_test.zip](https://github.com/pyscf/pyscf/files/10818364/x2c_basis_set_test.zip)\r\n"}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/pyscf_m_pyscf:pr-1620", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/pyscf/gto/mole.py b/pyscf/gto/mole.py\nindex 09253d2a59..6eff5b8a4f 100644\n--- a/pyscf/gto/mole.py\n+++ b/pyscf/gto/mole.py\n@@ -916,11 +916,15 @@ def make_atm_env(atom, ptr=0, nuclear_model=NUC_POINT, nucprop={}):\n def make_bas_env(basis_add, atom_id=0, ptr=0):\n '''Convert :attr:`Mole.basis` to the argument ``bas`` for ``libcint`` integrals\n '''\n+ # First sort basis accroding to l. This is important for method\n+ # decontract_basis, which assumes that basis functions with the same angular\n+ # momentum are grouped together\n+ basis_add = [b for b in basis_add if b]\n+ basis_add = sorted(basis_add, key=lambda b: b[0])\n+\n _bas = []\n _env = []\n for b in basis_add:\n- if not b: # == []\n- continue\n angl = b[0]\n if angl > 14:\n sys.stderr.write('Warning: integral library does not support basis '\n"}, "test": {"test_patch": "diff --git a/pyscf/gto/test/test_mole.py b/pyscf/gto/test/test_mole.py\nindex c42151c697..294233e168 100644\n--- a/pyscf/gto/test/test_mole.py\n+++ b/pyscf/gto/test/test_mole.py\n@@ -1034,6 +1034,13 @@ def test_decontract_basis(self):\n s = ctr_coeff.T.dot(pmol.intor('int1e_ovlp')).dot(ctr_coeff)\n self.assertAlmostEqual(abs(s - mol.intor('int1e_ovlp')).max(), 0, 12)\n \n+ mol = gto.M(atom='He',\n+ basis=('ccpvdz', [[0, [5, 1]], [1, [3, 1]]]))\n+ pmol, contr_coeff = mol.decontract_basis()\n+ contr_coeff = scipy.linalg.block_diag(*contr_coeff)\n+ s = contr_coeff.T.dot(pmol.intor('int1e_ovlp')).dot(contr_coeff)\n+ self.assertAlmostEqual(abs(s - mol.intor('int1e_ovlp')).max(), 0, 12)\n+\n def test_ao_rotation_matrix(self):\n mol = gto.M(atom='O 0 0 0.2; H1 0 -.8 -.5; H2 0 .8 -.5', basis='ccpvdz')\n numpy.random.seed(1)\n", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}119{"question_id": "MSB_pyscf_pyscf_pr1638", "question_type": "multi_swe_bench", "description": "DIIS instability due to numerical noises (fix issue #1524) (pyscf/pyscf#1638)", "content": {"org": "pyscf", "repo": "pyscf", "pr_number": 1638, "issue_title": "DIIS instability due to numerical noises (fix issue #1524)", "issue_body": "Close issue #1524 ", "base_commit": "5bd220edeed6b6a1a6add886487726aee27be11e", "resolved_issues": [{"number": 1524, "title": "DIIS fails to converge triplet O in cc-pVDZ", "body": "The oxygen 3P wave function cannot be converged even in cc-pVDZ with DIIS. Without DIIS the calculation works.\r\n```\r\nimport pyscf\r\n\r\nmol = pyscf.M(\r\n atom = 'O',\r\n spin = 2,\r\n basis = 'cc-pVDZ',\r\n symmetry = True,\r\n verbose = 4)\r\n\r\n# This fails \r\nmf = mol.ROHF()\r\nmf.init_guess = '1e'\r\nmf.irrep_nelec = {'s+0' : (2,2), 'p-1' : (1,0), 'p+0' : (1,0), 'p+1' : (1,1) }\r\nmf.kernel()\r\n\r\n# This works \r\nmf = mol.ROHF()\r\nmf.init_guess = '1e'\r\nmf.irrep_nelec = {'s+0' : (2,2), 'p-1' : (1,0), 'p+0' : (1,0), 'p+1' : (1,1) }\r\nmf.diis = None\r\nmf.kernel()\r\n```"}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/pyscf_m_pyscf:pr-1638", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/pyscf/scf/diis.py b/pyscf/scf/diis.py\nindex 21dba408b6..27e6e8cc0a 100644\n--- a/pyscf/scf/diis.py\n+++ b/pyscf/scf/diis.py\n@@ -43,6 +43,10 @@ def __init__(self, mf=None, filename=None, Corth=None):\n self.rollback = 0\n self.space = 8\n self.Corth = Corth\n+ #?self._scf = mf\n+ #?if hasattr(self._scf, 'get_orbsym'): # Symmetry adapted SCF objects\n+ #? self.orbsym = mf.get_orbsym(Corth)\n+ #? sym_forbid = self.orbsym[:,None] != self.orbsym\n \n def update(self, s, d, f, *args, **kwargs):\n errvec = get_err_vec(s, d, f, self.Corth)\n@@ -83,16 +87,24 @@ def get_err_vec_orig(s, d, f):\n \n def get_err_vec_orth(s, d, f, Corth):\n '''error vector in orthonormal basis = C.T.conj() (SDF - FDS) C'''\n+ # Symmetry information to reduce numerical error in DIIS (issue #1524)\n+ orbsym = getattr(Corth, 'orbsym', None)\n+ if orbsym is not None:\n+ sym_forbid = orbsym[:,None] != orbsym\n+\n if isinstance(f, numpy.ndarray) and f.ndim == 2:\n- sdf = reduce(numpy.dot, (s,d,f))\n- errvec = Corth.conj().T.dot(sdf.conj().T - sdf).dot(Corth).ravel()\n+ sdf = reduce(numpy.dot, (Corth.conj().T, s, d, f, Corth))\n+ if orbsym is not None:\n+ sdf[sym_forbid] = 0\n+ errvec = (sdf.conj().T - sdf).ravel()\n \n elif isinstance(f, numpy.ndarray) and f.ndim == 3 and s.ndim == 3:\n errvec = []\n for i in range(f.shape[0]):\n- sdf = reduce(numpy.dot, (s[i], d[i], f[i]))\n- errvec.append(\n- Corth[i].conj().T.dot(sdf.conj().T - sdf).dot(Corth[i]).ravel())\n+ sdf = reduce(numpy.dot, (Corth[i].conj().T, s[i], d[i], f[i], Corth[i]))\n+ if orbsym is not None:\n+ sdf[sym_forbid] = 0\n+ errvec.append((sdf.conj().T - sdf).ravel())\n errvec = numpy.vstack(errvec).ravel()\n \n elif f.ndim == s.ndim+1 and f.shape[0] == 2: # for UHF\ndiff --git a/pyscf/scf/ghf_symm.py b/pyscf/scf/ghf_symm.py\nindex d0a5709e4b..8ddc0a6c11 100644\n--- a/pyscf/scf/ghf_symm.py\n+++ b/pyscf/scf/ghf_symm.py\n@@ -39,9 +39,6 @@\n def analyze(mf, verbose=logger.DEBUG, with_meta_lowdin=WITH_META_LOWDIN,\n **kwargs):\n mol = mf.mol\n- if not mol.symmetry:\n- return ghf.analyze(mf, verbose, **kwargs)\n-\n mo_energy = mf.mo_energy\n mo_occ = mf.mo_occ\n mo_coeff = mf.mo_coeff\n@@ -83,7 +80,7 @@ def canonicalize(mf, mo_coeff, mo_occ, fock=None):\n '''\n mol = mf.mol\n if not mol.symmetry:\n- return ghf.canonicalize(mf, mo_coeff, mo_occ, fock)\n+ raise RuntimeError('mol.symmetry not enabled')\n \n if getattr(mo_coeff, 'orbsym', None) is not None:\n return hf_symm.canonicalize(mf, mo_coeff, mo_occ, fock)\n@@ -113,42 +110,42 @@ def dump_flags(self, verbose=None):\n \n def build(self, mol=None):\n if mol is None: mol = self.mol\n- if mol.symmetry:\n- for irname in self.irrep_nelec:\n- if irname not in mol.irrep_name:\n- logger.warn(self, 'Molecule does not have irrep %s', irname)\n-\n- nelec_fix = self.irrep_nelec.values()\n- if any(isinstance(x, (tuple, list)) for x in nelec_fix):\n- msg =('Number of alpha/beta electrons cannot be assigned '\n- 'separately in GHF. irrep_nelec = %s' % self.irrep_nelec)\n- raise ValueError(msg)\n- nelec_fix = sum(nelec_fix)\n- float_irname = set(mol.irrep_name) - set(self.irrep_nelec)\n- if nelec_fix > mol.nelectron:\n- msg =('More electrons defined by irrep_nelec than total num electrons. '\n- 'mol.nelectron = %d irrep_nelec = %s' %\n- (mol.nelectron, self.irrep_nelec))\n- raise ValueError(msg)\n- else:\n- logger.info(mol, 'Freeze %d electrons in irreps %s',\n- nelec_fix, self.irrep_nelec.keys())\n-\n- if len(float_irname) == 0 and nelec_fix != mol.nelectron:\n- msg =('Num electrons defined by irrep_nelec != total num electrons. '\n- 'mol.nelectron = %d irrep_nelec = %s' %\n- (mol.nelectron, self.irrep_nelec))\n- raise ValueError(msg)\n- else:\n- logger.info(mol, ' %d free electrons in irreps %s',\n- mol.nelectron-nelec_fix, ' '.join(float_irname))\n+ if not mol.symmetry:\n+ raise RuntimeError('mol.symmetry not enabled')\n+\n+ for irname in self.irrep_nelec:\n+ if irname not in mol.irrep_name:\n+ logger.warn(self, 'Molecule does not have irrep %s', irname)\n+\n+ nelec_fix = self.irrep_nelec.values()\n+ if any(isinstance(x, (tuple, list)) for x in nelec_fix):\n+ msg =('Number of alpha/beta electrons cannot be assigned '\n+ 'separately in GHF. irrep_nelec = %s' % self.irrep_nelec)\n+ raise ValueError(msg)\n+ nelec_fix = sum(nelec_fix)\n+ float_irname = set(mol.irrep_name) - set(self.irrep_nelec)\n+ if nelec_fix > mol.nelectron:\n+ msg =('More electrons defined by irrep_nelec than total num electrons. '\n+ 'mol.nelectron = %d irrep_nelec = %s' %\n+ (mol.nelectron, self.irrep_nelec))\n+ raise ValueError(msg)\n+ else:\n+ logger.info(mol, 'Freeze %d electrons in irreps %s',\n+ nelec_fix, self.irrep_nelec.keys())\n+\n+ if len(float_irname) == 0 and nelec_fix != mol.nelectron:\n+ msg =('Num electrons defined by irrep_nelec != total num electrons. '\n+ 'mol.nelectron = %d irrep_nelec = %s' %\n+ (mol.nelectron, self.irrep_nelec))\n+ raise ValueError(msg)\n+ else:\n+ logger.info(mol, ' %d free electrons in irreps %s',\n+ mol.nelectron-nelec_fix, ' '.join(float_irname))\n return ghf.GHF.build(self, mol)\n \n def eig(self, h, s, symm_orb=None, irrep_id=None):\n if symm_orb is None or irrep_id is None:\n mol = self.mol\n- if not mol.symmetry:\n- return self._eigh(h, s)\n symm_orb = mol.symm_orb\n irrep_id = mol.irrep_id\n \n@@ -171,12 +168,11 @@ def eig(self, h, s, symm_orb=None, irrep_id=None):\n \n def get_grad(self, mo_coeff, mo_occ, fock=None):\n g = ghf.GHF.get_grad(self, mo_coeff, mo_occ, fock)\n- if self.mol.symmetry:\n- occidx = mo_occ > 0\n- viridx = ~occidx\n- orbsym = self.get_orbsym(mo_coeff, self.get_ovlp())\n- sym_forbid = orbsym[viridx].reshape(-1,1) != orbsym[occidx]\n- g[sym_forbid.ravel()] = 0\n+ occidx = mo_occ > 0\n+ viridx = ~occidx\n+ orbsym = self.get_orbsym(mo_coeff)\n+ sym_forbid = orbsym[viridx].reshape(-1,1) != orbsym[occidx]\n+ g[sym_forbid.ravel()] = 0\n return g\n \n def get_occ(self, mo_energy=None, mo_coeff=None):\n@@ -186,9 +182,9 @@ def get_occ(self, mo_energy=None, mo_coeff=None):\n if mo_energy is None: mo_energy = self.mo_energy\n mol = self.mol\n if not mol.symmetry:\n- return ghf.GHF.get_occ(self, mo_energy, mo_coeff)\n+ raise RuntimeError('mol.symmetry not enabled')\n \n- orbsym = self.get_orbsym(mo_coeff, self.get_ovlp())\n+ orbsym = self.get_orbsym(mo_coeff)\n mo_occ = numpy.zeros_like(mo_energy)\n rest_idx = numpy.ones(mo_occ.size, dtype=bool)\n nelec_fix = 0\n@@ -243,7 +239,7 @@ def _finalize(self):\n # ordering of the symmetry labels when two orbitals are degenerated.\n o_sort = numpy.argsort(self.mo_energy[self.mo_occ> 0].round(9), kind='mergesort')\n v_sort = numpy.argsort(self.mo_energy[self.mo_occ==0].round(9), kind='mergesort')\n- orbsym = self.get_orbsym(self.mo_coeff, self.get_ovlp())\n+ orbsym = self.get_orbsym(self.mo_coeff)\n self.mo_energy = numpy.hstack((self.mo_energy[self.mo_occ> 0][o_sort],\n self.mo_energy[self.mo_occ==0][v_sort]))\n self.mo_coeff = numpy.hstack((self.mo_coeff[:,self.mo_occ> 0].take(o_sort, axis=1),\n@@ -276,6 +272,8 @@ def get_irrep_nelec(self, mol=None, mo_coeff=None, mo_occ=None, s=None):\n def get_orbsym(self, mo_coeff=None, s=None):\n if mo_coeff is None:\n mo_coeff = self.mo_coeff\n+ if getattr(mo_coeff, 'orbsym', None) is not None:\n+ return mo_coeff.orbsym\n if s is None:\n s = self.get_ovlp()\n return numpy.asarray(get_orbsym(self.mol, mo_coeff, s))\ndiff --git a/pyscf/scf/hf_symm.py b/pyscf/scf/hf_symm.py\nindex 2e5d577bd5..40eab05874 100644\n--- a/pyscf/scf/hf_symm.py\n+++ b/pyscf/scf/hf_symm.py\n@@ -53,9 +53,6 @@ def analyze(mf, verbose=logger.DEBUG, with_meta_lowdin=WITH_META_LOWDIN,\n from pyscf.lo import orth\n from pyscf.tools import dump_mat\n mol = mf.mol\n- if not mol.symmetry:\n- return hf.analyze(mf, verbose, with_meta_lowdin, **kwargs)\n-\n mo_energy = mf.mo_energy\n mo_occ = mf.mo_occ\n mo_coeff = mf.mo_coeff\n@@ -153,8 +150,7 @@ def canonicalize(mf, mo_coeff, mo_occ, fock=None):\n '''\n mol = mf.mol\n if not mol.symmetry:\n- return hf.canonicalize(mf, mo_coeff, mo_occ, fock)\n-\n+ raise RuntimeError('mol.symmetry not enabled')\n if fock is None:\n dm = mf.make_rdm1(mo_coeff, mo_occ)\n fock = mf.get_hcore() + mf.get_veff(mf.mol, dm)\n@@ -305,7 +301,7 @@ def eig(mf, h, s, symm_orb=None, irrep_id=None):\n mol = mf.mol\n if symm_orb is None or irrep_id is None:\n if not mol.symmetry:\n- return mf._eigh(h, s)\n+ raise RuntimeError('mol.symmetry not enabled')\n symm_orb = mol.symm_orb\n irrep_id = mol.irrep_id\n \n@@ -344,14 +340,15 @@ def eig(mf, h, s, symm_orb=None, irrep_id=None):\n return e, c\n \n def get_orbsym(mol, mo_coeff, s=None, check=False, symm_orb=None, irrep_id=None):\n+ if getattr(mo_coeff, 'orbsym', None) is not None:\n+ return mo_coeff.orbsym\n+\n if symm_orb is None or irrep_id is None:\n symm_orb = mol.symm_orb\n irrep_id = mol.irrep_id\n if mo_coeff is None:\n orbsym = numpy.hstack([[ir] * symm_orb[i].shape[1]\n for i, ir in enumerate(irrep_id)])\n- elif getattr(mo_coeff, 'orbsym', None) is not None:\n- orbsym = mo_coeff.orbsym\n else:\n orbsym = symm.label_orb_symm(mol, irrep_id, symm_orb,\n mo_coeff, s, check)\n@@ -445,33 +442,32 @@ def __init__(self, mol):\n \n def build(self, mol=None):\n if mol is None: mol = self.mol\n- if mol.symmetry:\n- check_irrep_nelec(mol, self.irrep_nelec, self.mol.nelectron)\n+ if not mol.symmetry:\n+ raise RuntimeError('mol.symmetry not enabled')\n+ check_irrep_nelec(mol, self.irrep_nelec, self.mol.nelectron)\n return hf.RHF.build(self, mol)\n \n eig = eig\n \n def get_grad(self, mo_coeff, mo_occ, fock=None):\n g = hf.RHF.get_grad(self, mo_coeff, mo_occ, fock)\n- if self.mol.symmetry:\n- occidx = mo_occ > 0\n- viridx = ~occidx\n- orbsym = self.get_orbsym(mo_coeff, self.get_ovlp())\n- sym_forbid = orbsym[viridx].reshape(-1,1) != orbsym[occidx]\n- g[sym_forbid.ravel()] = 0\n+ occidx = mo_occ > 0\n+ viridx = ~occidx\n+ orbsym = self.get_orbsym(mo_coeff)\n+ sym_forbid = orbsym[viridx].reshape(-1,1) != orbsym[occidx]\n+ g[sym_forbid.ravel()] = 0\n return g\n \n def get_occ(self, mo_energy=None, mo_coeff=None):\n ''' We assumed mo_energy are grouped by symmetry irreps, (see function\n self.eig). The orbitals are sorted after SCF.\n '''\n-\n if mo_energy is None: mo_energy = self.mo_energy\n mol = self.mol\n if not mol.symmetry:\n- return hf.RHF.get_occ(self, mo_energy, mo_coeff)\n+ raise RuntimeError('mol.symmetry not enabled')\n \n- orbsym = self.get_orbsym(mo_coeff, self.get_ovlp())\n+ orbsym = self.get_orbsym(mo_coeff)\n mo_occ = numpy.zeros_like(mo_energy)\n rest_idx = numpy.ones(mo_occ.size, dtype=bool)\n nelec_fix = 0\n@@ -528,7 +524,7 @@ def _finalize(self):\n idx[self.mo_occ==0][v_sort]))\n self.mo_energy = self.mo_energy[idx]\n self.mo_occ = self.mo_occ[idx]\n- orbsym = self.get_orbsym(self.mo_coeff, self.get_ovlp())\n+ orbsym = self.get_orbsym(self.mo_coeff)\n orbsym = orbsym[idx]\n degen_mapping = None\n if self.mol.groupname in ('Dooh', 'Coov'):\n@@ -563,6 +559,8 @@ def get_irrep_nelec(self, mol=None, mo_coeff=None, mo_occ=None, s=None):\n def get_orbsym(self, mo_coeff=None, s=None):\n if mo_coeff is None:\n mo_coeff = self.mo_coeff\n+ if getattr(mo_coeff, 'orbsym', None) is not None:\n+ return mo_coeff.orbsym\n if s is None:\n s = self.get_ovlp()\n return numpy.asarray(get_orbsym(self.mol, mo_coeff, s))\n@@ -615,21 +613,22 @@ def dump_flags(self, verbose=None):\n \n def build(self, mol=None):\n if mol is None: mol = self.mol\n- if mol.symmetry:\n- fix_na, fix_nb = check_irrep_nelec(mol, self.irrep_nelec, self.nelec)[:2]\n- alpha_open = beta_open = False\n- for ne in self.irrep_nelec.values():\n- if not isinstance(ne, (int, numpy.integer)):\n- alpha_open |= ne[0] > ne[1]\n- beta_open |= ne[0] < ne[1]\n-\n- frozen_spin = fix_na - fix_nb\n- if ((alpha_open and beta_open) or\n- (0 < mol.spin < frozen_spin) or (frozen_spin < 0 < mol.spin) or\n- (frozen_spin < mol.spin < 0) or (mol.spin < 0 < frozen_spin)):\n- raise ValueError('Low-spin configuration was found in '\n- 'the irrep_nelec input. ROHF does not '\n- 'support low-spin configuration.')\n+ if not mol.symmetry:\n+ raise RuntimeError('mol.symmetry not enabled')\n+ fix_na, fix_nb = check_irrep_nelec(mol, self.irrep_nelec, self.nelec)[:2]\n+ alpha_open = beta_open = False\n+ for ne in self.irrep_nelec.values():\n+ if not isinstance(ne, (int, numpy.integer)):\n+ alpha_open |= ne[0] > ne[1]\n+ beta_open |= ne[0] < ne[1]\n+\n+ frozen_spin = fix_na - fix_nb\n+ if ((alpha_open and beta_open) or\n+ (0 < mol.spin < frozen_spin) or (frozen_spin < 0 < mol.spin) or\n+ (frozen_spin < mol.spin < 0) or (mol.spin < 0 < frozen_spin)):\n+ raise ValueError('Low-spin configuration was found in '\n+ 'the irrep_nelec input. ROHF does not '\n+ 'support low-spin configuration.')\n return hf.RHF.build(self, mol)\n \n @lib.with_doc(eig.__doc__)\n@@ -643,25 +642,24 @@ def eig(self, fock, s):\n \n def get_grad(self, mo_coeff, mo_occ, fock=None):\n g = rohf.ROHF.get_grad(self, mo_coeff, mo_occ, fock)\n- if self.mol.symmetry:\n- occidxa = mo_occ > 0\n- occidxb = mo_occ == 2\n- viridxa = ~occidxa\n- viridxb = ~occidxb\n- uniq_var_a = viridxa.reshape(-1,1) & occidxa\n- uniq_var_b = viridxb.reshape(-1,1) & occidxb\n-\n- orbsym = self.get_orbsym(mo_coeff, self.get_ovlp())\n- sym_forbid = orbsym.reshape(-1,1) != orbsym\n- sym_forbid = sym_forbid[uniq_var_a | uniq_var_b]\n- g[sym_forbid.ravel()] = 0\n+ occidxa = mo_occ > 0\n+ occidxb = mo_occ == 2\n+ viridxa = ~occidxa\n+ viridxb = ~occidxb\n+ uniq_var_a = viridxa.reshape(-1,1) & occidxa\n+ uniq_var_b = viridxb.reshape(-1,1) & occidxb\n+\n+ orbsym = self.get_orbsym(mo_coeff)\n+ sym_forbid = orbsym.reshape(-1,1) != orbsym\n+ sym_forbid = sym_forbid[uniq_var_a | uniq_var_b]\n+ g[sym_forbid.ravel()] = 0\n return g\n \n def get_occ(self, mo_energy=None, mo_coeff=None):\n if mo_energy is None: mo_energy = self.mo_energy\n mol = self.mol\n if not mol.symmetry:\n- return rohf.ROHF.get_occ(self, mo_energy, mo_coeff)\n+ raise RuntimeError('mol.symmetry not enabled')\n \n if getattr(mo_energy, 'mo_ea', None) is not None:\n mo_ea = mo_energy.mo_ea\n@@ -670,8 +668,7 @@ def get_occ(self, mo_energy=None, mo_coeff=None):\n mo_ea = mo_eb = mo_energy\n nmo = mo_ea.size\n mo_occ = numpy.zeros(nmo)\n-\n- orbsym = self.get_orbsym(mo_coeff, self.get_ovlp())\n+ orbsym = self.get_orbsym(mo_coeff)\n \n rest_idx = numpy.ones(mo_occ.size, dtype=bool)\n neleca_fix = 0\n@@ -790,7 +787,7 @@ def _finalize(self):\n else:\n self.mo_energy = self.mo_energy[idx]\n self.mo_occ = self.mo_occ[idx]\n- orbsym = self.get_orbsym(self.mo_coeff, self.get_ovlp())\n+ orbsym = self.get_orbsym(self.mo_coeff)\n orbsym = orbsym[idx]\n degen_mapping = None\n if self.mol.groupname in ('Dooh', 'Coov'):\n@@ -813,9 +810,6 @@ def analyze(self, verbose=None, with_meta_lowdin=WITH_META_LOWDIN,\n if verbose is None: verbose = self.verbose\n from pyscf.lo import orth\n from pyscf.tools import dump_mat\n- if not self.mol.symmetry:\n- return rohf.ROHF.analyze(self, verbose, with_meta_lowdin, **kwargs)\n-\n mol = self.mol\n mo_energy = self.mo_energy\n mo_occ = self.mo_occ\n@@ -826,7 +820,7 @@ def analyze(self, verbose=None, with_meta_lowdin=WITH_META_LOWDIN,\n self.dump_scf_summary(log)\n \n nirrep = len(mol.irrep_id)\n- orbsym = self.get_orbsym(mo_coeff, self.get_ovlp())\n+ orbsym = self.get_orbsym(mo_coeff)\n irreps = numpy.asarray(mol.irrep_id)\n ndoccs = numpy.count_nonzero(irreps[:,None] == orbsym[mo_occ==2], axis=1)\n nsoccs = numpy.count_nonzero(irreps[:,None] == orbsym[mo_occ==1], axis=1)\n@@ -926,12 +920,7 @@ def canonicalize(self, mo_coeff, mo_occ, fock=None):\n mo_e = lib.tag_array(mo_e, mo_ea=mo_ea, mo_eb=mo_eb)\n return mo_e, mo_coeff\n \n- def get_orbsym(self, mo_coeff=None, s=None):\n- if mo_coeff is None:\n- mo_coeff = self.mo_coeff\n- if s is None:\n- s = self.get_ovlp()\n- return numpy.asarray(get_orbsym(self.mol, mo_coeff, s))\n+ get_orbsym = SymAdaptedRHF.get_orbsym\n orbsym = property(get_orbsym)\n \n get_wfnsym = get_wfnsym\ndiff --git a/pyscf/scf/uhf_symm.py b/pyscf/scf/uhf_symm.py\nindex 447457d371..5acbe23d62 100644\n--- a/pyscf/scf/uhf_symm.py\n+++ b/pyscf/scf/uhf_symm.py\n@@ -41,9 +41,6 @@ def analyze(mf, verbose=logger.DEBUG, with_meta_lowdin=WITH_META_LOWDIN,\n from pyscf.lo import orth\n from pyscf.tools import dump_mat\n mol = mf.mol\n- if not mol.symmetry:\n- return uhf.analyze(mf, verbose, with_meta_lowdin, **kwargs)\n-\n mo_energy = mf.mo_energy\n mo_occ = mf.mo_occ\n mo_coeff = mf.mo_coeff\n@@ -193,8 +190,7 @@ def canonicalize(mf, mo_coeff, mo_occ, fock=None):\n '''\n mol = mf.mol\n if not mol.symmetry:\n- return uhf.canonicalize(mf, mo_coeff, mo_occ, fock)\n-\n+ raise RuntimeError('mol.symmetry not enabled')\n mo_occ = numpy.asarray(mo_occ)\n assert (mo_occ.ndim == 2)\n if fock is None:\n@@ -326,15 +322,13 @@ def dump_flags(self, verbose=None):\n \n def build(self, mol=None):\n if mol is None: mol = self.mol\n- if mol.symmetry:\n- hf_symm.check_irrep_nelec(mol, self.irrep_nelec, self.nelec)\n+ if not mol.symmetry:\n+ raise RuntimeError('mol.symmetry not enabled')\n+ hf_symm.check_irrep_nelec(mol, self.irrep_nelec, self.nelec)\n return uhf.UHF.build(self, mol)\n \n def eig(self, h, s):\n mol = self.mol\n- if not mol.symmetry:\n- return self._eigh(h, s)\n-\n nirrep = mol.symm_orb.__len__()\n s = symm.symmetrize_matrix(s, mol.symm_orb)\n ha = symm.symmetrize_matrix(h[0], mol.symm_orb)\n@@ -391,17 +385,16 @@ def eig(self, h, s):\n \n def get_grad(self, mo_coeff, mo_occ, fock=None):\n g = uhf.UHF.get_grad(self, mo_coeff, mo_occ, fock)\n- if self.mol.symmetry:\n- occidxa = mo_occ[0] > 0\n- occidxb = mo_occ[1] > 0\n- viridxa = ~occidxa\n- viridxb = ~occidxb\n- orbsyma, orbsymb = self.get_orbsym(mo_coeff, self.get_ovlp())\n- sym_forbida = orbsyma[viridxa].reshape(-1,1) != orbsyma[occidxa]\n- sym_forbidb = orbsymb[viridxb].reshape(-1,1) != orbsymb[occidxb]\n- sym_forbid = numpy.hstack((sym_forbida.ravel(),\n- sym_forbidb.ravel()))\n- g[sym_forbid] = 0\n+ occidxa = mo_occ[0] > 0\n+ occidxb = mo_occ[1] > 0\n+ viridxa = ~occidxa\n+ viridxb = ~occidxb\n+ orbsyma, orbsymb = self.get_orbsym(mo_coeff)\n+ sym_forbida = orbsyma[viridxa].reshape(-1,1) != orbsyma[occidxa]\n+ sym_forbidb = orbsymb[viridxb].reshape(-1,1) != orbsymb[occidxb]\n+ sym_forbid = numpy.hstack((sym_forbida.ravel(),\n+ sym_forbidb.ravel()))\n+ g[sym_forbid] = 0\n return g\n \n def get_occ(self, mo_energy=None, mo_coeff=None):\n@@ -411,9 +404,9 @@ def get_occ(self, mo_energy=None, mo_coeff=None):\n if mo_energy is None: mo_energy = self.mo_energy\n mol = self.mol\n if not mol.symmetry:\n- return uhf.UHF.get_occ(self, mo_energy, mo_coeff)\n+ raise RuntimeError('mol.symmetry not enabled')\n \n- orbsyma, orbsymb = self.get_orbsym(mo_coeff, self.get_ovlp())\n+ orbsyma, orbsymb = self.get_orbsym(mo_coeff)\n mo_occ = numpy.zeros_like(mo_energy)\n idx_ea_left = []\n idx_eb_left = []\n@@ -516,7 +509,7 @@ def _finalize(self):\n idxb = numpy.hstack((idxb[self.mo_occ[1]> 0][ob_sort],\n idxb[self.mo_occ[1]==0][vb_sort]))\n self.mo_energy = (ea[idxa], eb[idxb])\n- orbsyma, orbsymb = self.get_orbsym(self.mo_coeff, self.get_ovlp())\n+ orbsyma, orbsymb = self.get_orbsym(self.mo_coeff)\n orbsyma = orbsyma[idxa]\n orbsymb = orbsymb[idxb]\n degen_a = degen_b = None\n@@ -558,6 +551,8 @@ def get_irrep_nelec(self, mol=None, mo_coeff=None, mo_occ=None, s=None):\n def get_orbsym(self, mo_coeff=None, s=None):\n if mo_coeff is None:\n mo_coeff = self.mo_coeff\n+ if getattr(mo_coeff, 'orbsym', None) is not None:\n+ return mo_coeff.orbsym\n if s is None:\n s = self.get_ovlp()\n return get_orbsym(self.mol, mo_coeff, s)\n"}, "test": {"test_patch": "diff --git a/pyscf/scf/test/test_diis.py b/pyscf/scf/test/test_diis.py\nindex 442c5a716a..afa53d989b 100644\n--- a/pyscf/scf/test/test_diis.py\n+++ b/pyscf/scf/test/test_diis.py\n@@ -94,6 +94,17 @@ def test_diis_restart(self):\n e = mf.kernel()\n self.assertAlmostEqual(e, eref, 9)\n \n+ # issue 1524\n+ def test_diis_for_symmetry_adapted_scf(self):\n+ mol = gto.M(atom='O', spin=2, basis='ccpvdz', symmetry=True)\n+ mf = mol.ROHF()\n+ mf.init_guess = '1e'\n+ mf.irrep_nelec = {'s+0' : (2,2), 'p-1' : (1,0), 'p+0' : (1,0), 'p+1' : (1,1) }\n+ mf.kernel()\n+ self.assertTrue(mf.converged)\n+ self.assertAlmostEqual(mf.e_tot, -74.7874921601008, 9)\n+\n \n if __name__ == \"__main__\":\n print(\"Full Tests for DIIS\")\ndiff --git a/pyscf/scf/test/test_rhf.py b/pyscf/scf/test/test_rhf.py\nindex 1109b7ff7e..ffd4876fef 100644\n--- a/pyscf/scf/test/test_rhf.py\n+++ b/pyscf/scf/test/test_rhf.py\n@@ -590,8 +590,7 @@ def test_rohf_symm_get_occ(self):\n [0, 2, 0, 0, 0, 1, 2, 0, 1, 2, 0, 0, 2, 0, 2, 0, 0, 0, 0, 2]))\n \n mf1 = scf.RHF(mol).set(verbose=0).view(scf.hf_symm.ROHF)\n- self.assertTrue(numpy.allclose(mf1.get_occ(energy, mo_coeff),\n- [0 ,2 ,0 ,0 ,0 ,0 ,2 ,0 ,0 ,0 ,0 ,0 ,2 ,0 ,2 ,0 ,0 ,0 ,0 ,2]))\n+ self.assertRaises(RuntimeError, mf1.get_occ, energy, mo_coeff)\n \n def test_get_occ_extreme_case(self):\n mol = gto.M(atom='He', verbose=7, output='/dev/null')\n", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}120{"question_id": "MSB_pyscf_pyscf_pr1643", "question_type": "multi_swe_bench", "description": "Fix molecule orientation bug for C2v symmetry (pyscf/pyscf#1643)", "content": {"org": "pyscf", "repo": "pyscf", "pr_number": 1643, "issue_title": "Fix molecule orientation bug for C2v symmetry", "issue_body": "Fix issue #1464 ", "base_commit": "15920e60e32ef471f639505720ab18f0ef2c7da9", "resolved_issues": [{"number": 1464, "title": "Inconsistent symmetries under trivial transformation", "body": "I have just upgraded to pyscf 2.1.1 and encountered some unexpected behaviour in orbital symmetries. I have a C2v CH2 molecule, and the orbital symmetries are different when I have a coordinate in the molecule which is zero for all atoms:\r\n```\r\n from pyscf import gto, scf, symm\r\n basis = \"sto3g\"\r\n\r\n geom = [\r\n [\"C\", [0.0000000, 0.0000000, 0.1238210]],\r\n [\"H\", [0.0000000, 0.9620540, -0.3714630]],\r\n [\"H\", [0.0000000, -0.9620540, -0.3714630]],\r\n ]\r\n mol = gto.Mole(\r\n atom=geom,\r\n basis=basis,\r\n spin=2,\r\n symmetry=True,\r\n )\r\n mol.build()\r\n mf = scf.ROHF(mol)\r\n mf.kernel()\r\n osym = symm.addons.label_orb_symm(\r\n mol,\r\n mol.irrep_name,\r\n mol.symm_orb,\r\n mf.mo_coeff\r\n )\r\n\r\n # Shifting everything along x...\r\n geom_shift = [\r\n [\"C\", [1.0000000, 0.0000000, 0.1238210]],\r\n [\"H\", [1.0000000, 0.9620540, -0.3714630]],\r\n [\"H\", [1.0000000, -0.9620540, -0.3714630]],\r\n ]\r\n mol_shift = gto.Mole(\r\n atom=geom_shift,\r\n basis=basis,\r\n spin=2,\r\n symmetry=True,\r\n )\r\n mf_shift = scf.ROHF(mol_shift)\r\n mf_shift.kernel()\r\n osym_shift = symm.addons.label_orb_symm(\r\n mol_shift,\r\n mol_shift.irrep_name,\r\n mol_shift.symm_orb,\r\n mf_shift.mo_coeff\r\n )\r\n\r\n print(osym)\r\n print(osym_shift)\r\n```\r\nthis outputs:\r\n```\r\n['A1' 'A1' 'B2' 'A1' 'B1' 'A1' 'B2']\r\n['A1' 'A1' 'B1' 'A1' 'B2' 'A1' 'B1']\r\n```\r\nBoth calculations arrive at the same energy (-38.431653993852), and the latter calculation (with the shifted coords) is consistent with the unshifted molecule in pyscf 2.0, and with an equivalent calculation in nwchem."}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/pyscf_m_pyscf:pr-1643", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/pyscf/symm/geom.py b/pyscf/symm/geom.py\nindex 1915e84048..89cf7e480e 100644\n--- a/pyscf/symm/geom.py\n+++ b/pyscf/symm/geom.py\n@@ -118,34 +118,32 @@ def alias_axes(axes, ref):\n new_axes = axes[[y_id,x_id,z_id]]\n return new_axes\n \n-def _adjust_planar_c2v(atom_coords, center, axes):\n+def _adjust_planar_c2v(atom_coords, axes):\n '''Adjust axes for planar molecules'''\n # Following http://iopenshell.usc.edu/resources/howto/symmetry/\n # See also dicussions in issue #1201\n # * planar C2v molecules should be oriented such that the X axis is perpendicular\n # to the plane of the molecule, and the Z axis is the axis of symmetry;\n- r = atom_coords - center\n natm = len(atom_coords)\n tol = TOLERANCE / numpy.sqrt(1+natm)\n- atoms_on_xz = abs(r.dot(axes[1])) < tol\n+ atoms_on_xz = abs(atom_coords.dot(axes[1])) < tol\n if all(atoms_on_xz):\n # rotate xy\n axes = numpy.array([-axes[1], axes[0], axes[2]])\n return axes\n \n-def _adjust_planar_d2h(atom_coords, center, axes):\n+def _adjust_planar_d2h(atom_coords, axes):\n '''Adjust axes for planar molecules'''\n # Following http://iopenshell.usc.edu/resources/howto/symmetry/\n # See also dicussions in issue #1201\n # * planar D2h molecules should be oriented such that the X axis is\n # perpendicular to the plane of the molecule, and the Z axis passes through\n # the greatest number of atoms.\n- r = atom_coords - center\n natm = len(atom_coords)\n tol = TOLERANCE / numpy.sqrt(1+natm)\n- natm_with_x = numpy.count_nonzero(abs(r.dot(axes[0])) > tol)\n- natm_with_y = numpy.count_nonzero(abs(r.dot(axes[1])) > tol)\n- natm_with_z = numpy.count_nonzero(abs(r.dot(axes[2])) > tol)\n+ natm_with_x = numpy.count_nonzero(abs(atom_coords.dot(axes[0])) > tol)\n+ natm_with_y = numpy.count_nonzero(abs(atom_coords.dot(axes[1])) > tol)\n+ natm_with_z = numpy.count_nonzero(abs(atom_coords.dot(axes[2])) > tol)\n if natm_with_z == 0: # atoms on xy plane\n if natm_with_x >= natm_with_y: # atoms-on-y >= atoms-on-x\n # rotate xz\n@@ -292,7 +290,7 @@ def detect_symm(atoms, basis=None, verbose=logger.WARN):\n if rawsys.has_icenter():\n gpname = 'D2h'\n # _adjust_planar_d2h is unlikely to be called\n- axes = _adjust_planar_d2h(rawsys.atom_coords, charge_center, axes)\n+ axes = _adjust_planar_d2h(rawsys.atom_coords, axes)\n else:\n gpname = 'D2'\n axes = alias_axes(axes, numpy.eye(3))\n@@ -305,7 +303,7 @@ def detect_symm(atoms, basis=None, verbose=logger.WARN):\n gpname = 'C2h'\n elif rawsys.has_mirror(axes[0]):\n gpname = 'C2v'\n- axes = _adjust_planar_c2v(rawsys.atom_coords, charge_center, axes)\n+ axes = _adjust_planar_c2v(rawsys.atom_coords, axes)\n else:\n gpname = 'C2'\n else:\n"}, "test": {"test_patch": "diff --git a/pyscf/symm/test/test_geom.py b/pyscf/symm/test/test_geom.py\nindex dd8c8475e4..4fd7c8fadd 100644\n--- a/pyscf/symm/test/test_geom.py\n+++ b/pyscf/symm/test/test_geom.py\n@@ -876,6 +876,16 @@ def test_sort_coords(self):\n idx = symm.argsort_coords(c)\n self.assertAlmostEqual(abs(c[idx] - c0).max(), 0, 9)\n \n+ def test_c2v_shifted(self):\n+ atoms = [\n+ [\"C\", [1.0000000, 0.0000000, 0.1238210]],\n+ [\"H\", [1.0000000, 0.9620540, -0.3714630]],\n+ [\"H\", [1.0000000, -0.9620540, -0.3714630]],\n+ ]\n+ l, orig, axes = geom.detect_symm(atoms)\n+ self.assertEqual(l, 'C2v')\n+ self.assertAlmostEqual(abs(axes - numpy.diag(axes.diagonal())).max(), 0, 9)\n+\n \n def ring(n, start=0):\n r = 1. / numpy.sin(numpy.pi/n)\n", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}121{"question_id": "MSB_pyscf_pyscf_pr1773", "question_type": "multi_swe_bench", "description": "fix supercell with symmetry (pyscf/pyscf#1773)", "content": {"org": "pyscf", "repo": "pyscf", "pr_number": 1773, "issue_title": "fix supercell with symmetry", "issue_body": "Fix issue #1758.", "base_commit": "fc9995cad1318409303ba939d230d02196aa8109", "resolved_issues": [{"number": 1758, "title": "Error when calculating the IAOs of a supercell with space_group_symmetry=True.", "body": "Hello!\r\nI've come across an error when trying to obtain the IAOs of a supercell generated from a cell initialised with space group symmetry.\r\nA minimal example reproducing the issue is\r\n```\r\nimport pyscf.lo\r\nimport pyscf.pbc\r\nimport numpy as np\r\n\u200b\r\ncell = pyscf.pbc.gto.Cell()\r\ncell.atom = ['He 0.0 0.0 0.0']\r\ncell.a = 1.4 * np.eye(3)\r\ncell.basis = 'def2-svp'\r\ncell.output = 'pyscf.out'\r\ncell.space_group_symmetry = True\r\ncell.symmorphic = True\r\ncell.build()\r\n\u200b\r\nscell = pyscf.pbc.tools.super_cell(cell, (2,2,2))\r\npyscf.lo.iao.reference_mol(scell, minao=\"sto-3g\")\r\n```\r\n\r\nwhich gives traceback\r\n\r\n```\r\nTraceback (most recent call last):\r\n File \"testscript.py\", line 16, in <module>\r\n pyscf.lo.iao.reference_mol(scell, minao=\"sto-3g\")\r\n File \"python3.10/site-packages/pyscf/lo/iao.py\", line 135, in reference_mol\r\n pmol.build(False, False, basis=minao)\r\n File \"python3.10/site-packages/pyscf/pbc/gto/cell.py\", line 1516, in build\r\n _lattice_symm.build(space_group_symmetry=True,\r\n File \"python3.10/site-packages/pyscf/pbc/symm/symmetry.py\", line 176, in build\r\n self.spacegroup = space_group.SpaceGroup(cell).build(dump_info=False)\r\n File \"python3.10/site-packages/pyscf/pbc/symm/space_group.py\", line 302, in build\r\n self.ops = geom.search_space_group_ops(self.cell, tol=self.symprec)\r\n File \"python3.10/site-packages/pyscf/pbc/symm/geom.py\", line 81, in search_space_group_ops\r\n atmgrp = mole.atom_types(cell._atom, magmom=cell.magmom)\r\n File \"python3.10/site-packages/pyscf/gto/mole.py\", line 308, in atom_types\r\n uniq_mag = np.unique(magmom[idx])\r\nIndexError: index 1 is out of bounds for axis 0 with size 1\r\n```\r\n\r\nThis can be avoided by disabling space group symmetry initially or in the supercell object after generation, but I don't know whether that should be necessary. Any advice as to whether this is an intended incompatibility would be greatly appreciated.\r\n"}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/pyscf_m_pyscf:pr-1773", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/pyscf/gto/mole.py b/pyscf/gto/mole.py\nindex 97e3c650ba..1d832b2b43 100644\n--- a/pyscf/gto/mole.py\n+++ b/pyscf/gto/mole.py\n@@ -304,7 +304,7 @@ def atom_types(atoms, basis=None, magmom=None):\n \n if magmom is not None:\n atmgroup_new = {}\n- suffix = {1.0:'u', -1.0:'d', 0.0:'o'}\n+ suffix = {1:'u', -1:'d', 0:'o'}\n magmom = np.asarray(magmom)\n for elem, idx in atmgroup.items():\n uniq_mag = np.unique(magmom[idx])\n@@ -312,7 +312,7 @@ def atom_types(atoms, basis=None, magmom=None):\n for i, mag in enumerate(uniq_mag):\n subgrp = np.asarray(idx)[np.where(magmom[idx] == mag)[0]]\n if mag not in suffix:\n- raise RuntimeError(\"Magmom should be chosen from [-1., 0., 1.], but %s is given\" % mag)\n+ raise RuntimeError(\"Magmom should be chosen from [-1, 0, 1], but %s is given\" % mag)\n atmgroup_new[elem+'_'+suffix[mag]] = subgrp.tolist()\n else:\n atmgroup_new[elem] = idx\n@@ -2160,7 +2160,7 @@ class Mole(lib.StreamObject):\n cart : boolean\n Using Cartesian GTO basis and integrals (6d,10f,15g)\n magmom : list\n- Collinear spin of each atom. Default is [0.0,]*natm\n+ Collinear spin of each atom. Default is [0,]*natm\n \n ** Following attributes are generated by :func:`Mole.build` **\n \n@@ -2259,7 +2259,7 @@ def __init__(self, **kwargs):\n self.ecp = {}\n # Nuclear property. self.nucprop = {atom_symbol: {key: value}}\n self.nucprop = {}\n-# Collinear spin of each atom. self.magmom = [0., ...]\n+# Collinear spin of each atom. self.magmom = [0, ...]\n self.magmom = []\n ##################################################\n # don't modify the following private variables, they are not input options\n@@ -2470,7 +2470,7 @@ def build(self, dump_input=True, parse_arg=ARGPARSE,\n Whether to use symmetry. If given a string of point group\n name, the given point group symmetry will be used.\n magmom : list\n- Collinear spin of each atom. Default is [0.0,]*natm\n+ Collinear spin of each atom. Default is [0,]*natm\n \n '''\n if not DISABLE_GC:\n@@ -2563,9 +2563,9 @@ def build(self, dump_input=True, parse_arg=ARGPARSE,\n # number of electrons are consistent.\n self.nelec\n \n- if not self.magmom:\n- self.magmom = [0.,]*self.natm\n- if self.spin == 0 and abs(numpy.sum(numpy.asarray(self.magmom)) - self.spin) > 1e-6:\n+ if self.magmom is None or len(self.magmom) != self.natm:\n+ self.magmom = [0,] * self.natm\n+ if self.spin == 0 and abs(numpy.sum(self.magmom) - self.spin) > 1e-6:\n #don't check for unrestricted calcs.\n raise ValueError(\"mol.magmom is set incorrectly.\")\n \ndiff --git a/pyscf/pbc/gto/cell.py b/pyscf/pbc/gto/cell.py\nindex 075a69e8eb..8ae280772a 100644\n--- a/pyscf/pbc/gto/cell.py\n+++ b/pyscf/pbc/gto/cell.py\n@@ -276,12 +276,7 @@ def byteify(inp):\n # Symmetry class cannot be serialized by dumps function.\n # Recreate it manually\n if cell.natm > 0 and cell.space_group_symmetry:\n- from pyscf.pbc.symm import Symmetry\n- _lattice_symm = Symmetry(cell)\n- _lattice_symm.build(space_group_symmetry=True,\n- symmorphic=cell.symmorphic,\n- check_mesh_symmetry=False)\n- cell.lattice_symmetry = _lattice_symm\n+ cell.build_lattice_symmetry()\n \n return cell\n \n@@ -1268,6 +1263,32 @@ def symmetrize_mesh(self, mesh=None):\n logger.debug(self, 'mesh %s is symmetrized as %s', mesh, mesh1)\n return mesh1\n \n+ def build_lattice_symmetry(self, check_mesh_symmetry=True):\n+ '''Build cell.lattice_symmetry object.\n+\n+ Kwargs:\n+ check_mesh_symmetry : bool\n+ For nonsymmorphic symmetry groups, `cell.mesh` may have\n+ lower symmetry than the lattice. In this case, if\n+ `check_mesh_symmetry` is `True`, the lower symmetry group will\n+ be used. Otherwise, if `check_mesh_symmetry` is `False`,\n+ the mesh grid will be modified to satisfy the higher symmetry.\n+ Default value is `True`.\n+\n+ Note:\n+ This function modifies the attributes of `cell`.\n+ '''\n+ from pyscf.pbc.symm import Symmetry\n+ self.lattice_symmetry = Symmetry(self).build(\n+ space_group_symmetry=True,\n+ symmorphic=self.symmorphic,\n+ check_mesh_symmetry=check_mesh_symmetry)\n+ if not check_mesh_symmetry:\n+ _mesh_from_build = self._mesh_from_build\n+ self.mesh = self.symmetrize_mesh()\n+ self._mesh_from_build = _mesh_from_build\n+ return self\n+\n #Note: Exculde dump_input, parse_arg, basis from kwargs to avoid parsing twice\n def build(self, dump_input=True, parse_arg=mole.ARGPARSE,\n a=None, mesh=None, ke_cutoff=None, precision=None, nimgs=None,\n@@ -1484,17 +1505,8 @@ def build(self, dump_input=True, parse_arg=mole.ARGPARSE,\n self._mesh_from_build = True\n \n if self.space_group_symmetry:\n- from pyscf.pbc.symm import Symmetry\n- _check_mesh_symm = False\n- if not self._mesh_from_build:\n- _check_mesh_symm = True\n- _lattice_symm = Symmetry(self)\n- _lattice_symm.build(space_group_symmetry=True,\n- symmorphic=self.symmorphic,\n- check_mesh_symmetry=_check_mesh_symm)\n- self.lattice_symmetry = _lattice_symm\n- if self._mesh_from_build:\n- self._mesh = self.symmetrize_mesh()\n+ _check_mesh_symm = not self._mesh_from_build\n+ self.build_lattice_symmetry(check_mesh_symmetry=_check_mesh_symm)\n \n if dump_input and not _built and self.verbose > logger.NOTE:\n self.dump_input()\ndiff --git a/pyscf/pbc/symm/geom.py b/pyscf/pbc/symm/geom.py\nindex 32b40c44bd..74119a4483 100644\n--- a/pyscf/pbc/symm/geom.py\n+++ b/pyscf/pbc/symm/geom.py\n@@ -224,7 +224,7 @@ def get_crystal_class(cell, ops=None, tol=SYMPREC):\n \"\"\"\n cell.a = [[4.0, 0., 0.], [0., 4.0, 0.], [0., 0., 16.0]]\n cell.dimension = 2\n- cell.magmom = [1., 1., -1., -1., 1., -1., 1., 1., -1., -1., 1., -1.]\n+ cell.magmom = [1, 1, -1, -1, 1, -1, 1, 1, -1, -1, 1, -1]\n cell.build()\n \n ops = search_space_group_ops(cell)\ndiff --git a/pyscf/pbc/tools/pbc.py b/pyscf/pbc/tools/pbc.py\nindex 9945c59f7f..985c0f2550 100644\n--- a/pyscf/pbc/tools/pbc.py\n+++ b/pyscf/pbc/tools/pbc.py\n@@ -589,6 +589,8 @@ def super_cell(cell, ncopy, wrap_around=False):\n supcell.a = np.einsum('i,ij->ij', ncopy, a)\n mesh = np.asarray(ncopy) * np.asarray(cell.mesh)\n supcell.mesh = (mesh // 2) * 2 + 1\n+ supcell.magmom = np.repeat(np.asarray(cell.magmom).reshape(1,-1),\n+ np.prod(ncopy), axis=0).ravel()\n return _build_supcell_(supcell, cell, Ls)\n \n \n@@ -621,6 +623,7 @@ def _build_supcell_(supcell, cell, Ls):\n Construct supcell ._env directly without calling supcell.build() method.\n This reserves the basis contraction coefficients defined in cell\n '''\n+ from pyscf.pbc import gto as pbcgto\n nimgs = len(Ls)\n symbs = [atom[0] for atom in cell._atom] * nimgs\n coords = Ls.reshape(-1,1,3) + cell.atom_coords()\n@@ -646,6 +649,9 @@ def _build_supcell_(supcell, cell, Ls):\n supcell._atm = np.asarray(_atm, dtype=np.int32)\n supcell._bas = np.asarray(_bas.reshape(-1, BAS_SLOTS), dtype=np.int32)\n supcell._env = _env\n+\n+ if isinstance(supcell, pbcgto.Cell) and supcell.space_group_symmetry:\n+ supcell.build_lattice_symmetry(not cell._mesh_from_build)\n return supcell\n \n \n"}, "test": {"test_patch": "diff --git a/pyscf/pbc/mp/test/test_ksym.py b/pyscf/pbc/mp/test/test_ksym.py\nindex faeb6188b7..42d7e0c39b 100644\n--- a/pyscf/pbc/mp/test/test_ksym.py\n+++ b/pyscf/pbc/mp/test/test_ksym.py\n@@ -29,6 +29,7 @@ def setUpModule():\n He.atom =[['He' , ( L/2+0., L/2+0., L/2+0.)],]\n He.basis = {'He': [[0, (4.0, 1.0)], [0, (1.0, 1.0)]]}\n He.space_group_symmetry=True\n+ He.output = '/dev/null'\n He.build()\n \n nk = [2,2,2]\n@@ -45,6 +46,7 @@ def setUpModule():\n \n def tearDownModule():\n global He, nk, kpts0, kpts, kmf0, kmf, kmp2ref\n+ He.stdout.close()\n del He, nk, kpts0, kpts, kmf0, kmf, kmp2ref\n \n class KnownValues(unittest.TestCase):\ndiff --git a/pyscf/pbc/symm/test/test_spg.py b/pyscf/pbc/symm/test/test_spg.py\nindex 4abc4a5948..02d8ab64f7 100644\n--- a/pyscf/pbc/symm/test/test_spg.py\n+++ b/pyscf/pbc/symm/test/test_spg.py\n@@ -55,7 +55,7 @@ class KnownValues(unittest.TestCase):\n @unittest.skipIf(not has_spglib, \"spglib not found\")\n def test_D4h_vs_spglib(self):\n dim = 3\n- magmom = [1., 1., -1., -1., 1., -1., 1., 1., -1., -1., 1., -1.]\n+ magmom = [1, 1, -1, -1, 1, -1, 1, 1, -1, -1, 1, -1]\n cell = make_cell_D4h(dim, magmom)\n sg = spg.SpaceGroup(cell)\n \n@@ -88,7 +88,7 @@ def test_D4h_2d(self):\n rot[0,2] == 0 and rot[1,2] == 0 and \n rot[2,2] != -1):\n ops2.append(op)\n- ops2.sort\n+ ops2.sort()\n \n dim = 2\n cell = make_cell_D4h(dim)\ndiff --git a/pyscf/pbc/tools/test/test_pbc.py b/pyscf/pbc/tools/test/test_pbc.py\nindex ee37c5bd84..3a8774f78e 100644\n--- a/pyscf/pbc/tools/test/test_pbc.py\n+++ b/pyscf/pbc/tools/test/test_pbc.py\n@@ -148,6 +148,16 @@ def test_super_cell(self):\n self.assertAlmostEqual(lib.fp(cl2.atom_coords()), -18.946080642714836, 9)\n self.assertAlmostEqual(lib.fp(cl2._bas[:,gto.ATOM_OF]), 16.515144238434807, 9)\n \n+ def test_super_cell_with_symm(self):\n+ cl1 = pbcgto.M(a = 1.4 * numpy.eye(3),\n+ atom ='''He .0 .0 .0''',\n+ basis = 'ccpvdz',\n+ space_group_symmetry=True,\n+ symmorphic=False)\n+ self.assertEqual(cl1.lattice_symmetry.nop, 48)\n+ cl2 = tools.super_cell(cl1, [2,2,2])\n+ self.assertEqual(cl2.lattice_symmetry.nop, 48*8)\n+\n def test_cell_plus_imgs(self):\n numpy.random.seed(2)\n cl1 = pbcgto.M(a = numpy.random.random((3,3))*3,\n", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}122{"question_id": "MSB_pyscf_pyscf_pr1803", "question_type": "multi_swe_bench", "description": "Bug in NAO symmetry-averaged density matrix (issue #1755) (pyscf/pyscf#1803)", "content": {"org": "pyscf", "repo": "pyscf", "pr_number": 1803, "issue_title": "Bug in NAO symmetry-averaged density matrix (issue #1755)", "issue_body": null, "base_commit": "f7f1b00f0c4fae397073e41f0f00daf5f2136160", "resolved_issues": [{"number": 1755, "title": "Problem with lo.nao.nao function : non-symmetric results for benzene", "body": "Hi,\r\nI'm trying to get natural atomic orbital populations using both lo.orth_ao or lo.nao.nao functions and it appears there is an issue because I don't get symmetric results for a d6h benzene geometry at RHF level. When calling lo.orth_ao with Lowdin or meta_lowdin I do get symmetric enough results.\r\nJust to confirm I was operating correctly with the matrices, I've just tried your example at \r\n[https://github.com/pyscf/pyscf/blob/master/examples/local_orb/01-pop_with_nao.py](url)\r\nbut using the following geometry\r\nmol.atom='''\r\n 6 -0.000000 -1.399560 0.000000\r\n 6 -1.212054 -0.699779 -0.000000\r\n 6 1.212054 -0.699779 -0.000000\r\n 1 -2.156901 -1.245293 0.000000\r\n 1 2.156901 -1.245293 0.000000\r\n 6 -1.212054 0.699779 0.000000\r\n 6 1.212054 0.699779 0.000000\r\n 1 -2.156901 1.245293 -0.000000\r\n 1 2.156901 1.245293 -0.000000\r\n 6 -0.000000 1.399560 -0.000000\r\n 1 0.000000 2.490576 0.000000\r\n 1 0.000000 -2.490576 -0.000000\r\n'''\r\n\r\nThe results printed are as follows:\r\n ** Mulliken pop **\r\npop of 0 C 1s 2.00000\r\npop of 0 C 2s 0.95998\r\npop of 0 C 3s 0.00097\r\npop of 0 C 2px 1.04921\r\npop of 0 C 2py 1.17158\r\npop of 0 C 2pz 0.99624\r\npop of 0 C 3px 0.00483\r\npop of 0 C 3py 0.00663\r\npop of 0 C 3pz 0.00130\r\npop of 0 C 3dxy 0.00736\r\npop of 0 C 3dyz 0.00134\r\npop of 0 C 3dz^2 0.00571\r\npop of 0 C 3dxz 0.00114\r\npop of 0 C 3dx2-y2 0.00332\r\npop of 1 C 1s 2.00000\r\npop of 1 C 2s 0.96229\r\npop of 1 C 3s 0.00096\r\npop of 1 C 2px 1.14762\r\npop of 1 C 2py 1.08598\r\npop of 1 C 2pz 1.00342\r\npop of 1 C 3px 0.00618\r\npop of 1 C 3py 0.00683\r\npop of 1 C 3pz 0.00086\r\npop of 1 C 3dxy 0.00434\r\npop of 1 C 3dyz 0.00119\r\npop of 1 C 3dz^2 0.00569\r\npop of 1 C 3dxz 0.00129\r\npop of 1 C 3dx2-y2 0.00630\r\npop of 2 C 1s 2.00000\r\npop of 2 C 2s 0.95762\r\npop of 2 C 3s 0.00099\r\npop of 2 C 2px 1.13327\r\npop of 2 C 2py 1.07281\r\npop of 2 C 2pz 0.98791\r\npop of 2 C 3px 0.00719\r\npop of 2 C 3py 0.00449\r\npop of 2 C 3pz 0.00265\r\npop of 2 C 3dxy 0.00432\r\npop of 2 C 3dyz 0.00120\r\npop of 2 C 3dz^2 0.00573\r\npop of 2 C 3dxz 0.00129\r\npop of 2 C 3dx2-y2 0.00640\r\npop of 3 H 1s 0.77763\r\npop of 3 H 2s 0.00206\r\npop of 3 H 2px 0.00411\r\npop of 3 H 2py 0.00208\r\npop of 3 H 2pz 0.00006\r\npop of 4 H 1s 0.78690\r\npop of 4 H 2s 0.00214\r\npop of 4 H 2px 0.00402\r\npop of 4 H 2py 0.00205\r\npop of 4 H 2pz 0.00006\r\npop of 5 C 1s 2.00000\r\npop of 5 C 2s 0.95762\r\npop of 5 C 3s 0.00099\r\npop of 5 C 2px 1.13327\r\npop of 5 C 2py 1.07281\r\npop of 5 C 2pz 0.98791\r\npop of 5 C 3px 0.00719\r\npop of 5 C 3py 0.00449\r\npop of 5 C 3pz 0.00265\r\npop of 5 C 3dxy 0.00432\r\npop of 5 C 3dyz 0.00120\r\npop of 5 C 3dz^2 0.00573\r\npop of 5 C 3dxz 0.00129\r\npop of 5 C 3dx2-y2 0.00640\r\npop of 6 C 1s 2.00000\r\npop of 6 C 2s 0.96229\r\npop of 6 C 3s 0.00096\r\npop of 6 C 2px 1.14762\r\npop of 6 C 2py 1.08598\r\npop of 6 C 2pz 1.00342\r\npop of 6 C 3px 0.00618\r\npop of 6 C 3py 0.00683\r\npop of 6 C 3pz 0.00086\r\npop of 6 C 3dxy 0.00434\r\npop of 6 C 3dyz 0.00119\r\npop of 6 C 3dz^2 0.00569\r\npop of 6 C 3dxz 0.00129\r\npop of 6 C 3dx2-y2 0.00630\r\npop of 7 H 1s 0.78690\r\npop of 7 H 2s 0.00214\r\npop of 7 H 2px 0.00402\r\npop of 7 H 2py 0.00205\r\npop of 7 H 2pz 0.00006\r\npop of 8 H 1s 0.77763\r\npop of 8 H 2s 0.00206\r\npop of 8 H 2px 0.00411\r\npop of 8 H 2py 0.00208\r\npop of 8 H 2pz 0.00006\r\npop of 9 C 1s 2.00000\r\npop of 9 C 2s 0.95998\r\npop of 9 C 3s 0.00097\r\npop of 9 C 2px 1.04921\r\npop of 9 C 2py 1.17158\r\npop of 9 C 2pz 0.99624\r\npop of 9 C 3px 0.00483\r\npop of 9 C 3py 0.00663\r\npop of 9 C 3pz 0.00130\r\npop of 9 C 3dxy 0.00736\r\npop of 9 C 3dyz 0.00134\r\npop of 9 C 3dz^2 0.00571\r\npop of 9 C 3dxz 0.00114\r\npop of 9 C 3dx2-y2 0.00332\r\npop of 10 H 1s 0.78221\r\npop of 10 H 2s 0.00210\r\npop of 10 H 2px 0.00106\r\npop of 10 H 2py 0.00507\r\npop of 10 H 2pz 0.00006\r\npop of 11 H 1s 0.78221\r\npop of 11 H 2s 0.00210\r\npop of 11 H 2px 0.00106\r\npop of 11 H 2py 0.00507\r\npop of 11 H 2pz 0.00006\r\n ** Mulliken atomic charges **\r\ncharge of 0C = -0.20959\r\ncharge of 1C = -0.23295\r\ncharge of 2C = -0.18585\r\ncharge of 3H = 0.21407\r\ncharge of 4H = 0.20482\r\ncharge of 5C = -0.18585\r\ncharge of 6C = -0.23295\r\ncharge of 7H = 0.20482\r\ncharge of 8H = 0.21407\r\ncharge of 9C = -0.20959\r\ncharge of 10H = 0.20950\r\ncharge of 11H = 0.20950\r\n\r\nThe asymmetry of the C atoms is way too much. It is already seen in the contribution of nao's 2s orbitals. Curiously, the C atoms in para position are equivalent to each other.\r\n\r\nThank you very much for your help.\r\n\r\nPedro\r\n"}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/pyscf_m_pyscf:pr-1803", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/pyscf/lo/nao.py b/pyscf/lo/nao.py\nindex cc5ba2c48d..3cf505cb30 100644\n--- a/pyscf/lo/nao.py\n+++ b/pyscf/lo/nao.py\n@@ -23,7 +23,7 @@\n '''\n \n import sys\n-from functools import reduce\n+from functools import reduce, lru_cache\n import numpy\n import scipy.linalg\n from pyscf import lib\n@@ -72,6 +72,11 @@ def nao(mol, mf, s=None, restore=True):\n pre_occ, pre_nao = _prenao_sub(mol, p, s)\n cnao = _nao_sub(mol, pre_occ, pre_nao)\n if restore:\n+ if mol.cart:\n+ # The atomic natural character for Cartesian basis is not clearly\n+ # defined. Skip restore.\n+ return cnao\n+\n # restore natural character\n p_nao = reduce(numpy.dot, (cnao.T, p, cnao))\n s_nao = numpy.eye(p_nao.shape[0])\n@@ -98,10 +103,12 @@ def _prenao_sub(mol, p, s):\n \n if mol.cart:\n degen = (l + 1) * (l + 2) // 2\n+ p_frag = _cart_average_mat(p, l, idx)\n+ s_frag = _cart_average_mat(s, l, idx)\n else:\n degen = l * 2 + 1\n- p_frag = _spheric_average_mat(p, l, idx, degen)\n- s_frag = _spheric_average_mat(s, l, idx, degen)\n+ p_frag = _sph_average_mat(p, l, idx)\n+ s_frag = _sph_average_mat(s, l, idx)\n e, v = scipy.linalg.eigh(p_frag, s_frag)\n e = e[::-1]\n v = v[:,::-1]\n@@ -187,12 +194,24 @@ def _core_val_ryd_list(mol):\n count[ia,l] += nc\n return core_lst, val_lst, rydbg_lst\n \n-def _spheric_average_mat(mat, l, lst, degen=None):\n- if degen is None:\n- degen = l * 2 + 1\n- nd = len(lst) // degen\n- mat_frag = mat[lst][:,lst].reshape(nd,degen,nd,degen)\n- return numpy.einsum('imjn->ij', mat_frag) / degen\n+@lru_cache(10)\n+def _cart_averge_wt(l):\n+ '''Weight matrix for spherical symmetry averaging in Cartensian GTOs'''\n+ c = mole.cart2sph(l, normalized='sp')\n+ return numpy.einsum('pi,qi->pq', c, c)\n+\n+def _cart_average_mat(mat, l, lst):\n+ degen = (l+1) * (l+2) // 2\n+ nshl = len(lst) // degen\n+ submat = mat[lst[:,None],lst].reshape(nshl,degen,nshl,degen)\n+ wt = _cart_averge_wt(l)\n+ return numpy.einsum('imjn,mn->ij', submat, wt) / (2*l+1)\n+\n+def _sph_average_mat(mat, l, lst):\n+ degen = 2 * l + 1\n+ nshl = len(lst) // degen\n+ submat = mat[lst[:,None],lst].reshape(nshl,degen,nshl,degen)\n+ return numpy.einsum('imjm->ij', submat) / (2*l+1)\n \n def set_atom_conf(element, description):\n '''Change the default atomic core and valence configuration to the one\ndiff --git a/pyscf/lo/orth.py b/pyscf/lo/orth.py\nindex 70e5c894a6..c463038fe1 100644\n--- a/pyscf/lo/orth.py\n+++ b/pyscf/lo/orth.py\n@@ -331,28 +331,3 @@ def orth_ao(mf_or_mol, method=ORTH_METHOD, pre_orth_ao=REF_BASIS, s=None):\n return c_orth\n \n del (ORTH_METHOD)\n-\n-\n-if __name__ == '__main__':\n- from pyscf import scf\n- from pyscf.lo import nao\n- mol = gto.Mole()\n- mol.verbose = 1\n- mol.output = 'out_orth'\n- mol.atom.extend([\n- ['O' , (0. , 0. , 0.)],\n- [1 , (0. , -0.757 , 0.587)],\n- [1 , (0. , 0.757 , 0.587)] ])\n- mol.basis = {'H': '6-31g',\n- 'O': '6-31g',}\n- mol.build()\n-\n- mf = scf.RHF(mol)\n- mf.scf()\n-\n- c0 = nao.prenao(mol, mf.make_rdm1())\n- c = orth_ao(mol, 'meta_lowdin', c0)\n-\n- s = mol.intor_symmetric('int1e_ovlp_sph')\n- p = reduce(numpy.dot, (s, mf.make_rdm1(), s))\n- print(reduce(numpy.dot, (c.T, p, c)).diagonal())\n"}, "test": {"test_patch": "diff --git a/pyscf/lo/test/test_nao.py b/pyscf/lo/test/test_nao.py\nindex 563eb93059..7ace613515 100644\n--- a/pyscf/lo/test/test_nao.py\n+++ b/pyscf/lo/test/test_nao.py\n@@ -51,8 +51,7 @@ def test_pre_nao(self):\n self.assertAlmostEqual(abs(c).sum(), 33.214804163888289, 6)\n \n c = nao.prenao(mol1, mf1.make_rdm1())\n- self.assertAlmostEqual(numpy.linalg.norm(c), 5.5434134741828105, 9)\n- self.assertAlmostEqual(abs(c).sum(), 31.999905597187052, 6)\n+ self.assertAlmostEqual(abs(c).sum(), 34.21520681, 6)\n \n def test_nao(self):\n c = nao.nao(mol, mf)\n@@ -64,14 +63,33 @@ def test_nao(self):\n \n c = nao.nao(mol1, mf1)\n s = mf1.get_ovlp()\n- self.assertTrue(numpy.allclose(reduce(numpy.dot, (c.T, s, c)),\n- numpy.eye(s.shape[0])))\n- self.assertAlmostEqual(numpy.linalg.norm(c), 9.4629575662640129, 9)\n- self.assertAlmostEqual(abs(c).sum(), 100.24554485355642, 6)\n+ self.assertAlmostEqual(abs(c.T.dot(s).dot(c) - numpy.eye(s.shape[0])).max(), 0, 8)\n+ self.assertAlmostEqual(abs(c).sum(), 100.54615191, 6)\n+\n+ # issue 1755\n+ def test_nao_pop_symmetry(self):\n+ mol = gto.M(atom='''\n+ 6 -0.000000 -1.399560 0.000000\n+ 6 -1.212054 -0.699779 -0.000000\n+ 6 1.212054 -0.699779 -0.000000\n+ 1 -2.156901 -1.245293 0.000000\n+ 1 2.156901 -1.245293 0.000000\n+ 6 -1.212054 0.699779 0.000000\n+ 6 1.212054 0.699779 0.000000\n+ 1 -2.156901 1.245293 -0.000000\n+ 1 2.156901 1.245293 -0.000000\n+ 6 -0.000000 1.399560 -0.000000\n+ 1 0.000000 2.490576 0.000000\n+ 1 0.000000 -2.490576 -0.000000\n+ ''', basis='sto3g', verbose=0)\n+ mf = scf.RHF(mol).run()\n+ C = nao.nao(mol, mf)\n+ mo = C.T.dot(mf.get_ovlp()).dot(mf.mo_coeff)\n+ dm = mf.make_rdm1(mo, mf.mo_occ)\n+ pop, chg = mf.mulliken_pop(mol, dm, numpy.eye(mol.nao_nr()), verbose=0)\n+ self.assertAlmostEqual(abs(abs(chg) - 0.03668).max(), 0, 6)\n \n \n if __name__ == \"__main__\":\n print(\"Test orth\")\n unittest.main()\n-\n-\n", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}123{"question_id": "MSB_pyscf_pyscf_pr1821", "question_type": "multi_swe_bench", "description": "Fix pbc empty cell error (pyscf/pyscf#1821)", "content": {"org": "pyscf", "repo": "pyscf", "pr_number": 1821, "issue_title": "Fix pbc empty cell error", "issue_body": "fix issue #1819.", "base_commit": "6bd9a832c0850dece2c031befeb3af3b68d18b7f", "resolved_issues": [{"number": 1819, "title": "example-pbc: 40-customize_kpts_hamiltonian.py", "body": "Hi all,\r\nI tried to run 40-customize_kpts_hamiltonian.py, but got the error:\r\n\r\n'''\r\nTraceback (most recent call last):\r\n File \"/home/jtolle/Software/pyscf_master/pyscf/examples/pbc/40-customize_kpts_hamiltonian.py\", line 33, in <module>\r\n cell = pbc.gto.M(\r\n File \"/home/jtolle/Software/pyscf_master/pyscf/pyscf/pbc/gto/cell.py\", line 73, in M\r\n cell.build(**kwargs)\r\n File \"/home/jtolle/Software/pyscf_master/pyscf/pyscf/pbc/gto/cell.py\", line 1522, in build\r\n atom_boundary_max = scaled_atom_coords[:,:self.dimension].max(axis=0)\r\n File \"/home/jtolle/anaconda3/lib/python3.9/site-packages/numpy/core/_methods.py\", line 41, in _amax\r\n return umr_maximum(a, axis, None, out, keepdims, initial, where)\r\nValueError: zero-size array to reduction operation maximum which has no identity\r\n'''\r\n(using the current master)\r\n\r\nUsing this commit: 71391d862c3db83db28553bbb1518acee466662c it works.\r\nWould be great if someone can help to resolve this issue.\r\nBest regards,\r\nJohannes\r\n\r\n"}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/pyscf_m_pyscf:pr-1821", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/pyscf/pbc/gto/cell.py b/pyscf/pbc/gto/cell.py\nindex 8ae280772a..8fc38d5e61 100644\n--- a/pyscf/pbc/gto/cell.py\n+++ b/pyscf/pbc/gto/cell.py\n@@ -1517,7 +1517,7 @@ def build(self, dump_input=True, parse_arg=mole.ARGPARSE,\n logger.info(self, 'low_dim_ft_type = %s', self.low_dim_ft_type)\n logger.info(self, 'Cell volume = %g', self.vol)\n # Check atoms coordinates\n- if self.dimension > 0:\n+ if self.dimension > 0 and self.natm > 0:\n scaled_atom_coords = np.linalg.solve(_a.T, self.atom_coords().T).T\n atom_boundary_max = scaled_atom_coords[:,:self.dimension].max(axis=0)\n atom_boundary_min = scaled_atom_coords[:,:self.dimension].min(axis=0)\ndiff --git a/pyscf/pbc/tools/pbc.py b/pyscf/pbc/tools/pbc.py\nindex 985c0f2550..447f752590 100644\n--- a/pyscf/pbc/tools/pbc.py\n+++ b/pyscf/pbc/tools/pbc.py\n@@ -503,7 +503,7 @@ def get_lattice_Ls(cell, nimgs=None, rcut=None, dimension=None, discard=True):\n if rcut is None:\n rcut = cell.rcut\n \n- if dimension == 0 or rcut <= 0:\n+ if dimension == 0 or rcut <= 0 or cell.natm == 0:\n return np.zeros((1, 3))\n \n a = cell.lattice_vectors()\n"}, "test": {"test_patch": "diff --git a/pyscf/pbc/gto/test/test_cell.py b/pyscf/pbc/gto/test/test_cell.py\nindex e7aeafe577..61dc9f6e72 100644\n--- a/pyscf/pbc/gto/test/test_cell.py\n+++ b/pyscf/pbc/gto/test/test_cell.py\n@@ -478,6 +478,11 @@ def test_eval_gto(self):\n ao_value = cell.pbc_eval_gto(\"GTOval_ip_cart\", coords, kpts=cell.make_kpts([3]*3))\n self.assertAlmostEqual(lib.fp(ao_value), (0.38051517609460028+0.062526488684770759j), 9)\n \n+ def test_empty_cell(self):\n+ cell = pgto.M(a=np.eye(3)*4)\n+ Ls = pbctools.get_lattice_Ls(cell)\n+ self.assertEqual(abs(Ls-np.zeros([1,3])).max(), 0)\n+\n if __name__ == '__main__':\n print(\"Full Tests for pbc.gto.cell\")\n unittest.main()\n", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}124{"question_id": "MSB_pyscf_pyscf_pr1841", "question_type": "multi_swe_bench", "description": "Rewrite _break_dm_spin_symm (pyscf/pyscf#1841)", "content": {"org": "pyscf", "repo": "pyscf", "pr_number": 1841, "issue_title": "Rewrite _break_dm_spin_symm", "issue_body": "Rewrite _break_dm_spin_symm to form a doublet state density instead of zeroing out interatomic blocks of density matrix.\r\n\r\nCloses #1839 ", "base_commit": "c362ba7b4ffde4027b0953ed7b66ef50ac7240f1", "resolved_issues": [{"number": 1839, "title": "strange behavior of init_guess_breaksym", "body": "Hi, \r\n\r\nI'm wondering if the breaking symmetry option \r\n\r\nhttps://github.com/pyscf/pyscf/blob/master/pyscf/scf/uhf.py#L29\r\nhttps://github.com/pyscf/pyscf/blob/master/pyscf/scf/uhf.py#L773\r\n\r\nworks as it is supposed to do. \r\nI would propose not to turn on the option by default \r\nfor the initial density matrix methods. \r\nFor augmented basis sets, e.g., aug-pc-n (n=1,2..), \r\nthe number of electrons in the beta channel explodes \r\nusing MINAO with `init_guess_breaksym=True`. \r\nThe problem is reproducible with all 2.X.Y PySCF versions. \r\nFor benzene, this leads already to significant convergence issues. \r\n\r\nPlease see the attached script to check to problem yourself. \r\n\r\n\r\n**Tab. 1 initial_guess_dm=True, PySCF version: 2.3.0**\r\n| basis| N$`_{elec}`$(from initial guess) = (N$`_{\\alpha}`$, N$`_{\\beta}`$) |\r\n| :--: | :-----------------: |\r\n| pc-0 | (20.951768099569655, 20.91592508353395) |\r\n| pc-1 | (20.992586040795963, 22.024225871340562) | \r\n| pc-2 | (20.99925998574021, 20.614775142071956) | \r\n| aug-pc-0 | (20.964939403069046, 24.754095109846062) | \r\n| aug-pc-1 | (20.996679459866204, 39.278482611398196) | \r\n| aug-pc-2 | (20.99947479330699, 352.8876628321081)| \r\n\r\n\r\n**Tab. 2 initial_guess_dm=False, PySCF version: 2.3.0**\r\n| basis| N$`_{elec}`$(from initial guess) = (N$`_{\\alpha}`$, N$`_{\\beta}`$) |\r\n| :--: | :-----------------: |\r\n| pc-0 | (20.951768099569655, 20.951768099569655)| \r\n| pc-1 | (20.992586040795963, 20.992586040795963) | \r\n| pc-2 | (20.99925998574021, 20.99925998574021) |\r\n| aug-pc-0 | (20.964939403069046, 20.964939403069046)| \r\n| aug-pc-1 | (20.996679459866204, 20.996679459866204)| \r\n| aug-pc-2 | (20.99947479330699, 20.99947479330699) | \r\n\r\n```python=\r\nimport pyscf\r\nfrom pyscf import gto, scf\r\n\r\n\r\ndef dft(basis=\"pc-0\",init_guess_breaksym=True):\r\n mol = gto.M(atom='''\r\nC 0.000000000000000 1.391976000000000 0.000000000000000\r\nC 1.205486000000000 0.695988000000000 0.000000000000000\r\nC 1.205486000000000 -0.695988000000000 0.000000000000000\r\nC 0.000000000000000 -1.391976000000000 0.000000000000000\r\nC -1.205486000000000 -0.695988000000000 0.000000000000000\r\nC -1.205486000000000 0.695988000000000 0.000000000000000\r\nH 0.000000000000000 2.472230000000000 0.000000000000000\r\nH 2.141014000000000 1.236115000000000 0.000000000000000\r\nH 2.141014000000000 -1.236115000000000 0.000000000000000\r\nH 0.000000000000000 -2.472230000000000 0.000000000000000\r\nH -2.141014000000000 -1.236115000000000 0.000000000000000\r\nH -2.141014000000000 1.236115000000000 0.000000000000000\r\n''')\r\n\r\n mol.verbose = 9\r\n mol.basis = basis\r\n mol.output = \"dft.log\"\r\n mol.build()\r\n mf = scf.UKS(mol)\r\n mf.init_guess_breaksym = init_guess_breaksym\r\n mf.max_cycle = 0\r\n mf.xc = \"spw92\"\r\n mf.conv_tol = 1e-8\r\n mf.grids.level = 7\r\n mf.grids.prune = None\r\n mf.grids.build()\r\n # mf.init_guess = \"vsap\"\r\n edft = mf.kernel()\r\n\r\ndef main():\r\n print(f\"PySCF version: {pyscf.__version__}\")\r\n dft(basis=\"aug-pc-1\",init_guess_breaksym=True)\r\n\r\nif __name__ == '__main__':\r\n main()\r\n\r\n```\r\n\r\nBest, \r\nWanja, Kai, and Sebastian \r\n\n\n### Minimal API referenced by tests (typed signatures)\n_Added only when tests call brand\u2011new symbols introduced by the fix; types reflect annotations present in the repo or `Unknown` if not annotated._\n\n- Function in `pyscf/scf/uhf.py`: `def init_guess_by_minao(mol, breaksym) -> numpy.ndarray: ...`\n **Inputs:** mol: gto.Mole, breaksym: bool\n **Output:** numpy.ndarray\n\n- Function in `pyscf/scf/uhf.py`: `def init_guess_by_1e(mol, breaksym) -> numpy.ndarray: ...`\n **Inputs:** mol: gto.Mole, breaksym: bool\n **Output:** numpy.ndarray\n\n```python\ndef init_guess_by_minao(mol, breaksym) -> numpy.ndarray: ...\ndef init_guess_by_1e(mol, breaksym) -> numpy.ndarray: ...\n```"}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/pyscf_m_pyscf:pr-1841", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/pyscf/pbc/scf/kuhf.py b/pyscf/pbc/scf/kuhf.py\nindex ff911afac4..8827cbad6e 100644\n--- a/pyscf/pbc/scf/kuhf.py\n+++ b/pyscf/pbc/scf/kuhf.py\n@@ -369,6 +369,7 @@ class KUHF(khf.KSCF):\n '''UHF class with k-point sampling.\n '''\n conv_tol_grad = getattr(__config__, 'pbc_scf_KSCF_conv_tol_grad', None)\n+ init_guess_breaksym = getattr(__config__, 'scf_uhf_init_guess_breaksym', 1)\n \n _keys = {\"init_guess_breaksym\"}\n \n@@ -390,7 +391,6 @@ def __init__(self, cell, kpts=np.zeros((1,3)),\n exxdiv=getattr(__config__, 'pbc_scf_SCF_exxdiv', 'ewald')):\n khf.KSCF.__init__(self, cell, kpts, exxdiv)\n self.nelec = None\n- self.init_guess_breaksym = None\n \n @property\n def nelec(self):\ndiff --git a/pyscf/pbc/scf/uhf.py b/pyscf/pbc/scf/uhf.py\nindex 3dfd53866b..ea48c75efb 100644\n--- a/pyscf/pbc/scf/uhf.py\n+++ b/pyscf/pbc/scf/uhf.py\n@@ -107,6 +107,8 @@ def dip_moment(cell, dm, unit='Debye', verbose=logger.NOTE,\n class UHF(pbchf.SCF):\n '''UHF class for PBCs.\n '''\n+ init_guess_breaksym = getattr(__config__, 'scf_uhf_init_guess_breaksym', 1)\n+\n _keys = {\"init_guess_breaksym\"}\n \n init_guess_by_minao = mol_uhf.UHF.init_guess_by_minao\n@@ -134,7 +136,6 @@ def __init__(self, cell, kpt=np.zeros(3),\n exxdiv=getattr(__config__, 'pbc_scf_SCF_exxdiv', 'ewald')):\n pbchf.SCF.__init__(self, cell, kpt, exxdiv)\n self.nelec = None\n- self.init_guess_breaksym = None\n \n @property\n def nelec(self):\ndiff --git a/pyscf/scf/uhf.py b/pyscf/scf/uhf.py\nindex 4797dbe5d9..c4c1660ceb 100644\n--- a/pyscf/scf/uhf.py\n+++ b/pyscf/scf/uhf.py\n@@ -26,48 +26,34 @@\n \n WITH_META_LOWDIN = getattr(__config__, 'scf_analyze_with_meta_lowdin', True)\n PRE_ORTH_METHOD = getattr(__config__, 'scf_analyze_pre_orth_method', 'ANO')\n-BREAKSYM = getattr(__config__, 'scf_uhf_init_guess_breaksym', True)\n MO_BASE = getattr(__config__, 'MO_BASE', 1)\n \n \n-def init_guess_by_minao(mol, breaksym=BREAKSYM):\n+def init_guess_by_minao(mol, breaksym=None):\n '''Generate initial guess density matrix based on ANO basis, then project\n the density matrix to the basis set defined by ``mol``\n \n Returns:\n Density matrices, a list of 2D ndarrays for alpha and beta spins\n '''\n- dm = hf.init_guess_by_minao(mol)\n- dma = dmb = dm*.5\n- if breaksym:\n- dma, dmb = _break_dm_spin_symm(mol, (dma, dmb))\n- return numpy.array((dma,dmb))\n+ return UHF(mol).init_guess_by_minao(mol, breaksym)\n \n-def init_guess_by_1e(mol, breaksym=BREAKSYM):\n+def init_guess_by_1e(mol, breaksym=None):\n return UHF(mol).init_guess_by_1e(mol, breaksym)\n \n-def init_guess_by_atom(mol, breaksym=BREAKSYM):\n- dm = hf.init_guess_by_atom(mol)\n- dma = dmb = dm*.5\n- if mol.spin == 0 and breaksym:\n- #Add off-diagonal part for alpha DM\n- dma = mol.intor_symmetric('int1e_ovlp') * 1e-2\n- for b0, b1, p0, p1 in mol.aoslice_by_atom():\n- dma[p0:p1,p0:p1] = dmb[p0:p1,p0:p1]\n- return numpy.array((dma,dmb))\n-\n-def init_guess_by_huckel(mol, breaksym=BREAKSYM):\n+def init_guess_by_atom(mol, breaksym=None):\n+ return UHF(mol).init_guess_by_atom(mol, breaksym)\n+\n+def init_guess_by_huckel(mol, breaksym=None):\n return UHF(mol).init_guess_by_huckel(mol, breaksym)\n \n-def init_guess_by_mod_huckel(mol, breaksym=BREAKSYM):\n+def init_guess_by_mod_huckel(mol, breaksym=None):\n return UHF(mol).init_guess_by_mod_huckel(mol, breaksym)\n \n-def init_guess_by_sap(mol, sap_basis, breaksym=BREAKSYM, **kwargs):\n- dm = hf.init_guess_by_sap(mol, sap_basis)\n- dma = dmb = dm*.5\n- if breaksym:\n- dma, dmb = _break_dm_spin_symm(mol, (dma, dmb))\n- return numpy.array((dma,dmb))\n+def init_guess_by_sap(mol, sap_basis, breaksym=None, **kwargs):\n+ mf = UHF(mol)\n+ mf.sap_basis = sap_basis\n+ return mf.init_guess_by_sap(mol, breaksym)\n \n def init_guess_by_chkfile(mol, chkfile_name, project=None):\n '''Read SCF chkfile and make the density matrix for UHF initial guess.\n@@ -127,14 +113,24 @@ def fproj(mo):\n dm = make_rdm1([fproj(mo[0]),fproj(mo[1])], mo_occ)\n return dm\n \n-def _break_dm_spin_symm(mol, dm):\n+def _break_dm_spin_symm(mol, dm, breaksym=1):\n dma, dmb = dm\n # For spin polarized system, no need to manually break spin symmetry\n- if mol.spin == 0 and abs(dma - dmb).max() < 1e-2:\n- #remove off-diagonal part of beta DM\n- dmb = numpy.zeros_like(dma)\n- for b0, b1, p0, p1 in mol.aoslice_by_atom():\n- dmb[...,p0:p1,p0:p1] = dma[...,p0:p1,p0:p1]\n+ if breaksym and mol.spin == 0 and abs(dma - dmb).max() < 1e-2:\n+ if breaksym == 1:\n+ #remove off-diagonal part of beta DM\n+ dmb = numpy.zeros_like(dma)\n+ for b0, b1, p0, p1 in mol.aoslice_by_atom():\n+ dmb[...,p0:p1,p0:p1] = dma[...,p0:p1,p0:p1]\n+ else:\n+ # Adjust num. electrons for density matrices (issue #1839)\n+ # Get overlap matrix\n+ s1e = mol.intor_symmetric('int1e_ovlp')\n+ # Compute norm of density matrices\n+ nelec_half = numpy.einsum('ij,ji->', dma, s1e)\n+ # Scale density matrices to form doublet state\n+ dma = dma * (nelec_half+1) / nelec_half\n+ dmb = dmb * (nelec_half-1) / nelec_half\n return dma, dmb\n \n def get_init_guess(mol, key='minao', **kwargs):\n@@ -757,8 +753,12 @@ class UHF(hf.SCF):\n If given, freeze the number of (alpha,beta) electrons to the given value.\n level_shift : number or two-element list\n level shift (in Eh) for alpha and beta Fock if two-element list is given.\n- init_guess_breaksym : logical\n- If given, overwrite BREAKSYM.\n+ init_guess_breaksym : int\n+ This configuration controls the algorithm used to break the spin\n+ symmetry of the initial guess:\n+ - 0 to disable symmetry breaking in the initial guess.\n+ - 1 to use the default algorithm introduced in pyscf-1.7.\n+ - 2 to adjust the num. electrons for spin-up and spin-down density matrices (issue #1839).\n \n Examples:\n \n@@ -770,7 +770,7 @@ class UHF(hf.SCF):\n S^2 = 0.7570150, 2S+1 = 2.0070027\n '''\n \n- init_guess_breaksym = None\n+ init_guess_breaksym = getattr(__config__, 'scf_uhf_init_guess_breaksym', 1)\n \n _keys = {\"init_guess_breaksym\"}\n \n@@ -847,29 +847,34 @@ def get_init_guess(self, mol=None, key='minao', **kwargs):\n logger.debug1(self, 'Nelec from initial guess = %s', nelec)\n return dm\n \n- def init_guess_by_minao(self, mol=None, breaksym=BREAKSYM):\n+ def init_guess_by_minao(self, mol=None, breaksym=None):\n '''Initial guess in terms of the overlap to minimal basis.'''\n if mol is None: mol = self.mol\n- user_set_breaksym = getattr(self, \"init_guess_breaksym\", None)\n- if user_set_breaksym is not None:\n- breaksym = user_set_breaksym\n+ if breaksym is None: breaksym = self.init_guess_breaksym\n # For spin polarized system, no need to manually break spin symmetry\n- if mol.spin != 0:\n- breaksym = False\n- return init_guess_by_minao(mol, breaksym)\n+ dm = hf.init_guess_by_minao(mol)\n+ dma = dmb = dm*.5\n+ dma, dmb = _break_dm_spin_symm(mol, (dma, dmb), breaksym)\n+ return numpy.array((dma, dmb))\n \n- def init_guess_by_atom(self, mol=None, breaksym=BREAKSYM):\n+ def init_guess_by_atom(self, mol=None, breaksym=None):\n if mol is None: mol = self.mol\n- user_set_breaksym = getattr(self, \"init_guess_breaksym\", None)\n- if user_set_breaksym is not None:\n- breaksym = user_set_breaksym\n- return init_guess_by_atom(mol, breaksym)\n+ if breaksym is None: breaksym = self.init_guess_breaksym\n+ dm = hf.init_guess_by_atom(mol)\n+ dma = dmb = dm*.5\n+ if mol.spin == 0 and breaksym:\n+ if breaksym == 1:\n+ #Add off-diagonal part for alpha DM\n+ dma = mol.intor_symmetric('int1e_ovlp') * 1e-2\n+ for b0, b1, p0, p1 in mol.aoslice_by_atom():\n+ dma[p0:p1,p0:p1] = dmb[p0:p1,p0:p1]\n+ else:\n+ dma, dmb = _break_dm_spin_symm(mol, (dma, dmb), breaksym)\n+ return numpy.array((dma,dmb))\n \n- def init_guess_by_huckel(self, mol=None, breaksym=BREAKSYM):\n+ def init_guess_by_huckel(self, mol=None, breaksym=None):\n if mol is None: mol = self.mol\n- user_set_breaksym = getattr(self, \"init_guess_breaksym\", None)\n- if user_set_breaksym is not None:\n- breaksym = user_set_breaksym\n+ if breaksym is None: breaksym = self.init_guess_breaksym\n logger.info(self, 'Initial guess from on-the-fly Huckel, doi:10.1021/acs.jctc.8b01089.')\n mo_energy, mo_coeff = hf._init_guess_huckel_orbitals(mol, updated_rule = False)\n mo_energy = (mo_energy, mo_energy)\n@@ -880,11 +885,9 @@ def init_guess_by_huckel(self, mol=None, breaksym=BREAKSYM):\n dma, dmb = _break_dm_spin_symm(mol, (dma, dmb))\n return numpy.array((dma,dmb))\n \n- def init_guess_by_mod_huckel(self, mol=None, breaksym=BREAKSYM):\n+ def init_guess_by_mod_huckel(self, mol=None, breaksym=None):\n if mol is None: mol = self.mol\n- user_set_breaksym = getattr(self, \"init_guess_breaksym\", None)\n- if user_set_breaksym is not None:\n- breaksym = user_set_breaksym\n+ if breaksym is None: breaksym = self.init_guess_breaksym\n logger.info(self, '''Initial guess from on-the-fly Huckel, doi:10.1021/acs.jctc.8b01089,\n employing the updated GWH rule from doi:10.1021/ja00480a005.''')\n mo_energy, mo_coeff = hf._init_guess_huckel_orbitals(mol, updated_rule = True)\n@@ -893,14 +896,12 @@ def init_guess_by_mod_huckel(self, mol=None, breaksym=BREAKSYM):\n mo_occ = self.get_occ(mo_energy, mo_coeff)\n dma, dmb = self.make_rdm1(mo_coeff, mo_occ)\n if breaksym:\n- dma, dmb = _break_dm_spin_symm(mol, (dma, dmb))\n+ dma, dmb = _break_dm_spin_symm(mol, (dma, dmb), breaksym)\n return numpy.array((dma,dmb))\n \n- def init_guess_by_1e(self, mol=None, breaksym=BREAKSYM):\n+ def init_guess_by_1e(self, mol=None, breaksym=None):\n if mol is None: mol = self.mol\n- user_set_breaksym = getattr(self, \"init_guess_breaksym\", None)\n- if user_set_breaksym is not None:\n- breaksym = user_set_breaksym\n+ if breaksym is None: breaksym = self.init_guess_breaksym\n logger.info(self, 'Initial guess from hcore.')\n h1e = self.get_hcore(mol)\n s1e = self.get_ovlp(mol)\n@@ -911,12 +912,13 @@ def init_guess_by_1e(self, mol=None, breaksym=BREAKSYM):\n dma, dmb = self.make_rdm1(mo_coeff, mo_occ)\n natm = getattr(mol, 'natm', 0) # handle custom Hamiltonian\n if natm > 0 and breaksym:\n- dma, dmb = _break_dm_spin_symm(mol, (dma, dmb))\n+ dma, dmb = _break_dm_spin_symm(mol, (dma, dmb), breaksym)\n return numpy.array((dma,dmb))\n \n- def init_guess_by_sap(self, mol=None, breaksym=BREAKSYM, **kwargs):\n+ def init_guess_by_sap(self, mol=None, breaksym=None, **kwargs):\n from pyscf.gto.basis import load\n if mol is None: mol = self.mol\n+ if breaksym is None: breaksym = self.init_guess_breaksym\n sap_basis = self.sap_basis\n logger.info(self, '''Initial guess from superposition of atomic potentials (doi:10.1021/acs.jctc.8b01089)\n This is the Gaussian fit version as described in doi:10.1063/5.0004046.''')\n@@ -935,11 +937,11 @@ def init_guess_by_sap(self, mol=None, breaksym=BREAKSYM, **kwargs):\n for key in sap_basis:\n sapbas[key] = numpy.asarray(sap_basis[key][0][1:], dtype=float)\n else:\n- logger.error(self, 'sap_basis is of an unexpected datatype.')\n- user_set_breaksym = getattr(self, \"init_guess_breaksym\", None)\n- if user_set_breaksym is not None:\n- breaksym = user_set_breaksym\n- return init_guess_by_sap(mol, sap_basis=sapbas, breaksym=breaksym)\n+ raise RuntimeError('sap_basis is of an unexpected datatype.')\n+ dm = hf.init_guess_by_sap(mol, sapbas)\n+ dma = dmb = dm*.5\n+ dma, dmb = _break_dm_spin_symm(mol, (dma, dmb), breaksym)\n+ return numpy.array((dma,dmb))\n \n def init_guess_by_chkfile(self, chkfile=None, project=None):\n if chkfile is None: chkfile = self.chkfile\n@@ -1124,4 +1126,4 @@ class HF1e(UHF):\n def spin_square(self, mo_coeff=None, s=None):\n return .75, 2\n \n-del (WITH_META_LOWDIN, PRE_ORTH_METHOD, BREAKSYM)\n+del (WITH_META_LOWDIN, PRE_ORTH_METHOD)\n"}, "test": {"test_patch": "diff --git a/pyscf/scf/test/test_uhf.py b/pyscf/scf/test/test_uhf.py\nindex addba13ea1..a60501eb16 100644\n--- a/pyscf/scf/test/test_uhf.py\n+++ b/pyscf/scf/test/test_uhf.py\n@@ -70,10 +70,14 @@ def tearDownModule():\n \n class KnownValues(unittest.TestCase):\n def test_init_guess_minao(self):\n+ mf = scf.UHF(mol)\n dm1 = mf.init_guess_by_minao(mol, breaksym=False)\n self.assertAlmostEqual(abs(dm1).sum(), 13.649710173723337, 9)\n dm2 = scf.uhf.get_init_guess(mol, key='minao')\n self.assertAlmostEqual(abs(dm2).sum(), 12.913908927027279, 9)\n+ mf.init_guess_breaksym = 2\n+ dm1 = mf.init_guess_by_minao(mol)\n+ self.assertAlmostEqual(abs(dm1).sum(), 13.649710173723337, 9)\n \n def test_init_guess_1e(self):\n dm1 = scf.uhf.init_guess_by_1e(mol, breaksym=False)\n", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}125{"question_id": "MSB_pyscf_pyscf_pr1845", "question_type": "multi_swe_bench", "description": "Fix the edge case CAS(2,2) for Selected CI (issue #1808) (pyscf/pyscf#1845)", "content": {"org": "pyscf", "repo": "pyscf", "pr_number": 1845, "issue_title": "Fix the edge case CAS(2,2) for Selected CI (issue #1808)", "issue_body": null, "base_commit": "be14c34f0a427603d14df78249d4e3f9f13193db", "resolved_issues": [{"number": 1808, "title": "Selected CI gives wrong results for a CAS of (2,2)", "body": "Dear developers,\r\n\r\nI was trying to use selected CI as my CASCI solver by looking at the following example: https://github.com/pyscf/pyscf.github.io/blob/master/examples/mcscf/50-casscf_with_selected_ci.py\r\n\r\nHowever, the selected CI results were wrong when I choose a CAS of (2,2):\r\n```\r\nfrom pyscf import gto, scf, mcscf, fci\r\n\r\nb = 1.2\r\nmol = gto.M(\r\n atom = 'N 0 0 0; N 0 0 %f'%b,\r\n basis = 'cc-pvdz',\r\n)\r\nmf = scf.RHF(mol).run()\r\nmc = mcscf.CASCI(mf, 2, 2).run()\r\n\r\n#\r\n# Use SCI (Selected CI) to replace fcisolver\r\n#\r\nmc = mcscf.CASCI(mf, 2, 2)\r\nmc.fcisolver = fci.SCI(mol)\r\nmc.kernel() \r\n```\r\n\r\nHere are the results. I am using pyscf version `2.1.1`\r\n```\r\nconverged SCF energy = -108.914051975052\r\n\r\nCASCI E = -108.94356411985 E(CI) = -1.71486588690826 S^2 = 0.0000000\r\n\r\nCASCI E = -108.914051975052 E(CI) = -1.68535374211038 S^2 = 0.0000000\r\n```\r\nThe selected CI seems to have only the doubly occupied determinant and misses the other doubly excited determinant. I know this is an edge case but thought of bringing this to your attention nevertheless. Thanks!\r\n"}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/pyscf_m_pyscf:pr-1845", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/pyscf/fci/selected_ci.py b/pyscf/fci/selected_ci.py\nindex c51b8a811a..14aae7861c 100644\n--- a/pyscf/fci/selected_ci.py\n+++ b/pyscf/fci/selected_ci.py\n@@ -115,7 +115,7 @@ def select_strs(myci, eri, eri_pq_max, civec_max, strs, norb, nelec):\n strs = numpy.asarray(strs, dtype=numpy.int64)\n nstrs = len(strs)\n nvir = norb - nelec\n- strs_add = numpy.empty((nstrs*(nelec*nvir)**2//4), dtype=numpy.int64)\n+ strs_add = numpy.empty((nstrs*((nelec+1)*(nvir+1))**2//4), dtype=numpy.int64)\n libfci.SCIselect_strs.restype = ctypes.c_int\n nadd = libfci.SCIselect_strs(strs_add.ctypes.data_as(ctypes.c_void_p),\n strs.ctypes.data_as(ctypes.c_void_p),\n"}, "test": {"test_patch": "diff --git a/pyscf/fci/test/test_selected_ci.py b/pyscf/fci/test/test_selected_ci.py\nindex b138f8468d..1300ea63cf 100644\n--- a/pyscf/fci/test/test_selected_ci.py\n+++ b/pyscf/fci/test/test_selected_ci.py\n@@ -495,6 +495,16 @@ def test_guess_wfnsym(self):\n ci0[:] = 0\n self.assertRaises(RuntimeError, cis.guess_wfnsym, norb, nelec, ci0, wfnsym=1)\n \n+ # The edge case CAS(2, 2). issue #1808\n+ def test_cas_2_2(self):\n+ mol = gto.M(atom='H 0 0 0; H 0 0 1.')\n+ mc = mol.RHF().run().CASCI(2, 2)\n+ mc.fcisolver = fci.SCI(mol)\n+ mc.run()\n+ self.assertAlmostEqual(mc.e_tot, -1.1011503302326, 9)\n+ self.assertAlmostEqual(abs(mc.ci[0,0]), .984513596, 5)\n+ self.assertAlmostEqual(abs(mc.ci[1,1]), .175308242, 5)\n+\n \n def gen_des_linkstr(strs, norb, nelec):\n '''Given intermediates, the link table to generate input strs\n@@ -691,4 +701,3 @@ def select_strs(myci, eri, eri_pq_max, civec_max, strs, norb, nelec):\n if __name__ == \"__main__\":\n print(\"Full Tests for selected_ci\")\n unittest.main()\n-\n", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}126{"question_id": "MSB_pyscf_pyscf_pr1869", "question_type": "multi_swe_bench", "description": "Newton casscf hcc (issue #701) (pyscf/pyscf#1869)", "content": {"org": "pyscf", "repo": "pyscf", "pr_number": 1869, "issue_title": "Newton casscf hcc (issue #701)", "issue_body": "This merge request fixes the errors in mcscf.newton_casscf.gen_g_hop in the calculation of the CI vector second derivative of the (state-averaged) energy [here](https://github.com/pyscf/pyscf/blob/master/pyscf/mcscf/newton_casscf.py#L296-L313) as described in issue #701. The newton_casscf algorithm does not directly use the CI trial vector computed by the gradient-descent step using this function to update the result CI vector without first running the actual FCI kernel, and the coupling between the orbital and CI degrees of freedom likewise used a robust expression that had the effect of canceling the erroneous contribution, so these errors did not lead to erroneous results in the sense that converged MC-SCF calculations were always correctly converged. This fix should therefore not change the outcome of any calculations in which the MC-SCF iteration converges to the correct stationary point, and the only unittest changes are to meaningless arbitrary reference points. However, this fix does cause the function to finally _do what it says it does,_ which IMO is important. For completeness, and since my original issue page used a third-party plugin for equations that may not render correctly for everyone, I now repeat the derivation using the native markdown latex support.\r\n\r\nThe first and second derivatives of an expectation value such as the with respect to some sort of unitary transformation are obtained by expressing the unitary operator as the exponential of the corresponding antihermitian unitary group generators,\r\n\r\n$$\r\nE = \\langle 0|e^{-\\hat{G}} \\hat{H} e^{\\hat{G}}|0\\rangle\r\n$$\r\n\r\nFor the CI vector part of an MC-SCF wave function in pyscf.mcscf.newton_casscf.py, the Hamiltonian-vector product is functionally abstracted, so we don't need to think too hard about the form of $\\hat{G}$; we can just use the basic bra-ket language and the definition of antihermiticity:\r\n\r\n$$\r\n\\hat{G} = \\sum_{I} g_I (|I\\rangle\\langle0| - |0\\rangle\\langle I|) = |\\vec{g}\\rangle\\langle 0| - |0\\rangle\\langle\\vec{g}|\r\n$$\r\n\r\nIt follows after some straightforward tedium that the first and second derivatives with respect to the generators are\r\n\r\n$$\r\n\\frac{\\partial E}{\\partial g_I} = \\langle I|\\hat{H} - E_0|0\\rangle + \\textrm{h.c.}\r\n$$\r\n\r\n$$\r\n\\frac{\\partial^2 E}{\\partial g_I\\partial g_J} = \\langle I|\\hat{Q}(\\hat{H}-E_0)\\hat{Q}|J\\rangle + \\textrm{h.c.}\r\n$$\r\n\r\nwith\r\n\r\n$$\r\n\\hat{Q} = 1 - |0\\rangle\\langle 0| ; E_0 = \\langle 0|\\hat{H}|0\\rangle\r\n$$\r\n\r\nUsing that $\\langle 0|\\hat{H}-E_0|0\\rangle=0$ and that for real wave functions $\\langle I|0\\rangle = \\langle 0|I\\rangle = c_I$, the CI vector for the keyframe state $|0\\rangle$, the second derivative is expanded as\r\n\r\n$$\r\n\\frac{\\partial^2 E}{\\partial g_I\\partial g_J} = \\langle I|\\hat{H}-E_0|J\\rangle -\\frac{1}{2}(c_I\\frac{\\partial E}{\\partial g_J} + \\frac{\\partial E}{\\partial g_I}c_J) + \\textrm{h.c.}\r\n$$\r\n\r\nNote that \"+ h.c.\" in both the first and second derivatives are accounted for by factors of 2 [here](https://github.com/pyscf/pyscf/blob/master/pyscf/mcscf/newton_casscf.py#L303) and [here](https://github.com/pyscf/pyscf/blob/master/pyscf/mcscf/newton_casscf.py#L384) that are applied at the end of the calculation. This means that `gci` at [this](https://github.com/pyscf/pyscf/blob/master/pyscf/mcscf/newton_casscf.py#L296C15-L296C15) point in the function stores $\\frac{1}{2}\\frac{\\partial E}{\\partial g_I}$. Hopefully it is now clear why the factor of 4 on [this](https://github.com/pyscf/pyscf/blob/master/pyscf/mcscf/newton_casscf.py#L296C15-L296C15) line is incorrect and should be a factor of 2. For the other two erroneous factors [here](https://github.com/pyscf/pyscf/blob/master/pyscf/mcscf/newton_casscf.py#L312-L313), we can determine the correct expression by treating the second derivative as an operator, $\\langle I|\\partial^2 E|J\\rangle \\equiv \\frac{\\partial^2 E}{\\partial g_I\\partial g_J}$:\r\n\r\n$$\r\n\\partial^2 E|I\\rangle = (\\hat{H} - E_0)\\ket{I} - (\\hat{H} - E_0)\\ket{0}\\braket{0|I} - \\ket{0}\\braket{0|\\hat{H}-E_0|I} + \\mathrm{h.c.}\r\n$$\r\n\r\nAgain, \"+ h.c.\" is accounted for later in the function. Hopefully it is clear that factors of 2 simply should not be [here](https://github.com/pyscf/pyscf/blob/master/pyscf/mcscf/newton_casscf.py#L312-L313).", "base_commit": "96b2bf9365d0e2c762caaeac151433eba28fec15", "resolved_issues": [{"number": 701, "title": "Is there a formal error in the H_cc sector of newton_casscf.gen_g_hop?", "body": "In differentiating with respect to an infinitesimal transformation of the CI vectors, we parameterize the energy as\r\n\r\n<a href=\"https://www.codecogs.com/eqnedit.php?latex=E(x)=\\langle0|e^{-\\hat{P}}\\hat{H}e^{\\hat{P}}|0\\rangle\" target=\"_blank\"><img src=\"https://latex.codecogs.com/gif.latex?E(x)=\\langle0|e^{-\\hat{P}}\\hat{H}e^{\\hat{P}}|0\\rangle\" title=\"E(x)=\\langle0|e^{-\\hat{P}}\\hat{H}e^{\\hat{P}}|0\\rangle\" /></a>\r\n\r\nwith\r\n\r\n<a href=\"https://www.codecogs.com/eqnedit.php?latex=\\hat{P}\\equiv\\sum_{\\vec{n}}|\\vec{n}\\rangle\\langle0|-|0\\rangle\\langle\\vec{n}|\" target=\"_blank\"><img src=\"https://latex.codecogs.com/gif.latex?\\hat{P}\\equiv\\sum_{\\vec{n}}x_{\\vec{n}}(|\\vec{n}\\rangle\\langle0|-|0\\rangle\\langle\\vec{n}|)\" title=\"\\hat{P}\\equiv\\sum_{\\vec{n}}x_{\\vec{n}}(|\\vec{n}\\rangle\\langle0|-|0\\rangle\\langle\\vec{n}|)\" /></a>\r\n\r\nThe second derivative of the energy is\r\n\r\n<a href=\"https://www.codecogs.com/eqnedit.php?latex=\\frac{\\partial^2&space;E}{\\partial&space;x_{\\vec{n}}\\partial&space;x_{\\vec{n}^\\prime}}=\\langle\\vec{n}|\\hat{Q}(\\hat{H}-E_0)\\hat{Q}|\\vec{n}^\\prime\\rangle\" target=\"_blank\"><img src=\"https://latex.codecogs.com/gif.latex?\\frac{\\partial^2&space;E}{\\partial&space;x_{\\vec{n}}\\partial&space;x_{\\vec{n}^\\prime}}=\\langle\\vec{n}|\\hat{Q}(\\hat{H}-E_0)\\hat{Q}|\\vec{n}^\\prime\\rangle\" title=\"\\frac{\\partial^2 E}{\\partial x_{\\vec{n}}\\partial x_{\\vec{n}^\\prime}}=\\langle\\vec{n}|\\hat{Q}(\\hat{H}-E_0)\\hat{Q}|\\vec{n}^\\prime\\rangle\" /></a>\r\n\r\nwith\r\n\r\n<a href=\"https://www.codecogs.com/eqnedit.php?latex=\\hat{Q}\\equiv1-|0\\rangle\\langle0|\" target=\"_blank\"><img src=\"https://latex.codecogs.com/gif.latex?\\hat{Q}\\equiv1-|0\\rangle\\langle0|\" title=\"\\hat{Q}\\equiv1-|0\\rangle\\langle0|\" /></a>\r\n<a href=\"https://www.codecogs.com/eqnedit.php?latex=E_0\\equiv\\langle0|\\hat{H}|0\\rangle\" target=\"_blank\"><img src=\"https://latex.codecogs.com/gif.latex?E_0\\equiv\\langle0|\\hat{H}|0\\rangle\" title=\"E_0\\equiv\\langle0|\\hat{H}|0\\rangle\" /></a>\r\n\r\nor, if we can forgive a bit of notational handwaving,\r\n\r\n<a href=\"https://www.codecogs.com/eqnedit.php?latex=\\partial^2&space;E|\\vec{x}\\rangle=(\\hat{H}-E_0)|\\vec{x}\\rangle-|0\\rangle\\langle0|(\\hat{H}-E_0)|\\vec{x}\\rangle-(\\hat{H}-E_0)|0\\rangle\\langle0|\\vec{x}\\rangle\" target=\"_blank\"><img src=\"https://latex.codecogs.com/gif.latex?\\partial^2&space;E|\\vec{x}\\rangle=(\\hat{H}-E_0)|\\vec{x}\\rangle-|0\\rangle\\langle0|(\\hat{H}-E_0)|\\vec{x}\\rangle-(\\hat{H}-E_0)|0\\rangle\\langle0|\\vec{x}\\rangle\" title=\"\\partial^2 E|\\vec{x}\\rangle=(\\hat{H}-E_0)|\\vec{x}\\rangle-|0\\rangle\\langle0|(\\hat{H}-E_0)|\\vec{x}\\rangle-(\\hat{H}-E_0)|0\\rangle\\langle0|\\vec{x}\\rangle\" /></a>\r\n\r\nBut what's programmed in newton_casscf.py appears to be\r\n\r\n<a href=\"https://www.codecogs.com/eqnedit.php?latex=\\partial^2&space;E|\\vec{x}\\rangle=(\\hat{H}-E_0)|\\vec{x}\\rangle-2|0\\rangle\\langle0|(\\hat{H}-E_0)|\\vec{x}\\rangle-2(\\hat{H}-E_0)|0\\rangle\\langle0|\\vec{x}\\rangle\" target=\"_blank\"><img src=\"https://latex.codecogs.com/gif.latex?\\partial^2&space;E|\\vec{x}\\rangle=(\\hat{H}-E_0)|\\vec{x}\\rangle-2|0\\rangle\\langle0|(\\hat{H}-E_0)|\\vec{x}\\rangle-2(\\hat{H}-E_0)|0\\rangle\\langle0|\\vec{x}\\rangle\" title=\"\\partial^2 E|\\vec{x}\\rangle=(\\hat{H}-E_0)|\\vec{x}\\rangle-2|0\\rangle\\langle0|(\\hat{H}-E_0)|\\vec{x}\\rangle-2(\\hat{H}-E_0)|0\\rangle\\langle0|\\vec{x}\\rangle\" /></a>\r\n\r\nin both hop and hdiag. I would understand a factor of 2 convention difference (EDIT: actually all three of my second-derivative expressions up there should have a +h.c. that I dropped), but this isn't a factor of 2, unless I've gotten confused about what (H-E0) is. In fact, it spoils intermediate normalization (we should have <0|x>=0 at all times; the component of P along the trial vector |0> is undefined by construction):\r\n\r\n```\r\nimport numpy\r\nfrom pyscf import gto, scf, lib, fci\r\nfrom pyscf.mcscf import newton_casscf, CASSCF, addons\r\n\r\nmol = gto.Mole()\r\nmol.verbose = lib.logger.DEBUG\r\nmol.output = '/dev/null'\r\nmol.atom = [\r\n ['H', ( 5.,-1. , 1. )],\r\n ['H', ( 0.,-5. ,-2. )],\r\n ['H', ( 4.,-0.5 ,-3. )],\r\n ['H', ( 0.,-4.5 ,-1. )],\r\n ['H', ( 3.,-0.5 ,-0. )],\r\n ['H', ( 0.,-3. ,-1. )],\r\n ['H', ( 2.,-2.5 , 0. )],\r\n ['H', ( 1., 1. , 3. )],\r\n]\r\nmol.basis = 'sto-3g'\r\nmol.build()\r\nmf = scf.RHF(mol)\r\nmf.max_cycle = 3\r\nmf.kernel()\r\nmc = newton_casscf.CASSCF(mf, 4, 4)\r\nmc.fcisolver = fci.direct_spin1.FCI(mol)\r\nmc.kernel()\r\n\r\nnumpy.random.seed(1)\r\nmo = numpy.random.random(mf.mo_coeff.shape)\r\nci0 = numpy.random.random((6,6))\r\nci0/= numpy.linalg.norm(ci0)\r\ngall, gop, hop, hdiag = newton_casscf.gen_g_hop(mc, mo, ci0, mc.ao2mo(mo))\r\nx = numpy.random.random(gall.size)\r\nhx = hop (x)\r\nprint (\"|hx_ci| =\",numpy.linalg.norm (hx[-36:]),\"<0|hx> =\", ci0.ravel ().dot (hx[-36:]))\r\n```\r\n\r\nyields\r\n\r\n```\r\n|hx_ci| = 73.30773999100957 <0|hx> = 4.13369273110702\r\n```\r\n\r\nI think this has minimal effects on the results of calculations because 1) the extract_rotation function forcibly normalizes the new output CI vector after every Newton-CG step, and the s10 business in the H_oc sector corrects for the effect of the spurious <0|x> component on the orbitals, so all this does is attenuate CI vector evolution almost like a trust radius, and 2) the coupled-perturbed solver for the state-average analytical gradient calculation that I added has a preconditioner that enforces <0|x> = 0 post hoc. But I wanted to ask about it to see if I was missing something, especially since changing it would make at least one test fail.\r\n\r\n"}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/pyscf_m_pyscf:pr-1869", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/pyscf/fci/rdm.py b/pyscf/fci/rdm.py\nindex 58be01c4fe..284053c014 100644\n--- a/pyscf/fci/rdm.py\n+++ b/pyscf/fci/rdm.py\n@@ -101,8 +101,8 @@ def make_rdm1_spin1(fname, cibra, ciket, norb, nelec, link_index=None):\n link_indexa, link_indexb = link_index\n na,nlinka = link_indexa.shape[:2]\n nb,nlinkb = link_indexb.shape[:2]\n- assert (cibra.size == na*nb)\n- assert (ciket.size == na*nb)\n+ assert (cibra.size == na*nb), '{} {} {}'.format (cibra.size, na, nb)\n+ assert (ciket.size == na*nb), '{} {} {}'.format (ciket.size, na, nb)\n rdm1 = numpy.empty((norb,norb))\n fn = getattr(librdm, fname)\n fn(rdm1.ctypes.data_as(ctypes.c_void_p),\ndiff --git a/pyscf/mcscf/newton_casscf.py b/pyscf/mcscf/newton_casscf.py\nindex 941def1e56..b6e4d9c352 100644\n--- a/pyscf/mcscf/newton_casscf.py\n+++ b/pyscf/mcscf/newton_casscf.py\n@@ -293,7 +293,8 @@ def g_update(u, fcivec):\n # h_diag[ncore:nocc,ncore:nocc] -= v_diag[:,ncore:nocc]*2\n h_diag = casscf.pack_uniq_var(h_diag)\n \n- hci_diag = [hd - ec - gc*c*4 for hd, ec, gc, c in zip (_Hdiag (h1cas_0, eri_cas), eci0, gci, ci0)]\n+ # Fix intermediate normalization? - MRH 2023/09/15\n+ hci_diag = [hd - ec - gc*c*2 for hd, ec, gc, c in zip (_Hdiag (h1cas_0, eri_cas), eci0, gci, ci0)]\n hci_diag = [h * w for h, w in zip (hci_diag, weights)]\n hdiag_all = numpy.hstack((h_diag*2, _pack_ci (hci_diag)*2))\n \n@@ -308,9 +309,10 @@ def h_op(x):\n ci1 = _unpack_ci (x[ngorb:])\n \n # H_cc\n+ # Fix intermediate normalization? - MRH 2023/09/15\n hci1 = [hc1 - c1 * ec0 for hc1, c1, ec0 in zip (_Hci (h1cas_0, eri_cas, ci1), ci1, eci0)]\n- hci1 = [hc1 - 2*(hc0 - c0*ec0)*c0.dot(c1) for hc1, hc0, c0, ec0, c1 in zip (hci1, hci0, ci0, eci0, ci1)]\n- hci1 = [hc1 - 2*c0*(hc0 - c0*ec0).dot(c1) for hc1, hc0, c0, ec0, c1 in zip (hci1, hci0, ci0, eci0, ci1)]\n+ hci1 = [hc1 - (hc0 - c0*ec0)*c0.dot(c1) for hc1, hc0, c0, ec0, c1 in zip (hci1, hci0, ci0, eci0, ci1)]\n+ hci1 = [hc1 - c0*(hc0 - c0*ec0).dot(c1) for hc1, hc0, c0, ec0, c1 in zip (hci1, hci0, ci0, eci0, ci1)]\n \n # H_co\n rc = x1[:,:ncore]\n"}, "test": {"test_patch": "diff --git a/pyscf/mcscf/test/test_newton_casscf.py b/pyscf/mcscf/test/test_newton_casscf.py\nindex db4e7c15a7..f2d94c3e9a 100644\n--- a/pyscf/mcscf/test/test_newton_casscf.py\n+++ b/pyscf/mcscf/test/test_newton_casscf.py\n@@ -88,11 +88,11 @@ def test_gen_g_hop(self):\n ci0/= numpy.linalg.norm(ci0)\n gall, gop, hop, hdiag = newton_casscf.gen_g_hop(mc, mo, ci0, mc.ao2mo(mo))\n self.assertAlmostEqual(lib.fp(gall), 21.288022525148595, 8)\n- self.assertAlmostEqual(lib.fp(hdiag), -4.6864640132374618, 8)\n+ self.assertAlmostEqual(lib.fp(hdiag), -15.618395788969842, 8)\n x = numpy.random.random(gall.size)\n u, ci1 = newton_casscf.extract_rotation(mc, x, 1, ci0)\n self.assertAlmostEqual(lib.fp(gop(u, ci1)), -412.9441873541524, 8)\n- self.assertAlmostEqual(lib.fp(hop(x)), 73.358310983341198, 8)\n+ self.assertAlmostEqual(lib.fp(hop(x)), 24.04569925660985, 8)\n \n def test_get_grad(self):\n # mc.e_tot may be converged to -3.6268060853430573\n@@ -107,11 +107,11 @@ def test_sa_gen_g_hop(self):\n ci0 = list (ci0.reshape ((2,6,6)))\n gall, gop, hop, hdiag = newton_casscf.gen_g_hop(sa, mo, ci0, sa.ao2mo(mo))\n self.assertAlmostEqual(lib.fp(gall), 32.46973284682045, 8)\n- self.assertAlmostEqual(lib.fp(hdiag), -63.6527761153809, 8)\n+ self.assertAlmostEqual(lib.fp(hdiag), -70.61862254321517, 8)\n x = numpy.random.random(gall.size)\n u, ci1 = newton_casscf.extract_rotation(sa, x, 1, ci0)\n self.assertAlmostEqual(lib.fp(gop(u, ci1)), -49.017079186126, 8)\n- self.assertAlmostEqual(lib.fp(hop(x)), 169.47893548740288, 8)\n+ self.assertAlmostEqual(lib.fp(hop(x)), 136.2077988624156, 8)\n \n def test_sa_get_grad(self):\n self.assertAlmostEqual(sa.e_tot, -3.62638372957158, 7)\n", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}127{"question_id": "MSB_pyscf_pyscf_pr1891", "question_type": "multi_swe_bench", "description": "Assume 46 and 78 core configurations to be f-in-valence (pyscf/pyscf#1891)", "content": {"org": "pyscf", "repo": "pyscf", "pr_number": 1891, "issue_title": "Assume 46 and 78 core configurations to be f-in-valence", "issue_body": "This is a reasonable default and should fix #1889. I added a test with `mf.get_init_guess()` to catch the error.\r\n\r\nWhat should be the way to introduce another core configuration to the same element and number of electrons? \r\nAn `f_in_core` attribute should be added somewhere.", "base_commit": "824218f9975e5f7e5bc1069648473e76bbf76155", "resolved_issues": [{"number": 1889, "title": "Using ECP gives an error for Actinide elements", "body": "I am trying to do a HF/DFT calculation on a system involving a U atom and trying to invoke the effective core potential (ECP) 'crenbl' but that gives a numpy error: LinAlgError('Last 2 dimensions of the array must be square'). The error goes away if ECP is turned off. The same thing happens when using other ECPs (eg. 'stuttgart') listed in the pyscf User Guide or on Basis set exchange for U and other Actinide elements. I am using pyscf v2.3.0 with numpy v1.26.0, scipy v1.11.3, h5py v3.9.0 and python v3.10.13 on Mac ARM architechture. The code is as follows:\r\n\r\n```python\r\nfrom pyscf import gto, scf, dft \r\n\r\nmol = gto.Mole()\r\nmol.atom='''\r\nU -0.00000 0.00000 0.00000\r\nH -1.70048 -1.32378 -0.00000\r\nH 1.70048 -1.32378 -0.00000\r\n'''\r\nmol.basis={'U':'crenbl','H':'6-31++g**'} \r\nmol.ecp={'U':'crenbl'} \r\nmol.symmetry = True \r\nmol.build()\r\n\r\nmf = dft.ROKS(mol)\r\nmf.xc='b3lyp,b3lyp'\r\nmf.max_cycle = 60\r\nmf.conv_tol = 1e-9\r\nmf.kernel()\r\n``` "}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/pyscf_m_pyscf:pr-1891", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/pyscf/gto/ecp.py b/pyscf/gto/ecp.py\nindex e686b88f26..d6a264318e 100644\n--- a/pyscf/gto/ecp.py\n+++ b/pyscf/gto/ecp.py\n@@ -145,10 +145,12 @@ def core_configuration(nelec_core, atom_symbol=None):\n elements_4f = ELEMENTS[57:71]\n elements_5f = ELEMENTS[89:103]\n if atom_symbol in elements_4f:\n- for i in range(46, 60):\n+ # TODO: fix La3+ and Ce4+ ECP46MWB f-in-core ECPs\n+ for i in range(47, 59):\n conf_dic[i] = '4s3p2d1f'\n if atom_symbol in elements_5f:\n- for i in range(78, 92):\n+ # TODO: fix Ac3+, Th4+, Pa5+ and U6+ ECP78MWB f-in-core ECPs\n+ for i in range(79, 91):\n conf_dic[i] = '5s4p3d2f'\n if nelec_core not in conf_dic:\n raise RuntimeError('Core configuration for %d core electrons is not available.' % nelec_core)\n"}, "test": {"test_patch": "diff --git a/pyscf/gto/test/test_ecp.py b/pyscf/gto/test/test_ecp.py\nindex f35d0e1f9e..d2341396f3 100644\n--- a/pyscf/gto/test/test_ecp.py\n+++ b/pyscf/gto/test/test_ecp.py\n@@ -376,9 +376,19 @@ def test_ecp_f_in_core(self):\n 2 5.3988000000 -63.6010500000\n ''')}, charge=2, verbose=0)\n mf = scf.RHF(mol)\n+ mf.get_init_guess()\n self.assertEqual(mol.ao_labels()[0], '0 Eu1 5s ')\n self.assertAlmostEqual(lib.fp(mf.get_hcore()), 22.59028455662168)\n \n+ def test_ecp_f_in_valence(self):\n+ mol = gto.M(atom='U, 0.00, 0.00, 0.00',\n+ basis={'U': 'crenbl'}, ecp={'U': 'crenbl'},\n+ charge=3, spin=3, verbose=0)\n+ mf = scf.ROHF(mol)\n+ mf.get_init_guess()\n+ self.assertEqual(mol.ao_labels()[40], '0 U 5f-3 ')\n+ self.assertAlmostEqual(lib.fp(mf.get_hcore()), -55.38627201912257)\n+\n \n if __name__ == '__main__':\n print(\"Full Tests for ECP\")\n", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}128{"question_id": "MSB_pyscf_pyscf_pr1914", "question_type": "multi_swe_bench", "description": "Fix CASCI grad (pyscf/pyscf#1914)", "content": {"org": "pyscf", "repo": "pyscf", "pr_number": 1914, "issue_title": "Fix CASCI grad", "issue_body": "Fix #1909 ", "base_commit": "231da24f746d3a7988a4c48c9237c4788bda6a36", "resolved_issues": [{"number": 1909, "title": "ValueError when calculating CASCI gradients.", "body": "PySCF Version 2.0.1 and 2.4.0\r\n## Minimal working example:\r\n```\r\nfrom pyscf import M\r\nfrom pyscf.mcscf import CASCI\r\n\r\n\r\ngeom_str = \"\"\"\r\n H -0.00021900 -0.20486000 -2.17721200\r\n H -0.00035900 -1.27718700 -2.17669400\r\n \"\"\"\r\n\r\nmol = M(\r\n atom = geom_str,\r\n basis='6-31G',\r\n charge=0,\r\n spin=0)\r\n\r\nhf = mol.HF()\r\nprint(hf.kernel())\r\ncasci = CASCI(hf, 2, 2)\r\nprint(casci.kernel()[0])\r\ngrad = casci.nuc_grad_method()\r\ngrad.max_memory = 0\r\nnuc_grad = grad.kernel()\r\nprint(nuc_grad)\r\n\r\n```\r\n## Error output\r\n```\r\n File \"XXX\", line 35, in <module>\r\n nuc_grad = grad.kernel()\r\n File \"/XXX/site-packages/pyscf/grad/casci.py\", line 305, in kernel\r\n de = self.grad_elec(mo_coeff, ci, atmlst, log)\r\n File \"/XXX/site-packages/pyscf/grad/casci.py\", line 161, in grad_elec\r\n de[k,i] += numpy.einsum('ijkl,il,kj', eri1tmp, hf_dm1[p0:p1], zvec_ao[q0:q1])\r\n File \"<__array_function__ internals>\", line 6, in einsum\r\n File \"/XXX/site-packages/numpy/core/einsumfunc.py\", line 1361, in einsum\r\n return c_einsum(*operands, **kwargs)\r\nValueError: operands could not be broadcast together with remapped shapes [original->remapped]: (2,2,4,4)->(2,2,4,4) (2,4)->(2,newaxis,newaxis,4) (2,4)->(4,2,newaxis) \r\npython-BaseException\r\n```\r\n## Analysis\r\nThe indices for the einsum in `grad_elec` line 161 seem to be incorrect.\r\n`eri1tmp` is reshaped by\r\n```\r\neri1tmp = eri1tmp.reshape(p1-p0,nf,nao,nao)\r\n```\r\nThe shape of `hf_dm1[p0:p1]` is `(p1-p0, nao)` and the shape of `zvec_ao[q0:q1]` is `(nf, nao)`.\r\nIt seems the correct einsum index should be `'ijkl,il,jk'` instead of `'ijkl,il,kj'`.\r\n\r\nThe bug will cause a `ValueError` when calculating the gradient for large molecules or the max memory is set to a small value.\r\nNote that the same bug (if it truly is) is also present in the code after `grad_elec` line 161."}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/pyscf_m_pyscf:pr-1914", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/pyscf/grad/casci.py b/pyscf/grad/casci.py\nindex 1d46856e69..ccc29af896 100644\n--- a/pyscf/grad/casci.py\n+++ b/pyscf/grad/casci.py\n@@ -160,15 +160,15 @@ def fvind(x):\n eri1tmp = eri1tmp.reshape(p1-p0,nf,nao,nao)\n de[k,i] -= numpy.einsum('ijkl,ij,kl', eri1tmp, hf_dm1[p0:p1,q0:q1], zvec_ao) * 2\n de[k,i] -= numpy.einsum('ijkl,kl,ij', eri1tmp, hf_dm1, zvec_ao[p0:p1,q0:q1]) * 2\n- de[k,i] += numpy.einsum('ijkl,il,kj', eri1tmp, hf_dm1[p0:p1], zvec_ao[q0:q1])\n+ de[k,i] += numpy.einsum('ijkl,il,kj', eri1tmp, hf_dm1[p0:p1], zvec_ao[:,q0:q1])\n de[k,i] += numpy.einsum('ijkl,jk,il', eri1tmp, hf_dm1[q0:q1], zvec_ao[p0:p1])\n \n #:vhf1c, vhf1a = mc_grad.get_veff(mol, (dm_core, dm_cas))\n #:de[k] += numpy.einsum('xij,ij->x', vhf1c[:,p0:p1], casci_dm1[p0:p1]) * 2\n #:de[k] += numpy.einsum('xij,ij->x', vhf1a[:,p0:p1], dm_core[p0:p1]) * 2\n- de[k,i] -= numpy.einsum('ijkl,lk,ij', eri1tmp, dm_core[q0:q1], casci_dm1[p0:p1]) * 2\n+ de[k,i] -= numpy.einsum('ijkl,lk,ij', eri1tmp, dm_core, casci_dm1[p0:p1,q0:q1]) * 2\n de[k,i] += numpy.einsum('ijkl,jk,il', eri1tmp, dm_core[q0:q1], casci_dm1[p0:p1])\n- de[k,i] -= numpy.einsum('ijkl,lk,ij', eri1tmp, dm_cas[q0:q1], dm_core[p0:p1]) * 2\n+ de[k,i] -= numpy.einsum('ijkl,lk,ij', eri1tmp, dm_cas, dm_core[p0:p1,q0:q1]) * 2\n de[k,i] += numpy.einsum('ijkl,jk,il', eri1tmp, dm_cas[q0:q1], dm_core[p0:p1])\n eri1 = eri1tmp = None\n \n"}, "test": {"test_patch": "diff --git a/pyscf/grad/test/test_casci.py b/pyscf/grad/test/test_casci.py\nindex 4fbcd96b32..b75d552b1b 100644\n--- a/pyscf/grad/test/test_casci.py\n+++ b/pyscf/grad/test/test_casci.py\n@@ -459,12 +459,19 @@ def test_symmetrize(self):\n g = mol.RHF.run().CASCI(4, 4).run().Gradients().kernel()\n self.assertAlmostEqual(lib.fp(g), 0.11555543375018221, 6)\n \n+ # issue 1909\n+ def test_small_mem(self):\n+ mol = gto.M(atom=\"\"\"\n+ H -0.00021900 -0.20486000 -2.17721200\n+ H -0.00035900 -1.27718700 -2.17669400\n+ \"\"\", basis='6-31G')\n+ casci = mol.CASCI(2, 2).run()\n+ grad = casci.nuc_grad_method()\n+ grad.max_memory = 0\n+ nuc_grad = grad.kernel()\n+ self.assertAlmostEqual(lib.fp(nuc_grad), 0.09424065197659935, 7)\n+\n \n if __name__ == \"__main__\":\n print(\"Tests for CASCI gradients\")\n- #unittest.main()\n- if 1:\n- setUpModule()\n- mc = mcscf.CASCI(mf, 4, 4)\n- mc = mcscf.addons.state_average_mix_(mc, [mc.fcisolver, mc.fcisolver], (.5, .5))\n- gs = mc.nuc_grad_method().as_scanner()\n+ unittest.main()\n", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}129{"question_id": "MSB_pyscf_pyscf_pr1927", "question_type": "multi_swe_bench", "description": "fix get_bands with k-point symmetry (pyscf/pyscf#1927)", "content": {"org": "pyscf", "repo": "pyscf", "pr_number": 1927, "issue_title": "fix get_bands with k-point symmetry", "issue_body": "Fixes issue #1925.", "base_commit": "9a4b317ad10657c04a4b8f80f104ffc4af6352af", "resolved_issues": [{"number": 1925, "title": "scf.KUKS(cell, kpts).getbands() has problems with symmetry ", "body": "Hello, \r\n\r\nI am using the scf.KUKS object to accelerate my simulations. But when I want to plot the band diagram, it has a problem with the length of different arrays in the KNumInt.eval_rho2 function. ao_kpts has a length of 27 (3x3x3) while mo_coeff_kpts and mo_occ_kpts both have a length of 4 due to symmetry. Am I doing something wrong or is it a bug in the pySCF code? \r\n\r\n```kmesh = [3, 3, 3]\r\nkpts = cell.make_kpts(kmesh, space_group_symmetry=True, time_reversal_symmetry=True)\r\n\r\nrun_scf = True\r\n\r\nif run_scf:\r\n PBE = scf.KUKS(cell, kpts)\r\n PBE = scf.addons.smearing_(PBE, sigma=.1, method='fermi')\r\n PBE.xc = 'PBE'\r\n PBE.verbose = 4\r\n PBE.init_guess_breaksym=False\r\n PBE.init_guess = \"1e\"\r\n PBE.chkfile = 'SrVO3_PBE.chk'\r\n PBE.run();\r\n\r\n## Calculate PBE bands non-selfconsistently\r\nrun_bands = True\r\n\r\n# Define high-symmetry k-paths:\r\nhspoints = {\r\n \"G\": [0.0, 0.0, 0.0],\r\n \"X\": [0.5, 0.0, 0.0],\r\n \"M\": [0.5, 0.5, 0.0],\r\n \"R\": [0.5, 0.5, 0.5]}\r\n\r\nG = hspoints['G']\r\nX = hspoints['X']\r\nM = hspoints['M']\r\nR = hspoints['R']\r\nkpath = [G, X, M, G, R, X]\r\nband_kpts, kpath, sp_points = get_bandpath(kpath, cell.a, npoints=50);\r\n# band_kpts = libkpts.make_kpts(cell, band_kpts, space_group_symmetry=True, time_reversal_symmetry=True)\r\n# band_kpts = cell.get_scaled_kpts(band_kpts, kpts_in_ibz=True)\r\nband_kpts = cell.get_abs_kpts(band_kpts);\r\n\r\nprint(band_kpts)\r\n\r\n\r\n# nscf along high-symmetry path:\r\nif run_bands:\r\n nscf = scf.KUKS(cell, kpts)\r\n nscf.__dict__.update(chkfile.load(\"SrVO3_PBE.chk\", 'scf'))\r\n E_nk = nscf.get_bands(np.array(band_kpts), kpts = kpts)[0] #the error occurs at this line\r\n E_F = nscf.get_fermi()\r\n```"}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/pyscf_m_pyscf:pr-1927", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/pyscf/pbc/dft/krks_ksymm.py b/pyscf/pbc/dft/krks_ksymm.py\nindex 087c0241f1..fb15bf6f40 100644\n--- a/pyscf/pbc/dft/krks_ksymm.py\n+++ b/pyscf/pbc/dft/krks_ksymm.py\n@@ -42,14 +42,14 @@ def get_veff(ks, cell=None, dm=None, dm_last=0, vhf_last=0, hermi=1,\n ground_state = (isinstance(dm, np.ndarray) and dm.ndim == 3 and\n kpts_band is None)\n \n- if kpts_band is None: kpts_band = kpts.kpts_ibz\n- dm_bz = dm\n- if ground_state:\n- if len(dm) != kpts.nkpts_ibz:\n- raise RuntimeError(\"Number of input density matrices does not \\\n- match the number of IBZ kpts: %d vs %d.\"\n- % (len(dm), kpts.nkpts_ibz))\n- dm_bz = kpts.transform_dm(dm)\n+ if kpts_band is None:\n+ kpts_band = kpts.kpts_ibz\n+\n+ if len(dm) != kpts.nkpts_ibz:\n+ raise KeyError('Shape of the input density matrix does not '\n+ 'match the number of IBZ k-points: '\n+ f'{len(dm)} vs {kpts.nkpts_ibz}.')\n+ dm_bz = kpts.transform_dm(dm)\n \n hybrid = ni.libxc.is_hybrid_xc(ks.xc)\n \ndiff --git a/pyscf/pbc/dft/kuks_ksymm.py b/pyscf/pbc/dft/kuks_ksymm.py\nindex 465b2943fb..eb02e674e9 100644\n--- a/pyscf/pbc/dft/kuks_ksymm.py\n+++ b/pyscf/pbc/dft/kuks_ksymm.py\n@@ -41,14 +41,14 @@ def get_veff(ks, cell=None, dm=None, dm_last=0, vhf_last=0, hermi=1,\n # ndim = 4 : dm.shape = ([alpha,beta], nkpts, nao, nao)\n ground_state = (dm.ndim == 4 and dm.shape[0] == 2 and kpts_band is None)\n \n- if kpts_band is None: kpts_band = kpts.kpts_ibz\n- dm_bz = dm\n- if ground_state:\n- if len(dm[0]) != kpts.nkpts_ibz:\n- raise RuntimeError(\"Number of input density matrices does not \\\n- match the number of IBZ kpts: %d vs %d.\"\n- % (len(dm[0]), kpts.nkpts_ibz))\n- dm_bz = kpts.transform_dm(dm)\n+ if kpts_band is None:\n+ kpts_band = kpts.kpts_ibz\n+\n+ if len(dm[0]) != kpts.nkpts_ibz:\n+ raise KeyError('Shape of the input density matrix does not '\n+ 'match the number of IBZ k-points: '\n+ f'{len(dm[0])} vs {kpts.nkpts_ibz}.')\n+ dm_bz = kpts.transform_dm(dm)\n \n hybrid = ni.libxc.is_hybrid_xc(ks.xc)\n \n"}, "test": {"test_patch": "diff --git a/pyscf/pbc/dft/test/test_krks_ksym.py b/pyscf/pbc/dft/test/test_krks_ksym.py\nindex d8977722d6..6c7bd46c4a 100644\n--- a/pyscf/pbc/dft/test/test_krks_ksym.py\n+++ b/pyscf/pbc/dft/test/test_krks_ksym.py\n@@ -19,8 +19,10 @@\n import unittest\n import numpy as np\n \n+from pyscf.lib import finger\n from pyscf.pbc import gto as pbcgto\n from pyscf.pbc import scf as pscf\n+from pyscf.pbc.scf import chkfile\n from pyscf.pbc.dft import krks, kuks, multigrid\n \n def make_primitive_cell(mesh):\n@@ -294,6 +296,33 @@ def test_convert_from(self):\n kumf.kernel(np.asarray([dm,dm]) / 2.)\n self.assertAlmostEqual(kmf.e_tot, kumf.e_tot, 7)\n \n+ def test_get_bands(self):\n+ kpts = cell.make_kpts(nk,\n+ space_group_symmetry=True,\n+ time_reversal_symmetry=True)\n+ kumf = pscf.KUKS(cell, kpts=kpts)\n+ kumf.xc = 'lda'\n+ kumf.chkfile = 'test_get_bands_ksymm.chk'\n+ kumf.kernel()\n+\n+ band_kpts = np.array([[-0.205736, 0.308604, 0.308604],\n+ [-0.25717, 0.308604, 0.308604]])\n+ kumf = pscf.KUKS(cell, kpts=kpts)\n+ kumf.__dict__.update(chkfile.load('test_get_bands_ksymm.chk', 'scf'))\n+ E_nk = kumf.get_bands(band_kpts, kpts=kpts)[0]\n+ E_F = kumf.get_fermi()\n+ self.assertAlmostEqual(finger(np.asarray(E_nk[0])), 0.5575755379561839, 6)\n+ self.assertAlmostEqual(finger(np.asarray(E_nk[1])), 0.5575755379561839, 6)\n+ self.assertAlmostEqual(E_F[0], 0.3093399745201863, 6)\n+ self.assertAlmostEqual(E_F[1], 0.3093399745201863, 6)\n+\n+ kmf = pscf.KRKS(cell, kpts=kpts)\n+ kmf = kmf.convert_from_(kumf)\n+ E_nk = kmf.get_bands(band_kpts, kpts=kpts)[0]\n+ E_F = kmf.get_fermi()\n+ self.assertAlmostEqual(finger(np.asarray(E_nk)), 0.5575755379561839, 6)\n+ self.assertAlmostEqual(E_F, 0.3093399745201863, 6)\n+\n if __name__ == '__main__':\n print(\"Full Tests for DFT with k-point symmetry\")\n unittest.main()\n", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}130{"question_id": "MSB_pyscf_pyscf_pr1943", "question_type": "multi_swe_bench", "description": "Fix decontract_basis function when basis are missed on certain atoms. (Fix #1711) (pyscf/pyscf#1943)", "content": {"org": "pyscf", "repo": "pyscf", "pr_number": 1943, "issue_title": "Fix decontract_basis function when basis are missed on certain atoms. (Fix #1711)", "issue_body": null, "base_commit": "14d88828cd1f18f1e5358da1445355bde55322a1", "resolved_issues": [{"number": 1711, "title": "Choice of basis sets for multi-grid density fitting (NaCl)", "body": "Hi all,\r\n\r\nCan someone please shed some light on why this simple test crashes? This is pretty much based on `examples/pbc/27-multigrid.py`, but I might easily still be doing something very stupid.\r\n\r\n```\r\n#!/usr/bin/env python\r\n\r\nimport numpy as np\r\nfrom pyscf.pbc import df, dft, gto\r\nfrom pyscf.pbc.dft import multigrid\r\n\r\ncell = gto.Cell()\r\ncell.atom = 'Cl 0 0 1; Na 0 1 0'\r\ncell.a = np.eye(3) * 4.\r\ncell.basis = 'gth-dzvp'\r\ncell.pseudo = 'gth-pbe'\r\ncell.verbose = 4\r\ncell.build()\r\n\r\nmf = dft.KRKS(cell)\r\nmf.xc = 'pbe'\r\nmf.with_df = multigrid.MultiGridFFTDF(cell)\r\nmf.verbose = 4\r\nmf.kernel()\r\n```\r\n\r\nI'm getting the following traceback:\r\n\r\n```\r\n******** PBC SCF flags ********\r\nN kpts = 1\r\nExchange divergence treatment (exxdiv) = ewald\r\n madelung (= occupied orbital energy shift) = 0.3753582916854765\r\n Total energy shift due to Ewald probe charge = -1/2 * Nelec*madelung = -3.00286633348\r\nDF object = <pyscf.pbc.dft.multigrid.MultiGridFFTDF object at 0x19f261b50>\r\nXC functionals = pbe\r\nsmall_rho_cutoff = 1e-07\r\nUniform grid, mesh = [113 113 113]\r\n<class 'pyscf.pbc.dft.krks.KRKS'> does not have attributes nlcgrids nlc\r\nSet gradient conv threshold to 0.000316228\r\nTraceback (most recent call last):\r\n File \"/Users/janus/calculations/pyscf/pbc/test_multigrid.py\", line 19, in <module>\r\n mf.kernel()\r\n File \"<string>\", line 2, in kernel\r\n File \"/Users/janus/programs/pyscf/pyscf/scf/hf.py\", line 1691, in scf\r\n kernel(self, self.conv_tol, self.conv_tol_grad,\r\n File \"/Users/janus/programs/pyscf/pyscf/scf/hf.py\", line 127, in kernel\r\n h1e = mf.get_hcore(mol)\r\n File \"/Users/janus/programs/pyscf/pyscf/pbc/scf/khf.py\", line 99, in get_hcore\r\n nuc = lib.asarray(mf.with_df.get_pp(kpts))\r\n File \"/Users/janus/programs/pyscf/pyscf/pbc/dft/multigrid.py\", line 385, in get_pp\r\n vpp = _get_j_pass2(mydf, vpplocG, hermi, kpts_lst)[0]\r\n File \"/Users/janus/programs/pyscf/pyscf/pbc/dft/multigrid.py\", line 856, in _get_j_pass2\r\n t_cell, coeff = t_cell.to_uncontracted_cartesian_basis()\r\n File \"/Users/janus/programs/pyscf/pyscf/gto/mole.py\", line 559, in to_uncontracted_cartesian_basis\r\n return decontract_basis(mol, to_cart=True)\r\n File \"/Users/janus/programs/pyscf/pyscf/gto/mole.py\", line 634, in decontract_basis\r\n lmax = mol._bas[ib0:ib1,ANG_OF].max()\r\n File \"/Users/janus/anaconda3/envs/my-rdkit-env/lib/python3.9/site-packages/numpy/core/_methods.py\", line 39, in _amax\r\n return umr_maximum(a, axis, None, out, keepdims, initial, where)\r\nValueError: zero-size array to reduction operation maximum which has no identity\r\n```\r\n\r\nHEAD is at 6eb7542afc713 from yesterday. Thanks in advance."}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/pyscf_m_pyscf:pr-1943", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/pyscf/gto/mole.py b/pyscf/gto/mole.py\nindex 49f7fe9f34..636322d4c3 100644\n--- a/pyscf/gto/mole.py\n+++ b/pyscf/gto/mole.py\n@@ -626,6 +626,9 @@ def _to_full_contraction(mol, bas_idx):\n \n aoslices = mol.aoslice_by_atom()\n for ia, (ib0, ib1) in enumerate(aoslices[:,:2]):\n+ if ib0 == ib1: # No basis on atom ia\n+ continue\n+\n if atoms is not None:\n if isinstance(atoms, str):\n to_apply = ((atoms == mol.atom_pure_symbol(ia)) or\n"}, "test": {"test_patch": "diff --git a/pyscf/gto/test/test_mole.py b/pyscf/gto/test/test_mole.py\nindex 4adaa7e32a..1a91682db0 100644\n--- a/pyscf/gto/test/test_mole.py\n+++ b/pyscf/gto/test/test_mole.py\n@@ -1033,6 +1033,11 @@ def test_decontract_basis(self):\n s = ctr_coeff.T.dot(pmol.intor('int1e_ovlp')).dot(ctr_coeff)\n self.assertAlmostEqual(abs(s - mol.intor('int1e_ovlp')).max(), 0, 12)\n \n+ # discard basis on atom 2. (related to issue #1711)\n+ mol._bas = mol._bas[:5]\n+ pmol, c = mol.decontract_basis()\n+ self.assertEqual(pmol.nbas, 14)\n+\n mol = gto.M(atom='He',\n basis=('ccpvdz', [[0, [5, 1]], [1, [3, 1]]]))\n pmol, contr_coeff = mol.decontract_basis()\n", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}131{"question_id": "MSB_pyscf_pyscf_pr1947", "question_type": "multi_swe_bench", "description": "Fix rsdf due to the basis sorting in 923d84c05 (issue #1942) (pyscf/pyscf#1947)", "content": {"org": "pyscf", "repo": "pyscf", "pr_number": 1947, "issue_title": "Fix rsdf due to the basis sorting in 923d84c05 (issue #1942)", "issue_body": null, "base_commit": "14d88828cd1f18f1e5358da1445355bde55322a1", "resolved_issues": [{"number": 1942, "title": "Possible bug in RSGDF", "body": "`RSGDF` fails (produces unreasonably high energies and doesn't converge) in a relatively simple case where `GDF` and `FFTDF` both provide reasonable results:\r\n\r\n```\r\nfrom pyscf.pbc import df, dft, gto\r\nimport numpy as np\r\n\r\n\r\ndef main():\r\n # unit cell\r\n a = np.array([[5.87704825, 0., 0.],\r\n [-2.93852412, 5.08967308, 0.],\r\n [0., 0., 9.4108361]])\r\n\r\n atom = '''\r\n Al 0.000000000000e+00 0.000000000000e+00 0.000000000000e+00;\r\n N 1.087472380182e-16 3.393115387675e+00 1.129307415351e+00;\r\n Al 1.087472380182e-16 3.393115387675e+00 4.705418050167e+00;\r\n N 0.000000000000e+00 0.000000000000e+00 5.834725465518e+00;\r\n '''\r\n cell = gto.M(a=a,\r\n atom=atom,\r\n unit='bohr',\r\n basis='gth-szv',\r\n pseudo={'Al': 'GTH-LDA', 'N': 'GTH-LDA'},\r\n verbose=4,\r\n precision=1.0e-12,\r\n spin=0)\r\n cell.build()\r\n kpts = cell.make_kpts([1, 1, 1])\r\n\r\n # Regular GDF works fine for me (E = -23.5674653795703)\r\n #gdf = df.GDF(cell, kpts=kpts)\r\n\r\n # RSGDF doesn't work (unphysically high energies)\r\n gdf = df.RSGDF(cell, kpts=kpts)\r\n\r\n mf = dft.KRKS(cell, kpts=kpts, exxdiv=None, xc='PBE')\r\n mf.with_df = gdf\r\n mf.kernel()\r\n\r\n\r\nif __name__ == '__main__':\r\n main()\r\n```"}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/pyscf_m_pyscf:pr-1947", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/pyscf/gto/mole.py b/pyscf/gto/mole.py\nindex 49f7fe9f34..43a47edaf4 100644\n--- a/pyscf/gto/mole.py\n+++ b/pyscf/gto/mole.py\n@@ -1023,7 +1023,7 @@ def make_env(atoms, basis, pre_env=[], nucmod={}, nucprop={}):\n '''\n _atm = []\n _bas = []\n- _env = []\n+ _env = [pre_env]\n ptr_env = len(pre_env)\n \n for ia, atom in enumerate(atoms):\n@@ -1092,10 +1092,7 @@ def make_env(atoms, basis, pre_env=[], nucmod={}, nucprop={}):\n _bas = numpy.asarray(numpy.vstack(_bas), numpy.int32).reshape(-1, BAS_SLOTS)\n else:\n _bas = numpy.zeros((0,BAS_SLOTS), numpy.int32)\n- if _env:\n- _env = numpy.hstack((pre_env,numpy.hstack(_env)))\n- else:\n- _env = numpy.array(pre_env, copy=False)\n+ _env = numpy.asarray(numpy.hstack(_env), dtype=numpy.float64)\n return _atm, _bas, _env\n \n def make_ecp_env(mol, _atm, ecp, pre_env=[]):\ndiff --git a/pyscf/pbc/df/rsdf_helper.py b/pyscf/pbc/df/rsdf_helper.py\nindex 719235e171..7fa0f74e2e 100644\n--- a/pyscf/pbc/df/rsdf_helper.py\n+++ b/pyscf/pbc/df/rsdf_helper.py\n@@ -37,18 +37,21 @@\n \"\"\"\n class MoleNoBasSort(mol_gto.mole.Mole):\n def build(self, **kwargs):\n- mol_gto.mole.Mole.build(self, **kwargs)\n-\n- # sort self._bas\n- _bas = []\n- for iatm in range(self.natm):\n- atm = self.atom_symbol(iatm)\n- basin = self._basis[atm]\n- bas_ls = [b[0] for b in basin]\n- ls_uniq, ls_inv = np.unique(bas_ls, return_inverse=True)\n- order = np.argsort(np.concatenate([np.where(ls_inv==l)[0] for l in ls_uniq]))\n- _bas.append( self._bas[np.where(self._bas[:,0] == iatm)[0][order]] )\n- self._bas = np.vstack(_bas).astype(np.int32)\n+ self.atom = kwargs.pop('atom')\n+ self.basis = kwargs.pop('basis')\n+ self._atom = mol_gto.format_atom(self.atom)\n+ if isinstance(self.basis, dict):\n+ self._basis = self.basis\n+ else:\n+ self._basis = {a[0]: self.basis for a in self._atom}\n+\n+ env = np.zeros(mol_gto.PTR_ENV_START)\n+ # _bas should be constructed as it is in the input (see issue #1942).\n+ self._atm, self._bas, self._env = self.make_env(\n+ self._atom, self._basis, env)\n+ self._built = True\n+ return self\n+\n def _remove_exp_basis_(bold, amin, amax):\n bnew = []\n for b in bold:\n"}, "test": {"test_patch": "diff --git a/pyscf/pbc/df/test/test_rsdf.py b/pyscf/pbc/df/test/test_rsdf.py\nindex de00bcd0f3..d05a6633de 100644\n--- a/pyscf/pbc/df/test/test_rsdf.py\n+++ b/pyscf/pbc/df/test/test_rsdf.py\n@@ -19,7 +19,7 @@\n from pyscf import ao2mo\n from pyscf.pbc import gto as pgto\n from pyscf.pbc import scf as pscf\n-from pyscf.pbc.df import rsdf\n+from pyscf.pbc.df import rsdf, df\n #from mpi4pyscf.pbc.df import df\n pyscf.pbc.DEBUG = False\n \n@@ -124,6 +124,28 @@ def test_get_eri_0123(self):\n self.assertAlmostEqual(abs(eri0123.imag.sum()), 4.9887958509e-5, 7)\n self.assertAlmostEqual(lib.fp(eri0123), 0.9695261296288074-0.33222740818370966j, 8)\n \n+ def test_rsdf_build(self):\n+ cell = pgto.M(a=numpy.eye(3)*1.8,\n+ atom='''Li 0. 0. 0.; H 0. .5 1.2 ''',\n+ basis={'Li': [[0, [5., 1.]], [0, [.6, 1.]], [1, [3., 1.]]],\n+ 'H': [[0, [.3, 1.]]]})\n+ auxbasis = {'Li': [[0, [5., 1.]], [0, [1.5, 1.]], [1, [.5, 1.]], [2, [2.5, 1.]]],\n+ 'H': [[0, [2., 1.]]]}\n+ numpy.random.seed(2)\n+ dm = numpy.random.random([cell.nao]*2)\n+\n+ gdf = df.GDF(cell)\n+ gdf.auxbasis = auxbasis\n+ jref, kref = gdf.get_jk(dm)\n+\n+ gdf = rsdf.RSGDF(cell)\n+ gdf.auxbasis = auxbasis\n+ vj, vk = gdf.get_jk(dm)\n+\n+ self.assertAlmostEqual(abs(vj - jref).max(), 0, 7)\n+ self.assertAlmostEqual(abs(vk - kref).max(), 0, 7)\n+ self.assertAlmostEqual(lib.fp(vj), 2.383648833459583, 7)\n+ self.assertAlmostEqual(lib.fp(vk), 1.553598328349400, 7)\n \n if __name__ == '__main__':\n print(\"Full Tests for rsdf\")\n", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}132{"question_id": "MSB_pyscf_pyscf_pr1960", "question_type": "multi_swe_bench", "description": "Fix PBC DFT Becke grid rounding error (pyscf/pyscf#1960)", "content": {"org": "pyscf", "repo": "pyscf", "pr_number": 1960, "issue_title": "Fix PBC DFT Becke grid rounding error", "issue_body": "fixes issue #1959 ", "base_commit": "fd8ee3e264affb668874c543562a46239c66871e", "resolved_issues": [{"number": 1959, "title": "PBC DFT Becke grid weights wrong", "body": "PySCF version: [fd8ee3e](https://github.com/pyscf/pyscf/commit/fd8ee3e264affb668874c543562a46239c66871e)\r\nInput:\r\n```\r\nimport numpy as np\r\nfrom pyscf.pbc import gto, dft\r\n\r\natom = '''\r\nCu1 1.927800000000 1.927800000000 1.590250000000\r\nCu1 5.783400000000 5.783400000000 1.590250000000\r\nCu2 1.927800000000 5.783400000000 1.590250000000\r\nCu2 5.783400000000 1.927800000000 1.590250000000\r\nO1 1.927800000000 3.855600000000 1.590250000000\r\nO1 3.855600000000 5.783400000000 1.590250000000\r\nO1 5.783400000000 3.855600000000 1.590250000000\r\nO1 3.855600000000 1.927800000000 1.590250000000\r\nO1 0.000000000000 1.927800000000 1.590250000000\r\nO1 1.927800000000 7.711200000000 1.590250000000\r\nO1 7.711200000000 5.783400000000 1.590250000000\r\nO1 5.783400000000 0.000000000000 1.590250000000\r\nCa 0.000000000000 0.000000000000 0.000000000000\r\nCa 3.855600000000 3.855600000000 0.000000000000\r\nCa 7.711200000000 3.855600000000 0.000000000000\r\nCa 3.855600000000 7.711200000000 0.000000000000\r\n'''\r\n\r\ncell = gto.Cell()\r\ncell.atom = atom\r\ncell.a = np.array(\r\n [[7.7112, 0., 0.],\r\n [0., 7.7112, 0.],\r\n [0., 0., 3.1805]])\r\ncell.verbose = 5\r\ncell.build()\r\n\r\ngrids = dft.gen_grid.BeckeGrids(cell)\r\ngrids.build()\r\n```\r\nOutput:\r\n```\r\ntot grids = 270432\r\ncell vol = 1276.25053 sum(weights) = 1256.85607\r\n```\r\n\r\n"}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/pyscf_m_pyscf:pr-1960", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/pyscf/pbc/dft/gen_grid.py b/pyscf/pbc/dft/gen_grid.py\nindex d5b316a1f6..1cc4d9fa91 100644\n--- a/pyscf/pbc/dft/gen_grid.py\n+++ b/pyscf/pbc/dft/gen_grid.py\n@@ -165,6 +165,7 @@ def get_becke_grids(cell, atom_grid={}, radi_method=dft.radi.gauss_chebyshev,\n b = cell.reciprocal_vectors(norm_to=1)\n supatm_idx = []\n k = 0\n+ tol = 1e-15\n for iL, L in enumerate(Ls):\n for ia in range(cell.natm):\n coords, vol = atom_grids_tab[cell.atom_symbol(ia)]\n@@ -174,24 +175,24 @@ def get_becke_grids(cell, atom_grid={}, radi_method=dft.radi.gauss_chebyshev,\n \n mask = np.ones(c.shape[1], dtype=bool)\n if dimension >= 1:\n- mask &= (c[0]>=-.5) & (c[0]<=.5)\n+ mask &= (c[0]>-.5-tol) & (c[0]<.5+tol)\n if dimension >= 2:\n- mask &= (c[1]>=-.5) & (c[1]<=.5)\n+ mask &= (c[1]>-.5-tol) & (c[1]<.5+tol)\n if dimension == 3:\n- mask &= (c[2]>=-.5) & (c[2]<=.5)\n+ mask &= (c[2]>-.5-tol) & (c[2]<.5+tol)\n \n vol = vol[mask]\n if vol.size > 8:\n c = c[:,mask]\n if dimension >= 1:\n- vol[c[0]==-.5] *= .5\n- vol[c[0]== .5] *= .5\n+ vol[abs(c[0]+.5) < tol] *= .5\n+ vol[abs(c[0]-.5) < tol] *= .5\n if dimension >= 2:\n- vol[c[1]==-.5] *= .5\n- vol[c[1]== .5] *= .5\n+ vol[abs(c[1]+.5) < tol] *= .5\n+ vol[abs(c[1]-.5) < tol] *= .5\n if dimension == 3:\n- vol[c[2]==-.5] *= .5\n- vol[c[2]== .5] *= .5\n+ vol[abs(c[2]+.5) < tol] *= .5\n+ vol[abs(c[2]-.5) < tol] *= .5\n coords = coords[mask]\n coords_all.append(coords)\n weights_all.append(vol)\n"}, "test": {"test_patch": "diff --git a/pyscf/pbc/dft/test/test_gen_grid.py b/pyscf/pbc/dft/test/test_gen_grid.py\nindex 525f5f044a..b8ef48d1b1 100644\n--- a/pyscf/pbc/dft/test/test_gen_grid.py\n+++ b/pyscf/pbc/dft/test/test_gen_grid.py\n@@ -125,6 +125,32 @@ def test_becke_grids_2d_low_dim_ft_type(self):\n s1 = get_ovlp(cell, grids)\n self.assertAlmostEqual(numpy.linalg.norm(s1-s2), 0, 5)\n \n+ def test_becke_grids_round_error(self):\n+ cell = pgto.Cell()\n+ cell.atom = '''\n+ Cu1 1.927800000000 1.927800000000 1.590250000000\n+ Cu1 5.783400000000 5.783400000000 1.590250000000\n+ Cu2 1.927800000000 5.783400000000 1.590250000000\n+ Cu2 5.783400000000 1.927800000000 1.590250000000\n+ O1 1.927800000000 3.855600000000 1.590250000000\n+ O1 3.855600000000 5.783400000000 1.590250000000\n+ O1 5.783400000000 3.855600000000 1.590250000000\n+ O1 3.855600000000 1.927800000000 1.590250000000\n+ O1 0.000000000000 1.927800000000 1.590250000000\n+ O1 1.927800000000 7.711200000000 1.590250000000\n+ O1 7.711200000000 5.783400000000 1.590250000000\n+ O1 5.783400000000 0.000000000000 1.590250000000\n+ '''\n+ cell.a = numpy.array(\n+ [[7.7112, 0., 0.],\n+ [0., 7.7112, 0.],\n+ [0., 0., 3.1805]])\n+ cell.build()\n+\n+ grids = gen_grid.BeckeGrids(cell)\n+ grids.level = 1\n+ grids.build()\n+ assert abs(cell.vol - grids.weights.sum()) < .1\n \n if __name__ == '__main__':\n print(\"Full Tests for Becke grids\")\n", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}133{"question_id": "MSB_pyscf_pyscf_pr1963", "question_type": "multi_swe_bench", "description": "Fix basis order issue in molden.load (issue #1961) (pyscf/pyscf#1963)", "content": {"org": "pyscf", "repo": "pyscf", "pr_number": 1963, "issue_title": "Fix basis order issue in molden.load (issue #1961)", "issue_body": null, "base_commit": "e64ed3171982f159f204c6a68febc7049d59356a", "resolved_issues": [{"number": 1961, "title": "Re-ordering basis functions introduces mismatch", "body": "#1620 introduced ordering basis functions if they are not ordered correctly. When using `molden.load` to load molecules from molden files, the MO coefficients are not ordered accordingly, which leads to a mismatch and therefore wrong results. \r\nOne example would be the minimally augmented basis sets (like ma-def2-SVP) from ORCA, which have some s-type AOs appended after the p-type AOs from the standard def2-SVP.\r\n\r\nThe code has changed significantly since #1620, which makes fixing the problem a bit harder."}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/pyscf_m_pyscf:pr-1963", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/pyscf/gto/mole.py b/pyscf/gto/mole.py\nindex c8e460afef..b515875dee 100644\n--- a/pyscf/gto/mole.py\n+++ b/pyscf/gto/mole.py\n@@ -419,7 +419,7 @@ def str2atm(line):\n return list(zip(z, c.tolist()))\n \n #TODO: sort exponents\n-def format_basis(basis_tab):\n+def format_basis(basis_tab, sort_basis=True):\n '''Convert the input :attr:`Mole.basis` to the internal data format.\n \n ``{ atom: [(l, ((-exp, c_1, c_2, ..),\n@@ -457,10 +457,16 @@ def format_basis(basis_tab):\n fmt_basis = {}\n for atom, atom_basis in basis_tab.items():\n symb = _atom_symbol(atom)\n- fmt_basis[symb] = basis_converter(symb, atom_basis)\n-\n- if len(fmt_basis[symb]) == 0:\n+ _basis = basis_converter(symb, atom_basis)\n+ if len(_basis) == 0:\n raise BasisNotFoundError('Basis not found for %s' % symb)\n+\n+ # Sort basis accroding to angular momentum. This is important for method\n+ # decontract_basis, which assumes that basis functions with the same\n+ # angular momentum are grouped together. Related to issue #1620 #1770\n+ if sort_basis:\n+ _basis = sorted([b for b in _basis if b], key=lambda b: b[0])\n+ fmt_basis[symb] = _basis\n return fmt_basis\n \n def _generate_basis_converter():\n@@ -503,11 +509,6 @@ def converter(symb, raw_basis):\n _basis.extend(nparray_to_list(rawb))\n else:\n _basis = nparray_to_list(raw_basis)\n-\n- # Sort basis accroding to angular momentum. This is important for method\n- # decontract_basis, which assumes that basis functions with the same\n- # angular momentum are grouped together. Related to issue #1620 #1770\n- _basis = sorted([b for b in _basis if b], key=lambda b: b[0])\n return _basis\n return converter\n \n@@ -654,6 +655,8 @@ def _to_full_contraction(mol, bas_idx):\n bas_idx = ib0 + numpy.where(mol._bas[ib0:ib1,ANG_OF] == l)[0]\n if len(bas_idx) == 0:\n continue\n+ if bas_idx[0] + len(bas_idx) != bas_idx[-1] + 1:\n+ raise NotImplementedError('Discontinuous bases of same angular momentum')\n \n mol_exps, b_coeff = _to_full_contraction(mol, bas_idx)\n nprim, nc = b_coeff.shape\n@@ -2523,11 +2526,13 @@ def build(self, dump_input=True, parse_arg=ARGPARSE,\n if self.verbose >= logger.WARN:\n self.check_sanity()\n \n- self._atom = self.format_atom(self.atom, unit=self.unit)\n+ if self.atom:\n+ self._atom = self.format_atom(self.atom, unit=self.unit)\n uniq_atoms = {a[0] for a in self._atom}\n \n- _basis = _parse_default_basis(self.basis, uniq_atoms)\n- self._basis = self.format_basis(_basis)\n+ if self.basis:\n+ _basis = _parse_default_basis(self.basis, uniq_atoms)\n+ self._basis = self.format_basis(_basis)\n env = self._env[:PTR_ENV_START]\n self._atm, self._bas, self._env = \\\n self.make_env(self._atom, self._basis, env, self.nucmod,\n@@ -2643,30 +2648,12 @@ def _build_symmetry(self, *args, **kwargs):\n for ir in self.irrep_id]\n return self\n \n- @lib.with_doc(format_atom.__doc__)\n- def format_atom(self, atom, origin=0, axes=None, unit='Ang'):\n- return format_atom(atom, origin, axes, unit)\n-\n- @lib.with_doc(format_basis.__doc__)\n- def format_basis(self, basis_tab):\n- return format_basis(basis_tab)\n-\n- @lib.with_doc(format_pseudo.__doc__)\n- def format_pseudo(self, pseudo_tab):\n- return format_pseudo(pseudo_tab)\n-\n- @lib.with_doc(format_ecp.__doc__)\n- def format_ecp(self, ecp_tab):\n- return format_ecp(ecp_tab)\n-\n- @lib.with_doc(expand_etb.__doc__)\n- def expand_etb(self, l, n, alpha, beta):\n- return expand_etb(l, n, alpha, beta)\n-\n- @lib.with_doc(expand_etbs.__doc__)\n- def expand_etbs(self, etbs):\n- return expand_etbs(etbs)\n- etbs = expand_etbs\n+ format_atom = staticmethod(format_atom)\n+ format_basis = staticmethod(format_basis)\n+ format_pseudo = staticmethod(format_pseudo)\n+ format_ecp = staticmethod(format_ecp)\n+ expand_etb = staticmethod(expand_etb)\n+ expand_etbs = etbs = staticmethod(expand_etbs)\n \n @lib.with_doc(make_env.__doc__)\n def make_env(self, atoms, basis, pre_env=[], nucmod={}, nucprop=None):\ndiff --git a/pyscf/tools/molden.py b/pyscf/tools/molden.py\nindex 8d0ac4e48f..07862101be 100644\n--- a/pyscf/tools/molden.py\n+++ b/pyscf/tools/molden.py\n@@ -239,8 +239,16 @@ def read_one_bas(lsym, nb, fac=1):\n elif dat[0].upper() in 'SPDFGHIJ':\n basis[symb].append(read_one_bas(*dat))\n \n- mol.basis = envs['basis'] = basis\n mol.atom = [atoms[i] for i in atom_seq]\n+ uniq_atoms = {a[0] for a in mol.atom}\n+\n+ # To avoid the mol.build() sort the basis, disable mol.basis and set the\n+ # internal data _basis directly. It is a workaround to solve issue #1961.\n+ # Mole.decontract_basis function should be rewritten to support\n+ # discontinuous bases that have the same angular momentum.\n+ mol.basis = {}\n+ _basis = gto.mole._parse_default_basis(basis, uniq_atoms)\n+ mol._basis = envs['basis'] = gto.format_basis(_basis, sort_basis=False)\n return mol\n \n def _parse_mo(lines, envs):\n@@ -353,6 +361,8 @@ def load(moldenfile, verbose=0):\n else:\n sys.stderr.write('Unknown section %s\\n' % sec_title)\n \n+ mo_energy, mo_coeff, mo_occ, irrep_labels, spins = None, None, None, None, None\n+\n for sec_kind in _SEC_ORDER:\n if sec_kind == 'MO' and 'MO' in sec_kinds:\n if len(sec_kinds['MO']) == 1:\n@@ -392,6 +402,8 @@ def load(moldenfile, verbose=0):\n if isinstance(mo_occ, tuple):\n mol.spin = int(mo_occ[0].sum() - mo_occ[1].sum())\n \n+ if not mol._built:\n+ mol.build(0, 0)\n return mol, mo_energy, mo_coeff, mo_occ, irrep_labels, spins\n \n parse = read = load\n@@ -503,8 +515,9 @@ def remove_high_l(mol, mo_coeff=None):\n '''\n pmol = mol.copy()\n pmol.basis = {}\n+ pmol._basis = {}\n for symb, bas in mol._basis.items():\n- pmol.basis[symb] = [b for b in bas if b[0] <= 4]\n+ pmol._basis[symb] = [b for b in bas if b[0] <= 4]\n pmol.build(0, 0)\n if mo_coeff is None:\n return pmol, None\n"}, "test": {"test_patch": "diff --git a/pyscf/tools/test/test_molden.py b/pyscf/tools/test/test_molden.py\nindex 9d0cca7f66..944c7c9178 100644\n--- a/pyscf/tools/test/test_molden.py\n+++ b/pyscf/tools/test/test_molden.py\n@@ -82,6 +82,53 @@ def test_dump_cartesian_gto_symm_orbital(self):\n mo_coeff = res[2]\n self.assertAlmostEqual(abs(mf.mo_coeff-mo_coeff).max(), 0, 12)\n \n+ def test_basis_not_sorted(self):\n+ with tempfile.NamedTemporaryFile('w') as ftmp:\n+ ftmp.write('''\\\n+[Molden Format]\n+made by pyscf v[2.4.0]\n+[Atoms] (AU)\n+Ne 1 10 0.00000000000000 0.00000000000000 0.00000000000000\n+[GTO]\n+1 0\n+ s 8 1.00\n+ 17880 0.00073769817327139\n+ 2683 0.0056746782244738\n+ 611.5 0.028871187450674\n+ 173.5 0.10849560938601\n+ 56.64 0.29078802505672\n+ 20.42 0.44814064476114\n+ 7.81 0.25792047270532\n+ 1.653 0.015056839544698\n+ s 8 1.00\n+ 17880 -0.00033214909943481\n+ 2683 -0.0026205019065875\n+ 611.5 -0.013009816761002\n+ 173.5 -0.053420003125961\n+ 56.64 -0.14716522424261\n+ 20.42 -0.33838075724805\n+ 7.81 -0.20670101921688\n+ 1.653 1.0950299234565\n+ s 1 1.00\n+ 0.4869 1\n+ p 3 1.00\n+ 28.39 0.066171986640049\n+ 6.27 0.34485329752845\n+ 1.695 0.73045763818875\n+ p 1 1.00\n+ 0.4317 1\n+ d 1 1.00\n+ 2.202 1\n+ s 1 1.00\n+ 1 1\n+\n+[5d]\n+[7f]\n+[9g]\n+''')\n+ ftmp.flush()\n+ mol = molden.load(ftmp.name)[0]\n+ self.assertEqual(mol._bas[:,1].tolist(), [0, 0, 0, 1, 1, 2, 0])\n \n if __name__ == \"__main__\":\n print(\"Full Tests for molden\")\n", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}134{"question_id": "MSB_pyscf_pyscf_pr2010", "question_type": "multi_swe_bench", "description": "Chkfile initial guess problem in ROHF and ROKS (issue #1986) (pyscf/pyscf#2010)", "content": {"org": "pyscf", "repo": "pyscf", "pr_number": 2010, "issue_title": "Chkfile initial guess problem in ROHF and ROKS (issue #1986)", "issue_body": null, "base_commit": "0bc590ffddec98eec5d2513a3d85274b7a791bc6", "resolved_issues": [{"number": 1986, "title": "geometry optimization with dispersion correction", "body": "Hi,\r\nI tried to optimize a molecule with B3LYP-D3/D4 ([Simple DFT-D3](https://dftd3.readthedocs.io/en/latest/index.html)). But there are some errors. \r\n\r\n```\r\nfrom pyscf import gto, dft, scf\r\nimport dftd3.pyscf as disp\r\nfrom pyscf.geomopt.geometric_solver import optimize\r\n\r\n#no spin RHF\r\ntry:\r\n mol = gto.M(atom='O 0 0 0; O 0 0 1.8', unit='ANG', basis='631g*')\r\n mf = scf.RHF(mol)\r\n #mf.xc='b3lyp'\r\n grad=disp.energy(mf).nuc_grad_method().as_scanner()\r\n grad.optimizer().kernel()\r\n print(\"no spin RHF: OK\")\r\nexcept Exception as e:\r\n print(e)\r\n\r\n\r\n#spin=1 hydroxides RHF\r\ntry:\r\n mol = gto.M(atom='H 0 0 0; O 0 0 1.8', unit='ANG', basis='631g*', spin=1)\r\n mf = scf.RHF(mol)\r\n #mf.xc='b3lyp'\r\n grad=disp.energy(mf).nuc_grad_method().as_scanner()\r\n grad.optimizer().kernel()\r\n print(\"spin=1 RHF: OK\")\r\nexcept Exception as e:\r\n print(e)\r\n\r\n#spin=0 RKS\r\ntry:\r\n mol = gto.M(atom='O 0 0 0; O 0 0 1.8', unit='ANG', basis='631g*')\r\n mf = dft.RKS(mol)\r\n mf.xc='b3lyp'\r\n grad=disp.energy(mf).nuc_grad_method().as_scanner()\r\n grad.optimizer().kernel()\r\n print(\"spin=0 RKS: OK\")\r\nexcept Exception as e:\r\n print(e)\r\n\r\n```\r\nThe above optimization works.\r\n\r\n```\r\n#spin=1 hydroxides RKS\r\ntry:\r\n mol = gto.M(atom='H 0 0 0; O 0 0 1.8', unit='ANG', basis='631g*', spin=1)\r\n mf = dft.RKS(mol)\r\n mf.xc='b3lyp'\r\n grad=disp.energy(mf).nuc_grad_method().as_scanner()\r\n grad.optimizer().kernel()\r\n print(\"spin=1 RKS: OK\")\r\nexcept Exception as e:\r\n print(e)\r\n\r\n#spin=2 RKS\r\ntry:\r\n mol = gto.M(atom='O 0 0 0; O 0 0 1.8', unit='ANG', basis='631g*', spin=2)\r\n mf = dft.RKS(mol)\r\n mf.xc='b3lyp'\r\n grad=disp.energy(mf).nuc_grad_method().as_scanner()\r\n grad.optimizer().kernel()\r\n print(\"spin=2 RKS: OK\")\r\nexcept Exception as e:\r\n print(e)\r\n```\r\nWhen introducing spin to RKS, an error was raised: ''\r\nmo_occ_a = (dm.mo_occ > 0).astype(numpy.double)\r\n ^^^^^^^^^^^^^\r\nTypeError: '>' not supported between instances of 'list' and 'int'\r\n\r\n\r\nWhen implementing UKS, it raised 'scf_grad must be an instance of Gradients'.\r\n```\r\n#spin=1 hydroxides UKS\r\ntry:\r\n mol = gto.M(atom='H 0 0 0; O 0 0 1.8', unit='ANG', basis='631g*', spin=1)\r\n mf = dft.UKS(mol)\r\n mf.xc='b3lyp'\r\n grad=disp.energy(mf).nuc_grad_method().as_scanner()\r\n grad.optimizer().kernel()\r\n print(\"spin UKS: OK\")\r\nexcept Exception as e:\r\n print(e)\r\n```\r\nSo, it seems that 'spin' does not work for dft-d3 correction? And UKS is not supported?\r\nI am not sure if these errors are rooted in pyscf or dftd3/d4 package. But they all work well without dftd3. \r\n"}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/pyscf_m_pyscf:pr-2010", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/.github/workflows/ci_linux/build_pyscf.sh b/.github/workflows/ci_linux/build_pyscf.sh\nindex 04e2aac97b..d9bd1b39e7 100755\n--- a/.github/workflows/ci_linux/build_pyscf.sh\n+++ b/.github/workflows/ci_linux/build_pyscf.sh\n@@ -5,7 +5,7 @@ set -e\n cd ./pyscf/lib\n curl -L \"https://github.com/pyscf/pyscf-build-deps/blob/master/pyscf-2.4a-deps.tar.gz?raw=true\" | tar xzf -\n mkdir build; cd build\n-cmake -DBUILD_LIBXC=OFF -DBUILD_XCFUN=OFF -DBUILD_LIBCINT=OFF -DXCFUN_MAX_ORDER=4 ..\n+cmake -DBUILD_LIBXC=OFF -DBUILD_XCFUN=ON -DBUILD_LIBCINT=OFF -DXCFUN_MAX_ORDER=4 ..\n make -j4\n cd ..\n rm -Rf build\ndiff --git a/pyscf/scf/hf.py b/pyscf/scf/hf.py\nindex 8536176c47..37982c581f 100644\n--- a/pyscf/scf/hf.py\n+++ b/pyscf/scf/hf.py\n@@ -656,12 +656,66 @@ def init_guess_by_chkfile(mol, chkfile_name, project=None):\n '''Read the HF results from checkpoint file, then project it to the\n basis defined by ``mol``\n \n+ Kwargs:\n+ project : None or bool\n+ Whether to project chkfile's orbitals to the new basis. Note when\n+ the geometry of the chkfile and the given molecule are very\n+ different, this projection can produce very poor initial guess.\n+ In PES scanning, it is recommended to switch off project.\n+\n+ If project is set to None, the projection is only applied when the\n+ basis sets of the chkfile's molecule are different to the basis\n+ sets of the given molecule (regardless whether the geometry of\n+ the two molecules are different). Note the basis sets are\n+ considered to be different if the two molecules are derived from\n+ the same molecule with different ordering of atoms.\n+\n Returns:\n Density matrix, 2D ndarray\n '''\n- from pyscf.scf import uhf\n- dm = uhf.init_guess_by_chkfile(mol, chkfile_name, project)\n- return dm[0] + dm[1]\n+ from pyscf.scf import addons\n+ chk_mol, scf_rec = chkfile.load_scf(chkfile_name)\n+ if project is None:\n+ project = not gto.same_basis_set(chk_mol, mol)\n+\n+ # Check whether the two molecules are similar\n+ im1 = scipy.linalg.eigvalsh(mol.inertia_moment())\n+ im2 = scipy.linalg.eigvalsh(chk_mol.inertia_moment())\n+ # im1+1e-7 to avoid 'divide by zero' error\n+ if abs((im1-im2)/(im1+1e-7)).max() > 0.01:\n+ logger.warn(mol, \"Large deviations found between the input \"\n+ \"molecule and the molecule from chkfile\\n\"\n+ \"Initial guess density matrix may have large error.\")\n+\n+ if project:\n+ s = get_ovlp(mol)\n+\n+ def fproj(mo):\n+ if project:\n+ mo = addons.project_mo_nr2nr(chk_mol, mo, mol)\n+ norm = numpy.einsum('pi,pi->i', mo.conj(), s.dot(mo))\n+ mo /= numpy.sqrt(norm)\n+ return mo\n+\n+ mo = scf_rec['mo_coeff']\n+ mo_occ = scf_rec['mo_occ']\n+ if getattr(mo[0], 'ndim', None) == 1: # RHF\n+ if numpy.iscomplexobj(mo):\n+ raise NotImplementedError('TODO: project DHF orbital to UHF orbital')\n+ mo_coeff = fproj(mo)\n+ dm = make_rdm1(mo_coeff, mo_occ)\n+ else: #UHF\n+ if getattr(mo[0][0], 'ndim', None) == 2: # KUHF\n+ logger.warn(mol, 'k-point UHF results are found. Density matrix '\n+ 'at Gamma point is used for the molecular SCF initial guess')\n+ mo = mo[0]\n+ dma = make_rdm1(fproj(mo[0]), mo_occ[0])\n+ dmb = make_rdm1(fproj(mo[1]), mo_occ[1])\n+ dm = dma + dmb\n+ s = get_ovlp(mol)\n+ _, mo_coeff = scipy.linalg.eigh(dm, s, type=2)\n+ dm = lib.tag_array(dm, mo_coeff=mo_coeff[:,::-1], mo_occ=mo_occ)\n+ return dm\n \n \n def get_init_guess(mol, key='minao'):\n@@ -1358,11 +1412,9 @@ def __call__(self, mol_or_geom, **kwargs):\n dm0 = kwargs.pop('dm0')\n elif self.mo_coeff is None:\n dm0 = None\n- elif self.chkfile and h5py.is_hdf5(self.chkfile):\n- dm0 = self.from_chk(self.chkfile)\n else:\n dm0 = None\n- # dm0 form last calculation cannot be used in the current\n+ # dm0 form last calculation may not be used in the current\n # calculation if a completely different system is given.\n # Obviously, the systems are very different if the number of\n # basis functions are different.\n@@ -1371,6 +1423,8 @@ def __call__(self, mol_or_geom, **kwargs):\n # last calculation.\n if numpy.array_equal(self._last_mol_fp, mol.ao_loc):\n dm0 = self.make_rdm1()\n+ elif self.chkfile and h5py.is_hdf5(self.chkfile):\n+ dm0 = self.from_chk(self.chkfile)\n self.mo_coeff = None # To avoid last mo_coeff being used by SOSCF\n e_tot = self.kernel(dm0=dm0, **kwargs)\n self._last_mol_fp = mol.ao_loc\ndiff --git a/pyscf/scf/rohf.py b/pyscf/scf/rohf.py\nindex 777a9a5b17..f1243e9935 100644\n--- a/pyscf/scf/rohf.py\n+++ b/pyscf/scf/rohf.py\n@@ -49,7 +49,28 @@ def init_guess_by_atom(mol):\n \n init_guess_by_huckel = uhf.init_guess_by_huckel\n init_guess_by_mod_huckel = uhf.init_guess_by_mod_huckel\n-init_guess_by_chkfile = uhf.init_guess_by_chkfile\n+\n+def init_guess_by_chkfile(mol, chkfile_name, project=None):\n+ '''Read SCF chkfile and make the density matrix for ROHF initial guess.\n+\n+ Kwargs:\n+ project : None or bool\n+ Whether to project chkfile's orbitals to the new basis. Note when\n+ the geometry of the chkfile and the given molecule are very\n+ different, this projection can produce very poor initial guess.\n+ In PES scanning, it is recommended to switch off project.\n+\n+ If project is set to None, the projection is only applied when the\n+ basis sets of the chkfile's molecule are different to the basis\n+ sets of the given molecule (regardless whether the geometry of\n+ the two molecules are different). Note the basis sets are\n+ considered to be different if the two molecules are derived from\n+ the same molecule with different ordering of atoms.\n+ '''\n+ dm = uhf.init_guess_by_chkfile(mol, chkfile_name, project)\n+ mo_coeff = dm.mo_coeff[0]\n+ mo_occ = dm.mo_occ[0] + dm.mo_occ[1]\n+ return lib.tag_array(dm, mo_coeff=mo_coeff, mo_occ=mo_occ)\n \n def get_fock(mf, h1e=None, s1e=None, vhf=None, dm=None, cycle=-1, diis=None,\n diis_start_cycle=None, level_shift_factor=None, damp_factor=None):\n"}, "test": {"test_patch": "diff --git a/pyscf/dft/test/test_he.py b/pyscf/dft/test/test_he.py\nindex 791593616d..27f6f0a08f 100644\n--- a/pyscf/dft/test/test_he.py\n+++ b/pyscf/dft/test/test_he.py\n@@ -14,6 +14,7 @@\n # limitations under the License.\n \n import unittest\n+import tempfile\n import numpy\n from pyscf import gto\n from pyscf import lib\n@@ -191,6 +192,21 @@ def test_convert(self):\n self.assertTrue(isinstance(udks.to_dhf(), scf.dhf.DHF))\n self.assertTrue(isinstance(udks.to_dks('pbe'), dft.dks.DKS))\n \n+ # issue 1986\n+ def test_init_guess_chkfile(self):\n+ with tempfile.NamedTemporaryFile() as tmpf:\n+ mol = gto.M(atom='He 0 0 0', basis='631g', charge=1, spin=1)\n+ mf = dft.RKS(mol)\n+ mf.chkfile = tmpf.name\n+ e1 = mf.kernel()\n+ mf = dft.RKS(mol)\n+ mf.init_guess = 'chkfile'\n+ mf.chkfile = tmpf.name\n+ mf.max_cycle = 1\n+ e2 = mf.kernel()\n+ self.assertAlmostEqual(e1, e2, 9)\n+\n+\n if __name__ == \"__main__\":\n print(\"Full Tests for He\")\n unittest.main()\ndiff --git a/pyscf/dft/test/test_xc_deriv.py b/pyscf/dft/test/test_xc_deriv.py\nindex 03655f45e1..b6e430ffc2 100644\n--- a/pyscf/dft/test/test_xc_deriv.py\n+++ b/pyscf/dft/test/test_xc_deriv.py\n@@ -415,7 +415,7 @@ def test_libxc_mgga_deriv3(self):\n self.assertAlmostEqual(xc1.sum(), 19.977512805950784, 7)\n self.assertAlmostEqual(abs(ref[1] - xc1).max(), 0, 9)\n \n- @unittest.skip(dft.libxc.max_deriv_order('pbe,') <= 3)\n+ @unittest.skipIf(dft.libxc.max_deriv_order('pbe,') <= 3, 'libxc order')\n def test_libxc_gga_deriv4(self):\n rho1 = rho[:,:4].copy()\n xc1 = dft.libxc.eval_xc_eff('PBE', rho1, deriv=4)\n@@ -425,7 +425,7 @@ def test_libxc_gga_deriv4(self):\n xc1 = dft.libxc.eval_xc_eff('PBE', rho1, deriv=4)\n self.assertAlmostEqual(xc1.sum(), -869.6617638095072, 4)\n \n- @unittest.skip(not hasattr(dft, 'xcfun'))\n+ @unittest.skipIf(not hasattr(dft, 'xcfun'), 'xcfun order')\n def test_xcfun_lda_deriv3(self):\n rho1 = rho[:,0].copy()\n ref = eval_xc_eff('LDA,', rho1, 3, dft.xcfun)\n@@ -457,7 +457,7 @@ def test_xcfun_lda_deriv3(self):\n self.assertAlmostEqual(xc1.sum(), -2.7477984980958627, 9)\n self.assertAlmostEqual(abs(ref[1] - xc1).max(), 0, 9)\n \n- @unittest.skip(not hasattr(dft, 'xcfun'))\n+ @unittest.skipIf(not hasattr(dft, 'xcfun'), 'xcfun order')\n def test_xcfun_gga_deriv3(self):\n rho1 = rho[:,:4].copy()\n ref = eval_xc_eff('PBE', rho1, 3, dft.xcfun)\n@@ -489,7 +489,7 @@ def test_xcfun_gga_deriv3(self):\n self.assertAlmostEqual(xc1.sum(), -3.0715856471099032, 9)\n self.assertAlmostEqual(abs(ref[1] - xc1).max(), 0, 9)\n \n- @unittest.skip(not hasattr(dft, 'xcfun'))\n+ @unittest.skipIf(not hasattr(dft, 'xcfun'), 'xcfun order')\n def test_xcfun_mgga_deriv3(self):\n rho1 = rho\n ref = eval_xc_eff('M06', rho1, 3, dft.xcfun)\n@@ -521,7 +521,7 @@ def test_xcfun_mgga_deriv3(self):\n self.assertAlmostEqual(xc1.sum(), 19.977512805950784, 9)\n self.assertAlmostEqual(abs(ref[1] - xc1).max(), 0, 9)\n \n- @unittest.skip(not (hasattr(dft, 'xcfun') and dft.xcfun.MAX_DERIV_ORDER > 3))\n+ @unittest.skipIf(not (hasattr(dft, 'xcfun') and dft.xcfun.MAX_DERIV_ORDER > 3), 'xcfun order')\n def test_xcfun_gga_deriv4(self):\n rho1 = rho[:,:4].copy()\n xc1 = dft.xcfun.eval_xc_eff('PBE', rho1, deriv=4)\n", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}135{"question_id": "MSB_pyscf_pyscf_pr2050", "question_type": "multi_swe_bench", "description": "Improve cistring.addr2str for large address (issue #1886) (pyscf/pyscf#2050)", "content": {"org": "pyscf", "repo": "pyscf", "pr_number": 2050, "issue_title": "Improve cistring.addr2str for large address (issue #1886)", "issue_body": null, "base_commit": "a20dfb31e0bcbe234d705552103839726e670da1", "resolved_issues": [{"number": 1886, "title": "cistring error", "body": "Using `int32` for the indices causes issues when the range of indices exceeds the representable range of `int32`. For example, the following program crashes with `floating point exception (core dumped)`:\r\n```python\r\nfrom pyscf.fci import cistring\r\n\r\nnorb = 48\r\nnelec = 24\r\n\r\nstring = 0b101100101000111111101011001001010001000100011011\r\naddress = cistring.str2addr(norb=norb, nelec=nelec, string=string)\r\nstring2 = cistring.addr2str(norb=norb, nelec=nelec, addr=address)\r\n```\r\nAdditionally, these functions might succeed but give incorrect results. For example, this code does get to the assert statement, but that assertion fails:\r\n```python\r\nfrom pyscf.fci import cistring\r\n\r\nstring = 0b101101111101101111001110111111110111111100\r\naddress = cistring.str2addr(norb=63, nelec=32, string=string)\r\nstring2 = cistring.addr2str(norb=63, nelec=32, addr=address)\r\nassert string == string2\r\n```\r\n"}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/pyscf_m_pyscf:pr-2050", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/pyscf/fci/cistring.py b/pyscf/fci/cistring.py\nindex 983178ff54..0ef463d693 100644\n--- a/pyscf/fci/cistring.py\n+++ b/pyscf/fci/cistring.py\n@@ -343,12 +343,13 @@ def addr2str(norb, nelec, addr):\n '''Convert CI determinant address to string'''\n if norb >= 64:\n raise NotImplementedError('norb >= 64')\n- assert num_strings(norb, nelec) > addr\n+ max_addr = num_strings(norb, nelec)\n+ assert max_addr > addr\n \n- if addr < 2**31:\n+ if max_addr < 2**31:\n return addrs2str(norb, nelec, [addr])[0]\n-\n- return _addr2str(norb, nelec, addr)\n+ else:\n+ return _addr2str(norb, nelec, addr)\n \n def _addr2str(norb, nelec, addr):\n if addr == 0 or nelec == norb or nelec == 0:\n"}, "test": {"test_patch": "diff --git a/pyscf/fci/test/test_cistring.py b/pyscf/fci/test/test_cistring.py\nindex 634d92a7cd..dcd5d6f988 100644\n--- a/pyscf/fci/test/test_cistring.py\n+++ b/pyscf/fci/test/test_cistring.py\n@@ -156,6 +156,12 @@ def test_addr2str(self):\n self.assertEqual(bin(cistring.addr2str(6, 3, 8)), '0b11010')\n self.assertEqual(bin(cistring.addr2str(7, 4, 9)), '0b110011')\n \n+ # Test large addresss\n+ string = 0b101101111101101111001110111111110111111100\n+ address = cistring.str2addr(norb=63, nelec=32, string=string)\n+ string2 = cistring.addr2str(norb=63, nelec=32, addr=address)\n+ self.assertEqual(string, string2)\n+\n def test_str2addr(self):\n self.assertEqual(str2addr(6, 3, int('0b11001' ,2)), cistring.str2addr(6, 3, int('0b11001' ,2)))\n self.assertEqual(str2addr(6, 3, int('0b11010' ,2)), cistring.str2addr(6, 3, int('0b11010' ,2)))\n", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}136{"question_id": "MSB_pyscf_pyscf_pr2062", "question_type": "multi_swe_bench", "description": "Check cylindrical symmetry of the orbitals for FCI solver (issue #2022) (pyscf/pyscf#2062)", "content": {"org": "pyscf", "repo": "pyscf", "pr_number": 2062, "issue_title": "Check cylindrical symmetry of the orbitals for FCI solver (issue #2022)", "issue_body": null, "base_commit": "0e0345b751a44023c56dcdaa4f4b69075a547443", "resolved_issues": [{"number": 2022, "title": "CASSCF with symmetry for B-H throws an error", "body": "Hi,\r\n\r\nCalculating the CAS(2,2) energy of B-H with `symmetry=True` throws an error. For Li-H or for `symmetry=False` or for CAS(3,2) there is no error. Issue #1548 seemed to be related. Also, I am running PySCF 2.4.0.\r\n\r\nCould someone help figure this out? Thanks!\r\n\r\n```\r\nfrom pyscf import gto, scf, mcscf\r\n\r\n### CAS(3,2) runs fine\r\nmol1 = gto.M(atom=\"B 0 0 0; H 1.5 0 0\", basis=\"sto3g\", symmetry=True)\r\nmc1 = mcscf.CASSCF(scf.RHF(mol1).run(), 3, 2)\r\nmc1.kernel()\r\n\r\n### Li-H runs fine\r\nmol2 = gto.M(atom=\"Li 0 0 0; H 1.5 0 0\", basis=\"sto3g\", symmetry=True)\r\nmc2 = mcscf.CASSCF(scf.RHF(mol2).run(), 2, 2)\r\nmc2.kernel()\r\n\r\n### symmetry=False runs fine\r\nmol3 = gto.M(atom=\"B 0 0 0; H 1.5 0 0\", basis=\"sto3g\", symmetry=False)\r\nmc3 = mcscf.CASSCF(scf.RHF(mol3).run(), 2, 2)\r\nmc3.kernel()\r\n\r\n### throws error\r\nmol4 = gto.M(atom=\"B 0 0 0; H 1.5 0 0\", basis=\"sto3g\", symmetry=True)\r\nmc4 = mcscf.CASSCF(scf.RHF(mol4).run(), 2, 2)\r\nmc4.kernel()\r\n```\r\n\r\nthe output is\r\n\r\n```\r\nconverged SCF energy = -24.7216853309577\r\n/Users/vrn738/PycharmProjects/mrpt2/venv/lib/python3.11/site-packages/numpy/linalg/linalg.py:2180: RuntimeWarning: divide by zero encountered in det\r\n r = _umath_linalg.det(a, signature=signature)\r\n/Users/vrn738/PycharmProjects/mrpt2/venv/lib/python3.11/site-packages/numpy/linalg/linalg.py:2180: RuntimeWarning: invalid value encountered in det\r\n r = _umath_linalg.det(a, signature=signature)\r\nCASSCF energy = -24.7615485480989\r\nCASCI E = -24.7615485480989 E(CI) = -1.32807642898465 S^2 = 0.0000000\r\nconverged SCF energy = -7.86335762153512\r\nCASSCF energy = -7.88099257585260\r\nCASCI E = -7.88099257585260 E(CI) = -1.09902483008292 S^2 = 0.0000000\r\nconverged SCF energy = -24.7216853309577\r\nCASSCF energy = -24.7435717749394\r\nCASCI E = -24.7435717749394 E(CI) = -1.29911474076125 S^2 = 0.0000000\r\nconverged SCF energy = -24.7216853309577\r\nTraceback (most recent call last):\r\n File \"/Users/vrn738/PycharmProjects/mrpt2/molecules/BH/casscf_symmetry_issue.py\", line 20, in <module>\r\n mc4.kernel()\r\n File \"/Users/vrn738/PycharmProjects/mrpt2/venv/lib/python3.11/site-packages/pyscf/mcscf/mc1step_symm.py\", line 73, in kernel\r\n _kern(self, mo_coeff,\r\n File \"/Users/vrn738/PycharmProjects/mrpt2/venv/lib/python3.11/site-packages/pyscf/mcscf/mc1step.py\", line 351, in kernel\r\n e_tot, e_cas, fcivec = casscf.casci(mo, ci0, eris, log, locals())\r\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\r\n File \"/Users/vrn738/PycharmProjects/mrpt2/venv/lib/python3.11/site-packages/pyscf/mcscf/mc1step.py\", line 878, in casci\r\n e_tot, e_cas, fcivec = casci.kernel(fcasci, mo_coeff, ci0, log,\r\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\r\n File \"/Users/vrn738/PycharmProjects/mrpt2/venv/lib/python3.11/site-packages/pyscf/mcscf/casci.py\", line 608, in kernel\r\n e_tot, fcivec = casci.fcisolver.kernel(h1eff, eri_cas, ncas, nelecas,\r\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\r\n File \"/Users/vrn738/PycharmProjects/mrpt2/venv/lib/python3.11/site-packages/pyscf/fci/direct_spin1_symm.py\", line 781, in kernel\r\n ci0 = self.get_init_guess(norb, nelec, nroots, hdiag, orbsym, wfnsym_ir)\r\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\r\n File \"/Users/vrn738/PycharmProjects/mrpt2/venv/lib/python3.11/site-packages/pyscf/fci/direct_spin1_symm.py\", line 724, in get_init_guess\r\n ci0 = get_init_guess_cyl_sym(\r\n ^^^^^^^^^^^^^^^^^^^^^^^\r\n File \"/Users/vrn738/PycharmProjects/mrpt2/venv/lib/python3.11/site-packages/pyscf/fci/direct_spin1_symm.py\", line 291, in get_init_guess_cyl_sym\r\n ca = _cyl_sym_csf2civec(strsa, addra, orbsym, degen_mapping)\r\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\r\n File \"/Users/vrn738/PycharmProjects/mrpt2/venv/lib/python3.11/site-packages/pyscf/fci/direct_spin1_symm.py\", line 348, in _cyl_sym_csf2civec\r\n u = _cyl_sym_orbital_rotation(orbsym, degen_mapping)\r\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\r\n File \"/Users/vrn738/PycharmProjects/mrpt2/venv/lib/python3.11/site-packages/pyscf/fci/direct_spin1_symm.py\", line 369, in _cyl_sym_orbital_rotation\r\n u[j,j] = sqrthi\r\n ~^^^^^\r\nIndexError: index 2 is out of bounds for axis 0 with size 2\r\n```"}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/pyscf_m_pyscf:pr-2062", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/pyscf/fci/direct_spin1_cyl_sym.py b/pyscf/fci/direct_spin1_cyl_sym.py\nindex 0056bbd992..80aa27192f 100644\n--- a/pyscf/fci/direct_spin1_cyl_sym.py\n+++ b/pyscf/fci/direct_spin1_cyl_sym.py\n@@ -42,9 +42,9 @@\n from pyscf.fci import cistring\n from pyscf.fci import direct_spin1\n from pyscf.fci import direct_spin1_symm\n-from pyscf.fci.direct_spin1_symm import (_sv_associated_det,\n- _strs_angular_momentum,\n- _cyl_sym_orbital_rotation)\n+from pyscf.fci.direct_spin1_symm import (\n+ _sv_associated_det, _strs_angular_momentum, _cyl_sym_orbital_rotation,\n+ _validate_degen_mapping)\n from pyscf.fci import direct_nosym\n from pyscf.fci import addons\n from pyscf import __config__\n@@ -558,6 +558,10 @@ def kernel(self, h1e, eri, norb, nelec, ci0=None,\n if not hasattr(orbsym, 'degen_mapping'):\n degen_mapping = map_degeneracy(h1e.diagonal(), orbsym)\n orbsym = lib.tag_array(orbsym, degen_mapping=degen_mapping)\n+ if not _validate_degen_mapping(orbsym.degen_mapping, norb):\n+ raise lib.exceptions.PointGroupSymmetryError(\n+ 'Incomplete 2D-irrep orbitals for cylindrical symmetry.\\n'\n+ f'orbsym = {orbsym}.')\n \n u = _cyl_sym_orbital_rotation(orbsym, orbsym.degen_mapping)\n h1e = u.dot(h1e).dot(u.conj().T)\ndiff --git a/pyscf/fci/direct_spin1_symm.py b/pyscf/fci/direct_spin1_symm.py\nindex 272a432ec6..017505836a 100644\n--- a/pyscf/fci/direct_spin1_symm.py\n+++ b/pyscf/fci/direct_spin1_symm.py\n@@ -257,6 +257,13 @@ def get_init_guess(norb, nelec, nroots, hdiag, orbsym, wfnsym=0):\n raise RuntimeError(f'Initial guess for symmetry {wfnsym} not found')\n return ci0\n \n+def _validate_degen_mapping(mapping, norb):\n+ '''Check if 2D irreps are properly paired'''\n+ mapping = np.asarray(mapping)\n+ return (mapping.max() < norb and\n+ # Must be self-conjugated\n+ numpy.array_equal(mapping[mapping], numpy.arange(norb)))\n+\n def get_init_guess_cyl_sym(norb, nelec, nroots, hdiag, orbsym, wfnsym=0):\n neleca, nelecb = _unpack_nelec(nelec)\n strsa = strsb = cistring.gen_strings4orblist(range(norb), neleca)\n@@ -751,6 +758,11 @@ def kernel(self, h1e, eri, norb, nelec, ci0=None,\n orbsym = lib.tag_array(orbsym, degen_mapping=degen_mapping)\n if davidson_only is None:\n davidson_only = True\n+ if not _validate_degen_mapping(orbsym.degen_mapping, norb):\n+ raise lib.exceptions.PointGroupSymmetryError(\n+ 'Incomplete 2D-irrep orbitals for cylindrical symmetry.\\n'\n+ f'orbsym = {orbsym}. '\n+ f'Retry {self.__class__} with D2h subgroup symmetry.')\n \n wfnsym_ir = self.guess_wfnsym(norb, nelec, ci0, orbsym, wfnsym, **kwargs)\n self.sym_allowed_idx = sym_allowed_indices(nelec, orbsym, wfnsym_ir)\n"}, "test": {"test_patch": "diff --git a/pyscf/fci/test/test_spin1_cyl_sym.py b/pyscf/fci/test/test_spin1_cyl_sym.py\nindex 84e014d690..0648528e31 100644\n--- a/pyscf/fci/test/test_spin1_cyl_sym.py\n+++ b/pyscf/fci/test/test_spin1_cyl_sym.py\n@@ -212,6 +212,15 @@ def test_linearmole_a2(self):\n mc.run()\n self.assertAlmostEqual(mc.e_tot, 2.8999951068356475, 8)\n \n+ def test_incomplete_orbsym(self):\n+ sol = direct_spin1_cyl_sym.FCI(gto.Mole())\n+ no, ne = 2, 2\n+ h1 = np.ones((no,no))\n+ h2 = np.ones((no,no,no,no))\n+ orbsym = lib.tag_array(np.array([0,3]), degen_mapping=[0,2])\n+ with self.assertRaises(lib.exceptions.PointGroupSymmetryError):\n+ sol.kernel(h1, h2, no, ne, orbsym=orbsym)\n+\n if __name__ == \"__main__\":\n print(\"Full Tests for spin1-symm\")\n unittest.main()\ndiff --git a/pyscf/fci/test/test_spin1_symm.py b/pyscf/fci/test/test_spin1_symm.py\nindex 462009e3dd..4b63d48d27 100644\n--- a/pyscf/fci/test/test_spin1_symm.py\n+++ b/pyscf/fci/test/test_spin1_symm.py\n@@ -15,7 +15,7 @@\n \n import unittest\n import numpy\n-from pyscf import gto\n+from pyscf import gto, lib\n from pyscf import scf\n from pyscf import ao2mo\n from pyscf import fci\n@@ -197,6 +197,17 @@ def test_linearmole(self):\n ci1 = fci.addons.transform_ci(ci_y, (3,3), u.T)\n self.assertAlmostEqual(abs(ci1.ravel().dot(ci_y.ravel())), 1, 9)\n \n+ def test_incomplete_orbsym(self):\n+ mol = gto.Mole()\n+ mol.groupname = 'Dooh'\n+ sol = direct_spin1_symm.FCI(mol)\n+ no, ne = 2, 2\n+ h1 = numpy.ones((no,no))\n+ h2 = numpy.ones((no,no,no,no))\n+ orbsym = lib.tag_array(numpy.array([0,3]), degen_mapping=[0,2])\n+ with self.assertRaises(lib.exceptions.PointGroupSymmetryError):\n+ sol.kernel(h1, h2, no, ne, orbsym=orbsym)\n+\n if __name__ == \"__main__\":\n print(\"Full Tests for spin1-symm\")\n unittest.main()\n", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}137{"question_id": "MSB_pyscf_pyscf_pr2172", "question_type": "multi_swe_bench", "description": "Improve to_hf for pbc dft (pyscf/pyscf#2172)", "content": {"org": "pyscf", "repo": "pyscf", "pr_number": 2172, "issue_title": "Improve to_hf for pbc dft", "issue_body": "* Fix to_hf method for k-point dft methods\r\n* FIx old compiler compatibility issue", "base_commit": "c549c46be5963f657a48da6ee908fb5ed3bdc870", "resolved_issues": [{"number": 2157, "title": "KeyError in pyscf.pbc.df.df_jk?", "body": "With\r\n```\r\nfrom pyscf.pbc import gto, scf\r\n\r\ncell = gto.Cell()\r\ncell.atom='''\r\nC 0.000000000000 0.000000000000 0.000000000000\r\nC 1.685068664391 1.685068664391 1.685068664391\r\n'''\r\ncell.basis = 'gth-szv'\r\ncell.pseudo = 'gth-pade'\r\ncell.a = '''\r\n0.000000000, 3.370137329, 3.370137329\r\n3.370137329, 0.000000000, 3.370137329\r\n3.370137329, 3.370137329, 0.000000000'''\r\ncell.unit = 'B'\r\ncell.verbose = 5\r\ncell.build()\r\n\r\n#\r\n# KDFT and KGW with 2x2x2 k-points\r\n#\r\nkpts = cell.make_kpts([2,2,2])\r\nkmf = scf.KRKS(cell, xc='pbe').density_fit()\r\nkmf.kpts = kpts\r\nemf = kmf.kernel()\r\n\r\nmyrhf = kmf.to_hf()\r\nveff = myrhf.get_veff()\r\n\r\n```\r\n\r\nI get the following error:\r\n\r\n```\r\nTraceback (most recent call last):\r\n File \"/home/chillenb/src/gwscripts/kpttest.py\", line 28, in <module>\r\n veff = myrhf.get_veff()\r\n ^^^^^^^^^^^^^^^^\r\n File \"/home/chillenb/mambaforge/envs/rttddft/lib/python3.11/site-packages/pyscf/pbc/scf/khf.py\", line 541, in get_veff\r\n vj, vk = self.get_jk(cell, dm_kpts, hermi, kpts, kpts_band)\r\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\r\n File \"/home/chillenb/mambaforge/envs/rttddft/lib/python3.11/site-packages/pyscf/pbc/scf/khf.py\", line 529, in get_jk\r\n vj, vk = self.with_df.get_jk(dm_kpts, hermi, kpts, kpts_band,\r\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\r\n File \"/home/chillenb/mambaforge/envs/rttddft/lib/python3.11/site-packages/pyscf/pbc/df/df.py\", line 443, in get_jk\r\n vk = df_jk.get_k_kpts(self, dm, hermi, kpts, kpts_band, exxdiv)\r\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\r\n File \"/home/chillenb/mambaforge/envs/rttddft/lib/python3.11/site-packages/pyscf/pbc/df/df_jk.py\", line 613, in get_k_kpts\r\n make_kpt(ki, kj, True)\r\n File \"/home/chillenb/mambaforge/envs/rttddft/lib/python3.11/site-packages/pyscf/pbc/df/df_jk.py\", line 446, in make_kpt\r\n for LpqR, LpqI, sign in mydf.sr_loop((kpti,kptj), max_memory, False):\r\n File \"/home/chillenb/mambaforge/envs/rttddft/lib/python3.11/site-packages/pyscf/pbc/df/df.py\", line 355, in sr_loop\r\n with _load3c(self._cderi, self._dataname, kpti_kptj) as j3c:\r\n File \"/home/chillenb/mambaforge/envs/rttddft/lib/python3.11/site-packages/pyscf/pbc/df/df.py\", line 692, in __enter__\r\n return self.getitem(*self.kpti_kptj)\r\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\r\n File \"/home/chillenb/mambaforge/envs/rttddft/lib/python3.11/site-packages/pyscf/pbc/df/df.py\", line 746, in getitem\r\n raise KeyError(f'Key {key} not found')\r\nKeyError: 'Key j3c/8 not found'\r\n```\r\n\r\n\r\nThe fact that the 3c2e integrals should now be computed, and `_j_only` reset, is not getting detected. Is there a recommended way to do this manually?\r\n\r\nWould it be bad design to add an option to scf.KRKS.density_fit() so that, if I need to calculate Vk later, I can override the default value of _j_only?\r\n\r\n\r\n(PySCF 2.5.0 installed from conda-forge)\r\n\r\n"}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/pyscf_m_pyscf:pr-2172", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/pyscf/lib/dft/utils.c b/pyscf/lib/dft/utils.c\nindex 04ef8e5b2f..fc27b4a48f 100644\n--- a/pyscf/lib/dft/utils.c\n+++ b/pyscf/lib/dft/utils.c\n@@ -52,11 +52,20 @@ void get_gga_vrho_gs(double complex *out, double complex *vrho_gs, double comple\n int i;\n int ngrid2 = 2 * ngrid;\n double complex fac = -2. * _Complex_I;\n- #pragma omp parallel for simd schedule(static)\n+#pragma omp parallel\n+{\n+ double complex v;\n+// ensure OpenMP 4.0\n+#if defined _OPENMP && _OPENMP >= 201307\n+ #pragma omp for simd schedule(static)\n+#else\n+ #pragma omp for schedule(static)\n+#endif\n for (i = 0; i < ngrid; i++) {\n- out[i] = ( Gv[i*3] * vsigma1_gs[i]\n- +Gv[i*3+1] * vsigma1_gs[i+ngrid]\n- +Gv[i*3+2] * vsigma1_gs[i+ngrid2]) * fac + vrho_gs[i];\n- out[i] *= weight;\n+ v = ( Gv[i*3] * vsigma1_gs[i]\n+ +Gv[i*3+1] * vsigma1_gs[i+ngrid]\n+ +Gv[i*3+2] * vsigma1_gs[i+ngrid2]) * fac + vrho_gs[i];\n+ out[i] = v * weight;\n }\n }\n+}\ndiff --git a/pyscf/pbc/dft/kgks.py b/pyscf/pbc/dft/kgks.py\nindex 7774f2e36e..fb9e1f2f68 100644\n--- a/pyscf/pbc/dft/kgks.py\n+++ b/pyscf/pbc/dft/kgks.py\n@@ -146,7 +146,14 @@ def nuc_grad_method(self):\n \n def to_hf(self):\n '''Convert to KGHF object.'''\n- from pyscf.pbc import scf\n- return self._transfer_attrs_(scf.KGHF(self.cell, self.kpts))\n+ from pyscf.pbc import scf, df\n+ out = self._transfer_attrs_(scf.KGHF(self.cell, self.kpts))\n+\n+ # Pure functionals only construct J-type integrals. Enable all integrals for KHF.\n+ if (not self._numint.libxc.is_hybrid_xc(self.xc) and\n+ len(self.kpts) > 1 and getattr(self.with_df, '_j_only', False)):\n+ out.with_df._j_only = False\n+ out.with_df.reset()\n+ return out\n \n to_gpu = lib.to_gpu\ndiff --git a/pyscf/pbc/dft/krks.py b/pyscf/pbc/dft/krks.py\nindex 6278605de9..d690647879 100644\n--- a/pyscf/pbc/dft/krks.py\n+++ b/pyscf/pbc/dft/krks.py\n@@ -181,25 +181,13 @@ def nuc_grad_method(self):\n \n def to_hf(self):\n '''Convert to KRHF object.'''\n- from pyscf.pbc import scf\n- return self._transfer_attrs_(scf.KRHF(self.cell, self.kpts))\n+ from pyscf.pbc import scf, df\n+ out = self._transfer_attrs_(scf.KRHF(self.cell, self.kpts))\n+ # Pure functionals only construct J-type integrals. Enable all integrals for KHF.\n+ if (not self._numint.libxc.is_hybrid_xc(self.xc) and\n+ len(self.kpts) > 1 and getattr(self.with_df, '_j_only', False)):\n+ out.with_df._j_only = False\n+ out.with_df.reset()\n+ return out\n \n to_gpu = lib.to_gpu\n-\n-\n-if __name__ == '__main__':\n- from pyscf.pbc import gto\n- cell = gto.Cell()\n- cell.unit = 'A'\n- cell.atom = 'C 0., 0., 0.; C 0.8917, 0.8917, 0.8917'\n- cell.a = '''0. 1.7834 1.7834\n- 1.7834 0. 1.7834\n- 1.7834 1.7834 0. '''\n-\n- cell.basis = 'gth-szv'\n- cell.pseudo = 'gth-pade'\n- cell.verbose = 7\n- cell.output = '/dev/null'\n- cell.build()\n- mf = KRKS(cell, cell.make_kpts([2,1,1]))\n- print(mf.kernel())\ndiff --git a/pyscf/pbc/dft/kroks.py b/pyscf/pbc/dft/kroks.py\nindex 1d2a1198f8..640bf05e97 100644\n--- a/pyscf/pbc/dft/kroks.py\n+++ b/pyscf/pbc/dft/kroks.py\n@@ -61,25 +61,13 @@ def dump_flags(self, verbose=None):\n \n def to_hf(self):\n '''Convert to KROHF object.'''\n- from pyscf.pbc import scf\n- return self._transfer_attrs_(scf.KROHF(self.cell, self.kpts))\n+ from pyscf.pbc import scf, df\n+ out = self._transfer_attrs_(scf.KROHF(self.cell, self.kpts))\n+ # Pure functionals only construct J-type integrals. Enable all integrals for KHF.\n+ if (not self._numint.libxc.is_hybrid_xc(self.xc) and\n+ len(self.kpts) > 1 and getattr(self.with_df, '_j_only', False)):\n+ out.with_df._j_only = False\n+ out.with_df.reset()\n+ return out\n \n to_gpu = lib.to_gpu\n-\n-\n-if __name__ == '__main__':\n- from pyscf.pbc import gto\n- cell = gto.Cell()\n- cell.unit = 'A'\n- cell.atom = 'C 0., 0., 0.; C 0.8917, 0.8917, 0.8917'\n- cell.a = '''0. 1.7834 1.7834\n- 1.7834 0. 1.7834\n- 1.7834 1.7834 0. '''\n-\n- cell.basis = 'gth-szv'\n- cell.pseudo = 'gth-pade'\n- cell.verbose = 7\n- cell.output = '/dev/null'\n- cell.build()\n- mf = KROKS(cell, cell.make_kpts([2,1,1]))\n- print(mf.kernel())\ndiff --git a/pyscf/pbc/dft/kuks.py b/pyscf/pbc/dft/kuks.py\nindex ac66f973bc..732adcfa32 100644\n--- a/pyscf/pbc/dft/kuks.py\n+++ b/pyscf/pbc/dft/kuks.py\n@@ -157,25 +157,13 @@ def nuc_grad_method(self):\n \n def to_hf(self):\n '''Convert to KUHF object.'''\n- from pyscf.pbc import scf\n- return self._transfer_attrs_(scf.KUHF(self.cell, self.kpts))\n+ from pyscf.pbc import scf, df\n+ out = self._transfer_attrs_(scf.KUHF(self.cell, self.kpts))\n+ # Pure functionals only construct J-type integrals. Enable all integrals for KHF.\n+ if (not self._numint.libxc.is_hybrid_xc(self.xc) and\n+ len(self.kpts) > 1 and getattr(self.with_df, '_j_only', False)):\n+ out.with_df._j_only = False\n+ out.with_df.reset()\n+ return out\n \n to_gpu = lib.to_gpu\n-\n-\n-if __name__ == '__main__':\n- from pyscf.pbc import gto\n- cell = gto.Cell()\n- cell.unit = 'A'\n- cell.atom = 'C 0., 0., 0.; C 0.8917, 0.8917, 0.8917'\n- cell.a = '''0. 1.7834 1.7834\n- 1.7834 0. 1.7834\n- 1.7834 1.7834 0. '''\n-\n- cell.basis = 'gth-szv'\n- cell.pseudo = 'gth-pade'\n- cell.verbose = 7\n- cell.output = '/dev/null'\n- cell.build()\n- mf = KUKS(cell, cell.make_kpts([2,1,1]))\n- print(mf.kernel())\n"}, "test": {"test_patch": "diff --git a/pyscf/pbc/dft/test/test_kgks.py b/pyscf/pbc/dft/test/test_kgks.py\nindex a4fba351c4..6ebd1165ea 100644\n--- a/pyscf/pbc/dft/test/test_kgks.py\n+++ b/pyscf/pbc/dft/test/test_kgks.py\n@@ -22,6 +22,7 @@\n from pyscf import lib\n from pyscf.pbc import gto as gto\n from pyscf.pbc import dft as dft\n+from pyscf.pbc import scf as pbcscf\n from pyscf.pbc.df import rsdf_builder, gdf_builder\n try:\n import mcfun\n@@ -189,6 +190,19 @@ def test_mcol_x2c_kgks_lda(self):\n mf.run()\n self.assertAlmostEqual(mf.e_tot, -1.4910121442258883, 6)\n \n+ def test_to_hf(self):\n+ mf = dft.KGKS(cell).density_fit()\n+ mf.with_df._j_only = True\n+ a_hf = mf.to_hf()\n+ self.assertTrue(a_hf.with_df._j_only)\n+ self.assertTrue(isinstance(a_hf, pbcscf.kghf.KGHF))\n+\n+ mf = dft.KGKS(cell, kpts=cell.make_kpts([2,1,1])).density_fit()\n+ mf.with_df._j_only = True\n+ a_hf = mf.to_hf()\n+ self.assertTrue(not a_hf.with_df._j_only)\n+ self.assertTrue(isinstance(a_hf, pbcscf.kghf.KGHF))\n+\n \n if __name__ == '__main__':\n print(\"Full Tests for pbc.dft.kgks\")\ndiff --git a/pyscf/pbc/dft/test/test_krks.py b/pyscf/pbc/dft/test/test_krks.py\nindex 090711ec54..e8418cb972 100644\n--- a/pyscf/pbc/dft/test/test_krks.py\n+++ b/pyscf/pbc/dft/test/test_krks.py\n@@ -22,6 +22,7 @@\n \n from pyscf.pbc import gto as pbcgto\n from pyscf.pbc import dft as pbcdft\n+from pyscf.pbc import scf as pbcscf\n \n \n def build_cell(mesh):\n@@ -143,6 +144,31 @@ def test_rsh_df(self):\n mf.kernel()\n self.assertAlmostEqual(mf.e_tot, -2.4766238116030683, 5)\n \n+ def test_to_hf(self):\n+ mf = pbcdft.KRKS(cell).density_fit()\n+ mf.with_df._j_only = True\n+ a_hf = mf.to_hf()\n+ self.assertTrue(a_hf.with_df._j_only)\n+ self.assertTrue(isinstance(a_hf, pbcscf.khf.KRHF))\n+\n+ mf = pbcdft.KRKS(cell, kpts=cell.make_kpts([2,1,1])).density_fit()\n+ mf.with_df._j_only = True\n+ a_hf = mf.to_hf()\n+ self.assertTrue(not a_hf.with_df._j_only)\n+ self.assertTrue(isinstance(a_hf, pbcscf.khf.KRHF))\n+\n+ mf = pbcdft.KROKS(cell).density_fit()\n+ mf.with_df._j_only = True\n+ a_hf = mf.to_hf()\n+ self.assertTrue(a_hf.with_df._j_only)\n+ self.assertTrue(isinstance(a_hf, pbcscf.krohf.KROHF))\n+\n+ mf = pbcdft.KROKS(cell, kpts=cell.make_kpts([2,1,1])).density_fit()\n+ mf.with_df._j_only = True\n+ a_hf = mf.to_hf()\n+ self.assertTrue(not a_hf.with_df._j_only)\n+ self.assertTrue(isinstance(a_hf, pbcscf.krohf.KROHF))\n+\n # TODO: test the reset method of pbcdft.KRKS, pbcdft.RKS whether the reset\n # methods of all subsequent objects are called\n \ndiff --git a/pyscf/pbc/dft/test/test_kuks.py b/pyscf/pbc/dft/test/test_kuks.py\nindex d99fddf7fa..a81ae3051f 100644\n--- a/pyscf/pbc/dft/test/test_kuks.py\n+++ b/pyscf/pbc/dft/test/test_kuks.py\n@@ -19,6 +19,7 @@\n import unittest\n import numpy as np\n from pyscf.pbc import gto as pbcgto\n+from pyscf.pbc import scf as pbcscf\n from pyscf.pbc import dft as pbcdft\n \n \n@@ -91,6 +92,19 @@ def test_rsh_df(self):\n mf.kernel()\n self.assertAlmostEqual(mf.e_tot, -2.4766238116030683, 7)\n \n+ def test_to_hf(self):\n+ mf = pbcdft.KUKS(cell).density_fit()\n+ mf.with_df._j_only = True\n+ a_hf = mf.to_hf()\n+ self.assertTrue(a_hf.with_df._j_only)\n+ self.assertTrue(isinstance(a_hf, pbcscf.kuhf.KUHF))\n+\n+ mf = pbcdft.KUKS(cell, kpts=cell.make_kpts([2,1,1])).density_fit()\n+ mf.with_df._j_only = True\n+ a_hf = mf.to_hf()\n+ self.assertTrue(not a_hf.with_df._j_only)\n+ self.assertTrue(isinstance(a_hf, pbcscf.kuhf.KUHF))\n+\n \n if __name__ == '__main__':\n print(\"Full Tests for pbc.dft.kuks\")\n", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}138{"question_id": "MSB_pyscf_pyscf_pr2279", "question_type": "multi_swe_bench", "description": "Remove the ase module bulk from pyscf_ase (fix #2271) (pyscf/pyscf#2279)", "content": {"org": "pyscf", "repo": "pyscf", "pr_number": 2279, "issue_title": "Remove the ase module bulk from pyscf_ase (fix #2271)", "issue_body": "Fix pyscf_ase (fix #2271)\r\nFix the TDDFT get_ab method for RSH functions (fix #2261)", "base_commit": "b6bfced15659d714d1959135bab7b08ae40f57da", "resolved_issues": [{"number": 2261, "title": "Issue calculating static polarizability using RSH exchange-correlation functionals", "body": "Hello, everyone. I need to have access and freedom to work with the A and B matrices from coupled-perturbed KS. So, I'm trying to use the following code together with the CAM-B3LYP functional for static polarizability. However, the code doesn't work for this functional or any other RSH tested. It is curious since the code works properly for any other XC functionals, e.g., GGA, Hybrids, etc. I see someone with a similar issue and the fix was to change from LibXC to XCfun. But, this is not working for me. Can someone help me, please?\r\n\r\nResults using the attached code:\r\nStatic polarizability from reference: 1.4907486930182852 (the right answer)\r\nStatic polarizability is: 1.3051766863495733\r\n\r\nPS1: I also tried \"a, b = tddft.TDDFT(mf).get_ab()\". I still have the same issue with RSHs.\r\n\r\nPS2: Using \"rks.Polarizability(mf).polarizability()\" works with RSH functionals (that's how I debug the results, i.e., reference). However, I don't know how to or if I have access to A and B using this code.\r\n\r\nThanks.\r\n\r\n[cpks.zip](https://github.com/user-attachments/files/15873707/cpks.zip)\r\n"}, {"number": 2271, "title": "Cannot import name 'bulk' from 'ase.lattice'", "body": "I just tried to call the member function `from_ase()` with `ase 3.23.0` and `pyscf 2.6.1` and got an error. I guess `ase` has changed the lattice module. Simply removing the import works, as the function `bulk` is not used anywhere in `pyscf_ase.py`.\r\n\r\nhttps://github.com/pyscf/pyscf/blob/d4ce357503bc865d43a956c8f540f8c0f38ef5cb/pyscf/pbc/tools/pyscf_ase.py#L27"}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/pyscf_m_pyscf:pr-2279", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/pyscf/pbc/tools/pyscf_ase.py b/pyscf/pbc/tools/pyscf_ase.py\nindex f2d24a14fa..7c27c0654a 100644\n--- a/pyscf/pbc/tools/pyscf_ase.py\n+++ b/pyscf/pbc/tools/pyscf_ase.py\n@@ -24,7 +24,6 @@\n import numpy as np\n from ase.calculators.calculator import Calculator\n import ase.dft.kpoints\n-from ase.lattice import bulk\n \n def pyscf_to_ase_atoms(cell):\n '''\ndiff --git a/pyscf/tdscf/dhf.py b/pyscf/tdscf/dhf.py\nindex 5e3eb0f27c..0cf824353f 100644\n--- a/pyscf/tdscf/dhf.py\n+++ b/pyscf/tdscf/dhf.py\n@@ -127,6 +127,7 @@ def add_hf_(a, b, hyb=1):\n raise NotImplementedError('DKS-TDDFT for NLC functionals')\n \n omega, alpha, hyb = ni.rsh_and_hybrid_coeff(mf.xc, mol.spin)\n+ assert omega == 0.\n \n a, b = add_hf_(a, b, hyb)\n \ndiff --git a/pyscf/tdscf/ghf.py b/pyscf/tdscf/ghf.py\nindex dc23b63e0c..822fe128f7 100644\n--- a/pyscf/tdscf/ghf.py\n+++ b/pyscf/tdscf/ghf.py\n@@ -162,6 +162,7 @@ def add_hf_(a, b, hyb=1):\n raise NotImplementedError\n \n omega, alpha, hyb = ni.rsh_and_hybrid_coeff(mf.xc, mol.spin)\n+ assert omega == 0.\n \n a, b = add_hf_(a, b, hyb)\n \ndiff --git a/pyscf/tdscf/rhf.py b/pyscf/tdscf/rhf.py\nindex 720c3dade4..655e7026b9 100644\n--- a/pyscf/tdscf/rhf.py\n+++ b/pyscf/tdscf/rhf.py\n@@ -152,6 +152,13 @@ def add_hf_(a, b, hyb=1):\n omega, alpha, hyb = ni.rsh_and_hybrid_coeff(mf.xc, mol.spin)\n \n add_hf_(a, b, hyb)\n+ if omega != 0: # For RSH\n+ with mol.with_range_coulomb(omega):\n+ eri_mo = ao2mo.general(mol, [orbo,mo,mo,mo], compact=False)\n+ eri_mo = eri_mo.reshape(nocc,nmo,nmo,nmo)\n+ k_fac = alpha - hyb\n+ a -= numpy.einsum('ijba->iajb', eri_mo[:nocc,:nocc,nocc:,nocc:]) * k_fac\n+ b -= numpy.einsum('jaib->iajb', eri_mo[:nocc,nocc:,:nocc,nocc:]) * k_fac\n \n xctype = ni._xc_type(mf.xc)\n dm0 = mf.make_rdm1(mo_coeff, mo_occ)\ndiff --git a/pyscf/tdscf/uhf.py b/pyscf/tdscf/uhf.py\nindex 1812926c6f..2692b9b688 100644\n--- a/pyscf/tdscf/uhf.py\n+++ b/pyscf/tdscf/uhf.py\n@@ -188,6 +188,19 @@ def add_hf_(a, b, hyb=1):\n omega, alpha, hyb = ni.rsh_and_hybrid_coeff(mf.xc, mol.spin)\n \n add_hf_(a, b, hyb)\n+ if omega != 0: # For RSH\n+ with mol.with_range_coulomb(omega):\n+ eri_aa = ao2mo.general(mol, [orbo_a,mo_a,mo_a,mo_a], compact=False)\n+ eri_bb = ao2mo.general(mol, [orbo_b,mo_b,mo_b,mo_b], compact=False)\n+ eri_aa = eri_aa.reshape(nocc_a,nmo_a,nmo_a,nmo_a)\n+ eri_bb = eri_bb.reshape(nocc_b,nmo_b,nmo_b,nmo_b)\n+ a_aa, a_ab, a_bb = a\n+ b_aa, b_ab, b_bb = b\n+ k_fac = alpha - hyb\n+ a_aa -= numpy.einsum('ijba->iajb', eri_aa[:nocc_a,:nocc_a,nocc_a:,nocc_a:]) * k_fac\n+ b_aa -= numpy.einsum('jaib->iajb', eri_aa[:nocc_a,nocc_a:,:nocc_a,nocc_a:]) * k_fac\n+ a_bb -= numpy.einsum('ijba->iajb', eri_bb[:nocc_b,:nocc_b,nocc_b:,nocc_b:]) * k_fac\n+ b_bb -= numpy.einsum('jaib->iajb', eri_bb[:nocc_b,nocc_b:,:nocc_b,nocc_b:]) * k_fac\n \n xctype = ni._xc_type(mf.xc)\n dm0 = mf.make_rdm1(mo_coeff, mo_occ)\n"}, "test": {"test_patch": "diff --git a/pyscf/tdscf/test/test_tdrks.py b/pyscf/tdscf/test/test_tdrks.py\nindex 0df6b2f8c1..2ca7cbb540 100644\n--- a/pyscf/tdscf/test/test_tdrks.py\n+++ b/pyscf/tdscf/test/test_tdrks.py\n@@ -107,6 +107,15 @@ def test_tddft_b3lyp(self):\n ref = diagonalize(a, b, nroots=5) * 27.2114\n self.assertAlmostEqual(abs(es - ref).max(), 0, 7)\n \n+ def test_tddft_camb3lyp(self):\n+ mf = mol.RKS(xc='camb3lyp').run()\n+ td = mf.TDDFT()\n+ es = td.kernel(nstates=4)[0]\n+ a,b = td.get_ab()\n+ e_ref = diagonalize(a, b, 5)\n+ self.assertAlmostEqual(abs(es[:3]-e_ref[:3]).max(), 0, 8)\n+ self.assertAlmostEqual(lib.fp(es[:3]*27.2114), 9.0054057603534, 4)\n+\n def test_tda_b3lypg(self):\n mf = dft.RKS(mol)\n mf.xc = 'b3lypg'\ndiff --git a/pyscf/tdscf/test/test_tduks.py b/pyscf/tdscf/test/test_tduks.py\nindex 9679fc5ea5..61a70172ff 100644\n--- a/pyscf/tdscf/test/test_tduks.py\n+++ b/pyscf/tdscf/test/test_tduks.py\n@@ -130,6 +130,15 @@ def test_tddft_b3lyp(self):\n es = td.kernel(nstates=4)[0] * 27.2114\n self.assertAlmostEqual(lib.fp(es[:3]), 1.2984822994759448, 4)\n \n+ def test_tddft_camb3lyp(self):\n+ mf = mol1.UKS(xc='camb3lyp').run()\n+ td = mf.TDDFT()\n+ es = td.kernel(nstates=4)[0]\n+ a,b = td.get_ab()\n+ e_ref = diagonalize(a, b, 5)\n+ self.assertAlmostEqual(abs(es[:3]-e_ref[:3]).max(), 0, 8)\n+ self.assertAlmostEqual(lib.fp(es[:3]*27.2114), 7.69383202636, 4)\n+\n def test_tda_b3lyp(self):\n td = tdscf.TDA(mf_b3lyp).set(conv_tol=1e-12)\n es = td.kernel(nstates=4)[0] * 27.2114\n", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}139{"question_id": "MSB_pyscf_pyscf_pr2290", "question_type": "multi_swe_bench", "description": "Fix addons.smearing RHF electron number (pyscf/pyscf#2290)", "content": {"org": "pyscf", "repo": "pyscf", "pr_number": 2290, "issue_title": "Fix addons.smearing RHF electron number", "issue_body": "Fixes #2289.", "base_commit": "604cb13cc167d58439b4cec0ca7811bad6987ee2", "resolved_issues": [{"number": 2289, "title": "Smearing electron number bug", "body": "Smeared RHF with odd nelec gives incorrect electron number.\r\n\r\n```\r\nfrom pyscf import gto, scf\r\nfrom pyscf.scf import addons\r\n\r\nmol = gto.Mole()\r\nmol.atom = '''\r\n 7 0. 0 -0.7\r\n 7 0. 0 0.7'''\r\nmol.basis = 'cc-pvdz'\r\nmol.charge = -1\r\nmol.spin = 1\r\nmol.build()\r\nmf = scf.RHF(mol)\r\nmf = addons.smearing(mf, sigma=0.1)\r\nmf.kernel()\r\nprint(mf.mol.nelectron)\r\nprint(mf.mo_occ.sum())\r\n```\r\n\r\n```\r\nconverged SCF energy = -42.2391465363651\r\n15\r\n16.0\r\n```"}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/pyscf_m_pyscf:pr-2290", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/pyscf/scf/addons.py b/pyscf/scf/addons.py\nindex a120087f33..4f26a5367b 100644\n--- a/pyscf/scf/addons.py\n+++ b/pyscf/scf/addons.py\n@@ -83,7 +83,7 @@ def nelec_cost_fn(m, mo_es, nocc):\n \n def _get_fermi(mo_energy, nocc):\n mo_e_sorted = numpy.sort(mo_energy)\n- return mo_e_sorted[nocc-1]\n+ return mo_e_sorted[numpy.ceil(nocc).astype(int) - 1]\n \n class _SmearingSCF:\n \n@@ -174,7 +174,7 @@ def get_occ(self, mo_energy=None, mo_coeff=None):\n else:\n mo_es = mo_energy\n if is_rhf:\n- nocc = (nelectron + 1) // 2\n+ nocc = nelectron / 2\n \n if self.mu0 is None:\n mu, mo_occs = _smearing_optimize(f_occ, mo_es, nocc, sigma)\n"}, "test": {"test_patch": "diff --git a/pyscf/scf/test/test_addons.py b/pyscf/scf/test/test_addons.py\nindex 88595191cd..76ed2a5cba 100644\n--- a/pyscf/scf/test/test_addons.py\n+++ b/pyscf/scf/test/test_addons.py\n@@ -459,6 +459,27 @@ def test_rohf_smearing(self):\n self.assertAlmostEqual(myhf_s.e_tot, -243.086989253, 5)\n self.assertAlmostEqual(myhf_s.entropy, 17.11431, 4)\n \n+ def test_rhf_smearing_nelec(self):\n+ mol = gto.Mole()\n+ mol.verbose = 5\n+ mol.output = '/dev/null'\n+ mol.atom = '''\n+ 7 0. 0 -0.7\n+ 7 0. 0 0.7'''\n+ mol.basis = 'cc-pvdz'\n+ mol.charge = +1\n+ mol.spin = 1\n+ mol.build()\n+ mf = scf.RHF(mol)\n+ mf = addons.frac_occ(mf)\n+ e_frac = mf.kernel()\n+\n+ mf_smear = scf.RHF(mol)\n+ mf_smear = addons.smearing(mf_smear, sigma=1e-5, method='fermi')\n+ e_smear = mf_smear.kernel()\n+ self.assertAlmostEqual(mf.mo_occ.sum(), mf_smear.mo_occ.sum(), 5)\n+ self.assertAlmostEqual(e_frac, e_smear, 9)\n+\n def test_smearing_mu0(self):\n def _hubbard_hamilts_pbc(L, U):\n h1e = numpy.zeros((L, L))\n", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}140{"question_id": "MSB_pyscf_pyscf_pr2305", "question_type": "multi_swe_bench", "description": "Fix bugs in complex-valued contractions for fci.direct_nosym (fix #2302) (pyscf/pyscf#2305)", "content": {"org": "pyscf", "repo": "pyscf", "pr_number": 2305, "issue_title": "Fix bugs in complex-valued contractions for fci.direct_nosym (fix #2302)", "issue_body": "Additionally, update grad.sacasscf due to API changes in scipy-1.14", "base_commit": "6d39f69adc0a313929e76846552ac58081400ddd", "resolved_issues": [{"number": 2302, "title": "contract_2e gives inconsistent results on complex vector", "body": "The following code generates a two-body tensor and a random complex-valued FCI vector, and then contracts the two-body tensor with the vector in two ways:\r\n- Directly using `contract_2e`\r\n- Using `contract_2e` on the real and imaginary parts of the vector and adding the results\r\n\r\nThese should give the same result, but they don't.\r\n\r\n```python\r\nimport math\r\n\r\nimport numpy as np\r\nimport pyscf\r\nimport pyscf.mcscf\r\nfrom pyscf.fci.direct_nosym import absorb_h1e, contract_2e\r\n\r\n# Generate a two-body tensor\r\nmol = pyscf.gto.Mole()\r\nmol.build(\r\n atom=[[\"H\", (0, 0, 0)], [\"H\", (1.0, 0, 0)]],\r\n basis=\"sto-6g\",\r\n symmetry=\"Dooh\",\r\n verbose=0,\r\n)\r\nscf = pyscf.scf.RHF(mol).run()\r\nn_electrons = int(sum(scf.mo_occ))\r\nn_alpha = (n_electrons + mol.spin) // 2\r\nn_beta = (n_electrons - mol.spin) // 2\r\nnelec = (n_alpha, n_beta)\r\nnorb = mol.nao_nr()\r\ncas = pyscf.mcscf.CASCI(scf, norb, nelec)\r\nh1e, _ = cas.get_h1cas()\r\nh2e = cas.get_h2cas()\r\neri = absorb_h1e(h1e, h2e, norb, nelec, 0.5)\r\n\r\n# Generate a random state vector\r\nrng = np.random.default_rng(1234)\r\ndim = math.comb(norb, n_alpha) * math.comb(norb, n_beta)\r\nvec = rng.standard_normal(dim) + 1j * rng.standard_normal(dim)\r\nvec /= np.linalg.norm(vec)\r\n\r\n# Contract directly\r\nresult = contract_2e(eri, vec, norb, nelec)\r\n# Contract real and imaginary parts separately\r\nresult_alt = contract_2e(eri, vec.real, norb, nelec) + 1j * contract_2e(\r\n eri, vec.imag, norb, nelec\r\n)\r\n\r\nprint(np.allclose(result, result_alt))\r\nprint(np.linalg.norm(result - result_alt))\r\n```\r\n```\r\nFalse\r\n1.0875338674395465\r\n```"}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/pyscf_m_pyscf:pr-2305", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/pyscf/fci/direct_nosym.py b/pyscf/fci/direct_nosym.py\nindex fcd67f5664..913cedd6b0 100644\n--- a/pyscf/fci/direct_nosym.py\n+++ b/pyscf/fci/direct_nosym.py\n@@ -125,7 +125,7 @@ def contract_2e(eri, fcivec, norb, nelec, link_index=None):\n outI += contract_2e(eriI, ciR, norb, nelec, link_index=link_index)\n out = outR.astype(numpy.complex128)\n out.imag = outI\n- return outR\n+ return out\n \n def absorb_h1e(h1e, eri, norb, nelec, fac=1):\n '''Modify 2e Hamiltonian to include 1e Hamiltonian contribution.\ndiff --git a/pyscf/grad/lagrange.py b/pyscf/grad/lagrange.py\nindex b93707865e..89ff6d99a0 100644\n--- a/pyscf/grad/lagrange.py\n+++ b/pyscf/grad/lagrange.py\n@@ -14,6 +14,7 @@\n # limitations under the License.\n \n import numpy as np\n+import scipy\n from scipy import linalg, optimize\n from scipy.sparse import linalg as sparse_linalg\n from pyscf import lib, __config__\n@@ -126,9 +127,9 @@ def my_Lvec_last ():\n prec_obj = sparse_linalg.LinearOperator ((self.nlag,self.nlag), matvec=precond,\n dtype=bvec.dtype)\n x0_guess = self.get_init_guess (bvec, Adiag, Aop, precond)\n- Lvec, info_int = sparse_linalg.cg(Aop_obj, -bvec, x0=x0_guess,\n- atol=self.conv_atol,\n- maxiter=self.max_cycle, callback=my_call, M=prec_obj)\n+ Lvec, info_int = _cg(Aop_obj, -bvec, x0=x0_guess,\n+ tol=self.conv_rtol, atol=self.conv_atol,\n+ maxiter=self.max_cycle, callback=my_call, M=prec_obj)\n logger.info (self, ('Lagrange multiplier determination {} after {} iterations\\n'\n ' |geff| = {}, |Lvec| = {}').format (\n 'converged' if info_int == 0 else 'not converged',\n@@ -190,3 +191,10 @@ def __call__(self, x):\n Adiagd[abs(Adiagd)<1e-8] = 1e-8\n x /= Adiagd\n return x\n+\n+if scipy.__version__.split('.')[1] >= '14': # scipy 1.14\n+ def _cg(A, b, x0=None, *, tol=1e-05, atol=0.0, maxiter=None, M=None, callback=None):\n+ return sparse_linalg.cg(A, b, x0, rtol=tol, atol=atol, maxiter=maxiter,\n+ M=M, callback=callback)\n+else:\n+ _cg = sparse_linalg.cg\n"}, "test": {"test_patch": "diff --git a/pyscf/fci/test/test_direct_nosym.py b/pyscf/fci/test/test_direct_nosym.py\nindex d3beef460c..cda504ded4 100644\n--- a/pyscf/fci/test/test_direct_nosym.py\n+++ b/pyscf/fci/test/test_direct_nosym.py\n@@ -60,6 +60,9 @@ def test_contract_complex(self):\n ci1 += 1j * fci.direct_nosym.contract_2e(h2e, ci0.imag, norb, nelec)\n self.assertTrue(numpy.allclose(ci1ref, ci1))\n \n+ ci1 = fci.direct_nosym.contract_2e(h2e, ci0, norb, nelec).astype(complex)\n+ self.assertAlmostEqual(abs(ci1ref - ci1).max(), 0, 12)\n+\n def test_absorb_h1e(self):\n href = fci_slow.absorb_h1e(h1e, h2e, norb, nelec)\n h1 = fci.direct_nosym.absorb_h1e(h1e, h2e, norb, nelec)\n", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}141{"question_id": "MSB_pyscf_pyscf_pr2306", "question_type": "multi_swe_bench", "description": "Fix initial guess dimension problems when solving for multiple roots (pyscf/pyscf#2306)", "content": {"org": "pyscf", "repo": "pyscf", "pr_number": 2306, "issue_title": "Fix initial guess dimension problems when solving for multiple roots", "issue_body": "fix #2292 ", "base_commit": "6d39f69adc0a313929e76846552ac58081400ddd", "resolved_issues": [{"number": 2292, "title": "PySCF >=v2.2.1 fci.direct_spin1 davidson solver issue", "body": "Hello\r\n\r\nI have the following minimal example using FCI to solve a given Hamiltonian which produces an error when using a PySCF version greater than or equal to v2.2.1.\r\n``` python\r\nfrom pyscf import fci\r\nimport numpy as np\r\n\r\nnorb=4\r\nnelec=(2, 2)\r\nnroots=36 # (4 choose 2)*(4 choose 2)\r\n\r\ne = -0.5\r\nt = -0.1\r\nh1 = np.array([[e, t, 0, 0],\r\n [t, e, t, 0],\r\n [0, t, e, t],\r\n [0, 0, t, e],\r\n ])\r\n\r\nU = 0.1\r\nh2 = np.zeros((norb, norb, norb, norb))\r\nfor i in range(norb):\r\n h2[i,i,i,i] = U\r\n\r\ne, fcivec = fci.direct_spin1.kernel(h1, h2, norb, nelec, nroots=nroots, max_space=30, max_cycle=100,\r\n davidson_only=True,\r\n )\r\n\r\nprint(\"Energies:\", e)\r\n```\r\n\r\nThe error message:\r\n``` bash\r\n File \"/lib/python3.11/site-packages/pyscf/fci/direct_spin1.py\", line 257, in kernel\r\n return _kfactory(FCISolver, h1e, eri, norb, nelec, ci0, level_shift,\r\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\r\n File \"/lib/python3.11/site-packages/pyscf/fci/direct_spin1.py\", line 281, in _kfactory\r\n e, c = cis.kernel(h1e, eri, norb, nelec, ci0, ecore=ecore, **unknown)\r\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\r\n File \"/lib/python3.11/site-packages/pyscf/fci/direct_spin1.py\", line 842, in kernel\r\n e, c = kernel_ms1(self, h1e, eri, norb, nelec, ci0, link_index,\r\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\r\n File \"/lib/python3.11/site-packages/pyscf/fci/direct_spin1.py\", line 612, in kernel_ms1\r\n e, c = fci.eig(hop, ci0, precond, tol=tol, lindep=lindep,\r\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\r\n File \"/lib/python3.11/site-packages/pyscf/fci/direct_spin1.py\", line 810, in eig\r\n lib.davidson1(lambda xs: [op(x) for x in xs],\r\n File \"/lib/python3.11/site-packages/pyscf/lib/linalg_helper.py\", line 388, in davidson1\r\n x0 = x0()\r\n ^^^^\r\n File \"/lib/python3.11/site-packages/pyscf/fci/direct_spin1.py\", line 580, in init_guess\r\n return fci.get_init_guess(norb, nelec, nroots, hdiag)\r\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\r\n File \"/lib/python3.11/site-packages/pyscf/fci/direct_spin1.py\", line 829, in get_init_guess\r\n return get_init_guess(norb, nelec, nroots, hdiag)\r\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\r\n File \"/lib/python3.11/site-packages/pyscf/fci/direct_spin1.py\", line 469, in get_init_guess\r\n return _get_init_guess(na, nb, nroots, hdiag, nelec)\r\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\r\n File \"/lib/python3.11/site-packages/pyscf/fci/direct_spin1.py\", line 444, in _get_init_guess\r\n addrs = numpy.argpartition(lib.pack_tril(hdiag), nroots-1)[:nroots]\r\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\r\n File \"/lib/python3.11/site-packages/numpy/_core/fromnumeric.py\", line 908, in argpartition\r\n return _wrapfunc(a, 'argpartition', kth, axis=axis, kind=kind, order=order)\r\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\r\n File \"/lib/python3.11/site-packages/numpy/_core/fromnumeric.py\", line 57, in _wrapfunc\r\n return bound(*args, **kwds)\r\n ^^^^^^^^^^^^^^^^^^^^\r\nValueError: kth(=35) out of bounds (21)\r\n```\r\n\r\nI have only encountered this error with versions of PySCF >=v2.2.1, the versions before that run with the correct output. I believe the issue is related to `davidson_only=True` as setting `davidson_only=False` for >=v2.2.1 also does not produce an error.\r\n\r\nIs this a bug with the davidson solver?\r\n\r\nThanks!"}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/pyscf_m_pyscf:pr-2306", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/pyscf/fci/direct_spin0_symm.py b/pyscf/fci/direct_spin0_symm.py\nindex ed6feb92f9..5e1e8f1f82 100644\n--- a/pyscf/fci/direct_spin0_symm.py\n+++ b/pyscf/fci/direct_spin0_symm.py\n@@ -74,15 +74,20 @@ def get_init_guess(norb, nelec, nroots, hdiag, orbsym, wfnsym=0):\n strsa = cistring.gen_strings4orblist(range(norb), neleca)\n na = len(strsa)\n airreps = direct_spin1_symm._gen_strs_irrep(strsa, orbsym)\n- hdiag = hdiag.reshape(na,na)\n \n sym_allowed = (airreps[:,None] ^ airreps) == wfnsym\n idx = numpy.arange(na)\n sym_allowed[idx[:,None] < idx] = False\n idx_a, idx_b = numpy.where(sym_allowed)\n \n+ hdiag = hdiag.reshape(na,na)[idx_a,idx_b]\n+ if hdiag.size <= nroots:\n+ hdiag_indices = numpy.arange(hdiag.size)\n+ else:\n+ hdiag_indices = numpy.argpartition(hdiag, nroots-1)[:nroots]\n+\n ci0 = []\n- for k in numpy.argpartition(hdiag[idx_a,idx_b], nroots-1)[:nroots]:\n+ for k in hdiag_indices:\n addra, addrb = idx_a[k], idx_b[k]\n x = numpy.zeros((na, na))\n if addra == addrb:\ndiff --git a/pyscf/fci/direct_spin1.py b/pyscf/fci/direct_spin1.py\nindex 7f8d04f3d3..710acc872c 100644\n--- a/pyscf/fci/direct_spin1.py\n+++ b/pyscf/fci/direct_spin1.py\n@@ -440,8 +440,11 @@ def _get_init_guess(na, nb, nroots, hdiag, nelec):\n ci0 = []\n neleca, nelecb = _unpack_nelec(nelec)\n if neleca == nelecb and na == nb:\n- hdiag = hdiag.reshape(na, na)\n- addrs = numpy.argpartition(lib.pack_tril(hdiag), nroots-1)[:nroots]\n+ hdiag = lib.pack_tril(hdiag.reshape(na, na))\n+ if hdiag.size <= nroots:\n+ addrs = numpy.arange(hdiag.size)\n+ else:\n+ addrs = numpy.argpartition(hdiag, nroots-1)[:nroots]\n for addr in addrs:\n addra = (int)((2*addr+.25)**.5 - .5 + 1e-7)\n addrb = addr - addra*(addra+1)//2\n@@ -449,7 +452,10 @@ def _get_init_guess(na, nb, nroots, hdiag, nelec):\n x[addra,addrb] = 1\n ci0.append(x.ravel().view(FCIvector))\n else:\n- addrs = numpy.argpartition(hdiag, nroots-1)[:nroots]\n+ if hdiag.size <= nroots:\n+ addrs = numpy.arange(hdiag.size)\n+ else:\n+ addrs = numpy.argpartition(hdiag, nroots-1)[:nroots]\n for addr in addrs:\n x = numpy.zeros((na*nb))\n x[addr] = 1\ndiff --git a/pyscf/fci/direct_spin1_symm.py b/pyscf/fci/direct_spin1_symm.py\nindex 017505836a..ee10487b8f 100644\n--- a/pyscf/fci/direct_spin1_symm.py\n+++ b/pyscf/fci/direct_spin1_symm.py\n@@ -217,15 +217,20 @@ def _get_init_guess(airreps, birreps, nroots, hdiag, nelec, orbsym, wfnsym=0):\n neleca, nelecb = _unpack_nelec(nelec)\n na = len(airreps)\n nb = len(birreps)\n- hdiag = hdiag.reshape(na,nb)\n sym_allowed = airreps[:,None] == wfnsym ^ birreps\n if neleca == nelecb and na == nb:\n idx = np.arange(na)\n sym_allowed[idx[:,None] < idx] = False\n idx_a, idx_b = np.where(sym_allowed)\n \n+ hdiag = hdiag.reshape(na,nb)[idx_a,idx_b]\n+ if hdiag.size <= nroots:\n+ hdiag_indices = np.arange(hdiag.size)\n+ else:\n+ hdiag_indices = np.argpartition(hdiag, nroots-1)[:nroots]\n+\n ci0 = []\n- for k in np.argpartition(hdiag[idx_a,idx_b], nroots-1)[:nroots]:\n+ for k in hdiag_indices:\n addra, addrb = idx_a[k], idx_b[k]\n x = np.zeros((na, nb))\n x[addra,addrb] = 1\n@@ -248,7 +253,11 @@ def get_init_guess(norb, nelec, nroots, hdiag, orbsym, wfnsym=0):\n return _get_init_guess(airreps, birreps, nroots, hdiag, nelec, orbsym, wfnsym)\n \n ci0 = []\n- for k in np.argpartition(hdiag, nroots-1)[:nroots]:\n+ if hdiag.size <= nroots:\n+ hdiag_indices = np.arange(hdiag.size)\n+ else:\n+ hdiag_indices = np.argpartition(hdiag, nroots-1)[:nroots]\n+ for k in hdiag_indices:\n x = np.zeros_like(hdiag)\n x[k] = 1.\n ci0.append(x.ravel().view(direct_spin1.FCIvector))\ndiff --git a/pyscf/fci/direct_uhf.py b/pyscf/fci/direct_uhf.py\nindex e5c7cda67a..6aaea941b3 100644\n--- a/pyscf/fci/direct_uhf.py\n+++ b/pyscf/fci/direct_uhf.py\n@@ -198,7 +198,7 @@ def pspace(h1e, eri, norb, nelec, hdiag=None, np=400):\n na = cistring.num_strings(norb, neleca)\n nb = cistring.num_strings(norb, nelecb)\n assert hdiag.size == na * nb\n- if hdiag.size < np:\n+ if hdiag.size <= np:\n addr = numpy.arange(hdiag.size)\n else:\n try:\ndiff --git a/pyscf/scf/dispersion.py b/pyscf/scf/dispersion.py\nindex d63dd47cd6..4e038420ff 100644\n--- a/pyscf/scf/dispersion.py\n+++ b/pyscf/scf/dispersion.py\n@@ -23,6 +23,7 @@\n import warnings\n from functools import lru_cache\n from pyscf.lib import logger\n+from pyscf import scf\n \n # supported dispersion corrections\n DISP_VERSIONS = ['d3bj', 'd3zero', 'd3bjm', 'd3zerom', 'd3op', 'd4']\n@@ -115,8 +116,13 @@ def check_disp(mf, disp=None):\n if disp == 0: # disp = False\n return False\n \n- # The disp method for both HF and MCSCF is set to 'hf'\n- method = getattr(mf, 'xc', 'hf')\n+ # To prevent mf.do_disp() triggering the SCF.__getattr__ method, do not use\n+ # method = getattr(mf, 'xc', 'hf').\n+ if isinstance(mf, scf.hf.KohnShamDFT):\n+ method = mf.xc\n+ else:\n+ # Set the disp method for both HF and MCSCF to 'hf'\n+ method = 'hf'\n disp_version = parse_disp(method)[1]\n \n if disp is None: # Using the disp version decoded from the mf.xc attribute\n@@ -172,6 +178,5 @@ def get_dispersion(mf, disp=None, with_3body=None, verbose=None):\n raise RuntimeError(f'dipersion correction: {disp_version} is not supported.')\n \n # Inject to SCF class\n-from pyscf import scf\n scf.hf.SCF.do_disp = check_disp\n scf.hf.SCF.get_dispersion = get_dispersion\n"}, "test": {"test_patch": "diff --git a/pyscf/fci/test/test_spin1.py b/pyscf/fci/test/test_spin1.py\nindex 420cccba9a..23c7b9a4fc 100644\n--- a/pyscf/fci/test/test_spin1.py\n+++ b/pyscf/fci/test/test_spin1.py\n@@ -198,6 +198,17 @@ def test_pspace(self):\n h = fci.direct_spin1.pspace(h1e, g2e, norb, nelec)[1]\n self.assertAlmostEqual(abs(h-h.T).max(), 0, 12)\n \n+ def test_many_roots(self):\n+ norb = 4\n+ nelec = (2, 2)\n+ nroots = 36\n+ h1 = numpy.eye(norb) * -.5\n+ h2 = numpy.zeros((norb, norb, norb, norb))\n+ for i in range(norb):\n+ h2[i,i,i,i] = .1\n+ e, fcivec = fci.direct_spin1.kernel(h1, h2, norb, nelec, nroots=nroots, davidson_only=True)\n+ self.assertAlmostEqual(e[0], -2, 9)\n+\n \n if __name__ == \"__main__\":\n print(\"Full Tests for spin1\")\ndiff --git a/pyscf/fci/test/test_spin1_symm.py b/pyscf/fci/test/test_spin1_symm.py\nindex 4b63d48d27..58a055e9be 100644\n--- a/pyscf/fci/test/test_spin1_symm.py\n+++ b/pyscf/fci/test/test_spin1_symm.py\n@@ -208,6 +208,20 @@ def test_incomplete_orbsym(self):\n with self.assertRaises(lib.exceptions.PointGroupSymmetryError):\n sol.kernel(h1, h2, no, ne, orbsym=orbsym)\n \n+ def test_many_roots(self):\n+ norb = 4\n+ nelec = (2, 2)\n+ nroots = 36\n+ h1 = numpy.eye(norb) * -.5\n+ h2 = numpy.zeros((norb, norb, norb, norb))\n+ orbsym = numpy.array([0, 5, 3, 2])\n+ for i in range(norb):\n+ h2[i,i,i,i] = .1\n+ obj = direct_spin1_symm.FCI()\n+ e, fcivec = obj.kernel(h1, h2, norb, nelec, nroots=nroots,\n+ davidson_only=True, orbsym=orbsym)\n+ self.assertAlmostEqual(e[0], -1.8, 9)\n+\n if __name__ == \"__main__\":\n print(\"Full Tests for spin1-symm\")\n unittest.main()\n", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}142{"question_id": "MSB_pyscf_pyscf_pr2354", "question_type": "multi_swe_bench", "description": "Fix the transformation matrix of Mole.decontracted_basis (pyscf/pyscf#2354)", "content": {"org": "pyscf", "repo": "pyscf", "pr_number": 2354, "issue_title": "Fix the transformation matrix of Mole.decontracted_basis", "issue_body": "fix #2348", "base_commit": "71d265c95fbef7c9ca4ff6e91b613f2d226959a8", "resolved_issues": [{"number": 2348, "title": "`mole.to_uncontracted_cartesian_basis` behavior change", "body": "The behavior of `mole.to_uncontracted_cartesian_basis` has chaged since v2.1. The coefficients returned no longer have the size of the number of shells of the original Mole object. This breaks some code for some basis sets, e.g., this [line]( https://github.com/pyscf/pyscf/blob/ca8c7c1680defdfee2380eda3af3a28d9fb375cb/pyscf/pbc/dft/multigrid/multigrid.py#L903).\r\nI think we should modify the docstring and maybe also add a warning.\n\n### Minimal API referenced by tests (typed signatures)\n_Added only when tests call brand\u2011new symbols introduced by the fix; types reflect annotations present in the repo or `Unknown` if not annotated._\n\n- Function in `pyscf/gto/mole.py`: `def decontract_basis(mol, atoms, to_cart, aggregate) -> Union[list, tuple]: ...`\n **Inputs:** mol: gto.Mole, atoms: Union[list, tuple], to_cart: bool, aggregate: bool\n **Output:** Union[list, tuple]\n\n```python\ndef decontract_basis(mol, atoms, to_cart, aggregate) -> Union[list, tuple]: ...\n```"}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/pyscf_m_pyscf:pr-2354", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/pyscf/gto/mole.py b/pyscf/gto/mole.py\nindex 0f2ec506f9..24319af8cc 100644\n--- a/pyscf/gto/mole.py\n+++ b/pyscf/gto/mole.py\n@@ -572,7 +572,7 @@ def to_uncontracted_cartesian_basis(mol):\n '''\n return decontract_basis(mol, to_cart=True)\n \n-def decontract_basis(mol, atoms=None, to_cart=False):\n+def decontract_basis(mol, atoms=None, to_cart=False, aggregate=False):\n '''Decontract the basis of a Mole or a Cell. Returns a Mole (Cell) object\n with the uncontracted basis environment and a list of coefficients that\n transform the uncontracted basis to the original basis. Each element in\n@@ -584,6 +584,9 @@ def decontract_basis(mol, atoms=None, to_cart=False):\n are decontracted\n to_cart: bool\n Decontract basis and transfer to Cartesian basis\n+ aggregate: bool\n+ Whether to aggregate the transformation coefficients into a giant\n+ transformation matrix\n \n Examples:\n \n@@ -602,17 +605,27 @@ def decontract_basis(mol, atoms=None, to_cart=False):\n bas_exps = mol.bas_exps()\n def _to_full_contraction(mol, bas_idx):\n es = numpy.hstack([bas_exps[i] for i in bas_idx])\n- cs = scipy.linalg.block_diag(*[mol._libcint_ctr_coeff(ib) for ib in bas_idx])\n-\n- es, e_idx, rev_idx = numpy.unique(es.round(9), True, True)\n- cs_new = numpy.zeros((es.size, cs.shape[1]))\n- for i, j in enumerate(rev_idx):\n- cs_new[j] += cs[i]\n- return es[::-1], cs_new[::-1]\n+ _, e_idx, rev_idx = numpy.unique(es.round(9), True, True)\n+ if aggregate:\n+ cs = scipy.linalg.block_diag(\n+ *[mol._libcint_ctr_coeff(i) for i in bas_idx])\n+ if len(es) != len(e_idx):\n+ cs_new = numpy.zeros((e_idx.size, cs.shape[1]))\n+ for i, j in enumerate(rev_idx):\n+ cs_new[j] += cs[i]\n+ es = es[e_idx][::-1]\n+ cs = cs_new[::-1]\n+ yield es, cs\n+ else:\n+ if len(es) != len(e_idx):\n+ raise RuntimeError('Duplicated pGTOs across shells')\n+ for i in bas_idx:\n+ yield bas_exps[i], mol._libcint_ctr_coeff(i)\n \n _bas = []\n- _env = mol._env.copy()\n+ env = [mol._env.copy()]\n contr_coeff = []\n+ pexp = env[0].size\n \n lmax = mol._bas[:,ANG_OF].max()\n if mol.cart:\n@@ -648,7 +661,7 @@ def _to_full_contraction(mol, bas_idx):\n continue\n \n lmax = mol._bas[ib0:ib1,ANG_OF].max()\n- pexp = mol._bas[ib0,PTR_EXP]\n+\n for l in range(lmax+1):\n bas_idx = ib0 + numpy.where(mol._bas[ib0:ib1,ANG_OF] == l)[0]\n if len(bas_idx) == 0:\n@@ -656,30 +669,27 @@ def _to_full_contraction(mol, bas_idx):\n if bas_idx[0] + len(bas_idx) != bas_idx[-1] + 1:\n raise NotImplementedError('Discontinuous bases of same angular momentum')\n \n- mol_exps, b_coeff = _to_full_contraction(mol, bas_idx)\n- nprim, nc = b_coeff.shape\n- bs = numpy.zeros((nprim, BAS_SLOTS), dtype=numpy.int32)\n- bs[:,ATOM_OF] = ia\n- bs[:,ANG_OF ] = l\n- bs[:,NCTR_OF] = bs[:,NPRIM_OF] = 1\n- norm = gto_norm(l, mol_exps)\n- if atoms is None:\n+ for mol_exps, b_coeff in _to_full_contraction(mol, bas_idx):\n+ nprim, nc = b_coeff.shape\n+ bs = numpy.zeros((nprim, BAS_SLOTS), dtype=numpy.int32)\n+ bs[:,ATOM_OF] = ia\n+ bs[:,ANG_OF ] = l\n+ bs[:,NCTR_OF] = bs[:,NPRIM_OF] = 1\n bs[:,PTR_EXP] = pexp + numpy.arange(nprim)\n bs[:,PTR_COEFF] = pexp + numpy.arange(nprim, nprim*2)\n- _env[pexp:pexp+nprim] = mol_exps\n- _env[pexp+nprim:pexp+nprim*2] = norm\n+ norm = gto_norm(l, mol_exps)\n+ env.append(mol_exps)\n+ env.append(norm)\n pexp += nprim * 2\n- else:\n- bs[:,PTR_EXP] = _env.size + numpy.arange(nprim)\n- bs[:,PTR_COEFF] = _env.size + numpy.arange(nprim, nprim*2)\n- _env = np.hstack([_env, mol_exps, norm])\n- _bas.append(bs)\n+ _bas.append(bs)\n \n- c = numpy.einsum('pi,p,xm->pxim', b_coeff, 1./norm, c2s[l])\n- contr_coeff.append(c.reshape(nprim * c2s[l].shape[0], -1))\n+ c = numpy.einsum('pi,p,xm->pxim', b_coeff, 1./norm, c2s[l])\n+ contr_coeff.append(c.reshape(nprim * c2s[l].shape[0], -1))\n \n pmol._bas = numpy.asarray(numpy.vstack(_bas), dtype=numpy.int32)\n- pmol._env = _env\n+ pmol._env = numpy.hstack(env)\n+ if aggregate:\n+ contr_coeff = scipy.linalg.block_diag(*contr_coeff)\n return pmol, contr_coeff\n \n def format_ecp(ecp_tab):\ndiff --git a/pyscf/pbc/df/ft_ao.py b/pyscf/pbc/df/ft_ao.py\nindex 4215251fdd..b85524abb7 100644\n--- a/pyscf/pbc/df/ft_ao.py\n+++ b/pyscf/pbc/df/ft_ao.py\n@@ -526,8 +526,9 @@ def assign(type_code):\n assign(SMOOTH_BASIS)\n return ao_type\n \n- def decontract_basis(self, to_cart=True):\n- pcell, ctr_coeff = self.ref_cell.decontract_basis(to_cart=to_cart)\n+ def decontract_basis(self, to_cart=True, aggregate=False):\n+ pcell, ctr_coeff = self.ref_cell.decontract_basis(to_cart=to_cart,\n+ aggregate=aggregate)\n pcell = pcell.view(self.__class__)\n pcell.ref_cell = None\n \ndiff --git a/pyscf/pbc/dft/multigrid/multigrid.py b/pyscf/pbc/dft/multigrid/multigrid.py\nindex 23f2bbb83f..2bcb533302 100644\n--- a/pyscf/pbc/dft/multigrid/multigrid.py\n+++ b/pyscf/pbc/dft/multigrid/multigrid.py\n@@ -601,16 +601,16 @@ def _eval_rhoG(mydf, dm_kpts, hermi=1, kpts=numpy.zeros((1,3)), deriv=0,\n dms_ht = numpy.asarray(dms[:,:,idx_h[:,None],idx_t], order='C')\n dms_lh = numpy.asarray(dms[:,:,idx_l[:,None],idx_h], order='C')\n \n- t_cell = h_cell + grids_sparse.cell\n+ l_cell = grids_sparse.cell\n+ h_pcell, h_coeff = h_cell.decontract_basis(to_cart=True, aggregate=True)\n+ l_pcell, l_coeff = l_cell.decontract_basis(to_cart=True, aggregate=True)\n+ t_cell = h_pcell + l_pcell\n+ t_coeff = scipy.linalg.block_diag(h_coeff, l_coeff)\n+\n nshells_h = _pgto_shells(h_cell)\n nshells_t = _pgto_shells(t_cell)\n- t_cell, t_coeff = t_cell.to_uncontracted_cartesian_basis()\n \n if deriv == 0:\n- h_coeff = scipy.linalg.block_diag(*t_coeff[:h_cell.nbas])\n- l_coeff = scipy.linalg.block_diag(*t_coeff[h_cell.nbas:])\n- t_coeff = scipy.linalg.block_diag(*t_coeff)\n-\n if hermi == 1:\n naol, naoh = dms_lh.shape[2:]\n dms_ht[:,:,:,naoh:] += dms_lh.transpose(0,1,3,2)\n@@ -635,10 +635,6 @@ def _eval_rhoG(mydf, dm_kpts, hermi=1, kpts=numpy.zeros((1,3)), deriv=0,\n 'LDA', kpts, grids_dense, ignore_imag, log)\n \n elif deriv == 1:\n- h_coeff = scipy.linalg.block_diag(*t_coeff[:h_cell.nbas])\n- l_coeff = scipy.linalg.block_diag(*t_coeff[h_cell.nbas:])\n- t_coeff = scipy.linalg.block_diag(*t_coeff)\n-\n pgto_dms = lib.einsum('nkij,pi,qj->nkpq', dms_ht, h_coeff, t_coeff)\n shls_slice = (0, nshells_h, 0, nshells_t)\n #:rho = eval_rho(t_cell, pgto_dms, shls_slice, 0, 'GGA', kpts,\n@@ -895,13 +891,13 @@ def _get_j_pass2(mydf, vG, hermi=1, kpts=numpy.zeros((1,3)), verbose=None):\n \n h_cell = grids_dense.cell\n l_cell = grids_sparse.cell\n- t_cell = h_cell + l_cell\n- t_cell, coeff = t_cell.to_uncontracted_cartesian_basis()\n+ h_pcell, h_coeff = h_cell.decontract_basis(to_cart=True, aggregate=True)\n+ l_pcell, l_coeff = l_cell.decontract_basis(to_cart=True, aggregate=True)\n+ t_cell = h_pcell + l_pcell\n+ t_coeff = scipy.linalg.block_diag(h_coeff, l_coeff)\n+\n nshells_h = _pgto_shells(h_cell)\n nshells_t = _pgto_shells(t_cell)\n-\n- h_coeff = scipy.linalg.block_diag(*coeff[:h_cell.nbas])\n- t_coeff = scipy.linalg.block_diag(*coeff)\n shls_slice = (0, nshells_h, 0, nshells_t)\n vp = eval_mat(t_cell, vR, shls_slice, 1, 0, 'LDA', kpts)\n # Imaginary part may contribute\n@@ -919,7 +915,6 @@ def _get_j_pass2(mydf, vG, hermi=1, kpts=numpy.zeros((1,3)), verbose=None):\n vj_kpts[:,:,idx_l[:,None],idx_h] += \\\n vp[:,:,:,naoh:].transpose(0,1,3,2).conj()\n else:\n- l_coeff = scipy.linalg.block_diag(*coeff[h_cell.nbas:])\n shls_slice = (nshells_h, nshells_t, 0, nshells_h)\n vp = eval_mat(t_cell, vR, shls_slice, 1, 0, 'LDA', kpts)\n # Imaginary part may contribute\n@@ -996,15 +991,13 @@ def _get_gga_pass2(mydf, vG, hermi=1, kpts=numpy.zeros((1,3)), verbose=None):\n \n h_cell = grids_dense.cell\n l_cell = grids_sparse.cell\n- t_cell = h_cell + l_cell\n- t_cell, coeff = t_cell.to_uncontracted_cartesian_basis()\n+ h_pcell, h_coeff = h_cell.decontract_basis(to_cart=True, aggregate=True)\n+ l_pcell, l_coeff = l_cell.decontract_basis(to_cart=True, aggregate=True)\n+ t_cell = h_pcell + l_pcell\n+ t_coeff = scipy.linalg.block_diag(h_coeff, l_coeff)\n+\n nshells_h = _pgto_shells(h_cell)\n nshells_t = _pgto_shells(t_cell)\n-\n- h_coeff = scipy.linalg.block_diag(*coeff[:h_cell.nbas])\n- l_coeff = scipy.linalg.block_diag(*coeff[h_cell.nbas:])\n- t_coeff = scipy.linalg.block_diag(*coeff)\n-\n shls_slice = (0, nshells_h, 0, nshells_t)\n vpR = eval_mat(t_cell, vR, shls_slice, 1, 0, 'GGA', kpts)\n vp = vpR = lib.einsum('nkpq,pi,qj->nkij', vpR, h_coeff, t_coeff)\ndiff --git a/pyscf/x2c/x2c.py b/pyscf/x2c/x2c.py\nindex 291cd8e40e..4bd83298d3 100644\n--- a/pyscf/x2c/x2c.py\n+++ b/pyscf/x2c/x2c.py\n@@ -810,8 +810,7 @@ def to_gpu(self):\n \n def _uncontract_mol(mol, xuncontract=None, exp_drop=0.2):\n '''mol._basis + uncontracted steep functions'''\n- pmol, contr_coeff = mol.decontract_basis(atoms=xuncontract)\n- contr_coeff = scipy.linalg.block_diag(*contr_coeff)\n+ pmol, contr_coeff = mol.decontract_basis(atoms=xuncontract, aggregate=True)\n return pmol, contr_coeff\n \n \n"}, "test": {"test_patch": "diff --git a/pyscf/gto/test/test_mole.py b/pyscf/gto/test/test_mole.py\nindex 1a91682db0..b0ffeb993c 100644\n--- a/pyscf/gto/test/test_mole.py\n+++ b/pyscf/gto/test/test_mole.py\n@@ -1037,14 +1037,27 @@ def test_decontract_basis(self):\n mol._bas = mol._bas[:5]\n pmol, c = mol.decontract_basis()\n self.assertEqual(pmol.nbas, 14)\n+ self.assertEqual(len(c), 5)\n \n mol = gto.M(atom='He',\n basis=('ccpvdz', [[0, [5, 1]], [1, [3, 1]]]))\n pmol, contr_coeff = mol.decontract_basis()\n+ self.assertEqual(len(contr_coeff), 5)\n contr_coeff = scipy.linalg.block_diag(*contr_coeff)\n s = contr_coeff.T.dot(pmol.intor('int1e_ovlp')).dot(contr_coeff)\n self.assertAlmostEqual(abs(s - mol.intor('int1e_ovlp')).max(), 0, 12)\n \n+ mol = gto.M(atom='H 0 0 0; F 0 0 1', basis=[[0, (2, .5), (1, .5)],\n+ [0, (2, .1), (1, .9)],\n+ [0, (4., 1)]])\n+ with self.assertRaises(RuntimeError):\n+ mol.decontract_basis(aggregate=False)\n+ pmol, c = mol.decontract_basis(aggregate=True)\n+ self.assertEqual(pmol.nbas, 6)\n+ self.assertEqual(c.shape, (6, 6))\n+ s = c.T.dot(pmol.intor('int1e_ovlp')).dot(c)\n+ self.assertAlmostEqual(abs(s - mol.intor('int1e_ovlp')).max(), 0, 12)\n+\n def test_ao_rotation_matrix(self):\n mol = gto.M(atom='O 0 0 0.2; H1 0 -.8 -.5; H2 0 .8 -.5', basis='ccpvdz')\n numpy.random.seed(1)\n", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}143{"question_id": "MSB_pyscf_pyscf_pr2357", "question_type": "multi_swe_bench", "description": "Enable spin-separated 3-RDMs (pyscf/pyscf#2357)", "content": {"org": "pyscf", "repo": "pyscf", "pr_number": 2357, "issue_title": "Enable spin-separated 3-RDMs", "issue_body": "The spin-separated 3-RDMs (aaa, aab, abb, bbb components) have been implemented thanks to @MatthewRHermes's hack (see #2326, code here is largely lifted out of https://github.com/MatthewRHermes/mrh/blob/master/my_pyscf/lassi/op_o0.py#L54-L168). A suitable test (mcscf/04) have been expanded to assert that the spin-separated RDMs add (with correct transpositions) to the spin-summed RDMs.", "base_commit": "e3e369fc75fcd6f9278acf05a4ab6c6ec4709880", "resolved_issues": [{"number": 2326, "title": "Spin-separated 3-RDMs?", "body": "Is there an easy way to access spin-separated 3-RDMs?\r\n\r\nSpin-separated 1 and 2 RDMs are supported through the `make_rdm12s` method in the `direct_spin1` fcisolver. However, only spin-traced 3/4-RDMs are available through `fci.rdm.make_dm123(4)`. \r\n\r\nFrom what I can gather this is due to a lack of spin-separated RDM kernels for 3/4 RDMs, but spin-separated intermediates (t1/t2) seem to be available, so it might be trivial to implement the spin-separated kernels. However the RDM library is a little too opaque for me to get a PR started. Any help on this would be appreciated!\n\n### Minimal API referenced by tests (typed signatures)\n_Added only when tests call brand\u2011new symbols introduced by the fix; types reflect annotations present in the repo or `Unknown` if not annotated._\n\n- Function in `pyscf/fci/direct_spin1.py`: `def make_rdm123(fcivec, norb, nelec, link_index, reorder) -> numpy.ndarray: ...`\n **Inputs:** fcivec: numpy.ndarray, norb: int, nelec: Union[int, tuple], link_index: numpy.ndarray, reorder: bool\n **Output:** numpy.ndarray\n\n- Function in `pyscf/fci/direct_spin1.py`: `def make_rdm123s(fcivec, norb, nelec, link_index, reorder) -> numpy.ndarray: ...`\n **Inputs:** fcivec: numpy.ndarray, norb: int, nelec: Union[int, tuple], link_index: numpy.ndarray, reorder: bool\n **Output:** numpy.ndarray\n\n```python\ndef make_rdm123(fcivec, norb, nelec, link_index, reorder) -> numpy.ndarray: ...\ndef make_rdm123s(fcivec, norb, nelec, link_index, reorder) -> numpy.ndarray: ...\n```"}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/pyscf_m_pyscf:pr-2357", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/examples/fci/14-density_matrix.py b/examples/fci/14-density_matrix.py\nindex b1980bae69..28e207b918 100644\n--- a/examples/fci/14-density_matrix.py\n+++ b/examples/fci/14-density_matrix.py\n@@ -125,6 +125,18 @@\n (nelec_a,nelec_b))\n dm1, dm2, dm3 = fci.rdm.reorder_dm123(dm1, dm2, dm3)\n \n+#\n+# Spin-separated 3-particle density matrix\n+#\n+\n+(dm1a, dm1b), (dm2aa, dm2ab, dm2bb), (dm3aaa, dm3aab, dm3abb, dm3bbb) = \\\n+ fci.direct_spin1.make_rdm123s(fcivec0, norb, (nelec_a,nelec_b))\n+\n+assert(numpy.allclose(dm1a+dm1b, dm1))\n+assert(numpy.allclose(dm2aa+dm2bb+dm2ab+dm2ab.transpose(2,3,0,1), dm2))\n+assert(numpy.allclose(dm3aaa+dm3bbb+dm3aab+dm3aab.transpose(0,1,4,5,2,3)+\\\n+dm3aab.transpose(4,5,0,1,2,3)+dm3abb+dm3abb.transpose(2,3,0,1,4,5)+dm3abb.transpose(2,3,4,5,0,1), dm3))\n+\n #\n # Spin-traced 3-particle transition density matrix\n #\ndiff --git a/examples/mcscf/04-density_matrix.py b/examples/mcscf/04-density_matrix.py\nindex 32ea6b8aab..ea756e1f48 100644\n--- a/examples/mcscf/04-density_matrix.py\n+++ b/examples/mcscf/04-density_matrix.py\n@@ -31,4 +31,3 @@\n dm1_alpha, dm1_beta = mycas.make_rdm1s()\n \n print(numpy.allclose(dm1, dm1_alpha+dm1_beta))\n-\ndiff --git a/pyscf/fci/addons.py b/pyscf/fci/addons.py\nindex 2c8e00178c..8119c80012 100644\n--- a/pyscf/fci/addons.py\n+++ b/pyscf/fci/addons.py\n@@ -703,6 +703,121 @@ def transform_ci(ci, nelec, u):\n ci = lib.dot(ci, trans_ci_b)\n return ci\n \n+def civec_spinless_repr_generator(ci0_r, norb, nelec_r):\n+ '''Put CI vectors in the spinless representation; i.e., map\n+ norb -> 2 * norb\n+ (neleca, nelecb) -> (neleca+nelecb, 0)\n+ This permits linear combinations of CI vectors with different\n+ M == neleca-nelecb at the price of higher memory cost. This function\n+ does NOT change the datatype.\n+\n+ Args:\n+ ci0_r: sequence or generator of ndarray of length nprods\n+ CAS-CI vectors in the spin-pure representation\n+ norb: integer\n+ Number of orbitals\n+ nelec_r: sequence of tuple of length (2)\n+ (neleca, nelecb) for each element of ci0_r\n+\n+ Returns:\n+ ci1_r_gen: callable that returns a generator of length nprods\n+ generates spinless CAS-CI vectors\n+ ss2spinless: callable\n+ Put a CAS-CI vector in the spinless representation\n+ Args:\n+ ci0: ndarray\n+ CAS-CI vector\n+ ne: tuple of length 2\n+ neleca, nelecb of target Hilbert space\n+ Returns:\n+ ci1: ndarray\n+ spinless CAS-CI vector\n+ spinless2ss: callable\n+ Perform the reverse operation on a spinless CAS-CI vector\n+ Args:\n+ ci2: ndarray\n+ spinless CAS-CI vector\n+ ne: tuple of length 2\n+ neleca, nelecb target Hilbert space\n+ Returns:\n+ ci3: ndarray\n+ CAS-CI vector of ci2 in the (neleca, nelecb) Hilbert space\n+ '''\n+ nelec_r_tot = [sum (n) for n in nelec_r]\n+ if len(set(nelec_r_tot)) > 1:\n+ raise NotImplementedError(\"Different particle-number subspaces\")\n+ nelec = nelec_r_tot[0]\n+ addrs = {}\n+ ndet_sp = {}\n+ for ne in set(nelec_r):\n+ neleca, nelecb = _unpack_nelec(ne)\n+ ndeta = cistring.num_strings(norb, neleca)\n+ ndetb = cistring.num_strings(norb, nelecb)\n+ strsa = cistring.addrs2str(norb, neleca, list(range(ndeta)))\n+ strsb = cistring.addrs2str(norb, nelecb, list(range(ndetb)))\n+ strs = numpy.add.outer(strsa, numpy.left_shift(strsb, norb)).ravel()\n+ addrs[ne] = cistring.strs2addr(2*norb, nelec, strs)\n+ ndet_sp[ne] = tuple((ndeta,ndetb))\n+ strs = strsa = strsb = None\n+ ndet = cistring.num_strings(2*norb, nelec)\n+ def ss2spinless(ci0, ne, buf=None):\n+ if buf is None:\n+ ci1 = numpy.empty(ndet, dtype=ci0.dtype)\n+ else:\n+ ci1 = numpy.asarray(buf).flat[:ndet]\n+ ci1[:] = 0.0\n+ ci1[addrs[ne]] = ci0[:,:].ravel ()\n+ neleca, nelecb = _unpack_nelec (ne)\n+ if abs(neleca*nelecb)%2: ci1[:] *= -1\n+ # Sign comes from changing representation:\n+ # ... a2' a1' a0' ... b2' b1' b0' |vac>\n+ # ->\n+ # ... b2' b1' b0' .. a2' a1' a0' |vac>\n+ # i.e., strictly decreasing from left to right\n+ # (the ordinality of spin-down is conventionally greater than spin-up)\n+ return ci1[:,None]\n+ def spinless2ss(ci2, ne):\n+ ''' Generate the spin-separated CI vector in a particular M\n+ Hilbert space from a spinless CI vector '''\n+ ci3 = ci2[addrs[ne]].reshape(ndet_sp[ne])\n+ neleca, nelecb = _unpack_nelec (ne)\n+ if abs(neleca*nelecb)%2: ci3[:] *= -1\n+ return ci3\n+ def ci1_r_gen(buf=None):\n+ if callable(ci0_r):\n+ ci0_r_gen = ci0_r()\n+ else:\n+ ci0_r_gen = (c for c in ci0_r)\n+ for ci0, ne in zip(ci0_r_gen, nelec_r):\n+ # Doing this in two lines saves memory: ci0 is overwritten\n+ ci0 = ss2spinless(ci0, ne)\n+ yield ci0\n+ return ci1_r_gen, ss2spinless, spinless2ss\n+\n+def civec_spinless_repr(ci0_r, norb, nelec_r):\n+ '''Put CI vectors in the spinless representation; i.e., map\n+ norb -> 2 * norb\n+ (neleca, nelecb) -> (neleca+nelecb, 0)\n+ This permits linear combinations of CI vectors with different\n+ M == neleca-nelecb at the price of higher memory cost. This function\n+ does NOT change the datatype.\n+\n+ Args:\n+ ci0_r: sequence or generator of ndarray of length nprods\n+ CAS-CI vectors in the spin-pure representation\n+ norb: integer\n+ Number of orbitals\n+ nelec_r: sequence of tuple of length (2)\n+ (neleca, nelecb) for each element of ci0_r\n+\n+ Returns:\n+ ci1_r: ndarray of shape (nprods, ndet_spinless)\n+ spinless CAS-CI vectors\n+ '''\n+ ci1_r_gen, *_ = civec_spinless_repr_generator(ci0_r, norb, nelec_r)\n+ ci1_r = numpy.stack([x.copy() for x in ci1_r_gen()], axis=0)\n+ return ci1_r\n+\n \n def _unpack_nelec(nelec, spin=None):\n if spin is None:\ndiff --git a/pyscf/fci/direct_spin1.py b/pyscf/fci/direct_spin1.py\nindex 784a557561..92b92af144 100644\n--- a/pyscf/fci/direct_spin1.py\n+++ b/pyscf/fci/direct_spin1.py\n@@ -50,7 +50,7 @@\n from pyscf.fci import spin_op\n from pyscf.fci import addons\n from pyscf.fci.spin_op import contract_ss\n-from pyscf.fci.addons import _unpack_nelec\n+from pyscf.fci.addons import _unpack_nelec, civec_spinless_repr\n from pyscf import __config__\n \n libfci = cistring.libfci\n@@ -371,6 +371,46 @@ def make_rdm12(fcivec, norb, nelec, link_index=None, reorder=True):\n dm1, dm2 = rdm.reorder_rdm(dm1, dm2, inplace=True)\n return dm1, dm2\n \n+def make_rdm123(fcivec, norb, nelec, link_index=None, reorder=True):\n+ '''Spin traced 1-, 2-, and 3-particle density matrices.'''\n+ dm1, dm2, dm3 = rdm.make_dm123('FCI3pdm_kern_sf', fcivec, fcivec, norb, nelec)\n+ if reorder:\n+ dm1, dm2, dm3 = rdm.reorder_dm123(dm1, dm2, dm3, inplace=True)\n+ return dm1, dm2, dm3\n+\n+def make_rdm123s(fcivec, norb, nelec, link_index=None, reorder=True):\n+ r'''Spin separated 1-, 2-, and 3-particle density matrices.\n+\n+ 1pdm[p,q] = :math:`\\langle q_\\alpha^\\dagger p_\\alpha \\rangle +\n+ \\langle q_\\beta^\\dagger p_\\beta \\rangle`;\n+ 2pdm[p,q,r,s] = :math:`\\langle p_\\alpha^\\dagger r_\\alpha^\\dagger s_\\alpha q_\\alpha\\rangle +\n+ \\langle p_\\beta^\\dagger r_\\alpha^\\dagger s_\\alpha q_\\beta\\rangle +\n+ \\langle p_\\alpha^\\dagger r_\\beta^\\dagger s_\\beta q_\\alpha\\rangle +\n+ \\langle p_\\beta^\\dagger r_\\beta^\\dagger s_\\beta q_\\beta\\rangle`.\n+ '''\n+ if (not reorder):\n+ raise NotImplementedError('reorder=False not currently supported')\n+ ci_spinless = civec_spinless_repr([fcivec,], norb, [nelec,])\n+ rdm1, rdm2, rdm3 = make_rdm123(ci_spinless, norb*2, (nelec[0]+nelec[1],0))\n+\n+ rdm1a = rdm1[:norb,:norb]\n+ rdm1b = rdm1[norb:,norb:]\n+ # assert np.allclose(rdm1a+rdm1b, rdm1)\n+\n+ rdm2aa = rdm2[:norb,:norb,:norb,:norb]\n+ rdm2ab = rdm2[:norb,:norb,norb:,norb:]\n+ rdm2bb = rdm2[norb:,norb:,norb:,norb:]\n+ # assert np.allclose(rdm2aa+rdm2bb+rdm2ab+rdm2ab.transpose(2,3,0,1), rdm2)\n+\n+ rdm3aaa = rdm3[:norb,:norb,:norb,:norb,:norb,:norb]\n+ rdm3aab = rdm3[:norb,:norb,:norb,:norb,norb:,norb:]\n+ rdm3abb = rdm3[:norb,:norb,norb:,norb:,norb:,norb:]\n+ rdm3bbb = rdm3[norb:,norb:,norb:,norb:,norb:,norb:]\n+ # assert np.allclose(rdm3aaa+rdm3bbb+rdm3aab+rdm3aab.transpose(0,1,4,5,2,3)+\\\n+ # rdm3aab.transpose(4,5,0,1,2,3)+rdm3abb+rdm3abb.transpose(2,3,0,1,4,5)+rdm3abb.transpose(2,3,4,5,0,1), rdm3)\n+ return (rdm1a, rdm1b), (rdm2aa, rdm2ab, rdm2bb), (rdm3aaa, rdm3aab, rdm3abb, rdm3bbb)\n+\n+\n def trans_rdm1s(cibra, ciket, norb, nelec, link_index=None):\n r'''Spin separated transition 1-particle density matrices.\n The return values include two density matrices: (alpha,alpha), (beta,beta).\n@@ -890,6 +930,16 @@ def make_rdm12(self, fcivec, norb, nelec, link_index=None, reorder=True):\n nelec = _unpack_nelec(nelec, self.spin)\n return make_rdm12(fcivec, norb, nelec, link_index, reorder)\n \n+ @lib.with_doc(make_rdm123s.__doc__)\n+ def make_rdm123s(self, fcivec, norb, nelec, link_index=None, reorder=True):\n+ nelec = _unpack_nelec(nelec, self.spin)\n+ return make_rdm123s(fcivec, norb, nelec, link_index, reorder)\n+\n+ @lib.with_doc(make_rdm123.__doc__)\n+ def make_rdm123(self, fcivec, norb, nelec, link_index=None, reorder=True):\n+ nelec = _unpack_nelec(nelec, self.spin)\n+ return make_rdm123(fcivec, norb, nelec, link_index, reorder)\n+\n def make_rdm2(self, fcivec, norb, nelec, link_index=None, reorder=True):\n r'''Spin traced 2-particle density matrice\n \n"}, "test": {"test_patch": "diff --git a/pyscf/fci/test/test_rdm.py b/pyscf/fci/test/test_rdm.py\nindex e28ab38d2e..8ac3b59957 100644\n--- a/pyscf/fci/test/test_rdm.py\n+++ b/pyscf/fci/test/test_rdm.py\n@@ -20,6 +20,7 @@\n from pyscf import scf\n from pyscf import ao2mo\n from pyscf import fci\n+from pyscf import mcscf\n \n def setUpModule():\n global ci0, rdm1, rdm2, norb, nelec\n@@ -62,6 +63,52 @@ def test_rdm3(self):\n dm3 = fci.rdm.make_dm123('FCI3pdm_kern_sf', ci1, ci1, norb, (5,3))[2]\n self.assertTrue(numpy.allclose(dm3ref, dm3))\n \n+ def test_rdm3s(self):\n+ dm1, dm2, dm3 = fci.direct_spin1.make_rdm123(ci0, norb, (nelec//2,nelec//2))\n+\n+ (dm1a, dm1b), (dm2aa, dm2ab, dm2bb), (dm3aaa, dm3aab, dm3abb, dm3bbb) = \\\n+ fci.direct_spin1.make_rdm123s(ci0, norb, (nelec//2,nelec//2))\n+\n+ self.assertTrue(numpy.allclose(dm1a+dm1b, dm1))\n+ self.assertTrue(numpy.allclose(dm2aa+dm2bb+dm2ab+dm2ab.transpose(2,3,0,1), dm2))\n+ self.assertTrue(numpy.allclose(dm3aaa+dm3bbb+dm3aab+dm3aab.transpose(0,1,4,5,2,3)+\\\n+ dm3aab.transpose(4,5,0,1,2,3)+dm3abb+dm3abb.transpose(2,3,0,1,4,5)+dm3abb.transpose(2,3,4,5,0,1), dm3))\n+\n+ (rdm1a, rdm1b), (rdm2aa, rdm2ab, rdm2bb) = \\\n+ fci.direct_spin1.make_rdm12s(ci0, norb, (nelec//2,nelec//2))\n+\n+ self.assertTrue(numpy.allclose(rdm1a, dm1a))\n+ self.assertTrue(numpy.allclose(rdm1b, dm1b))\n+\n+ fac = 1. / (nelec//2-1)\n+ self.assertTrue(numpy.allclose(rdm1a, numpy.einsum('ijmm->ij',dm2aa)*fac))\n+ self.assertTrue(numpy.allclose(rdm1a, numpy.einsum('mmij->ij',dm2aa)*fac))\n+ self.assertTrue(numpy.allclose(rdm1b, numpy.einsum('ijmm->ij',dm2bb)*fac))\n+ self.assertTrue(numpy.allclose(rdm1b, numpy.einsum('mmij->ij',dm2bb)*fac))\n+\n+ fac = 1. / (nelec//2) # dm2ab has a prefactor N * N instead of N(N-1)\n+ self.assertTrue(numpy.allclose(rdm1a, numpy.einsum('ijmm->ij',dm2ab)*fac))\n+ self.assertTrue(numpy.allclose(rdm1b, numpy.einsum('mmij->ij',dm2ab)*fac))\n+\n+ fac = 1. / (nelec//2-2)\n+ self.assertTrue(numpy.allclose(rdm2aa, numpy.einsum('ijklmm->ijkl',dm3aaa)*fac))\n+ self.assertTrue(numpy.allclose(rdm2aa, numpy.einsum('ijmmkl->ijkl',dm3aaa)*fac))\n+ self.assertTrue(numpy.allclose(rdm2aa, numpy.einsum('mmijkl->ijkl',dm3aaa)*fac))\n+\n+ self.assertTrue(numpy.allclose(rdm2bb, numpy.einsum('ijklmm->ijkl',dm3bbb)*fac))\n+ self.assertTrue(numpy.allclose(rdm2bb, numpy.einsum('ijmmkl->ijkl',dm3bbb)*fac))\n+ self.assertTrue(numpy.allclose(rdm2bb, numpy.einsum('mmijkl->ijkl',dm3bbb)*fac))\n+\n+ fac = 1. / (nelec//2) # dm3aab/abb has a prefactor N * N * (N-1) instead of N(N-1)(N-2)\n+ self.assertTrue(numpy.allclose(rdm2aa, numpy.einsum('ijklmm->ijkl',dm3aab)*fac))\n+ self.assertTrue(numpy.allclose(rdm2bb, numpy.einsum('mmijkl->ijkl',dm3abb)*fac))\n+\n+ fac = 1. / (nelec//2-1)\n+ self.assertTrue(numpy.allclose(rdm2ab, numpy.einsum('ijmmkl->ijkl',dm3aab)*fac))\n+ self.assertTrue(numpy.allclose(rdm2ab, numpy.einsum('mmijkl->ijkl',dm3aab)*fac))\n+ self.assertTrue(numpy.allclose(rdm2ab, numpy.einsum('ijklmm->ijkl',dm3abb)*fac))\n+ self.assertTrue(numpy.allclose(rdm2ab, numpy.einsum('ijmmkl->ijkl',dm3abb)*fac))\n+\n def test_dm4(self):\n dm4ref = make_dm4_o0(ci0, norb, nelec)\n dm4 = fci.rdm.make_dm1234('FCI4pdm_kern_sf', ci0, ci0, norb, nelec)[3]\n", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}144{"question_id": "MSB_pyscf_pyscf_pr2364", "question_type": "multi_swe_bench", "description": "Fix define_xc example (pyscf/pyscf#2364)", "content": {"org": "pyscf", "repo": "pyscf", "pr_number": 2364, "issue_title": "Fix define_xc example", "issue_body": "Update examples: 24-define_xc_functional.py and 31-xc_value_on_grid.py . (Fix issue #2092 , #2011)", "base_commit": "b556049b8104c9fb4735149fa65665f62443565e", "resolved_issues": [{"number": 2011, "title": "Obtaining Hartree-Fock exchange energy density on grids", "body": "Hello pySCF team, I hope the new year is treating you well. \r\n\r\nI'm trying to obtain Hartree-Fock exchange energy densities on grids (as the title would suggest). While there was an issue ( #1485 ) posted and seemingly resolved a little over a year ago, there was no input from any pySCF devs and the issue was closed the same day that it was posted with no commentary from anyone other than the author. I've tried executing this method to no success, as it doesn't seem to return values that get us the energy when combined with rho and the grid weights (as you would be able to with exc in a Kohn-Sham calculation).\r\n\r\nIn short, I'm looking for an analogue to exc from KS, but in HF (an ex, if you will).\r\n\r\nIf there is any insight on how this may be accomplished, please let me know and I look forward to your responses!"}, {"number": 2092, "title": "Unable to use custom xc functional", "body": "Hi PySCF developers,\r\n\r\nI'm new to using PySCF. I wanted to plugin my own XC functional using the define_xc_() interface in the dft module. To begin with, I attempted to run the example that demonstrates the use of custom XC functional (https://github.com/pyscf/pyscf/blob/master/examples/dft/24-define_xc_functional.py). However, running it throws the following error:\r\n\r\n```\r\nTraceback (most recent call last):\r\n File \"custom_xc_test.py\", line 63, in <module>\r\n mf.kernel()\r\n File \"<string>\", line 2, in kernel\r\n File \"/home/biku/miniconda3/lib/python3.8/site-packages/pyscf/scf/hf.py\", line 1779, in scf\r\n kernel(self, self.conv_tol, self.conv_tol_grad,\r\n File \"/home/biku/miniconda3/lib/python3.8/site-packages/pyscf/scf/hf.py\", line 124, in kernel\r\n vhf = mf.get_veff(mol, dm)\r\n File \"/home/biku/miniconda3/lib/python3.8/site-packages/pyscf/dft/rks.py\", line 80, in get_veff\r\n n, exc, vxc = ni.nr_rks(mol, ks.grids, ks.xc, dm, max_memory=max_memory)\r\n File \"/home/biku/miniconda3/lib/python3.8/site-packages/pyscf/dft/numint.py\", line 1158, in nr_rks\r\n for i, ao, mask, wv in block_loop(ao_deriv):\r\n File \"/home/biku/miniconda3/lib/python3.8/site-packages/pyscf/dft/numint.py\", line 1138, in block_loop\r\n exc, vxc = ni.eval_xc_eff(xc_code, rho, deriv=1, xctype=xctype)[:2]\r\n File \"/home/biku/miniconda3/lib/python3.8/site-packages/pyscf/dft/numint.py\", line 2696, in eval_xc_eff\r\n out = self.libxc.eval_xc1(xc_code, rho, spin, deriv, omega)\r\n File \"/home/biku/miniconda3/lib/python3.8/site-packages/pyscf/dft/libxc.py\", line 1599, in eval_xc1\r\n out = _eval_xc(xc_code, rho, spin, deriv=deriv, omega=omega)\r\n File \"/home/biku/miniconda3/lib/python3.8/site-packages/pyscf/dft/libxc.py\", line 1654, in _eval_xc\r\n rho = rho.reshape(spin+1,nvar,ngrids)\r\nValueError: cannot reshape array of size 120224 into shape (1,1,30056)\r\n```\r\n\r\nThe custom_xc_test.py is just a copy of the example link provided above. \r\n\r\nI used `pip install --prefer-binary pyscf` to install my PySCF.\r\n\r\nI would really appreciate it if you can help me figure out how to use a custom XC functional. \r\n\r\nRegards,\r\nBikash"}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/pyscf_m_pyscf:pr-2364", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/examples/dft/24-define_xc_functional.py b/examples/dft/24-define_xc_functional.py\nindex e4efae3089..72c7f25cfd 100644\n--- a/examples/dft/24-define_xc_functional.py\n+++ b/examples/dft/24-define_xc_functional.py\n@@ -50,11 +50,11 @@ def eval_xc(xc_code, rho, spin=0, relativity=0, deriv=1, omega=None, verbose=Non\n kxc = None # 3rd order functional derivative\n \n # Mix with existing functionals\n- pbe_xc = dft.libxc.eval_xc('pbe,pbe', rho, spin, relativity, deriv,\n- verbose)\n+ pbe_xc = dft.libxc.eval_xc('pbe,pbe', rho, spin, relativity, deriv, verbose)\n exc += pbe_xc[0] * 0.5\n vrho += pbe_xc[1][0] * 0.5\n vgamma += pbe_xc[1][1] * 0.5\n+ # The output follows the libxc.eval_xc API convention\n return exc, vxc, fxc, kxc\n \n mf = dft.RKS(mol)\n@@ -70,4 +70,3 @@ def eval_xc(xc_code, rho, spin=0, relativity=0, deriv=1, omega=None, verbose=Non\n mf = mf.define_xc_(eval_xc, 'GGA', rsh=rsh_coeff)\n mf.verbose = 4\n mf.kernel()\n-\ndiff --git a/examples/dft/31-xc_value_on_grid.py b/examples/dft/31-xc_value_on_grid.py\nindex c78592334e..d0e7a980c9 100644\n--- a/examples/dft/31-xc_value_on_grid.py\n+++ b/examples/dft/31-xc_value_on_grid.py\n@@ -5,7 +5,7 @@\n potential on given grid coordinates.\n '''\n \n-import numpy\n+import numpy as np\n from pyscf import gto, dft, lib\n from pyscf.dft import numint\n from pyscf.dft import r_numint\n@@ -37,19 +37,19 @@\n #\n ex, vx = dft.libxc.eval_xc('B88', rho)[:2]\n ec, vc = dft.libxc.eval_xc(',P86', rho)[:2]\n-print('Exc = %.12f' % numpy.einsum('i,i,i->', ex+ec, rho[0], weights))\n+print('Exc = %.12f' % np.einsum('i,i,i->', ex+ec, rho[0], weights))\n \n #\n # Evaluate XC functional together\n #\n exc, vxc = dft.libxc.eval_xc('B88,P86', rho)[:2]\n-print('Exc = %.12f' % numpy.einsum('i,i,i->', exc, rho[0], weights))\n+print('Exc = %.12f' % np.einsum('i,i,i->', exc, rho[0], weights))\n \n #\n # Evaluate XC functional for user specified functional\n #\n exc, vxc = dft.libxc.eval_xc('.2*HF + .08*SLATER + .72*B88, .81*LYP + .19*VWN', rho)[:2]\n-print('Exc = %.12f ref = -7.520014202688' % numpy.einsum('i,i,i->', exc, rho[0], weights))\n+print('Exc = %.12f ref = -7.520014202688' % np.einsum('i,i,i->', exc, rho[0], weights))\n \n #\n # For density matrix computed with GKS in spin-orbital basis, plain density in\n@@ -82,3 +82,20 @@\n rhoS, mS = r_numint.eval_rho(mol, aoS_value, dmSS)\n rho = rhoL + rhoS\n mx, my, mz = mL + mS\n+\n+#\n+# The values of exact exchange\n+# Exx(r) = \\sum_{ij} 2 (ij(r)|ji)\n+#\n+mf = mol.RHF().run()\n+# Compute analytically v_ij(r') = \\int \\chi_i(r) \\chi_j(r) / |r-r'| dr\n+rpq = mol.intor('int1e_grids', grids=coords)\n+ao = mol.eval_gto('GTOval', coords)\n+nocc = np.count_nonzero(mf.mo_occ)\n+occ_orb = mf.mo_coeff[:,:nocc]\n+mo = ao.dot(occ_orb)\n+exx = 2 * np.einsum('rpq,ri,rj,pj,qi->r', rpq, mo, mo, occ_orb, occ_orb)\n+print('Semi-numerical HFX:', exx.dot(weights))\n+dm = mf.make_rdm1()\n+vj, vk = mf.get_jk(dm)\n+print('Analytical HFX:', .5 * np.einsum('pq,qp->', vk, dm))\ndiff --git a/examples/fci/03-cylindrical_symmetry.py b/examples/fci/03-cylindrical_symmetry.py\nindex 78ad41eca7..3b3c382f88 100644\n--- a/examples/fci/03-cylindrical_symmetry.py\n+++ b/examples/fci/03-cylindrical_symmetry.py\n@@ -26,5 +26,5 @@\n solver = direct_spin1_cyl_sym.FCI(mol)\n for sym in ['A1g', 'A1u', 'E1ux', 'E1uy', 'E1gx', 'E1gy', 'E2ux', 'E2uy', 'E2gx', 'E2gy', 'E3ux', 'E3uy', 'E3gx', 'E3gy']:\n e, v = solver.kernel(h1e, eri, c.shape[1], mol.nelec, orbsym=orbsym,\n- wfnsym=sym, nroots=5, verbose=0)\n+ wfnsym=sym, nroots=5, ecore=mol.energy_nuc(), verbose=0)\n print(f'{sym}: {e}')\ndiff --git a/pyscf/dft/libxc.py b/pyscf/dft/libxc.py\nindex 0f248fb505..26aef161bf 100644\n--- a/pyscf/dft/libxc.py\n+++ b/pyscf/dft/libxc.py\n@@ -1609,13 +1609,17 @@ def eval_xc1(xc_code, rho, spin=0, deriv=1, omega=None):\n '''\n out = _eval_xc(xc_code, rho, spin, deriv=deriv, omega=omega)\n xctype = xc_type(xc_code)\n+ idx = _libxc_to_xcfun_indices(xctype, spin, deriv)\n+ return out[idx]\n+\n+def _libxc_to_xcfun_indices(xctype, spin=0, deriv=1):\n if deriv <= 1:\n- return out\n+ return slice(None)\n elif xctype == 'LDA' or xctype == 'HF':\n- return out\n+ return slice(None)\n elif xctype == 'GGA':\n if spin == 0:\n- return out\n+ return slice(None)\n else:\n idx = [numpy.arange(6)] # up to deriv=1\n for i in range(2, deriv+1):\n@@ -1627,7 +1631,7 @@ def eval_xc1(xc_code, rho, spin=0, deriv=1, omega=None):\n idx = [numpy.arange(8)] # up to deriv=1\n for i in range(2, deriv+1):\n idx.append(_MGGA_SORT[(spin, i)])\n- return out[numpy.hstack(idx)]\n+ return numpy.hstack(idx)\n \n def _eval_xc(xc_code, rho, spin=0, deriv=1, omega=None):\n assert deriv <= max_deriv_order(xc_code)\n@@ -1762,19 +1766,43 @@ def define_xc_(ni, description, xctype='LDA', hyb=0, rsh=(0,0,0)):\n 48.8525211046668\n '''\n if isinstance(description, str):\n- ni.eval_xc = lambda xc_code, rho, *args, **kwargs: \\\n- eval_xc(description, rho, *args, **kwargs)\n+ def _eval_xc(xc_code, rho, *args, **kwargs):\n+ return eval_xc(description, rho, *args, **kwargs)\n+ ni.eval_xc = _eval_xc\n ni.hybrid_coeff = lambda *args, **kwargs: hybrid_coeff(description)\n ni.rsh_coeff = lambda *args: rsh_coeff(description)\n ni._xc_type = lambda *args: xc_type(description)\n \n elif callable(description):\n- ni.eval_xc = description\n+ ni.eval_xc = _eval_xc = description\n ni.hybrid_coeff = lambda *args, **kwargs: hyb\n ni.rsh_coeff = lambda *args, **kwargs: rsh\n ni._xc_type = lambda *args: xctype\n+\n else:\n raise ValueError('Unknown description %s' % description)\n+\n+ def _eval_xc1(xc_code, rho, spin=0, deriv=1, omega=None):\n+ libxc_out = _eval_xc(xc_code, rho, spin, deriv=deriv, omega=omega)\n+ nvar, xlen = xc_deriv._XC_NVAR[xctype, spin]\n+ outlen = lib.comb(xlen+deriv, deriv)\n+ exc, vxc, fxc, kxc = libxc_out[:4]\n+ out = [exc]\n+ if vxc is not None:\n+ out.extend([x for x in vxc if x is not None])\n+ if fxc is not None:\n+ out.extend([fxc[i] for i in [0, 1, 2, 6, 4, 9]])\n+ if kxc is not None:\n+ out.extend([x for x in kxc if x is not None])\n+ if spin == 1:\n+ # Returns of eval_xc are structured as [grid_id,deriv_component]\n+ # for each term in libxc_out. Change the shape to [deriv_comp, grid_id]\n+ out = [x.T for x in out]\n+ out = numpy.vstack(out)[:outlen]\n+ assert len(out) == outlen\n+ idx = _libxc_to_xcfun_indices(xctype, spin, deriv)\n+ return out[idx]\n+ ni.eval_xc1 = _eval_xc1\n return ni\n \n def define_xc(ni, description, xctype='LDA', hyb=0, rsh=(0,0,0)):\ndiff --git a/pyscf/dft/numint.py b/pyscf/dft/numint.py\nindex 7eef303d2c..0f9dae11e5 100644\n--- a/pyscf/dft/numint.py\n+++ b/pyscf/dft/numint.py\n@@ -2654,6 +2654,10 @@ def eval_xc(self, xc_code, rho, spin=0, relativity=0, deriv=1, omega=None,\n return self.libxc.eval_xc(xc_code, rho, spin, relativity, deriv,\n omega, verbose)\n \n+ def eval_xc1(self, xc_code, rho, spin=0, deriv=1, omega=None):\n+ if omega is None: omega = self.omega\n+ return self.libxc.eval_xc1(xc_code, rho, spin, deriv, omega)\n+\n def eval_xc_eff(self, xc_code, rho, deriv=1, omega=None, xctype=None,\n verbose=None):\n r'''Returns the derivative tensor against the density parameters\n@@ -2693,12 +2697,12 @@ def eval_xc_eff(self, xc_code, rho, deriv=1, omega=None, xctype=None,\n else:\n spin = 0\n \n- out = self.libxc.eval_xc1(xc_code, rho, spin, deriv, omega)\n+ out = self.eval_xc1(xc_code, rho, spin, deriv, omega)\n evfk = [out[0]]\n for order in range(1, deriv+1):\n evfk.append(xc_deriv.transform_xc(rho, out, xctype, spin, order))\n if deriv < 3:\n- # The return has at least [e, v, f, k] terms\n+ # Returns at least [e, v, f, k] terms\n evfk.extend([None] * (3 - deriv))\n return evfk\n \n"}, "test": {"test_patch": "diff --git a/pyscf/dft/test/test_libxc.py b/pyscf/dft/test/test_libxc.py\nindex e94bfbd39e..cb4d46bbe9 100644\n--- a/pyscf/dft/test/test_libxc.py\n+++ b/pyscf/dft/test/test_libxc.py\n@@ -22,7 +22,7 @@\n from pyscf import lib\n \n def setUpModule():\n- global mol, mf, ao, rho\n+ global mol, mf, ao, rho, dm\n mol = gto.Mole()\n mol.verbose = 0\n mol.output = None\n@@ -206,7 +206,7 @@ def test_lyp(self):\n # e, v = dft.libxc.eval_xc('tpss,', (rho_a, rho_b), spin=1, deriv=1)[:2]\n \n def test_define_xc(self):\n- def eval_xc(xc_code, rho, spin=0, relativity=0, deriv=1, verbose=None):\n+ def eval_xc(xc_code, rho, spin=0, relativity=0, deriv=1, omega=None, verbose=None):\n # A fictitious XC functional to demonstrate the usage\n rho0, dx, dy, dz = rho[:4]\n gamma = (dx**2 + dy**2 + dz**2)\n@@ -229,6 +229,11 @@ def eval_xc(xc_code, rho, spin=0, relativity=0, deriv=1, verbose=None):\n self.assertAlmostEqual(lib.fp(vxc[0]), 0.0065565189784811129, 9)\n self.assertAlmostEqual(lib.fp(vxc[1]), 0.0049270110162854116, 9)\n \n+ n, exc, vxc = ni.nr_rks(mol, mf.grids, 'm06x', dm)\n+ self.assertAlmostEqual(n, 4, 5)\n+ self.assertAlmostEqual(lib.fp(exc), 0.01197588220700074, 6)\n+ self.assertAlmostEqual(lib.fp(vxc), -0.043974912389152986, 6)\n+\n mf = mf.define_xc_('0.5*B3LYP+0.5*B3LYP')\n exc0, vxc0 = mf._numint.eval_xc(None, rho, 0, deriv=1)[:2]\n exc1, vxc1 = dft.libxc.eval_xc('0.5*B3LYP+0.5*B3LYP', rho, 0, deriv=1)[:2]\n", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}145{"question_id": "MSB_pyscf_pyscf_pr2371", "question_type": "multi_swe_bench", "description": "Fix SGX initialization issue (pyscf/pyscf#2371)", "content": {"org": "pyscf", "repo": "pyscf", "pr_number": 2371, "issue_title": "Fix SGX initialization issue", "issue_body": " fix #2065", "base_commit": "df093594f27af8cebe546f08a38277f3e40bd63f", "resolved_issues": [{"number": 2065, "title": "SGX Fails When PJS=True", "body": "This is benzene, HF/def2-SVP - \r\n\r\n```\r\nimport pyscf\r\n\r\nxyz = \"\"\"C -0.71618036 2.71883299 0.00000000\r\nC 0.67897964 2.71883299 0.00000000\r\nC 1.37651764 3.92658399 0.00000000\r\nC 0.67886364 5.13509299 -0.00119900\r\nC -0.71596136 5.13501499 -0.00167800\r\nC -1.41356236 3.92680899 -0.00068200\r\nH -1.26593936 1.76651599 0.00045000\r\nH 1.22848764 1.76631999 0.00131500\r\nH 2.47619764 3.92666399 0.00063400\r\nH 1.22906364 6.08723599 -0.00125800\r\nH -1.26608336 6.08729599 -0.00263100\r\nH -2.51316636 3.92699199 -0.00086200\"\"\"\r\n\r\n\r\nmol = pyscf.M(\r\n atom=xyz,\r\n basis=\"def2-SVP\",\r\n charge=0,\r\n spin=0,\r\n symmetry=True\r\n)\r\n\r\nmf = pyscf.scf.HF(mol)\r\n\r\nmf = pyscf.sgx.sgx_fit(mf, pjs=True)\r\n\r\nenergy = mf.kernel()\r\n```\r\n\r\nAnd here's what I get:\r\n\r\n```\r\nTraceback (most recent call last):\r\n File \"/Users/cwagen/business_code/pyscf/sgx_fail.py\", line 32, in <module>\r\n energy = mf.kernel()\r\n ^^^^^^^^^^^\r\n File \"<string>\", line 2, in kernel\r\n File \"/opt/miniconda3/envs/aimnet2/lib/python3.11/site-packages/pyscf/scf/hf.py\", line 1713, in scf\r\n self.build(self.mol)\r\n File \"/opt/miniconda3/envs/aimnet2/lib/python3.11/site-packages/pyscf/sgx/sgx.py\", line 141, in build\r\n self.with_df.build(level=self.with_df.grids_level_i)\r\n File \"/opt/miniconda3/envs/aimnet2/lib/python3.11/site-packages/pyscf/sgx/sgx.py\", line 316, in build\r\n self._opt = _make_opt(self.mol, pjs=self.pjs)\r\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\r\n File \"/opt/miniconda3/envs/aimnet2/lib/python3.11/site-packages/pyscf/sgx/sgx.py\", line 239, in _make_opt\r\n vhfopt = _vhf.SGXOpt(mol, 'int1e_grids', 'SGXnr_ovlp_prescreen',\r\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\r\nTypeError: SGXOpt.__init__() got an unexpected keyword argument 'direct_scf_tol'\r\n```\r\n\r\nThis works fine when PJS = False. "}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/pyscf_m_pyscf:pr-2371", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/pyscf/scf/_vhf.py b/pyscf/scf/_vhf.py\nindex 7b51aa5921..313407a957 100644\n--- a/pyscf/scf/_vhf.py\n+++ b/pyscf/scf/_vhf.py\n@@ -79,10 +79,10 @@ def init_cvhf_direct(self, mol, intor, qcondname):\n \n @property\n def direct_scf_tol(self):\n- return self._this.contents.direct_scf_cutoff\n+ return self._this.contents.direct_scf_tol\n @direct_scf_tol.setter\n def direct_scf_tol(self, v):\n- self._this.contents.direct_scf_cutoff = v\n+ self._this.contents.direct_scf_tol = v\n \n @property\n def prescreen(self):\n@@ -162,7 +162,7 @@ def __init__(self, mol, intor=None, prescreen='CVHFnoscreen',\n self.mol = mol\n self._this = cvhfopt = _CVHFOpt()\n cvhfopt.nbas = mol.nbas\n- cvhfopt.direct_scf_cutoff = direct_scf_tol\n+ cvhfopt.direct_scf_tol = direct_scf_tol\n cvhfopt.fprescreen = _fpointer(prescreen)\n cvhfopt.r_vkscreen = _fpointer('CVHFr_vknoscreen')\n self._q_cond = None\n@@ -207,10 +207,10 @@ def init_cvhf_direct(self, mol, intor, qcondname):\n \n @property\n def direct_scf_tol(self):\n- return self._this.direct_scf_cutoff\n+ return self._this.direct_scf_tol\n @direct_scf_tol.setter\n def direct_scf_tol(self, v):\n- self._this.direct_scf_cutoff = v\n+ self._this.direct_scf_tol = v\n \n @property\n def prescreen(self):\n@@ -265,9 +265,9 @@ def dm_cond(self, dm_cond):\n \n class SGXOpt(_VHFOpt):\n def __init__(self, mol, intor=None, prescreen='CVHFnoscreen',\n- qcondname=None, dmcondname=None, direct_scf_cutoff=1e-14):\n+ qcondname=None, dmcondname=None, direct_scf_tol=1e-14):\n _VHFOpt.__init__(self, mol, intor, prescreen, qcondname, dmcondname,\n- direct_scf_cutoff)\n+ direct_scf_tol)\n self.ngrids = None\n \n def set_dm(self, dm, atm, bas, env):\n@@ -287,18 +287,22 @@ def set_dm(self, dm, atm, bas, env):\n if self._dmcondname != 'SGXnr_dm_cond':\n raise ValueError('SGXOpt only supports SGXnr_dm_cond')\n fdmcond = getattr(libcvhf, self._dmcondname)\n- dm_cond = numpy.empty((mol.nbas, self.ngrids))\n+ if self.ngrids is None:\n+ ngrids = int(env[gto.NGRIDS])\n+ else:\n+ ngrids = self.ngrids\n+ dm_cond = numpy.empty((mol.nbas, ngrids))\n fdmcond(dm_cond.ctypes, dm.ctypes, ctypes.c_int(n_dm),\n ao_loc.ctypes, mol._atm.ctypes, ctypes.c_int(mol.natm),\n mol._bas.ctypes, ctypes.c_int(mol.nbas), mol._env.ctypes,\n- ctypes.c_int(self.ngrids))\n+ ctypes.c_int(ngrids))\n self.dm_cond = dm_cond\n \n \n class _CVHFOpt(ctypes.Structure):\n _fields_ = [('nbas', ctypes.c_int),\n ('ngrids', ctypes.c_int),\n- ('direct_scf_cutoff', ctypes.c_double),\n+ ('direct_scf_tol', ctypes.c_double),\n ('q_cond', ctypes.c_void_p),\n ('dm_cond', ctypes.c_void_p),\n ('fprescreen', ctypes.c_void_p),\n"}, "test": {"test_patch": "diff --git a/pyscf/sgx/test/test_sgx.py b/pyscf/sgx/test/test_sgx.py\nindex bcf8fab256..b373fc2f19 100644\n--- a/pyscf/sgx/test/test_sgx.py\n+++ b/pyscf/sgx/test/test_sgx.py\n@@ -39,11 +39,28 @@ def test_sgx_scf(self):\n [1 , (0. , 0.757 , 0.587)] ],\n basis = 'ccpvdz',\n )\n- method = sgx.sgx_fit(scf.RHF(mol), 'weigend')\n- method.with_df.dfj = True\n- energy = method.scf()\n+ mf = sgx.sgx_fit(scf.RHF(mol), 'weigend')\n+ mf.with_df.dfj = True\n+ energy = mf.kernel()\n self.assertAlmostEqual(energy, -76.02686422219752, 9)\n \n+ mf = sgx.sgx_fit(scf.RHF(mol))\n+ energy = mf.kernel()\n+ self.assertAlmostEqual(energy, -76.02673747035047, 8)\n+\n+ def test_sgx_pjs(self):\n+ mol = gto.Mole()\n+ mol.build(\n+ atom = [[\"O\" , (0. , 0. , 0.)],\n+ [1 , (0. , -0.757 , 0.587)],\n+ [1 , (0. , 0.757 , 0.587)] ],\n+ basis = 'ccpvdz',\n+ )\n+ mf = sgx.sgx_fit(mol.RHF(), pjs=True)\n+ mf.with_df.dfj = True\n+ energy = mf.kernel()\n+ self.assertAlmostEqual(energy, -76.0267979, 6)\n+\n if __name__ == \"__main__\":\n print(\"Full Tests for SGX\")\n unittest.main()\n", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}146{"question_id": "MSB_pyscf_pyscf_pr2373", "question_type": "multi_swe_bench", "description": "Fix transition dipoles of triplet tddft states (pyscf/pyscf#2373)", "content": {"org": "pyscf", "repo": "pyscf", "pr_number": 2373, "issue_title": "Fix transition dipoles of triplet tddft states", "issue_body": "fix #2370", "base_commit": "df093594f27af8cebe546f08a38277f3e40bd63f", "resolved_issues": [{"number": 2370, "title": "TDDFT reports non-zero oscillator strengths for spin-forbidden transitions", "body": "TDDFT (w/ or w/o TDA) will report non-zero oscillator strengths for triplet excited states when the ground state is a singlet:\r\n\r\n```\r\nfrom pyscf import gto\r\n\r\nmol = gto.M(atom='''\r\n H 1.2194 -0.1652 2.1600\r\n C 0.6825 -0.0924 1.2087\r\n C -0.7075 -0.0352 1.1973\r\n H -1.2644 -0.0630 2.1393\r\n C -1.3898 0.0572 -0.0114\r\n H -2.4836 0.1021 -0.0204\r\n C -0.6824 0.0925 -1.2088\r\n H -1.2194 0.1652 -2.1599\r\n C 0.7075 0.0352 -1.1973\r\n H 1.2641 0.0628 -2.1395\r\n C 1.3899 -0.0572 0.0114\r\n H 2.4836 -0.1022 0.0205\r\n''',\r\n basis='sto-3g')\r\n\r\nmf = mol.RKS(xc='cam-b3lyp').run()\r\ntd = mf.TDA()\r\ntd.singlet = False\r\ntd.kernel()\r\ntd.analyze()\r\n```\r\n\r\nOutput:\r\n```\r\n** Triplet excitation energies and oscillator strengths **\r\nExcited State 1: 4.59810 eV 269.64 nm f=0.0000\r\nExcited State 2: 5.75758 eV 215.34 nm f=1.0200\r\nExcited State 3: 5.75772 eV 215.34 nm f=1.0198\r\n```"}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/pyscf_m_pyscf:pr-2373", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/pyscf/tdscf/rhf.py b/pyscf/tdscf/rhf.py\nindex b1b680b69f..d2cb63e086 100644\n--- a/pyscf/tdscf/rhf.py\n+++ b/pyscf/tdscf/rhf.py\n@@ -530,16 +530,20 @@ def _charge_center(mol):\n return numpy.einsum('z,zr->r', charges, coords)/charges.sum()\n \n def _contract_multipole(tdobj, ints, hermi=True, xy=None):\n+ '''ints is the integral tensor of a spin-independent operator'''\n if xy is None: xy = tdobj.xy\n+ nstates = len(xy)\n+ pol_shape = ints.shape[:-2]\n+ nao = ints.shape[-1]\n+\n+ if not tdobj.singlet:\n+ return numpy.zeros((nstates,) + pol_shape)\n+\n mo_coeff = tdobj._scf.mo_coeff\n mo_occ = tdobj._scf.mo_occ\n orbo = mo_coeff[:,mo_occ==2]\n orbv = mo_coeff[:,mo_occ==0]\n \n- nstates = len(xy)\n- pol_shape = ints.shape[:-2]\n- nao = ints.shape[-1]\n-\n #Incompatible to old numpy version\n #ints = numpy.einsum('...pq,pi,qj->...ij', ints, orbo.conj(), orbv)\n ints = lib.einsum('xpq,pi,qj->xij', ints.reshape(-1,nao,nao), orbo.conj(), orbv)\n"}, "test": {"test_patch": "diff --git a/pyscf/tdscf/test/test_tdrhf.py b/pyscf/tdscf/test/test_tdrhf.py\nindex 243d897bb2..b2b5ed6218 100644\n--- a/pyscf/tdscf/test/test_tdrhf.py\n+++ b/pyscf/tdscf/test/test_tdrhf.py\n@@ -15,6 +15,7 @@\n #\n \n import unittest\n+import numpy as np\n from pyscf import lib, gto, scf, tdscf\n \n def setUpModule():\n@@ -41,6 +42,8 @@ def test_tda_singlet(self):\n e = td.kernel()[0]\n ref = [11.90276464, 11.90276464, 16.86036434]\n self.assertAlmostEqual(abs(e[:len(ref)] * 27.2114 - ref).max(), 0, 5)\n+ dip = td.transition_dipole()\n+ self.assertAlmostEqual(lib.fp(np.linalg.norm(dip, axis=1)), -0.65616659, 5)\n \n def test_tda_triplet(self):\n td = mf.TDA().set(nstates=nstates)\n@@ -48,12 +51,16 @@ def test_tda_triplet(self):\n e = td.kernel()[0]\n ref = [11.01747918, 11.01747918, 13.16955056]\n self.assertAlmostEqual(abs(e[:len(ref)] * 27.2114 - ref).max(), 0, 5)\n+ dip = td.transition_dipole()\n+ self.assertAlmostEqual(abs(dip).max(), 0, 8)\n \n def test_tdhf_singlet(self):\n td = mf.TDHF().set(nstates=nstates)\n e = td.kernel()[0]\n ref = [11.83487199, 11.83487199, 16.66309285]\n self.assertAlmostEqual(abs(e[:len(ref)] * 27.2114 - ref).max(), 0, 5)\n+ dip = td.transition_dipole()\n+ self.assertAlmostEqual(lib.fp(np.linalg.norm(dip, axis=1)), -0.64009191, 5)\n \n def test_tdhf_triplet(self):\n td = mf.TDHF().set(nstates=nstates)\n@@ -61,6 +68,8 @@ def test_tdhf_triplet(self):\n e = td.kernel()[0]\n ref = [10.8919234, 10.8919234, 12.63440705]\n self.assertAlmostEqual(abs(e[:len(ref)] * 27.2114 - ref).max(), 0, 5)\n+ dip = td.transition_dipole()\n+ self.assertAlmostEqual(abs(dip).max(), 0, 8)\n \n \n if __name__ == \"__main__\":\n", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}147{"question_id": "MSB_pyscf_pyscf_pr2396", "question_type": "multi_swe_bench", "description": "Fix bug in GHF-X2C dipole function (pyscf/pyscf#2396)", "content": {"org": "pyscf", "repo": "pyscf", "pr_number": 2396, "issue_title": "Fix bug in GHF-X2C dipole function", "issue_body": "Fix #2393 ", "base_commit": "2231cece86787a599f72a856a93b6e94d51c8676", "resolved_issues": [{"number": 2393, "title": "ValueError in x2c dip_moment picture change with GHF and GKS", "body": "When I apply the .x2c() decoration method for a GHF or GKS object, calculating dipole moments always seems to raise the following:\r\n\"ValueError: could not broadcast input array from shape (3,6,6) into shape (3,2,2)\"\r\n\r\nHere is the input:\r\n`from pyscf import gto, scf, dft\r\n\r\nmol = gto.M(\r\n verbose = 0,\r\n atom='H 0 0 0',\r\n basis='STO-3G',\r\n spin = 1)\r\n\r\nmf = scf.GHF(mol).x2c()\r\n#mf = dft.GKS(mol).x2c()\r\nmf.kernel()\r\nmf.dip_moment()`\r\n\r\nAnd here is the full error message:\r\n`Traceback (most recent call last):\r\n File \"---/ghf_x2c_h_atom.py\", line 13, in <module>\r\n mf.dip_moment()\r\n File \"---/anaconda3/envs/Python/lib/python3.12/site-packages/pyscf/x2c/x2c.py\", line 785, in dip_moment\r\n ao_dip = self.with_x2c.picture_change((ao_dip, prp))\r\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\r\n File \"---/anaconda3/envs/Python/lib/python3.12/site-packages/pyscf/x2c/x2c.py\", line 338, in picture_change\r\n pc_mat = self._picture_change(xmol, even_operator, odd_operator)\r\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\r\n File \"---/anaconda3/envs/Python/lib/python3.12/site-packages/pyscf/x2c/x2c.py\", line 182, in _picture_change\r\n mat[:,nao:,nao:] = w_op\r\n ~~~^^^^^^^^^^^^^\r\nValueError: could not broadcast input array from shape (3,6,6) into shape (3,2,2)`\r\n"}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/pyscf_m_pyscf:pr-2396", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/pyscf/x2c/x2c.py b/pyscf/x2c/x2c.py\nindex 4bd83298d3..d1b0e34ed6 100644\n--- a/pyscf/x2c/x2c.py\n+++ b/pyscf/x2c/x2c.py\n@@ -774,17 +774,22 @@ def dip_moment(self, mol=None, dm=None, unit='Debye', verbose=logger.NOTE,\n charges = mol.atom_charges()\n coords = mol.atom_coords()\n nucl_dip = numpy.einsum('i,ix->x', charges, coords)\n- with mol.with_common_orig(nucl_dip):\n- r = mol.intor_symmetric('int1e_r')\n- ao_dip = numpy.array([_block_diag(x) for x in r])\n+ with mol.with_common_orig((0,0,0)):\n if picture_change:\n xmol = self.with_x2c.get_xmol()[0]\n nao = xmol.nao\n- prp = xmol.intor_symmetric('int1e_sprsp').reshape(3,4,nao,nao)[:,0]\n- prp = numpy.array([_block_diag(x) for x in prp])\n- ao_dip = self.with_x2c.picture_change((ao_dip, prp))\n+ r = xmol.intor_symmetric('int1e_r')\n+ r = numpy.array([_block_diag(x) for x in r])\n+ c1 = 0.5/lib.param.LIGHT_SPEED\n+ prp = xmol.intor_symmetric('int1e_sprsp').reshape(3,4,nao,nao)\n+ prp = numpy.array([_sigma_dot(x*c1**2) for x in prp])\n+ ao_dip = self.with_x2c.picture_change((r, prp))\n+ else:\n+ r = mol.intor_symmetric('int1e_r')\n+ ao_dip = numpy.array([_block_diag(x) for x in r])\n \n- mol_dip = -numpy.einsum('xij,ji->x', ao_dip, dm).real\n+ el_dip = numpy.einsum('xij,ji->x', ao_dip, dm).real\n+ mol_dip = nucl_dip - el_dip\n \n if unit.upper() == 'DEBYE':\n mol_dip *= nist.AU2DEBYE\n"}, "test": {"test_patch": "diff --git a/pyscf/x2c/test/test_x2c.py b/pyscf/x2c/test/test_x2c.py\nindex f1d963f88a..ddca2b3206 100644\n--- a/pyscf/x2c/test/test_x2c.py\n+++ b/pyscf/x2c/test/test_x2c.py\n@@ -215,6 +215,7 @@ def test_ghf(self):\n mf.kernel(dm0=dm)\n self.assertTrue(mf.converged)\n self.assertAlmostEqual(mf.e_tot, ref.e_tot, 9)\n+ self.assertAlmostEqual(abs(mf.dip_moment() - ref.dip_moment()).max(), 0, 9)\n \n def test_undo_x2c(self):\n mf = mol.RHF().x2c().density_fit()\n", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}148{"question_id": "MSB_pyscf_pyscf_pr2457", "question_type": "multi_swe_bench", "description": "Fixes calculating exchange integrals when only_dfj=True, issue #2456 (pyscf/pyscf#2457)", "content": {"org": "pyscf", "repo": "pyscf", "pr_number": 2457, "issue_title": "Fixes calculating exchange integrals when only_dfj=True, issue #2456", "issue_body": "This PR fixes an assertion error in the following minimal example:\r\n```\r\nfrom pyscf import gto, dft\r\n\r\nmol = gto.M(\r\n atom=\"\"\"\r\n O 0.00000000 0.00000000 0.00000000\r\n H -0.75390364 0.00000000 -0.58783729\r\n H 0.75390364 0.00000000 -0.58783729\r\n \"\"\"\r\n)\r\n\r\nmf = dft.RKS(mol).density_fit(only_dfj=True).run()\r\nvk = mf.get_k(mol=mol)\r\n```\r\n", "base_commit": "410d9608a73ad3a507b3008a6f68549288ebfc33", "resolved_issues": [{"number": 2456, "title": "Calculating exchange integrals fails when only_dfj=True", "body": "Hi everyone,\r\nthe following minimal example fails due to an assertion error:\r\n```\r\nfrom pyscf import gto, dft\r\n\r\nmol = gto.M(\r\n atom=\"\"\"\r\n O 0.00000000 0.00000000 0.00000000\r\n H -0.75390364 0.00000000 -0.58783729\r\n H 0.75390364 0.00000000 -0.58783729\r\n \"\"\"\r\n)\r\n\r\nmf = dft.RKS(mol).density_fit(only_dfj=True).run()\r\nvk = mf.get_k(mol=mol)\r\n```\r\nIt should still be possible to get the regular exchange integrals which are also returned for `get_jk` if `with_j=True` and `with_k=True`. The issue appears to be in the following function:\r\nhttps://github.com/pyscf/pyscf/blob/410d9608a73ad3a507b3008a6f68549288ebfc33/pyscf/df/df_jk.py#L133-L159\r\n\r\nI would propose the following solution:\r\n ```\r\n def get_jk(self, mol=None, dm=None, hermi=1, with_j=True, with_k=True,\r\n omega=None):\r\n assert (with_j or with_k)\r\n if dm is None: dm = self.make_rdm1()\r\n if not self.with_df:\r\n return super().get_jk(mol, dm, hermi, with_j, with_k, omega)\r\n\r\n with_dfk = with_k and not self.only_dfj\r\n if with_j:\r\n if isinstance(self, scf.ghf.GHF):\r\n def jkbuild(mol, dm, hermi, with_j, with_k, omega=None):\r\n vj, vk = self.with_df.get_jk(dm.real, hermi, with_j, with_k,\r\n self.direct_scf_tol, omega)\r\n if dm.dtype == numpy.complex128:\r\n vjI, vkI = self.with_df.get_jk(dm.imag, hermi, with_j, with_k,\r\n self.direct_scf_tol, omega)\r\n if with_j:\r\n vj = vj + vjI * 1j\r\n if with_k:\r\n vk = vk + vkI * 1j\r\n return vj, vk\r\n vj, vk = scf.ghf.get_jk(mol, dm, hermi, with_j, with_dfk,\r\n jkbuild, omega)\r\n else:\r\n vj, vk = self.with_df.get_jk(dm, hermi, with_j, with_dfk,\r\n self.direct_scf_tol, omega)\r\n else:\r\n vj = None\r\n if with_k and not with_dfk:\r\n vk = super().get_jk(mol, dm, hermi, False, True, omega)[1]\r\n return vj, vk\r\n```\r\nThis change would still require that either the Coulomb or the exchange matrix are requested while ensuring the regular exchange matrix is returned whenever the corresponding density-fitted integrals are not available. I can open a PR if this behavior/fix is desired."}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/pyscf_m_pyscf:pr-2457", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/pyscf/df/df_jk.py b/pyscf/df/df_jk.py\nindex 2ac82c243c..972b7e2033 100644\n--- a/pyscf/df/df_jk.py\n+++ b/pyscf/df/df_jk.py\n@@ -132,28 +132,31 @@ def reset(self, mol=None):\n \n def get_jk(self, mol=None, dm=None, hermi=1, with_j=True, with_k=True,\n omega=None):\n+ assert (with_j or with_k)\n if dm is None: dm = self.make_rdm1()\n if not self.with_df:\n return super().get_jk(mol, dm, hermi, with_j, with_k, omega)\n \n+ vj = vk = None\n with_dfk = with_k and not self.only_dfj\n- if isinstance(self, scf.ghf.GHF):\n- def jkbuild(mol, dm, hermi, with_j, with_k, omega=None):\n- vj, vk = self.with_df.get_jk(dm.real, hermi, with_j, with_k,\n- self.direct_scf_tol, omega)\n- if dm.dtype == numpy.complex128:\n- vjI, vkI = self.with_df.get_jk(dm.imag, hermi, with_j, with_k,\n- self.direct_scf_tol, omega)\n- if with_j:\n- vj = vj + vjI * 1j\n- if with_k:\n- vk = vk + vkI * 1j\n- return vj, vk\n- vj, vk = scf.ghf.get_jk(mol, dm, hermi, with_j, with_dfk,\n- jkbuild, omega)\n- else:\n- vj, vk = self.with_df.get_jk(dm, hermi, with_j, with_dfk,\n- self.direct_scf_tol, omega)\n+ if with_j or with_dfk:\n+ if isinstance(self, scf.ghf.GHF):\n+ def jkbuild(mol, dm, hermi, with_j, with_k, omega=None):\n+ vj, vk = self.with_df.get_jk(dm.real, hermi, with_j, with_k,\n+ self.direct_scf_tol, omega)\n+ if dm.dtype == numpy.complex128:\n+ vjI, vkI = self.with_df.get_jk(dm.imag, hermi, with_j, with_k,\n+ self.direct_scf_tol, omega)\n+ if with_j:\n+ vj = vj + vjI * 1j\n+ if with_k:\n+ vk = vk + vkI * 1j\n+ return vj, vk\n+ vj, vk = scf.ghf.get_jk(mol, dm, hermi, with_j, with_dfk,\n+ jkbuild, omega)\n+ else:\n+ vj, vk = self.with_df.get_jk(dm, hermi, with_j, with_dfk,\n+ self.direct_scf_tol, omega)\n if with_k and not with_dfk:\n vk = super().get_jk(mol, dm, hermi, False, True, omega)[1]\n return vj, vk\n"}, "test": {"test_patch": "diff --git a/pyscf/df/test/test_df.py b/pyscf/df/test/test_df.py\nindex 394d6d5a55..11b07b91be 100644\n--- a/pyscf/df/test/test_df.py\n+++ b/pyscf/df/test/test_df.py\n@@ -142,6 +142,44 @@ def test_rsh_df_custom_storage(self):\n mf.run()\n self.assertAlmostEqual(mf.e_tot, -103.4965622991, 6)\n \n+ def test_only_dfj(self):\n+ mol = gto.M(atom='H 0 0 0; H 0 0 1')\n+ dm = numpy.eye(mol.nao)\n+ mf = mol.RHF().density_fit()\n+ refj, refk = mf.get_jk(mol, dm)\n+ vk = mf.get_k(mol, dm)\n+ self.assertAlmostEqual(abs(vk - refk).max(), 0, 9)\n+ vj = mf.get_j(mol, dm)\n+ self.assertAlmostEqual(abs(vj - refj).max(), 0, 9)\n+\n+ mf = mol.RHF().density_fit(only_dfj=True)\n+ refk = mol.RHF().get_k(mol, dm)\n+ vj, vk = mf.get_jk(mol, dm)\n+ self.assertAlmostEqual(abs(vk - refk).max(), 0, 9)\n+ self.assertAlmostEqual(abs(vj - refj).max(), 0, 9)\n+ vk = mf.get_k(mol, dm)\n+ self.assertAlmostEqual(abs(vk - refk).max(), 0, 9)\n+ vj = mf.get_j(mol, dm)\n+ self.assertAlmostEqual(abs(vj - refj).max(), 0, 9)\n+\n+ dm = numpy.eye(mol.nao*2)\n+ mf = mol.GHF().density_fit()\n+ refj, refk = mf.get_jk(mol, dm)\n+ vk = mf.get_k(mol, dm)\n+ self.assertAlmostEqual(abs(vk - refk).max(), 0, 9)\n+ vj = mf.get_j(mol, dm)\n+ self.assertAlmostEqual(abs(vj - refj).max(), 0, 9)\n+\n+ mf = mol.GHF().density_fit(only_dfj=True)\n+ refk = mol.GHF().get_k(mol, dm)\n+ vj, vk = mf.get_jk(mol, dm)\n+ self.assertAlmostEqual(abs(vk - refk).max(), 0, 9)\n+ self.assertAlmostEqual(abs(vj - refj).max(), 0, 9)\n+ vk = mf.get_k(mol, dm)\n+ self.assertAlmostEqual(abs(vk - refk).max(), 0, 9)\n+ vj = mf.get_j(mol, dm)\n+ self.assertAlmostEqual(abs(vj - refj).max(), 0, 9)\n+\n if __name__ == \"__main__\":\n print(\"Full Tests for df\")\n unittest.main()\n", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}149{"question_id": "MSB_pyscf_pyscf_pr2499", "question_type": "multi_swe_bench", "description": "Fix biased implementation for the becke radi method (pyscf/pyscf#2499)", "content": {"org": "pyscf", "repo": "pyscf", "pr_number": 2499, "issue_title": "Fix biased implementation for the becke radi method", "issue_body": "This fixed the Becke radial integration scheme as described in #2490.", "base_commit": "66837470c1c87cd5878b83e5d0804be032ddd64a", "resolved_issues": [{"number": 2490, "title": "Becke radial integration scheme does not integrate numbers of electrons correctly", "body": "From the available radial integration schemes the Becke one seems to not create a proper integration grid as the number of electrons is overestimated:\r\n\r\n````python\r\nfrom pyscf import dft, gto\r\n\r\nmol = gto.M(atom=\"He\")\r\n\r\nfor radi_method in (\r\n dft.radi.becke,\r\n dft.radi.treutler_ahlrichs,\r\n dft.radi.delley,\r\n dft.radi.gauss_chebyshev,\r\n dft.radi.mura_knowles,\r\n):\r\n ks = dft.KS(mol)(xc=\"pbe\", grids=dft.Grids(mol)(radi_method=radi_method), verbose=0)\r\n ks.kernel()\r\n rho = ks._numint.get_rho(mol, ks.make_rdm1(), ks.grids)\r\n nel = (rho * ks.grids.weights).sum()\r\n print(radi_method.__name__, nel)\r\n````\r\n\r\nOutput:\r\n\r\n````\r\nbecke 2.188070936036473\r\ntreutler_ahlrichs 1.9999999979072856\r\ndelley 1.9999999990380877\r\ngauss_chebyshev 1.9999999994477295\r\nmura_knowles 1.9999999997029547\r\n````\r\n\r\ncc Thijs @tvogels, Derk @derkkooi"}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/pyscf_m_pyscf:pr-2499", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/pyscf/dft/radi.py b/pyscf/dft/radi.py\nindex 718aea118c..43bfb7b71d 100644\n--- a/pyscf/dft/radi.py\n+++ b/pyscf/dft/radi.py\n@@ -47,14 +47,21 @@\n def murray(n, *args, **kwargs):\n raise RuntimeError('Not implemented')\n \n-# Gauss-Chebyshev of the first kind, and the transformed interval [0,\\infty)\n def becke(n, charge, *args, **kwargs):\n '''Becke, JCP 88, 2547 (1988); DOI:10.1063/1.454033'''\n if charge == 1:\n rm = BRAGG_RADII[charge]\n else:\n rm = BRAGG_RADII[charge] * .5\n- t, w = numpy.polynomial.chebyshev.chebgauss(n)\n+\n+ # Points and weights for Gauss-Chebyshev quadrature points of the second kind\n+ # The weights are adjusted to integrate a function on the interval [-1, 1] with uniform weighting\n+ # instead of weighted by sqrt(1 - t^2) = sin(i pi / (n+1)).\n+ i = numpy.arange(n) + 1\n+ t = numpy.cos(i * numpy.pi / (n + 1))\n+ w = numpy.pi / (n + 1) * numpy.sin(i * numpy.pi / (n + 1))\n+\n+ # Change of variables to map the domain to [0, inf)\n r = (1+t)/(1-t) * rm\n w *= 2/(1-t)**2 * rm\n return r, w\n"}, "test": {"test_patch": "diff --git a/pyscf/dft/test/test_grids.py b/pyscf/dft/test/test_grids.py\nindex ba261f2f36..33dd9c02ec 100644\n--- a/pyscf/dft/test/test_grids.py\n+++ b/pyscf/dft/test/test_grids.py\n@@ -91,7 +91,7 @@ def test_radi(self):\n \n grid.radi_method = radi.becke\n grid.build(with_non0tab=False)\n- self.assertAlmostEqual(lib.fp(grid.weights), 818061.875131255, 7)\n+ self.assertAlmostEqual(lib.fp(grid.weights), 780.7183109298, 9)\n \n def test_prune(self):\n grid = gen_grid.Grids(h2o)\n", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}150{"question_id": "MSB_pyscf_pyscf_pr2524", "question_type": "multi_swe_bench", "description": "Fix iterative damping error (pyscf/pyscf#2524)", "content": {"org": "pyscf", "repo": "pyscf", "pr_number": 2524, "issue_title": "Fix iterative damping error", "issue_body": "Fixes #2523 ", "base_commit": "2c7f7625fd2719b8f3e9715e40c3937cab65c06e", "resolved_issues": [{"number": 2523, "title": "Iterative damping broken in UCCSD", "body": "Damping in unrestricted CCSD doesn't work. Note that RCCSD does not have this error.\r\n\r\n```\r\nfrom pyscf import gto, scf, cc\r\nmol = gto.M(\r\n atom = 'H 0 0 0; F 0 0 1.1', # in Angstrom\r\n basis = 'ccpvdz',\r\n symmetry = True,\r\n)\r\nmf = scf.HF(mol).run()\r\nmycc = cc.UCCSD(mf)\r\nmycc.iterative_damping = 0.5\r\nmycc.run()\r\nprint('CCSD total energy', mycc.e_tot)\r\n```\r\n```\r\nTypeError \r\nFile ~/.pyenv/versions/3.12.7/envs/main_env/lib/python3.12/site-packages/pyscf/cc/ccsd.py:80, in kernel(mycc, eris, t1, t2, max_cycle, tol, tolnormt, verbose, callback)\r\n 78 if mycc.iterative_damping < 1.0:\r\n 79 alpha = mycc.iterative_damping\r\n---> 80 t1new = (1-alpha) * t1 + alpha * t1new #t1new = (1-alpha) * numpy.asarray(t1) + alpha * numpy.asarray(t1new)\r\n 81 t2new *= alpha\r\n 82 t2new += (1-alpha) * t2\r\n\r\nTypeError: can't multiply sequence by non-int of type 'float'\r\n```\r\nThe solution is to modify lines 79-82 in ccsd.py to:\r\n```\r\n alpha = numpy.asarray(mycc.iterative_damping)\r\n t1new = (1-alpha) * numpy.asarray(t1) + alpha * numpy.asarray(t1new)\r\n t2new *= alpha\r\n t2new += (1-alpha) * numpy.asarray(t2)\r\n```"}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/pyscf_m_pyscf:pr-2524", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/pyscf/cc/ccsd.py b/pyscf/cc/ccsd.py\nindex 383b8a8969..59157a7481 100644\n--- a/pyscf/cc/ccsd.py\n+++ b/pyscf/cc/ccsd.py\n@@ -76,10 +76,16 @@ def kernel(mycc, eris=None, t1=None, t2=None, max_cycle=50, tol=1e-8,\n normt = numpy.linalg.norm(tmpvec)\n tmpvec = None\n if mycc.iterative_damping < 1.0:\n- alpha = mycc.iterative_damping\n- t1new = (1-alpha) * t1 + alpha * t1new\n- t2new *= alpha\n- t2new += (1-alpha) * t2\n+ alpha = numpy.asarray(mycc.iterative_damping)\n+ if isinstance(t1, tuple): # e.g. UCCSD\n+ t1new = tuple((1-alpha) * numpy.asarray(t1_part) + alpha * numpy.asarray(t1new_part)\n+ for t1_part, t1new_part in zip(t1, t1new))\n+ t2new = tuple((1-alpha) * numpy.asarray(t2_part) + alpha * numpy.asarray(t2new_part)\n+ for t2_part, t2new_part in zip(t2, t2new))\n+ else:\n+ t1new = (1-alpha) * numpy.asarray(t1) + alpha * numpy.asarray(t1new)\n+ t2new *= alpha\n+ t2new += (1-alpha) * numpy.asarray(t2)\n t1, t2 = t1new, t2new\n t1new = t2new = None\n t1, t2 = mycc.run_diis(t1, t2, istep, normt, eccsd-eold, adiis)\n"}, "test": {"test_patch": "diff --git a/pyscf/cc/test/test_uccsd.py b/pyscf/cc/test/test_uccsd.py\nindex a05f3bb4de..162ba47af2 100644\n--- a/pyscf/cc/test/test_uccsd.py\n+++ b/pyscf/cc/test/test_uccsd.py\n@@ -727,6 +727,20 @@ def test_ao2mo(self):\n self.assertAlmostEqual(abs(eri_incore.OVvo - eri_outcore.OVvo).max(), 0, 12)\n self.assertAlmostEqual(abs(eri_incore.OVvv - eri_outcore.OVvv).max(), 0, 12)\n \n+ def test_damping(self):\n+ mol = gto.M(\n+ atom = 'H 0 0 0; F 0 0 1.1', # in Angstrom\n+ basis = 'ccpvdz',\n+ spin=1,\n+ charge=-1,\n+ symmetry = True,\n+ verbose = 0\n+ )\n+ mf = scf.UHF(mol).run()\n+ mycc = cc.UCCSD(mf)\n+ mycc.iterative_damping = 0.5\n+ mycc.run()\n+ self.assertAlmostEqual(mycc.e_tot, -100.07710261186985, 7)\n \n if __name__ == \"__main__\":\n print(\"Full Tests for UCCSD\")\n", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}151{"question_id": "MSB_pyscf_pyscf_pr2531", "question_type": "multi_swe_bench", "description": "Fix CCSD two-particle density matrix for complex orbitals (pyscf/pyscf#2531)", "content": {"org": "pyscf", "repo": "pyscf", "pr_number": 2531, "issue_title": "Fix CCSD two-particle density matrix for complex orbitals", "issue_body": "* Fix #2519 \r\n* Improve the doc-strings for two-particle density matrix functions.", "base_commit": "14c3c54246412792ea65dbc968da6e487fb5b044", "resolved_issues": [{"number": 2519, "title": "Incorrect conjugation in 2RDM transformations", "body": "PySCF typically uses the following conventions for DMs\r\n```\r\ndm1[p, q] = <q* p>\r\ndm2[p, q, r, s] = <p* r* s q>\r\n```\r\n\r\nFrom Helgaker (3.2), when transforming operators under unitary $U$, the annihilation operator transforms under the conjugate $U^*$, and the creation operator transforms under $U$. This means that following the PySCF conventions, the 1RDM transforms as the Hamiltonian does i.e.\r\n```python\r\ndm1_ao = einsum(\"ij,pi,qj->pq\", dm1_mo, c, c.conj())\r\n```\r\nbut the 2RDM should transform as\r\n```python\r\ndm2_ao = einsum(\"ijkl,pi,qj,rk,sl->pqrs\", dm2_mo, c.conj(), c, c.conj(), c)\r\n```\r\nwhereas in PySCF the 2RDM is also assumed to transform as the Hamiltonian (the conjugations are reversed):\r\nhttps://github.com/pyscf/pyscf/blob/2c7f7625fd2719b8f3e9715e40c3937cab65c06e/pyscf/cc/ccsd_rdm.py#L379-L381\r\n\r\nThis can be verified by trying to recover correlated energies using the RDMs in the AO basis via `ao_repr=True`, which fails, but works with the reverse transformation. See the following script for an example:\r\nhttps://gist.github.com/obackhouse/855724a176c7f9cad580dc2d39e7c63d\r\nWe're aware in this case that the coefficients are not actually a unitary, but this is the best way I could find to show this as an issue in PySCF, and the issue seems to apply at least to the MO->AO transformation.\r\n\r\nI am happy to fix but wanted to check if we are missing something first?"}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/pyscf_m_pyscf:pr-2531", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/pyscf/cc/ccsd_rdm.py b/pyscf/cc/ccsd_rdm.py\nindex de1b38f2b4..9353dcf3fe 100644\n--- a/pyscf/cc/ccsd_rdm.py\n+++ b/pyscf/cc/ccsd_rdm.py\n@@ -377,8 +377,13 @@ def _make_rdm2(mycc, d1, d2, with_dm1=True, with_frozen=True, ao_repr=False):\n \n \n def _rdm2_mo2ao(dm2, mo):\n+ '''\n+ Back transform the two-particle density matrices to AO representation, where\n+ the dm2 is defined in accordance with the chemist's ERI notation:\n+ E = einsum('pqrs,pqrs', eri, rdm2)\n+ '''\n mo_C = mo.conj()\n- return lib.einsum('ijkl,pi,qj,rk,sl->pqrs', dm2, mo, mo_C, mo, mo_C)\n+ return lib.einsum('ijkl,pi,qj,rk,sl->pqrs', dm2, mo_C, mo, mo_C, mo)\n \n \n if __name__ == '__main__':\ndiff --git a/pyscf/cc/uccsd_rdm.py b/pyscf/cc/uccsd_rdm.py\nindex 7e096973f0..8c2bada6ee 100644\n--- a/pyscf/cc/uccsd_rdm.py\n+++ b/pyscf/cc/uccsd_rdm.py\n@@ -625,8 +625,8 @@ def _make_rdm2(mycc, d1, d2, with_dm1=True, with_frozen=True, ao_repr=False):\n \n \n def _dm2ab_mo2ao(dm2, mo_a, mo_b):\n- return lib.einsum('ijkl,pi,qj,rk,sl->pqrs', dm2, mo_a, mo_a.conj(),\n- mo_b, mo_b.conj())\n+ return lib.einsum('ijkl,pi,qj,rk,sl->pqrs', dm2, mo_a.conj(), mo_a,\n+ mo_b.conj(), mo_b)\n \n \n if __name__ == '__main__':\ndiff --git a/pyscf/scf/hf.py b/pyscf/scf/hf.py\nindex 645cfee1f4..c3f30d93eb 100644\n--- a/pyscf/scf/hf.py\n+++ b/pyscf/scf/hf.py\n@@ -853,6 +853,16 @@ def make_rdm1(mo_coeff, mo_occ, **kwargs):\n def make_rdm2(mo_coeff, mo_occ, **kwargs):\n '''Two-particle density matrix in AO representation\n \n+ NOTE the indices of the two-particle density matrix is ordered to\n+\n+ dm2[p,q,r,s] = <q^+ s^+ r p>.\n+\n+ HF energy can be computed\n+ E = einsum('pq,qp', hcore, 1pdm) + einsum('pqrs,pqrs', eri, 2pdm) / 2\n+ where h1[p,q] = <p|h|q> and eri[p,q,r,s] = (pq|rs)\n+to make the density matrix consistent with the density matrix obtained\n+ from post-HF methods,\n+\n Args:\n mo_coeff : 2D ndarray\n Orbital coefficients. Each column is one orbital.\ndiff --git a/pyscf/tdscf/_lr_eig.py b/pyscf/tdscf/_lr_eig.py\nindex 28beab7ffd..0eaa964bf5 100644\n--- a/pyscf/tdscf/_lr_eig.py\n+++ b/pyscf/tdscf/_lr_eig.py\n@@ -524,10 +524,7 @@ def real_eig(aop, x0, precond, tol_residual=1e-5, nroots=1, x0sym=None, pick=Non\n assert pick is None\n assert callable(precond)\n \n- if isinstance(verbose, logger.Logger):\n- log = verbose\n- else:\n- log = logger.Logger(sys.stdout, verbose)\n+ log = logger.new_logger(verbose)\n \n assert x0.ndim == 2\n A_size = x0.shape[1] // 2\n"}, "test": {"test_patch": "diff --git a/pyscf/cc/test/test_gccsd.py b/pyscf/cc/test/test_gccsd.py\nindex 393e8bbced..d0f5123642 100644\n--- a/pyscf/cc/test/test_gccsd.py\n+++ b/pyscf/cc/test/test_gccsd.py\n@@ -285,6 +285,7 @@ def test_rdm_complex(self):\n eri = eri + eri.transpose(1,0,3,2).conj()\n eri = eri + eri.transpose(2,3,0,1)\n eri *= .1\n+ mf._eri = eri\n \n def get_jk(mol, dm, *args,**kwargs):\n vj = numpy.einsum('ijkl,lk->ij', eri, dm)\n@@ -294,17 +295,19 @@ def get_veff(mol, dm, *args, **kwargs):\n vj, vk = get_jk(mol, dm)\n return vj - vk\n def ao2mofn(mos):\n- return eri\n+ c = mos\n+ return lib.einsum('pqrs,pi,qj,rk,sl->ijkl', eri, c.conj(), c, c.conj(), c)\n \n mf.get_jk = get_jk\n mf.get_veff = get_veff\n hcore = numpy.random.random((nmo,nmo)) * .2 + numpy.random.random((nmo,nmo))* .2j\n- hcore = hcore + hcore.T.conj() + numpy.diag(range(nmo))*2\n+ hcore = hcore + hcore.T.conj() + numpy.diag(numpy.arange(nmo)*2)\n mf.get_hcore = lambda *args: hcore\n mf.get_ovlp = lambda *args: numpy.eye(nmo)\n orbspin = numpy.zeros(nmo, dtype=int)\n orbspin[1::2] = 1\n- mf.mo_coeff = lib.tag_array(numpy.eye(nmo) + 0j, orbspin=orbspin)\n+ u = numpy.linalg.eigh(hcore)[1]\n+ mf.mo_coeff = lib.tag_array(u, orbspin=orbspin)\n mf.mo_occ = numpy.zeros(nmo)\n mf.mo_occ[:nocc] = 1\n \n@@ -313,8 +316,8 @@ def ao2mofn(mos):\n mycc.ao2mo = lambda *args, **kwargs: eris\n mycc.kernel(eris=eris)\n mycc.solve_lambda(eris=eris)\n- dm1 = mycc.make_rdm1()\n- dm2 = mycc.make_rdm2()\n+ dm1 = mycc.make_rdm1(ao_repr=True)\n+ dm2 = mycc.make_rdm2(ao_repr=True)\n \n e1 = numpy.einsum('ij,ji', hcore, dm1)\n e1+= numpy.einsum('ijkl,ijkl', eri, dm2) * .5\n", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}152{"question_id": "MSB_pyscf_pyscf_pr2574", "question_type": "multi_swe_bench", "description": "Bugs in libxc.define_xc_ (fix #2551) (pyscf/pyscf#2574)", "content": {"org": "pyscf", "repo": "pyscf", "pr_number": 2574, "issue_title": "Bugs in libxc.define_xc_ (fix #2551)", "issue_body": "Fix `dft.libxc.define_xc_` and update `examples/dft/24-define_xc_functional.py` (fix #2551)", "base_commit": "851ef84cf3d6f8b0cfbeacd78018ad816c38cf78", "resolved_issues": [{"number": 2551, "title": "pyscf/examples/dft/24-define_xc_functional.py is not working", "body": "I'm trying to run examples of pyscf, and I figured out that dft/24-define_xc_functional.py is not working\r\n\r\nBelow is my error message.\r\n\r\n```python\r\n---------------------------------------------------------------------------\r\nValueError Traceback (most recent call last)\r\nCell In[87], line 63\r\n 61 mf = mf.define_xc_(eval_xc, 'GGA', hyb=hybrid_coeff)\r\n 62 mf.verbose = 4\r\n---> 63 mf.kernel()\r\n\r\nFile <string>:2, in kernel(self, dm0, **kwargs)\r\n\r\nFile ~/miniconda3/lib/python3.11/site-packages/pyscf/scf/hf.py:1793, in SCF.scf(self, dm0, **kwargs)\r\n 1788 self.build(self.mol)\r\n 1790 if self.max_cycle > 0 or self.mo_coeff is None:\r\n 1791 self.converged, self.e_tot, \\\r\n 1792 self.mo_energy, self.mo_coeff, self.mo_occ = \\\r\n-> 1793 kernel(self, self.conv_tol, self.conv_tol_grad,\r\n 1794 dm0=dm0, callback=self.callback,\r\n 1795 conv_check=self.conv_check, **kwargs)\r\n 1796 else:\r\n 1797 # Avoid to update SCF orbitals in the non-SCF initialization\r\n 1798 # (issue #495). But run regular SCF for initial guess if SCF was\r\n 1799 # not initialized.\r\n 1800 self.e_tot = kernel(self, self.conv_tol, self.conv_tol_grad,\r\n 1801 dm0=dm0, callback=self.callback,\r\n 1802 conv_check=self.conv_check, **kwargs)[1]\r\n\r\nFile ~/miniconda3/lib/python3.11/site-packages/pyscf/scf/hf.py:126, in kernel(mf, conv_tol, conv_tol_grad, dump_chk, dm0, callback, conv_check, **kwargs)\r\n 123 dm = dm0\r\n 125 h1e = mf.get_hcore(mol)\r\n--> 126 vhf = mf.get_veff(mol, dm)\r\n 127 e_tot = mf.energy_tot(dm, h1e, vhf)\r\n 128 logger.info(mf, 'init E= %.15g', e_tot)\r\n\r\nFile ~/miniconda3/lib/python3.11/site-packages/pyscf/dft/rks.py:80, in get_veff(ks, mol, dm, dm_last, vhf_last, hermi)\r\n 78 else:\r\n 79 max_memory = ks.max_memory - lib.current_memory()[0]\r\n---> 80 n, exc, vxc = ni.nr_rks(mol, ks.grids, ks.xc, dm, max_memory=max_memory)\r\n 81 logger.debug(ks, 'nelec by numeric integration = %s', n)\r\n 82 if ks.do_nlc():\r\n\r\nFile ~/miniconda3/lib/python3.11/site-packages/pyscf/dft/numint.py:1158, in nr_rks(ni, mol, grids, xc_code, dms, relativity, hermi, max_memory, verbose)\r\n 1156 elif xctype == 'GGA':\r\n 1157 ao_deriv = 1\r\n-> 1158 for i, ao, mask, wv in block_loop(ao_deriv):\r\n 1159 wv[0] *= .5 # *.5 because vmat + vmat.T at the end\r\n 1160 aow = _scale_ao_sparse(ao[:4], wv[:4], mask, ao_loc, out=aow)\r\n\r\nFile ~/miniconda3/lib/python3.11/site-packages/pyscf/dft/numint.py:1138, in nr_rks.<locals>.block_loop(ao_deriv)\r\n 1136 for i in range(nset):\r\n 1137 rho = make_rho(i, ao, mask, xctype)\r\n-> 1138 exc, vxc = ni.eval_xc_eff(xc_code, rho, deriv=1, xctype=xctype)[:2]\r\n 1139 if xctype == 'LDA':\r\n 1140 den = rho * weight\r\n\r\nFile ~/miniconda3/lib/python3.11/site-packages/pyscf/dft/numint.py:2696, in LibXCMixin.eval_xc_eff(self, xc_code, rho, deriv, omega, xctype, verbose)\r\n 2693 else:\r\n 2694 spin = 0\r\n-> 2696 out = self.libxc.eval_xc1(xc_code, rho, spin, deriv, omega)\r\n 2697 evfk = [out[0]]\r\n 2698 for order in range(1, deriv+1):\r\n\r\nFile ~/miniconda3/lib/python3.11/site-packages/pyscf/dft/libxc.py:1610, in eval_xc1(xc_code, rho, spin, deriv, omega)\r\n 1606 def eval_xc1(xc_code, rho, spin=0, deriv=1, omega=None):\r\n 1607 '''Similar to eval_xc.\r\n 1608 Returns an array with the order of derivatives following xcfun convention.\r\n 1609 '''\r\n-> 1610 out = _eval_xc(xc_code, rho, spin, deriv=deriv, omega=omega)\r\n 1611 xctype = xc_type(xc_code)\r\n 1612 if deriv <= 1:\r\n\r\nFile ~/miniconda3/lib/python3.11/site-packages/pyscf/dft/libxc.py:1665, in _eval_xc(xc_code, rho, spin, deriv, omega)\r\n 1663 nvar, xlen = xc_deriv._XC_NVAR[xctype, spin]\r\n 1664 ngrids = rho.shape[-1]\r\n-> 1665 rho = rho.reshape(spin+1,nvar,ngrids)\r\n 1666 outlen = lib.comb(xlen+deriv, deriv)\r\n 1667 out = numpy.zeros((outlen,ngrids))\r\n\r\nValueError: cannot reshape array of size 120224 into shape (1,1,30056)\r\n``` \r\n\r\nAnd I also trying to run libxc.py's example of \"define_xc_\" [function](https://github.com/pyscf/pyscf/blob/c58968907adc96bc748591c9d72f1bc2c8ee66dc/pyscf/dft/libxc.py#L1123)\r\n\r\n```python\r\ndef eval_xc(xc_code, rho, *args, **kwargs):\r\n exc = 0.01 * rho**2\r\n vrho = 0.01 * 3 * rho**2\r\n vxc = (vrho, None, None, None)\r\n fxc = None # 2nd order functional derivative\r\n kxc = None # 3rd order functional derivative\r\n return exc, vxc, fxc, kxc\r\ndefine_xc_(mf._numint, eval_xc, xctype='LDA')\r\nmf.kernel()\r\n\r\n>>converged SCF energy = -75.8511902095329\r\n``` \r\n\r\nbut the code's results are same with 'SVWN' functional (default of pyscf).\r\n\r\n```python\r\nmf = dft.RKS(mol)\r\nmf.xc = 'SVWN'\r\nmf.kernel()\r\n\r\n>>converged SCF energy = -75.8511902095329\r\n``` \r\nI think there are some problems in running scf with self-made xc functional.\r\n\n\n### Minimal API referenced by tests (typed signatures)\n_Added only when tests call brand\u2011new symbols introduced by the fix; types reflect annotations present in the repo or `Unknown` if not annotated._\n\n- Function in `examples/dft/24-define_xc_functional.py`: `def eval_mgga_xc(xc_code, rho, spin, relativity, deriv, omega, verbose) -> numpy.ndarray: ...`\n **Inputs:** xc_code: str, rho: numpy.ndarray, spin: int, relativity: int, deriv: int, omega: float, verbose: bool\n **Output:** numpy.ndarray\n\n```python\ndef eval_mgga_xc(xc_code, rho, spin, relativity, deriv, omega, verbose) -> numpy.ndarray: ...\n```"}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/pyscf_m_pyscf:pr-2574", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/examples/dft/24-define_xc_functional.py b/examples/dft/24-define_xc_functional.py\nindex 72c7f25cfd..d5e2986f53 100644\n--- a/examples/dft/24-define_xc_functional.py\n+++ b/examples/dft/24-define_xc_functional.py\n@@ -12,6 +12,7 @@\n functionals provided by Libxc or XcFun library.\n '''\n \n+import numpy as np\n from pyscf import gto\n from pyscf import dft\n \n@@ -25,28 +26,19 @@\n # half-half exact exchange and GGA functional\n hybrid_coeff = 0.5\n \n-def eval_xc(xc_code, rho, spin=0, relativity=0, deriv=1, omega=None, verbose=None):\n+def eval_gga_xc(xc_code, rho, spin=0, relativity=0, deriv=1, omega=None, verbose=None):\n # A fictitious XC functional to demonstrate the usage\n- rho0, dx, dy, dz = rho[:4]\n+ rho0, dx, dy, dz = rho\n gamma = (dx**2 + dy**2 + dz**2)\n exc = .01 * rho0**2 + .02 * (gamma+.001)**.5\n vrho = .01 * 3 * rho0**2 + .02 * (gamma+.001)**.5\n vgamma = .02 * .5 * (gamma+.001)**(-.5)\n- vlapl = None\n- vtau = None\n- vxc = (vrho, vgamma, vlapl, vtau)\n+ vxc = (vrho, vgamma)\n v2rho2 = 0.01 * 6 * rho0\n- v2rhosigma = .02 * .5 * (gamma+.001)**(-.5)\n+ v2rhosigma = np.zeros(gamma.shape)\n v2sigma2 = 0.02 * .5 * -.5 * (gamma+.001)**(-1.5)\n- v2lapl2 = None\n- vtau2 = None\n- v2rholapl = None\n- v2rhotau = None\n- v2lapltau = None\n- v2sigmalapl = None\n- v2sigmatau = None\n # 2nd order functional derivative\n- fxc = (v2rho2, v2rhosigma, v2sigma2, v2lapl2, vtau2, v2rholapl, v2rhotau, v2lapltau, v2sigmalapl, v2sigmatau)\n+ fxc = (v2rho2, v2rhosigma, v2sigma2)\n kxc = None # 3rd order functional derivative\n \n # Mix with existing functionals\n@@ -58,15 +50,42 @@ def eval_xc(xc_code, rho, spin=0, relativity=0, deriv=1, omega=None, verbose=Non\n return exc, vxc, fxc, kxc\n \n mf = dft.RKS(mol)\n-mf = mf.define_xc_(eval_xc, 'GGA', hyb=hybrid_coeff)\n+mf = mf.define_xc_(eval_gga_xc, 'GGA', hyb=hybrid_coeff)\n mf.verbose = 4\n mf.kernel()\n \n+def eval_mgga_xc(xc_code, rho, spin=0, relativity=0, deriv=1, omega=None, verbose=None):\n+ # A fictitious XC functional to demonstrate the usage\n+ rho0, dx, dy, dz, tau = rho\n+ gamma = (dx**2 + dy**2 + dz**2)\n+ exc = .01 * rho0**2 + .02 * (gamma+.001)**.5 + 0.01 * tau**2\n+ vrho = .01 * 3 * rho0**2 + .02 * (gamma+.001)**.5\n+ vgamma = .02 * .5 * (gamma+.001)**(-.5)\n+ vtau = 0.02 * tau\n+ vxc = (vrho, vgamma, vtau)\n+ v2rho2 = 0.01 * 6 * rho0\n+ v2rhosigma = np.zeros(gamma.shape)\n+ v2sigma2 = 0.02 * .5 * -.5 * (gamma+.001)**(-1.5)\n+ v2tau2 = np.full(tau.shape, 0.02)\n+ v2rhotau = np.zeros(tau.shape)\n+ v2sigmatau = np.zeros(tau.shape)\n+ # 2nd order functional derivative\n+ fxc = (v2rho2, v2rhosigma, v2sigma2, v2tau2, v2rhotau, v2sigmatau)\n+ kxc = None # 3rd order functional derivative\n+\n+ # Mix with existing functionals\n+ pbe_xc = dft.libxc.eval_xc('pbe,pbe', rho[:4], spin, relativity, deriv, verbose)\n+ exc += pbe_xc[0] * 0.5\n+ vrho += pbe_xc[1][0] * 0.5\n+ vgamma += pbe_xc[1][1] * 0.5\n+ # The output follows the libxc.eval_xc API convention\n+ return exc, vxc, fxc, kxc\n+\n # half exact exchange in which 40% of the exchange is computed with short\n # range part of the range-separation Coulomb operator (omega = 0.8)\n beta = 0.2\n rsh_coeff = (0.8, hybrid_coeff-beta, beta)\n mf = dft.RKS(mol)\n-mf = mf.define_xc_(eval_xc, 'GGA', rsh=rsh_coeff)\n+mf = mf.define_xc_(eval_mgga_xc, 'MGGA', rsh=rsh_coeff)\n mf.verbose = 4\n mf.kernel()\ndiff --git a/pyscf/dft/libxc.py b/pyscf/dft/libxc.py\nindex 2d703479d3..4f67f3c652 100644\n--- a/pyscf/dft/libxc.py\n+++ b/pyscf/dft/libxc.py\n@@ -770,7 +770,7 @@ def eval_xc(xc_code, rho, spin=0, relativity=0, deriv=1, omega=None, verbose=Non\n | vtau[:,2] = (u, d)\n \n * fxc for restricted case:\n- (v2rho2, v2rhosigma, v2sigma2, v2lapl2, vtau2, v2rholapl, v2rhotau, v2lapltau, v2sigmalapl, v2sigmatau)\n+ (v2rho2, v2rhosigma, v2sigma2, v2lapl2, v2tau2, v2rholapl, v2rhotau, v2lapltau, v2sigmalapl, v2sigmatau)\n \n * fxc for unrestricted case:\n | v2rho2[:,3] = (u_u, u_d, d_d)\n@@ -1186,16 +1186,33 @@ def _eval_xc1(xc_code, rho, spin=0, deriv=1, omega=None):\n outlen = lib.comb(xlen+deriv, deriv)\n exc, vxc, fxc, kxc = libxc_out[:4]\n out = [exc]\n- if vxc is not None:\n+ if deriv > 0:\n+ assert vxc is not None\n out.extend([x for x in vxc if x is not None])\n- if fxc is not None:\n- out.extend([fxc[i] for i in [0, 1, 2, 6, 4, 9]])\n- if kxc is not None:\n+ if deriv > 1:\n+ assert fxc is not None\n+ if xctype == 'GGA':\n+ assert len(fxc) == 3, 'fxc for GGA should be arranged as (v2rho2, v2rhosigma, v2sigma2)'\n+ elif xctype == 'MGGA':\n+ if len(fxc) == 10:\n+ fxc = [fxc[i] for i in [0, 1, 2, 6, 4, 9]]\n+ else:\n+ assert len(fxc) == 6, (\n+ 'fxc for MGGA should be arranged as\\n'\n+ '(v2rho2, v2rhosigma, v2sigma2, v2tau2, v2rhotau, v2sigmatau)\\nor\\n'\n+ '(v2rho2, v2rhosigma, v2sigma2, v2lapl2, v2tau2, '\n+ 'v2rholapl, v2rhotau, v2lapltau, v2sigmalapl, v2sigmatau)')\n+ assert all(x is not None for x in fxc)\n+ out.extend(fxc)\n+ if deriv > 2:\n+ assert kxc is not None\n out.extend([x for x in kxc if x is not None])\n+\n if spin == 1:\n # Returns of eval_xc are structured as [grid_id,deriv_component]\n # for each term in libxc_out. Change the shape to [deriv_comp, grid_id]\n out = [x.T for x in out]\n+\n out = numpy.vstack(out)[:outlen]\n assert len(out) == outlen\n idx = _libxc_to_xcfun_indices(xctype, spin, deriv)\n"}, "test": {"test_patch": "diff --git a/pyscf/dft/test/test_libxc.py b/pyscf/dft/test/test_libxc.py\nindex 6dc223789d..04b28d4ded 100644\n--- a/pyscf/dft/test/test_libxc.py\n+++ b/pyscf/dft/test/test_libxc.py\n@@ -218,7 +218,7 @@ def test_lyp(self):\n # rho_b = numpy.array([[4.53272893e-06, 4.18968775e-06,-2.83034672e-06, 2.61832978e-06, 5.63360737e-06, 8.97541777e-07]]).T\n # e, v = dft.libxc.eval_xc('tpss,', (rho_a, rho_b), spin=1, deriv=1)[:2]\n \n- def test_define_xc(self):\n+ def test_define_xc_gga(self):\n def eval_xc(xc_code, rho, spin=0, relativity=0, deriv=1, omega=None, verbose=None):\n # A fictitious XC functional to demonstrate the usage\n rho0, dx, dy, dz = rho[:4]\n@@ -242,11 +242,19 @@ def eval_xc(xc_code, rho, spin=0, relativity=0, deriv=1, omega=None, verbose=Non\n self.assertAlmostEqual(lib.fp(vxc[0]), 0.0065565189784811129, 9)\n self.assertAlmostEqual(lib.fp(vxc[1]), 0.0049270110162854116, 9)\n \n+ with self.assertRaises(AssertionError):\n+ ni.eval_xc_eff(None, rho, deriv=2)\n+\n+ # Ensure the xc_code in the input has no impact to the result.\n n, exc, vxc = ni.nr_rks(mol, mf.grids, 'm06x', dm)\n self.assertAlmostEqual(n, 4, 5)\n self.assertAlmostEqual(lib.fp(exc), 0.01197588220700074, 6)\n self.assertAlmostEqual(lib.fp(vxc), -0.043974912389152986, 6)\n \n+ ni = dft.libxc.define_xc(ni, eval_xc, 'MGGA')\n+ with self.assertRaises(AssertionError):\n+ ni.eval_xc_eff(None, rho, deriv=1)\n+\n mf = mf.define_xc_('0.5*B3LYP+0.5*B3LYP')\n exc0, vxc0 = mf._numint.eval_xc(None, rho, 0, deriv=1)[:2]\n exc1, vxc1 = dft.libxc.eval_xc('0.5*B3LYP+0.5*B3LYP', rho, 0, deriv=1)[:2]\n@@ -263,6 +271,33 @@ def eval_xc(xc_code, rho, spin=0, relativity=0, deriv=1, omega=None, verbose=Non\n self.assertAlmostEqual(abs(vxc0[0]-vxc1[0]).max(), 0, 9)\n self.assertAlmostEqual(abs(vxc0[1]-vxc1[1]).max(), 0, 9)\n \n+ def test_define_xc_mgga(self):\n+ def eval_mgga_xc(xc_code, rho, spin=0, relativity=0, deriv=1, omega=None, verbose=None):\n+ # A fictitious XC functional to demonstrate the usage\n+ rho0, dx, dy, dz, tau = rho\n+ gamma = (dx**2 + dy**2 + dz**2)\n+ exc = .01 * rho0**2 + .02 * (gamma+.001)**.5 + .01 * tau**2\n+ vrho = .01 * 2 * rho0\n+ vgamma = .02 * .5 * (gamma+.001)**(-.5)\n+ vtau = .02 * tau\n+ vxc = (vrho, vgamma, vtau)\n+ zeros = numpy.zeros_like(rho0)\n+ fxc = (zeros, zeros, zeros)\n+ kxc = None # 3rd order functional derivative\n+ return exc, vxc, fxc, kxc\n+\n+ mf = dft.RKS(mol)\n+ ni = dft.libxc.define_xc(mf._numint, eval_mgga_xc, 'MGGA')\n+ numpy.random.seed(1)\n+ rho = numpy.random.random((5,10))\n+ exc, vxc = ni.eval_xc(None, rho, 0, deriv=1)[:2]\n+ self.assertAlmostEqual(lib.fp(exc), 0.016353861820705, 9)\n+ self.assertAlmostEqual(lib.fp(vxc[0]), 0.0065565189784811129, 9)\n+ self.assertAlmostEqual(lib.fp(vxc[1]), 0.0049270110162854116, 9)\n+\n+ with self.assertRaises(AssertionError):\n+ ni.eval_xc_eff(None, rho, deriv=2)\n+\n def test_m05x(self):\n rho =(numpy.array([1., 1., 0., 0., 0., 0.165 ]).reshape(-1,1),\n numpy.array([.8, 1., 0., 0., 0., 0.1050]).reshape(-1,1))\n", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}153{"question_id": "MSB_pyscf_pyscf_pr2577", "question_type": "multi_swe_bench", "description": "Fix GTH-PP integrals (fix #2575) (pyscf/pyscf#2577)", "content": {"org": "pyscf", "repo": "pyscf", "pr_number": 2577, "issue_title": "Fix GTH-PP integrals (fix #2575)", "issue_body": null, "base_commit": "14c3c54246412792ea65dbc968da6e487fb5b044", "resolved_issues": [{"number": 2575, "title": "Possible bug in GTH PP", "body": "MWE\r\n```\r\nfrom pyscf.pbc import gto\r\nimport numpy as np\r\n\r\ncell= gto.Cell(atom='''Cu .0 .0 .0''',\r\n a=np.array([[0.5, 0.5, 0], [0, 0.5, 0.5], [0.5, 0, 0.5]])* 3.0,\r\n basis='gth-dzvp-molopt-sr',\r\n pseudo='gth-pbe-q11',\r\n verbose=4\r\n ).build()\r\nkpts = cell.make_kpts([2,2,2])\r\nmf = cell.KRKS(xc='pbe0', kpts=kpts).density_fit()\r\nmf.max_cycle=2\r\nmf.run()\r\n```\r\ntraceback\r\n```\r\n File \"/share/home/srwang/pbc/gthpp.py\", line 15, in <module>\r\n mf.run()\r\n File \"/share/home/srwang/pyscf2/pyscf/lib/misc.py\", line 638, in run\r\n self.kernel(*args)\r\n File \"<string>\", line 2, in kernel\r\n File \"/share/home/srwang/pyscf2/pyscf/scf/hf.py\", line 2000, in scf\r\n kernel(self, self.conv_tol, self.conv_tol_grad,\r\n File \"/share/home/srwang/pyscf2/pyscf/scf/hf.py\", line 128, in kernel\r\n h1e = mf.get_hcore(mol)\r\n File \"/share/home/srwang/pyscf2/pyscf/pbc/scf/khf.py\", line 77, in get_hcore\r\n nuc = lib.asarray(mf.with_df.get_pp(kpts))\r\n File \"/share/home/srwang/pyscf2/pyscf/pbc/df/df.py\", line 393, in get_pp\r\n vpp = dfbuilder.get_pp()\r\n File \"/share/home/srwang/pyscf2/pyscf/pbc/df/rsdf_builder.py\", line 1031, in get_pp\r\n vpp += pp2builder.get_pp_loc_part2()\r\nValueError: operands could not be broadcast together with shapes (8,25,25) (8,) (8,25,25)\r\n```"}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/pyscf_m_pyscf:pr-2577", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/pyscf/pbc/df/aft.py b/pyscf/pbc/df/aft.py\nindex 1440cc7f63..87a1d323a3 100644\n--- a/pyscf/pbc/df/aft.py\n+++ b/pyscf/pbc/df/aft.py\n@@ -329,7 +329,8 @@ def get_pp_loc_part2(self):\n else:\n lib.logger.warn(cell, 'cell.pseudo was specified but its elements %s '\n 'were not found in the system.', cell._pseudo.keys())\n- vpploc = [0] * nkpts\n+ nao = cell.nao\n+ vpploc = np.zeros((nkpts, nao, nao))\n return vpploc\n \n rcut = self._estimate_rcut_3c1e(rs_cell, fake_cells)\ndiff --git a/pyscf/tdscf/_lr_eig.py b/pyscf/tdscf/_lr_eig.py\nindex 28beab7ffd..0eaa964bf5 100644\n--- a/pyscf/tdscf/_lr_eig.py\n+++ b/pyscf/tdscf/_lr_eig.py\n@@ -524,10 +524,7 @@ def real_eig(aop, x0, precond, tol_residual=1e-5, nroots=1, x0sym=None, pick=Non\n assert pick is None\n assert callable(precond)\n \n- if isinstance(verbose, logger.Logger):\n- log = verbose\n- else:\n- log = logger.Logger(sys.stdout, verbose)\n+ log = logger.new_logger(verbose)\n \n assert x0.ndim == 2\n A_size = x0.shape[1] // 2\n"}, "test": {"test_patch": "diff --git a/pyscf/pbc/df/test/test_aft.py b/pyscf/pbc/df/test/test_aft.py\nindex f637883643..c3cfc14e7d 100644\n--- a/pyscf/pbc/df/test/test_aft.py\n+++ b/pyscf/pbc/df/test/test_aft.py\n@@ -352,6 +352,20 @@ def test_aft_get_pp(self):\n self.assertAlmostEqual(abs(v0 - v3).max(), 0, 8)\n self.assertAlmostEqual(lib.fp(v0) - (-5.7070290795125445-0.00038722541238732697j), 0, 8)\n \n+ # issue 2575\n+ def test_aft_get_pp1(self):\n+ cell = pgto.M(atom='Cu .0 .0 .0', a=np.eye(3)*3, spin=1,\n+ basis=[[1, [1, 1]]], pseudo='''Cu\n+1 0 10\n+0.53 0\n+1\n+0.26 1 1.8''')\n+ kpts = cell.make_kpts([2,1,1])\n+ ref = fft.FFTDF(cell, kpts).get_pp()\n+ v = aft.AFTDF(cell, kpts).get_pp()\n+ self.assertAlmostEqual(abs(v - ref).max(), 0, 8)\n+ self.assertAlmostEqual(lib.fp(v), 0.37494551685809624, 8)\n+\n def test_aft_get_nuc(self):\n v0 = fft.FFTDF(cell, kpts[0]).get_nuc()\n v1 = aft.AFTDF(cell, kpts[0]).get_nuc()\n", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}154{"question_id": "MSB_pyscf_pyscf_pr2611", "question_type": "multi_swe_bench", "description": "Fix dimension bug in spinor X2C code (pyscf/pyscf#2611)", "content": {"org": "pyscf", "repo": "pyscf", "pr_number": 2611, "issue_title": "Fix dimension bug in spinor X2C code", "issue_body": "Fix #2605 ", "base_commit": "2a0f5614251f46a3cd65b8c91399de314fec4be0", "resolved_issues": [{"number": 2605, "title": "spin-orbit contracted basis set", "body": "In PySCF's basis set internal format, the kappa value can be used to treat spin-orbit contracted basis set.\r\n\r\n> kappa can have value \r\n> (corresponding to spinors with \r\n> ), \r\n> (corresponding to spinors with \r\n> ) or 0. When kappa is 0, both types of spinors are assumed in the basis. \r\n\r\n```\r\n[[angular, kappa, [[exp, c_1, c_2, ..],\r\n [exp, c_1, c_2, ..],\r\n ... ]],\r\n [angular, kappa, [[exp, c_1, c_2, ..],\r\n [exp, c_1, c_2, ..]\r\n ... ]]]\r\n```\r\nThere is a possible bug in treating contracted basis set with contraction coefficients for different kappa. The following example with a fake basis set of this kind.\r\n```\r\nfrom pyscf import gto\r\nfrom pyscf import scf\r\n\r\nmol = gto.M(atom='''\r\nO 0 0 0\r\nH 0 1 1\r\nH 0 -1 -1''',\r\n basis={\r\n 'O':\r\n [[\r\n 0, [61420.0, 9e-05, -2e-05], [9199.0, 0.000698, -0.000159],\r\n [2091.0, 0.003664, -0.000829],\r\n [590.9, 0.015218, -0.003508], [192.3, 0.052423, -0.012156],\r\n [69.32, 0.145921, -0.036261], [26.97, 0.305258, -0.082992],\r\n [11.1, 0.398508, -0.15209], [4.682, 0.21698, -0.115331]\r\n ], [0, [0.5547, 1.0]],\r\n [1, -2, [63.42, 0.006044], [14.66, 0.041799], [4.459, 0.1611]],\r\n [1, 1, [34.46, 0.015928], [7.749, 0.09974], [2.28, 0.31049]],\r\n [1, 1, [1.531, 1.0]], [1, 0, [0.5302, 1.0]]],\r\n 'H':\r\n '631g'\r\n })\r\nprint(mol._basis)\r\nprint(mol.nao_nr())\r\nprint(mol.nao_2c())\r\nmf = scf.X2C(mol)\r\nmf.kernel()\r\n```\r\nThe calculation won't run through."}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/pyscf_m_pyscf:pr-2611", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/examples/x2c/01-x2c1e.py b/examples/x2c/01-x2c1e.py\nnew file mode 100644\nindex 0000000000..a2f9061c27\n--- /dev/null\n+++ b/examples/x2c/01-x2c1e.py\n@@ -0,0 +1,40 @@\n+#!/usr/bin/env python\n+#\n+# Author: Qiming Sun <osirpt.sun@gmail.com>\n+#\n+\n+'''\n+Constructing the X matrix using one-electron approximation. This is the default\n+configuration of the X2C module.\n+'''\n+\n+import pyscf\n+from pyscf.x2c import UHF as X2C_UHF\n+from pyscf.x2c import dft as x2c_dft\n+\n+mol = pyscf.M(\n+ verbose = 0,\n+ atom = [[\"O\" , (0. , 0. , 0.)],\n+ [1 , (0. , -0.757 , 0.587)],\n+ [1 , (0. , 0.757 , 0.587)] ],\n+ basis = 'ccpvdz-dk',\n+)\n+\n+method = mol.RHF()\n+enr = method.kernel()\n+print('E(NR) = %.12g' % enr)\n+\n+method = X2C_UHF(mol)\n+ex2c = method.kernel()\n+print('E(X2C1E-UHF) = %.12g' % ex2c)\n+\n+# Customizing basis sets for X matrix\n+method.with_x2c.basis = {'O': 'unc-ccpvqz', 'H':'unc-ccpvdz'}\n+print('E(X2C1E-UHF) = %.12g' % method.kernel())\n+\n+# Constructing X matrix using single center approximation\n+method.with_x2c.approx = 'atom1e'\n+print('E(X2C1E-UHF) = %.12g' % method.kernel())\n+\n+method = x2c_dft.UKS(mol).run()\n+print('E(X2C1E-UKS) = %.12g' % method.e_tot)\ndiff --git a/pyscf/hessian/uks.py b/pyscf/hessian/uks.py\nindex 74bdb85bac..dfb4592edc 100644\n--- a/pyscf/hessian/uks.py\n+++ b/pyscf/hessian/uks.py\n@@ -41,7 +41,7 @@ def partial_hess_elec(hessobj, mo_energy=None, mo_coeff=None, mo_occ=None,\n mf = hessobj.base\n ni = mf._numint\n if mf.do_nlc():\n- raise NotImplementedError('RKS Hessian for NLC functional')\n+ raise NotImplementedError('UKS Hessian for NLC functional')\n \n if mo_energy is None: mo_energy = mf.mo_energy\n if mo_occ is None: mo_occ = mf.mo_occ\ndiff --git a/pyscf/x2c/x2c.py b/pyscf/x2c/x2c.py\nindex d1b0e34ed6..1754f3cd7c 100644\n--- a/pyscf/x2c/x2c.py\n+++ b/pyscf/x2c/x2c.py\n@@ -61,7 +61,10 @@ def get_xmol(self, mol=None):\n xmol.build(False, False, basis=self.basis)\n return xmol, None\n elif self.xuncontract:\n- xmol, contr_coeff = _uncontract_mol(mol, self.xuncontract)\n+ if all(mol._bas[:,mole.KAPPA_OF] == 0):\n+ xmol, contr_coeff = _uncontract_mol(mol, self.xuncontract)\n+ else:\n+ xmol, contr_coeff = _decontract_spinor(mol, self.xuncontract)\n return xmol, contr_coeff\n else:\n return mol, None\n@@ -113,9 +116,13 @@ def get_hcore(self, mol=None):\n h1 = reduce(numpy.dot, (c.T.conj(), h1, c))\n elif self.xuncontract:\n np, nc = contr_coeff_nr.shape\n- contr_coeff = numpy.zeros((np*2,nc*2))\n- contr_coeff[0::2,0::2] = contr_coeff_nr\n- contr_coeff[1::2,1::2] = contr_coeff_nr\n+ if np == h1.shape[0]:\n+ # spinor adapted contraction matrix generated by _decontract_spinor\n+ contr_coeff = contr_coeff_nr\n+ else:\n+ contr_coeff = numpy.zeros((np*2,nc*2))\n+ contr_coeff[0::2,0::2] = contr_coeff_nr\n+ contr_coeff[1::2,1::2] = contr_coeff_nr\n h1 = reduce(numpy.dot, (contr_coeff.T.conj(), h1, contr_coeff))\n return h1\n \n@@ -986,30 +993,89 @@ def _sigma_dot(mat):\n nao = mat.shape[-1] * 2\n return lib.einsum('sxy,spq->xpyq', quaternion, mat).reshape(nao, nao)\n \n-\n-if __name__ == '__main__':\n- from pyscf.x2c import dft\n- mol = mole.Mole()\n- mol.build(\n- verbose = 0,\n- atom = [[\"O\" , (0. , 0. , 0.)],\n- [1 , (0. , -0.757 , 0.587)],\n- [1 , (0. , 0.757 , 0.587)] ],\n- basis = 'ccpvdz-dk',\n- )\n-\n- method = hf.RHF(mol)\n- enr = method.kernel()\n- print('E(NR) = %.12g' % enr)\n-\n- method = UHF(mol)\n- ex2c = method.kernel()\n- print('E(X2C1E) = %.12g' % ex2c)\n- method.with_x2c.basis = {'O': 'unc-ccpvqz', 'H':'unc-ccpvdz'}\n- print('E(X2C1E) = %.12g' % method.kernel())\n- method.with_x2c.approx = 'atom1e'\n- print('E(X2C1E) = %.12g' % method.kernel())\n-\n- method = dft.UKS(mol)\n- ex2c = method.kernel()\n- print('E(X2C1E) = %.12g' % ex2c)\n+def _decontract_spinor(mol, atoms=None):\n+ pmol = mol.copy(deep=False)\n+\n+ # Some input basis may be segmented basis from a general contracted set.\n+ # This may lead to duplicated pGTOs. First contract all basis to remove\n+ # duplicated primitive functions.\n+ bas_exps = mol.bas_exps()\n+ _bas = []\n+ env = [mol._env.copy()]\n+ contr_coeff = []\n+ pexp = env[0].size\n+ ao_loc = mol.ao_loc_2c()\n+\n+ aoslices = mol.aoslice_by_atom()\n+ for ia, (ib0, ib1) in enumerate(aoslices[:,:2]):\n+ if ib0 == ib1: # No basis on atom ia\n+ continue\n+\n+ if atoms is not None:\n+ if isinstance(atoms, str):\n+ to_apply = ((atoms == mol.atom_pure_symbol(ia)) or\n+ (atoms == mol.atom_symbol(ia)))\n+ elif isinstance(atoms, (tuple, list)):\n+ to_apply = ((mol.atom_pure_symbol(ia) in atoms) or\n+ (mol.atom_symbol(ia) in atoms) or\n+ (ia in atoms))\n+ else:\n+ to_apply = True\n+ if not to_apply:\n+ _bas.append(mol._bas[ib0:ib1])\n+ contr_coeff.append(numpy.eye(ao_loc[ib1] - ao_loc[ib0]))\n+ continue\n+\n+ lmax = mol._bas[ib0:ib1,mole.ANG_OF].max()\n+ for l in range(lmax+1):\n+ bas_idx = ib0 + numpy.where(mol._bas[ib0:ib1,mole.ANG_OF] == l)[0]\n+ if len(bas_idx) == 0:\n+ continue\n+ if bas_idx[0] + len(bas_idx) != bas_idx[-1] + 1:\n+ raise NotImplementedError('Discontinuous bases of same angular momentum')\n+\n+ es = numpy.hstack([bas_exps[i] for i in bas_idx])\n+ _, e_idx, rev_idx = numpy.unique(es.round(9), True, True)\n+ cs = scipy.linalg.block_diag(\n+ *[mol._libcint_ctr_coeff(i) for i in bas_idx])\n+ nprim = len(e_idx)\n+ if len(es) != nprim:\n+ cs_new = numpy.zeros((nprim, cs.shape[1]))\n+ for i, j in enumerate(rev_idx):\n+ cs_new[j] += cs[i]\n+ es = es[e_idx][::-1]\n+ cs = cs_new[::-1]\n+\n+ bs = numpy.zeros((nprim, mole.BAS_SLOTS), dtype=numpy.int32)\n+ bs[:,mole.ATOM_OF] = ia\n+ bs[:,mole.ANG_OF ] = l\n+ bs[:,mole.NCTR_OF] = bs[:,mole.NPRIM_OF] = 1\n+ bs[:,mole.PTR_EXP] = pexp + numpy.arange(nprim)\n+ bs[:,mole.PTR_COEFF] = pexp + numpy.arange(nprim, nprim*2)\n+ norm = mole.gto_norm(l, es)\n+ env.append(es)\n+ env.append(norm)\n+ pexp += nprim * 2\n+ _bas.append(bs)\n+\n+ degen = 4 * l + 2\n+ c = numpy.einsum('pi,p,xm->pxim', cs, 1./norm, numpy.eye(degen))\n+ c = c.reshape(nprim*degen, -1)\n+ full_idx = numpy.arange(c.shape[1]).reshape(-1, degen)\n+ spinor_idx = []\n+ p0 = p1 = 0\n+ for ib in bas_idx:\n+ p0, p1 = p1, p1 + mol.bas_nctr(ib)\n+ kappa = mol.bas_kappa(ib)\n+ if kappa == 0:\n+ spinor_idx.append(full_idx[p0:p1].ravel())\n+ elif kappa > 0:\n+ spinor_idx.append(full_idx[p0:p1,:l*2].ravel())\n+ else:\n+ spinor_idx.append(full_idx[p0:p1,l*2:].ravel())\n+ contr_coeff.append(c[:,numpy.hstack(spinor_idx)])\n+\n+ pmol._bas = numpy.asarray(numpy.vstack(_bas), dtype=numpy.int32)\n+ pmol._env = numpy.hstack(env)\n+ contr_coeff = scipy.linalg.block_diag(*contr_coeff)\n+ return pmol, contr_coeff\n"}, "test": {"test_patch": "diff --git a/pyscf/x2c/test/test_x2c.py b/pyscf/x2c/test/test_x2c.py\nindex ddca2b3206..8776d2029c 100644\n--- a/pyscf/x2c/test/test_x2c.py\n+++ b/pyscf/x2c/test/test_x2c.py\n@@ -228,6 +228,23 @@ def test_undo_x2c(self):\n mf = mf.undo_x2c()\n self.assertEqual(mf.__class__.__name__, 'DFGHF')\n \n+ # issue 2605\n+ def test_kappa_spinor(self):\n+ mol = gto.M(\n+ atom='''He 0. 0.7 .1\n+ He 0.5 -0.2 -.1''',\n+ basis=[[0, [0.5547, 1.]],\n+ [1, [11., 0.94, .31], [4.68, 0.22, .80]],\n+ [1, -2, [1.9, 1.]],\n+ [1, 1, [1.53, 1.]],\n+ [1, 0, [0.53, 1.]]],\n+ )\n+ pmol, c = x2c.SpinorX2CHelper(mol).get_xmol()\n+ self.assertEqual(c.shape, (pmol.nao_2c(), mol.nao_2c()))\n+ ref = mol.intor('int1e_ovlp_spinor')\n+ dat = c.T.dot(pmol.intor('int1e_ovlp_spinor')).dot(c)\n+ self.assertAlmostEqual(abs(ref - dat).max(), 0, 12)\n+\n \n if __name__ == \"__main__\":\n print(\"Full Tests for x2c\")\n", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}155{"question_id": "MSB_pyscf_pyscf_pr2676", "question_type": "multi_swe_bench", "description": "Complex density matrices for DFHF (pyscf/pyscf#2676)", "content": {"org": "pyscf", "repo": "pyscf", "pr_number": 2676, "issue_title": "Complex density matrices for DFHF", "issue_body": "fix #2670", "base_commit": "ccedc56f9b48a024b5727efbdd7f261c4e6194fc", "resolved_issues": [{"number": 2670, "title": "[UNEXPECTED BEHAVIOR] Density-fitting complex RHF does not give correct energy", "body": "I notice a significant energy difference when testing df complex RHF. Here is my code\n```\nfrom pyscf import gto, scf\nimport numpy as np\nmol = gto.Mole()\ndista = 1.5\nmol.atom = [['Be',(0.0, 0.0, 0.0)], ['H',(dista, 1.344-0.46*dista, 0.0)],['H',(dista, -1.344+0.46*dista, 0.0)]]\nmol.spin = 0\nmol.basis = 'cc-pvdz'\nmol.build()\nrrhf = scf.RHF(mol)\n\n# real RHF\nrrhf = scf.RHF(mol)\nrrhf.kernel()\n\n# cmplx RHF\ncrhf = scf.RHF(mol)\ndm = rrhf.make_rdm1() + 0j\ndm[0,:] += .1j\ndm[:,0] -= .1j\ncrhf.kernel(dm)\n\n# DF RHF\ndfrhf = scf.RHF(mol).density_fit()\ndfrhf.mo_coeff = rrhf.mo_coeff\ndfrhf.mo_occ = rrhf.mo_occ\nprint(\"E(dfrrhf)=\", dfrhf.energy_tot())\n\ndfrhf.mo_coeff = crhf.mo_coeff\ndfrhf.mo_occ = crhf.mo_occ\nprint(\"E(dfchf)=\", dfrhf.energy_tot())\n```\nMy output shows\n```\nE(rrhf) = -15.5335928065009\nE(crhf) = -15.5335928064977\nE(dfrhf) = -15.533610777908848\nE(dfchf) = -14.751606976368922\n```\nThe energies match for real orbitals but differ a lot for complex orbitals."}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/pyscf_m_pyscf:pr-2676", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/pyscf/df/df_jk.py b/pyscf/df/df_jk.py\nindex 9e5670537f..222eaceb53 100644\n--- a/pyscf/df/df_jk.py\n+++ b/pyscf/df/df_jk.py\n@@ -258,6 +258,33 @@ def get_jk(dfobj, dm, hermi=0, with_j=True, with_k=True, direct_scf_tol=1e-13):\n vj = 0\n vk = numpy.zeros_like(dms)\n \n+ if numpy.iscomplexobj(dms):\n+ if with_j:\n+ vj = numpy.zeros_like(dms)\n+ max_memory = dfobj.max_memory - lib.current_memory()[0]\n+ blksize = max(4, int(min(dfobj.blockdim, max_memory*.22e6/8/nao**2)))\n+ buf = numpy.empty((blksize,nao,nao))\n+ buf1 = numpy.empty((nao,blksize,nao))\n+ for eri1 in dfobj.loop(blksize):\n+ naux, nao_pair = eri1.shape\n+ eri1 = lib.unpack_tril(eri1, out=buf)\n+ if with_j:\n+ tmp = numpy.einsum('pij,nji->pn', eri1, dms.real)\n+ vj.real += numpy.einsum('pn,pij->nij', tmp, eri1)\n+ tmp = numpy.einsum('pij,nji->pn', eri1, dms.imag)\n+ vj.imag += numpy.einsum('pn,pij->nij', tmp, eri1)\n+ buf2 = numpy.ndarray((nao,naux,nao), buffer=buf1)\n+ for k in range(nset):\n+ buf2[:] = lib.einsum('pij,jk->ipk', eri1, dms[k].real)\n+ vk[k].real += lib.einsum('ipk,pkj->ij', buf2, eri1)\n+ buf2[:] = lib.einsum('pij,jk->ipk', eri1, dms[k].imag)\n+ vk[k].imag += lib.einsum('ipk,pkj->ij', buf2, eri1)\n+ t1 = log.timer_debug1('jk', *t1)\n+ if with_j: vj = vj.reshape(dm_shape)\n+ if with_k: vk = vk.reshape(dm_shape)\n+ logger.timer(dfobj, 'df vj and vk', *t0)\n+ return vj, vk\n+\n if with_j:\n idx = numpy.arange(nao)\n dmtril = lib.pack_tril(dms + dms.conj().transpose(0,2,1))\n@@ -322,6 +349,7 @@ def get_jk(dfobj, dm, hermi=0, with_j=True, with_k=True, direct_scf_tol=1e-13):\n buf = numpy.empty((2,blksize,nao,nao))\n for eri1 in dfobj.loop(blksize):\n naux, nao_pair = eri1.shape\n+ assert (nao_pair == nao*(nao+1)//2)\n if with_j:\n # uses numpy.matmul\n vj += dmtril.dot(eri1.T).dot(eri1)\n@@ -388,6 +416,7 @@ def get_j(dfobj, dm, hermi=0, direct_scf_tol=1e-13):\n opt = dfobj._vjopt\n fakemol = opt.fakemol\n dm = numpy.asarray(dm, order='C')\n+ assert dm.dtype == numpy.float64\n dm_shape = dm.shape\n nao = dm_shape[-1]\n dm = dm.reshape(-1,nao,nao)\n"}, "test": {"test_patch": "diff --git a/pyscf/df/test/test_df_jk.py b/pyscf/df/test/test_df_jk.py\nindex e418a70204..d426430ae3 100644\n--- a/pyscf/df/test/test_df_jk.py\n+++ b/pyscf/df/test/test_df_jk.py\n@@ -194,6 +194,18 @@ def test_get_j(self):\n self.assertAlmostEqual(abs(vj0-vj1).max(), 0, 12)\n self.assertAlmostEqual(lib.fp(vj0), -194.15910890730052, 9)\n \n+ def test_df_jk_complex_dm(self):\n+ mol = gto.M(atom='H 0 0 0; H 0 0 1')\n+ mf = mol.RHF().run()\n+ dm = mf.make_rdm1() + 0j\n+ dm[0,:] += .1j\n+ dm[:,0] -= .1j\n+ mf.kernel(dm)\n+ self.assertTrue(mf.mo_coeff.dtype == numpy.complex128)\n+ dfmf = mf.density_fit()\n+ self.assertAlmostEqual(dfmf.energy_tot(), -1.0661355663696201, 9)\n+ self.assertAlmostEqual(dfmf.energy_tot(), mf.e_tot, 3)\n+\n \n if __name__ == \"__main__\":\n print(\"Full Tests for df\")\n", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}156{"question_id": "MSB_pyscf_pyscf_pr2797", "question_type": "multi_swe_bench", "description": "When building RSH K integrals, cderi is overwritten (fix #2790) (pyscf/pyscf#2797)", "content": {"org": "pyscf", "repo": "pyscf", "pr_number": 2797, "issue_title": "When building RSH K integrals, cderi is overwritten (fix #2790)", "issue_body": "Causing a KeyError when reading cderi file", "base_commit": "befb2fed666ba5c4f074923c66a48ab81854dc65", "resolved_issues": [{"number": 2790, "title": "[BUG REPORT] RSH density fitting fails with j3c-lr KeyError", "body": "This example using the range-separated hybrid functional HSE06 fails when trying to read from the `j3c-lr` density fitting object:\n```\nimport numpy as np\nfrom pyscf.pbc import gto, dft, df\n\nprint(df.df.LONGRANGE_AFT_TURNOVER_THRESHOLD)\n\ncell = gto.M(\n\ta = np.array([[0.000, 2.715, 2.715],\n\t\t\t[2.715, 0.000, 2.715],\n\t\t\t[2.715, 2.715, 0.000]]),\n\tatom = '''Si 0.0000 0.0000 0.0000\n\t\t\tSi 1.3575 1.3575 1.3575''',\n\tbasis = 'cc-pvdz',\n)\n\nkpts = cell.make_kpts([2,2,2])\n\nkmf = dft.KRKS(cell, kpts, xc='HYB_GGA_XC_HSE06').density_fit()\nkmf.kernel()\n```\n\nError:\n```\nTraceback (most recent call last):\n File \"/gpfs/home/mhott/examples_pyscf/pbc/hse_bug.py\", line 23, in <module>\n kmf.kernel()\n File \"<string>\", line 2, in kernel\n File \"/gpfs/home/mhott/.venv/lib/python3.9/site-packages/pyscf/scf/hf.py\", line 2016, in scf\n kernel(self, self.conv_tol, self.conv_tol_grad,\n File \"/gpfs/home/mhott/.venv/lib/python3.9/site-packages/pyscf/scf/hf.py\", line 129, in kernel\n vhf = mf.get_veff(mol, dm)\n File \"/gpfs/home/mhott/.venv/lib/python3.9/site-packages/pyscf/pbc/dft/krks.py\", line 119, in get_veff\n vk = ks.get_k(cell, dm, hermi, kpts, kpts_band, omega=-omega)\n File \"/gpfs/home/mhott/.venv/lib/python3.9/site-packages/pyscf/pbc/scf/khf.py\", line 576, in get_k\n return self.get_jk(cell, dm_kpts, hermi, kpts, kpts_band,\n File \"/gpfs/home/mhott/.venv/lib/python3.9/site-packages/pyscf/pbc/scf/khf.py\", line 589, in get_jk\n vj, vk = self.with_df.get_jk(dm_kpts, hermi, kpts, kpts_band,\n File \"/gpfs/home/mhott/.venv/lib/python3.9/site-packages/pyscf/pbc/df/df.py\", line 438, in get_jk\n return rsh_df.get_jk(dm, hermi, kpts, kpts_band, with_j, with_k,\n File \"/gpfs/home/mhott/.venv/lib/python3.9/site-packages/pyscf/pbc/df/df.py\", line 448, in get_jk\n vk = df_jk.get_k_kpts(self, dm, hermi, kpts, kpts_band, exxdiv)\n File \"/gpfs/home/mhott/.venv/lib/python3.9/site-packages/pyscf/pbc/df/df_jk.py\", line 611, in get_k_kpts\n make_kpt(ki, kj, True)\n File \"/gpfs/home/mhott/.venv/lib/python3.9/site-packages/pyscf/pbc/df/df_jk.py\", line 444, in make_kpt\n for LpqR, LpqI, sign in mydf.sr_loop((kpti,kptj), max_memory, False):\n File \"/gpfs/home/mhott/.venv/lib/python3.9/site-packages/pyscf/pbc/df/df.py\", line 360, in sr_loop\n with _load3c(self._cderi, self._dataname, kpti_kptj) as j3c:\n File \"/gpfs/home/mhott/.venv/lib/python3.9/site-packages/pyscf/pbc/df/df.py\", line 699, in __enter__\n return self.getitem(*self.kpti_kptj)\n File \"/gpfs/home/mhott/.venv/lib/python3.9/site-packages/pyscf/pbc/df/df.py\", line 753, in getitem\n raise KeyError(f'Key {key} not found')\nKeyError: 'Key j3c-lr/-0.110000/8 not found'\n```\nThe index of the k-point it's trying to reference is always the size of the k-grid (2x2x2 = 8 in this case, for 4x4x4 is 64, etc.) which is not included in the list of kpt_ij_idx, which for the 2x2x2 k-grid is `kpt_ij_idx = [ 0 9 18 27 36 45 54 63]`. I noticed that in every case, the index N_k+1 was included in this list (2x2x2 + 1 = 9, 4x4x4 + 1 = 65, etc.), but I'm not sure if this is relevant since I'm not entirely sure how these indices are generated. \n\nAs discussed in this issue: [1193](https://github.com/pyscf/pyscf/issues/1193), I have set `LONGRANGE_AFT_TURNOVER_THRESHOLD=0.0` in `pyscf.df.df` to prevent it from switching to AFTDF which requires many TB of memory.\n\npyscf version: 2.8.0, 2.9.0\ninstall type: pip install\noperating system: Rocky Linux 9.4\n"}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/pyscf_m_pyscf:pr-2797", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/pyscf/pbc/df/aft.py b/pyscf/pbc/df/aft.py\nindex 53124621b5..e21c478ef0 100644\n--- a/pyscf/pbc/df/aft.py\n+++ b/pyscf/pbc/df/aft.py\n@@ -536,8 +536,6 @@ def range_coulomb(self, omega):\n rsh_df = self._rsh_df[key]\n else:\n rsh_df = self._rsh_df[key] = self.copy().reset()\n- if hasattr(self, '_dataname'):\n- rsh_df._dataname = f'{self._dataname}-lr/{key}'\n logger.info(self, 'Create RSH-DF object %s for omega=%s', rsh_df, omega)\n \n cell = self.cell\ndiff --git a/pyscf/pbc/df/df.py b/pyscf/pbc/df/df.py\nindex 3e3f1456c7..d6cbdae319 100644\n--- a/pyscf/pbc/df/df.py\n+++ b/pyscf/pbc/df/df.py\n@@ -60,8 +60,6 @@\n from pyscf.pbc.df.rsdf_builder import _RSGDFBuilder, _RSNucBuilder, LINEAR_DEP_THR\n from pyscf import __config__\n \n-LONGRANGE_AFT_TURNOVER_THRESHOLD = 2.5\n-\n \n def make_modrho_basis(cell, auxbasis=None, drop_eta=None):\n r'''Generate a cell object using the density fitting auxbasis as\n@@ -259,6 +257,7 @@ def build(self, j_only=None, with_j3c=True, kpts_band=None):\n if self._cderi == cderi and os.path.isfile(cderi):\n logger.warn(self, 'File %s (specified by ._cderi) is '\n 'overwritten by GDF initialization.', cderi)\n+ os.remove(cderi)\n else:\n logger.warn(self, 'Value of ._cderi is ignored. '\n 'DF integrals will be saved in file %s .', cderi)\n@@ -416,18 +415,16 @@ def get_nuc(self, kpts=None):\n # post-HF methods.\n def get_jk(self, dm, hermi=1, kpts=None, kpts_band=None,\n with_j=True, with_k=True, omega=None, exxdiv=None):\n- if omega is not None: # J/K for RSH functionals\n+ if omega is not None and omega != 0: # J/K for RSH functionals\n cell = self.cell\n # * AFT is computationally more efficient than GDF if the Coulomb\n # attenuation tends to the long-range role (i.e. small omega).\n # * Note: changing to AFT integrator may cause small difference to\n- # the GDF integrator. If a very strict GDF result is desired,\n- # we can disable this trick by setting\n- # LONGRANGE_AFT_TURNOVER_THRESHOLD to 0.\n+ # the GDF integrator.\n # * The sparse mesh is not appropriate for low dimensional systems\n # with infinity vacuum since the ERI may require large mesh to\n # sample density in vacuum.\n- if (abs(omega) < LONGRANGE_AFT_TURNOVER_THRESHOLD and\n+ if (omega > 0 and\n cell.dimension >= 2 and cell.low_dim_ft_type != 'inf_vacuum'):\n mydf = aft.AFTDF(cell, self.kpts)\n ke_cutoff = aft.estimate_ke_cutoff_for_omega(cell, omega)\n@@ -471,6 +468,43 @@ def prange(self, start, stop, step):\n '''\n return lib.prange(start, stop, step)\n \n+ @contextlib.contextmanager\n+ def range_coulomb(self, omega):\n+ '''Creates a temporary density fitting object for RSH-DF integrals.\n+ In this context, only LR or SR integrals for mol and auxmol are computed.\n+ '''\n+ cell = self.cell\n+ if cell.dimension != 0:\n+ assert omega < 0\n+\n+ key = '%.6f' % omega\n+ if key in self._rsh_df:\n+ rsh_df = self._rsh_df[key]\n+ else:\n+ rsh_df = self._rsh_df[key] = self.copy().reset()\n+ rsh_df._dataname = f'{self._dataname}-sr/{key}'\n+ logger.info(self, 'Create RSH-DF object %s for omega=%s', rsh_df, omega)\n+\n+ auxcell = getattr(self, 'auxcell', None)\n+\n+ cell_omega = cell.omega\n+ cell.omega = omega\n+ auxcell_omega = None\n+ if auxcell is not None:\n+ auxcell_omega = auxcell.omega\n+ auxcell.omega = omega\n+\n+ assert rsh_df.cell.omega == omega\n+ if getattr(rsh_df, 'auxcell', None) is not None:\n+ assert rsh_df.auxcell.omega == omega\n+\n+ try:\n+ yield rsh_df\n+ finally:\n+ cell.omega = cell_omega\n+ if auxcell_omega is not None:\n+ auxcell.omega = auxcell_omega\n+\n ################################################################################\n # With this function to mimic the molecular DF.loop function, the pbc gamma\n # point DF object can be used in the molecular code\ndiff --git a/pyscf/pbc/df/df_jk.py b/pyscf/pbc/df/df_jk.py\nindex 88da4d703e..b6f51d1dcb 100644\n--- a/pyscf/pbc/df/df_jk.py\n+++ b/pyscf/pbc/df/df_jk.py\n@@ -280,8 +280,12 @@ def get_k_kpts(mydf, dm_kpts, hermi=1, kpts=numpy.zeros((1,3)), kpts_band=None,\n log.warn('DF integrals for band k-points were not found %s. '\n 'DF integrals will be rebuilt to include band k-points.',\n mydf._cderi)\n- mydf.build(kpts_band=kpts_band)\n+ mydf.build(j_only=False, kpts_band=kpts_band)\n t0 = log.timer_debug1('Init get_k_kpts', *t0)\n+ elif mydf._j_only:\n+ log.warn('DF integrals for HF exchange were not initialized. '\n+ 'df.j_only cannot be used with hybrid functional. DF integrals will be rebuilt.')\n+ mydf.build(j_only=False, kpts_band=kpts_band)\n \n mo_coeff = getattr(dm_kpts, 'mo_coeff', None)\n if mo_coeff is not None:\ndiff --git a/pyscf/pbc/df/mdf.py b/pyscf/pbc/df/mdf.py\nindex 15fd9d8b36..da497232fb 100644\n--- a/pyscf/pbc/df/mdf.py\n+++ b/pyscf/pbc/df/mdf.py\n@@ -153,14 +153,12 @@ def get_jk(self, dm, hermi=1, kpts=None, kpts_band=None,\n # * AFT is computationally more efficient than MDF if the Coulomb\n # attenuation tends to the long-range role (i.e. small omega).\n # * Note: changing to AFT integrator may cause small difference to\n- # the MDF integrator. If a very strict MDF result is desired,\n- # we can disable this trick by setting\n- # LONGRANGE_AFT_TURNOVER_THRESHOLD to 0.\n+ # the MDF integrator.\n # * The sparse mesh is not appropriate for low dimensional systems\n # with infinity vacuum since the ERI may require large mesh to\n # sample density in vacuum.\n- if (omega < df.LONGRANGE_AFT_TURNOVER_THRESHOLD and\n- cell.dimension >= 2 and cell.low_dim_ft_type != 'inf_vacuum'):\n+ if (omega > 0 and\n+ (cell.dimension >= 2 or cell.low_dim_ft_type != 'inf_vacuum')):\n mydf = aft.AFTDF(cell, self.kpts)\n ke_cutoff = aft.estimate_ke_cutoff_for_omega(cell, omega)\n mydf.mesh = cell.cutoff_to_mesh(ke_cutoff)\ndiff --git a/pyscf/pbc/df/rsdf.py b/pyscf/pbc/df/rsdf.py\nindex a11c79a073..a9e7b13100 100644\n--- a/pyscf/pbc/df/rsdf.py\n+++ b/pyscf/pbc/df/rsdf.py\n@@ -561,6 +561,20 @@ def make_j3c(self, cderi_file, intor='int3c2e', aosym='s2', comp=None,\n ijlst_mapping[kpti_idx * nkpts + kptj_idx] = np.arange(len(kptij_lst))\n kk_idx = kpti_idx * nkpts + kptj_idx\n \n+ # TODO: Store rs_density_fit cderi tensor in v1 format for the moment.\n+ # It should be changed to 'v2' format in the future.\n+ data_version = 'v1'\n+ if h5py.is_hdf5(cderi_file):\n+ feri = lib.H5FileWrap(cderi_file, 'a')\n+ if 'kpts' in feri:\n+ del feri['j3c-kptij']\n+ if dataname in feri:\n+ log.warn(f'Overwritting {dataname} in {cderi_file}.')\n+ del feri[dataname]\n+ else:\n+ feri = lib.H5FileWrap(cderi_file, 'w')\n+ feri['j3c-kptij'] = kptij_lst\n+\n fswap = self.outcore_auxe2(cderi_file, intor, aosym, comp,\n kptij_lst, j_only, 'j3c-junk', shls_slice)\n cpu1 = log.timer_debug1('3c2e', *cpu1)\n@@ -577,16 +591,6 @@ def make_j3c(self, cderi_file, intor='int3c2e', aosym='s2', comp=None,\n # Add (1) short-range G=0 (i.e., charge) part and (2) long-range part\n tspans = np.zeros((3,2)) # lr, j2c_inv, j2c_cntr\n tspannames = [\"ftaop+pw\", \"j2c_inv\", \"j2c_cntr\"]\n- feri = lib.H5FileWrap(cderi_file, 'w')\n-\n- # TODO: Store rs_density_fit cderi tensor in v1 format for the moment.\n- # It should be changed to 'v2' format in the future.\n- data_version = 'v1'\n- if data_version == 'v1':\n- feri['j3c-kptij'] = kptij_lst\n- else:\n- feri['kpts'] = kpts\n- ijlst_mapping = None\n def make_cderi(kpt, kpt_ij_idx, j2c):\n log.debug1('make_cderi for %s', kpt)\n kptjs = kpts[kpt_ij_idx % nkpts]\ndiff --git a/pyscf/pbc/df/rsdf_builder.py b/pyscf/pbc/df/rsdf_builder.py\nindex 29c3a839b2..10a0a98667 100644\n--- a/pyscf/pbc/df/rsdf_builder.py\n+++ b/pyscf/pbc/df/rsdf_builder.py\n@@ -924,14 +924,23 @@ def make_j3c(self, cderi_file, intor='int3c2e', aosym='s2', comp=None,\n else:\n kk_idx = None\n \n+ if h5py.is_hdf5(cderi_file):\n+ feri = lib.H5FileWrap(cderi_file, 'a')\n+ if 'kpts' in feri:\n+ del feri['kpts']\n+ del feri['aosym']\n+ if dataname in feri:\n+ log.warn(f'Overwritting {dataname} in {cderi_file}.')\n+ del feri[dataname]\n+ else:\n+ feri = lib.H5FileWrap(cderi_file, 'w')\n+ feri['kpts'] = kpts\n+ feri['aosym'] = aosym\n+\n fswap = self.outcore_auxe2(cderi_file, intor, aosym, comp, j_only,\n 'j3c', shls_slice, kk_idx=kk_idx)\n cpu1 = log.timer('pass1: real space int3c2e', *cpu0)\n \n- feri = lib.H5FileWrap(cderi_file, 'w')\n- feri['kpts'] = kpts\n- feri['aosym'] = aosym\n-\n if aosym == 's2':\n nao_pair = nao*(nao+1)//2\n else:\ndiff --git a/pyscf/pbc/dft/krks.py b/pyscf/pbc/dft/krks.py\nindex 5c4387c5c3..0705df56b5 100644\n--- a/pyscf/pbc/dft/krks.py\n+++ b/pyscf/pbc/dft/krks.py\n@@ -105,23 +105,17 @@ def get_veff(ks, cell=None, dm=None, dm_last=0, vhf_last=0, hermi=1,\n vxc += vj\n else:\n omega, alpha, hyb = ni.rsh_and_hybrid_coeff(ks.xc, spin=cell.spin)\n- if getattr(ks.with_df, '_j_only', False): # for GDF and MDF\n- logger.warn(ks, 'df.j_only cannot be used with hybrid functional')\n- ks.with_df._j_only = False\n- # Rebuild df object due to the change of parameter _j_only\n- if ks.with_df._cderi is not None:\n- ks.with_df.build()\n if omega == 0:\n vj, vk = ks.get_jk(cell, dm, hermi, kpts, kpts_band)\n vk *= hyb\n elif alpha == 0: # LR=0, only SR exchange\n- vj = ks.get_j(cell, dm, hermi, kpts, kpts_band)\n vk = ks.get_k(cell, dm, hermi, kpts, kpts_band, omega=-omega)\n vk *= hyb\n- elif hyb == 0: # SR=0, only LR exchange\n vj = ks.get_j(cell, dm, hermi, kpts, kpts_band)\n+ elif hyb == 0: # SR=0, only LR exchange\n vk = ks.get_k(cell, dm, hermi, kpts, kpts_band, omega=omega)\n vk *= alpha\n+ vj = ks.get_j(cell, dm, hermi, kpts, kpts_band)\n else: # SR and LR exchange with different ratios\n vj, vk = ks.get_jk(cell, dm, hermi, kpts, kpts_band)\n vk *= hyb\ndiff --git a/pyscf/pbc/dft/krks_ksymm.py b/pyscf/pbc/dft/krks_ksymm.py\nindex 0c6adf10a1..c072f52a9f 100644\n--- a/pyscf/pbc/dft/krks_ksymm.py\n+++ b/pyscf/pbc/dft/krks_ksymm.py\n@@ -92,12 +92,6 @@ def get_veff(ks, cell=None, dm=None, dm_last=0, vhf_last=0, hermi=1,\n vxc += vj\n else:\n omega, alpha, hyb = ni.rsh_and_hybrid_coeff(ks.xc, spin=cell.spin)\n- if getattr(ks.with_df, '_j_only', False): # for GDF and MDF\n- logger.warn(ks, 'df.j_only cannot be used with hybrid functional')\n- ks.with_df._j_only = False\n- # Rebuild df object due to the change of parameter _j_only\n- if ks.with_df._cderi is not None:\n- ks.with_df.build()\n if omega == 0:\n vj, vk = ks.get_jk(cell, dm, hermi, kpts, kpts_band)\n vk *= hyb\ndiff --git a/pyscf/pbc/dft/kuks.py b/pyscf/pbc/dft/kuks.py\nindex 3a6f4f9995..8ddeeb40ab 100644\n--- a/pyscf/pbc/dft/kuks.py\n+++ b/pyscf/pbc/dft/kuks.py\n@@ -89,23 +89,17 @@ def get_veff(ks, cell=None, dm=None, dm_last=0, vhf_last=0, hermi=1,\n vxc += vj\n else:\n omega, alpha, hyb = ni.rsh_and_hybrid_coeff(ks.xc, spin=cell.spin)\n- if getattr(ks.with_df, '_j_only', False): # for GDF and MDF\n- logger.warn(ks, 'df.j_only cannot be used with hybrid functional')\n- ks.with_df._j_only = False\n- # Rebuild df object due to the change of parameter _j_only\n- if ks.with_df._cderi is not None:\n- ks.with_df.build()\n if omega == 0:\n vj, vk = ks.get_jk(cell, dm, hermi, kpts, kpts_band)\n vk *= hyb\n elif alpha == 0: # LR=0, only SR exchange\n- vj = ks.get_j(cell, dm, hermi, kpts, kpts_band)\n vk = ks.get_k(cell, dm, hermi, kpts, kpts_band, omega=-omega)\n vk *= hyb\n- elif hyb == 0: # SR=0, only LR exchange\n vj = ks.get_j(cell, dm, hermi, kpts, kpts_band)\n+ elif hyb == 0: # SR=0, only LR exchange\n vk = ks.get_k(cell, dm, hermi, kpts, kpts_band, omega=omega)\n vk *= alpha\n+ vj = ks.get_j(cell, dm, hermi, kpts, kpts_band)\n else: # SR and LR exchange with different ratios\n vj, vk = ks.get_jk(cell, dm, hermi, kpts, kpts_band)\n vk *= hyb\ndiff --git a/pyscf/pbc/dft/kuks_ksymm.py b/pyscf/pbc/dft/kuks_ksymm.py\nindex 39404b6127..3c272458ed 100644\n--- a/pyscf/pbc/dft/kuks_ksymm.py\n+++ b/pyscf/pbc/dft/kuks_ksymm.py\n@@ -92,12 +92,6 @@ def get_veff(ks, cell=None, dm=None, dm_last=0, vhf_last=0, hermi=1,\n vxc += vj\n else:\n omega, alpha, hyb = ni.rsh_and_hybrid_coeff(ks.xc, spin=cell.spin)\n- if getattr(ks.with_df, '_j_only', False): # for GDF and MDF\n- logger.warn(ks, 'df.j_only cannot be used with hybrid functional')\n- ks.with_df._j_only = False\n- # Rebuild df object due to the change of parameter _j_only\n- if ks.with_df._cderi is not None:\n- ks.with_df.build()\n if omega == 0:\n vj, vk = ks.get_jk(cell, dm, hermi, kpts, kpts_band)\n vk *= hyb\ndiff --git a/pyscf/pbc/dft/rks.py b/pyscf/pbc/dft/rks.py\nindex 8f485dfa63..a08ecf3b05 100644\n--- a/pyscf/pbc/dft/rks.py\n+++ b/pyscf/pbc/dft/rks.py\n@@ -37,7 +37,6 @@\n from pyscf.pbc.dft import numint\n from pyscf.dft import rks as mol_ks\n from pyscf.pbc.dft import multigrid\n-from pyscf.pbc.df.df import GDF\n from pyscf.pbc.lib.kpts import KPoints\n from pyscf import __config__\n \n@@ -111,13 +110,13 @@ def get_veff(ks, cell=None, dm=None, dm_last=0, vhf_last=0, hermi=1,\n vj, vk = ks.get_jk(cell, dm, hermi, kpt, kpts_band)\n vk *= hyb\n elif alpha == 0: # LR=0, only SR exchange\n- vj = ks.get_j(cell, dm, hermi, kpt, kpts_band)\n vk = ks.get_k(cell, dm, hermi, kpt, kpts_band, omega=-omega)\n vk *= hyb\n- elif hyb == 0: # SR=0, only LR exchange\n vj = ks.get_j(cell, dm, hermi, kpt, kpts_band)\n+ elif hyb == 0: # SR=0, only LR exchange\n vk = ks.get_k(cell, dm, hermi, kpt, kpts_band, omega=omega)\n vk *= alpha\n+ vj = ks.get_j(cell, dm, hermi, kpt, kpts_band)\n else: # SR and LR exchange with different ratios\n vj, vk = ks.get_jk(cell, dm, hermi, kpt, kpts_band)\n vk *= hyb\n@@ -231,15 +230,6 @@ def build(self, cell=None):\n if not numpy.all(self.rsjk.kpts == self.kpt):\n self.rsjk = self.rsjk.__class__(cell, kpts)\n \n- # for GDF and MDF\n- with_df = self.with_df\n- if (isinstance(with_df, GDF) and\n- self._numint.libxc.is_hybrid_xc(self.xc) and\n- len(kpts) > 1 and getattr(with_df, '_j_only', False)):\n- logger.warn(self, 'df.j_only cannot be used with hybrid functional')\n- self.with_df._j_only = False\n- self.with_df.reset()\n-\n if self.verbose >= logger.WARN:\n self.check_sanity()\n return self\ndiff --git a/pyscf/pbc/dft/uks.py b/pyscf/pbc/dft/uks.py\nindex b1a61cb41b..313cd78c86 100644\n--- a/pyscf/pbc/dft/uks.py\n+++ b/pyscf/pbc/dft/uks.py\n@@ -94,23 +94,17 @@ def get_veff(ks, cell=None, dm=None, dm_last=0, vhf_last=0, hermi=1,\n vxc += vj\n else:\n omega, alpha, hyb = ni.rsh_and_hybrid_coeff(ks.xc, spin=cell.spin)\n- if getattr(ks.with_df, '_j_only', False): # for GDF and MDF\n- logger.warn(ks, 'df.j_only cannot be used with hybrid functional')\n- ks.with_df._j_only = False\n- # Rebuild df object due to the change of parameter _j_only\n- if ks.with_df._cderi is not None:\n- ks.with_df.build()\n if omega == 0:\n vj, vk = ks.get_jk(cell, dm, hermi, kpt, kpts_band)\n vk *= hyb\n elif alpha == 0: # LR=0, only SR exchange\n- vj = ks.get_j(cell, dm, hermi, kpt, kpts_band)\n vk = ks.get_k(cell, dm, hermi, kpt, kpts_band, omega=-omega)\n vk *= hyb\n- elif hyb == 0: # SR=0, only LR exchange\n vj = ks.get_j(cell, dm, hermi, kpt, kpts_band)\n+ elif hyb == 0: # SR=0, only LR exchange\n vk = ks.get_k(cell, dm, hermi, kpt, kpts_band, omega=omega)\n vk *= alpha\n+ vj = ks.get_j(cell, dm, hermi, kpt, kpts_band)\n else: # SR and LR exchange with different ratios\n vj, vk = ks.get_jk(cell, dm, hermi, kpt, kpts_band)\n vk *= hyb\n"}, "test": {"test_patch": "diff --git a/pyscf/pbc/df/test/test_df.py b/pyscf/pbc/df/test/test_df.py\nindex 20036dee82..72dfdbf59c 100644\n--- a/pyscf/pbc/df/test/test_df.py\n+++ b/pyscf/pbc/df/test/test_df.py\n@@ -15,6 +15,7 @@\n import unittest\n import tempfile\n import numpy\n+import numpy as np\n from pyscf import lib\n import pyscf.pbc\n from pyscf import ao2mo, gto\n@@ -266,6 +267,23 @@ def test_kpoints_input(sef):\n mydf = mdf.MDF(cell, kpts=kpts)\n assert mydf.kpts.shape == (8,3)\n \n+ # issue 2790: build full-range J and SR K separately\n+ def test_rsh_df(self):\n+ cell = pgto.M(\n+ a = np.eye(3) * 3,\n+ atom = '''H 0.0000 0.0000 0.0000; H 1.3575 1.3575 1.3575''',\n+ basis = [[0, [.5, 1]]],\n+ )\n+ kpts = cell.make_kpts([2,1,1])\n+ kmf = cell.KRKS(kpts=kpts, xc='hse06').density_fit().run()\n+ assert abs(kmf.e_tot - -0.687018457218418) < 1e-8\n+\n+ kmf = cell.KRKS(kpts=kpts, xc='camb3lyp').density_fit().run()\n+ assert abs(kmf.e_tot - -0.674692142275221) < 1e-8\n+\n+ kmf = cell.KRKS(kpts=kpts, xc='wb97').density_fit().run()\n+ assert abs(kmf.e_tot - -0.678851816639354) < 1e-8\n+\n if __name__ == '__main__':\n print(\"Full Tests for df\")\n unittest.main()\ndiff --git a/pyscf/pbc/dft/test/test_uks.py b/pyscf/pbc/dft/test/test_uks.py\nindex b78b408307..b50a7499c9 100644\n--- a/pyscf/pbc/dft/test/test_uks.py\n+++ b/pyscf/pbc/dft/test/test_uks.py\n@@ -82,12 +82,12 @@ def test_rsh_df(self):\n mf = pbcdft.UKS(cell).density_fit()\n mf.xc = 'hse06'\n mf.kernel()\n- self.assertAlmostEqual(mf.e_tot, -2.4824271111708662, 6)\n+ self.assertAlmostEqual(mf.e_tot, -2.482426252, 7)\n \n mf.xc = 'camb3lyp'\n mf.omega = .15\n mf.kernel()\n- self.assertAlmostEqual(mf.e_tot, -2.4766238116030683, 6)\n+ self.assertAlmostEqual(mf.e_tot, -2.476623986, 7)\n \n \n if __name__ == '__main__':\n", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}157{"question_id": "MSB_pyscf_pyscf_pr2826", "question_type": "multi_swe_bench", "description": "feat: Add spin-seperated 4-RDM for FCI (pyscf/pyscf#2826)", "content": {"org": "pyscf", "repo": "pyscf", "pr_number": 2826, "issue_title": "feat: Add spin-seperated 4-RDM for FCI ", "issue_body": "Extends the functionality to obtain the spin-separated 4-RDM from an FCI object. Relies on the same hack as in #2357 for the 3-RDM. Implements the same tests and asserts (checking consistency with the spin-summed RDM) as in the aforementioned PR.", "base_commit": "b64f09d52f4008e6682328959b0d558edf24c1b3", "resolved_issues": [{"number": 2357, "title": "Enable spin-separated 3-RDMs", "body": "The spin-separated 3-RDMs (aaa, aab, abb, bbb components) have been implemented thanks to @MatthewRHermes's hack (see #2326, code here is largely lifted out of https://github.com/MatthewRHermes/mrh/blob/master/my_pyscf/lassi/op_o0.py#L54-L168). A suitable test (mcscf/04) have been expanded to assert that the spin-separated RDMs add (with correct transpositions) to the spin-summed RDMs.\n\n### Minimal API referenced by tests (typed signatures)\n_Added only when tests call brand\u2011new symbols introduced by the fix; types reflect annotations present in the repo or `Unknown` if not annotated._\n\n- Function in `pyscf/fci/direct_spin1.py`: `def make_rdm1234(fcivec, norb, nelec, link_index, reorder) -> numpy.ndarray: ...`\n **Inputs:** fcivec: numpy.ndarray, norb: int, nelec: Union[int, tuple], link_index: numpy.ndarray, reorder: bool\n **Output:** numpy.ndarray\n\n- Function in `pyscf/fci/direct_spin1.py`: `def make_rdm1234s(fcivec, norb, nelec, link_index, reorder) -> numpy.ndarray: ...`\n **Inputs:** fcivec: numpy.ndarray, norb: int, nelec: Union[int, tuple], link_index: numpy.ndarray, reorder: bool\n **Output:** numpy.ndarray\n\n```python\ndef make_rdm1234(fcivec, norb, nelec, link_index, reorder) -> numpy.ndarray: ...\ndef make_rdm1234s(fcivec, norb, nelec, link_index, reorder) -> numpy.ndarray: ...\n```"}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/pyscf_m_pyscf:pr-2826", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/examples/fci/14-density_matrix.py b/examples/fci/14-density_matrix.py\nindex 28e207b918..52ceb78e1e 100644\n--- a/examples/fci/14-density_matrix.py\n+++ b/examples/fci/14-density_matrix.py\n@@ -158,6 +158,37 @@\n (nelec_a,nelec_b))\n dm1, dm2, dm3, dm4 = fci.rdm.reorder_dm1234(dm1, dm2, dm3, dm4)\n \n+#\n+# Spin-separated 4-particle density matrix\n+#\n+\n+(dm1a, dm1b), (dm2aa, dm2ab, dm2bb), (dm3aaa, dm3aab, dm3abb, dm3bbb), (dm4aaaa, dm4aaab, dm4aabb, dm4abbb, dm4bbbb) = (\n+ fci.direct_spin1.make_rdm1234s(fcivec0, norb, (nelec_a, nelec_b))\n+)\n+assert(numpy.allclose(dm1a+dm1b, dm1))\n+assert(numpy.allclose(dm2aa+dm2bb+dm2ab+dm2ab.transpose(2,3,0,1), dm2))\n+assert(numpy.allclose(dm3aaa+dm3bbb+dm3aab+dm3aab.transpose(0,1,4,5,2,3)+\\\n+dm3aab.transpose(4,5,0,1,2,3)+dm3abb+dm3abb.transpose(2,3,0,1,4,5)+dm3abb.transpose(2,3,4,5,0,1), dm3))\n+assert(numpy.allclose(\n+ dm4aaaa\n+ + dm4bbbb\n+ + dm4aaab\n+ + dm4aaab.transpose(0, 1, 2, 3, 6, 7, 4, 5)\n+ + dm4aaab.transpose(0, 1, 6, 7, 2, 3, 4, 5)\n+ + dm4aaab.transpose(6, 7, 0, 1, 2, 3, 4, 5)\n+ + dm4aabb\n+ + dm4aabb.transpose(0, 1, 4, 5, 2, 3, 6, 7)\n+ + dm4aabb.transpose(4, 5, 0, 1, 2, 3, 6, 7)\n+ + dm4aabb.transpose(0, 1, 4, 5, 6, 7, 2, 3)\n+ + dm4aabb.transpose(4, 5, 0, 1, 6, 7, 2, 3)\n+ + dm4aabb.transpose(4, 5, 6, 7, 0, 1, 2, 3)\n+ + dm4abbb\n+ + dm4abbb.transpose(2, 3, 0, 1, 4, 5, 6, 7)\n+ + dm4abbb.transpose(2, 3, 4, 5, 0, 1, 6, 7)\n+ + dm4abbb.transpose(2, 3, 4, 5, 6, 7, 0, 1),\n+ dm4,\n+))\n+\n #\n # Spin-traced 4-particle transition density matrix\n #\ndiff --git a/pyscf/fci/direct_spin1.py b/pyscf/fci/direct_spin1.py\nindex 2f4d3777db..ea3bfbf9a5 100644\n--- a/pyscf/fci/direct_spin1.py\n+++ b/pyscf/fci/direct_spin1.py\n@@ -410,6 +410,77 @@ def make_rdm123s(fcivec, norb, nelec, link_index=None, reorder=True):\n # rdm3aab.transpose(4,5,0,1,2,3)+rdm3abb+rdm3abb.transpose(2,3,0,1,4,5)+rdm3abb.transpose(2,3,4,5,0,1), rdm3)\n return (rdm1a, rdm1b), (rdm2aa, rdm2ab, rdm2bb), (rdm3aaa, rdm3aab, rdm3abb, rdm3bbb)\n \n+def make_rdm1234(fcivec, norb, nelec, link_index=None, reorder=True):\n+ '''Spin traced 1-, 2-, 3, 4-particle density matrices.'''\n+ dm1, dm2, dm3, dm4 = rdm.make_dm1234('FCI4pdm_kern_sf', fcivec, fcivec, norb, nelec)\n+ if reorder:\n+ dm1, dm2, dm3, dm4 = rdm.reorder_dm1234(dm1, dm2, dm3, dm4, inplace=True)\n+ return dm1, dm2, dm3, dm4\n+\n+def make_rdm1234s(fcivec, norb, nelec, link_index=None, reorder=True):\n+ r'''Spin separated 1-, 2-, 3, 4-particle density matrices.\n+\n+ 1pdm[p,q] = :math:`\\langle q_\\alpha^\\dagger p_\\alpha \\rangle +\n+ \\langle q_\\beta^\\dagger p_\\beta \\rangle`;\n+ 2pdm[p,q,r,s] = :math:`\\langle p_\\alpha^\\dagger r_\\alpha^\\dagger s_\\alpha q_\\alpha\\rangle +\n+ \\langle p_\\beta^\\dagger r_\\alpha^\\dagger s_\\alpha q_\\beta\\rangle +\n+ \\langle p_\\alpha^\\dagger r_\\beta^\\dagger s_\\beta q_\\alpha\\rangle +\n+ \\langle p_\\beta^\\dagger r_\\beta^\\dagger s_\\beta q_\\beta\\rangle`.\n+ '''\n+ if (not reorder):\n+ raise NotImplementedError('reorder=False not currently supported')\n+ ci_spinless = civec_spinless_repr([fcivec,], norb, [nelec,])\n+ rdm1, rdm2, rdm3, rdm4 = make_rdm1234(ci_spinless, norb*2, (nelec[0]+nelec[1],0))\n+\n+ # define slices\n+ alpha = slice(0, norb)\n+ beta = slice(norb, None)\n+\n+ rdm1a = rdm1[alpha, alpha]\n+ rdm1b = rdm1[beta, beta]\n+ # assert np.allclose(rdm1a+rdm1b, rdm1)\n+\n+ rdm2aa = rdm2[alpha, alpha, alpha, alpha]\n+ rdm2ab = rdm2[alpha, alpha, beta, beta]\n+ rdm2bb = rdm2[beta, beta, beta, beta]\n+ # assert np.allclose(rdm2aa+rdm2bb+rdm2ab+rdm2ab.transpose(2,3,0,1), rdm2)\n+\n+ rdm3aaa = rdm3[alpha, alpha, alpha, alpha, alpha, alpha]\n+ rdm3aab = rdm3[alpha, alpha, alpha, alpha, beta, beta]\n+ rdm3abb = rdm3[alpha, alpha, beta, beta, beta, beta]\n+ rdm3bbb = rdm3[beta, beta, beta, beta, beta, beta]\n+ # assert np.allclose(rdm3aaa+rdm3bbb+rdm3aab+rdm3aab.transpose(0,1,4,5,2,3)+\\\n+ # rdm3aab.transpose(4,5,0,1,2,3)+rdm3abb+rdm3abb.transpose(2,3,0,1,4,5)+rdm3abb.transpose(2,3,4,5,0,1), rdm3)\n+\n+ rdm4aaaa = rdm4[alpha, alpha, alpha, alpha, alpha, alpha, alpha, alpha]\n+ rdm4aaab = rdm4[alpha, alpha, alpha, alpha, alpha, alpha, beta, beta]\n+ rdm4aabb = rdm4[alpha, alpha, alpha, alpha, beta, beta, beta, beta]\n+ rdm4abbb = rdm4[alpha, alpha, beta, beta, beta, beta, beta, beta]\n+ rdm4bbbb = rdm4[beta, beta, beta, beta, beta, beta, beta, beta]\n+ # assert numpy.allclose(\n+ # rdm4aaaa\n+ # + rdm4bbbb\n+ # + rdm4aaab\n+ # + rdm4aaab.transpose(0, 1, 2, 3, 6, 7, 4, 5)\n+ # + rdm4aaab.transpose(0, 1, 6, 7, 2, 3, 4, 5)\n+ # + rdm4aaab.transpose(6, 7, 0, 1, 2, 3, 4, 5)\n+ # + rdm4aabb\n+ # + rdm4aabb.transpose(0, 1, 4, 5, 2, 3, 6, 7)\n+ # + rdm4aabb.transpose(0, 1, 4, 5, 6, 7, 2, 3)\n+ # + rdm4aabb.transpose(4, 5, 2, 3, 0, 1, 6, 7)\n+ # + rdm4aabb.transpose(4, 5, 2, 3, 6, 7, 0, 1)\n+ # + rdm4abbb\n+ # + rdm4abbb.transpose(2, 3, 0, 1, 4, 5, 6, 7)\n+ # + rdm4abbb.transpose(2, 3, 4, 5, 0, 1, 6, 7)\n+ # + rdm4abbb.transpose(2, 3, 4, 5, 6, 7, 0, 1),\n+ # rdm4,\n+ # )\n+ return (\n+ (rdm1a, rdm1b),\n+ (rdm2aa, rdm2ab, rdm2bb),\n+ (rdm3aaa, rdm3aab, rdm3abb, rdm3bbb),\n+ (rdm4aaaa, rdm4aaab, rdm4aabb, rdm4abbb, rdm4bbbb),\n+ )\n \n def trans_rdm1s(cibra, ciket, norb, nelec, link_index=None):\n r'''Spin separated transition 1-particle density matrices.\n@@ -939,6 +1010,16 @@ def make_rdm123(self, fcivec, norb, nelec, link_index=None, reorder=True):\n nelec = _unpack_nelec(nelec, self.spin)\n return make_rdm123(fcivec, norb, nelec, link_index, reorder)\n \n+ @lib.with_doc(make_rdm1234s.__doc__)\n+ def make_rdm1234s(self, fcivec, norb, nelec, link_index=None, reorder=True):\n+ nelec = _unpack_nelec(nelec, self.spin)\n+ return make_rdm1234s(fcivec, norb, nelec, link_index, reorder)\n+\n+ @lib.with_doc(make_rdm1234.__doc__)\n+ def make_rdm1234(self, fcivec, norb, nelec, link_index=None, reorder=True):\n+ nelec = _unpack_nelec(nelec, self.spin)\n+ return make_rdm1234(fcivec, norb, nelec, link_index, reorder)\n+\n def make_rdm2(self, fcivec, norb, nelec, link_index=None, reorder=True):\n r'''Spin traced 2-particle density matrice\n \n"}, "test": {"test_patch": "diff --git a/pyscf/fci/test/test_rdm.py b/pyscf/fci/test/test_rdm.py\nindex 8ac3b59957..7366783c7d 100644\n--- a/pyscf/fci/test/test_rdm.py\n+++ b/pyscf/fci/test/test_rdm.py\n@@ -134,6 +134,103 @@ def test_dm4(self):\n self.assertTrue(numpy.allclose(dm3a, numpy.einsum('mnijppkl->mnijkl',dm4b)/5))\n self.assertTrue(numpy.allclose(dm3a, numpy.einsum('mnijklpp->mnijkl',dm4b)/5))\n \n+ def test_rdm4s(self):\n+ dm1, dm2, dm3, dm4 = fci.direct_spin1.make_rdm1234(ci0, norb, (nelec//2,nelec//2))\n+\n+ (dm1a, dm1b), (dm2aa, dm2ab, dm2bb), (dm3aaa, dm3aab, dm3abb, dm3bbb), (dm4aaaa, dm4aaab, dm4aabb, dm4abbb, dm4bbbb) = \\\n+ fci.direct_spin1.make_rdm1234s(ci0, norb, (nelec//2,nelec//2))\n+\n+ self.assertTrue(numpy.allclose(dm1a+dm1b, dm1))\n+ self.assertTrue(numpy.allclose(dm2aa+dm2bb+dm2ab+dm2ab.transpose(2,3,0,1), dm2))\n+ self.assertTrue(numpy.allclose(dm3aaa+dm3bbb+dm3aab+dm3aab.transpose(0,1,4,5,2,3)+\\\n+ dm3aab.transpose(4,5,0,1,2,3)+dm3abb+dm3abb.transpose(2,3,0,1,4,5)+dm3abb.transpose(2,3,4,5,0,1), dm3))\n+ self.assertTrue(numpy.allclose(\n+ dm4aaaa\n+ + dm4bbbb\n+ + dm4aaab\n+ + dm4aaab.transpose(0, 1, 2, 3, 6, 7, 4, 5)\n+ + dm4aaab.transpose(0, 1, 6, 7, 2, 3, 4, 5)\n+ + dm4aaab.transpose(6, 7, 0, 1, 2, 3, 4, 5)\n+ + dm4aabb\n+ + dm4aabb.transpose(0, 1, 4, 5, 2, 3, 6, 7)\n+ + dm4aabb.transpose(4, 5, 0, 1, 2, 3, 6, 7)\n+ + dm4aabb.transpose(0, 1, 4, 5, 6, 7, 2, 3)\n+ + dm4aabb.transpose(4, 5, 0, 1, 6, 7, 2, 3)\n+ + dm4aabb.transpose(4, 5, 6, 7, 0, 1, 2, 3)\n+ + dm4abbb\n+ + dm4abbb.transpose(2, 3, 0, 1, 4, 5, 6, 7)\n+ + dm4abbb.transpose(2, 3, 4, 5, 0, 1, 6, 7)\n+ + dm4abbb.transpose(2, 3, 4, 5, 6, 7, 0, 1),\n+ dm4,\n+ ))\n+\n+ (rdm1a, rdm1b), (rdm2aa, rdm2ab, rdm2bb), (rdm3aaa, rdm3aab, rdm3abb, rdm3bbb) = \\\n+ fci.direct_spin1.make_rdm123s(ci0, norb, (nelec//2,nelec//2))\n+\n+ self.assertTrue(numpy.allclose(rdm1a, dm1a))\n+ self.assertTrue(numpy.allclose(rdm1b, dm1b))\n+\n+ fac = 1. / (nelec//2-1)\n+ self.assertTrue(numpy.allclose(rdm1a, numpy.einsum('ijmm->ij',dm2aa)*fac))\n+ self.assertTrue(numpy.allclose(rdm1a, numpy.einsum('mmij->ij',dm2aa)*fac))\n+ self.assertTrue(numpy.allclose(rdm1b, numpy.einsum('ijmm->ij',dm2bb)*fac))\n+ self.assertTrue(numpy.allclose(rdm1b, numpy.einsum('mmij->ij',dm2bb)*fac))\n+\n+ fac = 1. / (nelec//2) # dm2ab has a prefactor N * N instead of N(N-1)\n+ self.assertTrue(numpy.allclose(rdm1a, numpy.einsum('ijmm->ij',dm2ab)*fac))\n+ self.assertTrue(numpy.allclose(rdm1b, numpy.einsum('mmij->ij',dm2ab)*fac))\n+\n+ fac = 1. / (nelec//2-2)\n+ self.assertTrue(numpy.allclose(rdm2aa, numpy.einsum('ijklmm->ijkl',dm3aaa)*fac))\n+ self.assertTrue(numpy.allclose(rdm2aa, numpy.einsum('ijmmkl->ijkl',dm3aaa)*fac))\n+ self.assertTrue(numpy.allclose(rdm2aa, numpy.einsum('mmijkl->ijkl',dm3aaa)*fac))\n+\n+ self.assertTrue(numpy.allclose(rdm2bb, numpy.einsum('ijklmm->ijkl',dm3bbb)*fac))\n+ self.assertTrue(numpy.allclose(rdm2bb, numpy.einsum('ijmmkl->ijkl',dm3bbb)*fac))\n+ self.assertTrue(numpy.allclose(rdm2bb, numpy.einsum('mmijkl->ijkl',dm3bbb)*fac))\n+\n+ fac = 1. / (nelec//2) # dm3aab/abb has a prefactor N * N * (N-1) instead of N(N-1)(N-2)\n+ self.assertTrue(numpy.allclose(rdm2aa, numpy.einsum('ijklmm->ijkl',dm3aab)*fac))\n+ self.assertTrue(numpy.allclose(rdm2bb, numpy.einsum('mmijkl->ijkl',dm3abb)*fac))\n+\n+ fac = 1. / (nelec//2-1)\n+ self.assertTrue(numpy.allclose(rdm2ab, numpy.einsum('ijmmkl->ijkl',dm3aab)*fac))\n+ self.assertTrue(numpy.allclose(rdm2ab, numpy.einsum('mmijkl->ijkl',dm3aab)*fac))\n+ self.assertTrue(numpy.allclose(rdm2ab, numpy.einsum('ijklmm->ijkl',dm3abb)*fac))\n+ self.assertTrue(numpy.allclose(rdm2ab, numpy.einsum('ijmmkl->ijkl',dm3abb)*fac))\n+\n+ # NOTE: Tests skipeed because system only contains 3 alpha and beta electrons\n+ # fac = 1. / (nelec//2-3)\n+ # self.assertTrue(numpy.allclose(rdm3aaa, numpy.einsum('ijklmnoo->ijklmn',dm4aaaa)*fac))\n+ # self.assertTrue(numpy.allclose(rdm3aaa, numpy.einsum('ijkloomn->ijklmn',dm4aaaa)*fac))\n+ # self.assertTrue(numpy.allclose(rdm3aaa, numpy.einsum('ijooklmn->ijklmn',dm4aaaa)*fac))\n+ # self.assertTrue(numpy.allclose(rdm3aaa, numpy.einsum('ooijklmn->ijklmn',dm4aaaa)*fac))\n+ #\n+ # self.assertTrue(numpy.allclose(rdm3bbb, numpy.einsum('ijklmnoo->ijklmn',dm4bbbb)*fac))\n+ # self.assertTrue(numpy.allclose(rdm3bbb, numpy.einsum('ijkloomn->ijklmn',dm4bbbb)*fac))\n+ # self.assertTrue(numpy.allclose(rdm3bbb, numpy.einsum('ijooklmn->ijklmn',dm4bbbb)*fac))\n+ # self.assertTrue(numpy.allclose(rdm3bbb, numpy.einsum('ooijklmn->ijklmn',dm4bbbb)*fac))\n+\n+ fac = 1. / (nelec//2-2)\n+ self.assertTrue(numpy.allclose(rdm3aab, numpy.einsum('ooijklmn->ijklmn',dm4aaab)*fac))\n+ self.assertTrue(numpy.allclose(rdm3aab, numpy.einsum('ijooklmn->ijklmn',dm4aaab)*fac))\n+ self.assertTrue(numpy.allclose(rdm3aab, numpy.einsum('ijkloomn->ijklmn',dm4aaab)*fac))\n+\n+ self.assertTrue(numpy.allclose(rdm3abb, numpy.einsum('ijklmnoo->ijklmn',dm4abbb)*fac))\n+ self.assertTrue(numpy.allclose(rdm3abb, numpy.einsum('ijkloomn->ijklmn',dm4abbb)*fac))\n+ self.assertTrue(numpy.allclose(rdm3abb, numpy.einsum('ijooklmn->ijklmn',dm4abbb)*fac))\n+\n+ fac = 1. / (nelec//2-1)\n+ self.assertTrue(numpy.allclose(rdm3aab, numpy.einsum('ijklmnoo->ijklmn',dm4aabb)*fac))\n+ self.assertTrue(numpy.allclose(rdm3aab, numpy.einsum('ijkloomn->ijklmn',dm4aabb)*fac))\n+\n+ self.assertTrue(numpy.allclose(rdm3abb, numpy.einsum('ijooklmn->ijklmn',dm4aabb)*fac))\n+ self.assertTrue(numpy.allclose(rdm3abb, numpy.einsum('ooijklmn->ijklmn',dm4aabb)*fac))\n+\n+ fac = 1. / (nelec//2)\n+ self.assertTrue(numpy.allclose(rdm3bbb, numpy.einsum('ooijklmn->ijklmn',dm4abbb)*fac))\n+ self.assertTrue(numpy.allclose(rdm3aaa, numpy.einsum('ijklmnoo->ijklmn',dm4aaab)*fac))\n+\n def test_tdm2(self):\n dm1 = numpy.einsum('ij,ijkl->lk', ci0, _trans1(ci0, norb, nelec))\n self.assertTrue(numpy.allclose(rdm1, dm1))\n", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}158{"question_id": "MSB_pyscf_pyscf_pr2870", "question_type": "multi_swe_bench", "description": "Enable hermi=0 for Breit and Gaunt JK integrals (pyscf/pyscf#2870)", "content": {"org": "pyscf", "repo": "pyscf", "pr_number": 2870, "issue_title": "Enable hermi=0 for Breit and Gaunt JK integrals", "issue_body": "fix #2867 ", "base_commit": "142756584ed3963728cc1f6823286f4605811a6c", "resolved_issues": [{"number": 2867, "title": "[UNEXPECTED BEHAVIOUR] No Gaunt or Breit possible in TDDFT", "body": "**Gaunt and Breit Interactions don't work in TDDFT**\nWhen using the later mentioned code, the regular `pyscf.dft.dks().DKS()` works, when using the options `with_gaunt = True` or `with_breit = True`. When subsequently performing a TDDFT calculation, an unimplemented Error occurs. This is not the case when `with_gaunt` and `with_breit` are turned to `False`.\n\n**Minimal Working Example**\nA minimal example, where the error occurs:\n```python\nfrom pyscf import gto, dft\n\nmol = gto.Mole()\n\nmol.build(\n atom = '''H 0 0 0\n F 0 0 1.5''',\n basis = '631g',\n verbose = 4,\n symmetry = True,\n )\n\nmf = dft.dks.DKS(mol)\nmf.xc = 'pbe0'\nmf.with_gaunt = True\nmf.with_breit = True\nmf.kernel()\n\nmytd = mf.TDDFT()\n\nmytd.kernel()\n```\n\n**Error Message**\n```bash\nTraceback (most recent call last):\n File \"/home/kevin/Documents/Spin-Orbit-Coupling/pyscf/HF/test.py\", line 22, in <module>\n mytd.kernel()\n File \"/home/kevin/.local/lib/python3.12/site-packages/pyscf/tdscf/dhf.py\", line 567, in kernel\n self.converged, w, x1 = lr_eig(\n ^^^^^^^\n File \"/home/kevin/.local/lib/python3.12/site-packages/pyscf/tdscf/_lr_eig.py\", line 340, in eig\n axt = aop(xt)\n ^^^^^^^\n File \"/home/kevin/.local/lib/python3.12/site-packages/pyscf/tdscf/dhf.py\", line 504, in vind\n v1ao = vresp(dms) # = <mj||nb> Xjb + <mb||nj> Yjb\n ^^^^^^^^^^\n File \"/home/kevin/.local/lib/python3.12/site-packages/pyscf/scf/_response_functions.py\", line 297, in vind\n vj, vk = mf.get_jk(mol, dm1, hermi, with_j=with_j)\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"/home/kevin/.local/lib/python3.12/site-packages/pyscf/scf/dhf.py\", line 679, in get_jk\n vj1, vk1 = _call_veff_gaunt_breit(mol, dm, hermi, opt_gaunt, False)\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n File \"/home/kevin/.local/lib/python3.12/site-packages/pyscf/scf/dhf.py\", line 1038, in _call_veff_gaunt_breit\n raise NotImplementedError\nNotImplementedError\n```\n\n\n**Version and hardware:**\n- PySCF version: 2.9.0\n- PySCF install type: built from source and pip, both result in the same error\n- Operating system: Ubuntu 24.04\n"}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/pyscf_m_pyscf:pr-2870", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/pyscf/scf/dhf.py b/pyscf/scf/dhf.py\nindex 7a9ced7eed..06395fcef7 100644\n--- a/pyscf/scf/dhf.py\n+++ b/pyscf/scf/dhf.py\n@@ -1010,32 +1010,57 @@ def _call_veff_gaunt_breit(mol, dm, hermi=1, mf_opt=None, with_breit=False):\n vj = numpy.zeros((n_dm,n2c*2,n2c*2), dtype=numpy.complex128)\n vk = numpy.zeros((n_dm,n2c*2,n2c*2), dtype=numpy.complex128)\n \n- jks = ('lk->s1ij', 'jk->s1il')\n- vj_ls, vk_ls = _vhf.rdirect_mapdm(intor_prefix+'ssp1ssp2_spinor', 's1', jks, dms[:n_dm], 1,\n- mol._atm, mol._bas, mol._env, opt_gaunt_lsls)\n- vj[:,:n2c,n2c:] = vj_ls\n- vk[:,:n2c,n2c:] = vk_ls\n- t0 = log.timer_debug1('LSLS contribution', *t0)\n-\n- jks = ('lk->s1ij',) * n_dm \\\n- + ('li->s1kj',) * n_dm \\\n- + ('jk->s1il',) * n_dm\n- vx = _vhf.rdirect_bindm(intor_prefix+'ssp1sps2_spinor', 's1', jks, dms[n_dm:], 1,\n- mol._atm, mol._bas, mol._env, opt_gaunt_lssl)\n-\n- t0 = log.timer_debug1('LSSL contribution', *t0)\n- vj[:,:n2c,n2c:]+= vx[ :n_dm ,:,:]\n- vk[:,n2c:,n2c:] = vx[n_dm :n_dm*2,:,:]\n- vk[:,:n2c,:n2c] = vx[n_dm*2: ,:,:]\n-\n- if hermi == 1:\n- vj[:,n2c:,:n2c] = vj[:,:n2c,n2c:].transpose(0,2,1).conj()\n- vk[:,n2c:,:n2c] = vk[:,:n2c,n2c:].transpose(0,2,1).conj()\n- elif hermi == 2:\n- vj[:,n2c:,:n2c] = -vj[:,:n2c,n2c:].transpose(0,2,1).conj()\n- vk[:,n2c:,:n2c] = -vk[:,:n2c,n2c:].transpose(0,2,1).conj()\n+ if hermi != 0:\n+ jks = ('lk->s1ij', 'jk->s1il')\n+ vj_ls, vk_ls = _vhf.rdirect_mapdm(\n+ intor_prefix+'ssp1ssp2_spinor', 's1', jks, dms[:n_dm], 1,\n+ mol._atm, mol._bas, mol._env, opt_gaunt_lsls)\n+ vj[:,:n2c,n2c:] = vj_ls\n+ vk[:,:n2c,n2c:] = vk_ls\n+ t0 = log.timer_debug1('LSLS contribution', *t0)\n+\n+ jks = (('lk->s1ij',) * n_dm +\n+ ('li->s1kj',) * n_dm +\n+ ('jk->s1il',) * n_dm)\n+ vx = _vhf.rdirect_bindm(\n+ intor_prefix+'ssp1sps2_spinor', 's1', jks, dms[n_dm:], 1,\n+ mol._atm, mol._bas, mol._env, opt_gaunt_lssl)\n+ vj[:,:n2c,n2c:]+= vx[ :n_dm ,:,:]\n+ vk[:,n2c:,n2c:] = vx[n_dm :n_dm*2,:,:]\n+ vk[:,:n2c,:n2c] = vx[n_dm*2: ,:,:]\n+ t0 = log.timer_debug1('LSSL contribution', *t0)\n+\n+ if hermi == 1:\n+ vj[:,n2c:,:n2c] = vj[:,:n2c,n2c:].transpose(0,2,1).conj()\n+ vk[:,n2c:,:n2c] = vk[:,:n2c,n2c:].transpose(0,2,1).conj()\n+ elif hermi == 2:\n+ vj[:,n2c:,:n2c] = -vj[:,:n2c,n2c:].transpose(0,2,1).conj()\n+ vk[:,n2c:,:n2c] = -vk[:,:n2c,n2c:].transpose(0,2,1).conj()\n else:\n- raise NotImplementedError\n+ jks = ('lk->s1ij', 'jk->s1il')\n+ subj, subk = _vhf.rdirect_mapdm(\n+ intor_prefix+'ssp1ssp2_spinor', 's1', jks,\n+ (dms[:n_dm] + [x.conj().T for x in dms[n_dm:n_dm*2]]), 1,\n+ mol._atm, mol._bas, mol._env, opt_gaunt_lsls)\n+ vj[:,:n2c,n2c:] = subj[ :n_dm ,:,:]\n+ vj[:,n2c:,:n2c] = subj[n_dm :n_dm*2,:,:].conj().transpose(0,2,1)\n+ vk[:,:n2c,n2c:] = subk[ :n_dm ,:,:]\n+ vk[:,n2c:,:n2c] = subk[n_dm :n_dm*2,:,:].conj().transpose(0,2,1)\n+ t0 = log.timer_debug1('LSLS contribution', *t0)\n+\n+ jks = (('ji->s1kl',) * n_dm +\n+ ('lk->s1ij',) * n_dm +\n+ ('li->s1kj',) * n_dm +\n+ ('jk->s1il',) * n_dm)\n+ vx = _vhf.rdirect_bindm(\n+ intor_prefix+'ssp1sps2_spinor', 's1', jks, dms, 1,\n+ mol._atm, mol._bas, mol._env, opt_gaunt_lssl)\n+ vj[:,n2c:,:n2c]+= vx[ :n_dm ,:,:]\n+ vj[:,:n2c,n2c:]+= vx[n_dm :n_dm*2,:,:]\n+ vk[:,n2c:,n2c:] = vx[n_dm*2:n_dm*3,:,:]\n+ vk[:,:n2c,:n2c] = vx[n_dm*3:n_dm*4,:,:]\n+ t0 = log.timer_debug1('LSSL contribution', *t0)\n+\n vj = vj.reshape(dm.shape)\n vk = vk.reshape(dm.shape)\n c1 = .5 / lib.param.LIGHT_SPEED\n"}, "test": {"test_patch": "diff --git a/pyscf/scf/test/test_dhf.py b/pyscf/scf/test/test_dhf.py\nindex 07ee57229f..2db8b48017 100644\n--- a/pyscf/scf/test/test_dhf.py\n+++ b/pyscf/scf/test/test_dhf.py\n@@ -250,11 +250,17 @@ def test_gaunt(self):\n n4c = erig.shape[0]\n numpy.random.seed(1)\n dm = numpy.random.random((2,n4c,n4c))+numpy.random.random((2,n4c,n4c))*1j\n- dm = dm + dm.transpose(0,2,1).conj()\n c1 = .5 / lib.param.LIGHT_SPEED\n vj0 = -numpy.einsum('ijkl,xlk->xij', erig, dm) * c1**2\n vk0 = -numpy.einsum('ijkl,xjk->xil', erig, dm) * c1**2\n+ vj1, vk1 = scf.dhf._call_veff_gaunt_breit(h4, dm, hermi=0)\n+ self.assertAlmostEqual(abs(vj0 - vj1).max(), 0, 12)\n+ self.assertAlmostEqual(abs(vk0 - vk1).max(), 0, 12)\n \n+ dm = dm + dm.transpose(0,2,1).conj()\n+ c1 = .5 / lib.param.LIGHT_SPEED\n+ vj0 = -numpy.einsum('ijkl,xlk->xij', erig, dm) * c1**2\n+ vk0 = -numpy.einsum('ijkl,xjk->xil', erig, dm) * c1**2\n vj1, vk1 = scf.dhf._call_veff_gaunt_breit(h4, dm)\n self.assertTrue(numpy.allclose(vj0, vj1))\n self.assertTrue(numpy.allclose(vk0, vk1))\n@@ -279,11 +285,17 @@ def test_breit_high_cost(self):\n n4c = erig.shape[0]\n numpy.random.seed(1)\n dm = numpy.random.random((n4c,n4c))+numpy.random.random((n4c,n4c))*1j\n+ c1 = .5 / lib.param.LIGHT_SPEED\n+ vj0 = -numpy.einsum('ijkl,xlk->xij', erig, dm) * c1**2\n+ vk0 = -numpy.einsum('ijkl,xjk->xil', erig, dm) * c1**2\n+ vj1, vk1 = scf.dhf._call_veff_gaunt_breit(h4, dm, hermi=0)\n+ self.assertAlmostEqual(abs(vj0 - vj1).max(), 0, 12)\n+ self.assertAlmostEqual(abs(vk0 - vk1).max(), 0, 12)\n+\n dm = dm + dm.T.conj()\n c1 = .5 / lib.param.LIGHT_SPEED\n vj0 = numpy.einsum('ijkl,lk->ij', erig, dm) * c1**2\n vk0 = numpy.einsum('ijkl,jk->il', erig, dm) * c1**2\n-\n vj1, vk1 = scf.dhf._call_veff_gaunt_breit(h4, dm, with_breit=True)\n self.assertTrue(numpy.allclose(vj0, vj1))\n self.assertTrue(numpy.allclose(vk0, vk1))\n@@ -325,23 +337,22 @@ def _fill_gaunt(mol, erig):\n eri0 = numpy.zeros((n4c,n4c,n4c,n4c), dtype=numpy.complex128)\n eri0[:n2c,n2c:,:n2c,n2c:] = erig # ssp1ssp2\n \n- eri2 = erig.take(idx,axis=0).take(idx,axis=1) # sps1ssp2\n+ eri2 = erig[idx[:,None],idx] # sps1ssp2\n eri2[sign_mask,:] *= -1\n eri2[:,sign_mask] *= -1\n eri2 = -eri2.transpose(1,0,2,3)\n eri0[n2c:,:n2c,:n2c,n2c:] = eri2\n \n- eri2 = erig.take(idx,axis=2).take(idx,axis=3) # ssp1sps2\n+ eri2 = erig[:,:,idx[:,None],idx] # ssp1sps2\n eri2[:,:,sign_mask,:] *= -1\n eri2[:,:,:,sign_mask] *= -1\n eri2 = -eri2.transpose(0,1,3,2)\n #self.assertTrue(numpy.allclose(eri0, eri2))\n eri0[:n2c,n2c:,n2c:,:n2c] = eri2\n \n- eri2 = erig.take(idx,axis=0).take(idx,axis=1)\n- eri2 = eri2.take(idx,axis=2).take(idx,axis=3) # sps1sps2\n- eri2 = eri2.transpose(1,0,2,3)\n- eri2 = eri2.transpose(0,1,3,2)\n+ eri2 = erig[idx[:,None],idx]\n+ eri2 = eri2[:,:,idx[:,None],idx] # sps1sps2\n+ eri2 = eri2.transpose(1,0,3,2)\n eri2[sign_mask,:] *= -1\n eri2[:,sign_mask] *= -1\n eri2[:,:,sign_mask,:] *= -1\n", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}159{"question_id": "MSB_pyscf_pyscf_pr2871", "question_type": "multi_swe_bench", "description": "Add NLC response function for GKS (pyscf/pyscf#2871)", "content": {"org": "pyscf", "repo": "pyscf", "pr_number": 2871, "issue_title": "Add NLC response function for GKS", "issue_body": "fix #2863", "base_commit": "142756584ed3963728cc1f6823286f4605811a6c", "resolved_issues": [{"number": 2863, "title": "[FEATURE REQUEST] Nonlocal corrections and GKS", "body": "Hello! \n\nI would like to run GKS with the VV10 dispersion correction. However, I get the error \"NotImplementedError: NLC\" from the `_gen_ghf_response` function in scf/_response_functions.py. Is there any way to include VV10 for use with the GKS module? Or has VV10 only been developed for RKS and UKS thus far?\n\nThank you!"}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/pyscf_m_pyscf:pr-2871", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/pyscf/dft/numint2c.py b/pyscf/dft/numint2c.py\nindex f34bc6b892..0daadda128 100644\n--- a/pyscf/dft/numint2c.py\n+++ b/pyscf/dft/numint2c.py\n@@ -679,8 +679,8 @@ def nr_nlc_vxc(self, mol, grids, xc_code, dm, spin=0, relativity=0, hermi=1,\n n, exc, v = ni.nr_nlc_vxc(mol, grids, xc_code, dm_a+dm_b, relativity,\n hermi, max_memory, verbose)\n vmat = np.zeros_like(dm)\n- vmat[:nao,:nao] = v[0]\n- vmat[nao:,nao:] = v[1]\n+ vmat[:nao,:nao] = v\n+ vmat[nao:,nao:] = v\n return n, exc, vmat\n \n @lib.with_doc(numint.nr_rks_fxc.__doc__)\ndiff --git a/pyscf/hessian/rks.py b/pyscf/hessian/rks.py\nindex 554bdd2f1f..b559c6d7e8 100644\n--- a/pyscf/hessian/rks.py\n+++ b/pyscf/hessian/rks.py\n@@ -1849,19 +1849,20 @@ def get_vnlc_resp(mf, mol, mo_coeff, mo_occ, dm1s, max_memory):\n \n TODO: check the effect of different grid, using mf.nlcgrids right now\n \"\"\"\n- if mo_coeff.ndim == 2:\n+ if isinstance(mo_coeff, numpy.ndarray) and mo_coeff.ndim == 2:\n mocc = mo_coeff[:,mo_occ>0]\n mo_occ = mo_occ[mo_occ > 0]\n dm0 = (mocc * mo_occ) @ mocc.T\n else:\n- assert mo_coeff.ndim == 3 # unrestricted case\n- assert mo_coeff.shape[0] == 2\n- assert mo_occ.shape[0] == 2\n+ assert mo_coeff[0].ndim == 2 # unrestricted case\n+ assert len(mo_coeff) == 2\n+ assert len(mo_occ) == 2\n mocc_a = mo_coeff[0][:, mo_occ[0] > 0]\n mocc_b = mo_coeff[1][:, mo_occ[1] > 0]\n- mo_occ_a = mo_occ[0, mo_occ[0] > 0]\n- mo_occ_b = mo_occ[1, mo_occ[1] > 0]\n+ mo_occ_a = mo_occ[0][mo_occ[0] > 0]\n+ mo_occ_b = mo_occ[1][mo_occ[1] > 0]\n dm0 = (mocc_a * mo_occ_a) @ mocc_a.T + (mocc_b * mo_occ_b) @ mocc_b.T\n+ dm0 = numpy.asarray(dm0.real, order='C')\n \n output_in_2d = False\n if dm1s.ndim == 2:\ndiff --git a/pyscf/scf/_response_functions.py b/pyscf/scf/_response_functions.py\nindex fd7f458e48..df75029caa 100644\n--- a/pyscf/scf/_response_functions.py\n+++ b/pyscf/scf/_response_functions.py\n@@ -267,8 +267,6 @@ def _gen_ghf_response(mf, mo_coeff=None, mo_occ=None,\n ni = mf._numint\n assert isinstance(ni, (numint2c.NumInt2C, r_numint.RNumInt))\n ni.libxc.test_deriv_order(mf.xc, 2, raise_error=True)\n- if with_nlc and mf.do_nlc():\n- raise NotImplementedError('NLC')\n omega, alpha, hyb = ni.rsh_and_hybrid_coeff(mf.xc, mol.spin)\n hybrid = ni.libxc.is_hybrid_xc(mf.xc)\n \n@@ -288,6 +286,20 @@ def vind(dm1):\n else:\n v1 = ni.get_fxc(mol, mf.grids, mf.xc, dm0, dm1, 0, 0, hermi,\n rho0, vxc, fxc, max_memory=max_memory)\n+ if with_nlc and mf.do_nlc():\n+ from pyscf.hessian.rks import get_vnlc_resp\n+ nao = mo_coeff.shape[0] // 2\n+ dm1_sf = dm1[...,:nao,:nao] + dm1[...,nao:,nao:]\n+ mo_uks = [mo_coeff[:nao], mo_coeff[nao:]]\n+ mo_occ_uks = [mo_occ, mo_occ]\n+ # The get_vnlc_resp function uses mf._numint and explicitly\n+ # calls the NumInt functions for mf._numint\n+ ni1c = mf._numint._to_numint1c()\n+ with lib.temporary_env(mf, _numint=ni1c):\n+ vxc_nlc = get_vnlc_resp(mf, mol, mo_uks, mo_occ_uks,\n+ dm1_sf.real, max_memory)\n+ v1[...,:nao,:nao] += vxc_nlc\n+ v1[...,nao:,nao:] += vxc_nlc\n if not hybrid:\n if with_j:\n vj = mf.get_j(mol, dm1, hermi=hermi)\n"}, "test": {"test_patch": "diff --git a/pyscf/dft/test/test_gks.py b/pyscf/dft/test/test_gks.py\nindex 4a0ca4662f..07e59ab464 100644\n--- a/pyscf/dft/test/test_gks.py\n+++ b/pyscf/dft/test/test_gks.py\n@@ -15,6 +15,7 @@\n \n import unittest\n import numpy\n+import scipy.linalg\n from pyscf import gto\n from pyscf import lib\n from pyscf.dft import numint, numint2c, libxc, radi\ndiff --git a/pyscf/dft/test/test_h2o.py b/pyscf/dft/test/test_h2o.py\nindex 585239bdb6..aa55453984 100644\n--- a/pyscf/dft/test/test_h2o.py\n+++ b/pyscf/dft/test/test_h2o.py\n@@ -15,6 +15,7 @@\n \n import unittest\n import numpy\n+import scipy.linalg\n from pyscf import gto\n from pyscf import lib\n from pyscf import dft\n@@ -371,32 +372,34 @@ def test_nr_rks_nlc(self):\n method = dft.RKS(h2o)\n dm = method.get_init_guess()\n method.xc = 'wB97M_V'\n+ method.nlcgrids.level = 0\n vxc = method.get_veff(h2o, dm)\n- self.assertAlmostEqual(lib.fp(vxc), 22.767792068559917, 8)\n+ self.assertAlmostEqual(lib.fp(vxc), 22.767790354129247, 8)\n \n method.xc = 'B97M_V'\n vxc = method.get_veff(h2o, dm, dm, vxc)\n- self.assertAlmostEqual(lib.fp(vxc), 23.067046560473408, 8)\n+ self.assertAlmostEqual(lib.fp(vxc), 23.06704484604275, 8)\n \n method.nlc = False\n assert method.do_nlc() == False\n vxc = method.get_veff(h2o, dm, dm, vxc)\n self.assertAlmostEqual(lib.fp(vxc), 23.05881308880983, 8)\n \n- def test_nr_rks_nlc_small_memory_high_cost(self):\n+ def test_nr_rks_nlc_small_memory(self):\n method = dft.RKS(h2o)\n dm = method.get_init_guess()\n method._eri = None\n method.max_memory = 0\n method.xc = 'wB97M_V'\n+ method.nlcgrids.level = 0\n vxc = method.get_veff(h2o, dm)\n- self.assertAlmostEqual(lib.fp(vxc), 22.767792068559917, 8)\n+ self.assertAlmostEqual(lib.fp(vxc), 22.767790354129247, 8)\n \n method._eri = None\n method.max_memory = 0\n method.xc = 'B97M_V'\n vxc = method.get_veff(h2o, dm, dm, vxc)\n- self.assertAlmostEqual(lib.fp(vxc), 23.067046560473408, 8)\n+ self.assertAlmostEqual(lib.fp(vxc), 23.06704484604275, 8)\n \n def test_nr_rks_rsh_cart_high_cost(self):\n mol1 = h2o.copy()\n@@ -417,37 +420,39 @@ def test_nr_uks_rsh(self):\n self.assertAlmostEqual(lib.fp(vxc[0]), 23.16975737295899, 8)\n self.assertAlmostEqual(lib.fp(vxc[1]), 23.16975737295899, 8)\n \n- def test_nr_uks_nlc_high_cost(self):\n+ def test_nr_uks_nlc(self):\n method = dft.UKS(h2o)\n dm = method.get_init_guess()\n dm = (dm[0], dm[0])\n method.xc = 'wB97M_V'\n+ method.nlcgrids.level = 0\n vxc = method.get_veff(h2o, dm)\n- self.assertAlmostEqual(lib.fp(vxc[0]), 22.767792068559917, 8)\n- self.assertAlmostEqual(lib.fp(vxc[1]), 22.767792068559917, 8)\n+ self.assertAlmostEqual(lib.fp(vxc[0]), 22.767790354129247, 8)\n+ self.assertAlmostEqual(lib.fp(vxc[1]), 22.767790354129247, 8)\n \n method.xc = 'B97M_V'\n vxc = method.get_veff(h2o, dm, dm, vxc)\n- self.assertAlmostEqual(lib.fp(vxc[0]), 23.067046560473408, 8)\n- self.assertAlmostEqual(lib.fp(vxc[1]), 23.067046560473408, 8)\n+ self.assertAlmostEqual(lib.fp(vxc[0]), 23.06704484604275, 8)\n+ self.assertAlmostEqual(lib.fp(vxc[1]), 23.06704484604275, 8)\n \n- def test_nr_uks_nlc_small_memory_high_cost(self):\n+ def test_nr_uks_nlc_small_memory(self):\n method = dft.UKS(h2o)\n dm = method.get_init_guess()\n dm = (dm[0], dm[0])\n method._eri = None\n method.max_memory = 0\n method.xc = 'wB97M_V'\n+ method.nlcgrids.level = 0\n vxc = method.get_veff(h2o, dm)\n- self.assertAlmostEqual(lib.fp(vxc[0]), 22.767792068559917, 8)\n- self.assertAlmostEqual(lib.fp(vxc[1]), 22.767792068559917, 8)\n+ self.assertAlmostEqual(lib.fp(vxc[0]), 22.767790354129247, 8)\n+ self.assertAlmostEqual(lib.fp(vxc[1]), 22.767790354129247, 8)\n \n method._eri = None\n method.max_memory = 0\n method.xc = 'B97M_V'\n vxc = method.get_veff(h2o, dm, dm, vxc)\n- self.assertAlmostEqual(lib.fp(vxc[0]), 23.067046560473408, 8)\n- self.assertAlmostEqual(lib.fp(vxc[1]), 23.067046560473408, 8)\n+ self.assertAlmostEqual(lib.fp(vxc[0]), 23.06704484604275, 8)\n+ self.assertAlmostEqual(lib.fp(vxc[1]), 23.06704484604275, 8)\n \n def test_nr_gks_rsh(self):\n method = dft.GKS(h2o)\n@@ -458,35 +463,26 @@ def test_nr_gks_rsh(self):\n vxc = method.get_veff(h2o, dm)\n self.assertAlmostEqual(lib.fp(vxc), 5.115622298912124+0j, 8)\n \n- def test_nr_gks_nlc_high_cost(self):\n+ def test_nr_gks_nlc(self):\n method = dft.GKS(h2o)\n dm = method.get_init_guess()\n dm = dm + numpy.sin(dm)*.02j\n dm = dm + dm.conj().T\n method.xc = 'wB97M_V'\n+ method.nlcgrids.level = 0\n vxc = method.get_veff(h2o, dm)\n- self.assertAlmostEqual(lib.fp(vxc), 3.172920887028461+0j, 8)\n-\n+ self.assertAlmostEqual(lib.fp(vxc), 3.17466829111814+0j, 8)\n method.xc = 'B97M_V'\n vxc = method.get_veff(h2o, dm)\n- self.assertAlmostEqual(lib.fp(vxc), 2.0041673361905317+0j, 8)\n-\n- def test_nr_gks_nlc_small_memory_high_cost(self):\n- method = dft.GKS(h2o)\n- dm = method.get_init_guess()\n- dm = dm + numpy.sin(dm)*.02j\n- dm = dm + dm.conj().T\n- method._eri = None\n- method.max_memory = 0\n- method.xc = 'wB97M_V'\n- vxc = method.get_veff(h2o, dm)\n- self.assertAlmostEqual(lib.fp(vxc), 3.172920887028461+0j, 8)\n-\n- method._eri = None\n- method.max_memory = 0\n- method.xc = 'B97M_V'\n- vxc = method.get_veff(h2o, dm, dm, vxc)\n- self.assertAlmostEqual(lib.fp(vxc), 2.0041673361905317+0j, 8)\n+ self.assertAlmostEqual(lib.fp(vxc), 2.00591474028017+0j, 8)\n+\n+ mf = h2o_cation.UKS(xc='wb97mv')\n+ mf.nlcgrids.level = 0\n+ dm = mf.get_init_guess()\n+ ref = scipy.linalg.block_diag(*mf.get_veff(h2o_cation, dm))\n+ mf_gks = mf.to_gks()\n+ vxc = mf_gks.get_veff(h2o_cation, scipy.linalg.block_diag(*dm))\n+ self.assertAlmostEqual(abs(vxc - ref).max(), 0, 12)\n \n def test_nr_rks_vv10_high_cost(self):\n method = dft.RKS(h2o)\ndiff --git a/pyscf/scf/test/test_response_function.py b/pyscf/scf/test/test_response_function.py\nnew file mode 100644\nindex 0000000000..0874b0a035\n--- /dev/null\n+++ b/pyscf/scf/test/test_response_function.py\n@@ -0,0 +1,52 @@\n+#!/usr/bin/env python\n+# Copyright 2025 The PySCF Developers. All Rights Reserved.\n+#\n+# Licensed under the Apache License, Version 2.0 (the \"License\");\n+# you may not use this file except in compliance with the License.\n+# You may obtain a copy of the License at\n+#\n+# http://www.apache.org/licenses/LICENSE-2.0\n+#\n+# Unless required by applicable law or agreed to in writing, software\n+# distributed under the License is distributed on an \"AS IS\" BASIS,\n+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n+# See the License for the specific language governing permissions and\n+# limitations under the License.\n+\n+import unittest\n+import numpy as np\n+import scipy.linalg\n+from pyscf import lib\n+from pyscf import gto\n+from pyscf.scf import _response_functions\n+\n+class KnownValues(unittest.TestCase):\n+ def test_gks_nlc(self):\n+ mol = gto.M(\n+ verbose = 5,\n+ output = '/dev/null',\n+ atom = [\n+ [\"O\" , (0. , 0. , 0.)],\n+ [1 , (0. , -0.757 , 0.587)],\n+ [1 , (0. , 0.757 , 0.587)]],\n+ charge = 1,\n+ spin = 1,\n+ basis = '631g')\n+ nao = mol.nao\n+ mf_uks = mol.UHF().run().to_uks()\n+ mf_uks.xc = 'wb97mv'\n+ mf_uks.nlcgrids.level = 0\n+\n+ dm = mf_uks.make_rdm1()\n+ dm1 = np.random.rand(2, nao, nao)\n+ vind = mf_uks.gen_response(with_nlc=True)\n+ ref = scipy.linalg.block_diag(*vind(dm1))\n+\n+ mf_gks = mf_uks.to_gks()\n+ vind = mf_gks.gen_response(with_nlc=True)\n+ v = vind(scipy.linalg.block_diag(*dm1))\n+ self.assertAlmostEqual(abs(v - ref).max(), 0, 12)\n+\n+if __name__ == \"__main__\":\n+ print(\"Full Tests for response_functions\")\n+ unittest.main()\n", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}160{"question_id": "MSB_pyscf_pyscf_pr2886", "question_type": "multi_swe_bench", "description": "Add frozen orbital support for tdscf (pyscf/pyscf#2886)", "content": {"org": "pyscf", "repo": "pyscf", "pr_number": 2886, "issue_title": "Add frozen orbital support for tdscf", "issue_body": "This addresses #2853 ... I *think* it's correct, but another developer should give it a careful review.\r\n\r\nI added support for frozen orbitals to all TDSCF methods except `dhf`/`dks`. If support for those methods is of interest, perhaps I or someone else can add it later.\r\n\r\nThe main breaking change here is that the signature of `_get_x_sym_table()` has changed: it now takes an instance of a `td` object instead of `mf`, because it needs access to the frozen mask. Since it's an implied private function with its leading underscore, I assume this change isn't an issue.", "base_commit": "9eb16fd4b0ea94624ec3d3b6824936baeb8c8b7e", "resolved_issues": [{"number": 2853, "title": "[FEATURE REQUEST] Interest in core-valence separation for TDSCF?", "body": "**Describe the feature you'd like to see implemented**\nI would like to add core-valence separation for TDSCF calculations in PySCF. I have working code but it's in plugin form.\n\n**Is your feature request related to a scientific problem? Please describe.**\nComputing core-level spectra greatly benefits from the core-valence separation. Excitations out of core orbitals can be approximated well by practically limiting the occupied space to those selected core orbitals. This can massively decrease computation time and memory use. \n\n**Describe alternatives you've considered**\nI've already written a [plugin](https://github.com/NathanGillispie/core-spec-pyscf/) and tests for RHF, UHF, GHF and the KS counterparts; but it's been a nightmare getting the monkeypatching to work the way I want it to. It would just be far better to implement directly in the source.\n\n**Additional context**\nSo far, it works by literally deleting the non-core occupied MO coefficients, energies, and occupation numbers. It's not a great solution, but PySCF doesn't have a consistent method of determining which orbitals are occupied and which are virtual. \n\nPerhaps another solution would be to have public `occ_idx` and `virt_idx` attributes in the TD object to avoid this issue? I don't mind submiting a PR, but I don't want to edit the source if there is no interest.\n\n\n### Minimal API referenced by tests (typed signatures)\n_Added only when tests call brand\u2011new symbols introduced by the fix; types reflect annotations present in the repo or `Unknown` if not annotated._\n\n- Function in `pyscf/tdscf/__init__.py`: `def TDA(mf, frozen) -> Union[tdscf.rhf.TDA, tdscf.uhf.TDA]: ...`\n **Inputs:** mf: Union[scf.RHF, scf.UHF, scf.RKS, scf.UKS, dft.RKS, dft.UKS], frozen: Union[int, list, tuple]\n **Output:** Union[tdscf.rhf.TDA, tdscf.uhf.TDA]\n\n- Function in `pyscf/tdscf/rhf.py`: `def get_frozen_mask(td) -> numpy.ndarray: ...`\n **Inputs:** td: Union[tdscf.rhf.TDHF, tdscf.uhf.TDUHF]\n **Output:** numpy.ndarray\n\n- Function in `pyscf/tdscf/uhf.py`: `def get_frozen_mask(td) -> numpy.ndarray: ...`\n **Inputs:** td: Union[tdscf.rhf.TDHF, tdscf.uhf.TDUHF]\n **Output:** numpy.ndarray\n\n```python\ndef TDA(mf, frozen) -> Union[tdscf.rhf.TDA, tdscf.uhf.TDA]: ...\ndef get_frozen_mask(td) -> numpy.ndarray: ...\ndef get_frozen_mask(td) -> numpy.ndarray: ...\n```"}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/pyscf_m_pyscf:pr-2886", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/examples/tddft/06-frozen.py b/examples/tddft/06-frozen.py\nnew file mode 100644\nindex 0000000000..b89fc9fc4d\n--- /dev/null\n+++ b/examples/tddft/06-frozen.py\n@@ -0,0 +1,51 @@\n+#!/usr/bin/env python\n+\n+'''\n+A few examples to run TDDFT calculations with frozen orbitals.\n+'''\n+\n+from pyscf import gto, dft, tddft\n+\n+mol = gto.Mole()\n+mol.build(\n+ atom = 'H 0 0 0; F 0 0 1.1', # in Angstrom\n+ basis = '631g',\n+ symmetry = True,\n+)\n+\n+mf = dft.RKS(mol)\n+mf.xc = 'b3lyp'\n+mf.kernel()\n+\n+mytd = tddft.TDDFT(mf)\n+mytd.kernel()\n+mytd.analyze()\n+\n+# Freeze the core\n+mytd = tddft.TDDFT(mf, frozen=1)\n+mytd.kernel()\n+mytd.analyze()\n+\n+# Freeze high energy virtuals\n+mytd = tddft.TDDFT(mf, frozen=[9, 10])\n+mytd.kernel()\n+mytd.analyze()\n+\n+# Freeze valence (CVS) to access core spectra\n+mytd = tddft.TDDFT(mf, frozen=[1, 2, 3, 4])\n+mytd.kernel()\n+mytd.analyze()\n+\n+# UKS\n+\n+mol.spin = 2\n+mol.symmetry = False\n+mol.build()\n+mf = dft.UKS(mol)\n+mf.xc = 'b3lyp'\n+mf.kernel()\n+\n+# Freeze the core\n+mytd = tddft.TDDFT(mf, frozen=1)\n+mytd.kernel()\n+mytd.analyze()\ndiff --git a/examples/tddft/21-matrix_A_B.py b/examples/tddft/21-matrix_A_B.py\nindex 176da238b8..317d8e0d6e 100644\n--- a/examples/tddft/21-matrix_A_B.py\n+++ b/examples/tddft/21-matrix_A_B.py\n@@ -43,6 +43,24 @@ def diagonalize(a, b, nroots=5):\n print('Direct diagoanlization:', diagonalize(a, b))\n print('Reference:', tddft.TDDFT(mf).kernel(nstates=5)[0])\n \n+#\n+# with frozen orbitals\n+#\n+frozen = 1\n+mf = scf.RHF(mol).run()\n+a, b = tddft.TDHF(mf, frozen).get_ab()\n+print('Direct diagoanlization:', diagonalize(a, b))\n+print('Reference:', tddft.TDHF(mf, frozen).kernel(nstates=5)[0])\n+\n+mf = dft.RKS(mol).run(xc='lda,vwn')\n+a, b = tddft.TDDFT(mf, frozen).get_ab()\n+print('Direct diagoanlization:', diagonalize(a, b))\n+print('Reference:', tddft.TDDFT(mf, frozen).kernel(nstates=5)[0])\n+\n+mf = dft.RKS(mol).run(xc='b3lyp')\n+a, b = tddft.TDDFT(mf, frozen).get_ab()\n+print('Direct diagoanlization:', diagonalize(a, b))\n+print('Reference:', tddft.TDDFT(mf, frozen).kernel(nstates=5)[0])\n \n #\n # UHF/UKS-TDDFT\n@@ -81,3 +99,22 @@ def diagonalize(a, b, nroots=4):\n a, b = tddft.TDDFT(mf).get_ab()\n print('Direct diagoanlization:', diagonalize(a, b))\n print('Reference:', tddft.TDDFT(mf).kernel(nstates=4)[0])\n+\n+#\n+# with frozen orbitals\n+#\n+frozen = 1\n+mf = scf.UHF(mol).run()\n+a, b = tddft.TDHF(mf, frozen).get_ab()\n+print('Direct diagoanlization:', diagonalize(a, b))\n+print('Reference:', tddft.TDHF(mf, frozen).kernel(nstates=4)[0])\n+\n+mf = dft.UKS(mol).run(xc='lda,vwn')\n+a, b = tddft.TDDFT(mf, frozen).get_ab()\n+print('Direct diagoanlization:', diagonalize(a, b))\n+print('Reference:', tddft.TDDFT(mf, frozen).kernel(nstates=4)[0])\n+\n+mf = dft.UKS(mol).run(xc='b3lyp')\n+a, b = tddft.TDDFT(mf, frozen).get_ab()\n+print('Direct diagoanlization:', diagonalize(a, b))\n+print('Reference:', tddft.TDDFT(mf, frozen).kernel(nstates=4)[0])\ndiff --git a/pyscf/grad/tdrhf.py b/pyscf/grad/tdrhf.py\nindex d4b8cff474..6ca07c69ff 100644\n--- a/pyscf/grad/tdrhf.py\n+++ b/pyscf/grad/tdrhf.py\n@@ -45,6 +45,8 @@ def grad_elec(td_grad, x_y, singlet=True, atmlst=None,\n log = logger.new_logger(td_grad, verbose)\n time0 = logger.process_clock(), logger.perf_counter()\n \n+ assert td_grad.base.frozen is None\n+\n mol = td_grad.mol\n mf = td_grad.base._scf\n mo_coeff = mf.mo_coeff\ndiff --git a/pyscf/grad/tdrks.py b/pyscf/grad/tdrks.py\nindex eab9f88e19..d8c60d6705 100644\n--- a/pyscf/grad/tdrks.py\n+++ b/pyscf/grad/tdrks.py\n@@ -49,6 +49,8 @@ def grad_elec(td_grad, x_y, singlet=True, atmlst=None,\n log = logger.new_logger(td_grad, verbose)\n time0 = logger.process_clock(), logger.perf_counter()\n \n+ assert td_grad.base.frozen is None\n+\n mol = td_grad.mol\n mf = td_grad.base._scf\n mo_coeff = mf.mo_coeff\ndiff --git a/pyscf/pbc/tdscf/rhf.py b/pyscf/pbc/tdscf/rhf.py\nindex 8923fca076..b35e0a85d5 100644\n--- a/pyscf/pbc/tdscf/rhf.py\n+++ b/pyscf/pbc/tdscf/rhf.py\n@@ -139,8 +139,8 @@ def add_hf_(a, b, hyb=1):\n class TDBase(rhf.TDBase):\n _keys = {'cell'}\n \n- def __init__(self, mf):\n- rhf.TDBase.__init__(self, mf)\n+ def __init__(self, mf, frozen=None):\n+ rhf.TDBase.__init__(self, mf, frozen)\n self.cell = mf.cell\n \n def get_ab(self, mf=None):\ndiff --git a/pyscf/pbc/tdscf/rks.py b/pyscf/pbc/tdscf/rks.py\nindex e204fde334..fa4181724e 100644\n--- a/pyscf/pbc/tdscf/rks.py\n+++ b/pyscf/pbc/tdscf/rks.py\n@@ -32,13 +32,13 @@ class CasidaTDDFT(TDDFT):\n \n TDDFTNoHybrid = CasidaTDDFT\n \n-def tddft(mf):\n+def tddft(mf, frozen=None):\n '''Driver to create TDDFT or CasidaTDDFT object'''\n kpt = getattr(mf, 'kpt', None)\n if not mf._numint.libxc.is_hybrid_xc(mf.xc) and gamma_point(kpt):\n- return CasidaTDDFT(mf)\n+ return CasidaTDDFT(mf, frozen)\n else:\n- return TDDFT(mf)\n+ return TDDFT(mf, frozen)\n \n dft.rks.RKS.TDA = lib.class_as_method(rhf.TDA)\n dft.rks.RKS.TDHF = None\ndiff --git a/pyscf/pbc/tdscf/uhf.py b/pyscf/pbc/tdscf/uhf.py\nindex 9304d131bb..85c77a20c3 100644\n--- a/pyscf/pbc/tdscf/uhf.py\n+++ b/pyscf/pbc/tdscf/uhf.py\n@@ -242,6 +242,8 @@ def get_ab(self, mf=None):\n _gen_vind = uhf.TDA.gen_vind\n gen_vind = td_rhf.TDA.gen_vind\n \n+ get_frozen_mask = uhf.TDA.get_frozen_mask\n+\n CIS = TDA\n \n \n@@ -256,6 +258,8 @@ class TDHF(TDBase):\n _gen_vind = uhf.TDHF.gen_vind\n gen_vind = td_rhf.TDA.gen_vind\n \n+ get_frozen_mask = uhf.TDHF.get_frozen_mask\n+\n RPA = TDUHF = TDHF\n \n \ndiff --git a/pyscf/pbc/tdscf/uks.py b/pyscf/pbc/tdscf/uks.py\nindex 01b94b546a..39d05b1ac6 100644\n--- a/pyscf/pbc/tdscf/uks.py\n+++ b/pyscf/pbc/tdscf/uks.py\n@@ -33,12 +33,12 @@ class CasidaTDDFT(TDDFT):\n \n TDDFTNoHybrid = CasidaTDDFT\n \n-def tddft(mf):\n+def tddft(mf, frozen=None):\n '''Driver to create TDDFT or CasidaTDDFT object'''\n if mf._numint.libxc.is_hybrid_xc(mf.xc):\n- return TDDFT(mf)\n+ return TDDFT(mf, frozen)\n else:\n- return CasidaTDDFT(mf)\n+ return CasidaTDDFT(mf, frozen)\n \n dft.uks.UKS.TDA = lib.class_as_method(TDA)\n dft.uks.UKS.TDHF = None\ndiff --git a/pyscf/tdscf/__init__.py b/pyscf/tdscf/__init__.py\nindex 5435eeb303..c522130e3e 100644\n--- a/pyscf/tdscf/__init__.py\n+++ b/pyscf/tdscf/__init__.py\n@@ -37,53 +37,53 @@\n pass\n \n \n-def TDHF(mf):\n+def TDHF(mf, frozen=None):\n if isinstance(mf, scf.hf.KohnShamDFT):\n raise RuntimeError('TDHF does not support DFT object %s' % mf)\n mf = mf.remove_soscf()\n if isinstance(mf, scf.rohf.ROHF):\n # Is it correct to call TDUHF for ROHF?\n mf = mf.to_uhf()\n- return mf.TDHF()\n+ return mf.TDHF(frozen)\n \n-def TDA(mf):\n+def TDA(mf, frozen=None):\n mf = mf.remove_soscf()\n if isinstance(mf, scf.rohf.ROHF):\n if isinstance(mf, KohnShamDFT):\n mf = mf.to_uks()\n else:\n mf = mf.to_uhf()\n- return mf.TDA()\n+ return mf.TDA(frozen)\n \n-def TDDFT(mf):\n+def TDDFT(mf, frozen=None):\n if isinstance(mf, KohnShamDFT):\n mf = mf.remove_soscf()\n if isinstance(mf, scf.rohf.ROHF):\n mf = mf.to_uks()\n- return mf.TDDFT()\n+ return mf.TDDFT(frozen)\n else:\n- return TDHF(mf)\n+ return TDHF(mf, frozen)\n \n TD = TDDFT\n \n \n-def RPA(mf):\n- return TDDFT(mf)\n+def RPA(mf, frozen=None):\n+ return TDDFT(mf, frozen)\n \n-def dRPA(mf):\n+def dRPA(mf, frozen=None):\n mf = mf.remove_soscf()\n if isinstance(mf, scf.rohf.ROHF):\n if isinstance(mf, KohnShamDFT):\n mf = mf.to_uks()\n else:\n mf = mf.to_uhf()\n- return mf.dRPA()\n+ return mf.dRPA(frozen)\n \n-def dTDA(mf):\n+def dTDA(mf, frozen=None):\n mf = mf.remove_soscf()\n if isinstance(mf, scf.rohf.ROHF):\n if isinstance(mf, KohnShamDFT):\n mf = mf.to_uks()\n else:\n mf = mf.to_uhf()\n- return mf.dTDA()\n+ return mf.dTDA(frozen)\ndiff --git a/pyscf/tdscf/ghf.py b/pyscf/tdscf/ghf.py\nindex e32b8da1a9..726baf899f 100644\n--- a/pyscf/tdscf/ghf.py\n+++ b/pyscf/tdscf/ghf.py\n@@ -54,9 +54,10 @@ def _gen_tda_operation(td, fock_ao=None, wfnsym=None):\n assert fock_ao is None\n mf = td._scf\n mol = mf.mol\n- mo_coeff = mf.mo_coeff\n- mo_energy = mf.mo_energy\n- mo_occ = mf.mo_occ\n+ mask = td.get_frozen_mask()\n+ mo_coeff = mf.mo_coeff[:, mask]\n+ mo_energy = mf.mo_energy[mask]\n+ mo_occ = mf.mo_occ[mask]\n nao, nmo = mo_coeff.shape\n occidx = numpy.where(mo_occ == 1)[0]\n viridx = numpy.where(mo_occ == 0)[0]\n@@ -69,7 +70,7 @@ def _gen_tda_operation(td, fock_ao=None, wfnsym=None):\n if isinstance(wfnsym, str):\n wfnsym = symm.irrep_name2id(mol.groupname, wfnsym)\n wfnsym = wfnsym % 10 # convert to D2h subgroup\n- sym_forbid = _get_x_sym_table(mf) != wfnsym\n+ sym_forbid = _get_x_sym_table(td) != wfnsym\n \n e_ia = hdiag = mo_energy[viridx] - mo_energy[occidx,None]\n if wfnsym is not None and mol.symmetry:\n@@ -95,15 +96,17 @@ def vind(zs):\n \n return vind, hdiag\n \n-def _get_x_sym_table(mf):\n+def _get_x_sym_table(td):\n '''Irrep (up to D2h symmetry) of each coefficient in X[nocc,nvir]'''\n+ mf = td._scf\n mol = mf.mol\n- mo_occ = mf.mo_occ\n- orbsym = ghf_symm.get_orbsym(mol, mf.mo_coeff)\n+ mask = td.get_frozen_mask()\n+ mo_occ = mf.mo_occ[mask]\n+ orbsym = ghf_symm.get_orbsym(mol, mf.mo_coeff[:, mask])\n orbsym = numpy.asarray(orbsym) % 10 # convert to D2h irreps\n return orbsym[mo_occ==1,None] ^ orbsym[mo_occ==0]\n \n-def get_ab(mf, mo_energy=None, mo_coeff=None, mo_occ=None):\n+def get_ab(mf, frozen=None, mo_energy=None, mo_coeff=None, mo_occ=None):\n r'''A and B matrices for TDDFT response function.\n \n A[i,a,j,b] = \\delta_{ab}\\delta_{ij}(E_a - E_i) + (ai||jb)\n@@ -113,6 +116,22 @@ def get_ab(mf, mo_energy=None, mo_coeff=None, mo_occ=None):\n if mo_coeff is None: mo_coeff = mf.mo_coeff\n if mo_occ is None: mo_occ = mf.mo_occ\n \n+ mo_coeff0 = numpy.copy(mo_coeff)\n+ mo_occ0 = numpy.copy(mo_occ)\n+\n+ if frozen is not None:\n+ # see get_frozen_mask()\n+ moidx = numpy.ones(mf.mo_occ.size, dtype=bool)\n+ if isinstance(frozen, (int, numpy.integer)):\n+ moidx[:frozen] = False\n+ elif hasattr(frozen, '__len__'):\n+ moidx[list(frozen)] = False\n+ else:\n+ raise NotImplementedError\n+ mo_energy = mo_energy[moidx]\n+ mo_coeff = mo_coeff[:, moidx]\n+ mo_occ = mo_occ[moidx]\n+\n mol = mf.mol\n nmo = mo_occ.size\n nao = mol.nao\n@@ -172,7 +191,7 @@ def add_hf_(a, b, hyb=1):\n b = b.astype(numpy.complex128)\n \n xctype = ni._xc_type(mf.xc)\n- dm0 = mf.make_rdm1(mo_coeff, mo_occ)\n+ dm0 = mf.make_rdm1(mo_coeff0, mo_occ0)\n mem_now = lib.current_memory()[0]\n max_memory = max(2000, mf.max_memory*.8-mem_now)\n \n@@ -383,8 +402,9 @@ def get_init_guess(self, mf, nstates=None, wfnsym=None, return_symmetry=False):\n if nstates is None: nstates = self.nstates\n if wfnsym is None: wfnsym = self.wfnsym\n \n- mo_energy = mf.mo_energy\n- mo_occ = mf.mo_occ\n+ mask = self.get_frozen_mask()\n+ mo_energy = mf.mo_energy[mask]\n+ mo_occ = mf.mo_occ[mask]\n occidx = numpy.where(mo_occ==1)[0]\n viridx = numpy.where(mo_occ==0)[0]\n e_ia = (mo_energy[viridx] - mo_energy[occidx,None]).ravel()\n@@ -392,7 +412,7 @@ def get_init_guess(self, mf, nstates=None, wfnsym=None, return_symmetry=False):\n nstates = min(nstates, nov)\n \n if (wfnsym is not None or return_symmetry) and mf.mol.symmetry:\n- x_sym = _get_x_sym_table(mf).ravel()\n+ x_sym = _get_x_sym_table(self).ravel()\n if wfnsym is not None:\n if isinstance(wfnsym, str):\n wfnsym = symm.irrep_name2id(mf.mol.groupname, wfnsym)\n@@ -444,7 +464,7 @@ def pickeig(w, v, nroots, envs):\n x0, x0sym = self.get_init_guess(\n self._scf, self.nstates, return_symmetry=True)\n elif mol.symmetry:\n- x_sym = _get_x_sym_table(self._scf).ravel()\n+ x_sym = _get_x_sym_table(self).ravel()\n x0sym = [rhf._guess_wfnsym_id(self, x_sym, x) for x in x0]\n \n self.converged, self.e, x1 = lr_eigh(\n@@ -452,8 +472,9 @@ def pickeig(w, v, nroots, envs):\n nroots=nstates, x0sym=x0sym, pick=pickeig, max_cycle=self.max_cycle,\n max_memory=self.max_memory, verbose=log)\n \n- nocc = (self._scf.mo_occ>0).sum()\n- nmo = self._scf.mo_occ.size\n+ mo_occ = self._scf.mo_occ[self.get_frozen_mask()]\n+ nocc = (mo_occ>0).sum()\n+ nmo = mo_occ.size\n nvir = nmo - nocc\n self.xy = [(xi.reshape(nocc,nvir), 0) for xi in x1]\n \n@@ -481,9 +502,10 @@ def gen_tdhf_operation(mf, fock_ao=None, wfnsym=None, with_nlc=True):\n def _gen_tdhf_operation(td, fock_ao=None, wfnsym=None):\n mf = td._scf\n mol = mf.mol\n- mo_coeff = mf.mo_coeff\n- mo_energy = mf.mo_energy\n- mo_occ = mf.mo_occ\n+ mask = td.get_frozen_mask()\n+ mo_coeff = mf.mo_coeff[:, mask]\n+ mo_energy = mf.mo_energy[mask]\n+ mo_occ = mf.mo_occ[mask]\n nao, nmo = mo_coeff.shape\n occidx = numpy.where(mo_occ == 1)[0]\n viridx = numpy.where(mo_occ == 0)[0]\n@@ -496,7 +518,7 @@ def _gen_tdhf_operation(td, fock_ao=None, wfnsym=None):\n if isinstance(wfnsym, str):\n wfnsym = symm.irrep_name2id(mol.groupname, wfnsym)\n wfnsym = wfnsym % 10 # convert to D2h subgroup\n- sym_forbid = _get_x_sym_table(mf) != wfnsym\n+ sym_forbid = _get_x_sym_table(td) != wfnsym\n \n assert fock_ao is None\n \n@@ -591,7 +613,7 @@ def pickeig(w, v, nroots, envs):\n x0, x0sym = self.get_init_guess(\n self._scf, self.nstates, return_symmetry=True)\n elif mol.symmetry:\n- x_sym = y_sym = _get_x_sym_table(self._scf).ravel()\n+ x_sym = y_sym = _get_x_sym_table(self).ravel()\n x_sym = numpy.append(x_sym, y_sym)\n x0sym = [rhf._guess_wfnsym_id(self, x_sym, x) for x in x0]\n \n@@ -600,8 +622,9 @@ def pickeig(w, v, nroots, envs):\n nroots=nstates, x0sym=x0sym, pick=pickeig, max_cycle=self.max_cycle,\n max_memory=self.max_memory, verbose=log)\n \n- nocc = (self._scf.mo_occ>0).sum()\n- nmo = self._scf.mo_occ.size\n+ mo_occ = self._scf.mo_occ[self.get_frozen_mask()]\n+ nocc = (mo_occ>0).sum()\n+ nmo = mo_occ.size\n nvir = nmo - nocc\n self.e = w\n def norm_xy(z):\ndiff --git a/pyscf/tdscf/gks.py b/pyscf/tdscf/gks.py\nindex 4f389b5739..3f2141acaa 100644\n--- a/pyscf/tdscf/gks.py\n+++ b/pyscf/tdscf/gks.py\n@@ -45,10 +45,11 @@ def gen_vind(self, mf=None):\n mf = self._scf\n wfnsym = self.wfnsym\n mol = mf.mol\n- mo_coeff = mf.mo_coeff\n+ mask = self.get_frozen_mask()\n+ mo_coeff = mf.mo_coeff[:, mask]\n assert mo_coeff.dtype == numpy.double\n- mo_energy = mf.mo_energy\n- mo_occ = mf.mo_occ\n+ mo_energy = mf.mo_energy[mask]\n+ mo_occ = mf.mo_occ[mask]\n nao, nmo = mo_coeff.shape\n occidx = numpy.where(mo_occ==1)[0]\n viridx = numpy.where(mo_occ==0)[0]\n@@ -61,7 +62,7 @@ def gen_vind(self, mf=None):\n if isinstance(wfnsym, str):\n wfnsym = symm.irrep_name2id(mol.groupname, wfnsym)\n wfnsym = wfnsym % 10 # convert to D2h subgroup\n- sym_forbid = ghf._get_x_sym_table(mf) != wfnsym\n+ sym_forbid = ghf._get_x_sym_table(self) != wfnsym\n \n e_ia = (mo_energy[viridx].reshape(-1,1) - mo_energy[occidx]).T\n if wfnsym is not None and mol.symmetry:\n@@ -124,7 +125,7 @@ def pickeig(w, v, nroots, envs):\n x0, x0sym = self.get_init_guess(\n self._scf, self.nstates, return_symmetry=True)\n elif mol.symmetry:\n- x_sym = ghf._get_x_sym_table(self._scf).ravel()\n+ x_sym = ghf._get_x_sym_table(self).ravel()\n x0sym = [rhf._guess_wfnsym_id(self, x_sym, x) for x in x0]\n \n self.converged, w2, x1 = lr_eigh(\n@@ -132,8 +133,9 @@ def pickeig(w, v, nroots, envs):\n nroots=nstates, x0sym=x0sym, pick=pickeig, max_cycle=self.max_cycle,\n max_memory=self.max_memory, verbose=log)\n \n- mo_energy = self._scf.mo_energy\n- mo_occ = self._scf.mo_occ\n+ mask = self.get_frozen_mask()\n+ mo_energy = self._scf.mo_energy[mask]\n+ mo_occ = self._scf.mo_occ[mask]\n occidx = numpy.where(mo_occ==1)[0]\n viridx = numpy.where(mo_occ==0)[0]\n e_ia = (mo_energy[viridx,None] - mo_energy[occidx]).T\n@@ -167,14 +169,14 @@ def nuc_grad_method(self):\n TDDFTNoHybrid = CasidaTDDFT\n \n \n-def tddft(mf):\n+def tddft(mf, frozen=None):\n '''Driver to create TDDFT or CasidaTDDFT object'''\n if (not mf._numint.libxc.is_hybrid_xc(mf.xc) and\n # Casida formula can be applied for real orbitals only\n mf.mo_coeff.dtype == numpy.double and mf.collinear[0] != 'm'):\n- return CasidaTDDFT(mf)\n+ return CasidaTDDFT(mf, frozen)\n else:\n- return TDDFT(mf)\n+ return TDDFT(mf, frozen)\n \n from pyscf import dft\n dft.gks.GKS.TDA = dft.gks_symm.GKS.TDA = lib.class_as_method(TDA)\ndiff --git a/pyscf/tdscf/rhf.py b/pyscf/tdscf/rhf.py\nindex 42b51f2dbc..e09cdb3098 100644\n--- a/pyscf/tdscf/rhf.py\n+++ b/pyscf/tdscf/rhf.py\n@@ -60,10 +60,11 @@ def _gen_tda_operation(td, fock_ao=None, singlet=True, wfnsym=None):\n assert fock_ao is None\n mf = td._scf\n mol = mf.mol\n- mo_coeff = mf.mo_coeff\n+ mask = td.get_frozen_mask()\n+ mo_coeff = mf.mo_coeff[:, mask]\n # assert (mo_coeff.dtype == numpy.double)\n- mo_energy = mf.mo_energy\n- mo_occ = mf.mo_occ\n+ mo_energy = mf.mo_energy[mask]\n+ mo_occ = mf.mo_occ[mask]\n nao, nmo = mo_coeff.shape\n occidx = numpy.where(mo_occ==2)[0]\n viridx = numpy.where(mo_occ==0)[0]\n@@ -76,7 +77,7 @@ def _gen_tda_operation(td, fock_ao=None, singlet=True, wfnsym=None):\n if isinstance(wfnsym, str):\n wfnsym = symm.irrep_name2id(mol.groupname, wfnsym)\n wfnsym = wfnsym % 10 # convert to D2h subgroup\n- x_sym = _get_x_sym_table(mf)\n+ x_sym = _get_x_sym_table(td)\n sym_forbid = x_sym != wfnsym\n \n e_ia = hdiag = mo_energy[viridx] - mo_energy[occidx,None]\n@@ -84,7 +85,6 @@ def _gen_tda_operation(td, fock_ao=None, singlet=True, wfnsym=None):\n hdiag[sym_forbid] = 0\n hdiag = hdiag.ravel()\n \n- mo_coeff = numpy.asarray(numpy.hstack((orbo,orbv)), order='F')\n vresp = td.gen_response(singlet=singlet, hermi=0)\n \n def vind(zs):\n@@ -104,15 +104,36 @@ def vind(zs):\n \n return vind, hdiag\n \n-def _get_x_sym_table(mf):\n+def get_frozen_mask(td):\n+ '''Get boolean mask for the restricted reference orbitals.\n+\n+ In the returned boolean (mask) array of frozen orbital indices, the\n+ element is False if it corresponds to the frozen orbital.\n+\n+ See mp2.get_frozen_mask\n+ '''\n+ moidx = numpy.ones(td._scf.mo_occ.size, dtype=bool)\n+ if td.frozen is None:\n+ pass\n+ elif isinstance(td.frozen, (int, numpy.integer)):\n+ moidx[:td.frozen] = False\n+ elif hasattr(td.frozen, '__len__'):\n+ moidx[list(td.frozen)] = False\n+ else:\n+ raise NotImplementedError\n+ return moidx\n+\n+def _get_x_sym_table(td):\n '''Irrep (up to D2h symmetry) of each coefficient in X[nocc,nvir]'''\n+ mf = td._scf\n mol = mf.mol\n- mo_occ = mf.mo_occ\n- orbsym = hf_symm.get_orbsym(mol, mf.mo_coeff)\n+ mask = td.get_frozen_mask()\n+ mo_occ = mf.mo_occ[mask]\n+ orbsym = hf_symm.get_orbsym(mol, mf.mo_coeff[:, mask])\n orbsym = orbsym % 10 # convert to D2h irreps\n return orbsym[mo_occ==2,None] ^ orbsym[mo_occ==0]\n \n-def get_ab(mf, mo_energy=None, mo_coeff=None, mo_occ=None):\n+def get_ab(mf, frozen=None, mo_energy=None, mo_coeff=None, mo_occ=None):\n r'''A and B matrices for TDDFT response function.\n \n A[i,a,j,b] = \\delta_{ab}\\delta_{ij}(E_a - E_i) + (ai||jb)\n@@ -125,6 +146,22 @@ def get_ab(mf, mo_energy=None, mo_coeff=None, mo_occ=None):\n if mo_occ is None: mo_occ = mf.mo_occ\n # assert (mo_coeff.dtype == numpy.double)\n \n+ mo_coeff0 = numpy.copy(mo_coeff)\n+ mo_occ0 = numpy.copy(mo_occ)\n+\n+ if frozen is not None:\n+ # see get_frozen_mask()\n+ moidx = numpy.ones(mf.mo_occ.size, dtype=bool)\n+ if isinstance(frozen, (int, numpy.integer)):\n+ moidx[:frozen] = False\n+ elif hasattr(frozen, '__len__'):\n+ moidx[list(frozen)] = False\n+ else:\n+ raise NotImplementedError\n+ mo_energy = mo_energy[moidx]\n+ mo_coeff = mo_coeff[:, moidx]\n+ mo_occ = mo_occ[moidx]\n+\n assert mo_coeff.dtype == numpy.float64\n mol = mf.mol\n nao, nmo = mo_coeff.shape\n@@ -164,7 +201,7 @@ def add_hf_(a, b, hyb=1):\n b -= numpy.einsum('jaib->iajb', eri_mo[:nocc,nocc:,:nocc,nocc:]) * k_fac\n \n xctype = ni._xc_type(mf.xc)\n- dm0 = mf.make_rdm1(mo_coeff, mo_occ)\n+ dm0 = mf.make_rdm1(mo_coeff0, mo_occ0)\n make_rho = ni._gen_rho_evaluator(mol, dm0, hermi=1, with_lapl=False)[0]\n mem_now = lib.current_memory()[0]\n max_memory = max(2000, mf.max_memory*.8-mem_now)\n@@ -277,8 +314,9 @@ def get_nto(tdobj, state=1, threshold=OUTPUT_THRESHOLD, verbose=None):\n state_id = state - 1\n \n mol = tdobj.mol\n- mo_coeff = tdobj._scf.mo_coeff\n- mo_occ = tdobj._scf.mo_occ\n+ mask = tdobj.get_frozen_mask()\n+ mo_coeff = tdobj._scf.mo_coeff[:, mask]\n+ mo_occ = tdobj._scf.mo_occ[mask]\n orbo = mo_coeff[:,mo_occ==2]\n orbv = mo_coeff[:,mo_occ==0]\n nocc = orbo.shape[1]\n@@ -369,8 +407,9 @@ def get_nto(tdobj, state=1, threshold=OUTPUT_THRESHOLD, verbose=None):\n def analyze(tdobj, verbose=None):\n log = logger.new_logger(tdobj, verbose)\n mol = tdobj.mol\n- mo_coeff = tdobj._scf.mo_coeff\n- mo_occ = tdobj._scf.mo_occ\n+ mask = tdobj.get_frozen_mask()\n+ mo_coeff = tdobj._scf.mo_coeff[:, mask]\n+ mo_occ = tdobj._scf.mo_occ[mask]\n nocc = numpy.count_nonzero(mo_occ == 2)\n \n e_ev = numpy.asarray(tdobj.e) * nist.HARTREE2EV\n@@ -544,8 +583,9 @@ def _contract_multipole(tdobj, ints, hermi=True, xy=None):\n if not tdobj.singlet:\n return numpy.zeros((nstates,) + pol_shape)\n \n- mo_coeff = tdobj._scf.mo_coeff\n- mo_occ = tdobj._scf.mo_occ\n+ mask = tdobj.get_frozen_mask()\n+ mo_coeff = tdobj._scf.mo_coeff[:, mask]\n+ mo_occ = tdobj._scf.mo_occ[mask]\n orbo = mo_coeff[:,mo_occ==2]\n orbv = mo_coeff[:,mo_occ==0]\n \n@@ -673,10 +713,10 @@ class TDBase(lib.StreamObject):\n \n _keys = {\n 'conv_tol', 'nstates', 'singlet', 'lindep', 'level_shift',\n- 'max_cycle', 'mol', 'chkfile', 'wfnsym', 'converged', 'e', 'xy',\n+ 'max_cycle', 'mol', 'chkfile', 'frozen', 'wfnsym', 'converged', 'e', 'xy',\n }\n \n- def __init__(self, mf):\n+ def __init__(self, mf, frozen=None):\n self.verbose = mf.verbose\n self.stdout = mf.stdout\n self.mol = mf.mol\n@@ -684,6 +724,7 @@ def __init__(self, mf):\n self.max_memory = mf.max_memory\n self.chkfile = mf.chkfile\n \n+ self.frozen = frozen\n self.wfnsym = None\n \n # xy = (X,Y), normalized to 1/2: 2(XX-YY) = 1\n@@ -699,6 +740,12 @@ def nroots(self):\n def nroots(self, x):\n self.nstates = x\n \n+ def set_frozen(self, method='auto', window=(-1000.0, 1000.0)):\n+ from pyscf.cc.ccsd import set_frozen\n+ from pyscf.tdscf import ghf, dhf\n+ is_ghf = isinstance(self, (ghf.TDA, ghf.TDHF, dhf.TDA, dhf.TDHF))\n+ return set_frozen(self, method=method, window=window, is_gcc=is_ghf)\n+\n @property\n def e_tot(self):\n '''Excited state energies'''\n@@ -722,6 +769,8 @@ def dump_flags(self, verbose=None):\n log.info('eigh level_shift = %g', self.level_shift)\n log.info('eigh max_cycle = %d', self.max_cycle)\n log.info('chkfile = %s', self.chkfile)\n+ if self.frozen is not None:\n+ log.info('frozen orbitals %s', self.frozen)\n log.info('max_memory %d MB (current use %d MB)',\n self.max_memory, lib.current_memory()[0])\n if not self._scf.converged:\n@@ -739,6 +788,8 @@ def reset(self, mol=None):\n self._scf.reset(mol)\n return self\n \n+ get_frozen_mask = get_frozen_mask\n+\n def gen_vind(self, mf=None):\n raise NotImplementedError\n \n@@ -752,9 +803,10 @@ def gen_response(self, *args, **kwargs):\n return mf.gen_response(*args, with_nlc=not self.exclude_nlc, **kwargs)\n \n @lib.with_doc(get_ab.__doc__)\n- def get_ab(self, mf=None):\n+ def get_ab(self, mf=None, frozen=None):\n if mf is None: mf = self._scf\n- return get_ab(mf)\n+ if frozen is None: frozen = self.frozen\n+ return get_ab(mf, frozen=frozen)\n \n def get_precond(self, hdiag):\n def precond(x, e, *args):\n@@ -839,8 +891,9 @@ def get_init_guess(self, mf, nstates=None, wfnsym=None, return_symmetry=False):\n if nstates is None: nstates = self.nstates\n if wfnsym is None: wfnsym = self.wfnsym\n \n- mo_energy = mf.mo_energy\n- mo_occ = mf.mo_occ\n+ mask = self.get_frozen_mask()\n+ mo_energy = mf.mo_energy[mask]\n+ mo_occ = mf.mo_occ[mask]\n occidx = numpy.where(mo_occ==2)[0]\n viridx = numpy.where(mo_occ==0)[0]\n e_ia = (mo_energy[viridx] - mo_energy[occidx,None]).ravel()\n@@ -848,7 +901,7 @@ def get_init_guess(self, mf, nstates=None, wfnsym=None, return_symmetry=False):\n nstates = min(nstates, nov)\n \n if (wfnsym is not None or return_symmetry) and mf.mol.symmetry:\n- x_sym = _get_x_sym_table(mf).ravel()\n+ x_sym = _get_x_sym_table(self).ravel()\n if wfnsym is not None:\n if isinstance(wfnsym, str):\n wfnsym = symm.irrep_name2id(mf.mol.groupname, wfnsym)\n@@ -905,7 +958,7 @@ def pickeig(w, v, nroots, envs):\n x0, x0sym = self.get_init_guess(\n self._scf, self.nstates, return_symmetry=True)\n elif mol.symmetry:\n- x_sym = _get_x_sym_table(self._scf).ravel()\n+ x_sym = _get_x_sym_table(self).ravel()\n x0sym = [_guess_wfnsym_id(self, x_sym, x) for x in x0]\n \n self.converged, self.e, x1 = lr_eigh(\n@@ -913,8 +966,9 @@ def pickeig(w, v, nroots, envs):\n nroots=nstates, x0sym=x0sym, pick=pickeig, max_cycle=self.max_cycle,\n max_memory=self.max_memory, verbose=log)\n \n- nocc = (self._scf.mo_occ>0).sum()\n- nmo = self._scf.mo_occ.size\n+ mo_occ = self._scf.mo_occ[self.get_frozen_mask()]\n+ nocc = (mo_occ>0).sum()\n+ nmo = mo_occ.size\n nvir = nmo - nocc\n # 1/sqrt(2) because self.x is for alpha excitation and 2(X^+*X) = 1\n self.xy = [(xi.reshape(nocc,nvir)*numpy.sqrt(.5),0) for xi in x1]\n@@ -946,10 +1000,11 @@ def gen_tdhf_operation(mf, fock_ao=None, singlet=True, wfnsym=None,\n def _gen_tdhf_operation(td, fock_ao=None, singlet=True, wfnsym=None):\n mf = td._scf\n mol = mf.mol\n- mo_coeff = mf.mo_coeff\n+ mask = td.get_frozen_mask()\n+ mo_coeff = mf.mo_coeff[:, mask]\n # assert (mo_coeff.dtype == numpy.double)\n- mo_energy = mf.mo_energy\n- mo_occ = mf.mo_occ\n+ mo_energy = mf.mo_energy[mask]\n+ mo_occ = mf.mo_occ[mask]\n nao, nmo = mo_coeff.shape\n occidx = numpy.where(mo_occ==2)[0]\n viridx = numpy.where(mo_occ==0)[0]\n@@ -962,7 +1017,7 @@ def _gen_tdhf_operation(td, fock_ao=None, singlet=True, wfnsym=None):\n if isinstance(wfnsym, str):\n wfnsym = symm.irrep_name2id(mol.groupname, wfnsym)\n wfnsym = wfnsym % 10 # convert to D2h subgroup\n- sym_forbid = _get_x_sym_table(mf) != wfnsym\n+ sym_forbid = _get_x_sym_table(td) != wfnsym\n \n assert fock_ao is None\n \n@@ -1092,7 +1147,7 @@ def pickeig(w, v, nroots, envs):\n x0, x0sym = self.get_init_guess(\n self._scf, self.nstates, return_symmetry=True)\n elif mol.symmetry:\n- x_sym = y_sym = _get_x_sym_table(self._scf).ravel()\n+ x_sym = y_sym = _get_x_sym_table(self).ravel()\n x_sym = numpy.append(x_sym, y_sym)\n x0sym = [_guess_wfnsym_id(self, x_sym, x) for x in x0]\n \n@@ -1101,8 +1156,9 @@ def pickeig(w, v, nroots, envs):\n nroots=nstates, x0sym=x0sym, pick=pickeig, max_cycle=self.max_cycle,\n max_memory=self.max_memory, verbose=log)\n \n- nocc = numpy.count_nonzero(self._scf.mo_occ)\n- nmo = self._scf.mo_occ.size\n+ mo_occ = self._scf.mo_occ[self.get_frozen_mask()]\n+ nocc = numpy.count_nonzero(mo_occ)\n+ nmo = mo_occ.size\n nvir = nmo - nocc\n \n def norm_xy(z):\ndiff --git a/pyscf/tdscf/rks.py b/pyscf/tdscf/rks.py\nindex a507efb850..90e403df20 100644\n--- a/pyscf/tdscf/rks.py\n+++ b/pyscf/tdscf/rks.py\n@@ -56,10 +56,11 @@ def gen_vind(self, mf=None):\n singlet = self.singlet\n \n mol = mf.mol\n- mo_coeff = mf.mo_coeff\n+ mask = self.get_frozen_mask()\n+ mo_coeff = mf.mo_coeff[:, mask]\n assert mo_coeff.dtype == numpy.double\n- mo_energy = mf.mo_energy\n- mo_occ = mf.mo_occ\n+ mo_energy = mf.mo_energy[mask]\n+ mo_occ = mf.mo_occ[mask]\n nao, nmo = mo_coeff.shape\n occidx = numpy.where(mo_occ==2)[0]\n viridx = numpy.where(mo_occ==0)[0]\n@@ -72,7 +73,7 @@ def gen_vind(self, mf=None):\n if isinstance(wfnsym, str):\n wfnsym = symm.irrep_name2id(mol.groupname, wfnsym)\n wfnsym = wfnsym % 10 # convert to D2h subgroup\n- sym_forbid = rhf._get_x_sym_table(mf) != wfnsym\n+ sym_forbid = rhf._get_x_sym_table(self) != wfnsym\n \n e_ia = (mo_energy[viridx].reshape(-1,1) - mo_energy[occidx]).T\n if wfnsym is not None and mol.symmetry:\n@@ -130,7 +131,7 @@ def pickeig(w, v, nroots, envs):\n x0, x0sym = self.get_init_guess(\n self._scf, self.nstates, return_symmetry=True)\n elif mol.symmetry:\n- x_sym = rhf._get_x_sym_table(mf).ravel()\n+ x_sym = rhf._get_x_sym_table(self).ravel()\n x0sym = [rhf._guess_wfnsym_id(self, x_sym, x) for x in x0]\n \n self.converged, w2, x1 = lr_eigh(\n@@ -138,8 +139,9 @@ def pickeig(w, v, nroots, envs):\n nroots=nstates, x0sym=x0sym, pick=pickeig, max_cycle=self.max_cycle,\n max_memory=self.max_memory, verbose=log)\n \n- mo_energy = self._scf.mo_energy\n- mo_occ = self._scf.mo_occ\n+ mask = self.get_frozen_mask()\n+ mo_energy = self._scf.mo_energy[mask]\n+ mo_occ = self._scf.mo_occ[mask]\n occidx = numpy.where(mo_occ==2)[0]\n viridx = numpy.where(mo_occ==0)[0]\n e_ia = (mo_energy[viridx,None] - mo_energy[occidx]).T\n@@ -174,7 +176,7 @@ def nuc_grad_method(self):\n TDDFTNoHybrid = CasidaTDDFT\n \n class dRPA(TDDFTNoHybrid):\n- def __init__(self, mf):\n+ def __init__(self, mf, frozen=None):\n if not isinstance(mf, KohnShamDFT):\n raise RuntimeError(\"direct RPA can only be applied with DFT; for HF+dRPA, use .xc='hf'\")\n mf = mf.to_rks()\n@@ -182,12 +184,12 @@ def __init__(self, mf):\n # xc='0*LDA' is equivalent to xc=''\n #mf.xc = '0.0*LDA'\n mf.xc = ''\n- TDDFTNoHybrid.__init__(self, mf)\n+ TDDFTNoHybrid.__init__(self, mf, frozen)\n \n TDH = dRPA\n \n class dTDA(TDA):\n- def __init__(self, mf):\n+ def __init__(self, mf, frozen=None):\n if not isinstance(mf, KohnShamDFT):\n raise RuntimeError(\"direct TDA can only be applied with DFT; for HF+dTDA, use .xc='hf'\")\n mf = mf.to_rks()\n@@ -195,15 +197,15 @@ def __init__(self, mf):\n # xc='0*LDA' is equivalent to xc=''\n #mf.xc = '0.0*LDA'\n mf.xc = ''\n- TDA.__init__(self, mf)\n+ TDA.__init__(self, mf, frozen)\n \n \n-def tddft(mf):\n+def tddft(mf, frozen=None):\n '''Driver to create TDDFT or CasidaTDDFT object'''\n if mf._numint.libxc.is_hybrid_xc(mf.xc):\n- return TDDFT(mf)\n+ return TDDFT(mf, frozen)\n else:\n- return CasidaTDDFT(mf)\n+ return CasidaTDDFT(mf, frozen)\n \n from pyscf import dft\n dft.rks.RKS.TDA = dft.rks_symm.RKS.TDA = lib.class_as_method(TDA)\ndiff --git a/pyscf/tdscf/uhf.py b/pyscf/tdscf/uhf.py\nindex 26c6c8adf0..21f4b831bc 100644\n--- a/pyscf/tdscf/uhf.py\n+++ b/pyscf/tdscf/uhf.py\n@@ -50,10 +50,11 @@ def _gen_tda_operation(td, fock_ao=None, wfnsym=None):\n assert fock_ao is None\n mf = td._scf\n mol = mf.mol\n- mo_coeff = mf.mo_coeff\n+ maska, maskb = td.get_frozen_mask()\n+ mo_coeff = (mf.mo_coeff[0][:, maska], mf.mo_coeff[1][:, maskb])\n assert (mo_coeff[0].dtype == numpy.double)\n- mo_energy = mf.mo_energy\n- mo_occ = mf.mo_occ\n+ mo_energy = (mf.mo_energy[0][maska], mf.mo_energy[1][maskb])\n+ mo_occ = (mf.mo_occ[0][maska], mf.mo_occ[1][maskb])\n nao, nmo = mo_coeff[0].shape\n occidxa = numpy.where(mo_occ[0]>0)[0]\n occidxb = numpy.where(mo_occ[1]>0)[0]\n@@ -72,7 +73,7 @@ def _gen_tda_operation(td, fock_ao=None, wfnsym=None):\n if isinstance(wfnsym, str):\n wfnsym = symm.irrep_name2id(mol.groupname, wfnsym)\n wfnsym = wfnsym % 10 # convert to D2h subgroup\n- x_sym_a, x_sym_b = _get_x_sym_table(mf)\n+ x_sym_a, x_sym_b = _get_x_sym_table(td)\n sym_forbid = numpy.append(x_sym_a.ravel(), x_sym_b.ravel()) != wfnsym\n \n e_ia_a = mo_energy[0][viridxa] - mo_energy[0][occidxa,None]\n@@ -112,18 +113,47 @@ def vind(zs):\n \n return vind, hdiag\n \n-def _get_x_sym_table(mf):\n+def get_frozen_mask(td):\n+ '''Get boolean mask for the unrestricted reference orbitals.\n+\n+ In the returned boolean (mask) array of frozen orbital indices, the\n+ element is False if it corresponds to the frozen orbital.\n+ '''\n+ moidxa = numpy.ones(td._scf.mo_occ[0].size, dtype=bool)\n+ moidxb = numpy.ones(td._scf.mo_occ[1].size, dtype=bool)\n+\n+ frozen = td.frozen\n+ if frozen is None:\n+ pass\n+ elif isinstance(frozen, (int, numpy.integer)):\n+ moidxa[:frozen] = False\n+ moidxb[:frozen] = False\n+ elif hasattr(frozen, '__len__'):\n+ if len(frozen) > 0:\n+ if isinstance(frozen[0], (int, numpy.integer)):\n+ frozen = (frozen, frozen)\n+ moidxa[list(frozen[0])] = False\n+ moidxb[list(frozen[1])] = False\n+ else:\n+ raise NotImplementedError\n+ return moidxa,moidxb\n+\n+def _get_x_sym_table(td):\n '''Irrep (up to D2h symmetry) of each coefficient in X amplitude'''\n+ mf = td._scf\n mol = mf.mol\n- mo_occa, mo_occb = mf.mo_occ\n- orbsyma, orbsymb = uhf_symm.get_orbsym(mol, mf.mo_coeff)\n+ maska, maskb = td.get_frozen_mask()\n+ mo_coeff = (mf.mo_coeff[0][:, maska], mf.mo_coeff[1][:, maskb])\n+ mo_occ = (mf.mo_occ[0][maska], mf.mo_occ[1][maskb])\n+ mo_occa, mo_occb = mo_occ\n+ orbsyma, orbsymb = uhf_symm.get_orbsym(mol, mo_coeff)\n orbsyma = orbsyma % 10\n orbsymb = orbsymb % 10\n x_sym_a = orbsyma[mo_occa>0,None] ^ orbsyma[mo_occa==0]\n x_sym_b = orbsymb[mo_occb>0,None] ^ orbsymb[mo_occb==0]\n return x_sym_a, x_sym_b\n \n-def get_ab(mf, mo_energy=None, mo_coeff=None, mo_occ=None):\n+def get_ab(mf, frozen=None, mo_energy=None, mo_coeff=None, mo_occ=None):\n r'''A and B matrices for TDDFT response function.\n \n A[i,a,j,b] = \\delta_{ab}\\delta_{ij}(E_a - E_i) + (ai||jb)\n@@ -138,6 +168,28 @@ def get_ab(mf, mo_energy=None, mo_coeff=None, mo_occ=None):\n if mo_coeff is None: mo_coeff = mf.mo_coeff\n if mo_occ is None: mo_occ = mf.mo_occ\n \n+ mo_coeff0 = numpy.copy(mo_coeff)\n+ mo_occ0 = numpy.copy(mo_occ)\n+\n+ if frozen is not None:\n+ # see get_frozen_mask()\n+ moidxa = numpy.ones(mf.mo_occ[0].size, dtype=bool)\n+ moidxb = numpy.ones(mf.mo_occ[1].size, dtype=bool)\n+ if isinstance(frozen, (int, numpy.integer)):\n+ moidxa[:frozen] = False\n+ moidxb[:frozen] = False\n+ elif hasattr(frozen, '__len__'):\n+ if len(frozen) > 0:\n+ if isinstance(frozen[0], (int, numpy.integer)):\n+ frozen = (frozen, frozen)\n+ moidxa[list(frozen[0])] = False\n+ moidxb[list(frozen[1])] = False\n+ else:\n+ raise NotImplementedError\n+ mo_energy = (mo_energy[0][moidxa], mo_energy[1][moidxb])\n+ mo_coeff = (mo_coeff[0][:, moidxa], mo_coeff[1][:, moidxb])\n+ mo_occ = (mo_occ[0][moidxa], mo_occ[1][moidxb])\n+\n assert mo_coeff[0].dtype == numpy.float64\n mol = mf.mol\n nao = mol.nao_nr()\n@@ -214,7 +266,7 @@ def add_hf_(a, b, hyb=1):\n b_bb -= numpy.einsum('jaib->iajb', eri_bb[:nocc_b,nocc_b:,:nocc_b,nocc_b:]) * k_fac\n \n xctype = ni._xc_type(mf.xc)\n- dm0 = mf.make_rdm1(mo_coeff, mo_occ)\n+ dm0 = mf.make_rdm1(mo_coeff0, mo_occ0)\n make_rho = ni._gen_rho_evaluator(mol, dm0, hermi=1, with_lapl=False)[0]\n mem_now = lib.current_memory()[0]\n max_memory = max(2000, mf.max_memory*.8-mem_now)\n@@ -377,8 +429,9 @@ def get_nto(tdobj, state=1, threshold=OUTPUT_THRESHOLD, verbose=None):\n state_id = state - 1\n \n mol = tdobj.mol\n- mo_coeff = tdobj._scf.mo_coeff\n- mo_occ = tdobj._scf.mo_occ\n+ maska, maskb = tdobj.get_frozen_mask()\n+ mo_coeff = (tdobj._scf.mo_coeff[0][:, maska], tdobj._scf.mo_coeff[1][:, maskb])\n+ mo_occ = (tdobj._scf.mo_occ[0][maska], tdobj._scf.mo_occ[1][maskb])\n orbo_a = mo_coeff[0][:,mo_occ[0]==1]\n orbv_a = mo_coeff[0][:,mo_occ[0]==0]\n orbo_b = mo_coeff[1][:,mo_occ[1]==1]\n@@ -511,8 +564,9 @@ def _set_phase_(c):\n def analyze(tdobj, verbose=None):\n log = logger.new_logger(tdobj, verbose)\n mol = tdobj.mol\n- mo_coeff = tdobj._scf.mo_coeff\n- mo_occ = tdobj._scf.mo_occ\n+ maska, maskb = tdobj.get_frozen_mask()\n+ mo_coeff = (tdobj._scf.mo_coeff[0][:, maska], tdobj._scf.mo_coeff[1][:, maskb])\n+ mo_occ = (tdobj._scf.mo_occ[0][maska], tdobj._scf.mo_occ[1][maskb])\n nocc_a = numpy.count_nonzero(mo_occ[0] == 1)\n nocc_b = numpy.count_nonzero(mo_occ[1] == 1)\n \n@@ -584,8 +638,9 @@ def analyze(tdobj, verbose=None):\n \n def _contract_multipole(tdobj, ints, hermi=True, xy=None):\n if xy is None: xy = tdobj.xy\n- mo_coeff = tdobj._scf.mo_coeff\n- mo_occ = tdobj._scf.mo_occ\n+ maska, maskb = tdobj.get_frozen_mask()\n+ mo_coeff = (tdobj._scf.mo_coeff[0][:, maska], tdobj._scf.mo_coeff[1][:, maskb])\n+ mo_occ = (tdobj._scf.mo_occ[0][maska], tdobj._scf.mo_occ[1][maskb])\n orbo_a = mo_coeff[0][:,mo_occ[0]==1]\n orbv_a = mo_coeff[0][:,mo_occ[0]==0]\n orbo_b = mo_coeff[1][:,mo_occ[1]==1]\n@@ -610,10 +665,12 @@ def _contract_multipole(tdobj, ints, hermi=True, xy=None):\n class TDBase(rhf.TDBase):\n \n @lib.with_doc(get_ab.__doc__)\n- def get_ab(self, mf=None):\n+ def get_ab(self, mf=None, frozen=None):\n if mf is None: mf = self._scf\n- return get_ab(mf)\n+ if frozen is None: frozen = self.frozen\n+ return get_ab(mf, frozen=frozen)\n \n+ get_frozen_mask = get_frozen_mask\n analyze = analyze\n get_nto = get_nto\n _contract_multipole = _contract_multipole # needed by transition dipoles\n@@ -638,8 +695,9 @@ def get_init_guess(self, mf, nstates=None, wfnsym=None, return_symmetry=False):\n if wfnsym is None: wfnsym = self.wfnsym\n \n mol = mf.mol\n- mo_energy = mf.mo_energy\n- mo_occ = mf.mo_occ\n+ maska, maskb = self.get_frozen_mask()\n+ mo_energy = (mf.mo_energy[0][maska], mf.mo_energy[1][maskb])\n+ mo_occ = (mf.mo_occ[0][maska], mf.mo_occ[1][maskb])\n occidxa = numpy.where(mo_occ[0]>0)[0]\n occidxb = numpy.where(mo_occ[1]>0)[0]\n viridxa = numpy.where(mo_occ[0]==0)[0]\n@@ -650,7 +708,7 @@ def get_init_guess(self, mf, nstates=None, wfnsym=None, return_symmetry=False):\n nstates = min(nstates, nov)\n \n if (wfnsym is not None or return_symmetry) and mf.mol.symmetry:\n- x_sym_a, x_sym_b = _get_x_sym_table(mf)\n+ x_sym_a, x_sym_b = _get_x_sym_table(self)\n if wfnsym is not None:\n if isinstance(wfnsym, str):\n wfnsym = symm.irrep_name2id(mol.groupname, wfnsym)\n@@ -706,7 +764,7 @@ def pickeig(w, v, nroots, envs):\n x0, x0sym = self.get_init_guess(\n self._scf, self.nstates, return_symmetry=True)\n elif mol.symmetry:\n- x_sym_a, x_sym_b = _get_x_sym_table(self._scf)\n+ x_sym_a, x_sym_b = _get_x_sym_table(self)\n x_sym = numpy.append(x_sym_a.ravel(), x_sym_b.ravel())\n x0sym = [rhf._guess_wfnsym_id(self, x_sym, x) for x in x0]\n \n@@ -715,9 +773,10 @@ def pickeig(w, v, nroots, envs):\n nroots=nstates, x0sym=x0sym, pick=pickeig, max_cycle=self.max_cycle,\n max_memory=self.max_memory, verbose=log)\n \n- nmo = self._scf.mo_occ[0].size\n- nocca = (self._scf.mo_occ[0]>0).sum()\n- noccb = (self._scf.mo_occ[1]>0).sum()\n+ maska, maskb = self.get_frozen_mask()\n+ nmo = self._scf.mo_occ[0][maska].size\n+ nocca = (self._scf.mo_occ[0][maska]>0).sum()\n+ noccb = (self._scf.mo_occ[1][maskb]>0).sum()\n nvira = nmo - nocca\n nvirb = nmo - noccb\n self.xy = [((xi[:nocca*nvira].reshape(nocca,nvira), # X_alpha\n@@ -751,9 +810,10 @@ def gen_tdhf_operation(mf, fock_ao=None, wfnsym=None, with_nlc=True):\n def _gen_tdhf_operation(td, fock_ao=None, wfnsym=None):\n mf = td._scf\n mol = mf.mol\n- mo_coeff = mf.mo_coeff\n- mo_energy = mf.mo_energy\n- mo_occ = mf.mo_occ\n+ maska, maskb = td.get_frozen_mask()\n+ mo_coeff = (mf.mo_coeff[0][:, maska], mf.mo_coeff[1][:, maskb])\n+ mo_energy = (mf.mo_energy[0][maska], mf.mo_energy[1][maskb])\n+ mo_occ = (mf.mo_occ[0][maska], mf.mo_occ[1][maskb])\n nao, nmo = mo_coeff[0].shape\n occidxa = numpy.where(mo_occ[0]>0)[0]\n occidxb = numpy.where(mo_occ[1]>0)[0]\n@@ -772,7 +832,7 @@ def _gen_tdhf_operation(td, fock_ao=None, wfnsym=None):\n if isinstance(wfnsym, str):\n wfnsym = symm.irrep_name2id(mol.groupname, wfnsym)\n wfnsym = wfnsym % 10 # convert to D2h subgroup\n- x_sym_a, x_sym_b = _get_x_sym_table(mf)\n+ x_sym_a, x_sym_b = _get_x_sym_table(td)\n sym_forbid = numpy.append(x_sym_a.ravel(), x_sym_b.ravel()) != wfnsym\n \n e_ia_a = mo_energy[0][viridxa] - mo_energy[0][occidxa,None]\n@@ -883,7 +943,7 @@ def pickeig(w, v, nroots, envs):\n x0, x0sym = self.get_init_guess(\n self._scf, self.nstates, return_symmetry=True)\n elif mol.symmetry:\n- x_sym_a, x_sym_b = _get_x_sym_table(self._scf)\n+ x_sym_a, x_sym_b = _get_x_sym_table(self)\n x_sym = y_sym = numpy.append(x_sym_a.ravel(), x_sym_b.ravel())\n x_sym = numpy.append(x_sym, y_sym)\n x0sym = [rhf._guess_wfnsym_id(self, x_sym, x) for x in x0]\n@@ -893,8 +953,10 @@ def pickeig(w, v, nroots, envs):\n nroots=nstates, x0sym=x0sym, pick=pickeig, max_cycle=self.max_cycle,\n max_memory=self.max_memory, verbose=log)\n \n- nmo = self._scf.mo_occ[0].size\n- nocca, noccb = self._scf.nelec\n+ maska, maskb = self.get_frozen_mask()\n+ nmo = self._scf.mo_occ[0][maska].size\n+ nocca = (self._scf.mo_occ[0][maska]>0).sum()\n+ noccb = (self._scf.mo_occ[1][maskb]>0).sum()\n nvira = nmo - nocca\n nvirb = nmo - noccb\n xy = []\ndiff --git a/pyscf/tdscf/uks.py b/pyscf/tdscf/uks.py\nindex c78f6cb1a6..4999b173a7 100644\n--- a/pyscf/tdscf/uks.py\n+++ b/pyscf/tdscf/uks.py\n@@ -53,10 +53,11 @@ def gen_vind(self, mf=None):\n wfnsym = self.wfnsym\n \n mol = mf.mol\n- mo_coeff = mf.mo_coeff\n- assert mo_coeff[0].dtype == numpy.double\n- mo_energy = mf.mo_energy\n- mo_occ = mf.mo_occ\n+ maska, maskb = self.get_frozen_mask()\n+ mo_coeff = (mf.mo_coeff[0][:, maska], mf.mo_coeff[1][:, maskb])\n+ assert (mo_coeff[0].dtype == numpy.double)\n+ mo_energy = (mf.mo_energy[0][maska], mf.mo_energy[1][maskb])\n+ mo_occ = (mf.mo_occ[0][maska], mf.mo_occ[1][maskb])\n nao, nmo = mo_coeff[0].shape\n occidxa = numpy.where(mo_occ[0]>0)[0]\n occidxb = numpy.where(mo_occ[1]>0)[0]\n@@ -75,7 +76,7 @@ def gen_vind(self, mf=None):\n if isinstance(wfnsym, str):\n wfnsym = symm.irrep_name2id(mol.groupname, wfnsym)\n wfnsym = wfnsym % 10 # convert to D2h subgroup\n- x_sym_a, x_sym_b = uhf._get_x_sym_table(mf)\n+ x_sym_a, x_sym_b = uhf._get_x_sym_table(self)\n sym_forbid = numpy.append(x_sym_a.ravel(), x_sym_b.ravel()) != wfnsym\n \n e_ia_a = (mo_energy[0][viridxa,None] - mo_energy[0][occidxa]).T\n@@ -144,7 +145,7 @@ def pickeig(w, v, nroots, envs):\n x0, x0sym = self.get_init_guess(\n self._scf, self.nstates, return_symmetry=True)\n elif mol.symmetry:\n- x_sym_a, x_sym_b = uhf._get_x_sym_table(self._scf)\n+ x_sym_a, x_sym_b = uhf._get_x_sym_table(self)\n x_sym = numpy.append(x_sym_a.ravel(), x_sym_b.ravel())\n x0sym = [rhf._guess_wfnsym_id(self, x_sym, x) for x in x0]\n \n@@ -153,8 +154,9 @@ def pickeig(w, v, nroots, envs):\n nroots=nstates, x0sym=x0sym, pick=pickeig, max_cycle=self.max_cycle,\n max_memory=self.max_memory, verbose=log)\n \n- mo_energy = self._scf.mo_energy\n- mo_occ = self._scf.mo_occ\n+ maska, maskb = self.get_frozen_mask()\n+ mo_energy = (self._scf.mo_energy[0][maska], self._scf.mo_energy[1][maskb])\n+ mo_occ = (self._scf.mo_occ[0][maska], self._scf.mo_occ[1][maskb])\n occidxa = numpy.where(mo_occ[0]>0)[0]\n occidxb = numpy.where(mo_occ[1]>0)[0]\n viridxa = numpy.where(mo_occ[0]==0)[0]\n@@ -206,30 +208,30 @@ def nuc_grad_method(self):\n \n \n class dRPA(TDDFTNoHybrid):\n- def __init__(self, mf):\n+ def __init__(self, mf, frozen=None):\n if not isinstance(mf, KohnShamDFT):\n raise RuntimeError(\"direct RPA can only be applied with DFT; for HF+dRPA, use .xc='hf'\")\n mf = mf.to_uks()\n mf.xc = ''\n- TDDFTNoHybrid.__init__(self, mf)\n+ TDDFTNoHybrid.__init__(self, mf, frozen)\n \n TDH = dRPA\n \n class dTDA(TDA):\n- def __init__(self, mf):\n+ def __init__(self, mf, frozen=None):\n if not isinstance(mf, KohnShamDFT):\n raise RuntimeError(\"direct TDA can only be applied with DFT; for HF+dTDA, use .xc='hf'\")\n mf = mf.to_uks()\n mf.xc = ''\n- TDA.__init__(self, mf)\n+ TDA.__init__(self, mf, frozen)\n \n \n-def tddft(mf):\n+def tddft(mf, frozen=None):\n '''Driver to create TDDFT or CasidaTDDFT object'''\n if mf._numint.libxc.is_hybrid_xc(mf.xc):\n- return TDDFT(mf)\n+ return TDDFT(mf, frozen)\n else:\n- return CasidaTDDFT(mf)\n+ return CasidaTDDFT(mf, frozen)\n \n from pyscf import dft\n dft.uks.UKS.TDA = dft.uks_symm.UKS.TDA = lib.class_as_method(TDA)\n"}, "test": {"test_patch": "diff --git a/pyscf/tdscf/test/test_tdgks.py b/pyscf/tdscf/test/test_tdgks.py\nindex aa568c4675..30ee8a92bc 100644\n--- a/pyscf/tdscf/test/test_tdgks.py\n+++ b/pyscf/tdscf/test/test_tdgks.py\n@@ -205,6 +205,18 @@ def test_tddft_with_wfnsym(self):\n es = td.kernel()[0]\n self.assertAlmostEqual(lib.fp(es), 0.45050838461527387, 6)\n \n+ def test_set_frozen(self):\n+ td = mf_bp86.TDA()\n+ td.frozen = 4\n+ mask = td.get_frozen_mask()\n+ self.assertEqual(mask.sum(), 22)\n+ td.set_frozen()\n+ mask = td.get_frozen_mask()\n+ self.assertEqual(mask.sum(), 24)\n+ td.frozen = [0,1]\n+ mask = td.get_frozen_mask()\n+ self.assertEqual(mask.sum(), 24)\n+\n \n if __name__ == \"__main__\":\n print(\"Full Tests for TD-GKS\")\ndiff --git a/pyscf/tdscf/test/test_tdrhf.py b/pyscf/tdscf/test/test_tdrhf.py\nindex 80b30d2600..9d4c88b8c6 100644\n--- a/pyscf/tdscf/test/test_tdrhf.py\n+++ b/pyscf/tdscf/test/test_tdrhf.py\n@@ -96,6 +96,21 @@ def test_symmetry_init_guess(self):\n wfnsym = tdscf.rhf._analyze_wfnsym(td, x_sym, td.xy[0][0])\n self.assertEqual(wfnsym, 'A1u')\n \n+ def test_set_frozen(self):\n+ td = mf.TDA()\n+ td.frozen = 1\n+ mask = td.get_frozen_mask()\n+ self.assertEqual(mask.sum(), 10)\n+ td.set_frozen()\n+ mask = td.get_frozen_mask()\n+ self.assertEqual(mask.sum(), 10)\n+ td.frozen = [0,1]\n+ mask = td.get_frozen_mask()\n+ self.assertEqual(mask.sum(), 9)\n+ td.frozen = [1,9]\n+ mask = td.get_frozen_mask()\n+ self.assertEqual(mask.sum(), 9)\n+\n \n if __name__ == \"__main__\":\n print(\"Full Tests for rhf-TDA and rhf-TDHF\")\ndiff --git a/pyscf/tdscf/test/test_tduhf.py b/pyscf/tdscf/test/test_tduhf.py\nindex 5973414180..ff8dc88e79 100644\n--- a/pyscf/tdscf/test/test_tduhf.py\n+++ b/pyscf/tdscf/test/test_tduhf.py\n@@ -90,6 +90,29 @@ def test_symmetry_init_guess(self):\n self.assertAlmostEqual(wfnsyma, 'A1u')\n self.assertAlmostEqual(wfnsymb, 'A1u')\n \n+ def test_set_frozen(self):\n+ td = mf.TDA()\n+ td.frozen = 1\n+ mask = td.get_frozen_mask()\n+ self.assertEqual(mask[0].sum(), 10)\n+ self.assertEqual(mask[1].sum(), 10)\n+ td.set_frozen()\n+ mask = td.get_frozen_mask()\n+ self.assertEqual(mask[0].sum(), 10)\n+ self.assertEqual(mask[1].sum(), 10)\n+ td.frozen = [0,1]\n+ mask = td.get_frozen_mask()\n+ self.assertEqual(mask[0].sum(), 9)\n+ self.assertEqual(mask[1].sum(), 9)\n+ td.frozen = [1,9]\n+ mask = td.get_frozen_mask()\n+ self.assertEqual(mask[0].sum(), 9)\n+ self.assertEqual(mask[1].sum(), 9)\n+ td.frozen = [[0],[1,2]]\n+ mask = td.get_frozen_mask()\n+ self.assertEqual(mask[0].sum(), 10)\n+ self.assertEqual(mask[1].sum(), 9)\n+\n if __name__ == \"__main__\":\n print(\"Full Tests for uhf-TDA and uhf-TDHF\")\n unittest.main()\n", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}161{"question_id": "MSB_Qiskit_qiskit_pr10008", "question_type": "multi_swe_bench", "description": "Filter possible 2q decomposers more carefully in unitary synthesis (Qiskit/qiskit#10008)", "content": {"org": "Qiskit", "repo": "qiskit", "pr_number": 10008, "issue_title": "Filter possible 2q decomposers more carefully in unitary synthesis", "issue_body": "This PR fixes a few bugs in transpilation.\\r\\n\\r\\nCloses #9996\\r\\nCloses #9935\\r\\n\\r\\nThis PR supersedes #9994 , #9984, #9986, #9982 . These PRs will be closed\\r\\n\\r\\n* Skips running some decomposers when we know they will fail. In particular, before this PR, `XXDecomposer` was used unconditionally when a `Target` is supplied to `UnitarySynthesis`. Now it is skipped when there are no controlled basis gates to send to it, except in the case that the unitary to be synthesized is a product of 1q gates.\\r\\n* Makes `XXDecomposer` throw more informative errors\\r\\n\\r\\n#### Behavior of previous bugs and tests\\r\\n\\r\\n* Adds a test that this bug #9996 is fixed. Synthesis with a basis set whose only engtangling gate is iSwap no longer throws an error, but rather runs to completion. Resynthesizing with a CX-gate in the basis does not change the circuit. But the corresponding numeric unitary is correct.\\r\\n\\r\\n* `FakePrague` and other fake backends erroneously have no entangling gate ( #9983 #10004) Prior to this PR this caused an error to be thrown when synthesizing some circuits #9935 With this PR an error is no longer thrown. All decomposers are filtered out in `DefaultUnitarySynthesis` so that none are run (Calling `transpile` with optimization level 3) A circuit is returned by `transpile`. But it is incorrect. An issue should be filed.\\r\\n\\r\\n* Synthesizing a non-entangling unitary with a basis containing no entangling gates still works. There was an existing test for this.\\r\\n\\r\\n* I am pretty sure that an error thrown by any decomposer will cause synthesis of the entire circuit to fail. There were existing tests for some cases in the test suite. These are still in place and still have the same behavior. \\r\\n\\r\\n#### Details\\r\\n\\r\\nPreviously all analysis of the unitary to be decomposed happened in the decomposers themselves. Now we do a bit of analysis on the unitary to be decomposed in order to choose which decomposers to run. This allows filtering some that would fail. To do this we call `TwoQubitWeylDecomposition` on the unitary. Since the 2q decomposers perform this same Weyl decomposition as a first step, we allow the decomposers to take this weyl decomposition as an argument. The argument is optional to avoid breaking code using the old API.", "base_commit": "b4037950179c49f4b5349af0e8b644ea510880fe", "resolved_issues": [{"number": 9935, "title": "IndexError in `XXDecomposer` during `FakePrague` `transpile()` with optimization level 3", "body": "### Environment\\n\\n- **Qiskit Terra version**: 0.24.0 main (@ 5672c70649b4f83a6c7146c68a6a543d4a3908fd)\\r\\n- **Python version**: 3.10\\r\\n- **Operating system**: Linux\\r\\n\\n\\n### What is happening?\\n\\nDuring `transpile()` with optimization level 3 on some circuits targeting `FakePrague` the 2q unitary synthesis code is raising an index error with the main branch. This code works fine on the most recent release.\\n\\n### How can we reproduce the issue?\\n\\n```python\\r\\nfrom qiskit.circuit import QuantumCircuit\\r\\nfrom qiskit.compiler import transpile\\r\\nfrom qiskit.providers.fake_provider import FakePrague\\r\\n\\r\\nbackend = FakePrague()\\r\\nnum_qubits = 10\\r\\n# Circuit creation\\r\\nqc = QuantumCircuit(num_qubits)\\r\\nqc.h(0)\\r\\nfor i in range(num_qubits - 1):\\r\\n if i % 2 == 0:\\r\\n qc.cy(0, i + 1)\\r\\n else:\\r\\n qc.cx(0, i + 1)\\r\\nqc.measure_all()\\r\\ntqc = transpile(\\r\\n qc, backend, seed_transpiler=2023, optimization_level=3\\r\\n)\\r\\n```\\n\\n### What should happen?\\n\\nThe `transpile()` shouldn't error and it should successfully run 2q synthesis and return a compiled circuit.\\n\\n### Any suggestions?\\n\\nThis is a bug that has been introduced since the 0.23.0 release (as it still works on the released version). Looking at the git log this is likely a bug that was introduced in #9175 (https://github.com/Qiskit/qiskit-terra/commit/a8f83c4469f55a62f958f3eed2df10a598811eae) "}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/qiskit_m_qiskit:pr-10008", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/qiskit/quantum_info/synthesis/xx_decompose/decomposer.py b/qiskit/quantum_info/synthesis/xx_decompose/decomposer.py\\nindex 3d5714b5c2ab..2527816530c8 100644\\n--- a/qiskit/quantum_info/synthesis/xx_decompose/decomposer.py\\n+++ b/qiskit/quantum_info/synthesis/xx_decompose/decomposer.py\\n@@ -151,6 +151,13 @@ def _best_decomposition(canonical_coordinate, available_strengths):\\n canonical_coordinate = np.array(canonical_coordinate)\\n \\n while True:\\n+ if len(priority_queue) == 0:\\n+ if len(available_strengths) == 0:\\n+ raise QiskitError(\\n+ \"Attempting to synthesize entangling gate with no controlled gates in basis set.\"\\n+ )\\n+ raise QiskitError(\"Unable to synthesize a 2q unitary with the supplied basis set.\")\\n+\\n sequence_cost, sequence = heapq.heappop(priority_queue)\\n \\n strength_polytope = XXPolytope.from_strengths(*[x / 2 for x in sequence])\\ndiff --git a/qiskit/transpiler/passes/synthesis/unitary_synthesis.py b/qiskit/transpiler/passes/synthesis/unitary_synthesis.py\\nindex 9b42567b8697..efd92085887b 100644\\n--- a/qiskit/transpiler/passes/synthesis/unitary_synthesis.py\\n+++ b/qiskit/transpiler/passes/synthesis/unitary_synthesis.py\\n@@ -701,24 +701,25 @@ def is_controlled(gate):\\n # if we are using the approximation_degree knob, use it to scale already-given fidelities\\n if approximation_degree is not None:\\n basis_2q_fidelity = {k: v * approximation_degree for k, v in basis_2q_fidelity.items()}\\n- for basis_1q in available_1q_basis:\\n- if isinstance(pi2_basis, CXGate) and basis_1q == \"ZSX\":\\n- pi2_decomposer = TwoQubitBasisDecomposer(\\n- pi2_basis,\\n- euler_basis=basis_1q,\\n+ if basis_2q_fidelity:\\n+ for basis_1q in available_1q_basis:\\n+ if isinstance(pi2_basis, CXGate) and basis_1q == \"ZSX\":\\n+ pi2_decomposer = TwoQubitBasisDecomposer(\\n+ pi2_basis,\\n+ euler_basis=basis_1q,\\n+ basis_fidelity=basis_2q_fidelity,\\n+ pulse_optimize=True,\\n+ )\\n+ embodiments.update({pi / 2: XXEmbodiments[type(pi2_decomposer.gate)]})\\n+ else:\\n+ pi2_decomposer = None\\n+ decomposer = XXDecomposer(\\n basis_fidelity=basis_2q_fidelity,\\n- pulse_optimize=True,\\n+ euler_basis=basis_1q,\\n+ embodiments=embodiments,\\n+ backup_optimizer=pi2_decomposer,\\n )\\n- embodiments.update({pi / 2: XXEmbodiments[type(pi2_decomposer.gate)]})\\n- else:\\n- pi2_decomposer = None\\n- decomposer = XXDecomposer(\\n- basis_fidelity=basis_2q_fidelity,\\n- euler_basis=basis_1q,\\n- embodiments=embodiments,\\n- backup_optimizer=pi2_decomposer,\\n- )\\n- decomposers.append(decomposer)\\n+ decomposers.append(decomposer)\\n \\n self._decomposer_cache[qubits_tuple] = decomposers\\n return decomposers\\n"}, "test": {"test_patch": "diff --git a/test/python/quantum_info/xx_decompose/test_decomposer.py b/test/python/quantum_info/xx_decompose/test_decomposer.py\\nindex 5c21ac13f384..c4309b327d5f 100644\\n--- a/test/python/quantum_info/xx_decompose/test_decomposer.py\\n+++ b/test/python/quantum_info/xx_decompose/test_decomposer.py\\n@@ -22,6 +22,7 @@\\n from scipy.stats import unitary_group\\n \\n import qiskit\\n+from qiskit.circuit.quantumcircuit import QuantumCircuit\\n from qiskit.quantum_info.operators import Operator\\n from qiskit.quantum_info.synthesis.xx_decompose.decomposer import (\\n XXDecomposer,\\n@@ -132,3 +133,25 @@ def test_compilation_improvement(self):\\n # the following are taken from Fig 14 of the XX synthesis paper\\n self.assertAlmostEqual(mean(clever_costs), 1.445e-2, delta=5e-3)\\n self.assertAlmostEqual(mean(naive_costs), 2.058e-2, delta=5e-3)\\n+\\n+ def test_error_on_empty_basis_fidelity(self):\\n+ \"\"\"Test synthesizing entangling gate with no entangling basis fails.\"\"\"\\n+ decomposer = XXDecomposer(basis_fidelity={})\\n+ qc = QuantumCircuit(2)\\n+ qc.cx(0, 1)\\n+ mat = Operator(qc).to_matrix()\\n+ with self.assertRaisesRegex(\\n+ qiskit.exceptions.QiskitError,\\n+ \"Attempting to synthesize entangling gate with no controlled gates in basis set.\",\\n+ ):\\n+ decomposer(mat)\\n+\\n+ def test_no_error_on_empty_basis_fidelity_trivial_target(self):\\n+ \"\"\"Test synthesizing non-entangling gate with no entangling basis succeeds.\"\"\"\\n+ decomposer = XXDecomposer(basis_fidelity={})\\n+ qc = QuantumCircuit(2)\\n+ qc.x(0)\\n+ qc.y(1)\\n+ mat = Operator(qc).to_matrix()\\n+ dqc = decomposer(mat)\\n+ self.assertTrue(np.allclose(mat, Operator(dqc).to_matrix()))\\ndiff --git a/test/python/transpiler/test_unitary_synthesis.py b/test/python/transpiler/test_unitary_synthesis.py\\nindex 9731f84214ee..39a2a5880172 100644\\n--- a/test/python/transpiler/test_unitary_synthesis.py\\n+++ b/test/python/transpiler/test_unitary_synthesis.py\\n@@ -47,7 +47,12 @@\\n TrivialLayout,\\n )\\n from qiskit.circuit.library import (\\n+ IGate,\\n CXGate,\\n+ RZGate,\\n+ SXGate,\\n+ XGate,\\n+ iSwapGate,\\n ECRGate,\\n UGate,\\n ZGate,\\n@@ -55,6 +60,7 @@\\n RZZGate,\\n RXXGate,\\n )\\n+from qiskit.circuit import Measure\\n from qiskit.circuit.controlflow import IfElseOp\\n from qiskit.circuit import Parameter, Gate\\n \\n@@ -855,7 +861,7 @@ def __init__(self):\\n unitary_synth_pass = UnitarySynthesis(target=target)\\n result_dag = unitary_synth_pass.run(dag)\\n result_qc = dag_to_circuit(result_dag)\\n- self.assertEqual(result_qc, QuantumCircuit(2))\\n+ self.assertEqual(result_qc, qc)\\n \\n def test_default_does_not_fail_on_no_syntheses(self):\\n qc = QuantumCircuit(1)\\n@@ -863,6 +869,51 @@ def test_default_does_not_fail_on_no_syntheses(self):\\n pass_ = UnitarySynthesis([\"unknown\", \"gates\"])\\n self.assertEqual(qc, pass_(qc))\\n \\n+ def test_iswap_no_cx_synthesis_succeeds(self):\\n+ \"\"\"Test basis set with iswap but no cx can synthesize a circuit\"\"\"\\n+ target = Target()\\n+ theta = Parameter(\"theta\")\\n+\\n+ i_props = {\\n+ (0,): InstructionProperties(duration=35.5e-9, error=0.000413),\\n+ (1,): InstructionProperties(duration=35.5e-9, error=0.000502),\\n+ }\\n+ target.add_instruction(IGate(), i_props)\\n+ rz_props = {\\n+ (0,): InstructionProperties(duration=0, error=0),\\n+ (1,): InstructionProperties(duration=0, error=0),\\n+ }\\n+ target.add_instruction(RZGate(theta), rz_props)\\n+ sx_props = {\\n+ (0,): InstructionProperties(duration=35.5e-9, error=0.000413),\\n+ (1,): InstructionProperties(duration=35.5e-9, error=0.000502),\\n+ }\\n+ target.add_instruction(SXGate(), sx_props)\\n+ x_props = {\\n+ (0,): InstructionProperties(duration=35.5e-9, error=0.000413),\\n+ (1,): InstructionProperties(duration=35.5e-9, error=0.000502),\\n+ }\\n+ target.add_instruction(XGate(), x_props)\\n+ iswap_props = {\\n+ (0, 1): InstructionProperties(duration=519.11e-9, error=0.01201),\\n+ (1, 0): InstructionProperties(duration=554.66e-9, error=0.01201),\\n+ }\\n+ target.add_instruction(iSwapGate(), iswap_props)\\n+ measure_props = {\\n+ (0,): InstructionProperties(duration=5.813e-6, error=0.0751),\\n+ (1,): InstructionProperties(duration=5.813e-6, error=0.0225),\\n+ }\\n+ target.add_instruction(Measure(), measure_props)\\n+\\n+ qc = QuantumCircuit(2)\\n+ cxmat = Operator(CXGate()).to_matrix()\\n+ qc.unitary(cxmat, [0, 1])\\n+ unitary_synth_pass = UnitarySynthesis(target=target)\\n+ dag = circuit_to_dag(qc)\\n+ result_dag = unitary_synth_pass.run(dag)\\n+ result_qc = dag_to_circuit(result_dag)\\n+ self.assertTrue(np.allclose(Operator(result_qc.to_gate()).to_matrix(), cxmat))\\n+\\n \\n if __name__ == \"__main__\":\\n unittest.main()\\n", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}162{"question_id": "MSB_Qiskit_qiskit_pr10126", "question_type": "multi_swe_bench", "description": "fix 1q matrix bug in Quantum Shannon Decomposer (Qiskit/qiskit#10126)", "content": {"org": "Qiskit", "repo": "qiskit", "pr_number": 10126, "issue_title": "fix 1q matrix bug in Quantum Shannon Decomposer", "issue_body": "<!--\\r\\n\u26a0\ufe0f If you do not respect this template, your pull request will be closed.\\r\\n\u26a0\ufe0f Your pull request title should be short detailed and understandable for all.\\r\\n\u26a0\ufe0f Also, please add a release note file using reno if the change needs to be\\r\\n documented in the release notes.\\r\\n\u26a0\ufe0f If your pull request fixes an open issue, please link to the issue.\\r\\n\\r\\n- [x] I have added the tests to cover my changes.\\r\\n- [x] I have updated the documentation accordingly.\\r\\n- [x] I have read the CONTRIBUTING document.\\r\\n-->\\r\\n\\r\\n### Summary\\r\\nFixes #10036\\r\\n\\r\\n\\r\\n### Details and comments\\r\\n\\r\\n\\r\\n", "base_commit": "574da7ee5cfb58cf3d7eb5ef726d15166c5e247a", "resolved_issues": [{"number": 10036, "title": "Quantum shannon decomposition failing for some inputs", "body": "### Environment\\r\\n\\r\\n- **Qiskit Terra version**: 0.42.1\\r\\n- **Python version**: 3.10.8\\r\\n\\r\\n\\r\\n\\r\\n### What is happening?\\r\\n\\r\\nqs_decomposition in [qsd.py](https://github.com/Qiskit/qiskit-terra/blob/main/qiskit/quantum_info/synthesis/qsd.py) throws an error for some examples, seemingly due to a bug in the code\\r\\n\\r\\n### How can we reproduce the issue?\\r\\n\\r\\n```\\r\\nfrom qiskit.quantum_info.synthesis.qsd import qs_decomposition\\r\\nqs_decomposition(np.array([[0,1],[1,0]]))\\r\\n```\\r\\nOutput:\\r\\n```\\r\\nTraceback (most recent call last):\\r\\n Cell In[14], line 3\\r\\n qs_decomposition(np.array([[0,1],[1,0]]))\\r\\n File /opt/conda/lib/python3.10/site-packages/qiskit/quantum_info/synthesis/qsd.py:122 in qs_decomposition\\r\\n return _apply_a2(circ)\\r\\n File /opt/conda/lib/python3.10/site-packages/qiskit/quantum_info/synthesis/qsd.py:253 in _apply_a2\\r\\n qc3 = two_qubit_decompose.two_qubit_cnot_decompose(mat2)\\r\\nUnboundLocalError: local variable 'mat2' referenced before assignment\\r\\n \\r\\nUse %tb to get the full traceback.\\r\\n```\\r\\nAlternatively,\\r\\n```\\r\\nqs_decomposition(qiskit.quantum_info.random_unitary(4).to_matrix())\\r\\n```\\r\\nGiving the same error\\r\\n\\r\\n### What should happen?\\r\\n\\r\\nWe should still be able to produce a decomposed circuit from these examples\\r\\n\\r\\n### Any suggestions?\\r\\n\\r\\nThis seems to occur when line 233 of qsd.py in the function \u2018_apply_a2()\u2019 does not transpile to include any of the \u2018qsd2q\u2019 gate type for an instance.\\r\\n\\r\\nTo fix this add something such as the following before the loop on line 242:\\r\\n```\\r\\nif not ind2q:\\r\\n return ccirc\\r\\n```\\r\\nAdditionally should add a test for this kind of case to the [test](https://github.com/Qiskit/qiskit-terra/blob/main/test/python/quantum_info/test_synthesis.py) "}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/qiskit_m_qiskit:pr-10126", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/qiskit/quantum_info/synthesis/qsd.py b/qiskit/quantum_info/synthesis/qsd.py\\nindex 87aae51cabad..82694e45ab22 100644\\n--- a/qiskit/quantum_info/synthesis/qsd.py\\n+++ b/qiskit/quantum_info/synthesis/qsd.py\\n@@ -81,7 +81,7 @@ def qs_decomposition(\\n circ = decomposer_1q(mat)\\n elif dim == 4:\\n if decomposer_2q is None:\\n- if opt_a2:\\n+ if opt_a2 and _depth > 0:\\n from qiskit.extensions.unitary import UnitaryGate # pylint: disable=cyclic-import\\n \\n def decomp_2q(mat):\\n@@ -118,7 +118,7 @@ def decomp_2q(mat):\\n right_circ = _demultiplex(u1, u2, opt_a1=opt_a1, opt_a2=opt_a2, _depth=_depth)\\n circ.append(right_circ.to_instruction(), qr)\\n \\n- if opt_a2 and _depth == 0:\\n+ if opt_a2 and _depth == 0 and dim > 4:\\n return _apply_a2(circ)\\n return circ\\n \\n@@ -236,6 +236,8 @@ def _apply_a2(circ):\\n for i, instruction in enumerate(ccirc.data):\\n if instruction.operation.name == \"qsd2q\":\\n ind2q.append(i)\\n+ if not ind2q:\\n+ return ccirc\\n # rolling over diagonals\\n ind2 = None # lint\\n for ind1, ind2 in zip(ind2q[0:-1:], ind2q[1::]):\\ndiff --git a/releasenotes/notes/fix-1q-matrix-bug-in-quantum-shannon-decomposer-c99ce6509f03715b.yaml b/releasenotes/notes/fix-1q-matrix-bug-in-quantum-shannon-decomposer-c99ce6509f03715b.yaml\\nnew file mode 100644\\nindex 000000000000..d68d20c89e24\\n--- /dev/null\\n+++ b/releasenotes/notes/fix-1q-matrix-bug-in-quantum-shannon-decomposer-c99ce6509f03715b.yaml\\n@@ -0,0 +1,7 @@\\n+---\\n+fixes:\\n+ - |\\n+ When :func:`~qiskit.quantum_info.synthesis.qs_decomposition`, which does quantum Shannon\\n+ decomposition, was called on trivial numeric unitaries that do not benefit from this\\n+ decomposition, an unexpected error was raised. With this fix, such unitaries are detected and\\n+ the equivalent circuit is returned without performing Shannon decomposition.\\n"}, "test": {"test_patch": "diff --git a/test/python/quantum_info/test_synthesis.py b/test/python/quantum_info/test_synthesis.py\\nindex 58074995c7a1..19ec8b8139e9 100644\\n--- a/test/python/quantum_info/test_synthesis.py\\n+++ b/test/python/quantum_info/test_synthesis.py\\n@@ -1530,7 +1530,7 @@ def test_hermitian(self, nqubits):\\n expected_cx = self._qsd_l2_cx_count(nqubits) - self._qsd_l2_a1_mod(nqubits)\\n self.assertLessEqual(ccirc.count_ops().get(\"cx\"), expected_cx)\\n \\n- @data(*list(range(3, 6)))\\n+ @data(*list(range(1, 6)))\\n def test_opt_a1a2(self, nqubits):\\n \"\"\"Test decomposition with both optimization a1 and a2 from shende2006\"\"\"\\n dim = 2**nqubits\\n@@ -1538,9 +1538,15 @@ def test_opt_a1a2(self, nqubits):\\n circ = self.qsd(umat, opt_a1=True, opt_a2=True)\\n ccirc = transpile(circ, basis_gates=[\"u\", \"cx\"], optimization_level=0)\\n self.assertTrue(Operator(umat) == Operator(ccirc))\\n- self.assertEqual(\\n- ccirc.count_ops().get(\"cx\"), (23 / 48) * 4**nqubits - (3 / 2) * 2**nqubits + 4 / 3\\n- )\\n+ if nqubits > 2:\\n+ self.assertEqual(\\n+ ccirc.count_ops().get(\"cx\"),\\n+ (23 / 48) * 4**nqubits - (3 / 2) * 2**nqubits + 4 / 3,\\n+ )\\n+ elif nqubits == 1:\\n+ self.assertEqual(ccirc.count_ops().get(\"cx\", 0), 0)\\n+ elif nqubits == 2:\\n+ self.assertLessEqual(ccirc.count_ops().get(\"cx\", 0), 3)\\n \\n \\n class TestTwoQubitDecomposeUpToDiagonal(QiskitTestCase):\\n", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}163{"question_id": "MSB_Qiskit_qiskit_pr10163", "question_type": "multi_swe_bench", "description": "Fix output of `DensityMatrix.partial_transpose` to match input dimensions (Qiskit/qiskit#10163)", "content": {"org": "Qiskit", "repo": "qiskit", "pr_number": 10163, "issue_title": "Fix output of `DensityMatrix.partial_transpose` to match input dimensions", "issue_body": "<!--\\r\\n\u26a0\ufe0f If you do not respect this template, your pull request will be closed.\\r\\n\u26a0\ufe0f Your pull request title should be short detailed and understandable for all.\\r\\n\u26a0\ufe0f Also, please add a release note file using reno if the change needs to be\\r\\n documented in the release notes.\\r\\n\u26a0\ufe0f If your pull request fixes an open issue, please link to the issue.\\r\\n\\r\\n- [ ] I have added the tests to cover my changes.\\r\\n- [ ] I have updated the documentation accordingly.\\r\\n- [ ] I have read the CONTRIBUTING document.\\r\\n-->\\r\\n\\r\\n### Summary\\r\\nAdd dimensions to the `DensityMatrix` returned by `partial_transpose` so its dimensions match those of the input density matrix.\\r\\n\\r\\n\\r\\n### Details and comments\\r\\nFix #10155 \\r\\n\\r\\n", "base_commit": "716b648cb993de6e98cab4750374373d6cba2711", "resolved_issues": [{"number": 10155, "title": "`DensityMatrix.partial_transpose` does not preserve input dimensions", "body": "### Environment\\r\\n\\r\\n- **Qiskit Terra version**: to be released in 0.24.0\\r\\n- **Python version**: 3.10\\r\\n- **Operating system**: MacOS\\r\\n\\r\\n\\r\\n### What is happening?\\r\\n\\r\\nThe `partial_transpose` should return a density matrix of the same dimensionality as the input `DensityMatrix` object. When the dimensions are for systems different than qubits, the dimensions are currently not preserved. \\r\\n\\r\\n### How can we reproduce the issue?\\r\\n\\r\\nFor in the following example, the dimensions of the output density matrix \u03c12 are (9,) but they should be (3,3).\\r\\n\\r\\n```python\\r\\n>>> import numpy as np\\r\\n>>> from qiskit.quantum_info import Statevector, DensityMatrix\\r\\n>>> \u03c8 = Statevector(np.array([1,0,0,0,1,0,0,0,1])*1/np.sqrt(3),dims=(3,3))\\r\\n>>> \u03c11 = DensityMatrix(\u03c8)\\r\\n>>> \u03c11.dims()\\r\\n(3, 3)\\r\\n>>> \u03c12 = \u03c11.partial_transpose([0])\\r\\n>>> \u03c12.dims()\\r\\n(9,)\\r\\n```\\r\\n\\r\\n### What should happen?\\r\\n\\r\\nIt should be an easy fix. The function should return:\\r\\n```python\\r\\nreturn DensityMatrix(rho, dims=self.dims())\\r\\n```\\r\\n\\r\\ninstead of just:\\r\\n```python\\r\\nreturn DensityMatrix(rho)\\r\\n```\\r\\n\\r\\n### Any suggestions?\\r\\n\\r\\n_No response_"}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/qiskit_m_qiskit:pr-10163", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/qiskit/quantum_info/states/densitymatrix.py b/qiskit/quantum_info/states/densitymatrix.py\\nindex 124a382f01d1..3103ef23036a 100644\\n--- a/qiskit/quantum_info/states/densitymatrix.py\\n+++ b/qiskit/quantum_info/states/densitymatrix.py\\n@@ -832,4 +832,4 @@ def partial_transpose(self, qargs):\\n lst[i], lst[i + n] = lst[i + n], lst[i]\\n rho = np.transpose(arr, lst)\\n rho = np.reshape(rho, self._op_shape.shape)\\n- return DensityMatrix(rho)\\n+ return DensityMatrix(rho, dims=self.dims())\\ndiff --git a/releasenotes/notes/fix-partial-transpose-output-dims-3082fcf4147055dc.yaml b/releasenotes/notes/fix-partial-transpose-output-dims-3082fcf4147055dc.yaml\\nnew file mode 100644\\nindex 000000000000..edba41333ce8\\n--- /dev/null\\n+++ b/releasenotes/notes/fix-partial-transpose-output-dims-3082fcf4147055dc.yaml\\n@@ -0,0 +1,5 @@\\n+---\\n+fixes:\\n+ - |\\n+ Fixed the dimensions of the output density matrix from :meth:`.DensityMatrix.partial_transpose`\\n+ so they match the dimensions of the corresponding input density matrix.\\n"}, "test": {"test_patch": "diff --git a/test/python/quantum_info/states/test_densitymatrix.py b/test/python/quantum_info/states/test_densitymatrix.py\\nindex 8886e35cc288..16fbbbc1b9a4 100644\\n--- a/test/python/quantum_info/states/test_densitymatrix.py\\n+++ b/test/python/quantum_info/states/test_densitymatrix.py\\n@@ -1219,6 +1219,15 @@ def test_density_matrix_partial_transpose(self):\\n self.assertEqual(rho.partial_transpose([0]), DensityMatrix(rho1))\\n self.assertEqual(rho.partial_transpose([1]), DensityMatrix(rho1))\\n \\n+ with self.subTest(msg=\"dims(3,3)\"):\\n+ mat = np.zeros((9, 9))\\n+ mat1 = np.zeros((9, 9))\\n+ mat[8, 0] = 1\\n+ mat1[0, 8] = 1\\n+ rho = DensityMatrix(mat, dims=(3, 3))\\n+ rho1 = DensityMatrix(mat1, dims=(3, 3))\\n+ self.assertEqual(rho.partial_transpose([0, 1]), rho1)\\n+\\n def test_clip_probabilities(self):\\n \"\"\"Test probabilities are clipped to [0, 1].\"\"\"\\n dm = DensityMatrix([[1.1, 0], [0, 0]])\\n", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}164{"question_id": "MSB_Qiskit_qiskit_pr10631", "question_type": "multi_swe_bench", "description": " Removed 2pi wrapping for global phase parameter (Qiskit/qiskit#10631)", "content": {"org": "Qiskit", "repo": "qiskit", "pr_number": 10631, "issue_title": " Removed 2pi wrapping for global phase parameter", "issue_body": "It fixes #10569\\r\\n<!--\\r\\n\u26a0\ufe0f If you do not respect this template, your pull request will be closed.\\r\\n\u26a0\ufe0f Your pull request title should be short detailed and understandable for all.\\r\\n\u26a0\ufe0f Also, please add a release note file using reno if the change needs to be\\r\\n documented in the release notes.\\r\\n\u26a0\ufe0f If your pull request fixes an open issue, please link to the issue.\\r\\n\\r\\n- [ ] I have added the tests to cover my changes.\\r\\n- [ ] I have updated the documentation accordingly.\\r\\n- [ ] I have read the CONTRIBUTING document.\\r\\n-->\\r\\n\\r\\n### Summary\\r\\nRemoved `_mod_2pi` function.\\r\\n\\r\\n\\r\\n### Details and comments\\r\\nIt is similiar to Qiskit/qiskit-ibm-provider#689\\r\\n\\r\\n\\r\\n", "base_commit": "fd8a7dfb6f9667cae82452dac47156bfb86dc3f2", "resolved_issues": [{"number": 10569, "title": "Cannot apply dynamical decoupling on a circuit with parameterized global phase", "body": "### Environment\\n\\n- **Qiskit Terra version**: 0.25 \\r\\n- **Python version**: 3.11\\r\\n- **Operating system**: Windows\\r\\n\\n\\n### What is happening?\\n\\nDynamical decoupling cannot be applied on a circuit with a parameterized global phase, due to a failing `_mod_2pi` wrapping \\n\\n### How can we reproduce the issue?\\n\\n```python\\r\\nfrom qiskit.transpiler.passes import ALAPScheduleAnalysis, PadDynamicalDecoupling\\r\\nfrom qiskit.transpiler import PassManager, InstructionDurations\\r\\nfrom qiskit.circuit.library import XGate\\r\\nfrom qiskit.circuit import Parameter\\r\\ndurations = InstructionDurations.from_backend(backend)\\r\\n\\r\\nqc = QuantumCircuit(1,1)\\r\\nqc.sx(0)\\r\\nqc.delay(1600, 0)\\r\\nqc.sx(0)\\r\\nqc.global_phase=Parameter('a')\\r\\n\\r\\npm = PassManager([ALAPScheduleAnalysis(durations), PadDynamicalDecoupling(durations, [XGate(), XGate()])])\\r\\npm.run(qc)\\r\\n```\\r\\n\\r\\nerrors in\\r\\nhttps://github.com/Qiskit/qiskit-terra/blob/c29e938c2ba1c359a0a3268679c68f3237b2c1b7/qiskit/transpiler/passes/scheduling/dynamical_decoupling.py#L260\\r\\nwith:\\r\\n`TypeError: unsupported operand type(s) for %: 'ParameterExpression' and 'float'`\\n\\n### What should happen?\\n\\nRun the DD transpiler pass successfully\\n\\n### Any suggestions?\\n\\nDon't wrap global phase if parameterized, see same issue in https://github.com/Qiskit/qiskit-ibm-provider/pull/689"}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/qiskit_m_qiskit:pr-10631", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/qiskit/transpiler/passes/scheduling/dynamical_decoupling.py b/qiskit/transpiler/passes/scheduling/dynamical_decoupling.py\\nindex 87bbdbff919c..cf8477278372 100644\\n--- a/qiskit/transpiler/passes/scheduling/dynamical_decoupling.py\\n+++ b/qiskit/transpiler/passes/scheduling/dynamical_decoupling.py\\n@@ -274,7 +274,7 @@ def run(self, dag):\\n if gate is not None:\\n new_dag.apply_operation_back(gate, [dag_qubit], check=False)\\n \\n- new_dag.global_phase = _mod_2pi(new_dag.global_phase + sequence_gphase)\\n+ new_dag.global_phase = new_dag.global_phase + sequence_gphase\\n \\n return new_dag\\n \\n@@ -283,11 +283,3 @@ def __gate_supported(self, gate: Gate, qarg: int) -> bool:\\n if self._target is None or self._target.instruction_supported(gate.name, qargs=(qarg,)):\\n return True\\n return False\\n-\\n-\\n-def _mod_2pi(angle: float, atol: float = 0):\\n- \"\"\"Wrap angle into interval [-\u03c0,\u03c0). If within atol of the endpoint, clamp to -\u03c0\"\"\"\\n- wrapped = (angle + np.pi) % (2 * np.pi) - np.pi\\n- if abs(wrapped - np.pi) < atol:\\n- wrapped = -np.pi\\n- return wrapped\\ndiff --git a/qiskit/transpiler/passes/scheduling/padding/dynamical_decoupling.py b/qiskit/transpiler/passes/scheduling/padding/dynamical_decoupling.py\\nindex 2d4114f3cfc7..9137133567ec 100644\\n--- a/qiskit/transpiler/passes/scheduling/padding/dynamical_decoupling.py\\n+++ b/qiskit/transpiler/passes/scheduling/padding/dynamical_decoupling.py\\n@@ -394,8 +394,7 @@ def _constrained_length(values):\\n gate_length = self._dd_sequence_lengths[qubit][dd_ind]\\n self._apply_scheduled_op(dag, idle_after, gate, qubit)\\n idle_after += gate_length\\n-\\n- dag.global_phase = self._mod_2pi(dag.global_phase + sequence_gphase)\\n+ dag.global_phase = dag.global_phase + sequence_gphase\\n \\n @staticmethod\\n def _resolve_params(gate: Gate) -> tuple:\\n@@ -407,11 +406,3 @@ def _resolve_params(gate: Gate) -> tuple:\\n else:\\n params.append(p)\\n return tuple(params)\\n-\\n- @staticmethod\\n- def _mod_2pi(angle: float, atol: float = 0):\\n- \"\"\"Wrap angle into interval [-\u03c0,\u03c0). If within atol of the endpoint, clamp to -\u03c0\"\"\"\\n- wrapped = (angle + np.pi) % (2 * np.pi) - np.pi\\n- if abs(wrapped - np.pi) < atol:\\n- wrapped = -np.pi\\n- return wrapped\\ndiff --git a/releasenotes/notes/fix-param-global-phase-31547267f6124552.yaml b/releasenotes/notes/fix-param-global-phase-31547267f6124552.yaml\\nnew file mode 100644\\nindex 000000000000..13048f626dc4\\n--- /dev/null\\n+++ b/releasenotes/notes/fix-param-global-phase-31547267f6124552.yaml\\n@@ -0,0 +1,7 @@\\n+---\\n+fixes:\\n+ - |\\n+ Fixed compatibility of :class:`.DynamicalDecoupling` and\\n+ :class:`.PadDynamicalDecoupling` with circuits that have a parameterized\\n+ global phase.\\n+ Fixed `#10569 <https://github.com/Qiskit/qiskit-terra/issues/10569>`__.\\n"}, "test": {"test_patch": "diff --git a/test/python/transpiler/test_dynamical_decoupling.py b/test/python/transpiler/test_dynamical_decoupling.py\\nindex b74091dd76f8..e53fb9b0226e 100644\\n--- a/test/python/transpiler/test_dynamical_decoupling.py\\n+++ b/test/python/transpiler/test_dynamical_decoupling.py\\n@@ -1031,6 +1031,25 @@ def test_respect_target_instruction_constraints(self):\\n expected.delay(200, [0])\\n self.assertEqual(expected, scheduled)\\n \\n+ def test_paramaterized_global_phase(self):\\n+ \"\"\"Test paramaterized global phase in DD circuit.\\n+ See:https://github.com/Qiskit/qiskit-terra/issues/10569\\n+ \"\"\"\\n+ dd_sequence = [XGate(), YGate()] * 2\\n+ qc = QuantumCircuit(1, 1)\\n+ qc.h(0)\\n+ qc.delay(1700, 0)\\n+ qc.y(0)\\n+ qc.global_phase = Parameter(\"a\")\\n+ pm = PassManager(\\n+ [\\n+ ALAPScheduleAnalysis(self.durations),\\n+ PadDynamicalDecoupling(self.durations, dd_sequence),\\n+ ]\\n+ )\\n+\\n+ self.assertEqual(qc.global_phase + np.pi, pm.run(qc).global_phase)\\n+\\n \\n if __name__ == \"__main__\":\\n unittest.main()\\n", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}165{"question_id": "MSB_Qiskit_qiskit_pr10834", "question_type": "multi_swe_bench", "description": "Allow dynamical decoupling pass to work on circuits with pulse gates (Qiskit/qiskit#10834)", "content": {"org": "Qiskit", "repo": "qiskit", "pr_number": 10834, "issue_title": "Allow dynamical decoupling pass to work on circuits with pulse gates ", "issue_body": "### Summary\\r\\n\\r\\nAllow dynamical decoupling pass to work on circuits with pulse gates \\r\\n\\r\\n### Details and comments\\r\\n\\r\\nThe pass was accessing the circuit calibrations incorrectly, resulting in\\r\\nan error when one of the gates in the dynamical decoupling sequence had\\r\\na pulse gate calibration.\\r\\n\\r\\nCloses #10833", "base_commit": "3aa80c9b3d1a5819c544c413bd9af286af7bc057", "resolved_issues": [{"number": 10833, "title": "Dynamical decoupling fails when a gate in the decoupling sequence has a calibration attached to the circuit", "body": "### Environment\\n\\n- **Qiskit Terra version**: 0.25.1\\r\\n- **Python version**: 3.10\\r\\n- **Operating system**: Fedora Linux\\r\\n\\n\\n### What is happening?\\n\\n`PadDynamicalDecoupling` raises `TypeError: unhashable type: 'list'` when run on a circuit with a calibration for one of the gates in the decoupling sequence.\\n\\n### How can we reproduce the issue?\\n\\n```python\\r\\nfrom qiskit_ibm_provider import IBMProvider\\r\\n\\r\\n\\r\\nprovider = IBMProvider()\\r\\nbackend = provider.get_backend(\"ibm_nazca\")\\r\\n\\r\\n\\r\\nimport numpy as np\\r\\n\\r\\nfrom qiskit import pulse, QuantumCircuit\\r\\nfrom qiskit.transpiler import PassManager\\r\\nfrom qiskit.transpiler.passes import ALAPScheduleAnalysis, PadDynamicalDecoupling\\r\\nfrom qiskit.circuit.library import XGate, YGate\\r\\nfrom qiskit.pulse import DriveChannel\\r\\n\\r\\n\\r\\ninst_sched_map = backend.instruction_schedule_map\\r\\n\\r\\n\\r\\ncirc = QuantumCircuit(1, 1)\\r\\ncirc.x(0)\\r\\ncirc.delay(1600, 0)\\r\\ncirc.x(0)\\r\\n\\r\\nfor qubit in range(backend.configuration().n_qubits):\\r\\n with pulse.build(f\"y gate for qubit {qubit}\") as sched:\\r\\n with pulse.phase_offset(np.pi / 2, DriveChannel(qubit)):\\r\\n x_sched = inst_sched_map.get(\"x\", qubits=[qubit])\\r\\n pulse.call(x_sched)\\r\\n circ.add_calibration(\"y\", [qubit], sched)\\r\\n\\r\\ndd_sequence = [XGate(), YGate()]*4\\r\\ndurations = backend.target.durations()\\r\\n\\r\\npm = PassManager(\\r\\n [\\r\\n ALAPScheduleAnalysis(durations),\\r\\n PadDynamicalDecoupling(\\r\\n durations,\\r\\n dd_sequence,\\r\\n pulse_alignment=backend.configuration().timing_constraints[\\r\\n \"pulse_alignment\"\\r\\n ],\\r\\n ),\\r\\n ]\\r\\n )\\r\\n\\r\\npm.run(circ)\\r\\n```\\n\\n### What should happen?\\n\\nThe duration of the gate calibration should be used to schedule the decoupling sequence.\\n\\n### Any suggestions?\\n\\nA PR with a fix will be opened shortly."}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/qiskit_m_qiskit:pr-10834", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/qiskit/transpiler/passes/scheduling/padding/dynamical_decoupling.py b/qiskit/transpiler/passes/scheduling/padding/dynamical_decoupling.py\\nindex bbb1b39bbd72..fb33361a4959 100644\\n--- a/qiskit/transpiler/passes/scheduling/padding/dynamical_decoupling.py\\n+++ b/qiskit/transpiler/passes/scheduling/padding/dynamical_decoupling.py\\n@@ -16,7 +16,7 @@\\n import logging\\n import numpy as np\\n \\n-from qiskit.circuit import Qubit, Gate\\n+from qiskit.circuit import Gate, ParameterExpression, Qubit\\n from qiskit.circuit.delay import Delay\\n from qiskit.circuit.library.standard_gates import IGate, UGate, U3Gate\\n from qiskit.circuit.reset import Reset\\n@@ -227,7 +227,8 @@ def _pre_runhook(self, dag: DAGCircuit):\\n for gate in self._dd_sequence:\\n try:\\n # Check calibration.\\n- gate_length = dag.calibrations[gate.name][(physical_index, gate.params)]\\n+ params = self._resolve_params(gate)\\n+ gate_length = dag.calibrations[gate.name][((physical_index,), params)].duration\\n if gate_length % self._alignment != 0:\\n # This is necessary to implement lightweight scheduling logic for this pass.\\n # Usually the pulse alignment constraint and pulse data chunk size take\\n@@ -394,6 +395,17 @@ def _constrained_length(values):\\n \\n dag.global_phase = self._mod_2pi(dag.global_phase + sequence_gphase)\\n \\n+ @staticmethod\\n+ def _resolve_params(gate: Gate) -> tuple:\\n+ \"\"\"Return gate params with any bound parameters replaced with floats\"\"\"\\n+ params = []\\n+ for p in gate.params:\\n+ if isinstance(p, ParameterExpression) and not p.parameters:\\n+ params.append(float(p))\\n+ else:\\n+ params.append(p)\\n+ return tuple(params)\\n+\\n @staticmethod\\n def _mod_2pi(angle: float, atol: float = 0):\\n \"\"\"Wrap angle into interval [-\u03c0,\u03c0). If within atol of the endpoint, clamp to -\u03c0\"\"\"\\ndiff --git a/releasenotes/notes/dd-pg-10833-ddddee68ffd913c4.yaml b/releasenotes/notes/dd-pg-10833-ddddee68ffd913c4.yaml\\nnew file mode 100644\\nindex 000000000000..cdf23b9ef9a3\\n--- /dev/null\\n+++ b/releasenotes/notes/dd-pg-10833-ddddee68ffd913c4.yaml\\n@@ -0,0 +1,7 @@\\n+---\\n+fixes:\\n+ - |\\n+ Fixed a bug in the :class:`.PadDynamicalDecoupling` transpiler pass which\\n+ would cause the pass to fail if a circuit contained a pulse gate\\n+ calibration for one of the gates in the decoupling sequence. Fixed `#10833\\n+ <https://github.com/Qiskit/qiskit/issues/10833>`_.\\n"}, "test": {"test_patch": "diff --git a/test/python/transpiler/test_dynamical_decoupling.py b/test/python/transpiler/test_dynamical_decoupling.py\\nindex bd8c44ab0973..6ae6a7b3c311 100644\\n--- a/test/python/transpiler/test_dynamical_decoupling.py\\n+++ b/test/python/transpiler/test_dynamical_decoupling.py\\n@@ -17,7 +17,8 @@\\n from numpy import pi\\n from ddt import ddt, data\\n \\n-from qiskit.circuit import QuantumCircuit, Delay, Measure, Reset, Parameter\\n+from qiskit import pulse\\n+from qiskit.circuit import Gate, QuantumCircuit, Delay, Measure, Reset, Parameter\\n from qiskit.circuit.library import XGate, YGate, RXGate, UGate, CXGate, HGate\\n from qiskit.quantum_info import Operator\\n from qiskit.transpiler.instruction_durations import InstructionDurations\\n@@ -29,7 +30,6 @@\\n from qiskit.transpiler.passmanager import PassManager\\n from qiskit.transpiler.exceptions import TranspilerError\\n from qiskit.transpiler.target import Target, InstructionProperties\\n-from qiskit import pulse\\n \\n from qiskit.test import QiskitTestCase\\n \\n@@ -339,6 +339,154 @@ def test_insert_dd_ghz_everywhere(self):\\n \\n self.assertEqual(ghz4_dd, expected)\\n \\n+ def test_insert_dd_with_pulse_gate_calibrations(self):\\n+ \"\"\"Test DD gates are inserted without error when circuit calibrations are used\\n+\\n+ \u250c\u2500\u2500\u2500\u2510 \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510 \u250c\u2500\u2500\u2500\u2510 \u00bb\\n+ q_0: \u2500\u2500\u2500\u2500\u2500\u2500\u2524 H \u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u25a0\u2500\u2500\u2524 Delay(75[dt]) \u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2524 X \u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u00bb\\n+ \u250c\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2510 \u250c\u2500\u2534\u2500\u2510\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\u250c\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2510\u00bb\\n+ q_1: \u2524 Delay(50[dt]) \u251c\u2500\u2524 X \u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u25a0\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524 Delay(300[dt]) \u251c\u00bb\\n+ \u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2510\u2514\u2500\u2500\u2500\u2518 \u250c\u2500\u2534\u2500\u2510 \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\u00bb\\n+ q_2: \u2524 Delay(750[dt]) \u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524 X \u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u25a0\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u00bb\\n+ \u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524 \u2514\u2500\u2500\u2500\u2518 \u250c\u2500\u2534\u2500\u2510 \u00bb\\n+ q_3: \u2524 Delay(950[dt]) \u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524 X \u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u00bb\\n+ \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518 \u2514\u2500\u2500\u2500\u2518 \u00bb\\n+ meas: 4/\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u00bb\\n+ \u00bb\\n+ \u00ab \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\u250c\u2500\u2500\u2500\u2510\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510 \u2591 \u250c\u2500\u2510\\n+ \u00ab q_0: \u2524 Delay(150[dt]) \u251c\u2524 X \u251c\u2524 Delay(75[dt]) \u251c\u2500\u2591\u2500\u2524M\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\\n+ \u00ab \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\u2514\u2500\u2500\u2500\u2518\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518 \u2591 \u2514\u2565\u2518\u250c\u2500\u2510\\n+ \u00ab q_1: \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2591\u2500\u2500\u256b\u2500\u2524M\u251c\u2500\u2500\u2500\u2500\u2500\u2500\\n+ \u00ab \u2591 \u2551 \u2514\u2565\u2518\u250c\u2500\u2510\\n+ \u00ab q_2: \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2591\u2500\u2500\u256b\u2500\u2500\u256b\u2500\u2524M\u251c\u2500\u2500\u2500\\n+ \u00ab \u2591 \u2551 \u2551 \u2514\u2565\u2518\u250c\u2500\u2510\\n+ \u00ab q_3: \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2591\u2500\u2500\u256b\u2500\u2500\u256b\u2500\u2500\u256b\u2500\u2524M\u251c\\n+ \u00ab \u2591 \u2551 \u2551 \u2551 \u2514\u2565\u2518\\n+ \u00abmeas: 4/\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2569\u2550\u2550\u2569\u2550\u2550\u2569\u2550\u2550\u2569\u2550\\n+ \u00ab 0 1 2 3\\n+ \"\"\"\\n+ dd_sequence = [XGate(), XGate()]\\n+ pm = PassManager(\\n+ [\\n+ ALAPScheduleAnalysis(self.durations),\\n+ PadDynamicalDecoupling(self.durations, dd_sequence, qubits=[0]),\\n+ ]\\n+ )\\n+\\n+ # Change duration to 100 from the 50 in self.durations to make sure\\n+ # gate duration is used correctly.\\n+ with pulse.builder.build() as x_sched:\\n+ pulse.builder.delay(100, pulse.DriveChannel(0))\\n+\\n+ circ_in = self.ghz4.measure_all(inplace=False)\\n+ circ_in.add_calibration(XGate(), (0,), x_sched)\\n+\\n+ ghz4_dd = pm.run(circ_in)\\n+\\n+ expected = self.ghz4.copy()\\n+ expected = expected.compose(Delay(50), [1], front=True)\\n+ expected = expected.compose(Delay(750), [2], front=True)\\n+ expected = expected.compose(Delay(950), [3], front=True)\\n+\\n+ # Delays different from those of the default case using self.durations\\n+ expected = expected.compose(Delay(75), [0])\\n+ expected = expected.compose(XGate(), [0])\\n+ expected = expected.compose(Delay(150), [0])\\n+ expected = expected.compose(XGate(), [0])\\n+ expected = expected.compose(Delay(75), [0])\\n+\\n+ expected = expected.compose(Delay(300), [1])\\n+\\n+ expected.measure_all()\\n+ expected.add_calibration(XGate(), (0,), x_sched)\\n+\\n+ self.assertEqual(ghz4_dd, expected)\\n+\\n+ def test_insert_dd_with_pulse_gate_calibrations_with_parmas(self):\\n+ \"\"\"Test DD gates are inserted without error when parameterized circuit calibrations are used\\n+\\n+ \u250c\u2500\u2500\u2500\u2510 \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510 \u250c\u2500\u2500\u2500\u2510 \u00bb\\n+ q_0: \u2500\u2500\u2500\u2500\u2500\u2500\u2524 H \u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u25a0\u2500\u2500\u2524 Delay(75[dt]) \u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2524 X \u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u00bb\\n+ \u250c\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2510 \u250c\u2500\u2534\u2500\u2510\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\u250c\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2510\u00bb\\n+ q_1: \u2524 Delay(50[dt]) \u251c\u2500\u2524 X \u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u25a0\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524 Delay(300[dt]) \u251c\u00bb\\n+ \u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2510\u2514\u2500\u2500\u2500\u2518 \u250c\u2500\u2534\u2500\u2510 \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\u00bb\\n+ q_2: \u2524 Delay(750[dt]) \u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524 X \u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u25a0\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u00bb\\n+ \u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524 \u2514\u2500\u2500\u2500\u2518 \u250c\u2500\u2534\u2500\u2510 \u00bb\\n+ q_3: \u2524 Delay(950[dt]) \u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524 X \u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u00bb\\n+ \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518 \u2514\u2500\u2500\u2500\u2518 \u00bb\\n+ meas: 4/\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u00bb\\n+ \u00bb\\n+ \u00ab \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\u250c\u2500\u2500\u2500\u2510\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510 \u2591 \u250c\u2500\u2510\\n+ \u00ab q_0: \u2524 Delay(150[dt]) \u251c\u2524 X \u251c\u2524 Delay(75[dt]) \u251c\u2500\u2591\u2500\u2524M\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\\n+ \u00ab \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\u2514\u2500\u2500\u2500\u2518\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518 \u2591 \u2514\u2565\u2518\u250c\u2500\u2510\\n+ \u00ab q_1: \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2591\u2500\u2500\u256b\u2500\u2524M\u251c\u2500\u2500\u2500\u2500\u2500\u2500\\n+ \u00ab \u2591 \u2551 \u2514\u2565\u2518\u250c\u2500\u2510\\n+ \u00ab q_2: \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2591\u2500\u2500\u256b\u2500\u2500\u256b\u2500\u2524M\u251c\u2500\u2500\u2500\\n+ \u00ab \u2591 \u2551 \u2551 \u2514\u2565\u2518\u250c\u2500\u2510\\n+ \u00ab q_3: \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2591\u2500\u2500\u256b\u2500\u2500\u256b\u2500\u2500\u256b\u2500\u2524M\u251c\\n+ \u00ab \u2591 \u2551 \u2551 \u2551 \u2514\u2565\u2518\\n+ \u00abmeas: 4/\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2569\u2550\u2550\u2569\u2550\u2550\u2569\u2550\u2550\u2569\u2550\\n+ \u00ab 0 1 2 3\\n+ \"\"\"\\n+ # Change duration to 100 from the 50 in self.durations to make sure\\n+ # gate duration is used correctly.\\n+ amp = Parameter(\"amp\")\\n+ with pulse.builder.build() as sched:\\n+ pulse.builder.play(\\n+ pulse.Gaussian(100, amp=amp, sigma=10.0),\\n+ pulse.DriveChannel(0),\\n+ )\\n+\\n+ class Echo(Gate):\\n+ \"\"\"Dummy Gate subclass for testing\\n+\\n+ In this test, we use a non-standard gate so we can add parameters\\n+ to it, in order to test the handling of parameters by\\n+ PadDynamicalDecoupling. PadDynamicalDecoupling checks that the DD\\n+ sequence is equivalent to the identity, so we can not use Gate\\n+ directly. Here we subclass Gate and add the identity as its matrix\\n+ representation to satisfy PadDynamicalDecoupling's check.\\n+ \"\"\"\\n+\\n+ def __array__(self, dtype=None):\\n+ return np.eye(2, dtype=dtype)\\n+\\n+ # A gate with one unbound and one bound parameter to leave in the final\\n+ # circuit.\\n+ echo = Echo(\"echo\", 1, [amp, 10.0])\\n+\\n+ circ_in = self.ghz4.measure_all(inplace=False)\\n+ circ_in.add_calibration(echo, (0,), sched)\\n+\\n+ dd_sequence = [echo, echo]\\n+ pm = PassManager(\\n+ [\\n+ ALAPScheduleAnalysis(self.durations),\\n+ PadDynamicalDecoupling(self.durations, dd_sequence, qubits=[0]),\\n+ ]\\n+ )\\n+\\n+ ghz4_dd = pm.run(circ_in)\\n+\\n+ expected = self.ghz4.copy()\\n+ expected = expected.compose(Delay(50), [1], front=True)\\n+ expected = expected.compose(Delay(750), [2], front=True)\\n+ expected = expected.compose(Delay(950), [3], front=True)\\n+\\n+ # Delays different from those of the default case using self.durations\\n+ expected = expected.compose(Delay(75), [0])\\n+ expected = expected.compose(echo, [0])\\n+ expected = expected.compose(Delay(150), [0])\\n+ expected = expected.compose(echo, [0])\\n+ expected = expected.compose(Delay(75), [0])\\n+\\n+ expected = expected.compose(Delay(300), [1])\\n+\\n+ expected.measure_all()\\n+ expected.add_calibration(echo, (0,), sched)\\n+\\n+ self.assertEqual(ghz4_dd, expected)\\n+\\n def test_insert_dd_ghz_xy4(self):\\n \"\"\"Test XY4 sequence of DD gates.\\n \\n", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}166{"question_id": "MSB_Qiskit_qiskit_pr10850", "question_type": "multi_swe_bench", "description": "Fix bug in qs_decomposition (Qiskit/qiskit#10850)", "content": {"org": "Qiskit", "repo": "qiskit", "pr_number": 10850, "issue_title": "Fix bug in qs_decomposition", "issue_body": "<!--\\r\\n\u26a0\ufe0f If you do not respect this template, your pull request will be closed.\\r\\n\u26a0\ufe0f Your pull request title should be short detailed and understandable for all.\\r\\n\u26a0\ufe0f Also, please add a release note file using reno if the change needs to be\\r\\n documented in the release notes.\\r\\n\u26a0\ufe0f If your pull request fixes an open issue, please link to the issue.\\r\\n\\r\\n- [x] I have added the tests to cover my changes.\\r\\n- [x] I have updated the documentation accordingly.\\r\\n- [x] I have read the CONTRIBUTING document.\\r\\n-->\\r\\n\\r\\n### Summary\\r\\nfixes #10787\\r\\n\\r\\n\\r\\n### Details and comments\\r\\nThe unitary described in this issue was causing a single 2q unitary to be generated in the quantum shannon decomposition, when opt_a2==True, which couldn't take advantage of this diagonal commutation optimization and would error. The fix instead leaves this as an undecomposed 2-qubit unitary gate.\\r\\n\\r\\n", "base_commit": "4e49a569459733404c33c60c60f914470c38cc32", "resolved_issues": [{"number": 10787, "title": "```Gate.control``` method throwing error", "body": "### Environment\\r\\n\\r\\n- **Qiskit Terra version**: 0.24.0\\r\\n- **Python version**: Python 3.9.6\\r\\n\\r\\n### What is happening?\\r\\n\\r\\nGiven a quantum circuit object, we execute the ```to_gate()``` method and attempt to call the ```Gate.control()``` method with appropriate parameters and sometimes observe the following error: ```*** UnboundLocalError: local variable 'mat2'``` referenced before assignment\\r\\n\\r\\n### How can we reproduce the issue?\\r\\n\\r\\n``` \\r\\nfrom qiskit.extensions import UnitaryGate\\r\\nfrom qiskit import QuantumCircuit, QuantumRegister\\r\\n\\r\\n# initialize a unitary matrix\\r\\n\\r\\nA = np.array([[ 0.+0.j, 0.+0.j, 0.+0.j, 0.+0.j, 1.+0.j, 0.+0.j, 0.+0.j,\\r\\n 0.+0.j],\\r\\n [ 0.+0.j, 0.+0.j, 0.+0.j, 0.+0.j, 0.+0.j, 1.+0.j, 0.+0.j,\\r\\n 0.+0.j],\\r\\n [ 0.+0.j, 0.+0.j, 0.+0.j, 0.+0.j, 0.+0.j, 0.+0.j, -1.+0.j,\\r\\n 0.+0.j],\\r\\n [ 0.+0.j, 0.+0.j, 0.+0.j, 0.+0.j, 0.+0.j, 0.+0.j, 0.+0.j,\\r\\n -1.+0.j],\\r\\n [ 1.+0.j, 0.+0.j, 0.+0.j, 0.+0.j, 0.+0.j, 0.+0.j, 0.+0.j,\\r\\n 0.+0.j],\\r\\n [ 0.+0.j, 1.+0.j, 0.+0.j, 0.+0.j, 0.+0.j, 0.+0.j, 0.+0.j,\\r\\n 0.+0.j],\\r\\n [ 0.+0.j, 0.+0.j, -1.+0.j, 0.+0.j, 0.+0.j, 0.+0.j, 0.+0.j,\\r\\n 0.+0.j],\\r\\n [ 0.+0.j, 0.+0.j, 0.+0.j, -1.+0.j, 0.+0.j, 0.+0.j, 0.+0.j,\\r\\n 0.+0.j]])\\r\\n\\r\\ngate = UnitaryGate(A)\\r\\nqc = QuantumCircuit(3)\\r\\nqc.append(gate,[0,1,2])\\r\\n\\r\\n# This happens in a a different function than the operations above\\r\\n\\r\\nCU = qc.to_gate().control(6,28)\\r\\n```\\r\\n\\r\\n### What should happen?\\r\\n\\r\\nI would assume that the error is not thrown\\r\\n\\r\\n### Any suggestions?\\r\\n\\r\\nThe error appears to come from the file ```qsd.py```, and in particular because the list ```ind2q``` (line 234) has only one element. The for loop that starts on line 242 is thus never executed and the the variable ```mat2``` is never initialized. "}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/qiskit_m_qiskit:pr-10850", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/qiskit/quantum_info/synthesis/qsd.py b/qiskit/quantum_info/synthesis/qsd.py\\nindex b2f00a56045d..80892a606d7e 100644\\n--- a/qiskit/quantum_info/synthesis/qsd.py\\n+++ b/qiskit/quantum_info/synthesis/qsd.py\\n@@ -243,7 +243,11 @@ def _apply_a2(circ):\\n for i, instruction in enumerate(ccirc.data):\\n if instruction.operation.name == \"qsd2q\":\\n ind2q.append(i)\\n- if not ind2q:\\n+ if len(ind2q) == 0:\\n+ return ccirc\\n+ elif len(ind2q) == 1:\\n+ # No neighbors to merge diagonal into; revert name\\n+ ccirc.data[ind2q[0]].operation.name = \"Unitary\"\\n return ccirc\\n # rolling over diagonals\\n ind2 = None # lint\\ndiff --git a/releasenotes/notes/10787-078d7caa70fc7de8.yaml b/releasenotes/notes/10787-078d7caa70fc7de8.yaml\\nnew file mode 100644\\nindex 000000000000..ae22987bb75f\\n--- /dev/null\\n+++ b/releasenotes/notes/10787-078d7caa70fc7de8.yaml\\n@@ -0,0 +1,7 @@\\n+---\\n+fixes:\\n+ - |\\n+ Fix the Quantum Shannon Decomposition implemented in :func:`.qs_decomposition`. When a unitary\\n+ could not take advantage of the diagonal commutation optimization, it used to error.\\n+ Now, it leaves it as undecomposed 2-qubit unitary gate.\\n+ Fixes `#10787 <https://github.com/Qiskit/qiskit/issues/10787>`__\\n"}, "test": {"test_patch": "diff --git a/test/python/quantum_info/test_synthesis.py b/test/python/quantum_info/test_synthesis.py\\nindex 19ec8b8139e9..043abf8c87f8 100644\\n--- a/test/python/quantum_info/test_synthesis.py\\n+++ b/test/python/quantum_info/test_synthesis.py\\n@@ -1548,6 +1548,105 @@ def test_opt_a1a2(self, nqubits):\\n elif nqubits == 2:\\n self.assertLessEqual(ccirc.count_ops().get(\"cx\", 0), 3)\\n \\n+ def test_a2_opt_single_2q(self):\\n+ \"\"\"\\n+ Test a2_opt when a unitary causes a single final 2-qubit unitary for which this optimization\\n+ won't help. This came up in issue 10787.\\n+ \"\"\"\\n+ # this somewhat unique signed permutation matrix seems to cause the issue\\n+ mat = np.array(\\n+ [\\n+ [\\n+ 0.0 + 0.0j,\\n+ 0.0 + 0.0j,\\n+ 0.0 + 0.0j,\\n+ 0.0 + 0.0j,\\n+ 1.0 + 0.0j,\\n+ 0.0 + 0.0j,\\n+ 0.0 + 0.0j,\\n+ 0.0 + 0.0j,\\n+ ],\\n+ [\\n+ 0.0 + 0.0j,\\n+ 0.0 + 0.0j,\\n+ 0.0 + 0.0j,\\n+ 0.0 + 0.0j,\\n+ 0.0 + 0.0j,\\n+ 1.0 + 0.0j,\\n+ 0.0 + 0.0j,\\n+ 0.0 + 0.0j,\\n+ ],\\n+ [\\n+ 0.0 + 0.0j,\\n+ 0.0 + 0.0j,\\n+ 0.0 + 0.0j,\\n+ 0.0 + 0.0j,\\n+ 0.0 + 0.0j,\\n+ 0.0 + 0.0j,\\n+ -1.0 + 0.0j,\\n+ 0.0 + 0.0j,\\n+ ],\\n+ [\\n+ 0.0 + 0.0j,\\n+ 0.0 + 0.0j,\\n+ 0.0 + 0.0j,\\n+ 0.0 + 0.0j,\\n+ 0.0 + 0.0j,\\n+ 0.0 + 0.0j,\\n+ 0.0 + 0.0j,\\n+ -1.0 + 0.0j,\\n+ ],\\n+ [\\n+ 1.0 + 0.0j,\\n+ 0.0 + 0.0j,\\n+ 0.0 + 0.0j,\\n+ 0.0 + 0.0j,\\n+ 0.0 + 0.0j,\\n+ 0.0 + 0.0j,\\n+ 0.0 + 0.0j,\\n+ 0.0 + 0.0j,\\n+ ],\\n+ [\\n+ 0.0 + 0.0j,\\n+ 1.0 + 0.0j,\\n+ 0.0 + 0.0j,\\n+ 0.0 + 0.0j,\\n+ 0.0 + 0.0j,\\n+ 0.0 + 0.0j,\\n+ 0.0 + 0.0j,\\n+ 0.0 + 0.0j,\\n+ ],\\n+ [\\n+ 0.0 + 0.0j,\\n+ 0.0 + 0.0j,\\n+ -1.0 + 0.0j,\\n+ 0.0 + 0.0j,\\n+ 0.0 + 0.0j,\\n+ 0.0 + 0.0j,\\n+ 0.0 + 0.0j,\\n+ 0.0 + 0.0j,\\n+ ],\\n+ [\\n+ 0.0 + 0.0j,\\n+ 0.0 + 0.0j,\\n+ 0.0 + 0.0j,\\n+ -1.0 + 0.0j,\\n+ 0.0 + 0.0j,\\n+ 0.0 + 0.0j,\\n+ 0.0 + 0.0j,\\n+ 0.0 + 0.0j,\\n+ ],\\n+ ]\\n+ )\\n+\\n+ gate = UnitaryGate(mat)\\n+ qc = QuantumCircuit(3)\\n+ qc.append(gate, range(3))\\n+ try:\\n+ qc.to_gate().control(1)\\n+ except UnboundLocalError as uerr:\\n+ self.fail(str(uerr))\\n+\\n \\n class TestTwoQubitDecomposeUpToDiagonal(QiskitTestCase):\\n \"\"\"test TwoQubitDecomposeUpToDiagonal class\"\"\"\\n", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}167{"question_id": "MSB_Qiskit_qiskit_pr10904", "question_type": "multi_swe_bench", "description": "Fix Clifford.from_operator to fail with non-Clifford diagonal operators (Qiskit/qiskit#10904)", "content": {"org": "Qiskit", "repo": "qiskit", "pr_number": 10904, "issue_title": "Fix Clifford.from_operator to fail with non-Clifford diagonal operators", "issue_body": "<!--\\r\\n\u26a0\ufe0f If you do not respect this template, your pull request will be closed.\\r\\n\u26a0\ufe0f Your pull request title should be short detailed and understandable for all.\\r\\n\u26a0\ufe0f Also, please add a release note file using reno if the change needs to be\\r\\n documented in the release notes.\\r\\n\u26a0\ufe0f If your pull request fixes an open issue, please link to the issue.\\r\\n\\r\\n- [ ] I have added the tests to cover my changes.\\r\\n- [ ] I have updated the documentation accordingly.\\r\\n- [ ] I have read the CONTRIBUTING document.\\r\\n-->\\r\\n\\r\\n### Summary\\r\\nFix a bug where `Clifford.from_operator` (`from_matrix`) does not fail with non-Clifford diagonal operators (matrices) and return incorrect Clifford objects. This commit corrects it to raise an error as expected.\\r\\nFix #10903\\r\\n\\r\\n### Details and comments\\r\\nEach non-zero element of the Pauli matrices computed during the conversion must be one of {1, -1, 1j, -1j} for valid input but that was not fully checked and failed to raise an error against invalid non-Clifford diagonal matrices.\\r\\n\\r\\n", "base_commit": "6e80e89e18da2691a86d4e2050db2e5479043b16", "resolved_issues": [{"number": 10903, "title": "Clifford.from_operator does not fail with non-Clifford diagonal operator", "body": "### Environment\\r\\n\\r\\n- **Qiskit Terra version**: 0.25.1\\r\\n- **Python version**: 3.10\\r\\n- **Operating system**: Mac OS\\r\\n\\r\\n\\r\\n### What is happening?\\r\\n\\r\\n`Clifford.from_operator` (`from_matrix`) does not fail with non-Clifford diagonal operator (matrix) and returns an incorrect Clifford object.\\r\\n\\r\\n### How can we reproduce the issue?\\r\\n\\r\\nRun `Clifford.from_operator(Operator(RZZGate(0.2)))`\\r\\n\\r\\n### What should happen?\\r\\n\\r\\nThe code should raise an error.\\r\\n\\r\\n### Any suggestions?\\r\\n\\r\\n_No response_"}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/qiskit_m_qiskit:pr-10904", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/qiskit/quantum_info/operators/symplectic/clifford.py b/qiskit/quantum_info/operators/symplectic/clifford.py\\nindex b17c29df4665..30166530337c 100644\\n--- a/qiskit/quantum_info/operators/symplectic/clifford.py\\n+++ b/qiskit/quantum_info/operators/symplectic/clifford.py\\n@@ -1004,9 +1004,10 @@ def _pauli_matrix_to_row(mat, num_qubits):\\n \"\"\"Generate a binary vector (a row of tableau representation) from a Pauli matrix.\\n Return None if the non-Pauli matrix is supplied.\"\"\"\\n # pylint: disable=too-many-return-statements\\n+ decimals = 6\\n \\n- def find_one_index(x, decimals=6):\\n- indices = np.where(np.round(np.abs(x), decimals) == 1)\\n+ def find_one_index(x):\\n+ indices = np.where(np.round(np.abs(x), decimals=decimals) == 1)\\n return indices[0][0] if len(indices[0]) == 1 else None\\n \\n def bitvector(n, num_bits):\\n@@ -1018,7 +1019,7 @@ def bitvector(n, num_bits):\\n return None\\n xbits = bitvector(xint, num_qubits)\\n \\n- # extract non-zero elements from matrix (rounded to 1, -1, 1j or -1j)\\n+ # extract non-zero elements from matrix (each must be 1, -1, 1j or -1j for Pauli matrix)\\n entries = np.empty(len(mat), dtype=complex)\\n for i, row in enumerate(mat):\\n index = find_one_index(row)\\n@@ -1027,7 +1028,9 @@ def bitvector(n, num_bits):\\n expected = xint ^ i\\n if index != expected:\\n return None\\n- entries[i] = np.round(mat[i, index])\\n+ entries[i] = np.round(mat[i, index], decimals=decimals)\\n+ if entries[i] not in {1, -1, 1j, -1j}:\\n+ return None\\n \\n # compute z-bits\\n zbits = np.empty(num_qubits, dtype=bool)\\ndiff --git a/releasenotes/notes/fix-clifford-from-diagonal-7708654373bd5b8b.yaml b/releasenotes/notes/fix-clifford-from-diagonal-7708654373bd5b8b.yaml\\nnew file mode 100644\\nindex 000000000000..8340ee33a07d\\n--- /dev/null\\n+++ b/releasenotes/notes/fix-clifford-from-diagonal-7708654373bd5b8b.yaml\\n@@ -0,0 +1,7 @@\\n+---\\n+fixes:\\n+ - |\\n+ Fixed a bug where :meth:`~.Clifford.from_matrix` and :meth:`~.Clifford.from_operator`\\n+ do not fail with non-Clifford diagonal operators (matrices) and return incorrect\\n+ Clifford objects. This has been corrected so that they raise an error in the cases.\\n+ Fixed `#10903 <https://github.com/Qiskit/qiskit-terra/issues/10903>`__\\n"}, "test": {"test_patch": "diff --git a/test/python/quantum_info/operators/symplectic/test_clifford.py b/test/python/quantum_info/operators/symplectic/test_clifford.py\\nindex 092d86fea0e6..4dbde8a36e34 100644\\n--- a/test/python/quantum_info/operators/symplectic/test_clifford.py\\n+++ b/test/python/quantum_info/operators/symplectic/test_clifford.py\\n@@ -1068,6 +1068,12 @@ def test_from_matrix_round_trip(self, num_qubits):\\n actual = Clifford.from_matrix(expected.to_matrix())\\n self.assertEqual(expected, actual)\\n \\n+ def test_from_non_clifford_diagonal_operator(self):\\n+ \"\"\"Test if failing with non-clifford diagonal operator.\\n+ See https://github.com/Qiskit/qiskit/issues/10903\"\"\"\\n+ with self.assertRaises(QiskitError):\\n+ Clifford.from_operator(Operator(RZZGate(0.2)))\\n+\\n @combine(num_qubits=[1, 2, 3, 4])\\n def test_from_operator_round_trip(self, num_qubits):\\n \"\"\"Test round trip conversion to and from operator\"\"\"\\n", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}168{"question_id": "MSB_Qiskit_qiskit_pr11655", "question_type": "multi_swe_bench", "description": "Fix split barriers leaking during disjoint layout processing (Qiskit/qiskit#11655)", "content": {"org": "Qiskit", "repo": "qiskit", "pr_number": 11655, "issue_title": "Fix split barriers leaking during disjoint layout processing", "issue_body": "<!--\\r\\n\u26a0\ufe0f If you do not respect this template, your pull request will be closed.\\r\\n\u26a0\ufe0f Your pull request title should be short detailed and understandable for all.\\r\\n\u26a0\ufe0f Also, please add a release note file using reno if the change needs to be\\r\\n documented in the release notes.\\r\\n\u26a0\ufe0f If your pull request fixes an open issue, please link to the issue.\\r\\n\\r\\n- [ ] I have added the tests to cover my changes.\\r\\n- [ ] I have updated the documentation accordingly.\\r\\n- [ ] I have read the CONTRIBUTING document.\\r\\n-->\\r\\n\\r\\n### Summary\\r\\n\\r\\nThis commit fixes an issue in the disjoint layout processing caused by a shared reference from the input dag to a layout pass to the internal transformations the layout processing performs. As part of the disjoint layout processing the input dag needs to be split into smaller dags for each connected component in the circuit. To enable this any barriers present in the circuit need to be split up prior to analyzing the connected components in the dag. A multiqubit barrier doesn't represent a real connectivity requirement so they need to be split prior to analysis to ensure they don't factor into the connected component computation. To faciliate not losing the semantic meaning of the barrier for the layout analysis of each connected component, the barrier split is done by first taking an n-qubit barrier and converting it into n parallel 1q barriers with a uuid label applied to it. Then after we split the circuit into the separate connected components the uuid is used to identify any components of the same barrier and combine them together.\\r\\n\\r\\nThere were two issues with this approach the first is that the splitting of the barriers was done on the input dag without copying first. This causes the input dag to be modified and because in most cases it's a shared instance which would leak out the barrier splitting if the input dag was returned verbatim from the pass, which in most cases it would be. This issue is fixed by ensuring that we re-combine any split barriers after we've split the dag into it's connected components. The second issue is the uuid label assignment would overwrite any existing labels on barriers. While setting labels on barriers is uncommon for users to do (but still completely valid) this is causing a bigger issues since #10323 because the transpiler is assigning labels to barriers it creates internally so they can be removed before the circuit is returned. This is also fixed in this commit by appending a uuid to the existing label instead of overwriting it, so we're able to restore the original label when we recombine barriers.\\r\\n\\r\\n### Details and comments\\r\\n\\r\\nFixes #11649", "base_commit": "052d889a7e47316515afa7576355a4ced391be4e", "resolved_issues": [{"number": 11649, "title": "Disjoint handling in transpiler fails to rejoin barriers", "body": "### Environment\\n\\n- **Qiskit Terra version**: `main` @ ce02f06\\r\\n- **Python version**: 3.10\\r\\n- **Operating system**: macOS\\r\\n\\n\\n### What is happening?\\n\\nThe preset passmangers for `transpile` are failing to correctly reconstruct barriers temporarily inserted during the compiler routing, which is leaking out invalid `UUID` objects inside the `label` field of those barriers.\\n\\n### How can we reproduce the issue?\\n\\nGiven a set up of:\\r\\n\\r\\n```python\\r\\nfrom qiskit import transpile, QuantumCircuit\\r\\nfrom qiskit.transpiler import CouplingMap\\r\\n\\r\\ncm = CouplingMap([\\r\\n (0, 1),\\r\\n (1, 2),\\r\\n #\\r\\n (3, 4),\\r\\n])\\r\\nqc = QuantumCircuit(cm.size(), cm.size())\\r\\nqc.cx(0, 1)\\r\\nqc.cx(1, 2)\\r\\nqc.cx(2, 0)\\r\\n#\\r\\nqc.cx(3, 4)\\r\\nqc.measure(qc.qubits, qc.clbits)\\r\\n\\r\\nout = transpile(qc, coupling_map=cm, seed_transpiler=0)\\r\\n```\\r\\n\\r\\n`out` contains `Barrier` instructions whose `label` attributes are not strings (they're `UUID` objects) and shouldn't exist at all, because the input circuit doesn't have any:\\r\\n\\r\\n```python\\r\\nfor i, ins in enumerate(out.data):\\r\\n if ins.operation.name == \"barrier\":\\r\\n print(i, repr(ins.operation.label))\\r\\n # Coerce to string so I can draw the circuit after.\\r\\n ins.operation.label = str(ins.operation.label)\\r\\n```\\r\\n```text\\r\\n8 UUID('31558989-c21a-4e5c-b014-01639295df7b')\\r\\n10 UUID('31558989-c21a-4e5c-b014-01639295df7b')\\r\\n12 UUID('31558989-c21a-4e5c-b014-01639295df7b')\\r\\n14 UUID('31558989-c21a-4e5c-b014-01639295df7b')\\r\\n15 UUID('31558989-c21a-4e5c-b014-01639295df7b')\\r\\n```\\r\\n\\r\\nI can't draw the circuit because the visualiser will explode, as will QPY (how this issue was detected). If I coerce those particular labels just to be string instances, the circuit looks like this:\\r\\n```text\\r\\n \u250c\u2500\u2500\u2500\u2510 \u250c\u2500\u2500\u2500\u2510 31558989-c21a-4e5c-b014-01639295df7b \u250c\u2500\u2510\\r\\nq_2 -> 0 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500X\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524 H \u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u25a0\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524 H \u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2591\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524M\u251c\u2500\u2500\u2500\\r\\n \u2502 \u2514\u2500\u2500\u2500\u2518 \u2502 \u2514\u2500\u2500\u2500\u2518 \u2591 \u2514\u2565\u2518\\r\\n \u2502 \u250c\u2500\u2500\u2500\u2510 \u250c\u2500\u2534\u2500\u2510 \u250c\u2500\u2500\u2500\u2510 31558989-c21a-4e5c-b014-01639295df7b \u2551 \u250c\u2500\u2510\\r\\nq_0 -> 1 \u2500\u2500\u25a0\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500X\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524 H \u251c\u2500\u2500\u25a0\u2500\u2500\u2524 X \u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524 H \u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2591\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256b\u2500\u2524M\u251c\\r\\n \u2502 \u2514\u2500\u2500\u2500\u2518 \u2502 \u2514\u2500\u2500\u2500\u2518 \u2514\u2500\u2500\u2500\u2518 \u2591 \u2551 \u2514\u2565\u2518\\r\\n \u250c\u2500\u2534\u2500\u2510 \u250c\u2500\u2500\u2500\u2510 \u250c\u2500\u2534\u2500\u2510\u250c\u2500\u2500\u2500\u2510 31558989-c21a-4e5c-b014-01639295df7b \u250c\u2500\u2510 \u2551 \u2551\\r\\nq_1 -> 2 \u2524 X \u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524 H \u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524 X \u251c\u2524 H \u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2591\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524M\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256b\u2500\u2500\u256b\u2500\\r\\n \u2514\u2500\u2500\u2500\u2518 \u2514\u2500\u2500\u2500\u2518 \u2514\u2500\u2500\u2500\u2518\u2514\u2500\u2500\u2500\u2518 \u2591 \u2514\u2565\u2518 \u2551 \u2551\\r\\n 31558989-c21a-4e5c-b014-01639295df7b \u250c\u2500\u2510 \u2551 \u2551 \u2551\\r\\nq_3 -> 3 \u2500\u2500\u25a0\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2591\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524M\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256b\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256b\u2500\u2500\u256b\u2500\\r\\n \u2502 \u2591 \u2514\u2565\u2518 \u2551 \u2551 \u2551\\r\\n \u250c\u2500\u2534\u2500\u2510 31558989-c21a-4e5c-b014-01639295df7b \u2551 \u250c\u2500\u2510 \u2551 \u2551 \u2551\\r\\nq_4 -> 4 \u2524 X \u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2591\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256b\u2500\u2500\u2500\u2524M\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256b\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256b\u2500\u2500\u256b\u2500\\r\\n \u2514\u2500\u2500\u2500\u2518 \u2591 \u2551 \u2514\u2565\u2518 \u2551 \u2551 \u2551\\r\\n c: 5/\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2569\u2550\u2550\u2550\u2550\u2569\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2569\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2569\u2550\u2550\u2569\u2550\\r\\n 3 4 1 0 2\\r\\n```\\r\\nso it's clear the temporary barrier we insert before measures isn't being recombined and then deleted.\\r\\n\\n\\n### What should happen?\\n\\n* The temporary barrier should have been recombined after the disjoint handling\\r\\n* The temporary barrier should have been removed before the circuit exited\\r\\n* We probably shouldn't use a literal `UUID` in the `Barrier.label` field since that's supposed to be constrained to be a string (everything except `Barrier` seems to enforce that, too).\\n\\n### Any suggestions?\\n\\n_No response_"}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/qiskit_m_qiskit:pr-11655", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/qiskit/transpiler/passes/layout/disjoint_utils.py b/qiskit/transpiler/passes/layout/disjoint_utils.py\\nindex ffbb5076c1ef..42f665c473a1 100644\\n--- a/qiskit/transpiler/passes/layout/disjoint_utils.py\\n+++ b/qiskit/transpiler/passes/layout/disjoint_utils.py\\n@@ -107,7 +107,10 @@ def split_barriers(dag: DAGCircuit):\\n num_qubits = len(node.qargs)\\n if num_qubits == 1:\\n continue\\n- barrier_uuid = uuid.uuid4()\\n+ if node.op.label:\\n+ barrier_uuid = f\"{node.op.label}_uuid={uuid.uuid4()}\"\\n+ else:\\n+ barrier_uuid = f\"_none_uuid={uuid.uuid4()}\"\\n split_dag = DAGCircuit()\\n split_dag.add_qubits([Qubit() for _ in range(num_qubits)])\\n for i in range(num_qubits):\\n@@ -124,10 +127,13 @@ def combine_barriers(dag: DAGCircuit, retain_uuid: bool = True):\\n qubit_indices = {bit: index for index, bit in enumerate(dag.qubits)}\\n uuid_map: dict[uuid.UUID, DAGOpNode] = {}\\n for node in dag.op_nodes(Barrier):\\n- if isinstance(node.op.label, uuid.UUID):\\n- barrier_uuid = node.op.label\\n+ if node.op.label:\\n+ if \"_uuid=\" in node.op.label:\\n+ barrier_uuid = node.op.label\\n+ else:\\n+ continue\\n if barrier_uuid in uuid_map:\\n- other_node = uuid_map[node.op.label]\\n+ other_node = uuid_map[barrier_uuid]\\n num_qubits = len(other_node.qargs) + len(node.qargs)\\n new_op = Barrier(num_qubits, label=barrier_uuid)\\n new_node = dag.replace_block_with_op([node, other_node], new_op, qubit_indices)\\n@@ -136,8 +142,11 @@ def combine_barriers(dag: DAGCircuit, retain_uuid: bool = True):\\n uuid_map[barrier_uuid] = node\\n if not retain_uuid:\\n for node in dag.op_nodes(Barrier):\\n- if isinstance(node.op.label, uuid.UUID):\\n+ if isinstance(node.op.label, str) and node.op.label.startswith(\"_none_uuid=\"):\\n node.op.label = None\\n+ elif isinstance(node.op.label, str) and \"_uuid=\" in node.op.label:\\n+ original_label = \"_uuid=\".join(node.op.label.split(\"_uuid=\")[:-1])\\n+ node.op.label = original_label\\n \\n \\n def require_layout_isolated_to_component(\\n@@ -202,4 +211,7 @@ def separate_dag(dag: DAGCircuit) -> List[DAGCircuit]:\\n new_dag.remove_clbits(*idle_clbits)\\n combine_barriers(new_dag)\\n decomposed_dags.append(new_dag)\\n+ # Reverse split barriers on input dag to avoid leaking out internal transformations as\\n+ # part of splitting\\n+ combine_barriers(dag, retain_uuid=False)\\n return decomposed_dags\\ndiff --git a/releasenotes/notes/fix-leaking-split-barrier-7c143d6b13b96ced.yaml b/releasenotes/notes/fix-leaking-split-barrier-7c143d6b13b96ced.yaml\\nnew file mode 100644\\nindex 000000000000..5cd8f19dc150\\n--- /dev/null\\n+++ b/releasenotes/notes/fix-leaking-split-barrier-7c143d6b13b96ced.yaml\\n@@ -0,0 +1,12 @@\\n+---\\n+fixes:\\n+ - |\\n+ Fixed an issue when using :func:`.transpile` or running a preset pass\\n+ manager (such as generated by :func:`.generate_preset_pass_manager`) when\\n+ targetting a backend that has disjoint connectivity adding extra barriers\\n+ to the output :class:`.QuantumCircuit`. In some cases several\\n+ single qubit :class:`.Barrier` directives would be included in the output\\n+ circuit right before any final measurements in the circuit. This was\\n+ internal state generated by the internal processing for disjoint\\n+ connectivity that was incorrectly being added into the output circuit.\\n+ Fixed `#11649 <https://github.com/Qiskit/qiskit/issues/11649>`__\\n"}, "test": {"test_patch": "diff --git a/test/python/compiler/test_transpiler.py b/test/python/compiler/test_transpiler.py\\nindex 6390a6e1c85b..ac1add5e0201 100644\\n--- a/test/python/compiler/test_transpiler.py\\n+++ b/test/python/compiler/test_transpiler.py\\n@@ -3260,6 +3260,19 @@ def test_transpile_target_with_qubits_without_ops_circuit_too_large_disconnected\\n with self.assertRaises(TranspilerError):\\n transpile(qc, target=target, optimization_level=opt_level)\\n \\n+ @data(0, 1, 2, 3)\\n+ def test_barrier_no_leak_disjoint_connectivity(self, opt_level):\\n+ \"\"\"Test that we don't leak an internal labelled barrier from disjoint layout processing.\"\"\"\\n+ cmap = CouplingMap([(0, 1), (1, 2), (3, 4)])\\n+ qc = QuantumCircuit(cmap.size(), cmap.size())\\n+ qc.cx(0, 1)\\n+ qc.cx(1, 2)\\n+ qc.cx(2, 0)\\n+ qc.cx(3, 4)\\n+ qc.measure(qc.qubits, qc.clbits)\\n+ out = transpile(qc, coupling_map=cmap, optimization_level=opt_level)\\n+ self.assertNotIn(\"barrier\", out.count_ops())\\n+\\n @data(0, 1, 2, 3)\\n def test_transpile_does_not_affect_backend_coupling(self, opt_level):\\n \"\"\"Test that transpiliation of a circuit does not mutate the `CouplingMap` stored by a V2\\n", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}169{"question_id": "MSB_Qiskit_qiskit_pr11995", "question_type": "multi_swe_bench", "description": "Fix use of custom `dt` in `transpile` when target is provided (Qiskit/qiskit#11995)", "content": {"org": "Qiskit", "repo": "qiskit", "pr_number": 11995, "issue_title": "Fix use of custom `dt` in `transpile` when target is provided", "issue_body": "<!--\\r\\n\u26a0\ufe0f If you do not respect this template, your pull request will be closed.\\r\\n\u26a0\ufe0f Your pull request title should be short detailed and understandable for all.\\r\\n\u26a0\ufe0f Also, please add a release note file using reno if the change needs to be\\r\\n documented in the release notes.\\r\\n\u26a0\ufe0f If your pull request fixes an open issue, please link to the issue.\\r\\n\\r\\n- [ ] I have added the tests to cover my changes.\\r\\n- [ ] I have updated the documentation accordingly.\\r\\n- [ ] I have read the CONTRIBUTING document.\\r\\n-->\\r\\n\\r\\n### Summary\\r\\nFixes #11994, I am not too sure if I should label it as a feature or a bugfix, I think it's both. This PR is currently blocking #11996.\\r\\n\\r\\n\\r\\n### Details and comments\\r\\n\\r\\n", "base_commit": "9f228fa4fe5e8f4de4b53cf77400e25242ba43c3", "resolved_issues": [{"number": 11994, "title": "Scheduling stage doesn't use custom dt when target provided", "body": "### Environment\\r\\n\\r\\n- **Qiskit version**: 1.1.0\\r\\n- **Python version**: 3.10.0\\r\\n- **Operating system**: MacOS\\r\\n\\r\\n\\r\\n### What is happening?\\r\\n\\r\\nThe expected behavior of `transpile` when a custom `dt` is specified (i.e. sth like `transpile(qc, backend=b, scheduling_method=\"asap\", dt=dt / 2)` is that the scheduling stage will use this custom `dt` instead of the backend's one, but this behavior is not respected if the input backend contains a `target`. I believe that the root of the issue is that `dt` is encoded in the `inst_durations` object that is passed around, but the [`TimeUnitConversion` transformation pass is designed to overwrite `inst_durations` if a target is specified](https://github.com/Qiskit/qiskit/blob/main/qiskit/transpiler/passes/scheduling/time_unit_conversion.py#L43-L46), so the custom dt never gets to be used:\\r\\n```\\r\\n# TimeUnitConversion init\\r\\nself.inst_durations = inst_durations or InstructionDurations()\\r\\nif target is not None:\\r\\n self.inst_durations = target.durations()\\r\\n```\\r\\n\\r\\nIn other words, the priorities are not consistent between the preset passmanager/transpile and the `TimeUnitConversion` pass (one prioritizes the custom durations, the other prioritizes the target).\\r\\n\\r\\n### How can we reproduce the issue?\\r\\n\\r\\nThis snippet works for the V1 backend and doesn't for the V2 backend:\\r\\n\\r\\n```\\r\\nfrom qiskit import QuantumCircuit\\r\\nfrom qiskit import transpile\\r\\nfrom qiskit_ibm_runtime.fake_provider import FakeHanoi, FakeHanoiV2\\r\\n\\r\\nbackend_v1 = FakeHanoi()\\r\\nbackend_v2 = FakeHanoiV2()\\r\\ndt = 2.2222222222222221e-10\\r\\n\\r\\n# from test_change_dt_in_transpile\\r\\nqc = QuantumCircuit(1, 1)\\r\\nqc.x(0)\\r\\nqc.measure(0, 0)\\r\\n\\r\\nfor b in [backend_v1, backend_v2]:\\r\\n # default case\\r\\n scheduled = transpile(qc, backend=b, scheduling_method=\"asap\")\\r\\n org_duration = scheduled.duration\\r\\n\\r\\n # halve dt in sec = double duration in dt\\r\\n scheduled = transpile(\\r\\n qc, backend=b, scheduling_method=\"asap\", dt=dt / 2\\r\\n )\\r\\n print(b, scheduled.duration == org_duration * 2)\\r\\n```\\r\\n\\r\\n### What should happen?\\r\\n\\r\\nThe custom dt shouldn't be bypassed.\\r\\n\\r\\n### Any suggestions?\\r\\n\\r\\nI think that this issue could be fixed if we establish a consistent priority of the custom `inst_durations` over the target's. A PR with a fix proposal will follow."}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/qiskit_m_qiskit:pr-11995", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/qiskit/transpiler/passes/scheduling/time_unit_conversion.py b/qiskit/transpiler/passes/scheduling/time_unit_conversion.py\\nindex d53c3fc4ef6a..e0931133c52e 100644\\n--- a/qiskit/transpiler/passes/scheduling/time_unit_conversion.py\\n+++ b/qiskit/transpiler/passes/scheduling/time_unit_conversion.py\\n@@ -42,15 +42,16 @@ def __init__(self, inst_durations: InstructionDurations = None, target: Target =\\n Args:\\n inst_durations (InstructionDurations): A dictionary of durations of instructions.\\n target: The :class:`~.Target` representing the target backend, if both\\n- ``inst_durations`` and ``target`` are specified then this argument will take\\n- precedence and ``inst_durations`` will be ignored.\\n-\\n-\\n+ ``inst_durations`` and ``target`` are specified, the ``inst_durations`` argument\\n+ will take precedence and ``target`` will be ignored.\\n \"\"\"\\n super().__init__()\\n- self.inst_durations = inst_durations or InstructionDurations()\\n- if target is not None:\\n- self.inst_durations = target.durations()\\n+ if inst_durations is not None:\\n+ self.inst_durations = inst_durations\\n+ else:\\n+ self.inst_durations = (\\n+ target.durations() if target is not None else InstructionDurations()\\n+ )\\n \\n def run(self, dag: DAGCircuit):\\n \"\"\"Run the TimeUnitAnalysis pass on `dag`.\\ndiff --git a/releasenotes/notes/transpile-custom-dt-precedence-3c7354e40bbd1107.yaml b/releasenotes/notes/transpile-custom-dt-precedence-3c7354e40bbd1107.yaml\\nnew file mode 100644\\nindex 000000000000..c1436948f953\\n--- /dev/null\\n+++ b/releasenotes/notes/transpile-custom-dt-precedence-3c7354e40bbd1107.yaml\\n@@ -0,0 +1,7 @@\\n+---\\n+features:\\n+ - |\\n+ The :class:`.TimeUnitConversion` transformation pass now gives precedence to the ``inst_durations``\\n+ argument over the ``target`` argument. This fixes an unexpected behavior in :meth:`.transpile` where\\n+ custom ``dt`` inputs would be ignored if a ``target`` was provided too (directly or as part of a \\n+ :class:`.BackendV2` instance).\\n\\\\ No newline at end of file\\n"}, "test": {"test_patch": "diff --git a/test/python/circuit/test_scheduled_circuit.py b/test/python/circuit/test_scheduled_circuit.py\\nindex ec4bc72ffd06..9a3ebd5215da 100644\\n--- a/test/python/circuit/test_scheduled_circuit.py\\n+++ b/test/python/circuit/test_scheduled_circuit.py\\n@@ -20,6 +20,7 @@\\n from qiskit.circuit import Parameter\\n from qiskit.circuit.duration import convert_durations_to_dt\\n from qiskit.providers.fake_provider import Fake27QPulseV1, GenericBackendV2\\n+from qiskit.providers.backend_compat import BackendV2Converter\\n from qiskit.providers.basic_provider import BasicSimulator\\n from qiskit.scheduler import ScheduleConfig\\n from qiskit.transpiler.exceptions import TranspilerError\\n@@ -44,6 +45,9 @@ def setUp(self):\\n # run when alignment values different to 1 are found.\\n self.backend_with_dt.configuration().timing_constraints = {}\\n self.backend_without_dt.configuration().timing_constraints = {}\\n+ # Generate V2 backends\\n+ self.backend_with_dt_v2 = BackendV2Converter(self.backend_with_dt)\\n+ self.backend_without_dt_v2 = BackendV2Converter(self.backend_without_dt)\\n self.dt = 2.2222222222222221e-10\\n self.simulator_backend = BasicSimulator()\\n \\n@@ -79,24 +83,27 @@ def test_schedule_circuit_when_transpile_option_tells_dt(self):\\n qc.delay(100, 0, unit=\"ns\") # 450[dt]\\n qc.h(0)\\n qc.h(1)\\n- sc = transpile(\\n- qc,\\n- self.backend_without_dt,\\n- scheduling_method=\"alap\",\\n- dt=self.dt,\\n- layout_method=\"trivial\",\\n- )\\n- self.assertEqual(sc.duration, 450546)\\n- self.assertEqual(sc.unit, \"dt\")\\n- self.assertEqual(sc.data[0].operation.name, \"delay\")\\n- self.assertEqual(sc.data[0].operation.duration, 450450)\\n- self.assertEqual(sc.data[0].operation.unit, \"dt\")\\n- self.assertEqual(sc.data[1].operation.name, \"rz\")\\n- self.assertEqual(sc.data[1].operation.duration, 0)\\n- self.assertEqual(sc.data[1].operation.unit, \"dt\")\\n- self.assertEqual(sc.data[4].operation.name, \"delay\")\\n- self.assertEqual(sc.data[4].operation.duration, 450450)\\n- self.assertEqual(sc.data[4].operation.unit, \"dt\")\\n+\\n+ for backend in [self.backend_without_dt, self.backend_without_dt_v2]:\\n+ with self.subTest(backend=backend):\\n+ sc = transpile(\\n+ qc,\\n+ backend,\\n+ scheduling_method=\"alap\",\\n+ dt=self.dt,\\n+ layout_method=\"trivial\",\\n+ )\\n+ self.assertEqual(sc.duration, 450546)\\n+ self.assertEqual(sc.unit, \"dt\")\\n+ self.assertEqual(sc.data[0].operation.name, \"delay\")\\n+ self.assertEqual(sc.data[0].operation.duration, 450450)\\n+ self.assertEqual(sc.data[0].operation.unit, \"dt\")\\n+ self.assertEqual(sc.data[1].operation.name, \"rz\")\\n+ self.assertEqual(sc.data[1].operation.duration, 0)\\n+ self.assertEqual(sc.data[1].operation.unit, \"dt\")\\n+ self.assertEqual(sc.data[4].operation.name, \"delay\")\\n+ self.assertEqual(sc.data[4].operation.duration, 450450)\\n+ self.assertEqual(sc.data[4].operation.unit, \"dt\")\\n \\n def test_schedule_circuit_in_sec_when_no_one_tells_dt(self):\\n \"\"\"dt is unknown and all delays and gate times are in SI\"\"\"\\n@@ -245,23 +252,26 @@ def test_unit_seconds_when_using_backend_durations(self):\\n qc.h(0)\\n qc.delay(500 * self.dt, 1, \"s\")\\n qc.cx(0, 1)\\n- # usual case\\n- scheduled = transpile(\\n- qc, backend=self.backend_with_dt, scheduling_method=\"alap\", layout_method=\"trivial\"\\n- )\\n- self.assertEqual(scheduled.duration, 1876)\\n \\n- # update durations\\n- durations = InstructionDurations.from_backend(self.backend_with_dt)\\n- durations.update([(\"cx\", [0, 1], 1000 * self.dt, \"s\")])\\n- scheduled = transpile(\\n- qc,\\n- backend=self.backend_with_dt,\\n- scheduling_method=\"alap\",\\n- instruction_durations=durations,\\n- layout_method=\"trivial\",\\n- )\\n- self.assertEqual(scheduled.duration, 1500)\\n+ for backend in [self.backend_with_dt, self.backend_with_dt_v2]:\\n+ with self.subTest(backend=backend):\\n+ # usual case\\n+ scheduled = transpile(\\n+ qc, backend=backend, scheduling_method=\"alap\", layout_method=\"trivial\"\\n+ )\\n+ self.assertEqual(scheduled.duration, 1876)\\n+\\n+ # update durations\\n+ durations = InstructionDurations.from_backend(self.backend_with_dt)\\n+ durations.update([(\"cx\", [0, 1], 1000 * self.dt, \"s\")])\\n+ scheduled = transpile(\\n+ qc,\\n+ backend=backend,\\n+ scheduling_method=\"alap\",\\n+ instruction_durations=durations,\\n+ layout_method=\"trivial\",\\n+ )\\n+ self.assertEqual(scheduled.duration, 1500)\\n \\n def test_per_qubit_durations(self):\\n \"\"\"See: https://github.com/Qiskit/qiskit-terra/issues/5109\"\"\"\\n@@ -348,15 +358,15 @@ def test_change_dt_in_transpile(self):\\n qc = QuantumCircuit(1, 1)\\n qc.x(0)\\n qc.measure(0, 0)\\n- # default case\\n- scheduled = transpile(qc, backend=self.backend_with_dt, scheduling_method=\"asap\")\\n- org_duration = scheduled.duration\\n \\n- # halve dt in sec = double duration in dt\\n- scheduled = transpile(\\n- qc, backend=self.backend_with_dt, scheduling_method=\"asap\", dt=self.dt / 2\\n- )\\n- self.assertEqual(scheduled.duration, org_duration * 2)\\n+ for backend in [self.backend_with_dt, self.backend_with_dt_v2]:\\n+ with self.subTest(backend=backend):\\n+ # default case\\n+ scheduled = transpile(qc, backend=backend, scheduling_method=\"asap\")\\n+ org_duration = scheduled.duration\\n+ # halve dt in sec = double duration in dt\\n+ scheduled = transpile(qc, backend=backend, scheduling_method=\"asap\", dt=self.dt / 2)\\n+ self.assertEqual(scheduled.duration, org_duration * 2)\\n \\n @data(\"asap\", \"alap\")\\n def test_duration_on_same_instruction_instance(self, scheduling_method):\\n", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}170{"question_id": "MSB_Qiskit_qiskit_pr12095", "question_type": "multi_swe_bench", "description": "Support ECR gates in `Pauli.evolve(QuantumCircuit)` (Qiskit/qiskit#12095)", "content": {"org": "Qiskit", "repo": "qiskit", "pr_number": 12095, "issue_title": "Support ECR gates in `Pauli.evolve(QuantumCircuit)`", "issue_body": "<!--\\r\\n\u26a0\ufe0f If you do not respect this template, your pull request will be closed.\\r\\n\u26a0\ufe0f Your pull request title should be short detailed and understandable for all.\\r\\n\u26a0\ufe0f Also, please add a release note file using reno if the change needs to be\\r\\n documented in the release notes.\\r\\n\u26a0\ufe0f If your pull request fixes an open issue, please link to the issue.\\r\\n\\r\\n- [X] I have added the tests to cover my changes.\\r\\n- [ ] I have updated the documentation accordingly.\\r\\n- [X] I have read the CONTRIBUTING document.\\r\\n-->\\r\\n\\r\\n### Summary\\r\\nShould fix #12086 and also #12093.\\r\\n\\r\\n\\r\\n### Details and comments\\r\\n\\r\\n\\r\\n", "base_commit": "4ff0fa2f624d5b834c4afaf871c9b5b3b7e22367", "resolved_issues": [{"number": 12086, "title": "`Pauli.evolve()` should recognize ECR gates as Clifford gates", "body": "### Environment\\n\\n- **Qiskit version**: 1.0.2\\r\\n- **Python version**: 3.11\\r\\n- **Operating system**: macos\\r\\n\\n\\n### What is happening?\\n\\n```\\r\\nqc = QuantumCircuit(2)\\r\\nqc.ecr(0,1)\\r\\nqi.Pauli('XX').evolve(qc)\\r\\n```\\r\\n\\r\\nThe above call to evolve() raises an error even though qc contains only Clifford gates:\\r\\n\\r\\n```\\r\\nQiskitError: 'Cannot apply Instruction: u'\\r\\n```\\n\\n### How can we reproduce the issue?\\n\\n```\\r\\nqc = QuantumCircuit(2)\\r\\nqc.ecr(0,1)\\r\\nqi.Pauli('XX').evolve(qc)\\r\\n```\\n\\n### What should happen?\\n\\nECR gates should be recognized as Clifford gates, and the Pauli should evolve successfully.\\r\\n\\r\\nRelated: #12085 \\n\\n### Any suggestions?\\n\\n_No response_"}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/qiskit_m_qiskit:pr-12095", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/qiskit/quantum_info/operators/symplectic/base_pauli.py b/qiskit/quantum_info/operators/symplectic/base_pauli.py\\nindex 28bb647d0364..e43eca4aff21 100644\\n--- a/qiskit/quantum_info/operators/symplectic/base_pauli.py\\n+++ b/qiskit/quantum_info/operators/symplectic/base_pauli.py\\n@@ -541,75 +541,50 @@ def _append_circuit(self, circuit, qargs=None):\\n if qargs is None:\\n qargs = list(range(self.num_qubits))\\n \\n- if isinstance(circuit, QuantumCircuit):\\n- gate = circuit.to_instruction()\\n- else:\\n+ if not isinstance(circuit, QuantumCircuit):\\n gate = circuit\\n \\n- # Basis Clifford Gates\\n- basis_1q = {\\n- \"i\": _evolve_i,\\n- \"id\": _evolve_i,\\n- \"iden\": _evolve_i,\\n- \"x\": _evolve_x,\\n- \"y\": _evolve_y,\\n- \"z\": _evolve_z,\\n- \"h\": _evolve_h,\\n- \"s\": _evolve_s,\\n- \"sdg\": _evolve_sdg,\\n- \"sinv\": _evolve_sdg,\\n- }\\n- basis_2q = {\"cx\": _evolve_cx, \"cz\": _evolve_cz, \"cy\": _evolve_cy, \"swap\": _evolve_swap}\\n-\\n- # Non-Clifford gates\\n- non_clifford = [\"t\", \"tdg\", \"ccx\", \"ccz\"]\\n-\\n- if isinstance(gate, str):\\n- # Check if gate is a valid Clifford basis gate string\\n- if gate not in basis_1q and gate not in basis_2q:\\n- raise QiskitError(f\"Invalid Clifford gate name string {gate}\")\\n- name = gate\\n- else:\\n- # Assume gate is an Instruction\\n- name = gate.name\\n-\\n- # Apply gate if it is a Clifford basis gate\\n- if name in non_clifford:\\n- raise QiskitError(f\"Cannot update Pauli with non-Clifford gate {name}\")\\n- if name in basis_1q:\\n- if len(qargs) != 1:\\n- raise QiskitError(\"Invalid qubits for 1-qubit gate.\")\\n- return basis_1q[name](self, qargs[0])\\n- if name in basis_2q:\\n- if len(qargs) != 2:\\n- raise QiskitError(\"Invalid qubits for 2-qubit gate.\")\\n- return basis_2q[name](self, qargs[0], qargs[1])\\n-\\n- # If not a Clifford basis gate we try to unroll the gate and\\n- # raise an exception if unrolling reaches a non-Clifford gate.\\n- if gate.definition is None:\\n- raise QiskitError(f\"Cannot apply Instruction: {gate.name}\")\\n- if not isinstance(gate.definition, QuantumCircuit):\\n- raise QiskitError(\\n- \"{} instruction definition is {}; expected QuantumCircuit\".format(\\n- gate.name, type(gate.definition)\\n+ if isinstance(gate, str):\\n+ # Check if gate is a valid Clifford basis gate string\\n+ if gate not in _basis_1q and gate not in _basis_2q:\\n+ raise QiskitError(f\"Invalid Clifford gate name string {gate}\")\\n+ name = gate\\n+ else:\\n+ # Assume gate is an Instruction\\n+ name = gate.name\\n+\\n+ # Apply gate if it is a Clifford basis gate\\n+ if name in _non_clifford:\\n+ raise QiskitError(f\"Cannot update Pauli with non-Clifford gate {name}\")\\n+ if name in _basis_1q:\\n+ if len(qargs) != 1:\\n+ raise QiskitError(\"Invalid qubits for 1-qubit gate.\")\\n+ return _basis_1q[name](self, qargs[0])\\n+ if name in _basis_2q:\\n+ if len(qargs) != 2:\\n+ raise QiskitError(\"Invalid qubits for 2-qubit gate.\")\\n+ return _basis_2q[name](self, qargs[0], qargs[1])\\n+\\n+ # If not a Clifford basis gate we try to unroll the gate and\\n+ # raise an exception if unrolling reaches a non-Clifford gate.\\n+ if gate.definition is None:\\n+ raise QiskitError(f\"Cannot apply Instruction: {gate.name}\")\\n+ if not isinstance(gate.definition, QuantumCircuit):\\n+ raise QiskitError(\\n+ \"{} instruction definition is {}; expected QuantumCircuit\".format(\\n+ gate.name, type(gate.definition)\\n+ )\\n )\\n- )\\n \\n- flat_instr = gate.definition\\n- bit_indices = {\\n- bit: index\\n- for bits in [flat_instr.qubits, flat_instr.clbits]\\n- for index, bit in enumerate(bits)\\n- }\\n+ circuit = gate.definition\\n \\n- for instruction in flat_instr:\\n+ for instruction in circuit:\\n if instruction.clbits:\\n raise QiskitError(\\n f\"Cannot apply Instruction with classical bits: {instruction.operation.name}\"\\n )\\n # Get the integer position of the flat register\\n- new_qubits = [qargs[bit_indices[tup]] for tup in instruction.qubits]\\n+ new_qubits = [qargs[circuit.find_bit(qb)[0]] for qb in instruction.qubits]\\n self._append_circuit(instruction.operation, new_qubits)\\n \\n # Since the individual gate evolution functions don't take mod\\n@@ -715,6 +690,42 @@ def _evolve_swap(base_pauli, q1, q2):\\n return base_pauli\\n \\n \\n+def _evolve_ecr(base_pauli, q1, q2):\\n+ \"\"\"Update P -> ECR.P.ECR\"\"\"\\n+ base_pauli = _evolve_s(base_pauli, q1)\\n+ base_pauli = _evolve_h(base_pauli, q2)\\n+ base_pauli = _evolve_s(base_pauli, q2)\\n+ base_pauli = _evolve_h(base_pauli, q2)\\n+ base_pauli = _evolve_cx(base_pauli, q1, q2)\\n+ base_pauli = _evolve_x(base_pauli, q1)\\n+ return base_pauli\\n+\\n+\\n def _count_y(x, z, dtype=None):\\n \"\"\"Count the number of I Paulis\"\"\"\\n return (x & z).sum(axis=1, dtype=dtype)\\n+\\n+\\n+# Basis Clifford Gates\\n+_basis_1q = {\\n+ \"i\": _evolve_i,\\n+ \"id\": _evolve_i,\\n+ \"iden\": _evolve_i,\\n+ \"x\": _evolve_x,\\n+ \"y\": _evolve_y,\\n+ \"z\": _evolve_z,\\n+ \"h\": _evolve_h,\\n+ \"s\": _evolve_s,\\n+ \"sdg\": _evolve_sdg,\\n+ \"sinv\": _evolve_sdg,\\n+}\\n+_basis_2q = {\\n+ \"cx\": _evolve_cx,\\n+ \"cz\": _evolve_cz,\\n+ \"cy\": _evolve_cy,\\n+ \"swap\": _evolve_swap,\\n+ \"ecr\": _evolve_ecr,\\n+}\\n+\\n+# Non-Clifford gates\\n+_non_clifford = [\"t\", \"tdg\", \"ccx\", \"ccz\"]\\ndiff --git a/releasenotes/notes/fix-pauli-evolve-ecr-and-name-bugs.yaml b/releasenotes/notes/fix-pauli-evolve-ecr-and-name-bugs.yaml\\nnew file mode 100644\\nindex 000000000000..143dfadf31e2\\n--- /dev/null\\n+++ b/releasenotes/notes/fix-pauli-evolve-ecr-and-name-bugs.yaml\\n@@ -0,0 +1,6 @@\\n+---\\n+fixes:\\n+ - |\\n+ :meth:`.Pauli.evolve` now correctly handles quantum circuits containing ECR gates. Formerly they were not recognized as Clifford gates, and an error was raised.\\n+ - |\\n+ Fixed a bug in :meth:`.Pauli.evolve` where evolving by a circuit with a name matching certain Clifford gates ('cx', 'cz', etc) would evolve the Pauli according to the name of the circuit, not by the contents of the circuit. This bug occurred only with the non-default option ``frame='s'``.\\n"}, "test": {"test_patch": "diff --git a/test/python/quantum_info/operators/symplectic/test_pauli.py b/test/python/quantum_info/operators/symplectic/test_pauli.py\\nindex c760407ad3fa..875dd9237810 100644\\n--- a/test/python/quantum_info/operators/symplectic/test_pauli.py\\n+++ b/test/python/quantum_info/operators/symplectic/test_pauli.py\\n@@ -36,6 +36,7 @@\\n CZGate,\\n CYGate,\\n SwapGate,\\n+ ECRGate,\\n EfficientSU2,\\n )\\n from qiskit.circuit.library.generalized_gates import PauliGate\\n@@ -410,7 +411,11 @@ def test_evolve_clifford1(self, gate, label):\\n self.assertEqual(value, value_h)\\n self.assertEqual(value_inv, value_s)\\n \\n- @data(*it.product((CXGate(), CYGate(), CZGate(), SwapGate()), pauli_group_labels(2, False)))\\n+ @data(\\n+ *it.product(\\n+ (CXGate(), CYGate(), CZGate(), SwapGate(), ECRGate()), pauli_group_labels(2, False)\\n+ )\\n+ )\\n @unpack\\n def test_evolve_clifford2(self, gate, label):\\n \"\"\"Test evolve method for 2-qubit Clifford gates.\"\"\"\\n@@ -439,6 +444,7 @@ def test_evolve_clifford2(self, gate, label):\\n CYGate(),\\n CZGate(),\\n SwapGate(),\\n+ ECRGate(),\\n ),\\n [int, np.int8, np.uint8, np.int16, np.uint16, np.int32, np.uint32, np.int64, np.uint64],\\n )\\n@@ -468,6 +474,13 @@ def test_evolve_clifford_qargs(self):\\n self.assertEqual(value, value_h)\\n self.assertEqual(value_inv, value_s)\\n \\n+ @data(\"s\", \"h\")\\n+ def test_evolve_with_misleading_name(self, frame):\\n+ \"\"\"Test evolve by circuit contents, not by name (fixed bug).\"\"\"\\n+ circ = QuantumCircuit(2, name=\"cx\")\\n+ p = Pauli(\"IX\")\\n+ self.assertEqual(p, p.evolve(circ, frame=frame))\\n+\\n def test_barrier_delay_sim(self):\\n \"\"\"Test barrier and delay instructions can be simulated\"\"\"\\n target_circ = QuantumCircuit(2)\\ndiff --git a/test/python/quantum_info/operators/symplectic/test_pauli_list.py b/test/python/quantum_info/operators/symplectic/test_pauli_list.py\\nindex 7ab6feaefe98..0ef7079f461a 100644\\n--- a/test/python/quantum_info/operators/symplectic/test_pauli_list.py\\n+++ b/test/python/quantum_info/operators/symplectic/test_pauli_list.py\\n@@ -33,6 +33,7 @@\\n XGate,\\n YGate,\\n ZGate,\\n+ ECRGate,\\n )\\n from qiskit.quantum_info.operators import (\\n Clifford,\\n@@ -1997,10 +1998,12 @@ def test_evolve_clifford1(self, gate):\\n CYGate(),\\n CZGate(),\\n SwapGate(),\\n+ ECRGate(),\\n Clifford(CXGate()),\\n Clifford(CYGate()),\\n Clifford(CZGate()),\\n Clifford(SwapGate()),\\n+ Clifford(ECRGate()),\\n )\\n )\\n def test_evolve_clifford2(self, gate):\\n@@ -2033,6 +2036,7 @@ def test_phase_dtype_evolve_clifford(self):\\n CYGate(),\\n CZGate(),\\n SwapGate(),\\n+ ECRGate(),\\n )\\n dtypes = [\\n int,\\n", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}171{"question_id": "MSB_Qiskit_qiskit_pr12511", "question_type": "multi_swe_bench", "description": "fix issue/12311 with fractional gate in basis (Qiskit/qiskit#12511)", "content": {"org": "Qiskit", "repo": "qiskit", "pr_number": 12511, "issue_title": "fix issue/12311 with fractional gate in basis", "issue_body": "<!--\\r\\n\u26a0\ufe0f If you do not respect this template, your pull request will be closed.\\r\\n\u26a0\ufe0f Your pull request title should be short detailed and understandable for all.\\r\\n\u26a0\ufe0f Also, please add a release note file using reno if the change needs to be\\r\\n documented in the release notes.\\r\\n\u26a0\ufe0f If your pull request fixes an open issue, please link to the issue.\\r\\n\\r\\n- [x] I have added the tests to cover my changes.\\r\\n- [x] I have updated the documentation accordingly.\\r\\n- [x] I have read the CONTRIBUTING document.\\r\\n-->\\r\\n\\r\\n### Summary\\r\\nThis fixes an issue where an exception would be raised if transpiling a unitary gate to a backend with an RZZGate in its basis however transpiling with only `basis_gates` specified would transpile fine. \\r\\n\\r\\nfixes #12311 \\r\\n\\r\\n### Details and comments\\r\\nIn this case, where RZZ is the only entangling gate in the basis, decomposition of a 2q unitary gate wouldn't get synthesized in the `UnitarySynthesis` pass but would instead be synthesized in the `HighLevelSynthesis` pass because this would call the instruction's `_define` method which calls `two_qubit_cnot_decompose`. A subsequent `BasisTranslator` pass ultimately maps the cx to the rzz basis. I'm not sure whether this indirect path to unitary synthesis is intentional.\\r\\n\\r\\nThis pr resolves the specific example posed in the issue.\\r\\n\\r\\n", "base_commit": "5a6312d7b2dd6c3f5938fd98e46f4387eefcc21e", "resolved_issues": [{"number": 12311, "title": "2Q gate synthesis with fractional gates", "body": "### Environment\\r\\n\\r\\n- **Qiskit version**: main\\r\\n- **Python version**: doesn't matter\\r\\n- **Operating system**: doesn't matter\\r\\n\\r\\n\\r\\n### What is happening?\\r\\n\\r\\nWhen I build a Qiskit `Target` that supports two qubit basis gates with arbitrary rotation angle, it cannot transpile the circuit if the added basis gate is other than `RZXGate` or `RXXGate`.\\r\\n\\r\\n### How can we reproduce the issue?\\r\\n\\r\\n```python\\r\\nfrom qiskit.providers.fake_provider import GenericBackendV2\\r\\nfrom qiskit import quantum_info as qi, transpile, QuantumCircuit\\r\\n\\r\\nbackend = GenericBackendV2(2, basis_gates=[\"rz\", \"rx\", \"rzz\"])\\r\\nqc = QuantumCircuit(2)\\r\\nqc.unitary(qi.random_unitary(4), [0, 1])\\r\\nisa = transpile(qc, target=backend.target)\\r\\n```\\r\\nthis results in an error\\r\\n```\\r\\nTypeError: ParameterExpression with unbound parameters (dict_keys([Parameter(\u03f4)])) cannot be cast to a float.\\r\\n```\\r\\nbecause it tries to get the unitary matrix of parameterized `RZZGate(Parameter(\u03f4))` instruction.\\r\\n\\r\\nOn the other hand, it transpiles circuit when I directly specify the basis gates.\\r\\n```python\\r\\nisa = transpile(qc, basis_gates=[\"rz\", \"rx\", \"rzz\"])\\r\\n```\\r\\n\\r\\n### What should happen?\\r\\n\\r\\n- Qiskit transpiler should support arbitrary fractional two qubit basis gates, e.g. `RZX, RXX, RYY, RZZ, RXY, ...`. \\r\\n- Transpiling with `Target` and giving `basis_gates` should behave identically.\\r\\n\\r\\nThis is related but might be a feature request; even if I give `RZXGate(Parameter(\u03f4))` in the target, current synthesis algorithm only picks pi/4 rotation. The synthesis pass should consider another angle if there is possibility of reducing the circuit depth.\\r\\n\\r\\n### Any suggestions?\\r\\n\\r\\nNo. I'm not familiar with synthesis passes."}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/qiskit_m_qiskit:pr-12511", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/qiskit/transpiler/passes/synthesis/unitary_synthesis.py b/qiskit/transpiler/passes/synthesis/unitary_synthesis.py\\nindex ab7c5e04649f..19356adf69c9 100644\\n--- a/qiskit/transpiler/passes/synthesis/unitary_synthesis.py\\n+++ b/qiskit/transpiler/passes/synthesis/unitary_synthesis.py\\n@@ -49,6 +49,7 @@\\n CZGate,\\n RXXGate,\\n RZXGate,\\n+ RZZGate,\\n ECRGate,\\n RXGate,\\n SXGate,\\n@@ -779,6 +780,8 @@ def _replace_parameterized_gate(op):\\n op = RXXGate(pi / 2)\\n elif isinstance(op, RZXGate) and isinstance(op.params[0], Parameter):\\n op = RZXGate(pi / 4)\\n+ elif isinstance(op, RZZGate) and isinstance(op.params[0], Parameter):\\n+ op = RZZGate(pi / 2)\\n return op\\n \\n try:\\n"}, "test": {"test_patch": "diff --git a/test/python/transpiler/test_basis_translator.py b/test/python/transpiler/test_basis_translator.py\\nindex fc933cd8f666..e1c8063a4575 100644\\n--- a/test/python/transpiler/test_basis_translator.py\\n+++ b/test/python/transpiler/test_basis_translator.py\\n@@ -16,6 +16,7 @@\\n import os\\n \\n from numpy import pi\\n+import scipy\\n \\n from qiskit import QuantumRegister, ClassicalRegister, QuantumCircuit\\n from qiskit import transpile\\n@@ -33,13 +34,17 @@\\n XGate,\\n SXGate,\\n CXGate,\\n+ RXGate,\\n+ RZZGate,\\n )\\n from qiskit.converters import circuit_to_dag, dag_to_circuit, circuit_to_instruction\\n from qiskit.exceptions import QiskitError\\n+from qiskit.providers.fake_provider import GenericBackendV2\\n from qiskit.quantum_info import Operator\\n from qiskit.transpiler.target import Target, InstructionProperties\\n from qiskit.transpiler.exceptions import TranspilerError\\n from qiskit.transpiler.passes.basis import BasisTranslator, UnrollCustomDefinitions\\n+from qiskit.transpiler.preset_passmanagers import generate_preset_pass_manager\\n from qiskit.circuit.library.standard_gates.equivalence_library import (\\n StandardEquivalenceLibrary as std_eqlib,\\n )\\n@@ -1223,3 +1228,48 @@ def __init__(self):\\n \\n out = BasisTranslator(eq_lib, {\"my_h\", \"my_cx\"}, target)(qc)\\n self.assertEqual(out, expected)\\n+\\n+ def test_fractional_gate_in_basis_from_string(self):\\n+ \"\"\"Test transpiling with RZZ in basis with only basis_gates option.\"\"\"\\n+ num_qubits = 2\\n+ seed = 9169\\n+ basis_gates = [\"rz\", \"rx\", \"rzz\"]\\n+ qc = QuantumCircuit(num_qubits)\\n+ mat = scipy.stats.unitary_group.rvs(2**num_qubits, random_state=seed)\\n+ qc.unitary(mat, range(num_qubits))\\n+ pm = generate_preset_pass_manager(\\n+ optimization_level=1, basis_gates=basis_gates, seed_transpiler=134\\n+ )\\n+ cqc = pm.run(qc)\\n+ self.assertEqual(Operator(qc), Operator(cqc))\\n+\\n+ def test_fractional_gate_in_basis_from_backendv2(self):\\n+ \"\"\"Test transpiling with RZZ in basis of backendv2.\"\"\"\\n+ num_qubits = 2\\n+ seed = 9169\\n+ basis_gates = [\"rz\", \"rx\", \"rzz\"]\\n+ qc = QuantumCircuit(num_qubits)\\n+ mat = scipy.stats.unitary_group.rvs(2**num_qubits, random_state=seed)\\n+ qc.unitary(mat, range(num_qubits))\\n+ backend = GenericBackendV2(num_qubits, basis_gates=basis_gates)\\n+ target = backend.target\\n+ pm = generate_preset_pass_manager(optimization_level=1, target=target, seed_transpiler=134)\\n+ cqc = pm.run(qc)\\n+ self.assertEqual(Operator(qc), Operator.from_circuit(cqc))\\n+\\n+ def test_fractional_gate_in_basis_from_custom_target(self):\\n+ \"\"\"Test transpiling with RZZ in basis of custom target.\"\"\"\\n+ num_qubits = 2\\n+ seed = 9169\\n+ qc = QuantumCircuit(num_qubits)\\n+ mat = scipy.stats.unitary_group.rvs(2**num_qubits, random_state=seed)\\n+ qc.unitary(mat, range(num_qubits))\\n+ target = Target()\\n+ target.add_instruction(RZGate(self.theta), {(i,): None for i in range(qc.num_qubits)})\\n+ target.add_instruction(RXGate(self.phi), {(i,): None for i in range(qc.num_qubits)})\\n+ target.add_instruction(\\n+ RZZGate(self.lam), {(i, i + 1): None for i in range(qc.num_qubits - 1)}\\n+ )\\n+ pm = generate_preset_pass_manager(optimization_level=1, target=target, seed_transpiler=134)\\n+ cqc = pm.run(qc)\\n+ self.assertEqual(Operator(qc), Operator.from_circuit(cqc))\\n", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}172{"question_id": "MSB_Qiskit_qiskit_pr12884", "question_type": "multi_swe_bench", "description": "Fix setter so that `SparsePauliOp.paulis.phase` stays zero (Qiskit/qiskit#12884)", "content": {"org": "Qiskit", "repo": "qiskit", "pr_number": 12884, "issue_title": "Fix setter so that `SparsePauliOp.paulis.phase` stays zero", "issue_body": "<!--\\r\\n\u26a0\ufe0f If you do not respect this template, your pull request will be closed.\\r\\n\u26a0\ufe0f Your pull request title should be short detailed and understandable for all.\\r\\n\u26a0\ufe0f Also, please add a release note file using reno if the change needs to be\\r\\n documented in the release notes.\\r\\n\u26a0\ufe0f If your pull request fixes an open issue, please link to the issue.\\r\\n\\r\\n- [] I have added the tests to cover my changes.\\r\\n- [ ] I have updated the documentation accordingly.\\r\\n- [ ] I have read the CONTRIBUTING document.\\r\\n-->\\r\\n\\r\\n### Summary\\r\\nGoal is to fix #12883.\\r\\n\\r\\nCurrently several `SPO` methods assume that `SPO.paulis.phase` is all zero. However nonzero phase is allowed by the `paulis()` setter, leading to incorrect results when those other methods are called. \\r\\n\\r\\n### Details and comments\\r\\nIn this small PR we update the `paulis()` setter to absorb the phase into the SPO `coeffs`. \\r\\n", "base_commit": "592c5f4599c6988be9c8aba7ea20841ebf141b7e", "resolved_issues": [{"number": 12883, "title": "several `SparsePauliOp` methods ignore `self.paulis.phase`", "body": "### Environment\\r\\n\\r\\n- **Qiskit version**: 1.1.1\\r\\n- **Python version**: 3.11.6\\r\\n- **Operating system**: macos\\r\\n\\r\\n\\r\\n### What is happening?\\r\\n\\r\\nIf I understand it right, `SparsePauliOp.simplify()` does not correctly take into account the `phase` attribute of its underlying `PauliList`.\\r\\n\\r\\nThe same also seems true for several `SparsePauliOp` methods under the header \"LinearOp Methods\", like `conjugate`, and `adjoint`, which update `self.coeffs` but AFAIK do not look at `self.paulis.phase`.\\r\\n\\r\\n(I haven't looked exhaustively for other methods that do not handle `paulis.phase`.)\\r\\n\\r\\n\\r\\n### How can we reproduce the issue?\\r\\n\\r\\nFor example, define a `SparsePauliOp`, and then set its `paulis` attribute to a new value with nonzero `phase`:\\r\\n```\\r\\nspo = qi.SparsePauliOp(['X', 'X'])\\r\\nspo.paulis = ['X','-X']\\r\\nprint(spo)\\r\\n```\\r\\n```\\r\\nSparsePauliOp(['X', '-X'],\\r\\n coeffs=[1.+0.j, 1.+0.j])\\r\\n```\\r\\nSo far so good. But now call simplify:\\r\\n```\\r\\nspo.simplify()\\r\\n```\\r\\n```\\r\\nSparsePauliOp(['X'],\\r\\n coeffs=[2.+0.j])\\r\\n```\\r\\nAFAIK this is incorrect. \\r\\n\\r\\n### What should happen?\\r\\n\\r\\nThe example above should instead match this result where we construct the SPO differently:\\r\\n```\\r\\nspo_2 = qi.SparsePauliOp(['X','-X'])\\r\\nspo_2.simplify()\\r\\n```\\r\\n```\\r\\nSparsePauliOp(['I'],\\r\\n coeffs=[0.+0.j])\\r\\n```\\r\\n\\r\\n### Any suggestions?\\r\\n\\r\\nEither we need to fix all the methods to consider `paulis.phase`, or (probably better) we need to more strictly require that the `paulis` attribute never has any phase, e.g. updating the `paulis()` setter to move the phase into the `coeffs` (don't know what else would need to change).\\r\\n\\r\\nAnother example:\\r\\n```\\r\\nspo_1 = qi.SparsePauliOp(['X'])\\r\\nspo_1.paulis = qi.PauliList(['-1jX'])\\r\\nspo_1\\r\\n```\\r\\n```\\r\\nSparsePauliOp(['-iX'],\\r\\n coeffs=[1.+0.j])\\r\\n```\\r\\nNow try `conjugate()`:\\r\\n```\\r\\nspo_1.conjugate()\\r\\n```\\r\\n```\\r\\nSparsePauliOp(['-iX'],\\r\\n coeffs=[1.-0.j])\\r\\n```"}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/qiskit_m_qiskit:pr-12884", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/qiskit/quantum_info/operators/symplectic/sparse_pauli_op.py b/qiskit/quantum_info/operators/symplectic/sparse_pauli_op.py\\nindex 10d76f8719af..4621019a9d81 100644\\n--- a/qiskit/quantum_info/operators/symplectic/sparse_pauli_op.py\\n+++ b/qiskit/quantum_info/operators/symplectic/sparse_pauli_op.py\\n@@ -256,6 +256,8 @@ def paulis(self, value):\\n raise ValueError(\\n f\"incorrect number of operators: expected {len(self.paulis)}, got {len(value)}\"\\n )\\n+ self.coeffs *= (-1j) ** value.phase\\n+ value.phase = 0\\n self._pauli_list = value\\n \\n @property\\ndiff --git a/releasenotes/notes/fix-sparsepauliop-phase-bug-2b24f4b775ca564f.yaml b/releasenotes/notes/fix-sparsepauliop-phase-bug-2b24f4b775ca564f.yaml\\nnew file mode 100644\\nindex 000000000000..ff1cf96dd711\\n--- /dev/null\\n+++ b/releasenotes/notes/fix-sparsepauliop-phase-bug-2b24f4b775ca564f.yaml\\n@@ -0,0 +1,8 @@\\n+---\\n+fixes:\\n+ - |\\n+ Fixed a bug when :attr:`.SparsePauliOp.paulis` is set to be a :class:`.PauliList` with nonzero \\n+ phase, where subsequent calls to several :class:`.SparsePauliOp` methods would produce \\n+ incorrect results. Now when :attr:`.SparsePauliOp.paulis` is set to a :class:`.PauliList` with \\n+ nonzero phase, the phase is absorbed into :attr:`.SparsePauliOp.coeffs`, and the phase of the \\n+ input :class:`.PauliList` is set to zero.\\n"}, "test": {"test_patch": "diff --git a/test/python/quantum_info/operators/symplectic/test_sparse_pauli_op.py b/test/python/quantum_info/operators/symplectic/test_sparse_pauli_op.py\\nindex 4964b0c6a609..dedd84279a8d 100644\\n--- a/test/python/quantum_info/operators/symplectic/test_sparse_pauli_op.py\\n+++ b/test/python/quantum_info/operators/symplectic/test_sparse_pauli_op.py\\n@@ -1097,6 +1097,25 @@ def test_paulis_setter_rejects_bad_inputs(self):\\n with self.assertRaisesRegex(ValueError, \"incorrect number of operators\"):\\n op.paulis = PauliList([Pauli(\"XY\"), Pauli(\"ZX\"), Pauli(\"YZ\")])\\n \\n+ def test_paulis_setter_absorbs_phase(self):\\n+ \"\"\"Test that the setter for `paulis` absorbs `paulis.phase` to `self.coeffs`.\"\"\"\\n+ coeffs_init = np.array([1, 1j])\\n+ op = SparsePauliOp([\"XY\", \"ZX\"], coeffs=coeffs_init)\\n+ paulis_new = PauliList([\"-1jXY\", \"1jZX\"])\\n+ op.paulis = paulis_new\\n+ # Paulis attribute should have no phase:\\n+ self.assertEqual(op.paulis, PauliList([\"XY\", \"ZX\"]))\\n+ # Coeffs attribute should now include that phase:\\n+ self.assertTrue(np.allclose(op.coeffs, coeffs_init * np.array([-1j, 1j])))\\n+ # The phase of the input array is now zero:\\n+ self.assertTrue(np.allclose(paulis_new.phase, np.array([0, 0])))\\n+\\n+ def test_paulis_setter_absorbs_phase_2(self):\\n+ \"\"\"Test that `paulis` setter followed by `simplify()` handle phase OK.\"\"\"\\n+ spo = SparsePauliOp([\"X\", \"X\"])\\n+ spo.paulis = [\"X\", \"-X\"]\\n+ self.assertEqual(spo.simplify(), SparsePauliOp([\"I\"], coeffs=[0.0 + 0.0j]))\\n+\\n def test_apply_layout_with_transpile(self):\\n \"\"\"Test the apply_layout method with a transpiler layout.\"\"\"\\n psi = EfficientSU2(4, reps=4, entanglement=\"circular\")\\n", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}173{"question_id": "MSB_Qiskit_qiskit_pr12986", "question_type": "multi_swe_bench", "description": "Fix `UnitaryGate.repeat()` method (Qiskit/qiskit#12986)", "content": {"org": "Qiskit", "repo": "qiskit", "pr_number": 12986, "issue_title": "Fix `UnitaryGate.repeat()` method", "issue_body": "### Summary\\r\\nCloses #11990 : error when calling the `UnitaryGate.repeat()` method (inherited from the `Gate` class).\\r\\n\\r\\n### Details and comments\\r\\nThe method `repeat()` internally calls the private method `_return_repeat()` which is inherited from the `Gate` class.\\r\\nIt creates a new `Gate` object with arguments `params=self.params`, which is expected to be of type `ParameterExpression` or `float`. However the parameters are of type `numpy.ndarray` for a `UnitaryGate`. \\r\\nA simple fix is to omit these parameters (`params=[]`) as they are not directly used by the returned `Gate`. Actually these parameters are still stored in the `repeat()` method and used only there.\\r\\n", "base_commit": "6b6efc7d547e5baef7d906c850e2bc69ed6430fb", "resolved_issues": [{"number": 11990, "title": "Invalid param type <class 'numpy.ndarray'> for gate unitary*1", "body": "### Environment\\n\\n- **Qiskit version**: 1.0.2\\r\\n- **Python version**: 3.11.8\\r\\n- **Operating system**: Ubuntu 22.04.3 LTS\\n\\n### What is happening?\\n\\nRunning the below code triggered a qiskit.circuit.exceptions.CircuitError: \"Invalid param type <class 'numpy.ndarray'> for gate unitary*1.\" I found this bug happens for some other Gates as well. Below is a minimal reproduction example using CUGate.\\n\\n### How can we reproduce the issue?\\n\\n```\\r\\nfrom qiskit import QuantumCircuit, ClassicalRegister, QuantumRegister\\r\\nfrom qiskit.circuit.library.standard_gates import CUGate\\r\\n\\r\\nqr = QuantumRegister(2, name='qr')\\r\\ncr = ClassicalRegister(2, name='cr')\\r\\nqc = QuantumCircuit(qr, cr, name='qc')\\r\\n\\r\\nqc.append(CUGate(0, 0, 0, 0).power(1).repeat(1), qargs=qr)\\r\\n```\\n\\n### What should happen?\\n\\n```\\r\\nTraceback (most recent call last):\\r\\n File \"/mnt/tests/reproduction/reproduce_invalid_param_type.py\", line 8, in <module>\\r\\n qc.append(CUGate(0, 0, 0, 0).power(1).repeat(1), qargs=qr)\\r\\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\\r\\n File \"/root/anaconda3/envs/qiskit1.0.2/lib/python3.11/site-packages/qiskit/circuit/instruction.py\", line 591, in repeat\\r\\n instruction = self._return_repeat(n)\\r\\n ^^^^^^^^^^^^^^^^^^^^^^\\r\\n File \"/root/anaconda3/envs/qiskit1.0.2/lib/python3.11/site-packages/qiskit/circuit/gate.py\", line 87, in _return_repeat\\r\\n return Gate(name=f\"{self.name}*{exponent}\", num_qubits=self.num_qubits, params=self.params)\\r\\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\\r\\n File \"/root/anaconda3/envs/qiskit1.0.2/lib/python3.11/site-packages/qiskit/circuit/gate.py\", line 46, in __init__\\r\\n super().__init__(name, num_qubits, 0, params, label=label, duration=duration, unit=unit)\\r\\n File \"/root/anaconda3/envs/qiskit1.0.2/lib/python3.11/site-packages/qiskit/circuit/instruction.py\", line 108, in __init__\\r\\n self.params = params # must be at last (other properties may be required for validation)\\r\\n ^^^^^^^^^^^\\r\\n File \"/root/anaconda3/envs/qiskit1.0.2/lib/python3.11/site-packages/qiskit/circuit/instruction.py\", line 287, in params\\r\\n self._params.append(self.validate_parameter(single_param))\\r\\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\\r\\n File \"/root/anaconda3/envs/qiskit1.0.2/lib/python3.11/site-packages/qiskit/circuit/gate.py\", line 242, in validate_parameter\\r\\n raise CircuitError(f\"Invalid param type {type(parameter)} for gate {self.name}.\")\\r\\nqiskit.circuit.exceptions.CircuitError: \"Invalid param type <class 'numpy.ndarray'> for gate unitary*1.\"\\r\\n```\\n\\n### Any suggestions?\\n\\n_No response_"}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/qiskit_m_qiskit:pr-12986", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/qiskit/circuit/gate.py b/qiskit/circuit/gate.py\\nindex 37fd19e2022a..2f1c09668252 100644\\n--- a/qiskit/circuit/gate.py\\n+++ b/qiskit/circuit/gate.py\\n@@ -97,7 +97,10 @@ def __pow__(self, exponent: float) -> \"Gate\":\\n return self.power(exponent)\\n \\n def _return_repeat(self, exponent: float) -> \"Gate\":\\n- return Gate(name=f\"{self.name}*{exponent}\", num_qubits=self.num_qubits, params=self.params)\\n+ gate = Gate(name=f\"{self.name}*{exponent}\", num_qubits=self.num_qubits, params=[])\\n+ gate.validate_parameter = self.validate_parameter\\n+ gate.params = self.params\\n+ return gate\\n \\n def control(\\n self,\\ndiff --git a/releasenotes/notes/fix_11990-8551c7250207fc76.yaml b/releasenotes/notes/fix_11990-8551c7250207fc76.yaml\\nnew file mode 100644\\nindex 000000000000..68912403cd39\\n--- /dev/null\\n+++ b/releasenotes/notes/fix_11990-8551c7250207fc76.yaml\\n@@ -0,0 +1,6 @@\\n+---\\n+fixes:\\n+ - |\\n+ Fixes an error when calling the method :meth:`.UnitaryGate.repeat`. \\n+ Refer to `#11990 <https://github.com/Qiskit/qiskit/issues/11990>`_ for more\\n+ details.\\n\\\\ No newline at end of file\\n"}, "test": {"test_patch": "diff --git a/test/python/circuit/library/test_linear_function.py b/test/python/circuit/library/test_linear_function.py\\nindex a3df1e9664a2..b7756faa7aa7 100644\\n--- a/test/python/circuit/library/test_linear_function.py\\n+++ b/test/python/circuit/library/test_linear_function.py\\n@@ -502,6 +502,19 @@ def test_clifford_linear_function_equivalence(self, num_qubits):\\n self.assertEqual(Clifford(qc_to_linear_function), qc_to_clifford)\\n self.assertEqual(qc_to_linear_function, LinearFunction(qc_to_clifford))\\n \\n+ @data(2, 3)\\n+ def test_repeat_method(self, num_qubits):\\n+ \"\"\"Test the repeat() method.\"\"\"\\n+ rng = np.random.default_rng(127)\\n+ for num_gates, seed in zip(\\n+ [0, 5, 5 * num_qubits], rng.integers(100000, size=10, dtype=np.uint64)\\n+ ):\\n+ # create a random linear circuit\\n+ linear_circuit = random_linear_circuit(num_qubits, num_gates, seed=seed)\\n+ operator = Operator(linear_circuit)\\n+ linear_function = LinearFunction(linear_circuit)\\n+ self.assertTrue(Operator(linear_function.repeat(2)), operator @ operator)\\n+\\n \\n if __name__ == \"__main__\":\\n unittest.main()\\ndiff --git a/test/python/circuit/library/test_permutation.py b/test/python/circuit/library/test_permutation.py\\nindex 30d504d7dc8f..a2ec59431fe3 100644\\n--- a/test/python/circuit/library/test_permutation.py\\n+++ b/test/python/circuit/library/test_permutation.py\\n@@ -104,6 +104,12 @@ def test_inverse(self):\\n expected_inverse_perm = PermutationGate([3, 0, 5, 1, 4, 2])\\n self.assertTrue(np.array_equal(inverse_perm.pattern, expected_inverse_perm.pattern))\\n \\n+ def test_repeat(self):\\n+ \"\"\"Test the ``repeat`` method.\"\"\"\\n+ pattern = [2, 4, 1, 3, 0]\\n+ perm = PermutationGate(pattern)\\n+ self.assertTrue(np.allclose(Operator(perm.repeat(2)), Operator(perm) @ Operator(perm)))\\n+\\n \\n class TestPermutationGatesOnCircuit(QiskitTestCase):\\n \"\"\"Tests for quantum circuits containing permutations.\"\"\"\\ndiff --git a/test/python/circuit/test_diagonal_gate.py b/test/python/circuit/test_diagonal_gate.py\\nindex de8d53e12d3b..bb9259999576 100644\\n--- a/test/python/circuit/test_diagonal_gate.py\\n+++ b/test/python/circuit/test_diagonal_gate.py\\n@@ -83,6 +83,19 @@ def test_npcomplex_params_conversion(self):\\n all(isinstance(p, complex) and not isinstance(p, np.number) for p in params)\\n )\\n \\n+ def test_repeat(self):\\n+ \"\"\"Test the repeat() method.\"\"\"\\n+ for phases in [\\n+ [0, 0],\\n+ np.array([0, 0.8, 1, 0]),\\n+ (2 * np.pi * np.random.rand(2**3)).tolist(),\\n+ ]:\\n+ with self.subTest(phases=phases):\\n+ diag = [np.exp(1j * ph) for ph in phases]\\n+ gate = DiagonalGate(diag)\\n+ operator = Operator(gate)\\n+ self.assertTrue(np.allclose(Operator(gate.repeat(2)), operator @ operator))\\n+\\n \\n def _get_diag_gate_matrix(diag):\\n return np.diagflat(diag)\\ndiff --git a/test/python/circuit/test_gate_definitions.py b/test/python/circuit/test_gate_definitions.py\\nindex 950b0c478ed8..914ac8bab985 100644\\n--- a/test/python/circuit/test_gate_definitions.py\\n+++ b/test/python/circuit/test_gate_definitions.py\\n@@ -54,6 +54,8 @@\\n CZGate,\\n RYYGate,\\n PhaseGate,\\n+ PauliGate,\\n+ UCPauliRotGate,\\n CPhaseGate,\\n UGate,\\n CUGate,\\n@@ -184,6 +186,18 @@ def test_xx_minus_yy_definition(self):\\n self.assertTrue(len(decomposed_circuit) > len(circuit))\\n self.assertTrue(Operator(circuit).equiv(Operator(decomposed_circuit), atol=1e-7))\\n \\n+ def test_pauligate_repeat(self):\\n+ \"\"\"Test `repeat` method for `PauliGate`.\"\"\"\\n+ gate = PauliGate(\"XYZ\")\\n+ operator = Operator(gate)\\n+ self.assertTrue(np.allclose(Operator(gate.repeat(2)), operator @ operator))\\n+\\n+ def test_ucpaulirotgate_repeat(self):\\n+ \"\"\"Test `repeat` method for `UCPauliRotGate`.\"\"\"\\n+ gate = UCPauliRotGate([0.3, 0.5], \"X\")\\n+ operator = Operator(gate)\\n+ self.assertTrue(np.allclose(Operator(gate.repeat(2)), operator @ operator))\\n+\\n \\n @ddt\\n class TestStandardGates(QiskitTestCase):\\ndiff --git a/test/python/circuit/test_hamiltonian_gate.py b/test/python/circuit/test_hamiltonian_gate.py\\nindex 60fb1e9a90a9..e65e2f07ba5e 100644\\n--- a/test/python/circuit/test_hamiltonian_gate.py\\n+++ b/test/python/circuit/test_hamiltonian_gate.py\\n@@ -62,6 +62,12 @@ def test_adjoint(self):\\n ham.adjoint().to_matrix(), np.transpose(np.conj(ham.to_matrix()))\\n )\\n \\n+ def test_repeat(self):\\n+ \"\"\"test repeat operation\"\"\"\\n+ ham = HamiltonianGate(np.array([[1, 0.5 + 4j], [0.5 - 4j, -0.2]]), np.pi * 0.143)\\n+ operator = Operator(ham)\\n+ self.assertTrue(np.allclose(Operator(ham.repeat(2)), operator @ operator))\\n+\\n \\n class TestHamiltonianCircuit(QiskitTestCase):\\n \"\"\"Hamiltonian gate circuit tests.\"\"\"\\ndiff --git a/test/python/circuit/test_initializer.py b/test/python/circuit/test_initializer.py\\nindex 2507fbc6c139..990df5755d59 100644\\n--- a/test/python/circuit/test_initializer.py\\n+++ b/test/python/circuit/test_initializer.py\\n@@ -473,6 +473,16 @@ def test_gates_to_uncompute(self):\\n vec = Statevector(qc)\\n self.assertTrue(vec == Statevector(desired_vector))\\n \\n+ def test_repeat(self):\\n+ \"\"\"Test the repeat() method.\"\"\"\\n+ desired_vector = np.array([0.5, 0.5, 0.5, 0.5])\\n+ initialize = Initialize(desired_vector)\\n+ qr = QuantumRegister(2)\\n+ qc = QuantumCircuit(qr)\\n+ qc.append(initialize.repeat(2), qr)\\n+ statevector = Statevector(qc)\\n+ self.assertTrue(np.allclose(statevector, desired_vector))\\n+\\n \\n class TestInstructionParam(QiskitTestCase):\\n \"\"\"Test conversion of numpy type parameters.\"\"\"\\ndiff --git a/test/python/circuit/test_isometry.py b/test/python/circuit/test_isometry.py\\nindex 35ff639cedd5..ff497c76f48a 100644\\n--- a/test/python/circuit/test_isometry.py\\n+++ b/test/python/circuit/test_isometry.py\\n@@ -133,6 +133,21 @@ def test_isometry_inverse(self, iso):\\n result = Operator(qc)\\n np.testing.assert_array_almost_equal(result.data, np.identity(result.dim[0]))\\n \\n+ @data(\\n+ np.eye(2, 2),\\n+ random_unitary(2, seed=297102).data,\\n+ np.eye(4, 4),\\n+ random_unitary(4, seed=123642).data,\\n+ random_unitary(8, seed=568288).data,\\n+ )\\n+ def test_isometry_repeat(self, iso):\\n+ \"\"\"Tests for the repeat of isometries from n to n qubits\"\"\"\\n+ iso_gate = Isometry(iso, 0, 0)\\n+\\n+ op = Operator(iso_gate)\\n+ op_double = Operator(iso_gate.repeat(2))\\n+ np.testing.assert_array_almost_equal(op @ op, op_double)\\n+\\n \\n if __name__ == \"__main__\":\\n unittest.main()\\ndiff --git a/test/python/circuit/test_uc.py b/test/python/circuit/test_uc.py\\nindex 87541d349c3f..0277c4afb43d 100644\\n--- a/test/python/circuit/test_uc.py\\n+++ b/test/python/circuit/test_uc.py\\n@@ -100,6 +100,13 @@ def test_inverse_ucg(self):\\n \\n self.assertTrue(np.allclose(unitary_desired, unitary))\\n \\n+ def test_repeat(self):\\n+ \"\"\"test repeat operation\"\"\"\\n+ gates = [random_unitary(2, seed=seed).data for seed in [124435, 876345, 687462, 928365]]\\n+\\n+ uc = UCGate(gates, up_to_diagonal=False)\\n+ self.assertTrue(np.allclose(Operator(uc.repeat(2)), Operator(uc) @ Operator(uc)))\\n+\\n \\n def _get_ucg_matrix(squs):\\n return block_diag(*squs)\\ndiff --git a/test/python/circuit/test_unitary.py b/test/python/circuit/test_unitary.py\\nindex 63edbdaffbf9..6ab4a93c3f7d 100644\\n--- a/test/python/circuit/test_unitary.py\\n+++ b/test/python/circuit/test_unitary.py\\n@@ -67,6 +67,11 @@ def test_adjoint(self):\\n uni = UnitaryGate([[0, 1j], [-1j, 0]])\\n self.assertTrue(numpy.array_equal(uni.adjoint().to_matrix(), uni.to_matrix()))\\n \\n+ def test_repeat(self):\\n+ \"\"\"test repeat operation\"\"\"\\n+ uni = UnitaryGate([[1, 0], [0, 1j]])\\n+ self.assertTrue(numpy.array_equal(Operator(uni.repeat(2)), Operator(uni) @ Operator(uni)))\\n+\\n \\n class TestUnitaryCircuit(QiskitTestCase):\\n \"\"\"Matrix gate circuit tests.\"\"\"\\n", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}174{"question_id": "MSB_Qiskit_qiskit_pr12988", "question_type": "multi_swe_bench", "description": "Fix `StatePreparation`'s ``normalize`` argument (Qiskit/qiskit#12988)", "content": {"org": "Qiskit", "repo": "qiskit", "pr_number": 12988, "issue_title": "Fix `StatePreparation`'s ``normalize`` argument", "issue_body": "<!--\\r\\n\u26a0\ufe0f If you do not respect this template, your pull request will be closed.\\r\\n\u26a0\ufe0f Your pull request title should be short detailed and understandable for all.\\r\\n\u26a0\ufe0f Also, please add a release note file using reno if the change needs to be\\r\\n documented in the release notes.\\r\\n\u26a0\ufe0f If your pull request fixes an open issue, please link to the issue.\\r\\n\\r\\n- [ ] I have added the tests to cover my changes.\\r\\n- [ ] I have updated the documentation accordingly.\\r\\n- [ ] I have read the CONTRIBUTING document.\\r\\n-->\\r\\n\\r\\n### Summary\\r\\n\\r\\nFixes #12984. The definition didn't use the normalized parameters, if the input is synthesized by isometry.\\r\\n\\r\\n\\r\\n\\r\\n", "base_commit": "06392c523fdc514d2592ffc489e7a3515049eba3", "resolved_issues": [{"number": 12984, "title": "Passmanager fails to transpile a basic StatePreparation gate", "body": "### Environment\\n\\n- **Qiskit version**: 1.2.0\\r\\n- **Python version**: 3.12\\r\\n- **Operating system**: Ubuntu 24.04\\r\\n\\n\\n### What is happening?\\n\\nI am trying to execute the following circuit:\\r\\n\\r\\n```python\\r\\nfrom qiskit import QuantumCircuit, __version__ as qversion\\r\\nfrom qiskit.circuit.library import StatePreparation\\r\\nfrom qiskit_aer import AerSimulator, __version__ as qaversion\\r\\nfrom qiskit.transpiler.preset_passmanagers import generate_preset_pass_manager\\r\\n\\r\\nprint(qversion, '/', qaversion) # 1.2.0 / 0.14.2\\r\\n\\r\\npm = generate_preset_pass_manager(backend=AerSimulator(), optimization_level=3)\\r\\n\\r\\nqc = QuantumCircuit(1)\\r\\nqc.compose(StatePreparation([1, 1], normalize=True), range(1), inplace=True)\\r\\n\\r\\npm.run(qc)\\r\\n```\\r\\n\\r\\nAnd I am getting the following error:\\r\\n\\r\\n```\\r\\n---------------------------------------------------------------------------\\r\\nQiskitError Traceback (most recent call last)\\r\\nCell In[21], line 13\\r\\n 10 qc = QuantumCircuit(1)\\r\\n 11 qc.compose(StatePreparation([1, 1], normalize=True), range(1), inplace=True)\\r\\n---> 13 pm.run(qc)\\r\\n\\r\\nFile ~/anaconda3/envs/building-agi/lib/python3.12/site-packages/qiskit/transpiler/passmanager.py:441, in StagedPassManager.run(self, circuits, output_name, callback, num_processes)\\r\\n 433 def run(\\r\\n 434 self,\\r\\n 435 circuits: _CircuitsT,\\r\\n (...)\\r\\n 438 num_processes: int = None,\\r\\n 439 ) -> _CircuitsT:\\r\\n 440 self._update_passmanager()\\r\\n--> 441 return super().run(circuits, output_name, callback, num_processes=num_processes)\\r\\n\\r\\nFile ~/anaconda3/envs/building-agi/lib/python3.12/site-packages/qiskit/transpiler/passmanager.py:464, in _replace_error.<locals>.wrapper(*meth_args, **meth_kwargs)\\r\\n 461 @wraps(meth)\\r\\n 462 def wrapper(*meth_args, **meth_kwargs):\\r\\n 463 try:\\r\\n--> 464 return meth(*meth_args, **meth_kwargs)\\r\\n 465 except PassManagerError as ex:\\r\\n 466 raise TranspilerError(ex.message) from ex\\r\\n\\r\\nFile ~/anaconda3/envs/building-agi/lib/python3.12/site-packages/qiskit/transpiler/passmanager.py:226, in PassManager.run(self, circuits, output_name, callback, num_processes)\\r\\n 223 if callback is not None:\\r\\n 224 callback = _legacy_style_callback(callback)\\r\\n--> 226 return super().run(\\r\\n 227 in_programs=circuits,\\r\\n 228 callback=callback,\\r\\n 229 output_name=output_name,\\r\\n 230 num_processes=num_processes,\\r\\n 231 )\\r\\n\\r\\nFile ~/anaconda3/envs/building-agi/lib/python3.12/site-packages/qiskit/passmanager/passmanager.py:232, in BasePassManager.run(self, in_programs, callback, num_processes, **kwargs)\\r\\n 228 # If we're not going to run in parallel, we want to avoid spending time `dill` serializing\\r\\n 229 # ourselves, since that can be quite expensive.\\r\\n 230 if len(in_programs) == 1 or not should_run_in_parallel(num_processes):\\r\\n 231 out = [\\r\\n--> 232 _run_workflow(program=program, pass_manager=self, callback=callback, **kwargs)\\r\\n 233 for program in in_programs\\r\\n 234 ]\\r\\n 235 if len(in_programs) == 1 and not is_list:\\r\\n 236 return out[0]\\r\\n\\r\\nFile ~/anaconda3/envs/building-agi/lib/python3.12/site-packages/qiskit/passmanager/passmanager.py:292, in _run_workflow(program, pass_manager, **kwargs)\\r\\n 286 initial_status = WorkflowStatus()\\r\\n 288 passmanager_ir = pass_manager._passmanager_frontend(\\r\\n 289 input_program=program,\\r\\n 290 **kwargs,\\r\\n 291 )\\r\\n--> 292 passmanager_ir, final_state = flow_controller.execute(\\r\\n 293 passmanager_ir=passmanager_ir,\\r\\n 294 state=PassManagerState(\\r\\n 295 workflow_status=initial_status,\\r\\n 296 property_set=PropertySet(),\\r\\n 297 ),\\r\\n 298 callback=kwargs.get(\"callback\", None),\\r\\n 299 )\\r\\n 300 # The `property_set` has historically been returned as a mutable attribute on `PassManager`\\r\\n 301 # This makes us non-reentrant (though `PassManager` would be dependent on its internal tasks to\\r\\n 302 # be re-entrant if that was required), but is consistent with previous interfaces. We're still\\r\\n 303 # safe to be called in a serial loop, again assuming internal tasks are re-runnable. The\\r\\n 304 # conversion to the backend language is also allowed to use the property set, so it must be set\\r\\n 305 # before calling it.\\r\\n 306 pass_manager.property_set = final_state.property_set\\r\\n\\r\\nFile ~/anaconda3/envs/building-agi/lib/python3.12/site-packages/qiskit/passmanager/base_tasks.py:218, in BaseController.execute(self, passmanager_ir, state, callback)\\r\\n 216 return passmanager_ir, state\\r\\n 217 while True:\\r\\n--> 218 passmanager_ir, state = next_task.execute(\\r\\n 219 passmanager_ir=passmanager_ir,\\r\\n 220 state=state,\\r\\n 221 callback=callback,\\r\\n 222 )\\r\\n 223 try:\\r\\n 224 # Sending the object through the generator implies the custom controllers\\r\\n 225 # can always rely on the latest data to choose the next task to run.\\r\\n 226 next_task = task_generator.send(state)\\r\\n\\r\\nFile ~/anaconda3/envs/building-agi/lib/python3.12/site-packages/qiskit/transpiler/basepasses.py:195, in TransformationPass.execute(self, passmanager_ir, state, callback)\\r\\n 189 def execute(\\r\\n 190 self,\\r\\n 191 passmanager_ir: PassManagerIR,\\r\\n 192 state: PassManagerState,\\r\\n 193 callback: Callable = None,\\r\\n 194 ) -> tuple[PassManagerIR, PassManagerState]:\\r\\n--> 195 new_dag, state = super().execute(\\r\\n 196 passmanager_ir=passmanager_ir,\\r\\n 197 state=state,\\r\\n 198 callback=callback,\\r\\n 199 )\\r\\n 201 if state.workflow_status.previous_run == RunState.SUCCESS:\\r\\n 202 if isinstance(new_dag, DAGCircuit):\\r\\n 203 # Copy calibration data from the original program\\r\\n\\r\\nFile ~/anaconda3/envs/building-agi/lib/python3.12/site-packages/qiskit/passmanager/base_tasks.py:98, in GenericPass.execute(self, passmanager_ir, state, callback)\\r\\n 96 try:\\r\\n 97 if self not in state.workflow_status.completed_passes:\\r\\n---> 98 ret = self.run(passmanager_ir)\\r\\n 99 run_state = RunState.SUCCESS\\r\\n 100 else:\\r\\n\\r\\nFile ~/anaconda3/envs/building-agi/lib/python3.12/site-packages/qiskit/transpiler/passes/synthesis/high_level_synthesis.py:443, in HighLevelSynthesis.run(self, dag)\\r\\n 440 if self._definitely_skip_node(node, qubits):\\r\\n 441 continue\\r\\n--> 443 decomposition, modified = self._recursively_handle_op(node.op, qubits)\\r\\n 445 if not modified:\\r\\n 446 continue\\r\\n\\r\\nFile ~/anaconda3/envs/building-agi/lib/python3.12/site-packages/qiskit/transpiler/passes/synthesis/high_level_synthesis.py:551, in HighLevelSynthesis._recursively_handle_op(self, op, qubits)\\r\\n 547 return op, False\\r\\n 549 try:\\r\\n 550 # extract definition\\r\\n--> 551 definition = op.definition\\r\\n 552 except TypeError as err:\\r\\n 553 raise TranspilerError(\\r\\n 554 f\"HighLevelSynthesis was unable to extract definition for {op.name}: {err}\"\\r\\n 555 ) from err\\r\\n\\r\\nFile ~/anaconda3/envs/building-agi/lib/python3.12/site-packages/qiskit/circuit/instruction.py:312, in Instruction.definition(self)\\r\\n 310 \"\"\"Return definition in terms of other basic gates.\"\"\"\\r\\n 311 if self._definition is None:\\r\\n--> 312 self._define()\\r\\n 313 return self._definition\\r\\n\\r\\nFile ~/anaconda3/envs/building-agi/lib/python3.12/site-packages/qiskit/circuit/library/data_preparation/state_preparation.py:122, in StatePreparation._define(self)\\r\\n 120 self.definition = self._define_from_int()\\r\\n 121 else:\\r\\n--> 122 self.definition = self._define_synthesis_isom()\\r\\n\\r\\nFile ~/anaconda3/envs/building-agi/lib/python3.12/site-packages/qiskit/circuit/library/data_preparation/state_preparation.py:176, in StatePreparation._define_synthesis_isom(self)\\r\\n 173 q = QuantumRegister(self.num_qubits, \"q\")\\r\\n 174 initialize_circuit = QuantumCircuit(q, name=\"init_def\")\\r\\n--> 176 isom = Isometry(self._params_arg, 0, 0)\\r\\n 177 initialize_circuit.append(isom, q[:])\\r\\n 179 # invert the circuit to create the desired vector from zero (assuming\\r\\n 180 # the qubits are in the zero state)\\r\\n\\r\\nFile ~/anaconda3/envs/building-agi/lib/python3.12/site-packages/qiskit/circuit/library/generalized_gates/isometry.py:112, in Isometry.__init__(self, isometry, num_ancillas_zero, num_ancillas_dirty, epsilon)\\r\\n 108 raise QiskitError(\\r\\n 109 \"The input matrix has more columns than rows and hence it can't be an isometry.\"\\r\\n 110 )\\r\\n 111 if not is_isometry(isometry, self._epsilon):\\r\\n--> 112 raise QiskitError(\\r\\n 113 \"The input matrix has non orthonormal columns and hence it is not an isometry.\"\\r\\n 114 )\\r\\n 116 num_qubits = int(n) + num_ancillas_zero + num_ancillas_dirty\\r\\n 118 super().__init__(\"isometry\", num_qubits, 0, [isometry])\\r\\n\\r\\nQiskitError: 'The input matrix has non orthonormal columns and hence it is not an isometry.'\\r\\n```\\r\\n\\r\\n\\r\\nAs far as I remember, similar code used to work on previous versions of Qiskit.\\n\\n### How can we reproduce the issue?\\n\\nHere is a minimal code snippet to reproduce the error:\\r\\n\\r\\n```python\\r\\nfrom qiskit import QuantumCircuit, __version__ as qversion\\r\\nfrom qiskit.circuit.library import StatePreparation\\r\\nfrom qiskit_aer import AerSimulator, __version__ as qaversion\\r\\nfrom qiskit.transpiler.preset_passmanagers import generate_preset_pass_manager\\r\\n\\r\\nprint(qversion, '/', qaversion) # 1.2.0 / 0.14.2\\r\\n\\r\\npm = generate_preset_pass_manager(backend=AerSimulator(), optimization_level=3)\\r\\n\\r\\nqc = QuantumCircuit(1)\\r\\nqc.compose(StatePreparation([1, 1], normalize=True), range(1), inplace=True)\\r\\n\\r\\npm.run(qc)\\r\\n```\\n\\n### What should happen?\\n\\nThe transpilation of the `StatePreparation` gate :) \\n\\n### Any suggestions?\\n\\n_No response_"}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/qiskit_m_qiskit:pr-12988", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/qiskit/circuit/library/data_preparation/state_preparation.py b/qiskit/circuit/library/data_preparation/state_preparation.py\\nindex 26c37334cfe4..df69f9eab8c5 100644\\n--- a/qiskit/circuit/library/data_preparation/state_preparation.py\\n+++ b/qiskit/circuit/library/data_preparation/state_preparation.py\\n@@ -173,7 +173,7 @@ def _define_synthesis_isom(self):\\n q = QuantumRegister(self.num_qubits, \"q\")\\n initialize_circuit = QuantumCircuit(q, name=\"init_def\")\\n \\n- isom = Isometry(self._params_arg, 0, 0)\\n+ isom = Isometry(self.params, 0, 0)\\n initialize_circuit.append(isom, q[:])\\n \\n # invert the circuit to create the desired vector from zero (assuming\\ndiff --git a/releasenotes/notes/fix-stateprep-normalize-a8057c339ba619bd.yaml b/releasenotes/notes/fix-stateprep-normalize-a8057c339ba619bd.yaml\\nnew file mode 100644\\nindex 000000000000..0175f8c1c026\\n--- /dev/null\\n+++ b/releasenotes/notes/fix-stateprep-normalize-a8057c339ba619bd.yaml\\n@@ -0,0 +1,6 @@\\n+---\\n+fixes:\\n+ - |\\n+ Fixed a bug in :class:`.StatePreparation` where the ``normalize`` \\n+ argument was ignored for input arrays.\\n+ Fixed `#12984 <https://github.com/Qiskit/qiskit/issues/12984>`__.\\n"}, "test": {"test_patch": "diff --git a/test/python/circuit/library/test_state_preparation.py b/test/python/circuit/library/test_state_preparation.py\\nindex adad848a2777..b5446ed37e9c 100644\\n--- a/test/python/circuit/library/test_state_preparation.py\\n+++ b/test/python/circuit/library/test_state_preparation.py\\n@@ -113,6 +113,16 @@ def test_repeats(self):\\n qc.append(StatePreparation(\"01\").repeat(2), [0, 1])\\n self.assertEqual(qc.decompose().count_ops()[\"state_preparation\"], 2)\\n \\n+ def test_normalize(self):\\n+ \"\"\"Test the normalization.\\n+\\n+ Regression test of #12984.\\n+ \"\"\"\\n+ qc = QuantumCircuit(1)\\n+ qc.compose(StatePreparation([1, 1], normalize=True), range(1), inplace=True)\\n+\\n+ self.assertTrue(Statevector(qc).equiv(np.array([1, 1]) / np.sqrt(2)))\\n+\\n \\n if __name__ == \"__main__\":\\n unittest.main()\\n", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}175{"question_id": "MSB_Qiskit_qiskit_pr13121", "question_type": "multi_swe_bench", "description": "Fix the matrix representation of `CUGate` in Rust (Qiskit/qiskit#13121)", "content": {"org": "Qiskit", "repo": "qiskit", "pr_number": 13121, "issue_title": "Fix the matrix representation of `CUGate` in Rust", "issue_body": "<!--\\r\\n\u26a0\ufe0f If you do not respect this template, your pull request will be closed.\\r\\n\u26a0\ufe0f Your pull request title should be short detailed and understandable for all.\\r\\n\u26a0\ufe0f Also, please add a release note file using reno if the change needs to be\\r\\n documented in the release notes.\\r\\n\u26a0\ufe0f If your pull request fixes an open issue, please link to the issue.\\r\\n\\r\\n- [ ] I have added the tests to cover my changes.\\r\\n- [ ] I have updated the documentation accordingly.\\r\\n- [ ] I have read the CONTRIBUTING document.\\r\\n-->\\r\\n\\r\\n### Summary\\r\\n\\r\\nFixed #13118.\\r\\n\\r\\n### Details and comments\\r\\n\\r\\nThe matrix representation of `CUGate` in Rust accidentally swapped two arguments (`phi` and `lam`). This didn't fail the tests, because there all parameters are set to the same value. The tests are therefore also updated to vary the parameters values within a gate.\\r\\n", "base_commit": "2ef371ae0d159a6dfd643805f3e5e5fdec37ab88", "resolved_issues": [{"number": 13118, "title": "Transpiler changes circuit semantics", "body": "### Environment\\n\\n- **Qiskit version**: 1.3.0\\r\\n- **Python version**: 3.10.12\\r\\n- **Operating system**: Ubuntu 22.04 LTS on Windows 11 WSL\\r\\n\\n\\n### What is happening?\\n\\n[Ilan](https://github.com/IlanIwumbwe) and I have found a possible miscompilation caused by the transpiler.\\r\\n\\r\\nThe resulting state-vector of the circuit after putting it through `transpile()` changes abruptly after optimization level has been set to above 2, thereby also changing the states of the circuit upon measurement.\\n\\n### How can we reproduce the issue?\\n\\n```py\\r\\nfrom qiskit import QuantumCircuit\\r\\nfrom qiskit.transpiler import generate_preset_pass_manager\\r\\nfrom qiskit.quantum_info import Statevector\\r\\nfrom numpy import vdot\\r\\n\\r\\ndef simulate_circuit(qc : QuantumCircuit):\\r\\n state = Statevector.from_int(0, 2**qc.num_qubits)\\r\\n state = state.evolve(qc)\\r\\n return state\\r\\n\\r\\ndef compare_statevectors(qc : QuantumCircuit):\\r\\n # Need to set the seed for consistent transpiler pass results across optimisation levels\\r\\n options = {'seed_transpiler': 1235}\\r\\n sv0 = simulate_circuit(qc)\\r\\n # Code for checking different levels of optimization levels and if they are the same\\r\\n for i in range(4):\\r\\n pass_manager = generate_preset_pass_manager(optimization_level=i, **options)\\r\\n transpiled_circuit = pass_manager.run(qc)\\r\\n sv = simulate_circuit(transpiled_circuit)\\r\\n # Uncomment to see statevector\\r\\n # print(sv) \\r\\n if(sv0 == sv):\\r\\n print(\"Level \", i, \" passed\")\\r\\n else:\\r\\n print(\"Failed level \", i, \". Dot product is: \" , abs(vdot(sv0, sv)), \"\\\\n\")\\r\\n\\r\\nsubcirc2 = QuantumCircuit(2)\\r\\nsubcirc2.z(0)\\r\\nsubcirc2.h(0)\\r\\nsubcirc2.z(0)\\r\\nsubcirc2.s(1)\\r\\nsubcirc2 = subcirc2.to_gate().control(1)\\r\\n\\r\\nmain_circ = QuantumCircuit(4)\\r\\nmain_circ.h(0)\\r\\nmain_circ.append(subcirc2,[0, 2, 3])\\r\\nmain_circ.append(subcirc2,[0, 2, 3])\\r\\nmain_circ.append(subcirc2,[0, 2, 3])\\r\\nmain_circ.h(2)\\r\\n\\r\\ncompare_statevectors(main_circ)\\r\\n```\\r\\n\\r\\nRunning the above code will reveal that the state-vectors are different when the optimization level is above 2. The results will also be the same if the circuit was instead run on `AerBackend`, with optimization levels 2 and 3 producing very different measured states than levels 0 and 1.\\r\\n\\r\\n\\r\\nThis is done on the latest version of qiskit (1.3.0), which we have compiled from source to get the latest fixes. However, it seems like this issue is also present in version 1.2.0. \\n\\n### What should happen?\\n\\nThe circuit should not have a different state-vector after putting it through the transpiler.\\n\\n### Any suggestions?\\n\\n_No response_"}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/qiskit_m_qiskit:pr-13121", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/crates/circuit/src/gate_matrix.rs b/crates/circuit/src/gate_matrix.rs\\nindex a38783ef7e7f..6b04b8512fb0 100644\\n--- a/crates/circuit/src/gate_matrix.rs\\n+++ b/crates/circuit/src/gate_matrix.rs\\n@@ -387,12 +387,12 @@ pub fn cu_gate(theta: f64, phi: f64, lam: f64, gamma: f64) -> GateArray2Q {\\n C_ZERO,\\n c64(0., gamma).exp() * cos_theta,\\n C_ZERO,\\n- c64(0., gamma + phi).exp() * (-1.) * sin_theta,\\n+ c64(0., gamma + lam).exp() * (-1.) * sin_theta,\\n ],\\n [C_ZERO, C_ZERO, C_ONE, C_ZERO],\\n [\\n C_ZERO,\\n- c64(0., gamma + lam).exp() * sin_theta,\\n+ c64(0., gamma + phi).exp() * sin_theta,\\n C_ZERO,\\n c64(0., gamma + phi + lam).exp() * cos_theta,\\n ],\\ndiff --git a/releasenotes/notes/fix-cu-rust-6464b6893ecca1b3.yaml b/releasenotes/notes/fix-cu-rust-6464b6893ecca1b3.yaml\\nnew file mode 100644\\nindex 000000000000..406d6052a1df\\n--- /dev/null\\n+++ b/releasenotes/notes/fix-cu-rust-6464b6893ecca1b3.yaml\\n@@ -0,0 +1,9 @@\\n+---\\n+fixes:\\n+ - |\\n+ Fixed the definition of the :class:`.CUGate` matrix in Rust-space. \\n+ While this was not noticable while handling the :class:`.CUGate` purely on \\n+ Python side, this had knock-on effects when transpiler passes were using the \\n+ Rust representation, such as could happen in :class:`.Consolidate2qBlocks`.\\n+ Fixed `#13118 <https://github.com/Qiskit/qiskit/issues/13118>`__.\\n+\\n"}, "test": {"test_patch": "diff --git a/test/python/circuit/test_rust_equivalence.py b/test/python/circuit/test_rust_equivalence.py\\nindex b6ec28f82e8d..db4f1441bea3 100644\\n--- a/test/python/circuit/test_rust_equivalence.py\\n+++ b/test/python/circuit/test_rust_equivalence.py\\n@@ -66,7 +66,7 @@ def test_definitions(self):\\n continue\\n \\n with self.subTest(name=name):\\n- params = [pi] * standard_gate._num_params()\\n+ params = [0.1 * (i + 1) for i in range(standard_gate._num_params())]\\n py_def = gate_class.base_class(*params).definition\\n rs_def = standard_gate._get_definition(params)\\n if py_def is None:\\n@@ -141,7 +141,7 @@ def test_matrix(self):\\n continue\\n \\n with self.subTest(name=name):\\n- params = [0.1] * standard_gate._num_params()\\n+ params = [0.1 * (i + 1) for i in range(standard_gate._num_params())]\\n py_def = gate_class.base_class(*params).to_matrix()\\n rs_def = standard_gate._to_matrix(params)\\n np.testing.assert_allclose(rs_def, py_def)\\n", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}176{"question_id": "MSB_Qiskit_qiskit_pr13319", "question_type": "multi_swe_bench", "description": "Add argument `assume_unitary` to ``Operator.power``. (Qiskit/qiskit#13319)", "content": {"org": "Qiskit", "repo": "qiskit", "pr_number": 13319, "issue_title": "Add argument `assume_unitary` to ``Operator.power``.", "issue_body": "<!--\\r\\n\u26a0\ufe0f If you do not respect this template, your pull request will be closed.\\r\\n\u26a0\ufe0f Your pull request title should be short detailed and understandable for all.\\r\\n\u26a0\ufe0f Also, please add a release note file using reno if the change needs to be\\r\\n documented in the release notes.\\r\\n\u26a0\ufe0f If your pull request fixes an open issue, please link to the issue.\\r\\n\\r\\n- [x] I have added the tests to cover my changes.\\r\\n- [x] I have updated the documentation accordingly.\\r\\n- [x] I have read the CONTRIBUTING document.\\r\\n-->\\r\\n\\r\\n### Summary\\r\\n\\r\\nFixes #13307 following @jakelishman's suggestion in the description.\\r\\n\\r\\n### Details and comments\\r\\n\\r\\nAfter a quick round of profiling on my laptop (Python 10, Windows 11), the old (Schur-based) way to raise an operator to a power is 3x-5x faster than calling `scipy.linalg.fractional_matrix_power`, so it makes sense to use it when the operator is known to be unitary.\\r\\n\\r\\nI have renamed the old method to be called `Operator.power_if_unitary`, this **assumes** that the given operator is unitary. The `Operator.is_power` does not make this assumption (and calls `fractional_matrix_power`). The gate class uses the `power_if_unitary` method. \\r\\n\\r\\nP.S. In addition, for the `power` method and an integer power, I don't see much runtime difference when calling `fractional_matrix_power` and `matrix_power`. For the `power_if_unitary` method calling `matrix_power` is faster than calling the Schur-based implementation.", "base_commit": "a24470fc0bf233c84c42c49def68a506aa653628", "resolved_issues": [{"number": 13307, "title": "`Operator.power` does not handle non-unitary inputs correctly", "body": "### Environment\\n\\n- **Qiskit version**: 1.2.4\\n- **Python version**: 3.10\\n- **Operating system**: macOS\\n\\n\\n### What is happening?\\n\\nThe way `Operator.power` works, it's strongly assuming that the internal matrix is unitary, because it's assuming that it can calculate fractional matrix powers by taking the Schur decomposition taking the matrix power of the Schur form then applying the unitary transformation (ok so far), except it assumes that the matrix power of the Schur form is the power of its diagonal. The Schur form is upper-triangular, but not necessarily diagonal (roughly, I think it's diagonal in the case that the input is a scaled unitary). So our `Operator.power` code fails for non-unitary operators.\\n\\n### How can we reproduce the issue?\\n\\n```python\\n>>> from qiskit.quantum_info import Operator\\n>>> import scipy.linalg\\n>>> # Not unitary.\\n>>> data = [[1, 1], [0, -1]]\\n>>> print(Operator(data).power(0.5).data)\\n[[1.000000e+00+0.j 0.000000e+00+0.j]\\n [0.000000e+00+0.j 6.123234e-17+1.j]]\\n>>> print(scipy.linalg.fractional_matrix_power(data, 0.5)))\\n[[1.00000000e+00+0.j 5.00000000e-01-0.5j]\\n [0.00000000e+00+0.j 4.93096709e-17+1.j ]]\\n```\\n\\n### What should happen?\\n\\nThe two should give (approximately) equal results (though see #13305 for branch-cut problems).\\n\\n### Any suggestions?\\n\\nThe ability to do fractional matrix powers of `Operator` is relatively recent (#11534), and it seems to have pulled the code from `Gate.power`, which _was_ empowered to make that assumption.\\n\\nWe probably should just use `scipy.linalg.fractional_matrix_power` for `Operator.power`, and specialise `Gate.power` to use a more explicit eigenvector/eigenvalue form, since it's allowed to assume that its input was unitary."}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/qiskit_m_qiskit:pr-13319", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/qiskit/circuit/gate.py b/qiskit/circuit/gate.py\\nindex 2f1c09668252..122db0973124 100644\\n--- a/qiskit/circuit/gate.py\\n+++ b/qiskit/circuit/gate.py\\n@@ -89,7 +89,9 @@ def power(self, exponent: float, annotated: bool = False):\\n from qiskit.circuit.library.generalized_gates.unitary import UnitaryGate\\n \\n if not annotated:\\n- return UnitaryGate(Operator(self).power(exponent), label=f\"{self.name}^{exponent}\")\\n+ return UnitaryGate(\\n+ Operator(self).power(exponent, assume_unitary=True), label=f\"{self.name}^{exponent}\"\\n+ )\\n else:\\n return AnnotatedOperation(self, PowerModifier(exponent))\\n \\ndiff --git a/qiskit/quantum_info/operators/operator.py b/qiskit/quantum_info/operators/operator.py\\nindex 3b6ec8abff89..d549a130ae3a 100644\\n--- a/qiskit/quantum_info/operators/operator.py\\n+++ b/qiskit/quantum_info/operators/operator.py\\n@@ -541,7 +541,9 @@ def compose(self, other: Operator, qargs: list | None = None, front: bool = Fals\\n ret._op_shape = new_shape\\n return ret\\n \\n- def power(self, n: float, branch_cut_rotation=cmath.pi * 1e-12) -> Operator:\\n+ def power(\\n+ self, n: float, branch_cut_rotation=cmath.pi * 1e-12, assume_unitary=False\\n+ ) -> Operator:\\n \"\"\"Return the matrix power of the operator.\\n \\n Non-integer powers of operators with an eigenvalue whose complex phase is :math:`\\\\\\\\pi` have\\n@@ -572,6 +574,8 @@ def power(self, n: float, branch_cut_rotation=cmath.pi * 1e-12) -> Operator:\\n complex plane. This shifts the branch cut away from the common point of :math:`-1`,\\n but can cause a different root to be selected as the principal root. The rotation\\n is anticlockwise, following the standard convention for complex phase.\\n+ assume_unitary (bool): if ``True``, the operator is assumed to be unitary. In this case,\\n+ for fractional powers we employ a faster implementation based on Schur's decomposition.\\n \\n Returns:\\n Operator: the resulting operator ``O ** n``.\\n@@ -579,6 +583,11 @@ def power(self, n: float, branch_cut_rotation=cmath.pi * 1e-12) -> Operator:\\n Raises:\\n QiskitError: if the input and output dimensions of the operator\\n are not equal.\\n+\\n+ .. note::\\n+ It is only safe to set the argument ``assume_unitary`` to ``True`` when the operator\\n+ is unitary (or, more generally, normal). Otherwise, the function will return an\\n+ incorrect output.\\n \"\"\"\\n if self.input_dims() != self.output_dims():\\n raise QiskitError(\"Can only power with input_dims = output_dims.\")\\n@@ -588,11 +597,23 @@ def power(self, n: float, branch_cut_rotation=cmath.pi * 1e-12) -> Operator:\\n else:\\n import scipy.linalg\\n \\n- ret._data = cmath.rect(\\n- 1, branch_cut_rotation * n\\n- ) * scipy.linalg.fractional_matrix_power(\\n- cmath.rect(1, -branch_cut_rotation) * self.data, n\\n- )\\n+ if assume_unitary:\\n+ # Experimentally, for fractional powers this seems to be 3x faster than\\n+ # calling scipy.linalg.fractional_matrix_power(self.data, exponent)\\n+ decomposition, unitary = scipy.linalg.schur(\\n+ cmath.rect(1, -branch_cut_rotation) * self.data, output=\"complex\"\\n+ )\\n+ decomposition_diagonal = decomposition.diagonal()\\n+ decomposition_power = [pow(element, n) for element in decomposition_diagonal]\\n+ unitary_power = unitary @ np.diag(decomposition_power) @ unitary.conj().T\\n+ ret._data = cmath.rect(1, branch_cut_rotation * n) * unitary_power\\n+ else:\\n+ ret._data = cmath.rect(\\n+ 1, branch_cut_rotation * n\\n+ ) * scipy.linalg.fractional_matrix_power(\\n+ cmath.rect(1, -branch_cut_rotation) * self.data, n\\n+ )\\n+\\n return ret\\n \\n def tensor(self, other: Operator) -> Operator:\\ndiff --git a/releasenotes/notes/operator-power-assume-unitary-0a2f97ea9de91b49.yaml b/releasenotes/notes/operator-power-assume-unitary-0a2f97ea9de91b49.yaml\\nnew file mode 100644\\nindex 000000000000..780781c212a7\\n--- /dev/null\\n+++ b/releasenotes/notes/operator-power-assume-unitary-0a2f97ea9de91b49.yaml\\n@@ -0,0 +1,6 @@\\n+---\\n+features_quantum_info:\\n+ - |\\n+ Added a new argument ``assume_unitary`` to :meth:`qiskit.quantum_info.Operator.power`.\\n+ When ``True``, we use a faster method based on Schur's decomposition to raise an\\n+ ``Operator`` to a fractional power.\\n"}, "test": {"test_patch": "diff --git a/test/python/quantum_info/operators/test_operator.py b/test/python/quantum_info/operators/test_operator.py\\nindex d9423d0ec141..7bb0db110ac1 100644\\n--- a/test/python/quantum_info/operators/test_operator.py\\n+++ b/test/python/quantum_info/operators/test_operator.py\\n@@ -522,8 +522,16 @@ def test_power_of_nonunitary(self):\\n expected = Operator([[1.0 + 0.0j, 0.5 - 0.5j], [0.0 + 0.0j, 0.0 + 1.0j]])\\n assert_allclose(powered.data, expected.data)\\n \\n- @ddt.data(0.5, 1.0 / 3.0, 0.25)\\n- def test_root_stability(self, root):\\n+ @ddt.data(\\n+ (0.5, False),\\n+ (1.0 / 3.0, False),\\n+ (0.25, False),\\n+ (0.5, True),\\n+ (1.0 / 3.0, True),\\n+ (0.25, True),\\n+ )\\n+ @ddt.unpack\\n+ def test_root_stability(self, root, assume_unitary):\\n \"\"\"Test that the root of operators that have eigenvalues that are -1 up to floating-point\\n imprecision stably choose the positive side of the principal-root branch cut.\"\"\"\\n rng = np.random.default_rng(2024_10_22)\\n@@ -540,17 +548,24 @@ def test_root_stability(self, root):\\n matrices = [basis.conj().T @ np.diag(eigenvalues) @ basis for basis in bases]\\n expected = [basis.conj().T @ np.diag(root_eigenvalues) @ basis for basis in bases]\\n self.assertEqual(\\n- [Operator(matrix).power(root) for matrix in matrices],\\n+ [Operator(matrix).power(root, assume_unitary=assume_unitary) for matrix in matrices],\\n [Operator(single) for single in expected],\\n )\\n \\n- def test_root_branch_cut(self):\\n+ @ddt.data(True, False)\\n+ def test_root_branch_cut(self, assume_unitary):\\n \"\"\"Test that we can choose where the branch cut appears in the root.\"\"\"\\n z_op = Operator(library.ZGate())\\n # Depending on the direction we move the branch cut, we should be able to select the root to\\n # be either of the two valid options.\\n- self.assertEqual(z_op.power(0.5, branch_cut_rotation=1e-3), Operator(library.SGate()))\\n- self.assertEqual(z_op.power(0.5, branch_cut_rotation=-1e-3), Operator(library.SdgGate()))\\n+ self.assertEqual(\\n+ z_op.power(0.5, branch_cut_rotation=1e-3, assume_unitary=assume_unitary),\\n+ Operator(library.SGate()),\\n+ )\\n+ self.assertEqual(\\n+ z_op.power(0.5, branch_cut_rotation=-1e-3, assume_unitary=assume_unitary),\\n+ Operator(library.SdgGate()),\\n+ )\\n \\n def test_expand(self):\\n \"\"\"Test expand method.\"\"\"\\n", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}177{"question_id": "MSB_Qiskit_qiskit_pr13345", "question_type": "multi_swe_bench", "description": "Fix the calculation for identity operator's expectation value (Qiskit/qiskit#13345)", "content": {"org": "Qiskit", "repo": "qiskit", "pr_number": 13345, "issue_title": "Fix the calculation for identity operator's expectation value", "issue_body": "<!--\\r\\n\u26a0\ufe0f If you do not respect this template, your pull request will be closed.\\r\\n\u26a0\ufe0f Your pull request title should be short detailed and understandable for all.\\r\\n\u26a0\ufe0f Also, please add a release note file using reno if the change needs to be\\r\\n documented in the release notes.\\r\\n\u26a0\ufe0f If your pull request fixes an open issue, please link to the issue.\\r\\n\\r\\n- [ ] I have added the tests to cover my changes.\\r\\n- [ ] I have updated the documentation accordingly.\\r\\n- [ x] I have read the CONTRIBUTING document.\\r\\n-->\\r\\n\\r\\n### Summary\\r\\n\\r\\nFix a bug in `qiskit.quantum_info` in the calculation of expectation value of the identity operator.\\r\\n\\r\\nFixes #13029 \\r\\n\\r\\n\\r\\n\\r\\n### Details and comments\\r\\nCurrently, `qiskit.quantum_info` yields incorrect results for the expectation value of an identity operator for a given state vector. It returns the norm of the state vector; however, it ought to return the square of the norm.\\r\\n\\r\\nTherefore, I am changing the following line \\r\\n\\r\\nhttps://github.com/Qiskit/qiskit/blob/1be2c5aa103f1991f2fdc75a77a09f82635b8431/qiskit/quantum_info/states/statevector.py#L478-L479\\r\\n\\r\\nto \\r\\n```Python\\r\\n if x_mask + z_mask == 0: \\r\\n return pauli_phase * np.linalg.norm(self.data) ** 2\\r\\n```\\r\\n", "base_commit": "a9b8f4acda8dabf4e4acd8c97409f5d2344f92ea", "resolved_issues": [{"number": 13029, "title": "Statevector._expectation_value_pauli returns incorrect result in certain cases", "body": "The calculation for the expectation value of the __identity operator__ seems incorrect when the statevector is __not normalized__ to 1.\\r\\n\\r\\nI think the reason is that one should use the norm squared rather than the norm in the following lines.\\r\\nhttps://github.com/Qiskit/qiskit/blob/1be2c5aa103f1991f2fdc75a77a09f82635b8431/qiskit/quantum_info/states/statevector.py#L478-L479\\r\\n\\r\\n---\\r\\n\\r\\nThe whole function is attached below to provide context.\\r\\n\\r\\nhttps://github.com/Qiskit/qiskit/blob/1be2c5aa103f1991f2fdc75a77a09f82635b8431/qiskit/quantum_info/states/statevector.py#L458-L491"}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/qiskit_m_qiskit:pr-13345", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/qiskit/quantum_info/states/statevector.py b/qiskit/quantum_info/states/statevector.py\\nindex 901ce95af424..1265d677abe4 100644\\n--- a/qiskit/quantum_info/states/statevector.py\\n+++ b/qiskit/quantum_info/states/statevector.py\\n@@ -476,7 +476,7 @@ def _expectation_value_pauli(self, pauli, qargs=None):\\n pauli_phase = (-1j) ** pauli.phase if pauli.phase else 1\\n \\n if x_mask + z_mask == 0:\\n- return pauli_phase * np.linalg.norm(self.data)\\n+ return pauli_phase * np.linalg.norm(self.data) ** 2\\n \\n if x_mask == 0:\\n return pauli_phase * expval_pauli_no_x(self.data, self.num_qubits, z_mask)\\n"}, "test": {"test_patch": "diff --git a/releasenotes/notes/fix_identity_operator_9e2ec9770ac046a6.yaml b/releasenotes/notes/fix_identity_operator_9e2ec9770ac046a6.yaml\\nnew file mode 100644\\nindex 000000000000..69779a793cc3\\n--- /dev/null\\n+++ b/releasenotes/notes/fix_identity_operator_9e2ec9770ac046a6.yaml\\n@@ -0,0 +1,5 @@\\n+---\\n+fixes:\\n+ - |\\n+ Fixed a bug that caused :meth:`.Statevector.expectation_value` to yield incorrect results\\n+ for the identity operator when the statevector was not normalized.\\ndiff --git a/test/python/quantum_info/states/test_statevector.py b/test/python/quantum_info/states/test_statevector.py\\nindex 29d5d42f3783..d16b3b3453ec 100644\\n--- a/test/python/quantum_info/states/test_statevector.py\\n+++ b/test/python/quantum_info/states/test_statevector.py\\n@@ -1152,6 +1152,31 @@ def test_expval_pauli_qargs(self, qubits):\\n expval = state.expectation_value(op, qubits)\\n self.assertAlmostEqual(expval, target)\\n \\n+ def test_expval_identity(self):\\n+ \"\"\"Test whether the calculation for identity operator has been fixed\"\"\"\\n+\\n+ # 1 qubit case test\\n+ state_1 = Statevector.from_label(\"0\")\\n+ state_1_n1 = 2 * state_1 # test the same state with different norms\\n+ state_1_n2 = (1 + 2j) * state_1\\n+ identity_op_1 = SparsePauliOp.from_list([(\"I\", 1)])\\n+ expval_state_1 = state_1.expectation_value(identity_op_1)\\n+ expval_state_1_n1 = state_1_n1.expectation_value(identity_op_1)\\n+ expval_state_1_n2 = state_1_n2.expectation_value(identity_op_1)\\n+ self.assertAlmostEqual(expval_state_1, 1.0 + 0j)\\n+ self.assertAlmostEqual(expval_state_1_n1, 4 + 0j)\\n+ self.assertAlmostEqual(expval_state_1_n2, 5 + 0j)\\n+\\n+ # Let's try a multi-qubit case\\n+ n_qubits = 3\\n+ state_coeff = 3 - 4j\\n+ op_coeff = 2 - 2j\\n+ state_test = state_coeff * Statevector.from_label(\"0\" * n_qubits)\\n+ op_test = SparsePauliOp.from_list([(\"I\" * n_qubits, op_coeff)])\\n+ expval = state_test.expectation_value(op_test)\\n+ target = op_coeff * np.abs(state_coeff) ** 2\\n+ self.assertAlmostEqual(expval, target)\\n+\\n @data(*(qargs for i in range(4) for qargs in permutations(range(4), r=i + 1)))\\n def test_probabilities_qargs(self, qargs):\\n \"\"\"Test probabilities method with qargs\"\"\"\\n", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}178{"question_id": "MSB_Qiskit_qiskit_pr13436", "question_type": "multi_swe_bench", "description": "Fix the calculation for identity operator's expectation value (backport #13345) (Qiskit/qiskit#13436)", "content": {"org": "Qiskit", "repo": "qiskit", "pr_number": 13436, "issue_title": "Fix the calculation for identity operator's expectation value (backport #13345)", "issue_body": "\\n\\n### Summary\\n\\nFix a bug in `qiskit.quantum_info` in the calculation of expectation value of the identity operator.\\n\\nFixes #13029 \\n\\n\\n\\n### Details and comments\\nCurrently, `qiskit.quantum_info` yields incorrect results for the expectation value of an identity operator for a given state vector. It returns the norm of the state vector; however, it ought to return the square of the norm.\\n\\nTherefore, I am changing the following line \\n\\nhttps://github.com/Qiskit/qiskit/blob/1be2c5aa103f1991f2fdc75a77a09f82635b8431/qiskit/quantum_info/states/statevector.py#L478-L479\\n\\nto \\n```Python\\n if x_mask + z_mask == 0: \\n return pauli_phase * np.linalg.norm(self.data) ** 2\\n```\\n<hr>This is an automatic backport of pull request #13345 done by [Mergify](https://mergify.com).", "base_commit": "2bf578eb00808744f80f30324148e946a6214a1d", "resolved_issues": [{"number": 13029, "title": "Statevector._expectation_value_pauli returns incorrect result in certain cases", "body": "The calculation for the expectation value of the __identity operator__ seems incorrect when the statevector is __not normalized__ to 1.\\r\\n\\r\\nI think the reason is that one should use the norm squared rather than the norm in the following lines.\\r\\nhttps://github.com/Qiskit/qiskit/blob/1be2c5aa103f1991f2fdc75a77a09f82635b8431/qiskit/quantum_info/states/statevector.py#L478-L479\\r\\n\\r\\n---\\r\\n\\r\\nThe whole function is attached below to provide context.\\r\\n\\r\\nhttps://github.com/Qiskit/qiskit/blob/1be2c5aa103f1991f2fdc75a77a09f82635b8431/qiskit/quantum_info/states/statevector.py#L458-L491"}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/qiskit_m_qiskit:pr-13436", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/qiskit/quantum_info/states/statevector.py b/qiskit/quantum_info/states/statevector.py\\nindex 901ce95af424..1265d677abe4 100644\\n--- a/qiskit/quantum_info/states/statevector.py\\n+++ b/qiskit/quantum_info/states/statevector.py\\n@@ -476,7 +476,7 @@ def _expectation_value_pauli(self, pauli, qargs=None):\\n pauli_phase = (-1j) ** pauli.phase if pauli.phase else 1\\n \\n if x_mask + z_mask == 0:\\n- return pauli_phase * np.linalg.norm(self.data)\\n+ return pauli_phase * np.linalg.norm(self.data) ** 2\\n \\n if x_mask == 0:\\n return pauli_phase * expval_pauli_no_x(self.data, self.num_qubits, z_mask)\\n"}, "test": {"test_patch": "diff --git a/releasenotes/notes/fix_identity_operator_9e2ec9770ac046a6.yaml b/releasenotes/notes/fix_identity_operator_9e2ec9770ac046a6.yaml\\nnew file mode 100644\\nindex 000000000000..69779a793cc3\\n--- /dev/null\\n+++ b/releasenotes/notes/fix_identity_operator_9e2ec9770ac046a6.yaml\\n@@ -0,0 +1,5 @@\\n+---\\n+fixes:\\n+ - |\\n+ Fixed a bug that caused :meth:`.Statevector.expectation_value` to yield incorrect results\\n+ for the identity operator when the statevector was not normalized.\\ndiff --git a/test/python/quantum_info/states/test_statevector.py b/test/python/quantum_info/states/test_statevector.py\\nindex 29d5d42f3783..d16b3b3453ec 100644\\n--- a/test/python/quantum_info/states/test_statevector.py\\n+++ b/test/python/quantum_info/states/test_statevector.py\\n@@ -1152,6 +1152,31 @@ def test_expval_pauli_qargs(self, qubits):\\n expval = state.expectation_value(op, qubits)\\n self.assertAlmostEqual(expval, target)\\n \\n+ def test_expval_identity(self):\\n+ \"\"\"Test whether the calculation for identity operator has been fixed\"\"\"\\n+\\n+ # 1 qubit case test\\n+ state_1 = Statevector.from_label(\"0\")\\n+ state_1_n1 = 2 * state_1 # test the same state with different norms\\n+ state_1_n2 = (1 + 2j) * state_1\\n+ identity_op_1 = SparsePauliOp.from_list([(\"I\", 1)])\\n+ expval_state_1 = state_1.expectation_value(identity_op_1)\\n+ expval_state_1_n1 = state_1_n1.expectation_value(identity_op_1)\\n+ expval_state_1_n2 = state_1_n2.expectation_value(identity_op_1)\\n+ self.assertAlmostEqual(expval_state_1, 1.0 + 0j)\\n+ self.assertAlmostEqual(expval_state_1_n1, 4 + 0j)\\n+ self.assertAlmostEqual(expval_state_1_n2, 5 + 0j)\\n+\\n+ # Let's try a multi-qubit case\\n+ n_qubits = 3\\n+ state_coeff = 3 - 4j\\n+ op_coeff = 2 - 2j\\n+ state_test = state_coeff * Statevector.from_label(\"0\" * n_qubits)\\n+ op_test = SparsePauliOp.from_list([(\"I\" * n_qubits, op_coeff)])\\n+ expval = state_test.expectation_value(op_test)\\n+ target = op_coeff * np.abs(state_coeff) ** 2\\n+ self.assertAlmostEqual(expval, target)\\n+\\n @data(*(qargs for i in range(4) for qargs in permutations(range(4), r=i + 1)))\\n def test_probabilities_qargs(self, qargs):\\n \"\"\"Test probabilities method with qargs\"\"\"\\n", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}179{"question_id": "MSB_Qiskit_qiskit_pr13825", "question_type": "multi_swe_bench", "description": "Correctly updating global phase when removing gates that are identity up to a global phase (backport #13785) (Qiskit/qiskit#13825)", "content": {"org": "Qiskit", "repo": "qiskit", "pr_number": 13825, "issue_title": "Correctly updating global phase when removing gates that are identity up to a global phase (backport #13785)", "issue_body": "\\n\\n### Summary\\n\\nThis fixes a bug in the ``RemoveIdentityEquivalent`` transpiler pass (the pass was introduced in #12384), where unitary gates close to identity _up to a global phase_ were removed from the circuit but the global phase of the circuit was not updated. This includes, for instance, single-qubit unitary gates with matrices close to [[ $e^{i\\\\theta}$, 0], [0, $e^{i\\\\theta}$]] for fix floating-point values of $\\\\theta$, standard gates $R_X(2\\\\pi)$, $R_Y(2\\\\pi)$, $R_Z(2\\\\pi)$ (whose matrices are close to $-I$), and some others. Now the pass removes these gates and correctly updates the global phase of the circuit. In particular, the pass now handles non-parameterized ``GlobalPhaseGates`` as well. \\n\\nFixes #13778.\\n\\n### Details and comments:\\n\\nThe pass ignores parameterized gates. We could probably relatively easily extend it to handle parameterized global phase gates.\\n\\nThe thing to notice [in the current documentation of the pass](https://docs.quantum.ibm.com/api/qiskit/qiskit.transpiler.passes.RemoveIdentityEquivalent) is that the current condition for removing a gate is indeed satisfied for gates of the form $e^{i\\\\theta} I$. And in fact the opposite is also true (thanks to @ShellyGarion for helping me work out the math): if the removal condition is satisfied, then a gate is necessarily of the form $e^{i\\\\theta} I$.\\n\\nLol, yet another change after the #13759 was merged is to now also explicitly handle Unitary gates.\\n\\nThanks to @Cryoris and @ShellyGarion for joint debugging of the problem. \\n<hr>This is an automatic backport of pull request #13785 done by [Mergify](https://mergify.com).", "base_commit": "a8ca5c1efafae845240cb9f59862adf9c24d2afe", "resolved_issues": [{"number": 13778, "title": "incorrect statevector simulation using qiskit & qiskit-aer", "body": "### Environment\\n\\n- **Qiskit version**: 1.3.0 (I believe the bug still exists in 1.3.2)\\n- **Python version**: 3.12\\n- **Operating system**: linux\\n\\nmirror ticket from https://github.com/Qiskit/qiskit-aer/issues/2271 for visibility\\n\\n### What is happening?\\n\\nFor a fixed QuantumCircuit with custom unitary gate matrix, QiskitAer is producing different statevector simulation results for qiskit v.1.2.4 and v.1.3.0\\n\\n### How can we reproduce the issue?\\n\\nUsing `qiskit-aer=0.15.1`, run the following script with `qiskit==1.2.4` and `qiskit==1.3.0` will reproduce different statevector results\\n```python\\nimport qiskit\\n\\nfrom qiskit_aer import AerSimulator\\nfrom qiskit.circuit.library import UnitaryGate\\nfrom qiskit.quantum_info import random_unitary\\n\\nimport numpy as np\\n\\ndef get_qiskit_unitary_gate(rng, control=None):\\n rand_unitary = random_unitary(4, seed=rng)\\n gate = UnitaryGate(rand_unitary)\\n print(f\"unitary gate matrix:\")\\n print(gate)\\n if control is None:\\n return gate\\n else:\\n return gate.control(control)\\n \\ndef get_qiskit_multi_control_circuit():\\n qubits = qiskit.QuantumRegister(5)\\n circuit = qiskit.QuantumCircuit(qubits)\\n for q in qubits:\\n circuit.h(q)\\n qs = list(qubits)\\n\\n rng = np.random.default_rng(1234)\\n for i in range(2):\\n rng.shuffle(qs)\\n ccu_gate = get_qiskit_unitary_gate(rng, control=2)\\n print(f\"{i}th gate on {qs}\")\\n circuit.append(ccu_gate, qs[:4])\\n circuit.p(0.1, qubits[0])\\n return circuit\\n\\nprint(f\"{qiskit.__version__=}\")\\n\\ncircuit = get_qiskit_multi_control_circuit()\\nprint(circuit)\\n\\ncircuit.save_statevector()\\n\\n# Transpile for simulator\\nsimulator = AerSimulator(method='statevector')\\ncirc = qiskit.transpile(circuit, simulator)\\n\\n# Run and get statevector\\nresult = simulator.run(circ).result()\\nsv = np.asarray(result.get_statevector(circ))\\nprint(\"Sum of state vector:\", sv.sum())\\n```\\n\\n### What should happen?\\n\\nThe gate matrices defining the custom unitary gates are identical between `qiskit==1.2.4` and `qiskit==1.3.0` and therefore the returned statevector should be the same. On my end I have the following results:\\n\\n`qiskit==1.2.4`\\n```\\nqiskit.__version__='1.2.4'\\nunitary gate matrix:\\nInstruction(name='unitary', num_qubits=2, num_clbits=0, params=[array([[ 0.26093746+0.18318812j, 0.12558674-0.38936694j,\\n 0.56486648-0.53659333j, -0.03587912+0.35025885j],\\n [-0.5208327 +0.41955884j, 0.38293134-0.20373037j,\\n -0.26997299-0.01611016j, 0.47100825+0.26375647j],\\n [-0.18047959-0.0114164j , 0.42182388+0.05310412j,\\n 0.01892911-0.48459796j, -0.10334574-0.73530097j],\\n [-0.44557601+0.46884564j, -0.63238151+0.25262043j,\\n 0.15882664-0.24378088j, -0.17446941-0.05317653j]])])\\n0th gate on [Qubit(QuantumRegister(5, 'q1'), 0), Qubit(QuantumRegister(5, 'q1'), 4), Qubit(QuantumRegister(5, 'q1'), 1), Qubit(QuantumRegister(5, 'q1'), 3), Qubit(QuantumRegister(5, 'q1'), 2)]\\nunitary gate matrix:\\nInstruction(name='unitary', num_qubits=2, num_clbits=0, params=[array([[-0.41490662-0.1027918j , -0.45229939-0.45892536j,\\n 0.1965442 +0.27907236j, 0.53283662+0.04090535j],\\n [-0.54960898-0.38886747j, -0.18060452+0.35532657j,\\n -0.42299907-0.41452735j, 0.00811512+0.19238008j],\\n [-0.48710529+0.16105765j, 0.30802545-0.50934349j,\\n 0.16188328-0.37911161j, -0.36497996-0.28166686j],\\n [ 0.16591044+0.27066769j, 0.26600357-0.02948626j,\\n 0.10303047-0.5934482j , 0.6357136 +0.24628756j]])])\\n1th gate on [Qubit(QuantumRegister(5, 'q1'), 1), Qubit(QuantumRegister(5, 'q1'), 4), Qubit(QuantumRegister(5, 'q1'), 2), Qubit(QuantumRegister(5, 'q1'), 0), Qubit(QuantumRegister(5, 'q1'), 3)] \\nSum of state vector: (3.450103311811794-0.308774856832824j)\\n```\\n\\n`qiskit==1.3.0`\\n```\\nqiskit.__version__='1.3.0'\\nunitary gate matrix:\\nInstruction(name='unitary', num_qubits=2, num_clbits=0, params=[array([[ 0.26093746+0.18318812j, 0.12558674-0.38936694j,\\n 0.56486648-0.53659333j, -0.03587912+0.35025885j],\\n [-0.5208327 +0.41955884j, 0.38293134-0.20373037j,\\n -0.26997299-0.01611016j, 0.47100825+0.26375647j],\\n [-0.18047959-0.0114164j , 0.42182388+0.05310412j,\\n 0.01892911-0.48459796j, -0.10334574-0.73530097j],\\n [-0.44557601+0.46884564j, -0.63238151+0.25262043j,\\n 0.15882664-0.24378088j, -0.17446941-0.05317653j]])])\\n0th gate on [Qubit(QuantumRegister(5, 'q1'), 0), Qubit(QuantumRegister(5, 'q1'), 4), Qubit(QuantumRegister(5, 'q1'), 1), Qubit(QuantumRegister(5, 'q1'), 3), Qubit(QuantumRegister(5, 'q1'), 2)]\\nunitary gate matrix:\\nInstruction(name='unitary', num_qubits=2, num_clbits=0, params=[array([[-0.41490662-0.1027918j , -0.45229939-0.45892536j,\\n 0.1965442 +0.27907236j, 0.53283662+0.04090535j],\\n [-0.54960898-0.38886747j, -0.18060452+0.35532657j,\\n -0.42299907-0.41452735j, 0.00811512+0.19238008j],\\n [-0.48710529+0.16105765j, 0.30802545-0.50934349j,\\n 0.16188328-0.37911161j, -0.36497996-0.28166686j],\\n [ 0.16591044+0.27066769j, 0.26600357-0.02948626j,\\n 0.10303047-0.5934482j , 0.6357136 +0.24628756j]])])\\n1th gate on [Qubit(QuantumRegister(5, 'q1'), 1), Qubit(QuantumRegister(5, 'q1'), 4), Qubit(QuantumRegister(5, 'q1'), 2), Qubit(QuantumRegister(5, 'q1'), 0), Qubit(QuantumRegister(5, 'q1'), 3)] \\nSum of state vector: (2.6579282427026834+2.2212546524499133j)\\n```\\n\\nFrom our experiment, I believe the results from `qiskit=1.2.4` are correct. There might be some parsing issue between `qiskit-aer` and `qiskit==1.3.0`\\n\\n### Any suggestions?\\n\\n_No response_"}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/qiskit_m_qiskit:pr-13825", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/crates/accelerate/src/remove_identity_equiv.rs b/crates/accelerate/src/remove_identity_equiv.rs\\nindex a3eb921628e2..d5d644919c8f 100644\\n--- a/crates/accelerate/src/remove_identity_equiv.rs\\n+++ b/crates/accelerate/src/remove_identity_equiv.rs\\n@@ -9,7 +9,6 @@\\n // Any modifications or derivative works of this code must retain this\\n // copyright notice, and modified files need to carry a notice indicating\\n // that they have been altered from the originals.\\n-\\n use num_complex::Complex64;\\n use num_complex::ComplexFloat;\\n use pyo3::prelude::*;\\n@@ -27,11 +26,13 @@ use qiskit_circuit::packed_instruction::PackedInstruction;\\n #[pyfunction]\\n #[pyo3(signature=(dag, approx_degree=Some(1.0), target=None))]\\n fn remove_identity_equiv(\\n+ py: Python,\\n dag: &mut DAGCircuit,\\n approx_degree: Option<f64>,\\n target: Option<&Target>,\\n ) {\\n let mut remove_list: Vec<NodeIndex> = Vec::new();\\n+ let mut global_phase_update: f64 = 0.;\\n \\n let get_error_cutoff = |inst: &PackedInstruction| -> f64 {\\n match approx_degree {\\n@@ -76,12 +77,17 @@ fn remove_identity_equiv(\\n \\n for op_node in dag.op_nodes(false) {\\n let inst = dag.dag()[op_node].unwrap_operation();\\n- match inst.op.view() {\\n+ if inst.is_parameterized() {\\n+ // Skip parameterized gates\\n+ continue;\\n+ }\\n+ let view = inst.op.view();\\n+ match view {\\n OperationRef::Standard(gate) => {\\n let (dim, trace) = match gate {\\n StandardGate::RXGate | StandardGate::RYGate | StandardGate::RZGate => {\\n if let Param::Float(theta) = inst.params_view()[0] {\\n- let trace = (theta / 2.).cos() * 2.;\\n+ let trace = Complex64::new((theta / 2.).cos() * 2., 0.);\\n (2., trace)\\n } else {\\n continue;\\n@@ -92,20 +98,16 @@ fn remove_identity_equiv(\\n | StandardGate::RZZGate\\n | StandardGate::RZXGate => {\\n if let Param::Float(theta) = inst.params_view()[0] {\\n- let trace = (theta / 2.).cos() * 4.;\\n+ let trace = Complex64::new((theta / 2.).cos() * 4., 0.);\\n (4., trace)\\n } else {\\n continue;\\n }\\n }\\n _ => {\\n- // Skip global phase gate\\n- if gate.num_qubits() < 1 {\\n- continue;\\n- }\\n if let Some(matrix) = gate.matrix(inst.params_view()) {\\n let dim = matrix.shape()[0] as f64;\\n- let trace = matrix.diag().iter().sum::<Complex64>().abs();\\n+ let trace = matrix.diag().iter().sum::<Complex64>();\\n (dim, trace)\\n } else {\\n continue;\\n@@ -113,34 +115,38 @@ fn remove_identity_equiv(\\n }\\n };\\n let error = get_error_cutoff(inst);\\n- let f_pro = (trace / dim).powi(2);\\n+ let f_pro = (trace / dim).abs().powi(2);\\n let gate_fidelity = (dim * f_pro + 1.) / (dim + 1.);\\n if (1. - gate_fidelity).abs() < error {\\n- remove_list.push(op_node)\\n+ remove_list.push(op_node);\\n+ global_phase_update += (trace / dim).arg();\\n }\\n }\\n- OperationRef::Gate(gate) => {\\n- // Skip global phase like gate\\n- if gate.num_qubits() < 1 {\\n- continue;\\n- }\\n- if let Some(matrix) = gate.matrix(inst.params_view()) {\\n+ _ => {\\n+ let matrix = view.matrix(inst.params_view());\\n+ // If view.matrix() returns None, then there is no matrix and we skip the operation.\\n+ if let Some(matrix) = matrix {\\n let error = get_error_cutoff(inst);\\n let dim = matrix.shape()[0] as f64;\\n let trace: Complex64 = matrix.diag().iter().sum();\\n let f_pro = (trace / dim).abs().powi(2);\\n let gate_fidelity = (dim * f_pro + 1.) / (dim + 1.);\\n if (1. - gate_fidelity).abs() < error {\\n- remove_list.push(op_node)\\n+ remove_list.push(op_node);\\n+ global_phase_update += (trace / dim).arg();\\n }\\n }\\n }\\n- _ => continue,\\n }\\n }\\n for node in remove_list {\\n dag.remove_op_node(node);\\n }\\n+\\n+ if global_phase_update != 0. {\\n+ dag.add_global_phase(py, &Param::Float(global_phase_update))\\n+ .expect(\"The global phase is guaranteed to be a float\");\\n+ }\\n }\\n \\n pub fn remove_identity_equiv_mod(m: &Bound<PyModule>) -> PyResult<()> {\\ndiff --git a/qiskit/transpiler/passes/optimization/remove_identity_equiv.py b/qiskit/transpiler/passes/optimization/remove_identity_equiv.py\\nindex fbf132d958a2..17445eb5ad2a 100644\\n--- a/qiskit/transpiler/passes/optimization/remove_identity_equiv.py\\n+++ b/qiskit/transpiler/passes/optimization/remove_identity_equiv.py\\n@@ -23,9 +23,8 @@\\n class RemoveIdentityEquivalent(TransformationPass):\\n r\"\"\"Remove gates with negligible effects.\\n \\n- Removes gates whose effect is close to an identity operation, up to the specified\\n- tolerance. Zero qubit gates such as :class:`.GlobalPhaseGate` are not considered\\n- by this pass.\\n+ Removes gates whose effect is close to an identity operation up to a global phase\\n+ and up to the specified tolerance. Parameterized gates are not considered by this pass.\\n \\n For a cutoff fidelity :math:`f`, this pass removes gates whose average\\n gate fidelity with respect to the identity is below :math:`f`. Concretely,\\ndiff --git a/releasenotes/notes/fix-phase-in-remove-id-equivalent-6480da0c62f20df1.yaml b/releasenotes/notes/fix-phase-in-remove-id-equivalent-6480da0c62f20df1.yaml\\nnew file mode 100644\\nindex 000000000000..3ee4c4accc21\\n--- /dev/null\\n+++ b/releasenotes/notes/fix-phase-in-remove-id-equivalent-6480da0c62f20df1.yaml\\n@@ -0,0 +1,8 @@\\n+---\\n+fixes:\\n+ - |\\n+ Fixed a bug in the :class:`.RemoveIdentityEquivalent` transpiler pass, where gates close\\n+ to identity up to a global phase were removed from the circuit,\\n+ but the global phase of the circuit was not updated. In particular,\\n+ :class:`.RemoveIdentityEquivalent` now removes non-parameterized :class:`.GlobalPhaseGate`\\n+ gates.\\n"}, "test": {"test_patch": "diff --git a/test/python/transpiler/test_remove_identity_equivalent.py b/test/python/transpiler/test_remove_identity_equivalent.py\\nindex 1db392d3654b..736c02b765bd 100644\\n--- a/test/python/transpiler/test_remove_identity_equivalent.py\\n+++ b/test/python/transpiler/test_remove_identity_equivalent.py\\n@@ -12,6 +12,7 @@\\n \\n \"\"\"Tests for the DropNegligible transpiler pass.\"\"\"\\n \\n+import ddt\\n import numpy as np\\n \\n from qiskit.circuit import Parameter, QuantumCircuit, QuantumRegister, Gate\\n@@ -26,6 +27,7 @@\\n XXMinusYYGate,\\n XXPlusYYGate,\\n GlobalPhaseGate,\\n+ UnitaryGate,\\n )\\n from qiskit.quantum_info import Operator\\n from qiskit.transpiler.passes import RemoveIdentityEquivalent\\n@@ -34,6 +36,7 @@\\n from test import QiskitTestCase # pylint: disable=wrong-import-order\\n \\n \\n+@ddt.ddt\\n class TestDropNegligible(QiskitTestCase):\\n \"\"\"Test the DropNegligible pass.\"\"\"\\n \\n@@ -173,13 +176,33 @@ def to_matrix(self):\\n expected = QuantumCircuit(3)\\n self.assertEqual(expected, transpiled)\\n \\n- def test_global_phase_ignored(self):\\n- \"\"\"Test that global phase gate isn't considered.\"\"\"\\n+ @ddt.data(\\n+ RXGate(0),\\n+ RXGate(2 * np.pi),\\n+ RYGate(0),\\n+ RYGate(2 * np.pi),\\n+ RZGate(0),\\n+ RZGate(2 * np.pi),\\n+ UnitaryGate(np.array([[1, 0], [0, 1]])),\\n+ UnitaryGate(np.array([[-1, 0], [0, -1]])),\\n+ UnitaryGate(np.array([[np.exp(1j * np.pi / 4), 0], [0, np.exp(1j * np.pi / 4)]])),\\n+ GlobalPhaseGate(0),\\n+ GlobalPhaseGate(np.pi / 4),\\n+ )\\n+ def test_remove_identity_up_to_global_phase(self, gate):\\n+ \"\"\"Test that gates equivalent to identity up to a global phase are removed from the circuit,\\n+ and the global phase of the circuit is updated correctly.\\n+ \"\"\"\\n+ qc = QuantumCircuit(gate.num_qubits)\\n+ qc.append(gate, qc.qubits)\\n+ transpiled = RemoveIdentityEquivalent()(qc)\\n+ self.assertEqual(transpiled.size(), 0)\\n+ self.assertEqual(Operator(qc), Operator(transpiled))\\n \\n+ def test_parameterized_global_phase_ignored(self):\\n+ \"\"\"Test that parameterized global phase gates are not removed by the pass.\"\"\"\\n+ theta = Parameter(\"theta\")\\n qc = QuantumCircuit(1)\\n- qc.id(0)\\n- qc.append(GlobalPhaseGate(0))\\n+ qc.append(GlobalPhaseGate(theta), [])\\n transpiled = RemoveIdentityEquivalent()(qc)\\n- expected = QuantumCircuit(1)\\n- expected.append(GlobalPhaseGate(0))\\n- self.assertEqual(transpiled, expected)\\n+ self.assertEqual(qc, transpiled)\\n", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}180{"question_id": "MSB_Qiskit_qiskit_pr13835", "question_type": "multi_swe_bench", "description": "Fix tracking of routing permutation in Sabre with disjoint backends (backport #13833) (Qiskit/qiskit#13835)", "content": {"org": "Qiskit", "repo": "qiskit", "pr_number": 13835, "issue_title": "Fix tracking of routing permutation in Sabre with disjoint backends (backport #13833)", "issue_body": "### Summary\\n\\nIf the backing coupling graph is disjoint, and unused components of the coupling graph would not be considered when constructing the complete routing permutation. In practice, Sabre aborts immediately after layout without attempting to route, if it needed to split the DAG across more than one disjoint component, because it can't guarantee correctness of the final routing in the presence of component-spanning barriers or classical communication, so the only way for a component to be forgotten is if the backend is disjoint, but the DAG fits into a single component.\\n\\n\\n\\n\\n### Details and comments\\n\\nFix #13732, though there's a _whole_ cornucopia of bugs split between very old versions of Qiskit, this commit's parent, and the example in the issue itself that lead from that issue seeing a regression in Qiskit 1.3 to this one.\\n\\nIn actuality, this bug has been around since the disjoint-coupling handling was first added in #9802 (qiskit-terra 0.24), and the test case in this PR would fail that version too (the fact that `TranspileLayout.initial_index_layout` wasn't added til later notwithstanding - the first assertion fails).<hr>This is an automatic backport of pull request #13833 done by [Mergify](https://mergify.com).", "base_commit": "1c2e6de4cbaba5d4f6e7a0f4ae541f0c101136a3", "resolved_issues": [{"number": 13732, "title": "Error when running `final_index_layout(filter_ancillas=False)`", "body": "### Environment\\n\\n- **Qiskit version**: 1.3.2\\n- **Python version**: 3.11\\n- **Operating system**: macos/linux\\n\\n\\n### What is happening?\\n\\nOn certain circuits transpiled with a backend and a coupling map, this call fails\\n```\\ntranspiled_circuit.layout.final_index_layout(filter_ancillas=False)\\n```\\nraising `KeyError: \"The item Qubit(QuantumRegister(5, 'q'), 3) does not exist in the Layout\"`.\\n\\nThis worked fine until qiskit 1.3.0\\n\\n### How can we reproduce the issue?\\n\\nRunning the following code:\\n\\n```\\nfrom qiskit import QuantumCircuit, transpile, qasm2\\nfrom qiskit_ibm_runtime import QiskitRuntimeService\\n\\nservice = QiskitRuntimeService(channel=\"ibm_quantum\")\\nbackend = service.backend(\"ibmq_manila\")\\n\\nqc = qasm2.loads('OPENQASM 2.0;include \"qelib1.inc\";qreg q[3];rccx q[2],q[1],q[0];t q[2];u(0.28905709212845454,5.626877140821112,5.481851443455051) q[1];h q[0];cx q[1],q[2];s q[0];', custom_instructions=qasm2.LEGACY_CUSTOM_INSTRUCTIONS)\\n\\ntranspiled_circuit = transpile(qc,backend=backend,coupling_map=[[0,1],[1,2],[2,3]],optimization_level=2,seed_transpiler=42)\\ntranspiled_circuit.layout.final_index_layout(filter_ancillas=False)\\n```\\n\\n\\n\\n### What should happen?\\n\\nThere should not be any error in the call. The output to that particular example in `qiskit 1.2.4` is `[3, 1, 2, 0]`\\n\\n\\n### Any suggestions?\\n\\n_No response_"}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/qiskit_m_qiskit:pr-13835", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/qiskit/transpiler/passes/layout/sabre_layout.py b/qiskit/transpiler/passes/layout/sabre_layout.py\\nindex af17cc226cb7..360e8d003e79 100644\\n--- a/qiskit/transpiler/passes/layout/sabre_layout.py\\n+++ b/qiskit/transpiler/passes/layout/sabre_layout.py\\n@@ -328,6 +328,19 @@ def run(self, dag):\\n for initial, final in enumerate(component.final_permutation)\\n }\\n )\\n+\\n+ # The coupling map may have been split into more components than the DAG. In this case,\\n+ # there will be some physical qubits unaccounted for in our `final_layout`. Strictly the\\n+ # `if` check is unnecessary, but we can avoid the loop for most circuits and backends.\\n+ if len(final_layout) != len(physical_qubits):\\n+ used_qubits = {\\n+ qubit for component in components for qubit in component.coupling_map.graph.nodes()\\n+ }\\n+ for index, qubit in enumerate(physical_qubits):\\n+ if index in used_qubits:\\n+ continue\\n+ final_layout[qubit] = index\\n+\\n if self.property_set[\"final_layout\"] is None:\\n self.property_set[\"final_layout\"] = final_layout\\n else:\\ndiff --git a/releasenotes/notes/sabre-disjoint-routing-85c6f6481c9ffca4.yaml b/releasenotes/notes/sabre-disjoint-routing-85c6f6481c9ffca4.yaml\\nnew file mode 100644\\nindex 000000000000..e0618dd601f7\\n--- /dev/null\\n+++ b/releasenotes/notes/sabre-disjoint-routing-85c6f6481c9ffca4.yaml\\n@@ -0,0 +1,15 @@\\n+---\\n+fixes:\\n+ - |\\n+ When :class:`.SabreLayout` is used to do both layout and routing simultaneously (as is the case\\n+ for the default options to :func:`.transpile` and :func:`.generate_preset_pass_manager`) on a\\n+ :class:`.Target` or :class:`.CouplingMap` with disjoint connectivity, and the input circuit fits\\n+ into a single component of the coupling map, the routing permutation will now be tracked\\n+ correctly.\\n+\\n+ Previously, any qubits in the coupling map that were not connected, even indirectly, to a qubit\\n+ used by the routed circuit would not be included in the final routing permutation. This could\\n+ cause surprising behaviour a long way from the point of failure, even if compilation appeared to\\n+ succeed, such as calls to :meth:`.TranspileLayout.final_index_layout` raising :exc:`KeyError`.\\n+\\n+ This bug did not affect backends that were fully connected, as most are.\\n"}, "test": {"test_patch": "diff --git a/test/python/transpiler/test_sabre_layout.py b/test/python/transpiler/test_sabre_layout.py\\nindex 2942cab30cdd..932822af012b 100644\\n--- a/test/python/transpiler/test_sabre_layout.py\\n+++ b/test/python/transpiler/test_sabre_layout.py\\n@@ -470,6 +470,21 @@ def test_with_partial_layout(self):\\n layout = pm.property_set[\"layout\"]\\n self.assertEqual([layout[q] for q in qc.qubits], [3, 1, 2, 5, 4, 6, 7, 8])\\n \\n+ def test_dag_fits_in_one_component(self):\\n+ \"\"\"Test that the output is valid if the DAG all fits in a single component of a disjoint\\n+ coupling map..\"\"\"\\n+ qc = QuantumCircuit(3)\\n+ qc.cx(0, 1)\\n+ qc.cx(1, 2)\\n+ qc.cx(2, 0)\\n+\\n+ disjoint = CouplingMap([(0, 1), (1, 2), (3, 4), (4, 5)])\\n+ layout_routing_pass = SabreLayout(disjoint, seed=2025_02_12, swap_trials=1, layout_trials=1)\\n+ out = layout_routing_pass(qc)\\n+ self.assertEqual(len(out.layout.initial_layout), len(out.layout.final_layout))\\n+ self.assertEqual(out.layout.initial_index_layout(filter_ancillas=False), [1, 0, 2, 3, 4, 5])\\n+ self.assertEqual(out.layout.final_index_layout(filter_ancillas=False), [2, 0, 1, 3, 4, 5])\\n+\\n \\n class TestSabrePreLayout(QiskitTestCase):\\n \"\"\"Tests the SabreLayout pass with starting layout created by SabrePreLayout.\"\"\"\\n", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}181{"question_id": "MSB_Qiskit_qiskit_pr14092", "question_type": "multi_swe_bench", "description": "Fix global phase update in `BasisTranslator` Pass (backport #14078) (Qiskit/qiskit#14092)", "content": {"org": "Qiskit", "repo": "qiskit", "pr_number": 14092, "issue_title": "Fix global phase update in `BasisTranslator` Pass (backport #14078)", "issue_body": "\\n\\n### Summary\\n\\nFixes #14074. \\n\\nThe `basis_translator` pass was not always updating the DAG's global phase as a part of `replace_node`: this was only done when the target dag's global phase matched ``Param::ParameterExpression``. Updating the global phase in the case of ``Param::Float`` was missing, and this is fixed now. \\n\\nI am somewhat unsure if we also need to handle the ``Param::Obj`` case. I don't understand in what kind of a circuit we would see this, and I don't believe it's even supported, as per ``dag_circuit.rs.add_global_phase``, which throws an error in the case of ``Param::Obj``. Update: @jakelishman confirmed that ``Param::Obj`` is never permitted in ``global_phase``.\\n\\nUpdate: added release notes.\\n<hr>This is an automatic backport of pull request #14078 done by [Mergify](https://mergify.com).", "base_commit": "ed98ba81d10f0bedbc3d10ff39389f11b9d1b845", "resolved_issues": [{"number": 14074, "title": "Transplie Rx introduce an incorrect global phase.", "body": "### Environment\\n\\n- **Qiskit version**: 1.4.2 \\n- **Python version**: 2.9.0\\n- **Operating system**: linux\\n\\n\\n### What is happening?\\n\\nRx(theta) = H Rz(theta) H \\n\\nThis conversion theoretically does not generate any global phase. However, the transpiler from qiskit will generate an extra global phase pi here.\\n\\n### How can we reproduce the issue?\\n\\n```\\nfrom qiskit import QuantumCircuit, transpile\\nimport numpy as np\\ntheta = 0.5*np.pi\\ncircuit1 = QuantumCircuit(1)\\ncircuit1.rx(theta, 0)\\ncircuit2 = transpile(circuit1, basis_gates=['h','rz' ])\\nglobal_phase = circuit2.global_phase-circuit1.global_phase\\nprint(global_phase)\\ncircuit2.draw('mpl')\\n```\\noutput: \\n\\n3.141592653589793\\n\\n\\n\\n### What should happen?\\n\\nDuring the transformation of Rx gate, the global phase may be added incorrectly, resulting in an error in the final result.\\n\\n### Any suggestions?\\n\\n_No response_"}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/qiskit_m_qiskit:pr-14092", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/crates/accelerate/src/basis/basis_translator/mod.rs b/crates/accelerate/src/basis/basis_translator/mod.rs\\nindex d47fc5e04022..1bc066b988c6 100644\\n--- a/crates/accelerate/src/basis/basis_translator/mod.rs\\n+++ b/crates/accelerate/src/basis/basis_translator/mod.rs\\n@@ -762,38 +762,46 @@ fn replace_node(\\n )?;\\n }\\n \\n- if let Param::ParameterExpression(old_phase) = target_dag.global_phase() {\\n- let bound_old_phase = old_phase.bind(py);\\n- let bind_dict = PyDict::new(py);\\n- for key in target_dag.global_phase().iter_parameters(py)? {\\n- let key = key?;\\n- bind_dict.set_item(&key, parameter_map.get_item(&key)?)?;\\n- }\\n- let mut new_phase: Bound<PyAny>;\\n- if bind_dict.values().iter().any(|param| {\\n- param\\n- .is_instance(PARAMETER_EXPRESSION.get_bound(py))\\n- .is_ok_and(|x| x)\\n- }) {\\n- new_phase = bound_old_phase.clone();\\n- for key_val in bind_dict.items() {\\n- new_phase =\\n- new_phase.call_method1(intern!(py, \"assign\"), key_val.downcast()?)?;\\n+ match target_dag.global_phase() {\\n+ Param::ParameterExpression(old_phase) => {\\n+ let bound_old_phase = old_phase.bind(py);\\n+ let bind_dict = PyDict::new(py);\\n+ for key in target_dag.global_phase().iter_parameters(py)? {\\n+ let key = key?;\\n+ bind_dict.set_item(&key, parameter_map.get_item(&key)?)?;\\n }\\n- } else {\\n- new_phase = bound_old_phase.call_method1(intern!(py, \"bind\"), (bind_dict,))?;\\n- }\\n- if !new_phase.getattr(intern!(py, \"parameters\"))?.is_truthy()? {\\n- new_phase = new_phase.call_method0(intern!(py, \"numeric\"))?;\\n- if new_phase.is_instance(&PyComplex::type_object(py))? {\\n- return Err(TranspilerError::new_err(format!(\\n- \"Global phase must be real, but got {}\",\\n- new_phase.repr()?\\n- )));\\n+ let mut new_phase: Bound<PyAny>;\\n+ if bind_dict.values().iter().any(|param| {\\n+ param\\n+ .is_instance(PARAMETER_EXPRESSION.get_bound(py))\\n+ .is_ok_and(|x| x)\\n+ }) {\\n+ new_phase = bound_old_phase.clone();\\n+ for key_val in bind_dict.items() {\\n+ new_phase =\\n+ new_phase.call_method1(intern!(py, \"assign\"), key_val.downcast()?)?;\\n+ }\\n+ } else {\\n+ new_phase = bound_old_phase.call_method1(intern!(py, \"bind\"), (bind_dict,))?;\\n }\\n+ if !new_phase.getattr(intern!(py, \"parameters\"))?.is_truthy()? {\\n+ new_phase = new_phase.call_method0(intern!(py, \"numeric\"))?;\\n+ if new_phase.is_instance(&PyComplex::type_object(py))? {\\n+ return Err(TranspilerError::new_err(format!(\\n+ \"Global phase must be real, but got {}\",\\n+ new_phase.repr()?\\n+ )));\\n+ }\\n+ }\\n+ let new_phase: Param = new_phase.extract()?;\\n+ dag.add_global_phase(py, &new_phase)?;\\n }\\n- let new_phase: Param = new_phase.extract()?;\\n- dag.add_global_phase(py, &new_phase)?;\\n+\\n+ Param::Float(_) => {\\n+ dag.add_global_phase(py, target_dag.global_phase())?;\\n+ }\\n+\\n+ _ => {}\\n }\\n }\\n \\ndiff --git a/releasenotes/notes/fix-global-phase-in-basis-translator-d08d665198589828.yaml b/releasenotes/notes/fix-global-phase-in-basis-translator-d08d665198589828.yaml\\nnew file mode 100644\\nindex 000000000000..f73afd91e79e\\n--- /dev/null\\n+++ b/releasenotes/notes/fix-global-phase-in-basis-translator-d08d665198589828.yaml\\n@@ -0,0 +1,6 @@\\n+---\\n+fixes:\\n+ - |\\n+ Fixed a problem in :class:`.BasisTranslator` transpiler pass, where the global\\n+ phase of the DAG was not updated correctly. \\n+ Fixed `#14074 <https://github.com/Qiskit/qiskit/issues/14074>`__.\\n"}, "test": {"test_patch": "diff --git a/test/python/transpiler/test_basis_translator.py b/test/python/transpiler/test_basis_translator.py\\nindex a03765778a3f..751073deb28c 100644\\n--- a/test/python/transpiler/test_basis_translator.py\\n+++ b/test/python/transpiler/test_basis_translator.py\\n@@ -1008,6 +1008,15 @@ def test_global_phase(self):\\n )\\n self.assertEqual(Operator(dag_to_circuit(out_dag)), Operator(expected))\\n \\n+ def test_rx_to_rz(self):\\n+ \"\"\"Verify global phase is updated correctly in basis translation.\\n+ See https://github.com/Qiskit/qiskit/issues/14074.\"\"\"\\n+ theta = 0.5 * pi\\n+ circ = QuantumCircuit(1)\\n+ circ.rx(theta, 0)\\n+ out_circ = BasisTranslator(std_eqlib, [\"h\", \"rz\"])(circ)\\n+ self.assertEqual(Operator(circ), Operator(out_circ))\\n+\\n def test_skip_target_basis_equivalences_1(self):\\n \"\"\"Test that BasisTranslator skips gates in the target_basis - #6085\"\"\"\\n circ = QuantumCircuit()\\n", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}182{"question_id": "MSB_Qiskit_qiskit_pr14096", "question_type": "multi_swe_bench", "description": "Fix qpy for `MCMTGate` (Qiskit/qiskit#14096)", "content": {"org": "Qiskit", "repo": "qiskit", "pr_number": 14096, "issue_title": "Fix qpy for `MCMTGate`", "issue_body": "<!--\\r\\n\u26a0\ufe0f If you do not respect this template, your pull request will be closed.\\r\\n\u26a0\ufe0f Your pull request title should be short detailed and understandable for all.\\r\\n\u26a0\ufe0f Also, please add a release note file using reno if the change needs to be\\r\\n documented in the release notes.\\r\\n\u26a0\ufe0f If your pull request fixes an open issue, please link to the issue.\\r\\n\\r\\n- [x] I have added the tests to cover my changes.\\r\\n- [x] I have updated the documentation accordingly.\\r\\n- [x] I have read the CONTRIBUTING document.\\r\\n-->\\r\\n\\r\\n### Summary\\r\\nThis PR fixes #13965.\\r\\n\\r\\n\\r\\n### Details and comments\\r\\n`qpy` had to save `base_gate` for `MCMTGate`, which didn't. I only added `MCMTGate` to custom operations because `_read_custom_operations` and `_write_custom_operation` already handled `base_gate`.\\r\\n\\r\\n", "base_commit": "ddb802506a499385caf436522b6fb277b51895c1", "resolved_issues": [{"number": 13965, "title": "QPY fails to serialize MCMTGate gate", "body": "### Environment\\n\\n- **Qiskit version**: 1.4.0\\n- **Python version**: 3.12.9\\n- **Operating system**: Mac M1\\n\\n\\n### What is happening?\\n\\nI saved a quantum circuit containing `qiskit.circuit.library.MCMTGate` using `qpy`. The following error happened when I had attempted to load the saved quantum circuit.\\n\\n```\\n---------------------------------------------------------------------------\\nTypeError Traceback (most recent call last)\\nCell In[9], line 2\\n 1 with open(circuit_path, \"rb\") as circuit_file:\\n----> 2 qc = qpy.load(circuit_file)\\n 3 qc\\n\\nFile /opt/homebrew/Caskroom/miniforge/base/envs/qsvm/lib/python3.12/site-packages/qiskit/qpy/interface.py:370, in load(file_obj, metadata_deserializer)\\n 367 programs = []\\n 368 for _ in range(data.num_programs):\\n 369 programs.append(\\n--> 370 loader(\\n 371 file_obj,\\n 372 data.qpy_version,\\n 373 metadata_deserializer=metadata_deserializer,\\n 374 use_symengine=use_symengine,\\n 375 )\\n 376 )\\n 377 return programs\\n\\nFile /opt/homebrew/Caskroom/miniforge/base/envs/qsvm/lib/python3.12/site-packages/qiskit/qpy/binary_io/circuits.py:1443, in read_circuit(file_obj, version, metadata_deserializer, use_symengine)\\n 1441 custom_operations = _read_custom_operations(file_obj, version, vectors)\\n 1442 for _instruction in range(num_instructions):\\n-> 1443 _read_instruction(\\n 1444 file_obj,\\n 1445 circ,\\n 1446 out_registers,\\n 1447 custom_operations,\\n 1448 version,\\n 1449 vectors,\\n 1450 use_symengine,\\n 1451 standalone_var_indices,\\n 1452 )\\n 1454 # Read calibrations\\n 1455 if version >= 5:\\n\\nFile /opt/homebrew/Caskroom/miniforge/base/envs/qsvm/lib/python3.12/site-packages/qiskit/qpy/binary_io/circuits.py:379, in _read_instruction(file_obj, circuit, registers, custom_operations, version, vectors, use_symengine, standalone_vars)\\n 377 gate = gate_class(*params, instruction.num_ctrl_qubits, label=label)\\n 378 else:\\n--> 379 gate = gate_class(*params, label=label)\\n 380 if (\\n 381 gate.num_ctrl_qubits != instruction.num_ctrl_qubits\\n 382 or gate.ctrl_state != instruction.ctrl_state\\n 383 ):\\n 384 gate = gate.to_mutable()\\n\\nTypeError: MCMTGate.__init__() missing 3 required positional arguments: 'gate', 'num_ctrl_qubits', and 'num_target_qubits'\\n\\n```\\n\\n### How can we reproduce the issue?\\n\\n```python\\nqc = qiskit.QuantumCircuit(3)\\nqc.compose(qiskit.circuit.library.MCMTGate(qiskit.circuit.library.ZGate(), 2, 1), inplace=True)\\n\\ncircuit_path = \"circuit.qpy\"\\nwith open(circuit_path, \"wb\") as circuit_file:\\n qpy.dump(qc, circuit_file)\\n\\nwith open(circuit_path, \"rb\") as circuit_file:\\n qc = qpy.load(circuit_file)\\n```\\n\\n### What should happen?\\n\\nThe saved quantum circuit should be loaded without any error.\\n\\n### Any suggestions?\\n\\nIt seems like this issue relates to #9390 for me?"}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/qiskit_m_qiskit:pr-14096", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/qiskit/qpy/binary_io/circuits.py b/qiskit/qpy/binary_io/circuits.py\\nindex 91a06ccfe92f..46837b9f2deb 100644\\n--- a/qiskit/qpy/binary_io/circuits.py\\n+++ b/qiskit/qpy/binary_io/circuits.py\\n@@ -783,6 +783,11 @@ def _write_instruction(\\n custom_operations[gate_class_name] = instruction.operation\\n custom_operations_list.append(gate_class_name)\\n \\n+ elif isinstance(instruction.operation, library.MCMTGate):\\n+ gate_class_name = instruction.operation.name + \"_\" + str(uuid.uuid4())\\n+ custom_operations[gate_class_name] = instruction.operation\\n+ custom_operations_list.append(gate_class_name)\\n+\\n condition_type = type_keys.Condition.NONE\\n condition_register = b\"\"\\n condition_value = 0\\ndiff --git a/releasenotes/notes/fix-qpy-mcmtgate-ab735812998f4107.yaml b/releasenotes/notes/fix-qpy-mcmtgate-ab735812998f4107.yaml\\nnew file mode 100644\\nindex 000000000000..72de29c3c31e\\n--- /dev/null\\n+++ b/releasenotes/notes/fix-qpy-mcmtgate-ab735812998f4107.yaml\\n@@ -0,0 +1,6 @@\\n+---\\n+fixes:\\n+ - |\\n+ Fixed a bug in QPY (:mod:`qiskit.qpy`) where circuits containing gates of class\\n+ :class:`.MCMTGate` would fail to serialize.\\n+ See `#13965 <https://github.com/Qiskit/qiskit/issues/13965>`__.\\n\\\\ No newline at end of file\\n"}, "test": {"test_patch": "diff --git a/test/python/circuit/test_circuit_load_from_qpy.py b/test/python/circuit/test_circuit_load_from_qpy.py\\nindex 32cea72a783c..f8d17a5fd100 100644\\n--- a/test/python/circuit/test_circuit_load_from_qpy.py\\n+++ b/test/python/circuit/test_circuit_load_from_qpy.py\\n@@ -30,6 +30,7 @@\\n from qiskit.circuit.gate import Gate\\n from qiskit.circuit.library import (\\n XGate,\\n+ ZGate,\\n CXGate,\\n RYGate,\\n QFT,\\n@@ -41,6 +42,7 @@\\n MCXGrayCode,\\n MCXRecursive,\\n MCXVChain,\\n+ MCMTGate,\\n UCRXGate,\\n UCRYGate,\\n UCRZGate,\\n@@ -1261,11 +1263,13 @@ def test_standard_control_gates(self):\\n mcx_gray_gate = MCXGrayCode(5)\\n mcx_recursive_gate = MCXRecursive(4)\\n mcx_vchain_gate = MCXVChain(3)\\n+ mcmt_gate = MCMTGate(ZGate(), 2, 1)\\n qc.append(mcu1_gate, [0, 2, 1])\\n qc.append(mcx_gate, list(range(0, 6)))\\n qc.append(mcx_gray_gate, list(range(0, 6)))\\n qc.append(mcx_recursive_gate, list(range(0, 5)))\\n qc.append(mcx_vchain_gate, list(range(0, 5)))\\n+ qc.append(mcmt_gate, list(range(0, 3)))\\n qc.mcp(np.pi, [0, 2], 1)\\n qc.mcx([0, 2], 1)\\n qc.measure_all()\\n", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}183{"question_id": "MSB_Qiskit_qiskit_pr14217", "question_type": "multi_swe_bench", "description": "Bug fixes in Solovay Kitaev Decomposition (Qiskit/qiskit#14217)", "content": {"org": "Qiskit", "repo": "qiskit", "pr_number": 14217, "issue_title": "Bug fixes in Solovay Kitaev Decomposition", "issue_body": "<!--\\r\\n\u26a0\ufe0f If you do not respect this template, your pull request will be closed.\\r\\n\u26a0\ufe0f Your pull request title should be short detailed and understandable for all.\\r\\n\u26a0\ufe0f Also, please add a release note file using reno if the change needs to be\\r\\n documented in the release notes.\\r\\n\u26a0\ufe0f If your pull request fixes an open issue, please link to the issue.\\r\\n\\r\\n- [x] I have added the tests to cover my changes.\\r\\n- [x] I have updated the documentation accordingly.\\r\\n- [x] I have read the CONTRIBUTING document.\\r\\n-->\\r\\n\\r\\n### Summary\\r\\n\\r\\nThis PR fixes a number of bugs we have recently discovered in the Python code for the Solovay-Kitaev decomposition, together with @Cryoris and @anedumla.\\r\\n\\r\\nFixes include:\\r\\n* fixed a problem with the rotation axis computation for 180 degree rotations (thanks to @Cryoris for working out the math)\\r\\n* fixed a problem where the global phase of the returned circuit might have been off by $\\\\pi$, due to the underlying algorithm approximating not the original ``SU(2)`` matrix, but its projection onto ``SO(3)``\\r\\n* in particular fixed #9552.\\r\\n\\r\\nLonger-term, we will deprecate the Python code for Solovay-Kitaev decomposition altogether, and switch to the new improved pass written in Rust that also fixes these problems (see #14203), however for backward compatibility we need to temporarily support the Python code as well, and thus it makes sense to fix the problems on the Python side too.\\r\\n\\r\\n\\r\\n### Details and comments\\r\\n\\r\\nOther changes:\\r\\n\\r\\n* There was a very strange \"back door\" for returning a circuit with the original unitary matrix if the computed matrix is not close to the identity. This behavior is not consistent with the documented description of the pass and was removed. (Or rather the functions ``to_circuit`` and ``to_dag`` remain for backwards compatibility but are no longer used by the main pass).\\r\\n* The ``GateSequence`` class used to store both the SO(3) matrix as ``product`` and the SU(2) matrix as ``product_su2``, however the parameter ``product_su2`` was not updated correctly in various places (and it was not even clear what to do within ``GateSequence.from_matrix``). As ``product_su2`` was almost not used anywhere in the algorithm (with the exception of one place where its usage did not seem to be correct anyway), it was simply removed to avoid confusion and unnecessary computations. \\r\\n", "base_commit": "13db91cdcb3978863cbf66076453b5a82f686717", "resolved_issues": [{"number": 9552, "title": "Global phase on Solovay-Kitaev decomposition seems wrong", "body": "### Environment\\r\\n\\r\\n- **Qiskit Terra version**: 0.23.1\\r\\n- **Python version**: 3.10.6\\r\\n- **Operating system**: Ubuntu Linux\\r\\n\\r\\n\\r\\n### What is happening?\\r\\n\\r\\nThe global phase of some circuits generated by `SolovayKitaev` seems wrong.\\r\\n\\r\\n### How can we reproduce the issue?\\r\\n\\r\\n```python\\r\\n>>> from qiskit.transpiler.passes.synthesis import SolovayKitaev\\r\\n>>> from qiskit.quantum_info import Operator\\r\\n>>> from qiskit import QuantumCircuit, Aer, transpile, assemble\\r\\n>>> c = QuantumCircuit(1)\\r\\n>>> c.y(0)\\r\\n<qiskit.circuit.instructionset.InstructionSet object at 0x7f62280bc910>\\r\\n>>> skd = SolovayKitaev(recursion_degree=3)\\r\\n>>> dc = skd(c)\\r\\n>>> c.draw()\\r\\n \u250c\u2500\u2500\u2500\u2510\\r\\nq: \u2524 Y \u251c\\r\\n \u2514\u2500\u2500\u2500\u2518\\r\\n>>> dc.draw()\\r\\nglobal phase: 3\u03c0/4\\r\\n \u250c\u2500\u2500\u2500\u2510\u250c\u2500\u2500\u2500\u2510\u250c\u2500\u2500\u2500\u2510\u250c\u2500\u2500\u2500\u2510\u250c\u2500\u2500\u2500\u2500\u2500\u2510\u250c\u2500\u2500\u2500\u2500\u2500\u2510\u250c\u2500\u2500\u2500\u2510\u250c\u2500\u2500\u2500\u2510\u250c\u2500\u2500\u2500\u2510\\r\\nq: \u2524 H \u251c\u2524 T \u251c\u2524 T \u251c\u2524 H \u251c\u2524 Tdg \u251c\u2524 Tdg \u251c\u2524 H \u251c\u2524 T \u251c\u2524 T \u251c\\r\\n \u2514\u2500\u2500\u2500\u2518\u2514\u2500\u2500\u2500\u2518\u2514\u2500\u2500\u2500\u2518\u2514\u2500\u2500\u2500\u2518\u2514\u2500\u2500\u2500\u2500\u2500\u2518\u2514\u2500\u2500\u2500\u2500\u2500\u2518\u2514\u2500\u2500\u2500\u2518\u2514\u2500\u2500\u2500\u2518\u2514\u2500\u2500\u2500\u2518\\r\\n>>> Operator(c)\\r\\nOperator([[0.+0.j, 0.-1.j],\\r\\n [0.+1.j, 0.+0.j]],\\r\\n input_dims=(2,), output_dims=(2,))\\r\\n>>> Operator(dc)\\r\\nOperator([[-1.11022302e-16+7.85046229e-17j,\\r\\n 1.05981241e-15+1.00000000e+00j],\\r\\n [-9.43689571e-16-1.00000000e+00j,\\r\\n 0.00000000e+00-3.92523115e-17j]],\\r\\n input_dims=(2,), output_dims=(2,))\\r\\n```\\r\\n\\r\\n### What should happen?\\r\\n\\r\\nGiven `Operator(dc).data` aprroximately equals to `[[0, 1j], [-1j, 0]]` which equals to `-Operator(c).data`, `dc`'s global phase should be \u03c0 rather than 3\u03c0/4, I believe.\\r\\n\\r\\n### Any suggestions?\\r\\n\\r\\n_No response_"}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/qiskit_m_qiskit:pr-14217", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/qiskit/synthesis/discrete_basis/commutator_decompose.py b/qiskit/synthesis/discrete_basis/commutator_decompose.py\\nindex 67094a7105a4..b9d274b38a3d 100644\\n--- a/qiskit/synthesis/discrete_basis/commutator_decompose.py\\n+++ b/qiskit/synthesis/discrete_basis/commutator_decompose.py\\n@@ -53,16 +53,40 @@ def _compute_rotation_axis(matrix: np.ndarray) -> np.ndarray:\\n \"\"\"\\n _check_is_so3(matrix)\\n \\n+ # If theta represents the rotation angle, then trace = 1 + 2cos(theta).\\n trace = _compute_trace_so3(matrix)\\n- theta = math.acos(0.5 * (trace - 1))\\n- if math.sin(theta) > 1e-10:\\n- x = 1 / (2 * math.sin(theta)) * (matrix[2][1] - matrix[1][2])\\n- y = 1 / (2 * math.sin(theta)) * (matrix[0][2] - matrix[2][0])\\n- z = 1 / (2 * math.sin(theta)) * (matrix[1][0] - matrix[0][1])\\n- else:\\n+\\n+ if trace >= 3 - 1e-10:\\n+ # The matrix is the identity (rotation by 0)\\n x = 1.0\\n y = 0.0\\n z = 0.0\\n+\\n+ elif trace <= -1 + 1e-10:\\n+ # The matrix is the 180-degree rotation\\n+ squares = (1 + np.diagonal(matrix)) / 2\\n+ index_of_max = np.argmax(squares)\\n+\\n+ if index_of_max == 0:\\n+ x = math.sqrt(squares[0])\\n+ y = matrix[0][1] / (2 * x)\\n+ z = matrix[0][2] / (2 * x)\\n+ elif index_of_max == 1:\\n+ y = math.sqrt(squares[1])\\n+ x = matrix[0][1] / (2 * y)\\n+ z = matrix[1][2] / (2 * y)\\n+ else:\\n+ z = math.sqrt(squares[2])\\n+ x = matrix[0][2] / (2 * z)\\n+ y = matrix[1][2] / (2 * z)\\n+\\n+ else:\\n+ # The matrix is the rotation by theta with sin(theta)!=0\\n+ theta = math.acos(0.5 * (trace - 1))\\n+ x = 1 / (2 * math.sin(theta)) * (matrix[2][1] - matrix[1][2])\\n+ y = 1 / (2 * math.sin(theta)) * (matrix[0][2] - matrix[2][0])\\n+ z = 1 / (2 * math.sin(theta)) * (matrix[1][0] - matrix[0][1])\\n+\\n return np.array([x, y, z])\\n \\n \\ndiff --git a/qiskit/synthesis/discrete_basis/gate_sequence.py b/qiskit/synthesis/discrete_basis/gate_sequence.py\\nindex 39adff0ab5bc..73a0c631529b 100644\\n--- a/qiskit/synthesis/discrete_basis/gate_sequence.py\\n+++ b/qiskit/synthesis/discrete_basis/gate_sequence.py\\n@@ -55,7 +55,6 @@ def __init__(self, gates: Sequence[Gate] = ()) -> None:\\n self.name = \" \".join(self.labels)\\n self.global_phase = global_phase\\n self.product = so3_matrix\\n- self.product_su2 = su2_matrix\\n \\n def remove_cancelling_pair(self, indices: Sequence[int]) -> None:\\n \"\"\"Remove a pair of indices that cancel each other and *do not* change the matrices.\"\"\"\\n@@ -106,6 +105,16 @@ def to_circuit(self):\\n \\n return circuit\\n \\n+ def _to_u2(self):\\n+ \"\"\"Creates the U2 matrix corresponding to the stored sequence of gates\\n+ and the global phase.\\n+ \"\"\"\\n+ u2 = np.eye(2, dtype=complex)\\n+ for mat in self.gates:\\n+ u2 = mat.to_matrix().dot(u2)\\n+ u2 = np.exp(1j * self.global_phase) * u2\\n+ return u2\\n+\\n def to_dag(self):\\n \"\"\"Convert to a :class:`.DAGCircuit`.\\n \\n@@ -149,7 +158,6 @@ def append(self, gate: Gate) -> \"GateSequence\":\\n so3 = _convert_su2_to_so3(su2)\\n \\n self.product = so3.dot(self.product)\\n- self.product_su2 = su2.dot(self.product_su2)\\n self.global_phase = self.global_phase + phase\\n \\n self.gates.append(gate)\\n@@ -172,7 +180,6 @@ def adjoint(self) -> \"GateSequence\":\\n adjoint.labels = [inv.name for inv in adjoint.gates]\\n adjoint.name = \" \".join(adjoint.labels)\\n adjoint.product = np.conj(self.product).T\\n- adjoint.product_su2 = np.conj(self.product_su2).T\\n adjoint.global_phase = -self.global_phase\\n \\n return adjoint\\n@@ -190,7 +197,6 @@ def copy(self) -> \"GateSequence\":\\n out.matrices = self.matrices.copy()\\n out.global_phase = self.global_phase\\n out.product = self.product.copy()\\n- out.product_su2 = self.product_su2.copy()\\n out.name = self.name\\n out._eulers = self._eulers\\n return out\\ndiff --git a/qiskit/synthesis/discrete_basis/generate_basis_approximations.py b/qiskit/synthesis/discrete_basis/generate_basis_approximations.py\\nindex 388b5cca061d..a603b89d94e4 100644\\n--- a/qiskit/synthesis/discrete_basis/generate_basis_approximations.py\\n+++ b/qiskit/synthesis/discrete_basis/generate_basis_approximations.py\\n@@ -76,7 +76,7 @@ def _check_candidate_greedy(candidate, existing_sequences, tol=1e-10):\\n return False\\n \\n for existing in existing_sequences:\\n- if matrix_equal(existing.product_su2, candidate.product_su2, ignore_phase=True, atol=tol):\\n+ if matrix_equal(existing.product, candidate.product, ignore_phase=True, atol=tol):\\n # is the new sequence less or more efficient?\\n return len(candidate.gates) < len(existing.gates)\\n return True\\ndiff --git a/qiskit/synthesis/discrete_basis/solovay_kitaev.py b/qiskit/synthesis/discrete_basis/solovay_kitaev.py\\nindex f367f6c0f0b5..e87efe2884c3 100644\\n--- a/qiskit/synthesis/discrete_basis/solovay_kitaev.py\\n+++ b/qiskit/synthesis/discrete_basis/solovay_kitaev.py\\n@@ -24,7 +24,7 @@\\n class SolovayKitaevDecomposition:\\n \"\"\"The Solovay Kitaev discrete decomposition algorithm.\\n \\n- This class is called recursively by the transpiler pass, which is why it is separeted.\\n+ This class is called recursively by the transpiler pass, which is why it is separated.\\n See :class:`qiskit.transpiler.passes.SolovayKitaev` for more information.\\n \"\"\"\\n \\n@@ -33,7 +33,7 @@ def __init__(\\n ) -> None:\\n \"\"\"\\n Args:\\n- basic_approximations: A specification of the basic SU(2) approximations in terms\\n+ basic_approximations: A specification of the basic SO(3) approximations in terms\\n of discrete gates. At each iteration this algorithm, the remaining error is\\n approximated with the closest sequence of gates in this set.\\n If a ``str``, this specifies a ``.npy`` filename from which to load the\\n@@ -116,23 +116,33 @@ def run(\\n \"\"\"\\n # make input matrix SU(2) and get the according global phase\\n z = 1 / np.sqrt(np.linalg.det(gate_matrix))\\n- gate_matrix_su2 = GateSequence.from_matrix(z * gate_matrix)\\n+\\n+ gate_matrix_su2 = z * gate_matrix\\n+ gate_matrix_as_sequence = GateSequence.from_matrix(gate_matrix_su2)\\n global_phase = np.arctan2(np.imag(z), np.real(z))\\n \\n # get the decomposition as GateSequence type\\n- decomposition = self._recurse(gate_matrix_su2, recursion_degree, check_input=check_input)\\n+ decomposition = self._recurse(\\n+ gate_matrix_as_sequence, recursion_degree, check_input=check_input\\n+ )\\n \\n # simplify\\n _remove_identities(decomposition)\\n _remove_inverse_follows_gate(decomposition)\\n \\n+ # adjust to the correct SU(2) phase\\n+ adjust_phase = (\\n+ np.pi if _should_adjust_phase(decomposition._to_u2(), gate_matrix_su2) else 0.0\\n+ )\\n+\\n # convert to a circuit and attach the right phases\\n if return_dag:\\n out = decomposition.to_dag()\\n else:\\n out = decomposition.to_circuit()\\n \\n- out.global_phase = decomposition.global_phase - global_phase\\n+ out.global_phase += adjust_phase\\n+ out.global_phase -= global_phase\\n \\n return out\\n \\n@@ -155,17 +165,20 @@ def _recurse(self, sequence: GateSequence, n: int, check_input: bool = True) ->\\n raise ValueError(\"Shape of U must be (3, 3) but is\", sequence.shape)\\n \\n if n == 0:\\n- return self.find_basic_approximation(sequence)\\n+ res = self.find_basic_approximation(sequence)\\n \\n- u_n1 = self._recurse(sequence, n - 1, check_input=check_input)\\n+ else:\\n+ u_n1 = self._recurse(sequence, n - 1, check_input=check_input)\\n \\n- v_n, w_n = commutator_decompose(\\n- sequence.dot(u_n1.adjoint()).product, check_input=check_input\\n- )\\n+ v_n, w_n = commutator_decompose(\\n+ sequence.dot(u_n1.adjoint()).product, check_input=check_input\\n+ )\\n+\\n+ v_n1 = self._recurse(v_n, n - 1, check_input=check_input)\\n+ w_n1 = self._recurse(w_n, n - 1, check_input=check_input)\\n+ res = v_n1.dot(w_n1).dot(v_n1.adjoint()).dot(w_n1.adjoint()).dot(u_n1)\\n \\n- v_n1 = self._recurse(v_n, n - 1, check_input=check_input)\\n- w_n1 = self._recurse(w_n, n - 1, check_input=check_input)\\n- return v_n1.dot(w_n1).dot(v_n1.adjoint()).dot(w_n1.adjoint()).dot(u_n1)\\n+ return res\\n \\n def find_basic_approximation(self, sequence: GateSequence) -> GateSequence:\\n \"\"\"Find ``GateSequence`` in ``self._basic_approximations`` that approximates ``sequence``.\\n@@ -215,3 +228,13 @@ def _remove_identities(sequence):\\n sequence.gates.pop(index)\\n else:\\n index += 1\\n+\\n+\\n+def _should_adjust_phase(computed: np.ndarray, target: np.ndarray) -> bool:\\n+ \"\"\"\\n+ The implemented SolovayKitaevDecomposition has a global phase uncertainty of +-1,\\n+ due to approximating not the original SU(2) matrix but its projection onto SO(3).\\n+ This function returns ``True`` if the global phase of the computed approximation\\n+ should be adjusted (by adding pi) to better much the target.\\n+ \"\"\"\\n+ return np.linalg.norm(-computed - target) < np.linalg.norm(computed - target)\\ndiff --git a/releasenotes/notes/fix-sk-decomposition-23da3ee4b6a10d62.yaml b/releasenotes/notes/fix-sk-decomposition-23da3ee4b6a10d62.yaml\\nnew file mode 100644\\nindex 000000000000..21a899a7df9e\\n--- /dev/null\\n+++ b/releasenotes/notes/fix-sk-decomposition-23da3ee4b6a10d62.yaml\\n@@ -0,0 +1,12 @@\\n+---\\n+fixes:\\n+ - |\\n+ Fixed a problem in the :class:`.SolovayKitaev` transpiler pass where the pass could\\n+ crash due to encountering a 180 degree rotation in the internal recursion,\\n+ which was not handled correctly.\\n+ - |\\n+ Fixed a problem in the :class:`.SolovayKitaev` transpiler pass where the generated\\n+ approximation could have a phase that differs by :math:`\\\\pi` from the correct value.\\n+ This resulted due to the internal :math:`SO(3)` representation, which requires additional\\n+ handling to obtain the correct sign of the qubit gate matrix.\\n+ Fixed `#9552 <https://github.com/Qiskit/qiskit-terra/issues/9552>`__\\n"}, "test": {"test_patch": "diff --git a/test/python/transpiler/test_solovay_kitaev.py b/test/python/transpiler/test_solovay_kitaev.py\\nindex bb39f8db8e81..da3a0840e2b8 100644\\n--- a/test/python/transpiler/test_solovay_kitaev.py\\n+++ b/test/python/transpiler/test_solovay_kitaev.py\\n@@ -99,9 +99,7 @@ def test_unitary_synthesis(self):\\n passes = PassManager([_1q, _cons, _synth])\\n compiled = passes.run(circuit)\\n \\n- diff = np.linalg.norm(Operator(compiled) - Operator(circuit))\\n- self.assertLess(diff, 1)\\n- self.assertEqual(set(compiled.count_ops().keys()), {\"h\", \"s\", \"cx\"})\\n+ self.assertLessEqual(set(compiled.count_ops().keys()), {\"h\", \"s\", \"sdg\", \"cx\"})\\n \\n def test_plugin(self):\\n \"\"\"Test calling the plugin directly.\"\"\"\\n@@ -113,12 +111,7 @@ def test_plugin(self):\\n plugin = SolovayKitaevSynthesis()\\n out = plugin.run(unitary, basis_gates=[\"h\", \"s\"])\\n \\n- reference = QuantumCircuit(1, global_phase=3 * np.pi / 4)\\n- reference.h(0)\\n- reference.s(0)\\n- reference.h(0)\\n-\\n- self.assertEqual(dag_to_circuit(out), reference)\\n+ self.assertLessEqual(set(out.count_ops().keys()), {\"h\", \"s\", \"sdg\", \"cx\"})\\n \\n def test_generating_default_approximation(self):\\n \"\"\"Test the approximation set is generated by default.\"\"\"\\n@@ -164,11 +157,14 @@ def test_str_basis_gates(self):\\n dag = circuit_to_dag(circuit)\\n discretized = dag_to_circuit(synth.run(dag))\\n \\n- reference = QuantumCircuit(1, global_phase=7 * np.pi / 8)\\n+ reference = QuantumCircuit(1, global_phase=15 * np.pi / 8)\\n reference.h(0)\\n reference.t(0)\\n reference.h(0)\\n \\n+ # Make sure that the discretized circuit gives a valid approximation\\n+ diff = _trace_distance(circuit, discretized)\\n+ self.assertLess(diff, 0.01)\\n self.assertEqual(discretized, reference)\\n \\n def test_approximation_on_qft(self):\\n@@ -209,14 +205,14 @@ def test_u_gates_work(self):\\n circuit.u(np.pi / 2, 0, 15 * np.pi / 16, 0)\\n \\n depth = 4\\n- basis_gates = [\"h\", \"t\", \"tdg\", \"s\", \"z\"]\\n+ basis_gates = [\"h\", \"t\", \"tdg\", \"s\", \"sdg\", \"z\"]\\n gate_approx_library = generate_basic_approximations(basis_gates=basis_gates, depth=depth)\\n \\n skd = SolovayKitaev(recursion_degree=2, basic_approximations=gate_approx_library)\\n discretized = skd(circuit)\\n \\n included_gates = set(discretized.count_ops().keys())\\n- self.assertEqual(set(basis_gates), included_gates)\\n+ self.assertLessEqual(included_gates, set(basis_gates))\\n \\n def test_load_from_file(self):\\n \"\"\"Test loading basic approximations from a file works.\\n@@ -229,22 +225,21 @@ def test_load_from_file(self):\\n fullpath = os.path.join(tmp_dir, filename)\\n \\n # dump approximations to file\\n- generate_basic_approximations(basis_gates=[\"h\", \"s\", \"sdg\"], depth=3, filename=fullpath)\\n+ gate_approx_library = generate_basic_approximations(\\n+ basis_gates=[\"h\", \"s\", \"sdg\"], depth=3, filename=fullpath\\n+ )\\n \\n # circuit to decompose and reference decomp\\n circuit = QuantumCircuit(1)\\n circuit.rx(0.8, 0)\\n \\n- reference = QuantumCircuit(1, global_phase=3 * np.pi / 4)\\n- reference.h(0)\\n- reference.s(0)\\n- reference.h(0)\\n+ # Run SK pass using gate_approx_library\\n+ reference = SolovayKitaev(basic_approximations=gate_approx_library)(circuit)\\n \\n- # load the decomp and compare to reference\\n- skd = SolovayKitaev(basic_approximations=fullpath)\\n- # skd = SolovayKitaev(basic_approximations=filename)\\n- discretized = skd(circuit)\\n+ # Run SK pass using stored basis_approximations\\n+ discretized = SolovayKitaev(basic_approximations=fullpath)(circuit)\\n \\n+ # Check that both flows produce the same result\\n self.assertEqual(discretized, reference)\\n \\n def test_measure(self):\\n@@ -297,6 +292,15 @@ def test_no_to_matrix(self):\\n transpiled = SolovayKitaev()(qc)\\n self.assertEqual(set(transpiled.count_ops()), {\"initialize\"})\\n \\n+ def test_y_gate(self):\\n+ \"\"\"Test the Solovay-Kitaev decomposition on the circuit with a Y-gate (see issue #9552).\"\"\"\\n+ circuit = QuantumCircuit(1)\\n+ circuit.y(0)\\n+\\n+ transpiled = SolovayKitaev()(circuit)\\n+ diff = _trace_distance(circuit, transpiled)\\n+ self.assertLess(diff, 1e-6)\\n+\\n \\n @ddt\\n class TestGateSequence(QiskitTestCase):\\n", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}184{"question_id": "MSB_Qiskit_qiskit_pr14349", "question_type": "multi_swe_bench", "description": "Bug fix in HighLevelSynthesis fast-return mechanism (Qiskit/qiskit#14349)", "content": {"org": "Qiskit", "repo": "qiskit", "pr_number": 14349, "issue_title": "Bug fix in HighLevelSynthesis fast-return mechanism", "issue_body": "<!--\\r\\n\u26a0\ufe0f If you do not respect this template, your pull request will be closed.\\r\\n\u26a0\ufe0f Your pull request title should be short detailed and understandable for all.\\r\\n\u26a0\ufe0f Also, please add a release note file using reno if the change needs to be\\r\\n documented in the release notes.\\r\\n\u26a0\ufe0f If your pull request fixes an open issue, please link to the issue.\\r\\n\\r\\n- [x] I have added the tests to cover my changes.\\r\\n- [x] I have updated the documentation accordingly.\\r\\n- [x] I have read the CONTRIBUTING document.\\r\\n-->\\r\\n\\r\\n### Summary\\r\\n\\r\\nThe `HighLevelSynthesis` transpiler pass checks whether all of the circuit instructions are already natively supported, in which case the pass terminates early. Previously this check called `dag.count_ops(py, recurse=false`), which however is not correct on circuits with control-flow operations when operations within the blocks that are not natively supported. The PR simply changes `recurse=false` to `recurse=true`.\\r\\n\\r\\n### Details and comments\\r\\n\\r\\nThis should fix #14338 and #14254.", "base_commit": "c92f092655dcd5d71a9fd28fed43e5beb85860e6", "resolved_issues": [{"number": 14338, "title": "`TranspilerError` occurs when transpiling a circuit with `for_loop`", "body": "### Environment\\n\\n- **Qiskit version**: 2.0.0\\n- **Python version**: 3.13.2\\n- **Operating system**: Windows 11, Version 24H2, Build 26100\\n\\n\\n### What is happening?\\n\\nWhen transpiling a circuit that uses an `for_loop` conditional statement, a `TranspilerError` occurs.\\n```\\nqiskit.transpiler.exceptions.TranspilerError: 'Unable to translate the operations in the circuit: [\"for_loop\", \"clifford\"] to the backend\\\\'s (or manually specified) target basis: {\"mcy\", \"sxdg\", \"rzx\", \"mcx\", \"unitary\", \"switch_case\", \"delay\", \"initialize\", \"h\", \"cswap\", \"mcx_gray\", \"x\", \"reset\", \"u2\", \"crx\", \"diagonal\", \"set_stabilizer\", \"mcp\", \"cu2\", \"save_density_matrix\", \"mcu3\", \"mcrz\", \"pauli\", \"mcsx\", \"cu3\", \"set_density_matrix\", \"set_statevector\", \"z\", \"save_expval_var\", \"save_stabilizer\", \"crz\", \"cp\", \"ry\", \"save_state\", \"measure\", \"save_matrix_product_state\", \"qerror_loc\", \"save_amplitudes\", \"save_superop\", \"save_expval\", \"cy\", \"save_statevector\", \"tdg\", \"mcz\", \"ccx\", \"cz\", \"cu\", \"u3\", \"continue_loop\", \"for_loop\", \"t\", \"mcu1\", \"quantum_channel\", \"save_statevector_dict\", \"roerror\", \"ecr\", \"cu1\", \"if_else\", \"s\", \"cry\", \"save_unitary\", \"cx\", \"mcphase\", \"ccz\", \"superop\", \"store\", \"mcrx\", \"u1\", \"set_unitary\", \"save_clifford\", \"rxx\", \"set_matrix_product_state\", \"rz\", \"mcu\", \"mcry\", \"u\", \"break_loop\", \"rx\", \"sx\", \"save_amplitudes_sq\", \"sdg\", \"csx\", \"ryy\", \"p\", \"id\", \"mcu2\", \"save_probabilities\", \"multiplexer\", \"save_probabilities_dict\", \"while_loop\", \"kraus\", \"r\", \"set_superop\", \"y\", \"rzz\", \"swap\", \"mcswap\", \"mcr\", \"barrier\", \"snapshot\"}. This likely means the target basis is not universal or there are additional equivalence rules needed in the EquivalenceLibrary being used. For more details on this error see: https://docs.quantum.ibm.com/api/qiskit/qiskit.transpiler.passes. BasisTranslator#translation-errors'\\n```\\n\\n### How can we reproduce the issue?\\n\\nMinimal Working Example: \\n```\\nfrom qiskit import QuantumCircuit, QuantumRegister, ClassicalRegister, transpile\\nfrom qiskit_aer import Aer\\nfrom qiskit.transpiler.passes import *\\nfrom qiskit.transpiler import PassManager\\n\\nqreg = QuantumRegister(5)\\ncreg = ClassicalRegister(5)\\nqc = QuantumCircuit(qreg, creg)\\n\\nwith qc.for_loop(range(5)) as i:\\n\\tqc.cx(4, 3)\\n\\tqc.cz(0, 4)\\n\\nqc.measure(qreg[0], creg[0])\\n\\nsimulator = Aer.get_backend(\"aer_simulator\")\\n\\np = PassManager(CollectCliffords())\\nqc = p.run(qc)\\n\\ncompiled_circuit = transpile(qc, backend = simulator, optimization_level = 3, routing_method = \"sabre\", layout_method = \"noise_adaptive\", approximation_degree = 1 )\\njob = simulator.run(compiled_circuit, shots=10000)\\nresult = job.result().get_counts()\\nprint(result)\\n```\\n\\n### What should happen?\\n\\nThe circuit should be successfully transpiled and executed. \\n\\n### Any suggestions?\\n\\n_No response_"}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/qiskit_m_qiskit:pr-14349", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/crates/transpiler/src/passes/high_level_synthesis.rs b/crates/transpiler/src/passes/high_level_synthesis.rs\\nindex 162a23ce890d..a434efdec012 100644\\n--- a/crates/transpiler/src/passes/high_level_synthesis.rs\\n+++ b/crates/transpiler/src/passes/high_level_synthesis.rs\\n@@ -333,7 +333,7 @@ fn all_instructions_supported(\\n data: &Bound<HighLevelSynthesisData>,\\n dag: &DAGCircuit,\\n ) -> PyResult<bool> {\\n- let ops = dag.count_ops(py, false)?;\\n+ let ops = dag.count_ops(py, true)?;\\n let mut op_keys = ops.keys();\\n \\n let borrowed_data = data.borrow();\\ndiff --git a/releasenotes/notes/fix-hls-fast-return-6daff39a5eba40ce.yaml b/releasenotes/notes/fix-hls-fast-return-6daff39a5eba40ce.yaml\\nnew file mode 100644\\nindex 000000000000..70abdd361183\\n--- /dev/null\\n+++ b/releasenotes/notes/fix-hls-fast-return-6daff39a5eba40ce.yaml\\n@@ -0,0 +1,7 @@\\n+---\\n+fixes:\\n+ - |\\n+ Fixed a problem in :class:`.HighLevelSynthesis` transpiler pass that caused\\n+ it to erroneously terminate early on certain circuits with control flow\\n+ operations.\\n+ Fixed `#14338 <https://github.com/Qiskit/qiskit-terra/issues/14338>`__\\n"}, "test": {"test_patch": "diff --git a/test/python/transpiler/test_high_level_synthesis.py b/test/python/transpiler/test_high_level_synthesis.py\\nindex 25ee44270553..8999fb8408d7 100644\\n--- a/test/python/transpiler/test_high_level_synthesis.py\\n+++ b/test/python/transpiler/test_high_level_synthesis.py\\n@@ -742,6 +742,21 @@ def test_track_global_phase(self):\\n expected_block.cx(0, 1)\\n self.assertEqual(transpiled_block, expected_block)\\n \\n+ def test_control_flow(self):\\n+ \"\"\"Test that the pass recurses into control-flow ops.\"\"\"\\n+ clifford_circuit = QuantumCircuit(3)\\n+ clifford_circuit.cx(1, 0)\\n+ clifford_circuit.cz(0, 2)\\n+ cliff = Clifford(clifford_circuit)\\n+\\n+ qc = QuantumCircuit(5, 5)\\n+ with qc.for_loop(range(3)):\\n+ qc.append(cliff, [0, 1, 4])\\n+\\n+ transpiled = HighLevelSynthesis(basis_gates=[\"cx\", \"u\", \"for_loop\"])(qc)\\n+ transpiled_block = transpiled[0].operation.blocks[0]\\n+ self.assertNotIn(\"clifford\", transpiled_block.count_ops())\\n+\\n \\n class TestHighLevelSynthesisQuality(QiskitTestCase):\\n \"\"\"Test the \"quality\" of circuits produced by HighLevelSynthesis.\"\"\"\\n", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}185{"question_id": "MSB_Qiskit_qiskit_pr14617", "question_type": "multi_swe_bench", "description": "Fix Sabre extended-set tracking (Qiskit/qiskit#14617)", "content": {"org": "Qiskit", "repo": "qiskit", "pr_number": 14617, "issue_title": "Fix Sabre extended-set tracking", "issue_body": "<!--\\r\\n\u26a0\ufe0f If you do not respect this template, your pull request will be closed.\\r\\n\u26a0\ufe0f Your pull request title should be short detailed and understandable for all.\\r\\n\u26a0\ufe0f Also, please add a release note file using reno if the change needs to be\\r\\n documented in the release notes.\\r\\n\u26a0\ufe0f If your pull request fixes an open issue, please link to the issue.\\r\\n\\r\\n- [ ] I have added the tests to cover my changes.\\r\\n- [ ] I have updated the documentation accordingly.\\r\\n- [ ] I have read the CONTRIBUTING document.\\r\\n-->\\r\\n\\r\\n### Summary\\r\\n\\r\\nThis fixes the logic bug in extended-set tracking where the \"other\" qubit of a gate touched by a swap would not have its tracking data updated during an `apply_swap` operation.\\r\\n\\r\\nThis change has the effect of making the extended-set update operation now linear in the size of the extended set in all cases, whereas previously it was only worst-case linear and average-case constant. This can be offset in the future by modifications to how the \"lookahead\" gates are tracked at all, if it is needed.\\r\\n\\r\\n\\r\\n\\r\\n### Details and comments\\r\\n\\r\\nFix #14244. I'm tagging for 2.2.0 because it's not a correctness bug, so imo it's not worth the risk of changing behaviour in the backport, and it _does_ have performance implications.\\r\\n\\r\\nThis does make it more costly to update a swap in the `ExtendedSet`, and we probably should revisit the struct to make it cheaper. The ASV benchmarks below (with options `-b UtilityScale -b sabre` and `--only-changed`) show that it doesn't seem to have a critical impact on runtime performance, though, at the scale of fixed 20-gate size:\\r\\n\\r\\n```text\\r\\n| Change | Before [3e19a7ad] | After [801295b5] | Ratio | Benchmark (Parameter) |\\r\\n|----------|----------------------|---------------------|---------|----------------------------------------------------------------------------------------------|\\r\\n| - | 148497 | 122160 | 0.82 | qft.LargeQFTMappingTrackBench.track_depth_sabre_swap(1081, 'lookahead') |\\r\\n| - | 3358 | 2827 | 0.84 | qft.LargeQFTMappingTrackBench.track_depth_sabre_swap(115, 'lookahead') |\\r\\n| - | 31891 | 27395 | 0.86 | qft.LargeQFTMappingTrackBench.track_depth_sabre_swap(409, 'lookahead') |\\r\\n| - | 6360 | 5337 | 0.84 | quantum_volume.LargeQuantumVolumeMappingTrackBench.track_depth_sabre_swap(1081, 10, 'decay') |\\r\\n| - | 203\u00b110ms | 157\u00b17ms | 0.77 | queko.QUEKOTranspilerBench.time_transpile_bss(3, 'sabre') |\\r\\n| - | 666 | 592 | 0.89 | queko.QUEKOTranspilerBench.track_depth_bntf_optimal_depth_25(0, 'sabre') |\\r\\n| - | 230 | 198 | 0.86 | queko.QUEKOTranspilerBench.track_depth_bntf_optimal_depth_25(2, 'sabre') |\\r\\n| - | 197 | 165 | 0.84 | queko.QUEKOTranspilerBench.track_depth_bntf_optimal_depth_25(3, 'sabre') |\\r\\n| - | 765 | 671 | 0.88 | queko.QUEKOTranspilerBench.track_depth_bss_optimal_depth_100(0, 'sabre') |\\r\\n| - | 505 | 392 | 0.78 | queko.QUEKOTranspilerBench.track_depth_bss_optimal_depth_100(1, 'sabre') |\\r\\n| Change | Before [3e19a7ad] | After [801295b5] | Ratio | Benchmark (Parameter) |\\r\\n|----------|----------------------|---------------------|---------|---------------------------------------------------------------------------------------------|\\r\\n| + | 428\u00b14ms | 479\u00b13ms | 1.12 | mapping_passes.PassBenchmarks.time_sabre_layout(5, 1024) |\\r\\n| + | 3239 | 3807 | 1.18 | qft.LargeQFTMappingTrackBench.track_depth_sabre_swap(115, 'decay') |\\r\\n| + | 1.35\u00b10.01s | 1.61\u00b10.01s | 1.19 | quantum_volume.LargeQuantumVolumeMappingTimeBench.time_sabre_swap(1081, 10, 'decay') |\\r\\n| + | 1396 | 1667 | 1.19 | quantum_volume.LargeQuantumVolumeMappingTrackBench.track_depth_sabre_swap(409, 10, 'decay') |\\r\\n| + | 262 | 330 | 1.26 | queko.QUEKOTranspilerBench.track_depth_bss_optimal_depth_100(2, 'sabre') |\\r\\n| + | 2053 | 2321 | 1.13 | utility_scale.UtilityScaleBenchmarks.track_qft_depth('cx') |\\r\\n| + | 2053 | 2321 | 1.13 | utility_scale.UtilityScaleBenchmarks.track_qft_depth('cz') |\\r\\n| + | 2053 | 2320 | 1.13 | utility_scale.UtilityScaleBenchmarks.track_qft_depth('ecr') |\\r\\n```", "base_commit": "7c3890da097c851876b86453a1da6ee7d3208048", "resolved_issues": [{"number": 14244, "title": "ExtendSet.apply_swap can break bidirectional consistency of qubit connections", "body": "### Environment\\n\\n- **Qiskit version**: Tested on 1.2.4, should still be the case in the lastest versions given that the concerned functions have not changed since.\\n- **Python version**: 3.10.12 \\n\\n\\n### What is happening?\\n\\nThe apply_swap method of the ExtendedSet structure (defined in crates/accelerate/src/sabre/layer.rs) currently only updates the adjacency lists for the two qubits being swapped. It does not update references to these qubits elsewhere in the data structure, which can result in inconsistent or broken bidirectional connections.\\n\\n### How can we reproduce the issue?\\n\\nAny call the the apply_set method will have this error. Simply printing the ExtendedSet right before and right after the call to this method allow to see the bug. \\nDown below is a copy of the ExtendedSet struct from crates/accelerate/src/sabre/layer.rs reduced to only the necessary methods and simplied using simple datatype (u32 rather than PhysicalQubit) for simplicity. Compiling and executing this code show the error as ExtendedSet after the apply_swap call doesn't respect the bidirectional connection rule.\\n\\n```\\npub struct ExtendedSetDebug {\\n qubits: Vec<Vec<usize>>,\\n}\\n\\nimpl ExtendedSetDebug {\\n pub fn new(num_qubits: u32) -> Self {\\n ExtendedSetDebug {\\n qubits: vec![Vec::new(); num_qubits as usize],\\n }\\n }\\n\\tpub fn qubits(&self) -> &[Vec<usize>] {\\n\\t&self.qubits\\n }\\n\\t\\n\\t/// Add a node and its active qubits to the extended set.\\n pub fn push(&mut self, qubits: [usize; 2]) {\\n let [a, b] = qubits;\\n self.qubits[a].push(b);\\n self.qubits[b].push(a);\\n }\\n\\n\\tpub fn apply_swap(&mut self, swap: [usize; 2]) {\\n\\t\\tlet [a, b] = swap;\\n\\t\\t\\n\\t\\tfor other in self.qubits[a].iter_mut() {\\n\\t\\t\\tif *other == b {\\n\\t\\t\\t\\t*other = a;\\n\\t\\t\\t}\\n\\t\\t}\\n\\t\\t\\n\\t\\tfor other in self.qubits[b].iter_mut() {\\n\\t\\t\\tif *other == a {\\n\\t\\t\\t\\t*other = b;\\n\\t\\t\\t}\\n\\t\\t}\\n\\t\\t\\n\\t\\tself.qubits.swap(a, b);\\n\\t}\\n}\\n\\nfn main() {\\n println!(\"Hello, world!\");\\n\\tlet mut L = ExtendedSetDebug::new(3);\\n\\tL.push([0,1]);\\n\\tL.push([0,2]);\\n\\t\\n\\tprintln!(\"{:?}\",L.qubits());\\t\\n\\tL.apply_swap([0,2]);\\t\\n\\tprintln!(\"{:?}\",L.qubits());\\t\\t\\n}\\n```\\n\\n### What should happen?\\n\\nLet's take the example of the previous code:\\nApplying the swap [0,2] to qubits = [[1,2],[0],[0]] leads to qubits = [[2],[0],[1,0]]. Bidirectional connections is broken since this result say that qubit 0 interacts only with qubit 2 (qubits[0] = [2]) but it also says that qubit 1 interacts with qubit 0 (qubits[1] = [0]). \\nInstead, the result should be [[2], [2], [1,0]] which preserves the bidirectional connections of qubit interactions.\\n\\nNote that this happens for pretty much any call to apply_swap and that this is only one example.\\n\\n### Any suggestions?\\n\\nUpdate the implementation to iterate through all qubit adjacency lists and update every reference to a or b, not just those of a and b.\\n\\n```\\npub fn apply_swap(&mut self, swap: [PhysicalQubit; 2]) {\\n let [a, b] = swap;\\n let a_idx = a.index();\\n let b_idx = b.index();\\n\\n // Iterate through *all* qubits and update references\\n for neighbors in self.qubits.iter_mut() {\\n for qubit in neighbors.iter_mut() {\\n if *qubit == a {\\n *qubit = b;\\n } else if *qubit == b {\\n *qubit = a;\\n }\\n }\\n }\\n self.qubits.swap(a_idx, b_idx);\\n }\\n```"}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/qiskit_m_qiskit:pr-14617", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/crates/transpiler/src/passes/sabre/layer.rs b/crates/transpiler/src/passes/sabre/layer.rs\\nindex 328ca4341fd3..243f10958a6c 100644\\n--- a/crates/transpiler/src/passes/sabre/layer.rs\\n+++ b/crates/transpiler/src/passes/sabre/layer.rs\\n@@ -236,14 +236,14 @@ impl ExtendedSet {\\n /// Apply a physical swap to the current layout data structure.\\n pub fn apply_swap(&mut self, swap: [PhysicalQubit; 2]) {\\n let [a, b] = swap;\\n- for other in self.qubits[a.index()].iter_mut() {\\n- if *other == b {\\n- *other = a\\n- }\\n- }\\n- for other in self.qubits[b.index()].iter_mut() {\\n+ // This effectively iterates twice through each element of the extended set, which is a\\n+ // complexity bottleneck if the extended set scales with the size of the circuit. We should\\n+ // find a new structure that makes these updates more efficient.\\n+ for other in self.qubits.iter_mut().flat_map(|others| others.iter_mut()) {\\n if *other == a {\\n- *other = b\\n+ *other = b;\\n+ } else if *other == b {\\n+ *other = a;\\n }\\n }\\n self.qubits.swap(a.index(), b.index());\\ndiff --git a/releasenotes/notes/sabre-extended-set-fix-0b168b2e643a77af.yaml b/releasenotes/notes/sabre-extended-set-fix-0b168b2e643a77af.yaml\\nnew file mode 100644\\nindex 000000000000..88aefbc01711\\n--- /dev/null\\n+++ b/releasenotes/notes/sabre-extended-set-fix-0b168b2e643a77af.yaml\\n@@ -0,0 +1,7 @@\\n+---\\n+fixes:\\n+ - |\\n+ A logic bug in the extended-set tracking for the ``lookahead`` heuristic in Sabre routing\\n+ previously causing its tracking to become self-inconsistent has been fixed. This did not affect\\n+ the correctness of the compiler, but caused the heuristic to not measure what it was intended to\\n+ measure. See `#14244 <https://github.com/Qiskit/qiskit/issues/14244>`__ for more detail.\\n"}, "test": {"test_patch": "diff --git a/test/python/transpiler/test_sabre_layout.py b/test/python/transpiler/test_sabre_layout.py\\nindex 61407d4c4c8d..a5aaa5687a85 100644\\n--- a/test/python/transpiler/test_sabre_layout.py\\n+++ b/test/python/transpiler/test_sabre_layout.py\\n@@ -270,7 +270,7 @@ def test_layout_many_search_trials(self):\\n self.assertIsInstance(res, QuantumCircuit)\\n layout = res._layout.initial_layout\\n self.assertEqual(\\n- [layout[q] for q in qc.qubits], [0, 12, 7, 8, 6, 3, 1, 10, 4, 9, 2, 11, 13, 5]\\n+ [layout[q] for q in qc.qubits], [26, 19, 16, 23, 14, 15, 25, 20, 22, 17, 24, 21, 13, 18]\\n )\\n \\n def test_support_var_with_rust_fastpath(self):\\n@@ -519,7 +519,7 @@ def test_integration_with_pass_manager(self):\\n qct_initial_layout = qct.layout.initial_layout\\n self.assertEqual(\\n [qct_initial_layout[q] for q in self.circuit.qubits],\\n- [8, 7, 12, 13, 18, 19, 17, 16, 11, 10, 5, 6, 1, 2, 3, 9],\\n+ [2, 3, 8, 7, 12, 13, 14, 18, 17, 16, 15, 11, 10, 5, 6, 1],\\n )\\n \\n \\n", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}186{"question_id": "MSB_Qiskit_qiskit_pr14623", "question_type": "multi_swe_bench", "description": "Fix `ElidePermutations` pass in the presence of `PermutationGate`s (backport #14603) (Qiskit/qiskit#14623)", "content": {"org": "Qiskit", "repo": "qiskit", "pr_number": 14623, "issue_title": "Fix `ElidePermutations` pass in the presence of `PermutationGate`s (backport #14603)", "issue_body": "\\n\\n### Summary\\n\\nFixes #14602.\\n\\n### Details and comments\\n\\nThe `ElidePermutations` transpiler pass removes swap gates and permutation gates from the circuit, tracking the current permutation of the qubits using the internal variable ``mapping``. Previously, this mapping was not updated correctly in the presence of permutation gates, leading to incorrect output circuits and updates to the pass manager's property set (namely, to ``\"virtual_permutation_layout\"``).\\n\\nThe correct update rule should be $$M [ Q [i] ] \\\\leftarrow M [Q [ P[i] ] ]$$ for $i=1,\\\\dots,k$, where $M$ is the current mapping within the `ElidePermutations` pass, $Q$ is the set of qubits the permutation gate is defined on, and $P$ is the \"permutation pattern\" of the permutation gate (stating which qubits get mapped to positions $0$, $1$, etc. when the permutation gate is applied). <hr>This is an automatic backport of pull request #14603 done by [Mergify](https://mergify.com).", "base_commit": "58a5a471f310a6eef8519f773de948c368918009", "resolved_issues": [{"number": 14602, "title": "ElidePermutations does not work correctly with PermutationGates", "body": "### Environment\\n\\n- **Qiskit version**: 2.0+\\n- **Python version**: \\n- **Operating system**: \\n\\n\\n### What is happening?\\n\\nThe Rust version of the `ElidePermutations` transpiler pass does not work correctly when the circuit contains `PermutationGate`s.\\n\\n### How can we reproduce the issue?\\n\\nConsider the following code snippet:\\n\\n```\\nfrom qiskit.circuit import QuantumCircuit\\nfrom qiskit.transpiler import PassManager\\nfrom qiskit.transpiler.passes import ElidePermutations\\n\\nqc = QuantumCircuit(5)\\nqc.h(1)\\nqc.swap(1, 2)\\n\\npm = PassManager([ElidePermutations()])\\nres = pm.run(qc)\\nprint(res.layout.final_index_layout())\\n```\\nThe `ElidePermutations` transpiler pass removes the swap gate and instead updates the ``\"final_layout\"`` property of the pass manager. Printing the ``final_index_layout`` outputs ``[0, 2, 1, 3, 4]``, which is correct.\\n\\nNow, let's modify the code snippet as follows:\\n\\n```\\nfrom qiskit.circuit import QuantumCircuit\\nfrom qiskit.transpiler import PassManager\\nfrom qiskit.transpiler.passes import ElidePermutations\\nfrom qiskit.circuit.library import PermutationGate\\n\\nqc = QuantumCircuit(5)\\nqc.h(1)\\nqc.swap(1, 2)\\nqc.append(PermutationGate([0, 1, 2]), [1, 2, 3])\\n\\npm = PassManager([ElidePermutations()])\\nres = pm.run(qc)\\nprint(res.layout.final_index_layout())\\n```\\nNote that the permutation gate does not do anything -- it's the identity permutation of 3 qubits. However, the ``final_index_layout`` is now ``[0, 1, 2, 3, 4]``.\\n\\nThe core of the problem is that the ``mapping`` in ``elide_permutations.rs`` is not updated correctly in the presence of permutation gates. Also note that the problem is worse than just an incorrect final layout: as soon as the ``mapping`` becomes incorrect, the following gates are not placed correctly by the pass.\\n\\n\\n### What should happen?\\n\\nThe ElidePermutations pass should work correctly.\\n\\n### Any suggestions?\\n\\nI am going to submit a PR fixing this problem shortly. "}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/qiskit_m_qiskit:pr-14623", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/crates/transpiler/src/passes/elide_permutations.rs b/crates/transpiler/src/passes/elide_permutations.rs\\nindex 0db7e4ec45bf..59fa92a542b2 100644\\n--- a/crates/transpiler/src/passes/elide_permutations.rs\\n+++ b/crates/transpiler/src/passes/elide_permutations.rs\\n@@ -63,17 +63,13 @@ pub fn run_elide_permutations(\\n .map(|q| q.index())\\n .collect();\\n \\n- let remapped_qindices: Vec<usize> = (0..qindices.len())\\n- .map(|i| pattern[i])\\n- .map(|i| qindices[i as usize])\\n+ let new_values: Vec<usize> = (0..qindices.len())\\n+ .map(|i| mapping[qindices[pattern[i] as usize]])\\n .collect();\\n \\n- qindices\\n- .iter()\\n- .zip(remapped_qindices.iter())\\n- .for_each(|(old, new)| {\\n- mapping[*old] = *new;\\n- });\\n+ for i in 0..qindices.len() {\\n+ mapping[qindices[i]] = new_values[i];\\n+ }\\n } else {\\n unreachable!();\\n }\\ndiff --git a/releasenotes/notes/fix-elide-permutation-gates-e4d2a718e1d50afa.yaml b/releasenotes/notes/fix-elide-permutation-gates-e4d2a718e1d50afa.yaml\\nnew file mode 100644\\nindex 000000000000..1a1f1282fe6e\\n--- /dev/null\\n+++ b/releasenotes/notes/fix-elide-permutation-gates-e4d2a718e1d50afa.yaml\\n@@ -0,0 +1,7 @@\\n+---\\n+fixes:\\n+ - |\\n+ Fixed a bug in the :class:`.ElidePermutation` transpiler pass, where\\n+ the qubit mapping was not updated correctly in the presence of\\n+ :class:`.PermutationGate`\\\\s, leading to incorrect circuits and\\n+ updates to the pass manager's property set.\\n"}, "test": {"test_patch": "diff --git a/test/python/transpiler/test_elide_permutations.py b/test/python/transpiler/test_elide_permutations.py\\nindex dd59903db5ef..224fdd37cf03 100644\\n--- a/test/python/transpiler/test_elide_permutations.py\\n+++ b/test/python/transpiler/test_elide_permutations.py\\n@@ -12,6 +12,7 @@\\n \\n \"\"\"Test ElidePermutations pass\"\"\"\\n \\n+import itertools\\n import unittest\\n \\n from qiskit.circuit.quantumcircuit import QuantumCircuit\\n@@ -20,6 +21,7 @@\\n from qiskit.transpiler.passes.routing import StarPreRouting\\n from qiskit.circuit.controlflow import IfElseOp\\n from qiskit.quantum_info import Operator\\n+from qiskit.transpiler.passmanager import PassManager\\n from qiskit.transpiler.coupling import CouplingMap\\n from qiskit.transpiler.preset_passmanagers import generate_preset_pass_manager\\n from test import QiskitTestCase # pylint: disable=wrong-import-order\\n@@ -366,6 +368,20 @@ def test_unitary_equivalence(self):\\n res = spm.run(qc)\\n self.assertTrue(Operator.from_circuit(res).equiv(Operator(qc)))\\n \\n+ def test_unitary_equivalence_permutation_gates(self):\\n+ \"\"\"Test unitary equivalence of the original and transpiled circuits.\"\"\"\\n+\\n+ for perm in itertools.permutations([0, 1, 2]):\\n+ qc = QuantumCircuit(5)\\n+ qc.h(1)\\n+ qc.swap(1, 2)\\n+ qc.swap(4, 3)\\n+ qc.append(PermutationGate(perm), [1, 2, 3])\\n+\\n+ pm = PassManager([ElidePermutations()])\\n+ res = pm.run(qc)\\n+ self.assertEqual(Operator.from_circuit(res), (Operator(qc)))\\n+\\n def test_unitary_equivalence_routing_and_basis_translation(self):\\n \"\"\"Test on a larger example that includes routing and basis translation.\"\"\"\\n \\n", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}187{"question_id": "MSB_Qiskit_qiskit_pr14636", "question_type": "multi_swe_bench", "description": "Fixes for dimacs-related boolean expression code (Qiskit/qiskit#14636)", "content": {"org": "Qiskit", "repo": "qiskit", "pr_number": 14636, "issue_title": "Fixes for dimacs-related boolean expression code", "issue_body": "<!--\\r\\n\u26a0\ufe0f If you do not respect this template, your pull request will be closed.\\r\\n\u26a0\ufe0f Your pull request title should be short detailed and understandable for all.\\r\\n\u26a0\ufe0f Also, please add a release note file using reno if the change needs to be\\r\\n documented in the release notes.\\r\\n\u26a0\ufe0f If your pull request fixes an open issue, please link to the issue.\\r\\n\\r\\n- [ ] I have added the tests to cover my changes.\\r\\n- [ ] I have updated the documentation accordingly.\\r\\n- [ ] I have read the CONTRIBUTING document.\\r\\n-->\\r\\n\\r\\n### Summary\\r\\nThis PR fixes a bug in the code for creating phase and bit-flip oracles from DIMACS files.\\r\\n\\r\\nFixes #14634\\r\\n\\r\\n\\r\\n### Details and comments\\r\\nCurrently, oracles are generated from DIMACS files by using `BooleanExpression.from_dimacs` to generate an expression and pass it to the init of the oracle. However, the init currently expects a string representing a boolean expression, not the expression itself.\\r\\n\\r\\nThis PR changes the behavior such that the oracles can be initialized from a `BooleanExpression` object, and slightly improves DIMACS parsing.\\r\\n\\r\\n", "base_commit": "f69461bca39e138767e2201c8578cce78b27faa6", "resolved_issues": [{"number": 14634, "title": "`PhaseOracle` fails to instantiate from a Dimacs file", "body": "### Environment\\n\\n- **Qiskit version**: 2.0.2 (can't reproduce with 1.4.1)\\n- **Python version**: 3.13.3\\n- **Operating system**: Arch Linux\\n\\n\\n### What is happening?\\n\\nTrying to instantiate a `PhaseOracle` using a Dimacs file via the `PhaseOracle.from_dimacs_file` method results in a `TypeError`.\\n\\n### How can we reproduce the issue?\\n\\n```python\\nimport os\\nimport tempfile\\nfrom qiskit.circuit.library.phase_oracle import PhaseOracle\\n\\ninput_3sat_instance = \"\"\"\\nc DIMACS CNF file with 3 satisfying assignments: 1 -2 3, -1 -2 -3, 1 2 -3.\\np cnf 3 5\\n-1 -2 -3 0\\n1 -2 3 0\\n1 2 -3 0\\n1 -2 -3 0\\n-1 2 3 0\\n\"\"\"\\n\\nwith open(\"tmpfile\", 'w') as f:\\n f.write(input_3sat_instance)\\n\\noracle = PhaseOracle.from_dimacs_file(\"tmpfile\")\\n```\\n\\n### What should happen?\\n\\nThe `PhaseOracle` should be instantiated without error.\\n\\n### Any suggestions?\\n\\n_No response_"}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/qiskit_m_qiskit:pr-14636", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/qiskit/circuit/library/bit_flip_oracle.py b/qiskit/circuit/library/bit_flip_oracle.py\\nindex fbd45c11a4c2..c342a6e27ed1 100644\\n--- a/qiskit/circuit/library/bit_flip_oracle.py\\n+++ b/qiskit/circuit/library/bit_flip_oracle.py\\n@@ -52,23 +52,27 @@ class BitFlipOracleGate(Gate):\\n \\n def __init__(\\n self,\\n- expression: str,\\n+ expression: str | BooleanExpression,\\n var_order: list[str] | None = None,\\n label: str | None = None,\\n ) -> None:\\n \"\"\"\\n Args:\\n- expression: A Python-like boolean expression.\\n+ expression: A Python-like boolean expression string or a `BooleanExpression` object.\\n var_order: A list with the order in which variables will be created.\\n (default: by appearance)\\n label: A label for the gate to display in visualizations. Per default, the label is\\n set to display the textual represntation of the boolean expression (truncated if needed)\\n \"\"\"\\n- self.boolean_expression = BooleanExpression(expression, var_order=var_order)\\n-\\n if label is None:\\n- short_expr_for_name = (expression[:15] + \"...\") if len(expression) > 15 else expression\\n- label = short_expr_for_name\\n+ if isinstance(expression, str):\\n+ label = (expression[:15] + \"...\") if len(expression) > 15 else expression\\n+ else:\\n+ label = \"Boolean Expression\"\\n+\\n+ if isinstance(expression, str):\\n+ expression = BooleanExpression(expression, var_order=var_order)\\n+ self.boolean_expression = expression\\n \\n super().__init__(\\n name=\"Bit-flip Oracle\",\\ndiff --git a/qiskit/circuit/library/phase_oracle.py b/qiskit/circuit/library/phase_oracle.py\\nindex 4b687976b296..96ccc58a798e 100644\\n--- a/qiskit/circuit/library/phase_oracle.py\\n+++ b/qiskit/circuit/library/phase_oracle.py\\n@@ -57,17 +57,19 @@ class PhaseOracle(QuantumCircuit):\\n )\\n def __init__(\\n self,\\n- expression: str,\\n+ expression: str | BooleanExpression,\\n var_order: list[str] | None = None,\\n ) -> None:\\n \"\"\"\\n Args:\\n- expression: A Python-like boolean expression.\\n+ expression: A Python-like boolean expression string or a `BooleanExpression` object.\\n var_order: A list with the order in which variables will be created.\\n (default: by appearance)\\n \"\"\"\\n \\n- self.boolean_expression = BooleanExpression(expression, var_order=var_order)\\n+ if isinstance(expression, str):\\n+ expression = BooleanExpression(expression, var_order=var_order)\\n+ self.boolean_expression = expression\\n oracle = self.boolean_expression.synth(circuit_type=\"phase\")\\n \\n super().__init__(oracle.num_qubits, name=\"Phase Oracle\")\\n@@ -168,23 +170,27 @@ class PhaseOracleGate(Gate):\\n \\n def __init__(\\n self,\\n- expression: str,\\n+ expression: str | BooleanExpression,\\n var_order: list[str] | None = None,\\n label: str | None = None,\\n ) -> None:\\n \"\"\"\\n Args:\\n- expression: A Python-like boolean expression.\\n+ expression: A Python-like boolean expression string or a `BooleanExpression` object.\\n var_order: A list with the order in which variables will be created.\\n (default: by appearance)\\n label: A label for the gate to display in visualizations. Per default, the label is\\n set to display the textual represntation of the boolean expression (truncated if needed)\\n \"\"\"\\n- self.boolean_expression = BooleanExpression(expression, var_order=var_order)\\n-\\n if label is None:\\n- short_expr_for_name = (expression[:15] + \"...\") if len(expression) > 15 else expression\\n- label = short_expr_for_name\\n+ if isinstance(expression, str):\\n+ label = (expression[:15] + \"...\") if len(expression) > 15 else expression\\n+ else:\\n+ label = \"Boolean Expression\"\\n+\\n+ if isinstance(expression, str):\\n+ expression = BooleanExpression(expression, var_order=var_order)\\n+ self.boolean_expression = expression\\n \\n super().__init__(\\n name=\"Phase Oracle\",\\ndiff --git a/qiskit/synthesis/boolean/boolean_expression.py b/qiskit/synthesis/boolean/boolean_expression.py\\nindex 5122dbf9637d..1aaa348d16e8 100644\\n--- a/qiskit/synthesis/boolean/boolean_expression.py\\n+++ b/qiskit/synthesis/boolean/boolean_expression.py\\n@@ -191,8 +191,9 @@ def from_dimacs(dimacs: str):\\n \"\"\"\\n header_regex = re.compile(r\"p\\\\s+cnf\\\\s+(\\\\d+)\\\\s+(\\\\d+)\")\\n clause_regex = re.compile(r\"(-?\\\\d+)\")\\n+ lines = [line.strip() for line in dimacs.split(\"\\\\n\")]\\n lines = [\\n- line for line in dimacs.split(\"\\\\n\") if not line.startswith(\"c\") and line != \"\"\\n+ line for line in lines if not line.startswith(\"c\") and line != \"\"\\n ] # DIMACS comment line start with c\\n header_match = header_regex.match(lines[0])\\n if not header_match:\\ndiff --git a/releasenotes/notes/fix-dimacs-load-c48f4d08062ade74.yaml b/releasenotes/notes/fix-dimacs-load-c48f4d08062ade74.yaml\\nnew file mode 100644\\nindex 000000000000..98a708d5f0c1\\n--- /dev/null\\n+++ b/releasenotes/notes/fix-dimacs-load-c48f4d08062ade74.yaml\\n@@ -0,0 +1,5 @@\\n+---\\n+fixes:\\n+ - |\\n+ Fixed a bug in :class:`.PhaseOracle`, :class:`.PhaseOracleGate` and :class:`.BitFlipOracleGate`\\n+ where trying to load from dimacs file raised a TypeError.\\n\\\\ No newline at end of file\\n"}, "test": {"test_patch": "diff --git a/test/python/circuit/library/test_phase_and_bitflip_oracles.py b/test/python/circuit/library/test_phase_and_bitflip_oracles.py\\nindex ca67c6d232f3..71e209124c8d 100644\\n--- a/test/python/circuit/library/test_phase_and_bitflip_oracles.py\\n+++ b/test/python/circuit/library/test_phase_and_bitflip_oracles.py\\n@@ -13,6 +13,7 @@\\n \"\"\"Test the phase and bit-flip oracle circuits.\"\"\"\\n \\n import unittest\\n+import tempfile\\n from ddt import ddt, data, unpack\\n from numpy import sqrt, isclose\\n \\n@@ -109,6 +110,28 @@ def test_variable_order(self, expression, var_order, good_states):\\n self.assertListEqual(expected_valid, result_valid)\\n self.assertListEqual(expected_invalid, result_invalid)\\n \\n+ def test_from_dimacs_file(self):\\n+ \"\"\"Initializing from DIMACS file\"\"\"\\n+ input_3sat_instance = \"\"\"\\n+ c DIMACS CNF file with 3 satisfying assignments: 1 -2 3, -1 -2 -3, 1 2 -3.\\n+ p cnf 3 5\\n+ -1 -2 -3 0\\n+ 1 -2 3 0\\n+ 1 2 -3 0\\n+ 1 -2 -3 0\\n+ -1 2 3 0\\n+ \"\"\"\\n+ filename = tempfile.mkstemp(suffix=\".dimacs\")[1]\\n+ with open(filename, \"w\") as file:\\n+ file.write(input_3sat_instance)\\n+ for use_gate in [True, False]:\\n+ if use_gate:\\n+ oracle = PhaseOracleGate.from_dimacs_file(filename)\\n+ else:\\n+ with self.assertWarns(DeprecationWarning):\\n+ oracle = PhaseOracle.from_dimacs_file(filename)\\n+ self.assertEqual(oracle.num_qubits, 3)\\n+\\n \\n @ddt\\n class TestBitFlipOracleGate(QiskitTestCase):\\n@@ -180,6 +203,23 @@ def test_variable_order(self, expression, var_order, truth_table):\\n self.assertListEqual(expected_valid, result_valid)\\n self.assertListEqual(expected_invalid, result_invalid)\\n \\n+ def test_from_dimacs_file(self):\\n+ \"\"\"Initializing from DIMACS file\"\"\"\\n+ input_3sat_instance = \"\"\"\\n+ c DIMACS CNF file with 3 satisfying assignments: 1 -2 3, -1 -2 -3, 1 2 -3.\\n+ p cnf 3 5\\n+ -1 -2 -3 0\\n+ 1 -2 3 0\\n+ 1 2 -3 0\\n+ 1 -2 -3 0\\n+ -1 2 3 0\\n+ \"\"\"\\n+ filename = tempfile.mkstemp(suffix=\".dimacs\")[1]\\n+ with open(filename, \"w\") as file:\\n+ file.write(input_3sat_instance)\\n+ oracle = BitFlipOracleGate.from_dimacs_file(filename)\\n+ self.assertEqual(oracle.num_qubits, 4)\\n+\\n \\n if __name__ == \"__main__\":\\n unittest.main()\\ndiff --git a/test/python/synthesis/test_boolean.py b/test/python/synthesis/test_boolean.py\\nindex 511e95e9b0e6..f84ad8f7da10 100644\\n--- a/test/python/synthesis/test_boolean.py\\n+++ b/test/python/synthesis/test_boolean.py\\n@@ -169,10 +169,6 @@ def test_quinn(self):\\n def test_bad_formatting(self):\\n \"\"\"Tests DIMACS parsing on edge cases\"\"\"\\n # pylint: disable=trailing-whitespace\\n- dimacs = \"\"\" \\n-p cnf 10 5\"\"\" # first line is not p cnf nor empty nor comment (it has whitespace)\\n- with self.assertRaisesRegex(ValueError, \"First line must start with 'p cnf'\"):\\n- exp = BooleanExpression.from_dimacs(dimacs)\\n dimacs = \"\"\"p cnf 2 1\\n \\n 1 2 0\"\"\" # has empty line with whitespace - should ignore it\\n", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}188{"question_id": "MSB_Qiskit_qiskit_pr14676", "question_type": "multi_swe_bench", "description": "Fix SparsePauliOp.is_unitary() to respect input tolerance values (Qiskit/qiskit#14676)", "content": {"org": "Qiskit", "repo": "qiskit", "pr_number": 14676, "issue_title": "Fix SparsePauliOp.is_unitary() to respect input tolerance values", "issue_body": "Fixes #14107\\r\\n\\r\\n### Summary\\r\\n\\r\\nThis PR fixes an issue where `SparsePauliOp.is_unitary()` was not properly respecting the input tolerance values when checking if an operator is unitary. The method was not passing the tolerance parameters to the internal [simplify()] call.\\r\\n\\r\\n### Details and comments\\r\\n\\r\\nThe main changes in this PR are:\\r\\n\\r\\n1. Modified `SparsePauliOp.is_unitary()` to pass the atol and rtol parameters to the [simplify()] method\\r\\n2. Added a test case that verifies the fix works as expected by:\\r\\n - Creating a matrix that's approximately unitary but not exactly\\r\\n - Verifying it's considered unitary with appropriate tolerances\\r\\n - Verifying it's not considered unitary with very tight tolerances\\r\\n\\r\\n### Testing\\r\\n- [x] I have added the tests to cover my changes.\\r\\n- [x] All tests pass locally with my changes\\r\\n- [x] I have read the CONTRIBUTING document.\\r\\n\\r\\n### Release Notes\\r\\n\\r\\nFixed an issue where `SparsePauliOp.is_unitary()` was not respecting the input tolerance values when checking if an operator is unitary. ", "base_commit": "8e2be846862cd358d2253e8793838a7753267681", "resolved_issues": [{"number": 14107, "title": "SparsePauliOp.is_unitary() doesn't respect the input tolerance values", "body": "### Environment\\n\\n- **Qiskit version**: the main branch\\n- **Python version**: -\\n- **Operating system**: - \\n\\n\\n### What is happening?\\n\\nThe comment of the method said the tolerance is used to check if the values are zero, but the implementation actually only used the tolerance to check if the coefficient of the identity operator is one.\\n\\nThe tolerance values should be propagated to SparsePauliOp.simplify() to set the coefficients smaller than the tolerance to zero.\\n\\nhttps://github.com/Qiskit/qiskit/blob/6ce77887008c181f74306887ec494fedd2911a56/qiskit/quantum_info/operators/symplectic/sparse_pauli_op.py#L433-L459\\n\\n### How can we reproduce the issue?\\n\\n```python\\nimport numpy as np\\n\\na = np.array( #\\n [[-9.9801135e-01 + 6.3036762e-02j, 5.6710692e-06 + 8.1099635e-05j],\\n [5.6710610e-06 + 8.1099643e-05j, -9.9707150e-01 + 7.6473624e-02j]])\\nprint(a @ (a.conj().T))\\n# output:\\n# [[ 1.00000029e+00+0.00000000e+00j -2.83078694e-12+2.75849112e-11j]\\n# [-2.83078694e-12-2.75849112e-11j 9.99999798e-01+0.00000000e+00j]]\\npauli_operators = quantum_info.SparsePauliOp.from_operator(a)\\nprint(pauli_operators.compose(pauli_operators.adjoint()).simplify())\\n# output:\\n# SparsePauliOp(['I', 'Z'],\\n# coeffs=[1.00000004e+00+3.95107524e-18j, 2.48406162e-07+0.00000000e+00j])\\nprint(pauli_operators.is_unitary(atol=1e-5, rtol=1e-3))\\n# output: False\\n# expect: True\\n```\\n\\n### What should happen?\\n\\nSee the how to reproduce section.\\n\\n### Any suggestions?\\n\\nChange \\n\\n```python\\n val = self.compose(self.adjoint()).simplify() \\n```\\n\\nto \\n\\n```python\\n val = self.compose(self.adjoint()).simplify(atol=atol, rtol=rtol)\\n```"}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/qiskit_m_qiskit:pr-14676", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/qiskit/quantum_info/operators/symplectic/sparse_pauli_op.py b/qiskit/quantum_info/operators/symplectic/sparse_pauli_op.py\\nindex 6c0ce6608267..91ab65fdf6f6 100644\\n--- a/qiskit/quantum_info/operators/symplectic/sparse_pauli_op.py\\n+++ b/qiskit/quantum_info/operators/symplectic/sparse_pauli_op.py\\n@@ -433,10 +433,14 @@ def _multiply(self, other):\\n def is_unitary(self, atol: float | None = None, rtol: float | None = None) -> bool:\\n \"\"\"Return True if operator is a unitary matrix.\\n \\n+ This method checks whether the operator composed with its adjoint equals\\n+ the identity, up to the provided tolerance. The tolerance is used when\\n+ simplifying the composed operator and checking if the result is the identity.\\n+\\n Args:\\n atol (float): Optional. Absolute tolerance for checking if\\n coefficients are zero (Default: 1e-8).\\n- rtol (float): Optional. relative tolerance for checking if\\n+ rtol (float): Optional. Relative tolerance for checking if\\n coefficients are zero (Default: 1e-5).\\n \\n Returns:\\n@@ -449,7 +453,7 @@ def is_unitary(self, atol: float | None = None, rtol: float | None = None) -> bo\\n rtol = self.rtol\\n \\n # Compose with adjoint\\n- val = self.compose(self.adjoint()).simplify()\\n+ val = self.compose(self.adjoint()).simplify(atol=atol, rtol=rtol)\\n # See if the result is an identity\\n return (\\n val.size == 1\\ndiff --git a/releasenotes/notes/fix-sparse-pauli-op-is-unitary-tolerance-28249b2d55f38284.yaml b/releasenotes/notes/fix-sparse-pauli-op-is-unitary-tolerance-28249b2d55f38284.yaml\\nnew file mode 100644\\nindex 000000000000..c899bb5cbdc0\\n--- /dev/null\\n+++ b/releasenotes/notes/fix-sparse-pauli-op-is-unitary-tolerance-28249b2d55f38284.yaml\\n@@ -0,0 +1,7 @@\\n+fixes:\\n+ - |\\n+ Fixed an issue where :meth:`~qiskit.quantum_info.SparsePauliOp.is_unitary`\\n+ was not properly respecting the input tolerance values when checking if an\\n+ operator is unitary. The method now correctly uses the provided ``atol`` and\\n+ ``rtol`` parameters when simplifying the operator and checking if it equals\\n+ the identity. This fixes `#14107 <https://github.com/Qiskit/qiskit/issues/14107>`__.\\n"}, "test": {"test_patch": "diff --git a/test/python/quantum_info/operators/symplectic/test_sparse_pauli_op.py b/test/python/quantum_info/operators/symplectic/test_sparse_pauli_op.py\\nindex 075313fd2d20..6ff669f7d79d 100644\\n--- a/test/python/quantum_info/operators/symplectic/test_sparse_pauli_op.py\\n+++ b/test/python/quantum_info/operators/symplectic/test_sparse_pauli_op.py\\n@@ -1357,6 +1357,39 @@ def test_simplify_sum_below_tolerance(self):\\n res = op.simplify(atol=1e-7)\\n self.assertEqual(SparsePauliOp([\"II\"], [0j]), res)\\n \\n+ def test_is_unitary_tolerance(self):\\n+ \"\"\"Test that is_unitary respects the input tolerance values.\\n+\\n+ This test verifies that the tolerance parameters are properly passed through\\n+ to the internal operations. See issue #14107.\\n+ \"\"\"\\n+ # Create a matrix that's approximately unitary but not exactly\\n+ a = np.array(\\n+ [\\n+ [-9.9801135e-01 + 6.3036762e-02j, 5.6710692e-06 + 8.1099635e-05j],\\n+ [5.6710610e-06 + 8.1099643e-05j, -9.9707150e-01 + 7.6473624e-02j],\\n+ ]\\n+ )\\n+\\n+ # Verify the matrix is approximately unitary\\n+ identity = a @ a.conj().T\\n+ np.testing.assert_allclose(identity, np.eye(2), atol=1e-5, rtol=1e-3)\\n+\\n+ # Create SparsePauliOp from the matrix\\n+ op = SparsePauliOp.from_operator(a)\\n+\\n+ # Test with tolerance that should pass\\n+ self.assertTrue(\\n+ op.is_unitary(atol=1e-5, rtol=1e-3),\\n+ \"Operator should be considered unitary with given tolerance\",\\n+ )\\n+\\n+ # Test with very small tolerance that should fail\\n+ self.assertFalse(\\n+ op.is_unitary(atol=1e-10, rtol=1e-10),\\n+ \"Operator should not be considered unitary with very small tolerance\",\\n+ )\\n+\\n \\n if __name__ == \"__main__\":\\n unittest.main()\\n", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}189{"question_id": "MSB_Qiskit_qiskit_pr14714", "question_type": "multi_swe_bench", "description": "ObservablesArray fixes: stop over-identification as non-Hermitian, raise for empty observables (Qiskit/qiskit#14714)", "content": {"org": "Qiskit", "repo": "qiskit", "pr_number": 14714, "issue_title": "ObservablesArray fixes: stop over-identification as non-Hermitian, raise for empty observables", "issue_body": "### Summary\\r\\n\\r\\nFix #14567.\\r\\nFix #14614.\\r\\n\\r\\n\\r\\n### Details and comments\\r\\n\\r\\nTo the reviewer: please pay extra care to review the decisions (see details in the issues):\\r\\n- Empty observables are not allowed in `ObservablesArray`.\\r\\n- An extra call to `SparseObservable.simplify` in `ObservablesArray.coerce`..\\r\\n\\r\\n", "base_commit": "6b4477fe2e42047aba7babe4c834f0b22a946737", "resolved_issues": [{"number": 14614, "title": "`EstimatorPub.validate` throws a `StopIteration` when called with a `SparsePauliOp` having nil coefficients", "body": "### Environment\\n\\n- **Qiskit version**: 2.2.0 (Couldn't replicate with 1.4.3 or 2.0.2)\\n- **Python version**: 3.13.3\\n- **Operating system**: Arch Linux\\n\\n\\n### What is happening?\\n\\nOk, this one's kinda fun. When passing a `SparsePauliOp` having nil coefficients to `EstimatorPub.validate`, it throws a `StopIteration`. If you wonder why on earth would you use such operators, they may come up in the computations of some gradients.\\n\\n### How can we reproduce the issue?\\n\\n```python\\nfrom qiskit import QuantumCircuit\\nfrom qiskit.quantum_info import SparsePauliOp\\nfrom qiskit.primitives import StatevectorEstimator\\n\\nop = SparsePauliOp([\"Z\"], [0.])\\nqc = QuantumCircuit(1)\\nStatevectorEstimator().run([(qc, op)])\\n```\\n\\n### What should happen?\\n\\nIt should be possible to run jobs on operators with nil coefficients.\\n\\n### Any suggestions?\\n\\n_No response_"}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/qiskit_m_qiskit:pr-14714", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/qiskit/primitives/containers/observables_array.py b/qiskit/primitives/containers/observables_array.py\\nindex bc2092b321f3..6a9b05148050 100644\\n--- a/qiskit/primitives/containers/observables_array.py\\n+++ b/qiskit/primitives/containers/observables_array.py\\n@@ -106,7 +106,7 @@ def __init__(\\n \\n @staticmethod\\n def _obs_to_dict(obs: SparseObservable) -> Mapping[str, float]:\\n- \"\"\"Convert a sparse observable to a mapping from Pauli strings to coefficients.\"\"\"\\n+ \"\"\"Convert a simplified sparse observable to a mapping from Pauli strings to coefficients.\"\"\"\\n result = {}\\n for sparse_pauli_str, pauli_qubits, coeff in obs.to_sparse_list():\\n \\n@@ -260,7 +260,7 @@ def coerce_observable(cls, observable: ObservableLike) -> SparseObservable:\\n \\n Raises:\\n TypeError: If the input cannot be formatted because its type is not valid.\\n- ValueError: If the input observable is invalid.\\n+ ValueError: If the input observable is invalid or empty.\\n \"\"\"\\n # Pauli-type conversions\\n if isinstance(observable, SparsePauliOp):\\n@@ -282,21 +282,28 @@ def coerce_observable(cls, observable: ObservableLike) -> SparseObservable:\\n observable = SparseObservable.from_list(term_list)\\n \\n if isinstance(observable, SparseObservable):\\n- # Check that the operator has real coeffs\\n+ observable = observable.simplify()\\n+\\n+ # Check that the simplified operator has real coeffs\\n coeffs = np.real_if_close(observable.coeffs)\\n if np.iscomplexobj(coeffs):\\n raise ValueError(\\n- \"Non-Hermitian input observable: the input SparsePauliOp has non-zero\"\\n+ \"Non-Hermitian input observable: the simplified input observable has a non-zero\"\\n \" imaginary part in its coefficients.\"\\n )\\n \\n- return SparseObservable.from_raw_parts(\\n+ observable = SparseObservable.from_raw_parts(\\n observable.num_qubits,\\n coeffs,\\n observable.bit_terms,\\n observable.indices,\\n observable.boundaries,\\n- ).simplify(tol=0)\\n+ )\\n+\\n+ if observable == SparseObservable.zero(observable.num_qubits):\\n+ raise ValueError(\"Empty observable was detected.\")\\n+\\n+ return observable\\n \\n raise TypeError(f\"Invalid observable type: {type(observable)}\")\\n \\ndiff --git a/releasenotes/notes/obs-array-small-fixes-2947927d2eccc633.yaml b/releasenotes/notes/obs-array-small-fixes-2947927d2eccc633.yaml\\nnew file mode 100644\\nindex 000000000000..21885127b647\\n--- /dev/null\\n+++ b/releasenotes/notes/obs-array-small-fixes-2947927d2eccc633.yaml\\n@@ -0,0 +1,5 @@\\n+---\\n+fixes:\\n+ - |\\n+ Fixed a bug in :meth:`.ObservablesArray.coerce_observable` where an exception that an observable was not Hermitian was over-triggered. \\n+ Observables equal to ``zero`` are not allowed and now invoke a graceful failure.\\n\\\\ No newline at end of file\\n"}, "test": {"test_patch": "diff --git a/test/python/primitives/containers/test_observables_array.py b/test/python/primitives/containers/test_observables_array.py\\nindex 808f7925471f..e7836296d6aa 100644\\n--- a/test/python/primitives/containers/test_observables_array.py\\n+++ b/test/python/primitives/containers/test_observables_array.py\\n@@ -626,6 +626,17 @@ def test_sparse_observables_array(self):\\n self.assertEqual(arr2, arr)\\n self.assertEqual(id(arr2), id(arr))\\n \\n+ def test_empty_observable(self):\\n+ \"\"\"Verify that empty observables are not allowed\"\"\"\\n+ with self.assertRaisesRegex(ValueError, \"Empty observable\"):\\n+ ObservablesArray([{\"Z\": 0}])\\n+\\n+ def test_hermitian_after_simplification(self):\\n+ \"\"\"Verify that no error is raised if observables contain complex coefficients\\n+ that get cancelled during simplification\"\"\"\\n+ obs = qi.SparseObservable.from_list([(\"Z\", 1j), (\"Z\", -1j), (\"X\", 1)])\\n+ ObservablesArray(obs)\\n+\\n def test_invalid_basis_type_raises_type_error(self):\\n \"\"\"Test that invalid basis type raises TypeError\"\"\"\\n invalid_basis = {1: \"value\", 2: \"another_value\"} # Invalid keys (integers)\\n", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}190{"question_id": "MSB_Qiskit_qiskit_pr14730", "question_type": "multi_swe_bench", "description": "Fix non-determinism VF2Layout with only 1q gates (Qiskit/qiskit#14730)", "content": {"org": "Qiskit", "repo": "qiskit", "pr_number": 14730, "issue_title": "Fix non-determinism VF2Layout with only 1q gates", "issue_body": "<!--\\r\\n\u26a0\ufe0f If you do not respect this template, your pull request will be closed.\\r\\n\u26a0\ufe0f Your pull request title should be short detailed and understandable for all.\\r\\n\u26a0\ufe0f Also, please add a release note file using reno if the change needs to be\\r\\n documented in the release notes.\\r\\n\u26a0\ufe0f If your pull request fixes an open issue, please link to the issue.\\r\\n\\r\\n- [ ] I have added the tests to cover my changes.\\r\\n- [ ] I have updated the documentation accordingly.\\r\\n- [ ] I have read the CONTRIBUTING document.\\r\\n-->\\r\\n\\r\\n### Summary\\r\\n\\r\\nThis commit fixes an issue in the VF2Layout transpiler pass that would cause a non-deterministic output if the circuit had any qubit that only had single qubit operations. The dedicated internal function to deal with this special case sorts the qubits in the circuit by number of operations and the physical qubits on the target by error rate, to map the qubits with the lowest error rate. However this sorting wasn't fully stable as it was done on a hash set which doesn't have a stable iteration order. This commit fixes this by also sorting based on the qubit index so in the case of a tie the sort is stable.\\r\\n\\r\\n### Details and comments\\r\\n\\r\\nFixes #14729", "base_commit": "6b4477fe2e42047aba7babe4c834f0b22a946737", "resolved_issues": [{"number": 14729, "title": "Transpile with seed_transpiler doesn't yield the same circuit", "body": "### Environment\\n\\n- **Qiskit version**: 2.1.1\\n- **Python version**: 3.12.9\\n- **Operating system**: MacOS\\n\\n### What is happening?\\n\\nTranspiling with a pass manager created with `seed_transpiler` doesn't yield the same circuit after 2.1.\\n\\n### How can we reproduce the issue?\\n\\n```python\\nimport numpy as np\\nfrom qiskit.circuit import ParameterVector, QuantumCircuit\\nfrom qiskit.providers.fake_provider import GenericBackendV2\\nfrom qiskit.transpiler import generate_preset_pass_manager\\n\\nparams = ParameterVector(\"\u03b8\", length=3)\\n\\ncirc = QuantumCircuit(3)\\nfor i, par in enumerate(params):\\n circ.rx(par, i)\\ncirc.measure_all()\\n\\nbackend = GenericBackendV2(10, noise_info=True, seed=123)\\nisa_circs = []\\nfor _ in range(10):\\n pm = generate_preset_pass_manager(optimization_level=2, target=backend.target, seed_transpiler=123)\\n isa_circs.append(pm.run(circ)) \\n\\nassert all(x == isa_circs[0] for x in isa_circs)\\n```\\n\\nThis code works okey with 2.0.\\n\\nWith 2.1.* the pass manger layout is inconsistent.\\n\\n```\\nglobal phase: \u03c0/2\\n \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\u250c\u2500\u2500\u2500\u2500\u2510\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\u250c\u2500\u2500\u2500\u2500\u2510\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510 \u2591 \u250c\u2500\u2510 \\nq_1 -> 0 \u2524 Rz(\u03c0/2) \u251c\u2524 \u221aX \u251c\u2524 Rz(\u03c0 + \u03b8[1]) \u251c\u2524 \u221aX \u251c\u2524 Rz(5\u03c0/2) \u251c\u2500\u2591\u2500\u2500\u2500\u2500\u2524M\u251c\u2500\u2500\u2500\\n \u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\u251c\u2500\u2500\u2500\u2500\u2524\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\u251c\u2500\u2500\u2500\u2500\u2524\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524 \u2591 \u2514\u2565\u2518\u250c\u2500\u2510\\nq_2 -> 3 \u2524 Rz(\u03c0/2) \u251c\u2524 \u221aX \u251c\u2524 Rz(\u03c0 + \u03b8[2]) \u251c\u2524 \u221aX \u251c\u2524 Rz(5\u03c0/2) \u251c\u2500\u2591\u2500\u2500\u2500\u2500\u2500\u256b\u2500\u2524M\u251c\\n \u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\u251c\u2500\u2500\u2500\u2500\u2524\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\u251c\u2500\u2500\u2500\u2500\u2524\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524 \u2591 \u250c\u2500\u2510 \u2551 \u2514\u2565\u2518\\nq_0 -> 8 \u2524 Rz(\u03c0/2) \u251c\u2524 \u221aX \u251c\u2524 Rz(\u03c0 + \u03b8[0]) \u251c\u2524 \u221aX \u251c\u2524 Rz(5\u03c0/2) \u251c\u2500\u2591\u2500\u2524M\u251c\u2500\u256b\u2500\u2500\u256b\u2500\\n \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\u2514\u2500\u2500\u2500\u2500\u2518\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\u2514\u2500\u2500\u2500\u2500\u2518\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518 \u2591 \u2514\u2565\u2518 \u2551 \u2551 \\n meas: 3/\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2569\u2550\u2550\u2569\u2550\u2550\u2569\u2550\\n 0 1 2 \\nglobal phase: \u03c0/2\\n \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\u250c\u2500\u2500\u2500\u2500\u2510\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\u250c\u2500\u2500\u2500\u2500\u2510\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510 \u2591 \u250c\u2500\u2510\\nq_2 -> 0 \u2524 Rz(\u03c0/2) \u251c\u2524 \u221aX \u251c\u2524 Rz(\u03c0 + \u03b8[2]) \u251c\u2524 \u221aX \u251c\u2524 Rz(5\u03c0/2) \u251c\u2500\u2591\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524M\u251c\\n \u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\u251c\u2500\u2500\u2500\u2500\u2524\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\u251c\u2500\u2500\u2500\u2500\u2524\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524 \u2591 \u250c\u2500\u2510\u2514\u2565\u2518\\nq_1 -> 3 \u2524 Rz(\u03c0/2) \u251c\u2524 \u221aX \u251c\u2524 Rz(\u03c0 + \u03b8[1]) \u251c\u2524 \u221aX \u251c\u2524 Rz(5\u03c0/2) \u251c\u2500\u2591\u2500\u2500\u2500\u2500\u2524M\u251c\u2500\u256b\u2500\\n \u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\u251c\u2500\u2500\u2500\u2500\u2524\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\u251c\u2500\u2500\u2500\u2500\u2524\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524 \u2591 \u250c\u2500\u2510\u2514\u2565\u2518 \u2551 \\nq_0 -> 8 \u2524 Rz(\u03c0/2) \u251c\u2524 \u221aX \u251c\u2524 Rz(\u03c0 + \u03b8[0]) \u251c\u2524 \u221aX \u251c\u2524 Rz(5\u03c0/2) \u251c\u2500\u2591\u2500\u2524M\u251c\u2500\u256b\u2500\u2500\u256b\u2500\\n \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\u2514\u2500\u2500\u2500\u2500\u2518\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\u2514\u2500\u2500\u2500\u2500\u2518\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518 \u2591 \u2514\u2565\u2518 \u2551 \u2551 \\n meas: 3/\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2569\u2550\u2550\u2569\u2550\u2550\u2569\u2550\\n 0 1 2 \\nglobal phase: \u03c0/2\\n \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\u250c\u2500\u2500\u2500\u2500\u2510\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\u250c\u2500\u2500\u2500\u2500\u2510\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510 \u2591 \u250c\u2500\u2510 \\nq_1 -> 0 \u2524 Rz(\u03c0/2) \u251c\u2524 \u221aX \u251c\u2524 Rz(\u03c0 + \u03b8[1]) \u251c\u2524 \u221aX \u251c\u2524 Rz(5\u03c0/2) \u251c\u2500\u2591\u2500\u2500\u2500\u2500\u2524M\u251c\u2500\u2500\u2500\\n \u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\u251c\u2500\u2500\u2500\u2500\u2524\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\u251c\u2500\u2500\u2500\u2500\u2524\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524 \u2591 \u2514\u2565\u2518\u250c\u2500\u2510\\nq_2 -> 3 \u2524 Rz(\u03c0/2) \u251c\u2524 \u221aX \u251c\u2524 Rz(\u03c0 + \u03b8[2]) \u251c\u2524 \u221aX \u251c\u2524 Rz(5\u03c0/2) \u251c\u2500\u2591\u2500\u2500\u2500\u2500\u2500\u256b\u2500\u2524M\u251c\\n \u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\u251c\u2500\u2500\u2500\u2500\u2524\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\u251c\u2500\u2500\u2500\u2500\u2524\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524 \u2591 \u250c\u2500\u2510 \u2551 \u2514\u2565\u2518\\nq_0 -> 8 \u2524 Rz(\u03c0/2) \u251c\u2524 \u221aX \u251c\u2524 Rz(\u03c0 + \u03b8[0]) \u251c\u2524 \u221aX \u251c\u2524 Rz(5\u03c0/2) \u251c\u2500\u2591\u2500\u2524M\u251c\u2500\u256b\u2500\u2500\u256b\u2500\\n \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\u2514\u2500\u2500\u2500\u2500\u2518\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\u2514\u2500\u2500\u2500\u2500\u2518\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518 \u2591 \u2514\u2565\u2518 \u2551 \u2551 \\n meas: 3/\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2569\u2550\u2550\u2569\u2550\u2550\u2569\u2550\\n 0 1 2 \\nglobal phase: \u03c0/2\\n \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\u250c\u2500\u2500\u2500\u2500\u2510\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\u250c\u2500\u2500\u2500\u2500\u2510\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510 \u2591 \u250c\u2500\u2510 \\nq_1 -> 0 \u2524 Rz(\u03c0/2) \u251c\u2524 \u221aX \u251c\u2524 Rz(\u03c0 + \u03b8[1]) \u251c\u2524 \u221aX \u251c\u2524 Rz(5\u03c0/2) \u251c\u2500\u2591\u2500\u2500\u2500\u2500\u2524M\u251c\u2500\u2500\u2500\\n \u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\u251c\u2500\u2500\u2500\u2500\u2524\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\u251c\u2500\u2500\u2500\u2500\u2524\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524 \u2591 \u2514\u2565\u2518\u250c\u2500\u2510\\nq_2 -> 3 \u2524 Rz(\u03c0/2) \u251c\u2524 \u221aX \u251c\u2524 Rz(\u03c0 + \u03b8[2]) \u251c\u2524 \u221aX \u251c\u2524 Rz(5\u03c0/2) \u251c\u2500\u2591\u2500\u2500\u2500\u2500\u2500\u256b\u2500\u2524M\u251c\\n \u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\u251c\u2500\u2500\u2500\u2500\u2524\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\u251c\u2500\u2500\u2500\u2500\u2524\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524 \u2591 \u250c\u2500\u2510 \u2551 \u2514\u2565\u2518\\nq_0 -> 8 \u2524 Rz(\u03c0/2) \u251c\u2524 \u221aX \u251c\u2524 Rz(\u03c0 + \u03b8[0]) \u251c\u2524 \u221aX \u251c\u2524 Rz(5\u03c0/2) \u251c\u2500\u2591\u2500\u2524M\u251c\u2500\u256b\u2500\u2500\u256b\u2500\\n \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\u2514\u2500\u2500\u2500\u2500\u2518\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\u2514\u2500\u2500\u2500\u2500\u2518\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518 \u2591 \u2514\u2565\u2518 \u2551 \u2551 \\n meas: 3/\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2569\u2550\u2550\u2569\u2550\u2550\u2569\u2550\\n 0 1 2 \\nglobal phase: \u03c0/2\\n \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\u250c\u2500\u2500\u2500\u2500\u2510\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\u250c\u2500\u2500\u2500\u2500\u2510\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510 \u2591 \u250c\u2500\u2510\\nq_2 -> 0 \u2524 Rz(\u03c0/2) \u251c\u2524 \u221aX \u251c\u2524 Rz(\u03c0 + \u03b8[2]) \u251c\u2524 \u221aX \u251c\u2524 Rz(5\u03c0/2) \u251c\u2500\u2591\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524M\u251c\\n \u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\u251c\u2500\u2500\u2500\u2500\u2524\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\u251c\u2500\u2500\u2500\u2500\u2524\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524 \u2591 \u250c\u2500\u2510 \u2514\u2565\u2518\\nq_0 -> 3 \u2524 Rz(\u03c0/2) \u251c\u2524 \u221aX \u251c\u2524 Rz(\u03c0 + \u03b8[0]) \u251c\u2524 \u221aX \u251c\u2524 Rz(5\u03c0/2) \u251c\u2500\u2591\u2500\u2524M\u251c\u2500\u2500\u2500\u2500\u256b\u2500\\n \u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\u251c\u2500\u2500\u2500\u2500\u2524\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\u251c\u2500\u2500\u2500\u2500\u2524\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524 \u2591 \u2514\u2565\u2518\u250c\u2500\u2510 \u2551 \\nq_1 -> 8 \u2524 Rz(\u03c0/2) \u251c\u2524 \u221aX \u251c\u2524 Rz(\u03c0 + \u03b8[1]) \u251c\u2524 \u221aX \u251c\u2524 Rz(5\u03c0/2) \u251c\u2500\u2591\u2500\u2500\u256b\u2500\u2524M\u251c\u2500\u256b\u2500\\n \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\u2514\u2500\u2500\u2500\u2500\u2518\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\u2514\u2500\u2500\u2500\u2500\u2518\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518 \u2591 \u2551 \u2514\u2565\u2518 \u2551 \\n meas: 3/\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2569\u2550\u2550\u2569\u2550\u2550\u2569\u2550\\n 0 1 2 \\nglobal phase: \u03c0/2\\n \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\u250c\u2500\u2500\u2500\u2500\u2510\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\u250c\u2500\u2500\u2500\u2500\u2510\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510 \u2591 \u250c\u2500\u2510 \\nq_1 -> 0 \u2524 Rz(\u03c0/2) \u251c\u2524 \u221aX \u251c\u2524 Rz(\u03c0 + \u03b8[1]) \u251c\u2524 \u221aX \u251c\u2524 Rz(5\u03c0/2) \u251c\u2500\u2591\u2500\u2500\u2500\u2500\u2524M\u251c\u2500\u2500\u2500\\n \u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\u251c\u2500\u2500\u2500\u2500\u2524\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\u251c\u2500\u2500\u2500\u2500\u2524\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524 \u2591 \u2514\u2565\u2518\u250c\u2500\u2510\\nq_2 -> 3 \u2524 Rz(\u03c0/2) \u251c\u2524 \u221aX \u251c\u2524 Rz(\u03c0 + \u03b8[2]) \u251c\u2524 \u221aX \u251c\u2524 Rz(5\u03c0/2) \u251c\u2500\u2591\u2500\u2500\u2500\u2500\u2500\u256b\u2500\u2524M\u251c\\n \u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\u251c\u2500\u2500\u2500\u2500\u2524\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\u251c\u2500\u2500\u2500\u2500\u2524\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524 \u2591 \u250c\u2500\u2510 \u2551 \u2514\u2565\u2518\\nq_0 -> 8 \u2524 Rz(\u03c0/2) \u251c\u2524 \u221aX \u251c\u2524 Rz(\u03c0 + \u03b8[0]) \u251c\u2524 \u221aX \u251c\u2524 Rz(5\u03c0/2) \u251c\u2500\u2591\u2500\u2524M\u251c\u2500\u256b\u2500\u2500\u256b\u2500\\n \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\u2514\u2500\u2500\u2500\u2500\u2518\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\u2514\u2500\u2500\u2500\u2500\u2518\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518 \u2591 \u2514\u2565\u2518 \u2551 \u2551 \\n meas: 3/\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2569\u2550\u2550\u2569\u2550\u2550\u2569\u2550\\n 0 1 2 \\nglobal phase: \u03c0/2\\n \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\u250c\u2500\u2500\u2500\u2500\u2510\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\u250c\u2500\u2500\u2500\u2500\u2510\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510 \u2591 \u250c\u2500\u2510 \\nq_1 -> 0 \u2524 Rz(\u03c0/2) \u251c\u2524 \u221aX \u251c\u2524 Rz(\u03c0 + \u03b8[1]) \u251c\u2524 \u221aX \u251c\u2524 Rz(5\u03c0/2) \u251c\u2500\u2591\u2500\u2500\u2500\u2500\u2524M\u251c\u2500\u2500\u2500\\n \u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\u251c\u2500\u2500\u2500\u2500\u2524\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\u251c\u2500\u2500\u2500\u2500\u2524\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524 \u2591 \u2514\u2565\u2518\u250c\u2500\u2510\\nq_2 -> 3 \u2524 Rz(\u03c0/2) \u251c\u2524 \u221aX \u251c\u2524 Rz(\u03c0 + \u03b8[2]) \u251c\u2524 \u221aX \u251c\u2524 Rz(5\u03c0/2) \u251c\u2500\u2591\u2500\u2500\u2500\u2500\u2500\u256b\u2500\u2524M\u251c\\n \u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\u251c\u2500\u2500\u2500\u2500\u2524\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\u251c\u2500\u2500\u2500\u2500\u2524\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524 \u2591 \u250c\u2500\u2510 \u2551 \u2514\u2565\u2518\\nq_0 -> 8 \u2524 Rz(\u03c0/2) \u251c\u2524 \u221aX \u251c\u2524 Rz(\u03c0 + \u03b8[0]) \u251c\u2524 \u221aX \u251c\u2524 Rz(5\u03c0/2) \u251c\u2500\u2591\u2500\u2524M\u251c\u2500\u256b\u2500\u2500\u256b\u2500\\n \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\u2514\u2500\u2500\u2500\u2500\u2518\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\u2514\u2500\u2500\u2500\u2500\u2518\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518 \u2591 \u2514\u2565\u2518 \u2551 \u2551 \\n meas: 3/\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2569\u2550\u2550\u2569\u2550\u2550\u2569\u2550\\n 0 1 2 \\nglobal phase: \u03c0/2\\n \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\u250c\u2500\u2500\u2500\u2500\u2510\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\u250c\u2500\u2500\u2500\u2500\u2510\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510 \u2591 \u250c\u2500\u2510\\nq_2 -> 0 \u2524 Rz(\u03c0/2) \u251c\u2524 \u221aX \u251c\u2524 Rz(\u03c0 + \u03b8[2]) \u251c\u2524 \u221aX \u251c\u2524 Rz(5\u03c0/2) \u251c\u2500\u2591\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524M\u251c\\n \u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\u251c\u2500\u2500\u2500\u2500\u2524\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\u251c\u2500\u2500\u2500\u2500\u2524\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524 \u2591 \u250c\u2500\u2510 \u2514\u2565\u2518\\nq_0 -> 3 \u2524 Rz(\u03c0/2) \u251c\u2524 \u221aX \u251c\u2524 Rz(\u03c0 + \u03b8[0]) \u251c\u2524 \u221aX \u251c\u2524 Rz(5\u03c0/2) \u251c\u2500\u2591\u2500\u2524M\u251c\u2500\u2500\u2500\u2500\u256b\u2500\\n \u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\u251c\u2500\u2500\u2500\u2500\u2524\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\u251c\u2500\u2500\u2500\u2500\u2524\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524 \u2591 \u2514\u2565\u2518\u250c\u2500\u2510 \u2551 \\nq_1 -> 8 \u2524 Rz(\u03c0/2) \u251c\u2524 \u221aX \u251c\u2524 Rz(\u03c0 + \u03b8[1]) \u251c\u2524 \u221aX \u251c\u2524 Rz(5\u03c0/2) \u251c\u2500\u2591\u2500\u2500\u256b\u2500\u2524M\u251c\u2500\u256b\u2500\\n \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\u2514\u2500\u2500\u2500\u2500\u2518\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\u2514\u2500\u2500\u2500\u2500\u2518\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518 \u2591 \u2551 \u2514\u2565\u2518 \u2551 \\n meas: 3/\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2569\u2550\u2550\u2569\u2550\u2550\u2569\u2550\\n 0 1 2 \\nglobal phase: \u03c0/2\\n \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\u250c\u2500\u2500\u2500\u2500\u2510\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\u250c\u2500\u2500\u2500\u2500\u2510\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510 \u2591 \u250c\u2500\u2510 \\nq_0 -> 0 \u2524 Rz(\u03c0/2) \u251c\u2524 \u221aX \u251c\u2524 Rz(\u03c0 + \u03b8[0]) \u251c\u2524 \u221aX \u251c\u2524 Rz(5\u03c0/2) \u251c\u2500\u2591\u2500\u2524M\u251c\u2500\u2500\u2500\u2500\u2500\u2500\\n \u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\u251c\u2500\u2500\u2500\u2500\u2524\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\u251c\u2500\u2500\u2500\u2500\u2524\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524 \u2591 \u2514\u2565\u2518\u250c\u2500\u2510 \\nq_1 -> 3 \u2524 Rz(\u03c0/2) \u251c\u2524 \u221aX \u251c\u2524 Rz(\u03c0 + \u03b8[1]) \u251c\u2524 \u221aX \u251c\u2524 Rz(5\u03c0/2) \u251c\u2500\u2591\u2500\u2500\u256b\u2500\u2524M\u251c\u2500\u2500\u2500\\n \u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\u251c\u2500\u2500\u2500\u2500\u2524\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\u251c\u2500\u2500\u2500\u2500\u2524\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524 \u2591 \u2551 \u2514\u2565\u2518\u250c\u2500\u2510\\nq_2 -> 8 \u2524 Rz(\u03c0/2) \u251c\u2524 \u221aX \u251c\u2524 Rz(\u03c0 + \u03b8[2]) \u251c\u2524 \u221aX \u251c\u2524 Rz(5\u03c0/2) \u251c\u2500\u2591\u2500\u2500\u256b\u2500\u2500\u256b\u2500\u2524M\u251c\\n \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\u2514\u2500\u2500\u2500\u2500\u2518\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\u2514\u2500\u2500\u2500\u2500\u2518\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518 \u2591 \u2551 \u2551 \u2514\u2565\u2518\\n meas: 3/\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2569\u2550\u2550\u2569\u2550\u2550\u2569\u2550\\n 0 1 2 \\nglobal phase: \u03c0/2\\n \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\u250c\u2500\u2500\u2500\u2500\u2510\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\u250c\u2500\u2500\u2500\u2500\u2510\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510 \u2591 \u250c\u2500\u2510 \\nq_0 -> 0 \u2524 Rz(\u03c0/2) \u251c\u2524 \u221aX \u251c\u2524 Rz(\u03c0 + \u03b8[0]) \u251c\u2524 \u221aX \u251c\u2524 Rz(5\u03c0/2) \u251c\u2500\u2591\u2500\u2524M\u251c\u2500\u2500\u2500\u2500\u2500\u2500\\n \u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\u251c\u2500\u2500\u2500\u2500\u2524\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\u251c\u2500\u2500\u2500\u2500\u2524\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524 \u2591 \u2514\u2565\u2518\u250c\u2500\u2510 \\nq_1 -> 3 \u2524 Rz(\u03c0/2) \u251c\u2524 \u221aX \u251c\u2524 Rz(\u03c0 + \u03b8[1]) \u251c\u2524 \u221aX \u251c\u2524 Rz(5\u03c0/2) \u251c\u2500\u2591\u2500\u2500\u256b\u2500\u2524M\u251c\u2500\u2500\u2500\\n \u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\u251c\u2500\u2500\u2500\u2500\u2524\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\u251c\u2500\u2500\u2500\u2500\u2524\u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524 \u2591 \u2551 \u2514\u2565\u2518\u250c\u2500\u2510\\nq_2 -> 8 \u2524 Rz(\u03c0/2) \u251c\u2524 \u221aX \u251c\u2524 Rz(\u03c0 + \u03b8[2]) \u251c\u2524 \u221aX \u251c\u2524 Rz(5\u03c0/2) \u251c\u2500\u2591\u2500\u2500\u256b\u2500\u2500\u256b\u2500\u2524M\u251c\\n \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\u2514\u2500\u2500\u2500\u2500\u2518\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\u2514\u2500\u2500\u2500\u2500\u2518\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518 \u2591 \u2551 \u2551 \u2514\u2565\u2518\\n meas: 3/\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2569\u2550\u2550\u2569\u2550\u2550\u2569\u2550\\n 0 1 2 \\n\\n```\\n\\n### What should happen?\\n\\nTranspile with a fixed seed should always generate the same layout. This is problematic at least for unittest of my codebase. Not sure if applications can be also affected by this.\\n\\n### Any suggestions?\\n\\nI don't have bandwidth to investigate.\\n\\n(edit) \\nAfter carefully looking into transpiled circuits, I realized that the circuit is always consistent at the level of physical qubit set. Since each wire in my circuit is logically equivalent, the behavior of transpiler is still reasonable. Maybe this is undocumented policy update?"}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/qiskit_m_qiskit:pr-14730", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/crates/transpiler/src/passes/vf2/vf2_layout.rs b/crates/transpiler/src/passes/vf2/vf2_layout.rs\\nindex c53419768e2c..c7241848dbaf 100644\\n--- a/crates/transpiler/src/passes/vf2/vf2_layout.rs\\n+++ b/crates/transpiler/src/passes/vf2/vf2_layout.rs\\n@@ -347,10 +347,14 @@ fn map_free_qubits(\\n .get(&[PhysicalQubit::new(*qubit_b), PhysicalQubit::new(*qubit_b)])\\n .unwrap_or(&0.);\\n // Reverse comparison so lower error rates are at the end of the vec.\\n- score_b.partial_cmp(&score_a).unwrap()\\n+ match score_b.partial_cmp(&score_a).unwrap() {\\n+ Ordering::Equal => qubit_b.cmp(qubit_a),\\n+ Ordering::Less => Ordering::Less,\\n+ Ordering::Greater => Ordering::Greater,\\n+ }\\n });\\n let mut free_indices: Vec<NodeIndex> = free_nodes.keys().copied().collect();\\n- free_indices.par_sort_by_key(|index| free_nodes[index].values().sum::<usize>());\\n+ free_indices.par_sort_by_key(|index| (free_nodes[index].values().sum::<usize>(), *index));\\n for im_index in free_indices {\\n let selected_qubit = free_qubits.pop()?;\\n partial_layout.insert(\\ndiff --git a/releasenotes/notes/fix-1q-non-determinism-vf2-75490119547bf656.yaml b/releasenotes/notes/fix-1q-non-determinism-vf2-75490119547bf656.yaml\\nnew file mode 100644\\nindex 000000000000..336b6a5c8f9c\\n--- /dev/null\\n+++ b/releasenotes/notes/fix-1q-non-determinism-vf2-75490119547bf656.yaml\\n@@ -0,0 +1,8 @@\\n+---\\n+fixes:\\n+ - |\\n+ Fixed an issue in the :class:`.VF2Layout` transpiler pass where even with\\n+ a fixed seed set the output from the pass was potentially non-deterministic;\\n+ specifically if the input circuit had any active qubits that only contained\\n+ single qubit operations.\\n+ Fixed `#14729 <https://github.com/Qiskit/qiskit/issues/14729>`__\\n"}, "test": {"test_patch": "diff --git a/test/python/compiler/test_transpiler.py b/test/python/compiler/test_transpiler.py\\nindex a5eb228e347f..b0392c8e3984 100644\\n--- a/test/python/compiler/test_transpiler.py\\n+++ b/test/python/compiler/test_transpiler.py\\n@@ -40,6 +40,7 @@\\n IfElseOp,\\n BoxOp,\\n Parameter,\\n+ ParameterVector,\\n Qubit,\\n SwitchCaseOp,\\n WhileLoopOp,\\n@@ -2304,6 +2305,27 @@ def test_stretch_integration_with_alignment(self, optimization_level, control_fl\\n # No meaningful assertions; this is a simple regression test for \"stretches don't explode\\n # backends with alignments\" more than anything.\\n \\n+ @data(0, 1, 2, 3)\\n+ def test_single_qubit_circuit_deterministic_output(self, optimization_level):\\n+ \"\"\"Test that the transpiler's output is deterministic in a single qubit example.\\n+\\n+ Reproduce from `#14729 <https://github.com/Qiskit/qiskit/issues/14729>`__\"\"\"\\n+ params = ParameterVector(\"\u03b8\", length=3)\\n+\\n+ circ = QuantumCircuit(3)\\n+ for i, par in enumerate(params):\\n+ circ.rx(par, i)\\n+ circ.measure_all()\\n+ backend = GenericBackendV2(10, noise_info=True, seed=123)\\n+ isa_circs = []\\n+ for _ in range(10):\\n+ pm = generate_preset_pass_manager(\\n+ optimization_level=optimization_level, target=backend.target, seed_transpiler=123\\n+ )\\n+ isa_circs.append(pm.run(circ))\\n+ for i in range(10):\\n+ self.assertEqual(isa_circs[0], isa_circs[i])\\n+\\n \\n @ddt\\n class TestPostTranspileIntegration(QiskitTestCase):\\ndiff --git a/test/python/transpiler/test_vf2_layout.py b/test/python/transpiler/test_vf2_layout.py\\nindex 71f26afc7c13..019ba2880ad5 100644\\n--- a/test/python/transpiler/test_vf2_layout.py\\n+++ b/test/python/transpiler/test_vf2_layout.py\\n@@ -285,6 +285,28 @@ def test_target_some_error(self):\\n vf2_pass.run(dag)\\n self.assertLayout(dag, target.build_coupling_map(), vf2_pass.property_set)\\n \\n+ def test_determinism_all_1q(self):\\n+ \"\"\"Test that running vf2layout on a circuit with all single qubit gates is deterministic.\"\"\"\\n+\\n+ circ = QuantumCircuit(3)\\n+ for i in range(3):\\n+ circ.rx(3.14159, i)\\n+ circ.measure_all()\\n+\\n+ backend = GenericBackendV2(10, noise_info=True, seed=123456789)\\n+ layouts = []\\n+ for _ in range(10):\\n+ layout_pass = VF2Layout(target=backend.target)\\n+ property_set = {}\\n+ layout_pass(circ, property_set=property_set)\\n+ layouts.append(property_set[\"layout\"])\\n+ self.assertEqual(10, len(layouts), \"Expected 10 layouts from 10 pass executions\")\\n+ for i, layout in enumerate(layouts):\\n+ self.assertIsNotNone(layout, f\"A layout was not found for layout {i}\")\\n+ self.assertEqual(\\n+ layouts[0], layout, f\"Layout for execution {i} differs from the expected\"\\n+ )\\n+\\n \\n @ddt.ddt\\n class TestVF2LayoutLattice(LayoutTestCase):\\n", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}191{"question_id": "MSB_Qiskit_qiskit_pr14978", "question_type": "multi_swe_bench", "description": "Un-provide `standard_operation` for `PyGate` (Qiskit/qiskit#14978)", "content": {"org": "Qiskit", "repo": "qiskit", "pr_number": 14978, "issue_title": "Un-provide `standard_operation` for `PyGate`", "issue_body": "<!--\\r\\n\u26a0\ufe0f If you do not respect this template, your pull request will be closed.\\r\\n\u26a0\ufe0f Your pull request title should be short detailed and understandable for all.\\r\\n\u26a0\ufe0f Also, please add a release note file using reno if the change needs to be\\r\\n documented in the release notes.\\r\\n\u26a0\ufe0f If your pull request fixes an open issue, please link to the issue.\\r\\n\\r\\n- [x] I have added the tests to cover my changes.\\r\\n- [x] I have updated the documentation accordingly.\\r\\n- [x] I have read the CONTRIBUTING document.\\r\\n-->\\r\\n\\r\\n### Summary\\r\\n\\r\\nPreviously `PyGate` implemented the method `standard_gate`, which for example allowed to interpret a `PyGate` created for `CRX(controlled_state=0)` as `StandardGate::CRX`, effectively losing the control state and leading to problems down the line.\\r\\n\\r\\nFixes #14974.\\r\\n\\r\\n### Details and comments\\r\\n\\r\\nJake's additional comments: the solution not provide that method at all - if we can\u2019t treat it as a StandardGate during extraction, there\u2019s no real need to guess at other times. There\u2019s at least a couple of reasons we can\u2019t do it:\\r\\n* not-all-ones control state\\r\\n* the base_gate of a controlledgate has extra attributes set (e.g. label) and we have tests that assert that the label of the base gate is propagated\\r\\n\\r\\n", "base_commit": "a776456977f5b1c36e365586e87b545b1e9a5718", "resolved_issues": [{"number": 14974, "title": "`CommutativeInverseCancellation` cancels `CS/CSdg` with `CRX` when control state is |0\u27e9", "body": "### Environment\\n\\n- **Qiskit version**: 2.1.2\\n- **Python version**: 3.13\\n- **Operating system**: macOS 15.6\\n\\n\\n### What is happening?\\n\\n`CommutativeInverseCancellation` assumes that `CS` and its inverse commute with `CRX` and cancels them by moving gates across each other, changing the circuit's semantics. This only occurs when the control state is $\\\\vert 0 \\\\rangle$.\\n\\n### How can we reproduce the issue?\\n\\n```python\\nfrom qiskit import QuantumCircuit\\nfrom qiskit.transpiler import PassManager\\nfrom qiskit.transpiler.passes import CommutativeInverseCancellation\\n\\npm = PassManager(CommutativeInverseCancellation())\\n\\ncircuit = QuantumCircuit(2, 1)\\ncircuit.csdg(0, 1, ctrl_state=0)\\ncircuit.crx(1, 0, 1, ctrl_state=0)\\ncircuit.cs(0, 1, ctrl_state=0)\\ncircuit.ry(1, 1)\\ncircuit.measure(1, 0)\\nprint(circuit)\\n\\ntrans_circuit = pm.run(circuit)\\nprint(trans_circuit)\\n\\n# Optional: Simulation\\nfrom qiskit_aer import Aer\\nfrom qiskit import transpile\\n\\nsim = Aer.get_backend(\"aer_simulator\")\\nprint(\"Original:\")\\ncircuit = transpile(circuit, sim, optimization_level=0)\\nprint(sim.run(circuit).result().get_counts())\\nprint(\"Transpiled:\")\\ntrans_circuit = transpile(trans_circuit, sim, optimization_level=0)\\nprint(sim.run(trans_circuit).result().get_counts())\\n```\\n```\\nq_0: \u2500\u2500\u2500o\u2500\u2500\u2500\u2500\u2500\u2500\u2500o\u2500\u2500\u2500\u2500\u2500\u2500o\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\\n \u250c\u2500\u2500\u2534\u2500\u2500\u2510\u250c\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2510\u250c\u2500\u2534\u2500\u2510\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\u250c\u2500\u2510\\nq_1: \u2524 Sdg \u251c\u2524 Rx(1) \u251c\u2524 S \u251c\u2524 Ry(1) \u251c\u2524M\u251c\\n \u2514\u2500\u2500\u2500\u2500\u2500\u2518\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\u2514\u2500\u2500\u2500\u2518\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\u2514\u2565\u2518\\nc: 1/\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2569\u2550\\n 0 \\nq_0: \u2500\u2500\u2500\u2500o\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\\n \u250c\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2510\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\u250c\u2500\u2510\\nq_1: \u2524 Rx(1) \u251c\u2524 Ry(1) \u251c\u2524M\u251c\\n \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\u2514\u2565\u2518\\nc: 1/\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2569\u2550\\n 0 \\nOriginal:\\n{'0': 284, '1': 740}\\nTranspiled:\\n{'0': 674, '1': 350}\\n```\\n\\n### What should happen?\\n\\n`CS` and `CSdg` should not be cancelled across `CRX`.\\n\\n### Any suggestions?\\n\\nThe bug only appears when `CS` and `CSdg` are used with `ctrl_state=0`. In this case, `CommutationChecker` seems to skip the standard gate commutation table, and instead falls back to a matrix-multiplication check. I suspect the issue lies in this fallback path, which incorrectly treats the gates as commuting."}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/qiskit_m_qiskit:pr-14978", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/crates/circuit/src/operations.rs b/crates/circuit/src/operations.rs\\nindex f6bd3bfedc6c..c2403ce7fef7 100644\\n--- a/crates/circuit/src/operations.rs\\n+++ b/crates/circuit/src/operations.rs\\n@@ -256,7 +256,6 @@ pub trait Operation {\\n fn blocks(&self) -> Vec<CircuitData>;\\n fn matrix(&self, params: &[Param]) -> Option<Array2<Complex64>>;\\n fn definition(&self, params: &[Param]) -> Option<CircuitData>;\\n- fn standard_gate(&self) -> Option<StandardGate>;\\n fn directive(&self) -> bool;\\n fn matrix_as_static_1q(&self, params: &[Param]) -> Option<[[Complex64; 2]; 2]>;\\n fn matrix_as_nalgebra_1q(&self, params: &[Param]) -> Option<Matrix2<Complex64>> {\\n@@ -370,17 +369,6 @@ impl Operation for OperationRef<'_> {\\n }\\n }\\n #[inline]\\n- fn standard_gate(&self) -> Option<StandardGate> {\\n- match self {\\n- Self::StandardGate(standard) => standard.standard_gate(),\\n- Self::StandardInstruction(instruction) => instruction.standard_gate(),\\n- Self::Gate(gate) => gate.standard_gate(),\\n- Self::Instruction(instruction) => instruction.standard_gate(),\\n- Self::Operation(operation) => operation.standard_gate(),\\n- Self::Unitary(unitary) => unitary.standard_gate(),\\n- }\\n- }\\n- #[inline]\\n fn directive(&self) -> bool {\\n match self {\\n Self::StandardGate(standard) => standard.directive(),\\n@@ -552,10 +540,6 @@ impl Operation for StandardInstruction {\\n None\\n }\\n \\n- fn standard_gate(&self) -> Option<StandardGate> {\\n- None\\n- }\\n-\\n fn directive(&self) -> bool {\\n match self {\\n StandardInstruction::Barrier(_) => true,\\n@@ -2259,10 +2243,6 @@ impl Operation for StandardGate {\\n }\\n }\\n \\n- fn standard_gate(&self) -> Option<StandardGate> {\\n- Some(*self)\\n- }\\n-\\n fn directive(&self) -> bool {\\n false\\n }\\n@@ -2555,9 +2535,6 @@ impl Operation for PyInstruction {\\n }\\n })\\n }\\n- fn standard_gate(&self) -> Option<StandardGate> {\\n- None\\n- }\\n \\n fn directive(&self) -> bool {\\n Python::with_gil(|py| -> bool {\\n@@ -2659,14 +2636,6 @@ impl Operation for PyGate {\\n }\\n })\\n }\\n- fn standard_gate(&self) -> Option<StandardGate> {\\n- Python::with_gil(|py| -> Option<StandardGate> {\\n- match self.gate.getattr(py, intern!(py, \"_standard_gate\")) {\\n- Ok(stdgate) => stdgate.extract(py).unwrap_or_default(),\\n- Err(_) => None,\\n- }\\n- })\\n- }\\n fn directive(&self) -> bool {\\n false\\n }\\n@@ -2749,10 +2718,6 @@ impl Operation for PyOperation {\\n fn definition(&self, _params: &[Param]) -> Option<CircuitData> {\\n None\\n }\\n- fn standard_gate(&self) -> Option<StandardGate> {\\n- None\\n- }\\n-\\n fn directive(&self) -> bool {\\n Python::with_gil(|py| -> bool {\\n match self.operation.getattr(py, intern!(py, \"_directive\")) {\\n@@ -2839,10 +2804,6 @@ impl Operation for UnitaryGate {\\n None\\n }\\n \\n- fn standard_gate(&self) -> Option<StandardGate> {\\n- None\\n- }\\n-\\n fn directive(&self) -> bool {\\n false\\n }\\ndiff --git a/crates/circuit/src/packed_instruction.rs b/crates/circuit/src/packed_instruction.rs\\nindex e38b4b759c01..1302f7fe09b5 100644\\n--- a/crates/circuit/src/packed_instruction.rs\\n+++ b/crates/circuit/src/packed_instruction.rs\\n@@ -546,10 +546,6 @@ impl Operation for PackedOperation {\\n self.view().definition(params)\\n }\\n #[inline]\\n- fn standard_gate(&self) -> Option<StandardGate> {\\n- self.view().standard_gate()\\n- }\\n- #[inline]\\n fn directive(&self) -> bool {\\n self.view().directive()\\n }\\ndiff --git a/crates/transpiler/src/commutation_checker.rs b/crates/transpiler/src/commutation_checker.rs\\nindex f7152e7af4b1..df1514d1fef8 100644\\n--- a/crates/transpiler/src/commutation_checker.rs\\n+++ b/crates/transpiler/src/commutation_checker.rs\\n@@ -395,8 +395,9 @@ impl CommutationChecker {\\n // * gates we know are in the cache (SUPPORTED_OPS), or\\n // * standard gates with float params (otherwise we cannot cache them)\\n let is_cachable = |op: &OperationRef, params: &[Param]| {\\n- if let Some(gate) = op.standard_gate() {\\n- SUPPORTED_OP[gate as usize] || params.iter().all(|p| matches!(p, Param::Float(_)))\\n+ if let OperationRef::StandardGate(gate) = op {\\n+ SUPPORTED_OP[(*gate) as usize]\\n+ || params.iter().all(|p| matches!(p, Param::Float(_)))\\n } else {\\n false\\n }\\n@@ -595,9 +596,9 @@ fn commutation_precheck(\\n return Some(false);\\n }\\n \\n- if let Some(gate_1) = op1.standard_gate() {\\n- if let Some(gate_2) = op2.standard_gate() {\\n- if SUPPORTED_OP[gate_1 as usize] && SUPPORTED_OP[gate_2 as usize] {\\n+ if let OperationRef::StandardGate(gate_1) = op1 {\\n+ if let OperationRef::StandardGate(gate_2) = op2 {\\n+ if SUPPORTED_OP[(*gate_1) as usize] && SUPPORTED_OP[(*gate_2) as usize] {\\n return None;\\n }\\n }\\n@@ -678,18 +679,18 @@ fn map_rotation<'a>(\\n params: &'a [Param],\\n tol: f64,\\n ) -> (Option<StandardGate>, &'a [Param], bool) {\\n- if let Some(gate) = op.standard_gate() {\\n- if let Some(generator) = SUPPORTED_ROTATIONS[gate as usize] {\\n+ if let OperationRef::StandardGate(gate) = op {\\n+ if let Some(generator) = SUPPORTED_ROTATIONS[(*gate) as usize] {\\n // If the rotation angle is below the tolerance, the gate is assumed to\\n // commute with everything, and we simply return the operation with the flag that\\n // it commutes trivially.\\n if let Param::Float(angle) = params[0] {\\n- let (tr_over_dim, dim) = gate_metrics::rotation_trace_and_dim(gate, angle)\\n+ let (tr_over_dim, dim) = gate_metrics::rotation_trace_and_dim(*gate, angle)\\n .expect(\"All rotation should be covered at this point\");\\n let gate_fidelity = tr_over_dim.abs().powi(2);\\n let process_fidelity = (dim * gate_fidelity + 1.) / (dim + 1.);\\n if (1. - process_fidelity).abs() <= tol {\\n- return (Some(gate), params, true);\\n+ return (Some(*gate), params, true);\\n };\\n };\\n \\ndiff --git a/releasenotes/notes/fix-commutation-checking-with-not-all-one-states-45fdd8a779ae4277.yaml b/releasenotes/notes/fix-commutation-checking-with-not-all-one-states-45fdd8a779ae4277.yaml\\nnew file mode 100644\\nindex 000000000000..3098768a56c7\\n--- /dev/null\\n+++ b/releasenotes/notes/fix-commutation-checking-with-not-all-one-states-45fdd8a779ae4277.yaml\\n@@ -0,0 +1,7 @@\\n+---\\n+fixes:\\n+ - |\\n+ Fixed a problem in `~.CommutationChecker`, where standard controlled gates\\n+ were not handled correctly if they were controlled on something other than\\n+ the all-ones state.\\n+ Fixed `#14974 <https://github.com/Qiskit/qiskit/issues/14974>`__\\n"}, "test": {"test_patch": "diff --git a/test/python/transpiler/test_commutative_inverse_cancellation.py b/test/python/transpiler/test_commutative_inverse_cancellation.py\\nindex c4f995deb3c4..61787047ccf8 100644\\n--- a/test/python/transpiler/test_commutative_inverse_cancellation.py\\n+++ b/test/python/transpiler/test_commutative_inverse_cancellation.py\\n@@ -925,6 +925,24 @@ def test_initialize(self):\\n # The pass should run successfully but not reduce anything\\n self.assertEqual(circuit, tqc)\\n \\n+ def test_controlled_state_at_zero(self):\\n+ \"\"\"Regression test of #14974.\\n+\\n+ Two gates with not-all-ones control-states were wrongly\\n+ detected to commute, leading to invalid simplification.\\n+ \"\"\"\\n+ circuit = QuantumCircuit(2)\\n+ circuit.csdg(0, 1, ctrl_state=0)\\n+ circuit.crx(1, 0, 1, ctrl_state=0)\\n+ circuit.cs(0, 1, ctrl_state=0)\\n+ circuit.ry(1, 1)\\n+\\n+ pm = PassManager(CommutativeInverseCancellation())\\n+ tqc = pm.run(circuit)\\n+\\n+ # The pass should run successfully but not reduce anything\\n+ self.assertEqual(circuit, tqc)\\n+\\n \\n if __name__ == \"__main__\":\\n unittest.main()\\n", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}192{"question_id": "MSB_Qiskit_qiskit_pr15001", "question_type": "multi_swe_bench", "description": "Fix `VF2PostLayout` with uncoupled qubits in `strict_direction=True` (backport #14998) (Qiskit/qiskit#15001)", "content": {"org": "Qiskit", "repo": "qiskit", "pr_number": 15001, "issue_title": "Fix `VF2PostLayout` with uncoupled qubits in `strict_direction=True` (backport #14998)", "issue_body": "When `VF2PostLayout` is set in strict mode, we have to include even active but uncoupled qubits in the interaction graph, because of the semantic constraints. We need to limit the number of these uncoupled qubits we'll consider, though, because there's a factorial overhead to handling them.\\n\\nA previous commit[^1] added this skip to `strict_direction=False`, but didn't correctly handle the continuation case where we're within the limit. This commit ~ups the limit to 3 uncoupled qubits (a potential 6x overhead) and~ correctly clears out the uncoupled-qubit metadata that was causing problems in later layout reconstruction.\\n\\n[^1]: b4094ddc: Fix calls to `VF2PostLayout` after optimization loop at O3\\n\\n\\n\\n### Summary\\n\\n\\n\\n### Details and comments\\n\\nNo release note because the bug isn't released.\\n\\nFix #14997 <hr>This is an automatic backport of pull request #14998 done by [Mergify](https://mergify.com).", "base_commit": "d4537c1504fff6a22ba1228b0933fd45d2477d5d", "resolved_issues": [{"number": 14997, "title": "VF2PostLayout fails during layout finalisation with 1q wires", "body": "### Environment\\n\\n- **Qiskit version**: 2.2.0rc1\\n- **Python version**: 3.13\\n- **Operating system**: macOS\\n\\n\\n### What is happening?\\n\\n`VF2PostLayout` can fail during layout expansion, seemingly if there is a single qubit that has only 1q operations on it (but not more than one).\\n\\n### How can we reproduce the issue?\\n\\n```python\\nfrom qiskit import QuantumCircuit, transpile\\nfrom qiskit.providers.fake_provider import GenericBackendV2\\n\\nqc = QuantumCircuit(5, 5)\\nqc.h(0)\\nfor k in range(1, 4):\\n qc.cx(0, k)\\nqc.measure(qc.qubits, qc.clbits)\\n\\nbackend = GenericBackendV2(num_qubits=5, basis_gates=[\"cx\", \"id\", \"rz\", \"sx\", \"x\"], seed=0)\\ntqc = transpile(qc, backend=backend, optimization_level=3, seed_transpiler=0)\\n```\\nraises\\n```text\\nTypeError Traceback (most recent call last)\\nCell In[7], line 11\\n 8 qc.measure(qc.qubits, qc.clbits)\\n 10 backend = GenericBackendV2(num_qubits=5, basis_gates=[\"cx\", \"id\", \"rz\", \"sx\", \"x\"], seed=0)\\n---> 11 tqc = transpile(qc, backend=backend, optimization_level=3, seed_transpiler=0)\\n\\n[...snip...]\\n\\nFile ~/code/qiskit/terra/qiskit/transpiler/passes/layout/vf2_post_layout.py:341, in VF2PostLayout.run(self, dag)\\n 339 existing_layout = self.property_set[\"layout\"]\\n 340 # If any ancillas in initial layout map them back to the final layout output\\n--> 341 if existing_layout is not None and len(existing_layout) > len(chosen_layout):\\n 342 virtual_bits = chosen_layout.get_virtual_bits()\\n 343 used_bits = set(virtual_bits.values())\\n\\nTypeError: object of type 'NoneType' has no len()\\n```\\n\\n### What should happen?\\n\\nSuccessful compilation.\\n\\n### Any suggestions?\\n\\nI suspect that this was introduced during #14869 - it's suspicious to me that the catch for single-qubit operations is `if len(free) > 1` and not just `if free` - certainly the logic dictates that even a _single_ 1q wire can cause spurious failures."}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/qiskit_m_qiskit:pr-15001", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/qiskit/transpiler/passes/layout/vf2_post_layout.py b/qiskit/transpiler/passes/layout/vf2_post_layout.py\\nindex d5b2b3c73182..5473f1a57f6d 100644\\n--- a/qiskit/transpiler/passes/layout/vf2_post_layout.py\\n+++ b/qiskit/transpiler/passes/layout/vf2_post_layout.py\\n@@ -153,11 +153,19 @@ def run(self, dag):\\n self.property_set[\"VF2PostLayout_stop_reason\"] = VF2PostLayoutStopReason.MORE_THAN_2Q\\n return\\n im_graph, im_graph_node_map, reverse_im_graph_node_map, free_nodes = result\\n- if len(free_nodes) > 1 and self.strict_direction:\\n- self.property_set[\"VF2PostLayout_stop_reason\"] = (\\n- VF2PostLayoutStopReason.NO_BETTER_SOLUTION_FOUND\\n- )\\n- return\\n+ if self.strict_direction and free_nodes:\\n+ # If there are uncoupled qubits, in non-strict modes we just allocate them to the\\n+ # lowest-error states at the end. However, in strict mode, we have to consider them at\\n+ # the same time to handle heterogeneous targets correctly. This risks a factorial\\n+ # combinatoric explosion in complexity, though, so we put a limit on how many we'll\\n+ # handle. The builder still builds the graph entirely, it just returns the free nodes\\n+ # for us to check on, so we clear that out after we've checked it.\\n+ if len(free_nodes) > 1:\\n+ self.property_set[\"VF2PostLayout_stop_reason\"] = (\\n+ VF2PostLayoutStopReason.NO_BETTER_SOLUTION_FOUND\\n+ )\\n+ return\\n+ free_nodes.clear()\\n scoring_bit_list = vf2_utils.build_bit_list(im_graph, im_graph_node_map)\\n scoring_edge_list = vf2_utils.build_edge_list(im_graph)\\n \\n"}, "test": {"test_patch": "diff --git a/test/python/transpiler/test_vf2_post_layout.py b/test/python/transpiler/test_vf2_post_layout.py\\nindex a1c4d728542b..d8f75cc2dbcf 100644\\n--- a/test/python/transpiler/test_vf2_post_layout.py\\n+++ b/test/python/transpiler/test_vf2_post_layout.py\\n@@ -18,7 +18,7 @@\\n from qiskit import QuantumRegister, QuantumCircuit\\n from qiskit.circuit import ControlFlowOp\\n from qiskit.circuit.library import CXGate, XGate\\n-from qiskit.transpiler import Layout, TranspilerError\\n+from qiskit.transpiler import Layout, TranspilerError, PassManager, passes\\n from qiskit.transpiler.passes.layout.vf2_post_layout import VF2PostLayout, VF2PostLayoutStopReason\\n from qiskit.converters import circuit_to_dag\\n from qiskit.providers.fake_provider import GenericBackendV2\\n@@ -352,6 +352,33 @@ def test_complete_layout_with_idle_qubits(self, seed, strict_direction):\\n }\\n self.assertEqual(unallocated, set())\\n \\n+ @ddt.data(-1, 12)\\n+ def test_complete_layout_with_one_uncoupled_qubit(self, seed):\\n+ \"\"\"Test that a single uncoupled qubit is handled correctly.\\n+\\n+ Regression test of https://github.com/Qiskit/qiskit/issues/14997.\"\"\"\\n+ qc = QuantumCircuit(3)\\n+ qc.x(0)\\n+ qc.cx(1, 2)\\n+\\n+ bad = InstructionProperties(error=1e-1)\\n+ good = InstructionProperties(error=1e-5)\\n+\\n+ target = Target()\\n+ target.add_instruction(XGate(), {(0,): bad, (1,): good, (2,): good})\\n+ target.add_instruction(CXGate(), {(0, 1): good, (1, 2): bad})\\n+\\n+ pm = PassManager(\\n+ [\\n+ passes.TrivialLayout(target),\\n+ passes.ApplyLayout(),\\n+ passes.VF2PostLayout(target, seed=seed, strict_direction=True),\\n+ passes.ApplyLayout(),\\n+ ]\\n+ )\\n+ out = pm.run(qc)\\n+ self.assertEqual(out.layout.final_index_layout(), [2, 0, 1])\\n+\\n \\n class TestVF2PostLayoutScoring(QiskitTestCase):\\n \"\"\"Test scoring heuristic function for VF2PostLayout.\"\"\"\\n", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}193{"question_id": "MSB_Qiskit_qiskit_pr15131", "question_type": "multi_swe_bench", "description": "Check target gates are parameterized in optimize1qgatesdecomposition (Qiskit/qiskit#15131)", "content": {"org": "Qiskit", "repo": "qiskit", "pr_number": 15131, "issue_title": "Check target gates are parameterized in optimize1qgatesdecomposition", "issue_body": "<!--\\r\\n\u26a0\ufe0f If you do not respect this template, your pull request will be closed.\\r\\n\u26a0\ufe0f Your pull request title should be short detailed and understandable for all.\\r\\n\u26a0\ufe0f Also, please add a release note file using reno if the change needs to be documented in the release notes.\\r\\n\u26a0\ufe0f If your pull request fixes an open issue, please link to the issue. Use \"Fixes #XXXX\" if this PR *fully* closes the issue XXXX. \\r\\n\u2622\ufe0f If you used an AI tool to code this PR, add \"AI tool used: <Name and version of the tool>\". For example, \"AI tool used: Microsoft Copilot Chat with GPT-5\". Failing to disclose the use of AI tools may result in the PR being closed without further review. \\r\\n\\r\\n\\r\\n- [ ] I have added the tests to cover my changes.\\r\\n- [ ] I have updated the documentation accordingly.\\r\\n- [ ] I have read the CONTRIBUTING document.\\r\\n-->\\r\\n\\r\\n### Summary\\r\\n\\r\\nThis commit updates the Optimize1qGatesDecomposition transpiler pass to check the defined operation in the target to ensure it's a valid gate to use for the decomposition. Previously the pass would just use the gate name for each qubit and treat that as a basis gate list. However this ignored the extra details that the target provides as a target gate can match the name but not be valid for use in synthesis. This commit fixes that oversight by checking the gates directly and ensuring they're valid for use in the decomposition.\\r\\n\\r\\n### Details and comments\\r\\n\\r\\nFixes #14743", "base_commit": "1d927018af7bdb793ae0d5f99e53ed3ffc73347f", "resolved_issues": [{"number": 14743, "title": "Optimize1qGatesDecomposition doesn't check if 1q gates support arbitrary angles", "body": "### Environment\\n\\n- **Qiskit version**: main but it will be present in 2.1.x and 1.4.x\\n- **Python version**: 3.13\\n- **Operating system**: Linux\\n\\n\\n### What is happening?\\n\\nThe optimize 1q gates decomposition transpiler pass doesn't check the 1q gates support any angle or not. If a single qubit gate is only registered with a fixed angle the pass treats that as a valid target basis for decomposition.\\n\\n### How can we reproduce the issue?\\n\\n```python\\nfrom qiskit.transpiler import Target\\nfrom qiskit.circuit.library import UGate, SXGate, RZGate\\nfrom qiskit.circuit import QuantumCircuit, Parameter\\nfrom qiskit.transpiler.passes import Optimize1qGatesDecomposition\\n\\ntarget = Target(num_qubits=1)\\ntarget.add_instruction(UGate(3.14, 0, -3.14), {(1,): None})\\ntarget.add_instruction(SXGate(), {(1,): None})\\ntarget.add_instruction(RZGate(Parameter(\"t\")), {(1,): None})\\n\\nopt_pass = Optimize1qGatesDecomposition(target)\\n\\nqc = QuantumCircuit(1)\\nqc.u(1, 2, 3, 0)\\nprint(opt_pass(qc))\\n```\\n\\n### What should happen?\\n\\nThis should return a gate in the ZSX basis, but it instead is returning a circuit with `UGate(1, 2, 3)` because it doesn't recognize that `UGate` is only supported in the target with $\\\\pi$, 0, $-\\\\pi$ and 1, 2, 3 isn't a valid output for a physical optimization pass.\\n\\n### Any suggestions?\\n\\nWe need to update the target check in the pass code to check that the gate supports any angle before trying to use it for synthesis."}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/qiskit_m_qiskit:pr-15131", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/crates/transpiler/src/passes/optimize_1q_gates_decomposition.rs b/crates/transpiler/src/passes/optimize_1q_gates_decomposition.rs\\nindex c000c8fe9560..adcc17caf9a5 100644\\n--- a/crates/transpiler/src/passes/optimize_1q_gates_decomposition.rs\\n+++ b/crates/transpiler/src/passes/optimize_1q_gates_decomposition.rs\\n@@ -20,9 +20,9 @@ use ndarray::prelude::*;\\n use rustworkx_core::petgraph::stable_graph::NodeIndex;\\n \\n use qiskit_circuit::dag_circuit::{DAGCircuit, NodeType};\\n-use qiskit_circuit::operations::{Operation, Param};\\n+use qiskit_circuit::operations::{Operation, OperationRef, Param};\\n \\n-use crate::target::Target;\\n+use crate::target::{Target, TargetOperation};\\n use qiskit_circuit::{PhysicalQubit, gate_matrix};\\n use qiskit_synthesis::euler_one_qubit_decomposer::{\\n EULER_BASES, EULER_BASIS_NAMES, EulerBasis, EulerBasisSet, OneQubitGateSequence,\\n@@ -76,7 +76,30 @@ pub fn run_optimize_1q_gates_decomposition(\\n };\\n if basis_gates_per_qubit[qubit.index()].is_none() {\\n let basis_gates = match target {\\n- Some(target) => Some(target.operation_names_for_qargs(&[qubit])?),\\n+ Some(target) => Some(\\n+ target\\n+ .operation_names_for_qargs(&[qubit])?\\n+ .into_iter()\\n+ .filter(|gate_name| {\\n+ let target_op = target.operation_from_name(gate_name).unwrap();\\n+ let TargetOperation::Normal(gate) = target_op else {\\n+ return false;\\n+ };\\n+ if let OperationRef::StandardGate(_) = gate.operation.view() {\\n+ // For standard gates check that the target entry accepts any\\n+ // params and if so then we can use the gate in the pass\\n+ // else filter the operation since arbitrary angles are not\\n+ // supported\\n+ gate.params\\n+ .iter()\\n+ .all(|x| matches!(x, Param::ParameterExpression(_)))\\n+ } else {\\n+ // For all other gates pass it through\\n+ true\\n+ }\\n+ })\\n+ .collect(),\\n+ ),\\n None => {\\n let basis = basis_gates.as_ref();\\n basis.map(|basis| basis.iter().map(|x| x.as_str()).collect())\\ndiff --git a/releasenotes/notes/fix-1q-decomp-non-param-gates-99624b82227e5608.yaml b/releasenotes/notes/fix-1q-decomp-non-param-gates-99624b82227e5608.yaml\\nnew file mode 100644\\nindex 000000000000..70fb67621289\\n--- /dev/null\\n+++ b/releasenotes/notes/fix-1q-decomp-non-param-gates-99624b82227e5608.yaml\\n@@ -0,0 +1,9 @@\\n+---\\n+fixes:\\n+ - |\\n+ Fixed an issue in the :class:`.Optimize1qGatesDecomposition` when the\\n+ pass was initialized with a :class:`.Target` that contains 1q gates with fixed angle\\n+ parameters. Previously, the pass would potentially output gates outside\\n+ the target as it wasn't checking that the gate in the target supported\\n+ arbitrary parameter values.\\n+ Fixed `#14743 <https://github.com/Qiskit/qiskit/issues/14743>`__.\\n"}, "test": {"test_patch": "diff --git a/test/python/transpiler/test_optimize_1q_decomposition.py b/test/python/transpiler/test_optimize_1q_decomposition.py\\nindex 86bcbc241506..a75db7e16515 100644\\n--- a/test/python/transpiler/test_optimize_1q_decomposition.py\\n+++ b/test/python/transpiler/test_optimize_1q_decomposition.py\\n@@ -782,6 +782,21 @@ def test_unitary_gate_column_major(self):\\n expected.u(0, 0, np.pi / 2, [0])\\n self.assertEqual(result, expected)\\n \\n+ def test_target_fixed_angle_1q_gate(self):\\n+ \"\"\"Test that a fixed angle gate is not used for decomposition.\"\"\"\\n+ target = Target(num_qubits=1)\\n+ target.add_instruction(UGate(3.14, 0, -3.14), {(0,): None})\\n+ target.add_instruction(SXGate(), {(0,): None})\\n+ target.add_instruction(RZGate(Parameter(\"t\")), {(0,): None})\\n+\\n+ opt_pass = Optimize1qGatesDecomposition(target=target)\\n+ qc = QuantumCircuit(1)\\n+ qc.u(1, 2, 3, 0)\\n+ res = opt_pass(qc)\\n+ self.assertNotIn(\"u\", res.count_ops())\\n+ self.assertIn(\"rz\", res.count_ops())\\n+ self.assertIn(\"sx\", res.count_ops())\\n+\\n \\n if __name__ == \"__main__\":\\n unittest.main()\\n", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}194{"question_id": "MSB_Qiskit_qiskit_pr15143", "question_type": "multi_swe_bench", "description": "Fix incorrect mapping of ControlFlow block qargs in `BasisTranslator` (Qiskit/qiskit#15143)", "content": {"org": "Qiskit", "repo": "qiskit", "pr_number": 15143, "issue_title": "Fix incorrect mapping of ControlFlow block qargs in `BasisTranslator`", "issue_body": "<!--\\r\\n\u26a0\ufe0f If you do not respect this template, your pull request will be closed.\\r\\n\u26a0\ufe0f Your pull request title should be short detailed and understandable for all.\\r\\n\u26a0\ufe0f Also, please add a release note file using reno if the change needs to be documented in the release notes.\\r\\n\u26a0\ufe0f If your pull request fixes an open issue, please link to the issue. Use \"Fixes #XXXX\" if this PR *fully* closes the issue XXXX. \\r\\n\u2622\ufe0f If you used an AI tool to code this PR, add \"AI tool used: <Name and version of the tool>\". For example, \"AI tool used: Microsoft Copilot Chat with GPT-5\". Failing to disclose the use of AI tools may result in the PR being closed without further review. \\r\\n\\r\\n\\r\\n- [x] I have added the tests to cover my changes.\\r\\n- [x] I have updated the documentation accordingly.\\r\\n- [x] I have read the CONTRIBUTING document.\\r\\n-->\\r\\n\\r\\n### Summary\\r\\nWhen extracting the basis of the target and applying the translations onto the dag, the `BasisTranslator` would not use the absolute indices of the operating qubits when a control flow operation block was processed during recursion. The following commit adds a mapping to the following `BasisTranslator` methods:\\r\\n- `extract_target_basis_circuit` which only gets called during a recursion step.\\r\\n- `apply_translation` in which it is always `None` unless a recursion step happens.\\r\\n\\r\\nThe provided mapping will correctly direct local block qubit indices into the absolute ones stored by the original circuit from which the operation comes from.\\r\\n\\r\\n### Details and comments\\r\\nThis should help fix #13728.\\r\\n\\r\\n\\r\\n", "base_commit": "83b762d31c8127b77636b38fd0ef91cd3124f472", "resolved_issues": [{"number": 13728, "title": "Transpiler pass does not update qubits registers within body of control flow operations", "body": "### Environment\\n\\n- **Qiskit version**: 1.3.2\\n- **Python version**: 3.10\\n- **Operating system**: Mac OS Sequoia\\n\\n### What is happening?\\n\\nThe issue arises due to the way Qiskit handles control flow structures like for_loop when applying transpilation passes. Specifically, the for_loop construct internally stores a new QuantumCircuit object that does not retain the physical qubit mapping intended for the calibrated custom gate (as defined in the backend target object).\\n\\nWhen the transpilation pipeline reaches the HighLevelSynthesis pass, the method _definitely_skip_node should return True if the gate already has a valid calibration. However, it does not because the physical qubits referenced in the circuit structure do not align with those recorded in the initial_layout during pass execution.\\n\\n### How can we reproduce the issue?\\n\\n```python\\nfrom qiskit.circuit import QuantumCircuit, ParameterVector, Gate, Parameter\\nfrom qiskit import pulse, schedule, transpile\\nfrom qiskit.providers.fake_provider import GenericBackendV2\\nfrom qiskit.transpiler import InstructionProperties, generate_preset_pass_manager, CouplingMap\\n\\nparams = [Parameter(f'a_{i}') for i in range(2)]\\nqc = QuantumCircuit(2)\\necr_cal = Gate(name='ecr_cal', num_qubits=2, params=params)\\nqc_loop = QuantumCircuit(2)\\nqc.append(ecr_cal, [0, 1])\\nwith qc_loop.for_loop([0, 3]) as i:\\n qc_loop.compose(qc, inplace=True)\\n\\nbackend = GenericBackendV2(num_qubits=4,\\n basis_gates=[\"x\", \"sx\", \"ecr\", \"rz\", \"measure\", \"reset\"],\\n coupling_map=CouplingMap.from_full(4),\\n calibrate_instructions=True,\\n control_flow=True)\\n\\nwith pulse.build(backend, name=\"custom_sched\") as custom_sched:\\n pulse.play(pulse.Constant(100, params[0]), pulse.DriveChannel(3))\\n pulse.play(pulse.Constant(100, params[1]), pulse.DriveChannel(4))\\n\\nbackend.target.add_instruction(ecr_cal, properties={(3,4): InstructionProperties(calibration=custom_sched)})\\npm = generate_preset_pass_manager(optimization_level=1,\\n backend=backend,\\n initial_layout=(3,4))\\n\\ntranspiled_circ = pm.run(qc_loop)\\ntranspiled_circ.draw('mpl')`\\n```\\n\\n### What should happen?\\n\\nThe transpilation process should correctly recognize that the ecr_cal gate, mapped to physical qubits (3,4), already has a calibration, and avoid unnecessary synthesis steps.\\nInstead of skipping synthesis, the transpiler does not identify the calibration, likely due to the for_loop internally storing logical qubit indices instead of physical qubits.\\n\\n### Any suggestions?\\n\\nA potential solution could involve ensuring that physical qubit mappings are correctly maintained within control flow constructs, or updating the handling of control flow operations within transpilation passes to correctly propagate the intended qubit mappings.\\n"}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/qiskit_m_qiskit:pr-15143", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/crates/transpiler/src/passes/basis_translator/mod.rs b/crates/transpiler/src/passes/basis_translator/mod.rs\\nindex 70228ca6c62b..a8b9b0410da8 100644\\n--- a/crates/transpiler/src/passes/basis_translator/mod.rs\\n+++ b/crates/transpiler/src/passes/basis_translator/mod.rs\\n@@ -173,7 +173,7 @@ pub fn run_basis_translator(\\n }\\n } else {\\n expanded_target = expanded_target\\n- .union(&qargs_with_non_global_operation[&Qargs::from_iter(qargs.iter().copied())])\\n+ .union(&qargs_with_non_global_operation[&QargsRef::Concrete(qargs)])\\n .cloned()\\n .collect();\\n }\\n@@ -213,6 +213,7 @@ pub fn run_basis_translator(\\n &extra_inst_map,\\n min_qubits,\\n &qargs_with_non_global_operation,\\n+ None,\\n )?;\\n Ok(Some(out_dag))\\n }\\n@@ -320,12 +321,22 @@ fn extract_basis_target(\\n }\\n if node_obj.op.control_flow() {\\n for block in node_obj.op.blocks() {\\n+ // Generate a mapping with the absolute indices and the local ones.\\n+ let qarg_mapping: HashMap<Qubit, Qubit> = dag\\n+ .qargs_interner()\\n+ .get(node_obj.qubits)\\n+ .iter()\\n+ .copied()\\n+ .zip((0..(block.num_qubits() as u32)).map(Qubit))\\n+ .map(|(k, v)| (v, k))\\n+ .collect();\\n extract_basis_target_circ(\\n &block,\\n source_basis,\\n qargs_local_source_basis,\\n min_qubits,\\n qargs_with_non_global_operation,\\n+ &qarg_mapping,\\n );\\n }\\n }\\n@@ -339,6 +350,7 @@ fn extract_basis_target_circ(\\n qargs_local_source_basis: &mut AhashIndexMap<PhysicalQargs, AhashIndexSet<GateIdentifier>>,\\n min_qubits: usize,\\n qargs_with_non_global_operation: &AhashIndexMap<Qargs, AhashIndexSet<&str>>,\\n+ qarg_mapping: &HashMap<Qubit, Qubit>,\\n ) {\\n for node_obj in circuit.iter() {\\n let qargs = circuit.get_qargs(node_obj.qubits);\\n@@ -354,7 +366,12 @@ fn extract_basis_target_circ(\\n // single qubit operation for (1,) as valid. This pattern also holds\\n // true for > 2q ops too (so for 4q operations we need to check for 3q, 2q,\\n // and 1q operations in the same manner)\\n- let physical_qargs: PhysicalQargs = qargs.iter().map(|x| PhysicalQubit(x.0)).collect();\\n+ // Make sure to also map to the physical qubits of the target rather than\\n+ // the virtual locations within the circuit or control-flow operation block.\\n+ let physical_qargs: PhysicalQargs = qargs\\n+ .iter()\\n+ .map(|x| PhysicalQubit(qarg_mapping[x].0))\\n+ .collect();\\n let physical_qargs_as_set: AhashIndexSet<PhysicalQubit> =\\n AhashIndexSet::from_iter(physical_qargs.iter().copied());\\n let physical_qargs: Qargs = physical_qargs.into();\\n@@ -389,12 +406,22 @@ fn extract_basis_target_circ(\\n }\\n if node_obj.op.control_flow() {\\n for block in node_obj.op.blocks() {\\n+ // Generate a mapping with the absolute qubit indices and the current local ones.\\n+ let qarg_mapping: HashMap<Qubit, Qubit> = circuit\\n+ .qargs_interner()\\n+ .get(node_obj.qubits)\\n+ .iter()\\n+ .copied()\\n+ .zip((0..(block.num_qubits() as u32)).map(Qubit))\\n+ .map(|(k, v)| (v, qarg_mapping[&k]))\\n+ .collect();\\n extract_basis_target_circ(\\n &block,\\n source_basis,\\n qargs_local_source_basis,\\n min_qubits,\\n qargs_with_non_global_operation,\\n+ &qarg_mapping,\\n );\\n }\\n }\\n@@ -408,6 +435,7 @@ fn apply_translation(\\n extra_inst_map: &ExtraInstructionMap,\\n min_qubits: usize,\\n qargs_with_non_global_operation: &AhashIndexMap<Qargs, AhashIndexSet<&str>>,\\n+ qarg_mapping: Option<&HashMap<Qubit, Qubit>>,\\n ) -> Result<(DAGCircuit, bool), BasisTranslatorError> {\\n let mut is_updated = false;\\n let out_dag = dag.copy_empty_like(VarsMode::Alike).map_err(|_| {\\n@@ -436,6 +464,13 @@ fn apply_translation(\\n for block in node_obj.op.blocks() {\\n let dag_block: DAGCircuit = DAGCircuit::from_circuit_data(&block, true, None, None, None, None)?;\\n let updated_dag: DAGCircuit;\\n+ // Generate a mapping between the absolute and local qubit indices\\n+ // which will be used to correctly map the operation onto the dag.\\n+ let qarg_mapping: HashMap<Qubit, Qubit> = if let Some(qarg_mapping) = qarg_mapping {\\n+ dag.qargs_interner().get(node_obj.qubits).iter().zip((0..(block.num_qubits() as u32)).map(Qubit)).map(|(k, v)| (v, qarg_mapping[k])).collect()\\n+ } else {\\n+ dag.qargs_interner().get(node_obj.qubits).iter().zip((0..(block.num_qubits() as u32)).map(Qubit)).map(|(k, v)| (v, *k)).collect()\\n+ };\\n (updated_dag, is_updated) = apply_translation(\\n &dag_block,\\n target_basis,\\n@@ -443,6 +478,7 @@ fn apply_translation(\\n extra_inst_map,\\n min_qubits,\\n qargs_with_non_global_operation,\\n+ Some(&qarg_mapping)\\n ).map_err(PyErr::from)?;\\n let flow_circ_block = if is_updated {\\n QUANTUM_CIRCUIT.get_bound(py).call_method1(intern!(py, \"_from_circuit_data\"), (dag_to_circuit(&updated_dag, true)?,))?\\n@@ -496,7 +532,16 @@ fn apply_translation(\\n }\\n continue;\\n }\\n- let node_qarg_as_physical: Qargs = node_qarg.iter().map(|x| PhysicalQubit(x.0)).collect();\\n+ // Map to the absolute indices when provided to avoid mistakenly tracking\\n+ // the operation as global.\\n+ let node_qarg_as_physical: Qargs = if let Some(qarg_mapping) = qarg_mapping {\\n+ node_qarg\\n+ .iter()\\n+ .map(|x| PhysicalQubit(qarg_mapping[x].0))\\n+ .collect()\\n+ } else {\\n+ node_qarg.iter().map(|x| PhysicalQubit(x.0)).collect()\\n+ };\\n if qargs_with_non_global_operation.contains_key(&node_qarg_as_physical)\\n && qargs_with_non_global_operation[&node_qarg_as_physical].contains(node_obj.op.name())\\n {\\n@@ -518,7 +563,15 @@ fn apply_translation(\\n continue;\\n }\\n \\n- let unique_qargs: PhysicalQargs = qubit_set.iter().map(|x| PhysicalQubit(x.0)).collect();\\n+ // Map the unique qargs with the absolute indices as well\\n+ let unique_qargs: PhysicalQargs = if let Some(qarg_mapping) = qarg_mapping {\\n+ qubit_set\\n+ .iter()\\n+ .map(|x| PhysicalQubit(qarg_mapping[x].0))\\n+ .collect()\\n+ } else {\\n+ qubit_set.iter().map(|x| PhysicalQubit(x.0)).collect()\\n+ };\\n if extra_inst_map.contains_key(&unique_qargs) {\\n replace_node(\\n &mut out_dag_builder,\\ndiff --git a/releasenotes/notes/fix-basis-control-custom-gate-b62fd53c73776085.yaml b/releasenotes/notes/fix-basis-control-custom-gate-b62fd53c73776085.yaml\\nnew file mode 100644\\nindex 000000000000..40b719d7cb78\\n--- /dev/null\\n+++ b/releasenotes/notes/fix-basis-control-custom-gate-b62fd53c73776085.yaml\\n@@ -0,0 +1,6 @@\\n+---\\n+fixes:\\n+ - |\\n+ Fixed incorrect behavior in the :class:`.BasisTranslator` pass where a multi-qubit\\n+ gate within a :class:`.ControlFlowOp` block would track with its local qubit indices\\n+ instead of using the absolute indices from the source circuit.\\n\\\\ No newline at end of file\\n"}, "test": {"test_patch": "diff --git a/test/python/transpiler/test_basis_translator.py b/test/python/transpiler/test_basis_translator.py\\nindex 751073deb28c..ba002b6bfa2e 100644\\n--- a/test/python/transpiler/test_basis_translator.py\\n+++ b/test/python/transpiler/test_basis_translator.py\\n@@ -87,6 +87,13 @@ def __init__(self, name=\"2q0p\"):\\n super().__init__(name, 2, [])\\n \\n \\n+class TwoQubitOneParamGate(Gate):\\n+ \"\"\"Mock two qubit one param gate.\"\"\"\\n+\\n+ def __init__(self, theta, name=\"2q1p\"):\\n+ super().__init__(name, 2, [theta])\\n+\\n+\\n class VariadicZeroParamGate(Gate):\\n \"\"\"Mock variadic zero param gate.\"\"\"\\n \\n@@ -459,6 +466,32 @@ def test_nested_loop(self):\\n dag_expected = circuit_to_dag(expected)\\n self.assertEqual(dag_translated, dag_expected)\\n \\n+ def test_loop_custom_gate_local_indices(self):\\n+ \"\"\"Test with a custom gate inside a loop operation with different local qubit indices\"\"\"\\n+\\n+ # Create 3 qubit backend\\n+ backend = GenericBackendV2(num_qubits=3, control_flow=True)\\n+\\n+ # Add only this pair as native to the Target.\\n+ pair = (0, 2)\\n+ alpha = Parameter(\"alpha\")\\n+ gate = TwoQubitOneParamGate(alpha)\\n+\\n+ # Add custom gate to be supported by the Target.\\n+ backend.target.add_instruction(gate, {pair: None}) # properties omitted for brevity\\n+\\n+ # Make the tracking register\\n+ qubits = QuantumRegister(3, \"data\")\\n+\\n+ # Create circuit with loop\\n+ circ = QuantumCircuit(qubits)\\n+ with circ.for_loop(range(2)):\\n+ circ.append(gate, [qubits[0], qubits[2]])\\n+\\n+ # Run the basis translator\\n+ result = BasisTranslator(std_eq_lib, [], backend.target)(circ)\\n+ self.assertEqual(circ, result)\\n+\\n def test_different_bits(self):\\n \"\"\"Test that the basis translator correctly works when the inner blocks of control-flow\\n operations are not over the same bits as the outer blocks.\"\"\"\\n", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}195{"question_id": "MSB_Qiskit_qiskit_pr7952", "question_type": "multi_swe_bench", "description": "Make SabreSwap account for clbits in predecessors (Qiskit/qiskit#7952)", "content": {"org": "Qiskit", "repo": "qiskit", "pr_number": 7952, "issue_title": "Make SabreSwap account for clbits in predecessors", "issue_body": "### Summary\\r\\n\\r\\nPreviously, SabreSwap only checked that it was valid to add a gate back\\r\\nto the DAG by ensuring that all its qubit predecessors had already been\\r\\nadded to the DAG. It did not check for clbit successors. This meant\\r\\nthat measurements and (potentially, unverified) classically conditioned\\r\\ngates could be re-ordered out from the correct topological ordering.\\r\\n\\r\\nThe most notable effect of this was that measurements writing to the\\r\\nsame bit could be re-ordered, changing the output of the circuit.\\r\\n\\r\\nSee gh-7950 for more detail.\\r\\n\\r\\n<!--\\r\\n\u26a0\ufe0f If you do not respect this template, your pull request will be closed.\\r\\n\u26a0\ufe0f Your pull request title should be short detailed and understandable for all.\\r\\n\u26a0\ufe0f Also, please add a release note file using reno if the change needs to be\\r\\n documented in the release notes.\\r\\n\u26a0\ufe0f If your pull request fixes an open issue, please link to the issue.\\r\\n\\r\\n- [ ] I have added the tests to cover my changes.\\r\\n- [ ] I have updated the documentation accordingly.\\r\\n- [ ] I have read the CONTRIBUTING document.\\r\\n-->\\r\\n\\r\\n\\r\\n\\r\\n### Details and comments\\r\\n\\r\\nFix #7950. I also believe this to be the cause of the sporadic randomised test failures (see an example in the linked issue).\\r\\n\\r\\nAli (@ajavadia) - this might be something you ought to look at, since I don't understand SabreSwap well.\\r\\n", "base_commit": "5012ee196495a183ac934cbcc697c2b374ad42cb", "resolved_issues": [{"number": 7950, "title": "`SabreSwap` can reorder operations that depend on the same classical bit", "body": "### Environment\\n\\n- **Qiskit Terra version**: main @ ef997f9\\r\\n- **Python version**: any\\r\\n- **Operating system**: any\\n\\n### What is happening?\\n\\n`SabreSwap` can re-order measurement operations (and probably classically conditioned gates) that write to the same classical bits. This affects optimisation level 3 by default, since it uses sabre to route if nothing else is provided.\\r\\n\\r\\nI am 95% sure this is the cause of the failures we're seeing in the randomised test suite currently.\\r\\n\\r\\n<details><summary>Expand for logs of recent failed randomised run</summary>\\r\\nHypothesis failure at commit 618e0ea8b3daca194c1bde97292e57c15eddd762, in file `test/randomized/test_transpile_equivalence.py`\\r\\n\\r\\n```text\\r\\nFalsifying example:\\r\\nstate = QCircuitMachine()\\r\\nstate.qasm()\\r\\n(v1,) = state.add_creg(n=1)\\r\\nstate.qasm()\\r\\nv2, v3, v4 = state.add_qreg(n=3)\\r\\nstate.qasm()\\r\\nstate.add_3q_gate(gate=qiskit.circuit.library.standard_gates.x.CCXGate, qargs=[v4, v3, v2])\\r\\nstate.qasm()\\r\\nstate.add_1q1c_gate(carg=v1, gate=qiskit.circuit.measure.Measure, qarg=v3)\\r\\nstate.qasm()\\r\\nstate.add_1q2p_gate(gate=qiskit.circuit.library.standard_gates.u2.U2Gate, params=[0.0, 0.0], qarg=v4)\\r\\nstate.qasm()\\r\\nstate.add_1q1c_gate(carg=v1, gate=qiskit.circuit.measure.Measure, qarg=v4)\\r\\nstate.qasm()\\r\\nEvaluating circuit at level 3 on fake_ourense:\\r\\nOPENQASM 2.0;\\r\\ninclude \"qelib1.inc\";\\r\\nqreg q35069[3];\\r\\ncreg c1656[1];\\r\\nccx q35069[2],q35069[1],q35069[0];\\r\\nmeasure q35069[1] -> c1656[0];\\r\\nu2(0,0) q35069[2];\\r\\nmeasure q35069[2] -> c1656[0];\\r\\n\\r\\nstate.equivalent_transpile(backend=<FakeOurense('fake_ourense')>, opt_level=3)\\r\\nstate.teardown()\\r\\n\\r\\nYou can reproduce this example by temporarily adding @reproduce_failure('6.43.2', b'AXicY2Bk5GFgYGDkZWBiYARCIBPIYmAE8thAbEYOBkwAkgKSrEBlzAALaABL') as a decorator on your test case\\r\\n```\\r\\n</details>\\n\\n### How can we reproduce the issue?\\n\\nGiven a circuit:\\r\\n```python\\r\\nimport qiskit\\r\\n\\r\\nqc = qiskit.QuantumCircuit(3, 1)\\r\\nqc.ccx(2, 1, 0)\\r\\nqc.h(0)\\r\\nqc.measure(0, 0)\\r\\nqc.measure(1, 0)\\r\\n```\\r\\nwhich has a drawing\\r\\n```text\\r\\n \u250c\u2500\u2500\u2500\u2510\u250c\u2500\u2500\u2500\u2510\u250c\u2500\u2510\\r\\nq_0: \u2524 X \u251c\u2524 H \u251c\u2524M\u251c\u2500\u2500\u2500\\r\\n \u2514\u2500\u252c\u2500\u2518\u2514\u2500\u2500\u2500\u2518\u2514\u2565\u2518\u250c\u2500\u2510\\r\\nq_1: \u2500\u2500\u25a0\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256b\u2500\u2524M\u251c\\r\\n \u2502 \u2551 \u2514\u2565\u2518\\r\\nq_2: \u2500\u2500\u25a0\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256b\u2500\u2500\u256b\u2500\\r\\n \u2551 \u2551\\r\\nc: 1/\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2569\u2550\u2550\u2569\u2550\\r\\n 0 0\\r\\n```\\r\\nClearly the output of the circuit should always be 0, because qubit 1 is never altered, and is measured second.\\r\\n\\r\\nIf we transpile it with a special coupling map that essentially only has one valid routing for the default decomposition of ccx, the orders of the measurements get flipped, which Aer confirms:\\r\\n```python\\r\\ntranspiled = qiskit.transpile(qc, coupling_map=[[(0, 2), (2, 0), (1, 2), (2, 1)]], routing_method=\"sabre\")\\r\\nbackend = qiskit.Aer.get_backend(\"aer_simulator\")\\r\\nprint(backend.run(qc, shots=1024).result().get_counts())\\r\\nprint(backend.run(transpiled, shots=1024).result().get_counts())\\r\\n```\\r\\nThis produces, for example:\\r\\n```python\\r\\n{'0': 1024}\\r\\n{'1': 503, '0': 521}\\r\\n```\\r\\nbut the second dictionary should be the same as the first.\\r\\n\\r\\n(It's too long to draw `transpiled` here, but if you do it locally, you can see the measurements are swapped.)\\n\\n### What should happen?\\n\\nSabre should take into account the topological ordering of measurements (and other clbits). In the above examples, the counts should both be `{'0': 1024}` (which they are for any other routing method).\\n\\n### Any suggestions?\\n\\nIn both `SabreSwap._successors` and `._is_resolved`, only the quantum bits are accounted for. My very very rough intuition for what's going on makes it feel like it should account for _all_ successors, not just qubits."}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/qiskit_m_qiskit:pr-7952", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/qiskit/transpiler/passes/routing/sabre_swap.py b/qiskit/transpiler/passes/routing/sabre_swap.py\\nindex 3690c763f734..5e44b29e5d13 100644\\n--- a/qiskit/transpiler/passes/routing/sabre_swap.py\\n+++ b/qiskit/transpiler/passes/routing/sabre_swap.py\\n@@ -18,7 +18,6 @@\\n import numpy as np\\n \\n from qiskit.circuit.library.standard_gates import SwapGate\\n-from qiskit.circuit.quantumregister import Qubit\\n from qiskit.transpiler.basepasses import TransformationPass\\n from qiskit.transpiler.exceptions import TranspilerError\\n from qiskit.transpiler.layout import Layout\\n@@ -276,15 +275,18 @@ def _reset_qubits_decay(self):\\n self.qubits_decay = {k: 1 for k in self.qubits_decay.keys()}\\n \\n def _successors(self, node, dag):\\n- for _, successor, edge_data in dag.edges(node):\\n- if not isinstance(successor, DAGOpNode):\\n- continue\\n- if isinstance(edge_data, Qubit):\\n+ \"\"\"Return an iterable of the successors along each wire from the given node.\\n+\\n+ This yields the same successor multiple times if there are parallel wires (e.g. two adjacent\\n+ operations that have one clbit and qubit in common), which is important in the swapping\\n+ algorithm for detecting if each wire has been accounted for.\"\"\"\\n+ for _, successor, _ in dag.edges(node):\\n+ if isinstance(successor, DAGOpNode):\\n yield successor\\n \\n def _is_resolved(self, node):\\n \"\"\"Return True if all of a node's predecessors in dag are applied.\"\"\"\\n- return self.applied_predecessors[node] == len(node.qargs)\\n+ return self.applied_predecessors[node] == len(node.qargs) + len(node.cargs)\\n \\n def _obtain_extended_set(self, dag, front_layer):\\n \"\"\"Populate extended_set by looking ahead a fixed number of gates.\\ndiff --git a/releasenotes/notes/fix-sabreswap-clbits-428eb5f3a46063da.yaml b/releasenotes/notes/fix-sabreswap-clbits-428eb5f3a46063da.yaml\\nnew file mode 100644\\nindex 000000000000..0401e5a36f74\\n--- /dev/null\\n+++ b/releasenotes/notes/fix-sabreswap-clbits-428eb5f3a46063da.yaml\\n@@ -0,0 +1,9 @@\\n+---\\n+fixes:\\n+ - |\\n+ Fixed :class:`.SabreSwap`, and by extension :func:`.transpile` with\\n+ ``optimization_level=3``, occasionally re-ordering measurements invalidly.\\n+ Previously, if two measurements wrote to the same classical bit,\\n+ :class:`.SabreSwap` could (depending on the coupling map) re-order them to\\n+ produce a non-equivalent circuit. This behaviour was stochastic, so may\\n+ not have appeared reliably.\\n"}, "test": {"test_patch": "diff --git a/test/python/transpiler/test_sabre_swap.py b/test/python/transpiler/test_sabre_swap.py\\nindex a19f574a305d..509225f65e75 100644\\n--- a/test/python/transpiler/test_sabre_swap.py\\n+++ b/test/python/transpiler/test_sabre_swap.py\\n@@ -13,6 +13,7 @@\\n \"\"\"Test the Sabre Swap pass\"\"\"\\n \\n import unittest\\n+from qiskit.circuit.library import CCXGate, HGate, Measure\\n from qiskit.transpiler.passes import SabreSwap\\n from qiskit.transpiler import CouplingMap, PassManager\\n from qiskit import QuantumRegister, QuantumCircuit\\n@@ -95,6 +96,34 @@ def test_do_not_change_cm(self):\\n \\n self.assertEqual(set(cm_edges), set(coupling.get_edges()))\\n \\n+ def test_do_not_reorder_measurements(self):\\n+ \"\"\"Test that SabreSwap doesn't reorder measurements to the same classical bit.\\n+\\n+ With the particular coupling map used in this test and the 3q ccx gate, the routing would\\n+ invariably the measurements if the classical successors are not accurately tracked.\\n+ Regression test of gh-7950.\"\"\"\\n+ coupling = CouplingMap([(0, 2), (2, 0), (1, 2), (2, 1)])\\n+ qc = QuantumCircuit(3, 1)\\n+ qc.compose(CCXGate().definition, [0, 1, 2], []) # Unroll CCX to 2q operations.\\n+ qc.h(0)\\n+ qc.barrier()\\n+ qc.measure(0, 0) # This measure is 50/50 between the Z states.\\n+ qc.measure(1, 0) # This measure always overwrites with 0.\\n+ passmanager = PassManager(SabreSwap(coupling))\\n+ transpiled = passmanager.run(qc)\\n+\\n+ last_h, h_qubits, _ = transpiled.data[-4]\\n+ self.assertIsInstance(last_h, HGate)\\n+ first_measure, first_measure_qubits, _ = transpiled.data[-2]\\n+ second_measure, second_measure_qubits, _ = transpiled.data[-1]\\n+ self.assertIsInstance(first_measure, Measure)\\n+ self.assertIsInstance(second_measure, Measure)\\n+ # Assert that the first measure is on the same qubit that the HGate was applied to, and the\\n+ # second measurement is on a different qubit (though we don't care which exactly - that\\n+ # depends a little on the randomisation of the pass).\\n+ self.assertEqual(h_qubits, first_measure_qubits)\\n+ self.assertNotEqual(h_qubits, second_measure_qubits)\\n+\\n \\n if __name__ == \"__main__\":\\n unittest.main()\\n", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}196{"question_id": "MSB_Qiskit_qiskit_pr8041", "question_type": "multi_swe_bench", "description": "Fix SabreSwap with classically conditioned gates (Qiskit/qiskit#8041)", "content": {"org": "Qiskit", "repo": "qiskit", "pr_number": 8041, "issue_title": "Fix SabreSwap with classically conditioned gates", "issue_body": "### Summary\\r\\n\\r\\nThe calculation of the expected number of predecessors for a gate to\\r\\nbe considered \"resolved\" in `SabreSwap` was not accounting for wires\\r\\nstemming from classical conditions. The tracking of the _actual_ number\\r\\nof predecessor requirements satisfied did correctly account for this, so\\r\\nin certain circumstances the actual count could jump from \"too low\" to\\r\\n\"too high\" without passing through \"just right\", and the gate would\\r\\nnever get added to the circuit.\\r\\n\\r\\n<!--\\r\\n\u26a0\ufe0f If you do not respect this template, your pull request will be closed.\\r\\n\u26a0\ufe0f Your pull request title should be short detailed and understandable for all.\\r\\n\u26a0\ufe0f Also, please add a release note file using reno if the change needs to be\\r\\n documented in the release notes.\\r\\n\u26a0\ufe0f If your pull request fixes an open issue, please link to the issue.\\r\\n\\r\\n- [ ] I have added the tests to cover my changes.\\r\\n- [ ] I have updated the documentation accordingly.\\r\\n- [ ] I have read the CONTRIBUTING document.\\r\\n-->\\r\\n\\r\\n\\r\\n\\r\\n### Details and comments\\r\\n\\r\\nFix #8040.", "base_commit": "829f2324c8f8ed93d77c4d69669b211e9aed86ce", "resolved_issues": [{"number": 8040, "title": "`SabreSwap` can throw away classically conditioned gates and all successors", "body": "### Environment\\r\\n\\r\\n- **Qiskit Terra version**: main @ 7726d4704\\r\\n- **Python version**: any\\r\\n- **Operating system**: any\\r\\n\\r\\n\\r\\n### What is happening?\\r\\n\\r\\nThe `SabreSwap` transpiler pass can sometimes remove classically conditioned gates from the circuit, and all their successors, whether or not the successors have classical conditions.\\r\\n\\r\\nThis is (I believe) the cause of the current failures in the randomised test suite (from https://github.com/Qiskit/qiskit-terra/issues/2645#issuecomment-1111747082 to https://github.com/Qiskit/qiskit-terra/issues/2645#issuecomment-1121930469).\\r\\n\\r\\n### How can we reproduce the issue?\\r\\n\\r\\n```python\\r\\nIn [1]: from qiskit import QuantumCircuit\\r\\n ...: from qiskit.transpiler import PassManager, CouplingMap\\r\\n ...: from qiskit.transpiler.passes import SabreSwap, TrivialLayout\\r\\n ...:\\r\\n ...: qc = QuantumCircuit(2, 1)\\r\\n ...: qc.z(0)\\r\\n ...: qc.z(0).c_if(qc.cregs[0], 0)\\r\\n ...: print(qc.draw())\\r\\n ...: print()\\r\\n ...: cm = CouplingMap([(0, 1), (1, 0)])\\r\\n ...: print(PassManager([TrivialLayout(cm), SabreSwap(cm)]).run(qc).draw())\\r\\n \u250c\u2500\u2500\u2500\u2510 \u250c\u2500\u2500\u2500\u2510\\r\\nq_0: \u2524 Z \u251c\u2500\u2524 Z \u251c\u2500\\r\\n \u2514\u2500\u2500\u2500\u2518 \u2514\u2500\u2565\u2500\u2518\\r\\nq_1: \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256b\u2500\u2500\u2500\\r\\n \u250c\u2500\u2500\u2568\u2500\u2500\u2510\\r\\nc: 1/\u2550\u2550\u2550\u2550\u2550\u2561 0x0 \u255e\\r\\n \u2514\u2500\u2500\u2500\u2500\u2500\u2518\\r\\n\\r\\n \u250c\u2500\u2500\u2500\u2510\\r\\nq_0 -> 0 \u2524 Z \u251c\\r\\n \u2514\u2500\u2500\u2500\u2518\\r\\nq_1 -> 1 \u2500\u2500\u2500\u2500\u2500\\r\\n \\r\\n c: 1/\u2550\u2550\u2550\u2550\u2550 \\r\\n```\\r\\n\\r\\n### What should happen?\\r\\n\\r\\nThe transpiled circuit should not have lost the second classically controlled gate.\\r\\n\\r\\n### Any suggestions?\\r\\n\\r\\nConditions currently aren't being accounted for in the \"expected number of predecessors\" calculation that determines whether a gate is eligible to be added to the circuit. The current `_is_resolved` check, since #7952, is:\\r\\n```python\\r\\nself.applied_predecessors[node] == len(node.qargs) + len(node.cargs)\\r\\n```\\r\\nbut conditions are not part of the `cargs`. Since the condition is _equality_ to the known value, if the relevant node is not in the original front layer, its `applied_predecessors` (which correctly account for conditions) can be increased beyond the count of its qargs and cargs, so the condition never triggers.\\r\\n\\r\\n(#7952 didn't cause this issue, it just didn't completely address the issue of all classical arguments.)\\r\\n\\r\\nThe fix is to account for all possible predecessors in `SabreSwap._is_resolved`."}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/qiskit_m_qiskit:pr-8041", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/qiskit/transpiler/passes/routing/sabre_swap.py b/qiskit/transpiler/passes/routing/sabre_swap.py\\nindex c6555b069f10..1a1530508d4f 100644\\n--- a/qiskit/transpiler/passes/routing/sabre_swap.py\\n+++ b/qiskit/transpiler/passes/routing/sabre_swap.py\\n@@ -139,7 +139,7 @@ def __init__(\\n self.heuristic = heuristic\\n self.seed = seed\\n self.fake_run = fake_run\\n- self.applied_predecessors = None\\n+ self.required_predecessors = None\\n self.qubits_decay = None\\n self._bit_indices = None\\n self.dist_matrix = None\\n@@ -188,12 +188,9 @@ def run(self, dag):\\n self.qubits_decay = dict.fromkeys(dag.qubits, 1)\\n \\n # Start algorithm from the front layer and iterate until all gates done.\\n+ self.required_predecessors = self._build_required_predecessors(dag)\\n num_search_steps = 0\\n front_layer = dag.front_layer()\\n- self.applied_predecessors = defaultdict(int)\\n- for _, input_node in dag.input_map.items():\\n- for successor in self._successors(input_node, dag):\\n- self.applied_predecessors[successor] += 1\\n \\n while front_layer:\\n execute_gate_list = []\\n@@ -228,7 +225,7 @@ def run(self, dag):\\n for node in execute_gate_list:\\n self._apply_gate(mapped_dag, node, current_layout, canonical_register)\\n for successor in self._successors(node, dag):\\n- self.applied_predecessors[successor] += 1\\n+ self.required_predecessors[successor] -= 1\\n if self._is_resolved(successor):\\n front_layer.append(successor)\\n \\n@@ -314,6 +311,15 @@ def _reset_qubits_decay(self):\\n \"\"\"\\n self.qubits_decay = {k: 1 for k in self.qubits_decay.keys()}\\n \\n+ def _build_required_predecessors(self, dag):\\n+ out = defaultdict(int)\\n+ # We don't need to count in- or out-wires: outs can never be predecessors, and all input\\n+ # wires are automatically satisfied at the start.\\n+ for node in dag.op_nodes():\\n+ for successor in self._successors(node, dag):\\n+ out[successor] += 1\\n+ return out\\n+\\n def _successors(self, node, dag):\\n \"\"\"Return an iterable of the successors along each wire from the given node.\\n \\n@@ -326,22 +332,22 @@ def _successors(self, node, dag):\\n \\n def _is_resolved(self, node):\\n \"\"\"Return True if all of a node's predecessors in dag are applied.\"\"\"\\n- return self.applied_predecessors[node] == len(node.qargs) + len(node.cargs)\\n+ return self.required_predecessors[node] == 0\\n \\n def _obtain_extended_set(self, dag, front_layer):\\n \"\"\"Populate extended_set by looking ahead a fixed number of gates.\\n For each existing element add a successor until reaching limit.\\n \"\"\"\\n extended_set = []\\n- incremented = []\\n+ decremented = []\\n tmp_front_layer = front_layer\\n done = False\\n while tmp_front_layer and not done:\\n new_tmp_front_layer = []\\n for node in tmp_front_layer:\\n for successor in self._successors(node, dag):\\n- incremented.append(successor)\\n- self.applied_predecessors[successor] += 1\\n+ decremented.append(successor)\\n+ self.required_predecessors[successor] -= 1\\n if self._is_resolved(successor):\\n new_tmp_front_layer.append(successor)\\n if len(successor.qargs) == 2:\\n@@ -350,8 +356,8 @@ def _obtain_extended_set(self, dag, front_layer):\\n done = True\\n break\\n tmp_front_layer = new_tmp_front_layer\\n- for node in incremented:\\n- self.applied_predecessors[node] -= 1\\n+ for node in decremented:\\n+ self.required_predecessors[node] += 1\\n return extended_set\\n \\n def _obtain_swaps(self, front_layer, current_layout):\\ndiff --git a/releasenotes/notes/sabreswap-fix-condition-593f36e855f9064c.yaml b/releasenotes/notes/sabreswap-fix-condition-593f36e855f9064c.yaml\\nnew file mode 100644\\nindex 000000000000..376014ce45b8\\n--- /dev/null\\n+++ b/releasenotes/notes/sabreswap-fix-condition-593f36e855f9064c.yaml\\n@@ -0,0 +1,8 @@\\n+---\\n+fixes:\\n+ - |\\n+ The :class:`.SabreSwap` transpiler pass, used in :func:`.transpile` when\\n+ ``routing_method=\"sabre\"`` is set, will no longer sporadically drop\\n+ classically conditioned gates and their successors from circuits during the\\n+ routing phase of transpilation. See\\n+ `#8040 <https://github.com/Qiskit/qiskit-terra/issues/8040>`__.\\n"}, "test": {"test_patch": "diff --git a/test/python/transpiler/test_sabre_swap.py b/test/python/transpiler/test_sabre_swap.py\\nindex f7a9e96cfd62..89e43b91491d 100644\\n--- a/test/python/transpiler/test_sabre_swap.py\\n+++ b/test/python/transpiler/test_sabre_swap.py\\n@@ -17,9 +17,9 @@\\n import ddt\\n \\n from qiskit.circuit.library import CCXGate, HGate, Measure, SwapGate\\n-from qiskit.transpiler.passes import SabreSwap\\n+from qiskit.transpiler.passes import SabreSwap, TrivialLayout\\n from qiskit.transpiler import CouplingMap, PassManager\\n-from qiskit import QuantumRegister, QuantumCircuit\\n+from qiskit import ClassicalRegister, QuantumRegister, QuantumCircuit\\n from qiskit.test import QiskitTestCase\\n from qiskit.utils import optionals\\n \\n@@ -237,6 +237,31 @@ def leak_number_of_swaps(cls, *args, **kwargs):\\n out_results = sim.run(routed, shots=4096).result().get_counts()\\n self.assertEqual(set(in_results), set(out_results))\\n \\n+ def test_classical_condition(self):\\n+ \"\"\"Test that :class:`.SabreSwap` correctly accounts for classical conditions in its\\n+ reckoning on whether a node is resolved or not. If it is not handled correctly, the second\\n+ gate might not appear in the output.\\n+\\n+ Regression test of gh-8040.\"\"\"\\n+ with self.subTest(\"1 bit in register\"):\\n+ qc = QuantumCircuit(2, 1)\\n+ qc.z(0)\\n+ qc.z(0).c_if(qc.cregs[0], 0)\\n+ cm = CouplingMap([(0, 1), (1, 0)])\\n+ expected = PassManager([TrivialLayout(cm)]).run(qc)\\n+ actual = PassManager([TrivialLayout(cm), SabreSwap(cm)]).run(qc)\\n+ self.assertEqual(expected, actual)\\n+ with self.subTest(\"multiple registers\"):\\n+ cregs = [ClassicalRegister(3), ClassicalRegister(4)]\\n+ qc = QuantumCircuit(QuantumRegister(2, name=\"q\"), *cregs)\\n+ qc.z(0)\\n+ qc.z(0).c_if(cregs[0], 0)\\n+ qc.z(0).c_if(cregs[1], 0)\\n+ cm = CouplingMap([(0, 1), (1, 0)])\\n+ expected = PassManager([TrivialLayout(cm)]).run(qc)\\n+ actual = PassManager([TrivialLayout(cm), SabreSwap(cm)]).run(qc)\\n+ self.assertEqual(expected, actual)\\n+\\n \\n if __name__ == \"__main__\":\\n unittest.main()\\n", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}197{"question_id": "MSB_Qiskit_qiskit_pr9441", "question_type": "multi_swe_bench", "description": "Fix `SolovayKitaev` for roundoff errors in Qiskit gates (Qiskit/qiskit#9441)", "content": {"org": "Qiskit", "repo": "qiskit", "pr_number": 9441, "issue_title": "Fix `SolovayKitaev` for roundoff errors in Qiskit gates", "issue_body": "<!--\\r\\n\u26a0\ufe0f If you do not respect this template, your pull request will be closed.\\r\\n\u26a0\ufe0f Your pull request title should be short detailed and understandable for all.\\r\\n\u26a0\ufe0f Also, please add a release note file using reno if the change needs to be\\r\\n documented in the release notes.\\r\\n\u26a0\ufe0f If your pull request fixes an open issue, please link to the issue.\\r\\n\\r\\n- [ ] I have added the tests to cover my changes.\\r\\n- [ ] I have updated the documentation accordingly.\\r\\n- [ ] I have read the CONTRIBUTING document.\\r\\n-->\\r\\n\\r\\n### Summary\\r\\n\\r\\nFixes #9437.\\r\\n\\r\\n\\r\\n", "base_commit": "85c30a2ffd47bd60944ed9820e878cd4eb538b21", "resolved_issues": [{"number": 9437, "title": "Solovay-Kitaev, ValueError: Input matrix is not orthogonal.", "body": "### Environment\\r\\n\\r\\n- **Commit hash**: dc8e232a\\r\\n- **Python version**: 3.8.7\\r\\n- **Operating system**: Ubuntu 20.04.5 LTS\\r\\n- **Qiskit Terra version**: 0.24.0\\r\\n\\r\\n### What is happening?\\r\\n\\r\\nI'm trying to run the newly added SolovayKitaev (SK) algorithm. For some simple qiskit circuits the SK works, but most of the time it produces the following error:\\r\\n\\r\\n```\\r\\n---------------------------------------------------------------------------\\r\\nValueError Traceback (most recent call last)\\r\\nCell In[13], line 15\\r\\n 12 # Time computation\\r\\n 13 start_time = time.time()\\r\\n---> 15 discretized = skd(transpiled_circ_qasm)\\r\\n 17 print(\"\\\\t Time of conversion:\", (time.time() - start_time) / 60, \" min\")\\r\\n\\r\\nFile ~/.pyenv/versions/circuit_comp_qiskit_dev/lib/python3.8/site-packages/qiskit/transpiler/basepasses.py:121, in BasePass.__call__(self, circuit, property_set)\\r\\n 118 if isinstance(property_set_, PropertySet):\\r\\n 119 self.property_set = property_set_\\r\\n--> 121 result = self.run(circuit_to_dag(circuit))\\r\\n 123 result_circuit = circuit\\r\\n 125 if isinstance(property_set, dict): # this includes (dict, PropertySet)\\r\\n\\r\\nFile ~/.pyenv/versions/circuit_comp_qiskit_dev/lib/python3.8/site-packages/qiskit/transpiler/passes/synthesis/solovay_kitaev_synthesis.py:158, in SolovayKitaev.run(self, dag)\\r\\n 155 matrix = node.op.to_matrix()\\r\\n 157 # call solovay kitaev\\r\\n--> 158 approximation = self._sk.run(matrix, self.recursion_degree, return_dag=True)\\r\\n 160 # convert to a dag and replace the gate by the approximation\\r\\n 161 dag.substitute_node_with_dag(node, approximation)\\r\\n\\r\\nFile ~/.pyenv/versions/circuit_comp_qiskit_dev/lib/python3.8/site-packages/qiskit/synthesis/discrete_basis/solovay_kitaev.py:107, in SolovayKitaevDecomposition.run(self, gate_matrix, recursion_degree, return_dag)\\r\\n 104 global_phase = np.arctan2(np.imag(z), np.real(z))\\r\\n 106 # get the decompositon as GateSequence type\\r\\n--> 107 decomposition = self._recurse(gate_matrix_su2, recursion_degree)\\r\\n 109 # simplify\\r\\n 110 _remove_identities(decomposition)\\r\\n\\r\\nFile ~/.pyenv/versions/circuit_comp_qiskit_dev/lib/python3.8/site-packages/qiskit/synthesis/discrete_basis/solovay_kitaev.py:146, in SolovayKitaevDecomposition._recurse(self, sequence, n)\\r\\n 142 u_n1 = self._recurse(sequence, n - 1)\\r\\n 144 v_n, w_n = commutator_decompose(sequence.dot(u_n1.adjoint()).product)\\r\\n--> 146 v_n1 = self._recurse(v_n, n - 1)\\r\\n 147 w_n1 = self._recurse(w_n, n - 1)\\r\\n 148 return v_n1.dot(w_n1).dot(v_n1.adjoint()).dot(w_n1.adjoint()).dot(u_n1)\\r\\n\\r\\nFile ~/.pyenv/versions/circuit_comp_qiskit_dev/lib/python3.8/site-packages/qiskit/synthesis/discrete_basis/solovay_kitaev.py:144, in SolovayKitaevDecomposition._recurse(self, sequence, n)\\r\\n 140 return self.find_basic_approximation(sequence)\\r\\n 142 u_n1 = self._recurse(sequence, n - 1)\\r\\n--> 144 v_n, w_n = commutator_decompose(sequence.dot(u_n1.adjoint()).product)\\r\\n 146 v_n1 = self._recurse(v_n, n - 1)\\r\\n 147 w_n1 = self._recurse(w_n, n - 1)\\r\\n\\r\\nFile ~/.pyenv/versions/circuit_comp_qiskit_dev/lib/python3.8/site-packages/qiskit/synthesis/discrete_basis/commutator_decompose.py:224, in commutator_decompose(u_so3, check_input)\\r\\n 220 identity = np.identity(3)\\r\\n 221 if not (\\r\\n 222 np.allclose(u_so3.dot(u_so3.T), identity) and np.allclose(u_so3.T.dot(u_so3), identity)\\r\\n 223 ):\\r\\n--> 224 raise ValueError(\"Input matrix is not orthogonal.\")\\r\\n 226 angle = _solve_decomposition_angle(u_so3)\\r\\n 228 # Compute rotation about x-axis with angle 'angle'\\r\\n\\r\\nValueError: Input matrix is not orthogonal.\\r\\n```\\r\\n\\r\\n### How can we reproduce the issue?\\r\\n\\r\\nSince I can't share the qiskit circuit, I will upload its QASM file which contains about 100 (out of few millions) gates of the original circuit. This QASM file is enough to replicate the error.\\r\\n\\r\\nFirst, I will give the code:\\r\\n```\\r\\n# Load the QASM file\\r\\ntranspiled_circ_qasm = QuantumCircuit.from_qasm_file(filename)\\r\\n\\r\\n# Do SK pass\\r\\ndepth = 4\\r\\ngate_approx_library = generate_basic_approximations(\\r\\n basis_gates=[\"h\", \"t\", \"tdg\", \"s\", \"z\"], depth=depth\\r\\n)\\r\\n\\r\\nskd = SolovayKitaev(recursion_degree=2, basic_approximations=gate_approx_library)\\r\\ndiscretized = skd(transpiled_circ_qasm)\\r\\n\\r\\n``` \\r\\n\\r\\nHere is the partial QASM file generated from a qiskit circuit:\\r\\n```\\r\\nOPENQASM 2.0;\\r\\ninclude \"qelib1.inc\";\\r\\nqreg eigenvalue_ancilla_register[1];\\r\\nqreg eigenvalue_register[4];\\r\\nqreg coin_register[3];\\r\\nqreg coin_ancilla_register[1];\\r\\nqreg power_register[8];\\r\\nqreg state_register[8];\\r\\ncreg classical_register[8];\\r\\nu3(pi/2,-pi,-pi) eigenvalue_ancilla_register[0];\\r\\nu3(pi/2,pi/2,-pi) eigenvalue_register[0];\\r\\nu3(pi/2,pi/2,-pi) eigenvalue_register[1];\\r\\nu3(pi/2,pi/2,-pi) eigenvalue_register[2];\\r\\nu3(pi/2,pi/2,-pi) eigenvalue_register[3];\\r\\nu3(pi/2,pi/2,-pi) coin_register[0];\\r\\ncx eigenvalue_register[0],coin_register[0];\\r\\nu3(-pi/4,0,-pi/2) coin_register[0];\\r\\ncx eigenvalue_register[0],coin_register[0];\\r\\nu3(pi/4,-pi/16,0) coin_register[0];\\r\\nu3(0,0,pi/16) eigenvalue_register[0];\\r\\ncx eigenvalue_register[0],coin_register[0];\\r\\nu3(0,0,pi/16) coin_register[0];\\r\\nu3(0,pi/4,pi/4) eigenvalue_register[0];\\r\\nu3(pi/2,pi/2,-pi) coin_register[1];\\r\\ncx eigenvalue_register[0],coin_register[1];\\r\\nu3(-pi/4,0,-pi/2) coin_register[1];\\r\\ncx eigenvalue_register[0],coin_register[1];\\r\\nu3(pi/4,-pi/16,0) coin_register[1];\\r\\nu3(0,0,pi/16) eigenvalue_register[0];\\r\\ncx eigenvalue_register[0],coin_register[1];\\r\\nu3(pi/2,0,-15*pi/16) coin_register[1];\\r\\ncx coin_register[0],coin_register[1];\\r\\nu1(-pi/4) coin_register[1];\\r\\ncx eigenvalue_register[0],coin_register[1];\\r\\nu1(pi/4) coin_register[1];\\r\\ncx coin_register[0],coin_register[1];\\r\\nu1(pi/4) coin_register[0];\\r\\nu1(-pi/4) coin_register[1];\\r\\ncx eigenvalue_register[0],coin_register[1];\\r\\nu3(pi/2,0,-3*pi/4) coin_register[1];\\r\\ncx eigenvalue_register[0],coin_register[0];\\r\\nu1(-pi/4) coin_register[0];\\r\\ncx eigenvalue_register[0],coin_register[0];\\r\\nu3(0,0,-pi/16) eigenvalue_register[0];\\r\\ncx eigenvalue_register[0],coin_register[1];\\r\\nu3(0,0,pi/16) coin_register[1];\\r\\ncx eigenvalue_register[0],coin_register[1];\\r\\nu3(pi/2,0,15*pi/16) coin_register[1];\\r\\ncx coin_register[0],coin_register[1];\\r\\nu1(-pi/4) coin_register[1];\\r\\ncx eigenvalue_register[0],coin_register[1];\\r\\nu1(pi/4) coin_register[1];\\r\\ncx coin_register[0],coin_register[1];\\r\\nu1(pi/4) coin_register[0];\\r\\nu1(-pi/4) coin_register[1];\\r\\ncx eigenvalue_register[0],coin_register[1];\\r\\nu3(pi/2,0,-3*pi/4) coin_register[1];\\r\\ncx eigenvalue_register[0],coin_register[0];\\r\\nu1(-pi/4) coin_register[0];\\r\\ncx eigenvalue_register[0],coin_register[0];\\r\\nu3(0,pi/4,pi/4) eigenvalue_register[0];\\r\\nu3(pi/2,pi/2,-pi) coin_register[2];\\r\\ncx eigenvalue_register[0],coin_register[2];\\r\\nu3(-pi/4,0,-pi/2) coin_register[2];\\r\\ncx eigenvalue_register[0],coin_register[2];\\r\\nu3(pi/4,-pi/16,0) coin_register[2];\\r\\nu3(0,0,pi/16) eigenvalue_register[0];\\r\\ncx eigenvalue_register[0],coin_register[2];\\r\\nu3(pi/2,0,-15*pi/16) coin_register[2];\\r\\ncx coin_register[1],coin_register[2];\\r\\nu1(-pi/4) coin_register[2];\\r\\ncx eigenvalue_register[0],coin_register[2];\\r\\nu1(pi/4) coin_register[2];\\r\\ncx coin_register[1],coin_register[2];\\r\\nu1(pi/4) coin_register[1];\\r\\nu1(-pi/4) coin_register[2];\\r\\ncx eigenvalue_register[0],coin_register[2];\\r\\nu3(pi/2,0,-3*pi/4) coin_register[2];\\r\\ncx eigenvalue_register[0],coin_register[1];\\r\\nu1(-pi/4) coin_register[1];\\r\\ncx eigenvalue_register[0],coin_register[1];\\r\\nu3(0,0,-pi/16) eigenvalue_register[0];\\r\\ncx eigenvalue_register[0],coin_register[2];\\r\\nu3(0,0,pi/16) coin_register[2];\\r\\ncx eigenvalue_register[0],coin_register[2];\\r\\nu3(pi/2,0,15*pi/16) coin_register[2];\\r\\ncx coin_register[0],coin_register[2];\\r\\nu1(-pi/4) coin_register[2];\\r\\ncx eigenvalue_register[0],coin_register[2];\\r\\nu1(pi/4) coin_register[2];\\r\\ncx coin_register[0],coin_register[2];\\r\\nu1(pi/4) coin_register[0];\\r\\nu1(-pi/4) coin_register[2];\\r\\ncx eigenvalue_register[0],coin_register[2];\\r\\nu3(pi/2,0,-3*pi/4) coin_register[2];\\r\\ncx eigenvalue_register[0],coin_register[0];\\r\\nu1(-pi/4) coin_register[0];\\r\\ncx eigenvalue_register[0],coin_register[0];\\r\\nu3(0,0,pi/16) eigenvalue_register[0];\\r\\ncx eigenvalue_register[0],coin_register[2];\\r\\nu3(0,0,-pi/16) coin_register[2];\\r\\ncx eigenvalue_register[0],coin_register[2];\\r\\nu3(pi/2,0,-15*pi/16) coin_register[2];\\r\\ncx coin_register[1],coin_register[2];\\r\\nu1(-pi/4) coin_register[2];\\r\\ncx eigenvalue_register[0],coin_register[2];\\r\\nu1(pi/4) coin_register[2];\\r\\ncx coin_register[1],coin_register[2];\\r\\nu1(pi/4) coin_register[1];\\r\\nu1(-pi/4) coin_register[2];\\r\\ncx eigenvalue_register[0],coin_register[2];\\r\\nu3(pi/2,0,-3*pi/4) coin_register[2];\\r\\ncx eigenvalue_register[0],coin_register[1];\\r\\nu1(-pi/4) coin_register[1];\\r\\ncx eigenvalue_register[0],coin_register[1];\\r\\nu3(0,0,-pi/16) eigenvalue_register[0];\\r\\ncx eigenvalue_register[0],coin_register[2];\\r\\nu3(0,0,pi/16) coin_register[2];\\r\\ncx eigenvalue_register[0],coin_register[2];\\r\\nu3(pi/2,0,15*pi/16) coin_register[2];\\r\\ncx coin_register[0],coin_register[2];\\r\\nu1(-pi/4) coin_register[2];\\r\\ncx eigenvalue_register[0],coin_register[2];\\r\\nu1(pi/4) coin_register[2];\\r\\ncx coin_register[0],coin_register[2];\\r\\nu1(pi/4) coin_register[0];\\r\\nu1(-pi/4) coin_register[2];\\r\\ncx eigenvalue_register[0],coin_register[2];\\r\\nu3(pi/2,0,-3*pi/4) coin_register[2];\\r\\n```\\r\\n\\r\\n### What should happen?\\r\\n\\r\\nI would like to emphasize that even if I feed the circuit directly into SK (without loading it as QASM), the SK algorithm still produces the error. The original circuit was created exclusively with qiskit's default toolset and it runs on qiskit simulators without problems.\\r\\n\\r\\nThe expectation is that the following lines of code should produce a new quantum circuit which is comprised of $S, T, T^*, Z, CNOT$ and $H$ gates. Instead there is an error `ValueError: Input matrix is not orthogonal.`\\r\\n\\r\\n```\\r\\nskd = SolovayKitaev(recursion_degree=2, basic_approximations=gate_approx_library)\\r\\ndiscretized = skd(transpiled_circ_qasm)\\r\\n```\\r\\n\\r\\n### Any suggestions?\\r\\n\\r\\nI can only kindly ask to fix this issue ASAP."}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/qiskit_m_qiskit:pr-9441", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/qiskit/synthesis/discrete_basis/commutator_decompose.py b/qiskit/synthesis/discrete_basis/commutator_decompose.py\\nindex c50a19dfa35e..10622e76e2c9 100644\\n--- a/qiskit/synthesis/discrete_basis/commutator_decompose.py\\n+++ b/qiskit/synthesis/discrete_basis/commutator_decompose.py\\n@@ -16,6 +16,7 @@\\n \\n import math\\n import numpy as np\\n+from qiskit.quantum_info.operators.predicates import is_identity_matrix\\n from .gate_sequence import _check_is_so3, GateSequence\\n \\n \\n@@ -217,10 +218,7 @@ def commutator_decompose(\\n # assert that the input matrix is really SO(3)\\n _check_is_so3(u_so3)\\n \\n- identity = np.identity(3)\\n- if not (\\n- np.allclose(u_so3.dot(u_so3.T), identity) and np.allclose(u_so3.T.dot(u_so3), identity)\\n- ):\\n+ if not is_identity_matrix(u_so3.dot(u_so3.T)):\\n raise ValueError(\"Input matrix is not orthogonal.\")\\n \\n angle = _solve_decomposition_angle(u_so3)\\ndiff --git a/qiskit/synthesis/discrete_basis/solovay_kitaev.py b/qiskit/synthesis/discrete_basis/solovay_kitaev.py\\nindex cd470265f348..62ad50582d40 100644\\n--- a/qiskit/synthesis/discrete_basis/solovay_kitaev.py\\n+++ b/qiskit/synthesis/discrete_basis/solovay_kitaev.py\\n@@ -86,14 +86,20 @@ def load_basic_approximations(self, data: list | str | dict) -> list[GateSequenc\\n return sequences\\n \\n def run(\\n- self, gate_matrix: np.ndarray, recursion_degree: int, return_dag: bool = False\\n+ self,\\n+ gate_matrix: np.ndarray,\\n+ recursion_degree: int,\\n+ return_dag: bool = False,\\n+ check_input: bool = True,\\n ) -> \"QuantumCircuit\" | \"DAGCircuit\":\\n r\"\"\"Run the algorithm.\\n \\n Args:\\n- gate_matrix: The 2x2 matrix representing the gate. Does not need to be SU(2).\\n+ gate_matrix: The 2x2 matrix representing the gate. This matrix has to be SU(2)\\n+ up to global phase.\\n recursion_degree: The recursion degree, called :math:`n` in the paper.\\n return_dag: If ``True`` return a :class:`.DAGCircuit`, else a :class:`.QuantumCircuit`.\\n+ check_input: If ``True`` check that the input matrix is valid for the decomposition.\\n \\n Returns:\\n A one-qubit circuit approximating the ``gate_matrix`` in the specified discrete basis.\\n@@ -104,7 +110,7 @@ def run(\\n global_phase = np.arctan2(np.imag(z), np.real(z))\\n \\n # get the decompositon as GateSequence type\\n- decomposition = self._recurse(gate_matrix_su2, recursion_degree)\\n+ decomposition = self._recurse(gate_matrix_su2, recursion_degree, check_input=check_input)\\n \\n # simplify\\n _remove_identities(decomposition)\\n@@ -120,18 +126,20 @@ def run(\\n \\n return out\\n \\n- def _recurse(self, sequence: GateSequence, n: int) -> GateSequence:\\n+ def _recurse(self, sequence: GateSequence, n: int, check_input: bool = True) -> GateSequence:\\n \"\"\"Performs ``n`` iterations of the Solovay-Kitaev algorithm on ``sequence``.\\n \\n Args:\\n- sequence: GateSequence to which the Solovay-Kitaev algorithm is applied.\\n- n: number of iterations that the algorithm needs to run.\\n+ sequence: ``GateSequence`` to which the Solovay-Kitaev algorithm is applied.\\n+ n: The number of iterations that the algorithm needs to run.\\n+ check_input: If ``True`` check that the input matrix represented by ``GateSequence``\\n+ is valid for the decomposition.\\n \\n Returns:\\n GateSequence that approximates ``sequence``.\\n \\n Raises:\\n- ValueError: if ``u`` does not represent an SO(3)-matrix.\\n+ ValueError: If the matrix in ``GateSequence`` does not represent an SO(3)-matrix.\\n \"\"\"\\n if sequence.product.shape != (3, 3):\\n raise ValueError(\"Shape of U must be (3, 3) but is\", sequence.shape)\\n@@ -139,12 +147,14 @@ def _recurse(self, sequence: GateSequence, n: int) -> GateSequence:\\n if n == 0:\\n return self.find_basic_approximation(sequence)\\n \\n- u_n1 = self._recurse(sequence, n - 1)\\n+ u_n1 = self._recurse(sequence, n - 1, check_input=check_input)\\n \\n- v_n, w_n = commutator_decompose(sequence.dot(u_n1.adjoint()).product)\\n+ v_n, w_n = commutator_decompose(\\n+ sequence.dot(u_n1.adjoint()).product, check_input=check_input\\n+ )\\n \\n- v_n1 = self._recurse(v_n, n - 1)\\n- w_n1 = self._recurse(w_n, n - 1)\\n+ v_n1 = self._recurse(v_n, n - 1, check_input=check_input)\\n+ w_n1 = self._recurse(w_n, n - 1, check_input=check_input)\\n return v_n1.dot(w_n1).dot(v_n1.adjoint()).dot(w_n1.adjoint()).dot(u_n1)\\n \\n def find_basic_approximation(self, sequence: GateSequence) -> Gate:\\ndiff --git a/qiskit/transpiler/passes/synthesis/solovay_kitaev_synthesis.py b/qiskit/transpiler/passes/synthesis/solovay_kitaev_synthesis.py\\nindex feb40ad53f04..43ae079b9fc2 100644\\n--- a/qiskit/transpiler/passes/synthesis/solovay_kitaev_synthesis.py\\n+++ b/qiskit/transpiler/passes/synthesis/solovay_kitaev_synthesis.py\\n@@ -18,6 +18,7 @@\\n import numpy as np\\n \\n from qiskit.converters import circuit_to_dag\\n+from qiskit.circuit.gate import Gate\\n from qiskit.dagcircuit import DAGCircuit\\n from qiskit.synthesis.discrete_basis.solovay_kitaev import SolovayKitaevDecomposition\\n from qiskit.synthesis.discrete_basis.generate_basis_approximations import (\\n@@ -146,16 +147,21 @@ def run(self, dag: DAGCircuit) -> DAGCircuit:\\n if not node.op.num_qubits == 1:\\n continue # ignore all non-single qubit gates\\n \\n+ # we do not check the input matrix as we know it comes from a Qiskit gate, as this\\n+ # we know it will generate a valid SU(2) matrix\\n+ check_input = not isinstance(node.op, Gate)\\n+\\n if not hasattr(node.op, \"to_matrix\"):\\n raise TranspilerError(\\n- \"SolovayKitaev does not support gate without \"\\n- f\"to_matrix method: {node.op.name}\"\\n+ f\"SolovayKitaev does not support gate without to_matrix method: {node.op.name}\"\\n )\\n \\n matrix = node.op.to_matrix()\\n \\n # call solovay kitaev\\n- approximation = self._sk.run(matrix, self.recursion_degree, return_dag=True)\\n+ approximation = self._sk.run(\\n+ matrix, self.recursion_degree, return_dag=True, check_input=check_input\\n+ )\\n \\n # convert to a dag and replace the gate by the approximation\\n dag.substitute_node_with_dag(node, approximation)\\n"}, "test": {"test_patch": "diff --git a/test/python/transpiler/test_solovay_kitaev.py b/test/python/transpiler/test_solovay_kitaev.py\\nindex 95dfd06763d0..d3d85b8cfb76 100644\\n--- a/test/python/transpiler/test_solovay_kitaev.py\\n+++ b/test/python/transpiler/test_solovay_kitaev.py\\n@@ -202,6 +202,35 @@ def test_approximation_on_qft(self):\\n discretized = skd(transpiled)\\n self.assertLess(_trace_distance(transpiled, discretized), 7)\\n \\n+ def test_u_gates_work(self):\\n+ \"\"\"Test SK works on Qiskit's UGate.\\n+\\n+ Regression test of Qiskit/qiskit-terra#9437.\\n+ \"\"\"\\n+ circuit = QuantumCircuit(1)\\n+ circuit.u(np.pi / 2, -np.pi, -np.pi, 0)\\n+ circuit.u(np.pi / 2, np.pi / 2, -np.pi, 0)\\n+ circuit.u(-np.pi / 4, 0, -np.pi / 2, 0)\\n+ circuit.u(np.pi / 4, -np.pi / 16, 0, 0)\\n+ circuit.u(0, 0, np.pi / 16, 0)\\n+ circuit.u(0, np.pi / 4, np.pi / 4, 0)\\n+ circuit.u(np.pi / 2, 0, -15 * np.pi / 16, 0)\\n+ circuit.p(-np.pi / 4, 0)\\n+ circuit.p(np.pi / 4, 0)\\n+ circuit.u(np.pi / 2, 0, -3 * np.pi / 4, 0)\\n+ circuit.u(0, 0, -np.pi / 16, 0)\\n+ circuit.u(np.pi / 2, 0, 15 * np.pi / 16, 0)\\n+\\n+ depth = 4\\n+ basis_gates = [\"h\", \"t\", \"tdg\", \"s\", \"z\"]\\n+ gate_approx_library = generate_basic_approximations(basis_gates=basis_gates, depth=depth)\\n+\\n+ skd = SolovayKitaev(recursion_degree=2, basic_approximations=gate_approx_library)\\n+ discretized = skd(circuit)\\n+\\n+ included_gates = set(discretized.count_ops().keys())\\n+ self.assertEqual(set(basis_gates), included_gates)\\n+\\n \\n @ddt\\n class TestGateSequence(QiskitTestCase):\\n", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}198{"question_id": "MSB_Qiskit_qiskit_pr9836", "question_type": "multi_swe_bench", "description": "Fix wrong relative phase of MCRZ (Qiskit/qiskit#9836)", "content": {"org": "Qiskit", "repo": "qiskit", "pr_number": 9836, "issue_title": "Fix wrong relative phase of MCRZ", "issue_body": "<!--\\r\\n\u26a0\ufe0f If you do not respect this template, your pull request will be closed.\\r\\n\u26a0\ufe0f Your pull request title should be short detailed and understandable for all.\\r\\n\u26a0\ufe0f Also, please add a release note file using reno if the change needs to be\\r\\n documented in the release notes.\\r\\n\u26a0\ufe0f If your pull request fixes an open issue, please link to the issue.\\r\\n\\r\\n- [X] I have added the tests to cover my changes.\\r\\n- [ ] I have updated the documentation accordingly.\\r\\n- [X] I have read the CONTRIBUTING document.\\r\\n-->\\r\\n\\r\\n### Summary\\r\\n\\r\\nThis PR is on top of PR #9688 and fixes #9202.\\r\\n\\r\\n\\r\\n", "base_commit": "93b561cc431be8d61a576b9604d11faeebc90446", "resolved_issues": [{"number": 9202, "title": "QuantumCircuit.mcrz not correct", "body": "### Environment\\r\\n\\r\\n- **Qiskit Terra version**: 0.22.2\\r\\n- **Python version**: 3.9.7\\r\\n- **Operating system**: Darwin\\r\\n\\r\\n\\r\\n### What is happening?\\r\\n\\r\\nmulticontrol Rz rotation not correctly being built - see example below. \\r\\n\\r\\n(Also multicontrol Rz, Ry, Rx gates can all be implemented using fewer nonlocal (two) qubit gates... See solution below)\\r\\n\\r\\n### How can we reproduce the issue?\\r\\n\\r\\n```\\r\\nfrom qiskit.quantum_info import Operator\\r\\nfrom qiskit import QuantumCircuit, transpile\\r\\nimport numpy as np\\r\\nfrom qiskit.circuit.library import MCMT\\r\\n\\r\\n\\r\\n######\u00a0two qubit case ####\\r\\nangle = np.pi/3\\r\\n### correct\\r\\ncrz_circuit = QuantumCircuit(2)\\r\\ncrz_circuit.crz(angle, 0,1)\\r\\ncrz_circuit_unitary = Operator(crz_circuit).data\\r\\n\\r\\n### incorrect\\r\\nmulti_crz = QuantumCircuit(2)\\r\\nmulti_crz.mcrz(angle, [0],1)\\r\\nmulti_crz_unitary = Operator(multi_crz).data\\r\\n\\r\\n## FALSE\\r\\nprint('single control correct:', np.allclose(crz_circuit_unitary,\\r\\n multi_crz_unitary))\\r\\n\\r\\n######\u00a0multi control case ####\\r\\nctrl_list = [0,2,5]\\r\\ntarget= 4\\r\\n\\r\\n# ## Correct\\r\\ngate = QuantumCircuit(1)\\r\\ngate.rz(angle, 0)\\r\\n \\r\\nmc_gate = MCMT(gate,\\r\\n num_ctrl_qubits=len(ctrl_list),\\r\\n num_target_qubits=1).to_gate()\\r\\n\\r\\n\\r\\nmc_circuit = QuantumCircuit(max([target, max(ctrl_list)])+1)\\r\\nmc_circuit.append(mc_gate, [*ctrl_list, target])\\r\\n\\r\\n\\r\\n# ## Incorrect\\r\\nmcrz_multi = QuantumCircuit(max([target, max(ctrl_list)])+1)\\r\\nmcrz_multi.mcrz(angle,ctrl_list,target)\\r\\n\\r\\n\\r\\nprint('multicontrol correct: ', np.allclose(Operator(mc_circuit).data,\\r\\n Operator(mcrz_multi).data))\\r\\n```\\r\\n\\r\\n### What should happen?\\r\\n\\r\\nmcrz method in `QuantumCircuit ` should implement the correct quantum circuit. Solution provided below.\\r\\n\\r\\n### Any suggestions?\\r\\n\\r\\nThis code fixes the problem and acutally reduces the depth of all multicontrol rotation Rz,Ry,Rz gates:\\r\\n\\r\\n```\\r\\nfrom qiskit import QuantumCircuit\\r\\n\\r\\ndef primitive_block(angle, n_ctrl, axis):\\r\\n \"\"\"\\r\\n get primative gates to perform multicontrol rotation\\r\\n \"\"\"\\r\\n primitive=QuantumCircuit(2)\\r\\n if axis=='x':\\r\\n primitive.rx(angle/(2**n_ctrl), 1); primitive.cz(0,1)\\r\\n elif axis=='y':\\r\\n primitive.ry(angle/(2**n_ctrl), 1); primitive.cx(0,1)\\r\\n elif axis=='z':\\r\\n primitive.rz(angle/(2**n_ctrl), 1); primitive.cx(0,1)\\r\\n else:\\r\\n raise ValueError('Unrecognised axis, must be one of x,y or z.')\\r\\n \\r\\n return primitive\\r\\n\\r\\ndef get_pattern(n_ctrl, pattern=[0]):\\r\\n \"\"\"\\r\\n find control sequence to implement an n_control gate \\r\\n \"\"\"\\r\\n if n_ctrl == pattern[-1]+1:\\r\\n return pattern\\r\\n else:\\r\\n new_pattern = pattern*2\\r\\n new_pattern[-1]+=1\\r\\n return get_pattern(n_ctrl, new_pattern)\\r\\n \\r\\ndef custom_mcrtl_rot(angle, ctrl_list, target, axis='y'):\\r\\n \"\"\"\\r\\n return circuit that performs an n-control: Rz, Ry, Rx rotation\\r\\n \\r\\n \"\"\"\\r\\n assert axis in ['x','y','z'], f'can only rotated around x,y,z axis, not {axis}'\\r\\n \\r\\n ctrl_list=sorted(ctrl_list)\\r\\n n_ctrl=len(ctrl_list)\\r\\n circ=QuantumCircuit(max([target, max(ctrl_list)])+1) \\r\\n pattern = get_pattern(n_ctrl)\\r\\n \\r\\n if n_ctrl >1: \\r\\n for s,i in enumerate(pattern):\\r\\n j = ctrl_list[-i-1]\\r\\n p = primitive_block((-1)**s*angle, n_ctrl, axis)\\r\\n circ = circ.compose(p, [j,target])\\r\\n\\r\\n circ = circ.compose(circ)\\r\\n else:\\r\\n p_plus = primitive_block(+angle, n_ctrl, axis)\\r\\n p_minus = primitive_block(-angle, n_ctrl, axis)\\r\\n circ = p_plus.compose(p_minus)\\r\\n \\r\\n return circ\\r\\n\\r\\n```\\r\\n\\r\\nWe can check this is working via:\\r\\n\\r\\n\\r\\n```\\r\\nfrom qiskit.quantum_info import Operator\\r\\nfrom qiskit import QuantumCircuit, transpile\\r\\nimport numpy as np\\r\\nfrom qiskit.circuit.library import MCMT\\r\\n\\r\\n###\u00a0CAN CHANGE HERE\\r\\nctrl_list = [0,2,5]\\r\\ntarget= 4\\r\\nangle = np.pi/3\\r\\n####\\r\\n\\r\\n\\r\\naxis = 'z'\\r\\nnew_circuit = custom_mcrtl_rot(angle,ctrl_list,target, axis=axis)\\r\\n\\r\\ngate = QuantumCircuit(1)\\r\\ngate.rz(angle, 0)\\r\\nmc_gate = MCMT(gate,\\r\\n num_ctrl_qubits=len(ctrl_list),\\r\\n num_target_qubits=1).to_gate()\\r\\n\\r\\n\\r\\nmc_circuit = QuantumCircuit(max([target, max(ctrl_list)])+1)\\r\\nmc_circuit.append(mc_gate, [*ctrl_list, target])\\r\\n\\r\\nprint('does new method match MCMT:', np.allclose(Operator(new_circuit).data,\\r\\n Operator(mc_circuit).data))\\r\\n\\r\\n\\r\\n###\u00a0 compare to mcrz\\r\\nmcrz_multi = QuantumCircuit(max([target, max(ctrl_list)])+1)\\r\\nmcrz_multi.mcrz(angle,ctrl_list,target)\\r\\n\\r\\nprint('does mcrz match MCMT: ', np.allclose(Operator(mcrz_multi).data,\\r\\n Operator(new_circuit).data))\\r\\n\\r\\nprint('does mcrz match new: ', np.allclose(Operator(mcrz_multi).data,\\r\\n Operator(mc_circuit).data))\\r\\n\\r\\n### compare number of nonlocal gates in each approach depth\\r\\nnew_trans = transpile(new_circuit, basis_gates=['cx', 'rz','ry','rx'])\\r\\nmctc_trans = transpile(mc_circuit, basis_gates=['cx', 'rz','ry','rx'])\\r\\nmcrz_multi_trans = transpile(mcrz_multi, basis_gates=['cx', 'rz','ry','rx'])\\r\\n\\r\\nprint('\\\\ndepth comparison')\\r\\nprint('num nonlocal gates new :', new_trans.num_nonlocal_gates())\\r\\nprint('num nonlocal gates mctc:', mctc_trans.num_nonlocal_gates())\\r\\nprint('num nonlocal gates mcrz:', mcrz_multi_trans.num_nonlocal_gates())\\r\\n\\r\\n### allow old implementations to be optmized (NEW method not)\\r\\nopt_mctc_trans = transpile(mc_circuit, optimization_level=3)\\r\\nopt_mcrz_multi_trans = transpile(mcrz_multi, optimization_level=3)\\r\\n\\r\\nprint('\\\\ndepth comparison (allowing old methods to be optimized)')\\r\\nprint('num nonlocal gates new :', new_trans.num_nonlocal_gates(), '(no optimization)')\\r\\nprint('num nonlocal gates mctc:', opt_mctc_trans.num_nonlocal_gates())\\r\\nprint('num nonlocal gates mcrz:', opt_mcrz_multi_trans.num_nonlocal_gates())\\r\\n\\r\\n\\r\\n### prints:\\r\\n\\r\\n# does new method match MCMT: True\\r\\n# does mcrz match MCMT: False\\r\\n# does mcrz match new: False\\r\\n\\r\\n# depth comparison\\r\\n# num nonlocal gates new : 8\\r\\n# num nonlocal gates mctc: 28\\r\\n# num nonlocal gates mcrz: 20\\r\\n\\r\\n# depth comparison (allowing old methods to be optimized)\\r\\n# num nonlocal gates new : 8 (no optimization)\\r\\n# num nonlocal gates mctc: 25\\r\\n# num nonlocal gates mcrz: 13\\r\\n\\r\\n\\r\\n```\\r\\n\\r\\nThe new approach gives an improvement to the correctly implemented mutlicontrol rotation gates currently coded in qiskit:\\r\\n\\r\\n```\\r\\n###\u00a0CAN CHANGE HERE\\r\\nctrl_list = [0,2,5]\\r\\ntarget= 4\\r\\nangle = np.pi/3\\r\\n####\\r\\n\\r\\n\\r\\nfor ax in ['x','y']:\\r\\n \\r\\n new_circuit = custom_mcrtl_rot(angle,ctrl_list,target, axis=ax)\\r\\n\\r\\n if ax =='x':\\r\\n gate = QuantumCircuit(1)\\r\\n gate.rx(angle, 0) #< --- rx\\r\\n elif ax == 'y':\\r\\n gate = QuantumCircuit(1)\\r\\n gate.ry(angle, 0) #< --- ry\\r\\n \\r\\n mc_gate = MCMT(gate,\\r\\n num_ctrl_qubits=len(ctrl_list),\\r\\n num_target_qubits=1).to_gate()\\r\\n\\r\\n mc_circuit = QuantumCircuit(max([target, max(ctrl_list)])+1)\\r\\n mc_circuit.append(mc_gate, [*ctrl_list, target])\\r\\n\\r\\n print('does new method match MCMT:', np.allclose(Operator(new_circuit).data,\\r\\n Operator(mc_circuit).data))\\r\\n print()\\r\\n\\r\\n\\r\\n ###\u00a0 compare to mcr\\r\\n mcr_multi = QuantumCircuit(max([target, max(ctrl_list)])+1)\\r\\n if ax =='x':\\r\\n mcr_multi.mcrx(angle,ctrl_list,target)\\r\\n elif ax == 'y':\\r\\n mcr_multi.mcry(angle,ctrl_list,target)\\r\\n \\r\\n\\r\\n print(f'does mcr{ax} match MCMT: ', np.allclose(Operator(mcr_multi).data,\\r\\n Operator(new_circuit).data))\\r\\n\\r\\n print(f'does mcr{ax} match new: ', np.allclose(Operator(mcr_multi).data,\\r\\n Operator(mc_circuit).data))\\r\\n\\r\\n ### compare number of nonlocal gates in each approach depth\\r\\n new_trans = transpile(new_circuit, basis_gates=['cx', 'rz','ry','rx'])\\r\\n mctc_trans = transpile(mc_circuit, basis_gates=['cx', 'rz','ry','rx'])\\r\\n mcr_multi_trans = transpile(mcr_multi, basis_gates=['cx', 'rz','ry','rx'])\\r\\n\\r\\n print(f'\\\\ndepth comparison for multi control R{ax} gate')\\r\\n print('num nonlocal gates new :', new_trans.num_nonlocal_gates())\\r\\n print('num nonlocal gates mctc:', mctc_trans.num_nonlocal_gates())\\r\\n print(f'num nonlocal gates mcr{ax}:', mcr_multi_trans.num_nonlocal_gates())\\r\\n\\r\\n ### allow old implementations to be optmized (NEW method not)\\r\\n opt_mctc_trans = transpile(mc_circuit, optimization_level=3)\\r\\n opt_mcrX_multi_trans = transpile(mcr_multi, optimization_level=3)\\r\\n \\r\\n print(f'\\\\ndepth comparison for multi control R{ax} gate (allowing old methods to be optimized)')\\r\\n print('num nonlocal gates new :', new_trans.num_nonlocal_gates(), '(no optimization)')\\r\\n print('num nonlocal gates mctc:', opt_mctc_trans.num_nonlocal_gates())\\r\\n print(f'num nonlocal gates mcr{ax}:', opt_mcrX_multi_trans.num_nonlocal_gates())\\r\\n\\r\\n \\r\\n print('*'*12)\\r\\n \\r\\n# does new method match MCMT: True\\r\\n\\r\\n# does mcrx match MCMT: True\\r\\n# does mcrx match new: True\\r\\n\\r\\n# depth comparison for multi control Rx gate\\r\\n# num nonlocal gates new : 8\\r\\n# num nonlocal gates mctc: 20\\r\\n# num nonlocal gates mcrx: 20\\r\\n\\r\\n# depth comparison for multi control Rx gate (allowing old methods to be optimized)\\r\\n# num nonlocal gates new : 8 (no optimization)\\r\\n# num nonlocal gates mctc: 20\\r\\n# num nonlocal gates mcrx: 13\\r\\n# ************\\r\\n# does new method match MCMT: True\\r\\n\\r\\n# does mcry match MCMT: True\\r\\n# does mcry match new: True\\r\\n\\r\\n# depth comparison for multi control Ry gate\\r\\n# num nonlocal gates new : 8\\r\\n# num nonlocal gates mctc: 20\\r\\n# num nonlocal gates mcry: 20\\r\\n\\r\\n# depth comparison for multi control Ry gate (allowing old methods to be optimized)\\r\\n# num nonlocal gates new : 8 (no optimization)\\r\\n# num nonlocal gates mctc: 20\\r\\n# num nonlocal gates mcry: 13\\r\\n# ************\\r\\n\\r\\n```\\r\\n\\r\\n\\r\\n"}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/qiskit_m_qiskit:pr-9836", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/qiskit/circuit/add_control.py b/qiskit/circuit/add_control.py\\nindex 39a91eba36ef..9a9837673d1a 100644\\n--- a/qiskit/circuit/add_control.py\\n+++ b/qiskit/circuit/add_control.py\\n@@ -148,6 +148,7 @@ def control(\\n q_target[bit_indices[qargs[0]]],\\n use_basis_gates=True,\\n )\\n+ continue\\n elif gate.name == \"p\":\\n from qiskit.circuit.library import MCPhaseGate\\n \\n@@ -184,13 +185,9 @@ def control(\\n use_basis_gates=True,\\n )\\n elif theta == 0 and phi == 0:\\n- controlled_circ.mcrz(\\n- lamb, q_control, q_target[bit_indices[qargs[0]]], use_basis_gates=True\\n- )\\n+ controlled_circ.mcp(lamb, q_control, q_target[bit_indices[qargs[0]]])\\n else:\\n- controlled_circ.mcrz(\\n- lamb, q_control, q_target[bit_indices[qargs[0]]], use_basis_gates=True\\n- )\\n+ controlled_circ.mcp(lamb, q_control, q_target[bit_indices[qargs[0]]])\\n controlled_circ.mcry(\\n theta,\\n q_control,\\n@@ -198,9 +195,7 @@ def control(\\n q_ancillae,\\n use_basis_gates=True,\\n )\\n- controlled_circ.mcrz(\\n- phi, q_control, q_target[bit_indices[qargs[0]]], use_basis_gates=True\\n- )\\n+ controlled_circ.mcp(phi, q_control, q_target[bit_indices[qargs[0]]])\\n elif gate.name == \"z\":\\n controlled_circ.h(q_target[bit_indices[qargs[0]]])\\n controlled_circ.mcx(q_control, q_target[bit_indices[qargs[0]]], q_ancillae)\\ndiff --git a/qiskit/circuit/library/standard_gates/multi_control_rotation_gates.py b/qiskit/circuit/library/standard_gates/multi_control_rotation_gates.py\\nindex 547883a6f7a9..ce7f7861440b 100644\\n--- a/qiskit/circuit/library/standard_gates/multi_control_rotation_gates.py\\n+++ b/qiskit/circuit/library/standard_gates/multi_control_rotation_gates.py\\n@@ -84,36 +84,44 @@ def _apply_mcu_graycode(circuit, theta, phi, lam, ctls, tgt, use_basis_gates):\\n \\n \\n def _mcsu2_real_diagonal(\\n- circuit,\\n unitary: np.ndarray,\\n- controls: Union[QuantumRegister, List[Qubit]],\\n- target: Union[Qubit, int],\\n- ctrl_state: str = None,\\n-):\\n+ num_controls: int,\\n+ ctrl_state: Optional[str] = None,\\n+ use_basis_gates: bool = False,\\n+) -> QuantumCircuit:\\n \"\"\"\\n- Apply multi-controlled SU(2) gate with a real main diagonal or secondary diagonal.\\n- https://arxiv.org/abs/2302.06377\\n+ Return a multi-controlled SU(2) gate [1]_ with a real main diagonal or secondary diagonal.\\n \\n Args:\\n- circuit (QuantumCircuit): The QuantumCircuit object to apply the diagonal operator on.\\n- unitary (ndarray): SU(2) unitary matrix with one real diagonal\\n- controls (QuantumRegister or list(Qubit)): The list of control qubits\\n- target (Qubit or int): The target qubit\\n- ctrl_state (str): control state of the operator SU(2) operator\\n+ unitary: SU(2) unitary matrix with one real diagonal.\\n+ num_controls: The number of control qubits.\\n+ ctrl_state: The state on which the SU(2) operation is controlled. Defaults to all\\n+ control qubits being in state 1.\\n+ use_basis_gates: If ``True``, use ``[p, u, cx]`` gates to implement the decomposition.\\n+\\n+ Returns:\\n+ A :class:`.QuantumCircuit` implementing the multi-controlled SU(2) gate.\\n \\n Raises:\\n- QiskitError: parameter errors\\n+ QiskitError: If the input matrix is invalid.\\n+\\n+ References:\\n+\\n+ .. [1]: R. Vale et al. Decomposition of Multi-controlled Special Unitary Single-Qubit Gates\\n+ `arXiv:2302.06377 (2023) <https://arxiv.org/abs/2302.06377>`__\\n+\\n \"\"\"\\n # pylint: disable=cyclic-import\\n- from qiskit.circuit.library import MCXVChain\\n+ from .x import MCXVChain\\n from qiskit.extensions import UnitaryGate\\n from qiskit.quantum_info.operators.predicates import is_unitary_matrix\\n-\\n- if not is_unitary_matrix(unitary):\\n- raise QiskitError(\"parameter unitary in mcsu2_real_diagonal must be an unitary matrix\")\\n+ from qiskit.compiler import transpile\\n \\n if unitary.shape != (2, 2):\\n- raise QiskitError(\"parameter unitary in mcsu2_real_diagonal must be a 2x2 matrix\")\\n+ raise QiskitError(f\"The unitary must be a 2x2 matrix, but has shape {unitary.shape}.\")\\n+\\n+ if not is_unitary_matrix(unitary):\\n+ raise QiskitError(f\"The unitary in must be an unitary matrix, but is {unitary}.\")\\n \\n is_main_diag_real = np.isclose(unitary[0, 0].imag, 0.0) and np.isclose(unitary[1, 1].imag, 0.0)\\n is_secondary_diag_real = np.isclose(unitary[0, 1].imag, 0.0) and np.isclose(\\n@@ -121,7 +129,7 @@ def _mcsu2_real_diagonal(\\n )\\n \\n if not is_main_diag_real and not is_secondary_diag_real:\\n- raise QiskitError(\"parameter unitary in mcsu2_real_diagonal must have one real diagonal\")\\n+ raise QiskitError(\"The unitary must have one real diagonal.\")\\n \\n if is_secondary_diag_real:\\n x = unitary[0, 1]\\n@@ -130,27 +138,34 @@ def _mcsu2_real_diagonal(\\n x = -unitary[0, 1].real\\n z = unitary[1, 1] - unitary[0, 1].imag * 1.0j\\n \\n- alpha_r = np.sqrt((np.sqrt((z.real + 1.0) / 2.0) + 1.0) / 2.0)\\n- alpha_i = z.imag / (2.0 * np.sqrt((z.real + 1.0) * (np.sqrt((z.real + 1.0) / 2.0) + 1.0)))\\n- alpha = alpha_r + 1.0j * alpha_i\\n- beta = x / (2.0 * np.sqrt((z.real + 1.0) * (np.sqrt((z.real + 1.0) / 2.0) + 1.0)))\\n+ if np.isclose(z, -1):\\n+ s_op = [[1.0, 0.0], [0.0, 1.0j]]\\n+ else:\\n+ alpha_r = np.sqrt((np.sqrt((z.real + 1.0) / 2.0) + 1.0) / 2.0)\\n+ alpha_i = z.imag / (2.0 * np.sqrt((z.real + 1.0) * (np.sqrt((z.real + 1.0) / 2.0) + 1.0)))\\n+ alpha = alpha_r + 1.0j * alpha_i\\n+ beta = x / (2.0 * np.sqrt((z.real + 1.0) * (np.sqrt((z.real + 1.0) / 2.0) + 1.0)))\\n+\\n+ # S gate definition\\n+ s_op = np.array([[alpha, -np.conj(beta)], [beta, np.conj(alpha)]])\\n \\n- # S gate definition\\n- s_op = np.array([[alpha, -np.conj(beta)], [beta, np.conj(alpha)]])\\n s_gate = UnitaryGate(s_op)\\n \\n- num_ctrl = len(controls)\\n- k_1 = int(np.ceil(num_ctrl / 2.0))\\n- k_2 = int(np.floor(num_ctrl / 2.0))\\n+ k_1 = int(np.ceil(num_controls / 2.0))\\n+ k_2 = int(np.floor(num_controls / 2.0))\\n \\n ctrl_state_k_1 = None\\n ctrl_state_k_2 = None\\n \\n if ctrl_state is not None:\\n- str_ctrl_state = f\"{ctrl_state:0{num_ctrl}b}\"\\n+ str_ctrl_state = f\"{ctrl_state:0{num_controls}b}\"\\n ctrl_state_k_1 = str_ctrl_state[::-1][:k_1][::-1]\\n ctrl_state_k_2 = str_ctrl_state[::-1][k_1:][::-1]\\n \\n+ circuit = QuantumCircuit(num_controls + 1, name=\"MCSU2\")\\n+ controls = list(range(num_controls)) # control indices, defined for code legibility\\n+ target = num_controls # target index, defined for code legibility\\n+\\n if not is_secondary_diag_real:\\n circuit.h(target)\\n \\n@@ -178,6 +193,11 @@ def _mcsu2_real_diagonal(\\n if not is_secondary_diag_real:\\n circuit.h(target)\\n \\n+ if use_basis_gates:\\n+ circuit = transpile(circuit, basis_gates=[\"p\", \"u\", \"cx\"])\\n+\\n+ return circuit\\n+\\n \\n def mcrx(\\n self,\\n@@ -232,7 +252,12 @@ def mcrx(\\n use_basis_gates=use_basis_gates,\\n )\\n else:\\n- _mcsu2_real_diagonal(self, RXGate(theta).to_matrix(), control_qubits, target_qubit)\\n+ cgate = _mcsu2_real_diagonal(\\n+ RXGate(theta).to_matrix(),\\n+ num_controls=len(control_qubits),\\n+ use_basis_gates=use_basis_gates,\\n+ )\\n+ self.compose(cgate, control_qubits + [target_qubit], inplace=True)\\n \\n \\n def mcry(\\n@@ -302,7 +327,12 @@ def mcry(\\n use_basis_gates=use_basis_gates,\\n )\\n else:\\n- _mcsu2_real_diagonal(self, RYGate(theta).to_matrix(), control_qubits, target_qubit)\\n+ cgate = _mcsu2_real_diagonal(\\n+ RYGate(theta).to_matrix(),\\n+ num_controls=len(control_qubits),\\n+ use_basis_gates=use_basis_gates,\\n+ )\\n+ self.compose(cgate, control_qubits + [target_qubit], inplace=True)\\n else:\\n raise QiskitError(f\"Unrecognized mode for building MCRY circuit: {mode}.\")\\n \\n@@ -327,6 +357,8 @@ def mcrz(\\n Raises:\\n QiskitError: parameter errors\\n \"\"\"\\n+ from .rz import CRZGate, RZGate\\n+\\n control_qubits = self.qbit_argument_conversion(q_controls)\\n target_qubit = self.qbit_argument_conversion(q_target)\\n if len(target_qubit) != 1:\\n@@ -336,13 +368,21 @@ def mcrz(\\n self._check_dups(all_qubits)\\n \\n n_c = len(control_qubits)\\n- if n_c == 1: # cu\\n- _apply_cu(self, 0, 0, lam, control_qubits[0], target_qubit, use_basis_gates=use_basis_gates)\\n+ if n_c == 1:\\n+ if use_basis_gates:\\n+ self.u(0, 0, lam / 2, target_qubit)\\n+ self.cx(control_qubits[0], target_qubit)\\n+ self.u(0, 0, -lam / 2, target_qubit)\\n+ self.cx(control_qubits[0], target_qubit)\\n+ else:\\n+ self.append(CRZGate(lam), control_qubits + [target_qubit])\\n else:\\n- lam_step = lam * (1 / (2 ** (n_c - 1)))\\n- _apply_mcu_graycode(\\n- self, 0, 0, lam_step, control_qubits, target_qubit, use_basis_gates=use_basis_gates\\n+ cgate = _mcsu2_real_diagonal(\\n+ RZGate(lam).to_matrix(),\\n+ num_controls=len(control_qubits),\\n+ use_basis_gates=use_basis_gates,\\n )\\n+ self.compose(cgate, control_qubits + [target_qubit], inplace=True)\\n \\n \\n QuantumCircuit.mcrx = mcrx\\ndiff --git a/releasenotes/notes/fix-mcrz-relative-phase-6ea81a369f8bda38.yaml b/releasenotes/notes/fix-mcrz-relative-phase-6ea81a369f8bda38.yaml\\nnew file mode 100644\\nindex 000000000000..aa89abeb662d\\n--- /dev/null\\n+++ b/releasenotes/notes/fix-mcrz-relative-phase-6ea81a369f8bda38.yaml\\n@@ -0,0 +1,7 @@\\n+---\\n+fixes:\\n+ - |\\n+ Fixed the gate decomposition of multi-controlled Z rotation gates added via\\n+ :meth:`.QuantumCircuit.mcrz`. Previously, this method implemented a multi-controlled\\n+ phase gate, which has a relative phase difference to the Z rotation. To obtain the\\n+ previous `.QuantumCircuit.mcrz` behaviour, use `.QuantumCircuit.mcp`.\\n"}, "test": {"test_patch": "diff --git a/test/python/circuit/test_controlled_gate.py b/test/python/circuit/test_controlled_gate.py\\nindex a40f7747e2e7..248aabab7839 100644\\n--- a/test/python/circuit/test_controlled_gate.py\\n+++ b/test/python/circuit/test_controlled_gate.py\\n@@ -610,9 +610,8 @@ def test_mcsu2_real_diagonal(self):\\n \"\"\"Test mcsu2_real_diagonal\"\"\"\\n num_ctrls = 6\\n theta = 0.3\\n- qc = QuantumCircuit(num_ctrls + 1)\\n ry_matrix = RYGate(theta).to_matrix()\\n- _mcsu2_real_diagonal(qc, ry_matrix, list(range(num_ctrls)), num_ctrls)\\n+ qc = _mcsu2_real_diagonal(ry_matrix, num_ctrls)\\n \\n mcry_matrix = _compute_control_matrix(ry_matrix, 6)\\n self.assertTrue(np.allclose(mcry_matrix, Operator(qc).to_matrix()))\\n@@ -657,6 +656,11 @@ def test_multi_controlled_rotation_gate_matrices(\\n if bit == \"0\":\\n qc.x(q_controls[idx])\\n \\n+ if use_basis_gates:\\n+ with self.subTest(msg=\"check only basis gates used\"):\\n+ gates_used = set(qc.count_ops().keys())\\n+ self.assertTrue(gates_used.issubset({\"x\", \"u\", \"p\", \"cx\"}))\\n+\\n backend = BasicAer.get_backend(\"unitary_simulator\")\\n simulated = execute(qc, backend).result().get_unitary(qc)\\n \\n@@ -665,7 +669,7 @@ def test_multi_controlled_rotation_gate_matrices(\\n elif base_gate_name == \"y\":\\n rot_mat = RYGate(theta).to_matrix()\\n else: # case 'z'\\n- rot_mat = U1Gate(theta).to_matrix()\\n+ rot_mat = RZGate(theta).to_matrix()\\n \\n expected = _compute_control_matrix(rot_mat, num_controls, ctrl_state=ctrl_state)\\n with self.subTest(msg=f\"control state = {ctrl_state}\"):\\ndiff --git a/test/qpy_compat/test_qpy.py b/test/qpy_compat/test_qpy.py\\nindex ef01d3873e39..2a4b112e1508 100755\\n--- a/test/qpy_compat/test_qpy.py\\n+++ b/test/qpy_compat/test_qpy.py\\n@@ -603,15 +603,14 @@ def generate_circuits(version_parts):\\n if version_parts >= (0, 19, 2):\\n output_circuits[\"control_flow.qpy\"] = generate_control_flow_circuits()\\n if version_parts >= (0, 21, 0):\\n- output_circuits[\"controlled_gates.qpy\"] = generate_controlled_gates()\\n output_circuits[\"schedule_blocks.qpy\"] = generate_schedule_blocks()\\n output_circuits[\"pulse_gates.qpy\"] = generate_calibrated_circuits()\\n- if version_parts >= (0, 21, 2):\\n- output_circuits[\"open_controlled_gates.qpy\"] = generate_open_controlled_gates()\\n if version_parts >= (0, 24, 0):\\n output_circuits[\"referenced_schedule_blocks.qpy\"] = generate_referenced_schedule()\\n output_circuits[\"control_flow_switch.qpy\"] = generate_control_flow_switch_circuits()\\n-\\n+ if version_parts >= (0, 25, 0):\\n+ output_circuits[\"open_controlled_gates.qpy\"] = generate_open_controlled_gates()\\n+ output_circuits[\"controlled_gates.qpy\"] = generate_controlled_gates()\\n return output_circuits\\n \\n \\n", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}199{"question_id": "MSB_rdkit_rdkit_pr3758", "question_type": "multi_swe_bench", "description": "Fixes #3755 (rdkit/rdkit#3758)", "content": {"org": "rdkit", "repo": "rdkit", "pr_number": 3758, "issue_title": "Fixes #3755", "issue_body": "#3755 is caused by two separate problems:\r\n\r\n1) There is an inconsistency in the exhaustiveness of the tautomer enumeration between the chiral and the non-chiral versions of serine. This is caused by a bug in the logic that checks when the enumeration should be considered as complete.\r\nAs a consequence, the enumeration for the chiral molecule is quit too early, and the hydrate tautomer is not generated. Therefore, the expected carboxylic acid tautomer is generated, and the result appears to be correct (because the competing hydrate tautomer is not generated).\r\nInstead, for the achiral molecule the enumeration is indeed complete, the hydrate tautomer scores the same as the carboxylic acid tautomer, but the hydrate tautomer is preferred as its SMILES comes first in lexicographic order.<br/>\r\nThis PR fixes the bug in the logic, so the enumeration is now complete also for the chiral molecule case.\r\n<ol>\r\n\r\n* I also fixed the debug build with `VERBOSE_ENUMERATION` defined (which was failing to build)\r\n* I moved the comments around to make them more useful during debugging\r\n* I removed an unnecessary copying of the molecule\r\n* I removed the `done` stack altogether\r\n\r\n<br/>The two latter points should result in improved performance.\r\n</ol>\r\n\r\n2) The hydrate tautomer scores the same as the carboxylic acid tautomer. This already happened in the original Python implementation of MolVS:\r\n<ol>\r\n\r\n\r\n```\r\nfrom rdkit import Chem\r\nfrom rdkit.Chem.Draw import MolsToGridImage\r\nfrom rdkit.Chem.MolStandardize import tautomer\r\n\r\norig_vs_expected = [\r\n (\"OC(=O)C(N)CO\", \"NC(CO)C(=O)O\"),\r\n (\"C([C@@H](C(=O)O)N)O\", \"NC(CO)C(=O)O\"),\r\n (\"OC(=O)C(N)CN\", \"NCC(N)C(=O)O\"),\r\n (\"NC(=O)C(N)CO\", \"NC(=O)C(N)CO\"),\r\n (\"NC(=N)C(N)CO\", \"N=C(N)C(N)CO\"),\r\n (\"NC(=N)NC(N)CO\", \"N=C(N)NC(N)CO\")\r\n]\r\n\r\nenumerator = tautomer.TautomerCanonicalizer()\r\norig_vs_canonical_mols = []\r\nfor orig, expected in orig_vs_expected:\r\n orig_mol = Chem.MolFromSmiles(orig)\r\n orig_vs_canonical_mols.append(orig_mol)\r\n canonical = enumerator.canonicalize(orig_mol)\r\n orig_vs_canonical_mols.append(canonical)\r\n\r\nMolsToGridImage(orig_vs_canonical_mols, molsPerRow=2, subImgSize=(200,100))\r\n```\r\n\r\n<br/>As you may see, there are a number of molecules which are converted to hydrates or aminals.\r\nThis PR fixes this issue by adding an additional substructure rule:\r\n```\r\n{\"C(=hetero)-hetero\", \"[C](=[!#1;!#6])[!#1;!#6]\", 2},\r\n```\r\nwhich gives a higher score to carboxylic acids/amides/amidines vs their reduced counterparts.\r\n</ol>", "base_commit": "be5cab546af0a7a5469fa17a84727aed13837b2b", "resolved_issues": [{"number": 3755, "title": "Inconsistent canonical tautomer on repeated application", "body": "\r\n**Describe the bug**\r\nTautomer canonicalization seems to be occasionally inconsistent, repeated canonicalizations will produce different results.\r\n\r\n**To Reproduce**\r\n\r\nRepeatedly pick the canonical tautomer for Serine.\r\n\r\n```python\r\nfrom rdkit import Chem\r\nfrom rdkit.Chem.MolStandardize import rdMolStandardize\r\n\r\nenumerator = rdMolStandardize.TautomerEnumerator()\r\n\r\nmol1 = Chem.MolFromSmiles('C([C@@H](C(=O)O)N)O')\r\nmol2 = enumerator.Canonicalize(mol1)\r\nmol3 = enumerator.Canonicalize(mol2)\r\n\r\nprint('\\n'.join([\r\n Chem.MolToSmiles(mol1),\r\n Chem.MolToSmiles(mol2),\r\n Chem.MolToSmiles(mol3)\r\n]))\r\n```\r\n\r\nOutput:\r\n```\r\nN[C@@H](CO)C(=O)O\r\nNC(CO)C(=O)O\r\nNC(C=O)C(O)O\r\n```\r\n**Expected behavior**\r\n\r\nI would expect mol2 to be the same as mol3. The canonical tautomer of the canonical tautomer should still be the original canonical tautomer (unless we hit MaxTautomers or something like that, which is not occurring here).\r\n\r\nInstead mol2 and mol3 differ in where they've put the double bond.\r\n\r\n\r\n**Configuration (please complete the following information):**\r\n - RDKit version: 2020.09.3\r\n - OS: Ubuntu 20.04\r\n - Python version (if relevant): 3.7.9\r\n - Are you using conda? Yes\r\n - If you are using conda, which channel did you install the rdkit from? conda-forge\r\n"}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/rdkit_m_rdkit:pr-3758", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/Code/GraphMol/MolStandardize/Tautomer.cpp b/Code/GraphMol/MolStandardize/Tautomer.cpp\nindex 8a39a7f7b3c..8c36786a9b8 100644\n--- a/Code/GraphMol/MolStandardize/Tautomer.cpp\n+++ b/Code/GraphMol/MolStandardize/Tautomer.cpp\n@@ -113,6 +113,7 @@ int scoreSubstructs(const ROMol &mol) {\n {\"N=O\", \"[#7]=,:[#8]\", 2},\n {\"P=O\", \"[#15]=,:[#8]\", 2},\n {\"C=hetero\", \"[C]=[!#1;!#6]\", 1},\n+ {\"C(=hetero)-hetero\", \"[C](=[!#1;!#6])[!#1;!#6]\", 2},\n {\"aromatic C = exocyclic N\", \"[c]=!@[N]\", -1},\n {\"methyl\", \"[CX4H3]\", 1},\n {\"guanidine terminal=N\", \"[#7]C(=[NR0])[#7H0]\", 1},\n@@ -279,7 +280,6 @@ TautomerEnumeratorResult TautomerEnumerator::enumerate(const ROMol &mol) const {\n RWMOL_SPTR kekulized(new RWMol(mol));\n MolOps::Kekulize(*kekulized, false);\n res.d_tautomers = {{smi, Tautomer(taut, kekulized, 0, 0)}};\n- std::set<std::string> done;\n res.d_modifiedAtoms.resize(mol.getNumAtoms());\n res.d_modifiedBonds.resize(mol.getNumBonds());\n bool completed = false;\n@@ -292,184 +292,191 @@ TautomerEnumeratorResult TautomerEnumerator::enumerate(const ROMol &mol) const {\n while (!completed && !bailOut) {\n // std::map automatically sorts res.d_tautomers into alphabetical order\n // (SMILES)\n- for (const auto &tautomer : res.d_tautomers) {\n+ for (auto &smilesTautomerPair : res.d_tautomers) {\n #ifdef VERBOSE_ENUMERATION\n- std::cout << \"Done : \" << std::endl;\n- for (const auto d : done) {\n- std::cout << d << std::endl;\n+ std::cout << \"Current tautomers: \" << std::endl;\n+ for (const auto &smilesTautomerPair : res.d_tautomers) {\n+ std::cout << smilesTautomerPair.first << \" done \"\n+ << smilesTautomerPair.second.d_done << std::endl;\n }\n- std::cout << \"Looking at tautomer: \" << tautomer.first << std::endl;\n #endif\n std::string tsmiles;\n- if (done.count(tautomer.first)) {\n+ if (smilesTautomerPair.second.d_done) {\n+#ifdef VERBOSE_ENUMERATION\n+ std::cout << \"Skipping \" << smilesTautomerPair.first << \" as already done\" << std::endl;\n+#endif\n continue;\n- } else {\n- // done does not contain tautomer\n- for (const auto &transform : transforms) {\n- if (bailOut) {\n- break;\n- }\n- // kmol is the kekulized version of the tautomer\n- const auto &kmol = tautomer.second.kekulized;\n- std::vector<MatchVectType> matches;\n- unsigned int matched =\n- SubstructMatch(*kmol, *(transform.Mol), matches);\n+ }\n+#ifdef VERBOSE_ENUMERATION\n+ std::cout << \"Looking at tautomer: \" << smilesTautomerPair.first\n+ << std::endl;\n+#endif\n+ // tautomer not yet done\n+ for (const auto &transform : transforms) {\n+ if (bailOut) {\n+ break;\n+ }\n+ // kmol is the kekulized version of the tautomer\n+ const auto &kmol = smilesTautomerPair.second.kekulized;\n+ std::vector<MatchVectType> matches;\n+ unsigned int matched =\n+ SubstructMatch(*kmol, *(transform.Mol), matches);\n \n- if (!matched) {\n- continue;\n- }\n- ++nTransforms;\n+ if (!matched) {\n+ continue;\n+ }\n+ ++nTransforms;\n #ifdef VERBOSE_ENUMERATION\n- std::string name;\n- (transform.Mol)->getProp(common_properties::_Name, name);\n- std::cout << \"kmol: \" << kmol->first << std::endl;\n- std::cout << MolToSmiles(*(kmol->second)) << std::endl;\n- std::cout << \"transform mol: \" << MolToSmarts(*(transform.Mol))\n- << std::endl;\n+ std::string name;\n+ (transform.Mol)->getProp(common_properties::_Name, name);\n+ std::cout << \"kmol for \" << smilesTautomerPair.first << \" : \" << MolToSmiles(*kmol) << std::endl;\n+ std::cout << \"transform mol: \" << MolToSmarts(*(transform.Mol))\n+ << std::endl;\n \n- std::cout << \"Matched: \" << name << std::endl;\n+ std::cout << \"Matched: \" << name << std::endl;\n #endif\n- // loop over transform matches\n- for (const auto &match : matches) {\n- if (nTransforms >= d_maxTransforms) {\n- res.d_status = TautomerEnumeratorStatus::MaxTransformsReached;\n- bailOut = true;\n- } else if (res.d_tautomers.size() >= d_maxTautomers) {\n- res.d_status = TautomerEnumeratorStatus::MaxTautomersReached;\n- bailOut = true;\n- } else if (d_callback.get() && !(*d_callback)(mol, res)) {\n- res.d_status = TautomerEnumeratorStatus::Canceled;\n- bailOut = true;\n- }\n- if (bailOut) {\n- break;\n- }\n- // Create a copy of in the input molecule so we can modify it\n- // Use kekule form so bonds are explicitly single/double instead of\n- // aromatic\n- ROMOL_SPTR product(new ROMol(*kmol));\n- // Remove a hydrogen from the first matched atom and add one to the\n- // last\n- int firstIdx = match.front().second;\n- int lastIdx = match.back().second;\n- Atom *first = product->getAtomWithIdx(firstIdx);\n- Atom *last = product->getAtomWithIdx(lastIdx);\n- res.d_modifiedAtoms.set(firstIdx);\n- res.d_modifiedAtoms.set(lastIdx);\n- first->setNumExplicitHs(\n- std::max(0, static_cast<int>(first->getTotalNumHs()) - 1));\n- last->setNumExplicitHs(last->getTotalNumHs() + 1);\n- // Remove any implicit hydrogens from the first and last atoms\n- // now we have set the count explicitly\n- first->setNoImplicit(true);\n- last->setNoImplicit(true);\n- // Adjust bond orders\n- unsigned int bi = 0;\n- for (size_t i = 0; i < match.size() - 1; ++i) {\n- Bond *bond = product->getBondBetweenAtoms(match[i].second,\n- match[i + 1].second);\n- ASSERT_INVARIANT(bond, \"required bond not found\");\n- // check if bonds is specified in tautomer.in file\n- if (!transform.BondTypes.empty()) {\n- bond->setBondType(transform.BondTypes[bi]);\n- ++bi;\n- } else {\n- Bond::BondType bondtype = bond->getBondType();\n+ // loop over transform matches\n+ for (const auto &match : matches) {\n+ if (nTransforms >= d_maxTransforms) {\n+ res.d_status = TautomerEnumeratorStatus::MaxTransformsReached;\n+ bailOut = true;\n+ } else if (res.d_tautomers.size() >= d_maxTautomers) {\n+ res.d_status = TautomerEnumeratorStatus::MaxTautomersReached;\n+ bailOut = true;\n+ } else if (d_callback.get() && !(*d_callback)(mol, res)) {\n+ res.d_status = TautomerEnumeratorStatus::Canceled;\n+ bailOut = true;\n+ }\n+ if (bailOut) {\n+ break;\n+ }\n+ // Create a copy of in the input molecule so we can modify it\n+ // Use kekule form so bonds are explicitly single/double instead of\n+ // aromatic\n+ RWMOL_SPTR product(new RWMol(*kmol));\n+ // Remove a hydrogen from the first matched atom and add one to the\n+ // last\n+ int firstIdx = match.front().second;\n+ int lastIdx = match.back().second;\n+ Atom *first = product->getAtomWithIdx(firstIdx);\n+ Atom *last = product->getAtomWithIdx(lastIdx);\n+ res.d_modifiedAtoms.set(firstIdx);\n+ res.d_modifiedAtoms.set(lastIdx);\n+ first->setNumExplicitHs(\n+ std::max(0, static_cast<int>(first->getTotalNumHs()) - 1));\n+ last->setNumExplicitHs(last->getTotalNumHs() + 1);\n+ // Remove any implicit hydrogens from the first and last atoms\n+ // now we have set the count explicitly\n+ first->setNoImplicit(true);\n+ last->setNoImplicit(true);\n+ // Adjust bond orders\n+ unsigned int bi = 0;\n+ for (size_t i = 0; i < match.size() - 1; ++i) {\n+ Bond *bond = product->getBondBetweenAtoms(match[i].second,\n+ match[i + 1].second);\n+ ASSERT_INVARIANT(bond, \"required bond not found\");\n+ // check if bonds is specified in tautomer.in file\n+ if (!transform.BondTypes.empty()) {\n+ bond->setBondType(transform.BondTypes[bi]);\n+ ++bi;\n+ } else {\n+ Bond::BondType bondtype = bond->getBondType();\n #ifdef VERBOSE_ENUMERATION\n- std::cout << \"Bond as double: \" << bond->getBondTypeAsDouble()\n- << std::endl;\n- std::cout << bondtype << std::endl;\n+ std::cout << \"Bond as double: \" << bond->getBondTypeAsDouble()\n+ << std::endl;\n+ std::cout << bondtype << std::endl;\n #endif\n- if (bondtype == Bond::SINGLE) {\n- bond->setBondType(Bond::DOUBLE);\n+ if (bondtype == Bond::SINGLE) {\n+ bond->setBondType(Bond::DOUBLE);\n #ifdef VERBOSE_ENUMERATION\n- std::cout << \"Set bond to double\" << std::endl;\n+ std::cout << \"Set bond to double\" << std::endl;\n #endif\n- }\n- if (bondtype == Bond::DOUBLE) {\n- bond->setBondType(Bond::SINGLE);\n+ }\n+ if (bondtype == Bond::DOUBLE) {\n+ bond->setBondType(Bond::SINGLE);\n #ifdef VERBOSE_ENUMERATION\n- std::cout << \"Set bond to single\" << std::endl;\n+ std::cout << \"Set bond to single\" << std::endl;\n #endif\n- }\n }\n- res.d_modifiedBonds.set(bond->getIdx());\n }\n- // TODO adjust charges\n- if (!transform.Charges.empty()) {\n- unsigned int ci = 0;\n- for (const auto &pair : match) {\n- Atom *atom = product->getAtomWithIdx(pair.second);\n- atom->setFormalCharge(atom->getFormalCharge() +\n- transform.Charges[ci++]);\n- }\n+ res.d_modifiedBonds.set(bond->getIdx());\n+ }\n+ // TODO adjust charges\n+ if (!transform.Charges.empty()) {\n+ unsigned int ci = 0;\n+ for (const auto &pair : match) {\n+ Atom *atom = product->getAtomWithIdx(pair.second);\n+ atom->setFormalCharge(atom->getFormalCharge() +\n+ transform.Charges[ci++]);\n }\n+ }\n \n- RWMOL_SPTR wproduct(new RWMol(*product));\n+ unsigned int failedOp;\n+ MolOps::sanitizeMol(*product, failedOp,\n+ MolOps::SANITIZE_KEKULIZE |\n+ MolOps::SANITIZE_SETAROMATICITY |\n+ MolOps::SANITIZE_SETCONJUGATION |\n+ MolOps::SANITIZE_SETHYBRIDIZATION |\n+ MolOps::SANITIZE_ADJUSTHS);\n #ifdef VERBOSE_ENUMERATION\n- std::cout << \"pre-sanitization: \"\n- << MolToSmiles(*wproduct, true, true) << std::endl;\n-#endif\n- unsigned int failedOp;\n- MolOps::sanitizeMol(*wproduct, failedOp,\n- MolOps::SANITIZE_KEKULIZE |\n- MolOps::SANITIZE_SETAROMATICITY |\n- MolOps::SANITIZE_SETCONJUGATION |\n- MolOps::SANITIZE_SETHYBRIDIZATION |\n- MolOps::SANITIZE_ADJUSTHS);\n- setTautomerStereoAndIsoHs(mol, *wproduct, res);\n- tsmiles = MolToSmiles(*wproduct, true);\n-#ifdef VERBOSE_ENUMERATION\n- std::string name;\n- (transform.Mol)->getProp(common_properties::_Name, name);\n- std::cout << \"Applied rule: \" << name << \" to \" << tautomer.first\n- << std::endl;\n+ std::cout << \"pre-setTautomerStereo: \" << MolToSmiles(*product, true)\n+ << std::endl;\n #endif\n- if (res.d_tautomers.find(tsmiles) != res.d_tautomers.end()) {\n+ setTautomerStereoAndIsoHs(mol, *product, res);\n+ tsmiles = MolToSmiles(*product, true);\n #ifdef VERBOSE_ENUMERATION\n- std::cout << \"Previous tautomer produced again: \" << tsmiles\n- << std::endl;\n+ (transform.Mol)->getProp(common_properties::_Name, name);\n+ std::cout << \"Applied rule: \" << name << \" to \" << smilesTautomerPair.first\n+ << std::endl;\n #endif\n- continue;\n- }\n+ if (res.d_tautomers.find(tsmiles) != res.d_tautomers.end()) {\n #ifdef VERBOSE_ENUMERATION\n- std::cout << \"New tautomer produced: \" << tsmiles << std::endl;\n+ std::cout << \"Previous tautomer produced again: \" << tsmiles\n+ << std::endl;\n #endif\n- // in addition to the above transformations, sanitzation may modify\n- // bonds, e.g. Cc1nc2ccccc2[nH]1\n- for (size_t i = 0; i < mol.getNumBonds(); i++) {\n- auto molBondType = mol.getBondWithIdx(i)->getBondType();\n- auto tautBondType = wproduct->getBondWithIdx(i)->getBondType();\n- if (molBondType != tautBondType && !res.d_modifiedBonds.test(i)) {\n+ continue;\n+ }\n+ // in addition to the above transformations, sanitization may modify\n+ // bonds, e.g. Cc1nc2ccccc2[nH]1\n+ for (size_t i = 0; i < mol.getNumBonds(); i++) {\n+ auto molBondType = mol.getBondWithIdx(i)->getBondType();\n+ auto tautBondType = product->getBondWithIdx(i)->getBondType();\n+ if (molBondType != tautBondType && !res.d_modifiedBonds.test(i)) {\n #ifdef VERBOSE_ENUMERATION\n- std::cout << \"Sanitization has modified bond \" << i\n- << std::endl;\n+ std::cout << \"Sanitization has modified bond \" << i\n+ << std::endl;\n #endif\n- res.d_modifiedBonds.set(i);\n- }\n+ res.d_modifiedBonds.set(i);\n }\n- RWMOL_SPTR kekulized_product(new RWMol(*wproduct));\n- MolOps::Kekulize(*kekulized_product, false);\n- res.d_tautomers[tsmiles] = Tautomer(\n- std::move(wproduct), std::move(kekulized_product),\n- res.d_modifiedAtoms.count(), res.d_modifiedBonds.count());\n-\n+ }\n+ RWMOL_SPTR kekulized_product(new RWMol(*product));\n+ MolOps::Kekulize(*kekulized_product, false);\n #ifdef VERBOSE_ENUMERATION\n- std::cout << \"Now completed: \" << std::endl;\n- for (const auto &tautomer : res.d_tautomers) {\n- std::cout << tautomer.first << std::endl;\n- }\n-#endif\n+ auto it = res.d_tautomers.find(tsmiles);\n+ if (it == res.d_tautomers.end()) {\n+ std::cout << \"New tautomer added as \";\n+ } else {\n+ std::cout << \"New tautomer replaced for \";\n }\n+ std::cout << tsmiles << \", taut: \" << MolToSmiles(*product)\n+ << \", kek: \" << MolToSmiles(*kekulized_product, true, true)\n+ << std::endl;\n+#endif\n+ res.d_tautomers[tsmiles] = Tautomer(\n+ std::move(product), std::move(kekulized_product),\n+ res.d_modifiedAtoms.count(), res.d_modifiedBonds.count());\n }\n }\n- done.insert(tautomer.first);\n+ smilesTautomerPair.second.d_done = true;\n }\n- completed = (res.d_tautomers.size() <= done.size());\n+ completed = true;\n size_t maxNumModifiedAtoms = res.d_modifiedAtoms.count();\n size_t maxNumModifiedBonds = res.d_modifiedBonds.count();\n for (auto it = res.d_tautomers.begin(); it != res.d_tautomers.end();) {\n auto &taut = it->second;\n+ if (!taut.d_done) {\n+ completed = false;\n+ }\n if ((taut.d_numModifiedAtoms < maxNumModifiedAtoms ||\n taut.d_numModifiedBonds < maxNumModifiedBonds) &&\n setTautomerStereoAndIsoHs(mol, *taut.tautomer, res)) {\ndiff --git a/Code/GraphMol/MolStandardize/Tautomer.h b/Code/GraphMol/MolStandardize/Tautomer.h\nindex bf589f05060..ea6226c6b62 100644\n--- a/Code/GraphMol/MolStandardize/Tautomer.h\n+++ b/Code/GraphMol/MolStandardize/Tautomer.h\n@@ -54,18 +54,20 @@ class Tautomer {\n friend class TautomerEnumerator;\n \n public:\n- Tautomer() : d_numModifiedAtoms(0), d_numModifiedBonds(0) {}\n+ Tautomer() : d_numModifiedAtoms(0), d_numModifiedBonds(0), d_done(false) {}\n Tautomer(const ROMOL_SPTR &t, const ROMOL_SPTR &k, size_t a = 0, size_t b = 0)\n : tautomer(t),\n kekulized(k),\n d_numModifiedAtoms(a),\n- d_numModifiedBonds(b) {}\n+ d_numModifiedBonds(b),\n+ d_done(false) {}\n ROMOL_SPTR tautomer;\n ROMOL_SPTR kekulized;\n \n private:\n size_t d_numModifiedAtoms;\n size_t d_numModifiedBonds;\n+ bool d_done;\n };\n \n typedef std::map<std::string, Tautomer> SmilesTautomerMap;\n"}, "test": {"test_patch": "diff --git a/Code/GraphMol/MolStandardize/testTautomer.cpp b/Code/GraphMol/MolStandardize/testTautomer.cpp\nindex 85b100abfa3..a4c9213a4ca 100644\n--- a/Code/GraphMol/MolStandardize/testTautomer.cpp\n+++ b/Code/GraphMol/MolStandardize/testTautomer.cpp\n@@ -1416,6 +1416,24 @@ void testGithub3430() {\n }\n }\n \n+void testGithub3755() {\n+ BOOST_LOG(rdInfoLog) << \"-----------------------\\n testGithub3755\"\n+ << std::endl;\n+ // hydrates, aminals and hemiaminals should be scored lower than\n+ // carboxylic acids, amides, amidines, and guanidines\n+ std::vector<std::pair<std::string, std::string>> orig_vs_expected{\n+ {\"OC(=O)C(N)CO\", \"NC(CO)C(=O)O\"}, {\"C([C@@H](C(=O)O)N)O\", \"NC(CO)C(=O)O\"},\n+ {\"OC(=O)C(N)CN\", \"NCC(N)C(=O)O\"}, {\"NC(=O)C(N)CO\", \"NC(=O)C(N)CO\"},\n+ {\"NC(=N)C(N)CO\", \"N=C(N)C(N)CO\"}, {\"NC(=N)NC(N)CO\", \"N=C(N)NC(N)CO\"}};\n+ TautomerEnumerator te;\n+ for (const auto &pair : orig_vs_expected) {\n+ ROMOL_SPTR orig(SmilesToMol(pair.first));\n+ TEST_ASSERT(orig);\n+ ROMOL_SPTR canonical(te.canonicalize(*orig));\n+ TEST_ASSERT(MolToSmiles(*canonical) == pair.second);\n+ }\n+}\n+\n int main() {\n RDLog::InitLogs();\n #if 1\n@@ -1433,5 +1451,6 @@ int main() {\n testPickCanonicalCIPChangeOnChiralCenter();\n testTautomerEnumeratorResult_const_iterator();\n testGithub3430();\n+ testGithub3755();\n return 0;\n }\n", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}200{"question_id": "MSB_rdkit_rdkit_pr3975", "question_type": "multi_swe_bench", "description": "Fixes #3781 (rdkit/rdkit#3975)", "content": {"org": "rdkit", "repo": "rdkit", "pr_number": 3975, "issue_title": "Fixes #3781", "issue_body": "- fixes energies and gradients for dihedral and angle constraints in both MMFF and UFF\r\n- adds butane scan tests for MMFF and UFF\r\n\r\nNow the butane scan works as expected for both UFF...\r\n\r\n\r\n...and MMFF:\r\n\r\n", "base_commit": "2bab9e61253d44befd96fe944b5dab311d9d8a49", "resolved_issues": [{"number": 3781, "title": "Regression in dihedral constraints", "body": "In this code snippet I just use an added torsion constraint with a very high force constant to get certain dihedral angle. It works well in version \"2019.03.3\" but gives very bad results in \"2020.09.1\".\r\n\r\n```\r\nm = Chem.rdmolfiles.MolFromMolFile('/Users/jasonb/butane.mol',removeHs = False)\r\nmp = AllChem.MMFFGetMoleculeProperties(m)\r\nff = AllChem.MMFFGetMoleculeForceField(m, mp)\r\nff.MMFFAddTorsionConstraint(0,1,2,3, False, -180, -180, 10000.0)\r\nff.Minimize()\r\nChem.rdmolfiles.MolToMolFile(m,'/Users/jasonb/butane_180.mol')\r\n```\r\nStarting with the attached MOL file, rdkit version \"2019.03.3\" gives the top result, while version \"2020.09.1\" gives the bottom version:\r\n\r\n<img width=\"286\" alt=\"image\" src=\"https://user-images.githubusercontent.com/16337306/106640656-ec84a280-654b-11eb-9994-c477e9f11d67.png\">\r\n\r\n(can't seem to attach a .mol file, renamed to 'butane.txt')\r\n\r\n[butane.txt](https://github.com/rdkit/rdkit/files/5913233/butane.txt)\r\n\r\nedit:\r\n\r\nTo add another example, using the same MOL file and this code\r\n```\r\nm = Chem.rdmolfiles.MolFromMolFile('/Users/jasonb/butane.txt',removeHs = False)\r\nmp = AllChem.MMFFGetMoleculeProperties(m)\r\nglobalFF = AllChem.MMFFGetMoleculeForceField(m, mp)\r\nm2 = m;\r\nres = []\r\nfor x in range(-180,180,5):\r\n\tff2 = AllChem.MMFFGetMoleculeForceField(m2, mp)\r\n\tff2.MMFFAddTorsionConstraint(0,1,2,3, False, x - .1, x + .1, 100000.0)\r\n\tff2.Minimize()\r\n\tres.append(globalFF.CalcEnergy(ff2.Positions()))\r\nres\r\n```\r\nI was previously able to get a nice plot like this,\r\n<img width=\"307\" alt=\"image\" src=\"https://user-images.githubusercontent.com/16337306/106652423-0ed1ec80-655b-11eb-979c-260176ac21ad.png\">\r\nbut it now returns a **very different** list\r\n\r\n<img width=\"379\" alt=\"image\" src=\"https://user-images.githubusercontent.com/16337306/106652585-480a5c80-655b-11eb-8024-04a1eae90ade.png\">\r\n\r\n_Originally posted by @jasondbiggs in https://github.com/rdkit/rdkit/discussions/3780_"}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/rdkit_m_rdkit:pr-3975", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/Code/ForceField/ForceField.cpp b/Code/ForceField/ForceField.cpp\nindex b4028891d2f..0133c5f854e 100644\n--- a/Code/ForceField/ForceField.cpp\n+++ b/Code/ForceField/ForceField.cpp\n@@ -17,45 +17,40 @@\n namespace RDKit {\n namespace ForceFieldsHelper {\n void normalizeAngleDeg(double &angleDeg) {\n- double normFactor = 360.0;\n- if (angleDeg < 0.0) {\n- normFactor = -normFactor;\n- }\n- angleDeg = fmod(angleDeg, normFactor);\n- if (fabs(angleDeg) > 180.0) {\n- angleDeg -= normFactor;\n+ angleDeg = fmod(angleDeg, 360.0);\n+ if (angleDeg < -180.0) {\n+ angleDeg += 360.0;\n+ } else if (angleDeg > 180.0) {\n+ angleDeg -= 360.0;\n }\n }\n \n void computeDihedral(const RDGeom::PointPtrVect &pos, unsigned int idx1,\n- unsigned int idx2, unsigned int idx3, unsigned int idx4,\n- double *dihedral, double *cosPhi, RDGeom::Point3D r[4],\n- RDGeom::Point3D t[2], double d[2]) {\n+ unsigned int idx2, unsigned int idx3, unsigned int idx4,\n+ double *dihedral, double *cosPhi, RDGeom::Point3D r[4],\n+ RDGeom::Point3D t[2], double d[2]) {\n computeDihedral(static_cast<RDGeom::Point3D *>(pos[idx1]),\n- static_cast<RDGeom::Point3D *>(pos[idx2]),\n- static_cast<RDGeom::Point3D *>(pos[idx3]),\n- static_cast<RDGeom::Point3D *>(pos[idx4]), dihedral, cosPhi, r, t, d);\n+ static_cast<RDGeom::Point3D *>(pos[idx2]),\n+ static_cast<RDGeom::Point3D *>(pos[idx3]),\n+ static_cast<RDGeom::Point3D *>(pos[idx4]), dihedral, cosPhi,\n+ r, t, d);\n }\n \n-void computeDihedral(const double *pos, unsigned int idx1,\n- unsigned int idx2, unsigned int idx3, unsigned int idx4,\n- double *dihedral, double *cosPhi, RDGeom::Point3D r[4],\n- RDGeom::Point3D t[2], double d[2]) {\n- RDGeom::Point3D p1(pos[3 * idx1], pos[3 * idx1 + 1],\n- pos[3 * idx1 + 2]);\n- RDGeom::Point3D p2(pos[3 * idx2], pos[3 * idx2 + 1],\n- pos[3 * idx2 + 2]);\n- RDGeom::Point3D p3(pos[3 * idx3], pos[3 * idx3 + 1],\n- pos[3 * idx3 + 2]);\n- RDGeom::Point3D p4(pos[3 * idx4], pos[3 * idx4 + 1],\n- pos[3 * idx4 + 2]);\n+void computeDihedral(const double *pos, unsigned int idx1, unsigned int idx2,\n+ unsigned int idx3, unsigned int idx4, double *dihedral,\n+ double *cosPhi, RDGeom::Point3D r[4], RDGeom::Point3D t[2],\n+ double d[2]) {\n+ RDGeom::Point3D p1(pos[3 * idx1], pos[3 * idx1 + 1], pos[3 * idx1 + 2]);\n+ RDGeom::Point3D p2(pos[3 * idx2], pos[3 * idx2 + 1], pos[3 * idx2 + 2]);\n+ RDGeom::Point3D p3(pos[3 * idx3], pos[3 * idx3 + 1], pos[3 * idx3 + 2]);\n+ RDGeom::Point3D p4(pos[3 * idx4], pos[3 * idx4 + 1], pos[3 * idx4 + 2]);\n computeDihedral(&p1, &p2, &p3, &p4, dihedral, cosPhi, r, t, d);\n }\n \n void computeDihedral(const RDGeom::Point3D *p1, const RDGeom::Point3D *p2,\n- const RDGeom::Point3D *p3, const RDGeom::Point3D *p4,\n- double *dihedral, double *cosPhi, RDGeom::Point3D r[4],\n- RDGeom::Point3D t[2], double d[2]) {\n+ const RDGeom::Point3D *p3, const RDGeom::Point3D *p4,\n+ double *dihedral, double *cosPhi, RDGeom::Point3D r[4],\n+ RDGeom::Point3D t[2], double d[2]) {\n PRECONDITION(p1, \"p1 must not be null\");\n PRECONDITION(p2, \"p2 must not be null\");\n PRECONDITION(p3, \"p3 must not be null\");\n@@ -95,8 +90,8 @@ void computeDihedral(const RDGeom::Point3D *p1, const RDGeom::Point3D *p2,\n *dihedral = -atan2(m.dotProduct(t[1]) / mLength, *cosPhi);\n }\n }\n-}\n-}\n+} // namespace ForceFieldsHelper\n+} // namespace RDKit\n \n namespace ForceFieldsHelper {\n class calcEnergy {\n@@ -152,7 +147,7 @@ class calcGradient {\n private:\n ForceFields::ForceField *mp_ffHolder;\n };\n-}\n+} // namespace ForceFieldsHelper\n \n namespace ForceFields {\n ForceField::~ForceField() {\n@@ -429,4 +424,4 @@ void ForceField::initDistanceMatrix() {\n dp_distMat[i] = -1.0;\n }\n }\n-}\n+} // namespace ForceFields\ndiff --git a/Code/ForceField/MMFF/AngleConstraint.cpp b/Code/ForceField/MMFF/AngleConstraint.cpp\nindex 1bd4db0fc02..3670ba1c556 100644\n--- a/Code/ForceField/MMFF/AngleConstraint.cpp\n+++ b/Code/ForceField/MMFF/AngleConstraint.cpp\n@@ -10,7 +10,6 @@\n // which is included in the file license.txt, found at the root\n // of the RDKit source tree.\n //\n-#include \"AngleBend.h\"\n #include \"AngleConstraint.h\"\n #include \"Params.h\"\n #include <cmath>\n@@ -19,28 +18,6 @@\n \n namespace ForceFields {\n namespace MMFF {\n-void _pretreatAngles(double &minAngleDeg, double &maxAngleDeg) {\n- minAngleDeg = fmod(minAngleDeg, 360.0);\n- maxAngleDeg = fmod(maxAngleDeg, 360.0);\n- if (minAngleDeg > 180.0) {\n- minAngleDeg -= 360.0;\n- }\n- if (maxAngleDeg > 180.0) {\n- maxAngleDeg -= 360.0;\n- }\n- if ((minAngleDeg < 0.0) && (!(maxAngleDeg < 0.0))) {\n- maxAngleDeg = std::max(fabs(maxAngleDeg), fabs(minAngleDeg));\n- minAngleDeg = 0.0;\n- }\n- minAngleDeg = fabs(minAngleDeg);\n- maxAngleDeg = fabs(maxAngleDeg);\n- if (minAngleDeg > maxAngleDeg) {\n- double t = minAngleDeg;\n- minAngleDeg = maxAngleDeg;\n- maxAngleDeg = t;\n- }\n-}\n-\n AngleConstraintContrib::AngleConstraintContrib(\n ForceField *owner, unsigned int idx1, unsigned int idx2, unsigned int idx3,\n double minAngleDeg, double maxAngleDeg, double forceConst) {\n@@ -48,8 +25,10 @@ AngleConstraintContrib::AngleConstraintContrib(\n URANGE_CHECK(idx1, owner->positions().size());\n URANGE_CHECK(idx2, owner->positions().size());\n URANGE_CHECK(idx3, owner->positions().size());\n- PRECONDITION(maxAngleDeg >= minAngleDeg, \"allowedDeltaDeg must be >= 0.0\");\n- _pretreatAngles(minAngleDeg, maxAngleDeg);\n+ PRECONDITION(!(minAngleDeg > maxAngleDeg),\n+ \"minAngleDeg must be <= maxAngleDeg\");\n+ RDKit::ForceFieldsHelper::normalizeAngleDeg(minAngleDeg);\n+ RDKit::ForceFieldsHelper::normalizeAngleDeg(maxAngleDeg);\n \n dp_forceField = owner;\n d_at1Idx = idx1;\n@@ -68,7 +47,8 @@ AngleConstraintContrib::AngleConstraintContrib(\n URANGE_CHECK(idx1, pos.size());\n URANGE_CHECK(idx2, pos.size());\n URANGE_CHECK(idx3, pos.size());\n- PRECONDITION(maxAngleDeg >= minAngleDeg, \"allowedDeltaDeg must be >= 0.0\");\n+ PRECONDITION(!(minAngleDeg > maxAngleDeg),\n+ \"minAngleDeg must be <= maxAngleDeg\");\n \n double angle = 0.0;\n if (relative) {\n@@ -89,19 +69,27 @@ AngleConstraintContrib::AngleConstraintContrib(\n d_at3Idx = idx3;\n minAngleDeg += angle;\n maxAngleDeg += angle;\n- _pretreatAngles(minAngleDeg, maxAngleDeg);\n+ RDKit::ForceFieldsHelper::normalizeAngleDeg(minAngleDeg);\n+ RDKit::ForceFieldsHelper::normalizeAngleDeg(maxAngleDeg);\n d_minAngleDeg = minAngleDeg;\n d_maxAngleDeg = maxAngleDeg;\n d_forceConstant = forceConst;\n }\n \n+double AngleConstraintContrib::computeAngleTerm(double angle) const {\n+ double angleTerm = 0.0;\n+ if (angle < d_minAngleDeg) {\n+ angleTerm = angle - d_minAngleDeg;\n+ } else if (angle > d_maxAngleDeg) {\n+ angleTerm = angle - d_maxAngleDeg;\n+ }\n+ return angleTerm;\n+}\n+\n double AngleConstraintContrib::getEnergy(double *pos) const {\n PRECONDITION(dp_forceField, \"no owner\");\n PRECONDITION(pos, \"bad vector\");\n \n- double dist1 = dp_forceField->distance(d_at1Idx, d_at2Idx, pos);\n- double dist2 = dp_forceField->distance(d_at2Idx, d_at3Idx, pos);\n-\n RDGeom::Point3D p1(pos[3 * d_at1Idx], pos[3 * d_at1Idx + 1],\n pos[3 * d_at1Idx + 2]);\n RDGeom::Point3D p2(pos[3 * d_at2Idx], pos[3 * d_at2Idx + 1],\n@@ -109,19 +97,14 @@ double AngleConstraintContrib::getEnergy(double *pos) const {\n RDGeom::Point3D p3(pos[3 * d_at3Idx], pos[3 * d_at3Idx + 1],\n pos[3 * d_at3Idx + 2]);\n \n- RDGeom::Point3D p12 = (p1 - p2) / dist1;\n- RDGeom::Point3D p32 = (p3 - p2) / dist2;\n- double cosTheta = p12.dotProduct(p32);\n+ RDGeom::Point3D r[2] = {p1 - p2, p3 - p2};\n+ double rLengthSq[2] = {(std::max)(1.0e-5, r[0].lengthSq()),\n+ (std::max)(1.0e-5, r[1].lengthSq())};\n+ double cosTheta = r[0].dotProduct(r[1]) / sqrt(rLengthSq[0] * rLengthSq[1]);\n clipToOne(cosTheta);\n double angle = RAD2DEG * acos(cosTheta);\n- double angleTerm = 0.0;\n- if (angle < d_minAngleDeg) {\n- angleTerm = angle - d_minAngleDeg;\n- } else if (angle > d_maxAngleDeg) {\n- angleTerm = angle - d_maxAngleDeg;\n- }\n- double const c = 0.5 * DEG2RAD * DEG2RAD;\n- double res = c * d_forceConstant * angleTerm * angleTerm;\n+ double angleTerm = computeAngleTerm(angle);\n+ double res = d_forceConstant * angleTerm * angleTerm;\n \n return res;\n }\n@@ -131,39 +114,38 @@ void AngleConstraintContrib::getGrad(double *pos, double *grad) const {\n PRECONDITION(pos, \"bad vector\");\n PRECONDITION(grad, \"bad vector\");\n \n- double dist[2] = {dp_forceField->distance(d_at1Idx, d_at2Idx, pos),\n- dp_forceField->distance(d_at2Idx, d_at3Idx, pos)};\n-\n RDGeom::Point3D p1(pos[3 * d_at1Idx], pos[3 * d_at1Idx + 1],\n pos[3 * d_at1Idx + 2]);\n RDGeom::Point3D p2(pos[3 * d_at2Idx], pos[3 * d_at2Idx + 1],\n pos[3 * d_at2Idx + 2]);\n RDGeom::Point3D p3(pos[3 * d_at3Idx], pos[3 * d_at3Idx + 1],\n pos[3 * d_at3Idx + 2]);\n+\n double *g[3] = {&(grad[3 * d_at1Idx]), &(grad[3 * d_at2Idx]),\n &(grad[3 * d_at3Idx])};\n- RDGeom::Point3D r[2] = {(p1 - p2) / dist[0], (p3 - p2) / dist[1]};\n- double cosTheta = r[0].dotProduct(r[1]);\n+ RDGeom::Point3D r[2] = {p1 - p2, p3 - p2};\n+ double rLengthSq[2] = {(std::max)(1.0e-5, r[0].lengthSq()),\n+ (std::max)(1.0e-5, r[1].lengthSq())};\n+ double cosTheta = r[0].dotProduct(r[1]) / sqrt(rLengthSq[0] * rLengthSq[1]);\n clipToOne(cosTheta);\n- double sinThetaSq = 1.0 - cosTheta * cosTheta;\n- double sinTheta =\n- std::max(((sinThetaSq > 0.0) ? sqrt(sinThetaSq) : 0.0), 1.0e-8);\n \n- // use the chain rule:\n- // dE/dx = dE/dTheta * dTheta/dx\n-\n- // dE/dTheta is independent of cartesians:\n double angle = RAD2DEG * acos(cosTheta);\n- double angleTerm = 0.0;\n- if (angle < d_minAngleDeg) {\n- angleTerm = angle - d_minAngleDeg;\n- } else if (angle > d_maxAngleDeg) {\n- angleTerm = angle - d_maxAngleDeg;\n+ double angleTerm = computeAngleTerm(angle);\n+\n+ double dE_dTheta = 2.0 * RAD2DEG * d_forceConstant * angleTerm;\n+\n+ RDGeom::Point3D rp = r[1].crossProduct(r[0]);\n+ double prefactor = dE_dTheta / (std::max)(1.0e-5, rp.length());\n+ double t[2] = {-prefactor / rLengthSq[0], prefactor / rLengthSq[1]};\n+ RDGeom::Point3D dedp[3];\n+ dedp[0] = r[0].crossProduct(rp) * t[0];\n+ dedp[2] = r[1].crossProduct(rp) * t[1];\n+ dedp[1] = -dedp[0] - dedp[2];\n+ for (unsigned int i = 0; i < 3; ++i) {\n+ g[i][0] += dedp[i].x;\n+ g[i][1] += dedp[i].y;\n+ g[i][2] += dedp[i].z;\n }\n-\n- double dE_dTheta = DEG2RAD * d_forceConstant * angleTerm;\n-\n- Utils::calcAngleBendGrad(r, dist, g, dE_dTheta, cosTheta, sinTheta);\n-}\n-}\n }\n+} // namespace MMFF\n+} // namespace ForceFields\ndiff --git a/Code/ForceField/MMFF/AngleConstraint.h b/Code/ForceField/MMFF/AngleConstraint.h\nindex e0e6ebd1bdb..48ff353f0a3 100644\n--- a/Code/ForceField/MMFF/AngleConstraint.h\n+++ b/Code/ForceField/MMFF/AngleConstraint.h\n@@ -53,6 +53,7 @@ class RDKIT_FORCEFIELD_EXPORT AngleConstraintContrib\n };\n \n private:\n+ double computeAngleTerm(double angle) const;\n int d_at1Idx{-1}, d_at2Idx{-1},\n d_at3Idx{-1}; //!< indices of atoms forming the angle\n double d_minAngleDeg, d_maxAngleDeg; //!< rest amplitudes of the angle\ndiff --git a/Code/ForceField/MMFF/TorsionConstraint.cpp b/Code/ForceField/MMFF/TorsionConstraint.cpp\nindex 3e87a22059a..d3a391cac76 100644\n--- a/Code/ForceField/MMFF/TorsionConstraint.cpp\n+++ b/Code/ForceField/MMFF/TorsionConstraint.cpp\n@@ -10,7 +10,6 @@\n // which is included in the file license.txt, found at the root\n // of the RDKit source tree.\n //\n-#include \"TorsionAngle.h\"\n #include \"TorsionConstraint.h\"\n #include \"Params.h\"\n #include <cmath>\n@@ -25,8 +24,12 @@\n namespace ForceFields {\n namespace MMFF {\n inline void checkPrecondition(const ForceField *owner, unsigned int idx1,\n- unsigned int idx2, unsigned int idx3, unsigned int idx4) {\n+ unsigned int idx2, unsigned int idx3,\n+ unsigned int idx4, double minDihedralDeg,\n+ double maxDihedralDeg) {\n PRECONDITION(owner, \"bad owner\");\n+ PRECONDITION(!(minDihedralDeg > maxDihedralDeg),\n+ \"minDihedralDeg must be <= maxDihedralDeg\");\n URANGE_CHECK(idx1, owner->positions().size());\n URANGE_CHECK(idx2, owner->positions().size());\n URANGE_CHECK(idx3, owner->positions().size());\n@@ -35,29 +38,35 @@ inline void checkPrecondition(const ForceField *owner, unsigned int idx1,\n \n double TorsionConstraintContrib::computeDihedralTerm(double dihedral) const {\n double dihedralTarget = dihedral;\n- if (!(dihedral > d_minDihedralDeg && dihedral < d_maxDihedralDeg)\n- && !(dihedral > d_minDihedralDeg && d_minDihedralDeg > d_maxDihedralDeg)\n- && !(dihedral < d_maxDihedralDeg && d_minDihedralDeg > d_maxDihedralDeg)) {\n- double minDihedralTarget = dihedral - d_minDihedralDeg;\n- double maxDihedralTarget = dihedral - d_maxDihedralDeg;\n- RDKit::ForceFieldsHelper::normalizeAngleDeg(minDihedralTarget);\n- RDKit::ForceFieldsHelper::normalizeAngleDeg(maxDihedralTarget);\n- dihedralTarget = (fabs(minDihedralTarget) < fabs(maxDihedralTarget)\n- ? d_minDihedralDeg : d_maxDihedralDeg);\n+ if (!(dihedral > d_minDihedralDeg && dihedral < d_maxDihedralDeg) &&\n+ !(dihedral > d_minDihedralDeg && d_minDihedralDeg > d_maxDihedralDeg) &&\n+ !(dihedral < d_maxDihedralDeg && d_minDihedralDeg > d_maxDihedralDeg)) {\n+ double dihedralMinTarget = dihedral - d_minDihedralDeg;\n+ RDKit::ForceFieldsHelper::normalizeAngleDeg(dihedralMinTarget);\n+ double dihedralMaxTarget = dihedral - d_maxDihedralDeg;\n+ RDKit::ForceFieldsHelper::normalizeAngleDeg(dihedralMaxTarget);\n+ if (fabs(dihedralMinTarget) < fabs(dihedralMaxTarget)) {\n+ dihedralTarget = d_minDihedralDeg;\n+ } else {\n+ dihedralTarget = d_maxDihedralDeg;\n+ }\n }\n double dihedralTerm = dihedral - dihedralTarget;\n RDKit::ForceFieldsHelper::normalizeAngleDeg(dihedralTerm);\n return dihedralTerm;\n }\n \n-void TorsionConstraintContrib::setParameters(ForceField *owner, unsigned int idx1,\n- unsigned int idx2, unsigned int idx3, unsigned int idx4, double minDihedralDeg,\n- double maxDihedralDeg, double forceConst) {\n+void TorsionConstraintContrib::setParameters(\n+ ForceField *owner, unsigned int idx1, unsigned int idx2, unsigned int idx3,\n+ unsigned int idx4, double minDihedralDeg, double maxDihedralDeg,\n+ double forceConst) {\n dp_forceField = owner;\n d_at1Idx = idx1;\n d_at2Idx = idx2;\n d_at3Idx = idx3;\n d_at4Idx = idx4;\n+ RDKit::ForceFieldsHelper::normalizeAngleDeg(minDihedralDeg);\n+ RDKit::ForceFieldsHelper::normalizeAngleDeg(maxDihedralDeg);\n d_minDihedralDeg = minDihedralDeg;\n d_maxDihedralDeg = maxDihedralDeg;\n d_forceConstant = forceConst;\n@@ -67,44 +76,39 @@ TorsionConstraintContrib::TorsionConstraintContrib(\n ForceField *owner, unsigned int idx1, unsigned int idx2, unsigned int idx3,\n unsigned int idx4, double minDihedralDeg, double maxDihedralDeg,\n double forceConst) {\n- checkPrecondition(owner, idx1, idx2, idx3, idx4);\n- RDKit::ForceFieldsHelper::normalizeAngleDeg(minDihedralDeg);\n- RDKit::ForceFieldsHelper::normalizeAngleDeg(maxDihedralDeg);\n- setParameters(owner, idx1, idx2, idx3, idx4,\n- minDihedralDeg, maxDihedralDeg, forceConst);\n+ checkPrecondition(owner, idx1, idx2, idx3, idx4, minDihedralDeg,\n+ maxDihedralDeg);\n+ setParameters(owner, idx1, idx2, idx3, idx4, minDihedralDeg, maxDihedralDeg,\n+ forceConst);\n }\n \n TorsionConstraintContrib::TorsionConstraintContrib(\n ForceField *owner, unsigned int idx1, unsigned int idx2, unsigned int idx3,\n unsigned int idx4, bool relative, double minDihedralDeg,\n double maxDihedralDeg, double forceConst) {\n- checkPrecondition(owner, idx1, idx2, idx3, idx4);\n- RDKit::ForceFieldsHelper::normalizeAngleDeg(minDihedralDeg);\n- RDKit::ForceFieldsHelper::normalizeAngleDeg(maxDihedralDeg);\n+ checkPrecondition(owner, idx1, idx2, idx3, idx4, minDihedralDeg,\n+ maxDihedralDeg);\n if (relative) {\n double dihedral;\n- RDKit::ForceFieldsHelper::computeDihedral(\n- owner->positions(), idx1, idx2, idx3, idx4, &dihedral);\n+ RDKit::ForceFieldsHelper::computeDihedral(owner->positions(), idx1, idx2,\n+ idx3, idx4, &dihedral);\n dihedral *= RAD2DEG;\n minDihedralDeg += dihedral;\n maxDihedralDeg += dihedral;\n- RDKit::ForceFieldsHelper::normalizeAngleDeg(minDihedralDeg);\n- RDKit::ForceFieldsHelper::normalizeAngleDeg(maxDihedralDeg);\n }\n- setParameters(owner, idx1, idx2, idx3, idx4,\n- minDihedralDeg, maxDihedralDeg, forceConst);\n+ setParameters(owner, idx1, idx2, idx3, idx4, minDihedralDeg, maxDihedralDeg,\n+ forceConst);\n }\n \n double TorsionConstraintContrib::getEnergy(double *pos) const {\n PRECONDITION(dp_forceField, \"no owner\");\n PRECONDITION(pos, \"bad vector\");\n double dihedral;\n- RDKit::ForceFieldsHelper::computeDihedral(\n- pos, d_at1Idx, d_at2Idx, d_at3Idx, d_at4Idx, &dihedral);\n+ RDKit::ForceFieldsHelper::computeDihedral(pos, d_at1Idx, d_at2Idx, d_at3Idx,\n+ d_at4Idx, &dihedral);\n dihedral *= RAD2DEG;\n double dihedralTerm = computeDihedralTerm(dihedral);\n- static double const c = 0.5 * DEG2RAD * DEG2RAD;\n- double res = c * d_forceConstant * dihedralTerm * dihedralTerm;\n+ double res = d_forceConstant * dihedralTerm * dihedralTerm;\n \n return res;\n }\n@@ -120,23 +124,35 @@ void TorsionConstraintContrib::getGrad(double *pos, double *grad) const {\n RDGeom::Point3D r[4];\n RDGeom::Point3D t[2];\n double d[2];\n- double cosPhi;\n double dihedral;\n RDKit::ForceFieldsHelper::computeDihedral(\n- pos, d_at1Idx, d_at2Idx, d_at3Idx, d_at4Idx, &dihedral, &cosPhi, r, t, d);\n+ pos, d_at1Idx, d_at2Idx, d_at3Idx, d_at4Idx, &dihedral, nullptr, r, t, d);\n dihedral *= RAD2DEG;\n- double sinPhiSq = 1.0 - cosPhi * cosPhi;\n- double sinPhi = ((sinPhiSq > 0.0) ? sqrt(sinPhiSq) : 0.0);\n- // dE/dPhi is independent of cartesians:\n double dihedralTerm = computeDihedralTerm(dihedral);\n- double dE_dPhi = DEG2RAD * d_forceConstant * dihedralTerm;\n+ double dE_dPhi = 2.0 * RAD2DEG * d_forceConstant * dihedralTerm;\n \n- // FIX: use a tolerance here\n- // this is hacky, but it's per the\n- // recommendation from Niketic and Rasmussen:\n- double sinTerm =\n- -dE_dPhi * (isDoubleZero(sinPhi) ? (1.0 / cosPhi) : (1.0 / sinPhi));\n- Utils::calcTorsionGrad(r, t, d, g, sinTerm, cosPhi);\n-}\n-}\n+ double d23 = dp_forceField->distance(d_at2Idx, d_at3Idx, pos);\n+ RDGeom::Point3D r31(pos[3 * d_at3Idx] - pos[3 * d_at1Idx],\n+ pos[3 * d_at3Idx + 1] - pos[3 * d_at1Idx + 1],\n+ pos[3 * d_at3Idx + 2] - pos[3 * d_at1Idx + 2]);\n+ RDGeom::Point3D r42(pos[3 * d_at4Idx] - pos[3 * d_at2Idx],\n+ pos[3 * d_at4Idx + 1] - pos[3 * d_at2Idx + 1],\n+ pos[3 * d_at4Idx + 2] - pos[3 * d_at2Idx + 2]);\n+ double prefactor = dE_dPhi / d23;\n+ RDGeom::Point3D tt[2] = {r[0].crossProduct(r[1]), r[2].crossProduct(r[3])};\n+ RDGeom::Point3D dedt[2] = {\n+ tt[0].crossProduct(r[2]) / tt[0].lengthSq() * prefactor,\n+ tt[1].crossProduct(r[1]) / tt[1].lengthSq() * prefactor};\n+ RDGeom::Point3D dedp[4] = {\n+ r[2].crossProduct(dedt[0]),\n+ r31.crossProduct(dedt[0]) - r[3].crossProduct(dedt[1]),\n+ r[0].crossProduct(dedt[0]) + r42.crossProduct(dedt[1]),\n+ r[2].crossProduct(dedt[1])};\n+ for (unsigned int i = 0; i < 4; ++i) {\n+ g[i][0] += dedp[i].x;\n+ g[i][1] += dedp[i].y;\n+ g[i][2] += dedp[i].z;\n+ }\n }\n+} // namespace MMFF\n+} // namespace ForceFields\ndiff --git a/Code/ForceField/UFF/AngleConstraint.cpp b/Code/ForceField/UFF/AngleConstraint.cpp\nindex 37111b8aa5b..7c69d20b92c 100644\n--- a/Code/ForceField/UFF/AngleConstraint.cpp\n+++ b/Code/ForceField/UFF/AngleConstraint.cpp\n@@ -10,7 +10,6 @@\n // which is included in the file license.txt, found at the root\n // of the RDKit source tree.\n //\n-#include \"AngleBend.h\"\n #include \"AngleConstraint.h\"\n #include \"Params.h\"\n #include <cmath>\n@@ -19,28 +18,6 @@\n \n namespace ForceFields {\n namespace UFF {\n-void _pretreatAngles(double &minAngleDeg, double &maxAngleDeg) {\n- minAngleDeg = fmod(minAngleDeg, 360.0);\n- maxAngleDeg = fmod(maxAngleDeg, 360.0);\n- if (minAngleDeg > 180.0) {\n- minAngleDeg -= 360.0;\n- }\n- if (maxAngleDeg > 180.0) {\n- maxAngleDeg -= 360.0;\n- }\n- if ((minAngleDeg < 0.0) && (!(maxAngleDeg < 0.0))) {\n- maxAngleDeg = std::max(fabs(maxAngleDeg), fabs(minAngleDeg));\n- minAngleDeg = 0.0;\n- }\n- minAngleDeg = fabs(minAngleDeg);\n- maxAngleDeg = fabs(maxAngleDeg);\n- if (minAngleDeg > maxAngleDeg) {\n- double t = minAngleDeg;\n- minAngleDeg = maxAngleDeg;\n- maxAngleDeg = t;\n- }\n-}\n-\n AngleConstraintContrib::AngleConstraintContrib(\n ForceField *owner, unsigned int idx1, unsigned int idx2, unsigned int idx3,\n double minAngleDeg, double maxAngleDeg, double forceConst) {\n@@ -48,8 +25,10 @@ AngleConstraintContrib::AngleConstraintContrib(\n URANGE_CHECK(idx1, owner->positions().size());\n URANGE_CHECK(idx2, owner->positions().size());\n URANGE_CHECK(idx3, owner->positions().size());\n- PRECONDITION(maxAngleDeg >= minAngleDeg, \"allowedDeltaDeg must be >= 0.0\");\n- _pretreatAngles(minAngleDeg, maxAngleDeg);\n+ PRECONDITION(!(minAngleDeg > maxAngleDeg),\n+ \"minAngleDeg must be <= maxAngleDeg\");\n+ RDKit::ForceFieldsHelper::normalizeAngleDeg(minAngleDeg);\n+ RDKit::ForceFieldsHelper::normalizeAngleDeg(maxAngleDeg);\n \n dp_forceField = owner;\n d_at1Idx = idx1;\n@@ -68,7 +47,8 @@ AngleConstraintContrib::AngleConstraintContrib(\n URANGE_CHECK(idx1, pos.size());\n URANGE_CHECK(idx2, pos.size());\n URANGE_CHECK(idx3, pos.size());\n- PRECONDITION(maxAngleDeg >= minAngleDeg, \"allowedDeltaDeg must be >= 0.0\");\n+ PRECONDITION(!(minAngleDeg > maxAngleDeg),\n+ \"minAngleDeg must be <= maxAngleDeg\");\n \n double angle = 0.0;\n if (relative) {\n@@ -89,19 +69,27 @@ AngleConstraintContrib::AngleConstraintContrib(\n d_at3Idx = idx3;\n minAngleDeg += angle;\n maxAngleDeg += angle;\n- _pretreatAngles(minAngleDeg, maxAngleDeg);\n+ RDKit::ForceFieldsHelper::normalizeAngleDeg(minAngleDeg);\n+ RDKit::ForceFieldsHelper::normalizeAngleDeg(maxAngleDeg);\n d_minAngleDeg = minAngleDeg;\n d_maxAngleDeg = maxAngleDeg;\n d_forceConstant = forceConst;\n }\n \n+double AngleConstraintContrib::computeAngleTerm(double angle) const {\n+ double angleTerm = 0.0;\n+ if (angle < d_minAngleDeg) {\n+ angleTerm = angle - d_minAngleDeg;\n+ } else if (angle > d_maxAngleDeg) {\n+ angleTerm = angle - d_maxAngleDeg;\n+ }\n+ return angleTerm;\n+}\n+\n double AngleConstraintContrib::getEnergy(double *pos) const {\n PRECONDITION(dp_forceField, \"no owner\");\n PRECONDITION(pos, \"bad vector\");\n \n- double dist1 = dp_forceField->distance(d_at1Idx, d_at2Idx, pos);\n- double dist2 = dp_forceField->distance(d_at2Idx, d_at3Idx, pos);\n-\n RDGeom::Point3D p1(pos[3 * d_at1Idx], pos[3 * d_at1Idx + 1],\n pos[3 * d_at1Idx + 2]);\n RDGeom::Point3D p2(pos[3 * d_at2Idx], pos[3 * d_at2Idx + 1],\n@@ -109,19 +97,14 @@ double AngleConstraintContrib::getEnergy(double *pos) const {\n RDGeom::Point3D p3(pos[3 * d_at3Idx], pos[3 * d_at3Idx + 1],\n pos[3 * d_at3Idx + 2]);\n \n- RDGeom::Point3D p12 = (p1 - p2) / dist1;\n- RDGeom::Point3D p32 = (p3 - p2) / dist2;\n- double cosTheta = p12.dotProduct(p32);\n+ RDGeom::Point3D r[2] = {p1 - p2, p3 - p2};\n+ double rLengthSq[2] = {(std::max)(1.0e-5, r[0].lengthSq()),\n+ (std::max)(1.0e-5, r[1].lengthSq())};\n+ double cosTheta = r[0].dotProduct(r[1]) / sqrt(rLengthSq[0] * rLengthSq[1]);\n clipToOne(cosTheta);\n double angle = RAD2DEG * acos(cosTheta);\n- double angleTerm = 0.0;\n- if (angle < d_minAngleDeg) {\n- angleTerm = angle - d_minAngleDeg;\n- } else if (angle > d_maxAngleDeg) {\n- angleTerm = angle - d_maxAngleDeg;\n- }\n- double const c = 0.5 * DEG2RAD * DEG2RAD;\n- double res = c * d_forceConstant * angleTerm * angleTerm;\n+ double angleTerm = computeAngleTerm(angle);\n+ double res = d_forceConstant * angleTerm * angleTerm;\n \n return res;\n }\n@@ -131,39 +114,38 @@ void AngleConstraintContrib::getGrad(double *pos, double *grad) const {\n PRECONDITION(pos, \"bad vector\");\n PRECONDITION(grad, \"bad vector\");\n \n- double dist[2] = {dp_forceField->distance(d_at1Idx, d_at2Idx, pos),\n- dp_forceField->distance(d_at2Idx, d_at3Idx, pos)};\n-\n RDGeom::Point3D p1(pos[3 * d_at1Idx], pos[3 * d_at1Idx + 1],\n pos[3 * d_at1Idx + 2]);\n RDGeom::Point3D p2(pos[3 * d_at2Idx], pos[3 * d_at2Idx + 1],\n pos[3 * d_at2Idx + 2]);\n RDGeom::Point3D p3(pos[3 * d_at3Idx], pos[3 * d_at3Idx + 1],\n pos[3 * d_at3Idx + 2]);\n+\n double *g[3] = {&(grad[3 * d_at1Idx]), &(grad[3 * d_at2Idx]),\n &(grad[3 * d_at3Idx])};\n- RDGeom::Point3D r[2] = {(p1 - p2) / dist[0], (p3 - p2) / dist[1]};\n- double cosTheta = r[0].dotProduct(r[1]);\n+ RDGeom::Point3D r[2] = {p1 - p2, p3 - p2};\n+ double rLengthSq[2] = {(std::max)(1.0e-5, r[0].lengthSq()),\n+ (std::max)(1.0e-5, r[1].lengthSq())};\n+ double cosTheta = r[0].dotProduct(r[1]) / sqrt(rLengthSq[0] * rLengthSq[1]);\n clipToOne(cosTheta);\n- double sinThetaSq = 1.0 - cosTheta * cosTheta;\n- double sinTheta =\n- std::max(((sinThetaSq > 0.0) ? sqrt(sinThetaSq) : 0.0), 1.0e-8);\n \n- // use the chain rule:\n- // dE/dx = dE/dTheta * dTheta/dx\n-\n- // dE/dTheta is independent of cartesians:\n double angle = RAD2DEG * acos(cosTheta);\n- double angleTerm = 0.0;\n- if (angle < d_minAngleDeg) {\n- angleTerm = angle - d_minAngleDeg;\n- } else if (angle > d_maxAngleDeg) {\n- angleTerm = angle - d_maxAngleDeg;\n+ double angleTerm = computeAngleTerm(angle);\n+\n+ double dE_dTheta = 2.0 * RAD2DEG * d_forceConstant * angleTerm;\n+\n+ RDGeom::Point3D rp = r[1].crossProduct(r[0]);\n+ double prefactor = dE_dTheta / (std::max)(1.0e-5, rp.length());\n+ double t[2] = {-prefactor / rLengthSq[0], prefactor / rLengthSq[1]};\n+ RDGeom::Point3D dedp[3];\n+ dedp[0] = r[0].crossProduct(rp) * t[0];\n+ dedp[2] = r[1].crossProduct(rp) * t[1];\n+ dedp[1] = -dedp[0] - dedp[2];\n+ for (unsigned int i = 0; i < 3; ++i) {\n+ g[i][0] += dedp[i].x;\n+ g[i][1] += dedp[i].y;\n+ g[i][2] += dedp[i].z;\n }\n-\n- double dE_dTheta = DEG2RAD * d_forceConstant * angleTerm;\n-\n- Utils::calcAngleBendGrad(r, dist, g, dE_dTheta, cosTheta, sinTheta);\n-}\n-}\n }\n+} // namespace UFF\n+} // namespace ForceFields\ndiff --git a/Code/ForceField/UFF/AngleConstraint.h b/Code/ForceField/UFF/AngleConstraint.h\nindex 66bc58f1cec..e9930a8b991 100644\n--- a/Code/ForceField/UFF/AngleConstraint.h\n+++ b/Code/ForceField/UFF/AngleConstraint.h\n@@ -22,7 +22,7 @@ namespace UFF {\n class RDKIT_FORCEFIELD_EXPORT AngleConstraintContrib\n : public ForceFieldContrib {\n public:\n- AngleConstraintContrib() {};\n+ AngleConstraintContrib(){};\n //! Constructor\n /*!\n \\param owner pointer to the owning ForceField\n@@ -47,12 +47,15 @@ class RDKIT_FORCEFIELD_EXPORT AngleConstraintContrib\n double getEnergy(double *pos) const;\n \n void getGrad(double *pos, double *grad) const;\n+\n virtual AngleConstraintContrib *copy() const {\n return new AngleConstraintContrib(*this);\n };\n \n private:\n- int d_at1Idx{-1}, d_at2Idx{-1}, d_at3Idx{-1}; //!< indices of atoms forming the angle\n+ double computeAngleTerm(double angle) const;\n+ int d_at1Idx{-1}, d_at2Idx{-1},\n+ d_at3Idx{-1}; //!< indices of atoms forming the angle\n double d_minAngleDeg, d_maxAngleDeg; //!< rest amplitudes of the angle\n double d_forceConstant; //!< force constant of the angle constraint\n };\ndiff --git a/Code/ForceField/UFF/TorsionConstraint.cpp b/Code/ForceField/UFF/TorsionConstraint.cpp\nindex 5215612b8b7..cef3c0fabdd 100644\n--- a/Code/ForceField/UFF/TorsionConstraint.cpp\n+++ b/Code/ForceField/UFF/TorsionConstraint.cpp\n@@ -10,7 +10,6 @@\n // which is included in the file license.txt, found at the root\n // of the RDKit source tree.\n //\n-#include \"TorsionAngle.h\"\n #include \"TorsionConstraint.h\"\n #include \"Params.h\"\n #include <cmath>\n@@ -25,8 +24,12 @@\n namespace ForceFields {\n namespace UFF {\n inline void checkPrecondition(const ForceField *owner, unsigned int idx1,\n- unsigned int idx2, unsigned int idx3, unsigned int idx4) {\n+ unsigned int idx2, unsigned int idx3,\n+ unsigned int idx4, double minDihedralDeg,\n+ double maxDihedralDeg) {\n PRECONDITION(owner, \"bad owner\");\n+ PRECONDITION(!(minDihedralDeg > maxDihedralDeg),\n+ \"minDihedralDeg must be <= maxDihedralDeg\");\n URANGE_CHECK(idx1, owner->positions().size());\n URANGE_CHECK(idx2, owner->positions().size());\n URANGE_CHECK(idx3, owner->positions().size());\n@@ -35,29 +38,35 @@ inline void checkPrecondition(const ForceField *owner, unsigned int idx1,\n \n double TorsionConstraintContrib::computeDihedralTerm(double dihedral) const {\n double dihedralTarget = dihedral;\n- if (!(dihedral > d_minDihedralDeg && dihedral < d_maxDihedralDeg)\n- && !(dihedral > d_minDihedralDeg && d_minDihedralDeg > d_maxDihedralDeg)\n- && !(dihedral < d_maxDihedralDeg && d_minDihedralDeg > d_maxDihedralDeg)) {\n- double minDihedralTarget = dihedral - d_minDihedralDeg;\n- double maxDihedralTarget = dihedral - d_maxDihedralDeg;\n- RDKit::ForceFieldsHelper::normalizeAngleDeg(minDihedralTarget);\n- RDKit::ForceFieldsHelper::normalizeAngleDeg(maxDihedralTarget);\n- dihedralTarget = (fabs(minDihedralTarget) < fabs(maxDihedralTarget)\n- ? d_minDihedralDeg : d_maxDihedralDeg);\n+ if (!(dihedral > d_minDihedralDeg && dihedral < d_maxDihedralDeg) &&\n+ !(dihedral > d_minDihedralDeg && d_minDihedralDeg > d_maxDihedralDeg) &&\n+ !(dihedral < d_maxDihedralDeg && d_minDihedralDeg > d_maxDihedralDeg)) {\n+ double dihedralMinTarget = dihedral - d_minDihedralDeg;\n+ RDKit::ForceFieldsHelper::normalizeAngleDeg(dihedralMinTarget);\n+ double dihedralMaxTarget = dihedral - d_maxDihedralDeg;\n+ RDKit::ForceFieldsHelper::normalizeAngleDeg(dihedralMaxTarget);\n+ if (fabs(dihedralMinTarget) < fabs(dihedralMaxTarget)) {\n+ dihedralTarget = d_minDihedralDeg;\n+ } else {\n+ dihedralTarget = d_maxDihedralDeg;\n+ }\n }\n double dihedralTerm = dihedral - dihedralTarget;\n RDKit::ForceFieldsHelper::normalizeAngleDeg(dihedralTerm);\n return dihedralTerm;\n }\n \n-void TorsionConstraintContrib::setParameters(ForceField *owner, unsigned int idx1,\n- unsigned int idx2, unsigned int idx3, unsigned int idx4, double minDihedralDeg,\n- double maxDihedralDeg, double forceConst) {\n+void TorsionConstraintContrib::setParameters(\n+ ForceField *owner, unsigned int idx1, unsigned int idx2, unsigned int idx3,\n+ unsigned int idx4, double minDihedralDeg, double maxDihedralDeg,\n+ double forceConst) {\n dp_forceField = owner;\n d_at1Idx = idx1;\n d_at2Idx = idx2;\n d_at3Idx = idx3;\n d_at4Idx = idx4;\n+ RDKit::ForceFieldsHelper::normalizeAngleDeg(minDihedralDeg);\n+ RDKit::ForceFieldsHelper::normalizeAngleDeg(maxDihedralDeg);\n d_minDihedralDeg = minDihedralDeg;\n d_maxDihedralDeg = maxDihedralDeg;\n d_forceConstant = forceConst;\n@@ -67,44 +76,39 @@ TorsionConstraintContrib::TorsionConstraintContrib(\n ForceField *owner, unsigned int idx1, unsigned int idx2, unsigned int idx3,\n unsigned int idx4, double minDihedralDeg, double maxDihedralDeg,\n double forceConst) {\n- checkPrecondition(owner, idx1, idx2, idx3, idx4);\n- RDKit::ForceFieldsHelper::normalizeAngleDeg(minDihedralDeg);\n- RDKit::ForceFieldsHelper::normalizeAngleDeg(maxDihedralDeg);\n- setParameters(owner, idx1, idx2, idx3, idx4,\n- minDihedralDeg, maxDihedralDeg, forceConst);\n+ checkPrecondition(owner, idx1, idx2, idx3, idx4, minDihedralDeg,\n+ maxDihedralDeg);\n+ setParameters(owner, idx1, idx2, idx3, idx4, minDihedralDeg, maxDihedralDeg,\n+ forceConst);\n }\n \n TorsionConstraintContrib::TorsionConstraintContrib(\n ForceField *owner, unsigned int idx1, unsigned int idx2, unsigned int idx3,\n unsigned int idx4, bool relative, double minDihedralDeg,\n double maxDihedralDeg, double forceConst) {\n- checkPrecondition(owner, idx1, idx2, idx3, idx4);\n- RDKit::ForceFieldsHelper::normalizeAngleDeg(minDihedralDeg);\n- RDKit::ForceFieldsHelper::normalizeAngleDeg(maxDihedralDeg);\n+ checkPrecondition(owner, idx1, idx2, idx3, idx4, minDihedralDeg,\n+ maxDihedralDeg);\n if (relative) {\n double dihedral;\n- RDKit::ForceFieldsHelper::computeDihedral(\n- owner->positions(), idx1, idx2, idx3, idx4, &dihedral);\n+ RDKit::ForceFieldsHelper::computeDihedral(owner->positions(), idx1, idx2,\n+ idx3, idx4, &dihedral);\n dihedral *= RAD2DEG;\n minDihedralDeg += dihedral;\n maxDihedralDeg += dihedral;\n- RDKit::ForceFieldsHelper::normalizeAngleDeg(minDihedralDeg);\n- RDKit::ForceFieldsHelper::normalizeAngleDeg(maxDihedralDeg);\n }\n- setParameters(owner, idx1, idx2, idx3, idx4,\n- minDihedralDeg, maxDihedralDeg, forceConst);\n+ setParameters(owner, idx1, idx2, idx3, idx4, minDihedralDeg, maxDihedralDeg,\n+ forceConst);\n }\n \n double TorsionConstraintContrib::getEnergy(double *pos) const {\n PRECONDITION(dp_forceField, \"no owner\");\n PRECONDITION(pos, \"bad vector\");\n double dihedral;\n- RDKit::ForceFieldsHelper::computeDihedral(\n- pos, d_at1Idx, d_at2Idx, d_at3Idx, d_at4Idx, &dihedral);\n+ RDKit::ForceFieldsHelper::computeDihedral(pos, d_at1Idx, d_at2Idx, d_at3Idx,\n+ d_at4Idx, &dihedral);\n dihedral *= RAD2DEG;\n double dihedralTerm = computeDihedralTerm(dihedral);\n- static double const c = 0.5 * DEG2RAD * DEG2RAD;\n- double res = c * d_forceConstant * dihedralTerm * dihedralTerm;\n+ double res = d_forceConstant * dihedralTerm * dihedralTerm;\n \n return res;\n }\n@@ -120,23 +124,35 @@ void TorsionConstraintContrib::getGrad(double *pos, double *grad) const {\n RDGeom::Point3D r[4];\n RDGeom::Point3D t[2];\n double d[2];\n- double cosPhi;\n double dihedral;\n RDKit::ForceFieldsHelper::computeDihedral(\n- pos, d_at1Idx, d_at2Idx, d_at3Idx, d_at4Idx, &dihedral, &cosPhi, r, t, d);\n+ pos, d_at1Idx, d_at2Idx, d_at3Idx, d_at4Idx, &dihedral, nullptr, r, t, d);\n dihedral *= RAD2DEG;\n- double sinPhiSq = 1.0 - cosPhi * cosPhi;\n- double sinPhi = ((sinPhiSq > 0.0) ? sqrt(sinPhiSq) : 0.0);\n- // dE/dPhi is independent of cartesians:\n double dihedralTerm = computeDihedralTerm(dihedral);\n- double dE_dPhi = DEG2RAD * d_forceConstant * dihedralTerm;\n+ double dE_dPhi = 2.0 * RAD2DEG * d_forceConstant * dihedralTerm;\n \n- // FIX: use a tolerance here\n- // this is hacky, but it's per the\n- // recommendation from Niketic and Rasmussen:\n- double sinTerm =\n- -dE_dPhi * (isDoubleZero(sinPhi) ? (1.0 / cosPhi) : (1.0 / sinPhi));\n- Utils::calcTorsionGrad(r, t, d, g, sinTerm, cosPhi);\n-}\n-}\n+ double d23 = dp_forceField->distance(d_at2Idx, d_at3Idx, pos);\n+ RDGeom::Point3D r31(pos[3 * d_at3Idx] - pos[3 * d_at1Idx],\n+ pos[3 * d_at3Idx + 1] - pos[3 * d_at1Idx + 1],\n+ pos[3 * d_at3Idx + 2] - pos[3 * d_at1Idx + 2]);\n+ RDGeom::Point3D r42(pos[3 * d_at4Idx] - pos[3 * d_at2Idx],\n+ pos[3 * d_at4Idx + 1] - pos[3 * d_at2Idx + 1],\n+ pos[3 * d_at4Idx + 2] - pos[3 * d_at2Idx + 2]);\n+ double prefactor = dE_dPhi / d23;\n+ RDGeom::Point3D tt[2] = {r[0].crossProduct(r[1]), r[2].crossProduct(r[3])};\n+ RDGeom::Point3D dedt[2] = {\n+ tt[0].crossProduct(r[2]) / tt[0].lengthSq() * prefactor,\n+ tt[1].crossProduct(r[1]) / tt[1].lengthSq() * prefactor};\n+ RDGeom::Point3D dedp[4] = {\n+ r[2].crossProduct(dedt[0]),\n+ r31.crossProduct(dedt[0]) - r[3].crossProduct(dedt[1]),\n+ r[0].crossProduct(dedt[0]) + r42.crossProduct(dedt[1]),\n+ r[2].crossProduct(dedt[1])};\n+ for (unsigned int i = 0; i < 4; ++i) {\n+ g[i][0] += dedp[i].x;\n+ g[i][1] += dedp[i].y;\n+ g[i][2] += dedp[i].z;\n+ }\n }\n+} // namespace UFF\n+} // namespace ForceFields\ndiff --git a/Code/ForceField/UFF/TorsionConstraint.h b/Code/ForceField/UFF/TorsionConstraint.h\nindex 362c5324835..84108b61087 100644\n--- a/Code/ForceField/UFF/TorsionConstraint.h\n+++ b/Code/ForceField/UFF/TorsionConstraint.h\n@@ -22,8 +22,7 @@ namespace UFF {\n class RDKIT_FORCEFIELD_EXPORT TorsionConstraintContrib\n : public ForceFieldContrib {\n public:\n- TorsionConstraintContrib()\n- {};\n+ TorsionConstraintContrib(){};\n //! Constructor\n /*!\n \\param owner pointer to the owning ForceField\n@@ -55,9 +54,10 @@ class RDKIT_FORCEFIELD_EXPORT TorsionConstraintContrib\n };\n \n private:\n- void setParameters(ForceField *owner, unsigned int idx1,\n- unsigned int idx2, unsigned int idx3, unsigned int idx4,\n- double minDihedralDeg, double maxDihedralDeg, double forceConst);\n+ void setParameters(ForceField *owner, unsigned int idx1, unsigned int idx2,\n+ unsigned int idx3, unsigned int idx4,\n+ double minDihedralDeg, double maxDihedralDeg,\n+ double forceConst);\n double computeDihedralTerm(double dihedral) const;\n int d_at1Idx{-1}, d_at2Idx{-1}, d_at3Idx{-1},\n d_at4Idx{-1}; //!< indices of atoms forming the dihedral angle\ndiff --git a/ReleaseNotes.md b/ReleaseNotes.md\nindex 4e66dd72e87..ba2e94eccd6 100644\n--- a/ReleaseNotes.md\n+++ b/ReleaseNotes.md\n@@ -34,6 +34,11 @@\n is not canonical, using this argument currently causes the results to depend\n on the input atom numbering. Note that this can lead to an exception being\n thrown. (#3942)\n+- Gradients for angle and torsional restraints in both UFF and MMFF were computed\n+ incorrectly, which could give rise to potential instability during minimization.\n+ As part of fixing this problem, force constants have been switched to using\n+ kcal/degree^2 units instead of kcal/rad^2 units, consistently with the fact that\n+ angle and dihedral restraints are specified in degrees. (#3975)\n \n ## Highlights\n - MolDraw2D now does a much better job of handling query features like common\n"}, "test": {"test_patch": "diff --git a/Code/ForceField/MMFF/testMMFFForceField.cpp b/Code/ForceField/MMFF/testMMFFForceField.cpp\nindex 632f20e8716..cd0f0053a9c 100644\n--- a/Code/ForceField/MMFF/testMMFFForceField.cpp\n+++ b/Code/ForceField/MMFF/testMMFFForceField.cpp\n@@ -402,7 +402,9 @@ int mmffValidationSuite(int argc, char *argv[]) {\n }\n delete mmffMolProperties;\n }\n- for (auto m : molVec) { delete m; }\n+ for (auto m : molVec) {\n+ delete m;\n+ }\n sdfWriter->close();\n delete sdfWriter;\n rdkFStream.close();\n@@ -1292,8 +1294,12 @@ int mmffValidationSuite(int argc, char *argv[]) {\n errorMsg += diff.str();\n }\n }\n- for (auto &ti : rdkTorsionInstanceVec) { delete ti; }\n- for (auto &ti : refTorsionInstanceVec) { delete ti; }\n+ for (auto &ti : rdkTorsionInstanceVec) {\n+ delete ti;\n+ }\n+ for (auto &ti : refTorsionInstanceVec) {\n+ delete ti;\n+ }\n error = (fabs(rdkEnergy - refEnergy) > ENERGY_TOLERANCE);\n if (error && checkEnergy) {\n failed = true;\n@@ -1504,7 +1510,7 @@ void testMMFFAllConstraints() {\n TEST_ASSERT(field);\n field->initialize();\n ac = new ForceFields::MMFF::AngleConstraintContrib(field, 1, 3, 6, 90.0, 90.0,\n- 1.0e5);\n+ 100.0);\n field->contribs().push_back(ForceFields::ContribPtr(ac));\n field->minimize();\n TEST_ASSERT(RDKit::feq(\n@@ -1517,7 +1523,7 @@ void testMMFFAllConstraints() {\n field = RDKit::MMFF::constructForceField(*mol, mmffMolProperties);\n field->initialize();\n ac = new ForceFields::MMFF::AngleConstraintContrib(field, 1, 3, 6, true,\n- -10.0, 10.0, 1.0e5);\n+ -10.0, 10.0, 100.0);\n field->contribs().push_back(ForceFields::ContribPtr(ac));\n field->minimize();\n TEST_ASSERT(RDKit::feq(\n@@ -1531,7 +1537,7 @@ void testMMFFAllConstraints() {\n field = RDKit::MMFF::constructForceField(*mol, mmffMolProperties);\n field->initialize();\n ac = new ForceFields::MMFF::AngleConstraintContrib(field, 1, 3, 6, false,\n- -10.0, 10.0, 1.0e5);\n+ -10.0, 10.0, 100.0);\n field->contribs().push_back(ForceFields::ContribPtr(ac));\n field->minimize();\n TEST_ASSERT(RDKit::feq(\n@@ -1552,12 +1558,14 @@ void testMMFFAllConstraints() {\n TEST_ASSERT(field);\n field->initialize();\n tc = new ForceFields::MMFF::TorsionConstraintContrib(field, 1, 3, 6, 8, 10.0,\n- 20.0, 1.0e5);\n+ 10.0, 100.0);\n field->contribs().push_back(ForceFields::ContribPtr(tc));\n field->minimize();\n+ std::cerr << MolTransforms::getDihedralDeg(mol->getConformer(), 1, 3, 6, 8)\n+ << std::endl;\n TEST_ASSERT(\n RDKit::feq(MolTransforms::getDihedralDeg(mol->getConformer(), 1, 3, 6, 8),\n- 20.0, 0.5));\n+ 10.0, 0.5));\n delete field;\n delete mmffMolProperties;\n MolTransforms::setDihedralDeg(mol->getConformer(), 1, 3, 6, 8, -30.0);\n@@ -1567,12 +1575,12 @@ void testMMFFAllConstraints() {\n field = RDKit::MMFF::constructForceField(*mol, mmffMolProperties);\n field->initialize();\n tc = new ForceFields::MMFF::TorsionConstraintContrib(field, 1, 3, 6, 8, true,\n- -10.0, 8.0, 1.0e5);\n+ -1.0, 1.0, 100.0);\n field->contribs().push_back(ForceFields::ContribPtr(tc));\n field->minimize();\n TEST_ASSERT(\n RDKit::feq(MolTransforms::getDihedralDeg(mol->getConformer(), 1, 3, 6, 8),\n- -40.0, 0.5));\n+ -30.0, 1.5));\n delete field;\n delete mmffMolProperties;\n MolTransforms::setDihedralDeg(mol->getConformer(), 1, 3, 6, 8, -10.0);\n@@ -1582,12 +1590,12 @@ void testMMFFAllConstraints() {\n field = RDKit::MMFF::constructForceField(*mol, mmffMolProperties);\n field->initialize();\n tc = new ForceFields::MMFF::TorsionConstraintContrib(field, 1, 3, 6, 8, false,\n- -10.0, 8.0, 1.0e5);\n+ -10.0, -8.0, 100.0);\n field->contribs().push_back(ForceFields::ContribPtr(tc));\n field->minimize(500);\n TEST_ASSERT(\n RDKit::feq(MolTransforms::getDihedralDeg(mol->getConformer(), 1, 3, 6, 8),\n- -10.0, 0.5));\n+ -9.0, 2.0));\n delete field;\n delete mmffMolProperties;\n delete mol;\n@@ -1631,7 +1639,8 @@ void testMMFFAllConstraints() {\n \n void testMMFFTorsionConstraints() {\n std::cerr << \"-------------------------------------\" << std::endl;\n- std::cerr << \"Unit test for MMFF TorsionConstraint close to 0 degrees.\" << std::endl;\n+ std::cerr << \"Unit test for MMFF TorsionConstraint close to 0 degrees.\"\n+ << std::endl;\n \n std::string molBlock = R\"(\n RDKit 3D\n@@ -1666,11 +1675,12 @@ M END\n mol = RDKit::MolBlockToMol(molBlock, true, false);\n TEST_ASSERT(mol);\n std::vector<double> e;\n- for (double d: {0.0001, 0.0}) {\n+ for (double d : {0.0001, 0.0}) {\n MolTransforms::setDihedralDeg(mol->getConformer(), 0, 3, 6, 9, d);\n MMFF::MMFFMolProperties mmffMolProperties(*mol);\n TEST_ASSERT(mmffMolProperties.isValid());\n- ForceFields::ForceField *field = RDKit::MMFF::constructForceField(*mol, &mmffMolProperties);\n+ ForceFields::ForceField *field =\n+ RDKit::MMFF::constructForceField(*mol, &mmffMolProperties);\n TEST_ASSERT(field);\n field->initialize();\n auto *tc = new ForceFields::MMFF::TorsionConstraintContrib(field, 0, 3, 6,\n@@ -1678,9 +1688,9 @@ M END\n field->contribs().push_back(ForceFields::ContribPtr(tc));\n field->minimize();\n e.push_back(field->calcEnergy());\n- TEST_ASSERT(\n- RDKit::feq(MolTransforms::getDihedralDeg(mol->getConformer(), 0, 3, 6, 9),\n- d, 0.5));\n+ TEST_ASSERT(RDKit::feq(\n+ MolTransforms::getDihedralDeg(mol->getConformer(), 0, 3, 6, 9), d,\n+ 0.5));\n delete field;\n }\n TEST_ASSERT(RDKit::feq(e[0], e[1], 0.5));\n@@ -1784,11 +1794,123 @@ void testMMFFCopy() {\n std::cerr << \" done\" << std::endl;\n }\n \n+void testMMFFButaneScan() {\n+ std::cerr << \"-------------------------------------\" << std::endl;\n+ std::cerr << \"Unit test for MMFF butane scan.\" << std::endl;\n+\n+ auto molblock = R\"(\n+ RDKit 3D\n+\n+ 14 13 0 0 0 0 0 0 0 0999 V2000\n+ -1.5575 0.5684 -0.1320 C 0 0 0 0 0 0 0 0 0 0 0 0\n+ -0.6987 -0.6064 0.3102 C 0 0 0 0 0 0 0 0 0 0 0 0\n+ 0.6987 -0.6064 -0.3102 C 0 0 0 0 0 0 0 0 0 0 0 0\n+ 1.5575 0.5684 0.1320 C 0 0 0 0 0 0 0 0 0 0 0 0\n+ -1.6308 0.6129 -1.2232 H 0 0 0 0 0 0 0 0 0 0 0 0\n+ -2.5700 0.4662 0.2715 H 0 0 0 0 0 0 0 0 0 0 0 0\n+ -1.1524 1.5190 0.2272 H 0 0 0 0 0 0 0 0 0 0 0 0\n+ -1.2059 -1.5359 0.0253 H 0 0 0 0 0 0 0 0 0 0 0 0\n+ -0.6215 -0.6099 1.4037 H 0 0 0 0 0 0 0 0 0 0 0 0\n+ 0.6215 -0.6099 -1.4037 H 0 0 0 0 0 0 0 0 0 0 0 0\n+ 1.2059 -1.5359 -0.0253 H 0 0 0 0 0 0 0 0 0 0 0 0\n+ 1.6308 0.6129 1.2232 H 0 0 0 0 0 0 0 0 0 0 0 0\n+ 1.1524 1.5190 -0.2271 H 0 0 0 0 0 0 0 0 0 0 0 0\n+ 2.5700 0.4662 -0.2715 H 0 0 0 0 0 0 0 0 0 0 0 0\n+ 1 2 1 0\n+ 2 3 1 0\n+ 3 4 1 0\n+ 1 5 1 0\n+ 1 6 1 0\n+ 1 7 1 0\n+ 2 8 1 0\n+ 2 9 1 0\n+ 3 10 1 0\n+ 3 11 1 0\n+ 4 12 1 0\n+ 4 13 1 0\n+ 4 14 1 0\n+M END\n+)\";\n+\n+ // torsion constraints\n+ std::unique_ptr<ROMol> mol(MolBlockToMol(molblock, true, false));\n+ TEST_ASSERT(mol);\n+ std::vector<std::pair<double, double>> diheEnergyVect;\n+ std::vector<std::pair<double, double>> expectedDiheEnergyVect{\n+ {-179.999, -5.07597}, {-175.1, -5.01299}, {-170.1, -4.82267},\n+ {-165.1, -4.51646}, {-160.1, -4.11308}, {-155.101, -3.63773},\n+ {-150.101, -3.12109}, {-145.101, -2.59801}, {-140.1, -2.10575},\n+ {-135.1, -1.68158}, {-130.1, -1.35952}, {-125.1, -1.16635},\n+ {-119.9, -1.11879}, {-114.9, -1.22194}, {-109.9, -1.45802},\n+ {-104.9, -1.80199}, {-99.8996, -2.22002}, {-94.8995, -2.67302},\n+ {-89.8996, -3.12055}, {-84.8996, -3.5255}, {-79.8997, -3.85916},\n+ {-74.8998, -4.10358}, {-69.8999, -4.24974}, {-65.1, -4.29368},\n+ {-60.1001, -4.23737}, {-55.1002, -4.0775}, {-50.1003, -3.81811},\n+ {-45.1004, -3.46765}, {-40.1005, -3.0395}, {-35.1005, -2.55211},\n+ {-30.1005, -2.02873}, {-25.1005, -1.49709}, {-20.1005, -0.988743},\n+ {-15.1004, -0.538157}, {-10.1003, -0.180672}, {-5.10016, 0.051218},\n+ {-0.100003, 0.13365}, {5.10016, 0.051218}, {10.1003, -0.180672},\n+ {15.1004, -0.538157}, {20.1005, -0.988743}, {25.1005, -1.49709},\n+ {30.1005, -2.02873}, {35.1005, -2.55211}, {40.1005, -3.0395},\n+ {45.1004, -3.46765}, {50.1003, -3.81811}, {55.1002, -4.0775},\n+ {60.1001, -4.23737}, {65.1, -4.29368}, {69.8999, -4.24974},\n+ {74.8998, -4.10358}, {79.8997, -3.85916}, {84.8996, -3.5255},\n+ {89.8996, -3.12055}, {94.8995, -2.67302}, {99.8996, -2.22002},\n+ {104.9, -1.80199}, {109.9, -1.45802}, {114.9, -1.22194},\n+ {119.9, -1.11879}, {125.1, -1.16635}, {130.1, -1.35952},\n+ {135.1, -1.68158}, {140.1, -2.10575}, {145.101, -2.59801},\n+ {150.101, -3.12109}, {155.101, -3.63773}, {160.1, -4.11308},\n+ {165.1, -4.51646}, {170.1, -4.82267}, {175.1, -5.01299}};\n+ MMFF::MMFFMolProperties mmffMolProperties(*mol);\n+ TEST_ASSERT(mmffMolProperties.isValid());\n+ std::unique_ptr<ForceFields::ForceField> globalFF(\n+ RDKit::MMFF::constructForceField(*mol, &mmffMolProperties));\n+ TEST_ASSERT(globalFF);\n+ globalFF->initialize();\n+ std::unique_ptr<ROMol> mol2(new ROMol(*mol));\n+ const int start = -180;\n+ const int end = 180;\n+ const int incr = 5;\n+ MolTransforms::setDihedralDeg(mol2->getConformer(), 0, 1, 2, 3, start);\n+ for (int diheIn = start; diheIn < end; diheIn += incr) {\n+ std::unique_ptr<ForceFields::ForceField> localFF(\n+ RDKit::MMFF::constructForceField(*mol2, &mmffMolProperties));\n+ TEST_ASSERT(localFF);\n+ localFF->initialize();\n+ auto *tc = new ForceFields::MMFF::TorsionConstraintContrib(\n+ localFF.get(), 0, 1, 2, 3, static_cast<double>(diheIn) - 0.1,\n+ static_cast<double>(diheIn) + 0.1, 100.0);\n+ localFF->contribs().push_back(ForceFields::ContribPtr(tc));\n+ TEST_ASSERT(localFF->minimize(10000) == 0);\n+ std::vector<double> pos(3 * localFF->numPoints());\n+ TEST_ASSERT(localFF->numPoints() == globalFF->numPoints());\n+ auto posns = localFF->positions();\n+ for (unsigned int i = 0; i < localFF->numPoints(); ++i) {\n+ for (unsigned int j = 0; j < 3; ++j) {\n+ pos[i * 3 + j] = (*static_cast<RDGeom::Point3D *>(posns.at(i)))[j];\n+ }\n+ }\n+ auto diheOut =\n+ MolTransforms::getDihedralDeg(mol2->getConformer(), 0, 1, 2, 3);\n+ auto energy = globalFF->calcEnergy(pos.data());\n+ diheEnergyVect.emplace_back(diheOut, energy);\n+ }\n+ for (size_t i = 0; i < diheEnergyVect.size(); ++i) {\n+ TEST_ASSERT(RDKit::feq(diheEnergyVect.at(i).first,\n+ expectedDiheEnergyVect.at(i).first, 1.0));\n+ TEST_ASSERT(RDKit::feq(diheEnergyVect.at(i).second,\n+ expectedDiheEnergyVect.at(i).second, 0.2));\n+ }\n+\n+ std::cerr << \" done\" << std::endl;\n+}\n+\n int main(int argc, char *argv[]) {\n if (!mmffValidationSuite(argc, argv)) {\n testMMFFAllConstraints();\n testMMFFTorsionConstraints();\n testMMFFCopy();\n+ testMMFFButaneScan();\n }\n \n return 0;\ndiff --git a/Code/ForceField/UFF/testUFFForceField.cpp b/Code/ForceField/UFF/testUFFForceField.cpp\nindex d2c5d2aaf81..1692589dbfc 100644\n--- a/Code/ForceField/UFF/testUFFForceField.cpp\n+++ b/Code/ForceField/UFF/testUFFForceField.cpp\n@@ -27,12 +27,12 @@\n #include <ForceField/UFF/TorsionConstraint.h>\n #include <ForceField/UFF/PositionConstraint.h>\n \n-#include <GraphMol/Atom.h>\n+#include <GraphMol/RDKitBase.h>\n #include <GraphMol/FileParsers/FileParsers.h>\n #include <GraphMol/ForceFieldHelpers/UFF/Builder.h>\n #include <GraphMol/MolTransforms/MolTransforms.h>\n \n-using namespace RDGeom;\n+using namespace RDKit;\n \n void test1() {\n std::cerr << \"-------------------------------------\" << std::endl;\n@@ -41,7 +41,7 @@ void test1() {\n ForceFields::ForceField ff;\n TEST_ASSERT(ff.dimension() == 3);\n \n- Point3D p1(0, 0, 0), p2(1, 0, 0), p3(2, 0, 0), p4(0, 1, 0);\n+ RDGeom::Point3D p1(0, 0, 0), p2(1, 0, 0), p3(2, 0, 0), p4(0, 1, 0);\n RDGeom::PointPtrVect &ps = ff.positions();\n ps.push_back(&p1);\n ps.push_back(&p2);\n@@ -49,7 +49,7 @@ void test1() {\n ps.push_back(&p4);\n \n #if 0\n- Point3D f1,f2,f3,f4;\n+ RDGeom::Point3D f1,f2,f3,f4;\n RDGeom::PointPtrVect &fs=ff.forces();\n fs.push_back(&f1);\n fs.push_back(&f2);\n@@ -146,7 +146,7 @@ void testUFF2() {\n std::cerr << \"Unit tests for UFF bond-stretch terms.\" << std::endl;\n \n ForceFields::ForceField ff;\n- Point3D p1(0, 0, 0), p2(1.514, 0, 0);\n+ RDGeom::Point3D p1(0, 0, 0), p2(1.514, 0, 0);\n RDGeom::PointPtrVect &ps = ff.positions();\n ps.push_back(&p1);\n ps.push_back(&p2);\n@@ -301,7 +301,7 @@ void testUFF4() {\n std::cerr << \"Unit tests for UFF angle-bend terms.\" << std::endl;\n \n ForceFields::ForceField ff;\n- Point3D p1(1.514, 0, 0), p2(0, 0, 0), p3(0.1, 1.5, 0);\n+ RDGeom::Point3D p1(1.514, 0, 0), p2(0, 0, 0), p3(0.1, 1.5, 0);\n RDGeom::PointPtrVect &ps = ff.positions();\n ps.push_back(&p1);\n ps.push_back(&p2);\n@@ -528,7 +528,7 @@ void testUFF5() {\n std::cerr << \" Test Simple UFF molecule optimizations.\" << std::endl;\n \n ForceFields::ForceField ff;\n- Point3D p1, p2, p3, p4, p5, p6;\n+ RDGeom::Point3D p1, p2, p3, p4, p5, p6;\n RDGeom::PointPtrVect &ps = ff.positions();\n ps.push_back(&p1);\n ps.push_back(&p2);\n@@ -653,7 +653,7 @@ void testUFF6() {\n std::cerr << \"Unit tests for UFF nonbonded terms.\" << std::endl;\n \n ForceFields::ForceField ff;\n- Point3D p1(0, 0, 0), p2(0.0, 0, 0);\n+ RDGeom::Point3D p1(0, 0, 0), p2(0.0, 0, 0);\n RDGeom::PointPtrVect &ps = ff.positions();\n ps.push_back(&p1);\n ps.push_back(&p2);\n@@ -708,7 +708,7 @@ void testUFF7() {\n std::cerr << \" Test UFF torsional terms.\" << std::endl;\n \n ForceFields::ForceField ff;\n- Point3D p1, p2, p3, p4;\n+ RDGeom::Point3D p1, p2, p3, p4;\n RDGeom::PointPtrVect &ps = ff.positions();\n ps.push_back(&p1);\n ps.push_back(&p2);\n@@ -966,7 +966,7 @@ void testUFF8() {\n std::cerr << \" Test Simple UFF molecule optimization, part 2.\" << std::endl;\n \n ForceFields::ForceField ff;\n- Point3D p1, p2, p3, p4, p5, p6;\n+ RDGeom::Point3D p1, p2, p3, p4, p5, p6;\n RDGeom::PointPtrVect &ps = ff.positions();\n ps.push_back(&p1);\n ps.push_back(&p2);\n@@ -1106,7 +1106,7 @@ void testUFFTorsionConflict() {\n std::cerr << \" Test UFF Torsion Conflicts.\" << std::endl;\n \n ForceFields::ForceField ff;\n- Point3D p1, p2, p3, p4, p5, p6, p7;\n+ RDGeom::Point3D p1, p2, p3, p4, p5, p6, p7;\n RDGeom::PointPtrVect &ps = ff.positions();\n ps.push_back(&p1);\n ps.push_back(&p2);\n@@ -1255,7 +1255,7 @@ void testUFFDistanceConstraints() {\n std::cerr << \"Unit tests for UFF distance constraint terms.\" << std::endl;\n \n ForceFields::ForceField ff;\n- Point3D p1(0, 0, 0), p2(1.514, 0, 0);\n+ RDGeom::Point3D p1(0, 0, 0), p2(1.514, 0, 0);\n RDGeom::PointPtrVect &ps = ff.positions();\n ps.push_back(&p1);\n ps.push_back(&p2);\n@@ -1403,7 +1403,7 @@ void testUFFAllConstraints() {\n TEST_ASSERT(field);\n field->initialize();\n ac = new ForceFields::UFF::AngleConstraintContrib(field, 1, 3, 6, 90.0, 90.0,\n- 1.0e5);\n+ 100.0);\n field->contribs().push_back(ForceFields::ContribPtr(ac));\n field->minimize();\n TEST_ASSERT(RDKit::feq(\n@@ -1412,7 +1412,7 @@ void testUFFAllConstraints() {\n field = RDKit::UFF::constructForceField(*mol);\n field->initialize();\n ac = new ForceFields::UFF::AngleConstraintContrib(field, 1, 3, 6, true, -10.0,\n- 10.0, 1.0e5);\n+ 10.0, 100.0);\n field->contribs().push_back(ForceFields::ContribPtr(ac));\n field->minimize();\n TEST_ASSERT(RDKit::feq(\n@@ -1422,7 +1422,7 @@ void testUFFAllConstraints() {\n field = RDKit::UFF::constructForceField(*mol);\n field->initialize();\n ac = new ForceFields::UFF::AngleConstraintContrib(field, 1, 3, 6, false,\n- -10.0, 10.0, 1.0e5);\n+ -10.0, 10.0, 100.0);\n field->contribs().push_back(ForceFields::ContribPtr(ac));\n field->minimize();\n TEST_ASSERT(RDKit::feq(\n@@ -1439,34 +1439,34 @@ void testUFFAllConstraints() {\n TEST_ASSERT(field);\n field->initialize();\n tc = new ForceFields::UFF::TorsionConstraintContrib(field, 1, 3, 6, 8, 10.0,\n- 20.0, 1.0e5);\n+ 10.0, 100.0);\n field->contribs().push_back(ForceFields::ContribPtr(tc));\n field->minimize();\n TEST_ASSERT(\n RDKit::feq(MolTransforms::getDihedralDeg(mol->getConformer(), 1, 3, 6, 8),\n- 20.0, 0.5));\n+ 10.0, 0.5));\n delete field;\n MolTransforms::setDihedralDeg(mol->getConformer(), 1, 3, 6, 8, -30.0);\n field = RDKit::UFF::constructForceField(*mol);\n field->initialize();\n tc = new ForceFields::UFF::TorsionConstraintContrib(field, 1, 3, 6, 8, true,\n- -10.0, 8.0, 1.0e5);\n+ -1.0, 1.0, 100.0);\n field->contribs().push_back(ForceFields::ContribPtr(tc));\n field->minimize();\n TEST_ASSERT(\n RDKit::feq(MolTransforms::getDihedralDeg(mol->getConformer(), 1, 3, 6, 8),\n- -40.0, 0.5));\n+ -30.0, 1.5));\n delete field;\n MolTransforms::setDihedralDeg(mol->getConformer(), 1, 3, 6, 8, -10.0);\n field = RDKit::UFF::constructForceField(*mol);\n field->initialize();\n tc = new ForceFields::UFF::TorsionConstraintContrib(field, 1, 3, 6, 8, false,\n- -10.0, 8.0, 1.0e6);\n+ -10.0, 8.0, 100.0);\n field->contribs().push_back(ForceFields::ContribPtr(tc));\n field->minimize(500);\n TEST_ASSERT(\n RDKit::feq(MolTransforms::getDihedralDeg(mol->getConformer(), 1, 3, 6, 8),\n- -10.0, 0.5));\n+ -9.0, 2.0));\n delete field;\n delete mol;\n \n@@ -1591,6 +1591,115 @@ void testUFFCopy() {\n std::cerr << \" done\" << std::endl;\n }\n \n+void testUFFButaneScan() {\n+ std::cerr << \"-------------------------------------\" << std::endl;\n+ std::cerr << \"Unit test for UFF butane scan.\" << std::endl;\n+\n+ auto molblock = R\"(\n+ RDKit 3D\n+\n+ 14 13 0 0 0 0 0 0 0 0999 V2000\n+ -1.5575 0.5684 -0.1320 C 0 0 0 0 0 0 0 0 0 0 0 0\n+ -0.6987 -0.6064 0.3102 C 0 0 0 0 0 0 0 0 0 0 0 0\n+ 0.6987 -0.6064 -0.3102 C 0 0 0 0 0 0 0 0 0 0 0 0\n+ 1.5575 0.5684 0.1320 C 0 0 0 0 0 0 0 0 0 0 0 0\n+ -1.6308 0.6129 -1.2232 H 0 0 0 0 0 0 0 0 0 0 0 0\n+ -2.5700 0.4662 0.2715 H 0 0 0 0 0 0 0 0 0 0 0 0\n+ -1.1524 1.5190 0.2272 H 0 0 0 0 0 0 0 0 0 0 0 0\n+ -1.2059 -1.5359 0.0253 H 0 0 0 0 0 0 0 0 0 0 0 0\n+ -0.6215 -0.6099 1.4037 H 0 0 0 0 0 0 0 0 0 0 0 0\n+ 0.6215 -0.6099 -1.4037 H 0 0 0 0 0 0 0 0 0 0 0 0\n+ 1.2059 -1.5359 -0.0253 H 0 0 0 0 0 0 0 0 0 0 0 0\n+ 1.6308 0.6129 1.2232 H 0 0 0 0 0 0 0 0 0 0 0 0\n+ 1.1524 1.5190 -0.2271 H 0 0 0 0 0 0 0 0 0 0 0 0\n+ 2.5700 0.4662 -0.2715 H 0 0 0 0 0 0 0 0 0 0 0 0\n+ 1 2 1 0\n+ 2 3 1 0\n+ 3 4 1 0\n+ 1 5 1 0\n+ 1 6 1 0\n+ 1 7 1 0\n+ 2 8 1 0\n+ 2 9 1 0\n+ 3 10 1 0\n+ 3 11 1 0\n+ 4 12 1 0\n+ 4 13 1 0\n+ 4 14 1 0\n+M END\n+)\";\n+\n+ // torsion constraints\n+ std::unique_ptr<ROMol> mol(MolBlockToMol(molblock, true, false));\n+ TEST_ASSERT(mol);\n+ std::vector<std::pair<double, double>> diheEnergyVect;\n+ std::vector<std::pair<double, double>> expectedDiheEnergyVect{\n+ {179.9997, 1.7649}, {-175.1001, 1.8314}, {-170.1003, 2.0318},\n+ {-165.1004, 2.3527}, {-160.1005, 2.7726}, {-155.1005, 3.2633},\n+ {-150.1005, 3.7919}, {-145.1005, 4.3220}, {-140.1005, 4.8159},\n+ {-135.1004, 5.2372}, {-130.1003, 5.5532}, {-125.1001, 5.7385},\n+ {-119.9000, 5.7768}, {-114.8998, 5.6630}, {-109.8997, 5.4141},\n+ {-104.8996, 5.0555}, {-99.8995, 4.6243}, {-94.8995, 4.1667},\n+ {-89.8996, 3.7338}, {-84.8997, 3.3722}, {-79.8998, 3.1102},\n+ {-74.8999, 2.9561}, {-70.1000, 2.9112}, {-65.1001, 2.9777},\n+ {-60.1003, 3.1680}, {-55.1004, 3.4865}, {-50.1005, 3.9304},\n+ {-45.1006, 4.4873}, {-40.1007, 5.1363}, {-35.1007, 5.8490},\n+ {-30.1007, 6.5913}, {-25.1007, 7.3249}, {-20.1006, 8.0089},\n+ {-15.1005, 8.6016}, {-10.1004, 9.0626}, {-5.1002, 9.3573},\n+ {-0.1000, 9.4612}, {5.1002, 9.3573}, {10.1004, 9.0626},\n+ {15.1005, 8.6016}, {20.1006, 8.0089}, {25.1007, 7.3249},\n+ {30.1007, 6.5913}, {35.1007, 5.8490}, {40.1007, 5.1363},\n+ {45.1006, 4.4873}, {50.1005, 3.9304}, {55.1004, 3.4865},\n+ {60.1003, 3.1680}, {65.1001, 2.9777}, {70.1000, 2.9112},\n+ {74.8999, 2.9561}, {79.8998, 3.1102}, {84.8997, 3.3722},\n+ {89.8996, 3.7338}, {94.8995, 4.1667}, {99.8995, 4.6243},\n+ {104.8996, 5.0555}, {109.8997, 5.4141}, {114.8998, 5.6630},\n+ {119.9000, 5.7768}, {125.1001, 5.7385}, {130.1003, 5.5532},\n+ {135.1004, 5.2372}, {140.1005, 4.8159}, {145.1005, 4.3220},\n+ {150.1005, 3.7919}, {155.1005, 3.2633}, {160.1005, 2.7726},\n+ {165.1004, 2.3527}, {170.1003, 2.0318}, {175.1001, 1.8314}};\n+ std::unique_ptr<ForceFields::ForceField> globalFF(\n+ RDKit::UFF::constructForceField(*mol));\n+ TEST_ASSERT(globalFF);\n+ globalFF->initialize();\n+ std::unique_ptr<ROMol> mol2(new ROMol(*mol));\n+ const int start = -180;\n+ const int end = 180;\n+ const int incr = 5;\n+ MolTransforms::setDihedralDeg(mol2->getConformer(), 0, 1, 2, 3, start);\n+ for (int diheIn = start; diheIn < end; diheIn += incr) {\n+ std::unique_ptr<ForceFields::ForceField> localFF(\n+ RDKit::UFF::constructForceField(*mol2));\n+ TEST_ASSERT(localFF);\n+ localFF->initialize();\n+ auto *tc = new ForceFields::UFF::TorsionConstraintContrib(\n+ localFF.get(), 0, 1, 2, 3, static_cast<double>(diheIn) - 0.1,\n+ static_cast<double>(diheIn) + 0.1, 100.0);\n+ localFF->contribs().push_back(ForceFields::ContribPtr(tc));\n+ TEST_ASSERT(localFF->minimize(10000) == 0);\n+ std::vector<double> pos(3 * localFF->numPoints());\n+ TEST_ASSERT(localFF->numPoints() == globalFF->numPoints());\n+ auto posns = localFF->positions();\n+ for (unsigned int i = 0; i < localFF->numPoints(); ++i) {\n+ for (unsigned int j = 0; j < 3; ++j) {\n+ pos[i * 3 + j] = (*static_cast<RDGeom::Point3D *>(posns.at(i)))[j];\n+ }\n+ }\n+ auto diheOut =\n+ MolTransforms::getDihedralDeg(mol2->getConformer(), 0, 1, 2, 3);\n+ auto energy = globalFF->calcEnergy(pos.data());\n+ diheEnergyVect.emplace_back(diheOut, energy);\n+ }\n+ for (size_t i = 0; i < diheEnergyVect.size(); ++i) {\n+ TEST_ASSERT(RDKit::feq(diheEnergyVect.at(i).first,\n+ expectedDiheEnergyVect.at(i).first, 1.0));\n+ TEST_ASSERT(RDKit::feq(diheEnergyVect.at(i).second,\n+ expectedDiheEnergyVect.at(i).second, 0.2));\n+ }\n+\n+ std::cerr << \" done\" << std::endl;\n+}\n+\n int main() {\n #if 1\n test1();\n@@ -1609,4 +1718,5 @@ int main() {\n testUFFDistanceConstraints();\n testUFFAllConstraints();\n testUFFCopy();\n+ testUFFButaneScan();\n }\ndiff --git a/Code/ForceField/Wrap/testConstraints.py b/Code/ForceField/Wrap/testConstraints.py\nindex bffa02ba996..cefd7210c7b 100755\n--- a/Code/ForceField/Wrap/testConstraints.py\n+++ b/Code/ForceField/Wrap/testConstraints.py\n@@ -143,7 +143,7 @@ def testUFFAngleConstraints(self):\n m = Chem.MolFromMolBlock(self.molB, True, False)\n ff = ChemicalForceFields.UFFGetMoleculeForceField(m)\n self.assertTrue(ff)\n- ff.UFFAddAngleConstraint(1, 3, 6, False, 90.0, 90.0, 1.0e5)\n+ ff.UFFAddAngleConstraint(1, 3, 6, False, 90.0, 90.0, 100.0)\n r = ff.Minimize()\n self.assertTrue(r == 0)\n conf = m.GetConformer()\n@@ -151,7 +151,7 @@ def testUFFAngleConstraints(self):\n self.assertTrue(int(angle) == 90)\n ff = ChemicalForceFields.UFFGetMoleculeForceField(m)\n self.assertTrue(ff)\n- ff.UFFAddAngleConstraint(1, 3, 6, True, -10.0, 10.0, 1.0e5)\n+ ff.UFFAddAngleConstraint(1, 3, 6, True, -10.0, 10.0, 100.0)\n r = ff.Minimize()\n self.assertTrue(r == 0)\n conf = m.GetConformer()\n@@ -159,7 +159,7 @@ def testUFFAngleConstraints(self):\n self.assertTrue(int(angle) == 100)\n ff = ChemicalForceFields.UFFGetMoleculeForceField(m)\n self.assertTrue(ff)\n- ff.UFFAddAngleConstraint(1, 3, 6, False, -10.0, 10.0, 1.0e5)\n+ ff.UFFAddAngleConstraint(1, 3, 6, False, -10.0, 10.0, 100.0)\n r = ff.Minimize()\n self.assertTrue(r == 0)\n conf = m.GetConformer()\n@@ -172,7 +172,7 @@ def testUFFTorsionConstraints(self):\n rdMolTransforms.SetDihedralDeg(conf, 1, 3, 6, 8, 15.0)\n ff = ChemicalForceFields.UFFGetMoleculeForceField(m)\n self.assertTrue(ff)\n- ff.UFFAddTorsionConstraint(1, 3, 6, 8, False, 10.0, 20.0, 1.0e5)\n+ ff.UFFAddTorsionConstraint(1, 3, 6, 8, False, 10.0, 20.0, 100.0)\n r = ff.Minimize()\n self.assertTrue(r == 0)\n dihedral = rdMolTransforms.GetDihedralDeg(conf, 1, 3, 6, 8)\n@@ -180,7 +180,7 @@ def testUFFTorsionConstraints(self):\n rdMolTransforms.SetDihedralDeg(conf, 1, 3, 6, 8, -30.0)\n ff = ChemicalForceFields.UFFGetMoleculeForceField(m)\n self.assertTrue(ff)\n- ff.UFFAddTorsionConstraint(1, 3, 6, 8, True, -10.0, 8.0, 1.0e5)\n+ ff.UFFAddTorsionConstraint(1, 3, 6, 8, True, -10.0, 8.0, 100.0)\n r = ff.Minimize()\n self.assertTrue(r == 0)\n conf = m.GetConformer()\n@@ -257,7 +257,7 @@ def testMMFFAngleConstraints(self):\n mp = ChemicalForceFields.MMFFGetMoleculeProperties(m)\n ff = ChemicalForceFields.MMFFGetMoleculeForceField(m, mp)\n self.assertTrue(ff)\n- ff.MMFFAddAngleConstraint(1, 3, 6, False, 90.0, 90.0, 1.0e5)\n+ ff.MMFFAddAngleConstraint(1, 3, 6, False, 90.0, 90.0, 100.0)\n r = ff.Minimize()\n self.assertTrue(r == 0)\n conf = m.GetConformer()\n@@ -265,7 +265,7 @@ def testMMFFAngleConstraints(self):\n self.assertTrue(int(angle) == 90)\n ff = ChemicalForceFields.MMFFGetMoleculeForceField(m, mp)\n self.assertTrue(ff)\n- ff.MMFFAddAngleConstraint(1, 3, 6, True, -10.0, 10.0, 1.0e5)\n+ ff.MMFFAddAngleConstraint(1, 3, 6, True, -10.0, 10.0, 100.0)\n r = ff.Minimize()\n self.assertTrue(r == 0)\n conf = m.GetConformer()\n@@ -273,7 +273,7 @@ def testMMFFAngleConstraints(self):\n self.assertTrue(int(angle) == 100)\n ff = ChemicalForceFields.MMFFGetMoleculeForceField(m, mp)\n self.assertTrue(ff)\n- ff.MMFFAddAngleConstraint(1, 3, 6, False, -10.0, 10.0, 1.0e5)\n+ ff.MMFFAddAngleConstraint(1, 3, 6, False, -10.0, 10.0, 100.0)\n r = ff.Minimize()\n self.assertTrue(r == 0)\n conf = m.GetConformer()\n@@ -287,7 +287,7 @@ def testMMFFTorsionConstraints(self):\n mp = ChemicalForceFields.MMFFGetMoleculeProperties(m)\n ff = ChemicalForceFields.MMFFGetMoleculeForceField(m, mp)\n self.assertTrue(ff)\n- ff.MMFFAddTorsionConstraint(1, 3, 6, 8, False, 10.0, 20.0, 1.0e5)\n+ ff.MMFFAddTorsionConstraint(1, 3, 6, 8, False, 10.0, 20.0, 100.0)\n r = ff.Minimize()\n self.assertTrue(r == 0)\n dihedral = rdMolTransforms.GetDihedralDeg(conf, 1, 3, 6, 8)\n@@ -295,7 +295,7 @@ def testMMFFTorsionConstraints(self):\n rdMolTransforms.SetDihedralDeg(conf, 1, 3, 6, 8, -30.0)\n ff = ChemicalForceFields.MMFFGetMoleculeForceField(m, mp)\n self.assertTrue(ff)\n- ff.MMFFAddTorsionConstraint(1, 3, 6, 8, True, -10.0, 8.0, 1.0e5)\n+ ff.MMFFAddTorsionConstraint(1, 3, 6, 8, True, -10.0, 8.0, 100.0)\n r = ff.Minimize()\n self.assertTrue(r == 0)\n conf = m.GetConformer()\n@@ -304,7 +304,7 @@ def testMMFFTorsionConstraints(self):\n rdMolTransforms.SetDihedralDeg(conf, 1, 3, 6, 8, -10.0)\n ff = ChemicalForceFields.MMFFGetMoleculeForceField(m, mp)\n self.assertTrue(ff)\n- ff.MMFFAddTorsionConstraint(1, 3, 6, 8, False, -10.0, 8.0, 1.0e5)\n+ ff.MMFFAddTorsionConstraint(1, 3, 6, 8, False, -10.0, 8.0, 100.0)\n r = ff.Minimize(1000)\n self.assertTrue(r == 0)\n conf = m.GetConformer()\n", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}201{"question_id": "MSB_rdkit_rdkit_pr4190", "question_type": "multi_swe_bench", "description": "fixes #3967 (rdkit/rdkit#4190)", "content": {"org": "rdkit", "repo": "rdkit", "pr_number": 4190, "issue_title": "fixes #3967", "issue_body": "Reference Issue\r\nfixes #3967\r\n\r\nWhat does this implement/fix? Explain your changes.\r\n\r\nSeems like the two reported smiles issues are caused by two different bugs.\r\n\r\nFor \"C=c1s/c2n(c1=O)CCCCCCC\\\\N=2\" the bug seems like it's cause by the ring closure happening on the double bond. This condition is checked on line 384 in Canon.cpp\r\n\r\nI struggled quite a bit figuring out exactly why \"C1=C\\\\C/C=C2C3=C/C/C=C\\\\C=C/C\\\\3C\\\\2\\\\C=C/1\" isn't working. It seems like it's a similar issue to the first one, but only because \"secondFromAtom1\" is not aromatic and is closing the ring. The condition for checking this is on lines 385-387 in Canon.cpp\r\n\r\nI wanted to refactor this line into an inline function since it is use many times, but I didn't want to make this PR too big.\r\natom2Dir = (atom2Dir == Bond::ENDUPRIGHT) ? Bond::ENDDOWNRIGHT\r\n : Bond::ENDUPRIGHT;\r\n\r\n", "base_commit": "a908e616b361ed1dddd86c0c5da2ce1ca02e1d50", "resolved_issues": [{"number": 3967, "title": "Double bond stereo gets flipped by SMILES reader/writer", "body": "**Describe the bug**\r\nDouble bond stereo is flipped if you roundtrip a SMILES and double bond is located at the ring closure in canonical SMILES\r\n\r\n**To Reproduce**\r\n```python\r\nprint(Chem.CanonSmiles('C=c1s/c2n(c1=O)CCCCCCC\\\\N=2'))\r\n```\r\nOutput: `C=c1s/c2n(c1=O)CCCCCCC/N=2`\r\n\r\n**Expected behavior**\r\nDouble bond stereo should be retained\r\n\r\n**Screenshots**\r\n\r\n\r\n**Configuration (please complete the following information):**\r\n - RDKit version: 2020.09.5\r\n - OS: MacOS\r\n - Python version (if relevant): 3.8\r\n - Are you using conda? Yes\r\n - If you are using conda, which channel did you install the rdkit from? conda-forge\r\n - If you are not using conda: how did you install the RDKit?\r\n"}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/rdkit_m_rdkit:pr-4190", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/.gitignore b/.gitignore\nindex c4bcb9015dc..3c1ac56259b 100644\n--- a/.gitignore\n+++ b/.gitignore\n@@ -8,6 +8,8 @@\n #- Eclipse files\n /.project\n /.pydevproject\n+/.cproject\n+/.settings/\n \n #- CLion files\n /cmake-build-*\ndiff --git a/Code/GraphMol/Canon.cpp b/Code/GraphMol/Canon.cpp\nindex 542a563e16e..6d83b20547b 100644\n--- a/Code/GraphMol/Canon.cpp\n+++ b/Code/GraphMol/Canon.cpp\n@@ -350,10 +350,25 @@ void canonicalizeDoubleBond(Bond *dblBond, UINT_VECT &bondVisitOrders,\n // If we're not looking at the bonds used to determine the\n // stereochemistry, we need to flip the setting on the other bond:\n const INT_VECT &stereoAtoms = dblBond->getStereoAtoms();\n+\n+ auto isClosingRingBond = [](Bond *bond) {\n+ if (bond == nullptr) {\n+ return false;\n+ }\n+ auto beginIdx = bond->getBeginAtomIdx();\n+ auto endIdx = bond->getEndAtomIdx();\n+ return beginIdx > endIdx && \n+ beginIdx - endIdx > 1 &&\n+ bond->hasProp(common_properties::_TraversalRingClosureBond);\n+ };\n+\n+ auto isFlipped = false;\n+\n if (atom1->getDegree() == 3 &&\n std::find(stereoAtoms.begin(), stereoAtoms.end(),\n static_cast<int>(atom1ControllingBond->getOtherAtomIdx(\n atom1->getIdx()))) == stereoAtoms.end()) {\n+ isFlipped = true;\n atom2Dir = (atom2Dir == Bond::ENDUPRIGHT) ? Bond::ENDDOWNRIGHT\n : Bond::ENDUPRIGHT;\n }\n@@ -363,6 +378,17 @@ void canonicalizeDoubleBond(Bond *dblBond, UINT_VECT &bondVisitOrders,\n std::find(stereoAtoms.begin(), stereoAtoms.end(),\n static_cast<int>(firstFromAtom2->getOtherAtomIdx(\n atom2->getIdx()))) == stereoAtoms.end()) {\n+ isFlipped = true;\n+ atom2Dir = (atom2Dir == Bond::ENDUPRIGHT) ? Bond::ENDDOWNRIGHT\n+ : Bond::ENDUPRIGHT;\n+ } \n+ \n+ if (!isFlipped && \n+ (isClosingRingBond(dblBond) ||\n+ (isClosingRingBond(secondFromAtom1) && \n+ !secondFromAtom1->getIsAromatic() && \n+ secondFromAtom1->getBondDir() != Bond::NONE))\n+ ) {\n atom2Dir = (atom2Dir == Bond::ENDUPRIGHT) ? Bond::ENDDOWNRIGHT\n : Bond::ENDUPRIGHT;\n }\n"}, "test": {"test_patch": "diff --git a/Code/GraphMol/SmilesParse/test.cpp b/Code/GraphMol/SmilesParse/test.cpp\nindex 4a69cda451c..4e272cb66b0 100644\n--- a/Code/GraphMol/SmilesParse/test.cpp\n+++ b/Code/GraphMol/SmilesParse/test.cpp\n@@ -4339,6 +4339,27 @@ void testOSSFuzzFailures() {\n BOOST_LOG(rdInfoLog) << \"done\" << std::endl;\n }\n \n+void testGithub3967() {\n+ BOOST_LOG(rdInfoLog) << \"-------------------------------------\" << std::endl;\n+ BOOST_LOG(rdInfoLog) << \"Testing Github Issue 3967: Double bond stereo gets \"\n+ \"flipped by SMILES reader/writer\"\n+ << std::endl;\n+\n+ {\n+ auto mol = \"C=c1s/c2n(c1=O)CCCCCCC\\\\N=2\"_smiles;\n+ TEST_ASSERT(mol);\n+ auto smi = MolToSmiles(*mol);\n+ TEST_ASSERT(smi == \"C=c1s/c2n(c1=O)CCCCCCC\\\\N=2\");\n+ }\n+ {\n+ auto mol = \"C1=C\\\\C/C=C2C3=C/C/C=C\\\\C=C/C\\\\3C\\\\2\\\\C=C/1\"_smiles;\n+ TEST_ASSERT(mol);\n+ auto smi = MolToSmiles(*mol);\n+ TEST_ASSERT(smi == \"C1=C\\\\C/C=C2C3=C/C/C=C\\\\C=C/C\\\\3C\\\\2\\\\C=C/1\");\n+ }\n+ BOOST_LOG(rdInfoLog) << \"\\tdone\" << std::endl;\n+}\n+\n int main(int argc, char *argv[]) {\n (void)argc;\n (void)argv;\n@@ -4417,6 +4438,7 @@ int main(int argc, char *argv[]) {\n testdoRandomSmileGeneration();\n testGithub1028();\n testGithub3139();\n+ testGithub3967();\n #endif\n testOSSFuzzFailures();\n }\n", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}202{"question_id": "MSB_rdkit_rdkit_pr4207", "question_type": "multi_swe_bench", "description": "Fixes #4114 (rdkit/rdkit#4207)", "content": {"org": "rdkit", "repo": "rdkit", "pr_number": 4207, "issue_title": "Fixes #4114", "issue_body": "This closes #4114 \r\n\r\nBesides the bond properties, also EITHERDOUBLE Bond Dir was not being copied over to reaction products.\r\n\r\nThis enables copying bond properties and EITHERDOUBLE for reactant bonds that are not specified in the product template, or are specified in the product template as \"Null Bond\".\r\n", "base_commit": "4f0521e1163cd62a19f19bd2b624ef5427a615a8", "resolved_issues": [{"number": 4114, "title": "Reactions don't propagate bond properties", "body": "I'm using a custom build of RDKit 2021.03 on Mac.\r\n\r\nIt looks like RDKit reactions don't preserve bond properties from the reactants. Is this intentional?\r\n\r\n\r\n```\r\nfrom rdkit import Chem\r\nfrom rdkit.Chem import rdChemReactions\r\n\r\nrxn = rdChemReactions.ReactionFromSmarts('[O:1]>>[N:1]')\r\n\r\nmol = Chem.MolFromSmiles('CCO')\r\n\r\nmol.GetAtomWithIdx(0).SetIntProp('demo', 1)\r\nreactant_bond = mol.GetBondBetweenAtoms(0, 1)\r\nreactant_bond.SetIntProp('demo', 1)\r\n\r\nproduct_groups = rxn.RunReactants([mol])\r\nproduct = product_groups[0][0]\r\n\r\nmapping = {int(a.GetProp('react_atom_idx')): a.GetIdx() for a in product.GetAtoms()}\r\nproduct_bond = product.GetBondBetweenAtoms(mapping[0], mapping[1])\r\nprint(product_bond.GetPropsAsDict())\r\n```\r\n\r\nThis shows no properties on the bond, and only the mapping properties on the atoms."}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/rdkit_m_rdkit:pr-4207", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/Code/GraphMol/ChemReactions/ReactionRunner.cpp b/Code/GraphMol/ChemReactions/ReactionRunner.cpp\nindex 72abd1f2a30..c7a09a8006e 100644\n--- a/Code/GraphMol/ChemReactions/ReactionRunner.cpp\n+++ b/Code/GraphMol/ChemReactions/ReactionRunner.cpp\n@@ -718,8 +718,14 @@ void setReactantBondPropertiesToProduct(RWMOL_SPTR product,\n }\n \n pBond->setBondType(rBond->getBondType());\n+ if (rBond->getBondType() == Bond::DOUBLE &&\n+ rBond->getBondDir() == Bond::EITHERDOUBLE) {\n+ pBond->setBondDir(Bond::EITHERDOUBLE);\n+ }\n+\n pBond->setIsAromatic(rBond->getIsAromatic());\n \n+ pBond->updateProps(*rBond);\n if (pBond->hasProp(common_properties::NullBond)) {\n pBond->clearProp(common_properties::NullBond);\n }\n@@ -858,6 +864,14 @@ void addMissingProductAtom(const Atom &reactAtom, unsigned reactNeighborIdx,\n } else {\n product->addBond(productIdx, prodNeighborIdx, origB->getBondType());\n }\n+\n+ auto prodB = product->getBondBetweenAtoms(prodNeighborIdx, productIdx);\n+ if (origB->getBondType() == Bond::DOUBLE &&\n+ origB->getBondDir() == Bond::EITHERDOUBLE) {\n+ prodB->setBondDir(Bond::EITHERDOUBLE);\n+ }\n+ bool preserveExisting = true;\n+ prodB->updateProps(*origB, preserveExisting);\n }\n \n void addReactantNeighborsToProduct(\n"}, "test": {"test_patch": "diff --git a/Code/GraphMol/ChemReactions/testReaction.cpp b/Code/GraphMol/ChemReactions/testReaction.cpp\nindex 4b8af214ed9..05529b92325 100644\n--- a/Code/GraphMol/ChemReactions/testReaction.cpp\n+++ b/Code/GraphMol/ChemReactions/testReaction.cpp\n@@ -7539,6 +7539,73 @@ void testGithub4162() {\n RxnOps::sanitizeRxn(*rxnFromPickle);\n }\n \n+void testGithub4114() {\n+ BOOST_LOG(rdInfoLog) << \"--------------------------------------\" << std::endl;\n+ BOOST_LOG(rdInfoLog) << \"Reactions don't propagate bond properties\"\n+ << std::endl;\n+\n+ const std::string DUMMY_PROP{\"dummy_prop\"};\n+ std::vector<ROMOL_SPTR> mol{\"ClC(N=O)=C=C=C=C(Br)N=S\"_smiles};\n+\n+ // React the left side of the mol\n+ const std::string reaction(\n+ R\"([Cl:1][C:2]([N:3]=[O:4])=[C:5]=[C:6]>>[F:1][Si:2]([P:3]~[S:4])(~[Si:5]=[Si:6]))\");\n+ std::unique_ptr<ChemicalReaction> rxn(RxnSmartsToChemicalReaction(reaction));\n+ TEST_ASSERT(rxn);\n+ rxn->initReactantMatchers();\n+\n+ // Set dummy properties on all bonds; mark the central double bonds\n+ // as EITHERDOUBLE\n+ for (unsigned int i = 0; i < mol[0]->getNumBonds(); ++i) {\n+ auto bnd = mol[0]->getBondWithIdx(i);\n+ bnd->setProp(DUMMY_PROP, i);\n+\n+ if (i >= 3 && i <= 6) {\n+ TEST_ASSERT(bnd->getBondType() == Bond::DOUBLE);\n+ bnd->setBondDir(Bond::EITHERDOUBLE);\n+ }\n+ }\n+\n+ auto prods = rxn->runReactants(mol);\n+ TEST_ASSERT(prods.size() == 1);\n+ TEST_ASSERT(prods[0].size() == 1);\n+\n+ // Make sure the reaction did not alter the graph\n+ for (const auto &at : prods[0][0]->atoms()) {\n+ auto mapno = at->getProp<unsigned int>(common_properties::reactantAtomIdx);\n+ TEST_ASSERT(mapno == at->getIdx());\n+ }\n+\n+ for (const auto &rBnd : mol[0]->bonds()) {\n+ auto pBnd = prods[0][0]->getBondBetweenAtoms(rBnd->getBeginAtomIdx(),\n+ rBnd->getEndAtomIdx());\n+\n+ // Bonds 0, 1 and 4 are overridden in the product template, and should\n+ // therefore override the properties.\n+ // Bonds 2 and 3 are \"null bonds\", and should get properties copied over.\n+ // Bonds > 4 are reactant bonds, and should keep their properties.\n+ auto rBndIdx = rBnd->getIdx();\n+ if (rBndIdx == 0 || rBndIdx == 1 || rBndIdx == 4) {\n+ TEST_ASSERT(!pBnd->hasProp(DUMMY_PROP));\n+ } else {\n+ unsigned int dummy_prop;\n+ TEST_ASSERT(pBnd->getPropIfPresent(DUMMY_PROP, dummy_prop));\n+ TEST_ASSERT(dummy_prop == rBndIdx);\n+ }\n+\n+ // Bond 3 is a \"null bond\", and should preserve EITHERDOUBLE.\n+ // Bond 4 is specified in the reaction, and should not preserve\n+ // EITHERDOUBLE. Bonds 5 & 6 are not included in the reaction, so they\n+ // should keep EITHERDOUBLE dir.\n+ if (rBndIdx == 3 || rBndIdx == 5 || rBndIdx == 6) {\n+ TEST_ASSERT(pBnd->getBondType() == Bond::DOUBLE);\n+ TEST_ASSERT(pBnd->getBondDir() == Bond::EITHERDOUBLE);\n+ } else {\n+ TEST_ASSERT(pBnd->getBondDir() == Bond::NONE);\n+ }\n+ }\n+}\n+\n int main() {\n RDLog::InitLogs();\n \n@@ -7633,6 +7700,7 @@ int main() {\n testRxnBlockRemoveHs();\n testGithub3078();\n testGithub4162();\n+ testGithub4114();\n \n BOOST_LOG(rdInfoLog)\n << \"*******************************************************\\n\";\n", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}203{"question_id": "MSB_rdkit_rdkit_pr4243", "question_type": "multi_swe_bench", "description": "Fixes #3998 (rdkit/rdkit#4243)", "content": {"org": "rdkit", "repo": "rdkit", "pr_number": 4243, "issue_title": "Fixes #3998", "issue_body": "#### Reference Issue\r\n\r\nFixes #3998\r\n\r\n#### What does this implement/fix? Explain your changes.\r\n\r\n`MolFragmentToSmiles` removes ring info but it makes no sense and also causes troubles. This PR removes the code.\r\n\r\n#### Any other comments?\r\n", "base_commit": "97dd7e712b394c7c26febc14c5fa35f23ed695e0", "resolved_issues": [{"number": 3998, "title": "MolFragmentToSmiles with kekuleSmiles=True raises AtomKekulizeException", "body": "**Describe the bug**\r\nRelease 2021_03_1 raises `AtomKekulizeException` by the following code.\r\n\r\n**To Reproduce**\r\n```python\r\nfrom rdkit import Chem\r\nmol = Chem.MolFromSmiles(\"CC(c1ccccc1)\")\r\nChem.MolFragmentToSmiles(mol, [0], kekuleSmiles=False)\r\nChem.MolFragmentToSmiles(mol, [2,3,4,5,6,7], kekuleSmiles=False)\r\nChem.MolFragmentToSmiles(mol, [0], kekuleSmiles=True) # Error is raised here\r\nChem.MolFragmentToSmiles(mol, [2,3,4,5,6,7], kekuleSmiles=True)\r\n```\r\n\r\n**Expected behavior**\r\n```\r\n'C'\r\n'c1ccccc1'\r\n'C'\r\n'C1=CC=CC=C1'\r\n```\r\n\r\n**Screenshots**\r\n```python\r\n>>> import rdkit\r\n>>> rdkit.__version__\r\n'2021.03.1'\r\n>>> from rdkit import Chem\r\n>>> mol = Chem.MolFromSmiles(\"CC(c1ccccc1)\")\r\n>>> Chem.MolFragmentToSmiles(mol, [0], kekuleSmiles=False)\r\n'C'\r\n>>> Chem.MolFragmentToSmiles(mol, [2,3,4,5,6,7], kekuleSmiles=False)\r\n'c1ccccc1'\r\n>>> Chem.MolFragmentToSmiles(mol, [0], kekuleSmiles=True)\r\nTraceback (most recent call last):\r\n File \"<stdin>\", line 1, in <module>\r\nrdkit.Chem.rdchem.AtomKekulizeException: non-ring atom 2 marked aromatic\r\n>>> Chem.MolFragmentToSmiles(mol, [2,3,4,5,6,7], kekuleSmiles=True)\r\n'C1=CC=CC=C1'\r\n```\r\n\r\n**Configuration (please complete the following information):**\r\n - RDKit version: 2021.03.1 \r\n - OS: Windows 10\r\n - Python version (if relevant): 3.8.5\r\n - Are you using conda? : Yes\r\n - If you are using conda, which channel did you install the rdkit from?: conda-forge\r\n - If you are not using conda: how did you install the RDKit? : conda install rdkit==2021.03.1\r\n\r\n**Additional context**\r\nThe result with Release_2020_09_5 is below.\r\n```python\r\n>>> import rdkit\r\n>>> rdkit.__version__\r\n'2020.09.5'\r\n>>> from rdkit import Chem\r\n>>> mol = Chem.MolFromSmiles(\"CC(c1ccccc1)\")\r\n>>> Chem.MolFragmentToSmiles(mol, [0], kekuleSmiles=False)\r\n'C'\r\n>>> Chem.MolFragmentToSmiles(mol, [2,3,4,5,6,7], kekuleSmiles=False)\r\n'c1ccccc1'\r\n>>> Chem.MolFragmentToSmiles(mol, [0], kekuleSmiles=True)\r\n'C'\r\n>>> Chem.MolFragmentToSmiles(mol, [2,3,4,5,6,7], kekuleSmiles=True)\r\n'C1:C:C:C:C:C:1'\r\n```\r\n"}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/rdkit_m_rdkit:pr-4243", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/Code/GraphMol/SmilesParse/SmilesWrite.cpp b/Code/GraphMol/SmilesParse/SmilesWrite.cpp\nindex fe8f331a51c..8f5998cdd53 100644\n--- a/Code/GraphMol/SmilesParse/SmilesWrite.cpp\n+++ b/Code/GraphMol/SmilesParse/SmilesWrite.cpp\n@@ -646,33 +646,6 @@ std::string MolFragmentToSmiles(const ROMol &mol,\n }\n }\n \n- // copy over the rings that only involve atoms/bonds in this fragment:\n- if (mol.getRingInfo()->isInitialized()) {\n- tmol.getRingInfo()->reset();\n- tmol.getRingInfo()->initialize();\n- for (unsigned int ridx = 0; ridx < mol.getRingInfo()->numRings(); ++ridx) {\n- const INT_VECT å = mol.getRingInfo()->atomRings()[ridx];\n- bool keepIt = true;\n- for (auto aidx : aring) {\n- if (!atomsInPlay[aidx]) {\n- keepIt = false;\n- break;\n- }\n- }\n- if (keepIt) {\n- const INT_VECT &bring = mol.getRingInfo()->bondRings()[ridx];\n- for (auto bidx : bring) {\n- if (!bondsInPlay[bidx]) {\n- keepIt = false;\n- break;\n- }\n- }\n- if (keepIt) {\n- tmol.getRingInfo()->addRing(aring, bring);\n- }\n- }\n- }\n- }\n if (tmol.needsUpdatePropertyCache()) {\n for (auto atom : tmol.atoms()) {\n atom->updatePropertyCache(false);\n"}, "test": {"test_patch": "diff --git a/Code/GraphMol/SmilesParse/test.cpp b/Code/GraphMol/SmilesParse/test.cpp\nindex 4e272cb66b0..f62a6674529 100644\n--- a/Code/GraphMol/SmilesParse/test.cpp\n+++ b/Code/GraphMol/SmilesParse/test.cpp\n@@ -4360,6 +4360,27 @@ void testGithub3967() {\n BOOST_LOG(rdInfoLog) << \"\\tdone\" << std::endl;\n }\n \n+void testGithub3998() {\n+ BOOST_LOG(rdInfoLog) << \"-------------------------------------\" << std::endl;\n+ BOOST_LOG(rdInfoLog) << \"Testing Github 3998: MolFragmentToSmiles with \"\n+ \"kekuleSmiles=True raises AtomKekulizeException\"\n+ << std::endl;\n+ {\n+ RWMol *m;\n+ std::string smiles = \"CC(c1ccccc1)\";\n+ m = SmilesToMol(smiles);\n+ TEST_ASSERT(m);\n+ int as[] = {0};\n+ std::vector<int> atomsToUse(as, as + sizeof(as) / sizeof(int));\n+ std::string smi = MolFragmentToSmiles(*m, atomsToUse, nullptr, nullptr, \n+ nullptr, true, true);\n+ TEST_ASSERT(smi == \"C\"); \n+ delete m;\n+ }\n+\n+ BOOST_LOG(rdInfoLog) << \"done\" << std::endl;\n+}\n+\n int main(int argc, char *argv[]) {\n (void)argc;\n (void)argv;\n@@ -4439,6 +4460,7 @@ int main(int argc, char *argv[]) {\n testGithub1028();\n testGithub3139();\n testGithub3967();\n+ testGithub3998();\n #endif\n testOSSFuzzFailures();\n }\n", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}204{"question_id": "MSB_rdkit_rdkit_pr4248", "question_type": "multi_swe_bench", "description": "Fixes #3998 (rdkit/rdkit#4248)", "content": {"org": "rdkit", "repo": "rdkit", "pr_number": 4248, "issue_title": "Fixes #3998", "issue_body": "In order to fix this problem I needed to add a function which kekulizes a fragment of a molecule instead of the whole thing.\r\n\r\nThat new function is currently in the `MolOps::details` namespace since I really don't think it should be used from other code until we've tested it more thoroughly and are sure we're happy with the behavior.", "base_commit": "464a324dc5e567e3aa74f7a339cd3c45c9366682", "resolved_issues": [{"number": 3998, "title": "MolFragmentToSmiles with kekuleSmiles=True raises AtomKekulizeException", "body": "**Describe the bug**\r\nRelease 2021_03_1 raises `AtomKekulizeException` by the following code.\r\n\r\n**To Reproduce**\r\n```python\r\nfrom rdkit import Chem\r\nmol = Chem.MolFromSmiles(\"CC(c1ccccc1)\")\r\nChem.MolFragmentToSmiles(mol, [0], kekuleSmiles=False)\r\nChem.MolFragmentToSmiles(mol, [2,3,4,5,6,7], kekuleSmiles=False)\r\nChem.MolFragmentToSmiles(mol, [0], kekuleSmiles=True) # Error is raised here\r\nChem.MolFragmentToSmiles(mol, [2,3,4,5,6,7], kekuleSmiles=True)\r\n```\r\n\r\n**Expected behavior**\r\n```\r\n'C'\r\n'c1ccccc1'\r\n'C'\r\n'C1=CC=CC=C1'\r\n```\r\n\r\n**Screenshots**\r\n```python\r\n>>> import rdkit\r\n>>> rdkit.__version__\r\n'2021.03.1'\r\n>>> from rdkit import Chem\r\n>>> mol = Chem.MolFromSmiles(\"CC(c1ccccc1)\")\r\n>>> Chem.MolFragmentToSmiles(mol, [0], kekuleSmiles=False)\r\n'C'\r\n>>> Chem.MolFragmentToSmiles(mol, [2,3,4,5,6,7], kekuleSmiles=False)\r\n'c1ccccc1'\r\n>>> Chem.MolFragmentToSmiles(mol, [0], kekuleSmiles=True)\r\nTraceback (most recent call last):\r\n File \"<stdin>\", line 1, in <module>\r\nrdkit.Chem.rdchem.AtomKekulizeException: non-ring atom 2 marked aromatic\r\n>>> Chem.MolFragmentToSmiles(mol, [2,3,4,5,6,7], kekuleSmiles=True)\r\n'C1=CC=CC=C1'\r\n```\r\n\r\n**Configuration (please complete the following information):**\r\n - RDKit version: 2021.03.1 \r\n - OS: Windows 10\r\n - Python version (if relevant): 3.8.5\r\n - Are you using conda? : Yes\r\n - If you are using conda, which channel did you install the rdkit from?: conda-forge\r\n - If you are not using conda: how did you install the RDKit? : conda install rdkit==2021.03.1\r\n\r\n**Additional context**\r\nThe result with Release_2020_09_5 is below.\r\n```python\r\n>>> import rdkit\r\n>>> rdkit.__version__\r\n'2020.09.5'\r\n>>> from rdkit import Chem\r\n>>> mol = Chem.MolFromSmiles(\"CC(c1ccccc1)\")\r\n>>> Chem.MolFragmentToSmiles(mol, [0], kekuleSmiles=False)\r\n'C'\r\n>>> Chem.MolFragmentToSmiles(mol, [2,3,4,5,6,7], kekuleSmiles=False)\r\n'c1ccccc1'\r\n>>> Chem.MolFragmentToSmiles(mol, [0], kekuleSmiles=True)\r\n'C'\r\n>>> Chem.MolFragmentToSmiles(mol, [2,3,4,5,6,7], kekuleSmiles=True)\r\n'C1:C:C:C:C:C:1'\r\n```\r\n"}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/rdkit_m_rdkit:pr-4248", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/Code/GraphMol/Kekulize.cpp b/Code/GraphMol/Kekulize.cpp\nindex b20429ea16e..a4da0686cf4 100644\n--- a/Code/GraphMol/Kekulize.cpp\n+++ b/Code/GraphMol/Kekulize.cpp\n@@ -495,28 +495,42 @@ void kekulizeFused(RWMol &mol, const VECT_INT_VECT ås,\n } // namespace\n \n namespace MolOps {\n-void Kekulize(RWMol &mol, bool markAtomsBonds, unsigned int maxBackTracks) {\n+namespace details {\n+void KekulizeFragment(RWMol &mol, const boost::dynamic_bitset<> &atomsToUse,\n+ const boost::dynamic_bitset<> &bondsToUse,\n+ bool markAtomsBonds, unsigned int maxBackTracks) {\n+ PRECONDITION(atomsToUse.size() == mol.getNumAtoms(),\n+ \"atomsToUse is wrong size\");\n+ PRECONDITION(bondsToUse.size() == mol.getNumBonds(),\n+ \"bondsToUse is wrong size\");\n+\n // there's no point doing kekulization if there are no aromatic bonds:\n bool foundAromatic = false;\n- for (ROMol::BondIterator bi = mol.beginBonds();\n- bi != mol.endBonds() && !foundAromatic; ++bi) {\n- if ((*bi)->getIsAromatic()) {\n+ for (const auto bond : mol.bonds()) {\n+ if (bondsToUse[bond->getIdx()] && bond->getIsAromatic()) {\n foundAromatic = true;\n+ break;\n }\n }\n \n // before everything do implicit valence calculation and store them\n // we will repeat after kekulization and compare for the sake of error\n // checking\n- INT_VECT valences;\n int numAtoms = mol.getNumAtoms();\n- valences.reserve(numAtoms);\n- for (ROMol::AtomIterator ai = mol.beginAtoms(); ai != mol.endAtoms(); ++ai) {\n- (*ai)->calcImplicitValence(false);\n- valences.push_back((*ai)->getTotalValence());\n- if (!foundAromatic && (*ai)->getIsAromatic()) {\n+ INT_VECT valences(numAtoms);\n+ boost::dynamic_bitset<> dummyAts(mol.getNumAtoms());\n+ for (auto atom : mol.atoms()) {\n+ if (!atomsToUse[atom->getIdx()]) {\n+ continue;\n+ }\n+ atom->calcImplicitValence(false);\n+ valences[atom->getIdx()] = atom->getTotalValence();\n+ if (atom->getIsAromatic()) {\n foundAromatic = true;\n }\n+ if (!atom->getAtomicNum()) {\n+ dummyAts[atom->getIdx()] = 1;\n+ }\n }\n if (!foundAromatic) {\n return;\n@@ -533,41 +547,46 @@ void Kekulize(RWMol &mol, bool markAtomsBonds, unsigned int maxBackTracks) {\n \n // first find the all the simple rings in the molecule that are not\n // completely composed of dummy atoms\n- VECT_INT_VECT arings;\n- boost::dynamic_bitset<> dummyAts(mol.getNumAtoms());\n- for (ROMol::AtomIterator atit = mol.beginAtoms(); atit != mol.endAtoms();\n- ++atit) {\n- if (!(*atit)->getAtomicNum()) {\n- dummyAts[(*atit)->getIdx()] = 1;\n- }\n+ VECT_INT_VECT allrings;\n+ if (mol.getRingInfo()->isInitialized()) {\n+ allrings = mol.getRingInfo()->atomRings();\n+ } else {\n+ MolOps::findSSSR(mol, allrings);\n }\n- if (dummyAts.any()) {\n- VECT_INT_VECT allrings;\n- if (mol.getRingInfo()->isInitialized()) {\n- allrings = mol.getRingInfo()->atomRings();\n- } else {\n- MolOps::findSSSR(mol, allrings);\n- }\n- arings.reserve(allrings.size());\n- for (auto &ring : allrings) {\n- for (auto ai : ring) {\n- if (!dummyAts[ai]) {\n- arings.push_back(ring);\n- break;\n- }\n+ VECT_INT_VECT arings;\n+ arings.reserve(allrings.size());\n+ for (auto &ring : allrings) {\n+ bool ringOk = false;\n+ for (auto ai : ring) {\n+ if (!atomsToUse[ai]) {\n+ ringOk = false;\n+ break;\n+ }\n+ if (!dummyAts[ai]) {\n+ ringOk = true;\n }\n }\n- } else {\n- if (mol.getRingInfo()->isInitialized()) {\n- arings = mol.getRingInfo()->atomRings();\n- } else {\n- MolOps::findSSSR(mol, arings);\n+ if (ringOk) {\n+ arings.push_back(ring);\n }\n }\n \n+ VECT_INT_VECT allbrings;\n+ RingUtils::convertToBonds(arings, allbrings, mol);\n VECT_INT_VECT brings;\n- // brings = mol.getRingInfo()->bondRings();\n- RingUtils::convertToBonds(arings, brings, mol);\n+ brings.reserve(allbrings.size());\n+ for (auto &ring : allbrings) {\n+ bool ringOk = true;\n+ for (auto bi : ring) {\n+ if (!bondsToUse[bi]) {\n+ ringOk = false;\n+ break;\n+ }\n+ }\n+ if (ringOk) {\n+ brings.push_back(ring);\n+ }\n+ }\n \n // make a neighbor map for the rings i.e. a ring is a\n // neighbor to another candidate ring if it shares at least\n@@ -602,28 +621,31 @@ void Kekulize(RWMol &mol, bool markAtomsBonds, unsigned int maxBackTracks) {\n if (markAtomsBonds) {\n // if we want the atoms and bonds to be marked non-aromatic do\n // that here.\n- for (ROMol::BondIterator bi = mol.beginBonds(); bi != mol.endBonds();\n- ++bi) {\n- (*bi)->setIsAromatic(false);\n+ for (auto bond : mol.bonds()) {\n+ if (bondsToUse[bond->getIdx()]) {\n+ bond->setIsAromatic(false);\n+ }\n }\n- for (ROMol::AtomIterator ai = mol.beginAtoms(); ai != mol.endAtoms();\n- ++ai) {\n- if ((*ai)->getIsAromatic()) {\n- if (!mol.getRingInfo()->numAtomRings((*ai)->getIdx())) {\n+ for (auto atom : mol.atoms()) {\n+ if (atomsToUse[atom->getIdx()] && atom->getIsAromatic()) {\n+ // if we're doing the full molecule and there are aromatic atoms not in\n+ // a ring, throw an exception\n+ if (atomsToUse.all() && bondsToUse.all() &&\n+ !mol.getRingInfo()->numAtomRings(atom->getIdx())) {\n std::ostringstream errout;\n- errout << \"non-ring atom \" << (*ai)->getIdx() << \" marked aromatic\";\n+ errout << \"non-ring atom \" << atom->getIdx() << \" marked aromatic\";\n std::string msg = errout.str();\n BOOST_LOG(rdErrorLog) << msg << std::endl;\n- throw AtomKekulizeException(msg, (*ai)->getIdx());\n+ throw AtomKekulizeException(msg, atom->getIdx());\n }\n- (*ai)->setIsAromatic(false);\n+ atom->setIsAromatic(false);\n // make sure \"explicit\" Hs on things like pyrroles don't hang around\n // this was Github Issue 141\n- if (((*ai)->getAtomicNum() == 7 || (*ai)->getAtomicNum() == 15) &&\n- (*ai)->getFormalCharge() == 0 && (*ai)->getNumExplicitHs() == 1) {\n- (*ai)->setNoImplicit(false);\n- (*ai)->setNumExplicitHs(0);\n- (*ai)->updatePropertyCache(false);\n+ if ((atom->getAtomicNum() == 7 || atom->getAtomicNum() == 15) &&\n+ atom->getFormalCharge() == 0 && atom->getNumExplicitHs() == 1) {\n+ atom->setNoImplicit(false);\n+ atom->setNumExplicitHs(0);\n+ atom->updatePropertyCache(false);\n }\n }\n }\n@@ -632,19 +654,29 @@ void Kekulize(RWMol &mol, bool markAtomsBonds, unsigned int maxBackTracks) {\n // ok some error checking here force a implicit valence\n // calculation that should do some error checking by itself. In\n // addition compare them to what they were before kekulizing\n- int i = 0;\n- for (ROMol::AtomIterator ai = mol.beginAtoms(); ai != mol.endAtoms(); ++ai) {\n- int val = (*ai)->getTotalValence();\n- if (val != valences[i]) {\n+ for (auto atom : mol.atoms()) {\n+ if (!atomsToUse[atom->getIdx()]) {\n+ continue;\n+ }\n+ int val = atom->getTotalValence();\n+ if (val != valences[atom->getIdx()]) {\n std::ostringstream errout;\n- errout << \"Kekulization somehow screwed up valence on \" << (*ai)->getIdx()\n- << \": \" << val << \"!=\" << valences[i] << std::endl;\n+ errout << \"Kekulization somehow screwed up valence on \" << atom->getIdx()\n+ << \": \" << val << \"!=\" << valences[atom->getIdx()] << std::endl;\n std::string msg = errout.str();\n BOOST_LOG(rdErrorLog) << msg << std::endl;\n- throw AtomKekulizeException(msg, (*ai)->getIdx());\n+ throw AtomKekulizeException(msg, atom->getIdx());\n }\n- i++;\n }\n }\n-} // end of namespace MolOps\n-} // end of namespace RDKit\n+} // namespace details\n+void Kekulize(RWMol &mol, bool markAtomsBonds, unsigned int maxBackTracks) {\n+ boost::dynamic_bitset<> atomsToUse(mol.getNumAtoms());\n+ atomsToUse.set();\n+ boost::dynamic_bitset<> bondsToUse(mol.getNumBonds());\n+ bondsToUse.set();\n+ details::KekulizeFragment(mol, atomsToUse, bondsToUse, markAtomsBonds,\n+ maxBackTracks);\n+}\n+} // namespace MolOps\n+} // namespace RDKit\ndiff --git a/Code/GraphMol/MolOps.h b/Code/GraphMol/MolOps.h\nindex ecf07fdf7be..6a7bf3d7d9f 100644\n--- a/Code/GraphMol/MolOps.h\n+++ b/Code/GraphMol/MolOps.h\n@@ -998,7 +998,15 @@ RDKIT_GRAPHMOL_EXPORT unsigned getNumAtomsWithDistinctProperty(\n //! returns whether or not a molecule needs to have Hs added to it.\n RDKIT_GRAPHMOL_EXPORT bool needsHs(const ROMol &mol);\n \n-}; // end of namespace MolOps\n-}; // end of namespace RDKit\n+namespace details {\n+//! not recommended for use in other code\n+RDKIT_GRAPHMOL_EXPORT void KekulizeFragment(\n+ RWMol &mol, const boost::dynamic_bitset<> &atomsToUse,\n+ const boost::dynamic_bitset<> &bondsToUse, bool markAtomsBonds = true,\n+ unsigned int maxBackTracks = 100);\n+} // namespace details\n+\n+} // namespace MolOps\n+} // namespace RDKit\n \n #endif\ndiff --git a/Code/GraphMol/SmilesParse/SmilesWrite.cpp b/Code/GraphMol/SmilesParse/SmilesWrite.cpp\nindex fe8f331a51c..1931584c2ab 100644\n--- a/Code/GraphMol/SmilesParse/SmilesWrite.cpp\n+++ b/Code/GraphMol/SmilesParse/SmilesWrite.cpp\n@@ -294,9 +294,12 @@ std::string FragmentSmilesConstruct(\n const UINT_VECT &ranks, bool doKekule, bool canonical,\n bool doIsomericSmiles, bool allBondsExplicit, bool allHsExplicit,\n bool doRandom, std::vector<unsigned int> &atomOrdering,\n+ const boost::dynamic_bitset<> *atomsInPlay = nullptr,\n const boost::dynamic_bitset<> *bondsInPlay = nullptr,\n const std::vector<std::string> *atomSymbols = nullptr,\n const std::vector<std::string> *bondSymbols = nullptr) {\n+ PRECONDITION(!atomsInPlay || atomsInPlay->size() >= mol.getNumAtoms(),\n+ \"bad atomsInPlay\");\n PRECONDITION(!bondsInPlay || bondsInPlay->size() >= mol.getNumBonds(),\n \"bad bondsInPlay\");\n PRECONDITION(!atomSymbols || atomSymbols->size() >= mol.getNumAtoms(),\n@@ -304,7 +307,12 @@ std::string FragmentSmilesConstruct(\n PRECONDITION(!bondSymbols || bondSymbols->size() >= mol.getNumBonds(),\n \"bad bondSymbols\");\n if (doKekule) {\n- MolOps::Kekulize(static_cast<RWMol &>(mol));\n+ if (atomsInPlay && bondsInPlay) {\n+ MolOps::details::KekulizeFragment(static_cast<RWMol &>(mol), *atomsInPlay,\n+ *bondsInPlay);\n+ } else {\n+ MolOps::Kekulize(static_cast<RWMol &>(mol));\n+ }\n }\n \n Canon::MolStack molStack;\n@@ -750,8 +758,8 @@ std::string MolFragmentToSmiles(const ROMol &mol,\n bool doRandom = false;\n auto subSmi = SmilesWrite::FragmentSmilesConstruct(\n tmol, nextAtomIdx, colors, ranks, doKekule, canonical, doIsomericSmiles,\n- allBondsExplicit, allHsExplicit, doRandom, atomOrdering, &bondsInPlay,\n- atomSymbols, bondSymbols);\n+ allBondsExplicit, allHsExplicit, doRandom, atomOrdering, &atomsInPlay,\n+ &bondsInPlay, atomSymbols, bondSymbols);\n \n res += subSmi;\n colorIt = std::find(colors.begin(), colors.end(), Canon::WHITE_NODE);\ndiff --git a/Code/GraphMol/catch_graphmol.cpp b/Code/GraphMol/catch_graphmol.cpp\nindex d7ec1804699..09ee1716e6d 100644\n--- a/Code/GraphMol/catch_graphmol.cpp\n+++ b/Code/GraphMol/catch_graphmol.cpp\n@@ -2046,3 +2046,27 @@ TEST_CASE(\n CHECK_THROWS_AS(conf.setAtomPos(std::numeric_limits<unsigned>::max(), pt),\n ValueErrorException);\n }\n+\n+TEST_CASE(\"KekulizeFragment\", \"[graphmol]\") {\n+ SECTION(\"basics\") {\n+ auto mol = \"CCc1ccccc1\"_smiles;\n+ REQUIRE(mol);\n+ boost::dynamic_bitset<> atomsInPlay(mol->getNumAtoms());\n+ for (auto aidx : std::vector<size_t>{0, 1, 2, 3}) {\n+ atomsInPlay.set(aidx);\n+ }\n+ boost::dynamic_bitset<> bondsInPlay(mol->getNumBonds());\n+ for (auto bidx : std::vector<size_t>{0, 1, 2}) {\n+ bondsInPlay.set(bidx);\n+ }\n+ MolOps::details::KekulizeFragment(*mol, atomsInPlay, bondsInPlay);\n+ CHECK(!mol->getAtomWithIdx(2)->getIsAromatic());\n+ CHECK(mol->getAtomWithIdx(4)->getIsAromatic());\n+ CHECK(!mol->getBondWithIdx(2)->getIsAromatic());\n+ // at the moment that bond still has an aromatic bond order, which isn't\n+ // optimal, but that will have to wait until we add a feature to allow\n+ // kekulization of conjugated chains.\n+ CHECK(mol->getBondWithIdx(2)->getBondType() == Bond::AROMATIC);\n+ CHECK(mol->getBondWithIdx(4)->getIsAromatic());\n+ }\n+}\n"}, "test": {"test_patch": "diff --git a/Code/GraphMol/SmilesParse/catch_tests.cpp b/Code/GraphMol/SmilesParse/catch_tests.cpp\nindex 67807a0ccdc..821754f58b3 100644\n--- a/Code/GraphMol/SmilesParse/catch_tests.cpp\n+++ b/Code/GraphMol/SmilesParse/catch_tests.cpp\n@@ -855,4 +855,32 @@ TEST_CASE(\"Github #2788: doKekule=true should kekulize the molecule\",\n TEST_CASE(\"bogus recursive SMARTS\", \"[smarts]\") {\n std::string sma = \"C)foo\";\n CHECK(SmartsToMol(sma) == nullptr);\n-}\n\\ No newline at end of file\n+}\n+\n+TEST_CASE(\n+ \"Github #3998 MolFragmentToSmiles failing in Kekulization with \"\n+ \"kekuleSmiles=true\") {\n+ auto mol = \"Cc1ccccc1\"_smiles;\n+ REQUIRE(mol);\n+ SECTION(\"normal\") {\n+ std::vector<int> ats{0};\n+ std::string smi = MolFragmentToSmiles(*mol, ats);\n+ CHECK(smi == \"C\");\n+ }\n+ SECTION(\"kekulized\") {\n+ std::vector<int> ats{0};\n+ bool doIsomericSmiles = true;\n+ bool doKekule = true;\n+ std::string smi = MolFragmentToSmiles(*mol, ats, nullptr, nullptr, nullptr,\n+ doIsomericSmiles, doKekule);\n+ CHECK(smi == \"C\");\n+ }\n+ SECTION(\"including ring parts\") {\n+ std::vector<int> ats{0, 1, 2};\n+ bool doIsomericSmiles = true;\n+ bool doKekule = true;\n+ std::string smi = MolFragmentToSmiles(*mol, ats, nullptr, nullptr, nullptr,\n+ doIsomericSmiles, doKekule);\n+ CHECK(smi == \"C:CC\");\n+ }\n+}\n", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}205{"question_id": "MSB_rdkit_rdkit_pr4282", "question_type": "multi_swe_bench", "description": "Fixes #4281 (rdkit/rdkit#4282)", "content": {"org": "rdkit", "repo": "rdkit", "pr_number": 4282, "issue_title": "Fixes #4281", "issue_body": "Made the pyridine _N_-oxide pattern more specific and added a test.", "base_commit": "f2e9e3a03165160f8c36308afc53a0272b761800", "resolved_issues": [{"number": 4281, "title": "The normalization pattern for pyridine N-oxide is not specific enough", "body": "Reported by JP Ebejer:\r\n\r\n```\r\nfrom rdkit import Chem\r\nfrom rdkit.Chem.MolStandardize import rdMolStandardize\r\n\r\nm = Chem.MolFromSmiles('Cn1c(=O)c2nc[nH][n+](=O)c2n(C)c1=O')\r\nm\r\n```\r\n\r\n```\r\nrdMolStandardize.Cleanup(m)\r\nRDKit ERROR: [19:20:42] Can't kekulize mol. Unkekulized atoms: 0 3 4 6 7\r\n```\r\n\r\nThe molecule is not actually a pyridine _N_-oxide, rather the oxy tautomer of a _N_-hydroxypyridinium ion, but it hits the pyridine _N_-oxide normalization pattern because the latter is not sufficiently specific."}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/rdkit_m_rdkit:pr-4282", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/Code/GraphMol/MolStandardize/TransformCatalog/normalizations.in b/Code/GraphMol/MolStandardize/TransformCatalog/normalizations.in\nindex 6b452219452..8aeb6b44d3e 100644\n--- a/Code/GraphMol/MolStandardize/TransformCatalog/normalizations.in\n+++ b/Code/GraphMol/MolStandardize/TransformCatalog/normalizations.in\n@@ -16,7 +16,7 @@ std::vector<std::pair<std::string, std::string>> defaultNormalizations = {\n \"[N,P,As,Sb;X3:1](=[O,S,Se,Te:2])=[O,S,Se,Te:3]>>[*+1:1]([*-1:2])=[*:3]\"},\n {\"Sulfone to S(=O)(=O)\",\n \"[S+2:1]([O-:2])([O-:3])>>[S+0:1](=[O-0:2])(=[O-0:3])\"},\n- {\"Pyridine oxide to n+O-\", \"[n:1]=[O:2]>>[n+:1][O-:2]\"},\n+ {\"Pyridine oxide to n+O-\", \"[nH0+0:1]=[OH0+0:2]>>[n+:1][O-:2]\"},\n {\"Azide to N=N+=N-\", \"[*:1][N:2]=[N:3]#[N:4]>>[*:1][N:2]=[N+:3]=[N-:4]\"},\n {\"Diazo/azo to =N+=N-\", \"[*:1]=[N:2]#[N:3]>>[*:1]=[N+:2]=[N-:3]\"},\n {\"Sulfoxide to -S+(O-)-\",\n"}, "test": {"test_patch": "diff --git a/Code/GraphMol/MolStandardize/testNormalize.cpp b/Code/GraphMol/MolStandardize/testNormalize.cpp\nindex ae31a9583a3..d65045f43ff 100644\n--- a/Code/GraphMol/MolStandardize/testNormalize.cpp\n+++ b/Code/GraphMol/MolStandardize/testNormalize.cpp\n@@ -501,6 +501,21 @@ void testEmptyMol() {\n TEST_ASSERT(!normalized->getNumAtoms());\n }\n \n+void testGithub4281() {\n+ BOOST_LOG(rdInfoLog)\n+ << \"-----------------------\\n Testing Github #3460: \"\n+ \"Normalization rule incorrectly matches [N+]=O rather than n=O\"\n+ << std::endl;\n+ auto mol = \"Cn1c(=O)c2nc[nH][n+](=O)c2n(C)c1=O\"_smiles;\n+ std::stringstream captureLog;\n+ rdInfoLog->SetTee(captureLog);\n+ Normalizer nn;\n+ std::unique_ptr<ROMol> normalized(nn.normalize(*mol));\n+ rdInfoLog->ClearTee();\n+ auto logged = captureLog.str();\n+ TEST_ASSERT(logged.find(\"FAILED sanitizeMol\") == std::string::npos);\n+}\n+\n int main() {\n RDLog::InitLogs();\n #if 1\n@@ -511,5 +526,6 @@ int main() {\n testNormalizeMultipleAltSmarts();\n testGithub3460();\n testEmptyMol();\n+ testGithub4281();\n return 0;\n }\n", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}206{"question_id": "MSB_rdkit_rdkit_pr4355", "question_type": "multi_swe_bench", "description": "Fixes #4346 : trans bonds are now properly honored in macrocycles (rdkit/rdkit#4355)", "content": {"org": "rdkit", "repo": "rdkit", "pr_number": 4355, "issue_title": "Fixes #4346 : trans bonds are now properly honored in macrocycles", "issue_body": "We didn't have code which handled the possibility that there'd be a trans bond in a ring. :-(\r\n\r\n", "base_commit": "3904b6958d12364bb529038a4705f623aa57e557", "resolved_issues": [{"number": 4346, "title": "Specified trans stereo being ignored during conformation generation in macrocycles", "body": "**Describe the bug**\r\nHere's the example:\r\n```\r\nsmis = r''smis = r'''C1CC=CCCCCCCCC1\r\nC1C/C=C/CCCCCCCC1\r\nC1C\\C=C/CCCCCCCC1'''.split('\\n')\r\nmols = [Chem.MolFromSmiles(x) for x in smis]\r\n\r\nmol_hs = [Chem.AddHs(m) for m in mols]\r\nfor mol in mol_hs:\r\n ok = Chem.MolToInchiKey(mol)\r\n rdDistGeom.EmbedMolecule(mol,randomSeed=0xf00d,enforceChirality=True,useBasicKnowledge=True)\r\n mol = Chem.RemoveHs(mol)\r\n Chem.AssignStereochemistryFrom3D(mol,replaceExistingTags=True)\r\n print(Chem.MolToSmiles(mol),ok, Chem.MolToInchiKey(mol))\r\n```\r\nOutput:\r\n```\r\nC1=C/CCCCCCCCCC/1 HYPABJGVBDSCIT-UHFFFAOYSA-N HYPABJGVBDSCIT-OWOJBTEDSA-N\r\nC1=C\\CCCCCCCCCC/1 HYPABJGVBDSCIT-OWOJBTEDSA-N HYPABJGVBDSCIT-UPHRSURJSA-N\r\nC1=C\\CCCCCCCCCC/1 HYPABJGVBDSCIT-UPHRSURJSA-N HYPABJGVBDSCIT-UPHRSURJSA-N\r\n```\r\nIf we open up the macrocycle things are fine:\r\n```\r\nsmis = r'''CCC=CCCCCCCCC\r\nCC/C=C/CCCCCCCC\r\nCC\\C=C/CCCCCCCC'''.split('\\n')\r\nmols = [Chem.MolFromSmiles(x) for x in smis]\r\n\r\nmol_hs = [Chem.AddHs(m) for m in mols]\r\nfor mol in mol_hs:\r\n ok = Chem.MolToInchiKey(mol)\r\n rdDistGeom.EmbedMolecule(mol,randomSeed=0xf00d,enforceChirality=True,useBasicKnowledge=True)\r\n mol = Chem.RemoveHs(mol)\r\n Chem.AssignStereochemistryFrom3D(mol,replaceExistingTags=True)\r\n print(Chem.MolToSmiles(mol),ok, Chem.MolToInchiKey(mol))\r\n```\r\nOutput:\r\n```\r\nCC/C=C\\CCCCCCCC WLTSXAIICPDFKI-UHFFFAOYSA-N WLTSXAIICPDFKI-ALCCZGGFSA-N\r\nCC/C=C/CCCCCCCC WLTSXAIICPDFKI-FNORWQNLSA-N WLTSXAIICPDFKI-FNORWQNLSA-N\r\nCC/C=C\\CCCCCCCC WLTSXAIICPDFKI-ALCCZGGFSA-N WLTSXAIICPDFKI-ALCCZGGFSA-N\r\n```\r\n\r\n**Configuration (please complete the following information):**\r\n - RDKit version: master and previous releases\r\n - OS: all\r\n\r\n\r\n"}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/rdkit_m_rdkit:pr-4355", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/Code/GraphMol/DistGeomHelpers/BoundsMatrixBuilder.cpp b/Code/GraphMol/DistGeomHelpers/BoundsMatrixBuilder.cpp\nindex e37eb79acb1..0d581f48cde 100644\n--- a/Code/GraphMol/DistGeomHelpers/BoundsMatrixBuilder.cpp\n+++ b/Code/GraphMol/DistGeomHelpers/BoundsMatrixBuilder.cpp\n@@ -1,5 +1,5 @@\n //\n-// Copyright (C) 2004-2019 Greg Landrum and Rational Discovery LLC\n+// Copyright (C) 2004-2021 Greg Landrum and other RDKit contributors\n //\n // @@ All Rights Reserved @@\n // This file is part of the RDKit.\n@@ -610,6 +610,7 @@ void _setInRing14Bounds(const ROMol &mol, const Bond *bnd1, const Bond *bnd2,\n path14.bid3 = bid3;\n Bond::BondStereo stype = _getAtomStereo(bnd2, aid1, aid4);\n bool preferCis = false;\n+ bool preferTrans = false;\n \n // we add a check for the ring size here because there's no reason to assume\n // cis bonds in bigger rings.\n@@ -634,9 +635,12 @@ void _setInRing14Bounds(const ROMol &mol, const Bond *bnd1, const Bond *bnd2,\n }\n } else if (stype == Bond::STEREOZ || stype == Bond::STEREOCIS) {\n preferCis = true;\n+ } else if (stype == Bond::STEREOE || stype == Bond::STEREOTRANS) {\n+ preferTrans = true;\n }\n- // std::cerr << \" torsion: \" << aid1 << \" \" << aid4 << \": \" << preferCis\n- // << std::endl;\n+ // std::cerr << \" torsion: \" << aid1 << \" \" << aid4 << \": \" << preferCis << \"\n+ // \"\n+ // << preferTrans << std::endl;\n if (preferCis) {\n dl = RDGeom::compute14DistCis(bl1, bl2, bl3, ba12, ba23) - GEN_DIST_TOL;\n du = dl + 2 * GEN_DIST_TOL;\n@@ -645,6 +649,15 @@ void _setInRing14Bounds(const ROMol &mol, const Bond *bnd1, const Bond *bnd2,\n bid3] = 1;\n accumData.cisPaths[static_cast<unsigned long>(bid3) * nb * nb + bid2 * nb +\n bid1] = 1;\n+ } else if (preferTrans) {\n+ dl = RDGeom::compute14DistTrans(bl1, bl2, bl3, ba12, ba23) - GEN_DIST_TOL;\n+ du = dl + 2 * GEN_DIST_TOL;\n+ path14.type = Path14Configuration::TRANS;\n+ accumData.transPaths[static_cast<unsigned long>(bid1) * nb * nb +\n+ bid2 * nb + bid3] = 1;\n+ accumData.transPaths[static_cast<unsigned long>(bid3) * nb * nb +\n+ bid2 * nb + bid1] = 1;\n+\n } else {\n // basically we will assume 0 to 180 allowed\n dl = RDGeom::compute14DistCis(bl1, bl2, bl3, ba12, ba23);\n@@ -812,7 +825,7 @@ bool _checkNhChChNh(const Atom *atm1, const Atom *atm2, const Atom *atm3,\n // 2 5 <- 2 is an oxygen/nitrogen\n bool _checkAmideEster14(const Bond *bnd1, const Bond *bnd3, const Atom *atm1,\n const Atom *atm2, const Atom *atm3, const Atom *atm4) {\n- unsigned int a1Num = atm1->getAtomicNum();\n+ RDUNUSED_PARAM(atm1);\n unsigned int a2Num = atm2->getAtomicNum();\n unsigned int a3Num = atm3->getAtomicNum();\n unsigned int a4Num = atm4->getAtomicNum();\n@@ -917,6 +930,7 @@ bool _isCarbonyl(const ROMol &mol, const Atom *at) {\n bool _checkAmideEster15(const ROMol &mol, const Bond *bnd1, const Bond *bnd3,\n const Atom *atm1, const Atom *atm2, const Atom *atm3,\n const Atom *atm4) {\n+ RDUNUSED_PARAM(atm1);\n RDUNUSED_PARAM(atm4);\n unsigned int a2Num = atm2->getAtomicNum();\n if ((a2Num == 8) || ((a2Num == 7) && (atm2->getTotalNumHs(true) == 1))) {\ndiff --git a/Code/GraphMol/DistGeomHelpers/Embedder.cpp b/Code/GraphMol/DistGeomHelpers/Embedder.cpp\nindex d260d869f85..f99af457931 100644\n--- a/Code/GraphMol/DistGeomHelpers/Embedder.cpp\n+++ b/Code/GraphMol/DistGeomHelpers/Embedder.cpp\n@@ -1,5 +1,5 @@\n //\n-// Copyright (C) 2004-2019 Greg Landrum and Rational Discovery LLC\n+// Copyright (C) 2004-2021 Greg Landrum and other RDKit contributors\n //\n // @@ All Rights Reserved @@\n // This file is part of the RDKit.\n"}, "test": {"test_patch": "diff --git a/Code/GraphMol/DistGeomHelpers/catch_tests.cpp b/Code/GraphMol/DistGeomHelpers/catch_tests.cpp\nindex 64c98fe38e6..8f8ecfd1087 100644\n--- a/Code/GraphMol/DistGeomHelpers/catch_tests.cpp\n+++ b/Code/GraphMol/DistGeomHelpers/catch_tests.cpp\n@@ -1,5 +1,5 @@\n //\n-// Copyright (C) 2021 Greg Landrum\n+// Copyright (C) 2021 Greg Landrum and other RDKit contributors\n // @@ All Rights Reserved @@\n // This file is part of the RDKit.\n // The contents are covered by the terms of the BSD license\n@@ -172,4 +172,35 @@ TEST_CASE(\"update parameters from JSON\") {\n CHECK(v1.angleTo(v2) == Approx(M_PI / 2).margin(0.15));\n }\n }\n+}\n+\n+TEST_CASE(\n+ \"github #4346: Specified cis/trans stereo being ignored during \"\n+ \"conformation generation in macrocycles\") {\n+ SECTION(\"basics 1\") {\n+ auto m1 = \"C1C/C=C/CCCCCCCC1\"_smiles;\n+ REQUIRE(m1);\n+ CHECK(m1->getBondBetweenAtoms(2, 3)->getStereo() ==\n+ Bond::BondStereo::STEREOE);\n+ MolOps::addHs(*m1);\n+ DGeomHelpers::EmbedParameters params = DGeomHelpers::KDG;\n+ params.randomSeed = 0xf00d;\n+ CHECK(DGeomHelpers::EmbedMolecule(*m1, params) != -1);\n+ MolOps::assignStereochemistryFrom3D(*m1);\n+ CHECK(m1->getBondBetweenAtoms(2, 3)->getStereo() ==\n+ Bond::BondStereo::STEREOE);\n+ }\n+ SECTION(\"basics 2\") {\n+ auto m1 = \"C1C/C=C\\\\CCCCCCCC1\"_smiles;\n+ REQUIRE(m1);\n+ CHECK(m1->getBondBetweenAtoms(2, 3)->getStereo() ==\n+ Bond::BondStereo::STEREOZ);\n+ MolOps::addHs(*m1);\n+ DGeomHelpers::EmbedParameters params = DGeomHelpers::KDG;\n+ params.randomSeed = 0xf00d;\n+ CHECK(DGeomHelpers::EmbedMolecule(*m1, params) != -1);\n+ MolOps::assignStereochemistryFrom3D(*m1);\n+ CHECK(m1->getBondBetweenAtoms(2, 3)->getStereo() ==\n+ Bond::BondStereo::STEREOZ);\n+ }\n }\n\\ No newline at end of file\n", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}207{"question_id": "MSB_rdkit_rdkit_pr4587", "question_type": "multi_swe_bench", "description": "Fixes #4582 (rdkit/rdkit#4587)", "content": {"org": "rdkit", "repo": "rdkit", "pr_number": 4587, "issue_title": "Fixes #4582", "issue_body": "The changes in #4190 introduced a problem in the SMILES for double bond stereo around ring closures in some rare cases (~60 molecules in ChEMBL27). This fixes that problem.\r\n\r\nThis isn't the most satisfying fix since there are definitely still some errors that can be found when using random SMILES output order, but I'm not sure how long it's going to take to fix the full problem, so I'm suggesting we merge this under the theory that a partial fix is better than nothing.\r\n\r\nAs an aside: the code in `Canon.cpp::canonicalizeDoubleBond()` really ought to be refactored and cleaned up.", "base_commit": "bca3e747f25797384464f0e956c9383a002573a4", "resolved_issues": [{"number": 4582, "title": "Incorrect double bond stereo in output SMILES around ring closures", "body": "**Describe the bug**\r\n\r\nCode to reproduce this:\r\n```\r\nfrom rdkit import Chem\r\nm = Chem.MolFromMolBlock('''CHEMBL409450\r\n RDKit 2D\r\n\r\n 22 25 0 0 0 0 0 0 0 0999 V2000\r\n -1.1669 1.3591 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\r\n -0.6820 0.6916 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\r\n -1.9516 1.1041 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\r\n -1.9516 0.2791 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0\r\n -2.5647 1.6562 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\r\n -2.3931 2.4631 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\r\n -1.6085 2.7181 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\r\n -0.9954 2.1661 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\r\n -1.1669 0.0242 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\r\n -0.9120 -0.7604 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\r\n -1.3969 -1.4279 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\r\n -0.9120 -2.0953 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0\r\n -0.1274 -1.8404 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\r\n -0.1274 -1.0154 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\r\n 0.5871 -2.2529 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\r\n 1.3016 -1.8404 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\r\n 1.3016 -1.0154 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\r\n 0.5871 -0.6029 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\r\n -2.2219 -1.4279 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0\r\n 0.1430 0.6916 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0\r\n 0.5555 1.4061 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0\r\n 2.0160 -2.2529 0.0000 Br 0 0 0 0 0 0 0 0 0 0 0 0\r\n 1 2 1 0\r\n 1 3 2 0\r\n 1 8 1 0\r\n 9 2 1 0\r\n 2 20 2 0\r\n 3 4 1 0\r\n 3 5 1 0\r\n 9 4 1 0\r\n 5 6 2 0\r\n 6 7 1 0\r\n 8 7 2 0\r\n 9 10 2 0\r\n 10 11 1 0\r\n 10 14 1 0\r\n 11 12 1 0\r\n 11 19 2 0\r\n 13 12 1 0\r\n 13 14 2 0\r\n 13 15 1 0\r\n 14 18 1 0\r\n 15 16 2 0\r\n 16 17 1 0\r\n 22 16 1 0\r\n 17 18 2 0\r\n 20 21 1 0\r\nM END''')\r\nprint(Chem.MolToSmiles(m))\r\n```\r\n\r\nThe output is `O=C1Nc2cc(Br)ccc2/C1=C1/Nc2ccccc2/C1=N/O`, but it should be `O=C1Nc2cc(Br)ccc2/C1=C1/Nc2ccccc2/C1=N\\O`\r\n\r\nThis was introduced as part of #4190 \r\n\r\n**Configuration (please complete the following information):**\r\n - RDKit version: >=2021.03.3\r\n - OS: all\r\n"}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/rdkit_m_rdkit:pr-4587", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/.azure-pipelines/linux_build_cartridge.yml b/.azure-pipelines/linux_build_cartridge.yml\nindex 500cd038a17..e0a54564db5 100644\n--- a/.azure-pipelines/linux_build_cartridge.yml\n+++ b/.azure-pipelines/linux_build_cartridge.yml\n@@ -1,10 +1,12 @@\n steps:\n - bash: |\n sudo apt-get update\n- sudo apt-get remove postgresql postgresql-13 postgresql-client-13 postgresql-common postgresql-client-common\n- sudo apt purge postgresql postgresql-13 postgresql-client-13 postgresql-common postgresql-client-common\n+ sudo apt-get remove postgresql-14 postgresql-client-14\n+ sudo apt-get remove postgresql postgresql-common postgresql-client-common\n+ sudo apt purge postgresql-14 postgresql-client-14\n+ sudo apt purge postgresql postgresql-common postgresql-client-common\n sudo apt-get install -y libboost-all-dev postgresql-common postgresql-12 postgresql-server-dev-12\n- echo \"add user\"\n+ echo \"add postgres user\"\n sudo -u postgres createuser -s `whoami`\n displayName: Setup build environment\n - bash: |\ndiff --git a/Code/GraphMol/Canon.cpp b/Code/GraphMol/Canon.cpp\nindex faa822a07df..ebd50d68781 100644\n--- a/Code/GraphMol/Canon.cpp\n+++ b/Code/GraphMol/Canon.cpp\n@@ -1,5 +1,5 @@\n //\n-// Copyright (C) 2001-2020 Greg Landrum and Rational Discovery LLC\n+// Copyright (C) 2001-2021 Greg Landrum and other RDKit contributors\n //\n // @@ All Rights Reserved @@\n // This file is part of the RDKit.\n@@ -136,6 +136,17 @@ void switchBondDir(Bond *bond) {\n }\n }\n \n+namespace {\n+bool isClosingRingBond(Bond *bond) {\n+ if (bond == nullptr) {\n+ return false;\n+ }\n+ auto beginIdx = bond->getBeginAtomIdx();\n+ auto endIdx = bond->getEndAtomIdx();\n+ return beginIdx > endIdx && beginIdx - endIdx > 1 &&\n+ bond->hasProp(common_properties::_TraversalRingClosureBond);\n+}\n+} // namespace\n // FIX: this may only be of interest from the SmilesWriter, should we\n // move it there?\n //\n@@ -354,27 +365,17 @@ void canonicalizeDoubleBond(Bond *dblBond, UINT_VECT &bondVisitOrders,\n // stereochemistry, we need to flip the setting on the other bond:\n const INT_VECT &stereoAtoms = dblBond->getStereoAtoms();\n \n- auto isClosingRingBond = [](Bond *bond) {\n- if (bond == nullptr) {\n- return false;\n- }\n- auto beginIdx = bond->getBeginAtomIdx();\n- auto endIdx = bond->getEndAtomIdx();\n- return beginIdx > endIdx && beginIdx - endIdx > 1 &&\n- bond->hasProp(common_properties::_TraversalRingClosureBond);\n- };\n-\n auto isFlipped = false;\n \n- if (atom1->getDegree() == 3 &&\n+ if (atom1->getDegree() == 3 && // atom1ControllingBond == firstFromAtom1 &&\n std::find(stereoAtoms.begin(), stereoAtoms.end(),\n static_cast<int>(atom1ControllingBond->getOtherAtomIdx(\n atom1->getIdx()))) == stereoAtoms.end()) {\n isFlipped = true;\n atom2Dir = flipBondDir(atom2Dir);\n }\n- // std::cerr<<\" 0 set bond 2: \"<<firstFromAtom2->getIdx()<<\"\n- // \"<<atom2Dir<<std::endl;\n+ // std::cerr << \" 0 set bond 2: \" << firstFromAtom2->getIdx() << \" \"\n+ // << atom2Dir << std::endl;\n if (atom2->getDegree() == 3 &&\n std::find(stereoAtoms.begin(), stereoAtoms.end(),\n static_cast<int>(firstFromAtom2->getOtherAtomIdx(\n@@ -383,14 +384,12 @@ void canonicalizeDoubleBond(Bond *dblBond, UINT_VECT &bondVisitOrders,\n atom2Dir = flipBondDir(atom2Dir);\n }\n \n- if (!isFlipped && (isClosingRingBond(dblBond) ||\n- (isClosingRingBond(secondFromAtom1) &&\n- !secondFromAtom1->getIsAromatic() &&\n- secondFromAtom1->getBondDir() != Bond::NONE))) {\n+ if (!isFlipped && isClosingRingBond(dblBond)) {\n atom2Dir = flipBondDir(atom2Dir);\n }\n- // std::cerr<<\" 1 set bond 2: \"<<firstFromAtom2->getIdx()<<\"\n- // \"<<atom2Dir<<std::endl;\n+\n+ // std::cerr << \" 1 set bond 2: \" << firstFromAtom2->getIdx() << \" \"\n+ // << atom2Dir << std::endl;\n firstFromAtom2->setBondDir(atom2Dir);\n \n bondDirCounts[firstFromAtom2->getIdx()] += 1;\n@@ -554,7 +553,11 @@ void canonicalizeDoubleBond(Bond *dblBond, UINT_VECT &bondVisitOrders,\n if (dblBondPresent && otherAtom3Bond &&\n otherAtom3Bond->getBondDir() == Bond::NONE) {\n // std::cerr<<\"set!\"<<std::endl;\n- otherAtom3Bond->setBondDir(firstFromAtom2->getBondDir());\n+ auto dir = firstFromAtom2->getBondDir();\n+ if (isClosingRingBond(otherAtom3Bond)) {\n+ dir = flipBondDir(dir);\n+ }\n+ otherAtom3Bond->setBondDir(dir);\n bondDirCounts[otherAtom3Bond->getIdx()] += 1;\n atomDirCounts[atom3->getIdx()] += 1;\n }\n"}, "test": {"test_patch": "diff --git a/Code/GraphMol/SmilesParse/catch_tests.cpp b/Code/GraphMol/SmilesParse/catch_tests.cpp\nindex 98666d76263..3b41b5d1483 100644\n--- a/Code/GraphMol/SmilesParse/catch_tests.cpp\n+++ b/Code/GraphMol/SmilesParse/catch_tests.cpp\n@@ -1586,4 +1586,264 @@ TEST_CASE(\n CHECK(m->getProp<std::string>(\"_Name\") == \"|$_AV:bar;;foo$| name\");\n }\n }\n+}\n+\n+TEST_CASE(\"Github #4582: double bonds and ring closures\") {\n+ auto mol = R\"CTAB(CHEMBL409450\n+ RDKit 2D\n+\n+ 22 25 0 0 0 0 0 0 0 0999 V2000\n+ -1.1669 1.3591 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\n+ -0.6820 0.6916 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\n+ -1.9516 1.1041 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\n+ -1.9516 0.2791 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0\n+ -2.5647 1.6562 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\n+ -2.3931 2.4631 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\n+ -1.6085 2.7181 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\n+ -0.9954 2.1661 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\n+ -1.1669 0.0242 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\n+ -0.9120 -0.7604 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\n+ -1.3969 -1.4279 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\n+ -0.9120 -2.0953 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0\n+ -0.1274 -1.8404 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\n+ -0.1274 -1.0154 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\n+ 0.5871 -2.2529 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\n+ 1.3016 -1.8404 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\n+ 1.3016 -1.0154 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\n+ 0.5871 -0.6029 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\n+ -2.2219 -1.4279 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0\n+ 0.1430 0.6916 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0\n+ 0.5555 1.4061 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0\n+ 2.0160 -2.2529 0.0000 Br 0 0 0 0 0 0 0 0 0 0 0 0\n+ 1 2 1 0\n+ 1 3 2 0\n+ 1 8 1 0\n+ 9 2 1 0\n+ 2 20 2 0\n+ 3 4 1 0\n+ 3 5 1 0\n+ 9 4 1 0\n+ 5 6 2 0\n+ 6 7 1 0\n+ 8 7 2 0\n+ 9 10 2 0\n+ 10 11 1 0\n+ 10 14 1 0\n+ 11 12 1 0\n+ 11 19 2 0\n+ 13 12 1 0\n+ 13 14 2 0\n+ 13 15 1 0\n+ 14 18 1 0\n+ 15 16 2 0\n+ 16 17 1 0\n+ 22 16 1 0\n+ 17 18 2 0\n+ 20 21 1 0\n+M END)CTAB\"_ctab;\n+ REQUIRE(mol);\n+ auto dbond = mol->getBondBetweenAtoms(1, 19);\n+ REQUIRE(dbond);\n+ CHECK(dbond->getBondType() == Bond::BondType::DOUBLE);\n+ CHECK((dbond->getStereo() == Bond::BondStereo::STEREOE ||\n+ dbond->getStereo() == Bond::BondStereo::STEREOTRANS));\n+ CHECK(dbond->getStereoAtoms() == std::vector<int>{8, 20});\n+ auto csmiles = MolToSmiles(*mol);\n+ CHECK(csmiles == \"O=C1Nc2cc(Br)ccc2/C1=C1/Nc2ccccc2/C1=N\\\\O\");\n+\n+#if 0\n+ // FIX: this test fails. The SMILES generated for this random permutation\n+ // has the stereo for one of the double bonds wrong.\n+ SECTION(\"specific random output\") {\n+ SmilesWriteParams ps;\n+ ps.doRandom = true;\n+ getRandomGenerator(51)();\n+ auto rsmiles = MolToSmiles(*mol, ps);\n+ std::unique_ptr<RWMol> mol2(SmilesToMol(rsmiles));\n+ REQUIRE(mol2);\n+ auto smiles = MolToSmiles(*mol2);\n+ if (smiles != csmiles) {\n+ std::cerr << smiles << std::endl;\n+ }\n+ CHECK(smiles == csmiles);\n+ }\n+#endif\n+\n+ SECTION(\"bulk random output order\") {\n+ auto csmiles = MolToSmiles(*mol);\n+ CHECK(csmiles == \"O=C1Nc2cc(Br)ccc2/C1=C1/Nc2ccccc2/C1=N\\\\O\");\n+ SmilesWriteParams ps;\n+ ps.doRandom = true;\n+ for (auto i = 0u; i < 100; ++i) {\n+ if (i == 50) {\n+ // we know this one fails (it's explicitly tested above)\n+ continue;\n+ }\n+ getRandomGenerator(i + 1)();\n+ auto rsmiles = MolToSmiles(*mol, ps);\n+ std::unique_ptr<RWMol> mol2(SmilesToMol(rsmiles));\n+ REQUIRE(mol2);\n+ auto smiles = MolToSmiles(*mol2);\n+ if (smiles != csmiles) {\n+ std::cerr << \">>> \" << i << \" \" << rsmiles << std::endl;\n+ }\n+ CHECK(smiles == csmiles);\n+ }\n+ }\n+}\n+\n+TEST_CASE(\"Github #4582 continued: double bonds and ring closures\") {\n+ SECTION(\"basics\") {\n+ auto mol = R\"CTAB(\n+ Mrv2108 10072106112D \n+\n+ 11 11 0 0 0 0 999 V2000\n+ 1.2097 -1.0517 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\n+ 0.3651 -1.1116 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\n+ 1.0571 0.9536 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\n+ -0.2670 -0.5667 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\n+ 1.7001 0.4032 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\n+ -0.3269 0.2561 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\n+ 0.2180 0.8882 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\n+ 1.7601 -0.4305 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\n+ 1.5763 -1.7848 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\n+ 1.1262 -2.4676 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0\n+ 1.4920 -3.1990 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\n+ 8 1 1 0 0 0 0\n+ 1 2 2 0 0 0 0\n+ 5 3 1 0 0 0 0\n+ 7 3 1 0 0 0 0\n+ 4 2 1 0 0 0 0\n+ 5 8 1 0 0 0 0\n+ 6 7 1 0 0 0 0\n+ 1 9 1 0 0 0 0\n+ 9 10 2 0 0 0 0\n+ 10 11 1 0 0 0 0\n+ 6 4 1 0 0 0 0\n+M END)CTAB\"_ctab;\n+ REQUIRE(mol);\n+ auto csmiles = MolToSmiles(*mol);\n+ std::cerr << csmiles << std::endl;\n+ CHECK(csmiles == \"C/N=C/C1=C/CCCCCC1\");\n+ }\n+ SECTION(\"github #3967 part 1\") {\n+ // duplicating a test from elsewhere\n+ auto mol = \"C=c1s/c2n(c1=O)CCCCCCC\\\\N=2\"_smiles;\n+ REQUIRE(mol);\n+ auto smi = MolToSmiles(*mol);\n+ CHECK(smi == \"C=c1s/c2n(c1=O)CCCCCCC\\\\N=2\");\n+ }\n+ SECTION(\"github #3967 part 2\") {\n+ // duplicating a test from elsewhere\n+ auto mol = R\"SMI(C1=CC/C=C2C3=C/CC=CC=CC\\3C\\2C=C1)SMI\"_smiles;\n+ REQUIRE(mol);\n+ auto smi = MolToSmiles(*mol);\n+ CHECK(smi == R\"SMI(C1=CC/C=C2C3=C\\CC=CC=CC/3C\\2C=C1)SMI\");\n+ }\n+ SECTION(\"CHEMBL3623347\") {\n+ auto mol = R\"CTAB(CHEMBL3623347\n+ RDKit 2D\n+\n+ 44 47 0 0 0 0 0 0 0 0999 V2000\n+ -2.0000 1.0700 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\n+ -2.1400 -0.4700 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0\n+ -3.6400 -0.8300 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\n+ -4.4400 0.4800 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\n+ -3.4200 1.6600 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\n+ 2.2200 -1.9300 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\n+ 0.6700 -2.0400 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\n+ 1.9400 1.7500 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\n+ -0.4900 -1.0400 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\n+ 3.1200 0.7400 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\n+ 5.5400 0.1400 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\n+ 4.5400 1.3300 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\n+ -0.6000 0.4700 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\n+ 0.4000 1.6300 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\n+ -0.4000 2.9600 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\n+ -1.8800 2.6000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\n+ 3.6604 2.1462 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\n+ 5.6965 1.6501 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0\n+ 3.2764 1.7277 0.0000 H 0 0 0 0 0 0 0 0 0 0 0 0\n+ 0.9496 2.6967 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\n+ -1.4143 -0.1105 0.0000 H 0 0 0 0 0 0 0 0 0 0 0 0\n+ -3.6960 2.8278 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\n+ -4.2128 -2.2139 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\n+ -3.2997 -3.4050 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\n+ -3.7586 -4.5137 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\n+ -2.1099 -3.2485 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\n+ 4.7200 -1.1200 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\n+ 3.2300 -0.7900 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\n+ 5.1740 -2.2308 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0\n+ 2.8927 -3.2754 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\n+ 2.0667 -4.5284 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0\n+ 2.7380 -5.8707 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\n+ 1.9120 -7.1238 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\n+ 2.5833 -8.4661 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\n+ 1.7573 -9.7192 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\n+ 2.4287 -11.0615 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\n+ 3.9267 -11.1538 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\n+ 4.4623 -12.2277 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0\n+ 4.5892 -10.1533 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0\n+ 1.6027 -12.3146 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0\n+ 2.2740 -13.6569 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\n+ 3.4719 -13.7282 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\n+ 1.6136 -14.6588 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0\n+ 3.5388 -1.7411 0.0000 H 0 0 0 0 0 0 0 0 0 0 0 0\n+ 1 2 1 6\n+ 3 2 1 0\n+ 3 4 1 0\n+ 4 5 1 0\n+ 5 1 1 0\n+ 28 6 1 0\n+ 6 7 2 0\n+ 10 8 1 0\n+ 8 14 1 0\n+ 13 9 1 0\n+ 9 7 1 0\n+ 10 28 1 0\n+ 27 11 1 0\n+ 11 12 1 0\n+ 12 10 1 0\n+ 13 14 1 0\n+ 14 15 1 0\n+ 15 16 1 0\n+ 16 1 1 0\n+ 1 13 1 0\n+ 12 17 1 1\n+ 12 18 1 0\n+ 10 19 1 1\n+ 14 20 1 1\n+ 13 21 1 6\n+ 5 22 1 6\n+ 3 23 1 1\n+ 23 24 2 0\n+ 24 25 1 0\n+ 24 26 1 0\n+ 27 28 1 0\n+ 27 29 2 0\n+ 6 30 1 0\n+ 30 31 2 0\n+ 31 32 1 0\n+ 32 33 1 0\n+ 33 34 1 0\n+ 34 35 1 0\n+ 35 36 1 0\n+ 36 37 1 0\n+ 37 38 2 0\n+ 37 39 1 0\n+ 36 40 1 1\n+ 40 41 1 0\n+ 41 42 1 0\n+ 41 43 2 0\n+ 28 44 1 1\n+M END)CTAB\"_ctab;\n+ REQUIRE(mol);\n+ auto csmiles = MolToSmiles(*mol);\n+ std::cerr << csmiles << std::endl;\n+ CHECK(\n+ csmiles ==\n+ \"CC(=O)N[C@@H](CCCC/N=C/C1=C/\"\n+ \"C[C@H]2[C@@]3(CC[C@]2(C)C[C@H]2[C@@H]1C(=O)C[C@@]2(C)O)O[C@@H](C=C(C)\"\n+ \"C)C[C@@H]3C)C(=O)O\");\n+ }\n }\n\\ No newline at end of file\ndiff --git a/Code/GraphMol/SmilesParse/test.cpp b/Code/GraphMol/SmilesParse/test.cpp\nindex acd125bdfcb..c0264c67e36 100644\n--- a/Code/GraphMol/SmilesParse/test.cpp\n+++ b/Code/GraphMol/SmilesParse/test.cpp\n@@ -4352,13 +4352,15 @@ void testGithub3967() {\n auto mol = \"C=c1s/c2n(c1=O)CCCCCCC\\\\N=2\"_smiles;\n TEST_ASSERT(mol);\n auto smi = MolToSmiles(*mol);\n+ std::cerr << smi << std::endl;\n TEST_ASSERT(smi == \"C=c1s/c2n(c1=O)CCCCCCC\\\\N=2\");\n }\n {\n- auto mol = \"C1=C\\\\C/C=C2C3=C/C/C=C\\\\C=C/C\\\\3C\\\\2\\\\C=C/1\"_smiles;\n+ auto mol = R\"SMI(C1=C\\C/C=C2C3=C/C/C=C\\C=C/C\\3C\\2\\C=C/1)SMI\"_smiles;\n TEST_ASSERT(mol);\n auto smi = MolToSmiles(*mol);\n- TEST_ASSERT(smi == \"C1=C\\\\C/C=C2C3=C/C/C=C\\\\C=C/C\\\\3C\\\\2\\\\C=C/1\");\n+ std::cerr << smi << std::endl;\n+ TEST_ASSERT(smi == R\"SMI(C1=C\\C/C=C2C3=C\\C/C=C\\C=C/C/3C\\2\\C=C/1)SMI\");\n }\n BOOST_LOG(rdInfoLog) << \"\\tdone\" << std::endl;\n }\n", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}208{"question_id": "MSB_rdkit_rdkit_pr4883", "question_type": "multi_swe_bench", "description": "Fixes #4878: cannot parse coordinate bonds from CXSMARTS (rdkit/rdkit#4883)", "content": {"org": "rdkit", "repo": "rdkit", "pr_number": 4883, "issue_title": "Fixes #4878: cannot parse coordinate bonds from CXSMARTS", "issue_body": "this one slipped through the cracks when adding support for coordinate bonds to the SMILES parser", "base_commit": "9b99cacc0bfed1c618f1c5cf390edbbdcf2108b5", "resolved_issues": [{"number": 4878, "title": "cannot parse coordinate bonds from CXSMARTS", "body": "**Describe the bug**\r\nHere's the reproducible:\r\n```\r\nIn [14]: m = Chem.MolFromSmarts('[Fe]OC |C:1.0|')\r\n[16:59:13] BOND NOT FOUND! 0 involving atom 1\r\n```\r\ndemonstration that it works with SMILES:\r\n```\r\nIn [15]: m = Chem.MolFromSmiles('[Fe]OC |C:1.0|')\r\n```\r\nThe problem is that the modifications to track SMILES bond index were not added to the SMARTS parser.\r\n\r\n**Configuration (please complete the following information):**\r\n - RDKit version: current release and master\r\n - OS: all\r\n"}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/rdkit_m_rdkit:pr-4883", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/Code/GraphMol/SmilesParse/SmilesParse.cpp b/Code/GraphMol/SmilesParse/SmilesParse.cpp\nindex 1379852b468..a5a5da008e6 100644\n--- a/Code/GraphMol/SmilesParse/SmilesParse.cpp\n+++ b/Code/GraphMol/SmilesParse/SmilesParse.cpp\n@@ -64,8 +64,10 @@ int smarts_parse_helper(const std::string &inp,\n TEST_ASSERT(!yysmarts_lex_init(&scanner));\n try {\n size_t ltrim = setup_smarts_string(inp, scanner);\n- res = yysmarts_parse(inp.c_str() + ltrim, &molVect, atom, bond, scanner,\n- start_tok);\n+ unsigned numAtomsParsed = 0;\n+ unsigned numBondsParsed = 0;\n+ res = yysmarts_parse(inp.c_str() + ltrim, &molVect, atom, bond,\n+ numAtomsParsed, numBondsParsed, scanner, start_tok);\n } catch (...) {\n yysmarts_lex_destroy(scanner);\n throw;\ndiff --git a/Code/GraphMol/SmilesParse/smarts.tab.cpp.cmake b/Code/GraphMol/SmilesParse/smarts.tab.cpp.cmake\nindex 6d00ca0c998..5062d7e1778 100644\n--- a/Code/GraphMol/SmilesParse/smarts.tab.cpp.cmake\n+++ b/Code/GraphMol/SmilesParse/smarts.tab.cpp.cmake\n@@ -74,9 +74,8 @@\n #line 1 \"smarts.yy\"\n \n \n- // $Id$\n //\n- // Copyright (C) 2003-2018 Greg Landrum and Rational Discovery LLC\n+ // Copyright (C) 2003-2022 Greg Landrum and other RDKit contributors\n //\n // @@ All Rights Reserved @@\n //\n@@ -110,20 +109,16 @@ namespace {\n void\n yysmarts_error( const char *input,\n std::vector<RDKit::RWMol *> *ms,\n- RDKit::Atom* &lastAtom,\n- RDKit::Bond* &lastBond,\n-\t\tvoid *scanner,int start_token, const char * msg )\n+ RDKit::Atom* &,\n+ RDKit::Bond* &,\n+ unsigned int &,unsigned int &,\n+\t\tvoid *,int , const char *msg )\n {\n- RDUNUSED_PARAM(input);\n- RDUNUSED_PARAM(lastAtom);\n- RDUNUSED_PARAM(lastBond);\n- RDUNUSED_PARAM(scanner);\n- RDUNUSED_PARAM(start_token);\n yyErrorCleanup(ms);\n BOOST_LOG(rdErrorLog) << \"SMARTS Parse Error: \" << msg << \" while parsing: \" << input << std::endl;\n }\n \n-#line 127 \"/scratch/RDKit_git/Code/GraphMol/SmilesParse/smarts.tab.cpp\"\n+#line 122 \"/scratch/RDKit_git/Code/GraphMol/SmilesParse/smarts.tab.cpp\"\n \n # ifndef YY_CAST\n # ifdef __cplusplus\n@@ -221,14 +216,14 @@ extern int yysmarts_debug;\n #if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED\n union YYSTYPE\n {\n-#line 68 \"smarts.yy\"\n+#line 65 \"smarts.yy\"\n \n int moli;\n RDKit::QueryAtom * atom;\n RDKit::QueryBond * bond;\n int ival;\n \n-#line 232 \"/scratch/RDKit_git/Code/GraphMol/SmilesParse/smarts.tab.cpp\"\n+#line 227 \"/scratch/RDKit_git/Code/GraphMol/SmilesParse/smarts.tab.cpp\"\n \n };\n typedef union YYSTYPE YYSTYPE;\n@@ -238,14 +233,14 @@ typedef union YYSTYPE YYSTYPE;\n \n \n \n-int yysmarts_parse (const char *input, std::vector<RDKit::RWMol *> *molList, RDKit::Atom* &lastAtom, RDKit::Bond* &lastBond, void *scanner, int& start_token);\n+int yysmarts_parse (const char *input, std::vector<RDKit::RWMol *> *molList, RDKit::Atom* &lastAtom, RDKit::Bond* &lastBond, unsigned &numAtomsParsed, unsigned &numBondsParsed, void *scanner, int& start_token);\n /* \"%code provides\" blocks. */\n-#line 63 \"smarts.yy\"\n+#line 60 \"smarts.yy\"\n \n #define YY_DECL int yylex \\\n (YYSTYPE * yylval_param , yyscan_t yyscanner, int& start_token)\n \n-#line 249 \"/scratch/RDKit_git/Code/GraphMol/SmilesParse/smarts.tab.cpp\"\n+#line 244 \"/scratch/RDKit_git/Code/GraphMol/SmilesParse/smarts.tab.cpp\"\n \n #endif /* !YY_YYSMARTS_SCRATCH_RDKIT_GIT_CODE_GRAPHMOL_SMILESPARSE_SMARTS_TAB_HPP_INCLUDED */\n \n@@ -614,18 +609,18 @@ static const yytype_int8 yytranslate[] =\n /* YYRLINE[YYN] -- Source line where rule number YYN was defined. */\n static const yytype_int16 yyrline[] =\n {\n- 0, 112, 112, 115, 119, 122, 125, 129, 133, 136,\n- 141, 144, 152, 153, 154, 155, 163, 171, 196, 216,\n- 221, 252, 272, 285, 286, 297, 298, 299, 303, 326,\n- 330, 335, 341, 350, 356, 364, 372, 385, 391, 398,\n- 404, 427, 430, 436, 437, 441, 458, 482, 483, 488,\n- 489, 494, 495, 500, 501, 502, 503, 504, 505, 506,\n- 509, 512, 515, 518, 521, 524, 530, 536, 543, 551,\n- 559, 565, 571, 577, 583, 589, 590, 597, 598, 601,\n- 604, 607, 610, 613, 618, 626, 638, 643, 648, 652,\n- 656, 660, 663, 664, 671, 672, 678, 684, 690, 695,\n- 702, 703, 704, 705, 706, 707, 711, 712, 713, 714,\n- 715, 716, 717, 722, 723, 727, 728, 737, 738\n+ 0, 109, 109, 112, 116, 119, 122, 126, 130, 133,\n+ 138, 141, 149, 150, 151, 152, 160, 168, 194, 215,\n+ 220, 254, 275, 294, 295, 306, 307, 308, 312, 335,\n+ 339, 344, 350, 359, 365, 373, 381, 394, 400, 407,\n+ 413, 436, 439, 445, 446, 450, 467, 491, 492, 497,\n+ 498, 503, 504, 509, 510, 511, 512, 513, 514, 515,\n+ 518, 521, 524, 527, 530, 533, 539, 545, 552, 560,\n+ 568, 574, 580, 586, 592, 598, 599, 606, 607, 610,\n+ 613, 616, 619, 622, 627, 635, 647, 652, 657, 661,\n+ 665, 669, 672, 673, 680, 681, 687, 693, 699, 704,\n+ 711, 712, 713, 714, 715, 716, 720, 721, 722, 723,\n+ 724, 725, 726, 731, 732, 736, 737, 746, 747\n };\n #endif\n \n@@ -965,7 +960,7 @@ static const yytype_int8 yyr2[] =\n } \\\n else \\\n { \\\n- yyerror (input, molList, lastAtom, lastBond, scanner, start_token, YY_(\"syntax error: cannot back up\")); \\\n+ yyerror (input, molList, lastAtom, lastBond, numAtomsParsed, numBondsParsed, scanner, start_token, YY_(\"syntax error: cannot back up\")); \\\n YYERROR; \\\n } \\\n while (0)\n@@ -1002,7 +997,7 @@ do { \\\n { \\\n YYFPRINTF (stderr, \"%s \", Title); \\\n yy_symbol_print (stderr, \\\n- Type, Value, input, molList, lastAtom, lastBond, scanner, start_token); \\\n+ Type, Value, input, molList, lastAtom, lastBond, numAtomsParsed, numBondsParsed, scanner, start_token); \\\n YYFPRINTF (stderr, \"\\n\"); \\\n } \\\n } while (0)\n@@ -1013,7 +1008,7 @@ do { \\\n `-----------------------------------*/\n \n static void\n-yy_symbol_value_print (FILE *yyo, int yytype, YYSTYPE const * const yyvaluep, const char *input, std::vector<RDKit::RWMol *> *molList, RDKit::Atom* &lastAtom, RDKit::Bond* &lastBond, void *scanner, int& start_token)\n+yy_symbol_value_print (FILE *yyo, int yytype, YYSTYPE const * const yyvaluep, const char *input, std::vector<RDKit::RWMol *> *molList, RDKit::Atom* &lastAtom, RDKit::Bond* &lastBond, unsigned &numAtomsParsed, unsigned &numBondsParsed, void *scanner, int& start_token)\n {\n FILE *yyoutput = yyo;\n YYUSE (yyoutput);\n@@ -1021,6 +1016,8 @@ yy_symbol_value_print (FILE *yyo, int yytype, YYSTYPE const * const yyvaluep, co\n YYUSE (molList);\n YYUSE (lastAtom);\n YYUSE (lastBond);\n+ YYUSE (numAtomsParsed);\n+ YYUSE (numBondsParsed);\n YYUSE (scanner);\n YYUSE (start_token);\n if (!yyvaluep)\n@@ -1040,12 +1037,12 @@ yy_symbol_value_print (FILE *yyo, int yytype, YYSTYPE const * const yyvaluep, co\n `---------------------------*/\n \n static void\n-yy_symbol_print (FILE *yyo, int yytype, YYSTYPE const * const yyvaluep, const char *input, std::vector<RDKit::RWMol *> *molList, RDKit::Atom* &lastAtom, RDKit::Bond* &lastBond, void *scanner, int& start_token)\n+yy_symbol_print (FILE *yyo, int yytype, YYSTYPE const * const yyvaluep, const char *input, std::vector<RDKit::RWMol *> *molList, RDKit::Atom* &lastAtom, RDKit::Bond* &lastBond, unsigned &numAtomsParsed, unsigned &numBondsParsed, void *scanner, int& start_token)\n {\n YYFPRINTF (yyo, \"%s %s (\",\n yytype < YYNTOKENS ? \"token\" : \"nterm\", yytname[yytype]);\n \n- yy_symbol_value_print (yyo, yytype, yyvaluep, input, molList, lastAtom, lastBond, scanner, start_token);\n+ yy_symbol_value_print (yyo, yytype, yyvaluep, input, molList, lastAtom, lastBond, numAtomsParsed, numBondsParsed, scanner, start_token);\n YYFPRINTF (yyo, \")\");\n }\n \n@@ -1078,7 +1075,7 @@ do { \\\n `------------------------------------------------*/\n \n static void\n-yy_reduce_print (yy_state_t *yyssp, YYSTYPE *yyvsp, int yyrule, const char *input, std::vector<RDKit::RWMol *> *molList, RDKit::Atom* &lastAtom, RDKit::Bond* &lastBond, void *scanner, int& start_token)\n+yy_reduce_print (yy_state_t *yyssp, YYSTYPE *yyvsp, int yyrule, const char *input, std::vector<RDKit::RWMol *> *molList, RDKit::Atom* &lastAtom, RDKit::Bond* &lastBond, unsigned &numAtomsParsed, unsigned &numBondsParsed, void *scanner, int& start_token)\n {\n int yylno = yyrline[yyrule];\n int yynrhs = yyr2[yyrule];\n@@ -1092,7 +1089,7 @@ yy_reduce_print (yy_state_t *yyssp, YYSTYPE *yyvsp, int yyrule, const char *inpu\n yy_symbol_print (stderr,\n yystos[+yyssp[yyi + 1 - yynrhs]],\n &yyvsp[(yyi + 1) - (yynrhs)]\n- , input, molList, lastAtom, lastBond, scanner, start_token);\n+ , input, molList, lastAtom, lastBond, numAtomsParsed, numBondsParsed, scanner, start_token);\n YYFPRINTF (stderr, \"\\n\");\n }\n }\n@@ -1100,7 +1097,7 @@ yy_reduce_print (yy_state_t *yyssp, YYSTYPE *yyvsp, int yyrule, const char *inpu\n # define YY_REDUCE_PRINT(Rule) \\\n do { \\\n if (yydebug) \\\n- yy_reduce_print (yyssp, yyvsp, Rule, input, molList, lastAtom, lastBond, scanner, start_token); \\\n+ yy_reduce_print (yyssp, yyvsp, Rule, input, molList, lastAtom, lastBond, numAtomsParsed, numBondsParsed, scanner, start_token); \\\n } while (0)\n \n /* Nonzero means print parse trace. It is left uninitialized so that\n@@ -1368,13 +1365,15 @@ yysyntax_error (YYPTRDIFF_T *yymsg_alloc, char **yymsg,\n `-----------------------------------------------*/\n \n static void\n-yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep, const char *input, std::vector<RDKit::RWMol *> *molList, RDKit::Atom* &lastAtom, RDKit::Bond* &lastBond, void *scanner, int& start_token)\n+yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep, const char *input, std::vector<RDKit::RWMol *> *molList, RDKit::Atom* &lastAtom, RDKit::Bond* &lastBond, unsigned &numAtomsParsed, unsigned &numBondsParsed, void *scanner, int& start_token)\n {\n YYUSE (yyvaluep);\n YYUSE (input);\n YYUSE (molList);\n YYUSE (lastAtom);\n YYUSE (lastBond);\n+ YYUSE (numAtomsParsed);\n+ YYUSE (numBondsParsed);\n YYUSE (scanner);\n YYUSE (start_token);\n if (!yymsg)\n@@ -1385,135 +1384,135 @@ yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep, const char *input,\n switch (yytype)\n {\n case 8: /* ATOM_TOKEN */\n-#line 103 \"smarts.yy\"\n+#line 100 \"smarts.yy\"\n { delete ((*yyvaluep).atom); }\n-#line 1391 \"/scratch/RDKit_git/Code/GraphMol/SmilesParse/smarts.tab.cpp\"\n+#line 1390 \"/scratch/RDKit_git/Code/GraphMol/SmilesParse/smarts.tab.cpp\"\n break;\n \n case 9: /* SIMPLE_ATOM_QUERY_TOKEN */\n-#line 103 \"smarts.yy\"\n+#line 100 \"smarts.yy\"\n { delete ((*yyvaluep).atom); }\n-#line 1397 \"/scratch/RDKit_git/Code/GraphMol/SmilesParse/smarts.tab.cpp\"\n+#line 1396 \"/scratch/RDKit_git/Code/GraphMol/SmilesParse/smarts.tab.cpp\"\n break;\n \n case 10: /* COMPLEX_ATOM_QUERY_TOKEN */\n-#line 103 \"smarts.yy\"\n+#line 100 \"smarts.yy\"\n { delete ((*yyvaluep).atom); }\n-#line 1403 \"/scratch/RDKit_git/Code/GraphMol/SmilesParse/smarts.tab.cpp\"\n+#line 1402 \"/scratch/RDKit_git/Code/GraphMol/SmilesParse/smarts.tab.cpp\"\n break;\n \n case 11: /* RINGSIZE_ATOM_QUERY_TOKEN */\n-#line 103 \"smarts.yy\"\n+#line 100 \"smarts.yy\"\n { delete ((*yyvaluep).atom); }\n-#line 1409 \"/scratch/RDKit_git/Code/GraphMol/SmilesParse/smarts.tab.cpp\"\n+#line 1408 \"/scratch/RDKit_git/Code/GraphMol/SmilesParse/smarts.tab.cpp\"\n break;\n \n case 12: /* RINGBOND_ATOM_QUERY_TOKEN */\n-#line 103 \"smarts.yy\"\n+#line 100 \"smarts.yy\"\n { delete ((*yyvaluep).atom); }\n-#line 1415 \"/scratch/RDKit_git/Code/GraphMol/SmilesParse/smarts.tab.cpp\"\n+#line 1414 \"/scratch/RDKit_git/Code/GraphMol/SmilesParse/smarts.tab.cpp\"\n break;\n \n case 13: /* IMPLICIT_H_ATOM_QUERY_TOKEN */\n-#line 103 \"smarts.yy\"\n+#line 100 \"smarts.yy\"\n { delete ((*yyvaluep).atom); }\n-#line 1421 \"/scratch/RDKit_git/Code/GraphMol/SmilesParse/smarts.tab.cpp\"\n+#line 1420 \"/scratch/RDKit_git/Code/GraphMol/SmilesParse/smarts.tab.cpp\"\n break;\n \n case 14: /* HYB_TOKEN */\n-#line 103 \"smarts.yy\"\n+#line 100 \"smarts.yy\"\n { delete ((*yyvaluep).atom); }\n-#line 1427 \"/scratch/RDKit_git/Code/GraphMol/SmilesParse/smarts.tab.cpp\"\n+#line 1426 \"/scratch/RDKit_git/Code/GraphMol/SmilesParse/smarts.tab.cpp\"\n break;\n \n case 15: /* HETERONEIGHBOR_ATOM_QUERY_TOKEN */\n-#line 103 \"smarts.yy\"\n+#line 100 \"smarts.yy\"\n { delete ((*yyvaluep).atom); }\n-#line 1433 \"/scratch/RDKit_git/Code/GraphMol/SmilesParse/smarts.tab.cpp\"\n+#line 1432 \"/scratch/RDKit_git/Code/GraphMol/SmilesParse/smarts.tab.cpp\"\n break;\n \n case 16: /* ALIPHATIC */\n-#line 103 \"smarts.yy\"\n+#line 100 \"smarts.yy\"\n { delete ((*yyvaluep).atom); }\n-#line 1439 \"/scratch/RDKit_git/Code/GraphMol/SmilesParse/smarts.tab.cpp\"\n+#line 1438 \"/scratch/RDKit_git/Code/GraphMol/SmilesParse/smarts.tab.cpp\"\n break;\n \n case 17: /* ALIPHATICHETERONEIGHBOR_ATOM_QUERY_TOKEN */\n-#line 103 \"smarts.yy\"\n+#line 100 \"smarts.yy\"\n { delete ((*yyvaluep).atom); }\n-#line 1445 \"/scratch/RDKit_git/Code/GraphMol/SmilesParse/smarts.tab.cpp\"\n+#line 1444 \"/scratch/RDKit_git/Code/GraphMol/SmilesParse/smarts.tab.cpp\"\n break;\n \n case 44: /* BOND_TOKEN */\n-#line 104 \"smarts.yy\"\n+#line 101 \"smarts.yy\"\n { delete ((*yyvaluep).bond); }\n-#line 1451 \"/scratch/RDKit_git/Code/GraphMol/SmilesParse/smarts.tab.cpp\"\n+#line 1450 \"/scratch/RDKit_git/Code/GraphMol/SmilesParse/smarts.tab.cpp\"\n break;\n \n case 51: /* atomd */\n-#line 103 \"smarts.yy\"\n+#line 100 \"smarts.yy\"\n { delete ((*yyvaluep).atom); }\n-#line 1457 \"/scratch/RDKit_git/Code/GraphMol/SmilesParse/smarts.tab.cpp\"\n+#line 1456 \"/scratch/RDKit_git/Code/GraphMol/SmilesParse/smarts.tab.cpp\"\n break;\n \n case 52: /* hydrogen_atom */\n-#line 103 \"smarts.yy\"\n+#line 100 \"smarts.yy\"\n { delete ((*yyvaluep).atom); }\n-#line 1463 \"/scratch/RDKit_git/Code/GraphMol/SmilesParse/smarts.tab.cpp\"\n+#line 1462 \"/scratch/RDKit_git/Code/GraphMol/SmilesParse/smarts.tab.cpp\"\n break;\n \n case 53: /* atom_expr */\n-#line 103 \"smarts.yy\"\n+#line 100 \"smarts.yy\"\n { delete ((*yyvaluep).atom); }\n-#line 1469 \"/scratch/RDKit_git/Code/GraphMol/SmilesParse/smarts.tab.cpp\"\n+#line 1468 \"/scratch/RDKit_git/Code/GraphMol/SmilesParse/smarts.tab.cpp\"\n break;\n \n case 54: /* point_query */\n-#line 103 \"smarts.yy\"\n+#line 100 \"smarts.yy\"\n { delete ((*yyvaluep).atom); }\n-#line 1475 \"/scratch/RDKit_git/Code/GraphMol/SmilesParse/smarts.tab.cpp\"\n+#line 1474 \"/scratch/RDKit_git/Code/GraphMol/SmilesParse/smarts.tab.cpp\"\n break;\n \n case 55: /* recursive_query */\n-#line 103 \"smarts.yy\"\n+#line 100 \"smarts.yy\"\n { delete ((*yyvaluep).atom); }\n-#line 1481 \"/scratch/RDKit_git/Code/GraphMol/SmilesParse/smarts.tab.cpp\"\n+#line 1480 \"/scratch/RDKit_git/Code/GraphMol/SmilesParse/smarts.tab.cpp\"\n break;\n \n case 56: /* atom_query */\n-#line 103 \"smarts.yy\"\n+#line 100 \"smarts.yy\"\n { delete ((*yyvaluep).atom); }\n-#line 1487 \"/scratch/RDKit_git/Code/GraphMol/SmilesParse/smarts.tab.cpp\"\n+#line 1486 \"/scratch/RDKit_git/Code/GraphMol/SmilesParse/smarts.tab.cpp\"\n break;\n \n case 57: /* possible_range_query */\n-#line 103 \"smarts.yy\"\n+#line 100 \"smarts.yy\"\n { delete ((*yyvaluep).atom); }\n-#line 1493 \"/scratch/RDKit_git/Code/GraphMol/SmilesParse/smarts.tab.cpp\"\n+#line 1492 \"/scratch/RDKit_git/Code/GraphMol/SmilesParse/smarts.tab.cpp\"\n break;\n \n case 58: /* simple_atom */\n-#line 103 \"smarts.yy\"\n+#line 100 \"smarts.yy\"\n { delete ((*yyvaluep).atom); }\n-#line 1499 \"/scratch/RDKit_git/Code/GraphMol/SmilesParse/smarts.tab.cpp\"\n+#line 1498 \"/scratch/RDKit_git/Code/GraphMol/SmilesParse/smarts.tab.cpp\"\n break;\n \n case 59: /* bond_expr */\n-#line 104 \"smarts.yy\"\n+#line 101 \"smarts.yy\"\n { delete ((*yyvaluep).bond); }\n-#line 1505 \"/scratch/RDKit_git/Code/GraphMol/SmilesParse/smarts.tab.cpp\"\n+#line 1504 \"/scratch/RDKit_git/Code/GraphMol/SmilesParse/smarts.tab.cpp\"\n break;\n \n case 60: /* bond_query */\n-#line 104 \"smarts.yy\"\n+#line 101 \"smarts.yy\"\n { delete ((*yyvaluep).bond); }\n-#line 1511 \"/scratch/RDKit_git/Code/GraphMol/SmilesParse/smarts.tab.cpp\"\n+#line 1510 \"/scratch/RDKit_git/Code/GraphMol/SmilesParse/smarts.tab.cpp\"\n break;\n \n case 61: /* bondd */\n-#line 104 \"smarts.yy\"\n+#line 101 \"smarts.yy\"\n { delete ((*yyvaluep).bond); }\n-#line 1517 \"/scratch/RDKit_git/Code/GraphMol/SmilesParse/smarts.tab.cpp\"\n+#line 1516 \"/scratch/RDKit_git/Code/GraphMol/SmilesParse/smarts.tab.cpp\"\n break;\n \n default:\n@@ -1530,7 +1529,7 @@ yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep, const char *input,\n `----------*/\n \n int\n-yyparse (const char *input, std::vector<RDKit::RWMol *> *molList, RDKit::Atom* &lastAtom, RDKit::Bond* &lastBond, void *scanner, int& start_token)\n+yyparse (const char *input, std::vector<RDKit::RWMol *> *molList, RDKit::Atom* &lastAtom, RDKit::Bond* &lastBond, unsigned &numAtomsParsed, unsigned &numBondsParsed, void *scanner, int& start_token)\n {\n /* The lookahead symbol. */\n int yychar;\n@@ -1785,103 +1784,103 @@ yyreduce:\n switch (yyn)\n {\n case 2:\n-#line 112 \"smarts.yy\"\n+#line 109 \"smarts.yy\"\n {\n // the molList has already been updated, no need to do anything\n }\n-#line 1793 \"/scratch/RDKit_git/Code/GraphMol/SmilesParse/smarts.tab.cpp\"\n+#line 1792 \"/scratch/RDKit_git/Code/GraphMol/SmilesParse/smarts.tab.cpp\"\n break;\n \n case 3:\n-#line 115 \"smarts.yy\"\n+#line 112 \"smarts.yy\"\n {\n lastAtom = (yyvsp[-1].atom);\n YYACCEPT;\n }\n-#line 1802 \"/scratch/RDKit_git/Code/GraphMol/SmilesParse/smarts.tab.cpp\"\n+#line 1801 \"/scratch/RDKit_git/Code/GraphMol/SmilesParse/smarts.tab.cpp\"\n break;\n \n case 4:\n-#line 119 \"smarts.yy\"\n+#line 116 \"smarts.yy\"\n {\n YYABORT;\n }\n-#line 1810 \"/scratch/RDKit_git/Code/GraphMol/SmilesParse/smarts.tab.cpp\"\n+#line 1809 \"/scratch/RDKit_git/Code/GraphMol/SmilesParse/smarts.tab.cpp\"\n break;\n \n case 5:\n-#line 122 \"smarts.yy\"\n+#line 119 \"smarts.yy\"\n {\n YYABORT;\n }\n-#line 1818 \"/scratch/RDKit_git/Code/GraphMol/SmilesParse/smarts.tab.cpp\"\n+#line 1817 \"/scratch/RDKit_git/Code/GraphMol/SmilesParse/smarts.tab.cpp\"\n break;\n \n case 6:\n-#line 125 \"smarts.yy\"\n+#line 122 \"smarts.yy\"\n {\n lastBond = (yyvsp[-1].bond);\n YYACCEPT;\n }\n-#line 1827 \"/scratch/RDKit_git/Code/GraphMol/SmilesParse/smarts.tab.cpp\"\n+#line 1826 \"/scratch/RDKit_git/Code/GraphMol/SmilesParse/smarts.tab.cpp\"\n break;\n \n case 7:\n-#line 129 \"smarts.yy\"\n+#line 126 \"smarts.yy\"\n {\n delete (yyvsp[0].bond);\n YYABORT;\n }\n-#line 1836 \"/scratch/RDKit_git/Code/GraphMol/SmilesParse/smarts.tab.cpp\"\n+#line 1835 \"/scratch/RDKit_git/Code/GraphMol/SmilesParse/smarts.tab.cpp\"\n break;\n \n case 8:\n-#line 133 \"smarts.yy\"\n+#line 130 \"smarts.yy\"\n {\n YYABORT;\n }\n-#line 1844 \"/scratch/RDKit_git/Code/GraphMol/SmilesParse/smarts.tab.cpp\"\n+#line 1843 \"/scratch/RDKit_git/Code/GraphMol/SmilesParse/smarts.tab.cpp\"\n break;\n \n case 9:\n-#line 136 \"smarts.yy\"\n+#line 133 \"smarts.yy\"\n {\n yyerrok;\n yyErrorCleanup(molList);\n YYABORT;\n }\n-#line 1854 \"/scratch/RDKit_git/Code/GraphMol/SmilesParse/smarts.tab.cpp\"\n+#line 1853 \"/scratch/RDKit_git/Code/GraphMol/SmilesParse/smarts.tab.cpp\"\n break;\n \n case 10:\n-#line 141 \"smarts.yy\"\n+#line 138 \"smarts.yy\"\n {\n YYACCEPT;\n }\n-#line 1862 \"/scratch/RDKit_git/Code/GraphMol/SmilesParse/smarts.tab.cpp\"\n+#line 1861 \"/scratch/RDKit_git/Code/GraphMol/SmilesParse/smarts.tab.cpp\"\n break;\n \n case 11:\n-#line 144 \"smarts.yy\"\n+#line 141 \"smarts.yy\"\n {\n yyerrok;\n yyErrorCleanup(molList);\n YYABORT;\n }\n-#line 1872 \"/scratch/RDKit_git/Code/GraphMol/SmilesParse/smarts.tab.cpp\"\n+#line 1871 \"/scratch/RDKit_git/Code/GraphMol/SmilesParse/smarts.tab.cpp\"\n break;\n \n case 15:\n-#line 155 \"smarts.yy\"\n+#line 152 \"smarts.yy\"\n {\n delete (yyvsp[0].atom);\n YYABORT;\n }\n-#line 1881 \"/scratch/RDKit_git/Code/GraphMol/SmilesParse/smarts.tab.cpp\"\n+#line 1880 \"/scratch/RDKit_git/Code/GraphMol/SmilesParse/smarts.tab.cpp\"\n break;\n \n case 16:\n-#line 163 \"smarts.yy\"\n+#line 160 \"smarts.yy\"\n {\n int sz = molList->size();\n molList->resize( sz + 1);\n@@ -1890,11 +1889,11 @@ yyreduce:\n //delete $1;\n (yyval.moli) = sz;\n }\n-#line 1894 \"/scratch/RDKit_git/Code/GraphMol/SmilesParse/smarts.tab.cpp\"\n+#line 1893 \"/scratch/RDKit_git/Code/GraphMol/SmilesParse/smarts.tab.cpp\"\n break;\n \n case 17:\n-#line 171 \"smarts.yy\"\n+#line 168 \"smarts.yy\"\n {\n RWMol *mp = (*molList)[(yyval.moli)];\n Atom *a1 = mp->getActiveAtom();\n@@ -1915,6 +1914,7 @@ yyreduce:\n newB->setOwningMol(mp);\n newB->setBeginAtomIdx(atomIdx1);\n newB->setEndAtomIdx(atomIdx2);\n+ newB->setProp(\"_cxsmilesBondIdx\",numBondsParsed++);\n mp->addBond(newB);\n delete newB;\n //delete $2;\n@@ -1923,7 +1923,7 @@ yyreduce:\n break;\n \n case 18:\n-#line 196 \"smarts.yy\"\n+#line 194 \"smarts.yy\"\n {\n RWMol *mp = (*molList)[(yyval.moli)];\n int atomIdx1 = mp->getActiveAtom()->getIdx();\n@@ -1940,23 +1940,24 @@ yyreduce:\n (yyvsp[-1].bond)->setBeginAtomIdx(atomIdx1);\n (yyvsp[-1].bond)->setEndAtomIdx(atomIdx2);\n }\n+ (yyvsp[-1].bond)->setProp(\"_cxsmilesBondIdx\",numBondsParsed++);\n mp->addBond((yyvsp[-1].bond));\n delete (yyvsp[-1].bond);\n }\n-#line 1947 \"/scratch/RDKit_git/Code/GraphMol/SmilesParse/smarts.tab.cpp\"\n+#line 1948 \"/scratch/RDKit_git/Code/GraphMol/SmilesParse/smarts.tab.cpp\"\n break;\n \n case 19:\n-#line 216 \"smarts.yy\"\n+#line 215 \"smarts.yy\"\n {\n RWMol *mp = (*molList)[(yyval.moli)];\n mp->addAtom((yyvsp[0].atom),true,true);\n }\n-#line 1956 \"/scratch/RDKit_git/Code/GraphMol/SmilesParse/smarts.tab.cpp\"\n+#line 1957 \"/scratch/RDKit_git/Code/GraphMol/SmilesParse/smarts.tab.cpp\"\n break;\n \n case 20:\n-#line 221 \"smarts.yy\"\n+#line 220 \"smarts.yy\"\n {\n RWMol * mp = (*molList)[(yyval.moli)];\n Atom *atom=mp->getActiveAtom();\n@@ -1975,6 +1976,9 @@ yyreduce:\n newB->setOwningMol(mp);\n newB->setBeginAtomIdx(atom->getIdx());\n mp->setBondBookmark(newB,(yyvsp[0].ival));\n+ if(!(mp->getAllBondsWithBookmark((yyvsp[0].ival)).size()%2)){\n+ newB->setProp(\"_cxsmilesBondIdx\",numBondsParsed++);\n+ }\n mp->setAtomBookmark(atom,(yyvsp[0].ival));\n \n SmilesParseOps::CheckRingClosureBranchStatus(atom,mp);\n@@ -1987,11 +1991,11 @@ yyreduce:\n atom->setProp(RDKit::common_properties::_RingClosures,tmp);\n \n }\n-#line 1991 \"/scratch/RDKit_git/Code/GraphMol/SmilesParse/smarts.tab.cpp\"\n+#line 1995 \"/scratch/RDKit_git/Code/GraphMol/SmilesParse/smarts.tab.cpp\"\n break;\n \n case 21:\n-#line 252 \"smarts.yy\"\n+#line 254 \"smarts.yy\"\n {\n RWMol * mp = (*molList)[(yyval.moli)];\n Atom *atom=mp->getActiveAtom();\n@@ -1999,6 +2003,7 @@ yyreduce:\n mp->setBondBookmark((yyvsp[-1].bond),(yyvsp[0].ival));\n (yyvsp[-1].bond)->setOwningMol(mp);\n (yyvsp[-1].bond)->setBeginAtomIdx(atom->getIdx());\n+ (yyvsp[-1].bond)->setProp(\"_cxsmilesBondIdx\",numBondsParsed++);\n mp->setAtomBookmark(atom,(yyvsp[0].ival));\n \n SmilesParseOps::CheckRingClosureBranchStatus(atom,mp);\n@@ -2011,32 +2016,38 @@ yyreduce:\n atom->setProp(RDKit::common_properties::_RingClosures,tmp);\n \n }\n-#line 2015 \"/scratch/RDKit_git/Code/GraphMol/SmilesParse/smarts.tab.cpp\"\n+#line 2020 \"/scratch/RDKit_git/Code/GraphMol/SmilesParse/smarts.tab.cpp\"\n break;\n \n case 22:\n-#line 272 \"smarts.yy\"\n+#line 275 \"smarts.yy\"\n {\n RWMol *m1_p = (*molList)[(yyval.moli)],*m2_p=(*molList)[(yyvsp[0].moli)];\n+ unsigned int origNumAts = m1_p->getNumAtoms();\n+ Atom *active = m1_p->getActiveAtom();\n // FIX: handle generic bonds here\n SmilesParseOps::AddFragToMol(m1_p,m2_p,Bond::UNSPECIFIED,Bond::NONE);\n delete m2_p;\n+ Bond *bond = m1_p->getBondBetweenAtoms(active->getIdx(),origNumAts);\n+ if(bond){\n+ bond->setProp(\"_cxsmilesBondIdx\",numBondsParsed++);\n+ }\n int sz = molList->size();\n if ( sz==(yyvsp[0].moli)+1) {\n molList->resize( sz-1 );\n }\n }\n-#line 2030 \"/scratch/RDKit_git/Code/GraphMol/SmilesParse/smarts.tab.cpp\"\n+#line 2041 \"/scratch/RDKit_git/Code/GraphMol/SmilesParse/smarts.tab.cpp\"\n break;\n \n case 23:\n-#line 285 \"smarts.yy\"\n+#line 294 \"smarts.yy\"\n { (yyval.moli) = (yyvsp[-1].moli); }\n-#line 2036 \"/scratch/RDKit_git/Code/GraphMol/SmilesParse/smarts.tab.cpp\"\n+#line 2047 \"/scratch/RDKit_git/Code/GraphMol/SmilesParse/smarts.tab.cpp\"\n break;\n \n case 24:\n-#line 286 \"smarts.yy\"\n+#line 295 \"smarts.yy\"\n {\n // FIX: this needs to handle arbitrary bond_exprs\n (yyval.moli) = (yyvsp[-1].moli);\n@@ -2045,56 +2056,56 @@ yyreduce:\n (yyvsp[-2].bond)->setBeginAtomIdx(0);\n (*molList)[ sz-1 ]->setBondBookmark((yyvsp[-2].bond),ci_LEADING_BOND);\n }\n-#line 2049 \"/scratch/RDKit_git/Code/GraphMol/SmilesParse/smarts.tab.cpp\"\n+#line 2060 \"/scratch/RDKit_git/Code/GraphMol/SmilesParse/smarts.tab.cpp\"\n break;\n \n case 27:\n-#line 300 \"smarts.yy\"\n+#line 309 \"smarts.yy\"\n {\n (yyval.atom) = (yyvsp[-1].atom);\n }\n-#line 2057 \"/scratch/RDKit_git/Code/GraphMol/SmilesParse/smarts.tab.cpp\"\n+#line 2068 \"/scratch/RDKit_git/Code/GraphMol/SmilesParse/smarts.tab.cpp\"\n break;\n \n case 28:\n-#line 304 \"smarts.yy\"\n+#line 313 \"smarts.yy\"\n {\n (yyval.atom) = (yyvsp[-3].atom);\n (yyval.atom)->setProp(RDKit::common_properties::molAtomMapNumber,(yyvsp[-1].ival));\n }\n-#line 2066 \"/scratch/RDKit_git/Code/GraphMol/SmilesParse/smarts.tab.cpp\"\n+#line 2077 \"/scratch/RDKit_git/Code/GraphMol/SmilesParse/smarts.tab.cpp\"\n break;\n \n case 29:\n-#line 327 \"smarts.yy\"\n+#line 336 \"smarts.yy\"\n {\n (yyval.atom) = new QueryAtom(1);\n }\n-#line 2074 \"/scratch/RDKit_git/Code/GraphMol/SmilesParse/smarts.tab.cpp\"\n+#line 2085 \"/scratch/RDKit_git/Code/GraphMol/SmilesParse/smarts.tab.cpp\"\n break;\n \n case 30:\n-#line 331 \"smarts.yy\"\n+#line 340 \"smarts.yy\"\n {\n (yyval.atom) = new QueryAtom(1);\n (yyval.atom)->setProp(RDKit::common_properties::molAtomMapNumber,(yyvsp[-1].ival));\n }\n-#line 2083 \"/scratch/RDKit_git/Code/GraphMol/SmilesParse/smarts.tab.cpp\"\n+#line 2094 \"/scratch/RDKit_git/Code/GraphMol/SmilesParse/smarts.tab.cpp\"\n break;\n \n case 31:\n-#line 335 \"smarts.yy\"\n+#line 344 \"smarts.yy\"\n {\n QueryAtom *newQ = new QueryAtom(1);\n newQ->setIsotope((yyvsp[-2].ival));\n newQ->expandQuery(makeAtomIsotopeQuery((yyvsp[-2].ival)),Queries::COMPOSITE_AND,true);\n (yyval.atom)=newQ;\n }\n-#line 2094 \"/scratch/RDKit_git/Code/GraphMol/SmilesParse/smarts.tab.cpp\"\n+#line 2105 \"/scratch/RDKit_git/Code/GraphMol/SmilesParse/smarts.tab.cpp\"\n break;\n \n case 32:\n-#line 341 \"smarts.yy\"\n+#line 350 \"smarts.yy\"\n {\n QueryAtom *newQ = new QueryAtom(1);\n newQ->setIsotope((yyvsp[-4].ival));\n@@ -2103,22 +2114,22 @@ yyreduce:\n \n (yyval.atom)=newQ;\n }\n-#line 2107 \"/scratch/RDKit_git/Code/GraphMol/SmilesParse/smarts.tab.cpp\"\n+#line 2118 \"/scratch/RDKit_git/Code/GraphMol/SmilesParse/smarts.tab.cpp\"\n break;\n \n case 33:\n-#line 350 \"smarts.yy\"\n+#line 359 \"smarts.yy\"\n {\n QueryAtom *newQ = new QueryAtom(1);\n newQ->setFormalCharge((yyvsp[-1].ival));\n newQ->expandQuery(makeAtomFormalChargeQuery((yyvsp[-1].ival)),Queries::COMPOSITE_AND,true);\n (yyval.atom)=newQ;\n }\n-#line 2118 \"/scratch/RDKit_git/Code/GraphMol/SmilesParse/smarts.tab.cpp\"\n+#line 2129 \"/scratch/RDKit_git/Code/GraphMol/SmilesParse/smarts.tab.cpp\"\n break;\n \n case 34:\n-#line 356 \"smarts.yy\"\n+#line 365 \"smarts.yy\"\n {\n QueryAtom *newQ = new QueryAtom(1);\n newQ->setFormalCharge((yyvsp[-3].ival));\n@@ -2127,11 +2138,11 @@ yyreduce:\n \n (yyval.atom)=newQ;\n }\n-#line 2131 \"/scratch/RDKit_git/Code/GraphMol/SmilesParse/smarts.tab.cpp\"\n+#line 2142 \"/scratch/RDKit_git/Code/GraphMol/SmilesParse/smarts.tab.cpp\"\n break;\n \n case 35:\n-#line 364 \"smarts.yy\"\n+#line 373 \"smarts.yy\"\n {\n QueryAtom *newQ = new QueryAtom(1);\n newQ->setIsotope((yyvsp[-3].ival));\n@@ -2140,11 +2151,11 @@ yyreduce:\n newQ->expandQuery(makeAtomFormalChargeQuery((yyvsp[-1].ival)),Queries::COMPOSITE_AND,true);\n (yyval.atom)=newQ;\n }\n-#line 2144 \"/scratch/RDKit_git/Code/GraphMol/SmilesParse/smarts.tab.cpp\"\n+#line 2155 \"/scratch/RDKit_git/Code/GraphMol/SmilesParse/smarts.tab.cpp\"\n break;\n \n case 36:\n-#line 372 \"smarts.yy\"\n+#line 381 \"smarts.yy\"\n {\n QueryAtom *newQ = new QueryAtom(1);\n newQ->setIsotope((yyvsp[-5].ival));\n@@ -2155,22 +2166,22 @@ yyreduce:\n \n (yyval.atom)=newQ;\n }\n-#line 2159 \"/scratch/RDKit_git/Code/GraphMol/SmilesParse/smarts.tab.cpp\"\n+#line 2170 \"/scratch/RDKit_git/Code/GraphMol/SmilesParse/smarts.tab.cpp\"\n break;\n \n case 37:\n-#line 385 \"smarts.yy\"\n+#line 394 \"smarts.yy\"\n {\n (yyvsp[-2].atom)->expandQuery((yyvsp[0].atom)->getQuery()->copy(),Queries::COMPOSITE_AND,true);\n if((yyvsp[-2].atom)->getChiralTag()==Atom::CHI_UNSPECIFIED) (yyvsp[-2].atom)->setChiralTag((yyvsp[0].atom)->getChiralTag());\n SmilesParseOps::ClearAtomChemicalProps((yyvsp[-2].atom));\n delete (yyvsp[0].atom);\n }\n-#line 2170 \"/scratch/RDKit_git/Code/GraphMol/SmilesParse/smarts.tab.cpp\"\n+#line 2181 \"/scratch/RDKit_git/Code/GraphMol/SmilesParse/smarts.tab.cpp\"\n break;\n \n case 38:\n-#line 391 \"smarts.yy\"\n+#line 400 \"smarts.yy\"\n {\n (yyvsp[-2].atom)->expandQuery((yyvsp[0].atom)->getQuery()->copy(),Queries::COMPOSITE_OR,true);\n if((yyvsp[-2].atom)->getChiralTag()==Atom::CHI_UNSPECIFIED) (yyvsp[-2].atom)->setChiralTag((yyvsp[0].atom)->getChiralTag());\n@@ -2178,22 +2189,22 @@ yyreduce:\n (yyvsp[-2].atom)->setAtomicNum(0);\n delete (yyvsp[0].atom);\n }\n-#line 2182 \"/scratch/RDKit_git/Code/GraphMol/SmilesParse/smarts.tab.cpp\"\n+#line 2193 \"/scratch/RDKit_git/Code/GraphMol/SmilesParse/smarts.tab.cpp\"\n break;\n \n case 39:\n-#line 398 \"smarts.yy\"\n+#line 407 \"smarts.yy\"\n {\n (yyvsp[-2].atom)->expandQuery((yyvsp[0].atom)->getQuery()->copy(),Queries::COMPOSITE_AND,true);\n if((yyvsp[-2].atom)->getChiralTag()==Atom::CHI_UNSPECIFIED) (yyvsp[-2].atom)->setChiralTag((yyvsp[0].atom)->getChiralTag());\n SmilesParseOps::ClearAtomChemicalProps((yyvsp[-2].atom));\n delete (yyvsp[0].atom);\n }\n-#line 2193 \"/scratch/RDKit_git/Code/GraphMol/SmilesParse/smarts.tab.cpp\"\n+#line 2204 \"/scratch/RDKit_git/Code/GraphMol/SmilesParse/smarts.tab.cpp\"\n break;\n \n case 40:\n-#line 404 \"smarts.yy\"\n+#line 413 \"smarts.yy\"\n {\n (yyvsp[-1].atom)->expandQuery((yyvsp[0].atom)->getQuery()->copy(),Queries::COMPOSITE_AND,true);\n if((yyvsp[-1].atom)->getChiralTag()==Atom::CHI_UNSPECIFIED) (yyvsp[-1].atom)->setChiralTag((yyvsp[0].atom)->getChiralTag());\n@@ -2217,22 +2228,22 @@ yyreduce:\n }\n delete (yyvsp[0].atom);\n }\n-#line 2221 \"/scratch/RDKit_git/Code/GraphMol/SmilesParse/smarts.tab.cpp\"\n+#line 2232 \"/scratch/RDKit_git/Code/GraphMol/SmilesParse/smarts.tab.cpp\"\n break;\n \n case 42:\n-#line 430 \"smarts.yy\"\n+#line 439 \"smarts.yy\"\n {\n (yyvsp[0].atom)->getQuery()->setNegation(!((yyvsp[0].atom)->getQuery()->getNegation()));\n (yyvsp[0].atom)->setAtomicNum(0);\n SmilesParseOps::ClearAtomChemicalProps((yyvsp[0].atom));\n (yyval.atom) = (yyvsp[0].atom);\n }\n-#line 2232 \"/scratch/RDKit_git/Code/GraphMol/SmilesParse/smarts.tab.cpp\"\n+#line 2243 \"/scratch/RDKit_git/Code/GraphMol/SmilesParse/smarts.tab.cpp\"\n break;\n \n case 45:\n-#line 441 \"smarts.yy\"\n+#line 450 \"smarts.yy\"\n {\n // this is a recursive SMARTS expression\n QueryAtom *qA = new QueryAtom();\n@@ -2250,11 +2261,11 @@ yyreduce:\n }\n (yyval.atom) = qA;\n }\n-#line 2254 \"/scratch/RDKit_git/Code/GraphMol/SmilesParse/smarts.tab.cpp\"\n+#line 2265 \"/scratch/RDKit_git/Code/GraphMol/SmilesParse/smarts.tab.cpp\"\n break;\n \n case 46:\n-#line 458 \"smarts.yy\"\n+#line 467 \"smarts.yy\"\n {\n // UNDOCUMENTED EXTENSION:\n // this is a recursive SMARTS expression with a serial number\n@@ -2276,117 +2287,117 @@ yyreduce:\n }\n (yyval.atom) = qA;\n }\n-#line 2280 \"/scratch/RDKit_git/Code/GraphMol/SmilesParse/smarts.tab.cpp\"\n+#line 2291 \"/scratch/RDKit_git/Code/GraphMol/SmilesParse/smarts.tab.cpp\"\n break;\n \n case 48:\n-#line 483 \"smarts.yy\"\n+#line 492 \"smarts.yy\"\n {\n (yyvsp[0].atom)->setIsotope((yyvsp[-1].ival));\n (yyvsp[0].atom)->expandQuery(makeAtomIsotopeQuery((yyvsp[-1].ival)),Queries::COMPOSITE_AND,true);\n (yyval.atom)=(yyvsp[0].atom);\n }\n-#line 2290 \"/scratch/RDKit_git/Code/GraphMol/SmilesParse/smarts.tab.cpp\"\n+#line 2301 \"/scratch/RDKit_git/Code/GraphMol/SmilesParse/smarts.tab.cpp\"\n break;\n \n case 50:\n-#line 489 \"smarts.yy\"\n+#line 498 \"smarts.yy\"\n {\n (yyvsp[0].atom)->setIsotope((yyvsp[-1].ival));\n (yyvsp[0].atom)->expandQuery(makeAtomIsotopeQuery((yyvsp[-1].ival)),Queries::COMPOSITE_AND,true);\n (yyval.atom)=(yyvsp[0].atom);\n }\n-#line 2300 \"/scratch/RDKit_git/Code/GraphMol/SmilesParse/smarts.tab.cpp\"\n+#line 2311 \"/scratch/RDKit_git/Code/GraphMol/SmilesParse/smarts.tab.cpp\"\n break;\n \n case 51:\n-#line 494 \"smarts.yy\"\n+#line 503 \"smarts.yy\"\n { (yyval.atom) = new QueryAtom((yyvsp[0].ival)); }\n-#line 2306 \"/scratch/RDKit_git/Code/GraphMol/SmilesParse/smarts.tab.cpp\"\n+#line 2317 \"/scratch/RDKit_git/Code/GraphMol/SmilesParse/smarts.tab.cpp\"\n break;\n \n case 52:\n-#line 495 \"smarts.yy\"\n+#line 504 \"smarts.yy\"\n {\n (yyval.atom) = new QueryAtom((yyvsp[0].ival));\n (yyval.atom)->setIsotope((yyvsp[-2].ival));\n (yyval.atom)->expandQuery(makeAtomIsotopeQuery((yyvsp[-2].ival)),Queries::COMPOSITE_AND,true);\n }\n-#line 2316 \"/scratch/RDKit_git/Code/GraphMol/SmilesParse/smarts.tab.cpp\"\n+#line 2327 \"/scratch/RDKit_git/Code/GraphMol/SmilesParse/smarts.tab.cpp\"\n break;\n \n case 59:\n-#line 506 \"smarts.yy\"\n+#line 515 \"smarts.yy\"\n {\n static_cast<ATOM_EQUALS_QUERY *>((yyvsp[-1].atom)->getQuery())->setVal((yyvsp[0].ival));\n }\n-#line 2324 \"/scratch/RDKit_git/Code/GraphMol/SmilesParse/smarts.tab.cpp\"\n+#line 2335 \"/scratch/RDKit_git/Code/GraphMol/SmilesParse/smarts.tab.cpp\"\n break;\n \n case 60:\n-#line 509 \"smarts.yy\"\n+#line 518 \"smarts.yy\"\n {\n (yyvsp[-1].atom)->setQuery(makeAtomNumHeteroatomNbrsQuery((yyvsp[0].ival)));\n }\n-#line 2332 \"/scratch/RDKit_git/Code/GraphMol/SmilesParse/smarts.tab.cpp\"\n+#line 2343 \"/scratch/RDKit_git/Code/GraphMol/SmilesParse/smarts.tab.cpp\"\n break;\n \n case 61:\n-#line 512 \"smarts.yy\"\n+#line 521 \"smarts.yy\"\n {\n (yyvsp[-1].atom)->setQuery(makeAtomNumAliphaticHeteroatomNbrsQuery((yyvsp[0].ival)));\n }\n-#line 2340 \"/scratch/RDKit_git/Code/GraphMol/SmilesParse/smarts.tab.cpp\"\n+#line 2351 \"/scratch/RDKit_git/Code/GraphMol/SmilesParse/smarts.tab.cpp\"\n break;\n \n case 62:\n-#line 515 \"smarts.yy\"\n+#line 524 \"smarts.yy\"\n {\n (yyvsp[-1].atom)->setQuery(makeAtomMinRingSizeQuery((yyvsp[0].ival)));\n }\n-#line 2348 \"/scratch/RDKit_git/Code/GraphMol/SmilesParse/smarts.tab.cpp\"\n+#line 2359 \"/scratch/RDKit_git/Code/GraphMol/SmilesParse/smarts.tab.cpp\"\n break;\n \n case 63:\n-#line 518 \"smarts.yy\"\n+#line 527 \"smarts.yy\"\n {\n (yyvsp[-1].atom)->setQuery(makeAtomRingBondCountQuery((yyvsp[0].ival)));\n }\n-#line 2356 \"/scratch/RDKit_git/Code/GraphMol/SmilesParse/smarts.tab.cpp\"\n+#line 2367 \"/scratch/RDKit_git/Code/GraphMol/SmilesParse/smarts.tab.cpp\"\n break;\n \n case 64:\n-#line 521 \"smarts.yy\"\n+#line 530 \"smarts.yy\"\n {\n (yyvsp[-1].atom)->setQuery(makeAtomImplicitHCountQuery((yyvsp[0].ival)));\n }\n-#line 2364 \"/scratch/RDKit_git/Code/GraphMol/SmilesParse/smarts.tab.cpp\"\n+#line 2375 \"/scratch/RDKit_git/Code/GraphMol/SmilesParse/smarts.tab.cpp\"\n break;\n \n case 65:\n-#line 524 \"smarts.yy\"\n+#line 533 \"smarts.yy\"\n {\n ATOM_EQUALS_QUERY *oq = static_cast<ATOM_EQUALS_QUERY *>((yyvsp[-4].atom)->getQuery());\n ATOM_GREATEREQUAL_QUERY *nq = makeAtomSimpleQuery<ATOM_GREATEREQUAL_QUERY>((yyvsp[-1].ival),oq->getDataFunc(),\n std::string(\"greater_\")+oq->getDescription());\n (yyvsp[-4].atom)->setQuery(nq);\n }\n-#line 2375 \"/scratch/RDKit_git/Code/GraphMol/SmilesParse/smarts.tab.cpp\"\n+#line 2386 \"/scratch/RDKit_git/Code/GraphMol/SmilesParse/smarts.tab.cpp\"\n break;\n \n case 66:\n-#line 530 \"smarts.yy\"\n+#line 539 \"smarts.yy\"\n {\n ATOM_EQUALS_QUERY *oq = static_cast<ATOM_EQUALS_QUERY *>((yyvsp[-4].atom)->getQuery());\n ATOM_LESSEQUAL_QUERY *nq = makeAtomSimpleQuery<ATOM_LESSEQUAL_QUERY>((yyvsp[-2].ival),oq->getDataFunc(),\n std::string(\"less_\")+oq->getDescription());\n (yyvsp[-4].atom)->setQuery(nq);\n }\n-#line 2386 \"/scratch/RDKit_git/Code/GraphMol/SmilesParse/smarts.tab.cpp\"\n+#line 2397 \"/scratch/RDKit_git/Code/GraphMol/SmilesParse/smarts.tab.cpp\"\n break;\n \n case 67:\n-#line 536 \"smarts.yy\"\n+#line 545 \"smarts.yy\"\n {\n ATOM_EQUALS_QUERY *oq = static_cast<ATOM_EQUALS_QUERY *>((yyvsp[-5].atom)->getQuery());\n ATOM_RANGE_QUERY *nq = makeAtomRangeQuery((yyvsp[-3].ival),(yyvsp[-1].ival),false,false,\n@@ -2394,11 +2405,11 @@ yyreduce:\n std::string(\"range_\")+oq->getDescription());\n (yyvsp[-5].atom)->setQuery(nq);\n }\n-#line 2398 \"/scratch/RDKit_git/Code/GraphMol/SmilesParse/smarts.tab.cpp\"\n+#line 2409 \"/scratch/RDKit_git/Code/GraphMol/SmilesParse/smarts.tab.cpp\"\n break;\n \n case 68:\n-#line 543 \"smarts.yy\"\n+#line 552 \"smarts.yy\"\n {\n QueryAtom *newQ = new QueryAtom();\n newQ->setQuery(makeAtomIsotopeQuery((yyvsp[-1].ival)));\n@@ -2407,11 +2418,11 @@ yyreduce:\n newQ->setNumExplicitHs(1);\n (yyval.atom)=newQ;\n }\n-#line 2411 \"/scratch/RDKit_git/Code/GraphMol/SmilesParse/smarts.tab.cpp\"\n+#line 2422 \"/scratch/RDKit_git/Code/GraphMol/SmilesParse/smarts.tab.cpp\"\n break;\n \n case 69:\n-#line 551 \"smarts.yy\"\n+#line 560 \"smarts.yy\"\n {\n QueryAtom *newQ = new QueryAtom();\n newQ->setQuery(makeAtomIsotopeQuery((yyvsp[-2].ival)));\n@@ -2420,136 +2431,136 @@ yyreduce:\n newQ->setNumExplicitHs((yyvsp[0].ival));\n (yyval.atom)=newQ;\n }\n-#line 2424 \"/scratch/RDKit_git/Code/GraphMol/SmilesParse/smarts.tab.cpp\"\n+#line 2435 \"/scratch/RDKit_git/Code/GraphMol/SmilesParse/smarts.tab.cpp\"\n break;\n \n case 70:\n-#line 559 \"smarts.yy\"\n+#line 568 \"smarts.yy\"\n {\n QueryAtom *newQ = new QueryAtom();\n newQ->setQuery(makeAtomHCountQuery((yyvsp[0].ival)));\n newQ->setNumExplicitHs((yyvsp[0].ival));\n (yyval.atom)=newQ;\n }\n-#line 2435 \"/scratch/RDKit_git/Code/GraphMol/SmilesParse/smarts.tab.cpp\"\n+#line 2446 \"/scratch/RDKit_git/Code/GraphMol/SmilesParse/smarts.tab.cpp\"\n break;\n \n case 71:\n-#line 565 \"smarts.yy\"\n+#line 574 \"smarts.yy\"\n {\n QueryAtom *newQ = new QueryAtom();\n newQ->setQuery(makeAtomHCountQuery(1));\n newQ->setNumExplicitHs(1);\n (yyval.atom)=newQ;\n }\n-#line 2446 \"/scratch/RDKit_git/Code/GraphMol/SmilesParse/smarts.tab.cpp\"\n+#line 2457 \"/scratch/RDKit_git/Code/GraphMol/SmilesParse/smarts.tab.cpp\"\n break;\n \n case 72:\n-#line 571 \"smarts.yy\"\n+#line 580 \"smarts.yy\"\n {\n QueryAtom *newQ = new QueryAtom();\n newQ->setQuery(makeAtomFormalChargeQuery((yyvsp[0].ival)));\n newQ->setFormalCharge((yyvsp[0].ival));\n (yyval.atom)=newQ;\n }\n-#line 2457 \"/scratch/RDKit_git/Code/GraphMol/SmilesParse/smarts.tab.cpp\"\n+#line 2468 \"/scratch/RDKit_git/Code/GraphMol/SmilesParse/smarts.tab.cpp\"\n break;\n \n case 73:\n-#line 577 \"smarts.yy\"\n+#line 586 \"smarts.yy\"\n {\n QueryAtom *newQ = new QueryAtom();\n newQ->setQuery(makeAtomNullQuery());\n newQ->setChiralTag(Atom::CHI_TETRAHEDRAL_CW);\n (yyval.atom)=newQ;\n }\n-#line 2468 \"/scratch/RDKit_git/Code/GraphMol/SmilesParse/smarts.tab.cpp\"\n+#line 2479 \"/scratch/RDKit_git/Code/GraphMol/SmilesParse/smarts.tab.cpp\"\n break;\n \n case 74:\n-#line 583 \"smarts.yy\"\n+#line 592 \"smarts.yy\"\n {\n QueryAtom *newQ = new QueryAtom();\n newQ->setQuery(makeAtomNullQuery());\n newQ->setChiralTag(Atom::CHI_TETRAHEDRAL_CCW);\n (yyval.atom)=newQ;\n }\n-#line 2479 \"/scratch/RDKit_git/Code/GraphMol/SmilesParse/smarts.tab.cpp\"\n+#line 2490 \"/scratch/RDKit_git/Code/GraphMol/SmilesParse/smarts.tab.cpp\"\n break;\n \n case 76:\n-#line 590 \"smarts.yy\"\n+#line 599 \"smarts.yy\"\n {\n QueryAtom *newQ = new QueryAtom();\n newQ->setQuery(makeAtomIsotopeQuery((yyvsp[0].ival)));\n (yyval.atom)=newQ;\n }\n-#line 2489 \"/scratch/RDKit_git/Code/GraphMol/SmilesParse/smarts.tab.cpp\"\n+#line 2500 \"/scratch/RDKit_git/Code/GraphMol/SmilesParse/smarts.tab.cpp\"\n break;\n \n case 78:\n-#line 598 \"smarts.yy\"\n+#line 607 \"smarts.yy\"\n {\n (yyvsp[0].atom)->setQuery(makeAtomNumHeteroatomNbrsQuery(0));\n }\n-#line 2497 \"/scratch/RDKit_git/Code/GraphMol/SmilesParse/smarts.tab.cpp\"\n+#line 2508 \"/scratch/RDKit_git/Code/GraphMol/SmilesParse/smarts.tab.cpp\"\n break;\n \n case 79:\n-#line 601 \"smarts.yy\"\n+#line 610 \"smarts.yy\"\n {\n (yyvsp[0].atom)->setQuery(makeAtomNumAliphaticHeteroatomNbrsQuery(0));\n }\n-#line 2505 \"/scratch/RDKit_git/Code/GraphMol/SmilesParse/smarts.tab.cpp\"\n+#line 2516 \"/scratch/RDKit_git/Code/GraphMol/SmilesParse/smarts.tab.cpp\"\n break;\n \n case 80:\n-#line 604 \"smarts.yy\"\n+#line 613 \"smarts.yy\"\n {\n (yyvsp[0].atom)->setQuery(makeAtomMinRingSizeQuery(5)); // this is going to be ignored anyway\n }\n-#line 2513 \"/scratch/RDKit_git/Code/GraphMol/SmilesParse/smarts.tab.cpp\"\n+#line 2524 \"/scratch/RDKit_git/Code/GraphMol/SmilesParse/smarts.tab.cpp\"\n break;\n \n case 81:\n-#line 607 \"smarts.yy\"\n+#line 616 \"smarts.yy\"\n {\n (yyvsp[0].atom)->setQuery(makeAtomRingBondCountQuery(0));\n }\n-#line 2521 \"/scratch/RDKit_git/Code/GraphMol/SmilesParse/smarts.tab.cpp\"\n+#line 2532 \"/scratch/RDKit_git/Code/GraphMol/SmilesParse/smarts.tab.cpp\"\n break;\n \n case 82:\n-#line 610 \"smarts.yy\"\n+#line 619 \"smarts.yy\"\n {\n (yyvsp[0].atom)->setQuery(makeAtomImplicitHCountQuery(0));\n }\n-#line 2529 \"/scratch/RDKit_git/Code/GraphMol/SmilesParse/smarts.tab.cpp\"\n+#line 2540 \"/scratch/RDKit_git/Code/GraphMol/SmilesParse/smarts.tab.cpp\"\n break;\n \n case 83:\n-#line 613 \"smarts.yy\"\n+#line 622 \"smarts.yy\"\n {\n QueryAtom *newQ = new QueryAtom();\n newQ->setQuery(makeAtomFormalChargeQuery(0));\n (yyval.atom) = newQ;\n }\n-#line 2539 \"/scratch/RDKit_git/Code/GraphMol/SmilesParse/smarts.tab.cpp\"\n+#line 2550 \"/scratch/RDKit_git/Code/GraphMol/SmilesParse/smarts.tab.cpp\"\n break;\n \n case 84:\n-#line 618 \"smarts.yy\"\n+#line 627 \"smarts.yy\"\n {\n QueryAtom *newQ = new QueryAtom();\n newQ->setQuery(makeAtomNegativeFormalChargeQuery(0));\n (yyval.atom) = newQ;\n }\n-#line 2549 \"/scratch/RDKit_git/Code/GraphMol/SmilesParse/smarts.tab.cpp\"\n+#line 2560 \"/scratch/RDKit_git/Code/GraphMol/SmilesParse/smarts.tab.cpp\"\n break;\n \n case 85:\n-#line 626 \"smarts.yy\"\n+#line 635 \"smarts.yy\"\n {\n //\n // This construction (and some others) may seem odd, but the\n@@ -2562,193 +2573,193 @@ yyreduce:\n (yyval.atom) = new QueryAtom((yyvsp[0].ival));\n (yyval.atom)->setQuery(makeAtomTypeQuery((yyvsp[0].ival),false));\n }\n-#line 2566 \"/scratch/RDKit_git/Code/GraphMol/SmilesParse/smarts.tab.cpp\"\n+#line 2577 \"/scratch/RDKit_git/Code/GraphMol/SmilesParse/smarts.tab.cpp\"\n break;\n \n case 86:\n-#line 638 \"smarts.yy\"\n+#line 647 \"smarts.yy\"\n {\n (yyval.atom) = new QueryAtom((yyvsp[0].ival));\n (yyval.atom)->setIsAromatic(true);\n (yyval.atom)->setQuery(makeAtomTypeQuery((yyvsp[0].ival),true));\n }\n-#line 2576 \"/scratch/RDKit_git/Code/GraphMol/SmilesParse/smarts.tab.cpp\"\n+#line 2587 \"/scratch/RDKit_git/Code/GraphMol/SmilesParse/smarts.tab.cpp\"\n break;\n \n case 88:\n-#line 648 \"smarts.yy\"\n+#line 657 \"smarts.yy\"\n {\n (yyvsp[-2].bond)->expandQuery((yyvsp[0].bond)->getQuery()->copy(),Queries::COMPOSITE_AND,true);\n delete (yyvsp[0].bond);\n }\n-#line 2585 \"/scratch/RDKit_git/Code/GraphMol/SmilesParse/smarts.tab.cpp\"\n+#line 2596 \"/scratch/RDKit_git/Code/GraphMol/SmilesParse/smarts.tab.cpp\"\n break;\n \n case 89:\n-#line 652 \"smarts.yy\"\n+#line 661 \"smarts.yy\"\n {\n (yyvsp[-2].bond)->expandQuery((yyvsp[0].bond)->getQuery()->copy(),Queries::COMPOSITE_OR,true);\n delete (yyvsp[0].bond);\n }\n-#line 2594 \"/scratch/RDKit_git/Code/GraphMol/SmilesParse/smarts.tab.cpp\"\n+#line 2605 \"/scratch/RDKit_git/Code/GraphMol/SmilesParse/smarts.tab.cpp\"\n break;\n \n case 90:\n-#line 656 \"smarts.yy\"\n+#line 665 \"smarts.yy\"\n {\n (yyvsp[-2].bond)->expandQuery((yyvsp[0].bond)->getQuery()->copy(),Queries::COMPOSITE_AND,true);\n delete (yyvsp[0].bond);\n }\n-#line 2603 \"/scratch/RDKit_git/Code/GraphMol/SmilesParse/smarts.tab.cpp\"\n+#line 2614 \"/scratch/RDKit_git/Code/GraphMol/SmilesParse/smarts.tab.cpp\"\n break;\n \n case 93:\n-#line 664 \"smarts.yy\"\n+#line 673 \"smarts.yy\"\n {\n (yyvsp[-1].bond)->expandQuery((yyvsp[0].bond)->getQuery()->copy(),Queries::COMPOSITE_AND,true);\n delete (yyvsp[0].bond);\n }\n-#line 2612 \"/scratch/RDKit_git/Code/GraphMol/SmilesParse/smarts.tab.cpp\"\n+#line 2623 \"/scratch/RDKit_git/Code/GraphMol/SmilesParse/smarts.tab.cpp\"\n break;\n \n case 95:\n-#line 672 \"smarts.yy\"\n+#line 681 \"smarts.yy\"\n {\n QueryBond *newB= new QueryBond();\n newB->setBondType(Bond::SINGLE);\n newB->setQuery(makeBondOrderEqualsQuery(Bond::SINGLE));\n (yyval.bond) = newB;\n }\n-#line 2623 \"/scratch/RDKit_git/Code/GraphMol/SmilesParse/smarts.tab.cpp\"\n+#line 2634 \"/scratch/RDKit_git/Code/GraphMol/SmilesParse/smarts.tab.cpp\"\n break;\n \n case 96:\n-#line 678 \"smarts.yy\"\n+#line 687 \"smarts.yy\"\n {\n QueryBond *newB= new QueryBond();\n newB->setBondType(Bond::TRIPLE);\n newB->setQuery(makeBondOrderEqualsQuery(Bond::TRIPLE));\n (yyval.bond) = newB;\n }\n-#line 2634 \"/scratch/RDKit_git/Code/GraphMol/SmilesParse/smarts.tab.cpp\"\n+#line 2645 \"/scratch/RDKit_git/Code/GraphMol/SmilesParse/smarts.tab.cpp\"\n break;\n \n case 97:\n-#line 684 \"smarts.yy\"\n+#line 693 \"smarts.yy\"\n {\n QueryBond *newB= new QueryBond();\n newB->setBondType(Bond::AROMATIC);\n newB->setQuery(makeBondOrderEqualsQuery(Bond::AROMATIC));\n (yyval.bond) = newB;\n }\n-#line 2645 \"/scratch/RDKit_git/Code/GraphMol/SmilesParse/smarts.tab.cpp\"\n+#line 2656 \"/scratch/RDKit_git/Code/GraphMol/SmilesParse/smarts.tab.cpp\"\n break;\n \n case 98:\n-#line 690 \"smarts.yy\"\n+#line 699 \"smarts.yy\"\n {\n QueryBond *newB= new QueryBond();\n newB->setQuery(makeBondIsInRingQuery());\n (yyval.bond) = newB;\n }\n-#line 2655 \"/scratch/RDKit_git/Code/GraphMol/SmilesParse/smarts.tab.cpp\"\n+#line 2666 \"/scratch/RDKit_git/Code/GraphMol/SmilesParse/smarts.tab.cpp\"\n break;\n \n case 99:\n-#line 695 \"smarts.yy\"\n+#line 704 \"smarts.yy\"\n {\n (yyvsp[0].bond)->getQuery()->setNegation(!((yyvsp[0].bond)->getQuery()->getNegation()));\n (yyval.bond) = (yyvsp[0].bond);\n }\n-#line 2664 \"/scratch/RDKit_git/Code/GraphMol/SmilesParse/smarts.tab.cpp\"\n+#line 2675 \"/scratch/RDKit_git/Code/GraphMol/SmilesParse/smarts.tab.cpp\"\n break;\n \n case 100:\n-#line 702 \"smarts.yy\"\n+#line 711 \"smarts.yy\"\n { (yyval.ival)=2; }\n-#line 2670 \"/scratch/RDKit_git/Code/GraphMol/SmilesParse/smarts.tab.cpp\"\n+#line 2681 \"/scratch/RDKit_git/Code/GraphMol/SmilesParse/smarts.tab.cpp\"\n break;\n \n case 101:\n-#line 703 \"smarts.yy\"\n+#line 712 \"smarts.yy\"\n { (yyval.ival)=(yyvsp[0].ival); }\n-#line 2676 \"/scratch/RDKit_git/Code/GraphMol/SmilesParse/smarts.tab.cpp\"\n+#line 2687 \"/scratch/RDKit_git/Code/GraphMol/SmilesParse/smarts.tab.cpp\"\n break;\n \n case 102:\n-#line 704 \"smarts.yy\"\n+#line 713 \"smarts.yy\"\n { (yyval.ival)=1; }\n-#line 2682 \"/scratch/RDKit_git/Code/GraphMol/SmilesParse/smarts.tab.cpp\"\n+#line 2693 \"/scratch/RDKit_git/Code/GraphMol/SmilesParse/smarts.tab.cpp\"\n break;\n \n case 103:\n-#line 705 \"smarts.yy\"\n+#line 714 \"smarts.yy\"\n { (yyval.ival)=-2; }\n-#line 2688 \"/scratch/RDKit_git/Code/GraphMol/SmilesParse/smarts.tab.cpp\"\n+#line 2699 \"/scratch/RDKit_git/Code/GraphMol/SmilesParse/smarts.tab.cpp\"\n break;\n \n case 104:\n-#line 706 \"smarts.yy\"\n+#line 715 \"smarts.yy\"\n { (yyval.ival)=-(yyvsp[0].ival); }\n-#line 2694 \"/scratch/RDKit_git/Code/GraphMol/SmilesParse/smarts.tab.cpp\"\n+#line 2705 \"/scratch/RDKit_git/Code/GraphMol/SmilesParse/smarts.tab.cpp\"\n break;\n \n case 105:\n-#line 707 \"smarts.yy\"\n+#line 716 \"smarts.yy\"\n { (yyval.ival)=-1; }\n-#line 2700 \"/scratch/RDKit_git/Code/GraphMol/SmilesParse/smarts.tab.cpp\"\n+#line 2711 \"/scratch/RDKit_git/Code/GraphMol/SmilesParse/smarts.tab.cpp\"\n break;\n \n case 107:\n-#line 712 \"smarts.yy\"\n+#line 721 \"smarts.yy\"\n { (yyval.ival) = (yyvsp[-1].ival)*10+(yyvsp[0].ival); }\n-#line 2706 \"/scratch/RDKit_git/Code/GraphMol/SmilesParse/smarts.tab.cpp\"\n+#line 2717 \"/scratch/RDKit_git/Code/GraphMol/SmilesParse/smarts.tab.cpp\"\n break;\n \n case 108:\n-#line 713 \"smarts.yy\"\n+#line 722 \"smarts.yy\"\n { (yyval.ival) = (yyvsp[-1].ival); }\n-#line 2712 \"/scratch/RDKit_git/Code/GraphMol/SmilesParse/smarts.tab.cpp\"\n+#line 2723 \"/scratch/RDKit_git/Code/GraphMol/SmilesParse/smarts.tab.cpp\"\n break;\n \n case 109:\n-#line 714 \"smarts.yy\"\n+#line 723 \"smarts.yy\"\n { (yyval.ival) = (yyvsp[-2].ival)*10+(yyvsp[-1].ival); }\n-#line 2718 \"/scratch/RDKit_git/Code/GraphMol/SmilesParse/smarts.tab.cpp\"\n+#line 2729 \"/scratch/RDKit_git/Code/GraphMol/SmilesParse/smarts.tab.cpp\"\n break;\n \n case 110:\n-#line 715 \"smarts.yy\"\n+#line 724 \"smarts.yy\"\n { (yyval.ival) = (yyvsp[-3].ival)*100+(yyvsp[-2].ival)*10+(yyvsp[-1].ival); }\n-#line 2724 \"/scratch/RDKit_git/Code/GraphMol/SmilesParse/smarts.tab.cpp\"\n+#line 2735 \"/scratch/RDKit_git/Code/GraphMol/SmilesParse/smarts.tab.cpp\"\n break;\n \n case 111:\n-#line 716 \"smarts.yy\"\n+#line 725 \"smarts.yy\"\n { (yyval.ival) = (yyvsp[-4].ival)*1000+(yyvsp[-3].ival)*100+(yyvsp[-2].ival)*10+(yyvsp[-1].ival); }\n-#line 2730 \"/scratch/RDKit_git/Code/GraphMol/SmilesParse/smarts.tab.cpp\"\n+#line 2741 \"/scratch/RDKit_git/Code/GraphMol/SmilesParse/smarts.tab.cpp\"\n break;\n \n case 112:\n-#line 717 \"smarts.yy\"\n+#line 726 \"smarts.yy\"\n { (yyval.ival) = (yyvsp[-5].ival)*10000+(yyvsp[-4].ival)*1000+(yyvsp[-3].ival)*100+(yyvsp[-2].ival)*10+(yyvsp[-1].ival); }\n-#line 2736 \"/scratch/RDKit_git/Code/GraphMol/SmilesParse/smarts.tab.cpp\"\n+#line 2747 \"/scratch/RDKit_git/Code/GraphMol/SmilesParse/smarts.tab.cpp\"\n break;\n \n case 116:\n-#line 728 \"smarts.yy\"\n+#line 737 \"smarts.yy\"\n { \n if((yyvsp[-1].ival) >= std::numeric_limits<std::int32_t>::max()/10 || \n (yyvsp[-1].ival)*10 >= std::numeric_limits<std::int32_t>::max()-(yyvsp[0].ival) ){\n- yysmarts_error(input,molList,lastAtom,lastBond,scanner,start_token,\"number too large\");\n+ yysmarts_error(input,molList,lastAtom,lastBond,numAtomsParsed,numBondsParsed,scanner,start_token,\"number too large\");\n YYABORT;\n }\n (yyval.ival) = (yyvsp[-1].ival)*10 + (yyvsp[0].ival); }\n-#line 2748 \"/scratch/RDKit_git/Code/GraphMol/SmilesParse/smarts.tab.cpp\"\n+#line 2759 \"/scratch/RDKit_git/Code/GraphMol/SmilesParse/smarts.tab.cpp\"\n break;\n \n \n-#line 2752 \"/scratch/RDKit_git/Code/GraphMol/SmilesParse/smarts.tab.cpp\"\n+#line 2763 \"/scratch/RDKit_git/Code/GraphMol/SmilesParse/smarts.tab.cpp\"\n \n default: break;\n }\n@@ -2798,7 +2809,7 @@ yyerrlab:\n {\n ++yynerrs;\n #if ! YYERROR_VERBOSE\n- yyerror (input, molList, lastAtom, lastBond, scanner, start_token, YY_(\"syntax error\"));\n+ yyerror (input, molList, lastAtom, lastBond, numAtomsParsed, numBondsParsed, scanner, start_token, YY_(\"syntax error\"));\n #else\n # define YYSYNTAX_ERROR yysyntax_error (&yymsg_alloc, &yymsg, \\\n yyssp, yytoken)\n@@ -2825,7 +2836,7 @@ yyerrlab:\n yymsgp = yymsg;\n }\n }\n- yyerror (input, molList, lastAtom, lastBond, scanner, start_token, yymsgp);\n+ yyerror (input, molList, lastAtom, lastBond, numAtomsParsed, numBondsParsed, scanner, start_token, yymsgp);\n if (yysyntax_error_status == 2)\n goto yyexhaustedlab;\n }\n@@ -2849,7 +2860,7 @@ yyerrlab:\n else\n {\n yydestruct (\"Error: discarding\",\n- yytoken, &yylval, input, molList, lastAtom, lastBond, scanner, start_token);\n+ yytoken, &yylval, input, molList, lastAtom, lastBond, numAtomsParsed, numBondsParsed, scanner, start_token);\n yychar = YYEMPTY;\n }\n }\n@@ -2903,7 +2914,7 @@ yyerrlab1:\n \n \n yydestruct (\"Error: popping\",\n- yystos[yystate], yyvsp, input, molList, lastAtom, lastBond, scanner, start_token);\n+ yystos[yystate], yyvsp, input, molList, lastAtom, lastBond, numAtomsParsed, numBondsParsed, scanner, start_token);\n YYPOPSTACK (1);\n yystate = *yyssp;\n YY_STACK_PRINT (yyss, yyssp);\n@@ -2942,7 +2953,7 @@ yyabortlab:\n | yyexhaustedlab -- memory exhaustion comes here. |\n `-------------------------------------------------*/\n yyexhaustedlab:\n- yyerror (input, molList, lastAtom, lastBond, scanner, start_token, YY_(\"memory exhausted\"));\n+ yyerror (input, molList, lastAtom, lastBond, numAtomsParsed, numBondsParsed, scanner, start_token, YY_(\"memory exhausted\"));\n yyresult = 2;\n /* Fall through. */\n #endif\n@@ -2958,7 +2969,7 @@ yyreturn:\n user semantic actions for why this is necessary. */\n yytoken = YYTRANSLATE (yychar);\n yydestruct (\"Cleanup: discarding lookahead\",\n- yytoken, &yylval, input, molList, lastAtom, lastBond, scanner, start_token);\n+ yytoken, &yylval, input, molList, lastAtom, lastBond, numAtomsParsed, numBondsParsed, scanner, start_token);\n }\n /* Do not reclaim the symbols of the rule whose action triggered\n this YYABORT or YYACCEPT. */\n@@ -2967,7 +2978,7 @@ yyreturn:\n while (yyssp != yyss)\n {\n yydestruct (\"Cleanup: popping\",\n- yystos[+*yyssp], yyvsp, input, molList, lastAtom, lastBond, scanner, start_token);\n+ yystos[+*yyssp], yyvsp, input, molList, lastAtom, lastBond, numAtomsParsed, numBondsParsed, scanner, start_token);\n YYPOPSTACK (1);\n }\n #ifndef yyoverflow\n@@ -2980,5 +2991,5 @@ yyreturn:\n #endif\n return yyresult;\n }\n-#line 741 \"smarts.yy\"\n+#line 750 \"smarts.yy\"\n \ndiff --git a/Code/GraphMol/SmilesParse/smarts.tab.hpp.cmake b/Code/GraphMol/SmilesParse/smarts.tab.hpp.cmake\nindex 46fb6115b4a..5584c6f9f47 100644\n--- a/Code/GraphMol/SmilesParse/smarts.tab.hpp.cmake\n+++ b/Code/GraphMol/SmilesParse/smarts.tab.hpp.cmake\n@@ -99,7 +99,7 @@ extern int yysmarts_debug;\n #if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED\n union YYSTYPE\n {\n-#line 68 \"smarts.yy\"\n+#line 65 \"smarts.yy\"\n \n int moli;\n RDKit::QueryAtom * atom;\n@@ -116,9 +116,9 @@ typedef union YYSTYPE YYSTYPE;\n \n \n \n-int yysmarts_parse (const char *input, std::vector<RDKit::RWMol *> *molList, RDKit::Atom* &lastAtom, RDKit::Bond* &lastBond, void *scanner, int& start_token);\n+int yysmarts_parse (const char *input, std::vector<RDKit::RWMol *> *molList, RDKit::Atom* &lastAtom, RDKit::Bond* &lastBond, unsigned &numAtomsParsed, unsigned &numBondsParsed, void *scanner, int& start_token);\n /* \"%code provides\" blocks. */\n-#line 63 \"smarts.yy\"\n+#line 60 \"smarts.yy\"\n \n #define YY_DECL int yylex \\\n (YYSTYPE * yylval_param , yyscan_t yyscanner, int& start_token)\ndiff --git a/Code/GraphMol/SmilesParse/smarts.yy b/Code/GraphMol/SmilesParse/smarts.yy\nindex 735e8486587..b1b2c3a5215 100644\n--- a/Code/GraphMol/SmilesParse/smarts.yy\n+++ b/Code/GraphMol/SmilesParse/smarts.yy\n@@ -1,8 +1,7 @@\n %{\n \n- // $Id$\n //\n- // Copyright (C) 2003-2018 Greg Landrum and Rational Discovery LLC\n+ // Copyright (C) 2003-2022 Greg Landrum and other RDKit contributors\n //\n // @@ All Rights Reserved @@\n //\n@@ -36,15 +35,11 @@ namespace {\n void\n yysmarts_error( const char *input,\n std::vector<RDKit::RWMol *> *ms,\n- RDKit::Atom* &lastAtom,\n- RDKit::Bond* &lastBond,\n-\t\tvoid *scanner,int start_token, const char * msg )\n+ RDKit::Atom* &,\n+ RDKit::Bond* &,\n+ unsigned int &,unsigned int &,\n+\t\tvoid *,int , const char *msg )\n {\n- RDUNUSED_PARAM(input);\n- RDUNUSED_PARAM(lastAtom);\n- RDUNUSED_PARAM(lastBond);\n- RDUNUSED_PARAM(scanner);\n- RDUNUSED_PARAM(start_token);\n yyErrorCleanup(ms);\n BOOST_LOG(rdErrorLog) << \"SMARTS Parse Error: \" << msg << \" while parsing: \" << input << std::endl;\n }\n@@ -57,6 +52,8 @@ yysmarts_error( const char *input,\n %parse-param {std::vector<RDKit::RWMol *> *molList}\n %parse-param {RDKit::Atom* &lastAtom}\n %parse-param {RDKit::Bond* &lastBond}\n+%parse-param {unsigned &numAtomsParsed}\n+%parse-param {unsigned &numBondsParsed}\n %parse-param {void *scanner}\n %parse-param {int& start_token}\n \n@@ -188,6 +185,7 @@ mol: atomd {\n newB->setOwningMol(mp);\n newB->setBeginAtomIdx(atomIdx1);\n newB->setEndAtomIdx(atomIdx2);\n+ newB->setProp(\"_cxsmilesBondIdx\",numBondsParsed++);\n mp->addBond(newB);\n delete newB;\n //delete $2;\n@@ -209,6 +207,7 @@ mol: atomd {\n $2->setBeginAtomIdx(atomIdx1);\n $2->setEndAtomIdx(atomIdx2);\n }\n+ $2->setProp(\"_cxsmilesBondIdx\",numBondsParsed++);\n mp->addBond($2);\n delete $2;\n }\n@@ -236,6 +235,9 @@ mol: atomd {\n newB->setOwningMol(mp);\n newB->setBeginAtomIdx(atom->getIdx());\n mp->setBondBookmark(newB,$2);\n+ if(!(mp->getAllBondsWithBookmark($2).size()%2)){\n+ newB->setProp(\"_cxsmilesBondIdx\",numBondsParsed++);\n+ }\n mp->setAtomBookmark(atom,$2);\n \n SmilesParseOps::CheckRingClosureBranchStatus(atom,mp);\n@@ -256,6 +258,7 @@ mol: atomd {\n mp->setBondBookmark($2,$3);\n $2->setOwningMol(mp);\n $2->setBeginAtomIdx(atom->getIdx());\n+ $2->setProp(\"_cxsmilesBondIdx\",numBondsParsed++);\n mp->setAtomBookmark(atom,$3);\n \n SmilesParseOps::CheckRingClosureBranchStatus(atom,mp);\n@@ -271,9 +274,15 @@ mol: atomd {\n \n | mol branch {\n RWMol *m1_p = (*molList)[$$],*m2_p=(*molList)[$2];\n+ unsigned int origNumAts = m1_p->getNumAtoms();\n+ Atom *active = m1_p->getActiveAtom();\n // FIX: handle generic bonds here\n SmilesParseOps::AddFragToMol(m1_p,m2_p,Bond::UNSPECIFIED,Bond::NONE);\n delete m2_p;\n+ Bond *bond = m1_p->getBondBetweenAtoms(active->getIdx(),origNumAts);\n+ if(bond){\n+ bond->setProp(\"_cxsmilesBondIdx\",numBondsParsed++);\n+ }\n int sz = molList->size();\n if ( sz==$2+1) {\n molList->resize( sz-1 );\n@@ -728,7 +737,7 @@ nonzero_number: NONZERO_DIGIT_TOKEN\n | nonzero_number digit { \n if($1 >= std::numeric_limits<std::int32_t>::max()/10 || \n $1*10 >= std::numeric_limits<std::int32_t>::max()-$2 ){\n- yysmarts_error(input,molList,lastAtom,lastBond,scanner,start_token,\"number too large\");\n+ yysmarts_error(input,molList,lastAtom,lastBond,numAtomsParsed,numBondsParsed,scanner,start_token,\"number too large\");\n YYABORT;\n }\n $$ = $1*10 + $2; }\n"}, "test": {"test_patch": "diff --git a/Code/GraphMol/SmilesParse/catch_tests.cpp b/Code/GraphMol/SmilesParse/catch_tests.cpp\nindex 9e0848b905b..01300fdcf12 100644\n--- a/Code/GraphMol/SmilesParse/catch_tests.cpp\n+++ b/Code/GraphMol/SmilesParse/catch_tests.cpp\n@@ -1854,4 +1854,33 @@ TEST_CASE(\n \"SingleOrAromaticBond\");\n CHECK(m->getBondWithIdx(1)->getQuery()->getDescription() ==\n \"SingleOrAromaticBond\");\n+}\n+\n+TEST_CASE(\"Github #4878: cannot parse coordinate bonds from CXSMARTS\",\n+ \"[cxsmiles]\") {\n+ SECTION(\"basics\") {\n+ auto m = \"[Fe]OC |C:1.0|\"_smarts;\n+ REQUIRE(m);\n+ CHECK(m->getBondWithIdx(0)->getBondType() == Bond::BondType::DATIVE);\n+ }\n+ SECTION(\"branches\") {\n+ {\n+ auto m = \"[Fe](O)OC |C:2.1|\"_smarts;\n+ REQUIRE(m);\n+ CHECK(m->getBondWithIdx(1)->getBondType() == Bond::BondType::DATIVE);\n+ }\n+ {\n+ auto m = \"[Fe](OC)O |C:1.0|\"_smarts;\n+ REQUIRE(m);\n+ CHECK(m->getBondWithIdx(0)->getBondType() == Bond::BondType::DATIVE);\n+ }\n+ }\n+ SECTION(\"rings\") {\n+ {\n+ auto m = \"O1CC[Fe]1 |C:0.3|\"_smarts;\n+ REQUIRE(m);\n+ CHECK(m->getBondBetweenAtoms(0, 3)->getBondType() ==\n+ Bond::BondType::DATIVE);\n+ }\n+ }\n }\n\\ No newline at end of file\n", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}209{"question_id": "MSB_rdkit_rdkit_pr5077", "question_type": "multi_swe_bench", "description": "Fixes #5008: Add H and X specification to P tautomerization rules (rdkit/rdkit#5077)", "content": {"org": "rdkit", "repo": "rdkit", "pr_number": 5077, "issue_title": "Fixes #5008: Add H and X specification to P tautomerization rules", "issue_body": "The change is simple: make sure that the P involved in the tautomer shifts only has three neighbors and doesn't have an H (this is to avoid hypervalent P)\r\n", "base_commit": "9822e9439c67582959c1a896346e37bbda8fdb25", "resolved_issues": [{"number": 5008, "title": "Bad tautomers produced for phosphorous compounds", "body": "**Describe the bug**\r\nrdMolStandardize.TautomerEnumerator().Enumerate() gives tautomers that chemically are not possible and rdMolStandardize.TautomerEnumerator().Canonicalize() assigns the chemically non-plausible tautomer as the canonical tautomer.\r\n\r\n**To Reproduce**\r\n```\r\nfrom rdkit import Chem\r\nfrom rdkit.Chem.MolStandardize import rdMolStandardize\r\n\r\nlig = Chem.MolFromSmiles(\"NP(=O)(O)N(CCCl)CCCl\")\r\ncanonicalizer = rdMolStandardize.TautomerEnumerator()\r\ntautomers = canonicalizer.Enumerate(lig)\r\n\r\n\"\"\"\r\nTautomers generated:\r\nTautomer 1: N=P(O)(O)N(CCCl)CCCl\r\nTautomer 2: N=[PH](=O)(O)N(CCCl)CCCl\r\nTautomer 3: NP(=O)(O)N(CCCl)CCCl\r\nTautomer 4: N[PH](=O)(=O)N(CCCl)CCCl\r\n\"\"\"\r\n\r\ncanonical_tautomer = canonicalizer.Canonicalize(lig)\r\n\r\n# Canonical tautomer: N[PH](=O)(=O)N(CCCl)CCCl\r\n```\r\n\r\n**Expected behavior**\r\nTautomers 2 and 4 should not be returned and tautomer 4 should not be picked as the canonical tautomer.\r\n\r\n\r\n**Configuration:**\r\n - RDKit version: 2021.09.4\r\n - OS: CentOS Linux 7, GNOME Version 3.28.2\r\n - Python version (if relevant): 3.9.7\r\n - Are you using conda?: Yes\r\n - If you are using conda, which channel did you install the rdkit from?: conda-forge\r\n"}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/rdkit_m_rdkit:pr-5077", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/Code/GraphMol/MolStandardize/TautomerCatalog/tautomerTransforms.in b/Code/GraphMol/MolStandardize/TautomerCatalog/tautomerTransforms.in\nindex b8328122aae..ba4a030e9fb 100644\n--- a/Code/GraphMol/MolStandardize/TautomerCatalog/tautomerTransforms.in\n+++ b/Code/GraphMol/MolStandardize/TautomerCatalog/tautomerTransforms.in\n@@ -49,7 +49,7 @@ const std::vector<\n std::make_tuple(\n std::string(\"1,3 heteroatom H shift\"),\n std::string(\n- \"[#7+0,S,O,Se,Te;!H0]-[#7X2,#6,#15]=[#7+0,#16,#8,Se,Te]\"),\n+ \"[#7+0,S,O,Se,Te;!H0]-[#7X2,#6,#15X3H0]=[#7+0,#16,#8,Se,Te]\"),\n std::string(\"\"), std::string(\"\")),\n std::make_tuple(\n std::string(\"1,5 aromatic heteroatom H shift\"),\n@@ -135,9 +135,9 @@ const std::vector<\n std::string(\"[N+!H0]#[C-]\"), std::string(\"#\"),\n std::string(\"-+\")),\n std::make_tuple(std::string(\"phosphonic acid f\"),\n- std::string(\"[OH]-[PH0]\"), std::string(\"=\"),\n+ std::string(\"[OH]-[PX3H0]\"), std::string(\"=\"),\n std::string(\"\")),\n std::make_tuple(std::string(\"phosphonic acid r\"),\n- std::string(\"[PH]=[O]\"), std::string(\"-\"),\n+ std::string(\"[PX4H]=[O]\"), std::string(\"-\"),\n std::string(\"\"))};\n } // namespace defaults\n\\ No newline at end of file\n"}, "test": {"test_patch": "diff --git a/Code/GraphMol/MolStandardize/catch_tests.cpp b/Code/GraphMol/MolStandardize/catch_tests.cpp\nindex 2e2b157e028..3067192bdee 100644\n--- a/Code/GraphMol/MolStandardize/catch_tests.cpp\n+++ b/Code/GraphMol/MolStandardize/catch_tests.cpp\n@@ -843,4 +843,28 @@ TEST_CASE(\n CHECK(m2->getAtomWithIdx(0)->getFormalCharge() == 2);\n CHECK(m2->getAtomWithIdx(1)->getFormalCharge() == -1);\n }\n+}\n+\n+TEST_CASE(\"Github #5008: bad tautomers for phosphorous compounds\") {\n+ SECTION(\"as reported\") {\n+ auto m = \"NP(=O)(O)N(CCCl)CCCl\"_smiles;\n+ REQUIRE(m);\n+ MolStandardize::TautomerEnumerator tenum;\n+ auto tauts = tenum.enumerate(*m);\n+ CHECK(tauts.size() == 1);\n+ }\n+ SECTION(\"P which should tautomerize\") {\n+ auto m = \"CP(O)C\"_smiles;\n+ REQUIRE(m);\n+ MolStandardize::TautomerEnumerator tenum;\n+ auto tauts = tenum.enumerate(*m);\n+ CHECK(tauts.size() == 2);\n+ }\n+ SECTION(\"Canonical version\") {\n+ auto m = \"CP(O)C\"_smiles;\n+ REQUIRE(m);\n+ std::unique_ptr<RWMol> ct(MolStandardize::canonicalTautomer(m.get()));\n+ REQUIRE(ct);\n+ CHECK(MolToSmiles(*ct) == \"C[PH](C)=O\");\n+ }\n }\n\\ No newline at end of file\ndiff --git a/Code/GraphMol/MolStandardize/test_data/tautomerTransforms.in b/Code/GraphMol/MolStandardize/test_data/tautomerTransforms.in\nindex 3559f73345d..74509ded661 100644\n--- a/Code/GraphMol/MolStandardize/test_data/tautomerTransforms.in\n+++ b/Code/GraphMol/MolStandardize/test_data/tautomerTransforms.in\n@@ -9,7 +9,7 @@ special imine f\t[N!H0]-[C]=[CX3R0]\n special imine r\t[CX4!H0]-[c]=[n]\n 1,3 aromatic heteroatom H shift f\t[#7+0!H0]-[#6R1]=[O,#7X2+0]\n 1,3 aromatic heteroatom H shift \t[O,#7+0;!H0]-[#6R1]=[#7+0X2]\n-1,3 heteroatom H shift\t[#7+0,S,O,Se,Te;!H0]-[#7X2,#6,#15]=[#7+0,#16,#8,Se,Te]\n+1,3 heteroatom H shift\t[#7+0,S,O,Se,Te;!H0]-[#7X2,#6,#15X3H0]=[#7+0,#16,#8,Se,Te]\n 1,5 aromatic heteroatom H shift\t[#7+0,#16,#8;!H0]-[#6,#7]=[#6]-[#6,#7]=[#7+0,#16,#8;H0]\n 1,5 aromatic heteroatom H shift \t[#7+0,#16,#8,Se,Te;!H0]-[#6,nX2]=[#6,nX2]-[#6,#7X2]=[#7X2+0,S,O,Se,Te]\n 1,5 aromatic heteroatom H shift r\t[#7+0,S,O,Se,Te;!H0]-[#6,#7X2]=[#6,nX2]-[#6,nX2]=[#7+0,#16,#8,Se,Te]\n@@ -33,5 +33,5 @@ formamidinesulfinic acid f\t[O,N;!H0]-[C]=[S,Se,Te;v6]=[O]\t=--\n formamidinesulfinic acid r\t[O!H0]-[S,Se,Te;v4]-[C]=[O,N]\t==-\n isocyanide f\t[C-0!H0]#[N+0]\t#\t-+\n isocyanide r\t[N+!H0]#[C-]\t#\t-+\n-phosphonic acid f\t[OH]-[PH0]\t=\n-phosphonic acid r\t[PH]=[O]\t-\n+phosphonic acid f\t[OH]-[PX3H0]\t=\n+phosphonic acid r\t[PX4H]=[O]\t-\n", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}210{"question_id": "MSB_rdkit_rdkit_pr5136", "question_type": "multi_swe_bench", "description": "Fixes #5134 (rdkit/rdkit#5136)", "content": {"org": "rdkit", "repo": "rdkit", "pr_number": 5136, "issue_title": "Fixes #5134", "issue_body": "\r\nThis is one of those \"can't believe it survived that long\" bugs.\r\n\r\nThe fix is reasonably straightforward. Here's a description of the change (the part after the OR):\r\n```\r\n // conditions for a ring/fused ring to be considered for aromaticity here:\r\n // all atoms are candidates to be aromatic\r\n // OR\r\n // at least two members are candidates to be aromatic AND all of the\r\n // non-candidates are in at least two fused rings\r\n // This last condition is there to handle the molecule\r\n // C1=CC2=CC3=CC=C4C=C1C2C34\r\n // where the outer envelope is aromatic, but all of the sub-rings have SP3\r\n // carbons in them. (This was github #5134)\r\n```\r\n\r\nIn the process of fixing this, I also ended up fixing #5078", "base_commit": "af6347963f25cfe8fe4db0638410b2f3a8e8bd89", "resolved_issues": [{"number": 5078, "title": "Can't roundtrip CHEMBL4080644 through SMILES", "body": "**Describe the bug**\r\nThe SMILES generated from the molblock for CHEMBL4080644 cannot be sanitized:\r\n```\r\nIn [2]: chembl4080644 = \"\"\"\r\n RDKit 2D\r\n\r\n 22 25 0 0 0 0 0 0 0 0999 V2000\r\n 6.1174 -5.5956 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0\r\n 5.5355 -6.1734 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\r\n 5.9052 -6.9054 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\r\n 6.7157 -6.7800 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\r\n 6.8468 -5.9705 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\r\n 3.9896 -4.3666 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\r\n 3.9885 -5.1861 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\r\n 4.6965 -5.5951 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\r\n 4.6947 -3.9577 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\r\n 5.4033 -4.3630 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\r\n 5.4067 -5.1882 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\r\n 6.1123 -3.9452 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0\r\n 6.8293 -4.3571 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\r\n 6.8321 -5.1820 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\r\n 7.5468 -5.5902 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\r\n 8.2590 -5.1746 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\r\n 8.2522 -4.3466 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\r\n 7.5370 -3.9422 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\r\n 3.2804 -5.5941 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\r\n 8.9563 -3.9319 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\r\n 7.6601 -5.9680 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0\r\n 4.7196 -6.1277 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0\r\n 2 3 1 0\r\n 3 4 2 0\r\n 4 5 1 0\r\n 5 1 1 0\r\n 6 7 2 0\r\n 7 8 1 0\r\n 8 11 2 0\r\n 10 9 2 0\r\n 9 6 1 0\r\n 10 11 1 0\r\n 10 12 1 0\r\n 11 1 1 0\r\n 1 14 1 0\r\n 13 12 1 0\r\n 13 14 2 0\r\n 14 15 1 0\r\n 15 16 2 0\r\n 16 17 1 0\r\n 17 18 2 0\r\n 18 13 1 0\r\n 7 19 1 0\r\n 17 20 1 0\r\n 5 21 2 0\r\n 2 22 2 0\r\n 2 12 1 0\r\nM END\r\n\"\"\"\r\n\r\nIn [3]: Chem.MolToSmiles(Chem.MolFromMolBlock(chembl4080644))\r\nOut[3]: 'Cc1ccc2c(c1)-n1-c(=O)/c=c\\\\c(=O)-n-2-c2cc(C)ccc2-1'\r\n\r\nIn [4]: Chem.MolFromSmiles(_3)\r\n[05:52:40] Can't kekulize mol. Unkekulized atoms: 1 2 3 4 5 6 10 11 15 16 17 19 20 21\r\n```\r\nThis came up in discussion #5073 \r\n\r\nThe bridgehead Ns in this molecule are somehow being marked as aromatic and that's what's causing the problem.\r\nAdditional info: when parsing the SMILES corresponding to the mol block above we don't have that problem:\r\n```\r\nChem.CanonSmiles('CC1=CC=C2C(=C1)N1C(=O)/C=C\\\\C(=O)N2C2=C1C=CC(C)=C2')\r\n --> Cc1ccc2c(c1)N1C(=O)/C=C\\\\C(=O)N2c2cc(C)ccc21\r\n```\r\n\r\nThe problem is that after processing the mol block we have aromatic atoms (the two Ns) which have no aromatic bonds to them. The aromaticity code should detect this case and unset the aromaticity on the atom.\r\n\r\n**Configuration (please complete the following information):**\r\n - RDKit version: current release and master\r\n - OS: all\r\n"}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/rdkit_m_rdkit:pr-5136", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/Code/GraphMol/Aromaticity.cpp b/Code/GraphMol/Aromaticity.cpp\nindex a8b4fc67253..95a5615e890 100644\n--- a/Code/GraphMol/Aromaticity.cpp\n+++ b/Code/GraphMol/Aromaticity.cpp\n@@ -150,25 +150,24 @@ static void applyHuckelToFused(\n ROMol &mol, // molecule of interest\n const VECT_INT_VECT &srings, // list of all ring as atom IDS\n const VECT_INT_VECT &brings, // list of all rings as bond ids\n- const INT_VECT &fused, // list of ring ids in the current fused system\n+ const INT_VECT &fused, // list of ring ids in the current fused system\n+ const boost::dynamic_bitset<>\n+ &acands, // whether or not an atom is a candidate for aromaticity\n const VECT_EDON_TYPE &edon, // electron donor state for each atom\n INT_INT_VECT_MAP &ringNeighs,\n int &narom, // number of aromatic ring so far\n unsigned int maxNumFusedRings, const std::vector<Bond *> &bondsByIdx,\n unsigned int minRingSize = 0);\n \n-void markAtomsBondsArom(ROMol &mol, const VECT_INT_VECT &srings,\n+void markAtomsBondsArom(ROMol &mol, const INT_VECT &unon,\n const VECT_INT_VECT &brings, const INT_VECT &ringIds,\n std::set<unsigned int> &doneBonds,\n const std::vector<Bond *> &bondsByIdx) {\n // first mark the atoms in the rings\n- for (auto ri : ringIds) {\n- const auto å = srings[ri];\n-\n- // first mark the atoms in the ring\n- for (auto ai : aring) {\n- mol.getAtomWithIdx(ai)->setIsAromatic(true);\n- }\n+ boost::dynamic_bitset<> activeAtoms(mol.getNumAtoms());\n+ for (auto ai : unon) {\n+ activeAtoms.set(ai);\n+ mol.getAtomWithIdx(ai)->setIsAromatic(true);\n }\n \n // mark the bonds\n@@ -191,6 +190,10 @@ void markAtomsBondsArom(ROMol &mol, const VECT_INT_VECT &srings,\n // std::cerr << \" \" << bci->first << \"(\" << bci->second << \")\";\n if (bci.second == 1) {\n auto bond = bondsByIdx[bci.first];\n+ if (!activeAtoms[bond->getBeginAtomIdx()] ||\n+ !activeAtoms[bond->getEndAtomIdx()]) {\n+ continue;\n+ }\n // Bond *bond = mol.get BondWithIdx(bci->first);\n bond->setIsAromatic(true);\n switch (bond->getBondType()) {\n@@ -273,27 +276,60 @@ bool incidentMultipleBond(const Atom *at) {\n return at->getValence(Atom::ValenceType::EXPLICIT) != deg;\n }\n \n+bool ringCanBeAromatic(ROMol &, const INT_VECT &ring,\n+ const VECT_EDON_TYPE &edon, unsigned int minRingSize) {\n+ if (ring.size() < minRingSize) {\n+ return false;\n+ }\n+ unsigned int nAnyElectronDonorType = 0;\n+ for (auto idx : ring) {\n+ ElectronDonorType edonType = edon[idx];\n+ if (edonType == AnyElectronDonorType) {\n+ ++nAnyElectronDonorType;\n+ if (nAnyElectronDonorType > 1) {\n+ return false;\n+ }\n+ } else if (edonType == NoElectronDonorType) {\n+ // if the ring includes atoms which can't be aromatic we can just skip it\n+ return false;\n+ }\n+ }\n+ return true;\n+}\n+\n bool applyHuckel(ROMol &, const INT_VECT &ring, const VECT_EDON_TYPE &edon,\n- unsigned int minRingSize) {\n+ unsigned int minRingSize,\n+ const boost::dynamic_bitset<> &acands) {\n if (ring.size() < minRingSize) {\n return false;\n }\n+\n int atlw, atup, rlw, rup, rie;\n bool aromatic = false;\n rlw = 0;\n rup = 0;\n unsigned int nAnyElectronDonorType = 0;\n for (auto idx : ring) {\n+ // we shouldn't be here if there are any atoms in the ring that can't be\n+ // aromatic, but check anyway\n+ if (!acands[idx]) {\n+ return false;\n+ }\n ElectronDonorType edonType = edon[idx];\n if (edonType == AnyElectronDonorType) {\n ++nAnyElectronDonorType;\n if (nAnyElectronDonorType > 1) {\n return false;\n }\n+ } else if (edonType == NoElectronDonorType) {\n+ // if the ring includes atoms which can't be aromatic we can just skip it\n+ return false;\n }\n getMinMaxAtomElecs(edonType, atlw, atup);\n rlw += atlw;\n rup += atup;\n+ // std::cerr << \" atom: \" << idx << \": \" << atlw << \"-\" << atup <<\n+ // std::endl;\n }\n \n if (rup >= 6) {\n@@ -313,8 +349,10 @@ void applyHuckelToFused(\n ROMol &mol, // molecule of interest\n const VECT_INT_VECT &srings, // list of all ring as atom IDS\n const VECT_INT_VECT &brings, // list of all rings as bond ids\n- const INT_VECT &fused, // list of ring ids in the current fused system\n- const VECT_EDON_TYPE &edon, // electron donor state for each atom\n+ const INT_VECT &fused, // list of ring ids in the current fused system\n+ const boost::dynamic_bitset<>\n+ &acands, // whether or not an atom is a candidate for aromaticity\n+ const VECT_EDON_TYPE &edon, // electron donor state for each atom\n INT_INT_VECT_MAP &ringNeighs, // list of neighbors for each candidate ring\n int &narom, // number of aromatic ring so far\n unsigned int maxNumFusedRings, const std::vector<Bond *> &bondsByIdx,\n@@ -344,6 +382,7 @@ void applyHuckelToFused(\n }\n nRingBonds = rdcast<unsigned int>(fusedBonds.count());\n }\n+\n std::set<unsigned int> doneBonds;\n while (1) {\n if (pos == -1) {\n@@ -388,27 +427,65 @@ void applyHuckelToFused(\n if (ringNeighs.size() && !RingUtils::checkFused(curRs, ringNeighs)) {\n continue;\n }\n-\n+ std::vector<unsigned int> ringAdjacencies(\n+ mol.getNumAtoms() * mol.getNumAtoms(), 0);\n // check aromaticity on the current fused system\n INT_VECT atsInRingSystem(mol.getNumAtoms(), 0);\n for (auto ridx : curRs) {\n- for (auto rid : srings[ridx]) {\n+ const auto &sring = srings[ridx];\n+ for (auto ri = 0u; ri < sring.size(); ++ri) {\n+ auto rid = sring[ri];\n ++atsInRingSystem[rid];\n+ unsigned nextAt;\n+ if (ri < sring.size() - 1) {\n+ nextAt = sring[ri + 1];\n+ } else {\n+ nextAt = sring[0];\n+ }\n+ // keep track of which ring atoms are adjacent to each other\n+ ringAdjacencies[rid * mol.getNumAtoms() + nextAt]++;\n+ ringAdjacencies[nextAt * mol.getNumAtoms() + rid]++;\n }\n }\n INT_VECT unon;\n+ bool nonAromaticAtomsInRing = false;\n for (i = 0; i < atsInRingSystem.size(); ++i) {\n // condition for inclusion of an atom in the aromaticity of a fused ring\n // system is that it's present in one or two of the rings. this was #2895:\n // the central atom in acepentalene was being included in the count of\n // aromatic atoms\n if (atsInRingSystem[i] == 1 || atsInRingSystem[i] == 2) {\n+ if (!acands[i]) {\n+ // std::cerr << \" atom \" << i << \" not a candidate\" << std::endl;\n+ nonAromaticAtomsInRing = true;\n+ break;\n+ }\n unon.push_back(i);\n }\n }\n- if (applyHuckel(mol, unon, edon, minRingSize)) {\n+ if (nonAromaticAtomsInRing) {\n+ continue;\n+ }\n+ // make sure that we still actually have a ring: each atom which is left\n+ // should have at least(?) two connections to other atoms in the ring\n+ std::vector<unsigned int> nbrCounts(unon.size(), 0);\n+ for (auto i = 0u; i < unon.size(); ++i) {\n+ for (auto j = i; j < unon.size(); ++j) {\n+ if (ringAdjacencies[unon[i] * mol.getNumAtoms() + unon[j]]) {\n+ nbrCounts[i] += 1;\n+ nbrCounts[j] += 1;\n+ // TODO: can we stop this if we exceed 2? There's probably some edge\n+ // case where that happens\n+ }\n+ }\n+ }\n+ if (*std::min_element(nbrCounts.begin(), nbrCounts.end()) < 2) {\n+ continue;\n+ }\n+\n+ if (applyHuckel(mol, unon, edon, minRingSize, acands)) {\n // mark the atoms and bonds in these rings to be aromatic\n- markAtomsBondsArom(mol, srings, brings, curRs, doneBonds, bondsByIdx);\n+ markAtomsBondsArom(mol, unon, brings, curRs, doneBonds, bondsByIdx);\n \n // add the ring IDs to the aromatic rings found so far\n // avoid duplicates\n@@ -516,7 +593,28 @@ bool isAtomCandForArom(const Atom *at, const ElectronDonorType edon,\n }\n }\n \n- return (true);\n+ // It seems like we'd want to exclude atoms for being bridgeheads since they\n+ // are going to be 3D and not actually conjugated\n+ // But we need to be careful about that since rings fused onto macrocycles\n+ // have \"bridgeheads\" according to our definition and we don't want to\n+ // exclude things like:\n+ // c1cc2ccc1CCCCCCCCCCCCCCCC2\n+ // where atoms 2 and 5 are \"bridgeheads\" but in a macrocycle\n+ if (queryIsAtomBridgehead(at) && !nUnsaturations) {\n+ bool inMacrocycle = false;\n+ for (const auto å : at->getOwningMol().getRingInfo()->atomRings()) {\n+ if (aring.size() > 10 &&\n+ std::find(aring.begin(), aring.end(), at->getIdx()) != aring.end()) {\n+ inMacrocycle = true;\n+ break;\n+ }\n+ }\n+ if (!inMacrocycle) {\n+ return false;\n+ }\n+ }\n+\n+ return true;\n }\n \n ElectronDonorType getAtomDonorTypeArom(\n@@ -749,8 +847,8 @@ int mdlAromaticityHelper(RWMol &mol, const VECT_INT_VECT &srings) {\n RingUtils::pickFusedRings(curr, neighMap, fused, fusDone);\n const unsigned int maxFused = 6;\n const unsigned int minRingSize = 6;\n- applyHuckelToFused(mol, cRings, brings, fused, edon, neighMap, narom,\n- maxFused, bondsByIdx, minRingSize);\n+ applyHuckelToFused(mol, cRings, brings, fused, acands, edon, neighMap,\n+ narom, maxFused, bondsByIdx, minRingSize);\n \n int rix;\n for (rix = 0; rix < cnrs; ++rix) {\n@@ -827,7 +925,17 @@ int aromaticityHelper(RWMol &mol, const VECT_INT_VECT &srings,\n continue;\n }\n \n- bool allAromatic = true;\n+ // conditions for a ring/fused ring to be considered for aromaticity here:\n+ // all atoms are candidates to be aromatic\n+ // OR\n+ // at least two members are candidates to be aromatic AND all of the\n+ // non-candidates are in at least two fused rings\n+ // This last condition is there to handle the molecule\n+ // C1=CC2=CC3=CC=C4C=C1C2C34\n+ // where the outer envelope is aromatic, but all of the sub-rings have SP3\n+ // carbons in them. (This was github #5134)\n+ unsigned int numNonAromatic = 0;\n+ bool nonCandidatesInFusedRings = true;\n bool allDummy = true;\n for (auto firstIdx : sring) {\n const auto at = mol.getAtomWithIdx(firstIdx);\n@@ -838,7 +946,10 @@ int aromaticityHelper(RWMol &mol, const VECT_INT_VECT &srings,\n \n if (aseen[firstIdx]) {\n if (!acands[firstIdx]) {\n- allAromatic = false;\n+ ++numNonAromatic;\n+ nonCandidatesInFusedRings =\n+ nonCandidatesInFusedRings &&\n+ (mol.getRingInfo()->numAtomRings(firstIdx) >= 2);\n }\n continue;\n }\n@@ -851,14 +962,18 @@ int aromaticityHelper(RWMol &mol, const VECT_INT_VECT &srings,\n edon[firstIdx] = getAtomDonorTypeArom(at);\n acands[firstIdx] = isAtomCandForArom(at, edon[firstIdx]);\n if (!acands[firstIdx]) {\n- allAromatic = false;\n+ ++numNonAromatic;\n+ nonCandidatesInFusedRings =\n+ nonCandidatesInFusedRings &&\n+ (mol.getRingInfo()->numAtomRings(firstIdx) >= 2);\n }\n }\n- if (allAromatic && !allDummy) {\n+ if (!allDummy &&\n+ (!numNonAromatic ||\n+ ((sring.size() - numNonAromatic) >= 2 && nonCandidatesInFusedRings))) {\n cRings.push_back(sring);\n }\n }\n-\n // first convert all rings to bonds ids\n VECT_INT_VECT brings;\n RingUtils::convertToBonds(cRings, brings, mol);\n@@ -878,8 +993,8 @@ int aromaticityHelper(RWMol &mol, const VECT_INT_VECT &srings,\n fused.push_back(ri);\n const unsigned int maxFused = 6;\n const unsigned int minRingSize = 0;\n- applyHuckelToFused(mol, cRings, brings, fused, edon, neighMap, narom,\n- maxFused, bondsByIdx, minRingSize);\n+ applyHuckelToFused(mol, cRings, brings, fused, acands, edon, neighMap,\n+ narom, maxFused, bondsByIdx, minRingSize);\n }\n } else {\n // make the neighbor map for the rings\n@@ -900,8 +1015,8 @@ int aromaticityHelper(RWMol &mol, const VECT_INT_VECT &srings,\n while (curr < cnrs) {\n fused.clear();\n RingUtils::pickFusedRings(curr, neighMap, fused, fusDone);\n- applyHuckelToFused(mol, cRings, brings, fused, edon, neighMap, narom, 6,\n- bondsByIdx);\n+ applyHuckelToFused(mol, cRings, brings, fused, acands, edon, neighMap,\n+ narom, 6, bondsByIdx);\n \n int rix;\n for (rix = 0; rix < cnrs; ++rix) {\ndiff --git a/Code/GraphMol/catch_graphmol.cpp b/Code/GraphMol/catch_graphmol.cpp\nindex 8fd8ba0a729..3edc31fdfed 100644\n--- a/Code/GraphMol/catch_graphmol.cpp\n+++ b/Code/GraphMol/catch_graphmol.cpp\n@@ -2662,6 +2662,145 @@ TEST_CASE(\"Github #5055\") {\n REQUIRE(m);\n }\n }\n+\n+TEST_CASE(\"Github #5134: Fused ring system not perceived as aromatic\") {\n+#if 1\n+ SECTION(\"as reported\") {\n+ auto m = \"C1=CC2=CC3=CC=C4C=C1C2C34\"_smiles;\n+ REQUIRE(m);\n+ for (auto i = 0u; i < 10; ++i) {\n+ CHECK(m->getAtomWithIdx(i)->getIsAromatic());\n+ }\n+ }\n+ SECTION(\"Related\") {\n+ auto m = \"C1=CC2=CC=C3C=CC=C4C=CC(=C1)C2C34\"_smiles;\n+ REQUIRE(m);\n+ for (auto i = 0u; i < 14; ++i) {\n+ CHECK(m->getAtomWithIdx(i)->getIsAromatic());\n+ }\n+ }\n+ SECTION(\"some edge cases where the new rule does not apply\") {\n+ std::vector<std::string> smis = {\"C1CC2C=C3C=CC4=CC1C2C34\",\n+ \"C1C=C2C=CC3=CC=C1C23\"};\n+ for (const auto &smi : smis) {\n+ std::unique_ptr<ROMol> mol(SmilesToMol(smi));\n+ REQUIRE(mol);\n+ for (auto atom : mol->atoms()) {\n+ CHECK(!atom->getIsAromatic());\n+ }\n+ }\n+ }\n+ SECTION(\"no bridgeheads!\") {\n+ auto m = \"O=C1C2=C(C=CC=C2)C(=O)C3=C1C4C5=C(C=CC=C5)C3C6=C4C=CC=C6\"_smiles;\n+ REQUIRE(m);\n+ CHECK(!m->getAtomWithIdx(12)->getIsAromatic());\n+ CHECK(!m->getAtomWithIdx(19)->getIsAromatic());\n+ }\n+ SECTION(\"Github #5078: Can't roundtrip CHEMBL4080644 through SMILES\") {\n+ auto m = R\"CTAB(\n+ RDKit 2D\n+\n+ 22 25 0 0 0 0 0 0 0 0999 V2000\n+ 6.1174 -5.5956 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0\n+ 5.5355 -6.1734 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\n+ 5.9052 -6.9054 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\n+ 6.7157 -6.7800 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\n+ 6.8468 -5.9705 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\n+ 3.9896 -4.3666 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\n+ 3.9885 -5.1861 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\n+ 4.6965 -5.5951 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\n+ 4.6947 -3.9577 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\n+ 5.4033 -4.3630 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\n+ 5.4067 -5.1882 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\n+ 6.1123 -3.9452 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0\n+ 6.8293 -4.3571 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\n+ 6.8321 -5.1820 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\n+ 7.5468 -5.5902 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\n+ 8.2590 -5.1746 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\n+ 8.2522 -4.3466 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\n+ 7.5370 -3.9422 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\n+ 3.2804 -5.5941 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\n+ 8.9563 -3.9319 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\n+ 7.6601 -5.9680 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0\n+ 4.7196 -6.1277 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0\n+ 2 3 1 0\n+ 3 4 2 0\n+ 4 5 1 0\n+ 5 1 1 0\n+ 6 7 2 0\n+ 7 8 1 0\n+ 8 11 2 0\n+ 10 9 2 0\n+ 9 6 1 0\n+ 10 11 1 0\n+ 10 12 1 0\n+ 11 1 1 0\n+ 1 14 1 0\n+ 13 12 1 0\n+ 13 14 2 0\n+ 14 15 1 0\n+ 15 16 2 0\n+ 16 17 1 0\n+ 17 18 2 0\n+ 18 13 1 0\n+ 7 19 1 0\n+ 17 20 1 0\n+ 5 21 2 0\n+ 2 22 2 0\n+ 2 12 1 0\n+M END)CTAB\"_ctab;\n+ REQUIRE(m);\n+ CHECK(!m->getAtomWithIdx(11)->getIsAromatic());\n+ CHECK(!m->getAtomWithIdx(0)->getIsAromatic());\n+ auto smiles = MolToSmiles(*m);\n+ std::unique_ptr<RWMol> m2(SmilesToMol(smiles));\n+ REQUIRE(m2);\n+ }\n+ SECTION(\"trickier\") {\n+ auto m = \"C1=CC2=CC=C3C=CC4=CC=C5C=CC=C6C5C4C3C2C6=C1\"_smiles;\n+ REQUIRE(m);\n+ for (auto i = 0u; i < 16; ++i) {\n+ CHECK(m->getAtomWithIdx(i)->getIsAromatic());\n+ }\n+ CHECK(m->getAtomWithIdx(20)->getIsAromatic());\n+ }\n+ SECTION(\"another odd edge case\") {\n+ auto m = \"C2=CC1=S(S2)SC=C1\"_smiles;\n+ REQUIRE(m);\n+ for (auto atom : m->atoms()) {\n+ CHECK(!atom->getIsAromatic());\n+ }\n+ }\n+ SECTION(\"macrocycle bridgehead edge case\") {\n+ auto m = \"C2CCCCCCCCCN1C=C(CC2)C=CC1=O\"_smiles;\n+ REQUIRE(m);\n+ CHECK(m->getAtomWithIdx(10)->getIsAromatic());\n+ CHECK(m->getAtomWithIdx(11)->getIsAromatic());\n+ CHECK(m->getAtomWithIdx(12)->getIsAromatic());\n+ }\n+ SECTION(\"found during testing\") {\n+ auto m =\n+ \"c1ccc2c(c1)c1cc[n+]2Cc2ccc(cc2)C[n+]2ccc(c3ccccc32)NCc2ccc(cc2)CN1\"_smiles;\n+ REQUIRE(m);\n+ CHECK(m->getAtomWithIdx(6)->getIsAromatic());\n+ CHECK(m->getAtomWithIdx(11)->getIsAromatic());\n+ CHECK(m->getAtomWithIdx(18)->getIsAromatic());\n+ CHECK(m->getAtomWithIdx(30)->getIsAromatic());\n+\n+ CHECK(!m->getAtomWithIdx(28)->getIsAromatic());\n+ CHECK(!m->getAtomWithIdx(29)->getIsAromatic());\n+ }\n+#endif\n+ SECTION(\"more testing fun\") {\n+ auto m = \"CC1C2c3ccccc3C(c3ccccc32)C1CN\"_smiles;\n+ REQUIRE(m);\n+ CHECK(m->getAtomWithIdx(4)->getIsAromatic());\n+ CHECK(m->getAtomWithIdx(14)->getIsAromatic());\n+ CHECK(!m->getAtomWithIdx(2)->getIsAromatic());\n+ CHECK(!m->getAtomWithIdx(9)->getIsAromatic());\n+ }\n+}\n+\n TEST_CASE(\"Iterators\") {\n auto m = \"CCCCCCC=N\"_smiles;\n REQUIRE(m);\n@@ -2964,26 +3103,45 @@ TEST_CASE(\"molecules with single bond to metal atom use dative instead\") {\n {\"CC1=C(CCC(O)=O)C2=[N]3C1=Cc1c(C)c(C=C)c4C=C5C(C)=C(C=C)C6=[N]5[Fe]3(n14)n1c(=C6)c(C)c(CCC(O)=O)c1=C2\",\n \"C=CC1=C(C)C2=Cc3c(C=C)c(C)c4n3[Fe]35<-N2=C1C=c1c(C)c(CCC(=O)O)c(n13)=CC1=N->5C(=C4)C(C)=C1CCC(=O)O\"},\n {\"CC1=C(CCC([O-])=O)C2=[N+]3C1=Cc1c(C)c(C=C)c4C=C5C(C)=C(C=C)C6=[N+]5[Fe--]3(n14)n1c(=C6)c(C)c(CCC([O-])=O)c1=C2\",\n- \"C=CC1=C(C)C2=Cc3c(C=C)c(C)c4n3[Fe-2]35n6c(c(C)c(CCC(=O)[O-])c6=CC6=[N+]3C(=C4)C(C)=C6CCC(=O)[O-])=CC1=[N+]25\"},\n+ \"C=Cc1c(C)c2cc3c(C)c(CCC(=O)[O-])c4cc5c(CCC(=O)[O-])c(C)c6cc7c(C=C)c(C)c8cc1n2[Fe-2](n65)([n+]87)[n+]34\"},\n {\"CC1=C(CCC(O)=O)C2=[N+]3C1=Cc1c(C)c(C=C)c4C=C5C(C)=C(C=C)C6=[N+]5[Fe--]3(n14)n1c(=C6)c(C)c(CCC(O)=O)c1=C2\",\n- \"C=CC1=C(C)C2=Cc3c(C=C)c(C)c4n3[Fe-2]35n6c(c(C)c(CCC(=O)O)c6=CC6=[N+]3C(=C4)C(C)=C6CCC(=O)O)=CC1=[N+]25\"},\n+ \"C=Cc1c(C)c2cc3c(C)c(CCC(=O)O)c4cc5c(CCC(=O)O)c(C)c6cc7c(C=C)c(C)c8cc1n2[Fe-2](n65)([n+]87)[n+]34\"},\n {\"CCC1=[O+][Cu]2([O+]=C(CC)C1)[O+]=C(CC)CC(CC)=[O+]2\",\n \"CCC1=[O+][Cu]2([O+]=C(CC)C1)[O+]=C(CC)CC(CC)=[O+]2\"}};\n for (size_t i = 0; i < test_vals.size(); ++i) {\n INFO(test_vals[i].first);\n RWMOL_SPTR m(RDKit::SmilesToMol(test_vals[i].first));\n CHECK(MolToSmiles(*m) == test_vals[i].second);\n+ // make sure the metal atoms are not aromatic and have no aromatic bonds:\n+ for (auto atom : m->atoms()) {\n+ if (atom->getAtomicNum() == 26 || atom->getAtomicNum() == 29) {\n+ CHECK(!atom->getIsAromatic());\n+ for (auto bond : m->atomBonds(atom)) {\n+ CHECK(!bond->getIsAromatic());\n+ }\n+ }\n+ }\n }\n+\n // make sure we can call cleanupOrganometallics() on non-sanitized molecules\n for (size_t i = 0; i < test_vals.size(); ++i) {\n INFO(test_vals[i].first);\n bool sanitize = false;\n RWMOL_SPTR m(RDKit::SmilesToMol(test_vals[i].first, 0, sanitize));\n MolOps::cleanUpOrganometallics(*m);\n+ MolOps::sanitizeMol(*m);\n CHECK(MolToSmiles(*m) == test_vals[i].second);\n+ // make sure the metal atoms are not aromatic and have no aromatic bonds:\n+ for (auto atom : m->atoms()) {\n+ if (atom->getAtomicNum() == 26 || atom->getAtomicNum() == 29) {\n+ CHECK(!atom->getIsAromatic());\n+ for (auto bond : m->atomBonds(atom)) {\n+ CHECK(!bond->getIsAromatic());\n+ }\n+ }\n+ }\n }\n }\n-\n TEST_CASE(\n \"cleanUpOrganometallics should produce canonical output. cf PR6292\") {\n std::vector<std::pair<std::string, std::string>> test_vals{\n@@ -3207,8 +3365,8 @@ M END\n CHECK(distToTarget.lengthSq() < 0.1);\n }\n \n- SECTION(\"Counterclockwise\") { // Chiral Tag (CCW) Different from CIPCode (R)\n- // due to different ordering of atoms\n+ SECTION(\"Counterclockwise\") { // Chiral Tag (CCW) Different from CIPCode\n+ // (R) due to different ordering of atoms\n std::string mb = R\"CTAB(testmol\n CT1066645023\n \n@@ -4529,8 +4687,8 @@ M END\n }\n }\n }\n- // if we aren't in a five-ring (where the results of kekulize are normally\n- // fixed), wedge the double bond and flatten the other one\n+ // if we aren't in a five-ring (where the results of kekulize are\n+ // normally fixed), wedge the double bond and flatten the other one\n if (wedgedBond && dblBond &&\n !m->getRingInfo()->isBondInRingOfSize(dblBond->getIdx(), 5) &&\n !m->getRingInfo()->isBondInRingOfSize(wedgedBond->getIdx(), 5)) {\n@@ -4548,8 +4706,8 @@ M END\n // }\n // std::cerr << \"\\n\\nbefore kekulize:\" << std::endl;\n // m->debugMol(std::cerr);\n- // kekulize again now that we wedged the bonds that were set to double\n- // before\n+ // kekulize again now that we wedged the bonds that were set to\n+ // double before\n MolOps::Kekulize(*m, clearAromaticFlags);\n // and make sure that those didn't end up double again:\n for (auto atm : {bnd->getBeginAtom(), bnd->getEndAtom()}) {\n"}, "test": {"test_patch": "diff --git a/Code/GraphMol/molopstest.cpp b/Code/GraphMol/molopstest.cpp\nindex 813f5aac1e7..64ed1a38278 100644\n--- a/Code/GraphMol/molopstest.cpp\n+++ b/Code/GraphMol/molopstest.cpp\n@@ -536,7 +536,6 @@ void test5() {\n delete m;\n }\n \n-\n void test8() {\n BOOST_LOG(rdInfoLog) << \"-----------------------\\n Testing Hydrogen Ops\"\n << std::endl;\n@@ -3499,7 +3498,13 @@ void testSFNetIssue2196817() {\n {\n ROMOL_SPTR m = \"C1=CC2=CC=C3C=CC4=CC=C5C=CN1*1*2*3*4N51\"_smiles;\n for (const auto a : m->atoms()) {\n- TEST_ASSERT(a->getIsAromatic());\n+ if (a->getAtomicNum() > 0 || a->getIdx() == 15 || a->getIdx() == 18) {\n+ TEST_ASSERT(a->getIsAromatic());\n+ } else if (a->getIdx() == 16 || a->getIdx() == 17) {\n+ TEST_ASSERT(!a->getIsAromatic());\n+ } else {\n+ TEST_ASSERT(0);\n+ }\n }\n unsigned int nNonAromaticBonds = 0;\n for (const auto b : m->bonds()) {\n@@ -4111,8 +4116,8 @@ void testSFNetIssue3525076() {\n void testBasicCanon() {\n BOOST_LOG(rdInfoLog) << \"-------------------------------------\" << std::endl;\n BOOST_LOG(rdInfoLog) << \"Testing canonicalization basics\" << std::endl;\n-// these are all cases that were problematic at one time or another during\n-// the canonicalization rewrite.\n+ // these are all cases that were problematic at one time or another during\n+ // the canonicalization rewrite.\n {\n std::string smi = \"FC1C(=C/Cl)\\\\C1\";\n RWMol *m = SmilesToMol(smi);\n@@ -7129,21 +7134,22 @@ void testGithubIssue868() {\n }\n \n // test atom type query merging\n- for (int aromatic =0; aromatic<2; ++aromatic) {\n+ for (int aromatic = 0; aromatic < 2; ++aromatic) {\n sstrm.str(\"\");\n TEST_ASSERT(sstrm.str() == \"\");\n RWMol m;\n QueryAtom *qa = new QueryAtom();\n qa->setQuery(makeAtomTypeQuery(1, aromatic));\n- qa->expandQuery(makeAtomNumQuery(6), Queries::CompositeQueryType::COMPOSITE_OR);\n+ qa->expandQuery(makeAtomNumQuery(6),\n+ Queries::CompositeQueryType::COMPOSITE_OR);\n m.addAtom(qa, true, true);\n MolOps::mergeQueryHs(m);\n TEST_ASSERT(sstrm.str().find(\"merging explicit H queries involved in \"\n-\t\t\t\t \"ORs is not supported\") != std::string::npos);\n+ \"ORs is not supported\") != std::string::npos);\n TEST_ASSERT(sstrm.str().find(\"This query will not be merged\") !=\n-\t\tstd::string::npos);\n+ std::string::npos);\n }\n- \n+\n {\n sstrm.str(\"\");\n TEST_ASSERT(sstrm.str() == \"\");\n@@ -8497,11 +8503,11 @@ void testHasQueryHs() {\n has_only_query_hs);\n \n auto github7687 = \"[#1,#6,#7]\"_smarts;\n- TEST_ASSERT(RDKit::MolOps::hasQueryHs(*github7687) == has_unmergeable_hs );\n+ TEST_ASSERT(RDKit::MolOps::hasQueryHs(*github7687) == has_unmergeable_hs);\n auto github7687b = \"[1;#7,#1,#6]\"_smarts;\n- TEST_ASSERT(RDKit::MolOps::hasQueryHs(*github7687b) == has_unmergeable_hs );\n+ TEST_ASSERT(RDKit::MolOps::hasQueryHs(*github7687b) == has_unmergeable_hs);\n auto github7687c = \"[1,#1,#6]\"_smarts;\n- TEST_ASSERT(RDKit::MolOps::hasQueryHs(*github7687c) == has_unmergeable_hs );\n+ TEST_ASSERT(RDKit::MolOps::hasQueryHs(*github7687c) == has_unmergeable_hs);\n BOOST_LOG(rdInfoLog) << \"\\tdone\" << std::endl;\n }\n \n", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}211{"question_id": "MSB_rdkit_rdkit_pr5445", "question_type": "multi_swe_bench", "description": "Molzip: save bond dir when zipping (rdkit/rdkit#5445)", "content": {"org": "rdkit", "repo": "rdkit", "pr_number": 5445, "issue_title": "Molzip: save bond dir when zipping", "issue_body": "Fixes #5450 \r\n\r\nSimple fix to allow mol zip to save the bond direction when zipping molecules.\r\n\r\nThis is necessary for the CDXML parser.", "base_commit": "7045f4606c2fa9e47b4f339ac0197b85a9b5a9a5", "resolved_issues": [{"number": 5450, "title": "MolZip doesn't preserve bond directions when zipping", "body": "This is more esoteric, but required for cdxml parsing."}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/rdkit_m_rdkit:pr-5445", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/Code/GraphMol/ChemTransforms/MolFragmenter.cpp b/Code/GraphMol/ChemTransforms/MolFragmenter.cpp\nindex 80b5d7ee6d7..762b8f05aa4 100644\n--- a/Code/GraphMol/ChemTransforms/MolFragmenter.cpp\n+++ b/Code/GraphMol/ChemTransforms/MolFragmenter.cpp\n@@ -746,18 +746,72 @@ struct ZipBond {\n \"molzip: begin atom and specified dummy atom connection \"\n \"are not bonded.\")\n auto bond_type_a = bnd->getBondType();\n+ auto bond_dir_a = bnd->getBondDir();\n+ auto a_is_start = bnd->getBeginAtom() == a;\n+ \n bnd = newmol.getBondBetweenAtoms(b->getIdx(), b_dummy->getIdx());\n CHECK_INVARIANT(bnd != nullptr,\n \"molzip: end atom and specified dummy connection atom \"\n \"are not bonded.\")\n auto bond_type_b = bnd->getBondType();\n+\n+ auto bond_dir_b = bnd->getBondDir();\n+ auto b_is_start = bnd->getBeginAtom() == b;\n+ \n+ unsigned int bnd_idx = 0;\n+ // Fusion bond-dir logic table\n+ // a-* b-* => a-b\n+ // < = wedge\n+\n+ // a<* b-* => a<b\n+ // a>* b-* => a>b\n+ // a-* b>* => a<b\n+ // a-* b<* => a>b\n+ Bond::BondDir bond_dir;\n+ auto start = a;\n+ auto end = b;\n+ if(bond_dir_a != Bond::BondDir::NONE && bond_dir_b != Bond::BondDir::NONE) {\n+ // are we consistent between the two bond orders\n+ // check for the case of fragment on bonds where a<* and b>* or a>* and b<*\n+ // when < is either a hash or wedge bond but not both.\n+ bool consistent_directions = false;\n+ if(bond_dir_a == bond_dir_b) {\n+ if((a_is_start != b_is_start)){\n+ consistent_directions = true;\n+ }\n+ }\n+ if(!consistent_directions) {\n+ BOOST_LOG(rdWarningLog) << \"inconsistent bond directions when merging fragments, ignoring...\" << std::endl;\n+ bond_dir_a = bond_dir_b = Bond::BondDir::NONE;\n+ } else {\n+ bond_dir_b = Bond::BondDir::NONE;\n+ }\n+ }\n+ \n+ if (bond_dir_a != Bond::BondDir::NONE) {\n+ if(!a_is_start) {\n+ start = b;\n+ end = a;\n+ }\n+ bond_dir = bond_dir_a;\n+ } else if (bond_dir_b != Bond::BondDir::NONE) {\n+ if(b_is_start) {\n+ start = b;\n+ end = a;\n+ }\n+ bond_dir = bond_dir_b;\n+ }\n+ \n if (bond_type_a != Bond::BondType::SINGLE) {\n- newmol.addBond(a, b, bond_type_a);\n+ bnd_idx = newmol.addBond(start, end, bond_type_a);\n } else if (bond_type_b != Bond::BondType::SINGLE) {\n- newmol.addBond(a, b, bond_type_b);\n+ bnd_idx = newmol.addBond(start, end, bond_type_b);\n } else {\n- newmol.addBond(a, b, Bond::BondType::SINGLE);\n+ bnd_idx = newmol.addBond(start, end, Bond::BondType::SINGLE);\n }\n+ \n+ newmol.getBondWithIdx(bnd_idx-1)->setBondDir(bond_dir);\n+\n }\n a_dummy->setProp(\"__molzip_used\", true);\n b_dummy->setProp(\"__molzip_used\", true);\n"}, "test": {"test_patch": "diff --git a/Code/GraphMol/ChemTransforms/catch_tests.cpp b/Code/GraphMol/ChemTransforms/catch_tests.cpp\nindex d06c126d3d6..1d020a5436c 100644\n--- a/Code/GraphMol/ChemTransforms/catch_tests.cpp\n+++ b/Code/GraphMol/ChemTransforms/catch_tests.cpp\n@@ -398,6 +398,54 @@ TEST_CASE(\"molzip\", \"[]\") {\n auto b = \"[*:1]-N=C\"_smiles;\n auto mol = molzip(*a, *b, p);\n }\n+\n+ SECTION(\"MolZip saves bonddir\") {\n+ { // a-* b<*\n+ auto a = \"CC[*:1]\"_smiles;\n+ auto b = \"N[*:1]\"_smiles;\n+ b->getBondWithIdx(0)->setBondDir(Bond::BondDir::BEGINWEDGE);\n+ auto mol = molzip(*a, *b);\n+ CHECK(MolToSmiles(*mol) == \"CCN\");\n+ CHECK(mol->getBondWithIdx(1)->getBondDir() == Bond::BondDir::BEGINWEDGE);\n+ CHECK(mol->getBondWithIdx(1)->getBeginAtom()->getIdx() == 2);\n+ }\n+ { // a>* b-*\n+ auto a = \"[*:1]CC\"_smiles;\n+ auto b = \"N[*:1]\"_smiles;\n+ a->getBondWithIdx(0)->setBondDir(Bond::BondDir::BEGINWEDGE);\n+ auto mol = molzip(*a, *b);\n+ CHECK(MolToSmiles(*mol) == \"CCN\");\n+ CHECK(mol->getBondWithIdx(1)->getBondDir() == Bond::BondDir::BEGINWEDGE);\n+ CHECK(mol->getBondWithIdx(1)->getBeginAtom()->getIdx() == 2);\n+ }\n+ { // a<* b-*\n+ auto a = \"CC[*:1]\"_smiles;\n+ auto b = \"N[*:1]\"_smiles;\n+ a->getBondWithIdx(1)->setBondDir(Bond::BondDir::BEGINWEDGE);\n+ auto mol = molzip(*a, *b);\n+ CHECK(MolToSmiles(*mol) == \"CCN\");\n+ CHECK(mol->getBondWithIdx(1)->getBondDir() == Bond::BondDir::BEGINWEDGE);\n+ CHECK(mol->getBondWithIdx(1)->getBeginAtom()->getIdx() == 1);\n+ }\n+ { // a>* b-*\n+ auto a = \"[*:1]CC\"_smiles;\n+ auto b = \"N[*:1]\"_smiles;\n+ a->getBondWithIdx(0)->setBondDir(Bond::BondDir::BEGINWEDGE);\n+ auto mol = molzip(*a, *b);\n+ CHECK(MolToSmiles(*mol) == \"CCN\");\n+ CHECK(mol->getBondWithIdx(1)->getBondDir() == Bond::BondDir::BEGINWEDGE);\n+ CHECK(mol->getBondWithIdx(1)->getBeginAtom()->getIdx() == 2);\n+ }\n+ { // a-* b<*\n+ auto a = \"CC[*:1]\"_smiles;\n+ auto b = \"[*:1]N\"_smiles;\n+ b->getBondWithIdx(0)->setBondDir(Bond::BondDir::BEGINWEDGE);\n+ auto mol = molzip(*a, *b);\n+ CHECK(MolToSmiles(*mol) == \"CCN\");\n+ CHECK(mol->getBondWithIdx(1)->getBondDir() == Bond::BondDir::BEGINWEDGE);\n+ CHECK(mol->getBondWithIdx(1)->getBeginAtom()->getIdx() == 1);\n+ }\n+ }\n }\n \n TEST_CASE(\n", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}212{"question_id": "MSB_rdkit_rdkit_pr5542", "question_type": "multi_swe_bench", "description": "Fixes #5402 (rdkit/rdkit#5542)", "content": {"org": "rdkit", "repo": "rdkit", "pr_number": 5542, "issue_title": "Fixes #5402", "issue_body": "The problem here was a transformation (the \"special imine r\") which applied to this Kekule form of an aromatic substructure:\r\n\r\nbut not this one:\r\n\r\n\r\nThis fix adds a new rule to detect and handle the second case. Along the way I also had to modify a bit of the logic for applying transforms to support transform rules with branched queries, but this is a simple change.\r\n\r\nI wouldn't be horribly surprised to discover that there are more of this type of error in the default transformations, but it's non-trivial to identify them directly.", "base_commit": "383af8895c55f5d0bb41430bc45abc838954eaf5", "resolved_issues": [{"number": 5402, "title": "Tautomer enumeration removes stereochemistry depending on how aromatic rings are defined in SMILES", "body": "Here's a compact demonstration:\r\n```\r\nIn [12]: m = Chem.MolFromSmiles(\"c1ccc([C@@H](CC2=NCCN2)c2ccccn2)cc1\")\r\n\r\nIn [13]: nm = Chem.Mol(m)\r\n\r\nIn [14]: Chem.Kekulize(nm, True)\r\n\r\nIn [15]: Chem.MolToSmiles(enum.Canonicalize(m))\r\nOut[15]: 'c1ccc([C@@H](CC2=NCCN2)c2ccccn2)cc1'\r\n\r\nIn [16]: Chem.MolToSmiles(enum.Canonicalize(nm))\r\nOut[16]: 'c1ccc(C(CC2=NCCN2)c2ccccn2)cc1'\r\n```\r\n\r\n### Discussed in https://github.com/rdkit/rdkit/discussions/5397\r\n\r\n<div type='discussions-op-text'>\r\n\r\n<sup>Originally posted by **gedeck** July 1, 2022</sup>\r\nBefore I file an issue, I would like to make sure that it is one. The Tautomer enumerator behaves differently if the structure is loaded from a SMILES where the aromatic bonds are defined using kekule format or not.\r\n```\r\nfrom rdkit import Chem\r\nfrom rdkit.Chem.MolStandardize import rdMolStandardize\r\nfrom rdkit.Chem import Draw\r\n\r\nenumerator = rdMolStandardize.TautomerEnumerator()\r\n\r\nsmiles = 'c1ccc([C@@H](CC2=NCCN2)c2ccccn2)cc1'\r\nmol = Chem.MolFromSmiles(smiles)\r\nDraw.MolsToGridImage([mol, enumerator.Canonicalize(mol)])\r\n```\r\nIn this case, the stereochemistry of the carbon is preserved:\r\n\r\n\r\n\r\nIf on the other hand, the aromatic rings are described with single and double bonds\r\n```\r\nsmiles = 'C([C@H](C1=CC=CC=C1)C2=NC=CC=C2)C3=NCCN3'\r\nmol = Chem.MolFromSmiles(smiles)\r\nDraw.MolsToGridImage([mol, enumerator.Canonicalize(mol)])\r\n```\r\nthe stereochemistry is removed.\r\n\r\n</div>"}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/rdkit_m_rdkit:pr-5542", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/Code/GraphMol/MolStandardize/Tautomer.cpp b/Code/GraphMol/MolStandardize/Tautomer.cpp\nindex 247f5fa7826..901a50f7abb 100644\n--- a/Code/GraphMol/MolStandardize/Tautomer.cpp\n+++ b/Code/GraphMol/MolStandardize/Tautomer.cpp\n@@ -28,8 +28,6 @@\n #include <GraphMol/SmilesParse/SmartsWrite.h>\n #endif\n \n-using namespace RDKit;\n-\n namespace RDKit {\n \n namespace MolStandardize {\n@@ -342,8 +340,10 @@ TautomerEnumeratorResult TautomerEnumerator::enumerate(const ROMol &mol) const {\n #ifdef VERBOSE_ENUMERATION\n std::string name;\n (transform.Mol)->getProp(common_properties::_Name, name);\n+ SmilesWriteParams smilesWriteParams;\n+ smilesWriteParams.allBondsExplicit = true;\n std::cout << \"kmol for \" << smilesTautomerPair.first << \" : \"\n- << MolToSmiles(*kmol) << std::endl;\n+ << MolToSmiles(*kmol, smilesWriteParams) << std::endl;\n std::cout << \"transform mol: \" << MolToSmarts(*(transform.Mol))\n << std::endl;\n \n@@ -385,9 +385,11 @@ TautomerEnumeratorResult TautomerEnumerator::enumerate(const ROMol &mol) const {\n last->setNoImplicit(true);\n // Adjust bond orders\n unsigned int bi = 0;\n- for (size_t i = 0; i < match.size() - 1; ++i) {\n- Bond *bond = product->getBondBetweenAtoms(match[i].second,\n- match[i + 1].second);\n+ for (size_t i = 0; i < transform.Mol->getNumBonds(); ++i) {\n+ const auto tbond = transform.Mol->getBondWithIdx(i);\n+ Bond *bond = product->getBondBetweenAtoms(\n+ match[tbond->getBeginAtomIdx()].second,\n+ match[tbond->getEndAtomIdx()].second);\n ASSERT_INVARIANT(bond, \"required bond not found\");\n // check if bonds is specified in tautomer.in file\n if (!transform.BondTypes.empty()) {\n@@ -424,6 +426,14 @@ TautomerEnumeratorResult TautomerEnumerator::enumerate(const ROMol &mol) const {\n transform.Charges[ci++]);\n }\n }\n+#ifdef VERBOSE_ENUMERATION\n+ {\n+ SmilesWriteParams smilesWriteParams;\n+ smilesWriteParams.allBondsExplicit = true;\n+ std::cout << \"pre-sanitize: \"\n+ << MolToSmiles(*product, smilesWriteParams) << std::endl;\n+ }\n+#endif\n \n unsigned int failedOp;\n MolOps::sanitizeMol(*product, failedOp,\n@@ -433,8 +443,10 @@ TautomerEnumeratorResult TautomerEnumerator::enumerate(const ROMol &mol) const {\n MolOps::SANITIZE_SETHYBRIDIZATION |\n MolOps::SANITIZE_ADJUSTHS);\n #ifdef VERBOSE_ENUMERATION\n- std::cout << \"pre-setTautomerStereo: \" << MolToSmiles(*product, true)\n- << std::endl;\n+ SmilesWriteParams smilesWriteParams;\n+ smilesWriteParams.allBondsExplicit = true;\n+ std::cout << \"pre-setTautomerStereo: \"\n+ << MolToSmiles(*product, smilesWriteParams) << std::endl;\n #endif\n setTautomerStereoAndIsoHs(mol, *product, res);\n tsmiles = MolToSmiles(*product, true);\n@@ -472,7 +484,8 @@ TautomerEnumeratorResult TautomerEnumerator::enumerate(const ROMol &mol) const {\n std::cout << \"New tautomer replaced for \";\n }\n std::cout << tsmiles << \", taut: \" << MolToSmiles(*product)\n- << \", kek: \" << MolToSmiles(*kekulized_product, true, true)\n+ << \", kek: \"\n+ << MolToSmiles(*kekulized_product, smilesWriteParams)\n << std::endl;\n #endif\n // BOOST_LOG(rdInfoLog)\ndiff --git a/Code/GraphMol/MolStandardize/TautomerCatalog/tautomerTransforms.in b/Code/GraphMol/MolStandardize/TautomerCatalog/tautomerTransforms.in\nindex 2ac09548b6f..4ea7850b305 100644\n--- a/Code/GraphMol/MolStandardize/TautomerCatalog/tautomerTransforms.in\n+++ b/Code/GraphMol/MolStandardize/TautomerCatalog/tautomerTransforms.in\n@@ -40,6 +40,9 @@ const std::vector<\n std::make_tuple(std::string(\"special imine r\"),\n std::string(\"[Cz0R0X4!H0]-[c]=[nz0]\"), std::string(\"\"),\n std::string(\"\")),\n+ std::make_tuple(std::string(\"special imine r2\"),\n+ std::string(\"[Cz0R0X4!H0]-[cr6](=[cr6])-[nr6H0z0]\"),\n+ std::string(\"==-\"), std::string(\"\")),\n std::make_tuple(std::string(\"1,3 aromatic heteroatom H shift f\"),\n std::string(\"[#7+0!H0]-[#6R1]=[O,#7X2+0]\"),\n std::string(\"\"), std::string(\"\")),\n"}, "test": {"test_patch": "diff --git a/Code/GraphMol/MolStandardize/catch_tests.cpp b/Code/GraphMol/MolStandardize/catch_tests.cpp\nindex 1307c0e678a..19331afd7c2 100644\n--- a/Code/GraphMol/MolStandardize/catch_tests.cpp\n+++ b/Code/GraphMol/MolStandardize/catch_tests.cpp\n@@ -978,3 +978,50 @@ TEST_CASE(\"Github #5320: cleanup() and stereochemistry\") {\n CHECK(MolToSmiles(*m2) == \"O=C([O-])C(O)(O)Cl\");\n }\n }\n+\n+TEST_CASE(\"Github #5402: order dependence of tautomer transforms\") {\n+ SECTION(\"as-reported\") {\n+ MolStandardize::TautomerEnumerator te;\n+\n+ auto m1 = \"c1ccc([C@@H](CC2=NCCN2)c2ccccn2)cc1\"_smiles;\n+ REQUIRE(m1);\n+ auto m2 = \"C([C@H](C1=CC=CC=C1)C2=NC=CC=C2)C3=NCCN3\"_smiles;\n+ REQUIRE(m2);\n+ std::cerr << \" * - * - * - * m1\" << std::endl;\n+ std::unique_ptr<ROMol> res1{te.canonicalize(*m1)};\n+ REQUIRE(res1);\n+ std::cerr << \" * - * - * - * m2\" << std::endl;\n+ std::unique_ptr<ROMol> res2{te.canonicalize(*m2)};\n+ REQUIRE(res2);\n+ CHECK(MolToSmiles(*res1) == MolToSmiles(*res2));\n+ }\n+ SECTION(\"zoom\") {\n+ MolStandardize::CleanupParameters params;\n+ const std::vector<\n+ std::tuple<std::string, std::string, std::string, std::string>>\n+ tTransforms{\n+ std::make_tuple(std::string(\"special imine r1\"),\n+ std::string(\"[Cz0R0X4!H0]-[c]=[nz0]\"),\n+ std::string(\"\"), std::string(\"\")),\n+ std::make_tuple(std::string(\"special imine r2\"),\n+ std::string(\"[Cz0R0X4!H0]-[c](=c)-[nz0]\"),\n+ std::string(\"==-\"), std::string(\"\")),\n+ };\n+\n+ params.tautomerTransformData = tTransforms;\n+ MolStandardize::TautomerEnumerator te(params);\n+\n+ auto m1 = \"c1ccc([C@@H](CC2=NCCN2)c2ccccn2)cc1\"_smiles;\n+ REQUIRE(m1);\n+ auto m2 = \"C([C@H](C1=CC=CC=C1)C2=NC=CC=C2)C3=NCCN3\"_smiles;\n+ REQUIRE(m2);\n+\n+ std::cerr << \" * - * - * - * m1\" << std::endl;\n+ std::unique_ptr<ROMol> res1{te.canonicalize(*m1)};\n+ REQUIRE(res1);\n+ std::cerr << \" * - * - * - * m2\" << std::endl;\n+ std::unique_ptr<ROMol> res2{te.canonicalize(*m2)};\n+ REQUIRE(res2);\n+ CHECK(MolToSmiles(*res1) == MolToSmiles(*res2));\n+ }\n+}\ndiff --git a/Code/GraphMol/MolStandardize/testTautomer.cpp b/Code/GraphMol/MolStandardize/testTautomer.cpp\nindex c07030085d9..b596d148b9a 100644\n--- a/Code/GraphMol/MolStandardize/testTautomer.cpp\n+++ b/Code/GraphMol/MolStandardize/testTautomer.cpp\n@@ -712,7 +712,7 @@ void testCanonicalize() {\n std::unique_ptr<TautomerCatalogParams>(new TautomerCatalogParams(\"\"));\n \n unsigned int ntransforms = tautparams->getTransforms().size();\n- TEST_ASSERT(ntransforms == 36);\n+ TEST_ASSERT(ntransforms == 37);\n \n TautomerEnumerator te(new TautomerCatalog(tautparams.get()));\n \n@@ -734,7 +734,7 @@ void testPickCanonical() {\n std::unique_ptr<TautomerCatalogParams>(new TautomerCatalogParams(\"\"));\n \n unsigned int ntransforms = tautparams->getTransforms().size();\n- TEST_ASSERT(ntransforms == 36);\n+ TEST_ASSERT(ntransforms == 37);\n \n TautomerEnumerator te(new TautomerCatalog(tautparams.get()));\n \n@@ -759,7 +759,7 @@ void testCustomScoreFunc() {\n std::unique_ptr<TautomerCatalogParams>(new TautomerCatalogParams(\"\"));\n \n unsigned int ntransforms = tautparams->getTransforms().size();\n- TEST_ASSERT(ntransforms == 36);\n+ TEST_ASSERT(ntransforms == 37);\n \n TautomerEnumerator te(new TautomerCatalog(tautparams.get()));\n \n@@ -828,7 +828,7 @@ void testEnumerationProblems() {\n std::unique_ptr<TautomerCatalogParams>(new TautomerCatalogParams(\"\"));\n \n unsigned int ntransforms = tautparams->getTransforms().size();\n- TEST_ASSERT(ntransforms == 36);\n+ TEST_ASSERT(ntransforms == 37);\n \n TautomerEnumerator te(new TautomerCatalog(tautparams.get()));\n #if 1\n@@ -860,7 +860,7 @@ void testPickCanonical2() {\n auto tautparams =\n std::unique_ptr<TautomerCatalogParams>(new TautomerCatalogParams(\"\"));\n unsigned int ntransforms = tautparams->getTransforms().size();\n- TEST_ASSERT(ntransforms == 36);\n+ TEST_ASSERT(ntransforms == 37);\n \n TautomerEnumerator te(new TautomerCatalog(tautparams.get()));\n {\n@@ -894,7 +894,7 @@ void testEnumerateDetails() {\n auto tautparams =\n std::unique_ptr<TautomerCatalogParams>(new TautomerCatalogParams(\"\"));\n unsigned int ntransforms = tautparams->getTransforms().size();\n- TEST_ASSERT(ntransforms == 36);\n+ TEST_ASSERT(ntransforms == 37);\n TautomerEnumerator te(new TautomerCatalog(tautparams.get()));\n {\n auto mol = \"c1ccccc1CN=c1[nH]cccc1\"_smiles;\n@@ -950,7 +950,7 @@ void testGithub2990() {\n std::unique_ptr<TautomerCatalogParams>(new TautomerCatalogParams(\"\"));\n \n unsigned int ntransforms = tautparams->getTransforms().size();\n- TEST_ASSERT(ntransforms == 36);\n+ TEST_ASSERT(ntransforms == 37);\n TautomerEnumerator te(new TautomerCatalog(tautparams.get()));\n {\n // atom stereo\n", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}213{"question_id": "MSB_rdkit_rdkit_pr5595", "question_type": "multi_swe_bench", "description": "Support ring-bond stereo flags in CXSMILES (rdkit/rdkit#5595)", "content": {"org": "rdkit", "repo": "rdkit", "pr_number": 5595, "issue_title": "Support ring-bond stereo flags in CXSMILES", "issue_body": "This adds `c:`, `t:`, and `ctu:` to the CXSMILES readers and writers. These only apply to ring bonds.\r\n\r\nIt also:\r\n- updates the documentation to include the newly supported CXSMILES features and to document where stereo information comes from.\r\n- Fixes #5585 ", "base_commit": "42eed2605dbd5fb6ce03bd72ab714c8a537dfea5", "resolved_issues": [{"number": 5585, "title": "incorrect _smilesBondOutputOrder for ring closures", "body": "**Describe the bug**\r\nHere's the demo:\r\n```\r\nIn [26]: m = Chem.MolFromSmiles(\"OC1CCCN1\")\r\n\r\nIn [27]: Chem.MolToSmiles(m)\r\nOut[27]: 'OC1CCCN1'\r\n\r\nIn [28]: m.GetProp(\"_smilesBondOutputOrder\")\r\nOut[28]: '[0,1,5,2,3,4,]'\r\n\r\nIn [29]: m.GetProp(\"_smilesAtomOutputOrder\")\r\nOut[29]: '[0,1,2,3,4,5,]'\r\n```\r\nGiven that the output order is the same as the input order, the `_smilesBondOutputOrder` should be:\r\n`[0,1,2,3,4,5]`\r\n\r\n**Configuration (please complete the following information):**\r\n - RDKit version: all\r\n - OS: all\r\n"}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/rdkit_m_rdkit:pr-5595", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/Code/GraphMol/FindStereo.cpp b/Code/GraphMol/FindStereo.cpp\nindex 0ecadfb5a79..1d3caf24d9c 100644\n--- a/Code/GraphMol/FindStereo.cpp\n+++ b/Code/GraphMol/FindStereo.cpp\n@@ -339,8 +339,9 @@ bool isBondPotentialStereoBond(const Bond *bond) {\n // check rings\n const auto ri = bond->getOwningMol().getRingInfo();\n for (const auto &bring : ri->bondRings()) {\n- if (bring.size() < 8 && std::find(bring.begin(), bring.end(),\n- bond->getIdx()) != bring.end()) {\n+ if (bring.size() < minRingSizeForDoubleBondStereo &&\n+ std::find(bring.begin(), bring.end(), bond->getIdx()) !=\n+ bring.end()) {\n return false;\n }\n }\ndiff --git a/Code/GraphMol/SmilesParse/CXSmilesOps.cpp b/Code/GraphMol/SmilesParse/CXSmilesOps.cpp\nindex a75626b3edb..0cc249f347b 100644\n--- a/Code/GraphMol/SmilesParse/CXSmilesOps.cpp\n+++ b/Code/GraphMol/SmilesParse/CXSmilesOps.cpp\n@@ -20,6 +20,7 @@\n #include \"SmilesParse.h\"\n #include \"SmilesParseOps.h\"\n #include <GraphMol/MolEnumerator/LinkNode.h>\n+#include <GraphMol/Chirality.h>\n \n namespace SmilesParseOps {\n using namespace RDKit;\n@@ -980,15 +981,14 @@ bool parse_variable_attachments(Iterator &first, Iterator last,\n return false;\n }\n if (VALID_ATIDX(aidx)) {\n- others.push_back(\n- (boost::format(\"%d\") % (aidx - startAtomIdx + 1)).str());\n+ others.push_back(std::to_string(aidx - startAtomIdx + 1));\n }\n if (first < last && *first == '.') {\n ++first;\n }\n }\n if (VALID_ATIDX(at1idx)) {\n- std::string endPts = (boost::format(\"(%d\") % others.size()).str();\n+ std::string endPts = \"(\" + std::to_string(others.size());\n for (auto idx : others) {\n endPts += \" \" + idx;\n }\n@@ -1062,49 +1062,102 @@ bool parse_wedged_bonds(Iterator &first, Iterator last, RDKit::RWMol &mol,\n return false;\n }\n \n- if (!VALID_ATIDX(atomIdx)) {\n- BOOST_LOG(rdWarningLog)\n- << \"bad atom index, \" << atomIdx << \", in w block\" << std::endl;\n- return false;\n- }\n- if (!VALID_BNDIDX(bondIdx)) {\n- BOOST_LOG(rdWarningLog)\n- << \"bad bond index, \" << bondIdx << \", in w block\" << std::endl;\n- return false;\n- }\n- auto atom = mol.getAtomWithIdx(atomIdx + startAtomIdx);\n- auto bond = mol.getBondWithIdx(bondIdx + startBondIdx);\n+ if (VALID_ATIDX(atomIdx) && VALID_BNDIDX(bondIdx)) {\n+ auto atom = mol.getAtomWithIdx(atomIdx - startAtomIdx);\n+ auto bond = mol.getBondWithIdx(bondIdx - startBondIdx);\n \n- // we can't set wedging twice:\n- if (bond->hasProp(common_properties::_MolFileBondCfg)) {\n- BOOST_LOG(rdWarningLog)\n- << \"w block attempts to set wedging on bond \" << bond->getIdx()\n- << \" more than once.\" << std::endl;\n- return false;\n- }\n-\n- // first things first, the atom needs to be the start atom of the bond for\n- // any of this to make sense\n- if (atom->getIdx() != bond->getBeginAtomIdx()) {\n- if (atom->getIdx() != bond->getEndAtomIdx()) {\n+ // we can't set wedging twice:\n+ if (bond->hasProp(common_properties::_MolFileBondCfg)) {\n BOOST_LOG(rdWarningLog)\n- << \"atom \" << atomIdx << \" is not associated with bond \" << bondIdx\n- << \" in w block\" << std::endl;\n+ << \"w block attempts to set wedging on bond \" << bond->getIdx()\n+ << \" more than once.\" << std::endl;\n return false;\n }\n- auto eidx = bond->getBeginAtomIdx();\n- bond->setBeginAtomIdx(atom->getIdx());\n- bond->setEndAtomIdx(eidx);\n+\n+ // first things first, the atom needs to be the start atom of the bond for\n+ // any of this to make sense\n+ if (atom->getIdx() != bond->getBeginAtomIdx()) {\n+ if (atom->getIdx() != bond->getEndAtomIdx()) {\n+ BOOST_LOG(rdWarningLog)\n+ << \"atom \" << atomIdx << \" is not associated with bond \"\n+ << bondIdx << \" in w block\" << std::endl;\n+ return false;\n+ }\n+ auto eidx = bond->getBeginAtomIdx();\n+ bond->setBeginAtomIdx(atom->getIdx());\n+ bond->setEndAtomIdx(eidx);\n+ }\n+ bond->setProp(common_properties::_MolFileBondCfg, cfg);\n+ bond->setBondDir(state);\n+ if (cfg == 2 && bond->getBondType() == Bond::BondType::SINGLE) {\n+ bond->getBeginAtom()->setChiralTag(Atom::ChiralType::CHI_UNSPECIFIED);\n+ mol.setProp(detail::_needsDetectBondStereo, 1);\n+ }\n+ if ((cfg == 1 || cfg == 3) &&\n+ bond->getBondType() == Bond::BondType::SINGLE) {\n+ mol.setProp(detail::_needsDetectAtomStereo, 1);\n+ }\n }\n- bond->setProp(common_properties::_MolFileBondCfg, cfg);\n- bond->setBondDir(state);\n- if (cfg == 2 && bond->getBondType() == Bond::BondType::SINGLE) {\n- bond->getBeginAtom()->setChiralTag(Atom::ChiralType::CHI_UNSPECIFIED);\n- mol.setProp(detail::_needsDetectBondStereo, 1);\n+ if (first < last && *first == ',') {\n+ ++first;\n }\n- if ((cfg == 1 || cfg == 3) &&\n- bond->getBondType() == Bond::BondType::SINGLE) {\n- mol.setProp(detail::_needsDetectAtomStereo, 1);\n+ }\n+ return true;\n+}\n+\n+template <typename Iterator>\n+bool parse_doublebond_stereo(Iterator &first, Iterator last, RDKit::RWMol &mol,\n+ unsigned int, unsigned int startBondIdx,\n+ Bond::BondStereo stereo) {\n+ // these look like: C1CCCC/C=C/CCC1 |ctu:5|\n+ // also c and t for cis or trans\n+ //\n+ while (first < last && *first != ':') {\n+ ++first;\n+ }\n+ if (first >= last || *first != ':') {\n+ return false;\n+ }\n+ ++first;\n+\n+ while (first < last && *first >= '0' && *first <= '9') {\n+ unsigned int bondIdx;\n+ if (!read_int(first, last, bondIdx)) {\n+ return false;\n+ }\n+ if (VALID_BNDIDX(bondIdx)) {\n+ auto bond = mol.getBondWithIdx(bondIdx - startBondIdx);\n+\n+ // the cis/trans/unknown marker is relative to the lowest numbered atom\n+ // connected to the lowest numbered double bond atom and the\n+ // highest-numbered atom connected to the highest-numbered double bond\n+ // atom find those\n+ auto begAtom = bond->getBeginAtom();\n+ auto endAtom = bond->getEndAtom();\n+ if (begAtom->getIdx() > endAtom->getIdx()) {\n+ std::swap(begAtom, endAtom);\n+ }\n+ if (begAtom->getDegree() > 1 && endAtom->getDegree() > 1) {\n+ unsigned int begControl = mol.getNumAtoms();\n+ for (auto nbr : mol.atomNeighbors(begAtom)) {\n+ if (nbr == endAtom) {\n+ continue;\n+ }\n+ begControl = std::min(nbr->getIdx(), begControl);\n+ }\n+ unsigned int endControl = 0;\n+ for (auto nbr : mol.atomNeighbors(endAtom)) {\n+ if (nbr == begAtom) {\n+ continue;\n+ }\n+ endControl = std::max(nbr->getIdx(), endControl);\n+ }\n+ if (begAtom != bond->getBeginAtom()) {\n+ std::swap(begControl, endControl);\n+ }\n+ bond->setStereoAtoms(begControl, endControl);\n+ bond->setStereo(stereo);\n+ }\n }\n if (first < last && *first == ',') {\n ++first;\n@@ -1378,6 +1431,22 @@ bool parse_it(Iterator &first, Iterator last, RDKit::RWMol &mol,\n if (!parse_wedged_bonds(first, last, mol, startAtomIdx, startBondIdx)) {\n return false;\n }\n+ } else if (*first == 'c' && first + 2 < last && first[1] == 't' &&\n+ first[2] == 'u') {\n+ if (!parse_doublebond_stereo(first, last, mol, startAtomIdx, startBondIdx,\n+ Bond::BondStereo::STEREOANY)) {\n+ return false;\n+ }\n+ } else if (*first == 'c') {\n+ if (!parse_doublebond_stereo(first, last, mol, startAtomIdx, startBondIdx,\n+ Bond::BondStereo::STEREOCIS)) {\n+ return false;\n+ }\n+ } else if (*first == 't') {\n+ if (!parse_doublebond_stereo(first, last, mol, startAtomIdx, startBondIdx,\n+ Bond::BondStereo::STEREOTRANS)) {\n+ return false;\n+ }\n } else {\n ++first;\n }\n@@ -1938,6 +2007,97 @@ std::string get_bond_config_block(const ROMol &mol,\n return w + wU + wD;\n }\n \n+std::string get_ringbond_cistrans_block(\n+ const ROMol &mol, const std::vector<unsigned int> &atomOrder,\n+ const std::vector<unsigned int> &bondOrder) {\n+ if (!mol.getRingInfo()->isInitialized()) {\n+ return \"\";\n+ }\n+\n+ const auto rinfo = mol.getRingInfo();\n+ std::string c = \"\", t = \"\", ctu = \"\";\n+ for (unsigned int i = 0; i < bondOrder.size(); ++i) {\n+ auto idx = bondOrder[i];\n+ if (!rinfo->numBondRings(idx) ||\n+ rinfo->minBondRingSize(idx) <\n+ Chirality::minRingSizeForDoubleBondStereo) {\n+ // we only do ring bonds of a minimum size\n+ continue;\n+ }\n+ const auto bond = mol.getBondWithIdx(idx);\n+ if (bond->getBondType() != Bond::BondType::DOUBLE &&\n+ bond->getBondType() != Bond::BondType::AROMATIC) {\n+ continue;\n+ }\n+ Bond::BondStereo bstereo = bond->getStereo();\n+ if (bstereo != Bond::BondStereo::STEREOANY &&\n+ bstereo != Bond::BondStereo::STEREOCIS &&\n+ bstereo != Bond::BondStereo::STEREOTRANS) {\n+ continue;\n+ }\n+\n+ auto label = std::to_string(i);\n+\n+ if (bstereo == Bond::BondStereo::STEREOANY) {\n+ // this one's easy because we don't care about the atom order.\n+ if (ctu.empty()) {\n+ ctu += \"ctu:\";\n+ } else {\n+ ctu += \",\";\n+ }\n+ ctu += label;\n+ } else {\n+ Atom *begAtom = bond->getBeginAtom();\n+ Atom *endAtom = bond->getEndAtom();\n+ bool needSwap = false;\n+ if (begAtom->getDegree() > 2) {\n+ unsigned int o1 = atomOrder[bond->getStereoAtoms()[0]];\n+ for (const auto nbr : mol.atomNeighbors(begAtom)) {\n+ if (nbr == endAtom ||\n+ nbr->getIdx() ==\n+ static_cast<unsigned>(bond->getStereoAtoms()[0])) {\n+ continue;\n+ }\n+ if (atomOrder[nbr->getIdx() < o1]) {\n+ // this neighbor came first, we need to swap:\n+ needSwap = !needSwap;\n+ }\n+ }\n+ }\n+ if (endAtom->getDegree() > 2) {\n+ unsigned int o1 = atomOrder[bond->getStereoAtoms()[1]];\n+ for (const auto nbr : mol.atomNeighbors(endAtom)) {\n+ if (nbr == begAtom ||\n+ nbr->getIdx() ==\n+ static_cast<unsigned>(bond->getStereoAtoms()[1])) {\n+ continue;\n+ }\n+ if (atomOrder[nbr->getIdx() < o1]) {\n+ // this neighbor came first, we need to swap:\n+ needSwap = !needSwap;\n+ }\n+ }\n+ }\n+ if (bstereo == Bond::BondStereo::STEREOCIS || needSwap) {\n+ if (c.empty()) {\n+ c += \"c:\";\n+ } else {\n+ c += \",\";\n+ }\n+ c += label;\n+ } else {\n+ if (t.empty()) {\n+ t += \"t:\";\n+ } else {\n+ t += \",\";\n+ }\n+ t += label;\n+ }\n+ }\n+ }\n+ return c + t + ctu;\n+}\n+\n std::string get_linknodes_block(const ROMol &mol,\n const std::vector<unsigned int> &atomOrder) {\n bool strict = false;\n@@ -2046,6 +2206,9 @@ std::string getCXExtensions(const ROMol &mol, std::uint32_t flags) {\n const auto cfgblock =\n get_bond_config_block(mol, atomOrder, bondOrder, includeCoords);\n appendToCXExtension(cfgblock, res);\n+ const auto cistransblock =\n+ get_ringbond_cistrans_block(mol, atomOrder, bondOrder);\n+ appendToCXExtension(cistransblock, res);\n }\n \n if (flags & SmilesWrite::CXSmilesFields::CX_LINKNODES) {\ndiff --git a/Code/GraphMol/SmilesParse/SmilesWrite.cpp b/Code/GraphMol/SmilesParse/SmilesWrite.cpp\nindex c670a37afc9..21e5e0b2bb9 100644\n--- a/Code/GraphMol/SmilesParse/SmilesWrite.cpp\n+++ b/Code/GraphMol/SmilesParse/SmilesWrite.cpp\n@@ -360,7 +360,7 @@ std::string FragmentSmilesConstruct(\n ringClosureMap.erase(rclosure);\n }\n ringClosuresToErase.clear();\n- // std::cout<<\"\\t\\tAtom: \"<<mSE.obj.atom->getIdx()<<std::endl;\n+ // std::cout << \"\\t\\tAtom: \" << mSE.obj.atom->getIdx() << std::endl;\n if (!atomSymbols) {\n res << GetAtomSmiles(mSE.obj.atom, params.doKekule, bond,\n params.allHsExplicit, params.doIsomericSmiles);\n@@ -371,7 +371,7 @@ std::string FragmentSmilesConstruct(\n break;\n case Canon::MOL_STACK_BOND:\n bond = mSE.obj.bond;\n- // std::cout<<\"\\t\\tBond: \"<<bond->getIdx()<<std::endl;\n+ // std::cout << \"\\t\\tBond: \" << bond->getIdx() << std::endl;\n if (!bondSymbols) {\n res << GetBondSmiles(bond, mSE.number, params.doKekule,\n params.allBondsExplicit);\n@@ -382,7 +382,7 @@ std::string FragmentSmilesConstruct(\n break;\n case Canon::MOL_STACK_RING:\n ringIdx = mSE.number;\n- // std::cout<<\"\\t\\tRing: \"<<ringIdx;\n+ // std::cout << \"\\t\\tRing: \" << ringIdx << std::endl;\n if (ringClosureMap.count(ringIdx)) {\n // the index is already in the map ->\n // we're closing a ring, so grab\n@@ -453,17 +453,19 @@ std::string MolToSmiles(const ROMol &mol, const SmilesWriteParams ¶ms) {\n MolOps::getMolFrags(mol, false, nullptr, &fragsMolAtomMapping, false);\n // we got the mapping between fragments and atoms; repeat that for bonds\n std::vector<std::vector<int>> fragsMolBondMapping;\n+ boost::dynamic_bitset<> atsPresent(mol.getNumAtoms());\n+ std::vector<int> bondsInFrag;\n+ bondsInFrag.reserve(mol.getNumBonds());\n for (const auto &atsInFrag : fragsMolAtomMapping) {\n- std::vector<int> bondsInFrag;\n+ atsPresent.reset();\n+ bondsInFrag.clear();\n for (auto aidx : atsInFrag) {\n- const auto atm = mol.getAtomWithIdx(aidx);\n- for (const auto bndIter :\n- boost::make_iterator_range(mol.getAtomBonds(atm))) {\n- const auto bnd = mol[bndIter];\n- if (std::find(bondsInFrag.begin(), bondsInFrag.end(), bnd->getIdx()) ==\n- bondsInFrag.end()) {\n- bondsInFrag.push_back(bnd->getIdx());\n- }\n+ atsPresent.set(aidx);\n+ }\n+ for (const auto bnd : mol.bonds()) {\n+ if (atsPresent[bnd->getBeginAtomIdx()] &&\n+ atsPresent[bnd->getEndAtomIdx()]) {\n+ bondsInFrag.push_back(bnd->getIdx());\n }\n }\n fragsMolBondMapping.push_back(bondsInFrag);\n@@ -623,7 +625,7 @@ std::string MolToSmiles(const ROMol &mol, const SmilesWriteParams ¶ms) {\n mol.setProp(common_properties::_smilesBondOutputOrder, flattenedBondOrdering,\n true);\n return result;\n-} // end of MolToSmiles()\n+}\n \n std::string MolToCXSmiles(const ROMol &mol, const SmilesWriteParams ¶ms,\n std::uint32_t flags) {\ndiff --git a/Docs/Book/RDKit_Book.rst b/Docs/Book/RDKit_Book.rst\nindex 1a62184318e..bea560adedc 100644\n--- a/Docs/Book/RDKit_Book.rst\n+++ b/Docs/Book/RDKit_Book.rst\n@@ -255,10 +255,13 @@ The features which are parsed include:\n - radicals ``^``\n - enhanced stereo (these are converted into ``StereoGroups``)\n - linknodes ``LN``\n-- multi-center attachments ``m``\n+- variable/multi-center attachments ``m``\n - ring bond count specifications ``rb``\n - non-hydrogen substitution count specifications ``s``\n - unsaturation specification ``u``\n+- wedged bonds (only when atomic coordinates are present): ``wU``, ``wD``\n+- wiggly bonds ``w``\n+- double bond stereo (only for ring bonds) ``c``, ``t``, ``ctu``\n - SGroup Data ``SgD``\n - polymer SGroups ``Sg``\n - SGroup Hierarchy ``SgH``\n@@ -273,7 +276,10 @@ The features which are written by :py:func:`rdkit.Chem.rdmolfiles.MolToCXSmiles`\n - atomic properties\n - radicals\n - enhanced stereo\n-- linknodes \n+- linknodes\n+- wedged bonds (only when atomic coordinates are also written) \n+- wiggly bonds\n+- double bond stereo (only for ring bonds)\n - SGroup Data\n - polymer SGroups\n - SGroup Hierarchy\n@@ -531,14 +537,15 @@ Stereochemistry\n Types of stereochemistry supported\n ----------------------------------\n \n-The RDKit currently supports tetrahedral atomic stereochemistry and cis/trans\n-stereochemistry at double bonds. We plan to add support for additional types of\n-stereochemistry in the future.\n+The RDKit currently fully supports tetrahedral atomic stereochemistry and\n+cis/trans stereochemistry at double bonds. There is partial support for\n+non-tetrahedral stereochemistry, see the section :ref:`Support for non-tetrahedral atomic stereochemistry`.\n \n Identification of potential stereoatoms/stereobonds\n ---------------------------------------------------\n \n-As of the 2020.09 release the RDKit has two different ways of identifying potential stereoatoms/stereobonds:\n+As of the 2020.09 release the RDKit has two different ways of identifying\n+potential stereoatoms/stereobonds:\n \n 1. The legacy approach: ``AssignStereochemistry()``.\n This approach does a reasonable job of recognizing potential\n@@ -655,6 +662,54 @@ Brief description of the ``findPotentialStereo()`` algorithm\n ranked atoms attached to either end [#eitherend]_ to the results\n 10. Return the results\n \n+Sources of information about stereochemistry\n+--------------------------------------------\n+\n+From SMILES\n+^^^^^^^^^^^\n+\n+Atomic stereochemistry can be specified using ``@``, ``@@``, ``@SP``, etc.\n+Potential stereocenters with no information provided are\n+``ChiralType::CHI_UNSPECIFIED``.\n+\n+Double-bond stereochemistry is specfied using ``/`` and ``\\`` to indicate the\n+directionality of the neighboring single bonds. Double bonds with no stereo\n+information provided are ``BondStereo::STEREONONE``. \n+\n+\n+From Mol\n+^^^^^^^^\n+\n+Atomic stereochemistry can be specified using wedged bonds if 2D coordinates are\n+present. If 3D coordinates are present, they are used to set the stereochemistry\n+for stereogenic atoms. Wiggly bonds (``CFG=2`` in V3000 mol blocks) set the\n+chiral tag of stereogenic start atom to ``ChiralType::CHI_UNSPECIFIED``.\n+\n+Double-bond stereochemistry is automatically set using the atomic coordinates;\n+this is true for both 2D and 3D coordinates. If a stereogenic double bound is\n+crossed (``CFG=2`` in V3000 mol blocks) or has an adjacent wiggly single bond\n+(``CFG=2`` in V3000 mol blocks), then it will be ``BondStereo::STEREOANY``.\n+\n+\n+From CXSMILES\n+^^^^^^^^^^^^^\n+\n+An initial stereochemistry assignment is done following the SMILES rules (see above).\n+\n+A ``w:`` (wiggly bond) specification will set the stereochemistry of the start\n+atom to ``ChiralType::CHI_UNSPECIFIED`` and double bonds to\n+``BondStereo::STEREOANY``. Stereochemistry of ring bonds can be set using ``t``,\n+``c``, or ``ctu``.\n+\n+If 2D coordinates are present in the CXSMILES, atomic stereo can be set using\n+```wU``` or ```wD``` to create wedged bonds.\n+\n+If 3D coordinates are present in the CXSMILES, they are used to set the\n+stereochemistry for stereogenic atoms and bonds. This supersedes other\n+specifications in the CXSMILES except for ``ctu`` and ``w``.\n+\n+\n+\n Support for non-tetrahedral atomic stereochemistry\n ==================================================\n \ndiff --git a/Docs/Book/conf.py b/Docs/Book/conf.py\nindex 053d07a6428..ba08c6a03a3 100644\n--- a/Docs/Book/conf.py\n+++ b/Docs/Book/conf.py\n@@ -27,7 +27,9 @@\n \n # Add any Sphinx extension module names here, as strings. They can be extensions\n # coming with Sphinx (named 'sphinx.ext.*') or your custom ones.\n-extensions = ['sphinx.ext.autodoc', 'sphinx.ext.doctest', 'recommonmark'] # , 'extapi']\n+extensions = [\n+ 'sphinx.ext.autodoc', 'sphinx.ext.doctest', 'recommonmark', 'sphinx.ext.autosectionlabel'\n+] # , 'extapi']\n #autosummary_generate = True\n doctest_test_doctest_blocks = \"\"\n \n"}, "test": {"test_patch": "diff --git a/Code/GraphMol/ChemReactions/catch_tests.cpp b/Code/GraphMol/ChemReactions/catch_tests.cpp\nindex 2e5a8bf6aba..a935333114d 100644\n--- a/Code/GraphMol/ChemReactions/catch_tests.cpp\n+++ b/Code/GraphMol/ChemReactions/catch_tests.cpp\n@@ -1180,10 +1180,33 @@ TEST_CASE(\"CXSMILES for reactions\", \"[cxsmiles]\") {\n \"(3 6 8 7)\");\n }\n #endif\n+ SECTION(\"cis/trans markers\") {\n+ auto rxn =\n+ \"C1C=CC=CCC=CC=C1>>C1C=CC=CNC=CC=C1 |c:1,3,6,8,11,13,16,18|\"_rxnsmiles;\n+ REQUIRE(rxn);\n+ CHECK(rxn->getReactants().size() == 1);\n+ CHECK(rxn->getProducts().size() == 1);\n+ CHECK(rxn->getReactants()[0]->getBondWithIdx(1)->getStereo() ==\n+ Bond::BondStereo::STEREOCIS);\n+ CHECK(rxn->getProducts()[0]->getBondWithIdx(1)->getStereo() ==\n+ Bond::BondStereo::STEREOCIS);\n+ }\n+ SECTION(\"wedged bonds\") {\n+ auto rxn = \"CC(O)(F)Cl>>CC(N)(F)Cl |w:1.0,6.5|\"_rxnsmiles;\n+ REQUIRE(rxn);\n+ CHECK(rxn->getReactants().size() == 1);\n+ CHECK(rxn->getProducts().size() == 1);\n+ unsigned int bondcfg;\n+ CHECK(rxn->getReactants()[0]->getBondWithIdx(0)->getPropIfPresent(\n+ \"_MolFileBondCfg\", bondcfg));\n+ CHECK(bondcfg == 2);\n+ CHECK(rxn->getProducts()[0]->getBondWithIdx(1)->getPropIfPresent(\n+ \"_MolFileBondCfg\", bondcfg));\n+ CHECK(bondcfg == 2);\n+ }\n }\n \n TEST_CASE(\"V3K rxn blocks\") {\n- \n SECTION(\"writing basics\") {\n // clang-format off\n auto rxn =\ndiff --git a/Code/GraphMol/SmilesParse/catch_tests.cpp b/Code/GraphMol/SmilesParse/catch_tests.cpp\nindex a9a2e85a46d..f5f7946d50c 100644\n--- a/Code/GraphMol/SmilesParse/catch_tests.cpp\n+++ b/Code/GraphMol/SmilesParse/catch_tests.cpp\n@@ -1317,6 +1317,16 @@ TEST_CASE(\"smilesBondOutputOrder\") {\n m->getProp(common_properties::_smilesBondOutputOrder, order);\n CHECK(order == std::vector<unsigned int>{3, 4, 2, 1, 0});\n }\n+ SECTION(\"Github #5585: incorrect ordering for ring closures\") {\n+ auto m = \"OC1CCCN1\"_smiles;\n+ REQUIRE(m);\n+ CHECK(MolToSmiles(*m) == \"OC1CCCN1\");\n+ std::vector<unsigned int> order;\n+ m->getProp(common_properties::_smilesAtomOutputOrder, order);\n+ CHECK(order == std::vector<unsigned int>{0, 1, 2, 3, 4, 5});\n+ m->getProp(common_properties::_smilesBondOutputOrder, order);\n+ CHECK(order == std::vector<unsigned int>{0, 1, 2, 3, 4, 5});\n+ }\n }\n \n TEST_CASE(\"Github #4320: Support toggling components of CXSMILES output\") {\n@@ -2204,3 +2214,71 @@ M END\n }\n }\n }\n+\n+TEST_CASE(\"ring bond stereochemistry in CXSMILES\") {\n+ SECTION(\"basic reading\") {\n+ std::vector<std::pair<std::string, Bond::BondStereo>> tests = {\n+ {\"C1CCCC/C=C/CCC1 |t:5|\", Bond::BondStereo::STEREOTRANS},\n+ {\"C1CCCCC=CCCC1 |t:5|\", Bond::BondStereo::STEREOTRANS},\n+ {\"C1CCCCC=CCCC1 |c:5|\", Bond::BondStereo::STEREOCIS},\n+ {\"C1CCCC/C=C/CCC1 |c:5|\", Bond::BondStereo::STEREOCIS},\n+ {\"C1CCCCC=CCCC1 |ctu:5|\", Bond::BondStereo::STEREOANY},\n+ {\"C1CCCC/C=C/CCC1 |ctu:5|\", Bond::BondStereo::STEREOANY},\n+ };\n+ for (const auto [smi, val] : tests) {\n+ SmilesParserParams ps;\n+ ps.useLegacyStereo = false;\n+ std::unique_ptr<RWMol> m{SmilesToMol(smi, ps)};\n+ INFO(smi);\n+ REQUIRE(m);\n+ CHECK(m->getBondWithIdx(5)->getBondType() == Bond::BondType::DOUBLE);\n+ CHECK(m->getBondWithIdx(5)->getStereo() == val);\n+ }\n+ }\n+ SECTION(\"read multiple values\") {\n+ SmilesParserParams ps;\n+ ps.useLegacyStereo = false;\n+ std::unique_ptr<RWMol> m{SmilesToMol(\"C1CCCCC=CCCC=1 |t:5,9|\", ps)};\n+ REQUIRE(m);\n+ CHECK(m->getBondWithIdx(5)->getBondType() == Bond::BondType::DOUBLE);\n+ CHECK(m->getBondWithIdx(5)->getStereo() == Bond::BondStereo::STEREOTRANS);\n+ CHECK(m->getBondWithIdx(9)->getBondType() == Bond::BondType::DOUBLE);\n+ CHECK(m->getBondWithIdx(9)->getStereo() == Bond::BondStereo::STEREOTRANS);\n+ }\n+ SECTION(\"skip small rings\") {\n+ std::vector<std::pair<std::string, Bond::BondStereo>> tests = {\n+ {\"C1=CCCCC1 |ctu:0|\", Bond::BondStereo::STEREONONE},\n+ {\"C1=CCCCC1 |c:0|\", Bond::BondStereo::STEREONONE}};\n+ for (const auto [smi, val] : tests) {\n+ SmilesParserParams ps;\n+ ps.useLegacyStereo = false;\n+ std::unique_ptr<RWMol> m{SmilesToMol(smi, ps)};\n+ INFO(smi);\n+ REQUIRE(m);\n+ CHECK(m->getBondWithIdx(0)->getBondType() == Bond::BondType::DOUBLE);\n+ CHECK(m->getBondWithIdx(0)->getStereo() == val);\n+ }\n+ }\n+ SECTION(\"basic writing\") {\n+ std::vector<std::pair<std::string, std::string>> tests = {\n+ {\"C1CCCC/C=C/CCC1 |t:5|\", \"C1=C/CCCCCCCC/1 |t:0|\"},\n+ {\"C1CCCCC=CCCC1 |t:5|\", \"C1=CCCCCCCCC1 |t:0|\"},\n+ {\"C1CCCCC=CCCC1 |c:5|\", \"C1=CCCCCCCCC1 |c:0|\"},\n+ {\"C1CCCC/C=C/CCC1 |c:5|\", \"C1=C/CCCCCCCC/1 |c:0|\"},\n+ {\"C1=CCCCCCCCC1 |ctu:0|\", \"C1=CCCCCCCCC1 |ctu:0|\"},\n+ {\"C=CCCCCCCCC |ctu:0|\",\n+ \"C=CCCCCCCCC\"} // we don't write the markers for non-ring bonds\n+ };\n+ for (const auto [smi, val] : tests) {\n+ SmilesParserParams ps;\n+ ps.useLegacyStereo = false;\n+ std::unique_ptr<RWMol> m{SmilesToMol(smi, ps)};\n+ INFO(smi);\n+ REQUIRE(m);\n+ SmilesWriteParams ops;\n+ auto cxsmi = MolToCXSmiles(\n+ *m, ops, SmilesWrite::CXSmilesFields::CX_ALL_BUT_COORDS);\n+ CHECK(cxsmi == val);\n+ }\n+ }\n+}\n", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}214{"question_id": "MSB_rdkit_rdkit_pr5684", "question_type": "multi_swe_bench", "description": "Fix R Goups in matching core are poorly positioned (rdkit/rdkit#5684)", "content": {"org": "rdkit", "repo": "rdkit", "pr_number": 5684, "issue_title": "Fix R Goups in matching core are poorly positioned", "issue_body": "<!--\r\nThanks for contributing a pull request! \r\n-->\r\n#### Reference Issue\r\n<!-- Example: Fixes #1234 -->\r\n\r\nFixes #5631 \r\n\r\n#### What does this implement/fix? Explain your changes.\r\n\r\nIssue #5631 has 2 structures. When the first is decomposed the position of R2 on the core is poor. This is fixed by recalculating the dummy position on core output if the R group is hydrogen only.\r\nWhen the second structure is decomposed the poor position of R2 is retained. This is because it matches the heavy atom co-ordinates in the input structure. While I don't like the position it doesn't make sense to override the user's input (the position would not look so bad if the explicit hydrogens in the input structure were retained).\r\n\r\n\r\n\r\n#### Any other comments?\r\n\r\nThe core for the second structure is missing the stereo chemistry information (see #5613)\r\n", "base_commit": "6227d7579e595f13f7be62c3cf7d4973c3992c3a", "resolved_issues": [{"number": 5631, "title": "RDKit R Goups in matching core are poorly positioned", "body": "**Describe the bug**\r\n\r\nWhen decomposing structures with coordinates the generated coordinates of a core R group may be poor.\r\n\r\n**To Reproduce**\r\n\r\n```python\r\n# %%\r\n\r\nfrom rdkit import Chem\r\nfrom rdkit.Chem import AllChem\r\nfrom rdkit.Chem.rdRGroupDecomposition import RGroupDecomposition, RGroupDecompositionParameters, \\\r\n RGroupMatching, RGroupScore, RGroupLabels, RGroupCoreAlignment, RGroupLabelling\r\nfrom rdkit.Chem.Draw import IPythonConsole\r\n\r\nIPythonConsole.ipython_useSVG = True\r\n\r\nfrom rdkit.Chem import PandasTools\r\nfrom rdkit.Chem import Draw\r\nfrom IPython.display import HTML\r\n\r\nimport pandas as pd\r\n\r\n# %%\r\n\r\ndef do_decomp(options, core, mols):\r\n decomp = RGroupDecomposition([core], options)\r\n display_mols = []\r\n for mol in mols:\r\n if decomp.Add(mol) > -1:\r\n display_mols.append(mol)\r\n else:\r\n print(\"Failed to add mol\")\r\n decomp.Process()\r\n groups = decomp.GetRGroupsAsColumns()\r\n df = PandasTools.RGroupDecompositionToFrame(groups, display_mols, include_core=True)\r\n PandasTools.ChangeMoleculeRendering(df)\r\n return HTML(df.to_html())\r\n \r\n# %%\r\nquery_block = \"\"\"\r\n RDKit 2D\r\n\r\n 12 12 0 0 0 0 0 0 0 0999 V2000\r\n -3.4154 3.2137 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\r\n -2.5903 3.2137 0.0000 A 0 0 0 0 0 0 0 0 0 0 0 0\r\n -2.1778 3.9282 0.0000 A 0 0 0 0 0 0 0 0 0 0 0 0\r\n -2.5903 4.6427 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\r\n -3.4154 4.6427 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\r\n -3.8278 3.9282 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\r\n -4.6528 3.9282 0.0000 A 0 0 0 0 0 0 0 0 0 0 0 0\r\n -3.8278 2.4993 0.0000 R# 0 0 0 0 0 0 0 0 0 0 0 0\r\n -1.3528 3.9282 0.0000 R# 0 0 0 0 0 0 0 0 0 0 0 0\r\n -5.0654 4.6427 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\r\n -4.6528 5.3572 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0\r\n -5.8904 4.6427 0.0000 R# 0 0 0 0 0 0 0 0 0 0 0 0\r\n 5 6 8 0\r\n 4 5 8 0\r\n 3 4 8 0\r\n 2 3 8 0\r\n 1 2 8 0\r\n 1 6 8 0\r\n 6 7 1 0\r\n 1 8 1 0\r\n 3 9 1 0\r\n 7 10 1 0\r\n 10 11 2 0\r\n 10 12 1 0\r\nM ISO 3 8 2 9 3 12 1\r\nM RGP 3 8 2 9 3 12 1\r\nM END\r\n\"\"\"\r\ncore = Chem.MolFromMolBlock(query_block)\r\ncore\r\n\r\n# %%\r\nmol_block = \"\"\"\r\n -OEChem-02051811442D\r\n\r\n 25 27 0 0 0 0 0 0 0999 V2000\r\n -0.8675 0.4975 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\r\n 0.0000 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\r\n 0.8675 0.4975 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\r\n 0.8675 1.5027 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\r\n -0.0000 2.0104 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0\r\n -0.8675 1.5027 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\r\n 1.7350 2.0001 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0\r\n 2.6070 1.5001 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\r\n 3.4790 2.0002 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\r\n 3.4790 3.0002 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\r\n 2.6159 3.5053 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\r\n 1.7439 3.0052 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\r\n 4.3465 3.4976 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0\r\n 4.3495 4.4976 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\r\n 3.4849 5.0002 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0\r\n 5.2170 4.9951 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\r\n 6.1281 4.5828 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\r\n 6.8007 5.3248 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\r\n 6.3049 6.1952 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\r\n 5.3214 5.9901 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0\r\n 6.7160 7.1067 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0\r\n 7.7947 5.2157 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0\r\n 1.7328 -0.0038 0.0000 N 0 3 0 0 0 0 0 0 0 0 0 0\r\n 1.7313 -1.0038 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0\r\n 2.5995 0.4950 0.0000 O 0 5 0 0 0 0 0 0 0 0 0 0\r\n 1 6 2 0 0 0 0\r\n 1 2 1 0 0 0 0\r\n 2 3 2 0 0 0 0\r\n 3 4 1 0 0 0 0\r\n 4 5 2 0 0 0 0\r\n 5 6 1 0 0 0 0\r\n 4 7 1 0 0 0 0\r\n 7 12 1 0 0 0 0\r\n 7 8 1 0 0 0 0\r\n 8 9 1 0 0 0 0\r\n 9 10 1 0 0 0 0\r\n 10 11 1 0 0 0 0\r\n 11 12 1 0 0 0 0\r\n 10 13 1 0 0 0 0\r\n 13 14 1 0 0 0 0\r\n 14 15 2 0 0 0 0\r\n 14 16 1 0 0 0 0\r\n 16 20 1 0 0 0 0\r\n 16 17 2 0 0 0 0\r\n 17 18 1 0 0 0 0\r\n 18 19 2 0 0 0 0\r\n 19 20 1 0 0 0 0\r\n 19 21 1 0 0 0 0\r\n 18 22 1 0 0 0 0\r\n 3 23 1 0 0 0 0\r\n 23 24 2 0 0 0 0\r\n 23 25 1 0 0 0 0\r\nM CHG 2 23 1 25 -1\r\nM END\r\n$$$$\r\n\"\"\"\r\nmol = Chem.MolFromMolBlock(mol_block)\r\nmol\r\n\r\n# %%\r\nmol_block2 = \"\"\"\r\n -OEChem-02051811442D\r\n\r\n 45 49 0 1 0 0 0 0 0999 V2000\r\n -2.9472 -3.8597 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\r\n -2.8765 -2.8622 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\r\n -3.6440 -2.2211 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\r\n -3.2684 -1.2927 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\r\n -2.2691 -1.3606 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\r\n -2.0260 -2.3354 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0\r\n -1.6270 -0.5940 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\r\n -1.9700 0.3454 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0\r\n -0.6420 -0.7667 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0\r\n 0.0000 0.0000 0.0000 C 0 0 2 0 0 0 0 0 0 0 0 0\r\n 1.1236 -1.3417 0.0000 H 0 0 0 0 0 0 0 0 0 0 0 0\r\n -0.8675 0.4975 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\r\n -0.8675 1.5027 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\r\n 0.0000 2.0104 0.0000 N 0 0 3 0 0 0 0 0 0 0 0 0\r\n 0.8675 1.5027 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\r\n 0.8675 0.4975 0.0000 C 0 0 2 0 0 0 0 0 0 0 0 0\r\n 1.2077 -0.4429 0.0000 H 0 0 0 0 0 0 0 0 0 0 0 0\r\n 1.8525 0.6702 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0\r\n 2.1954 1.6096 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\r\n 0.0000 3.0104 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\r\n -0.8098 3.5999 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0\r\n -0.5017 4.5529 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\r\n 0.4983 4.5516 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\r\n 0.8122 3.6017 0.0000 S 0 0 0 0 0 0 0 0 0 0 0 0\r\n 1.0846 5.3617 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\r\n 2.0793 5.2591 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0\r\n 0.6762 6.2745 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0\r\n -1.0895 5.3618 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\r\n -2.0889 5.2537 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\r\n -2.6768 6.0627 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0\r\n -2.2755 6.9786 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\r\n -1.2762 7.0868 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\r\n -0.6781 6.2789 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0\r\n -2.8669 7.7850 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0\r\n -3.8610 7.6760 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\r\n -4.4524 8.4824 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\r\n -5.4465 8.3734 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0\r\n -6.0457 9.1803 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\r\n -7.0449 9.0708 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\r\n -7.4449 8.1542 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0\r\n -6.8558 7.3461 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\r\n -5.8566 7.4557 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\r\n -8.4389 8.0452 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\r\n -3.7990 -0.4450 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0\r\n -4.6141 -2.4639 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0\r\n 1 2 1 0 0 0 0\r\n 2 6 1 0 0 0 0\r\n 2 3 2 0 0 0 0\r\n 3 4 1 0 0 0 0\r\n 4 5 2 0 0 0 0\r\n 5 6 1 0 0 0 0\r\n 5 7 1 0 0 0 0\r\n 7 8 2 0 0 0 0\r\n 7 9 1 0 0 0 0\r\n 9 10 1 0 0 0 0\r\n 10 11 1 1 0 0 0\r\n 10 16 1 0 0 0 0\r\n 10 12 1 0 0 0 0\r\n 12 13 1 0 0 0 0\r\n 13 14 1 0 0 0 0\r\n 14 15 1 0 0 0 0\r\n 15 16 1 0 0 0 0\r\n 16 17 1 1 0 0 0\r\n 16 18 1 0 0 0 0\r\n 18 19 1 0 0 0 0\r\n 14 20 1 0 0 0 0\r\n 20 24 1 0 0 0 0\r\n 20 21 2 0 0 0 0\r\n 21 22 1 0 0 0 0\r\n 22 23 2 0 0 0 0\r\n 23 24 1 0 0 0 0\r\n 23 25 1 0 0 0 0\r\n 25 26 2 0 0 0 0\r\n 25 27 1 0 0 0 0\r\n 22 28 1 0 0 0 0\r\n 28 33 2 0 0 0 0\r\n 28 29 1 0 0 0 0\r\n 29 30 2 0 0 0 0\r\n 30 31 1 0 0 0 0\r\n 31 32 2 0 0 0 0\r\n 32 33 1 0 0 0 0\r\n 31 34 1 0 0 0 0\r\n 34 35 1 0 0 0 0\r\n 35 36 1 0 0 0 0\r\n 36 37 1 0 0 0 0\r\n 37 42 1 0 0 0 0\r\n 37 38 1 0 0 0 0\r\n 38 39 1 0 0 0 0\r\n 39 40 1 0 0 0 0\r\n 40 41 1 0 0 0 0\r\n 41 42 1 0 0 0 0\r\n 40 43 1 0 0 0 0\r\n 4 44 1 0 0 0 0\r\n 3 45 1 0 0 0 0\r\nM END\r\n$$$$\r\n\"\"\"\r\nmol2 = Chem.MolFromMolBlock(mol_block2)\r\nmol2\r\n\r\n# %%\r\noptions = RGroupDecompositionParameters()\r\noptions.matchingStrategy = RGroupMatching.GreedyChunks\r\noptions.matchingStrategy = RGroupMatching.Exhaustive\r\noptions.onlyMatchAtRGroups = False\r\noptions.scoreMethod = RGroupScore.FingerprintVariance\r\noptions.allowMultipleRGroupsOnUnlabelled = True\r\noptions.removeHydrogensPostMatch = True\r\noptions.allowMultipleRGroupsOnUnlabelled = False\r\noptions.removeAllHydrogenRGroups = False\r\ndo_decomp(options, core, [mol, mol2])\r\n\r\n\r\n```\r\n\r\n**Expected behavior**\r\n\r\nI expect to see the core R2 for both structures in a better geometry.\r\n\r\n**Screenshots**\r\n \r\nBut I see this:\r\n\r\n\r\n\r\n**Configuration (please complete the following information):**\r\n - RDKit version: master as o 10/9/22\r\n - OS: [e.g. Ubuntu 20.04] Ubuntu 20.04\r\n - Python version (if relevant):\r\n - Are you using conda?\r\n - If you are using conda, which channel did you install the rdkit from?\r\n - If you are not using conda: how did you install the RDKit?\r\n\r\n**Additional context**\r\n\r\nI think what is happening is that the R group is added while there are explicit hydrogens on the core. I will look at it once [PR 5618](https://github.com/rdkit/rdkit/pull/5618) is out of the way. \r\n\r\nEdited and added an additional example n 10/24/22. In the first example R2 is positioned as if there are 2 explicit hydrogens on the core, while in the second example R2 uses the co-ordinates of the chiral methoxy in the input structure. Both look rubbish in the output core, though there may be an argument for retaining the R2 group position of the second structure as that is specified in the input structure.\r\n\r\nThis behavior is not present in the 2022_03 release. I think it comes from changes in `RDKit::replaceCore` where atom positions are now set from matching atoms in the parent molecule rather than from `MolOps::setTerminalAtomCoords`.\r\n\r\n"}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/rdkit_m_rdkit:pr-5684", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/Code/GraphMol/RGroupDecomposition/RGroupDecomp.cpp b/Code/GraphMol/RGroupDecomposition/RGroupDecomp.cpp\nindex 8ad35951683..b8a2c72cec9 100644\n--- a/Code/GraphMol/RGroupDecomposition/RGroupDecomp.cpp\n+++ b/Code/GraphMol/RGroupDecomposition/RGroupDecomp.cpp\n@@ -456,6 +456,7 @@ RWMOL_SPTR RGroupDecomposition::outputCoreMolecule(\n }\n auto label = data->getRlabel(atom);\n auto missingRGroup = atom->hasProp(MISSING_RGROUP);\n+ bool atomRemoved = false;\n Atom *nbrAtom = nullptr;\n for (const auto &nbri :\n boost::make_iterator_range(coreWithMatches->getAtomNeighbors(atom))) {\n@@ -473,6 +474,7 @@ RWMOL_SPTR RGroupDecomposition::outputCoreMolecule(\n } else if (!isUserDefinedLabel ||\n data->params.removeAllHydrogenRGroupsAndLabels) {\n coreWithMatches->removeAtom(atomIdx);\n+ atomRemoved = true;\n // if we remove an unused label from an aromatic atom,\n // we need to check whether we need to adjust its explicit\n // H count, or it will fail to kekulize\n@@ -485,6 +487,13 @@ RWMOL_SPTR RGroupDecomposition::outputCoreMolecule(\n }\n }\n nbrAtom->updatePropertyCache(false);\n+ if (!atomRemoved && coreWithMatches->getNumConformers() > 0) {\n+ auto iter = match.rgroups.find(label);\n+ if (iter != match.rgroups.end() && iter->second->is_hydrogen) {\n+ MolOps::setTerminalAtomCoords(*coreWithMatches, atomIdx,\n+ nbrAtom->getIdx());\n+ }\n+ }\n }\n }\n return coreWithMatches;\ndiff --git a/Code/GraphMol/RGroupDecomposition/RGroupDecompData.h b/Code/GraphMol/RGroupDecomposition/RGroupDecompData.h\nindex b96017fcd25..3130576592f 100644\n--- a/Code/GraphMol/RGroupDecomposition/RGroupDecompData.h\n+++ b/Code/GraphMol/RGroupDecomposition/RGroupDecompData.h\n@@ -71,7 +71,7 @@ struct RGroupDecompData {\n }\n \n void addCore(const ROMol &inputCore) {\n- if (params.allowMultipleRGroupsOnUnlabelled) {\n+ if (params.allowMultipleRGroupsOnUnlabelled && !params.onlyMatchAtRGroups) {\n RWMol core(inputCore);\n params.addDummyAtomsToUnlabelledCoreAtoms(core);\n cores[cores.size()] = RCore(core);\n"}, "test": {"test_patch": "diff --git a/Code/GraphMol/RGroupDecomposition/testRGroupDecomp.cpp b/Code/GraphMol/RGroupDecomposition/testRGroupDecomp.cpp\nindex a97ad1799a9..391d470530f 100644\n--- a/Code/GraphMol/RGroupDecomposition/testRGroupDecomp.cpp\n+++ b/Code/GraphMol/RGroupDecomposition/testRGroupDecomp.cpp\n@@ -2887,7 +2887,7 @@ M END\n void testGithub5569() {\n BOOST_LOG(rdInfoLog)\n << \"********************************************************\\n\";\n- BOOST_LOG(rdInfoLog) << \"Test that Github5569 is fixed\" << std::endl;\n+ BOOST_LOG(rdInfoLog) << \"Test that Github5269 is fixed\" << std::endl;\n auto core = R\"CTAB(\n ChemDraw09152209202D\n \n@@ -3196,6 +3196,253 @@ void testMultipleGroupsToUnlabelledCoreAtom() {\n }\n }\n \n+void testGitHub5631() {\n+ BOOST_LOG(rdInfoLog)\n+ << \"********************************************************\\n\";\n+ BOOST_LOG(rdInfoLog)\n+ << \"Test that Github563 (proper placement of core R groups) is fixed\"\n+ << std::endl;\n+ auto core = R\"CTAB(\n+ RDKit 2D\n+\n+ 12 12 0 0 0 0 0 0 0 0999 V2000\n+ -3.4154 3.2137 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\n+ -2.5903 3.2137 0.0000 A 0 0 0 0 0 0 0 0 0 0 0 0\n+ -2.1778 3.9282 0.0000 A 0 0 0 0 0 0 0 0 0 0 0 0\n+ -2.5903 4.6427 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\n+ -3.4154 4.6427 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\n+ -3.8278 3.9282 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\n+ -4.6528 3.9282 0.0000 A 0 0 0 0 0 0 0 0 0 0 0 0\n+ -3.8278 2.4993 0.0000 R# 0 0 0 0 0 0 0 0 0 0 0 0\n+ -1.3528 3.9282 0.0000 R# 0 0 0 0 0 0 0 0 0 0 0 0\n+ -5.0654 4.6427 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\n+ -4.6528 5.3572 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0\n+ -5.8904 4.6427 0.0000 R# 0 0 0 0 0 0 0 0 0 0 0 0\n+ 5 6 8 0\n+ 4 5 8 0\n+ 3 4 8 0\n+ 2 3 8 0\n+ 1 2 8 0\n+ 1 6 8 0\n+ 6 7 1 0\n+ 1 8 1 0\n+ 3 9 1 0\n+ 7 10 1 0\n+ 10 11 2 0\n+ 10 12 1 0\n+M ISO 3 8 2 9 3 12 1\n+M RGP 3 8 2 9 3 12 1\n+M END\n+)CTAB\"_ctab;\n+\n+ auto mol1 = R\"CTAB(\n+ -OEChem-02051811442D\n+\n+ 25 27 0 0 0 0 0 0 0999 V2000\n+ -0.8675 0.4975 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\n+ 0.0000 0.0000 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\n+ 0.8675 0.4975 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\n+ 0.8675 1.5027 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\n+ -0.0000 2.0104 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0\n+ -0.8675 1.5027 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\n+ 1.7350 2.0001 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0\n+ 2.6070 1.5001 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\n+ 3.4790 2.0002 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\n+ 3.4790 3.0002 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\n+ 2.6159 3.5053 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\n+ 1.7439 3.0052 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\n+ 4.3465 3.4976 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0\n+ 4.3495 4.4976 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\n+ 3.4849 5.0002 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0\n+ 5.2170 4.9951 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\n+ 6.1281 4.5828 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\n+ 6.8007 5.3248 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\n+ 6.3049 6.1952 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\n+ 5.3214 5.9901 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0\n+ 6.7160 7.1067 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0\n+ 7.7947 5.2157 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0\n+ 1.7328 -0.0038 0.0000 N 0 3 0 0 0 0 0 0 0 0 0 0\n+ 1.7313 -1.0038 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0\n+ 2.5995 0.4950 0.0000 O 0 5 0 0 0 0 0 0 0 0 0 0\n+ 1 6 2 0 0 0 0\n+ 1 2 1 0 0 0 0\n+ 2 3 2 0 0 0 0\n+ 3 4 1 0 0 0 0\n+ 4 5 2 0 0 0 0\n+ 5 6 1 0 0 0 0\n+ 4 7 1 0 0 0 0\n+ 7 12 1 0 0 0 0\n+ 7 8 1 0 0 0 0\n+ 8 9 1 0 0 0 0\n+ 9 10 1 0 0 0 0\n+ 10 11 1 0 0 0 0\n+ 11 12 1 0 0 0 0\n+ 10 13 1 0 0 0 0\n+ 13 14 1 0 0 0 0\n+ 14 15 2 0 0 0 0\n+ 14 16 1 0 0 0 0\n+ 16 20 1 0 0 0 0\n+ 16 17 2 0 0 0 0\n+ 17 18 1 0 0 0 0\n+ 18 19 2 0 0 0 0\n+ 19 20 1 0 0 0 0\n+ 19 21 1 0 0 0 0\n+ 18 22 1 0 0 0 0\n+ 3 23 1 0 0 0 0\n+ 23 24 2 0 0 0 0\n+ 23 25 1 0 0 0 0\n+M CHG 2 23 1 25 -1\n+M END\n+$$$$\n+)CTAB\"_ctab;\n+\n+ auto mol2 = R\"CTAB(\n+ -OEChem-02051811442D\n+\n+ 45 49 0 1 0 0 0 0 0999 V2000\n+ -2.9472 -3.8597 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\n+ -2.8765 -2.8622 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\n+ -3.6440 -2.2211 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\n+ -3.2684 -1.2927 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\n+ -2.2691 -1.3606 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\n+ -2.0260 -2.3354 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0\n+ -1.6270 -0.5940 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\n+ -1.9700 0.3454 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0\n+ -0.6420 -0.7667 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0\n+ 0.0000 0.0000 0.0000 C 0 0 2 0 0 0 0 0 0 0 0 0\n+ 1.1236 -1.3417 0.0000 H 0 0 0 0 0 0 0 0 0 0 0 0\n+ -0.8675 0.4975 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\n+ -0.8675 1.5027 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\n+ 0.0000 2.0104 0.0000 N 0 0 3 0 0 0 0 0 0 0 0 0\n+ 0.8675 1.5027 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\n+ 0.8675 0.4975 0.0000 C 0 0 2 0 0 0 0 0 0 0 0 0\n+ 1.2077 -0.4429 0.0000 H 0 0 0 0 0 0 0 0 0 0 0 0\n+ 1.8525 0.6702 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0\n+ 2.1954 1.6096 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\n+ 0.0000 3.0104 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\n+ -0.8098 3.5999 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0\n+ -0.5017 4.5529 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\n+ 0.4983 4.5516 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\n+ 0.8122 3.6017 0.0000 S 0 0 0 0 0 0 0 0 0 0 0 0\n+ 1.0846 5.3617 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\n+ 2.0793 5.2591 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0\n+ 0.6762 6.2745 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0\n+ -1.0895 5.3618 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\n+ -2.0889 5.2537 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\n+ -2.6768 6.0627 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0\n+ -2.2755 6.9786 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\n+ -1.2762 7.0868 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\n+ -0.6781 6.2789 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0\n+ -2.8669 7.7850 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0\n+ -3.8610 7.6760 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\n+ -4.4524 8.4824 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\n+ -5.4465 8.3734 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0\n+ -6.0457 9.1803 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\n+ -7.0449 9.0708 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\n+ -7.4449 8.1542 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0\n+ -6.8558 7.3461 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\n+ -5.8566 7.4557 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\n+ -8.4389 8.0452 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\n+ -3.7990 -0.4450 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0\n+ -4.6141 -2.4639 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0\n+ 1 2 1 0 0 0 0\n+ 2 6 1 0 0 0 0\n+ 2 3 2 0 0 0 0\n+ 3 4 1 0 0 0 0\n+ 4 5 2 0 0 0 0\n+ 5 6 1 0 0 0 0\n+ 5 7 1 0 0 0 0\n+ 7 8 2 0 0 0 0\n+ 7 9 1 0 0 0 0\n+ 9 10 1 0 0 0 0\n+ 10 11 1 1 0 0 0\n+ 10 16 1 0 0 0 0\n+ 10 12 1 0 0 0 0\n+ 12 13 1 0 0 0 0\n+ 13 14 1 0 0 0 0\n+ 14 15 1 0 0 0 0\n+ 15 16 1 0 0 0 0\n+ 16 17 1 1 0 0 0\n+ 16 18 1 0 0 0 0\n+ 18 19 1 0 0 0 0\n+ 14 20 1 0 0 0 0\n+ 20 24 1 0 0 0 0\n+ 20 21 2 0 0 0 0\n+ 21 22 1 0 0 0 0\n+ 22 23 2 0 0 0 0\n+ 23 24 1 0 0 0 0\n+ 23 25 1 0 0 0 0\n+ 25 26 2 0 0 0 0\n+ 25 27 1 0 0 0 0\n+ 22 28 1 0 0 0 0\n+ 28 33 2 0 0 0 0\n+ 28 29 1 0 0 0 0\n+ 29 30 2 0 0 0 0\n+ 30 31 1 0 0 0 0\n+ 31 32 2 0 0 0 0\n+ 32 33 1 0 0 0 0\n+ 31 34 1 0 0 0 0\n+ 34 35 1 0 0 0 0\n+ 35 36 1 0 0 0 0\n+ 36 37 1 0 0 0 0\n+ 37 42 1 0 0 0 0\n+ 37 38 1 0 0 0 0\n+ 38 39 1 0 0 0 0\n+ 39 40 1 0 0 0 0\n+ 40 41 1 0 0 0 0\n+ 41 42 1 0 0 0 0\n+ 40 43 1 0 0 0 0\n+ 4 44 1 0 0 0 0\n+ 3 45 1 0 0 0 0\n+M END\n+)CTAB\"_ctab;\n+\n+ RGroupDecompositionParameters params;\n+ params.matchingStrategy = GreedyChunks;\n+ params.allowMultipleRGroupsOnUnlabelled = false;\n+ params.onlyMatchAtRGroups = true;\n+ RGroupDecomposition decomp(*core, params);\n+ auto result = decomp.add(*mol1);\n+ TEST_ASSERT(result == 0);\n+ result = decomp.add(*mol2);\n+ TEST_ASSERT(result == 1);\n+ decomp.process();\n+ RGroupRows rows = decomp.getRGroupsAsRows();\n+ TEST_ASSERT(rows.size() == 2) {\n+ auto coreRgd = rows[0][\"Core\"];\n+ auto match = std::find_if(\n+ coreRgd->atoms().begin(), coreRgd->atoms().end(), [](Atom *a) {\n+ return a->getAtomicNum() == 0 && a->getAtomMapNum() == 2;\n+ });\n+ TEST_ASSERT(match != coreRgd->atoms().end());\n+ auto dummy = *match;\n+ auto neighbor = *coreRgd->atomNeighbors(dummy).begin();\n+ auto &conf = coreRgd->getConformer();\n+ auto &dummyPoint = conf.getAtomPos(dummy->getIdx());\n+ auto &neighborPoint = conf.getAtomPos(neighbor->getIdx());\n+ auto length = (dummyPoint - neighborPoint).length();\n+ TEST_ASSERT(abs(length - 1.0) < 0.005);\n+ // R2 dummy should be directly above neighbor\n+ TEST_ASSERT(abs(dummyPoint.x - neighborPoint.x) < 0.05);\n+ }\n+\n+ {\n+ auto coreRgd = rows[1][\"Core\"];\n+ auto match = std::find_if(\n+ coreRgd->atoms().begin(), coreRgd->atoms().end(), [](const Atom *a) {\n+ return a->getAtomicNum() == 0 && a->getAtomMapNum() == 2;\n+ });\n+ TEST_ASSERT(match != coreRgd->atoms().end());\n+ auto dummy = *match;\n+ auto &conf = coreRgd->getConformer();\n+ auto &dummyPoint = conf.getAtomPos(dummy->getIdx());\n+ // R2 dummy should be over input chiral oxygen, which is first oxygen of degree 2 in input mol block\n+ auto &inputPoint = mol2->getConformer(0).getAtomPos(15);\n+ TEST_ASSERT(abs(dummyPoint.x - inputPoint.x) < 0.05);\n+ TEST_ASSERT(abs(dummyPoint.y - inputPoint.y) < 0.05);\n+ }\n+}\n+\n int main() {\n RDLog::InitLogs();\n boost::logging::disable_logs(\"rdApp.debug\");\n@@ -3253,6 +3500,7 @@ int main() {\n testGithub4505();\n testMultipleGroupsToUnlabelledCoreAtomGithub5573();\n testMultipleGroupsToUnlabelledCoreAtom();\n+ testGitHub5631();\n BOOST_LOG(rdInfoLog)\n << \"********************************************************\\n\";\n return 0;\n", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}215{"question_id": "MSB_rdkit_rdkit_pr5735", "question_type": "multi_swe_bench", "description": "Bug/github5613 (rdkit/rdkit#5735)", "content": {"org": "rdkit", "repo": "rdkit", "pr_number": 5735, "issue_title": "Bug/github5613", "issue_body": "<!--\r\nThanks for contributing a pull request! \r\n-->\r\n#### Reference Issue\r\n\r\nFixes #5613 \r\n\r\n#### What does this implement/fix? Explain your changes.\r\n\r\nCopies the target molecule onto the core template preserving stereochemistry, aromaticity and explicit hydrogens.\r\n\r\nNew routine is in `RCore::extractCoreFromMolMatch`. I also expanded the *allowMultipleRGroupsOnUnlabelled* option so that\r\nthere is an explicit bond to an attachment point for all free valence in the core template. This necessitated changes to \r\n`RCore::matchTerminalUserRGroups` to better handle matching. There are a bunch of other changes as the matching core for each target now has an explicit hydrogen model.\r\n\r\nI've put the test results in [this gist](https://gist.github.com/jones-gareth/40383fc76313e0365d4058e48d6f2193)\r\n\r\n#### Any other comments?\r\n\r\nThere is one wierdness- one of the expected smiles has changed for `allowMultipleRGroupsOnUnlabelled` from `C1SC2CC([*:1])NC(N([*:2])[*:4])C2C1[*:6]` to `C1C2SCC([*:6])C2C(N([*:2])[*:4])NC1[*:1]`. But this is the same structure:\r\n\r\n```\r\nmol1 = Chem.MolFromSmiles('C1SC2CC([*:1])NC(N([*:2])[*:4])C2C1[*:6]')\r\n# new expected\r\nmol2 = Chem.MolFromSmiles('C1C2SCC([*:6])C2C(N([*:2])[*:4])NC1[*:1]')\r\nDraw.MolsToGridImage([mol1, mol2], 2)\r\n```\r\n\r\n\r\nI'm wondering if I'm not updating properties, re-initializing after editing molecules or have otherwise created a corrupt structure. I anybody can point me in the right direction that would be great.", "base_commit": "e2c5243275dacd1a04a367ea7ac1b878b67d4fbb", "resolved_issues": [{"number": 5613, "title": "RGD Stereochemistry in decomposed structure is not copied to the matching core", "body": "**Describe the bug**\r\n\r\nGiven a core query that does not specify stereochemistry and a matching structure with stereochemistry the stereochmistry is not copied to the matching core output in the decomposition.\r\n\r\n**To Reproduce**\r\n\r\n```python\r\n# %%\r\nfrom rdkit import Chem\r\nfrom rdkit.Chem import AllChem\r\nfrom rdkit.Chem.rdRGroupDecomposition import RGroupDecomposition, RGroupDecompositionParameters, \\\r\n RGroupMatching, RGroupScore, RGroupLabels, RGroupCoreAlignment, RGroupLabelling\r\nfrom rdkit.Chem.Draw import IPythonConsole\r\nIPythonConsole.ipython_useSVG = True\r\nfrom rdkit.Chem import PandasTools\r\nfrom rdkit.Chem import Draw\r\nfrom IPython.display import HTML\r\nimport pandas as pd\r\n\r\n# %%\r\ncore = Chem.MolFromSmarts('[*:1]C(=O)NC1CCN([*:3])C1')\r\ncore\r\n\r\n# %%\r\nmol = Chem.MolFromSmiles('Cc1c(c(c([nH]1)C(=O)N[C@H]2CCN(C2)c3cc(nc(n3)Cl)C(=O)O)Cl)Cl')\r\nmol\r\n\r\n# %%\r\noptions = RGroupDecompositionParameters()\r\ndecomp = RGroupDecomposition([core], options)\r\ndecomp.Add(mol)\r\ndecomp.Process()\r\ngroups = decomp.GetRGroupsAsColumns()\r\ndf = PandasTools.RGroupDecompositionToFrame(groups, [mol], include_core=True)\r\nPandasTools.ChangeMoleculeRendering(df)\r\nHTML(df.to_html())\r\n\r\n```\r\n\r\n**Expected behavior**\r\n\r\nI expect to see the chiral center in the molecule appear in the matching core.\r\n\r\n**Screenshots**\r\n\r\nThe core query does not have a chiral center specified:\r\n\r\n\r\n\r\nThe molecule does on the Pyrrolidine N:\r\n\r\n\r\n\r\nbut the matching core does not contain the chiral center:\r\n\r\n\r\n\r\n**Configuration (please complete the following information):**\r\n\r\n - RDKit version: master as of 9/2022\r\n - OS: [e.g. Ubuntu 20.04] Ubuntu 20.04\r\n - Python version (if relevant):\r\n - Are you using conda?\r\n - If you are using conda, which channel did you install the rdkit from?\r\n - If you are not using conda: how did you install the RDKit?\r\n\r\n**Additional context**\r\n\r\nWhile bond and atom information is copied from the input core to the output/matching core, stereochemistry is not.\r\n\r\nI can take a look, but if anyone could point me to existing code that does something similar that would be helpful. I guess the issue would be that the parity/atom ordering round the chiral center in the input core and matching core could be different.\r\n"}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/rdkit_m_rdkit:pr-5735", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/Code/GraphMol/ChemTransforms/ChemTransforms.cpp b/Code/GraphMol/ChemTransforms/ChemTransforms.cpp\nindex afb958a3034..38d9882712c 100644\n--- a/Code/GraphMol/ChemTransforms/ChemTransforms.cpp\n+++ b/Code/GraphMol/ChemTransforms/ChemTransforms.cpp\n@@ -32,7 +32,7 @@\n #include <RDGeneral/BadFileException.h>\n #include <GraphMol/ChemTransforms/ChemTransforms.h>\n namespace RDKit {\n-namespace {\n+namespace details {\n void updateSubMolConfs(const ROMol &mol, RWMol &res,\n boost::dynamic_bitset<> &removedAtoms) {\n // update conformer information:\n@@ -52,7 +52,9 @@ void updateSubMolConfs(const ROMol &mol, RWMol &res,\n res.addConformer(newConf, false);\n }\n }\n+} // namespace details\n \n+namespace {\n struct SideChainMapping {\n int molIndex;\n int coreIndex;\n@@ -136,7 +138,7 @@ ROMol *deleteSubstructs(const ROMol &mol, const ROMol &query, bool onlyFrags,\n res->commitBatchEdit();\n // if we removed any atoms, clear the computed properties:\n if (delList.size()) {\n- updateSubMolConfs(mol, *res, removedAtoms);\n+ details::updateSubMolConfs(mol, *res, removedAtoms);\n \n res->clearComputedProps(true);\n // update our properties, but allow unhappiness:\n@@ -242,7 +244,7 @@ std::vector<ROMOL_SPTR> replaceSubstructs(\n // clear conformers and computed props and do basic updates\n // on the resulting molecules, but allow unhappiness:\n for (auto &re : res) {\n- updateSubMolConfs(mol, *(RWMol *)re.get(), removedAtoms);\n+ details::updateSubMolConfs(mol, *(RWMol *)re.get(), removedAtoms);\n re->clearComputedProps(true);\n re->updatePropertyCache(false);\n }\n@@ -327,7 +329,7 @@ ROMol *replaceSidechains(const ROMol &mol, const ROMol &coreQuery,\n }\n newMol->commitBatchEdit();\n \n- updateSubMolConfs(mol, *newMol, removedAtoms);\n+ details::updateSubMolConfs(mol, *newMol, removedAtoms);\n \n // clear computed props and do basic updates on the\n // the resulting molecule, but allow unhappiness:\n@@ -628,6 +630,10 @@ ROMol *replaceCore(const ROMol &mol, const ROMol &core,\n if (switchIt) {\n sidechainAtom->invertChirality();\n }\n+ // the neighbor count needs to be decremented, in case an additional\n+ // bond to the core is present at this chiral center (unlikely!),\n+ // because this bond will now be at the end of the neighbor list.\n+ --whichNbr;\n }\n }\n ++whichNbr;\n@@ -676,7 +682,7 @@ ROMol *replaceCore(const ROMol &mol, const ROMol &core,\n }\n newMol->commitBatchEdit();\n \n- updateSubMolConfs(mol, *newMol, removedAtoms);\n+ details::updateSubMolConfs(mol, *newMol, removedAtoms);\n \n // Update any terminal dummy atom coordinates after removing atoms not in the\n // keeplist and calling updateSubMolConfs\n@@ -795,7 +801,7 @@ ROMol *MurckoDecompose(const ROMol &mol) {\n }\n res->commitBatchEdit();\n \n- updateSubMolConfs(mol, *res, removedAtoms);\n+ details::updateSubMolConfs(mol, *res, removedAtoms);\n res->clearComputedProps();\n \n return (ROMol *)res;\ndiff --git a/Code/GraphMol/ChemTransforms/ChemTransforms.h b/Code/GraphMol/ChemTransforms/ChemTransforms.h\nindex 0d248b82f2a..978aeb64cfb 100644\n--- a/Code/GraphMol/ChemTransforms/ChemTransforms.h\n+++ b/Code/GraphMol/ChemTransforms/ChemTransforms.h\n@@ -265,6 +265,12 @@ RDKIT_CHEMTRANSFORMS_EXPORT void parseQueryDefText(\n std::map<std::string, ROMOL_SPTR> &queryDefs, bool standardize = true,\n const std::string &delimiter = \"\\t\", const std::string &comment = \"//\",\n unsigned int nameColumn = 0, unsigned int smartsColumn = 1);\n-} // namespace RDKit\n \n+namespace details {\n+//! not recommended for use in other code\n+RDKIT_CHEMTRANSFORMS_EXPORT void updateSubMolConfs(\n+ const ROMol &mol, RWMol &res, boost::dynamic_bitset<> &removedAtoms);\n+} // namespace details\n+\n+} // namespace RDKit\n #endif\ndiff --git a/Code/GraphMol/RGroupDecomposition/RGroupCore.cpp b/Code/GraphMol/RGroupDecomposition/RGroupCore.cpp\nindex 6732d4668f2..9017134d865 100644\n--- a/Code/GraphMol/RGroupDecomposition/RGroupCore.cpp\n+++ b/Code/GraphMol/RGroupDecomposition/RGroupCore.cpp\n@@ -9,7 +9,9 @@\n // of the RDKit source tree.\n //\n #include \"RGroupCore.h\"\n-#include <GraphMol/Substruct/SubstructUtils.h>\n+#include \"GraphMol/SmilesParse/SmilesWrite.h\"\n+#include \"GraphMol/ChemTransforms/ChemTransforms.h\"\n+#include \"GraphMol/Substruct/SubstructUtils.h\"\n \n namespace RDKit {\n \n@@ -17,17 +19,25 @@ namespace {\n // From answer 12 in\n // https://stackoverflow.com/questions/5279051/how-can-i-create-cartesian-product-of-vector-of-vectors\n // by anumi\n+// modified to exclude duplicates\n static std::vector<std::vector<int>> cartesianProduct(\n- const std::vector<std::vector<int>> &v) {\n+ const std::vector<std::vector<int>> &v, bool allowDuplicates) {\n std::vector<std::vector<int>> s = {{}};\n for (const auto &u : v) {\n std::vector<std::vector<int>> r;\n for (const auto &x : s) {\n for (const auto y : u) {\n- r.push_back(x);\n- r.back().push_back(y);\n+ // check for duplicates\n+ if (allowDuplicates || std::find(x.begin(), x.end(), y) == x.end()) {\n+ r.push_back(x);\n+ r.back().push_back(y);\n+ }\n }\n }\n+ if (r.empty()) {\n+ // unable to extend\n+ return r;\n+ }\n s = std::move(r);\n }\n return s;\n@@ -54,6 +64,223 @@ void RCore::findIndicesWithRLabel() {\n }\n }\n \n+std::pair<RWMOL_SPTR, bool> RCore::extractCoreFromMolMatch(\n+ const ROMol &mol, const MatchVectType &match,\n+ const RGroupDecompositionParameters ¶ms) const {\n+ auto extractedCore = boost::make_shared<RWMol>(mol);\n+ std::set<int> atomIndicesToKeep;\n+ std::vector<Bond *> newBonds;\n+ std::map<Atom *, int> dummyAtomMap;\n+ bool hasCoreDummies = false;\n+ for (auto &pair : match) {\n+ const auto queryAtom = core->getAtomWithIdx(pair.first);\n+ auto const targetAtom = extractedCore->getAtomWithIdx(pair.second);\n+ if (int rLabel; queryAtom->getPropIfPresent(RLABEL, rLabel)) {\n+ targetAtom->setProp(RLABEL, rLabel);\n+ }\n+ if (int rLabelType; queryAtom->getPropIfPresent(RLABEL_TYPE, rLabelType)) {\n+ targetAtom->setProp(RLABEL_TYPE, rLabelType);\n+ }\n+\n+ if (!hasCoreDummies && queryAtom->getAtomicNum() == 0) {\n+ hasCoreDummies = true;\n+ }\n+ if (queryAtom->getAtomicNum() == 0 && queryAtom->hasProp(RLABEL) &&\n+ queryAtom->getDegree() == 1) {\n+ continue;\n+ } else {\n+ atomIndicesToKeep.insert(pair.second);\n+ int neighborNumber = -1;\n+#ifdef VERBOSE\n+ std::cerr << \"Atom Chirality In \" << targetAtom->getChiralTag()\n+ << std::endl;\n+#endif\n+ bool isChiral = targetAtom->getChiralTag() == Atom::CHI_TETRAHEDRAL_CCW ||\n+ targetAtom->getChiralTag() == Atom::CHI_TETRAHEDRAL_CW;\n+ if (isChiral && !params.substructmatchParams.useChirality) {\n+ // if we're not doing chiral matching don't copy chirality to the\n+ // extracted core.\n+ targetAtom->setChiralTag(Atom::CHI_UNSPECIFIED);\n+ isChiral = false;\n+ }\n+ // collect neighbors in vector, so we can add atoms while looping\n+ std::vector<Atom *> targetNeighborAtoms;\n+ for (auto targetNeighborAtom : extractedCore->atomNeighbors(targetAtom)) {\n+ targetNeighborAtoms.push_back(targetNeighborAtom);\n+ }\n+ // explicit hydrogens to keep in extracted core to preserve chiralty\n+ std::vector<int> hydrogensToAdd;\n+ for (const auto targetNeighborAtom : targetNeighborAtoms) {\n+ ++neighborNumber;\n+ auto targetNeighborIndex = targetNeighborAtom->getIdx();\n+ auto queryNeighborMapping = std::find_if(\n+ match.begin(), match.end(),\n+ [this, targetNeighborIndex, pair](const auto &p) {\n+ return p.second == static_cast<int>(targetNeighborIndex) &&\n+ core->getBondBetweenAtoms(pair.first, p.first);\n+ });\n+ if (queryNeighborMapping == match.end()) {\n+ if (targetNeighborAtom->getAtomicNum() == 1) {\n+ // Hydrogen needed to define chirality is present in target but\n+ // not mapped to core. Copy it to the extracted core\n+ hydrogensToAdd.push_back(static_cast<int>(targetNeighborIndex));\n+ } else if (isChiral) {\n+ // There is a heavy sidechain in the decomp that is connected to\n+ // the core by an unknown bond (onlyMatchAtRGroups = False and\n+ // allowMultipleRGroupsOnUnlabelled = False).\n+ // As there is no explicit target bond chriality is not preserved.\n+ // In some cases we could handle chirality, but that has not been\n+ // implemented (if there is only one free bond on the query that\n+ // would be easy- or we could arbitrarily assign bonds).\n+ isChiral = false;\n+ targetAtom->setChiralTag(Atom::CHI_UNSPECIFIED);\n+ }\n+ continue;\n+ }\n+ const auto queryNeighbor =\n+ core->getAtomWithIdx((*queryNeighborMapping).first);\n+ if (queryNeighbor->getAtomicNum() == 0 &&\n+ queryNeighbor->hasProp(RLABEL) && queryNeighbor->getDegree() == 1) {\n+ auto newDummy = new Atom(*queryNeighbor);\n+ dummyAtomMap[newDummy] = static_cast<int>(targetNeighborIndex);\n+ newDummy->clearComputedProps();\n+ const auto newDummyIdx =\n+ extractedCore->addAtom(newDummy, false, true);\n+ atomIndicesToKeep.insert(static_cast<int>(newDummyIdx));\n+ auto connectingBond =\n+ extractedCore\n+ ->getBondBetweenAtoms(pair.second, targetNeighborIndex)\n+ ->copy();\n+ if (connectingBond->getStereo() > Bond::BondStereo::STEREOANY) {\n+ // TODO: how to handle bond stereo on rgroups connected to core by\n+ // stereo double bonds\n+ connectingBond->setStereo(Bond::BondStereo::STEREOANY);\n+ }\n+\n+ if (connectingBond->getBeginAtomIdx() == targetNeighborIndex) {\n+ connectingBond->setBeginAtomIdx(newDummyIdx);\n+ } else {\n+ connectingBond->setEndAtomIdx(newDummyIdx);\n+ }\n+ newBonds.push_back(connectingBond);\n+\n+ // Chirality parity stuff see RDKit::replaceCore in\n+ // Code/GraphMol/ChemTransforms/ChemTransforms.cpp\n+ if (isChiral) {\n+ bool switchIt = false;\n+ switch (extractedCore->getAtomDegree(targetAtom)) {\n+ case 4:\n+ if (!(neighborNumber % 2)) {\n+ switchIt = true;\n+ }\n+ break;\n+ case 3:\n+ if (neighborNumber == 1) {\n+ switchIt = true;\n+ }\n+ break;\n+ }\n+ // because this neighbor will be moved at the end of the neighbor\n+ // list, we need to decrement the neighbor number in case additional\n+ // dummy atoms are to be connected to the targetAtom\n+ --neighborNumber;\n+ if (switchIt) {\n+ targetAtom->invertChirality();\n+ }\n+ }\n+ }\n+ }\n+ for (const int index : hydrogensToAdd) {\n+ atomIndicesToKeep.insert(index);\n+ }\n+#ifdef VERBOSE\n+ std::cerr << \"Atom Chirality Out \" << targetAtom->getChiralTag()\n+ << std::endl;\n+#endif\n+ }\n+ }\n+ for (const auto newBond : newBonds) {\n+ extractedCore->addBond(newBond, true);\n+ }\n+\n+ // Now delete atom's that are not in the core.\n+ extractedCore->beginBatchEdit();\n+ boost::dynamic_bitset<> removedAtoms(mol.getNumAtoms());\n+ for (const auto atom : extractedCore->atoms()) {\n+ if (atomIndicesToKeep.find(atom->getIdx()) == atomIndicesToKeep.end()) {\n+ extractedCore->removeAtom(atom);\n+ removedAtoms.set(atom->getIdx());\n+ }\n+ }\n+ extractedCore->commitBatchEdit();\n+\n+ // Copy molecule coordinates to extracted core\n+ details::updateSubMolConfs(mol, *extractedCore, removedAtoms);\n+\n+ for (auto citer = mol.beginConformers(); citer != mol.endConformers();\n+ ++citer) {\n+ Conformer &newConf =\n+ extractedCore->getConformer(static_cast<int>((*citer)->getId()));\n+ for (const auto &[fst, snd] : dummyAtomMap) {\n+ newConf.setAtomPos(fst->getIdx(), (*citer)->getAtomPos(snd));\n+ }\n+ }\n+\n+ // If the molecule has no coordinates and the core does, copy those over\n+ if (!mol.getNumConformers() && core->getNumConformers()) {\n+ ROMol molCopy(mol);\n+ for (auto citer = core->beginConformers(); citer != core->endConformers();\n+ ++citer) {\n+ const auto newConf = new Conformer(mol.getNumAtoms());\n+ newConf->setId((*citer)->getId());\n+ newConf->set3D((*citer)->is3D());\n+ for (const auto &[fst, snd] : match) {\n+ newConf->setAtomPos(snd, (*citer)->getAtomPos(fst));\n+ }\n+ molCopy.addConformer(newConf);\n+ }\n+ details::updateSubMolConfs(molCopy, *extractedCore, removedAtoms);\n+ molCopy.clearConformers();\n+\n+ for (const auto atom : extractedCore->atoms()) {\n+ if (isUserRLabel(*atom)) {\n+ int rLabel = atom->getProp<int>(RLABEL);\n+ for (const auto coreAtom : core->atoms()) {\n+ if (int l; coreAtom->getPropIfPresent(RLABEL, l) && l == rLabel) {\n+ int i = 0;\n+ for (auto citer = core->beginConformers();\n+ citer != core->endConformers(); ++citer, ++i) {\n+ extractedCore->getConformer(i).setAtomPos(\n+ atom->getIdx(), (*citer)->getAtomPos(coreAtom->getIdx()));\n+ }\n+ break;\n+ }\n+ }\n+ }\n+ }\n+ }\n+\n+ extractedCore->clearComputedProps(true);\n+ extractedCore->updatePropertyCache(false);\n+\n+#ifdef VERBOSE\n+ std::cerr << \"Extracted core smiles \" << MolToSmiles(*extractedCore)\n+ << std::endl;\n+ std::cerr << \"Extracted core smarts \" << MolToSmarts(*extractedCore)\n+ << std::endl;\n+#endif\n+\n+ try {\n+ unsigned int failed;\n+ MolOps::sanitizeMol(*extractedCore, failed,\n+ MolOps::SANITIZE_SYMMRINGS | MolOps::SANITIZE_CLEANUP);\n+ } catch (const MolSanitizeException &) {\n+ }\n+\n+ std::pair rtn(extractedCore, hasCoreDummies);\n+ return rtn;\n+}\n+\n // Return a copy of core where dummy atoms are replaced by\n // the respective matching atom in mol, while other atoms have\n // their aromatic flag and formal charge copied from\n@@ -73,23 +300,6 @@ ROMOL_SPTR RCore::replaceCoreAtomsWithMolMatches(\n }\n }\n \n- // look for dummy rgroup attachment points in core that are not in mapping\n- // there is no r group for these guys. I've marked them as missing.\n- // It might be better to delete them coreReplaceAtoms, but I'm not sure of the\n- // implications of that.\n- for (auto atom : coreReplacedAtoms->atoms()) {\n- if (atom->getAtomicNum() == 0 && atom->hasProp(RLABEL)) {\n- auto missing = std::find_if(match.cbegin(), match.cend(),\n- [atom](const std::pair<int, int> &p) {\n- return static_cast<unsigned int>(p.first) ==\n- atom->getIdx();\n- }) == match.end();\n- if (missing) {\n- atom->setProp<bool>(MISSING_RGROUP, true);\n- }\n- }\n- }\n-\n std::map<int, int> matchLookup(match.cbegin(), match.cend());\n for (auto bond : coreReplacedAtoms->bonds()) {\n if (bond->hasQuery()) {\n@@ -170,68 +380,6 @@ void RCore::replaceCoreAtom(RWMol &mol, Atom &atom, const Atom &other) const {\n }\n }\n \n-// Final core returned to user with dummy atoms and bonds set to those in the\n-// match\n-RWMOL_SPTR RCore::coreWithMatches(const ROMol &coreReplacedAtoms) const {\n- auto finalCore = boost::make_shared<RWMol>(*labelledCore);\n- for (size_t atomIdx = 0; atomIdx < coreReplacedAtoms.getNumAtoms();\n- ++atomIdx) {\n- auto coreAtom = finalCore->getAtomWithIdx(atomIdx);\n- auto templateAtom = coreReplacedAtoms.getAtomWithIdx(atomIdx);\n- auto unlabelledCoreAtom = core->getAtomWithIdx(atomIdx);\n- if (templateAtom->getAtomicNum() > 0 &&\n- isAtomWithMultipleNeighborsOrNotDummyRGroupAttachment(\n- *unlabelledCoreAtom)) {\n- replaceCoreAtom(*finalCore, *coreAtom, *templateAtom);\n- }\n- }\n-\n- for (size_t bondIdx = 0; bondIdx < coreReplacedAtoms.getNumBonds();\n- ++bondIdx) {\n- auto coreBond = finalCore->getBondWithIdx(bondIdx);\n- if (coreBond->hasQuery()) {\n- auto templateBond = coreReplacedAtoms.getBondWithIdx(bondIdx);\n- Bond newBond(templateBond->getBondType());\n- newBond.setIsAromatic(templateBond->getIsAromatic());\n- finalCore->replaceBond(bondIdx, &newBond, true);\n- }\n- }\n-\n- // update core coordinates to input structures\n- if (coreReplacedAtoms.getNumConformers() && finalCore->getNumConformers()) {\n- const auto &replacedConformer = coreReplacedAtoms.getConformer();\n- auto &finalConformer = finalCore->getConformer();\n-\n- size_t atomIdx = 0;\n- for (; atomIdx < coreReplacedAtoms.getNumAtoms(); ++atomIdx) {\n- auto molPoint = replacedConformer.getAtomPos(atomIdx);\n- finalConformer.setAtomPos(atomIdx, molPoint);\n- }\n- // Dummy atom coordinates are not in input structure, so calculate them here\n- for (; atomIdx < finalCore->getNumAtoms(); atomIdx++) {\n- const auto atom = finalCore->getAtomWithIdx(atomIdx);\n- const int neighborIdx = *finalCore->getAtomNeighbors(atom).first;\n- MolOps::setTerminalAtomCoords(*finalCore, atomIdx, neighborIdx);\n- }\n- }\n-\n- // Remove unmapped dummies\n- std::vector<Atom *> atomsToRemove;\n- for (const auto atom : coreReplacedAtoms.atoms()) {\n- if (atom->getAtomicNum() == 0 && atom->hasProp(MISSING_RGROUP)) {\n- atomsToRemove.push_back(finalCore->getAtomWithIdx(atom->getIdx()));\n- }\n- }\n- finalCore->beginBatchEdit();\n- for (auto atom : atomsToRemove) {\n- finalCore->removeAtom(atom);\n- }\n- finalCore->commitBatchEdit();\n-\n- finalCore->updatePropertyCache(false);\n- return finalCore;\n-}\n-\n // matching the core to the target molecule is a two step process\n // First match to a reduced representation (the core minus terminal user\n // R-groups). Next, match the R-groups. We do this as the core may not be a\n@@ -251,6 +399,8 @@ void RCore::buildMatchingMol() {\n for (auto atom : matchingMol->atoms()) {\n // keep track of the original core index in the matching molecule atom\n atom->setProp<int>(RLABEL_CORE_INDEX, atom->getIdx());\n+ // TODO for unlabelled core attachments if the heavy neighbor is not dummy\n+ // then keep one attachment\n if (atom->getAtomicNum() == 0 && atom->getDegree() == 1 &&\n isDummyRGroupAttachment(*atom)) {\n // remove terminal user R groups and save core atom index and mapping to\n@@ -302,48 +452,163 @@ std::vector<MatchVectType> RCore::matchTerminalUserRGroups(\n // target atoms that the R group can map to\n std::map<int, std::vector<int>> availableMappingsForDummyMap;\n \n- // Loop over all the user terminal R groups and see if they can be included\n- // in the match and, if so, record the target atoms that the R group can\n- // be mapped to.\n- for (const auto dummyIdx : terminalRGroupDummyAtoms) {\n- // find the heavy atom in the core attached to the dummy\n- const int neighborIdx = terminalRGroupAtomToNeighbor.find(dummyIdx)->second;\n- const auto coreBond = core->getBondBetweenAtoms(dummyIdx, neighborIdx);\n- // find the atom in the target mapped to the neighbor in the core\n- const int targetIdx = matchMap[neighborIdx];\n- const auto targetAtom = target.getAtomWithIdx(targetIdx);\n- ROMol::ADJ_ITER nbrIter, endNbrs;\n- std::vector<int> available;\n- // now look for neighbors of that target atom that are not mapped to a core\n- // atom- the dummy atom can potentially be mapped to each of those\n- boost::tie(nbrIter, endNbrs) = target.getAtomNeighbors(targetAtom);\n- while (nbrIter != endNbrs) {\n- if (mappedTargetIdx.find(*nbrIter) == mappedTargetIdx.end()) {\n- const auto targetBond = target.getBondBetweenAtoms(targetIdx, *nbrIter);\n- // check for bond compatibility\n- if (bondCompat(coreBond, targetBond, sssParams)) {\n- available.push_back(*nbrIter);\n+ std::set<int> symmetricHydrogens;\n+\n+ // keep a count of target atoms and the number of connections to the core\n+ std::map<int, int> targetAtomBondsToCoreCounts;\n+ for (const auto coreAtom : core->atoms()) {\n+ if (coreAtom->getAtomicNum() == 1) {\n+ continue;\n+ }\n+ if (terminalRGroupDummyAtoms.find(coreAtom->getIdx()) !=\n+ terminalRGroupDummyAtoms.end()) {\n+ continue;\n+ }\n+ std::vector<int> dummyIndexes;\n+ for (auto neighbor : core->atomNeighbors(coreAtom)) {\n+ if (terminalRGroupDummyAtoms.find(neighbor->getIdx()) !=\n+ terminalRGroupDummyAtoms.end()) {\n+ dummyIndexes.push_back(neighbor->getIdx());\n+ }\n+ }\n+ if (dummyIndexes.empty()) {\n+ continue;\n+ }\n+\n+ // Sort dummies based on user RLABEL (ascending) then unlabeled\n+ // (descending as they are negative)\n+ std::sort(dummyIndexes.begin(), dummyIndexes.end(), [this](int a, int b) {\n+ auto dummy = core->getAtomWithIdx(a);\n+ auto otherDummy = core->getAtomWithIdx(b);\n+ auto l1 = dummy->getProp<int>(RLABEL);\n+ auto l2 = otherDummy->getProp<int>(RLABEL);\n+ return l1 > 0 && l2 > 0 ? l1 < l2 : l1 > l2;\n+ });\n+\n+ // Find what target atoms will bond to these dummies\n+ std::vector<std::vector<int>> neighborDummyLists;\n+ for (auto dummyIndex : dummyIndexes) {\n+ const int neighborIdx =\n+ terminalRGroupAtomToNeighbor.find(dummyIndex)->second;\n+ const auto coreBond = core->getBondBetweenAtoms(dummyIndex, neighborIdx);\n+ // find the atom in the target mapped to the neighbor in the core\n+ const int targetIdx = matchMap[neighborIdx];\n+ const auto targetAtom = target.getAtomWithIdx(targetIdx);\n+ ROMol::ADJ_ITER nbrIter, endNbrs;\n+ std::vector<int> available;\n+ // now look for neighbors of that target atom that are not mapped to a\n+ // core atom- the dummy atom can potentially be mapped to each of those\n+ boost::tie(nbrIter, endNbrs) = target.getAtomNeighbors(targetAtom);\n+ while (nbrIter != endNbrs) {\n+ if (mappedTargetIdx.find(*nbrIter) == mappedTargetIdx.end()) {\n+ const auto targetBond =\n+ target.getBondBetweenAtoms(targetIdx, *nbrIter);\n+ // check for bond compatibility\n+ if (bondCompat(coreBond, targetBond, sssParams)) {\n+ available.push_back(*nbrIter);\n+ targetAtomBondsToCoreCounts[*nbrIter]++;\n+ }\n+ }\n+ ++nbrIter;\n+ }\n+\n+ if (available.size() > 1) {\n+ bool allHydrogens = std::all_of(\n+ available.begin(), available.end(), [&target](const int idx) {\n+ return target.getAtomWithIdx(idx)->getAtomicNum() == 1;\n+ });\n+ if (allHydrogens) {\n+ // If all neighbors are hydrogens we don't need to iterate through\n+ // them- just assign the first free hydrogen. Could extend to cover\n+ // symmetric groups in general\n+ auto hydrogen = std::find_if(available.begin(), available.end(),\n+ [&symmetricHydrogens](const int idx) {\n+ return symmetricHydrogens.find(idx) ==\n+ symmetricHydrogens.end();\n+ });\n+ int singleHydrogen =\n+ hydrogen == available.end() ? *available.begin() : *hydrogen;\n+ std::vector<int> hydrogenVec{singleHydrogen};\n+ available = hydrogenVec;\n+ symmetricHydrogens.insert(singleHydrogen);\n }\n }\n- ++nbrIter;\n+ neighborDummyLists.push_back(available);\n }\n \n- if (available.size()) {\n- availableMappingsForDummyMap[dummyIdx] = available;\n- } else {\n- // We can't map this dummy to a target atom. That is OK if it is an\n- // unlabelled core attachment atom or a user R label connected to a\n- // query or wildcard atom\n- const auto dummy = core->getAtomWithIdx(dummyIdx);\n- const auto neighbor = core->getAtomWithIdx(neighborIdx);\n- if (dummy->hasProp(UNLABELLED_CORE_ATTACHMENT)) {\n- missingDummies.push_back(dummyIdx);\n- } else if (isUserRLabel(*dummy) &&\n- (neighbor->getAtomicNum() == 0 || neighbor->hasQuery())) {\n- // https://github.com/rdkit/rdkit/issues/4505\n- missingDummies.push_back(dummyIdx);\n+ // Now search through all the dummies and see if we need to exclude any as\n+ // it may not be possible to assign target atoms to all R groups. If that\n+ // is the case exclude R Groups with higher labels\n+\n+ // use negative numbers to indicate a group is excluded\n+ std::vector<std::vector<int>> neighborListsWithUnmapped(\n+ neighborDummyLists.size());\n+ int start = 0;\n+ std::transform(neighborDummyLists.begin(), neighborDummyLists.end(),\n+ neighborListsWithUnmapped.begin(),\n+ [&start](std::vector<int> v) {\n+ v.push_back(--start);\n+ return v;\n+ });\n+ // could optimize this product as depth search to return as soon as we\n+ // have a permutation of all positive numbers\n+ auto cp = cartesianProduct(neighborListsWithUnmapped, false);\n+ // now sort\n+ bool foundAll = false;\n+ std::sort(cp.begin(), cp.end(),\n+ [&foundAll](const std::vector<int> a, std::vector<int> b) {\n+ auto isNegative = [](int v) -> bool { return v < 0; };\n+ // firstly to minimize number of unmapped dummies\n+ const int numUnmappedA =\n+ std::count_if(a.begin(), a.end(), isNegative);\n+ const int numUnmappedB =\n+ std::count_if(b.begin(), b.end(), isNegative);\n+ if (numUnmappedA < numUnmappedB) {\n+ return true;\n+ }\n+ if (numUnmappedB == 0 || numUnmappedA == 0) {\n+ foundAll = true;\n+ }\n+ if (!foundAll && numUnmappedA == numUnmappedB && numUnmappedA) {\n+ // in a tie prefer the permutation that excludes the r group\n+ // with the lowest label\n+ // don't need to sort these if we've found an all mapped\n+ // combination\n+ for (size_t i = 0; i < a.size(); ++i) {\n+ const int v1 = a[i];\n+ const int v2 = b[i];\n+ if ((v1 > 0 && v2 > 0) || (v1 < 0 && v2 < 0)) {\n+ continue;\n+ }\n+ if (v1 > 0 && v2 < 0) {\n+ return true;\n+ }\n+ if (v1 < 0 && v2 > 0) {\n+ break;\n+ }\n+ }\n+ }\n+ return false;\n+ });\n+ auto best = cp[0];\n+ for (size_t i = 0; i < dummyIndexes.size(); i++) {\n+ auto dummyIdx = dummyIndexes[i];\n+ if (best[i] < 0) {\n+ // We can't map this dummy to a target atom. That is OK if it is an\n+ // unlabeled core attachment atom or a user R label connected to a\n+ // query or wildcard atom\n+ const auto dummy = core->getAtomWithIdx(dummyIdx);\n+ if (dummy->hasProp(UNLABELED_CORE_ATTACHMENT)) {\n+ missingDummies.push_back(dummyIdx);\n+ } else if (isUserRLabel(*dummy) &&\n+ (coreAtom->getAtomicNum() == 0 || coreAtom->hasQuery())) {\n+ // https://github.com/rdkit/rdkit/issues/4505\n+ missingDummies.push_back(dummyIdx);\n+ } else {\n+ return allMappings;\n+ }\n } else {\n- return allMappings;\n+ availableMappingsForDummyMap[dummyIdx] = neighborDummyLists[i];\n }\n }\n }\n@@ -352,51 +617,6 @@ std::vector<MatchVectType> RCore::matchTerminalUserRGroups(\n return allMappings;\n }\n \n- // find singleton duplicate mappings. This can happen if there are 2 user\n- // specified R groups attached to a query atom and only one of the R groups\n- // can match (see second case in https://github.com/rdkit/rdkit/issues/4505)\n- // We remove the R group with the highest label\n- for (auto mapping = availableMappingsForDummyMap.begin();\n- mapping != availableMappingsForDummyMap.end();) {\n- auto values = mapping->second;\n- bool erased = false;\n- if (values.size() == 1) {\n- const auto dummy = core->getAtomWithIdx(mapping->first);\n- auto [nbrIter, endNbrs] = core->getAtomNeighbors(dummy);\n- auto heavyNeighbor = core->getAtomWithIdx(*nbrIter);\n- bool userQueryDummy =\n- isUserRLabel(*dummy) &&\n- (heavyNeighbor->getAtomicNum() == 0 || heavyNeighbor->hasQuery());\n- if (userQueryDummy) {\n- boost::tie(nbrIter, endNbrs) = core->getAtomNeighbors(heavyNeighbor);\n- while (nbrIter != endNbrs) {\n- int otherIdx = *nbrIter;\n- if (otherIdx != mapping->first) {\n- auto mappingIter = availableMappingsForDummyMap.find(otherIdx);\n- if (mappingIter != availableMappingsForDummyMap.end() &&\n- mappingIter->second.size() == 1 &&\n- mappingIter->second[0] == values[0]) {\n- auto otherDummy = core->getAtomWithIdx(otherIdx);\n- bool remove = isUserRLabel(*otherDummy) &&\n- dummy->getProp<int>(RLABEL) >\n- otherDummy->getProp<int>(RLABEL);\n- if (remove) {\n- missingDummies.push_back(mapping->first);\n- availableMappingsForDummyMap.erase(mapping++);\n- erased = true;\n- break;\n- }\n- }\n- }\n- nbrIter++;\n- }\n- }\n- }\n- if (!erased) {\n- ++mapping;\n- }\n- }\n-\n std::vector<int> dummiesWithMapping;\n std::vector<std::vector<int>> availableMappingsForDummy;\n for (const auto &mapping : availableMappingsForDummyMap) {\n@@ -405,10 +625,19 @@ std::vector<MatchVectType> RCore::matchTerminalUserRGroups(\n }\n \n // enumerate over all available atoms using a cartesian product.\n- // this is not the most ideal way to do things as the straightforward product\n- // will allow duplicates. In the unlikely evert that there is a performance\n- // issue a custom enumerator will be needed\n- const auto allAvailableMappings = cartesianProduct(availableMappingsForDummy);\n+ // only allow duplicates if a target atom can be bonded to more than one query\n+ // atom\n+ const bool allowDuplicates =\n+ std::find_if(targetAtomBondsToCoreCounts.begin(),\n+ targetAtomBondsToCoreCounts.end(),\n+ [](const std::pair<int, int> &p) { return p.second > 1; }) !=\n+ targetAtomBondsToCoreCounts.end();\n+ const auto allAvailableMappings =\n+ cartesianProduct(availableMappingsForDummy, allowDuplicates);\n+ if (allAvailableMappings.empty()) {\n+ allMappings.push_back(match);\n+ return allMappings;\n+ }\n // the size of the final mapping\n size_t size = allAvailableMappings[0].size() + match.size();\n // these indices are needed for the whole molecule match check functor\n@@ -418,7 +647,7 @@ std::vector<MatchVectType> RCore::matchTerminalUserRGroups(\n const std::string indexProp(\"__core_index__\");\n bool hasMissing = !missingDummies.empty();\n if (hasMissing) {\n- // if there are dummies that we can map these need to be removed from the\n+ // if there are dummies that we can't map these need to be removed from the\n // query before atom-by-atom matching. Create a copy of the query for that\n // and use properties to map atoms back to the core\n for (auto atom : core->atoms()) {\n@@ -458,8 +687,8 @@ std::vector<MatchVectType> RCore::matchTerminalUserRGroups(\n sssParams);\n boost::dynamic_bitset<> targetBondsPresent(target.getNumBonds());\n \n- // Filter all available mappings removing those that contain duplicates,\n- // or violate chirality\n+ // Filter all available mappings removing those that violate chirality or have\n+ // duplicate bonds\n for (const auto &dummyMapping : allAvailableMappings) {\n CHECK_INVARIANT(match.size() + dummyMapping.size() == size,\n \"Size error in dummy mapping\");\n@@ -471,20 +700,22 @@ std::vector<MatchVectType> RCore::matchTerminalUserRGroups(\n : dummiesWithMapping[i];\n queryIndices[position] = queryIndex;\n targetIndices[position] = dummyMapping[i];\n- const int neighborIdx =\n- terminalRGroupAtomToNeighbor.find(dummiesWithMapping[i])->second;\n- const int targetNeighborIdx = matchMap[neighborIdx];\n- const auto targetBond =\n- target.getBondBetweenAtoms(dummyMapping[i], targetNeighborIdx);\n- CHECK_INVARIANT(targetBond != nullptr, \"Matching target bond not found\");\n- const auto targetBondIdx = targetBond->getIdx();\n- // check for duplicates- some of this could also be handled within a\n- // modified cartesian product.\n- if (targetBondsPresent[targetBondIdx]) {\n- duplicateBonds = true;\n- break;\n+ if (allowDuplicates) {\n+ const int neighborIdx =\n+ terminalRGroupAtomToNeighbor.find(dummiesWithMapping[i])->second;\n+ const int targetNeighborIdx = matchMap[neighborIdx];\n+ const auto targetBond =\n+ target.getBondBetweenAtoms(dummyMapping[i], targetNeighborIdx);\n+ CHECK_INVARIANT(targetBond != nullptr,\n+ \"Matching target bond not found\");\n+ const auto targetBondIdx = targetBond->getIdx();\n+ // check for duplicates\n+ if (targetBondsPresent[targetBondIdx]) {\n+ duplicateBonds = true;\n+ break;\n+ }\n+ targetBondsPresent[targetBondIdx] = 1;\n }\n- targetBondsPresent[targetBondIdx] = 1;\n }\n // use MolMatchFinalCheckFunctor to check this match works with chirality\n if (!duplicateBonds && molMatchFunctor(queryIndices, targetIndices)) {\ndiff --git a/Code/GraphMol/RGroupDecomposition/RGroupCore.h b/Code/GraphMol/RGroupDecomposition/RGroupCore.h\nindex 9a493a8ab29..92a551ca9c5 100644\n--- a/Code/GraphMol/RGroupDecomposition/RGroupCore.h\n+++ b/Code/GraphMol/RGroupDecomposition/RGroupCore.h\n@@ -50,15 +50,17 @@ struct RCore {\n \n // Return a copy of core where dummy atoms are replaced by\n // the respective matching atom in mol, while other atoms have\n- // their aromatic flag and formal charge copied from \n+ // their aromatic flag and formal charge copied from\n // the respective matching atom in mol\n ROMOL_SPTR replaceCoreAtomsWithMolMatches(bool &hasCoreDummies,\n const ROMol &mol,\n const MatchVectType &match) const;\n \n- // Final core returned to user with dummy atoms and bonds set to those in the\n- // match\n- RWMOL_SPTR coreWithMatches(const ROMol &coreReplacedAtoms) const;\n+ // Final core returned to user, created by extracting core from target\n+ // molecule\n+ std::pair<RWMOL_SPTR, bool> extractCoreFromMolMatch(\n+ const ROMol &mol, const MatchVectType &match,\n+ const RGroupDecompositionParameters ¶ms) const;\n \n std::vector<MatchVectType> matchTerminalUserRGroups(\n const RWMol &target, MatchVectType match,\n@@ -80,7 +82,8 @@ struct RCore {\n private:\n // The set of atom indices in the core for terminal R groups with user label\n std::set<int> terminalRGroupDummyAtoms;\n- // The set of atom indices in the core for terminal R groups with atom indices with or without user labels\n+ // The set of atom indices in the core for terminal R groups with atom indices\n+ // with or without user labels\n std::set<int> terminalRGroupAtoms;\n // An atom index map of terminal R groups to their heavy atom neighbor\n std::map<int, int> terminalRGroupAtomToNeighbor;\n@@ -92,8 +95,8 @@ struct RCore {\n \n // Build the matching molecule (core minus user R groups)\n void buildMatchingMol();\n- \n- // Add attachement points to unlabelled R Groups\n+\n+ // Add attachment points to unlabelled R Groups\n void addDummyAtomsToUnlabelledCoreAtoms();\n };\n \ndiff --git a/Code/GraphMol/RGroupDecomposition/RGroupDecomp.cpp b/Code/GraphMol/RGroupDecomposition/RGroupDecomp.cpp\nindex b8a2c72cec9..52ca467a963 100644\n--- a/Code/GraphMol/RGroupDecomposition/RGroupDecomp.cpp\n+++ b/Code/GraphMol/RGroupDecomposition/RGroupDecomp.cpp\n@@ -59,8 +59,7 @@ const std::string done = \"RLABEL_PROCESSED\";\n const std::string CORE = \"Core\";\n const std::string RPREFIX = \"R\";\n const std::string _rgroupInputDummy = \"_rgroupInputDummy\";\n-const std::string UNLABELLED_CORE_ATTACHMENT = \"unlabeledCoreAttachment\";\n-const std::string MISSING_RGROUP = \"missingRGroup\";\n+const std::string UNLABELED_CORE_ATTACHMENT = \"unlabeledCoreAttachment\";\n \n namespace {\n void ADD_MATCH(R_DECOMP &match, int rlabel) {\n@@ -123,7 +122,7 @@ int RGroupDecomposition::add(const ROMol &inmol) {\n // a substructure match for the molecule if a single molecule atom matches\n // 2 RGroup attachments (see https://github.com/rdkit/rdkit/pull/4002)\n \n- // match the reduced represenation:\n+ // match the reduced representation:\n std::vector<MatchVectType> baseMatches =\n SubstructMatch(mol, *core.second.matchingMol, sssparams);\n tmatches.clear();\n@@ -258,6 +257,7 @@ int RGroupDecomposition::add(const ROMol &inmol) {\n const bool labelByIndex = true;\n const bool requireDummyMatch = false;\n bool hasCoreDummies = false;\n+ // TODO see if we need relaceCoreWithMolMatches or can just use rcore->core\n auto coreCopy =\n rcore->replaceCoreAtomsWithMolMatches(hasCoreDummies, mol, tmatche);\n tMol.reset(replaceCore(mol, *coreCopy, tmatche, replaceDummies,\n@@ -302,6 +302,15 @@ int RGroupDecomposition::add(const ROMol &inmol) {\n \n data->labels.insert(rlabel); // keep track of all labels used\n attachments.push_back(rlabel);\n+ if (const auto [bondIdx, end] = newMol->getAtomBonds(at); bondIdx != end) {\n+ auto connectingBond = (*newMol)[*bondIdx];\n+ if (connectingBond->getStereo() > Bond::BondStereo::STEREOANY) {\n+ // TODO: how to handle bond stereo on rgroups connected to core by\n+ // stereo double bonds\n+ connectingBond->setStereo(Bond::BondStereo::STEREOANY);\n+ }\n+ }\n+\n }\n } else {\n // restore input wildcard\n@@ -377,10 +386,11 @@ int RGroupDecomposition::add(const ROMol &inmol) {\n rcore->numberUserRGroups - numberUserGroupsInMatch;\n CHECK_INVARIANT(numberMissingUserGroups >= 0,\n \"Data error in missing user rgroup count\");\n- potentialMatches.emplace_back(\n- core_idx, numberMissingUserGroups, match,\n- hasCoreDummies || !data->params.onlyMatchAtRGroups ? coreCopy\n- : nullptr);\n+ const auto [extractedCore, hasDummies] =\n+ rcore->extractCoreFromMolMatch(mol, tmatche, params());\n+ hasCoreDummies = hasDummies;\n+ potentialMatches.emplace_back(core_idx, numberMissingUserGroups, match,\n+ extractedCore);\n }\n }\n }\n@@ -444,19 +454,26 @@ std::vector<std::string> RGroupDecomposition::getRGroupLabels() const {\n \n RWMOL_SPTR RGroupDecomposition::outputCoreMolecule(\n const RGroupMatch &match, const UsedLabelMap &usedLabelMap) const {\n+ // this routine could probably be merged into RGroupDecompData::relabelCore\n+\n const auto &core = data->cores[match.core_idx];\n if (!match.matchedCore) {\n return core.labelledCore;\n }\n- auto coreWithMatches = core.coreWithMatches(*match.matchedCore);\n+ auto coreWithMatches = match.matchedCore;\n+#ifdef VERBOSE\n+ std::cerr << \"output core mol1 \" << MolToSmarts(*coreWithMatches)\n+ << std::endl;\n+#endif\n+ std::map<Atom *, int> retainedRGroups;\n for (auto atomIdx = coreWithMatches->getNumAtoms(); atomIdx--;) {\n auto atom = coreWithMatches->getAtomWithIdx(atomIdx);\n if (atom->getAtomicNum()) {\n continue;\n }\n auto label = data->getRlabel(atom);\n- auto missingRGroup = atom->hasProp(MISSING_RGROUP);\n- bool atomRemoved = false;\n+ // Always convert to hydrogen - then remove later if\n+ // removeHydrogensPostMatch is set\n Atom *nbrAtom = nullptr;\n for (const auto &nbri :\n boost::make_iterator_range(coreWithMatches->getAtomNeighbors(atom))) {\n@@ -464,38 +481,64 @@ RWMOL_SPTR RGroupDecomposition::outputCoreMolecule(\n break;\n }\n if (nbrAtom) {\n- bool isUserDefinedLabel =\n+ const bool isUserDefinedLabel =\n usedLabelMap.has(label) && usedLabelMap.isUserDefined(label);\n- auto numExplicitHs = nbrAtom->getNumExplicitHs();\n- if (usedLabelMap.has(label) && usedLabelMap.getIsUsed(label)) {\n- if (numExplicitHs) {\n- nbrAtom->setNumExplicitHs(numExplicitHs - 1);\n- }\n- } else if (!isUserDefinedLabel ||\n- data->params.removeAllHydrogenRGroupsAndLabels) {\n- coreWithMatches->removeAtom(atomIdx);\n- atomRemoved = true;\n- // if we remove an unused label from an aromatic atom,\n- // we need to check whether we need to adjust its explicit\n- // H count, or it will fail to kekulize\n- if (isUserDefinedLabel && nbrAtom->getIsAromatic() && !missingRGroup) {\n- nbrAtom->updatePropertyCache(false);\n- if (!numExplicitHs) {\n- nbrAtom->setNumExplicitHs(nbrAtom->getExplicitValence() -\n- nbrAtom->getDegree());\n- }\n- }\n+ const bool isUsedLabel =\n+ usedLabelMap.has(label) && usedLabelMap.getIsUsed(label);\n+ if (!isUsedLabel && (!isUserDefinedLabel ||\n+ data->params.removeAllHydrogenRGroupsAndLabels)) {\n+ // Always convert to hydrogen - then remove later if\n+ // removeHydrogensPostMatch is set\n+ atom->setAtomicNum(1);\n+ atom->updatePropertyCache(false);\n+ } else {\n+ retainedRGroups[atom] = label;\n }\n- nbrAtom->updatePropertyCache(false);\n- if (!atomRemoved && coreWithMatches->getNumConformers() > 0) {\n- auto iter = match.rgroups.find(label);\n- if (iter != match.rgroups.end() && iter->second->is_hydrogen) {\n- MolOps::setTerminalAtomCoords(*coreWithMatches, atomIdx,\n- nbrAtom->getIdx());\n+ }\n+ }\n+\n+#ifdef VERBOSE\n+ std::cerr << \"output core mol2 \" << MolToSmiles(*coreWithMatches)\n+ << std::endl;\n+#endif\n+ if (data->params.removeHydrogensPostMatch) {\n+ RDLog::LogStateSetter blocker;\n+ constexpr bool implicitOnly = false;\n+ constexpr bool updateExplicitCount = false;\n+ constexpr bool sanitize = false;\n+ MolOps::removeHs(*coreWithMatches, implicitOnly, updateExplicitCount,\n+ sanitize);\n+ coreWithMatches->updatePropertyCache(false);\n+ }\n+\n+ if (coreWithMatches->getNumConformers() > 0) {\n+ for (const auto &[atom, label] : retainedRGroups) {\n+ if (usedLabelMap.has(label) && usedLabelMap.isUserDefined(label)) {\n+ // coordinates of user defined R groups should already be copied over\n+ continue;\n+ }\n+ const auto neighbor = *coreWithMatches->atomNeighbors(atom).begin();\n+ const auto &mapping = data->finalRlabelMapping;\n+ if (const auto oldLabel = std::find_if(\n+ mapping.begin(), mapping.end(),\n+ [label = label](const auto &p) { return p.second == label; });\n+ oldLabel != mapping.end()) {\n+ if (auto iter = match.rgroups.find(oldLabel->first);\n+ iter != match.rgroups.end()) {\n+ MolOps::setTerminalAtomCoords(*coreWithMatches, atom->getIdx(),\n+ neighbor->getIdx());\n }\n }\n }\n }\n+\n+ if (!coreWithMatches->getRingInfo()->isInitialized()) {\n+ MolOps::symmetrizeSSSR(*coreWithMatches);\n+ }\n+#ifdef VERBOSE\n+ std::cerr << \"output core mol3 \" << MolToSmiles(*coreWithMatches)\n+ << std::endl;\n+#endif\n return coreWithMatches;\n }\n \ndiff --git a/Code/GraphMol/RGroupDecomposition/RGroupDecompData.h b/Code/GraphMol/RGroupDecomposition/RGroupDecompData.h\nindex 3130576592f..83f3caa08b3 100644\n--- a/Code/GraphMol/RGroupDecomposition/RGroupDecompData.h\n+++ b/Code/GraphMol/RGroupDecomposition/RGroupDecompData.h\n@@ -219,6 +219,7 @@ struct RGroupDecompData {\n }\n }\n \n+ std::set<int> labelsToErase;\n for (int label : labels) {\n if (label > 0 && !removeAllHydrogenRGroups) {\n continue;\n@@ -236,11 +237,35 @@ struct RGroupDecompData {\n }\n \n if (allH) {\n+ labelsToErase.insert(label);\n for (auto &position : results) {\n position.rgroups.erase(label);\n }\n }\n }\n+\n+ for (auto &position : results) {\n+ for (auto atom : position.matchedCore->atoms()) {\n+ if (int atomLabel; atom->getAtomicNum() == 0 &&\n+ atom->getPropIfPresent(RLABEL, atomLabel)) {\n+ if (atomLabel > 0 && !params.removeAllHydrogenRGroupsAndLabels) {\n+ continue;\n+ }\n+ if (labelsToErase.find(atomLabel) != labelsToErase.end()) {\n+ atom->setAtomicNum(1);\n+ atom->clearProp(RLABEL);\n+ if (atom->hasProp(RLABEL_TYPE)) {\n+ atom->clearProp(RLABEL_TYPE);\n+ }\n+ if (atom->hasProp(UNLABELED_CORE_ATTACHMENT)) {\n+ atom->clearProp(UNLABELED_CORE_ATTACHMENT);\n+ }\n+ atom->updatePropertyCache(false);\n+ }\n+ }\n+ }\n+ }\n+\n return results;\n }\n \n@@ -286,9 +311,31 @@ struct RGroupDecompData {\n }\n }\n \n+ bool replaceHydrogenCoreDummy(const RGroupMatch &match, RWMol &core,\n+ const Atom &atom, const int currentLabel,\n+ const int rLabel) {\n+ // if the R group is just a hydrogen then the attachment point should\n+ // replace an existing hydrogen neighbor since all hydrogen neighbors\n+ // are copied from the input molecule to the extracted core.\n+ if (const auto group = match.rgroups.find(currentLabel);\n+ group != match.rgroups.end()) {\n+ if (group->second->is_hydrogen) {\n+ for (auto &neighbor : core.atomNeighbors(&atom)) {\n+ if (neighbor->getAtomicNum() == 1) {\n+ neighbor->setAtomicNum(0);\n+ setRlabel(neighbor, rLabel);\n+ return true;\n+ }\n+ }\n+ }\n+ }\n+ return false;\n+ }\n+\n void relabelCore(RWMol &core, std::map<int, int> &mappings,\n UsedLabels &used_labels, const std::set<int> &indexLabels,\n- const std::map<int, std::vector<int>> &extraAtomRLabels) {\n+ const std::map<int, std::vector<int>> &extraAtomRLabels,\n+ const RGroupMatch *const match = nullptr) {\n // Now remap to proper rlabel ids\n // if labels are positive, they come from User labels\n // if they are negative, they come from indices and should be\n@@ -304,7 +351,6 @@ struct RGroupDecompData {\n // a sidechain atom has a vector of the attachments back to the\n // core that takes the place of numBondsToRlabel\n \n- std::map<int, std::vector<int>> bondsToCore;\n std::vector<std::pair<Atom *, Atom *>> atomsToAdd; // adds -R if necessary\n \n // Deal with user supplied labels\n@@ -320,10 +366,26 @@ struct RGroupDecompData {\n if (atom->getAtomicNum() == 0 &&\n atom->getDegree() == 1) { // add to existing dummy/rlabel\n setRlabel(atom, userLabel);\n- } else { // adds new rlabel\n- auto *newAt = new Atom(0);\n- setRlabel(newAt, userLabel);\n- atomsToAdd.emplace_back(atom, newAt);\n+ } else {\n+ // A non-terminal RGroup. Create a dummy by replacing an existing\n+ // hydrogen for hydrogen side chains, or a new dummy atom for heavy side\n+ // chains.\n+ bool addNew = true;\n+ if (match != nullptr) {\n+ addNew = !replaceHydrogenCoreDummy(*match, core, *atom, userLabel,\n+ userLabel);\n+ // If we can't replace a hydrogen only add the dummy if it exists in\n+ // the decomp This is unexpected.\n+ if (addNew &&\n+ match->rgroups.find(userLabel) == match->rgroups.end()) {\n+ addNew = false;\n+ }\n+ }\n+ if (addNew) {\n+ auto *newAt = new Atom(0);\n+ setRlabel(newAt, userLabel);\n+ atomsToAdd.emplace_back(atom, newAt);\n+ }\n }\n }\n \n@@ -350,9 +412,21 @@ struct RGroupDecompData {\n *atom)) { // add to dummy\n setRlabel(atom, rlabel);\n } else {\n- auto *newAt = new Atom(0);\n- setRlabel(newAt, rlabel);\n- atomsToAdd.emplace_back(atom, newAt);\n+ bool addNew = true;\n+ if (match != nullptr) {\n+ addNew =\n+ !replaceHydrogenCoreDummy(*match, core, *atom, newLabel, rlabel);\n+ // If we can't replace a hydrogen only add the dummy if it exists in\n+ // the decomp This is unexpected.\n+ if (addNew && match->rgroups.find(newLabel) == match->rgroups.end()) {\n+ addNew = false;\n+ }\n+ }\n+ if (addNew) {\n+ auto *newAt = new Atom(0);\n+ setRlabel(newAt, rlabel);\n+ atomsToAdd.emplace_back(atom, newAt);\n+ }\n }\n }\n \n@@ -382,6 +456,11 @@ struct RGroupDecompData {\n atom->clearProp(RLABEL);\n atom->clearProp(RLABEL_TYPE);\n }\n+\n+ // Delay removing hydrogens from core until outputCoreMolecule is called,\n+ // If hydrogens are removed now and more dummies removed in\n+ // outputCoreMolecule then aromaticity perception in the core may be broken.\n+\n core.updatePropertyCache(false); // this was github #1550\n }\n \n@@ -532,6 +611,16 @@ struct RGroupDecompData {\n for (auto &rgroup : it.rgroups) {\n relabelRGroup(*rgroup.second, finalRlabelMapping);\n }\n+#ifdef VERBOSE\n+ std::cerr << \"relabel core mol1 \" << MolToSmiles(*it.matchedCore)\n+ << std::endl;\n+#endif\n+ relabelCore(*it.matchedCore, finalRlabelMapping, used_labels, indexLabels,\n+ extraAtomRLabels, &it);\n+#ifdef VERBOSE\n+ std::cerr << \"relabel core mol2 \" << MolToSmiles(*it.matchedCore)\n+ << std::endl;\n+#endif\n }\n \n std::set<int> uniqueMappedValues;\ndiff --git a/Code/GraphMol/RGroupDecomposition/RGroupDecompParams.cpp b/Code/GraphMol/RGroupDecomposition/RGroupDecompParams.cpp\nindex af3b94d8dde..3086e68c3fc 100644\n--- a/Code/GraphMol/RGroupDecomposition/RGroupDecompParams.cpp\n+++ b/Code/GraphMol/RGroupDecomposition/RGroupDecompParams.cpp\n@@ -14,6 +14,7 @@\n #include <GraphMol/Substruct/SubstructMatch.h>\n #include <GraphMol/SmilesParse/SmilesParse.h>\n #include <GraphMol/FMCS/FMCS.h>\n+#include <GraphMol/QueryBond.h>\n #include <set>\n \n namespace RDKit {\n@@ -155,7 +156,8 @@ bool RGroupDecompositionParameters::prepareCore(RWMol &core,\n }\n \n int maxLabel = 1;\n- if (alignCore && (alignment & MCS)) {\n+ // makes no sense to do MCS alignment if we are only matching at user defined R-Groups\n+ if (alignCore && !onlyMatchAtRGroups && (alignment & MCS)) {\n std::vector<ROMOL_SPTR> mols;\n mols.push_back(ROMOL_SPTR(new ROMol(core)));\n mols.push_back(ROMOL_SPTR(new ROMol(*alignCore)));\n@@ -250,7 +252,7 @@ bool RGroupDecompositionParameters::prepareCore(RWMol &core,\n }\n \n if (!found && (autoLabels & DummyAtomLabels) && atom->getDegree() == 1 &&\n- !atom->hasProp(UNLABELLED_CORE_ATTACHMENT)) {\n+ !atom->hasProp(UNLABELED_CORE_ATTACHMENT)) {\n const bool forceRelabellingWithDummies = true;\n int defaultDummyStartLabel = maxLabel;\n if (setLabel(atom, defaultDummyStartLabel, foundLabels, maxLabel,\n@@ -265,6 +267,9 @@ bool RGroupDecompositionParameters::prepareCore(RWMol &core,\n // we have used (note that these are negative since they are\n // potential rgroups and haven't been assigned yet)\n if (!found && (autoLabels & AtomIndexLabels)) {\n+ // we should not need these on (non r group) core atoms when\n+ // allowMultipleRGroupsOnUnlabelled is set, but it is useful in case\n+ // insufficient dummy groups are added to the core\n if (setLabel(atom, indexOffset - atom->getIdx(), foundLabels, maxLabel,\n relabel, Labelling::INDEX_LABELS)) {\n nextOffset++;\n@@ -310,50 +315,64 @@ void RGroupDecompositionParameters::addDummyAtomsToUnlabelledCoreAtoms(\n return;\n }\n \n- // add a single rgroup substitution to any atom with free valence that doesn't\n- // have a terminal dummy neighbor\n-\n- std::vector<Atom *> unlabelledCoreAtoms{};\n+ // add R group substitutions to fill atomic valence\n+ std::vector<Atom *> unlabeledCoreAtoms{};\n for (const auto atom : core.atoms()) {\n if (atom->getAtomicNum() == 1) {\n continue;\n }\n-\n if (hasLabel(atom, labels)) {\n continue;\n }\n+ unlabeledCoreAtoms.push_back(atom);\n+ }\n \n- if (atom->getAtomicNum() > 0 && atom->calcImplicitValence() <= 1 &&\n- !atom->hasQuery()) {\n- continue;\n- }\n-\n- auto [nbrIdx, endNbrs] = core.getAtomNeighbors(atom);\n- bool hasTerminalDummyNeighbor = false;\n+ for (const auto atom : unlabeledCoreAtoms) {\n+ atom->calcImplicitValence(false);\n+ const auto atomIndex = atom->getIdx();\n+ int dummiesToAdd;\n+ int maxNumDummies = 4 - static_cast<int>(atom->getDegree());\n \n- while (nbrIdx != endNbrs) {\n- const auto neighbor = core.getAtomWithIdx(*nbrIdx);\n- if (neighbor->getAtomicNum() == 0 && neighbor->getDegree() == 1) {\n- hasTerminalDummyNeighbor = true;\n- break;\n+ // figure out the number of dummies to add\n+ if (atom->getAtomicNum() == 0) {\n+ dummiesToAdd = maxNumDummies;\n+ } else {\n+ double bondOrder = 0;\n+ for (const auto bond : core.atomBonds(atom)) {\n+ auto contrib = bond->getValenceContrib(atom);\n+ if (contrib == 0.0 && bond->hasQuery()) {\n+ contrib = 1.0;\n+ }\n+ bondOrder += contrib;\n }\n- ++nbrIdx;\n- }\n- if (!hasTerminalDummyNeighbor) {\n- unlabelledCoreAtoms.push_back(atom);\n+\n+ const auto &valances =\n+ PeriodicTable::getTable()->getValenceList(atom->getAtomicNum());\n+ auto valence = *std::max_element(valances.begin(), valances.end());\n+ // round up aromatic contributions\n+ dummiesToAdd = valence - (int)(bondOrder + .51);\n+ dummiesToAdd = std::min(dummiesToAdd,maxNumDummies);\n }\n- }\n \n- for (const auto atom : unlabelledCoreAtoms) {\n- auto atomIndex = atom->getIdx();\n- auto newAtom = new Atom(0);\n- newAtom->setProp<bool>(UNLABELLED_CORE_ATTACHMENT, true);\n- auto newIdx = core.addAtom(newAtom, false, true);\n- core.addBond(atomIndex, newIdx, Bond::SINGLE);\n- auto dummy = core.getAtomWithIdx(newIdx);\n- dummy->updatePropertyCache();\n- if (core.getNumConformers() > 0) {\n- MolOps::setTerminalAtomCoords(core, newIdx, atomIndex);\n+ std::vector<int> newIndices;\n+ for (int i = 0; i < dummiesToAdd; i++) {\n+ const auto newAtom = new Atom(0);\n+ newAtom->setProp<bool>(UNLABELED_CORE_ATTACHMENT, true);\n+ const auto newIdx = core.addAtom(newAtom, false, true);\n+ newIndices.push_back(newIdx);\n+ auto *qb = new QueryBond();\n+ qb->setQuery(makeBondNullQuery());\n+ qb->setBeginAtomIdx(atomIndex);\n+ qb->setEndAtomIdx(newIdx);\n+ core.addBond(qb, true);\n+ const auto dummy = core.getAtomWithIdx(newIdx);\n+ dummy->updatePropertyCache();\n+ }\n+ atom->updatePropertyCache(false);\n+ for (const auto newIdx : newIndices) {\n+ if (core.getNumConformers() > 0) {\n+ MolOps::setTerminalAtomCoords(core, newIdx, atomIndex);\n+ }\n }\n }\n }\ndiff --git a/Code/GraphMol/RGroupDecomposition/RGroupMatch.h b/Code/GraphMol/RGroupDecomposition/RGroupMatch.h\nindex 2a1cbc70f09..a3041e8e2a3 100644\n--- a/Code/GraphMol/RGroupDecomposition/RGroupMatch.h\n+++ b/Code/GraphMol/RGroupDecomposition/RGroupMatch.h\n@@ -20,10 +20,10 @@ struct RGroupMatch {\n size_t core_idx; // index of the matching core\n size_t numberMissingUserRGroups;\n R_DECOMP rgroups; // rlabel->RGroupData mapping\n- ROMOL_SPTR matchedCore; // Core with dummy or query atoms and bonds matched\n+ RWMOL_SPTR matchedCore; // Core with dummy or query atoms and bonds matched\n \n RGroupMatch(size_t core_index, size_t numberMissingUserRGroups,\n- R_DECOMP input_rgroups, ROMOL_SPTR matchedCore)\n+ R_DECOMP input_rgroups, RWMOL_SPTR matchedCore)\n : core_idx(core_index),\n numberMissingUserRGroups(numberMissingUserRGroups),\n rgroups(std::move(input_rgroups)),\ndiff --git a/Code/GraphMol/RGroupDecomposition/RGroupUtils.cpp b/Code/GraphMol/RGroupDecomposition/RGroupUtils.cpp\nindex a5e5548d468..63ffe83596c 100644\n--- a/Code/GraphMol/RGroupDecomposition/RGroupUtils.cpp\n+++ b/Code/GraphMol/RGroupDecomposition/RGroupUtils.cpp\n@@ -110,13 +110,10 @@ bool isDummyRGroupAttachment(const Atom &atom) {\n if (isUserRLabel(atom)) {\n return true;\n }\n- int rlabel_type = 0;\n- bool unlabelled_core_attachment = false;\n- if (atom.hasProp(RLABEL) && atom.getPropIfPresent(RLABEL_TYPE, rlabel_type) &&\n- static_cast<Labelling>(rlabel_type) == Labelling::INDEX_LABELS &&\n- atom.getPropIfPresent(UNLABELLED_CORE_ATTACHMENT,\n- unlabelled_core_attachment) &&\n- unlabelled_core_attachment) {\n+ bool unlabeled_core_attachment = false;\n+ if (atom.getPropIfPresent(UNLABELED_CORE_ATTACHMENT,\n+ unlabeled_core_attachment) &&\n+ unlabeled_core_attachment) {\n return true;\n }\n return false;\ndiff --git a/Code/GraphMol/RGroupDecomposition/RGroupUtils.h b/Code/GraphMol/RGroupDecomposition/RGroupUtils.h\nindex 5bb764964d7..e683e4f1cad 100644\n--- a/Code/GraphMol/RGroupDecomposition/RGroupUtils.h\n+++ b/Code/GraphMol/RGroupDecomposition/RGroupUtils.h\n@@ -22,9 +22,7 @@ RDKIT_RGROUPDECOMPOSITION_EXPORT extern const std::string RLABEL_CORE_INDEX;\n RDKIT_RGROUPDECOMPOSITION_EXPORT extern const std::string SIDECHAIN_RLABELS;\n RDKIT_RGROUPDECOMPOSITION_EXPORT extern const std::string done;\n RDKIT_RGROUPDECOMPOSITION_EXPORT extern const std::string\n- UNLABELLED_CORE_ATTACHMENT;\n-RDKIT_RGROUPDECOMPOSITION_EXPORT extern const std::string\n- MISSING_RGROUP;\n+ UNLABELED_CORE_ATTACHMENT;\n \n const unsigned int EMPTY_CORE_LABEL = -100000;\n \ndiff --git a/Code/GraphMol/RGroupDecomposition/Wrap/rdRGroupComposition.cpp b/Code/GraphMol/RGroupDecomposition/Wrap/rdRGroupComposition.cpp\nindex ce5084dced1..1b2e1d9bf0f 100644\n--- a/Code/GraphMol/RGroupDecomposition/Wrap/rdRGroupComposition.cpp\n+++ b/Code/GraphMol/RGroupDecomposition/Wrap/rdRGroupComposition.cpp\n@@ -242,11 +242,11 @@ struct rgroupdecomp_wrapper {\n \" labelled.\\n\"\n \" - RGroupLabelling: choose where the rlabels are stored on the \"\n \"decomposition\\n\"\n- \" RGroupLabels.AtomMap - store rgroups as atom \"\n+ \" RGroupLabelling.AtomMap - store rgroups as atom \"\n \"maps (for smiles)\\n\"\n- \" RGroupLabels.Isotope - store rgroups on the \"\n+ \" RGroupLabelling.Isotope - store rgroups on the \"\n \"isotope\\n\"\n- \" RGroupLabels.MDLRGroup - store rgroups as mdl \"\n+ \" RGroupLabelling.MDLRGroup - store rgroups as mdl \"\n \"rgroups (for molblocks)\\n\"\n \" default: AtomMap | MDLRGroup\\n\"\n \" - onlyMatchAtRGroups: only allow rgroup decomposition at the \"\ndiff --git a/Code/GraphMol/RGroupDecomposition/catch_rgd.cpp b/Code/GraphMol/RGroupDecomposition/catch_rgd.cpp\nindex 9584c1bd956..ec783e26823 100644\n--- a/Code/GraphMol/RGroupDecomposition/catch_rgd.cpp\n+++ b/Code/GraphMol/RGroupDecomposition/catch_rgd.cpp\n@@ -307,6 +307,7 @@ TEST_CASE(\"substructure parameters and RGD: chirality\") {\n RGroupRows rows;\n std::vector<unsigned> unmatched;\n RGroupDecompositionParameters params;\n+ params.allowMultipleRGroupsOnUnlabelled = true;\n {\n auto n = RGroupDecompose(cores, mols, rows, &unmatched, params);\n CHECK(n == mols.size());\n@@ -315,17 +316,17 @@ TEST_CASE(\"substructure parameters and RGD: chirality\") {\n CHECK(flatten_whitespace(toJSON(rows)) == flatten_whitespace(R\"JSON(\n [\n {\n- \"Core\":\"C1CC([*:1])([*:2])N1\",\n+ \"Core\":\"C1C[C@@]([*:1])([*:2])N1\",\n \"R1\":\"F[*:1]\",\n \"R2\":\"[H][*:2]\"\n },\n {\n- \"Core\":\"C1CC([*:1])([*:2])N1\",\n+ \"Core\":\"C1C[C@]([*:1])([*:2])N1\",\n \"R1\":\"F[*:1]\",\n \"R2\":\"O[*:2]\"\n },\n {\n- \"Core\":\"C1CC([*:1])([*:2])N1\",\n+ \"Core\":\"C1C[C@]([*:1])([*:2])N1\",\n \"R1\":\"F[*:1]\",\n \"R2\":\"[H][*:2]\"\n },\n@@ -370,6 +371,7 @@ TEST_CASE(\"substructure parameters and RGD: chirality\") {\n RGroupRows rows;\n std::vector<unsigned> unmatched;\n RGroupDecompositionParameters params;\n+ params.allowMultipleRGroupsOnUnlabelled = true;\n params.substructmatchParams.useChirality = false;\n {\n auto n = RGroupDecompose(cores, mols, rows, &unmatched, params);\n@@ -447,6 +449,7 @@ TEST_CASE(\"substructure parameters and RGD: enhanced stereo\") {\n RGroupRows rows;\n std::vector<unsigned> unmatched;\n RGroupDecompositionParameters params;\n+ params.allowMultipleRGroupsOnUnlabelled = true;\n {\n auto n = RGroupDecompose(cores, mols, rows, &unmatched, params);\n CHECK(n == mols.size() - 1);\n@@ -454,27 +457,27 @@ TEST_CASE(\"substructure parameters and RGD: enhanced stereo\") {\n CHECK(unmatched.size() == mols.size() - n);\n // std::cerr << toJSON(rows) << std::endl;\n \n- // the core output here is SMARTS because the CXSMILES parser replaces the\n- // dummy atom with a query\n+ // the core output no longer is SMARTS as the core output is the portion\n+ // of the target that matches the core query.\n CHECK(flatten_whitespace(toJSON(rows)) == flatten_whitespace(R\"JSON(\n [\n {\n- \"Core\":\"[#6]1-[#6]-[#7]-[#6@]-1(-[!#1:1])-[#0:2]\",\n+ \"Core\":\"C1C[C@@]([*:1])([*:2])N1\",\n \"R1\":\"F[*:1]\",\n \"R2\":\"[H][*:2]\"\n },\n {\n- \"Core\":\"[#6]1-[#6]-[#7]-[#6@]-1(-[!#1:1])-[#0:2]\",\n+ \"Core\":\"C1C[C@@]([*:1])([*:2])N1\",\n \"R1\":\"O[*:1]\",\n \"R2\":\"F[*:2]\"\n },\n {\n- \"Core\":\"[#6]1-[#6]-[#7]-[#6@]-1(-[!#1:1])-[#0:2]\",\n+ \"Core\":\"C1C[C@@]([*:1])([*:2])N1\",\n \"R1\":\"[H][*:1]\",\n \"R2\":\"F[*:2]\"\n },\n {\n- \"Core\":\"[#6]1-[#6]-[#7]-[#6@]-1(-[!#1:1])-[#0:2]\",\n+ \"Core\":\"C1C[C@@]([*:1])([*:2])N1\",\n \"R1\":\"Cl[*:1]\",\n \"R2\":\"[H][*:2]\"\n }\n@@ -488,27 +491,27 @@ TEST_CASE(\"substructure parameters and RGD: enhanced stereo\") {\n CHECK(unmatched.size() == 1);\n // std::cerr << toJSON(rows) << std::endl;\n \n- // the core output here is SMARTS because the CXSMILES parser replaces the\n- // dummy atom with a query\n+ // the core output no longer is SMARTS as the core output is the portion\n+ // of the target that matches the core query.\n CHECK(flatten_whitespace(toJSON(rows)) == flatten_whitespace(R\"JSON(\n [\n {\n- \"Core\":\"[#6]1-[#6]-[#7]-[#6@]-1(-[!#1:1])-[#0:2]\",\n+ \"Core\":\"C1C[C@@]([*:1])([*:2])N1\",\n \"R1\":\"F[*:1]\",\n \"R2\":\"[H][*:2]\"\n },\n {\n- \"Core\":\"[#6]1-[#6]-[#7]-[#6@]-1(-[!#1:1])-[#0:2]\",\n+ \"Core\":\"C1C[C@@]([*:1])([*:2])N1\",\n \"R1\":\"O[*:1]\",\n \"R2\":\"F[*:2]\"\n },\n {\n- \"Core\":\"[#6]1-[#6]-[#7]-[#6@]-1(-[!#1:1])-[#0:2]\",\n+ \"Core\":\"C1C[C@@]([*:1])([*:2])N1\",\n \"R1\":\"[H][*:1]\",\n \"R2\":\"F[*:2]\"\n },\n {\n- \"Core\":\"[#6]1-[#6]-[#7]-[#6@]-1(-[!#1:1])-[#0:2]\",\n+ \"Core\":\"C1C[C@@]([*:1])([*:2])N1\",\n \"R1\":\"Cl[*:1]\",\n \"R2\":\"[H][*:2]\"\n }\n@@ -521,6 +524,7 @@ TEST_CASE(\"substructure parameters and RGD: enhanced stereo\") {\n RGroupRows rows;\n std::vector<unsigned> unmatched;\n RGroupDecompositionParameters params;\n+ params.allowMultipleRGroupsOnUnlabelled = true;\n params.substructmatchParams.useEnhancedStereo = true;\n {\n auto n = RGroupDecompose(cores, mols, rows, &unmatched, params);\n@@ -528,22 +532,22 @@ TEST_CASE(\"substructure parameters and RGD: enhanced stereo\") {\n CHECK(rows.size() == n);\n CHECK(unmatched.size() == mols.size() - n);\n // std::cerr << toJSON(rows) << std::endl;\n- // the core output here is SMARTS because the CXSMILES parser replaces the\n- // dummy atom with a query\n+ // the core output no longer is SMARTS as the core output is the portion\n+ // of the target that matches the core query.\n CHECK(flatten_whitespace(toJSON(rows)) == flatten_whitespace(R\"JSON(\n [\n {\n- \"Core\":\"[#6]1-[#6]-[#7]-[#6@]-1(-[!#1:1])-[#0:2]\",\n+ \"Core\":\"C1C[C@@]([*:1])([*:2])N1\",\n \"R1\":\"F[*:1]\",\n \"R2\":\"[H][*:2]\"\n },\n {\n- \"Core\":\"[#6]1-[#6]-[#7]-[#6@]-1(-[!#1:1])-[#0:2]\",\n+ \"Core\":\"C1C[C@]([*:1])([*:2])N1\",\n \"R1\":\"F[*:1]\",\n \"R2\":\"O[*:2]\"\n },\n {\n- \"Core\":\"[#6]1-[#6]-[#7]-[#6@]-1(-[!#1:1])-[#0:2]\",\n+ \"Core\":\"C1C[C@]([*:1])([*:2])N1\",\n \"R1\":\"F[*:1]\",\n \"R2\":\"[H][*:2]\"\n }\n@@ -556,27 +560,27 @@ TEST_CASE(\"substructure parameters and RGD: enhanced stereo\") {\n CHECK(rows.size() == n);\n CHECK(unmatched.size() == 1);\n // std::cerr << toJSON(rows) << std::endl;\n- // the core output here is SMARTS because the CXSMILES parser replaces the\n- // dummy atom with a query\n+ // the core output no longer is SMARTS as the core output is the portion\n+ // of the target that matches the core query.\n CHECK(flatten_whitespace(toJSON(rows)) == flatten_whitespace(R\"JSON(\n [\n {\n- \"Core\":\"[#6]1-[#6]-[#7]-[#6@]-1(-[!#1:1])-[#0:2]\",\n+ \"Core\":\"C1C[C@@]([*:1])([*:2])N1\",\n \"R1\":\"F[*:1]\",\n \"R2\":\"[H][*:2]\"\n },\n {\n- \"Core\":\"[#6]1-[#6]-[#7]-[#6@]-1(-[!#1:1])-[#0:2]\",\n+ \"Core\":\"C1C[C@]([*:1])([*:2])N1\",\n \"R1\":\"F[*:1]\",\n \"R2\":\"O[*:2]\"\n },\n {\n- \"Core\":\"[#6]1-[#6]-[#7]-[#6@]-1(-[!#1:1])-[#0:2]\",\n+ \"Core\":\"C1C[C@]([*:1])([*:2])N1\",\n \"R1\":\"F[*:1]\",\n \"R2\":\"[H][*:2]\"\n },\n {\n- \"Core\":\"[#6]1-[#6]-[#7]-[#6@]-1(-[!#1:1])-[#0:2]\",\n+ \"Core\":\"C1C[C@@]([*:1])([*:2])N1\",\n \"R1\":\"Cl[*:1]\",\n \"R2\":\"[H][*:2]\"\n }\n@@ -615,6 +619,7 @@ TEST_CASE(\"rgroupLabelling\") {\n std::vector<unsigned> unmatched;\n RGroupDecompositionParameters params;\n params.rgroupLabelling = RGroupLabelling::Isotope;\n+ params.allowMultipleRGroupsOnUnlabelled = true;\n {\n auto n = RGroupDecompose(cores, mols, rows, &unmatched, params);\n CHECK(n == mols.size());\n@@ -623,17 +628,17 @@ TEST_CASE(\"rgroupLabelling\") {\n CHECK(flatten_whitespace(toJSON(rows)) == flatten_whitespace(R\"JSON(\n [\n {\n- \"Core\":\"[1*]C1([2*])CCN1\",\n+ \"Core\": \"[1*][C@@]1([2*])CCN1\",\n \"R1\":\"[1*]F\",\n \"R2\":\"[2*][H]\"\n },\n {\n- \"Core\":\"[1*]C1([2*])CCN1\",\n+ \"Core\": \"[1*][C@]1([2*])CCN1\",\n \"R1\":\"[1*]F\",\n \"R2\":\"[2*]O\"\n },\n {\n- \"Core\":\"[1*]C1([2*])CCN1\",\n+ \"Core\":\"[1*][C@]1([2*])CCN1\",\n \"R1\":\"[1*]F\",\n \"R2\":\"[2*][H]\"\n },\n@@ -651,12 +656,16 @@ TEST_CASE(\"rgroupLabelling\") {\n std::vector<unsigned> unmatched;\n RGroupDecompositionParameters params;\n params.rgroupLabelling = RGroupLabelling::MDLRGroup;\n+ params.allowMultipleRGroupsOnUnlabelled = true;\n {\n auto n = RGroupDecompose(cores, mols, rows, &unmatched, params);\n CHECK(n == mols.size());\n CHECK(rows.size() == n);\n CHECK(unmatched.empty());\n // in this case the labels don't show up in the output SMILES\n+ // Presumably the dummy atoms are no longer distinguishable without\n+ // the isotope labels as the smiles no longer contains chiralty.\n+ // Chirality is present in the core SMARTS\n CHECK(flatten_whitespace(toJSON(rows)) == flatten_whitespace(R\"JSON(\n [\n {\n@@ -687,6 +696,7 @@ TEST_CASE(\"rgroupLabelling\") {\n RGroupRows rows;\n std::vector<unsigned> unmatched;\n RGroupDecompositionParameters params;\n+ params.allowMultipleRGroupsOnUnlabelled = true;\n params.rgroupLabelling =\n RGroupLabelling::Isotope | RGroupLabelling::AtomMap;\n {\n@@ -698,17 +708,17 @@ TEST_CASE(\"rgroupLabelling\") {\n \n [\n {\n- \"Core\":\"C1CC([1*:1])([2*:2])N1\",\n+ \"Core\":\"C1C[C@@]([1*:1])([2*:2])N1\",\n \"R1\":\"F[1*:1]\",\n \"R2\":\"[H][2*:2]\"\n },\n {\n- \"Core\":\"C1CC([1*:1])([2*:2])N1\",\n+ \"Core\":\"C1C[C@]([1*:1])([2*:2])N1\",\n \"R1\":\"F[1*:1]\",\n \"R2\":\"O[2*:2]\"\n },\n {\n- \"Core\":\"C1CC([1*:1])([2*:2])N1\",\n+ \"Core\":\"C1C[C@]([1*:1])([2*:2])N1\",\n \"R1\":\"F[1*:1]\",\n \"R2\":\"[H][2*:2]\"\n },\n"}, "test": {"test_patch": "diff --git a/Code/GraphMol/ChemTransforms/catch_tests.cpp b/Code/GraphMol/ChemTransforms/catch_tests.cpp\nindex 1fff4ad1743..c5b494325d1 100644\n--- a/Code/GraphMol/ChemTransforms/catch_tests.cpp\n+++ b/Code/GraphMol/ChemTransforms/catch_tests.cpp\n@@ -503,3 +503,12 @@ TEST_CASE(\n CHECK(caught);\n }\n }\n+\n+TEST_CASE(\"ReplaceCore handles chiral center with multiple bonds from core to chiral center\", \"[]\") {\n+ auto structure = \"C1CSCN[C@@]12(NCCCO2)\"_smiles;\n+ auto core = \"NCSCC\"_smarts;\n+ std::unique_ptr<ROMol> res{replaceCore(*structure, *core, true, true)};\n+ REQUIRE(res);\n+ auto resultSmiles = MolToSmiles(*res);\n+ REQUIRE(resultSmiles == \"*[C@]1([4*])NCCCO1\");\n+}\n\\ No newline at end of file\ndiff --git a/Code/GraphMol/RGroupDecomposition/testRGroupDecomp.cpp b/Code/GraphMol/RGroupDecomposition/testRGroupDecomp.cpp\nindex 391d470530f..258c805b093 100644\n--- a/Code/GraphMol/RGroupDecomposition/testRGroupDecomp.cpp\n+++ b/Code/GraphMol/RGroupDecomposition/testRGroupDecomp.cpp\n@@ -74,7 +74,7 @@ void CHECK_RGROUP(RGroupRows::const_iterator &it, const std::string &expected,\n res = std::unique_ptr<ROMol>(new ROMol(*rgroups->second.get()));\n }\n // rlabel:smiles\n- str << rgroups->first << \":\" << MolToSmiles(*rgroups->second.get(), true);\n+ str << rgroups->first << \":\" << MolToSmiles(*rgroups->second.get());\n }\n std::string result = str.str();\n \n@@ -978,6 +978,10 @@ M END\n decomp.process();\n RGroupRows rows = decomp.getRGroupsAsRows();\n \n+ /*\n+ * Working on issue Github5613 these core smiles for the 3rd target no\n+ * longer works, however the replacement is for the same core structure\n+ *\n const char *expected[4] = {\n \"Core:C1C([*:6])C2C(N([*:2])[*:4])NC([*:1])NC2N1[*:5] \"\n \"R1:[H][*:1] R2:C(CC[*:2])CC[*:4] R4:C(CC[*:2])CC[*:4] R5:[H][*:5] \"\n@@ -988,6 +992,17 @@ M END\n \"R1:[H][*:1] R2:C[*:2] R4:[H][*:4] R6:CC(C)[*:6]\",\n \"Core:C1C2C(C(N([*:2])[*:4])NC1[*:1])N([*:6])CN2[*:5] R1:O[*:1] \"\n \"R2:[H][*:2] R4:[H][*:4] R5:C[*:5] R6:[H][*:6]\"};\n+ */\n+ const char *expected[4] = {\n+ \"Core:C1C([*:6])C2C(N([*:2])[*:4])NC([*:1])NC2N1[*:5] \"\n+ \"R1:[H][*:1] R2:C(CC[*:2])CC[*:4] R4:C(CC[*:2])CC[*:4] R5:[H][*:5] \"\n+ \"R6:[H][*:6]\",\n+ \"Core:C1SC2NC([*:1])NC(N([*:2])[*:4])C2C1[*:6] \"\n+ \"R1:[H][*:1] R2:C[*:2] R4:[H][*:4] R6:CC(C)[*:6]\",\n+ \"Core:C1C2SCC([*:6])C2C(N([*:2])[*:4])NC1[*:1] \"\n+ \"R1:[H][*:1] R2:C[*:2] R4:[H][*:4] R6:CC(C)[*:6]\",\n+ \"Core:C1C2C(C(N([*:2])[*:4])NC1[*:1])N([*:6])CN2[*:5] R1:O[*:1] \"\n+ \"R2:[H][*:2] R4:[H][*:4] R5:C[*:5] R6:[H][*:6]\"};\n int i = 0;\n for (RGroupRows::const_iterator it = rows.begin(); it != rows.end();\n ++it, ++i) {\n@@ -3049,7 +3064,7 @@ void testGithub4505() {\n << \"********************************************************\\n\";\n BOOST_LOG(rdInfoLog) << \"Test GitHub 4505 is fixed\" << std::endl;\n {\n- // this is the first example from issue 5505- I have changed it so that the\n+ // this is the first example from issue 4505- I have changed it so that the\n // molecule is not an exact match to the core (if no sidechains are found\n // the decomposition fails)\n auto core = \"[n]1([*:1])cc([*:2])ccc1\"_smarts;\n@@ -3090,8 +3105,24 @@ void testGithub4505() {\n void testMultipleGroupsToUnlabelledCoreAtom() {\n BOOST_LOG(rdInfoLog)\n << \"********************************************************\\n\";\n- BOOST_LOG(rdInfoLog) << \"Test unlabelled core atom issues\" << std::endl;\n-\n+ BOOST_LOG(rdInfoLog) << \"Test unlabeled core atom issues\" << std::endl;\n+ {\n+ // Sulfonamide example\n+ auto core = \"[#6]-1-[#6]-[#6]-[#6]-[#7]-[#16]-1\"_smarts;\n+ auto mol = \"O=S1(=O)CCCCN1\"_smiles;\n+ RGroupDecompositionParameters params;\n+ params.allowMultipleRGroupsOnUnlabelled = true;\n+ RGroupDecomposition decomp(*core, params);\n+ auto result = decomp.add(*mol);\n+ TEST_ASSERT(result == 0)\n+ decomp.process();\n+ RGroupRows rows = decomp.getRGroupsAsRows();\n+ TEST_ASSERT(rows.size() == 1)\n+ auto row = rows[0];\n+ std::string expected(\"Core:C1CCS(=[*:1])(=[*:2])NC1 R1:O=[*:1] R2:O=[*:2]\");\n+ RGroupRows::const_iterator it = rows.begin();\n+ CHECK_RGROUP(it, expected);\n+ }\n {\n // Smiles/smarts version of github 5573\n auto core = \"[#6]-[#8]-[#6]-1-[#6]-[#6]-[#6]-[#6]-[#7]-1\"_smarts;\n@@ -3111,9 +3142,10 @@ void testMultipleGroupsToUnlabelledCoreAtom() {\n }\n {\n // Check that sidechains cluster properly\n- auto core = \"[#6]-[#8]-[#6]-1-[#7]-[#6]-[#6]-[#6]-[*]-1\"_smarts;\n- std::vector<std::string> smilesVec{\"COC1CCC(C)(C)CN1\", \"COC1NCC(C)(C)CO1\",\n- \"COC1NCC(C)(C)CN1\"};\n+ auto core = \"[#6]-[#8]-[#6]-1-[#6]-[#6]-[#6]-[#6]-[#7]-1\"_smarts;\n+ std::vector<std::string> smilesVec{\n+ \"COC1CCC(C)(C)CN1\", \"COC1CCC(CC)(C)CN1\", \"COC1CCC(C)(COC)CN1\",\n+ \"COC1CCC(C)(OC)CN1\", \"COC1CCC(CCC)(C)CN1\"};\n RGroupDecompositionParameters params;\n params.allowMultipleRGroupsOnUnlabelled = true;\n params.matchingStrategy = Exhaustive;\n@@ -3123,13 +3155,16 @@ void testMultipleGroupsToUnlabelledCoreAtom() {\n auto mol = SmilesToMol(smiles);\n auto result = decomp.add(*mol);\n TEST_ASSERT(result > -1);\n+ delete mol;\n }\n decomp.process();\n auto rows = decomp.getRGroupsAsRows();\n std::vector<std::string> expected{\n \"Core:COC1CCC([*:1])([*:2])CN1 R1:C[*:1] R2:C[*:2]\",\n- \"Core:COC1NCC([*:1])([*:2])CO1 R1:C[*:1] R2:C[*:2]\",\n- \"Core:COC1NCC([*:1])([*:2])CN1 R1:C[*:1] R2:C[*:2]\"};\n+ \"Core:COC1CCC([*:1])([*:2])CN1 R1:CC[*:1] R2:C[*:2]\",\n+ \"Core:COC1CCC([*:1])([*:2])CN1 R1:COC[*:1] R2:C[*:2]\",\n+ \"Core:COC1CCC([*:1])([*:2])CN1 R1:CO[*:1] R2:C[*:2]\",\n+ \"Core:COC1CCC([*:1])([*:2])CN1 R1:CCC[*:1] R2:C[*:2]\"};\n TEST_ASSERT(rows.size() == expected.size());\n int i = 0;\n for (auto row = rows.cbegin(); row != rows.cend(); ++row, ++i) {\n@@ -3181,6 +3216,7 @@ void testMultipleGroupsToUnlabelledCoreAtom() {\n auto mol = SmilesToMol(smiles);\n auto result = decomp.add(*mol);\n TEST_ASSERT(result > -1);\n+ delete mol;\n }\n decomp.process();\n auto rows = decomp.getRGroupsAsRows();\n@@ -3196,6 +3232,70 @@ void testMultipleGroupsToUnlabelledCoreAtom() {\n }\n }\n \n+void testGithub5613() {\n+ {\n+ // Original issue from 5613\n+ auto core = \"[*:1]C(=O)NC1CCN([*:3])C1\"_smarts;\n+ auto mol =\n+ \"Cc1c(c(c([nH]1)C(=O)N[C@H]2CCN(C2)c3cc(nc(n3)Cl)C(=O)O)Cl)Cl\"_smiles;\n+ RGroupDecompositionParameters params;\n+ params.allowMultipleRGroupsOnUnlabelled = false;\n+ RGroupDecomposition decomp(*core, params);\n+ auto result = decomp.add(*mol);\n+ TEST_ASSERT(result == 0)\n+ decomp.process();\n+ RGroupRows rows = decomp.getRGroupsAsRows();\n+ TEST_ASSERT(rows.size() == 1)\n+ auto row = rows[0];\n+ std::string expected(\n+ \"Core:O=C(N[C@H]1CCN([*:3])C1)[*:1] \"\n+ \"R1:Cc1[nH]c([*:1])c(Cl)c1Cl \"\n+ \"R3:O=C(O)c1cc([*:3])nc(Cl)n1\");\n+ RGroupRows::const_iterator it = rows.begin();\n+ CHECK_RGROUP(it, expected);\n+ }\n+ {\n+ auto core = \"[1*]C(=O)*C1~C~C~*([3*])~*~C~1[2*]\"_smarts;\n+ auto mol =\n+ \"CO[C@H]1CN(c2nc(-c3cnc(OCCN4CCN(C)CC4)cn3)c(C(=O)O)s2)CC[C@H]1NC(=O)c1[nH]c(C)c(Cl)c1Cl\"_smiles;\n+ RGroupDecompositionParameters params;\n+ params.allowMultipleRGroupsOnUnlabelled = false;\n+ RGroupDecomposition decomp(*core, params);\n+ auto result = decomp.add(*mol);\n+ TEST_ASSERT(result == 0)\n+ decomp.process();\n+ RGroupRows rows = decomp.getRGroupsAsRows();\n+ TEST_ASSERT(rows.size() == 1)\n+ auto row = rows[0];\n+ std::string expected(\n+ \"Core:O=C(N[C@@H]1CCN([*:3])C[C@@H]1[*:2])[*:1] \"\n+ \"R1:Cc1[nH]c([*:1])c(Cl)c1Cl R2:CO[*:2] \"\n+ \"R3:CN1CCN(CCOc2cnc(-c3nc([*:3])sc3C(=O)O)cn2)CC1\");\n+ RGroupRows::const_iterator it = rows.begin();\n+ CHECK_RGROUP(it, expected);\n+ }\n+ {\n+ auto core = \"C(=O)*C1~C~C~*~*~C~1\"_smarts;\n+ auto mol =\n+ \"CO[C@H]1CN(c2nc(-c3cnc(OCCN4CCN(C)CC4)cn3)c(C(=O)O)s2)CC[C@H]1NC(=O)c1[nH]c(C)c(Cl)c1Cl\"_smiles;\n+ RGroupDecompositionParameters params;\n+ params.allowMultipleRGroupsOnUnlabelled = true;\n+ RGroupDecomposition decomp(*core, params);\n+ auto result = decomp.add(*mol);\n+ TEST_ASSERT(result == 0)\n+ decomp.process();\n+ RGroupRows rows = decomp.getRGroupsAsRows();\n+ TEST_ASSERT(rows.size() == 1)\n+ auto row = rows[0];\n+ std::string expected(\n+ \"Core:O=C(N[C@@H]1CCN([*:1])C[C@@H]1[*:2])[*:3] \"\n+ \"R1:CN1CCN(CCOc2cnc(-c3nc([*:1])sc3C(=O)O)cn2)CC1 \"\n+ \"R2:CO[*:2] R3:Cc1[nH]c([*:3])c(Cl)c1Cl\");\n+ RGroupRows::const_iterator it = rows.begin();\n+ CHECK_RGROUP(it, expected);\n+ }\n+}\n+\n void testGitHub5631() {\n BOOST_LOG(rdInfoLog)\n << \"********************************************************\\n\";\n@@ -3436,13 +3536,94 @@ M END\n auto dummy = *match;\n auto &conf = coreRgd->getConformer();\n auto &dummyPoint = conf.getAtomPos(dummy->getIdx());\n- // R2 dummy should be over input chiral oxygen, which is first oxygen of degree 2 in input mol block\n+ // R2 dummy should be over input chiral oxygen, which is first oxygen of\n+ // degree 2 in input mol block\n auto &inputPoint = mol2->getConformer(0).getAtomPos(15);\n TEST_ASSERT(abs(dummyPoint.x - inputPoint.x) < 0.05);\n TEST_ASSERT(abs(dummyPoint.y - inputPoint.y) < 0.05);\n }\n }\n \n+void testRGroupCoordinatesAddedToCore() {\n+ BOOST_LOG(rdInfoLog)\n+ << \"********************************************************\\n\";\n+ BOOST_LOG(rdInfoLog)\n+ << \"Test that cordinates for R groups are properly added to core when the core has coordinates and the target does not\"\n+ << std::endl;\n+ auto core = R\"CTAB(ACS Document 1996\n+ ChemDraw05202112262D\n+\n+ 17 17 0 0 0 0 0 0 0 0999 V2000\n+ 1.9511 0.6607 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0\n+ 1.2362 1.0726 0.0000 S 0 0 0 0 0 0 0 0 0 0 0 0\n+ 0.5214 1.4844 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0\n+ 0.8244 0.3577 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\n+ 1.2375 -0.3563 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\n+ 0.8256 -1.0712 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\n+ 0.0006 -1.0719 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\n+ -0.4113 -1.7868 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0\n+ -0.4125 -0.3578 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\n+ -0.0006 0.3570 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\n+ -1.2375 -0.3585 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\n+ -2.0625 -0.3592 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0\n+ 1.6481 1.7875 0.0000 R1 0 0 0 0 0 0 0 0 0 0 0 0\n+ 1.2387 -1.7853 0.0000 R2 0 0 0 0 0 0 0 0 0 0 0 0\n+ -1.2363 -1.7875 0.0000 R3 0 0 0 0 0 0 0 0 0 0 0 0\n+ -0.4137 1.0711 0.0000 H 0 0 0 0 0 0 0 0 0 0 0 0\n+ 2.0625 -0.3556 0.0000 H 0 0 0 0 0 0 0 0 0 0 0 0\n+ 1 2 2 0\n+ 2 3 2 0\n+ 2 4 1 0\n+ 4 10 1 0\n+ 4 5 2 0\n+ 5 6 1 0\n+ 6 7 2 0\n+ 7 8 1 0\n+ 7 9 1 0\n+ 9 10 2 0\n+ 9 11 1 0\n+ 11 12 3 0\n+ 2 13 1 0\n+ 6 14 1 0\n+ 8 15 1 0\n+ 10 16 1 0\n+ 5 17 1 0\n+M END\n+)CTAB\"_ctab;\n+ auto mol =\n+ \"Brc1cc(Br)c(Oc2ccc(cc2C#N)S(=O)(=O)Nc3ncc(Br)s3)c(c1)c4ccccc4\"_smiles;\n+ RGroupDecompositionParameters params;\n+ params.matchingStrategy = GreedyChunks;\n+ params.allowMultipleRGroupsOnUnlabelled = false;\n+ params.onlyMatchAtRGroups = false;\n+ RGroupDecomposition decomp(*core, params);\n+ auto result = decomp.add(*mol);\n+ TEST_ASSERT(result == 0);\n+ decomp.process();\n+ RGroupRows rows = decomp.getRGroupsAsRows();\n+ auto coreRgd = rows[0][\"Core\"];\n+ auto numberGroups = 0;\n+ for (const auto atom : coreRgd->atoms()) {\n+ if (int rGroupNum = atom->getAtomMapNum(); rGroupNum > 0) {\n+ auto coreAtoms = core->atoms();\n+ auto originalAtom = std::find_if(\n+ coreAtoms.begin(), coreAtoms.end(), [rGroupNum](const auto &a) {\n+ return static_cast<int>(a->getIsotope()) == rGroupNum;\n+ });\n+ TEST_ASSERT(originalAtom != coreAtoms.end());\n+ const auto &originalPoint =\n+ core->getConformer(0).getAtomPos((*originalAtom)->getIdx());\n+ const auto &outputPoint =\n+ coreRgd->getConformer(0).getAtomPos(atom->getIdx());\n+ TEST_ASSERT(originalPoint.x == outputPoint.x);\n+ TEST_ASSERT(originalPoint.y == outputPoint.y);\n+ TEST_ASSERT(originalPoint.z == outputPoint.z);\n+ numberGroups++;\n+ }\n+ }\n+ TEST_ASSERT(numberGroups == 2);\n+}\n+\n int main() {\n RDLog::InitLogs();\n boost::logging::disable_logs(\"rdApp.debug\");\n@@ -3501,6 +3682,8 @@ int main() {\n testMultipleGroupsToUnlabelledCoreAtomGithub5573();\n testMultipleGroupsToUnlabelledCoreAtom();\n testGitHub5631();\n+ testGithub5613();\n+ testRGroupCoordinatesAddedToCore();\n BOOST_LOG(rdInfoLog)\n << \"********************************************************\\n\";\n return 0;\n", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}216{"question_id": "MSB_rdkit_rdkit_pr5737", "question_type": "multi_swe_bench", "description": "Fix hybridization of atoms with dative bonds (rdkit/rdkit#5737)", "content": {"org": "rdkit", "repo": "rdkit", "pr_number": 5737, "issue_title": "Fix hybridization of atoms with dative bonds", "issue_body": "<!--\r\nThanks for contributing a pull request! \r\n-->\r\n#### Reference Issue\r\n<!-- Example: Fixes #1234 -->\r\nFixes #5736\r\n\r\n\r\n#### What does this implement/fix? Explain your changes.\r\nThe hybridization of atoms from which dative bonds start is calculated wrong. Electrons are double-counted, once in `numRadicals` or `numLonePairs` and again as part of a dative bond in `deg`.\r\nHere, I try to account for that, removing 2 radicals or one lone pair if a dative bond starts at this atom.\r\n\r\n\r\n#### Any other comments?\r\nThis is probably not nice code, I have no experience with C++ so any feedback is welcome.\r\n", "base_commit": "739b417dfe3826ad6ad02b5d812459804684bc30", "resolved_issues": [{"number": 5736, "title": "Wrong hybridization of atoms with dative bonds", "body": "**Describe the bug**\r\nThe hybridization of atoms from which a dative bond starts is wrong. When calculating `numBondsPlusLonePairs` (in `ConjugHybrid.cpp`) electrons are double counted, once in `numRadicals` or `numLonePairs` and also as part of a dative bond in `deg`.\r\nThis leads to a hybridization which is 'too high'.\r\n\r\n**To Reproduce**\r\nSteps to reproduce the behavior, feel free to paste a bit of Python in here.\r\n\r\n```python\r\nmol1 = Chem.MolFromSmiles('N1(C)C=CN(C)[C]1->[Pd@SP2]<-[C]1N(C)C=CN(C)1')\r\n# carbene atomidx 6 and 8\r\nprint(mol1.GetAtomWithIdx(6).GetHybridization())\r\n# >> SP3D\r\n```\r\nand\r\n```python\r\nmol2 = Chem.MolFromSmiles('P(F)(F)(F)->[Pd@SP2]<-P(F)(F)F')\r\n# phosphine atomidx 0 and 5\r\nprint(mol2.GetAtomWithIdx(0).GetHybridization())\r\n# >> SP3D\r\n```\r\n\r\n\r\n**Expected behavior**\r\nA clear and concise description of what you expected to happen.\r\n\r\nFor the carbene atoms in `mol1` I would expect `SP2` hybridization, for the phosphor atom of the phosphine in `mol2` I would expect `SP3` hybridization.\r\n\r\n**Screenshots**\r\nIf applicable, add screenshots to help explain your problem.\r\n\r\n**Configuration (please complete the following information):**\r\n - RDKit version: 2022.09.1\r\n - OS: Ubuntu 22.04\r\n - Python version (if relevant): 3.9\r\n - Are you using conda? Yes\r\n - If you are using conda, which channel did you install the rdkit from? \r\n - If you are not using conda: how did you install the RDKit?\r\n\r\n**Additional context**\r\nAdd any other context about the problem here.\r\n"}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/rdkit_m_rdkit:pr-5737", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/Code/GraphMol/ConjugHybrid.cpp b/Code/GraphMol/ConjugHybrid.cpp\nindex 7aa63ee4ecf..cee241bca7b 100644\n--- a/Code/GraphMol/ConjugHybrid.cpp\n+++ b/Code/GraphMol/ConjugHybrid.cpp\n@@ -71,6 +71,22 @@ void markConjAtomBonds(Atom *at) {\n }\n }\n \n+int countAtomStartsDativeBond(const Atom *at) {\n+ // counts number of dative bonds starting from Atom\n+ PRECONDITION(at, \"bad atom\");\n+ long count = 0;\n+ auto &mol = at->getOwningMol();\n+ for (const auto &nbri : boost::make_iterator_range(mol.getAtomBonds(at))) {\n+ auto bnd = mol[nbri];\n+ if (bnd->getBondType() == 17) {\n+ if (bnd->getBeginAtom() == at) {\n+ count += 1;\n+ }\n+ }\n+ }\n+ return count;\n+}\n+\n int numBondsPlusLonePairs(Atom *at) {\n PRECONDITION(at, \"bad atom\");\n int deg = at->getTotalDegree();\n@@ -96,9 +112,25 @@ int numBondsPlusLonePairs(Atom *at) {\n // about radicals:\n int numRadicals = at->getNumRadicalElectrons();\n int numLonePairs = (numFreeElectrons - numRadicals) / 2;\n+ // correct for electrons in dative bond\n+ int ndative = countAtomStartsDativeBond(at);\n+ assert(ndative <= (numLonePairs + 2 * numRadicals));\n+ for (int i = 1; i <= ndative; ++i) {\n+ if (numRadicals >= 2) {\n+ numRadicals -= 2;\n+ } else {\n+ numLonePairs -= 1;\n+ }\n+ }\n return deg + numLonePairs + numRadicals;\n } else {\n int numLonePairs = numFreeElectrons / 2;\n+ // correct for electrons in dative bond\n+ assert(ndative <= (numLonePairs + 2 * numRadicals));\n+ int ndative = countAtomStartsDativeBond(at);\n+ for (int i = 1; i <= ndative; ++i) {\n+ numLonePairs -= 1;\n+ }\n return deg + numLonePairs;\n }\n }\n"}, "test": {"test_patch": "diff --git a/Code/GraphMol/MolDraw2D/catch_tests.cpp b/Code/GraphMol/MolDraw2D/catch_tests.cpp\nindex 3f190dfffbd..9ac4fa42f69 100644\n--- a/Code/GraphMol/MolDraw2D/catch_tests.cpp\n+++ b/Code/GraphMol/MolDraw2D/catch_tests.cpp\n@@ -658,7 +658,7 @@ TEST_CASE(\"dative bonds\", \"[drawing][organometallics]\") {\n outs.close();\n check_file_hash(\"testDativeBonds_1.svg\");\n \n- CHECK(text.find(\"d='M 122.5,88.4 L 85.6,88.4' \"\n+ CHECK(text.find(\"d='M 77.7,88.0 L 113.4,88.0' \"\n \"style='fill:none;fill-rule:evenodd;stroke:#0000FF\") !=\n std::string::npos);\n }\ndiff --git a/Code/GraphMol/molopstest.cpp b/Code/GraphMol/molopstest.cpp\nindex deea45d33c9..8b4aa7a2ba8 100644\n--- a/Code/GraphMol/molopstest.cpp\n+++ b/Code/GraphMol/molopstest.cpp\n@@ -3342,6 +3342,24 @@ void testHybridization() {\n delete m;\n }\n \n+ {\n+ RWMol *m;\n+ std::string smi = \"[Pd]<-[C]1N(C)CCN(C)1\";\n+ m = SmilesToMol(smi);\n+ TEST_ASSERT(m);\n+ TEST_ASSERT(m->getAtomWithIdx(1)->getHybridization() == Atom::SP2);\n+ delete m;\n+ }\n+\n+ {\n+ RWMol *m;\n+ std::string smi = \"[Pd]<-P\";\n+ m = SmilesToMol(smi);\n+ TEST_ASSERT(m);\n+ TEST_ASSERT(m->getAtomWithIdx(1)->getHybridization() == Atom::SP3);\n+ delete m;\n+ }\n+\n BOOST_LOG(rdInfoLog) << \"Finished\" << std::endl;\n }\n \n", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}217{"question_id": "MSB_rdkit_rdkit_pr5998", "question_type": "multi_swe_bench", "description": "Fix disconnection of magnesium acetate in covalent form. (rdkit/rdkit#5998)", "content": {"org": "rdkit", "repo": "rdkit", "pr_number": 5998, "issue_title": "Fix disconnection of magnesium acetate in covalent form.", "issue_body": "\r\n#### Reference Issue\r\nFixes #5997\r\n\r\n\r\n#### What does this implement/fix? Explain your changes.\r\nSkips valence of -1 in metal valence list when patching charges after disconnection.\r\n\r\n#### Any other comments?\r\n\r\n", "base_commit": "c1524c3ef01990345e38c000e73ce65964ffb8d2", "resolved_issues": [{"number": 5997, "title": "Incorrect disconnection of CC(=O)O[Mg]OC(=O)C", "body": "**Describe the bug**\r\nThe metal disconnector gives CC(=O)[O-].CC(=O)[O-].[MgH2] when disconnecting CC(=O)O[Mg]OC(=O)C\r\n\r\n**To Reproduce**\r\n```\r\nfrom rdkit import Chem\r\nfrom rdkit.Chem.MolStandardize import rdMolStandardize\r\n\r\nmol = Chem.MolFromSmiles(\"CC(=O)O[Mg]OC(=O)C\")\r\nmd = rdMolStandardize.MetalDisconnector()\r\nnm = md.Disconnect(mol)\r\nprint(Chem.MolToSmiles(nm))\r\n```\r\n**Expected behaviour**\r\nI expected to get CC(=O)[O-].CC(=O)[O-].[Mg+2]\r\n\r\n**Configuration (please complete the following information):**\r\n - RDKit version: 2022.09.4\r\n - OS: macOS Monterey 12.6.2 M1 chip\r\n - Python version (if relevant): 3.10.8\r\n - Are you using conda? mamba\r\n - If you are using conda, which channel did you install the rdkit from? conda-forge\r\n - If you are not using conda: how did you install the RDKit? I also see this when I build from the master branch.\r\n\r\n**Additional context**\r\n I think it is because the allowed valence of -1 (any valence) was recently added to Mg's valence list to accommodate Grignard\r\nreagents expressed in the form [CH3-]->[Mg+2]<-[Cl-].\r\nThe Ba analogue of the original input structure gives an analogous erroneous disconnected structure and also has -1 in its valence list.\r\nI will work on a fix.\r\n\r\n"}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/rdkit_m_rdkit:pr-5998", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/Code/GraphMol/MolStandardize/Metal.cpp b/Code/GraphMol/MolStandardize/Metal.cpp\nindex d3e2e7ee96b..974ef4f3220 100644\n--- a/Code/GraphMol/MolStandardize/Metal.cpp\n+++ b/Code/GraphMol/MolStandardize/Metal.cpp\n@@ -21,10 +21,10 @@ using namespace std;\n using namespace RDKit;\n namespace RDKit {\n class RWMol;\n+\n class ROMol;\n \n namespace MolStandardize {\n-\n MetalDisconnector::MetalDisconnector()\n : metal_nof(\n SmartsToMol(\"[Li,Na,K,Rb,Cs,Fr,Be,Mg,Ca,Sr,Ba,Ra,Sc,Ti,V,Cr,Mn,Fe,Co,\"\n@@ -181,6 +181,13 @@ void MetalDisconnector::disconnect(RWMol &mol) {\n auto currentFc = a->getFormalCharge();\n const auto &valens =\n PeriodicTable::getTable()->getValenceList(a->getAtomicNum());\n+ // valens should have at least -1 in it, as the atom data is currently\n+ // configured, so max_element should never return valens.end().\n+ auto max_valence = *std::max_element(valens.begin(), valens.end());\n+ // Don't go over the maximum real valence.\n+ if (max_valence != -1 && currentFc >= max_valence) {\n+ continue;\n+ }\n int fcAfterCut = it->second;\n if (currentFc > 0) {\n // if the original formal charge on the metal was positive, we trust it\n@@ -189,6 +196,11 @@ void MetalDisconnector::disconnect(RWMol &mol) {\n }\n if (!valens.empty() && valens.front() != -1) {\n for (auto v = valens.begin(); v != valens.end(); ++v) {\n+ // Some metals (e.g. Mg and Ba) have -1 as a final catchall, which\n+ // is unhelpful for this.\n+ if (*v == -1) {\n+ continue;\n+ }\n if (fcAfterCut > *v) {\n auto next = v + 1;\n if (next != valens.end() && fcAfterCut >= *v) {\n@@ -211,6 +223,5 @@ void MetalDisconnector::disconnect(RWMol &mol) {\n a->updatePropertyCache();\n }\n }\n-\n } // namespace MolStandardize\n } // namespace RDKit\n"}, "test": {"test_patch": "diff --git a/Code/GraphMol/MolStandardize/test1.cpp b/Code/GraphMol/MolStandardize/test1.cpp\nindex de8a9a9d32a..445480ff43b 100644\n--- a/Code/GraphMol/MolStandardize/test1.cpp\n+++ b/Code/GraphMol/MolStandardize/test1.cpp\n@@ -33,6 +33,12 @@ void testCleanup() {\n RWMOL_SPTR res(MolStandardize::cleanup(*m, params));\n TEST_ASSERT(MolToSmiles(*res) == \"CCC(=O)[O-].[Na+]\");\n }\n+ {\n+ // Github 5997\n+ auto m = \"CC(=O)O[Mg]OC(=O)C\"_smiles;\n+ auto res(MolStandardize::cleanup(*m, params));\n+ TEST_ASSERT(MolToSmiles(*res) == \"CC(=O)[O-].CC(=O)[O-].[Mg+2]\");\n+ }\n \n // Test metal ion is untouched during standardize.\n {\n@@ -108,6 +114,13 @@ void testMetalDisconnector() {\n \n MolStandardize::MetalDisconnector md;\n unsigned int failedOp;\n+ {\n+ auto m(SmilesToMol(\"[O-]C(=O)C.[Mg+2][O-]C(=O)C\", 0, false));\n+ MolOps::sanitizeMol(*m, failedOp, MolOps::SANITIZE_CLEANUP);\n+ TEST_ASSERT(m);\n+ md.disconnect(*m);\n+ TEST_ASSERT(MolToSmiles(*m) == \"CC(=O)[O-].CC(=O)[O-].[Mg+2]\");\n+ }\n \n // testing overloaded function\n {\n@@ -181,6 +194,14 @@ void testMetalDisconnector() {\n md.disconnect(*m);\n TEST_ASSERT(MolToSmiles(*m) == \"CC(=O)[O-].[Na+]\");\n }\n+ // make sure that -1 as a valence is dealt with (Github 5997)\n+ {\n+ RWMOL_SPTR m(SmilesToMol(\"[O-]C(=O)C.[Mg+2][O-]C(=O)C\", 0, false));\n+ MolOps::sanitizeMol(*m, failedOp, MolOps::SANITIZE_CLEANUP);\n+ TEST_ASSERT(m);\n+ md.disconnect(*m);\n+ TEST_ASSERT(MolToSmiles(*m) == \"CC(=O)[O-].CC(=O)[O-].[Mg+2]\");\n+ }\n \n // test that badly specified dative bonds are perceived as such\n {\n", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}218{"question_id": "MSB_rdkit_rdkit_pr6051", "question_type": "multi_swe_bench", "description": "Add canonicalization of stereo groups (enhanced stereo) (rdkit/rdkit#6051)", "content": {"org": "rdkit", "repo": "rdkit", "pr_number": 6051, "issue_title": "Add canonicalization of stereo groups (enhanced stereo)", "issue_body": "# What's changed?\r\nIn previous releases the SMILES generated for molecules with stereo groups was not canonical: the information from the stereo groups was not taken into account when determining the atom ordering and there was no handling of the fact that `C[C@H](F)O |o1:1|` and `C[C@@H](F)O |o1:1|` are the same thing. This resolves that.\r\n\r\n# Changed results\r\nSMILES (and SMILES-derived things like some of the mol hashes) for molecules with stereo groups will now be different if canonicalization and isomeric SMILES are enabled (the default).\r\n\r\n# Questions for review\r\n- We could theoretically not do the canonicalization of stereogroups if we're just generating SMILES (instead of CXSMILES), but this would have the consequence that the SMILES part of a CXSMILES wouldn't match the SMILES for the molecule. That feels ugly and wrong to me.\r\n", "base_commit": "2b325812736e4d484367cb6f078d7a11a78b4f9e", "resolved_issues": [{"number": 6045, "title": "EnumerateStereoisomers should remove non-abs enhanced stereo from results", "body": "**Describe the bug**\r\n\r\n```\r\nIn [7]: m = Chem.MolFromSmiles('O[C@H](Br)[C@H](F)C |&1:1,3|')\r\n\r\nIn [8]: set(Chem.MolToCXSmiles(x) for x in EnumerateStereoisomers.EnumerateStereoisomers(m))\r\nOut[8]: {'C[C@@H](F)[C@H](O)Br |&1:1,3|', 'C[C@H](F)[C@@H](O)Br |&1:1,3|'}\r\n```\r\nGiven that one of the purposes of `EnumerateStereoisomers()` is to give all the individual stereoisomers which are described by a set of StereoGropus, I believe that the results should no longer have the enhanced stereo.\r\n\r\n**Configuration (please complete the following information):**\r\n - RDKit version: release and master\r\n - OS: all\r\n"}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/rdkit_m_rdkit:pr-6051", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/Code/GraphMol/Canon.cpp b/Code/GraphMol/Canon.cpp\nindex b1c665fe844..55a80ec73c6 100644\n--- a/Code/GraphMol/Canon.cpp\n+++ b/Code/GraphMol/Canon.cpp\n@@ -1187,6 +1187,7 @@ void canonicalizeFragment(ROMol &mol, int atomIdx,\n msI.obj.atom->getChiralTag() != Atom::CHI_UNSPECIFIED &&\n !msI.obj.atom->hasProp(common_properties::_brokenChirality)) {\n if (msI.obj.atom->hasProp(common_properties::_ringStereoAtoms)) {\n+ // FIX: handle stereogroups here too\n if (!ringStereoChemAdjusted[msI.obj.atom->getIdx()]) {\n msI.obj.atom->setChiralTag(Atom::CHI_TETRAHEDRAL_CCW);\n ringStereoChemAdjusted.set(msI.obj.atom->getIdx());\n@@ -1226,6 +1227,24 @@ void canonicalizeFragment(ROMol &mol, int atomIdx,\n ringStereoChemAdjusted.set(nbrIdx);\n }\n }\n+ } else if (size_t sgidx;\n+ msI.obj.atom->getPropIfPresent(\"_stereoGroup\", sgidx)) {\n+ // make sure that the reference atom in the stereogroup is CCW\n+ auto &sg = mol.getStereoGroups()[sgidx];\n+ bool swapIt =\n+ msI.obj.atom->getChiralTag() == Atom::CHI_TETRAHEDRAL_CW;\n+ if (swapIt) {\n+ msI.obj.atom->invertChirality();\n+ }\n+ if (swapIt || numSwapsChiralAtoms[msI.obj.atom->getIdx()]) {\n+ for (auto at : sg.getAtoms()) {\n+ if (at == msI.obj.atom) {\n+ continue;\n+ }\n+ at->invertChirality();\n+ }\n+ }\n+\n } else {\n if (msI.obj.atom->getChiralTag() == Atom::CHI_TETRAHEDRAL_CW ||\n msI.obj.atom->getChiralTag() == Atom::CHI_TETRAHEDRAL_CCW) {\n@@ -1255,5 +1274,71 @@ void canonicalizeFragment(ROMol &mol, int atomIdx,\n std::cerr<<\"----------------------------------------->\"<<std::endl;\n #endif\n }\n+void rankMolAtoms(const ROMol &mol, std::vector<unsigned int> &res,\n+ bool breakTies = true, bool includeChirality = true,\n+ bool includeIsotopes = true);\n+void canonicalizeEnhancedStereo(ROMol &mol,\n+ const std::vector<unsigned int> *atomRanks) {\n+ const auto &sgs = mol.getStereoGroups();\n+ if (sgs.empty()) {\n+ return;\n+ }\n+\n+ std::vector<unsigned int> lranks;\n+ if (!atomRanks) {\n+ bool breakTies = true;\n+ rankMolAtoms(mol, lranks, breakTies);\n+ atomRanks = &lranks;\n+ }\n+ // one thing that makes this all easier is that the stereogroups are\n+ // independent of each other\n+ std::vector<StereoGroup> newSgs;\n+ for (auto &sg : sgs) {\n+ // we don't do anything to ABS groups\n+ if (sg.getGroupType() == StereoGroupType::STEREO_ABSOLUTE) {\n+ newSgs.push_back(sg);\n+ continue;\n+ }\n+\n+ // sort the atoms by rank:\n+ auto getAtomRank = [&atomRanks](const Atom *at1, const Atom *at2) {\n+ return atomRanks->at(at1->getIdx()) < atomRanks->at(at2->getIdx());\n+ };\n+ auto sgAtoms = sg.getAtoms();\n+ std::sort(sgAtoms.begin(), sgAtoms.end(), getAtomRank);\n+ // find the reference (lowest-ranked) atom\n+ auto refAtom = sgAtoms.front();\n+\n+ // we will use CCW as the \"canonical\" state for chirality, so if the\n+ // referenceAtom is already CCW then we don't need to do anything more with\n+ // this stereogroup\n+ auto refState = Atom::ChiralType::CHI_TETRAHEDRAL_CCW;\n+#if 0\n+ INT_LIST nbrs;\n+ auto [beg, end] = mol.getAtomBonds(*refAtom);\n+ while (beg != end) {\n+ nbrs.push_back(mol[*beg++]->getIdx());\n+ }\n+ std::cerr << \"!!!! \" << (*refAtom)->getDegree() << \" \" << nbrs.size()\n+ << std::endl;\n+ // sort the neighbor indices by atom ranks\n+ nbrs.sort([&atomRanks](auto i, auto j) {\n+ return atomRanks->at(i) < atomRanks->at(j);\n+ });\n+ if ((*refAtom)->getPerturbationOrder(nbrs) % 1) {\n+ refState = Atom::ChiralType::CHI_TETRAHEDRAL_CW;\n+ }\n+#endif\n+ if (refAtom->getChiralTag() != refState) {\n+ // we need to flip everyone... so loop over the other atoms and flip them\n+ // all:\n+ std::for_each(sgAtoms.begin(), sgAtoms.end(),\n+ [](auto atom) { atom->invertChirality(); });\n+ }\n+ newSgs.emplace_back(StereoGroup(sg.getGroupType(), std::move(sgAtoms)));\n+ refAtom->setProp(\"_stereoGroup\", newSgs.size() - 1, true);\n+ }\n+ mol.setStereoGroups(newSgs);\n+}\n } // namespace Canon\n } // namespace RDKit\ndiff --git a/Code/GraphMol/Canon.h b/Code/GraphMol/Canon.h\nindex a51320fad86..5ec1ba50d21 100644\n--- a/Code/GraphMol/Canon.h\n+++ b/Code/GraphMol/Canon.h\n@@ -125,6 +125,17 @@ RDKIT_GRAPHMOL_EXPORT bool chiralAtomNeedsTagInversion(const RDKit::ROMol &mol,\n bool isAtomFirst,\n size_t numClosures);\n \n+//! Canonicalizes the atom stereo labels in enhanced stereo groups\n+/*!\n+\n+ For example, after calling this function the chiral centers in the\n+ molecules `C[C@H](F)Cl |&1:1|` and `C[C@@H](F)Cl |&1:1|` will have the same\n+ chiral tags.\n+\n+*/\n+RDKIT_GRAPHMOL_EXPORT void canonicalizeEnhancedStereo(\n+ ROMol &mol, const std::vector<unsigned int> *atomRanks = nullptr);\n+\n } // end of namespace Canon\n } // end of namespace RDKit\n #endif\ndiff --git a/Code/GraphMol/FileParsers/cdxml_parser_catch.cpp b/Code/GraphMol/FileParsers/cdxml_parser_catch.cpp\nindex e4f108ae2e0..ea1c930661b 100644\n--- a/Code/GraphMol/FileParsers/cdxml_parser_catch.cpp\n+++ b/Code/GraphMol/FileParsers/cdxml_parser_catch.cpp\n@@ -411,9 +411,9 @@ TEST_CASE(\"CDXML\") {\n SECTION(\"Enhanced Stereo\") {\n auto fname = cdxmlbase + \"beta-cypermethrin.cdxml\";\n std::vector<std::string> expected = {\n- \"CC1(C)[C@H](C=C(Cl)Cl)[C@H]1C(=O)O[C@@H](C#N)c1cccc(Oc2ccccc2)c1\"};\n+ \"CC1(C)[C@H](C=C(Cl)Cl)[C@@H]1C(=O)O[C@H](C#N)c1cccc(Oc2ccccc2)c1\"};\n std::vector<std::string> expected_cx = {\n- \"CC1(C)[C@H](C=C(Cl)Cl)[C@H]1C(=O)O[C@@H](C#N)c1cccc(Oc2ccccc2)c1 |&1:3,&2:8,12|\"};\n+ \"CC1(C)[C@H](C=C(Cl)Cl)[C@@H]1C(=O)O[C@H](C#N)c1cccc(Oc2ccccc2)c1 |&1:3,&2:8,12|\"};\n auto mols = CDXMLFileToMols(fname);\n CHECK(mols.size() == expected.size());\n int i = 0;\n@@ -426,9 +426,9 @@ TEST_CASE(\"CDXML\") {\n SECTION(\"Enhanced Stereo 2\") {\n auto fname = cdxmlbase + \"beta-cypermethrin-or-abs.cdxml\";\n std::vector<std::string> expected = {\n- \"CC1(C)[C@H](C=C(Cl)Cl)[C@H]1C(=O)O[C@@H](C#N)c1cccc(Oc2ccccc2)c1\"};\n+ \"CC1(C)[C@H](C=C(Cl)Cl)[C@@H]1C(=O)O[C@H](C#N)c1cccc(Oc2ccccc2)c1\"};\n std::vector<std::string> expected_cx = {\n- \"CC1(C)[C@H](C=C(Cl)Cl)[C@H]1C(=O)O[C@@H](C#N)c1cccc(Oc2ccccc2)c1 |o1:8,12|\"};\n+ \"CC1(C)[C@H](C=C(Cl)Cl)[C@@H]1C(=O)O[C@H](C#N)c1cccc(Oc2ccccc2)c1 |o1:8,12|\"};\n auto mols = CDXMLFileToMols(fname);\n CHECK(mols.size() == expected.size());\n int i = 0;\n@@ -704,44 +704,40 @@ TEST_CASE(\"CDXML\") {\n {\n auto fname = cdxmlbase + \"stereo.cdxml\";\n std::vector<std::string> expected = {\n- \"C[C@@H](Cl)[C@H](N)O.C[C@@H](F)[C@H](N)O.C[C@H](Br)[C@@H](N)O.C[C@H](I)[C@@H](N)O\"};\n+ \"C[C@@H](Cl)[C@H](N)O.C[C@@H](F)[C@H](N)O.C[C@H](Br)[C@@H](N)O.C[C@H](I)[C@@H](N)O\"};\n auto mols = CDXMLFileToMols(fname);\n CHECK(mols.size() == expected.size());\n int i = 0;\n for (auto &mol : mols) {\n-\tCHECK(MolToSmiles(*mol) == expected[i++]);\n+ CHECK(MolToSmiles(*mol) == expected[i++]);\n }\n }\n {\n auto fname = cdxmlbase + \"wavy.cdxml\";\n- std::vector<std::string> expected = {\n- \"Cc1cccc(C)c1NC(=O)N=C1CCCN1C\",\n- \"Cc1cccc(C)c1NC(=O)/N=C1\\\\CCCN1C\"\n- };\n+ std::vector<std::string> expected = {\"Cc1cccc(C)c1NC(=O)N=C1CCCN1C\",\n+ \"Cc1cccc(C)c1NC(=O)/N=C1\\\\CCCN1C\"};\n auto mols = CDXMLFileToMols(fname);\n CHECK(mols.size() == expected.size());\n int i = 0;\n for (auto &mol : mols) {\n- if (i == 0) {\n- CHECK(mol->getBondWithIdx(11)->getBondDir() == Bond::BondDir::EITHERDOUBLE);\n- }\n- CHECK(MolToSmiles(*mol) == expected[i++]);\n- \n+ if (i == 0) {\n+ CHECK(mol->getBondWithIdx(11)->getBondDir() ==\n+ Bond::BondDir::EITHERDOUBLE);\n+ }\n+ CHECK(MolToSmiles(*mol) == expected[i++]);\n }\n }\n {\n auto fname = cdxmlbase + \"wavy-single.cdxml\";\n- std::vector<std::string> expected = {\n- \"CCCC\"\n- };\n+ std::vector<std::string> expected = {\"CCCC\"};\n auto mols = CDXMLFileToMols(fname);\n CHECK(mols.size() == expected.size());\n int i = 0;\n for (auto &mol : mols) {\n- CHECK(mol->getBondWithIdx(0)->getBondDir() == Bond::BondDir::NONE);\n- CHECK(mol->getBondWithIdx(1)->getBondDir() == Bond::BondDir::NONE);\n- CHECK(mol->getBondWithIdx(2)->getBondDir() == Bond::BondDir::NONE);\n- CHECK(MolToSmiles(*mol) == expected[i++]);\n+ CHECK(mol->getBondWithIdx(0)->getBondDir() == Bond::BondDir::NONE);\n+ CHECK(mol->getBondWithIdx(1)->getBondDir() == Bond::BondDir::NONE);\n+ CHECK(mol->getBondWithIdx(2)->getBondDir() == Bond::BondDir::NONE);\n+ CHECK(MolToSmiles(*mol) == expected[i++]);\n }\n }\n }\ndiff --git a/Code/GraphMol/MolInterchange/molinterchange_catch.cpp b/Code/GraphMol/MolInterchange/molinterchange_catch.cpp\nindex 5df108945f8..b8caf502703 100644\n--- a/Code/GraphMol/MolInterchange/molinterchange_catch.cpp\n+++ b/Code/GraphMol/MolInterchange/molinterchange_catch.cpp\n@@ -173,7 +173,7 @@ TEST_CASE(\"StereoGroups\") {\n auto smi = MolToCXSmiles(*mols[0]);\n CHECK(\n smi ==\n- \"C[C@@H]1C([C@H](O)F)O[C@H](C)C([C@@H](O)F)[C@@H]1C |a:7,o1:3,10,&1:1,&2:13|\");\n+ \"C[C@H]1OC([C@H](O)F)[C@H](C)[C@H](C)C1[C@@H](O)F |a:1,o1:4,12,&1:7,&2:9|\");\n }\n SECTION(\"writing multiple mols\") {\n std::vector<ROMol *> mols{ormol.get(), andmol.get()};\ndiff --git a/Code/GraphMol/RGroupDecomposition/catch_rgd.cpp b/Code/GraphMol/RGroupDecomposition/catch_rgd.cpp\nindex be248c5a147..9f6b099c444 100644\n--- a/Code/GraphMol/RGroupDecomposition/catch_rgd.cpp\n+++ b/Code/GraphMol/RGroupDecomposition/catch_rgd.cpp\n@@ -462,22 +462,22 @@ TEST_CASE(\"substructure parameters and RGD: enhanced stereo\") {\n CHECK(flatten_whitespace(toJSON(rows)) == flatten_whitespace(R\"JSON(\n [\n {\n- \"Core\":\"C1C[C@@]([*:1])([*:2])N1\",\n+ \"Core\":\"C1C[C@]([*:1])([*:2])N1\",\n \"R1\":\"F[*:1]\",\n \"R2\":\"[H][*:2]\"\n },\n {\n- \"Core\":\"C1C[C@@]([*:1])([*:2])N1\",\n+ \"Core\":\"C1C[C@]([*:1])([*:2])N1\",\n \"R1\":\"O[*:1]\",\n \"R2\":\"F[*:2]\"\n },\n {\n- \"Core\":\"C1C[C@@]([*:1])([*:2])N1\",\n+ \"Core\":\"C1C[C@]([*:1])([*:2])N1\",\n \"R1\":\"[H][*:1]\",\n \"R2\":\"F[*:2]\"\n },\n {\n- \"Core\":\"C1C[C@@]([*:1])([*:2])N1\",\n+ \"Core\":\"C1C[C@]([*:1])([*:2])N1\",\n \"R1\":\"Cl[*:1]\",\n \"R2\":\"[H][*:2]\"\n }\n@@ -496,22 +496,22 @@ TEST_CASE(\"substructure parameters and RGD: enhanced stereo\") {\n CHECK(flatten_whitespace(toJSON(rows)) == flatten_whitespace(R\"JSON(\n [\n {\n- \"Core\":\"C1C[C@@]([*:1])([*:2])N1\",\n+ \"Core\":\"C1C[C@]([*:1])([*:2])N1\",\n \"R1\":\"F[*:1]\",\n \"R2\":\"[H][*:2]\"\n },\n {\n- \"Core\":\"C1C[C@@]([*:1])([*:2])N1\",\n+ \"Core\":\"C1C[C@]([*:1])([*:2])N1\",\n \"R1\":\"O[*:1]\",\n \"R2\":\"F[*:2]\"\n },\n {\n- \"Core\":\"C1C[C@@]([*:1])([*:2])N1\",\n+ \"Core\":\"C1C[C@]([*:1])([*:2])N1\",\n \"R1\":\"[H][*:1]\",\n \"R2\":\"F[*:2]\"\n },\n {\n- \"Core\":\"C1C[C@@]([*:1])([*:2])N1\",\n+ \"Core\":\"C1C[C@]([*:1])([*:2])N1\",\n \"R1\":\"Cl[*:1]\",\n \"R2\":\"[H][*:2]\"\n }\n@@ -537,7 +537,7 @@ TEST_CASE(\"substructure parameters and RGD: enhanced stereo\") {\n CHECK(flatten_whitespace(toJSON(rows)) == flatten_whitespace(R\"JSON(\n [\n {\n- \"Core\":\"C1C[C@@]([*:1])([*:2])N1\",\n+ \"Core\":\"C1C[C@]([*:1])([*:2])N1\",\n \"R1\":\"F[*:1]\",\n \"R2\":\"[H][*:2]\"\n },\n@@ -565,7 +565,7 @@ TEST_CASE(\"substructure parameters and RGD: enhanced stereo\") {\n CHECK(flatten_whitespace(toJSON(rows)) == flatten_whitespace(R\"JSON(\n [\n {\n- \"Core\":\"C1C[C@@]([*:1])([*:2])N1\",\n+ \"Core\":\"C1C[C@]([*:1])([*:2])N1\",\n \"R1\":\"F[*:1]\",\n \"R2\":\"[H][*:2]\"\n },\n@@ -580,7 +580,7 @@ TEST_CASE(\"substructure parameters and RGD: enhanced stereo\") {\n \"R2\":\"[H][*:2]\"\n },\n {\n- \"Core\":\"C1C[C@@]([*:1])([*:2])N1\",\n+ \"Core\":\"C1C[C@]([*:1])([*:2])N1\",\n \"R1\":\"Cl[*:1]\",\n \"R2\":\"[H][*:2]\"\n }\ndiff --git a/Code/GraphMol/SmilesParse/SmilesWrite.cpp b/Code/GraphMol/SmilesParse/SmilesWrite.cpp\nindex 0e544d001b8..7da43dc0f1e 100644\n--- a/Code/GraphMol/SmilesParse/SmilesWrite.cpp\n+++ b/Code/GraphMol/SmilesParse/SmilesWrite.cpp\n@@ -366,6 +366,10 @@ std::string FragmentSmilesConstruct(\n }\n std::list<unsigned int> ringClosuresToErase;\n \n+ if (params.canonical && params.doIsomericSmiles) {\n+ Canon::canonicalizeEnhancedStereo(mol, &ranks);\n+ }\n+\n Canon::canonicalizeFragment(mol, atomIdx, colors, ranks, molStack,\n bondsInPlay, bondSymbols, params.doIsomericSmiles,\n params.doRandom);\ndiff --git a/Code/GraphMol/Wrap/rdmolfiles.cpp b/Code/GraphMol/Wrap/rdmolfiles.cpp\nindex bc56b785c54..d89e571cd9f 100644\n--- a/Code/GraphMol/Wrap/rdmolfiles.cpp\n+++ b/Code/GraphMol/Wrap/rdmolfiles.cpp\n@@ -18,6 +18,7 @@\n #include <GraphMol/RDKitBase.h>\n #include <GraphMol/MolOps.h>\n #include <GraphMol/new_canon.h>\n+#include <GraphMol/Canon.h>\n #include <GraphMol/SmilesParse/SmilesParse.h>\n #include <GraphMol/SmilesParse/SmilesWrite.h>\n #include <GraphMol/SmilesParse/SmartsWrite.h>\n@@ -657,6 +658,10 @@ python::dict MetadataFromPNGString(python::object png) {\n return translateMetadata(metadata);\n }\n \n+void CanonicalizeEnhancedStereo(ROMol &mol) {\n+ Canon::canonicalizeEnhancedStereo(mol);\n+}\n+\n } // namespace RDKit\n \n // MolSupplier stuff\n@@ -1908,6 +1913,9 @@ BOOST_PYTHON_MODULE(rdmolfiles) {\n python::arg(\"includeIsotopes\") = true),\n docString.c_str());\n \n+ python::def(\"CanonicalizeEnhancedStereo\", CanonicalizeEnhancedStereo,\n+ (python::arg(\"mol\")));\n+\n python::def(\n \"CreateAtomIntPropertyList\", FileParserUtils::createAtomIntPropertyList,\n (python::arg(\"mol\"), python::arg(\"propName\"),\ndiff --git a/Code/GraphMol/catch_canon.cpp b/Code/GraphMol/catch_canon.cpp\nindex a24c67d71a5..c468a6fcf3a 100644\n--- a/Code/GraphMol/catch_canon.cpp\n+++ b/Code/GraphMol/catch_canon.cpp\n@@ -15,6 +15,7 @@\n #include <GraphMol/Chirality.h>\n #include <GraphMol/new_canon.h>\n #include <GraphMol/MolOps.h>\n+#include <GraphMol/Canon.h>\n \n #include <GraphMol/FileParsers/FileParsers.h>\n #include <GraphMol/FileParsers/MolFileStereochem.h>\n@@ -153,16 +154,10 @@ TEST_CASE(\"double bond stereo and canonicalization\") {\n bool breakTies = false;\n std::vector<unsigned int> ranks;\n Canon::rankMolAtoms(*mol, ranks, breakTies);\n- std::copy(ranks.begin(), ranks.end(),\n- std::ostream_iterator<unsigned int>(std::cerr, \" \"));\n- std::cerr << std::endl;\n mol->getBondWithIdx(1)->setStereo(Bond::BondStereo::STEREOCIS);\n mol->getBondWithIdx(7)->setStereo(Bond::BondStereo::STEREOTRANS);\n std::vector<unsigned int> ranks2;\n Canon::rankMolAtoms(*mol, ranks2, breakTies);\n- std::copy(ranks2.begin(), ranks2.end(),\n- std::ostream_iterator<unsigned int>(std::cerr, \" \"));\n- std::cerr << std::endl;\n CHECK(ranks[0] == ranks2[9]);\n CHECK(ranks[1] == ranks2[8]);\n CHECK(ranks[2] == ranks2[6]);\n@@ -175,9 +170,6 @@ TEST_CASE(\"double bond stereo and canonicalization\") {\n mol->getBondWithIdx(7)->setStereo(Bond::BondStereo::STEREOCIS);\n std::vector<unsigned int> ranks3;\n Canon::rankMolAtoms(*mol, ranks3, breakTies);\n- std::copy(ranks3.begin(), ranks3.end(),\n- std::ostream_iterator<unsigned int>(std::cerr, \" \"));\n- std::cerr << std::endl;\n CHECK(ranks2 == ranks3);\n }\n SECTION(\"STEREOANY is higher priority than STEREONONE\") {\n@@ -188,9 +180,171 @@ TEST_CASE(\"double bond stereo and canonicalization\") {\n bool breakTies = false;\n std::vector<unsigned int> ranks;\n Canon::rankMolAtoms(*mol, ranks, breakTies);\n- std::copy(ranks.begin(), ranks.end(),\n- std::ostream_iterator<unsigned int>(std::cerr, \" \"));\n- std::cerr << std::endl;\n CHECK(ranks[0] < ranks[9]);\n }\n-}\n\\ No newline at end of file\n+}\n+\n+TEST_CASE(\"enhanced stereo canonicalization\") {\n+ SECTION(\"simple chiral tags\") {\n+ std::vector<std::pair<std::string, std::string>> tests = {\n+ {\"C[C@H](F)Cl |&1:1|\", \"C[C@@H](F)Cl |&1:1|\"},\n+ {\"C[C@H](F)Cl |o1:1|\", \"C[C@@H](F)Cl |o1:1|\"},\n+ };\n+ for (const auto& [smi1, smi2] : tests) {\n+ INFO(smi1 + \" : \" + smi2);\n+ std::unique_ptr<RWMol> mol1{SmilesToMol(smi1)};\n+ REQUIRE(mol1);\n+ std::unique_ptr<RWMol> mol2{SmilesToMol(smi2)};\n+ REQUIRE(mol2);\n+\n+ Canon::canonicalizeEnhancedStereo(*mol1);\n+ Canon::canonicalizeEnhancedStereo(*mol2);\n+\n+ CHECK(mol1->getAtomWithIdx(1)->getChiralTag() ==\n+ mol2->getAtomWithIdx(1)->getChiralTag());\n+ }\n+ }\n+ SECTION(\"abs groups are not modified\") {\n+ std::vector<std::pair<std::string, std::string>> tests = {\n+ {\"C[C@H](F)Cl |a:1|\", \"C[C@@H](F)Cl |a:1|\"},\n+ };\n+ for (const auto& [smi1, smi2] : tests) {\n+ INFO(smi1 + \" : \" + smi2);\n+ std::unique_ptr<RWMol> mol1{SmilesToMol(smi1)};\n+ REQUIRE(mol1);\n+ std::unique_ptr<RWMol> mol2{SmilesToMol(smi2)};\n+ REQUIRE(mol2);\n+\n+ Canon::canonicalizeEnhancedStereo(*mol1);\n+ Canon::canonicalizeEnhancedStereo(*mol2);\n+\n+ CHECK(mol1->getAtomWithIdx(1)->getChiralTag() !=\n+ mol2->getAtomWithIdx(1)->getChiralTag());\n+ }\n+ }\n+ SECTION(\"relative chiral tags\") {\n+ std::vector<std::pair<std::string, std::string>> tests = {\n+ {\"C[C@H](F)[C@H](Br)O |&1:1,3|\", \"C[C@@H](F)[C@@H](Br)O |&1:1,3|\"},\n+ {\"C[C@H](F)[C@@H](Br)O |&1:1,3|\", \"C[C@@H](F)[C@H](Br)O |&1:1,3|\"},\n+ {\"O[C@H](Br)[C@H](F)C |&1:1,3|\", \"O[C@@H](Br)[C@@H](F)C |&1:1,3|\"},\n+ {\"O[C@H](Br)[C@@H](F)C |&1:1,3|\", \"O[C@@H](Br)[C@H](F)C |&1:1,3|\"},\n+ };\n+ for (const auto& [smi1, smi2] : tests) {\n+ INFO(smi1 + \" : \" + smi2);\n+ std::unique_ptr<RWMol> mol1{SmilesToMol(smi1)};\n+ REQUIRE(mol1);\n+ std::unique_ptr<RWMol> mol2{SmilesToMol(smi2)};\n+ REQUIRE(mol2);\n+\n+ Canon::canonicalizeEnhancedStereo(*mol1);\n+ Canon::canonicalizeEnhancedStereo(*mol2);\n+\n+ CHECK(mol1->getAtomWithIdx(1)->getChiralTag() ==\n+ mol2->getAtomWithIdx(1)->getChiralTag());\n+ CHECK(mol1->getAtomWithIdx(3)->getChiralTag() ==\n+ mol2->getAtomWithIdx(3)->getChiralTag());\n+ }\n+ }\n+ SECTION(\"multiple groups\") {\n+ std::vector<std::pair<std::string, std::string>> tests = {\n+ {\"C[C@H](F)[C@H](Br)O |&1:1,o2:3|\",\n+ \"C[C@@H](F)[C@@H](Br)O |&1:1,o2:3|\"},\n+ {\"C[C@H](F)[C@H](Br)O |&1:1,o2:3|\",\n+ \"C[C@@H](F)[C@@H](Br)O |o1:3,&1:1|\"},\n+ };\n+ for (const auto& [smi1, smi2] : tests) {\n+ INFO(smi1 + \" : \" + smi2);\n+ std::unique_ptr<RWMol> mol1{SmilesToMol(smi1)};\n+ REQUIRE(mol1);\n+ std::unique_ptr<RWMol> mol2{SmilesToMol(smi2)};\n+ REQUIRE(mol2);\n+\n+ Canon::canonicalizeEnhancedStereo(*mol1);\n+ Canon::canonicalizeEnhancedStereo(*mol2);\n+\n+ CHECK(mol1->getAtomWithIdx(1)->getChiralTag() ==\n+ mol2->getAtomWithIdx(1)->getChiralTag());\n+ CHECK(mol1->getAtomWithIdx(3)->getChiralTag() ==\n+ mol2->getAtomWithIdx(3)->getChiralTag());\n+ }\n+ }\n+}\n+\n+TEST_CASE(\"using enhanced stereo in rankMolAtoms\") {\n+ SECTION(\"basics: different ranks\") {\n+ std::vector<std::string> smis{\n+ \"C[C@H](F)[C@@H](F)C |a:1|\",\n+ \"C[C@H](F)[C@@H](F)C |&1:1|\"\n+ \"C[C@H](F)[C@@H](F)C |o1:1|\",\n+ \"C[C@H](F)[C@@H](F)C |o1:1,a:3|\",\n+ \"C[C@H](F)[C@@H](F)C |o1:1,&:3|\",\n+ \"C[C@H](F)[C@@H](F)C |a:1,&2:3|\",\n+ };\n+ for (auto& smi : smis) {\n+ INFO(smi);\n+ std::unique_ptr<RWMol> mol{SmilesToMol(smi)};\n+ REQUIRE(mol);\n+ bool breakTies = false;\n+ std::vector<unsigned int> atomRanks;\n+ Canon::rankMolAtoms(*mol, atomRanks, breakTies);\n+ CHECK(atomRanks[1] != atomRanks[3]);\n+ }\n+ }\n+ SECTION(\"basics: same ranks\") {\n+ std::vector<std::string> smis{\n+ \"C[C@H](F)[C@@H](F)C |o1:1,o2:3|\",\n+ \"C[C@H](F)[C@@H](F)C |&1:1,&2:3|\",\n+ \"C[C@H](F)[C@@H](F)C |a:1,a:3|\",\n+ };\n+ for (auto& smi : smis) {\n+ INFO(smi);\n+ std::unique_ptr<RWMol> mol{SmilesToMol(smi)};\n+ REQUIRE(mol);\n+ bool breakTies = false;\n+ std::vector<unsigned int> atomRanks;\n+ Canon::rankMolAtoms(*mol, atomRanks, breakTies);\n+ CHECK(atomRanks[1] == atomRanks[3]);\n+ }\n+ }\n+ SECTION(\"more complex, include group membership\") {\n+ auto m1 =\n+ \"C[C@@H]1CC(C[C@@H](C)[C@@H](C)O)C[C@H](C)C1 |o1:1,7,o2:5,11|\"_smiles;\n+ REQUIRE(m1);\n+ std::vector<unsigned int> atomRanks;\n+ bool breakTies = false;\n+ Canon::rankMolAtoms(*m1, atomRanks, breakTies);\n+ CHECK(atomRanks[11] > atomRanks[1]);\n+\n+ auto m2 =\n+ \"C[C@H](O)[C@H](C)CC1C[C@H](C)C[C@@H](C)C1 |o1:1,8;o2:3,11|\"_smiles;\n+ REQUIRE(m2);\n+ Canon::rankMolAtoms(*m2, atomRanks, breakTies);\n+ CHECK(atomRanks[11] > atomRanks[8]);\n+ }\n+}\n+\n+TEST_CASE(\"more enhanced stereo canonicalization\") {\n+ // FIX: add tests for ring stereo in an s group\n+ SECTION(\"case 1\") {\n+ auto m1 =\n+ \"C[C@@H](O)[C@H](C)[C@@H](C)[C@@H](C)F |a:3,&1:1,7,&2:5,r|\"_smiles;\n+ REQUIRE(m1);\n+ auto m2 = \"C[C@H](O)[C@H](C)[C@@H](C)[C@H](C)F |a:3,&1:1,7,&2:5,r|\"_smiles;\n+ REQUIRE(m2);\n+ Canon::canonicalizeEnhancedStereo(*m1);\n+ Canon::canonicalizeEnhancedStereo(*m2);\n+ CHECK(MolToCXSmiles(*m1) == MolToCXSmiles(*m2));\n+ }\n+ SECTION(\"case 2\") {\n+ auto m1 =\n+ \"C[C@@H](O)[C@H](C)[C@@H](C)[C@@H](C)O |&3:3,5,o1:7,&2:1,r|\"_smiles;\n+ REQUIRE(m1);\n+ auto m2 =\n+ \"C[C@@H](O)[C@H](C)[C@@H](C)[C@@H](C)O |&3:3,5,&2:7,o1:1,r|\"_smiles;\n+ REQUIRE(m2);\n+ Canon::canonicalizeEnhancedStereo(*m1);\n+ Canon::canonicalizeEnhancedStereo(*m2);\n+\n+ CHECK(MolToCXSmiles(*m1) == MolToCXSmiles(*m2));\n+ }\n+}\ndiff --git a/Code/GraphMol/catch_graphmol.cpp b/Code/GraphMol/catch_graphmol.cpp\nindex 7608f800e81..6dbbbed327b 100644\n--- a/Code/GraphMol/catch_graphmol.cpp\n+++ b/Code/GraphMol/catch_graphmol.cpp\n@@ -2018,7 +2018,7 @@ TEST_CASE(\"github #4071: StereoGroups not preserved by RenumberAtoms()\",\n mol->getStereoGroups()[i].getGroupType());\n }\n CHECK(MolToCXSmiles(*nmol) ==\n- \"C[C@H]([C@@H](C)[C@@H](C)O)[C@@H](C)O |o1:7,&1:1,&2:2,&3:4|\");\n+ \"C[C@H](O)[C@H](C)[C@H](C)[C@H](C)O |o1:1,&1:3,&2:5,&3:7|\");\n }\n }\n \ndiff --git a/Code/GraphMol/new_canon.cpp b/Code/GraphMol/new_canon.cpp\nindex 0286384f1dc..c489bfa8081 100644\n--- a/Code/GraphMol/new_canon.cpp\n+++ b/Code/GraphMol/new_canon.cpp\n@@ -553,6 +553,16 @@ void initCanonAtoms(const ROMol &mol, std::vector<Canon::canon_atom> &atoms,\n atoms[i].bonds.reserve(atoms[i].degree);\n getBonds(mol, atoms[i].atom, atoms[i].bonds, includeChirality, atoms);\n }\n+ if (includeChirality) {\n+ unsigned int sgidx = 1;\n+ for (auto &sg : mol.getStereoGroups()) {\n+ for (auto atom : sg.getAtoms()) {\n+ atoms[atom->getIdx()].whichStereoGroup = sgidx;\n+ atoms[atom->getIdx()].typeOfStereoGroup = sg.getGroupType();\n+ }\n+ ++sgidx;\n+ }\n+ }\n }\n namespace detail {\n \ndiff --git a/Code/GraphMol/new_canon.h b/Code/GraphMol/new_canon.h\nindex 53853ed9062..1e7e6fead7f 100644\n--- a/Code/GraphMol/new_canon.h\n+++ b/Code/GraphMol/new_canon.h\n@@ -13,6 +13,7 @@\n #include <RDGeneral/hanoiSort.h>\n #include <GraphMol/ROMol.h>\n #include <GraphMol/RingInfo.h>\n+#include <GraphMol/StereoGroup.h>\n #include <RDGeneral/BoostStartInclude.h>\n #include <cstdint>\n #include <boost/dynamic_bitset.hpp>\n@@ -96,14 +97,15 @@ struct RDKIT_GRAPHMOL_EXPORT bondholder {\n return 0;\n }\n };\n-class RDKIT_GRAPHMOL_EXPORT canon_atom {\n- public:\n+struct RDKIT_GRAPHMOL_EXPORT canon_atom {\n const Atom *atom{nullptr};\n int index{-1};\n unsigned int degree{0};\n unsigned int totalNumHs{0};\n bool hasRingNbr{false};\n bool isRingStereoAtom{false};\n+ unsigned int whichStereoGroup{0};\n+ StereoGroupType typeOfStereoGroup{StereoGroupType::STEREO_ABSOLUTE};\n int *nbrIds{nullptr};\n const std::string *p_symbol{\n nullptr}; // if provided, this is used to order atoms\n@@ -380,30 +382,67 @@ class RDKIT_GRAPHMOL_EXPORT AtomCompareFunctor {\n }\n // chirality if we're using it\n if (df_useChirality) {\n- // first atom stereochem:\n- ivi = 0;\n- ivj = 0;\n- // can't actually use values here, because they are arbitrary\n- ivi = dp_atoms[i].atom->getChiralTag() != 0;\n- ivj = dp_atoms[j].atom->getChiralTag() != 0;\n- if (ivi < ivj) {\n- return -1;\n- } else if (ivi > ivj) {\n- return 1;\n- }\n- // stereo set\n- if (ivi && ivj) {\n- if (ivi) {\n- ivi = getChiralRank(dp_mol, dp_atoms, i);\n- }\n- if (ivj) {\n- ivj = getChiralRank(dp_mol, dp_atoms, j);\n+ // look at enhanced stereo\n+ ivi = dp_atoms[i].whichStereoGroup; // can't use the index itself, but if\n+ // it's set then we're in an SG\n+ ivj = dp_atoms[j].whichStereoGroup;\n+ if (ivi || ivj) {\n+ if (ivi && !ivj) {\n+ return 1;\n+ } else if (ivj && !ivi) {\n+ return -1;\n+ } else if (ivi && ivj) {\n+ ivi = static_cast<unsigned int>(dp_atoms[i].typeOfStereoGroup);\n+ ivj = static_cast<unsigned int>(dp_atoms[j].typeOfStereoGroup);\n+ if (ivi < ivj) {\n+ return -1;\n+ } else if (ivi > ivj) {\n+ return 1;\n+ }\n+ ivi = dp_atoms[i].whichStereoGroup - 1;\n+ ivj = dp_atoms[j].whichStereoGroup - 1;\n+ // now check the current classes of the other members of the SG\n+ std::set<unsigned int> sgi;\n+ for (auto sgat : dp_mol->getStereoGroups()[ivi].getAtoms()) {\n+ sgi.insert(dp_atoms[sgat->getIdx()].index);\n+ }\n+ std::set<unsigned int> sgj;\n+ for (auto sgat : dp_mol->getStereoGroups()[ivj].getAtoms()) {\n+ sgj.insert(dp_atoms[sgat->getIdx()].index);\n+ }\n+ if (sgi < sgj) {\n+ return -1;\n+ } else if (sgi > sgj) {\n+ return 1;\n+ }\n }\n+ } else {\n+ // if there's no stereogroup, then use whatever atom stereochem is\n+ // specfied:\n+ ivi = 0;\n+ ivj = 0;\n+ // can't actually use values here, because they are arbitrary\n+ ivi = dp_atoms[i].atom->getChiralTag() != 0;\n+ ivj = dp_atoms[j].atom->getChiralTag() != 0;\n if (ivi < ivj) {\n return -1;\n } else if (ivi > ivj) {\n return 1;\n }\n+ // stereo set\n+ if (ivi && ivj) {\n+ if (ivi) {\n+ ivi = getChiralRank(dp_mol, dp_atoms, i);\n+ }\n+ if (ivj) {\n+ ivj = getChiralRank(dp_mol, dp_atoms, j);\n+ }\n+ if (ivi < ivj) {\n+ return -1;\n+ } else if (ivi > ivj) {\n+ return 1;\n+ }\n+ }\n }\n }\n \ndiff --git a/Code/PgSQL/rdkit/expected/rdkit-91.out b/Code/PgSQL/rdkit/expected/rdkit-91.out\nindex 0c148561aaa..88fe41ff2ad 100644\n--- a/Code/PgSQL/rdkit/expected/rdkit-91.out\n+++ b/Code/PgSQL/rdkit/expected/rdkit-91.out\n@@ -1340,15 +1340,15 @@ select mol_to_smarts(mol_adjust_query_properties('*c1ncc(*)cc1'::qmol));\n \n -- CXSmiles\n SELECT mol_to_smiles(mol_from_smiles('C[C@H](F)[C@H](C)[C@@H](C)Br |a:1,o1:3,5|'));\n- mol_to_smiles \n--------------------------------\n- C[C@@H]([C@H](C)F)[C@@H](C)Br\n+ mol_to_smiles \n+------------------------------\n+ C[C@H](F)[C@@H](C)[C@H](C)Br\n (1 row)\n \n SELECT mol_to_cxsmiles(mol_from_smiles('C[C@H](F)[C@H](C)[C@@H](C)Br |a:1,o1:3,5|'));\n- mol_to_cxsmiles \n---------------------------------------------\n- C[C@@H]([C@H](C)F)[C@@H](C)Br |a:2,o1:1,5|\n+ mol_to_cxsmiles \n+-------------------------------------------\n+ C[C@H](F)[C@@H](C)[C@H](C)Br |a:1,o1:3,5|\n (1 row)\n \n SELECT mol_to_cxsmarts(mol_from_smiles('C[C@H](F)[C@H](C)[C@@H](C)Br |a:1,o1:3,5|'));\n@@ -1365,9 +1365,9 @@ SELECT mol_to_cxsmarts(qmol_from_smarts('C[C@H]([F,Cl,Br])[C@H](C)[C@@H](C)Br |a\n \n -- CXSmiles from mol_out\n SELECT mol_out(mol_from_smiles('C[C@H](F)[C@H](C)[C@@H](C)Br |a:1,o1:3,5|'));\n- mol_out \n---------------------------------------------\n- C[C@@H]([C@H](C)F)[C@@H](C)Br |a:2,o1:1,5|\n+ mol_out \n+-------------------------------------------\n+ C[C@H](F)[C@@H](C)[C@H](C)Br |a:1,o1:3,5|\n (1 row)\n \n -- github #3688: bad input to qmol_from_ctab() crashes db\ndiff --git a/Docs/Book/RDKit_Book.rst b/Docs/Book/RDKit_Book.rst\nindex cf47872b7e0..dd74cfe52b1 100644\n--- a/Docs/Book/RDKit_Book.rst\n+++ b/Docs/Book/RDKit_Book.rst\n@@ -2028,8 +2028,10 @@ Use cases\n \n The initial target is to not lose data on an ``V3k mol -> RDKit -> V3k mol`` round trip. Manipulation and depiction are future goals.\n \n-It is possible to enumerate the elements of a ``StereoGroup`` using the function :py:func:`rdkit.Chem.EnumerateStereoisomers.EumerateStereoisomers`, which also\n-preserves membership in the original ``StereoGroup``.\n+It is possible to enumerate the elements of a ``StereoGroup`` using the function\n+:py:func:`rdkit.Chem.EnumerateStereoisomers.EumerateStereoisomers`. Note that\n+this removes the ``StereoGroup`` information from the products since they now\n+correspond to specific molecules:\n \n .. doctest ::\n \n@@ -2040,7 +2042,7 @@ preserves membership in the original ``StereoGroup``.\n [1]\n >>> from rdkit.Chem.EnumerateStereoisomers import EnumerateStereoisomers\n >>> [Chem.MolToCXSmiles(x) for x in EnumerateStereoisomers(m)]\n- ['C[C@@H](F)C[C@H](O)Cl |&1:1|', 'C[C@H](F)C[C@H](O)Cl |&1:1|']\n+ ['C[C@@H](F)C[C@H](O)Cl', 'C[C@H](F)C[C@H](O)Cl']\n \n Reactions also preserve ``StereoGroup``s. Product atoms are included in the ``StereoGroup`` as long as the reaction doesn't create or destroy chirality at the atom.\n \ndiff --git a/ReleaseNotes.md b/ReleaseNotes.md\nindex 28bd502512e..38fcec68117 100644\n--- a/ReleaseNotes.md\n+++ b/ReleaseNotes.md\n@@ -8,6 +8,7 @@\n ## Backwards incompatible changes\n \n - The ring-finding functions will now run even if the molecule already has ring information. Older versions of the RDKit would return whatever ring information was present, even if it had been generated using a different algorithm.\n+- The canonical SMILES and CXSMILES generated for molecules with enhanced stereochemistry (stereo groups) is different than in previous releases. The enhanced stereochemistry information and the stereo groups themselves are now canonical. This does *not* affect molecules which do not have enhanced stereo and will not have any effect if you generate non-isomeric SMILES. This change also affects the output of the MolHash and RegistrationHash code when applied to molecules with enhanced stereo.\n \n ## Bug Fixes:\n \ndiff --git a/rdkit/Chem/RegistrationHash.py b/rdkit/Chem/RegistrationHash.py\nindex 3c69d4ec522..d8ee27da39c 100644\n--- a/rdkit/Chem/RegistrationHash.py\n+++ b/rdkit/Chem/RegistrationHash.py\n@@ -127,6 +127,8 @@ def GetMolLayers(original_molecule: Chem.rdchem.Mol, data_field_names: Optional[\n mol = _RemoveUnnecessaryHs(original_molecule, preserve_stereogenic_hs=True)\n _StripAtomMapLabels(mol)\n \n+ Chem.CanonicalizeEnhancedStereo(mol)\n+\n formula = rdMolHash.MolHash(mol, rdMolHash.HashFunction.MolFormula)\n cxsmiles, canonical_mol = _CanonicalizeStereoGroups(mol)\n tautomer_hash = GetStereoTautomerHash(canonical_mol)\n@@ -437,8 +439,9 @@ def _CanonicalizeStereoGroups(mol):\n compare the CXSMILES of those.\n \"\"\"\n \n- if not len(mol.GetStereoGroups()):\n- return Chem.MolToCXSmiles(mol), mol\n+ # if not len(mol.GetStereoGroups()):\n+ Chem.CanonicalizeEnhancedStereo(mol)\n+ return Chem.MolToCXSmiles(mol), mol\n \n mol = Chem.Mol(mol)\n \n"}, "test": {"test_patch": "diff --git a/Code/GraphMol/ChemReactions/Wrap/testReactionWrapper.py b/Code/GraphMol/ChemReactions/Wrap/testReactionWrapper.py\nindex f6d76078ea5..4879a96869c 100644\n--- a/Code/GraphMol/ChemReactions/Wrap/testReactionWrapper.py\n+++ b/Code/GraphMol/ChemReactions/Wrap/testReactionWrapper.py\n@@ -819,7 +819,7 @@ def test_reaction_preserves_stereo(self):\n -> preserve stereo group\n \"\"\"\n reaction = '[C@:1]>>[C@:1]'\n- reactants = ['F[C@H](Cl)Br |o1:1|', 'F[C@@H](Cl)Br |&1:1|', 'FC(Cl)Br']\n+ reactants = ['F[C@H](Cl)Br |o1:1|', 'F[C@H](Cl)Br |&1:1|', 'FC(Cl)Br']\n for reactant in reactants:\n products = _reactAndSummarize(reaction, reactant)\n self.assertEqual(products, reactant)\n@@ -831,7 +831,7 @@ def test_reaction_ignores_stereo(self):\n -> preserve stereo group\n \"\"\"\n reaction = '[C:1]>>[C:1]'\n- reactants = ['F[C@H](Cl)Br |o1:1|', 'F[C@@H](Cl)Br |&1:1|', 'FC(Cl)Br']\n+ reactants = ['F[C@H](Cl)Br |o1:1|', 'F[C@H](Cl)Br |&1:1|', 'FC(Cl)Br']\n for reactant in reactants:\n products = _reactAndSummarize(reaction, reactant)\n self.assertEqual(products, reactant)\n@@ -845,7 +845,7 @@ def test_reaction_inverts_stereo(self):\n reaction = '[C@:1]>>[C@@:1]'\n \n products = _reactAndSummarize(reaction, 'F[C@H](Cl)Br |o1:1|')\n- self.assertEqual(products, 'F[C@@H](Cl)Br |o1:1|')\n+ self.assertEqual(products, 'F[C@H](Cl)Br |o1:1|')\n products = _reactAndSummarize(reaction, 'F[C@@H](Cl)Br |&1:1|')\n self.assertEqual(products, 'F[C@H](Cl)Br |&1:1|')\n products = _reactAndSummarize(reaction, 'FC(Cl)Br')\n@@ -868,10 +868,10 @@ def test_reaction_destroys_stereo(self):\n reaction = '[C@:1]F>>[C:1]F'\n # Reaction destroys stereo (but preserves unaffected group\n products = _reactAndSummarize(reaction, 'F[C@H](Cl)[C@@H](Cl)Br |o1:1,&2:3|')\n- self.assertEqual(products, 'FC(Cl)[C@@H](Cl)Br |&1:3|')\n+ self.assertEqual(products, 'FC(Cl)[C@H](Cl)Br |&1:3|')\n # Reaction destroys stereo (but preserves the rest of the group\n products = _reactAndSummarize(reaction, 'F[C@H](Cl)[C@@H](Cl)Br |&1:1,3|')\n- self.assertEqual(products, 'FC(Cl)[C@@H](Cl)Br |&1:3|')\n+ self.assertEqual(products, 'FC(Cl)[C@H](Cl)Br |&1:3|')\n \n def test_reaction_defines_stereo(self):\n \"\"\"\n@@ -889,11 +889,11 @@ def test_reaction_defines_stereo(self):\n \n # Remove group with defined stereo\n products = _reactAndSummarize('[C:1]F>>[C@@:1]F', 'F[C@H](Cl)[C@@H](Cl)Br |o1:1,&2:3|')\n- self.assertEqual(products, 'F[C@@H](Cl)[C@@H](Cl)Br |&1:3|')\n+ self.assertEqual(products, 'F[C@@H](Cl)[C@H](Cl)Br |&1:3|')\n \n # Remove atoms with defined stereo from group\n products = _reactAndSummarize('[C:1]F>>[C@@:1]F', 'F[C@H](Cl)[C@@H](Cl)Br |o1:1,3|')\n- self.assertEqual(products, 'F[C@@H](Cl)[C@@H](Cl)Br |o1:3|')\n+ self.assertEqual(products, 'F[C@@H](Cl)[C@H](Cl)Br |o1:3|')\n \n def test_stereogroup_is_spectator_to_reaction(self):\n \"\"\"\n@@ -902,19 +902,19 @@ def test_stereogroup_is_spectator_to_reaction(self):\n \"\"\"\n # 5a. Reaction preserves unrelated stereo\n products = _reactAndSummarize('[C@:1]F>>[C@:1]F', 'F[C@H](Cl)[C@@H](Cl)Br |o1:3|')\n- self.assertEqual(products, 'F[C@H](Cl)[C@@H](Cl)Br |o1:3|')\n+ self.assertEqual(products, 'F[C@H](Cl)[C@H](Cl)Br |o1:3|')\n # 5b. Reaction ignores unrelated stereo'\n products = _reactAndSummarize('[C:1]F>>[C:1]F', 'F[C@H](Cl)[C@@H](Cl)Br |o1:3|')\n- self.assertEqual(products, 'F[C@H](Cl)[C@@H](Cl)Br |o1:3|')\n+ self.assertEqual(products, 'F[C@H](Cl)[C@H](Cl)Br |o1:3|')\n # 5c. Reaction inverts unrelated stereo'\n products = _reactAndSummarize('[C@:1]F>>[C@@:1]F', 'F[C@H](Cl)[C@@H](Cl)Br |o1:3|')\n- self.assertEqual(products, 'F[C@@H](Cl)[C@@H](Cl)Br |o1:3|')\n+ self.assertEqual(products, 'F[C@@H](Cl)[C@H](Cl)Br |o1:3|')\n # 5d. Reaction destroys unrelated stereo' 1:3|\n products = _reactAndSummarize('[C@:1]F>>[C:1]F', 'F[C@H](Cl)[C@@H](Cl)Br |o1:3|')\n- self.assertEqual(products, 'FC(Cl)[C@@H](Cl)Br |o1:3|')\n+ self.assertEqual(products, 'FC(Cl)[C@H](Cl)Br |o1:3|')\n # 5e. Reaction assigns unrelated stereo'\n products = _reactAndSummarize('[C:1]F>>[C@@:1]F', 'F[C@H](Cl)[C@@H](Cl)Br |o1:3|')\n- self.assertEqual(products, 'F[C@@H](Cl)[C@@H](Cl)Br |o1:3|')\n+ self.assertEqual(products, 'F[C@@H](Cl)[C@H](Cl)Br |o1:3|')\n \n def test_reaction_splits_stereogroup(self):\n \"\"\"\n@@ -935,8 +935,9 @@ def test_reaction_copies_stereogroup(self):\n products = _reactAndSummarize('[O:1].[C:2]=O>>[O:1][C:2][O:1]',\n 'Cl[C@@H](Br)C[C@H](Br)CCO |&1:1,4|', 'CC(=O)C')\n # stereogroup manually checked, product SMILES assumed correct.\n- self.assertEqual(products,\n- 'CC(C)(OCC[C@@H](Br)C[C@@H](Cl)Br)OCC[C@@H](Br)C[C@@H](Cl)Br |&1:6,9,15,18|')\n+ self.assertEqual(\n+ products,\n+ 'CC(C)(OCC[C@H](Br)C[C@H](Cl)Br)OCC[C@H](Br)C[C@H](Cl)Br |&1:6,9,15,18|')\n \n # Stereogroup atoms are not in the reaction, but have multiple copies in the\n # product.\n@@ -944,7 +945,7 @@ def test_reaction_copies_stereogroup(self):\n 'Cl[C@@H](Br)C[C@H](Br)CCO |&1:1,4|', 'CC(=O)C')\n # stereogroup manually checked, product SMILES assumed correct.\n self.assertEqual(products,\n- 'CC(C)(OCC[C@@H](Br)C[C@@H](Cl)Br)OCC[C@@H](Br)C[C@@H](Cl)Br |&1:6,9,15,18|')\n+ 'CC(C)(OCC[C@H](Br)C[C@H](Cl)Br)OCC[C@H](Br)C[C@H](Cl)Br |&1:6,9,15,18|')\n \n def test_github(self):\n rxn = rdChemReactions.ReactionFromSmarts('[C:2][C:3]>>[C:2][C][*:3]')\ndiff --git a/Code/GraphMol/ChemReactions/catch_tests.cpp b/Code/GraphMol/ChemReactions/catch_tests.cpp\nindex d3c219975f7..ffd9fecaee4 100644\n--- a/Code/GraphMol/ChemReactions/catch_tests.cpp\n+++ b/Code/GraphMol/ChemReactions/catch_tests.cpp\n@@ -99,7 +99,7 @@ TEST_CASE(\"Github #2366 Enhanced Stereo\", \"[Reaction][StereoGroup][bug]\") {\n auto p = prods[0][0];\n \n clearAtomMappingProps(*p);\n- CHECK(MolToCXSmiles(*p) == \"FC(Cl)[C@@H](Cl)Br |&1:3|\");\n+ CHECK(MolToCXSmiles(*p) == \"FC(Cl)[C@H](Cl)Br |&1:3|\");\n }\n SECTION(\"Reaction splits StereoGroup\") {\n ROMOL_SPTR mol(\"F[C@H](Cl)[C@@H](Cl)Br |&1:1,3|\"_smiles);\n@@ -120,7 +120,7 @@ TEST_CASE(\"Github #2366 Enhanced Stereo\", \"[Reaction][StereoGroup][bug]\") {\n clearAtomMappingProps(*p0);\n clearAtomMappingProps(*p1);\n CHECK(MolToCXSmiles(*p0) == \"O[C@H](F)Cl |&1:1|\");\n- CHECK(MolToCXSmiles(*p1) == \"O[C@@H](Cl)Br |&1:1|\");\n+ CHECK(MolToCXSmiles(*p1) == \"O[C@H](Cl)Br |&1:1|\");\n }\n SECTION(\"Reaction combines StereoGroups\") {\n ROMOL_SPTR mol1(\"F[C@H](Cl)O |&1:1|\"_smiles);\ndiff --git a/Code/GraphMol/MolHash/Wrap/testMolHash.py b/Code/GraphMol/MolHash/Wrap/testMolHash.py\nindex b7a3d22a96a..1d27c70a25e 100644\n--- a/Code/GraphMol/MolHash/Wrap/testMolHash.py\n+++ b/Code/GraphMol/MolHash/Wrap/testMolHash.py\n@@ -40,11 +40,11 @@ def testCxSmiles(self):\n 'C[C@@H](O)[C@@H](C)[C@@H](C)C[C@H](C1=CN=CN1)C1=CNC=N1 |o1:8,5,&1:1,3,r,c:11,18,t:9,15|')\n \n self.assertEqual(rdMolHash.MolHash(m, rdMolHash.HashFunction.HetAtomTautomer),\n- 'C[C@H]([C@@H](C)[O])[C@@H](C)CC([C]1[CH][N][CH][N]1)[C]1[CH][N][CH][N]1_3_0')\n+ 'C[C@H](CC([C]1[CH][N][CH][N]1)[C]1[CH][N][CH][N]1)[C@@H](C)[C@H](C)[O]_3_0')\n \n self.assertEqual(\n rdMolHash.MolHash(m, rdMolHash.HashFunction.HetAtomTautomer, True),\n- 'C[C@H]([C@@H](C)[O])[C@@H](C)CC([C]1[CH][N][CH][N]1)[C]1[CH][N][CH][N]1_3_0 |o1:5,&1:1,2|')\n+ 'C[C@H](CC([C]1[CH][N][CH][N]1)[C]1[CH][N][CH][N]1)[C@@H](C)[C@H](C)[O]_3_0 |o1:1,&1:14,16|')\n \n \n if __name__ == \"__main__\":\ndiff --git a/Code/GraphMol/MolHash/catch_tests.cpp b/Code/GraphMol/MolHash/catch_tests.cpp\nindex 227d92215ed..2e9b805978e 100644\n--- a/Code/GraphMol/MolHash/catch_tests.cpp\n+++ b/Code/GraphMol/MolHash/catch_tests.cpp\n@@ -233,8 +233,7 @@ TEST_CASE(\"Github issues\", \"[molhash]\") {\n TEST_CASE(\"MolHash with CX extensions\", \"[molhash]\") {\n SECTION(\"Tautomer\") {\n auto mol =\n- \"C[C@@H](O)[C@@H](C)[C@@H](C)C[C@H](C1=CN=CN1)C1=CNC=N1 \"\n- \"|o1:8,5,&1:1,3,r,c:11,18,t:9,15|\"_smiles;\n+ \"C[C@@H](O)[C@@H](C)[C@@H](C)C[C@H](C1=CN=CN1)C1=CNC=N1 |o1:8,5,&1:1,3,r,c:11,18,t:9,15|\"_smiles;\n REQUIRE(mol);\n \n {\n@@ -242,7 +241,7 @@ TEST_CASE(\"MolHash with CX extensions\", \"[molhash]\") {\n auto hsh = MolHash::MolHash(&cp, MolHash::HashFunction::HetAtomTautomer);\n CHECK(\n hsh ==\n- \"C[C@H]([C@@H](C)[O])[C@@H](C)CC([C]1[CH][N][CH][N]1)[C]1[CH][N][CH][N]1_3_0\");\n+ \"C[C@H](CC([C]1[CH][N][CH][N]1)[C]1[CH][N][CH][N]1)[C@@H](C)[C@H](C)[O]_3_0\");\n }\n {\n RWMol cp(*mol);\n@@ -251,7 +250,7 @@ TEST_CASE(\"MolHash with CX extensions\", \"[molhash]\") {\n MolHash::MolHash(&cp, MolHash::HashFunction::HetAtomTautomer, true);\n CHECK(\n hsh ==\n- \"C[C@H]([C@@H](C)[O])[C@@H](C)CC([C]1[CH][N][CH][N]1)[C]1[CH][N][CH][N]1_3_0 |o1:5,&1:1,2|\");\n+ \"C[C@H](CC([C]1[CH][N][CH][N]1)[C]1[CH][N][CH][N]1)[C@@H](C)[C@H](C)[O]_3_0 |o1:1,&1:14,16|\");\n }\n }\n SECTION(\"no coordinates please\") {\ndiff --git a/Code/GraphMol/SmilesParse/catch_tests.cpp b/Code/GraphMol/SmilesParse/catch_tests.cpp\nindex 2b3f384ae39..9c34ed7ed73 100644\n--- a/Code/GraphMol/SmilesParse/catch_tests.cpp\n+++ b/Code/GraphMol/SmilesParse/catch_tests.cpp\n@@ -264,7 +264,7 @@ TEST_CASE(\"github #2257: writing cxsmiles\", \"[smiles][cxsmiles]\") {\n auto mol = \"C[C@H](F)[C@H](C)[C@@H](C)Br |a:1,o1:3,5|\"_smiles;\n REQUIRE(mol);\n auto smi = MolToCXSmiles(*mol);\n- CHECK(smi == \"C[C@@H]([C@H](C)F)[C@@H](C)Br |a:2,o1:1,5|\");\n+ CHECK(smi == \"C[C@H](F)[C@@H](C)[C@H](C)Br |a:1,o1:3,5|\");\n }\n \n SECTION(\"enhanced stereo 2\") {\n@@ -281,7 +281,7 @@ TEST_CASE(\"github #2257: writing cxsmiles\", \"[smiles][cxsmiles]\") {\n auto smi = MolToCXSmiles(*mol);\n CHECK(\n smi ==\n- \"C[C@@H]1[C@H](C)[C@H](C)N[C@H](C)[C@@H]1C1[C@@H](C)O[C@@H](C)[C@@H](C)[C@H]1C |a:9,o1:2,4,o2:14,16,&1:1,7,&2:11,18|\");\n+ \"C[C@H]1N[C@H](C)[C@H](C2[C@H](C)O[C@H](C)[C@H](C)[C@@H]2C)[C@H](C)[C@H]1C |a:5,o1:1,18,o2:10,12,&1:3,16,&2:7,14|\");\n }\n \n SECTION(\"enhanced stereo 4\") {\n@@ -2357,13 +2357,12 @@ TEST_CASE(\"Github #5683: SMARTS bond ordering should be the same as SMILES\") {\n }\n }\n \n-TEST_CASE(\"SMARTS for molecule with zero order bond should match itself\")\n-{\n- auto m = \"CN(<-[Li+])C\"_smiles;\n- m->getBondBetweenAtoms(1, 2)->setBondType(Bond::BondType::ZERO);\n- const auto sma = MolToSmarts(*m);\n- std::unique_ptr<ROMol> q{SmartsToMol(sma)};\n- SubstructMatchParameters ps;\n- ps.maxMatches = 1;\n- CHECK(SubstructMatch(*m, *q, ps).size() == 1);\n+TEST_CASE(\"SMARTS for molecule with zero order bond should match itself\") {\n+ auto m = \"CN(<-[Li+])C\"_smiles;\n+ m->getBondBetweenAtoms(1, 2)->setBondType(Bond::BondType::ZERO);\n+ const auto sma = MolToSmarts(*m);\n+ std::unique_ptr<ROMol> q{SmartsToMol(sma)};\n+ SubstructMatchParameters ps;\n+ ps.maxMatches = 1;\n+ CHECK(SubstructMatch(*m, *q, ps).size() == 1);\n }\n\\ No newline at end of file\ndiff --git a/Code/JavaWrappers/gmwrapper/src-test/org/RDKit/WrapperTests.java b/Code/JavaWrappers/gmwrapper/src-test/org/RDKit/WrapperTests.java\nindex 93755c8c603..8402c6129a7 100644\n--- a/Code/JavaWrappers/gmwrapper/src-test/org/RDKit/WrapperTests.java\n+++ b/Code/JavaWrappers/gmwrapper/src-test/org/RDKit/WrapperTests.java\n@@ -342,7 +342,7 @@ public void cdxmlReader() {\n \tassertEquals(prods.size(), 1);\n \tfor(int idx = 0; idx < prods.size(); idx++) {\n \t if(idx == 0) {\n-\t\tassertEquals(prods.get(idx).MolToSmiles(true), \"CC1(C)[C@H](C=C(Cl)Cl)[C@H]1C(=O)O[C@@H](C#N)c1cccc(Oc2ccccc2)c1\");\n+\t\tassertEquals(prods.get(idx).MolToSmiles(true), \"CC1(C)[C@H](C=C(Cl)Cl)[C@@H]1C(=O)O[C@H](C#N)c1cccc(Oc2ccccc2)c1\");\n \t }\n \t}\n \ndiff --git a/rdkit/Chem/EnumerateStereoisomers.py b/rdkit/Chem/EnumerateStereoisomers.py\nindex 6d56035bcad..3ea7e6164ba 100644\n--- a/rdkit/Chem/EnumerateStereoisomers.py\n+++ b/rdkit/Chem/EnumerateStereoisomers.py\n@@ -325,7 +325,14 @@ def EnumerateStereoisomers(m, options=StereoEnumerationOptions(), verbose=False)\n for i in range(nCenters):\n flag = bool(bitflag & (1 << i))\n flippers[i].flip(flag)\n- isomer = Chem.Mol(tm)\n+\n+ # from this point on we no longer need the stereogroups (if any are there), so\n+ # remove them:\n+ if tm.GetStereoGroups():\n+ isomer = Chem.RWMol(tm)\n+ isomer.SetStereoGroups([])\n+ else:\n+ isomer = Chem.Mol(tm)\n Chem.SetDoubleBondNeighborDirections(isomer)\n isomer.ClearComputedProps(includeRings=False)\n \n@@ -355,3 +362,18 @@ def EnumerateStereoisomers(m, options=StereoEnumerationOptions(), verbose=False)\n break\n elif verbose:\n print(\"%s failed to embed\" % (Chem.MolToSmiles(isomer, isomericSmiles=True)))\n+\n+\n+#------------------------------------\n+#\n+# doctest boilerplate\n+#\n+def _test():\n+ import doctest, sys\n+ return doctest.testmod(sys.modules[\"__main__\"])\n+\n+\n+if __name__ == '__main__':\n+ import sys\n+ failed, tried = _test()\n+ sys.exit(failed)\ndiff --git a/rdkit/Chem/UnitTestMol3D.py b/rdkit/Chem/UnitTestMol3D.py\nindex e191f737ead..4070cc948be 100755\n--- a/rdkit/Chem/UnitTestMol3D.py\n+++ b/rdkit/Chem/UnitTestMol3D.py\n@@ -101,9 +101,8 @@ def testTorsionFingerprints(self):\n self.assertAlmostEqual(tfd, 0.0691, 4)\n \n # exactly equivalent to the above since the mols each only have one conformer\n- tfd = TorsionFingerprints.GetBestTFDBetweenMolecules(mol2,mol)\n- self.assertAlmostEqual(tfd,0.0691,4)\n-\n+ tfd = TorsionFingerprints.GetBestTFDBetweenMolecules(mol2, mol)\n+ self.assertAlmostEqual(tfd, 0.0691, 4)\n \n mol.AddConformer(mol2.GetConformer(), assignId=True)\n mol.AddConformer(mol2.GetConformer(), assignId=True)\n@@ -114,9 +113,8 @@ def testTorsionFingerprints(self):\n tfdmat = TorsionFingerprints.GetTFDMatrix(mol)\n self.assertEqual(len(tfdmat), 3)\n \n- tfd = TorsionFingerprints.GetBestTFDBetweenMolecules(mol2,mol)\n- self.assertAlmostEqual(tfd,0,4)\n-\n+ tfd = TorsionFingerprints.GetBestTFDBetweenMolecules(mol2, mol)\n+ self.assertAlmostEqual(tfd, 0, 4)\n \n def testTorsionFingerprintsAtomReordering(self):\n # we use the xray structure from the paper (JCIM, 52, 1499, 2012): 1DWD\n@@ -392,6 +390,9 @@ def testEnumerateStereoisomersOnlyEnhancedStereo(self):\n # switches the centers linked by an \"OR\", but not the absolute group\n self.assertEqual(smiles, {r'C[C@H]([C@@H](C)F)[C@@H](C)Br', r'C[C@@H]([C@H](C)F)[C@@H](C)Br'})\n \n+ # we need the SMILES without the influence of the stereo groups:\n+ mol = Chem.RWMol(mol)\n+ mol.SetStereoGroups([])\n original_smiles = Chem.MolToSmiles(mol)\n self.assertIn(original_smiles, smiles)\n \n@@ -406,6 +407,7 @@ def testNoExtrasIfEnumeratingAllWithEnhancedStereo(self):\n \n opts = AllChem.StereoEnumerationOptions(onlyUnassigned=False, unique=False)\n smiles = [Chem.MolToSmiles(m) for m in AllChem.EnumerateStereoisomers(mol, opts)]\n+ print('!!!!', smiles)\n self.assertEqual(len(smiles), len(set(smiles)))\n self.assertEqual(len(smiles), 2**3)\n \n@@ -461,6 +463,13 @@ def testTryEmbeddingManyChirals(self):\n opts = AllChem.StereoEnumerationOptions(tryEmbedding=True, maxIsomers=2)\n self.assertEqual(len(list(AllChem.EnumerateStereoisomers(mol, options=opts))), 2)\n \n+ def testGithub6045(self):\n+ mol = Chem.MolFromSmiles('O[C@H](Br)[C@H](F)C |&1:1,3|')\n+ prods = list(AllChem.EnumerateStereoisomers(mol))\n+ self.assertEqual(len(prods), 2)\n+ for prod in prods:\n+ self.assertEqual(len(prod.GetStereoGroups()), 0)\n+\n \n if __name__ == '__main__':\n unittest.main()\ndiff --git a/rdkit/Chem/UnitTestRegistrationHash.py b/rdkit/Chem/UnitTestRegistrationHash.py\nindex 479c9956b5f..9edb6b3b50a 100644\n--- a/rdkit/Chem/UnitTestRegistrationHash.py\n+++ b/rdkit/Chem/UnitTestRegistrationHash.py\n@@ -100,13 +100,13 @@ def test_example_structure(self):\n \n layers = hash_sdf(structure)\n expected_layers = {\n- HashLayer.CANONICAL_SMILES: \"C[C@@H]1C[C@H](C)Nc2cc3nc(O)cc(C(F)(F)F)c3cc21 |o1:1,3|\",\n+ HashLayer.CANONICAL_SMILES: \"C[C@H]1C[C@@H](C)c2cc3c(C(F)(F)F)cc(O)nc3cc2N1 |o1:1,3|\",\n HashLayer.ESCAPE: \"\",\n HashLayer.FORMULA: \"C15H15F3N2O\",\n HashLayer.NO_STEREO_SMILES: \"CC1CC(C)c2cc3c(C(F)(F)F)cc(O)nc3cc2N1\",\n HashLayer.NO_STEREO_TAUTOMER_HASH: \"CC1CC(C)[C]2[CH][C]3[C]([CH][C]2[N]1)[N][C]([O])[CH][C]3C(F)(F)F_2_0\",\n HashLayer.SGROUP_DATA: \"[]\",\n- HashLayer.TAUTOMER_HASH: \"C[C@@H]1C[C@H](C)[N][C]2[CH][C]3[N][C]([O])[CH][C](C(F)(F)F)[C]3[CH][C]21_2_0 |o1:1,3|\",\n+ HashLayer.TAUTOMER_HASH: \"C[C@H]1C[C@@H](C)[C]2[CH][C]3[C]([CH][C]2[N]1)[N][C]([O])[CH][C]3C(F)(F)F_2_0 |o1:1,3|\",\n }\n self.assertEqual(layers, expected_layers)\n \n@@ -276,6 +276,7 @@ def test_enhanced_stereo_canonicalizer(self):\n ),\n )\n for mols_smis in groups:\n+ print()\n csmis = set()\n for smi in mols_smis:\n mol = Chem.MolFromSmiles(smi)\n@@ -631,11 +632,7 @@ def testIodine(self):\n \"\"\"Does stereo group canonicalization mess up isotopes?\"\"\"\n mol = Chem.MolFromSmiles('CC[C@H](C)[999C@H](C)O |o1:2,4|')\n layers = RegistrationHash.GetMolLayers(mol)\n- self.assertEqual(layers[HashLayer.CANONICAL_SMILES], 'CC[C@@H](C)[999C@@H](C)O |o1:2,4|')\n-\n- mol = Chem.MolFromSmiles('CC[C@H](C)[1000C@H](C)O |o1:2,4|')\n- with self.assertRaisesRegex(ValueError, expected_regex=r'does not support isotopes above 999'):\n- layers = RegistrationHash.GetMolLayers(mol)\n+ self.assertEqual(layers[HashLayer.CANONICAL_SMILES], 'CC[C@H](C)[999C@H](C)O |o1:2,4|')\n \n def testBadBondDir(self):\n \"\"\"\"\"\"\ndiff --git a/rdkit/Chem/test_list.py b/rdkit/Chem/test_list.py\nindex ef18e0a2e29..7121e573cc5 100755\n--- a/rdkit/Chem/test_list.py\n+++ b/rdkit/Chem/test_list.py\n@@ -10,6 +10,7 @@\n (\"python\", \"UnitTestFunctionalGroups.py\", {}), (\"python\", \"UnitTestCrippen.py\", {}),\n (\"python\", \"UnitTestPandasTools.py\", {}), (\"python\", \"UnitTestDocTestsChem.py\", {}),\n (\"python\", \"UnitTestFeatFinderCLI.py\", {}), (\"python\", \"UnitTestQED.py\", {}),\n+ (\"python\", \"BRICS.py\", {}), (\"python\", \"EnumerateStereoisomers.py\", {}),\n (\"python\", \"UnitTestSaltRemover.py\", {}), (\"python\", \"test_list.py\", {\n 'dir': 'AtomPairs'\n }), (\"python\", \"test_list.py\", {\n@@ -40,8 +41,7 @@\n 'dir': 'Features'\n }), (\"python\", \"test_list.py\", {\n 'dir': 'MolStandardize'\n- }), \n- (\"python\", \"UnitTestRegistrationHash.py\", {})]\n+ }), (\"python\", \"UnitTestRegistrationHash.py\", {})]\n \n # only attempt the MolKey tests if we have the pre-reqs:\n try:\n", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}219{"question_id": "MSB_rdkit_rdkit_pr6189", "question_type": "multi_swe_bench", "description": "Fixes #5883 (rdkit/rdkit#6189)", "content": {"org": "rdkit", "repo": "rdkit", "pr_number": 6189, "issue_title": "Fixes #5883", "issue_body": "The fix here is to recognize that the expected chiral volume for three-coordinate atoms is smaller than that for four-coordinate atoms.\r\nThe corrected value here is empirical", "base_commit": "7b139a227632c92c6755566261791e1af29ea8fe", "resolved_issues": [{"number": 5883, "title": "Conformer Generation Fails for three-coordinate Ns with specified stereo", "body": "**Describe the bug**\r\nRDKit doesn't seem to be able to generate conformers for a three-membered ring with two nitrogen atoms if stereocenters are specified.\r\n\r\n**To Reproduce**\r\n\r\n```python\r\nfrom rdkit.Chem import AllChem\r\n\r\nmol = AllChem.AddHs(AllChem.MolFromSmiles(\"N1NC1\"))\r\n\r\nc1 = AllChem.Mol(mol, quickCopy=False)\r\nAllChem.AssignStereochemistry(c1, flagPossibleStereoCenters=False)\r\n\r\nfor isomer in AllChem.EnumerateStereoisomers(c1):\r\n AllChem.EmbedMolecule(isomer)\r\n assert isomer.GetNumConformers() == 1\r\n\r\nc2 = AllChem.Mol(mol, quickCopy=False)\r\nAllChem.AssignStereochemistry(c2, flagPossibleStereoCenters=True) # flagPossibleStereoCenters\r\n\r\nfor isomer in AllChem.EnumerateStereoisomers(c2):\r\n AllChem.EmbedMolecule(isomer)\r\n assert isomer.GetNumConformers() == 1 # Fails\r\n```\r\n\r\n**Configuration**\r\n - RDKit version: 2022.09.1, py38h5acb366_1, conda-forge\r\n - OS: Ubuntu 20.04"}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/rdkit_m_rdkit:pr-6189", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/Code/GraphMol/DistGeomHelpers/Embedder.cpp b/Code/GraphMol/DistGeomHelpers/Embedder.cpp\nindex d1bf33610ab..6613466a846 100644\n--- a/Code/GraphMol/DistGeomHelpers/Embedder.cpp\n+++ b/Code/GraphMol/DistGeomHelpers/Embedder.cpp\n@@ -34,13 +34,14 @@\n #include <boost/dynamic_bitset.hpp>\n #include <iomanip>\n #include <RDGeneral/RDThreads.h>\n+#include <typeinfo>\n \n #ifdef RDK_BUILD_THREADSAFE_SSS\n #include <future>\n #include <mutex>\n #endif\n \n-//#define DEBUG_EMBEDDING 1\n+// #define DEBUG_EMBEDDING 1\n \n #ifdef M_PI_2\n #undef M_PI_2\n@@ -1016,7 +1017,13 @@ void findChiralSets(const ROMol &mol, DistGeom::VECT_CHIRALSET &chiralCenters,\n // we should at least have 3 though\n CHECK_INVARIANT(nbrs.size() >= 3, \"Cannot be a chiral center\");\n \n+ double volLowerBound = 5.0;\n+ double volUpperBound = 100.0;\n+\n if (nbrs.size() < 4) {\n+ // we get lower volumes if there are three neighbors,\n+ // this was github #5883\n+ volLowerBound = 2.0;\n nbrs.insert(nbrs.end(), atom->getIdx());\n }\n \n@@ -1024,13 +1031,15 @@ void findChiralSets(const ROMol &mol, DistGeom::VECT_CHIRALSET &chiralCenters,\n // volume\n if (chiralType == Atom::CHI_TETRAHEDRAL_CCW) {\n // positive chiral volume\n- auto *cset = new DistGeom::ChiralSet(atom->getIdx(), nbrs[0], nbrs[1],\n- nbrs[2], nbrs[3], 5.0, 100.0);\n+ auto *cset =\n+ new DistGeom::ChiralSet(atom->getIdx(), nbrs[0], nbrs[1], nbrs[2],\n+ nbrs[3], volLowerBound, volUpperBound);\n DistGeom::ChiralSetPtr cptr(cset);\n chiralCenters.push_back(cptr);\n } else if (chiralType == Atom::CHI_TETRAHEDRAL_CW) {\n- auto *cset = new DistGeom::ChiralSet(atom->getIdx(), nbrs[0], nbrs[1],\n- nbrs[2], nbrs[3], -100.0, -5.0);\n+ auto *cset =\n+ new DistGeom::ChiralSet(atom->getIdx(), nbrs[0], nbrs[1], nbrs[2],\n+ nbrs[3], -volUpperBound, -volLowerBound);\n DistGeom::ChiralSetPtr cptr(cset);\n chiralCenters.push_back(cptr);\n } else {\ndiff --git a/ReleaseNotes.md b/ReleaseNotes.md\nindex 7597e8342ec..ed8dcd520ab 100644\n--- a/ReleaseNotes.md\n+++ b/ReleaseNotes.md\n@@ -11,6 +11,8 @@\n - The canonical SMILES and CXSMILES generated for molecules with enhanced stereochemistry (stereo groups) is different than in previous releases. The enhanced stereochemistry information and the stereo groups themselves are now canonical. This does *not* affect molecules which do not have enhanced stereo and will not have any effect if you generate non-isomeric SMILES. This change also affects the output of the MolHash and RegistrationHash code when applied to molecules with enhanced stereo.\n - The doIsomericSmiles parameter in Java and C# ROMol.MolToSmiles() now defaults to true (previously it was false), thus aligning to the C++ and Python behavior.\n - Double bonds which are marked as crossed (i.e. `bond.GetBondDir() == Bond.BondDir.EITHERDOUBLE`) now have their BondStereo set to `Bond.BondStereo.STEREOANY` and the BondDir information removed by default when molecules are parsed or `AssignStereochemistry()` is called with the `cleanIt` argument set to True.\n+- The conformers generated for molecules with three-coordinate chiral centers will be somewhat different due to the fix for #5883.\n+\n \n ## Bug Fixes:\n \n"}, "test": {"test_patch": "diff --git a/Code/GraphMol/DistGeomHelpers/Wrap/testDistGeom.py b/Code/GraphMol/DistGeomHelpers/Wrap/testDistGeom.py\nindex 0af5cd38b23..7cce5a0827f 100644\n--- a/Code/GraphMol/DistGeomHelpers/Wrap/testDistGeom.py\n+++ b/Code/GraphMol/DistGeomHelpers/Wrap/testDistGeom.py\n@@ -274,7 +274,7 @@ def test6Chirality(self):\n self.assertTrue(nPos > 0)\n self.assertTrue(nNeg > 0)\n \n- tgtVol = 5.0\n+ tgtVol = 3.0\n for i in range(10):\n smiles = \"Cl[C@H](F)Br\"\n mol = Chem.MolFromSmiles(smiles)\ndiff --git a/Code/GraphMol/DistGeomHelpers/catch_tests.cpp b/Code/GraphMol/DistGeomHelpers/catch_tests.cpp\nindex 695a2d76981..2f3bb6df834 100644\n--- a/Code/GraphMol/DistGeomHelpers/catch_tests.cpp\n+++ b/Code/GraphMol/DistGeomHelpers/catch_tests.cpp\n@@ -589,32 +589,29 @@ TEST_CASE(\"double bond stereo not honored in conformer generator\") {\n }\n }\n \n-TEST_CASE(\"tracking failure causes\") {\n- SECTION(\"basics\") {\n- // auto mol = \"CCNS(=O)(=O)c1ccccc1\"_smiles;\n- // auto mol = \"c2cccc3c2OC2=CC=CC[C@H]23\"_smiles;\n+TEST_CASE(\"tracking failure causes\"){SECTION(\"basics\"){\n auto mol =\n \"C=CC1=C(N)Oc2cc1c(-c1cc(C(C)O)cc(=O)cc1C1NCC(=O)N1)c(OC)c2OC\"_smiles;\n- REQUIRE(mol);\n- MolOps::addHs(*mol);\n- DGeomHelpers::EmbedParameters ps = DGeomHelpers::ETKDGv3;\n- ps.randomSeed = 0xf00d;\n- ps.trackFailures = true;\n- ps.maxIterations = 50;\n- ps.randomSeed = 42;\n- auto cid = DGeomHelpers::EmbedMolecule(*mol, ps);\n- CHECK(cid < 0);\n-\n- CHECK(ps.failures[DGeomHelpers::EmbedFailureCauses::INITIAL_COORDS] > 5);\n- CHECK(ps.failures[DGeomHelpers::EmbedFailureCauses::ETK_MINIMIZATION] > 10);\n-\n- auto fail_cp = ps.failures;\n- // make sure we reset the counts each time\n- cid = DGeomHelpers::EmbedMolecule(*mol, ps);\n- CHECK(ps.failures == fail_cp);\n- }\n- SECTION(\"chirality\") {\n- auto mol = R\"CTAB(\n+REQUIRE(mol);\n+MolOps::addHs(*mol);\n+DGeomHelpers::EmbedParameters ps = DGeomHelpers::ETKDGv3;\n+ps.randomSeed = 0xf00d;\n+ps.trackFailures = true;\n+ps.maxIterations = 50;\n+ps.randomSeed = 42;\n+auto cid = DGeomHelpers::EmbedMolecule(*mol, ps);\n+CHECK(cid < 0);\n+\n+CHECK(ps.failures[DGeomHelpers::EmbedFailureCauses::INITIAL_COORDS] > 5);\n+CHECK(ps.failures[DGeomHelpers::EmbedFailureCauses::ETK_MINIMIZATION] > 10);\n+\n+auto fail_cp = ps.failures;\n+// make sure we reset the counts each time\n+cid = DGeomHelpers::EmbedMolecule(*mol, ps);\n+CHECK(ps.failures == fail_cp);\n+}\n+SECTION(\"chirality\") {\n+ auto mol = R\"CTAB(\n Ketcher 1102315302D 1 1.00000 0.00000 0\n \n 10 11 0 0 1 0 0 0 0 0999 V2000\n@@ -641,39 +638,74 @@ TEST_CASE(\"tracking failure causes\") {\n 4 10 1 1 0 0\n M END\n )CTAB\"_ctab;\n+ REQUIRE(mol);\n+ MolOps::addHs(*mol);\n+ DGeomHelpers::EmbedParameters ps = DGeomHelpers::ETKDGv3;\n+ ps.randomSeed = 0xf00d;\n+ ps.trackFailures = true;\n+ ps.maxIterations = 50;\n+ auto cid = DGeomHelpers::EmbedMolecule(*mol, ps);\n+ CHECK(cid < 0);\n+ CHECK(ps.failures[DGeomHelpers::EmbedFailureCauses::INITIAL_COORDS] > 5);\n+ CHECK(ps.failures[DGeomHelpers::EmbedFailureCauses::FINAL_CHIRAL_BOUNDS] > 5);\n+}\n+\n+#ifdef RDK_TEST_MULTITHREADED\n+SECTION(\"multithreaded\") {\n+ auto mol =\n+ \"C=CC1=C(N)Oc2cc1c(-c1cc(C(C)O)cc(=O)cc1C1NCC(=O)N1)c(OC)c2OC\"_smiles;\n+ REQUIRE(mol);\n+ MolOps::addHs(*mol);\n+ DGeomHelpers::EmbedParameters ps = DGeomHelpers::ETKDGv3;\n+ ps.randomSeed = 0xf00d;\n+ ps.trackFailures = true;\n+ ps.maxIterations = 10;\n+ ps.randomSeed = 42;\n+ auto cids = DGeomHelpers::EmbedMultipleConfs(*mol, 20, ps);\n+\n+ DGeomHelpers::EmbedParameters ps2 = ps;\n+ ps2.numThreads = 4;\n+\n+ auto cids2 = DGeomHelpers::EmbedMultipleConfs(*mol, 20, ps2);\n+ CHECK(cids2 == cids);\n+\n+ CHECK(ps.failures == ps2.failures);\n+}\n+#endif\n+}\n+\n+TEST_CASE(\"Github #5883: confgen failing for chiral N in a three ring\") {\n+ SECTION(\"basics1\") {\n+ auto mol = \"N1[C@H-]C1\"_smiles;\n REQUIRE(mol);\n MolOps::addHs(*mol);\n+ mol->getAtomWithIdx(1)->setChiralTag(Atom::ChiralType::CHI_TETRAHEDRAL_CCW);\n DGeomHelpers::EmbedParameters ps = DGeomHelpers::ETKDGv3;\n- ps.randomSeed = 0xf00d;\n- ps.trackFailures = true;\n- ps.maxIterations = 50;\n+ ps.randomSeed = 42;\n+ ps.maxIterations = 1;\n auto cid = DGeomHelpers::EmbedMolecule(*mol, ps);\n- CHECK(cid < 0);\n- CHECK(ps.failures[DGeomHelpers::EmbedFailureCauses::INITIAL_COORDS] > 5);\n- CHECK(ps.failures[DGeomHelpers::EmbedFailureCauses::FINAL_CHIRAL_BOUNDS] >\n- 5);\n+ CHECK(cid >= 0);\n }\n-\n-#ifdef RDK_TEST_MULTITHREADED\n- SECTION(\"multithreaded\") {\n- auto mol =\n- \"C=CC1=C(N)Oc2cc1c(-c1cc(C(C)O)cc(=O)cc1C1NCC(=O)N1)c(OC)c2OC\"_smiles;\n+ SECTION(\"basics2\") {\n+ auto mol = \"N1[N@H]C1\"_smiles;\n REQUIRE(mol);\n MolOps::addHs(*mol);\n+ mol->getAtomWithIdx(1)->setChiralTag(Atom::ChiralType::CHI_TETRAHEDRAL_CCW);\n DGeomHelpers::EmbedParameters ps = DGeomHelpers::ETKDGv3;\n- ps.randomSeed = 0xf00d;\n- ps.trackFailures = true;\n- ps.maxIterations = 10;\n ps.randomSeed = 42;\n- auto cids = DGeomHelpers::EmbedMultipleConfs(*mol, 20, ps);\n-\n- DGeomHelpers::EmbedParameters ps2 = ps;\n- ps2.numThreads = 4;\n-\n- auto cids2 = DGeomHelpers::EmbedMultipleConfs(*mol, 20, ps2);\n- CHECK(cids2 == cids);\n-\n- CHECK(ps.failures == ps2.failures);\n+ ps.maxIterations = 1;\n+ auto cid = DGeomHelpers::EmbedMolecule(*mol, ps);\n+ CHECK(cid >= 0);\n+ }\n+ SECTION(\"no ring\") {\n+ auto mol = \"N[C@H-]C\"_smiles;\n+ REQUIRE(mol);\n+ MolOps::addHs(*mol);\n+ mol->getAtomWithIdx(1)->setChiralTag(Atom::ChiralType::CHI_TETRAHEDRAL_CCW);\n+ DGeomHelpers::EmbedParameters ps = DGeomHelpers::ETKDGv3;\n+ ps.randomSeed = 42;\n+ ps.maxIterations = 1;\n+ auto cid = DGeomHelpers::EmbedMolecule(*mol, ps);\n+ CHECK(cid >= 0);\n }\n-#endif\n }\n\\ No newline at end of file\n", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}220{"question_id": "MSB_rdkit_rdkit_pr6193", "question_type": "multi_swe_bench", "description": "Fix/github6138 (rdkit/rdkit#6193)", "content": {"org": "rdkit", "repo": "rdkit", "pr_number": 6193, "issue_title": "Fix/github6138", "issue_body": "Fixed #6138 \r\n\r\nThere are a few atom properties that are not pickled properly after ChemReaction::validate has been called.\r\n\r\nThese are \r\n\r\n _QueryIsotope\r\n _QueryFormalCharge\r\n\r\nand the like.\r\n\r\nThis ensures they are pickled if the reaction has been initialized.", "base_commit": "7b139a227632c92c6755566261791e1af29ea8fe", "resolved_issues": [{"number": 6138, "title": "Round-tripping a reaction through pickle changes the outputs from RunReactants", "body": "**Describe the bug**\r\n\r\nRDKit's reaction objects can be pickled/unpickled, but in some cases running the unpickled reaction can produce slightly different results than it did before the pickling. Interestingly, in my example it only happens if the reaction was ran at least once _before_ pickling, otherwise there are no issues.\r\n\r\n**To Reproduce**\r\n```python\r\nimport pickle\r\nfrom rdkit import Chem\r\nfrom rdkit.Chem import AllChem\r\n\r\nmol = Chem.MolFromSmiles(\"COc1ccccc1Oc1nc(Nc2cc(C)[nH]n2)cc2ccccc12\")\r\nrxn = AllChem.ReactionFromSmarts(\"([c:1]:[n&H1&+0&D2:3]:[n:2])>>([c:1]:[n&H0&+0&D3:3](:[n:2])-C1-C-C-C-C-O-1)\")\r\n\r\ndef run(r):\r\n return Chem.MolToSmiles(r.RunReactants((mol,))[0][0])\r\n\r\npickle.dump(rxn, open(\"tmp.pkl\", \"wb\"))\r\nrxn_reloaded = pickle.load(open(\"tmp.pkl\", \"rb\"))\r\n\r\nprint(run(rxn))\r\nprint(run(rxn_reloaded))\r\n\r\npickle.dump(rxn, open(\"tmp_after.pkl\", \"wb\"))\r\nrxn_reloaded_after_use = pickle.load(open(\"tmp_after.pkl\", \"rb\"))\r\n\r\nprint(run(rxn_reloaded_after_use))\r\n```\r\n\r\nOutputs:\r\n```\r\nCOc1ccccc1Oc1nc(Nc2cc(C)n(C3CCCCO3)n2)cc2ccccc12\r\nCOc1ccccc1Oc1nc(Nc2cc(C)n(C3CCCCO3)n2)cc2ccccc12\r\nCOc1ccccc1Oc1nc(Nc2cc(C)[nH](C3CCCCO3)n2)cc2ccccc12\r\n```\r\n\r\nWhile the original SMILES can be correctly parsed by RDKit, the one obtained with the unpickled reaction can no longer be parsed.\r\n\r\n**Expected behavior**\r\n\r\nResult after round-tripping through pickle should be the same.\r\n\r\n**Configuration (please complete the following information):**\r\n - RDKit version: 2021.09.4\r\n - OS: Ubuntu 16.04.6 LTS\r\n - Python version: 3.9.7\r\n - Are you using conda? Yes\r\n - If you are using conda, which channel did you install the rdkit from? conda-forge\r\n"}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/rdkit_m_rdkit:pr-6193", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/Code/GraphMol/ChemReactions/ReactionPickler.cpp b/Code/GraphMol/ChemReactions/ReactionPickler.cpp\nindex 9450fbebfc3..9a4822e43a6 100644\n--- a/Code/GraphMol/ChemReactions/ReactionPickler.cpp\n+++ b/Code/GraphMol/ChemReactions/ReactionPickler.cpp\n@@ -146,15 +146,18 @@ void ReactionPickler::_pickle(const ChemicalReaction *rxn, std::ostream &ss,\n streamWrite(ss, BEGINREACTANTS);\n for (auto tmpl = rxn->beginReactantTemplates();\n tmpl != rxn->endReactantTemplates(); ++tmpl) {\n- MolPickler::pickleMol(tmpl->get(), ss);\n+ auto props = rxn->df_needsInit ? PicklerOps::PropertyPickleOptions::NoProps :\n+ PicklerOps::PropertyPickleOptions::AllProps;\n+ MolPickler::pickleMol(tmpl->get(), ss, props);\n }\n streamWrite(ss, ENDREACTANTS);\n \n streamWrite(ss, BEGINPRODUCTS);\n for (auto tmpl = rxn->beginProductTemplates();\n tmpl != rxn->endProductTemplates(); ++tmpl) {\n- MolPickler::pickleMol(tmpl->get(), ss,\n- PicklerOps::PropertyPickleOptions::AtomProps);\n+ auto props = rxn->df_needsInit ? PicklerOps::PropertyPickleOptions::AtomProps :\n+ PicklerOps::PropertyPickleOptions::AllProps;\n+ MolPickler::pickleMol(tmpl->get(), ss, props);\n }\n streamWrite(ss, ENDPRODUCTS);\n \n@@ -162,7 +165,8 @@ void ReactionPickler::_pickle(const ChemicalReaction *rxn, std::ostream &ss,\n streamWrite(ss, BEGINAGENTS);\n for (auto tmpl = rxn->beginAgentTemplates();\n tmpl != rxn->endAgentTemplates(); ++tmpl) {\n- MolPickler::pickleMol(tmpl->get(), ss);\n+ // reagents don't have private properties set during initialization\n+ MolPickler::pickleMol(tmpl->get(), ss, PicklerOps::PropertyPickleOptions::AtomProps);\n }\n streamWrite(ss, ENDAGENTS);\n }\n"}, "test": {"test_patch": "diff --git a/Code/GraphMol/ChemReactions/Wrap/testReactionWrapper.py b/Code/GraphMol/ChemReactions/Wrap/testReactionWrapper.py\nindex 4879a96869c..87011e6b296 100644\n--- a/Code/GraphMol/ChemReactions/Wrap/testReactionWrapper.py\n+++ b/Code/GraphMol/ChemReactions/Wrap/testReactionWrapper.py\n@@ -38,7 +38,7 @@\n \n from rdkit import rdBase\n from rdkit import Chem\n-from rdkit.Chem import rdChemReactions\n+from rdkit.Chem import AllChem, rdChemReactions\n from rdkit import Geometry\n from rdkit import RDConfig\n from rdkit.Chem.SimpleEnum import Enumerator\n@@ -1082,6 +1082,21 @@ def testV3000Reactions(self):\n \n self.assertEqual(reaction.GetNumReactantTemplates(), reaction2.GetNumReactantTemplates())\n \n+ def testGithub6138(self):\n+ mol = Chem.MolFromSmiles(\"COc1ccccc1Oc1nc(Nc2cc(C)[nH]n2)cc2ccccc12\")\n+ rxn = AllChem.ReactionFromSmarts(\"([c:1]:[n&H1&+0&D2:3]:[n:2])>>([c:1]:[n&H0&+0&D3:3](:[n:2])-C1-C-C-C-C-O-1)\")\n+\n+ def run(r):\n+ return Chem.MolToSmiles(r.RunReactants((mol,))[0][0])\n+\n+ rxn_reloaded = pickle.loads(pickle.dumps(rxn))\n+\n+ res1 = Chem.MolToSmiles(rxn.RunReactants((mol,))[0][0])\n+ res2 = Chem.MolToSmiles(rxn_reloaded.RunReactants((mol,))[0][0])\n+ rxn_reloaded_after_use = pickle.loads(pickle.dumps(rxn))\n+ res3 = Chem.MolToSmiles(rxn_reloaded_after_use.RunReactants((mol,))[0][0])\n+ self.assertEqual(res1, res2)\n+ self.assertEqual(res1, res3)\n \n if __name__ == '__main__':\n unittest.main(verbosity=True)\ndiff --git a/Code/GraphMol/ChemReactions/testReaction.cpp b/Code/GraphMol/ChemReactions/testReaction.cpp\nindex 6c33c23eab6..3466cc3e0a2 100644\n--- a/Code/GraphMol/ChemReactions/testReaction.cpp\n+++ b/Code/GraphMol/ChemReactions/testReaction.cpp\n@@ -7775,6 +7775,26 @@ void testChemicalReactionCopyAssignment() {\n delete rxn2;\n }\n \n+void testGithub6138() {\n+ // Pickling reactions removed some of their properties set after reaction\n+ // initialization\n+ auto rxn_smarts = \"[c:1]:[n&H1&+0&D2:3]:[n:2]>>[c:1]:[3n&H0&+0&D3:3]:[2n:2]\";\n+ std::unique_ptr<ChemicalReaction> rxn(RxnSmartsToChemicalReaction(rxn_smarts));\n+ ROMOL_SPTR mol(\"c1cn[nH]c1\"_smiles);\n+ rxn->initReactantMatchers();\n+ MOL_SPTR_VECT reacts;\n+ reacts.push_back(mol);\n+ auto prods = rxn->runReactants(reacts);\n+ std::string pkl;\n+ ReactionPickler::pickleReaction(*rxn, pkl);\n+ std::unique_ptr<ChemicalReaction> lrxn(new ChemicalReaction());\n+ ReactionPickler::reactionFromPickle(pkl, lrxn.get());\n+ auto prods2 = lrxn->runReactants(reacts);\n+ auto s1 =MolToSmiles(*prods[0][0]);\n+ auto s2 =MolToSmiles(*prods2[0][0]);\n+ TEST_ASSERT(s1 == s2);\n+}\n+\n int main() {\n RDLog::InitLogs();\n \n@@ -7874,6 +7894,7 @@ int main() {\n testGithub4410();\n testMultiTemplateRxnQueries();\n testChemicalReactionCopyAssignment();\n+ testGithub6138();\n \n BOOST_LOG(rdInfoLog)\n << \"*******************************************************\\n\";\n", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}221{"question_id": "MSB_rdkit_rdkit_pr6231", "question_type": "multi_swe_bench", "description": "Do not include dative bonds in ring finding by default (rdkit/rdkit#6231)", "content": {"org": "rdkit", "repo": "rdkit", "pr_number": 6231, "issue_title": "Do not include dative bonds in ring finding by default", "issue_body": "Fixes #6058 \r\n\r\nThe fix here is to add a new `includeDativeBonds` option to the ring-finding code which is disabled by default (i.e. dative bonds are not included in ring finding by default).\r\n\r\nThis necessitates a small tweak to the 2D coordinate generation code, which should take dative bonds into account (at least for some systems, it might be worth coming back to this at some point and ignoring the three-rings formed by haptic systems in the depiction code).\r\n", "base_commit": "b846f122d54b3c41081ae92ad7b0c00cb444c15a", "resolved_issues": [{"number": 6058, "title": "Bad drawing of ferrocene", "body": "\r\n-----------------------------------------\r\n\r\n**Describe the bug**\r\nDrawing a representation of ferrocene where the bonds to the Fe are represented by dative bonds from the relevant carbon atoms gives rise to double bonds in ugly places.\r\n\r\n**To Reproduce**\r\n```\r\nfrom rdkit import Chem\r\nfrom rdkit.Chem.Draw import rdMolDraw2D, rdDepictor\r\n\r\nmolblock = \"\"\"ferrocene\r\n RDKit 2D\r\n\r\n 0 0 0 0 0 0 0 0 0 0999 V3000\r\nM V30 BEGIN CTAB\r\nM V30 COUNTS 11 20 0 0 0\r\nM V30 BEGIN ATOM\r\nM V30 1 C -34.237900 13.261800 0.000000 0 CHG=-1\r\nM V30 2 C -35.057400 14.266900 0.000000 0\r\nM V30 3 C -37.855700 14.284400 0.000000 0\r\nM V30 4 C -38.759100 13.293300 0.000000 0\r\nM V30 5 C -36.552000 12.683200 0.000000 0\r\nM V30 6 C -34.152900 8.363300 0.000000 0 CHG=-1\r\nM V30 7 C -34.972400 9.368400 0.000000 0\r\nM V30 8 C -37.770600 9.385900 0.000000 0\r\nM V30 9 C -38.674100 8.394800 0.000000 0\r\nM V30 10 C -36.450300 7.767900 0.000000 0\r\nM V30 11 Fe -36.435100 10.904500 0.000000 0 CHG=2 VAL=10\r\nM V30 END ATOM\r\nM V30 BEGIN BOND\r\nM V30 1 1 1 5\r\nM V30 2 2 4 5\r\nM V30 3 1 4 3\r\nM V30 4 2 2 3\r\nM V30 5 1 1 2\r\nM V30 6 1 6 10\r\nM V30 7 2 9 10\r\nM V30 8 1 9 8\r\nM V30 9 2 7 8\r\nM V30 10 1 6 7\r\nM V30 11 9 2 11\r\nM V30 12 9 3 11\r\nM V30 13 9 4 11\r\nM V30 14 9 5 11\r\nM V30 15 9 1 11\r\nM V30 16 9 7 11\r\nM V30 17 9 8 11\r\nM V30 18 9 9 11\r\nM V30 19 9 10 11\r\nM V30 20 9 6 11\r\nM V30 END BOND\r\nM V30 END CTAB\r\nM END\r\n\"\"\"\r\n\r\nmol = Chem.MolFromMolBlock(molblock)\r\nd = rdMolDraw2D.MolDraw2DSVG(500, 500)\r\nrdMolDraw2D.PrepareAndDrawMolecule(d, mol)\r\nd.FinishDrawing()\r\ntxt = d.GetDrawingText()\r\nwith open('bad_ferrocene.svg', 'w') as f:\r\n f.write(txt)\r\n```\r\n\r\n**Expected behavior**\r\nThe double bonds should be shown with the second line inside the cyclopentadiene.\r\n\r\n**Screenshots**\r\n\r\n\r\n\r\n\r\n**Configuration (please complete the following information):**\r\n - RDKit version: current master\r\n - OS: macOS Ventura 13.2 Apple silicon\r\n - Python version (if relevant): 3.10.4\r\n - Are you using conda? No\r\n - If you are using conda, which channel did you install the rdkit from?\r\n - If you are not using conda: how did you install the RDKit? build from scratch\r\n\r\n**Additional context**\r\n2022.09.4 gives a different, even more horrible result, but that's already been fixed, I think.\r\nFix in development.\r\n\r\n"}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/rdkit_m_rdkit:pr-6231", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/Code/GraphMol/Depictor/RDDepictor.cpp b/Code/GraphMol/Depictor/RDDepictor.cpp\nindex cf9be5d3fad..32e9b68b582 100644\n--- a/Code/GraphMol/Depictor/RDDepictor.cpp\n+++ b/Code/GraphMol/Depictor/RDDepictor.cpp\n@@ -269,8 +269,8 @@ void embedFusedSystems(const RDKit::ROMol &mol,\n bool allowRingTemplates = useRingTemplates;\n if (useRingTemplates && coordMap) {\n boost::dynamic_bitset<> coordMapAtoms(mol.getNumAtoms());\n- for (const auto& ring : frings) {\n- for (const auto& aid : ring) {\n+ for (const auto &ring : frings) {\n+ for (const auto &aid : ring) {\n if (coordMap->find(aid) != coordMap->end()) {\n coordMapAtoms.set(aid);\n }\n@@ -420,7 +420,8 @@ void computeInitialCoords(RDKit::ROMol &mol,\n RDKit::VECT_INT_VECT arings;\n \n // first find all the rings\n- RDKit::MolOps::symmetrizeSSSR(mol, arings);\n+ bool includeDativeBonds = true;\n+ RDKit::MolOps::symmetrizeSSSR(mol, arings, includeDativeBonds);\n \n // do stereochemistry\n RDKit::MolOps::assignStereochemistry(mol, false);\n@@ -439,7 +440,8 @@ void computeInitialCoords(RDKit::ROMol &mol,\n \n if (arings.size() > 0) {\n // first deal with the fused rings\n- DepictorLocal::embedFusedSystems(mol, arings, efrags, coordMap, useRingTemplates);\n+ DepictorLocal::embedFusedSystems(mol, arings, efrags, coordMap,\n+ useRingTemplates);\n }\n \n // do non-tetrahedral stereo\n@@ -555,7 +557,7 @@ unsigned int compute2DCoords(RDKit::ROMol &mol,\n //\n //\n unsigned int compute2DCoords(RDKit::ROMol &mol,\n- const Compute2DCoordParameters& params) {\n+ const Compute2DCoordParameters ¶ms) {\n if (mol.needsUpdatePropertyCache()) {\n mol.updatePropertyCache(false);\n }\n@@ -570,9 +572,11 @@ unsigned int compute2DCoords(RDKit::ROMol &mol,\n return cid;\n };\n #endif\n+\n+ RDKit::ROMol cp(mol);\n // storage for pieces of a molecule/s that are embedded in 2D\n std::list<EmbeddedFrag> efrags;\n- computeInitialCoords(mol, params.coordMap, efrags, params.useRingTemplates);\n+ computeInitialCoords(cp, params.coordMap, efrags, params.useRingTemplates);\n \n #if 1\n // perform random sampling here to improve the density\n@@ -581,9 +585,9 @@ unsigned int compute2DCoords(RDKit::ROMol &mol,\n // bonds in the structure or flip only bonds along the shortest\n // path between colliding atoms - don't do both\n if ((params.nSamples > 0) && (params.nFlipsPerSample > 0)) {\n- eri.randomSampleFlipsAndPermutations(params.nFlipsPerSample, params.nSamples,\n- params.sampleSeed, nullptr, 0.0,\n- params.permuteDeg4Nodes);\n+ eri.randomSampleFlipsAndPermutations(\n+ params.nFlipsPerSample, params.nSamples, params.sampleSeed, nullptr,\n+ 0.0, params.permuteDeg4Nodes);\n } else {\n eri.removeCollisionsBondFlip();\n }\ndiff --git a/Code/GraphMol/FindRings.cpp b/Code/GraphMol/FindRings.cpp\nindex 77282ea7527..20543537d8c 100644\n--- a/Code/GraphMol/FindRings.cpp\n+++ b/Code/GraphMol/FindRings.cpp\n@@ -67,6 +67,15 @@ void convertToBonds(const VECT_INT_VECT &res, VECT_INT_VECT &brings,\n \n } // end of namespace RingUtils\n \n+namespace RDKit {\n+namespace {\n+bool bondIsDative(const RDKit::Bond &bond) {\n+ auto bt = bond.getBondType();\n+ return bt == Bond::BondType::DATIVE || bt == Bond::BondType::DATIVEL ||\n+ bt == Bond::BondType::DATIVER || bt == Bond::BondType::DATIVEONE;\n+}\n+} // namespace\n+} // namespace RDKit\n namespace FindRings {\n using namespace RDKit;\n \n@@ -847,16 +856,16 @@ bool findRingConnectingAtoms(const ROMol &tMol, const Bond *bond,\n \n namespace RDKit {\n namespace MolOps {\n-int findSSSR(const ROMol &mol, VECT_INT_VECT *res) {\n+int findSSSR(const ROMol &mol, VECT_INT_VECT *res, bool includeDativeBonds) {\n if (!res) {\n VECT_INT_VECT rings;\n- return findSSSR(mol, rings);\n+ return findSSSR(mol, rings, includeDativeBonds);\n } else {\n- return findSSSR(mol, (*res));\n+ return findSSSR(mol, (*res), includeDativeBonds);\n }\n }\n \n-int findSSSR(const ROMol &mol, VECT_INT_VECT &res) {\n+int findSSSR(const ROMol &mol, VECT_INT_VECT &res, bool includeDativeBonds) {\n res.resize(0);\n if (mol.getRingInfo()->isInitialized()) {\n mol.getRingInfo()->reset();\n@@ -871,12 +880,14 @@ int findSSSR(const ROMol &mol, VECT_INT_VECT &res) {\n boost::dynamic_bitset<> activeBonds(nbnds);\n activeBonds.set();\n \n- // Zero-order bonds are not candidates for rings\n+ // Zero-order bonds are not candidates for rings, and dative bonds may also be\n+ // out\n ROMol::EDGE_ITER firstB, lastB;\n boost::tie(firstB, lastB) = mol.getEdges();\n while (firstB != lastB) {\n const Bond *bond = mol[*firstB];\n- if (bond->getBondType() == Bond::ZERO) {\n+ if (bond->getBondType() == Bond::ZERO ||\n+ (!includeDativeBonds && bondIsDative(*bond))) {\n activeBonds[bond->getIdx()] = 0;\n }\n ++firstB;\n@@ -892,14 +903,11 @@ int findSSSR(const ROMol &mol, VECT_INT_VECT &res) {\n int deg = atom->getDegree();\n atomDegrees[i] = deg;\n atomDegreesWithZeroOrderBonds[i] = deg;\n- ROMol::OEDGE_ITER beg, end;\n- boost::tie(beg, end) = mol.getAtomBonds(atom);\n- while (beg != end) {\n- const Bond *bond = mol[*beg];\n- if (bond->getBondType() == Bond::ZERO) {\n+ for (const auto bond : mol.atomBonds(atom)) {\n+ if (bond->getBondType() == Bond::ZERO ||\n+ (!includeDativeBonds && bondIsDative(*bond))) {\n atomDegrees[i]--;\n }\n- ++beg;\n }\n }\n \n@@ -1117,18 +1125,18 @@ int findSSSR(const ROMol &mol, VECT_INT_VECT &res) {\n return rdcast<int>(res.size());\n }\n \n-int symmetrizeSSSR(ROMol &mol) {\n+int symmetrizeSSSR(ROMol &mol, bool includeDativeBonds) {\n VECT_INT_VECT tmp;\n- return symmetrizeSSSR(mol, tmp);\n+ return symmetrizeSSSR(mol, tmp, includeDativeBonds);\n };\n \n-int symmetrizeSSSR(ROMol &mol, VECT_INT_VECT &res) {\n+int symmetrizeSSSR(ROMol &mol, VECT_INT_VECT &res, bool includeDativeBonds) {\n res.clear();\n VECT_INT_VECT sssrs;\n \n // FIX: need to set flag here the symmetrization has been done in order to\n // avoid repeating this work\n- findSSSR(mol, sssrs);\n+ findSSSR(mol, sssrs, includeDativeBonds);\n \n res.reserve(sssrs.size());\n for (const auto &r : sssrs) {\ndiff --git a/Code/GraphMol/MolDraw2D/MolDraw2D.cpp b/Code/GraphMol/MolDraw2D/MolDraw2D.cpp\nindex c53a9398bcf..640c3a2fbdc 100644\n--- a/Code/GraphMol/MolDraw2D/MolDraw2D.cpp\n+++ b/Code/GraphMol/MolDraw2D/MolDraw2D.cpp\n@@ -81,8 +81,14 @@ void MolDraw2D::drawMolecule(const ROMol &mol, const std::string &legend,\n const std::map<int, double> *highlight_radii,\n int confId) {\n setupTextDrawer();\n+ // we need ring info for drawing, so copy the molecule\n+ // in order to add it\n+ ROMol lmol(mol);\n+ if (!lmol.getRingInfo()->isInitialized()) {\n+ MolOps::symmetrizeSSSR(lmol);\n+ }\n drawMols_.emplace_back(new MolDraw2D_detail::DrawMol(\n- mol, legend, panelWidth(), panelHeight(), drawOptions(), *text_drawer_,\n+ lmol, legend, panelWidth(), panelHeight(), drawOptions(), *text_drawer_,\n highlight_atoms, highlight_bonds, highlight_atom_map, highlight_bond_map,\n nullptr, highlight_radii, supportsAnnotations(), confId));\n drawMols_.back()->setOffsets(x_offset_, y_offset_);\ndiff --git a/Code/GraphMol/MolOps.h b/Code/GraphMol/MolOps.h\nindex 6f66857d900..358244e30c7 100644\n--- a/Code/GraphMol/MolOps.h\n+++ b/Code/GraphMol/MolOps.h\n@@ -688,6 +688,8 @@ RDKIT_GRAPHMOL_EXPORT void setHybridization(ROMol &mol);\n \\param res used to return the vector of rings. Each entry is a vector with\n atom indices. This information is also stored in the molecule's\n RingInfo structure, so this argument is optional (see overload)\n+ \\param includeDativeBonds - determines whether or not dative bonds are used in\n+ the ring finding.\n \n \\return number of smallest rings found\n \n@@ -723,10 +725,12 @@ RDKIT_GRAPHMOL_EXPORT void setHybridization(ROMol &mol);\n done. The extra rings this process adds can be quite useful.\n */\n RDKIT_GRAPHMOL_EXPORT int findSSSR(const ROMol &mol,\n- std::vector<std::vector<int>> &res);\n+ std::vector<std::vector<int>> &res,\n+ bool includeDativeBonds = false);\n //! \\overload\n-RDKIT_GRAPHMOL_EXPORT int findSSSR(\n- const ROMol &mol, std::vector<std::vector<int>> *res = nullptr);\n+RDKIT_GRAPHMOL_EXPORT int findSSSR(const ROMol &mol,\n+ std::vector<std::vector<int>> *res = nullptr,\n+ bool includeDativeBonds = false);\n \n //! use a DFS algorithm to identify ring bonds and atoms in a molecule\n /*!\n@@ -756,6 +760,8 @@ RDKIT_GRAPHMOL_EXPORT void findRingFamilies(const ROMol &mol);\n \\param res used to return the vector of rings. Each entry is a vector with\n atom indices. This information is also stored in the molecule's\n RingInfo structure, so this argument is optional (see overload)\n+ \\param includeDativeBonds - determines whether or not dative bonds are used in\n+ the ring finding.\n \n \\return the total number of rings = (new rings + old SSSRs)\n \n@@ -764,9 +770,11 @@ RDKIT_GRAPHMOL_EXPORT void findRingFamilies(const ROMol &mol);\n first\n */\n RDKIT_GRAPHMOL_EXPORT int symmetrizeSSSR(ROMol &mol,\n- std::vector<std::vector<int>> &res);\n+ std::vector<std::vector<int>> &res,\n+ bool includeDativeBonds = false);\n //! \\overload\n-RDKIT_GRAPHMOL_EXPORT int symmetrizeSSSR(ROMol &mol);\n+RDKIT_GRAPHMOL_EXPORT int symmetrizeSSSR(ROMol &mol,\n+ bool includeDativeBonds = false);\n \n //! @}\n \ndiff --git a/Code/GraphMol/Wrap/MolOps.cpp b/Code/GraphMol/Wrap/MolOps.cpp\nindex d199197ef9e..b592bda2887 100644\n--- a/Code/GraphMol/Wrap/MolOps.cpp\n+++ b/Code/GraphMol/Wrap/MolOps.cpp\n@@ -306,9 +306,9 @@ ROMol *addHs(const ROMol &orig, bool explicitOnly, bool addCoords,\n return res;\n }\n \n-VECT_INT_VECT getSSSR(ROMol &mol) {\n+VECT_INT_VECT getSSSR(ROMol &mol, bool includeDativeBonds) {\n VECT_INT_VECT rings;\n- MolOps::findSSSR(mol, rings);\n+ MolOps::findSSSR(mol, rings, includeDativeBonds);\n return rings;\n }\n \n@@ -466,9 +466,9 @@ void setHybridizationMol(ROMol &mol) {\n MolOps::setHybridization(wmol);\n }\n \n-VECT_INT_VECT getSymmSSSR(ROMol &mol) {\n+VECT_INT_VECT getSymmSSSR(ROMol &mol, bool includeDativeBonds) {\n VECT_INT_VECT rings;\n- MolOps::symmetrizeSSSR(mol, rings);\n+ MolOps::symmetrizeSSSR(mol, rings, includeDativeBonds);\n return rings;\n }\n PyObject *getDistanceMatrix(ROMol &mol, bool useBO = false,\n@@ -1055,11 +1055,14 @@ struct molops_wrapper {\n ARGUMENTS:\\n\\\n \\n\\\n - mol: the molecule to use.\\n\\\n+ - includeDativeBonds: whether or not dative bonds should be included in the ring finding.\\n\\\n \\n\\\n RETURNS: a sequence of sequences containing the rings found as atom ids\\n\\\n The length of this will be equal to NumBonds-NumAtoms+1 for single-fragment molecules.\\n\\\n \\n\";\n- python::def(\"GetSSSR\", getSSSR, docString.c_str());\n+ python::def(\"GetSSSR\", getSSSR,\n+ (python::arg(\"mol\"), python::arg(\"includeDativeBonds\") = false),\n+ docString.c_str());\n \n // ------------------------------------------------------------------------\n docString =\n@@ -1072,10 +1075,13 @@ struct molops_wrapper {\n ARGUMENTS:\\n\\\n \\n\\\n - mol: the molecule to use.\\n\\\n+ - includeDativeBonds: whether or not dative bonds should be included in the ring finding.\\n\\\n \\n\\\n RETURNS: a sequence of sequences containing the rings found as atom ids\\n\\\n \\n\";\n- python::def(\"GetSymmSSSR\", getSymmSSSR, docString.c_str());\n+ python::def(\"GetSymmSSSR\", getSymmSSSR,\n+ (python::arg(\"mol\"), python::arg(\"includeDativeBonds\") = false),\n+ docString.c_str());\n \n // ------------------------------------------------------------------------\n docString =\ndiff --git a/Code/GraphMol/catch_organometallics.cpp b/Code/GraphMol/catch_organometallics.cpp\nindex 98ca289bfc3..c6577ad9814 100644\n--- a/Code/GraphMol/catch_organometallics.cpp\n+++ b/Code/GraphMol/catch_organometallics.cpp\n@@ -12,6 +12,7 @@\n \n #include <GraphMol/RWMol.h>\n #include <GraphMol/FileParsers/FileParsers.h>\n+#include <GraphMol/SmilesParse/SmilesParse.h>\n #include <GraphMol/SmilesParse/SmilesWrite.h>\n \n using namespace RDKit;\n@@ -128,3 +129,26 @@ TEST_CASE(\"get haptic bond end points\") {\n endPts = MolOps::details::hapticBondEndpoints(bond);\n CHECK(std::vector<int>{} == endPts);\n }\n+\n+TEST_CASE(\"Rings and dative bonds\") {\n+ SECTION(\"ferrocene\") {\n+ auto m =\n+ \"C12->[Fe+2]3456789(<-C1=C->3[CH-]->4C->5=2)<-C1=C->6[CH-]->7C->8=C->91\"_smiles;\n+ REQUIRE(m);\n+ std::vector<std::vector<int>> rings;\n+ auto nrings = MolOps::symmetrizeSSSR(*m, rings);\n+ CHECK(nrings == 2);\n+ CHECK(rings[0].size() == 5);\n+ CHECK(rings[1].size() == 5);\n+ }\n+}\n+\n+TEST_CASE(\"aromaticity and dative bonds\") {\n+ SECTION(\"ferrocene\") {\n+ auto m =\n+ \"C12->[Fe+2]3456789(<-C1=C->3[CH-]->4C->5=2)<-C1=C->6[CH-]->7C->8=C->91\"_smiles;\n+ REQUIRE(m);\n+ CHECK(m->getAtomWithIdx(0)->getIsAromatic());\n+ CHECK(!m->getAtomWithIdx(1)->getIsAromatic());\n+ }\n+}\n\\ No newline at end of file\ndiff --git a/ReleaseNotes.md b/ReleaseNotes.md\nindex ed8dcd520ab..e453374a97e 100644\n--- a/ReleaseNotes.md\n+++ b/ReleaseNotes.md\n@@ -8,6 +8,8 @@\n ## Backwards incompatible changes\n \n - The ring-finding functions will now run even if the molecule already has ring information. Older versions of the RDKit would return whatever ring information was present, even if it had been generated using a different algorithm.\n+- The ring-finding functions now no longer consider dative bonds as possible ring bonds by default. All of the ring-finding functions have a new optional argument `includeDativeBonds` which can be used to change this behavior\n+- Generating 2D coordinates no longer has the side effect of running ring finding on molecules.\n - The canonical SMILES and CXSMILES generated for molecules with enhanced stereochemistry (stereo groups) is different than in previous releases. The enhanced stereochemistry information and the stereo groups themselves are now canonical. This does *not* affect molecules which do not have enhanced stereo and will not have any effect if you generate non-isomeric SMILES. This change also affects the output of the MolHash and RegistrationHash code when applied to molecules with enhanced stereo.\n - The doIsomericSmiles parameter in Java and C# ROMol.MolToSmiles() now defaults to true (previously it was false), thus aligning to the C++ and Python behavior.\n - Double bonds which are marked as crossed (i.e. `bond.GetBondDir() == Bond.BondDir.EITHERDOUBLE`) now have their BondStereo set to `Bond.BondStereo.STEREOANY` and the BondDir information removed by default when molecules are parsed or `AssignStereochemistry()` is called with the `cleanIt` argument set to True.\n"}, "test": {"test_patch": "diff --git a/Code/GraphMol/Depictor/catch_tests.cpp b/Code/GraphMol/Depictor/catch_tests.cpp\nindex 5481098be46..65431380f10 100644\n--- a/Code/GraphMol/Depictor/catch_tests.cpp\n+++ b/Code/GraphMol/Depictor/catch_tests.cpp\n@@ -212,12 +212,27 @@ TEST_CASE(\"use ring system templates\") {\n auto mol = \"C1CCC2C(C1)C1CCN2NN1\"_smiles;\n RDDepict::Compute2DCoordParameters params;\n RDDepict::compute2DCoords(*mol, params);\n- auto diff = mol->getConformer().getAtomPos(10) - mol->getConformer().getAtomPos(11);\n+ auto diff =\n+ mol->getConformer().getAtomPos(10) - mol->getConformer().getAtomPos(11);\n // when templates are not used, bond from 10-11 is very short\n TEST_ASSERT(RDKit::feq(diff.length(), 0.116, .1));\n \n params.useRingTemplates = true;\n RDDepict::compute2DCoords(*mol, params);\n- diff = mol->getConformer().getAtomPos(10) - mol->getConformer().getAtomPos(11);\n+ diff =\n+ mol->getConformer().getAtomPos(10) - mol->getConformer().getAtomPos(11);\n TEST_ASSERT(RDKit::feq(diff.length(), 1.0, .1))\n+}\n+\n+TEST_CASE(\"dative bonds and rings\") {\n+ auto mol = \"O->[Pt]1(<-O)<-NC2CCC2N->1\"_smiles;\n+ REQUIRE(mol);\n+ auto rings = mol->getRingInfo();\n+ CHECK(rings->numRings() == 1); // the dative bonds are ignored\n+ RDDepict::compute2DCoords(*mol);\n+ CHECK(rings->numRings() == 1); // ensure the ring count hasn't changed\n+ auto conf = mol->getConformer();\n+ auto v1 = conf.getAtomPos(1) - conf.getAtomPos(3);\n+ auto v2 = conf.getAtomPos(1) - conf.getAtomPos(8);\n+ CHECK_THAT(v1.length(), Catch::Matchers::WithinAbs(v2.length(), 0.01));\n }\n\\ No newline at end of file\ndiff --git a/Code/GraphMol/Depictor/testDepictor.cpp b/Code/GraphMol/Depictor/testDepictor.cpp\nindex fad5549c64e..08420863495 100644\n--- a/Code/GraphMol/Depictor/testDepictor.cpp\n+++ b/Code/GraphMol/Depictor/testDepictor.cpp\n@@ -821,13 +821,12 @@ void testGitHubIssue1073() {\n RWMol *m = SmartsToMol(smarts);\n TEST_ASSERT(m);\n \n+ // compute2DCoords does ring finding internally, so there's no error\n RDDepict::compute2DCoords(*m);\n \n+ // but the molecule itself is not modified\n RingInfo *ri = m->getRingInfo();\n- TEST_ASSERT(ri->isInitialized());\n- TEST_ASSERT(ri->isAtomInRingOfSize(0, 6));\n- TEST_ASSERT(ri->isAtomInRingOfSize(0, 5));\n- TEST_ASSERT(!ri->isAtomInRingOfSize(0, 9));\n+ TEST_ASSERT(!ri->isInitialized());\n \n delete m;\n }\ndiff --git a/Code/GraphMol/MolDraw2D/catch_tests.cpp b/Code/GraphMol/MolDraw2D/catch_tests.cpp\nindex aff69fec493..cce33a3d477 100755\n--- a/Code/GraphMol/MolDraw2D/catch_tests.cpp\n+++ b/Code/GraphMol/MolDraw2D/catch_tests.cpp\n@@ -58,7 +58,7 @@ static const std::map<std::string, std::hash_result_t> SVG_HASHES = {\n {\"contourMol_3.svg\", 3493070184U},\n {\"contourMol_4.svg\", 764999893U},\n {\"testDativeBonds_1.svg\", 555607912U},\n- {\"testDativeBonds_2.svg\", 93109626U},\n+ {\"testDativeBonds_2.svg\", 2355686690U},\n {\"testDativeBonds_3.svg\", 3944956974U},\n {\"testDativeBonds_2a.svg\", 1026259021U},\n {\"testDativeBonds_2b.svg\", 3842058701U},\n@@ -718,7 +718,7 @@ TEST_CASE(\"dative bonds\", \"[drawing][organometallics]\") {\n outs.close();\n check_file_hash(\"testDativeBonds_2.svg\");\n \n- CHECK(text.find(\"-8' d='M 101.1,79.8 L 95.8,87.1' \"\n+ CHECK(text.find(\"-8' d='M 101.1,77.2 L 95.8,84.5' \"\n \"style='fill:none;fill-rule:evenodd;stroke:#0000FF;\") !=\n std::string::npos);\n }\n@@ -7476,8 +7476,8 @@ TEST_CASE(\n auto &atomRings = rings->atomRings();\n std::map<int, std::vector<DrawColour>> atomCols;\n std::map<int, double> atomRads;\n- for (auto i = 0; i < atomRings.size(); ++i) {\n- for (auto j = 0; j < atomRings[i].size(); ++j) {\n+ for (auto i = 0u; i < atomRings.size(); ++i) {\n+ for (auto j = 0u; j < atomRings[i].size(); ++j) {\n auto ex = atomCols.find(atomRings[i][j]);\n if (ex == atomCols.end()) {\n std::vector<DrawColour> cvec(1, colours[i]);\n@@ -7495,8 +7495,8 @@ TEST_CASE(\n auto &bondRings = rings->bondRings();\n std::map<int, int> bondMults;\n std::map<int, std::vector<DrawColour>> bondCols;\n- for (auto i = 0; i < bondRings.size(); ++i) {\n- for (auto j = 0; j < bondRings[i].size(); ++j) {\n+ for (auto i = 0u; i < bondRings.size(); ++i) {\n+ for (auto j = 0u; j < bondRings[i].size(); ++j) {\n auto ex = bondCols.find(bondRings[i][j]);\n if (ex == bondCols.end()) {\n std::vector<DrawColour> cvec(1, colours[i]);\n", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}222{"question_id": "MSB_rdkit_rdkit_pr6247", "question_type": "multi_swe_bench", "description": "RGD and Stereo Groups (rdkit/rdkit#6247)", "content": {"org": "rdkit", "repo": "rdkit", "pr_number": 6247, "issue_title": "RGD and Stereo Groups", "issue_body": "<!--\r\nThanks for contributing a pull request! \r\n-->\r\n#### Reference Issue\r\n<!-- Example: Fixes #1234 -->\r\n\r\nFixes #6146 \r\n\r\n#### What does this implement/fix? Explain your changes.\r\n\r\nModified R group decomposition to copy stereo groups from the input structure to the core and R groups as described in the issue. In addition to RGD changes I had to modify `ChemTransforms::replaceCore`\r\n\r\nThe decomposition from Issue #6146 now looks good:\r\n\r\n\r\n\r\n\r\n#### Any other comments?\r\n\r\n", "base_commit": "7c9155fadfb47689010b5e98f8059ce626603032", "resolved_issues": [{"number": 6146, "title": "RGD and enhanced stereochemistry", "body": "\r\n\r\n**Describe the bug**\r\n\r\nEnhanced stereochemistry is not carried over from input structures to R groups during RGD.\r\n\r\n**To Reproduce**\r\n\r\n```python\r\n\r\n# %%\r\n\r\nimport sys\r\nfrom rdkit import Chem\r\nfrom rdkit.Chem import AllChem\r\nfrom rdkit.Chem.rdRGroupDecomposition import RGroupDecomposition, RGroupDecompositionParameters, \\\r\n RGroupMatching, RGroupScore, RGroupLabels, RGroupCoreAlignment, RGroupLabelling\r\nfrom rdkit.Chem.Draw import IPythonConsole\r\n\r\nIPythonConsole.ipython_useSVG = True\r\n\r\nfrom rdkit.Chem import PandasTools\r\nfrom rdkit.Chem import Draw\r\nfrom IPython.display import HTML\r\n\r\nIPythonConsole.drawOptions.addAtomIndices = False\r\nIPythonConsole.drawOptions.addStereoAnnotation = True\r\n\r\nimport pandas as pd\r\n\r\ndef do_decomp(options, core, mols):\r\n decomp = RGroupDecomposition([core], options)\r\n display_mols = []\r\n for mol in mols:\r\n if decomp.Add(mol) > -1:\r\n display_mols.append(mol)\r\n else:\r\n print(\"Failed to add mol\")\r\n decomp.Process()\r\n groups = decomp.GetRGroupsAsColumns()\r\n df = PandasTools.RGroupDecompositionToFrame(groups, display_mols, include_core=True)\r\n PandasTools.ChangeMoleculeRendering(df)\r\n return HTML(df.to_html())\r\n# %%\r\n\r\nblock1=\"\"\"\r\n ChemDraw02032311272D\r\n\r\n 0 0 0 0 0 0 V3000\r\nM V30 BEGIN CTAB\r\nM V30 COUNTS 16 17 0 0 1\r\nM V30 BEGIN ATOM\r\nM V30 1 C 0.348623 1.031250 0.000000 0\r\nM V30 2 C 0.348623 0.206250 0.000000 0\r\nM V30 3 C 1.063094 -0.206250 0.000000 0\r\nM V30 4 C 1.777565 0.206250 0.000000 0\r\nM V30 5 C 1.777565 1.031250 0.000000 0\r\nM V30 6 C 1.063094 1.443750 0.000000 0\r\nM V30 7 C 1.063094 -1.031250 0.000000 0\r\nM V30 8 N 1.777565 -1.443750 0.000000 0\r\nM V30 9 C 0.348623 -1.443750 0.000000 0\r\nM V30 10 C -0.365848 -1.031250 0.000000 0\r\nM V30 11 C -0.452084 -0.210769 0.000000 0\r\nM V30 12 C -1.259056 -0.039242 0.000000 0\r\nM V30 13 C -1.671556 -0.753713 0.000000 0\r\nM V30 14 C -1.119523 -1.366808 0.000000 0\r\nM V30 15 O -2.492036 -0.839949 0.000000 0\r\nM V30 16 Cl 2.492036 1.443750 0.000000 0\r\nM V30 END ATOM\r\nM V30 BEGIN BOND\r\nM V30 1 2 1 2\r\nM V30 2 1 2 3\r\nM V30 3 2 3 4\r\nM V30 4 1 4 5\r\nM V30 5 2 5 6\r\nM V30 6 1 6 1\r\nM V30 7 1 3 7\r\nM V30 8 1 7 8 CFG=1\r\nM V30 9 1 7 9\r\nM V30 10 1 9 10\r\nM V30 11 1 10 11\r\nM V30 12 1 11 12\r\nM V30 13 1 12 13\r\nM V30 14 1 13 14\r\nM V30 15 1 14 10\r\nM V30 16 1 13 15 CFG=3\r\nM V30 17 1 5 16\r\nM V30 END BOND\r\nM V30 BEGIN COLLECTION\r\nM V30 MDLV30/STEABS ATOMS=(2 7 13)\r\nM V30 END COLLECTION\r\nM V30 END CTAB\r\nM END\"\"\"\r\n\r\nmol1 = Chem.MolFromMolBlock(block1)\r\nmol1\r\n\r\n# %%\r\nblock2 = \"\"\"\r\n ChemDraw02032311382D\r\n\r\n 0 0 0 0 0 0 V3000\r\nM V30 BEGIN CTAB\r\nM V30 COUNTS 18 19 0 0 0\r\nM V30 BEGIN ATOM\r\nM V30 1 C 0.348623 1.388485 0.000000 0\r\nM V30 2 C 0.348623 0.563485 0.000000 0\r\nM V30 3 C 1.063094 0.150985 0.000000 0\r\nM V30 4 C 1.777565 0.563485 0.000000 0\r\nM V30 5 C 1.777565 1.388485 0.000000 0\r\nM V30 6 C 1.063094 1.800985 0.000000 0\r\nM V30 7 C 1.063094 -0.674015 0.000000 0\r\nM V30 8 N 1.777565 -1.086515 0.000000 0\r\nM V30 9 C 0.348623 -1.086515 0.000000 0\r\nM V30 10 C -0.365848 -0.674015 0.000000 0\r\nM V30 11 C -0.452084 0.146466 0.000000 0\r\nM V30 12 C -1.259056 0.317993 0.000000 0\r\nM V30 13 C -1.671556 -0.396478 0.000000 0\r\nM V30 14 C -1.119523 -1.009572 0.000000 0\r\nM V30 15 O -2.492036 -0.482714 0.000000 0\r\nM V30 16 Cl 2.492036 1.800986 0.000000 0\r\nM V30 17 O -0.063877 -1.800986 0.000000 0\r\nM V30 18 C 0.761123 -1.800986 0.000000 0\r\nM V30 END ATOM\r\nM V30 BEGIN BOND\r\nM V30 1 2 1 2\r\nM V30 2 1 2 3\r\nM V30 3 2 3 4\r\nM V30 4 1 4 5\r\nM V30 5 2 5 6\r\nM V30 6 1 6 1\r\nM V30 7 1 3 7\r\nM V30 8 1 7 8 CFG=1\r\nM V30 9 1 7 9\r\nM V30 10 1 9 10\r\nM V30 11 1 10 11\r\nM V30 12 1 11 12\r\nM V30 13 1 12 13\r\nM V30 14 1 13 14\r\nM V30 15 1 14 10\r\nM V30 16 1 13 15 CFG=3\r\nM V30 17 1 5 16\r\nM V30 18 1 9 17 CFG=1\r\nM V30 19 1 9 18 CFG=3\r\nM V30 END BOND\r\nM V30 BEGIN COLLECTION\r\nM V30 MDLV30/STEABS ATOMS=(2 7 9)\r\nM V30 MDLV30/STEREL1 ATOMS=(1 13)\r\nM V30 END COLLECTION\r\nM V30 END CTAB\r\nM END\"\"\"\r\nmol2 = Chem.MolFromMolBlock(block2)\r\nmol2\r\n# %%\r\nquery_block = \"\"\"\r\n ChemDraw02132309392D\r\n\r\n 0 0 0 0 0 0 V3000\r\nM V30 BEGIN CTAB\r\nM V30 COUNTS 10 10 0 0 1\r\nM V30 BEGIN ATOM\r\nM V30 1 C -1.071690 1.031297 0.000000 0\r\nM V30 2 C -1.071690 0.206260 0.000000 0\r\nM V30 3 C -0.357230 -0.206259 0.000000 0\r\nM V30 4 C 0.357230 0.206260 0.000000 0\r\nM V30 5 C 0.357230 1.031297 0.000000 0\r\nM V30 6 C -0.357230 1.443816 0.000000 0\r\nM V30 7 C -0.357230 -1.031297 0.000000 0\r\nM V30 8 N 0.357230 -1.443816 0.000000 0\r\nM V30 9 R1 -1.071690 -1.443816 0.000000 0\r\nM V30 10 Cl 1.071690 1.443816 0.000000 0\r\nM V30 END ATOM\r\nM V30 BEGIN BOND\r\nM V30 1 2 1 2\r\nM V30 2 1 2 3\r\nM V30 3 2 3 4\r\nM V30 4 1 4 5\r\nM V30 5 2 5 6\r\nM V30 6 1 6 1\r\nM V30 7 1 3 7\r\nM V30 8 1 7 8 CFG=1\r\nM V30 9 1 7 9\r\nM V30 10 1 5 10\r\nM V30 END BOND\r\nM V30 END CTAB\r\nM END\r\n\"\"\"\r\nquery= Chem.MolFromMolBlock(query_block)\r\nquery\r\n\r\n# %%\r\noptions = RGroupDecompositionParameters()\r\noptions.onlyMatchAtRGroups = False\r\noptions.allowMultipleRGroupsOnUnlabelled = True\r\ndo_decomp(options, query, [mol1, mol2])\r\n# %%\r\n\r\n\r\n```\r\n\r\n**Expected behavior**\r\n\r\nI like to see `abs`, `or` and `and` enhanced stereo chemistry labels being properly carried over to the R groups which is not happening. I understand that a single `or1` or `and1` in a group make little sense but it would be nice to see when viewing the decomposition. \r\n\r\nThe structures are examples created by a customer. They have proprietary data with multiple `and` and `or` centers that get scrambled on decomposition. Unfortunately, I can't share those.\r\n \r\n**Screenshots**\r\n\r\nThis is what the current RGD looks like:\r\n\r\n\r\n\r\n\r\n**Configuration (please complete the following information):**\r\n - RDKit version: Master as of 2/28/2023\r\n - OS: [e.g. Ubuntu 20.04] Ubuntu 20.04\r\n - Python version (if relevant):\r\n - Are you using conda?\r\n - If you are using conda, which channel did you install the rdkit from?\r\n - If you are not using conda: how did you install the RDKit?\r\n\r\n**Additional context**\r\n\r\n@bp-kelley This is an example of some of the RGD issues we've been seeing.\r\n\r\n"}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/rdkit_m_rdkit:pr-6247", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/Code/GraphMol/ChemTransforms/ChemTransforms.cpp b/Code/GraphMol/ChemTransforms/ChemTransforms.cpp\nindex 38d9882712c..a7b47469235 100644\n--- a/Code/GraphMol/ChemTransforms/ChemTransforms.cpp\n+++ b/Code/GraphMol/ChemTransforms/ChemTransforms.cpp\n@@ -31,6 +31,7 @@\n #include <RDGeneral/FileParseException.h>\n #include <RDGeneral/BadFileException.h>\n #include <GraphMol/ChemTransforms/ChemTransforms.h>\n+\n namespace RDKit {\n namespace details {\n void updateSubMolConfs(const ROMol &mol, RWMol &res,\n@@ -52,6 +53,26 @@ void updateSubMolConfs(const ROMol &mol, RWMol &res,\n res.addConformer(newConf, false);\n }\n }\n+void copyStereoGroups(const std::map<const Atom *, Atom*> &molAtomMap, const ROMol &mol, RWMol &newMol) {\n+ // Copy over any stereo groups that lie in the new molecule\n+ if (!mol.getStereoGroups().empty()) {\n+ std::vector<StereoGroup> newStereoGroups;\n+ for (auto &stereoGroup : mol.getStereoGroups()) {\n+ std::vector<Atom *> newStereoAtoms;\n+ for (const auto stereoGroupAtom : stereoGroup.getAtoms()) {\n+ if (auto found = molAtomMap.find(stereoGroupAtom);\n+ found != molAtomMap.end()) {\n+ newStereoAtoms.push_back(found->second);\n+ }\n+ }\n+ if (!newStereoAtoms.empty()) {\n+ newStereoGroups.emplace_back(stereoGroup.getGroupType(),\n+ newStereoAtoms);\n+ }\n+ }\n+ newMol.setStereoGroups(std::move(newStereoGroups));\n+ }\n+}\n } // namespace details\n \n namespace {\n@@ -62,10 +83,10 @@ struct SideChainMapping {\n \n SideChainMapping(int molIndex)\n : molIndex(molIndex), coreIndex(-1), useMatch(false) {}\n+\n SideChainMapping(int molIndex, int coreIndex, bool useMatch)\n : molIndex(molIndex), coreIndex(coreIndex), useMatch(useMatch) {}\n };\n-\n } // namespace\n \n ROMol *deleteSubstructs(const ROMol &mol, const ROMol &query, bool onlyFrags,\n@@ -488,6 +509,7 @@ ROMol *replaceCore(const ROMol &mol, const ROMol &core,\n auto *newMol = new RWMol(mol);\n std::vector<Atom *> keepList;\n std::map<Atom *, int> dummyAtomMap;\n+ std::map<const Atom *, Atom *> molAtomMap;\n \n // go through the matches in query order, not target molecule\n // order\n@@ -516,6 +538,7 @@ ROMol *replaceCore(const ROMol &mol, const ROMol &core,\n Atom *sidechainAtom = newMol->getAtomWithIdx(mappingInfo.molIndex);\n // we're keeping the sidechain atoms:\n keepList.push_back(sidechainAtom);\n+ molAtomMap[mol.getAtomWithIdx(mappingInfo.molIndex)] = sidechainAtom;\n \n // loop over our neighbors and see if any are in the match:\n std::list<unsigned int> nbrList;\n@@ -700,25 +723,27 @@ ROMol *replaceCore(const ROMol &mol, const ROMol &core,\n endAtom->getIdx());\n }\n }\n+ }\n \n- // make a guess at the position of the dummy atoms showing the attachment\n- // point:\n- for (auto citer = mol.beginConformers(); citer != mol.endConformers();\n- ++citer) {\n- Conformer &newConf = newMol->getConformer((*citer)->getId());\n- for (auto iter = dummyAtomMap.begin(); iter != dummyAtomMap.end();\n- ++iter) {\n- newConf.setAtomPos(iter->first->getIdx(),\n- (*citer)->getAtomPos(iter->second));\n- }\n+ // make a guess at the position of the dummy atoms showing the attachment\n+ // point:\n+ for (auto citer = mol.beginConformers(); citer != mol.endConformers();\n+ ++citer) {\n+ Conformer &newConf = newMol->getConformer((*citer)->getId());\n+ for (auto iter = dummyAtomMap.begin(); iter != dummyAtomMap.end(); ++iter) {\n+ newConf.setAtomPos(iter->first->getIdx(),\n+ (*citer)->getAtomPos(iter->second));\n }\n-\n- // clear computed props and do basic updates on\n- // the resulting molecule, but allow unhappiness:\n- newMol->clearComputedProps(true);\n- newMol->updatePropertyCache(false);\n }\n \n+ // copy over stereo groups\n+ details::copyStereoGroups(molAtomMap, mol, *newMol);\n+\n+ // clear computed props and do basic updates on\n+ // the resulting molecule, but allow unhappiness:\n+ newMol->clearComputedProps(true);\n+ newMol->updatePropertyCache(false);\n+\n return static_cast<ROMol *>(newMol);\n }\n \n@@ -971,6 +996,7 @@ void parseQueryDefFile(std::istream *inStream,\n queryDefs[qname] = msptr;\n }\n }\n+\n void parseQueryDefFile(const std::string &filename,\n std::map<std::string, ROMOL_SPTR> &queryDefs,\n bool standardize, const std::string &delimiter,\n@@ -985,6 +1011,7 @@ void parseQueryDefFile(const std::string &filename,\n parseQueryDefFile(&inStream, queryDefs, standardize, delimiter, comment,\n nameColumn, smartsColumn);\n }\n+\n void parseQueryDefText(const std::string &queryDefText,\n std::map<std::string, ROMOL_SPTR> &queryDefs,\n bool standardize, const std::string &delimiter,\ndiff --git a/Code/GraphMol/ChemTransforms/ChemTransforms.h b/Code/GraphMol/ChemTransforms/ChemTransforms.h\nindex 978aeb64cfb..ef03b1c3679 100644\n--- a/Code/GraphMol/ChemTransforms/ChemTransforms.h\n+++ b/Code/GraphMol/ChemTransforms/ChemTransforms.h\n@@ -270,6 +270,9 @@ namespace details {\n //! not recommended for use in other code\n RDKIT_CHEMTRANSFORMS_EXPORT void updateSubMolConfs(\n const ROMol &mol, RWMol &res, boost::dynamic_bitset<> &removedAtoms);\n+RDKIT_CHEMTRANSFORMS_EXPORT void copyStereoGroups(\n+ const std::map<const Atom *, Atom *> &molAtomMap, const ROMol &mol,\n+ RWMol &newMol);\n } // namespace details\n \n } // namespace RDKit\ndiff --git a/Code/GraphMol/RGroupDecomposition/RGroupCore.cpp b/Code/GraphMol/RGroupDecomposition/RGroupCore.cpp\nindex 9017134d865..2b09f51af19 100644\n--- a/Code/GraphMol/RGroupDecomposition/RGroupCore.cpp\n+++ b/Code/GraphMol/RGroupDecomposition/RGroupCore.cpp\n@@ -14,7 +14,6 @@\n #include \"GraphMol/Substruct/SubstructUtils.h\"\n \n namespace RDKit {\n-\n namespace {\n // From answer 12 in\n // https://stackoverflow.com/questions/5279051/how-can-i-create-cartesian-product-of-vector-of-vectors\n@@ -71,6 +70,7 @@ std::pair<RWMOL_SPTR, bool> RCore::extractCoreFromMolMatch(\n std::set<int> atomIndicesToKeep;\n std::vector<Bond *> newBonds;\n std::map<Atom *, int> dummyAtomMap;\n+ std::map<const Atom *, Atom *> molAtomMap;\n bool hasCoreDummies = false;\n for (auto &pair : match) {\n const auto queryAtom = core->getAtomWithIdx(pair.first);\n@@ -90,6 +90,7 @@ std::pair<RWMOL_SPTR, bool> RCore::extractCoreFromMolMatch(\n continue;\n } else {\n atomIndicesToKeep.insert(pair.second);\n+ molAtomMap[mol.getAtomWithIdx(pair.second)] = targetAtom;\n int neighborNumber = -1;\n #ifdef VERBOSE\n std::cerr << \"Atom Chirality In \" << targetAtom->getChiralTag()\n@@ -124,6 +125,8 @@ std::pair<RWMOL_SPTR, bool> RCore::extractCoreFromMolMatch(\n // Hydrogen needed to define chirality is present in target but\n // not mapped to core. Copy it to the extracted core\n hydrogensToAdd.push_back(static_cast<int>(targetNeighborIndex));\n+ molAtomMap[mol.getAtomWithIdx(targetNeighborIndex)] =\n+ targetNeighborAtom;\n } else if (isChiral) {\n // There is a heavy sidechain in the decomp that is connected to\n // the core by an unknown bond (onlyMatchAtRGroups = False and\n@@ -260,6 +263,9 @@ std::pair<RWMOL_SPTR, bool> RCore::extractCoreFromMolMatch(\n }\n }\n \n+ // Copy over any stereo groups that lie in the extracted core\n+ details::copyStereoGroups(molAtomMap, mol, *extractedCore);\n+\n extractedCore->clearComputedProps(true);\n extractedCore->updatePropertyCache(false);\n \n@@ -810,5 +816,4 @@ int RCore::matchingIndexToCoreIndex(int matchingIndex) const {\n \"Matched atom missing core index\");\n return atom->getProp<int>(RLABEL_CORE_INDEX);\n }\n-\n } // namespace RDKit\n"}, "test": {"test_patch": "diff --git a/Code/GraphMol/RGroupDecomposition/testRGroupDecomp.cpp b/Code/GraphMol/RGroupDecomposition/testRGroupDecomp.cpp\nindex 1a61505776e..26f7ad5d71e 100644\n--- a/Code/GraphMol/RGroupDecomposition/testRGroupDecomp.cpp\n+++ b/Code/GraphMol/RGroupDecomposition/testRGroupDecomp.cpp\n@@ -1128,9 +1128,10 @@ Br[*:3]\n Br[*:3]\n )RES\");\n }\n- { // repeat that without symmetrization (testing #3224)\n- // Still three groups added, but bromine and fluorine\n- // are not aligned between R1 and R3\n+ {\n+ // repeat that without symmetrization (testing #3224)\n+ // Still three groups added, but bromine and fluorine\n+ // are not aligned between R1 and R3\n RGroupDecompositionParameters ps;\n ps.matchingStrategy = RDKit::NoSymmetrization;\n RGroupDecomposition decomp(*core, ps);\n@@ -3549,7 +3550,7 @@ void testRGroupCoordinatesAddedToCore() {\n BOOST_LOG(rdInfoLog)\n << \"********************************************************\\n\";\n BOOST_LOG(rdInfoLog)\n- << \"Test that cordinates for R groups are properly added to core when the core has coordinates and the target does not\"\n+ << \"Test that coordinates for R groups are properly added to core when the core has coordinates and the target does not\"\n << std::endl;\n auto core = R\"CTAB(ACS Document 1996\n ChemDraw05202112262D\n@@ -3609,7 +3610,7 @@ M END\n auto coreAtoms = core->atoms();\n auto originalAtom = std::find_if(\n coreAtoms.begin(), coreAtoms.end(), [rGroupNum](const auto &a) {\n- return static_cast<int>(a->getIsotope()) == rGroupNum;\n+ return static_cast<int>(a->getIsotope()) == rGroupNum;\n });\n TEST_ASSERT(originalAtom != coreAtoms.end());\n const auto &originalPoint =\n@@ -3625,6 +3626,188 @@ M END\n TEST_ASSERT(numberGroups == 2);\n }\n \n+void testStereoGroupsPreserved() {\n+ BOOST_LOG(rdInfoLog)\n+ << \"********************************************************\\n\";\n+ BOOST_LOG(rdInfoLog)\n+ << \"Test that stereo group information is copied from input structure to core and R groups\"\n+ << std::endl;\n+ auto core = R\"CTAB(\n+ ChemDraw02132309392D\n+\n+ 0 0 0 0 0 0 V3000\n+M V30 BEGIN CTAB\n+M V30 COUNTS 10 10 0 0 1\n+M V30 BEGIN ATOM\n+M V30 1 C -1.071690 1.031297 0.000000 0\n+M V30 2 C -1.071690 0.206260 0.000000 0\n+M V30 3 C -0.357230 -0.206259 0.000000 0\n+M V30 4 C 0.357230 0.206260 0.000000 0\n+M V30 5 C 0.357230 1.031297 0.000000 0\n+M V30 6 C -0.357230 1.443816 0.000000 0\n+M V30 7 C -0.357230 -1.031297 0.000000 0\n+M V30 8 N 0.357230 -1.443816 0.000000 0\n+M V30 9 R1 -1.071690 -1.443816 0.000000 0\n+M V30 10 Cl 1.071690 1.443816 0.000000 0\n+M V30 END ATOM\n+M V30 BEGIN BOND\n+M V30 1 2 1 2\n+M V30 2 1 2 3\n+M V30 3 2 3 4\n+M V30 4 1 4 5\n+M V30 5 2 5 6\n+M V30 6 1 6 1\n+M V30 7 1 3 7\n+M V30 8 1 7 8 CFG=1\n+M V30 9 1 7 9\n+M V30 10 1 5 10\n+M V30 END BOND\n+M V30 END CTAB\n+M END\n+)CTAB\"_ctab;\n+\n+ auto mol1 = R\"CTAB(\n+ ChemDraw02032311272D\n+\n+ 0 0 0 0 0 0 V3000\n+M V30 BEGIN CTAB\n+M V30 COUNTS 16 17 0 0 1\n+M V30 BEGIN ATOM\n+M V30 1 C 0.348623 1.031250 0.000000 0\n+M V30 2 C 0.348623 0.206250 0.000000 0\n+M V30 3 C 1.063094 -0.206250 0.000000 0\n+M V30 4 C 1.777565 0.206250 0.000000 0\n+M V30 5 C 1.777565 1.031250 0.000000 0\n+M V30 6 C 1.063094 1.443750 0.000000 0\n+M V30 7 C 1.063094 -1.031250 0.000000 0\n+M V30 8 N 1.777565 -1.443750 0.000000 0\n+M V30 9 C 0.348623 -1.443750 0.000000 0\n+M V30 10 C -0.365848 -1.031250 0.000000 0\n+M V30 11 C -0.452084 -0.210769 0.000000 0\n+M V30 12 C -1.259056 -0.039242 0.000000 0\n+M V30 13 C -1.671556 -0.753713 0.000000 0\n+M V30 14 C -1.119523 -1.366808 0.000000 0\n+M V30 15 O -2.492036 -0.839949 0.000000 0\n+M V30 16 Cl 2.492036 1.443750 0.000000 0\n+M V30 END ATOM\n+M V30 BEGIN BOND\n+M V30 1 2 1 2\n+M V30 2 1 2 3\n+M V30 3 2 3 4\n+M V30 4 1 4 5\n+M V30 5 2 5 6\n+M V30 6 1 6 1\n+M V30 7 1 3 7\n+M V30 8 1 7 8 CFG=1\n+M V30 9 1 7 9\n+M V30 10 1 9 10\n+M V30 11 1 10 11\n+M V30 12 1 11 12\n+M V30 13 1 12 13\n+M V30 14 1 13 14\n+M V30 15 1 14 10\n+M V30 16 1 13 15 CFG=3\n+M V30 17 1 5 16\n+M V30 END BOND\n+M V30 BEGIN COLLECTION\n+M V30 MDLV30/STEABS ATOMS=(2 7 13)\n+M V30 END COLLECTION\n+M V30 END CTAB\n+M END\n+)CTAB\"_ctab;\n+\n+ auto mol2 = R\"CTAB(\n+ ChemDraw02032311382D\n+\n+ 0 0 0 0 0 0 V3000\n+M V30 BEGIN CTAB\n+M V30 COUNTS 18 19 0 0 0\n+M V30 BEGIN ATOM\n+M V30 1 C 0.348623 1.388485 0.000000 0\n+M V30 2 C 0.348623 0.563485 0.000000 0\n+M V30 3 C 1.063094 0.150985 0.000000 0\n+M V30 4 C 1.777565 0.563485 0.000000 0\n+M V30 5 C 1.777565 1.388485 0.000000 0\n+M V30 6 C 1.063094 1.800985 0.000000 0\n+M V30 7 C 1.063094 -0.674015 0.000000 0\n+M V30 8 N 1.777565 -1.086515 0.000000 0\n+M V30 9 C 0.348623 -1.086515 0.000000 0\n+M V30 10 C -0.365848 -0.674015 0.000000 0\n+M V30 11 C -0.452084 0.146466 0.000000 0\n+M V30 12 C -1.259056 0.317993 0.000000 0\n+M V30 13 C -1.671556 -0.396478 0.000000 0\n+M V30 14 C -1.119523 -1.009572 0.000000 0\n+M V30 15 O -2.492036 -0.482714 0.000000 0\n+M V30 16 Cl 2.492036 1.800986 0.000000 0\n+M V30 17 O -0.063877 -1.800986 0.000000 0\n+M V30 18 C 0.761123 -1.800986 0.000000 0\n+M V30 END ATOM\n+M V30 BEGIN BOND\n+M V30 1 2 1 2\n+M V30 2 1 2 3\n+M V30 3 2 3 4\n+M V30 4 1 4 5\n+M V30 5 2 5 6\n+M V30 6 1 6 1\n+M V30 7 1 3 7\n+M V30 8 1 7 8 CFG=1\n+M V30 9 1 7 9\n+M V30 10 1 9 10\n+M V30 11 1 10 11\n+M V30 12 1 11 12\n+M V30 13 1 12 13\n+M V30 14 1 13 14\n+M V30 15 1 14 10\n+M V30 16 1 13 15 CFG=3\n+M V30 17 1 5 16\n+M V30 18 1 9 17 CFG=1\n+M V30 19 1 9 18 CFG=3\n+M V30 END BOND\n+M V30 BEGIN COLLECTION\n+M V30 MDLV30/STEABS ATOMS=(2 7 9)\n+M V30 MDLV30/STEREL1 ATOMS=(1 13)\n+M V30 END COLLECTION\n+M V30 END CTAB\n+M END\n+)CTAB\"_ctab;\n+\n+ RGroupDecompositionParameters params;\n+ params.matchingStrategy = GreedyChunks;\n+ params.allowMultipleRGroupsOnUnlabelled = true;\n+ params.onlyMatchAtRGroups = false;\n+ RGroupDecomposition decomp(*core, params);\n+ auto result = decomp.add(*mol1);\n+ TEST_ASSERT(result == 0);\n+ result = decomp.add(*mol2);\n+ TEST_ASSERT(result == 1);\n+ decomp.process();\n+\n+ RGroupRows rows = decomp.getRGroupsAsRows();\n+ TEST_ASSERT(rows.size() == 2);\n+ TEST_ASSERT(rows[0].size() == 2);\n+ TEST_ASSERT(rows[1].size() == 2);\n+\n+ auto core1 = rows[0][\"Core\"];\n+ TEST_ASSERT(core1->getStereoGroups().size() == 1);\n+ TEST_ASSERT(core1->getStereoGroups()[0].getGroupType() ==\n+ StereoGroupType::STEREO_ABSOLUTE);\n+ auto r1 = rows[0][\"R1\"];\n+ TEST_ASSERT(r1->getStereoGroups().size() == 1);\n+ TEST_ASSERT(r1->getStereoGroups()[0].getGroupType() ==\n+ StereoGroupType::STEREO_ABSOLUTE);\n+\n+ auto core2 = rows[1][\"Core\"];\n+ TEST_ASSERT(core2->getStereoGroups().size() == 1);\n+ TEST_ASSERT(core2->getStereoGroups()[0].getGroupType() ==\n+ StereoGroupType::STEREO_ABSOLUTE);\n+ auto r2 = rows[1][\"R1\"];\n+ TEST_ASSERT(r2->getStereoGroups().size() == 2);\n+ TEST_ASSERT(r2->getStereoGroups()[0].getGroupType() ==\n+ StereoGroupType::STEREO_ABSOLUTE);\n+ TEST_ASSERT(r2->getStereoGroups()[1].getGroupType() ==\n+ StereoGroupType::STEREO_OR);\n+}\n+\n int main() {\n RDLog::InitLogs();\n boost::logging::disable_logs(\"rdApp.debug\");\n@@ -3685,6 +3868,7 @@ int main() {\n testGitHub5631();\n testGithub5613();\n testRGroupCoordinatesAddedToCore();\n+ testStereoGroupsPreserved();\n BOOST_LOG(rdInfoLog)\n << \"********************************************************\\n\";\n return 0;\n", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}223{"question_id": "MSB_rdkit_rdkit_pr6257", "question_type": "multi_swe_bench", "description": "Fixes #6241 (rdkit/rdkit#6257)", "content": {"org": "rdkit", "repo": "rdkit", "pr_number": 6257, "issue_title": "Fixes #6241", "issue_body": "Adds a new function to `MolFileStereochem.h` and the python wrapper to apply the \"standard\" semantics of the chiral flag", "base_commit": "9c77556bf338f33cf897100c9a1f06db07d136ab", "resolved_issues": [{"number": 6241, "title": "Add a function to translate the MDL chiral flag into enhanced stereo groups", "body": "The \"chiral flag\" is a feature that was used in MDL v2000 mol files, but was superseded by Enhanced Stereo Groups, which are much more flexible, in the v3000 format.\r\n\r\nIt would be useful to have some infrastructure that allows us to \"translate\" the stereochemistry read from a v2000 mol block into Enhanced Stereo Groups. If my understanding of the related documentation is correct, this code should do the following:\r\n\r\nFor all atoms which are not already included in an Enhanced Stereo Group (these might have been defined at some point after reading the original v2000 input), \r\n- if the `RDKit::common_properties::_MolFileChiralFlag` property is set to \"1\", find or create the \"ABS\" Enhanced Stereo Group on the mol (which must be unique), and add the atoms to it.\r\n- if the `RDKit::common_properties::_MolFileChiralFlag` property is set to \"0\", create a new \"AND\" Enhanced Stereo Group, and add all atoms to it.\r\n"}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/rdkit_m_rdkit:pr-6257", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/Code/GraphMol/FileParsers/MolFileParser.cpp b/Code/GraphMol/FileParsers/MolFileParser.cpp\nindex cb3c9e5cf6d..df8a93560e0 100644\n--- a/Code/GraphMol/FileParsers/MolFileParser.cpp\n+++ b/Code/GraphMol/FileParsers/MolFileParser.cpp\n@@ -1388,7 +1388,8 @@ void setRGPProps(const std::string_view symb, Atom *res) {\n res->setProp(common_properties::dummyLabel, symbc);\n }\n \n-void lookupAtomicNumber(Atom *res, const std::string &symb, bool strictParsing) {\n+void lookupAtomicNumber(Atom *res, const std::string &symb,\n+ bool strictParsing) {\n try {\n res->setAtomicNum(PeriodicTable::getTable()->getAtomicNumber(symb));\n } catch (const Invar::Invariant &e) {\n@@ -3057,9 +3058,7 @@ bool ParseV3000CTAB(std::istream *inStream, unsigned int &line, RWMol *mol,\n chiralFlag = FileParserUtils::toUnsigned(splitLine[4]);\n }\n \n- if (chiralFlag) {\n- mol->setProp(common_properties::_MolFileChiralFlag, chiralFlag);\n- }\n+ mol->setProp(common_properties::_MolFileChiralFlag, chiralFlag);\n \n if (nAtoms) {\n ParseV3000AtomBlock(inStream, line, nAtoms, mol, conf, strictParsing);\n@@ -3440,9 +3439,7 @@ RWMol *MolDataStreamToMol(std::istream *inStream, unsigned int &line,\n }\n }\n \n- if (chiralFlag) {\n- res->setProp(common_properties::_MolFileChiralFlag, chiralFlag);\n- }\n+ res->setProp(common_properties::_MolFileChiralFlag, chiralFlag);\n \n Conformer *conf = nullptr;\n try {\ndiff --git a/Code/GraphMol/FileParsers/MolFileStereochem.cpp b/Code/GraphMol/FileParsers/MolFileStereochem.cpp\nindex b179e80ca6c..49ba6e92c28 100644\n--- a/Code/GraphMol/FileParsers/MolFileStereochem.cpp\n+++ b/Code/GraphMol/FileParsers/MolFileStereochem.cpp\n@@ -321,4 +321,59 @@ void markUnspecifiedStereoAsUnknown(ROMol &mol, int confId) {\n }\n }\n \n+void translateChiralFlagToStereoGroups(ROMol &mol,\n+ StereoGroupType zeroFlagGroupType) {\n+ if (!mol.hasProp(common_properties::_MolFileChiralFlag)) {\n+ return;\n+ }\n+ int flagVal = 0;\n+ mol.getProp(common_properties::_MolFileChiralFlag, flagVal);\n+ mol.clearProp(common_properties::_MolFileChiralFlag);\n+\n+ StereoGroupType sgType =\n+ flagVal ? StereoGroupType::STEREO_ABSOLUTE : zeroFlagGroupType;\n+\n+ auto sgs = mol.getStereoGroups();\n+\n+ boost::dynamic_bitset<> sgAtoms(mol.getNumAtoms());\n+ const StereoGroup *absGroup = nullptr;\n+ for (const auto &sg : sgs) {\n+ for (const auto aptr : sg.getAtoms()) {\n+ sgAtoms.set(aptr->getIdx());\n+ }\n+ // if we already have an ABS group, we'll add to it\n+ if (sgType == StereoGroupType::STEREO_ABSOLUTE && !absGroup &&\n+ sg.getGroupType() == StereoGroupType::STEREO_ABSOLUTE) {\n+ absGroup = &sg;\n+ }\n+ }\n+ ROMol::ATOM_PTR_VECT stereoAts;\n+ for (const auto atom : mol.atoms()) {\n+ if (!sgAtoms[atom->getIdx()] &&\n+ (atom->getChiralTag() == Atom::ChiralType::CHI_TETRAHEDRAL_CCW ||\n+ atom->getChiralTag() == Atom::ChiralType::CHI_TETRAHEDRAL_CW)) {\n+ stereoAts.push_back(atom);\n+ }\n+ }\n+ if (!stereoAts.empty()) {\n+ if (!absGroup) {\n+ sgs.emplace_back(sgType, stereoAts);\n+ mol.setStereoGroups(sgs);\n+ } else {\n+ std::vector<StereoGroup> newSgs;\n+ for (const auto &sg : sgs) {\n+ if (&sg != absGroup) {\n+ newSgs.push_back(sg);\n+ } else {\n+ ROMol::ATOM_PTR_VECT newStereoAtoms = sg.getAtoms();\n+ newStereoAtoms.insert(newStereoAtoms.end(), stereoAts.begin(),\n+ stereoAts.end());\n+ newSgs.emplace_back(StereoGroupType::STEREO_ABSOLUTE, newStereoAtoms);\n+ }\n+ }\n+ mol.setStereoGroups(newSgs);\n+ }\n+ }\n+}\n+\n } // namespace RDKit\ndiff --git a/Code/GraphMol/FileParsers/MolFileStereochem.h b/Code/GraphMol/FileParsers/MolFileStereochem.h\nindex 405d68fe094..47a691ba912 100644\n--- a/Code/GraphMol/FileParsers/MolFileStereochem.h\n+++ b/Code/GraphMol/FileParsers/MolFileStereochem.h\n@@ -1,5 +1,5 @@\n //\n-// Copyright (C) 2004-2021 Greg Landrum and other RDKit contributors\n+// Copyright (C) 2004-2023 Greg Landrum and other RDKit contributors\n //\n // @@ All Rights Reserved @@\n // This file is part of the RDKit.\n@@ -82,5 +82,27 @@ RDKIT_FILEPARSERS_EXPORT void invertMolBlockWedgingInfo(ROMol &mol);\n RDKIT_FILEPARSERS_EXPORT void markUnspecifiedStereoAsUnknown(ROMol &mol,\n int confId = -1);\n \n+//! generate enhanced stereo groups based on the status of the chiral flag\n+/// property\n+/*\n+ \\param mol: molecule to be modified\n+ \\param zeroFlagGroupType: how to handle non-grouped stereo centers when the\n+ chiral flag is set to zero\n+\n+ If the chiral flag is set to a value of 1 then all specified tetrahedral\n+ chiral centers which are not already in StereoGroups will be added to an\n+ ABS StereoGroup.\n+\n+ If the chiral flag is set to a value of 0 then all specified tetrahedral\n+ chiral centers will be added to a StereoGroup of the type zeroFlagGroupType\n+\n+ If there is no chiral flag set (i.e. the property is not present), the\n+ molecule will not be modified.\n+\n+*/\n+RDKIT_FILEPARSERS_EXPORT void translateChiralFlagToStereoGroups(\n+ ROMol &mol,\n+ StereoGroupType zeroFlagGroupType = StereoGroupType::STEREO_AND);\n+\n } // namespace RDKit\n #endif\ndiff --git a/Code/GraphMol/FileParsers/molfile_stereo_catch.cpp b/Code/GraphMol/FileParsers/molfile_stereo_catch.cpp\nindex 477b21d993e..4b295a3cee6 100644\n--- a/Code/GraphMol/FileParsers/molfile_stereo_catch.cpp\n+++ b/Code/GraphMol/FileParsers/molfile_stereo_catch.cpp\n@@ -32,8 +32,150 @@ TEST_CASE(\"Github #5863: failure in WedgeMolBonds\") {\n std::unique_ptr<ROMol> frag(Subgraphs::pathToSubmol(*mol, env));\n REQUIRE(frag);\n WedgeMolBonds(*frag, &frag->getConformer());\n+ INFO(MolToV3KMolBlock(*frag));\n CHECK(frag->getBondBetweenAtoms(9, 10)->getBondDir() !=\n Bond::BondDir::NONE);\n- std::cerr << MolToV3KMolBlock(*frag) << std::endl;\n }\n-}\n\\ No newline at end of file\n+}\n+\n+TEST_CASE(\"translating the chiral flag to stereo groups\") {\n+ SECTION(\"basics\") {\n+ auto withFlag = R\"CTAB(\n+ Mrv2211 03302308372D \n+\n+ 5 4 0 0 1 0 999 V2000\n+ -6.5625 3.9286 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0\n+ -5.8480 4.3411 0.0000 C 0 0 1 0 0 0 0 0 0 0 0 0\n+ -5.1336 3.9286 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0\n+ -6.1775 5.0826 0.0000 F 0 0 0 0 0 0 0 0 0 0 0 0\n+ -5.4384 5.0893 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\n+ 1 2 1 0 0 0 0\n+ 2 3 1 0 0 0 0\n+ 2 5 1 1 0 0 0\n+ 2 4 1 6 0 0 0\n+M END\n+)CTAB\"_ctab;\n+ REQUIRE(withFlag);\n+ int flag;\n+ CHECK(withFlag->getPropIfPresent(common_properties::_MolFileChiralFlag,\n+ flag));\n+ CHECK(flag == 1);\n+ RWMol zeroFlag(*withFlag);\n+ zeroFlag.setProp(common_properties::_MolFileChiralFlag, 0);\n+ RWMol noFlag(*withFlag);\n+ noFlag.clearProp(common_properties::_MolFileChiralFlag);\n+ CHECK(withFlag->getStereoGroups().empty());\n+\n+ translateChiralFlagToStereoGroups(*withFlag);\n+ CHECK(!withFlag->hasProp(common_properties::_MolFileChiralFlag));\n+ auto sgs = withFlag->getStereoGroups();\n+ REQUIRE(sgs.size() == 1);\n+ CHECK(sgs[0].getGroupType() == StereoGroupType::STEREO_ABSOLUTE);\n+ CHECK(sgs[0].getAtoms().size() == 1);\n+ CHECK(sgs[0].getAtoms()[0]->getIdx() == 1);\n+\n+ {\n+ RWMol cp(zeroFlag);\n+ translateChiralFlagToStereoGroups(cp);\n+ CHECK(!cp.hasProp(common_properties::_MolFileChiralFlag));\n+ auto sgs = cp.getStereoGroups();\n+ REQUIRE(sgs.size() == 1);\n+ CHECK(sgs[0].getGroupType() == StereoGroupType::STEREO_AND);\n+ CHECK(sgs[0].getAtoms().size() == 1);\n+ CHECK(sgs[0].getAtoms()[0]->getIdx() == 1);\n+ }\n+ {\n+ RWMol cp(zeroFlag);\n+ translateChiralFlagToStereoGroups(cp, StereoGroupType::STEREO_OR);\n+ CHECK(!cp.hasProp(common_properties::_MolFileChiralFlag));\n+ auto sgs = cp.getStereoGroups();\n+ REQUIRE(sgs.size() == 1);\n+ CHECK(sgs[0].getGroupType() == StereoGroupType::STEREO_OR);\n+ CHECK(sgs[0].getAtoms().size() == 1);\n+ CHECK(sgs[0].getAtoms()[0]->getIdx() == 1);\n+ }\n+\n+ translateChiralFlagToStereoGroups(noFlag);\n+ CHECK(!noFlag.hasProp(common_properties::_MolFileChiralFlag));\n+ CHECK(noFlag.getStereoGroups().empty());\n+ }\n+\n+ SECTION(\"explicit zero chiral flag\") {\n+ auto zeroFlag = R\"CTAB(\n+ Mrv2211 03302308372D \n+\n+ 5 4 0 0 o 0 999 V2000\n+ -6.5625 3.9286 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0\n+ -5.8480 4.3411 0.0000 C 0 0 1 0 0 0 0 0 0 0 0 0\n+ -5.1336 3.9286 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0\n+ -6.1775 5.0826 0.0000 F 0 0 0 0 0 0 0 0 0 0 0 0\n+ -5.4384 5.0893 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\n+ 1 2 1 0 0 0 0\n+ 2 3 1 0 0 0 0\n+ 2 5 1 1 0 0 0\n+ 2 4 1 6 0 0 0\n+M END\n+)CTAB\"_ctab;\n+ REQUIRE(zeroFlag);\n+ int flag;\n+ CHECK(zeroFlag->getPropIfPresent(common_properties::_MolFileChiralFlag,\n+ flag));\n+ CHECK(flag == 0);\n+ {\n+ RWMol cp(*zeroFlag);\n+ translateChiralFlagToStereoGroups(cp);\n+ CHECK(!cp.hasProp(common_properties::_MolFileChiralFlag));\n+ auto sgs = cp.getStereoGroups();\n+ REQUIRE(sgs.size() == 1);\n+ CHECK(sgs[0].getGroupType() == StereoGroupType::STEREO_AND);\n+ CHECK(sgs[0].getAtoms().size() == 1);\n+ CHECK(sgs[0].getAtoms()[0]->getIdx() == 1);\n+ }\n+ }\n+\n+ SECTION(\"multiple stereocenters\") {\n+ auto noFlag = \"C[C@@](N)(F)C[C@](C)(O)F\"_smiles;\n+ REQUIRE(noFlag);\n+ RWMol withFlag(*noFlag);\n+ withFlag.setProp(common_properties::_MolFileChiralFlag, 1);\n+\n+ CHECK(withFlag.getStereoGroups().empty());\n+ translateChiralFlagToStereoGroups(withFlag);\n+ CHECK(!withFlag.hasProp(common_properties::_MolFileChiralFlag));\n+ auto sgs = withFlag.getStereoGroups();\n+ REQUIRE(sgs.size() == 1);\n+ CHECK(sgs[0].getGroupType() == StereoGroupType::STEREO_ABSOLUTE);\n+ CHECK(sgs[0].getAtoms().size() == 2);\n+ CHECK(sgs[0].getAtoms()[0]->getIdx() == 1);\n+ CHECK(sgs[0].getAtoms()[1]->getIdx() == 5);\n+\n+ {\n+ RWMol zeroFlag(*noFlag);\n+ zeroFlag.setProp(common_properties::_MolFileChiralFlag, 0);\n+ translateChiralFlagToStereoGroups(zeroFlag);\n+ CHECK(!zeroFlag.hasProp(common_properties::_MolFileChiralFlag));\n+ auto sgs = zeroFlag.getStereoGroups();\n+ REQUIRE(sgs.size() == 1);\n+ CHECK(sgs[0].getGroupType() == StereoGroupType::STEREO_AND);\n+ CHECK(sgs[0].getAtoms().size() == 2);\n+ CHECK(sgs[0].getAtoms()[0]->getIdx() == 1);\n+ CHECK(sgs[0].getAtoms()[1]->getIdx() == 5);\n+ }\n+ }\n+\n+ SECTION(\"pre-existing ABS stereogroup\") {\n+ auto withFlag = \"C[C@@](N)(F)C[C@](C)(O)F |a:1|\"_smiles;\n+ REQUIRE(withFlag);\n+ withFlag->setProp(common_properties::_MolFileChiralFlag, 1);\n+\n+ CHECK(withFlag->getStereoGroups().size() == 1);\n+ translateChiralFlagToStereoGroups(*withFlag);\n+ CHECK(!withFlag->hasProp(common_properties::_MolFileChiralFlag));\n+ auto sgs = withFlag->getStereoGroups();\n+ REQUIRE(sgs.size() == 1);\n+ CHECK(sgs[0].getGroupType() == StereoGroupType::STEREO_ABSOLUTE);\n+ CHECK(sgs[0].getAtoms().size() == 2);\n+ CHECK(sgs[0].getAtoms()[0]->getIdx() == 1);\n+ CHECK(sgs[0].getAtoms()[1]->getIdx() == 5);\n+ }\n+}\ndiff --git a/Code/GraphMol/Wrap/MolOps.cpp b/Code/GraphMol/Wrap/MolOps.cpp\nindex d199197ef9e..f1c97c09d74 100644\n--- a/Code/GraphMol/Wrap/MolOps.cpp\n+++ b/Code/GraphMol/Wrap/MolOps.cpp\n@@ -2878,6 +2878,27 @@ A note on the flags controlling which atoms/bonds are modified:\n Chirality::getUseLegacyStereoPerception,\n \"returns whether or not the legacy stereo perception code is \"\n \"being used\");\n+\n+ python::def(\n+ \"TranslateChiralFlagToStereoGroups\", translateChiralFlagToStereoGroups,\n+ (python::arg(\"mol\"),\n+ python::arg(\"zeroFlagGroupType\") = StereoGroupType::STEREO_AND),\n+ R\"DOC(Generate enhanced stereo groups based on the status of the chiral flag property.\n+\n+ Arguments:\n+ - mol: molecule to be modified\n+ - zeroFlagGroupType: how to handle non-grouped stereo centers when the\n+ chiral flag is set to zero\n+\n+ If the chiral flag is set to a value of 1 then all specified tetrahedral\n+ chiral centers which are not already in StereoGroups will be added to an\n+ ABS StereoGroup.\n+\n+ If the chiral flag is set to a value of 0 then all specified tetrahedral\n+ chiral centers will be added to a StereoGroup of the type zeroFlagGroupType\n+\n+ If there is no chiral flag set (i.e. the property is not present), the\n+ molecule will not be modified.)DOC\");\n }\n };\n } // namespace RDKit\ndiff --git a/ReleaseNotes.md b/ReleaseNotes.md\nindex ed8dcd520ab..fd56319c6e9 100644\n--- a/ReleaseNotes.md\n+++ b/ReleaseNotes.md\n@@ -12,6 +12,7 @@\n - The doIsomericSmiles parameter in Java and C# ROMol.MolToSmiles() now defaults to true (previously it was false), thus aligning to the C++ and Python behavior.\n - Double bonds which are marked as crossed (i.e. `bond.GetBondDir() == Bond.BondDir.EITHERDOUBLE`) now have their BondStereo set to `Bond.BondStereo.STEREOANY` and the BondDir information removed by default when molecules are parsed or `AssignStereochemistry()` is called with the `cleanIt` argument set to True.\n - The conformers generated for molecules with three-coordinate chiral centers will be somewhat different due to the fix for #5883.\n+- Molecules which come from Mol or SDF files will now always have the \"_MolFileChiralFlag\" property set to the value of the chiral flag in the CTAB. In previous versions the property was not set if the chiral flag was 0.\n \n \n ## Bug Fixes:\n"}, "test": {"test_patch": "diff --git a/Code/GraphMol/FileParsers/testMolWriter.cpp b/Code/GraphMol/FileParsers/testMolWriter.cpp\nindex 3f2f8818dda..78275f62864 100644\n--- a/Code/GraphMol/FileParsers/testMolWriter.cpp\n+++ b/Code/GraphMol/FileParsers/testMolWriter.cpp\n@@ -697,7 +697,8 @@ void testMolFileChiralFlag() {\n std::string mb = MolToMolBlock(*m1);\n delete m1;\n m1 = MolBlockToMol(mb);\n- TEST_ASSERT(!m1->hasProp(common_properties::_MolFileChiralFlag));\n+ TEST_ASSERT(m1->hasProp(common_properties::_MolFileChiralFlag));\n+ TEST_ASSERT(m1->getProp<int>(common_properties::_MolFileChiralFlag) == 0);\n delete m1;\n }\n {\ndiff --git a/Code/GraphMol/Wrap/rough_test.py b/Code/GraphMol/Wrap/rough_test.py\nindex ef86bd8a9ec..2fce864decb 100644\n--- a/Code/GraphMol/Wrap/rough_test.py\n+++ b/Code/GraphMol/Wrap/rough_test.py\n@@ -1,5 +1,5 @@\n #\n-# Copyright (C) 2003-2021 Greg Landrum and other RDKit contributors\n+# Copyright (C) 2003-2023 Greg Landrum and other RDKit contributors\n # All Rights Reserved\n #\n \"\"\" This is a rough coverage test of the python wrapper\n@@ -4376,6 +4376,7 @@ def testSDProps(self):\n 'NCI_AIDS_Antiviral_Screen_IC50': '2.00E-04\\tM\\t=\\t2.46E-05\\t3',\n '_Name': 48,\n 'CAS_RN': '15716-70-8',\n+ '_MolFileChiralFlag': 0,\n '_MolFileComments': '15716-70-8',\n 'NCI_AIDS_Antiviral_Screen_EC50': '2.00E-04\\tM\\t>\\t2.00E-04\\t3',\n 'NCI_AIDS_Antiviral_Screen_Conclusion': 'CI'\n@@ -4386,6 +4387,7 @@ def testSDProps(self):\n 'NCI_AIDS_Antiviral_Screen_IC50': '2.00E-04\\tM\\t=\\t9.80E-05\\t3',\n '_Name': 78,\n 'CAS_RN': '6290-84-2',\n+ '_MolFileChiralFlag': 0,\n '_MolFileComments': '6290-84-2',\n 'NCI_AIDS_Antiviral_Screen_EC50': '2.00E-04\\tM\\t>\\t2.00E-04\\t3',\n 'NCI_AIDS_Antiviral_Screen_Conclusion': 'CI'\n@@ -4396,6 +4398,7 @@ def testSDProps(self):\n 'NCI_AIDS_Antiviral_Screen_IC50': '2.00E-04\\tM\\t=\\t4.60E-05\\t4',\n '_Name': 128,\n 'CAS_RN': '5395-10-8',\n+ '_MolFileChiralFlag': 0,\n '_MolFileComments': '5395-10-8',\n 'NCI_AIDS_Antiviral_Screen_EC50': '2.00E-04\\tM\\t>\\t2.00E-04\\t4',\n 'NCI_AIDS_Antiviral_Screen_Conclusion': 'CI'\n@@ -4406,6 +4409,7 @@ def testSDProps(self):\n 'NCI_AIDS_Antiviral_Screen_IC50': '6.75E-04\\tM\\t>\\t6.75E-04\\t2',\n '_Name': 163,\n 'CAS_RN': '81-11-8',\n+ '_MolFileChiralFlag': 0,\n '_MolFileComments': '81-11-8',\n 'NCI_AIDS_Antiviral_Screen_EC50': '6.75E-04\\tM\\t>\\t6.75E-04\\t2',\n 'NCI_AIDS_Antiviral_Screen_Conclusion': 'CI'\n@@ -4416,6 +4420,7 @@ def testSDProps(self):\n 'NCI_AIDS_Antiviral_Screen_IC50': '2.00E-04\\tM\\t>\\t2.00E-04\\t2',\n '_Name': 164,\n 'CAS_RN': '5325-43-9',\n+ '_MolFileChiralFlag': 0,\n '_MolFileComments': '5325-43-9',\n 'NCI_AIDS_Antiviral_Screen_EC50': '2.00E-04\\tM\\t>\\t2.00E-04\\t2',\n 'NCI_AIDS_Antiviral_Screen_Conclusion': 'CI'\n@@ -4425,6 +4430,7 @@ def testSDProps(self):\n 'NSC': 170,\n '_Name': 170,\n 'CAS_RN': '999-99-9',\n+ '_MolFileChiralFlag': 0,\n '_MolFileComments': '999-99-9',\n 'NCI_AIDS_Antiviral_Screen_EC50': '9.47E-04\\tM\\t>\\t9.47E-04\\t1',\n 'NCI_AIDS_Antiviral_Screen_Conclusion': 'CI'\n@@ -4436,6 +4442,7 @@ def testSDProps(self):\n '6.46E-04\\tM\\t=\\t5.80E-04\\t2\\n1.81E-03\\tM\\t=\\t6.90E-04\\t2',\n '_Name': 180,\n 'CAS_RN': '69-72-7',\n+ '_MolFileChiralFlag': 0,\n '_MolFileComments': '69-72-7',\n 'NCI_AIDS_Antiviral_Screen_EC50':\n '6.46E-04\\tM\\t>\\t6.46E-04\\t2\\n1.81E-03\\tM\\t>\\t1.81E-03\\t2',\n@@ -4447,6 +4454,7 @@ def testSDProps(self):\n 'NCI_AIDS_Antiviral_Screen_IC50': '1.44E-04\\tM\\t=\\t2.49E-05\\t2',\n '_Name': 186,\n 'CAS_RN': '518-75-2',\n+ '_MolFileChiralFlag': 0,\n '_MolFileComments': '518-75-2',\n 'NCI_AIDS_Antiviral_Screen_EC50': '1.44E-04\\tM\\t>\\t1.44E-04\\t2',\n 'NCI_AIDS_Antiviral_Screen_Conclusion': 'CI'\n@@ -4457,6 +4465,7 @@ def testSDProps(self):\n 'NCI_AIDS_Antiviral_Screen_IC50': '2.00E-04\\tM\\t=\\t3.38E-06\\t2',\n '_Name': 192,\n 'CAS_RN': '2217-55-2',\n+ '_MolFileChiralFlag': 0,\n '_MolFileComments': '2217-55-2',\n 'NCI_AIDS_Antiviral_Screen_EC50': '2.00E-04\\tM\\t>\\t2.00E-04\\t2',\n 'NCI_AIDS_Antiviral_Screen_Conclusion': 'CI'\n@@ -4466,6 +4475,7 @@ def testSDProps(self):\n 'NSC': 203,\n '_Name': 203,\n 'CAS_RN': '1155-00-6',\n+ '_MolFileChiralFlag': 0,\n '_MolFileComments': '1155-00-6',\n 'NCI_AIDS_Antiviral_Screen_Conclusion': 'CI'\n },\n@@ -4475,6 +4485,7 @@ def testSDProps(self):\n 'NCI_AIDS_Antiviral_Screen_IC50': '1.33E-03\\tM\\t>\\t1.33E-03\\t2',\n '_Name': 210,\n 'CAS_RN': '5325-75-7',\n+ '_MolFileChiralFlag': 0,\n '_MolFileComments': '5325-75-7',\n 'NCI_AIDS_Antiviral_Screen_EC50': '1.33E-03\\tM\\t>\\t1.33E-03\\t2',\n 'NCI_AIDS_Antiviral_Screen_Conclusion': 'CI'\n@@ -4486,6 +4497,7 @@ def testSDProps(self):\n '2.00E-04\\tM\\t>\\t2.00E-04\\t8\\n2.00E-03\\tM\\t=\\t1.12E-03\\t2',\n '_Name': 211,\n 'CAS_RN': '5325-76-8',\n+ '_MolFileChiralFlag': 0,\n '_MolFileComments': '5325-76-8',\n 'NCI_AIDS_Antiviral_Screen_EC50':\n '2.00E-04\\tM\\t>\\t7.42E-05\\t8\\n2.00E-03\\tM\\t=\\t6.35E-05\\t2',\n@@ -4497,6 +4509,7 @@ def testSDProps(self):\n 'NCI_AIDS_Antiviral_Screen_IC50': '2.00E-04\\tM\\t>\\t2.00E-04\\t4',\n '_Name': 213,\n 'CAS_RN': '119-80-2',\n+ '_MolFileChiralFlag': 0,\n '_MolFileComments': '119-80-2',\n 'NCI_AIDS_Antiviral_Screen_EC50': '2.00E-04\\tM\\t>\\t2.00E-04\\t4',\n 'NCI_AIDS_Antiviral_Screen_Conclusion': 'CI'\n@@ -4507,6 +4520,7 @@ def testSDProps(self):\n 'NCI_AIDS_Antiviral_Screen_IC50': '2.00E-04\\tM\\t>\\t2.00E-04\\t4',\n '_Name': 220,\n 'CAS_RN': '5325-83-7',\n+ '_MolFileChiralFlag': 0,\n '_MolFileComments': '5325-83-7',\n 'NCI_AIDS_Antiviral_Screen_EC50': '2.00E-04\\tM\\t>\\t2.00E-04\\t4',\n 'NCI_AIDS_Antiviral_Screen_Conclusion': 'CI'\n@@ -4517,6 +4531,7 @@ def testSDProps(self):\n 'NCI_AIDS_Antiviral_Screen_IC50': '2.00E-04\\tM\\t>\\t2.00E-04\\t2',\n '_Name': 229,\n 'CAS_RN': '5325-88-2',\n+ '_MolFileChiralFlag': 0,\n '_MolFileComments': '5325-88-2',\n 'NCI_AIDS_Antiviral_Screen_EC50': '2.00E-04\\tM\\t>\\t2.00E-04\\t2',\n 'NCI_AIDS_Antiviral_Screen_Conclusion': 'CI'\n@@ -4527,6 +4542,7 @@ def testSDProps(self):\n 'NCI_AIDS_Antiviral_Screen_IC50': '2.00E-04\\tM\\t>\\t2.00E-04\\t4',\n '_Name': 256,\n 'CAS_RN': '5326-06-7',\n+ '_MolFileChiralFlag': 0,\n '_MolFileComments': '5326-06-7',\n 'NCI_AIDS_Antiviral_Screen_EC50': '2.00E-04\\tM\\t>\\t2.00E-04\\t4',\n 'NCI_AIDS_Antiviral_Screen_Conclusion': 'CI'\n@@ -7214,6 +7230,38 @@ def test_DativeBondsToHaptic(self):\n backfemol = Chem.rdmolops.DativeBondsToHaptic(newfemol)\n self.assertEqual(Chem.MolToSmiles(femol), Chem.MolToSmiles(backfemol))\n \n+ def testTranslateChiralFlag(self):\n+ mol = Chem.MolFromSmiles(\"C[C@@](N)(F)C[C@](C)(O)F |a:1|\")\n+ flagMol = Chem.Mol(mol)\n+ flagMol.SetIntProp(\"_MolFileChiralFlag\",1)\n+ Chem.TranslateChiralFlagToStereoGroups(flagMol)\n+ sgs = flagMol.GetStereoGroups()\n+ self.assertEqual(len(sgs),1)\n+ self.assertEqual(len(sgs[0].GetAtoms()), 2)\n+ self.assertEqual(sgs[0].GetGroupType(), Chem.StereoGroupType.STEREO_ABSOLUTE)\n+\n+ flagMol = Chem.Mol(mol)\n+ flagMol.SetIntProp(\"_MolFileChiralFlag\",0)\n+ Chem.TranslateChiralFlagToStereoGroups(flagMol)\n+ sgs = flagMol.GetStereoGroups()\n+ self.assertEqual(len(sgs),2)\n+ self.assertEqual(sgs[0].GetGroupType(), Chem.StereoGroupType.STEREO_ABSOLUTE)\n+ self.assertEqual(len(sgs[0].GetAtoms()), 1)\n+\n+ self.assertEqual(sgs[1].GetGroupType(), Chem.StereoGroupType.STEREO_AND)\n+ self.assertEqual(len(sgs[1].GetAtoms()), 1)\n+\n+ flagMol = Chem.Mol(mol)\n+ flagMol.SetIntProp(\"_MolFileChiralFlag\",0)\n+ Chem.TranslateChiralFlagToStereoGroups(flagMol, Chem.StereoGroupType.STEREO_OR)\n+ sgs = flagMol.GetStereoGroups()\n+ self.assertEqual(len(sgs),2)\n+ self.assertEqual(sgs[0].GetGroupType(), Chem.StereoGroupType.STEREO_ABSOLUTE)\n+ self.assertEqual(len(sgs[0].GetAtoms()), 1)\n+\n+ self.assertEqual(sgs[1].GetGroupType(), Chem.StereoGroupType.STEREO_OR)\n+ self.assertEqual(len(sgs[1].GetAtoms()), 1)\n+\n \n if __name__ == '__main__':\n if \"RDTESTCASE\" in os.environ:\n", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}224{"question_id": "MSB_rdkit_rdkit_pr6482", "question_type": "multi_swe_bench", "description": "Fixes #6479 (rdkit/rdkit#6482)", "content": {"org": "rdkit", "repo": "rdkit", "pr_number": 6482, "issue_title": "Fixes #6479", "issue_body": "This makes sure that information which is not going to be in the output SMILES doesn't end up getting used in the canonicalization.\r\n", "base_commit": "caa0cdca3e717d1fe37f039e570182220cad534d", "resolved_issues": [{"number": 6479, "title": "StereoGroup information should not impact canonicalization when CXSMILES isn't being generated", "body": "**Describe the bug**\r\nInformation about StereoGroups is used in the canonicalization process (unless includeChirality is false). This is fine if we're generating CXSMILES (where you see the stereogroup info), but problematic when generating SMILES.\r\n\r\nWe should only be including information in the canonicalization which will eventually show up in the SMILES.\r\n\r\nHere's the demo:\r\n```\r\nIn [16]: Chem.CanonSmiles('F[C@H](Cl)NCO[C@H](F)Cl |&1:6|',useChiral=True)\r\nOut[16]: 'F[C@H](Cl)NCO[C@H](F)Cl'\r\n\r\nIn [17]: Chem.CanonSmiles('F[C@H](Cl)OCN[C@H](F)Cl |&1:6|',useChiral=True)\r\nOut[17]: 'F[C@H](Cl)OCN[C@H](F)Cl'\r\n\r\nIn [18]: Chem.CanonSmiles(_16)==Chem.CanonSmiles(_17)\r\nOut[18]: True\r\n```\r\n\r\n**Configuration (please complete the following information):**\r\n - RDKit version: release and master\r\n - OS: all\r\n"}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/rdkit_m_rdkit:pr-6482", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/Code/GraphMol/Canon.cpp b/Code/GraphMol/Canon.cpp\nindex 55a80ec73c6..53277f71b5c 100644\n--- a/Code/GraphMol/Canon.cpp\n+++ b/Code/GraphMol/Canon.cpp\n@@ -1228,7 +1228,8 @@ void canonicalizeFragment(ROMol &mol, int atomIdx,\n }\n }\n } else if (size_t sgidx;\n- msI.obj.atom->getPropIfPresent(\"_stereoGroup\", sgidx)) {\n+ msI.obj.atom->getPropIfPresent(\"_stereoGroup\", sgidx) &&\n+ mol.getStereoGroups().size() > sgidx) {\n // make sure that the reference atom in the stereogroup is CCW\n auto &sg = mol.getStereoGroups()[sgidx];\n bool swapIt =\ndiff --git a/Code/GraphMol/FileParsers/cdxml_parser_catch.cpp b/Code/GraphMol/FileParsers/cdxml_parser_catch.cpp\nindex da6534bc2f5..882599250ce 100644\n--- a/Code/GraphMol/FileParsers/cdxml_parser_catch.cpp\n+++ b/Code/GraphMol/FileParsers/cdxml_parser_catch.cpp\n@@ -426,7 +426,7 @@ TEST_CASE(\"CDXML\") {\n SECTION(\"Enhanced Stereo\") {\n auto fname = cdxmlbase + \"beta-cypermethrin.cdxml\";\n std::vector<std::string> expected = {\n- \"CC1(C)[C@H](C=C(Cl)Cl)[C@@H]1C(=O)O[C@H](C#N)c1cccc(Oc2ccccc2)c1\"};\n+ \"CC1(C)[C@H](C=C(Cl)Cl)[C@H]1C(=O)O[C@@H](C#N)c1cccc(Oc2ccccc2)c1\"};\n std::vector<std::string> expected_cx = {\n \"CC1(C)[C@H](C=C(Cl)Cl)[C@@H]1C(=O)O[C@H](C#N)c1cccc(Oc2ccccc2)c1 |&1:3,&2:8,12|\"};\n auto mols = CDXMLFileToMols(fname);\n@@ -441,7 +441,7 @@ TEST_CASE(\"CDXML\") {\n SECTION(\"Enhanced Stereo 2\") {\n auto fname = cdxmlbase + \"beta-cypermethrin-or-abs.cdxml\";\n std::vector<std::string> expected = {\n- \"CC1(C)[C@H](C=C(Cl)Cl)[C@@H]1C(=O)O[C@H](C#N)c1cccc(Oc2ccccc2)c1\"};\n+ \"CC1(C)[C@H](C=C(Cl)Cl)[C@H]1C(=O)O[C@@H](C#N)c1cccc(Oc2ccccc2)c1\"};\n std::vector<std::string> expected_cx = {\n \"CC1(C)[C@H](C=C(Cl)Cl)[C@@H]1C(=O)O[C@H](C#N)c1cccc(Oc2ccccc2)c1 |o1:8,12|\"};\n auto mols = CDXMLFileToMols(fname);\ndiff --git a/Code/GraphMol/MolHash/hashfunctions.cpp b/Code/GraphMol/MolHash/hashfunctions.cpp\nindex 9869ebb778e..223162677a7 100644\n--- a/Code/GraphMol/MolHash/hashfunctions.cpp\n+++ b/Code/GraphMol/MolHash/hashfunctions.cpp\n@@ -295,6 +295,14 @@ void NormalizeHCount(Atom *aptr) {\n aptr->setNumExplicitHs(hcount);\n }\n \n+namespace {\n+std::string convertToSmilesWithCXFlags(\n+ const RWMol &mol, bool doingCXSmiles,\n+ SmilesWriteParams ps = SmilesWriteParams()) {\n+ return SmilesWrite::detail::MolToSmiles(mol, ps, doingCXSmiles);\n+}\n+} // namespace\n+\n std::string AnonymousGraph(RWMol *mol, bool elem, bool useCXSmiles,\n unsigned cxFlagsToSkip = 0) {\n PRECONDITION(mol, \"bad molecule\");\n@@ -325,7 +333,7 @@ std::string AnonymousGraph(RWMol *mol, bool elem, bool useCXSmiles,\n bool force = true;\n MolOps::assignStereochemistry(*mol, cleanIt, force);\n \n- result = MolToSmiles(*mol);\n+ result = convertToSmilesWithCXFlags(*mol, useCXSmiles);\n \n if (useCXSmiles) {\n addCXExtensions(mol, result, cxFlagsToSkip | SmilesWrite::CX_RADICALS);\n@@ -359,7 +367,7 @@ std::string MesomerHash(RWMol *mol, bool netq, bool useCXSmiles,\n bool force = true;\n MolOps::assignStereochemistry(*mol, cleanIt, force);\n \n- result = MolToSmiles(*mol);\n+ result = convertToSmilesWithCXFlags(*mol, useCXSmiles);\n if (netq) {\n sprintf(buffer, \"_%d\", charge);\n result += buffer;\n@@ -637,7 +645,7 @@ std::string TautomerHashv2(RWMol *mol, bool proto, bool useCXSmiles,\n SmilesWriteParams ps;\n ps.allBondsExplicit = true;\n ps.allHsExplicit = true;\n- result = MolToSmiles(*mol, ps);\n+ result = convertToSmilesWithCXFlags(*mol, useCXSmiles, ps);\n char buffer[32];\n if (!proto) {\n sprintf(buffer, \"_%d_%d\", hcount, charge);\n@@ -687,7 +695,7 @@ std::string TautomerHash(RWMol *mol, bool proto, bool useCXSmiles,\n bool cleanIt = true;\n bool force = true;\n MolOps::assignStereochemistry(*mol, cleanIt, force);\n- result = MolToSmiles(*mol);\n+ result = convertToSmilesWithCXFlags(*mol, useCXSmiles);\n if (!proto) {\n sprintf(buffer, \"_%d_%d\", hcount, charge);\n } else {\n@@ -805,7 +813,7 @@ std::string ExtendedMurckoScaffold(RWMol *mol, bool useCXSmiles,\n MolOps::assignStereochemistry(*mol, cleanIt, force);\n \n std::string result;\n- result = MolToSmiles(*mol);\n+ result = convertToSmilesWithCXFlags(*mol, useCXSmiles);\n if (useCXSmiles) {\n addCXExtensions(mol, result, cxFlagsToSkip | SmilesWrite::CX_RADICALS);\n }\n@@ -849,7 +857,7 @@ std::string MurckoScaffoldHash(RWMol *mol, bool useCXSmiles,\n MolOps::assignStereochemistry(*mol, cleanIt, force);\n \n std::string result;\n- result = MolToSmiles(*mol);\n+ result = convertToSmilesWithCXFlags(*mol, useCXSmiles);\n if (useCXSmiles) {\n addCXExtensions(mol, result, cxFlagsToSkip | SmilesWrite::CX_RADICALS);\n }\n@@ -1029,7 +1037,7 @@ std::string RegioisomerHash(RWMol *mol, bool useCXSmiles,\n bool force = true;\n MolOps::assignStereochemistry(*mol, cleanIt, force);\n \n- std::string result = MolToSmiles(*mol);\n+ auto result = convertToSmilesWithCXFlags(*mol, useCXSmiles);\n if (useCXSmiles) {\n addCXExtensions(mol, result, cxFlagsToSkip);\n }\n@@ -1172,7 +1180,7 @@ std::string MolHash(RWMol *mol, HashFunction func, bool useCXSmiles,\n result = AnonymousGraph(mol, true, useCXSmiles, cxFlagsToSkip);\n break;\n case HashFunction::CanonicalSmiles:\n- result = MolToSmiles(*mol);\n+ result = convertToSmilesWithCXFlags(*mol, useCXSmiles);\n if (useCXSmiles) {\n addCXExtensions(mol, result, cxFlagsToSkip);\n }\ndiff --git a/Code/GraphMol/RGroupDecomposition/catch_rgd.cpp b/Code/GraphMol/RGroupDecomposition/catch_rgd.cpp\nindex 9f6b099c444..be248c5a147 100644\n--- a/Code/GraphMol/RGroupDecomposition/catch_rgd.cpp\n+++ b/Code/GraphMol/RGroupDecomposition/catch_rgd.cpp\n@@ -462,22 +462,22 @@ TEST_CASE(\"substructure parameters and RGD: enhanced stereo\") {\n CHECK(flatten_whitespace(toJSON(rows)) == flatten_whitespace(R\"JSON(\n [\n {\n- \"Core\":\"C1C[C@]([*:1])([*:2])N1\",\n+ \"Core\":\"C1C[C@@]([*:1])([*:2])N1\",\n \"R1\":\"F[*:1]\",\n \"R2\":\"[H][*:2]\"\n },\n {\n- \"Core\":\"C1C[C@]([*:1])([*:2])N1\",\n+ \"Core\":\"C1C[C@@]([*:1])([*:2])N1\",\n \"R1\":\"O[*:1]\",\n \"R2\":\"F[*:2]\"\n },\n {\n- \"Core\":\"C1C[C@]([*:1])([*:2])N1\",\n+ \"Core\":\"C1C[C@@]([*:1])([*:2])N1\",\n \"R1\":\"[H][*:1]\",\n \"R2\":\"F[*:2]\"\n },\n {\n- \"Core\":\"C1C[C@]([*:1])([*:2])N1\",\n+ \"Core\":\"C1C[C@@]([*:1])([*:2])N1\",\n \"R1\":\"Cl[*:1]\",\n \"R2\":\"[H][*:2]\"\n }\n@@ -496,22 +496,22 @@ TEST_CASE(\"substructure parameters and RGD: enhanced stereo\") {\n CHECK(flatten_whitespace(toJSON(rows)) == flatten_whitespace(R\"JSON(\n [\n {\n- \"Core\":\"C1C[C@]([*:1])([*:2])N1\",\n+ \"Core\":\"C1C[C@@]([*:1])([*:2])N1\",\n \"R1\":\"F[*:1]\",\n \"R2\":\"[H][*:2]\"\n },\n {\n- \"Core\":\"C1C[C@]([*:1])([*:2])N1\",\n+ \"Core\":\"C1C[C@@]([*:1])([*:2])N1\",\n \"R1\":\"O[*:1]\",\n \"R2\":\"F[*:2]\"\n },\n {\n- \"Core\":\"C1C[C@]([*:1])([*:2])N1\",\n+ \"Core\":\"C1C[C@@]([*:1])([*:2])N1\",\n \"R1\":\"[H][*:1]\",\n \"R2\":\"F[*:2]\"\n },\n {\n- \"Core\":\"C1C[C@]([*:1])([*:2])N1\",\n+ \"Core\":\"C1C[C@@]([*:1])([*:2])N1\",\n \"R1\":\"Cl[*:1]\",\n \"R2\":\"[H][*:2]\"\n }\n@@ -537,7 +537,7 @@ TEST_CASE(\"substructure parameters and RGD: enhanced stereo\") {\n CHECK(flatten_whitespace(toJSON(rows)) == flatten_whitespace(R\"JSON(\n [\n {\n- \"Core\":\"C1C[C@]([*:1])([*:2])N1\",\n+ \"Core\":\"C1C[C@@]([*:1])([*:2])N1\",\n \"R1\":\"F[*:1]\",\n \"R2\":\"[H][*:2]\"\n },\n@@ -565,7 +565,7 @@ TEST_CASE(\"substructure parameters and RGD: enhanced stereo\") {\n CHECK(flatten_whitespace(toJSON(rows)) == flatten_whitespace(R\"JSON(\n [\n {\n- \"Core\":\"C1C[C@]([*:1])([*:2])N1\",\n+ \"Core\":\"C1C[C@@]([*:1])([*:2])N1\",\n \"R1\":\"F[*:1]\",\n \"R2\":\"[H][*:2]\"\n },\n@@ -580,7 +580,7 @@ TEST_CASE(\"substructure parameters and RGD: enhanced stereo\") {\n \"R2\":\"[H][*:2]\"\n },\n {\n- \"Core\":\"C1C[C@]([*:1])([*:2])N1\",\n+ \"Core\":\"C1C[C@@]([*:1])([*:2])N1\",\n \"R1\":\"Cl[*:1]\",\n \"R2\":\"[H][*:2]\"\n }\ndiff --git a/Code/GraphMol/SmilesParse/SmilesWrite.cpp b/Code/GraphMol/SmilesParse/SmilesWrite.cpp\nindex 6615e7febbc..aa2f86380f6 100644\n--- a/Code/GraphMol/SmilesParse/SmilesWrite.cpp\n+++ b/Code/GraphMol/SmilesParse/SmilesWrite.cpp\n@@ -460,7 +460,10 @@ static bool SortBasedOnFirstElement(\n return a.first < b.first;\n }\n \n-std::string MolToSmiles(const ROMol &mol, const SmilesWriteParams ¶ms) {\n+namespace SmilesWrite {\n+namespace detail {\n+std::string MolToSmiles(const ROMol &mol, const SmilesWriteParams ¶ms,\n+ bool doingCXSmiles) {\n if (!mol.getNumAtoms()) {\n return \"\";\n }\n@@ -520,6 +523,16 @@ std::string MolToSmiles(const ROMol &mol, const SmilesWriteParams ¶ms) {\n MolOps::assignStereochemistry(*tmol, true);\n }\n }\n+\n+ if (!doingCXSmiles) {\n+ // remove any stereo groups that may be present. Otherwise they will be\n+ // used in the canonicalization\n+ std::vector<StereoGroup> noStereoGroups;\n+ tmol->setStereoGroups(noStereoGroups);\n+\n+ // if other CXSMILES features are added to the canonicalization code\n+ // in the future, they should be removed here.\n+ }\n #if 0\n std::cout << \"----------------------------\" << std::endl;\n std::cout << \"MolToSmiles:\"<< std::endl;\n@@ -649,10 +662,17 @@ std::string MolToSmiles(const ROMol &mol, const SmilesWriteParams ¶ms) {\n true);\n return result;\n }\n+} // namespace detail\n+} // namespace SmilesWrite\n+std::string MolToSmiles(const ROMol &mol, const SmilesWriteParams ¶ms) {\n+ bool doingCXSmiles = false;\n+ return SmilesWrite::detail::MolToSmiles(mol, params, doingCXSmiles);\n+}\n \n std::string MolToCXSmiles(const ROMol &mol, const SmilesWriteParams ¶ms,\n std::uint32_t flags) {\n- auto res = MolToSmiles(mol, params);\n+ bool doingCXSmiles = true;\n+ auto res = SmilesWrite::detail::MolToSmiles(mol, params, doingCXSmiles);\n if (!res.empty()) {\n if (!params.doIsomericSmiles) {\n flags &= ~(SmilesWrite::CXSmilesFields::CX_ENHANCEDSTEREO |\ndiff --git a/Code/GraphMol/SmilesParse/SmilesWrite.h b/Code/GraphMol/SmilesParse/SmilesWrite.h\nindex 6e14d4218fe..20b9c2d67ea 100644\n--- a/Code/GraphMol/SmilesParse/SmilesWrite.h\n+++ b/Code/GraphMol/SmilesParse/SmilesWrite.h\n@@ -90,6 +90,12 @@ RDKIT_SMILESPARSE_EXPORT std::string GetAtomSmiles(const Atom *atom,\n RDKIT_SMILESPARSE_EXPORT std::string GetBondSmiles(\n const Bond *bond, int atomToLeftIdx = -1, bool doKekule = false,\n bool allBondsExplicit = false);\n+\n+namespace detail {\n+RDKIT_SMILESPARSE_EXPORT std::string MolToSmiles(\n+ const ROMol &mol, const SmilesWriteParams ¶ms, bool doingCXSmiles);\n+}\n+\n } // namespace SmilesWrite\n \n //! \\brief returns canonical SMILES for a molecule\ndiff --git a/Code/GraphMol/catch_canon.cpp b/Code/GraphMol/catch_canon.cpp\nindex c468a6fcf3a..a7fc7add736 100644\n--- a/Code/GraphMol/catch_canon.cpp\n+++ b/Code/GraphMol/catch_canon.cpp\n@@ -348,3 +348,54 @@ TEST_CASE(\"more enhanced stereo canonicalization\") {\n CHECK(MolToCXSmiles(*m1) == MolToCXSmiles(*m2));\n }\n }\n+\n+TEST_CASE(\"ensure unused features are not used\") {\n+ SECTION(\"isotopes\") {\n+ auto mol = \"[13CH3]OC\"_smiles;\n+ REQUIRE(mol);\n+ std::vector<unsigned int> ranks;\n+ bool breakTies = false;\n+ bool includeChirality = true;\n+ bool includeIsotopes = true;\n+ Canon::rankMolAtoms(*mol, ranks, breakTies, includeChirality,\n+ includeIsotopes);\n+ CHECK(ranks[0] != ranks[2]);\n+\n+ includeIsotopes = false;\n+ Canon::rankMolAtoms(*mol, ranks, breakTies, includeChirality,\n+ includeIsotopes);\n+ CHECK(ranks[0] == ranks[2]);\n+ }\n+ SECTION(\"chirality\") {\n+ auto mol = \"F[C@H](Cl)OC(F)Cl\"_smiles;\n+ REQUIRE(mol);\n+ std::vector<unsigned int> ranks;\n+ bool breakTies = false;\n+ bool includeChirality = true;\n+ bool includeIsotopes = true;\n+ Canon::rankMolAtoms(*mol, ranks, breakTies, includeChirality,\n+ includeIsotopes);\n+ CHECK(ranks[1] != ranks[4]);\n+\n+ includeChirality = false;\n+ Canon::rankMolAtoms(*mol, ranks, breakTies, includeChirality,\n+ includeIsotopes);\n+ CHECK(ranks[1] == ranks[4]);\n+ }\n+ SECTION(\"chirality and stereogroups\") {\n+ auto mol = \"F[C@H](Cl)O[C@H](F)Cl |o1:1|\"_smiles;\n+ REQUIRE(mol);\n+ std::vector<unsigned int> ranks;\n+ bool breakTies = false;\n+ bool includeChirality = true;\n+ bool includeIsotopes = true;\n+ Canon::rankMolAtoms(*mol, ranks, breakTies, includeChirality,\n+ includeIsotopes);\n+ CHECK(ranks[1] != ranks[4]);\n+\n+ includeChirality = false;\n+ Canon::rankMolAtoms(*mol, ranks, breakTies, includeChirality,\n+ includeIsotopes);\n+ CHECK(ranks[1] == ranks[4]);\n+ }\n+}\ndiff --git a/Code/PgSQL/rdkit/expected/rdkit-91.out b/Code/PgSQL/rdkit/expected/rdkit-91.out\nindex ec6be8b755a..b7cc07c5e78 100644\n--- a/Code/PgSQL/rdkit/expected/rdkit-91.out\n+++ b/Code/PgSQL/rdkit/expected/rdkit-91.out\n@@ -1340,9 +1340,9 @@ select mol_to_smarts(mol_adjust_query_properties('*c1ncc(*)cc1'::qmol));\n \n -- CXSmiles\n SELECT mol_to_smiles(mol_from_smiles('C[C@H](F)[C@H](C)[C@@H](C)Br |a:1,o1:3,5|'));\n- mol_to_smiles \n-------------------------------\n- C[C@H](F)[C@@H](C)[C@H](C)Br\n+ mol_to_smiles \n+-------------------------------\n+ C[C@@H]([C@H](C)F)[C@@H](C)Br\n (1 row)\n \n SELECT mol_to_cxsmiles(mol_from_smiles('C[C@H](F)[C@H](C)[C@@H](C)Br |a:1,o1:3,5|'));\n"}, "test": {"test_patch": "diff --git a/Code/GraphMol/MolHash/Wrap/testMolHash.py b/Code/GraphMol/MolHash/Wrap/testMolHash.py\nindex 431d6770e3a..c7a05aafde3 100644\n--- a/Code/GraphMol/MolHash/Wrap/testMolHash.py\n+++ b/Code/GraphMol/MolHash/Wrap/testMolHash.py\n@@ -52,7 +52,7 @@ def testCxSmiles(self):\n 'C[C@@H](O)[C@@H](C)[C@@H](C)C[C@H](C1=CN=CN1)C1=CNC=N1 |o1:8,5,&1:1,3,r,c:11,18,t:9,15|')\n \n self.assertEqual(rdMolHash.MolHash(m, rdMolHash.HashFunction.HetAtomTautomer),\n- 'C[C@H](CC([C]1[CH][N][CH][N]1)[C]1[CH][N][CH][N]1)[C@@H](C)[C@H](C)[O]_3_0')\n+ 'C[C@H]([C@@H](C)[O])[C@@H](C)CC([C]1[CH][N][CH][N]1)[C]1[CH][N][CH][N]1_3_0')\n \n self.assertEqual(\n rdMolHash.MolHash(m, rdMolHash.HashFunction.HetAtomTautomer, True),\ndiff --git a/Code/GraphMol/MolHash/catch_tests.cpp b/Code/GraphMol/MolHash/catch_tests.cpp\nindex d6f9249d87f..c146a1dad7b 100644\n--- a/Code/GraphMol/MolHash/catch_tests.cpp\n+++ b/Code/GraphMol/MolHash/catch_tests.cpp\n@@ -241,7 +241,7 @@ TEST_CASE(\"MolHash with CX extensions\", \"[molhash]\") {\n auto hsh = MolHash::MolHash(&cp, MolHash::HashFunction::HetAtomTautomer);\n CHECK(\n hsh ==\n- \"C[C@H](CC([C]1[CH][N][CH][N]1)[C]1[CH][N][CH][N]1)[C@@H](C)[C@H](C)[O]_3_0\");\n+ \"C[C@H]([C@@H](C)[O])[C@@H](C)CC([C]1[CH][N][CH][N]1)[C]1[CH][N][CH][N]1_3_0\");\n }\n {\n RWMol cp(*mol);\ndiff --git a/Code/GraphMol/SmilesParse/catch_tests.cpp b/Code/GraphMol/SmilesParse/catch_tests.cpp\nindex 2a865983844..a7fbf003603 100644\n--- a/Code/GraphMol/SmilesParse/catch_tests.cpp\n+++ b/Code/GraphMol/SmilesParse/catch_tests.cpp\n@@ -20,6 +20,7 @@\n #include <GraphMol/QueryBond.h>\n #include <GraphMol/QueryOps.h>\n #include <GraphMol/Chirality.h>\n+#include <GraphMol/Canon.h>\n #include <GraphMol/SmilesParse/SmilesParse.h>\n #include <GraphMol/SmilesParse/SmilesWrite.h>\n #include <GraphMol/SmilesParse/SmartsWrite.h>\n@@ -2420,4 +2421,102 @@ TEST_CASE(\"smilesSymbol in SMARTS\", \"[smarts][smilesSymbol]\") {\n m->getAtomWithIdx(0)->setProp(common_properties::smilesSymbol, \"Xa\");\n CHECK(MolToSmarts(*m) == \"[Xa;C,N,O]C\");\n }\n-}\n\\ No newline at end of file\n+}\n+\n+TEST_CASE(\"ensure unused features are not used\") {\n+ SECTION(\"isotopes\") {\n+ auto mol1 = \"FOCN[15F]\"_smiles;\n+ REQUIRE(mol1);\n+ auto mol2 = \"[15F]OCNF\"_smiles;\n+ REQUIRE(mol2);\n+ std::vector<unsigned int> ranks;\n+ SmilesWriteParams ps;\n+ ps.doIsomericSmiles = true;\n+ auto smiles = MolToSmiles(*mol1, ps);\n+ CHECK(smiles == \"FOCN[15F]\");\n+ smiles = MolToSmiles(*mol2, ps);\n+ CHECK(smiles == \"FNCO[15F]\");\n+\n+ ps.doIsomericSmiles = false;\n+ smiles = MolToSmiles(*mol1, ps);\n+ CHECK(smiles == \"FNCOF\");\n+ smiles = MolToSmiles(*mol2, ps);\n+ CHECK(smiles == \"FNCOF\");\n+ }\n+\n+ SECTION(\"chirality\") {\n+ auto mol1 = \"FC(Cl)OCN[C@H](F)Cl\"_smiles;\n+ REQUIRE(mol1);\n+ auto mol2 = \"FC(Cl)NCO[C@H](F)Cl\"_smiles;\n+ REQUIRE(mol2);\n+ std::vector<unsigned int> ranks;\n+ SmilesWriteParams ps;\n+ ps.doIsomericSmiles = true;\n+ auto smiles = MolToSmiles(*mol1, ps);\n+ CHECK(smiles == \"FC(Cl)OCN[C@H](F)Cl\");\n+ smiles = MolToSmiles(*mol2, ps);\n+ CHECK(smiles == \"FC(Cl)NCO[C@H](F)Cl\");\n+\n+ ps.doIsomericSmiles = false;\n+ smiles = MolToSmiles(*mol1, ps);\n+ CHECK(smiles == \"FC(Cl)NCOC(F)Cl\");\n+ smiles = MolToSmiles(*mol2, ps);\n+ CHECK(smiles == \"FC(Cl)NCOC(F)Cl\");\n+ }\n+\n+ SECTION(\"ring stereo\") {\n+ auto mol1 = \"CC1CCC(CC1)NO[C@@H]1CC[C@H](C)CC1\"_smiles;\n+ REQUIRE(mol1);\n+ auto mol2 = \"CC1CCC(CC1)ON[C@@H]1CC[C@H](C)CC1\"_smiles;\n+ REQUIRE(mol2);\n+ std::vector<unsigned int> ranks;\n+ SmilesWriteParams ps;\n+ ps.doIsomericSmiles = true;\n+ auto smiles = MolToSmiles(*mol1, ps);\n+ CHECK(smiles == \"CC1CCC(NO[C@H]2CC[C@@H](C)CC2)CC1\");\n+ smiles = MolToSmiles(*mol2, ps);\n+ CHECK(smiles == \"CC1CCC(ON[C@H]2CC[C@@H](C)CC2)CC1\");\n+\n+ ps.doIsomericSmiles = false;\n+ smiles = MolToSmiles(*mol1, ps);\n+ CHECK(smiles == \"CC1CCC(NOC2CCC(C)CC2)CC1\");\n+ smiles = MolToSmiles(*mol2, ps);\n+ CHECK(smiles == \"CC1CCC(NOC2CCC(C)CC2)CC1\");\n+ }\n+\n+ SECTION(\"enhanced stereo\") {\n+ // if we aren't doing CXSMILES then the enhanced stereo shouldn't enter into\n+ // consideration in canonicalization\n+ auto mol1 = \"F[C@H](Cl)NCO[C@H](F)Cl |&1:6|\"_smiles;\n+ REQUIRE(mol1);\n+ auto mol2 = \"F[C@H](Cl)OCN[C@H](F)Cl |&1:6|\"_smiles;\n+ REQUIRE(mol2);\n+ std::vector<unsigned int> ranks;\n+ SmilesWriteParams ps;\n+ ps.doIsomericSmiles = true;\n+ auto smiles = MolToSmiles(*mol1, ps);\n+ CHECK(smiles == \"F[C@H](Cl)NCO[C@H](F)Cl\");\n+ smiles = MolToSmiles(*mol2, ps);\n+ CHECK(smiles == \"F[C@H](Cl)NCO[C@H](F)Cl\");\n+\n+ smiles = MolToCXSmiles(*mol1, ps);\n+ CHECK(smiles == \"F[C@H](Cl)NCO[C@H](F)Cl |&1:6|\");\n+ smiles = MolToCXSmiles(*mol2, ps);\n+ CHECK(smiles == \"F[C@H](Cl)OCN[C@H](F)Cl |&1:6|\");\n+\n+ ps.doIsomericSmiles = false;\n+ smiles = MolToSmiles(*mol1, ps);\n+ CHECK(smiles == \"FC(Cl)NCOC(F)Cl\");\n+ smiles = MolToSmiles(*mol2, ps);\n+ CHECK(smiles == \"FC(Cl)NCOC(F)Cl\");\n+ }\n+\n+ SECTION(\"problematic cases\") {\n+ auto mol1 =\n+ \"[C@H]1CC(C[C@@H](C)[C@@H](C)O)C[C@@H](C)C1 |o1:1,11,o2:5,7|\"_smiles;\n+ REQUIRE(mol1);\n+ Canon::canonicalizeEnhancedStereo(*mol1);\n+ auto smiles = MolToSmiles(*mol1);\n+ CHECK(smiles == \"C[C@H]1C[CH]CC(C[C@@H](C)[C@@H](C)O)C1\");\n+ }\n+}\ndiff --git a/Code/JavaWrappers/gmwrapper/src-test/org/RDKit/WrapperTests.java b/Code/JavaWrappers/gmwrapper/src-test/org/RDKit/WrapperTests.java\nindex 8402c6129a7..3b2faec175c 100644\n--- a/Code/JavaWrappers/gmwrapper/src-test/org/RDKit/WrapperTests.java\n+++ b/Code/JavaWrappers/gmwrapper/src-test/org/RDKit/WrapperTests.java\n@@ -342,7 +342,9 @@ public void cdxmlReader() {\n \tassertEquals(prods.size(), 1);\n \tfor(int idx = 0; idx < prods.size(); idx++) {\n \t if(idx == 0) {\n-\t\tassertEquals(prods.get(idx).MolToSmiles(true), \"CC1(C)[C@H](C=C(Cl)Cl)[C@@H]1C(=O)O[C@H](C#N)c1cccc(Oc2ccccc2)c1\");\n+ System.out.print(prods.get(idx).MolToSmiles(true));\n+ System.out.print(\"\\n\");\n+\t\tassertEquals(prods.get(idx).MolToSmiles(true), \"CC1(C)[C@H](C=C(Cl)Cl)[C@H]1C(=O)O[C@@H](C#N)c1cccc(Oc2ccccc2)c1\");\n \t }\n \t}\n \n", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}225{"question_id": "MSB_rdkit_rdkit_pr6785", "question_type": "multi_swe_bench", "description": "Fixes #6773 (rdkit/rdkit#6785)", "content": {"org": "rdkit", "repo": "rdkit", "pr_number": 6785, "issue_title": "Fixes #6773", "issue_body": "This PR fixes #6773.\r\nThere was a flaw in the logic to generate the ring queries when `BondCompareParameters.MatchFusedRingsStrict` is `true`.\r\nUpon further testing I realized that `Rn` queries with _n_>1 should rather be `R&!R1` as different molecules may have different fusions and the query needs to capture all of them.\r\n\r\nNow the test molecules in #6773 yield the expected result (note that by default `CompleteRingsOnly` is set to `False`):\r\n```\r\nfrom rdkit import Chem\r\nfrom rdkit.Chem.Draw import IPythonConsole, MolsToGridImage\r\nfrom rdkit.Chem import rdFMCS\r\n\r\nIPythonConsole.ipython_useSVG = True\r\nIPythonConsole.drawOptions.addAtomIndices = True\r\n\r\ndef get_bond_matches(atom_idx_matches, mol, query):\r\n inverse_match = [None] * mol.GetNumAtoms()\r\n for i, atom_idx in enumerate(atom_idx_matches):\r\n inverse_match[atom_idx] = i\r\n res = []\r\n for b in mol.GetBonds():\r\n bi = b.GetBeginAtomIdx()\r\n ei = b.GetEndAtomIdx()\r\n if (bi in atom_idx_matches and ei in atom_idx_matches\r\n and query.GetBondBetweenAtoms(inverse_match[bi], inverse_match[ei])):\r\n res.append(b.GetIdx())\r\n return tuple(res)\r\n\r\nmol1 = Chem.MolFromSmiles('OC1CCC2CCCCC2C1')\r\nmol2 = Chem.MolFromSmiles('OC1CCCC2CCCCC12')\r\nmols = [mol1, mol2]\r\n\r\nprint(f\"mcs.numAtoms {mcs.numAtoms} mcs.numBonds {mcs.numBonds}\")\r\nprint(mcs.smartsString)\r\natom_matches = [m.GetSubstructMatch(mcs.queryMol) for m in mols]\r\nbond_matches = [get_bond_matches(am, mols[i], mcs.queryMol) for i, am in enumerate(atom_matches)]\r\nfor i, m in enumerate(mols):\r\n print(f\"mol{i+1} atom_matches {atom_matches[i]} bond_matches {bond_matches[i]}\")\r\nMolsToGridImage(mols, highlightAtomLists=atom_matches, highlightBondLists=bond_matches)\r\n\r\nmcs.numAtoms 11 mcs.numBonds 11\r\n[#8&!R]-&!@[#6&R]1-&@[#6&R]-&@[#6&R]-&@[#6&R]-&@[#6&R](-&@[#6&R]-&@1)-&@[#6&R]-&@[#6&R]-&@[#6&R]-&@[#6&R]\r\nmol1 atom_matches (0, 1, 2, 10, 3, 9, 4, 8, 7, 6, 5) bond_matches (0, 1, 2, 3, 5, 6, 7, 8, 9, 10, 11)\r\nmol2 atom_matches (0, 1, 2, 10, 3, 5, 4, 6, 7, 8, 9) bond_matches (0, 1, 2, 3, 4, 5, 6, 7, 8, 10, 11)\r\nparams = rdFMCS.MCSParameters()\r\nparams.BondCompareParameters.RingMatchesRingOnly = True\r\nparams.AtomCompareParameters.RingMatchesRingOnly = True\r\nparams.BondCompareParameters.MatchFusedRingsStrict = True\r\n```\r\n\r\n```\r\nmcs.queryMol\r\n```\r\n\r\nThis what you get when you add a third molecule with different ring sizes:\r\n```\r\nmol3 = Chem.MolFromSmiles('OC1CCC2CCCCCC12')\r\nmols = [mol1, mol2, mol3]\r\nmcs = rdFMCS.FindMCS(mols, params)\r\nprint(f\"mcs.numAtoms {mcs.numAtoms} mcs.numBonds {mcs.numBonds}\")\r\nprint(mcs.smartsString)\r\natom_matches = [m.GetSubstructMatch(mcs.queryMol) for m in mols]\r\nbond_matches = [get_bond_matches(am, mols[i], mcs.queryMol) for i, am in enumerate(atom_matches)]\r\nfor i, m in enumerate(mols):\r\n print(f\"mol{i+1} atom_matches {atom_matches[i]} bond_matches {bond_matches[i]}\")\r\nMolsToGridImage(mols, highlightAtomLists=atom_matches, highlightBondLists=bond_matches)\r\n\r\nmcs.numAtoms 10 mcs.numBonds 9\r\n[#8&!R]-&!@[#6&R](-&@[#6&R]-&@[#6&R])-&@[#6&R]-&@[#6&R]-&@[#6&R]-&@[#6&R]-&@[#6&R]-&@[#6&R]\r\nmol1 atom_matches (0, 1, 2, 10, 3, 9, 8, 7, 6, 5) bond_matches (0, 1, 2, 5, 6, 7, 8, 9, 10)\r\nmol2 atom_matches (0, 1, 2, 10, 3, 9, 8, 7, 6, 5) bond_matches (0, 1, 2, 5, 6, 7, 8, 9, 10)\r\nmol3 atom_matches (0, 1, 2, 10, 3, 9, 8, 7, 6, 5) bond_matches (0, 1, 2, 5, 6, 7, 8, 9, 10)\r\n```\r\n\r\nIf we set `CompleteRingsOnly` to `True`, the MCS is decalin with the first two molecules;\r\n```\r\nmols = [mol1, mol2]\r\nparams.BondCompareParameters.CompleteRingsOnly = True\r\nparams.AtomCompareParameters.CompleteRingsOnly = True\r\nmcs = rdFMCS.FindMCS(mols, params)\r\nprint(f\"mcs.numAtoms {mcs.numAtoms} mcs.numBonds {mcs.numBonds}\")\r\nprint(mcs.smartsString)\r\natom_matches = [m.GetSubstructMatch(mcs.queryMol) for m in mols]\r\nbond_matches = [get_bond_matches(am, mols[i], mcs.queryMol) for i, am in enumerate(atom_matches)]\r\nfor i, m in enumerate(mols):\r\n print(f\"mol{i+1} atom_matches {atom_matches[i]} bond_matches {bond_matches[i]}\")\r\nMolsToGridImage(mols, highlightAtomLists=atom_matches, highlightBondLists=bond_matches)\r\n\r\nmcs.numAtoms 10 mcs.numBonds 11\r\n[#6&R]1-&@[#6&R]-&@[#6&R]-&@[#6&R&!R1]2-&@[#6&R&!R1](-&@[#6&R]-&@1)-&@[#6&R]-&@[#6&R]-&@[#6&R]-&@[#6&R]-&@2\r\nmol1 atom_matches (1, 2, 10, 3, 9, 8, 4, 7, 5, 6) bond_matches (1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11)\r\nmol2 atom_matches (2, 3, 1, 4, 10, 9, 5, 8, 6, 7) bond_matches (1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11)\r\n```\r\n\r\nWhen we add the third molecule, MCS is methanol:\r\n```\r\nmols = [mol1, mol2, mol3]\r\nmcs = rdFMCS.FindMCS(mols, params)\r\nprint(f\"mcs.numAtoms {mcs.numAtoms} mcs.numBonds {mcs.numBonds}\")\r\nprint(mcs.smartsString)\r\natom_matches = [m.GetSubstructMatch(mcs.queryMol) for m in mols]\r\nbond_matches = [get_bond_matches(am, mols[i], mcs.queryMol) for i, am in enumerate(atom_matches)]\r\nfor i, m in enumerate(mols):\r\n print(f\"mol{i+1} atom_matches {atom_matches[i]} bond_matches {bond_matches[i]}\")\r\nMolsToGridImage(mols, highlightAtomLists=atom_matches, highlightBondLists=bond_matches)\r\n\r\nmcs.numAtoms 2 mcs.numBonds 1\r\n[#8&!R]-&!@[#6&R]\r\nmol1 atom_matches (0, 1) bond_matches (0,)\r\nmol2 atom_matches (0, 1) bond_matches (0,)\r\nmol3 atom_matches (0, 1) bond_matches (0,)\r\n```\r\n\r\n\r\n\r\nWhile writing unit tests for #6773 I also noticed a bug in `checkIfRingsAreClosed` when `noLoneRingAtoms` is `true`, and I fixed that as well; now I get the expected result with this test case:\r\n```\r\nsmi = [\"C1CC2CCC3CC2C(C1)CCCCCC3\", \"C1CC2CCC3CCCC4CCC(C1)C2C34\"]\r\nmols = [Chem.MolFromSmiles(s) for s in smi]\r\nparams = rdFMCS.MCSParameters()\r\nparams.BondCompareParameters.MatchFusedRingsStrict = True\r\nmcs = rdFMCS.FindMCS([mols[0], mols[1]], params)\r\nprint(f\"mcs.numAtoms {mcs.numAtoms} mcs.numBonds {mcs.numBonds}\")\r\nprint(mcs.smartsString)\r\natom_matches = [m.GetSubstructMatch(mcs.queryMol) for m in mols]\r\nbond_matches = [get_bond_matches(am, mols[i], mcs.queryMol) for i, am in enumerate(atom_matches)]\r\nfor i, m in enumerate(mols):\r\n print(f\"mol{i+1} atom_matches {tuple(enumerate(atom_matches[i]))} bond_matches {tuple(enumerate(bond_matches[i]))}\")\r\nMolsToGridImage(mols, highlightAtomLists=atom_matches, highlightBondLists=bond_matches)\r\n\r\nmcs.numAtoms 15 mcs.numBonds 16\r\n[#6]1-&@[#6]-&@[#6&R&!R1]2-&@[#6]-&@[#6]-&@[#6](-&@[#6]-&@[#6&R&!R1]-&@2-&@[#6](-&@[#6]-&@1)-&@[#6]-&@[#6])-&@[#6]-&@[#6]-&@[#6]\r\nmol1 atom_matches ((0, 0), (1, 1), (2, 9), (3, 2), (4, 3), (5, 7), (6, 4), (7, 6), (8, 8), (9, 5), (10, 10), (11, 15), (12, 11), (13, 14), (14, 13)) bond_matches ((0, 0), (1, 1), (2, 2), (3, 3), (4, 4), (5, 5), (6, 6), (7, 7), (8, 8), (9, 9), (10, 10), (11, 13), (12, 14), (13, 15), (14, 16), (15, 17))\r\nmol2 atom_matches ((0, 0), (1, 1), (2, 13), (3, 2), (4, 3), (5, 14), (6, 4), (7, 15), (8, 12), (9, 5), (10, 11), (11, 6), (12, 10), (13, 7), (14, 8)) bond_matches ((0, 0), (1, 1), (2, 2), (3, 3), (4, 4), (5, 5), (6, 6), (7, 7), (8, 10), (9, 11), (10, 12), (11, 13), (12, 14), (13, 15), (14, 16), (15, 17))\r\n```\r\n\r\n```\r\nparams.BondCompareParameters.CompleteRingsOnly = True\r\nparams.AtomCompareParameters.CompleteRingsOnly = True\r\nmcs = rdFMCS.FindMCS([mols[0], mols[1]], params)\r\nprint(f\"mcs.numAtoms {mcs.numAtoms} mcs.numBonds {mcs.numBonds}\")\r\nprint(mcs.smartsString)\r\natom_matches = [m.GetSubstructMatch(mcs.queryMol) for m in mols]\r\nbond_matches = [get_bond_matches(am, mols[i], mcs.queryMol) for i, am in enumerate(atom_matches)]\r\nfor i, m in enumerate(mols):\r\n print(f\"mol{i+1} atom_matches {tuple(enumerate(atom_matches[i]))} bond_matches {tuple(enumerate(bond_matches[i]))}\")\r\nMolsToGridImage(mols, highlightAtomLists=atom_matches, highlightBondLists=bond_matches)\r\n\r\nmcs.numAtoms 10 mcs.numBonds 11\r\n[#6&R]1-&@[#6&R]-&@[#6&R&!R1]2-&@[#6&R]-&@[#6&R]-&@[#6&R]-&@[#6&R]-&@[#6&R&!R1]-&@2-&@[#6&R]-&@[#6&R]-&@1\r\nmol1 atom_matches ((0, 0), (1, 1), (2, 9), (3, 2), (4, 3), (5, 7), (6, 4), (7, 6), (8, 8), (9, 5)) bond_matches ((0, 0), (1, 1), (2, 2), (3, 3), (4, 4), (5, 5), (6, 6), (7, 7), (8, 8), (9, 15), (10, 16))\r\nmol2 atom_matches ((0, 0), (1, 1), (2, 13), (3, 2), (4, 3), (5, 14), (6, 4), (7, 15), (8, 12), (9, 5)) bond_matches ((0, 0), (1, 1), (2, 2), (3, 3), (4, 4), (5, 12), (6, 13), (7, 14), (8, 15), (9, 16), (10, 17))\r\n```\r\n\r\n\r\nFinally, I created the `RingBondCountVect` class as it is much tidier than passing around the same `std::vector<BondCount>&` and `consrt ROMol&` across multiple functions (which are now member functions of `RingBondCountVect`).\r\n\r\n@d-b-w It would be great if you could check this against your additional test cases. Thanks in advance!", "base_commit": "db918d377af5f72d0b355b426e64480d10514f38", "resolved_issues": [{"number": 6756, "title": "ConnectTheDots can segfault if all atoms do not have residue info", "body": "I do not have a minimal example, I was throwing random atoms and coordinates at the function and it crashed on me. The point is that an atom's monomer info is initialized to `nullptr` but [this code](https://github.com/rdkit/rdkit/blob/master/Code/GraphMol/FileParsers/ProximityBonds.cpp#L218-L231):\r\n\r\n```\r\n auto *n_info =\r\n (AtomPDBResidueInfo *)(mol->getAtomWithIdx(*nbr)->getMonomerInfo());\r\n if (d < best &&\r\n atom_info->getResidueNumber() == n_info->getResidueNumber()) {\r\n best = d;\r\n best_idx = *nbr;\r\n }\r\n```\r\ndoes not check before dereferencing either atom_info or n_info. "}, {"number": 6773, "title": "MCS query incorrect when ringCompare=RingCompare.StrictRingFusion", "body": "**Describe the bug**\r\nThe MCS returned when `ringCompare=RingCompare.StrictRingFusion` may not match all molecules used to generate it. This is new since https://github.com/rdkit/rdkit/pull/6646 . I'm currently using 0a3fe925288c.\r\n\r\n**To Reproduce**\r\n\r\n```\r\nfrom rdkit import Chem\r\nfrom rdkit.Chem.Draw import IPythonConsole\r\nfrom rdkit.Chem import rdFMCS\r\n\r\nIPythonConsole.ipython_useSVG = True\r\n\r\nfrom rdkit import Chem\r\nfrom rdkit.Chem.Draw import IPythonConsole\r\nfrom rdkit.Chem import rdFMCS\r\n\r\nIPythonConsole.ipython_useSVG = True\r\n\r\nmol1 = Chem.MolFromSmiles('Oc1ccc2ccccc2c1')\r\nmol2 = Chem.MolFromSmiles('Oc1cccc2ccccc12')\r\nmcs = rdFMCS.FindMCS([mol1, mol2],\r\n ringMatchesRingOnly=True,\r\n # The problem is the ring fusion.\r\n ringCompare=Chem.rdFMCS.RingCompare.StrictRingFusion)\r\n\r\nprint('I think this is wrong, the ring fusion seems to have \"slipped\"')\r\nprint('I think the right MCS if ring fusion count is strict is maybe `[#8!R]`')\r\nprint(mcs.smartsString)\r\nprint(mol1.GetSubstructMatch(mcs.queryMol))\r\nprint(mol2.GetSubstructMatch(mcs.queryMol), '<<<< this should match!!')\r\nIPythonConsole.ShowMols((mol1, mol2))\r\n\r\n# Previous to https://github.com/rdkit/rdkit/pull/6646, the MCS here was\r\nold_mcs = '[#8&!R]-&!@[#6&R]1:&@[#6&R]:&@[#6&R]:&@[#6&R]:&@[#6&R](:&@[#6&R]:&@1):&@[#6&R]:&@[#6&R]:&@[#6&R]'\r\n# which seems wrong because it doesn't require ring fusion matching.\r\n# but at least it matches both mols??\r\nold_mcs_mol = Chem.MolFromSmarts(old_mcs)\r\nprint(mol1.GetSubstructMatch(old_mcs_mol))\r\nprint(mol2.GetSubstructMatch(old_mcs_mol))\r\n```\r\n\r\nHere's the above in a Jupyter notebook:\r\n\r\n<img width=\"1008\" alt=\"mcs_bug\" src=\"https://github.com/rdkit/rdkit/assets/3013277/25ad1c47-dcd0-44ef-be78-2e20e68f86f5\">\r\n\r\nOther context:\r\nThis was reported deep inside some internal Schr\u00f6dinger validation code (PRIME-5144). Definitely let me know if I'm using StrictRingFusion incorrectly."}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/rdkit_m_rdkit:pr-6785", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/CMakeLists.txt b/CMakeLists.txt\nindex b7a63699b10..99d627a9e5d 100644\n--- a/CMakeLists.txt\n+++ b/CMakeLists.txt\n@@ -137,7 +137,7 @@ set(RDK_PYTHON_OUTPUT_DIRECTORY \"${CMAKE_CURRENT_BINARY_DIR}/rdkit\")\n set(RDKit_Year \"2023\")\n set(RDKit_Month \"09\")\n set(RDKit_Revision \"1\")\n-set(RDKit_RevisionModifier \"pre\")\n+set(RDKit_RevisionModifier \"\")\n set(RDKit_ABI \"1\")\n \n # we need an integer version of the month later, so remove the zero padding\ndiff --git a/Code/GraphMol/FMCS/FMCS.cpp b/Code/GraphMol/FMCS/FMCS.cpp\nindex 159dca41c7c..d456121b996 100644\n--- a/Code/GraphMol/FMCS/FMCS.cpp\n+++ b/Code/GraphMol/FMCS/FMCS.cpp\n@@ -30,12 +30,6 @@ struct cmpCStr {\n return std::strcmp(a, b) < 0;\n }\n };\n-\n-struct BondCount {\n- boost::dynamic_bitset<> isMCSRingBond;\n- boost::dynamic_bitset<> isMCSRingBondNonFused;\n- boost::dynamic_bitset<> isMCSRingBondFused;\n-};\n } // namespace\n \n void MCSParameters::setMCSAtomTyperFromEnum(AtomComparator atomComp) {\n@@ -498,111 +492,131 @@ bool MCSBondCompareOrderExact(const MCSBondCompareParameters& p,\n \n //=== RING COMPARE ========================================================\n namespace {\n-std::vector<BondCount> initRingBondCountVect(const ROMol& mol) {\n- std::vector<BondCount> res(mol.getRingInfo()->bondRings().size());\n- for (auto& ringBondCount : res) {\n- ringBondCount.isMCSRingBond.resize(mol.getNumBonds());\n- ringBondCount.isMCSRingBondNonFused.resize(mol.getNumBonds());\n- ringBondCount.isMCSRingBondFused.resize(mol.getNumBonds());\n- }\n- return res;\n-}\n-\n // there are 3 bitsets for each ring\n // isMCSRingBond: bits are set in correspondence of ring bond indices which are\n-// part of MCS isMCSRingBondFused: bits are set in correspondence of ring bond\n-// indices which are part of MCS and are fused isMCSRingBondNonFused: bits are\n-// set in correspondence of ring bond indices which are part of MCS and are not\n-// fused in the 1st pass, we set fused/non-fused bits simply based on\n-// numBondRings in the 2nd pass, we refine the above as certain bonds originally\n-// marked as fused can be relabelled as non-fused\n-void setMCSBondBitsPass1(unsigned int beginAtomIdx, unsigned int endAtomIdx,\n- const ROMol& mol, const std::uint32_t c[],\n- const FMCS::Graph& graph,\n- std::vector<BondCount>& ringBondCountVect) {\n- const auto ri = mol.getRingInfo();\n- const auto bond =\n- mol.getBondBetweenAtoms(graph[c[beginAtomIdx]], graph[c[endAtomIdx]]);\n- CHECK_INVARIANT(bond, \"\");\n- const auto bi = bond->getIdx();\n- if (!ri->numBondRings(bi)) {\n- return;\n- }\n- if (ri->numBondRings(bi) == 1) {\n- const auto ringIdx = ri->bondMembers(bi).front();\n- ringBondCountVect[ringIdx].isMCSRingBond.set(bi);\n- ringBondCountVect[ringIdx].isMCSRingBondNonFused.set(bi);\n- } else {\n- for (const auto& ringIdx : ri->bondMembers(bi)) {\n- ringBondCountVect[ringIdx].isMCSRingBond.set(bi);\n- ringBondCountVect[ringIdx].isMCSRingBondFused.set(bi);\n+// part of MCS.\n+// isMCSRingBondFused: bits are set in correspondence of ring bond\n+// indices which are part of MCS and are fused.\n+// isMCSRingBondNonFused: bits are set in correspondence of ring bond indices\n+// which are part of MCS and are not fused.\n+class RingBondCountVect {\n+ public:\n+ RingBondCountVect(const ROMol& mol) :\n+ d_mol(mol),\n+ d_ringInfo(mol.getRingInfo()) {\n+ d_ringBondCountVect.resize(d_ringInfo->numRings());\n+ d_isMCSBond.resize(mol.getNumBonds());\n+ for (auto& ringBondCount : d_ringBondCountVect) {\n+ ringBondCount.isMCSRingBond.resize(mol.getNumBonds());\n+ ringBondCount.isMCSRingBondNonFused.resize(mol.getNumBonds());\n+ ringBondCount.isMCSRingBondFused.resize(mol.getNumBonds());\n+ }\n+ }\n+ // In the 1st pass, we set fused/non-fused bits simply based on\n+ // numBondRings.\n+ void setMCSBondBitsPass1(unsigned int beginAtomIdx, unsigned int endAtomIdx,\n+ const std::uint32_t c[],\n+ const FMCS::Graph& graph) {\n+ const auto bond =\n+ d_mol.getBondBetweenAtoms(graph[c[beginAtomIdx]], graph[c[endAtomIdx]]);\n+ CHECK_INVARIANT(bond, \"\");\n+ const auto bi = bond->getIdx();\n+ d_isMCSBond.set(bi);\n+ if (!d_ringInfo->numBondRings(bi)) {\n+ return;\n+ }\n+ if (d_ringInfo->numBondRings(bi) == 1) {\n+ const auto ringIdx = d_ringInfo->bondMembers(bi).front();\n+ d_ringBondCountVect[ringIdx].isMCSRingBond.set(bi);\n+ d_ringBondCountVect[ringIdx].isMCSRingBondNonFused.set(bi);\n+ } else {\n+ for (const auto& ringIdx : d_ringInfo->bondMembers(bi)) {\n+ d_ringBondCountVect[ringIdx].isMCSRingBond.set(bi);\n+ d_ringBondCountVect[ringIdx].isMCSRingBondFused.set(bi);\n+ }\n }\n }\n-}\n-\n-void setMCSBondBitsPass2(const ROMol& mol,\n- std::vector<BondCount>& ringBondCountVect) {\n- const auto ri = mol.getRingInfo();\n- for (unsigned int bi = 0; bi < mol.getNumBonds(); ++bi) {\n- int fusedBondRingIdx = -1;\n- unsigned int fusedBondCount = 0;\n- for (auto& ringBondCount : ringBondCountVect) {\n- auto ringIdx = &ringBondCount - &ringBondCountVect.front();\n- if (ringBondCount.isMCSRingBondFused.test(bi)) {\n- if (ringBondCount.isMCSRingBondNonFused.count() == 0 &&\n- ringBondCount.isMCSRingBondFused.count() <\n- ri->bondRings().at(ringIdx).size()) {\n+ // In the 2nd pass, we refine the above as certain bonds originally\n+ // marked as fused can be relabelled as non-fused\n+ void setMCSBondBitsPass2() {\n+ for (auto& ringBondCount : d_ringBondCountVect) {\n+ ringBondCount.nonFusedCountPass1 = ringBondCount.isMCSRingBondNonFused.count();\n+ ringBondCount.fusedCountPass1 = ringBondCount.isMCSRingBondFused.count();\n+ }\n+ for (unsigned int bi = 0; bi < d_mol.getNumBonds(); ++bi) {\n+ if (!d_isMCSBond.test(bi)) {\n+ continue;\n+ }\n+ int fusedBondRingIdx = -1;\n+ unsigned int fusedBondCount = 0;\n+ for (auto& ringBondCount : d_ringBondCountVect) {\n+ if (!ringBondCount.isMCSRingBondFused.test(bi)) {\n+ continue;\n+ }\n+ auto ringIdx = &ringBondCount - &d_ringBondCountVect.front();\n+ if (ringBondCount.nonFusedCountPass1 == 0 &&\n+ ringBondCount.fusedCountPass1 <\n+ d_ringInfo->bondRings().at(ringIdx).size()) {\n ringBondCount.isMCSRingBondFused.set(bi, false);\n } else {\n ++fusedBondCount;\n fusedBondRingIdx = ringIdx;\n }\n }\n- }\n- if (fusedBondCount == 1) {\n- ringBondCountVect[fusedBondRingIdx].isMCSRingBondNonFused.set(bi);\n- ringBondCountVect[fusedBondRingIdx].isMCSRingBondFused.set(bi, false);\n+ if (fusedBondCount == 1) {\n+ d_ringBondCountVect[fusedBondRingIdx].isMCSRingBondNonFused.set(bi);\n+ d_ringBondCountVect[fusedBondRingIdx].isMCSRingBondFused.set(bi, false);\n+ }\n }\n }\n-}\n-\n-bool isRingFusionHonored(const ROMol& mol,\n- const std::vector<BondCount>& ringBondCountVect) {\n- const auto ri = mol.getRingInfo();\n- for (const auto& ringBondCount : ringBondCountVect) {\n- unsigned int ringIdx = &ringBondCount - &ringBondCountVect.front();\n- const auto& bondRings = ri->bondRings().at(ringIdx);\n- // if all or no bonds of this ring are part of MCS, no need to do further\n- // checks\n- const auto numRingBondsInMCS = ringBondCount.isMCSRingBond.count();\n- if (!numRingBondsInMCS || numRingBondsInMCS == bondRings.size()) {\n- continue;\n- }\n- // check ring bonds:\n- // if they are non-fused, it's OK\n- // if they are fused but classified as non-fused, it's OK\n- // otherwise count a missing fused bond\n- // if the sum of missing fused bonds + fused bonds in MCS + non-fused bonds\n- // in MCS equals to the ring size, then we have failed the check\n- const auto numNonFusedRingBondsInMCS =\n- ringBondCount.isMCSRingBondNonFused.count();\n- const auto numFusedRingBondsInMCS =\n- ringBondCount.isMCSRingBondFused.count();\n- const auto numMissingFusedBonds =\n- std::count_if(bondRings.begin(), bondRings.end(),\n- [ri, &ringBondCount](const auto bi) {\n- return (ri->numBondRings(bi) > 1 &&\n- !ringBondCount.isMCSRingBondNonFused.test(bi) &&\n- !ringBondCount.isMCSRingBondFused.test(bi));\n- });\n- if (numMissingFusedBonds + numFusedRingBondsInMCS +\n- numNonFusedRingBondsInMCS ==\n- bondRings.size()) {\n- return false;\n+ bool isRingFusionHonored() {\n+ for (const auto& ringBondCount : d_ringBondCountVect) {\n+ unsigned int ringIdx = &ringBondCount - &d_ringBondCountVect.front();\n+ const auto& bondRings = d_ringInfo->bondRings().at(ringIdx);\n+ // if all or no bonds of this ring are part of MCS, no need to do further\n+ // checks\n+ const auto numRingBondsInMCS = ringBondCount.isMCSRingBond.count();\n+ if (!numRingBondsInMCS || numRingBondsInMCS == bondRings.size()) {\n+ continue;\n+ }\n+ // check ring bonds:\n+ // if they are non-fused, it's OK\n+ // if they are fused but classified as non-fused, it's OK\n+ // otherwise count a missing fused bond\n+ // if the sum of missing fused bonds + fused bonds in MCS + non-fused bonds\n+ // in MCS equals to the ring size, then we have failed the check\n+ const auto numNonFusedRingBondsInMCS =\n+ ringBondCount.isMCSRingBondNonFused.count();\n+ const auto numFusedRingBondsInMCS =\n+ ringBondCount.isMCSRingBondFused.count();\n+ const auto numMissingFusedBonds =\n+ std::count_if(bondRings.begin(), bondRings.end(),\n+ [this, &ringBondCount](const auto bi) {\n+ return (d_ringInfo->numBondRings(bi) > 1 &&\n+ !ringBondCount.isMCSRingBondNonFused.test(bi) &&\n+ !ringBondCount.isMCSRingBondFused.test(bi));\n+ });\n+ if (numMissingFusedBonds + numFusedRingBondsInMCS +\n+ numNonFusedRingBondsInMCS ==\n+ bondRings.size()) {\n+ return false;\n+ }\n }\n+ return true;\n }\n- return true;\n-}\n+ private:\n+ struct BondCount {\n+ boost::dynamic_bitset<> isMCSRingBond;\n+ boost::dynamic_bitset<> isMCSRingBondNonFused;\n+ unsigned int nonFusedCountPass1 = 0;\n+ boost::dynamic_bitset<> isMCSRingBondFused;\n+ unsigned int fusedCountPass1 = 0;\n+ };\n+ const ROMol& d_mol;\n+ const RingInfo *d_ringInfo;\n+ std::vector<BondCount> d_ringBondCountVect;\n+ boost::dynamic_bitset<> d_isMCSBond;\n+};\n } // end of anonymous namespace\n \n inline bool ringFusionCheck(const std::uint32_t c1[], const std::uint32_t c2[],\n@@ -631,31 +645,29 @@ inline bool ringFusionCheck(const std::uint32_t c1[], const std::uint32_t c2[],\n there is no missing fused bond. This is OK for permissive mode.\n In strict mode, we also need to check against 1-methylbicyclo[3.1.0]hexane,\n where there is indeed a missing fused bond.\n- Basically, in permissive mode one of two pairs is allowed to fail the\n- match. In strict mode, none is.\n+ Basically, in permissive mode one of two molecules is allowed to fail the\n+ match, but not both. In strict mode, none is.\n */\n bool res = true;\n if (boost::num_edges(target) < boost::num_edges(query)) {\n return true;\n }\n- auto mol1RingBondCountVect = initRingBondCountVect(mol1);\n- auto mol2RingBondCountVect = initRingBondCountVect(mol2);\n+ RingBondCountVect mol1RingBondCountVect(mol1);\n+ RingBondCountVect mol2RingBondCountVect(mol2);\n auto queryEdges = boost::edges(query);\n std::for_each(\n queryEdges.first, queryEdges.second,\n- [&c1, &c2, &mol1, &query, &mol2, &target, &mol1RingBondCountVect,\n+ [&c1, &c2, &query, &target, &mol1RingBondCountVect,\n &mol2RingBondCountVect](const auto& edge) {\n const auto beginAtomIdx = boost::source(edge, query);\n const auto endAtomIdx = boost::target(edge, query);\n- setMCSBondBitsPass1(beginAtomIdx, endAtomIdx, mol1, c1, query,\n- mol1RingBondCountVect);\n- setMCSBondBitsPass1(beginAtomIdx, endAtomIdx, mol2, c2, target,\n- mol2RingBondCountVect);\n+ mol1RingBondCountVect.setMCSBondBitsPass1(beginAtomIdx, endAtomIdx, c1, query);\n+ mol2RingBondCountVect.setMCSBondBitsPass1(beginAtomIdx, endAtomIdx, c2, target);\n });\n- setMCSBondBitsPass2(mol1, mol1RingBondCountVect);\n- setMCSBondBitsPass2(mol2, mol2RingBondCountVect);\n- bool mol1Honored = isRingFusionHonored(mol1, mol1RingBondCountVect);\n- bool mol2Honored = isRingFusionHonored(mol2, mol2RingBondCountVect);\n+ mol1RingBondCountVect.setMCSBondBitsPass2();\n+ mol2RingBondCountVect.setMCSBondBitsPass2();\n+ bool mol1Honored = mol1RingBondCountVect.isRingFusionHonored();\n+ bool mol2Honored = mol2RingBondCountVect.isRingFusionHonored();\n if (p.BondCompareParameters.MatchFusedRingsStrict) {\n res = mol1Honored && mol2Honored;\n } else {\ndiff --git a/Code/GraphMol/FMCS/MaximumCommonSubgraph.cpp b/Code/GraphMol/FMCS/MaximumCommonSubgraph.cpp\nindex 6bede444152..6976e880602 100644\n--- a/Code/GraphMol/FMCS/MaximumCommonSubgraph.cpp\n+++ b/Code/GraphMol/FMCS/MaximumCommonSubgraph.cpp\n@@ -446,17 +446,18 @@ bool checkIfRingsAreClosed(const Seed& fs, bool noLoneRingAtoms) {\n if (!ri->numRings()) {\n return true;\n }\n- boost::dynamic_bitset<> fragmentBonds(om.getNumBonds());\n- boost::dynamic_bitset<> fragmentRings(ri->numRings());\n+ boost::dynamic_bitset<> mcsBonds(om.getNumBonds());\n+ boost::dynamic_bitset<> mcsNonFusedRings(ri->numRings());\n+ boost::dynamic_bitset<> mcsFusedRings(ri->numRings());\n for (const auto& bond : fs.MoleculeFragment.Bonds) {\n auto bi = bond->getIdx();\n- fragmentBonds.set(bi);\n+ mcsBonds.set(bi);\n if (ri->numBondRings(bi) == 1) {\n- fragmentRings.set(ri->bondMembers(bi).front());\n+ mcsNonFusedRings.set(ri->bondMembers(bi).front());\n }\n }\n- for (unsigned int ringIdx = 0; ringIdx < fragmentRings.size(); ++ringIdx) {\n- if (!fragmentRings.test(ringIdx)) {\n+ for (unsigned int ringIdx = 0; ringIdx < mcsNonFusedRings.size(); ++ringIdx) {\n+ if (!mcsNonFusedRings.test(ringIdx)) {\n continue;\n }\n for (const auto& bi : ri->bondRings().at(ringIdx)) {\n@@ -464,12 +465,12 @@ bool checkIfRingsAreClosed(const Seed& fs, bool noLoneRingAtoms) {\n for (unsigned int memberOf : ri->bondMembers(bi)) {\n if (memberOf == ringIdx) {\n keepBond = true;\n- } else if (fragmentRings.test(memberOf)) {\n+ } else if (mcsNonFusedRings.test(memberOf)) {\n keepBond = false;\n break;\n }\n }\n- if (keepBond && !fragmentBonds.test(bi)) {\n+ if (keepBond && !mcsBonds.test(bi)) {\n return false;\n }\n }\n@@ -477,13 +478,40 @@ bool checkIfRingsAreClosed(const Seed& fs, bool noLoneRingAtoms) {\n if (noLoneRingAtoms) {\n for (const auto& atom : fs.MoleculeFragment.Atoms) {\n auto ai = atom->getIdx();\n- for (const auto& memberOf : ri->atomMembers(ai)) {\n- if (!fragmentRings.test(memberOf)) {\n- return false;\n+ const auto& ringIndices = ri->atomMembers(ai);\n+ if (!ringIndices.empty() &&\n+ !std::any_of(ringIndices.begin(), ringIndices.end(),\n+ [&mcsNonFusedRings](const auto& ringIdx) {\n+ return mcsNonFusedRings.test(ringIdx);\n+ })) {\n+ return false;\n+ }\n+ }\n+ }\n+ if (mcsNonFusedRings.none()) {\n+ for (const auto& bond : fs.MoleculeFragment.Bonds) {\n+ auto bi = bond->getIdx();\n+ if (ri->numBondRings(bi) > 1) {\n+ for (auto ringIdx : ri->bondMembers(bi)) {\n+ mcsFusedRings.set(ringIdx);\n }\n }\n }\n }\n+ if (mcsFusedRings.any()) {\n+ for (unsigned int ringIdx = 0; ringIdx < mcsFusedRings.size(); ++ringIdx) {\n+ if (!mcsFusedRings.test(ringIdx)) {\n+ continue;\n+ }\n+ const auto &ringBondIndices = ri->bondRings().at(ringIdx);\n+ if (std::all_of(ringBondIndices.begin(), ringBondIndices.end(), [&mcsBonds](const auto &bi) {\n+ return mcsBonds.test(bi);\n+ })) {\n+ return true;\n+ }\n+ }\n+ return false;\n+ }\n return true;\n }\n \n@@ -725,7 +753,30 @@ MaximumCommonSubgraph::generateResultSMARTSAndQueryMol(\n auto mol = new RWMol();\n ROMOL_SPTR molSptr(mol);\n const auto ri = mcsIdx.QueryMolecule->getRingInfo();\n+ boost::dynamic_bitset<> mcsRingIsComplete;\n+ bool needAtomRingQueries =\n+ (Parameters.AtomCompareParameters.RingMatchesRingOnly ||\n+ Parameters.BondCompareParameters.MatchFusedRingsStrict);\n+ if (needAtomRingQueries) {\n+ mcsRingIsComplete.resize(ri->numRings(), true);\n+ boost::dynamic_bitset<> queryBondInMcs(mcsIdx.QueryMolecule->getNumBonds());\n+ for (const auto& bond : mcsIdx.Bonds) {\n+ queryBondInMcs.set(bond->getIdx());\n+ }\n+ const auto& bondRings = ri->bondRings();\n+ for (const auto& bondRing : bondRings) {\n+ auto ringIdx = &bondRing - &bondRings.front();\n+ for (const auto& bondIdx : bondRing) {\n+ if (!queryBondInMcs.test(bondIdx)) {\n+ mcsRingIsComplete.reset(ringIdx);\n+ break;\n+ }\n+ }\n+ }\n+ }\n for (const auto& atom : mcsIdx.Atoms) {\n+ auto queryAtomIdx = atom->getIdx();\n+ auto numAtomRings = ri->numAtomRings(queryAtomIdx);\n QueryAtom a;\n const auto ai = &atom - &mcsIdx.Atoms.front();\n if (Parameters.AtomTyper == MCSAtomCompareIsotopes ||\n@@ -747,30 +798,29 @@ MaximumCommonSubgraph::generateResultSMARTSAndQueryMol(\n }\n }\n }\n- if (Parameters.AtomCompareParameters.RingMatchesRingOnly ||\n- Parameters.BondCompareParameters.MatchFusedRingsStrict) {\n- const auto& targets = mcsIdx.Targets;\n- const auto numAtomRings = ri->numAtomRings(atom->getIdx());\n- const auto isAtomFusedAcrossAllTargets =\n- [ai, numAtomRings, &targets, &atomMatchResult](unsigned int itarget) {\n- const auto& tag = targets.at(itarget);\n- const auto tagRingInfo = tag.Molecule->getRingInfo();\n- const auto ti = atomMatchResult.at(itarget).at(ai).TargetAtomIdx;\n- return tagRingInfo->numAtomRings(ti) == numAtomRings;\n- };\n- if (Parameters.AtomCompareParameters.RingMatchesRingOnly ||\n- (Parameters.BondCompareParameters.MatchFusedRingsStrict &&\n- numAtomRings > 1 &&\n- std::all_of(matchedTargetIndices.begin(), matchedTargetIndices.end(),\n- isAtomFusedAcrossAllTargets))) {\n- QueryAtom::QUERYATOM_QUERY* q = nullptr;\n- if (Parameters.BondCompareParameters.MatchFusedRingsStrict &&\n- numAtomRings > 1) {\n- q = makeAtomInNRingsQuery(numAtomRings);\n- } else {\n- q = makeAtomInRingQuery();\n- q->setNegation(!numAtomRings);\n- }\n+ if (needAtomRingQueries) {\n+ const auto& ringIndicesAtomIsMemberOf = ri->atomMembers(queryAtomIdx);\n+ auto numCompleteRings = std::count_if(\n+ ringIndicesAtomIsMemberOf.begin(), ringIndicesAtomIsMemberOf.end(),\n+ [&mcsRingIsComplete](const auto& ringIdx) {\n+ return mcsRingIsComplete.test(ringIdx);\n+ });\n+ if (Parameters.AtomCompareParameters.RingMatchesRingOnly &&\n+ !numCompleteRings) {\n+ auto q = makeAtomInRingQuery();\n+ q->setNegation(!numAtomRings);\n+ a.expandQuery(q, Queries::COMPOSITE_AND, true);\n+ } else if (Parameters.BondCompareParameters.MatchFusedRingsStrict &&\n+ numAtomRings == 1 && numCompleteRings == 1) {\n+ auto ringSize =\n+ ri->atomRings().at(ringIndicesAtomIsMemberOf.front()).size();\n+ auto q = new ATOM_OR_QUERY;\n+ q->setDescription(\"AtomOr\");\n+ q->addChild(QueryAtom::QUERYATOM_QUERY::CHILD_TYPE(\n+ makeAtomMinRingSizeQuery(ringSize)));\n+ auto q2 = makeAtomInNRingsQuery(1);\n+ q2->setNegation(true);\n+ q->addChild(QueryAtom::QUERYATOM_QUERY::CHILD_TYPE(q2));\n a.expandQuery(q, Queries::COMPOSITE_AND, true);\n }\n }\ndiff --git a/Code/GraphMol/MolDraw2D/DrawMolMCHLasso.cpp b/Code/GraphMol/MolDraw2D/DrawMolMCHLasso.cpp\nindex b3de0ee534c..fb650ea7654 100644\n--- a/Code/GraphMol/MolDraw2D/DrawMolMCHLasso.cpp\n+++ b/Code/GraphMol/MolDraw2D/DrawMolMCHLasso.cpp\n@@ -61,14 +61,23 @@ void DrawMolMCHLasso::extractAtomColourLists(\n std::vector<DrawColour> &colours,\n std::vector<std::vector<int>> &colourAtoms,\n std::vector<std::vector<int>> &colourLists) const {\n+ std::vector<boost::dynamic_bitset<>> inColourAtoms;\n for (const auto &cm : mcHighlightAtomMap_) {\n for (const auto &col : cm.second) {\n auto cpos = std::find(colours.begin(), colours.end(), col);\n if (cpos == colours.end()) {\n colours.push_back(col);\n colourAtoms.push_back(std::vector<int>(1, cm.first));\n+ inColourAtoms.push_back(\n+ boost::dynamic_bitset<>(drawMol_->getNumAtoms()));\n+ inColourAtoms.back().set(cm.first);\n } else {\n- colourAtoms[std::distance(colours.begin(), cpos)].push_back(cm.first);\n+ auto ln = std::distance(colours.begin(), cpos);\n+ // it's important that each atom is only in the list once - Github6749\n+ if (!inColourAtoms[ln][cm.first]) {\n+ colourAtoms[ln].push_back(cm.first);\n+ inColourAtoms[ln].set(cm.first);\n+ }\n }\n }\n }\n@@ -137,6 +146,7 @@ void DrawMolMCHLasso::drawLasso(size_t lassoNum, const RDKit::DrawColour &col,\n fixIntersectingLines(arcs, lines);\n fixIntersectingArcsAndLines(arcs, lines);\n fixProtrudingLines(lines);\n+ fixOrphanLines(arcs, lines);\n \n for (auto &it : arcs) {\n highlights_.push_back(std::move(it));\n@@ -146,23 +156,40 @@ void DrawMolMCHLasso::drawLasso(size_t lassoNum, const RDKit::DrawColour &col,\n }\n }\n \n+namespace {\n+double getLassoWidth(const DrawMolMCH *dm, int atNum, int lassoNum) {\n+ PRECONDITION(dm, \"Needs valid DrawMolMCH\")\n+ double xrad, yrad;\n+ dm->getAtomRadius(atNum, xrad, yrad);\n+ // Double the area of the circles for successive lassos.\n+ const static double rats[] = {1.0, 1.414, 2, 2.828, 4};\n+ if (lassoNum > 4) {\n+ // It's going to look horrible, probably, but it's a lot of lassos.\n+ return xrad * (1 + lassoNum) * 0.75;\n+ } else {\n+ return xrad * rats[lassoNum];\n+ }\n+}\n+} // namespace\n+\n // ****************************************************************************\n void DrawMolMCHLasso::extractAtomArcs(\n size_t lassoNum, const RDKit::DrawColour &col,\n const std::vector<int> &colAtoms,\n std::vector<std::unique_ptr<DrawShapeArc>> &arcs) const {\n- double xradius, yradius;\n+ // an empirically derived lineWidth.\n+ int lineWidth = 3;\n+ bool scaleLineWidth = true;\n for (auto ca : colAtoms) {\n if (ca < 0 || static_cast<unsigned int>(ca) >= drawMol_->getNumAtoms()) {\n // there's an error in the colour map\n continue;\n }\n- getAtomRadius(ca, xradius, yradius);\n- xradius += xradius * lassoNum * 0.5;\n- Point2D radii(xradius, xradius);\n+ double lassoWidth = getLassoWidth(this, ca, lassoNum);\n+ Point2D radii(lassoWidth, lassoWidth);\n std::vector<Point2D> pts{atCds_[ca], radii};\n- DrawShapeArc *ell = new DrawShapeArc(\n- pts, 0.0, 360.0, drawOptions_.bondLineWidth, true, col, false, ca);\n+ DrawShapeArc *ell = new DrawShapeArc(pts, 0.0, 360.0, lineWidth,\n+ scaleLineWidth, col, false, ca);\n arcs.emplace_back(ell);\n }\n }\n@@ -172,6 +199,8 @@ void DrawMolMCHLasso::extractBondLines(\n size_t lassoNum, const RDKit::DrawColour &col,\n const std::vector<int> &colAtoms,\n std::vector<std::unique_ptr<DrawShapeSimpleLine>> &lines) const {\n+ int lineWidth = 3;\n+ bool scaleLineWidth = true;\n if (colAtoms.size() > 1) {\n for (size_t i = 0U; i < colAtoms.size() - 1; ++i) {\n if (colAtoms[i] < 0 ||\n@@ -179,20 +208,16 @@ void DrawMolMCHLasso::extractBondLines(\n // there's an error in the colour map.\n continue;\n }\n- double xradiusI, yradiusI;\n- getAtomRadius(colAtoms[i], xradiusI, yradiusI);\n- xradiusI += xradiusI * lassoNum * 0.5;\n- auto dispI = xradiusI * 0.75;\n+ auto lassoWidthI = getLassoWidth(this, colAtoms[i], lassoNum);\n+ auto dispI = lassoWidthI * 0.75;\n for (size_t j = i + 1; j < colAtoms.size(); ++j) {\n if (colAtoms[j] < 0 ||\n static_cast<unsigned int>(colAtoms[j]) >= drawMol_->getNumAtoms()) {\n // there's an error in the colour map.\n continue;\n }\n- double xradiusJ, yradiusJ;\n- getAtomRadius(colAtoms[j], xradiusJ, yradiusJ);\n- xradiusJ += xradiusJ * lassoNum * 0.5;\n- auto dispJ = xradiusJ * 0.75;\n+ auto lassoWidthJ = getLassoWidth(this, colAtoms[j], lassoNum);\n+ auto dispJ = lassoWidthJ * 0.75;\n auto bond = drawMol_->getBondBetweenAtoms(colAtoms[i], colAtoms[j]);\n if (bond) {\n if (!mcHighlightBondMap_.empty()) {\n@@ -213,14 +238,13 @@ void DrawMolMCHLasso::extractBondLines(\n // less than the radii of the circles (just less, so that they still\n // intersect rather than hitting on the tangent)\n auto mid = (p1 + p2) / 2.0;\n- if ((atCdsI - mid).lengthSq() < xradiusI * xradiusI) {\n- p1 = atCdsI + perp * xradiusI * 0.99 * m;\n- p2 = atCdsJ + perp * xradiusJ * 0.99 * m;\n+ if ((atCdsI - mid).lengthSq() < lassoWidthI * lassoWidthI) {\n+ p1 = atCdsI + perp * lassoWidthI * 0.99 * m;\n+ p2 = atCdsJ + perp * lassoWidthJ * 0.99 * m;\n }\n DrawShapeSimpleLine *pl = new DrawShapeSimpleLine(\n- {p1, p2}, drawOptions_.bondLineWidth,\n- drawOptions_.scaleBondWidth, col, colAtoms[i], colAtoms[j],\n- bond->getIdx(), noDash);\n+ {p1, p2}, lineWidth, scaleLineWidth, col, colAtoms[i],\n+ colAtoms[j], bond->getIdx(), noDash);\n lines.emplace_back(pl);\n }\n }\n@@ -488,7 +512,8 @@ void DrawMolMCHLasso::fixIntersectingArcsAndLines(\n void DrawMolMCHLasso::fixProtrudingLines(\n std::vector<std::unique_ptr<DrawShapeSimpleLine>> &lines) const {\n // lasso_highlight_7.svg also had the problem where two lines didn't\n- // intersect, but one protruded beyond the end of the other inside the lasso.\n+ // intersect, but one protruded beyond the end of the other inside the\n+ // lasso.\n for (auto &line1 : lines) {\n for (auto &line2 : lines) {\n auto d1_0 = (line1->points_[0] - line2->points_[0]).length();\n@@ -514,5 +539,88 @@ void DrawMolMCHLasso::fixProtrudingLines(\n }\n }\n }\n+\n+namespace {\n+std::pair<Point2D, Point2D> getArcEnds(const DrawShapeArc &arc) {\n+ std::pair<Point2D, Point2D> retVal;\n+ // for these purposes, it's always a circle, so just use the x\n+ // radius\n+ retVal.first.x =\n+ arc.points_[0].x + arc.points_[1].x * cos(arc.ang1_ * M_PI / 180.0);\n+ retVal.first.y =\n+ arc.points_[0].y + arc.points_[1].x * sin(arc.ang1_ * M_PI / 180.0);\n+ retVal.second.x =\n+ arc.points_[0].x + arc.points_[1].x * cos(arc.ang2_ * M_PI / 180.0);\n+ retVal.second.y =\n+ arc.points_[0].y + arc.points_[1].x * sin(arc.ang2_ * M_PI / 180.0);\n+ return retVal;\n+}\n+} // namespace\n+void DrawMolMCHLasso::fixOrphanLines(\n+ std::vector<std::unique_ptr<DrawShapeArc>> &arcs,\n+ std::vector<std::unique_ptr<DrawShapeSimpleLine>> &lines) {\n+ // lasso_highlights_7.svg had a line close to an arc at\n+ // one end, but not at the other. Such lines are clearly\n+ // artifacts that need to be removed. Takes out all lines\n+ // that aren't within a tolerance of something at both ends.\n+ std::vector<std::pair<Point2D, Point2D>> arcEnds;\n+ for (const auto &arc : arcs) {\n+ arcEnds.push_back(getArcEnds(*arc));\n+ }\n+ // This tolerance was arrived at empirically. It's enough\n+ // to fix lasso_highlights_7.svg without breaking it and\n+ // lasso_highlights_6.svg. A slightly tighter tolerance\n+ // (e.g. 0.003) causes green lines associated with bonds 9\n+ // and 12 to be removed incorrectly in both of these.\n+ static const double tol = 0.005;\n+ for (auto &line1 : lines) {\n+ bool attached0 = false, attached1 = false;\n+ for (const auto &arcEnd : arcEnds) {\n+ if ((line1->points_[0] - arcEnd.first).lengthSq() < tol) {\n+ attached0 = true;\n+ }\n+ if ((line1->points_[1] - arcEnd.first).lengthSq() < tol) {\n+ attached1 = true;\n+ }\n+ if ((line1->points_[0] - arcEnd.second).lengthSq() < tol) {\n+ attached0 = true;\n+ }\n+ if ((line1->points_[1] - arcEnd.second).lengthSq() < tol) {\n+ attached1 = true;\n+ }\n+ }\n+ if (!attached0 || !attached1) {\n+ for (auto &line2 : lines) {\n+ if (line1 == line2 || !line1 || !line2) {\n+ continue;\n+ }\n+ if ((line1->points_[0] - line2->points_[0]).lengthSq() < tol) {\n+ attached0 = true;\n+ }\n+ if ((line1->points_[0] - line2->points_[1]).lengthSq() < tol) {\n+ attached0 = true;\n+ }\n+ if ((line1->points_[1] - line2->points_[0]).lengthSq() < tol) {\n+ attached1 = true;\n+ }\n+ if ((line1->points_[1] - line2->points_[1]).lengthSq() < tol) {\n+ attached1 = true;\n+ }\n+ if (attached0 && attached1) {\n+ break;\n+ }\n+ }\n+ }\n+ if (!attached0 || !attached1) {\n+ line1.reset();\n+ }\n+ }\n+ lines.erase(std::remove_if(\n+ lines.begin(), lines.end(),\n+ [](const std::unique_ptr<DrawShapeSimpleLine> &line) -> bool {\n+ return !line;\n+ }),\n+ lines.end());\n+}\n } // namespace MolDraw2D_detail\n } // namespace RDKit\ndiff --git a/Code/GraphMol/MolDraw2D/DrawMolMCHLasso.h b/Code/GraphMol/MolDraw2D/DrawMolMCHLasso.h\nindex 55bad32b1a7..69aa135f3c6 100644\n--- a/Code/GraphMol/MolDraw2D/DrawMolMCHLasso.h\n+++ b/Code/GraphMol/MolDraw2D/DrawMolMCHLasso.h\n@@ -84,6 +84,10 @@ class DrawMolMCHLasso : public DrawMolMCH {\n std::vector<std::unique_ptr<DrawShapeSimpleLine>> &lines) const;\n void fixProtrudingLines(\n std::vector<std::unique_ptr<DrawShapeSimpleLine>> &lines) const;\n+ // Orphan lines are ones where at least one end isn't close to the end\n+ // of any line or arc.\n+ void fixOrphanLines(std::vector<std::unique_ptr<DrawShapeArc>> &arcs,\n+ std::vector<std::unique_ptr<DrawShapeSimpleLine>> &lines);\n };\n } // namespace MolDraw2D_detail\n } // namespace RDKit\ndiff --git a/Docs/Book/BackwardsIncompatibleChanges.md b/Docs/Book/BackwardsIncompatibleChanges.md\nindex 952a37c61f6..17defc8ef51 100644\n--- a/Docs/Book/BackwardsIncompatibleChanges.md\n+++ b/Docs/Book/BackwardsIncompatibleChanges.md\n@@ -8,6 +8,51 @@ generally include changes in results that arise due to bug fixes; we try to call\n those out in the release notes. The release notes, in general, contain a more\n comprehensive version of this list.\n \n+## Release 2023.09\n+\n+### Changes in atomic stereochemistry perception\n+\n+The algorithm for perception of atomic stereochemistry from 2D structures has\n+been rewritten. The new algorithm is more accurate, which results in some\n+differences in perceived stereo between this release and the previous ones.\n+\n+### Changes in the MCS code\n+\n+- The user-configurable `MCSParameters::FinalMatchChecker` function is now\n+called after the built-in `FinalMatchChecker` function, rather as\n+alternatively to the built-in `FinalMatchChecker` function. This was a\n+design flaw which is worth correcting.\n+- Setting `MCSParameters::Timeout` to 0 means no timeout, rather than 0s\n+timeout, which is rather pointless as it would cause MCS to be canceled\n+immediately.\n+- Result SMARTS strings generated by `FindMCS` when\n+`MCSParameters::MatchRingFusionStrict` is `true` now include ring membership\n+queries where appropriate in order to ensure more specific substructure\n+matches.\n+- In MCS Verbose statistics, `SingleBondExcluded` was renamed to\n+`IndividualBondExcluded` to avoid confusion, since single bond has a\n+different meaning in chemistry.\n+\n+### Changes to canonicalization\n+\n+Information about stereo groups is no longer used in the SMILES canonicalization\n+process if CXSMILES are not being generated.\n+\n+\n+## Release 2023.03\n+\n+### Changes to ring finding\n+\n+- The ring-finding functions will now run even if the molecule already has ring information. Older versions of the RDKit would return whatever ring information was present, even if it had been generated using a different algorithm.\n+- The ring-finding functions now no longer consider dative bonds as possible ring bonds by default. All of the ring-finding functions have a new optional argument `includeDativeBonds` which can be used to change this behavior\n+\n+### Changes to canonicalization\n+\n+The canonical SMILES and CXSMILES generated for molecules with enhanced stereochemistry (stereo groups) is different than in previous releases. The enhanced stereochemistry information and the stereo groups themselves are now canonical. This does *not* affect molecules which do not have enhanced stereo and will not have any effect if you generate non-isomeric SMILES. This change also affects the output of the MolHash and RegistrationHash code when applied to molecules with enhanced stereo.\n+\n+\n+\n+\n ## Release 2022.09\n \n ### Changes in canonicalization\ndiff --git a/Docs/Book/GettingStartedInPython.rst b/Docs/Book/GettingStartedInPython.rst\nindex 3b439c2c44b..e930d3fc19c 100644\n--- a/Docs/Book/GettingStartedInPython.rst\n+++ b/Docs/Book/GettingStartedInPython.rst\n@@ -1553,7 +1553,7 @@ requirement.\n >>> rdFMCS.FindMCS(mols).smartsString\n '[#6]1-[#6]-[#6](-[#6]-1-[#6])-[#6]'\n >>> rdFMCS.FindMCS(mols, ringMatchesRingOnly=True).smartsString\n- '[#6&R]1-&@[#6&R]-&@[#6&R](-&@[#6&R]-&@1)-&@[#6&R]'\n+ '[#6]1-&@[#6]-&@[#6](-&@[#6]-&@1)-&@[#6&R]'\n >>> rdFMCS.FindMCS(mols, completeRingsOnly=True).smartsString\n '[#6]1-&@[#6]-&@[#6]-&@[#6]-&@1'\n \ndiff --git a/ReleaseNotes.md b/ReleaseNotes.md\nindex bd95bafbd5f..5a1708c521c 100644\n--- a/ReleaseNotes.md\n+++ b/ReleaseNotes.md\n@@ -2,8 +2,27 @@\n (Changes relative to Release_2023.03.1)\n \n ## Acknowledgements\n+(Note: I'm no longer attempting to manually curate names. If you would like to\n+see your contribution acknowledged with your name, please set your name in\n+GitHub)\n+\n+Jason Biggs, Jonathan Bisson, David Cosgrove, Andrew Dalke, Christian W.\n+Feldmann, Eloy F\u00e9lix, Richard Gowers, Tadd Hurst, Gareth Jones, Eisuke\n+Kawashima, Brian Kelley, Joos Kiener, Juuso Lehtivarjo, John Mayfield, Vedran\n+Mileti\u0107, Jeremy Monat, Dan Nealschneider, Timothy Ngotiaoco, Axel Pahl, Rachael\n+Pirie, Ricardo Rodriguez-Schmidt, Ernst-Georg Schmid, Paolo Tosco, Ivan\n+Tubert-Brohman, Riccardo Vianello, Rachel Walker, Maciej W\u00f3jcikowski, pierred5,\n+lhyuen, paconius, BartlomiejF, thomp-j, wangyingxie, teltim, Meteor-han,\n+abefrandsen, \n \n ## Highlights\n+- The new RascalMCES code adds a very fast maximum common substructure\n+ implementation for pairs of molecules.\n+- The RDKit core now supports \"generalized substructure searching\", making it\n+ easier to take link nodes, variable attachment points, and tautomer queries\n+ into account when doing substructure searches. This is now also supported in\n+ the PostgreSQL cartridge.\n+- The RDKit now has support for reading and writing MRV files.\n \n ## Backwards incompatible changes\n - The CDXML parser now returns mols with reasonable coordinates and in\n@@ -43,13 +62,267 @@ cast\", they now need to be matched with the regex `[B,b]ad any[\\ ,_]cast`\n - The functions for determining connectivity in DetermineBonds now use a more\n efficient method by default. To go back to the old behavior, set the useVdw argument\n to True.\n+- The algorithm for perception of atomic stereochemistry from 2D structures has\n+been rewritten. The new algorithm is more accurate, which results in some\n+differences in perceived stereo between this release and the previous ones.\n+- Information about stereo groups is no longer used in the SMILES\n+canonicalization process if CXSMILES are not being generated.\n+\n+## New Features and Enhancements:\n+ - Mols matrix to grid image\n+ (github pull #6080 from bertiewooster)\n+ - Reduce space overhead of enabling the inclusion of properties when serializing molecules\n+ (github issue #6312 from rvianello)\n+ - Add optional sortsupport methods to the PostgreSQL GiST indices\n+ (github pull #6313 from rvianello)\n+ - Add a new parameter to mol_adjust_query_properties for generic query parameters\n+ (github pull #6332 from bjonnh-work)\n+ - add DebugDraw() function\n+ (github pull #6340 from greglandrum)\n+ - Optimize GetPropsFromDict: use tags for conversion\n+ (github pull #6355 from bp-kelley)\n+ - Fix cleanupOrganometallics and reinstate to sanitisation\n+ (github pull #6357 from DavidACosgrove)\n+ - postgres cartridge: cleanup a few obsolete build options\n+ (github pull #6363 from rvianello)\n+ - Fixes some issues in the SubstructLibrary JS implementation\n+ (github pull #6385 from ptosco)\n+ - Support TautomerQuery and MolBundle queries in the cartridge\n+ (github pull #6393 from greglandrum)\n+ - JS: Implement in-place aromatisation/kekulisation and avoid undesired exception\n+ (github pull #6407 from ptosco)\n+ - Optionally expose MCS to JS and extend optional compilation to JSReaction and JSSubstructLibrary\n+ (github pull #6409 from ptosco)\n+ - Add a method \"HasQuery()\" to Mol class\n+ (github issue #6411 from kienerj)\n+ - Enable using JSSubstructLibrary without pattern fps\n+ (github pull #6431 from ptosco)\n+ - Add support for generalized substructure searching\n+ (github pull #6443 from greglandrum)\n+ - Add atom and bond property parameters to substruct matching\n+ (github pull #6453 from rachelnwalker)\n+ - Replace a try..catch block with an if clause\n+ (github pull #6488 from ptosco)\n+ - Add an in place version of most of the MolStandardize functionality\n+ (github pull #6491 from greglandrum)\n+ - Exposed partial sanitization options to MinimalLib (both JS and CFFI)\n+ (github pull #6519 from ptosco)\n+ - Optionally forward Enhanced Stereo Group ids\n+ (github pull #6560 from ricrogz)\n+ - Add support for dative bonds in MOL files\n+ (github pull #6566 from bjonnh-work)\n+ - RASCAL MCES\n+ (github pull #6568 from DavidACosgrove)\n+ - Support additional generic groups\n+ (github pull #6570 from bjonnh-work)\n+ - Add support for Marvin files\n+ (github pull #6575 from bjonnh-work)\n+ - Add a \"rootedAtAtom\" to MolToSmarts\n+ (github pull #6581 from ricrogz)\n+ - RGD to support tautomers of core\n+ (github issue #6609 from jones-gareth)\n+ - Fix some build warnings\n+ (github pull #6618 from ricrogz)\n+ - Exposed log capture functionality to MinimalLib\n+ (github pull #6628 from ptosco)\n+ - add option to use sequential random seeds in the conformer generator\n+ (github pull #6639 from greglandrum)\n+ - Major MCS refactoring: new features and bug fixes\n+ (github pull #6646 from ptosco)\n+ - Lasso highlights\n+ (github pull #6653 from DavidACosgrove)\n+ - extract continuous lines from the conrec code\n+ (github pull #6676 from greglandrum)\n+ - Allow some tolerance in flatness determination\n+ (github pull #6696 from ricrogz)\n+ - Do not trust the 2D/3D tag in ctab mol files\n+ (github pull #6697 from ricrogz)\n+ - expose the CDXML reaction parsers to python\n+ (github pull #6700 from greglandrum)\n+ - Add hasQueryHs\n+ (github pull #6702 from bp-kelley)\n+ - Exporting to mol marks imine bonds EITHERDOUBLE when imine H is implicit\n+ (github issue #6703 from ricrogz) \n+ - Use the connect-the-dots algorithm by default in DetermineBonds\n+ (github pull #6740 from greglandrum)\n+ - Add function to calculate all 3D descriptors\n+ (github pull #6741 from RPirie96)\n+ - Add SpacialScore\n+ (github pull #6742 from apahl)\n+ - Extract the core matching logic into a separate function\n+ (github pull #6754 from ptosco)\n \n \n ## Bug Fixes:\n+ - rdFMCS.FindMCS uses huge amounts of memory for this pair of molecules when CompleteRingsOnly is True\n+ (github issue #3965 from i-tub)\n+ - PF6- still can not get Bad Conformer Id after the #510 issue fix \n+ (github issue #5145 from wangyingxie)\n+ - Order dependence for rdFMCS.FindMCS with MatchFusedRingsStrict\n+ (github issue #5411 from pierred5)\n+ - Failed FMCS results with certain seed SMARTS and MatchFusedRings* parameters on\n+ (github issue #5440 from pierred5)\n+ - Seed SMARTS to FindMCS() produces incorrect MCS\n+ (github issue #5457 from pierred5)\n+ - FindMCS returns wrong result with monoatomic molecules\n+ (github issue #5510 from ptosco)\n+ - queryMol from FindMCS doesn't match mols used to generate MCS\n+ (github issue #6082 from paconius)\n+ - Crash when parsing InChI\n+ (github issue #6172 from eloyfelix)\n+ - Iteration over Python GetAtoms is 10-20x slower than need be\n+ (github issue #6208 from d-b-w)\n+ - refactor(python): replace deprecated unittest methods\n+ (github pull #6304 from e-kwsm)\n+ - generateDepictionMatching2DStructure: bonds to R groups should be generic when matching\n+ (github pull #6306 from ptosco)\n+ - MolToSmiles(canonical=False) creates the wrong _smilesBondOutputOrder property\n+ (github issue #6315 from adalke)\n+ - MolToMolBlock ignores unspecified information for double bonds in rings\n+ (github issue #6316 from mwojcikowski)\n+ - bump yaehmop version\n+ (github pull #6330 from greglandrum)\n+ - rdMolDraw2D.MolDraw2DCairo produces Pre-condition Violation: no draw context when SetColour, DrawRect or DrawLine was called.\n+ (github issue #6336 from lhyuen)\n+ - Added cstdint include\n+ (github pull #6338 from vedranmiletic)\n+ - remove the dependency from python distutils in the top CMakeLists.txt file\n+ (github pull #6339 from rvianello)\n+ - take drawOptions into account when exporting structure to xlsx format\n+ (github pull #6341 from ptosco)\n+ - Fix swig memory leak\n+ (github pull #6346 from jones-gareth)\n+ - Add inlines to ForceFieldHelpers header functions\n+ (github pull #6356 from JLVarjo)\n+ - Bug relating to this PF6- still can not get Bad Conformer Id\n+ (github issue #6365 from teltim)\n+ - straightenDepiction should not consider 0-degree rotations as multiples of 60\n+ (github pull #6367 from ptosco)\n+ - expose two missing EmbedFailureCauses tags to python\n+ (github pull #6372 from greglandrum)\n+ - Molfile Unsaturation Query Not Parsed Correctly\n+ (github issue #6395 from timothyngo)\n+ - MolDraw2D: chiral tag overlapping atom label\n+ (github issue #6397 from greglandrum)\n+ - MolDraw2D: increasing padding results in the legend not being displayed\n+ (github issue #6400 from greglandrum)\n+ - expose some missing CXSmiles flags to python\n+ (github pull #6415 from greglandrum)\n+ - V3000 structure segfaults when converting to SVG\n+ (github issue #6416 from ergo70)\n+ - WedgeMolBonds won't wedge/dash a 2nd bond when input already has a wedge/dash around the same chiral atom\n+ (github issue #6423 from ricrogz)\n+ - MolEnumerate should clear the reaction properties on its results\n+ (github issue #6432 from greglandrum)\n+ - RDKit hangs indefinitely when parsing not so big molblock\n+ (github issue #6434 from eloyfelix)\n+ - Removing Hs on a pyrrol-like structure throws kekulization error\n+ (github issue #6437 from ricrogz)\n+ - Molecules from CDXML Parser have inverted, unrealistic atomic coordinates\n+ (github issue #6461 from greglandrum)\n+ - CDXML Parser does not preserve information about bond wedging\n+ (github issue #6462 from greglandrum)\n+ - boost::bad_any_cast error when calling getProp<string> on properties set by applyMolListPropsToAtoms<int64_t>\n+ (github issue #6465 from rachelnwalker)\n+ - Allow systems like C/C=N/[H] to be stereogenic with the new chirality code\n+ (github pull #6473 from greglandrum)\n+ - Fix RWMol::addAtom docstring\n+ (github pull #6477 from d-b-w)\n+ - StereoGroup information should not impact canonicalization when CXSMILES isn't being generated\n+ (github issue #6479 from greglandrum)\n+ - Fix a few broken docstrings\n+ (github pull #6480 from ptosco)\n+ - pin numpy to 1.24.3\n+ (github pull #6483 from bp-kelley)\n+ - CMAKE_INSTALL_PREFIX not honored for Python files installation on Windows\n+ (github pull #6485 from ricrogz)\n+ - Fixed tests that weren't being run in testDepictor.py\n+ (github pull #6486 from rachelnwalker)\n+ - Get tests to work when building without exception support (i.e., legacy pure JS library)\n+ (github pull #6487 from ptosco)\n+ - Fixes rdkit-js/issues/347\n+ (github pull #6490 from ptosco)\n+ - Make sure that molecules are shown as images by PandasTools also when DataFrames are truncated horizontally\n+ (github pull #6496 from ptosco)\n+ - MolToMolBlock writes \"either\" stereo for double bonds which shouldn't be stereo\n+ (github issue #6502 from ricrogz)\n+ - Double bonds are not correctly drawn on sulfoximines\n+ (github issue #6504 from ptosco)\n+ - RegistrationHash.GetMolLayers() with v2 tautomer hash does not filter CX extensions\n+ (github issue #6505 from ricrogz)\n+ - Drop the s_m_color_rgb property from MaeWriter\n+ (github pull #6511 from ricrogz)\n+ - update avalontools version to incorporate bug fixes\n+ (github pull #6513 from ptosco)\n+ - update windows DLL CI build config\n+ (github pull #6535 from greglandrum)\n+ - Add MolEnumerator to C#\n+ (github pull #6542 from jones-gareth)\n+ - MolDraw2D: placement of bond or atom labels gets confused when atoms overlap\n+ (github issue #6569 from greglandrum)\n+ - partial MCS failure\n+ (github issue #6578 from greglandrum)\n+ - Fix vulnerabilities found by fuzzer.\n+ (github pull #6579 from thomp-j)\n+ - allow building the cartridge against PostgreSQL 16\n+ (github pull #6580 from ptosco)\n+ - SIGSEGV while calculating molecular descriptors after using salt remover.\n+ (github issue #6592 from BartlomiejF)\n+ - Add newline to ConstrainedEmbed docstring.\n+ (github pull #6596 from DavidACosgrove)\n+ - Avoid leaking memory in case exceptions are thrown while generating FPs\n+ (github pull #6630 from ptosco)\n+ - Pre-condition violation in canonicalization of dative bond adjacent to double bond\n+ (github issue #6633 from ricrogz)\n+ - Incorrect most abundant isotope for Vanadium\n+ (github issue #6638 from abefrandsen)\n+ - Simple imine-containing molecule causes an infinite loop in FindStereo.cpp\n+ (github issue #6640 from ptosco)\n+ - Mol file parser strips stereogenic H from imine bonds\n+ (github issue #6664 from ricrogz)\n+ - ROMol move constructor and assignment do not update SubstanceGroup ownership\n+ (github issue #6681 from ricrogz)\n+ - Flexicanvas cuts off bottom of reaction\n+ (github issue #6685 from DavidACosgrove)\n+ - make sure bond attachpt info is pickled\n+ (github pull #6698 from greglandrum)\n+ - Catch meanBondLen of 0.0\n+ (github pull #6699 from DavidACosgrove)\n+ - Add trans layout for double bonds in rings\n+ (github pull #6709 from d-b-w)\n+ - Segmentation fault in MMFF\n+ (github issue #6728 from Meteor-han)\n+ - Fix chirality handling when the chiral atom is the first one in a SMARTS\n+ (github pull #6730 from johnmay)\n+ - ConnectTheDots can segfault if all atoms do not have residue info\n+ (github issue #6756 from jasondbiggs)\n+ - _moltoimg() should honor drawOptions.prepareMolsBeforeDrawing\n+ (github issue #6792 from ptosco)\n \n ## Cleanup work:\n+ - adjustQueryProperties cleanup\n+ (github pull #6361 from ptosco)\n+ - Fix identical for-loop variable names\n+ (github pull #6391 from JLVarjo)\n+ - Deprecate JSMol::is_valid() and JSReaction::is_valid() and return nullptr instead\n+ (github pull #6392 from ptosco)\n+ - misc jswrapper.cpp cleanup\n+ (github pull #6449 from ptosco)\n+ - Deprecate the pure python MolStandardize implementations.\n+ (github pull #6548 from greglandrum)\n+ - clear up some compiler warnings\n+ (github pull #6627 from greglandrum)\n+ - switch from boost::any to std::any\n+ (github pull #6662 from greglandrum)\n+ - Fail CI builds on compiler warnings + some fixes\n+ (github pull #6675 from ricrogz)\n+ - fix some more leaks\n+ (github pull #6684 from ricrogz)\n+ - Some small cleanups from the UGM Hackathon\n+ (github pull #6744 from greglandrum)\n+ - some modernization of the memory handing in the canonicalization code\n+ (github pull #6763 from greglandrum)\n \n-## New Features and Enhancements:\n \n ## Code removed in this release:\n - The `compare` and `callback` methods (deprecated since release 2021.01)\ndiff --git a/rdkit/Chem/Descriptors3D.py b/rdkit/Chem/Descriptors3D.py\nindex 479514980e5..0b86a37c2cb 100644\n--- a/rdkit/Chem/Descriptors3D.py\n+++ b/rdkit/Chem/Descriptors3D.py\n@@ -196,3 +196,55 @@\n - confId: (optional) the conformation ID to use\n \n \"\"\"\n+\n+ PBF = lambda *x, **y: rdMolDescriptors.CalcPBF(*x, **y)\n+ PBF.version = rdMolDescriptors._CalcPBF_version\n+ PBF.__doc__ = \"\"\" Plane of best fit\n+ from: https://doi.org/10.1021/ci300293f\n+\n+ **Arguments**\n+\n+ - inMol: a molecule\n+\n+ - confId: (optional) the conformation ID to use\n+\n+ \"\"\"\n+\n+\n+\n+from rdkit.Chem.Descriptors import _isCallable\n+descList = []\n+def _setupDescriptors(namespace):\n+ global descList\n+ descList.clear()\n+\n+ for nm, thing in tuple(namespace.items()):\n+ if nm[0] != '_' and nm != 'CalcMolDescriptors3D' and _isCallable(thing):\n+ descList.append((nm, thing))\n+\n+\n+_setupDescriptors(locals())\n+\n+def CalcMolDescriptors3D(mol, confId=None):\n+ \"\"\"\n+ Compute all 3D descriptors of a molecule\n+ \n+ Arguments:\n+ - mol: the molecule to work with\n+ - confId: conformer ID to work with. If not specified the default (-1) is used\n+ \n+ Return:\n+ \n+ dict\n+ A dictionary with decriptor names as keys and the descriptor values as values\n+\n+ raises a ValueError \n+ If the molecule does not have conformers\n+ \"\"\"\n+ if mol.GetNumConformers() == 0:\n+ raise ValueError('Computing 3D Descriptors requires a structure with at least 1 conformer')\n+ else:\n+ vals_3D = {}\n+ for nm,fn in descList:\n+ vals_3D[nm] = fn(mol)\n+ return vals_3D\ndiff --git a/rdkit/Chem/Draw/__init__.py b/rdkit/Chem/Draw/__init__.py\nindex 38e0c4e9ae5..910d707beda 100644\n--- a/rdkit/Chem/Draw/__init__.py\n+++ b/rdkit/Chem/Draw/__init__.py\n@@ -462,13 +462,14 @@ def _moltoimg(mol, sz, highlights, legend, returnPNG=False, drawOptions=None, **\n kekulize = shouldKekulize(mol, kwargs.get('kekulize', True))\n wedge = kwargs.get('wedgeBonds', True)\n \n- try:\n- with rdBase.BlockLogs():\n- mc = rdMolDraw2D.PrepareMolForDrawing(mol, kekulize=kekulize, wedgeBonds=wedge)\n- except ValueError: # <- can happen on a kekulization failure\n- mc = rdMolDraw2D.PrepareMolForDrawing(mol, kekulize=False, wedgeBonds=wedge)\n+ if not drawOptions or drawOptions.prepareMolsBeforeDrawing:\n+ try:\n+ with rdBase.BlockLogs():\n+ mol = rdMolDraw2D.PrepareMolForDrawing(mol, kekulize=kekulize, wedgeBonds=wedge)\n+ except ValueError: # <- can happen on a kekulization failure\n+ mol = rdMolDraw2D.PrepareMolForDrawing(mol, kekulize=False, wedgeBonds=wedge)\n if not hasattr(rdMolDraw2D, 'MolDraw2DCairo'):\n- img = MolToImage(mc, sz, legend=legend, highlightAtoms=highlights, **kwargs)\n+ img = MolToImage(mol, sz, legend=legend, highlightAtoms=highlights, **kwargs)\n if returnPNG:\n bio = BytesIO()\n img.save(bio, format='PNG')\n@@ -483,10 +484,10 @@ def _moltoimg(mol, sz, highlights, legend, returnPNG=False, drawOptions=None, **\n d2d.drawOptions().prepareMolsBeforeDrawing = False\n bondHighlights = kwargs.get('highlightBonds', None)\n if bondHighlights is not None:\n- d2d.DrawMolecule(mc, legend=legend or \"\", highlightAtoms=highlights or [],\n+ d2d.DrawMolecule(mol, legend=legend or \"\", highlightAtoms=highlights or [],\n highlightBonds=bondHighlights)\n else:\n- d2d.DrawMolecule(mc, legend=legend or \"\", highlightAtoms=highlights or [])\n+ d2d.DrawMolecule(mol, legend=legend or \"\", highlightAtoms=highlights or [])\n d2d.FinishDrawing()\n if returnPNG:\n img = d2d.GetDrawingText()\n@@ -504,11 +505,12 @@ def _moltoSVG(mol, sz, highlights, legend, kekulize, drawOptions=None, **kwargs)\n \n kekulize = shouldKekulize(mol, kekulize)\n \n- try:\n- with rdBase.BlockLogs():\n- mc = rdMolDraw2D.PrepareMolForDrawing(mol, kekulize=kekulize)\n- except ValueError: # <- can happen on a kekulization failure\n- mc = rdMolDraw2D.PrepareMolForDrawing(mol, kekulize=False)\n+ if not drawOptions or drawOptions.prepareMolsBeforeDrawing:\n+ try:\n+ with rdBase.BlockLogs():\n+ mol = rdMolDraw2D.PrepareMolForDrawing(mol, kekulize=kekulize)\n+ except ValueError: # <- can happen on a kekulization failure\n+ mol = rdMolDraw2D.PrepareMolForDrawing(mol, kekulize=False)\n d2d = rdMolDraw2D.MolDraw2DSVG(sz[0], sz[1])\n if drawOptions is not None:\n d2d.SetDrawOptions(drawOptions)\n@@ -516,10 +518,10 @@ def _moltoSVG(mol, sz, highlights, legend, kekulize, drawOptions=None, **kwargs)\n d2d.drawOptions().prepareMolsBeforeDrawing = False\n bondHighlights = kwargs.get('highlightBonds', None)\n if bondHighlights is not None:\n- d2d.DrawMolecule(mc, legend=legend or \"\", highlightAtoms=highlights or [],\n+ d2d.DrawMolecule(mol, legend=legend or \"\", highlightAtoms=highlights or [],\n highlightBonds=bondHighlights)\n else:\n- d2d.DrawMolecule(mc, legend=legend or \"\", highlightAtoms=highlights or [])\n+ d2d.DrawMolecule(mol, legend=legend or \"\", highlightAtoms=highlights or [])\n d2d.FinishDrawing()\n svg = d2d.GetDrawingText()\n return svg\n"}, "test": {"test_patch": "diff --git a/Code/GraphMol/FMCS/Wrap/testFMCS.py b/Code/GraphMol/FMCS/Wrap/testFMCS.py\nindex f9bfceafcb4..99437bcb7b2 100644\n--- a/Code/GraphMol/FMCS/Wrap/testFMCS.py\n+++ b/Code/GraphMol/FMCS/Wrap/testFMCS.py\n@@ -707,7 +707,7 @@ def test7Seed(self, **kwargs):\n r = rdFMCS.FindMCS(ms, params)\n else:\n r = rdFMCS.FindMCS(ms, seedSmarts='C1OC1', ringMatchesRingOnly=True)\n- self.assertEqual(r.smartsString, \"[#6&R]1-&@[#6&R]-&@[#6&R]-&@[#6&R]-&@1\")\n+ self.assertEqual(r.smartsString, \"[#6]1-&@[#6]-&@[#6]-&@[#6]-&@1\")\n self.assertEqual(r.numAtoms, 4)\n self.assertEqual(r.numBonds, 4)\n if kwargs:\n@@ -1164,7 +1164,7 @@ def test18GitHub3693(self):\n self.assertEqual(res.numBonds, 11)\n self.assertEqual(\n res.smartsString,\n- \"[#6&R]1:&@[#6&R]:&@[#6&R]:&@[#6&R]2:&@[#6&R](:&@[#6&R]:&@1):&@[#6&R]:&@[#6&R]:&@[#6&R]:&@[#6&R]:&@2\"\n+ \"[#6]1:&@[#6]:&@[#6]:&@[#6]2:&@[#6](:&@[#6]:&@1):&@[#6]:&@[#6]:&@[#6]:&@[#6]:&@2\"\n )\n \n params = rdFMCS.MCSParameters()\n@@ -1176,7 +1176,7 @@ def test18GitHub3693(self):\n self.assertEqual(res.numBonds, 11)\n self.assertEqual(\n res.smartsString,\n- \"[#6&R]1:&@[#6&R]:&@[#6&R]:&@[#6&R]2:&@[#6&R](:&@[#6&R]:&@1):&@[#6&R]:&@[#6&R]:&@[#6&R]:&@[#6&R]:&@2\"\n+ \"[#6]1:&@[#6]:&@[#6]:&@[#6]2:&@[#6](:&@[#6]:&@1):&@[#6]:&@[#6]:&@[#6]:&@[#6]:&@2\"\n )\n \n def test19MCS3d(self):\n@@ -1241,7 +1241,7 @@ def test21ShouldAcceptMCS(self):\n mcs = rdFMCS.FindMCS(mols2, params)\n self.assertEqual(mcs.numAtoms, 4)\n self.assertEqual(mcs.numBonds, 4)\n- self.assertEqual(mcs.smartsString, \"[#6&R]1-&@[#6&R]-&@[#6&R]-&@1-&!@[#0,#6;!R]\")\n+ self.assertEqual(mcs.smartsString, \"[#6]1-&@[#6]-&@[#6]-&@1-&!@[#0,#6;!R]\")\n self.assertGreater(params.ProgressCallback.callCount, 0)\n self.assertGreater(params.FinalMatchChecker.callCount, 0)\n \ndiff --git a/Code/GraphMol/FMCS/testFMCS_Unit.cpp b/Code/GraphMol/FMCS/testFMCS_Unit.cpp\nindex 60832bcf55f..ea6a29705f2 100644\n--- a/Code/GraphMol/FMCS/testFMCS_Unit.cpp\n+++ b/Code/GraphMol/FMCS/testFMCS_Unit.cpp\n@@ -2035,7 +2035,7 @@ void testGitHub2731_comment546175466() {\n TEST_ASSERT(res.NumBonds == 14);\n TEST_ASSERT(\n res.SmartsString ==\n- \"[#6]1:&@[#6]:&@[#6&R2]2:&@[#6]:&@[#6&R2](:&@[#6]:&@[#6]):&@[#6&R2](:&@[#7]:&@[#6&R2]:&@2:&@[#6]:&@[#6]:&@1):&@[#6]\");\n+ \"[#6;r6,!R1]1:&@[#6;r6,!R1]:&@[#6]2:&@[#6;r6,!R1]:&@[#6](:&@[#6]:&@[#6]):&@[#6](:&@[#7;r6,!R1]:&@[#6]:&@2:&@[#6;r6,!R1]:&@[#6;r6,!R1]:&@1):&@[#6]\");\n }\n {\n MCSParameters p;\n@@ -2049,7 +2049,7 @@ void testGitHub2731_comment546175466() {\n TEST_ASSERT(res.NumBonds == 11);\n TEST_ASSERT(\n res.SmartsString ==\n- \"[#6]1:&@[#6]:&@[#6&R2]2:&@[#6]:&@[#6&R2]:&@[#6&R2]:&@[#7]:&@[#6&R2]:&@2:&@[#6]:&@[#6]:&@1\");\n+ \"[#6;r6,!R1]1:&@[#6;r6,!R1]:&@[#6]2:&@[#6;r6,!R1]:&@[#6]:&@[#6]:&@[#7;r6,!R1]:&@[#6]:&@2:&@[#6;r6,!R1]:&@[#6;r6,!R1]:&@1\");\n }\n }\n {\n@@ -2096,7 +2096,7 @@ void testGitHub2731_comment546175466() {\n TEST_ASSERT(res.NumBonds == 9);\n TEST_ASSERT(\n res.SmartsString ==\n- \"[#6&R2](-&@[#6]-&@[#6])(-&@[#6])-&@[#6](-&@[#6]-&@[#6]-&@[#6])-&@[#6&R2]-&@[#6]\");\n+ \"[#6](-&@[#6]-&@[#6])(-&@[#6])-&@[#6](-&@[#6]-&@[#6]-&@[#6])-&@[#6]-&@[#6]\");\n }\n }\n \n@@ -2134,9 +2134,9 @@ void testQueryMolVsSmarts() {\n TEST_ASSERT(SubstructMatch(*mols[0], *smartsMol, matchVectFromSmartsMol) ==\n 1);\n TEST_ASSERT(SubstructMatch(*mols[1], *res.QueryMol, matchVectFromQueryMol) ==\n- 2);\n+ 1);\n TEST_ASSERT(SubstructMatch(*mols[1], *smartsMol, matchVectFromSmartsMol) ==\n- 2);\n+ 1);\n \n BOOST_LOG(rdInfoLog) << \"============================================\"\n << std::endl;\n@@ -2327,10 +2327,9 @@ void testGitHub3458() {\n MCSResult res = findMCS(mols, &p);\n TEST_ASSERT(res.NumAtoms == 17);\n TEST_ASSERT(res.NumBonds == 18);\n- TEST_ASSERT(res.SmartsString ==\n- \"[#6&R]:&@[#6&R]:&@[#6&R]1:&@[#6&R](-&!@[#7&!R]-&!@[#6&R]2:&@\"\n- \"[#6&R]:&@[#6&R]:&@[#6&R]:&@[#6&R](:&@[#6&R]:&@2)-&!@[#35&!R]\"\n- \"):&@[#7&R]:&@[#6&R]:&@[#7&R]:&@[#6&R]:&@1:&@[#6&R]\");\n+ TEST_ASSERT(\n+ res.SmartsString ==\n+ \"[#6&R]:&@[#6&R]:&@[#6]1:&@[#6](-&!@[#7&!R]-&!@[#6]2:&@[#6]:&@[#6]:&@[#6]:&@[#6](:&@[#6]:&@2)-&!@[#35&!R]):&@[#7]:&@[#6]:&@[#7]:&@[#6]:&@1:&@[#6&R]\");\n }\n {\n MCSParameters p;\n@@ -2340,10 +2339,9 @@ void testGitHub3458() {\n MCSResult res = findMCS(mols, &p);\n TEST_ASSERT(res.NumAtoms == 15);\n TEST_ASSERT(res.NumBonds == 15);\n- TEST_ASSERT(res.SmartsString ==\n- \"[#6&R]:&@[#6&R]:&@[#6&R](:&@[#6&R]-&!@[#7&!R]-&!@[#6&R]1:&@[\"\n- \"#6&R]:&@[#6&R]:&@[#6&R]:&@[#6&R]:&@[#6&R]:&@1):&@[#6&R](:&@[\"\n- \"#7&R]:&@[#6&R]):&@[#6&R]\");\n+ TEST_ASSERT(\n+ res.SmartsString ==\n+ \"[#6&R]:&@[#6&R]:&@[#6&R](:&@[#6&R]-&!@[#7&!R]-&!@[#6]1:&@[#6]:&@[#6]:&@[#6]:&@[#6]:&@[#6]:&@1):&@[#6&R](:&@[#7&R]:&@[#6&R]):&@[#6&R]\");\n }\n }\n \n@@ -2386,9 +2384,9 @@ void testGitHub3693() {\n MCSResult res = findMCS(mols, &p);\n TEST_ASSERT(res.NumAtoms == 10);\n TEST_ASSERT(res.NumBonds == 11);\n- TEST_ASSERT(res.SmartsString ==\n- \"[#6&R]1:&@[#6&R]:&@[#6&R]:&@[#6&R]2:&@[#6&R](:&@[#6&R]:&@1):\"\n- \"&@[#6&R]:&@[#6&R]:&@[#6&R]:&@[#6&R]:&@2\");\n+ TEST_ASSERT(\n+ res.SmartsString ==\n+ \"[#6]1:&@[#6]:&@[#6]:&@[#6]2:&@[#6](:&@[#6]:&@1):&@[#6]:&@[#6]:&@[#6]:&@[#6]:&@2\");\n }\n {\n MCSParameters p;\n@@ -2397,9 +2395,9 @@ void testGitHub3693() {\n MCSResult res = findMCS(mols, &p);\n TEST_ASSERT(res.NumAtoms == 10);\n TEST_ASSERT(res.NumBonds == 11);\n- TEST_ASSERT(res.SmartsString ==\n- \"[#6&R]1:&@[#6&R]:&@[#6&R]:&@[#6&R]2:&@[#6&R](:&@[#6&R]:&@1):\"\n- \"&@[#6&R]:&@[#6&R]:&@[#6&R]:&@[#6&R]:&@2\");\n+ TEST_ASSERT(\n+ res.SmartsString ==\n+ \"[#6]1:&@[#6]:&@[#6]:&@[#6]2:&@[#6](:&@[#6]:&@1):&@[#6]:&@[#6]:&@[#6]:&@[#6]:&@2\");\n }\n {\n MCSParameters p;\n@@ -2409,9 +2407,9 @@ void testGitHub3693() {\n MCSResult res = findMCS(mols, &p);\n TEST_ASSERT(res.NumAtoms == 10);\n TEST_ASSERT(res.NumBonds == 11);\n- TEST_ASSERT(res.SmartsString ==\n- \"[#6&R]1:&@[#6&R]:&@[#6&R]:&@[#6&R]2:&@[#6&R](:&@[#6&R]:&@1):\"\n- \"&@[#6&R]:&@[#6&R]:&@[#6&R]:&@[#6&R]:&@2\");\n+ TEST_ASSERT(\n+ res.SmartsString ==\n+ \"[#6]1:&@[#6]:&@[#6]:&@[#6]2:&@[#6](:&@[#6]:&@1):&@[#6]:&@[#6]:&@[#6]:&@[#6]:&@2\");\n }\n }\n BOOST_LOG(rdInfoLog) << \"============================================\"\n@@ -2455,8 +2453,7 @@ void testAtomCompareCompleteRingsOnly() {\n MCSResult res = findMCS(mols, &p);\n TEST_ASSERT(res.NumAtoms == 5);\n TEST_ASSERT(res.NumBonds == 5);\n- TEST_ASSERT(res.SmartsString ==\n- \"[#6&R]1-&@[#6&R]-&@[#6&R]-&@[#6&R]-&@[#6&R]-&@1\");\n+ TEST_ASSERT(res.SmartsString == \"[#6]1-&@[#6]-&@[#6]-&@[#6]-&@[#6]-&@1\");\n }\n {\n MCSParameters p;\n@@ -2466,8 +2463,7 @@ void testAtomCompareCompleteRingsOnly() {\n MCSResult res = findMCS(mols, &p);\n TEST_ASSERT(res.NumAtoms == 5);\n TEST_ASSERT(res.NumBonds == 5);\n- TEST_ASSERT(res.SmartsString ==\n- \"[#6&R]1-&@[#6&R]-&@[#6&R]-&@[#6&R]-&@[#6&R]-&@1\");\n+ TEST_ASSERT(res.SmartsString == \"[#6]1-&@[#6]-&@[#6]-&@[#6]-&@[#6]-&@1\");\n }\n BOOST_LOG(rdInfoLog) << \"============================================\"\n << std::endl;\n@@ -2803,7 +2799,7 @@ void testGitHub5411() {\n ROMOL_SPTR molb(\n SmilesToMol(\"[NH3+]CCCCn1c(SCCc2c[nH]c3ccccc23)nnc1-c1ccc2ccccc2n1\"));\n std::string expectedSmarts(\n- \"[#7]-&!@[#6]-&!@[#6]-&!@[#6]-&!@[#6]-&!@[#7]1:&@[#6](-&!@[#16]-&!@[#6]-&!@[#6]-&!@[#6]2:&@[#6]:&@[#7]:&@[#6&R2]3:&@[#6&R2]:&@2:&@[#6]:&@[#6]:&@[#6]:&@[#6]:&@3):&@[#7]:&@[#7]:&@[#6]:&@1-&!@[#6]:&@[#6]:&@[#6]:&@[#6]:&@[#6&R2]:&@[#6]:&@[#6]:&@[#6]:&@[#6]\");\n+ \"[#7]-&!@[#6]-&!@[#6]-&!@[#6]-&!@[#6]-&!@[#7;r5,!R1]1:&@[#6;r5,!R1](-&!@[#16]-&!@[#6]-&!@[#6]-&!@[#6;r5,!R1]2:&@[#6;r5,!R1]:&@[#7;r5,!R1]:&@[#6]3:&@[#6]:&@2:&@[#6;r6,!R1]:&@[#6;r6,!R1]:&@[#6;r6,!R1]:&@[#6;r6,!R1]:&@3):&@[#7;r5,!R1]:&@[#7;r5,!R1]:&@[#6;r5,!R1]:&@1-&!@[#6]:&@[#6]:&@[#6]:&@[#6]:&@[#6]:&@[#6]:&@[#6]:&@[#6]:&@[#6]\");\n MCSParameters p;\n p.BondCompareParameters.MatchFusedRings = true;\n p.BondCompareParameters.MatchFusedRingsStrict = true;\n@@ -2901,7 +2897,7 @@ void testGitHub5457() {\n TEST_ASSERT(mcs.NumBonds == 23);\n TEST_ASSERT(\n mcs.SmartsString ==\n- \"[#6&!R](-&!@[#7,#6;!R])-&!@[#6&!R]-&!@[#6&!R]-&!@[#7&R]1:&@[#6&R](-&!@[#16&!R]-&!@[#6&!R]-&!@[#6&!R]-&!@[#6&R]2:&@[#6&R]:&@[#7&R]:&@[#6&R]3:&@[#6&R]:&@2:&@[#6&R]:&@[#6&R]:&@[#6&R]:&@[#6&R]:&@3):&@[#7&R]:&@[#7&R]:&@[#6&R]:&@1\");\n+ \"[#6&!R](-&!@[#7,#6;!R])-&!@[#6&!R]-&!@[#6&!R]-&!@[#7]1:&@[#6](-&!@[#16&!R]-&!@[#6&!R]-&!@[#6&!R]-&!@[#6]2:&@[#6]:&@[#7]:&@[#6]3:&@[#6]:&@2:&@[#6]:&@[#6]:&@[#6]:&@[#6]:&@3):&@[#7]:&@[#7]:&@[#6]:&@1\");\n TEST_ASSERT(!SubstructMatch(*mola, *mcs.QueryMol).empty());\n TEST_ASSERT(!SubstructMatch(*molb, *mcs.QueryMol).empty());\n ;\n@@ -2989,6 +2985,145 @@ void testGitHub6578() {\n }\n }\n \n+void testGitHub6773() {\n+ BOOST_LOG(rdInfoLog) << \"-------------------------------------\" << std::endl;\n+ BOOST_LOG(rdInfoLog) << \"test GitHub issue #6773\" << std::endl;\n+ {\n+ // these are 2- and 1-hydroxydecalin\n+ std::vector<ROMOL_SPTR> mols{\"OC1CCC2CCCCC2C1\"_smiles,\n+ \"OC1CCCC2CCCCC12\"_smiles};\n+ {\n+ MCSParameters p;\n+ p.BondCompareParameters.RingMatchesRingOnly = true;\n+ p.AtomCompareParameters.RingMatchesRingOnly = true;\n+ p.BondCompareParameters.MatchFusedRingsStrict = true;\n+ auto mcs = findMCS(mols, &p);\n+ TEST_ASSERT(mcs.NumAtoms == 11);\n+ TEST_ASSERT(mcs.NumBonds == 11);\n+ TEST_ASSERT(\n+ mcs.SmartsString ==\n+ \"[#8&!R]-&!@[#6;r6,!R1]1-&@[#6;r6,!R1]-&@[#6;r6,!R1]-&@[#6]-&@[#6](-&@[#6;r6,!R1]-&@1)-&@[#6&R]-&@[#6&R]-&@[#6&R]-&@[#6&R]\");\n+ }\n+ {\n+ MCSParameters p;\n+ p.BondCompareParameters.RingMatchesRingOnly = true;\n+ p.AtomCompareParameters.RingMatchesRingOnly = true;\n+ p.BondCompareParameters.CompleteRingsOnly = true;\n+ p.AtomCompareParameters.CompleteRingsOnly = true;\n+ p.BondCompareParameters.MatchFusedRingsStrict = true;\n+ auto mcs = findMCS(mols, &p);\n+ TEST_ASSERT(mcs.NumAtoms == 10);\n+ TEST_ASSERT(mcs.NumBonds == 11);\n+ TEST_ASSERT(\n+ mcs.SmartsString ==\n+ \"[#6;r6,!R1]1-&@[#6;r6,!R1]-&@[#6;r6,!R1]-&@[#6]2-&@[#6](-&@[#6;r6,!R1]-&@1)-&@[#6;r6,!R1]-&@[#6;r6,!R1]-&@[#6;r6,!R1]-&@[#6;r6,!R1]-&@2\");\n+ }\n+ // this is 1-hydroxyperhydroazulene\n+ mols.push_back(\"OC1CCC2CCCCCC12\"_smiles);\n+ {\n+ MCSParameters p;\n+ p.BondCompareParameters.RingMatchesRingOnly = true;\n+ p.AtomCompareParameters.RingMatchesRingOnly = true;\n+ p.BondCompareParameters.MatchFusedRingsStrict = true;\n+ auto mcs = findMCS(mols, &p);\n+ TEST_ASSERT(mcs.NumAtoms == 10);\n+ TEST_ASSERT(mcs.NumBonds == 9);\n+ TEST_ASSERT(\n+ mcs.SmartsString ==\n+ \"[#8&!R]-&!@[#6&R](-&@[#6&R]-&@[#6&R])-&@[#6&R]-&@[#6&R]-&@[#6&R]-&@[#6&R]-&@[#6&R]-&@[#6&R]\");\n+ }\n+ {\n+ MCSParameters p;\n+ p.BondCompareParameters.RingMatchesRingOnly = true;\n+ p.AtomCompareParameters.RingMatchesRingOnly = true;\n+ p.BondCompareParameters.CompleteRingsOnly = true;\n+ p.AtomCompareParameters.CompleteRingsOnly = true;\n+ p.BondCompareParameters.MatchFusedRingsStrict = true;\n+ auto mcs = findMCS(mols, &p);\n+ TEST_ASSERT(mcs.NumAtoms == 2);\n+ TEST_ASSERT(mcs.NumBonds == 1);\n+ TEST_ASSERT(mcs.SmartsString == \"[#8&!R]-&!@[#6&R]\");\n+ }\n+ mols = std::vector<ROMOL_SPTR>{\"C1CC2CCC3CC2C(C1)CCCCCC3\"_smiles, \"C1CC2CCC3CCCC4CCC(C1)C2C34\"_smiles};\n+ {\n+ MCSParameters p;\n+ p.BondCompareParameters.MatchFusedRingsStrict = true;\n+ auto mcs = findMCS(mols, &p);\n+ TEST_ASSERT(mcs.NumAtoms == 15);\n+ TEST_ASSERT(mcs.NumBonds == 16);\n+ TEST_ASSERT(\n+ mcs.SmartsString ==\n+ \"[#6;r6,!R1]1-&@[#6;r6,!R1]-&@[#6]2-&@[#6;r6,!R1]-&@[#6;r6,!R1]-&@[#6](-&@[#6]-&@[#6]-&@2-&@[#6](-&@[#6;r6,!R1]-&@1)-&@[#6]-&@[#6])-&@[#6]-&@[#6]-&@[#6]\");\n+ }\n+ {\n+ MCSParameters p;\n+ p.BondCompareParameters.MatchFusedRingsStrict = true;\n+ p.BondCompareParameters.CompleteRingsOnly = true;\n+ auto mcs = findMCS(mols, &p);\n+ TEST_ASSERT(mcs.NumAtoms == 10);\n+ TEST_ASSERT(mcs.NumBonds == 11);\n+ TEST_ASSERT(\n+ mcs.SmartsString ==\n+ \"[#6;r6,!R1]1-&@[#6;r6,!R1]-&@[#6]2-&@[#6;r6,!R1]-&@[#6;r6,!R1]-&@[#6]-&@[#6]-&@[#6]-&@2-&@[#6]-&@[#6;r6,!R1]-&@1\");\n+ p.AtomCompareParameters.CompleteRingsOnly = true;\n+ mcs = findMCS(mols, &p);\n+ TEST_ASSERT(mcs.NumAtoms == 10);\n+ TEST_ASSERT(mcs.NumBonds == 11);\n+ TEST_ASSERT(\n+ mcs.SmartsString ==\n+ \"[#6;r6,!R1]1-&@[#6;r6,!R1]-&@[#6]2-&@[#6;r6,!R1]-&@[#6;r6,!R1]-&@[#6]-&@[#6]-&@[#6]-&@2-&@[#6]-&@[#6;r6,!R1]-&@1\");\n+ }\n+ }\n+}\n+\n+void testBondCompareCompleteRingsOnly() {\n+ BOOST_LOG(rdInfoLog) << \"-------------------------------------\" << std::endl;\n+ BOOST_LOG(rdInfoLog) << \"test CompleteRingsOnly should work also on unsubstituted fused systems\" << std::endl;\n+ std::vector<ROMOL_SPTR> mols{\"C1CCCC2CCCCC12\"_smiles,\n+ \"C1CCC2CCCC12\"_smiles};\n+ MCSParameters p;\n+ p.BondCompareParameters.CompleteRingsOnly = true;\n+ auto mcs = findMCS(mols, &p);\n+ TEST_ASSERT(mcs.NumAtoms == 0);\n+ TEST_ASSERT(mcs.NumBonds == 0);\n+}\n+\n+void testAtomRingQueries() {\n+ BOOST_LOG(rdInfoLog) << \"-------------------------------------\" << std::endl;\n+ BOOST_LOG(rdInfoLog) << \"test atom ring queries to enforce strict ring fusion\"\n+ << std::endl;\n+ std::vector<ROMOL_SPTR> mols{\"NC(=O)CC1C2CC3CCCCC3C12\"_smiles,\n+ \"NC(=O)CC1CCCC2CCCCC12\"_smiles};\n+ MCSParameters p;\n+ p.BondCompareParameters.CompleteRingsOnly = true;\n+ auto mcs = findMCS(mols, &p);\n+ TEST_ASSERT(mcs.NumAtoms == 14);\n+ TEST_ASSERT(mcs.NumBonds == 14);\n+ TEST_ASSERT(\n+ mcs.SmartsString ==\n+ \"[#7]-&!@[#6](=&!@[#8])-&!@[#6]-&!@[#6]1-&@[#6]-&@[#6]-&@[#6]-&@[#6]-&@[#6]-&@[#6]-&@[#6]-&@[#6]-&@[#6]-&@1\");\n+ p.BondCompareParameters.MatchFusedRings = true;\n+ mcs = findMCS(mols, &p);\n+ TEST_ASSERT(mcs.NumAtoms == 10);\n+ TEST_ASSERT(mcs.NumBonds == 11);\n+ TEST_ASSERT(\n+ mcs.SmartsString ==\n+ \"[#6]1-&@[#6]-&@[#6]-&@[#6]-&@[#6]2-&@[#6]-&@1-&@[#6]-&@[#6]-&@[#6]-&@[#6]-&@2\");\n+ p.BondCompareParameters.MatchFusedRingsStrict = true;\n+ mcs = findMCS(mols, &p);\n+ TEST_ASSERT(mcs.NumAtoms == 6);\n+ TEST_ASSERT(mcs.NumBonds == 6);\n+ TEST_ASSERT(\n+ mcs.SmartsString ==\n+ \"[#6;r6,!R1]1-&@[#6;r6,!R1]-&@[#6;r6,!R1]-&@[#6;r6,!R1]-&@[#6]-&@[#6]-&@1\");\n+ ROMOL_SPTR smartsMol(SmartsToMol(mcs.SmartsString));\n+ std::vector<MatchVectType> matches;\n+ TEST_ASSERT(SubstructMatch(*mols[0], *mcs.QueryMol, matches) == 1);\n+ TEST_ASSERT(SubstructMatch(*mols[1], *mcs.QueryMol, matches) == 2);\n+ TEST_ASSERT(SubstructMatch(*mols[0], *smartsMol, matches) == 1);\n+ TEST_ASSERT(SubstructMatch(*mols[1], *smartsMol, matches) == 2);\n+}\n+\n //====================================================================================================\n //====================================================================================================\n \n@@ -3082,6 +3217,9 @@ int main(int argc, const char* argv[]) {\n testGitHub6082();\n testGitHub3965();\n testGitHub6578();\n+ testGitHub6773();\n+ testBondCompareCompleteRingsOnly();\n+ testAtomRingQueries();\n #endif\n \n unsigned long long t1 = nanoClock();\ndiff --git a/Code/GraphMol/MolDraw2D/catch_tests.cpp b/Code/GraphMol/MolDraw2D/catch_tests.cpp\nindex 21b77abe8b1..3291cab52ee 100644\n--- a/Code/GraphMol/MolDraw2D/catch_tests.cpp\n+++ b/Code/GraphMol/MolDraw2D/catch_tests.cpp\n@@ -307,17 +307,18 @@ static const std::map<std::string, std::hash_result_t> SVG_HASHES = {\n {\"github6504_2.svg\", 2871662880U},\n {\"github6569_1.svg\", 116573839U},\n {\"github6569_2.svg\", 2367779037U},\n- {\"lasso_highlights_1.svg\", 1259621911U},\n- {\"lasso_highlights_2.svg\", 39607542U},\n- {\"lasso_highlights_3.svg\", 2744227900U},\n- {\"lasso_highlights_4.svg\", 307369790U},\n- {\"lasso_highlights_5.svg\", 1103195299U},\n- {\"lasso_highlights_6.svg\", 3501858565U},\n- {\"lasso_highlights_7.svg\", 4002684466U},\n+ {\"lasso_highlights_1.svg\", 689837467U},\n+ {\"lasso_highlights_2.svg\", 348394942U},\n+ {\"lasso_highlights_3.svg\", 2174136207U},\n+ {\"lasso_highlights_4.svg\", 1265047504U},\n+ {\"lasso_highlights_5.svg\", 35778943U},\n+ {\"lasso_highlights_6.svg\", 1359376880U},\n+ {\"lasso_highlights_7.svg\", 773081917U},\n {\"testGithub6685_1.svg\", 1835717197U},\n {\"testGithub6685_2.svg\", 116380465U},\n {\"testGithub6685_3.svg\", 409385402U},\n- {\"testGithub6685_4.svg\", 1239628830U}};\n+ {\"testGithub6685_4.svg\", 1239628830U},\n+ {\"bad_lasso_1.svg\", 1183031575U}};\n \n // These PNG hashes aren't completely reliable due to floating point cruft,\n // but they can still reduce the number of drawings that need visual\n@@ -8692,8 +8693,9 @@ M END)RXN\";\n MolDraw2DSVG drawer(-1, -1);\n auto reactIter = rxn->beginReactantTemplates();\n REQUIRE_THROWS_AS(MolDraw2DUtils::setACS1996Options(\n- drawer.drawOptions(),\n- MolDraw2DUtils::meanBondLength(*(*reactIter)) * 0.7), ValueErrorException);\n+ drawer.drawOptions(),\n+ MolDraw2DUtils::meanBondLength(*(*reactIter)) * 0.7),\n+ ValueErrorException);\n }\n }\n \n@@ -9042,4 +9044,96 @@ M END\n checkImage(text);\n check_file_hash(baseName + \"4.svg\");\n }\n-}\n\\ No newline at end of file\n+}\n+\n+TEST_CASE(\"Github 6749 : various bad things in the lasso highlighting\") {\n+ std::string baseName = \"bad_lasso_\";\n+ auto mol =\n+ \"CCCS(=O)(=O)Nc1ccc(F)c(c1F)C(=O)c2c[nH]c3c2cc(cn3)c4ccc(Cl)cc4\"_smiles;\n+ REQUIRE(mol);\n+\n+ auto update_colour_map =\n+ [](const std::vector<int> &ats, DrawColour col,\n+ std::map<int, std::vector<DrawColour>> &ha_map) -> void {\n+ for (auto h : ats) {\n+ auto ex = ha_map.find(h);\n+ if (ex == ha_map.end()) {\n+ std::vector<DrawColour> cvec(1, col);\n+ ha_map.insert(make_pair(h, cvec));\n+ } else {\n+ if (ex->second.end() ==\n+ find(ex->second.begin(), ex->second.end(), col)) {\n+ ex->second.push_back(col);\n+ }\n+ }\n+ }\n+ };\n+ auto update_bond_map =\n+ [](const std::vector<int> &ats, DrawColour col, const ROMol &mol,\n+ std::map<int, std::vector<DrawColour>> &hb_map) -> void {\n+ for (auto at1 : ats) {\n+ for (auto at2 : ats) {\n+ if (at1 > at2) {\n+ auto b = mol.getBondBetweenAtoms(at1, at2);\n+ if (b) {\n+ auto ex = hb_map.find(b->getIdx());\n+ if (ex == hb_map.end()) {\n+ std::vector<DrawColour> cvec(1, col);\n+ hb_map.insert(make_pair(b->getIdx(), cvec));\n+ } else {\n+ ex->second.push_back(col);\n+ }\n+ }\n+ }\n+ }\n+ }\n+ };\n+ std::vector<DrawColour> colours = {\n+ DrawColour(1.0, 0.2, 1.0), DrawColour(0.2, 1.0, 1.0),\n+ DrawColour(0.8, 0.8, 0.2), DrawColour(0.4, 0.4, 0.2)};\n+ std::map<int, std::vector<DrawColour>> ha_map;\n+ std::map<int, std::vector<DrawColour>> hb_map;\n+ update_colour_map({6, 19, 25}, colours[0], ha_map);\n+ update_bond_map({6, 19, 25}, colours[0], *mol, hb_map);\n+\n+ update_colour_map({25, 4, 5, 11, 14, 16}, colours[1], ha_map);\n+ update_bond_map({25, 4, 5, 11, 14, 16}, colours[1], *mol, hb_map);\n+\n+ update_colour_map({19, 25, 17, 18, 20, 21, 7, 8, 9, 10, 12,\n+ 13, 22, 23, 24, 26, 27, 28, 29, 31, 32},\n+ colours[2], ha_map);\n+ update_bond_map({19, 25, 17, 18, 20, 21, 7, 8, 9, 10, 12,\n+ 13, 22, 23, 24, 26, 27, 28, 29, 31, 32},\n+ colours[2], *mol, hb_map);\n+ // If there are duplicate colours in the list, there was a bug where\n+ // arcs weren't removed correctly (Github 6749)\n+ ha_map[20].push_back(colours[2]);\n+ ha_map[21].push_back(colours[2]);\n+\n+ update_colour_map({7, 8, 9, 10, 12, 13, 26, 27, 28, 29, 31, 32}, colours[3],\n+ ha_map);\n+ update_bond_map({7, 8, 9, 10, 12, 13, 26, 27, 28, 29, 31, 32}, colours[3],\n+ *mol, hb_map);\n+\n+ std::map<int, double> h_rads;\n+ std::map<int, int> h_lw_mult;\n+ MolDraw2DSVG drawer(600, 400);\n+ drawer.drawOptions().multiColourHighlightStyle =\n+ RDKit::MultiColourHighlightStyle::LASSO;\n+ drawer.drawOptions().fillHighlights = false;\n+ drawer.drawMoleculeWithHighlights(*mol, \"Bad Lasso\", ha_map, hb_map, h_rads,\n+ h_lw_mult);\n+ drawer.finishDrawing();\n+ std::string text = drawer.getDrawingText();\n+ std::ofstream outs(baseName + \"1.svg\");\n+ outs << text;\n+ outs.flush();\n+ outs.close();\n+ std::regex atom20(\"<path class='atom-20'\");\n+ // there should be 3 matches for \"class='atom-20'\" - the buggy version gave 5\n+ std::ptrdiff_t const match_count(\n+ std::distance(std::sregex_iterator(text.begin(), text.end(), atom20),\n+ std::sregex_iterator()));\n+ REQUIRE(match_count == 3);\n+ check_file_hash(baseName + \"1.svg\");\n+}\ndiff --git a/rdkit/Chem/UnitTestDescriptors.py b/rdkit/Chem/UnitTestDescriptors.py\nindex f53cadfedea..c5a3ab8fb0a 100644\n--- a/rdkit/Chem/UnitTestDescriptors.py\n+++ b/rdkit/Chem/UnitTestDescriptors.py\n@@ -20,7 +20,7 @@\n import numpy as np\n \n from rdkit import Chem, RDConfig\n-from rdkit.Chem import AllChem, Descriptors, Lipinski, rdMolDescriptors\n+from rdkit.Chem import AllChem, Descriptors, Lipinski, rdMolDescriptors, Descriptors3D\n \n \n def load_tests(loader, tests, ignore):\n@@ -202,6 +202,18 @@ def testGetMolDescriptors(self):\n self.assertTrue('MolLogP' in descs)\n self.assertEqual(descs['NumHDonors'], 1)\n \n+ def testGet3DMolDescriptors(self):\n+ mol = Chem.MolFromSmiles('CCCO')\n+\n+ # check ValueError raised when no 3D coordinates supplied\n+ with self.assertRaises(ValueError):\n+ Descriptors3D.CalcMolDescriptors3D(mol)\n+\n+ # test function returns expected outputs\n+ AllChem.EmbedMolecule(mol, randomSeed=0xf00d)\n+ descs = Descriptors3D.CalcMolDescriptors3D(mol)\n+ self.assertTrue('InertialShapeFactor' in descs)\n+ self.assertEqual(descs['PMI1'], 20.954531335493417)\n \n if __name__ == '__main__':\n unittest.main()\n", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}226{"question_id": "MSB_rdkit_rdkit_pr6827", "question_type": "multi_swe_bench", "description": "Fixes #6816 (rdkit/rdkit#6827)", "content": {"org": "rdkit", "repo": "rdkit", "pr_number": 6827, "issue_title": "Fixes #6816", "issue_body": "This PR addressees #6816 by making sure that `reapplyMolBlockWedging()` also restores the double bond stereo depiction as originally specified in the molblock, either V2000 (`sss` bond stereo field) or V3000 (through the `CFG` field in the bond block).\r\nCurrently, this was happening only partially for the V3000 format, and not at all for the V2000 format.\r\nI added a unit test to make sure things works as expected; here's the gist that I used to set up the unit test:\r\n\r\n[Jupyter notebook used for `TEST_CASE(\"test GitHub6816\")` in `Code/GraphMol/Depictor/catch_tests.cpp`](https://gist.github.com/ptosco/aa51700b3fcafa6e0629a638e1f1cc0a)\r\n\r\nUPDATE: this PR also fixes #6893, which was found by @rvianello at a later stage.", "base_commit": "f797113a16cc0eb51d902c22c31b173486589200", "resolved_issues": [{"number": 6816, "title": "Double bonds should not be depicted as crossed bonds in the presence of wavy bonds", "body": "I have compared the ChemDraw depictions to RDKit depictions for a few cases where undefined geometric isomerism at a double bond is represented as:\r\n\r\n1. _Either_ single bonds on the stereochemistry-determining atoms (bond stereo 4) (Examples 1-3)\r\n2. _Cis or trans (either)_ double bond (bond stereo 3) (Example 4)\r\n\r\n```\r\nfrom rdkit import Chem\r\nfrom rdkit.Chem.Draw import IPythonConsole, rdMolDraw2D, rdDepictor\r\n```\r\n\r\n# Example 1\r\n### ChemDraw\r\n\r\n\r\n### RDKit\r\n```\r\nmol = Chem.MolFromMolBlock(\"\"\"double.mol\r\n ChemDraw10192311132D\r\n\r\n 4 3 0 0 0 0 0 0 0 0999 V2000\r\n -0.7145 0.2062 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\r\n 0.0000 0.6188 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\r\n 0.7145 0.2062 0.0000 F 0 0 0 0 0 0 0 0 0 0 0 0\r\n -0.7145 -0.6188 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0\r\n 1 2 2 0 0\r\n 2 3 1 4 0\r\n 1 4 1 4 0\r\nM END\r\n\"\"\")\r\nChem.ReapplyMolBlockWedging(mol)\r\nmol\r\n```\r\n\r\n\r\n# Example 2\r\n### ChemDraw\r\n\r\n\r\n### RDKit\r\n```\r\nmol = Chem.MolFromMolBlock(\"\"\"double-2.mol\r\n ChemDraw10192311332D\r\n\r\n 4 3 0 0 0 0 0 0 0 0999 V2000\r\n -0.3572 -0.2062 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\r\n 0.3572 0.2062 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\r\n 1.0717 0.6188 0.0000 F 0 0 0 0 0 0 0 0 0 0 0 0\r\n -1.0717 -0.6188 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0\r\n 1 2 2 0 0\r\n 2 3 1 4 0\r\n 1 4 1 4 0\r\nM END\r\n\"\"\")\r\nChem.ReapplyMolBlockWedging(mol)\r\nmol\r\n```\r\n\r\n\r\n# Example 3\r\n### ChemDraw\r\n\r\n\r\n### RDKit\r\n```\r\nmol = Chem.MolFromMolBlock(\"\"\"di-imine-2-2000.mol\r\n ChemDraw10192311522D\r\n\r\n 8 7 0 0 0 0 0 0 0 0999 V2000\r\n -0.9959 -1.0600 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\r\n -0.4125 -0.4767 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\r\n 0.4125 -0.4767 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\r\n 0.9959 -1.0600 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\r\n -0.7282 0.2855 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0\r\n -0.9971 1.0600 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\r\n 0.7282 0.2855 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0\r\n 0.9971 1.0270 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\r\n 1 2 1 0 0\r\n 2 3 1 0 0\r\n 3 4 1 0 0\r\n 2 5 2 0 0\r\n 5 6 1 4 0\r\n 3 7 2 0 0\r\n 7 8 1 4 0\r\nM END\r\n\"\"\")\r\nChem.ReapplyMolBlockWedging(mol)\r\nmol\r\n```\r\n\r\n\r\n# Example 4\r\n### ChemDraw\r\n\r\n\r\n### RDKit\r\n```\r\nmol = Chem.MolFromMolBlock(\"\"\"di-imine-cross-2000.mol\r\n ChemDraw10192311582D\r\n\r\n 8 7 0 0 0 0 0 0 0 0999 V2000\r\n -1.0099 -1.1129 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\r\n -0.5974 -0.3984 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\r\n 0.2276 -0.3984 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\r\n 0.6401 -1.1129 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\r\n -0.8109 0.3984 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0\r\n 0.6401 0.3160 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0\r\n -1.2234 1.1129 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\r\n 1.2234 0.8994 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\r\n 1 2 1 0 0\r\n 2 3 1 0 0\r\n 3 4 1 0 0\r\n 2 5 2 3 0\r\n 3 6 2 3 0\r\n 5 7 1 0 0\r\n 6 8 1 0 0\r\nM END\r\n\"\"\")\r\nChem.ReapplyMolBlockWedging(mol)\r\nmol\r\n```\r\n\r\n\r\nExample 4 looks correct to me.\r\nIn examples 1-3 I believe the crossed bond depicted by RDKit is redundant since the wavy bonds are sufficient to specificy undefined stereochemistry."}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/rdkit_m_rdkit:pr-6827", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/Code/GraphMol/Chirality.cpp b/Code/GraphMol/Chirality.cpp\nindex f748b413ca5..ba6b3fdae43 100644\n--- a/Code/GraphMol/Chirality.cpp\n+++ b/Code/GraphMol/Chirality.cpp\n@@ -3303,13 +3303,17 @@ void detectBondStereochemistry(ROMol &mol, int confId) {\n }\n }\n \n-void clearSingleBondDirFlags(ROMol &mol) {\n+void clearSingleBondDirFlags(ROMol &mol, bool retainCisTransInfo) {\n for (auto bond : mol.bonds()) {\n if (bond->getBondType() == Bond::SINGLE) {\n- if (bond->getBondDir() == Bond::UNKNOWN) {\n+ auto bondDir = bond->getBondDir();\n+ if (bondDir == Bond::UNKNOWN) {\n bond->setProp(common_properties::_UnknownStereo, 1);\n }\n- bond->setBondDir(Bond::NONE);\n+ if (!retainCisTransInfo ||\n+ (bondDir != Bond::ENDDOWNRIGHT && bondDir != Bond::ENDUPRIGHT)) {\n+ bond->setBondDir(Bond::NONE);\n+ }\n }\n }\n }\ndiff --git a/Code/GraphMol/MolOps.h b/Code/GraphMol/MolOps.h\nindex 47bf9bdb3b8..8d611d84e02 100644\n--- a/Code/GraphMol/MolOps.h\n+++ b/Code/GraphMol/MolOps.h\n@@ -975,8 +975,10 @@ RDKIT_GRAPHMOL_EXPORT void detectBondStereochemistry(ROMol &mol,\n RDKIT_GRAPHMOL_EXPORT void setDoubleBondNeighborDirections(\n ROMol &mol, const Conformer *conf = nullptr);\n //! removes directions from single bonds. Wiggly bonds will have the property\n-//! _UnknownStereo set on them\n-RDKIT_GRAPHMOL_EXPORT void clearSingleBondDirFlags(ROMol &mol);\n+//! _UnknownStereo set on them. If retainCisTransInfo is true,\n+//! ENDUPRIGHT and ENDDOWNRIGHT bond directions will not be cleared\n+RDKIT_GRAPHMOL_EXPORT void clearSingleBondDirFlags(\n+ ROMol &mol, bool retainCisTransInfo = false);\n \n //! Assign CIS/TRANS bond stereochemistry tags based on neighboring\n //! directions\ndiff --git a/Code/GraphMol/WedgeBonds.cpp b/Code/GraphMol/WedgeBonds.cpp\nindex 7ed32594fb3..a24a1e85eaf 100644\n--- a/Code/GraphMol/WedgeBonds.cpp\n+++ b/Code/GraphMol/WedgeBonds.cpp\n@@ -506,7 +506,7 @@ void wedgeBond(Bond *bond, unsigned int fromAtomIdx, const Conformer *conf) {\n }\n \n void reapplyMolBlockWedging(ROMol &mol) {\n- MolOps::clearSingleBondDirFlags(mol);\n+ MolOps::clearSingleBondDirFlags(mol, true);\n for (auto b : mol.bonds()) {\n int explicit_unknown_stereo = -1;\n if (b->getPropIfPresent<int>(common_properties::_UnknownStereo,\n@@ -522,25 +522,40 @@ void reapplyMolBlockWedging(ROMol &mol) {\n } else if (bond_dir == 6) {\n b->setBondDir(Bond::BEGINDASH);\n }\n+ if (b->getBondType() == Bond::DOUBLE) {\n+ if (bond_dir == 0 && b->getStereo() == Bond::STEREOANY) {\n+ b->setBondDir(Bond::NONE);\n+ b->setStereo(Bond::STEREONONE);\n+ } else if (bond_dir == 3) {\n+ b->setBondDir(Bond::EITHERDOUBLE);\n+ b->setStereo(Bond::STEREOANY);\n+ }\n+ }\n }\n int cfg = -1;\n- if (b->getPropIfPresent<int>(common_properties::_MolFileBondCfg, cfg)) {\n- switch (cfg) {\n- case 1:\n- b->setBondDir(Bond::BEGINWEDGE);\n- break;\n- case 2:\n- if (b->getBondType() == Bond::SINGLE) {\n- b->setBondDir(Bond::UNKNOWN);\n- } else if (b->getBondType() == Bond::DOUBLE) {\n- b->setBondDir(Bond::EITHERDOUBLE);\n- b->setStereo(Bond::STEREOANY);\n- }\n- break;\n- case 3:\n- b->setBondDir(Bond::BEGINDASH);\n- break;\n- }\n+ b->getPropIfPresent<int>(common_properties::_MolFileBondCfg, cfg);\n+ switch (cfg) {\n+ case 1:\n+ b->setBondDir(Bond::BEGINWEDGE);\n+ break;\n+ case 2:\n+ if (b->getBondType() == Bond::SINGLE) {\n+ b->setBondDir(Bond::UNKNOWN);\n+ } else if (b->getBondType() == Bond::DOUBLE) {\n+ b->setBondDir(Bond::EITHERDOUBLE);\n+ b->setStereo(Bond::STEREOANY);\n+ }\n+ break;\n+ case 3:\n+ b->setBondDir(Bond::BEGINDASH);\n+ break;\n+ case 0:\n+ case -1:\n+ if (bond_dir == -1 && b->getBondType() == Bond::DOUBLE &&\n+ b->getStereo() == Bond::STEREOANY) {\n+ b->setBondDir(Bond::NONE);\n+ b->setStereo(Bond::STEREONONE);\n+ }\n }\n }\n }\n"}, "test": {"test_patch": "diff --git a/Code/GraphMol/Depictor/catch_tests.cpp b/Code/GraphMol/Depictor/catch_tests.cpp\nindex a4dbf1ccb22..eb371851c17 100644\n--- a/Code/GraphMol/Depictor/catch_tests.cpp\n+++ b/Code/GraphMol/Depictor/catch_tests.cpp\n@@ -1179,3 +1179,878 @@ M END\n }\n }\n }\n+\n+TEST_CASE(\"test GitHub6816\") {\n+ SECTION(\"double-2000\") {\n+ auto mol = R\"CTAB(double-2000.mol\n+ ChemDraw10192311132D\n+\n+ 4 3 0 0 0 0 0 0 0 0999 V2000\n+ -0.7145 0.2062 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\n+ 0.0000 0.6188 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\n+ 0.7145 0.2062 0.0000 F 0 0 0 0 0 0 0 0 0 0 0 0\n+ -0.7145 -0.6188 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0\n+ 1 2 2 0 0\n+ 2 3 1 4 0\n+ 1 4 1 4 0\n+M END\n+)CTAB\"_ctab;\n+ REQUIRE(mol);\n+ CHECK(mol->getBondWithIdx(0)->getStereo() == Bond::STEREOANY);\n+ CHECK(mol->getBondWithIdx(0)->getBondDir() == Bond::NONE);\n+ CHECK(!mol->getBondWithIdx(0)->hasProp(\n+ common_properties::_MolFileBondStereo));\n+ CHECK(!mol->getBondWithIdx(0)->hasProp(common_properties::_MolFileBondCfg));\n+ CHECK(!mol->getBondWithIdx(0)->hasProp(common_properties::_UnknownStereo));\n+\n+ CHECK(mol->getBondWithIdx(1)->getStereo() == Bond::STEREONONE);\n+ CHECK(mol->getBondWithIdx(1)->getBondDir() == Bond::NONE);\n+ CHECK(mol->getBondWithIdx(1)->getProp<int>(\n+ common_properties::_MolFileBondStereo) == 4);\n+ CHECK(!mol->getBondWithIdx(1)->hasProp(common_properties::_MolFileBondCfg));\n+ CHECK(mol->getBondWithIdx(1)->getProp<int>(\n+ common_properties::_UnknownStereo));\n+\n+ CHECK(mol->getBondWithIdx(2)->getStereo() == Bond::STEREONONE);\n+ CHECK(mol->getBondWithIdx(2)->getBondDir() == Bond::NONE);\n+ CHECK(mol->getBondWithIdx(2)->getProp<int>(\n+ common_properties::_MolFileBondStereo) == 4);\n+ CHECK(!mol->getBondWithIdx(2)->hasProp(common_properties::_MolFileBondCfg));\n+ CHECK(mol->getBondWithIdx(2)->getProp<int>(\n+ common_properties::_UnknownStereo));\n+\n+ Chirality::reapplyMolBlockWedging(*mol);\n+ CHECK(mol->getBondWithIdx(0)->getStereo() == Bond::STEREONONE);\n+ CHECK(mol->getBondWithIdx(0)->getBondDir() == Bond::NONE);\n+\n+ CHECK(mol->getBondWithIdx(1)->getStereo() == Bond::STEREONONE);\n+ CHECK(mol->getBondWithIdx(1)->getBondDir() == Bond::UNKNOWN);\n+\n+ CHECK(mol->getBondWithIdx(2)->getStereo() == Bond::STEREONONE);\n+ CHECK(mol->getBondWithIdx(2)->getBondDir() == Bond::UNKNOWN);\n+ }\n+ SECTION(\"double-3000\") {\n+ auto mol = R\"CTAB(double-3000.mol\n+ ChemDraw10232310312D\n+\n+ 0 0 0 0 0 0 V3000\n+M V30 BEGIN CTAB\n+M V30 COUNTS 4 3 0 0 0\n+M V30 BEGIN ATOM\n+M V30 1 C -0.714435 0.206182 0.000000 0\n+M V30 2 C 0.000000 0.618744 0.000000 0\n+M V30 3 F 0.714435 0.206182 0.000000 0\n+M V30 4 O -0.714435 -0.618744 0.000000 0\n+M V30 END ATOM\n+M V30 BEGIN BOND\n+M V30 1 2 1 2\n+M V30 2 1 2 3 CFG=2\n+M V30 3 1 1 4 CFG=2\n+M V30 END BOND\n+M V30 END CTAB\n+M END\n+)CTAB\"_ctab;\n+ REQUIRE(mol);\n+ CHECK(mol->getBondWithIdx(0)->getStereo() == Bond::STEREOANY);\n+ CHECK(mol->getBondWithIdx(0)->getBondDir() == Bond::NONE);\n+ CHECK(!mol->getBondWithIdx(0)->hasProp(\n+ common_properties::_MolFileBondStereo));\n+ CHECK(!mol->getBondWithIdx(0)->hasProp(common_properties::_MolFileBondCfg));\n+ CHECK(!mol->getBondWithIdx(0)->hasProp(common_properties::_UnknownStereo));\n+\n+ CHECK(mol->getBondWithIdx(1)->getStereo() == Bond::STEREONONE);\n+ CHECK(mol->getBondWithIdx(1)->getBondDir() == Bond::NONE);\n+ CHECK(!mol->getBondWithIdx(1)->hasProp(\n+ common_properties::_MolFileBondStereo));\n+ CHECK(mol->getBondWithIdx(1)->getProp<int>(\n+ common_properties::_MolFileBondCfg) == 2);\n+ CHECK(mol->getBondWithIdx(1)->getProp<int>(\n+ common_properties::_UnknownStereo));\n+\n+ CHECK(mol->getBondWithIdx(2)->getStereo() == Bond::STEREONONE);\n+ CHECK(mol->getBondWithIdx(2)->getBondDir() == Bond::NONE);\n+ CHECK(!mol->getBondWithIdx(2)->hasProp(\n+ common_properties::_MolFileBondStereo));\n+ CHECK(mol->getBondWithIdx(2)->getProp<int>(\n+ common_properties::_MolFileBondCfg) == 2);\n+ CHECK(mol->getBondWithIdx(2)->getProp<int>(\n+ common_properties::_UnknownStereo));\n+\n+ Chirality::reapplyMolBlockWedging(*mol);\n+ CHECK(mol->getBondWithIdx(0)->getStereo() == Bond::STEREONONE);\n+ CHECK(mol->getBondWithIdx(0)->getBondDir() == Bond::NONE);\n+\n+ CHECK(mol->getBondWithIdx(1)->getStereo() == Bond::STEREONONE);\n+ CHECK(mol->getBondWithIdx(1)->getBondDir() == Bond::UNKNOWN);\n+\n+ CHECK(mol->getBondWithIdx(2)->getStereo() == Bond::STEREONONE);\n+ CHECK(mol->getBondWithIdx(2)->getBondDir() == Bond::UNKNOWN);\n+ }\n+ SECTION(\"double-explicit-crossed-2000\") {\n+ auto mol = R\"CTAB(double-explicit-crossed-2000.mol\n+ ChemDraw10232310432D\n+\n+ 4 3 0 0 0 0 0 0 0 0999 V2000\n+ -0.7144 0.2062 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\n+ 0.0000 0.6187 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\n+ 0.7144 0.2062 0.0000 F 0 0 0 0 0 0 0 0 0 0 0 0\n+ -0.7144 -0.6187 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0\n+ 1 2 2 3 \n+ 2 3 1 4 \n+ 1 4 1 4 \n+M END\n+)CTAB\"_ctab;\n+ REQUIRE(mol);\n+ CHECK(mol->getBondWithIdx(0)->getStereo() == Bond::STEREOANY);\n+ CHECK(mol->getBondWithIdx(0)->getBondDir() == Bond::NONE);\n+ CHECK(mol->getBondWithIdx(0)->getProp<int>(\n+ common_properties::_MolFileBondStereo) == 3);\n+ CHECK(!mol->getBondWithIdx(0)->hasProp(common_properties::_MolFileBondCfg));\n+ CHECK(!mol->getBondWithIdx(0)->hasProp(common_properties::_UnknownStereo));\n+\n+ CHECK(mol->getBondWithIdx(1)->getStereo() == Bond::STEREONONE);\n+ CHECK(mol->getBondWithIdx(1)->getBondDir() == Bond::NONE);\n+ CHECK(mol->getBondWithIdx(1)->getProp<int>(\n+ common_properties::_MolFileBondStereo) == 4);\n+ CHECK(!mol->getBondWithIdx(1)->hasProp(common_properties::_MolFileBondCfg));\n+ CHECK(mol->getBondWithIdx(1)->getProp<int>(\n+ common_properties::_UnknownStereo));\n+\n+ CHECK(mol->getBondWithIdx(2)->getStereo() == Bond::STEREONONE);\n+ CHECK(mol->getBondWithIdx(2)->getBondDir() == Bond::NONE);\n+ CHECK(mol->getBondWithIdx(2)->getProp<int>(\n+ common_properties::_MolFileBondStereo) == 4);\n+ CHECK(!mol->getBondWithIdx(2)->hasProp(common_properties::_MolFileBondCfg));\n+ CHECK(mol->getBondWithIdx(2)->getProp<int>(\n+ common_properties::_UnknownStereo));\n+\n+ Chirality::reapplyMolBlockWedging(*mol);\n+ CHECK(mol->getBondWithIdx(0)->getStereo() == Bond::STEREOANY);\n+ CHECK(mol->getBondWithIdx(0)->getBondDir() == Bond::EITHERDOUBLE);\n+\n+ CHECK(mol->getBondWithIdx(1)->getStereo() == Bond::STEREONONE);\n+ CHECK(mol->getBondWithIdx(1)->getBondDir() == Bond::UNKNOWN);\n+\n+ CHECK(mol->getBondWithIdx(2)->getStereo() == Bond::STEREONONE);\n+ CHECK(mol->getBondWithIdx(2)->getBondDir() == Bond::UNKNOWN);\n+ }\n+ SECTION(\"double-explicit-crossed-3000\") {\n+ auto mol = R\"CTAB(double-explicit-crossed-3000.mol\n+ ChemDraw10232310422D\n+\n+ 0 0 0 0 0 0 V3000\n+M V30 BEGIN CTAB\n+M V30 COUNTS 4 3 0 0 0\n+M V30 BEGIN ATOM\n+M V30 1 C -0.714435 0.206182 0.000000 0\n+M V30 2 C 0.000000 0.618744 0.000000 0\n+M V30 3 F 0.714435 0.206182 0.000000 0\n+M V30 4 O -0.714435 -0.618744 0.000000 0\n+M V30 END ATOM\n+M V30 BEGIN BOND\n+M V30 1 2 1 2 CFG=2\n+M V30 2 1 2 3 CFG=2\n+M V30 3 1 1 4 CFG=2\n+M V30 END BOND\n+M V30 END CTAB\n+M END\n+)CTAB\"_ctab;\n+ REQUIRE(mol);\n+ CHECK(mol->getBondWithIdx(0)->getStereo() == Bond::STEREOANY);\n+ CHECK(mol->getBondWithIdx(0)->getBondDir() == Bond::NONE);\n+ CHECK(!mol->getBondWithIdx(0)->hasProp(\n+ common_properties::_MolFileBondStereo));\n+ CHECK(mol->getBondWithIdx(0)->getProp<int>(\n+ common_properties::_MolFileBondCfg) == 2);\n+ CHECK(!mol->getBondWithIdx(0)->hasProp(common_properties::_UnknownStereo));\n+\n+ CHECK(mol->getBondWithIdx(1)->getStereo() == Bond::STEREONONE);\n+ CHECK(mol->getBondWithIdx(1)->getBondDir() == Bond::NONE);\n+ CHECK(!mol->getBondWithIdx(1)->hasProp(\n+ common_properties::_MolFileBondStereo));\n+ CHECK(mol->getBondWithIdx(1)->getProp<int>(\n+ common_properties::_MolFileBondCfg) == 2);\n+ CHECK(mol->getBondWithIdx(1)->getProp<int>(\n+ common_properties::_UnknownStereo));\n+\n+ CHECK(mol->getBondWithIdx(2)->getStereo() == Bond::STEREONONE);\n+ CHECK(mol->getBondWithIdx(2)->getBondDir() == Bond::NONE);\n+ CHECK(!mol->getBondWithIdx(2)->hasProp(\n+ common_properties::_MolFileBondStereo));\n+ CHECK(mol->getBondWithIdx(2)->getProp<int>(\n+ common_properties::_MolFileBondCfg) == 2);\n+ CHECK(mol->getBondWithIdx(2)->getProp<int>(\n+ common_properties::_UnknownStereo));\n+\n+ Chirality::reapplyMolBlockWedging(*mol);\n+ CHECK(mol->getBondWithIdx(0)->getStereo() == Bond::STEREOANY);\n+ CHECK(mol->getBondWithIdx(0)->getBondDir() == Bond::EITHERDOUBLE);\n+\n+ CHECK(mol->getBondWithIdx(1)->getStereo() == Bond::STEREONONE);\n+ CHECK(mol->getBondWithIdx(1)->getBondDir() == Bond::UNKNOWN);\n+\n+ CHECK(mol->getBondWithIdx(2)->getStereo() == Bond::STEREONONE);\n+ CHECK(mol->getBondWithIdx(2)->getBondDir() == Bond::UNKNOWN);\n+ }\n+ SECTION(\"double-2-2000\") {\n+ auto mol = R\"CTAB(double-2-2000.mol\n+ ChemDraw10192311332D\n+\n+ 4 3 0 0 0 0 0 0 0 0999 V2000\n+ -0.3572 -0.2062 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\n+ 0.3572 0.2062 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\n+ 1.0717 0.6188 0.0000 F 0 0 0 0 0 0 0 0 0 0 0 0\n+ -1.0717 -0.6188 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0\n+ 1 2 2 0 0\n+ 2 3 1 4 0\n+ 1 4 1 4 0\n+M END\n+)CTAB\"_ctab;\n+ REQUIRE(mol);\n+ CHECK(mol->getBondWithIdx(0)->getStereo() == Bond::STEREOANY);\n+ CHECK(mol->getBondWithIdx(0)->getBondDir() == Bond::NONE);\n+ CHECK(!mol->getBondWithIdx(0)->hasProp(\n+ common_properties::_MolFileBondStereo));\n+ CHECK(!mol->getBondWithIdx(0)->hasProp(common_properties::_MolFileBondCfg));\n+ CHECK(!mol->getBondWithIdx(0)->hasProp(common_properties::_UnknownStereo));\n+\n+ CHECK(mol->getBondWithIdx(1)->getStereo() == Bond::STEREONONE);\n+ CHECK(mol->getBondWithIdx(1)->getBondDir() == Bond::NONE);\n+ CHECK(mol->getBondWithIdx(1)->getProp<int>(\n+ common_properties::_MolFileBondStereo) == 4);\n+ CHECK(!mol->getBondWithIdx(1)->hasProp(common_properties::_MolFileBondCfg));\n+ CHECK(mol->getBondWithIdx(1)->getProp<int>(\n+ common_properties::_UnknownStereo));\n+\n+ CHECK(mol->getBondWithIdx(2)->getStereo() == Bond::STEREONONE);\n+ CHECK(mol->getBondWithIdx(2)->getBondDir() == Bond::NONE);\n+ CHECK(mol->getBondWithIdx(2)->getProp<int>(\n+ common_properties::_MolFileBondStereo) == 4);\n+ CHECK(!mol->getBondWithIdx(2)->hasProp(common_properties::_MolFileBondCfg));\n+ CHECK(mol->getBondWithIdx(2)->getProp<int>(\n+ common_properties::_UnknownStereo));\n+\n+ Chirality::reapplyMolBlockWedging(*mol);\n+ CHECK(mol->getBondWithIdx(0)->getStereo() == Bond::STEREONONE);\n+ CHECK(mol->getBondWithIdx(0)->getBondDir() == Bond::NONE);\n+\n+ CHECK(mol->getBondWithIdx(1)->getStereo() == Bond::STEREONONE);\n+ CHECK(mol->getBondWithIdx(1)->getBondDir() == Bond::UNKNOWN);\n+\n+ CHECK(mol->getBondWithIdx(2)->getStereo() == Bond::STEREONONE);\n+ CHECK(mol->getBondWithIdx(2)->getBondDir() == Bond::UNKNOWN);\n+ }\n+ SECTION(\"double-2-3000\") {\n+ auto mol = R\"CTAB(double-2-3000.mol\n+ ChemDraw10232310312D\n+\n+ 0 0 0 0 0 0 V3000\n+M V30 BEGIN CTAB\n+M V30 COUNTS 4 3 0 0 0\n+M V30 BEGIN ATOM\n+M V30 1 C -0.357168 -0.206181 0.000000 0\n+M V30 2 C 0.357167 0.206182 0.000000 0\n+M V30 3 F 1.071603 0.618744 0.000000 0\n+M V30 4 O -1.071603 -0.618744 0.000000 0\n+M V30 END ATOM\n+M V30 BEGIN BOND\n+M V30 1 2 1 2\n+M V30 2 1 2 3 CFG=2\n+M V30 3 1 1 4 CFG=2\n+M V30 END BOND\n+M V30 END CTAB\n+M END\n+)CTAB\"_ctab;\n+ REQUIRE(mol);\n+ CHECK(mol->getBondWithIdx(0)->getStereo() == Bond::STEREOANY);\n+ CHECK(mol->getBondWithIdx(0)->getBondDir() == Bond::NONE);\n+ CHECK(!mol->getBondWithIdx(0)->hasProp(\n+ common_properties::_MolFileBondStereo));\n+ CHECK(!mol->getBondWithIdx(0)->hasProp(common_properties::_MolFileBondCfg));\n+ CHECK(!mol->getBondWithIdx(0)->hasProp(common_properties::_UnknownStereo));\n+\n+ CHECK(mol->getBondWithIdx(1)->getStereo() == Bond::STEREONONE);\n+ CHECK(mol->getBondWithIdx(1)->getBondDir() == Bond::NONE);\n+ CHECK(!mol->getBondWithIdx(1)->hasProp(\n+ common_properties::_MolFileBondStereo));\n+ CHECK(mol->getBondWithIdx(1)->getProp<int>(\n+ common_properties::_MolFileBondCfg) == 2);\n+ CHECK(mol->getBondWithIdx(1)->getProp<int>(\n+ common_properties::_UnknownStereo));\n+\n+ CHECK(mol->getBondWithIdx(2)->getStereo() == Bond::STEREONONE);\n+ CHECK(mol->getBondWithIdx(2)->getBondDir() == Bond::NONE);\n+ CHECK(!mol->getBondWithIdx(2)->hasProp(\n+ common_properties::_MolFileBondStereo));\n+ CHECK(mol->getBondWithIdx(2)->getProp<int>(\n+ common_properties::_MolFileBondCfg) == 2);\n+ CHECK(mol->getBondWithIdx(2)->getProp<int>(\n+ common_properties::_UnknownStereo));\n+\n+ Chirality::reapplyMolBlockWedging(*mol);\n+ CHECK(mol->getBondWithIdx(0)->getStereo() == Bond::STEREONONE);\n+ CHECK(mol->getBondWithIdx(0)->getBondDir() == Bond::NONE);\n+\n+ CHECK(mol->getBondWithIdx(1)->getStereo() == Bond::STEREONONE);\n+ CHECK(mol->getBondWithIdx(1)->getBondDir() == Bond::UNKNOWN);\n+\n+ CHECK(mol->getBondWithIdx(2)->getStereo() == Bond::STEREONONE);\n+ CHECK(mol->getBondWithIdx(2)->getBondDir() == Bond::UNKNOWN);\n+ }\n+ SECTION(\"double-2-explicit-crossed-2000\") {\n+ auto mol = R\"CTAB(double-2-explicit-crossed-2000.mol\n+ ChemDraw10232310432D\n+\n+ 4 3 0 0 0 0 0 0 0 0999 V2000\n+ -0.3572 -0.2062 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\n+ 0.3572 0.2062 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\n+ 1.0716 0.6187 0.0000 F 0 0 0 0 0 0 0 0 0 0 0 0\n+ -1.0716 -0.6187 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0\n+ 1 2 2 3 \n+ 2 3 1 4 \n+ 1 4 1 4 \n+M END\n+)CTAB\"_ctab;\n+ REQUIRE(mol);\n+ CHECK(mol->getBondWithIdx(0)->getStereo() == Bond::STEREOANY);\n+ CHECK(mol->getBondWithIdx(0)->getBondDir() == Bond::NONE);\n+ CHECK(mol->getBondWithIdx(0)->getProp<int>(\n+ common_properties::_MolFileBondStereo) == 3);\n+ CHECK(!mol->getBondWithIdx(0)->hasProp(common_properties::_MolFileBondCfg));\n+ CHECK(!mol->getBondWithIdx(0)->hasProp(common_properties::_UnknownStereo));\n+\n+ CHECK(mol->getBondWithIdx(1)->getStereo() == Bond::STEREONONE);\n+ CHECK(mol->getBondWithIdx(1)->getBondDir() == Bond::NONE);\n+ CHECK(mol->getBondWithIdx(1)->getProp<int>(\n+ common_properties::_MolFileBondStereo) == 4);\n+ CHECK(!mol->getBondWithIdx(1)->hasProp(common_properties::_MolFileBondCfg));\n+ CHECK(mol->getBondWithIdx(1)->getProp<int>(\n+ common_properties::_UnknownStereo));\n+\n+ CHECK(mol->getBondWithIdx(2)->getStereo() == Bond::STEREONONE);\n+ CHECK(mol->getBondWithIdx(2)->getBondDir() == Bond::NONE);\n+ CHECK(mol->getBondWithIdx(2)->getProp<int>(\n+ common_properties::_MolFileBondStereo) == 4);\n+ CHECK(!mol->getBondWithIdx(2)->hasProp(common_properties::_MolFileBondCfg));\n+ CHECK(mol->getBondWithIdx(2)->getProp<int>(\n+ common_properties::_UnknownStereo));\n+\n+ Chirality::reapplyMolBlockWedging(*mol);\n+ CHECK(mol->getBondWithIdx(0)->getStereo() == Bond::STEREOANY);\n+ CHECK(mol->getBondWithIdx(0)->getBondDir() == Bond::EITHERDOUBLE);\n+\n+ CHECK(mol->getBondWithIdx(1)->getStereo() == Bond::STEREONONE);\n+ CHECK(mol->getBondWithIdx(1)->getBondDir() == Bond::UNKNOWN);\n+\n+ CHECK(mol->getBondWithIdx(2)->getStereo() == Bond::STEREONONE);\n+ CHECK(mol->getBondWithIdx(2)->getBondDir() == Bond::UNKNOWN);\n+ }\n+ SECTION(\"double-2-explicit-crossed-3000\") {\n+ auto mol = R\"CTAB(double-2-explicit-crossed-3000.mol\n+ ChemDraw10232310422D\n+\n+ 0 0 0 0 0 0 V3000\n+M V30 BEGIN CTAB\n+M V30 COUNTS 4 3 0 0 0\n+M V30 BEGIN ATOM\n+M V30 1 C -0.357168 -0.206181 0.000000 0\n+M V30 2 C 0.357167 0.206182 0.000000 0\n+M V30 3 F 1.071603 0.618744 0.000000 0\n+M V30 4 O -1.071603 -0.618744 0.000000 0\n+M V30 END ATOM\n+M V30 BEGIN BOND\n+M V30 1 2 1 2 CFG=2\n+M V30 2 1 2 3 CFG=2\n+M V30 3 1 1 4 CFG=2\n+M V30 END BOND\n+M V30 END CTAB\n+M END\n+)CTAB\"_ctab;\n+ REQUIRE(mol);\n+ CHECK(mol->getBondWithIdx(0)->getStereo() == Bond::STEREOANY);\n+ CHECK(mol->getBondWithIdx(0)->getBondDir() == Bond::NONE);\n+ CHECK(!mol->getBondWithIdx(0)->hasProp(\n+ common_properties::_MolFileBondStereo));\n+ CHECK(mol->getBondWithIdx(0)->getProp<int>(\n+ common_properties::_MolFileBondCfg) == 2);\n+ CHECK(!mol->getBondWithIdx(0)->hasProp(common_properties::_UnknownStereo));\n+\n+ CHECK(mol->getBondWithIdx(1)->getStereo() == Bond::STEREONONE);\n+ CHECK(mol->getBondWithIdx(1)->getBondDir() == Bond::NONE);\n+ CHECK(!mol->getBondWithIdx(1)->hasProp(\n+ common_properties::_MolFileBondStereo));\n+ CHECK(mol->getBondWithIdx(1)->getProp<int>(\n+ common_properties::_MolFileBondCfg) == 2);\n+ CHECK(mol->getBondWithIdx(1)->getProp<int>(\n+ common_properties::_UnknownStereo));\n+\n+ CHECK(mol->getBondWithIdx(2)->getStereo() == Bond::STEREONONE);\n+ CHECK(mol->getBondWithIdx(2)->getBondDir() == Bond::NONE);\n+ CHECK(!mol->getBondWithIdx(2)->hasProp(\n+ common_properties::_MolFileBondStereo));\n+ CHECK(mol->getBondWithIdx(2)->getProp<int>(\n+ common_properties::_MolFileBondCfg) == 2);\n+ CHECK(mol->getBondWithIdx(2)->getProp<int>(\n+ common_properties::_UnknownStereo));\n+\n+ Chirality::reapplyMolBlockWedging(*mol);\n+ CHECK(mol->getBondWithIdx(0)->getStereo() == Bond::STEREOANY);\n+ CHECK(mol->getBondWithIdx(0)->getBondDir() == Bond::EITHERDOUBLE);\n+\n+ CHECK(mol->getBondWithIdx(1)->getStereo() == Bond::STEREONONE);\n+ CHECK(mol->getBondWithIdx(1)->getBondDir() == Bond::UNKNOWN);\n+\n+ CHECK(mol->getBondWithIdx(2)->getStereo() == Bond::STEREONONE);\n+ CHECK(mol->getBondWithIdx(2)->getBondDir() == Bond::UNKNOWN);\n+ }\n+ SECTION(\"di-imine-2-2000\") {\n+ auto mol = R\"CTAB(di-imine-2-2000.mol\n+ ChemDraw10192311522D\n+\n+ 8 7 0 0 0 0 0 0 0 0999 V2000\n+ -0.9959 -1.0600 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\n+ -0.4125 -0.4767 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\n+ 0.4125 -0.4767 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\n+ 0.9959 -1.0600 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\n+ -0.7282 0.2855 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0\n+ -0.9971 1.0600 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\n+ 0.7282 0.2855 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0\n+ 0.9971 1.0270 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\n+ 1 2 1 0 0\n+ 2 3 1 0 0\n+ 3 4 1 0 0\n+ 2 5 2 0 0\n+ 5 6 1 4 0\n+ 3 7 2 0 0\n+ 7 8 1 4 0\n+M END\n+)CTAB\"_ctab;\n+ REQUIRE(mol);\n+ CHECK(mol->getBondWithIdx(3)->getStereo() == Bond::STEREOANY);\n+ CHECK(mol->getBondWithIdx(3)->getBondDir() == Bond::NONE);\n+ CHECK(!mol->getBondWithIdx(3)->hasProp(\n+ common_properties::_MolFileBondStereo));\n+ CHECK(!mol->getBondWithIdx(3)->hasProp(common_properties::_MolFileBondCfg));\n+ CHECK(!mol->getBondWithIdx(3)->hasProp(common_properties::_UnknownStereo));\n+\n+ CHECK(mol->getBondWithIdx(4)->getStereo() == Bond::STEREONONE);\n+ CHECK(mol->getBondWithIdx(4)->getBondDir() == Bond::NONE);\n+ CHECK(mol->getBondWithIdx(4)->getProp<int>(\n+ common_properties::_MolFileBondStereo) == 4);\n+ CHECK(!mol->getBondWithIdx(4)->hasProp(common_properties::_MolFileBondCfg));\n+ CHECK(mol->getBondWithIdx(4)->getProp<int>(\n+ common_properties::_UnknownStereo));\n+\n+ CHECK(mol->getBondWithIdx(5)->getStereo() == Bond::STEREOANY);\n+ CHECK(mol->getBondWithIdx(5)->getBondDir() == Bond::NONE);\n+ CHECK(!mol->getBondWithIdx(5)->hasProp(\n+ common_properties::_MolFileBondStereo));\n+ CHECK(!mol->getBondWithIdx(5)->hasProp(common_properties::_MolFileBondCfg));\n+ CHECK(!mol->getBondWithIdx(5)->hasProp(common_properties::_UnknownStereo));\n+\n+ CHECK(mol->getBondWithIdx(6)->getStereo() == Bond::STEREONONE);\n+ CHECK(mol->getBondWithIdx(6)->getBondDir() == Bond::NONE);\n+ CHECK(mol->getBondWithIdx(6)->getProp<int>(\n+ common_properties::_MolFileBondStereo) == 4);\n+ CHECK(!mol->getBondWithIdx(6)->hasProp(common_properties::_MolFileBondCfg));\n+ CHECK(mol->getBondWithIdx(6)->getProp<int>(\n+ common_properties::_UnknownStereo));\n+\n+ Chirality::reapplyMolBlockWedging(*mol);\n+ CHECK(mol->getBondWithIdx(3)->getStereo() == Bond::STEREONONE);\n+ CHECK(mol->getBondWithIdx(3)->getBondDir() == Bond::NONE);\n+\n+ CHECK(mol->getBondWithIdx(4)->getStereo() == Bond::STEREONONE);\n+ CHECK(mol->getBondWithIdx(4)->getBondDir() == Bond::UNKNOWN);\n+\n+ CHECK(mol->getBondWithIdx(5)->getStereo() == Bond::STEREONONE);\n+ CHECK(mol->getBondWithIdx(5)->getBondDir() == Bond::NONE);\n+\n+ CHECK(mol->getBondWithIdx(6)->getStereo() == Bond::STEREONONE);\n+ CHECK(mol->getBondWithIdx(6)->getBondDir() == Bond::UNKNOWN);\n+ }\n+ SECTION(\"di-imine-2-3000\") {\n+ auto mol = R\"CTAB(di-imine-2-3000.mol\n+ ChemDraw10232310302D\n+\n+ 0 0 0 0 0 0 V3000\n+M V30 BEGIN CTAB\n+M V30 COUNTS 8 7 0 0 0\n+M V30 BEGIN ATOM\n+M V30 1 C -0.995922 -1.060024 0.000000 0\n+M V30 2 C -0.412509 -0.476711 0.000000 0\n+M V30 3 C 0.412509 -0.476711 0.000000 0\n+M V30 4 C 0.995923 -1.060024 0.000000 0\n+M V30 5 N -0.728217 0.285506 0.000000 0\n+M V30 6 C -0.997122 1.060024 0.000000 0\n+M V30 7 N 0.728216 0.285506 0.000000 0\n+M V30 8 C 0.997122 1.027023 0.000000 0\n+M V30 END ATOM\n+M V30 BEGIN BOND\n+M V30 1 1 1 2\n+M V30 2 1 2 3\n+M V30 3 1 3 4\n+M V30 4 2 2 5\n+M V30 5 1 5 6 CFG=2\n+M V30 6 2 3 7\n+M V30 7 1 7 8 CFG=2\n+M V30 END BOND\n+M V30 END CTAB\n+M END\n+)CTAB\"_ctab;\n+ REQUIRE(mol);\n+ CHECK(mol->getBondWithIdx(3)->getStereo() == Bond::STEREOANY);\n+ CHECK(mol->getBondWithIdx(3)->getBondDir() == Bond::NONE);\n+ CHECK(!mol->getBondWithIdx(3)->hasProp(\n+ common_properties::_MolFileBondStereo));\n+ CHECK(!mol->getBondWithIdx(3)->hasProp(common_properties::_MolFileBondCfg));\n+ CHECK(!mol->getBondWithIdx(3)->hasProp(common_properties::_UnknownStereo));\n+\n+ CHECK(mol->getBondWithIdx(4)->getStereo() == Bond::STEREONONE);\n+ CHECK(mol->getBondWithIdx(4)->getBondDir() == Bond::NONE);\n+ CHECK(!mol->getBondWithIdx(4)->hasProp(\n+ common_properties::_MolFileBondStereo));\n+ CHECK(mol->getBondWithIdx(4)->getProp<int>(\n+ common_properties::_MolFileBondCfg) == 2);\n+ CHECK(mol->getBondWithIdx(4)->getProp<int>(\n+ common_properties::_UnknownStereo));\n+\n+ CHECK(mol->getBondWithIdx(5)->getStereo() == Bond::STEREOANY);\n+ CHECK(mol->getBondWithIdx(5)->getBondDir() == Bond::NONE);\n+ CHECK(!mol->getBondWithIdx(5)->hasProp(\n+ common_properties::_MolFileBondStereo));\n+ CHECK(!mol->getBondWithIdx(5)->hasProp(common_properties::_MolFileBondCfg));\n+ CHECK(!mol->getBondWithIdx(5)->hasProp(common_properties::_UnknownStereo));\n+\n+ CHECK(mol->getBondWithIdx(6)->getStereo() == Bond::STEREONONE);\n+ CHECK(mol->getBondWithIdx(6)->getBondDir() == Bond::NONE);\n+ CHECK(!mol->getBondWithIdx(6)->hasProp(\n+ common_properties::_MolFileBondStereo));\n+ CHECK(mol->getBondWithIdx(6)->getProp<int>(\n+ common_properties::_MolFileBondCfg) == 2);\n+ CHECK(mol->getBondWithIdx(6)->getProp<int>(\n+ common_properties::_UnknownStereo));\n+\n+ Chirality::reapplyMolBlockWedging(*mol);\n+ CHECK(mol->getBondWithIdx(3)->getStereo() == Bond::STEREONONE);\n+ CHECK(mol->getBondWithIdx(3)->getBondDir() == Bond::NONE);\n+\n+ CHECK(mol->getBondWithIdx(4)->getStereo() == Bond::STEREONONE);\n+ CHECK(mol->getBondWithIdx(4)->getBondDir() == Bond::UNKNOWN);\n+\n+ CHECK(mol->getBondWithIdx(5)->getStereo() == Bond::STEREONONE);\n+ CHECK(mol->getBondWithIdx(5)->getBondDir() == Bond::NONE);\n+\n+ CHECK(mol->getBondWithIdx(6)->getStereo() == Bond::STEREONONE);\n+ CHECK(mol->getBondWithIdx(6)->getBondDir() == Bond::UNKNOWN);\n+ }\n+ SECTION(\"di-imine-2-explicit-crossed-2000\") {\n+ auto mol = R\"CTAB(di-imine-2-explicit-crossed-2000.mol\n+ ChemDraw10232310432D\n+\n+ 8 7 0 0 0 0 0 0 0 0999 V2000\n+ -0.9959 -1.0600 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\n+ -0.4125 -0.4767 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\n+ 0.4125 -0.4767 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\n+ 0.9959 -1.0600 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\n+ -0.7282 0.2855 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0\n+ -0.9971 1.0600 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\n+ 0.7282 0.2855 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0\n+ 0.9971 1.0270 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\n+ 1 2 1 0 \n+ 2 3 1 0 \n+ 3 4 1 0 \n+ 2 5 2 3 \n+ 5 6 1 4 \n+ 3 7 2 0 \n+ 7 8 1 4 \n+M END\n+)CTAB\"_ctab;\n+ REQUIRE(mol);\n+ CHECK(mol->getBondWithIdx(3)->getStereo() == Bond::STEREOANY);\n+ CHECK(mol->getBondWithIdx(3)->getBondDir() == Bond::NONE);\n+ CHECK(mol->getBondWithIdx(3)->getProp<int>(\n+ common_properties::_MolFileBondStereo) == 3);\n+ CHECK(!mol->getBondWithIdx(3)->hasProp(common_properties::_MolFileBondCfg));\n+ CHECK(!mol->getBondWithIdx(3)->hasProp(common_properties::_UnknownStereo));\n+\n+ CHECK(mol->getBondWithIdx(4)->getStereo() == Bond::STEREONONE);\n+ CHECK(mol->getBondWithIdx(4)->getBondDir() == Bond::NONE);\n+ CHECK(mol->getBondWithIdx(4)->getProp<int>(\n+ common_properties::_MolFileBondStereo) == 4);\n+ CHECK(!mol->getBondWithIdx(4)->hasProp(common_properties::_MolFileBondCfg));\n+ CHECK(mol->getBondWithIdx(4)->getProp<int>(\n+ common_properties::_UnknownStereo));\n+\n+ CHECK(mol->getBondWithIdx(5)->getStereo() == Bond::STEREOANY);\n+ CHECK(mol->getBondWithIdx(5)->getBondDir() == Bond::NONE);\n+ CHECK(!mol->getBondWithIdx(5)->hasProp(\n+ common_properties::_MolFileBondStereo));\n+ CHECK(!mol->getBondWithIdx(5)->hasProp(common_properties::_MolFileBondCfg));\n+ CHECK(!mol->getBondWithIdx(5)->hasProp(common_properties::_UnknownStereo));\n+\n+ CHECK(mol->getBondWithIdx(6)->getStereo() == Bond::STEREONONE);\n+ CHECK(mol->getBondWithIdx(6)->getBondDir() == Bond::NONE);\n+ CHECK(mol->getBondWithIdx(6)->getProp<int>(\n+ common_properties::_MolFileBondStereo) == 4);\n+ CHECK(!mol->getBondWithIdx(6)->hasProp(common_properties::_MolFileBondCfg));\n+ CHECK(mol->getBondWithIdx(6)->getProp<int>(\n+ common_properties::_UnknownStereo));\n+\n+ Chirality::reapplyMolBlockWedging(*mol);\n+ CHECK(mol->getBondWithIdx(3)->getStereo() == Bond::STEREOANY);\n+ CHECK(mol->getBondWithIdx(3)->getBondDir() == Bond::EITHERDOUBLE);\n+\n+ CHECK(mol->getBondWithIdx(4)->getStereo() == Bond::STEREONONE);\n+ CHECK(mol->getBondWithIdx(4)->getBondDir() == Bond::UNKNOWN);\n+\n+ CHECK(mol->getBondWithIdx(5)->getStereo() == Bond::STEREONONE);\n+ CHECK(mol->getBondWithIdx(5)->getBondDir() == Bond::NONE);\n+\n+ CHECK(mol->getBondWithIdx(6)->getStereo() == Bond::STEREONONE);\n+ CHECK(mol->getBondWithIdx(6)->getBondDir() == Bond::UNKNOWN);\n+ }\n+ SECTION(\"di-imine-2-explicit-crossed-3000\") {\n+ auto mol = R\"CTAB(di-imine-2-explicit-crossed-3000.mol\n+ ChemDraw10232310432D\n+\n+ 0 0 0 0 0 0 V3000\n+M V30 BEGIN CTAB\n+M V30 COUNTS 8 7 0 0 0\n+M V30 BEGIN ATOM\n+M V30 1 C -0.995922 -1.060024 0.000000 0\n+M V30 2 C -0.412509 -0.476711 0.000000 0\n+M V30 3 C 0.412509 -0.476711 0.000000 0\n+M V30 4 C 0.995923 -1.060024 0.000000 0\n+M V30 5 N -0.728217 0.285506 0.000000 0\n+M V30 6 C -0.997122 1.060024 0.000000 0\n+M V30 7 N 0.728216 0.285506 0.000000 0\n+M V30 8 C 0.997122 1.027023 0.000000 0\n+M V30 END ATOM\n+M V30 BEGIN BOND\n+M V30 1 1 1 2\n+M V30 2 1 2 3\n+M V30 3 1 3 4\n+M V30 4 2 2 5 CFG=2\n+M V30 5 1 5 6 CFG=2\n+M V30 6 2 3 7\n+M V30 7 1 7 8 CFG=2\n+M V30 END BOND\n+M V30 END CTAB\n+M END\n+)CTAB\"_ctab;\n+ REQUIRE(mol);\n+ CHECK(mol->getBondWithIdx(3)->getStereo() == Bond::STEREOANY);\n+ CHECK(mol->getBondWithIdx(3)->getBondDir() == Bond::NONE);\n+ CHECK(!mol->getBondWithIdx(3)->hasProp(\n+ common_properties::_MolFileBondStereo));\n+ CHECK(mol->getBondWithIdx(3)->getProp<int>(\n+ common_properties::_MolFileBondCfg) == 2);\n+ CHECK(!mol->getBondWithIdx(3)->hasProp(common_properties::_UnknownStereo));\n+\n+ CHECK(mol->getBondWithIdx(4)->getStereo() == Bond::STEREONONE);\n+ CHECK(mol->getBondWithIdx(4)->getBondDir() == Bond::NONE);\n+ CHECK(!mol->getBondWithIdx(4)->hasProp(\n+ common_properties::_MolFileBondStereo));\n+ CHECK(mol->getBondWithIdx(4)->getProp<int>(\n+ common_properties::_MolFileBondCfg) == 2);\n+ CHECK(mol->getBondWithIdx(4)->getProp<int>(\n+ common_properties::_UnknownStereo));\n+\n+ CHECK(mol->getBondWithIdx(5)->getStereo() == Bond::STEREOANY);\n+ CHECK(mol->getBondWithIdx(5)->getBondDir() == Bond::NONE);\n+ CHECK(!mol->getBondWithIdx(5)->hasProp(\n+ common_properties::_MolFileBondStereo));\n+ CHECK(!mol->getBondWithIdx(5)->hasProp(common_properties::_MolFileBondCfg));\n+ CHECK(!mol->getBondWithIdx(5)->hasProp(common_properties::_UnknownStereo));\n+\n+ CHECK(mol->getBondWithIdx(6)->getStereo() == Bond::STEREONONE);\n+ CHECK(mol->getBondWithIdx(6)->getBondDir() == Bond::NONE);\n+ CHECK(!mol->getBondWithIdx(6)->hasProp(\n+ common_properties::_MolFileBondStereo));\n+ CHECK(mol->getBondWithIdx(6)->getProp<int>(\n+ common_properties::_MolFileBondCfg) == 2);\n+ CHECK(mol->getBondWithIdx(6)->getProp<int>(\n+ common_properties::_UnknownStereo));\n+\n+ Chirality::reapplyMolBlockWedging(*mol);\n+ CHECK(mol->getBondWithIdx(3)->getStereo() == Bond::STEREOANY);\n+ CHECK(mol->getBondWithIdx(3)->getBondDir() == Bond::EITHERDOUBLE);\n+\n+ CHECK(mol->getBondWithIdx(4)->getStereo() == Bond::STEREONONE);\n+ CHECK(mol->getBondWithIdx(4)->getBondDir() == Bond::UNKNOWN);\n+\n+ CHECK(mol->getBondWithIdx(5)->getStereo() == Bond::STEREONONE);\n+ CHECK(mol->getBondWithIdx(5)->getBondDir() == Bond::NONE);\n+\n+ CHECK(mol->getBondWithIdx(6)->getStereo() == Bond::STEREONONE);\n+ CHECK(mol->getBondWithIdx(6)->getBondDir() == Bond::UNKNOWN);\n+ }\n+\n+ SECTION(\"di-imine-cross-2000\") {\n+ auto mol = R\"CTAB(di-imine-cross-2000.mol\n+ ChemDraw10192311582D\n+\n+ 8 7 0 0 0 0 0 0 0 0999 V2000\n+ -1.0099 -1.1129 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\n+ -0.5974 -0.3984 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\n+ 0.2276 -0.3984 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\n+ 0.6401 -1.1129 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\n+ -0.8109 0.3984 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0\n+ 0.6401 0.3160 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0\n+ -1.2234 1.1129 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\n+ 1.2234 0.8994 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\n+ 1 2 1 0 0\n+ 2 3 1 0 0\n+ 3 4 1 0 0\n+ 2 5 2 3 0\n+ 3 6 2 3 0\n+ 5 7 1 0 0\n+ 6 8 1 0 0\n+M END\n+)CTAB\"_ctab;\n+ REQUIRE(mol);\n+ CHECK(mol->getBondWithIdx(3)->getStereo() == Bond::STEREOANY);\n+ CHECK(mol->getBondWithIdx(3)->getBondDir() == Bond::NONE);\n+ CHECK(mol->getBondWithIdx(3)->getProp<int>(\n+ common_properties::_MolFileBondStereo) == 3);\n+ CHECK(!mol->getBondWithIdx(3)->hasProp(common_properties::_MolFileBondCfg));\n+ CHECK(!mol->getBondWithIdx(3)->hasProp(common_properties::_UnknownStereo));\n+\n+ CHECK(mol->getBondWithIdx(4)->getStereo() == Bond::STEREOANY);\n+ CHECK(mol->getBondWithIdx(4)->getBondDir() == Bond::NONE);\n+ CHECK(mol->getBondWithIdx(4)->getProp<int>(\n+ common_properties::_MolFileBondStereo) == 3);\n+ CHECK(!mol->getBondWithIdx(4)->hasProp(common_properties::_MolFileBondCfg));\n+ CHECK(!mol->getBondWithIdx(4)->hasProp(common_properties::_UnknownStereo));\n+\n+ CHECK(mol->getBondWithIdx(5)->getStereo() == Bond::STEREONONE);\n+ CHECK(mol->getBondWithIdx(5)->getBondDir() == Bond::NONE);\n+ CHECK(!mol->getBondWithIdx(5)->hasProp(\n+ common_properties::_MolFileBondStereo));\n+ CHECK(!mol->getBondWithIdx(5)->hasProp(common_properties::_MolFileBondCfg));\n+ CHECK(!mol->getBondWithIdx(5)->hasProp(common_properties::_UnknownStereo));\n+\n+ CHECK(mol->getBondWithIdx(6)->getStereo() == Bond::STEREONONE);\n+ CHECK(mol->getBondWithIdx(6)->getBondDir() == Bond::NONE);\n+ CHECK(!mol->getBondWithIdx(6)->hasProp(\n+ common_properties::_MolFileBondStereo));\n+ CHECK(!mol->getBondWithIdx(6)->hasProp(common_properties::_MolFileBondCfg));\n+ CHECK(!mol->getBondWithIdx(6)->hasProp(common_properties::_UnknownStereo));\n+\n+ Chirality::reapplyMolBlockWedging(*mol);\n+ CHECK(mol->getBondWithIdx(3)->getStereo() == Bond::STEREOANY);\n+ CHECK(mol->getBondWithIdx(3)->getBondDir() == Bond::EITHERDOUBLE);\n+\n+ CHECK(mol->getBondWithIdx(4)->getStereo() == Bond::STEREOANY);\n+ CHECK(mol->getBondWithIdx(4)->getBondDir() == Bond::EITHERDOUBLE);\n+\n+ CHECK(mol->getBondWithIdx(5)->getStereo() == Bond::STEREONONE);\n+ CHECK(mol->getBondWithIdx(5)->getBondDir() == Bond::NONE);\n+\n+ CHECK(mol->getBondWithIdx(6)->getStereo() == Bond::STEREONONE);\n+ CHECK(mol->getBondWithIdx(6)->getBondDir() == Bond::NONE);\n+ }\n+ SECTION(\"di-imine-cross-3000\") {\n+ auto mol = R\"CTAB(di-imine-cross-3000.mol\n+ ChemDraw10232310302D\n+\n+ 0 0 0 0 0 0 V3000\n+M V30 BEGIN CTAB\n+M V30 COUNTS 8 7 0 0 0\n+M V30 BEGIN ATOM\n+M V30 1 C -1.009900 -1.112900 0.000000 0\n+M V30 2 C -0.597400 -0.398400 0.000000 0\n+M V30 3 C 0.227600 -0.398400 0.000000 0\n+M V30 4 C 0.640100 -1.112900 0.000000 0\n+M V30 5 N -0.810900 0.398400 0.000000 0\n+M V30 6 N 0.640100 0.316000 0.000000 0\n+M V30 7 C -1.223400 1.112900 0.000000 0\n+M V30 8 C 1.223400 0.899400 0.000000 0\n+M V30 END ATOM\n+M V30 BEGIN BOND\n+M V30 1 1 1 2\n+M V30 2 1 2 3\n+M V30 3 1 3 4\n+M V30 4 2 2 5 CFG=2\n+M V30 5 2 3 6 CFG=2\n+M V30 6 1 5 7\n+M V30 7 1 6 8\n+M V30 END BOND\n+M V30 END CTAB\n+M END\n+)CTAB\"_ctab;\n+ REQUIRE(mol);\n+ CHECK(mol->getBondWithIdx(3)->getStereo() == Bond::STEREOANY);\n+ CHECK(mol->getBondWithIdx(3)->getBondDir() == Bond::NONE);\n+ CHECK(!mol->getBondWithIdx(3)->hasProp(\n+ common_properties::_MolFileBondStereo));\n+ CHECK(mol->getBondWithIdx(3)->getProp<int>(\n+ common_properties::_MolFileBondCfg) == 2);\n+ CHECK(!mol->getBondWithIdx(3)->hasProp(common_properties::_UnknownStereo));\n+\n+ CHECK(mol->getBondWithIdx(4)->getStereo() == Bond::STEREOANY);\n+ CHECK(mol->getBondWithIdx(4)->getBondDir() == Bond::NONE);\n+ CHECK(!mol->getBondWithIdx(4)->hasProp(\n+ common_properties::_MolFileBondStereo));\n+ CHECK(mol->getBondWithIdx(4)->getProp<int>(\n+ common_properties::_MolFileBondCfg) == 2);\n+ CHECK(!mol->getBondWithIdx(4)->hasProp(common_properties::_UnknownStereo));\n+\n+ CHECK(mol->getBondWithIdx(5)->getStereo() == Bond::STEREONONE);\n+ CHECK(mol->getBondWithIdx(5)->getBondDir() == Bond::NONE);\n+ CHECK(!mol->getBondWithIdx(5)->hasProp(\n+ common_properties::_MolFileBondStereo));\n+ CHECK(!mol->getBondWithIdx(5)->hasProp(common_properties::_MolFileBondCfg));\n+ CHECK(!mol->getBondWithIdx(5)->hasProp(common_properties::_UnknownStereo));\n+\n+ CHECK(mol->getBondWithIdx(6)->getStereo() == Bond::STEREONONE);\n+ CHECK(mol->getBondWithIdx(6)->getBondDir() == Bond::NONE);\n+ CHECK(!mol->getBondWithIdx(6)->hasProp(\n+ common_properties::_MolFileBondStereo));\n+ CHECK(!mol->getBondWithIdx(6)->hasProp(common_properties::_MolFileBondCfg));\n+ CHECK(!mol->getBondWithIdx(6)->hasProp(common_properties::_UnknownStereo));\n+\n+ Chirality::reapplyMolBlockWedging(*mol);\n+ CHECK(mol->getBondWithIdx(3)->getStereo() == Bond::STEREOANY);\n+ CHECK(mol->getBondWithIdx(3)->getBondDir() == Bond::EITHERDOUBLE);\n+\n+ CHECK(mol->getBondWithIdx(4)->getStereo() == Bond::STEREOANY);\n+ CHECK(mol->getBondWithIdx(4)->getBondDir() == Bond::EITHERDOUBLE);\n+\n+ CHECK(mol->getBondWithIdx(5)->getStereo() == Bond::STEREONONE);\n+ CHECK(mol->getBondWithIdx(5)->getBondDir() == Bond::NONE);\n+\n+ CHECK(mol->getBondWithIdx(6)->getStereo() == Bond::STEREONONE);\n+ CHECK(mol->getBondWithIdx(6)->getBondDir() == Bond::NONE);\n+ }\n+ SECTION(\n+ \"roundtripping molblock with cis double bond should not change it into crosssed\") {\n+ auto molblockIn = R\"CTAB(\n+ RDKit 2D\n+\n+ 5 4 0 0 0 0 0 0 0 0999 V2000\n+ -2.4998 2.4772 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\n+ -3.2142 2.0647 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\n+ -2.4998 3.3022 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\n+ -3.2142 3.7147 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\n+ -3.9287 3.3022 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0\n+ 2 1 1 0\n+ 1 3 2 0\n+ 3 4 1 0\n+ 4 5 1 0\n+M END\n+)CTAB\";\n+ {\n+ std::unique_ptr<RWMol> mol(MolBlockToMol(molblockIn, false));\n+ auto molblockOut = MolToMolBlock(*mol);\n+ CHECK(molblockIn == molblockOut);\n+ }\n+ {\n+ std::unique_ptr<RWMol> mol(MolBlockToMol(molblockIn, false));\n+ reapplyMolBlockWedging(*mol);\n+ auto molblockOut = MolToMolBlock(*mol);\n+ CHECK(molblockIn == molblockOut);\n+ }\n+ }\n+}\n", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}227{"question_id": "MSB_rdkit_rdkit_pr6842", "question_type": "multi_swe_bench", "description": "Sanitize number of radical electrons in case of invalid value assigned by CXSMILES (rdkit/rdkit#6842)", "content": {"org": "rdkit", "repo": "rdkit", "pr_number": 6842, "issue_title": "Sanitize number of radical electrons in case of invalid value assigned by CXSMILES", "issue_body": "#### Reference Issue\r\nFixes #6370 \r\n\r\n#### What does this implement/fix? Explain your changes.\r\nNumber of radical electrons are first assigned by the regular SMILES, and then get overridden by the CXSMILES extension. For example,\r\n\r\n```python\r\nChem.MolFromSmiles('[CH4]').Debug()\r\n#\t0 6 C chg: 0 deg: 0 exp: 4 imp: 0 hyb: 4 arom?: 0 chi: 0\r\nChem.MolFromSmiles('[CH4] |^1:0|').Debug()\r\n#\t0 6 C chg: 0 deg: 0 exp: 4 imp: 0 hyb: 4 arom?: 0 chi: 0 rad: 1\r\nChem.MolFromSmiles('[CH4] |^2:0|').Debug()\r\n#\t0 6 C chg: 0 deg: 0 exp: 4 imp: 0 hyb: 4 arom?: 0 chi: 0 rad: 2\r\n```\r\n\r\nThe radical info from CXSMILES may be invalid and therefore should be sanitized. However, current implementation of `assignRadicals()` within `sanitizeMol()` will do nothing if the preset number of radical electrons is non-zero. The fix is then to allow such sanitization by removing the condition `if (atom->getNumRadicalElectrons())`.\r\n\r\nUnittests are added for a set of CXSMILES:\r\n1. `[XHn] |^m:0|` where X is the element symbol, n = 1, ..., valence, m = 1, ..., 7 denotes the radical type.\r\n2. `[NH4+] |^m:0|` where m = 1, ..., 7 denotes the radical type.\r\n\r\nI also fix a minor issue in `calcImplicitValence()` where `d_implicitValence` is not overwritten by the return value.", "base_commit": "ac23f490898b445c0f9cb020bda19f937f27f76e", "resolved_issues": [{"number": 6370, "title": "non-physical radical counts being preserved", "body": "\r\n**Describe the bug**\r\nSanitization is leaving radicals on molecules where they don't make sense.\r\n\r\n**To Reproduce**\r\n```\r\nIn [8]: Chem.MolFromSmiles('[NH4+] |^1:0|').Debug()\r\nAtoms:\r\n\t0 7 N chg: 1 deg: 0 exp: 4 imp: 0 hyb: 4 arom?: 0 chi: 0 rad: 1\r\nBonds:\r\n\r\nIn [9]: Chem.MolFromSmiles('[CH4] |^1:0|').Debug()\r\nAtoms:\r\n\t0 6 C chg: 0 deg: 0 exp: 4 imp: 0 hyb: 4 arom?: 0 chi: 0 rad: 1\r\nBonds:\r\n\r\n```\r\nNeither of those should have a radical on it.\r\n\r\n**Configuration (please complete the following information):**\r\n - RDKit version: all\r\n - OS: all\r\n"}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/rdkit_m_rdkit:pr-6842", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/Code/GraphMol/MolOps.cpp b/Code/GraphMol/MolOps.cpp\nindex 4ba259f3808..971ee8c7217 100644\n--- a/Code/GraphMol/MolOps.cpp\n+++ b/Code/GraphMol/MolOps.cpp\n@@ -388,9 +388,8 @@ void adjustHs(RWMol &mol) {\n void assignRadicals(RWMol &mol) {\n for (auto atom : mol.atoms()) {\n // we only put automatically assign radicals to things that\n- // don't have them already and don't have implicit Hs:\n- if (!atom->getNoImplicit() || atom->getNumRadicalElectrons() ||\n- !atom->getAtomicNum()) {\n+ // don't have implicit Hs:\n+ if (!atom->getNoImplicit() || !atom->getAtomicNum()) {\n continue;\n }\n const auto &valens =\ndiff --git a/ReleaseNotes.md b/ReleaseNotes.md\nindex f392dd3e07b..7f3fce596cf 100644\n--- a/ReleaseNotes.md\n+++ b/ReleaseNotes.md\n@@ -10,7 +10,7 @@ GitHub)\n \n ## Backwards incompatible changes\n - Two changes to improve the defaults for conformer generation: the functions EmbedMolecule() and EmbedMultipleConfis() now use ETKDGv3 by default (previously they were using ETKDGV1) and only consider heavy atoms when calculating RMSD for conformer pruning (previously Hs were alos considered).\n-\n+- The way that the number of radical electrons is calculated for atoms coming from mol blocks has been changed. Systems like a `[CH]` marked as a `DOUBLET` will now have three radical electrons assigned. This is consistent with the value from SMILES.\n \n ## New Features and Enhancements:\n \n"}, "test": {"test_patch": "diff --git a/Code/GraphMol/FileParsers/test1.cpp b/Code/GraphMol/FileParsers/test1.cpp\nindex 6abe90cb05a..509bcb59554 100644\n--- a/Code/GraphMol/FileParsers/test1.cpp\n+++ b/Code/GraphMol/FileParsers/test1.cpp\n@@ -2475,12 +2475,12 @@ void test3V3K() {\n {\n // radical and valence\n fName = rdbase + \"CH.v3k.mol\";\n- RWMol *m = MolFileToMol(fName);\n+ RWMol *m = MolFileToMol(fName); // cxsmiles = \"[CH] |(0,0,),^5:0|\"\n TEST_ASSERT(m);\n TEST_ASSERT(m->getNumAtoms() == 1);\n TEST_ASSERT(m->getAtomWithIdx(0)->getNoImplicit());\n TEST_ASSERT(m->getAtomWithIdx(0)->getNumExplicitHs() == 1);\n- TEST_ASSERT(m->getAtomWithIdx(0)->getNumRadicalElectrons() == 1);\n+ TEST_ASSERT(m->getAtomWithIdx(0)->getNumRadicalElectrons() == 3);\n \n std::string mb = MolToMolBlock(*m, true, -1, true, true);\n delete m;\n@@ -2494,7 +2494,7 @@ void test3V3K() {\n TEST_ASSERT(m->getNumAtoms() == 1);\n TEST_ASSERT(m->getAtomWithIdx(0)->getNoImplicit());\n TEST_ASSERT(m->getAtomWithIdx(0)->getNumExplicitHs() == 1);\n- TEST_ASSERT(m->getAtomWithIdx(0)->getNumRadicalElectrons() == 1);\n+ TEST_ASSERT(m->getAtomWithIdx(0)->getNumRadicalElectrons() == 3);\n \n delete m;\n }\n@@ -3007,10 +3007,7 @@ void testIssue3359739() {\n delete m;\n m = MolBlockToMol(molBlock);\n TEST_ASSERT(m);\n- // NOTE: the following is correct according to the current\n- // state of the code and what the CTAB format supports,\n- // but it's definitely not chemically correct\n- TEST_ASSERT(m->getAtomWithIdx(0)->getNumRadicalElectrons() == 1);\n+ TEST_ASSERT(m->getAtomWithIdx(0)->getNumRadicalElectrons() == 3);\n delete m;\n \n BOOST_LOG(rdInfoLog) << \" Finished <---------- \" << std::endl;\n@@ -3528,12 +3525,12 @@ void testMolFileTotalValence() {\n RWMol *m1;\n std::string fName;\n fName = rdbase + \"CH.mol\";\n- m1 = MolFileToMol(fName);\n+ m1 = MolFileToMol(fName); // cxsmi = \"[CH] |(-1.2375,2.1509,),^5:0|\"\n TEST_ASSERT(m1);\n TEST_ASSERT(m1->getNumAtoms() == 1);\n TEST_ASSERT(m1->getAtomWithIdx(0)->getNoImplicit());\n TEST_ASSERT(m1->getAtomWithIdx(0)->getNumExplicitHs() == 1);\n- TEST_ASSERT(m1->getAtomWithIdx(0)->getNumRadicalElectrons() == 1);\n+ TEST_ASSERT(m1->getAtomWithIdx(0)->getNumRadicalElectrons() == 3);\n \n delete m1;\n }\n@@ -3566,12 +3563,12 @@ void testMolFileTotalValence() {\n RWMol *m1;\n std::string fName;\n fName = rdbase + \"CH.v3k.mol\";\n- m1 = MolFileToMol(fName);\n+ m1 = MolFileToMol(fName); // cxsmiles = \"[CH] |(0,0,),^5:0|\"\n TEST_ASSERT(m1);\n TEST_ASSERT(m1->getNumAtoms() == 1);\n TEST_ASSERT(m1->getAtomWithIdx(0)->getNoImplicit());\n TEST_ASSERT(m1->getAtomWithIdx(0)->getNumExplicitHs() == 1);\n- TEST_ASSERT(m1->getAtomWithIdx(0)->getNumRadicalElectrons() == 1);\n+ TEST_ASSERT(m1->getAtomWithIdx(0)->getNumRadicalElectrons() == 3);\n \n delete m1;\n }\ndiff --git a/Code/GraphMol/FileParsers/testMolWriter.cpp b/Code/GraphMol/FileParsers/testMolWriter.cpp\nindex 78275f62864..8fbb0b4c7cb 100644\n--- a/Code/GraphMol/FileParsers/testMolWriter.cpp\n+++ b/Code/GraphMol/FileParsers/testMolWriter.cpp\n@@ -739,7 +739,7 @@ void testMolFileTotalValence() {\n TEST_ASSERT(m1->getNumAtoms() == 1);\n TEST_ASSERT(m1->getAtomWithIdx(0)->getNoImplicit());\n TEST_ASSERT(m1->getAtomWithIdx(0)->getNumExplicitHs() == 1);\n- TEST_ASSERT(m1->getAtomWithIdx(0)->getNumRadicalElectrons() == 1);\n+ TEST_ASSERT(m1->getAtomWithIdx(0)->getNumRadicalElectrons() == 3);\n \n delete m1;\n }\ndiff --git a/Code/GraphMol/MarvinParse/test_data/mrvValence_value.mrv.expected.mrv b/Code/GraphMol/MarvinParse/test_data/mrvValence_value.mrv.expected.mrv\nindex 99d10b08c82..2036bd947ff 100644\n--- a/Code/GraphMol/MarvinParse/test_data/mrvValence_value.mrv.expected.mrv\n+++ b/Code/GraphMol/MarvinParse/test_data/mrvValence_value.mrv.expected.mrv\n@@ -1,2 +1,2 @@\n <?xml version=\"1.0\" encoding=\"utf-8\"?>\n-<cml xmlns=\"http://www.chemaxon.com\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"http://www.chemaxon.com http://www.chemaxon.com/marvin/schema/mrvSchema_20_20_0.xsd\"><MDocument><MChemicalStruct><molecule molID=\"m1\"><atomArray><atom id=\"a1\" elementType=\"B\" x2=\"4.51182\" y2=\"0.00000\" formalCharge=\"-1\" radical=\"monovalent\"/><atom id=\"a2\" elementType=\"C\" x2=\"2.97182\" y2=\"0.00000\"/><atom id=\"a3\" elementType=\"N\" x2=\"1.43182\" y2=\"0.00000\"/></atomArray><bondArray><bond id=\"b1\" atomRefs2=\"a1 a2\" order=\"1\"/><bond id=\"b2\" atomRefs2=\"a2 a3\" order=\"3\"/></bondArray></molecule></MChemicalStruct></MDocument></cml>\n\\ No newline at end of file\n+<cml xmlns=\"http://www.chemaxon.com\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"http://www.chemaxon.com http://www.chemaxon.com/marvin/schema/mrvSchema_20_20_0.xsd\"><MDocument><MChemicalStruct><molecule molID=\"m1\"><atomArray><atom id=\"a1\" elementType=\"B\" x2=\"4.51182\" y2=\"0.00000\" formalCharge=\"-1\" radical=\"trivalent4\"/><atom id=\"a2\" elementType=\"C\" x2=\"2.97182\" y2=\"0.00000\"/><atom id=\"a3\" elementType=\"N\" x2=\"1.43182\" y2=\"0.00000\"/></atomArray><bondArray><bond id=\"b1\" atomRefs2=\"a1 a2\" order=\"1\"/><bond id=\"b2\" atomRefs2=\"a2 a3\" order=\"3\"/></bondArray></molecule></MChemicalStruct></MDocument></cml>\n\\ No newline at end of file\ndiff --git a/Code/GraphMol/test1.cpp b/Code/GraphMol/test1.cpp\nindex dcce2fd0aa2..1d2b64e0d07 100644\n--- a/Code/GraphMol/test1.cpp\n+++ b/Code/GraphMol/test1.cpp\n@@ -14,7 +14,6 @@\n #include <GraphMol/RDKitQueries.h>\n #include <RDGeneral/types.h>\n #include <RDGeneral/RDLog.h>\n-//#include <boost/log/functions.hpp>\n #include <GraphMol/FileParsers/FileParsers.h>\n #include <GraphMol/FileParsers/MolWriters.h>\n #include <GraphMol/SmilesParse/SmilesParse.h>\n@@ -22,6 +21,7 @@\n #include <GraphMol/SmilesParse/SmartsWrite.h>\n #include <sstream>\n #include <iostream>\n+#include <boost/format.hpp>\n #include <boost/range/iterator_range.hpp>\n \n using namespace std;\n@@ -1666,6 +1666,60 @@ void testHasValenceViolation() {\n BOOST_LOG(rdInfoLog) << \"Finished\" << std::endl;\n }\n \n+void testGithub6370() {\n+ BOOST_LOG(rdErrorLog) << \"-------------------------------------\" << std::endl;\n+ BOOST_LOG(rdErrorLog)\n+ << \" Test Github 6370: non-physical radical counts being preserved\"\n+ << std::endl;\n+\n+ auto testRadicalsForSingleAtom = [](const std::string &element, int valence) {\n+ for (int explicitHCount = 0; explicitHCount <= valence; explicitHCount++) {\n+ for (int radicalType = 1; radicalType <= 7; radicalType++) {\n+ std::string smi;\n+ if (explicitHCount == 0) {\n+ smi = (boost::format(\"[%s] |^%d:0|\") % element % radicalType).str();\n+ } else {\n+ smi = (boost::format(\"[%sH%d] |^%d:0|\") % element % explicitHCount %\n+ radicalType)\n+ .str();\n+ }\n+ RWMol *m = SmilesToMol(smi);\n+ TEST_ASSERT(\n+ static_cast<int>(m->getAtomWithIdx(0)->getNumRadicalElectrons()) ==\n+ valence - explicitHCount);\n+ }\n+ }\n+ };\n+\n+ // Checks CXSMILES in the form of [XHn] |^m:0|\n+ // where X is the element symbol,\n+ // n = 0, ..., valence,\n+ // m = 1, ..., 7 denotes the radical type\n+ for (int atomicNum = 2; atomicNum <= 118; atomicNum++) {\n+ const auto &defaultVs =\n+ PeriodicTable::getTable()->getValenceList(atomicNum);\n+ if (defaultVs.size() != 1) {\n+ // Skips elements with multiple valences, e.g., transition metals\n+ continue;\n+ }\n+ int valence = defaultVs[0];\n+ std::string element =\n+ PeriodicTable::getTable()->getElementSymbol(atomicNum);\n+ testRadicalsForSingleAtom(element, valence);\n+ }\n+\n+ // Checks CXSMILES in the form of [NH4+] |^m:0|\n+ // where m = 1, ..., 7 denotes the radical type\n+ for (int radicalType = 1; radicalType <= 7; radicalType++) {\n+ std::string smi = (boost::format(\"[NH4+] |^%d:0|\") % radicalType).str();\n+ RWMol *m = SmilesToMol(smi);\n+ TEST_ASSERT(\n+ static_cast<int>(m->getAtomWithIdx(0)->getNumRadicalElectrons()) == 0);\n+ }\n+\n+ BOOST_LOG(rdErrorLog) << \"Finished\" << std::endl;\n+}\n+\n // -------------------------------------------------------------------\n int main() {\n RDLog::InitLogs();\n@@ -1695,6 +1749,7 @@ int main() {\n testRanges();\n testGithub1642();\n testGithub1843();\n+ testGithub6370();\n testAtomListLineRoundTrip();\n testAtomListLineWithOtherQueries();\n testReplaceChargedAtomWithQueryAtom();\n", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}228{"question_id": "MSB_rdkit_rdkit_pr6877", "question_type": "multi_swe_bench", "description": "Set squiggle bonds to STEREOANY with stereo atoms (rdkit/rdkit#6877)", "content": {"org": "rdkit", "repo": "rdkit", "pr_number": 6877, "issue_title": "Set squiggle bonds to STEREOANY with stereo atoms", "issue_body": "Fixes #6876 \r\n\r\nThis allows squiggle bonds in mol blocks to be stereo enumerated. If we round trip through CXSmiles, the bonds are stereo enumerable so this is intended behavior.", "base_commit": "63c7e85046618f3dd932a32d6d4a764afcb6539c", "resolved_issues": [{"number": 6876, "title": "Wavy bonds in mol blocks can't be stereo enumerated", "body": "Test case.\r\n\r\nIf we round trip them through cx smiles, they can be stereo enumerated.\r\n\r\n```\r\n SECTION(\"ensure we can enumerate stereo on either double bonds\") {\r\n auto mol = R\"CTAB(\r\n Mrv2004 11072316002D \r\n\r\n 0 0 0 0 0 999 V3000\r\nM V30 BEGIN CTAB\r\nM V30 COUNTS 8 8 0 0 1\r\nM V30 BEGIN ATOM\r\nM V30 1 C 1.859 2.7821 0 0\r\nM V30 2 C 3.2818 2.1928 0 0\r\nM V30 3 C 3.8711 0.77 0 0\r\nM V30 4 C 3.2818 -0.6528 0 0\r\nM V30 5 C 1.859 -1.2421 0 0\r\nM V30 6 C 0.4362 -0.6528 0 0\r\nM V30 7 C -0.1533 0.77 0 0\r\nM V30 8 C 0.4362 2.1928 0 0\r\nM V30 END ATOM\r\nM V30 BEGIN BOND\r\nM V30 1 1 1 2\r\nM V30 2 1 2 3\r\nM V30 3 1 4 3 CFG=2\r\nM V30 4 2 4 5\r\nM V30 5 1 5 6\r\nM V30 6 1 6 7\r\nM V30 7 1 7 8\r\nM V30 8 1 1 8\r\nM V30 END BOND\r\nM V30 END CTAB\r\nM END)CTAB\"_ctab;\r\n //mol->debugMol(std::cerr);\r\n std::string smi = MolToCXSmiles(*mol, SmilesWriteParams());\r\n std::cout << smi << std::endl;\r\n auto f = SmilesToMol(smi);\r\n f->getBondWithIdx(0)->setStereo(Bond::BondStereo::STEREOCIS);\r\n mol->getBondWithIdx(3)->setStereo(Bond::BondStereo::STEREOCIS);\r\n delete f;\r\n }\r\n}\r\n```"}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/rdkit_m_rdkit:pr-6877", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/Code/GraphMol/Chirality.cpp b/Code/GraphMol/Chirality.cpp\nindex f748b413ca5..8bc03e8ba66 100644\n--- a/Code/GraphMol/Chirality.cpp\n+++ b/Code/GraphMol/Chirality.cpp\n@@ -185,7 +185,7 @@ void updateDoubleBondNeighbors(ROMol &mol, Bond *dblBond, const Conformer *conf,\n // Don't do any direction setting if we've seen a squiggle bond, but do mark\n // the double bond as a crossed bond and return\n if (squiggleBondSeen) {\n- dblBond->setBondDir(Bond::EITHERDOUBLE);\n+ Chirality::detail::setStereoanyFromSquiggleBond(mol, dblBond);\n return;\n }\n if (!bond1) {\n@@ -200,7 +200,7 @@ void updateDoubleBondNeighbors(ROMol &mol, Bond *dblBond, const Conformer *conf,\n // Don't do any direction setting if we've seen a squiggle bond, but do mark\n // the double bond as a crossed bond and return\n if (squiggleBondSeen) {\n- dblBond->setBondDir(Bond::EITHERDOUBLE);\n+ Chirality::detail::setStereoanyFromSquiggleBond(mol, dblBond);\n return;\n }\n if (!bond2) {\n@@ -259,7 +259,7 @@ void updateDoubleBondNeighbors(ROMol &mol, Bond *dblBond, const Conformer *conf,\n }\n }\n if (linear) {\n- dblBond->setBondDir(Bond::EITHERDOUBLE);\n+ Chirality::detail::setStereoanyFromSquiggleBond(mol, dblBond);\n return;\n }\n \n@@ -919,6 +919,41 @@ bool has_protium_neighbor(const ROMol &mol, const Atom *atom) {\n return false;\n }\n \n+void setStereoanyFromSquiggleBond(ROMol &mol, Bond *bond,\n+\t\t\t\t Bond::BondStereo stereo) {\n+ // NOTE: moved from parse_doublebond_stereo CXSmilesOps\n+ // the cis/trans/unknown marker is relative to the lowest numbered atom\n+ // connected to the lowest numbered double bond atom and the\n+ // highest-numbered atom connected to the highest-numbered double bond\n+ // atom find those\n+ auto begAtom = bond->getBeginAtom();\n+ auto endAtom = bond->getEndAtom();\n+ if (begAtom->getIdx() > endAtom->getIdx()) {\n+ std::swap(begAtom, endAtom);\n+ }\n+ if (begAtom->getDegree() > 1 && endAtom->getDegree() > 1) {\n+ unsigned int begControl = mol.getNumAtoms();\n+ for (auto nbr : mol.atomNeighbors(begAtom)) {\n+ if (nbr == endAtom) {\n+ continue;\n+ }\n+ begControl = std::min(nbr->getIdx(), begControl);\n+ }\n+ unsigned int endControl = 0;\n+ for (auto nbr : mol.atomNeighbors(endAtom)) {\n+ if (nbr == begAtom) {\n+ continue;\n+ }\n+ endControl = std::max(nbr->getIdx(), endControl);\n+ }\n+ if (begAtom != bond->getBeginAtom()) {\n+ std::swap(begControl, endControl);\n+ }\n+ bond->setStereoAtoms(begControl, endControl);\n+ bond->setStereo(stereo);\n+ mol.setProp(\"_needsDetectBondStereo\", 1);\n+ }\n+}\n } // namespace detail\n \n typedef std::pair<int, int> INT_PAIR;\ndiff --git a/Code/GraphMol/Chirality.h b/Code/GraphMol/Chirality.h\nindex ebf92c972e2..8aa2e4d02f1 100644\n--- a/Code/GraphMol/Chirality.h\n+++ b/Code/GraphMol/Chirality.h\n@@ -234,6 +234,8 @@ RDKIT_GRAPHMOL_EXPORT int pickBondToWedge(const Atom *atom, const ROMol &mol,\n const INT_VECT &nChiralNbrs,\n const INT_MAP_INT &resSoFar,\n int noNbrs);\n+RDKIT_GRAPHMOL_EXPORT void setStereoanyFromSquiggleBond(ROMol &mol, Bond *bond,\n+\t\t\t\t\t\t\tBond::BondStereo stereo=Bond::STEREOANY);\n } // namespace detail\n \n //! picks the bonds which should be wedged\ndiff --git a/Code/GraphMol/SmilesParse/CXSmilesOps.cpp b/Code/GraphMol/SmilesParse/CXSmilesOps.cpp\nindex b434826e68d..27548e01230 100644\n--- a/Code/GraphMol/SmilesParse/CXSmilesOps.cpp\n+++ b/Code/GraphMol/SmilesParse/CXSmilesOps.cpp\n@@ -1147,37 +1147,7 @@ bool parse_doublebond_stereo(Iterator &first, Iterator last, RDKit::RWMol &mol,\n return false;\n }\n \n- // the cis/trans/unknown marker is relative to the lowest numbered atom\n- // connected to the lowest numbered double bond atom and the\n- // highest-numbered atom connected to the highest-numbered double bond\n- // atom find those\n- auto begAtom = bond->getBeginAtom();\n- auto endAtom = bond->getEndAtom();\n- if (begAtom->getIdx() > endAtom->getIdx()) {\n- std::swap(begAtom, endAtom);\n- }\n- if (begAtom->getDegree() > 1 && endAtom->getDegree() > 1) {\n- unsigned int begControl = mol.getNumAtoms();\n- for (auto nbr : mol.atomNeighbors(begAtom)) {\n- if (nbr == endAtom) {\n- continue;\n- }\n- begControl = std::min(nbr->getIdx(), begControl);\n- }\n- unsigned int endControl = 0;\n- for (auto nbr : mol.atomNeighbors(endAtom)) {\n- if (nbr == begAtom) {\n- continue;\n- }\n- endControl = std::max(nbr->getIdx(), endControl);\n- }\n- if (begAtom != bond->getBeginAtom()) {\n- std::swap(begControl, endControl);\n- }\n- bond->setStereoAtoms(begControl, endControl);\n- bond->setStereo(stereo);\n- mol.setProp(SmilesParseOps::detail::_needsDetectBondStereo, 1);\n- }\n+ Chirality::detail::setStereoanyFromSquiggleBond(mol, bond, stereo);\n }\n if (first < last && *first == ',') {\n ++first;\ndiff --git a/Code/GraphMol/catch_chirality.cpp b/Code/GraphMol/catch_chirality.cpp\nindex c3d5c2f5849..2ae73537461 100644\n--- a/Code/GraphMol/catch_chirality.cpp\n+++ b/Code/GraphMol/catch_chirality.cpp\n@@ -3799,8 +3799,49 @@ TEST_CASE(\n CHECK(cp.getBondWithIdx(1)->getStereoAtoms().empty());\n }\n }\n-}\n+ SECTION(\"ensure we can enumerate stereo on either double bonds\") {\n+ auto mol = R\"CTAB(\n+ Mrv2004 11072316002D \n \n+ 0 0 0 0 0 999 V3000\n+M V30 BEGIN CTAB\n+M V30 COUNTS 8 8 0 0 1\n+M V30 BEGIN ATOM\n+M V30 1 C 1.859 2.7821 0 0\n+M V30 2 C 3.2818 2.1928 0 0\n+M V30 3 C 3.8711 0.77 0 0\n+M V30 4 C 3.2818 -0.6528 0 0\n+M V30 5 C 1.859 -1.2421 0 0\n+M V30 6 C 0.4362 -0.6528 0 0\n+M V30 7 C -0.1533 0.77 0 0\n+M V30 8 C 0.4362 2.1928 0 0\n+M V30 END ATOM\n+M V30 BEGIN BOND\n+M V30 1 1 1 2\n+M V30 2 1 2 3\n+M V30 3 1 4 3 CFG=2\n+M V30 4 2 4 5\n+M V30 5 1 5 6\n+M V30 6 1 6 7\n+M V30 7 1 7 8\n+M V30 8 1 1 8\n+M V30 END BOND\n+M V30 END CTAB\n+M END)CTAB\"_ctab;\n+ //mol->debugMol(std::cerr);\n+ std::string smi = MolToCXSmiles(*mol, SmilesWriteParams());\n+ std::unique_ptr<ROMol> f(SmilesToMol(smi));\n+ mol->getBondWithIdx(3)->setStereo(Bond::BondStereo::STEREOCIS);\n+ f->getBondWithIdx(0)->setStereo(Bond::BondStereo::STEREOCIS);\n+ CHECK(MolToSmiles(*mol) == \"C1=C\\\\CCCCCC/1\");\n+ CHECK(MolToSmiles(*f) == \"C1=C\\\\CCCCCC/1\");\n+ mol->getBondWithIdx(3)->setStereo(Bond::BondStereo::STEREOTRANS);\n+ f->getBondWithIdx(0)->setStereo(Bond::BondStereo::STEREOTRANS);\n+ CHECK(MolToSmiles(*mol) == \"C1=C/CCCCCC/1\");\n+ CHECK(MolToSmiles(*f) == \"C1=C/CCCCCC/1\");\n+ }\n+ \n+}\n TEST_CASE(\"adding two wedges to chiral centers\") {\n SECTION(\"basics\") {\n auto mol = R\"CTAB(\n"}, "test": {"test_patch": "diff --git a/Code/GraphMol/FileParsers/test1.cpp b/Code/GraphMol/FileParsers/test1.cpp\nindex 7550487ba06..30fda253451 100644\n--- a/Code/GraphMol/FileParsers/test1.cpp\n+++ b/Code/GraphMol/FileParsers/test1.cpp\n@@ -4769,10 +4769,11 @@ void testGithub1034() {\n explicit_unknown_stereo)\n \n TEST_ASSERT(m->getBondWithIdx(0)->getBondType() == Bond::DOUBLE);\n- TEST_ASSERT(m->getBondWithIdx(0)->getStereo() == Bond::STEREONONE);\n+ TEST_ASSERT(m->getBondWithIdx(0)->getStereo() == Bond::STEREOANY); // now set in detectStereochemistry\n+ ROMol(*m).getBondWithIdx(0)->setStereo(Bond::STEREOCIS); // ensure we have stereo atoms\n MolOps::sanitizeMol(*m);\n TEST_ASSERT(m->getBondWithIdx(0)->getBondType() == Bond::DOUBLE);\n- TEST_ASSERT(m->getBondWithIdx(0)->getStereo() == Bond::STEREONONE);\n+ TEST_ASSERT(m->getBondWithIdx(0)->getStereo() == Bond::STEREOANY);\n TEST_ASSERT(m->getBondWithIdx(1)->getBondType() == Bond::SINGLE);\n TEST_ASSERT(m->getBondWithIdx(1)->getBondDir() == Bond::NONE);\n TEST_ASSERT(m->getBondWithIdx(2)->getBondType() == Bond::SINGLE);\n", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}229{"question_id": "MSB_rdkit_rdkit_pr6897", "question_type": "multi_swe_bench", "description": "Fixes #5819 (rdkit/rdkit#6897)", "content": {"org": "rdkit", "repo": "rdkit", "pr_number": 6897, "issue_title": "Fixes #5819", "issue_body": "This adds SMARTSQ DAT SGroups to the output for atoms which have queries.\r\n\r\nIt does not do the standard `AtomType` query, so converting the SMARTS `CC` into CTAB and back will give `[#6][#6]` as an output SMARTS. This isn't nice, but otherwise CTABs are going to end up having SMARTSQ queries on almost all atoms constructed from SMARTS, and that's potentially even worse. Something to discuss...\r\n\r\nThe example from the test starts with the SMARTS `[C,N,O]C[#6]*[$(C(=O)O)]` and produces this CTAB:\r\n```\r\n\r\n RDKit 2D\r\n\r\n 0 0 0 0 0 0 0 0 0 0999 V3000\r\nM V30 BEGIN CTAB\r\nM V30 COUNTS 5 4 1 0 0\r\nM V30 BEGIN ATOM\r\nM V30 1 [C,N,O] 0.000000 0.000000 0.000000 0\r\nM V30 2 C 1.299038 0.750000 0.000000 0\r\nM V30 3 C 2.598076 -0.000000 0.000000 0\r\nM V30 4 * 3.897114 0.750000 0.000000 0\r\nM V30 5 * 5.196152 -0.000000 0.000000 0\r\nM V30 END ATOM\r\nM V30 BEGIN BOND\r\nM V30 1 6 1 2\r\nM V30 2 6 2 3\r\nM V30 3 6 3 4\r\nM V30 4 6 4 5\r\nM V30 END BOND\r\nM V30 BEGIN SGROUP\r\nM V30 1 DAT 0 ATOMS=(1 5) QUERYTYPE=SMARTSQ QUERYOP== -\r\nM V30 FIELDDATA=\"[$(C(=O)O)]\"\r\nM V30 END SGROUP\r\nM V30 END CTAB\r\nM END\r\n```", "base_commit": "2957ab4576ddd422cba5d511e9e275ad69b8c628", "resolved_issues": [{"number": 5819, "title": "Support writing detailed SMARTS queries to CTABs using the SMARTSQ mechanism", "body": "Some discussion of this in #5718 and #5825, but the idea is to allow atom-based SMARTS queries to be serialized into v3000 mol blocks via substance groups. The trick is going to be figuring out which queries get serialized this way.\r\n\r\nImplement this using a new CTABWritingParams (or some such name) class."}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/rdkit_m_rdkit:pr-6897", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/Code/GraphMol/ChemReactions/ReactionWriter.cpp b/Code/GraphMol/ChemReactions/ReactionWriter.cpp\nindex 9e150487fde..21317021cb4 100644\n--- a/Code/GraphMol/ChemReactions/ReactionWriter.cpp\n+++ b/Code/GraphMol/ChemReactions/ReactionWriter.cpp\n@@ -103,14 +103,18 @@ std::string chemicalReactionToRxnToString(const RDKit::ChemicalReaction &rxn,\n }\n \n void write_template(std::ostringstream &res, RDKit::ROMol &tpl) {\n- if (tpl.needsUpdatePropertyCache()) {\n- tpl.updatePropertyCache(false);\n+ RDKit::RWMol trwmol(tpl);\n+\n+ if (trwmol.needsUpdatePropertyCache()) {\n+ trwmol.updatePropertyCache(false);\n }\n // to write the mol block, we need ring information:\n- if (!tpl.getRingInfo()->isInitialized()) {\n- RDKit::MolOps::findSSSR(tpl);\n+ if (!trwmol.getRingInfo()->isInitialized()) {\n+ RDKit::MolOps::findSSSR(trwmol);\n }\n- res << RDKit::FileParserUtils::getV3000CTAB(tpl, -1);\n+ RDKit::FileParserUtils::moveAdditionalPropertiesToSGroups(trwmol);\n+\n+ res << RDKit::FileParserUtils::getV3000CTAB(trwmol, -1);\n }\n \n } // namespace\ndiff --git a/Code/GraphMol/FileParsers/FileParserUtils.h b/Code/GraphMol/FileParsers/FileParserUtils.h\nindex dd19dcadd8d..529089741a8 100644\n--- a/Code/GraphMol/FileParsers/FileParserUtils.h\n+++ b/Code/GraphMol/FileParsers/FileParserUtils.h\n@@ -250,6 +250,8 @@ inline void createAtomStringPropertyList(\n missingValueMarker, lineSize));\n }\n \n+RDKIT_FILEPARSERS_EXPORT void moveAdditionalPropertiesToSGroups(RWMol &mol);\n+\n } // namespace FileParserUtils\n } // namespace RDKit\n \ndiff --git a/Code/GraphMol/FileParsers/MolFileParser.cpp b/Code/GraphMol/FileParsers/MolFileParser.cpp\nindex c55662c87a6..748746d69b4 100644\n--- a/Code/GraphMol/FileParsers/MolFileParser.cpp\n+++ b/Code/GraphMol/FileParsers/MolFileParser.cpp\n@@ -1548,7 +1548,6 @@ Atom *ParseMolFileAtomLine(const std::string_view text, RDGeom::Point3D &pos,\n << \" has a negative isotope offset. line: \" << line << std::endl;\n }\n res->setIsotope(dIso);\n- res->setProp(common_properties::_hasMassQuery, true);\n }\n \n if (text.size() >= 42 && text.substr(39, 3) != \" 0\") {\ndiff --git a/Code/GraphMol/FileParsers/MolFileWriter.cpp b/Code/GraphMol/FileParsers/MolFileWriter.cpp\nindex c0d29d80d47..579e8236324 100644\n--- a/Code/GraphMol/FileParsers/MolFileWriter.cpp\n+++ b/Code/GraphMol/FileParsers/MolFileWriter.cpp\n@@ -1,5 +1,5 @@\n //\n-// Copyright (C) 2003-2021 Greg Landrum and other RDKit contributors\n+// Copyright (C) 2003-2023 Greg Landrum and other RDKit contributors\n //\n // @@ All Rights Reserved @@\n // This file is part of the RDKit.\n@@ -1037,28 +1037,55 @@ int BondStereoCodeV2000ToV3000(int dirCode) {\n \n namespace {\n void createSMARTSQSubstanceGroups(ROMol &mol) {\n+ auto isRedundantQuery = [](const auto query) {\n+ if (query->getDescription() == \"AtomAnd\" &&\n+ (query->endChildren() - query->beginChildren() == 2) &&\n+ (*query->beginChildren())->getDescription() == \"AtomAtomicNum\" &&\n+ !(*query->beginChildren())->getNegation() &&\n+ !(*(query->beginChildren() + 1))->getNegation() &&\n+ ((*(query->beginChildren() + 1))->getDescription() == \"AtomIsotope\" ||\n+ (*(query->beginChildren() + 1))->getDescription() ==\n+ \"AtomFormalCharge\")) {\n+ return true;\n+ }\n+ return false;\n+ };\n for (const auto atom : mol.atoms()) {\n- std::string sma;\n- if (atom->hasQuery() &&\n- atom->getPropIfPresent(common_properties::MRV_SMA, sma) &&\n- !sma.empty()) {\n- SubstanceGroup sg(&mol, \"DAT\");\n- sg.setProp(\"QUERYTYPE\", \"SMARTSQ\");\n- sg.setProp(\"QUERYOP\", \"=\");\n- std::vector<std::string> dataFields{sma};\n- sg.setProp(\"DATAFIELDS\", dataFields);\n- sg.addAtomWithIdx(atom->getIdx());\n- addSubstanceGroup(mol, sg);\n+ if (atom->hasQuery()) {\n+ std::string sma;\n+\n+ if (!atom->getPropIfPresent(common_properties::MRV_SMA, sma) &&\n+ !isAtomListQuery(atom) &&\n+ atom->getQuery()->getDescription() != \"AtomNull\" &&\n+ // we may want to re-think this next one.\n+ // including AtomType queries will result in an entry\n+ // for every atom that comes from SMARTS, and I don't think\n+ // we want that.\n+ !boost::starts_with(atom->getQuery()->getDescription(), \"AtomType\") &&\n+ !boost::starts_with(atom->getQuery()->getDescription(),\n+ \"AtomAtomicNum\") &&\n+ !isRedundantQuery(atom->getQuery())) {\n+ sma = SmartsWrite::GetAtomSmarts(static_cast<const QueryAtom *>(atom));\n+ }\n+ if (!sma.empty()) {\n+ SubstanceGroup sg(&mol, \"DAT\");\n+ sg.setProp(\"QUERYTYPE\", \"SMARTSQ\");\n+ sg.setProp(\"QUERYOP\", \"=\");\n+ std::vector<std::string> dataFields{sma};\n+ sg.setProp(\"DATAFIELDS\", dataFields);\n+ sg.addAtomWithIdx(atom->getIdx());\n+ addSubstanceGroup(mol, sg);\n+ }\n }\n }\n }\n } // namespace\n-\n+namespace FileParserUtils {\n void moveAdditionalPropertiesToSGroups(RWMol &mol) {\n GenericGroups::convertGenericQueriesToSubstanceGroups(mol);\n createSMARTSQSubstanceGroups(mol);\n }\n-\n+} // namespace FileParserUtils\n const std::string GetV3000MolFileBondLine(const Bond *bond,\n const INT_MAP_INT &wedgeBonds,\n const Conformer *conf) {\n@@ -1374,7 +1401,7 @@ std::string MolToMolBlock(const ROMol &mol, bool includeStereo, int confId,\n MolOps::assignStereochemistry(trwmol);\n }\n #endif\n- moveAdditionalPropertiesToSGroups(trwmol);\n+ FileParserUtils::moveAdditionalPropertiesToSGroups(trwmol);\n \n try {\n return outputMolToMolBlock(trwmol, confId, forceV3000);\ndiff --git a/Code/GraphMol/FileParsers/file_parsers_catch.cpp b/Code/GraphMol/FileParsers/file_parsers_catch.cpp\nindex 0f4e441406a..b46fe9e4649 100644\n--- a/Code/GraphMol/FileParsers/file_parsers_catch.cpp\n+++ b/Code/GraphMol/FileParsers/file_parsers_catch.cpp\n@@ -6804,4 +6804,27 @@ TEST_CASE(\n REQUIRE(bond2->getBondType() == Bond::DOUBLE);\n CHECK(bond2->getStereo() == Bond::BondStereo::STEREONONE);\n CHECK(bond2->getBondDir() == Bond::BondDir::NONE);\n+}\n+\n+TEST_CASE(\n+ \"github #5819: Support writing detailed SMARTS queries to CTABs using the SMARTSQ mechanism\") {\n+ SECTION(\"as reported\") {\n+ auto m = \"[C,N,O]C[#6]*[$(C(=O)O)]\"_smarts;\n+ REQUIRE(m);\n+ auto ctab = MolToV3KMolBlock(*m);\n+ // std::cerr << ctab << std::endl;\n+ // make sure we still do list queries correctly\n+ CHECK(ctab.find(\"V30 1 [C,N,O]\") != std::string::npos);\n+ CHECK(ctab.find(\"FIELDDATA=\\\"[C,N,O]\") == std::string::npos);\n+ CHECK(ctab.find(\"FIELDDATA=\\\"C\\\"\") == std::string::npos);\n+ CHECK(ctab.find(\"FIELDDATA=\\\"[#6]\\\"\") == std::string::npos);\n+ CHECK(ctab.find(\"FIELDDATA=\\\"*\\\"\") == std::string::npos);\n+ CHECK(ctab.find(\"SMARTSQ\") != std::string::npos);\n+ CHECK(ctab.find(\"[$(C(=O)O)]\") != std::string::npos);\n+\n+ // make sure we can properly parse that\n+ std::unique_ptr<RWMol> nm{MolBlockToMol(ctab)};\n+ REQUIRE(nm);\n+ CHECK(MolToSmarts(*nm) == \"[#6,#7,#8][#6][#6]*[$(C(=O)O)]\");\n+ }\n }\n\\ No newline at end of file\ndiff --git a/Code/GraphMol/MarvinParse/MarvinParser.cpp b/Code/GraphMol/MarvinParse/MarvinParser.cpp\nindex f5eb1f2ccc0..ead8127f03d 100644\n--- a/Code/GraphMol/MarvinParse/MarvinParser.cpp\n+++ b/Code/GraphMol/MarvinParse/MarvinParser.cpp\n@@ -192,7 +192,6 @@ class MarvinCMLReader {\n \n if (marvinAtom->isotope != 0) {\n res->setIsotope(marvinAtom->isotope);\n- res->setProp(common_properties::_hasMassQuery, true);\n }\n \n // mrvValence and hydrogenCount both set the number of explicit hydrogens\n"}, "test": {"test_patch": "diff --git a/Code/GraphMol/ChemReactions/catch_tests.cpp b/Code/GraphMol/ChemReactions/catch_tests.cpp\nindex 38f22642d6a..c7809c5f277 100644\n--- a/Code/GraphMol/ChemReactions/catch_tests.cpp\n+++ b/Code/GraphMol/ChemReactions/catch_tests.cpp\n@@ -1584,4 +1584,75 @@ TEST_CASE(\"problematic in-place example from MolStandardize\") {\n rxn->runReactant(*m);\n CHECK(MolToSmiles(*m)==\"CN(C)c1cc[nH+]cc1\");\n }\n+}\n+\n+TEST_CASE(\n+ \"github #5819: Support writing detailed SMARTS queries to CTABs using the SMARTSQ mechanism\") {\n+ SECTION(\"as reported\") {\n+ auto rxn = \"[C;$(C([#6])=O):1][OH:2]>>[C:1][NH2:2]\"_rxnsmarts;\n+ REQUIRE(rxn);\n+ auto ctab = ChemicalReactionToV3KRxnBlock(*rxn);\n+\n+ // make sure the templates haven't been modified by that operation\n+ CHECK(getSubstanceGroups(*rxn->getReactants()[0]).empty());\n+\n+ CHECK(ctab.find(\"SMARTSQ\") != std::string::npos);\n+ CHECK(ctab.find(\"FIELDDATA=\\\"[C&$(C([#6])=O):1]\\\"\") != std::string::npos);\n+ CHECK(ctab.find(\"FIELDDATA=\\\"[N&H2:2]\\\"\") != std::string::npos);\n+\n+ // make sure we can properly parse that\n+ std::unique_ptr<ChemicalReaction> nrxn{RxnBlockToChemicalReaction(ctab)};\n+ REQUIRE(nrxn);\n+ CHECK(MolToSmarts(*nrxn->getReactants()[0]) == \"[C&$(C([#6])=O):1][O&H1:2]\");\n+ }\n+\n+\n+SECTION(\"isotopes are weird\"){\n+ auto rxnb = R\"CTAB($RXN V3000\n+\n+ Mrv2211 111620231722\n+\n+M V30 COUNTS 1 1\n+M V30 BEGIN REACTANT\n+M V30 BEGIN CTAB\n+M V30 COUNTS 4 3 0 0 0\n+M V30 BEGIN ATOM\n+M V30 1 C 6.9035 -10.0923 0 1\n+M V30 2 O 6.9035 -8.5923 0 2 MASS=18\n+M V30 3 Cl 5.6045 -10.8423 0 0\n+M V30 4 C 8.2025 -10.8423 0 4\n+M V30 END ATOM\n+M V30 BEGIN BOND\n+M V30 1 1 1 4\n+M V30 2 2 1 2\n+M V30 3 1 1 3\n+M V30 END BOND\n+M V30 END CTAB\n+M V30 END REACTANT\n+M V30 BEGIN PRODUCT\n+M V30 BEGIN CTAB\n+M V30 COUNTS 4 3 0 0 0\n+M V30 BEGIN ATOM\n+M V30 1 C 22.0416 -9.3829 0 0\n+M V30 2 C 23.3406 -8.6329 0 1\n+M V30 3 O 23.3406 -7.1329 0 2 MASS=18\n+M V30 4 C 24.6396 -9.3829 0 4\n+M V30 END ATOM\n+M V30 BEGIN BOND\n+M V30 1 1 1 2\n+M V30 2 1 2 4\n+M V30 3 2 2 3\n+M V30 END BOND\n+M V30 END CTAB\n+M V30 END PRODUCT\n+M END\n+)CTAB\";\n+ std::unique_ptr<ChemicalReaction> rxn{RxnBlockToChemicalReaction(rxnb)};\n+ REQUIRE(rxn);\n+ CHECK(rxn->getReactants()[0]->getAtomWithIdx(0)->hasQuery());\n+ CHECK(rxn->getReactants()[0]->getAtomWithIdx(1)->hasQuery());\n+ auto ctab = ChemicalReactionToV3KRxnBlock(*rxn);\n+ CHECK(ctab.find(\"SMARTSQ\") == std::string::npos);\n+\n+}\n }\n\\ No newline at end of file\n", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}230{"question_id": "MSB_rdkit_rdkit_pr6901", "question_type": "multi_swe_bench", "description": "Removing stereoatoms requires removing CIS/Trans stereo flags (rdkit/rdkit#6901)", "content": {"org": "rdkit", "repo": "rdkit", "pr_number": 6901, "issue_title": "Removing stereoatoms requires removing CIS/Trans stereo flags", "issue_body": "Fixes #6900 \r\n\r\nWhen we remove stereo atoms from a cis/trans bond we should also remove the CIS/TRANS stereo flags since they require stereo atoms for canonicalization.\r\n\r\nThis might not be the correct fix for this particular problem since we should want:\r\n\r\n\"C/C=C/N\" to fragment with the into \"*/C=C/N\" not \r\n\"*C=CN\"\r\n\r\nHowever, because we removethe first bond which affects the stereo atoms in the double bond, this causes the errors down stream.\r\n\r\nThe correct fix is probably to have a custom removeBond that detects this and handles it correctly by adding the new dummy atoms to the stereo bond.\r\n\r\nHowever this fix preserves the current behavior:\r\n\r\n```\r\nmol = MolFromSmiles(\"N/C=C/C\")\r\nfrag1 = rdMMPA.FragmentMol(mol)\r\n\r\nfor a,b in frag1:\r\n if a: print(Chem.MolToSmiles(a),end=\", \")\r\n else: print(a,end=\", \" )\r\n print(Chem.MolToSmiles(b))\r\n```\r\n\r\nresults in \r\n\r\n```\r\nNone, CC=C[*:1].N[*:1]\r\nC(=C[*:2])[*:1], C[*:1].N[*:2]\r\nNone, C[*:1].NC=C[*:1]\r\n```", "base_commit": "c2dd50fcc7099a76177f9fc63e05edcf8d3d40dd", "resolved_issues": [{"number": 6900, "title": "MMPA FragmentMol segfaults when new stereo perception is turned on", "body": "For this molecule, the MMPA fragmentation runs fine when legacy stereo perception is used but crashes otherwise\r\n\r\n```\r\n>>> from rdkit.Chem import MolFromSmiles\r\n>>> from rdkit.Chem import rdMMPA\r\n>>> from rdkit.Chem import rdmolops\r\n>>> rdmolops.SetUseLegacyStereoPerception(False)\r\n>>> mol = MolFromSmiles(\"CN1CCCN=C1/C=C/c1cccs1\")\r\n>>> frag1 = rdMMPA.FragmentMol(mol)\r\nzsh: segmentation fault python\r\n\r\n```\r\n"}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/rdkit_m_rdkit:pr-6901", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/Code/GraphMol/RWMol.cpp b/Code/GraphMol/RWMol.cpp\nindex e92e6cc5ead..d102bacaf15 100644\n--- a/Code/GraphMol/RWMol.cpp\n+++ b/Code/GraphMol/RWMol.cpp\n@@ -468,6 +468,12 @@ void RWMol::removeBond(unsigned int aid1, unsigned int aid2) {\n }\n if (std::find(obnd->getStereoAtoms().begin(), obnd->getStereoAtoms().end(),\n aid2) != obnd->getStereoAtoms().end()) {\n+ // github #6900 if we remove stereo atoms we need to remove\n+ // the CIS and or TRANS since this requires stereo atoms\n+ if (obnd->getStereo() == Bond::BondStereo::STEREOCIS ||\n+ obnd->getStereo() == Bond::BondStereo::STEREOTRANS ) {\n+ obnd->setStereo(Bond::BondStereo::STEREONONE);\n+ }\n obnd->getStereoAtoms().clear();\n }\n }\n@@ -484,6 +490,12 @@ void RWMol::removeBond(unsigned int aid1, unsigned int aid2) {\n }\n if (std::find(obnd->getStereoAtoms().begin(), obnd->getStereoAtoms().end(),\n aid1) != obnd->getStereoAtoms().end()) {\n+ // github #6900 if we remove stereo atoms we need to remove\n+ // the CIS and or TRANS since this requires stereo atoms\n+ if (obnd->getStereo() == Bond::BondStereo::STEREOCIS ||\n+ obnd->getStereo() == Bond::BondStereo::STEREOTRANS ) {\n+ obnd->setStereo(Bond::BondStereo::STEREONONE);\n+ }\n obnd->getStereoAtoms().clear();\n }\n }\ndiff --git a/Code/GraphMol/catch_chirality.cpp b/Code/GraphMol/catch_chirality.cpp\nindex c3d5c2f5849..f449aaf03de 100644\n--- a/Code/GraphMol/catch_chirality.cpp\n+++ b/Code/GraphMol/catch_chirality.cpp\n@@ -1297,6 +1297,26 @@ TEST_CASE(\"ring stereo finding is overly aggressive\", \"[chirality][bug]\") {\n Chirality::findPotentialStereo(*mol, cleanIt, flagPossible);\n CHECK(stereoInfo.size() == 2);\n }\n+ SECTION(\"Removal of stereoatoms requires removing CIS/TRANS when using legacy stereo\") {\n+ UseLegacyStereoPerceptionFixture reset_stereo_perception;\n+ Chirality::setUseLegacyStereoPerception(false);\n+\n+ {\n+ auto mol = \"N/C=C/C\"_smiles;\n+ CHECK(mol->getBondWithIdx(1)->getStereo() == Bond::BondStereo::STEREOTRANS);\n+ auto rwmol = dynamic_cast<RWMol*>(mol.get());\n+ rwmol->removeBond(0,1);\n+ CHECK(mol->getBondWithIdx(0)->getStereo() == Bond::BondStereo::STEREONONE);\n+ }\n+ {\n+ auto mol = \"N/C=C/C\"_smiles;\n+ CHECK(mol->getBondWithIdx(1)->getStereo() == Bond::BondStereo::STEREOTRANS);\n+ auto rwmol = dynamic_cast<RWMol*>(mol.get());\n+ rwmol->removeBond(2,3);\n+ CHECK(mol->getBondWithIdx(1)->getStereo() == Bond::BondStereo::STEREONONE);\n+ }\n+\t \n+ }\n }\n \n TEST_CASE(\n"}, "test": {"test_patch": "diff --git a/Code/GraphMol/MMPA/MMPA_UnitTest.cpp b/Code/GraphMol/MMPA/MMPA_UnitTest.cpp\nindex 962d2558e49..a82c1700704 100644\n--- a/Code/GraphMol/MMPA/MMPA_UnitTest.cpp\n+++ b/Code/GraphMol/MMPA/MMPA_UnitTest.cpp\n@@ -49,6 +49,7 @@\n #include <iostream>\n #include <RDGeneral/RDLog.h>\n #include <RDGeneral/utils.h>\n+#include <GraphMol/Chirality.h>\n #include \"../RDKitBase.h\"\n #include \"../FileParsers/FileParsers.h\" //MOL single molecule !\n #include \"../FileParsers/MolSupplier.h\" //SDF\n@@ -690,6 +691,14 @@ std::endl;\n //====================================================================================================\n //====================================================================================================\n \n+void testGithub6900 () {\n+ RDKit::Chirality::setUseLegacyStereoPerception(false);\n+ //auto mol = \"CN1CCCN=C1/C=C/c1cccs1\"_smiles;\n+ auto mol = \"N/C=C/C\"_smiles;\n+ std::vector<std::pair<ROMOL_SPTR, ROMOL_SPTR>> res;\n+ RDKit::MMPA::fragmentMol(*mol, res, 3);\n+ RDKit::Chirality::setUseLegacyStereoPerception(true);\n+}\n int main() {\n BOOST_LOG(rdInfoLog)\n << \"*******************************************************\\n\";\n@@ -703,7 +712,7 @@ int main() {\n #else\n setpriority(PRIO_PROCESS, getpid(), -20);\n #endif\n-\n+ testGithub6900();\n T0 = nanoClock();\n t0 = nanoClock();\n \n@@ -711,6 +720,7 @@ int main() {\n // /*\n test2();\n test3();\n+ \n // test4();\n // */\n // debugTest1(\"C[*:1].O=C(NCCO)c1c([*:1])n([O-])c2ccccc2[n+]1=O\");\n", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}231{"question_id": "MSB_rdkit_rdkit_pr7426", "question_type": "multi_swe_bench", "description": "Fixes #7367 (rdkit/rdkit#7426)", "content": {"org": "rdkit", "repo": "rdkit", "pr_number": 7426, "issue_title": "Fixes #7367", "issue_body": "Fixes #7367\r\n\r\nThe cause of the issue is simply that we don't consider the `Chem.CXSmilesFields.CX_BOND_ATROPISOMER` SMILES extension when computing the registration hash. Fixing the issue is as simple as adding it to the flags we use.\r\n\r\nWhile working on this, I noticed that `wedgeBondsFromAtropisomers()` is missing a check for ring info, since both `WedgeBondFromAtropisomerOneBond2d()` and `WedgeBondFromAtropisomerOneBond3d` require ring info and call `minBondRingSize()`.\r\n\r\n", "base_commit": "18d1ff5f8fd967a5ad3a69b90c9ea42bb48b01e1", "resolved_issues": [{"number": 7367, "title": "RegistrationHash.GetMolLayers does not distinguish atropisomers", "body": "The registration hash should be able to distinguish between atropisomers, but that's currently not the case:\r\n\r\n```python3\r\nIn [1]: from rdkit import Chem\r\n\r\nIn [2]: from rdkit.Chem import RegistrationHash\r\n\r\n# This is one of the examples from the initial atropisomers PR\r\nIn [3]: m = Chem.MolFromMolFile('RP-6306_atrop1.sdf')\r\n\r\nIn [4]: b = m.GetBondWithIdx(3)\r\n\r\n# The atropisomer was correctly identified\r\nIn [5]: b.GetStereo()\r\nOut[5]: rdkit.Chem.rdchem.BondStereo.STEREOATROPCW\r\n\r\nIn [6]: hash1 = RegistrationHash.GetMolLayers(m, enable_tautomer_hash_v2=True)\r\n\r\n# No atropisomer info in the hash: for SMILES, it's encoded in the CX extension, which is not part of the hash\r\nIn [7]: print(hash1)\r\n{\r\n<HashLayer.CANONICAL_SMILES: 1>: 'Cc1cc2c(C(N)=O)c(N)n(-c3c(C)ccc(O)c3C)c2nc1C', \r\n<HashLayer.ESCAPE: 2>: '', \r\n<HashLayer.FORMULA: 3>: 'C18H20N4O2', \r\n<HashLayer.NO_STEREO_SMILES: 4>: 'Cc1cc2c(C(N)=O)c(N)n(-c3c(C)ccc(O)c3C)c2nc1C', \r\n<HashLayer.NO_STEREO_TAUTOMER_HASH: 5>: '[C]:[C]1:[N]:[C]2:[C](:[C]:[C]:1-[CH3]):[C](:[C](:[N]):[O]):[C](:[N]):[N]:2:[C]1:[C](-[CH3]):[C]:[C]:[C](:[O]):[C]:1-[CH3]_11_0', \r\n<HashLayer.SGROUP_DATA: 6>: '[]', \r\n<HashLayer.TAUTOMER_HASH: 7>: '[C]:[C]1:[N]:[C]2:[C](:[C]:[C]:1-[CH3]):[C](:[C](:[N]):[O]):[C](:[N]):[N]:2:[C]1:[C](-[CH3]):[C]:[C]:[C](:[O]):[C]:1-[CH3]_11_0'\r\n}\r\n\r\n# Now, reverse the atropisomer\r\nIn [8]: b.SetStereo(Chem.BondStereo.STEREOATROPCCW)\r\n\r\nIn [9]: hash2 = RegistrationHash.GetMolLayers(m, enable_tautomer_hash_v2=True)\r\n\r\n# No atropisomer info either\r\nIn [10]: print(hash2)\r\n{\r\n<HashLayer.CANONICAL_SMILES: 1>: 'Cc1cc2c(C(N)=O)c(N)n(-c3c(C)ccc(O)c3C)c2nc1C', \r\n<HashLayer.ESCAPE: 2>: '', \r\n<HashLayer.FORMULA: 3>: 'C18H20N4O2', \r\n<HashLayer.NO_STEREO_SMILES: 4>: 'Cc1cc2c(C(N)=O)c(N)n(-c3c(C)ccc(O)c3C)c2nc1C', \r\n<HashLayer.NO_STEREO_TAUTOMER_HASH: 5>: '[C]:[C]1:[N]:[C]2:[C](:[C]:[C]:1-[CH3]):[C](:[C](:[N]):[O]):[C](:[N]):[N]:2:[C]1:[C](-[CH3]):[C]:[C]:[C](:[O]):[C]:1-[CH3]_11_0', \r\n<HashLayer.SGROUP_DATA: 6>: '[]', \r\n<HashLayer.TAUTOMER_HASH: 7>: '[C]:[C]1:[N]:[C]2:[C](:[C]:[C]:1-[CH3]):[C](:[C](:[N]):[O]):[C](:[N]):[N]:2:[C]1:[C](-[CH3]):[C]:[C]:[C](:[O]):[C]:1-[CH3]_11_0'\r\n}\r\n\r\n# We'd want these to be different to deduplicate the atropisomers, but ...\r\nIn [11]: hash1 != hash2\r\nOut[11]: False\r\n```"}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/rdkit_m_rdkit:pr-7426", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/Code/GraphMol/Atropisomers.cpp b/Code/GraphMol/Atropisomers.cpp\nindex 1ea48d7b588..e82f86bffd4 100644\n--- a/Code/GraphMol/Atropisomers.cpp\n+++ b/Code/GraphMol/Atropisomers.cpp\n@@ -1166,6 +1166,12 @@ void wedgeBondsFromAtropisomers(\n &wedgeBonds) {\n PRECONDITION(conf == nullptr || &(conf->getOwningMol()) == &mol,\n \"conformer does not belong to molecule\");\n+\n+ // WedgeBondFromAtropisomerOneBond 2d/3d requires ring bond counts\n+ if (!mol.getRingInfo()->isSssrOrBetter()) {\n+ RDKit::MolOps::findSSSR(mol);\n+ }\n+\n for (auto bond : mol.bonds()) {\n auto bondStereo = bond->getStereo();\n \ndiff --git a/rdkit/Chem/RegistrationHash.py b/rdkit/Chem/RegistrationHash.py\nindex 23c483d9eb4..0d70cc8e71b 100644\n--- a/rdkit/Chem/RegistrationHash.py\n+++ b/rdkit/Chem/RegistrationHash.py\n@@ -35,7 +35,8 @@\n \n logger = logging.getLogger(__name__)\n \n-DEFAULT_CXFLAG = Chem.CXSmilesFields.CX_ATOM_LABELS | Chem.CXSmilesFields.CX_ENHANCEDSTEREO\n+DEFAULT_CXFLAG = (Chem.CXSmilesFields.CX_ATOM_LABELS | Chem.CXSmilesFields.CX_ENHANCEDSTEREO\n+ | Chem.CXSmilesFields.CX_BOND_ATROPISOMER)\n \n ENHANCED_STEREO_GROUP_REGEX = re.compile(r'((?:a|[&o]\\d+):\\d+(?:,\\d+)*)')\n \n"}, "test": {"test_patch": "diff --git a/Code/GraphMol/SmilesParse/catch_tests.cpp b/Code/GraphMol/SmilesParse/catch_tests.cpp\nindex 7495ecb61da..9a74f6b1562 100644\n--- a/Code/GraphMol/SmilesParse/catch_tests.cpp\n+++ b/Code/GraphMol/SmilesParse/catch_tests.cpp\n@@ -2801,9 +2801,34 @@ TEST_CASE(\"Github #7295\") {\n auto smi2 = MolToSmiles(*m);\n CHECK(smi1 == smi2);\n auto m2(*m);\n- bool cleanIt=true;\n+ bool cleanIt = true;\n MolOps::assignStereochemistry(m2, cleanIt);\n auto smi3 = MolToSmiles(m2);\n CHECK(smi1 == smi3);\n }\n-}\n\\ No newline at end of file\n+}\n+\n+TEST_CASE(\"CX_BOND_ATROPISOMER option requires ring info\", \"[bug][cxsmiles]\") {\n+ std::string rdbase = getenv(\"RDBASE\");\n+ std::string fName =\n+ rdbase +\n+ \"/Code/GraphMol/FileParsers/test_data/atropisomers/RP-6306_atrop1.sdf\";\n+\n+ auto m = v2::FileParsers::MolFromMolFile(fName);\n+ REQUIRE(m);\n+\n+ auto atropBond = m->getBondWithIdx(3);\n+ REQUIRE(atropBond->getStereo() == Bond::STEREOATROPCW);\n+\n+ // Clear ring info to check that atropisomer wedging doesn't fail\n+ // if the info is not present\n+ bool includeRingInfo = true;\n+ m->clearComputedProps(includeRingInfo);\n+\n+ auto ps = SmilesWriteParams();\n+ auto flags = SmilesWrite::CXSmilesFields::CX_BOND_ATROPISOMER;\n+\n+ // This will fail if there's no ring information\n+ auto smi = MolToCXSmiles(*m, ps, flags);\n+ CHECK(smi == \"Cc1cc2c(C(N)=O)c(N)n(-c3c(C)ccc(O)c3C)c2nc1C |wD:10.9|\");\n+}\ndiff --git a/rdkit/Chem/UnitTestRegistrationHash.py b/rdkit/Chem/UnitTestRegistrationHash.py\nindex 152b7b68f11..de9c13eb394 100644\n--- a/rdkit/Chem/UnitTestRegistrationHash.py\n+++ b/rdkit/Chem/UnitTestRegistrationHash.py\n@@ -5,9 +5,11 @@\n are actually the same.\n \"\"\"\n \n+import os\n import unittest\n \n from rdkit import Chem\n+from rdkit import RDConfig\n from rdkit.Chem import RegistrationHash\n from rdkit.Chem.RegistrationHash import HashLayer\n \n@@ -806,6 +808,42 @@ def test_tautomer_v2_hash(self):\n RegistrationHash.GetMolHash(\n keto_layers, hash_scheme=RegistrationHash.HashScheme.TAUTOMER_INSENSITIVE_LAYERS))\n \n+ def testAtropisomer(self):\n+ atropTestFile = os.path.join(\n+ RDConfig.RDBaseDir, 'Code/GraphMol/FileParsers/test_data/atropisomers/RP-6306_atrop1.sdf')\n+ mol = Chem.MolFromMolFile(atropTestFile)\n+\n+ bond = mol.GetBondWithIdx(3)\n+ self.assertEqual(bond.GetStereo(), Chem.BondStereo.STEREOATROPCW)\n+\n+ layersCw = RegistrationHash.GetMolLayers(mol)\n+\n+ smiles1, smiExt1 = layersCw[HashLayer.CANONICAL_SMILES].split()\n+ taut1, tautExt1 = layersCw[HashLayer.TAUTOMER_HASH].split()\n+ self.assertEqual(smiles1, 'Cc1cc2c(C(N)=O)c(N)n(-c3c(C)ccc(O)c3C)c2nc1C')\n+ self.assertEqual(\n+ taut1,\n+ 'C[C]1[CH][C]2[C]([C]([N])[O])[C]([N])N([C]3[C](C)[CH][CH][C]([O])[C]3C)[C]2[N][C]1C_5_0')\n+ self.assertEqual(smiExt1, '|wD:10.9|')\n+ self.assertEqual(smiExt1, tautExt1)\n+\n+ # Now look at the other atropisomer\n+ bond = mol.GetBondWithIdx(3)\n+ bond.SetStereo(Chem.BondStereo.STEREOATROPCCW)\n+\n+ # Hashes should not match\n+ layersCcw = RegistrationHash.GetMolLayers(mol)\n+ self.assertNotEqual(layersCw, layersCcw)\n+\n+ smiles2, smiExt2 = layersCcw[HashLayer.CANONICAL_SMILES].split()\n+ taut2, tautExt2 = layersCcw[HashLayer.TAUTOMER_HASH].split()\n+\n+ # SMILES and tautomer hash should be the same, but the extensions must be different\n+ self.assertEqual(smiles2, smiles1)\n+ self.assertEqual(taut2, taut1)\n+ self.assertEqual(smiExt2, '|wD:10.20|') # same atom, but \"down\" wedge on a different bond\n+ self.assertEqual(smiExt2, tautExt2)\n+\n \n if __name__ == '__main__': # pragma: nocover\n unittest.main()\n", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}232{"question_id": "MSB_rdkit_rdkit_pr7564", "question_type": "multi_swe_bench", "description": "Fixes #7552 (rdkit/rdkit#7564)", "content": {"org": "rdkit", "repo": "rdkit", "pr_number": 7564, "issue_title": "Fixes #7552", "issue_body": "This adds code to recognize tetrahedral centers which are involved in more than one ring with < members and be more tolerant when checking their geometries.", "base_commit": "806a5e931afa0f5de9d5a815c167049e6b58570f", "resolved_issues": [{"number": 7552, "title": "AllChem.EmbedMolecule returns -1", "body": "Howdy,\r\n\r\nI want to get the 3D conformation information for any given molecule; however, some molecules fail to produce the conformer. Following is the code that reproduces the issue.\r\n\r\n`from rdkit import Chem`\r\n`from rdkit.Chem import AllChem`\r\n`sample_smiles = 'O=CCC1OC2COC12'`\r\n`mol = Chem.AddHs(Chem.MolFromSmiles(sample_smiles))`\r\n`AllChem.EmbedMolecule(mol) # -1`\r\n\r\nIf the molecule can generate conformation information, `AllChem.EmbedMolecule()` would return 0; I have identified many smiles/molecules that result in -1 when calling `AllChem.EmbedMolecule(mol)` , you may find some of those smiles in the picture below.\r\n\r\n\r\n\r\nAppreciate any suggestions! \r\n\r\n"}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/rdkit_m_rdkit:pr-7564", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/Code/DistGeom/ChiralSet.h b/Code/DistGeom/ChiralSet.h\nindex 6b9a077dfe6..a1b26035cb0 100644\n--- a/Code/DistGeom/ChiralSet.h\n+++ b/Code/DistGeom/ChiralSet.h\n@@ -17,6 +17,11 @@\n \n namespace DistGeom {\n \n+enum class ChiralSetStructureFlags : std::uint64_t {\n+ IN_FUSED_SMALL_RINGS =\n+ 1 << 0, // a chiral center involved in fusing 2 or more small rings\n+};\n+\n /*! \\brief Class used to store a quartet of points and chiral volume bounds on\n *them\n *\n@@ -30,17 +35,20 @@ class RDKIT_DISTGEOMETRY_EXPORT ChiralSet {\n unsigned int d_idx4;\n double d_volumeLowerBound;\n double d_volumeUpperBound;\n+ std::uint64_t d_structureFlags =\n+ 0; // used to track special cases that may make embedding more difficult\n \n ChiralSet(unsigned int pid0, unsigned int pid1, unsigned int pid2,\n unsigned int pid3, unsigned int pid4, double lowerVolBound,\n- double upperVolBound)\n+ double upperVolBound, std::uint64_t structureFlags = 0)\n : d_idx0(pid0),\n d_idx1(pid1),\n d_idx2(pid2),\n d_idx3(pid3),\n d_idx4(pid4),\n d_volumeLowerBound(lowerVolBound),\n- d_volumeUpperBound(upperVolBound) {\n+ d_volumeUpperBound(upperVolBound),\n+ d_structureFlags(structureFlags) {\n CHECK_INVARIANT(lowerVolBound <= upperVolBound, \"Inconsistent bounds\\n\");\n d_volumeLowerBound = lowerVolBound;\n d_volumeUpperBound = upperVolBound;\ndiff --git a/Code/GraphMol/DistGeomHelpers/Embedder.cpp b/Code/GraphMol/DistGeomHelpers/Embedder.cpp\nindex 1ce159a81df..ee97ccde868 100644\n--- a/Code/GraphMol/DistGeomHelpers/Embedder.cpp\n+++ b/Code/GraphMol/DistGeomHelpers/Embedder.cpp\n@@ -308,12 +308,21 @@ bool _volumeTest(const DistGeom::ChiralSetPtr &chiralSet,\n RDGeom::Point3D v4 = p0 - p4;\n v4.normalize();\n \n+ // be more tolerant of tethrahedral centers that are involved in multiple\n+ // small rings\n+ double volScale = 1;\n+ if (chiralSet->d_structureFlags &\n+ static_cast<std::uint64_t>(\n+ DistGeom::ChiralSetStructureFlags::IN_FUSED_SMALL_RINGS)) {\n+ volScale = 0.25;\n+ }\n+\n RDGeom::Point3D crossp = v1.crossProduct(v2);\n double vol = crossp.dotProduct(v3);\n if (verbose) {\n std::cerr << \" \" << fabs(vol) << std::endl;\n }\n- if (fabs(vol) < MIN_TETRAHEDRAL_CHIRAL_VOL) {\n+ if (fabs(vol) < volScale * MIN_TETRAHEDRAL_CHIRAL_VOL) {\n return false;\n }\n crossp = v1.crossProduct(v2);\n@@ -321,7 +330,7 @@ bool _volumeTest(const DistGeom::ChiralSetPtr &chiralSet,\n if (verbose) {\n std::cerr << \" \" << fabs(vol) << std::endl;\n }\n- if (fabs(vol) < MIN_TETRAHEDRAL_CHIRAL_VOL) {\n+ if (fabs(vol) < volScale * MIN_TETRAHEDRAL_CHIRAL_VOL) {\n return false;\n }\n crossp = v1.crossProduct(v3);\n@@ -329,7 +338,7 @@ bool _volumeTest(const DistGeom::ChiralSetPtr &chiralSet,\n if (verbose) {\n std::cerr << \" \" << fabs(vol) << std::endl;\n }\n- if (fabs(vol) < MIN_TETRAHEDRAL_CHIRAL_VOL) {\n+ if (fabs(vol) < volScale * MIN_TETRAHEDRAL_CHIRAL_VOL) {\n return false;\n }\n crossp = v2.crossProduct(v3);\n@@ -337,7 +346,7 @@ bool _volumeTest(const DistGeom::ChiralSetPtr &chiralSet,\n if (verbose) {\n std::cerr << \" \" << fabs(vol) << std::endl;\n }\n- return fabs(vol) >= MIN_TETRAHEDRAL_CHIRAL_VOL;\n+ return fabs(vol) >= volScale * MIN_TETRAHEDRAL_CHIRAL_VOL;\n }\n \n bool _sameSide(const RDGeom::Point3D &v1, const RDGeom::Point3D &v2,\n@@ -1035,19 +1044,33 @@ void findChiralSets(const ROMol &mol, DistGeom::VECT_CHIRALSET &chiralCenters,\n nbrs.insert(nbrs.end(), atom->getIdx());\n }\n \n+ // set a flag for tetrahedral centers that are in multiple small rings\n+ auto numSmallRings = 0u;\n+ constexpr int smallRingSize = 5;\n+ for (const auto sz : mol.getRingInfo()->atomRingSizes(atom->getIdx())) {\n+ if (sz < smallRingSize) {\n+ ++numSmallRings;\n+ }\n+ }\n+ std::uint64_t structureFlags = 0;\n+ if (numSmallRings > 1) {\n+ structureFlags = static_cast<std::uint64_t>(\n+ DistGeom::ChiralSetStructureFlags::IN_FUSED_SMALL_RINGS);\n+ }\n+\n // now create a chiral set and set the upper and lower bound on the\n // volume\n if (chiralType == Atom::CHI_TETRAHEDRAL_CCW) {\n // positive chiral volume\n- auto *cset =\n- new DistGeom::ChiralSet(atom->getIdx(), nbrs[0], nbrs[1], nbrs[2],\n- nbrs[3], volLowerBound, volUpperBound);\n+ auto *cset = new DistGeom::ChiralSet(atom->getIdx(), nbrs[0], nbrs[1],\n+ nbrs[2], nbrs[3], volLowerBound,\n+ volUpperBound, structureFlags);\n DistGeom::ChiralSetPtr cptr(cset);\n chiralCenters.push_back(cptr);\n } else if (chiralType == Atom::CHI_TETRAHEDRAL_CW) {\n- auto *cset =\n- new DistGeom::ChiralSet(atom->getIdx(), nbrs[0], nbrs[1], nbrs[2],\n- nbrs[3], -volUpperBound, -volLowerBound);\n+ auto *cset = new DistGeom::ChiralSet(atom->getIdx(), nbrs[0], nbrs[1],\n+ nbrs[2], nbrs[3], -volUpperBound,\n+ -volLowerBound, structureFlags);\n DistGeom::ChiralSetPtr cptr(cset);\n chiralCenters.push_back(cptr);\n } else {\n@@ -1059,8 +1082,9 @@ void findChiralSets(const ROMol &mol, DistGeom::VECT_CHIRALSET &chiralCenters,\n // the coordMap\n // there's no sense doing 3-rings because those are a nightmare\n } else {\n- auto *cset = new DistGeom::ChiralSet(\n- atom->getIdx(), nbrs[0], nbrs[1], nbrs[2], nbrs[3], 0.0, 0.0);\n+ auto *cset = new DistGeom::ChiralSet(atom->getIdx(), nbrs[0],\n+ nbrs[1], nbrs[2], nbrs[3], 0.0,\n+ 0.0, structureFlags);\n DistGeom::ChiralSetPtr cptr(cset);\n tetrahedralCenters.push_back(cptr);\n }\n"}, "test": {"test_patch": "diff --git a/Code/GraphMol/DistGeomHelpers/catch_tests.cpp b/Code/GraphMol/DistGeomHelpers/catch_tests.cpp\nindex 530c4a6f282..3eae46fa321 100644\n--- a/Code/GraphMol/DistGeomHelpers/catch_tests.cpp\n+++ b/Code/GraphMol/DistGeomHelpers/catch_tests.cpp\n@@ -985,4 +985,34 @@ TEST_CASE(\"terminal groups in pruning\") {\n CHECK(cids.size() >= 2);\n }\n }\n+}\n+\n+TEST_CASE(\"github #7552\") {\n+ DGeomHelpers::EmbedParameters ps = DGeomHelpers::ETKDGv3;\n+ ps.randomSeed = 0xf00d;\n+ SECTION(\"as reported\") {\n+ auto mol = \"O=CCC1OC2COC12\"_smiles;\n+ REQUIRE(mol);\n+ MolOps::addHs(*mol);\n+ CHECK(DGeomHelpers::EmbedMolecule(*mol, ps) == 0);\n+ }\n+ SECTION(\"as reported, bulk\") {\n+ std::vector<std::string> smileses{\n+ \"O=CCC1OC2COC12\", \"O=C1OC2CCC12C#N\", \"CC1C2CC3OC2C13O\",\n+ \"CC12CC1C3(C)OCC23\", \"OC1C2COC13COC23\", \"OC1C2C3C2N4C3CC14\",\n+ \"CC1OC12C3CC2(O)C3\", \"OC1C2CC3C2CCC13\", \"CN1CC2(O)C3CC3C12\",\n+ \"C1OC2C3C4C5C4C12N35\", \"C1OC2CC3OC12C=C3\", \"C1C2OC3C1OC23\",\n+ \"CC1(O)CC2CCC12\", \"CC12NC(=O)C1C3OC23\", \"OC1CC2(NCCC12)C#N\",\n+ \"CC12C3C1C(=O)C3C2O\", \"C1C=C2C3OC4C3N1C24\", \"CC12C3C1C4=NC3C2O4\",\n+ \"C1OC23C=CC4C2N4C13\", \"OCC12CNC1C(=O)N2\", \"CC1C2C3C1C(C#C)n23\",\n+\n+ };\n+ for (const auto &smiles : smileses) {\n+ INFO(smiles);\n+ auto mol = v2::SmilesParse::MolFromSmiles(smileses[0]);\n+ REQUIRE(mol);\n+ MolOps::addHs(*mol);\n+ CHECK(DGeomHelpers::EmbedMolecule(*mol, ps) == 0);\n+ }\n+ }\n }\n\\ No newline at end of file\n", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}233{"question_id": "MSB_rdkit_rdkit_pr7657", "question_type": "multi_swe_bench", "description": "Fixes #7364 (rdkit/rdkit#7657)", "content": {"org": "rdkit", "repo": "rdkit", "pr_number": 7657, "issue_title": "Fixes #7364", "issue_body": "make sure we only use the H-stripped molecule in the BCUT calculation", "base_commit": "4f7a7d05235ee6e85b10edf92ee4a1046116be58", "resolved_issues": [{"number": 7364, "title": "Pre-condition violations for BCUT descriptor calculations", "body": "**Describe the bug**\r\nI receive pre-condition violations for every molecule I've tested when calculating BCUT descriptors. Our standardization code adds H's to each molecule first. The violations print out in my notebook multiple times per molecule and (sometimes multiple) per descriptor, resulting in thousands of outputs and eventually crashing my notebook. The descriptors that cause it are:\r\n```\r\n('BCUT2D_MWHI',\r\n 'BCUT2D_MWLOW',\r\n 'BCUT2D_CHGHI',\r\n 'BCUT2D_CHGLO',\r\n 'BCUT2D_LOGPHI',\r\n 'BCUT2D_LOGPLOW',\r\n 'BCUT2D_MRHI',\r\n 'BCUT2D_MRLOW')\r\n```\r\nAnd the violation repeatedly reads:\r\n\r\n```\r\n****\r\nPre-condition Violation\r\nbad result vector size\r\nViolation occurred on line 40 in file /project/build/temp.linux-aarch64-cpython-39/rdkit/Code/GraphMol/Descriptors/Crippen.cpp\r\nFailed Expression: logpContribs.size() == mol.getNumAtoms() && mrContribs.size() == mol.getNumAtoms()\r\n----------\r\nStacktrace:\r\n----------\r\n****\r\n```\r\nIt also seems to be somewhat dependent on first calling AddHs and/or passing the descriptors in an iterable vs a single descriptor, although I don't know why that's the case.\r\n\r\n**To Reproduce**\r\n```\r\nsmiles='C#CCC(C(=O)c1ccc(C)cc1)N1CCCC1'\r\n\r\nfrom rdkit import Chem\r\nmol=Chem.MolFromSmiles(smiles)\r\nmol=Chem.AddHs(mol)\r\n\r\nfrom rdkit.Chem import Descriptors\r\nfrom rdkit.ML.Descriptors import MoleculeDescriptors\r\ncalc = MoleculeDescriptors.MolecularDescriptorCalculator([x[0] for x in Descriptors._descList])\r\n\r\ndesc_names = calc.GetDescriptorNames()\r\n\r\ncalc=MoleculeDescriptors.MolecularDescriptorCalculator(['BCUT2D_MWHI'])\r\ndescriptors = calc.CalcDescriptors(mol)\r\n```\r\n**Expected behavior**\r\nI'd like the warnings not to appear and not crash my notebook. \r\n\r\n**Screenshots**\r\n<img width=\"808\" alt=\"image\" src=\"https://github.com/rdkit/rdkit/assets/64031328/44e91a75-a5ce-4af1-8ac2-20d842dcaf71\">\r\n\r\n**Configuration (please complete the following information):**\r\n - RDKit version: 2023.9.5 (It happens for 2023.9.X but not 2023.3.3)\r\n - OS: [e.g. Ubuntu 20.04] Apple M2 Max running Ubuntu Lunar 23.04 ARM64 on a VM.\r\n - Python version (if relevant):\r\n Python 3.9.17 (main, Aug 21 2023, 10:36:40) \r\n [GCC 12.3.0] on linux\r\n - Are you using conda? No\r\n - If you are using conda, which channel did you install the rdkit from? NA\r\n - If you are not using conda: how did you install the RDKit? `pip install rdkit==2023.9.5`\r\n\r\n**Additional context**\r\nI believe it is NOT ARM-specific since my colleagues see the same issue on regular Linux/Ubuntu with the 2023.9.X versions."}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/rdkit_m_rdkit:pr-7657", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/Code/GraphMol/Descriptors/BCUT.cpp b/Code/GraphMol/Descriptors/BCUT.cpp\nindex 35ec90b9627..8b160c21095 100644\n--- a/Code/GraphMol/Descriptors/BCUT.cpp\n+++ b/Code/GraphMol/Descriptors/BCUT.cpp\n@@ -68,8 +68,8 @@ std::unique_ptr<Eigen::MatrixXd> make_burden(const ROMol &m) {\n \n std::pair<double, double> BCUT2D(std::unique_ptr<Eigen::MatrixXd> &burden,\n const std::vector<double> &atom_props) {\n- if(atom_props.empty()) {\n- return std::pair<double,double>(0.0,0.0);\n+ if (atom_props.empty()) {\n+ return std::pair<double, double>(0.0, 0.0);\n }\n \n for (unsigned int i = 0; i < atom_props.size(); ++i) {\n@@ -107,16 +107,15 @@ std::pair<double, double> BCUT2D(const ROMol &m,\n }\n \n std::vector<double> BCUT2D(const ROMol &m) {\n- unsigned int num_atoms = m.getNumAtoms();\n- if(num_atoms == 0) {\n- return std::vector<double>(NUM_BCUTS, 0.0);\n+ if (!m.getNumAtoms()) {\n+ return std::vector<double>(NUM_BCUTS, 0.0);\n }\n-\n- std::unique_ptr<ROMol> mol(MolOps::removeHs(m));\n+ std::unique_ptr<ROMol> mol(MolOps::removeAllHs(m));\n+ unsigned int numAtoms = mol->getNumAtoms();\n std::vector<double> masses;\n std::vector<double> charges;\n- masses.reserve(num_atoms);\n- charges.reserve(num_atoms);\n+ masses.reserve(numAtoms);\n+ charges.reserve(numAtoms);\n \n RDKit::computeGasteigerCharges(*mol, 12, true);\n for (auto &atom : mol->atoms()) {\n@@ -125,13 +124,12 @@ std::vector<double> BCUT2D(const ROMol &m) {\n atom->getProp<double>(common_properties::_GasteigerCharge));\n }\n \n- std::vector<double> slogp(num_atoms, 0.0);\n- std::vector<double> cmr(num_atoms, 0.0);\n+ std::vector<double> slogp(numAtoms, 0.0);\n+ std::vector<double> cmr(numAtoms, 0.0);\n getCrippenAtomContribs(*mol, slogp, cmr);\n-\n // polarizability? - need model\n // slogp? sasa?\n- auto burden = make_burden(m);\n+ auto burden = make_burden(*mol);\n auto atom_bcut = BCUT2D(burden, masses);\n auto gasteiger = BCUT2D(burden, charges);\n auto logp = BCUT2D(burden, slogp);\n"}, "test": {"test_patch": "diff --git a/Code/GraphMol/Descriptors/catch_tests.cpp b/Code/GraphMol/Descriptors/catch_tests.cpp\nindex 8c512bc732c..bcac0b2dd7c 100644\n--- a/Code/GraphMol/Descriptors/catch_tests.cpp\n+++ b/Code/GraphMol/Descriptors/catch_tests.cpp\n@@ -20,6 +20,7 @@\n #include <GraphMol/Descriptors/OxidationNumbers.h>\n #include <GraphMol/Descriptors/PMI.h>\n #include <GraphMol/Descriptors/DCLV.h>\n+#include <GraphMol/Descriptors/BCUT.h>\n \n using namespace RDKit;\n \n@@ -605,3 +606,16 @@ TEST_CASE(\"DCLV\") {\n CHECK(dclv.getVDWVolume() == Catch::Approx(139.97).epsilon(0.05));\n }\n }\n+\n+TEST_CASE(\"Github #7364: BCUT descriptors failing for moleucles with Hs\") {\n+ SECTION(\"as reported\") {\n+ auto m = \"CCOC#CCC(C(=O)c1ccc(C)cc1)N1CCCC1\"_smiles;\n+ REQUIRE(m);\n+ RWMol m2 = *m;\n+ MolOps::addHs(m2);\n+ auto ref = Descriptors::BCUT2D(*m);\n+ auto val = Descriptors::BCUT2D(m2);\n+ CHECK(ref.size() == val.size());\n+ CHECK(ref == val);\n+ }\n+}\n\\ No newline at end of file\n", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}234{"question_id": "MSB_rdkit_rdkit_pr7664", "question_type": "multi_swe_bench", "description": "Fixes #6757 (rdkit/rdkit#7664)", "content": {"org": "rdkit", "repo": "rdkit", "pr_number": 7664, "issue_title": "Fixes #6757", "issue_body": "Simple change to make sure we have called `assignStereochemistry()` before doing the work in `numAtomStereoCenters()` and `numUnspecifiedAtomStereoCenters()`", "base_commit": "3f3ff3858a5288fb653aa652494718648c405732", "resolved_issues": [{"number": 6757, "title": "rdMolDescriptors.CalcNumAtomStereoCenters fails on Sanitized Molecule", "body": "**Describe the bug**\r\n`rdMolDescriptors.CalcNumAtomStereoCenters` fails to find stereo centers if a molecule is sanitized (twice).\r\nI had assumed this was deuterium-related, but it appears to affect other stereo centers as well (see https://github.com/rdkit/rdkit/discussions/6657).\r\n\r\n**To Reproduce**\r\n```python\r\nfrom rdkit import Chem\r\nfrom rdkit.Chem import rdMolDescriptors\r\n\r\nsmi = \"[2H][C@@](C)(N)C(=O)O\"\r\nmol1 = Chem.MolFromSmiles(smi)\r\ncip_count1 = sum([atom.HasProp(\"_CIPCode\") for atom in mol1.GetAtoms()])\r\nstereocenters1 = rdMolDescriptors.CalcNumAtomStereoCenters(mol1)\r\n\r\n\r\nmol2 = Chem.Mol(mol1)\r\nChem.SanitizeMol(mol2)\r\ncip_count2 = sum([atom.HasProp(\"_CIPCode\") for atom in mol2.GetAtoms()])\r\ntry:\r\n stereocenters2 = rdMolDescriptors.CalcNumAtomStereoCenters(mol2)\r\nexcept: # ValueError: numStereoCenters called without stereo being assigned\r\n stereocenters2 = 0\r\n\r\nassert cip_count1 == cip_count2\r\nassert stereocenters1 == stereocenters2 # Fails. 1 != 0\r\n```\r\n\r\n**Expected behavior**\r\nOne stereo center should be detected for both molecules. \r\nThe properties `_CIPCode` and `_ChiralityPossible` are still correct so I've been counting atom CIPCodes as a workaround.\r\n\r\n\r\n**Configuration:**\r\n - RDKit version: 2022.9.5 (linked discussion is on 2023.03.3)\r\n - OS: Ubuntu 22.04.3\r\n - Python version: 3.9\r\n - Are you using conda? No\r\n - How did you install the RDKit? rdkit-pypi via Poetry\r\n"}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/rdkit_m_rdkit:pr-7664", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/Code/GraphMol/Chirality.cpp b/Code/GraphMol/Chirality.cpp\nindex e5a40ddee69..d4c1f35e931 100644\n--- a/Code/GraphMol/Chirality.cpp\n+++ b/Code/GraphMol/Chirality.cpp\n@@ -2771,6 +2771,10 @@ void assignStereochemistry(ROMol &mol, bool cleanIt, bool force,\n return;\n }\n \n+ if (mol.needsUpdatePropertyCache()) {\n+ mol.updatePropertyCache(false);\n+ }\n+\n if (!Chirality::getUseLegacyStereoPerception()) {\n Chirality::stereoPerception(mol, cleanIt, flagPossibleStereoCenters);\n } else {\ndiff --git a/Code/GraphMol/Descriptors/Lipinski.cpp b/Code/GraphMol/Descriptors/Lipinski.cpp\nindex e0b044aed34..d80727f8184 100644\n--- a/Code/GraphMol/Descriptors/Lipinski.cpp\n+++ b/Code/GraphMol/Descriptors/Lipinski.cpp\n@@ -506,36 +506,46 @@ bool hasStereoAssigned(const ROMol &mol) {\n return mol.hasProp(common_properties::_StereochemDone);\n }\n } // namespace\n-const std::string NumAtomStereoCentersVersion = \"1.0.0\";\n+const std::string NumAtomStereoCentersVersion = \"1.0.1\";\n unsigned int numAtomStereoCenters(const ROMol &mol) {\n+ std::unique_ptr<ROMol> tmol;\n+ const ROMol *mptr = &mol;\n if (!hasStereoAssigned(mol)) {\n- throw ValueErrorException(\n- \"numStereoCenters called without stereo being assigned\");\n+ tmol.reset(new ROMol(mol));\n+ constexpr bool cleanIt = true;\n+ constexpr bool force = true;\n+ constexpr bool flagPossible = true;\n+ MolOps::assignStereochemistry(*tmol, cleanIt, force, flagPossible);\n+ mptr = tmol.get();\n }\n \n unsigned int res = 0;\n- for (ROMol::ConstAtomIterator atom = mol.beginAtoms(); atom != mol.endAtoms();\n- ++atom) {\n- if ((*atom)->hasProp(common_properties::_ChiralityPossible)) {\n- res++;\n+ for (const auto &atom : mptr->atoms()) {\n+ if (atom->hasProp(common_properties::_ChiralityPossible)) {\n+ ++res;\n }\n }\n return res;\n }\n \n-const std::string NumUnspecifiedAtomStereoCentersVersion = \"1.0.0\";\n+const std::string NumUnspecifiedAtomStereoCentersVersion = \"1.0.1\";\n unsigned int numUnspecifiedAtomStereoCenters(const ROMol &mol) {\n+ std::unique_ptr<ROMol> tmol;\n+ const ROMol *mptr = &mol;\n if (!hasStereoAssigned(mol)) {\n- throw ValueErrorException(\n- \"numUnspecifiedStereoCenters called without stereo being assigned\");\n+ tmol.reset(new ROMol(mol));\n+ constexpr bool cleanIt = true;\n+ constexpr bool force = true;\n+ constexpr bool flagPossible = true;\n+ MolOps::assignStereochemistry(*tmol, cleanIt, force, flagPossible);\n+ mptr = tmol.get();\n }\n \n unsigned int res = 0;\n- for (ROMol::ConstAtomIterator atom = mol.beginAtoms(); atom != mol.endAtoms();\n- ++atom) {\n- if ((*atom)->hasProp(common_properties::_ChiralityPossible) &&\n- (*atom)->getChiralTag() == Atom::CHI_UNSPECIFIED) {\n- res++;\n+ for (const auto &atom : mptr->atoms()) {\n+ if (atom->hasProp(common_properties::_ChiralityPossible) &&\n+ atom->getChiralTag() == Atom::CHI_UNSPECIFIED) {\n+ ++res;\n }\n }\n return res;\n"}, "test": {"test_patch": "diff --git a/Code/GraphMol/Descriptors/catch_tests.cpp b/Code/GraphMol/Descriptors/catch_tests.cpp\nindex bcac0b2dd7c..594fddb1fca 100644\n--- a/Code/GraphMol/Descriptors/catch_tests.cpp\n+++ b/Code/GraphMol/Descriptors/catch_tests.cpp\n@@ -618,4 +618,22 @@ TEST_CASE(\"Github #7364: BCUT descriptors failing for moleucles with Hs\") {\n CHECK(ref.size() == val.size());\n CHECK(ref == val);\n }\n+}\n+\n+TEST_CASE(\n+ \"Github #6757: numAtomStereoCenters fails if molecule is sanitized a second time\") {\n+ SECTION(\"as reported\") {\n+ auto m = \"C[C@H](F)Cl\"_smiles;\n+ REQUIRE(m);\n+ CHECK(Descriptors::numAtomStereoCenters(*m) == 1);\n+ CHECK(Descriptors::numUnspecifiedAtomStereoCenters(*m) == 0);\n+ MolOps::sanitizeMol(*m);\n+ CHECK(Descriptors::numAtomStereoCenters(*m) == 1);\n+ }\n+ SECTION(\"expanded\") {\n+ auto m = \"C[C@H](F)C(O)Cl\"_smiles;\n+ REQUIRE(m);\n+ CHECK(Descriptors::numAtomStereoCenters(*m) == 2);\n+ CHECK(Descriptors::numUnspecifiedAtomStereoCenters(*m) == 1);\n+ }\n }\n\\ No newline at end of file\ndiff --git a/Code/GraphMol/Descriptors/test.cpp b/Code/GraphMol/Descriptors/test.cpp\nindex 361a77f083f..18de6fac347 100644\n--- a/Code/GraphMol/Descriptors/test.cpp\n+++ b/Code/GraphMol/Descriptors/test.cpp\n@@ -1993,16 +1993,14 @@ void testStereoCounting() {\n names.emplace_back(\"NumUnspecifiedAtomStereoCenters\");\n Properties prop(names);\n \n- try {\n- prop.computeProperties(*m);\n- TEST_ASSERT(0); // didn't catch exception\n- } catch (ValueErrorException &) {\n- BOOST_LOG(rdErrorLog) << \"---Caught stereo value error---\" << std::endl;\n- }\n+ // the stereo perception is done automatically:\n+ std::vector<double> res = prop.computeProperties(*m);\n+ TEST_ASSERT(res[0] == 1);\n+ TEST_ASSERT(res[1] == 1);\n \n delete m;\n m = SmilesToMol(\"NC(C)(F)C(=O)O\", sanitize);\n- std::vector<double> res = prop.computeProperties(*m);\n+ res = prop.computeProperties(*m);\n TEST_ASSERT(res[0] == 1);\n TEST_ASSERT(res[1] == 1);\n delete m;\n", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}235{"question_id": "MSB_rdkit_rdkit_pr7904", "question_type": "multi_swe_bench", "description": "Fixes #7699 (rdkit/rdkit#7904)", "content": {"org": "rdkit", "repo": "rdkit", "pr_number": 7904, "issue_title": "Fixes #7699", "issue_body": "Stereo groups in product templates of reactions are now propagated to the product molecules.\r\n\r\nIf the atoms involved in those stereo groups are present in any stereo groups in the reactant molecules, they will be removed from those stereogroups when they are propagated to the products.", "base_commit": "070f07c974212212c0ad3bb4eac8fd527596647f", "resolved_issues": [{"number": 7669, "title": "Carry over enhanced stereochemistry groups from reaction product templates to products", "body": "**Is your feature request related to a problem? Please describe.**\r\nThe problem is discussed in https://github.com/rdkit/rdkit/discussions/7660\r\nBasically, for reactions, while stereo groups from reactants are carried over after https://github.com/rdkit/rdkit/issues/2366, this does not happen for stereogroups in product templates, yet.\r\n\r\n**Describe the solution you'd like**\r\nI would like to see stereogroups from the product template to be copied over to the actual reaction products in the core RDKit code for reactions.\r\n\r\n**Describe alternatives you've considered**\r\nIn the discussion linked above, a workaround is shown, which involves copying the stereogroups manually with the help of reaction-realted atom props annotated during reaction application.\r\n\r\n**Additional context**\r\nCopying over the example from the discussion.\r\n\r\n\r\n```python\r\nfrom rdkit import Chem\r\nfrom rdkit.Chem import rdChemReactions\r\n\r\ninput = Chem.MolFromMolBlock(\"\"\"\"\r\n MJ231601 \r\n\r\n 5 4 0 0 1 0 0 0 0 0999 V2000\r\n -0.8258 1.4955 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\r\n -0.8258 0.6705 0.0000 F 0 0 0 0 0 0 0 0 0 0 0 0\r\n -1.6508 1.4955 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\r\n -0.8258 2.3205 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0\r\n -0.0008 1.4955 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\r\n 1 2 1 0 0 0 0\r\n 1 4 1 0 0 0 0\r\n 1 3 1 0 0 0 0\r\n 1 5 1 0 0 0 0\r\nM END\r\n\"\"\")\r\n\r\n# rxn molblock with enhanced stereochemistry\r\nrxn = \"\"\"$RXN V3000\r\n\r\n Mrv2401 072420241107\r\n\r\nM V30 COUNTS 1 1\r\nM V30 BEGIN REACTANT\r\nM V30 BEGIN CTAB\r\nM V30 COUNTS 5 4 0 0 1\r\nM V30 BEGIN ATOM\r\nM V30 1 C -1.5417 2.7917 0 1\r\nM V30 2 F -1.5417 1.2517 0 4\r\nM V30 3 C -3.0817 2.7917 0 3\r\nM V30 4 Cl -1.5417 4.3317 0 2\r\nM V30 5 C -0.0017 2.7917 0 0\r\nM V30 END ATOM\r\nM V30 BEGIN BOND\r\nM V30 1 1 1 2\r\nM V30 2 1 1 4\r\nM V30 3 1 1 3\r\nM V30 4 1 1 5\r\nM V30 END BOND\r\nM V30 END CTAB\r\nM V30 END REACTANT\r\nM V30 BEGIN PRODUCT\r\nM V30 BEGIN CTAB\r\nM V30 COUNTS 5 4 0 0 0\r\nM V30 BEGIN ATOM\r\nM V30 1 C 9.2083 2.9167 0 1\r\nM V30 2 C 7.6683 2.9167 0 3\r\nM V30 3 F 9.2083 1.3767 0 4\r\nM V30 4 Cl 9.2083 4.4567 0 2\r\nM V30 5 I 10.7483 2.9167 0 0\r\nM V30 END ATOM\r\nM V30 BEGIN BOND\r\nM V30 1 1 1 2\r\nM V30 2 1 1 3\r\nM V30 3 1 1 4\r\nM V30 4 1 1 5 CFG=1\r\nM V30 END BOND\r\nM V30 BEGIN COLLECTION\r\nM V30 MDLV30/STERAC1 ATOMS=(1 1)\r\nM V30 END COLLECTION\r\nM V30 END CTAB\r\nM V30 END PRODUCT\r\nM END\r\n\"\"\"\r\n\r\nrxn = rdChemReactions.ReactionFromRxnBlock(rxn)\r\nrxn.Initialize()\r\np = rxn.RunReactants([input])\r\nfor prod in p:\r\n sgs = prod[0].GetStereoGroups()\r\n if len(sgs) <= 0:\r\n print(\"Stereochemistry missing :(\")\r\n```\r\n\r\n```\r\nStereochemistry missing :(\r\nStereochemistry missing :(\r\n```\r\n"}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/rdkit_m_rdkit:pr-7904", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/Code/GraphMol/ChemReactions/ReactionRunner.cpp b/Code/GraphMol/ChemReactions/ReactionRunner.cpp\nindex 19fc31fc14f..26639feb67a 100644\n--- a/Code/GraphMol/ChemReactions/ReactionRunner.cpp\n+++ b/Code/GraphMol/ChemReactions/ReactionRunner.cpp\n@@ -1255,15 +1255,14 @@ void copyEnhancedStereoGroups(const ROMol &reactant, RWMOL_SPTR product,\n for (const auto &sg : reactant.getStereoGroups()) {\n std::vector<Atom *> atoms;\n std::vector<Bond *> bonds;\n- for (auto &&reactantAtom : sg.getAtoms()) {\n+ for (const auto &reactantAtom : sg.getAtoms()) {\n auto productAtoms = mapping.reactProdAtomMap.find(reactantAtom->getIdx());\n if (productAtoms == mapping.reactProdAtomMap.end()) {\n continue;\n }\n \n- for (auto &&productAtomIdx : productAtoms->second) {\n+ for (auto &productAtomIdx : productAtoms->second) {\n auto productAtom = product->getAtomWithIdx(productAtomIdx);\n-\n // If chirality destroyed by the reaction, skip the atom\n if (productAtom->getChiralTag() == Atom::CHI_UNSPECIFIED) {\n continue;\n@@ -1409,6 +1408,76 @@ void addReactantAtomsAndBonds(const ChemicalReaction &rxn, RWMOL_SPTR product,\n delete (mapping);\n } // end of addReactantAtomsAndBonds\n \n+namespace {\n+void copyTemplateStereoGroupsToMol(const ROMol &templateMol,\n+ RWMOL_SPTR product) {\n+ const auto &stereoGroups = templateMol.getStereoGroups();\n+ if (stereoGroups.empty()) {\n+ return;\n+ }\n+\n+ boost::dynamic_bitset<> atomsInTemplateStereoGroups(product->getNumAtoms());\n+ std::vector<StereoGroup> newStereoGroups;\n+ for (const auto &sg : stereoGroups) {\n+ bool keepIt = true;\n+ std::vector<Atom *> atoms;\n+ for (const auto &atom : sg.getAtoms()) {\n+ if (auto mapNum = atom->getAtomMapNum()) {\n+ for (auto productAtom : product->atoms()) {\n+ int oldMapNum = 0;\n+ if (productAtom->getPropIfPresent(common_properties::reactionMapNum,\n+ oldMapNum) &&\n+ oldMapNum == mapNum) {\n+ atoms.push_back(productAtom);\n+ atomsInTemplateStereoGroups.set(productAtom->getIdx());\n+ }\n+ }\n+ } else {\n+ keepIt = false;\n+ break;\n+ }\n+ }\n+ if (keepIt && !atoms.empty()) {\n+ std::vector<Bond *> bonds;\n+ newStereoGroups.emplace_back(sg.getGroupType(), std::move(atoms),\n+ std::move(bonds), sg.getReadId());\n+ }\n+ }\n+ if (!newStereoGroups.empty()) {\n+ // remove any stereo groups that are already present in the product (these\n+ // were copied over from the reactant in copyEnhancedStereoGroups()) and\n+ // that overlap with the added ones\n+ for (const auto &productSG : product->getStereoGroups()) {\n+ unsigned int nOverlappingAtoms = 0;\n+ for (const auto atom : productSG.getAtoms()) {\n+ if (atomsInTemplateStereoGroups[atom->getIdx()]) {\n+ ++nOverlappingAtoms;\n+ }\n+ }\n+ if (!nOverlappingAtoms) {\n+ // no overlapping atoms, we can just keep the stereogroup.\n+ newStereoGroups.push_back(productSG);\n+ } else if (nOverlappingAtoms < productSG.getAtoms().size()) {\n+ // some of the atoms in the stereo group are not already there\n+ // in the product, we need to split the stereo group\n+ std::vector<Atom *> newAtoms;\n+ for (const auto atom : productSG.getAtoms()) {\n+ if (!atomsInTemplateStereoGroups[atom->getIdx()]) {\n+ newAtoms.push_back(atom);\n+ }\n+ }\n+ std::vector<Bond *> newBonds;\n+ newStereoGroups.emplace_back(productSG.getGroupType(),\n+ std::move(newAtoms), std::move(newBonds),\n+ productSG.getReadId());\n+ }\n+ // else: all atoms in the stereo group are already there, we can skip it\n+ }\n+ product->setStereoGroups(std::move(newStereoGroups));\n+ }\n+}\n+} // namespace\n+\n MOL_SPTR_VECT\n generateOneProductSet(const ChemicalReaction &rxn,\n const MOL_SPTR_VECT &reactants,\n@@ -1469,6 +1538,11 @@ generateOneProductSet(const ChemicalReaction &rxn,\n MolOps::setDoubleBondNeighborDirections(*product);\n }\n \n+ // if the product template has stereo groups, copy them over now\n+ if (!(*pTemplIt)->getStereoGroups().empty()) {\n+ copyTemplateStereoGroupsToMol(**pTemplIt, product);\n+ }\n+\n res[prodId] = product;\n ++prodId;\n }\n"}, "test": {"test_patch": "diff --git a/Code/GraphMol/ChemReactions/catch_tests.cpp b/Code/GraphMol/ChemReactions/catch_tests.cpp\nindex 4bcb71143d8..d1d00dbdbb4 100644\n--- a/Code/GraphMol/ChemReactions/catch_tests.cpp\n+++ b/Code/GraphMol/ChemReactions/catch_tests.cpp\n@@ -1983,3 +1983,111 @@ M END)RXN\";\n CHECK(rxn2.getReactants()[0]->getAtomWithIdx(0)->hasProp(\"molFileValue\"));\n }\n }\n+\n+TEST_CASE(\"Github #7669: propate stereo groups from product templates\") {\n+ auto rxnBlock = R\"RXN($RXN V3000\n+\n+ Mrv2401 072420241107\n+\n+M V30 COUNTS 1 1\n+M V30 BEGIN REACTANT\n+M V30 BEGIN CTAB\n+M V30 COUNTS 5 4 0 0 1\n+M V30 BEGIN ATOM\n+M V30 1 C -1.5417 2.7917 0 1\n+M V30 2 F -1.5417 1.2517 0 4\n+M V30 3 C -3.0817 2.7917 0 3\n+M V30 4 Cl -1.5417 4.3317 0 2\n+M V30 5 C -0.0017 2.7917 0 0\n+M V30 END ATOM\n+M V30 BEGIN BOND\n+M V30 1 1 1 2\n+M V30 2 1 1 4\n+M V30 3 1 1 3\n+M V30 4 1 1 5\n+M V30 END BOND\n+M V30 END CTAB\n+M V30 END REACTANT\n+M V30 BEGIN PRODUCT\n+M V30 BEGIN CTAB\n+M V30 COUNTS 5 4 0 0 0\n+M V30 BEGIN ATOM\n+M V30 1 C 9.2083 2.9167 0 1\n+M V30 2 C 7.6683 2.9167 0 3\n+M V30 3 F 9.2083 1.3767 0 4\n+M V30 4 Cl 9.2083 4.4567 0 2\n+M V30 5 I 10.7483 2.9167 0 0\n+M V30 END ATOM\n+M V30 BEGIN BOND\n+M V30 1 1 1 2\n+M V30 2 1 1 3\n+M V30 3 1 1 4\n+M V30 4 1 1 5 CFG=1\n+M V30 END BOND\n+M V30 BEGIN COLLECTION\n+M V30 MDLV30/STERAC1 ATOMS=(1 1)\n+M V30 END COLLECTION\n+M V30 END CTAB\n+M V30 END PRODUCT\n+M END)RXN\";\n+ auto rxn = v2::ReactionParser::ReactionFromRxnBlock(rxnBlock);\n+ REQUIRE(rxn);\n+ CHECK(rxn->getProducts()[0]->getStereoGroups().size() == 1);\n+ rxn->initReactantMatchers();\n+ SECTION(\"as reported\") {\n+ auto mol = R\"CTAB(\n+ MJ231601 \n+\n+ 5 4 0 0 1 0 0 0 0 0999 V2000\n+ -0.8258 1.4955 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\n+ -0.8258 0.6705 0.0000 F 0 0 0 0 0 0 0 0 0 0 0 0\n+ -1.6508 1.4955 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\n+ -0.8258 2.3205 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0\n+ -0.0008 1.4955 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\n+ 1 2 1 0 0 0 0\n+ 1 4 1 0 0 0 0\n+ 1 3 1 0 0 0 0\n+ 1 5 1 0 0 0 0\n+M END)CTAB\"_ctab;\n+ REQUIRE(mol);\n+ ROMOL_SPTR reactant(std::move(mol));\n+ auto ps = rxn->runReactant(reactant, 0);\n+ REQUIRE(ps.size() == 2);\n+ REQUIRE(ps[0].size() == 1);\n+\n+ CHECK(ps[0][0]->getStereoGroups().size() == 1);\n+ CHECK(ps[0][0]->getStereoGroups()[0].getGroupType() ==\n+ StereoGroupType::STEREO_AND);\n+ CHECK(ps[1][0]->getStereoGroups().size() == 1);\n+ CHECK(ps[0][0]->getStereoGroups()[0].getGroupType() ==\n+ StereoGroupType::STEREO_AND);\n+\n+ auto sg = StereoGroup(StereoGroupType::STEREO_OR,\n+ {reactant->getAtomWithIdx(0)}, {});\n+ reactant->setStereoGroups({sg});\n+ ps = rxn->runReactant(reactant, 0);\n+ REQUIRE(ps.size() == 2);\n+ REQUIRE(ps[0].size() == 1);\n+ CHECK(ps[0][0]->getStereoGroups().size() == 1);\n+ CHECK(ps[0][0]->getStereoGroups()[0].getGroupType() ==\n+ StereoGroupType::STEREO_AND);\n+ CHECK(ps[1][0]->getStereoGroups().size() == 1);\n+ CHECK(ps[0][0]->getStereoGroups()[0].getGroupType() ==\n+ StereoGroupType::STEREO_AND);\n+ }\n+\n+ SECTION(\n+ \"stereogroups in product template remove atoms from stereogroups in reactant\") {\n+ auto mol = \"C[C@](F)(Cl)C[C@](C)(O)Br |o1:1,5|\"_smiles;\n+ ROMOL_SPTR reactant(std::move(mol));\n+ auto ps = rxn->runReactant(reactant, 0);\n+ REQUIRE(ps.size() == 2);\n+ REQUIRE(ps[0].size() == 1);\n+ CHECK(ps[0][0]->getStereoGroups().size() == 1);\n+ CHECK(ps[0][0]->getStereoGroups()[0].getGroupType() ==\n+ StereoGroupType::STEREO_AND);\n+ CHECK(ps[1][0]->getStereoGroups().size() == 2);\n+ CHECK(ps[0][0]->getStereoGroups()[0].getGroupType() ==\n+ StereoGroupType::STEREO_AND);\n+ }\n+}\n\\ No newline at end of file\ndiff --git a/Code/GraphMol/ChemReactions/testData/github7669_1.rxn b/Code/GraphMol/ChemReactions/testData/github7669_1.rxn\nnew file mode 100644\nindex 00000000000..32c84cf12ae\n--- /dev/null\n+++ b/Code/GraphMol/ChemReactions/testData/github7669_1.rxn\n@@ -0,0 +1,90 @@\n+$RXN V3000\n+\n+ Mrv2401 100720240457\n+\n+M V30 COUNTS 1 1\n+M V30 BEGIN REACTANT\n+M V30 BEGIN CTAB\n+M V30 COUNTS 16 17 0 0 0\n+M V30 BEGIN ATOM\n+M V30 1 C -17.5833 8.8333 0 1\n+M V30 2 C -16.2497 9.6033 0 2\n+M V30 3 C -18.917 9.6033 0 3\n+M V30 4 C -20.2507 8.8333 0 4\n+M V30 5 C -20.2507 7.2933 0 5\n+M V30 6 C -18.917 6.5233 0 6\n+M V30 7 C -17.5833 7.2933 0 7\n+M V30 8 C -14.916 11.9134 0 8\n+M V30 9 C -16.2497 11.1434 0 9\n+M V30 10 C -14.916 8.8333 0 10\n+M V30 11 C -13.5823 9.6033 0 11\n+M V30 12 C -13.5823 11.1434 0 12\n+M V30 13 C -18.917 11.1433 0 13\n+M V30 14 F -16.2496 6.5233 0 14\n+M V30 15 F -14.916 7.2933 0 15\n+M V30 16 O -14.916 13.4534 0 16\n+M V30 END ATOM\n+M V30 BEGIN BOND\n+M V30 1 1 1 2\n+M V30 2 1 7 1\n+M V30 3 2 3 1\n+M V30 4 2 9 2\n+M V30 5 1 3 4\n+M V30 6 1 3 13\n+M V30 7 2 4 5\n+M V30 8 1 5 6\n+M V30 9 2 6 7\n+M V30 10 1 7 14\n+M V30 11 1 8 9\n+M V30 12 2 8 12\n+M V30 13 1 8 16\n+M V30 14 2 10 11\n+M V30 15 1 10 15\n+M V30 16 1 11 12\n+M V30 17 1 2 10\n+M V30 END BOND\n+M V30 END CTAB\n+M V30 END REACTANT\n+M V30 BEGIN PRODUCT\n+M V30 BEGIN CTAB\n+M V30 COUNTS 16 17 0 0 0\n+M V30 BEGIN ATOM\n+M V30 1 C -4.7085 10.1437 0 1\n+M V30 2 C -3.3749 10.9137 0 2\n+M V30 3 C -6.0422 10.9137 0 3\n+M V30 4 C -7.3759 10.1437 0 4\n+M V30 5 C -7.3759 8.6037 0 5\n+M V30 6 C -6.0422 7.8337 0 6\n+M V30 7 C -4.7085 8.6037 0 7\n+M V30 8 C -2.0412 13.2238 0 8\n+M V30 9 C -3.3749 12.4538 0 9\n+M V30 10 C -2.0412 10.1437 0 10\n+M V30 11 C -0.7075 10.9137 0 11\n+M V30 12 C -0.7075 12.4538 0 12\n+M V30 13 C -6.0422 12.4537 0 13\n+M V30 14 F -3.3748 7.8337 0 14\n+M V30 15 F -2.0412 8.6037 0 15\n+M V30 16 N -2.0412 14.7638 0 16\n+M V30 END ATOM\n+M V30 BEGIN BOND\n+M V30 1 1 1 2\n+M V30 2 1 7 1\n+M V30 3 2 3 1\n+M V30 4 2 9 2\n+M V30 5 1 3 4\n+M V30 6 1 3 13\n+M V30 7 2 4 5\n+M V30 8 1 5 6\n+M V30 9 2 6 7\n+M V30 10 1 7 14\n+M V30 11 1 8 9\n+M V30 12 2 8 12\n+M V30 13 1 8 16\n+M V30 14 2 10 11\n+M V30 15 1 10 15\n+M V30 16 1 11 12\n+M V30 17 1 2 10 CFG=1\n+M V30 END BOND\n+M V30 END CTAB\n+M V30 END PRODUCT\n+M END\n", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}236{"question_id": "MSB_rdkit_rdkit_pr8164", "question_type": "multi_swe_bench", "description": "Fixes #8162 (rdkit/rdkit#8164)", "content": {"org": "rdkit", "repo": "rdkit", "pr_number": 8164, "issue_title": "Fixes #8162", "issue_body": "Straightforward fix to make only conjugated double and single bonds match aromatic bonds", "base_commit": "b6fe7be27b70355feb3d0eef11a384caaecb05dd", "resolved_issues": [{"number": 8162, "title": "Cyanamide incorrectly matches methyl-imidazole when aromaticMatchesConjugated is set", "body": "\r\n\r\n**Describe the bug**\r\n\r\nGiven the MOL 3000 query (cyanamide) and smiles target (methyl-imidazole) below an incorrect match is reported when `aromaticMatchesConjugated = True`. Interestingly, this does not happen using the equivalent SMARTS pattern.\r\n\r\nThe behavior is observed in the 2024.09.04 Python release and also on C# wrappers built on 1/10/25\r\n\r\n**To Reproduce**\r\n\r\n```python\r\n# %%\r\nimport rdkit\r\nfrom rdkit import Chem\r\nfrom rdkit.Chem import AllChem, Draw\r\nfrom rdkit.Chem.Draw import IPythonConsole\r\nfrom rdkit.Chem.rdchem import SubstructMatchParameters\r\nIPythonConsole.drawOptions.addAtomIndices = True\r\n# %%\r\nrdkit.__version__\r\n# %%\r\nblock = \"\"\"ACS Document 1996\r\n ChemDraw01092510212D\r\n\r\n 0 0 0 0 0 0 V3000\r\nM V30 BEGIN CTAB\r\nM V30 COUNTS 4 3 0 0 0\r\nM V30 BEGIN ATOM\r\nM V30 1 N 0.357236 0.412500 0.000000 0\r\nM V30 2 C 1.071707 0.000000 0.000000 0\r\nM V30 3 C -0.357236 0.000000 0.000000 0\r\nM V30 4 N -1.071707 -0.412500 0.000000 0\r\nM V30 END ATOM\r\nM V30 BEGIN BOND\r\nM V30 1 1 1 2\r\nM V30 2 1 1 3\r\nM V30 3 3 3 4\r\nM V30 END BOND\r\nM V30 END CTAB\r\nM END\r\n\"\"\"\r\nquery = Chem.MolFromMolBlock(block)\r\nquery\r\n# %%\r\nsmi = 'CN1C=NC=C1'\r\nmol = Chem.MolFromSmiles(smi)\r\nmol\r\n# %%\r\nparams = SubstructMatchParameters()\r\nparams.aromaticMatchesConjugated = True\r\nmol.GetSubstructMatch(query, params)\r\n# %%\r\nsmarts = \"N(C)C#N\"\r\nquery2 = Chem.MolFromSmarts(smarts)\r\nquery2\r\n# %%\r\nmol.GetSubstructMatch(query2, params)\r\n```\r\n\r\nWhich gives a match between the mol block and the smiles structure\r\n\r\n\r\n\r\n\r\n**Expected behavior**\r\nExpect both substructure matches to be empty\r\n\r\n**Screenshots**\r\n\r\n\r\n\r\n**Configuration (please complete the following information):**\r\n - RDKit version: 2024.09.04\r\n - OS: Windows\r\n - Python version (if relevant):\r\n - Are you using conda? yes\r\n - If you are using conda, which channel did you install the rdkit from? conda-forge\r\n - If you are not using conda: how did you install the RDKit?\r\n\r\n"}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/rdkit_m_rdkit:pr-8164", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/Code/GraphMol/Substruct/SubstructUtils.cpp b/Code/GraphMol/Substruct/SubstructUtils.cpp\nindex af6d52bb255..a7aebbbb2d8 100644\n--- a/Code/GraphMol/Substruct/SubstructUtils.cpp\n+++ b/Code/GraphMol/Substruct/SubstructUtils.cpp\n@@ -168,6 +168,12 @@ bool bondCompat(const Bond *b1, const Bond *b2,\n PRECONDITION(b1, \"bad bond\");\n PRECONDITION(b2, \"bad bond\");\n bool res;\n+\n+ auto isConjugatedSingleOrDoubleBond([](const Bond *bond) {\n+ return bond->getIsConjugated() && (bond->getBondType() == Bond::SINGLE ||\n+ bond->getBondType() == Bond::DOUBLE);\n+ });\n+\n if (ps.useQueryQueryMatches && b1->hasQuery() && b2->hasQuery()) {\n res = static_cast<const QueryBond *>(b1)->QueryMatch(\n static_cast<const QueryBond *>(b2));\n@@ -175,8 +181,10 @@ bool bondCompat(const Bond *b1, const Bond *b2,\n !b2->hasQuery() &&\n ((b1->getBondType() == Bond::AROMATIC &&\n b2->getBondType() == Bond::AROMATIC) ||\n- (b1->getBondType() == Bond::AROMATIC && b2->getIsConjugated()) ||\n- (b2->getBondType() == Bond::AROMATIC && b1->getIsConjugated()))) {\n+ (b1->getBondType() == Bond::AROMATIC &&\n+ isConjugatedSingleOrDoubleBond(b2)) ||\n+ (b2->getBondType() == Bond::AROMATIC &&\n+ isConjugatedSingleOrDoubleBond(b1)))) {\n res = true;\n } else {\n res = b1->Match(b2);\n"}, "test": {"test_patch": "diff --git a/Code/GraphMol/Substruct/catch_tests.cpp b/Code/GraphMol/Substruct/catch_tests.cpp\nindex ce4a070ae73..0c007677a52 100644\n--- a/Code/GraphMol/Substruct/catch_tests.cpp\n+++ b/Code/GraphMol/Substruct/catch_tests.cpp\n@@ -19,6 +19,7 @@\n #include <GraphMol/SmilesParse/SmilesParse.h>\n #include <GraphMol/SmilesParse/SmilesWrite.h>\n #include <GraphMol/Substruct/SubstructMatch.h>\n+#include <GraphMol/FileParsers/FileParsers.h>\n #include <GraphMol/QueryOps.h>\n #include <GraphMol/MolPickler.h>\n \n@@ -777,11 +778,66 @@ TEST_CASE(\"specified query matches unspecified atom\") {\n CHECK(SubstructMatch(*m3, *q, ps).empty());\n \n ps.specifiedStereoQueryMatchesUnspecified = true;\n- std::cerr << \"m1\" << std::endl;\n CHECK(SubstructMatch(*m1, *q, ps).size() == 1);\n- std::cerr << \"m2\" << std::endl;\n CHECK(SubstructMatch(*m2, *q, ps).size() == 1);\n- std::cerr << \"m3\" << std::endl;\n CHECK(SubstructMatch(*m3, *q, ps).empty());\n }\n+}\n+\n+TEST_CASE(\n+ \"Github 8162: conjugated triple bonds match aromatic bonds with aromaticMatchesConjugated\") {\n+ SECTION(\"as reported\") {\n+ auto qry = R\"CTAB(ACS Document 1996\n+ ChemDraw01092510212D\n+\n+ 0 0 0 0 0 0 V3000\n+M V30 BEGIN CTAB\n+M V30 COUNTS 4 3 0 0 0\n+M V30 BEGIN ATOM\n+M V30 1 N 0.357236 0.412500 0.000000 0\n+M V30 2 C 1.071707 0.000000 0.000000 0\n+M V30 3 C -0.357236 0.000000 0.000000 0\n+M V30 4 N -1.071707 -0.412500 0.000000 0\n+M V30 END ATOM\n+M V30 BEGIN BOND\n+M V30 1 1 1 2\n+M V30 2 1 1 3\n+M V30 3 3 3 4\n+M V30 END BOND\n+M V30 END CTAB\n+M END)CTAB\"_ctab;\n+ REQUIRE(qry);\n+ auto mol = \"CN1C=NC=C1\"_smiles;\n+ REQUIRE(mol);\n+ SubstructMatchParameters ps;\n+ ps.aromaticMatchesConjugated = true;\n+ CHECK(SubstructMatch(*mol, *qry, ps).empty());\n+ }\n+\n+ SECTION(\"details\") {\n+ auto m_triple = \"C#N\"_smiles;\n+ REQUIRE(m_triple);\n+ m_triple->getBondWithIdx(0)->setIsConjugated(true);\n+ auto m_double = \"C=N\"_smiles;\n+ REQUIRE(m_double);\n+ m_double->getBondWithIdx(0)->setIsConjugated(true);\n+ auto m_single = \"CN\"_smiles;\n+ REQUIRE(m_single);\n+ m_single->getBondWithIdx(0)->setIsConjugated(true);\n+ auto m_aromatic = \"CN\"_smiles;\n+ REQUIRE(m_aromatic);\n+ m_aromatic->getBondWithIdx(0)->setBondType(Bond::AROMATIC);\n+ m_aromatic->getBondWithIdx(0)->setIsAromatic(true);\n+ m_aromatic->getBondWithIdx(0)->setIsConjugated(true);\n+\n+ SubstructMatchParameters ps;\n+ ps.aromaticMatchesConjugated = true;\n+ CHECK(SubstructMatch(*m_triple, *m_aromatic, ps).empty());\n+ CHECK(SubstructMatch(*m_aromatic, *m_triple, ps).empty());\n+\n+ CHECK(SubstructMatch(*m_double, *m_aromatic, ps).size() == 1);\n+ CHECK(SubstructMatch(*m_aromatic, *m_double, ps).size() == 1);\n+ CHECK(SubstructMatch(*m_single, *m_aromatic, ps).size() == 1);\n+ CHECK(SubstructMatch(*m_aromatic, *m_single, ps).size() == 1);\n+ }\n }\n\\ No newline at end of file\n", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}237{"question_id": "MSB_rdkit_rdkit_pr8173", "question_type": "multi_swe_bench", "description": "improve handling of esters, amides, etc. in the v2 tautomer hash (rdkit/rdkit#8173)", "content": {"org": "rdkit", "repo": "rdkit", "pr_number": 8173, "issue_title": "improve handling of esters, amides, etc. in the v2 tautomer hash", "issue_body": "The current version of the tautomer hash includes bonds in the tautomer zone that shouldn't be for amides, esters, carboxylates, and related structures. One simple example of this is acetic acid, where all of the atoms are in the tautomeric zone:\r\n```\r\nIn [7]: rdMolHash.MolHash(Chem.MolFromSmiles('CC(=O)O'),rdMolHash.HashFunction.HetAtomTautomerv2)\r\nOut[7]: '[C]:[C](:[O]):[O]_4_0'\r\n```\r\n\r\nThe solution here is to mark some bonds as not being eligible for tautomerism.\r\nThe set of bonds in this PR are the first bond in each of these SMARTS:\r\n```\r\n \"[C;!$(C-C(=[NH])-[NH2])]-[C;!$(C(-C)(=[NH])-[NH2])](=[O,N,S])-[O,N,S]\", //< one side of the \"amide\", with an ugly exclusion for amidine\r\n \"[C;!$(C=[O,N,S])]-[O,N,S]-C=[O,N,S]\", //< the other side\r\n \"[OH0,SH0]-C=[O,N,S]\", //< \"esters\" and \"carboxyls\"\r\n \"[C]-[c](:[o,n,s]):[o,n,s]\", //< a limited version of handling this for\r\n //aromatic systems\r\n```\r\n\r\nWhile working on this, I made heavy use of the great \"Tautomerizer\" tool from the NCI in order to get a sense of what types of bonds are likely to be involved in tautomerism:\r\nhttps://cactus.nci.nih.gov/tautomerizer/\r\n(NOTE: this does not mean that anyone should expect similar results from the tools! That wasn't the goal)\r\n\r\nThis fixes #8090, along with a bunch of other weirdness; hopefully it doesn't introduce too much new weirdness.\r\n\r\nThe results are definitely different from what you'd get with the current version of the code for many molecules.\r\n\r\n", "base_commit": "59b4152974387c0e9fbce3a4bd45de94e8d61877", "resolved_issues": [{"number": 8090, "title": "HetAtomTautomerv2 detects tautomerism at carboxylate", "body": "**Describe the bug**\r\nHetAtomTautomerv2 detects tautomerism at carboxylates. I'm pretty confident that this is a side-effect of allowing keto-enol tautomerism... But I do feel that carboxylates are a special case and should be excluded.\r\n\r\n**To Reproduce**\r\n```\r\nfrom rdkit import Chem\r\nfrom rdkit.Chem import rdMolHash\r\n\r\nsmi = 'O=C(O)CCC'\r\nmol = Chem.MolFromSmiles(smi)\r\nprint(rdMolHash.MolHash(mol, rdMolHash.HashFunction.HetAtomTautomer))\r\nprint(rdMolHash.MolHash(mol, rdMolHash.HashFunction.HetAtomTautomerv2))\r\n```\r\n\r\n**Expected behavior**\r\nI'd expect the neighboring carbon to be excluded from the carboxylate tautomeric region. I think the desired tautomerhash would be `[CH3]-[CH2]-[C2]-[C](:[O]):[O]_1_0`.\r\n\r\n**Screenshots**\r\n<img width=\"625\" alt=\"tautomerhashv2bug\" src=\"https://github.com/user-attachments/assets/8886577b-b758-4f54-b602-d28ba520629c\" />\r\n\r\n**Configuration (please complete the following information):**\r\n - RDKit version: Fall 2025\r\n - Are you using conda? no\r\n - If you are using conda, which channel did you install the rdkit from?\r\n - If you are not using conda: how did you install the RDKit? Schr\u00f6dinger custom install\r\n\r\n**Additional context**\r\nI'm using this in the RegistrationHash. This causes a collapse of chiral carboxylic acids.\r\n"}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/rdkit_m_rdkit:pr-8173", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/Code/GraphMol/MolHash/CMakeLists.txt b/Code/GraphMol/MolHash/CMakeLists.txt\nindex b4ce6020d2a..7afb7899187 100644\n--- a/Code/GraphMol/MolHash/CMakeLists.txt\n+++ b/Code/GraphMol/MolHash/CMakeLists.txt\n@@ -1,7 +1,7 @@\n \n rdkit_library(MolHash\n hashfunctions.cpp normalize.cpp\n- LINK_LIBRARIES Depictor GraphMol)\n+ LINK_LIBRARIES SubstructMatch Depictor GraphMol)\n target_compile_definitions(MolHash PRIVATE RDKIT_MOLHASH_BUILD)\n \n rdkit_headers(MolHash.h nmmolhash.h \ndiff --git a/Code/GraphMol/MolHash/hashfunctions.cpp b/Code/GraphMol/MolHash/hashfunctions.cpp\nindex a6acf248f1c..c687eb6402f 100644\n--- a/Code/GraphMol/MolHash/hashfunctions.cpp\n+++ b/Code/GraphMol/MolHash/hashfunctions.cpp\n@@ -21,6 +21,8 @@\n #include <GraphMol/RDKitBase.h>\n #include <GraphMol/RDKitQueries.h>\n #include <GraphMol/SmilesParse/SmilesWrite.h>\n+#include <GraphMol/SmilesParse/SmilesParse.h>\n+#include <GraphMol/Substruct/SubstructMatch.h>\n \n #include \"nmmolhash.h\"\n #include \"mf.h\"\n@@ -378,14 +380,50 @@ std::string MesomerHash(RWMol *mol, bool netq, bool useCXSmiles,\n return result;\n }\n \n+namespace details {\n+\n+constexpr std::uint64_t bondFlagCarboxyl =\n+ 1; //*< bond involved in in carboxyl, amide, etc.\n+std::vector<std::uint64_t> getBondFlags(const ROMol &mol) {\n+ // FIX: oversimplified, but should work for now\n+ static std::vector<std::string> patterns{\n+ \"[C;!$(C-C(=[NH])-[NH2])]-[C;!$(C(-C)(=[NH])-[NH2])](=[O,N,S])-[O,N,S]\", //< one side of the \"amide\", with an ugly exclusion for amidine\n+ \"[C;!$(C=[O,N,S])]-[O,N,S]-C=[O,N,S]\", //< the other side\n+ \"[OH0,SH0]-C=[O,N,S]\", //< \"esters\" and \"carboxyls\"\n+ \"[C]-[c](:[o,n,s]):[o,n,s]\", //< a limited version of handling this for\n+ // aromatic systems\n+ };\n+ static std::vector<std::unique_ptr<RDKit::RWMol>> queries;\n+ if (queries.empty()) {\n+ for (const auto &pattern : patterns) {\n+ queries.emplace_back(SmartsToMol(pattern));\n+ }\n+ }\n+\n+ std::vector<std::uint64_t> bondFlags(mol.getNumBonds(), 0);\n+ for (const auto &qry : queries) {\n+ auto matches = SubstructMatch(mol, *qry);\n+ for (const auto &match : matches) {\n+ const auto bnd =\n+ mol.getBondBetweenAtoms(match[0].second, match[1].second);\n+ bondFlags[bnd->getIdx()] |= bondFlagCarboxyl;\n+ }\n+ }\n+ return bondFlags;\n+}\n+\n+} // namespace details\n+\n namespace {\n // candidate atoms are either unsaturated or have implicit Hs\n // NOTE that being aromatic is not sufficient. The molecule\n // Cn1cccc1 is a good example of this:\n // - it should not be a tautomeric system\n // - the N is not unsaturated, but it is aromatic\n-bool isCandidateAtom(const Atom *aptr) {\n- return aptr->getTotalNumHs() || queryAtomUnsaturated(aptr);\n+bool isCandidateAtom(const Atom *aptr,\n+ const std::vector<std::uint64_t> &atomFlags) {\n+ return !atomFlags[aptr->getIdx()] &&\n+ (aptr->getTotalNumHs() || queryAtomUnsaturated(aptr));\n }\n \n // atomic number > 1, not carbon\n@@ -403,18 +441,26 @@ bool isUnsaturatedBond(const Bond *bptr) {\n }\n \n // potential tautomeric bonds are unsaturated and both atoms are candidates\n-bool isPossibleTautomericBond(const Bond *bptr) {\n- return isUnsaturatedBond(bptr) && isCandidateAtom(bptr->getBeginAtom()) &&\n- isCandidateAtom(bptr->getEndAtom());\n+bool isPossibleTautomericBond(const Bond *bptr,\n+ const std::vector<std::uint64_t> &atomFlags,\n+ const std::vector<std::uint64_t> &bondFlags) {\n+ return !bondFlags[bptr->getIdx()] && isUnsaturatedBond(bptr) &&\n+ isCandidateAtom(bptr->getBeginAtom(), atomFlags) &&\n+ isCandidateAtom(bptr->getEndAtom(), atomFlags);\n }\n \n // a bond is a possible starting bond if it involves a candidate hetereoatom\n // (definition above) and an unsaturated atom\n-bool isPossibleStartingBond(const Bond *bptr) {\n+bool isPossibleStartingBond(const Bond *bptr,\n+ const std::vector<std::uint64_t> &atomFlags,\n+ const std::vector<std::uint64_t> &bondFlags) {\n+ if (bondFlags[bptr->getIdx()]) {\n+ return false;\n+ }\n auto heteroBeg = isHeteroAtom(bptr->getBeginAtom()) &&\n- isCandidateAtom(bptr->getBeginAtom());\n- auto heteroEnd =\n- isHeteroAtom(bptr->getEndAtom()) && isCandidateAtom(bptr->getEndAtom());\n+ isCandidateAtom(bptr->getBeginAtom(), atomFlags);\n+ auto heteroEnd = isHeteroAtom(bptr->getEndAtom()) &&\n+ isCandidateAtom(bptr->getEndAtom(), atomFlags);\n // at least one atom has to be an eligible heteroatom:\n if (!heteroBeg && !heteroEnd) {\n return false;\n@@ -425,7 +471,8 @@ bool isPossibleStartingBond(const Bond *bptr) {\n auto unsatBeg = queryAtomUnsaturated(bptr->getBeginAtom());\n auto unsatEnd = queryAtomUnsaturated(bptr->getEndAtom());\n \n- // both we need a heteroatom on one side and an unsaturated atom on the other:\n+ // both we need a heteroatom on one side and an unsaturated atom on the\n+ // other:\n if (!((heteroBeg && unsatEnd) || (heteroEnd && unsatBeg))) {\n return false;\n }\n@@ -448,11 +495,14 @@ bool hasStartBond(const Atom *aptr, const boost::dynamic_bitset<> &startBonds) {\n // doesn't have a start bond\n bool skipNeighborBond(const Atom *atom, const Atom *otherAtom,\n const Bond *nbrBond,\n- const boost::dynamic_bitset<> &startBonds) {\n- return (\n- (!isCandidateAtom(otherAtom) && !hasStartBond(otherAtom, startBonds)) ||\n- (!isUnsaturatedBond(nbrBond) && !nbrBond->getIsConjugated() &&\n- !hasStartBond(atom, startBonds)));\n+ const boost::dynamic_bitset<> &startBonds,\n+ const std::vector<std::uint64_t> &atomFlags,\n+ const std::vector<std::uint64_t> &bondFlags) {\n+ return (bondFlags[nbrBond->getIdx()] ||\n+ ((!isCandidateAtom(otherAtom, atomFlags) &&\n+ !hasStartBond(otherAtom, startBonds)) ||\n+ (!isUnsaturatedBond(nbrBond) && !nbrBond->getIsConjugated() &&\n+ !hasStartBond(atom, startBonds))));\n }\n } // namespace\n \n@@ -463,12 +513,18 @@ std::string TautomerHashv2(RWMol *mol, bool proto, bool useCXSmiles,\n unsigned int hcount = 0;\n int charge = 0;\n \n+ // we aren't current doing anything with atomFlags, but we have added them in\n+ // analogy to the bondFlags as a kind of future proofing.\n+ std::vector<std::uint64_t> atomFlags(mol->getNumAtoms(), 0);\n+ auto bondFlags = details::getBondFlags(*mol);\n+\n boost::dynamic_bitset<> bondsToModify(mol->getNumBonds());\n boost::dynamic_bitset<> bondsConsidered(mol->getNumBonds());\n \n boost::dynamic_bitset<> startBonds(mol->getNumBonds());\n for (const auto bnd : mol->bonds()) {\n- startBonds.set(bnd->getIdx(), isPossibleStartingBond(bnd));\n+ startBonds.set(bnd->getIdx(),\n+ isPossibleStartingBond(bnd, atomFlags, bondFlags));\n }\n #ifdef VERBOSE_HASH\n std::cerr << \" START BONDS: \" << startBonds << std::endl;\n@@ -526,8 +582,10 @@ std::string TautomerHashv2(RWMol *mol, bool proto, bool useCXSmiles,\n }\n \n // if both bonds are not eligible, then we can skip this neighbor\n- if (skipNeighborBond(atm, oatom, nbrBond, startBonds) &&\n- skipNeighborBond(oatom, atm, nbrBond, startBonds)) {\n+ if (skipNeighborBond(atm, oatom, nbrBond, startBonds, atomFlags,\n+ bondFlags) &&\n+ skipNeighborBond(oatom, atm, nbrBond, startBonds, atomFlags,\n+ bondFlags)) {\n continue;\n }\n \n@@ -591,8 +649,10 @@ std::string TautomerHashv2(RWMol *mol, bool proto, bool useCXSmiles,\n << hasStartBond(atm, startBonds) << std::endl;\n #endif\n if (bondsConsidered[nbrBnd->getIdx()] ||\n- (skipNeighborBond(atm, oatom, nbrBnd, startBonds) &&\n- skipNeighborBond(oatom, atm, nbrBnd, startBonds))) {\n+ (skipNeighborBond(atm, oatom, nbrBnd, startBonds, atomFlags,\n+ bondFlags) &&\n+ skipNeighborBond(oatom, atm, nbrBnd, startBonds, atomFlags,\n+ bondFlags))) {\n // we won't add this bond for further traversal, but if both atoms\n // are already in this system, then we should add the bond to the\n // system\n"}, "test": {"test_patch": "diff --git a/Code/GraphMol/MolHash/catch_tests.cpp b/Code/GraphMol/MolHash/catch_tests.cpp\nindex 5b31f52024a..4ce0046b456 100644\n--- a/Code/GraphMol/MolHash/catch_tests.cpp\n+++ b/Code/GraphMol/MolHash/catch_tests.cpp\n@@ -432,13 +432,25 @@ TEST_CASE(\"tautomer v2\") {\n {}},\n {{\"CC(=O)C=CC\", \"C=C(O)C=CC\"}, {\"CC(=O)CC=C\"}},\n {{\"N=C1N=CN(C)C2N=CNC=21\", \"NC1N=CN(C)C2=NC=NC2=1\"}, {}},\n- {{\"S=C1N=CN=C2NC=NC12\", \"S=C1NC=NC2N=CNC1=2\"}, {}},\n- {{\"CC1=CN=CN1\", \"CC1CN=CN=1\"}, {}},\n- {{\"N1C(=O)NC(=O)C2C=NNC=21\", \"N1C(=O)NC(=O)C2=CNNC2=1\",\n- \"N1C(=O)NC(=O)C2=CNNC2=1\", \"N1C(=O)NC(=O)C2CN=NC2=1\"},\n+ {{\n+ \"S=C1N=CN=C2NC=NC12\",\n+ \"S=C2C1N=CN=C1NC=N2\",\n+\n+ },\n {\n- \"N1C(=O)NC(=O)C2CN=NC=21\",\n+ \"S=C1NC=NC2N=CNC1=2\",\n+ \"S=C1N=CN=C2N=CNC12\",\n+ \"S=C2C1NC=NC1=NC=N2\",\n }},\n+ {{\"S=C1NC=NC2N=CNC1=2\", \"S=C1NC=NC2NC=NC1=2\", \"SC1=NC=NC2N=CNC1=2\"},\n+ {}},\n+ {{\"CC1=CN=CN1\", \"CC1CN=CN=1\"}, {}},\n+ {{\n+ \"N1C(=O)NC(=O)C2C=NNC=21\",\n+ \"N1C(=O)NC(=O)C2=CNNC2=1\",\n+ \"N1C(=O)NC(=O)C2=CNNC2=1\",\n+ },\n+ {\"N1C(=O)NC(=O)C2CN=NC=21\", \"N1C(=O)NC(=O)C2CN=NC2=1\"}},\n // ---------------------------\n // more stereochemistry\n // ---------------------------\n@@ -447,7 +459,13 @@ TEST_CASE(\"tautomer v2\") {\n {{\"C/C=C/O\", \"C/C=C\\\\O\", \"CC=CO\"}, {}},\n {{\"C/C=C/C=O\", \"C/C=C\\\\C=O\", \"CC=CC=O\"}, {}},\n {{\"C/C=C/CC=O\"}, {\"C/C=C\\\\CC=O\", \"CC=CCC=O\"}},\n- {{\"C1C=CC=C2C=C(O)NC=12\", \"C1C=CC=C2CC(=O)NC=12\"}, {}},\n+ {{\"C1C=CC=C2CC(=O)NC=12\", \"C2=C1N=C(CC1=CC=C2)O\",\n+ \"C1C=CC=C2CC(O)=NC=12\"\n+\n+ },\n+ {\n+ \"C1C=CC=C2C=C(O)NC=12\",\n+ }},\n // ---------------------------\n // some areas for potential improvement\n // ---------------------------\n@@ -500,7 +518,7 @@ TEST_CASE(\"tautomer v2\") {\n {\"CC(C)(C)C=O\", \"CC(C)(C)[CH][O]_0_0\",\n \"[CH3]-[C](-[CH3])(-[CH3])-[CH]=[O]_0_0\"},\n {\"CC(C)=CO\", \"C[C](C)[CH][O]_1_0\", \"[CH3]-[C](-[CH3]):[C]:[O]_2_0\"},\n- {\"COC=O\", \"CO[CH][O]_0_0\", \"[CH3]-[O]:[C]:[O]_1_0\"},\n+ {\"COC=O\", \"CO[CH][O]_0_0\", \"[CH3]-[O]-[CH]=[O]_0_0\"},\n {\"CNC=O\", \"C[N][CH][O]_1_0\", \"[CH3]-[N]:[C]:[O]_2_0\"},\n {\"CN(C)C=O\", \"CN(C)[CH][O]_0_0\", \"[CH3]-[N](-[CH3]):[C]:[O]_1_0\"},\n {\"CC(C)(C)NC=O\", \"CC(C)(C)[N][CH][O]_1_0\",\n@@ -519,7 +537,7 @@ TEST_CASE(\"tautomer v2\") {\n \"[C]:[C](:[O]):[C]-[CH2]-[CH3]_5_0\"},\n {\"C=CCC(O)C\", \"C=CCC(C)[O]_1_0\",\n \"[CH2]=[CH]-[CH2]-[CH](-[CH3])-[OH]_0_0\"},\n- {\"C=NC(=O)C\", \"[CH2][N][C](C)[O]_0_0\", \"[C]:[N]:[C](:[C]):[O]_5_0\"},\n+ {\"C=NC(=O)C\", \"[CH2][N][C](C)[O]_0_0\", \"[C]:[N]:[C](-[CH3]):[O]_2_0\"},\n {\"C=NC(O)=C\", \"[CH2][N][C]([CH2])[O]_1_0\", \"[C]:[N]:[C](:[C]):[O]_5_0\"},\n {\"CC(=O)CC(=O)C\", \"C[C]([O])C[C](C)[O]_0_0\",\n \"[C]:[C](:[O]):[C]:[C](:[C]):[O]_8_0\"},\n@@ -874,4 +892,44 @@ TEST_CASE(\"overreach with v2 tautomer hashes and imines\") {\n \"[CH3]-[C@H](-[F])-[N]:[C]1:[C]-[CH2]-[CH2]-[CH2]-[C]:1_4_0\");\n }\n }\n+}\n+\n+TEST_CASE(\"v2 tautomers, carboxylic acids, amids, and related structures\") {\n+ SECTION(\"basics\") {\n+ std::vector<std::pair<std::string, std::string>> data = {\n+ {\"CC(=O)O\", \"[CH3]-[C](:[O]):[O]_1_0\"},\n+ {\"CC(=O)OCC\", \"[CH3]-[CH2]-[O]-[C](-[CH3])=[O]_0_0\"},\n+ {\"CC(=N)O\", \"[CH3]-[C](:[N]):[O]_2_0\"},\n+ {\"CC(=O)NCC\", \"[CH3]-[CH2]-[N]:[C](-[CH3]):[O]_1_0\"},\n+ {\"CC(=N)N\", \"[C]:[C](:[N]):[N]_6_0\"},\n+ };\n+ for (const auto &[smiles, ref] : data) {\n+ INFO(smiles);\n+ auto m = v2::SmilesParse::MolFromSmiles(smiles);\n+ REQUIRE(m);\n+ auto hsh =\n+ MolHash::MolHash(m.get(), MolHash::HashFunction::HetAtomTautomerv2);\n+ CHECK(hsh == ref);\n+ }\n+ }\n+ SECTION(\"specific problems\") {\n+ std::vector<std::pair<std::string, std::string>> data = {\n+ // losing amino acid chirality:\n+ {\"CC(C)C[C@@H](C(=O)O)N\",\n+ \"[CH3]-[CH](-[CH3])-[CH2]-[C@H](-[NH2])-[C](:[O]):[O]_1_0\"},\n+ // github #8090 (carboxylate)\n+ {\"O=C(O)CCC\", \"[CH3]-[CH2]-[CH2]-[C](:[O]):[O]_1_0\"},\n+ // aromatic \"imine\"\n+ {\"CC[C@@H](N)C1=NC=CN1\",\n+ \"[CH3]-[CH2]-[C@@H](-[NH2])-[C]1:[N]:[C]:[C]:[N]:1_3_0\"},\n+ };\n+ for (const auto &[smiles, ref] : data) {\n+ INFO(smiles);\n+ auto m = v2::SmilesParse::MolFromSmiles(smiles);\n+ REQUIRE(m);\n+ auto hsh =\n+ MolHash::MolHash(m.get(), MolHash::HashFunction::HetAtomTautomerv2);\n+ CHECK(hsh == ref);\n+ }\n+ }\n }\n\\ No newline at end of file\n", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}238{"question_id": "MSB_rdkit_rdkit_pr8192", "question_type": "multi_swe_bench", "description": "Simple fix to allow aromatic CIS/TRANS SMARTS to match molecules (rdkit/rdkit#8192)", "content": {"org": "rdkit", "repo": "rdkit", "pr_number": 8192, "issue_title": "Simple fix to allow aromatic CIS/TRANS SMARTS to match molecules", "issue_body": "Fixes #7944\r\n\r\nThis converts smarts / and \\ to match single or aromatic bonds with the appropriate bond direction.", "base_commit": "e7dd7b8a8aa92d18c2233a2444bc0f557cc3d1c5", "resolved_issues": [{"number": 7944, "title": "rxn.RunReactants mismatch directional bonds in a heterocycle ring", "body": "**Describe the bug**\r\nrxn.RunReactants mismatch directional bonds in a heterocycle ring when two aromatic atoms are connected by directional bonds.\r\n\r\n**To Reproduce**\r\nfrom rdkit import Chem\r\nfrom rdkit.Chem import rdChemReactions\r\n\r\n`rxn = rdChemReactions.ReactionFromSmarts(\"[O:1]=[c:2]1/[c:3](=[C:4]/[c:5]2:[c:10]:[c:9]:[c:8]:[c:7]:[c:6]:2):[s:11]:[c:12]2:[n:13]:1-[N:14]-[C:15]-[N:20]-[N:21]=2>>[S:11]=[C:12]1-[N:13]-[N:14]-[C:15]-[N:20]-[N:21]-1.[O]=[C:4]-[c:5]1:[c:10]:[c:9]:[c:8]:[c:7]:[c:6]:1.[C]-[C]-[O]-[C:2](=[O:1])-[C:3]-[Cl]\")`\r\n\r\n`reacts = [Chem.MolFromSmiles('[O:1]=[c:2]1/[c:3](=[CH:4]/[c:5]2[cH:6][cH:7][cH:8][cH:9][cH:10]2)[s:11][c:12]2[n:13]1[NH:14][C:15]1([CH2:16][CH2:17][CH2:18][CH2:19]1)[NH:20][N:21]=2')]`\r\n\r\n`products = rxn.RunReactants(reacts)`\r\n`len(products)`\r\n 0\r\n\r\n`rxn.GetReactants()[0].GetBondWithIdx(1).GetBondType()`\r\n rdkit.Chem.rdchem.BondType.SINGLE\r\n`reacts[0].GetBondWithIdx(1).GetBondType()`\r\n rdkit.Chem.rdchem.BondType.AROMATIC\r\n\r\n\r\n**Expected behavior**\r\nThe rxn is supposed to work for reactants and yield products. Bond 2-3 is the same directional bond by aromatic atoms ([c:2]1/[c:3]) for both rxn and reacts.\r\n\r\n\r\n**Configuration (please complete the following information):**\r\n - RDKit version: 2024.03.4\r\n - OS: Windows\r\n - Python version (if relevant): 3.12.4\r\n - Are you using conda? No\r\n - If you are using conda, which channel did you install the rdkit from?\r\n - If you are not using conda: how did you install the RDKit? pip install\r\n"}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/rdkit_m_rdkit:pr-8192", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/Code/GraphMol/SmilesParse/SmartsWrite.cpp b/Code/GraphMol/SmilesParse/SmartsWrite.cpp\nindex 77065da7a96..6446a99a103 100644\n--- a/Code/GraphMol/SmilesParse/SmartsWrite.cpp\n+++ b/Code/GraphMol/SmilesParse/SmartsWrite.cpp\n@@ -410,7 +410,19 @@ std::string getBondSmartsSimple(const Bond *bond,\n } else if (descrip == \"BondInRing\") {\n res += \"@\";\n } else if (descrip == \"SingleOrAromaticBond\") {\n- // don't need to do anything here... :-)\n+ auto dir = bond->getBondDir();\n+ switch(dir) {\n+ case Bond::ENDDOWNRIGHT: {\n+ res += \"\\\\\";\n+ break;\n+ }\n+ case Bond::ENDUPRIGHT: {\n+ res += \"/\";\n+ break;\n+ }\n+ default:\n+ break;\n+ }\n } else if (descrip == \"SingleOrDoubleBond\") {\n res += \"-,=\";\n } else if (descrip == \"DoubleOrAromaticBond\") {\n@@ -1040,4 +1052,4 @@ std::string MolFragmentToCXSmarts(const ROMol &mol,\n return res;\n }\n \n-} // namespace RDKit\n\\ No newline at end of file\n+} // namespace RDKit\ndiff --git a/Code/GraphMol/SmilesParse/lex.yysmarts.cpp.cmake b/Code/GraphMol/SmilesParse/lex.yysmarts.cpp.cmake\nindex bec2ec0a604..c6ff0e64ef6 100644\n--- a/Code/GraphMol/SmilesParse/lex.yysmarts.cpp.cmake\n+++ b/Code/GraphMol/SmilesParse/lex.yysmarts.cpp.cmake\n@@ -1733,6 +1733,7 @@ YY_RULE_SETUP\n #line 362 \"smarts.ll\"\n { yylval->bond = new QueryBond(Bond::SINGLE);\n \tyylval->bond->setBondDir(Bond::ENDDOWNRIGHT);\n+\tyylval->bond->setQuery(makeSingleOrAromaticBondQuery());\n \treturn BOND_TOKEN; }\n \tYY_BREAK\n case 153:\n@@ -1740,6 +1741,7 @@ YY_RULE_SETUP\n #line 366 \"smarts.ll\"\n { yylval->bond = new QueryBond(Bond::SINGLE);\n \tyylval->bond->setBondDir(Bond::ENDUPRIGHT);\n+\tyylval->bond->setQuery(makeSingleOrAromaticBondQuery());\n \treturn BOND_TOKEN; }\n \tYY_BREAK\n case 154:\ndiff --git a/Code/GraphMol/SmilesParse/smarts.ll b/Code/GraphMol/SmilesParse/smarts.ll\nindex 5de37432b14..874a5a8a43b 100644\n--- a/Code/GraphMol/SmilesParse/smarts.ll\n+++ b/Code/GraphMol/SmilesParse/smarts.ll\n@@ -360,10 +360,12 @@ A\t\t\t{\n \n [\\\\]{1,2} { yylval->bond = new QueryBond(Bond::SINGLE);\n \tyylval->bond->setBondDir(Bond::ENDDOWNRIGHT);\n+\tyylval->bond->setQuery(makeSingleOrAromaticBondQuery());\n \treturn BOND_TOKEN; }\n \n [\\/] { yylval->bond = new QueryBond(Bond::SINGLE);\n \tyylval->bond->setBondDir(Bond::ENDUPRIGHT);\n+\tyylval->bond->setQuery(makeSingleOrAromaticBondQuery());\t\n \treturn BOND_TOKEN; }\n \n \\-\\> {\n"}, "test": {"test_patch": "diff --git a/Code/GraphMol/SmilesParse/smatest.cpp b/Code/GraphMol/SmilesParse/smatest.cpp\nindex 379e77978e7..54c4098869f 100644\n--- a/Code/GraphMol/SmilesParse/smatest.cpp\n+++ b/Code/GraphMol/SmilesParse/smatest.cpp\n@@ -1167,6 +1167,16 @@ void testSmartsStereochem() {\n _checkMatches(\"C/C=C/C\", \"C/C=C/C\", 1, 4);\n _checkMatches(\"C/C=C/C\", \"C\\\\C=C\\\\C\", 1, 4);\n _checkMatches(\"C/C=C/C\", \"C/C=C\\\\C\", 1, 4);\n+ \n+ // directional bonds are set to be a direction \\ /\n+ // and a query - SingleOrAromatic, make sure that this\n+ // is their current representation\n+ auto m1 = \"C/C=C\\\\C\"_smarts;\n+ TEST_ASSERT(m1->getBondWithIdx(0)->hasQuery());\n+ TEST_ASSERT(m1->getBondWithIdx(0)->getQuery()->getDescription() == \"SingleOrAromaticBond\");\n+\n+ auto m2 = \"O=c1/c(=C/c2ccccc2)sc2n1-N-C-N-N=2\"_smarts;\n+ TEST_ASSERT(MolToSmarts(*m2) == \"O=c1/c(=C/c2ccccc2)sc2n1-N-C-N-N=2\");\n \n BOOST_LOG(rdInfoLog) << \"\\tdone\" << std::endl;\n }\ndiff --git a/Code/GraphMol/Substruct/catch_tests.cpp b/Code/GraphMol/Substruct/catch_tests.cpp\nindex 0c007677a52..cbf014fded4 100644\n--- a/Code/GraphMol/Substruct/catch_tests.cpp\n+++ b/Code/GraphMol/Substruct/catch_tests.cpp\n@@ -840,4 +840,18 @@ M END)CTAB\"_ctab;\n CHECK(SubstructMatch(*m_single, *m_aromatic, ps).size() == 1);\n CHECK(SubstructMatch(*m_aromatic, *m_single, ps).size() == 1);\n }\n-}\n\\ No newline at end of file\n+}\n+\n+TEST_CASE(\"Github #7295\", \"CIS/TRANS in aromatic ring\") {\n+ SECTION(\"Smart CIS/TRANS bonds should match single or aromatic\"){\n+ SubstructMatchParameters ps;\n+\n+ auto query = \"[O:1]=[c:2]1/[c:3](=[C:4]/[c:5]2:[c:10]:[c:9]:[c:8]:[c:7]:[c:6]:2):[s:11]:[c:12]2:[n:13]:1-[N:14]-[C:15]-[N:20]-[N:21]=2\"_smarts;\n+ auto mol = \"[O:1]=[c:2]1/[c:3](=[CH:4]/[c:5]2[cH:6][cH:7][cH:8][cH:9][cH:10]2)[s:11][c:12]2[n:13]1[NH:14][C:15]1([CH2:16][CH2:17][CH2:18][CH2:19]1)[NH:20][N:21]=2\"_smiles;\n+ CHECK(SubstructMatch(*mol, *query, ps).size() == 1);\n+ ps.useChirality = true;\n+ CHECK(SubstructMatch(*mol, *query, ps).size() == 1);\n+ auto mol2 = \"[O:1]=[c:2]1\\\\[c:3](=[CH:4]/[c:5]2[cH:6][cH:7][cH:8][cH:9][cH:10]2)[s:11][c:12]2[n:13]1[NH:14][C:15]1([CH2:16][CH2:17][CH2:18][CH2:19]1)[NH:20][N:21]=2\"_smiles;\n+ CHECK(SubstructMatch(*mol2, *query, ps).size() == 0);\n+ }\n+}\n", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}239{"question_id": "MSB_rdkit_rdkit_pr8342", "question_type": "multi_swe_bench", "description": "Fixes #7983 (rdkit/rdkit#8342)", "content": {"org": "rdkit", "repo": "rdkit", "pr_number": 8342, "issue_title": "Fixes #7983", "issue_body": "This is an alternate (and hopefully correct) approach to the fix earlier proposed in #8242 \r\n\r\nWe fix this by moving the call to `cleanupAtropisomerStereoGroups()` into `assignStereochemistry()`.\r\n\r\nThis also adds some more tests.\r\n\r\nMore explanation coming.\r\n", "base_commit": "fe5ccb7d47d5b0173e43215351b8cb99c8363250", "resolved_issues": [{"number": 7983, "title": "Stereogroup lost when importing chiral sulfoxide from v3000 molfile", "body": "Hello,\n\nWe came across the following issue.\n\nWhen I import a compound containing a chiral sulfoxide with the corresponding stereogroup, the behavior is different when I import from cxsmiles vs when I import from v3000 molfile.\n\n```\nfrom rdkit import Chem\nsmilesParserParams = Chem.SmilesParserParams()\nsmilesParserParams.allowCXSMILES = True\n\nsource_smi = 'Cc1ccc(NC(=O)OCc2ccccc2[S@](C)=O)cc1 |a:16|'\nmol: Chem.Mol = Chem.MolFromSmiles(source_smi, smilesParserParams)\nmol.Debug()\n\n```\nResult:\n...\n\t16 16 S chg: 0 deg: 3 exp: 4 imp: 0 hyb: SP3 chi: CCW nbrs:[15 17 18]\nStereo Groups:\n\t0 ABS rId: 0 wId: 0 atoms: { 16 }\n\n```\nm3k = '''\n Mrv2317 02032512242D \n\n 0 0 0 0 0 999 V3000\nM V30 BEGIN CTAB\nM V30 COUNTS 21 22 0 0 0\nM V30 BEGIN ATOM\nM V30 1 C -4.001 -2.31 0 0\nM V30 2 C -2.6674 -3.08 0 0\nM V30 3 C -1.3337 -2.31 0 0\nM V30 4 C 0 -3.08 0 0\nM V30 5 C 0 -4.6198 0 0\nM V30 6 N 1.3337 -5.3898 0 0\nM V30 7 C 2.6674 -4.6198 0 0\nM V30 8 O 2.6674 -3.08 0 0\nM V30 9 O 4.001 -5.3898 0 0\nM V30 10 C 5.3345 -4.6198 0 0\nM V30 11 C 6.6682 -5.3898 0 0\nM V30 12 C 8.0019 -4.6198 0 0\nM V30 13 C 9.3356 -5.3898 0 0\nM V30 14 C 9.3356 -6.9298 0 0\nM V30 15 C 8.0019 -7.6998 0 0\nM V30 16 C 6.6682 -6.9298 0 0\nM V30 17 S 5.3345 -7.6998 0 0 CFG=2\nM V30 18 C 4.001 -6.9298 0 0\nM V30 19 O 5.3345 -9.2398 0 0\nM V30 20 C -1.3337 -5.3898 0 0\nM V30 21 C -2.6674 -4.6198 0 0\nM V30 END ATOM\nM V30 BEGIN BOND\nM V30 1 1 1 2\nM V30 2 4 2 3\nM V30 3 4 3 4\nM V30 4 4 4 5\nM V30 5 1 5 6\nM V30 6 1 6 7\nM V30 7 2 7 8\nM V30 8 1 7 9\nM V30 9 1 9 10\nM V30 10 1 10 11\nM V30 11 4 11 12\nM V30 12 4 12 13\nM V30 13 4 13 14\nM V30 14 4 14 15\nM V30 15 4 15 16\nM V30 16 4 11 16\nM V30 17 1 17 16\nM V30 18 2 17 19\nM V30 19 4 5 20\nM V30 20 4 20 21\nM V30 21 4 2 21\nM V30 22 1 17 18 CFG=1\nM V30 END BOND\nM V30 BEGIN COLLECTION\nM V30 MDLV30/STEABS ATOMS=(1 17)\nM V30 END COLLECTION\nM V30 END CTAB\nM END\n'''\nm3 = Chem.MolFromMolBlock(m3k)\nm3.Debug()\n```\nResult:\n\t16 16 S chg: 0 deg: 3 exp: 4 imp: 0 hyb: SP3 chi: CW nbrs:[15 18 17]\n\nBut no stereogroup included.\n\nThis seems specific to sulfoxides.\n\nThe issue can be reproduced in:\nRDKit:2024.03.5\nRDKit:2024.09.2\n\n**Configuration (please complete the following information):**\n\n - OS: windows 11 \n - Python version (if relevant): 3.11\n - Are you using conda? Yes\n - If you are using conda, which channel did you install the rdkit from? Conda-forge\n - If you are not using conda: how did you install the RDKit?\n\n"}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/rdkit_m_rdkit:pr-8342", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/Code/GraphMol/Atropisomers.cpp b/Code/GraphMol/Atropisomers.cpp\nindex 0b23d7f1ed6..61ef68129a5 100644\n--- a/Code/GraphMol/Atropisomers.cpp\n+++ b/Code/GraphMol/Atropisomers.cpp\n@@ -283,7 +283,7 @@ std::pair<bool, Bond::BondDir> getBondDir(\n return {true, Bond::BondDir::NONE};\n }\n \n-bool DetectAtropisomerChiralityOneBond(Bond *bond, ROMol &mol,\n+void DetectAtropisomerChiralityOneBond(Bond *bond, ROMol &mol,\n const Conformer *conf) {\n // the approach is this:\n // we will view the system along the line from the potential atropisomer\n@@ -307,7 +307,7 @@ bool DetectAtropisomerChiralityOneBond(Bond *bond, ROMol &mol,\n // one vector for each end - each one - should end up with 1 or 2 entries\n AtropAtomAndBondVec atomAndBondVecs[2];\n if (!getAtropisomerAtomsAndBonds(bond, atomAndBondVecs, mol)) {\n- return false; // not an atropisomer\n+ return; // not an atropisomer\n }\n \n // make sure we do not have wiggle bonds\n@@ -315,7 +315,7 @@ bool DetectAtropisomerChiralityOneBond(Bond *bond, ROMol &mol,\n for (auto atomAndBondVec : atomAndBondVecs) {\n for (auto endBond : atomAndBondVec.second) {\n if (endBond->getBondDir() == Bond::UNKNOWN) {\n- return false; // not an atropisomer\n+ return; // not an atropisomer\n }\n }\n }\n@@ -341,19 +341,19 @@ bool DetectAtropisomerChiralityOneBond(Bond *bond, ROMol &mol,\n std::pair<bool, Bond::BondDir> bond1DirResult;\n bond1DirResult = getBondDir(bond, atomAndBondVecs[0]);\n if (!bond1DirResult.first) {\n- return false;\n+ return;\n }\n std::pair<bool, Bond::BondDir> bond2DirResult;\n bond2DirResult = getBondDir(bond, atomAndBondVecs[1]);\n if (!bond2DirResult.first) {\n- return false;\n+ return;\n }\n if (bond1DirResult.second == bond2DirResult.second) {\n BOOST_LOG(rdWarningLog)\n << \"inconsistent bond wedging for an atropisomer. Atoms are: \"\n << bond->getBeginAtomIdx() << \" \" << bond->getEndAtomIdx()\n << std::endl;\n- return false;\n+ return;\n }\n \n if (bond1DirResult.second == Bond::BEGINWEDGE ||\n@@ -364,7 +364,7 @@ bool DetectAtropisomerChiralityOneBond(Bond *bond, ROMol &mol,\n bond->setStereo(Bond::BondStereo::STEREOATROPCW);\n }\n \n- return true;\n+ return;\n }\n \n // create a frame of reference that has its X-axis along the atrop bond\n@@ -375,7 +375,7 @@ bool DetectAtropisomerChiralityOneBond(Bond *bond, ROMol &mol,\n BOOST_LOG(rdWarningLog)\n << \"Failed to get a frame of reference along an atropisomer bond - atoms are: \"\n << bond->getBeginAtomIdx() << \" \" << bond->getEndAtomIdx() << std::endl;\n- return false;\n+ return;\n }\n RDGeom::Point3D bondVecs[2]; // one bond vector from each end of the\n // potential atropisomer bond\n@@ -395,12 +395,12 @@ bool DetectAtropisomerChiralityOneBond(Bond *bond, ROMol &mol,\n \n bondDirResult = getBondDir(bond, atomAndBondVecs[bondAtomIndex]);\n if (!bondDirResult.first) {\n- return false;\n+ return;\n }\n \n if (!getAtropIsomerEndVect(atomAndBondVecs[bondAtomIndex], yAxis, zAxis,\n conf, bondVecs[bondAtomIndex])) {\n- return false;\n+ return;\n }\n \n if (bondDirResult.second == Bond::BEGINWEDGE) {\n@@ -453,7 +453,7 @@ bool DetectAtropisomerChiralityOneBond(Bond *bond, ROMol &mol,\n << \"Both bonds on one end of an atropisomer are on the same side - atoms are: \"\n << bond->getBeginAtomIdx() << \" \" << bond->getEndAtomIdx()\n << std::endl;\n- return false;\n+ return;\n }\n }\n \n@@ -462,7 +462,7 @@ bool DetectAtropisomerChiralityOneBond(Bond *bond, ROMol &mol,\n << \"Failed to find a bond on one end of an atropisomer that is NOT co-linear - atoms are: \"\n << bond->getBeginAtomIdx() << \" \" << bond->getEndAtomIdx()\n << std::endl;\n- return false;\n+ return;\n }\n }\n }\n@@ -477,10 +477,8 @@ bool DetectAtropisomerChiralityOneBond(Bond *bond, ROMol &mol,\n BOOST_LOG(rdWarningLog)\n << \"The 2 defining bonds for an atropisomer are co-planar - atoms are: \"\n << bond->getBeginAtomIdx() << \" \" << bond->getEndAtomIdx() << std::endl;\n- return false;\n+ return;\n }\n-\n- return true;\n }\n \n void cleanupAtropisomerStereoGroups(ROMol &mol) {\n@@ -537,7 +535,6 @@ void detectAtropisomerChirality(ROMol &mol, const Conformer *conf) {\n }\n }\n \n- bool foundAtrop = false;\n for (auto bondToTry : bondsToTry) {\n if (bondToTry->getBeginAtom()->needsUpdatePropertyCache()) {\n bondToTry->getBeginAtom()->updatePropertyCache(false);\n@@ -554,13 +551,7 @@ void detectAtropisomerChirality(ROMol &mol, const Conformer *conf) {\n continue;\n }\n \n- if (DetectAtropisomerChiralityOneBond(bondToTry, mol, conf)) {\n- foundAtrop = true;\n- }\n- }\n-\n- if (foundAtrop) {\n- cleanupAtropisomerStereoGroups(mol);\n+ DetectAtropisomerChiralityOneBond(bondToTry, mol, conf);\n }\n }\n void getAllAtomIdsForStereoGroup(\ndiff --git a/Code/GraphMol/Atropisomers.h b/Code/GraphMol/Atropisomers.h\nindex 86c8d5442dd..2d61c4ad9f8 100644\n--- a/Code/GraphMol/Atropisomers.h\n+++ b/Code/GraphMol/Atropisomers.h\n@@ -1,5 +1,5 @@\n //\n-// Copyright (C) 2004-203 Tad hurst/CDD and other RDKit contributors\n+// Copyright (C) 2004-2025 Tad Hurst/CDD and other RDKit contributors\n //\n // @@ All Rights Reserved @@\n // This file is part of the RDKit.\n@@ -37,6 +37,8 @@ RDKIT_GRAPHMOL_EXPORT void getAllAtomIdsForStereoGroup(\n std::vector<unsigned int> &atomIds,\n const std::map<int, std::unique_ptr<RDKit::Chirality::WedgeInfoBase>>\n &wedgeBonds);\n+\n+RDKIT_GRAPHMOL_EXPORT void cleanupAtropisomerStereoGroups(ROMol &mol);\n } // namespace Atropisomers\n } // namespace RDKit\n #endif\ndiff --git a/Code/GraphMol/Chirality.cpp b/Code/GraphMol/Chirality.cpp\nindex c32f551caaa..091ab815383 100644\n--- a/Code/GraphMol/Chirality.cpp\n+++ b/Code/GraphMol/Chirality.cpp\n@@ -2402,6 +2402,7 @@ void legacyStereoPerception(ROMol &mol, bool cleanIt,\n }\n }\n }\n+ bool foundAtropisomer = false;\n for (auto bond : mol.bonds()) {\n // wedged bonds to atoms that have no stereochem\n // should be removed. (github issue 87)\n@@ -2411,15 +2412,16 @@ void legacyStereoPerception(ROMol &mol, bool cleanIt,\n bond->getEndAtom()->getChiralTag() == Atom::CHI_UNSPECIFIED) {\n // see if there is an atropisomer bond connected to this bond\n \n- bool hasAtropisomer = false;\n+ bool atomHasAtropisomer = false;\n for (auto nbond : mol.atomBonds(bond->getBeginAtom())) {\n if (nbond->getStereo() == Bond::STEREOATROPCCW ||\n nbond->getStereo() == Bond::STEREOATROPCW) {\n- hasAtropisomer = true;\n+ atomHasAtropisomer = true;\n+ foundAtropisomer = true;\n break;\n }\n }\n- if (!hasAtropisomer) {\n+ if (!atomHasAtropisomer) {\n bond->setBondDir(Bond::NONE);\n }\n }\n@@ -2459,6 +2461,9 @@ void legacyStereoPerception(ROMol &mol, bool cleanIt,\n }\n }\n }\n+ if (foundAtropisomer || Atropisomers::doesMolHaveAtropisomers(mol)) {\n+ Atropisomers::cleanupAtropisomerStereoGroups(mol);\n+ }\n Chirality::cleanupStereoGroups(mol);\n }\n }\n@@ -2544,6 +2549,7 @@ void stereoPerception(ROMol &mol, bool cleanIt,\n // populate double bond stereo info:\n updateDoubleBondStereo(mol, sinfo, cleanIt);\n if (cleanIt) {\n+ Atropisomers::cleanupAtropisomerStereoGroups(mol);\n Chirality::cleanupStereoGroups(mol);\n }\n }\n@@ -2914,9 +2920,9 @@ void findPotentialStereoBonds(ROMol &mol, bool cleanIt) {\n if (begAtomNeighbors.size() > 0 && endAtomNeighbors.size() > 0) {\n if ((begAtomNeighbors.size() == 2) &&\n (endAtomNeighbors.size() == 2)) {\n-// if both of the atoms have 2 neighbors (other than the one\n-// connected\n-// by the double bond) and ....\n+ // if both of the atoms have 2 neighbors (other than the one\n+ // connected\n+ // by the double bond) and ....\n if ((ranks[begAtomNeighbors[0]] !=\n ranks[begAtomNeighbors[1]]) &&\n (ranks[endAtomNeighbors[0]] !=\ndiff --git a/Code/GraphMol/FileParsers/CMakeLists.txt b/Code/GraphMol/FileParsers/CMakeLists.txt\nindex 3258e3bc304..6a809d8e118 100644\n--- a/Code/GraphMol/FileParsers/CMakeLists.txt\n+++ b/Code/GraphMol/FileParsers/CMakeLists.txt\n@@ -96,6 +96,11 @@ rdkit_catch_test(v2MolSuppliers v2_suppliers_catch.cpp\n rdkit_catch_test(v2FileParsersCatchTest v2_file_parsers_catch.cpp\n LINK_LIBRARIES FileParsers)\n \n+rdkit_catch_test(atropisomersCatch atropisomers_catch.cpp\n+ LINK_LIBRARIES FileParsers)\n+\n+\n+\n if(RDK_TEST_MULTITHREADED AND RDK_BUILD_THREADSAFE_SSS)\n rdkit_catch_test(multithreadedSupplierCatchTest multithreaded_supplier_catch.cpp\n LINK_LIBRARIES FileParsers)\ndiff --git a/Code/GraphMol/FileParsers/MolFileParser.cpp b/Code/GraphMol/FileParsers/MolFileParser.cpp\nindex 39355176278..fb741d70b89 100644\n--- a/Code/GraphMol/FileParsers/MolFileParser.cpp\n+++ b/Code/GraphMol/FileParsers/MolFileParser.cpp\n@@ -3351,7 +3351,9 @@ void finishMolProcessing(\n const Conformer &conf = res->getConformer();\n if (chiralityPossible || conf.is3D()) {\n if (!conf.is3D()) {\n- DetectAtomStereoChemistry(*res, &conf);\n+ bool replaceExistingTags = true;\n+ MolOps::assignChiralTypesFromBondDirs(*res, conf.getId(),\n+ replaceExistingTags);\n } else {\n res->updatePropertyCache(false);\n MolOps::assignChiralTypesFrom3D(*res, conf.getId(), true);\ndiff --git a/Code/GraphMol/FileParsers/atropisomers_catch.cpp b/Code/GraphMol/FileParsers/atropisomers_catch.cpp\nnew file mode 100644\nindex 00000000000..03dfe14cb18\n--- /dev/null\n+++ b/Code/GraphMol/FileParsers/atropisomers_catch.cpp\n@@ -0,0 +1,129 @@\n+//\n+// Copyright (C) 2025 Greg Landrum and other RDKit contributors\n+// @@ All Rights Reserved @@\n+// This file is part of the RDKit.\n+// The contents are covered by the terms of the BSD license\n+// which is included in the file license.txt, found at the root\n+// of the RDKit source tree.\n+//\n+\n+#include <string>\n+\n+#include \"RDGeneral/test.h\"\n+#include <catch2/catch_all.hpp>\n+#include <GraphMol/RDKitBase.h>\n+#include <GraphMol/Chirality.h>\n+#include <GraphMol/FileParsers/FileParsers.h>\n+#include <GraphMol/FileParsers/MolSupplier.h>\n+#include <GraphMol/SmilesParse/SmilesWrite.h>\n+#include <GraphMol/test_fixtures.h>\n+\n+using namespace RDKit;\n+\n+TEST_CASE(\"explicit tests\") {\n+ // making some of the other atropisomer tests explicitly test what we expect\n+ std::string rdbase = getenv(\"RDBASE\");\n+ REQUIRE(rdbase != \"\");\n+ SECTION(\"basics\") {\n+ std::string file =\n+ rdbase +\n+ \"/Code/GraphMol/FileParsers/test_data/atropisomers/AtropManyChirals.sdf\";\n+ auto mol = v2::FileParsers::MolFromMolFile(file);\n+ REQUIRE(mol);\n+ CHECK(mol->getBondWithIdx(7)->getStereo() ==\n+ Bond::BondStereo::STEREOATROPCCW);\n+ }\n+ SECTION(\"macrocycle\") {\n+ std::string file =\n+ rdbase +\n+ \"/Code/GraphMol/FileParsers/test_data/atropisomers/macrocycle-5-meta-Cl-ortho-hash.sdf\";\n+ auto mol = v2::FileParsers::MolFromMolFile(file);\n+ REQUIRE(mol);\n+ CHECK(mol->getBondWithIdx(15)->getStereo() ==\n+ Bond::BondStereo::STEREOATROPCW);\n+ }\n+ SECTION(\"with stereo groups and other chiral centers\") {\n+ REQUIRE(rdbase != \"\");\n+ std::string file =\n+ rdbase +\n+ \"/Code/GraphMol/FileParsers/test_data/atropisomers/AtropManyChiralsEnhanced.sdf\";\n+ auto mol = v2::FileParsers::MolFromMolFile(file);\n+ REQUIRE(mol);\n+ CHECK(mol->getBondWithIdx(7)->getStereo() ==\n+ Bond::BondStereo::STEREOATROPCCW);\n+ CHECK(mol->getAtomWithIdx(6)->getChiralTag() ==\n+ Atom::ChiralType::CHI_UNSPECIFIED);\n+ CHECK(mol->getAtomWithIdx(9)->getChiralTag() !=\n+ Atom::ChiralType::CHI_UNSPECIFIED);\n+ CHECK(mol->getAtomWithIdx(13)->getChiralTag() !=\n+ Atom::ChiralType::CHI_UNSPECIFIED);\n+ CHECK(mol->getAtomWithIdx(16)->getChiralTag() !=\n+ Atom::ChiralType::CHI_UNSPECIFIED);\n+ CHECK(mol->getAtomWithIdx(10)->getChiralTag() !=\n+ Atom::ChiralType::CHI_UNSPECIFIED);\n+\n+ REQUIRE(mol->getStereoGroups().size() == 2);\n+ {\n+ const auto &sg = mol->getStereoGroups()[0];\n+ CHECK(sg.getAtoms().size() == 2);\n+ CHECK(sg.getBonds().size() == 1);\n+ }\n+ {\n+ const auto &sg = mol->getStereoGroups()[1];\n+ CHECK(sg.getAtoms().size() == 2);\n+ CHECK(sg.getBonds().size() == 0);\n+ }\n+ }\n+}\n+\n+TEST_CASE(\"atropisomerism and dependent chirality\") {\n+ SECTION(\"chirality allows stereoisomers\") {\n+ {\n+ auto m = \"C=C(C)C1=CC([C@H](C)O)=CC([C@@H](C)O)=C1 |wD:3.14|\"_smiles;\n+ REQUIRE(m);\n+ CHECK(m->getBondWithIdx(2)->getStereo() ==\n+ Bond::BondStereo::STEREOATROPCW);\n+ }\n+#if 0\n+ // FIX: this test does not work, this is Github #8340\n+ {\n+ // the two stereocenters are identical, we should not have atropisomerism\n+ auto m = \"C=C(C)C1=CC([C@H](C)O)=CC([C@H](C)O)=C1 |wD:3.14|\"_smiles;\n+ REQUIRE(m);\n+ CHECK(m->getBondWithIdx(2)->getStereo() == Bond::BondStereo::STEREONONE);\n+ }\n+#endif\n+ }\n+\n+ SECTION(\"atropisomers allow chirality\") {\n+#if 0\n+ // FIX: this test does not work\n+ {\n+ // here the atropisomeric bonds have opposite stereochemistry, so the\n+ // central atom should be chiral, this is Github #8341\n+ auto m =\n+ \"C=C(C1C=C(C)C=CC=1)[C@H](C)C(=C)C1C=C(C)C=CC=1 |wD:2.2,wD:13.14|\"_smiles;\n+ REQUIRE(m);\n+ CHECK(m->getBondWithIdx(1)->getStereo() ==\n+ Bond::BondStereo::STEREOATROPCCW);\n+ CHECK(m->getBondWithIdx(12)->getStereo() ==\n+ Bond::BondStereo::STEREOATROPCCW);\n+ CHECK(m->getAtomWithIdx(9)->getChiralTag() !=\n+ Atom::ChiralType::CHI_UNSPECIFIED);\n+ }\n+#endif\n+ {\n+ // here the atropisomeric bonds have the same stereochemistry, so the\n+ // central atom should not be chiral\n+ auto m =\n+ \"C=C(C1C=C(C)C=CC=1)[C@H](C)C(=C)C1C=C(C)C=CC=1 |wD:2.2,wU:13.14|\"_smiles;\n+ REQUIRE(m);\n+ CHECK(m->getBondWithIdx(1)->getStereo() ==\n+ Bond::BondStereo::STEREOATROPCCW);\n+ CHECK(m->getBondWithIdx(12)->getStereo() ==\n+ Bond::BondStereo::STEREOATROPCW);\n+ CHECK(m->getAtomWithIdx(9)->getChiralTag() ==\n+ Atom::ChiralType::CHI_UNSPECIFIED);\n+ }\n+ }\n+}\ndiff --git a/Code/GraphMol/MolOps.h b/Code/GraphMol/MolOps.h\nindex c6252488494..60984810f8c 100644\n--- a/Code/GraphMol/MolOps.h\n+++ b/Code/GraphMol/MolOps.h\n@@ -1085,8 +1085,7 @@ RDKIT_GRAPHMOL_EXPORT void assignChiralTypesFrom3D(\n RDKIT_GRAPHMOL_EXPORT void assignStereochemistryFrom3D(\n ROMol &mol, int confId = -1, bool replaceExistingTags = true);\n \n-//! \\brief Use bond directions to assign ChiralTypes to a molecule's atoms and\n-//! stereo flags to its bonds\n+//! \\brief Use bond directions to assign ChiralTypes to a molecule's atoms\n /*!\n \n \\param mol the molecule of interest\ndiff --git a/Code/GraphMol/catch_chirality.cpp b/Code/GraphMol/catch_chirality.cpp\nindex 3abd59ecb0d..0dc5eb3f597 100644\n--- a/Code/GraphMol/catch_chirality.cpp\n+++ b/Code/GraphMol/catch_chirality.cpp\n@@ -5999,4 +5999,132 @@ TEST_CASE(\n CHECK(m->getAtomWithIdx(0)->hasProp(common_properties::_CIPCode) == false);\n CHECK(m->getBondWithIdx(0)->hasProp(common_properties::_CIPCode) == false);\n }\n+}\n+\n+TEST_CASE(\"Github issue #7983: stereogroup lost on chiral sulfoxide\") {\n+ SECTION(\"basics\") {\n+ auto m = R\"CTAB(\n+ Mrv2317 02032512242D \n+\n+ 0 0 0 0 0 999 V3000\n+M V30 BEGIN CTAB\n+M V30 COUNTS 21 22 0 0 0\n+M V30 BEGIN ATOM\n+M V30 1 C -4.001 -2.31 0 0\n+M V30 2 C -2.6674 -3.08 0 0\n+M V30 3 C -1.3337 -2.31 0 0\n+M V30 4 C 0 -3.08 0 0\n+M V30 5 C 0 -4.6198 0 0\n+M V30 6 N 1.3337 -5.3898 0 0\n+M V30 7 C 2.6674 -4.6198 0 0\n+M V30 8 O 2.6674 -3.08 0 0\n+M V30 9 O 4.001 -5.3898 0 0\n+M V30 10 C 5.3345 -4.6198 0 0\n+M V30 11 C 6.6682 -5.3898 0 0\n+M V30 12 C 8.0019 -4.6198 0 0\n+M V30 13 C 9.3356 -5.3898 0 0\n+M V30 14 C 9.3356 -6.9298 0 0\n+M V30 15 C 8.0019 -7.6998 0 0\n+M V30 16 C 6.6682 -6.9298 0 0\n+M V30 17 S 5.3345 -7.6998 0 0 CFG=2\n+M V30 18 C 4.001 -6.9298 0 0\n+M V30 19 O 5.3345 -9.2398 0 0\n+M V30 20 C -1.3337 -5.3898 0 0\n+M V30 21 C -2.6674 -4.6198 0 0\n+M V30 END ATOM\n+M V30 BEGIN BOND\n+M V30 1 1 1 2\n+M V30 2 4 2 3\n+M V30 3 4 3 4\n+M V30 4 4 4 5\n+M V30 5 1 5 6\n+M V30 6 1 6 7\n+M V30 7 2 7 8\n+M V30 8 1 7 9\n+M V30 9 1 9 10\n+M V30 10 1 10 11\n+M V30 11 4 11 12\n+M V30 12 4 12 13\n+M V30 13 4 13 14\n+M V30 14 4 14 15\n+M V30 15 4 15 16\n+M V30 16 4 11 16\n+M V30 17 1 17 16\n+M V30 18 2 17 19\n+M V30 19 4 5 20\n+M V30 20 4 20 21\n+M V30 21 4 2 21\n+M V30 22 1 17 18 CFG=1\n+M V30 END BOND\n+M V30 BEGIN COLLECTION\n+M V30 MDLV30/STEABS ATOMS=(1 17)\n+M V30 END COLLECTION\n+M V30 END CTAB\n+M END)CTAB\"_ctab;\n+ REQUIRE(m);\n+ auto &sgs = m->getStereoGroups();\n+ REQUIRE(sgs.size() == 1);\n+ CHECK(sgs[0].getGroupType() == StereoGroupType::STEREO_ABSOLUTE);\n+ CHECK(sgs[0].getAtoms().size() == 1);\n+ CHECK(sgs[0].getAtoms().at(0)->getIdx() == 16);\n+ }\n+ SECTION(\"making sure sulfoxides do not trigger atropisomerism\") {\n+ auto m = R\"CTAB(\n+ RDKit 2D\n+\n+ 0 0 0 0 0 0 0 0 0 0999 V3000\n+M V30 BEGIN CTAB\n+M V30 COUNTS 10 10 0 0 0\n+M V30 BEGIN ATOM\n+M V30 1 C 1.892852 4.651432 0.000000 0\n+M V30 2 C 3.199931 3.915535 0.000000 0\n+M V30 3 C 3.216171 2.415622 0.000000 0\n+M V30 4 C 1.925330 1.651602 0.000000 0\n+M V30 5 C 0.618251 2.387492 0.000000 0\n+M V30 6 C 0.602011 3.887408 0.000000 0\n+M V30 7 S -0.705072 4.623298 0.000000 0\n+M V30 8 C -0.672591 1.623472 0.000000 0\n+M V30 9 O -0.721314 6.123210 0.000000 0\n+M V30 10 C -1.995913 3.859276 0.000000 0\n+M V30 END ATOM\n+M V30 BEGIN BOND\n+M V30 1 2 1 2\n+M V30 2 1 2 3\n+M V30 3 2 3 4\n+M V30 4 1 4 5\n+M V30 5 2 5 6\n+M V30 6 1 6 1 CFG=1\n+M V30 7 1 6 7\n+M V30 8 1 5 8\n+M V30 9 2 7 9\n+M V30 10 1 7 10 CFG=1\n+M V30 END BOND\n+M V30 BEGIN COLLECTION\n+M V30 MDLV30/STEABS ATOMS=(1 7)\n+M V30 END COLLECTION\n+M V30 END CTAB\n+M END\n+$$$$\n+)CTAB\"_ctab;\n+ REQUIRE(m);\n+ CHECK(m->getAtomWithIdx(6)->getChiralTag() !=\n+ Atom::ChiralType::CHI_UNSPECIFIED);\n+ CHECK(m->getBondBetweenAtoms(5, 6)->getStereo() ==\n+ Bond::BondStereo::STEREONONE);\n+ }\n+ SECTION(\"examples from #8323\") {\n+ std::string pathName = getenv(\"RDBASE\");\n+ pathName += \"/Code/GraphMol/test_data/Github8323.sdf\";\n+ SDMolSupplier suppl(pathName);\n+ while (!suppl.atEnd()) {\n+ auto mol = suppl.next();\n+ REQUIRE(mol);\n+ auto &sgs = mol->getStereoGroups();\n+ REQUIRE(sgs.size() == 1);\n+ REQUIRE(mol->hasProp(\"StereoGroupOnAtom\"));\n+ auto aid = std::stoul(mol->getProp<std::string>(\"StereoGroupOnAtom\"));\n+ CHECK(sgs[0].getAtoms().size() == 1);\n+ CHECK(sgs[0].getAtoms().at(0)->getIdx() == aid);\n+ }\n+ }\n }\n\\ No newline at end of file\n"}, "test": {"test_patch": "diff --git a/Code/GraphMol/FileParsers/test_data/atropisomers/AtropManyChiralsEnhanced.sdf.expected.sdf b/Code/GraphMol/FileParsers/test_data/atropisomers/AtropManyChiralsEnhanced.sdf.expected.sdf\nindex 2bd3de0b0bd..6f329a3ca47 100644\n--- a/Code/GraphMol/FileParsers/test_data/atropisomers/AtropManyChiralsEnhanced.sdf.expected.sdf\n+++ b/Code/GraphMol/FileParsers/test_data/atropisomers/AtropManyChiralsEnhanced.sdf.expected.sdf\n@@ -49,7 +49,7 @@ M V30 19 1 17 19\n M V30 20 2 6 20\n M V30 END BOND\n M V30 BEGIN COLLECTION\n-M V30 MDLV30/STEREL1 ATOMS=(3 10 14 7)\n+M V30 MDLV30/STEREL1 ATOMS=(3 7 10 14)\n M V30 MDLV30/STERAC1 ATOMS=(2 11 17)\n M V30 END COLLECTION\n M V30 END CTAB\ndiff --git a/Code/GraphMol/FileParsers/test_data/atropisomers/AtropManyChiralsEnhanced2.sdf.expected.sdf b/Code/GraphMol/FileParsers/test_data/atropisomers/AtropManyChiralsEnhanced2.sdf.expected.sdf\nindex a3c275f5b70..146d0a2411e 100644\n--- a/Code/GraphMol/FileParsers/test_data/atropisomers/AtropManyChiralsEnhanced2.sdf.expected.sdf\n+++ b/Code/GraphMol/FileParsers/test_data/atropisomers/AtropManyChiralsEnhanced2.sdf.expected.sdf\n@@ -49,7 +49,7 @@ M V30 19 1 17 19\n M V30 20 2 6 20\n M V30 END BOND\n M V30 BEGIN COLLECTION\n-M V30 MDLV30/STEABS ATOMS=(3 10 14 7)\n+M V30 MDLV30/STEABS ATOMS=(3 7 10 14)\n M V30 MDLV30/STERAC1 ATOMS=(2 11 17)\n M V30 END COLLECTION\n M V30 END CTAB\ndiff --git a/Code/GraphMol/MarvinParse/test_data/AtropEnhancedStereo.mrv.nosan.expected.mrv b/Code/GraphMol/MarvinParse/test_data/AtropEnhancedStereo.mrv.nosan.expected.mrv\nindex c3518dc67a8..8d8ce27eab6 100644\n--- a/Code/GraphMol/MarvinParse/test_data/AtropEnhancedStereo.mrv.nosan.expected.mrv\n+++ b/Code/GraphMol/MarvinParse/test_data/AtropEnhancedStereo.mrv.nosan.expected.mrv\n@@ -1,2 +1,2 @@\n <?xml version=\"1.0\" encoding=\"utf-8\"?>\n-<cml xmlns=\"http://www.chemaxon.com\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"http://www.chemaxon.com http://www.chemaxon.com/marvin/schema/mrvSchema_20_20_0.xsd\"><MDocument><MChemicalStruct><molecule molID=\"m1\"><atomArray><atom id=\"a1\" elementType=\"C\" x2=\"-1.39593\" y2=\"-1.93907\"/><atom id=\"a2\" elementType=\"C\" x2=\"-2.72947\" y2=\"-2.70907\"/><atom id=\"a3\" elementType=\"C\" x2=\"-2.72947\" y2=\"-4.24926\"/><atom id=\"a4\" elementType=\"C\" x2=\"-1.39593\" y2=\"-5.01926\"/><atom id=\"a5\" elementType=\"C\" x2=\"-0.0621933\" y2=\"-4.24926\"/><atom id=\"a6\" elementType=\"C\" x2=\"-0.0621933\" y2=\"-2.70907\"/><atom id=\"a7\" elementType=\"C\" x2=\"-1.39597\" y2=\"-0.399073\" mrvStereoGroup=\"or1\"/><atom id=\"a8\" elementType=\"N\" x2=\"1.27148\" y2=\"-1.93906\"/><atom id=\"a9\" elementType=\"C\" x2=\"-4.06317\" y2=\"-1.9391\"/><atom id=\"a10\" elementType=\"C\" x2=\"-0.0624033\" y2=\"0.370886\"/><atom id=\"a11\" elementType=\"C\" x2=\"-0.0623567\" y2=\"1.91107\"/><atom id=\"a12\" elementType=\"C\" x2=\"-1.39588\" y2=\"2.68111\"/><atom id=\"a13\" elementType=\"C\" x2=\"-2.72964\" y2=\"1.91115\"/><atom id=\"a14\" elementType=\"C\" x2=\"-2.72968\" y2=\"0.370967\"/><atom id=\"a15\" elementType=\"O\" x2=\"1.27127\" y2=\"-0.399126\"/><atom id=\"a16\" elementType=\"C\" x2=\"-4.06338\" y2=\"-0.399004\"/></atomArray><bondArray><bond id=\"b1\" atomRefs2=\"a1 a2\" order=\"2\"/><bond id=\"b2\" atomRefs2=\"a2 a3\" order=\"1\"/><bond id=\"b3\" atomRefs2=\"a3 a4\" order=\"2\"/><bond id=\"b4\" atomRefs2=\"a4 a5\" order=\"1\"/><bond id=\"b5\" atomRefs2=\"a5 a6\" order=\"2\"/><bond id=\"b6\" atomRefs2=\"a6 a1\" order=\"1\"/><bond id=\"b7\" atomRefs2=\"a1 a7\" order=\"1\"/><bond id=\"b8\" atomRefs2=\"a2 a9\" order=\"1\"/><bond id=\"b9\" atomRefs2=\"a10 a11\" order=\"1\"/><bond id=\"b10\" atomRefs2=\"a11 a12\" order=\"2\"/><bond id=\"b11\" atomRefs2=\"a12 a13\" order=\"1\"/><bond id=\"b12\" atomRefs2=\"a13 a14\" order=\"2\"/><bond id=\"b13\" atomRefs2=\"a7 a10\" order=\"2\"/><bond id=\"b14\" atomRefs2=\"a7 a14\" order=\"1\"><bondStereo>W</bondStereo></bond><bond id=\"b15\" atomRefs2=\"a14 a16\" order=\"1\"/><bond id=\"b16\" atomRefs2=\"a10 a15\" order=\"1\"/><bond id=\"b17\" atomRefs2=\"a6 a8\" order=\"1\"/></bondArray></molecule></MChemicalStruct></MDocument></cml>\n\\ No newline at end of file\n+<cml xmlns=\"http://www.chemaxon.com\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"http://www.chemaxon.com http://www.chemaxon.com/marvin/schema/mrvSchema_20_20_0.xsd\"><MDocument><MChemicalStruct><molecule molID=\"m1\"><atomArray><atom id=\"a1\" elementType=\"C\" x2=\"-1.39593\" y2=\"-1.93907\" mrvStereoGroup=\"or1\"/><atom id=\"a2\" elementType=\"C\" x2=\"-2.72947\" y2=\"-2.70907\"/><atom id=\"a3\" elementType=\"C\" x2=\"-2.72947\" y2=\"-4.24926\"/><atom id=\"a4\" elementType=\"C\" x2=\"-1.39593\" y2=\"-5.01926\"/><atom id=\"a5\" elementType=\"C\" x2=\"-0.0621933\" y2=\"-4.24926\"/><atom id=\"a6\" elementType=\"C\" x2=\"-0.0621933\" y2=\"-2.70907\"/><atom id=\"a7\" elementType=\"C\" x2=\"-1.39597\" y2=\"-0.399073\"/><atom id=\"a8\" elementType=\"N\" x2=\"1.27148\" y2=\"-1.93906\"/><atom id=\"a9\" elementType=\"C\" x2=\"-4.06317\" y2=\"-1.9391\"/><atom id=\"a10\" elementType=\"C\" x2=\"-0.0624033\" y2=\"0.370886\"/><atom id=\"a11\" elementType=\"C\" x2=\"-0.0623567\" y2=\"1.91107\"/><atom id=\"a12\" elementType=\"C\" x2=\"-1.39588\" y2=\"2.68111\"/><atom id=\"a13\" elementType=\"C\" x2=\"-2.72964\" y2=\"1.91115\"/><atom id=\"a14\" elementType=\"C\" x2=\"-2.72968\" y2=\"0.370967\"/><atom id=\"a15\" elementType=\"O\" x2=\"1.27127\" y2=\"-0.399126\"/><atom id=\"a16\" elementType=\"C\" x2=\"-4.06338\" y2=\"-0.399004\"/></atomArray><bondArray><bond id=\"b1\" atomRefs2=\"a1 a2\" order=\"2\"/><bond id=\"b2\" atomRefs2=\"a2 a3\" order=\"1\"/><bond id=\"b3\" atomRefs2=\"a3 a4\" order=\"2\"/><bond id=\"b4\" atomRefs2=\"a4 a5\" order=\"1\"/><bond id=\"b5\" atomRefs2=\"a5 a6\" order=\"2\"/><bond id=\"b6\" atomRefs2=\"a6 a1\" order=\"1\"/><bond id=\"b7\" atomRefs2=\"a1 a7\" order=\"1\"/><bond id=\"b8\" atomRefs2=\"a2 a9\" order=\"1\"/><bond id=\"b9\" atomRefs2=\"a10 a11\" order=\"1\"/><bond id=\"b10\" atomRefs2=\"a11 a12\" order=\"2\"/><bond id=\"b11\" atomRefs2=\"a12 a13\" order=\"1\"/><bond id=\"b12\" atomRefs2=\"a13 a14\" order=\"2\"/><bond id=\"b13\" atomRefs2=\"a7 a10\" order=\"2\"/><bond id=\"b14\" atomRefs2=\"a7 a14\" order=\"1\"><bondStereo>W</bondStereo></bond><bond id=\"b15\" atomRefs2=\"a14 a16\" order=\"1\"/><bond id=\"b16\" atomRefs2=\"a10 a15\" order=\"1\"/><bond id=\"b17\" atomRefs2=\"a6 a8\" order=\"1\"/></bondArray></molecule></MChemicalStruct></MDocument></cml>\n\\ No newline at end of file\ndiff --git a/Code/GraphMol/MarvinParse/test_data/AtropEnhancedStereo.mrv.nosan.expected.sdf b/Code/GraphMol/MarvinParse/test_data/AtropEnhancedStereo.mrv.nosan.expected.sdf\nindex dac8923f3c9..b68f5788152 100644\n--- a/Code/GraphMol/MarvinParse/test_data/AtropEnhancedStereo.mrv.nosan.expected.sdf\n+++ b/Code/GraphMol/MarvinParse/test_data/AtropEnhancedStereo.mrv.nosan.expected.sdf\n@@ -42,7 +42,7 @@ M V30 16 1 10 15\n M V30 17 1 6 8\n M V30 END BOND\n M V30 BEGIN COLLECTION\n-M V30 MDLV30/STEREL1 ATOMS=(1 7)\n+M V30 MDLV30/STEREL1 ATOMS=(1 1)\n M V30 END COLLECTION\n M V30 END CTAB\n M END\ndiff --git a/Code/GraphMol/MarvinParse/test_data/AtropManyChiralsEnhanced.mrv.nosan.expected.sdf b/Code/GraphMol/MarvinParse/test_data/AtropManyChiralsEnhanced.mrv.nosan.expected.sdf\nindex 426a4a19dd8..16b9d65271a 100644\n--- a/Code/GraphMol/MarvinParse/test_data/AtropManyChiralsEnhanced.mrv.nosan.expected.sdf\n+++ b/Code/GraphMol/MarvinParse/test_data/AtropManyChiralsEnhanced.mrv.nosan.expected.sdf\n@@ -49,7 +49,7 @@ M V30 19 1 18 19 CFG=1\n M V30 20 1 18 20\n M V30 END BOND\n M V30 BEGIN COLLECTION\n-M V30 MDLV30/STEREL1 ATOMS=(3 11 15 8)\n+M V30 MDLV30/STEREL1 ATOMS=(3 8 11 15)\n M V30 MDLV30/STERAC1 ATOMS=(2 12 18)\n M V30 END COLLECTION\n M V30 END CTAB\ndiff --git a/Code/GraphMol/MarvinParse/test_data/AtropManyChiralsEnhanced2.mrv.nosan.expected.sdf b/Code/GraphMol/MarvinParse/test_data/AtropManyChiralsEnhanced2.mrv.nosan.expected.sdf\nindex 30d76c1bd8c..8fd896c62da 100644\n--- a/Code/GraphMol/MarvinParse/test_data/AtropManyChiralsEnhanced2.mrv.nosan.expected.sdf\n+++ b/Code/GraphMol/MarvinParse/test_data/AtropManyChiralsEnhanced2.mrv.nosan.expected.sdf\n@@ -49,7 +49,7 @@ M V30 19 1 18 19 CFG=1\n M V30 20 1 18 20\n M V30 END BOND\n M V30 BEGIN COLLECTION\n-M V30 MDLV30/STEABS ATOMS=(3 11 15 8)\n+M V30 MDLV30/STEABS ATOMS=(3 8 11 15)\n M V30 MDLV30/STERAC1 ATOMS=(2 12 18)\n M V30 END COLLECTION\n M V30 END CTAB\ndiff --git a/Code/GraphMol/MarvinParse/test_data/AtropManyChiralsEnhanced3.mrv.nosan.expected.sdf b/Code/GraphMol/MarvinParse/test_data/AtropManyChiralsEnhanced3.mrv.nosan.expected.sdf\nindex c87bac9d130..52e876af68d 100644\n--- a/Code/GraphMol/MarvinParse/test_data/AtropManyChiralsEnhanced3.mrv.nosan.expected.sdf\n+++ b/Code/GraphMol/MarvinParse/test_data/AtropManyChiralsEnhanced3.mrv.nosan.expected.sdf\n@@ -49,7 +49,7 @@ M V30 19 1 18 19 CFG=1\n M V30 20 1 18 20\n M V30 END BOND\n M V30 BEGIN COLLECTION\n-M V30 MDLV30/STERAC1 ATOMS=(3 11 15 8)\n+M V30 MDLV30/STERAC1 ATOMS=(3 8 11 15)\n M V30 MDLV30/STERAC2 ATOMS=(2 12 18)\n M V30 END COLLECTION\n M V30 END CTAB\ndiff --git a/Code/GraphMol/MarvinParse/test_data/AtropManyChiralsEnhanced4.mrv.nosan.expected.mrv b/Code/GraphMol/MarvinParse/test_data/AtropManyChiralsEnhanced4.mrv.nosan.expected.mrv\nindex f8f99c1afec..85c5ba7b198 100644\n--- a/Code/GraphMol/MarvinParse/test_data/AtropManyChiralsEnhanced4.mrv.nosan.expected.mrv\n+++ b/Code/GraphMol/MarvinParse/test_data/AtropManyChiralsEnhanced4.mrv.nosan.expected.mrv\n@@ -1,2 +1,2 @@\n <?xml version=\"1.0\" encoding=\"utf-8\"?>\n-<cml xmlns=\"http://www.chemaxon.com\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"http://www.chemaxon.com http://www.chemaxon.com/marvin/schema/mrvSchema_20_20_0.xsd\"><MDocument><MChemicalStruct><molecule molID=\"m1\"><atomArray><atom id=\"a1\" elementType=\"O\" x2=\"2.8625\" y2=\"1.0561\"/><atom id=\"a2\" elementType=\"C\" x2=\"2.2921\" y2=\"-0.5174\"/><atom id=\"a3\" elementType=\"C\" x2=\"3.4688\" y2=\"-1.0018\"/><atom id=\"a4\" elementType=\"C\" x2=\"3.6019\" y2=\"-2.4682\"/><atom id=\"a5\" elementType=\"N\" x2=\"2.3988\" y2=\"-3.3169\"/><atom id=\"a6\" elementType=\"C\" x2=\"1.0621\" y2=\"-2.6992\"/><atom id=\"a7\" elementType=\"O\" x2=\"0.1062\" y2=\"-3.9298\"/><atom id=\"a8\" elementType=\"N\" x2=\"0.9288\" y2=\"-1.2328\" mrvStereoGroup=\"or1\"/><atom id=\"a9\" elementType=\"C\" x2=\"-0.5563\" y2=\"-0.6124\" mrvStereoGroup=\"or1\"/><atom id=\"a10\" elementType=\"C\" x2=\"-1.5367\" y2=\"-1.8\"/><atom id=\"a11\" elementType=\"C\" x2=\"-0.8947\" y2=\"0.9647\" mrvStereoGroup=\"or1\"/><atom id=\"a12\" elementType=\"C\" x2=\"-0.8778\" y2=\"2.5678\" mrvStereoGroup=\"and1\"/><atom id=\"a13\" elementType=\"C\" x2=\"-0.1398\" y2=\"3.9298\"/><atom id=\"a14\" elementType=\"Br\" x2=\"-1.9563\" y2=\"3.6407\"/><atom id=\"a15\" elementType=\"C\" x2=\"0.5974\" y2=\"1.3136\" mrvStereoGroup=\"or1\"/><atom id=\"a16\" elementType=\"F\" x2=\"1.1268\" y2=\"-0.0778\"/><atom id=\"a17\" elementType=\"C\" x2=\"1.9954\" y2=\"1.9251\"/><atom id=\"a18\" elementType=\"C\" x2=\"-2.4534\" y2=\"0.7177\" mrvStereoGroup=\"and1\"/><atom id=\"a19\" elementType=\"Cl\" x2=\"-3.6019\" y2=\"1.737\"/><atom id=\"a20\" elementType=\"C\" x2=\"-3.4495\" y2=\"-0.4655\"/></atomArray><bondArray><bond id=\"b1\" atomRefs2=\"a1 a2\" order=\"2\"/><bond id=\"b2\" atomRefs2=\"a2 a3\" order=\"1\"/><bond id=\"b3\" atomRefs2=\"a3 a4\" order=\"2\"/><bond id=\"b4\" atomRefs2=\"a4 a5\" order=\"1\"/><bond id=\"b5\" atomRefs2=\"a5 a6\" order=\"1\"/><bond id=\"b6\" atomRefs2=\"a6 a7\" order=\"2\"/><bond id=\"b7\" atomRefs2=\"a6 a8\" order=\"1\"/><bond id=\"b8\" atomRefs2=\"a8 a2\" order=\"1\"><bondStereo>W</bondStereo></bond><bond id=\"b9\" atomRefs2=\"a8 a9\" order=\"1\"/><bond id=\"b10\" atomRefs2=\"a9 a10\" order=\"2\"/><bond id=\"b11\" atomRefs2=\"a9 a11\" order=\"1\"><bondStereo>H</bondStereo></bond><bond id=\"b12\" atomRefs2=\"a11 a12\" order=\"1\"/><bond id=\"b13\" atomRefs2=\"a12 a13\" order=\"1\"/><bond id=\"b14\" atomRefs2=\"a12 a14\" order=\"1\"><bondStereo>W</bondStereo></bond><bond id=\"b15\" atomRefs2=\"a11 a15\" order=\"1\"><bondStereo>W</bondStereo></bond><bond id=\"b16\" atomRefs2=\"a15 a16\" order=\"1\"><bondStereo>H</bondStereo></bond><bond id=\"b17\" atomRefs2=\"a15 a17\" order=\"1\"/><bond id=\"b18\" atomRefs2=\"a11 a18\" order=\"1\"/><bond id=\"b19\" atomRefs2=\"a18 a19\" order=\"1\"><bondStereo>W</bondStereo></bond><bond id=\"b20\" atomRefs2=\"a18 a20\" order=\"1\"/></bondArray></molecule></MChemicalStruct></MDocument></cml>\n\\ No newline at end of file\n+<cml xmlns=\"http://www.chemaxon.com\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"http://www.chemaxon.com http://www.chemaxon.com/marvin/schema/mrvSchema_20_20_0.xsd\"><MDocument><MChemicalStruct><molecule molID=\"m1\"><atomArray><atom id=\"a1\" elementType=\"O\" x2=\"2.8625\" y2=\"1.0561\"/><atom id=\"a2\" elementType=\"C\" x2=\"2.2921\" y2=\"-0.5174\"/><atom id=\"a3\" elementType=\"C\" x2=\"3.4688\" y2=\"-1.0018\"/><atom id=\"a4\" elementType=\"C\" x2=\"3.6019\" y2=\"-2.4682\"/><atom id=\"a5\" elementType=\"N\" x2=\"2.3988\" y2=\"-3.3169\"/><atom id=\"a6\" elementType=\"C\" x2=\"1.0621\" y2=\"-2.6992\"/><atom id=\"a7\" elementType=\"O\" x2=\"0.1062\" y2=\"-3.9298\"/><atom id=\"a8\" elementType=\"N\" x2=\"0.9288\" y2=\"-1.2328\" mrvStereoGroup=\"or1\"/><atom id=\"a9\" elementType=\"C\" x2=\"-0.5563\" y2=\"-0.6124\"/><atom id=\"a10\" elementType=\"C\" x2=\"-1.5367\" y2=\"-1.8\"/><atom id=\"a11\" elementType=\"C\" x2=\"-0.8947\" y2=\"0.9647\" mrvStereoGroup=\"or1\"/><atom id=\"a12\" elementType=\"C\" x2=\"-0.8778\" y2=\"2.5678\" mrvStereoGroup=\"and1\"/><atom id=\"a13\" elementType=\"C\" x2=\"-0.1398\" y2=\"3.9298\"/><atom id=\"a14\" elementType=\"Br\" x2=\"-1.9563\" y2=\"3.6407\"/><atom id=\"a15\" elementType=\"C\" x2=\"0.5974\" y2=\"1.3136\" mrvStereoGroup=\"or1\"/><atom id=\"a16\" elementType=\"F\" x2=\"1.1268\" y2=\"-0.0778\"/><atom id=\"a17\" elementType=\"C\" x2=\"1.9954\" y2=\"1.9251\"/><atom id=\"a18\" elementType=\"C\" x2=\"-2.4534\" y2=\"0.7177\" mrvStereoGroup=\"and1\"/><atom id=\"a19\" elementType=\"Cl\" x2=\"-3.6019\" y2=\"1.737\"/><atom id=\"a20\" elementType=\"C\" x2=\"-3.4495\" y2=\"-0.4655\"/></atomArray><bondArray><bond id=\"b1\" atomRefs2=\"a1 a2\" order=\"2\"/><bond id=\"b2\" atomRefs2=\"a2 a3\" order=\"1\"/><bond id=\"b3\" atomRefs2=\"a3 a4\" order=\"2\"/><bond id=\"b4\" atomRefs2=\"a4 a5\" order=\"1\"/><bond id=\"b5\" atomRefs2=\"a5 a6\" order=\"1\"/><bond id=\"b6\" atomRefs2=\"a6 a7\" order=\"2\"/><bond id=\"b7\" atomRefs2=\"a6 a8\" order=\"1\"/><bond id=\"b8\" atomRefs2=\"a8 a2\" order=\"1\"><bondStereo>W</bondStereo></bond><bond id=\"b9\" atomRefs2=\"a8 a9\" order=\"1\"/><bond id=\"b10\" atomRefs2=\"a9 a10\" order=\"2\"/><bond id=\"b11\" atomRefs2=\"a9 a11\" order=\"1\"><bondStereo>H</bondStereo></bond><bond id=\"b12\" atomRefs2=\"a11 a12\" order=\"1\"/><bond id=\"b13\" atomRefs2=\"a12 a13\" order=\"1\"/><bond id=\"b14\" atomRefs2=\"a12 a14\" order=\"1\"><bondStereo>W</bondStereo></bond><bond id=\"b15\" atomRefs2=\"a11 a15\" order=\"1\"><bondStereo>W</bondStereo></bond><bond id=\"b16\" atomRefs2=\"a15 a16\" order=\"1\"><bondStereo>H</bondStereo></bond><bond id=\"b17\" atomRefs2=\"a15 a17\" order=\"1\"/><bond id=\"b18\" atomRefs2=\"a11 a18\" order=\"1\"/><bond id=\"b19\" atomRefs2=\"a18 a19\" order=\"1\"><bondStereo>W</bondStereo></bond><bond id=\"b20\" atomRefs2=\"a18 a20\" order=\"1\"/></bondArray></molecule></MChemicalStruct></MDocument></cml>\n\\ No newline at end of file\ndiff --git a/Code/GraphMol/MarvinParse/test_data/AtropManyChiralsEnhanced4.mrv.nosan.expected.sdf b/Code/GraphMol/MarvinParse/test_data/AtropManyChiralsEnhanced4.mrv.nosan.expected.sdf\nindex a601cb2f275..83121a8b6c8 100644\n--- a/Code/GraphMol/MarvinParse/test_data/AtropManyChiralsEnhanced4.mrv.nosan.expected.sdf\n+++ b/Code/GraphMol/MarvinParse/test_data/AtropManyChiralsEnhanced4.mrv.nosan.expected.sdf\n@@ -49,7 +49,7 @@ M V30 19 1 18 19 CFG=1\n M V30 20 1 18 20\n M V30 END BOND\n M V30 BEGIN COLLECTION\n-M V30 MDLV30/STEREL1 ATOMS=(4 11 15 8 9)\n+M V30 MDLV30/STEREL1 ATOMS=(3 8 11 15)\n M V30 MDLV30/STERAC1 ATOMS=(2 12 18)\n M V30 END COLLECTION\n M V30 END CTAB\ndiff --git a/Code/GraphMol/test_data/Github8323.sdf b/Code/GraphMol/test_data/Github8323.sdf\nnew file mode 100644\nindex 00000000000..20da45c6094\n--- /dev/null\n+++ b/Code/GraphMol/test_data/Github8323.sdf\n@@ -0,0 +1,152 @@\n+\n+ ACCLDraw03052509552D\n+\n+ 0 0 0 0 0 999 V3000\n+M V30 BEGIN CTAB\n+M V30 COUNTS 9 9 0 0 1\n+M V30 BEGIN ATOM\n+M V30 1 S 15.9078 -7.0163 0 0 CFG=2 \n+M V30 2 C 15.3149 -5.994 0 0 \n+M V30 3 O 15.319 -8.0401 0 0 \n+M V30 4 C 17.0876 -7.0147 0 0 \n+M V30 5 C 18.8552 -5.9903 0 0 \n+M V30 6 C 17.6773 -5.9908 0 0 \n+M V30 7 C 19.4475 -7.013 0 0 \n+M V30 8 C 18.863 -8.033 0 0 \n+M V30 9 C 17.6823 -8.0414 0 0 \n+M V30 END ATOM\n+M V30 BEGIN BOND\n+M V30 1 1 1 2 CFG=1 \n+M V30 2 2 1 3 \n+M V30 3 1 1 4 \n+M V30 4 1 5 6 \n+M V30 5 2 6 4 \n+M V30 6 2 5 7 \n+M V30 7 1 7 8 \n+M V30 8 2 8 9 \n+M V30 9 1 4 9 \n+M V30 END BOND\n+M V30 BEGIN COLLECTION\n+M V30 MDLV30/STEABS ATOMS=(1 1)\n+M V30 END COLLECTION\n+M V30 END CTAB\n+M END\n+> <StereoGroupOnAtom>\n+0\n+\n+$$$$\n+\n+ ACCLDraw03052509542D\n+\n+ 0 0 0 0 0 999 V3000\n+M V30 BEGIN CTAB\n+M V30 COUNTS 9 9 0 0 0\n+M V30 BEGIN ATOM\n+M V30 1 C 15.3149 -5.994 0 0 \n+M V30 2 S 15.9078 -7.0163 0 0 CFG=2 \n+M V30 3 O 15.319 -8.0401 0 0 \n+M V30 4 C 17.0876 -7.0147 0 0 \n+M V30 5 C 18.8552 -5.9903 0 0 \n+M V30 6 C 17.6773 -5.9908 0 0 \n+M V30 7 C 19.4475 -7.013 0 0 \n+M V30 8 C 18.863 -8.033 0 0 \n+M V30 9 C 17.6823 -8.0414 0 0 \n+M V30 END ATOM\n+M V30 BEGIN BOND\n+M V30 1 1 2 1 CFG=1 \n+M V30 2 2 2 3 \n+M V30 3 1 4 2 \n+M V30 4 1 5 6 \n+M V30 5 2 6 4 \n+M V30 6 2 7 5 \n+M V30 7 1 8 7 \n+M V30 8 2 9 8 \n+M V30 9 1 4 9 \n+M V30 END BOND\n+M V30 BEGIN COLLECTION\n+M V30 MDLV30/STERAC1 ATOMS=(1 2)\n+M V30 END COLLECTION\n+M V30 END CTAB\n+M END\n+> <StereoGroupOnAtom>\n+1\n+\n+$$$$\n+\n+ ACCLDraw03052510142D\n+\n+ 0 0 0 0 0 999 V3000\n+M V30 BEGIN CTAB\n+M V30 COUNTS 10 10 0 0 1\n+M V30 BEGIN ATOM\n+M V30 1 C 15.2801 -6.3814 0 0 \n+M V30 2 C 14.0994 -6.3853 0 0 \n+M V30 3 C 13.5125 -7.4099 0 0 \n+M V30 4 C 14.1063 -8.4305 0 0 \n+M V30 5 C 15.287 -8.4265 0 0 \n+M V30 6 C 15.8741 -7.4019 0 0 \n+M V30 7 C 17.0554 -7.4003 0 0 \n+M V30 8 S 17.6481 -8.4223 0 0 CFG=2 \n+M V30 9 O 17.0595 -9.4458 0 0 \n+M V30 10 C 18.8275 -8.4207 0 0 \n+M V30 END ATOM\n+M V30 BEGIN BOND\n+M V30 1 2 2 1 \n+M V30 2 1 3 2 \n+M V30 3 2 4 3 \n+M V30 4 1 5 4 \n+M V30 5 1 1 6 \n+M V30 6 2 6 5 \n+M V30 7 1 7 6 \n+M V30 8 1 8 7 CFG=1 \n+M V30 9 2 8 9 \n+M V30 10 1 10 8 \n+M V30 END BOND\n+M V30 BEGIN COLLECTION\n+M V30 MDLV30/STEABS ATOMS=(1 8)\n+M V30 END COLLECTION\n+M V30 END CTAB\n+M END\n+> <StereoGroupOnAtom>\n+7\n+\n+$$$$\n+\n+ ACCLDraw03052510142D\n+\n+ 0 0 0 0 0 999 V3000\n+M V30 BEGIN CTAB\n+M V30 COUNTS 10 10 0 0 0\n+M V30 BEGIN ATOM\n+M V30 1 C 15.2801 -6.3814 0 0 \n+M V30 2 C 14.0994 -6.3853 0 0 \n+M V30 3 C 13.5125 -7.4099 0 0 \n+M V30 4 C 14.1063 -8.4305 0 0 \n+M V30 5 C 15.287 -8.4265 0 0 \n+M V30 6 C 15.8741 -7.4019 0 0 \n+M V30 7 C 17.0554 -7.4003 0 0 \n+M V30 8 S 17.6481 -8.4223 0 0 CFG=2 \n+M V30 9 O 17.0595 -9.4458 0 0 \n+M V30 10 C 18.8275 -8.4207 0 0 \n+M V30 END ATOM\n+M V30 BEGIN BOND\n+M V30 1 2 2 1 \n+M V30 2 1 3 2 \n+M V30 3 2 4 3 \n+M V30 4 1 5 4 \n+M V30 5 1 1 6 \n+M V30 6 2 6 5 \n+M V30 7 1 7 6 \n+M V30 8 1 8 7 CFG=1 \n+M V30 9 2 8 9 \n+M V30 10 1 10 8 \n+M V30 END BOND\n+M V30 BEGIN COLLECTION\n+M V30 MDLV30/STERAC1 ATOMS=(1 8)\n+M V30 END COLLECTION\n+M V30 END CTAB\n+M END\n+> <StereoGroupOnAtom>\n+7\n+\n+$$$$\n\\ No newline at end of file\n", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}240{"question_id": "MSB_rdkit_rdkit_pr8368", "question_type": "multi_swe_bench", "description": "Fixes github #8205 (rdkit/rdkit#8368)", "content": {"org": "rdkit", "repo": "rdkit", "pr_number": 8368, "issue_title": "Fixes github #8205", "issue_body": "Recent changes to the v2 tautomer hash (likely #8173) had introduced an order-dependence (ordering of the bonds, not the atoms) in the resutlts.\r\n\r\nThis removes that order dependence as well as expanding the classes of systems which are explicitly not considered for tautomerism.\r\n \r\nIn addition to the tests I added here, I tested this by running through ~1.4 million compounds from ChEMBL35 and ensuring that the two hashes here are the same:\r\n```\r\n m = Chem.MolFromMolBlock(mb)\r\n if not m:\r\n continue\r\n smi = Chem.MolToSmiles(m)\r\n m2 = Chem.MolFromSmiles(smi)\r\n if not m2:\r\n continue\r\n if Chem.MolToSmiles(m2) != smi:\r\n # if we don't get the canonical SMILES right, we can give up here.\r\n continue\r\n h1 = rdMolHash.MolHash(m,rdMolHash.HashFunction.HetAtomTautomerv2)\r\n m2 = Chem.MolFromSmiles(smi)\r\n h2 = rdMolHash.MolHash(m2,rdMolHash.HashFunction.HetAtomTautomerv2)\r\n```", "base_commit": "d32c919066bd46fa54521be7eee57a91d16d348b", "resolved_issues": [{"number": 8205, "title": "order dependence in tautomer hash", "body": "**Describe the bug**\nHere's the reproducible:\n```\nIn [35]: print(b2)\n\n RDKit 2D\n\n 0 0 0 0 0 0 0 0 0 0999 V3000\nM V30 BEGIN CTAB\nM V30 COUNTS 15 16 0 0 0\nM V30 BEGIN ATOM\nM V30 1 C -0.006857 -1.225143 0.000000 0\nM V30 2 C -1.242571 -0.508286 0.000000 0\nM V30 3 C -2.481143 -1.220000 0.000000 0\nM V30 4 C -2.484000 -2.648571 0.000000 0\nM V30 5 N -1.248286 -3.365429 0.000000 0\nM V30 6 C -0.009714 -2.653714 0.000000 0\nM V30 7 O -3.722571 -3.360572 0.000000 0\nM V30 8 N -1.239714 0.920286 0.000000 0\nM V30 9 C 1.549143 3.346571 0.000000 0\nM V30 10 C 2.260857 2.108000 0.000000 0\nM V30 11 C 1.302857 1.048286 0.000000 0\nM V30 12 C -0.001143 1.632000 0.000000 0\nM V30 13 C 0.151143 3.052571 0.000000 0\nM V30 14 C -1.251227 -4.793997 0.000000 0\nM V30 15 C -0.908467 4.010717 0.000000 0\nM V30 END ATOM\nM V30 BEGIN BOND\nM V30 1 1 1 2\nM V30 2 2 2 3\nM V30 3 1 3 4\nM V30 4 1 4 5\nM V30 5 1 5 6\nM V30 6 2 6 1\nM V30 7 2 4 7\nM V30 8 1 2 8\nM V30 9 1 9 10\nM V30 10 1 10 11\nM V30 11 1 11 12\nM V30 12 1 12 13\nM V30 13 1 13 9\nM V30 14 1 12 8 CFG=1\nM V30 15 1 5 14\nM V30 16 1 13 15\nM V30 END BOND\nM V30 END CTAB\nM END\n$$$$\n\nIn [36]: m = Chem.MolFromMolBlock(b2)\n\nIn [37]: m2 = Chem.MolFromSmiles(Chem.MolToSmiles(m))\n\nIn [38]: rdMolHash.MolHash(m,rdMolHash.HashFunction.HetAtomTautomerv2)\nOut[38]: '[CH3]-[CH]1-[CH2]-[CH2]-[CH2]-[C]-1:[N]:[C]1:[C]:[C]:[N](-[CH3]):[C](:[O]):[C]:1_5_0'\n\nIn [39]: rdMolHash.MolHash(m2,rdMolHash.HashFunction.HetAtomTautomerv2)\nOut[39]: '[CH3]-[CH]1-[CH2]-[CH2]-[CH2]-[C@H]-1-[N]:[C]1:[C]:[C]:[N](-[CH3]):[C](:[O]):[C]:1_4_0'\n```\n\nRenumbering the atoms in m2 to match the numbering in m does not change the results for m2, so this seems to be related to the ordering of the bonds.\n\n**Configuration (please complete the following information):**\n - RDKit version: master and current release\n - OS: all\n"}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/rdkit_m_rdkit:pr-8368", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/Code/GraphMol/MolHash/hashfunctions.cpp b/Code/GraphMol/MolHash/hashfunctions.cpp\nindex c687eb6402f..f27e02cceeb 100644\n--- a/Code/GraphMol/MolHash/hashfunctions.cpp\n+++ b/Code/GraphMol/MolHash/hashfunctions.cpp\n@@ -387,11 +387,20 @@ constexpr std::uint64_t bondFlagCarboxyl =\n std::vector<std::uint64_t> getBondFlags(const ROMol &mol) {\n // FIX: oversimplified, but should work for now\n static std::vector<std::string> patterns{\n- \"[C;!$(C-C(=[NH])-[NH2])]-[C;!$(C(-C)(=[NH])-[NH2])](=[O,N,S])-[O,N,S]\", //< one side of the \"amide\", with an ugly exclusion for amidine\n- \"[C;!$(C=[O,N,S])]-[O,N,S]-C=[O,N,S]\", //< the other side\n+ \"[C;!$(C-C(=[NH])-[NH2])]-[C;!$(C(-C)(=[NH])-[NH2])](=[O,N,S])-[O,N,S]\",\n+ //< one side of the \"amide\", with an ugly exclusion for amidine\n+ \"[A;!$(C=[O,N,S])]-[O,N,S]-C=[O,N,S]\", //< the other side\n \"[OH0,SH0]-C=[O,N,S]\", //< \"esters\" and \"carboxyls\"\n+ \"C-[N;$([N+]=C(N)(N)),$(N-C(N)=N)]\", //< quanidine like\n \"[C]-[c](:[o,n,s]):[o,n,s]\", //< a limited version of handling this for\n // aromatic systems\n+ \"*[SD4](=*)=*\", // sulfates, sulfonyls, etc.\n+ \"*=[SD4](=*)*\", // the other side\n+ \"*-[H0]=,#[C,N]=,#*\", // isocyanates, azides, et al\n+ \"*[#7+]-[O-]\", // nitro groups and aromatic n-oxides\n+ \"[O,S;H]-P=O\", // phosphoric acid, etc.\n+ \"[#6]-P=O\", // phosphoric acid, etc.\n+ \"[#6]-N=[SD4]=*\" // don't know what this one is called\n };\n static std::vector<std::unique_ptr<RDKit::RWMol>> queries;\n if (queries.empty()) {\n@@ -504,6 +513,41 @@ bool skipNeighborBond(const Atom *atom, const Atom *otherAtom,\n (!isUnsaturatedBond(nbrBond) && !nbrBond->getIsConjugated() &&\n !hasStartBond(atom, startBonds))));\n }\n+\n+// counts the number of neighboring atoms that have conjugated bonds.\n+unsigned int getNumConjugatedNeighbors(\n+ const Atom *atom, const boost::dynamic_bitset<> &startBonds) {\n+ unsigned int res = 0;\n+ for (auto nbr : atom->getOwningMol().atomNeighbors(atom)) {\n+ for (auto nbrBond : atom->getOwningMol().atomBonds(nbr)) {\n+ if (nbrBond->getIsConjugated() || startBonds[nbrBond->getIdx()]) {\n+ ++res;\n+ break;\n+ }\n+ }\n+ }\n+ return res;\n+}\n+// special case to prevent \"overreach\" with things like enamines.\n+// the logic here prevents the first bond in CNC=C from being\n+// included in the tautomeric system. So we get: [CH3]-[N]:[C]:[C]\n+// instead of [C]:[N]:[C]:[C]\n+// returns true if the bond is a candidate for overreach.\n+// The arguments are, with atom indices corresponding to the example above:\n+// atom: atom 1\n+// oatom: atom 0\n+// bond: bond between atom 1 and atom 2\n+// nbrBond: bond between atom 1 and atom 0\n+bool checkForOverreach(\n+ const Atom *atom, const Atom *oatom, const Bond *bond, const Bond *nbrBond,\n+ const boost::dynamic_bitset<> &startBonds,\n+ const std::vector<unsigned int> &numConjugatedNeighbors) {\n+ return (startBonds[bond->getIdx()] || hasStartBond(atom, startBonds)) &&\n+ !startBonds[nbrBond->getIdx()] && isHeteroAtom(atom) &&\n+ !isUnsaturatedBond(nbrBond) &&\n+ numConjugatedNeighbors[oatom->getIdx()] < 2;\n+}\n+\n } // namespace\n \n std::string TautomerHashv2(RWMol *mol, bool proto, bool useCXSmiles,\n@@ -523,9 +567,15 @@ std::string TautomerHashv2(RWMol *mol, bool proto, bool useCXSmiles,\n \n boost::dynamic_bitset<> startBonds(mol->getNumBonds());\n for (const auto bnd : mol->bonds()) {\n- startBonds.set(bnd->getIdx(),\n- isPossibleStartingBond(bnd, atomFlags, bondFlags));\n+ auto isStartBond = isPossibleStartingBond(bnd, atomFlags, bondFlags);\n+ startBonds.set(bnd->getIdx(), isStartBond);\n }\n+ std::vector<unsigned int> numConjugatedNeighbors(mol->getNumAtoms(), 0);\n+ for (const auto atm : mol->atoms()) {\n+ numConjugatedNeighbors[atm->getIdx()] =\n+ getNumConjugatedNeighbors(atm, startBonds);\n+ }\n+\n #ifdef VERBOSE_HASH\n std::cerr << \" START BONDS: \" << startBonds << std::endl;\n #endif\n@@ -536,7 +586,11 @@ std::string TautomerHashv2(RWMol *mol, bool proto, bool useCXSmiles,\n !startBonds[bptr->getIdx()]) {\n continue;\n }\n+#ifdef VERBOSE_HASH\n+ std::cerr << \"START BOND: \" << bptr->getIdx() << std::endl;\n+#endif\n boost::dynamic_bitset<> conjSystem(mol->getNumBonds());\n+ boost::dynamic_bitset<> conjAtoms(mol->getNumAtoms());\n boost::dynamic_bitset<> atomsInSystem(mol->getNumAtoms());\n unsigned int numDonorCs = 0;\n unsigned int activeHeteroHs = 0;\n@@ -557,31 +611,24 @@ std::string TautomerHashv2(RWMol *mol, bool proto, bool useCXSmiles,\n }\n auto oatom = nbrBond->getOtherAtom(atm);\n \n- // if the bond is unsaturated or to an atom with free Hs, include it:\n- // if (isUnsaturatedBond(nbrBond) || oatom->getTotalNumHs()) {\n-\n #ifdef VERBOSE_HASH\n std::cerr << \" check neighbor1 \" << nbrBond->getIdx() << \" from \"\n << atm->getIdx() << \"-\" << oatom->getIdx() << std::endl;\n std::cerr << \" \" << bondsConsidered[nbrBond->getIdx()] << \" icao \"\n- << isCandidateAtom(oatom) << \" hsbo \"\n- << hasStartBond(oatom, startBonds) << \" atomunsato \"\n- << queryAtomUnsaturated(oatom) << \" atomunsat \"\n- << queryAtomUnsaturated(atm) << \" bondunsat \"\n+ << isCandidateAtom(oatom, atomFlags) << \" hsbo \"\n+ << hasStartBond(oatom, startBonds) << \" unsat \"\n << isUnsaturatedBond(nbrBond) << \" icaa \"\n- << isCandidateAtom(atm) << \" hsba \"\n- << hasStartBond(atm, startBonds) << std::endl;\n+ << isCandidateAtom(atm, atomFlags) << \" hsba \"\n+ << hasStartBond(atm, startBonds)\n+ << \" ncno: \" << numConjugatedNeighbors[oatom->getIdx()]\n+ << std::endl;\n #endif\n- // special case to prevent \"overreach\" with things like enamines.\n- // the logic here prevents the first bond in CNC=C from being included\n- // in the tautomeric system. So we get: [CH3]-[N]:[C] instead of\n- // [C]:[N]:[C]\n- if (startBonds[bptr->getIdx()] && isHeteroAtom(atm) &&\n- !isUnsaturatedBond(nbrBond)) {\n+ if (checkForOverreach(atm, oatom, bptr, nbrBond, startBonds,\n+ numConjugatedNeighbors)) {\n continue;\n }\n \n- // if both bonds are not eligible, then we can skip this neighbor\n+ // if the bond is not eligible, then we can skip this neighbor\n if (skipNeighborBond(atm, oatom, nbrBond, startBonds, atomFlags,\n bondFlags) &&\n skipNeighborBond(oatom, atm, nbrBond, startBonds, atomFlags,\n@@ -589,18 +636,21 @@ std::string TautomerHashv2(RWMol *mol, bool proto, bool useCXSmiles,\n continue;\n }\n \n+ if (std::find(bq.begin(), bq.end(), nbrBond) == bq.end()) {\n #ifdef VERBOSE_HASH\n- std::cerr << \" push \" << nbrBond->getIdx() << \" \"\n- << nbrBond->getBeginAtomIdx() << \"-\"\n- << nbrBond->getEndAtomIdx() << std::endl;\n- std::cerr << \" #### SET1 \" << bptr->getIdx() << std::endl;\n+ std::cerr << \" push \" << nbrBond->getIdx() << \" \"\n+ << nbrBond->getBeginAtomIdx() << \"-\"\n+ << nbrBond->getEndAtomIdx() << std::endl;\n+ std::cerr << \" #### SET1 \" << bptr->getIdx() << std::endl;\n #endif\n- bq.push_back(nbrBond);\n+ bq.push_back(nbrBond);\n+ }\n \n // now we know that we should consider this bond\n-\n bondsConsidered.set(bptr->getIdx());\n conjSystem.set(bptr->getIdx());\n+ conjAtoms.set(bptr->getBeginAtomIdx());\n+ conjAtoms.set(bptr->getEndAtomIdx());\n }\n }\n \n@@ -618,6 +668,9 @@ std::string TautomerHashv2(RWMol *mol, bool proto, bool useCXSmiles,\n #endif\n bondsConsidered.set(bnd->getIdx());\n conjSystem.set(bnd->getIdx());\n+ conjAtoms.set(bnd->getBeginAtomIdx());\n+ conjAtoms.set(bnd->getEndAtomIdx());\n+\n for (const auto atm :\n std::vector<const Atom *>{bnd->getBeginAtom(), bnd->getEndAtom()}) {\n if (atomsInSystem[atm->getIdx()]) {\n@@ -633,7 +686,8 @@ std::string TautomerHashv2(RWMol *mol, bool proto, bool useCXSmiles,\n atomsInSystem.set(atm->getIdx());\n }\n for (auto nbrBnd : mol->atomBonds(atm)) {\n- if (nbrBnd == bnd) {\n+ if (bondsConsidered[nbrBnd->getIdx()] ||\n+ std::find(bq.begin(), bq.end(), nbrBnd) != bq.end()) {\n continue;\n }\n auto oatom = nbrBnd->getOtherAtom(atm);\n@@ -642,23 +696,22 @@ std::string TautomerHashv2(RWMol *mol, bool proto, bool useCXSmiles,\n std::cerr << \" check neighbor \" << nbrBnd->getIdx() << \" from \"\n << atm->getIdx() << \"-\" << oatom->getIdx() << std::endl;\n std::cerr << \" \" << bondsConsidered[nbrBnd->getIdx()] << \" icao \"\n- << isCandidateAtom(oatom) << \" hsbo \"\n+ << isCandidateAtom(oatom, atomFlags) << \" hsbo \"\n << hasStartBond(oatom, startBonds) << \" unsat \"\n << isUnsaturatedBond(nbrBnd) << \" icaa \"\n- << isCandidateAtom(atm) << \" hsba \"\n- << hasStartBond(atm, startBonds) << std::endl;\n+ << isCandidateAtom(atm, atomFlags) << \" hsba \"\n+ << hasStartBond(atm, startBonds)\n+ << \" ncno: \" << numConjugatedNeighbors[oatom->getIdx()]\n+ << std::endl;\n #endif\n- if (bondsConsidered[nbrBnd->getIdx()] ||\n- (skipNeighborBond(atm, oatom, nbrBnd, startBonds, atomFlags,\n+ if (checkForOverreach(atm, oatom, bnd, nbrBnd, startBonds,\n+ numConjugatedNeighbors)) {\n+ continue;\n+ }\n+ if ((skipNeighborBond(atm, oatom, nbrBnd, startBonds, atomFlags,\n bondFlags) &&\n skipNeighborBond(oatom, atm, nbrBnd, startBonds, atomFlags,\n bondFlags))) {\n- // we won't add this bond for further traversal, but if both atoms\n- // are already in this system, then we should add the bond to the\n- // system\n- if (atomsInSystem[oatom->getIdx()]) {\n- conjSystem.set(nbrBnd->getIdx());\n- }\n continue;\n }\n bq.push_back(nbrBnd);\n@@ -674,8 +727,30 @@ std::string TautomerHashv2(RWMol *mol, bool proto, bool useCXSmiles,\n std::cerr << \"CONJ: \" << conjSystem << \" hetero \" << activeHeteroHs\n << \" donor \" << std::endl;\n #endif\n- bondsToModify |= conjSystem;\n+ // all bonds between conjugated atoms in the system are considered to be\n+ // in the system. There are situations where the traverse doesn't find the\n+ // closure bond, so we explicitly check:\n+ for (auto i = 0U; i < conjAtoms.size(); i++) {\n+ if (conjAtoms[i]) {\n+ for (const auto bnd : mol->atomBonds(mol->getAtomWithIdx(i))) {\n+ if (conjAtoms[bnd->getOtherAtomIdx(i)]) {\n+#ifdef VERBOSE_HASH\n+ if (!conjSystem[bnd->getIdx()]) {\n+ std::cerr << \" BACKFILL BOND: \" << bnd->getIdx() << std::endl;\n+ }\n+#endif\n+ bondsToModify.set(bnd->getIdx());\n+ }\n+ }\n+ }\n+ }\n } else {\n+ // undo all the bonds we marked as considered in this conjugated system\n+ for (unsigned int i = 0; i < mol->getNumBonds(); ++i) {\n+ if (conjSystem[i]) {\n+ bondsConsidered.reset(i);\n+ }\n+ }\n #ifdef VERBOSE_HASH\n std::cerr << \"REJECT CONJ: \" << conjSystem << \" hetero \" << activeHeteroHs\n << \" donor \" << std::endl;\n"}, "test": {"test_patch": "diff --git a/Code/GraphMol/MolHash/catch_tests.cpp b/Code/GraphMol/MolHash/catch_tests.cpp\nindex 4ce0046b456..d56436cfb70 100644\n--- a/Code/GraphMol/MolHash/catch_tests.cpp\n+++ b/Code/GraphMol/MolHash/catch_tests.cpp\n@@ -411,6 +411,9 @@ TEST_CASE(\"tautomer v2\") {\n data = {\n {{\"CC=O\", \"C=CO\"}, {}},\n {{\"CCC=O\", \"CC=CO\"}, {\"C=CCO\"}},\n+ // this next one is the specific test to ensure that amino acid\n+ // stereochemistry is not lost\n+ {{\"CCC(=O)NC\", \"CCC(O)=NC\"}, {\"CC=C(O)NC\"}},\n {{\"CC(=O)CC(=O)C\", \"C=C(O)CC(=O)C\", \"CC(=O)C=C(O)C\",\n \"C=C(O)C=C(O)C\", \"C=C(O)CC(O)=C\"},\n {}},\n@@ -435,10 +438,9 @@ TEST_CASE(\"tautomer v2\") {\n {{\n \"S=C1N=CN=C2NC=NC12\",\n \"S=C2C1N=CN=C1NC=N2\",\n-\n+ \"S=C1NC=NC2N=CNC1=2\",\n },\n {\n- \"S=C1NC=NC2N=CNC1=2\",\n \"S=C1N=CN=C2N=CNC12\",\n \"S=C2C1NC=NC1=NC=N2\",\n }},\n@@ -449,8 +451,9 @@ TEST_CASE(\"tautomer v2\") {\n \"N1C(=O)NC(=O)C2C=NNC=21\",\n \"N1C(=O)NC(=O)C2=CNNC2=1\",\n \"N1C(=O)NC(=O)C2=CNNC2=1\",\n+ \"N1C(=O)NC(=O)C2CN=NC=21\",\n },\n- {\"N1C(=O)NC(=O)C2CN=NC=21\", \"N1C(=O)NC(=O)C2CN=NC2=1\"}},\n+ {\"N1C(=O)NC(=O)C2CN=NC2=1\"}},\n // ---------------------------\n // more stereochemistry\n // ---------------------------\n@@ -932,4 +935,123 @@ TEST_CASE(\"v2 tautomers, carboxylic acids, amids, and related structures\") {\n CHECK(hsh == ref);\n }\n }\n+}\n+\n+TEST_CASE(\"github #8205: order dependence in tautomer hash\") {\n+ SECTION(\"as reported\") {\n+ auto mol1 = R\"CTAB(\n+ RDKit 2D\n+\n+ 0 0 0 0 0 0 0 0 0 0999 V3000\n+M V30 BEGIN CTAB\n+M V30 COUNTS 15 16 0 0 0\n+M V30 BEGIN ATOM\n+M V30 1 C -0.006857 -1.225143 0.000000 0\n+M V30 2 C -1.242571 -0.508286 0.000000 0\n+M V30 3 C -2.481143 -1.220000 0.000000 0\n+M V30 4 C -2.484000 -2.648571 0.000000 0\n+M V30 5 N -1.248286 -3.365429 0.000000 0\n+M V30 6 C -0.009714 -2.653714 0.000000 0\n+M V30 7 O -3.722571 -3.360572 0.000000 0\n+M V30 8 N -1.239714 0.920286 0.000000 0\n+M V30 9 C 1.549143 3.346571 0.000000 0\n+M V30 10 C 2.260857 2.108000 0.000000 0\n+M V30 11 C 1.302857 1.048286 0.000000 0\n+M V30 12 C -0.001143 1.632000 0.000000 0\n+M V30 13 C 0.151143 3.052571 0.000000 0\n+M V30 14 C -1.251227 -4.793997 0.000000 0\n+M V30 15 C -0.908467 4.010717 0.000000 0\n+M V30 END ATOM\n+M V30 BEGIN BOND\n+M V30 1 1 1 2\n+M V30 2 2 2 3\n+M V30 3 1 3 4\n+M V30 4 1 4 5\n+M V30 5 1 5 6\n+M V30 6 2 6 1\n+M V30 7 2 4 7\n+M V30 8 1 2 8\n+M V30 9 1 9 10\n+M V30 10 1 10 11\n+M V30 11 1 11 12\n+M V30 12 1 12 13\n+M V30 13 1 13 9\n+M V30 14 1 12 8 CFG=1\n+M V30 15 1 5 14\n+M V30 16 1 13 15\n+M V30 END BOND\n+M V30 END CTAB\n+M END)CTAB\"_ctab;\n+ REQUIRE(mol1);\n+ auto mol2 = v2::SmilesParse::MolFromSmiles(MolToSmiles(*mol1));\n+ REQUIRE(mol2);\n+ auto hsh1 =\n+ MolHash::MolHash(mol1.get(), MolHash::HashFunction::HetAtomTautomerv2);\n+ auto hsh2 =\n+ MolHash::MolHash(mol2.get(), MolHash::HashFunction::HetAtomTautomerv2);\n+ CHECK(hsh1 == hsh2);\n+ // make sure the chirality wasn't destroyed\n+ CHECK(hsh1.find(\"@\") != std::string::npos);\n+ }\n+ SECTION(\"tests for the same issue from #8320 report\") {\n+ std::vector<std::string> smileses = {\n+ \"CC(=O)N[C@H](C)S(N)(=O)=O\",\n+ \"O=P(O)(O)[C@@H](O)c1cccc2ccccc12\",\n+ };\n+ for (const auto &smiles : smileses) {\n+ INFO(smiles);\n+ auto m = v2::SmilesParse::MolFromSmiles(smiles);\n+ REQUIRE(m);\n+ auto hsh =\n+ MolHash::MolHash(m.get(), MolHash::HashFunction::HetAtomTautomerv2);\n+ CHECK(hsh.find(\"@\") != std::string::npos);\n+ }\n+ }\n+}\n+\n+TEST_CASE(\"examples found in ChEMBL\") {\n+ SECTION(\"things that should match\") {\n+ std::vector<std::pair<std::string, std::string>> smileses = {\n+ {\"S1(Nc2ccccc2N1)(=O)(=O)\", \"O=S1(=O)Nc2ccccc2N1\"},\n+ {\"c1ccccc1CN=C=S\", \"S=C=NCc1ccccc1\"},\n+ {\"O=C1NCCC1\", \"OC1=NCCC1\"},\n+ {\"c1no[n+]([O-])c1\", \"n1o[n+](cc1)[O-]\"},\n+ };\n+ for (const auto &[smi1, smi2] : smileses) {\n+ INFO(smi1 + \" \" + smi2);\n+ auto m1 = v2::SmilesParse::MolFromSmiles(smi1);\n+ REQUIRE(m1);\n+ auto hsh1 =\n+ MolHash::MolHash(m1.get(), MolHash::HashFunction::HetAtomTautomerv2);\n+ auto m2 = v2::SmilesParse::MolFromSmiles(smi2);\n+ REQUIRE(m2);\n+ auto hsh2 =\n+ MolHash::MolHash(m2.get(), MolHash::HashFunction::HetAtomTautomerv2);\n+ CHECK(hsh1 == hsh2);\n+ }\n+ }\n+\n+ SECTION(\"specific problems\") {\n+ std::vector<std::pair<std::string, std::string>> data = {\n+ {\"NNC(=O)CC1=NNC(=O)C1\",\n+ \"[NH2]-[N]:[C](:[O])-[C]:[C]1:[C]-[C](:[O]):[N]-[N]:1_6_0\"},\n+\n+ {\"Cc1ncn2c1NC=NC2N\",\n+ \"[C]:[C]1:[N]:[C]:[N]2:[C](-[NH2]):[N]:[C]:[N]:[C]:1:2_7_0\"},\n+ {\"Nc1nc2c(c(=O)[nH]1)CC=N2\",\n+ \"[N]:[C]1:[N]:[C](:[O]):[C]2:[C]:[C]:[N]:[C]:2:[N]:1_6_0\"},\n+ {\"NC(N)=[N+]1CCc2ccccc2C1\",\n+ \"[NH2]-[C](-[NH2])=[N+]1-[CH2]-[CH2]-[c]2:[cH]:[cH]:[cH]:[cH]:[c]:2-[CH2]-1_0_0\"},\n+ {\"O=S1(=Nc2ccncc2)CCCCC1\",\n+ \"[O]=[S]1(=[N]-[C]2:[C]:[C]:[N]:[C]:[C]:2)-[CH2]-[CH2]-[CH2]-[CH2]-[CH2]-1_4_0\"},\n+ };\n+ for (const auto &[smiles, ref] : data) {\n+ INFO(smiles);\n+ auto m = v2::SmilesParse::MolFromSmiles(smiles);\n+ REQUIRE(m);\n+ auto hsh =\n+ MolHash::MolHash(m.get(), MolHash::HashFunction::HetAtomTautomerv2);\n+ CHECK(hsh == ref);\n+ }\n+ }\n }\n\\ No newline at end of file\n", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}241{"question_id": "MSB_rdkit_rdkit_pr8406", "question_type": "multi_swe_bench", "description": "Fixes #8405 (rdkit/rdkit#8406)", "content": {"org": "rdkit", "repo": "rdkit", "pr_number": 8406, "issue_title": "Fixes #8405", "issue_body": "There's another special case that we need to cover. This adds it, along with some documentation.", "base_commit": "923483523e7e928db19becf6233b546b10313f36", "resolved_issues": [{"number": 8405, "title": "Some tautomer pairs generating different HetAtomTautomerv2 hashes", "body": "I mentioned this issue in https://github.com/rdkit/rdkit/pull/8368.\n\nSince that PR was merged, these two pairs of known tautomers generate different hashes:\n\n```\nIn [5]: from rdkit import Chem\n ...: from rdkit.Chem import rdMolHash\n\nIn [6]: pair1 = (\"OC1=CC(C)N=C(C1)O\", \"O=C1CC(C)NC(=O)C1\")\n\nIn [7]: pair2 = (r'Cc2cc(C)nc(N/C(N)=N\\c1ccc(Cl)c(C(F)(F)F)c1)n2', r'Cc2cc(C)nc(/N=C(N)/Nc1ccc(Cl)c(C(F)(F)F)c1)n2')\n\nIn [8]: # we'd expect both tautomers to produce the same hash, which should be deduplicated by the set\n ...: set(rdMolHash.MolHash(Chem.MolFromSmiles(s), rdMolHash.HashFunction.HetAtomTautomerv2) for s in pair1)\nOut[8]: \n{'[CH3]-[CH]1-[C]:[C](:[O]):[C]-[C](:[O]):[N]-1_5_0',\n '[CH3]-[C]1:[N]:[C](:[O])-[C]:[C](:[O]):[C]-1_6_0'}\n\nIn [9]: # these should also produce a single hash\n ...: set(rdMolHash.MolHash(Chem.MolFromSmiles(s), rdMolHash.HashFunction.HetAtomTautomerv2) for s in pair2)\nOut[9]: \n{'[C]:[C]1:[C]:[C](:[C]):[N]:[C](:[N]-[C](-[NH2]):[N]:[C]2:[C]:[C]:[C](-[Cl]):[C](-[C](-[F])(-[F])-[F]):[C]:2):[N]:1_11_0',\n '[C]:[C]1:[C]:[C](:[C]):[N]:[C](:[N]:[C](-[NH2])-[N]:[C]2:[C]:[C]:[C](-[Cl]):[C](-[C](-[F])(-[F])-[F]):[C]:2):[N]:1_11_0'}\n```\n\nAlso:\n```\nIn [3]: rdMolHash.MolHash(Chem.MolFromSmiles('O=C1CC(C)NC(=O)C1'),rdMolHash.HashFunction.HetAtomTautomerv2)\nOut[3]: '[CH3]-[CH]1-[C]:[C](:[O]):[C]-[C](:[O]):[N]-1_5_0'\n\nIn [4]: rdMolHash.MolHash(Chem.MolFromSmiles('OC1=CC(C)N=C(C1)O'),rdMolHash.HashFunction.HetAtomTautomerv2)\nOut[4]: '[CH3]-[C]1:[N]:[C](:[O])-[C]:[C](:[O]):[C]-1_6_0'\n\nIn [5]: rdMolHash.MolHash(Chem.MolFromSmiles('O=C1CC(C)N=C(C1)O'),rdMolHash.HashFunction.HetAtomTautomerv2)\nOut[5]: '[CH3]-[CH]1-[C]:[C](:[O]):[C]-[C](:[O]):[N]-1_5_0'\n\nIn [6]: _5 == _3\nOut[6]: True\n\nIn [7]: rdMolHash.MolHash(Chem.MolFromSmiles('OC1=CC(C)NC(C1)=O'),rdMolHash.HashFunction.HetAtomTautomerv2)\nOut[7]: '[CH3]-[CH]1-[C]:[C](:[O]):[C]-[C](:[O]):[N]-1_5_0'\n\nIn [8]: _7 == _3\nOut[8]: True\n```\n"}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/rdkit_m_rdkit:pr-8406", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/Code/GraphMol/MolHash/hashfunctions.cpp b/Code/GraphMol/MolHash/hashfunctions.cpp\nindex f27e02cceeb..43a2209b4b3 100644\n--- a/Code/GraphMol/MolHash/hashfunctions.cpp\n+++ b/Code/GraphMol/MolHash/hashfunctions.cpp\n@@ -395,7 +395,7 @@ std::vector<std::uint64_t> getBondFlags(const ROMol &mol) {\n \"[C]-[c](:[o,n,s]):[o,n,s]\", //< a limited version of handling this for\n // aromatic systems\n \"*[SD4](=*)=*\", // sulfates, sulfonyls, etc.\n- \"*=[SD4](=*)*\", // the other side\n+ \"*=[SD4;$(S(=*)=*)](*)*\", // the other side\n \"*-[H0]=,#[C,N]=,#*\", // isocyanates, azides, et al\n \"*[#7+]-[O-]\", // nitro groups and aromatic n-oxides\n \"[O,S;H]-P=O\", // phosphoric acid, etc.\n@@ -757,6 +757,73 @@ std::string TautomerHashv2(RWMol *mol, bool proto, bool useCXSmiles,\n #endif\n }\n }\n+\n+ /* Another situation we need to correct for is the following:\n+\n+ These two tautomers should be recognized as equivalent:\n+\n+ O8 O9\n+ || |\n+ C1-C2-C3-C4-N5=C6-C7\n+\n+ O8 O9\n+ | |\n+ C1-C2=C3-C4-N5=C6-C7\n+\n+ In the first case neither the N5-C4 nor the C3-C4 bond is recognized as being\n+ tautomeric since C4 does not have two conjugated neighbors, in the second\n+ case the N5-C4 bond is recognized since C4 does have two conjugated\n+ neighbors.\n+\n+\n+ In order to fix this and other similar cases we need to check the neighboring\n+ atoms of each start bond and check to see they are connected to other atoms\n+ which are involved in bonds which are either in a tautomeric system already\n+ (i.e. bondsToModify is set for them) or are start bonds.\n+\n+ So in the case of the first tautomer above, here we're going to check N5-C4,\n+ and recognize that C4 has a neighbor (C3) with an adjacent tautomeric bond\n+ (C3-C2). So we'll flag N5-C4 as being part of the tautomeric system.\n+\n+ */\n+ for (const auto bptr : mol->bonds()) {\n+ // If this is not a possible starting bond,\n+ // then skip it\n+ if (!startBonds[bptr->getIdx()]) {\n+ continue;\n+ }\n+\n+ for (const auto atm :\n+ std::vector<const Atom *>{bptr->getBeginAtom(), bptr->getEndAtom()}) {\n+ for (const auto nbrBond : mol->atomBonds(atm)) {\n+ if (nbrBond == bptr || bondsToModify[nbrBond->getIdx()]) {\n+ continue;\n+ }\n+ const auto oatom = nbrBond->getOtherAtom(atm);\n+ if (!oatom->getTotalNumHs()) {\n+ continue;\n+ }\n+ unsigned int numModifiedNeighbors = 0;\n+ for (const auto nbr : mol->atomNeighbors(oatom)) {\n+ if (nbr == atm) {\n+ continue;\n+ }\n+ for (const auto nbnd : mol->atomBonds(nbr)) {\n+ if (bondsToModify[nbnd->getIdx()] || startBonds[nbnd->getIdx()]) {\n+ ++numModifiedNeighbors;\n+ break;\n+ }\n+ }\n+ if (numModifiedNeighbors) {\n+ break;\n+ }\n+ }\n+ if (numModifiedNeighbors) {\n+ bondsToModify.set(nbrBond->getIdx());\n+ }\n+ }\n+ }\n+ }\n #ifdef VERBOSE_HASH\n std::cerr << \"FINAL: \" << bondsToModify << std::endl;\n #endif\n"}, "test": {"test_patch": "diff --git a/Code/GraphMol/MolHash/catch_tests.cpp b/Code/GraphMol/MolHash/catch_tests.cpp\nindex d56436cfb70..35143fffa74 100644\n--- a/Code/GraphMol/MolHash/catch_tests.cpp\n+++ b/Code/GraphMol/MolHash/catch_tests.cpp\n@@ -435,15 +435,17 @@ TEST_CASE(\"tautomer v2\") {\n {}},\n {{\"CC(=O)C=CC\", \"C=C(O)C=CC\"}, {\"CC(=O)CC=C\"}},\n {{\"N=C1N=CN(C)C2N=CNC=21\", \"NC1N=CN(C)C2=NC=NC2=1\"}, {}},\n- {{\n- \"S=C1N=CN=C2NC=NC12\",\n- \"S=C2C1N=CN=C1NC=N2\",\n- \"S=C1NC=NC2N=CNC1=2\",\n- },\n- {\n- \"S=C1N=CN=C2N=CNC12\",\n- \"S=C2C1NC=NC1=NC=N2\",\n- }},\n+ {\n+ {\n+ \"S=C1N=CN=C2NC=NC12\",\n+ \"S=C2C1N=CN=C1NC=N2\",\n+ \"S=C1NC=NC2N=CNC1=2\",\n+ \"S=C1N=CN=C2N=CNC12\",\n+ \"S=C2C1NC=NC1=NC=N2\",\n+ \"S=C2C1NC=NC=1NC=N2\",\n+ },\n+ {},\n+ },\n {{\"S=C1NC=NC2N=CNC1=2\", \"S=C1NC=NC2NC=NC1=2\", \"SC1=NC=NC2N=CNC1=2\"},\n {}},\n {{\"CC1=CN=CN1\", \"CC1CN=CN=1\"}, {}},\n@@ -1004,6 +1006,7 @@ M END)CTAB\"_ctab;\n REQUIRE(m);\n auto hsh =\n MolHash::MolHash(m.get(), MolHash::HashFunction::HetAtomTautomerv2);\n+ INFO(hsh);\n CHECK(hsh.find(\"@\") != std::string::npos);\n }\n }\n@@ -1034,8 +1037,7 @@ TEST_CASE(\"examples found in ChEMBL\") {\n SECTION(\"specific problems\") {\n std::vector<std::pair<std::string, std::string>> data = {\n {\"NNC(=O)CC1=NNC(=O)C1\",\n- \"[NH2]-[N]:[C](:[O])-[C]:[C]1:[C]-[C](:[O]):[N]-[N]:1_6_0\"},\n-\n+ \"[NH2]-[N]:[C](:[O]):[C]:[C]1:[C]:[C](:[O]):[N]:[N]:1_6_0\"},\n {\"Cc1ncn2c1NC=NC2N\",\n \"[C]:[C]1:[N]:[C]:[N]2:[C](-[NH2]):[N]:[C]:[N]:[C]:1:2_7_0\"},\n {\"Nc1nc2c(c(=O)[nH]1)CC=N2\",\n@@ -1054,4 +1056,32 @@ TEST_CASE(\"examples found in ChEMBL\") {\n CHECK(hsh == ref);\n }\n }\n+}\n+\n+TEST_CASE(\"github #8405: some tautomer mismatches\") {\n+ SECTION(\"things that should match\") {\n+ std::vector<std::vector<std::string>> smilesSets = {\n+ {\n+ \"O=C1CC(C)NC(=O)C1\",\n+ \"OC1=CC(C)N=C(C1)O\",\n+ \"OC1=CC(C)NC(C1)=O\",\n+ \"O=C1CC(C)N=C(C1)O\",\n+ },\n+ };\n+ for (const auto &smileses : smilesSets) {\n+ auto m0 = v2::SmilesParse::MolFromSmiles(smileses[0]);\n+ REQUIRE(m0);\n+ auto hsh0 =\n+ MolHash::MolHash(m0.get(), MolHash::HashFunction::HetAtomTautomerv2);\n+ for (auto i = 1u; i < smileses.size(); ++i) {\n+ auto smi = smileses[i];\n+ INFO(smi);\n+ auto m = v2::SmilesParse::MolFromSmiles(smi);\n+ REQUIRE(m);\n+ auto hsh =\n+ MolHash::MolHash(m.get(), MolHash::HashFunction::HetAtomTautomerv2);\n+ CHECK(hsh == hsh0);\n+ }\n+ }\n+ }\n }\n\\ No newline at end of file\n", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}242{"question_id": "MSB_rdkit_rdkit_pr8417", "question_type": "multi_swe_bench", "description": "Fix indexing of heavy atoms in PubChemShape (rdkit/rdkit#8417)", "content": {"org": "rdkit", "repo": "rdkit", "pr_number": 8417, "issue_title": "Fix indexing of heavy atoms in PubChemShape", "issue_body": "\r\n#### Reference Issue\r\nFixes #8416 \r\n\r\n#### What does this implement/fix? Explain your changes.\r\nThe loop was going over all atoms, but only updating coords for non-H atoms so gaps could be left in the array and values written over the end of the vector.\r\n\r\n#### Any other comments?\r\nI couldn't find a simple test that crashed it, so haven't added one. However the test \"Github #8096\" now gives Tanimoto scores of 1.0 for shape and colour which I think is correct since the deuterium shouldn't be affecting things at all. Previously, it caused an extra coordinate in the array which was left at its default value of 0.0, 0.0, 0.0 (atom index 4).\r\nIt is not impossible that whatever was done to fix #8096 didn't get to the root of the problem, or there were 2 problems.\r\n", "base_commit": "3facd882d64937993eaca1fd2ba46a406de32d23", "resolved_issues": [{"number": 8416, "title": "Overwrite end of array in PubChemShape.cpp", "body": "\n**Describe the bug**\nCore dump when passing molecule with hydrogens to PrepareConformer in PubChemShape.cpp\n\n**To Reproduce**\nI can't make a short reproducible that causes a crash.\n\n**Expected behavior**\nNo crash in my code!\n\n**Screenshots**\nIf applicable, add screenshots to help explain your problem.\n\n**Configuration (please complete the following information):**\n - RDKit version: built from master\n - OS: [e.g. Ubuntu 20.04] Ubuntu 22.04 and macOS latest\n - Python version (if relevant):\n - Are you using conda?\n - If you are using conda, which channel did you install the rdkit from?\n - If you are not using conda: how did you install the RDKit?\n\n**Additional context**\nFix imminent.\n"}, {"number": 8096, "title": "Tanimoto score exceeds 1 for deuterium-containing molecules in rdShapeAlign.AlignMol()", "body": "**Issue** \r\nrdShapeAlign.AlignMol() returns Tanimoto scores above 1 for deuterium-containing molecules, which is problematic because ChEMBL includes deuterated drugs, so others are also likely to encounter this issue. Tanimoto scores should always lie between 0 and 1.\r\n\r\n**Root Cause** \r\nIn `PubChemShape.cpp` (function `PrepareConformer`), the code indexes atom-related arrays using the full atom index `i` instead of using a dedicated counter for heavy atoms. This results in out-of-range memory writes (\"memory overwrites\") and corrupts data used to calculate Tanimoto scores.\r\n\r\n**To Reproduce**\r\n```python\r\nfrom rdkit import Chem\r\nfrom rdkit.Chem import rdShapeAlign, rdDistGeom\r\n\r\nquery_smi_2H = '[2H]c1ccccc1' \r\nquery_smi = 'c1ccccc1' \r\nref_smi = 'c1ccccc1' \r\n\r\nquery_2H = Chem.AddHs(Chem.MolFromSmiles(query_smi_2H), addCoords=True)\r\nquery = Chem.AddHs(Chem.MolFromSmiles(query_smi), addCoords=True)\r\nref_mol = Chem.AddHs(Chem.MolFromSmiles(ref_smi), addCoords=True)\r\n\r\n\r\nparams = rdDistGeom.ETKDGv3()\r\nparams.randomSeed = 0xa100f\r\nfor mol in [query_2H, query, ref_mol]:\r\n rdDistGeom.EmbedMultipleConfs(mol, numConfs=1, params=params)\r\n\r\nprint(\"With [2H]:\", rdShapeAlign.AlignMol(query_2H, ref_mol))\r\nprint(\"Without [2H]:\", rdShapeAlign.AlignMol(query, ref_mol))\r\n```\r\n\r\n```\r\nWith [2H]: (1.2137843687421104, 0.8742135141493095)\r\nWithout [2H]: (0.9999984471607044, 0.9999999704411953)\r\n```\r\n\r\n**Expected Behavior** \r\nTanimoto scores should remain within the range [0,1].\r\n\r\n**Actual Behavior** \r\nScores exceed 1 when 2H atoms are present.\r\n\r\n\r\n**Proposed Fix** \r\nIntroduce a separate heavy-atom index counter to prevent out-of-bound writes:\r\n\r\n```cpp\r\nunsigned int heavyAtomIdx = 0; // Dedicated counter for heavy atoms\r\nif (Z > 1) {\r\n rad_vector[heavyAtomIdx] = vdw_radii.at(Z); // Use heavyAtomIdx for indexing\r\n heavyAtomIdx++;\r\n}\r\n```\r\n\r\n**Environment**\r\n* RDKit version: 2024.09.3\r\n* Build: py313hc8d2389_0 (conda-forge)\r\n* OS: Ubuntu 24.04.1 LTS\r\n* Python: 3.13.1\r\n* Conda: Yes\r\n\r\n**Additional Info** \r\nAfter applying this fix, the Tanimoto scores remain within the expected range. The updated [PubChemShape.cpp.txt](https://github.com/user-attachments/files/18132106/PubChemShape.cpp.txt) is attached for reference.\r\nI am not a C++ coder, so I am not fully certain this is the optimal solution, but it resolved the issue for me.\r\n\r\n"}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/rdkit_m_rdkit:pr-8417", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/External/pubchem_shape/PubChemShape.cpp b/External/pubchem_shape/PubChemShape.cpp\nindex 014fa36767b..e25b44c188c 100644\n--- a/External/pubchem_shape/PubChemShape.cpp\n+++ b/External/pubchem_shape/PubChemShape.cpp\n@@ -283,15 +283,16 @@ ShapeInput PrepareConformer(const ROMol &mol, int confId, bool useColors) {\n res.shift = {-ave.x, -ave.y, -ave.z};\n res.coord.resize(nAlignmentAtoms * 3);\n \n- for (unsigned i = 0; i < nAtoms; ++i) {\n+ for (unsigned i = 0, j = 0; i < nAtoms; ++i) {\n // use only non-H for alignment\n if (mol.getAtomWithIdx(i)->getAtomicNum() > 1) {\n RDGeom::Point3D pos = conformer.getAtomPos(i);\n pos -= ave;\n \n- res.coord[i * 3] = pos.x;\n- res.coord[(i * 3) + 1] = pos.y;\n- res.coord[(i * 3) + 2] = pos.z;\n+ res.coord[j * 3] = pos.x;\n+ res.coord[(j * 3) + 1] = pos.y;\n+ res.coord[(j * 3) + 2] = pos.z;\n+ ++j;\n }\n }\n \ndiff --git a/External/pubchem_shape/PubChemShape.hpp b/External/pubchem_shape/PubChemShape.hpp\nindex 245dba9d0e5..a55064f9d7f 100644\n--- a/External/pubchem_shape/PubChemShape.hpp\n+++ b/External/pubchem_shape/PubChemShape.hpp\n@@ -2,6 +2,9 @@\n #include <map>\n #include <vector>\n \n+#ifndef RDKIT_PUBCHEMSHAPE_GUARD\n+#define RDKIT_PUBCHEMSHAPE_GUARD\n+\n //! The input for the pubchem shape alignment code\n struct RDKIT_PUBCHEMSHAPE_EXPORT ShapeInput {\n std::vector<float> coord;\n@@ -66,3 +69,5 @@ RDKIT_PUBCHEMSHAPE_EXPORT std::pair<double, double> AlignMolecule(\n int refConfId = -1, int fitConfId = -1, bool useColors = true,\n double opt_param = 1.0, unsigned int max_preiters = 10u,\n unsigned int max_postiters = 30u);\n+\n+#endif\n\\ No newline at end of file\n"}, "test": {"test_patch": "diff --git a/External/pubchem_shape/test.cpp b/External/pubchem_shape/test.cpp\nindex 9dd34e2909b..737b0941508 100644\n--- a/External/pubchem_shape/test.cpp\n+++ b/External/pubchem_shape/test.cpp\n@@ -278,7 +278,7 @@ TEST_CASE(\"Github #8096\") {\n REQUIRE(m2);\n std::vector<float> matrix(12, 0.0);\n auto [nbr_st, nbr_ct] = AlignMolecule(*m1, *m2, matrix);\n- CHECK_THAT(nbr_st, Catch::Matchers::WithinAbs(0.940, 0.005));\n- CHECK_THAT(nbr_ct, Catch::Matchers::WithinAbs(0.902, 0.005));\n+ CHECK_THAT(nbr_st, Catch::Matchers::WithinAbs(1.0, 0.005));\n+ CHECK_THAT(nbr_ct, Catch::Matchers::WithinAbs(1.0, 0.005));\n }\n }\n", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}243{"question_id": "MSB_rdkit_rdkit_pr8550", "question_type": "multi_swe_bench", "description": "Synthon space bad chiral count (rdkit/rdkit#8550)", "content": {"org": "rdkit", "repo": "rdkit", "pr_number": 8550, "issue_title": "Synthon space bad chiral count", "issue_body": "#### Reference Issue\r\nFixes #8549\r\n\r\n\r\n#### What does this implement/fix? Explain your changes.\r\n\r\n\r\n#### Any other comments?\r\n\r\n", "base_commit": "21d694e88aba4e4422048707f57627e1c88e5e49", "resolved_issues": [{"number": 8549, "title": "SynthonSpaceSearch bad chiral atom count", "body": "\n**Describe the bug**\nWhen counting the atoms that are chiral or potentially chiral, it also counts stereo bonds. That's clearly wrong, but if the bond idx is greater than the number of atoms it also throws an exception.\n\n**To Reproduce**\n```\n SynthonSpace space;\n std::istringstream iss(R\"(SMILES\tsynton_id\tsynton#\treaction_id\trelease\nC[U]\t200011483129\t1\t4a\t2024-09\nc1c/c2n3/c1=C\\C1=N/C(=C\\c4c(C)c5c(n4[Mg]3)/C(=C3\\N=C(\\C=2)[C@@H](C)[C@@H]3C)[C@@H](C)C5=[U])C=C1\tbad\t2\t4a\t2024-09\n)\");\n bool cancelled = false;\n space.readStream(iss, cancelled);\n```\nThis is a bit of FreedomSpace with a cut-down piece of an offending synthon.\n\n**Expected behavior**\nThis molecule shouldn't throw an exception, although that's a side-effect of the bug itself.\n\n**Screenshots**\nIf applicable, add screenshots to help explain your problem.\n\n**Configuration (please complete the following information):**\n - RDKit version: current master branch.\n - OS: [e.g. Ubuntu 20.04]. macOS, but this is not OS dependent \n - Python version (if relevant):\n - Are you using conda?\n - If you are using conda, which channel did you install the rdkit from? \n - If you are not using conda: how did you install the RDKit? Built from source.\n\n**Additional context**\nFix incoming."}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/rdkit_m_rdkit:pr-8550", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/Code/GraphMol/Descriptors/DCLV.cpp b/Code/GraphMol/Descriptors/DCLV.cpp\nindex 6a38e794d88..472a00a193a 100644\n--- a/Code/GraphMol/Descriptors/DCLV.cpp\n+++ b/Code/GraphMol/Descriptors/DCLV.cpp\n@@ -288,7 +288,7 @@ struct State {\n elem->radius2 = rad * rad;\n \n if (dotDensity) {\n- long count = ((4.0 * M_PI) * rad * rad * dotDensity);\n+ unsigned long count = ((4.0 * M_PI) * rad * rad * dotDensity);\n std::vector<DotStruct> dots(count);\n \n unsigned int equat = sqrt(M_PI * count);\ndiff --git a/Code/GraphMol/Kekulize.cpp b/Code/GraphMol/Kekulize.cpp\nindex 8805222cfc1..8a77330574c 100644\n--- a/Code/GraphMol/Kekulize.cpp\n+++ b/Code/GraphMol/Kekulize.cpp\n@@ -140,7 +140,7 @@ void markDbondCands(RWMol &mol, const INT_VECT &allAtms,\n \n auto numAtomRings = mol.getRingInfo()->numAtomRings(at->getIdx());\n const auto &riVect = mol.getRingInfo()->atomMembers(at->getIdx());\n- auto numNonCandRings = std::count_if(\n+ size_t numNonCandRings = std::count_if(\n riVect.begin(), riVect.end(),\n [&isRingNotCand](int ri) { return isRingNotCand.test(ri); });\n if (!at->getAtomicNum() && nonArNonDummyNbr < numAtomRings &&\ndiff --git a/Code/GraphMol/SynthonSpaceSearch/SynthonSpaceSearch_details.cpp b/Code/GraphMol/SynthonSpaceSearch/SynthonSpaceSearch_details.cpp\nindex 55b3b3b7d8e..0dedbaf64fe 100644\n--- a/Code/GraphMol/SynthonSpaceSearch/SynthonSpaceSearch_details.cpp\n+++ b/Code/GraphMol/SynthonSpaceSearch/SynthonSpaceSearch_details.cpp\n@@ -873,6 +873,9 @@ unsigned int countChiralAtoms(ROMol &mol, unsigned int *numExcDummies) {\n *numExcDummies = 0;\n }\n for (auto &si : sis) {\n+ if (si.type != Chirality::StereoType::Atom_Tetrahedral) {\n+ continue;\n+ }\n ++numChiralAtoms;\n if (numExcDummies) {\n auto atom = mol.getAtomWithIdx(si.centeredOn);\n"}, "test": {"test_patch": "diff --git a/Code/GraphMol/SynthonSpaceSearch/substructure_search_catch_tests.cpp b/Code/GraphMol/SynthonSpaceSearch/substructure_search_catch_tests.cpp\nindex 0e4afb7e994..8a50027aaca 100644\n--- a/Code/GraphMol/SynthonSpaceSearch/substructure_search_catch_tests.cpp\n+++ b/Code/GraphMol/SynthonSpaceSearch/substructure_search_catch_tests.cpp\n@@ -726,6 +726,7 @@ F[2*]\t277310376-742385dd\t2\tfake-chiral\n auto res2 = space.substructureSearch(*mol2);\n CHECK(res2.getHitMolecules().size() == 2);\n }\n+\n TEST_CASE(\"Chiral substructure search\") {\n SynthonSpace space;\n std::istringstream iss(R\"(SMILES\tsynton_id\tsynton#\treaction_id\n@@ -759,4 +760,14 @@ F[2*]\t277310376-742385dd\t2\tfake-chiral\n sparams.maxHitChiralAtoms = 0;\n auto res4 = space.substructureSearch(*qmol, mparams, sparams);\n CHECK(res4.getHitMolecules().size() == 0);\n-}\n\\ No newline at end of file\n+}\n+\n+TEST_CASE(\"Bad Chiral Atom Count\") {\n+ SynthonSpace space;\n+ std::istringstream iss(R\"(SMILES\tsynton_id\tsynton#\treaction_id\trelease\n+C[U]\t200011483129\t1\t4a\t2024-09\n+c1c/c2n3/c1=C\\C1=N/C(=C\\c4c(C)c5c(n4[Mg]3)/C(=C3\\N=C(\\C=2)[C@@H](C)[C@@H]3C)[C@@H](C)C5=[U])C=C1\tbad\t2\t4a\t2024-09\n+)\");\n+ bool cancelled = false;\n+ CHECK_NOTHROW(space.readStream(iss, cancelled));\n+}\n", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}244{"question_id": "MSB_rdkit_rdkit_pr8588", "question_type": "multi_swe_bench", "description": "Fixes #8569 (rdkit/rdkit#8588)", "content": {"org": "rdkit", "repo": "rdkit", "pr_number": 8588, "issue_title": "Fixes #8569", "issue_body": "While fixing #8569 I could not restrain myself from refactoring the MMPA code, which is of the same C-style/reinvent the wheel multiple times/add as much useless boilerplate as possible/add irrelevant micro-optimizations and waste a lot of time on std::find or nested loops quality, or worse, than the MCS code.\r\n\r\n* Fix #8569 \r\n* Remove duplicate `#include`\r\n* Replace explicit types with `auto` where appropriate\r\n* Replace C-style casts with `static_cast`\r\n* Replace C-style `for` loops with iterators or STL functions where appropriate\r\n* Avoid unnecessary loops when copying vectors\r\n* Move duplicate code into functions\r\n* Use `fragmentOnBonds` to simplify code and retain stereochemistry\r\n* Replace inefficient nested `for` loop on atom neighbors with single `for` loop on bonds\r\n* Replace expensive `std::find` calls with more efficient `boost::dynamic_bitset::test`\r\n* Do not tamper with pre-existing atom map numbers on atoms other than dummy atoms, as they have nothing to do with the MMPA code and no assumptions should be made", "base_commit": "397d19e676530cb138a4bbfbb77750ec0186f14e", "resolved_issues": [{"number": 8569, "title": "RDKit minilib loses stereochemistry when breaking molecules to fragments", "body": "Rdkit loses stereochemistry information when breaking into fragments.\n\nFor instance, when breaking\u00a0C(\\C=C\\c1ccccc1)N2CCN(CC2)C(c3ccccc3)c4ccccc4 into fragments with\u00a0mol.get_mmpa_frags()\u00a0we get the result without stereochemistry:\u00a0C(=C[*:1])c1ccccc1.c1ccc(C(c2ccccc2)N2CCN(C[*:1])CC2)cc1. Though we expect to have\u00a0C(=C/[*:1])/c1ccccc1 as a fragment.\n\nIs it possible to keep this stereochemistry information when breaking into fragments?\n"}], "commits": [], "diff_url": "", "patch_url": "", "html_url": "", "created_at": "", "merged_at": ""}, "environment": {"env_type": "docker", "docker_image": "mswebench/rdkit_m_rdkit:pr-8588", "working_directory": "/testbed", "needs_build": true}, "answer": {"fix_patch": "diff --git a/Code/GraphMol/MMPA/MMPA.cpp b/Code/GraphMol/MMPA/MMPA.cpp\nindex dc029c08f23..e63a3cc55f1 100644\n--- a/Code/GraphMol/MMPA/MMPA.cpp\n+++ b/Code/GraphMol/MMPA/MMPA.cpp\n@@ -17,7 +17,7 @@\n #include \"../SmilesParse/SmilesWrite.h\"\n #include \"../Substruct/SubstructMatch.h\"\n #include <GraphMol/new_canon.h>\n-#include <GraphMol/MolOps.h>\n+#include <GraphMol/ChemTransforms/MolFragmenter.h>\n #include \"MMPA.h\"\n \n // #define MMPA_DEBUG // enable debug info output\n@@ -30,36 +30,32 @@ typedef std::vector<std::pair<unsigned, unsigned>>\n \n namespace detail {\n unsigned long long computeMorganCodeHash(const ROMol &mol) {\n- size_t nv = mol.getNumAtoms();\n- size_t ne = mol.getNumBonds();\n- std::vector<unsigned long> currCodes(nv);\n- std::vector<unsigned long> prevCodes(nv);\n- size_t nIterations = mol.getNumBonds();\n+ auto nv = mol.getNumAtoms();\n+ std::vector<unsigned long> currCodes;\n+ currCodes.reserve(nv);\n+ std::vector<unsigned long> prevCodes;\n+ auto nIterations = mol.getNumBonds();\n if (nIterations > 5) {\n nIterations = 5;\n }\n \n- for (unsigned ai = 0; ai < nv; ai++) {\n- const Atom &a = *mol.getAtomWithIdx(ai);\n- unsigned atomCode = a.getAtomicNum();\n- atomCode |= a.getIsotope() << 8;\n+ for (const auto a : mol.atoms()) {\n+ auto atomCode = a->getAtomicNum();\n+ atomCode |= a->getIsotope() << 8;\n \n- auto charge = a.getFormalCharge();\n+ auto charge = a->getFormalCharge();\n atomCode |= std::abs(charge) << 16;\n if (charge < 0) {\n atomCode |= 1 << 29;\n }\n- atomCode |= (a.getIsAromatic() ? 1 : 0) << 30;\n- currCodes[ai] = atomCode;\n+ atomCode |= (a->getIsAromatic() ? 1 : 0) << 30;\n+ currCodes.push_back(atomCode);\n }\n \n for (size_t iter = 0; iter < nIterations; iter++) {\n- for (size_t i = 0; i < nv; i++) {\n- prevCodes[i] = currCodes[i];\n- }\n+ prevCodes = currCodes;\n \n- for (size_t bi = 0; bi < ne; bi++) {\n- const Bond *bond = mol.getBondWithIdx(bi);\n+ for (const auto bond : mol.bonds()) {\n unsigned order = bond->getBondType();\n unsigned atom1 = bond->getBeginAtomIdx();\n unsigned atom2 = bond->getEndAtomIdx();\n@@ -71,12 +67,56 @@ unsigned long long computeMorganCodeHash(const ROMol &mol) {\n }\n }\n \n- unsigned long long result = 0;\n- for (unsigned ai = 0; ai < nv; ai++) {\n- unsigned long code = currCodes[ai];\n- result += code * (code + 6849) + 29;\n+ return std::accumulate(currCodes.begin(), currCodes.end(), 0ULL,\n+ [](unsigned long long acc, unsigned long code) {\n+ return acc + code * (code + 6849) + 29;\n+ });\n+}\n+\n+// if skipDoubleBonds is true, double bonds are skipped\n+// if doubleBondFlag is false, non-double bonds are skipped\n+void addBondsFromTemplate(const RWMol &templateMol, RWMol &newMol,\n+ const std::map<unsigned, unsigned> &newAtomMap,\n+ const boost::dynamic_bitset<> &isAtomInFragment,\n+ bool skipDoubleBonds) {\n+ for (const auto templateBond : templateMol.bonds()) {\n+ bool isDoubleBond = (templateBond->getBondType() == Bond::DOUBLE);\n+ bool shouldProcessBond = (isDoubleBond ^ skipDoubleBonds);\n+ if (!shouldProcessBond ||\n+ !isAtomInFragment.test(templateBond->getBeginAtomIdx()) ||\n+ !isAtomInFragment.test(templateBond->getEndAtomIdx())) {\n+ continue;\n+ }\n+ auto ai1 = newAtomMap.at(templateBond->getBeginAtomIdx());\n+ auto ai2 = newAtomMap.at(templateBond->getEndAtomIdx());\n+ auto newBondIdx = newMol.addBond(ai1, ai2, templateBond->getBondType()) - 1;\n+ auto newBond = newMol.getBondWithIdx(newBondIdx);\n+ newBond->setBondDir(templateBond->getBondDir());\n+ if (isDoubleBond) {\n+ const auto &stereoAtoms = templateBond->getStereoAtoms();\n+ if (stereoAtoms.size() == 2) {\n+ newBond->setStereoAtoms(newAtomMap.at(stereoAtoms[0]),\n+ newAtomMap.at(stereoAtoms[1]));\n+ }\n+ }\n }\n- return result;\n+}\n+\n+void extractAtoms(const RWMol &templateMol, RWMol &newMol,\n+ const INT_VECT &atomIndices) {\n+ boost::dynamic_bitset<> isAtomInFragment(templateMol.getNumAtoms());\n+ // key is atom index in template molecule\n+ std::map<unsigned int, unsigned int> newAtomMap;\n+ for (int ai : atomIndices) {\n+ isAtomInFragment.set(ai);\n+ auto a = templateMol.getAtomWithIdx(ai);\n+ newAtomMap[ai] = newMol.addAtom(a->copy(), true, true);\n+ }\n+ // add bonds from this fragment skipping double bonds\n+ addBondsFromTemplate(templateMol, newMol, newAtomMap, isAtomInFragment, true);\n+ // add bonds from this fragment skipping non-double bonds\n+ addBondsFromTemplate(templateMol, newMol, newAtomMap, isAtomInFragment,\n+ false);\n }\n } // namespace detail\n \n@@ -85,11 +125,13 @@ static inline void convertMatchingToBondVect(\n const std::vector<MatchVectType> &matching_atoms) {\n for (const auto &matching_atom : matching_atoms) {\n matching_bonds.emplace_back();\n- BondVector_t &mb = matching_bonds.back(); // current match\n+ auto &mb = matching_bonds.back(); // current match\n // assume pattern is only one bond pattern\n- auto a1 = (unsigned)matching_atom[0].second; // mol atom 1 index\n- auto a2 = (unsigned)matching_atom[1].second; // mol atom 2 index\n- mb.push_back(std::pair<unsigned, unsigned>(a1, a2));\n+ auto a1 =\n+ static_cast<unsigned>(matching_atom[0].second); // mol atom 1 index\n+ auto a2 =\n+ static_cast<unsigned>(matching_atom[1].second); // mol atom 2 index\n+ mb.emplace_back(a1, a2);\n }\n }\n \n@@ -100,26 +142,29 @@ static void addResult(std::vector<std::pair<ROMOL_SPTR, ROMOL_SPTR>>\n #ifdef MMPA_DEBUG\n std::cout << res.size() + 1 << \": \";\n #endif\n- RWMol em(mol);\n // loop through the bonds to delete. == deleteBonds()\n unsigned isotope = 0;\n std::map<unsigned, unsigned> isotope_track;\n+ std::vector<unsigned int> bondIndices;\n+ bondIndices.reserve(bonds_selected.size());\n+ std::vector<std::pair<unsigned int, unsigned int>> dummyLabels;\n+ dummyLabels.reserve(bonds_selected.size());\n for (const auto &bi : bonds_selected) {\n #ifdef MMPA_DEBUG\n {\n std::string symbol =\n- em.getAtomWithIdx(bonds_selected[bi].first)->getSymbol();\n+ mol.getAtomWithIdx(bonds_selected[bi].first)->getSymbol();\n int label = 0;\n- em.getAtomWithIdx(bonds_selected[bi].first)\n+ mol.getAtomWithIdx(bonds_selected[bi].first)\n ->getPropIfPresent(common_properties::molAtomMapNumber, label);\n char a1[32];\n if (0 == label)\n sprintf(a1, \"\\'%s\\'\", symbol.c_str(), label);\n else\n sprintf(a1, \"\\'%s:%u\\'\", symbol.c_str(), label);\n- symbol = em.getAtomWithIdx(bonds_selected[bi].second)->getSymbol();\n+ symbol = mol.getAtomWithIdx(bonds_selected[bi].second)->getSymbol();\n label = 0;\n- em.getAtomWithIdx(bonds_selected[bi].second)\n+ mol.getAtomWithIdx(bonds_selected[bi].second)\n ->getPropIfPresent(common_properties::molAtomMapNumber, label);\n char a2[32];\n if (0 == label)\n@@ -131,59 +176,52 @@ static void addResult(std::vector<std::pair<ROMOL_SPTR, ROMOL_SPTR>>\n << bonds_selected[bi].second << a2 << \") \";\n }\n #endif\n- isotope += 1;\n- // remove the bond\n- em.removeBond(bi.first, bi.second);\n-\n- // now add attachment points and set attachment point labels\n- auto *a = new Atom(0);\n- a->setProp(common_properties::molAtomMapNumber, (int)isotope);\n- unsigned newAtomA = em.addAtom(a, true, true);\n- em.addBond(bi.first, newAtomA, Bond::SINGLE);\n- a = new Atom(0);\n- a->setProp(common_properties::molAtomMapNumber, (int)isotope);\n- unsigned newAtomB = em.addAtom(a, true, true);\n- em.addBond(bi.second, newAtomB, Bond::SINGLE);\n-\n- // keep track of where to put isotopes\n- isotope_track[newAtomA] = isotope;\n- isotope_track[newAtomB] = isotope;\n+ ++isotope;\n+ const auto oldBond = mol.getBondBetweenAtoms(bi.first, bi.second);\n+ CHECK_INVARIANT(oldBond, \"bond not found\");\n+ bondIndices.push_back(oldBond->getIdx());\n+ dummyLabels.emplace_back(isotope, isotope);\n+ }\n+ std::unique_ptr<ROMol> fragmentedMol(\n+ MolFragmenter::fragmentOnBonds(mol, bondIndices, true, &dummyLabels));\n+ for (auto ai = mol.getNumAtoms(); ai < fragmentedMol->getNumAtoms(); ++ai) {\n+ auto a = fragmentedMol->getAtomWithIdx(ai);\n+ isotope = a->getIsotope();\n+ CHECK_INVARIANT(isotope, \"isotope should be >0\");\n+ a->setProp(common_properties::molAtomMapNumber, static_cast<int>(isotope));\n+ a->setIsotope(0);\n+ isotope_track[ai] = isotope;\n }\n #ifdef MMPA_DEBUG\n std::cout << \"\\n\";\n #endif\n RWMOL_SPTR core, side_chains; // core & side_chains output molecules\n \n- if (isotope == 1) {\n- side_chains = RWMOL_SPTR(new RWMol(em)); // output = '%s,%s,,%s.%s'\n+ if (bondIndices.size() == 1) {\n+ side_chains =\n+ RWMOL_SPTR(new RWMol(*fragmentedMol)); // output = '%s,%s,,%s.%s'\n // DEBUG PRINT\n #ifdef MMPA_DEBUG\n // OK: std::cout<<res.size()+1<<\" isotope=\"<< isotope <<\",\"<<\n // MolToSmiles(*side_chains, true) <<\"\\n\";\n #endif\n- } else if (isotope >= 2) {\n- std::vector<std::vector<int>> frags;\n- unsigned int nFrags = MolOps::getMolFrags(em, frags);\n+ } else if (bondIndices.size() >= 2) {\n+ VECT_INT_VECT frags;\n+ MolOps::getMolFrags(*fragmentedMol, frags);\n \n // #check if its a valid triple or bigger cut. matchObj = re.search(\n //'\\*.*\\*.*\\*', f)\n // check if exists a fragment with maxCut connection points (*.. *.. *)\n if (isotope >= 3) {\n- bool valid = false;\n- for (size_t i = 0; i < nFrags; i++) {\n- unsigned nLabels = 0;\n- for (int ai : frags[i]) {\n- if (isotope_track.end() !=\n- isotope_track.find(ai)) { // new added atom\n- ++nLabels; // found connection point\n- }\n- }\n- if (nLabels >=\n- maxCuts) { // looks like it should be selected as core ! ??????\n- valid = true;\n- break;\n- }\n- }\n+ bool valid = std::any_of(\n+ frags.begin(), frags.end(),\n+ [&isotope_track, &maxCuts](const INT_VECT &frag) {\n+ size_t nLabels = std::count_if(\n+ frag.begin(), frag.end(), [&isotope_track](int ai) {\n+ return isotope_track.end() != isotope_track.find(ai);\n+ });\n+ return (nLabels >= maxCuts);\n+ });\n if (!valid) {\n #ifdef MMPA_DEBUG\n std::cout << \"isotope>=3: invalid fragments. fragment with maxCut \"\n@@ -194,47 +232,20 @@ static void addResult(std::vector<std::pair<ROMOL_SPTR, ROMOL_SPTR>>\n }\n }\n \n- size_t iCore = std::numeric_limits<size_t>::max();\n+ auto iCore = std::numeric_limits<size_t>::max();\n side_chains = RWMOL_SPTR(new RWMol);\n- std::map<unsigned, unsigned>\n- visitedBonds; // key is bond index in source molecule\n- unsigned maxAttachments = 0;\n+ size_t maxAttachments = 0;\n for (size_t i = 0; i < frags.size(); i++) {\n- unsigned nAttachments = 0;\n- for (int ai : frags[i]) {\n- if (isotope_track.end() !=\n- isotope_track.find(ai)) { // == if(a->hasProp(\"molAtomMapNumber\"))\n- ++nAttachments;\n- }\n- }\n+ size_t nAttachments = std::count_if(\n+ frags[i].begin(), frags[i].end(), [&isotope_track](int ai) {\n+ return isotope_track.end() != isotope_track.find(ai);\n+ });\n if (maxAttachments < nAttachments) {\n maxAttachments = nAttachments;\n }\n if (1 == nAttachments) { // build side-chain set of molecules from\n // selected fragment\n- std::map<unsigned, unsigned>\n- newAtomMap; // key is atom index in source molecule\n- for (int ai : frags[i]) {\n- Atom *a = em.getAtomWithIdx(ai);\n- newAtomMap[ai] = side_chains->addAtom(a->copy(), true, true);\n- }\n- // add all bonds from this fragment\n- for (int ai : frags[i]) {\n- Atom *a = em.getAtomWithIdx(ai);\n- ROMol::OEDGE_ITER beg, end;\n- for (boost::tie(beg, end) = em.getAtomBonds(a); beg != end; ++beg) {\n- const Bond *bond = em[*beg];\n- if (newAtomMap.end() == newAtomMap.find(bond->getBeginAtomIdx()) ||\n- newAtomMap.end() == newAtomMap.find(bond->getEndAtomIdx()) ||\n- visitedBonds.end() != visitedBonds.find(bond->getIdx())) {\n- continue;\n- }\n- unsigned ai1 = newAtomMap[bond->getBeginAtomIdx()];\n- unsigned ai2 = newAtomMap[bond->getEndAtomIdx()];\n- unsigned bi = side_chains->addBond(ai1, ai2, bond->getBondType());\n- visitedBonds[bond->getIdx()] = bi;\n- }\n- }\n+ detail::extractAtoms(*fragmentedMol, *side_chains, frags[i]);\n } else { // select the core fragment\n // DEBUG PRINT\n #ifdef MMPA_DEBUG\n@@ -252,30 +263,7 @@ static void addResult(std::vector<std::pair<ROMOL_SPTR, ROMOL_SPTR>>\n // build core molecule from selected fragment\n if (iCore != std::numeric_limits<size_t>::max()) {\n core = RWMOL_SPTR(new RWMol);\n- visitedBonds.clear();\n- std::map<unsigned, unsigned>\n- newAtomMap; // key is atom index in source molecule\n- for (int ai : frags[iCore]) {\n- Atom *a = em.getAtomWithIdx(ai);\n- newAtomMap[ai] = core->addAtom(a->copy(), true, true);\n- }\n- // add all bonds from this fragment\n- for (int ai : frags[iCore]) {\n- Atom *a = em.getAtomWithIdx(ai);\n- ROMol::OEDGE_ITER beg, end;\n- for (boost::tie(beg, end) = em.getAtomBonds(a); beg != end; ++beg) {\n- const Bond *bond = em[*beg];\n- if (newAtomMap.end() == newAtomMap.find(bond->getBeginAtomIdx()) ||\n- newAtomMap.end() == newAtomMap.find(bond->getEndAtomIdx()) ||\n- visitedBonds.end() != visitedBonds.find(bond->getIdx())) {\n- continue;\n- }\n- unsigned ai1 = newAtomMap[bond->getBeginAtomIdx()];\n- unsigned ai2 = newAtomMap[bond->getEndAtomIdx()];\n- unsigned bi = core->addBond(ai1, ai2, bond->getBondType());\n- visitedBonds[bond->getIdx()] = bi;\n- }\n- }\n+ detail::extractAtoms(*fragmentedMol, *core, frags[iCore]);\n // DEBUG PRINT\n #ifdef MMPA_DEBUG\n // std::cout<<res.size()+1<<\" isotope=\"<< isotope <<\" \"<< MolToSmiles(*core,\n@@ -285,9 +273,7 @@ static void addResult(std::vector<std::pair<ROMOL_SPTR, ROMOL_SPTR>>\n }\n // check for duplicates:\n bool resFound = false;\n- size_t ri = 0;\n- for (ri = 0; ri < res.size(); ri++) {\n- const std::pair<ROMOL_SPTR, ROMOL_SPTR> &r = res[ri];\n+ for (const auto &r : res) {\n if (side_chains->getNumAtoms() == r.second->getNumAtoms() &&\n side_chains->getNumBonds() == r.second->getNumBonds() &&\n ((nullptr == core.get() && nullptr == r.first.get()) ||\n@@ -322,26 +308,24 @@ static void addResult(std::vector<std::pair<ROMOL_SPTR, ROMOL_SPTR>>\n \n // clear atom labels (they are used in canonicalization)\n // and move them to dummy storage\n- for (ROMol::AtomIterator at = tmp_side_chain.beginAtoms();\n- at != tmp_side_chain.endAtoms(); ++at) {\n+ for (auto at : tmp_side_chain.atoms()) {\n int label = 0;\n- if ((*at)->getPropIfPresent(common_properties::molAtomMapNumber,\n- label)) {\n- (*at)->clearProp(common_properties::molAtomMapNumber);\n- oldMaps[(*at)->getIdx()] = label;\n+ if (at->getAtomicNum() == 0 &&\n+ at->getPropIfPresent(common_properties::molAtomMapNumber, label)) {\n+ at->clearProp(common_properties::molAtomMapNumber);\n+ oldMaps[at->getIdx()] = label;\n }\n }\n \n const bool doIsomericSmiles = true; // should this be false???\n- std::string smiles = MolToSmiles(tmp_side_chain, doIsomericSmiles);\n+ auto smiles = MolToSmiles(tmp_side_chain, doIsomericSmiles);\n // std::cerr << \"smiles: \" << smiles << std::endl;\n \n // Get the canonical output order and use it to remap\n- // the atom maps int the side chains\n- // these will get reapplied to the core (if there is a core)\n- const std::vector<unsigned int> &ranks =\n- tmp_side_chain.getProp<std::vector<unsigned int>>(\n- common_properties::_smilesAtomOutputOrder);\n+ // the atom maps in the side chains\n+ // these will get reapplied to the core (if there is a core)\n+ const auto &ranks = tmp_side_chain.getProp<std::vector<unsigned int>>(\n+ common_properties::_smilesAtomOutputOrder);\n \n std::vector<std::pair<unsigned int, int>> rankedAtoms;\n \n@@ -360,9 +344,6 @@ static void addResult(std::vector<std::pair<ROMOL_SPTR, ROMOL_SPTR>>\n for (auto &rankedAtom : rankedAtoms) {\n if (canonicalAtomMaps.find(rankedAtom.second) ==\n canonicalAtomMaps.end()) {\n- // std::cerr << \"Remapping: \" << rankedAtoms[i].second << \" \" << \" to\n- // \" << (i+1) <<\n- // std::endl;\n canonicalAtomMaps[rankedAtom.second] = ++nextMap;\n }\n }\n@@ -370,29 +351,28 @@ static void addResult(std::vector<std::pair<ROMOL_SPTR, ROMOL_SPTR>>\n \n // std::cerr << \"======== Remap core \" << std::endl;\n if (core.get()) { // remap core if it exists\n- for (ROMol::AtomIterator at = core->beginAtoms(); at != core->endAtoms();\n- ++at) {\n+ for (auto at : core->atoms()) {\n int label = 0;\n- if ((*at)->getPropIfPresent(common_properties::molAtomMapNumber,\n- label)) {\n+ if (at->getAtomicNum() == 0 &&\n+ at->getPropIfPresent(common_properties::molAtomMapNumber, label)) {\n // std::cerr << \"remapping core: \" << label << \" :\" <<\n // canonicalAtomMaps[label] <<\n // std::endl;\n- (*at)->setProp(common_properties::molAtomMapNumber,\n- canonicalAtomMaps[label]);\n+ at->setProp(common_properties::molAtomMapNumber,\n+ canonicalAtomMaps.at(label));\n }\n }\n }\n \n // std::cerr << \"======== Remap side-chain \" << std::endl;\n- for (ROMol::AtomIterator at = side_chains->beginAtoms();\n- at != side_chains->endAtoms(); ++at) {\n+ for (auto at : side_chains->atoms()) {\n int label = 0;\n- if ((*at)->getPropIfPresent(common_properties::molAtomMapNumber, label)) {\n+ if (at->getAtomicNum() == 0 &&\n+ at->getPropIfPresent(common_properties::molAtomMapNumber, label)) {\n // std::cerr << \"remapping side chain: \" << label << \" :\" <<\n // canonicalAtomMaps[label] << std::endl;\n- (*at)->setProp(common_properties::molAtomMapNumber,\n- canonicalAtomMaps[label]);\n+ at->setProp(common_properties::molAtomMapNumber,\n+ canonicalAtomMaps.at(label));\n }\n }\n \n@@ -408,13 +388,13 @@ static void addResult(std::vector<std::pair<ROMOL_SPTR, ROMOL_SPTR>>\n //=====================================================================\n static inline void appendBonds(BondVector_t &bonds,\n const BondVector_t &matching_bonds) {\n- for (const auto &matching_bond : matching_bonds) {\n- bonds.push_back(matching_bond);\n- }\n+ bonds.reserve(bonds.size() + matching_bonds.size());\n+ bonds.insert(bonds.end(), matching_bonds.begin(), matching_bonds.end());\n }\n \n static inline void processCuts(\n- size_t i, size_t minCuts, size_t maxCuts, BondVector_t &bonds_selected,\n+ size_t i, size_t minCuts, size_t maxCuts,\n+ BondVector_t &bonds_selected,\n const std::vector<BondVector_t> &matching_bonds, const ROMol &mol,\n std::vector<std::pair<ROMOL_SPTR, ROMOL_SPTR>> &res) {\n if (maxCuts < minCuts) {\n@@ -471,10 +451,11 @@ bool fragmentMol(const ROMol &mol,\n #endif\n \n res.clear();\n- std::unique_ptr<const ROMol> smarts((const ROMol *)SmartsToMol(pattern));\n+ std::unique_ptr<const ROMol> smarts(\n+ static_cast<ROMol *>(SmartsToMol(pattern)));\n std::vector<MatchVectType>\n matching_atoms; // one bond per match ! with default pattern\n- unsigned int total = SubstructMatch(mol, *smarts, matching_atoms);\n+ auto total = SubstructMatch(mol, *smarts, matching_atoms);\n #ifdef MMPA_DEBUG\n std::cout << \"total substructs =\" << total\n << \"\\nmatching bonds (atom1, atom2):\\n\";\n@@ -531,12 +512,12 @@ bool fragmentMol(const ROMol &mol,\n std::vector<BondVector_t> matching_bonds; // List of matched query's bonds\n \n for (auto i : bondsToCut) {\n- const Bond *bond = mol.getBondWithIdx(i);\n+ const auto bond = mol.getBondWithIdx(i);\n BondVector_t bonds;\n- unsigned int a1 = bond->getBeginAtomIdx();\n- unsigned int a2 = bond->getEndAtomIdx();\n- bonds.push_back(std::make_pair(a1, a2));\n- matching_bonds.push_back(bonds);\n+ auto a1 = bond->getBeginAtomIdx();\n+ auto a2 = bond->getEndAtomIdx();\n+ bonds.emplace_back(a1, a2);\n+ matching_bonds.push_back(std::move(bonds));\n }\n \n // loop to generate every cut in the molecule\n"}, "test": {"test_patch": "diff --git a/Code/GraphMol/MMPA/MMPA_UnitTest.cpp b/Code/GraphMol/MMPA/MMPA_UnitTest.cpp\nindex 11d772c7292..5606f9f4d97 100644\n--- a/Code/GraphMol/MMPA/MMPA_UnitTest.cpp\n+++ b/Code/GraphMol/MMPA/MMPA_UnitTest.cpp\n@@ -718,6 +718,29 @@ void testMorganCodeHashChargeShift() {\n }\n }\n \n+void testGithub8569() {\n+ auto mol = \"C\\\\C=C\\\\C=C\\\\C\"_smiles;\n+ std::vector<std::pair<ROMOL_SPTR, ROMOL_SPTR>> res;\n+ TEST_ASSERT(RDKit::MMPA::fragmentMol(*mol, res, 3));\n+ TEST_ASSERT(res.size() == 4);\n+ std::vector<std::pair<std::string, std::string>> resAsSmiles(res.size());\n+ std::transform(\n+ res.begin(), res.end(), resAsSmiles.begin(), [](const auto &pair) {\n+ return std::make_pair(pair.first ? MolToSmiles(*pair.first) : \"null\",\n+ pair.second ? MolToSmiles(*pair.second) : \"null\");\n+ });\n+ std::vector<std::pair<std::string, std::string>> expected = {\n+ {\"null\", \"C/C=C/C=C/[*:1].C[*:1]\"},\n+ {\"C(=C/[*:2])\\\\[*:1]\", \"C/C=C/[*:1].C[*:2]\"},\n+ {\"C(/C=C/[*:2])=C\\\\[*:1]\", \"C[*:1].C[*:2]\"},\n+ {\"null\", \"C/C=C/[*:1].C/C=C/[*:1]\"},\n+ };\n+ for (unsigned int i = 0; i < resAsSmiles.size(); ++i) {\n+ TEST_ASSERT(resAsSmiles[i].first == expected[i].first);\n+ TEST_ASSERT(resAsSmiles[i].second == expected[i].second);\n+ }\n+}\n+\n int main() {\n BOOST_LOG(rdInfoLog)\n << \"*******************************************************\\n\";\n@@ -741,6 +764,7 @@ int main() {\n test3();\n \n testMorganCodeHashChargeShift();\n+ testGithub8569();\n \n // test4();\n // */\n", "pass_criteria": "all_tests_pass"}, "scoring_config": {"scoring_method": "binary", "resolve_points": 100}}245 